{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "fTrNVlvkAnAOh7w71S+AQ9jpFTi+7d4tp028Lig2Hjc=",
    "height": "571780",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": null,
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "60398028",
      "GasUsed": "40265352"
    },
    "tx": "CoHpAQoML3ZtLm1fYWRkcGtnEu/oAQooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxKy6AEKCXNwZW5kYm9vaxJAZ25vLmxhbmQvcC9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL3NwZW5kYm9vay92MhpnCgtnbm9tb2QudG9tbBJYbW9kdWxlID0gImduby5sYW5kL3AvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9zcGVuZGJvb2svdjIiCmdubyA9ICIwLjkiChr45gEKDXNwZW5kYm9vay5nbm8S5eYBLy8gUGFja2FnZSBzcGVuZGJvb2sgaXMgYSBwdXJlIGFsbG93YW5jZSBwcmltaXRpdmUgZm9yIHJlYWxtcyB0aGF0IG5lZWQgdG8KLy8gbGV0IG9uZSBwYXJ0eSBzcGVuZCBhbm90aGVyIHBhcnR5J3MgZnVuZHMsIHVwIHRvIGEgYm91bmRlZCBhbW91bnQsIG92ZXIKLy8gbWFueSB0cmFuc2FjdGlvbnMuIEl0IGlzIHRvICpkZWxlZ2F0ZWQgc3BlbmRpbmcqIHdoYXQgZHVlYm9vayBpcyB0bwovLyAqdGltZSo6IGl0IGhvbGRzIG5vIGNvaW5zLCBwZXJmb3JtcyBubyBlZmZlY3RzLCBpbXBvcnRzIG5vIGNoYWluIEFQSXMsCi8vIGFuZCBvd25zIG5vIHBhY2thZ2UtbGV2ZWwgc3RhdGUuIFRoZSBpbXBvcnRpbmcgcmVhbG0gb3ducyBhICpCb29rLAovLyBzdXBwbGllcyB0aGUgY2xvY2ssIGFuZCBwZXJmb3JtcyBpdHMgb3duIGVmZmVjdHMuCi8vCi8vICMgV2h5IHYyIGV4aXN0cwovLwovLyB2MSBvZiB0aGlzIHBhY2thZ2UgaXMgZGVwbG95ZWQgYW5kIGltbXV0YWJsZS4gSXRzIEFQSSBpcyB1bmNoYW5nZWQgaGVyZTsKLy8gT05FIG1ldGhvZCBib2R5IGRpZmZlcnMsIGFuZCBpdCBpcyBhIGNvcnJlY3RuZXNzIGZpeDoKLy8KLy8JdjE6ICBmdW5jIChhIEFsbG93YW5jZSkgSXNFeHBpcmVkKG5vdyBpbnQ2NCkgYm9vbCB7Ci8vCSAgICAgICAgIHJldHVybiBhLlRlcm1zLkV4cGlyZXNBdCAhPSAwICYmIG5vdyA+PSBhLlRlcm1zLkV4cGlyZXNBdAovLwkgICAgIH0KLy8KLy8gYS5UZXJtcyBpcyB0aGUgTEFTVC1XUklUVEVOIHJlY29yZCwgbm90IHRoZSB0ZXJtcyBpbiBmb3JjZS4gRXZlcnkgb3RoZXIKLy8gbGl2ZSBxdWVzdGlvbiBpbiB0aGlzIHBhY2thZ2UgaXMgcm91dGVkIHRocm91Z2ggYXQoKSwgd2hpY2ggcmVzb2x2ZXMgYQovLyBwZW5kaW5nIGFtZW5kbWVudCBhdCB0aGUgd2luZG93IGJvdW5kYXJ5IGl0IGlzIGR1ZSBhdDsgSXNFeHBpcmVkIHdhcyB0aGUKLy8gb25lIGV4cG9ydGVkIHByZWRpY2F0ZSB0aGF0IHJlYWQgdGhlIHN0b3JlZCBmaWVsZCBpbnN0ZWFkLiBCZWNhdXNlIGFuCi8vIGFtZW5kbWVudCB0aGF0IG1vdmVzIEV4cGlyZXNBdCBpbiB0aGUgTE9PU0VSIGRpcmVjdGlvbiBjYW4gb25seSBldmVyIGJlCi8vIFFVRVVFRCAtLSB0aWdodGVyT3JFcXVhbFRvIHJlZnVzZXMgYm90aCAicHVzaCB0aGUgZXhwaXJ5IG91dCIgYW5kICJyZW1vdmUKLy8gdGhlIGV4cGlyeSIgYXMgaW1tZWRpYXRlIC0tIHF1ZXVlaW5nIGlzIHRoZSBvbmx5IHBhdGggc3VjaCBhbiBhbWVuZG1lbnQKLy8gaGFzLCBzbyB0aGUgc3RhbGUgcmVhZCB3YXMgb24gdGhhdCBwYXRoIGV2ZXJ5IHRpbWUuCi8vCi8vIFRoZSBjb25zZXF1ZW5jZSBpcyBub3Qgb25lIGJ1ZyBidXQgdHdvLCBwb2ludGluZyBvcHBvc2l0ZSB3YXlzLCBhbmQgdGhlCi8vIHNlY29uZCBpcyB0aGUgZGFuZ2Vyb3VzIG9uZToKLy8KLy8gICAtIFVOREVSLWF1dGhvcml6YXRpb24uIEFuIG93bmVyIGV4dGVuZHMgdGhlIGV4cGlyeS4gVGhlIGFtZW5kbWVudCBpcwovLyAgICAgYWNjZXB0ZWQgYW5kIHF1ZXVlZCwgdGhlIGJvdW5kYXJ5IGFycml2ZXMsIGF0KCkgcHV0cyB0aGUgbmV3IGV4cGlyeSBpbgovLyAgICAgZm9yY2UgLS0gYW5kIElzRXhwaXJlZCBzdGlsbCBhbnN3ZXJzIGZyb20gdGhlIG9sZCBvbmUuIEF0IHRoZSBPTEQKLy8gICAgIGV4cGlyeTogUmVtYWluaW5nIHJlcG9ydHMgMCwgU3BlbmQgcmV0dXJucyBFcnJFeHBpcmVkLCBhbmQgUmVhcCwgd2hpY2gKLy8gICAgIGlzIFBFUk1JU1NJT05MRVNTLCBsZXRzIGFueSB0aGlyZCBwYXJ0eSBkZWxldGUgYW4gYWxsb3dhbmNlIHRoZSBvd25lcgovLyAgICAgaGFkIGp1c3QgZXh0ZW5kZWQuIFRoZSBvd25lcidzIGFjY2VwdGVkIGFtZW5kbWVudCBpcyBzaWxlbnRseQovLyAgICAgZGlzY2FyZGVkLCB3aGljaCB0aGUgdjEgZG9jIGNhbGxzICJ0aGUgZmFpbHVyZSBtb2RlIHRoaXMgcGFja2FnZSBpcwovLyAgICAgbGVhc3QgYWJsZSB0byBleHBsYWluIGFmdGVyIHRoZSBmYWN0IiAtLSBhYm91dCBhIGRpZmZlcmVudCBjYXNlLCBpbgovLyAgICAgQW1lbmQsIGZvdXIgbGluZXMgZnJvbSB0aGUgZ3VhcmQgdGhhdCBkb2VzIG5vdCBjb3ZlciB0aGlzIG9uZS4KLy8KLy8gICAtIE9WRVItYXV0aG9yaXphdGlvbi4gQW4gYW1lbmRtZW50IG1heSBiZSBsb29zZXIgaW4gUGVyUGVyaW9kIGFuZAovLyAgICAgVElHSFRFUiBpbiBFeHBpcmVzQXQ7IHRpZ2h0ZXJPckVxdWFsVG8gaXMgd2Vha2x5LXRpZ2h0ZXIgaW4gRVZFUlkKLy8gICAgIGRpbWVuc2lvbiwgc28gdGhhdCBtaXggcXVldWVzIGFzIGEgd2hvbGUuIFBhc3QgdGhlIGJvdW5kYXJ5LCBhdCgpCi8vICAgICBoYW5kcyBTcGVuZCB0aGUgbmV3IFBlclBlcmlvZCB3aGlsZSBJc0V4cGlyZWQgcmVwb3J0cyB0aGUgYWxsb3dhbmNlCi8vICAgICBhbGl2ZSBvbiB0aGUgT0xELCBsYXRlciBleHBpcnkuIFRoZSBzcGVuZGVyIGRyYXdzIC0tIGF0IHRoZSByYWlzZWQgY2FwCi8vICAgICAtLSBwYXN0IGFuIGV4cGlyeSB0aGUgb3duZXIgdGhlbXNlbHZlcyBzZXQuIE5vIGJvdW5kIGluIHRoaXMgcGFja2FnZQovLyAgICAgc3RvcHMgaXQsIGJlY2F1c2UgdGhlIGJvdW5kIHdhcyBtb3ZlZCBhbmQgdGhlIGdhdGUgd2FzIG5vdCB0b2xkLgovLwovLyBCb3RoIGFyZSByZXBhaXJlZCBieSByZXNvbHZpbmcgdGhlIGV4cGlyeSB0aHJvdWdoIGF0KCkuIE5laXRoZXIgY291bGQgYmUKLy8gcmVwYWlyZWQgaW4gdjE6IGEgL3AvIGlzIGltbXV0YWJsZSBhZnRlciBhZGRwa2csIGFuZCB2MSdzIHR3byBsaXZlCi8vIGNvbnN1bWVycyBhcmUgdGhlbXNlbHZlcyBpbW11dGFibGUgcmVhbG1zIHdpdGggdjEncyBieXRlcyBjb21waWxlZCBpbnRvCi8vIGV2ZXJ5IHBhdGggdGhleSBydW4uIHYxIHRoZXJlZm9yZSBzdGF5cyBsaXZlIGFuZCBrZWVwcyB0aGUgZGVmZWN0OyBpdCBpcwovLyBub3QgcmV0aXJlZCBieSB0aGlzIHBhY2thZ2UgZXhpc3RpbmcsIGFuZCBub3RoaW5nIGhlcmUgbWlncmF0ZXMgaXQuCi8vCi8vIFRoZSB2MSB3b3JrYXJvdW5kLCBmb3IgYSBjb25zdW1lciBzdHVjayBvbiBpdDogcmVzdGF0aW5nIHRoZSBTQU1FCi8vIGFtZW5kbWVudCBpbnNpZGUgW25leHQgYm91bmRhcnksIG9sZCBleHBpcnkpIGFwcGxpZXMgaXQgaW1tZWRpYXRlbHkgLS0KLy8gQW1lbmQgcm9sbHMgdGhlIHdpbmRvdyBmaXJzdCwgcHJvbW90aW5nIHRoZSBwZW5kaW5nIHRlcm1zIGludG8gYS5UZXJtcywKLy8gYW5kIHRoZSByZXN0YXRlbWVudCBpcyB0aGVuIGVxdWFsLXRvIHJhdGhlciB0aGFuIGxvb3Nlci4gSXQgaXMgb3duZXItb25seSwKLy8gbW92ZXMgbm8gZnVuZHMsIGFuZCBuZWVkcyBubyBzcGVuZC4gSXQgbXVzdCBiZSBkb25lIEJFRk9SRSB0aGUgb2xkIGV4cGlyeTsKLy8gYWZ0ZXJ3YXJkcyB2MSdzIEFtZW5kIHJlZnVzZXMgd2l0aCBFcnJFeHBpcmVkLCBhbmQgUmV2b2tlIHBsdXMgYSBmcmVzaAovLyBPcGVuIGlzIHRoZSBvbmx5IHJvdXRlIGxlZnQuCi8vCi8vICMgV2h5IHRoaXMgcGFja2FnZSBleGlzdHMKLy8KLy8gVGhlIGVjb3N5c3RlbSdzIGV4aXN0aW5nIGFsbG93YW5jZSBwcmltaXRpdmUsCi8vIGduby5sYW5kL3AvamFla3dvbi9hbGxvd2FuY2VzZW5kZXIvdjAsIGlzIHNjb3BlZCB0byBhIHNpbmdsZSBjYWxsIGFuZAovLyBzYXlzIHNvIGluIGl0cyBvd24gZG9jdW1lbnRhdGlvbjoKLy8KLy8JIkFsbG93YW5jZSBzdXJ2aXZlcyBhY3Jvc3MgTiB0eHMgYnV0IG5vdCBOKzEgdHhzLiIgVXNlIGEgc2Vzc2lvbgovLwljb3VudGVyIHBhdHRlcm4gaW4gdGhlIGdyYW50ZXIgcmVhbG07IHRoaXMgcGFja2FnZSdzIENsb3NlIGlzCi8vCWJpbmFyeSwgbm90IGRlYWRsaW5lLWJhc2VkLgovLwovLyBJdCB0aGVuIGRlY2xpbmVzIGJsb2NrLWhlaWdodCBleHBpcnkgb24gdGhlIGdyb3VuZHMgdGhhdCBpdCAid291bGQKLy8gcmVxdWlyZSBydW50aW1lIGNvb3BlcmF0aW9uIi4gVGhhdCBpcyB0cnVlIG9ubHkgZm9yIGEgcGFja2FnZSB0aGF0IHJlYWRzCi8vIHRoZSBjbG9jayBpdHNlbGYuIHNwZW5kYm9vayBkb2VzIG5vdDogZXZlcnkgb3BlcmF0aW9uIHRha2VzIGBub3dgIGFzIGFuCi8vIGFyZ3VtZW50LCB3aGljaCBtYWtlcyB0aGUgd2luZG93IGFyaXRobWV0aWMgYSBwdXJlIGZ1bmN0aW9uIGFuZCB0aGUKLy8gd2hvbGUgcGFja2FnZSB1bml0LXRlc3RhYmxlIHdpdGhvdXQgYSBjaGFpbi4gVGhyZWUgYXBwbGljYXRpb24gcmVhbG1zIGluCi8vIHRoZSBzZWFyY2hlZCBzb3VyY2VzIGVhY2ggaGFuZC1yb2xsZWQgdGhpcyBtZWNoYW5pc20gaW50ZXJuYWxseSByYXRoZXIKLy8gdGhhbiBpbXBvcnRpbmcgb25lOyBzZWUgRElTQ09WRVJZLm1kLgovLwovLyAjIFRoZSBvbmUgaWRlYQovLwovLyBBbiBhbGxvd2FuY2UgaXMgbm90IGEgYmFsYW5jZS4gSXQgaXMgYSAqcGVybWlzc2lvbiB3aXRoIGEgY2VpbGluZyB0aGF0Ci8vIHJlZmlsbHMqLiBUaGUgb3duZXIgc2F5cyAidGhpcyBzcGVuZGVyIG1heSBkcmF3IGF0IG1vc3QgUGVyUGVyaW9kIHBlcgovLyB3aW5kb3csIGF0IG1vc3QgVG90YWwgZXZlciwgdW50aWwgRXhwaXJlc0F0LCBhbmQgSSBjYW4gcmV2b2tlIGl0IG5vdyI6Ci8vCi8vCWlmIGVyciA6PSBib29rLlNwZW5kKGlkLCBzcGVuZGVyS2V5LCBub3csIGFtb3VudCk7IGVyciAhPSBuaWwgewovLwkJcGFuaWMoZXJyKSAvLyByZXZva2VkLCBleHBpcmVkLCBvdmVyIHRoZSB3aW5kb3cgY2FwLCBvdmVyIHRoZSB0b3RhbAovLwl9Ci8vCS8vIC4uLiB0aGUgcmVhbG0gbW92ZXMgdGhlIGNvaW5zIGhlcmUsIHVuZGVyIGl0cyBvd24gYXV0aG9yaXR5Ci8vCi8vIFNwZW5kIGNoZWNrcyBldmVyeSBib3VuZCBhbmQgQ09OU1VNRVMgdGhlIGFsbG93YW5jZSBpbiB0aGUgc2FtZSBjYWxsLAovLyBiZWZvcmUgcmV0dXJuaW5nLiBUaGUgcmVhbG0gdGhlbiBhY3RzLiBCZWNhdXNlIHRoZSByZWFsbSBwZXJmb3JtcyB0aGUKLy8gZWZmZWN0IGl0c2VsZiwgbm8gY2xvc3VyZSwgY2FsbGJhY2ssIG9yIGNhcGFiaWxpdHkgZXZlciBjcm9zc2VzIGEgcmVhbG0KLy8gYm91bmRhcnkuIHNwZW5kYm9vayBjYW5ub3QgYmUgaGFuZGVkIGNvZGUgdG8gcnVuLCBzbyBpdCBjYW5ub3QgYmUKLy8gdHJpY2tlZCBpbnRvIHJ1bm5pbmcgdGhlIHdyb25nIGNvZGUuCi8vCi8vICMgV2luZG93cyBhcmUgYW5jaG9yZWQsIG5vdCBzbGlkaW5nCi8vCi8vIEEgd2luZG93IGlzIGRlcml2ZWQgZnJvbSBhIGZpeGVkIG9yaWdpbiDigJQgdGhlIEFuY2hvciBzZXQgYXQgT3BlbiDigJQgYnkKLy8gaW50ZWdlciBkaXZpc2lvbjoKLy8KLy8JaW5kZXgobm93KSA9IChub3cgLSBBbmNob3IpIC8gUGVyaW9kTGVuZ3RoCi8vCi8vIHNvIHRoZSBib3VuZGFyaWVzIGFyZSB0aGUgc2FtZSBmb3IgZXZlcnlvbmUgYW5kIGEgc3BlbmRlciBjYW5ub3QgcmVzZXQgYQovLyB3aW5kb3cgYnkgY2hvb3Npbmcgd2hlbiB0byBjYWxsLiBBIHNsaWRpbmcgIlBlclBlcmlvZCBwZXIgdHJhaWxpbmcgTgovLyBibG9ja3MiIHdpbmRvdyB3b3VsZCBsZXQgYSBzcGVuZGVyIGRyYXcgdGhlIGZ1bGwgY2FwIGF0IHRoZSBlbmQgb2Ygb25lCi8vIHRyYWlsaW5nIHNwYW4gYW5kIGFnYWluIGF0IHRoZSBzdGFydCBvZiB0aGUgbmV4dDsgYW5jaG9yaW5nIHJlbW92ZXMgdGhlCi8vIGNob2ljZS4gVGhlIHJlZmlsbCBpcyBhIFJFU0VULCBub3QgYSBjYXJyeTogYW4gdW51c2VkIGFsbG93YW5jZSBkb2VzIG5vdAovLyBhY2N1bXVsYXRlIGludG8gdGhlIG5leHQgd2luZG93LCBiZWNhdXNlIHRoZSBwb2ludCBvZiB0aGUgY2FwIGlzIHRvIGJvdW5kCi8vIHdvcnN0LWNhc2UgbG9zcyBwZXIgd2luZG93LCBhbmQgYSBjYXJyeSB3b3VsZCB1bmJvdW5kIGl0LgovLwovLyBQZXJpb2RMZW5ndGggPT0gMCBtZWFucyBvbmUgd2luZG93IHRoYXQgbmV2ZXIgcm9sbHM6IGEgcHVyZSBsaWZldGltZQovLyBhbGxvd2FuY2UsIHdoZXJlIFBlclBlcmlvZCBpcyB0aGUgb25seSBjYXAgdGhhdCBtYXR0ZXJzLgovLwovLyAjIEFtZW5kbWVudHMgY2Fubm90IGVubGFyZ2UgdGhlIGxpdmUgd2luZG93Ci8vCi8vIEFuIG93bmVyIHdobyBjb3VsZCByYWlzZSBQZXJQZXJpb2QgbWlkLXdpbmRvdyB3b3VsZCBiZSBhYmxlIHRvIHVuZG8gdGhlCi8vIGJvdW5kIGEgc3BlbmRlciBpcyByZWx5aW5nIG9uLCBhbmQg4oCUIHdvcnNlIGluIHRoZSBvdGhlciBkaXJlY3Rpb24g4oCUIGFuCi8vIG93bmVyIHdobyBkcmFpbnMgYSByZWxhdGlvbnNoaXAgYW5kIHRoZW4gbG93ZXJzIHRlcm1zIHJldHJvYWN0aXZlbHkKLy8gY291bGQgc3RyYW5kIGEgc3BlbmRlciBtaWQtc2V0dGxlbWVudC4gVGhlIHJ1bGUgaGVyZSBpcyBvbmUtc2lkZWQgYW5kCi8vIGVuZm9yY2VkIGluIEFtZW5kOgovLwovLyAgIC0gVElHSFRFUi1PUi1FUVVBTCB0ZXJtcyBhcHBseSBJTU1FRElBVEVMWS4gTG93ZXJpbmcgYSBjZWlsaW5nIGNhbgovLyAgICAgbmV2ZXIgYXV0aG9yaXplIGEgZHJhdyB0aGF0IHdhcyBub3QgYWxyZWFkeSBhdXRob3JpemVkLCBzbyB0aGVyZSBpcwovLyAgICAgbm8gcmVhc29uIHRvIGRlbGF5IGl0LCBhbmQgZGVsYXlpbmcgaXQgd291bGQgbWFrZSB0aGUgb3duZXIncyBvbmx5Ci8vICAgICBmYXN0IHJlbWVkeSBSZXZva2UuCi8vICAgLSBMT09TRVIgdGVybXMgYXJlIFBFTkRJTkcgYW5kIHRha2UgZWZmZWN0IGF0IHRoZSBuZXh0IHdpbmRvdwovLyAgICAgYm91bmRhcnksIG5ldmVyIGluc2lkZSB0aGUgY3VycmVudCBvbmUuCi8vCi8vIFRoaXMgaXMgdGhlIHNhbWUgYWR2ZXJzYXJpYWwgcHJvYmxlbSB0aGF0IHIvc2FtY3Jldy9hZ2VudF9yZWdpc3RyeV92MgovLyBzb2x2ZXMgYnkgbG9ja2luZyBpdHMgcHJpY2Ugd2hpbGUgYW55IGNyZWRpdCBlbnRyeSBleGlzdHM7IHRoZSBzaGFwZQovLyBoZXJlIGlzIGEgZGVmZXJyYWwgcmF0aGVyIHRoYW4gYSBsb2NrLCBzbyB0ZXJtcyBjYW4gc3RpbGwgbW92ZS4KLy8KLy8gV2l0aCBQZXJpb2RMZW5ndGggPT0gMCB0aGVyZSBpcyBubyBuZXh0IGJvdW5kYXJ5LCBzbyBhIGxvb3NlbmluZwovLyBhbWVuZG1lbnQgaXMgcmVmdXNlZCB3aXRoIEVyck5vQm91bmRhcnkgcmF0aGVyIHRoYW4gc2lsZW50bHkgcXVldWVkCi8vIGZvcmV2ZXIuIFBlcmlvZExlbmd0aCBpdHNlbGYgaXMgSU1NVVRBQkxFOiBjaGFuZ2luZyBpdCB3b3VsZCBtb3ZlIGV2ZXJ5Ci8vIGZ1dHVyZSBib3VuZGFyeSwgd2hpY2ggaXMgYW4gZW5sYXJnZW1lbnQgdmVjdG9yIHdlYXJpbmcgYSBkaWZmZXJlbnQgaGF0LgovLwovLyAjIFN0YXRlIGdyb3d0aAovLwovLyBSZXZva2VkIGFsbG93YW5jZXMgYXJlIHJlbW92ZWQsIG5vdCBhcmNoaXZlZC4gSURzIGFyZSBhbGxvY2F0ZWQKLy8gbW9ub3RvbmljYWxseSBhbmQgbmV2ZXIgcmV1c2VkLCBzbyBhIHJldm9rZWQgSUQgY2FuIG5ldmVyIGJlIHJlc3VycmVjdGVkCi8vIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIGtlZXAuIExpdmUgYWxsb3dhbmNlcyBhcmUgY2FwcGVkIHBlciBCb29rIGF0Ci8vIGNvbnN0cnVjdGlvbiwgc28gc3RvcmFnZSBpcyBib3VuZGVkIGJ5IG1heExpdmUgcmVnYXJkbGVzcyBvZiBob3cgbWFueQovLyBhbGxvd2FuY2VzIGhhdmUgZXZlciBleGlzdGVkLiBBdWRpdCBoaXN0b3J5IGJlbG9uZ3MgaW4gdGhlIGNvbnN1bWluZwovLyByZWFsbSdzIGV2ZW50cy4KLy8KLy8gQW4gRVhQSVJFRCBhbGxvd2FuY2UgaXMgbm90IHNlbGYtcmVtb3ZpbmcsIGFuZCBib3VuZGVkIHN0b3JhZ2UgaXMgbm90IHRoZQovLyBzYW1lIGFzIGEgdXNhYmxlIEJvb2s6IFNwZW5kIHJlZnVzZXMgaXQgZm9yZXZlciB3aGlsZSBpdCBzdGlsbCBob2xkcyBhCi8vIHNsb3QuIFJlYXAgZXhpc3RzIGZvciBleGFjdGx5IHRoYXQgYW5kIGlzIHBlcm1pc3Npb25sZXNzLCBiZWNhdXNlIGFuCi8vIGV4cGlyZWQgYWxsb3dhbmNlIGNhbiBhdXRob3JpemUgbm90aGluZyBhbmQgc28gcmVtb3ZpbmcgaXQgdGFrZXMgbm90aGluZwovLyBmcm9tIGFueW9uZS4KLy8KLy8gV2hhdCB0aGlzIHBhY2thZ2UgZG9lcyBOT1QgYm91bmQgaXMgaG93IG1hbnkgb2YgYSBCb29rJ3Mgc2xvdHMgT05FIG93bmVyCi8vIG1heSBob2xkIOKAlCBtYXhMaXZlIGlzIGEgc2luZ2xlIGdsb2JhbCBmaWd1cmUsIHNvIGFueSBvd25lciBwZXJtaXR0ZWQgdG8KLy8gT3BlbiBjYW4gZXhoYXVzdCBpdCBhbmQgbG9jayBvdXQgdGhlIHJlc3QuIFRoYXQgaXMgYSBwb2xpY3kgcXVlc3Rpb24gd2l0aAovLyBubyBhbnN3ZXIgYSBwcmltaXRpdmUgY2FuIHBpY2sgKHBlci1vd25lciBxdW90YT8gZmlyc3QtY29tZT8gb3duZXIKLy8gd2hpdGVsaXN0PyksIHNvIGl0IGlzIGxlZnQgd2hlcmUgdGhlIGF1dGhlbnRpY2F0aW9uIGFscmVhZHkgbGl2ZXM6IHRoZQovLyBjb25zdW1pbmcgcmVhbG0gZGVjaWRlcyB3aG8gbWF5IE9wZW4sIGFuZCBhIEJvb2sgc2hhcmVkIGFjcm9zcyBtdXR1YWxseQovLyB1bnRydXN0aW5nIG93bmVycyBuZWVkcyBpdHMgb3duIHBlci1vd25lciBjYXAgb24gdG9wIG9mIHRoaXMgb25lLiBOYW1lZAovLyBoZXJlIHJhdGhlciB0aGFuIGltcGxpZWQsIGJlY2F1c2UgImJvdW5kZWQiIHJlYWRzIGxpa2UgInNhZmUgdG8gc2hhcmUiLgovLwovLyAjIENvbnN1bWVyIGNvbnRyYWN0ICh0aGUgcGFydHMgdGhlIHBhY2thZ2UgY2Fubm90IGVuZm9yY2UpCi8vCi8vICAxLiBTVVBQTFkgQSBSRUFMIENMT0NLLiBzcGVuZGJvb2sgY2Fubm90IHZlcmlmeSB0aGF0IGBub3dgIGNhbWUgZnJvbQovLyAgICAgcnVudGltZS5DaGFpbkhlaWdodCgpIG9yIHRpbWUuTm93KCkuVW5peCgpLiBBIHJlYWxtIHRoYXQgbGV0cyBhCi8vICAgICBjYWxsZXIgY2hvb3NlIGBub3dgIGhhcyBoYW5kZWQgdGhlIHNwZW5kZXIgdGhlIHBvd2VyIHRvIHJvbGwgdGhlCi8vICAgICB3aW5kb3cgYXQgd2lsbCwgd2hpY2ggZGVmZWF0cyBldmVyeSBjYXAgaW4gdGhpcyBwYWNrYWdlLiBQYXNzIHRoZQovLyAgICAgY2hhaW4ncyBvd24gY2xvY2ssIGFuZCB1c2UgdGhlIHNhbWUgdW5pdHMgZm9yIHRoZSBsaWZlIG9mIHRoZSBCb29rLgovLwovLyAgMi4gQVVUSEVOVElDQVRFIFRIRSBTUEVOREVSIEtFWS4gc3BlbmRib29rIGNvbXBhcmVzIHRoZSBrZXkgc3RyaW5nIGl0Ci8vICAgICBpcyBnaXZlbiBhZ2FpbnN0IHRoZSBvbmUgcmVjb3JkZWQgYXQgT3Blbi4gSXQgY2Fubm90IHRlbGwgd2hldGhlcgovLyAgICAgdGhhdCBzdHJpbmcgaXMgdGhlIHJlYWwgY2FsbGVyLiBEZXJpdmUgaXQgZnJvbQovLyAgICAgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpLCBuZXZlciBmcm9tIGFuIGFyZ3VtZW50IHRoZSBjYWxsZXIgc3VwcGxpZXMuCi8vCi8vICAzLiBTUEVORCBCRUZPUkUgU0VORElORy4gU3BlbmQgY29uc3VtZXMgdGhlIGFsbG93YW5jZSBhbmQgcmV0dXJuczsgdGhlCi8vICAgICByZWFsbSB0aGVuIG1vdmVzIGNvaW5zLiBEb2luZyBpdCBpbiB0aGUgb3RoZXIgb3JkZXIgbWVhbnMgYSBmYWlsZWQKLy8gICAgIHNlbmQgbGVhdmVzIHRoZSBhbGxvd2FuY2UgY29uc3VtZWQsIG9yIGEgc3VjY2Vzc2Z1bCBzZW5kIGxlYXZlcyBpdAovLyAgICAgdW5jb25zdW1lZCDigJQgYm90aCBhcmUgcmVhbCBsb3NzZXMuIFN0YXRlIGZpcnN0LCBlZmZlY3Qgc2Vjb25kLgovLwovLyAgNC4gQU4gQUxMT1dBTkNFIElTIE5PVCBDVVNUT0RZLiBzcGVuZGJvb2sgYXV0aG9yaXppbmcgMTAwIGRvZXMgbm90IG1lYW4KLy8gICAgIDEwMCBleGlzdHMuIFRoZSByZWFsbSBtdXN0IGNoZWNrIGl0cyBvd24gaGVsZCBiYWxhbmNlIHNlcGFyYXRlbHk7Ci8vICAgICB0aGlzIHBhY2thZ2UgYm91bmRzIHBlcm1pc3Npb24sIG5vdCBzb2x2ZW5jeS4KcGFja2FnZSBzcGVuZGJvb2sKCmltcG9ydCAoCgkiZXJyb3JzIgoJInN0cmNvbnYiCgoJImduby5sYW5kL3AvbnQvYXZsL3YwIgopCgovLyBNYXhMaXZlTGltaXQgaXMgdGhlIGxhcmdlc3QgbWF4TGl2ZSBhIEJvb2sgbWF5IGJlIGNvbnN0cnVjdGVkIHdpdGguIEl0Ci8vIGJvdW5kcyB0aGUgd29yc3QtY2FzZSBjb3N0IG9mIEl0ZXJhdGUsIHdoaWNoIHNjYW5zIHRoZSBsaXZlIHNldC4KY29uc3QgTWF4TGl2ZUxpbWl0ID0gMTAwMDAKCi8vIE1heEtleUxlbiBib3VuZHMgYW4gb3duZXIgb3Igc3BlbmRlciBrZXkuIEEgYmVjaDMyIGdubyBhZGRyZXNzIGlzIDQwCi8vIGNoYXJhY3RlcnM7IHRoZSBoZWFkcm9vbSBleGlzdHMgc28gYSByZWFsbSBtYXkgbmFtZXNwYWNlIGl0cyBrZXlzLgpjb25zdCBNYXhLZXlMZW4gPSAxMjgKCi8vIG1heEludDY0IGlzIHRoZSBvdmVyZmxvdyBib3VuZGFyeSBmb3IgZXZlcnkgYWNjdW11bGF0aW9uIGhlcmUuCmNvbnN0IG1heEludDY0ID0gaW50NjQoMTw8NjMgLSAxKQoKLy8gRXJyb3JzIHJldHVybmVkIGJ5IEJvb2sgb3BlcmF0aW9ucy4KdmFyICgKCUVyckludmFsaWRDb25maWcgID0gZXJyb3JzLk5ldygic3BlbmRib29rOiBpbnZhbGlkIGJvb2sgY29uZmlndXJhdGlvbiIpCglFcnJFbXB0eU93bmVyICAgICA9IGVycm9ycy5OZXcoInNwZW5kYm9vazogZW1wdHkgb3duZXIga2V5IikKCUVyckVtcHR5U3BlbmRlciAgID0gZXJyb3JzLk5ldygic3BlbmRib29rOiBlbXB0eSBzcGVuZGVyIGtleSIpCglFcnJLZXlUb29Mb25nICAgICA9IGVycm9ycy5OZXcoInNwZW5kYm9vazoga2V5IGV4Y2VlZHMgTWF4S2V5TGVuIikKCUVyckludmFsaWROb3cgICAgID0gZXJyb3JzLk5ldygic3BlbmRib29rOiBub3cgbXVzdCBiZSBub24tbmVnYXRpdmUiKQoJRXJySW52YWxpZFRlcm1zICAgPSBlcnJvcnMuTmV3KCJzcGVuZGJvb2s6IGludmFsaWQgdGVybXMiKQoJRXJySW52YWxpZEFtb3VudCAgPSBlcnJvcnMuTmV3KCJzcGVuZGJvb2s6IGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlIikKCUVyckJvb2tGdWxsICAgICAgID0gZXJyb3JzLk5ldygic3BlbmRib29rOiBsaXZlIGFsbG93YW5jZSBjYXAgcmVhY2hlZCIpCglFcnJOb3RGb3VuZCAgICAgICA9IGVycm9ycy5OZXcoInNwZW5kYm9vazogbm8gc3VjaCBsaXZlIGFsbG93YW5jZSIpCglFcnJOb3RFeHBpcmVkICAgICA9IGVycm9ycy5OZXcoInNwZW5kYm9vazogYWxsb3dhbmNlIGhhcyBub3QgZXhwaXJlZCIpCglFcnJOb3RPd25lciAgICAgICA9IGVycm9ycy5OZXcoInNwZW5kYm9vazogY2FsbGVyIGRvZXMgbm90IG93biB0aGlzIGFsbG93YW5jZSIpCglFcnJOb3RTcGVuZGVyICAgICA9IGVycm9ycy5OZXcoInNwZW5kYm9vazogY2FsbGVyIGlzIG5vdCB0aGlzIGFsbG93YW5jZSdzIHNwZW5kZXIiKQoJRXJyRXhwaXJlZCAgICAgICAgPSBlcnJvcnMuTmV3KCJzcGVuZGJvb2s6IGFsbG93YW5jZSBoYXMgZXhwaXJlZCIpCglFcnJOb3RTdGFydGVkICAgICA9IGVycm9ycy5OZXcoInNwZW5kYm9vazogYWxsb3dhbmNlIGhhcyBub3Qgc3RhcnRlZCIpCglFcnJQZXJpb2RFeGNlZWRlZCA9IGVycm9ycy5OZXcoInNwZW5kYm9vazogYW1vdW50IGV4Y2VlZHMgdGhlIHdpbmRvdyBjYXAiKQoJRXJyVG90YWxFeGNlZWRlZCAgPSBlcnJvcnMuTmV3KCJzcGVuZGJvb2s6IGFtb3VudCBleGNlZWRzIHRoZSBsaWZldGltZSBjYXAiKQoJRXJyTm9Cb3VuZGFyeSAgICAgPSBlcnJvcnMuTmV3KCJzcGVuZGJvb2s6IG5vIHJlYWNoYWJsZSBuZXh0IHdpbmRvdyBib3VuZGFyeSIpCglFcnJPdmVyZmxvdyAgICAgICA9IGVycm9ycy5OZXcoInNwZW5kYm9vazogaW50NjQgb3ZlcmZsb3ciKQoJRXJySURFeGhhdXN0ZWQgICAgPSBlcnJvcnMuTmV3KCJzcGVuZGJvb2s6IGlkZW50aWZpZXIgc3BhY2UgZXhoYXVzdGVkIikKKQoKLy8gVGVybXMgYXJlIHRoZSBjZWlsaW5ncyBvbiBhbiBhbGxvd2FuY2UuIFplcm8gaGFzIGEgZGlzdGluY3QgbWVhbmluZyBpbgovLyB0aHJlZSBvZiB0aGUgZm91ciBmaWVsZHMgYW5kIGl0IGlzIG5ldmVyICJ6ZXJvIGFsbG93ZWQiOgovLwovLwlQZXJQZXJpb2QgICAgPiAwIHJlcXVpcmVkLiBUaGUgY2FwIHBlciB3aW5kb3cuCi8vCVBlcmlvZExlbmd0aCAwIG1lYW5zIE9ORSB3aW5kb3cgdGhhdCBuZXZlciByb2xscyAobGlmZXRpbWUpLgovLwlUb3RhbCAgICAgICAgMCBtZWFucyBubyBsaWZldGltZSBjYXAuCi8vCUV4cGlyZXNBdCAgICAwIG1lYW5zIG5vIGV4cGlyeS4KdHlwZSBUZXJtcyBzdHJ1Y3QgewoJUGVyUGVyaW9kICAgIGludDY0CglQZXJpb2RMZW5ndGggaW50NjQKCVRvdGFsICAgICAgICBpbnQ2NAoJRXhwaXJlc0F0ICAgIGludDY0Cn0KCi8vIHZhbGlkIHJlcG9ydHMgd2hldGhlciB0aGUgdGVybXMgYXJlIHNlbGYtY29uc2lzdGVudCwgZ2l2ZW4gdGhlIGFuY2hvciB0aGUKLy8gYWxsb3dhbmNlIGlzIChvciB3b3VsZCBiZSkgb3BlbmVkIGF0LgpmdW5jICh0IFRlcm1zKSB2YWxpZChhbmNob3IgaW50NjQpIGJvb2wgewoJaWYgdC5QZXJQZXJpb2QgPD0gMCB8fCB0LlBlcmlvZExlbmd0aCA8IDAgfHwgdC5Ub3RhbCA8IDAgewoJCXJldHVybiBmYWxzZQoJfQoJaWYgdC5FeHBpcmVzQXQgPCAwIHsKCQlyZXR1cm4gZmFsc2UKCX0KCS8vIEFuIGFsbG93YW5jZSB0aGF0IGhhcyBhbHJlYWR5IGV4cGlyZWQgYXQgaXRzIG93biBhbmNob3IgY2FuIG5ldmVyCgkvLyBhdXRob3JpemUgYW55dGhpbmcsIHNvIGFjY2VwdGluZyBpdCB3b3VsZCBvbmx5IGNyZWF0ZSBhIGxpdmUgZW50cnkKCS8vIHRoYXQgZXZlcnkgU3BlbmQgcmVmdXNlcy4KCWlmIHQuRXhwaXJlc0F0ICE9IDAgJiYgdC5FeHBpcmVzQXQgPD0gYW5jaG9yIHsKCQlyZXR1cm4gZmFsc2UKCX0KCS8vIEEgVG90YWwgYmVsb3cgUGVyUGVyaW9kIGlzIG5vdCBhbiBlcnJvciAtLSBpdCBpcyBhIG5hcnJvd2VyIGxpZmV0aW1lCgkvLyBjYXAsIHdoaWNoIFNwZW5kIGVuZm9yY2VzLiBBIFRvdGFsIG9mIGV4YWN0bHkgMCBpcyAidW5saW1pdGVkIi4KCXJldHVybiB0cnVlCn0KCi8vIHRpZ2h0ZXJPckVxdWFsVG8gcmVwb3J0cyB3aGV0aGVyIHQgaXMgd2Vha2x5IHRpZ2h0ZXIgdGhhbiB1IGluIGV2ZXJ5Ci8vIGRpbWVuc2lvbiwgaS5lLiB3aGV0aGVyIHQgY2FuIGF1dGhvcml6ZSBub3RoaW5nIHUgd291bGQgbm90IGhhdmUuIFRoaXMgaXMKLy8gdGhlIHByZWRpY2F0ZSB0aGF0IGRlY2lkZXMgd2hldGhlciBhbiBhbWVuZG1lbnQgYXBwbGllcyBpbW1lZGlhdGVseS4KLy8KLy8gVGhlIHplcm8tbWVhbnMtdW5saW1pdGVkIGZpZWxkcyBpbnZlcnQgdGhlIGNvbXBhcmlzb24sIHdoaWNoIGlzIHRoZSB3aG9sZQovLyBzdWJ0bGV0eTogVG90YWwgMCBpcyBMT09TRVIgdGhhbiBhbnkgcG9zaXRpdmUgVG90YWwsIGFuZCBFeHBpcmVzQXQgMCBpcwovLyBMT09TRVIgdGhhbiBhbnkgcG9zaXRpdmUgRXhwaXJlc0F0LiBSZWFkaW5nIHRob3NlIHR3byBhcyAic21hbGxlciBpcwovLyB0aWdodGVyIiB3b3VsZCBsZXQgYW4gb3duZXIgcmVtb3ZlIGEgbGlmZXRpbWUgY2FwIGFuZCBhbiBleHBpcnkKLy8gbWlkLXdpbmRvdyBhbmQgY2FsbCBpdCBhIHRpZ2h0ZW5pbmcuCmZ1bmMgKHQgVGVybXMpIHRpZ2h0ZXJPckVxdWFsVG8odSBUZXJtcykgYm9vbCB7CglpZiB0LlBlcmlvZExlbmd0aCAhPSB1LlBlcmlvZExlbmd0aCB7CgkJcmV0dXJuIGZhbHNlIC8vIGltbXV0YWJsZTsgc2VlIHRoZSBwYWNrYWdlIGRvYwoJfQoJaWYgdC5QZXJQZXJpb2QgPiB1LlBlclBlcmlvZCB7CgkJcmV0dXJuIGZhbHNlCgl9Cglzd2l0Y2ggewoJY2FzZSB1LlRvdGFsID09IDA6CgkJLy8gdSB3YXMgdW5saW1pdGVkOyBhbnl0aGluZyBpcyB0aWdodGVyIG9yIGVxdWFsLgoJY2FzZSB0LlRvdGFsID09IDAgfHwgdC5Ub3RhbCA+IHUuVG90YWw6CgkJcmV0dXJuIGZhbHNlCgl9Cglzd2l0Y2ggewoJY2FzZSB1LkV4cGlyZXNBdCA9PSAwOgoJCS8vIHUgbmV2ZXIgZXhwaXJlZDsgYW55IGV4cGlyeSBpcyB0aWdodGVyIG9yIGVxdWFsLgoJY2FzZSB0LkV4cGlyZXNBdCA9PSAwIHx8IHQuRXhwaXJlc0F0ID4gdS5FeHBpcmVzQXQ6CgkJcmV0dXJuIGZhbHNlCgl9CglyZXR1cm4gdHJ1ZQp9CgovLyBBbGxvd2FuY2UgaXMgb25lIG93bmVyJ3MgZ3JhbnQgdG8gb25lIHNwZW5kZXIuIEl0IGlzIHJldHVybmVkIEJZIFZBTFVFOgovLyBob2xkZXJzIGNhbm5vdCByZWFjaCBpbnRvIGEgQm9vayB0aHJvdWdoIGl0Lgp0eXBlIEFsbG93YW5jZSBzdHJ1Y3QgewoJSUQgICAgICAgIHVpbnQ2NAoJT3duZXIgICAgIHN0cmluZwoJU3BlbmRlciAgIHN0cmluZwoJVGVybXMgICAgIFRlcm1zCglBbmNob3IgICAgaW50NjQgLy8gd2luZG93IG9yaWdpbjsgYWxzbyB0aGUgZWFybGllc3Qgc3BlbmRhYmxlIGluc3RhbnQKCUNyZWF0ZWRBdCBpbnQ2NAoKCVNwZW50VG90YWwgIGludDY0IC8vIG92ZXIgdGhlIGFsbG93YW5jZSdzIHdob2xlIGxpZmUKCVNwZW50V2luZG93IGludDY0IC8vIHdpdGhpbiBXaW5kb3dJbmRleAoJV2luZG93SW5kZXggaW50NjQKCgkvLyBQZW5kaW5nIHRlcm1zLCBhcHBsaWVkIGF0IHRoZSBuZXh0IHdpbmRvdyBib3VuZGFyeS4gTWVhbmluZ2Z1bCBvbmx5CgkvLyB3aGVuIEhhc1BlbmRpbmcgaXMgdHJ1ZS4KCVBlbmRpbmcgICAgVGVybXMKCUhhc1BlbmRpbmcgYm9vbAp9CgovLyBJc0V4cGlyZWQgcmVwb3J0cyB3aGV0aGVyIHRoZSBhbGxvd2FuY2UgaXMgcGFzdCBpdHMgZXhwaXJ5IGF0IG5vdy4gQW4KLy8gYWxsb3dhbmNlIHdpdGggbm8gZXhwaXJ5IGlzIG5ldmVyIGV4cGlyZWQuCi8vCi8vIEl0IHJlc29sdmVzIHRoZSBleHBpcnkgTElWRSwgdGhyb3VnaCBhdCgpLCBhbmQgdGhhdCBpcyB0aGUgd2hvbGUgZGlmZmVyZW5jZQovLyBiZXR3ZWVuIHRoaXMgcGFja2FnZSBhbmQgdjEgLS0gc2VlICIjIFdoeSB2MiBleGlzdHMiIGluIHRoZSBwYWNrYWdlIGRvYy4KLy8gUmVhZGluZyBhLlRlcm1zLkV4cGlyZXNBdCBkaXJlY3RseSBhbnN3ZXJzIGZyb20gdGhlIGxhc3Qtd3JpdHRlbiByZWNvcmQsCi8vIGFuZCBhZnRlciBhIGJvdW5kYXJ5IHRoYXQgcmVjb3JkIGlzIHN0YWxlIGluIEJPVEggZGlyZWN0aW9ucy4KLy8KLy8gVGhlIG5vdyA8IEFuY2hvciBndWFyZCBpcyBub3QgYSBiZWhhdmlvdXIgY2hhbmdlIGFuZCBpcyBub3QgZGVjb3JhdGlvbi4gSXQKLy8gcHJlc2VydmVzIHdpbmRvd0luZGV4J3MgZG9jdW1lbnRlZCBwcmVjb25kaXRpb246IFJlbWFpbmluZywgU3BlbmQgYW5kIEFtZW5kCi8vIGVhY2ggcmVqZWN0IGEgcHJlLWFuY2hvciBub3cgYmVmb3JlIHJlYWNoaW5nIGhlcmUsIGJ1dCBSZWFwIGRvZXMgbm90LCBhbmQKLy8gSXNFeHBpcmVkIGlzIEVYUE9SVEVELCBzbyBhIGNvbnN1bWVyIG1heSBoYW5kIGl0IGFueSBub3cgYXQgYWxsLiBXaXRob3V0IHRoZQovLyBndWFyZCBzdWNoIGEgbm93IHdvdWxkIHJlYWNoIGEgbmVnYXRpdmUgbnVtZXJhdG9yIGluIHdpbmRvd0luZGV4LCB3aGVyZSBHbydzCi8vIHRydW5jYXRpb24tdG93YXJkLXplcm8gZm9sZHMgdHdvIHdpbmRvd3MgaW50byBvbmUuIGZhbHNlIGlzIGFsc28gd2hhdCB2MQovLyBhbnN3ZXJlZCBmb3IgZXZlcnkgdmFsaWQgYWxsb3dhbmNlIHRoZXJlLCBzbyBub3RoaW5nIG1vdmVzOiB2YWxpZCgpIHJlcXVpcmVzCi8vIEV4cGlyZXNBdCA+IEFuY2hvciwgaGVuY2Ugbm93IDwgQW5jaG9yIGltcGxpZXMgbm93IDwgRXhwaXJlc0F0LgpmdW5jIChhIEFsbG93YW5jZSkgSXNFeHBpcmVkKG5vdyBpbnQ2NCkgYm9vbCB7CglpZiBub3cgPCBhLkFuY2hvciB7CgkJcmV0dXJuIGZhbHNlCgl9Cgl0ZXJtcywgXywgXyA6PSBhLmF0KG5vdykKCXJldHVybiB0ZXJtcy5FeHBpcmVzQXQgIT0gMCAmJiBub3cgPj0gdGVybXMuRXhwaXJlc0F0Cn0KCi8vIHdpbmRvd0luZGV4IHJldHVybnMgdGhlIGFuY2hvcmVkIHdpbmRvdyBudW1iZXIgY29udGFpbmluZyBub3cuIEEgbGlmZXRpbWUKLy8gYWxsb3dhbmNlIChQZXJpb2RMZW5ndGggPT0gMCkgaXMgYWx3YXlzIGluIHdpbmRvdyAwLgovLwovLyBub3cgPCBBbmNob3IgY2Fubm90IHJlYWNoIGhlcmUuIFJlbWFpbmluZywgU3BlbmQgYW5kIEFtZW5kIGVhY2ggcmVqZWN0IGl0Ci8vIGZpcnN0IChFcnJOb3RTdGFydGVkLCBvciAwKSwgYW5kIElzRXhwaXJlZCAtLSB3aGljaCBSZWFwIHJlYWNoZXMgd2l0aCBubwovLyBhbmNob3IgY2hlY2sgb2YgaXRzIG93biAtLSBjYXJyaWVzIGl0cyBvd24gbm93IDwgQW5jaG9yIGd1YXJkIGZvciBleGFjdGx5Ci8vIHRoaXMgcmVhc29uLiBUaGF0IGtlZXBzIHRoaXMgZGl2aXNpb24gYXdheSBmcm9tIG5lZ2F0aXZlIG51bWVyYXRvcnMsIHdoZXJlCi8vIEdvJ3MgdHJ1bmNhdGlvbi10b3dhcmQtemVybyB3b3VsZCBmb2xkIHR3byB3aW5kb3dzIGludG8gb25lLgpmdW5jIChhIEFsbG93YW5jZSkgd2luZG93SW5kZXgobm93IGludDY0KSBpbnQ2NCB7CglpZiBhLlRlcm1zLlBlcmlvZExlbmd0aCA9PSAwIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIChub3cgLSBhLkFuY2hvcikgLyBhLlRlcm1zLlBlcmlvZExlbmd0aAp9CgovLyBuZXh0Qm91bmRhcnkgcmV0dXJucyB0aGUgaW5zdGFudCB3aW5kb3cgaWR4KzEgYmVnaW5zLCBhbmQgd2hldGhlciB0aGF0Ci8vIGluc3RhbnQgaXMgcmVhY2hhYmxlIGF0IGFsbC4KLy8KLy8gVW5yZWFjaGFibGUgaGFzIHRocmVlIGNhdXNlcyBhbmQgdGhleSBjb2xsYXBzZSB0byB0aGUgc2FtZSBhbnN3ZXIsIHdoaWNoIGlzCi8vIHdoeSB0aGlzIHJldHVybnMgYSBib29sIHJhdGhlciB0aGFuIGFuIGVycm9yOiBhIGxpZmV0aW1lIGFsbG93YW5jZSBoYXMgbm8KLy8gYm91bmRhcnkgYnkgY29uc3RydWN0aW9uLCBhbmQgYW4gYXJpdGhtZXRpY2FsbHkgdW5yZXByZXNlbnRhYmxlIGJvdW5kYXJ5Ci8vIChQZXJpb2RMZW5ndGggc28gbGFyZ2UsIG9yIHRoZSBjbG9jayBzbyBmYXIgYWxvbmcsIHRoYXQgQW5jaG9yICsgc3RlcHMgKgovLyBQZXJpb2RMZW5ndGggb3ZlcmZsb3dzIGludDY0KSBpcyBvbmUgbm8gY2xvY2sgd2lsbCBldmVyIHJlYWNoLiBDb21wdXRpbmcgaXQKLy8gdW5ndWFyZGVkIHdvdWxkIHdyYXAgdG8gYSBzbWFsbCBudW1iZXIgYW5kIHJlcG9ydCBhIGJvdW5kYXJ5IGluIHRoZSBQQVNULAovLyB3aGljaCBpcyB0aGUgZGFuZ2Vyb3VzIGRpcmVjdGlvbjogQW1lbmQgd291bGQgcXVldWUgYSBsb29zZW5pbmcgYXMgdGhvdWdoCi8vIGl0IHdlcmUgYWJvdXQgdG8gdGFrZSBlZmZlY3QuCmZ1bmMgKGEgQWxsb3dhbmNlKSBuZXh0Qm91bmRhcnkoaWR4IGludDY0KSAoaW50NjQsIGJvb2wpIHsKCXBsIDo9IGEuVGVybXMuUGVyaW9kTGVuZ3RoCglpZiBwbCA9PSAwIHx8IGlkeCA8IDAgfHwgaWR4ID09IG1heEludDY0IHsKCQlyZXR1cm4gMCwgZmFsc2UKCX0KCXN0ZXBzIDo9IGlkeCArIDEKCWlmIHN0ZXBzID4gbWF4SW50NjQvcGwgewoJCXJldHVybiAwLCBmYWxzZQoJfQoJb2ZmIDo9IHN0ZXBzICogcGwKCWlmIG9mZiA+IG1heEludDY0LWEuQW5jaG9yIHsKCQlyZXR1cm4gMCwgZmFsc2UKCX0KCXJldHVybiBhLkFuY2hvciArIG9mZiwgdHJ1ZQp9CgovLyBhdCBjb21wdXRlcyB0aGUgYWxsb3dhbmNlJ3MgZWZmZWN0aXZlIHN0YXRlIGF0IG5vdyBXSVRIT1VUIG11dGF0aW5nIGl0OgovLyB0aGUgdGVybXMgaW4gZm9yY2UsIHRoZSB3aW5kb3cgaXQgZmFsbHMgaW4sIGFuZCBob3cgbXVjaCBoYXMgYmVlbiBzcGVudAovLyB3aXRoaW4gdGhhdCB3aW5kb3cuCi8vCi8vIFNwZW5kLCBSZW1haW5pbmcgYW5kIElzRXhwaXJlZCBBTEwgZ28gdGhyb3VnaCB0aGlzIG9uZSBmdW5jdGlvbi4gVGhhdCBpcwovLyBkZWxpYmVyYXRlIC0tIGEgcmVhZCB0aGF0IGFuc3dlcmVkICJob3cgbXVjaCBpcyBsZWZ0IiBvciAiaXMgdGhpcyBzdGlsbAovLyBhbGl2ZSIgd2l0aCBpdHMgb3duIGNvcHkgb2YgdGhlIHJvbGxvdmVyIGFuZCBhbWVuZG1lbnQgbG9naWMgd291bGQgYmUgYQovLyBzZWNvbmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJ1bGUsIGZyZWUgdG8gZGlzYWdyZWUgd2l0aCB0aGUgb25lIHRoYXQKLy8gZW5mb3JjZXMgaXQsIGFuZCB0aGUgZGlzYWdyZWVtZW50IHdvdWxkIHN1cmZhY2UgYXMgYW4gYWxsb3dhbmNlIHRoYXQKLy8gcmVwb3J0cyBtb3JlIHRoYW4gaXQgaG9ub3JzIChvciBob25vcnMgbW9yZSB0aGFuIGl0IHJlcG9ydHMpLgovLwovLyBJc0V4cGlyZWQgd2FzIHRoYXQgc2Vjb25kIGltcGxlbWVudGF0aW9uIGluIHYxLCBhbmQgaXQgaXMgdGhlIHJlYXNvbiB0aGlzCi8vIHBhY2thZ2UgaGFzIGEgdjIuIFRoZSByb3V0aW5nIGlzIHRoZSBpbnZhcmlhbnQ6IGFueXRoaW5nIHRoYXQgYXNrcyBhIGxpdmUKLy8gcXVlc3Rpb24gYWJvdXQgYW4gYWxsb3dhbmNlIGFza3MgaXQgSEVSRS4gQSBmdXR1cmUgZmllbGQgd2l0aCBhCi8vIHplcm8tbWVhbnMtdW5saW1pdGVkIHJlYWRpbmcgZ2V0cyB0aGUgc2FtZSB0cmVhdG1lbnQgb3IgaW5oZXJpdHMgdGhlIHNhbWUKLy8gYnVnLgpmdW5jIChhIEFsbG93YW5jZSkgYXQobm93IGludDY0KSAoVGVybXMsIGludDY0LCBpbnQ2NCkgewoJaWR4IDo9IGEud2luZG93SW5kZXgobm93KQoJaWYgaWR4ID09IGEuV2luZG93SW5kZXggewoJCXJldHVybiBhLlRlcm1zLCBpZHgsIGEuU3BlbnRXaW5kb3cKCX0KCS8vIFRoZSB3aW5kb3cgaGFzIHJvbGxlZC4gQSBwZW5kaW5nIGFtZW5kbWVudCB0YWtlcyBlZmZlY3QgZXhhY3RseSBoZXJlLAoJLy8gYW5kIHRoZSBpbi13aW5kb3cgc3BlbmQgcmVzZXRzIC0tIGl0IGRvZXMgbm90IGNhcnJ5LgoJdGVybXMgOj0gYS5UZXJtcwoJaWYgYS5IYXNQZW5kaW5nIHsKCQl0ZXJtcyA9IGEuUGVuZGluZwoJfQoJcmV0dXJuIHRlcm1zLCBpZHgsIDAKfQoKLy8gUmVtYWluaW5nIHJlcG9ydHMgaG93IG11Y2ggdGhlIHNwZW5kZXIgbWF5IGRyYXcgcmlnaHQgbm93OiB0aGUgbGVzc2VyIG9mCi8vIHdoYXQgdGhlIGN1cnJlbnQgd2luZG93IGxlYXZlcyBhbmQgd2hhdCB0aGUgbGlmZXRpbWUgY2FwIGxlYXZlcy4gSXQgaXMgMAovLyBmb3IgYW4gYWxsb3dhbmNlIHRoYXQgaXMgZXhwaXJlZCwgbm90IHlldCBzdGFydGVkLCBvciBmdWxseSBkcmF3bi4KLy8KLy8gSXQgaXMgYSBwcm9qZWN0aW9uLCBub3QgYSByZXNlcnZhdGlvbi4gTm90aGluZyBpcyBoZWxkLCBhbmQgdGhlIGZpZ3VyZSBjYW4KLy8gY2hhbmdlIGluIHRoZSBzYW1lIGJsb2NrIGlmIHNvbWVvbmUgZWxzZSdzIGNhbGwgYWR2YW5jZXMgdGhlIGNsb2NrIHBhc3QgYQovLyBib3VuZGFyeS4KZnVuYyAoYSBBbGxvd2FuY2UpIFJlbWFpbmluZyhub3cgaW50NjQpIGludDY0IHsKCWlmIG5vdyA8IGEuQW5jaG9yIHx8IGEuSXNFeHBpcmVkKG5vdykgewoJCXJldHVybiAwCgl9Cgl0ZXJtcywgXywgc3BlbnRXaW5kb3cgOj0gYS5hdChub3cpCglsZWZ0IDo9IHRlcm1zLlBlclBlcmlvZCAtIHNwZW50V2luZG93CglpZiBsZWZ0IDwgMCB7CgkJLy8gUmVhY2hhYmxlOiBhIHRpZ2h0ZW5pbmcgYW1lbmRtZW50IGNhbiBkcm9wIFBlclBlcmlvZCBiZWxvdyB3aGF0CgkJLy8gdGhlIHdpbmRvdyBhbHJlYWR5IHNwZW50LiBUaGUgYWxsb3dhbmNlIGlzIGRyYXduLCBub3QgbmVnYXRpdmUuCgkJbGVmdCA9IDAKCX0KCWlmIHRlcm1zLlRvdGFsICE9IDAgewoJCWxpZmVMZWZ0IDo9IHRlcm1zLlRvdGFsIC0gYS5TcGVudFRvdGFsCgkJaWYgbGlmZUxlZnQgPCAwIHsKCQkJbGlmZUxlZnQgPSAwCgkJfQoJCWlmIGxpZmVMZWZ0IDwgbGVmdCB7CgkJCWxlZnQgPSBsaWZlTGVmdAoJCX0KCX0KCXJldHVybiBsZWZ0Cn0KCi8vIEJvb2sgaG9sZHMgdGhlIGxpdmUgYWxsb3dhbmNlcyBvZiBvbmUgY29uc3VtaW5nIHJlYWxtLiBUaGUgemVybyB2YWx1ZSBpcwovLyBub3QgdXNhYmxlOyBjb25zdHJ1Y3Qgd2l0aCBOZXcuCnR5cGUgQm9vayBzdHJ1Y3QgewoJbWF4TGl2ZSBpbnQKCW5leHRJRCAgdWludDY0ICAgIC8vIG5ldmVyIGRlY3JlYXNlczsgSURzIGFyZSBuZXZlciByZXVzZWQKCWxpdmUgICAgKmF2bC5UcmVlIC8vIHBhZGRlZCBpZCAtPiBBbGxvd2FuY2UKfQoKLy8gTmV3IHJldHVybnMgYW4gZW1wdHkgQm9vay4gbWF4TGl2ZSBjYXBzIHNpbXVsdGFuZW91c2x5IGxpdmUgYWxsb3dhbmNlcwovLyBhbmQgbXVzdCBiZSBpbiBbMSwgTWF4TGl2ZUxpbWl0XS4KZnVuYyBOZXcobWF4TGl2ZSBpbnQpICgqQm9vaywgZXJyb3IpIHsKCWlmIG1heExpdmUgPCAxIHx8IG1heExpdmUgPiBNYXhMaXZlTGltaXQgewoJCXJldHVybiBuaWwsIEVyckludmFsaWRDb25maWcKCX0KCXJldHVybiAmQm9va3ttYXhMaXZlOiBtYXhMaXZlLCBuZXh0SUQ6IDEsIGxpdmU6IGF2bC5OZXdUcmVlKCl9LCBuaWwKfQoKLy8gTXVzdE5ldyBpcyBOZXcgYnV0IHBhbmljcyBvbiBlcnJvci4KZnVuYyBNdXN0TmV3KG1heExpdmUgaW50KSAqQm9vayB7CgliLCBlcnIgOj0gTmV3KG1heExpdmUpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CglyZXR1cm4gYgp9CgovLyBNYXhMaXZlIHJldHVybnMgdGhlIEJvb2sncyBjYXAgb24gc2ltdWx0YW5lb3VzbHkgbGl2ZSBhbGxvd2FuY2VzLgpmdW5jIChiICpCb29rKSBNYXhMaXZlKCkgaW50IHsgcmV0dXJuIGIubWF4TGl2ZSB9CgovLyBDb3VudCByZXR1cm5zIHRoZSBudW1iZXIgb2YgbGl2ZSBhbGxvd2FuY2VzLgpmdW5jIChiICpCb29rKSBDb3VudCgpIGludCB7IHJldHVybiBiLmxpdmUuU2l6ZSgpIH0KCi8vIGtleSBwYWRzIGFuIGlkIHRvIGEgZml4ZWQgd2lkdGggc28gYXZsJ3MgbGV4aWNhbCBvcmRlciBtYXRjaGVzIG51bWVyaWMKLy8gb3JkZXIuIDIwIGRpZ2l0cyBjb3ZlcnMgdGhlIHdob2xlIHVpbnQ2NCByYW5nZS4KZnVuYyBrZXkoaWQgdWludDY0KSBzdHJpbmcgewoJcyA6PSBzdHJjb252LkZvcm1hdFVpbnQoaWQsIDEwKQoJZm9yIGxlbihzKSA8IDIwIHsKCQlzID0gIjAiICsgcwoJfQoJcmV0dXJuIHMKfQoKZnVuYyBjaGVja0tleXMob3duZXIsIHNwZW5kZXIgc3RyaW5nKSBlcnJvciB7CglpZiBvd25lciA9PSAiIiB7CgkJcmV0dXJuIEVyckVtcHR5T3duZXIKCX0KCWlmIHNwZW5kZXIgPT0gIiIgewoJCXJldHVybiBFcnJFbXB0eVNwZW5kZXIKCX0KCWlmIGxlbihvd25lcikgPiBNYXhLZXlMZW4gfHwgbGVuKHNwZW5kZXIpID4gTWF4S2V5TGVuIHsKCQlyZXR1cm4gRXJyS2V5VG9vTG9uZwoJfQoJcmV0dXJuIG5pbAp9CgovLyBPcGVuIHJlY29yZHMgYSBuZXcgYWxsb3dhbmNlIGFuZCByZXR1cm5zIGl0cyBpZC4gbm93IGJlY29tZXMgdGhlIHdpbmRvdwovLyBhbmNob3IgYW5kIHRoZSBlYXJsaWVzdCBpbnN0YW50IHRoZSBzcGVuZGVyIG1heSBkcmF3LgovLwovLyBBbiBvd25lciBtYXkgb3BlbiBzZXZlcmFsIGFsbG93YW5jZXMgZm9yIHRoZSBzYW1lIHNwZW5kZXI7IHRoZXkgYXJlCi8vIGluZGVwZW5kZW50LCBhbmQgdGhlIGlkcyBhcmUgd2hhdCB0ZWxsIHRoZW0gYXBhcnQuIHNwZW5kYm9vayBkb2VzIG5vdAovLyBtZXJnZSBvciBkZWR1cGxpY2F0ZSB0aGVtLCBiZWNhdXNlICJvbmUgYWxsb3dhbmNlIHBlciBwYWlyIiBpcyBhIHBvbGljeQovLyBzb21lIGNvbnN1bWluZyByZWFsbXMgd2FudCBhbmQgb3RoZXJzIGRvIG5vdCwgYW5kIGEgcHJpbWl0aXZlIHRoYXQKLy8gZGVjaWRlZCBpdCBoZXJlIGNvdWxkIG5vdCBiZSB0YWxrZWQgb3V0IG9mIGl0LgpmdW5jIChiICpCb29rKSBPcGVuKG93bmVyLCBzcGVuZGVyIHN0cmluZywgbm93IGludDY0LCB0ZXJtcyBUZXJtcykgKHVpbnQ2NCwgZXJyb3IpIHsKCWlmIGVyciA6PSBjaGVja0tleXMob3duZXIsIHNwZW5kZXIpOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgZXJyCgl9CglpZiBub3cgPCAwIHsKCQlyZXR1cm4gMCwgRXJySW52YWxpZE5vdwoJfQoJaWYgIXRlcm1zLnZhbGlkKG5vdykgewoJCXJldHVybiAwLCBFcnJJbnZhbGlkVGVybXMKCX0KCWlmIGIubGl2ZS5TaXplKCkgPj0gYi5tYXhMaXZlIHsKCQlyZXR1cm4gMCwgRXJyQm9va0Z1bGwKCX0KCWlmIGIubmV4dElEID09IDAgewoJCXJldHVybiAwLCBFcnJJREV4aGF1c3RlZAoJfQoJaWQgOj0gYi5uZXh0SUQKCWIubmV4dElEKysKCWIubGl2ZS5TZXQoa2V5KGlkKSwgQWxsb3dhbmNlewoJCUlEOiAgICAgICAgaWQsCgkJT3duZXI6ICAgICBvd25lciwKCQlTcGVuZGVyOiAgIHNwZW5kZXIsCgkJVGVybXM6ICAgICB0ZXJtcywKCQlBbmNob3I6ICAgIG5vdywKCQlDcmVhdGVkQXQ6IG5vdywKCX0pCglyZXR1cm4gaWQsIG5pbAp9CgovLyBnZXQgZmV0Y2hlcyBhIGxpdmUgYWxsb3dhbmNlIGJ5IGlkLgovLwovLyBhdmwncyBHZXQgcmV0dXJucyBhIGJhcmUgYGFueWAgd2l0aCBubyBmb3VuZCBmbGFnLCBzbyBhYnNlbmNlIGlzIGEgbmlsCi8vIHZhbHVlLiBUaGF0IGlzIHNvdW5kIGhlcmUgb25seSBiZWNhdXNlIG5vdGhpbmcgbmlsIGlzIGV2ZXIgc3RvcmVkOiBTZXQgaXMKLy8gY2FsbGVkIGluIGV4YWN0bHkgdGhyZWUgcGxhY2VzIGFuZCBhbGwgdGhyZWUgcGFzcyBhbiBBbGxvd2FuY2UgdmFsdWUuCmZ1bmMgKGIgKkJvb2spIGdldChpZCB1aW50NjQpIChBbGxvd2FuY2UsIGJvb2wpIHsKCXYgOj0gYi5saXZlLkdldChrZXkoaWQpKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiBBbGxvd2FuY2V7fSwgZmFsc2UKCX0KCWEsIG9rIDo9IHYuKEFsbG93YW5jZSkKCWlmICFvayB7CgkJcmV0dXJuIEFsbG93YW5jZXt9LCBmYWxzZQoJfQoJcmV0dXJuIGEsIHRydWUKfQoKLy8gR2V0IHJldHVybnMgYSBjb3B5IG9mIGEgbGl2ZSBhbGxvd2FuY2UuCmZ1bmMgKGIgKkJvb2spIEdldChpZCB1aW50NjQpIChBbGxvd2FuY2UsIGVycm9yKSB7CglhLCBvayA6PSBiLmdldChpZCkKCWlmICFvayB7CgkJcmV0dXJuIEFsbG93YW5jZXt9LCBFcnJOb3RGb3VuZAoJfQoJcmV0dXJuIGEsIG5pbAp9CgovLyBSZW1haW5pbmcgcmVwb3J0cyB3aGF0IHRoZSBzcGVuZGVyIG9mIGlkIG1heSBkcmF3IGF0IG5vdywgb3IgMCBpZiB0aGVyZQovLyBpcyBubyBzdWNoIGxpdmUgYWxsb3dhbmNlLiBBIGNhbGxlciB0aGF0IG11c3QgZGlzdGluZ3Vpc2ggIm5vdGhpbmcgbGVmdCIKLy8gZnJvbSAibm8gc3VjaCBhbGxvd2FuY2UiIHNob3VsZCB1c2UgR2V0LgpmdW5jIChiICpCb29rKSBSZW1haW5pbmcoaWQgdWludDY0LCBub3cgaW50NjQpIGludDY0IHsKCWEsIG9rIDo9IGIuZ2V0KGlkKQoJaWYgIW9rIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIGEuUmVtYWluaW5nKG5vdykKfQoKLy8gU3BlbmQgY29uc3VtZXMgYW1vdW50IGZyb20gYWxsb3dhbmNlIGlkIG9uIGJlaGFsZiBvZiBzcGVuZGVyIGFuZCByZXR1cm5zCi8vIG5pbCBpZiBldmVyeSBib3VuZCBwZXJtaXRzIGl0LiBUaGUgY2FsbGVyIHRoZW4gcGVyZm9ybXMgaXRzIG93biBlZmZlY3QuCi8vCi8vIE9uIGFueSBlcnJvciBOT1RISU5HIGlzIGNvbnN1bWVkLiBUaGUgd3JpdGUgaGFwcGVucyBvbmNlLCBhZnRlciB0aGUgbGFzdAovLyBjaGVjaywgc28gYSByZWZ1c2VkIFNwZW5kIGxlYXZlcyB0aGUgYm9vayBleGFjdGx5IGFzIGl0IHdhcy4KZnVuYyAoYiAqQm9vaykgU3BlbmQoaWQgdWludDY0LCBzcGVuZGVyIHN0cmluZywgbm93IGludDY0LCBhbW91bnQgaW50NjQpIGVycm9yIHsKCWlmIG5vdyA8IDAgewoJCXJldHVybiBFcnJJbnZhbGlkTm93Cgl9CglpZiBhbW91bnQgPD0gMCB7CgkJcmV0dXJuIEVyckludmFsaWRBbW91bnQKCX0KCWEsIG9rIDo9IGIuZ2V0KGlkKQoJaWYgIW9rIHsKCQlyZXR1cm4gRXJyTm90Rm91bmQKCX0KCWlmIGEuU3BlbmRlciAhPSBzcGVuZGVyIHsKCQlyZXR1cm4gRXJyTm90U3BlbmRlcgoJfQoJaWYgbm93IDwgYS5BbmNob3IgewoJCXJldHVybiBFcnJOb3RTdGFydGVkCgl9CglpZiBhLklzRXhwaXJlZChub3cpIHsKCQlyZXR1cm4gRXJyRXhwaXJlZAoJfQoKCXRlcm1zLCBpZHgsIHNwZW50V2luZG93IDo9IGEuYXQobm93KQoKCS8vIFdpbmRvdyBjYXAuIENoZWNrZWQgYXMgYSBzdWJ0cmFjdGlvbiBzbyB0aGUgc3VtIGNhbm5vdCBvdmVyZmxvdzoKCS8vIHNwZW50V2luZG93IGFuZCBQZXJQZXJpb2QgYXJlIGJvdGggPj0gMCBhbmQgUGVyUGVyaW9kID4gMC4KCWlmIGFtb3VudCA+IHRlcm1zLlBlclBlcmlvZC1zcGVudFdpbmRvdyB7CgkJcmV0dXJuIEVyclBlcmlvZEV4Y2VlZGVkCgl9CgkvLyBMaWZldGltZSBjYXAuCglpZiB0ZXJtcy5Ub3RhbCAhPSAwICYmIGFtb3VudCA+IHRlcm1zLlRvdGFsLWEuU3BlbnRUb3RhbCB7CgkJcmV0dXJuIEVyclRvdGFsRXhjZWVkZWQKCX0KCS8vIFNwZW50VG90YWwgaXMgdW5ib3VuZGVkIHdoZW4gVG90YWwgPT0gMCwgc28gaXQgaXMgdGhlIG9uZQoJLy8gYWNjdW11bGF0aW9uIHRoYXQgY2FuIGdlbnVpbmVseSByZWFjaCB0aGUgaW50NjQgY2VpbGluZy4KCWlmIGEuU3BlbnRUb3RhbCA+IG1heEludDY0LWFtb3VudCB7CgkJcmV0dXJuIEVyck92ZXJmbG93Cgl9CgoJYS5UZXJtcyA9IHRlcm1zCglpZiBpZHggIT0gYS5XaW5kb3dJbmRleCB7CgkJYS5IYXNQZW5kaW5nID0gZmFsc2UKCQlhLlBlbmRpbmcgPSBUZXJtc3t9Cgl9CglhLldpbmRvd0luZGV4ID0gaWR4CglhLlNwZW50V2luZG93ID0gc3BlbnRXaW5kb3cgKyBhbW91bnQKCWEuU3BlbnRUb3RhbCArPSBhbW91bnQKCWIubGl2ZS5TZXQoa2V5KGlkKSwgYSkKCXJldHVybiBuaWwKfQoKLy8gUmV2b2tlIHJlbW92ZXMgYW4gYWxsb3dhbmNlLiBPbmx5IGl0cyBvd25lciBtYXkgcmV2b2tlLCBhbmQgaXQgdGFrZXMKLy8gZWZmZWN0IGltbWVkaWF0ZWx5IC0tIHRoZXJlIGlzIG5vIHdpbmRvdyB0byB3YWl0IGZvciwgYmVjYXVzZSByZXZvY2F0aW9uCi8vIGlzIHRoZSBvd25lcidzIHJlbWVkeSBhbmQgYSBkZWxheWVkIHJlbWVkeSBpcyBub3Qgb25lLgovLwovLyBUaGUgaWQgaXMgbm90IHJldXNlZCwgc28gYSByZXZva2VkIGFsbG93YW5jZSBjYW5ub3QgYmUgcmVzdXJyZWN0ZWQ6IGEKLy8gbGF0ZXIgU3BlbmQgb24gaXQgcmV0dXJucyBFcnJOb3RGb3VuZCBmb3JldmVyLgpmdW5jIChiICpCb29rKSBSZXZva2UoaWQgdWludDY0LCBvd25lciBzdHJpbmcpIGVycm9yIHsKCWEsIG9rIDo9IGIuZ2V0KGlkKQoJaWYgIW9rIHsKCQlyZXR1cm4gRXJyTm90Rm91bmQKCX0KCWlmIGEuT3duZXIgIT0gb3duZXIgewoJCXJldHVybiBFcnJOb3RPd25lcgoJfQoJYi5saXZlLlJlbW92ZShrZXkoaWQpKQoJcmV0dXJuIG5pbAp9CgovLyBBbWVuZCBjaGFuZ2VzIGFuIGFsbG93YW5jZSdzIHRlcm1zLiBPbmx5IGl0cyBvd25lciBtYXkgYW1lbmQuCi8vCi8vIFBlcmlvZExlbmd0aCBpcyBpbW11dGFibGUgYW5kIG11c3QgYmUgcGFzc2VkIHVuY2hhbmdlZC4gVGVybXMgdGhhdCBhcmUKLy8gd2Vha2x5IHRpZ2h0ZXIgaW4gZXZlcnkgZGltZW5zaW9uIGFwcGx5IGltbWVkaWF0ZWx5OyBhbnl0aGluZyBsb29zZXIKLy8gYmVjb21lcyBwZW5kaW5nIGFuZCB0YWtlcyBlZmZlY3QgYXQgdGhlIG5leHQgd2luZG93IGJvdW5kYXJ5LiBBIGxpZmV0aW1lCi8vIGFsbG93YW5jZSBoYXMgbm8gbmV4dCBib3VuZGFyeSwgc28gYSBsb29zZW5pbmcgYW1lbmRtZW50IG9uIG9uZSBpcwovLyByZWZ1c2VkIHdpdGggRXJyTm9Cb3VuZGFyeS4KLy8KLy8gVGhlIHJldHVybmVkIGJvb2wgcmVwb3J0cyB3aGV0aGVyIHRoZSBhbWVuZG1lbnQgYXBwbGllZCBpbW1lZGlhdGVseQovLyAodHJ1ZSkgb3Igd2FzIHF1ZXVlZCAoZmFsc2UpLiBBIGNhbGxlciB0aGF0IGlnbm9yZXMgaXQgY2Fubm90IHRlbGwKLy8gd2hldGhlciB0aGUgbmV3IGNlaWxpbmcgaXMgaW4gZm9yY2UsIHdoaWNoIGlzIGV4YWN0bHkgdGhlIHRoaW5nIHdvcnRoCi8vIGtub3dpbmcuCmZ1bmMgKGIgKkJvb2spIEFtZW5kKGlkIHVpbnQ2NCwgb3duZXIgc3RyaW5nLCBub3cgaW50NjQsIHRlcm1zIFRlcm1zKSAoYm9vbCwgZXJyb3IpIHsKCWlmIG5vdyA8IDAgewoJCXJldHVybiBmYWxzZSwgRXJySW52YWxpZE5vdwoJfQoJYSwgb2sgOj0gYi5nZXQoaWQpCglpZiAhb2sgewoJCXJldHVybiBmYWxzZSwgRXJyTm90Rm91bmQKCX0KCWlmIGEuT3duZXIgIT0gb3duZXIgewoJCXJldHVybiBmYWxzZSwgRXJyTm90T3duZXIKCX0KCWlmIG5vdyA8IGEuQW5jaG9yIHsKCQlyZXR1cm4gZmFsc2UsIEVyck5vdFN0YXJ0ZWQKCX0KCWlmIGEuSXNFeHBpcmVkKG5vdykgewoJCXJldHVybiBmYWxzZSwgRXJyRXhwaXJlZAoJfQoJLy8gVmFsaWRhdGVkIGFnYWluc3QgdGhlIEFOQ0hPUiByYXRoZXIgdGhhbiBub3csIHdoaWNoIGlzIHRoZSBMT09TRVIgb2YKCS8vIHRoZSB0d28gYW5kIGlzIGRlbGliZXJhdGUuIHZhbGlkKCkgb25seSBuZWVkcyBFeHBpcmVzQXQgdG8gYmUgYWZ0ZXIgdGhlCgkvLyB3aW5kb3cgb3JpZ2luOyBhbiBvd25lciBuYW1pbmcgYW4gZXhwaXJ5IGJldHdlZW4gdGhlIGFuY2hvciBhbmQgbm93IGlzCgkvLyB0aWdodGVuaW5nIHRoZSBhbGxvd2FuY2UgdW50aWwgaXQgaXMgZGVhZCwgd2hpY2ggaXMgdGhlaXIgcHJlcm9nYXRpdmUuCgkvLyBSZXZva2UgaXMgdGhlIGNsZWFuZXIgd2F5IHRvIHNheSB0aGF0LCBhbmQgUmVhcCB0aGVuIHJlY2xhaW1zIHRoZSBzbG90LgoJaWYgIXRlcm1zLnZhbGlkKGEuQW5jaG9yKSB7CgkJcmV0dXJuIGZhbHNlLCBFcnJJbnZhbGlkVGVybXMKCX0KCWlmIHRlcm1zLlBlcmlvZExlbmd0aCAhPSBhLlRlcm1zLlBlcmlvZExlbmd0aCB7CgkJcmV0dXJuIGZhbHNlLCBFcnJJbnZhbGlkVGVybXMKCX0KCgkvLyBSb2xsIHRoZSB3aW5kb3cgZmlyc3QgaWYgdGhlIGNsb2NrIGhhcyBtb3ZlZCBwYXN0IGEgYm91bmRhcnksIHNvIGFuCgkvLyBhbWVuZG1lbnQgbWFkZSBhZnRlciBhIHF1aWV0IHN0cmV0Y2ggaXMganVkZ2VkIGFnYWluc3QgdGhlIHRlcm1zCgkvLyBhY3R1YWxseSBpbiBmb3JjZSByYXRoZXIgdGhhbiB0aGUgb25lcyBhIHN0YWxlIHJlY29yZCBzdGlsbCBob2xkcy4KCWN1ciwgaWR4LCBzcGVudFdpbmRvdyA6PSBhLmF0KG5vdykKCWlmIGlkeCAhPSBhLldpbmRvd0luZGV4IHsKCQlhLlRlcm1zID0gY3VyCgkJYS5XaW5kb3dJbmRleCA9IGlkeAoJCWEuU3BlbnRXaW5kb3cgPSBzcGVudFdpbmRvdwoJCWEuSGFzUGVuZGluZyA9IGZhbHNlCgkJYS5QZW5kaW5nID0gVGVybXN7fQoJfQoKCWlmIHRlcm1zLnRpZ2h0ZXJPckVxdWFsVG8oYS5UZXJtcykgewoJCWEuVGVybXMgPSB0ZXJtcwoJCS8vIEEgdGlnaHRlbmluZyBzdXBlcnNlZGVzIGEgcXVldWVkIGxvb3NlbmluZy4gTGVhdmluZyBpdCBxdWV1ZWQKCQkvLyB3b3VsZCBtZWFuIHRoZSBvd25lcidzIHRpZ2h0ZW5pbmcgc2lsZW50bHkgZXhwaXJlcyBhdCB0aGUgbmV4dAoJCS8vIGJvdW5kYXJ5IGFuZCB0aGUgbG9vc2VyIHRlcm1zIHRoZXkganVzdCByZXBsYWNlZCBjb21lIGJhY2suCgkJYS5IYXNQZW5kaW5nID0gZmFsc2UKCQlhLlBlbmRpbmcgPSBUZXJtc3t9CgkJYi5saXZlLlNldChrZXkoaWQpLCBhKQoJCXJldHVybiB0cnVlLCBuaWwKCX0KCgkvLyBBIGxvb3NlbmluZyBpcyBvbmx5IHF1ZXVlYWJsZSBpZiB0aGUgYm91bmRhcnkgaXQgd2FpdHMgZm9yIHdpbGwgYXJyaXZlCgkvLyB3aGlsZSB0aGUgYWxsb3dhbmNlIGlzIHN0aWxsIGFsaXZlLiBRdWV1ZWluZyBvbmUgdGhhdCBjYW5ub3QgYmUgcmVhY2hlZAoJLy8gd291bGQgcmVwb3J0ICJhY2NlcHRlZCwgcGVuZGluZyIgZm9yIHRlcm1zIHRoYXQgbmV2ZXIgdGFrZSBlZmZlY3QgLS0KCS8vIHRoZSBvd25lcidzIGFtZW5kbWVudCBzaWxlbnRseSBkaXNjYXJkZWQsIHdoaWNoIGlzIHRoZSBmYWlsdXJlIG1vZGUKCS8vIHRoaXMgcGFja2FnZSBpcyBsZWFzdCBhYmxlIHRvIGV4cGxhaW4gYWZ0ZXIgdGhlIGZhY3QuCgkvLwoJLy8gVHdvIHdheXMgaXQgaXMgdW5yZWFjaGFibGUuIFRoZSBhbGxvd2FuY2UgaGFzIG5vIGJvdW5kYXJ5IGF0IGFsbAoJLy8gKFBlcmlvZExlbmd0aCA9PSAwLCBvciBhbiB1bnJlcHJlc2VudGFibGUgb25lKSwgb3IgdGhlIGN1cnJlbnQgdGVybXMKCS8vIGV4cGlyZSBhdCBvciBiZWZvcmUgdGhlIG5leHQgYm91bmRhcnkuIFRoZSBzZWNvbmQgaXMgcmVhY2hhYmxlIGluCgkvLyBvcmRpbmFyeSB1c2U6IGEgdGlnaHRlbmluZyBvZiBFeHBpcmVzQXQgYXBwbGllcyBJTU1FRElBVEVMWSwgc28gYW4KCS8vIG93bmVyIGNhbiB0aWdodGVuIHRoZSBleHBpcnkgYmVsb3cgdGhlIG5leHQgYm91bmRhcnkgYW5kIHRoZW4gbG9vc2VuCgkvLyBQZXJQZXJpb2QsIGFuZCB3aXRob3V0IHRoaXMgY2hlY2sgdGhlIHNlY29uZCBjYWxsIHdvdWxkIGJlIGFjY2VwdGVkCgkvLyBhZ2FpbnN0IGEgd2luZG93IHRoYXQgbmV2ZXIgb3BlbnMuCgluYiwgb2sgOj0gYS5uZXh0Qm91bmRhcnkoYS5XaW5kb3dJbmRleCkKCWlmICFvayB7CgkJcmV0dXJuIGZhbHNlLCBFcnJOb0JvdW5kYXJ5Cgl9CglpZiBhLlRlcm1zLkV4cGlyZXNBdCAhPSAwICYmIG5iID49IGEuVGVybXMuRXhwaXJlc0F0IHsKCQlyZXR1cm4gZmFsc2UsIEVyck5vQm91bmRhcnkKCX0KCWEuUGVuZGluZyA9IHRlcm1zCglhLkhhc1BlbmRpbmcgPSB0cnVlCgliLmxpdmUuU2V0KGtleShpZCksIGEpCglyZXR1cm4gZmFsc2UsIG5pbAp9CgovLyBSZWFwIHJlbW92ZXMgYW4gYWxsb3dhbmNlIHRoYXQgaGFzIGV4cGlyZWQgYXQgbm93LCBhbmQgbWF5IGJlIGNhbGxlZCBieQovLyBhbnlvbmUuIEl0IHJldHVybnMgRXJyTm90Rm91bmQgZm9yIGFuIHVua25vd24gaWQgYW5kIEVyck5vdEV4cGlyZWQgZm9yIG9uZQovLyB0aGF0IGlzIHN0aWxsIGFsaXZlLgovLwovLyBQZXJtaXNzaW9ubGVzcyBvbiBwdXJwb3NlLCBhbmQgdGhlIHJlYXNvbmluZyBpcyB0aGUgd2hvbGUganVzdGlmaWNhdGlvbjoKLy8gYW4gZXhwaXJlZCBhbGxvd2FuY2UgY2FuIG5ldmVyIGF1dGhvcml6ZSBhbm90aGVyIGRyYXcsIHNvIHJlbW92aW5nIGl0IHRha2VzCi8vIG5vdGhpbmcgZnJvbSB0aGUgb3duZXIgYW5kIGdyYW50cyBub3RoaW5nIHRvIHRoZSBjYWxsZXIuIFdpdGhvdXQgaXQgYW4KLy8gZXhwaXJ5IGlzIGEgc2xvdyBsZWFrIGFnYWluc3QgbWF4TGl2ZSAtLSBTcGVuZCByZWZ1c2VzIHRoZSBkZWFkIGFsbG93YW5jZQovLyBmb3JldmVyIHdoaWxlIGl0IGhvbGRzIGEgc2xvdCwgc28gYSBCb29rIHNoYXJlZCBiZXR3ZWVuIG93bmVycyBjb3VsZCBmaWxsCi8vIHdpdGggY29ycHNlcyBhbmQgcmVmdXNlIG5ldyBPcGVucywgYW5kIHRoZSBvbmx5IHJlbWVkeSB3b3VsZCBiZSB0aGUgb3duZXIKLy8gb2YgZWFjaCBjb3Jwc2Ugbm90aWNpbmcgYW5kIGNhbGxpbmcgUmV2b2tlLgovLwovLyBUaGlzIHJlbGllcyBvbiBgbm93YCBleGFjdGx5IGFzIG11Y2ggYXMgU3BlbmQgZG9lcy4gQSByZWFsbSB0aGF0IGxldHMgYQovLyBjYWxsZXIgY2hvb3NlIGBub3dgIGhhcyBhbHJlYWR5IGJyb2tlbiBjb25zdW1lciBjb250cmFjdCBpdGVtIDEsIGFuZCBzdWNoIGEKLy8gcmVhbG0gd291bGQgbGV0IGEgY2FsbGVyIHJlYXAgYSBMSVZFIGFsbG93YW5jZSBieSBuYW1pbmcgYSBmdXR1cmUgaW5zdGFudC4KZnVuYyAoYiAqQm9vaykgUmVhcChpZCB1aW50NjQsIG5vdyBpbnQ2NCkgZXJyb3IgewoJaWYgbm93IDwgMCB7CgkJcmV0dXJuIEVyckludmFsaWROb3cKCX0KCWEsIG9rIDo9IGIuZ2V0KGlkKQoJaWYgIW9rIHsKCQlyZXR1cm4gRXJyTm90Rm91bmQKCX0KCWlmICFhLklzRXhwaXJlZChub3cpIHsKCQlyZXR1cm4gRXJyTm90RXhwaXJlZAoJfQoJYi5saXZlLlJlbW92ZShrZXkoaWQpKQoJcmV0dXJuIG5pbAp9CgovLyBJdGVyYXRlIGNhbGxzIGZuIGZvciBldmVyeSBsaXZlIGFsbG93YW5jZSBpbiBpZCBvcmRlciwgc3RvcHBpbmcgZWFybHkgaWYKLy8gZm4gcmV0dXJucyB0cnVlLiBUaGUgYWxsb3dhbmNlIGlzIHBhc3NlZCBieSB2YWx1ZSwgc28gZm4gY2Fubm90IG11dGF0ZQovLyB0aGUgYm9vayB0aHJvdWdoIGl0LgpmdW5jIChiICpCb29rKSBJdGVyYXRlKGZuIGZ1bmMoQWxsb3dhbmNlKSBib29sKSB7CgliLmxpdmUuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoXyBzdHJpbmcsIHYgYW55KSBib29sIHsKCQlyZXR1cm4gZm4odi4oQWxsb3dhbmNlKSkKCX0pCn0KIg01MDAwMDAwMHVnbm90EhIImOfMORILMTIwNzk4dWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECFvQxdskleM40Lpnib60p9/58Ru1wQ1b/q5MVf2K7DpgSQKUbIrWzjTdL9UPmecvJwWlCZSADRvijx5E2IzYCrTIQQsfGTJU2dTtM7+FbwEXKwymiVvLhwUXTZUJX79Yx9ZsaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU="
  }
}