Transaction executed successfully

Transaction Details

Inspect execution, participants, message data, gas usage, events and raw transaction data.

Transaction hash
769EDB2BCC27B1E208E84236FF3ED0991A1C517D57C096D44FFEC983C6D7B672

Transaction overview

Status
Success
Execution completed
Block
#77262
Included in block
Message Type
m_addpkg
Primary message

Execution summary

TX INDEX
0
Position in block
GAS WANTED
201,757,638
Requested gas limit
GAS USED
168,131,415
Gas consumed
FEE
201758ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g1q5tjjv3kkslzwf2na9y9wk7e5a8ugph8xfsk04

Execution log

msg:0,success:true,log:,events:[]

Events

No events emitted by this transaction.

Raw encoded transaction

CtCJCAoML3ZtLm1fYWRkcGtnEr6JCAooZzFxNXRqanYza2tzbHp3ZjJuYTl5OXdrN2U1YTh1Z3BoOHhmc2swNBKQiQgKCWxhdW5jaHBhZBIcZ25vLmxhbmQvci9nbm9zd2FwL2xhdW5jaHBhZBrmJAoJUkVBRE1FLm1kEtgkIyBMYXVuY2hwYWQKClRva2VuIGRpc3RyaWJ1dGlvbiBwbGF0Zm9ybSBmb3IgbGF1bmNoaW5nIHByb2plY3RzIHdpdGggdGltZS1sb2NrZWQgR05TCmRlcG9zaXRzIGFuZCBwcm9qZWN0LXRva2VuIHJld2FyZHMuCgojIyBPdmVydmlldwoKVGhlIGxhdW5jaHBhZCBzdXBwb3J0cyBwcm9qZWN0cyB3aXRoIHRocmVlIGxvY2sgdGllcnM6IDMwLCA5MCwgYW5kIDE4MCBkYXlzLgpQcm9qZWN0IGNyZWF0b3JzIGNvbmZpZ3VyZSB0aGUgcHJvamVjdC10b2tlbiByZXdhcmQgYWxsb2NhdGlvbiBmb3IgZWFjaCB0aWVyLAphbmQgZGVwb3NpdG9ycyByZWNlaXZlIHJld2FyZHMgYWNjb3JkaW5nIHRvIHRoZSBzZWxlY3RlZCB0aWVyLgoKIyMgR25vd2ViCgpUaGUgcm9vdCBgUmVuZGVyKCIiKWAgZGVsZWdhdGVzIHRvIHRoZSBhY3RpdmUgaW1wbGVtZW50YXRpb24gYW5kIHNob3dzIHJlYWxtIGlkZW50aXR5LCBoYWx0IGZsYWdzLCBwcm9qZWN0LWNyZWF0aW9uIHJvbGVzLCBzdG9yZWQgcmVjb3JkIGNvdW50cywgdGhlIGRlcG9zaXQgSUQgY291bnRlciwgdG90YWwgc3Rha2VkIEdOUywgYW5kIHRpbWluZyBhbmQgZGVwb3NpdCByZXF1aXJlbWVudHMuIERlcG9zaXQgcmVjb3JkcyBpbmNsdWRlIHdpdGhkcmF3biBkZXBvc2l0cy4KCkdOUyBhbW91bnRzIHVzZSBzaXgtZGVjaW1hbCBiYXNlIHVuaXRzOyBwcm9qZWN0IHJld2FyZHMgdXNlIHRoZWlyIHRva2VuJ3MgYmFzZSB1bml0cy4gUmVuZGVyaW5nIHJlYWRzIHN0b3JlZCBjb3VudHMgYW5kIGZpeGVkIGNvbmZpZ3VyYXRpb24gd2l0aG91dCB0cmF2ZXJzaW5nIHByb2plY3RzIG9yIGRlcG9zaXRzLiBVbnN1cHBvcnRlZCBwYXRocyByZXR1cm4gYDQwNGAuCgojIyBDb25maWd1cmF0aW9uCgotICoqUG9vbCBUaWVycyoqOiAzMCBkYXlzLCA5MCBkYXlzLCBhbmQgMTgwIGRheXMKLSAqKk1pbmltdW0gU3RhcnQgRGVsYXkqKjogMyBkYXlzIGZyb20gcHJvamVjdCBjcmVhdGlvbgotICoqTWluaW11bSBEZXBvc2l0Kio6IDEgR05TICgxLDAwMCwwMDAgYmFzZSB1bml0cykgYW5kIGludGVnZXIgbXVsdGlwbGVzIG9mIHRoYXQgYW1vdW50Ci0gKipSZXdhcmQgQ2xhaW0gRGVsYXkqKjogMSBkYXkgYWZ0ZXIgZWFjaCBkZXBvc2l0LCBjYXBwZWQgYXQgdGhlIHNlbGVjdGVkIHRpZXIncyBlbmQgdGltZQotICoqQ29uZGl0aW9uIERlbGltaXRlcioqOiBVc2UgYCpQQUQqYCBiZXR3ZWVuIGNvbmRpdGlvbiBleHByZXNzaW9ucwotICoqQXV0by1EZWxlZ2F0aW9uKio6IFByb2plY3QgZGVwb3NpdHMgY2FuIGJlIHJlZmxlY3RlZCBpbiBnb3Zlcm5hbmNlLXN0YWtlciBhY2NvdW50aW5nCgojIyBDb3JlIEZlYXR1cmVzCgotICoqUHJvamVjdCBDcmVhdGlvbioqOiBBZG1pbiBvciBnb3Zlcm5hbmNlIGNyZWF0ZXMgYSBwcm9qZWN0IGFuZCBpdHMgdGllcnMKLSAqKkdOUyBEZXBvc2l0cyoqOiBVc2VycyBkZXBvc2l0IEdOUyBpbnRvIGEgc2VsZWN0ZWQgcHJvamVjdCB0aWVyCi0gKipUaW1lLUxvY2tlZCBXaXRoZHJhd2FscyoqOiBBIGRlcG9zaXRvciBjYW4gd2l0aGRyYXcgdGhlIG9yaWdpbmFsIEdOUyBvbmx5IGFmdGVyIHRoZSB0aWVyIGVuZHMKLSAqKlByb2plY3QtVG9rZW4gUmV3YXJkcyoqOiBSZXdhcmRzIGFjY3J1ZSBvdmVyIHRoZSB0aWVyIGR1cmF0aW9uIGFuZCBjYW4gYmUgY2xhaW1lZCBhZnRlciB0aGUgY2xhaW0gZGVsYXkKLSAqKkFkbWluaXN0cmF0aXZlIFJlZnVuZCoqOiBBZG1pbiBjYW4gdHJhbnNmZXIgdGhlIHJlbWFpbmluZyByZWZ1bmRhYmxlIHByb2plY3QtdG9rZW4gYmFsYW5jZSBmcm9tIGFuIGVuZGVkIHByb2plY3QgdG8gYSBzdXBwbGllZCByZWNpcGllbnQ7IGFjdGl2ZSBkZXBvc2l0b3IgY2xhaW1zIHJlbWFpbiByZXNlcnZlZAoKIyMgS2V5IEZ1bmN0aW9ucwoKIyMjIGBDcmVhdGVQcm9qZWN0YAoKQ3JlYXRlcyBhIG5ldyBwcm9qZWN0IHdpdGggdG9rZW4gYWRkcmVzcywgcmV3YXJkIGFtb3VudCwgdGllciBjb25maWd1cmF0aW9uLAphbmQgb3B0aW9uYWwgYCpQQUQqYC1zZXBhcmF0ZWQgY29uZGl0aW9ucy4gT25seSBhZG1pbiBvciBnb3Zlcm5hbmNlIG1heSBjYWxsIGl0LgoKIyMjIGBEZXBvc2l0R25zYAoKRGVwb3NpdHMgR05TIGludG8gYSBwcm9qZWN0IHRpZXIuIFRoZSBkZXBvc2l0IGFtb3VudCBtdXN0IG1lZXQgdGhlIG1pbmltdW0gYW5kCm11bHRpcGxlIHJ1bGVzLgoKIyMjIGBDb2xsZWN0UmV3YXJkQnlEZXBvc2l0SWRgCgpDbGFpbXMgdGhlIHByb2plY3QtdG9rZW4gcmV3YXJkIGZvciBhIGRlcG9zaXQuIE9ubHkgdGhlIGRlcG9zaXQgb3duZXIgY2FuIGNhbGwKaXQsIGFuZCB0aGUgcmV3YXJkIGlzIGNsYWltYWJsZSBvbmUgZGF5IGFmdGVyIGRlcG9zaXQgY3JlYXRpb24sIGNhcHBlZCBieSB0aGUKdGllciBlbmQgdGltZS4KCiMjIyBgQ29sbGVjdERlcG9zaXRHbnNgCgpTZXR0bGVzIGFueSBjbGFpbWFibGUgcHJvamVjdC10b2tlbiByZXdhcmQgYW5kIHRoZW4gcmV0dXJucyB0aGUgb3JpZ2luYWwgR05TCmRlcG9zaXQuIE9ubHkgdGhlIGRlcG9zaXQgb3duZXIgY2FuIGNhbGwgaXQsIGFuZCB0aGUgY3VycmVudCB0aW1lIG11c3QgYmUKc3RyaWN0bHkgYWZ0ZXIgdGhlIHNlbGVjdGVkIHRpZXIncyBlbmQgdGltZS4KCiMjIyBgVHJhbnNmZXJMZWZ0RnJvbVByb2plY3RCeUFkbWluYAoKVHJhbnNmZXJzIHRoZSByZW1haW5pbmcgcmVmdW5kYWJsZSBwcm9qZWN0LXRva2VuIGJhbGFuY2UgZnJvbSBhbiBlbmRlZCBwcm9qZWN0CnRvIHRoZSBzdXBwbGllZCByZWNpcGllbnQuIE9ubHkgYWRtaW4gbWF5IGNhbGwgaXQ7IGFtb3VudHMgcmVzZXJ2ZWQgZm9yIGFjdGl2ZQpkZXBvc2l0b3IgY2xhaW1zIGFyZSBub3QgdHJhbnNmZXJyZWQuCgojIyBBcHByb3ZhbCBSZXF1aXJlbWVudHMKCi0gYERlcG9zaXRHbnNgIHB1bGxzIEdOUyBmcm9tIHRoZSBjYWxsZXIgaW50byB0aGUgbGF1bmNocGFkIHJlYWxtLCBzbyBhcHByb3ZlCiAgdGhlIGxhdW5jaHBhZCByZWFsbSBmb3IgYXQgbGVhc3QgdGhlIGRlcG9zaXQgYW1vdW50IGJlZm9yZSBjYWxsaW5nLgotIGBDb2xsZWN0UmV3YXJkQnlEZXBvc2l0SWRgIGFuZCBgQ29sbGVjdERlcG9zaXRHbnNgIHBheSBvdXQgdG8gdGhlIGNhbGxlciBhbmQKICByZXF1aXJlIG5vIGFwcHJvdmFsLgoKYGBgZ28KLy8gQXBwcm92ZSB0aGUgbGF1bmNocGFkIHJlYWxtIGJlZm9yZSBkZXBvc2l0aW5nCmxhdW5jaHBhZEFkZHJlc3MgOj0gYWNjZXNzLk11c3RHZXRBZGRyZXNzKHByYWJjLlJPTEVfTEFVTkNIUEFELlN0cmluZygpKQpnbnMuQXBwcm92ZShjcm9zcyhjdXIpLCBsYXVuY2hwYWRBZGRyZXNzLCAxMF8wMDBfMDAwKQpgYGAKCiMjIFVzYWdlCgpgYGBnbwovLyBDcmVhdGUgYSBwcm9qZWN0IChhZG1pbiBvciBnb3Zlcm5hbmNlOyBzdGFydCBtdXN0IGJlIGF0IGxlYXN0IDMgZGF5cyBhd2F5KQpwcm9qZWN0SUQgOj0gQ3JlYXRlUHJvamVjdCgKICAgIGNyb3NzKGN1ciksCiAgICAiRXhhbXBsZSBQcm9qZWN0IiwKICAgICJnbm8ubGFuZC9yL2RlbW8vcHJvamVjdHRva2VuIiwKICAgIHJlY2lwaWVudEFkZHIsCiAgICAxXzAwMF8wMDBfMDAwLAogICAgIiIsIC8vIG5vIGNvbmRpdGlvbiB0b2tlbnMKICAgICIiLCAvLyBubyBjb25kaXRpb24gYW1vdW50cwogICAgMTAsIC8vIDMwLWRheSB0aWVyIHJhdGlvCiAgICAyMCwgLy8gOTAtZGF5IHRpZXIgcmF0aW8KICAgIDcwLCAvLyAxODAtZGF5IHRpZXIgcmF0aW8KICAgIGZ1dHVyZVN0YXJ0VGltZXN0YW1wLAopCgovLyBEZXBvc2l0IEdOUyBpbnRvIGEgMzAtZGF5IHRpZXI7IHJlZmVycmVyIGlzIG9wdGlvbmFsCmRlcG9zaXRJRCA6PSBEZXBvc2l0R25zKGNyb3NzKGN1ciksIHByb2plY3RJRCsiOjMwIiwgMTBfMDAwXzAwMCwgIiIpCgovLyBDbGFpbSBhZnRlciB0aGUgb25lLWRheSBkZWxheQpDb2xsZWN0UmV3YXJkQnlEZXBvc2l0SWQoY3Jvc3MoY3VyKSwgZGVwb3NpdElEKQoKLy8gQWZ0ZXIgdGhlIHRpZXIgaGFzIGVuZGVkLCBzZXR0bGUgcmV3YXJkIGFuZCB3aXRoZHJhdyBwcmluY2lwYWwKQ29sbGVjdERlcG9zaXRHbnMoY3Jvc3MoY3VyKSwgZGVwb3NpdElEKQoKLy8gQWRtaW4gcmVmdW5kIG9mIHRoZSByZW1haW5pbmcgcHJvamVjdC10b2tlbiBiYWxhbmNlClRyYW5zZmVyTGVmdEZyb21Qcm9qZWN0QnlBZG1pbihjcm9zcyhjdXIpLCBwcm9qZWN0SUQsIHJlY2lwaWVudEFkZHIpCmBgYAoKIyMgU2VjdXJpdHkKCi0gQWRtaW4gb3IgZ292ZXJuYW5jZSBhdXRob3JpemF0aW9uIGlzIHJlcXVpcmVkIGZvciBwcm9qZWN0IGNyZWF0aW9uCi0gRGVwb3NpdHMgYXJlIGxvY2tlZCB1bnRpbCBzdHJpY3RseSBhZnRlciB0aGUgc2VsZWN0ZWQgdGllcidzIGVuZCB0aW1lCi0gUHJvamVjdC10b2tlbiByZXdhcmRzIGFyZSBjbGFpbWFibGUgb25seSBieSB0aGUgZGVwb3NpdCBvd25lciBhbmQgb25seSBhZnRlciB0aGUgb25lLWRheSBkZWxheQotIFdpdGhkcmF3YWwgc2V0dGxlcyBhbnkgY2xhaW1hYmxlIHByb2plY3QtdG9rZW4gcmV3YXJkIGJlZm9yZSByZXR1cm5pbmcgcHJpbmNpcGFsCi0gQWRtaW5pc3RyYXRpdmUgcmVmdW5kcyByZXF1aXJlIGFuIGVuZGVkIHByb2plY3QgYW5kIHByZXNlcnZlIGFjdGl2ZSBkZXBvc2l0b3IgY2xhaW1zCi0gQ29uZGl0aW9ucyBhcmUgZXZhbHVhdGVkIGZvciBlYWNoIGRlcG9zaXQgd2hlbiBjb25maWd1cmVkCi0gRGVwb3NpdG9yIGFuZCByZXdhcmQgcmVjaXBpZW50IGFkZHJlc3NlcyBhcmUgdmFsaWRhdGVkChr8BAoLY291bnRlci5nbm8S7ARwYWNrYWdlIGxhdW5jaHBhZAoKLy8gQ291bnRlciBtYW5hZ2VzIHVuaXF1ZSBpbmNyZW1lbnRpbmcgSURzLgp0eXBlIENvdW50ZXIgc3RydWN0IHsKCWlkIGludDY0Cn0KCi8vIE5ld0NvdW50ZXIgY3JlYXRlcyBhIG5ldyBDb3VudGVyIHN0YXJ0aW5nIGF0IHplcm8uCi8vCi8vIFJldHVybnM6Ci8vICAgLSBjb3VudGVyOiBjb3VudGVyIGluaXRpYWxpemVkIHdpdGggY3VycmVudCBJRCB6ZXJvLgpmdW5jIE5ld0NvdW50ZXIoKSAqQ291bnRlciB7CglyZXR1cm4gJkNvdW50ZXJ7CgkJaWQ6IDAsCgl9Cn0KCi8vIE5leHQgaW5jcmVtZW50cyB0aGUgY291bnRlciBhbmQgcmV0dXJucyB0aGUgbmV4dCB1bmlxdWUgSUQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpZDogaW5jcmVtZW50ZWQgY291bnRlciB2YWx1ZS4KZnVuYyAoYyAqQ291bnRlcikgTmV4dCgpIGludDY0IHsKCWMuaWQrKwoKCXJldHVybiBjLmlkCn0KCi8vIEdldCByZXR1cm5zIHRoZSBjdXJyZW50IGNvdW50ZXIgSUQgd2l0aG91dCBpbmNyZW1lbnRpbmcgaXQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpZDogY3VycmVudCBjb3VudGVyIHZhbHVlLgpmdW5jIChjICpDb3VudGVyKSBHZXQoKSBpbnQ2NCB7CglyZXR1cm4gYy5pZAp9ChqmRQoLZGVwb3NpdC5nbm8SlkVwYWNrYWdlIGxhdW5jaHBhZAoKLy8gRGVwb3NpdCByZXByZXNlbnRzIGEgZGVwb3NpdCBtYWRlIGJ5IGEgdXNlciBpbiBhIGxhdW5jaHBhZCBwcm9qZWN0LgovLwovLyBUaGlzIHN0cnVjdCBjb250YWlucyB0aGUgbmVjZXNzYXJ5IGRhdGEgYW5kIG1ldGhvZHMgdG8gbWFuYWdlIGFuZCBkaXN0cmlidXRlCi8vIHJld2FyZHMgZm9yIGEgc3BlY2lmaWMgZGVwb3NpdC4KLy8KLy8gRmllbGRzOgovLyAtIGRlcG9zaXRvciAoc3RkLkFkZHJlc3MpOiBUaGUgYWRkcmVzcyBvZiB0aGUgZGVwb3NpdG9yLgovLyAtIGlkIChzdHJpbmcpOiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBkZXBvc2l0LgovLyAtIHByb2plY3RJRCAoc3RyaW5nKTogVGhlIElEIG9mIHRoZSBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVwb3NpdC4KLy8gLSB0aWVyIChpbnQ2NCk6IFRoZSB0aWVyIGR1cmF0aW9uIG9mIHRoZSBkZXBvc2l0ICgzMCwgOTAsIG9yIDE4MCBkYXlzKS4KLy8gLSBkZXBvc2l0QW1vdW50IChpbnQ2NCk6IFRoZSBhbW91bnQgb2YgdGhlIGRlcG9zaXQuCi8vIC0gd2l0aGRyYXduSGVpZ2h0IChpbnQ2NCk6IFRoZSBoZWlnaHQgYXQgd2hpY2ggdGhlIGRlcG9zaXQgd2FzIHdpdGhkcmF3bi4KLy8gLSB3aXRoZHJhd25UaW1lIChpbnQ2NCk6IFRoZSBVbml4IHRpbWVzdGFtcCB3aGVuIHRoZSBkZXBvc2l0IHdhcyB3aXRoZHJhd24uCi8vIC0gY3JlYXRlZEhlaWdodCAoaW50NjQpOiBUaGUgYmxvY2sgaGVpZ2h0IGF0IHdoaWNoIHRoZSBkZXBvc2l0IHdhcyBjcmVhdGVkLgovLyAtIGNyZWF0ZWRBdCAoaW50NjQpOiBUaGUgVW5peCB0aW1lc3RhbXAgd2hlbiB0aGUgZGVwb3NpdCB3YXMgY3JlYXRlZC4KLy8gLSBlbmRUaW1lIChpbnQ2NCk6IFRoZSBVbml4IHRpbWVzdGFtcCB3aGVuIHRoZSBkZXBvc2l0IGVuZHMuCnR5cGUgRGVwb3NpdCBzdHJ1Y3QgewoJZGVwb3NpdG9yIGFkZHJlc3MKCglpZCAgICAgICAgICAgICAgc3RyaW5nCglwcm9qZWN0SUQgICAgICAgc3RyaW5nCgl0aWVyICAgICAgICAgICAgaW50NjQgLy8gMzAsIDkwLCAxODAgLy8gaW5zdGVhZCBvZiB0aWVySWQKCWRlcG9zaXRBbW91bnQgICBpbnQ2NAoJd2l0aGRyYXduSGVpZ2h0IGludDY0Cgl3aXRoZHJhd25UaW1lICAgaW50NjQKCWNyZWF0ZWRIZWlnaHQgICBpbnQ2NAoJY3JlYXRlZEF0ICAgICAgIGludDY0CgllbmRUaW1lICAgICAgICAgaW50NjQKfQoKLy8gSUQgcmV0dXJucyB0aGUgdW5pcXVlIGlkZW50aWZpZXIgc3RvcmVkIGZvciB0aGUgZGVwb3NpdC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGlkOiBkZXBvc2l0IGlkZW50aWZpZXIgdXNlZCB0byByZXRyaWV2ZSB0aGlzIGRlcG9zaXQgZnJvbSBsYXVuY2hwYWQgc3RhdGUuCmZ1bmMgKGQgRGVwb3NpdCkgSUQoKSBzdHJpbmcgewoJcmV0dXJuIGQuaWQKfQoKLy8gU2V0SUQgdXBkYXRlcyB0aGUgdW5pcXVlIGlkZW50aWZpZXIgc3RvcmVkIGZvciB0aGUgZGVwb3NpdC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGlkOiBuZXcgaWRlbnRpZmllciB0byBhc3NvY2lhdGUgd2l0aCB0aGUgZGVwb3NpdC4KZnVuYyAoZCAqRGVwb3NpdCkgU2V0SUQoaWQgc3RyaW5nKSB7CglkLmlkID0gaWQKfQoKLy8gUHJvamVjdElEIHJldHVybnMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIGxhdW5jaHBhZCBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVwb3NpdC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHByb2plY3RJRDogYXNzb2NpYXRlZCBsYXVuY2hwYWQgcHJvamVjdCBpZGVudGlmaWVyLgpmdW5jIChkIERlcG9zaXQpIFByb2plY3RJRCgpIHN0cmluZyB7CglyZXR1cm4gZC5wcm9qZWN0SUQKfQoKLy8gU2V0UHJvamVjdElEIHVwZGF0ZXMgdGhlIGxhdW5jaHBhZCBwcm9qZWN0IGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXBvc2l0LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvamVjdElEOiBpZGVudGlmaWVyIG9mIHRoZSBsYXVuY2hwYWQgcHJvamVjdCB0byBhc3NvY2lhdGUgd2l0aCB0aGUgZGVwb3NpdC4KZnVuYyAoZCAqRGVwb3NpdCkgU2V0UHJvamVjdElEKHByb2plY3RJRCBzdHJpbmcpIHsKCWQucHJvamVjdElEID0gcHJvamVjdElECn0KCi8vIFRpZXIgcmV0dXJucyB0aGUgZGVwb3NpdCdzIHRpZXIgZHVyYXRpb24uCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0aWVyOiB0aWVyIGR1cmF0aW9uIGluIGRheXM7IGxhdW5jaHBhZCB0aWVycyB1c2UgMzAsIDkwLCBvciAxODAuCmZ1bmMgKGQgRGVwb3NpdCkgVGllcigpIGludDY0IHsKCXJldHVybiBkLnRpZXIKfQoKLy8gU2V0VGllciB1cGRhdGVzIHRoZSB0aWVyIGR1cmF0aW9uIHJlY29yZGVkIGZvciB0aGUgZGVwb3NpdC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRpZXI6IHRpZXIgZHVyYXRpb24gaW4gZGF5czsgdmFsaWQgbGF1bmNocGFkIHRpZXJzIGFyZSAzMCwgOTAsIG9yIDE4MC4KZnVuYyAoZCAqRGVwb3NpdCkgU2V0VGllcih0aWVyIGludDY0KSB7CglkLnRpZXIgPSB0aWVyCn0KCi8vIERlcG9zaXRvciByZXR1cm5zIHRoZSBhZGRyZXNzIHRoYXQgbWFkZSB0aGUgZGVwb3NpdC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGRlcG9zaXRvcjogYWNjb3VudCBhZGRyZXNzIHJlY29yZGVkIGFzIHRoZSBkZXBvc2l0IG93bmVyLgpmdW5jIChkIERlcG9zaXQpIERlcG9zaXRvcigpIGFkZHJlc3MgewoJcmV0dXJuIGQuZGVwb3NpdG9yCn0KCi8vIFNldERlcG9zaXRvciB1cGRhdGVzIHRoZSBhY2NvdW50IGFkZHJlc3MgcmVjb3JkZWQgYXMgdGhlIGRlcG9zaXQgb3duZXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBkZXBvc2l0b3I6IGFjY291bnQgYWRkcmVzcyB0byByZWNvcmQgYXMgdGhlIGRlcG9zaXQgb3duZXIuCmZ1bmMgKGQgKkRlcG9zaXQpIFNldERlcG9zaXRvcihkZXBvc2l0b3IgYWRkcmVzcykgewoJZC5kZXBvc2l0b3IgPSBkZXBvc2l0b3IKfQoKLy8gRGVwb3NpdEFtb3VudCByZXR1cm5zIHRoZSBhbW91bnQgcmVjb3JkZWQgZm9yIHRoZSBkZXBvc2l0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gZGVwb3NpdEFtb3VudDogYW1vdW50IG9mIEdOUyBkZXBvc2l0ZWQgZm9yIHRoZSBhc3NvY2lhdGVkIHByb2plY3QuCmZ1bmMgKGQgRGVwb3NpdCkgRGVwb3NpdEFtb3VudCgpIGludDY0IHsKCXJldHVybiBkLmRlcG9zaXRBbW91bnQKfQoKLy8gU2V0RGVwb3NpdEFtb3VudCB1cGRhdGVzIHRoZSBhbW91bnQgcmVjb3JkZWQgZm9yIHRoZSBkZXBvc2l0LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gZGVwb3NpdEFtb3VudDogYW1vdW50IG9mIEdOUyB0byByZWNvcmQgYXMgZGVwb3NpdGVkIGZvciB0aGUgYXNzb2NpYXRlZCBwcm9qZWN0LgpmdW5jIChkICpEZXBvc2l0KSBTZXREZXBvc2l0QW1vdW50KGRlcG9zaXRBbW91bnQgaW50NjQpIHsKCWQuZGVwb3NpdEFtb3VudCA9IGRlcG9zaXRBbW91bnQKfQoKLy8gQ3JlYXRlZEhlaWdodCByZXR1cm5zIHRoZSBibG9jayBoZWlnaHQgYXQgd2hpY2ggdGhlIGRlcG9zaXQgd2FzIGNyZWF0ZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBjcmVhdGVkSGVpZ2h0OiBjcmVhdGlvbiBibG9jayBoZWlnaHQgc3RvcmVkIG9uIHRoZSBkZXBvc2l0LgpmdW5jIChkIERlcG9zaXQpIENyZWF0ZWRIZWlnaHQoKSBpbnQ2NCB7CglyZXR1cm4gZC5jcmVhdGVkSGVpZ2h0Cn0KCi8vIFNldENyZWF0ZWRIZWlnaHQgdXBkYXRlcyB0aGUgYmxvY2sgaGVpZ2h0IHJlY29yZGVkIGZvciBkZXBvc2l0IGNyZWF0aW9uLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3JlYXRlZEhlaWdodDogYmxvY2sgaGVpZ2h0IGF0IHdoaWNoIHRoZSBkZXBvc2l0IHdhcyBjcmVhdGVkLgpmdW5jIChkICpEZXBvc2l0KSBTZXRDcmVhdGVkSGVpZ2h0KGNyZWF0ZWRIZWlnaHQgaW50NjQpIHsKCWQuY3JlYXRlZEhlaWdodCA9IGNyZWF0ZWRIZWlnaHQKfQoKLy8gQ3JlYXRlZEF0IHJldHVybnMgdGhlIFVuaXggdGltZXN0YW1wIGF0IHdoaWNoIHRoZSBkZXBvc2l0IHdhcyBjcmVhdGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gY3JlYXRlZEF0OiBjcmVhdGlvbiB0aW1lc3RhbXAgaW4gVW5peCBzZWNvbmRzLgpmdW5jIChkIERlcG9zaXQpIENyZWF0ZWRBdCgpIGludDY0IHsKCXJldHVybiBkLmNyZWF0ZWRBdAp9CgovLyBTZXRDcmVhdGVkQXQgdXBkYXRlcyB0aGUgVW5peCB0aW1lc3RhbXAgcmVjb3JkZWQgZm9yIGRlcG9zaXQgY3JlYXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjcmVhdGVkQXQ6IGNyZWF0aW9uIHRpbWVzdGFtcCBpbiBVbml4IHNlY29uZHMuCmZ1bmMgKGQgKkRlcG9zaXQpIFNldENyZWF0ZWRBdChjcmVhdGVkQXQgaW50NjQpIHsKCWQuY3JlYXRlZEF0ID0gY3JlYXRlZEF0Cn0KCi8vIFdpdGhkcmF3blRpbWUgcmV0dXJucyB0aGUgVW5peCB0aW1lc3RhbXAgcmVjb3JkZWQgZm9yIHdpdGhkcmF3YWwuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB3aXRoZHJhd25UaW1lOiB3aXRoZHJhd2FsIHRpbWVzdGFtcCBpbiBVbml4IHNlY29uZHM7IHplcm8gYmVmb3JlIHdpdGhkcmF3YWwgaXMgcmVjb3JkZWQuCmZ1bmMgKGQgRGVwb3NpdCkgV2l0aGRyYXduVGltZSgpIGludDY0IHsKCXJldHVybiBkLndpdGhkcmF3blRpbWUKfQoKLy8gU2V0V2l0aGRyYXduVGltZSB1cGRhdGVzIHRoZSBVbml4IHRpbWVzdGFtcCByZWNvcmRlZCBmb3Igd2l0aGRyYXdhbC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHdpdGhkcmF3blRpbWU6IHdpdGhkcmF3YWwgdGltZXN0YW1wIGluIFVuaXggc2Vjb25kcy4KZnVuYyAoZCAqRGVwb3NpdCkgU2V0V2l0aGRyYXduVGltZSh3aXRoZHJhd25UaW1lIGludDY0KSB7CglkLndpdGhkcmF3blRpbWUgPSB3aXRoZHJhd25UaW1lCn0KCi8vIFdpdGhkcmF3bkhlaWdodCByZXR1cm5zIHRoZSBibG9jayBoZWlnaHQgcmVjb3JkZWQgZm9yIHdpdGhkcmF3YWwuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB3aXRoZHJhd25IZWlnaHQ6IHdpdGhkcmF3YWwgYmxvY2sgaGVpZ2h0OyB6ZXJvIGJlZm9yZSB3aXRoZHJhd2FsIGlzIHJlY29yZGVkLgpmdW5jIChkIERlcG9zaXQpIFdpdGhkcmF3bkhlaWdodCgpIGludDY0IHsKCXJldHVybiBkLndpdGhkcmF3bkhlaWdodAp9CgovLyBTZXRXaXRoZHJhd25IZWlnaHQgdXBkYXRlcyB0aGUgYmxvY2sgaGVpZ2h0IHJlY29yZGVkIGZvciB3aXRoZHJhd2FsLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gd2l0aGRyYXduSGVpZ2h0OiBibG9jayBoZWlnaHQgYXQgd2hpY2ggdGhlIGRlcG9zaXQgd2FzIHdpdGhkcmF3bi4KZnVuYyAoZCAqRGVwb3NpdCkgU2V0V2l0aGRyYXduSGVpZ2h0KHdpdGhkcmF3bkhlaWdodCBpbnQ2NCkgewoJZC53aXRoZHJhd25IZWlnaHQgPSB3aXRoZHJhd25IZWlnaHQKfQoKLy8gRW5kVGltZSByZXR1cm5zIHRoZSBVbml4IHRpbWVzdGFtcCBhdCB3aGljaCB0aGUgZGVwb3NpdCdzIHRpZXIgZW5kcy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVuZFRpbWU6IHRpZXIgZW5kIHRpbWVzdGFtcCBpbiBVbml4IHNlY29uZHMuCmZ1bmMgKGQgRGVwb3NpdCkgRW5kVGltZSgpIGludDY0IHsKCXJldHVybiBkLmVuZFRpbWUKfQoKLy8gU2V0RW5kVGltZSB1cGRhdGVzIHRoZSBVbml4IHRpbWVzdGFtcCBhdCB3aGljaCB0aGUgZGVwb3NpdCdzIHRpZXIgZW5kcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGVuZFRpbWU6IHRpZXIgZW5kIHRpbWVzdGFtcCBpbiBVbml4IHNlY29uZHMuCmZ1bmMgKGQgKkRlcG9zaXQpIFNldEVuZFRpbWUoZW5kVGltZSBpbnQ2NCkgewoJZC5lbmRUaW1lID0gZW5kVGltZQp9CgovLyBQcm9qZWN0VGllcklEIHJldHVybnMgdGhlIGNvbXBvc2l0ZSBpZGVudGlmaWVyIGZvciB0aGUgZGVwb3NpdCdzIHByb2plY3QgdGllci4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHByb2plY3RUaWVySUQ6IGlkZW50aWZpZXIgZm9ybWVkIGZyb20gdGhlIHByb2plY3QgSUQgYW5kIHRpZXIgZHVyYXRpb24uCmZ1bmMgKGQgRGVwb3NpdCkgUHJvamVjdFRpZXJJRCgpIHN0cmluZyB7CglyZXR1cm4gTWFrZVByb2plY3RUaWVySUQoZC5wcm9qZWN0SUQsIGQudGllcikKfQoKLy8gSXNEZXBvc2l0b3IgcmVwb3J0cyB3aGV0aGVyIGFuIGFkZHJlc3MgbWF0Y2hlcyB0aGUgZGVwb3NpdCBvd25lci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGFkZHJlc3M6IGFjY291bnQgYWRkcmVzcyB0byBjb21wYXJlIHdpdGggdGhlIHJlY29yZGVkIGRlcG9zaXRvci4KLy8KLy8gUmV0dXJuczoKLy8gICAtIG1hdGNoZXM6IHRydWUgd2hlbiB0aGUgc3VwcGxpZWQgYWRkcmVzcyBoYXMgdGhlIHNhbWUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGFzIHRoZSBkZXBvc2l0b3I7IGZhbHNlIG90aGVyd2lzZS4KZnVuYyAoZCBEZXBvc2l0KSBJc0RlcG9zaXRvcihhZGRyZXNzIGFkZHJlc3MpIGJvb2wgewoJcmV0dXJuIGQuZGVwb3NpdG9yLlN0cmluZygpID09IGFkZHJlc3MuU3RyaW5nKCkKfQoKLy8gSXNFbmRlZCByZXBvcnRzIHdoZXRoZXIgdGhlIGRlcG9zaXQncyB0aWVyIGVuZCB0aW1lIGlzIGJlZm9yZSB0aGUgc3VwcGxpZWQgdGltZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cnJlbnRUaW1lOiBjdXJyZW50IFVuaXggdGltZXN0YW1wIGluIHNlY29uZHMgdXNlZCBmb3IgdGhlIGVuZC10aW1lIGNvbXBhcmlzb24uCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlbmRlZDogdHJ1ZSB3aGVuIGVuZFRpbWUgaXMgc3RyaWN0bHkgbGVzcyB0aGFuIGN1cnJlbnRUaW1lOyBmYWxzZSBhdCBvciBiZWZvcmUgdGhlIGVuZCB0aW1lLgpmdW5jIChkIERlcG9zaXQpIElzRW5kZWQoY3VycmVudFRpbWUgaW50NjQpIGJvb2wgewoJcmV0dXJuIGQuZW5kVGltZSA8IGN1cnJlbnRUaW1lCn0KCi8vIElzV2l0aGRyYXduIHJlcG9ydHMgd2hldGhlciBib3RoIHdpdGhkcmF3YWwgbWFya2VycyBoYXZlIGJlZW4gcmVjb3JkZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB3aXRoZHJhd246IHRydWUgd2hlbiBib3RoIHdpdGhkcmF3bkhlaWdodCBhbmQgd2l0aGRyYXduVGltZSBhcmUgZ3JlYXRlciB0aGFuIHplcm87IGZhbHNlIHdoZW4gZWl0aGVyIG1hcmtlciBpcyB6ZXJvLgpmdW5jIChkIERlcG9zaXQpIElzV2l0aGRyYXduKCkgYm9vbCB7CglyZXR1cm4gZC53aXRoZHJhd25UaW1lID4gMCAmJiBkLndpdGhkcmF3bkhlaWdodCA+IDAKfQoKLy8gU2V0V2l0aGRyYXduIHJlY29yZHMgdGhlIGJsb2NrIGhlaWdodCBhbmQgVW5peCB0aW1lc3RhbXAgb2Ygd2l0aGRyYXdhbC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHdpdGhkcmF3bkhlaWdodDogYmxvY2sgaGVpZ2h0IGF0IHdoaWNoIHRoZSBkZXBvc2l0IHdhcyB3aXRoZHJhd24uCi8vICAgLSB3aXRoZHJhd25UaW1lOiB3aXRoZHJhd2FsIHRpbWVzdGFtcCBpbiBVbml4IHNlY29uZHMuCmZ1bmMgKGQgKkRlcG9zaXQpIFNldFdpdGhkcmF3bih3aXRoZHJhd25IZWlnaHQgaW50NjQsIHdpdGhkcmF3blRpbWUgaW50NjQpIHsKCWQud2l0aGRyYXduSGVpZ2h0ID0gd2l0aGRyYXduSGVpZ2h0CglkLndpdGhkcmF3blRpbWUgPSB3aXRoZHJhd25UaW1lCn0KCi8vIE1ha2VEZXBvc2l0IHJldHVybnMgYSBuZXcgRGVwb3NpdCB2YWx1ZSB3aXRoIHRoZSBnaXZlbiB2YWx1ZXMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBkZXBvc2l0SUQ6IHVuaXF1ZSBpZGVudGlmaWVyIHRvIGFzc2lnbiB0byB0aGUgbmV3IGRlcG9zaXQuCi8vICAgLSBwcm9qZWN0SUQ6IGxhdW5jaHBhZCBwcm9qZWN0IGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXBvc2l0LgovLyAgIC0gdGllcjogdGllciBkdXJhdGlvbiBpbiBkYXlzOyBsYXVuY2hwYWQgdGllcnMgdXNlIDMwLCA5MCwgb3IgMTgwLgovLyAgIC0gZGVwb3NpdG9yOiBhY2NvdW50IGFkZHJlc3MgbWFraW5nIHRoZSBkZXBvc2l0LgovLyAgIC0gZGVwb3NpdEFtb3VudDogYW1vdW50IG9mIEdOUyBkZXBvc2l0ZWQgZm9yIHRoZSBwcm9qZWN0LgovLyAgIC0gY3JlYXRlZEhlaWdodDogYmxvY2sgaGVpZ2h0IGF0IHdoaWNoIHRoZSBkZXBvc2l0IHdhcyBjcmVhdGVkLgovLyAgIC0gY3JlYXRlZFRpbWU6IGNyZWF0aW9uIHRpbWVzdGFtcCBpbiBVbml4IHNlY29uZHMuCi8vICAgLSBlbmRUaW1lOiB0aWVyIGVuZCB0aW1lc3RhbXAgaW4gVW5peCBzZWNvbmRzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZGVwb3NpdDogbmV3IERlcG9zaXQgcG9wdWxhdGVkIHdpdGggdGhlIHN1cHBsaWVkIGZpZWxkcyBhbmQgemVybyB3aXRoZHJhd2FsIG1hcmtlcnMuCmZ1bmMgTWFrZURlcG9zaXQoCglkZXBvc2l0SUQgc3RyaW5nLAoJcHJvamVjdElEIHN0cmluZywKCXRpZXIgaW50NjQsCglkZXBvc2l0b3IgYWRkcmVzcywKCWRlcG9zaXRBbW91bnQgaW50NjQsCgljcmVhdGVkSGVpZ2h0IGludDY0LAoJY3JlYXRlZFRpbWUgaW50NjQsCgllbmRUaW1lIGludDY0LAopIERlcG9zaXQgewoJcmV0dXJuIERlcG9zaXR7CgkJaWQ6ICAgICAgICAgICAgICBkZXBvc2l0SUQsCgkJcHJvamVjdElEOiAgICAgICBwcm9qZWN0SUQsCgkJdGllcjogICAgICAgICAgICB0aWVyLAoJCWRlcG9zaXRvcjogICAgICAgZGVwb3NpdG9yLAoJCWRlcG9zaXRBbW91bnQ6ICAgZGVwb3NpdEFtb3VudCwKCQl3aXRoZHJhd25IZWlnaHQ6IDAsCgkJY3JlYXRlZEhlaWdodDogICBjcmVhdGVkSGVpZ2h0LAoJCWNyZWF0ZWRBdDogICAgICAgY3JlYXRlZFRpbWUsCgkJZW5kVGltZTogICAgICAgICBlbmRUaW1lLAoJfQp9CgovLyBEZWZhdWx0RGVwb3NpdCByZXR1cm5zIHRoZSB6ZXJvIERlcG9zaXQgdmFsdWUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBkZXBvc2l0OiB6ZXJvLXZhbHVlZCBEZXBvc2l0IHdpdGggbm8gaWRlbnRpZmllciwgYW1vdW50cywgdGltZXN0YW1wcywgb3Igd2l0aGRyYXdhbCBtYXJrZXJzLgpmdW5jIERlZmF1bHREZXBvc2l0KCkgRGVwb3NpdCB7CglyZXR1cm4gRGVwb3NpdHt9Cn0KGh0KB2RvYy5nbm8SEnBhY2thZ2UgbGF1bmNocGFkChppCgplcnJvcnMuZ25vEltwYWNrYWdlIGxhdW5jaHBhZAoKY29uc3QgRXJyU3Bvb2ZlZFJlYWxtID0gInJsbSBkb2VzIG5vdCBtYXRjaCB0aGUgY3VycmVudCBjcm9zc2luZyBmcmFtZSIKGra6AQoKZ2V0dGVyLmdubxKmugFwYWNrYWdlIGxhdW5jaHBhZAoKaW1wb3J0ICgKCXUyNTYgImduby5sYW5kL3AvZ25vc3dhcC91aW50MjU2L3YxIgoJcm90cmVlICJnbm8ubGFuZC9wL250L2JwdHJlZS9yb3RyZWUvdjAiCikKCi8vIEdldFByb2plY3RzIHJldHVybnMgYSByZWFkLW9ubHkgdmlldyBvZiBldmVyeSBwcm9qZWN0LCBrZXllZCBieSBwcm9qZWN0IElELgovLyBDYWxsZXJzIHBhZ2luYXRlIGl0IHRoZW1zZWx2ZXMgdGhyb3VnaCBJdGVyYXRlQnlPZmZzZXQuIFJlYWRpbmcgYW4gZW50cnkKLy8geWllbGRzIGEgY2xvbmUsIHNvIHRoZSB2aWV3IGNhbm5vdCBtdXRhdGUgcmVhbG0gc3RhdGUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBwcm9qZWN0czogcmVhZC1vbmx5IHRyZWUga2V5ZWQgYnkgcHJvamVjdCBJRDsgcmVhZGluZyBhbiBlbnRyeSB5aWVsZHMgYSBjbG9uZS4KZnVuYyBHZXRQcm9qZWN0cygpICpyb3RyZWUuUmVhZE9ubHlUcmVlIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFByb2plY3RzKCkKfQoKLy8gR2V0UHJvamVjdE5hbWUgcmV0dXJucyB0aGUgbmFtZSBvZiBhIHByb2plY3QgYnkgaXRzIElELgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvamVjdElkOiB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgbGF1bmNocGFkIHByb2plY3QgdG8gaW5zcGVjdC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIG5hbWU6IHN0b3JlZCBwcm9qZWN0IG5hbWUuCi8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBwcm9qZWN0SWQgZG9lcyBub3QgaWRlbnRpZnkgYSBzdG9yZWQgcHJvamVjdC4KZnVuYyBHZXRQcm9qZWN0TmFtZShwcm9qZWN0SWQgc3RyaW5nKSAoc3RyaW5nLCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UHJvamVjdE5hbWUocHJvamVjdElkKQp9CgovLyBHZXRQcm9qZWN0VG9rZW5QYXRoIHJldHVybnMgdGhlIHRva2VuIHBhdGggb2YgYSBwcm9qZWN0IGJ5IGl0cyBJRC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHByb2plY3RJZDogdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGxhdW5jaHBhZCBwcm9qZWN0IHRvIGluc3BlY3QuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0b2tlblBhdGg6IHJld2FyZC10b2tlbiBjb250cmFjdCBwYXRoIGNvbmZpZ3VyZWQgZm9yIHRoZSBwcm9qZWN0LgovLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gcHJvamVjdElkIGRvZXMgbm90IGlkZW50aWZ5IGEgc3RvcmVkIHByb2plY3QuCmZ1bmMgR2V0UHJvamVjdFRva2VuUGF0aChwcm9qZWN0SWQgc3RyaW5nKSAoc3RyaW5nLCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UHJvamVjdFRva2VuUGF0aChwcm9qZWN0SWQpCn0KCi8vIEdldFByb2plY3REZXBvc2l0QW1vdW50IHJldHVybnMgdGhlIGRlcG9zaXQgYW1vdW50IG9mIGEgcHJvamVjdCBieSBpdHMgSUQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0SWQ6IHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBsYXVuY2hwYWQgcHJvamVjdCB0byBpbnNwZWN0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBwcm9qZWN0LXRva2VuIGFtb3VudCBpbml0aWFsbHkgYWxsb2NhdGVkIHRvIHRoZSBwcm9qZWN0LCBpbiB0b2tlbiBiYXNlIHVuaXRzLgovLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gcHJvamVjdElkIGRvZXMgbm90IGlkZW50aWZ5IGEgc3RvcmVkIHByb2plY3QuCmZ1bmMgR2V0UHJvamVjdERlcG9zaXRBbW91bnQocHJvamVjdElkIHN0cmluZykgKGludDY0LCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UHJvamVjdERlcG9zaXRBbW91bnQocHJvamVjdElkKQp9CgovLyBHZXRQcm9qZWN0UmVjaXBpZW50IHJldHVybnMgdGhlIHJlY2lwaWVudCBhZGRyZXNzIG9mIGEgcHJvamVjdCBieSBpdHMgSUQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0SWQ6IHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBsYXVuY2hwYWQgcHJvamVjdCB0byBpbnNwZWN0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVjaXBpZW50OiBhZGRyZXNzIGNvbmZpZ3VyZWQgdG8gcmVjZWl2ZSB0aGUgcHJvamVjdCdzIGxhdW5jaHBhZCBwcm9jZWVkcy4KLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHByb2plY3RJZCBkb2VzIG5vdCBpZGVudGlmeSBhIHN0b3JlZCBwcm9qZWN0LgpmdW5jIEdldFByb2plY3RSZWNpcGllbnQocHJvamVjdElkIHN0cmluZykgKGFkZHJlc3MsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRQcm9qZWN0UmVjaXBpZW50KHByb2plY3RJZCkKfQoKLy8gR2V0UHJvamVjdENvbmRpdGlvbiByZXRyaWV2ZXMgYSBzcGVjaWZpYyBjb25kaXRpb24gb2YgYSBwcm9qZWN0LgovLyBSZXR1cm5zIGEgY2xvbmVkIGNvbmRpdGlvbiB0byBwcmV2ZW50IGV4dGVybmFsIG1vZGlmaWNhdGlvbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHByb2plY3RJZDogdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHByb2plY3QgY29udGFpbmluZyB0aGUgY29uZGl0aW9uLgovLyAgIC0gdG9rZW5QYXRoOiB0b2tlbiBjb250cmFjdCBwYXRoIHVzZWQgYXMgdGhlIGNvbmRpdGlvbiBrZXkuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBjb25kaXRpb246IGNsb25lZCBjb25kaXRpb24gZm9yIHRoZSByZXF1ZXN0ZWQgdG9rZW47IG5pbCB3aGVuIHRoZSBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG5vIGNvbmRpdGlvbiB3aXRob3V0IGFuIGVycm9yLgovLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gdGhlIHByb2plY3Qgb3IgY29uZGl0aW9uIGNhbm5vdCBiZSBmb3VuZC4KZnVuYyBHZXRQcm9qZWN0Q29uZGl0aW9uKHByb2plY3RJZCBzdHJpbmcsIHRva2VuUGF0aCBzdHJpbmcpICgqUHJvamVjdENvbmRpdGlvbiwgZXJyb3IpIHsKCWNvbmRpdGlvbiwgZXJyIDo9IGdldEltcGxlbWVudGF0aW9uKCkuR2V0UHJvamVjdENvbmRpdGlvbihwcm9qZWN0SWQsIHRva2VuUGF0aCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIGVycgoJfQoJaWYgY29uZGl0aW9uID09IG5pbCB7CgkJcmV0dXJuIG5pbCwgbmlsCgl9CglyZXR1cm4gY29uZGl0aW9uLkNsb25lKCksIG5pbAp9CgovLyBHZXRQcm9qZWN0VGllcnNSYXRpb3MgcmV0dXJucyB0aGUgdGllcnMgcmF0aW9zIG1hcCBvZiBhIHByb2plY3QgYnkgaXRzIElELgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvamVjdElkOiB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgbGF1bmNocGFkIHByb2plY3QgdG8gaW5zcGVjdC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRpZXJzUmF0aW9zOiBjbG9uZWQgbWFwIGZyb20gdGllciBkdXJhdGlvbiB0byBpdHMgYWxsb2NhdGlvbiByYXRpby4KLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHByb2plY3RJZCBkb2VzIG5vdCBpZGVudGlmeSBhIHN0b3JlZCBwcm9qZWN0LgpmdW5jIEdldFByb2plY3RUaWVyc1JhdGlvcyhwcm9qZWN0SWQgc3RyaW5nKSAobWFwW2ludDY0XWludDY0LCBlcnJvcikgewoJdGllcnNSYXRpb3MsIGVyciA6PSBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFByb2plY3RUaWVyc1JhdGlvcyhwcm9qZWN0SWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBlcnIKCX0KCXJldHVybiBjbG9uZUludDY0TWFwKHRpZXJzUmF0aW9zKSwgbmlsCn0KCi8vIEdldFByb2plY3RDcmVhdGVkSGVpZ2h0IHJldHVybnMgdGhlIGNyZWF0ZWQgaGVpZ2h0IG9mIGEgcHJvamVjdCBieSBpdHMgSUQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0SWQ6IHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBsYXVuY2hwYWQgcHJvamVjdCB0byBpbnNwZWN0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gaGVpZ2h0OiBibG9jayBoZWlnaHQgYXQgd2hpY2ggdGhlIHByb2plY3Qgd2FzIGNyZWF0ZWQuCi8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBwcm9qZWN0SWQgZG9lcyBub3QgaWRlbnRpZnkgYSBzdG9yZWQgcHJvamVjdC4KZnVuYyBHZXRQcm9qZWN0Q3JlYXRlZEhlaWdodChwcm9qZWN0SWQgc3RyaW5nKSAoaW50NjQsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRQcm9qZWN0Q3JlYXRlZEhlaWdodChwcm9qZWN0SWQpCn0KCi8vIEdldFByb2plY3RDcmVhdGVkQXQgcmV0dXJucyB0aGUgY3JlYXRlZCB0aW1lIG9mIGEgcHJvamVjdCBieSBpdHMgSUQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0SWQ6IHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBsYXVuY2hwYWQgcHJvamVjdCB0byBpbnNwZWN0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gY3JlYXRlZEF0OiBVbml4IHRpbWVzdGFtcCBpbiBzZWNvbmRzIGF0IHdoaWNoIHRoZSBwcm9qZWN0IHdhcyBjcmVhdGVkLgovLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gcHJvamVjdElkIGRvZXMgbm90IGlkZW50aWZ5IGEgc3RvcmVkIHByb2plY3QuCmZ1bmMgR2V0UHJvamVjdENyZWF0ZWRBdChwcm9qZWN0SWQgc3RyaW5nKSAoaW50NjQsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRQcm9qZWN0Q3JlYXRlZEF0KHByb2plY3RJZCkKfQoKLy8gR2V0UHJvamVjdFRpZXIgcmV0cmlldmVzIGEgc3BlY2lmaWMgdGllciBvZiBhIHByb2plY3QuCi8vIFJldHVybnMgYSBjbG9uZWQgdGllciB0byBwcmV2ZW50IGV4dGVybmFsIG1vZGlmaWNhdGlvbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHByb2plY3RJZDogdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHByb2plY3QgY29udGFpbmluZyB0aGUgdGllci4KLy8gICAtIHRpZXI6IHRpZXIgZHVyYXRpb24ga2V5LCBzdWNoIGFzIDMwLCA5MCwgb3IgMTgwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcHJvamVjdFRpZXI6IGNsb25lZCBwcm9qZWN0IHRpZXI7IG5pbCB3aGVuIHRoZSBpbXBsZW1lbnRhdGlvbiBzdXBwbGllcyBubyB0aWVyIHdpdGhvdXQgYW4gZXJyb3IuCi8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiB0aGUgcHJvamVjdCBvciB0aWVyIGNhbm5vdCBiZSBmb3VuZC4KZnVuYyBHZXRQcm9qZWN0VGllcihwcm9qZWN0SWQgc3RyaW5nLCB0aWVyIGludDY0KSAoKlByb2plY3RUaWVyLCBlcnJvcikgewoJcHJvamVjdFRpZXIsIGVyciA6PSBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFByb2plY3RUaWVyKHByb2plY3RJZCwgdGllcikKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIGVycgoJfQoJaWYgcHJvamVjdFRpZXIgPT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBuaWwKCX0KCXJldHVybiBwcm9qZWN0VGllci5DbG9uZSgpLCBuaWwKfQoKLy8gR2V0UHJvamVjdFRpZXJEaXN0cmlidXRlQW1vdW50UGVyU2Vjb25kWDEyOCByZXR1cm5zIHRoZSBkaXN0cmlidXRlIGFtb3VudCBwZXIgc2Vjb25kIChRMTI4KSBvZiBhIHByb2plY3QgdGllci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHByb2plY3RJZDogdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHByb2plY3QgY29udGFpbmluZyB0aGUgdGllci4KLy8gICAtIHRpZXI6IHRpZXIgZHVyYXRpb24ga2V5LCBzdWNoIGFzIDMwLCA5MCwgb3IgMTgwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50UGVyU2Vjb25kWDEyODogcHJvamVjdC10b2tlbiBkaXN0cmlidXRpb24gcmF0ZSBwZXIgc2Vjb25kIGluIFExMjggZml4ZWQtcG9pbnQgdW5pdHM7IG5pbCB3aGVuIG5vIHZhbHVlIGlzIGF2YWlsYWJsZS4KLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHRoZSBwcm9qZWN0IG9yIHRpZXIgY2Fubm90IGJlIGZvdW5kLgpmdW5jIEdldFByb2plY3RUaWVyRGlzdHJpYnV0ZUFtb3VudFBlclNlY29uZFgxMjgocHJvamVjdElkIHN0cmluZywgdGllciBpbnQ2NCkgKCp1MjU2LlVpbnQsIGVycm9yKSB7CglhbW91bnQsIGVyciA6PSBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFByb2plY3RUaWVyRGlzdHJpYnV0ZUFtb3VudFBlclNlY29uZFgxMjgocHJvamVjdElkLCB0aWVyKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIG5pbCwgZXJyCgl9CglpZiBhbW91bnQgPT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBuaWwKCX0KCXJldHVybiBhbW91bnQuQ2xvbmUoKSwgbmlsCn0KCi8vIEdldFByb2plY3RUaWVyVG90YWxEaXN0cmlidXRlQW1vdW50IHJldHVybnMgdGhlIHRvdGFsIGRpc3RyaWJ1dGUgYW1vdW50IG9mIGEgcHJvamVjdCB0aWVyLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvamVjdElkOiB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcHJvamVjdCBjb250YWluaW5nIHRoZSB0aWVyLgovLyAgIC0gdGllcjogdGllciBkdXJhdGlvbiBrZXksIHN1Y2ggYXMgMzAsIDkwLCBvciAxODAuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IHRvdGFsIHByb2plY3QtdG9rZW4gYWxsb2NhdGlvbiBmb3IgdGhlIHRpZXIsIGluIHRva2VuIGJhc2UgdW5pdHMuCi8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiB0aGUgcHJvamVjdCBvciB0aWVyIGNhbm5vdCBiZSBmb3VuZC4KZnVuYyBHZXRQcm9qZWN0VGllclRvdGFsRGlzdHJpYnV0ZUFtb3VudChwcm9qZWN0SWQgc3RyaW5nLCB0aWVyIGludDY0KSAoaW50NjQsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRQcm9qZWN0VGllclRvdGFsRGlzdHJpYnV0ZUFtb3VudChwcm9qZWN0SWQsIHRpZXIpCn0KCi8vIEdldFByb2plY3RUaWVyVG90YWxEZXBvc2l0QW1vdW50IHJldHVybnMgdGhlIHRvdGFsIGRlcG9zaXQgYW1vdW50IG9mIGEgcHJvamVjdCB0aWVyLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvamVjdElkOiB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcHJvamVjdCBjb250YWluaW5nIHRoZSB0aWVyLgovLyAgIC0gdGllcjogdGllciBkdXJhdGlvbiBrZXksIHN1Y2ggYXMgMzAsIDkwLCBvciAxODAuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IGN1bXVsYXRpdmUgR05TIHByaW5jaXBhbCBkZXBvc2l0ZWQgaW50byB0aGUgdGllciwgaW4gYmFzZSB1bml0cy4KLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHRoZSBwcm9qZWN0IG9yIHRpZXIgY2Fubm90IGJlIGZvdW5kLgpmdW5jIEdldFByb2plY3RUaWVyVG90YWxEZXBvc2l0QW1vdW50KHByb2plY3RJZCBzdHJpbmcsIHRpZXIgaW50NjQpIChpbnQ2NCwgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFByb2plY3RUaWVyVG90YWxEZXBvc2l0QW1vdW50KHByb2plY3RJZCwgdGllcikKfQoKLy8gR2V0UHJvamVjdFRpZXJUb3RhbFdpdGhkcmF3QW1vdW50IHJldHVybnMgdGhlIHRvdGFsIHdpdGhkcmF3IGFtb3VudCBvZiBhIHByb2plY3QgdGllci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHByb2plY3RJZDogdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHByb2plY3QgY29udGFpbmluZyB0aGUgdGllci4KLy8gICAtIHRpZXI6IHRpZXIgZHVyYXRpb24ga2V5LCBzdWNoIGFzIDMwLCA5MCwgb3IgMTgwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBjdW11bGF0aXZlIEdOUyBwcmluY2lwYWwgd2l0aGRyYXduIGZyb20gdGhlIHRpZXIsIGluIGJhc2UgdW5pdHMuCi8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiB0aGUgcHJvamVjdCBvciB0aWVyIGNhbm5vdCBiZSBmb3VuZC4KZnVuYyBHZXRQcm9qZWN0VGllclRvdGFsV2l0aGRyYXdBbW91bnQocHJvamVjdElkIHN0cmluZywgdGllciBpbnQ2NCkgKGludDY0LCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UHJvamVjdFRpZXJUb3RhbFdpdGhkcmF3QW1vdW50KHByb2plY3RJZCwgdGllcikKfQoKLy8gR2V0UHJvamVjdFRpZXJUb3RhbERlcG9zaXRDb3VudCByZXR1cm5zIHRoZSB0b3RhbCBkZXBvc2l0IGNvdW50IG9mIGEgcHJvamVjdCB0aWVyLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvamVjdElkOiB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcHJvamVjdCBjb250YWluaW5nIHRoZSB0aWVyLgovLyAgIC0gdGllcjogdGllciBkdXJhdGlvbiBrZXksIHN1Y2ggYXMgMzAsIDkwLCBvciAxODAuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBjb3VudDogY3VtdWxhdGl2ZSBudW1iZXIgb2YgZGVwb3NpdHMgY3JlYXRlZCBpbiB0aGUgdGllci4KLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHRoZSBwcm9qZWN0IG9yIHRpZXIgY2Fubm90IGJlIGZvdW5kLgpmdW5jIEdldFByb2plY3RUaWVyVG90YWxEZXBvc2l0Q291bnQocHJvamVjdElkIHN0cmluZywgdGllciBpbnQ2NCkgKGludDY0LCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UHJvamVjdFRpZXJUb3RhbERlcG9zaXRDb3VudChwcm9qZWN0SWQsIHRpZXIpCn0KCi8vIEdldFByb2plY3RUaWVyVG90YWxXaXRoZHJhd0NvdW50IHJldHVybnMgdGhlIHRvdGFsIHdpdGhkcmF3IGNvdW50IG9mIGEgcHJvamVjdCB0aWVyLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvamVjdElkOiB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcHJvamVjdCBjb250YWluaW5nIHRoZSB0aWVyLgovLyAgIC0gdGllcjogdGllciBkdXJhdGlvbiBrZXksIHN1Y2ggYXMgMzAsIDkwLCBvciAxODAuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBjb3VudDogY3VtdWxhdGl2ZSBudW1iZXIgb2Ygd2l0aGRyYXdhbHMgY29tcGxldGVkIGluIHRoZSB0aWVyLgovLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gdGhlIHByb2plY3Qgb3IgdGllciBjYW5ub3QgYmUgZm91bmQuCmZ1bmMgR2V0UHJvamVjdFRpZXJUb3RhbFdpdGhkcmF3Q291bnQocHJvamVjdElkIHN0cmluZywgdGllciBpbnQ2NCkgKGludDY0LCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UHJvamVjdFRpZXJUb3RhbFdpdGhkcmF3Q291bnQocHJvamVjdElkLCB0aWVyKQp9CgovLyBHZXRQcm9qZWN0VGllclRvdGFsQ29sbGVjdGVkQW1vdW50IHJldHVybnMgdGhlIHRvdGFsIGNvbGxlY3RlZCBhbW91bnQgb2YgYSBwcm9qZWN0IHRpZXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0SWQ6IHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBwcm9qZWN0IGNvbnRhaW5pbmcgdGhlIHRpZXIuCi8vICAgLSB0aWVyOiB0aWVyIGR1cmF0aW9uIGtleSwgc3VjaCBhcyAzMCwgOTAsIG9yIDE4MC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogY3VtdWxhdGl2ZSBwcm9qZWN0LXRva2VuIHJld2FyZCBjb2xsZWN0ZWQgZnJvbSB0aGUgdGllciwgaW4gdG9rZW4gYmFzZSB1bml0cy4KLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHRoZSBwcm9qZWN0IG9yIHRpZXIgY2Fubm90IGJlIGZvdW5kLgpmdW5jIEdldFByb2plY3RUaWVyVG90YWxDb2xsZWN0ZWRBbW91bnQocHJvamVjdElkIHN0cmluZywgdGllciBpbnQ2NCkgKGludDY0LCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UHJvamVjdFRpZXJUb3RhbENvbGxlY3RlZEFtb3VudChwcm9qZWN0SWQsIHRpZXIpCn0KCi8vIEdldFByb2plY3RUaWVyU3RhcnRUaW1lIHJldHVybnMgdGhlIHN0YXJ0IHRpbWUgb2YgYSBwcm9qZWN0IHRpZXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0SWQ6IHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBwcm9qZWN0IGNvbnRhaW5pbmcgdGhlIHRpZXIuCi8vICAgLSB0aWVyOiB0aWVyIGR1cmF0aW9uIGtleSwgc3VjaCBhcyAzMCwgOTAsIG9yIDE4MC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHN0YXJ0VGltZTogdGllciBzdGFydCB0aW1lc3RhbXAgaW4gVW5peCBzZWNvbmRzLgovLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gdGhlIHByb2plY3Qgb3IgdGllciBjYW5ub3QgYmUgZm91bmQuCmZ1bmMgR2V0UHJvamVjdFRpZXJTdGFydFRpbWUocHJvamVjdElkIHN0cmluZywgdGllciBpbnQ2NCkgKGludDY0LCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UHJvamVjdFRpZXJTdGFydFRpbWUocHJvamVjdElkLCB0aWVyKQp9CgovLyBHZXRQcm9qZWN0VGllckVuZFRpbWUgcmV0dXJucyB0aGUgZW5kIHRpbWUgb2YgYSBwcm9qZWN0IHRpZXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0SWQ6IHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBwcm9qZWN0IGNvbnRhaW5pbmcgdGhlIHRpZXIuCi8vICAgLSB0aWVyOiB0aWVyIGR1cmF0aW9uIGtleSwgc3VjaCBhcyAzMCwgOTAsIG9yIDE4MC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVuZFRpbWU6IHRpZXIgZW5kIHRpbWVzdGFtcCBpbiBVbml4IHNlY29uZHMuCi8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiB0aGUgcHJvamVjdCBvciB0aWVyIGNhbm5vdCBiZSBmb3VuZC4KZnVuYyBHZXRQcm9qZWN0VGllckVuZFRpbWUocHJvamVjdElkIHN0cmluZywgdGllciBpbnQ2NCkgKGludDY0LCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UHJvamVjdFRpZXJFbmRUaW1lKHByb2plY3RJZCwgdGllcikKfQoKLy8gR2V0RGVwb3NpdENvdW50IHJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBkZXBvc2l0cy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGNvdW50OiBudW1iZXIgb2YgZGVwb3NpdCByZWNvcmRzIGN1cnJlbnRseSBzdG9yZWQuCmZ1bmMgR2V0RGVwb3NpdENvdW50KCkgaW50IHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldERlcG9zaXRDb3VudCgpCn0KCi8vIEdldEN1cnJlbnREZXBvc2l0SWQgcmV0dXJucyB0aGUgY3VycmVudCBkZXBvc2l0IGNvdW50ZXIgdmFsdWUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBkZXBvc2l0SWQ6IGN1cnJlbnQgZGVwb3NpdCBjb3VudGVyIHZhbHVlOyBpdCBpcyBub3QgaW5jcmVtZW50ZWQgYnkgdGhpcyByZWFkLgpmdW5jIEdldEN1cnJlbnREZXBvc2l0SWQoKSBpbnQ2NCB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRDdXJyZW50RGVwb3NpdElkKCkKfQoKLy8gR2V0UHJvamVjdFRpZXJSZXdhcmRzIHJldHVybnMgYSByZWFkLW9ubHkgdmlldyBvZiBhIHByb2plY3QgdGllcidzIHJld2FyZAovLyBzdGF0ZXMsIGtleWVkIGJ5IGRlcG9zaXQgSUQuIFJlYWRpbmcgYW4gZW50cnkgeWllbGRzIGEgY2xvbmUsIHNvIHRoZSB2aWV3Ci8vIGNhbm5vdCBtdXRhdGUgcmVhbG0gc3RhdGUuIG5pbCBpcyByZXR1cm5lZCB3aGVuIHRoZSBwcm9qZWN0IHRpZXIgZG9lcyBub3QKLy8gZXhpc3QuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0SWQ6IHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBwcm9qZWN0IGNvbnRhaW5pbmcgdGhlIHRpZXIuCi8vICAgLSB0aWVyOiB0aWVyIGR1cmF0aW9uIGtleSwgc3VjaCBhcyAzMCwgOTAsIG9yIDE4MC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHJld2FyZHM6IHJlYWQtb25seSB0cmVlIG9mIHJld2FyZCBzdGF0ZXMga2V5ZWQgYnkgZGVwb3NpdCBJRDsgbmlsIHdoZW4gdGhlIHRpZXIncyByZXdhcmQgbWFuYWdlciBpcyB1bmF2YWlsYWJsZS4KZnVuYyBHZXRQcm9qZWN0VGllclJld2FyZHMocHJvamVjdElkIHN0cmluZywgdGllciBpbnQ2NCkgKnJvdHJlZS5SZWFkT25seVRyZWUgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UHJvamVjdFRpZXJSZXdhcmRzKHByb2plY3RJZCwgdGllcikKfQoKLy8gR2V0RGVwb3NpdCByZXRyaWV2ZXMgYSBkZXBvc2l0IGJ5IGl0cyBJRC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGRlcG9zaXRJZDogdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGRlcG9zaXQgdG8gaW5zcGVjdC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGRlcG9zaXQ6IHN0b3JlZCBkZXBvc2l0IHZhbHVlLgovLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gZGVwb3NpdElkIGRvZXMgbm90IGlkZW50aWZ5IGEgc3RvcmVkIGRlcG9zaXQuCmZ1bmMgR2V0RGVwb3NpdChkZXBvc2l0SWQgc3RyaW5nKSAoRGVwb3NpdCwgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldERlcG9zaXQoZGVwb3NpdElkKQp9CgovLyBHZXREZXBvc2l0UHJvamVjdElEIHJldHVybnMgdGhlIHByb2plY3QgSUQgb2YgYSBkZXBvc2l0IGJ5IGl0cyBJRC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGRlcG9zaXRJZDogdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGRlcG9zaXQgdG8gaW5zcGVjdC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHByb2plY3RJZDogcHJvamVjdCBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVwb3NpdC4KLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIGRlcG9zaXRJZCBkb2VzIG5vdCBpZGVudGlmeSBhIHN0b3JlZCBkZXBvc2l0LgpmdW5jIEdldERlcG9zaXRQcm9qZWN0SUQoZGVwb3NpdElkIHN0cmluZykgKHN0cmluZywgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldERlcG9zaXRQcm9qZWN0SUQoZGVwb3NpdElkKQp9CgovLyBHZXREZXBvc2l0VGllciByZXR1cm5zIHRoZSB0aWVyIG9mIGEgZGVwb3NpdCBieSBpdHMgSUQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBkZXBvc2l0SWQ6IHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBkZXBvc2l0IHRvIGluc3BlY3QuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0aWVyOiB0aWVyIGR1cmF0aW9uIGtleSBzZWxlY3RlZCBieSB0aGUgZGVwb3NpdC4KLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIGRlcG9zaXRJZCBkb2VzIG5vdCBpZGVudGlmeSBhIHN0b3JlZCBkZXBvc2l0LgpmdW5jIEdldERlcG9zaXRUaWVyKGRlcG9zaXRJZCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldERlcG9zaXRUaWVyKGRlcG9zaXRJZCkKfQoKLy8gR2V0RGVwb3NpdFByb2plY3RUaWVySUQgcmV0dXJucyB0aGUgcHJvamVjdCB0aWVyIElEIG9mIGEgZGVwb3NpdCBieSBpdHMgSUQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBkZXBvc2l0SWQ6IHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBkZXBvc2l0IHRvIGluc3BlY3QuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBwcm9qZWN0VGllcklkOiBjb21wb3NpdGUgcHJvamVjdC10aWVyIGlkZW50aWZpZXIgZGVyaXZlZCBmcm9tIHRoZSBkZXBvc2l0J3MgcHJvamVjdCBhbmQgdGllci4KLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIGRlcG9zaXRJZCBkb2VzIG5vdCBpZGVudGlmeSBhIHN0b3JlZCBkZXBvc2l0LgpmdW5jIEdldERlcG9zaXRQcm9qZWN0VGllcklEKGRlcG9zaXRJZCBzdHJpbmcpIChzdHJpbmcsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXREZXBvc2l0UHJvamVjdFRpZXJJRChkZXBvc2l0SWQpCn0KCi8vIEdldERlcG9zaXRBbW91bnQgcmV0dXJucyB0aGUgZGVwb3NpdCBhbW91bnQgb2YgYSBkZXBvc2l0IGJ5IGl0cyBJRC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGRlcG9zaXRJZDogdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGRlcG9zaXQgdG8gaW5zcGVjdC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogR05TIHByaW5jaXBhbCBkZXBvc2l0ZWQsIGluIGJhc2UgdW5pdHMuCi8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBkZXBvc2l0SWQgZG9lcyBub3QgaWRlbnRpZnkgYSBzdG9yZWQgZGVwb3NpdC4KZnVuYyBHZXREZXBvc2l0QW1vdW50KGRlcG9zaXRJZCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldERlcG9zaXRBbW91bnQoZGVwb3NpdElkKQp9CgovLyBHZXREZXBvc2l0V2l0aGRyYXduSGVpZ2h0IHJldHVybnMgdGhlIHdpdGhkcmF3biBoZWlnaHQgb2YgYSBkZXBvc2l0IGJ5IGl0cyBJRC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGRlcG9zaXRJZDogdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGRlcG9zaXQgdG8gaW5zcGVjdC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGhlaWdodDogd2l0aGRyYXdhbCBibG9jayBoZWlnaHQ7IHplcm8gd2hlbiB0aGUgZGVwb3NpdCBoYXMgbm90IGJlZW4gd2l0aGRyYXduLgovLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gZGVwb3NpdElkIGRvZXMgbm90IGlkZW50aWZ5IGEgc3RvcmVkIGRlcG9zaXQuCmZ1bmMgR2V0RGVwb3NpdFdpdGhkcmF3bkhlaWdodChkZXBvc2l0SWQgc3RyaW5nKSAoaW50NjQsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXREZXBvc2l0V2l0aGRyYXduSGVpZ2h0KGRlcG9zaXRJZCkKfQoKLy8gR2V0RGVwb3NpdFdpdGhkcmF3blRpbWUgcmV0dXJucyB0aGUgd2l0aGRyYXduIHRpbWUgb2YgYSBkZXBvc2l0IGJ5IGl0cyBJRC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGRlcG9zaXRJZDogdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGRlcG9zaXQgdG8gaW5zcGVjdC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHdpdGhkcmF3bkF0OiB3aXRoZHJhd2FsIFVuaXggdGltZXN0YW1wIGluIHNlY29uZHM7IHplcm8gd2hlbiB0aGUgZGVwb3NpdCBoYXMgbm90IGJlZW4gd2l0aGRyYXduLgovLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gZGVwb3NpdElkIGRvZXMgbm90IGlkZW50aWZ5IGEgc3RvcmVkIGRlcG9zaXQuCmZ1bmMgR2V0RGVwb3NpdFdpdGhkcmF3blRpbWUoZGVwb3NpdElkIHN0cmluZykgKGludDY0LCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0RGVwb3NpdFdpdGhkcmF3blRpbWUoZGVwb3NpdElkKQp9CgovLyBHZXREZXBvc2l0Q3JlYXRlZEhlaWdodCByZXR1cm5zIHRoZSBjcmVhdGVkIGhlaWdodCBvZiBhIGRlcG9zaXQgYnkgaXRzIElELgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gZGVwb3NpdElkOiB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZGVwb3NpdCB0byBpbnNwZWN0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gaGVpZ2h0OiBjcmVhdGlvbiBibG9jayBoZWlnaHQgb2YgdGhlIGRlcG9zaXQuCi8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBkZXBvc2l0SWQgZG9lcyBub3QgaWRlbnRpZnkgYSBzdG9yZWQgZGVwb3NpdC4KZnVuYyBHZXREZXBvc2l0Q3JlYXRlZEhlaWdodChkZXBvc2l0SWQgc3RyaW5nKSAoaW50NjQsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXREZXBvc2l0Q3JlYXRlZEhlaWdodChkZXBvc2l0SWQpCn0KCi8vIEdldERlcG9zaXRDcmVhdGVkQXQgcmV0dXJucyB0aGUgY3JlYXRlZCB0aW1lIG9mIGEgZGVwb3NpdCBieSBpdHMgSUQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBkZXBvc2l0SWQ6IHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBkZXBvc2l0IHRvIGluc3BlY3QuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBjcmVhdGVkQXQ6IGRlcG9zaXQgY3JlYXRpb24gVW5peCB0aW1lc3RhbXAgaW4gc2Vjb25kcy4KLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIGRlcG9zaXRJZCBkb2VzIG5vdCBpZGVudGlmeSBhIHN0b3JlZCBkZXBvc2l0LgpmdW5jIEdldERlcG9zaXRDcmVhdGVkQXQoZGVwb3NpdElkIHN0cmluZykgKGludDY0LCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0RGVwb3NpdENyZWF0ZWRBdChkZXBvc2l0SWQpCn0KCi8vIEdldERlcG9zaXRFbmRUaW1lIHJldHVybnMgdGhlIGVuZCB0aW1lIG9mIGEgZGVwb3NpdCBieSBpdHMgSUQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBkZXBvc2l0SWQ6IHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBkZXBvc2l0IHRvIGluc3BlY3QuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlbmRUaW1lOiBkZXBvc2l0IGxvY2svZW5kIFVuaXggdGltZXN0YW1wIGluIHNlY29uZHMuCi8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBkZXBvc2l0SWQgZG9lcyBub3QgaWRlbnRpZnkgYSBzdG9yZWQgZGVwb3NpdC4KZnVuYyBHZXREZXBvc2l0RW5kVGltZShkZXBvc2l0SWQgc3RyaW5nKSAoaW50NjQsIGVycm9yKSB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXREZXBvc2l0RW5kVGltZShkZXBvc2l0SWQpCn0KCi8vIEdldFRvdGFsR05TU3Rha2VkQW1vdW50IHJldHVybnMgdGhlIHRvdGFsIGFtb3VudCBvZiBHTlMgY3VycmVudGx5IHN0YWtlZCBhY3Jvc3MgYWxsIGxhdW5jaHBhZCBkZXBvc2l0cy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogdG90YWwgR05TIHByaW5jaXBhbCBjdXJyZW50bHkgc3Rha2VkIGFjcm9zcyBsYXVuY2hwYWQgZGVwb3NpdHMsIGluIGJhc2UgdW5pdHMuCmZ1bmMgR2V0VG90YWxHTlNTdGFrZWRBbW91bnQoKSBpbnQ2NCB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRUb3RhbEdOU1N0YWtlZEFtb3VudCgpCn0KCi8vIEdldFByb2plY3RUaWVyUmV3YXJkTWFuYWdlckNvdW50IHJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiByZXdhcmQgbWFuYWdlcnMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBjb3VudDogbnVtYmVyIG9mIHByb2plY3QtdGllciByZXdhcmQgbWFuYWdlcnMgY3VycmVudGx5IHN0b3JlZC4KZnVuYyBHZXRQcm9qZWN0VGllclJld2FyZE1hbmFnZXJDb3VudCgpIGludCB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRQcm9qZWN0VGllclJld2FyZE1hbmFnZXJDb3VudCgpCn0KCi8vIEdldFByb2plY3RUaWVyUmV3YXJkTWFuYWdlciByZXRyaWV2ZXMgYSByZXdhcmQgbWFuYWdlciBieSBwcm9qZWN0IHRpZXIgSUQuCi8vIFJldHVybnMgYSBjbG9uZWQgcmV3YXJkIG1hbmFnZXIgdG8gcHJldmVudCBleHRlcm5hbCBtb2RpZmljYXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0VGllcklkOiBjb21wb3NpdGUgcHJvamVjdC10aWVyIGlkZW50aWZpZXIgd2hvc2UgbWFuYWdlciBpcyByZXF1ZXN0ZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSByZXdhcmRNYW5hZ2VyOiBjbG9uZWQgcmV3YXJkIG1hbmFnZXI7IG5pbCB3aGVuIHRoZSBpbXBsZW1lbnRhdGlvbiBzdXBwbGllcyBubyBtYW5hZ2VyIHdpdGhvdXQgYW4gZXJyb3IuCi8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBwcm9qZWN0VGllcklkIGRvZXMgbm90IGlkZW50aWZ5IGEgc3RvcmVkIHJld2FyZCBtYW5hZ2VyLgpmdW5jIEdldFByb2plY3RUaWVyUmV3YXJkTWFuYWdlcihwcm9qZWN0VGllcklkIHN0cmluZykgKCpSZXdhcmRNYW5hZ2VyLCBlcnJvcikgewoJcmV3YXJkTWFuYWdlciwgZXJyIDo9IGdldEltcGxlbWVudGF0aW9uKCkuR2V0UHJvamVjdFRpZXJSZXdhcmRNYW5hZ2VyKHByb2plY3RUaWVySWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBlcnIKCX0KCWlmIHJld2FyZE1hbmFnZXIgPT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBuaWwKCX0KCXJldHVybiByZXdhcmRNYW5hZ2VyLkNsb25lKCksIG5pbAp9CgovLyBHZXRQcm9qZWN0VGllclJld2FyZERpc3RyaWJ1dGVBbW91bnRQZXJTZWNvbmRYMTI4IHJldHVybnMgdGhlIGRpc3RyaWJ1dGUgYW1vdW50IHBlciBzZWNvbmQgKFExMjgpIG9mIGEgcmV3YXJkIG1hbmFnZXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0VGllcklkOiBjb21wb3NpdGUgcHJvamVjdC10aWVyIGlkZW50aWZpZXIgd2hvc2UgbWFuYWdlciBpcyByZXF1ZXN0ZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnRQZXJTZWNvbmRYMTI4OiByZXdhcmQgZGlzdHJpYnV0aW9uIHJhdGUgcGVyIHNlY29uZCBpbiBRMTI4IGZpeGVkLXBvaW50IHRva2VuIHVuaXRzOyBuaWwgd2hlbiBubyB2YWx1ZSBpcyBhdmFpbGFibGUuCi8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBwcm9qZWN0VGllcklkIGRvZXMgbm90IGlkZW50aWZ5IGEgc3RvcmVkIHJld2FyZCBtYW5hZ2VyLgpmdW5jIEdldFByb2plY3RUaWVyUmV3YXJkRGlzdHJpYnV0ZUFtb3VudFBlclNlY29uZFgxMjgocHJvamVjdFRpZXJJZCBzdHJpbmcpICgqdTI1Ni5VaW50LCBlcnJvcikgewoJYW1vdW50LCBlcnIgOj0gZ2V0SW1wbGVtZW50YXRpb24oKS5HZXRQcm9qZWN0VGllclJld2FyZERpc3RyaWJ1dGVBbW91bnRQZXJTZWNvbmRYMTI4KHByb2plY3RUaWVySWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBlcnIKCX0KCWlmIGFtb3VudCA9PSBuaWwgewoJCXJldHVybiBuaWwsIG5pbAoJfQoJcmV0dXJuIGFtb3VudC5DbG9uZSgpLCBuaWwKfQoKLy8gR2V0UHJvamVjdFRpZXJSZXdhcmRBY2N1bXVsYXRlZFJld2FyZFBlckRlcG9zaXRYMTI4IHJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHJld2FyZCBwZXIgZGVwb3NpdCAoUTEyOCkgb2YgYSByZXdhcmQgbWFuYWdlci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHByb2plY3RUaWVySWQ6IGNvbXBvc2l0ZSBwcm9qZWN0LXRpZXIgaWRlbnRpZmllciB3aG9zZSBtYW5hZ2VyIGlzIHJlcXVlc3RlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFjY3VtdWxhdGVkUmV3YXJkUGVyRGVwb3NpdFgxMjg6IGFjY3VtdWxhdGVkIHJld2FyZCBpbmRleCBwZXIgZGVwb3NpdGVkIEdOUyB1bml0IGluIFExMjggZml4ZWQtcG9pbnQgdW5pdHM7IG5pbCB3aGVuIG5vIHZhbHVlIGlzIGF2YWlsYWJsZS4KLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHByb2plY3RUaWVySWQgZG9lcyBub3QgaWRlbnRpZnkgYSBzdG9yZWQgcmV3YXJkIG1hbmFnZXIuCmZ1bmMgR2V0UHJvamVjdFRpZXJSZXdhcmRBY2N1bXVsYXRlZFJld2FyZFBlckRlcG9zaXRYMTI4KHByb2plY3RUaWVySWQgc3RyaW5nKSAoKnUyNTYuVWludCwgZXJyb3IpIHsKCWFtb3VudCwgZXJyIDo9IGdldEltcGxlbWVudGF0aW9uKCkuR2V0UHJvamVjdFRpZXJSZXdhcmRBY2N1bXVsYXRlZFJld2FyZFBlckRlcG9zaXRYMTI4KHByb2plY3RUaWVySWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBlcnIKCX0KCWlmIGFtb3VudCA9PSBuaWwgewoJCXJldHVybiBuaWwsIG5pbAoJfQoJcmV0dXJuIGFtb3VudC5DbG9uZSgpLCBuaWwKfQoKLy8gR2V0UHJvamVjdFRpZXJSZXdhcmRUb3RhbERpc3RyaWJ1dGVBbW91bnQgcmV0dXJucyB0aGUgdG90YWwgZGlzdHJpYnV0ZSBhbW91bnQgb2YgYSByZXdhcmQgbWFuYWdlci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHByb2plY3RUaWVySWQ6IGNvbXBvc2l0ZSBwcm9qZWN0LXRpZXIgaWRlbnRpZmllciB3aG9zZSBtYW5hZ2VyIGlzIHJlcXVlc3RlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogdG90YWwgcmV3YXJkIGFsbG9jYXRpb24gbWFuYWdlZCBmb3IgdGhlIHByb2plY3QgdGllciwgaW4gdG9rZW4gYmFzZSB1bml0cy4KLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHByb2plY3RUaWVySWQgZG9lcyBub3QgaWRlbnRpZnkgYSBzdG9yZWQgcmV3YXJkIG1hbmFnZXIuCmZ1bmMgR2V0UHJvamVjdFRpZXJSZXdhcmRUb3RhbERpc3RyaWJ1dGVBbW91bnQocHJvamVjdFRpZXJJZCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFByb2plY3RUaWVyUmV3YXJkVG90YWxEaXN0cmlidXRlQW1vdW50KHByb2plY3RUaWVySWQpCn0KCi8vIEdldFByb2plY3RUaWVyUmV3YXJkVG90YWxDbGFpbWVkQW1vdW50IHJldHVybnMgdGhlIHRvdGFsIGNsYWltZWQgYW1vdW50IG9mIGEgcmV3YXJkIG1hbmFnZXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0VGllcklkOiBjb21wb3NpdGUgcHJvamVjdC10aWVyIGlkZW50aWZpZXIgd2hvc2UgbWFuYWdlciBpcyByZXF1ZXN0ZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IHRvdGFsIHJld2FyZCBhbW91bnQgY2xhaW1lZCBmcm9tIHRoZSBtYW5hZ2VyLCBpbiB0b2tlbiBiYXNlIHVuaXRzLgovLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gcHJvamVjdFRpZXJJZCBkb2VzIG5vdCBpZGVudGlmeSBhIHN0b3JlZCByZXdhcmQgbWFuYWdlci4KZnVuYyBHZXRQcm9qZWN0VGllclJld2FyZFRvdGFsQ2xhaW1lZEFtb3VudChwcm9qZWN0VGllcklkIHN0cmluZykgKGludDY0LCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UHJvamVjdFRpZXJSZXdhcmRUb3RhbENsYWltZWRBbW91bnQocHJvamVjdFRpZXJJZCkKfQoKLy8gR2V0UHJvamVjdFRpZXJSZXdhcmREaXN0cmlidXRlU3RhcnRUaW1lIHJldHVybnMgdGhlIGRpc3RyaWJ1dGUgc3RhcnQgdGltZSBvZiBhIHJld2FyZCBtYW5hZ2VyLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvamVjdFRpZXJJZDogY29tcG9zaXRlIHByb2plY3QtdGllciBpZGVudGlmaWVyIHdob3NlIG1hbmFnZXIgaXMgcmVxdWVzdGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gc3RhcnRUaW1lOiByZXdhcmQgZGlzdHJpYnV0aW9uIHN0YXJ0IHRpbWVzdGFtcCBpbiBVbml4IHNlY29uZHMuCi8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBwcm9qZWN0VGllcklkIGRvZXMgbm90IGlkZW50aWZ5IGEgc3RvcmVkIHJld2FyZCBtYW5hZ2VyLgpmdW5jIEdldFByb2plY3RUaWVyUmV3YXJkRGlzdHJpYnV0ZVN0YXJ0VGltZShwcm9qZWN0VGllcklkIHN0cmluZykgKGludDY0LCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UHJvamVjdFRpZXJSZXdhcmREaXN0cmlidXRlU3RhcnRUaW1lKHByb2plY3RUaWVySWQpCn0KCi8vIEdldFByb2plY3RUaWVyUmV3YXJkRGlzdHJpYnV0ZUVuZFRpbWUgcmV0dXJucyB0aGUgZGlzdHJpYnV0ZSBlbmQgdGltZSBvZiBhIHJld2FyZCBtYW5hZ2VyLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvamVjdFRpZXJJZDogY29tcG9zaXRlIHByb2plY3QtdGllciBpZGVudGlmaWVyIHdob3NlIG1hbmFnZXIgaXMgcmVxdWVzdGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZW5kVGltZTogcmV3YXJkIGRpc3RyaWJ1dGlvbiBlbmQgdGltZXN0YW1wIGluIFVuaXggc2Vjb25kcy4KLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHByb2plY3RUaWVySWQgZG9lcyBub3QgaWRlbnRpZnkgYSBzdG9yZWQgcmV3YXJkIG1hbmFnZXIuCmZ1bmMgR2V0UHJvamVjdFRpZXJSZXdhcmREaXN0cmlidXRlRW5kVGltZShwcm9qZWN0VGllcklkIHN0cmluZykgKGludDY0LCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UHJvamVjdFRpZXJSZXdhcmREaXN0cmlidXRlRW5kVGltZShwcm9qZWN0VGllcklkKQp9CgovLyBHZXRQcm9qZWN0VGllclJld2FyZEFjY3VtdWxhdGVkRGlzdHJpYnV0ZUFtb3VudCByZXR1cm5zIGEgbGVnYWN5IHJld2FyZC1tYW5hZ2VyIGZpZWxkLgovLyBUaGUgdjEgcmV3YXJkIHBhdGhzIGRvIG5vdCBtYWludGFpbiBpdCwgc28gbm9ybWFsIHJlYWRzIHJldHVybiB6ZXJvIHVubGVzcyBpdAovLyB3YXMgZXhwbGljaXRseSBzZXQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0VGllcklkOiBjb21wb3NpdGUgcHJvamVjdC10aWVyIGlkZW50aWZpZXIgd2hvc2UgbWFuYWdlciBpcyByZXF1ZXN0ZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IGxlZ2FjeSBhY2N1bXVsYXRlZCBkaXN0cmlidXRpb24gYW1vdW50IGluIHRva2VuIGJhc2UgdW5pdHM7IHYxIGFjY291bnRpbmcgbm9ybWFsbHkgbGVhdmVzIGl0IGF0IHplcm8gdW5sZXNzIGV4cGxpY2l0bHkgc2V0LgovLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gcHJvamVjdFRpZXJJZCBkb2VzIG5vdCBpZGVudGlmeSBhIHN0b3JlZCByZXdhcmQgbWFuYWdlci4KZnVuYyBHZXRQcm9qZWN0VGllclJld2FyZEFjY3VtdWxhdGVkRGlzdHJpYnV0ZUFtb3VudChwcm9qZWN0VGllcklkIHN0cmluZykgKGludDY0LCBlcnJvcikgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuR2V0UHJvamVjdFRpZXJSZXdhcmRBY2N1bXVsYXRlZERpc3RyaWJ1dGVBbW91bnQocHJvamVjdFRpZXJJZCkKfQoKLy8gR2V0UHJvamVjdFRpZXJSZXdhcmRBY2N1bXVsYXRlZFRpbWUgcmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdGltZSBvZiBhIHJld2FyZCBtYW5hZ2VyLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvamVjdFRpZXJJZDogY29tcG9zaXRlIHByb2plY3QtdGllciBpZGVudGlmaWVyIHdob3NlIG1hbmFnZXIgaXMgcmVxdWVzdGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gdGltZTogbGFzdCByZXdhcmQtYWNjdW11bGF0aW9uIHRpbWVzdGFtcCBpbiBVbml4IHNlY29uZHMsIG9yIHplcm8gYmVmb3JlIGFjY3VtdWxhdGlvbi4KLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHByb2plY3RUaWVySWQgZG9lcyBub3QgaWRlbnRpZnkgYSBzdG9yZWQgcmV3YXJkIG1hbmFnZXIuCmZ1bmMgR2V0UHJvamVjdFRpZXJSZXdhcmRBY2N1bXVsYXRlZFRpbWUocHJvamVjdFRpZXJJZCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFByb2plY3RUaWVyUmV3YXJkQWNjdW11bGF0ZWRUaW1lKHByb2plY3RUaWVySWQpCn0KCi8vIEdldFByb2plY3RUaWVyUmV3YXJkQ2xhaW1hYmxlRHVyYXRpb24gcmV0dXJucyB0aGUgcmV3YXJkIGNsYWltYWJsZSBkdXJhdGlvbiBvZiBhIHJld2FyZCBtYW5hZ2VyLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvamVjdFRpZXJJZDogY29tcG9zaXRlIHByb2plY3QtdGllciBpZGVudGlmaWVyIHdob3NlIG1hbmFnZXIgaXMgcmVxdWVzdGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZHVyYXRpb246IHJld2FyZCBjbGFpbWFibGUgd2luZG93IGluIHNlY29uZHMuCi8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBwcm9qZWN0VGllcklkIGRvZXMgbm90IGlkZW50aWZ5IGEgc3RvcmVkIHJld2FyZCBtYW5hZ2VyLgpmdW5jIEdldFByb2plY3RUaWVyUmV3YXJkQ2xhaW1hYmxlRHVyYXRpb24ocHJvamVjdFRpZXJJZCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFByb2plY3RUaWVyUmV3YXJkQ2xhaW1hYmxlRHVyYXRpb24ocHJvamVjdFRpZXJJZCkKfQoKLy8gR2V0UmV3YXJkU3RhdGUgcmV0cmlldmVzIGEgcmV3YXJkIHN0YXRlIGJ5IHByb2plY3QgdGllciBJRCBhbmQgZGVwb3NpdCBJRC4KLy8gUmV0dXJucyBhIGNsb25lZCByZXdhcmQgc3RhdGUgdG8gcHJldmVudCBleHRlcm5hbCBtb2RpZmljYXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0VGllcklkOiBjb21wb3NpdGUgcHJvamVjdC10aWVyIGlkZW50aWZpZXIgY29udGFpbmluZyB0aGUgcmV3YXJkIHN0YXRlLgovLyAgIC0gZGVwb3NpdElkOiBkZXBvc2l0IGlkZW50aWZpZXIgd2hvc2UgcmV3YXJkIHN0YXRlIGlzIHJlcXVlc3RlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHJld2FyZFN0YXRlOiBjbG9uZWQgcmV3YXJkIHN0YXRlOyBuaWwgd2hlbiB0aGUgaW1wbGVtZW50YXRpb24gc3VwcGxpZXMgbm8gc3RhdGUgd2l0aG91dCBhbiBlcnJvci4KLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHRoZSByZXdhcmQgbWFuYWdlciBvciByZXdhcmQgc3RhdGUgY2Fubm90IGJlIGZvdW5kLgpmdW5jIEdldFJld2FyZFN0YXRlKHByb2plY3RUaWVySWQgc3RyaW5nLCBkZXBvc2l0SWQgc3RyaW5nKSAoKlJld2FyZFN0YXRlLCBlcnJvcikgewoJcmV3YXJkU3RhdGUsIGVyciA6PSBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFJld2FyZFN0YXRlKHByb2plY3RUaWVySWQsIGRlcG9zaXRJZCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIGVycgoJfQoJaWYgcmV3YXJkU3RhdGUgPT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBuaWwKCX0KCXJldHVybiByZXdhcmRTdGF0ZS5DbG9uZSgpLCBuaWwKfQoKLy8gR2V0UHJvamVjdEFjdGl2ZVN0YXR1cyByZXR1cm5zIHdoZXRoZXIgYSBwcm9qZWN0IGlzIGN1cnJlbnRseSBhY3RpdmUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBwcm9qZWN0SWQ6IHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBwcm9qZWN0IHRvIGluc3BlY3QuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhY3RpdmU6IHRydWUgd2hlbiB0aGUgcHJvamVjdCBpcyBhY3RpdmUgYXQgdGhlIGN1cnJlbnQgVW5peCB0aW1lOyBmYWxzZSB3aGVuIGl0IGlzIGluYWN0aXZlLgovLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gcHJvamVjdElkIGRvZXMgbm90IGlkZW50aWZ5IGEgc3RvcmVkIHByb2plY3QuCmZ1bmMgR2V0UHJvamVjdEFjdGl2ZVN0YXR1cyhwcm9qZWN0SWQgc3RyaW5nKSAoYm9vbCwgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkdldFByb2plY3RBY3RpdmVTdGF0dXMocHJvamVjdElkKQp9ChrvAQoQZ2V0dGVyX3V0aWxzLmdubxLaAXBhY2thZ2UgbGF1bmNocGFkCgpmdW5jIGNsb25lSW50NjRNYXAoc3JjIG1hcFtpbnQ2NF1pbnQ2NCkgbWFwW2ludDY0XWludDY0IHsKCWlmIHNyYyA9PSBuaWwgewoJCXJldHVybiBuaWwKCX0KCglkc3QgOj0gbWFrZShtYXBbaW50NjRdaW50NjQsIGxlbihzcmMpKQoJZm9yIGtleSwgdmFsdWUgOj0gcmFuZ2Ugc3JjIHsKCQlkc3Rba2V5XSA9IHZhbHVlCgl9CglyZXR1cm4gZHN0Cn0KGkMKC2dub21vZC50b21sEjRtb2R1bGUgPSAiZ25vLmxhbmQvci9nbm9zd2FwL2xhdW5jaHBhZCIKZ25vID0gIjAuOSIKGsRRCgtwcm9qZWN0LmdubxK0UXBhY2thZ2UgbGF1bmNocGFkCgppbXBvcnQgKAoJdWZtdCAiZ25vLmxhbmQvcC9udC91Zm10L3YwIgopCgovLyBQcm9qZWN0IHJlcHJlc2VudHMgYSBsYXVuY2hwYWQgcHJvamVjdC4KLy8KLy8gVGhpcyBzdHJ1Y3QgY29udGFpbnMgdGhlIG5lY2Vzc2FyeSBkYXRhIGFuZCBtZXRob2RzIHRvIG1hbmFnZSBhbmQgZGlzdHJpYnV0ZQovLyByZXdhcmRzIGZvciBhIHNwZWNpZmljIHByb2plY3QuCi8vCi8vIEZpZWxkczoKLy8gLSBpZCAoc3RyaW5nKTogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcHJvamVjdCwgZm9ybWF0dGVkIGFzICJ7dG9rZW5QYXRofTp7Y3JlYXRlZEhlaWdodH0iLgovLyAtIG5hbWUgKHN0cmluZyk6IFRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0LgovLyAtIHRva2VuUGF0aCAoc3RyaW5nKTogVGhlIHBhdGggb2YgdGhlIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdC4KLy8gLSBkZXBvc2l0QW1vdW50IChpbnQ2NCk6IFRoZSB0b3RhbCBhbW91bnQgb2YgdG9rZW5zIGRlcG9zaXRlZCBmb3IgdGhlIHByb2plY3QuCi8vIC0gcmVjaXBpZW50IChhZGRyZXNzKTogVGhlIGFkZHJlc3MgdG8gcmVjZWl2ZSB0aGUgcHJvamVjdCdzIHJld2FyZHMuCi8vIC0gY29uZGl0aW9ucyAobWFwW3N0cmluZ10qUHJvamVjdENvbmRpdGlvbik6IEEgbWFwIG9mIHRva2VuIHBhdGhzIHRvIHRoZWlyIGFzc29jaWF0ZWQgY29uZGl0aW9ucy4KLy8gLSB0aWVycyAobWFwW2ludDY0XSpQcm9qZWN0VGllcik6IEEgbWFwIG9mIHRpZXIgZHVyYXRpb25zIHRvIHRoZWlyIGFzc29jaWF0ZWQgdGllcnMuCi8vIC0gdGllcnNSYXRpb3MgKG1hcFtpbnQ2NF1pbnQ2NCk6IEEgbWFwIG9mIHRpZXIgZHVyYXRpb25zIHRvIHRoZWlyIGFzc29jaWF0ZWQgcmF0aW9zLgovLyAtIGNyZWF0ZWRIZWlnaHQgKGludDY0KTogVGhlIGJsb2NrIGhlaWdodCBhdCB3aGljaCB0aGUgcHJvamVjdCB3YXMgY3JlYXRlZC4KLy8gLSBjcmVhdGVkQXQgKGludDY0KTogVGhlIFVuaXggdGltZXN0YW1wIGF0IHdoaWNoIHRoZSBwcm9qZWN0IHdhcyBjcmVhdGVkLgp0eXBlIFByb2plY3Qgc3RydWN0IHsKCWlkICAgICAgICAgICAgc3RyaW5nIC8vICd0b2tlblBhdGg6Y3JlYXRlZEhlaWdodCcKCW5hbWUgICAgICAgICAgc3RyaW5nCgl0b2tlblBhdGggICAgIHN0cmluZwoJZGVwb3NpdEFtb3VudCBpbnQ2NAoJcmVjaXBpZW50ICAgICBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmluZwoJY29uZGl0aW9ucyAgICBtYXBbc3RyaW5nXSpQcm9qZWN0Q29uZGl0aW9uIC8vIHRva2VuUGF0aCAtPiBDb25kaXRpb24KCXRpZXJzICAgICAgICAgbWFwW2ludDY0XSpQcm9qZWN0VGllcgoJdGllcnNSYXRpb3MgICBtYXBbaW50NjRdaW50NjQKCWNyZWF0ZWRIZWlnaHQgaW50NjQKCWNyZWF0ZWRBdCAgICAgaW50NjQKfQoKLy8gSUQgcmV0dXJucyB0aGUgcHJvamVjdCBpZGVudGlmaWVyIGluICJ7dG9rZW5QYXRofTp7Y3JlYXRlZEhlaWdodH0iIGZvcm0uCi8vCi8vIFJldHVybnM6Ci8vICAgLSBpZDogdW5pcXVlIGlkZW50aWZpZXIgYXNzaWduZWQgdG8gdGhpcyBwcm9qZWN0LgpmdW5jIChwICpQcm9qZWN0KSBJRCgpIHN0cmluZyB7CglyZXR1cm4gcC5pZAp9CgovLyBTZXRJRCByZXBsYWNlcyB0aGUgcHJvamVjdCdzIGlkZW50aWZpZXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBpZDogcHJvamVjdCBpZGVudGlmaWVyIHRvIHN0b3JlLCBub3JtYWxseSBpbiAie3Rva2VuUGF0aH06e2NyZWF0ZWRIZWlnaHR9IiBmb3JtLgpmdW5jIChwICpQcm9qZWN0KSBTZXRJRChpZCBzdHJpbmcpIHsKCXAuaWQgPSBpZAp9CgovLyBOYW1lIHJldHVybnMgdGhlIHByb2plY3QncyBodW1hbi1yZWFkYWJsZSBuYW1lLgovLwovLyBSZXR1cm5zOgovLyAgIC0gbmFtZTogc3RvcmVkIHByb2plY3QgbmFtZS4KZnVuYyAocCAqUHJvamVjdCkgTmFtZSgpIHN0cmluZyB7CglyZXR1cm4gcC5uYW1lCn0KCi8vIFNldE5hbWUgcmVwbGFjZXMgdGhlIHByb2plY3QncyBodW1hbi1yZWFkYWJsZSBuYW1lLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gbmFtZTogcHJvamVjdCBuYW1lIHRvIHN0b3JlLgpmdW5jIChwICpQcm9qZWN0KSBTZXROYW1lKG5hbWUgc3RyaW5nKSB7CglwLm5hbWUgPSBuYW1lCn0KCi8vIFRva2VuUGF0aCByZXR1cm5zIHRoZSB0b2tlbiBwYXRoIHdob3NlIHRva2VucyBhcmUgZGlzdHJpYnV0ZWQgYXMgcHJvamVjdCByZXdhcmRzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gdG9rZW5QYXRoOiBjb25maWd1cmVkIHByb2plY3QgcmV3YXJkLXRva2VuIHBhdGguCmZ1bmMgKHAgKlByb2plY3QpIFRva2VuUGF0aCgpIHN0cmluZyB7CglyZXR1cm4gcC50b2tlblBhdGgKfQoKLy8gU2V0VG9rZW5QYXRoIHJlcGxhY2VzIHRoZSBwcm9qZWN0J3MgcmV3YXJkLXRva2VuIHBhdGguCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0b2tlblBhdGg6IHRva2VuIHBhdGggdG8gc3RvcmUgYXMgdGhlIHByb2plY3QncyByZXdhcmQgdG9rZW4uCmZ1bmMgKHAgKlByb2plY3QpIFNldFRva2VuUGF0aCh0b2tlblBhdGggc3RyaW5nKSB7CglwLnRva2VuUGF0aCA9IHRva2VuUGF0aAp9CgovLyBEZXBvc2l0QW1vdW50IHJldHVybnMgdGhlIHRvdGFsIHJld2FyZC10b2tlbiBhbGxvY2F0aW9uIGNvbmZpZ3VyZWQgZm9yIHRoZSBwcm9qZWN0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBwcm9qZWN0IHJld2FyZC10b2tlbiBhbGxvY2F0aW9uLgpmdW5jIChwICpQcm9qZWN0KSBEZXBvc2l0QW1vdW50KCkgaW50NjQgewoJcmV0dXJuIHAuZGVwb3NpdEFtb3VudAp9CgovLyBTZXREZXBvc2l0QW1vdW50IHJlcGxhY2VzIHRoZSBwcm9qZWN0J3MgdG90YWwgcmV3YXJkLXRva2VuIGFsbG9jYXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBhbW91bnQ6IHRvdGFsIHJld2FyZC10b2tlbiBhbW91bnQgYWxsb2NhdGVkIHRvIHRoZSBwcm9qZWN0LgpmdW5jIChwICpQcm9qZWN0KSBTZXREZXBvc2l0QW1vdW50KGFtb3VudCBpbnQ2NCkgewoJcC5kZXBvc2l0QW1vdW50ID0gYW1vdW50Cn0KCi8vIFJlY2lwaWVudCByZXR1cm5zIHRoZSBhZGRyZXNzIGF1dGhvcml6ZWQgdG8gcmVjZWl2ZSB0aGUgcHJvamVjdCdzIHJld2FyZHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSByZWNpcGllbnQ6IGNvbmZpZ3VyZWQgcHJvamVjdCByZWNpcGllbnQgYWRkcmVzcy4KZnVuYyAocCAqUHJvamVjdCkgUmVjaXBpZW50KCkgYWRkcmVzcyB7CglyZXR1cm4gcC5yZWNpcGllbnQKfQoKLy8gU2V0UmVjaXBpZW50IHJlcGxhY2VzIHRoZSBhZGRyZXNzIGF1dGhvcml6ZWQgdG8gcmVjZWl2ZSBwcm9qZWN0IHJld2FyZHMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSByZWNpcGllbnQ6IGFkZHJlc3MgdG8gc3RvcmUgYXMgdGhlIHByb2plY3QgcmVjaXBpZW50LgpmdW5jIChwICpQcm9qZWN0KSBTZXRSZWNpcGllbnQocmVjaXBpZW50IGFkZHJlc3MpIHsKCXAucmVjaXBpZW50ID0gcmVjaXBpZW50Cn0KCi8vIENvbmRpdGlvbnMgcmV0dXJucyBhIGNvcHkgb2YgdGhlIHByb2plY3QncyB0b2tlbiBkZXBvc2l0IGNvbmRpdGlvbnMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBjb25kaXRpb25zOiBtYXAgZnJvbSB0b2tlbiBwYXRoIHRvIGNsb25lZCBjb25kaXRpb24gdmFsdWVzOyBtdXRhdGlvbnMgZG8gbm90IGFsdGVyIHByb2plY3Qgc3RhdGUuCmZ1bmMgKHAgKlByb2plY3QpIENvbmRpdGlvbnMoKSBtYXBbc3RyaW5nXSpQcm9qZWN0Q29uZGl0aW9uIHsKCWNvbmRpdGlvbnMgOj0gbWFrZShtYXBbc3RyaW5nXSpQcm9qZWN0Q29uZGl0aW9uKQoKCWZvciB0b2tlblBhdGgsIGNvbmRpdGlvbiA6PSByYW5nZSBwLmNvbmRpdGlvbnMgewoJCWNvbmRpdGlvbnNbdG9rZW5QYXRoXSA9IGNvbmRpdGlvbi5DbG9uZSgpCgl9CgoJcmV0dXJuIGNvbmRpdGlvbnMKfQoKLy8gU2V0Q29uZGl0aW9ucyByZXBsYWNlcyB0aGUgcHJvamVjdCdzIHRva2VuIGRlcG9zaXQgY29uZGl0aW9ucy4KLy8gVGhlIG1hcCBhbmQgaXRzIGVudHJpZXMgYXJlIHJldGFpbmVkIGluIHRoZSBwcm9qZWN0IHJlYWxtIGZvciBsYXRlciBtdXRhdGlvbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGNvbmRpdGlvbnM6IG1hcCBmcm9tIHJlcXVpcmVkIHRva2VuIHBhdGggdG8gaXRzIGRlcG9zaXQgY29uZGl0aW9uLgpmdW5jIChwICpQcm9qZWN0KSBTZXRDb25kaXRpb25zKGNvbmRpdGlvbnMgbWFwW3N0cmluZ10qUHJvamVjdENvbmRpdGlvbikgewoJb3duZWQgOj0gbWFrZShtYXBbc3RyaW5nXSpQcm9qZWN0Q29uZGl0aW9uLCBsZW4oY29uZGl0aW9ucykpCglmb3IgdG9rZW5QYXRoLCBjb25kaXRpb24gOj0gcmFuZ2UgY29uZGl0aW9ucyB7CgkJb3duZWRbdG9rZW5QYXRoXSA9IGNvbmRpdGlvbgoJfQoJcC5jb25kaXRpb25zID0gb3duZWQKfQoKLy8gU2V0Q29uZGl0aW9uIHJlcGxhY2VzIG9uZSB0b2tlbi1wYXRoIGRlcG9zaXQgY29uZGl0aW9uIGluIHRoZSBwcm9qZWN0LW93bmVkIG1hcC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRva2VuUGF0aDogdG9rZW4gcGF0aCB3aG9zZSBjb25kaXRpb24gaXMgcmVwbGFjZWQuCi8vICAgLSBjb25kaXRpb246IHJlcXVpcmVkIGJhbGFuY2UgY29uZGl0aW9uIGZvciB0aGF0IHRva2VuIHBhdGguCmZ1bmMgKHAgKlByb2plY3QpIFNldENvbmRpdGlvbih0b2tlblBhdGggc3RyaW5nLCBjb25kaXRpb24gKlByb2plY3RDb25kaXRpb24pIHsKCXAuY29uZGl0aW9uc1t0b2tlblBhdGhdID0gY29uZGl0aW9uCn0KCi8vIFRpZXJzIHJldHVybnMgYSBjb3B5IG9mIHRoZSBwcm9qZWN0J3MgY29uZmlndXJlZCBkdXJhdGlvbi10by10aWVyIG1hcC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRpZXJzOiBtYXAgZnJvbSB0aWVyIGR1cmF0aW9uIGluIHNlY29uZHMgdG8gY2xvbmVkIHRpZXIgdmFsdWVzLgpmdW5jIChwICpQcm9qZWN0KSBUaWVycygpIG1hcFtpbnQ2NF0qUHJvamVjdFRpZXIgewoJdGllcnMgOj0gbWFrZShtYXBbaW50NjRdKlByb2plY3RUaWVyKQoKCWZvciBkdXJhdGlvbiwgdGllciA6PSByYW5nZSBwLnRpZXJzIHsKCQl0aWVyc1tkdXJhdGlvbl0gPSB0aWVyLkNsb25lKCkKCX0KCglyZXR1cm4gdGllcnMKfQoKLy8gU2V0VGllcnMgcmVwbGFjZXMgdGhlIHByb2plY3QncyB0aWVyIG1hcCB3aXRoIGEgcHJvamVjdC1vd25lZCBtYXAuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0aWVyczogbWFwIGZyb20gdGllciBkdXJhdGlvbiBpbiBzZWNvbmRzIHRvIGl0cyB0aWVyIGNvbmZpZ3VyYXRpb24uCmZ1bmMgKHAgKlByb2plY3QpIFNldFRpZXJzKHRpZXJzIG1hcFtpbnQ2NF0qUHJvamVjdFRpZXIpIHsKCW93bmVkIDo9IG1ha2UobWFwW2ludDY0XSpQcm9qZWN0VGllciwgbGVuKHRpZXJzKSkKCWZvciBkdXJhdGlvbiwgdGllciA6PSByYW5nZSB0aWVycyB7CgkJb3duZWRbZHVyYXRpb25dID0gdGllcgoJfQoJcC50aWVycyA9IG93bmVkCn0KCi8vIFRpZXJzUmF0aW9zIHJldHVybnMgcmV3YXJkIGFsbG9jYXRpb24gcmF0aW9zIGtleWVkIGJ5IHRpZXIgZHVyYXRpb24uCi8vCi8vIFJldHVybnM6Ci8vICAgLSByYXRpb3M6IG1hcCBmcm9tIHRpZXIgZHVyYXRpb24gaW4gc2Vjb25kcyB0byBpdHMgYWxsb2NhdGlvbiByYXRpby4KZnVuYyAocCAqUHJvamVjdCkgVGllcnNSYXRpb3MoKSBtYXBbaW50NjRdaW50NjQgewoJcmV0dXJuIHAudGllcnNSYXRpb3MKfQoKLy8gU2V0VGllcnNSYXRpb3MgcmVwbGFjZXMgdGhlIHByb2plY3QncyB0aWVyIGFsbG9jYXRpb24gcmF0aW9zLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdGllcnNSYXRpb3M6IG1hcCBmcm9tIHRpZXIgZHVyYXRpb24gaW4gc2Vjb25kcyB0byBpdHMgcmV3YXJkIGFsbG9jYXRpb24gcmF0aW8uCmZ1bmMgKHAgKlByb2plY3QpIFNldFRpZXJzUmF0aW9zKHRpZXJzUmF0aW9zIG1hcFtpbnQ2NF1pbnQ2NCkgewoJcC50aWVyc1JhdGlvcyA9IHRpZXJzUmF0aW9zCn0KCi8vIENyZWF0ZWRIZWlnaHQgcmV0dXJucyB0aGUgYmxvY2sgaGVpZ2h0IGF0IHdoaWNoIHRoZSBwcm9qZWN0IHdhcyBjcmVhdGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaGVpZ2h0OiBwcm9qZWN0IGNyZWF0aW9uIGJsb2NrIGhlaWdodC4KZnVuYyAocCAqUHJvamVjdCkgQ3JlYXRlZEhlaWdodCgpIGludDY0IHsKCXJldHVybiBwLmNyZWF0ZWRIZWlnaHQKfQoKLy8gU2V0Q3JlYXRlZEhlaWdodCByZXBsYWNlcyB0aGUgcHJvamVjdCdzIGNyZWF0aW9uIGJsb2NrIGhlaWdodC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGhlaWdodDogYmxvY2sgaGVpZ2h0IHRvIHN0b3JlIGFzIHRoZSBwcm9qZWN0IGNyZWF0aW9uIGhlaWdodC4KZnVuYyAocCAqUHJvamVjdCkgU2V0Q3JlYXRlZEhlaWdodChoZWlnaHQgaW50NjQpIHsKCXAuY3JlYXRlZEhlaWdodCA9IGhlaWdodAp9CgovLyBDcmVhdGVkQXQgcmV0dXJucyB0aGUgVW5peCB0aW1lc3RhbXAgYXQgd2hpY2ggdGhlIHByb2plY3Qgd2FzIGNyZWF0ZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0aW1lOiBwcm9qZWN0IGNyZWF0aW9uIFVuaXggdGltZXN0YW1wLgpmdW5jIChwICpQcm9qZWN0KSBDcmVhdGVkQXQoKSBpbnQ2NCB7CglyZXR1cm4gcC5jcmVhdGVkQXQKfQoKLy8gU2V0Q3JlYXRlZEF0IHJlcGxhY2VzIHRoZSBwcm9qZWN0J3MgY3JlYXRpb24gdGltZXN0YW1wLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdGltZTogVW5peCB0aW1lc3RhbXAgdG8gc3RvcmUgYXMgdGhlIHByb2plY3QgY3JlYXRpb24gdGltZS4KZnVuYyAocCAqUHJvamVjdCkgU2V0Q3JlYXRlZEF0KHRpbWUgaW50NjQpIHsKCXAuY3JlYXRlZEF0ID0gdGltZQp9CgovLyBHZXRUaWVyIHJldHVybnMgYSBjb3B5IG9mIHRoZSBwcm9qZWN0J3MgdGllciBmb3Igb25lIGR1cmF0aW9uLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gZHVyYXRpb246IHRpZXIgZHVyYXRpb24gaW4gc2Vjb25kcy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRpZXI6IGNsb25lZCB0aWVyIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBkdXJhdGlvbiwgb3IgbmlsIHdoZW4gYWJzZW50LgovLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gbm8gdGllciBpcyBjb25maWd1cmVkIGZvciBkdXJhdGlvbi4KZnVuYyAocCAqUHJvamVjdCkgR2V0VGllcihkdXJhdGlvbiBpbnQ2NCkgKCpQcm9qZWN0VGllciwgZXJyb3IpIHsKCXRpZXIsIGV4aXN0cyA6PSBwLnRpZXJzW2R1cmF0aW9uXQoJaWYgIWV4aXN0cyB7CgkJcmV0dXJuIG5pbCwgdWZtdC5FcnJvcmYoInRpZXIoJWQpIG5vdCBmb3VuZCIsIGR1cmF0aW9uKQoJfQoKCXJldHVybiB0aWVyLkNsb25lKCksIG5pbAp9CgovLyBTZXRUaWVyIHJlcGxhY2VzIG9uZSBkdXJhdGlvbiBlbnRyeSBpbiB0aGUgcHJvamVjdC1vd25lZCB0aWVyIG1hcC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGR1cmF0aW9uOiB0aWVyIGR1cmF0aW9uIGluIHNlY29uZHMgdXNlZCBhcyB0aGUgbWFwIGtleS4KLy8gICAtIHRpZXI6IHRpZXIgY29uZmlndXJhdGlvbiB0byBzdG9yZSBmb3IgZHVyYXRpb24uCmZ1bmMgKHAgKlByb2plY3QpIFNldFRpZXIoZHVyYXRpb24gaW50NjQsIHRpZXIgKlByb2plY3RUaWVyKSB7CglwLnRpZXJzW2R1cmF0aW9uXSA9IHRpZXIKfQoKLy8gSXNSZWNpcGllbnQgcmVwb3J0cyB3aGV0aGVyIHJlY2lwaWVudCBtYXRjaGVzIHRoZSBwcm9qZWN0J3MgY29uZmlndXJlZCByZWNpcGllbnQgYWRkcmVzcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHJlY2lwaWVudDogYWRkcmVzcyB0byBjb21wYXJlIHdpdGggdGhlIGNvbmZpZ3VyZWQgcHJvamVjdCByZWNpcGllbnQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBtYXRjaGVzOiB0cnVlIHdoZW4gcmVjaXBpZW50IGlzIHRoZSBjb25maWd1cmVkIHByb2plY3QgcmVjaXBpZW50LgpmdW5jIChwICpQcm9qZWN0KSBJc1JlY2lwaWVudChyZWNpcGllbnQgYWRkcmVzcykgYm9vbCB7CglyZXR1cm4gcC5yZWNpcGllbnQgPT0gcmVjaXBpZW50Cn0KCi8vIE5ld1Byb2plY3QgY3JlYXRlcyBhIHByb2plY3Qgd2l0aCBlbXB0eSBjb25kaXRpb25zLCB0aWVycywgYW5kIHRpZXItcmF0aW8gbWFwcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIG5hbWU6IGh1bWFuLXJlYWRhYmxlIHByb2plY3QgbmFtZS4KLy8gICAtIHRva2VuUGF0aDogdG9rZW4gcGF0aCB3aG9zZSB0b2tlbnMgYXJlIGRpc3RyaWJ1dGVkIGFzIHByb2plY3QgcmV3YXJkcy4KLy8gICAtIGRlcG9zaXRBbW91bnQ6IHRvdGFsIHJld2FyZC10b2tlbiBhbW91bnQgYWxsb2NhdGVkIHRvIHRoZSBwcm9qZWN0LgovLyAgIC0gcmVjaXBpZW50OiBhZGRyZXNzIGF1dGhvcml6ZWQgdG8gcmVjZWl2ZSBwcm9qZWN0IHJld2FyZHMuCi8vICAgLSBjcmVhdGVkSGVpZ2h0OiBibG9jayBoZWlnaHQgYXQgd2hpY2ggdGhlIHByb2plY3QgaXMgY3JlYXRlZC4KLy8gICAtIGNyZWF0ZWRBdDogVW5peCB0aW1lc3RhbXAgYXQgd2hpY2ggdGhlIHByb2plY3QgaXMgY3JlYXRlZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHByb2plY3Q6IGluaXRpYWxpemVkIHByb2plY3Qgd2l0aCBhbiBJRCBkZXJpdmVkIGZyb20gdG9rZW5QYXRoIGFuZCBjcmVhdGVkSGVpZ2h0LgpmdW5jIE5ld1Byb2plY3QoCgluYW1lIHN0cmluZywKCXRva2VuUGF0aCBzdHJpbmcsCglkZXBvc2l0QW1vdW50IGludDY0LAoJcmVjaXBpZW50IGFkZHJlc3MsCgljcmVhdGVkSGVpZ2h0IGludDY0LAoJY3JlYXRlZEF0IGludDY0LAopICpQcm9qZWN0IHsKCXJldHVybiAmUHJvamVjdHsKCQlpZDogICAgICAgICAgICBNYWtlUHJvamVjdElEKHRva2VuUGF0aCwgY3JlYXRlZEhlaWdodCksCgkJbmFtZTogICAgICAgICAgbmFtZSwKCQl0b2tlblBhdGg6ICAgICB0b2tlblBhdGgsCgkJZGVwb3NpdEFtb3VudDogZGVwb3NpdEFtb3VudCwKCQlyZWNpcGllbnQ6ICAgICByZWNpcGllbnQsCgkJY29uZGl0aW9uczogICAgbWFrZShtYXBbc3RyaW5nXSpQcm9qZWN0Q29uZGl0aW9uKSwKCQl0aWVyczogICAgICAgICBtYWtlKG1hcFtpbnQ2NF0qUHJvamVjdFRpZXIpLAoJCXRpZXJzUmF0aW9zOiAgIG1ha2UobWFwW2ludDY0XWludDY0KSwKCQljcmVhdGVkSGVpZ2h0OiBjcmVhdGVkSGVpZ2h0LAoJCWNyZWF0ZWRBdDogICAgIGNyZWF0ZWRBdCwKCX0KfQoKLy8gQ2xvbmUgcmV0dXJucyBhIGRlZXAtZW5vdWdoIGNvcHkgb2YgdGhlIHByb2plY3QgZm9yIGluZGVwZW5kZW50IG1hcCBhbmQgbmVzdGVkCi8vIGNvbmRpdGlvbi90aWVyIG11dGF0aW9uOyBzY2FsYXIgZmllbGRzIGFyZSBjb3BpZWQgZGlyZWN0bHkuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBjbG9uZTogcHJvamVjdCBjb3B5IHdpdGggaW5kZXBlbmRlbnRseSBhbGxvY2F0ZWQgY29uZGl0aW9uLCB0aWVyLCBhbmQgcmF0aW8gbWFwcy4KZnVuYyAocCBQcm9qZWN0KSBDbG9uZSgpICpQcm9qZWN0IHsKCWNvbmRpdGlvbnMgOj0gbWFrZShtYXBbc3RyaW5nXSpQcm9qZWN0Q29uZGl0aW9uKQoJZm9yIGssIHYgOj0gcmFuZ2UgcC5jb25kaXRpb25zIHsKCQljb25kaXRpb25zW2tdID0gdi5DbG9uZSgpCgl9CgoJdGllcnMgOj0gbWFrZShtYXBbaW50NjRdKlByb2plY3RUaWVyKQoJZm9yIGssIHYgOj0gcmFuZ2UgcC50aWVycyB7CgkJdGllcnNba10gPSB2LkNsb25lKCkKCX0KCgl0aWVyc1JhdGlvcyA6PSBtYWtlKG1hcFtpbnQ2NF1pbnQ2NCkKCWZvciBrLCB2IDo9IHJhbmdlIHAudGllcnNSYXRpb3MgewoJCXRpZXJzUmF0aW9zW2tdID0gdgoJfQoKCXJldHVybiAmUHJvamVjdHsKCQlpZDogICAgICAgICAgICBwLmlkLAoJCW5hbWU6ICAgICAgICAgIHAubmFtZSwKCQl0b2tlblBhdGg6ICAgICBwLnRva2VuUGF0aCwKCQlkZXBvc2l0QW1vdW50OiBwLmRlcG9zaXRBbW91bnQsCgkJcmVjaXBpZW50OiAgICAgcC5yZWNpcGllbnQsCgkJY29uZGl0aW9uczogICAgY29uZGl0aW9ucywKCQl0aWVyczogICAgICAgICB0aWVycywKCQl0aWVyc1JhdGlvczogICB0aWVyc1JhdGlvcywKCQljcmVhdGVkSGVpZ2h0OiBwLmNyZWF0ZWRIZWlnaHQsCgkJY3JlYXRlZEF0OiAgICAgcC5jcmVhdGVkQXQsCgl9Cn0KCi8vIE1ha2VQcm9qZWN0SUQgY29tYmluZXMgYSB0b2tlbiBwYXRoIGFuZCBjcmVhdGlvbiBoZWlnaHQgaW50byBhIHByb2plY3QgaWRlbnRpZmllci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRva2VuUGF0aDogdG9rZW4gcGF0aCBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3QuCi8vICAgLSBjcmVhdGVkSGVpZ2h0OiBibG9jayBoZWlnaHQgYXQgd2hpY2ggdGhlIHByb2plY3Qgd2FzIGNyZWF0ZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBwcm9qZWN0SUQ6IGlkZW50aWZpZXIgaW4gInt0b2tlblBhdGh9OntjcmVhdGVkSGVpZ2h0fSIgZm9ybS4KZnVuYyBNYWtlUHJvamVjdElEKHRva2VuUGF0aCBzdHJpbmcsIGNyZWF0ZWRIZWlnaHQgaW50NjQpIHN0cmluZyB7CglyZXR1cm4gdWZtdC5TcHJpbnRmKCIlczolZCIsIHRva2VuUGF0aCwgY3JlYXRlZEhlaWdodCkKfQoaiyUKFXByb2plY3RfY29uZGl0aW9uLmdubxLxJHBhY2thZ2UgbGF1bmNocGFkCgppbXBvcnQgKAoJInN0cmNvbnYiCgkic3RyaW5ncyIKCgl1Zm10ICJnbm8ubGFuZC9wL250L3VmbXQvdjAiCikKCmNvbnN0IHN0cmluZ1NwbGl0dGVyUGFkID0gIipQQUQqIgoKLy8gUHJvamVjdENvbmRpdGlvbiByZXByZXNlbnRzIGEgY29uZGl0aW9uIGZvciBhIHByb2plY3QuCi8vCi8vIFRoaXMgc3RydWN0IGNvbnRhaW5zIHRoZSBuZWNlc3NhcnkgZGF0YSBhbmQgbWV0aG9kcyB0byBtYW5hZ2UgYW5kIGRpc3RyaWJ1dGUKLy8gcmV3YXJkcyBmb3IgYSBzcGVjaWZpYyBwcm9qZWN0LgovLwovLyBGaWVsZHM6Ci8vIC0gdG9rZW5QYXRoIChzdHJpbmcpOiBUaGUgcGF0aCBvZiB0aGUgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9qZWN0LgovLyAtIG1pbmltdW1BbW91bnQgKGludDY0KTogVGhlIG1pbmltdW0gYW1vdW50IG9mIHRoZSB0b2tlbiByZXF1aXJlZCBmb3IgdGhlIHByb2plY3QuCnR5cGUgUHJvamVjdENvbmRpdGlvbiBzdHJ1Y3QgewoJdG9rZW5QYXRoICAgICBzdHJpbmcKCW1pbmltdW1BbW91bnQgaW50NjQKfQoKLy8gVG9rZW5QYXRoIHJldHVybnMgdGhlIHRva2VuIGNvbnRyYWN0IHBhdGggcmVxdWlyZWQgYnkgdGhpcyBjb25kaXRpb24uCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0b2tlblBhdGg6IGNvbmZpZ3VyZWQgY29uZGl0aW9uIHRva2VuIHBhdGg7IGFuIGVtcHR5IHN0cmluZyBtZWFucyBubyB0b2tlbiBpcyBjb25maWd1cmVkLgpmdW5jIChwICpQcm9qZWN0Q29uZGl0aW9uKSBUb2tlblBhdGgoKSBzdHJpbmcgewoJcmV0dXJuIHAudG9rZW5QYXRoCn0KCi8vIE1pbmltdW1BbW91bnQgcmV0dXJucyB0aGUgbWluaW11bSBiYWxhbmNlIGFtb3VudCByZXF1aXJlZCBieSB0aGlzIGNvbmRpdGlvbi4KLy8KLy8gUmV0dXJuczoKLy8gICAtIG1pbmltdW1BbW91bnQ6IG1pbmltdW0gYW1vdW50IGluIHRoZSB0b2tlbidzIGJhc2UgdW5pdHM7IHZhbHVlcyBhdCBvciBiZWxvdyB6ZXJvIG1ha2UgdGhlIGNvbmRpdGlvbiB1bmF2YWlsYWJsZS4KZnVuYyAocCAqUHJvamVjdENvbmRpdGlvbikgTWluaW11bUFtb3VudCgpIGludDY0IHsKCXJldHVybiBwLm1pbmltdW1BbW91bnQKfQoKLy8gSXNBdmFpbGFibGUgcmVwb3J0cyB3aGV0aGVyIHRoaXMgY29uZGl0aW9uIGhhcyBhIG5vbi1lbXB0eSB0b2tlbiBwYXRoIGFuZCBhIHBvc2l0aXZlIG1pbmltdW0gYW1vdW50LgovLwovLyBSZXR1cm5zOgovLyAgIC0gYXZhaWxhYmxlOiB0cnVlIHdoZW4gYm90aCB0aGUgdG9rZW4gcGF0aCBhbmQgbWluaW11bSBhbW91bnQgYXJlIHZhbGlkOyBmYWxzZSBvdGhlcndpc2UuCmZ1bmMgKHAgKlByb2plY3RDb25kaXRpb24pIElzQXZhaWxhYmxlKCkgYm9vbCB7CglyZXR1cm4gcC50b2tlblBhdGggIT0gIiIgJiYgcC5taW5pbXVtQW1vdW50ID4gMAp9CgovLyBDaGVja0JhbGFuY2VDb25kaXRpb24gdmFsaWRhdGVzIGFuIGlucHV0IHRva2VuIGJhbGFuY2UgYWdhaW5zdCB0aGlzIGNvbmRpdGlvbi4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGlucHV0VG9rZW5QYXRoOiB0b2tlbiBwYXRoIHdob3NlIGJhbGFuY2UgaXMgYmVpbmcgY2hlY2tlZDsgaXQgbXVzdCBlcXVhbCB0aGUgY29uZGl0aW9uIHRva2VuIHBhdGguCi8vICAgLSBpbnB1dEFtb3VudDogaW5wdXQgdG9rZW4gYmFsYW5jZSBpbiBiYXNlIHVuaXRzOyBpdCBtdXN0IGJlIGF0IGxlYXN0IHRoZSBjb25maWd1cmVkIG1pbmltdW0uCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnI6IG5pbCB3aGVuIHRoZSB0b2tlbiBwYXRoIGFuZCBhbW91bnQgc2F0aXNmeSB0aGUgY29uZGl0aW9uOyBub24tbmlsIGRlc2NyaWJpbmcgYSBtaXNtYXRjaCBvdGhlcndpc2UuCmZ1bmMgKHAgKlByb2plY3RDb25kaXRpb24pIENoZWNrQmFsYW5jZUNvbmRpdGlvbihpbnB1dFRva2VuUGF0aCBzdHJpbmcsIGlucHV0QW1vdW50IGludDY0KSBlcnJvciB7CglpZiBwLnRva2VuUGF0aCAhPSBpbnB1dFRva2VuUGF0aCB7CgkJcmV0dXJuIHVmbXQuRXJyb3JmKCJ0b2tlbiBwYXRoKCVzKSBpcyBub3QgbWF0Y2hlZCIsIGlucHV0VG9rZW5QYXRoKQoJfQoKCWlmIGlucHV0QW1vdW50IDwgcC5taW5pbXVtQW1vdW50IHsKCQlyZXR1cm4gdWZtdC5FcnJvcmYoImlucHV0IGFtb3VudCglZCkgaXMgbGVzcyB0aGFuIG1pbmltdW0gYW1vdW50KCVkKSIsIGlucHV0QW1vdW50LCBwLm1pbmltdW1BbW91bnQpCgl9CgoJcmV0dXJuIG5pbAp9CgovLyBDbG9uZSByZXR1cm5zIGFuIGluZGVwZW5kZW50IGNvcHkgb2YgdGhpcyBwcm9qZWN0IGNvbmRpdGlvbi4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGNvbmRpdGlvbjogY29waWVkIHRva2VuIHBhdGggYW5kIG1pbmltdW0gYW1vdW50IGluIGEgbmV3IFByb2plY3RDb25kaXRpb24gdmFsdWUuCmZ1bmMgKHAgUHJvamVjdENvbmRpdGlvbikgQ2xvbmUoKSAqUHJvamVjdENvbmRpdGlvbiB7CglyZXR1cm4gJlByb2plY3RDb25kaXRpb257CgkJdG9rZW5QYXRoOiAgICAgcC50b2tlblBhdGgsCgkJbWluaW11bUFtb3VudDogcC5taW5pbXVtQW1vdW50LAoJfQp9CgovLyBOZXdQcm9qZWN0Q29uZGl0aW9uIGNyZWF0ZXMgYSBwcm9qZWN0IGNvbmRpdGlvbiBmb3IgYSB0b2tlbiBwYXRoIGFuZCBtaW5pbXVtIGFtb3VudC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRva2VuUGF0aDogdG9rZW4gY29udHJhY3QgcGF0aCB3aG9zZSBiYWxhbmNlIGlzIHJlcXVpcmVkLgovLyAgIC0gbWluaW11bUFtb3VudDogbWluaW11bSBiYWxhbmNlIGluIHRoZSB0b2tlbidzIGJhc2UgdW5pdHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBjb25kaXRpb246IG5ld2x5IGFsbG9jYXRlZCBwcm9qZWN0IGNvbmRpdGlvbiBjb250YWluaW5nIHRoZSBzdXBwbGllZCB2YWx1ZXMuCmZ1bmMgTmV3UHJvamVjdENvbmRpdGlvbih0b2tlblBhdGggc3RyaW5nLCBtaW5pbXVtQW1vdW50IGludDY0KSAqUHJvamVjdENvbmRpdGlvbiB7CglyZXR1cm4gJlByb2plY3RDb25kaXRpb257CgkJdG9rZW5QYXRoOiAgICAgdG9rZW5QYXRoLAoJCW1pbmltdW1BbW91bnQ6IG1pbmltdW1BbW91bnQsCgl9Cn0KCi8vIE5ld1Byb2plY3RDb25kaXRpb25zV2l0aEVycm9yIHBhcnNlcyBwYXJhbGxlbCAqUEFEKi1zZXBhcmF0ZWQgdG9rZW4gcGF0aHMgYW5kIG1pbmltdW0gYW1vdW50cy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGNvbmRpdGlvblRva2VuczogKlBBRCotc2VwYXJhdGVkIHRva2VuIGNvbnRyYWN0IHBhdGhzLCBpbiBjb25kaXRpb24gb3JkZXIuCi8vICAgLSBjb25kaXRpb25BbW91bnRzOiAqUEFEKi1zZXBhcmF0ZWQgZGVjaW1hbCBpbnQ2NCBtaW5pbXVtIGFtb3VudHMgcGFpcmVkIGJ5IGluZGV4IHdpdGggY29uZGl0aW9uVG9rZW5zOyBlbnRyaWVzIGJleW9uZCB0aGUgdG9rZW4gbGlzdCBhcmUgbm90IGNvbnN1bWVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gY29uZGl0aW9uczogcGFyc2VkIGF2YWlsYWJsZSBjb25kaXRpb25zIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZWlyIHRva2VuIHBhdGhzOyBlbXB0eSB3aGVuIGJvdGggaW5wdXRzIGFyZSBlbXB0eS4KLy8gICAtIGVycjogbmlsIG9uIHN1Y2Nlc3NmdWwgcGFyc2luZzsgbm9uLW5pbCB3aGVuIGEgdG9rZW4gbGFja3MgYSBtYXRjaGluZyBhbW91bnQsIGFuIGFtb3VudCBpcyBub3QgYSB2YWxpZCBpbnQ2NCwgb3IgYSBjb25kaXRpb24gaXMgdW5hdmFpbGFibGUuCmZ1bmMgTmV3UHJvamVjdENvbmRpdGlvbnNXaXRoRXJyb3IoY29uZGl0aW9uVG9rZW5zIHN0cmluZywgY29uZGl0aW9uQW1vdW50cyBzdHJpbmcpIChbXSpQcm9qZWN0Q29uZGl0aW9uLCBlcnJvcikgewoJaWYgY29uZGl0aW9uVG9rZW5zID09ICIiICYmIGNvbmRpdGlvbkFtb3VudHMgPT0gIiIgewoJCXJldHVybiBbXSpQcm9qZWN0Q29uZGl0aW9ue30sIG5pbAoJfQoKCWNvbmRpdGlvbnMgOj0gW10qUHJvamVjdENvbmRpdGlvbnt9CgoJdG9rZW5QYXRocyA6PSBzdHJpbmdzLlNwbGl0KGNvbmRpdGlvblRva2Vucywgc3RyaW5nU3BsaXR0ZXJQYWQpCgltaW5pbXVtQW1vdW50cyA6PSBzdHJpbmdzLlNwbGl0KGNvbmRpdGlvbkFtb3VudHMsIHN0cmluZ1NwbGl0dGVyUGFkKQoKCWZvciBpbmRleCwgdG9rZW5QYXRoIDo9IHJhbmdlIHRva2VuUGF0aHMgewoJCWlmIGluZGV4ID49IGxlbihtaW5pbXVtQW1vdW50cykgewoJCQlyZXR1cm4gbmlsLCB1Zm10LkVycm9yZigiY29uZGl0aW9uIGFtb3VudCglcykgaXMgbm90IG1hdGNoZWQgd2l0aCBjb25kaXRpb24gdG9rZW4oJXMpIiwgY29uZGl0aW9uQW1vdW50cywgY29uZGl0aW9uVG9rZW5zKQoJCX0KCgkJbWluaW11bUFtb3VudCwgZXJyIDo9IHN0cmNvbnYuUGFyc2VJbnQobWluaW11bUFtb3VudHNbaW5kZXhdLCAxMCwgNjQpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiBuaWwsIHVmbXQuRXJyb3JmKCJjb25kaXRpb24gYW1vdW50KCVzKSBpcyBub3QgYSB2YWxpZCBpbnRlZ2VyIiwgbWluaW11bUFtb3VudHNbaW5kZXhdKQoJCX0KCgkJY29uZGl0aW9uIDo9IE5ld1Byb2plY3RDb25kaXRpb24odG9rZW5QYXRoLCBtaW5pbXVtQW1vdW50KQoJCWlmICFjb25kaXRpb24uSXNBdmFpbGFibGUoKSB7CgkJCXJldHVybiBuaWwsIHVmbXQuRXJyb3JmKCJjb25kaXRpb24oJXMpIGlzIG5vdCBhdmFpbGFibGUiLCBjb25kaXRpb24uVG9rZW5QYXRoKCkpCgkJfQoKCQljb25kaXRpb25zID0gYXBwZW5kKGNvbmRpdGlvbnMsIGNvbmRpdGlvbikKCX0KCglyZXR1cm4gY29uZGl0aW9ucywgbmlsCn0KGqROChBwcm9qZWN0X3RpZXIuZ25vEo9OcGFja2FnZSBsYXVuY2hwYWQKCmltcG9ydCAoCgl1Zm10ICJnbm8ubGFuZC9wL250L3VmbXQvdjAiCgoJdTI1NiAiZ25vLmxhbmQvcC9nbm9zd2FwL3VpbnQyNTYvdjEiCikKCi8vIFByb2plY3RUaWVyIHJlcHJlc2VudHMgYSB0aWVyIHdpdGhpbiBhIHByb2plY3QuCi8vCi8vIFRoaXMgc3RydWN0IGNvbnRhaW5zIHRoZSBuZWNlc3NhcnkgZGF0YSBhbmQgbWV0aG9kcyB0byBtYW5hZ2UgYW5kIGRpc3RyaWJ1dGUKLy8gcmV3YXJkcyBmb3IgYSBzcGVjaWZpYyB0aWVyIG9mIGEgcHJvamVjdC4KLy8KLy8gRmllbGRzOgovLyAtIGRpc3RyaWJ1dGVBbW91bnRQZXJTZWNvbmRYMTI4ICh1MjU2LlVpbnQpOiBUaGUgYW1vdW50IG9mIHRva2VucyB0byBiZSBkaXN0cmlidXRlZCBwZXIgc2Vjb25kLCByZXByZXNlbnRlZCBhcyBhIFExMjggZml4ZWQtcG9pbnQgbnVtYmVyLgovLyAtIHN0YXJ0VGltZSAoaW50NjQpOiBUaGUgdGltZSBmb3IgdGhlIHN0YXJ0IG9mIHRoZSB0aWVyLgovLyAtIGVuZFRpbWUgKGludDY0KTogVGhlIHRpbWUgZm9yIHRoZSBlbmQgb2YgdGhlIHRpZXIuCi8vIC0gaWQgKHN0cmluZyk6IFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHRpZXIsIGZvcm1hdHRlZCBhcyAie3Byb2plY3RJRH06ZHVyYXRpb24iLgovLyAtIHRvdGFsRGlzdHJpYnV0ZUFtb3VudCAoaW50NjQpOiBUaGUgdG90YWwgYW1vdW50IG9mIHRva2VucyB0byBiZSBkaXN0cmlidXRlZCBmb3IgdGhlIHRpZXIuCi8vIC0gdG90YWxEZXBvc2l0QW1vdW50IChpbnQ2NCk6IFRoZSB0b3RhbCBhbW91bnQgb2YgdG9rZW5zIGRlcG9zaXRlZCBmb3IgdGhlIHRpZXIuCi8vIC0gdG90YWxXaXRoZHJhd0Ftb3VudCAoaW50NjQpOiBUaGUgdG90YWwgYW1vdW50IG9mIHRva2VucyB3aXRoZHJhd24gZnJvbSB0aGUgdGllci4KLy8gLSB0b3RhbERlcG9zaXRDb3VudCAoaW50NjQpOiBUaGUgdG90YWwgbnVtYmVyIG9mIGRlcG9zaXRzIG1hZGUgdG8gdGhlIHRpZXIuCi8vIC0gdG90YWxXaXRoZHJhd0NvdW50IChpbnQ2NCk6IFRoZSB0b3RhbCBudW1iZXIgb2Ygd2l0aGRyYXdhbHMgZnJvbSB0aGUgdGllci4KLy8gLSB0b3RhbENvbGxlY3RlZEFtb3VudCAoaW50NjQpOiBUaGUgdG90YWwgYW1vdW50IG9mIHRva2VucyBjb2xsZWN0ZWQgYXMgcmV3YXJkcyBmb3IgdGhlIHRpZXIuCnR5cGUgUHJvamVjdFRpZXIgc3RydWN0IHsKCWRpc3RyaWJ1dGVBbW91bnRQZXJTZWNvbmRYMTI4ICp1MjU2LlVpbnQgLy8gZGlzdHJpYnV0ZSBhbW91bnQgcGVyIHNlY29uZCwgUTEyOAoJaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nICAgICAvLyAne3Byb2plY3RJZH06ZHVyYXRpb24nIC8vIGR1cmF0aW9uID09IDMwLCA5MCwgMTgwCgl0b3RhbERpc3RyaWJ1dGVBbW91bnQgICAgICAgICBpbnQ2NAoJdG90YWxEZXBvc2l0QW1vdW50ICAgICAgICAgICAgaW50NjQgLy8gYWNjdW11bGF0ZWQgZGVwb3NpdCBhbW91bnQKCXRvdGFsV2l0aGRyYXdBbW91bnQgICAgICAgICAgIGludDY0IC8vIGFjY3VtdWxhdGVkIHdpdGhkcmF3IGFtb3VudAoJdG90YWxEZXBvc2l0Q291bnQgICAgICAgICAgICAgaW50NjQgLy8gYWNjdW11bGF0ZWQgZGVwb3NpdCBjb3VudAoJdG90YWxXaXRoZHJhd0NvdW50ICAgICAgICAgICAgaW50NjQgLy8gYWNjdW11bGF0ZWQgd2l0aGRyYXcgY291bnQKCXRvdGFsQ29sbGVjdGVkQW1vdW50ICAgICAgICAgIGludDY0IC8vIHRvdGFsIGNvbGxlY3RlZCBhbW91bnQgYnkgdXNlciAocmV3YXJkKQoJc3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgaW50NjQKCWVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgIGludDY0Cn0KCi8vIERpc3RyaWJ1dGVBbW91bnRQZXJTZWNvbmRYMTI4IHJldHVybnMgdGhlIGRpc3RyaWJ1dGUgYW1vdW50IHBlciBzZWNvbmQgKFExMjgpIG9mIHRoZSBwcm9qZWN0IHRpZXIuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IHBlci1zZWNvbmQgZGlzdHJpYnV0aW9uIHJhdGUgZW5jb2RlZCBhcyBhIFExMjggZml4ZWQtcG9pbnQgdmFsdWUuCmZ1bmMgKHB0ICpQcm9qZWN0VGllcikgRGlzdHJpYnV0ZUFtb3VudFBlclNlY29uZFgxMjgoKSAqdTI1Ni5VaW50IHsKCXJldHVybiBwdC5kaXN0cmlidXRlQW1vdW50UGVyU2Vjb25kWDEyOAp9CgovLyBTZXREaXN0cmlidXRlQW1vdW50UGVyU2Vjb25kWDEyOCBzZXRzIHRoZSBkaXN0cmlidXRlIGFtb3VudCBwZXIgc2Vjb25kIChRMTI4KSBvZiB0aGUgcHJvamVjdCB0aWVyLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gYW1vdW50OiBwZXItc2Vjb25kIGRpc3RyaWJ1dGlvbiByYXRlIHRvIHN0b3JlLCBlbmNvZGVkIGFzIGEgUTEyOCBmaXhlZC1wb2ludCB2YWx1ZS4KZnVuYyAocHQgKlByb2plY3RUaWVyKSBTZXREaXN0cmlidXRlQW1vdW50UGVyU2Vjb25kWDEyOChhbW91bnQgKnUyNTYuVWludCkgewoJcHQuZGlzdHJpYnV0ZUFtb3VudFBlclNlY29uZFgxMjggPSB1MjU2Llplcm8oKS5TZXQoYW1vdW50KQp9CgovLyBJRCByZXR1cm5zIHRoZSBJRCBvZiB0aGUgcHJvamVjdCB0aWVyLgovLwovLyBSZXR1cm5zOgovLyAgIC0gaWQ6IHRpZXIgaWRlbnRpZmllciBpbiB0aGUgIntwcm9qZWN0SUR9OntkdXJhdGlvbn0iIGZvcm0uCmZ1bmMgKHB0ICpQcm9qZWN0VGllcikgSUQoKSBzdHJpbmcgewoJcmV0dXJuIHB0LmlkCn0KCi8vIFNldElEIHNldHMgdGhlIElEIG9mIHRoZSBwcm9qZWN0IHRpZXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBpZDogdGllciBpZGVudGlmaWVyIHRvIHN0b3JlLCBub3JtYWxseSAie3Byb2plY3RJRH06e2R1cmF0aW9ufSIuCmZ1bmMgKHB0ICpQcm9qZWN0VGllcikgU2V0SUQoaWQgc3RyaW5nKSB7CglwdC5pZCA9IGlkCn0KCi8vIFRvdGFsRGlzdHJpYnV0ZUFtb3VudCByZXR1cm5zIHRoZSB0b3RhbCBkaXN0cmlidXRlIGFtb3VudCBvZiB0aGUgcHJvamVjdCB0aWVyLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiB0b3RhbCB0b2tlbiBhbW91bnQgYWxsb2NhdGVkIGZvciBkaXN0cmlidXRpb24gYnkgdGhpcyB0aWVyLgpmdW5jIChwdCAqUHJvamVjdFRpZXIpIFRvdGFsRGlzdHJpYnV0ZUFtb3VudCgpIGludDY0IHsKCXJldHVybiBwdC50b3RhbERpc3RyaWJ1dGVBbW91bnQKfQoKLy8gU2V0VG90YWxEaXN0cmlidXRlQW1vdW50IHNldHMgdGhlIHRvdGFsIGRpc3RyaWJ1dGUgYW1vdW50IG9mIHRoZSBwcm9qZWN0IHRpZXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBhbW91bnQ6IHRvdGFsIHRva2VuIGFtb3VudCBhbGxvY2F0ZWQgZm9yIGRpc3RyaWJ1dGlvbiBieSB0aGlzIHRpZXIuCmZ1bmMgKHB0ICpQcm9qZWN0VGllcikgU2V0VG90YWxEaXN0cmlidXRlQW1vdW50KGFtb3VudCBpbnQ2NCkgewoJcHQudG90YWxEaXN0cmlidXRlQW1vdW50ID0gYW1vdW50Cn0KCi8vIFRvdGFsRGVwb3NpdEFtb3VudCByZXR1cm5zIHRoZSB0b3RhbCBkZXBvc2l0IGFtb3VudCBvZiB0aGUgcHJvamVjdCB0aWVyLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBhZ2dyZWdhdGUgdG9rZW4gYW1vdW50IGRlcG9zaXRlZCBpbnRvIHRoaXMgdGllci4KZnVuYyAocHQgKlByb2plY3RUaWVyKSBUb3RhbERlcG9zaXRBbW91bnQoKSBpbnQ2NCB7CglyZXR1cm4gcHQudG90YWxEZXBvc2l0QW1vdW50Cn0KCi8vIFNldFRvdGFsRGVwb3NpdEFtb3VudCBzZXRzIHRoZSB0b3RhbCBkZXBvc2l0IGFtb3VudCBvZiB0aGUgcHJvamVjdCB0aWVyLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gYW1vdW50OiBhZ2dyZWdhdGUgdG9rZW4gYW1vdW50IHRvIHJlY29yZCBhcyBkZXBvc2l0ZWQgaW50byB0aGlzIHRpZXIuCmZ1bmMgKHB0ICpQcm9qZWN0VGllcikgU2V0VG90YWxEZXBvc2l0QW1vdW50KGFtb3VudCBpbnQ2NCkgewoJcHQudG90YWxEZXBvc2l0QW1vdW50ID0gYW1vdW50Cn0KCi8vIFRvdGFsV2l0aGRyYXdBbW91bnQgcmV0dXJucyB0aGUgdG90YWwgd2l0aGRyYXcgYW1vdW50IG9mIHRoZSBwcm9qZWN0IHRpZXIuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IGFnZ3JlZ2F0ZSB0b2tlbiBhbW91bnQgd2l0aGRyYXduIGZyb20gdGhpcyB0aWVyLgpmdW5jIChwdCAqUHJvamVjdFRpZXIpIFRvdGFsV2l0aGRyYXdBbW91bnQoKSBpbnQ2NCB7CglyZXR1cm4gcHQudG90YWxXaXRoZHJhd0Ftb3VudAp9CgovLyBTZXRUb3RhbFdpdGhkcmF3QW1vdW50IHNldHMgdGhlIHRvdGFsIHdpdGhkcmF3IGFtb3VudCBvZiB0aGUgcHJvamVjdCB0aWVyLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gYW1vdW50OiBhZ2dyZWdhdGUgdG9rZW4gYW1vdW50IHRvIHJlY29yZCBhcyB3aXRoZHJhd24gZnJvbSB0aGlzIHRpZXIuCmZ1bmMgKHB0ICpQcm9qZWN0VGllcikgU2V0VG90YWxXaXRoZHJhd0Ftb3VudChhbW91bnQgaW50NjQpIHsKCXB0LnRvdGFsV2l0aGRyYXdBbW91bnQgPSBhbW91bnQKfQoKLy8gVG90YWxEZXBvc2l0Q291bnQgcmV0dXJucyB0aGUgdG90YWwgZGVwb3NpdCBjb3VudCBvZiB0aGUgcHJvamVjdCB0aWVyLgovLwovLyBSZXR1cm5zOgovLyAgIC0gY291bnQ6IG51bWJlciBvZiBkZXBvc2l0cyByZWNvcmRlZCBmb3IgdGhpcyB0aWVyLgpmdW5jIChwdCAqUHJvamVjdFRpZXIpIFRvdGFsRGVwb3NpdENvdW50KCkgaW50NjQgewoJcmV0dXJuIHB0LnRvdGFsRGVwb3NpdENvdW50Cn0KCi8vIFNldFRvdGFsRGVwb3NpdENvdW50IHNldHMgdGhlIHRvdGFsIGRlcG9zaXQgY291bnQgb2YgdGhlIHByb2plY3QgdGllci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGNvdW50OiBudW1iZXIgb2YgZGVwb3NpdHMgdG8gcmVjb3JkIGZvciB0aGlzIHRpZXIuCmZ1bmMgKHB0ICpQcm9qZWN0VGllcikgU2V0VG90YWxEZXBvc2l0Q291bnQoY291bnQgaW50NjQpIHsKCXB0LnRvdGFsRGVwb3NpdENvdW50ID0gY291bnQKfQoKLy8gVG90YWxXaXRoZHJhd0NvdW50IHJldHVybnMgdGhlIHRvdGFsIHdpdGhkcmF3IGNvdW50IG9mIHRoZSBwcm9qZWN0IHRpZXIuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBjb3VudDogbnVtYmVyIG9mIHdpdGhkcmF3YWxzIHJlY29yZGVkIGZvciB0aGlzIHRpZXIuCmZ1bmMgKHB0ICpQcm9qZWN0VGllcikgVG90YWxXaXRoZHJhd0NvdW50KCkgaW50NjQgewoJcmV0dXJuIHB0LnRvdGFsV2l0aGRyYXdDb3VudAp9CgovLyBTZXRUb3RhbFdpdGhkcmF3Q291bnQgc2V0cyB0aGUgdG90YWwgd2l0aGRyYXcgY291bnQgb2YgdGhlIHByb2plY3QgdGllci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGNvdW50OiBudW1iZXIgb2Ygd2l0aGRyYXdhbHMgdG8gcmVjb3JkIGZvciB0aGlzIHRpZXIuCmZ1bmMgKHB0ICpQcm9qZWN0VGllcikgU2V0VG90YWxXaXRoZHJhd0NvdW50KGNvdW50IGludDY0KSB7CglwdC50b3RhbFdpdGhkcmF3Q291bnQgPSBjb3VudAp9CgovLyBUb3RhbENvbGxlY3RlZEFtb3VudCByZXR1cm5zIHRoZSB0b3RhbCBjb2xsZWN0ZWQgYW1vdW50IG9mIHRoZSBwcm9qZWN0IHRpZXIuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IGFnZ3JlZ2F0ZSByZXdhcmQgYW1vdW50IGNvbGxlY3RlZCBmcm9tIHRoaXMgdGllci4KZnVuYyAocHQgKlByb2plY3RUaWVyKSBUb3RhbENvbGxlY3RlZEFtb3VudCgpIGludDY0IHsKCXJldHVybiBwdC50b3RhbENvbGxlY3RlZEFtb3VudAp9CgovLyBTZXRUb3RhbENvbGxlY3RlZEFtb3VudCBzZXRzIHRoZSB0b3RhbCBjb2xsZWN0ZWQgYW1vdW50IG9mIHRoZSBwcm9qZWN0IHRpZXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBhbW91bnQ6IGFnZ3JlZ2F0ZSByZXdhcmQgYW1vdW50IHRvIHJlY29yZCBhcyBjb2xsZWN0ZWQgZnJvbSB0aGlzIHRpZXIuCmZ1bmMgKHB0ICpQcm9qZWN0VGllcikgU2V0VG90YWxDb2xsZWN0ZWRBbW91bnQoYW1vdW50IGludDY0KSB7CglwdC50b3RhbENvbGxlY3RlZEFtb3VudCA9IGFtb3VudAp9CgovLyBTdGFydFRpbWUgcmV0dXJucyB0aGUgc3RhcnQgdGltZSBvZiB0aGUgcHJvamVjdCB0aWVyLgovLwovLyBSZXR1cm5zOgovLyAgIC0gdGltZTogdGllciBzdGFydCB0aW1lc3RhbXAgaW4gVW5peCBzZWNvbmRzLgpmdW5jIChwdCAqUHJvamVjdFRpZXIpIFN0YXJ0VGltZSgpIGludDY0IHsKCXJldHVybiBwdC5zdGFydFRpbWUKfQoKLy8gU2V0U3RhcnRUaW1lIHNldHMgdGhlIHN0YXJ0IHRpbWUgb2YgdGhlIHByb2plY3QgdGllci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRpbWU6IHRpZXIgc3RhcnQgdGltZXN0YW1wIGluIFVuaXggc2Vjb25kcy4KZnVuYyAocHQgKlByb2plY3RUaWVyKSBTZXRTdGFydFRpbWUodGltZSBpbnQ2NCkgewoJcHQuc3RhcnRUaW1lID0gdGltZQp9CgovLyBFbmRUaW1lIHJldHVybnMgdGhlIGVuZCB0aW1lIG9mIHRoZSBwcm9qZWN0IHRpZXIuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0aW1lOiB0aWVyIGVuZCB0aW1lc3RhbXAgaW4gVW5peCBzZWNvbmRzLgpmdW5jIChwdCAqUHJvamVjdFRpZXIpIEVuZFRpbWUoKSBpbnQ2NCB7CglyZXR1cm4gcHQuZW5kVGltZQp9CgovLyBTZXRFbmRUaW1lIHNldHMgdGhlIGVuZCB0aW1lIG9mIHRoZSBwcm9qZWN0IHRpZXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0aW1lOiB0aWVyIGVuZCB0aW1lc3RhbXAgaW4gVW5peCBzZWNvbmRzLgpmdW5jIChwdCAqUHJvamVjdFRpZXIpIFNldEVuZFRpbWUodGltZSBpbnQ2NCkgewoJcHQuZW5kVGltZSA9IHRpbWUKfQoKLy8gSXNBY3RpdmF0ZWQgcmVwb3J0cyB3aGV0aGVyIHRoZSB0aWVyIGlzIGFjdGl2ZSBhdCB0aGUgc3VwcGxpZWQgdGltZXN0YW1wLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VycmVudFRpbWU6IHRpbWVzdGFtcCBpbiBVbml4IHNlY29uZHMgdG8gY29tcGFyZSB3aXRoIHRoZSB0aWVyIHdpbmRvdy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFjdGl2YXRlZDogdHJ1ZSB3aGVuIHN0YXJ0VGltZSA8PSBjdXJyZW50VGltZSBhbmQgY3VycmVudFRpbWUgPCBlbmRUaW1lOyBmYWxzZSBvdGhlcndpc2UuCmZ1bmMgKHB0ICpQcm9qZWN0VGllcikgSXNBY3RpdmF0ZWQoY3VycmVudFRpbWUgaW50NjQpIGJvb2wgewoJcmV0dXJuIHB0LnN0YXJ0VGltZSA8PSBjdXJyZW50VGltZSAmJiBjdXJyZW50VGltZSA8IHB0LmVuZFRpbWUKfQoKLy8gSXNFbmRlZCByZXR1cm5zIHRydWUgaWYgdGhlIHByb2plY3QgdGllciBoYXMgZW5kZWQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjdXJyZW50VGltZTogdGltZXN0YW1wIGluIFVuaXggc2Vjb25kcyB0byBjb21wYXJlIHdpdGggdGhlIHRpZXIgZW5kIHRpbWUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlbmRlZDogdHJ1ZSB3aGVuIGVuZFRpbWUgaXMgc3RyaWN0bHkgbGVzcyB0aGFuIGN1cnJlbnRUaW1lOyBmYWxzZSBhdCBvciBiZWZvcmUgdGhlIGVuZCB0aW1lLgpmdW5jIChwdCAqUHJvamVjdFRpZXIpIElzRW5kZWQoY3VycmVudFRpbWUgaW50NjQpIGJvb2wgewoJcmV0dXJuIHB0LmVuZFRpbWUgPCBjdXJyZW50VGltZQp9CgovLyBDbG9uZSByZXR1cm5zIGFuIGluZGVwZW5kZW50IGNvcHkgb2YgdGhlIHByb2plY3QgdGllciwgaW5jbHVkaW5nIGEgY2xvbmVkCi8vIFExMjggZGlzdHJpYnV0aW9uLXJhdGUgdmFsdWUgYW5kIGFsbCBhZ2dyZWdhdGUgY291bnRlcnMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBjbG9uZTogY29weSB3aG9zZSBtdXRhYmxlIGZpeGVkLXBvaW50IHZhbHVlIGlzIGluZGVwZW5kZW50IG9mIHRoZSByZWNlaXZlci4KZnVuYyAocHQgUHJvamVjdFRpZXIpIENsb25lKCkgKlByb2plY3RUaWVyIHsKCXJldHVybiAmUHJvamVjdFRpZXJ7CgkJaWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0LmlkLAoJCXRvdGFsRGlzdHJpYnV0ZUFtb3VudDogICAgICAgICBwdC50b3RhbERpc3RyaWJ1dGVBbW91bnQsCgkJZGlzdHJpYnV0ZUFtb3VudFBlclNlY29uZFgxMjg6IHB0LmRpc3RyaWJ1dGVBbW91bnRQZXJTZWNvbmRYMTI4LkNsb25lKCksCgkJc3RhcnRUaW1lOiAgICAgICAgICAgICAgICAgICAgIHB0LnN0YXJ0VGltZSwKCQllbmRUaW1lOiAgICAgICAgICAgICAgICAgICAgICAgcHQuZW5kVGltZSwKCQl0b3RhbERlcG9zaXRBbW91bnQ6ICAgICAgICAgICAgcHQudG90YWxEZXBvc2l0QW1vdW50LAoJCXRvdGFsV2l0aGRyYXdBbW91bnQ6ICAgICAgICAgICBwdC50b3RhbFdpdGhkcmF3QW1vdW50LAoJCXRvdGFsRGVwb3NpdENvdW50OiAgICAgICAgICAgICBwdC50b3RhbERlcG9zaXRDb3VudCwKCQl0b3RhbFdpdGhkcmF3Q291bnQ6ICAgICAgICAgICAgcHQudG90YWxXaXRoZHJhd0NvdW50LAoJCXRvdGFsQ29sbGVjdGVkQW1vdW50OiAgICAgICAgICBwdC50b3RhbENvbGxlY3RlZEFtb3VudCwKCX0KfQoKLy8gTmV3UHJvamVjdFRpZXIgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBuZXcgUHJvamVjdFRpZXIgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvamVjdElEOiBsYXVuY2hwYWQgcHJvamVjdCBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGllci4KLy8gICAtIHRpZXJEdXJhdGlvbjogdGllciBkdXJhdGlvbiBpbiBkYXlzOyBsYXVuY2hwYWQgdGllcnMgdXNlIDMwLCA5MCwgb3IgMTgwLgovLyAgIC0gdG90YWxEaXN0cmlidXRlQW1vdW50OiB0b3RhbCB0b2tlbiBhbW91bnQgYWxsb2NhdGVkIGZvciB0aGlzIHRpZXIuCi8vICAgLSBzdGFydFRpbWU6IHRpZXIgc3RhcnQgdGltZXN0YW1wIGluIFVuaXggc2Vjb25kcy4KLy8gICAtIGVuZFRpbWU6IHRpZXIgZW5kIHRpbWVzdGFtcCBpbiBVbml4IHNlY29uZHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSB0aWVyOiBuZXcgUHJvamVjdFRpZXIgd2l0aCB0aGUgc3VwcGxpZWQgaWRlbnRpdHksIGFsbG9jYXRpb24sIGFuZCB0aW1lIHdpbmRvdzsgY291bnRlcnMgYW5kIHJhdGVzIHN0YXJ0IGF0IHplcm8uCmZ1bmMgTmV3UHJvamVjdFRpZXIoCglwcm9qZWN0SUQgc3RyaW5nLAoJdGllckR1cmF0aW9uIGludDY0LAoJdG90YWxEaXN0cmlidXRlQW1vdW50IGludDY0LAoJc3RhcnRUaW1lIGludDY0LAoJZW5kVGltZSBpbnQ2NCwKKSAqUHJvamVjdFRpZXIgewoJcmV0dXJuICZQcm9qZWN0VGllcnsKCQlpZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZVByb2plY3RUaWVySUQocHJvamVjdElELCB0aWVyRHVyYXRpb24pLAoJCXRvdGFsRGlzdHJpYnV0ZUFtb3VudDogICAgICAgICB0b3RhbERpc3RyaWJ1dGVBbW91bnQsCgkJZGlzdHJpYnV0ZUFtb3VudFBlclNlY29uZFgxMjg6IHUyNTYuWmVybygpLAoJCXN0YXJ0VGltZTogICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCgkJZW5kVGltZTogICAgICAgICAgICAgICAgICAgICAgIGVuZFRpbWUsCgkJdG90YWxEZXBvc2l0QW1vdW50OiAgICAgICAgICAgIDAsCgkJdG90YWxXaXRoZHJhd0Ftb3VudDogICAgICAgICAgIDAsCgkJdG90YWxEZXBvc2l0Q291bnQ6ICAgICAgICAgICAgIDAsCgkJdG90YWxXaXRoZHJhd0NvdW50OiAgICAgICAgICAgIDAsCgkJdG90YWxDb2xsZWN0ZWRBbW91bnQ6ICAgICAgICAgIDAsCgl9Cn0KCi8vIE1ha2VQcm9qZWN0VGllcklEIGNvbnN0cnVjdHMgdGhlIHRpZXIgaWRlbnRpZmllciBmcm9tIGEgcHJvamVjdCBJRCBhbmQgZHVyYXRpb24uCi8vIFRoZSByZXN1bHRpbmcgaWRlbnRpZmllciB1c2VzIHRoZSAie3Byb2plY3RJRH06e2R1cmF0aW9ufSIgZm9ybWF0LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcHJvamVjdElEOiB1bmlxdWUgbGF1bmNocGFkIHByb2plY3QgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIHRpZXIuCi8vICAgLSBkdXJhdGlvbjogdGllciBkdXJhdGlvbiBpbiBkYXlzLCBzdWNoIGFzIDMwLCA5MCwgb3IgMTgwLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcHJvamVjdFRpZXJJRDogaWRlbnRpZmllciBjb21iaW5pbmcgcHJvamVjdElEIGFuZCBkdXJhdGlvbiB3aXRoIGEgY29sb24uCmZ1bmMgTWFrZVByb2plY3RUaWVySUQocHJvamVjdElEIHN0cmluZywgZHVyYXRpb24gaW50NjQpIHN0cmluZyB7CglyZXR1cm4gdWZtdC5TcHJpbnRmKCIlczolZCIsIHByb2plY3RJRCwgZHVyYXRpb24pCn0KGsAqCglwcm94eS5nbm8SsipwYWNrYWdlIGxhdW5jaHBhZAoKLy8gQ3JlYXRlUHJvamVjdCBjcmVhdGVzIGEgbmV3IGxhdW5jaHBhZCBwcm9qZWN0IGNhbGxhYmxlIGJ5IHRoZSBhZG1pbmlzdHJhdG9yIG9yIGdvdmVybmFuY2UuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjdXI6IGN1cnJlbnQgcmVhbG0gY29udGV4dDsgY2FsbGVycyB1c2UgY3Jvc3MoY3VyKSB3aGVuIGNyb3NzaW5nIGludG8gdGhpcyByZWFsbS4KLy8gICAtIG5hbWU6IGh1bWFuLXJlYWRhYmxlIHByb2plY3QgbmFtZS4KLy8gICAtIHRva2VuUGF0aDogdG9rZW4gcGF0aCB3aG9zZSB0b2tlbnMgYXJlIGRpc3RyaWJ1dGVkIGFzIHByb2plY3QgcmV3YXJkcy4KLy8gICAtIHJlY2lwaWVudDogYWRkcmVzcyBhdXRob3JpemVkIHRvIHJlY2VpdmUgcHJvamVjdCByZXdhcmRzIGFuZCBwcm9qZWN0IHByb2NlZWRzLgovLyAgIC0gZGVwb3NpdEFtb3VudDogdG90YWwgcmV3YXJkLXRva2VuIGFtb3VudCBhbGxvY2F0ZWQgdG8gdGhlIHByb2plY3QuCi8vICAgLSBjb25kaXRpb25Ub2tlbnM6IG9wdGlvbmFsIGAqUEFEKmAtc2VwYXJhdGVkIHRva2VuIHBhdGhzIHJlcXVpcmVkIGZvciBkZXBvc2l0cy4KLy8gICAtIGNvbmRpdGlvbkFtb3VudHM6IG9wdGlvbmFsIGAqUEFEKmAtc2VwYXJhdGVkIHJlcXVpcmVkIGFtb3VudHMgbWF0Y2hpbmcgY29uZGl0aW9uVG9rZW5zLgovLyAgIC0gdGllcjMwUmF0aW86IHJld2FyZCBhbGxvY2F0aW9uIHJhdGlvIGZvciB0aGUgMzAtZGF5IHRpZXIuCi8vICAgLSB0aWVyOTBSYXRpbzogcmV3YXJkIGFsbG9jYXRpb24gcmF0aW8gZm9yIHRoZSA5MC1kYXkgdGllci4KLy8gICAtIHRpZXIxODBSYXRpbzogcmV3YXJkIGFsbG9jYXRpb24gcmF0aW8gZm9yIHRoZSAxODAtZGF5IHRpZXIuCi8vICAgLSBzdGFydFRpbWU6IFVuaXggdGltZXN0YW1wIGF0IHdoaWNoIHByb2plY3QgcmV3YXJkIGRpc3RyaWJ1dGlvbiBzdGFydHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBwcm9qZWN0SWQ6IGlkZW50aWZpZXIgYXNzaWduZWQgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgcHJvamVjdC4KLy8KLy8gSGFsdCBjaGVjazogcmV2ZXJ0cyB3aGlsZSB0aGUgTGF1bmNocGFkIGhhbHQgc2NvcGUgaXMgYWN0aXZlLgpmdW5jIENyZWF0ZVByb2plY3QoCgljdXIgcmVhbG0sCgluYW1lIHN0cmluZywKCXRva2VuUGF0aCBzdHJpbmcsCglyZWNpcGllbnQgYWRkcmVzcywKCWRlcG9zaXRBbW91bnQgaW50NjQsCgljb25kaXRpb25Ub2tlbnMgc3RyaW5nLAoJY29uZGl0aW9uQW1vdW50cyBzdHJpbmcsCgl0aWVyMzBSYXRpbyBpbnQ2NCwKCXRpZXI5MFJhdGlvIGludDY0LAoJdGllcjE4MFJhdGlvIGludDY0LAoJc3RhcnRUaW1lIGludDY0LAopIHN0cmluZyB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5DcmVhdGVQcm9qZWN0KAoJCTAsCgkJY3VyLAoJCW5hbWUsCgkJdG9rZW5QYXRoLAoJCXJlY2lwaWVudCwKCQlkZXBvc2l0QW1vdW50LAoJCWNvbmRpdGlvblRva2VucywKCQljb25kaXRpb25BbW91bnRzLAoJCXRpZXIzMFJhdGlvLAoJCXRpZXI5MFJhdGlvLAoJCXRpZXIxODBSYXRpbywKCQlzdGFydFRpbWUsCgkpCn0KCi8vIENvbGxlY3RQcm90b2NvbEZlZSBjb2xsZWN0cyBwcm90b2NvbC1mZWUgcmV3YXJkcyBhbGxvY2F0ZWQgdG8gcHJvamVjdCByZWNpcGllbnRzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBjdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vCi8vIEhhbHQgY2hlY2s6IHJldmVydHMgd2hpbGUgdGhlIFdpdGhkcmF3IGhhbHQgc2NvcGUgaXMgYWN0aXZlLgpmdW5jIENvbGxlY3RQcm90b2NvbEZlZShjdXIgcmVhbG0pIHsKCWdldEltcGxlbWVudGF0aW9uKCkuQ29sbGVjdFByb3RvY29sRmVlKDAsIGN1cikKfQoKLy8gQ29sbGVjdEVtaXNzaW9uUmV3YXJkIGNvbGxlY3RzIGFjY3VtdWxhdGVkIGxhdW5jaHBhZCBlbWlzc2lvbiByZXdhcmRzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBjdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vCi8vIEhhbHQgY2hlY2s6IHJldmVydHMgd2hpbGUgdGhlIFdpdGhkcmF3IGhhbHQgc2NvcGUgaXMgYWN0aXZlLgpmdW5jIENvbGxlY3RFbWlzc2lvblJld2FyZChjdXIgcmVhbG0pIHsKCWdldEltcGxlbWVudGF0aW9uKCkuQ29sbGVjdEVtaXNzaW9uUmV3YXJkKDAsIGN1cikKfQoKLy8gQ29sbGVjdFByb3RvY29sRmVlUmV3YXJkIGNvbGxlY3RzIGFjY3VtdWxhdGVkIGxhdW5jaHBhZCBwcm90b2NvbC1mZWUgcmV3YXJkcyBmb3IgYSB0b2tlbiBwYXRoLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBjdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSB0b2tlblBhdGg6IHRva2VuIHBhdGggd2hvc2UgYWNjdW11bGF0ZWQgcHJvdG9jb2wtZmVlIHJld2FyZCBpcyBjb2xsZWN0ZWQuCi8vCi8vIEhhbHQgY2hlY2s6IHJldmVydHMgd2hpbGUgdGhlIFdpdGhkcmF3IGhhbHQgc2NvcGUgaXMgYWN0aXZlLgpmdW5jIENvbGxlY3RQcm90b2NvbEZlZVJld2FyZChjdXIgcmVhbG0sIHRva2VuUGF0aCBzdHJpbmcpIHsKCWdldEltcGxlbWVudGF0aW9uKCkuQ29sbGVjdFByb3RvY29sRmVlUmV3YXJkKDAsIGN1ciwgdG9rZW5QYXRoKQp9CgovLyBUcmFuc2ZlckxlZnRGcm9tUHJvamVjdEJ5QWRtaW4gdHJhbnNmZXJzIHVucmVzZXJ2ZWQgcmV3YXJkIHRva2VucyBmcm9tIGFuIGVuZGVkIHByb2plY3QuCi8vIEFjdGl2ZSBkZXBvc2l0b3IgY2xhaW1zIHJlbWFpbiByZXNlcnZlZCBhbmQgYXJlIGV4Y2x1ZGVkOyBvbmx5IHRoZSBhZG1pbmlzdHJhdG9yIG1heSBjYWxsIGl0LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBjdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSBwcm9qZWN0SUQ6IGlkZW50aWZpZXIgb2YgdGhlIGVuZGVkIHByb2plY3Qgd2hvc2UgcmVtYWluaW5nIGJhbGFuY2UgaXMgdHJhbnNmZXJyZWQuCi8vICAgLSByZWNpcGllbnQ6IGRlc3RpbmF0aW9uIGFkZHJlc3MgZm9yIHRoZSB0cmFuc2ZlcmFibGUgYmFsYW5jZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogbnVtYmVyIG9mIHJld2FyZCB0b2tlbnMgdHJhbnNmZXJyZWQgYWZ0ZXIgYWN0aXZlIGNsYWltcyBhcmUgcmVzZXJ2ZWQuCi8vCi8vIEhhbHQgY2hlY2s6IHJldmVydHMgd2hpbGUgdGhlIExhdW5jaHBhZCBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBUcmFuc2ZlckxlZnRGcm9tUHJvamVjdEJ5QWRtaW4oY3VyIHJlYWxtLCBwcm9qZWN0SUQgc3RyaW5nLCByZWNpcGllbnQgYWRkcmVzcykgaW50NjQgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuVHJhbnNmZXJMZWZ0RnJvbVByb2plY3RCeUFkbWluKDAsIGN1ciwgcHJvamVjdElELCByZWNpcGllbnQpCn0KCi8vIERlcG9zaXRHbnMgZGVwb3NpdHMgR05TIGludG8gYSBzZWxlY3RlZCBsYXVuY2hwYWQgcHJvamVjdCB0aWVyLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gY3VyOiBjdXJyZW50IHJlYWxtIGNvbnRleHQ7IGNhbGxlcnMgdXNlIGNyb3NzKGN1cikgd2hlbiBjcm9zc2luZyBpbnRvIHRoaXMgcmVhbG0uCi8vICAgLSB0YXJnZXRQcm9qZWN0VGllcklEOiBwcm9qZWN0LXRpZXIgaWRlbnRpZmllciBpbiBge3Byb2plY3RJRH06e3RpZXJEdXJhdGlvbn1gIGZvcm0uCi8vICAgLSBkZXBvc2l0QW1vdW50OiBhbW91bnQgb2YgR05TIHRvIHN0YWtlIGluIHRoZSBzZWxlY3RlZCB0aWVyLgovLyAgIC0gcmVmZXJyZXI6IG9wdGlvbmFsIHJlZmVycmFsIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXBvc2l0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gZGVwb3NpdElkOiBpZGVudGlmaWVyIGFzc2lnbmVkIHRvIHRoZSBuZXdseSBjcmVhdGVkIGRlcG9zaXQuCi8vCi8vIEhhbHQgY2hlY2s6IHJldmVydHMgd2hpbGUgdGhlIExhdW5jaHBhZCBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBEZXBvc2l0R25zKGN1ciByZWFsbSwgdGFyZ2V0UHJvamVjdFRpZXJJRCBzdHJpbmcsIGRlcG9zaXRBbW91bnQgaW50NjQsIHJlZmVycmVyIHN0cmluZykgc3RyaW5nIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkRlcG9zaXRHbnMoMCwgY3VyLCB0YXJnZXRQcm9qZWN0VGllcklELCBkZXBvc2l0QW1vdW50LCByZWZlcnJlcikKfQoKLy8gQ29sbGVjdERlcG9zaXRHbnMgd2l0aGRyYXdzIHRoZSBHTlMgYW1vdW50IHJlY29yZGVkIGJ5IGEgZGVwb3NpdC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogY3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gZGVwb3NpdElEOiBpZGVudGlmaWVyIG9mIHRoZSBkZXBvc2l0IHdob3NlIEdOUyBpcyBjb2xsZWN0ZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IEdOUyBhbW91bnQgd2l0aGRyYXduIGZyb20gdGhlIGRlcG9zaXQuCi8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiB0aGUgZGVwb3NpdCBjYW5ub3QgYmUgY29sbGVjdGVkLgovLwovLyBIYWx0IGNoZWNrOiByZXZlcnRzIHdoaWxlIHRoZSBXaXRoZHJhdyBoYWx0IHNjb3BlIGlzIGFjdGl2ZS4KZnVuYyBDb2xsZWN0RGVwb3NpdEducyhjdXIgcmVhbG0sIGRlcG9zaXRJRCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpIHsKCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpLkNvbGxlY3REZXBvc2l0R25zKDAsIGN1ciwgZGVwb3NpdElEKQp9CgovLyBDb2xsZWN0UmV3YXJkQnlEZXBvc2l0SWQgY29sbGVjdHMgdGhlIHByb2plY3QtdG9rZW4gcmV3YXJkIGVhcm5lZCBieSBhIGRlcG9zaXQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBjdXI6IGN1cnJlbnQgcmVhbG0gY29udGV4dDsgY2FsbGVycyB1c2UgY3Jvc3MoY3VyKSB3aGVuIGNyb3NzaW5nIGludG8gdGhpcyByZWFsbS4KLy8gICAtIGRlcG9zaXRJRDogaWRlbnRpZmllciBvZiB0aGUgZGVwb3NpdCB3aG9zZSByZXdhcmQgaXMgY29sbGVjdGVkLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBwcm9qZWN0LXRva2VuIHJld2FyZCBhbW91bnQgdHJhbnNmZXJyZWQgdG8gdGhlIGRlcG9zaXRvci4KLy8KLy8gSGFsdCBjaGVjazogcmV2ZXJ0cyB3aGlsZSB0aGUgV2l0aGRyYXcgaGFsdCBzY29wZSBpcyBhY3RpdmUuCmZ1bmMgQ29sbGVjdFJld2FyZEJ5RGVwb3NpdElkKGN1ciByZWFsbSwgZGVwb3NpdElEIHN0cmluZykgaW50NjQgewoJcmV0dXJuIGdldEltcGxlbWVudGF0aW9uKCkuQ29sbGVjdFJld2FyZEJ5RGVwb3NpdElkKDAsIGN1ciwgZGVwb3NpdElEKQp9ChqvAQoKcmVuZGVyLmdubxKgAXBhY2thZ2UgbGF1bmNocGFkCgovLyBSZW5kZXIgZGVsZWdhdGVzIHdlYiByZW5kZXJpbmcgdG8gdGhlIGFjdGl2ZSBpbXBsZW1lbnRhdGlvbi4KZnVuYyBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7CglyZXR1cm4gZ2V0SW1wbGVtZW50YXRpb24oKS5SZW5kZXIocGF0aCkKfQoaumUKEnJld2FyZF9tYW5hZ2VyLmdubxKjZXBhY2thZ2UgbGF1bmNocGFkCgppbXBvcnQgKAoJYnB0cmVlICJnbm8ubGFuZC9wL250L2JwdHJlZS92MCIKCgl1MjU2ICJnbm8ubGFuZC9wL2dub3N3YXAvdWludDI1Ni92MSIKKQoKLy8gUmV3YXJkTWFuYWdlciBtYW5hZ2VzIHRoZSBkaXN0cmlidXRpb24gb2YgcmV3YXJkcyBmb3IgYSBwcm9qZWN0IHRpZXIuCi8vCi8vIFRoaXMgc3RydWN0IGNvbnRhaW5zIHRoZSBuZWNlc3NhcnkgZGF0YSBhbmQgbWV0aG9kcyB0byBjYWxjdWxhdGUgYW5kIHRyYWNrCi8vIHJld2FyZHMgZm9yIGRlcG9zaXRzIGFzc29jaWF0ZWQgd2l0aCBhIHByb2plY3QgdGllci4KLy8KLy8gRmllbGRzOgovLyAtIHJld2FyZHMgKGJwdHJlZS5CUFRyZWUpOiBBIG1hcCBvZiBkZXBvc2l0IElEcyB0byB0aGVpciBhc3NvY2lhdGVkIHJld2FyZCBzdGF0ZXMuCi8vIC0gZGlzdHJpYnV0ZUFtb3VudFBlclNlY29uZFgxMjggKHUyNTYuVWludCk6IFRoZSBhbW91bnQgb2YgdG9rZW5zIHRvIGJlIGRpc3RyaWJ1dGVkIHBlciBzZWNvbmQsIHJlcHJlc2VudGVkIGFzIGEgUTEyOCBmaXhlZC1wb2ludCBudW1iZXIuCi8vIC0gYWNjdW11bGF0ZWRSZXdhcmRQZXJEZXBvc2l0WDEyOCAodTI1Ni5VaW50KTogVGhlIGFjY3VtdWxhdGVkIHJld2FyZCBwZXIgR05TIHN0YWtlLCByZXByZXNlbnRlZCBhcyBhIFExMjggZml4ZWQtcG9pbnQgbnVtYmVyLgovLyAtIHRvdGFsRGlzdHJpYnV0ZUFtb3VudCAoaW50NjQpOiBUaGUgdG90YWwgdG9rZW4gYWxsb2NhdGlvbiBmb3IgdGhpcyB0aWVyLgovLyAtIHRvdGFsQ2xhaW1lZEFtb3VudCAoaW50NjQpOiBUaGUgdG90YWwgYW1vdW50IG9mIHRva2VucyBjbGFpbWVkLgovLyAtIGRpc3RyaWJ1dGVTdGFydFRpbWUgKGludDY0KTogVGhlIHN0YXJ0IHRpbWUgb2YgdGhlIHJld2FyZCBjYWxjdWxhdGlvbi4KLy8gLSBkaXN0cmlidXRlRW5kVGltZSAoaW50NjQpOiBUaGUgZW5kIHRpbWUgb2YgdGhlIHJld2FyZCBjYWxjdWxhdGlvbi4KLy8gLSBhY2N1bXVsYXRlZERpc3RyaWJ1dGVBbW91bnQgKGludDY0KTogQSBsZWdhY3kgZmllbGQgbm90IG1haW50YWluZWQgYnkgdjEgcmV3YXJkIGFjY291bnRpbmc7IG5vcm1hbGx5IHplcm8gdW5sZXNzIGV4cGxpY2l0bHkgc2V0LgovLyAtIHJld2FyZENsYWltYWJsZUR1cmF0aW9uIChpbnQ2NCk6IFRoZSBkdXJhdGlvbiBvZiByZXdhcmQgY2xhaW1hYmxlLgp0eXBlIFJld2FyZE1hbmFnZXIgc3RydWN0IHsKCXJld2FyZHMgKmJwdHJlZS5CUFRyZWUgLy8gZGVwb3NpdElkIC0+IFJld2FyZFN0YXRlCgoJZGlzdHJpYnV0ZUFtb3VudFBlclNlY29uZFgxMjggICAqdTI1Ni5VaW50IC8vIGRpc3RyaWJ1dGUgYW1vdW50IHBlciBzZWNvbmQsIFExMjgKCWFjY3VtdWxhdGVkUmV3YXJkUGVyRGVwb3NpdFgxMjggKnUyNTYuVWludCAvLyBhY2N1bXVsYXRlZCByZXdhcmQgcGVyIEdOUyBzdGFrZSwgUTEyOAoKCXRvdGFsRGlzdHJpYnV0ZUFtb3VudCAgICAgICBpbnQ2NCAvLyB0b3RhbCB0b2tlbiBhbGxvY2F0aW9uIGZvciB0aGlzIHRpZXIKCXRvdGFsQ2xhaW1lZEFtb3VudCAgICAgICAgICBpbnQ2NCAvLyB0b3RhbCBjbGFpbWVkIGFtb3VudAoJYWN0aXZlRGVwb3NpdEFtb3VudCAgICAgICAgIGludDY0IC8vIHByaW5jaXBhbCByZXByZXNlbnRlZCBieSBhY3RpdmUgcmV3YXJkIHN0YXRlcwoJYWN0aXZlQ2xhaW1lZEFtb3VudCAgICAgICAgIGludDY0IC8vIGNsYWltcyBwYWlkIHRvIGFjdGl2ZSByZXdhcmQgc3RhdGVzCglkaXN0cmlidXRlU3RhcnRUaW1lICAgICAgICAgaW50NjQgLy8gc3RhcnQgdGltZSBvZiByZXdhcmQgY2FsY3VsYXRpb24KCWRpc3RyaWJ1dGVFbmRUaW1lICAgICAgICAgICBpbnQ2NCAvLyBlbmQgdGltZSBvZiByZXdhcmQgY2FsY3VsYXRpb24KCWFjY3VtdWxhdGVkRGlzdHJpYnV0ZUFtb3VudCBpbnQ2NCAvLyBsZWdhY3kgZmllbGQ7IHYxIHJld2FyZCBwYXRocyBkbyBub3QgdXBkYXRlIGl0CglhY2N1bXVsYXRlZFRpbWUgICAgICAgICAgICAgaW50NjQgLy8gbGFzdCB0aW1lIHdoZW4gcmV3YXJkIHdhcyBjYWxjdWxhdGVkCglyZXdhcmRDbGFpbWFibGVEdXJhdGlvbiAgICAgaW50NjQgLy8gZHVyYXRpb24gb2YgcmV3YXJkIGNsYWltYWJsZQoKCWFjdGl2ZVByaWNlRGVidFgxMjggKnUyNTYuVWludCAvLyBzdW0gb2YgYWN0aXZlIGRlcG9zaXQgYW1vdW50IMOXIGluaXRpYWwgcmV3YXJkIGluZGV4Cn0KCi8vIFJld2FyZHMgcmV0dXJucyB0aGUgcmV3YXJkcyB0cmVlIG9mIHRoZSByZXdhcmQgbWFuYWdlci4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHJld2FyZHM6IHJld2FyZC1zdGF0ZSB0cmVlIGtleWVkIGJ5IGRlcG9zaXQgSUQuCmZ1bmMgKHJtICpSZXdhcmRNYW5hZ2VyKSBSZXdhcmRzKCkgKmJwdHJlZS5CUFRyZWUgewoJcmV0dXJuIHJtLnJld2FyZHMKfQoKLy8gU2V0UmV3YXJkcyBzZXRzIHRoZSByZXdhcmRzIHRyZWUgb2YgdGhlIHJld2FyZCBtYW5hZ2VyLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gcmV3YXJkczogcmV3YXJkLXN0YXRlIHRyZWUgdG8gdXNlIGZvciB0aGlzIG1hbmFnZXIuCmZ1bmMgKHJtICpSZXdhcmRNYW5hZ2VyKSBTZXRSZXdhcmRzKHJld2FyZHMgKmJwdHJlZS5CUFRyZWUpIHsKCXJtLnJld2FyZHMgPSByZXdhcmRzCn0KCi8vIFNldFJld2FyZCBhc3NvY2lhdGVzIGEgcmV3YXJkIHN0YXRlIHdpdGggYSBkZXBvc2l0IElEIGluIHRoZSBtYW5hZ2VyJ3MgcmV3YXJkIHRyZWUuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBkZXBvc2l0SUQ6IGRlcG9zaXQgaWRlbnRpZmllciB1c2VkIGFzIHRoZSByZXdhcmQtdHJlZSBrZXkuCi8vICAgLSByZXdhcmRTdGF0ZTogcmV3YXJkIHN0YXRlIHRvIHN0b3JlIGZvciB0aGF0IGRlcG9zaXQuCmZ1bmMgKHJtICpSZXdhcmRNYW5hZ2VyKSBTZXRSZXdhcmQoZGVwb3NpdElEIHN0cmluZywgcmV3YXJkU3RhdGUgKlJld2FyZFN0YXRlKSB7CglybS5yZXdhcmRzLlNldChkZXBvc2l0SUQsIHJld2FyZFN0YXRlKQp9CgovLyBSZW1vdmVSZXdhcmQgcmVtb3ZlcyB0aGUgcmV3YXJkIHN0YXRlIGFzc29jaWF0ZWQgd2l0aCBhIGRlcG9zaXQgSUQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBkZXBvc2l0SUQ6IGRlcG9zaXQgaWRlbnRpZmllciB3aG9zZSByZXdhcmQgc3RhdGUgaXMgcmVtb3ZlZC4KZnVuYyAocm0gKlJld2FyZE1hbmFnZXIpIFJlbW92ZVJld2FyZChkZXBvc2l0SUQgc3RyaW5nKSB7CglybS5yZXdhcmRzLlJlbW92ZShkZXBvc2l0SUQpCn0KCi8vIERpc3RyaWJ1dGVBbW91bnRQZXJTZWNvbmRYMTI4IHJldHVybnMgdGhlIGRpc3RyaWJ1dGUgYW1vdW50IHBlciBzZWNvbmQgKFExMjgpIG9mIHRoZSByZXdhcmQgbWFuYWdlci4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudFBlclNlY29uZFgxMjg6IHJld2FyZCBkaXN0cmlidXRpb24gcmF0ZSBpbiBRMTI4IGZpeGVkLXBvaW50IHRva2VuIHVuaXRzIHBlciBzZWNvbmQuCmZ1bmMgKHJtICpSZXdhcmRNYW5hZ2VyKSBEaXN0cmlidXRlQW1vdW50UGVyU2Vjb25kWDEyOCgpICp1MjU2LlVpbnQgewoJcmV0dXJuIHJtLmRpc3RyaWJ1dGVBbW91bnRQZXJTZWNvbmRYMTI4Cn0KCi8vIFNldERpc3RyaWJ1dGVBbW91bnRQZXJTZWNvbmRYMTI4IHNldHMgdGhlIGRpc3RyaWJ1dGUgYW1vdW50IHBlciBzZWNvbmQgKFExMjgpIG9mIHRoZSByZXdhcmQgbWFuYWdlci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGFtb3VudDogcmVwbGFjZW1lbnQgcmV3YXJkIGRpc3RyaWJ1dGlvbiByYXRlIGluIFExMjggZml4ZWQtcG9pbnQgdG9rZW4gdW5pdHMgcGVyIHNlY29uZDsgdGhlIHZhbHVlIGlzIGNvcGllZC4KZnVuYyAocm0gKlJld2FyZE1hbmFnZXIpIFNldERpc3RyaWJ1dGVBbW91bnRQZXJTZWNvbmRYMTI4KGFtb3VudCAqdTI1Ni5VaW50KSB7CglybS5kaXN0cmlidXRlQW1vdW50UGVyU2Vjb25kWDEyOCA9IHUyNTYuWmVybygpLlNldChhbW91bnQpCn0KCi8vIEFjY3VtdWxhdGVkUmV3YXJkUGVyRGVwb3NpdFgxMjggcmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgcmV3YXJkIHBlciBkZXBvc2l0IChRMTI4KSBvZiB0aGUgcmV3YXJkIG1hbmFnZXIuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhY2N1bXVsYXRlZFJld2FyZFBlckRlcG9zaXRYMTI4OiBhY2N1bXVsYXRlZCByZXdhcmQgaW5kZXggcGVyIGRlcG9zaXRlZCBHTlMgdW5pdCBpbiBRMTI4IGZpeGVkLXBvaW50IHVuaXRzLgpmdW5jIChybSAqUmV3YXJkTWFuYWdlcikgQWNjdW11bGF0ZWRSZXdhcmRQZXJEZXBvc2l0WDEyOCgpICp1MjU2LlVpbnQgewoJcmV0dXJuIHJtLmFjY3VtdWxhdGVkUmV3YXJkUGVyRGVwb3NpdFgxMjgKfQoKLy8gU2V0QWNjdW11bGF0ZWRSZXdhcmRQZXJEZXBvc2l0WDEyOCBzZXRzIHRoZSBhY2N1bXVsYXRlZCByZXdhcmQgcGVyIGRlcG9zaXQgKFExMjgpIG9mIHRoZSByZXdhcmQgbWFuYWdlci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGFtb3VudDogcmVwbGFjZW1lbnQgYWNjdW11bGF0ZWQgcmV3YXJkLXBlci1kZXBvc2l0IGluZGV4IGluIFExMjggZml4ZWQtcG9pbnQgdW5pdHM7IHRoZSB2YWx1ZSBpcyBjb3BpZWQuCmZ1bmMgKHJtICpSZXdhcmRNYW5hZ2VyKSBTZXRBY2N1bXVsYXRlZFJld2FyZFBlckRlcG9zaXRYMTI4KGFtb3VudCAqdTI1Ni5VaW50KSB7CglybS5hY2N1bXVsYXRlZFJld2FyZFBlckRlcG9zaXRYMTI4ID0gdTI1Ni5aZXJvKCkuU2V0KGFtb3VudCkKfQoKLy8gVG90YWxEaXN0cmlidXRlQW1vdW50IHJldHVybnMgdGhlIHRvdGFsIGRpc3RyaWJ1dGUgYW1vdW50IG9mIHRoZSByZXdhcmQgbWFuYWdlci4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogdG90YWwgcmV3YXJkIGFsbG9jYXRpb24gZm9yIHRoZSB0aWVyIGluIHRva2VuIGJhc2UgdW5pdHMuCmZ1bmMgKHJtICpSZXdhcmRNYW5hZ2VyKSBUb3RhbERpc3RyaWJ1dGVBbW91bnQoKSBpbnQ2NCB7CglyZXR1cm4gcm0udG90YWxEaXN0cmlidXRlQW1vdW50Cn0KCi8vIFNldFRvdGFsRGlzdHJpYnV0ZUFtb3VudCBzZXRzIHRoZSB0b3RhbCBkaXN0cmlidXRlIGFtb3VudCBvZiB0aGUgcmV3YXJkIG1hbmFnZXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBhbW91bnQ6IHRvdGFsIHJld2FyZCBhbGxvY2F0aW9uIGZvciB0aGUgdGllciBpbiB0b2tlbiBiYXNlIHVuaXRzLgpmdW5jIChybSAqUmV3YXJkTWFuYWdlcikgU2V0VG90YWxEaXN0cmlidXRlQW1vdW50KGFtb3VudCBpbnQ2NCkgewoJcm0udG90YWxEaXN0cmlidXRlQW1vdW50ID0gYW1vdW50Cn0KCi8vIFRvdGFsQ2xhaW1lZEFtb3VudCByZXR1cm5zIHRoZSB0b3RhbCBjbGFpbWVkIGFtb3VudCBvZiB0aGUgcmV3YXJkIG1hbmFnZXIuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IHRvdGFsIHJld2FyZCBhbW91bnQgY2xhaW1lZCBmcm9tIHRoZSB0aWVyIGluIHRva2VuIGJhc2UgdW5pdHMuCmZ1bmMgKHJtICpSZXdhcmRNYW5hZ2VyKSBUb3RhbENsYWltZWRBbW91bnQoKSBpbnQ2NCB7CglyZXR1cm4gcm0udG90YWxDbGFpbWVkQW1vdW50Cn0KCi8vIFNldFRvdGFsQ2xhaW1lZEFtb3VudCBzZXRzIHRoZSB0b3RhbCBjbGFpbWVkIGFtb3VudCBvZiB0aGUgcmV3YXJkIG1hbmFnZXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBhbW91bnQ6IHRvdGFsIGNsYWltZWQgcmV3YXJkIGFtb3VudCBpbiB0b2tlbiBiYXNlIHVuaXRzLgpmdW5jIChybSAqUmV3YXJkTWFuYWdlcikgU2V0VG90YWxDbGFpbWVkQW1vdW50KGFtb3VudCBpbnQ2NCkgewoJcm0udG90YWxDbGFpbWVkQW1vdW50ID0gYW1vdW50Cn0KCi8vIEFjdGl2ZURlcG9zaXRBbW91bnQgcmV0dXJucyB0aGUgcHJpbmNpcGFsIHJlcHJlc2VudGVkIGJ5IGN1cnJlbnRseSBhY3RpdmUgcmV3YXJkIHN0YXRlcy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogYWN0aXZlIGRlcG9zaXRlZCBHTlMgcHJpbmNpcGFsIGluIGJhc2UgdW5pdHMuCmZ1bmMgKHJtICpSZXdhcmRNYW5hZ2VyKSBBY3RpdmVEZXBvc2l0QW1vdW50KCkgaW50NjQgewoJcmV0dXJuIHJtLmFjdGl2ZURlcG9zaXRBbW91bnQKfQoKLy8gU2V0QWN0aXZlRGVwb3NpdEFtb3VudCByZXBsYWNlcyB0aGUgcHJpbmNpcGFsIHJlcHJlc2VudGVkIGJ5IGN1cnJlbnRseSBhY3RpdmUgcmV3YXJkIHN0YXRlcy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGFtb3VudDogYWN0aXZlIGRlcG9zaXRlZCBHTlMgcHJpbmNpcGFsIGluIGJhc2UgdW5pdHMuCmZ1bmMgKHJtICpSZXdhcmRNYW5hZ2VyKSBTZXRBY3RpdmVEZXBvc2l0QW1vdW50KGFtb3VudCBpbnQ2NCkgewoJcm0uYWN0aXZlRGVwb3NpdEFtb3VudCA9IGFtb3VudAp9CgovLyBBY3RpdmVDbGFpbWVkQW1vdW50IHJldHVybnMgdGhlIHJld2FyZCBhbW91bnQgY2xhaW1lZCBieSBjdXJyZW50bHkgYWN0aXZlIHJld2FyZCBzdGF0ZXMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBhbW91bnQ6IGFjdGl2ZSBjbGFpbWVkIHJld2FyZCBhbW91bnQgaW4gdG9rZW4gYmFzZSB1bml0cy4KZnVuYyAocm0gKlJld2FyZE1hbmFnZXIpIEFjdGl2ZUNsYWltZWRBbW91bnQoKSBpbnQ2NCB7CglyZXR1cm4gcm0uYWN0aXZlQ2xhaW1lZEFtb3VudAp9CgovLyBTZXRBY3RpdmVDbGFpbWVkQW1vdW50IHJlcGxhY2VzIHRoZSByZXdhcmQgYW1vdW50IGNsYWltZWQgYnkgY3VycmVudGx5IGFjdGl2ZSByZXdhcmQgc3RhdGVzLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gYW1vdW50OiBhY3RpdmUgY2xhaW1lZCByZXdhcmQgYW1vdW50IGluIHRva2VuIGJhc2UgdW5pdHMuCmZ1bmMgKHJtICpSZXdhcmRNYW5hZ2VyKSBTZXRBY3RpdmVDbGFpbWVkQW1vdW50KGFtb3VudCBpbnQ2NCkgewoJcm0uYWN0aXZlQ2xhaW1lZEFtb3VudCA9IGFtb3VudAp9CgovLyBBY3RpdmVQcmljZURlYnRYMTI4IHJldHVybnMgdGhlIHN1bSBvZiBhY3RpdmUgZGVwb3NpdHMnIGluaXRpYWwgcmV3YXJkLWluZGV4IGRlYnRzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZGVidDogYWdncmVnYXRlIGFjdGl2ZSBwcmljZSBkZWJ0IGluIFExMjggZml4ZWQtcG9pbnQgdW5pdHMuCmZ1bmMgKHJtICpSZXdhcmRNYW5hZ2VyKSBBY3RpdmVQcmljZURlYnRYMTI4KCkgKnUyNTYuVWludCB7CglyZXR1cm4gcm0uYWN0aXZlUHJpY2VEZWJ0WDEyOAp9CgovLyBTZXRBY3RpdmVQcmljZURlYnRYMTI4IHJlcGxhY2VzIHRoZSBhZ2dyZWdhdGUgYWN0aXZlIHByaWNlLWluZGV4IGRlYnQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBkZWJ0OiBhZ2dyZWdhdGUgYWN0aXZlIHByaWNlIGRlYnQgaW4gUTEyOCBmaXhlZC1wb2ludCB1bml0czsgdGhlIHZhbHVlIGlzIGNvcGllZC4KZnVuYyAocm0gKlJld2FyZE1hbmFnZXIpIFNldEFjdGl2ZVByaWNlRGVidFgxMjgoZGVidCAqdTI1Ni5VaW50KSB7CglybS5hY3RpdmVQcmljZURlYnRYMTI4ID0gdTI1Ni5aZXJvKCkuU2V0KGRlYnQpCn0KCi8vIERpc3RyaWJ1dGVTdGFydFRpbWUgcmV0dXJucyB0aGUgZGlzdHJpYnV0ZSBzdGFydCB0aW1lIG9mIHRoZSByZXdhcmQgbWFuYWdlci4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHN0YXJ0VGltZTogcmV3YXJkIGRpc3RyaWJ1dGlvbiBzdGFydCB0aW1lc3RhbXAgaW4gVW5peCBzZWNvbmRzLgpmdW5jIChybSAqUmV3YXJkTWFuYWdlcikgRGlzdHJpYnV0ZVN0YXJ0VGltZSgpIGludDY0IHsKCXJldHVybiBybS5kaXN0cmlidXRlU3RhcnRUaW1lCn0KCi8vIFNldERpc3RyaWJ1dGVTdGFydFRpbWUgc2V0cyB0aGUgZGlzdHJpYnV0ZSBzdGFydCB0aW1lIG9mIHRoZSByZXdhcmQgbWFuYWdlci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRpbWU6IHJld2FyZCBkaXN0cmlidXRpb24gc3RhcnQgdGltZXN0YW1wIGluIFVuaXggc2Vjb25kcy4KZnVuYyAocm0gKlJld2FyZE1hbmFnZXIpIFNldERpc3RyaWJ1dGVTdGFydFRpbWUodGltZSBpbnQ2NCkgewoJcm0uZGlzdHJpYnV0ZVN0YXJ0VGltZSA9IHRpbWUKfQoKLy8gRGlzdHJpYnV0ZUVuZFRpbWUgcmV0dXJucyB0aGUgZGlzdHJpYnV0ZSBlbmQgdGltZSBvZiB0aGUgcmV3YXJkIG1hbmFnZXIuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlbmRUaW1lOiByZXdhcmQgZGlzdHJpYnV0aW9uIGVuZCB0aW1lc3RhbXAgaW4gVW5peCBzZWNvbmRzLgpmdW5jIChybSAqUmV3YXJkTWFuYWdlcikgRGlzdHJpYnV0ZUVuZFRpbWUoKSBpbnQ2NCB7CglyZXR1cm4gcm0uZGlzdHJpYnV0ZUVuZFRpbWUKfQoKLy8gU2V0RGlzdHJpYnV0ZUVuZFRpbWUgc2V0cyB0aGUgZGlzdHJpYnV0ZSBlbmQgdGltZSBvZiB0aGUgcmV3YXJkIG1hbmFnZXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0aW1lOiByZXdhcmQgZGlzdHJpYnV0aW9uIGVuZCB0aW1lc3RhbXAgaW4gVW5peCBzZWNvbmRzLgpmdW5jIChybSAqUmV3YXJkTWFuYWdlcikgU2V0RGlzdHJpYnV0ZUVuZFRpbWUodGltZSBpbnQ2NCkgewoJcm0uZGlzdHJpYnV0ZUVuZFRpbWUgPSB0aW1lCn0KCi8vIEFjY3VtdWxhdGVkRGlzdHJpYnV0ZUFtb3VudCByZXR1cm5zIHRoZSBsZWdhY3kgcmV3YXJkLW1hbmFnZXIgZmllbGQuCi8vIHYxIHJld2FyZCBwYXRocyBkbyBub3QgbWFpbnRhaW4gaXQsIHNvIG5vcm1hbCByZWFkcyByZXR1cm4gemVybyB1bmxlc3MgaXQgd2FzCi8vIGV4cGxpY2l0bHkgc2V0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBsZWdhY3kgYWNjdW11bGF0ZWQgZGlzdHJpYnV0aW9uIGFtb3VudCBpbiB0b2tlbiBiYXNlIHVuaXRzOyB2MSBhY2NvdW50aW5nIG5vcm1hbGx5IGxlYXZlcyBpdCBhdCB6ZXJvIHVubGVzcyBleHBsaWNpdGx5IHNldC4KZnVuYyAocm0gKlJld2FyZE1hbmFnZXIpIEFjY3VtdWxhdGVkRGlzdHJpYnV0ZUFtb3VudCgpIGludDY0IHsKCXJldHVybiBybS5hY2N1bXVsYXRlZERpc3RyaWJ1dGVBbW91bnQKfQoKLy8gU2V0QWNjdW11bGF0ZWREaXN0cmlidXRlQW1vdW50IHNldHMgdGhlIGxlZ2FjeSByZXdhcmQtbWFuYWdlciBmaWVsZC4gSXQgaXMgbm90Ci8vIHVzZWQgYnkgdjEgcmV3YXJkIGFjY291bnRpbmcuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBhbW91bnQ6IGxlZ2FjeSBhY2N1bXVsYXRlZCBkaXN0cmlidXRpb24gYW1vdW50IGluIHRva2VuIGJhc2UgdW5pdHM7IHYxIGFjY291bnRpbmcgZG9lcyBub3QgdXBkYXRlIHRoaXMgZmllbGQuCmZ1bmMgKHJtICpSZXdhcmRNYW5hZ2VyKSBTZXRBY2N1bXVsYXRlZERpc3RyaWJ1dGVBbW91bnQoYW1vdW50IGludDY0KSB7CglybS5hY2N1bXVsYXRlZERpc3RyaWJ1dGVBbW91bnQgPSBhbW91bnQKfQoKLy8gQWNjdW11bGF0ZWRUaW1lIHJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHRpbWUgb2YgdGhlIHJld2FyZCBtYW5hZ2VyLgovLwovLyBSZXR1cm5zOgovLyAgIC0gdGltZTogbGFzdCByZXdhcmQtYWNjdW11bGF0aW9uIHRpbWVzdGFtcCBpbiBVbml4IHNlY29uZHMsIG9yIHplcm8gYmVmb3JlIGFjY3VtdWxhdGlvbi4KZnVuYyAocm0gKlJld2FyZE1hbmFnZXIpIEFjY3VtdWxhdGVkVGltZSgpIGludDY0IHsKCXJldHVybiBybS5hY2N1bXVsYXRlZFRpbWUKfQoKLy8gU2V0QWNjdW11bGF0ZWRUaW1lIHNldHMgdGhlIGFjY3VtdWxhdGVkIHRpbWUgb2YgdGhlIHJld2FyZCBtYW5hZ2VyLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdGltZTogbGFzdCByZXdhcmQtYWNjdW11bGF0aW9uIHRpbWVzdGFtcCBpbiBVbml4IHNlY29uZHMuCmZ1bmMgKHJtICpSZXdhcmRNYW5hZ2VyKSBTZXRBY2N1bXVsYXRlZFRpbWUodGltZSBpbnQ2NCkgewoJcm0uYWNjdW11bGF0ZWRUaW1lID0gdGltZQp9CgovLyBSZXdhcmRDbGFpbWFibGVEdXJhdGlvbiByZXR1cm5zIHRoZSByZXdhcmQgY2xhaW1hYmxlIGR1cmF0aW9uIG9mIHRoZSByZXdhcmQgbWFuYWdlci4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGR1cmF0aW9uOiB0aW1lIGFmdGVyIGEgcmV3YXJkIGJlY29tZXMgY2xhaW1hYmxlIGR1cmluZyB3aGljaCBpdCByZW1haW5zIGNvbGxlY3RpYmxlLCBpbiBzZWNvbmRzLgpmdW5jIChybSAqUmV3YXJkTWFuYWdlcikgUmV3YXJkQ2xhaW1hYmxlRHVyYXRpb24oKSBpbnQ2NCB7CglyZXR1cm4gcm0ucmV3YXJkQ2xhaW1hYmxlRHVyYXRpb24KfQoKLy8gU2V0UmV3YXJkQ2xhaW1hYmxlRHVyYXRpb24gc2V0cyB0aGUgcmV3YXJkIGNsYWltYWJsZSBkdXJhdGlvbiBvZiB0aGUgcmV3YXJkIG1hbmFnZXIuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBkdXJhdGlvbjogY2xhaW1hYmxlIHJld2FyZCB3aW5kb3cgaW4gc2Vjb25kcy4KZnVuYyAocm0gKlJld2FyZE1hbmFnZXIpIFNldFJld2FyZENsYWltYWJsZUR1cmF0aW9uKGR1cmF0aW9uIGludDY0KSB7CglybS5yZXdhcmRDbGFpbWFibGVEdXJhdGlvbiA9IGR1cmF0aW9uCn0KCi8vIENsb25lIHJldHVybnMgYW4gaW5kZXBlbmRlbnQgY29weSBvZiB0aGUgcmV3YXJkIG1hbmFnZXIsIGluY2x1ZGluZyBpdHMgcmV3YXJkIHN0YXRlcyBhbmQgUTEyOCB2YWx1ZXMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSByZXdhcmRNYW5hZ2VyOiBkZWVwIGNvcHkgd2l0aCBhIHNlcGFyYXRlIHJld2FyZCB0cmVlIGFuZCBtdXRhYmxlIG51bWVyaWMgdmFsdWVzLgpmdW5jIChybSBSZXdhcmRNYW5hZ2VyKSBDbG9uZSgpICpSZXdhcmRNYW5hZ2VyIHsKCXJld2FyZHNUcmVlIDo9IGJwdHJlZS5OZXdCUFRyZWVOKDE2KQoJcm0ucmV3YXJkcy5JdGVyYXRlKCIiLCAiIiwgZnVuYyhrZXkgc3RyaW5nLCB2YWx1ZSBpbnRlcmZhY2V7fSkgYm9vbCB7CgkJcmV3YXJkU3RhdGUsIG9rIDo9IHZhbHVlLigqUmV3YXJkU3RhdGUpCgkJaWYgIW9rIHsKCQkJcmV0dXJuIHRydWUKCQl9CgkJcmV3YXJkc1RyZWUuU2V0KGtleSwgcmV3YXJkU3RhdGUuQ2xvbmUoKSkKCQlyZXR1cm4gZmFsc2UKCX0pCgoJcmV0dXJuICZSZXdhcmRNYW5hZ2VyewoJCXJld2FyZHM6ICAgICAgICAgICAgICAgICAgICAgICAgIHJld2FyZHNUcmVlLAoJCWRpc3RyaWJ1dGVBbW91bnRQZXJTZWNvbmRYMTI4OiAgIHJtLmRpc3RyaWJ1dGVBbW91bnRQZXJTZWNvbmRYMTI4LkNsb25lKCksCgkJYWNjdW11bGF0ZWRSZXdhcmRQZXJEZXBvc2l0WDEyODogcm0uYWNjdW11bGF0ZWRSZXdhcmRQZXJEZXBvc2l0WDEyOC5DbG9uZSgpLAoJCXRvdGFsRGlzdHJpYnV0ZUFtb3VudDogICAgICAgICAgIHJtLnRvdGFsRGlzdHJpYnV0ZUFtb3VudCwKCQl0b3RhbENsYWltZWRBbW91bnQ6ICAgICAgICAgICAgICBybS50b3RhbENsYWltZWRBbW91bnQsCgkJYWN0aXZlRGVwb3NpdEFtb3VudDogICAgICAgICAgICAgcm0uYWN0aXZlRGVwb3NpdEFtb3VudCwKCQlhY3RpdmVDbGFpbWVkQW1vdW50OiAgICAgICAgICAgICBybS5hY3RpdmVDbGFpbWVkQW1vdW50LAoJCWRpc3RyaWJ1dGVTdGFydFRpbWU6ICAgICAgICAgICAgIHJtLmRpc3RyaWJ1dGVTdGFydFRpbWUsCgkJZGlzdHJpYnV0ZUVuZFRpbWU6ICAgICAgICAgICAgICAgcm0uZGlzdHJpYnV0ZUVuZFRpbWUsCgkJYWNjdW11bGF0ZWREaXN0cmlidXRlQW1vdW50OiAgICAgcm0uYWNjdW11bGF0ZWREaXN0cmlidXRlQW1vdW50LAoJCWFjY3VtdWxhdGVkVGltZTogICAgICAgICAgICAgICAgIHJtLmFjY3VtdWxhdGVkVGltZSwKCQlyZXdhcmRDbGFpbWFibGVEdXJhdGlvbjogICAgICAgICBybS5yZXdhcmRDbGFpbWFibGVEdXJhdGlvbiwKCQlhY3RpdmVQcmljZURlYnRYMTI4OiAgICAgICAgICAgICBybS5hY3RpdmVQcmljZURlYnRYMTI4LkNsb25lKCksCgl9Cn0KCi8vIE5ld1Jld2FyZE1hbmFnZXIgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBuZXcgUmV3YXJkTWFuYWdlciB3aXRoIHRoZSBnaXZlbiB2YWx1ZXMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0b3RhbERpc3RyaWJ1dGVBbW91bnQ6IHRvdGFsIHJld2FyZCBhbGxvY2F0aW9uIGZvciB0aGUgdGllciBpbiB0b2tlbiBiYXNlIHVuaXRzLgovLyAgIC0gZGlzdHJpYnV0ZVN0YXJ0VGltZTogcmV3YXJkIGRpc3RyaWJ1dGlvbiBzdGFydCB0aW1lc3RhbXAgaW4gVW5peCBzZWNvbmRzLgovLyAgIC0gZGlzdHJpYnV0ZUVuZFRpbWU6IHJld2FyZCBkaXN0cmlidXRpb24gZW5kIHRpbWVzdGFtcCBpbiBVbml4IHNlY29uZHMuCi8vICAgLSByZXdhcmRDb2xsZWN0YWJsZUR1cmF0aW9uOiBkdXJhdGlvbiBpbiBzZWNvbmRzIGZvciB3aGljaCBlYWNoIGFjY3J1ZWQgcmV3YXJkIHJlbWFpbnMgY2xhaW1hYmxlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcmV3YXJkTWFuYWdlcjogaW5pdGlhbGl6ZWQgbWFuYWdlciB3aXRoIHplcm9lZCBhY2NvdW50aW5nIGNvdW50ZXJzIGFuZCBhbiBlbXB0eSByZXdhcmQgdHJlZS4KZnVuYyBOZXdSZXdhcmRNYW5hZ2VyKAoJdG90YWxEaXN0cmlidXRlQW1vdW50IGludDY0LAoJZGlzdHJpYnV0ZVN0YXJ0VGltZSBpbnQ2NCwKCWRpc3RyaWJ1dGVFbmRUaW1lIGludDY0LAoJcmV3YXJkQ29sbGVjdGFibGVEdXJhdGlvbiBpbnQ2NCwKKSAqUmV3YXJkTWFuYWdlciB7CglyZXR1cm4gJlJld2FyZE1hbmFnZXJ7CgkJdG90YWxEaXN0cmlidXRlQW1vdW50OiAgICAgICAgICAgdG90YWxEaXN0cmlidXRlQW1vdW50LAoJCWRpc3RyaWJ1dGVTdGFydFRpbWU6ICAgICAgICAgICAgIGRpc3RyaWJ1dGVTdGFydFRpbWUsCgkJZGlzdHJpYnV0ZUVuZFRpbWU6ICAgICAgICAgICAgICAgZGlzdHJpYnV0ZUVuZFRpbWUsCgkJdG90YWxDbGFpbWVkQW1vdW50OiAgICAgICAgICAgICAgMCwKCQlhY3RpdmVEZXBvc2l0QW1vdW50OiAgICAgICAgICAgICAwLAoJCWFjdGl2ZUNsYWltZWRBbW91bnQ6ICAgICAgICAgICAgIDAsCgkJYWNjdW11bGF0ZWREaXN0cmlidXRlQW1vdW50OiAgICAgMCwKCQlhY2N1bXVsYXRlZFRpbWU6ICAgICAgICAgICAgICAgICAwLAoJCWFjY3VtdWxhdGVkUmV3YXJkUGVyRGVwb3NpdFgxMjg6IHUyNTYuWmVybygpLAoJCWRpc3RyaWJ1dGVBbW91bnRQZXJTZWNvbmRYMTI4OiAgIHUyNTYuWmVybygpLAoJCXJld2FyZENsYWltYWJsZUR1cmF0aW9uOiAgICAgICAgIHJld2FyZENvbGxlY3RhYmxlRHVyYXRpb24sCgkJYWN0aXZlUHJpY2VEZWJ0WDEyODogICAgICAgICAgICAgdTI1Ni5aZXJvKCksCgkJcmV3YXJkczogICAgICAgICAgICAgICAgICAgICAgICAgYnB0cmVlLk5ld0JQVHJlZU4oMTYpLAoJfQp9ChrfNQoQcmV3YXJkX3N0YXRlLmdubxLKNXBhY2thZ2UgbGF1bmNocGFkCgppbXBvcnQgKAoJdTI1NiAiZ25vLmxhbmQvcC9nbm9zd2FwL3VpbnQyNTYvdjEiCikKCi8vIFJld2FyZFN0YXRlIHJlcHJlc2VudHMgdGhlIHN0YXRlIG9mIGEgcmV3YXJkIGZvciBhIGRlcG9zaXQuCi8vIEl0IGNvbnRhaW5zIHRoZSBuZWNlc3NhcnkgZGF0YSB0byBtYW5hZ2UgYW5kIGRpc3RyaWJ1dGUgcmV3YXJkcyBmb3IgYSBzcGVjaWZpYyBkZXBvc2l0Lgp0eXBlIFJld2FyZFN0YXRlIHN0cnVjdCB7CglwcmljZURlYnRYMTI4ICp1MjU2LlVpbnQgLy8gcHJpY2UgZGVidCBwZXIgR05TIHN0YWtlLCBRMTI4CgljbGFpbWFibGVUaW1lIGludDY0ICAgICAgLy8gdGltZSB3aGVuIHJld2FyZCBjYW4gYmUgY2xhaW1lZAoKCWRlcG9zaXRBbW91bnQgICAgICAgICAgIGludDY0IC8vIGFtb3VudCBvZiBHTlMgc3Rha2VkCglkaXN0cmlidXRlU3RhcnRUaW1lICAgICBpbnQ2NCAvLyB0aW1lIHdoZW4gbGF1bmNocGFkIHN0YXJ0ZWQgc3Rha2luZwoJZGlzdHJpYnV0ZUVuZFRpbWUgICAgICAgaW50NjQgLy8gZW5kIHRpbWUgb2YgcmV3YXJkIGNhbGN1bGF0aW9uCglhY2N1bXVsYXRlZFJld2FyZEFtb3VudCBpbnQ2NCAvLyBsZWdhY3kgZmllbGQ7IHYxIHJld2FyZCBhY2NvdW50aW5nIGRvZXMgbm90IHBvcHVsYXRlIGl0CglhY2N1bXVsYXRlZFRpbWUgICAgICAgICBpbnQ2NCAvLyBsYXN0IHRpbWUgd2hlbiByZXdhcmQgd2FzIGNhbGN1bGF0ZWQKCWNsYWltZWRBbW91bnQgICAgICAgICAgIGludDY0IC8vIGFtb3VudCBvZiByZXdhcmQgY2xhaW1lZCBzbyBmYXIKfQoKLy8gTmV3UmV3YXJkU3RhdGUgY3JlYXRlcyBhIHJld2FyZCBzdGF0ZSBpbml0aWFsaXplZCBmcm9tIGEgcmV3YXJkLXBlci1kZXBvc2l0IGluZGV4LgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gYWNjdW11bGF0ZWRSZXdhcmRQZXJEZXBvc2l0WDEyODogY3VycmVudCBhY2N1bXVsYXRlZCByZXdhcmQtcGVyLWRlcG9zaXQgaW5kZXggaW4gUTEyOCBmaXhlZC1wb2ludCB1bml0czsgaXQgYmVjb21lcyB0aGlzIGRlcG9zaXQncyBpbml0aWFsIHByaWNlIGRlYnQuCi8vICAgLSBkZXBvc2l0QW1vdW50OiBHTlMgYW1vdW50IHN0YWtlZCBieSB0aGUgZGVwb3NpdCwgaW4gYmFzZSB1bml0cy4KLy8gICAtIGRpc3RyaWJ1dGVTdGFydFRpbWU6IFVuaXggdGltZXN0YW1wIGluIHNlY29uZHMgd2hlbiB0aGlzIGRlcG9zaXQgYmVnaW5zIGFjY3J1aW5nIHJld2FyZHMuCi8vICAgLSBkaXN0cmlidXRlRW5kVGltZTogVW5peCB0aW1lc3RhbXAgaW4gc2Vjb25kcyB3aGVuIHRoaXMgZGVwb3NpdCBzdG9wcyBhY2NydWluZyByZXdhcmRzLgovLyAgIC0gY2xhaW1hYmxlVGltZTogVW5peCB0aW1lc3RhbXAgaW4gc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgYWNjcnVlZCByZXdhcmQgY2FuIGJlIGNsYWltZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSByZXdhcmRTdGF0ZTogbmV3bHkgYWxsb2NhdGVkIHN0YXRlIHdpdGggY2xhaW1lZCBhbmQgbGVnYWN5IGFjY3VtdWxhdGlvbiBmaWVsZHMgaW5pdGlhbGl6ZWQgdG8gemVyby4KZnVuYyBOZXdSZXdhcmRTdGF0ZSgKCWFjY3VtdWxhdGVkUmV3YXJkUGVyRGVwb3NpdFgxMjggKnUyNTYuVWludCwKCWRlcG9zaXRBbW91bnQsCglkaXN0cmlidXRlU3RhcnRUaW1lLAoJZGlzdHJpYnV0ZUVuZFRpbWUgaW50NjQsCgljbGFpbWFibGVUaW1lIGludDY0LAopICpSZXdhcmRTdGF0ZSB7CglyZXR1cm4gJlJld2FyZFN0YXRlewoJCXByaWNlRGVidFgxMjg6ICAgICAgICAgICBhY2N1bXVsYXRlZFJld2FyZFBlckRlcG9zaXRYMTI4LAoJCWRlcG9zaXRBbW91bnQ6ICAgICAgICAgICBkZXBvc2l0QW1vdW50LAoJCWRpc3RyaWJ1dGVTdGFydFRpbWU6ICAgICBkaXN0cmlidXRlU3RhcnRUaW1lLAoJCWRpc3RyaWJ1dGVFbmRUaW1lOiAgICAgICBkaXN0cmlidXRlRW5kVGltZSwKCQljbGFpbWFibGVUaW1lOiAgICAgICAgICAgY2xhaW1hYmxlVGltZSwKCQlhY2N1bXVsYXRlZFJld2FyZEFtb3VudDogMCwKCQljbGFpbWVkQW1vdW50OiAgICAgICAgICAgMCwKCX0KfQoKLy8gUHJpY2VEZWJ0WDEyOCByZXR1cm5zIHRoZSBkZXBvc2l0J3MgaW5pdGlhbCByZXdhcmQgaW5kZXggZGVidCBpbiBRMTI4IGZpeGVkLXBvaW50IHVuaXRzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZGVidDogc3RvcmVkIHByaWNlIGRlYnQgdXNlZCB0byBzdWJ0cmFjdCByZXdhcmRzIGFjY3J1ZWQgYmVmb3JlIHRoaXMgZGVwb3NpdCBqb2luZWQuCmZ1bmMgKHJzICpSZXdhcmRTdGF0ZSkgUHJpY2VEZWJ0WDEyOCgpICp1MjU2LlVpbnQgewoJcmV0dXJuIHJzLnByaWNlRGVidFgxMjgKfQoKLy8gU2V0UHJpY2VEZWJ0WDEyOCByZXBsYWNlcyB0aGUgZGVwb3NpdCdzIGluaXRpYWwgcmV3YXJkIGluZGV4IGRlYnQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBkZWJ0OiBuZXcgcHJpY2UgZGVidCBpbiBRMTI4IGZpeGVkLXBvaW50IHVuaXRzOyB0aGUgdmFsdWUgaXMgY29waWVkIGludG8gdGhlIHN0YXRlLgpmdW5jIChycyAqUmV3YXJkU3RhdGUpIFNldFByaWNlRGVidFgxMjgoZGVidCAqdTI1Ni5VaW50KSB7Cglycy5wcmljZURlYnRYMTI4ID0gdTI1Ni5aZXJvKCkuU2V0KGRlYnQpCn0KCi8vIENsYWltYWJsZVRpbWUgcmV0dXJucyB0aGUgZWFybGllc3QgVW5peCB0aW1lc3RhbXAgYXQgd2hpY2ggdGhpcyByZXdhcmQgbWF5IGJlIGNsYWltZWQuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBjbGFpbWFibGVUaW1lOiBjbGFpbWFiaWxpdHkgdGltZXN0YW1wIGluIFVuaXggc2Vjb25kcy4KZnVuYyAocnMgKlJld2FyZFN0YXRlKSBDbGFpbWFibGVUaW1lKCkgaW50NjQgewoJcmV0dXJuIHJzLmNsYWltYWJsZVRpbWUKfQoKLy8gU2V0Q2xhaW1hYmxlVGltZSBzZXRzIHRoZSBlYXJsaWVzdCBVbml4IHRpbWVzdGFtcCBhdCB3aGljaCB0aGlzIHJld2FyZCBtYXkgYmUgY2xhaW1lZC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIHRpbWU6IGNsYWltYWJpbGl0eSB0aW1lc3RhbXAgaW4gVW5peCBzZWNvbmRzLgpmdW5jIChycyAqUmV3YXJkU3RhdGUpIFNldENsYWltYWJsZVRpbWUodGltZSBpbnQ2NCkgewoJcnMuY2xhaW1hYmxlVGltZSA9IHRpbWUKfQoKLy8gRGVwb3NpdEFtb3VudCByZXR1cm5zIHRoZSBHTlMgcHJpbmNpcGFsIHJlcHJlc2VudGVkIGJ5IHRoaXMgcmV3YXJkIHN0YXRlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gYW1vdW50OiBzdGFrZWQgR05TIGFtb3VudCBpbiBiYXNlIHVuaXRzIHVzZWQgZm9yIHJld2FyZCBhbGxvY2F0aW9uLgpmdW5jIChycyAqUmV3YXJkU3RhdGUpIERlcG9zaXRBbW91bnQoKSBpbnQ2NCB7CglyZXR1cm4gcnMuZGVwb3NpdEFtb3VudAp9CgovLyBTZXREZXBvc2l0QW1vdW50IHJlcGxhY2VzIHRoZSBHTlMgcHJpbmNpcGFsIHJlcHJlc2VudGVkIGJ5IHRoaXMgcmV3YXJkIHN0YXRlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gYW1vdW50OiBzdGFrZWQgR05TIGFtb3VudCBpbiBiYXNlIHVuaXRzIHVzZWQgZm9yIHJld2FyZCBhbGxvY2F0aW9uLgpmdW5jIChycyAqUmV3YXJkU3RhdGUpIFNldERlcG9zaXRBbW91bnQoYW1vdW50IGludDY0KSB7Cglycy5kZXBvc2l0QW1vdW50ID0gYW1vdW50Cn0KCi8vIERpc3RyaWJ1dGVTdGFydFRpbWUgcmV0dXJucyB0aGUgVW5peCB0aW1lc3RhbXAgd2hlbiB0aGlzIGRlcG9zaXQgc3RhcnRzIGFjY3J1aW5nIHJld2FyZHMuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBzdGFydFRpbWU6IHJld2FyZCBhY2NydWFsIHN0YXJ0IHRpbWVzdGFtcCBpbiBVbml4IHNlY29uZHMuCmZ1bmMgKHJzICpSZXdhcmRTdGF0ZSkgRGlzdHJpYnV0ZVN0YXJ0VGltZSgpIGludDY0IHsKCXJldHVybiBycy5kaXN0cmlidXRlU3RhcnRUaW1lCn0KCi8vIFNldERpc3RyaWJ1dGVTdGFydFRpbWUgc2V0cyB0aGUgVW5peCB0aW1lc3RhbXAgd2hlbiB0aGlzIGRlcG9zaXQgc3RhcnRzIGFjY3J1aW5nIHJld2FyZHMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0aW1lOiByZXdhcmQgYWNjcnVhbCBzdGFydCB0aW1lc3RhbXAgaW4gVW5peCBzZWNvbmRzLgpmdW5jIChycyAqUmV3YXJkU3RhdGUpIFNldERpc3RyaWJ1dGVTdGFydFRpbWUodGltZSBpbnQ2NCkgewoJcnMuZGlzdHJpYnV0ZVN0YXJ0VGltZSA9IHRpbWUKfQoKLy8gRGlzdHJpYnV0ZUVuZFRpbWUgcmV0dXJucyB0aGUgVW5peCB0aW1lc3RhbXAgd2hlbiB0aGlzIGRlcG9zaXQgc3RvcHMgYWNjcnVpbmcgcmV3YXJkcy4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVuZFRpbWU6IHJld2FyZCBhY2NydWFsIGVuZCB0aW1lc3RhbXAgaW4gVW5peCBzZWNvbmRzLgpmdW5jIChycyAqUmV3YXJkU3RhdGUpIERpc3RyaWJ1dGVFbmRUaW1lKCkgaW50NjQgewoJcmV0dXJuIHJzLmRpc3RyaWJ1dGVFbmRUaW1lCn0KCi8vIFNldERpc3RyaWJ1dGVFbmRUaW1lIHNldHMgdGhlIFVuaXggdGltZXN0YW1wIHdoZW4gdGhpcyBkZXBvc2l0IHN0b3BzIGFjY3J1aW5nIHJld2FyZHMuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSB0aW1lOiByZXdhcmQgYWNjcnVhbCBlbmQgdGltZXN0YW1wIGluIFVuaXggc2Vjb25kcy4KZnVuYyAocnMgKlJld2FyZFN0YXRlKSBTZXREaXN0cmlidXRlRW5kVGltZSh0aW1lIGludDY0KSB7Cglycy5kaXN0cmlidXRlRW5kVGltZSA9IHRpbWUKfQoKLy8gQWNjdW11bGF0ZWRSZXdhcmRBbW91bnQgcmV0dXJucyB0aGUgbGVnYWN5IGFjY3VtdWxhdGVkIHJld2FyZCBmaWVsZC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogbGVnYWN5IHJld2FyZCBhbW91bnQgaW4gdG9rZW4gYmFzZSB1bml0czsgdjEgYWNjb3VudGluZyBub3JtYWxseSBsZWF2ZXMgaXQgYXQgemVybyB1bmxlc3MgZXhwbGljaXRseSBzZXQuCmZ1bmMgKHJzICpSZXdhcmRTdGF0ZSkgQWNjdW11bGF0ZWRSZXdhcmRBbW91bnQoKSBpbnQ2NCB7CglyZXR1cm4gcnMuYWNjdW11bGF0ZWRSZXdhcmRBbW91bnQKfQoKLy8gU2V0QWNjdW11bGF0ZWRSZXdhcmRBbW91bnQgc2V0cyB0aGUgbGVnYWN5IGFjY3VtdWxhdGVkIHJld2FyZCBmaWVsZC4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGFtb3VudDogbGVnYWN5IHJld2FyZCBhbW91bnQgaW4gdG9rZW4gYmFzZSB1bml0czsgdjEgYWNjb3VudGluZyBkb2VzIG5vdCB1cGRhdGUgdGhpcyBmaWVsZC4KZnVuYyAocnMgKlJld2FyZFN0YXRlKSBTZXRBY2N1bXVsYXRlZFJld2FyZEFtb3VudChhbW91bnQgaW50NjQpIHsKCXJzLmFjY3VtdWxhdGVkUmV3YXJkQW1vdW50ID0gYW1vdW50Cn0KCi8vIEFjY3VtdWxhdGVkVGltZSByZXR1cm5zIHRoZSBsYXN0IHRpbWVzdGFtcCByZWNvcmRlZCBmb3IgcmV3YXJkIGFjY3VtdWxhdGlvbi4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRpbWU6IGxhc3QgYWNjdW11bGF0ZWQgdGltZXN0YW1wIGluIFVuaXggc2Vjb25kcywgb3IgemVybyBiZWZvcmUgb25lIGlzIHJlY29yZGVkLgpmdW5jIChycyAqUmV3YXJkU3RhdGUpIEFjY3VtdWxhdGVkVGltZSgpIGludDY0IHsKCXJldHVybiBycy5hY2N1bXVsYXRlZFRpbWUKfQoKLy8gU2V0QWNjdW11bGF0ZWRUaW1lIHNldHMgdGhlIGxhc3QgdGltZXN0YW1wIHJlY29yZGVkIGZvciByZXdhcmQgYWNjdW11bGF0aW9uLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gdGltZTogbGFzdCBhY2N1bXVsYXRlZCB0aW1lc3RhbXAgaW4gVW5peCBzZWNvbmRzLgpmdW5jIChycyAqUmV3YXJkU3RhdGUpIFNldEFjY3VtdWxhdGVkVGltZSh0aW1lIGludDY0KSB7Cglycy5hY2N1bXVsYXRlZFRpbWUgPSB0aW1lCn0KCi8vIENsYWltZWRBbW91bnQgcmV0dXJucyB0aGUgcmV3YXJkIGFtb3VudCBhbHJlYWR5IGNsYWltZWQgZm9yIHRoaXMgZGVwb3NpdC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogY2xhaW1lZCByZXdhcmQgYW1vdW50IGluIHRva2VuIGJhc2UgdW5pdHMuCmZ1bmMgKHJzICpSZXdhcmRTdGF0ZSkgQ2xhaW1lZEFtb3VudCgpIGludDY0IHsKCXJldHVybiBycy5jbGFpbWVkQW1vdW50Cn0KCi8vIFNldENsYWltZWRBbW91bnQgcmVwbGFjZXMgdGhlIHJld2FyZCBhbW91bnQgYWxyZWFkeSBjbGFpbWVkIGZvciB0aGlzIGRlcG9zaXQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBhbW91bnQ6IGNsYWltZWQgcmV3YXJkIGFtb3VudCBpbiB0b2tlbiBiYXNlIHVuaXRzLgpmdW5jIChycyAqUmV3YXJkU3RhdGUpIFNldENsYWltZWRBbW91bnQoYW1vdW50IGludDY0KSB7Cglycy5jbGFpbWVkQW1vdW50ID0gYW1vdW50Cn0KCi8vIENsb25lIHJldHVybnMgYW4gaW5kZXBlbmRlbnQgY29weSBvZiB0aGlzIHJld2FyZCBzdGF0ZSwgaW5jbHVkaW5nIGEgY2xvbmVkIFExMjggcHJpY2UgZGVidCB2YWx1ZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHJld2FyZFN0YXRlOiBkZWVwIGNvcHkgb2YgdGhlIHJld2FyZCBzdGF0ZSB0aGF0IGNhbiBiZSBtb2RpZmllZCB3aXRob3V0IGNoYW5naW5nIHRoZSBzb3VyY2UuCmZ1bmMgKHJzIFJld2FyZFN0YXRlKSBDbG9uZSgpICpSZXdhcmRTdGF0ZSB7CglyZXR1cm4gJlJld2FyZFN0YXRlewoJCXByaWNlRGVidFgxMjg6ICAgICAgICAgICBycy5wcmljZURlYnRYMTI4LkNsb25lKCksCgkJY2xhaW1hYmxlVGltZTogICAgICAgICAgIHJzLmNsYWltYWJsZVRpbWUsCgkJZGVwb3NpdEFtb3VudDogICAgICAgICAgIHJzLmRlcG9zaXRBbW91bnQsCgkJZGlzdHJpYnV0ZVN0YXJ0VGltZTogICAgIHJzLmRpc3RyaWJ1dGVTdGFydFRpbWUsCgkJZGlzdHJpYnV0ZUVuZFRpbWU6ICAgICAgIHJzLmRpc3RyaWJ1dGVFbmRUaW1lLAoJCWFjY3VtdWxhdGVkUmV3YXJkQW1vdW50OiBycy5hY2N1bXVsYXRlZFJld2FyZEFtb3VudCwKCQlhY2N1bXVsYXRlZFRpbWU6ICAgICAgICAgcnMuYWNjdW11bGF0ZWRUaW1lLAoJCWNsYWltZWRBbW91bnQ6ICAgICAgICAgICBycy5jbGFpbWVkQW1vdW50LAoJfQp9ChqxCQoJc3RhdGUuZ25vEqMJcGFja2FnZSBsYXVuY2hwYWQKCmltcG9ydCAoCgkiZXJyb3JzIgoKCV8gImduby5sYW5kL3IvZ25vc3dhcC9yYmFjL3YxIiAvLyBpbml0aWFsaXplIHJlYWRhYmxlIGNvbnRyYWN0IHJvbGUocykKCgkiZ25vLmxhbmQvcC9nbm9zd2FwL3N0b3JlL3YxIgoJImduby5sYW5kL3AvZ25vc3dhcC92ZXJzaW9uX21hbmFnZXIvdjEiCikKCnZhciAoCglrdlN0b3JlIHN0b3JlLktWU3RvcmUKCgl2ZXJzaW9uTWFuYWdlciB2ZXJzaW9uX21hbmFnZXIuVmVyc2lvbk1hbmFnZXIKCWltcGxlbWVudGF0aW9uIElMYXVuY2hwYWQKKQoKZnVuYyBpbml0KGN1ciByZWFsbSkgewoJLy8gQ3JlYXRlIGEgbmV3IEtWIHN0b3JlIGluc3RhbmNlIGZvciB0aGlzIGRvbWFpbgoJa3ZTdG9yZSA9IHN0b3JlLk5ld0tWU3RvcmUoY3VyLkFkZHJlc3MoKSkKCgkvLyBJbml0aWFsaXplIHRoZSBpbml0aWFsaXplcnMgbWFwIHRvIHN0b3JlIGltcGxlbWVudGF0aW9uIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbnMKCXZlcnNpb25NYW5hZ2VyID0gdmVyc2lvbl9tYW5hZ2VyLk5ld1ZlcnNpb25NYW5hZ2VyKAoJCWN1ci5Qa2dQYXRoKCksCgkJa3ZTdG9yZSwKCQlpbml0aWFsaXplRG9tYWluU3RvcmUsCgkpCgoJaW1wbGVtZW50YXRpb24gPSBuaWwKfQoKZnVuYyBpbml0aWFsaXplRG9tYWluU3RvcmUoXyBpbnQsIHJsbSByZWFsbSwga3ZTdG9yZSBzdG9yZS5LVlN0b3JlKSBhbnkgewoJcmV0dXJuIE5ld0xhdW5jaHBhZFN0b3JlKGt2U3RvcmUpCn0KCmZ1bmMgZ2V0SW1wbGVtZW50YXRpb24oKSBJTGF1bmNocGFkIHsKCWlmIGltcGxlbWVudGF0aW9uID09IG5pbCB7CgkJcGFuaWMoImltcGxlbWVudGF0aW9uIGlzIG5vdCBpbml0aWFsaXplZCIpCgl9CgoJcmV0dXJuIGltcGxlbWVudGF0aW9uCn0KCmZ1bmMgdXBkYXRlSW1wbGVtZW50YXRpb24oKSBlcnJvciB7CglyZXN1bHQgOj0gdmVyc2lvbk1hbmFnZXIuR2V0Q3VycmVudEltcGxlbWVudGF0aW9uKCkKCWlmIHJlc3VsdCA9PSBuaWwgewoJCXJldHVybiBlcnJvcnMuTmV3KCJpbXBsZW1lbnRhdGlvbiBpcyBub3QgaW5pdGlhbGl6ZWQiKQoJfQoKCWltcGwsIG9rIDo9IHJlc3VsdC4oSUxhdW5jaHBhZCkKCWlmICFvayB7CgkJcmV0dXJuIGVycm9ycy5OZXcoImltcGwgaXMgbm90IGFuIElMYXVuY2hwYWQiKQoJfQoKCWltcGxlbWVudGF0aW9uID0gaW1wbAoKCXJldHVybiBuaWwKfQoa4lkKCXN0b3JlLmdubxLUWXBhY2thZ2UgbGF1bmNocGFkCgppbXBvcnQgKAoJImVycm9ycyIKCSJzdHJjb252IgoKCSJnbm8ubGFuZC9wL2dub3N3YXAvc3RvcmUvdjEiCglicHRyZWUgImduby5sYW5kL3AvbnQvYnB0cmVlL3YwIgoJdWZtdCAiZ25vLmxhbmQvcC9udC91Zm10L3YwIgopCgovLyBOZXdCUFRyZWVOIGFsbG9jYXRlcyBhIEJQLXRyZWUgdW5kZXIgL3IvZ25vc3dhcC9sYXVuY2hwYWQncyByZWFsbSBjb250ZXh0Ci8vICh0aGUgcmVhbG0gdGhhdCBkZWNsYXJlcyBQcm9qZWN0L0RlcG9zaXQvUmV3YXJkTWFuYWdlcikuIFRoZSB0cmVlJ3MgUGtnSUQgaXMKLy8gdGhlcmVmb3JlIC9yL2dub3N3YXAvbGF1bmNocGFkLCBtYXRjaGluZyB0aGUgZG9tYWluIHZhbHVlcyBpdCBzdG9yZXMsIHNvCi8vIHRyZWUuU2V0IGxlYWYtc2xvdCB3cml0ZXMgY2xlYXIgdGhlIHJlYWRvbmx5LXRhaW50IGdhdGUgcmVnYXJkbGVzcyBvZiB3aGljaAovLyByZWFsbSAobGF1bmNocGFkL3YxLCBtb2NrLCB0ZXN0cykgY2FsbHMgU2V0LiBJbXBsZW1lbnRhdGlvbnMsIG1vY2tzLCBhbmQKLy8gdGVzdHMgbXVzdCBhbGxvY2F0ZSBsYXVuY2hwYWQgdHJlZXMgdGhyb3VnaCBoZXJlIHJhdGhlciB0aGFuIGNhbGxpbmcKLy8gYnB0cmVlLk5ld0JQVHJlZU4gZGlyZWN0bHkgaW4gdGhlaXIgb3duIHJlYWxtLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gZmFub3V0OiBicmFuY2hpbmcgZmFjdG9yIHBhc3NlZCB0byB0aGUgQlAtdHJlZSBjb25zdHJ1Y3Rvci4KLy8KLy8gUmV0dXJuczoKLy8gICAtIHRyZWU6IG5ldyBCUC10cmVlIGFsbG9jYXRlZCB1bmRlciB0aGUgbGF1bmNocGFkIHJlYWxtJ3MgcGFja2FnZSBjb250ZXh0LgpmdW5jIE5ld0JQVHJlZU4oZmFub3V0IGludCkgKmJwdHJlZS5CUFRyZWUgewoJcmV0dXJuIGJwdHJlZS5OZXdCUFRyZWVOKGZhbm91dCkKfQoKdHlwZSBTdG9yZUtleSBzdHJpbmcKCi8vIFN0cmluZyByZXR1cm5zIHRoZSB0ZXh0dWFsIGtleSByZXByZXNlbnRlZCBieSB0aGlzIFN0b3JlS2V5LgovLwovLyBSZXR1cm5zOgovLyAgIC0ga2V5OiBzdG9yZSBrZXkgc3RyaW5nIHVzZWQgYnkgdGhlIEtWIHN0b3JlLgpmdW5jIChzIFN0b3JlS2V5KSBTdHJpbmcoKSBzdHJpbmcgewoJcmV0dXJuIHN0cmluZyhzKQp9Cgpjb25zdCAoCglTdG9yZUtleVByb2plY3RzICAgICAgICAgICAgICAgICAgU3RvcmVLZXkgPSAicHJvamVjdHMiICAgICAgICAgICAgICAgICAgLy8gUHJvamVjdHMgdHJlZQoJU3RvcmVLZXlQcm9qZWN0UmVjaXBpZW50cyAgICAgICAgIFN0b3JlS2V5ID0gInByb2plY3RSZWNpcGllbnRzIiAgICAgICAgIC8vIFJlY2lwaWVudCBtZW1iZXJzaGlwIHRyZWUKCVN0b3JlS2V5UHJvamVjdFRpZXJSZXdhcmRNYW5hZ2VycyBTdG9yZUtleSA9ICJwcm9qZWN0VGllclJld2FyZE1hbmFnZXJzIiAvLyBQcm9qZWN0IHRpZXIgcmV3YXJkIG1hbmFnZXJzIHRyZWUKCVN0b3JlS2V5RGVwb3NpdENvdW50ZXIgICAgICAgICAgICBTdG9yZUtleSA9ICJkZXBvc2l0Q291bnRlciIgICAgICAgICAgICAvLyBEZXBvc2l0IGNvdW50ZXIKCVN0b3JlS2V5RGVwb3NpdHMgICAgICAgICAgICAgICAgICBTdG9yZUtleSA9ICJkZXBvc2l0cyIgICAgICAgICAgICAgICAgICAvLyBEZXBvc2l0cyB0cmVlCglTdG9yZUtleVRvdGFsR05TU3Rha2VkQW1vdW50ICAgICAgU3RvcmVLZXkgPSAidG90YWxHTlNTdGFrZWRBbW91bnQiICAgICAgLy8gVG90YWwgYWN0aXZlIGxhdW5jaHBhZCBHTlMgc3Rha2UKKQoKdHlwZSBsYXVuY2hwYWRTdG9yZSBzdHJ1Y3QgewoJa3ZTdG9yZSBzdG9yZS5LVlN0b3JlCn0KCi8vIEhhc1Byb2plY3RzS2V5IGNoZWNrcyBpZiB0aGUgcHJvamVjdHMga2V5IGV4aXN0cyBpbiB0aGUgc3RvcmUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBleGlzdHM6IHRydWUgd2hlbiB0aGUgcHJvamVjdHMgdHJlZSBrZXkgaXMgcHJlc2VudCBpbiB0aGUgS1Ygc3RvcmUuCmZ1bmMgKHMgKmxhdW5jaHBhZFN0b3JlKSBIYXNQcm9qZWN0c0tleSgpIGJvb2wgewoJcmV0dXJuIHMua3ZTdG9yZS5IYXMoU3RvcmVLZXlQcm9qZWN0cy5TdHJpbmcoKSkKfQoKLy8gR2V0UHJvamVjdHMgcmV0cmlldmVzIHRoZSBwcm9qZWN0cyB0cmVlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcHJvamVjdHM6IHN0b3JlZCBwcm9qZWN0cyBCUC10cmVlIGtleWVkIGJ5IHByb2plY3QgSUQ7IHRoZSBtZXRob2QgcGFuaWNzIGlmIHRoZSBrZXkgaXMgbWlzc2luZyBvciBoYXMgdGhlIHdyb25nIHR5cGUuCmZ1bmMgKHMgKmxhdW5jaHBhZFN0b3JlKSBHZXRQcm9qZWN0cygpICpicHRyZWUuQlBUcmVlIHsKCXJlc3VsdCwgZXJyIDo9IHMua3ZTdG9yZS5HZXQoU3RvcmVLZXlQcm9qZWN0cy5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCglwcm9qZWN0cywgb2sgOj0gcmVzdWx0LigqYnB0cmVlLkJQVHJlZSkKCWlmICFvayB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJmYWlsZWQgdG8gY2FzdCByZXN1bHQgdG8gKmJwdHJlZS5CUFRyZWU6ICVUIiwgcmVzdWx0KSkKCX0KCglyZXR1cm4gcHJvamVjdHMKfQoKLy8gU2V0UHJvamVjdHMgc3RvcmVzIHRoZSBwcm9qZWN0cyB0cmVlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogY3Jvc3MtY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMC4KLy8gICAtIHJsbTogcHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGJlIGN1cnJlbnQgKGBybG0uSXNDdXJyZW50KClgKSwgb3RoZXJ3aXNlIHRoZSB3cml0ZSByZXR1cm5zIEVyclNwb29mZWRSZWFsbS4KLy8gICAtIHByb2plY3RzOiBwcm9qZWN0cyBCUC10cmVlIHRvIHBlcnNpc3QgdW5kZXIgdGhlIHByb2plY3RzIHN0b3JlIGtleS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGVycjogbmlsIHdoZW4gdGhlIHRyZWUgaXMgc3RvcmVkOyBub24tbmlsIGZvciBhIHNwb29mZWQgcmVhbG0gb3IgYW4gdW5kZXJseWluZyBLVi1zdG9yZSB3cml0ZSBmYWlsdXJlLgpmdW5jIChzICpsYXVuY2hwYWRTdG9yZSkgU2V0UHJvamVjdHMoXyBpbnQsIHJsbSByZWFsbSwgcHJvamVjdHMgKmJwdHJlZS5CUFRyZWUpIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyclNwb29mZWRSZWFsbSkKCX0KCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5UHJvamVjdHMuU3RyaW5nKCksIHByb2plY3RzKQp9CgovLyBIYXNQcm9qZWN0UmVjaXBpZW50c0tleSBjaGVja3MgaWYgdGhlIHJlY2lwaWVudCBtZW1iZXJzaGlwIHRyZWUgZXhpc3RzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXhpc3RzOiB0cnVlIHdoZW4gdGhlIHByb2plY3QtcmVjaXBpZW50IG1lbWJlcnNoaXAga2V5IGlzIHByZXNlbnQgaW4gdGhlIEtWIHN0b3JlLgpmdW5jIChzICpsYXVuY2hwYWRTdG9yZSkgSGFzUHJvamVjdFJlY2lwaWVudHNLZXkoKSBib29sIHsKCXJldHVybiBzLmt2U3RvcmUuSGFzKFN0b3JlS2V5UHJvamVjdFJlY2lwaWVudHMuU3RyaW5nKCkpCn0KCi8vIEdldFByb2plY3RSZWNpcGllbnRzIHJldHJpZXZlcyB0aGUgcmVjaXBpZW50IGFkZHJlc3MgbWVtYmVyc2hpcCB0cmVlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcmVjaXBpZW50czogc3RvcmVkIHJlY2lwaWVudC1tZW1iZXJzaGlwIEJQLXRyZWUga2V5ZWQgYnkgYWRkcmVzcyBzdHJpbmc7IHRoZSBtZXRob2QgcGFuaWNzIGlmIHRoZSBrZXkgaXMgbWlzc2luZyBvciBoYXMgdGhlIHdyb25nIHR5cGUuCmZ1bmMgKHMgKmxhdW5jaHBhZFN0b3JlKSBHZXRQcm9qZWN0UmVjaXBpZW50cygpICpicHRyZWUuQlBUcmVlIHsKCXJlc3VsdCwgZXJyIDo9IHMua3ZTdG9yZS5HZXQoU3RvcmVLZXlQcm9qZWN0UmVjaXBpZW50cy5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCglyZWNpcGllbnRzLCBvayA6PSByZXN1bHQuKCpicHRyZWUuQlBUcmVlKQoJaWYgIW9rIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoImZhaWxlZCB0byBjYXN0IHJlc3VsdCB0byAqYnB0cmVlLkJQVHJlZTogJVQiLCByZXN1bHQpKQoJfQoKCXJldHVybiByZWNpcGllbnRzCn0KCi8vIFNldFByb2plY3RSZWNpcGllbnRzIHN0b3JlcyB0aGUgcmVjaXBpZW50IG1lbWJlcnNoaXAgdHJlZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IGNyb3NzLWNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAuCi8vICAgLSBybG06IHByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgaXQgbXVzdCBiZSBjdXJyZW50IChgcmxtLklzQ3VycmVudCgpYCksIG90aGVyd2lzZSB0aGUgd3JpdGUgcmV0dXJucyBFcnJTcG9vZmVkUmVhbG0uCi8vICAgLSByZWNpcGllbnRzOiByZWNpcGllbnQtbWVtYmVyc2hpcCBCUC10cmVlIHRvIHBlcnNpc3QuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnI6IG5pbCB3aGVuIHRoZSB0cmVlIGlzIHN0b3JlZDsgbm9uLW5pbCBmb3IgYSBzcG9vZmVkIHJlYWxtIG9yIGFuIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZmFpbHVyZS4KZnVuYyAocyAqbGF1bmNocGFkU3RvcmUpIFNldFByb2plY3RSZWNpcGllbnRzKF8gaW50LCBybG0gcmVhbG0sIHJlY2lwaWVudHMgKmJwdHJlZS5CUFRyZWUpIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyclNwb29mZWRSZWFsbSkKCX0KCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5UHJvamVjdFJlY2lwaWVudHMuU3RyaW5nKCksIHJlY2lwaWVudHMpCn0KCi8vIEhhc1Byb2plY3RUaWVyUmV3YXJkTWFuYWdlcnNLZXkgY2hlY2tzIGlmIHRoZSBwcm9qZWN0IHRpZXIgcmV3YXJkIG1hbmFnZXJzIGtleSBleGlzdHMgaW4gdGhlIHN0b3JlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXhpc3RzOiB0cnVlIHdoZW4gdGhlIHByb2plY3QtdGllciByZXdhcmQtbWFuYWdlciBrZXkgaXMgcHJlc2VudCBpbiB0aGUgS1Ygc3RvcmUuCmZ1bmMgKHMgKmxhdW5jaHBhZFN0b3JlKSBIYXNQcm9qZWN0VGllclJld2FyZE1hbmFnZXJzS2V5KCkgYm9vbCB7CglyZXR1cm4gcy5rdlN0b3JlLkhhcyhTdG9yZUtleVByb2plY3RUaWVyUmV3YXJkTWFuYWdlcnMuU3RyaW5nKCkpCn0KCi8vIEdldFByb2plY3RUaWVyUmV3YXJkTWFuYWdlcnMgcmV0cmlldmVzIHRoZSBwcm9qZWN0IHRpZXIgcmV3YXJkIG1hbmFnZXJzIHRyZWUuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBtYW5hZ2Vyczogc3RvcmVkIHJld2FyZC1tYW5hZ2VyIEJQLXRyZWUga2V5ZWQgYnkgcHJvamVjdC10aWVyIElEOyB0aGUgbWV0aG9kIHBhbmljcyBpZiB0aGUga2V5IGlzIG1pc3Npbmcgb3IgaGFzIHRoZSB3cm9uZyB0eXBlLgpmdW5jIChzICpsYXVuY2hwYWRTdG9yZSkgR2V0UHJvamVjdFRpZXJSZXdhcmRNYW5hZ2VycygpICpicHRyZWUuQlBUcmVlIHsKCXJlc3VsdCwgZXJyIDo9IHMua3ZTdG9yZS5HZXQoU3RvcmVLZXlQcm9qZWN0VGllclJld2FyZE1hbmFnZXJzLlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCW1hbmFnZXJzLCBvayA6PSByZXN1bHQuKCpicHRyZWUuQlBUcmVlKQoJaWYgIW9rIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoImZhaWxlZCB0byBjYXN0IHJlc3VsdCB0byAqYnB0cmVlLkJQVHJlZTogJVQiLCByZXN1bHQpKQoJfQoKCXJldHVybiBtYW5hZ2Vycwp9CgovLyBTZXRQcm9qZWN0VGllclJld2FyZE1hbmFnZXJzIHN0b3JlcyB0aGUgcHJvamVjdCB0aWVyIHJld2FyZCBtYW5hZ2VycyB0cmVlLgovLwovLyBQYXJhbWV0ZXJzOgovLyAgIC0gXzogY3Jvc3MtY2FsbCBkaXNjcmltaW5hdG9yOyBjYWxsZXJzIHBhc3MgMC4KLy8gICAtIHJsbTogcHJvcGFnYXRlZCByZWFsbSBjb250ZXh0OyBpdCBtdXN0IGJlIGN1cnJlbnQgKGBybG0uSXNDdXJyZW50KClgKSwgb3RoZXJ3aXNlIHRoZSB3cml0ZSByZXR1cm5zIEVyclNwb29mZWRSZWFsbS4KLy8gICAtIG1hbmFnZXJzOiBwcm9qZWN0LXRpZXIgcmV3YXJkLW1hbmFnZXIgQlAtdHJlZSB0byBwZXJzaXN0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyOiBuaWwgd2hlbiB0aGUgdHJlZSBpcyBzdG9yZWQ7IG5vbi1uaWwgZm9yIGEgc3Bvb2ZlZCByZWFsbSBvciBhbiB1bmRlcmx5aW5nIEtWLXN0b3JlIHdyaXRlIGZhaWx1cmUuCmZ1bmMgKHMgKmxhdW5jaHBhZFN0b3JlKSBTZXRQcm9qZWN0VGllclJld2FyZE1hbmFnZXJzKF8gaW50LCBybG0gcmVhbG0sIG1hbmFnZXJzICpicHRyZWUuQlBUcmVlKSBlcnJvciB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gZXJyb3JzLk5ldyhFcnJTcG9vZmVkUmVhbG0pCgl9CgoJcmV0dXJuIHMua3ZTdG9yZS5TZXQoMCwgcmxtLCBTdG9yZUtleVByb2plY3RUaWVyUmV3YXJkTWFuYWdlcnMuU3RyaW5nKCksIG1hbmFnZXJzKQp9CgovLyBIYXNEZXBvc2l0Q291bnRlclN0b3JlS2V5IGNoZWNrcyBpZiB0aGUgZGVwb3NpdCBjb3VudGVyIGtleSBleGlzdHMgaW4gdGhlIHN0b3JlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXhpc3RzOiB0cnVlIHdoZW4gdGhlIGRlcG9zaXQtY291bnRlciBrZXkgaXMgcHJlc2VudCBpbiB0aGUgS1Ygc3RvcmUuCmZ1bmMgKHMgKmxhdW5jaHBhZFN0b3JlKSBIYXNEZXBvc2l0Q291bnRlclN0b3JlS2V5KCkgYm9vbCB7CglyZXR1cm4gcy5rdlN0b3JlLkhhcyhTdG9yZUtleURlcG9zaXRDb3VudGVyLlN0cmluZygpKQp9CgovLyBHZXREZXBvc2l0Q291bnRlciByZXRyaWV2ZXMgdGhlIGRlcG9zaXQgY291bnRlci4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGNvdW50ZXI6IHN0b3JlZCBkZXBvc2l0IGNvdW50ZXI7IHRoZSBtZXRob2QgcGFuaWNzIGlmIHRoZSBrZXkgaXMgbWlzc2luZyBvciBoYXMgdGhlIHdyb25nIHR5cGUuCmZ1bmMgKHMgKmxhdW5jaHBhZFN0b3JlKSBHZXREZXBvc2l0Q291bnRlcigpICpDb3VudGVyIHsKCXJlc3VsdCwgZXJyIDo9IHMua3ZTdG9yZS5HZXQoU3RvcmVLZXlEZXBvc2l0Q291bnRlci5TdHJpbmcoKSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgljb3VudGVyLCBvayA6PSByZXN1bHQuKCpDb3VudGVyKQoJaWYgIW9rIHsKCQlwYW5pYyh1Zm10LlNwcmludGYoImZhaWxlZCB0byBjYXN0IHJlc3VsdCB0byBDb3VudGVyOiAlVCIsIHJlc3VsdCkpCgl9CgoJcmV0dXJuIGNvdW50ZXIKfQoKLy8gU2V0RGVwb3NpdENvdW50ZXIgc3RvcmVzIHRoZSBkZXBvc2l0IGNvdW50ZXIgdW5kZXIgaXRzIGRlZGljYXRlZCBrZXkuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBjcm9zcy1jYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwLgovLyAgIC0gcmxtOiBwcm9wYWdhdGVkIHJlYWxtIGNvbnRleHQ7IGl0IG11c3QgYmUgY3VycmVudCAoYHJsbS5Jc0N1cnJlbnQoKWApLCBvdGhlcndpc2UgdGhlIHdyaXRlIHJldHVybnMgRXJyU3Bvb2ZlZFJlYWxtLgovLyAgIC0gY291bnRlcjogZGVwb3NpdCBjb3VudGVyIHRvIHBlcnNpc3QuCi8vCi8vIFJldHVybnM6Ci8vICAgLSBlcnI6IG5pbCB3aGVuIHRoZSBjb3VudGVyIGlzIHN0b3JlZDsgbm9uLW5pbCBmb3IgYSBzcG9vZmVkIHJlYWxtIG9yIGFuIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZmFpbHVyZS4KZnVuYyAocyAqbGF1bmNocGFkU3RvcmUpIFNldERlcG9zaXRDb3VudGVyKF8gaW50LCBybG0gcmVhbG0sIGNvdW50ZXIgKkNvdW50ZXIpIGVycm9yIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXJldHVybiBlcnJvcnMuTmV3KEVyclNwb29mZWRSZWFsbSkKCX0KCglyZXR1cm4gcy5rdlN0b3JlLlNldCgwLCBybG0sIFN0b3JlS2V5RGVwb3NpdENvdW50ZXIuU3RyaW5nKCksIGNvdW50ZXIpCn0KCi8vIE5leHREZXBvc2l0SUQgaW5jcmVtZW50cyB0aGUgc3RvcmVkIGRlcG9zaXQgY291bnRlciBhbmQgZm9ybWF0cyB0aGUgbmV3IHZhbHVlIGFzIGEgZGVjaW1hbCBJRC4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGRlcG9zaXRJRDogbmV4dCBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgZGVwb3NpdCBJRCBhcyBhIGRlY2ltYWwgc3RyaW5nOyB0aGUgY291bnRlciBpcyBpbmNyZW1lbnRlZCBiZWZvcmUgZm9ybWF0dGluZy4KZnVuYyAocyAqbGF1bmNocGFkU3RvcmUpIE5leHREZXBvc2l0SUQoKSBzdHJpbmcgewoJY291bnRlciA6PSBzLkdldERlcG9zaXRDb3VudGVyKCkKCglyZXR1cm4gc3RyY29udi5Gb3JtYXRJbnQoY291bnRlci5OZXh0KCksIDEwKQp9CgovLyBIYXNEZXBvc2l0c0tleSBjaGVja3MgaWYgdGhlIGRlcG9zaXRzIGtleSBleGlzdHMgaW4gdGhlIHN0b3JlLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXhpc3RzOiB0cnVlIHdoZW4gdGhlIGRlcG9zaXRzIHRyZWUga2V5IGlzIHByZXNlbnQgaW4gdGhlIEtWIHN0b3JlLgpmdW5jIChzICpsYXVuY2hwYWRTdG9yZSkgSGFzRGVwb3NpdHNLZXkoKSBib29sIHsKCXJldHVybiBzLmt2U3RvcmUuSGFzKFN0b3JlS2V5RGVwb3NpdHMuU3RyaW5nKCkpCn0KCi8vIEdldERlcG9zaXRzIHJldHJpZXZlcyB0aGUgZGVwb3NpdHMgdHJlZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGRlcG9zaXRzOiBzdG9yZWQgZGVwb3NpdHMgQlAtdHJlZSBrZXllZCBieSBkZXBvc2l0IElEOyB0aGUgbWV0aG9kIHBhbmljcyBpZiB0aGUga2V5IGlzIG1pc3Npbmcgb3IgaGFzIHRoZSB3cm9uZyB0eXBlLgpmdW5jIChzICpsYXVuY2hwYWRTdG9yZSkgR2V0RGVwb3NpdHMoKSAqYnB0cmVlLkJQVHJlZSB7CglyZXN1bHQsIGVyciA6PSBzLmt2U3RvcmUuR2V0KFN0b3JlS2V5RGVwb3NpdHMuU3RyaW5nKCkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgoJZGVwb3NpdHMsIG9rIDo9IHJlc3VsdC4oKmJwdHJlZS5CUFRyZWUpCglpZiAhb2sgewoJCXBhbmljKHVmbXQuU3ByaW50ZigiZmFpbGVkIHRvIGNhc3QgcmVzdWx0IHRvICpicHRyZWUuQlBUcmVlOiAlVCIsIHJlc3VsdCkpCgl9CgoJcmV0dXJuIGRlcG9zaXRzCn0KCi8vIFNldERlcG9zaXRzIHN0b3JlcyB0aGUgZGVwb3NpdHMgdHJlZS4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIF86IGNyb3NzLWNhbGwgZGlzY3JpbWluYXRvcjsgY2FsbGVycyBwYXNzIDAuCi8vICAgLSBybG06IHByb3BhZ2F0ZWQgcmVhbG0gY29udGV4dDsgaXQgbXVzdCBiZSBjdXJyZW50IChgcmxtLklzQ3VycmVudCgpYCksIG90aGVyd2lzZSB0aGUgd3JpdGUgcmV0dXJucyBFcnJTcG9vZmVkUmVhbG0uCi8vICAgLSBkZXBvc2l0czogZGVwb3NpdHMgQlAtdHJlZSB0byBwZXJzaXN0LgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyOiBuaWwgd2hlbiB0aGUgdHJlZSBpcyBzdG9yZWQ7IG5vbi1uaWwgZm9yIGEgc3Bvb2ZlZCByZWFsbSBvciBhbiB1bmRlcmx5aW5nIEtWLXN0b3JlIHdyaXRlIGZhaWx1cmUuCmZ1bmMgKHMgKmxhdW5jaHBhZFN0b3JlKSBTZXREZXBvc2l0cyhfIGludCwgcmxtIHJlYWxtLCBkZXBvc2l0cyAqYnB0cmVlLkJQVHJlZSkgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCXJldHVybiBzLmt2U3RvcmUuU2V0KDAsIHJsbSwgU3RvcmVLZXlEZXBvc2l0cy5TdHJpbmcoKSwgZGVwb3NpdHMpCn0KCi8vIEhhc1RvdGFsR05TU3Rha2VkQW1vdW50S2V5IGNoZWNrcyBpZiB0aGUgdG90YWwgYWN0aXZlIEdOUyBzdGFrZSBrZXkgZXhpc3RzIGluIHRoZSBzdG9yZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGV4aXN0czogdHJ1ZSB3aGVuIHRoZSB0b3RhbC1HTlMtc3Rha2VkIGFtb3VudCBrZXkgaXMgcHJlc2VudCBpbiB0aGUgS1Ygc3RvcmUuCmZ1bmMgKHMgKmxhdW5jaHBhZFN0b3JlKSBIYXNUb3RhbEdOU1N0YWtlZEFtb3VudEtleSgpIGJvb2wgewoJcmV0dXJuIHMua3ZTdG9yZS5IYXMoU3RvcmVLZXlUb3RhbEdOU1N0YWtlZEFtb3VudC5TdHJpbmcoKSkKfQoKLy8gR2V0VG90YWxHTlNTdGFrZWRBbW91bnQgcmV0cmlldmVzIHRoZSB0b3RhbCBhY3RpdmUgR05TIGFtb3VudCB0cmFja2VkIGJ5IHRoZSBzdG9yZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGFtb3VudDogdG90YWwgY3VycmVudGx5IHN0YWtlZCBHTlMgaW4gYmFzZSB1bml0czsgdGhlIG1ldGhvZCBwYW5pY3MgaWYgdGhlIGtleSBpcyBtaXNzaW5nIG9yIGhhcyB0aGUgd3JvbmcgdHlwZS4KZnVuYyAocyAqbGF1bmNocGFkU3RvcmUpIEdldFRvdGFsR05TU3Rha2VkQW1vdW50KCkgaW50NjQgewoJcmVzdWx0LCBlcnIgOj0gcy5rdlN0b3JlLkdldChTdG9yZUtleVRvdGFsR05TU3Rha2VkQW1vdW50LlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCWFtb3VudCwgb2sgOj0gcmVzdWx0LihpbnQ2NCkKCWlmICFvayB7CgkJcGFuaWModWZtdC5TcHJpbnRmKCJmYWlsZWQgdG8gY2FzdCByZXN1bHQgdG8gaW50NjQ6ICVUIiwgcmVzdWx0KSkKCX0KCglyZXR1cm4gYW1vdW50Cn0KCi8vIFNldFRvdGFsR05TU3Rha2VkQW1vdW50IHN0b3JlcyB0aGUgdG90YWwgYWN0aXZlIEdOUyBhbW91bnQuCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBfOiBjcm9zcy1jYWxsIGRpc2NyaW1pbmF0b3I7IGNhbGxlcnMgcGFzcyAwLgovLyAgIC0gcmxtOiBwcm9wYWdhdGVkIHJlYWxtIGNvbnRleHQ7IGl0IG11c3QgYmUgY3VycmVudCAoYHJsbS5Jc0N1cnJlbnQoKWApLCBvdGhlcndpc2UgdGhlIHdyaXRlIHJldHVybnMgRXJyU3Bvb2ZlZFJlYWxtLgovLyAgIC0gYW1vdW50OiB0b3RhbCBjdXJyZW50bHkgc3Rha2VkIEdOUyBpbiBiYXNlIHVuaXRzLgovLwovLyBSZXR1cm5zOgovLyAgIC0gZXJyOiBuaWwgd2hlbiB0aGUgYW1vdW50IGlzIHN0b3JlZDsgbm9uLW5pbCBmb3IgYSBzcG9vZmVkIHJlYWxtIG9yIGFuIHVuZGVybHlpbmcgS1Ytc3RvcmUgd3JpdGUgZmFpbHVyZS4KZnVuYyAocyAqbGF1bmNocGFkU3RvcmUpIFNldFRvdGFsR05TU3Rha2VkQW1vdW50KF8gaW50LCBybG0gcmVhbG0sIGFtb3VudCBpbnQ2NCkgZXJyb3IgewoJaWYgIXJsbS5Jc0N1cnJlbnQoKSB7CgkJcmV0dXJuIGVycm9ycy5OZXcoRXJyU3Bvb2ZlZFJlYWxtKQoJfQoKCXJldHVybiBzLmt2U3RvcmUuU2V0KDAsIHJsbSwgU3RvcmVLZXlUb3RhbEdOU1N0YWtlZEFtb3VudC5TdHJpbmcoKSwgYW1vdW50KQp9CgovLyBOZXdMYXVuY2hwYWRTdG9yZSBjcmVhdGVzIGEgbmV3IGxhdW5jaHBhZCBzdG9yZSBpbnN0YW5jZSB3aXRoIHRoZSBwcm92aWRlZCBLViBzdG9yZS4KLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSB1cGdyYWRlIHN5c3RlbSB0byBjcmVhdGUgc3RvcmFnZSBpbnN0YW5jZXMgZm9yIGVhY2ggaW1wbGVtZW50YXRpb24uCi8vCi8vIFBhcmFtZXRlcnM6Ci8vICAgLSBrdlN0b3JlOiBrZXktdmFsdWUgc3RvcmUgdXNlZCB0byBwZXJzaXN0IGxhdW5jaHBhZCBzdGF0ZS4KLy8KLy8gUmV0dXJuczoKLy8gICAtIGxhdW5jaHBhZFN0b3JlOiBzdG9yYWdlIGltcGxlbWVudGF0aW9uIGJhY2tlZCBieSBrdlN0b3JlLgpmdW5jIE5ld0xhdW5jaHBhZFN0b3JlKGt2U3RvcmUgc3RvcmUuS1ZTdG9yZSkgSUxhdW5jaHBhZFN0b3JlIHsKCXJldHVybiAmbGF1bmNocGFkU3RvcmV7CgkJa3ZTdG9yZToga3ZTdG9yZSwKCX0KfQoa0NcBCgl0eXBlcy5nbm8SwdcBcGFja2FnZSBsYXVuY2hwYWQKCmltcG9ydCAoCgkiZ25vLmxhbmQvcC9nbm9zd2FwL3VpbnQyNTYvdjEiCglyb3RyZWUgImduby5sYW5kL3AvbnQvYnB0cmVlL3JvdHJlZS92MCIKCWJwdHJlZSAiZ25vLmxhbmQvcC9udC9icHRyZWUvdjAiCikKCnR5cGUgSUxhdW5jaHBhZCBpbnRlcmZhY2UgewoJSUxhdW5jaHBhZFByb2plY3QKCUlMYXVuY2hwYWREZXBvc2l0CglJTGF1bmNocGFkR2V0dGVyCglSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZwp9Cgp0eXBlIElMYXVuY2hwYWRQcm9qZWN0IGludGVyZmFjZSB7CgkvLyBDcmVhdGVQcm9qZWN0IGNyZWF0ZXMgYSBwcm9qZWN0IGFuZCBpdHMgcmV3YXJkIHRpZXJzIGluIHRoZSBjdXJyZW50IGxhdW5jaHBhZCByZWFsbS4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IE5vbmNyb3NzaW5nIGltcGxlbWVudGF0aW9uLWNhbGwgZGlzY3JpbWluYXRvcjsgcGFzcyAwLgoJLy8gICAtIHJsbTogQ3VycmVudCByZWFsbSBjb250ZXh0IGZvcndhcmRlZCB1bmNoYW5nZWQgYnkgdGhlIGxhdW5jaHBhZCBwcm94eS4KCS8vICAgLSBuYW1lOiBodW1hbi1yZWFkYWJsZSBwcm9qZWN0IG5hbWUuCgkvLyAgIC0gdG9rZW5QYXRoOiB0b2tlbiBwYXRoIHdob3NlIHRva2VucyBhcmUgZGlzdHJpYnV0ZWQgYXMgcHJvamVjdCByZXdhcmRzLgoJLy8gICAtIHJlY2lwaWVudDogYWRkcmVzcyBhdXRob3JpemVkIHRvIHJlY2VpdmUgcHJvamVjdCByZXdhcmRzIGFuZCBwcm9qZWN0IHByb2NlZWRzLgoJLy8gICAtIGRlcG9zaXRBbW91bnQ6IHRvdGFsIHJld2FyZC10b2tlbiBhbW91bnQgYWxsb2NhdGVkIHRvIHRoZSBwcm9qZWN0LgoJLy8gICAtIGNvbmRpdGlvblRva2Vuczogb3B0aW9uYWwgYCpQQUQqYC1zZXBhcmF0ZWQgdG9rZW4gcGF0aHMgcmVxdWlyZWQgZm9yIGRlcG9zaXRzLgoJLy8gICAtIGNvbmRpdGlvbkFtb3VudHM6IG9wdGlvbmFsIGAqUEFEKmAtc2VwYXJhdGVkIHJlcXVpcmVkIGFtb3VudHMgbWF0Y2hpbmcgY29uZGl0aW9uVG9rZW5zLgoJLy8gICAtIHRpZXIzMFJhdGlvOiByZXdhcmQgYWxsb2NhdGlvbiByYXRpbyBmb3IgdGhlIDMwLWRheSB0aWVyLgoJLy8gICAtIHRpZXI5MFJhdGlvOiByZXdhcmQgYWxsb2NhdGlvbiByYXRpbyBmb3IgdGhlIDkwLWRheSB0aWVyLgoJLy8gICAtIHRpZXIxODBSYXRpbzogcmV3YXJkIGFsbG9jYXRpb24gcmF0aW8gZm9yIHRoZSAxODAtZGF5IHRpZXIuCgkvLyAgIC0gc3RhcnRUaW1lOiBVbml4IHRpbWVzdGFtcCBhdCB3aGljaCBwcm9qZWN0IHJld2FyZCBkaXN0cmlidXRpb24gc3RhcnRzLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gcHJvamVjdElEOiBpZGVudGlmaWVyIGFzc2lnbmVkIHRvIHRoZSBuZXdseSBjcmVhdGVkIHByb2plY3QuCglDcmVhdGVQcm9qZWN0KAoJCV8gaW50LAoJCXJsbSByZWFsbSwKCQluYW1lIHN0cmluZywKCQl0b2tlblBhdGggc3RyaW5nLAoJCXJlY2lwaWVudCBhZGRyZXNzLAoJCWRlcG9zaXRBbW91bnQgaW50NjQsCgkJY29uZGl0aW9uVG9rZW5zIHN0cmluZywKCQljb25kaXRpb25BbW91bnRzIHN0cmluZywKCQl0aWVyMzBSYXRpbyBpbnQ2NCwKCQl0aWVyOTBSYXRpbyBpbnQ2NCwKCQl0aWVyMTgwUmF0aW8gaW50NjQsCgkJc3RhcnRUaW1lIGludDY0LAoJKSBzdHJpbmcKCS8vIFRyYW5zZmVyTGVmdEZyb21Qcm9qZWN0QnlBZG1pbiB0cmFuc2ZlcnMgdW5yZXNlcnZlZCByZXdhcmQgdG9rZW5zIGZyb20gYW4gZW5kZWQgcHJvamVjdC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IE5vbmNyb3NzaW5nIGltcGxlbWVudGF0aW9uLWNhbGwgZGlzY3JpbWluYXRvcjsgcGFzcyAwLgoJLy8gICAtIHJsbTogQ3VycmVudCByZWFsbSBjb250ZXh0IGZvcndhcmRlZCB1bmNoYW5nZWQgYnkgdGhlIGxhdW5jaHBhZCBwcm94eS4KCS8vICAgLSBwcm9qZWN0SUQ6IGlkZW50aWZpZXIgb2YgdGhlIGVuZGVkIHByb2plY3Qgd2hvc2UgcmVtYWluaW5nIGJhbGFuY2UgaXMgdHJhbnNmZXJyZWQuCgkvLyAgIC0gcmVjaXBpZW50OiBkZXN0aW5hdGlvbiBhZGRyZXNzIGZvciB0aGUgdHJhbnNmZXJhYmxlIGJhbGFuY2UuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBhbW91bnQ6IG51bWJlciBvZiByZXdhcmQgdG9rZW5zIHRyYW5zZmVycmVkIGFmdGVyIGFjdGl2ZSBjbGFpbXMgYXJlIHJlc2VydmVkLgoJVHJhbnNmZXJMZWZ0RnJvbVByb2plY3RCeUFkbWluKF8gaW50LCBybG0gcmVhbG0sIHByb2plY3RJRCBzdHJpbmcsIHJlY2lwaWVudCBhZGRyZXNzKSBpbnQ2NAoJLy8gQ29sbGVjdFByb3RvY29sRmVlIGNvbGxlY3RzIHByb3RvY29sLWZlZSByZXdhcmRzIGFsbG9jYXRlZCB0byB0aGUgcHJvamVjdCByZWNpcGllbnQuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBOb25jcm9zc2luZyBpbXBsZW1lbnRhdGlvbi1jYWxsIGRpc2NyaW1pbmF0b3I7IHBhc3MgMC4KCS8vICAgLSBybG06IEN1cnJlbnQgcmVhbG0gY29udGV4dCBmb3J3YXJkZWQgdW5jaGFuZ2VkIGJ5IHRoZSBsYXVuY2hwYWQgcHJveHkuCglDb2xsZWN0UHJvdG9jb2xGZWUoXyBpbnQsIHJsbSByZWFsbSkKCS8vIENvbGxlY3RFbWlzc2lvblJld2FyZCBjb2xsZWN0cyBhY2N1bXVsYXRlZCBsYXVuY2hwYWQgZW1pc3Npb24gcmV3YXJkcy4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IE5vbmNyb3NzaW5nIGltcGxlbWVudGF0aW9uLWNhbGwgZGlzY3JpbWluYXRvcjsgcGFzcyAwLgoJLy8gICAtIHJsbTogQ3VycmVudCByZWFsbSBjb250ZXh0IGZvcndhcmRlZCB1bmNoYW5nZWQgYnkgdGhlIGxhdW5jaHBhZCBwcm94eS4KCUNvbGxlY3RFbWlzc2lvblJld2FyZChfIGludCwgcmxtIHJlYWxtKQoJLy8gQ29sbGVjdFByb3RvY29sRmVlUmV3YXJkIGNvbGxlY3RzIGFjY3VtdWxhdGVkIHByb3RvY29sLWZlZSByZXdhcmRzIGZvciBvbmUgdG9rZW4gcGF0aC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IE5vbmNyb3NzaW5nIGltcGxlbWVudGF0aW9uLWNhbGwgZGlzY3JpbWluYXRvcjsgcGFzcyAwLgoJLy8gICAtIHJsbTogQ3VycmVudCByZWFsbSBjb250ZXh0IGZvcndhcmRlZCB1bmNoYW5nZWQgYnkgdGhlIGxhdW5jaHBhZCBwcm94eS4KCS8vICAgLSB0b2tlblBhdGg6IHRva2VuIHBhdGggd2hvc2UgYWNjdW11bGF0ZWQgcHJvdG9jb2wtZmVlIHJld2FyZCBpcyBjb2xsZWN0ZWQuCglDb2xsZWN0UHJvdG9jb2xGZWVSZXdhcmQoXyBpbnQsIHJsbSByZWFsbSwgdG9rZW5QYXRoIHN0cmluZykKfQoKdHlwZSBJTGF1bmNocGFkRGVwb3NpdCBpbnRlcmZhY2UgewoJLy8gRGVwb3NpdEducyBjcmVhdGVzIGEgR05TIGRlcG9zaXQgaW4gdGhlIHNlbGVjdGVkIHByb2plY3QgdGllci4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IE5vbmNyb3NzaW5nIGltcGxlbWVudGF0aW9uLWNhbGwgZGlzY3JpbWluYXRvcjsgcGFzcyAwLgoJLy8gICAtIHJsbTogQ3VycmVudCByZWFsbSBjb250ZXh0IGZvcndhcmRlZCB1bmNoYW5nZWQgYnkgdGhlIGxhdW5jaHBhZCBwcm94eS4KCS8vICAgLSB0YXJnZXRQcm9qZWN0VGllcklEOiBwcm9qZWN0LXRpZXIgaWRlbnRpZmllciBpbiBge3Byb2plY3RJRH06e3RpZXJEdXJhdGlvbn1gIGZvcm0uCgkvLyAgIC0gZGVwb3NpdEFtb3VudDogYW1vdW50IG9mIEdOUyB0byBzdGFrZSBpbiB0aGUgc2VsZWN0ZWQgdGllci4KCS8vICAgLSByZWZlcnJlcjogb3B0aW9uYWwgcmVmZXJyYWwgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhlIGRlcG9zaXQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBkZXBvc2l0SUQ6IGlkZW50aWZpZXIgYXNzaWduZWQgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgZGVwb3NpdC4KCURlcG9zaXRHbnMoXyBpbnQsIHJsbSByZWFsbSwgdGFyZ2V0UHJvamVjdFRpZXJJRCBzdHJpbmcsIGRlcG9zaXRBbW91bnQgaW50NjQsIHJlZmVycmVyIHN0cmluZykgc3RyaW5nCgkvLyBDb2xsZWN0RGVwb3NpdEducyB3aXRoZHJhd3MgYSBkZXBvc2l0J3Mgc3Rha2VkIEdOUyBhZnRlciBpdHMgdGllciBwZXJtaXRzIHdpdGhkcmF3YWwuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBOb25jcm9zc2luZyBpbXBsZW1lbnRhdGlvbi1jYWxsIGRpc2NyaW1pbmF0b3I7IHBhc3MgMC4KCS8vICAgLSBybG06IEN1cnJlbnQgcmVhbG0gY29udGV4dCBmb3J3YXJkZWQgdW5jaGFuZ2VkIGJ5IHRoZSBsYXVuY2hwYWQgcHJveHkuCgkvLyAgIC0gZGVwb3NpdElEOiBpZGVudGlmaWVyIG9mIHRoZSBkZXBvc2l0IHdob3NlIEdOUyBpcyBjb2xsZWN0ZWQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBhbW91bnQ6IEdOUyBhbW91bnQgd2l0aGRyYXduIGZyb20gdGhlIGRlcG9zaXQuCgkvLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gdGhlIGRlcG9zaXQgY2Fubm90IGJlIGNvbGxlY3RlZC4KCUNvbGxlY3REZXBvc2l0R25zKF8gaW50LCBybG0gcmVhbG0sIGRlcG9zaXRJRCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpCgkvLyBDb2xsZWN0UmV3YXJkQnlEZXBvc2l0SWQgY29sbGVjdHMgdGhlIHByb2plY3QtdG9rZW4gcmV3YXJkIGVhcm5lZCBieSBhIGRlcG9zaXQuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBOb25jcm9zc2luZyBpbXBsZW1lbnRhdGlvbi1jYWxsIGRpc2NyaW1pbmF0b3I7IHBhc3MgMC4KCS8vICAgLSBybG06IEN1cnJlbnQgcmVhbG0gY29udGV4dCBmb3J3YXJkZWQgdW5jaGFuZ2VkIGJ5IHRoZSBsYXVuY2hwYWQgcHJveHkuCgkvLyAgIC0gZGVwb3NpdElEOiBpZGVudGlmaWVyIG9mIHRoZSBkZXBvc2l0IHdob3NlIHJld2FyZCBpcyBjb2xsZWN0ZWQuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBhbW91bnQ6IHByb2plY3QtdG9rZW4gcmV3YXJkIGFtb3VudCB0cmFuc2ZlcnJlZCB0byB0aGUgZGVwb3NpdG9yLgoJQ29sbGVjdFJld2FyZEJ5RGVwb3NpdElkKF8gaW50LCBybG0gcmVhbG0sIGRlcG9zaXRJRCBzdHJpbmcpIGludDY0Cn0KCnR5cGUgSUxhdW5jaHBhZEdldHRlciBpbnRlcmZhY2UgewoJLy8gR2V0UHJvamVjdHMgcmV0dXJucyBhIHJlYWQtb25seSB0cmVlIGNvbnRhaW5pbmcgcHJvamVjdHMga2V5ZWQgYnkgcHJvamVjdCBJRC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHByb2plY3RzOiByZWFkLW9ubHkgcHJvamVjdCB0cmVlIGZvciBpdGVyYXRpb24gd2l0aG91dCBtdXRhdGluZyBzdG9yZWQgc3RhdGUuCglHZXRQcm9qZWN0cygpICpyb3RyZWUuUmVhZE9ubHlUcmVlCgkvLyBHZXRQcm9qZWN0TmFtZSByZXR1cm5zIHRoZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIGEgcHJvamVjdC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHByb2plY3RJZDogaWRlbnRpZmllciBvZiB0aGUgcHJvamVjdCB0byBpbnNwZWN0LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gbmFtZTogc3RvcmVkIHByb2plY3QgbmFtZSwgb3IgYW4gZW1wdHkgc3RyaW5nIHdoZW4gbG9va3VwIGZhaWxzLgoJLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHByb2plY3RJZCBkb2VzIG5vdCBpZGVudGlmeSBhIHN0b3JlZCBwcm9qZWN0LgoJR2V0UHJvamVjdE5hbWUocHJvamVjdElkIHN0cmluZykgKHN0cmluZywgZXJyb3IpCgkvLyBHZXRQcm9qZWN0VG9rZW5QYXRoIHJldHVybnMgdGhlIHJld2FyZC10b2tlbiBwYXRoIGNvbmZpZ3VyZWQgZm9yIGEgcHJvamVjdC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHByb2plY3RJZDogaWRlbnRpZmllciBvZiB0aGUgcHJvamVjdCB0byBpbnNwZWN0LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gdG9rZW5QYXRoOiBjb25maWd1cmVkIHByb2plY3QgcmV3YXJkLXRva2VuIHBhdGgsIG9yIGFuIGVtcHR5IHN0cmluZyBvbiBsb29rdXAgZmFpbHVyZS4KCS8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBwcm9qZWN0SWQgZG9lcyBub3QgaWRlbnRpZnkgYSBzdG9yZWQgcHJvamVjdC4KCUdldFByb2plY3RUb2tlblBhdGgocHJvamVjdElkIHN0cmluZykgKHN0cmluZywgZXJyb3IpCgkvLyBHZXRQcm9qZWN0RGVwb3NpdEFtb3VudCByZXR1cm5zIHRoZSB0b3RhbCByZXdhcmQtdG9rZW4gYWxsb2NhdGlvbiBjb25maWd1cmVkIGZvciBhIHByb2plY3QuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwcm9qZWN0SWQ6IGlkZW50aWZpZXIgb2YgdGhlIHByb2plY3QgdG8gaW5zcGVjdC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGFtb3VudDogY29uZmlndXJlZCBwcm9qZWN0IHJld2FyZC10b2tlbiBhbW91bnQsIG9yIHplcm8gb24gbG9va3VwIGZhaWx1cmUuCgkvLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gcHJvamVjdElkIGRvZXMgbm90IGlkZW50aWZ5IGEgc3RvcmVkIHByb2plY3QuCglHZXRQcm9qZWN0RGVwb3NpdEFtb3VudChwcm9qZWN0SWQgc3RyaW5nKSAoaW50NjQsIGVycm9yKQoJLy8gR2V0UHJvamVjdFJlY2lwaWVudCByZXR1cm5zIHRoZSBhZGRyZXNzIGNvbmZpZ3VyZWQgdG8gcmVjZWl2ZSBhIHByb2plY3QncyByZXdhcmRzLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcHJvamVjdElkOiBpZGVudGlmaWVyIG9mIHRoZSBwcm9qZWN0IHRvIGluc3BlY3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSByZWNpcGllbnQ6IGNvbmZpZ3VyZWQgcHJvamVjdCByZWNpcGllbnQgYWRkcmVzcywgb3IgdGhlIHplcm8gYWRkcmVzcyBvbiBsb29rdXAgZmFpbHVyZS4KCS8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBwcm9qZWN0SWQgZG9lcyBub3QgaWRlbnRpZnkgYSBzdG9yZWQgcHJvamVjdC4KCUdldFByb2plY3RSZWNpcGllbnQocHJvamVjdElkIHN0cmluZykgKGFkZHJlc3MsIGVycm9yKQoJLy8gR2V0UHJvamVjdENvbmRpdGlvbiByZXR1cm5zIHRoZSBkZXBvc2l0IGNvbmRpdGlvbiBmb3Igb25lIHRva2VuIHBhdGggaW4gYSBwcm9qZWN0LgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcHJvamVjdElkOiBpZGVudGlmaWVyIG9mIHRoZSBwcm9qZWN0IHRvIGluc3BlY3QuCgkvLyAgIC0gdG9rZW5QYXRoOiB0b2tlbiBwYXRoIHdob3NlIHJlcXVpcmVkIGJhbGFuY2UgY29uZGl0aW9uIGlzIHJlcXVlc3RlZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGNvbmRpdGlvbjogY29uZmlndXJlZCB0b2tlbiBjb25kaXRpb24sIG9yIG5pbCB3aGVuIGxvb2t1cCBmYWlscy4KCS8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiB0aGUgcHJvamVjdCBvciB0b2tlbiBjb25kaXRpb24gaXMgbm90IGZvdW5kLgoJR2V0UHJvamVjdENvbmRpdGlvbihwcm9qZWN0SWQgc3RyaW5nLCB0b2tlblBhdGggc3RyaW5nKSAoKlByb2plY3RDb25kaXRpb24sIGVycm9yKQoJLy8gR2V0UHJvamVjdFRpZXJzUmF0aW9zIHJldHVybnMgcmV3YXJkIGFsbG9jYXRpb24gcmF0aW9zIGtleWVkIGJ5IHRpZXIgZHVyYXRpb24uCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwcm9qZWN0SWQ6IGlkZW50aWZpZXIgb2YgdGhlIHByb2plY3QgdG8gaW5zcGVjdC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHJhdGlvczogbWFwIGZyb20gdGllciBkdXJhdGlvbiB0byBpdHMgcmV3YXJkIGFsbG9jYXRpb24gcmF0aW8uCgkvLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gcHJvamVjdElkIGRvZXMgbm90IGlkZW50aWZ5IGEgc3RvcmVkIHByb2plY3QuCglHZXRQcm9qZWN0VGllcnNSYXRpb3MocHJvamVjdElkIHN0cmluZykgKG1hcFtpbnQ2NF1pbnQ2NCwgZXJyb3IpCgkvLyBHZXRQcm9qZWN0Q3JlYXRlZEhlaWdodCByZXR1cm5zIHRoZSBibG9jayBoZWlnaHQgYXQgd2hpY2ggYSBwcm9qZWN0IHdhcyBjcmVhdGVkLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcHJvamVjdElkOiBpZGVudGlmaWVyIG9mIHRoZSBwcm9qZWN0IHRvIGluc3BlY3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBoZWlnaHQ6IGNyZWF0aW9uIGJsb2NrIGhlaWdodCwgb3IgemVybyBvbiBsb29rdXAgZmFpbHVyZS4KCS8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBwcm9qZWN0SWQgZG9lcyBub3QgaWRlbnRpZnkgYSBzdG9yZWQgcHJvamVjdC4KCUdldFByb2plY3RDcmVhdGVkSGVpZ2h0KHByb2plY3RJZCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpCgkvLyBHZXRQcm9qZWN0Q3JlYXRlZEF0IHJldHVybnMgdGhlIFVuaXggdGltZXN0YW1wIGF0IHdoaWNoIGEgcHJvamVjdCB3YXMgY3JlYXRlZC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHByb2plY3RJZDogaWRlbnRpZmllciBvZiB0aGUgcHJvamVjdCB0byBpbnNwZWN0LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gdGltZTogY3JlYXRpb24gVW5peCB0aW1lc3RhbXAsIG9yIHplcm8gb24gbG9va3VwIGZhaWx1cmUuCgkvLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gcHJvamVjdElkIGRvZXMgbm90IGlkZW50aWZ5IGEgc3RvcmVkIHByb2plY3QuCglHZXRQcm9qZWN0Q3JlYXRlZEF0KHByb2plY3RJZCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpCgoJLy8gR2V0UHJvamVjdFRpZXIgcmV0dXJucyBvbmUgdGllciBvZiBhIHByb2plY3QgYnkgaXRzIGR1cmF0aW9uLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcHJvamVjdElkOiBpZGVudGlmaWVyIG9mIHRoZSBwcm9qZWN0IHRvIGluc3BlY3QuCgkvLyAgIC0gdGllcjogdGllciBkdXJhdGlvbiBpbiBzZWNvbmRzLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gcHJvamVjdFRpZXI6IHJlcXVlc3RlZCB0aWVyLCBvciBuaWwgd2hlbiBsb29rdXAgZmFpbHMuCgkvLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gdGhlIHByb2plY3Qgb3IgcmVxdWVzdGVkIHRpZXIgaXMgbm90IGZvdW5kLgoJR2V0UHJvamVjdFRpZXIocHJvamVjdElkIHN0cmluZywgdGllciBpbnQ2NCkgKCpQcm9qZWN0VGllciwgZXJyb3IpCgkvLyBHZXRQcm9qZWN0VGllckRpc3RyaWJ1dGVBbW91bnRQZXJTZWNvbmRYMTI4IHJldHVybnMgYSB0aWVyJ3MgUTEyOC1zY2FsZWQgcmV3YXJkIHJhdGUuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwcm9qZWN0SWQ6IGlkZW50aWZpZXIgb2YgdGhlIHByb2plY3QgdG8gaW5zcGVjdC4KCS8vICAgLSB0aWVyOiB0aWVyIGR1cmF0aW9uIGluIHNlY29uZHMuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBhbW91bnRQZXJTZWNvbmRYMTI4OiByZXdhcmQgdG9rZW5zIHBlciBzZWNvbmQgc2NhbGVkIGJ5IDJeMTI4LgoJLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHRoZSBwcm9qZWN0IG9yIHJlcXVlc3RlZCB0aWVyIGlzIG5vdCBmb3VuZC4KCUdldFByb2plY3RUaWVyRGlzdHJpYnV0ZUFtb3VudFBlclNlY29uZFgxMjgocHJvamVjdElkIHN0cmluZywgdGllciBpbnQ2NCkgKCp1aW50MjU2LlVpbnQsIGVycm9yKQoJLy8gR2V0UHJvamVjdFRpZXJUb3RhbERpc3RyaWJ1dGVBbW91bnQgcmV0dXJucyB0aGUgdG90YWwgcmV3YXJkIGFsbG9jYXRpb24gZm9yIGEgdGllci4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHByb2plY3RJZDogaWRlbnRpZmllciBvZiB0aGUgcHJvamVjdCB0byBpbnNwZWN0LgoJLy8gICAtIHRpZXI6IHRpZXIgZHVyYXRpb24gaW4gc2Vjb25kcy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGFtb3VudDogdG90YWwgcmV3YXJkLXRva2VuIGFtb3VudCBhbGxvY2F0ZWQgdG8gdGhlIHRpZXIuCgkvLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gdGhlIHByb2plY3Qgb3IgcmVxdWVzdGVkIHRpZXIgaXMgbm90IGZvdW5kLgoJR2V0UHJvamVjdFRpZXJUb3RhbERpc3RyaWJ1dGVBbW91bnQocHJvamVjdElkIHN0cmluZywgdGllciBpbnQ2NCkgKGludDY0LCBlcnJvcikKCS8vIEdldFByb2plY3RUaWVyVG90YWxEZXBvc2l0QW1vdW50IHJldHVybnMgdGhlIGN1bXVsYXRpdmUgR05TIGRlcG9zaXRlZCBpbnRvIGEgdGllci4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHByb2plY3RJZDogaWRlbnRpZmllciBvZiB0aGUgcHJvamVjdCB0byBpbnNwZWN0LgoJLy8gICAtIHRpZXI6IHRpZXIgZHVyYXRpb24gaW4gc2Vjb25kcy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGFtb3VudDogY3VtdWxhdGl2ZSBHTlMgYW1vdW50IGRlcG9zaXRlZCBpbnRvIHRoZSB0aWVyLgoJLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHRoZSBwcm9qZWN0IG9yIHJlcXVlc3RlZCB0aWVyIGlzIG5vdCBmb3VuZC4KCUdldFByb2plY3RUaWVyVG90YWxEZXBvc2l0QW1vdW50KHByb2plY3RJZCBzdHJpbmcsIHRpZXIgaW50NjQpIChpbnQ2NCwgZXJyb3IpCgkvLyBHZXRQcm9qZWN0VGllclRvdGFsV2l0aGRyYXdBbW91bnQgcmV0dXJucyB0aGUgY3VtdWxhdGl2ZSBHTlMgd2l0aGRyYXduIGZyb20gYSB0aWVyLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcHJvamVjdElkOiBpZGVudGlmaWVyIG9mIHRoZSBwcm9qZWN0IHRvIGluc3BlY3QuCgkvLyAgIC0gdGllcjogdGllciBkdXJhdGlvbiBpbiBzZWNvbmRzLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gYW1vdW50OiBjdW11bGF0aXZlIEdOUyBhbW91bnQgd2l0aGRyYXduIGZyb20gdGhlIHRpZXIuCgkvLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gdGhlIHByb2plY3Qgb3IgcmVxdWVzdGVkIHRpZXIgaXMgbm90IGZvdW5kLgoJR2V0UHJvamVjdFRpZXJUb3RhbFdpdGhkcmF3QW1vdW50KHByb2plY3RJZCBzdHJpbmcsIHRpZXIgaW50NjQpIChpbnQ2NCwgZXJyb3IpCgkvLyBHZXRQcm9qZWN0VGllclRvdGFsRGVwb3NpdENvdW50IHJldHVybnMgdGhlIGN1bXVsYXRpdmUgbnVtYmVyIG9mIHRpZXIgZGVwb3NpdHMuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwcm9qZWN0SWQ6IGlkZW50aWZpZXIgb2YgdGhlIHByb2plY3QgdG8gaW5zcGVjdC4KCS8vICAgLSB0aWVyOiB0aWVyIGR1cmF0aW9uIGluIHNlY29uZHMuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBjb3VudDogY3VtdWxhdGl2ZSBudW1iZXIgb2YgZGVwb3NpdHMgcmVjb3JkZWQgZm9yIHRoZSB0aWVyLgoJLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHRoZSBwcm9qZWN0IG9yIHJlcXVlc3RlZCB0aWVyIGlzIG5vdCBmb3VuZC4KCUdldFByb2plY3RUaWVyVG90YWxEZXBvc2l0Q291bnQocHJvamVjdElkIHN0cmluZywgdGllciBpbnQ2NCkgKGludDY0LCBlcnJvcikKCS8vIEdldFByb2plY3RUaWVyVG90YWxXaXRoZHJhd0NvdW50IHJldHVybnMgdGhlIGN1bXVsYXRpdmUgbnVtYmVyIG9mIHRpZXIgd2l0aGRyYXdhbHMuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwcm9qZWN0SWQ6IGlkZW50aWZpZXIgb2YgdGhlIHByb2plY3QgdG8gaW5zcGVjdC4KCS8vICAgLSB0aWVyOiB0aWVyIGR1cmF0aW9uIGluIHNlY29uZHMuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBjb3VudDogY3VtdWxhdGl2ZSBudW1iZXIgb2Ygd2l0aGRyYXdhbHMgcmVjb3JkZWQgZm9yIHRoZSB0aWVyLgoJLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHRoZSBwcm9qZWN0IG9yIHJlcXVlc3RlZCB0aWVyIGlzIG5vdCBmb3VuZC4KCUdldFByb2plY3RUaWVyVG90YWxXaXRoZHJhd0NvdW50KHByb2plY3RJZCBzdHJpbmcsIHRpZXIgaW50NjQpIChpbnQ2NCwgZXJyb3IpCgkvLyBHZXRQcm9qZWN0VGllclRvdGFsQ29sbGVjdGVkQW1vdW50IHJldHVybnMgdGhlIGN1bXVsYXRpdmUgcmV3YXJkIGFtb3VudCBjb2xsZWN0ZWQgZnJvbSBhIHRpZXIuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwcm9qZWN0SWQ6IGlkZW50aWZpZXIgb2YgdGhlIHByb2plY3QgdG8gaW5zcGVjdC4KCS8vICAgLSB0aWVyOiB0aWVyIGR1cmF0aW9uIGluIHNlY29uZHMuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBhbW91bnQ6IGN1bXVsYXRpdmUgcHJvamVjdC10b2tlbiByZXdhcmQgYW1vdW50IGNvbGxlY3RlZCBmcm9tIHRoZSB0aWVyLgoJLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHRoZSBwcm9qZWN0IG9yIHJlcXVlc3RlZCB0aWVyIGlzIG5vdCBmb3VuZC4KCUdldFByb2plY3RUaWVyVG90YWxDb2xsZWN0ZWRBbW91bnQocHJvamVjdElkIHN0cmluZywgdGllciBpbnQ2NCkgKGludDY0LCBlcnJvcikKCS8vIEdldFByb2plY3RUaWVyU3RhcnRUaW1lIHJldHVybnMgdGhlIFVuaXggdGltZXN0YW1wIHdoZW4gYSB0aWVyIHN0YXJ0cyBkaXN0cmlidXRpbmcgcmV3YXJkcy4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHByb2plY3RJZDogaWRlbnRpZmllciBvZiB0aGUgcHJvamVjdCB0byBpbnNwZWN0LgoJLy8gICAtIHRpZXI6IHRpZXIgZHVyYXRpb24gaW4gc2Vjb25kcy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHRpbWU6IHRpZXIgZGlzdHJpYnV0aW9uIHN0YXJ0IFVuaXggdGltZXN0YW1wLgoJLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHRoZSBwcm9qZWN0IG9yIHJlcXVlc3RlZCB0aWVyIGlzIG5vdCBmb3VuZC4KCUdldFByb2plY3RUaWVyU3RhcnRUaW1lKHByb2plY3RJZCBzdHJpbmcsIHRpZXIgaW50NjQpIChpbnQ2NCwgZXJyb3IpCgkvLyBHZXRQcm9qZWN0VGllckVuZFRpbWUgcmV0dXJucyB0aGUgVW5peCB0aW1lc3RhbXAgd2hlbiBhIHRpZXIgc3RvcHMgZGlzdHJpYnV0aW5nIHJld2FyZHMuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwcm9qZWN0SWQ6IGlkZW50aWZpZXIgb2YgdGhlIHByb2plY3QgdG8gaW5zcGVjdC4KCS8vICAgLSB0aWVyOiB0aWVyIGR1cmF0aW9uIGluIHNlY29uZHMuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSB0aW1lOiB0aWVyIGRpc3RyaWJ1dGlvbiBlbmQgVW5peCB0aW1lc3RhbXAuCgkvLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gdGhlIHByb2plY3Qgb3IgcmVxdWVzdGVkIHRpZXIgaXMgbm90IGZvdW5kLgoJR2V0UHJvamVjdFRpZXJFbmRUaW1lKHByb2plY3RJZCBzdHJpbmcsIHRpZXIgaW50NjQpIChpbnQ2NCwgZXJyb3IpCgoJLy8gR2V0RGVwb3NpdENvdW50IHJldHVybnMgdGhlIG51bWJlciBvZiBkZXBvc2l0cyBjdXJyZW50bHkgc3RvcmVkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gY291bnQ6IG51bWJlciBvZiBzdG9yZWQgZGVwb3NpdHMuCglHZXREZXBvc2l0Q291bnQoKSBpbnQKCS8vIEdldEN1cnJlbnREZXBvc2l0SWQgcmV0dXJucyB0aGUgbGF0ZXN0IGFsbG9jYXRlZCBkZXBvc2l0IGlkZW50aWZpZXIuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBkZXBvc2l0SUQ6IGxhdGVzdCBudW1lcmljIGRlcG9zaXQgaWRlbnRpZmllci4KCUdldEN1cnJlbnREZXBvc2l0SWQoKSBpbnQ2NAoJLy8gR2V0UHJvamVjdFRpZXJSZXdhcmRzIHJldHVybnMgYSByZWFkLW9ubHkgcmV3YXJkLXN0YXRlIHRyZWUgZm9yIGEgcHJvamVjdCB0aWVyLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcHJvamVjdElkOiBpZGVudGlmaWVyIG9mIHRoZSBwcm9qZWN0IHRvIGluc3BlY3QuCgkvLyAgIC0gdGllcjogdGllciBkdXJhdGlvbiBpbiBzZWNvbmRzLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gcmV3YXJkczogcmVhZC1vbmx5IHRyZWUgb2YgcmV3YXJkIHN0YXRlcyBrZXllZCBieSBkZXBvc2l0IElELgoJR2V0UHJvamVjdFRpZXJSZXdhcmRzKHByb2plY3RJZCBzdHJpbmcsIHRpZXIgaW50NjQpICpyb3RyZWUuUmVhZE9ubHlUcmVlCgoJLy8gR2V0RGVwb3NpdCByZXR1cm5zIHRoZSBzdG9yZWQgZGVwb3NpdCBpZGVudGlmaWVkIGJ5IGRlcG9zaXRJZC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIGRlcG9zaXRJZDogaWRlbnRpZmllciBvZiB0aGUgZGVwb3NpdCB0byBpbnNwZWN0LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZGVwb3NpdDogc3RvcmVkIGRlcG9zaXQsIG9yIGl0cyB6ZXJvIHZhbHVlIHdoZW4gbG9va3VwIGZhaWxzLgoJLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIGRlcG9zaXRJZCBkb2VzIG5vdCBpZGVudGlmeSBhIHN0b3JlZCBkZXBvc2l0LgoJR2V0RGVwb3NpdChkZXBvc2l0SWQgc3RyaW5nKSAoRGVwb3NpdCwgZXJyb3IpCgkvLyBHZXREZXBvc2l0UHJvamVjdElEIHJldHVybnMgdGhlIHByb2plY3QgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggYSBkZXBvc2l0LgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gZGVwb3NpdElkOiBpZGVudGlmaWVyIG9mIHRoZSBkZXBvc2l0IHRvIGluc3BlY3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBwcm9qZWN0SUQ6IHByb2plY3QgaWRlbnRpZmllciByZWNvcmRlZCBpbiB0aGUgZGVwb3NpdC4KCS8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBkZXBvc2l0SWQgZG9lcyBub3QgaWRlbnRpZnkgYSBzdG9yZWQgZGVwb3NpdC4KCUdldERlcG9zaXRQcm9qZWN0SUQoZGVwb3NpdElkIHN0cmluZykgKHN0cmluZywgZXJyb3IpCgkvLyBHZXREZXBvc2l0VGllciByZXR1cm5zIHRoZSB0aWVyIGR1cmF0aW9uIHJlY29yZGVkIGluIGEgZGVwb3NpdC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIGRlcG9zaXRJZDogaWRlbnRpZmllciBvZiB0aGUgZGVwb3NpdCB0byBpbnNwZWN0LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gdGllcjogZGVwb3NpdCB0aWVyIGR1cmF0aW9uIGluIHNlY29uZHMuCgkvLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gZGVwb3NpdElkIGRvZXMgbm90IGlkZW50aWZ5IGEgc3RvcmVkIGRlcG9zaXQuCglHZXREZXBvc2l0VGllcihkZXBvc2l0SWQgc3RyaW5nKSAoaW50NjQsIGVycm9yKQoJLy8gR2V0RGVwb3NpdFByb2plY3RUaWVySUQgcmV0dXJucyB0aGUgY29tYmluZWQgcHJvamVjdC10aWVyIGlkZW50aWZpZXIgZm9yIGEgZGVwb3NpdC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIGRlcG9zaXRJZDogaWRlbnRpZmllciBvZiB0aGUgZGVwb3NpdCB0byBpbnNwZWN0LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gcHJvamVjdFRpZXJJRDogaWRlbnRpZmllciBpbiBge3Byb2plY3RJRH06e3RpZXJEdXJhdGlvbn1gIGZvcm0uCgkvLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gZGVwb3NpdElkIGRvZXMgbm90IGlkZW50aWZ5IGEgc3RvcmVkIGRlcG9zaXQuCglHZXREZXBvc2l0UHJvamVjdFRpZXJJRChkZXBvc2l0SWQgc3RyaW5nKSAoc3RyaW5nLCBlcnJvcikKCS8vIEdldERlcG9zaXRBbW91bnQgcmV0dXJucyB0aGUgY3VycmVudGx5IHN0YWtlZCBHTlMgYW1vdW50IGluIGEgZGVwb3NpdC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIGRlcG9zaXRJZDogaWRlbnRpZmllciBvZiB0aGUgZGVwb3NpdCB0byBpbnNwZWN0LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gYW1vdW50OiBjdXJyZW50IEdOUyBhbW91bnQgaGVsZCBieSB0aGUgZGVwb3NpdC4KCS8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBkZXBvc2l0SWQgZG9lcyBub3QgaWRlbnRpZnkgYSBzdG9yZWQgZGVwb3NpdC4KCUdldERlcG9zaXRBbW91bnQoZGVwb3NpdElkIHN0cmluZykgKGludDY0LCBlcnJvcikKCS8vIEdldERlcG9zaXRXaXRoZHJhd25IZWlnaHQgcmV0dXJucyB0aGUgYmxvY2sgaGVpZ2h0IGF0IHdoaWNoIGEgZGVwb3NpdCB3YXMgd2l0aGRyYXduLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gZGVwb3NpdElkOiBpZGVudGlmaWVyIG9mIHRoZSBkZXBvc2l0IHRvIGluc3BlY3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBoZWlnaHQ6IHdpdGhkcmF3YWwgYmxvY2sgaGVpZ2h0LCBvciB0aGUgc3RvcmVkIHplcm8gdmFsdWUgaWYgbm90IHdpdGhkcmF3bi4KCS8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBkZXBvc2l0SWQgZG9lcyBub3QgaWRlbnRpZnkgYSBzdG9yZWQgZGVwb3NpdC4KCUdldERlcG9zaXRXaXRoZHJhd25IZWlnaHQoZGVwb3NpdElkIHN0cmluZykgKGludDY0LCBlcnJvcikKCS8vIEdldERlcG9zaXRXaXRoZHJhd25UaW1lIHJldHVybnMgdGhlIFVuaXggdGltZXN0YW1wIGF0IHdoaWNoIGEgZGVwb3NpdCB3YXMgd2l0aGRyYXduLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gZGVwb3NpdElkOiBpZGVudGlmaWVyIG9mIHRoZSBkZXBvc2l0IHRvIGluc3BlY3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSB0aW1lOiB3aXRoZHJhd2FsIFVuaXggdGltZXN0YW1wLCBvciB0aGUgc3RvcmVkIHplcm8gdmFsdWUgaWYgbm90IHdpdGhkcmF3bi4KCS8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiBkZXBvc2l0SWQgZG9lcyBub3QgaWRlbnRpZnkgYSBzdG9yZWQgZGVwb3NpdC4KCUdldERlcG9zaXRXaXRoZHJhd25UaW1lKGRlcG9zaXRJZCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpCgkvLyBHZXREZXBvc2l0Q3JlYXRlZEhlaWdodCByZXR1cm5zIHRoZSBibG9jayBoZWlnaHQgYXQgd2hpY2ggYSBkZXBvc2l0IHdhcyBjcmVhdGVkLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gZGVwb3NpdElkOiBpZGVudGlmaWVyIG9mIHRoZSBkZXBvc2l0IHRvIGluc3BlY3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBoZWlnaHQ6IGRlcG9zaXQgY3JlYXRpb24gYmxvY2sgaGVpZ2h0LgoJLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIGRlcG9zaXRJZCBkb2VzIG5vdCBpZGVudGlmeSBhIHN0b3JlZCBkZXBvc2l0LgoJR2V0RGVwb3NpdENyZWF0ZWRIZWlnaHQoZGVwb3NpdElkIHN0cmluZykgKGludDY0LCBlcnJvcikKCS8vIEdldERlcG9zaXRDcmVhdGVkQXQgcmV0dXJucyB0aGUgVW5peCB0aW1lc3RhbXAgYXQgd2hpY2ggYSBkZXBvc2l0IHdhcyBjcmVhdGVkLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gZGVwb3NpdElkOiBpZGVudGlmaWVyIG9mIHRoZSBkZXBvc2l0IHRvIGluc3BlY3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSB0aW1lOiBkZXBvc2l0IGNyZWF0aW9uIFVuaXggdGltZXN0YW1wLgoJLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIGRlcG9zaXRJZCBkb2VzIG5vdCBpZGVudGlmeSBhIHN0b3JlZCBkZXBvc2l0LgoJR2V0RGVwb3NpdENyZWF0ZWRBdChkZXBvc2l0SWQgc3RyaW5nKSAoaW50NjQsIGVycm9yKQoJLy8gR2V0RGVwb3NpdEVuZFRpbWUgcmV0dXJucyB0aGUgVW5peCB0aW1lc3RhbXAgd2hlbiBhIGRlcG9zaXQncyB0aWVyIGVuZHMuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBkZXBvc2l0SWQ6IGlkZW50aWZpZXIgb2YgdGhlIGRlcG9zaXQgdG8gaW5zcGVjdC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHRpbWU6IGRlcG9zaXQgdGllciBlbmQgVW5peCB0aW1lc3RhbXAuCgkvLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gZGVwb3NpdElkIGRvZXMgbm90IGlkZW50aWZ5IGEgc3RvcmVkIGRlcG9zaXQuCglHZXREZXBvc2l0RW5kVGltZShkZXBvc2l0SWQgc3RyaW5nKSAoaW50NjQsIGVycm9yKQoJLy8gR2V0VG90YWxHTlNTdGFrZWRBbW91bnQgcmV0dXJucyB0aGUgY3VycmVudCBHTlMgYW1vdW50IHN0YWtlZCBhY3Jvc3MgYWxsIGRlcG9zaXRzLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gYW1vdW50OiBhZ2dyZWdhdGUgY3VycmVudGx5IHN0YWtlZCBHTlMgYW1vdW50LgoJR2V0VG90YWxHTlNTdGFrZWRBbW91bnQoKSBpbnQ2NAoKCS8vIEdldFByb2plY3RUaWVyUmV3YXJkTWFuYWdlckNvdW50IHJldHVybnMgdGhlIG51bWJlciBvZiBzdG9yZWQgdGllciByZXdhcmQgbWFuYWdlcnMuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBjb3VudDogbnVtYmVyIG9mIHByb2plY3QtdGllciByZXdhcmQgbWFuYWdlcnMuCglHZXRQcm9qZWN0VGllclJld2FyZE1hbmFnZXJDb3VudCgpIGludAoJLy8gR2V0UHJvamVjdFRpZXJSZXdhcmRNYW5hZ2VyIHJldHVybnMgdGhlIHJld2FyZCBtYW5hZ2VyIGZvciBhIHByb2plY3QgdGllci4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHByb2plY3RUaWVySWQ6IGlkZW50aWZpZXIgb2YgdGhlIHByb2plY3QgdGllci4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIG1hbmFnZXI6IHJld2FyZCBtYW5hZ2VyIGZvciB0aGUgcHJvamVjdCB0aWVyLCBvciBuaWwgb24gbG9va3VwIGZhaWx1cmUuCgkvLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gcHJvamVjdFRpZXJJZCBkb2VzIG5vdCBpZGVudGlmeSBhIHN0b3JlZCBtYW5hZ2VyLgoJR2V0UHJvamVjdFRpZXJSZXdhcmRNYW5hZ2VyKHByb2plY3RUaWVySWQgc3RyaW5nKSAoKlJld2FyZE1hbmFnZXIsIGVycm9yKQoJLy8gR2V0UHJvamVjdFRpZXJSZXdhcmREaXN0cmlidXRlQW1vdW50UGVyU2Vjb25kWDEyOCByZXR1cm5zIGEgdGllciBtYW5hZ2VyJ3MgUTEyOCByZXdhcmQgcmF0ZS4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHByb2plY3RUaWVySWQ6IGlkZW50aWZpZXIgb2YgdGhlIHByb2plY3QgdGllci4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGFtb3VudFBlclNlY29uZFgxMjg6IHJld2FyZCB0b2tlbnMgcGVyIHNlY29uZCBzY2FsZWQgYnkgMl4xMjguCgkvLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gcHJvamVjdFRpZXJJZCBkb2VzIG5vdCBpZGVudGlmeSBhIHN0b3JlZCBtYW5hZ2VyLgoJR2V0UHJvamVjdFRpZXJSZXdhcmREaXN0cmlidXRlQW1vdW50UGVyU2Vjb25kWDEyOChwcm9qZWN0VGllcklkIHN0cmluZykgKCp1aW50MjU2LlVpbnQsIGVycm9yKQoJLy8gR2V0UHJvamVjdFRpZXJSZXdhcmRBY2N1bXVsYXRlZFJld2FyZFBlckRlcG9zaXRYMTI4IHJldHVybnMgYWNjdW11bGF0ZWQgUTEyOCByZXdhcmQgcGVyIGRlcG9zaXQuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwcm9qZWN0VGllcklkOiBpZGVudGlmaWVyIG9mIHRoZSBwcm9qZWN0IHRpZXIuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBhY2N1bXVsYXRlZFgxMjg6IGFjY3VtdWxhdGVkIHJld2FyZC1wZXItZGVwb3NpdCB2YWx1ZSBzY2FsZWQgYnkgMl4xMjguCgkvLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gcHJvamVjdFRpZXJJZCBkb2VzIG5vdCBpZGVudGlmeSBhIHN0b3JlZCBtYW5hZ2VyLgoJR2V0UHJvamVjdFRpZXJSZXdhcmRBY2N1bXVsYXRlZFJld2FyZFBlckRlcG9zaXRYMTI4KHByb2plY3RUaWVySWQgc3RyaW5nKSAoKnVpbnQyNTYuVWludCwgZXJyb3IpCgkvLyBHZXRQcm9qZWN0VGllclJld2FyZFRvdGFsRGlzdHJpYnV0ZUFtb3VudCByZXR1cm5zIHRvdGFsIHJld2FyZCB0b2tlbnMgYWxsb2NhdGVkIHRvIGEgdGllci4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHByb2plY3RUaWVySWQ6IGlkZW50aWZpZXIgb2YgdGhlIHByb2plY3QgdGllci4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGFtb3VudDogdG90YWwgcmV3YXJkLXRva2VuIGFsbG9jYXRpb24uCgkvLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gcHJvamVjdFRpZXJJZCBkb2VzIG5vdCBpZGVudGlmeSBhIHN0b3JlZCBtYW5hZ2VyLgoJR2V0UHJvamVjdFRpZXJSZXdhcmRUb3RhbERpc3RyaWJ1dGVBbW91bnQocHJvamVjdFRpZXJJZCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpCgkvLyBHZXRQcm9qZWN0VGllclJld2FyZFRvdGFsQ2xhaW1lZEFtb3VudCByZXR1cm5zIHRvdGFsIHJld2FyZCB0b2tlbnMgY2xhaW1lZCBmcm9tIGEgdGllci4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHByb2plY3RUaWVySWQ6IGlkZW50aWZpZXIgb2YgdGhlIHByb2plY3QgdGllci4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGFtb3VudDogY3VtdWxhdGl2ZSBjbGFpbWVkIHJld2FyZC10b2tlbiBhbW91bnQuCgkvLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gcHJvamVjdFRpZXJJZCBkb2VzIG5vdCBpZGVudGlmeSBhIHN0b3JlZCBtYW5hZ2VyLgoJR2V0UHJvamVjdFRpZXJSZXdhcmRUb3RhbENsYWltZWRBbW91bnQocHJvamVjdFRpZXJJZCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpCgkvLyBHZXRQcm9qZWN0VGllclJld2FyZERpc3RyaWJ1dGVTdGFydFRpbWUgcmV0dXJucyBhIHRpZXIgbWFuYWdlcidzIGRpc3RyaWJ1dGlvbiBzdGFydCB0aW1lLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcHJvamVjdFRpZXJJZDogaWRlbnRpZmllciBvZiB0aGUgcHJvamVjdCB0aWVyLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gdGltZTogZGlzdHJpYnV0aW9uIHN0YXJ0IFVuaXggdGltZXN0YW1wLgoJLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHByb2plY3RUaWVySWQgZG9lcyBub3QgaWRlbnRpZnkgYSBzdG9yZWQgbWFuYWdlci4KCUdldFByb2plY3RUaWVyUmV3YXJkRGlzdHJpYnV0ZVN0YXJ0VGltZShwcm9qZWN0VGllcklkIHN0cmluZykgKGludDY0LCBlcnJvcikKCS8vIEdldFByb2plY3RUaWVyUmV3YXJkRGlzdHJpYnV0ZUVuZFRpbWUgcmV0dXJucyBhIHRpZXIgbWFuYWdlcidzIGRpc3RyaWJ1dGlvbiBlbmQgdGltZS4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHByb2plY3RUaWVySWQ6IGlkZW50aWZpZXIgb2YgdGhlIHByb2plY3QgdGllci4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHRpbWU6IGRpc3RyaWJ1dGlvbiBlbmQgVW5peCB0aW1lc3RhbXAuCgkvLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gcHJvamVjdFRpZXJJZCBkb2VzIG5vdCBpZGVudGlmeSBhIHN0b3JlZCBtYW5hZ2VyLgoJR2V0UHJvamVjdFRpZXJSZXdhcmREaXN0cmlidXRlRW5kVGltZShwcm9qZWN0VGllcklkIHN0cmluZykgKGludDY0LCBlcnJvcikKCS8vIEdldFByb2plY3RUaWVyUmV3YXJkQWNjdW11bGF0ZWREaXN0cmlidXRlQW1vdW50IHJldHVybnMgdGhlIGFjY3VtdWxhdGVkIGRpc3RyaWJ1dGVkIHJld2FyZCBhbW91bnQuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBwcm9qZWN0VGllcklkOiBpZGVudGlmaWVyIG9mIHRoZSBwcm9qZWN0IHRpZXIuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBhbW91bnQ6IGFjY3VtdWxhdGVkIHJld2FyZC10b2tlbiBhbW91bnQgYWNjb3VudGVkIGZvciBkaXN0cmlidXRpb24uCgkvLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gcHJvamVjdFRpZXJJZCBkb2VzIG5vdCBpZGVudGlmeSBhIHN0b3JlZCBtYW5hZ2VyLgoJR2V0UHJvamVjdFRpZXJSZXdhcmRBY2N1bXVsYXRlZERpc3RyaWJ1dGVBbW91bnQocHJvamVjdFRpZXJJZCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpCgkvLyBHZXRQcm9qZWN0VGllclJld2FyZEFjY3VtdWxhdGVkVGltZSByZXR1cm5zIHRoZSB0aW1lc3RhbXAgdGhyb3VnaCB3aGljaCByZXdhcmRzIGFyZSBhY2N1bXVsYXRlZC4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHByb2plY3RUaWVySWQ6IGlkZW50aWZpZXIgb2YgdGhlIHByb2plY3QgdGllci4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHRpbWU6IGFjY3VtdWxhdGVkIFVuaXggdGltZXN0YW1wLgoJLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHByb2plY3RUaWVySWQgZG9lcyBub3QgaWRlbnRpZnkgYSBzdG9yZWQgbWFuYWdlci4KCUdldFByb2plY3RUaWVyUmV3YXJkQWNjdW11bGF0ZWRUaW1lKHByb2plY3RUaWVySWQgc3RyaW5nKSAoaW50NjQsIGVycm9yKQoJLy8gR2V0UHJvamVjdFRpZXJSZXdhcmRDbGFpbWFibGVEdXJhdGlvbiByZXR1cm5zIHRoZSBkZWxheSBiZWZvcmUgcmV3YXJkcyBiZWNvbWUgY2xhaW1hYmxlLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcHJvamVjdFRpZXJJZDogaWRlbnRpZmllciBvZiB0aGUgcHJvamVjdCB0aWVyLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZHVyYXRpb246IGNsYWltYWJsZSBkZWxheSBpbiBzZWNvbmRzLgoJLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHByb2plY3RUaWVySWQgZG9lcyBub3QgaWRlbnRpZnkgYSBzdG9yZWQgbWFuYWdlci4KCUdldFByb2plY3RUaWVyUmV3YXJkQ2xhaW1hYmxlRHVyYXRpb24ocHJvamVjdFRpZXJJZCBzdHJpbmcpIChpbnQ2NCwgZXJyb3IpCgoJLy8gR2V0UmV3YXJkU3RhdGUgcmV0dXJucyB0aGUgcmV3YXJkIHN0YXRlIGZvciBvbmUgZGVwb3NpdCBpbiBhIHByb2plY3QgdGllci4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIHByb2plY3RUaWVySWQ6IGlkZW50aWZpZXIgb2YgdGhlIHByb2plY3QgdGllci4KCS8vICAgLSBkZXBvc2l0SWQ6IGlkZW50aWZpZXIgb2YgdGhlIGRlcG9zaXQgd2hvc2UgcmV3YXJkIHN0YXRlIGlzIHJlcXVlc3RlZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHJld2FyZFN0YXRlOiBzdG9yZWQgcmV3YXJkIHN0YXRlLCBvciBuaWwgb24gbG9va3VwIGZhaWx1cmUuCgkvLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gdGhlIHByb2plY3QgdGllciBvciBkZXBvc2l0IHJld2FyZCBzdGF0ZSBpcyBtaXNzaW5nLgoJR2V0UmV3YXJkU3RhdGUocHJvamVjdFRpZXJJZCBzdHJpbmcsIGRlcG9zaXRJZCBzdHJpbmcpICgqUmV3YXJkU3RhdGUsIGVycm9yKQoJLy8gR2V0UHJvamVjdEFjdGl2ZVN0YXR1cyByZXBvcnRzIHdoZXRoZXIgYSBwcm9qZWN0IGlzIGFjdGl2ZSBhdCB0aGUgY3VycmVudCB0aW1lLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gcHJvamVjdElkOiBpZGVudGlmaWVyIG9mIHRoZSBwcm9qZWN0IHRvIGluc3BlY3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBhY3RpdmU6IHRydWUgd2hlbiB0aGUgcHJvamVjdCBpcyBjdXJyZW50bHkgYWN0aXZlOyBmYWxzZSBvdGhlcndpc2UuCgkvLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gcHJvamVjdElkIGRvZXMgbm90IGlkZW50aWZ5IGEgc3RvcmVkIHByb2plY3QuCglHZXRQcm9qZWN0QWN0aXZlU3RhdHVzKHByb2plY3RJZCBzdHJpbmcpIChib29sLCBlcnJvcikKfQoKdHlwZSBJTGF1bmNocGFkU3RvcmUgaW50ZXJmYWNlIHsKCS8vIEhhc1Byb2plY3RzS2V5IHJlcG9ydHMgd2hldGhlciB0aGUgcHJvamVjdHMgdHJlZSBoYXMgYSBwZXJzaXN0ZWQgc3RvcmUga2V5LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXhpc3RzOiB0cnVlIHdoZW4gdGhlIHByb2plY3RzIHN0b3JlIGtleSBpcyBwcmVzZW50LgoJSGFzUHJvamVjdHNLZXkoKSBib29sCgkvLyBHZXRQcm9qZWN0cyByZXR1cm5zIHRoZSBwZXJzaXN0ZWQgcHJvamVjdCB0cmVlLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gcHJvamVjdHM6IHRyZWUgY29udGFpbmluZyBwcm9qZWN0cyBrZXllZCBieSBwcm9qZWN0IElELgoJR2V0UHJvamVjdHMoKSAqYnB0cmVlLkJQVHJlZQoJLy8gU2V0UHJvamVjdHMgcGVyc2lzdHMgdGhlIHByb2plY3QgdHJlZSBpbiB0aGUgY3VycmVudCBzdG9yZSByZWFsbS4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IE5vbmNyb3NzaW5nIGltcGxlbWVudGF0aW9uLWNhbGwgZGlzY3JpbWluYXRvcjsgcGFzcyAwLgoJLy8gICAtIHJsbTogY3VycmVudCByZWFsbSBjb250ZXh0IGZvcndhcmRlZCBmb3IgY3VycmVudC1yZWFsbSB2YWxpZGF0aW9uLgoJLy8gICAtIHByb2plY3RzOiBwcm9qZWN0IHRyZWUgdG8gcGVyc2lzdC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHRoZSByZWFsbSBjb250ZXh0IGZhaWxzIHN0b3JlIHZhbGlkYXRpb24gb3IgcGVyc2lzdGVuY2UgZmFpbHMuCglTZXRQcm9qZWN0cyhfIGludCwgcmxtIHJlYWxtLCBwcm9qZWN0cyAqYnB0cmVlLkJQVHJlZSkgZXJyb3IKCgkvLyBIYXNQcm9qZWN0UmVjaXBpZW50c0tleSByZXBvcnRzIHdoZXRoZXIgdGhlIHByb2plY3QtcmVjaXBpZW50IHRyZWUgaGFzIGEgcGVyc2lzdGVkIGtleS4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGV4aXN0czogdHJ1ZSB3aGVuIHRoZSBwcm9qZWN0LXJlY2lwaWVudCBzdG9yZSBrZXkgaXMgcHJlc2VudC4KCUhhc1Byb2plY3RSZWNpcGllbnRzS2V5KCkgYm9vbAoJLy8gR2V0UHJvamVjdFJlY2lwaWVudHMgcmV0dXJucyB0aGUgcGVyc2lzdGVkIHByb2plY3QtcmVjaXBpZW50IG1lbWJlcnNoaXAgdHJlZS4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIHJlY2lwaWVudHM6IHRyZWUgbWFwcGluZyBwcm9qZWN0IGlkZW50aWZpZXJzIHRvIHJlY2lwaWVudCBtZW1iZXJzaGlwIGRhdGEuCglHZXRQcm9qZWN0UmVjaXBpZW50cygpICpicHRyZWUuQlBUcmVlCgkvLyBTZXRQcm9qZWN0UmVjaXBpZW50cyBwZXJzaXN0cyB0aGUgcHJvamVjdC1yZWNpcGllbnQgbWVtYmVyc2hpcCB0cmVlLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTm9uY3Jvc3NpbmcgaW1wbGVtZW50YXRpb24tY2FsbCBkaXNjcmltaW5hdG9yOyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBjdXJyZW50IHJlYWxtIGNvbnRleHQgZm9yd2FyZGVkIGZvciBjdXJyZW50LXJlYWxtIHZhbGlkYXRpb24uCgkvLyAgIC0gcmVjaXBpZW50czogcHJvamVjdC1yZWNpcGllbnQgbWVtYmVyc2hpcCB0cmVlIHRvIHBlcnNpc3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiB0aGUgcmVhbG0gY29udGV4dCBmYWlscyBzdG9yZSB2YWxpZGF0aW9uIG9yIHBlcnNpc3RlbmNlIGZhaWxzLgoJU2V0UHJvamVjdFJlY2lwaWVudHMoXyBpbnQsIHJsbSByZWFsbSwgcmVjaXBpZW50cyAqYnB0cmVlLkJQVHJlZSkgZXJyb3IKCgkvLyBIYXNQcm9qZWN0VGllclJld2FyZE1hbmFnZXJzS2V5IHJlcG9ydHMgd2hldGhlciB0aWVyIHJld2FyZCBtYW5hZ2VycyBoYXZlIGEgcGVyc2lzdGVkIGtleS4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGV4aXN0czogdHJ1ZSB3aGVuIHRoZSByZXdhcmQtbWFuYWdlciBzdG9yZSBrZXkgaXMgcHJlc2VudC4KCUhhc1Byb2plY3RUaWVyUmV3YXJkTWFuYWdlcnNLZXkoKSBib29sCgkvLyBHZXRQcm9qZWN0VGllclJld2FyZE1hbmFnZXJzIHJldHVybnMgdGhlIHBlcnNpc3RlZCB0aWVyIHJld2FyZC1tYW5hZ2VyIHRyZWUuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBtYW5hZ2VyczogdHJlZSBrZXllZCBieSBwcm9qZWN0LXRpZXIgaWRlbnRpZmllci4KCUdldFByb2plY3RUaWVyUmV3YXJkTWFuYWdlcnMoKSAqYnB0cmVlLkJQVHJlZQoJLy8gU2V0UHJvamVjdFRpZXJSZXdhcmRNYW5hZ2VycyBwZXJzaXN0cyB0aGUgdGllciByZXdhcmQtbWFuYWdlciB0cmVlLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTm9uY3Jvc3NpbmcgaW1wbGVtZW50YXRpb24tY2FsbCBkaXNjcmltaW5hdG9yOyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBjdXJyZW50IHJlYWxtIGNvbnRleHQgZm9yd2FyZGVkIGZvciBjdXJyZW50LXJlYWxtIHZhbGlkYXRpb24uCgkvLyAgIC0gbWFuYWdlcnM6IHRpZXIgcmV3YXJkLW1hbmFnZXIgdHJlZSB0byBwZXJzaXN0LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gdGhlIHJlYWxtIGNvbnRleHQgZmFpbHMgc3RvcmUgdmFsaWRhdGlvbiBvciBwZXJzaXN0ZW5jZSBmYWlscy4KCVNldFByb2plY3RUaWVyUmV3YXJkTWFuYWdlcnMoXyBpbnQsIHJsbSByZWFsbSwgbWFuYWdlcnMgKmJwdHJlZS5CUFRyZWUpIGVycm9yCgoJLy8gRGVwb3NpdENvdW50ZXIKCS8vIEhhc0RlcG9zaXRDb3VudGVyU3RvcmVLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSBkZXBvc2l0IGNvdW50ZXIgaGFzIGEgcGVyc2lzdGVkIGtleS4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGV4aXN0czogdHJ1ZSB3aGVuIHRoZSBkZXBvc2l0LWNvdW50ZXIgc3RvcmUga2V5IGlzIHByZXNlbnQuCglIYXNEZXBvc2l0Q291bnRlclN0b3JlS2V5KCkgYm9vbAoJLy8gR2V0RGVwb3NpdENvdW50ZXIgcmV0dXJucyB0aGUgcGVyc2lzdGVkIGNvdW50ZXIgdXNlZCB0byBhbGxvY2F0ZSBkZXBvc2l0IElEcy4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGNvdW50ZXI6IGRlcG9zaXQgSUQgY291bnRlci4KCUdldERlcG9zaXRDb3VudGVyKCkgKkNvdW50ZXIKCS8vIFNldERlcG9zaXRDb3VudGVyIHBlcnNpc3RzIHRoZSBjb3VudGVyIHVzZWQgdG8gYWxsb2NhdGUgZGVwb3NpdCBJRHMuCgkvLwoJLy8gUGFyYW1ldGVyczoKCS8vICAgLSBfOiBOb25jcm9zc2luZyBpbXBsZW1lbnRhdGlvbi1jYWxsIGRpc2NyaW1pbmF0b3I7IHBhc3MgMC4KCS8vICAgLSBybG06IGN1cnJlbnQgcmVhbG0gY29udGV4dCBmb3J3YXJkZWQgZm9yIGN1cnJlbnQtcmVhbG0gdmFsaWRhdGlvbi4KCS8vICAgLSBjb3VudGVyOiBjb3VudGVyIHN0YXRlIHRvIHBlcnNpc3QuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBlcnI6IG5vbi1uaWwgd2hlbiB0aGUgcmVhbG0gY29udGV4dCBmYWlscyBzdG9yZSB2YWxpZGF0aW9uIG9yIHBlcnNpc3RlbmNlIGZhaWxzLgoJU2V0RGVwb3NpdENvdW50ZXIoXyBpbnQsIHJsbSByZWFsbSwgY291bnRlciAqQ291bnRlcikgZXJyb3IKCS8vIE5leHREZXBvc2l0SUQgYWR2YW5jZXMgdGhlIGRlcG9zaXQgY291bnRlciBhbmQgcmV0dXJucyBpdHMgbmV3IGlkZW50aWZpZXIuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBkZXBvc2l0SUQ6IG5ld2x5IGFsbG9jYXRlZCBkZXBvc2l0IGlkZW50aWZpZXIuCglOZXh0RGVwb3NpdElEKCkgc3RyaW5nCgoJLy8gSGFzRGVwb3NpdHNLZXkgcmVwb3J0cyB3aGV0aGVyIHRoZSBkZXBvc2l0cyB0cmVlIGhhcyBhIHBlcnNpc3RlZCBzdG9yZSBrZXkuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBleGlzdHM6IHRydWUgd2hlbiB0aGUgZGVwb3NpdHMgc3RvcmUga2V5IGlzIHByZXNlbnQuCglIYXNEZXBvc2l0c0tleSgpIGJvb2wKCS8vIEdldERlcG9zaXRzIHJldHVybnMgdGhlIHBlcnNpc3RlZCBkZXBvc2l0IHRyZWUuCgkvLwoJLy8gUmV0dXJuczoKCS8vICAgLSBkZXBvc2l0czogdHJlZSBjb250YWluaW5nIGRlcG9zaXRzIGtleWVkIGJ5IGRlcG9zaXQgSUQuCglHZXREZXBvc2l0cygpICpicHRyZWUuQlBUcmVlCgkvLyBTZXREZXBvc2l0cyBwZXJzaXN0cyB0aGUgZGVwb3NpdCB0cmVlIGluIHRoZSBjdXJyZW50IHN0b3JlIHJlYWxtLgoJLy8KCS8vIFBhcmFtZXRlcnM6CgkvLyAgIC0gXzogTm9uY3Jvc3NpbmcgaW1wbGVtZW50YXRpb24tY2FsbCBkaXNjcmltaW5hdG9yOyBwYXNzIDAuCgkvLyAgIC0gcmxtOiBjdXJyZW50IHJlYWxtIGNvbnRleHQgZm9yd2FyZGVkIGZvciBjdXJyZW50LXJlYWxtIHZhbGlkYXRpb24uCgkvLyAgIC0gZGVwb3NpdHM6IGRlcG9zaXQgdHJlZSB0byBwZXJzaXN0LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXJyOiBub24tbmlsIHdoZW4gdGhlIHJlYWxtIGNvbnRleHQgZmFpbHMgc3RvcmUgdmFsaWRhdGlvbiBvciBwZXJzaXN0ZW5jZSBmYWlscy4KCVNldERlcG9zaXRzKF8gaW50LCBybG0gcmVhbG0sIGRlcG9zaXRzICpicHRyZWUuQlBUcmVlKSBlcnJvcgoKCS8vIEhhc1RvdGFsR05TU3Rha2VkQW1vdW50S2V5IHJlcG9ydHMgd2hldGhlciB0aGUgYWdncmVnYXRlIEdOUyBzdGFrZSBoYXMgYSBwZXJzaXN0ZWQga2V5LgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gZXhpc3RzOiB0cnVlIHdoZW4gdGhlIHRvdGFsLXN0YWtlIHN0b3JlIGtleSBpcyBwcmVzZW50LgoJSGFzVG90YWxHTlNTdGFrZWRBbW91bnRLZXkoKSBib29sCgkvLyBHZXRUb3RhbEdOU1N0YWtlZEFtb3VudCByZXR1cm5zIHRoZSBhZ2dyZWdhdGUgR05TIGFtb3VudCBjdXJyZW50bHkgc3Rha2VkLgoJLy8KCS8vIFJldHVybnM6CgkvLyAgIC0gYW1vdW50OiB0b3RhbCBHTlMgYW1vdW50IGN1cnJlbnRseSBoZWxkIGluIGRlcG9zaXRzLgoJR2V0VG90YWxHTlNTdGFrZWRBbW91bnQoKSBpbnQ2NAoJLy8gU2V0VG90YWxHTlNTdGFrZWRBbW91bnQgcGVyc2lzdHMgdGhlIGFnZ3JlZ2F0ZSBjdXJyZW50IEdOUyBzdGFrZS4KCS8vCgkvLyBQYXJhbWV0ZXJzOgoJLy8gICAtIF86IE5vbmNyb3NzaW5nIGltcGxlbWVudGF0aW9uLWNhbGwgZGlzY3JpbWluYXRvcjsgcGFzcyAwLgoJLy8gICAtIHJsbTogY3VycmVudCByZWFsbSBjb250ZXh0IGZvcndhcmRlZCBmb3IgY3VycmVudC1yZWFsbSB2YWxpZGF0aW9uLgoJLy8gICAtIGFtb3VudDogYWdncmVnYXRlIEdOUyBhbW91bnQgY3VycmVudGx5IHN0YWtlZC4KCS8vCgkvLyBSZXR1cm5zOgoJLy8gICAtIGVycjogbm9uLW5pbCB3aGVuIHRoZSByZWFsbSBjb250ZXh0IGZhaWxzIHN0b3JlIHZhbGlkYXRpb24gb3IgcGVyc2lzdGVuY2UgZmFpbHMuCglTZXRUb3RhbEdOU1N0YWtlZEFtb3VudChfIGludCwgcmxtIHJlYWxtLCBhbW91bnQgaW50NjQpIGVycm9yCn0KGrcUCgt1cGdyYWRlLmdubxKnFHBhY2thZ2UgbGF1bmNocGFkCgppbXBvcnQgKAoJImduby5sYW5kL3IvZ25vc3dhcC9hY2Nlc3MvdjEiCikKCi8vIFJlZ2lzdGVySW5pdGlhbGl6ZXIgcmVnaXN0ZXJzIGEgbmV3IGxhdW5jaHBhZCBpbXBsZW1lbnRhdGlvbiB2ZXJzaW9uLgovLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBlYWNoIHZlcnNpb24gKHYxLCB2MiwgZXRjLikgZHVyaW5nIGluaXRpYWxpemF0aW9uCi8vIHRvIHJlZ2lzdGVyIHRoZWlyIGltcGxlbWVudGF0aW9uIHdpdGggdGhlIHByb3h5IHN5c3RlbS4KLy8KLy8gVGhlIGluaXRpYWxpemVyIGZ1bmN0aW9uIGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGltcGxlbWVudGF0aW9uCi8vIHVzaW5nIHRoZSBwcm92aWRlZCBsYXVuY2hwYWRTdG9yZSBpbnRlcmZhY2UuCi8vCi8vIFNlY3VyaXR5OiBPbmx5IGNvbnRyYWN0cyB3aXRoaW4gdGhlIGRvbWFpbiBwYXRoIGNhbiByZWdpc3RlciBpbml0aWFsaXplcnMuCi8vIEVhY2ggcGFja2FnZSBwYXRoIGNhbiBvbmx5IHJlZ2lzdGVyIG9uY2UgdG8gcHJldmVudCBkdXBsaWNhdGUgcmVnaXN0cmF0aW9ucy4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogY3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gaW5pdGlhbGl6ZXI6IGNhbGxiYWNrIHRoYXQgcmVjZWl2ZXMgdGhlIGltcGxlbWVudGF0aW9uIHJlYWxtIGNvbnRleHQgYW5kIGxhdW5jaHBhZCBzdG9yZSwgdGhlbiByZXR1cm5zIHRoZSB2ZXJzaW9uJ3MgSUxhdW5jaHBhZCBpbXBsZW1lbnRhdGlvbjsgaXRzIGxlYWRpbmcgaW50ZWdlciBkaXNjcmltaW5hdG9yIGlzIGludm9rZWQgYXMgMC4KZnVuYyBSZWdpc3RlckluaXRpYWxpemVyKGN1ciByZWFsbSwgaW5pdGlhbGl6ZXIgZnVuYyhfIGludCwgcmxtIHJlYWxtLCBsYXVuY2hwYWRTdG9yZSBJTGF1bmNocGFkU3RvcmUpIElMYXVuY2hwYWQpIHsKCWluaXRpYWxpemVyRnVuYyA6PSBmdW5jKF8gaW50LCBybG0gcmVhbG0sIGRvbWFpblN0b3JlIGFueSkgYW55IHsKCQlhY2Nlc3MuQXNzZXJ0SXNSbG1DdXJyZW50KDAsIHJsbSkKCgkJY3VycmVudExhdW5jaHBhZFN0b3JlLCBvayA6PSBkb21haW5TdG9yZS4oSUxhdW5jaHBhZFN0b3JlKQoJCWlmICFvayB7CgkJCXBhbmljKCJkb21haW5TdG9yZSBpcyBub3QgYW4gSUxhdW5jaHBhZFN0b3JlIikKCQl9CgoJCXJldHVybiBpbml0aWFsaXplcigwLCBybG0sIGN1cnJlbnRMYXVuY2hwYWRTdG9yZSkKCX0KCgllcnIgOj0gdmVyc2lvbk1hbmFnZXIuUmVnaXN0ZXJJbml0aWFsaXplcigwLCBjdXIsIGluaXRpYWxpemVyRnVuYykKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgllcnIgPSB1cGRhdGVJbXBsZW1lbnRhdGlvbigpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9Cn0KCi8vIFVwZ3JhZGVJbXBsIHN3aXRjaGVzIHRoZSBhY3RpdmUgbGF1bmNocGFkIGltcGxlbWVudGF0aW9uIHRvIGEgZGlmZmVyZW50IHZlcnNpb24uCi8vIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHNlYW1sZXNzIHVwZ3JhZGVzIGZyb20gb25lIHZlcnNpb24gdG8gYW5vdGhlciB3aXRob3V0Ci8vIGRhdGEgbWlncmF0aW9uIG9yIGRvd250aW1lLgovLwovLyBTZWN1cml0eTogT25seSBhZG1pbiBvciBnb3Zlcm5hbmNlIGNhbiBwZXJmb3JtIHVwZ3JhZGVzLgovLyBUaGUgbmV3IGltcGxlbWVudGF0aW9uIG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCB2aWEgUmVnaXN0ZXJJbml0aWFsaXplci4KLy8KLy8gUGFyYW1ldGVyczoKLy8gICAtIGN1cjogY3VycmVudCByZWFsbSBjb250ZXh0OyBjYWxsZXJzIHVzZSBjcm9zcyhjdXIpIHdoZW4gY3Jvc3NpbmcgaW50byB0aGlzIHJlYWxtLgovLyAgIC0gcGFja2FnZVBhdGg6IHJlZ2lzdGVyZWQgcGFja2FnZSBwYXRoIG9mIHRoZSBsYXVuY2hwYWQgaW1wbGVtZW50YXRpb24gdG8gYWN0aXZhdGUuCmZ1bmMgVXBncmFkZUltcGwoY3VyIHJlYWxtLCBwYWNrYWdlUGF0aCBzdHJpbmcpIHsKCS8vIEVuc3VyZSBvbmx5IGFkbWluIG9yIGdvdmVybmFuY2UgY2FuIHBlcmZvcm0gdXBncmFkZXMKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWFjY2Vzcy5Bc3NlcnRJc0FkbWluT3JHb3Zlcm5hbmNlKGNhbGxlcikKCgllcnIgOj0gdmVyc2lvbk1hbmFnZXIuQ2hhbmdlSW1wbGVtZW50YXRpb24oMCwgY3VyLCBwYWNrYWdlUGF0aCkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCgllcnIgPSB1cGRhdGVJbXBsZW1lbnRhdGlvbigpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9Cn0KCi8vIEdldEltcGxlbWVudGF0aW9uUGFja2FnZVBhdGggcmV0dXJucyB0aGUgcGFja2FnZSBwYXRoIG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIGltcGxlbWVudGF0aW9uLgovLwovLyBSZXR1cm5zOgovLyAgIC0gcGFja2FnZVBhdGg6IHBhY2thZ2UgcGF0aCBvZiB0aGUgYWN0aXZlIGltcGxlbWVudGF0aW9uCmZ1bmMgR2V0SW1wbGVtZW50YXRpb25QYWNrYWdlUGF0aCgpIHN0cmluZyB7CglyZXR1cm4gdmVyc2lvbk1hbmFnZXIuR2V0Q3VycmVudFBhY2thZ2VQYXRoKCkKfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwSEwiMz7TAARILMjAxNzU4dWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDBJzVBMPi0jqizwud5so4H6Lp9Zc4oYF/2VGlIjXCuuESQBjmNxexTqDsKhPVNxommdjUzibaxKzxXUsOLmOQjE5gDfcdFpu+raFhIpktJWQLwj2Zo3tsrcstvB30LEzzDGUaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=

Raw transaction data

Raw JSON data