Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
77C096A39E473BD38782473A6BDD94F6146993520D88D19CB473461BA5A0792F
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
70,000,000
Requested gas limit
GAS USED
48,474,993
Gas consumed
FEE
80000ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1z0c0wrmwpzpd0gq4q67hl9508dtgv4epr0z5ml
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CqeHAgoML3ZtLm1fYWRkcGtnEpWHAgooZzF6MGMwd3Jtd3B6cGQwZ3E0cTY3aGw5NTA4ZHRndjRlcHIwejVtbBLnhgIKDmdub21pY19haXJkcm9wEipnbm8ubGFuZC9yL255bS10aGVnbm9taWMwMDEvZ25vbWljX2FpcmRyb3AarvwBCgthaXJkcm9wLmdubxKd/AEvLyBDbGFpbS1iYXNlZCBhaXJkcm9wIHJlYWxtIHdpdGggTWVya2xlIHByb29mcy4KLy8KLy8gV2h5IE1lcmtsZSByYXRoZXIgdGhhbiBhbiBvbi1jaGFpbiBsaXN0OgovLyAgIC0gdGhlIGJlbmVmaWNpYXJ5IGxpc3QgY2FuIHJ1biB0byB0ZW5zIG9mIHRob3VzYW5kcyBvZiByb3dzOyB3cml0aW5nIGl0Ci8vICAgICBvbi1jaGFpbiBjb3N0cyBnYXMgYW5kIHN0b3JhZ2UgZGVwb3NpdCBpbiBwcm9wb3J0aW9uOwovLyAgIC0gaGVyZSBvbmx5IDMyIGJ5dGVzIGdvIG9uLWNoYWluICh0aGUgcm9vdCksIHBsdXMgb25lIHJlY29yZCBwZXIgQUNUVUFMCi8vICAgICBjbGFpbS4gV2hvZXZlciBuZXZlciBjbGFpbXMgY29zdHMgbm90aGluZy4KLy8KLy8gT3BlcmF0aW5nIGZsb3c6Ci8vICAxLiBkZXBsb3kgdGhpcyByZWFsbTsKLy8gIDIuIGZ1bmQgaXQgYnkgdHJhbnNmZXJyaW5nIEdSQzIwIHRva2VucyB0byBpdCAoaXRzIGFkZHJlc3MgaXMgcmV0dXJuZWQgYnkKLy8gICAgIFJlYWxtQWRkcmVzcygpKTsKLy8gIDMuIHRoZSBhZG1pbiBwdWJsaXNoZXMgcm9vdCwgbGVhZiBjb3VudCBhbmQgZGVhZGxpbmUgYmxvY2sgd2l0aCBTZXRDYW1wYWlnbjsKLy8gIDQuIGVhY2ggYmVuZWZpY2lhcnkgY2FsbHMgQ2xhaW0gd2l0aCB0aGVpciBvd24gcHJvb2Y7Ci8vICA1LiBhZnRlciB0aGUgZGVhZGxpbmUgdGhlIGFkbWluIHJlY292ZXJzIHRoZSByZXNpZHVlIHdpdGggU3dlZXAuCi8vCi8vIFRoZSBNZXJrbGUgbGVhZiBpcyB0aGUgc3RyaW5nICI8YWRkcmVzcz58PGFtb3VudCBpbiBiYXNlIHVuaXRzPiIsIFVURi04Ci8vIGVuY29kZWQuIFRoZSB0cmVlIGlzIFRlbmRlcm1pbnQncyAic2ltcGxlIHRyZWUiIChnbm8ncyBjcnlwdG8vbWVya2xlKToKLy8gbGVhZiA9IFNIQTI1NigweDAwfHxkYXRhKSwgbm9kZSA9IFNIQTI1NigweDAxfHxsZWZ0fHxyaWdodCksIHNwbGl0IGF0IHRoZQovLyBsYXJnZXN0IHBvd2VyIG9mIHR3byBiZWxvdyBuLiBUaGUgZ2VuZXJhdG9yIGluIHRvb2xzL21lcmtsZSBwcm9kdWNlcwovLyBjb21wYXRpYmxlIHByb29mcy4KcGFja2FnZSBnbm9taWNfYWlyZHJvcAoKaW1wb3J0ICgKCSJjaGFpbiIKCSJtYXRoIgoJImNoYWluL3J1bnRpbWUiCgkiY2hhaW4vcnVudGltZS91bnNhZmUiCgkiY3J5cHRvL21lcmtsZSIKCSJlbmNvZGluZy9oZXgiCgkic3RyY29udiIKCSJzdHJpbmdzIgoJInRpbWUiCgoJImduby5sYW5kL3AvbnQvYXZsL3YwIgoJImduby5sYW5kL3AvbnQvb3duYWJsZS92MCIKCSJnbm8ubGFuZC9wL250L3VmbXQvdjAiCgkiZ25vLmxhbmQvci9udC9ncmMyMHJlZy92MCIKCgkvLyBSZWFsbSBvZiB0aGUgZGlzdHJpYnV0ZWQgdG9rZW4uIFRyYW5zZmVycyBnbyB0aHJvdWdoIHRoZSByZWdpc3RyeSB0byBzdGF5CgkvLyBkZWNvdXBsZWQsIGJ1dCBCVVJOSU5HIG5lZWRzIHRoZSByZWFsIHJlYWxtOiB0aGUgcmVnaXN0cnkgZXhwb3NlcwoJLy8gVHJhbnNmZXIvQXBwcm92ZS9UcmFuc2ZlckZyb20sIG5vdCBCdXJuLiBzY3JpcHRzL3JlbmRlci5zaCByZXdyaXRlcyB0aGlzCgkvLyBwYXRoIHdpdGggdGhlIGFjdHVhbCB0b2tlbidzIG9uZS4KCXRva2VuICJnbm8ubGFuZC9yL255bS10aGVnbm9taWMwMDEvZ25vbWljIgopCgovLyBPd25hYmxlIGhvbGRzIHRoZSBhZG1pbmlzdHJhdGl2ZSBhdXRob3JpdHkgb3ZlciB0aGUgY2FtcGFpZ24uCnZhciBPd25hYmxlICpvd25hYmxlLk93bmFibGUKCi8vIHRva2VuS2V5IGlzIHRoZSBrZXkgb2YgdGhlIGRpc3RyaWJ1dGVkIHRva2VuLiBJdCBpcyBhIHZhcmlhYmxlIHJhdGhlciB0aGFuIGEKLy8gY29uc3RhbnQgb25seSBzbyB0aGF0IHRlc3RzIGNhbiByZWdpc3RlciBvbmUgb2YgdGhlaXIgb3duOyBpbiBwcm9kdWN0aW9uIGl0Ci8vIGtlZXBzIHRoZSBjb25maWcuZ25vIHZhbHVlIGZvciB0aGUgcmVhbG0ncyB3aG9sZSBsaWZlLgp2YXIgdG9rZW5LZXkgPSBkZWZhdWx0VG9rZW5LZXkKCi8vIGNsYWltV2luZG93U2Vjb25kcyBpcyBhIHZhcmlhYmxlIGZvciB0aGUgc2FtZSByZWFzb246IHRlc3RzIHNocmluayBvciB3aWRlbgovLyBpdC4gSW4gcHJvZHVjdGlvbiBpdCBrZWVwcyB0aGUgY29uZmlnLmdubyB2YWx1ZSBmb3IgdGhlIHJlYWxtJ3Mgd2hvbGUgbGlmZS4KdmFyIGNsYWltV2luZG93U2Vjb25kcyA9IGRlZmF1bHRDbGFpbVdpbmRvd1NlY29uZHMKCi8vIHdpdGhkcmF3Q29vbGRvd25TZWNvbmRzIGxpa2V3aXNlOiB0ZXN0cyBzd2l0Y2ggaXQgb2ZmLCBwcm9kdWN0aW9uIGtlZXBzIGl0Lgp2YXIgd2l0aGRyYXdDb29sZG93blNlY29uZHMgPSBkZWZhdWx0V2l0aGRyYXdDb29sZG93blNlY29uZHMKCnZhciAoCglyb290ICAgICAgW11ieXRlIC8vIE1lcmtsZSByb290IG9mIHRoZSBjdXJyZW50IGNhbXBhaWduCglsZWFmQ291bnQgaW50ICAgIC8vIHRvdGFsIG51bWJlciBvZiBsZWF2ZXMgKG5lZWRlZCB0byB2ZXJpZnkpCgllbmRIZWlnaHQgaW50NjQgIC8vIGJsb2NrIHBhc3Qgd2hpY2ggbm8gb25lIGNhbiBjbGFpbSAoMCA9IG5vIGxpbWl0KQoJZXBvY2ggICAgIGludCAgICAvLyBidW1wZWQgb24gZXZlcnkgbmV3IGNhbXBhaWduCgoJLy8gY2xhaW1lZCBpcyB0aGUgcmVnaXN0ZXIgb2YgZ3JhbnRzOiAiPGFkZHJlc3M+IiAtPiAqZ3JhbnQuCgkvLwoJLy8gSXQgaXMgYWxzbyB0aGUgT05MWSBkZWZlbmNlIGFnYWluc3QgZG91YmxlIGNsYWltaW5nLiBBIE1lcmtsZSBwcm9vZiBzaG93cwoJLy8geW91IGFyZSBlbnRpdGxlZCwgYnV0IGl0IGlzIHJldXNhYmxlIGZvcmV2ZXI6IG9ubHkgdGhpcyByZWdpc3RlciBrbm93cwoJLy8gdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IGNvbGxlY3RlZC4KCS8vCgkvLyBDQVJFRlVMOiBuZXZlciBkZWxldGUgYW4gZW50cnksIG5vdCBldmVuIGEgc2V0dGxlZCBvbmUgdG8gcmVjbGFpbSBpdHMKCS8vIHN0b3JhZ2UgZGVwb3NpdC4gSXQgbG9va3MgbGlrZSBhIGhhcm1sZXNzIG9wdGltaXNhdGlvbiBhbmQgaW5zdGVhZAoJLy8gcmVvcGVucyBkb3VibGUgY2xhaW1pbmc6IHNvbWVvbmUgd2hvIGFscmVhZHkgd2l0aGRyZXcgZXZlcnl0aGluZyB3b3VsZAoJLy8gcHJlc2VudCB0aGUgc2FtZSBwcm9vZiB0byBhIHJlZ2lzdGVyIHRoYXQgaGFzIGZvcmdvdHRlbiB0aGVtLgoJY2xhaW1lZCBhdmwuVHJlZQoKCS8vIGNhbXBhaWduU3RhcnQgaXMgd2hlbiB0aGUgY3VycmVudCBjYW1wYWlnbiBvcGVuZWQ6IGxpbmVhciByZWxlYXNlIHJ1bnMKCS8vIGZyb20gdGhlcmUgZm9yIEVWRVJZT05FLCBub3QgZnJvbSB0aGUgbW9tZW50IG9mIHRoZSBpbmRpdmlkdWFsIGNsYWltLgoJLy8gT3RoZXJ3aXNlIGEgbGF0ZSBjbGFpbWVyIHdvdWxkIHZlc3QgbGF0ZSwgYW5kIHRoZXJlIHdvdWxkIGJlIGEgcmVhc29uIHRvCgkvLyBydXNoIHRvIGNsYWltIGp1c3QgdG8gc3RhcnQgdGhlIGNsb2NrIHNvb25lci4KCS8vCgkvLyBFdmVyeSBncmFudCBrZWVwcyBhIGNvcHkgaW4gZ3JhbnQuc3RhcnQ6IG9wZW5pbmcgYSBuZXcgY2FtcGFpZ24gbXVzdCBub3QKCS8vIGRpc3R1cmIgdGhlIHZlc3RpbmcgYWxyZWFkeSB1bmRlciB3YXkgZm9yIHdob2V2ZXIgY2xhaW1lZCBpbiB0aGUKCS8vIHByZXZpb3VzIG9uZS4KCWNhbXBhaWduU3RhcnQgaW50NjQKCgkvLyBvdXRzdGFuZGluZyBpcyB0aGUgc3VtIG9mIHdoYXQgaGFzIGJlZW4gZ3JhbnRlZCBidXQgbm90IHlldCB3aXRoZHJhd24uCgkvLyBJdCBwcm90ZWN0cyBiZW5lZmljaWFyaWVzOiBTd2VlcCBjYW5ub3QgdG91Y2ggdGhpcyBwYXJ0LgoJb3V0c3RhbmRpbmcgaW50NjQKCgkvLyBzZWFsZWQgbWFrZXMgb3BlbmluZyBmdXJ0aGVyIGNhbXBhaWducyBpbXBvc3NpYmxlLiBJdCBpcyB0aGUgZXF1aXZhbGVudAoJLy8gb2YgRHJvcE93bmVyc2hpcCBvbiB0aGUgdG9rZW46IGEgIm9uZS1vZmYiIGFpcmRyb3AgYW5ub3VuY2VkIGluIHdvcmRzCgkvLyBzdGF5cyBhIHByb21pc2U7IHNlYWxlZCBpbiBjb2RlIGl0IGJlY29tZXMgYSBwcm9wZXJ0eSBhbnlvbmUgY2FuIHZlcmlmeQoJLy8gd2l0aCBhIHF1ZXJ5LgoJc2VhbGVkIGJvb2wKCgl0b3RhbENsYWltZWQgIGludDY0IC8vIHRvdGFsIGFjdHVhbGx5IHBhaWQgb3V0Cgl0b3RhbEdyYW50ZWQgIGludDY0IC8vIHRvdGFsIGdyYW50ZWQgKGluY2x1ZGluZyB3aGF0IGhhcyBub3QgdmVzdGVkIHlldCkKCXRvdGFsQnVybmVkICAgaW50NjQgLy8gdG90YWwgZGVzdHJveWVkOiBpbnN0YW50IGV4aXRzLCByZW51bmNpYXRpb25zLCBzZXR0bGVtZW50CglzZXR0bGVkQnVybmVkIGludDY0IC8vIGJ1cm5lZCBieSBTZXR0bGVVbmNsYWltZWQKCXNldHRsZWRUb0Z1bmQgaW50NjQgLy8gc2VudCB0byB0aGUgZWNvc3lzdGVtIGZ1bmQgYnkgU2V0dGxlVW5jbGFpbWVkCgl0b3RhbFRvRnVuZCAgIGludDY0IC8vIHNlbnQgdG8gdGhlIGVjb3N5c3RlbSBmdW5kIGJ5IHZvbHVudGFyeSBmb3JmZWl0cwoJY2xhaW1Db3VudCAgICBpbnQKCXJlYWxtQWRkciAgICAgYWRkcmVzcwopCgovLyBncmFudCBpcyB0aGUgZW50aXRsZW1lbnQgYSBiZW5lZmljaWFyeSBvYnRhaW5lZCBpbiBhIGNhbXBhaWduLgovLyBJdCBhbHdheXMgaG9sZHMgdGhhdCB0b3RhbCA9PSB3aXRoZHJhd24gKyBidXJuZWQgKyB0b0Z1bmQgKyAobm90IHlldCByZWxlYXNlZCkuCi8vCi8vIEdyYW50cyBhcmUga2V5ZWQgYnkgYWRkcmVzcyBBTE9ORSwgbm90IGJ5ICJlcG9jaDphZGRyZXNzIjogdHlpbmcgdGhlIGtleSB0bwovLyB0aGUgZXBvY2ggbWFkZSB0aGUgcHJldmlvdXMgY2FtcGFpZ24ncyBncmFudHMgdW5yZWFjaGFibGUgYXMgc29vbiBhcyBhIG5ldwovLyBvbmUgb3BlbmVkIOKAlCB0aGUgYmVuZWZpY2lhcnkgY291bGQgbm8gbG9uZ2VyIHdpdGhkcmF3IGFuZCB0aGUgdG9rZW5zIHN0YXllZAovLyBjb3VudGVkIGluIG91dHN0YW5kaW5nLCBzbyBub3QgZXZlbiBTd2VlcCBjb3VsZCByZWNvdmVyIHRoZW0uCnR5cGUgZ3JhbnQgc3RydWN0IHsKCWVwb2NoICAgICAgICBpbnQgICAvLyBjYW1wYWlnbiBpdCB3YXMgZ3JhbnRlZCBpbgoJc3RhcnQgICAgICAgIGludDY0IC8vIHN0YXJ0IG9mIHRoaXMgZ3JhbnQncyB2ZXN0aW5nCgl0b3RhbCAgICAgICAgaW50NjQgLy8gdG90YWwgYW1vdW50IGdyYW50ZWQKCXdpdGhkcmF3biAgICBpbnQ2NCAvLyBob3cgbXVjaCBoYXMgYWxyZWFkeSBiZWVuIHRyYW5zZmVycmVkCglidXJuZWQgICAgICAgaW50NjQgLy8gaG93IG11Y2ggd2FzIGRlc3Ryb3llZCAoaW5zdGFudCBleGl0IG9yIGZvcmZlaXQpCgl0b0Z1bmQgICAgICAgaW50NjQgLy8gaG93IG11Y2ggd2VudCB0byB0aGUgZWNvc3lzdGVtIGZ1bmQgKGZvcmZlaXQpCglsYXN0V2l0aGRyYXcgaW50NjQgLy8gdW5peCB0aW1lIG9mIHRoZSBsYXN0IHBheW91dDsgZHJpdmVzIHRoZSBjb29sZG93bgp9CgovLyBzZXR0bGVkIHJlcG9ydHMgd2hldGhlciBub3RoaW5nIGlzIGxlZnQgdG8gcGF5IG91dCBvbiB0aGUgZ3JhbnQuCmZ1bmMgKGcgKmdyYW50KSBzZXR0bGVkKCkgYm9vbCB7IHJldHVybiBnLnRvdGFsIDw9IGcud2l0aGRyYXduK2cuYnVybmVkK2cudG9GdW5kIH0KCi8vIGNsb3NlZCByZXBvcnRzIHdoZXRoZXIgdGhlIGdyYW50IHdhcyBlbmRlZCBieSBhbiBpbnN0YW50IGV4aXQgb3IgYSBmb3JmZWl0LgpmdW5jIChnICpncmFudCkgY2xvc2VkKCkgYm9vbCB7IHJldHVybiBnLmJ1cm5lZCA+IDAgfHwgZy50b0Z1bmQgPiAwIH0KCmNvbnN0ICgKCVNlYWxFdmVudCAgICAgPSAiQWlyZHJvcFNlYWwiCglTZXR0bGVFdmVudCAgID0gIkFpcmRyb3BTZXR0bGVVbmNsYWltZWQiCglDbGFpbUV2ZW50ICAgID0gIkFpcmRyb3BDbGFpbSIKCVdpdGhkcmF3RXZlbnQgPSAiQWlyZHJvcFdpdGhkcmF3IgoJRm9yZmVpdEV2ZW50ICA9ICJBaXJkcm9wRm9yZmVpdCIKCUNhbXBhaWduRXZlbnQgPSAiQWlyZHJvcENhbXBhaWduIgopCgpjb25zdCBicHNEZW5vbWluYXRvciA9IDEwMDAwCgpmdW5jIGluaXQoY3VyIHJlYWxtKSB7CglhZG1pbiA6PSBhZGRyZXNzKGFkbWluQWRkcmVzcykKCWlmICFhZG1pbi5Jc1ZhbGlkKCkgewoJCWFkbWluID0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCgl9CglpZiAhYWRtaW4uSXNWYWxpZCgpIHsKCQlhZG1pbiA9IHVuc2FmZS5PcmlnaW5DYWxsZXIoKQoJfQoJaWYgIWFkbWluLklzVmFsaWQoKSB7CgkJcGFuaWMoImFpcmRyb3A6IGNhbm5vdCBkZXRlcm1pbmUgdGhlIGFkbWluaXN0cmF0b3IiKQoJfQoJT3duYWJsZSA9IG93bmFibGUuTmV3V2l0aEFkZHJlc3MoYWRtaW4pCglyZWFsbUFkZHIgPSBjdXIuQWRkcmVzcygpCgoJLy8gVGhlIHJlZ2lzdHJ5IGtleSBhbmQgdGhlIGltcG9ydGVkIHJlYWxtIG11c3QgbmFtZSB0aGUgU0FNRSB0b2tlbi4KCS8vIFRyYW5zZmVycyBnbyB0aHJvdWdoIHRoZSByZWdpc3RyeSAoYnkga2V5KSB3aGlsZSBidXJucyBjYWxsIHRoZSBpbXBvcnRlZAoJLy8gcmVhbG0gZGlyZWN0bHk6IGlmIHRoZSB0d28gZXZlciBkaXNhZ3JlZWQgdGhlIGFpcmRyb3Agd291bGQgcGF5IG91dCBvbmUKCS8vIHRva2VuIGFuZCBkZXN0cm95IGFub3RoZXIsIGFuZCBub3RoaW5nIHdvdWxkIG5vdGljZSB1bnRpbCB0aGUgZmlyc3QKCS8vIGZvcmZlaXQuIERlcml2aW5nIHRoZSBrZXkgZnJvbSB0aGUgaW1wb3J0IG1ha2VzIHRoZW0gZXF1YWwgYnkKCS8vIGNvbnN0cnVjdGlvbjsgdGhlIGNvbnN0YW50IHN1cnZpdmVzIG9ubHkgdG8gbWFrZSBhIHdyb25nIFRPS0VOX0tFWSBpbgoJLy8gY29uZmlnLmVudiBmYWlsIGhlcmUsIGF0IGRlcGxveSwgaW5zdGVhZCBvZiBzaWxlbnRseSBpbiBhIHllYXIuCgl0b2tlbktleSA9IHRva2VuLlRva2VuS2V5KCkKCWlmIGRlZmF1bHRUb2tlbktleSAhPSB0b2tlbktleSB7CgkJcGFuaWMoImFpcmRyb3A6IGNvbmZpZy5nbm8gbmFtZXMgIiArIGRlZmF1bHRUb2tlbktleSArCgkJCSIgYnV0IHRoZSBpbXBvcnRlZCB0b2tlbiByZWFsbSBpcyAiICsgdG9rZW5LZXkpCgl9Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBBZG1pbmlzdHJhdGlvbgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIFNldENhbXBhaWduIHB1Ymxpc2hlcyBhIG5ldyBjYW1wYWlnbjogcm9vdEhleCBpcyB0aGUgTWVya2xlIHJvb3QgaW4gaGV4Ci8vICgzMiBieXRlcyksIHRvdGFsIHRoZSBudW1iZXIgb2YgbGVhdmVzIGluIHRoZSB0cmVlLCBlbmQgdGhlIGRlYWRsaW5lIGJsb2NrCi8vICgwID0gbm8gZGVhZGxpbmUpLgovLwovLyBQdWJsaXNoaW5nIGEgbmV3IGNhbXBhaWduIHJlc2V0cyB0aGUgY2xhaW0gaGlzdG9yeTogd2hvZXZlciBhcHBlYXJzIG9uIGJvdGgKLy8gbGlzdHMgY2FuIGNsYWltIGFnYWluLiBUaGF0IGlzIGRlbGliZXJhdGUg4oCUIGl0IGFsbG93cyByZWN1cnJpbmcgYWlyZHJvcHMgb24KLy8gdGhlIHNhbWUgcmVhbG0gd2l0aG91dCBhIHJlZGVwbG95LgpmdW5jIFNldENhbXBhaWduKGN1ciByZWFsbSwgcm9vdEhleCBzdHJpbmcsIHRvdGFsIGludCwgZW5kIGludDY0KSB7CglPd25hYmxlLkFzc2VydE93bmVkQnkoY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpKQoJaWYgc2VhbGVkIHsKCQlwYW5pYygiYWlyZHJvcDogY2FtcGFpZ24gaXMgc2VhbGVkLCBubyBmdXJ0aGVyIGNhbXBhaWduIGNhbiBiZSBvcGVuZWQiKQoJfQoKCXJhdywgZXJyIDo9IGhleC5EZWNvZGVTdHJpbmcoc3RyaW5ncy5UcmltUHJlZml4KHJvb3RIZXgsICIweCIpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoImFpcmRyb3A6IGludmFsaWQgcm9vdDogIiArIGVyci5FcnJvcigpKQoJfQoJaWYgbGVuKHJhdykgIT0gMzIgewoJCXBhbmljKCJhaXJkcm9wOiB0aGUgcm9vdCBtdXN0IGJlIDMyIGJ5dGVzIikKCX0KCWlmIHRvdGFsIDw9IDAgewoJCXBhbmljKCJhaXJkcm9wOiB0aGUgbGVhZiBjb3VudCBtdXN0IGJlIHBvc2l0aXZlIikKCX0KCWlmIGVuZCAhPSAwICYmIGVuZCA8PSBydW50aW1lLkNoYWluSGVpZ2h0KCkgewoJCXBhbmljKCJhaXJkcm9wOiB0aGUgZGVhZGxpbmUgbXVzdCBiZSBpbiB0aGUgZnV0dXJlIikKCX0KCglyb290ID0gcmF3CglsZWFmQ291bnQgPSB0b3RhbAoJZW5kSGVpZ2h0ID0gZW5kCgllcG9jaCsrCgljYW1wYWlnblN0YXJ0ID0gdGltZS5Ob3coKS5Vbml4KCkKCgljaGFpbi5FbWl0KAoJCUNhbXBhaWduRXZlbnQsCgkJImVwb2NoIiwgc3RyY29udi5JdG9hKGVwb2NoKSwKCQkicm9vdCIsIGhleC5FbmNvZGVUb1N0cmluZyhyYXcpLAoJCSJsZWF2ZXMiLCBzdHJjb252Lkl0b2EodG90YWwpLAoJCSJlbmQiLCBzdHJjb252LkZvcm1hdEludChlbmQsIDEwKSwKCSkKfQoKLy8gQ2xvc2VDYW1wYWlnbiBzdG9wcyBjbGFpbXMgaW1tZWRpYXRlbHkuCmZ1bmMgQ2xvc2VDYW1wYWlnbihjdXIgcmVhbG0pIHsKCU93bmFibGUuQXNzZXJ0T3duZWRCeShjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkpCgkvLyBEb3BvIGlsIHNpZ2lsbG8gbm9uIHNpIGNoaXVkZSBwaXUnIG5pZW50ZS4gSWwgc2lnaWxsbyBlc2lzdGUgcGVyIGRpcmUKCS8vICJxdWVzdGkgdGVybWluaSBzb25vIGRlZmluaXRpdmkiLCBlIGxhc2NpYXJlIGluIG1hbm8gYWwgcHJvcHJpZXRhcmlvIHVuCgkvLyBpbnRlcnJ1dHRvcmUgY2hlIHRvZ2xpZSBhIHR1dHRpIGxhIHBvc3NpYmlsaXRhJyBkaSByaXZlbmRpY2FyZSBsbwoJLy8gY29udHJhZGRpY2V2YTogYmFzdGF2YSBjaGl1ZGVyZSBlIGFzcGV0dGFyZSBpIGRvZGljaSBtZXNpIHBlcmNoZScgbWV0YScKCS8vIGRlbCBub24gcml2ZW5kaWNhdG8gYnJ1Y2lhc3NlIGUgbWV0YScgZmluaXNzZSBhbCBmb25kby4gUHJpbWEgZGVsCgkvLyBzaWdpbGxvIGxhIGNoaXVzdXJhIHNlcnZlIOKAlCBlJyBpbCBtb2RvIGRpIHJpbWVkaWFyZSBhIHVuYSByYWRpY2UKCS8vIHNiYWdsaWF0YSDigJQgZG9wbyBub24gaGEgcGl1JyBuZXNzdW4gdXNvIGxlZ2l0dGltby4KCWlmIHNlYWxlZCB7CgkJcGFuaWMoImFpcmRyb3A6IHRoZSBjYW1wYWlnbiBpcyBzZWFsZWQsIGl0IGNhbm5vdCBiZSBjbG9zZWQiKQoJfQoJcm9vdCA9IG5pbAoJbGVhZkNvdW50ID0gMAoJZW5kSGVpZ2h0ID0gMAp9CgovLyBTZWFsQ2FtcGFpZ24gY2xvc2VzIG9mZiB0aGUgcG9zc2liaWxpdHkgb2Ygb3BlbmluZyBuZXcgY2FtcGFpZ25zIGZvcmV2ZXIuCi8vIElycmV2ZXJzaWJsZTogbm8gY29kZSBwYXRoIHNldHMgc2VhbGVkIGJhY2sgdG8gZmFsc2UuIENhbGwgaXQgb25jZSB0aGUKLy8gcHVibGlzaGVkIHJvb3QgaXMgdGhlIGZpbmFsIG9uZS4KLy8KLy8gVW50aWwgdGhlbiB0aGUgb3duZXIgY2FuIGZpeCBhIG1pc3Rha2UgYnkgcmVwdWJsaXNoaW5nIHRoZSByb290OyBhZnRlcndhcmRzCi8vIHRoZSBhaXJkcm9wIGlzIHByb3ZhYmx5IG9uZS1vZmYgYW5kIGFueW9uZSBjYW4gY2hlY2sgd2l0aCBJc1NlYWxlZCgpLgpmdW5jIFNlYWxDYW1wYWlnbihjdXIgcmVhbG0pIHsKCU93bmFibGUuQXNzZXJ0T3duZWRCeShjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkpCglpZiBzZWFsZWQgewoJCXBhbmljKCJhaXJkcm9wOiBhbHJlYWR5IHNlYWxlZCIpCgl9CglpZiBsZW4ocm9vdCkgIT0gMzIgewoJCXBhbmljKCJhaXJkcm9wOiBubyBwdWJsaXNoZWQgcm9vdCB0byBzZWFsIikKCX0KCXNlYWxlZCA9IHRydWUKCWNoYWluLkVtaXQoU2VhbEV2ZW50LCAiZXBvY2giLCBzdHJjb252Lkl0b2EoZXBvY2gpLCAicm9vdCIsIGhleC5FbmNvZGVUb1N0cmluZyhyb290KSkKfQoKLy8gU2V0dGxlVW5jbGFpbWVkIGRpc3Bvc2VzIG9mIHdoYXRldmVyIHdhcyBuZXZlciBjbGFpbWVkLCBvbmNlIHRoZSBjbGFpbQovLyB3aW5kb3cgaGFzIGVsYXBzZWQ6IGhhbGYgaXMgYnVybmVkLCB0aGUgb3RoZXIgaGFsZiBnb2VzIHRvIHRoZSB0ZWFtIGZ1bmQuCi8vCi8vIFRoZSBydWxlIGlzIGVuZm9yY2VkIGhlcmUgcmF0aGVyIHRoYW4gcHJvbWlzZWQ6IHRoZXJlIGlzIG5vIFN3ZWVwIGFuZCBubwovLyBCdXJuUmVtYWluaW5nLCBzbyB0aGUgb3duZXIgY2Fubm90IHBvY2tldCB0aGUgcmVzaWR1ZSBub3IgZGVzdHJveSBhbGwgb2YgaXQuCi8vIFNldHRsZW1lbnQgd2FpdHMgZm9yIHRoZSB3aW5kb3cgZXZlbiBpZiBDbG9zZUNhbXBhaWduIHN0b3BwZWQgY2xhaW1zCi8vIGVhcmxpZXIsIGFuZCBncmFudHMgYWxyZWFkeSBtYWRlIHN0YXkgdW50b3VjaGFibGUg4oCUIG9ubHkgdGhlIGZyZWUgcGFydAovLyAoYmFsYW5jZSBtaW51cyBvdXRzdGFuZGluZykgaXMgc2V0dGxlZC4gQW55b25lIG1heSBjYWxsIGl0OiBpdCBpcyBhIHB1YmxpYwovLyBzZXJ2aWNlLCBub3QgYSBwcml2aWxlZ2UuCmZ1bmMgU2V0dGxlVW5jbGFpbWVkKGN1ciByZWFsbSkgewoJaWYgY2FtcGFpZ25TdGFydCA9PSAwIHsKCQlwYW5pYygiYWlyZHJvcDogbm8gY2FtcGFpZ24gd2FzIGV2ZXIgb3BlbmVkIikKCX0KCWlmIHRpbWUuTm93KCkuVW5peCgpIDwgY2FtcGFpZ25TdGFydCtjbGFpbVdpbmRvd1NlY29uZHMgewoJCXBhbmljKCJhaXJkcm9wOiB0aGUgY2xhaW0gd2luZG93IGhhcyBub3QgZWxhcHNlZCB5ZXQiKQoJfQoJaWYgaXNPcGVuKCkgewoJCXBhbmljKCJhaXJkcm9wOiB0aGUgY2FtcGFpZ24gaXMgc3RpbGwgb3BlbiIpCgl9CglmcmVlIDo9IEJhbGFuY2UoKSAtIG91dHN0YW5kaW5nCglpZiBmcmVlIDw9IDAgewoJCXBhbmljKCJhaXJkcm9wOiBubyB1bmNsYWltZWQgcmVzaWR1ZSB0byBzZXR0bGUiKQoJfQoJdGVhbSA6PSBhZGRyZXNzKGVjb3N5c3RlbUZ1bmRBZGRyZXNzKQoJaWYgIXRlYW0uSXNWYWxpZCgpIHsKCQlwYW5pYygiYWlyZHJvcDogZWNvc3lzdGVtIGZ1bmQgYWRkcmVzcyBpcyBub3QgY29uZmlndXJlZCIpCgl9CglidXJuIDo9IGZyZWUgLyAyCgl0b1RlYW0gOj0gZnJlZSAtIGJ1cm4KCXRvdGFsQnVybmVkID0gYWRkU2F0KHRvdGFsQnVybmVkLCBidXJuKQoJc2V0dGxlZEJ1cm5lZCA9IGFkZFNhdChzZXR0bGVkQnVybmVkLCBidXJuKQoJc2V0dGxlZFRvRnVuZCA9IGFkZFNhdChzZXR0bGVkVG9GdW5kLCB0b1RlYW0pCgkvLyBMZSBkdWUgZ3VhcmRpZSBub24gc29ubyBwZWRhbnRlcmlhOiBjb24gdW4gcmVzaWR1byBkaSBVTkEgdW5pdGEnIGJhc2UKCS8vIGJ1cm4gdmFsZSB6ZXJvLCBlIGlsIGxlZGdlciByaWZpdXRhIHVuIHJvZ28gZGkgemVyby4gU2VuemEgaWwgY29udHJvbGxvCgkvLyBsYSBsaXF1aWRhemlvbmUgZmFsbGlyZWJiZSBwZXIgc2VtcHJlIHByb3ByaW8gc3VsIHJlc2lkdW8gcGl1JyBwcm9iYWJpbGUKCS8vIGRpIHR1dHRpLCBxdWVsbG8gbGFzY2lhdG8gZGFsIHRyb25jYW1lbnRvLCBlIHF1ZWxsJ3VuaXRhJyByZXN0ZXJlYmJlCgkvLyBjaGl1c2EgbmVsIHJlYWxtIHNlbnphIGNoZSBuZXNzdW5vIHBvc3NhIHBpdScgdG9jY2FybGEuCglpZiBidXJuID4gMCB7CgkJdG9rZW4uQnVybihjcm9zcyhjdXIpLCBidXJuKQoJfQoJaWYgdG9UZWFtID4gMCB7CgkJZ3JjMjByZWcuVHJhbnNmZXIoMCwgY3VyLCB0b2tlbktleSwgdGVhbSwgdG9UZWFtKQoJfQoJY2hhaW4uRW1pdChTZXR0bGVFdmVudCwKCQkiYnVybmVkIiwgc3RyY29udi5Gb3JtYXRJbnQoYnVybiwgMTApLAoJCSJ0b190ZWFtIiwgc3RyY29udi5Gb3JtYXRJbnQodG9UZWFtLCAxMCksCgkJInRlYW0iLCB0ZWFtLlN0cmluZygpKQp9CgovLyBUcmFuc2Zlck93bmVyc2hpcCBoYW5kcyBhZG1pbmlzdHJhdGlvbiBvZiB0aGUgY2FtcGFpZ24gb3Zlci4KZnVuYyBUcmFuc2Zlck93bmVyc2hpcChjdXIgcmVhbG0sIG5ld093bmVyIGFkZHJlc3MpIHsKCWlmIGVyciA6PSBPd25hYmxlLlRyYW5zZmVyT3duZXJzaGlwKDAsIGN1ciwgbmV3T3duZXIpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIuRXJyb3IoKSkKCX0KfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIENsYWltaW5nCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gQ2xhaW0gcGF5cyBhbW91bnQgdG9rZW5zIHRvIHRoZSBjYWxsZXIsIGlmIHRoZSBNZXJrbGUgcHJvb2YKLy8gKGluZGV4LCBhdW50c0hleCkgc2hvd3MgdGhhdCAiPGNhbGxlcj58PGFtb3VudD4iIGlzIGEgbGVhZiBvZiB0aGUgcHVibGlzaGVkCi8vIHRyZWUuCi8vCi8vIGF1bnRzSGV4IGlzIHRoZSBoZXggY29uY2F0ZW5hdGlvbiBvZiB0aGUgc2libGluZyBoYXNoZXMsIDMyIGJ5dGVzIGVhY2gsIGp1c3QKLy8gYXMgcHJvZHVjZWQgYnkgdG9vbHMvbWVya2xlLgpmdW5jIENsYWltKGN1ciByZWFsbSwgYW1vdW50IGludDY0LCBpbmRleCBpbnQsIGF1bnRzSGV4IHN0cmluZykgewoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJaWYgIWN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSB7CgkJcGFuaWMoImFpcmRyb3A6IGEgY2xhaW0gbXVzdCBjb21lIGZyb20gYSB1c2VyIGFjY291bnQiKQoJfQoJY2xhaW1Gb3IoY3VyLCBjYWxsZXIsIGFtb3VudCwgaW5kZXgsIGF1bnRzSGV4KQp9CgovLyBjbGFpbUZvciBpcyB0aGUgYm9keSBvZiBDbGFpbS4gSXQgaXMgdW5leHBvcnRlZCBvbiBwdXJwb3NlOiBhIHRyYW5zYWN0aW9uCi8vIGNhbiBvbmx5IHJlYWNoIGV4cG9ydGVkIGZ1bmN0aW9ucywgc28gZnJvbSBvdXRzaWRlIHRoZSByZWFsbSB0aGUgb25seSB3YXkgaW4KLy8gaXMgQ2xhaW0sIHdoaWNoIGFsd2F5cyB1c2VzIHRoZSBjYWxsZXIncyBvd24gYWRkcmVzcy4gVGhlIHRlc3RzLCBiZWluZyBpbgovLyB0aGUgc2FtZSBwYWNrYWdlLCBzdGlsbCBleGVyY2lzZSB0aGUgcmVnaXN0cmF0aW9uIGxvZ2ljIGRpcmVjdGx5LgpmdW5jIGNsYWltRm9yKGN1ciByZWFsbSwgYmVuZWZpY2lhcnkgYWRkcmVzcywgYW1vdW50IGludDY0LCBpbmRleCBpbnQsIGF1bnRzSGV4IHN0cmluZykgewoJcmVnaXN0ZXJHcmFudChiZW5lZmljaWFyeSwgYW1vdW50LCBpbmRleCwgYXVudHNIZXgpCglyZWxlYXNlSWZBbnkoY3VyLCBiZW5lZmljaWFyeSkKfQoKLy8gVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IG5vICJjbGFpbSBvbiBiZWhhbGYgb2YiIGVudHJ5IHBvaW50LgovLwovLyBJdCB1c2VkIHRvIGV4aXN0LCBzbyB0aGF0IGEgdGhpcmQgcGFydHkgY291bGQgcGF5IHRoZSBnYXMgZm9yIHNvbWVvbmU6IHRoZQovLyB0b2tlbnMgd2VudCB0byB0aGUgYmVuZWZpY2lhcnkgZWl0aGVyIHdheSwgc28gaXQgbG9va2VkIGhhcm1sZXNzLiBJdCBpcyBub3QuCi8vIFJlZ2lzdGVyaW5nIHRoZSBncmFudCBpcyB3aGF0IFNQRU5EUyB0aGUgb25lIGNob2ljZSB0aGlzIGFpcmRyb3AgYWxsb3dzOiB0aGUKLy8gYmVuZWZpY2lhcnkgY2FuIG5vIGxvbmdlciB0YWtlIHRoZSBpbnN0YW50IDMwJSwgbm9yIHJlbm91bmNlLCBiZWNhdXNlIHRoZQovLyB2ZXN0aW5nIHBhdGggaGFzIGFscmVhZHkgYmVlbiBwaWNrZWQgZm9yIHRoZW0uIEEgdmFsaWQgTWVya2xlIHByb29mIHByb3ZlcwovLyBlbnRpdGxlbWVudCwgbmV2ZXIgY29uc2VudCwgYW5kIGV2ZXJ5IHByb29mIGlzIHB1YmxpYy4KLy8KLy8gV2l0aGRyYXdGb3Igc3RheXM6IGl0IG9ubHkgbW92ZXMgd2hhdCBoYXMgYWxyZWFkeSB2ZXN0ZWQgdG8gaXRzIG93bmVyLCBhbmQKLy8gdGFrZXMgbm8gZGVjaXNpb24gYXdheSBmcm9tIGFueW9uZS4KCi8vIENsYWltSW5zdGFudCBpcyB0aGUgZmlyc3Qgb2YgdGhlIHR3byBhbHRlcm5hdGl2ZXMgdG8gQ2xhaW06IHRoZSBpbnN0YW50Ci8vIHNoYXJlIChpbnN0YW50QnBzLCAzMCUpIGlzIHBhaWQgYXQgb25jZSBhbmQgdGhlIHJlc3QgKDcwJSkgaXMgZ2l2ZW4gdXAgdGhlCi8vIHNhbWUgd2F5IGEgZm9yZmVpdCBpcyDigJQgaGFsZiBidXJuZWQsIGhhbGYgdG8gdGhlIGVjb3N5c3RlbSBmdW5kIOKAlCB3aGVuZXZlcgovLyBpdCBpcyBjaG9zZW4sIGV2ZW4gYWZ0ZXIgdGhlIHdob2xlIGdyYW50IHdvdWxkIGhhdmUgdmVzdGVkLiBUaGUgc2hhcmUgaXMKLy8gbGFyZ2VyIHRoYW4gQ2xhaW0ncyBpbW1lZGlhdGUgMTAlIG9uIHB1cnBvc2U6IGl0IG1ha2VzIHRoZSBzaG9ydGN1dCBhIHJlYWwKLy8gY2hvaWNlIHJhdGhlciB0aGFuIGEgcHVuaXNobWVudC4gSXQgY2Fubm90IGJlIHVuZG9uZQovLyBhbmQgc3VpdHMgc29tZW9uZSB3aG8gcHJlZmVycyBhIGNlcnRhaW4gZnJhY3Rpb24gdG9kYXkgdG8gdGhlIHdob2xlIGEgeWVhcgovLyBmcm9tIG5vdy4gVGhlIHJlc2lkdWUgaXMgZGVzdHJveWVkLCB0byBldmVyeSBob2xkZXIncyBiZW5lZml0LgovLwovLyBPbmx5IHRoZSBwZXJzb24gY29uY2VybmVkIGNhbiBjaG9vc2UgaXQ6IHRoZXJlIGlzIG5vICJvbiBiZWhhbGYgb2YiIGZvcm0uCmZ1bmMgQ2xhaW1JbnN0YW50KGN1ciByZWFsbSwgYW1vdW50IGludDY0LCBpbmRleCBpbnQsIGF1bnRzSGV4IHN0cmluZykgewoJaWYgIWN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSB7CgkJcGFuaWMoImFpcmRyb3A6IGEgY2xhaW0gbXVzdCBjb21lIGZyb20gYSB1c2VyIGFjY291bnQiKQoJfQoJYmVuZWZpY2lhcnkgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglyZWdpc3RlckdyYW50KGJlbmVmaWNpYXJ5LCBhbW91bnQsIGluZGV4LCBhdW50c0hleCkKCWcgOj0gZ3JhbnRPZihiZW5lZmljaWFyeSkKCglmdW5kIDo9IGFkZHJlc3MoZWNvc3lzdGVtRnVuZEFkZHJlc3MpCglpZiAhZnVuZC5Jc1ZhbGlkKCkgewoJCXBhbmljKCJhaXJkcm9wOiBlY29zeXN0ZW0gZnVuZCBhZGRyZXNzIGlzIG5vdCBjb25maWd1cmVkIikKCX0KCWltbWVkaWF0ZSA6PSBzaGFyZU9mKGcudG90YWwsIGluc3RhbnRCcHMpCglyZXN0IDo9IGcudG90YWwgLSBpbW1lZGlhdGUKCWJ1cm4gOj0gcmVzdCAvIDIKCXRvRnVuZCA6PSByZXN0IC0gYnVybgoJZy53aXRoZHJhd24gPSBpbW1lZGlhdGUKCWcuYnVybmVkID0gYnVybgoJZy50b0Z1bmQgPSB0b0Z1bmQKCWcubGFzdFdpdGhkcmF3ID0gdGltZS5Ob3coKS5Vbml4KCkKCW91dHN0YW5kaW5nIC09IGcudG90YWwKCXRvdGFsQ2xhaW1lZCA9IGFkZFNhdCh0b3RhbENsYWltZWQsIGltbWVkaWF0ZSkKCXRvdGFsQnVybmVkID0gYWRkU2F0KHRvdGFsQnVybmVkLCBidXJuKQoJdG90YWxUb0Z1bmQgPSBhZGRTYXQodG90YWxUb0Z1bmQsIHRvRnVuZCkKCglpZiBpbW1lZGlhdGUgPiAwIHsKCQlncmMyMHJlZy5UcmFuc2ZlcigwLCBjdXIsIHRva2VuS2V5LCBiZW5lZmljaWFyeSwgaW1tZWRpYXRlKQoJfQoJaWYgYnVybiA+IDAgewoJCS8vIEJ1cm4gYWN0cyBvbiB0aGUgY2FsbGVyJ3MgYmFsYW5jZTogdGhpcyByZWFsbSBob2xkcyB0aGUgZXNjcm93LgoJCXRva2VuLkJ1cm4oY3Jvc3MoY3VyKSwgYnVybikKCX0KCWlmIHRvRnVuZCA+IDAgewoJCWdyYzIwcmVnLlRyYW5zZmVyKDAsIGN1ciwgdG9rZW5LZXksIGZ1bmQsIHRvRnVuZCkKCX0KCWNoYWluLkVtaXQoV2l0aGRyYXdFdmVudCwgImVwb2NoIiwgc3RyY29udi5JdG9hKGVwb2NoKSwgInRvIiwgYmVuZWZpY2lhcnkuU3RyaW5nKCksCgkJImFtb3VudCIsIHN0cmNvbnYuRm9ybWF0SW50KGltbWVkaWF0ZSwgMTApLCAicmVtYWluaW5nIiwgIjAiKQoJY2hhaW4uRW1pdChGb3JmZWl0RXZlbnQsICJlcG9jaCIsIHN0cmNvbnYuSXRvYShlcG9jaCksICJ3aG8iLCBiZW5lZmljaWFyeS5TdHJpbmcoKSwKCQkiYnVybmVkIiwgc3RyY29udi5Gb3JtYXRJbnQoYnVybiwgMTApLCAidG9fZnVuZCIsIHN0cmNvbnYuRm9ybWF0SW50KHRvRnVuZCwgMTApKQp9CgovLyBGb3JmZWl0IGlzIHRoZSBzZWNvbmQgYWx0ZXJuYXRpdmUgdG8gQ2xhaW06IHRoZSBiZW5lZmljaWFyeSBnaXZlcyB0aGUgZ3JhbnQKLy8gdXAgd2l0aG91dCB0YWtpbmcgYW55dGhpbmcuIEhhbGYgaXMgYnVybmVkLCBoYWxmIGdvZXMgdG8gdGhlIGVjb3N5c3RlbSBmdW5kIOKAlAovLyB0aGUgc2FtZSBzcGxpdCBTZXR0bGVVbmNsYWltZWQgYXBwbGllcyB0byB3aG9ldmVyIG5ldmVyIGFjdGVkIGF0IGFsbC4KLy8KLy8gVGhlIHByb29mIGlzIHN0aWxsIHJlcXVpcmVkIGFuZCB0aGUgZ3JhbnQgaXMgc3RpbGwgcmVjb3JkZWQ6IHdpdGhvdXQgdGhhdCwKLy8gdGhlIHNhbWUgYWRkcmVzcyBjb3VsZCBmb3JmZWl0IGFuZCB0aGVuIGNsYWltLiBUaGUgcmVjb3JkIG1ha2VzIGl0IGZpbmFsLgovLyBPbmx5IHRoZSBwZXJzb24gY29uY2VybmVkIGNhbiBjaG9vc2UgaXQ6IHRoZXJlIGlzIG5vICJvbiBiZWhhbGYgb2YiIGZvcm0uCmZ1bmMgRm9yZmVpdChjdXIgcmVhbG0sIGFtb3VudCBpbnQ2NCwgaW5kZXggaW50LCBhdW50c0hleCBzdHJpbmcpIHsKCWlmICFjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgewoJCXBhbmljKCJhaXJkcm9wOiBhIGZvcmZlaXQgbXVzdCBjb21lIGZyb20gYSB1c2VyIGFjY291bnQiKQoJfQoJYmVuZWZpY2lhcnkgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglmdW5kIDo9IGFkZHJlc3MoZWNvc3lzdGVtRnVuZEFkZHJlc3MpCglpZiAhZnVuZC5Jc1ZhbGlkKCkgewoJCXBhbmljKCJhaXJkcm9wOiBlY29zeXN0ZW0gZnVuZCBhZGRyZXNzIGlzIG5vdCBjb25maWd1cmVkIikKCX0KCXJlZ2lzdGVyR3JhbnQoYmVuZWZpY2lhcnksIGFtb3VudCwgaW5kZXgsIGF1bnRzSGV4KQoJZyA6PSBncmFudE9mKGJlbmVmaWNpYXJ5KQoKCWJ1cm4gOj0gZy50b3RhbCAvIDIKCXRvRnVuZCA6PSBnLnRvdGFsIC0gYnVybgoJZy5idXJuZWQgPSBidXJuCglnLnRvRnVuZCA9IHRvRnVuZAoJb3V0c3RhbmRpbmcgLT0gZy50b3RhbAoJdG90YWxCdXJuZWQgPSBhZGRTYXQodG90YWxCdXJuZWQsIGJ1cm4pCgl0b3RhbFRvRnVuZCA9IGFkZFNhdCh0b3RhbFRvRnVuZCwgdG9GdW5kKQoKCWlmIGJ1cm4gPiAwIHsKCQl0b2tlbi5CdXJuKGNyb3NzKGN1ciksIGJ1cm4pCgl9CglpZiB0b0Z1bmQgPiAwIHsKCQlncmMyMHJlZy5UcmFuc2ZlcigwLCBjdXIsIHRva2VuS2V5LCBmdW5kLCB0b0Z1bmQpCgl9CgljaGFpbi5FbWl0KEZvcmZlaXRFdmVudCwgImVwb2NoIiwgc3RyY29udi5JdG9hKGVwb2NoKSwgIndobyIsIGJlbmVmaWNpYXJ5LlN0cmluZygpLAoJCSJidXJuZWQiLCBzdHJjb252LkZvcm1hdEludChidXJuLCAxMCksICJ0b19mdW5kIiwgc3RyY29udi5Gb3JtYXRJbnQodG9GdW5kLCAxMCkpCn0KCi8vIGltbWVkaWF0ZU9mIGlzIHRoZSBzaGFyZSBDbGFpbSB1bmxvY2tzIGF0IG9uY2U6IGltbWVkaWF0ZUJwcy8xMDAwMCBvZiB0b3RhbC4KZnVuYyBpbW1lZGlhdGVPZih0b3RhbCBpbnQ2NCkgaW50NjQgeyByZXR1cm4gc2hhcmVPZih0b3RhbCwgaW1tZWRpYXRlQnBzKSB9CgovLyBzaGFyZU9mIGlzIGJwcy8xMDAwMCBvZiB0b3RhbCwgaW4gdHdvIHN0ZXBzIHRvIHN0YXkgaW5zaWRlIGludDY0LgpmdW5jIHNoYXJlT2YodG90YWwgaW50NjQsIGJwcyBpbnQpIGludDY0IHsKCXYgOj0gdG90YWwvYnBzRGVub21pbmF0b3IqaW50NjQoYnBzKSArIHRvdGFsJWJwc0Rlbm9taW5hdG9yKmludDY0KGJwcykvYnBzRGVub21pbmF0b3IKCWlmIHYgPiB0b3RhbCB7CgkJdiA9IHRvdGFsCgl9CglyZXR1cm4gdgp9CgovLyByZWdpc3RlckdyYW50IGNoZWNrcyB0aGUgcHJvb2YgYW5kIHJlY29yZHMgdGhlIGdyYW50LiBJdCB0cmFuc2ZlcnMgbm90aGluZy4KZnVuYyByZWdpc3RlckdyYW50KGJlbmVmaWNpYXJ5IGFkZHJlc3MsIGFtb3VudCBpbnQ2NCwgaW5kZXggaW50LCBhdW50c0hleCBzdHJpbmcpIHsKCWlmICFpc09wZW4oKSB7CgkJcGFuaWMoImFpcmRyb3A6IG5vIG9wZW4gY2FtcGFpZ24iKQoJfQoJaWYgIWJlbmVmaWNpYXJ5LklzVmFsaWQoKSB7CgkJcGFuaWMoImFpcmRyb3A6IGludmFsaWQgYmVuZWZpY2lhcnkiKQoJfQoJaWYgYW1vdW50IDw9IDAgewoJCXBhbmljKCJhaXJkcm9wOiBpbnZhbGlkIGFtb3VudCIpCgl9CglpZiBpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVhZkNvdW50IHsKCQlwYW5pYygiYWlyZHJvcDogaW5kZXggb3V0IG9mIHJhbmdlIikKCX0KCglrZXkgOj0gYmVuZWZpY2lhcnkuU3RyaW5nKCkKCWlmIHByZXYgOj0gZ3JhbnRPZihiZW5lZmljaWFyeSk7IHByZXYgIT0gbmlsIHsKCQlpZiBwcmV2LmVwb2NoID09IGVwb2NoIHsKCQkJcGFuaWMoImFpcmRyb3A6IGFscmVhZHkgY2xhaW1lZCIpCgkJfQoJCS8vIEEgcHJldmlvdXMgZ3JhbnQgc3RpbGwgdmVzdGluZyBtdXN0IG5vdCBiZSBvdmVyd3JpdHRlbjogdGhhdCB3b3VsZCBiZQoJCS8vIGEgc2lsZW50IGxvc3MgZm9yIHRoZSBiZW5lZmljaWFyeS4gSXQgaGFzIHRvIGJlIGNsb3NlZCBmaXJzdCwgd2l0aAoJCS8vIFdpdGhkcmF3IG9uY2UgdmVzdGluZyBpcyBvdmVyIG9yIHdpdGggRm9yZmVpdC4KCQlpZiAhcHJldi5zZXR0bGVkKCkgewoJCQlwYW5pYygiYWlyZHJvcDogYW4gZWFybGllciBncmFudCBpcyBzdGlsbCBydW5uaW5nLCBjbG9zZSBpdCBmaXJzdCIpCgkJfQoJfQoKCWF1bnRzLCBlcnIgOj0gaGV4LkRlY29kZVN0cmluZyhzdHJpbmdzLlRyaW1QcmVmaXgoYXVudHNIZXgsICIweCIpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoImFpcmRyb3A6IGludmFsaWQgcHJvb2Y6ICIgKyBlcnIuRXJyb3IoKSkKCX0KCWlmIGxlbihhdW50cyklMzIgIT0gMCB7CgkJcGFuaWMoImFpcmRyb3A6IHRoZSBwcm9vZiBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzIgYnl0ZXMiKQoJfQoKCWxlYWYgOj0gW11ieXRlKExlYWYoYmVuZWZpY2lhcnksIGFtb3VudCkpCglpZiAhbWVya2xlLlZlcmlmeVNpbXBsZVByb29mKHJvb3QsIGxlYWYsIGluZGV4LCBsZWFmQ291bnQsIGF1bnRzKSB7CgkJcGFuaWMoImFpcmRyb3A6IGludmFsaWQgTWVya2xlIHByb29mIikKCX0KCgkvLyBUaGUgcmVhbG0gbXVzdCBiZSBhYmxlIHRvIGNvdmVyIHRoZSBuZXcgZ3JhbnQgT04gVE9QIG9mIHRob3NlIGFscmVhZHkgbWFkZS4KCWlmIEJhbGFuY2UoKS1vdXRzdGFuZGluZyA8IGFtb3VudCB7CgkJcGFuaWMoImFpcmRyb3A6IGluc3VmZmljaWVudCBmdW5kcyBpbiB0aGUgcmVhbG0iKQoJfQoKCWNsYWltZWQuU2V0KGtleSwgJmdyYW50e2Vwb2NoOiBlcG9jaCwgc3RhcnQ6IGNhbXBhaWduU3RhcnQsIHRvdGFsOiBhbW91bnR9KQoJb3V0c3RhbmRpbmcgKz0gYW1vdW50Cgl0b3RhbEdyYW50ZWQgPSBhZGRTYXQodG90YWxHcmFudGVkLCBhbW91bnQpCgljbGFpbUNvdW50KysKCgljaGFpbi5FbWl0KAoJCUNsYWltRXZlbnQsCgkJImVwb2NoIiwgc3RyY29udi5JdG9hKGVwb2NoKSwKCQkidG8iLCBiZW5lZmljaWFyeS5TdHJpbmcoKSwKCQkiYW1vdW50Iiwgc3RyY29udi5Gb3JtYXRJbnQoYW1vdW50LCAxMCksCgkpCn0KCi8vIFdpdGhkcmF3IHRyYW5zZmVycyB0byB0aGUgY2FsbGVyIHRoZSB2ZXN0ZWQsIG5vdC15ZXQtd2l0aGRyYXduIHBhcnQuCmZ1bmMgV2l0aGRyYXcoY3VyIHJlYWxtKSB7CglyZWxlYXNlKGN1ciwgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpKQp9CgovLyBXaXRoZHJhd0ZvciBpcyBsaWtlIFdpdGhkcmF3IGJ1dCBvbiBhbm90aGVyIGJlbmVmaWNpYXJ5J3MgYmVoYWxmOiB0aGUgdG9rZW5zCi8vIHN0aWxsIGdvIHRvIGJlbmVmaWNpYXJ5LCB3aG9ldmVyIHNlbmRzIHRoZSB0cmFuc2FjdGlvbiBvbmx5IHBheXMgdGhlIGdhcy4KZnVuYyBXaXRoZHJhd0ZvcihjdXIgcmVhbG0sIGJlbmVmaWNpYXJ5IGFkZHJlc3MpIHsKCXJlbGVhc2UoY3VyLCBiZW5lZmljaWFyeSkKfQoKLy8gcmVsZWFzZSB0cmFuc2ZlcnMgdGhlIHZlc3RlZCBzaGFyZS4gSXQgaXMgdGhlIHB1YmxpYyBmb3JtOiB3aGVuIHRoZXJlIGlzCi8vIG5vdGhpbmcgdG8gd2l0aGRyYXcgaXQgc2F5cyBzbywgaW5zdGVhZCBvZiBzaWxlbnRseSBsZXR0aW5nIHRocm91Z2ggYQovLyB0cmFuc2FjdGlvbiB0aGF0IGRpZCBub3RoaW5nLgpmdW5jIHJlbGVhc2UoY3VyIHJlYWxtLCBiZW5lZmljaWFyeSBhZGRyZXNzKSB7CglpZiByZWxlYXNlSWZBbnkoY3VyLCBiZW5lZmljaWFyeSkgPT0gMCB7CgkJcGFuaWMoImFpcmRyb3A6IG5vdGhpbmcgdG8gd2l0aGRyYXcgcmlnaHQgbm93IikKCX0KfQoKLy8gcmVsZWFzZUlmQW55IGlzIHRoZSBpbnRlcm5hbCBmb3JtOiBpdCB0cmFuc2ZlcnMgd2hhdGV2ZXIgaGFzIHZlc3RlZCBhbmQKLy8gcmV0dXJucyB0aGUgYW1vdW50LCBvciAwIGlmIG5vdGhpbmcgaGFzIHZlc3RlZCB5ZXQuIEl0IHNlcnZlcyB0aGUgcGF0aHMgd2hlcmUKLy8gIm5vdGhpbmcgdG8gd2l0aGRyYXciIGlzIG5vcm1hbCByYXRoZXIgdGhhbiBhbiBlcnJvcjogYSBjbGFpbSB3aG9zZSBpbW1lZGlhdGUKLy8gc2hhcmUgaXMgemVybywgYW5kIGEgZm9yZmVpdCwgd2hvc2UgcG9pbnQgaXMgdG8gYnVybiB0aGUgcmVzaWR1ZSByYXRoZXIgdGhhbgovLyB0byBjb2xsZWN0LgovLyBQYXlvdXRzIGFyZSByYXRlLWxpbWl0ZWQ6IG9uZSBldmVyeSB3aXRoZHJhd0Nvb2xkb3duU2Vjb25kcyBwZXIgZ3JhbnQsIHRoZQovLyBjbGFpbSBpdHNlbGYgY291bnRpbmcgYXMgdGhlIGZpcnN0LiBUaGUgdmVyeSBmaXJzdCBwYXlvdXQgaXMgbmV2ZXIgZGVsYXllZC4KZnVuYyByZWxlYXNlSWZBbnkoY3VyIHJlYWxtLCBiZW5lZmljaWFyeSBhZGRyZXNzKSBpbnQ2NCB7CglnIDo9IGdyYW50T2YoYmVuZWZpY2lhcnkpCglpZiBnID09IG5pbCB7CgkJcGFuaWMoImFpcmRyb3A6IG5vIGdyYW50IGZvciB0aGlzIGFkZHJlc3MiKQoJfQoJaWYgZy5jbG9zZWQoKSB7CgkJcGFuaWMoImFpcmRyb3A6IGdyYW50IGNsb3NlZCBieSBhbiBpbnN0YW50IGV4aXQgb3IgYSBmb3JmZWl0IikKCX0KCWFtb3VudCA6PSB2ZXN0ZWRPZihnKSAtIGcud2l0aGRyYXduCglpZiBhbW91bnQgPD0gMCB7CgkJcmV0dXJuIDAKCX0KCW5vdyA6PSB0aW1lLk5vdygpLlVuaXgoKQoJaWYgZy5sYXN0V2l0aGRyYXcgPiAwICYmIG5vdyA8IGcubGFzdFdpdGhkcmF3K3dpdGhkcmF3Q29vbGRvd25TZWNvbmRzIHsKCQlwYW5pYygiYWlyZHJvcDogbmV4dCB3aXRoZHJhd2FsIGF2YWlsYWJsZSBpbiAiICsKCQkJc3RyY29udi5Gb3JtYXRJbnQoZy5sYXN0V2l0aGRyYXcrd2l0aGRyYXdDb29sZG93blNlY29uZHMtbm93LCAxMCkgKyAiIHNlY29uZHMiKQoJfQoKCWcubGFzdFdpdGhkcmF3ID0gbm93CglnLndpdGhkcmF3biArPSBhbW91bnQKCW91dHN0YW5kaW5nIC09IGFtb3VudAoJdG90YWxDbGFpbWVkID0gYWRkU2F0KHRvdGFsQ2xhaW1lZCwgYW1vdW50KQoKCWdyYzIwcmVnLlRyYW5zZmVyKDAsIGN1ciwgdG9rZW5LZXksIGJlbmVmaWNpYXJ5LCBhbW91bnQpCgoJY2hhaW4uRW1pdCgKCQlXaXRoZHJhd0V2ZW50LAoJCSJlcG9jaCIsIHN0cmNvbnYuSXRvYShlcG9jaCksCgkJInRvIiwgYmVuZWZpY2lhcnkuU3RyaW5nKCksCgkJImFtb3VudCIsIHN0cmNvbnYuRm9ybWF0SW50KGFtb3VudCwgMTApLAoJCSJyZW1haW5pbmciLCBzdHJjb252LkZvcm1hdEludChnLnRvdGFsLWcud2l0aGRyYXduLWcuYnVybmVkLWcudG9GdW5kLCAxMCksCgkpCglyZXR1cm4gYW1vdW50Cn0KCi8vIHZlc3RlZE9mIGNvbXB1dGVzIGhvdyBtdWNoIG9mIGEgZ3JhbnQgaGFzIHZlc3RlZDoKLy8KLy8JdmVzdGVkID0gaW1tZWRpYXRlICsgcmVzdCAqIGVsYXBzZWQgLyBkdXJhdGlvbgovLwovLyB3aGVyZSBpbW1lZGlhdGUgaXMgaW1tZWRpYXRlQnBzLzEwMDAwIG9mIHRoZSB0b3RhbC4gVGhlIGRpdmlzaW9uIGlzIGRvbmUgaW4KLy8gdHdvIHN0ZXBzIChxdW90aWVudCBhbmQgcmVtYWluZGVyKSBiZWNhdXNlIHJlc3QqZWxhcHNlZCB3b3VsZCBvdmVyZmxvdyBpbnQ2NAovLyBmb3IgbGFyZ2UgYW1vdW50czogMWUxMyAqIDMuMTVlNyBleGNlZWRzIDkuMmUxOC4KZnVuYyB2ZXN0ZWRPZihnICpncmFudCkgaW50NjQgewoJaW1tZWRpYXRlIDo9IGltbWVkaWF0ZU9mKGcudG90YWwpCglyZXN0IDo9IGcudG90YWwgLSBpbW1lZGlhdGUKCWlmIHJlc3QgPT0gMCB8fCB2ZXN0aW5nU2Vjb25kcyA8PSAwIHsKCQlyZXR1cm4gZy50b3RhbAoJfQoKCWVsYXBzZWQgOj0gdGltZS5Ob3coKS5Vbml4KCkgLSBnLnN0YXJ0CglpZiBlbGFwc2VkIDw9IDAgewoJCXJldHVybiBpbW1lZGlhdGUKCX0KCWlmIGVsYXBzZWQgPj0gdmVzdGluZ1NlY29uZHMgewoJCXJldHVybiBnLnRvdGFsCgl9CgoJbGluZWFyIDo9IHJlc3QvdmVzdGluZ1NlY29uZHMqZWxhcHNlZCArIHJlc3QldmVzdGluZ1NlY29uZHMqZWxhcHNlZC92ZXN0aW5nU2Vjb25kcwoJcmV0dXJuIGltbWVkaWF0ZSArIGxpbmVhcgp9CgovLyBhZGRTYXQgYWRkcyB3aXRob3V0IGV2ZXIgd3JhcHBpbmcuIFRoZXNlIGNvdW50ZXJzIG9ubHkgZ3JvdywgYWNyb3NzIGV2ZXJ5Ci8vIGNhbXBhaWduLCBhbmQgbm90aGluZyBib3VuZHMgdGhlbSB0byB0aGUgc3VwcGx5OiBhIHN0YXRpc3RpYyB0aGF0IHR1cm5zCi8vIG5lZ2F0aXZlIHdvdWxkIGJlIGJhZCwgb25lIHRoYXQgYmxvY2tzIGEgd2l0aGRyYXdhbCB3b3VsZCBiZSB3b3JzZS4KZnVuYyBhZGRTYXQoYSwgYiBpbnQ2NCkgaW50NjQgewoJaWYgYiA+IDAgJiYgYSA+IG1hdGguTWF4SW50NjQtYiB7CgkJcmV0dXJuIG1hdGguTWF4SW50NjQKCX0KCXJldHVybiBhICsgYgp9CgpmdW5jIGdyYW50T2YoYWRkciBhZGRyZXNzKSAqZ3JhbnQgewoJdiA6PSBjbGFpbWVkLkdldChhZGRyLlN0cmluZygpKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiBuaWwKCX0KCXJldHVybiB2LigqZ3JhbnQpCn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBSZWFkcwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIExlYWYgcmV0dXJucyB0aGUgY2Fub25pY2FsIE1lcmtsZS1sZWFmIGVuY29kaW5nIGZvciB0aGUgKGFkZHJlc3MsIGFtb3VudCkKLy8gcGFpci4gSXQgbXVzdCBtYXRjaCBieXRlIGZvciBieXRlIHRoZSBvbmUgdXNlZCBieSB0aGUgb2ZmLWNoYWluIGdlbmVyYXRvci4KZnVuYyBMZWFmKGFkZHIgYWRkcmVzcywgYW1vdW50IGludDY0KSBzdHJpbmcgewoJcmV0dXJuIGFkZHIuU3RyaW5nKCkgKyAifCIgKyBzdHJjb252LkZvcm1hdEludChhbW91bnQsIDEwKQp9CgovLyBSZWFsbUFkZHJlc3MgaXMgdGhlIGFkZHJlc3MgdG8gZnVuZCB3aXRoIHRoZSBhaXJkcm9wIHRva2Vucy4KZnVuYyBSZWFsbUFkZHJlc3MoKSBhZGRyZXNzIHsgcmV0dXJuIHJlYWxtQWRkciB9CgovLyBCYWxhbmNlIGlzIHRoZSB0b2tlbiBiYWxhbmNlIHRoZSByZWFsbSBjdXJyZW50bHkgaG9sZHMuCmZ1bmMgQmFsYW5jZSgpIGludDY0IHsKCXRva2VuIDo9IGdyYzIwcmVnLkdldCh0b2tlbktleSkKCWlmIHRva2VuID09IG5pbCB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiB0b2tlbi5CYWxhbmNlT2YocmVhbG1BZGRyKQp9CgovLyBSb290IHJldHVybnMgdGhlIGN1cnJlbnQgTWVya2xlIHJvb3QgaW4gaGV4LgpmdW5jIFJvb3QoKSBzdHJpbmcgeyByZXR1cm4gaGV4LkVuY29kZVRvU3RyaW5nKHJvb3QpIH0KCi8vIEVwb2NoIGlzIHRoZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgY2FtcGFpZ24uCmZ1bmMgRXBvY2goKSBpbnQgeyByZXR1cm4gZXBvY2ggfQoKLy8gSXNTZWFsZWQgcmVwb3J0cyB3aGV0aGVyIHRoZSBjYW1wYWlnbiBoYXMgYmVlbiBzZWFsZWQ6IGlmIHRydWUsIG5vIG5ldwovLyBjYW1wYWlnbiBjYW4gZXZlciBiZSBvcGVuZWQuCmZ1bmMgSXNTZWFsZWQoKSBib29sIHsgcmV0dXJuIHNlYWxlZCB9CgovLyBMZWFmQ291bnQgaXMgdGhlIG51bWJlciBvZiBsZWF2ZXMgaW4gdGhlIHB1Ymxpc2hlZCB0cmVlLgpmdW5jIExlYWZDb3VudCgpIGludCB7IHJldHVybiBsZWFmQ291bnQgfQoKLy8gRW5kSGVpZ2h0IGlzIHRoZSBkZWFkbGluZSBibG9jayAoMCA9IG5vIGRlYWRsaW5lKS4KZnVuYyBFbmRIZWlnaHQoKSBpbnQ2NCB7IHJldHVybiBlbmRIZWlnaHQgfQoKLy8gSXNPcGVuIHJlcG9ydHMgd2hldGhlciBjbGFpbXMgYXJlIGN1cnJlbnRseSBhY2NlcHRlZC4KZnVuYyBJc09wZW4oKSBib29sIHsgcmV0dXJuIGlzT3BlbigpIH0KCi8vIEhhc0NsYWltZWQgcmVwb3J0cyB3aGV0aGVyIGFkZHIgaGFzIGFscmVhZHkgY2xhaW1lZCBpbiB0aGUgY3VycmVudCBjYW1wYWlnbi4KZnVuYyBIYXNDbGFpbWVkKGFkZHIgYWRkcmVzcykgYm9vbCB7CglnIDo9IGdyYW50T2YoYWRkcikKCXJldHVybiBnICE9IG5pbCAmJiBnLmVwb2NoID09IGVwb2NoCn0KCi8vIEhhc0dyYW50IHJlcG9ydHMgd2hldGhlciBhZGRyIGhvbGRzIGEgZ3JhbnQsIGZyb20gdGhpcyBjYW1wYWlnbiBvciBhbgovLyBlYXJsaWVyIG9uZS4KZnVuYyBIYXNHcmFudChhZGRyIGFkZHJlc3MpIGJvb2wgeyByZXR1cm4gZ3JhbnRPZihhZGRyKSAhPSBuaWwgfQoKLy8gR3JhbnRFcG9jaCByZXR1cm5zIHRoZSBjYW1wYWlnbiBpbiB3aGljaCBhZGRyIG9idGFpbmVkIGl0cyBncmFudC4KZnVuYyBHcmFudEVwb2NoKGFkZHIgYWRkcmVzcykgaW50IHsKCWcgOj0gZ3JhbnRPZihhZGRyKQoJaWYgZyA9PSBuaWwgewoJCXJldHVybiAwCgl9CglyZXR1cm4gZy5lcG9jaAp9CgovLyBWZXN0aW5nU3RhcnRPZiByZXR1cm5zIHdoZW4gdmVzdGluZyBzdGFydHMgZm9yIGFkZHIncyBncmFudC4KZnVuYyBWZXN0aW5nU3RhcnRPZihhZGRyIGFkZHJlc3MpIGludDY0IHsKCWcgOj0gZ3JhbnRPZihhZGRyKQoJaWYgZyA9PSBuaWwgewoJCXJldHVybiAwCgl9CglyZXR1cm4gZy5zdGFydAp9CgovLyBDbGFpbWVkQW1vdW50IHJldHVybnMgYWRkcidzIHRvdGFsIGdyYW50LCB2ZXN0ZWQgb3Igbm90LgpmdW5jIENsYWltZWRBbW91bnQoYWRkciBhZGRyZXNzKSBpbnQ2NCB7CglnIDo9IGdyYW50T2YoYWRkcikKCWlmIGcgPT0gbmlsIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIGcudG90YWwKfQoKLy8gVmVzdGVkIHJldHVybnMgaG93IG11Y2ggb2YgYWRkcidzIGdyYW50IGhhcyB2ZXN0ZWQgc28gZmFyLiBBIGNsb3NlZCBncmFudAovLyAoaW5zdGFudCBleGl0IG9yIGZvcmZlaXQpIHdpbGwgbmV2ZXIgdmVzdCBhbnl0aGluZyBtb3JlOiBpdCByZXBvcnRzIHdoYXQKLy8gd2FzIHBhaWQsIG5vdCB3aGVyZSB0aGUgY3VydmUgd291bGQgYmUuCmZ1bmMgVmVzdGVkKGFkZHIgYWRkcmVzcykgaW50NjQgewoJZyA6PSBncmFudE9mKGFkZHIpCglpZiBnID09IG5pbCB7CgkJcmV0dXJuIDAKCX0KCWlmIGcuY2xvc2VkKCkgewoJCXJldHVybiBnLndpdGhkcmF3bgoJfQoJcmV0dXJuIHZlc3RlZE9mKGcpCn0KCi8vIEluc3RhbnRCcHMgaXMgdGhlIHNoYXJlIENsYWltSW5zdGFudCBwYXlzIGF0IG9uY2UsIGluIGh1bmRyZWR0aHMgb2YgYSBwZXJjZW50LgpmdW5jIEluc3RhbnRCcHMoKSBpbnQgeyByZXR1cm4gaW5zdGFudEJwcyB9CgovLyBXaXRoZHJhd24gcmV0dXJucyBob3cgbXVjaCBhZGRyIGhhcyBhbHJlYWR5IHdpdGhkcmF3bi4KZnVuYyBXaXRoZHJhd24oYWRkciBhZGRyZXNzKSBpbnQ2NCB7CglnIDo9IGdyYW50T2YoYWRkcikKCWlmIGcgPT0gbmlsIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIGcud2l0aGRyYXduCn0KCi8vIFdpdGhkcmF3YWJsZSByZXR1cm5zIGhvdyBtdWNoIGFkZHIgY2FuIHdpdGhkcmF3IHJpZ2h0IG5vdy4KZnVuYyBXaXRoZHJhd2FibGUoYWRkciBhZGRyZXNzKSBpbnQ2NCB7CglnIDo9IGdyYW50T2YoYWRkcikKCWlmIGcgPT0gbmlsIHx8IGcuY2xvc2VkKCkgewoJCXJldHVybiAwCgl9CgkvLyBEdXJpbmcgdGhlIGNvb2xkb3duIHRoZSBhbnN3ZXIgaXMgemVybywgbm90ICJ3aGF0IGhhcyB2ZXN0ZWQiOiB0aGlzCgkvLyBmdW5jdGlvbiBzYXlzIHdoYXQgV2l0aGRyYXcgd291bGQgcGF5IHJpZ2h0IG5vdywgYW5kIHJpZ2h0IG5vdyBpdCB3b3VsZAoJLy8gcmVmdXNlLiBOZXh0V2l0aGRyYXdBdCBzYXlzIHdoZW4gdGhhdCBjaGFuZ2VzLgoJaWYgZy5sYXN0V2l0aGRyYXcgPiAwICYmIHRpbWUuTm93KCkuVW5peCgpIDwgZy5sYXN0V2l0aGRyYXcrd2l0aGRyYXdDb29sZG93blNlY29uZHMgewoJCXJldHVybiAwCgl9CglyZXR1cm4gdmVzdGVkT2YoZykgLSBnLndpdGhkcmF3bgp9CgovLyBOZXh0V2l0aGRyYXdBdCByZXR1cm5zIHRoZSB1bml4IHRpbWUgZnJvbSB3aGljaCBhZGRyIG1heSB3aXRoZHJhdyBhZ2FpbgovLyAoMCB3aGVuIHRoZXJlIGlzIG5vIGdyYW50LCB0aGUgZ3JhbnQgaXMgY2xvc2VkLCBvciBubyBjb29sZG93biBpcyBydW5uaW5nKS4KZnVuYyBOZXh0V2l0aGRyYXdBdChhZGRyIGFkZHJlc3MpIGludDY0IHsKCWcgOj0gZ3JhbnRPZihhZGRyKQoJaWYgZyA9PSBuaWwgfHwgZy5jbG9zZWQoKSB8fCBnLmxhc3RXaXRoZHJhdyA9PSAwIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIGcubGFzdFdpdGhkcmF3ICsgd2l0aGRyYXdDb29sZG93blNlY29uZHMKfQoKLy8gV2l0aGRyYXdDb29sZG93biBpcyB0aGUgbWluaW11bSBpbnRlcnZhbCBiZXR3ZWVuIHR3byBwYXlvdXRzLCBpbiBzZWNvbmRzLgpmdW5jIFdpdGhkcmF3Q29vbGRvd24oKSBpbnQ2NCB7IHJldHVybiB3aXRoZHJhd0Nvb2xkb3duU2Vjb25kcyB9CgovLyBCdXJuZWRPZiByZXR1cm5zIGhvdyBtdWNoIG9mIGFkZHIncyBncmFudCB3YXMgZGVzdHJveWVkLgpmdW5jIEJ1cm5lZE9mKGFkZHIgYWRkcmVzcykgaW50NjQgewoJZyA6PSBncmFudE9mKGFkZHIpCglpZiBnID09IG5pbCB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiBnLmJ1cm5lZAp9CgovLyBGdW5kT2YgcmV0dXJucyBob3cgbXVjaCBvZiBhZGRyJ3MgZ3JhbnQgd2VudCB0byB0aGUgZWNvc3lzdGVtIGZ1bmQuCmZ1bmMgRnVuZE9mKGFkZHIgYWRkcmVzcykgaW50NjQgewoJZyA6PSBncmFudE9mKGFkZHIpCglpZiBnID09IG5pbCB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiBnLnRvRnVuZAp9CgovLyBUb3RhbFRvRnVuZCBpcyB3aGF0IHZvbHVudGFyeSBmb3JmZWl0cyBzZW50IHRvIHRoZSBlY29zeXN0ZW0gZnVuZC4KZnVuYyBUb3RhbFRvRnVuZCgpIGludDY0IHsgcmV0dXJuIHRvdGFsVG9GdW5kIH0KCi8vIFRvdGFsQnVybmVkIGlzIHRoZSB0b3RhbCBkZXN0cm95ZWQ6IGluc3RhbnQgZXhpdHMsIHJlbnVuY2lhdGlvbnMgYW5kIHRoZQovLyBzZXR0bGVtZW50IG9mIHRoZSB1bmNsYWltZWQgcmVzaWR1ZS4KZnVuYyBUb3RhbEJ1cm5lZCgpIGludDY0IHsgcmV0dXJuIHRvdGFsQnVybmVkIH0KCi8vIENsYWltV2luZG93RW5kIGlzIHRoZSBtb21lbnQgKHVuaXgpIGNsYWltcyBzdG9wIGJlaW5nIGFjY2VwdGVkIGZvciB0aGUKLy8gY3VycmVudCBjYW1wYWlnbjsgU2V0dGxlVW5jbGFpbWVkIGJlY29tZXMgY2FsbGFibGUgZnJvbSB0aGVuIG9uLgpmdW5jIENsYWltV2luZG93RW5kKCkgaW50NjQgeyByZXR1cm4gY2FtcGFpZ25TdGFydCArIGNsYWltV2luZG93U2Vjb25kcyB9CgovLyBFY29zeXN0ZW1GdW5kIGlzIHdoZXJlIHRoZSBub24tYnVybmVkIGhhbGYgb2YgZXZlcnkgZm9yZmVpdCBnb2VzLgpmdW5jIEVjb3N5c3RlbUZ1bmQoKSBhZGRyZXNzIHsgcmV0dXJuIGFkZHJlc3MoZWNvc3lzdGVtRnVuZEFkZHJlc3MpIH0KCi8vIFNldHRsZWRCdXJuZWQgYW5kIFNldHRsZWRUb0Z1bmQgcmVwb3J0IHdoYXQgU2V0dGxlVW5jbGFpbWVkIGRpZC4KZnVuYyBTZXR0bGVkQnVybmVkKCkgaW50NjQgeyByZXR1cm4gc2V0dGxlZEJ1cm5lZCB9CmZ1bmMgU2V0dGxlZFRvRnVuZCgpIGludDY0IHsgcmV0dXJuIHNldHRsZWRUb0Z1bmQgfQoKLy8gT3V0c3RhbmRpbmcgaXMgdGhlIHRvdGFsIGdyYW50ZWQgYW5kIG5vdCB5ZXQgd2l0aGRyYXduOiB0aGUgcGFydCBvZiB0aGUKLy8gcmVhbG0ncyBiYWxhbmNlIHRoYXQgU3dlZXAgY2Fubm90IHRvdWNoLgpmdW5jIE91dHN0YW5kaW5nKCkgaW50NjQgeyByZXR1cm4gb3V0c3RhbmRpbmcgfQoKLy8gVG90YWxHcmFudGVkIGlzIHRoZSB0b3RhbCBvZiBhbGwgZ3JhbnRzIG1hZGUsIHZlc3RlZCBvciBub3QuCmZ1bmMgVG90YWxHcmFudGVkKCkgaW50NjQgeyByZXR1cm4gdG90YWxHcmFudGVkIH0KCi8vIFZlc3RpbmdTdGFydCBpcyB0aGUgbW9tZW50ICh1bml4KSB0aGUgQ1VSUkVOVCBjYW1wYWlnbidzIGxpbmVhciByZWxlYXNlIHJ1bnMKLy8gZnJvbS4gR3JhbnRzIGZyb20gZWFybGllciBjYW1wYWlnbnMga2VlcCB0aGVpciBvd24sIHJlYWRhYmxlIHdpdGgKLy8gVmVzdGluZ1N0YXJ0T2YuCmZ1bmMgVmVzdGluZ1N0YXJ0KCkgaW50NjQgeyByZXR1cm4gY2FtcGFpZ25TdGFydCB9CgovLyBWZXN0aW5nRW5kIGlzIHRoZSBtb21lbnQgKHVuaXgpIGF0IHdoaWNoIGV2ZXJ5dGhpbmcgZ3JhbnRlZCBpbiB0aGUgY3VycmVudAovLyBjYW1wYWlnbiBjb3VudHMgYXMgZnVsbHkgdmVzdGVkLgpmdW5jIFZlc3RpbmdFbmQoKSBpbnQ2NCB7IHJldHVybiBjYW1wYWlnblN0YXJ0ICsgdmVzdGluZ1NlY29uZHMgfQoKLy8gSW1tZWRpYXRlQnBzIGlzIHRoZSBzaGFyZSB1bmxvY2tlZCBhdCBvbmNlLCBpbiBodW5kcmVkdGhzIG9mIGEgcGVyY2VudC4KZnVuYyBJbW1lZGlhdGVCcHMoKSBpbnQgeyByZXR1cm4gaW1tZWRpYXRlQnBzIH0KCi8vIFRvdGFsQ2xhaW1lZCBpcyB0aGUgdG90YWwgYWN0dWFsbHkgdHJhbnNmZXJyZWQgdG8gYmVuZWZpY2lhcmllcy4KZnVuYyBUb3RhbENsYWltZWQoKSBpbnQ2NCB7IHJldHVybiB0b3RhbENsYWltZWQgfQoKLy8gQ2xhaW1Db3VudCBpcyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgY2xhaW1zLgpmdW5jIENsYWltQ291bnQoKSBpbnQgeyByZXR1cm4gY2xhaW1Db3VudCB9CgpmdW5jIGlzT3BlbigpIGJvb2wgewoJaWYgbGVuKHJvb3QpICE9IDMyIHx8IGxlYWZDb3VudCA9PSAwIHsKCQlyZXR1cm4gZmFsc2UKCX0KCWlmIGVuZEhlaWdodCAhPSAwICYmIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSA+IGVuZEhlaWdodCB7CgkJcmV0dXJuIGZhbHNlCgl9CgkvLyBUaGUgY2xhaW0gd2luZG93IGlzIHBhcnQgb2YgdGhlIGRlYWw6IGFmdGVyIGl0LCBubyBjbGFpbSBpcyBhY2NlcHRlZCBhbmQKCS8vIHRoZSByZXNpZHVlIGlzIHNldHRsZWQgYnkgU2V0dGxlVW5jbGFpbWVkLgoJaWYgY2xhaW1XaW5kb3dTZWNvbmRzID4gMCAmJiB0aW1lLk5vdygpLlVuaXgoKSA+PSBjYW1wYWlnblN0YXJ0K2NsYWltV2luZG93U2Vjb25kcyB7CgkJcmV0dXJuIGZhbHNlCgl9CglyZXR1cm4gdHJ1ZQp9CgpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCXBhcnRzIDo9IHN0cmluZ3MuU3BsaXQocGF0aCwgIi8iKQoJaWYgbGVuKHBhcnRzKSA9PSAyICYmIHBhcnRzWzBdID09ICJjbGFpbWVkIiB7CgkJYWRkciA6PSBhZGRyZXNzKHBhcnRzWzFdKQoJCWlmICFhZGRyLklzVmFsaWQoKSB7CgkJCXJldHVybiAiaW52YWxpZCBhZGRyZXNzXG4iCgkJfQoJCWcgOj0gZ3JhbnRPZihhZGRyKQoJCWlmIGcgPT0gbmlsIHsKCQkJcmV0dXJuICJubyBncmFudCBmb3IgdGhpcyBhZGRyZXNzXG4iCgkJfQoJCWlmIGcuY2xvc2VkKCkgewoJCQlyZXR1cm4gdWZtdC5TcHJpbnRmKAoJCQkJImdyYW50ZWQ6ICVkXG53aXRoZHJhd246ICVkXG5idXJuZWQ6ICVkXG50byBmdW5kOiAlZFxuc3RhdHVzOiBjbG9zZWRcbiIsCgkJCQlnLnRvdGFsLCBnLndpdGhkcmF3biwgZy5idXJuZWQsIGcudG9GdW5kKQoJCX0KCQlyZXR1cm4gdWZtdC5TcHJpbnRmKAoJCQkiZ3JhbnRlZDogJWRcbnZlc3RlZDogJWRcbndpdGhkcmF3bjogJWRcbmF2YWlsYWJsZSBub3c6ICVkXG4iLAoJCQlnLnRvdGFsLCB2ZXN0ZWRPZihnKSwgZy53aXRoZHJhd24sIHZlc3RlZE9mKGcpLWcud2l0aGRyYXduKQoJfQoJaWYgcGF0aCAhPSAiIiB7CgkJcmV0dXJuICI0MDRcbiIKCX0KCglzIDo9IHVmbXQuU3ByaW50ZigiIyAlc1xuXG4iLCBjYW1wYWlnbk5hbWUpCglzICs9ICJ8IHwgfFxufC0tLXwtLS18XG4iCglzICs9IHVmbXQuU3ByaW50ZigifCBUb2tlbiB8IGAlc2AgfFxuIiwgdG9rZW5LZXkpCglzICs9IHVmbXQuU3ByaW50ZigifCBSZWFsbSBhZGRyZXNzIHwgYCVzYCB8XG4iLCByZWFsbUFkZHIuU3RyaW5nKCkpCglzICs9IHVmbXQuU3ByaW50ZigifCBBdmFpbGFibGUgYmFsYW5jZSB8ICVkIHxcbiIsIEJhbGFuY2UoKSkKCXMgKz0gdWZtdC5TcHJpbnRmKCJ8IENhbXBhaWduIHwgIyVkIHxcbiIsIGVwb2NoKQoJcyArPSB1Zm10LlNwcmludGYoInwgU3RhdHVzIHwgJXMgfFxuIiwgc3RhdHVzTGFiZWwoKSkKCXMgKz0gdWZtdC5TcHJpbnRmKCJ8IFNlYWxlZCB8ICVzIHxcbiIsIHNlYWxMYWJlbCgpKQoJcyArPSB1Zm10LlNwcmludGYoInwgTWVya2xlIHJvb3QgfCBgJXNgIHxcbiIsIFJvb3QoKSkKCXMgKz0gdWZtdC5TcHJpbnRmKCJ8IExlYXZlcyB8ICVkIHxcbiIsIGxlYWZDb3VudCkKCXMgKz0gdWZtdC5TcHJpbnRmKCJ8IERlYWRsaW5lIChibG9jaykgfCAlZCB8XG4iLCBlbmRIZWlnaHQpCglzICs9IHVmbXQuU3ByaW50ZigifCBDbGFpbXMgfCAlZCB8XG4iLCBjbGFpbUNvdW50KQoJcyArPSB1Zm10LlNwcmludGYoInwgR3JhbnRlZCB8ICVkIHxcbiIsIHRvdGFsR3JhbnRlZCkKCXMgKz0gdWZtdC5TcHJpbnRmKCJ8IFRvdGFsIHBhaWQgb3V0IHwgJWQgfFxuIiwgdG90YWxDbGFpbWVkKQoJcyArPSB1Zm10LlNwcmludGYoInwgQnVybmVkIHwgJWQgfFxuIiwgdG90YWxCdXJuZWQpCglzICs9IHVmbXQuU3ByaW50ZigifCBUbyB0aGUgZWNvc3lzdGVtIGZ1bmQgKGZvcmZlaXRzKSB8ICVkIHxcbiIsIHRvdGFsVG9GdW5kKQoJcyArPSB1Zm10LlNwcmludGYoInwgU3RpbGwgb3dlZCB8ICVkIHxcbiIsIG91dHN0YW5kaW5nKQoJcyArPSB1Zm10LlNwcmludGYoInwgQ3VycmVudCBibG9jayB8ICVkIHxcbiIsIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSkKCXMgKz0gIlxuIyMgUmVsZWFzZVxuXG4iCglzICs9IHVmbXQuU3ByaW50ZigiLSBVbmxvY2tlZCBpbW1lZGlhdGVseSBvbiBjbGFpbTogKiolZCUlKipcbiIsIGltbWVkaWF0ZUJwcy8xMDApCglzICs9IHVmbXQuU3ByaW50ZigiLSBUaGUgcmVtYWluaW5nICoqJWQlJSoqIHZlc3RzIGxpbmVhcmx5IG92ZXIgJWQgZGF5c1xuIiwKCQkxMDAtaW1tZWRpYXRlQnBzLzEwMCwgdmVzdGluZ1NlY29uZHMvODY0MDApCglzICs9IHVmbXQuU3ByaW50ZigiLSBXaXRoZHJhd2FsczogYXQgbW9zdCBvbmUgZXZlcnkgJWQgaG91cnMgcGVyIGFkZHJlc3MsIHRoZSBjbGFpbSBjb3VudGluZyBhcyB0aGUgZmlyc3RcbiIsIHdpdGhkcmF3Q29vbGRvd25TZWNvbmRzLzM2MDApCglzICs9IHVmbXQuU3ByaW50ZigiLSBBbHRlcm5hdGl2ZWx5IGBDbGFpbUluc3RhbnRgIHBheXMgZXhhY3RseSAlZCUlIGF0IG9uY2U7IG9mIHRoZSBvdGhlciAlZCUlLCBoYWxmIGlzICoqYnVybmVkKiogYW5kIGhhbGYgZ29lcyB0byB0aGUgZWNvc3lzdGVtIGZ1bmRcbiIsCgkJaW5zdGFudEJwcy8xMDAsIDEwMC1pbnN0YW50QnBzLzEwMCkKCXMgKz0gIi0gT3IgYEZvcmZlaXRgOiBub3RoaW5nIHBhaWQsIGhhbGYgYnVybmVkLCBoYWxmIHRvIHRoZSBlY29zeXN0ZW0gZnVuZFxuIgoJcyArPSB1Zm10LlNwcmludGYoIi0gQ2xhaW1zIGNsb3NlICVkIGRheXMgYWZ0ZXIgb3BlbmluZzsgd2hhdCB3YXMgbmV2ZXIgY2xhaW1lZCBpcyB0aGVuIHNldHRsZWQ6ICoqaGFsZiBidXJuZWQsIGhhbGYgdG8gdGhlIGVjb3N5c3RlbSBmdW5kKiogKGAlc2ApXG4iLAoJCWNsYWltV2luZG93U2Vjb25kcy84NjQwMCwgZWNvc3lzdGVtRnVuZEFkZHJlc3MpCglpZiBzZXR0bGVkQnVybmVkID4gMCB8fCBzZXR0bGVkVG9GdW5kID4gMCB7CgkJcyArPSB1Zm10LlNwcmludGYoIi0gU2V0dGxlZDogJWQgYnVybmVkLCAlZCB0byB0aGUgZWNvc3lzdGVtIGZ1bmRcbiIsIHNldHRsZWRCdXJuZWQsIHNldHRsZWRUb0Z1bmQpCgl9CglpZiBjYW1wYWlnblN0YXJ0ID4gMCB7CgkJcyArPSB1Zm10LlNwcmludGYoIi0gU3RhcnQ6ICVkLCBlbmQ6ICVkICh1bml4KVxuIiwgY2FtcGFpZ25TdGFydCwgVmVzdGluZ0VuZCgpKQoJCWVsYXBzZWQgOj0gdGltZS5Ob3coKS5Vbml4KCkgLSBjYW1wYWlnblN0YXJ0CgkJcGN0IDo9IGludDY0KDEwMCkKCQlpZiBlbGFwc2VkIDwgdmVzdGluZ1NlY29uZHMgewoJCQlwY3QgPSBlbGFwc2VkICogMTAwIC8gdmVzdGluZ1NlY29uZHMKCQl9CgkJaWYgcGN0IDwgMCB7CgkJCXBjdCA9IDAKCQl9CgkJcyArPSB1Zm10LlNwcmludGYoIi0gUHJvZ3Jlc3M6ICoqJWQlJSoqXG4iLCBwY3QpCgl9CglzICs9ICJcblN0YXR1cyBvZiBhbiBhZGRyZXNzOiBgOmNsYWltZWQvPGFkZHJlc3M+YFxuIgoJcmV0dXJuIHMKfQoKLy8gc2VhbExhYmVsIGRlc2NyaWJlcyBpbiBSZW5kZXIgd2hldGhlciB0aGUgYWlyZHJvcCBpcyBwcm92YWJseSBvbmUtb2ZmLgpmdW5jIHNlYWxMYWJlbCgpIHN0cmluZyB7CglpZiBzZWFsZWQgewoJCXJldHVybiAiKip5ZXMsIG9uZS1vZmYqKjogbm8gbmV3IGNhbXBhaWduIGlzIHBvc3NpYmxlIGFueSBtb3JlIgoJfQoJcmV0dXJuICJubzogdGhlIG93bmVyIGNhbiBzdGlsbCByZXB1Ymxpc2ggdGhlIHJvb3QiCn0KCmZ1bmMgc3RhdHVzTGFiZWwoKSBzdHJpbmcgewoJaWYgaXNPcGVuKCkgewoJCXJldHVybiAiKipvcGVuKioiCgl9CglpZiBsZW4ocm9vdCkgPT0gMzIgewoJCXJldHVybiAiZXhwaXJlZCIKCX0KCXJldHVybiAiY2xvc2VkIgp9Chr/CAoKY29uZmlnLmdubxLwCHBhY2thZ2UgZ25vbWljX2FpcmRyb3AKCi8vIEdFTkVSQVRFRCBieSBzY3JpcHRzL3JlbmRlci5zaCBmcm9tIGNvbmZpZy5lbnYuIERvIG5vdCBlZGl0IGJ5IGhhbmQuCgpjb25zdCAoCglkZWZhdWx0VG9rZW5LZXkgPSAiZ25vLmxhbmQvci9ueW0tdGhlZ25vbWljMDAxL2dub21pYy5HTk9NSUMiCgljYW1wYWlnbk5hbWUgICAgPSAiR25vbWljIEFpcmRyb3AiCgoJLy8gaW1tZWRpYXRlQnBzIGlzIHRoZSBzaGFyZSBwYWlkIG91dCBhdCBvbmNlIG9uIGNsYWltLCBpbiBodW5kcmVkdGhzIG9mIGEKCS8vIHBlcmNlbnQ6IDEwMDAgPSAxMCUuCglpbW1lZGlhdGVCcHMgPSAxMDAwCgoJLy8gaW5zdGFudEJwczogc2hhcmUgcGFpZCBhdCBvbmNlIGJ5IENsYWltSW5zdGFudCwgdGhlIHJlc3QgaXMgYnVybmVkLgoJaW5zdGFudEJwcyA9IDMwMDAKCgkvLyB2ZXN0aW5nU2Vjb25kcyBpcyBob3cgbG9uZyB0aGUgcmVtYWluaW5nIDkwJSB0YWtlcyB0bwoJLy8gdmVzdCBsaW5lYXJseTogMzY1IGRheXMuCgl2ZXN0aW5nU2Vjb25kcyA9IGludDY0KDMxNTM2MDAwKQoKCS8vIGNsYWltV2luZG93U2Vjb25kczogY2xhaW1zIGNsb3NlIHRoaXMgbG9uZyBhZnRlciBvcGVuaW5nOyB0aGUgdW5jbGFpbWVkCgkvLyByZXNpZHVlIGlzIHRoZW4gc2V0dGxlZCwgaGFsZiBidXJuZWQgYW5kIGhhbGYgdG8gdGhlIHRlYW0gZnVuZC4KCWRlZmF1bHRDbGFpbVdpbmRvd1NlY29uZHMgPSBpbnQ2NCgzMTUzNjAwMCkKCgkvLyB3aXRoZHJhd0Nvb2xkb3duU2Vjb25kczogbWluaW11bSBpbnRlcnZhbCBiZXR3ZWVuIHR3byBwYXlvdXRzIG9mIHRoZQoJLy8gc2FtZSBncmFudCwgdGhlIGNsYWltIGNvdW50aW5nIGFzIHRoZSBmaXJzdC4KCWRlZmF1bHRXaXRoZHJhd0Nvb2xkb3duU2Vjb25kcyA9IGludDY0KDg2NDAwKQoKCS8vIGVjb3N5c3RlbUZ1bmRBZGRyZXNzIHJlY2VpdmVzIHRoZSBub24tYnVybmVkIGhhbGYgb2YgZXZlcnkgZm9yZmVpdCwKCS8vIHZvbHVudGFyeSBvciBhdXRvbWF0aWMuCgllY29zeXN0ZW1GdW5kQWRkcmVzcyA9ICJnMTRzbHJqYXV2enB4NTc4a2VyMnd0dDJqenMwYzRtenNsY3BqY3FmIgopCgpjb25zdCBhZG1pbkFkZHJlc3MgPSAiZzF6MGMwd3Jtd3B6cGQwZ3E0cTY3aGw5NTA4ZHRndjRlcHIwejVtbCIKGlEKC2dub21vZC50b21sEkJtb2R1bGUgPSAiZ25vLmxhbmQvci9ueW0tdGhlZ25vbWljMDAxL2dub21pY19haXJkcm9wIgpnbm8gPSAiMC45IgoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwSEQiA9uBCEgo4MDAwMHVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohA6IOaqmxiy8r0XdV4axy1OxflbovXMC4iYrCmMnOl7XJEkA1YawRYDavrHgIshwAMsGJP3LzkwvuFitivGHm+v+zD10Ed8cZ2KdRtaSlVu9ebUjB3SpGx5xJ8joBl0N6/YxgGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl