{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "F7MBB8ZA2VQYAgr2AS5DSVJvOHuZnHvcKpcRDNo7iTM=",
    "height": "328091",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": null,
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "81948664",
      "GasUsed": "54632443"
    },
    "tx": "CuXAAgoML3ZtLm1fYWRkcGtnEtPAAgooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxKWwAIKBWJvb2tzEjlnbm8ubGFuZC9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvYm9va3Ma7r4CCglib29rcy5nbm8S374CLy8gUGFja2FnZSBib29rcyBpcyBhIHBlci1vd25lciBnZW5lcmFsIGxlZGdlcjogYW4gYWRkcmVzcyBvcGVucyBhIGNoYXJ0IG9mCi8vIGFjY291bnRzIGFuZCBwb3N0cyBiYWxhbmNlZCBkb3VibGUtZW50cnkgZW50cmllcyBhZ2FpbnN0IGl0LgovLwovLyAjIFRoZSBvbmUgaWRlYQovLwovLyBFdmVyeSBvdGhlciBsZWRnZXItbGlrZSByZWFsbSBpbiB0aGlzIHBvcnRmb2xpbyBpcyBTSU5HTEUtUFVSUE9TRSBhbmQgaXRzCi8vIHN0YXRlIHNoYXBlIElTIGl0cyBxdWVzdGlvbi4gaW52b2ljZXMgdHJhY2tzIHJlY2VpdmFibGVzLiBwYXlyb2xsIHRyYWNrcwovLyBhY2NydWVkIHdhZ2VzLiBidWRnZXRzIHRyYWNrcyBhbGxvY2F0aW9ucy4gZmVlX3NwbGl0IHRyYWNrcyBzaGFyZXMuIEVhY2ggaXMKLy8gYSBjb3JyZWN0IGFuc3dlciB0byBvbmUgcXVlc3Rpb24gYW5kIHN0cnVjdHVyYWxseSBjYW5ub3QgYW5zd2VyIGEgc2Vjb25kLAovLyBiZWNhdXNlIHRoZXJlIGlzIG5vd2hlcmUgdG8gcHV0IGEgdHJhbnNhY3Rpb24gdGhhdCBpcyBub3QgYWxyZWFkeSBvbmUgb2YKLy8gdGhlIG1vZGVsbGVkIGtpbmRzLgovLwovLyBUaGlzIHJlYWxtIGhhcyBubyBvcGluaW9uIGFib3V0IHdoYXQgdGhlIGFjY291bnRzIG1lYW4uIFRoZSBvd25lciBkZWZpbmVzCi8vIHRoZSBjaGFydDsgdGhlIHJlYWxtIGVuZm9yY2VzIHRoYXQgZXZlcnkgZW50cnkgYmFsYW5jZXMsIHRoYXQgaXQgY2Fubm90IGJlCi8vIGFsdGVyZWQgYWZ0ZXIgdGhlIGZhY3QsIGFuZCB0aGF0IG9ubHkgdGhlIG93bmVyIG1heSB3cml0ZSBpdC4KLy8KLy8gIyBOTyBDVVNUT0RZIOKAlCBhbmQgcmVmdXNpbmcgY29pbnMgaXMgbm90IHRoZSBzYW1lIGFzIG5vdCBob2xkaW5nIHRoZW0KLy8KLy8gVGhpcyByZWFsbSBob2xkcyBub3RoaW5nLiBUaGVyZSBpcyBubyBjb2luaW8gaW1wb3J0LCBubyBwYXlhYmxlIHBhdGgsIG5vCi8vIGZlZSwgbm8gd2l0aGRyYXdhbCwgbm8gYWRtaW4uCi8vCi8vIFNvIGV2ZXJ5IG11dGF0aW5nIGVudHJ5cG9pbnQgUkVGVVNFUyBhIHRyYW5zYWN0aW9uIHRoYXQgYXJyaXZlcyBjYXJyeWluZwovLyBjb2lucy4gQSByZWFsbSB3aXRoIG5vIHdpdGhkcmF3YWwgcGF0aCB0aGF0IHNpbGVudGx5IGFjY2VwdHMgdWdub3Qgc3RyYW5kcwovLyBpdCBwZXJtYW5lbnRseSwgYW5kICJ3ZSBkb24ndCBob2xkIGZ1bmRzIiB3b3VsZCB0aGVuIGJlIHRydWUgb2YgdGhlIGRlc2lnbgovLyBhbmQgZmFsc2Ugb2YgdGhlIGJhbGFuY2UuIEhhdmluZyBubyBjdXN0b2R5IGlzIG5vdCB0aGUgc2FtZSBhcyBiZWluZyBzYWZlCi8vIHRvIHNlbmQgY29pbnMgdG8sIGFuZCB0aGUgZGlmZmVyZW5jZSBpcyBvbmUgZ3VhcmQuCi8vCi8vICMgQSBCT09LIElTIEEgU0VUIE9GIENMQUlNUyBCWSBJVFMgT1dORVIKLy8KLy8gUmVhZCB0aGlzIGJlZm9yZSB0cnVzdGluZyBhbnkgbnVtYmVyIHRoaXMgcmVhbG0gcmV0dXJucy4KLy8KLy8gV2l0aCBubyBjdXN0b2R5IHRoZXJlIGlzIG5vIHNvbHZlbmN5IGludmFyaWFudCB0eWluZyAiQ2FzaCA1MDAwIiB0byA1MDAwCi8vIHJlYWwgdWdub3QgYW55d2hlcmUuIEEgYm9vayBjYW4gYmUgaW50ZXJuYWxseSBwZXJmZWN0IGFuZCBkZXNjcmliZSBub3RoaW5nLgovLyBJc0JhbGFuY2VkIHByb3ZlcyBhcml0aG1ldGljLCBuZXZlciB0cnV0aC4KLy8KLy8gQ29uc2VxdWVudGx5IHRoaXMgcmVhbG0gZXhwb3NlcyBOTyBDUk9TUy1PV05FUiBBR0dSRUdBVEUuIFN1bW1pbmcgZXZlcnkKLy8gYm9vaydzIGRlYml0cyB3b3VsZCBiZSBzdW1taW5nIGV2ZXJ5IHN0cmFuZ2VyJ3Mgc2VsZi1yZXBvcnRlZCBhc3NlcnRpb24sCi8vIGFuZCB0aGUgZ2V0dGVyJ3MgZXhpc3RlbmNlIHdvdWxkIGludml0ZSByZWFkaW5nIGl0IGFzIGEgc2lnbmFsLiBXaGF0IGl0Ci8vIGV4cG9zZXMgaW5zdGVhZCBpcyBvd25lci1zY29wZWQsIHdoaWNoIGlzIHRoZSBvbmx5IHF1ZXN0aW9uIGEgY29uc3VtZXIgY2FuCi8vIGFjdCBvbiDigJQgYW5kIGEgY29uc3VtZXIgYWN0aW5nIG9uIGl0cyBPV04gYm9vayBpcyB0cnVzdGluZyBvbmx5IGl0c2VsZi4KLy8KLy8gIyBUaGUgYWNjb3VudCBjb2RlIERFVEVSTUlORVMgdGhlIGFjY291bnQga2luZAovLwovLyBBbiBhY2NvdW50J3MgY29kZSdzIGxlYWRpbmcgZGlnaXQgZml4ZXMgaXRzIGtpbmQsIGJ5IHRoZSBzdGFuZGFyZAovLyBjaGFydC1vZi1hY2NvdW50cyBjb252ZW50aW9uOgovLwovLwkxeHh4IC0+IEFzc2V0ICAgICAgIDJ4eHggLT4gTGlhYmlsaXR5ICAgM3h4eCAtPiBFcXVpdHkKLy8JNHh4eCAtPiBSZXZlbnVlICAgICA1eHh4IC0+IEV4cGVuc2UKLy8KLy8gVGhlcmUgaXMgbm8ga2luZCBwYXJhbWV0ZXIuIFRoaXMgaXMgZGVsaWJlcmF0ZSBhbmQgaXQgaXMgdGhlIHJlYWxtJ3MgYW5zd2VyCi8vIHRvIHAvam91cm5hbCBjb25zdW1lciBvYmxpZ2F0aW9uIDcsIHdoaWNoIGV4aXN0cyBiZWNhdXNlIG9mIHRoYXQgcGFja2FnZSdzCi8vIGF1ZGl0IGZpbmRpbmcgWTE6IE5PIENIRUNLIElOIHAvam91cm5hbCBWQUxJREFURVMgQU4gQUNDT1VOVCdTIEtJTkQuIEFuCi8vIGFjY291bnQgb3BlbmVkIEFzc2V0IHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBMaWFiaWxpdHkgcmVwb3J0cyBhIHNpZ24tZmxpcHBlZAovLyBCYWxhbmNlKCkgZm9yZXZlciB3aGlsZSBJc0JhbGFuY2VkLCBSZWRlcml2ZUZyb21Kb3VybmFsIGFuZAovLyBBY2NvdW50aW5nRXF1YXRpb24gYWxsIHRocmVlIHN0YXkgaGVhbHRoeSDigJQgZXZlcnkgb25lIG9mIHRoZW0gaXMgYnVpbHQgb24KLy8gRGViaXRzIGFuZCBDcmVkaXRzLCB3aGljaCB0aGUga2luZCBkb2VzIG5vdCB0b3VjaC4KLy8KLy8gRGVyaXZpbmcgdGhlIGtpbmQgZG9lcyBub3QgZWxpbWluYXRlIHRoYXQgaGF6YXJkLiBJdCBNT1ZFUyBpdDogYWZ0ZXIgdGhlCi8vIGRlcml2YXRpb24gdGhlIGtpbmQgY2Fubm90IGRpc2FncmVlIHdpdGggdGhlIGNvZGUsIHNvIHRoZSB1bmF1ZGl0YWJsZQovLyBxdWVzdGlvbiAiaXMgdGhpcyBraW5kIHJpZ2h0PyIgYmVjb21lcyB0aGUgdmlzaWJsZSBxdWVzdGlvbiAiaXMgdGhpcyBjb2RlCi8vIHJpZ2h0PyIsIHdoaWNoIGFueSByZWFkZXIgb2YgdGhlIGNoYXJ0IGNhbiBjaGVjayBhZ2FpbnN0IHRoZSBjb252ZW50aW9uCi8vIGFib3ZlLiBUaGF0IGlzIHRoZSB3aG9sZSBjbGFpbSBhbmQgaXQgaXMgZGVsaWJlcmF0ZWx5IG5vdCBzdGF0ZWQgYXMgbW9yZS4KLy8KLy8gVGhlIGNvc3QgaXMgYSBtYW5kYXRvcnkgbnVtYmVyaW5nIGNvbnZlbnRpb246IGEgY29kZSB3aG9zZSBmaXJzdCBjaGFyYWN0ZXIKLy8gaXMgbm90IDEtNSBpcyByZWZ1c2VkLiBGb3IgYSByZWFsbSB3aG9zZSBwdXJwb3NlIGlzIGF1ZGl0YWJsZSBib29rcywgdGhhdAovLyBpcyB0aGUgZmVhdHVyZS4KLy8KLy8gIyBFbnRyaWVzIGFyZSBhcHBlbmQtb25seSBhbmQgYXJlIGNvcnJlY3RlZCBieSBSRVZFUlNBTAovLwovLyBUaGVyZSBpcyBubyBlZGl0IGFuZCBubyBkZWxldGUuIEEgd3JvbmcgZW50cnkgaXMgY29ycmVjdGVkIGJ5IHBvc3RpbmcgaXRzCi8vIG1pcnJvciBpbWFnZSwgd2hpY2ggbGVhdmVzIGJvdGggdGhlIGVycm9yIGFuZCB0aGUgY29ycmVjdGlvbiByZWFkYWJsZS4gRWFjaAovLyBlbnRyeSBtYXkgYmUgcmV2ZXJzZWQgYXQgbW9zdCBvbmNlOyBhIHJldmVyc2FsIGlzIGl0c2VsZiBhbiBlbnRyeSBhbmQgaXMKLy8gaXRzZWxmIHJldmVyc2libGUgb25jZS4KLy8KLy8gIyBQZXJpb2RzCi8vCi8vIEFuIG93bmVyIG1heSBzZWFsIGV2ZXJ5dGhpbmcgdXAgdG8gYSBoZWlnaHQgd2l0aCBDbG9zZVRocm91Z2gsIGFmdGVyIHdoaWNoCi8vIG5vIGVudHJ5IG1heSBiZSBkYXRlZCBhdCBvciBiZWZvcmUgaXQuIFRoZSBzZWFsIG9ubHkgbW92ZXMgZm9yd2FyZC4gVGhpcyBpcwovLyB0aGUgb3duZXIncyBvd24gZGlzY2lwbGluZSwgbm90IGEgcHJvdG9jb2wgcnVsZSDigJQgbm90aGluZyBmb3JjZXMgYW4gb3duZXIgdG8KLy8gY2xvc2UgYW55dGhpbmcuCi8vCi8vICMgVGhlIGNsb2NrIGlzIHRoZSBjaGFpbidzCi8vCi8vIEVudHJpZXMgYXJlIGRhdGVkIHdpdGggcnVudGltZS5DaGFpbkhlaWdodCgpIGFuZCBuZXZlciB3aXRoIGEgY2FsbGVyLQovLyBzdXBwbGllZCB2YWx1ZSwgc2F0aXNmeWluZyBwL2pvdXJuYWwgb2JsaWdhdGlvbnMgMiBhbmQgMy4gSGVpZ2h0cwovLyB0aHJvdWdob3V0LCBuZXZlciBzZWNvbmRzLiBBIHJlYWxtIHRoYXQgbGV0IGEgY2FsbGVyIGNob29zZSB0aGUgZGF0ZSB3b3VsZAovLyBoYXZlIG5vIHBlcmlvZCBkaXNjaXBsaW5lIGF0IGFsbC4KLy8KLy8gIyBDYXBzLCBhbmQgd2h5IHRoZXkgYXJlIGZhciBiZWxvdyB0aGUgZW5naW5lJ3MKLy8KLy8gcC9qb3VybmFsIHBlcm1pdHMgMTAgMDAwIGFjY291bnRzIGFuZCAxIDAwMCAwMDAgZW50cmllcy4gSXRzIEFVRElULm1kIG5hbWVzCi8vIHRoZSBnYXMgY2VpbGluZyBvbiBSZWRlcml2ZUZyb21Kb3VybmFsIGF0IGZ1bGwgY2FwIOKAlCBhIHdvcnN0IGNhc2Ugb2YgNjRNCi8vIHBvc3RpbmcgdmlzaXRzIGluIG9uZSBjYWxsIOKAlCBhcyBVTk1FQVNVUkVEIGFuZCBkb2VzIG5vdCBjbGFpbSBpdC4gU28gdGhpcwovLyByZWFsbSBzZXRzIGl0cyBvd24gY2FwcyBmYXIgYmVsb3csIGFuZCBleHBvc2VzIFJlZGVyaXZlIGFzIGFuIGV4cGxpY2l0Ci8vIG93bmVyLWNhbGxhYmxlIHJhdGhlciB0aGFuIHJ1bm5pbmcgaXQgaW5zaWRlIGEgZ2V0dGVyIHdoZXJlIGFub3RoZXIgcGFydHkKLy8gd291bGQgcGF5IGZvciBpdC4KLy8KLy8gVGhlIGNhcHMgYXJlIHBlci1vd25lciwgbmV2ZXIgZ2xvYmFsLiBBIGdsb2JhbCBjYXAgb24gYm9va3Mgd291bGQgYmUgYQovLyBncmllZmluZyB2ZWN0b3I6IG9uZSBhZGRyZXNzIGNvdWxkIGZpbGwgaXQgYW5kIGxvY2sgZXZlcnlvbmUgZWxzZSBvdXQuCi8vIFBlci1vd25lciwgYW4gb3duZXIgY2FuIGV4aGF1c3QgdGhlaXIgb3duIGNhcGFjaXR5IGFuZCBub2JvZHkgZWxzZSdzLCBhbmQKLy8gdGhlIGNvc3Qgb2YgZG9pbmcgc28gaXMgZ2FzIHBsdXMgYSBzdG9yYWdlIGRlcG9zaXQgcGVyIHJlY29yZC4KLy8KLy8gIyBSZWFsbXMgbWF5IGtlZXAgYm9va3MgdG9vLCBmb3IgZnJlZQovLwovLyBUaGUgb3duZXIgaXMgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpLCBzbyBhIHJlYWxtIHRoYXQgY2FsbHMgaW4ga2VlcHMgYm9va3MKLy8gdW5kZXIgaXRzIG93biBhZGRyZXNzIHdpdGggbm8gZXh0cmEgYXV0aG9yaXphdGlvbiBjb2RlLiBUaGF0IGlzIHRoZQovLyByZWFsbS10by1yZWFsbSBpbnRlZ3JhdGlvbiBzdXJmYWNlLCBhbmQgaXQgYXJyaXZlZCBhcyBhIHByb3BlcnR5IG9mIHRoZQovLyBvd25lci1vbmx5IHJ1bGUgcmF0aGVyIHRoYW4gYXMgYSBmZWF0dXJlLgovLwovLyAjIFdoYXQgdGhpcyByZWFsbSBkb2VzIE5PVCBkbwovLwovLyAgIC0gSXQgZG9lcyBub3QgaG9sZCwgbW92ZSwgb3IgcHJpY2UgYW55IGFzc2V0LgovLyAgIC0gSXQgZG9lcyBub3QgdmVyaWZ5IHRoYXQgYW4gZW50cnkgZGVzY3JpYmVzIGEgcmVhbCBldmVudC4KLy8gICAtIEl0IGRvZXMgbm90IHZhbGlkYXRlIHRoYXQgdGhlIHJpZ2h0IHRyYW5zYWN0aW9uIHdlbnQgaW4gdGhlIHJpZ2h0Ci8vICAgICBhY2NvdW50LiBUaGUgZGVyaXZlZCBraW5kIG1ha2VzIHRoZSBDT0RFIGF1ZGl0YWJsZSwgbm90IHRoZSBqdWRnZW1lbnQuCi8vICAgLSBJdCBoYXMgbm8gYWRtaW4uIFRoZSBkZXBsb3lpbmcgbmFtZXNwYWNlIGhhcyBubyBwcml2aWxlZ2UgaGVyZSBhdCBhbGw6Ci8vICAgICBubyBzZXR0ZXIsIG5vIHBhdXNlLCBubyBhYmlsaXR5IHRvIHBvc3QsIHJldmVyc2UsIG9yIHJlYWQgYW55dGhpbmcgYQovLyAgICAgc3RyYW5nZXIgY2Fubm90IHJlYWQuCnBhY2thZ2UgYm9va3MKCmltcG9ydCAoCgkiY2hhaW4vcnVudGltZSIKCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCSJzdHJjb252IgoJInN0cmluZ3MiCgoJImduby5sYW5kL3AvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9qb3VybmFsIgoJImduby5sYW5kL3AvbnQvYXZsL3YwIgoJImduby5sYW5kL3AvbnQvbWFya2Rvd24vc2FuaXRpemUvdjAiCikKCi8vIFJlYWxtUGF0aCBpcyB0aGlzIHJlYWxtJ3Mgb3duIHBhdGgsIHVzZWQgdG8gYnVpbGQgUmVuZGVyIGxpbmtzLgpjb25zdCBSZWFsbVBhdGggPSAiL3IvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9ib29rcyIKCi8vIE1heEFjY291bnRzUGVyQm9vayBjYXBzIG9uZSBvd25lcidzIGNoYXJ0LiBGYXIgYmVsb3cgam91cm5hbCdzCi8vIE1heEFjY291bnRzTGltaXQgb2YgMTAwMDA6IElzQmFsYW5jZWQgc3VtcyB0aGUgd2hvbGUgY2hhcnQsIGFuZCB0aGlzIGJvdW5kCi8vIGlzIHdoYXQga2VlcHMgdGhhdCByZWFkIGNoZWFwIGZvciBldmVyeW9uZS4KY29uc3QgTWF4QWNjb3VudHNQZXJCb29rID0gMTI4CgovLyBNYXhFbnRyaWVzUGVyQm9vayBjYXBzIG9uZSBvd25lcidzIGpvdXJuYWwuIEZhciBiZWxvdyBqb3VybmFsJ3MKLy8gTWF4RW50cmllc0xpbWl0IG9mIDEwMDAwMDAsIGJlY2F1c2UgdGhhdCBsaW1pdCdzIGludGVyYWN0aW9uIHdpdGgKLy8gUmVkZXJpdmVGcm9tSm91cm5hbCBpcyB1bm1lYXN1cmVkIOKAlCBzZWUgdGhlIHBhY2thZ2UgZG9jLgovLwovLyBBIGJvb2sgdGhhdCBmaWxscyB1cCByZWZ1c2VzIGZ1cnRoZXIgZW50cmllcyByYXRoZXIgdGhhbiBkcm9wcGluZyBoaXN0b3J5LgovLyBUaGUgcmVtZWR5IGlzIGEgZnJlc2ggYm9vayB3aXRoIG9wZW5pbmcgYmFsYW5jZXMgY2FycmllZCBmb3J3YXJkOyB0aGVyZSBpcwovLyBkZWxpYmVyYXRlbHkgbm8gQXJjaGl2ZSwgYmVjYXVzZSBpdCB3b3VsZCBkZXN0cm95IGhpc3RvcnkgYW5kIG5lZWRzIG1vcmUKLy8gZGVzaWduIHRoYW4gaXQgaGFzIGhhZC4KY29uc3QgTWF4RW50cmllc1BlckJvb2sgPSA0MDk2CgovLyBNYXhMZWdzUGVyRW50cnkgY2FwcyBvbmUgZW50cnkncyBwb3N0aW5ncy4gam91cm5hbCBwZXJtaXRzIDY0OyB0aGlzIGlzCi8vIGxvd2VyIGJlY2F1c2UgYW4gZW50cnkgaXMgcGFyc2VkIGZyb20gYSBzaW5nbGUgc3RyaW5nIGFyZ3VtZW50IGFuZCByZW5kZXJlZAovLyBpbiBmdWxsLCBhbmQgYm90aCBvZiB0aG9zZSBjb3N0cyBhcmUgbGluZWFyIGluIHRoZSBsZWcgY291bnQuCmNvbnN0IE1heExlZ3NQZXJFbnRyeSA9IDE2CgovLyBNYXhDb2RlTGVuIGFuZCBNYXhOYW1lTGVuIGJvdW5kIGFuIGFjY291bnQncyBpZGVudGlmaWVycy4gQm90aCBhcmUgYXQgb3IKLy8gYmVsb3cgam91cm5hbCdzIG93biBsaW1pdHMsIHNvIHRoZSBlbmdpbmUncyB2YWxpZGF0aW9uIGlzIGEgYmFja3N0b3AgaGVyZQovLyByYXRoZXIgdGhhbiB0aGUgb25seSBjaGVjay4KY29uc3QgKAoJTWF4Q29kZUxlbiA9IDE2CglNYXhOYW1lTGVuID0gMTI4CikKCi8vIE1heE1lbW9MZW4gYm91bmRzIGFuIGVudHJ5J3MgZnJlZSB0ZXh0LiBCZWxvdyBqb3VybmFsJ3MgTWF4TWVtb0xlbiBvZiAxMDI0Ci8vIGJlY2F1c2UgZXZlcnkgbWVtbyBpcyBhIGNhbmRpZGF0ZSBmb3IgUmVuZGVyIG91dHB1dC4KY29uc3QgTWF4TWVtb0xlbiA9IDI1NgoKLy8gUmVuZGVyRW50cnlMaW1pdCBjYXBzIGhvdyBtYW55IGVudHJpZXMgb25lIFJlbmRlciBjYWxsIGVtaXRzLiBBIGJvb2sgbWF5Ci8vIGhvbGQgTWF4RW50cmllc1BlckJvb2sgb2YgdGhlbSBhbmQgcmVuZGVyaW5nIGFsbCBvZiB0aGVtIHdvdWxkIG1ha2UgdGhlCi8vIHBhZ2UgY29zdCBncm93IHdpdGhvdXQgYm91bmQuCmNvbnN0IFJlbmRlckVudHJ5TGltaXQgPSAyNQoKLy8gYm9va3MgbWFwcyBhbiBvd25lcidzIGFkZHJlc3Mgc3RyaW5nIHRvIHRoYXQgb3duZXIncyAqam91cm5hbC5Cb29rLgovLwovLyBUaGUgdmFsdWUgaXMgYSBQT0lOVEVSIGFuZCBpcyBuZXZlciByZXR1cm5lZCBieSBhbnkgZXhwb3J0ZWQgZnVuY3Rpb24g4oCUCi8vIGpvdXJuYWwgY29uc3VtZXIgb2JsaWdhdGlvbiA0OiBhICpCb29rIGlzIGEgbXV0YWJsZSBoYW5kbGUsIGFuZCBoYW5kaW5nIG9uZQovLyBhY3Jvc3MgYSByZWFsbSBib3VuZGFyeSB3b3VsZCBoYW5kIG91dCB0aGUgcmlnaHQgdG8gcG9zdCBhbmQgcmV2ZXJzZS4KdmFyIGJvb2tzID0gYXZsLk5ld1RyZWUoKQoKLy8gb3BlbmVkQXQgcmVjb3JkcyB0aGUgaGVpZ2h0IGVhY2ggYm9vayB3YXMgY3JlYXRlZCwgZm9yIFJlbmRlci4KdmFyIG9wZW5lZEF0ID0gYXZsLk5ld1RyZWUoKQoKLy8gYm9va0NvdW50IGlzIG1haW50YWluZWQgYWxvbmdzaWRlIHRoZSB0cmVlIHNvIHRoZSBpbmRleCBwYWdlIG5ldmVyIGhhcyB0bwovLyBpdGVyYXRlIGl0Lgp2YXIgYm9va0NvdW50IGludAoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEd1YXJkcwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIHJlZnVzZUNvaW5zIHBhbmljcyBpZiBhIHVzZXIgY2FsbCBhcnJpdmVzIGNhcnJ5aW5nIGNvaW5zLgovLwovLyBUaGlzIHJlYWxtIGhhcyBubyB3aXRoZHJhd2FsIHBhdGgsIHNvIGFjY2VwdGVkIGNvaW5zIHdvdWxkIGJlIHN0cmFuZGVkCi8vIHBlcm1hbmVudGx5LiBUaGUgZ3VhcmQgaXMgb24gSXNVc2VyQ2FsbCByYXRoZXIgdGhhbiBJc1VzZXIgZGVsaWJlcmF0ZWx5OgovLyBPcmlnaW5TZW5kIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgYSBkaXJlY3QgTXNnQ2FsbCwgYW5kIHRoZSBNc2dSdW4KLy8gZXBoZW1lcmFsIGNhbiBjb25zdW1lIHRoZSBlbnZlbG9wZSBiZWZvcmUgZm9yd2FyZGluZyBjb250cm9sLCBzbyBJc1VzZXIKLy8gd291bGQgYmUgdGhlIHdyb25nIHByZWRpY2F0ZS4gU2VlIHAvam91cm5hbCdzIGF1ZGl0IG5vdGUgYW5kIHNlY3VyaXR5Lm1kLgpmdW5jIHJlZnVzZUNvaW5zKGN1ciByZWFsbSkgewoJLy8gQSBuby1vcCBhdCBldmVyeSBvbmUgb2YgdG9kYXkncyBjYWxsIHNpdGVzOiBlYWNoIGlzIGEgY3Jvc3NpbmcgZW50cnlwb2ludAoJLy8gZm9yd2FyZGluZyBpdHMgT1dOIGZpcnN0IGN1ciwgd2hpY2ggaXMgcnVudGltZS1jdXJyZW50IGJ5IGNvbnN0cnVjdGlvbgoJLy8gYW5kIHN0YXlzIGN1cnJlbnQgdGhyb3VnaCBhIG5vbi1jcm9zc2luZyBjYWxsLiBJdCBpcyBoZXJlIGJlY2F1c2UgdGhpcwoJLy8gcmVhbG0gaXMgSU1NVVRBQkxFIGFmdGVyIGFkZHBrZywgc28gYSBjYWxsIHNpdGUgYWRkZWQgbGF0ZXIgY2Fubm90IGJlCgkvLyBtYWRlIHNhZmUgbGF0ZXIg4oCUIGFuZCBhIGhlbHBlciB0aGF0IHJlYWRzIFByZXZpb3VzKCkgb2ZmIGFuIHVuY2hlY2tlZAoJLy8gcmVhbG0gcGFyYW1ldGVyIGlzIGEgZGVzaWduYXRpb24tZm9yZ2VyeSBzaGFwZSAoc2VjdXJpdHkubWQgQ2xhc3MgMikKCS8vIHdoZXRoZXIgb3Igbm90IGl0IGlzIHJlYWNoYWJsZSB0b2RheS4KCS8vCgkvLyBObyBjb3VudCBvZiB0aGUgY2FsbCBzaXRlcyBpcyB3cml0dGVuIGhlcmUsIHBlciBDTEFVREUubWQgwqcgNGE6IHRoZQoJLy8gbnVtYmVyIGlzIHRoZSBvbmUgdGhpbmcgYWJvdXQgdGhpcyBjb21tZW50IHRoYXQgYW4gZWRpdCBlbHNld2hlcmUgaW4gdGhlCgkvLyBmaWxlIGNhbiBmYWxzaWZ5LgoJaWYgIWN1ci5Jc0N1cnJlbnQoKSB7CgkJcGFuaWMoImJvb2tzOiByZWZ1c2VDb2lucyBjYWxsZWQgd2l0aCBhIHJlYWxtIHRoYXQgaXMgbm90IGN1cnJlbnQiKQoJfQoJaWYgY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpICYmIGxlbih1bnNhZmUuT3JpZ2luU2VuZCgpKSA+IDAgewoJCXBhbmljKCJib29rczogdGhpcyByZWFsbSBob2xkcyBubyBjb2lucyBhbmQgaGFzIG5vIHdpdGhkcmF3YWwgcGF0aDsgc2VuZCBub25lIikKCX0KfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEFjY291bnQga2luZHMsIGRlcml2ZWQgZnJvbSB0aGUgY29kZQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIGtpbmRGcm9tQ29kZSBtYXBzIGEgY29kZSdzIGxlYWRpbmcgZGlnaXQgdG8gaXRzIGFjY291bnQga2luZC4gVGhlIHNlY29uZAovLyByZXN1bHQgaXMgZmFsc2UgZm9yIGFueSBjb2RlIHRoYXQgZG9lcyBub3QgYmVnaW4gMS01LgovLwovLyBUaGlzIGlzIHRoZSB3aG9sZSBvZiB0aGUgcmVhbG0ncyBhbnN3ZXIgdG8gam91cm5hbCBvYmxpZ2F0aW9uIDcuIFNlZSB0aGUKLy8gcGFja2FnZSBkb2MgZm9yIHdoYXQgaXQgZG9lcyBhbmQgZG9lcyBub3QgYnV5LgpmdW5jIGtpbmRGcm9tQ29kZShjb2RlIHN0cmluZykgKGpvdXJuYWwuS2luZCwgYm9vbCkgewoJaWYgY29kZSA9PSAiIiB7CgkJcmV0dXJuIDAsIGZhbHNlCgl9Cglzd2l0Y2ggY29kZVswXSB7CgljYXNlICcxJzoKCQlyZXR1cm4gam91cm5hbC5Bc3NldCwgdHJ1ZQoJY2FzZSAnMic6CgkJcmV0dXJuIGpvdXJuYWwuTGlhYmlsaXR5LCB0cnVlCgljYXNlICczJzoKCQlyZXR1cm4gam91cm5hbC5FcXVpdHksIHRydWUKCWNhc2UgJzQnOgoJCXJldHVybiBqb3VybmFsLlJldmVudWUsIHRydWUKCWNhc2UgJzUnOgoJCXJldHVybiBqb3VybmFsLkV4cGVuc2UsIHRydWUKCX0KCXJldHVybiAwLCBmYWxzZQp9CgovLyBLaW5kT2YgcmVwb3J0cyB0aGUga2luZCBhIGNvZGUgd291bGQgYmUgZ2l2ZW4sIHdpdGhvdXQgb3BlbmluZyBhbnl0aGluZy4KLy8gQSBjb25zdW1lciBjYW4gY2FsbCB0aGlzIGJlZm9yZSBPcGVuQWNjb3VudCB0byBjaGVjayBpdHMgb3duIG51bWJlcmluZy4KZnVuYyBLaW5kT2YoY29kZSBzdHJpbmcpIHN0cmluZyB7CglrLCBvayA6PSBraW5kRnJvbUNvZGUoY29kZSkKCWlmICFvayB7CgkJcmV0dXJuICJpbnZhbGlkIgoJfQoJcmV0dXJuIGsuU3RyaW5nKCkKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFdyaXRlcwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIE9wZW5Cb29rIGNyZWF0ZXMgdGhlIGNhbGxlcidzIGJvb2suIEl0IHBhbmljcyBpZiB0aGUgY2FsbGVyIGFscmVhZHkgaGFzIG9uZS4KLy8KLy8gU2VwYXJhdGluZyB0aGlzIGZyb20gT3BlbkFjY291bnQgaXMgZGVsaWJlcmF0ZTogY3JlYXRpbmcgYSBib29rIGlzIHRoZSBjYWxsCi8vIHRoYXQgcGF5cyB0aGUgc3RvcmFnZSBkZXBvc2l0IGZvciB0aGUgb3duZXIncyByZWNvcmQsIGFuZCBhIGNhbGxlciBzaG91bGQKLy8gc2VlIHRoYXQgY29zdCBvbiBpdHMgb3duIHJhdGhlciB0aGFuIGhpZGRlbiBpbnNpZGUgdGhlaXIgZmlyc3QgYWNjb3VudC4KZnVuYyBPcGVuQm9vayhjdXIgcmVhbG0pIHsKCXJlZnVzZUNvaW5zKGN1cikKCW93bmVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJa2V5IDo9IG93bmVyLlN0cmluZygpCglpZiBib29rcy5IYXMoa2V5KSB7CgkJcGFuaWMoImJvb2tzOiB0aGlzIGFkZHJlc3MgYWxyZWFkeSBoYXMgYSBib29rIikKCX0KCWIgOj0gam91cm5hbC5NdXN0TmV3KE1heEFjY291bnRzUGVyQm9vaywgTWF4RW50cmllc1BlckJvb2spCglib29rcy5TZXQoa2V5LCBiKQoJb3BlbmVkQXQuU2V0KGtleSwgcnVudGltZS5DaGFpbkhlaWdodCgpKQoJYm9va0NvdW50KysKfQoKLy8gT3BlbkFjY291bnQgYWRkcyBhbiBhY2NvdW50IHRvIHRoZSBjYWxsZXIncyBib29rLiBUaGUgS0lORCBJUyBERVJJVkVEIGZyb20KLy8gdGhlIGNvZGUncyBsZWFkaW5nIGRpZ2l0OyB0aGVyZSBpcyBubyBraW5kIHBhcmFtZXRlci4gU2VlIHRoZSBwYWNrYWdlIGRvYy4KZnVuYyBPcGVuQWNjb3VudChjdXIgcmVhbG0sIGNvZGUsIG5hbWUgc3RyaW5nKSB7CglyZWZ1c2VDb2lucyhjdXIpCgliIDo9IG11c3RPd25Cb29rKGN1cikKCglpZiBjb2RlID09ICIiIHsKCQlwYW5pYygiYm9va3M6IGFjY291bnQgY29kZSBtdXN0IG5vdCBiZSBlbXB0eSIpCgl9CglpZiBsZW4oY29kZSkgPiBNYXhDb2RlTGVuIHsKCQlwYW5pYygiYm9va3M6IGFjY291bnQgY29kZSB0b28gbG9uZywgbWF4ICIgKyBzdHJjb252Lkl0b2EoTWF4Q29kZUxlbikpCgl9CglpZiBsZW4obmFtZSkgPiBNYXhOYW1lTGVuIHsKCQlwYW5pYygiYm9va3M6IGFjY291bnQgbmFtZSB0b28gbG9uZywgbWF4ICIgKyBzdHJjb252Lkl0b2EoTWF4TmFtZUxlbikpCgl9CglraW5kLCBvayA6PSBraW5kRnJvbUNvZGUoY29kZSkKCWlmICFvayB7CgkJcGFuaWMoImJvb2tzOiBhY2NvdW50IGNvZGUgbXVzdCBiZWdpbiAxLTUgKDEgYXNzZXQsIDIgbGlhYmlsaXR5LCAiICsKCQkJIjMgZXF1aXR5LCA0IHJldmVudWUsIDUgZXhwZW5zZSk7IGdvdCAiICsgY29kZSkKCX0KCS8vIGpvdXJuYWwgdmFsaWRhdGVzIGxlbmd0aCwgZHVwbGljYXRpb24gYW5kIHRoZSBjaGFydCBjYXAgaXRzZWxmOyBpdHMKCS8vIGVycm9yIGlzIHJldHVybmVkIHJhdGhlciB0aGFuIHN3YWxsb3dlZCBzbyB0aGUgY2FsbGVyIHNlZXMgd2hpY2ggYm91bmQKCS8vIHRoZXkgaGl0LgoJaWYgZXJyIDo9IGIuT3Blbihjb2RlLCBuYW1lLCBraW5kKTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoImJvb2tzOiAiICsgZXJyLkVycm9yKCkpCgl9Cn0KCi8vIFBvc3RTaW1wbGUgcG9zdHMgdGhlIHR3by1sZWcgZW50cnkgdGhhdCBpcyB0aGUgb3ZlcndoZWxtaW5nbHkgY29tbW9uIGNhc2U6Ci8vIGRlYml0IG9uZSBhY2NvdW50LCBjcmVkaXQgYW5vdGhlciwgZm9yIHRoZSBzYW1lIGFtb3VudC4KLy8KLy8gSXQgZXhpc3RzIGJlc2lkZSBQb3N0TXVsdGkgYmVjYXVzZSB0aGUgdHdvLWxlZyBmb3JtIGNhbm5vdCBiZSBtaXMtZW5jb2RlZC4KLy8gQSBjYWxsZXIgd2hvIHdhbnRzIG9uZSBkZWJpdCBhbmQgb25lIGNyZWRpdCBzaG91bGQgbmV2ZXIgaGF2ZSB0byBnZXQgYSBsZWcKLy8gc3BlY2lmaWNhdGlvbidzIHN5bnRheCByaWdodC4KZnVuYyBQb3N0U2ltcGxlKGN1ciByZWFsbSwgZGViaXRDb2RlLCBjcmVkaXRDb2RlIHN0cmluZywgYW1vdW50IGludDY0LCBtZW1vIHN0cmluZykgdWludDY0IHsKCXJlZnVzZUNvaW5zKGN1cikKCWIgOj0gbXVzdE93bkJvb2soY3VyKQoJY2hlY2tNZW1vKG1lbW8pCglpZiBhbW91bnQgPD0gMCB7CgkJcGFuaWMoImJvb2tzOiBhbW91bnQgbXVzdCBiZSBwb3NpdGl2ZSIpCgl9CglpZiBkZWJpdENvZGUgPT0gY3JlZGl0Q29kZSB7CgkJLy8gam91cm5hbCB3b3VsZCBhY2NlcHQgdGhpcyBhbmQgZm9sZCBib3RoIGxlZ3MsIG5ldHRpbmcgdG8gemVybwoJCS8vIGFnYWluc3Qgb25lIGFjY291bnQuIEl0IGlzIGFsd2F5cyBhIGNhbGxlciBtaXN0YWtlLCBzbyBpdCBpcwoJCS8vIHJlZnVzZWQgaGVyZSByYXRoZXIgdGhhbiByZWNvcmRlZCBhcyBhIG5vLW9wIGVudHJ5LgoJCXBhbmljKCJib29rczogZGViaXQgYW5kIGNyZWRpdCBhY2NvdW50cyBtdXN0IGRpZmZlciIpCgl9Cglwb3N0aW5ncyA6PSBbXWpvdXJuYWwuUG9zdGluZ3sKCQl7QWNjb3VudDogZGViaXRDb2RlLCBTaWRlOiBqb3VybmFsLkRlYml0LCBBbW91bnQ6IGFtb3VudH0sCgkJe0FjY291bnQ6IGNyZWRpdENvZGUsIFNpZGU6IGpvdXJuYWwuQ3JlZGl0LCBBbW91bnQ6IGFtb3VudH0sCgl9CglpZCwgZXJyIDo9IGIuUG9zdChydW50aW1lLkNoYWluSGVpZ2h0KCksIG1lbW8sIHBvc3RpbmdzKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoImJvb2tzOiAiICsgZXJyLkVycm9yKCkpCgl9CglyZXR1cm4gaWQKfQoKLy8gUG9zdE11bHRpIHBvc3RzIGFuIGVudHJ5IG9mIHVwIHRvIE1heExlZ3NQZXJFbnRyeSBsZWdzLCBzcGVjaWZpZWQgYXMgYQovLyBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBjb2xvbi1zZXBhcmF0ZWQgdHJpcGxlczoKLy8KLy8JIjEwMDA6RDo1MDAsNDAwMDpDOjMwMCw0MTAwOkM6MjAwIgovLwovLyBTaWRlIGlzIEQgb3IgQywgY2FzZS1pbnNlbnNpdGl2ZS4gQW1vdW50cyBhcmUgcG9zaXRpdmUgaW50ZWdlcnMgaW4gdGhlCi8vIG93bmVyJ3MgY2hvc2VuIHVuaXQuIFRoZSBzdHJpbmcgZm9ybSBpcyB1c2VkIGJlY2F1c2UgYSBjcm9zc2luZyBmdW5jdGlvbgovLyBjYW5ub3QgdXNlZnVsbHkgdGFrZSBhIHNsaWNlIG92ZXIgTXNnQ2FsbDsgdHJlYXN1cnlfYm9hcmQgZW5jb2RlcyBhIGxpc3QKLy8gdGhlIHNhbWUgd2F5LgovLwovLyBEZWJpdHMgbXVzdCBlcXVhbCBjcmVkaXRzLCBhbmQgam91cm5hbCBuYW1lcyB3aGljaCBzaWRlIGlzIHNob3J0LgovLwovLyBBIGxlZyBtYXkgbmFtZSBhbiBhY2NvdW50IGFub3RoZXIgbGVnIGFscmVhZHkgbmFtZWQg4oCUIGpvdXJuYWwgZm9sZHMgdGhlbSwKLy8gYW5kICIxMDAwOkQ6NTAwLDEwMDA6QzoyMDAsNDAwMDpDOjMwMCIgaXMgYSBsZWdpdGltYXRlIG5ldCArMzAwIHRvIDEwMDAuCi8vIFdoYXQgaXMgcmVmdXNlZCBpcyBhbiBlbnRyeSBpbiB3aGljaCBFVkVSWSBsZWcgbmFtZXMgdGhlIHNhbWUgYWNjb3VudDogaXQKLy8gYmFsYW5jZXMgb25seSBieSBuZXR0aW5nIHRvIGV4YWN0bHkgemVybywgc28gaXQgaXMgdGhlIFBvc3RTaW1wbGUgbWlzdGFrZQovLyB3ZWFyaW5nIHRoZSBtdWx0aS1sZWcgc3ludGF4LiBUaGUgbmFycm93IHJ1bGUgaXMgZGVsaWJlcmF0ZSDigJQgYSBibGFua2V0Ci8vICJubyByZXBlYXRlZCBhY2NvdW50IiB3b3VsZCByZWplY3QgdGhlIGxlZ2l0aW1hdGUgZm9sZCBhYm92ZS4KZnVuYyBQb3N0TXVsdGkoY3VyIHJlYWxtLCBsZWdzLCBtZW1vIHN0cmluZykgdWludDY0IHsKCXJlZnVzZUNvaW5zKGN1cikKCWIgOj0gbXVzdE93bkJvb2soY3VyKQoJY2hlY2tNZW1vKG1lbW8pCglwb3N0aW5ncyA6PSBwYXJzZUxlZ3MobGVncykKCWlmIGFsbE9uZUFjY291bnQocG9zdGluZ3MpIHsKCQlwYW5pYygiYm9va3M6IGV2ZXJ5IGxlZyBuYW1lcyAiICsgcG9zdGluZ3NbMF0uQWNjb3VudCArCgkJCSI7IHN1Y2ggYW4gZW50cnkgY2FuIG9ubHkgbmV0IHRvIHplcm8iKQoJfQoJaWQsIGVyciA6PSBiLlBvc3QocnVudGltZS5DaGFpbkhlaWdodCgpLCBtZW1vLCBwb3N0aW5ncykKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKCJib29rczogIiArIGVyci5FcnJvcigpKQoJfQoJcmV0dXJuIGlkCn0KCi8vIFJldmVyc2UgcG9zdHMgdGhlIG1pcnJvciBpbWFnZSBvZiBhbiBleGlzdGluZyBlbnRyeSBpbiB0aGUgY2FsbGVyJ3MgYm9vaywKLy8gZGF0ZWQgbm93LiBUaGUgb3JpZ2luYWwgaXMgbGVmdCBleGFjdGx5IGFzIGl0IHdhczogdGhpcyBpcyBhIGNvcnJlY3Rpb24sCi8vIG5vdCBhbiBlZGl0LgovLwovLyBBbiBlbnRyeSBtYXkgYmUgcmV2ZXJzZWQgYXQgbW9zdCBvbmNlLiBUaGUgcmV2ZXJzYWwgaXMgaXRzZWxmIGFuIGVudHJ5IGFuZAovLyBtYXkgaXRzZWxmIGJlIHJldmVyc2VkIG9uY2UuCmZ1bmMgUmV2ZXJzZShjdXIgcmVhbG0sIGlkIHVpbnQ2NCwgbWVtbyBzdHJpbmcpIHVpbnQ2NCB7CglyZWZ1c2VDb2lucyhjdXIpCgliIDo9IG11c3RPd25Cb29rKGN1cikKCWNoZWNrTWVtbyhtZW1vKQoJbmV3SUQsIGVyciA6PSBiLlJldmVyc2UoaWQsIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSwgbWVtbykKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKCJib29rczogIiArIGVyci5FcnJvcigpKQoJfQoJcmV0dXJuIG5ld0lECn0KCi8vIENsb3NlVGhyb3VnaCBzZWFscyB0aGUgY2FsbGVyJ3MgYm9vayB1cCB0byBhbmQgaW5jbHVkaW5nIGEgaGVpZ2h0OiBubyBlbnRyeQovLyBtYXkgYWZ0ZXJ3YXJkcyBiZSBkYXRlZCBhdCBvciBiZWZvcmUgaXQuIFRoZSBzZWFsIG9ubHkgZXZlciBtb3ZlcyBmb3J3YXJkLgovLwovLyBQYXNzaW5nIGEgaGVpZ2h0IGF0IG9yIGJleW9uZCB0aGUgY3VycmVudCBvbmUgc2VhbHMgdGhlIHByZXNlbnQgYW5kIG1ha2VzCi8vIHRoZSBib29rIGltbWVkaWF0ZWx5IHVucG9zdGFibGUgdW50aWwgdGhlIGNoYWluIGFkdmFuY2VzIHBhc3QgaXQuIFRoYXQgaXMKLy8gcGVybWl0dGVkIOKAlCBpdCBpcyB0aGUgb3duZXIncyBvd24gYm9vayDigJQgYW5kIGl0IGlzIGNhbGxlZCBvdXQgYmVjYXVzZSBpdCBpcwovLyB0aGUgb25lIHdheSB0byBicmljayBhIGJvb2sgd2l0aG91dCBmaWxsaW5nIGl0LgpmdW5jIENsb3NlVGhyb3VnaChjdXIgcmVhbG0sIHRocm91Z2ggaW50NjQpIHsKCXJlZnVzZUNvaW5zKGN1cikKCWIgOj0gbXVzdE93bkJvb2soY3VyKQoJaWYgZXJyIDo9IGIuQ2xvc2UodGhyb3VnaCk7IGVyciAhPSBuaWwgewoJCXBhbmljKCJib29rczogIiArIGVyci5FcnJvcigpKQoJfQp9CgovLyBSZWRlcml2ZSBydW5zIGpvdXJuYWwncyBTVFJPTkcgaW52YXJpYW50IGNoZWNrIG92ZXIgdGhlIGNhbGxlcidzIG93biBib29rOgovLyBpdCByZXBsYXlzIGV2ZXJ5IHBvc3Rpbmcgb2YgZXZlcnkgZW50cnkgYW5kIGNvbXBhcmVzIHRoZSByZXN1bHQgYWdhaW5zdAovLyBib3RoIGFjY3VtdWxhdG9ycy4KLy8KLy8gSXQgaXMgYSBjcm9zc2luZyBmdW5jdGlvbiByYXRoZXIgdGhhbiBhIGdldHRlciBvbiBwdXJwb3NlLiBUaGUgY2hlY2sgaXMKLy8gTyhhbGwgcG9zdGluZ3MgZXZlcikgYW5kIHRoZSBvd25lciBpcyB0aGUgcGFydHkgd2hvIHNob3VsZCBwYXkgZm9yIGl0IOKAlAovLyBleHBvc2luZyBpdCBhcyBhIGZyZWUgcmVhZCB3b3VsZCBsZXQgYW55b25lIG1ha2UgYW4gb3duZXIncyBib29rIGV4cGVuc2l2ZQovLyB0byBxdWVyeS4gSXNCYWxhbmNlZCBpcyB0aGUgY2hlYXAgY2hlY2sgYW5kIGlzIGEgZnJlZSByZWFkLgovLwovLyBSZXR1cm5zIHRoZSByZXBsYXllZCB0b3RhbHMgYW5kIHdoZXRoZXIgdGhleSBhZ3JlZS4KZnVuYyBSZWRlcml2ZShjdXIgcmVhbG0pIChkZWJpdHMsIGNyZWRpdHMgaW50NjQsIGFncmVlcyBib29sKSB7CglyZWZ1c2VDb2lucyhjdXIpCgliIDo9IG11c3RPd25Cb29rKGN1cikKCXJldHVybiBiLlJlZGVyaXZlRnJvbUpvdXJuYWwoKQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gSW50ZXJuYWxzCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gbXVzdE93bkJvb2sgcmV0dXJucyB0aGUgQ0FMTEVSJ1MgYm9vaywgYW5kIHRoZXJlIGlzIG5vIHZhcmlhbnQgdGhhdCByZXR1cm5zCi8vIGFueW9uZSBlbHNlJ3MuCi8vCi8vIEF1dGhvcml6YXRpb24gaXMgc3RydWN0dXJhbCByYXRoZXIgdGhhbiBhIGNoZWNrOiB0aGUgb3duZXIgaXMgZGVyaXZlZCBmcm9tCi8vIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSBhbmQgbm8gbXV0YXRpbmcgZnVuY3Rpb24gdGFrZXMgYW4gb3duZXIgcGFyYW1ldGVyLAovLyBzbyB0aGVyZSBpcyBubyBhZGRyZXNzIGZvciBhIGNhbGxlciB0byBmb3JnZS4gam91cm5hbCBvYmxpZ2F0aW9uIDUuCi8vCi8vICJObyBhZGRyZXNzIHRvIGZvcmdlIiBpcyB0cnVlIG9mIHRoZSBTSUdOQVRVUkUgYW5kIHdhcyBuZXZlciB0cnVlIG9mIHRoZQovLyByZWFsbSBWQUxVRSwgd2hpY2ggaXMgdGhlIHNlY29uZCBoYWxmIG9mIHRoZSBzYW1lIENsYXNzIDIgc2hhcGUgcmVmdXNlQ29pbnMKLy8gY2FycmllcyBhYm92ZSDigJQgYW5kIHRoZSBtb3JlIGNvbnNlcXVlbnRpYWwgaGFsZiwgYmVjYXVzZSB0aGlzIGlzIHRoZQovLyBmdW5jdGlvbiB0aGF0IGRlY2lkZXMgd2hvIG93bnMgdGhlIGJvb2sgcmF0aGVyIHRoYW4gb25lIHRoYXQgb25seSByZWZ1c2VzCi8vIGNvaW5zLiBUaGUgZ3VhcmQgaXMgYSBuby1vcCB0b2RheSBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIHJlZnVzZUNvaW5zJ3M6Ci8vIGV2ZXJ5IGNhbGwgc2l0ZSBmb3J3YXJkcyBhIGNyb3NzaW5nIGVudHJ5cG9pbnQncyBvd24gZmlyc3QgY3VyLiBJdCBpcyBrZXB0Ci8vIGZvciB0aGUgc2FtZSByZWFzb24gdG9vLCBhbmQgaXRzIGNhbGwtc2l0ZSBjb3VudCBpcyBsaWtld2lzZSBub3Qgd3JpdHRlbgovLyBkb3duLiBTZWUgQVVESVQubWQgwqcgTy4KZnVuYyBtdXN0T3duQm9vayhjdXIgcmVhbG0pICpqb3VybmFsLkJvb2sgewoJaWYgIWN1ci5Jc0N1cnJlbnQoKSB7CgkJcGFuaWMoImJvb2tzOiBtdXN0T3duQm9vayBjYWxsZWQgd2l0aCBhIHJlYWxtIHRoYXQgaXMgbm90IGN1cnJlbnQiKQoJfQoJb3duZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCgliLCBvayA6PSBib29rcy5HZXQob3duZXIuU3RyaW5nKCkpLigqam91cm5hbC5Cb29rKQoJaWYgIW9rIHsKCQlwYW5pYygiYm9va3M6IG5vIGJvb2sgZm9yIHRoaXMgYWRkcmVzczsgY2FsbCBPcGVuQm9vayBmaXJzdCIpCgl9CglyZXR1cm4gYgp9CgovLyBib29rIHJldHVybnMgYW4gb3duZXIncyBib29rIGZvciBSRUFELU9OTFkgdXNlIGJ5IHRoZSBnZXR0ZXJzIGJlbG93LgovLwovLyBUaGUgcG9pbnRlciBuZXZlciBsZWF2ZXMgdGhpcyBmaWxlOiBldmVyeSBleHBvcnRlZCBnZXR0ZXIgY29waWVzIHNjYWxhcnMgb3IKLy8gam91cm5hbCdzIGJ5LXZhbHVlIEFjY291bnQvRW50cnkgb3V0IG9mIGl0LiBPYmxpZ2F0aW9uIDQuCi8vCi8vIGF2bC5UcmVlLkdldCByZXR1cm5zIE9ORSB2YWx1ZSwgbm90IChhbnksIGJvb2wpOiBpdCBjYW5ub3QgZGlzdGluZ3Vpc2ggYQovLyBuaWwtdmFsdWVkIGtleSBmcm9tIGFuIGFic2VudCBvbmUsIHdoaWNoIGlzIHRoZSBzYW1lIHRyYXAgam91cm5hbCdzCi8vIGByZXZlcnNlZGAgZmllbGQgY29tbWVudCBuYW1lcyBmcm9tIHRoZSBvdGhlciBzaWRlLiBUaGUgdHdvLXZhbHVlIFRZUEUKLy8gQVNTRVJUSU9OIGlzIHdoYXQgY2FycmllcyB0aGUgZXhpc3RlbmNlIGFuc3dlciBoZXJlLCBpbiBvbmUgdHJhdmVyc2FsIOKAlAovLyBgb2tgIGlzIGZhbHNlIGZvciBhbiBhYnNlbnQga2V5IGFuZCBmb3IgYSBwcmVzZW50LWJ1dC13cm9uZy10eXBlZCB2YWx1ZQovLyBhbGlrZSwgYW5kIHRoZSBzZWNvbmQgaXMgaW1wb3NzaWJsZSBiZWNhdXNlIG9ubHkgdGhpcyBmaWxlIGV2ZXIgU2V0cy4KLy8gRG8gbm90ICJmaXgiIHRoaXMgaW50byBIYXMtdGhlbi1HZXQ6IHRoYXQgaXMgdHdvIHRyYXZlcnNhbHMgZm9yIHRoZSBzYW1lCi8vIGFuc3dlciwgYW5kIGEgcmVhZGVyIHdvdWxkIHRoZW4gb3dlIHRoZW1zZWx2ZXMgYSBwcm9vZiB0aGF0IG5vdGhpbmcgY2FuCi8vIGNoYW5nZSBiZXR3ZWVuIHRoZW0uCmZ1bmMgYm9vayhvd25lciBhZGRyZXNzKSAoKmpvdXJuYWwuQm9vaywgYm9vbCkgewoJYiwgb2sgOj0gYm9va3MuR2V0KG93bmVyLlN0cmluZygpKS4oKmpvdXJuYWwuQm9vaykKCWlmICFvayB7CgkJcmV0dXJuIG5pbCwgZmFsc2UKCX0KCXJldHVybiBiLCB0cnVlCn0KCmZ1bmMgbXVzdEJvb2sob3duZXIgYWRkcmVzcykgKmpvdXJuYWwuQm9vayB7CgliLCBvayA6PSBib29rKG93bmVyKQoJaWYgIW9rIHsKCQlwYW5pYygiYm9va3M6IG5vIGJvb2sgZm9yICIgKyBvd25lci5TdHJpbmcoKSkKCX0KCXJldHVybiBiCn0KCi8vIGFsbE9uZUFjY291bnQgcmVwb3J0cyB3aGV0aGVyIGV2ZXJ5IHBvc3RpbmcgbmFtZXMgdGhlIHNhbWUgYWNjb3VudC4KLy8KLy8gcGFyc2VMZWdzIGhhcyBhbHJlYWR5IHJlZnVzZWQgYSBsaXN0IHNob3J0ZXIgdGhhbiB0d28sIHNvIHRoaXMgaXMgbmV2ZXIKLy8gYXNrZWQgb2YgYSBzaW5nbGUtZWxlbWVudCBzbGljZSBhbmQgdGhlIGxvb3AgYmVsb3cgYWx3YXlzIGNvbXBhcmVzLgpmdW5jIGFsbE9uZUFjY291bnQocG9zdGluZ3MgW11qb3VybmFsLlBvc3RpbmcpIGJvb2wgewoJZm9yIF8sIHAgOj0gcmFuZ2UgcG9zdGluZ3NbMTpdIHsKCQlpZiBwLkFjY291bnQgIT0gcG9zdGluZ3NbMF0uQWNjb3VudCB7CgkJCXJldHVybiBmYWxzZQoJCX0KCX0KCXJldHVybiB0cnVlCn0KCmZ1bmMgY2hlY2tNZW1vKG1lbW8gc3RyaW5nKSB7CglpZiBsZW4obWVtbykgPiBNYXhNZW1vTGVuIHsKCQlwYW5pYygiYm9va3M6IG1lbW8gdG9vIGxvbmcsIG1heCAiICsgc3RyY29udi5JdG9hKE1heE1lbW9MZW4pKQoJfQp9CgovLyBwYXJzZUxlZ3MgZGVjb2RlcyB0aGUgImNvZGU6c2lkZTphbW91bnQsLi4uIiBmb3JtIG9mIFBvc3RNdWx0aS4KLy8KLy8gRXZlcnkgZmFpbHVyZSBpcyBhIHBhbmljIG5hbWluZyB0aGUgb2ZmZW5kaW5nIGxlZyBieSBpdHMgMS1iYXNlZCBwb3NpdGlvbiwKLy8gYmVjYXVzZSBhIGNhbGxlciB3aG8gbWlzdHlwZWQgb25lIHRyaXBsZSBpbiBhIGxpc3Qgb2YgZWlnaHQgbmVlZHMgdG8ga25vdwovLyB3aGljaCBvbmUuIEEgc2lsZW50bHktZHJvcHBlZCBsZWcgd291bGQgcHJvZHVjZSBhbiB1bmJhbGFuY2VkIGVudHJ5IGFuZCB0aGUKLy8gZXJyb3Igd291bGQgc3VyZmFjZSBhcyAiZGViaXRzIGRvIG5vdCBlcXVhbCBjcmVkaXRzIiwgd2hpY2ggcG9pbnRzIGF0IHRoZQovLyB3cm9uZyB0aGluZy4KZnVuYyBwYXJzZUxlZ3MobGVncyBzdHJpbmcpIFtdam91cm5hbC5Qb3N0aW5nIHsKCWlmIHN0cmluZ3MuVHJpbVNwYWNlKGxlZ3MpID09ICIiIHsKCQlwYW5pYygiYm9va3M6IG5vIGxlZ3MgZ2l2ZW47IGZvcm1hdCBpcyBcIjEwMDA6RDo1MDAsNDAwMDpDOjUwMFwiIikKCX0KCXBhcnRzIDo9IHN0cmluZ3MuU3BsaXQobGVncywgIiwiKQoJaWYgbGVuKHBhcnRzKSA8IDIgewoJCXBhbmljKCJib29rczogYW4gZW50cnkgbmVlZHMgYXQgbGVhc3QgdHdvIGxlZ3MiKQoJfQoJaWYgbGVuKHBhcnRzKSA+IE1heExlZ3NQZXJFbnRyeSB7CgkJcGFuaWMoImJvb2tzOiB0b28gbWFueSBsZWdzLCBtYXggIiArIHN0cmNvbnYuSXRvYShNYXhMZWdzUGVyRW50cnkpKQoJfQoJb3V0IDo9IG1ha2UoW11qb3VybmFsLlBvc3RpbmcsIDAsIGxlbihwYXJ0cykpCglmb3IgaSwgcmF3IDo9IHJhbmdlIHBhcnRzIHsKCQlhdCA6PSAiIGF0IGxlZyAiICsgc3RyY29udi5JdG9hKGkrMSkKCQlmIDo9IHN0cmluZ3MuU3BsaXQoc3RyaW5ncy5UcmltU3BhY2UocmF3KSwgIjoiKQoJCWlmIGxlbihmKSAhPSAzIHsKCQkJcGFuaWMoImJvb2tzOiBleHBlY3RlZCBjb2RlOnNpZGU6YW1vdW50IiArIGF0KQoJCX0KCQljb2RlIDo9IHN0cmluZ3MuVHJpbVNwYWNlKGZbMF0pCgkJaWYgY29kZSA9PSAiIiB7CgkJCXBhbmljKCJib29rczogZW1wdHkgYWNjb3VudCBjb2RlIiArIGF0KQoJCX0KCQl2YXIgc2lkZSBqb3VybmFsLlNpZGUKCQlzd2l0Y2ggc3RyaW5ncy5Ub1VwcGVyKHN0cmluZ3MuVHJpbVNwYWNlKGZbMV0pKSB7CgkJY2FzZSAiRCIsICJEUiIsICJERUJJVCI6CgkJCXNpZGUgPSBqb3VybmFsLkRlYml0CgkJY2FzZSAiQyIsICJDUiIsICJDUkVESVQiOgoJCQlzaWRlID0gam91cm5hbC5DcmVkaXQKCQlkZWZhdWx0OgoJCQlwYW5pYygiYm9va3M6IHNpZGUgbXVzdCBiZSBEIG9yIEMiICsgYXQpCgkJfQoJCWFtb3VudCwgZXJyIDo9IHN0cmNvbnYuUGFyc2VJbnQoc3RyaW5ncy5UcmltU3BhY2UoZlsyXSksIDEwLCA2NCkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcGFuaWMoImJvb2tzOiBhbW91bnQgaXMgbm90IGFuIGludGVnZXIiICsgYXQpCgkJfQoJCWlmIGFtb3VudCA8PSAwIHsKCQkJcGFuaWMoImJvb2tzOiBhbW91bnQgbXVzdCBiZSBwb3NpdGl2ZSIgKyBhdCkKCQl9CgkJb3V0ID0gYXBwZW5kKG91dCwgam91cm5hbC5Qb3N0aW5ne0FjY291bnQ6IGNvZGUsIFNpZGU6IHNpZGUsIEFtb3VudDogYW1vdW50fSkKCX0KCXJldHVybiBvdXQKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFJlYWRzIOKAlCBhbGwgb3duZXItc2NvcGVkLCBieSDCpzQuMiBvZiBESVNDT1ZFUlkubWQKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBIYXNCb29rIHJlcG9ydHMgd2hldGhlciBhbiBhZGRyZXNzIGhhcyBvcGVuZWQgYSBib29rLgpmdW5jIEhhc0Jvb2sob3duZXIgYWRkcmVzcykgYm9vbCB7IHJldHVybiBib29rcy5IYXMob3duZXIuU3RyaW5nKCkpIH0KCi8vIEJvb2tzIGlzIHRoZSBudW1iZXIgb2YgYm9va3MgdGhhdCBleGlzdC4gSXQgaXMgYSBjb3VudCBhbmQgbm90aGluZyBtb3JlOgovLyB0aGVyZSBpcyBkZWxpYmVyYXRlbHkgbm8gd2F5IHRvIGVudW1lcmF0ZSB0aGVtIG9yIGFnZ3JlZ2F0ZSBhY3Jvc3MgdGhlbS4KZnVuYyBCb29rcygpIGludCB7IHJldHVybiBib29rQ291bnQgfQoKLy8gT3BlbmVkQXQgaXMgdGhlIGhlaWdodCBhbiBvd25lcidzIGJvb2sgd2FzIGNyZWF0ZWQuCmZ1bmMgT3BlbmVkQXQob3duZXIgYWRkcmVzcykgaW50NjQgewoJaCwgb2sgOj0gb3BlbmVkQXQuR2V0KG93bmVyLlN0cmluZygpKS4oaW50NjQpCglpZiAhb2sgewoJCXBhbmljKCJib29rczogbm8gYm9vayBmb3IgIiArIG93bmVyLlN0cmluZygpKQoJfQoJcmV0dXJuIGgKfQoKLy8gQmFsYW5jZSByZXR1cm5zIGFuIGFjY291bnQncyBiYWxhbmNlIGluIGl0cyBOT1JNQUwgZGlyZWN0aW9uOiBwb3NpdGl2ZQovLyBtZWFucyBhIGRlYml0IGJhbGFuY2UgZm9yIGFuIGFzc2V0IG9yIGV4cGVuc2UsIGFuZCBhIGNyZWRpdCBiYWxhbmNlIGZvciBhCi8vIGxpYWJpbGl0eSwgZXF1aXR5IG9yIHJldmVudWUgYWNjb3VudC4KLy8KLy8gVGhlIHNlY29uZCByZXN1bHQgZGlzdGluZ3Vpc2hlcyAibm8gc3VjaCBhY2NvdW50IiBmcm9tICJ6ZXJvIi4KZnVuYyBCYWxhbmNlKG93bmVyIGFkZHJlc3MsIGNvZGUgc3RyaW5nKSAoaW50NjQsIGJvb2wpIHsKCWIsIG9rIDo9IGJvb2sob3duZXIpCglpZiAhb2sgewoJCXJldHVybiAwLCBmYWxzZQoJfQoJcmV0dXJuIGIuQmFsYW5jZShjb2RlKQp9CgovLyBSYXdCYWxhbmNlIHJldHVybnMgYW4gYWNjb3VudCdzIGRlYml0cyBtaW51cyBjcmVkaXRzLCB3aXRob3V0IHRoZSBub3JtYWwtCi8vIGRpcmVjdGlvbiBzaWduIGNvbnZlbnRpb24uIEV4cG9zZWQgYmVjYXVzZSBhIGNvbnN1bWVyIHJlY29uY2lsaW5nIGFnYWluc3QKLy8gYW4gZXh0ZXJuYWwgc3lzdGVtIHVzdWFsbHkgd2FudHMgdGhlIHJhdyBmaWd1cmUuCmZ1bmMgUmF3QmFsYW5jZShvd25lciBhZGRyZXNzLCBjb2RlIHN0cmluZykgKGludDY0LCBib29sKSB7CgliLCBvayA6PSBib29rKG93bmVyKQoJaWYgIW9rIHsKCQlyZXR1cm4gMCwgZmFsc2UKCX0KCWEsIGZvdW5kIDo9IGIuQWNjb3VudChjb2RlKQoJaWYgIWZvdW5kIHsKCQlyZXR1cm4gMCwgZmFsc2UKCX0KCXJldHVybiBhLlJhd0RlbHRhKCksIHRydWUKfQoKLy8gQWNjb3VudEluZm8gcmV0dXJucyBhbiBhY2NvdW50J3MgZnVsbCBzdGF0ZS4gam91cm5hbCByZXR1cm5zIEFjY291bnQgQlkKLy8gVkFMVUUsIHNvIHRoaXMgaGFuZHMgb3V0IGEgY29weSBhbmQgbm8gcG9pbnRlciBpbnRvIHN0b3JlZCBzdGF0ZS4KZnVuYyBBY2NvdW50SW5mbyhvd25lciBhZGRyZXNzLCBjb2RlIHN0cmluZykgKG5hbWUsIGtpbmQgc3RyaW5nLCBkZWJpdHMsIGNyZWRpdHMsIGJhbGFuY2UgaW50NjQpIHsKCWEsIG9rIDo9IG11c3RCb29rKG93bmVyKS5BY2NvdW50KGNvZGUpCglpZiAhb2sgewoJCXBhbmljKCJib29rczogbm8gYWNjb3VudCAiICsgY29kZSArICIgZm9yICIgKyBvd25lci5TdHJpbmcoKSkKCX0KCXJldHVybiBhLk5hbWUsIGEuS2luZC5TdHJpbmcoKSwgYS5EZWJpdHMsIGEuQ3JlZGl0cywgYS5CYWxhbmNlKCkKfQoKLy8gSGFzQWNjb3VudCByZXBvcnRzIHdoZXRoZXIgYW4gb3duZXIncyBjaGFydCBjb250YWlucyBhIGNvZGUuCmZ1bmMgSGFzQWNjb3VudChvd25lciBhZGRyZXNzLCBjb2RlIHN0cmluZykgYm9vbCB7CgliLCBvayA6PSBib29rKG93bmVyKQoJaWYgIW9rIHsKCQlyZXR1cm4gZmFsc2UKCX0KCV8sIGZvdW5kIDo9IGIuQWNjb3VudChjb2RlKQoJcmV0dXJuIGZvdW5kCn0KCi8vIEFjY291bnRzIGlzIHRoZSBudW1iZXIgb2YgYWNjb3VudHMgaW4gYW4gb3duZXIncyBjaGFydC4KZnVuYyBBY2NvdW50cyhvd25lciBhZGRyZXNzKSBpbnQgeyByZXR1cm4gbXVzdEJvb2sob3duZXIpLkFjY291bnRDb3VudCgpIH0KCi8vIENvZGVzIGxpc3RzIGFuIG93bmVyJ3MgYWNjb3VudCBjb2RlcyBpbiBhc2NlbmRpbmcgY29kZSBvcmRlciwgYmVnaW5uaW5nIGF0Ci8vIGZyb20gSU5DTFVTSVZFIGFuZCByZXR1cm5pbmcgYXQgbW9zdCBsaW1pdCBvZiB0aGVtLiBBIGxpbWl0IDw9IDAgcmV0dXJucwovLyBub3RoaW5nOyBhIGxpbWl0IGFib3ZlIHRoZSBjaGFydCBjYXAgaXMgY2xhbXBlZCB0byBpdC4gUGFnZSBieSBwYXNzaW5nIHRoZQovLyBsYXN0IGNvZGUgcmVjZWl2ZWQgYmFjayBhcyBmcm9tLCB3aGljaCByZS1yZWFkcyB0aGF0IG9uZSBjb2RlLgovLwovLyAjIFdoeSB0aGlzIGV4aXN0cywgYW5kIHdoeSBhIGNvdW50ZXIgd2FzIG5vdCBlbm91Z2gKLy8KLy8gQWNjb3VudHMgYWJvdmUgcmV0dXJucyBIT1cgTUFOWSBhY2NvdW50cyBhIGNoYXJ0IGhvbGRzLCBhbmQgQWNjb3VudEluZm8KLy8gYW5zd2VycyBmb3IgYSBjb2RlIHRoZSBjYWxsZXIgYWxyZWFkeSBrbm93cy4gTmVpdGhlciBsZXRzIGEgY2FsbGVyIERJU0NPVkVSCi8vIGEgY29kZS4gV2l0aG91dCB0aGlzLCBhIHRyaWFsIGJhbGFuY2UsIGEgYmFsYW5jZSBzaGVldCBhbmQgYW4gaW5jb21lCi8vIHN0YXRlbWVudCBhcmUgYWxsIHVuYnVpbGRhYmxlIGZyb20gb3V0c2lkZSB0aGlzIHJlYWxtIGhvd2V2ZXIgbWFueSB0aW1lcwovLyB0aGUgY2hhcnQgaXMgaW50ZXJyb2dhdGVkIOKAlCBhIGNvbnN1bWVyIGNvdWxkIG9ubHkgcmVwb3J0IG9uIGFjY291bnRzIGl0IGhhZAovLyBpbmRlcGVuZGVudGx5IGJlZW4gdG9sZCBhYm91dCwgd2hpY2ggZm9yIGEgY2hhcnQgdGhlIE9XTkVSIGRlZmluZXMgaXMgbm8KLy8gZ3VhcmFudGVlIGF0IGFsbC4KLy8KLy8gIyBXaHkgbm90IHNpbXBseSBleHBvcnQgam91cm5hbCdzIGl0ZXJhdG9yCi8vCi8vIGpvdXJuYWwuQm9vayBoYXMgSXRlcmF0ZUFjY291bnRzKGZuIGZ1bmMoQWNjb3VudCkgYm9vbCksIGFuZCBleHBvcnRpbmcgYQovLyByZWFsbSBlbnRyeXBvaW50IHRoYXQgdGFrZXMgZm4gZnJvbSB0aGUgY2FsbGVyIHdvdWxkIGJlIHRoZSBzaG9ydGVzdCBjb2RlCi8vIGhlcmUgYW5kIGEgc2VjdXJpdHkgZGVmZWN0LiBBIGNhbGxlci1zdXBwbGllZCBjYWxsYmFjayBpcyB0aGUgImNhbGxiYWNrCi8vIHBhcmFtcyIgY2xhc3MsIGFuZCBqb3VybmFsJ3Mgb3duIGRvYyByZWNvcmRzIHRoZSBzaGFycCBlZGdlOiBmbiBydW5zIHVuZGVyCi8vIHRoZSBDQUxMSU5HIFJFQUxNJ1MgU1RPUkFHRSBBVVRIT1JJVFksIGJlY2F1c2UgdGhlIHJlY2VpdmVyIGlzIHN0YW1wZWQgd2l0aAovLyB0aGlzIHJlYWxtJ3MgUGtnSUQgYW5kIGEgdG9wLWxldmVsIGZuIGhhcyBubyBkZWNsYXJpbmcgcmVhbG0gdG8gYW5jaG9yIGl0Ci8vIGVsc2V3aGVyZS4gQSBob3N0aWxlIGZuIHdvdWxkIGV4ZWN1dGUgaG9sZGluZyByL2Jvb2tzJyBvd24gYXV0aG9yaXR5LgovLwovLyBTbyB0aGUgaXRlcmF0b3Igc3RheXMgaW50ZXJuYWwgYW5kIHRoaXMgcmV0dXJucyBWQUxVRVMuIFRoZSBjbG9zdXJlIGJlbG93Ci8vIGlzIHdyaXR0ZW4gYnkgdGhpcyByZWFsbSwgYXBwZW5kcyB0byBhIGxvY2FsIHNsaWNlLCBhbmQgcmUtZW50ZXJzIG5vCi8vIG11dGF0b3Ig4oCUIHdoaWNoIGlzIGV4YWN0bHkgdGhlIGNvbmRpdGlvbiBqb3VybmFsJ3MgZG9jIGF0dGFjaGVzIHRvIGl0LgovLwovLyBDb2RlcyBpcyBhIGZyZWUgcmVhZCBhbmQgTk9UIGEgY3Jvc3NpbmcgZnVuY3Rpb24sIHNvIGFuIG93bmVyIGRvZXMgbm90IHBheQovLyBmb3IgYSBjb25zdW1lcidzIHBhZ2luZy4gVGhlIGNvc3QgY2VpbGluZyBpcyB0aGUgY2hhcnQgY2FwOiB0aGUgdW5kZXJseWluZwovLyBpdGVyYXRvciBoYXMgbm8gc2Vlaywgc28gYGZyb21gIGlzIGhvbm91cmVkIGJ5IHNraXBwaW5nLCBhbmQgb25lIGNhbGwgd2Fsa3MKLy8gdGhlIHdob2xlIGNoYXJ0IGhvd2V2ZXIgc21hbGwgbGltaXQgaXMuIEEgY2FsbGVyIHBhZ2luZyBhIDEyOC1hY2NvdW50IGNoYXJ0Ci8vIDggY29kZXMgYXQgYSB0aW1lIHRoZXJlZm9yZSBkb2VzIDE2IGZ1bGwgd2Fsa3MsIG5vdCBvbmUuIFRoYXQgaXMgYQovLyBkZWxpYmVyYXRlIHRyYWRlIGZvciBub3QgdG91Y2hpbmcgcC9qb3VybmFsLCB3aG9zZSBDb2Rlcy13aXRoLXNlZWsgd291bGQKLy8gaGF2ZSByZS1vcGVuZWQgR2F0ZSBBIGFuZCB0aGUgc2Fib3RhZ2Ugc3dlZXBzIGZvciBhbGwgdGhyZWUgb2YgaXRzCi8vIGltcG9ydGVycy4KZnVuYyBDb2Rlcyhvd25lciBhZGRyZXNzLCBmcm9tIHN0cmluZywgbGltaXQgaW50KSBbXXN0cmluZyB7CgliIDo9IG11c3RCb29rKG93bmVyKQoJaWYgbGltaXQgPD0gMCB7CgkJcmV0dXJuIG5pbAoJfQoJaWYgbGltaXQgPiBNYXhBY2NvdW50c1BlckJvb2sgewoJCWxpbWl0ID0gTWF4QWNjb3VudHNQZXJCb29rCgl9CglvdXQgOj0gbWFrZShbXXN0cmluZywgMCwgbGltaXQpCgliLkl0ZXJhdGVBY2NvdW50cyhmdW5jKGEgam91cm5hbC5BY2NvdW50KSBib29sIHsKCQlpZiBhLkNvZGUgPCBmcm9tIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJCW91dCA9IGFwcGVuZChvdXQsIGEuQ29kZSkKCQlyZXR1cm4gbGVuKG91dCkgPj0gbGltaXQKCX0pCglyZXR1cm4gb3V0Cn0KCi8vIEVudHJ5Q291bnQgaXMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIGFuIG93bmVyJ3Mgam91cm5hbC4KZnVuYyBFbnRyeUNvdW50KG93bmVyIGFkZHJlc3MpIGludCB7IHJldHVybiBtdXN0Qm9vayhvd25lcikuRW50cnlDb3VudCgpIH0KCi8vIEVudHJ5SW5mbyByZXR1cm5zIG9uZSBlbnRyeSdzIGhlYWRlci4gUG9zdGluZ3MgYXJlIHJldHVybmVkIHNlcGFyYXRlbHkgYnkKLy8gRW50cnlMZWdzLCBiZWNhdXNlIGFuIGVudHJ5J3MgbGVnIGNvdW50IGlzIHZhcmlhYmxlIGFuZCBhIGNyb3NzaW5nLWZ1bmN0aW9uCi8vIHJldHVybiBjYW5ub3QgY2FycnkgYSBzbGljZSB1c2VmdWxseS4KZnVuYyBFbnRyeUluZm8ob3duZXIgYWRkcmVzcywgaWQgdWludDY0KSAoYXQgaW50NjQsIG1lbW8gc3RyaW5nLCBsZWdzIGludCwgcmV2ZXJzYWxPZiB1aW50NjQsIHRvdGFsIGludDY0KSB7CgllLCBvayA6PSBtdXN0Qm9vayhvd25lcikuRW50cnkoaWQpCglpZiAhb2sgewoJCXBhbmljKCJib29rczogbm8gZW50cnkgIiArIHN0cmNvbnYuRm9ybWF0VWludChpZCwgMTApKQoJfQoJcmV0dXJuIGUuQXQsIGUuTWVtbywgbGVuKGUuUG9zdGluZ3MpLCBlLlJldmVyc2FsT2YsIGUuVG90YWwoKQp9CgovLyBFbnRyeUxlZ3MgcmV0dXJucyBvbmUgZW50cnkncyBwb3N0aW5ncyBpbiB0aGUgImNvZGU6c2lkZTphbW91bnQsLi4uIiBmb3JtCi8vIFBvc3RNdWx0aSBhY2NlcHRzLCBzbyBhbiBlbnRyeSBjYW4gYmUgcmVhZCBhbmQgcmUtcG9zdGVkIHdpdGhvdXQgYQovLyBzZXBhcmF0ZSBlbmNvZGluZy4KZnVuYyBFbnRyeUxlZ3Mob3duZXIgYWRkcmVzcywgaWQgdWludDY0KSBzdHJpbmcgewoJZSwgb2sgOj0gbXVzdEJvb2sob3duZXIpLkVudHJ5KGlkKQoJaWYgIW9rIHsKCQlwYW5pYygiYm9va3M6IG5vIGVudHJ5ICIgKyBzdHJjb252LkZvcm1hdFVpbnQoaWQsIDEwKSkKCX0KCXZhciBzYiBzdHJpbmdzLkJ1aWxkZXIKCWZvciBpLCBwIDo9IHJhbmdlIGUuUG9zdGluZ3MgewoJCWlmIGkgPiAwIHsKCQkJc2IuV3JpdGVTdHJpbmcoIiwiKQoJCX0KCQlzYi5Xcml0ZVN0cmluZyhwLkFjY291bnQpCgkJaWYgcC5TaWRlID09IGpvdXJuYWwuRGViaXQgewoJCQlzYi5Xcml0ZVN0cmluZygiOkQ6IikKCQl9IGVsc2UgewoJCQlzYi5Xcml0ZVN0cmluZygiOkM6IikKCQl9CgkJc2IuV3JpdGVTdHJpbmcoc3RyY29udi5Gb3JtYXRJbnQocC5BbW91bnQsIDEwKSkKCX0KCXJldHVybiBzYi5TdHJpbmcoKQp9CgovLyBJc1JldmVyc2VkIHJlcG9ydHMgd2hldGhlciBhbiBlbnRyeSBoYXMgYWxyZWFkeSBiZWVuIHJldmVyc2VkLiBBbiBlbnRyeSBtYXkKLy8gYmUgcmV2ZXJzZWQgYXQgbW9zdCBvbmNlLCBzbyB0aGlzIGlzIGFsc28gIm1heSB0aGlzIHN0aWxsIGJlIHJldmVyc2VkIi4KZnVuYyBJc1JldmVyc2VkKG93bmVyIGFkZHJlc3MsIGlkIHVpbnQ2NCkgYm9vbCB7CglyZXR1cm4gbXVzdEJvb2sob3duZXIpLklzUmV2ZXJzZWQoaWQpCn0KCi8vIFRvdGFscyByZXR1cm5zIGFuIG93bmVyJ3MgcnVubmluZyBkZWJpdCBhbmQgY3JlZGl0IHRvdGFscy4KZnVuYyBUb3RhbHMob3duZXIgYWRkcmVzcykgKGRlYml0cywgY3JlZGl0cyBpbnQ2NCkgewoJYiA6PSBtdXN0Qm9vayhvd25lcikKCXJldHVybiBiLlRvdGFsRGViaXRzKCksIGIuVG90YWxDcmVkaXRzKCkKfQoKLy8gSXNCYWxhbmNlZCBpcyB0aGUgQ0hFQVAgaW52YXJpYW50IGFuZCB0aGlzIHJlYWxtJ3MgbGl2ZS12ZXJpZmljYXRpb24gcHJvYmUuCi8vCi8vIEl0IGNvbXBhcmVzIHR3byBpbmRlcGVuZGVudGx5LW1haW50YWluZWQgYWNjdW11bGF0b3JzOiB0aGUgcGVyLWFjY291bnQKLy8gdG90YWxzIHN1bW1lZCBhY3Jvc3MgdGhlIGNoYXJ0LCBhZ2FpbnN0IHRoZSBib29rJ3Mgb3duIHJ1bm5pbmcgdG90YWxzLgovLyBUaGV5IGFyZSB3cml0dGVuIGJ5IGRpZmZlcmVudCBjb2RlIHBhdGhzLCBzbyBhIGRyaWZ0IGJldHdlZW4gdGhlbSBpcyBhIHJlYWwKLy8gZGVmZWN0IGFuZCB0aGlzIGZpbmRzIGl0LgovLwovLyBXaGF0IGl0IGRvZXMgTk9UIGRvIGlzIHJlLXJlYWQgdGhlIGpvdXJuYWwsIHNvIGEgZGVmZWN0IHRoYXQgY29ycnVwdGVkIGJvdGgKLy8gYWNjdW11bGF0b3JzIGlkZW50aWNhbGx5IHdvdWxkIHN1cnZpdmUgaXQuIFRoYXQgaXMgUmVkZXJpdmUncyBqb2IsIGFuZAovLyBSZWRlcml2ZSBpcyBhIGNyb3NzaW5nIGZ1bmN0aW9uIGJlY2F1c2UgdGhlIG93bmVyIHNob3VsZCBwYXkgZm9yIGl0LgovLwovLyBBbmQgdGhlIGNlaWxpbmcgb24gYm90aDogdGhpcyBwcm92ZXMgdGhlIGJvb2sgaXMgc2VsZi1jb25zaXN0ZW50LCBuZXZlcgovLyB0aGF0IGl0cyBlbnRyaWVzIGRlc2NyaWJlIHJlYWwgZXZlbnRzLiBTZWUgdGhlIHBhY2thZ2UgZG9jLgpmdW5jIElzQmFsYW5jZWQob3duZXIgYWRkcmVzcykgYm9vbCB7IHJldHVybiBtdXN0Qm9vayhvd25lcikuSXNCYWxhbmNlZCgpIH0KCi8vIEVxdWF0aW9uIHBhcnRpdGlvbnMgYW4gb3duZXIncyBjaGFydCBCWSBBQ0NPVU5UIEtJTkQ6IHRoZSBzdW1tZWQgcmF3IGRlbHRhCi8vIG9mIGV2ZXJ5IGRlYml0LW5vcm1hbCBhY2NvdW50IChBc3NldCwgRXhwZW5zZSksIHRoZSBzYW1lIGZvciBldmVyeQovLyBjcmVkaXQtbm9ybWFsIG9uZSAoTGlhYmlsaXR5LCBFcXVpdHksIFJldmVudWUpLCBhbmQgd2hldGhlciB0aGUgdHdvIG9mZnNldC4KLy8KLy8gVGhlIHR3byBGSUdVUkVTIGFyZSB3aHkgdGhpcyBleGlzdHMuIFRoZXkgYXJlIHRoZSBiYWxhbmNlLXNoZWV0IGFuZAovLyBpbmNvbWUtc3RhdGVtZW50IHBhcnRpdGlvbiBvZiB0aGUgY2hhcnQsIGFuZCBubyBvdGhlciBhY2Nlc3NvciBvbiB0aGlzCi8vIHJlYWxtIGV4cG9zZXMgaXQg4oCUIFRvdGFscyBzdW1zIGRlYml0cyBhbmQgY3JlZGl0cyB3aXRob3V0IHJlZ2FyZCB0byBraW5kLAovLyBhbmQgQWNjb3VudEluZm8gYW5zd2VycyBvbmUgY29kZSBhdCBhIHRpbWUuCi8vCi8vICMgYG9mZnNldHNgIElTIEEgVkFDVU9VUyBUUlVFIE9OIFRISVMgUkVBTE0g4oCUIGRvIG5vdCBxdW90ZSBpdCBhcyBhIGNoZWNrCi8vCi8vIFJlYWQgdGhpcyBiZWZvcmUgdXNpbmcgdGhlIHRoaXJkIHJlc3VsdCBmb3IgYW55dGhpbmcuCi8vCi8vIFRoZSBraW5kIHBhcnRpdGlvbiBpcyBUT1RBTDogam91cm5hbCdzIEtpbmQgaXMgMS4uNSwgSXNEZWJpdE5vcm1hbCBpcwovLyBgayA9PSBBc3NldCB8fCBrID09IEV4cGVuc2VgLCBzbyBldmVyeSBhY2NvdW50IGxhbmRzIGluIGV4YWN0bHkgb25lIG9mIHRoZQovLyB0d28gc3VtcyBhbmQgbmVpdGhlciBjYW4gb21pdCBvbmUuIFRoZXJlZm9yZQovLwovLwlkZWJpdE5vcm1hbCArIGNyZWRpdE5vcm1hbCAgPT0gIHN1bSBvZiBSYXdEZWx0YSBvdmVyIEFMTCBhY2NvdW50cwovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gIHRvdGFsRGViaXRzIC0gdG90YWxDcmVkaXRzCi8vCi8vIGFuZCB0aGlzIHJlYWxtIHJlZnVzZXMgYW4gZW50cnkgdGhhdCBkb2VzIG5vdCBiYWxhbmNlLCBzbyB0aGF0IGRpZmZlcmVuY2UKLy8gaXMgYWx3YXlzIHplcm8uIGBvZmZzZXRzYCBpcyBjb25zZXF1ZW50bHkgVFJVRSBmb3IgZXZlcnkgYm9vayB0aGlzIHJlYWxtCi8vIGNhbiBwcm9kdWNlLCBhbmQgaXQgaXMgdHJ1ZSBmb3IgYSBjaGFydCB3aG9zZSBhY2NvdW50cyBhcmUgY2xhc3NpZmllZAovLyBub25zZW5zaWNhbGx5IGp1c3QgYXMgcmVhZGlseSBhcyBmb3IgYSBjb3JyZWN0IG9uZS4KLy8KLy8gVGhpcyBpcyB0aGUgYEhhc1ZhbGlkU2lnbmF0dXJlYCBzaGFwZSDCpzdiIGFscmVhZHkgbmFtZXM6IGEgcHJlZGljYXRlIHRoYXQKLy8gaXMgYSBjb25zdGFudCB1bmRlciBjdXJyZW50IGNvbmRpdGlvbnMsIGFuZCBzbyBpcyBldmlkZW5jZSBvZiBub3RoaW5nLiBUaGUKLy8gc3VpdGUgcGlucyB0aGUgdmFjdWl0eSBkZWxpYmVyYXRlbHkgcmF0aGVyIHRoYW4gYXNzZXJ0aW5nIHRydWUgYW5kIHJlYWRpbmcKLy8gZ3JlZW4g4oCUIGEgdGVzdCB0aGF0IGNhbm5vdCBmYWlsIGlzIHRoZSB0aGluZyB0aGF0IG1ha2VzIHRoaXMgZGFuZ2Vyb3VzLgovLwovLyBXaGF0IGBvZmZzZXRzYCBET0VTIHN0aWxsIGRpc3Rpbmd1aXNoIGlzIGFyaXRobWV0aWMgb3ZlcmZsb3csIHdoZXJlIGpvdXJuYWwKLy8gcmV0dXJucyAoMCwgMCwgZmFsc2UpLiBTbyB0aGUgaG9uZXN0IHJlYWRpbmcgaXMgKioidGhlIHR3byBzdW1zIGFyZQovLyB0cnVzdHdvcnRoeSIqKiwgbmV2ZXIgInRoZSBjbGFzc2lmaWNhdGlvbiBpcyByaWdodCIuIEEgY29uc3VtZXIgd2FudGluZyBhCi8vIGdlbnVpbmUgY2xhc3NpZmljYXRpb24gY2hlY2sgbXVzdCBjb21wYXJlIHRoZSBraW5kcyBhZ2FpbnN0IGl0cyBvd24KLy8gZXhwZWN0YXRpb24sIHdoaWNoIGlzIHRoZSBzdGF0ZW1lbnQgY29uc3VtZXIncyBqb2IgYW5kIG5vdCB0aGlzIHJlYWxtJ3MuCi8vCi8vIEJvdGggZmlndXJlcyBhcmUgUkFXIGRlbHRhcyAoZGViaXRzIC0gY3JlZGl0cyksIG5vdCBub3JtYWxpc2VkIGJhbGFuY2VzLCBzbwovLyBhIGRlYml0LW5vcm1hbCB0b3RhbCBpcyBub3JtYWxseSBwb3NpdGl2ZSBhbmQgYSBjcmVkaXQtbm9ybWFsIHRvdGFsIG5vcm1hbGx5Ci8vIG5lZ2F0aXZlLiBBIGNyZWRpdC1ub3JtYWwgYWNjb3VudCBjYXJyeWluZyBhIHBvc2l0aXZlIHJhdyBkZWx0YSBpcyBhIGNvbnRyYQovLyBhY2NvdW50LCB3aGljaCBpcyBsZWdpdGltYXRlLCBhbmQgaXMgd2h5IG5laXRoZXIgZmlndXJlIGlzIGZvcmNlZAovLyBub24tbmVnYXRpdmUuCmZ1bmMgRXF1YXRpb24ob3duZXIgYWRkcmVzcykgKGRlYml0Tm9ybWFsLCBjcmVkaXROb3JtYWwgaW50NjQsIG9mZnNldHMgYm9vbCkgewoJcmV0dXJuIG11c3RCb29rKG93bmVyKS5BY2NvdW50aW5nRXF1YXRpb24oKQp9CgovLyBDbG9zZWRUaHJvdWdoIHJldHVybnMgdGhlIGhlaWdodCBhbiBvd25lcidzIGJvb2sgaXMgc2VhbGVkIHRvLCBhbmQgd2hldGhlcgovLyBpdCBoYXMgZXZlciBiZWVuIGNsb3NlZC4gVGhlIHNlY29uZCByZXN1bHQgbWF0dGVyczogYSBib29rIGNsb3NlZCB0aHJvdWdoCi8vIGhlaWdodCAwIGlzIG5vdCB0aGUgc2FtZSBhcyBhIGJvb2sgdGhhdCBoYXMgbmV2ZXIgYmVlbiBjbG9zZWQuCmZ1bmMgQ2xvc2VkVGhyb3VnaChvd25lciBhZGRyZXNzKSAoaW50NjQsIGJvb2wpIHsKCXJldHVybiBtdXN0Qm9vayhvd25lcikuQ2xvc2VkVGhyb3VnaCgpCn0KCi8vIENhcGFjaXR5IHJldHVybnMgYW4gb3duZXIncyByZW1haW5pbmcgaGVhZHJvb20sIHNvIGEgY29uc3VtZXIgY2FuIHNlZSBhCi8vIGZ1bGwgYm9vayBjb21pbmcgcmF0aGVyIHRoYW4gZGlzY292ZXJpbmcgaXQgb24gYSByZWZ1c2VkIGVudHJ5LgpmdW5jIENhcGFjaXR5KG93bmVyIGFkZHJlc3MpIChhY2NvdW50c0xlZnQsIGVudHJpZXNMZWZ0IGludCkgewoJYiA6PSBtdXN0Qm9vayhvd25lcikKCXJldHVybiBNYXhBY2NvdW50c1BlckJvb2sgLSBiLkFjY291bnRDb3VudCgpLCBNYXhFbnRyaWVzUGVyQm9vayAtIGIuRW50cnlDb3VudCgpCn0KCi8vIEhlaWdodCBpcyB0aGUgY2hhaW4gaGVpZ2h0IHRoaXMgcmVhbG0gZGF0ZXMgZW50cmllcyB3aXRoLiBFeHBvc2VkIHNvIGEKLy8gY2FsbGVyIGNhbiBwcmVkaWN0IHdoYXQgQ2xvc2VUaHJvdWdoIHdpbGwgc2VhbC4KZnVuYyBIZWlnaHQoKSBpbnQ2NCB7IHJldHVybiBydW50aW1lLkNoYWluSGVpZ2h0KCkgfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFJlbmRlcgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIFJlbmRlciBzZXJ2ZXMgdGhlIGluZGV4IGF0ICIiIGFuZCBvbmUgb3duZXIncyBib29rIGF0ICI8YWRkcmVzcz4iLgovLwovLyBFdmVyeSBjYWxsZXItc3VwcGxpZWQgc3RyaW5nIOKAlCBhY2NvdW50IG5hbWVzIGFuZCBlbnRyeSBtZW1vcyDigJQgZ29lcyB0aHJvdWdoCi8vIHRoZSBlY29zeXN0ZW0gc2FuaXRpemVyLiBGcmVlIHRleHQgcmVhY2hpbmcgUmVuZGVyIHVuZXNjYXBlZCBpcyB0aGUgb25lCi8vIGluamVjdGlvbi1zaGFwZWQgc3VyZmFjZSBhIHJlYWxtIHdpdGggbm8gY3VzdG9keSBzdGlsbCBoYXMuCmZ1bmMgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJcCA6PSBzdHJpbmdzLlRyaW1TcGFjZShzdHJpbmdzLlRyaW0ocGF0aCwgIi8iKSkKCWlmIHAgPT0gIiIgewoJCXJldHVybiByZW5kZXJJbmRleCgpCgl9CglyZXR1cm4gcmVuZGVyQm9vayhhZGRyZXNzKHApKQp9CgpmdW5jIHJlbmRlckluZGV4KCkgc3RyaW5nIHsKCXZhciBzYiBzdHJpbmdzLkJ1aWxkZXIKCXNiLldyaXRlU3RyaW5nKCIjIGJvb2tzIOKAlCBhIHBlci1vd25lciBnZW5lcmFsIGxlZGdlclxuXG4iKQoJc2IuV3JpdGVTdHJpbmcoIkRvdWJsZS1lbnRyeSBib29rcy4gQXBwZW5kLW9ubHksIGNvcnJlY3RlZCBieSByZXZlcnNhbCwgIikKCXNiLldyaXRlU3RyaW5nKCJhbmQgKipubyBjdXN0b2R5IG9mIGFueSBhc3NldCoqLlxuXG4iKQoKCXNiLldyaXRlU3RyaW5nKCI+IEEgYm9vayBpcyBhIHNldCBvZiBjbGFpbXMgYnkgaXRzIG93bmVyLiBXaXRoIG5vIGN1c3RvZHkgIikKCXNiLldyaXRlU3RyaW5nKCJ0aGVyZSBpcyBubyBzb2x2ZW5jeSBpbnZhcmlhbnQgdHlpbmcgYSBiYWxhbmNlIHRvIGEgcmVhbCAiKQoJc2IuV3JpdGVTdHJpbmcoImhvbGRpbmcg4oCUIGEgYm9vayBjYW4gYmUgaW50ZXJuYWxseSBwZXJmZWN0IGFuZCBkZXNjcmliZSAiKQoJc2IuV3JpdGVTdHJpbmcoIm5vdGhpbmcuIFRoZSBpbnZhcmlhbnRzIGhlcmUgcHJvdmUgYXJpdGhtZXRpYywgbm90IHRydXRoLlxuXG4iKQoKCXNiLldyaXRlU3RyaW5nKCIjIyBTdGF0ZVxuXG4iKQoJc2IuV3JpdGVTdHJpbmcoIi0gYm9va3Mgb3BlbmVkOiAqKiIgKyBzdHJjb252Lkl0b2EoYm9va0NvdW50KSArICIqKlxuIikKCXNiLldyaXRlU3RyaW5nKCItIGNoYWluIGhlaWdodDogKioiICsgc3RyY29udi5Gb3JtYXRJbnQocnVudGltZS5DaGFpbkhlaWdodCgpLCAxMCkgKyAiKipcblxuIikKCXNiLldyaXRlU3RyaW5nKCJUaGVyZSBpcyBkZWxpYmVyYXRlbHkgbm8gd2F5IHRvIGVudW1lcmF0ZSBib29rcyBvciB0byAiKQoJc2IuV3JpdGVTdHJpbmcoImFnZ3JlZ2F0ZSBhY3Jvc3MgdGhlbTogc3VjaCBhIHRvdGFsIHdvdWxkIGJlIHRoZSBzdW0gb2YgIikKCXNiLldyaXRlU3RyaW5nKCJldmVyeSBzdHJhbmdlcidzIHNlbGYtcmVwb3J0ZWQgYXNzZXJ0aW9uLlxuXG4iKQoKCXNiLldyaXRlU3RyaW5nKCIjIyBUaGUgY2hhcnQtb2YtYWNjb3VudHMgY29udmVudGlvblxuXG4iKQoJc2IuV3JpdGVTdHJpbmcoIkFuIGFjY291bnQncyAqKmNvZGUgZGV0ZXJtaW5lcyBpdHMga2luZCoqIOKAlCB0aGVyZSBpcyBubyBraW5kICIpCglzYi5Xcml0ZVN0cmluZygicGFyYW1ldGVyOlxuXG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgY29kZSB8IGtpbmQgfCBub3JtYWwgYmFsYW5jZSB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwtLS18LS0tfC0tLXxcbiIpCglzYi5Xcml0ZVN0cmluZygifCBgMXh4eGAgfCBhc3NldCB8IGRlYml0IHxcbiIpCglzYi5Xcml0ZVN0cmluZygifCBgMnh4eGAgfCBsaWFiaWxpdHkgfCBjcmVkaXQgfFxuIikKCXNiLldyaXRlU3RyaW5nKCJ8IGAzeHh4YCB8IGVxdWl0eSB8IGNyZWRpdCB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgYDR4eHhgIHwgcmV2ZW51ZSB8IGNyZWRpdCB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgYDV4eHhgIHwgZXhwZW5zZSB8IGRlYml0IHxcblxuIikKCglzYi5Xcml0ZVN0cmluZygiIyMgQ2FwcywgcGVyIG93bmVyXG5cbiIpCglzYi5Xcml0ZVN0cmluZygifCBib3VuZCB8IHZhbHVlIHxcbnwtLS18LS0tfFxuIikKCXNiLldyaXRlU3RyaW5nKCJ8IGFjY291bnRzIHBlciBib29rIHwgIiArIHN0cmNvbnYuSXRvYShNYXhBY2NvdW50c1BlckJvb2spICsgIiB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgZW50cmllcyBwZXIgYm9vayB8ICIgKyBzdHJjb252Lkl0b2EoTWF4RW50cmllc1BlckJvb2spICsgIiB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgbGVncyBwZXIgZW50cnkgfCAiICsgc3RyY29udi5JdG9hKE1heExlZ3NQZXJFbnRyeSkgKyAiIHxcblxuIikKCglzYi5Xcml0ZVN0cmluZygiIyMgVXNhZ2VcblxuIikKCXNiLldyaXRlU3RyaW5nKCJgYGBcbk9wZW5Cb29rKClcbk9wZW5BY2NvdW50KFwiMTAwMFwiLCBcIkNhc2hcIilcbiIpCglzYi5Xcml0ZVN0cmluZygiT3BlbkFjY291bnQoXCI0MDAwXCIsIFwiU2FsZXNcIilcbiIpCglzYi5Xcml0ZVN0cmluZygiUG9zdFNpbXBsZShcIjEwMDBcIiwgXCI0MDAwXCIsIDUwMDAsIFwiaW52b2ljZSAxNyBzZXR0bGVkXCIpXG4iKQoJc2IuV3JpdGVTdHJpbmcoIlBvc3RNdWx0aShcIjEwMDA6RDo1MDAsNDAwMDpDOjMwMCw0MTAwOkM6MjAwXCIsIFwic3BsaXQgc2FsZVwiKVxuYGBgXG5cbiIpCglzYi5Xcml0ZVN0cmluZygiVmlldyBhIGJvb2sgYXQgYCIgKyBSZWFsbVBhdGggKyAiOjxhZGRyZXNzPmAuXG4iKQoJcmV0dXJuIHNiLlN0cmluZygpCn0KCi8vIGNlbGwgcHJlcGFyZXMgY2FsbGVyLXN1cHBsaWVkIHRleHQgZm9yIGEgR0ZNIHRhYmxlIGNlbGwsIHRydW5jYXRpbmcgaXQgZm9yCi8vIGRpc3BsYXkgZmlyc3QuIEl0IGlzIHRoZSBgaW52b2ljZXNgIGhlbHBlciBvZiB0aGUgc2FtZSBuYW1lLCBhZG9wdGVkIHZlcmJhdGltCi8vIHJhdGhlciB0aGFuIHJlLWRlcml2ZWQsIGJlY2F1c2UgdGhlIHR3byByZWFsbXMgZmFjZSB0aGUgaWRlbnRpY2FsIHNsb3QuCi8vCi8vIFRhYmxlQ2VsbCByYXRoZXIgdGhhbiBJbmxpbmVUZXh0LCBhbmQgdGhlIFNMT1QgaXMgdGhlIHJlYXNvbjogdGhlc2UgYnl0ZXMKLy8gbGFuZCBiZXR3ZWVuIHR3byBgfGAgZGVsaW1pdGVycywgYW5kIGFuIHVuZXNjYXBlZCBgfGAgb3BlbnMgYSBuZXcgY29sdW1uIGFuZAovLyBzaGlmdHMgZXZlcnkgY29sdW1uIHRvIGl0cyByaWdodC4gSW5saW5lVGV4dCBkb2VzIG5vdCBlc2NhcGUgdGhlIHBpcGUg4oCUCi8vIGRlbGliZXJhdGVseSwgcGVyIHRoZSBzYW5pdGl6ZXIncyBvd24gZG9jLCBzbyB0aGF0IFRhYmxlQ2VsbCBjYW4gZXNjYXBlIGl0Ci8vIHdpdGhvdXQgZG91YmxlLWVzY2FwaW5nLiBNZWFzdXJlZCBvbiBvbnl4LTEgd2l0aCBjaGFpbl9pZF9ib3VuZDogdHJ1ZToKLy8KLy8JSW5saW5lVGV4dCgiQ2FzaCB8ICoqZm9yZ2VkKiogfCB4IikgLT4gYENhc2ggfCBcKlwqZm9yZ2VkXCpcKiB8IHhgICAgcGlwZXMgTElWRQovLwlUYWJsZUNlbGwgKCJDYXNoIHwgKipmb3JnZWQqKiB8IHgiKSAtPiBgQ2FzaCBcfCBcKlwqZm9yZ2VkXCpcKiBcfCB4YCAgZXNjYXBlZAovLwovLyBUaGlzIHJlYWxtIHNoaXBwZWQgSW5saW5lVGV4dCBoZXJlIGZpcnN0IGFuZCBhbiBhZHZlcnNhcmlhbCBhdWRpdCBmb3VuZCBpdC4KLy8gQW4gb3duZXIgY291bGQgZm9yZ2UgY29sdW1ucyBpbiB0aGVpciBvd24gYm9vaydzIGNoYXJ0IG9yIGpvdXJuYWwg4oCUIGFuZCB0aGUKLy8gdmljdGltIGlzIGEgVEhJUkQgUEFSVFkgcmVhZGluZyB0aGF0IGJvb2ssIHdoaWNoIGF0dGFja3MgdGhlIG9uZSB0aGluZyB0aGlzCi8vIHJlYWxtIGV4aXN0cyB0byBwcm92aWRlLiBUaGUgYWNjb3VudCBDT0RFIG5lZWRzIHRoaXMgYXMgbXVjaCBhcyB0aGUgbmFtZQovLyBkb2VzOiBhIEdGTSByb3cgaXMgc3BsaXQgYmVmb3JlIGlubGluZSBwYXJzaW5nIHJ1bnMsIHNvIGEgYHxgIGluc2lkZSB0aGUKLy8gYmFja3RpY2sgc3BhbiBhdCB0aGUgY29kZSBjb2x1bW4gaXMgbm90IHByb3RlY3RlZCBieSB0aGUgYmFja3RpY2tzLCBhbmQKLy8ga2luZEZyb21Db2RlIGNvbnN0cmFpbnMgb25seSBjb2RlWzBdLgovLwovLyBBcHBsaWVkIHRvIGNhbGxlci1zdXBwbGllZCB0ZXh0IG9ubHkuIGBLaW5kLlN0cmluZygpYCBhbmQgdGhlIGBub3RlYCBjb2x1bW4KLy8gYXJlIHJlYWxtLWNvbnN0cnVjdGVkIGZyb20gYW4gZW51bSBhbmQgYSB1aW50NjQsIHNvIHNhbml0aXppbmcgdGhlbSB3b3VsZCBiZQovLyBub2lzZSByYXRoZXIgdGhhbiBzbG90LW1hdGNoaW5nIOKAlCB1bmxpa2UgYGludm9pY2VzYCwgd2hpY2ggcGFzc2VzIGEgYmVjaDMyCi8vIGFkZHJlc3MgdGhyb3VnaCB0aGlzIGhlbHBlciBwcmVjaXNlbHkgYmVjYXVzZSB0aGF0IHZhbHVlIElTIGNhbGxlci1kZXJpdmVkLgovLwovLyBUUlVOQ0FURSBCRUZPUkUgRVNDQVBJTkcsIGFuZCBvbiBhIFJVTkUgYm91bmRhcnkuIEVzY2FwaW5nIGZpcnN0IGFuZCBjdXR0aW5nCi8vIGFmdGVyd2FyZHMgY2FuIHNsaWNlIGEgYFx8YCBpbiBoYWxmIGFuZCBsZWF2ZSB0aGUgY2VsbCBlbmRpbmcgaW4gYSBiYXJlCi8vIGJhY2tzbGFzaDsgY3V0dGluZyBvbiBhIGJ5dGUgYm91bmRhcnkgY2FuIHNwbGl0IGEgbXVsdGktYnl0ZSBydW5lIGFuZCBlbWl0Ci8vIGludmFsaWQgVVRGLTguIEJ5IHRoZSB0aW1lIHRoZSBzYW5pdGl6ZXIgc2VlcyB0aGUgc3RyaW5nIHRoZSBkYW1hZ2UgaXMKLy8gdXBzdHJlYW0gb2YgaXQsIHNvIG5laXRoZXIgaXMgc29tZXRoaW5nIGl0IGlzIGFza2VkIHRvIHJlcGFpci4KZnVuYyBjZWxsKHMgc3RyaW5nKSBzdHJpbmcgewoJY29uc3QgbWF4UnVuZXMgPSA0OAoJaWYgciA6PSBbXXJ1bmUocyk7IGxlbihyKSA+IG1heFJ1bmVzIHsKCQlzID0gc3RyaW5nKHJbOm1heFJ1bmVzXSkgKyAi4oCmIgoJfQoJcmV0dXJuIHNhbml0aXplLlRhYmxlQ2VsbChzKQp9CgpmdW5jIHJlbmRlckJvb2sob3duZXIgYWRkcmVzcykgc3RyaW5nIHsKCWIsIG9rIDo9IGJvb2sob3duZXIpCglpZiAhb2sgewoJCXJldHVybiAiIyBib29rc1xuXG5ObyBib29rIGZvciBgIiArCgkJCXNhbml0aXplLklubGluZVRleHQob3duZXIuU3RyaW5nKCkpICsgImAuXG4iCgl9CgoJdmFyIHNiIHN0cmluZ3MuQnVpbGRlcgoJc2IuV3JpdGVTdHJpbmcoIiMgQm9vayBvZiAiICsgc2FuaXRpemUuSW5saW5lVGV4dChvd25lci5TdHJpbmcoKSkgKyAiXG5cbiIpCgoJLy8gSW52YXJpYW50IGZpcnN0LCB3aXRoIGl0cyBjZWlsaW5nIHN0YXRlZCBiZXNpZGUgaXQgcmF0aGVyIHRoYW4gYmVsb3cuCglpZiBiLklzQmFsYW5jZWQoKSB7CgkJc2IuV3JpdGVTdHJpbmcoIioqSXNCYWxhbmNlZDogdHJ1ZSoqIOKAlCB0aGUgcGVyLWFjY291bnQgdG90YWxzIGFncmVlICIpCgkJc2IuV3JpdGVTdHJpbmcoIndpdGggdGhlIHJ1bm5pbmcgdG90YWxzLiBUaGlzIGlzIGFyaXRobWV0aWMgIikKCQlzYi5Xcml0ZVN0cmluZygic2VsZi1jb25zaXN0ZW5jeSBhbmQgc2F5cyBub3RoaW5nIGFib3V0IHdoZXRoZXIgdGhlICIpCgkJc2IuV3JpdGVTdHJpbmcoImVudHJpZXMgZGVzY3JpYmUgcmVhbCBldmVudHMuXG5cbiIpCgl9IGVsc2UgewoJCXNiLldyaXRlU3RyaW5nKCIqKklzQmFsYW5jZWQ6IEZBTFNFKiog4oCUIHRoZSBhY2N1bXVsYXRvcnMgaGF2ZSBkcmlmdGVkLiAiKQoJCXNiLldyaXRlU3RyaW5nKCJUaGlzIGlzIGEgZGVmZWN0OyBkbyBub3QgcmVseSBvbiBhbnkgZmlndXJlIGJlbG93LlxuXG4iKQoJfQoKCWQsIGMgOj0gYi5Ub3RhbERlYml0cygpLCBiLlRvdGFsQ3JlZGl0cygpCglzYi5Xcml0ZVN0cmluZygifCB8IHxcbnwtLS18LS0tfFxuIikKCXNiLldyaXRlU3RyaW5nKCJ8IHRvdGFsIGRlYml0cyB8ICIgKyBzdHJjb252LkZvcm1hdEludChkLCAxMCkgKyAiIHxcbiIpCglzYi5Xcml0ZVN0cmluZygifCB0b3RhbCBjcmVkaXRzIHwgIiArIHN0cmNvbnYuRm9ybWF0SW50KGMsIDEwKSArICIgfFxuIikKCXNiLldyaXRlU3RyaW5nKCJ8IGFjY291bnRzIHwgIiArIHN0cmNvbnYuSXRvYShiLkFjY291bnRDb3VudCgpKSArICIgLyAiICsKCQlzdHJjb252Lkl0b2EoTWF4QWNjb3VudHNQZXJCb29rKSArICIgfFxuIikKCXNiLldyaXRlU3RyaW5nKCJ8IGVudHJpZXMgfCAiICsgc3RyY29udi5JdG9hKGIuRW50cnlDb3VudCgpKSArICIgLyAiICsKCQlzdHJjb252Lkl0b2EoTWF4RW50cmllc1BlckJvb2spICsgIiB8XG4iKQoJaWYgdGhyb3VnaCwgaGFzIDo9IGIuQ2xvc2VkVGhyb3VnaCgpOyBoYXMgewoJCXNiLldyaXRlU3RyaW5nKCJ8IGNsb3NlZCB0aHJvdWdoIHwgaGVpZ2h0ICIgKwoJCQlzdHJjb252LkZvcm1hdEludCh0aHJvdWdoLCAxMCkgKyAiIHxcbiIpCgl9IGVsc2UgewoJCXNiLldyaXRlU3RyaW5nKCJ8IGNsb3NlZCB0aHJvdWdoIHwgbmV2ZXIgY2xvc2VkIHxcbiIpCgl9CglzYi5Xcml0ZVN0cmluZygiXG4iKQoKCS8vIENoYXJ0IG9mIGFjY291bnRzLCBpbiBhc2NlbmRpbmcgY29kZSBvcmRlciDigJQgYXZsLCBzbyBkZXRlcm1pbmlzdGljLgoJc2IuV3JpdGVTdHJpbmcoIiMjIENoYXJ0IG9mIGFjY291bnRzXG5cbiIpCglpZiBiLkFjY291bnRDb3VudCgpID09IDAgewoJCXNiLldyaXRlU3RyaW5nKCJfTm8gYWNjb3VudHMgeWV0Ll9cblxuIikKCX0gZWxzZSB7CgkJc2IuV3JpdGVTdHJpbmcoInwgY29kZSB8IG5hbWUgfCBraW5kIHwgZGViaXRzIHwgY3JlZGl0cyB8IGJhbGFuY2UgfFxuIikKCQlzYi5Xcml0ZVN0cmluZygifC0tLXwtLS18LS0tfC0tLXwtLS18LS0tfFxuIikKCQliLkl0ZXJhdGVBY2NvdW50cyhmdW5jKGEgam91cm5hbC5BY2NvdW50KSBib29sIHsKCQkJc2IuV3JpdGVTdHJpbmcoInwgYCIgKyBjZWxsKGEuQ29kZSkgKyAiYCB8ICIgKwoJCQkJY2VsbChhLk5hbWUpICsgIiB8ICIgKyBhLktpbmQuU3RyaW5nKCkgKyAiIHwgIiArCgkJCQlzdHJjb252LkZvcm1hdEludChhLkRlYml0cywgMTApICsgIiB8ICIgKwoJCQkJc3RyY29udi5Gb3JtYXRJbnQoYS5DcmVkaXRzLCAxMCkgKyAiIHwgIiArCgkJCQlzdHJjb252LkZvcm1hdEludChhLkJhbGFuY2UoKSwgMTApICsgIiB8XG4iKQoJCQlyZXR1cm4gZmFsc2UKCQl9KQoJCXNiLldyaXRlU3RyaW5nKCJcbkJhbGFuY2VzIGFyZSBpbiBlYWNoIGFjY291bnQncyAqKm5vcm1hbCBkaXJlY3Rpb24qKi5cblxuIikKCX0KCgkvLyBUaGUgbW9zdCByZWNlbnQgZW50cmllcywgbmV3ZXN0IGZpcnN0LCBib3VuZGVkLgoJc2IuV3JpdGVTdHJpbmcoIiMjIEpvdXJuYWxcblxuIikKCXRvdGFsIDo9IGIuRW50cnlDb3VudCgpCglpZiB0b3RhbCA9PSAwIHsKCQlzYi5Xcml0ZVN0cmluZygiX05vIGVudHJpZXMgeWV0Ll9cbiIpCgkJcmV0dXJuIHNiLlN0cmluZygpCgl9CglzaG93biA6PSB0b3RhbAoJaWYgc2hvd24gPiBSZW5kZXJFbnRyeUxpbWl0IHsKCQlzaG93biA9IFJlbmRlckVudHJ5TGltaXQKCX0KCS8vIEVudHJpZXMgYXJlIGlkcyAxLi5uZXh0SUQtMSBhbmQgbm9uZSBhcmUgZXZlciByZW1vdmVkLCBzbyB0aGUgbmV3ZXN0CgkvLyBgc2hvd25gIG9mIHRoZW0gc3RhcnQgYXQgdG90YWwtc2hvd24rMS4KCWZyb20gOj0gdWludDY0KHRvdGFsLXNob3duKSArIDEKCXJlY2VudCA6PSBiLkVudHJpZXMoZnJvbSwgc2hvd24pCgoJc2IuV3JpdGVTdHJpbmcoInwgaWQgfCBoZWlnaHQgfCBtZW1vIHwgbGVncyB8IHRvdGFsIHwgbm90ZSB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwtLS18LS0tfC0tLXwtLS18LS0tfC0tLXxcbiIpCglmb3IgaSA6PSBsZW4ocmVjZW50KSAtIDE7IGkgPj0gMDsgaS0tIHsKCQllIDo9IHJlY2VudFtpXQoJCW5vdGUgOj0gIiIKCQlpZiBlLklzUmV2ZXJzYWwoKSB7CgkJCW5vdGUgPSAicmV2ZXJzZXMgIyIgKyBzdHJjb252LkZvcm1hdFVpbnQoZS5SZXZlcnNhbE9mLCAxMCkKCQl9IGVsc2UgaWYgYi5Jc1JldmVyc2VkKGUuSUQpIHsKCQkJbm90ZSA9ICJyZXZlcnNlZCIKCQl9CgkJbWVtbyA6PSBjZWxsKGUuTWVtbykKCQlpZiBtZW1vID09ICIiIHsKCQkJbWVtbyA9ICJfbm9uZV8iCgkJfQoJCXNiLldyaXRlU3RyaW5nKCJ8ICIgKyBzdHJjb252LkZvcm1hdFVpbnQoZS5JRCwgMTApICsgIiB8ICIgKwoJCQlzdHJjb252LkZvcm1hdEludChlLkF0LCAxMCkgKyAiIHwgIiArIG1lbW8gKyAiIHwgIiArCgkJCXN0cmNvbnYuSXRvYShsZW4oZS5Qb3N0aW5ncykpICsgIiB8ICIgKwoJCQlzdHJjb252LkZvcm1hdEludChlLlRvdGFsKCksIDEwKSArICIgfCAiICsgbm90ZSArICIgfFxuIikKCX0KCWlmIHRvdGFsID4gc2hvd24gewoJCXNiLldyaXRlU3RyaW5nKCJcbl9TaG93aW5nIHRoZSAiICsgc3RyY29udi5JdG9hKHNob3duKSArICIgbW9zdCByZWNlbnQgb2YgIiArCgkJCXN0cmNvbnYuSXRvYSh0b3RhbCkgKyAiIGVudHJpZXMuX1xuIikKCX0KCXNiLldyaXRlU3RyaW5nKCJcbkVudHJpZXMgYXJlIGFwcGVuZC1vbmx5LiBBIHdyb25nIGVudHJ5IGlzIGNvcnJlY3RlZCBieSAiKQoJc2IuV3JpdGVTdHJpbmcoInBvc3RpbmcgaXRzIHJldmVyc2FsLCB3aGljaCBsZWF2ZXMgYm90aCByZWFkYWJsZS5cbiIpCglyZXR1cm4gc2IuU3RyaW5nKCkKfQoaYAoLZ25vbW9kLnRvbWwSUW1vZHVsZSA9ICJnbm8ubGFuZC9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvYm9va3MiCmdubyA9ICIwLjkiCiINMTAwMDAwMDB1Z25vdBISCPC/k04SCzE2Mzg5OHVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAhb0MXbJJXjONC6Z4m+tKff+fEbtcENW/6uTFX9iuw6YEkBmAM11CtY8d/nJkmvJEEP0lzXz2EpyWuCx1IC1tYBpWl1Ok03h3Sqe/DgycDrxWDixgGGJJ4o4nAO1917Lz9LpGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl"
  }
}