Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
F05D5F0F31A2A844C3488BAA1CCCA3F7F7C3535A8D5C6ECB37E3C583BC22D32D
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
200,000,000
Requested gas limit
GAS USED
62,254,540
Gas consumed
FEE
200000ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1mpkp5lm8lwpm0pym4388836d009zfe4maxlqsq50000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CvvZAgoML3ZtLm1fYWRkcGtnEunZAgooZzFtcGtwNWxtOGx3cG0wcHltNDM4ODgzNmQwMDl6ZmU0bWF4bHFzcRKs2QIKCGdub3NwbGl0Eilnbm8ubGFuZC9yL255bS1hbGV4aXNjb2xpbjAwMC9nbm9zcGxpdC92MRpQCgtnbm9tb2QudG9tbBJBbW9kdWxlID0gImduby5sYW5kL3IvbnltLWFsZXhpc2NvbGluMDAwL2dub3NwbGl0L3YxIgpnbm8gPSAiMC45IgoatnMKDGdub3NwbGl0LmdubxKlcy8vIFBhY2thZ2UgZ25vc3BsaXQgc2hhcmVzIGEgZ3JvdXAncyBleHBlbnNlcywgbGlrZSBUcmljb3VudDogd2hvIHBhaWQgd2hhdCwKLy8gd2hvIG93ZXMgd2hvbSwgYW5kIHRoZSBmZXdlc3QgdHJhbnNmZXJzIHRoYXQgc2V0dGxlIGV2ZXJ5dGhpbmcuCi8vCi8vIEEgZ3JvdXAgaGFzIG1lbWJlcnMsIGVhY2ggYSBuYW1lIHdpdGggb3Igd2l0aG91dCBhIHdhbGxldC4gTWVtYmVycyB3aXRoIGEKLy8gd2FsbGV0IGxpbmtlZCBhcmUgdGhlIGdyb3VwJ3MgZWRpdG9yczogdGhleSByZWNvcmQgZXhwZW5zZXMsIGluY29tZXMgYW5kCi8vIHRyYW5zZmVycywgYW5kIGdldCBhIGdub3RpZiBub3RpZmljYXRpb24gd2hlbiBvbmUgY29uY2VybnMgdGhlbS4gTWVtYmVycwovLyB3aXRob3V0IG9uZSBhcmUganVzdCBuYW1lczogYSBmcmllbmQgd2l0aCBubyB3YWxsZXQgc3RpbGwgaGFzIGEgYmFsYW5jZS4KLy8KLy8gQW1vdW50cyBhcmUgY2VudHMgb2YgdGhlIGdyb3VwJ3MgY3VycmVuY3ksIGEgbGFiZWwgc3VjaCBhcyAi4oKsIiBvciAiQ0hGIjoKLy8gbm8gY29pbiBtb3ZlcyBoZXJlLCBhIHRyYW5zZmVyIHJlY29yZHMgYSBwYXltZW50IG1hZGUgZWxzZXdoZXJlLiBFdmVyeQovLyBiYWxhbmNlIGlzIGtlcHQgdXAgdG8gZGF0ZSBvbiBlYWNoIHdyaXRlLCBzbyByZWFkaW5nIGEgZ3JvdXAgbmV2ZXIgYWRkcwovLyB1cCBpdHMgaGlzdG9yeS4KcGFja2FnZSBnbm9zcGxpdAoKaW1wb3J0ICgKCSJjaGFpbiIKCSJjaGFpbi9ydW50aW1lIgoJImNoYWluL3J1bnRpbWUvdW5zYWZlIgoJInN0cmNvbnYiCgkic3RyaW5ncyIKCSJ0aW1lIgoKCSJnbm8ubGFuZC9wL255bS1hbGV4aXNjb2xpbjAwMC9nbm9zcGxpdC9sZWRnZXIvdjAiCgkiZ25vLmxhbmQvcC9udC9hdmwvdjAiCikKCi8vIExpbWl0cyBrZWVwIGV2ZXJ5IHBhZ2UgYW5kIGV2ZXJ5IHdyaXRlIHNtYWxsLgpjb25zdCAoCgltYXhNZW1iZXJzICA9IDMwCgltYXhFbnRyaWVzICA9IDUwMDAgLy8gcGVyIGdyb3VwCgltYXhOYW1lICAgICA9IDI0ICAgLy8gYSBtZW1iZXIncyBuYW1lLCBpbiBieXRlcwoJbWF4R3JvdXAgICAgPSA0MCAgIC8vIGEgZ3JvdXAncyBuYW1lCgltYXhUaXRsZSAgICA9IDYwICAgLy8gYW4gZW50cnkncyB0aXRsZQoJbWF4Q3VycmVuY3kgPSA4CglyZW1pbmRFdmVyeSA9IDEyICogNjAgKiA2MCAvLyBzZWNvbmRzIGJldHdlZW4gdHdvIHJlbWluZGVycyB0byBvbmUgbWVtYmVyCikKCi8vIEtpbmQgaXMgd2hhdCBhbiBlbnRyeSByZWNvcmRzLgp0eXBlIEtpbmQgdWludDgKCmNvbnN0ICgKCUtpbmRFeHBlbnNlICBLaW5kID0gaW90YSAvLyBQYXllciBwYWlkIFRvdGFsIGZvciBXaG8KCUtpbmRJbmNvbWUgICAgICAgICAgICAgICAvLyBQYXllciByZWNlaXZlZCBUb3RhbCB0aGF0IGJlbG9uZ3MgdG8gV2hvCglLaW5kVHJhbnNmZXIgICAgICAgICAgICAgLy8gUGF5ZXIgcGFpZCBUb3RhbCB0byBXaG9bMF0KKQoKLy8gTWVtYmVyIGlzIG9uZSBwZXJzb24gaW4gYSBncm91cC4gQmFsIGlzIHdoYXQgdGhleSBwYWlkIG1pbnVzIHdoYXQgdGhleSBvd2UsCi8vIGluIGNlbnRzOiA+IDAgdGhlIGdyb3VwIG93ZXMgdGhlbSwgPCAwIHRoZXkgb3dlIHRoZSBncm91cC4KdHlwZSBNZW1iZXIgc3RydWN0IHsKCU5hbWUgICBzdHJpbmcKCUFkZHIgICBhZGRyZXNzIC8vICIiIHdoaWxlIG5vIHdhbGxldCBpcyBsaW5rZWQKCUJhbCAgICBpbnQ2NAoJUGFpZCAgIGludDY0IC8vIHRvdGFsIG9mIHRoZSBleHBlbnNlcyB0aGV5IHBhaWQsIG5ldCBvZiBpbmNvbWVzIHJlY2VpdmVkCglTaGFyZSAgaW50NjQgLy8gdG90YWwgb2YgdGhlaXIgc2hhcmVzIG9mIGV4cGVuc2VzLCBuZXQgb2YgaW5jb21lcwoJTnVkZ2VkIGludDY0IC8vIHdoZW4gdGhleSB3ZXJlIGxhc3QgcmVtaW5kZWQsIHVuaXggc2Vjb25kcwp9CgovLyBFbnRyeSBpcyBvbmUgZXhwZW5zZSwgaW5jb21lIG9yIHRyYW5zZmVyLiBPd2VbaV0gaXMgdGhlIHBhcnQgb2YgV2hvW2ldOyB0aGUKLy8gcGFydHMgc3VtIHRvIFRvdGFsLiBBbiBpbmNvbWUgc3RvcmVzIFRvdGFsIGFuZCBPd2UgYXMgbmVnYXRpdmUgYW1vdW50cywgc28KLy8gb25lIHJ1bGUgYXBwbGllcyBldmVyeSBraW5kOiBQYXllciBnYWlucyBUb3RhbCwgZWFjaCBvZiBXaG8gbG9zZXMgaXRzIHBhcnQuCnR5cGUgRW50cnkgc3RydWN0IHsKCUlEICAgIGludAoJS2luZCAgS2luZAoJVGl0bGUgc3RyaW5nCglDYXQgICBpbnQKCVBheWVyIGludAoJVG90YWwgaW50NjQKCU5vdGUgIHN0cmluZyAvLyB0aGUgZm9yZWlnbiBhbW91bnQsICIiIGlmIG5vbmUKCVdobyAgIFtdaW50CglPd2UgICBbXWludDY0CglBdCAgICBpbnQ2NAoJQnkgICAgYWRkcmVzcwp9CgovLyBHcm91cCBpcyBvbmUgc2hhcmVkIGFjY291bnQuCnR5cGUgR3JvdXAgc3RydWN0IHsKCUlEICAgICAgIGludAoJTmFtZSAgICAgc3RyaW5nCglDdXJyZW5jeSBzdHJpbmcKCU1lbWJlcnMgIFtdTWVtYmVyCglFbnRyaWVzICBhdmwuVHJlZSAvLyBrZXkoSUQpIOKGkiAqRW50cnkKCU5leHQgICAgIGludCAgICAgIC8vIHRoZSBuZXh0IGVudHJ5J3MgSUQKCVNwZW50ICAgIGludDY0ICAgIC8vIGV4cGVuc2VzIG1pbnVzIGluY29tZXMsIGZvciB0aGUgaGVhZGVyCglCeUNhdCAgICBbXWludDY0ICAvLyBleHBlbnNlcyBwZXIgY2F0ZWdvcnksIGluY29tZXMgbGVmdCBvdXQKCUNyZWF0ZWQgIGludDY0CglNb3ZlZCAgICBib29sIC8vIHRha2VuIG92ZXIgYnkgdGhlIHN1Y2Nlc3NvciByZWFsbTogcmVhZC1vbmx5IGhlcmUKfQoKdmFyICgKCWdyb3VwcyBhdmwuVHJlZSAvLyBrZXkoSUQpIOKGkiAqR3JvdXAKCWJ5QWRkciBhdmwuVHJlZSAvLyBhZGRyICsgIi8iICsga2V5KElEKSDihpIgdHJ1ZSwgdGhlIGdyb3VwcyBhIHdhbGxldCBiZWxvbmdzIHRvCgluZXh0SUQgPSAxCikKCi8vIHNlbGYgaXMgdGhpcyByZWFsbSdzIHBrZ3BhdGggYW5kIGh1YiBpdHMgZ25vd2ViIHBhdGgsIHJlYWQgYXQgaW5pdCB3aGlsZQovLyB0aGlzIHJlYWxtIGlzIGN1cnJlbnQ6IGV2ZXJ5IGxpbmsgZm9sbG93cyBmcm9tIHRoZW0uCnZhciAoCglzZWxmID0gdW5zYWZlLkN1cnJlbnRSZWFsbSgpLlBrZ1BhdGgoKQoJaHViICA9IHN0cmluZ3MuVHJpbVByZWZpeChzZWxmLCAiZ25vLmxhbmQiKQopCgpmdW5jIGluaXQoY3VyIHJlYWxtKSB7CglzZXRVcCh1bnNhZmUuT3JpZ2luQ2FsbGVyKCksIHJ1bnRpbWUuQ2hhaW5JRCgpKQoJZGVjbGFyZVRyaWdnZXJzKGN1cikKfQoKLy8gQ3JlYXRlR3JvdXAgb3BlbnMgYSBncm91cCBuYW1lZCBuYW1lLCBjb3VudGluZyBpbiBjdXJyZW5jeSwgd2l0aCB0aGUKLy8gY2FsbGVyIGFzIG1lbWJlciB5b3UgKHdhbGxldCBsaW5rZWQpIGFuZCBvdGhlcnMsIGNvbW1hLXNlcGFyYXRlZCBuYW1lcywKLy8gd2l0aG91dCB3YWxsZXRzLiBJdCByZXR1cm5zIHRoZSBncm91cCdzIElELgpmdW5jIENyZWF0ZUdyb3VwKGN1ciByZWFsbSwgbmFtZSwgY3VycmVuY3ksIHlvdSwgb3RoZXJzIHN0cmluZykgaW50IHsKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCW5hbWUsIGN1cnJlbmN5ID0gc3RyaW5ncy5UcmltU3BhY2UobmFtZSksIHN0cmluZ3MuVHJpbVNwYWNlKGN1cnJlbmN5KQoJaWYgIXZhbGlkVGV4dChuYW1lLCBtYXhHcm91cCkgewoJCXBhbmljKCJnbm9zcGxpdDogYSBncm91cCBuYW1lIGlzIDEgdG8gNDAgYnl0ZXMgb24gb25lIGxpbmUiKQoJfQoJaWYgIXZhbGlkVGV4dChjdXJyZW5jeSwgbWF4Q3VycmVuY3kpIHx8IHN0cmluZ3MuQ29udGFpbnNBbnkoY3VycmVuY3ksICIgLDw+W10oKXwqX2BcXCZcIiciKSB7CgkJcGFuaWMoImdub3NwbGl0OiBhIGN1cnJlbmN5IGlzIDEgdG8gOCBieXRlcyB3aXRoIG5vIHNwYWNlLCBsaWtlIOKCrCBvciBDSEYiKQoJfQoJZyA6PSAmR3JvdXB7SUQ6IG5leHRJRCwgTmFtZTogbmFtZSwgQ3VycmVuY3k6IGN1cnJlbmN5LCBDcmVhdGVkOiB0aW1lLk5vdygpLlVuaXgoKSwgQnlDYXQ6IG1ha2UoW11pbnQ2NCwgbGVuKGNhdGVnb3JpZXMpKX0KCWcuYWRkTWVtYmVyKHlvdSwgY2FsbGVyKQoJZm9yIF8sIG4gOj0gcmFuZ2Ugc3BsaXRMaXN0KG90aGVycykgewoJCWcuYWRkTWVtYmVyKG4sICIiKQoJfQoJbmV4dElEKysKCWdyb3Vwcy5TZXQoa2V5KGcuSUQpLCBnKQoJY2hhaW4uRW1pdChFdmVudEdyb3VwQ3JlYXRlZCwgImdyb3VwIiwgaXRvYShnLklEKSwgImJ5IiwgY2FsbGVyLlN0cmluZygpKQoJcmV0dXJuIGcuSUQKfQoKLy8gQWRkTWVtYmVyIGFkZHMgbmFtZSB0byB0aGUgZ3JvdXAsIHdpdGggYSB3YWxsZXQgaWYgYWRkciBpcyBzZXQ6IHRoYXQgbWVtYmVyCi8vIGJlY29tZXMgYW4gZWRpdG9yIGFuZCBpcyB0b2xkIGJ5IGdub3RpZi4KZnVuYyBBZGRNZW1iZXIoY3VyIHJlYWxtLCBncm91cCwgbmFtZSwgYWRkciBzdHJpbmcpIHsKCWcsIGJ5IDo9IGVkaXRhYmxlKGN1ciwgZ3JvdXApCglhIDo9IHBhcnNlQWRkcihhZGRyKQoJaSA6PSBnLmFkZE1lbWJlcihuYW1lLCBhKQoJY2hhaW4uRW1pdChFdmVudE1lbWJlckFkZGVkLCAiZ3JvdXAiLCBpdG9hKGcuSUQpLCAibWVtYmVyIiwgZy5NZW1iZXJzW2ldLk5hbWUpCglpZiBhICE9ICIiIHsKCQlub3RpZnlKb2luZWQoZywgYSwgZy5NZW1iZXJzW2J5XS5OYW1lKQoJfQp9CgovLyBMaW5rTWVtYmVyIGxpbmtzIGEgd2FsbGV0IHRvIGEgbWVtYmVyIHdobyBoYXMgbm9uZSB5ZXQsIG1ha2luZyB0aGVtIGFuCi8vIGVkaXRvci4gQSBsaW5rZWQgd2FsbGV0IGlzIG5ldmVyIHJlcGxhY2VkLCBzbyBubyBlZGl0b3IgY2FuIHRha2Ugb3ZlcgovLyBhbm90aGVyJ3MgcGxhY2UuCmZ1bmMgTGlua01lbWJlcihjdXIgcmVhbG0sIGdyb3VwLCBuYW1lLCBhZGRyIHN0cmluZykgewoJZywgYnkgOj0gZWRpdGFibGUoY3VyLCBncm91cCkKCWkgOj0gZy5tZW1iZXIobmFtZSkKCWlmIGcuTWVtYmVyc1tpXS5BZGRyICE9ICIiIHsKCQlwYW5pYygiZ25vc3BsaXQ6ICIgKyBnLk1lbWJlcnNbaV0uTmFtZSArICIgYWxyZWFkeSBoYXMgYSB3YWxsZXQiKQoJfQoJYSA6PSBwYXJzZUFkZHIoYWRkcikKCWlmIGEgPT0gIiIgewoJCXBhbmljKCJnbm9zcGxpdDogYW4gYWRkcmVzcyBpcyByZXF1aXJlZCIpCgl9CglnLmxpbmsoaSwgYSkKCWNoYWluLkVtaXQoRXZlbnRNZW1iZXJMaW5rZWQsICJncm91cCIsIGl0b2EoZy5JRCksICJtZW1iZXIiLCBnLk1lbWJlcnNbaV0uTmFtZSwgImFkZHIiLCBhLlN0cmluZygpKQoJbm90aWZ5Sm9pbmVkKGcsIGEsIGcuTWVtYmVyc1tieV0uTmFtZSkKfQoKLy8gQWRkRXhwZW5zZSByZWNvcmRzIHRoYXQgcGFpZEJ5IHBhaWQgYW1vdW50IGZvciBmb3JXaG9tIChjb21tYS1zZXBhcmF0ZWQKLy8gbmFtZXMsICIiIGZvciBldmVyeW9uZSksIHNwbGl0IGVxdWFsbHkuIGFtb3VudCBpcyAiNDIuNTAiLCBvciBhIGZvcmVpZ24KLy8gYW1vdW50IHdpdGggaXRzIHJhdGUsICI1MCBVU0QgeDAuOTIiLiBJdCByZXR1cm5zIHRoZSBlbnRyeSdzIElELgpmdW5jIEFkZEV4cGVuc2UoY3VyIHJlYWxtLCBncm91cCwgdGl0bGUsIGFtb3VudCwgcGFpZEJ5LCBmb3JXaG9tLCBjYXRlZ29yeSBzdHJpbmcpIGludCB7CglnLCBieSA6PSBlZGl0YWJsZShjdXIsIGdyb3VwKQoJdG90YWwsIG5vdGUgOj0gbXVzdEFtb3VudChhbW91bnQpCgl3aG8gOj0gZy5tZW1iZXJzKGZvcldob20pCglyZXR1cm4gZy5yZWNvcmQoYnksIEtpbmRFeHBlbnNlLCB0aXRsZSwgY2F0ZWdvcnksIGcubWVtYmVyKHBhaWRCeSksIHRvdGFsLCBub3RlLCB3aG8sIGxlZGdlci5FcXVhbCh0b3RhbCwgbGVuKHdobykpKQp9CgovLyBBZGRCeVNoYXJlcyByZWNvcmRzIGFuIGV4cGVuc2Ugc3BsaXQgYnkgc2hhcmVzOiBzaGFyZXMgaXMgIkFsaWNlOjIsIEJvYjoxIiwKLy8gc28gQWxpY2Ugb3dlcyB0d28gdGhpcmRzLgpmdW5jIEFkZEJ5U2hhcmVzKGN1ciByZWFsbSwgZ3JvdXAsIHRpdGxlLCBhbW91bnQsIHBhaWRCeSwgc2hhcmVzLCBjYXRlZ29yeSBzdHJpbmcpIGludCB7CglnLCBieSA6PSBlZGl0YWJsZShjdXIsIGdyb3VwKQoJdG90YWwsIG5vdGUgOj0gbXVzdEFtb3VudChhbW91bnQpCgl3aG8sIHcgOj0gZy5wYWlycyhzaGFyZXMsIGZ1bmMocyBzdHJpbmcpIChpbnQ2NCwgYm9vbCkgewoJCW4sIGVyciA6PSBzdHJjb252LkF0b2kocykKCQlyZXR1cm4gaW50NjQobiksIGVyciA9PSBuaWwgJiYgbiA+IDAgJiYgbiA8PSAxMDAwCgl9LCAiYSBzaGFyZSBpcyBhIHdob2xlIG51bWJlciBmcm9tIDEgdG8gMTAwMCIpCglyZXR1cm4gZy5yZWNvcmQoYnksIEtpbmRFeHBlbnNlLCB0aXRsZSwgY2F0ZWdvcnksIGcubWVtYmVyKHBhaWRCeSksIHRvdGFsLCBub3RlLCB3aG8sIGxlZGdlci5XZWlnaHRlZCh0b3RhbCwgdykpCn0KCi8vIEFkZEJ5QW1vdW50cyByZWNvcmRzIGFuIGV4cGVuc2Ugc3BsaXQgYnkgZXhhY3QgYW1vdW50czogYW1vdW50cyBpcwovLyAiQWxpY2U6MTIuNTAsIEJvYjo3LjUwIiwgYW5kIHRoZSBleHBlbnNlIGlzIHRoZWlyIHN1bS4KZnVuYyBBZGRCeUFtb3VudHMoY3VyIHJlYWxtLCBncm91cCwgdGl0bGUsIHBhaWRCeSwgYW1vdW50cywgY2F0ZWdvcnkgc3RyaW5nKSBpbnQgewoJZywgYnkgOj0gZWRpdGFibGUoY3VyLCBncm91cCkKCXdobywgb3dlIDo9IGcucGFpcnMoYW1vdW50cywgbGVkZ2VyLlBhcnNlQ2VudHMsICJhbiBhbW91bnQgaXMgbGlrZSAxMi41MCIpCgl2YXIgdG90YWwgaW50NjQKCWZvciBfLCBvIDo9IHJhbmdlIG93ZSB7CgkJdG90YWwgKz0gbwoJfQoJaWYgdG90YWwgPiBsZWRnZXIuTWF4Q2VudHMgewoJCXBhbmljKCJnbm9zcGxpdDogdGhlIGFtb3VudHMgYWRkIHVwIHRvIHRvbyBtdWNoIikKCX0KCXJldHVybiBnLnJlY29yZChieSwgS2luZEV4cGVuc2UsIHRpdGxlLCBjYXRlZ29yeSwgZy5tZW1iZXIocGFpZEJ5KSwgdG90YWwsICIiLCB3aG8sIG93ZSkKfQoKLy8gQWRkSW5jb21lIHJlY29yZHMgbW9uZXkgcmVjZWl2ZWRCeSBnb3Qgb24gYmVoYWxmIG9mIGZvcldob20gKGEgcmVmdW5kLCBhCi8vIGRlcG9zaXQgcmV0dXJuZWQpLCBzcGxpdCBlcXVhbGx5OiBpdCBsb3dlcnMgd2hhdCBlYWNoIG9mIHRoZW0gcGFpZC4KZnVuYyBBZGRJbmNvbWUoY3VyIHJlYWxtLCBncm91cCwgdGl0bGUsIGFtb3VudCwgcmVjZWl2ZWRCeSwgZm9yV2hvbSBzdHJpbmcpIGludCB7CglnLCBieSA6PSBlZGl0YWJsZShjdXIsIGdyb3VwKQoJdG90YWwsIG5vdGUgOj0gbXVzdEFtb3VudChhbW91bnQpCgl3aG8gOj0gZy5tZW1iZXJzKGZvcldob20pCglyZXR1cm4gZy5yZWNvcmQoYnksIEtpbmRJbmNvbWUsIHRpdGxlLCAiIiwgZy5tZW1iZXIocmVjZWl2ZWRCeSksIC10b3RhbCwgbm90ZSwgd2hvLCBsZWRnZXIuRXF1YWwoLXRvdGFsLCBsZW4od2hvKSkpCn0KCi8vIEFkZFRyYW5zZmVyIHJlY29yZHMgdGhhdCBmcm9tIHBhaWQgYW1vdW50IHRvIHRvLCBvdXRzaWRlIHRoZSBjaGFpbi4KZnVuYyBBZGRUcmFuc2ZlcihjdXIgcmVhbG0sIGdyb3VwLCBmcm9tLCB0bywgYW1vdW50IHN0cmluZykgaW50IHsKCWcsIGJ5IDo9IGVkaXRhYmxlKGN1ciwgZ3JvdXApCgl0b3RhbCwgbm90ZSA6PSBtdXN0QW1vdW50KGFtb3VudCkKCWYsIHQgOj0gZy5tZW1iZXIoZnJvbSksIGcubWVtYmVyKHRvKQoJaWYgZiA9PSB0IHsKCQlwYW5pYygiZ25vc3BsaXQ6IGEgdHJhbnNmZXIgZ29lcyB0byBzb21lb25lIGVsc2UiKQoJfQoJdGl0bGUgOj0gZy5NZW1iZXJzW2ZdLk5hbWUgKyAiIOKGkiAiICsgZy5NZW1iZXJzW3RdLk5hbWUKCXJldHVybiBnLnJlY29yZChieSwgS2luZFRyYW5zZmVyLCB0aXRsZSwgIiIsIGYsIHRvdGFsLCBub3RlLCBbXWludHt0fSwgW11pbnQ2NHt0b3RhbH0pCn0KCi8vIERlbGV0ZSByZW1vdmVzIGFuIGVudHJ5IGFuZCB1bmRvZXMgaXRzIGVmZmVjdCBvbiBldmVyeSBiYWxhbmNlLgpmdW5jIERlbGV0ZShjdXIgcmVhbG0sIGdyb3VwLCBlbnRyeSBzdHJpbmcpIHsKCWcsIF8gOj0gZWRpdGFibGUoY3VyLCBncm91cCkKCWlkLCBlcnIgOj0gc3RyY29udi5BdG9pKHN0cmluZ3MuVHJpbVNwYWNlKGVudHJ5KSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKCJnbm9zcGxpdDogbm8gZW50cnkgIiArIGVudHJ5KQoJfQoJdiwgb2sgOj0gZy5FbnRyaWVzLlJlbW92ZShrZXkoaWQpKQoJaWYgIW9rIHsKCQlwYW5pYygiZ25vc3BsaXQ6IG5vIGVudHJ5ICIgKyBlbnRyeSkKCX0KCWcuYXBwbHkodi4oKkVudHJ5KSwgLTEpCgljaGFpbi5FbWl0KEV2ZW50RW50cnlEZWxldGVkLCAiZ3JvdXAiLCBpdG9hKGcuSUQpLCAiZW50cnkiLCBpdG9hKGlkKSwgImJ5IiwgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpLlN0cmluZygpKQp9CgovLyBSZW1pbmQgc2VuZHMgbWVtYmVyLCB3aG8gb3dlcyB0aGUgZ3JvdXAsIGEgZ25vdGlmIHJlbWluZGVyOiBhdCBtb3N0IG9uZQovLyBldmVyeSAxMiBob3VycywgYW5kIG9ubHkgdG8gYSBtZW1iZXIgd2l0aCBhIHdhbGxldC4KZnVuYyBSZW1pbmQoY3VyIHJlYWxtLCBncm91cCwgbWVtYmVyIHN0cmluZykgewoJZywgYnkgOj0gZWRpdGFibGUoY3VyLCBncm91cCkKCWkgOj0gZy5tZW1iZXIobWVtYmVyKQoJbSA6PSAmZy5NZW1iZXJzW2ldCglub3cgOj0gdGltZS5Ob3coKS5Vbml4KCkKCXN3aXRjaCB7CgljYXNlIG0uQmFsID49IDA6CgkJcGFuaWMoImdub3NwbGl0OiAiICsgbS5OYW1lICsgIiBvd2VzIG5vdGhpbmciKQoJY2FzZSBtLkFkZHIgPT0gIiI6CgkJcGFuaWMoImdub3NwbGl0OiAiICsgbS5OYW1lICsgIiBoYXMgbm8gd2FsbGV0IHRvIHJlbWluZCIpCgljYXNlIGkgPT0gYnk6CgkJcGFuaWMoImdub3NwbGl0OiB5b3UgY2Fubm90IHJlbWluZCB5b3Vyc2VsZiIpCgljYXNlIG5vdy1tLk51ZGdlZCA8IHJlbWluZEV2ZXJ5OgoJCXBhbmljKCJnbm9zcGxpdDogIiArIG0uTmFtZSArICIgd2FzIHJlbWluZGVkIGxlc3MgdGhhbiAxMiBob3VycyBhZ28iKQoJfQoJbS5OdWRnZWQgPSBub3cKCW5vdGlmeVJlbWluZGVyKGcsIG0sIGcuTWVtYmVyc1tieV0uTmFtZSkKfQoKLy8gcmVjb3JkIHZhbGlkYXRlcyBhbmQgc3RvcmVzIGFuIGVudHJ5LCB0aGVuIGFwcGxpZXMgaXQgdG8gdGhlIGJhbGFuY2VzLgpmdW5jIChnICpHcm91cCkgcmVjb3JkKGJ5IGludCwga2luZCBLaW5kLCB0aXRsZSwgY2F0ZWdvcnkgc3RyaW5nLCBwYXllciBpbnQsIHRvdGFsIGludDY0LCBub3RlIHN0cmluZywgd2hvIFtdaW50LCBvd2UgW11pbnQ2NCkgaW50IHsKCXRpdGxlID0gc3RyaW5ncy5UcmltU3BhY2UodGl0bGUpCglpZiAhdmFsaWRUZXh0KHRpdGxlLCBtYXhUaXRsZSkgewoJCXBhbmljKCJnbm9zcGxpdDogYSB0aXRsZSBpcyAxIHRvIDYwIGJ5dGVzIG9uIG9uZSBsaW5lIikKCX0KCWlmIGcuRW50cmllcy5TaXplKCkgPj0gbWF4RW50cmllcyB7CgkJcGFuaWMoImdub3NwbGl0OiB0aGlzIGdyb3VwIGlzIGZ1bGwgKDUwMDAgZW50cmllcykiKQoJfQoJZSA6PSAmRW50cnl7CgkJSUQ6IGcuTmV4dCwgS2luZDoga2luZCwgVGl0bGU6IHRpdGxlLCBDYXQ6IGNhdGVnb3J5T2YoY2F0ZWdvcnkpLCBQYXllcjogcGF5ZXIsCgkJVG90YWw6IHRvdGFsLCBOb3RlOiBub3RlLCBXaG86IHdobywgT3dlOiBvd2UsCgkJQXQ6IHRpbWUuTm93KCkuVW5peCgpLCBCeTogZy5NZW1iZXJzW2J5XS5BZGRyLAoJfQoJZy5OZXh0KysKCWcuRW50cmllcy5TZXQoa2V5KGUuSUQpLCBlKQoJZy5hcHBseShlLCAxKQoJY2hhaW4uRW1pdChFdmVudEVudHJ5QWRkZWQsICJncm91cCIsIGl0b2EoZy5JRCksICJlbnRyeSIsIGl0b2EoZS5JRCksICJieSIsIGUuQnkuU3RyaW5nKCkpCglub3RpZnlFbnRyeShnLCBlLCBieSkKCXJldHVybiBlLklECn0KCi8vIGFwcGx5IGFkZHMgYW4gZW50cnkgdG8gdGhlIGJhbGFuY2VzIChzaWduIDEpIG9yIHRha2VzIGl0IGJhY2sgb3V0ICgtMSkuCmZ1bmMgKGcgKkdyb3VwKSBhcHBseShlICpFbnRyeSwgc2lnbiBpbnQ2NCkgewoJZy5NZW1iZXJzW2UuUGF5ZXJdLkJhbCArPSBzaWduICogZS5Ub3RhbAoJZm9yIGksIG0gOj0gcmFuZ2UgZS5XaG8gewoJCWcuTWVtYmVyc1ttXS5CYWwgLT0gc2lnbiAqIGUuT3dlW2ldCgl9CglpZiBlLktpbmQgPT0gS2luZFRyYW5zZmVyIHsKCQlyZXR1cm4KCX0KCWcuU3BlbnQgKz0gc2lnbiAqIGUuVG90YWwKCWlmIGUuS2luZCA9PSBLaW5kRXhwZW5zZSB7CgkJZy5CeUNhdFtlLkNhdF0gKz0gc2lnbiAqIGUuVG90YWwKCX0KCWcuTWVtYmVyc1tlLlBheWVyXS5QYWlkICs9IHNpZ24gKiBlLlRvdGFsCglmb3IgaSwgbSA6PSByYW5nZSBlLldobyB7CgkJZy5NZW1iZXJzW21dLlNoYXJlICs9IHNpZ24gKiBlLk93ZVtpXQoJfQp9CgovLyBhZGRNZW1iZXIgYXBwZW5kcyBhIG1lbWJlciBhbmQgcmV0dXJucyBpdHMgaW5kZXguCmZ1bmMgKGcgKkdyb3VwKSBhZGRNZW1iZXIobmFtZSBzdHJpbmcsIGEgYWRkcmVzcykgaW50IHsKCW5hbWUgPSBzdHJpbmdzLlRyaW1TcGFjZShuYW1lKQoJaWYgIXZhbGlkTmFtZShuYW1lKSB7CgkJcGFuaWMoImdub3NwbGl0OiBhIG5hbWUgaXMgMSB0byAyNCBieXRlcywgd2l0aG91dCAsIDogOyBvciA9IikKCX0KCWlmIGcuZmluZChuYW1lKSA+PSAwIHsKCQlwYW5pYygiZ25vc3BsaXQ6IHRoZXJlIGlzIGFscmVhZHkgYSAiICsgbmFtZSkKCX0KCWlmIGxlbihnLk1lbWJlcnMpID49IG1heE1lbWJlcnMgewoJCXBhbmljKCJnbm9zcGxpdDogYSBncm91cCBoYXMgYXQgbW9zdCAzMCBtZW1iZXJzIikKCX0KCWcuTWVtYmVycyA9IGFwcGVuZChnLk1lbWJlcnMsIE1lbWJlcntOYW1lOiBuYW1lfSkKCWkgOj0gbGVuKGcuTWVtYmVycykgLSAxCglpZiBhICE9ICIiIHsKCQlnLmxpbmsoaSwgYSkKCX0KCXJldHVybiBpCn0KCmZ1bmMgKGcgKkdyb3VwKSBsaW5rKGkgaW50LCBhIGFkZHJlc3MpIHsKCWlmIGcuZWRpdG9yKGEpID49IDAgewoJCXBhbmljKCJnbm9zcGxpdDogdGhpcyB3YWxsZXQgaXMgYWxyZWFkeSBpbiB0aGUgZ3JvdXAiKQoJfQoJZy5NZW1iZXJzW2ldLkFkZHIgPSBhCglieUFkZHIuU2V0KGEuU3RyaW5nKCkrIi8iK2tleShnLklEKSwgdHJ1ZSkKfQoKLy8gZmluZCBpcyB0aGUgaW5kZXggb2YgdGhlIG1lbWJlciBjYWxsZWQgbmFtZSwgYW55IGNhc2UsIG9yIC0xLgpmdW5jIChnICpHcm91cCkgZmluZChuYW1lIHN0cmluZykgaW50IHsKCW5hbWUgPSBzdHJpbmdzLlRvTG93ZXIoc3RyaW5ncy5UcmltU3BhY2UobmFtZSkpCglmb3IgaSwgbSA6PSByYW5nZSBnLk1lbWJlcnMgewoJCWlmIHN0cmluZ3MuVG9Mb3dlcihtLk5hbWUpID09IG5hbWUgewoJCQlyZXR1cm4gaQoJCX0KCX0KCXJldHVybiAtMQp9CgpmdW5jIChnICpHcm91cCkgbWVtYmVyKG5hbWUgc3RyaW5nKSBpbnQgewoJaSA6PSBnLmZpbmQobmFtZSkKCWlmIGkgPCAwIHsKCQlwYW5pYygiZ25vc3BsaXQ6IG5vIG1lbWJlciBjYWxsZWQgIiArIHN0cmluZ3MuVHJpbVNwYWNlKG5hbWUpKQoJfQoJcmV0dXJuIGkKfQoKLy8gbWVtYmVycyByZWFkcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG5hbWVzLCAiIiBmb3IgZXZlcnlvbmUuCmZ1bmMgKGcgKkdyb3VwKSBtZW1iZXJzKGxpc3Qgc3RyaW5nKSBbXWludCB7CgluYW1lcyA6PSBzcGxpdExpc3QobGlzdCkKCWlmIGxlbihuYW1lcykgPT0gMCB7CgkJYWxsIDo9IG1ha2UoW11pbnQsIGxlbihnLk1lbWJlcnMpKQoJCWZvciBpIDo9IHJhbmdlIGFsbCB7CgkJCWFsbFtpXSA9IGkKCQl9CgkJcmV0dXJuIGFsbAoJfQoJdmFyIG91dCBbXWludAoJc2VlbiA6PSBtYWtlKFtdYm9vbCwgbGVuKGcuTWVtYmVycykpCglmb3IgXywgbiA6PSByYW5nZSBuYW1lcyB7CgkJaSA6PSBnLm1lbWJlcihuKQoJCWlmIHNlZW5baV0gewoJCQlwYW5pYygiZ25vc3BsaXQ6ICIgKyBnLk1lbWJlcnNbaV0uTmFtZSArICIgaXMgbGlzdGVkIHR3aWNlIikKCQl9CgkJc2VlbltpXSA9IHRydWUKCQlvdXQgPSBhcHBlbmQob3V0LCBpKQoJfQoJcmV0dXJuIG91dAp9CgovLyBwYWlycyByZWFkcyAiTmFtZTp2YWx1ZSwgTmFtZTp2YWx1ZSIgd2l0aCBwYXJzZSBjaGVja2luZyBlYWNoIHZhbHVlLgpmdW5jIChnICpHcm91cCkgcGFpcnMobGlzdCBzdHJpbmcsIHBhcnNlIGZ1bmMoc3RyaW5nKSAoaW50NjQsIGJvb2wpLCBoaW50IHN0cmluZykgKFtdaW50LCBbXWludDY0KSB7Cgl2YXIgd2hvIFtdaW50Cgl2YXIgdmFscyBbXWludDY0CglzZWVuIDo9IG1ha2UoW11ib29sLCBsZW4oZy5NZW1iZXJzKSkKCWZvciBfLCBwIDo9IHJhbmdlIHNwbGl0TGlzdChsaXN0KSB7CgkJbmFtZSwgdmFsLCBvayA6PSBzdHJpbmdzLkN1dChwLCAiOiIpCgkJaWYgIW9rIHsKCQkJcGFuaWMoImdub3NwbGl0OiB3cml0ZSBlYWNoIG9uZSBhcyBOYW1lOnZhbHVlLCBsaWtlIEFsaWNlOjIiKQoJCX0KCQlpIDo9IGcubWVtYmVyKG5hbWUpCgkJdiwgb2sgOj0gcGFyc2Uoc3RyaW5ncy5UcmltU3BhY2UodmFsKSkKCQlpZiAhb2sgewoJCQlwYW5pYygiZ25vc3BsaXQ6ICIgKyBoaW50KQoJCX0KCQlpZiBzZWVuW2ldIHsKCQkJcGFuaWMoImdub3NwbGl0OiAiICsgZy5NZW1iZXJzW2ldLk5hbWUgKyAiIGlzIGxpc3RlZCB0d2ljZSIpCgkJfQoJCXNlZW5baV0gPSB0cnVlCgkJd2hvLCB2YWxzID0gYXBwZW5kKHdobywgaSksIGFwcGVuZCh2YWxzLCB2KQoJfQoJaWYgbGVuKHdobykgPT0gMCB7CgkJcGFuaWMoImdub3NwbGl0OiBuYW1lIGF0IGxlYXN0IG9uZSBtZW1iZXIiKQoJfQoJcmV0dXJuIHdobywgdmFscwp9CgovLyBlZGl0b3IgaXMgdGhlIGluZGV4IG9mIHRoZSBtZW1iZXIgd2hvc2Ugd2FsbGV0IGlzIGEsIG9yIC0xLgpmdW5jIChnICpHcm91cCkgZWRpdG9yKGEgYWRkcmVzcykgaW50IHsKCWZvciBpLCBtIDo9IHJhbmdlIGcuTWVtYmVycyB7CgkJaWYgbS5BZGRyID09IGEgewoJCQlyZXR1cm4gaQoJCX0KCX0KCXJldHVybiAtMQp9CgovLyBlZGl0YWJsZSBpcyB0aGUgb25lIHdyaXRlIGNoZWNrOiB0aGUgZ3JvdXAgZXhpc3RzLCBpcyBzdGlsbCBrZXB0IGhlcmUsIGFuZAovLyB0aGUgaW1tZWRpYXRlIGNhbGxlciBpcyBvbmUgb2YgaXRzIG1lbWJlcnMgd2l0aCBhIHdhbGxldC4KZnVuYyBlZGl0YWJsZShjdXIgcmVhbG0sIGdyb3VwIHN0cmluZykgKCpHcm91cCwgaW50KSB7CglnIDo9IG11c3RHcm91cChncm91cCkKCWlmIGcuTW92ZWQgewoJCXBhbmljKCJnbm9zcGxpdDogdGhpcyBncm91cCBtb3ZlZCB0byAiICsgc3VjY2Vzc29yKQoJfQoJYnkgOj0gZy5lZGl0b3IoY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpKQoJaWYgYnkgPCAwIHsKCQlwYW5pYygiZ25vc3BsaXQ6IG9ubHkgYSBtZW1iZXIgd2l0aCBhIGxpbmtlZCB3YWxsZXQgY2FuIGNoYW5nZSB0aGlzIGdyb3VwIikKCX0KCXJldHVybiBnLCBieQp9CgpmdW5jIGdldEdyb3VwKGdyb3VwIHN0cmluZykgKkdyb3VwIHsKCWlkLCBlcnIgOj0gc3RyY29udi5BdG9pKHN0cmluZ3MuVHJpbVNwYWNlKGdyb3VwKSkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwKCX0KCXYgOj0gZ3JvdXBzLkdldChrZXkoaWQpKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiBuaWwKCX0KCXJldHVybiB2LigqR3JvdXApCn0KCmZ1bmMgbXVzdEdyb3VwKGdyb3VwIHN0cmluZykgKkdyb3VwIHsKCWcgOj0gZ2V0R3JvdXAoZ3JvdXApCglpZiBnID09IG5pbCB7CgkJcGFuaWMoImdub3NwbGl0OiBubyBncm91cCAiICsgZ3JvdXApCgl9CglyZXR1cm4gZwp9CgpmdW5jIG11c3RBbW91bnQocyBzdHJpbmcpIChpbnQ2NCwgc3RyaW5nKSB7Cgl0b3RhbCwgbm90ZSwgb2sgOj0gbGVkZ2VyLlBhcnNlQW1vdW50KHMpCglpZiAhb2sgewoJCXBhbmljKCJnbm9zcGxpdDogYW4gYW1vdW50IGlzIGxpa2UgNDIuNTAsIG9yIDUwIFVTRCB4MC45MiBmb3IgYSBmb3JlaWduIG9uZSIpCgl9CglyZXR1cm4gdG90YWwsIG5vdGUKfQoKZnVuYyBwYXJzZUFkZHIocyBzdHJpbmcpIGFkZHJlc3MgewoJcyA9IHN0cmluZ3MuVHJpbVNwYWNlKHMpCglpZiBzID09ICIiIHsKCQlyZXR1cm4gIiIKCX0KCWEgOj0gYWRkcmVzcyhzKQoJaWYgIWEuSXNWYWxpZCgpIHsKCQlwYW5pYygiZ25vc3BsaXQ6IG5vdCBhbiBhZGRyZXNzOiAiICsgcykKCX0KCXJldHVybiBhCn0KCi8vIHNwbGl0TGlzdCBjdXRzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QsIGRyb3BwaW5nIGJsYW5rcy4KZnVuYyBzcGxpdExpc3QocyBzdHJpbmcpIFtdc3RyaW5nIHsKCXZhciBvdXQgW11zdHJpbmcKCWZvciBfLCBwIDo9IHJhbmdlIHN0cmluZ3MuU3BsaXQocywgIiwiKSB7CgkJaWYgcCA9IHN0cmluZ3MuVHJpbVNwYWNlKHApOyBwICE9ICIiIHsKCQkJb3V0ID0gYXBwZW5kKG91dCwgcCkKCQl9Cgl9CglyZXR1cm4gb3V0Cn0KCi8vIHZhbGlkVGV4dCBpcyAxIHRvIG1heCBieXRlcyB3aXRoIG5vIGNvbnRyb2wgY2hhcmFjdGVyLgpmdW5jIHZhbGlkVGV4dChzIHN0cmluZywgbWF4IGludCkgYm9vbCB7CglpZiBsZW4ocykgPT0gMCB8fCBsZW4ocykgPiBtYXggewoJCXJldHVybiBmYWxzZQoJfQoJZm9yIGkgOj0gMDsgaSA8IGxlbihzKTsgaSsrIHsKCQlpZiBzW2ldIDwgMHgyMCB8fCBzW2ldID09IDB4N2YgewoJCQlyZXR1cm4gZmFsc2UKCQl9Cgl9CglyZXR1cm4gdHJ1ZQp9CgovLyB2YWxpZE5hbWUgYWxzbyByZWZ1c2VzIHRoZSBzZXBhcmF0b3JzIHRoZSBmb3JtcyB1c2UuCmZ1bmMgdmFsaWROYW1lKHMgc3RyaW5nKSBib29sIHsKCXJldHVybiB2YWxpZFRleHQocywgbWF4TmFtZSkgJiYgIXN0cmluZ3MuQ29udGFpbnNBbnkocywgIiw6Oz0iKQp9CgovLyBrZXkgcGFkcyBhbiBJRCBzbyB0aGUgdHJlZXMga2VlcCBudW1lcmljIG9yZGVyLgpmdW5jIGtleShpZCBpbnQpIHN0cmluZyB7CglzIDo9IHN0cmNvbnYuSXRvYShpZCkKCXJldHVybiBzdHJpbmdzLlJlcGVhdCgiMCIsIDEwLWxlbihzKSkgKyBzCn0KCmZ1bmMgaXRvYShuIGludCkgc3RyaW5nIHsgcmV0dXJuIHN0cmNvbnYuSXRvYShuKSB9ChqXGAoKbm90aWZ5LmdubxKIGHBhY2thZ2UgZ25vc3BsaXQKCmltcG9ydCAoCgkiY2hhaW4iCgoJImduby5sYW5kL3AvbnltLWFsZXhpc2NvbGluMDAwL2dub3NwbGl0L2xlZGdlci92MCIKCWdub3RpZiAiZ25vLmxhbmQvci9ueW0tZ2ZhbnRvbjAwMS9nbm90aWYvdjAiCikKCi8vIEV2ZW50cy4gVGhlIGZpcnN0IG9uZXMgc2F5IHdoYXQgY2hhbmdlZCwgZm9yIGluZGV4ZXJzIGFuZCBhcHBzLiBUaGUgbm90aWZ5Ci8vIG9uZXMgZWFjaCBjYXJyeSAidG8iLCBhIHdhbGxldDogZ25vdGlmIHR1cm5zIHRoZW0gaW50byBhIGJyb3dzZXIKLy8gbm90aWZpY2F0aW9uIGZvciB3aG9ldmVyIG9wdGVkIGluIHdpdGggdGhhdCBhZGRyZXNzLiBBIG5vdGlmeSBldmVudCBnb2VzCi8vIG9ubHkgdG8gbWVtYmVycyB3aXRoIGEgd2FsbGV0LCBuZXZlciB0byB0aGUgbWVtYmVyIHdobyBhY3RlZC4KY29uc3QgKAoJRXZlbnRHcm91cENyZWF0ZWQgPSAiR3JvdXBDcmVhdGVkIgoJRXZlbnRNZW1iZXJBZGRlZCAgPSAiTWVtYmVyQWRkZWQiCglFdmVudE1lbWJlckxpbmtlZCA9ICJNZW1iZXJMaW5rZWQiCglFdmVudEVudHJ5QWRkZWQgICA9ICJFbnRyeUFkZGVkIgoJRXZlbnRFbnRyeURlbGV0ZWQgPSAiRW50cnlEZWxldGVkIgoJRXZlbnRHcm91cE1vdmVkICAgPSAiR3JvdXBNb3ZlZCIKCUV2ZW50T3duZXJPZmZlcmVkID0gIk93bmVyT2ZmZXJlZCIKCUV2ZW50T3duZXJDaGFuZ2VkID0gIk93bmVyQ2hhbmdlZCIKCUV2ZW50U3VjY2Vzc29yU2V0ID0gIlN1Y2Nlc3NvclNldCIKCglOb3RpZnlFeHBlbnNlICA9ICJFeHBlbnNlIiAgLy8gdG8sIGdyb3VwLCBnbmFtZSwgYnksIHRpdGxlLCBzaGFyZQoJTm90aWZ5SW5jb21lICAgPSAiSW5jb21lIiAgIC8vIHRvLCBncm91cCwgZ25hbWUsIGJ5LCB0aXRsZSwgc2hhcmUKCU5vdGlmeVRyYW5zZmVyID0gIlRyYW5zZmVyIiAvLyB0bywgZ3JvdXAsIGduYW1lLCBmcm9tLCBwZWVyLCBhbW91bnQKCU5vdGlmeVJlbWluZGVyID0gIlJlbWluZGVyIiAvLyB0bywgZ3JvdXAsIGduYW1lLCBieSwgYW1vdW50CglOb3RpZnlKb2luZWQgICA9ICJKb2luZWQiICAgLy8gdG8sIGdyb3VwLCBnbmFtZSwgYnkKKQoKLy8gZGVjbGFyZVRyaWdnZXJzIHJlZ2lzdGVycyB0aGUgbm90aWZ5IGV2ZW50cyB3aXRoIGdub3RpZiBhdCBkZXBsb3kuIFRoZQovLyByZWdpc3RyeSBtYXJrcyB0aGVtIHZlcmlmaWVkLCBzaW5jZSB0aGlzIHJlYWxtIGRlY2xhcmVzIGl0cyBvd24uCi8vIHBvbnl0YWlsOiBnbm90aWYgaXMgYSB2MCBvbiBvbnl4OyBhIG5ldyByZWdpc3RyeSB2ZXJzaW9uIG1lYW5zIGEgbmV3Ci8vIHJlbGVhc2Ugb2YgdGhpcyByZWFsbSwgd2hpY2ggaXMgd2h5IGV2ZXJ5IGdub3RpZiBjYWxsIGxpdmVzIGluIHRoaXMgZmlsZS4KZnVuYyBkZWNsYXJlVHJpZ2dlcnMoY3VyIHJlYWxtKSB7Cgl0cmlnZ2VycyA6PSBbXVsyXXN0cmluZ3sKCQl7Tm90aWZ5RXhwZW5zZSwgIntieX0gYWRkZWQge3RpdGxlfS4gWW91ciBzaGFyZToge3NoYXJlfSJ9LAoJCXtOb3RpZnlJbmNvbWUsICJ7Ynl9IHJlY29yZGVkIHt0aXRsZX0uIFlvdSBnZXQgYmFjayB7c2hhcmV9In0sCgkJe05vdGlmeVRyYW5zZmVyLCAie2Zyb219IHBhaWQge3BlZXJ9IHthbW91bnR9In0sCgkJe05vdGlmeVJlbWluZGVyLCAie2J5fSByZW1pbmRzIHlvdSB0aGF0IHlvdSBvd2Uge2Ftb3VudH0ifSwKCQl7Tm90aWZ5Sm9pbmVkLCAie2J5fSBhZGRlZCB5b3UgdG8gdGhlIGdyb3VwIn0sCgl9Cglmb3IgXywgdCA6PSByYW5nZSB0cmlnZ2VycyB7CgkJZ25vdGlmLkRlY2xhcmUoY3Jvc3MoY3VyKSwgc2VsZiwgdFswXSwgIiIsICJ0byIsICJ7Z25hbWV9IiwgdFsxXSwgaHViKyI6e2dyb3VwfSIpCgl9Cn0KCmZ1bmMgbm90aWZ5RW50cnkoZyAqR3JvdXAsIGUgKkVudHJ5LCBieSBpbnQpIHsKCWlmIGUuS2luZCA9PSBLaW5kVHJhbnNmZXIgewoJCWZvciBfLCBpIDo9IHJhbmdlIFtdaW50e2UuUGF5ZXIsIGUuV2hvWzBdfSB7CgkJCWlmIHRvIDo9IGcuTWVtYmVyc1tpXS5BZGRyOyB0byAhPSAiIiAmJiBpICE9IGJ5IHsKCQkJCWNoYWluLkVtaXQoTm90aWZ5VHJhbnNmZXIsICJ0byIsIHRvLlN0cmluZygpLCAiZ3JvdXAiLCBpdG9hKGcuSUQpLCAiZ25hbWUiLCBnLk5hbWUsCgkJCQkJImZyb20iLCBnLk1lbWJlcnNbZS5QYXllcl0uTmFtZSwgInBlZXIiLCBnLk1lbWJlcnNbZS5XaG9bMF1dLk5hbWUsICJhbW91bnQiLCBnLm1vbmV5KGUuVG90YWwpKQoJCQl9CgkJfQoJCXJldHVybgoJfQoJZXZlbnQgOj0gTm90aWZ5RXhwZW5zZQoJaWYgZS5LaW5kID09IEtpbmRJbmNvbWUgewoJCWV2ZW50ID0gTm90aWZ5SW5jb21lCgl9Cglmb3IgaywgaSA6PSByYW5nZSBlLldobyB7CgkJaWYgdG8gOj0gZy5NZW1iZXJzW2ldLkFkZHI7IHRvICE9ICIiICYmIGkgIT0gYnkgewoJCQlzaGFyZSA6PSBlLk93ZVtrXQoJCQlpZiBzaGFyZSA8IDAgewoJCQkJc2hhcmUgPSAtc2hhcmUKCQkJfQoJCQljaGFpbi5FbWl0KGV2ZW50LCAidG8iLCB0by5TdHJpbmcoKSwgImdyb3VwIiwgaXRvYShnLklEKSwgImduYW1lIiwgZy5OYW1lLAoJCQkJImJ5IiwgZy5NZW1iZXJzW2J5XS5OYW1lLCAidGl0bGUiLCBlLlRpdGxlLCAic2hhcmUiLCBnLm1vbmV5KHNoYXJlKSkKCQl9Cgl9Cn0KCmZ1bmMgbm90aWZ5UmVtaW5kZXIoZyAqR3JvdXAsIG0gKk1lbWJlciwgYnkgc3RyaW5nKSB7CgljaGFpbi5FbWl0KE5vdGlmeVJlbWluZGVyLCAidG8iLCBtLkFkZHIuU3RyaW5nKCksICJncm91cCIsIGl0b2EoZy5JRCksICJnbmFtZSIsIGcuTmFtZSwKCQkiYnkiLCBieSwgImFtb3VudCIsIGcubW9uZXkoLW0uQmFsKSkKfQoKZnVuYyBub3RpZnlKb2luZWQoZyAqR3JvdXAsIGEgYWRkcmVzcywgYnkgc3RyaW5nKSB7CgljaGFpbi5FbWl0KE5vdGlmeUpvaW5lZCwgInRvIiwgYS5TdHJpbmcoKSwgImdyb3VwIiwgaXRvYShnLklEKSwgImduYW1lIiwgZy5OYW1lLCAiYnkiLCBieSkKfQoKLy8gbW9uZXkgd3JpdGVzIGNlbnRzIHdpdGggdGhlIGdyb3VwJ3MgY3VycmVuY3k6ICI0Mi41MCDigqwiLgpmdW5jIChnICpHcm91cCkgbW9uZXkoYyBpbnQ2NCkgc3RyaW5nIHsgcmV0dXJuIGxlZGdlci5Gb3JtYXQoYykgKyAiICIgKyBnLkN1cnJlbmN5IH0KGrEaCglvd25lci5nbm8SoxpwYWNrYWdlIGdub3NwbGl0CgppbXBvcnQgKAoJImNoYWluIgoJInN0cmluZ3MiCikKCi8vIFRoZSByZWFsbSdzIG93bmVyLCB0aGUgZGVwbG95ZXIsIGhvbGRzIG9uZSBwb3dlcjogbmFtaW5nIHRoZSByZWxlYXNlIHRoYXQKLy8gdGFrZXMgb3ZlciAoU2V0U3VjY2Vzc29yKSwgb25jZS4gSXQgY2Fubm90IHRvdWNoIGEgZ3JvdXAuIFRoZSByb2xlIHBhc3NlcwovLyBieSBUcmFuc2ZlciB0aGVuIEFjY2VwdDsgUmVub3VuY2UgZHJvcHMgaXQgZm9yIGdvb2QuCnZhciAoCglvd25lciAgICAgYWRkcmVzcyAvLyAiIiBvbmNlIHJlbm91bmNlZAoJcGVuZGluZyAgIGFkZHJlc3MgLy8gdGhlIGFkZHJlc3MgYSBUcmFuc2ZlciBvZmZlcmVkIHRoZSByb2xlIHRvCglzdWNjZXNzb3Igc3RyaW5nICAvLyB0aGUgcGtncGF0aCBvZiB0aGUgbmV4dCByZWxlYXNlLCAiIiB1bnRpbCBuYW1lZAopCgovLyBzZXRVcCBpcyBpbml0J3Mgb3duZXIgaGFsZi4gT25seSBgZ25vIHRlc3RgIChjaGFpbiAiZGV2IikgcnVucyB3aXRoIG5vCi8vIHNpZ25lciwgYW5kIGFuIG93bmVyICIiIGhvbGRzIG5vIHBvd2VyLgpmdW5jIHNldFVwKGRlcGxveWVyIGFkZHJlc3MsIGNoYWluSUQgc3RyaW5nKSB7CglpZiBkZXBsb3llciA9PSAiIiAmJiBjaGFpbklEICE9ICJkZXYiIHsKCQlwYW5pYygiZ25vc3BsaXQ6IG5vIG93bmVyOiBkZXBsb3kgZ25vc3BsaXQgZnJvbSBhbiBhY2NvdW50IikKCX0KCW93bmVyID0gZGVwbG95ZXIKfQoKLy8gT3duZXIgaXMgdGhlIHJlYWxtJ3Mgb3duZXIsICIiIG9uY2UgcmVub3VuY2VkLgpmdW5jIE93bmVyKCkgYWRkcmVzcyB7IHJldHVybiBvd25lciB9CgovLyBTdWNjZXNzb3IgaXMgdGhlIHBrZ3BhdGggb2YgdGhlIHJlbGVhc2UgdGhhdCB0YWtlcyBncm91cHMgb3ZlciwgIiIgaWYgbm9uZS4KZnVuYyBTdWNjZXNzb3IoKSBzdHJpbmcgeyByZXR1cm4gc3VjY2Vzc29yIH0KCmZ1bmMgaXNPd25lcihhIGFkZHJlc3MpIGJvb2wgeyByZXR1cm4gb3duZXIgIT0gIiIgJiYgYSA9PSBvd25lciB9CgovLyBUcmFuc2ZlciBvZmZlcnMgdGhlIHJvbGUgdG8gYW5vdGhlciBhZGRyZXNzLCB3aGljaCB0YWtlcyBpdCB3aXRoIEFjY2VwdC4KZnVuYyBUcmFuc2ZlcihjdXIgcmVhbG0sIHRvIGFkZHJlc3MpIHsKCWlmICFpc093bmVyKGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSkgewoJCXBhbmljKCJnbm9zcGxpdDogb25seSB0aGUgb3duZXIgY2FuIHRyYW5zZmVyIHRoZSByb2xlIikKCX0KCWlmICF0by5Jc1ZhbGlkKCkgewoJCXBhbmljKCJnbm9zcGxpdDogbm90IGFuIGFkZHJlc3M6ICIgKyB0by5TdHJpbmcoKSkKCX0KCXBlbmRpbmcgPSB0bwoJY2hhaW4uRW1pdChFdmVudE93bmVyT2ZmZXJlZCwgInRvIiwgdG8uU3RyaW5nKCkpCn0KCi8vIEFjY2VwdCB0YWtlcyB0aGUgcm9sZSBhIFRyYW5zZmVyIG9mZmVyZWQgdGhlIGNhbGxlci4KZnVuYyBBY2NlcHQoY3VyIHJlYWxtKSB7CgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglpZiBvd25lciA9PSAiIiB8fCBwZW5kaW5nID09ICIiIHx8IGNhbGxlciAhPSBwZW5kaW5nIHsKCQlwYW5pYygiZ25vc3BsaXQ6IG5vIHRyYW5zZmVyIG9mIHRoZSByb2xlIGlzIG9mZmVyZWQgdG8geW91IikKCX0KCW93bmVyLCBwZW5kaW5nID0gY2FsbGVyLCAiIgoJY2hhaW4uRW1pdChFdmVudE93bmVyQ2hhbmdlZCwgIm93bmVyIiwgb3duZXIuU3RyaW5nKCkpCn0KCi8vIFJlbm91bmNlIGdpdmVzIHRoZSByb2xlIHVwIGZvciBnb29kLgpmdW5jIFJlbm91bmNlKGN1ciByZWFsbSkgewoJaWYgIWlzT3duZXIoY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpKSB7CgkJcGFuaWMoImdub3NwbGl0OiBvbmx5IHRoZSBvd25lciBjYW4gcmVub3VuY2UgdGhlIHJvbGUiKQoJfQoJb3duZXIsIHBlbmRpbmcgPSAiIiwgIiIKCWNoYWluLkVtaXQoRXZlbnRPd25lckNoYW5nZWQsICJvd25lciIsICIiKQp9CgovLyBTZXRTdWNjZXNzb3IgbmFtZXMgdGhlIHJlbGVhc2UgdGhhdCB0YWtlcyBncm91cHMgb3Zlciwgb25jZTogYSByZWFsbSB1bmRlcgovLyB0aGlzIG9uZSdzIG5hbWVzcGFjZSwgbGlrZSBnbm8ubGFuZC9yLzxucz4vZ25vc3BsaXQvdjIuIEZyb20gdGhlbiBvbiB0aGF0Ci8vIHJlYWxtIGNhbiBtb3ZlIGEgZ3JvdXAgd2l0aCBNb3ZlT3V0OyBub3RoaW5nIG1vdmVzIGJ5IGl0c2VsZi4KZnVuYyBTZXRTdWNjZXNzb3IoY3VyIHJlYWxtLCBwa2dwYXRoIHN0cmluZykgewoJaWYgIWlzT3duZXIoY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpKSB7CgkJcGFuaWMoImdub3NwbGl0OiBvbmx5IHRoZSBvd25lciBjYW4gbmFtZSBhIHN1Y2Nlc3NvciIpCgl9CglpZiBzdWNjZXNzb3IgIT0gIiIgewoJCXBhbmljKCJnbm9zcGxpdDogdGhlIHN1Y2Nlc3NvciBpcyBhbHJlYWR5ICIgKyBzdWNjZXNzb3IpCgl9CglucyA6PSBzZWxmWzpzdHJpbmdzLkxhc3RJbmRleChzZWxmLCAiLyIpKzFdIC8vICJnbm8ubGFuZC9yLzxucz4vZ25vc3BsaXQvIgoJaWYgIXN0cmluZ3MuSGFzUHJlZml4KHBrZ3BhdGgsIG5zKSB8fCBwa2dwYXRoID09IHNlbGYgfHwgbGVuKHBrZ3BhdGgpID4gMTAwIHx8IHN0cmluZ3MuQ29udGFpbnNBbnkocGtncGF0aCwgIiA6PyMiKSB7CgkJcGFuaWMoImdub3NwbGl0OiBhIHN1Y2Nlc3NvciBpcyBhIHNpYmxpbmcgcmVsZWFzZSB1bmRlciAiICsgbnMpCgl9CglzdWNjZXNzb3IgPSBwa2dwYXRoCgljaGFpbi5FbWl0KEV2ZW50U3VjY2Vzc29yU2V0LCAicGtncGF0aCIsIHBrZ3BhdGgpCn0KCi8vIE1vdmVPdXQgbWFya3MgYSBncm91cCBhcyB0YWtlbiBvdmVyIGFuZCByZXR1cm5zIGl0LCBhcyBFeHBvcnQgd3JpdGVzIGl0LgovLyBPbmx5IHRoZSBzdWNjZXNzb3IgcmVhbG0gY2FuIGNhbGwgaXQsIHdoaWNoIGRlY2lkZXMgd2hlbiBhIGdyb3VwIG1vdmVzCi8vICh3aGVuIG9uZSBvZiBpdHMgZWRpdG9ycyBhc2tzKS4gVGhlIGdyb3VwIHN0YXlzIHJlYWRhYmxlIGhlcmUsIGZyb3plbi4KZnVuYyBNb3ZlT3V0KGN1ciByZWFsbSwgZ3JvdXAgc3RyaW5nKSBzdHJpbmcgewoJcHJldiA6PSBjdXIuUHJldmlvdXMoKQoJaWYgc3VjY2Vzc29yID09ICIiIHx8ICFwcmV2LklzQ29kZSgpIHx8IHByZXYuUGtnUGF0aCgpICE9IHN1Y2Nlc3NvciB7CgkJcGFuaWMoImdub3NwbGl0OiBvbmx5IHRoZSBzdWNjZXNzb3IgY2FuIG1vdmUgYSBncm91cCIpCgl9CglnIDo9IG11c3RHcm91cChncm91cCkKCWlmIGcuTW92ZWQgewoJCXBhbmljKCJnbm9zcGxpdDogZ3JvdXAgIiArIGdyb3VwICsgIiBhbHJlYWR5IG1vdmVkIikKCX0KCWcuTW92ZWQgPSB0cnVlCgljaGFpbi5FbWl0KEV2ZW50R3JvdXBNb3ZlZCwgImdyb3VwIiwgaXRvYShnLklEKSwgInRvIiwgc3VjY2Vzc29yKQoJcmV0dXJuIEV4cG9ydChncm91cCkKfQoa9rEBCgpyZW5kZXIuZ25vEuaxAXBhY2thZ2UgZ25vc3BsaXQKCmltcG9ydCAoCgkiZW5jb2RpbmcvYmFzZTY0IgoJImh0bWwiCgkic3RyY29udiIKCSJzdHJpbmdzIgoJInRpbWUiCgoJImduby5sYW5kL3AvbnltLWFsZXhpc2NvbGluMDAwL2dub3NwbGl0L2xlZGdlci92MCIKCSJnbm8ubGFuZC9wL250L21hcmtkb3duL3Nhbml0aXplL3YwIgopCgovLyBjYXRlZ29yaWVzIGFyZSBhbiBleHBlbnNlJ3Mga2luZHMsIGluIHRoZSBvcmRlciBCeUNhdCBjb3VudHMgdGhlbS4gVGhlIGxhc3QKLy8gb25lIGlzIHRoZSBkZWZhdWx0LiBBIGZvcm0gc2VuZHMgdGhlIG5hbWUuCnZhciBjYXRlZ29yaWVzID0gW11zdHJ1Y3R7IE5hbWUsIEljb24sIENvbG9yIHN0cmluZyB9ewoJeyJGb29kIiwgIvCfjb0iLCAiIzRlNzlhNyJ9LAoJeyJHcm9jZXJpZXMiLCAi8J+bkiIsICIjZjI4ZTJiIn0sCgl7IlRyYW5zcG9ydCIsICLwn5qXIiwgIiM1OWExNGYifSwKCXsiTG9kZ2luZyIsICLwn4+gIiwgIiNlMTU3NTkifSwKCXsiQWN0aXZpdGllcyIsICLwn46fIiwgIiM3NmI3YjIifSwKCXsiU2hvcHBpbmciLCAi8J+bjSIsICIjZWRjOTQ4In0sCgl7IkJpbGxzIiwgIvCfp74iLCAiI2IwN2FhMSJ9LAoJeyJPdGhlciIsICLwn5OmIiwgIiM5Yzc1NWYifSwKfQoKZnVuYyBjYXRlZ29yeU9mKG5hbWUgc3RyaW5nKSBpbnQgewoJbmFtZSA9IHN0cmluZ3MuVG9Mb3dlcihzdHJpbmdzLlRyaW1TcGFjZShuYW1lKSkKCWlmIG5hbWUgPT0gIiIgewoJCXJldHVybiBsZW4oY2F0ZWdvcmllcykgLSAxCgl9Cglmb3IgaSwgYyA6PSByYW5nZSBjYXRlZ29yaWVzIHsKCQlpZiBzdHJpbmdzLlRvTG93ZXIoYy5OYW1lKSA9PSBuYW1lIHsKCQkJcmV0dXJuIGkKCQl9Cgl9CglwYW5pYygiZ25vc3BsaXQ6IG5vIGNhdGVnb3J5ICIgKyBuYW1lKQp9Cgpjb25zdCAoCglwYWdlU2l6ZSA9IDI1IC8vIGVudHJpZXMgcGVyIGhpc3RvcnkgcGFnZQoJbGF0ZXN0ICAgPSA4ICAvLyBlbnRyaWVzIG9uIGEgZ3JvdXAncyBwYWdlCikKCi8vIFJlbmRlciBzZXJ2ZXMgIiIgKGhvbWUpLCAidS88YWRkcmVzcz4iIChhIHdhbGxldCdzIGdyb3VwcykgYW5kIGEgZ3JvdXAncwovLyBwYWdlczogIjxpZD4iLCB0aGVuICIvYWRkIiwgIi9zZXR0bGUiLCAiL3NldHRsZS88ZnJvbT4vPHRvPi88Y2VudHM+IiwKLy8gIi9tZW1iZXJzIiwgIi9zdGF0cyIsICIvaGlzdG9yeVsvPHBhZ2U+XSIsICIvZS88ZW50cnk+IiBhbmQgIi9jc3YiLgpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCWlmIHBhdGggPT0gIiIgewoJCXJldHVybiByZW5kZXJIb21lKCkKCX0KCWlmIHN0cmluZ3MuSGFzUHJlZml4KHBhdGgsICJ1LyIpIHsKCQlyZXR1cm4gcmVuZGVyV2FsbGV0KGFkZHJlc3Moc3RyaW5ncy5UcmltUHJlZml4KHBhdGgsICJ1LyIpKSkKCX0KCXBhcnRzIDo9IHN0cmluZ3MuU3BsaXQocGF0aCwgIi8iKQoJZyA6PSBnZXRHcm91cChwYXJ0c1swXSkKCWlmIGcgPT0gbmlsIHsKCQlyZXR1cm4gIiMgTm90IGZvdW5kXG5cbk5vIGdyb3VwICIgKyBzYW5pdGl6ZS5JbmxpbmVUZXh0KHBhcnRzWzBdKSArICIuIFtCYWNrIGhvbWVdKCIgKyBodWIgKyAiKVxuIgoJfQoJcGFnZSA6PSAiIgoJaWYgbGVuKHBhcnRzKSA+IDEgewoJCXBhZ2UgPSBwYXJ0c1sxXQoJfQoJc3dpdGNoIHsKCWNhc2UgcGFnZSA9PSAiIiAmJiBsZW4ocGFydHMpID09IDE6CgkJcmV0dXJuIHJlbmRlckdyb3VwKGcpCgljYXNlIHBhZ2UgPT0gImFkZCIgJiYgbGVuKHBhcnRzKSA9PSAyOgoJCXJldHVybiByZW5kZXJBZGQoZykKCWNhc2UgcGFnZSA9PSAic2V0dGxlIiAmJiBsZW4ocGFydHMpID09IDI6CgkJcmV0dXJuIHJlbmRlclNldHRsZShnLCAtMSwgLTEsIDApCgljYXNlIHBhZ2UgPT0gInNldHRsZSIgJiYgbGVuKHBhcnRzKSA9PSA1OgoJCWYsIHQsIGMgOj0gYXRvaShwYXJ0c1syXSksIGF0b2kocGFydHNbM10pLCBhdG9pKHBhcnRzWzRdKQoJCWlmIGYgPj0gMCAmJiB0ID49IDAgJiYgZiA8IGxlbihnLk1lbWJlcnMpICYmIHQgPCBsZW4oZy5NZW1iZXJzKSAmJiBjID4gMCB7CgkJCXJldHVybiByZW5kZXJTZXR0bGUoZywgZiwgdCwgaW50NjQoYykpCgkJfQoJY2FzZSBwYWdlID09ICJtZW1iZXJzIiAmJiBsZW4ocGFydHMpID09IDI6CgkJcmV0dXJuIHJlbmRlck1lbWJlcnMoZykKCWNhc2UgcGFnZSA9PSAic3RhdHMiICYmIGxlbihwYXJ0cykgPT0gMjoKCQlyZXR1cm4gcmVuZGVyU3RhdHMoZykKCWNhc2UgcGFnZSA9PSAiaGlzdG9yeSIgJiYgbGVuKHBhcnRzKSA8PSAzOgoJCW4gOj0gMQoJCWlmIGxlbihwYXJ0cykgPT0gMyB7CgkJCW4gPSBhdG9pKHBhcnRzWzJdKQoJCX0KCQlpZiBuID49IDEgewoJCQlyZXR1cm4gcmVuZGVySGlzdG9yeShnLCBuKQoJCX0KCWNhc2UgcGFnZSA9PSAiZSIgJiYgbGVuKHBhcnRzKSA9PSAzOgoJCWlmIHYgOj0gZy5FbnRyaWVzLkdldChrZXkoYXRvaShwYXJ0c1syXSkpKTsgdiAhPSBuaWwgewoJCQlyZXR1cm4gcmVuZGVyRW50cnkoZywgdi4oKkVudHJ5KSkKCQl9CgljYXNlIHBhZ2UgPT0gImNzdiIgJiYgbGVuKHBhcnRzKSA9PSAyOgoJCXJldHVybiBoZWFkZXIoZywgIkV4cG9ydCIpICsgIkV2ZXJ5IG1lbWJlciBhbmQgZW50cnksIGFzIENTVi5cblxuIiArIHNhbml0aXplLkNvZGVCbG9jayhFeHBvcnQocGFydHNbMF0pKQoJfQoJcmV0dXJuICIjIE5vdCBmb3VuZFxuXG5bQmFjayB0byB0aGUgZ3JvdXBdKCIgKyBsaW5rKGcsICIiKSArICIpXG4iCn0KCmZ1bmMgcmVuZGVySG9tZSgpIHN0cmluZyB7Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVTdHJpbmcoIiMgZ25vc3BsaXRcblxuIikKCWIuV3JpdGVTdHJpbmcoIioqU2hhcmUgZXhwZW5zZXMgd2l0aCBmcmllbmRzLCB0aGVuIHNldHRsZSB1cCBpbiBhcyBmZXcgdHJhbnNmZXJzIGFzIHBvc3NpYmxlLioqICIpCgliLldyaXRlU3RyaW5nKCJUcmlwcywgZmxhdHNoYXJlcywgZGlubmVyczogbGlrZSBUcmljb3VudCwgb24gZ25vLmxhbmQsIHdpdGggbm8gYWNjb3VudCBhbmQgbm8gYWRzLlxuXG4iKQoJYi5Xcml0ZVN0cmluZygiPGduby1jb2x1bW5zPlxuIyMjIDEuIENyZWF0ZSBhIGdyb3VwXG5OYW1lIGl0LCBwaWNrIGEgY3VycmVuY3ksIGxpc3QgeW91ciBmcmllbmRzLiBUaGV5IGRvbid0IG5lZWQgYSB3YWxsZXQuXG4iKQoJYi5Xcml0ZVN0cmluZygiPGduby1jb2x1bW5zLXNlcCAvPlxuIyMjIDIuIEFkZCBleHBlbnNlc1xuV2hvIHBhaWQsIGZvciB3aG9tOiBzcGxpdCBlcXVhbGx5LCBieSBzaGFyZXMgb3IgYnkgZXhhY3QgYW1vdW50cy4gRm9yZWlnbiBjdXJyZW5jaWVzIHRvby5cbiIpCgliLldyaXRlU3RyaW5nKCI8Z25vLWNvbHVtbnMtc2VwIC8+XG4jIyMgMy4gU2V0dGxlIHVwXG5nbm9zcGxpdCB3b3JrcyBvdXQgd2hvIHBheXMgd2hvbSwgaW4gdGhlIGZld2VzdCB0cmFuc2ZlcnMuIEZyaWVuZHMgd2l0aCBhIHdhbGxldCBnZXQgbm90aWZpZWQuXG4iKQoJYi5Xcml0ZVN0cmluZygiPC9nbm8tY29sdW1ucz5cblxuIikKCWIuV3JpdGVTdHJpbmcoIiMjIENyZWF0ZSBhIGdyb3VwXG5cbiIpCgliLldyaXRlU3RyaW5nKCI8Z25vLWZvcm0gZXhlYz1cIkNyZWF0ZUdyb3VwXCI+XG4iKQoJYi5Xcml0ZVN0cmluZyhpbnB1dCgibmFtZSIsICJHcm91cCBuYW1lLCBsaWtlIFNraSB0cmlwIiwgIiIsIHRydWUpKQoJYi5Xcml0ZVN0cmluZyhpbnB1dCgiY3VycmVuY3kiLCAiQ3VycmVuY3ksIGxpa2Ug4oKsIG9yIENIRiIsICLigqwiLCB0cnVlKSkKCWIuV3JpdGVTdHJpbmcoaW5wdXQoInlvdSIsICJZb3VyIG5hbWUgaW4gdGhlIGdyb3VwIiwgIiIsIHRydWUpKQoJYi5Xcml0ZVN0cmluZyhpbnB1dCgib3RoZXJzIiwgIllvdXIgZnJpZW5kcywgY29tbWEtc2VwYXJhdGVkOiBBbGljZSwgQm9iIiwgIiIsIGZhbHNlKSkKCWIuV3JpdGVTdHJpbmcoIjwvZ25vLWZvcm0+XG5cbiIpCgliLldyaXRlU3RyaW5nKCI+IFshTk9URV0gRXZlcnl0aGluZyBpcyBwdWJsaWNcbj4gQSBncm91cCBsaXZlcyBvbiBnbm8ubGFuZDogYW55b25lIHdpdGggaXRzIGxpbmsgY2FuIHJlYWQgaXQuICIpCgliLldyaXRlU3RyaW5nKCJVc2UgZmlyc3QgbmFtZXMsIGFuZCBrZWVwIHByaXZhdGUgZGV0YWlscyBvdXQgb2YgdGl0bGVzLlxuXG4iKQoJYi5Xcml0ZVN0cmluZygiIyMgWW91ciBncm91cHNcblxuT3BlbiBgIiArIGh1YiArICI6dS88eW91ciBhZGRyZXNzPmAgdG8gbGlzdCB0aGUgZ3JvdXBzIHlvdXIgd2FsbGV0IGlzIGluLiAiKQoJYi5Xcml0ZVN0cmluZyhwbHVyYWwoZ3JvdXBzLlNpemUoKSwgImdyb3VwIikgKyAiIHNvIGZhci5cbiIpCglyZXR1cm4gYi5TdHJpbmcoKQp9CgpmdW5jIHJlbmRlcldhbGxldChhIGFkZHJlc3MpIHN0cmluZyB7CglpZiAhYS5Jc1ZhbGlkKCkgewoJCXJldHVybiAiIyBOb3QgZm91bmRcblxuTm90IGFuIGFkZHJlc3MuIFtCYWNrIGhvbWVdKCIgKyBodWIgKyAiKVxuIgoJfQoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlU3RyaW5nKCIjIFlvdXIgZ3JvdXBzXG5cbiIgKyBhLlN0cmluZygpICsgIlxuXG4iKQoJbiA6PSAwCglieUFkZHIuSXRlcmF0ZShhLlN0cmluZygpKyIvIiwgYS5TdHJpbmcoKSsiMCIsIGZ1bmMoayBzdHJpbmcsIF8gYW55KSBib29sIHsKCQlnIDo9IGdyb3Vwcy5HZXQoa1tzdHJpbmdzLkxhc3RJbmRleChrLCAiLyIpKzE6XSkuKCpHcm91cCkKCQltIDo9IGcuTWVtYmVyc1tnLmVkaXRvcihhKV0KCQlpZiBuID09IDAgewoJCQliLldyaXRlU3RyaW5nKCJ8IEdyb3VwIHwgWW91IHwgWW91ciBiYWxhbmNlIHxcbnwtLS18LS0tfC0tLTp8XG4iKQoJCX0KCQliLldyaXRlU3RyaW5nKCJ8IFsiICsgY2VsbFRleHQoZy5OYW1lKSArICJdKCIgKyBsaW5rKGcsICIiKSArICIpIHwgIiArIHNhbml0aXplLlRhYmxlQ2VsbChtLk5hbWUpICsKCQkJIiB8ICIgKyBsZWRnZXIuU2lnbmVkKG0uQmFsKSArICIgIiArIGcuQ3VycmVuY3kgKyAiIHxcbiIpCgkJbisrCgkJcmV0dXJuIGZhbHNlCgl9KQoJaWYgbiA9PSAwIHsKCQliLldyaXRlU3RyaW5nKCJUaGlzIHdhbGxldCBpcyBpbiBubyBncm91cCB5ZXQuIFtDcmVhdGUgb25lXSgiICsgaHViICsgIilcbiIpCgl9CglyZXR1cm4gYi5TdHJpbmcoKQp9CgpmdW5jIHJlbmRlckdyb3VwKGcgKkdyb3VwKSBzdHJpbmcgewoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlU3RyaW5nKGhlYWRlcihnLCAiIikpCgliLldyaXRlU3RyaW5nKCI8Z25vLWNvbHVtbnM+XG4jIyBCYWxhbmNlc1xuXG58IE1lbWJlciB8IHwgQmFsYW5jZSB8XG58LS0tfC0tLXwtLS06fFxuIikKCXZhciBtYXggaW50NjQKCWZvciBfLCBtIDo9IHJhbmdlIGcuTWVtYmVycyB7CgkJaWYgYWJzKG0uQmFsKSA+IG1heCB7CgkJCW1heCA9IGFicyhtLkJhbCkKCQl9Cgl9Cglmb3IgXywgbSA6PSByYW5nZSBnLk1lbWJlcnMgewoJCWIuV3JpdGVTdHJpbmcoInwgIiArIHNhbml0aXplLlRhYmxlQ2VsbChtLk5hbWUpICsgIiB8ICIgKyBiYWxhbmNlQmFyKG0uQmFsLCBtYXgpICsgIiB8ICoqIiArIGcubW9uZXkobS5CYWwpICsgIioqIHxcbiIpCgl9CgliLldyaXRlU3RyaW5nKCJcbjxnbm8tY29sdW1ucy1zZXAgLz5cbiMjIFNldHRsZSB1cFxuXG4iKQoJYi5Xcml0ZVN0cmluZyh0cmFuc2ZlcnMoZywgdHJ1ZSkpCgliLldyaXRlU3RyaW5nKCI8L2duby1jb2x1bW5zPlxuXG4jIyBMYXRlc3RcblxuIikKCWlmIGcuRW50cmllcy5TaXplKCkgPT0gMCB7CgkJYi5Xcml0ZVN0cmluZygiTm8gZXhwZW5zZSB5ZXQuIFtBZGQgdGhlIGZpcnN0IG9uZV0oIiArIGxpbmsoZywgIi9hZGQiKSArICIpXG4iKQoJCXJldHVybiBiLlN0cmluZygpCgl9CgliLldyaXRlU3RyaW5nKGVudHJ5VGFibGUoZywgMCwgbGF0ZXN0KSkKCWlmIGcuRW50cmllcy5TaXplKCkgPiBsYXRlc3QgewoJCWIuV3JpdGVTdHJpbmcoIlxuW0FsbCAiICsgcGx1cmFsKGcuRW50cmllcy5TaXplKCksICJlbnRyeSIpICsgIiDihpJdKCIgKyBsaW5rKGcsICIvaGlzdG9yeSIpICsgIilcbiIpCgl9CglyZXR1cm4gYi5TdHJpbmcoKQp9CgovLyB0cmFuc2ZlcnMgbGlzdHMgdGhlIHBheW1lbnRzIHRoYXQgc2V0dGxlIHRoZSBncm91cCwgZWFjaCB3aXRoIGEgbGluayB0aGF0Ci8vIGZpbGxzIGluIHRoZSBmb3JtIHRvIHJlY29yZCBpdC4KZnVuYyB0cmFuc2ZlcnMoZyAqR3JvdXAsIHNob3J0IGJvb2wpIHN0cmluZyB7CgliYWwgOj0gbWFrZShbXWludDY0LCBsZW4oZy5NZW1iZXJzKSkKCWZvciBpLCBtIDo9IHJhbmdlIGcuTWVtYmVycyB7CgkJYmFsW2ldID0gbS5CYWwKCX0KCXRzIDo9IGxlZGdlci5TZXR0bGUoYmFsKQoJaWYgbGVuKHRzKSA9PSAwIHsKCQlyZXR1cm4gIj4gWyFTVUNDRVNTXSBBbGwgc2V0dGxlZCB1cFxuPiBOb2JvZHkgb3dlcyBhbnl0aGluZy5cblxuIgoJfQoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlU3RyaW5nKCJ8IFdobyB8IFBheXMgfCBBbW91bnQgfCB8XG58LS0tfC0tLXwtLS06fC0tLXxcbiIpCglmb3IgXywgdCA6PSByYW5nZSB0cyB7CgkJYi5Xcml0ZVN0cmluZygifCAiICsgc2FuaXRpemUuVGFibGVDZWxsKGcuTWVtYmVyc1t0LkZyb21dLk5hbWUpICsgIiB8ICIgKyBzYW5pdGl6ZS5UYWJsZUNlbGwoZy5NZW1iZXJzW3QuVG9dLk5hbWUpICsKCQkJIiB8ICIgKyBnLm1vbmV5KHQuQW1vdW50KSArICIgfCBbUmVjb3JkXSgiICsgbGluayhnLCAiL3NldHRsZS8iK2l0b2EodC5Gcm9tKSsiLyIraXRvYSh0LlRvKSsiLyIrc3RyY29udi5Gb3JtYXRJbnQodC5BbW91bnQsIDEwKSkgKyAiKSB8XG4iKQoJfQoJaWYgc2hvcnQgewoJCWIuV3JpdGVTdHJpbmcoIlxuIiArIHBsdXJhbChsZW4odHMpLCAidHJhbnNmZXIiKSArICIgc2V0dGxlIGV2ZXJ5dGhpbmcuIFtTZXR0bGUgdXAg4oaSXSgiICsgbGluayhnLCAiL3NldHRsZSIpICsgIilcbiIpCgl9CglyZXR1cm4gYi5TdHJpbmcoKQp9CgpmdW5jIHJlbmRlckFkZChnICpHcm91cCkgc3RyaW5nIHsKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZyhoZWFkZXIoZywgIkFkZCIpKQoJaWYgZy5Nb3ZlZCB7CgkJcmV0dXJuIGIuU3RyaW5nKCkKCX0KCWIuV3JpdGVTdHJpbmcoIkFtb3VudHMgYXJlIGxpa2UgYDQyLjUwYC4gUGFpZCBpbiBhbm90aGVyIGN1cnJlbmN5PyBXcml0ZSBgNTAgVVNEIHgwLjkyYDogNTAgZG9sbGFycyBhdCAwLjkyICIgKwoJCWcuQ3VycmVuY3kgKyAiIGVhY2guXG5cbiIpCgoJYi5Xcml0ZVN0cmluZygiIyMgU3BsaXQgZXF1YWxseVxuXG48Z25vLWZvcm0gZXhlYz1cIkFkZEV4cGVuc2VcIj5cbiIpCgliLldyaXRlU3RyaW5nKGdyb3VwRmllbGQoZykgKyBpbnB1dCgidGl0bGUiLCAiV2hhdCwgbGlrZSBHcm9jZXJpZXMiLCAiIiwgdHJ1ZSkgKyBpbnB1dCgiYW1vdW50IiwgIkFtb3VudCIsICIiLCB0cnVlKSkKCWIuV3JpdGVTdHJpbmcobWVtYmVyU2VsZWN0KGcsICJwYWlkQnkiLCAiUGFpZCBieSIsIC0xKSkKCWIuV3JpdGVTdHJpbmcobWVtYmVyQ2hlY2tzKGcsICJmb3JXaG9tIiwgIkZvciB3aG9tIikpCgliLldyaXRlU3RyaW5nKGNhdGVnb3J5U2VsZWN0KCkpCgliLldyaXRlU3RyaW5nKCI8L2duby1mb3JtPlxuXG4iKQoKCXZhciBzaGFyZXMsIGFtb3VudHMgW11zdHJpbmcKCWZvciBfLCBtIDo9IHJhbmdlIGcuTWVtYmVycyB7CgkJc2hhcmVzID0gYXBwZW5kKHNoYXJlcywgbS5OYW1lKyI6MSIpCgkJYW1vdW50cyA9IGFwcGVuZChhbW91bnRzLCBtLk5hbWUrIjoiKQoJfQoJYi5Xcml0ZVN0cmluZygiIyMgU3BsaXQgYnkgc2hhcmVzXG5cbkdpdmUgZWFjaCBhIG51bWJlciBvZiBzaGFyZXM6IGBBbGljZToyLCBCb2I6MWAgbWFrZXMgQWxpY2UgcGF5IHR3byB0aGlyZHMuIExlYXZlIG91dCB3aG8gaXMgbm90IGluLlxuXG4iKQoJYi5Xcml0ZVN0cmluZygiPGduby1mb3JtIGV4ZWM9XCJBZGRCeVNoYXJlc1wiPlxuIikKCWIuV3JpdGVTdHJpbmcoZ3JvdXBGaWVsZChnKSArIGlucHV0KCJ0aXRsZSIsICJXaGF0IiwgIiIsIHRydWUpICsgaW5wdXQoImFtb3VudCIsICJBbW91bnQiLCAiIiwgdHJ1ZSkpCgliLldyaXRlU3RyaW5nKG1lbWJlclNlbGVjdChnLCAicGFpZEJ5IiwgIlBhaWQgYnkiLCAtMSkpCgliLldyaXRlU3RyaW5nKGlucHV0KCJzaGFyZXMiLCAiU2hhcmVzIiwgc3RyaW5ncy5Kb2luKHNoYXJlcywgIiwgIiksIHRydWUpKQoJYi5Xcml0ZVN0cmluZyhjYXRlZ29yeVNlbGVjdCgpKQoJYi5Xcml0ZVN0cmluZygiPC9nbm8tZm9ybT5cblxuIikKCgliLldyaXRlU3RyaW5nKCIjIyBTcGxpdCBieSBhbW91bnRzXG5cbldyaXRlIGVhY2ggb25lJ3MgZXhhY3QgcGFydDogYEFsaWNlOjEyLjUwLCBCb2I6Ny41MGAuIFRoZSBleHBlbnNlIGlzIHRoZWlyIHN1bS5cblxuIikKCWIuV3JpdGVTdHJpbmcoIjxnbm8tZm9ybSBleGVjPVwiQWRkQnlBbW91bnRzXCI+XG4iKQoJYi5Xcml0ZVN0cmluZyhncm91cEZpZWxkKGcpICsgaW5wdXQoInRpdGxlIiwgIldoYXQiLCAiIiwgdHJ1ZSkpCgliLldyaXRlU3RyaW5nKG1lbWJlclNlbGVjdChnLCAicGFpZEJ5IiwgIlBhaWQgYnkiLCAtMSkpCgliLldyaXRlU3RyaW5nKGlucHV0KCJhbW91bnRzIiwgIkFtb3VudHMsIGxpa2UgIitzdHJpbmdzLkpvaW4oYW1vdW50cywgIjEyLjUwLCAiKSsiMTIuNTAiLCAiIiwgdHJ1ZSkpCgliLldyaXRlU3RyaW5nKGNhdGVnb3J5U2VsZWN0KCkpCgliLldyaXRlU3RyaW5nKCI8L2duby1mb3JtPlxuXG4iKQoKCWIuV3JpdGVTdHJpbmcoIiMjIE1vbmV5IHJlY2VpdmVkXG5cbkEgcmVmdW5kLCBhIGRlcG9zaXQgcmV0dXJuZWQ6IHdobyByZWNlaXZlZCBpdCwgYW5kIGZvciB3aG9tLlxuXG4iKQoJYi5Xcml0ZVN0cmluZygiPGduby1mb3JtIGV4ZWM9XCJBZGRJbmNvbWVcIj5cbiIpCgliLldyaXRlU3RyaW5nKGdyb3VwRmllbGQoZykgKyBpbnB1dCgidGl0bGUiLCAiV2hhdCwgbGlrZSBEZXBvc2l0IGJhY2siLCAiIiwgdHJ1ZSkgKyBpbnB1dCgiYW1vdW50IiwgIkFtb3VudCIsICIiLCB0cnVlKSkKCWIuV3JpdGVTdHJpbmcobWVtYmVyU2VsZWN0KGcsICJyZWNlaXZlZEJ5IiwgIlJlY2VpdmVkIGJ5IiwgLTEpKQoJYi5Xcml0ZVN0cmluZyhtZW1iZXJDaGVja3MoZywgImZvcldob20iLCAiRm9yIHdob20iKSkKCWIuV3JpdGVTdHJpbmcoIjwvZ25vLWZvcm0+XG4iKQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKZnVuYyByZW5kZXJTZXR0bGUoZyAqR3JvdXAsIGZyb20sIHRvIGludCwgYW1vdW50IGludDY0KSBzdHJpbmcgewoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlU3RyaW5nKGhlYWRlcihnLCAiU2V0dGxlIHVwIikpCglpZiBmcm9tIDwgMCB7CgkJYi5Xcml0ZVN0cmluZyh0cmFuc2ZlcnMoZywgZmFsc2UpICsgIlxuIikKCX0KCWlmIGcuTW92ZWQgewoJCXJldHVybiBiLlN0cmluZygpCgl9CgliLldyaXRlU3RyaW5nKCIjIyBSZWNvcmQgYSBwYXltZW50XG5cbkEgcGF5bWVudCBtYWRlIG91dHNpZGUgZ25vc3BsaXQsIGJ5IGJhbmsgdHJhbnNmZXIgb3IgaW4gY2FzaC5cblxuIikKCWIuV3JpdGVTdHJpbmcoIjxnbm8tZm9ybSBleGVjPVwiQWRkVHJhbnNmZXJcIj5cbiIgKyBncm91cEZpZWxkKGcpKQoJaWYgdG8gPCAwICYmIGxlbihnLk1lbWJlcnMpID4gMSB7CgkJdG8gPSAxIC8vIGEgYmxhbmsgZm9ybSBzdGFydHMgb24gdHdvIGRpZmZlcmVudCBtZW1iZXJzCgl9CgliLldyaXRlU3RyaW5nKG1lbWJlclNlbGVjdChnLCAiZnJvbSIsICJGcm9tIiwgZnJvbSkpCgliLldyaXRlU3RyaW5nKG1lbWJlclNlbGVjdChnLCAidG8iLCAiVG8iLCB0bykpCglhbXQgOj0gIiIKCWlmIGFtb3VudCA+IDAgewoJCWFtdCA9IGNlbnRzKGFtb3VudCkKCX0KCWIuV3JpdGVTdHJpbmcoaW5wdXQoImFtb3VudCIsICJBbW91bnQiLCBhbXQsIHRydWUpKQoJYi5Xcml0ZVN0cmluZygiPC9nbm8tZm9ybT5cblxuIikKCWlmIGZyb20gPj0gMCB7CgkJcmV0dXJuIGIuU3RyaW5nKCkKCX0KCXZhciBkZWJ0b3JzIFtdaW50Cglmb3IgaSwgbSA6PSByYW5nZSBnLk1lbWJlcnMgewoJCWlmIG0uQmFsIDwgMCAmJiBtLkFkZHIgIT0gIiIgewoJCQlkZWJ0b3JzID0gYXBwZW5kKGRlYnRvcnMsIGkpCgkJfQoJfQoJaWYgbGVuKGRlYnRvcnMpID4gMCB7CgkJYi5Xcml0ZVN0cmluZygiIyMgU2VuZCBhIHJlbWluZGVyXG5cbkEgbm90aWZpY2F0aW9uIHRvIGEgbWVtYmVyIHdobyBvd2VzLCBhdCBtb3N0IG9uZSBldmVyeSAxMiBob3Vycy5cblxuIikKCQliLldyaXRlU3RyaW5nKCI8Z25vLWZvcm0gZXhlYz1cIlJlbWluZFwiPlxuIiArIGdyb3VwRmllbGQoZykpCgkJZm9yIGssIGkgOj0gcmFuZ2UgZGVidG9ycyB7CgkJCWIuV3JpdGVTdHJpbmcoc2VsZWN0T3B0KCJtZW1iZXIiLCBnLk1lbWJlcnNbaV0uTmFtZSwgZmlyc3QoaywgIldobyIpLCBrID09IDApKQoJCX0KCQliLldyaXRlU3RyaW5nKCI8L2duby1mb3JtPlxuIikKCX0KCXJldHVybiBiLlN0cmluZygpCn0KCmZ1bmMgcmVuZGVyTWVtYmVycyhnICpHcm91cCkgc3RyaW5nIHsKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZyhoZWFkZXIoZywgIk1lbWJlcnMiKSkKCWIuV3JpdGVTdHJpbmcoInwgTWVtYmVyIHwgV2FsbGV0IHwgUGFpZCB8IFNoYXJlIHwgQmFsYW5jZSB8XG58LS0tfC0tLXwtLS06fC0tLTp8LS0tOnxcbiIpCgl2YXIgZnJlZSBbXWludAoJZm9yIGksIG0gOj0gcmFuZ2UgZy5NZW1iZXJzIHsKCQl3IDo9ICLigJQiCgkJaWYgbS5BZGRyICE9ICIiIHsKCQkJdyA9ICJbIiArIHNob3J0KG0uQWRkcikgKyAiXSgiICsgaHViICsgIjp1LyIgKyBtLkFkZHIuU3RyaW5nKCkgKyAiKSIKCQl9IGVsc2UgewoJCQlmcmVlID0gYXBwZW5kKGZyZWUsIGkpCgkJfQoJCWIuV3JpdGVTdHJpbmcoInwgIiArIHNhbml0aXplLlRhYmxlQ2VsbChtLk5hbWUpICsgIiB8ICIgKyB3ICsgIiB8ICIgKyBnLm1vbmV5KG0uUGFpZCkgKyAiIHwgIiArCgkJCWcubW9uZXkobS5TaGFyZSkgKyAiIHwgKioiICsgZy5tb25leShtLkJhbCkgKyAiKiogfFxuIikKCX0KCWIuV3JpdGVTdHJpbmcoIlxuTWVtYmVycyB3aXRoIGEgd2FsbGV0IGNhbiBhZGQgYW5kIGNoYW5nZSBlbnRyaWVzLCBhbmQgZ2V0IG5vdGlmaWVkLiAiKQoJYi5Xcml0ZVN0cmluZygiVG8gdHVybiBub3RpZmljYXRpb25zIG9uLCBvcGVuIFtnbm90aWZdKGh0dHBzOi8vZ25vdGlmLnh5eikgd2l0aCB5b3VyIGFkZHJlc3MuXG5cbiIpCglpZiBnLk1vdmVkIHsKCQlyZXR1cm4gYi5TdHJpbmcoKQoJfQoJYi5Xcml0ZVN0cmluZygiIyMgQWRkIGEgbWVtYmVyXG5cbjxnbm8tZm9ybSBleGVjPVwiQWRkTWVtYmVyXCI+XG4iICsgZ3JvdXBGaWVsZChnKSkKCWIuV3JpdGVTdHJpbmcoaW5wdXQoIm5hbWUiLCAiTmFtZSIsICIiLCB0cnVlKSArIGlucHV0KCJhZGRyIiwgIlRoZWlyIGcxIGFkZHJlc3MsIGlmIHRoZXkgaGF2ZSBhIHdhbGxldCIsICIiLCBmYWxzZSkpCgliLldyaXRlU3RyaW5nKCI8L2duby1mb3JtPlxuXG4iKQoJaWYgbGVuKGZyZWUpID4gMCAmJiBsZW4oZy5NZW1iZXJzKSA+IDAgewoJCWIuV3JpdGVTdHJpbmcoIiMjIExpbmsgYSB3YWxsZXRcblxuQSBmcmllbmQgZ290IGEgd2FsbGV0OiBsaW5rIGl0IHRvIHRoZWlyIG5hbWUuIEEgbGlua2VkIHdhbGxldCBpcyBuZXZlciByZXBsYWNlZC5cblxuIikKCQliLldyaXRlU3RyaW5nKCI8Z25vLWZvcm0gZXhlYz1cIkxpbmtNZW1iZXJcIj5cbiIgKyBncm91cEZpZWxkKGcpKQoJCWZvciBrLCBpIDo9IHJhbmdlIGZyZWUgewoJCQliLldyaXRlU3RyaW5nKHNlbGVjdE9wdCgibmFtZSIsIGcuTWVtYmVyc1tpXS5OYW1lLCBmaXJzdChrLCAiTWVtYmVyIiksIGsgPT0gMCkpCgkJfQoJCWIuV3JpdGVTdHJpbmcoaW5wdXQoImFkZHIiLCAiVGhlaXIgZzEgYWRkcmVzcyIsICIiLCB0cnVlKSkKCQliLldyaXRlU3RyaW5nKCI8L2duby1mb3JtPlxuIikKCX0KCXJldHVybiBiLlN0cmluZygpCn0KCmZ1bmMgcmVuZGVyU3RhdHMoZyAqR3JvdXApIHN0cmluZyB7Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVTdHJpbmcoaGVhZGVyKGcsICJTdGF0cyIpKQoJdmFyIHRvdGFsIGludDY0Cglmb3IgXywgYyA6PSByYW5nZSBnLkJ5Q2F0IHsKCQl0b3RhbCArPSBjCgl9CglpZiB0b3RhbCA8PSAwIHsKCQliLldyaXRlU3RyaW5nKCJObyBleHBlbnNlIHlldC5cbiIpCgkJcmV0dXJuIGIuU3RyaW5nKCkKCX0KCWIuV3JpdGVTdHJpbmcoIiMjIEJ5IGNhdGVnb3J5XG5cbiIgKyBjYXRlZ29yeUJhcihnLkJ5Q2F0LCB0b3RhbCkgKyAiXG5cbiIpCgliLldyaXRlU3RyaW5nKCJ8IHwgQ2F0ZWdvcnkgfCBTcGVudCB8IFNoYXJlIHxcbnwtLS18LS0tfC0tLTp8LS0tOnxcbiIpCglmb3IgaSwgYyA6PSByYW5nZSBjYXRlZ29yaWVzIHsKCQlpZiBnLkJ5Q2F0W2ldID09IDAgewoJCQljb250aW51ZQoJCX0KCQliLldyaXRlU3RyaW5nKCJ8ICIgKyBzd2F0Y2goYy5Db2xvcikgKyAiIHwgIiArIGMuSWNvbiArICIgIiArIGMuTmFtZSArICIgfCAiICsgZy5tb25leShnLkJ5Q2F0W2ldKSArCgkJCSIgfCAiICsgcGVyY2VudChnLkJ5Q2F0W2ldLCB0b3RhbCkgKyAiIHxcbiIpCgl9CgliLldyaXRlU3RyaW5nKCJcbiMjIEJ5IG1lbWJlclxuXG5XaGF0IGVhY2ggb25lIHBhaWQsIGFuZCB3aGF0IHRoZWlyIHBhcnQgb2YgdGhlIGV4cGVuc2VzIGNhbWUgdG8uXG5cbiIpCgliLldyaXRlU3RyaW5nKCJ8IE1lbWJlciB8IFBhaWQgfCBTaGFyZSB8IE9mIGFsbCBwYWlkIHxcbnwtLS18LS0tOnwtLS06fC0tLTp8XG4iKQoJZm9yIF8sIG0gOj0gcmFuZ2UgZy5NZW1iZXJzIHsKCQliLldyaXRlU3RyaW5nKCJ8ICIgKyBzYW5pdGl6ZS5UYWJsZUNlbGwobS5OYW1lKSArICIgfCAiICsgZy5tb25leShtLlBhaWQpICsgIiB8ICIgKyBnLm1vbmV5KG0uU2hhcmUpICsKCQkJIiB8ICIgKyBwZXJjZW50KG0uUGFpZCwgZy5TcGVudCkgKyAiIHxcbiIpCgl9CglyZXR1cm4gYi5TdHJpbmcoKQp9CgpmdW5jIHJlbmRlckhpc3RvcnkoZyAqR3JvdXAsIHBhZ2UgaW50KSBzdHJpbmcgewoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlU3RyaW5nKGhlYWRlcihnLCAiSGlzdG9yeSIpKQoJbiA6PSBnLkVudHJpZXMuU2l6ZSgpCglwYWdlcyA6PSAobiArIHBhZ2VTaXplIC0gMSkgLyBwYWdlU2l6ZQoJaWYgbiA9PSAwIHx8IHBhZ2UgPiBwYWdlcyB7CgkJYi5Xcml0ZVN0cmluZygiTm90aGluZyBoZXJlLlxuIikKCQlyZXR1cm4gYi5TdHJpbmcoKQoJfQoJYi5Xcml0ZVN0cmluZyhlbnRyeVRhYmxlKGcsIChwYWdlLTEpKnBhZ2VTaXplLCBwYWdlU2l6ZSkgKyAiXG4iKQoJaWYgcGFnZSA+IDEgewoJCWIuV3JpdGVTdHJpbmcoIlvihpAgTmV3ZXJdKCIgKyBsaW5rKGcsICIvaGlzdG9yeS8iK2l0b2EocGFnZS0xKSkgKyAiKSAiKQoJfQoJaWYgcGFnZSA8IHBhZ2VzIHsKCQliLldyaXRlU3RyaW5nKCJbT2xkZXIg4oaSXSgiICsgbGluayhnLCAiL2hpc3RvcnkvIitpdG9hKHBhZ2UrMSkpICsgIikiKQoJfQoJYi5Xcml0ZVN0cmluZygiXG5cblBhZ2UgIiArIGl0b2EocGFnZSkgKyAiIG9mICIgKyBpdG9hKHBhZ2VzKSArICIgwrcgW0V4cG9ydCBhcyBDU1ZdKCIgKyBsaW5rKGcsICIvY3N2IikgKyAiKVxuIikKCXJldHVybiBiLlN0cmluZygpCn0KCmZ1bmMgcmVuZGVyRW50cnkoZyAqR3JvdXAsIGUgKkVudHJ5KSBzdHJpbmcgewoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlU3RyaW5nKGhlYWRlcihnLCAiRW50cnkiKSkKCWIuV3JpdGVTdHJpbmcoIiMjICIgKyBlbnRyeUljb24oZSkgKyAiICIgKyBzYW5pdGl6ZS5JbmxpbmVUZXh0KGUuVGl0bGUpICsgIlxuXG4iKQoJdG90YWwgOj0gYWJzKGUuVG90YWwpCgliLldyaXRlU3RyaW5nKCIqKiIgKyBnLm1vbmV5KHRvdGFsKSArICIqKiIpCglpZiBlLk5vdGUgIT0gIiIgewoJCWIuV3JpdGVTdHJpbmcoIiAoIiArIGUuTm90ZSArICIpIikKCX0KCWIuV3JpdGVTdHJpbmcoIiDCtyAiICsgdmVyYihlKSArICIgKioiICsgc2FuaXRpemUuSW5saW5lVGV4dChnLk1lbWJlcnNbZS5QYXllcl0uTmFtZSkgKyAiKiogwrcgIiArIGRhdGUoZS5BdCwgIk1vbiBKYW4gMiwgMjAwNiIpKQoJYi5Xcml0ZVN0cmluZygiXG5cblJlY29yZGVkIGJ5ICIgKyBlLkJ5LlN0cmluZygpICsgIlxuXG4iKQoJaWYgZS5LaW5kICE9IEtpbmRUcmFuc2ZlciB7CgkJYi5Xcml0ZVN0cmluZygifCBNZW1iZXIgfCBQYXJ0IHxcbnwtLS18LS0tOnxcbiIpCgkJZm9yIGksIG0gOj0gcmFuZ2UgZS5XaG8gewoJCQliLldyaXRlU3RyaW5nKCJ8ICIgKyBzYW5pdGl6ZS5UYWJsZUNlbGwoZy5NZW1iZXJzW21dLk5hbWUpICsgIiB8ICIgKyBnLm1vbmV5KGFicyhlLk93ZVtpXSkpICsgIiB8XG4iKQoJCX0KCQliLldyaXRlU3RyaW5nKCJcbiIpCgl9CglpZiBnLk1vdmVkIHsKCQlyZXR1cm4gYi5TdHJpbmcoKQoJfQoJYi5Xcml0ZVN0cmluZygiIyMgRGVsZXRlXG5cblJlbW92ZXMgdGhlIGVudHJ5IGFuZCB1bmRvZXMgaXQgb24gZXZlcnkgYmFsYW5jZS5cblxuIikKCWIuV3JpdGVTdHJpbmcoIjxnbm8tZm9ybSBleGVjPVwiRGVsZXRlXCI+XG4iICsgZ3JvdXBGaWVsZChnKSArIHJlYWRvbmx5KCJlbnRyeSIsICJFbnRyeSIsIGl0b2EoZS5JRCkpICsgIjwvZ25vLWZvcm0+XG4iKQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKLy8gZW50cnlUYWJsZSB3cml0ZXMgY291bnQgZW50cmllcywgbmV3ZXN0IGZpcnN0LCBmcm9tIG9mZnNldC4KZnVuYyBlbnRyeVRhYmxlKGcgKkdyb3VwLCBvZmZzZXQsIGNvdW50IGludCkgc3RyaW5nIHsKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZygifCBEYXRlIHwgV2hhdCB8IFBhaWQgYnkgfCBGb3IgfCBBbW91bnQgfFxufC0tLXwtLS18LS0tfC0tLXwtLS06fFxuIikKCWcuRW50cmllcy5SZXZlcnNlSXRlcmF0ZUJ5T2Zmc2V0KG9mZnNldCwgY291bnQsIGZ1bmMoXyBzdHJpbmcsIHYgYW55KSBib29sIHsKCQllIDo9IHYuKCpFbnRyeSkKCQl0aXRsZSA6PSAiWyIgKyBjZWxsVGV4dChlLlRpdGxlKSArICJdKCIgKyBsaW5rKGcsICIvZS8iK2l0b2EoZS5JRCkpICsgIikiCgkJYW1vdW50IDo9IGcubW9uZXkoYWJzKGUuVG90YWwpKQoJCWlmIGUuS2luZCA9PSBLaW5kSW5jb21lIHsKCQkJYW1vdW50ID0gIuKIkiIgKyBhbW91bnQKCQl9CgkJYi5Xcml0ZVN0cmluZygifCAiICsgZGF0ZShlLkF0LCAiSmFuIDIiKSArICIgfCAiICsgZW50cnlJY29uKGUpICsgIiAiICsgdGl0bGUgKyAiIHwgIiArCgkJCXNhbml0aXplLlRhYmxlQ2VsbChnLk1lbWJlcnNbZS5QYXllcl0uTmFtZSkgKyAiIHwgIiArIGZvcldob20oZywgZSkgKyAiIHwgIiArIGFtb3VudCArICIgfFxuIikKCQlyZXR1cm4gZmFsc2UKCX0pCglyZXR1cm4gYi5TdHJpbmcoKQp9CgpmdW5jIGhlYWRlcihnICpHcm91cCwgcGFnZSBzdHJpbmcpIHN0cmluZyB7Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWlmIHBhZ2UgPT0gIiIgewoJCWIuV3JpdGVTdHJpbmcoIiMgIiArIHNhbml0aXplLklubGluZVRleHQoZy5OYW1lKSArICJcblxuIikKCX0gZWxzZSB7CgkJYi5Xcml0ZVN0cmluZygiIyBbIiArIHNhbml0aXplLklubGluZVRleHQoZy5OYW1lKSArICJdKCIgKyBsaW5rKGcsICIiKSArICIpIMK3ICIgKyBwYWdlICsgIlxuXG4iKQoJfQoJYi5Xcml0ZVN0cmluZyhwbHVyYWwobGVuKGcuTWVtYmVycyksICJtZW1iZXIiKSArICIgwrcgKioiICsgZy5tb25leShnLlNwZW50KSArICIqKiBzcGVudCDCtyAiKQoJYi5Xcml0ZVN0cmluZygiW0FkZF0oIiArIGxpbmsoZywgIi9hZGQiKSArICIpIMK3IFtTZXR0bGUgdXBdKCIgKyBsaW5rKGcsICIvc2V0dGxlIikgKyAiKSDCtyBbTWVtYmVyc10oIiArCgkJbGluayhnLCAiL21lbWJlcnMiKSArICIpIMK3IFtTdGF0c10oIiArIGxpbmsoZywgIi9zdGF0cyIpICsgIikgwrcgW0hpc3RvcnldKCIgKyBsaW5rKGcsICIvaGlzdG9yeSIpICsgIilcblxuIikKCWlmIGcuTW92ZWQgewoJCWIuV3JpdGVTdHJpbmcoIj4gWyFXQVJOSU5HXSBUaGlzIGdyb3VwIG1vdmVkXG4+IEl0IGlzIGtlcHQgcmVhZC1vbmx5IGhlcmUuIEl0cyBuZXcgaG9tZSBpcyBbIiArIHN1Y2Nlc3NvciArICJdKCIgKwoJCQlzdHJpbmdzLlRyaW1QcmVmaXgoc3VjY2Vzc29yLCAiZ25vLmxhbmQiKSArICI6IiArIGl0b2EoZy5JRCkgKyAiKS5cblxuIikKCX0KCXJldHVybiBiLlN0cmluZygpCn0KCi8vIEV4cG9ydCB3cml0ZXMgYSBncm91cCBhcyBDU1Y6IGl0cyBtZW1iZXJzLCB0aGVuIGV2ZXJ5IGVudHJ5LCBvbGRlc3QgZmlyc3QuCi8vIE1vdmVPdXQgaGFuZHMgaXQgdG8gdGhlIHN1Y2Nlc3NvciwgYW5kIHRoZSAvY3N2IHBhZ2Ugc2hvd3MgaXQuCmZ1bmMgRXhwb3J0KGdyb3VwIHN0cmluZykgc3RyaW5nIHsKCWcgOj0gbXVzdEdyb3VwKGdyb3VwKQoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlU3RyaW5nKCJtZW1iZXIsYWRkcmVzcyxiYWxhbmNlLHBhaWQsc2hhcmVcbiIpCglmb3IgXywgbSA6PSByYW5nZSBnLk1lbWJlcnMgewoJCWIuV3JpdGVTdHJpbmcoY3N2KG0uTmFtZSkgKyAiLCIgKyBtLkFkZHIuU3RyaW5nKCkgKyAiLCIgKyBjZW50cyhtLkJhbCkgKyAiLCIgKyBjZW50cyhtLlBhaWQpICsgIiwiICsgY2VudHMobS5TaGFyZSkgKyAiXG4iKQoJfQoJYi5Xcml0ZVN0cmluZygiXG5lbnRyeSxraW5kLHRpbWUsdGl0bGUsY2F0ZWdvcnkscGF5ZXIsdG90YWwsbm90ZSxzcGxpdFxuIikKCWcuRW50cmllcy5JdGVyYXRlKCIiLCAiIiwgZnVuYyhfIHN0cmluZywgdiBhbnkpIGJvb2wgewoJCWUgOj0gdi4oKkVudHJ5KQoJCXNwbGl0IDo9IG1ha2UoW11zdHJpbmcsIGxlbihlLldobykpCgkJZm9yIGksIG0gOj0gcmFuZ2UgZS5XaG8gewoJCQlzcGxpdFtpXSA9IGcuTWVtYmVyc1ttXS5OYW1lICsgIjoiICsgY2VudHMoZS5Pd2VbaV0pCgkJfQoJCWIuV3JpdGVTdHJpbmcoaXRvYShlLklEKSArICIsIiArIFsuLi5dc3RyaW5neyJleHBlbnNlIiwgImluY29tZSIsICJ0cmFuc2ZlciJ9W2UuS2luZF0gKyAiLCIgKwoJCQlkYXRlKGUuQXQsICIyMDA2LTAxLTAyVDE1OjA0OjA1WiIpICsgIiwiICsgY3N2KGUuVGl0bGUpICsgIiwiICsgY2F0ZWdvcmllc1tlLkNhdF0uTmFtZSArICIsIiArCgkJCWNzdihnLk1lbWJlcnNbZS5QYXllcl0uTmFtZSkgKyAiLCIgKyBjZW50cyhlLlRvdGFsKSArICIsIiArIGNzdihlLk5vdGUpICsgIiwiICsgY3N2KHN0cmluZ3MuSm9pbihzcGxpdCwgIjsiKSkgKyAiXG4iKQoJCXJldHVybiBmYWxzZQoJfSkKCXJldHVybiBiLlN0cmluZygpCn0KCi8vIEZvcm0gZmllbGRzLiBFdmVyeSB2YWx1ZSBpcyBlc2NhcGVkIGZvciB0aGUgYXR0cmlidXRlIGl0IGxhbmRzIGluOyBhIGZvcm0ncwovLyBmaWVsZHMgYXJlIGluIHRoZSBvcmRlciBvZiBpdHMgZnVuY3Rpb24ncyBwYXJhbWV0ZXJzLCBzaW5jZSBnbm93ZWIgcGFzc2VzCi8vIHRoZW0gYnkgcG9zaXRpb24uCgpmdW5jIGlucHV0KG5hbWUsIHBsYWNlaG9sZGVyLCB2YWx1ZSBzdHJpbmcsIHJlcXVpcmVkIGJvb2wpIHN0cmluZyB7CglzIDo9IGA8Z25vLWlucHV0IG5hbWU9ImAgKyBuYW1lICsgYCIgcGxhY2Vob2xkZXI9ImAgKyBhdHRyKHBsYWNlaG9sZGVyKSArIGAiYAoJaWYgdmFsdWUgIT0gIiIgewoJCXMgKz0gYCB2YWx1ZT0iYCArIGF0dHIodmFsdWUpICsgYCJgCgl9CglpZiByZXF1aXJlZCB7CgkJcyArPSBgIHJlcXVpcmVkPSJ0cnVlImAKCX0KCXJldHVybiBzICsgIiAvPlxuIgp9CgpmdW5jIHJlYWRvbmx5KG5hbWUsIHBsYWNlaG9sZGVyLCB2YWx1ZSBzdHJpbmcpIHN0cmluZyB7CglyZXR1cm4gYDxnbm8taW5wdXQgbmFtZT0iYCArIG5hbWUgKyBgIiBwbGFjZWhvbGRlcj0iYCArIHBsYWNlaG9sZGVyICsgYCIgdmFsdWU9ImAgKyBhdHRyKHZhbHVlKSArIGAiIHJlYWRvbmx5PSJ0cnVlIiAvPmAgKyAiXG4iCn0KCmZ1bmMgZ3JvdXBGaWVsZChnICpHcm91cCkgc3RyaW5nIHsgcmV0dXJuIHJlYWRvbmx5KCJncm91cCIsICJHcm91cCIsIGl0b2EoZy5JRCkpIH0KCi8vIHNlbGVjdE9wdCBpcyBvbmUgb3B0aW9uIG9mIGEgc2VsZWN0OyBnbm93ZWIgcmVhZHMgdGhlIGRlc2NyaXB0aW9uIG9mZgovLyB0aGUgZmlyc3Qgb25lLCBzbyBvbmx5IHRoYXQgb25lIGNhcnJpZXMgaXQuCmZ1bmMgc2VsZWN0T3B0KG5hbWUsIHZhbHVlLCBkZXNjcmlwdGlvbiBzdHJpbmcsIHNlbGVjdGVkIGJvb2wpIHN0cmluZyB7CglzIDo9IGA8Z25vLXNlbGVjdCBuYW1lPSJgICsgbmFtZSArIGAiIHZhbHVlPSJgICsgYXR0cih2YWx1ZSkgKyBgImAKCWlmIGRlc2NyaXB0aW9uICE9ICIiIHsKCQlzICs9IGAgZGVzY3JpcHRpb249ImAgKyBhdHRyKGRlc2NyaXB0aW9uKSArIGAiYAoJfQoJaWYgc2VsZWN0ZWQgewoJCXMgKz0gYCBzZWxlY3RlZD0idHJ1ZSJgCgl9CglyZXR1cm4gcyArICIgLz5cbiIKfQoKZnVuYyBtZW1iZXJTZWxlY3QoZyAqR3JvdXAsIG5hbWUsIGRlc2NyaXB0aW9uIHN0cmluZywgc2VsZWN0ZWQgaW50KSBzdHJpbmcgewoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCglpZiBzZWxlY3RlZCA8IDAgewoJCXNlbGVjdGVkID0gMAoJfQoJZm9yIGksIG0gOj0gcmFuZ2UgZy5NZW1iZXJzIHsKCQliLldyaXRlU3RyaW5nKHNlbGVjdE9wdChuYW1lLCBtLk5hbWUsIGZpcnN0KGksIGRlc2NyaXB0aW9uKSwgaSA9PSBzZWxlY3RlZCkpCgl9CglyZXR1cm4gYi5TdHJpbmcoKQp9CgovLyBmaXJzdCBpcyBzIGZvciB0aGUgZmlyc3QgaXRlbSBvZiBhIGxpc3QsICIiIGFmdGVyLgpmdW5jIGZpcnN0KGkgaW50LCBzIHN0cmluZykgc3RyaW5nIHsKCWlmIGkgPT0gMCB7CgkJcmV0dXJuIHMKCX0KCXJldHVybiAiIgp9CgpmdW5jIG1lbWJlckNoZWNrcyhnICpHcm91cCwgbmFtZSwgZGVzY3JpcHRpb24gc3RyaW5nKSBzdHJpbmcgewoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCglmb3IgaSwgbSA6PSByYW5nZSBnLk1lbWJlcnMgewoJCXMgOj0gYDxnbm8taW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImAgKyBuYW1lICsgYCIgdmFsdWU9ImAgKyBhdHRyKG0uTmFtZSkgKyBgIiBjaGVja2VkPSJ0cnVlImAKCQlpZiBpID09IDAgewoJCQlzICs9IGAgZGVzY3JpcHRpb249ImAgKyBkZXNjcmlwdGlvbiArIGAiYAoJCX0KCQliLldyaXRlU3RyaW5nKHMgKyAiIC8+XG4iKQoJfQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKZnVuYyBjYXRlZ29yeVNlbGVjdCgpIHN0cmluZyB7Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWZvciBpLCBjIDo9IHJhbmdlIGNhdGVnb3JpZXMgewoJCWIuV3JpdGVTdHJpbmcoc2VsZWN0T3B0KCJjYXRlZ29yeSIsIGMuTmFtZSwgZmlyc3QoaSwgIkNhdGVnb3J5IiksIGkgPT0gbGVuKGNhdGVnb3JpZXMpLTEpKQoJfQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKLy8gUGljdHVyZXM6IHNtYWxsIFNWR3MgYXMgZGF0YSBVUklzLCB0aGUgb25lIGltYWdlIHNvdXJjZSBnbm93ZWIgYWx3YXlzIHNob3dzLgoKLy8gYmFsYW5jZUJhciBkcmF3cyBhIGJhbGFuY2UgYWdhaW5zdCB0aGUgbGFyZ2VzdCBvbmU6IHJpZ2h0IGFuZCB0ZWFsIHdoZW4gdGhlCi8vIGdyb3VwIG93ZXMgdGhlIG1lbWJlciwgbGVmdCBhbmQgb3JhbmdlIHdoZW4gdGhleSBvd2UuCmZ1bmMgYmFsYW5jZUJhcih2LCBtYXggaW50NjQpIHN0cmluZyB7Cgl3IDo9IDAKCWlmIG1heCA+IDAgewoJCXcgPSBpbnQoYWJzKHYpICogNTYgLyBtYXgpCgkJaWYgdyA9PSAwICYmIHYgIT0gMCB7CgkJCXcgPSAxCgkJfQoJfQoJeCwgY29sb3IgOj0gNjAsICIjMWE5ZThmIgoJaWYgdiA8IDAgewoJCXgsIGNvbG9yID0gNjAtdywgIiNlMDdiMzkiCgl9CglyZXR1cm4gc3ZnKDEyMCwgMTQsIGA8cmVjdCB4PSI1OS41IiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxNCIgZmlsbD0iIzhiOGY5OCIvPjxyZWN0IHg9ImAraXRvYSh4KSsKCQlgIiB5PSIyIiB3aWR0aD0iYCtpdG9hKHcpK2AiIGhlaWdodD0iMTAiIHJ4PSIyIiBmaWxsPSJgK2NvbG9yK2AiLz5gKQp9CgovLyBjYXRlZ29yeUJhciBpcyBvbmUgYmFyIHNwbGl0IGJ5IGNhdGVnb3J5LCBpbiB0aGUgdGFibGUncyBvcmRlci4KZnVuYyBjYXRlZ29yeUJhcihieUNhdCBbXWludDY0LCB0b3RhbCBpbnQ2NCkgc3RyaW5nIHsKCWNvbnN0IHcgPSA2MDAKCXZhciBzIHN0cmluZ3MuQnVpbGRlcgoJeCA6PSAwCglmb3IgaSwgYyA6PSByYW5nZSBieUNhdCB7CgkJaWYgYyA8PSAwIHsKCQkJY29udGludWUKCQl9CgkJY3cgOj0gaW50KGMgKiB3IC8gdG90YWwpCgkJaWYgeCtjdyA+IHcgewoJCQljdyA9IHcgLSB4CgkJfQoJCXMuV3JpdGVTdHJpbmcoYDxyZWN0IHg9ImAgKyBpdG9hKHgpICsgYCIgeT0iMCIgd2lkdGg9ImAgKyBpdG9hKGN3KSArIGAiIGhlaWdodD0iMjQiIGZpbGw9ImAgKyBjYXRlZ29yaWVzW2ldLkNvbG9yICsgYCIvPmApCgkJeCArPSBjdwoJfQoJcmV0dXJuIHN2Zyh3LCAyNCwgcy5TdHJpbmcoKSkKfQoKZnVuYyBzd2F0Y2goY29sb3Igc3RyaW5nKSBzdHJpbmcgewoJcmV0dXJuIHN2ZygxMiwgMTIsIGA8cmVjdCB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHJ4PSIzIiBmaWxsPSJgK2NvbG9yK2AiLz5gKQp9CgpmdW5jIHN2Zyh3LCBoIGludCwgYm9keSBzdHJpbmcpIHN0cmluZyB7Cglkb2MgOj0gYDxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iYCArIGl0b2EodykgKyBgIiBoZWlnaHQ9ImAgKyBpdG9hKGgpICsKCQlgIiB2aWV3Qm94PSIwIDAgYCArIGl0b2EodykgKyBgIGAgKyBpdG9hKGgpICsgYCI+YCArIGJvZHkgKyBgPC9zdmc+YAoJcmV0dXJuICIhW10oZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwiICsgYmFzZTY0LlN0ZEVuY29kaW5nLkVuY29kZVRvU3RyaW5nKFtdYnl0ZShkb2MpKSArICIpIgp9CgovLyBTbWFsbCBoZWxwZXJzLgoKZnVuYyBsaW5rKGcgKkdyb3VwLCBwYWdlIHN0cmluZykgc3RyaW5nIHsgcmV0dXJuIGh1YiArICI6IiArIGl0b2EoZy5JRCkgKyBwYWdlIH0KCmZ1bmMgZW50cnlJY29uKGUgKkVudHJ5KSBzdHJpbmcgewoJc3dpdGNoIGUuS2luZCB7CgljYXNlIEtpbmRJbmNvbWU6CgkJcmV0dXJuICLihqkiCgljYXNlIEtpbmRUcmFuc2ZlcjoKCQlyZXR1cm4gIuKHhCIKCX0KCXJldHVybiBjYXRlZ29yaWVzW2UuQ2F0XS5JY29uCn0KCmZ1bmMgdmVyYihlICpFbnRyeSkgc3RyaW5nIHsKCWlmIGUuS2luZCA9PSBLaW5kSW5jb21lIHsKCQlyZXR1cm4gInJlY2VpdmVkIGJ5IgoJfQoJcmV0dXJuICJwYWlkIGJ5Igp9CgpmdW5jIGZvcldob20oZyAqR3JvdXAsIGUgKkVudHJ5KSBzdHJpbmcgewoJaWYgZS5LaW5kID09IEtpbmRUcmFuc2ZlciB7CgkJcmV0dXJuIHNhbml0aXplLlRhYmxlQ2VsbChnLk1lbWJlcnNbZS5XaG9bMF1dLk5hbWUpCgl9CglpZiBsZW4oZS5XaG8pID09IGxlbihnLk1lbWJlcnMpIHsKCQlyZXR1cm4gImV2ZXJ5b25lIgoJfQoJdmFyIG5hbWVzIFtdc3RyaW5nCglmb3IgaSwgbSA6PSByYW5nZSBlLldobyB7CgkJaWYgaSA9PSAzIHsKCQkJcmV0dXJuIHNhbml0aXplLlRhYmxlQ2VsbChzdHJpbmdzLkpvaW4obmFtZXMsICIsICIpKSArICIgKyIgKyBpdG9hKGxlbihlLldobyktMykKCQl9CgkJbmFtZXMgPSBhcHBlbmQobmFtZXMsIGcuTWVtYmVyc1ttXS5OYW1lKQoJfQoJcmV0dXJuIHNhbml0aXplLlRhYmxlQ2VsbChzdHJpbmdzLkpvaW4obmFtZXMsICIsICIpKQp9CgpmdW5jIGRhdGUodW5peCBpbnQ2NCwgbGF5b3V0IHN0cmluZykgc3RyaW5nIHsgcmV0dXJuIHRpbWUuVW5peCh1bml4LCAwKS5VVEMoKS5Gb3JtYXQobGF5b3V0KSB9CgpmdW5jIHNob3J0KGEgYWRkcmVzcykgc3RyaW5nIHsKCXMgOj0gYS5TdHJpbmcoKQoJaWYgbGVuKHMpIDwgMTIgewoJCXJldHVybiBzCgl9CglyZXR1cm4gc1s6Nl0gKyAi4oCmIiArIHNbbGVuKHMpLTQ6XQp9CgpmdW5jIHBlcmNlbnQocGFydCwgd2hvbGUgaW50NjQpIHN0cmluZyB7CglpZiB3aG9sZSA8PSAwIHsKCQlyZXR1cm4gIuKAlCIKCX0KCXJldHVybiBzdHJjb252LkZvcm1hdEludCgocGFydCoxMDArd2hvbGUvMikvd2hvbGUsIDEwKSArICIlIgp9CgpmdW5jIHBsdXJhbChuIGludCwgd29yZCBzdHJpbmcpIHN0cmluZyB7CglpZiBuID09IDEgewoJCXJldHVybiAiMSAiICsgd29yZAoJfQoJaWYgc3RyaW5ncy5IYXNTdWZmaXgod29yZCwgInkiKSB7CgkJcmV0dXJuIGl0b2EobikgKyAiICIgKyB3b3JkWzpsZW4od29yZCktMV0gKyAiaWVzIgoJfQoJcmV0dXJuIGl0b2EobikgKyAiICIgKyB3b3JkICsgInMiCn0KCi8vIGNlbnRzIHdyaXRlcyBhbiBhbW91bnQgZm9yIENTVjogIjQyLjUwIiwgbm8gdGhvdXNhbmRzIHNlcGFyYXRvci4KZnVuYyBjZW50cyhjIGludDY0KSBzdHJpbmcgeyByZXR1cm4gc3RyaW5ncy5SZXBsYWNlQWxsKGxlZGdlci5Gb3JtYXQoYyksICIsIiwgIiIpIH0KCmZ1bmMgY3N2KHMgc3RyaW5nKSBzdHJpbmcgewoJaWYgIXN0cmluZ3MuQ29udGFpbnNBbnkocywgIixcIlxuOyIpIHsKCQlyZXR1cm4gcwoJfQoJcmV0dXJuIGAiYCArIHN0cmluZ3MuUmVwbGFjZUFsbChzLCBgImAsIGAiImApICsgYCJgCn0KCmZ1bmMgYXR0cihzIHN0cmluZykgc3RyaW5nIHsgcmV0dXJuIGh0bWwuRXNjYXBlU3RyaW5nKHMpIH0KCi8vIGNlbGxUZXh0IGlzIGxpbmsgdGV4dCBpbnNpZGUgYSB0YWJsZSBjZWxsOiBJbmxpbmVUZXh0IGxlYXZlcyAifCIgYWxvbmUsCi8vIGFuZCBhIGJhcmUgb25lIHdvdWxkIGVuZCB0aGUgY2VsbC4KZnVuYyBjZWxsVGV4dChzIHN0cmluZykgc3RyaW5nIHsgcmV0dXJuIHN0cmluZ3MuUmVwbGFjZUFsbChzYW5pdGl6ZS5JbmxpbmVUZXh0KHMpLCAifCIsIGBcfGApIH0KCmZ1bmMgYWJzKHYgaW50NjQpIGludDY0IHsKCWlmIHYgPCAwIHsKCQlyZXR1cm4gLXYKCX0KCXJldHVybiB2Cn0KCi8vIGF0b2kgaXMgYSBub24tbmVnYXRpdmUgbnVtYmVyLCAtMSBmb3IgYW55dGhpbmcgZWxzZS4KZnVuYyBhdG9pKHMgc3RyaW5nKSBpbnQgewoJbiwgZXJyIDo9IHN0cmNvbnYuQXRvaShzKQoJaWYgZXJyICE9IG5pbCB8fCBuIDwgMCB7CgkJcmV0dXJuIC0xCgl9CglyZXR1cm4gbgp9CiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbCINNTAwMDAwMDB1Z25vdBITCICI3r4BEgsyMDAwMDB1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQODmYOoM7roxe6X9z2FTkVfXrKLxsAR3fLmzEkH6pWc4xJA3xuT6CmgKudaG8qA0UFMw0847wFzLOlW7W/9IERIw1I+YluqjclqZEO18x7ANMLFka22uilQiThb0+QiSOTOTBooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ==