--- http_interactions: - request: method: get uri: http://builds.emberjs.com/canary/ember.js body: encoding: US-ASCII string: '' headers: Accept-Encoding: - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 Accept: - '*/*' User-Agent: - Ruby Host: - builds.emberjs.com response: status: code: 200 message: OK headers: X-Amz-Id-2: - sr3sx1VPwa/z5U6BJWF2WFSJch48VmxIrTXtuonjPrNNigQ6+3+B+6/yGMtCw+aT X-Amz-Request-Id: - 00FC53274518D750 Date: - Mon, 17 Feb 2014 11:45:36 GMT Last-Modified: - Mon, 17 Feb 2014 05:31:59 GMT Etag: - '"7f4bfe495c563900cc68f8dfb0aef23a"' Content-Type: - text/javascript Content-Length: - '1236258' Server: - AmazonS3 body: encoding: ASCII-8BIT string: !binary |- LyohCiAqIEBvdmVydmlldyAgRW1iZXIgLSBKYXZhU2NyaXB0IEFwcGxpY2F0 aW9uIEZyYW1ld29yawogKiBAY29weXJpZ2h0IENvcHlyaWdodCAyMDExLTIw MTQgVGlsZGUgSW5jLiBhbmQgY29udHJpYnV0b3JzCiAqICAgICAgICAgICAg UG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYtMjAxMSBTdHJvYmUgSW5jLgogKiAg ICAgICAgICAgIFBvcnRpb25zIENvcHlyaWdodCAyMDA4LTIwMTEgQXBwbGUg SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBAbGljZW5zZSAgIExpY2Vu c2VkIHVuZGVyIE1JVCBsaWNlbnNlCiAqICAgICAgICAgICAgU2VlIGh0dHBz Oi8vcmF3LmdpdGh1Yi5jb20vZW1iZXJqcy9lbWJlci5qcy9tYXN0ZXIvTElD RU5TRQogKiBAdmVyc2lvbiAgIDEuNi4wLWJldGEuMStjYW5hcnkuZjc5N2M2 ZDUKICovCgoKKGZ1bmN0aW9uKCkgewovKmdsb2JhbCBfX2ZhaWxfXyovCgov KioKRW1iZXIgRGVidWcKCkBtb2R1bGUgZW1iZXIKQHN1Ym1vZHVsZSBlbWJl ci1kZWJ1ZwoqLwoKLyoqCkBjbGFzcyBFbWJlcgoqLwoKaWYgKCd1bmRlZmlu ZWQnID09PSB0eXBlb2YgRW1iZXIpIHsKICBFbWJlciA9IHt9OwoKICBpZiAo J3VuZGVmaW5lZCcgIT09IHR5cGVvZiB3aW5kb3cpIHsKICAgIHdpbmRvdy5F bSA9IHdpbmRvdy5FbWJlciA9IEVtID0gRW1iZXI7CiAgfQp9CgovLyBUaGlz IG5lZWRzIHRvIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBsb2dpYyBpbgov LyBgcGFja2FnZXMvZW1iZXItbWV0YWwvbGliL2NvcmUuanNgLgovLwovLyBU aGlzIGlzIGR1cGxpY2F0ZWQgaGVyZSB0byBlbnN1cmUgdGhhdCBgRW1iZXIu RU5WYAovLyBpcyBzZXR1cCBldmVuIGlmIGBFbWJlcmAgaXMgbm90IGxvYWRl ZCB5ZXQuCmlmIChFbWJlci5FTlYpIHsKICAvLyBkbyBub3RoaW5nIGlmIEVt YmVyLkVOViBpcyBhbHJlYWR5IHNldHVwCn0gZWxzZSBpZiAoJ3VuZGVmaW5l ZCcgIT09IHR5cGVvZiBFbWJlckVOVikgewogIEVtYmVyLkVOViA9IEVtYmVy RU5WOwp9IGVsc2UgaWYoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBFTlYpIHsK ICBFbWJlci5FTlYgPSBFTlY7Cn0gZWxzZSB7CiAgRW1iZXIuRU5WID0ge307 Cn0KCmlmICghKCdNQU5EQVRPUllfU0VUVEVSJyBpbiBFbWJlci5FTlYpKSB7 CiAgRW1iZXIuRU5WLk1BTkRBVE9SWV9TRVRURVIgPSB0cnVlOyAvLyBkZWZh dWx0IHRvIHRydWUgZm9yIGRlYnVnIGRpc3QKfQoKLyoqCiAgRGVmaW5lIGFu IGFzc2VydGlvbiB0aGF0IHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRo ZSBjb25kaXRpb24gaXMgbm90CiAgbWV0LiBFbWJlciBidWlsZCB0b29scyB3 aWxsIHJlbW92ZSBhbnkgY2FsbHMgdG8gYEVtYmVyLmFzc2VydCgpYCB3aGVu CiAgZG9pbmcgYSBwcm9kdWN0aW9uIGJ1aWxkLiBFeGFtcGxlOgoKICBgYGBq YXZhc2NyaXB0CiAgLy8gVGVzdCBmb3IgdHJ1dGhpbmVzcwogIEVtYmVyLmFz c2VydCgnTXVzdCBwYXNzIGEgdmFsaWQgb2JqZWN0Jywgb2JqKTsKICAvLyBG YWlsIHVuY29uZGl0aW9uYWxseQogIEVtYmVyLmFzc2VydCgnVGhpcyBjb2Rl IHBhdGggc2hvdWxkIG5ldmVyIGJlIHJ1bicpCiAgYGBgCgogIEBtZXRob2Qg YXNzZXJ0CiAgQHBhcmFtIHtTdHJpbmd9IGRlc2MgQSBkZXNjcmlwdGlvbiBv ZiB0aGUgYXNzZXJ0aW9uLiBUaGlzIHdpbGwgYmVjb21lCiAgICB0aGUgdGV4 dCBvZiB0aGUgRXJyb3IgdGhyb3duIGlmIHRoZSBhc3NlcnRpb24gZmFpbHMu CiAgQHBhcmFtIHtCb29sZWFufSB0ZXN0IE11c3QgYmUgdHJ1dGh5IGZvciB0 aGUgYXNzZXJ0aW9uIHRvIHBhc3MuIElmCiAgICBmYWxzeSwgYW4gZXhjZXB0 aW9uIHdpbGwgYmUgdGhyb3duLgoqLwpFbWJlci5hc3NlcnQgPSBmdW5jdGlv bihkZXNjLCB0ZXN0KSB7CiAgaWYgKCF0ZXN0KSB7CiAgICB0aHJvdyBuZXcg RW1iZXIuRXJyb3IoIkFzc2VydGlvbiBGYWlsZWQ6ICIgKyBkZXNjKTsKICB9 Cn07CgoKLyoqCiAgRGlzcGxheSBhIHdhcm5pbmcgd2l0aCB0aGUgcHJvdmlk ZWQgbWVzc2FnZS4gRW1iZXIgYnVpbGQgdG9vbHMgd2lsbAogIHJlbW92ZSBh bnkgY2FsbHMgdG8gYEVtYmVyLndhcm4oKWAgd2hlbiBkb2luZyBhIHByb2R1 Y3Rpb24gYnVpbGQuCgogIEBtZXRob2Qgd2FybgogIEBwYXJhbSB7U3RyaW5n fSBtZXNzYWdlIEEgd2FybmluZyB0byBkaXNwbGF5LgogIEBwYXJhbSB7Qm9v bGVhbn0gdGVzdCBBbiBvcHRpb25hbCBib29sZWFuLiBJZiBmYWxzeSwgdGhl IHdhcm5pbmcKICAgIHdpbGwgYmUgZGlzcGxheWVkLgoqLwpFbWJlci53YXJu ID0gZnVuY3Rpb24obWVzc2FnZSwgdGVzdCkgewogIGlmICghdGVzdCkgewog ICAgRW1iZXIuTG9nZ2VyLndhcm4oIldBUk5JTkc6ICIrbWVzc2FnZSk7CiAg ICBpZiAoJ3RyYWNlJyBpbiBFbWJlci5Mb2dnZXIpIEVtYmVyLkxvZ2dlci50 cmFjZSgpOwogIH0KfTsKCi8qKgogIERpc3BsYXkgYSBkZWJ1ZyBub3RpY2Uu IEVtYmVyIGJ1aWxkIHRvb2xzIHdpbGwgcmVtb3ZlIGFueSBjYWxscyB0bwog IGBFbWJlci5kZWJ1ZygpYCB3aGVuIGRvaW5nIGEgcHJvZHVjdGlvbiBidWls ZC4KCiAgYGBgamF2YXNjcmlwdAogIEVtYmVyLmRlYnVnKCJJJ20gYSBkZWJ1 ZyBub3RpY2UhIik7CiAgYGBgCgogIEBtZXRob2QgZGVidWcKICBAcGFyYW0g e1N0cmluZ30gbWVzc2FnZSBBIGRlYnVnIG1lc3NhZ2UgdG8gZGlzcGxheS4K Ki8KRW1iZXIuZGVidWcgPSBmdW5jdGlvbihtZXNzYWdlKSB7CiAgRW1iZXIu TG9nZ2VyLmRlYnVnKCJERUJVRzogIittZXNzYWdlKTsKfTsKCi8qKgogIERp c3BsYXkgYSBkZXByZWNhdGlvbiB3YXJuaW5nIHdpdGggdGhlIHByb3ZpZGVk IG1lc3NhZ2UgYW5kIGEgc3RhY2sgdHJhY2UKICAoQ2hyb21lIGFuZCBGaXJl Zm94IG9ubHkpLiBFbWJlciBidWlsZCB0b29scyB3aWxsIHJlbW92ZSBhbnkg Y2FsbHMgdG8KICBgRW1iZXIuZGVwcmVjYXRlKClgIHdoZW4gZG9pbmcgYSBw cm9kdWN0aW9uIGJ1aWxkLgoKICBAbWV0aG9kIGRlcHJlY2F0ZQogIEBwYXJh bSB7U3RyaW5nfSBtZXNzYWdlIEEgZGVzY3JpcHRpb24gb2YgdGhlIGRlcHJl Y2F0aW9uLgogIEBwYXJhbSB7Qm9vbGVhbn0gdGVzdCBBbiBvcHRpb25hbCBi b29sZWFuLiBJZiBmYWxzeSwgdGhlIGRlcHJlY2F0aW9uCiAgICB3aWxsIGJl IGRpc3BsYXllZC4KKi8KRW1iZXIuZGVwcmVjYXRlID0gZnVuY3Rpb24obWVz c2FnZSwgdGVzdCkgewogIGlmICh0ZXN0KSB7IHJldHVybjsgfQoKICBpZiAo RW1iZXIuRU5WLlJBSVNFX09OX0RFUFJFQ0FUSU9OKSB7IHRocm93IG5ldyBF bWJlci5FcnJvcihtZXNzYWdlKTsgfQoKICB2YXIgZXJyb3I7CgogIC8vIFdo ZW4gdXNpbmcgbmV3IEVycm9yLCB3ZSBjYW4ndCBkbyB0aGUgYXJndW1lbnRz IGNoZWNrIGZvciBDaHJvbWUuIEFsdGVybmF0aXZlcyBhcmUgd2VsY29tZQog IHRyeSB7IF9fZmFpbF9fLmZhaWwoKTsgfSBjYXRjaCAoZSkgeyBlcnJvciA9 IGU7IH0KCiAgaWYgKEVtYmVyLkxPR19TVEFDS1RSQUNFX09OX0RFUFJFQ0FU SU9OICYmIGVycm9yLnN0YWNrKSB7CiAgICB2YXIgc3RhY2ssIHN0YWNrU3Ry ID0gJyc7CiAgICBpZiAoZXJyb3JbJ2FyZ3VtZW50cyddKSB7CiAgICAgIC8v IENocm9tZQogICAgICBzdGFjayA9IGVycm9yLnN0YWNrLnJlcGxhY2UoL15c cythdFxzKy9nbSwgJycpLgogICAgICAgICAgICAgICAgICAgICAgICAgIHJl cGxhY2UoL14oW15cKF0rPykoW1xuJF0pL2dtLCAne2Fub255bW91c30oJDEp JDInKS4KICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlKC9eT2Jq ZWN0Ljxhbm9ueW1vdXM+XHMqXCgoW15cKV0rKVwpL2dtLCAne2Fub255bW91 c30oJDEpJykuc3BsaXQoJ1xuJyk7CiAgICAgIHN0YWNrLnNoaWZ0KCk7CiAg ICB9IGVsc2UgewogICAgICAvLyBGaXJlZm94CiAgICAgIHN0YWNrID0gZXJy b3Iuc3RhY2sucmVwbGFjZSgvKD86XG5AOjApP1xzKyQvbSwgJycpLgogICAg ICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2UoL15cKC9nbSwgJ3thbm9u eW1vdXN9KCcpLnNwbGl0KCdcbicpOwogICAgfQoKICAgIHN0YWNrU3RyID0g IlxuICAgICIgKyBzdGFjay5zbGljZSgyKS5qb2luKCJcbiAgICAiKTsKICAg IG1lc3NhZ2UgPSBtZXNzYWdlICsgc3RhY2tTdHI7CiAgfQoKICBFbWJlci5M b2dnZXIud2FybigiREVQUkVDQVRJT046ICIrbWVzc2FnZSk7Cn07CgoKCi8q KgogIEFsaWFzIGFuIG9sZCwgZGVwcmVjYXRlZCBtZXRob2Qgd2l0aCBpdHMg bmV3IGNvdW50ZXJwYXJ0LgoKICBEaXNwbGF5IGEgZGVwcmVjYXRpb24gd2Fy bmluZyB3aXRoIHRoZSBwcm92aWRlZCBtZXNzYWdlIGFuZCBhIHN0YWNrIHRy YWNlCiAgKENocm9tZSBhbmQgRmlyZWZveCBvbmx5KSB3aGVuIHRoZSBhc3Np Z25lZCBtZXRob2QgaXMgY2FsbGVkLgoKICBFbWJlciBidWlsZCB0b29scyB3 aWxsIG5vdCByZW1vdmUgY2FsbHMgdG8gYEVtYmVyLmRlcHJlY2F0ZUZ1bmMo KWAsIHRob3VnaAogIG5vIHdhcm5pbmdzIHdpbGwgYmUgc2hvd24gaW4gcHJv ZHVjdGlvbi4KCiAgYGBgamF2YXNjcmlwdAogIEVtYmVyLm9sZE1ldGhvZCA9 IEVtYmVyLmRlcHJlY2F0ZUZ1bmMoIlBsZWFzZSB1c2UgdGhlIG5ldywgdXBk YXRlZCBtZXRob2QiLCBFbWJlci5uZXdNZXRob2QpOwogIGBgYAoKICBAbWV0 aG9kIGRlcHJlY2F0ZUZ1bmMKICBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBB IGRlc2NyaXB0aW9uIG9mIHRoZSBkZXByZWNhdGlvbi4KICBAcGFyYW0ge0Z1 bmN0aW9ufSBmdW5jIFRoZSBuZXcgZnVuY3Rpb24gY2FsbGVkIHRvIHJlcGxh Y2UgaXRzIGRlcHJlY2F0ZWQgY291bnRlcnBhcnQuCiAgQHJldHVybiB7RnVu Y3Rpb259IGEgbmV3IGZ1bmN0aW9uIHRoYXQgd3JhcHBlZCB0aGUgb3JpZ2lu YWwgZnVuY3Rpb24gd2l0aCBhIGRlcHJlY2F0aW9uIHdhcm5pbmcKKi8KRW1i ZXIuZGVwcmVjYXRlRnVuYyA9IGZ1bmN0aW9uKG1lc3NhZ2UsIGZ1bmMpIHsK ICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICBFbWJlci5kZXByZWNhdGUobWVz c2FnZSk7CiAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMp OwogIH07Cn07CgoKLy8gSW5mb3JtIHRoZSBkZXZlbG9wZXIgYWJvdXQgdGhl IEVtYmVyIEluc3BlY3RvciBpZiBub3QgaW5zdGFsbGVkLgppZiAoIUVtYmVy LnRlc3RpbmcpIHsKICB2YXIgaXNGaXJlZm94ID0gdHlwZW9mIEluc3RhbGxU cmlnZ2VyICE9PSAndW5kZWZpbmVkJzsKICB2YXIgaXNDaHJvbWUgPSAhIXdp bmRvdy5jaHJvbWUgJiYgIXdpbmRvdy5vcGVyYTsKCiAgaWYgKHR5cGVvZiB3 aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIChpc0ZpcmVmb3ggfHwgaXNDaHJv bWUpICYmIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7CiAgICB3aW5kb3cu YWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGZ1bmN0aW9uKCkgewogICAgICBp ZiAoZG9jdW1lbnQuYm9keSAmJiBkb2N1bWVudC5ib2R5LmRhdGFzZXQgJiYg IWRvY3VtZW50LmJvZHkuZGF0YXNldC5lbWJlckV4dGVuc2lvbikgewogICAg ICAgIHZhciBkb3dubG9hZFVSTDsKCiAgICAgICAgaWYoaXNDaHJvbWUpIHsK ICAgICAgICAgIGRvd25sb2FkVVJMID0gJ2h0dHBzOi8vY2hyb21lLmdvb2ds ZS5jb20vd2Vic3RvcmUvZGV0YWlsL2VtYmVyLWluc3BlY3Rvci9ibWRibG5j ZWdrZW5rYWNpZWloZmhwamZwcG9jb25oaSc7CiAgICAgICAgfSBlbHNlIGlm KGlzRmlyZWZveCkgewogICAgICAgICAgZG93bmxvYWRVUkwgPSAnaHR0cHM6 Ly9hZGRvbnMubW96aWxsYS5vcmcvZW4tVVMvZmlyZWZveC9hZGRvbi9lbWJl ci1pbnNwZWN0b3IvJwogICAgICAgIH0KCiAgICAgICAgRW1iZXIuZGVidWco J0ZvciBtb3JlIGFkdmFuY2VkIGRlYnVnZ2luZywgaW5zdGFsbCB0aGUgRW1i ZXIgSW5zcGVjdG9yIGZyb20gJyArIGRvd25sb2FkVVJMKTsKICAgICAgfQog ICAgfSwgZmFsc2UpOwogIH0KfQoKfSkoKTsKCi8qIQogKiBAb3ZlcnZpZXcg IEVtYmVyIC0gSmF2YVNjcmlwdCBBcHBsaWNhdGlvbiBGcmFtZXdvcmsKICog QGNvcHlyaWdodCBDb3B5cmlnaHQgMjAxMS0yMDE0IFRpbGRlIEluYy4gYW5k IGNvbnRyaWJ1dG9ycwogKiAgICAgICAgICAgIFBvcnRpb25zIENvcHlyaWdo dCAyMDA2LTIwMTEgU3Ryb2JlIEluYy4KICogICAgICAgICAgICBQb3J0aW9u cyBDb3B5cmlnaHQgMjAwOC0yMDExIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy ZXNlcnZlZC4KICogQGxpY2Vuc2UgICBMaWNlbnNlZCB1bmRlciBNSVQgbGlj ZW5zZQogKiAgICAgICAgICAgIFNlZSBodHRwczovL3Jhdy5naXRodWIuY29t L2VtYmVyanMvZW1iZXIuanMvbWFzdGVyL0xJQ0VOU0UKICogQHZlcnNpb24g ICAxLjYuMC1iZXRhLjErY2FuYXJ5LmY3OTdjNmQ1CiAqLwoKCihmdW5jdGlv bigpIHsKdmFyIGRlZmluZSwgcmVxdWlyZU1vZHVsZSwgcmVxdWlyZSwgcmVx dWlyZWpzOwoKKGZ1bmN0aW9uKCkgewogIHZhciByZWdpc3RyeSA9IHt9LCBz ZWVuID0ge307CgogIGRlZmluZSA9IGZ1bmN0aW9uKG5hbWUsIGRlcHMsIGNh bGxiYWNrKSB7CiAgICByZWdpc3RyeVtuYW1lXSA9IHsgZGVwczogZGVwcywg Y2FsbGJhY2s6IGNhbGxiYWNrIH07CiAgfTsKCiAgcmVxdWlyZWpzID0gcmVx dWlyZSA9IHJlcXVpcmVNb2R1bGUgPSBmdW5jdGlvbihuYW1lKSB7CiAgcmVx dWlyZWpzLl9lYWtfc2VlbiA9IHJlZ2lzdHJ5OwoKICAgIGlmIChzZWVuW25h bWVdKSB7IHJldHVybiBzZWVuW25hbWVdOyB9CiAgICBzZWVuW25hbWVdID0g e307CgogICAgaWYgKCFyZWdpc3RyeVtuYW1lXSkgewogICAgICB0aHJvdyBu ZXcgRXJyb3IoIkNvdWxkIG5vdCBmaW5kIG1vZHVsZSAiICsgbmFtZSk7CiAg ICB9CgogICAgdmFyIG1vZCA9IHJlZ2lzdHJ5W25hbWVdLAogICAgICAgIGRl cHMgPSBtb2QuZGVwcywKICAgICAgICBjYWxsYmFjayA9IG1vZC5jYWxsYmFj aywKICAgICAgICByZWlmaWVkID0gW10sCiAgICAgICAgZXhwb3J0czsKCiAg ICBmb3IgKHZhciBpPTAsIGw9ZGVwcy5sZW5ndGg7IGk8bDsgaSsrKSB7CiAg ICAgIGlmIChkZXBzW2ldID09PSAnZXhwb3J0cycpIHsKICAgICAgICByZWlm aWVkLnB1c2goZXhwb3J0cyA9IHt9KTsKICAgICAgfSBlbHNlIHsKICAgICAg ICByZWlmaWVkLnB1c2gocmVxdWlyZU1vZHVsZShyZXNvbHZlKGRlcHNbaV0p KSk7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgdmFsdWUgPSBjYWxsYmFjay5h cHBseSh0aGlzLCByZWlmaWVkKTsKICAgIHJldHVybiBzZWVuW25hbWVdID0g ZXhwb3J0cyB8fCB2YWx1ZTsKCiAgICBmdW5jdGlvbiByZXNvbHZlKGNoaWxk KSB7CiAgICAgIGlmIChjaGlsZC5jaGFyQXQoMCkgIT09ICcuJykgeyByZXR1 cm4gY2hpbGQ7IH0KICAgICAgdmFyIHBhcnRzID0gY2hpbGQuc3BsaXQoIi8i KTsKICAgICAgdmFyIHBhcmVudEJhc2UgPSBuYW1lLnNwbGl0KCIvIikuc2xp Y2UoMCwgLTEpOwoKICAgICAgZm9yICh2YXIgaT0wLCBsPXBhcnRzLmxlbmd0 aDsgaTxsOyBpKyspIHsKICAgICAgICB2YXIgcGFydCA9IHBhcnRzW2ldOwoK ICAgICAgICBpZiAocGFydCA9PT0gJy4uJykgeyBwYXJlbnRCYXNlLnBvcCgp OyB9CiAgICAgICAgZWxzZSBpZiAocGFydCA9PT0gJy4nKSB7IGNvbnRpbnVl OyB9CiAgICAgICAgZWxzZSB7IHBhcmVudEJhc2UucHVzaChwYXJ0KTsgfQog ICAgICB9CgogICAgICByZXR1cm4gcGFyZW50QmFzZS5qb2luKCIvIik7CiAg ICB9CiAgfTsKfSkoKTsKKGZ1bmN0aW9uKCkgewovKmdsb2JhbHMgRW06dHJ1 ZSBFTlYgRW1iZXJFTlYgTWV0YW1vcnBoRU5WOnRydWUgKi8KCi8qKgpAbW9k dWxlIGVtYmVyCkBzdWJtb2R1bGUgZW1iZXItbWV0YWwKKi8KCi8qKgogIEFs bCBFbWJlciBtZXRob2RzIGFuZCBmdW5jdGlvbnMgYXJlIGRlZmluZWQgaW5z aWRlIG9mIHRoaXMgbmFtZXNwYWNlLiBZb3UKICBnZW5lcmFsbHkgc2hvdWxk IG5vdCBhZGQgbmV3IHByb3BlcnRpZXMgdG8gdGhpcyBuYW1lc3BhY2UgYXMg aXQgbWF5IGJlCiAgb3ZlcndyaXR0ZW4gYnkgZnV0dXJlIHZlcnNpb25zIG9m IEVtYmVyLgoKICBZb3UgY2FuIGFsc28gdXNlIHRoZSBzaG9ydGhhbmQgYEVt YCBpbnN0ZWFkIG9mIGBFbWJlcmAuCgogIEVtYmVyLVJ1bnRpbWUgaXMgYSBm cmFtZXdvcmsgdGhhdCBwcm92aWRlcyBjb3JlIGZ1bmN0aW9ucyBmb3IgRW1i ZXIgaW5jbHVkaW5nCiAgY3Jvc3MtcGxhdGZvcm0gZnVuY3Rpb25zLCBzdXBw b3J0IGZvciBwcm9wZXJ0eSBvYnNlcnZpbmcgYW5kIG9iamVjdHMuIEl0cwog IGZvY3VzIGlzIG9uIHNtYWxsIHNpemUgYW5kIHBlcmZvcm1hbmNlLiBZb3Ug Y2FuIHVzZSB0aGlzIGluIHBsYWNlIG9mIG9yCiAgYWxvbmctc2lkZSBvdGhl ciBjcm9zcy1wbGF0Zm9ybSBsaWJyYXJpZXMgc3VjaCBhcyBqUXVlcnkuCgog IFRoZSBjb3JlIFJ1bnRpbWUgZnJhbWV3b3JrIGlzIGJhc2VkIG9uIHRoZSBq UXVlcnkgQVBJIHdpdGggYSBudW1iZXIgb2YKICBwZXJmb3JtYW5jZSBvcHRp bWl6YXRpb25zLgoKICBAY2xhc3MgRW1iZXIKICBAc3RhdGljCiAgQHZlcnNp b24gMS42LjAtYmV0YS4xK2NhbmFyeS5mNzk3YzZkNQoqLwoKaWYgKCd1bmRl ZmluZWQnID09PSB0eXBlb2YgRW1iZXIpIHsKICAvLyBDcmVhdGUgY29yZSBv YmplY3QuIE1ha2UgaXQgYWN0IGxpa2UgYW4gaW5zdGFuY2Ugb2YgRW1iZXIu TmFtZXNwYWNlIHNvIHRoYXQKICAvLyBvYmplY3RzIGFzc2lnbmVkIHRvIGl0 IGFyZSBnaXZlbiBhIHNhbmUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgogIEVt YmVyID0ge307Cn0KCi8vIERlZmF1bHQgaW1wb3J0cywgZXhwb3J0cyBhbmQg bG9va3VwIHRvIHRoZSBnbG9iYWwgb2JqZWN0Owp2YXIgaW1wb3J0cyA9IEVt YmVyLmltcG9ydHMgPSBFbWJlci5pbXBvcnRzIHx8IHRoaXM7CnZhciBleHBv cnRzID0gRW1iZXIuZXhwb3J0cyA9IEVtYmVyLmV4cG9ydHMgfHwgdGhpczsK dmFyIGxvb2t1cCAgPSBFbWJlci5sb29rdXAgID0gRW1iZXIubG9va3VwICB8 fCB0aGlzOwoKLy8gYWxpYXNlcyBuZWVkZWQgdG8ga2VlcCBtaW5pZmllcnMg ZnJvbSByZW1vdmluZyB0aGUgZ2xvYmFsIGNvbnRleHQKZXhwb3J0cy5FbSA9 IGV4cG9ydHMuRW1iZXIgPSBFbSA9IEVtYmVyOwoKLy8gTWFrZSBzdXJlIHRo ZXNlIGFyZSBzZXQgd2hldGhlciBFbWJlciB3YXMgYWxyZWFkeSBkZWZpbmVk IG9yIG5vdAoKRW1iZXIuaXNOYW1lc3BhY2UgPSB0cnVlOwoKRW1iZXIudG9T dHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuICJFbWJlciI7IH07CgoKLyoq CiAgQHByb3BlcnR5IFZFUlNJT04KICBAdHlwZSBTdHJpbmcKICBAZGVmYXVs dCAnMS42LjAtYmV0YS4xK2NhbmFyeS5mNzk3YzZkNScKICBAc3RhdGljCiov CkVtYmVyLlZFUlNJT04gPSAnMS42LjAtYmV0YS4xK2NhbmFyeS5mNzk3YzZk NSc7CgovKioKICBTdGFuZGFyZCBlbnZpcm9ubWVudGFsIHZhcmlhYmxlcy4g WW91IGNhbiBkZWZpbmUgdGhlc2UgaW4gYSBnbG9iYWwgYEVtYmVyRU5WYAog IHZhcmlhYmxlIGJlZm9yZSBsb2FkaW5nIEVtYmVyIHRvIGNvbnRyb2wgdmFy aW91cyBjb25maWd1cmF0aW9uIHNldHRpbmdzLgoKICBGb3IgYmFja3dhcmRz IGNvbXBhdGliaWxpdHkgd2l0aCBlYXJsaWVyIHZlcnNpb25zIG9mIEVtYmVy IHRoZSBnbG9iYWwgYEVOVmAKICB2YXJpYWJsZSB3aWxsIGJlIHVzZWQgaWYg YEVtYmVyRU5WYCBpcyBub3QgZGVmaW5lZC4KCiAgQHByb3BlcnR5IEVOVgog IEB0eXBlIEhhc2gKKi8KCi8vIFRoaXMgbmVlZHMgdG8gYmUga2VwdCBpbiBz eW5jIHdpdGggdGhlIGxvZ2ljIGluCi8vIGBwYWNrYWdlcy9lbWJlci1kZWJ1 Zy9saWIvbWFpbi5qc2AuCmlmIChFbWJlci5FTlYpIHsKICAvLyBkbyBub3Ro aW5nIGlmIEVtYmVyLkVOViBpcyBhbHJlYWR5IHNldHVwCn0gZWxzZSBpZiAo J3VuZGVmaW5lZCcgIT09IHR5cGVvZiBFbWJlckVOVikgewogIEVtYmVyLkVO ViA9IEVtYmVyRU5WOwp9IGVsc2UgaWYoJ3VuZGVmaW5lZCcgIT09IHR5cGVv ZiBFTlYpIHsKICBFbWJlci5FTlYgPSBFTlY7Cn0gZWxzZSB7CiAgRW1iZXIu RU5WID0ge307Cn0KCkVtYmVyLmNvbmZpZyA9IEVtYmVyLmNvbmZpZyB8fCB7 fTsKCi8vIFdlIGRpc2FibGUgdGhlIFJBTkdFIEFQSSBieSBkZWZhdWx0IGZv ciBwZXJmb3JtYW5jZSByZWFzb25zCmlmICgndW5kZWZpbmVkJyA9PT0gdHlw ZW9mIEVtYmVyLkVOVi5ESVNBQkxFX1JBTkdFX0FQSSkgewogIEVtYmVyLkVO Vi5ESVNBQkxFX1JBTkdFX0FQSSA9IHRydWU7Cn0KCmlmICgidW5kZWZpbmVk IiA9PT0gdHlwZW9mIE1ldGFtb3JwaEVOVikgewogIGV4cG9ydHMuTWV0YW1v cnBoRU5WID0ge307Cn0KCk1ldGFtb3JwaEVOVi5ESVNBQkxFX1JBTkdFX0FQ SSA9IEVtYmVyLkVOVi5ESVNBQkxFX1JBTkdFX0FQSTsKCi8qKgogIEhhc2gg b2YgZW5hYmxlZCBDYW5hcnkgZmVhdHVyZXMuIEFkZCB0byBiZWZvcmUgY3Jl YXRpbmcgeW91ciBhcHBsaWNhdGlvbi4KCiAgWW91IGNhbiBhbHNvIGRlZmlu ZSBgRU5WLkZFQVRVUkVTYCBpZiB5b3UgbmVlZCB0byBlbmFibGUgZmVhdHVy ZXMgZmxhZ2dlZCBhdCBydW50aW1lLgoKICBAcHJvcGVydHkgRkVBVFVSRVMK ICBAdHlwZSBIYXNoCiovCgpFbWJlci5GRUFUVVJFUyA9IEVtYmVyLkVOVi5G RUFUVVJFUyB8fCB7fTsKCi8qKgogIFRlc3QgdGhhdCBhIGZlYXR1cmUgaXMg ZW5hYmxlZC4gUGFyc2VkIGJ5IEVtYmVyJ3MgYnVpbGQgdG9vbHMgdG8gbGVh dmUKICBleHBlcmltZW50YWwgZmVhdHVyZXMgb3V0IG9mIGJldGEvc3RhYmxl IGJ1aWxkcy4KCiAgWW91IGNhbiBkZWZpbmUgdGhlIGZvbGxvd2luZyBjb25m aWd1cmF0aW9uIG9wdGlvbnM6CgogICogYEVOVi5FTkFCTEVfQUxMX0ZFQVRV UkVTYCAtIGZvcmNlIGFsbCBmZWF0dXJlcyB0byBiZSBlbmFibGVkLgogICog YEVOVi5FTkFCTEVfT1BUSU9OQUxfRkVBVFVSRVNgIC0gZW5hYmxlIGFueSBm ZWF0dXJlcyB0aGF0IGhhdmUgbm90IGJlZW4gZXhwbGljaXRseQogICAgZW5h YmxlZC9kaXNhYmxlZC4KCiAgQG1ldGhvZCBpc0VuYWJsZWQKICBAcGFyYW0g e3N0cmluZ30gZmVhdHVyZQoqLwoKRW1iZXIuRkVBVFVSRVMuaXNFbmFibGVk ID0gZnVuY3Rpb24oZmVhdHVyZSkgewogIHZhciBmZWF0dXJlVmFsdWUgPSBF bWJlci5GRUFUVVJFU1tmZWF0dXJlXTsKCiAgaWYgKEVtYmVyLkVOVi5FTkFC TEVfQUxMX0ZFQVRVUkVTKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9IGVsc2Ug aWYgKGZlYXR1cmVWYWx1ZSA9PT0gdHJ1ZSB8fCBmZWF0dXJlVmFsdWUgPT09 IGZhbHNlIHx8IGZlYXR1cmVWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICBy ZXR1cm4gZmVhdHVyZVZhbHVlOwogIH0gZWxzZSBpZiAoRW1iZXIuRU5WLkVO QUJMRV9PUFRJT05BTF9GRUFUVVJFUykgewogICAgcmV0dXJuIHRydWU7CiAg fSBlbHNlIHsKICAgIHJldHVybiBmYWxzZTsKICB9Cn07CgovLyAuLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uCi8vIEJPT1RTVFJBUAovLwoKLyoqCiAgRGV0ZXJtaW5lcyB3aGV0 aGVyIEVtYmVyIHNob3VsZCBlbmhhbmNlcyBzb21lIGJ1aWx0LWluIG9iamVj dCBwcm90b3R5cGVzIHRvCiAgcHJvdmlkZSBhIG1vcmUgZnJpZW5kbHkgQVBJ LiBJZiBlbmFibGVkLCBhIGZldyBtZXRob2RzIHdpbGwgYmUgYWRkZWQgdG8K ICBgRnVuY3Rpb25gLCBgU3RyaW5nYCwgYW5kIGBBcnJheWAuIGBPYmplY3Qu cHJvdG90eXBlYCB3aWxsIG5vdCBiZSBlbmhhbmNlZCwKICB3aGljaCBpcyB0 aGUgb25lIHRoYXQgY2F1c2VzIG1vc3QgdHJvdWJsZSBmb3IgcGVvcGxlLgoK ICBJbiBnZW5lcmFsIHdlIHJlY29tbWVuZCBsZWF2aW5nIHRoaXMgb3B0aW9u IHNldCB0byB0cnVlIHNpbmNlIGl0IHJhcmVseQogIGNvbmZsaWN0cyB3aXRo IG90aGVyIGNvZGUuIElmIHlvdSBuZWVkIHRvIHR1cm4gaXQgb2ZmIGhvd2V2 ZXIsIHlvdSBjYW4KICBkZWZpbmUgYW4gYEVOVi5FWFRFTkRfUFJPVE9UWVBF U2AgY29uZmlnIHRvIGRpc2FibGUgaXQuCgogIEBwcm9wZXJ0eSBFWFRFTkRf UFJPVE9UWVBFUwogIEB0eXBlIEJvb2xlYW4KICBAZGVmYXVsdCB0cnVlCiov CkVtYmVyLkVYVEVORF9QUk9UT1RZUEVTID0gRW1iZXIuRU5WLkVYVEVORF9Q Uk9UT1RZUEVTOwoKaWYgKHR5cGVvZiBFbWJlci5FWFRFTkRfUFJPVE9UWVBF UyA9PT0gJ3VuZGVmaW5lZCcpIHsKICBFbWJlci5FWFRFTkRfUFJPVE9UWVBF UyA9IHRydWU7Cn0KCi8qKgogIERldGVybWluZXMgd2hldGhlciBFbWJlciBs b2dzIGEgZnVsbCBzdGFjayB0cmFjZSBkdXJpbmcgZGVwcmVjYXRpb24gd2Fy bmluZ3MKCiAgQHByb3BlcnR5IExPR19TVEFDS1RSQUNFX09OX0RFUFJFQ0FU SU9OCiAgQHR5cGUgQm9vbGVhbgogIEBkZWZhdWx0IHRydWUKKi8KRW1iZXIu TE9HX1NUQUNLVFJBQ0VfT05fREVQUkVDQVRJT04gPSAoRW1iZXIuRU5WLkxP R19TVEFDS1RSQUNFX09OX0RFUFJFQ0FUSU9OICE9PSBmYWxzZSk7CgovKioK ICBEZXRlcm1pbmVzIHdoZXRoZXIgRW1iZXIgc2hvdWxkIGFkZCBFQ01BU2Ny aXB0IDUgc2hpbXMgdG8gb2xkZXIgYnJvd3NlcnMuCgogIEBwcm9wZXJ0eSBT SElNX0VTNQogIEB0eXBlIEJvb2xlYW4KICBAZGVmYXVsdCBFbWJlci5FWFRF TkRfUFJPVE9UWVBFUwoqLwpFbWJlci5TSElNX0VTNSA9IChFbWJlci5FTlYu U0hJTV9FUzUgPT09IGZhbHNlKSA/IGZhbHNlIDogRW1iZXIuRVhURU5EX1BS T1RPVFlQRVM7CgovKioKICBEZXRlcm1pbmVzIHdoZXRoZXIgRW1iZXIgbG9n cyBpbmZvIGFib3V0IHZlcnNpb24gb2YgdXNlZCBsaWJyYXJpZXMKCiAgQHBy b3BlcnR5IExPR19WRVJTSU9OCiAgQHR5cGUgQm9vbGVhbgogIEBkZWZhdWx0 IHRydWUKKi8KRW1iZXIuTE9HX1ZFUlNJT04gPSAoRW1iZXIuRU5WLkxPR19W RVJTSU9OID09PSBmYWxzZSkgPyBmYWxzZSA6IHRydWU7CgovKioKICBFbXB0 eSBmdW5jdGlvbi4gVXNlZnVsIGZvciBzb21lIG9wZXJhdGlvbnMuIEFsd2F5 cyByZXR1cm5zIGB0aGlzYC4KCiAgQG1ldGhvZCBLCiAgQHByaXZhdGUKICBA cmV0dXJuIHtPYmplY3R9CiovCkVtYmVyLksgPSBmdW5jdGlvbigpIHsgcmV0 dXJuIHRoaXM7IH07CgoKLy8gU3R1YiBvdXQgdGhlIG1ldGhvZHMgZGVmaW5l ZCBieSB0aGUgZW1iZXItZGVidWcgcGFja2FnZSBpbiBjYXNlIGl0J3Mgbm90 IGxvYWRlZAoKaWYgKCd1bmRlZmluZWQnID09PSB0eXBlb2YgRW1iZXIuYXNz ZXJ0KSB7IEVtYmVyLmFzc2VydCA9IEVtYmVyLks7IH0KaWYgKCd1bmRlZmlu ZWQnID09PSB0eXBlb2YgRW1iZXIud2FybikgeyBFbWJlci53YXJuID0gRW1i ZXIuSzsgfQppZiAoJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiBFbWJlci5kZWJ1 ZykgeyBFbWJlci5kZWJ1ZyA9IEVtYmVyLks7IH0KaWYgKCd1bmRlZmluZWQn ID09PSB0eXBlb2YgRW1iZXIuZGVwcmVjYXRlKSB7IEVtYmVyLmRlcHJlY2F0 ZSA9IEVtYmVyLks7IH0KaWYgKCd1bmRlZmluZWQnID09PSB0eXBlb2YgRW1i ZXIuZGVwcmVjYXRlRnVuYykgewogIEVtYmVyLmRlcHJlY2F0ZUZ1bmMgPSBm dW5jdGlvbihfLCBmdW5jKSB7IHJldHVybiBmdW5jOyB9Owp9CgovKioKICBQ cmV2aW91c2x5IHdlIHVzZWQgYEVtYmVyLiQudXVpZGAsIGhvd2V2ZXIgYCQu dXVpZGAgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tCiAgalF1ZXJ5IG1hc3Rlci4g V2UnbGwganVzdCBib290c3RyYXAgb3VyIG93biB1dWlkIG5vdy4KCiAgQHBy b3BlcnR5IHV1aWQKICBAdHlwZSBOdW1iZXIKICBAcHJpdmF0ZQoqLwpFbWJl ci51dWlkID0gMDsKCi8qKgogIE1lcmdlIHRoZSBjb250ZW50cyBvZiB0d28g b2JqZWN0cyB0b2dldGhlciBpbnRvIHRoZSBmaXJzdCBvYmplY3QuCgogIGBg YGphdmFzY3JpcHQKICBFbWJlci5tZXJnZSh7Zmlyc3Q6ICdUb20nfSwge2xh c3Q6ICdEYWxlJ30pOyAvLyB7Zmlyc3Q6ICdUb20nLCBsYXN0OiAnRGFsZSd9 CiAgdmFyIGEgPSB7Zmlyc3Q6ICdZZWh1ZGEnfSwgYiA9IHtsYXN0OiAnS2F0 eid9OwogIEVtYmVyLm1lcmdlKGEsIGIpOyAvLyBhID09IHtmaXJzdDogJ1ll aHVkYScsIGxhc3Q6ICdLYXR6J30sIGIgPT0ge2xhc3Q6ICdLYXR6J30KICBg YGAKCiAgQG1ldGhvZCBtZXJnZQogIEBmb3IgRW1iZXIKICBAcGFyYW0ge09i amVjdH0gb3JpZ2luYWwgVGhlIG9iamVjdCB0byBtZXJnZSBpbnRvCiAgQHBh cmFtIHtPYmplY3R9IHVwZGF0ZXMgVGhlIG9iamVjdCB0byBjb3B5IHByb3Bl cnRpZXMgZnJvbQogIEByZXR1cm4ge09iamVjdH0KKi8KRW1iZXIubWVyZ2Ug PSBmdW5jdGlvbihvcmlnaW5hbCwgdXBkYXRlcykgewogIGZvciAodmFyIHBy b3AgaW4gdXBkYXRlcykgewogICAgaWYgKCF1cGRhdGVzLmhhc093blByb3Bl cnR5KHByb3ApKSB7IGNvbnRpbnVlOyB9CiAgICBvcmlnaW5hbFtwcm9wXSA9 IHVwZGF0ZXNbcHJvcF07CiAgfQogIHJldHVybiBvcmlnaW5hbDsKfTsKCi8q KgogIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc2VkIHZhbHVlIGlzIG51bGwg b3IgdW5kZWZpbmVkLiBUaGlzIGF2b2lkcyBlcnJvcnMKICBmcm9tIEpTTGlu dCBjb21wbGFpbmluZyBhYm91dCB1c2Ugb2YgPT0sIHdoaWNoIGNhbiBiZSB0 ZWNobmljYWxseQogIGNvbmZ1c2luZy4KCiAgYGBgamF2YXNjcmlwdAogIEVt YmVyLmlzTm9uZSgpOyAgICAgICAgICAgICAgLy8gdHJ1ZQogIEVtYmVyLmlz Tm9uZShudWxsKTsgICAgICAgICAgLy8gdHJ1ZQogIEVtYmVyLmlzTm9uZSh1 bmRlZmluZWQpOyAgICAgLy8gdHJ1ZQogIEVtYmVyLmlzTm9uZSgnJyk7ICAg ICAgICAgICAgLy8gZmFsc2UKICBFbWJlci5pc05vbmUoW10pOyAgICAgICAg ICAgIC8vIGZhbHNlCiAgRW1iZXIuaXNOb25lKGZ1bmN0aW9uKCkge30pOyAg Ly8gZmFsc2UKICBgYGAKCiAgQG1ldGhvZCBpc05vbmUKICBAZm9yIEVtYmVy CiAgQHBhcmFtIHtPYmplY3R9IG9iaiBWYWx1ZSB0byB0ZXN0CiAgQHJldHVy biB7Qm9vbGVhbn0KKi8KRW1iZXIuaXNOb25lID0gZnVuY3Rpb24ob2JqKSB7 CiAgcmV0dXJuIG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZDsK fTsKRW1iZXIubm9uZSA9IEVtYmVyLmRlcHJlY2F0ZUZ1bmMoIkVtYmVyLm5v bmUgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBFbWJlci5pc05vbmUgaW5z dGVhZC4iLCBFbWJlci5pc05vbmUpOwoKLyoqCiAgVmVyaWZpZXMgdGhhdCBh IHZhbHVlIGlzIGBudWxsYCBvciBhbiBlbXB0eSBzdHJpbmcsIGVtcHR5IGFy cmF5LAogIG9yIGVtcHR5IGZ1bmN0aW9uLgoKICBDb25zdHJhaW5zIHRoZSBy dWxlcyBvbiBgRW1iZXIuaXNOb25lYCBieSByZXR1cm5pbmcgZmFsc2UgZm9y IGVtcHR5CiAgc3RyaW5nIGFuZCBlbXB0eSBhcnJheXMuCgogIGBgYGphdmFz Y3JpcHQKICBFbWJlci5pc0VtcHR5KCk7ICAgICAgICAgICAgICAgIC8vIHRy dWUKICBFbWJlci5pc0VtcHR5KG51bGwpOyAgICAgICAgICAgIC8vIHRydWUK ICBFbWJlci5pc0VtcHR5KHVuZGVmaW5lZCk7ICAgICAgIC8vIHRydWUKICBF bWJlci5pc0VtcHR5KCcnKTsgICAgICAgICAgICAgIC8vIHRydWUKICBFbWJl ci5pc0VtcHR5KFtdKTsgICAgICAgICAgICAgIC8vIHRydWUKICBFbWJlci5p c0VtcHR5KCdBZGFtIEhhd2tpbnMnKTsgIC8vIGZhbHNlCiAgRW1iZXIuaXNF bXB0eShbMCwxLDJdKTsgICAgICAgICAvLyBmYWxzZQogIGBgYAoKICBAbWV0 aG9kIGlzRW1wdHkKICBAZm9yIEVtYmVyCiAgQHBhcmFtIHtPYmplY3R9IG9i aiBWYWx1ZSB0byB0ZXN0CiAgQHJldHVybiB7Qm9vbGVhbn0KKi8KRW1iZXIu aXNFbXB0eSA9IGZ1bmN0aW9uKG9iaikgewogIHJldHVybiBFbWJlci5pc05v bmUob2JqKSB8fCAob2JqLmxlbmd0aCA9PT0gMCAmJiB0eXBlb2Ygb2JqICE9 PSAnZnVuY3Rpb24nKSB8fCAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYg RW1iZXIuZ2V0KG9iaiwgJ2xlbmd0aCcpID09PSAwKTsKfTsKRW1iZXIuZW1w dHkgPSBFbWJlci5kZXByZWNhdGVGdW5jKCJFbWJlci5lbXB0eSBpcyBkZXBy ZWNhdGVkLiBQbGVhc2UgdXNlIEVtYmVyLmlzRW1wdHkgaW5zdGVhZC4iLCBF bWJlci5pc0VtcHR5KTsKCgogIC8qKgogICAgQSB2YWx1ZSBpcyBibGFuayBp ZiBpdCBpcyBlbXB0eSBvciBhIHdoaXRlc3BhY2Ugc3RyaW5nLgoKICAgIGBg YGphdmFzY3JpcHQKICAgIEVtYmVyLmlzQmxhbmsoKTsgICAgICAgICAgICAg ICAgLy8gdHJ1ZQogICAgRW1iZXIuaXNCbGFuayhudWxsKTsgICAgICAgICAg ICAvLyB0cnVlCiAgICBFbWJlci5pc0JsYW5rKHVuZGVmaW5lZCk7ICAgICAg IC8vIHRydWUKICAgIEVtYmVyLmlzQmxhbmsoJycpOyAgICAgICAgICAgICAg Ly8gdHJ1ZQogICAgRW1iZXIuaXNCbGFuayhbXSk7ICAgICAgICAgICAgICAv LyB0cnVlCiAgICBFbWJlci5pc0JsYW5rKCdcblx0Jyk7ICAgICAgICAgIC8v IHRydWUKICAgIEVtYmVyLmlzQmxhbmsoJyAgJyk7ICAgICAgICAgICAgLy8g dHJ1ZQogICAgRW1iZXIuaXNCbGFuayh7fSk7ICAgICAgICAgICAgICAvLyBm YWxzZQogICAgRW1iZXIuaXNCbGFuaygnXG5cdCBIZWxsbycpOyAgICAvLyBm YWxzZQogICAgRW1iZXIuaXNCbGFuaygnSGVsbG8gd29ybGQnKTsgICAvLyBm YWxzZQogICAgRW1iZXIuaXNCbGFuayhbMSwyLDNdKTsgICAgICAgICAvLyBm YWxzZQogICAgYGBgCgogICAgQG1ldGhvZCBpc0JsYW5rCiAgICBAZm9yIEVt YmVyCiAgICBAcGFyYW0ge09iamVjdH0gb2JqIFZhbHVlIHRvIHRlc3QKICAg IEByZXR1cm4ge0Jvb2xlYW59CiAgKi8KICBFbWJlci5pc0JsYW5rID0gZnVu Y3Rpb24ob2JqKSB7CiAgICByZXR1cm4gRW1iZXIuaXNFbXB0eShvYmopIHx8 ICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJyAmJiBvYmoubWF0Y2goL1xTLykg PT09IG51bGwpOwogIH07CgoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewovKmds b2JhbHMgTm9kZSAqLwovKioKQG1vZHVsZSBlbWJlci1tZXRhbAoqLwoKLyoq CiAgUGxhdGZvcm0gc3BlY2lmaWMgbWV0aG9kcyBhbmQgZmVhdHVyZSBkZXRl Y3RvcnMgbmVlZGVkIGJ5IHRoZSBmcmFtZXdvcmsuCgogIEBjbGFzcyBwbGF0 Zm9ybQogIEBuYW1lc3BhY2UgRW1iZXIKICBAc3RhdGljCiovCnZhciBwbGF0 Zm9ybSA9IEVtYmVyLnBsYXRmb3JtID0ge307CgoKLyoqCiAgSWRlbnRpY2Fs IHRvIGBPYmplY3QuY3JlYXRlKClgLiBJbXBsZW1lbnRzIGlmIG5vdCBhdmFp bGFibGUgbmF0aXZlbHkuCgogIEBtZXRob2QgY3JlYXRlCiAgQGZvciBFbWJl cgoqLwpFbWJlci5jcmVhdGUgPSBPYmplY3QuY3JlYXRlOwoKLy8gSUU4IGhh cyBPYmplY3QuY3JlYXRlIGJ1dCBpdCBjb3VsZG4ndCB0cmVhdCBwcm9wZXJ0 eSBkZXNjcmlwdG9ycy4KaWYgKEVtYmVyLmNyZWF0ZSkgewogIGlmIChFbWJl ci5jcmVhdGUoe2E6IDF9LCB7YToge3ZhbHVlOiAyfX0pLmEgIT09IDIpIHsK ICAgIEVtYmVyLmNyZWF0ZSA9IG51bGw7CiAgfQp9CgovLyBTVFVCX09CSkVD VF9DUkVBVEUgYWxsb3dzIHVzIHRvIG92ZXJyaWRlIG90aGVyIGxpYnJhcmll cyB0aGF0IHN0dWIKLy8gT2JqZWN0LmNyZWF0ZSBkaWZmZXJlbnQgdGhhbiB3 ZSB3b3VsZCBwcmVmZXIKaWYgKCFFbWJlci5jcmVhdGUgfHwgRW1iZXIuRU5W LlNUVUJfT0JKRUNUX0NSRUFURSkgewogIHZhciBLID0gZnVuY3Rpb24oKSB7 fTsKCiAgRW1iZXIuY3JlYXRlID0gZnVuY3Rpb24ob2JqLCBwcm9wcykgewog ICAgSy5wcm90b3R5cGUgPSBvYmo7CiAgICBvYmogPSBuZXcgSygpOwogICAg aWYgKHByb3BzKSB7CiAgICAgIEsucHJvdG90eXBlID0gb2JqOwogICAgICBm b3IgKHZhciBwcm9wIGluIHByb3BzKSB7CiAgICAgICAgSy5wcm90b3R5cGVb cHJvcF0gPSBwcm9wc1twcm9wXS52YWx1ZTsKICAgICAgfQogICAgICBvYmog PSBuZXcgSygpOwogICAgfQogICAgSy5wcm90b3R5cGUgPSBudWxsOwoKICAg IHJldHVybiBvYmo7CiAgfTsKCiAgRW1iZXIuY3JlYXRlLmlzU2ltdWxhdGVk ID0gdHJ1ZTsKfQoKdmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmlu ZVByb3BlcnR5Owp2YXIgY2FuUmVkZWZpbmVQcm9wZXJ0aWVzLCBjYW5EZWZp bmVQcm9wZXJ0eU9uRE9NOwoKLy8gQ2F0Y2ggSUU4IHdoZXJlIE9iamVjdC5k ZWZpbmVQcm9wZXJ0eSBleGlzdHMgYnV0IG9ubHkgd29ya3Mgb24gRE9NIGVs ZW1lbnRzCmlmIChkZWZpbmVQcm9wZXJ0eSkgewogIHRyeSB7CiAgICBkZWZp bmVQcm9wZXJ0eSh7fSwgJ2EnLHtnZXQ6ZnVuY3Rpb24oKSB7fX0pOwogIH0g Y2F0Y2ggKGUpIHsKICAgIGRlZmluZVByb3BlcnR5ID0gbnVsbDsKICB9Cn0K CmlmIChkZWZpbmVQcm9wZXJ0eSkgewogIC8vIERldGVjdHMgYSBidWcgaW4g QW5kcm9pZCA8My4yIHdoZXJlIHlvdSBjYW5ub3QgcmVkZWZpbmUgYSBwcm9w ZXJ0eSB1c2luZwogIC8vIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBvbmNlIGFj Y2Vzc29ycyBoYXZlIGFscmVhZHkgYmVlbiBzZXQuCiAgY2FuUmVkZWZpbmVQ cm9wZXJ0aWVzID0gKGZ1bmN0aW9uKCkgewogICAgdmFyIG9iaiA9IHt9OwoK ICAgIGRlZmluZVByb3BlcnR5KG9iaiwgJ2EnLCB7CiAgICAgIGNvbmZpZ3Vy YWJsZTogdHJ1ZSwKICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgZ2V0 OiBmdW5jdGlvbigpIHsgfSwKICAgICAgc2V0OiBmdW5jdGlvbigpIHsgfQog ICAgfSk7CgogICAgZGVmaW5lUHJvcGVydHkob2JqLCAnYScsIHsKICAgICAg Y29uZmlndXJhYmxlOiB0cnVlLAogICAgICBlbnVtZXJhYmxlOiB0cnVlLAog ICAgICB3cml0YWJsZTogdHJ1ZSwKICAgICAgdmFsdWU6IHRydWUKICAgIH0p OwoKICAgIHJldHVybiBvYmouYSA9PT0gdHJ1ZTsKICB9KSgpOwoKICAvLyBU aGlzIGlzIGZvciBTYWZhcmkgNS4wLCB3aGljaCBzdXBwb3J0cyBPYmplY3Qu ZGVmaW5lUHJvcGVydHksIGJ1dCBub3QKICAvLyBvbiBET00gbm9kZXMuCiAg Y2FuRGVmaW5lUHJvcGVydHlPbkRPTSA9IChmdW5jdGlvbigpIHsKICAgIHRy eSB7CiAgICAgIGRlZmluZVByb3BlcnR5KGRvY3VtZW50LmNyZWF0ZUVsZW1l bnQoJ2RpdicpLCAnZGVmaW5lUHJvcGVydHlPbkRPTScsIHt9KTsKICAgICAg cmV0dXJuIHRydWU7CiAgICB9IGNhdGNoKGUpIHsgfQoKICAgIHJldHVybiBm YWxzZTsKICB9KSgpOwoKICBpZiAoIWNhblJlZGVmaW5lUHJvcGVydGllcykg ewogICAgZGVmaW5lUHJvcGVydHkgPSBudWxsOwogIH0gZWxzZSBpZiAoIWNh bkRlZmluZVByb3BlcnR5T25ET00pIHsKICAgIGRlZmluZVByb3BlcnR5ID0g ZnVuY3Rpb24ob2JqLCBrZXlOYW1lLCBkZXNjKSB7CiAgICAgIHZhciBpc05v ZGU7CgogICAgICBpZiAodHlwZW9mIE5vZGUgPT09ICJvYmplY3QiKSB7CiAg ICAgICAgaXNOb2RlID0gb2JqIGluc3RhbmNlb2YgTm9kZTsKICAgICAgfSBl bHNlIHsKICAgICAgICBpc05vZGUgPSB0eXBlb2Ygb2JqID09PSAib2JqZWN0 IiAmJiB0eXBlb2Ygb2JqLm5vZGVUeXBlID09PSAibnVtYmVyIiAmJiB0eXBl b2Ygb2JqLm5vZGVOYW1lID09PSAic3RyaW5nIjsKICAgICAgfQoKICAgICAg aWYgKGlzTm9kZSkgewogICAgICAgIC8vIFRPRE86IFNob3VsZCB3ZSBoYXZl IGEgd2FybmluZyBoZXJlPwogICAgICAgIHJldHVybiAob2JqW2tleU5hbWVd ID0gZGVzYy52YWx1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJu IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleU5hbWUsIGRlc2MpOwog ICAgICB9CiAgICB9OwogIH0KfQoKLyoqCkBjbGFzcyBwbGF0Zm9ybQpAbmFt ZXNwYWNlIEVtYmVyCiovCgovKioKICBJZGVudGljYWwgdG8gYE9iamVjdC5k ZWZpbmVQcm9wZXJ0eSgpYC4gSW1wbGVtZW50cyBhcyBtdWNoIGZ1bmN0aW9u YWxpdHkKICBhcyBwb3NzaWJsZSBpZiBub3QgYXZhaWxhYmxlIG5hdGl2ZWx5 LgoKICBAbWV0aG9kIGRlZmluZVByb3BlcnR5CiAgQHBhcmFtIHtPYmplY3R9 IG9iaiBUaGUgb2JqZWN0IHRvIG1vZGlmeQogIEBwYXJhbSB7U3RyaW5nfSBr ZXlOYW1lIHByb3BlcnR5IG5hbWUgdG8gbW9kaWZ5CiAgQHBhcmFtIHtPYmpl Y3R9IGRlc2MgZGVzY3JpcHRvciBoYXNoCiAgQHJldHVybiB7dm9pZH0KKi8K cGxhdGZvcm0uZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eTsKCi8q KgogIFNldCB0byB0cnVlIGlmIHRoZSBwbGF0Zm9ybSBzdXBwb3J0cyBuYXRp dmUgZ2V0dGVycyBhbmQgc2V0dGVycy4KCiAgQHByb3BlcnR5IGhhc1Byb3Bl cnR5QWNjZXNzb3JzCiAgQGZpbmFsCiovCnBsYXRmb3JtLmhhc1Byb3BlcnR5 QWNjZXNzb3JzID0gdHJ1ZTsKCmlmICghcGxhdGZvcm0uZGVmaW5lUHJvcGVy dHkpIHsKICBwbGF0Zm9ybS5oYXNQcm9wZXJ0eUFjY2Vzc29ycyA9IGZhbHNl OwoKICBwbGF0Zm9ybS5kZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uKG9iaiwg a2V5TmFtZSwgZGVzYykgewogICAgaWYgKCFkZXNjLmdldCkgeyBvYmpba2V5 TmFtZV0gPSBkZXNjLnZhbHVlOyB9CiAgfTsKCiAgcGxhdGZvcm0uZGVmaW5l UHJvcGVydHkuaXNTaW11bGF0ZWQgPSB0cnVlOwp9CgppZiAoRW1iZXIuRU5W Lk1BTkRBVE9SWV9TRVRURVIgJiYgIXBsYXRmb3JtLmhhc1Byb3BlcnR5QWNj ZXNzb3JzKSB7CiAgRW1iZXIuRU5WLk1BTkRBVE9SWV9TRVRURVIgPSBmYWxz ZTsKfQoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewovKmpzaGludCBuZXdjYXA6 ZmFsc2UqLwovKioKQG1vZHVsZSBlbWJlci1tZXRhbAoqLwoKLy8gTk9URTog VGhlcmUgaXMgYSBidWcgaW4ganNoaW50IHRoYXQgZG9lc24ndCByZWNvZ25p emUgYE9iamVjdCgpYCB3aXRob3V0IGBuZXdgCi8vIGFzIGJlaW5nIG9rIHVu bGVzcyBib3RoIGBuZXdjYXA6ZmFsc2VgIGFuZCBub3QgYHVzZSBzdHJpY3Rg LgovLyBodHRwczovL2dpdGh1Yi5jb20vanNoaW50L2pzaGludC9pc3N1ZXMv MzkyCgovLyBUZXN0aW5nIHRoaXMgaXMgbm90IGlkZWFsLCBidXQgd2Ugd2Fu dCB0byB1c2UgbmF0aXZlIGZ1bmN0aW9ucwovLyBpZiBhdmFpbGFibGUsIGJ1 dCBub3QgdG8gdXNlIHZlcnNpb25zIGNyZWF0ZWQgYnkgbGlicmFyaWVzIGxp a2UgUHJvdG90eXBlCnZhciBpc05hdGl2ZUZ1bmMgPSBmdW5jdGlvbihmdW5j KSB7CiAgLy8gVGhpcyBzaG91bGQgcHJvYmFibHkgd29yayBpbiBhbGwgYnJv d3NlcnMgbGlrZWx5IHRvIGhhdmUgRVM1IGFycmF5IG1ldGhvZHMKICByZXR1 cm4gZnVuYyAmJiBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChm dW5jKS5pbmRleE9mKCdbbmF0aXZlIGNvZGVdJykgPiAtMTsKfTsKCi8vIEZy b206IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3Jp cHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL2FycmF5L21hcAp2YXIgYXJy YXlNYXAgPSBpc05hdGl2ZUZ1bmMoQXJyYXkucHJvdG90eXBlLm1hcCkgPyBB cnJheS5wcm90b3R5cGUubWFwIDogZnVuY3Rpb24oZnVuIC8qLCB0aGlzcCAq LykgewogIC8vInVzZSBzdHJpY3QiOwoKICBpZiAodGhpcyA9PT0gdm9pZCAw IHx8IHRoaXMgPT09IG51bGwpIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3Io KTsKICB9CgogIHZhciB0ID0gT2JqZWN0KHRoaXMpOwogIHZhciBsZW4gPSB0 Lmxlbmd0aCA+Pj4gMDsKICBpZiAodHlwZW9mIGZ1biAhPT0gImZ1bmN0aW9u IikgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOwogIH0KCiAgdmFyIHJl cyA9IG5ldyBBcnJheShsZW4pOwogIHZhciB0aGlzcCA9IGFyZ3VtZW50c1sx XTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICBpZiAo aSBpbiB0KSB7CiAgICAgIHJlc1tpXSA9IGZ1bi5jYWxsKHRoaXNwLCB0W2ld LCBpLCB0KTsKICAgIH0KICB9CgogIHJldHVybiByZXM7Cn07CgovLyBGcm9t OiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0 L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9hcnJheS9mb3JlYWNoCnZhciBh cnJheUZvckVhY2ggPSBpc05hdGl2ZUZ1bmMoQXJyYXkucHJvdG90eXBlLmZv ckVhY2gpID8gQXJyYXkucHJvdG90eXBlLmZvckVhY2ggOiBmdW5jdGlvbihm dW4gLyosIHRoaXNwICovKSB7CiAgLy8idXNlIHN0cmljdCI7CgogIGlmICh0 aGlzID09PSB2b2lkIDAgfHwgdGhpcyA9PT0gbnVsbCkgewogICAgdGhyb3cg bmV3IFR5cGVFcnJvcigpOwogIH0KCiAgdmFyIHQgPSBPYmplY3QodGhpcyk7 CiAgdmFyIGxlbiA9IHQubGVuZ3RoID4+PiAwOwogIGlmICh0eXBlb2YgZnVu ICE9PSAiZnVuY3Rpb24iKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7 CiAgfQoKICB2YXIgdGhpc3AgPSBhcmd1bWVudHNbMV07CiAgZm9yICh2YXIg aSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgaWYgKGkgaW4gdCkgewogICAg ICBmdW4uY2FsbCh0aGlzcCwgdFtpXSwgaSwgdCk7CiAgICB9CiAgfQp9OwoK dmFyIGFycmF5SW5kZXhPZiA9IGlzTmF0aXZlRnVuYyhBcnJheS5wcm90b3R5 cGUuaW5kZXhPZikgPyBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA6IGZ1bmN0 aW9uIChvYmosIGZyb21JbmRleCkgewogIGlmIChmcm9tSW5kZXggPT09IG51 bGwgfHwgZnJvbUluZGV4ID09PSB1bmRlZmluZWQpIHsgZnJvbUluZGV4ID0g MDsgfQogIGVsc2UgaWYgKGZyb21JbmRleCA8IDApIHsgZnJvbUluZGV4ID0g TWF0aC5tYXgoMCwgdGhpcy5sZW5ndGggKyBmcm9tSW5kZXgpOyB9CiAgZm9y ICh2YXIgaSA9IGZyb21JbmRleCwgaiA9IHRoaXMubGVuZ3RoOyBpIDwgajsg aSsrKSB7CiAgICBpZiAodGhpc1tpXSA9PT0gb2JqKSB7IHJldHVybiBpOyB9 CiAgfQogIHJldHVybiAtMTsKfTsKCnZhciBhcnJheUZpbHRlciA9IGlzTmF0 aXZlRnVuYyhBcnJheS5wcm90b3R5cGUuZmlsdGVyKSA/IEFycmF5LnByb3Rv dHlwZS5maWx0ZXIgOiBmdW5jdGlvbiAoZm4sIGNvbnRleHQpIHsKICB2YXIg aSwKICB2YWx1ZSwKICByZXN1bHQgPSBbXSwKICBsZW5ndGggPSB0aGlzLmxl bmd0aDsKCiAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBp ZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShpKSkgewogICAgICB2YWx1ZSA9IHRo aXNbaV07CiAgICAgIGlmIChmbi5jYWxsKGNvbnRleHQsIHZhbHVlLCBpLCB0 aGlzKSkgewogICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTsKICAgICAgfQog ICAgfQogIH0KICByZXR1cm4gcmVzdWx0Owp9OwoKLyoqCiAgQXJyYXkgcG9s eWZpbGxzIHRvIHN1cHBvcnQgRVM1IGZlYXR1cmVzIGluIG9sZGVyIGJyb3dz ZXJzLgoKICBAbmFtZXNwYWNlIEVtYmVyCiAgQHByb3BlcnR5IEFycmF5UG9s eWZpbGxzCiovCkVtYmVyLkFycmF5UG9seWZpbGxzID0gewogIG1hcDogYXJy YXlNYXAsCiAgZm9yRWFjaDogYXJyYXlGb3JFYWNoLAogIGZpbHRlcjogYXJy YXlGaWx0ZXIsCiAgaW5kZXhPZjogYXJyYXlJbmRleE9mCn07CgppZiAoRW1i ZXIuU0hJTV9FUzUpIHsKICBpZiAoIUFycmF5LnByb3RvdHlwZS5tYXApIHsK ICAgIEFycmF5LnByb3RvdHlwZS5tYXAgPSBhcnJheU1hcDsKICB9CgogIGlm ICghQXJyYXkucHJvdG90eXBlLmZvckVhY2gpIHsKICAgIEFycmF5LnByb3Rv dHlwZS5mb3JFYWNoID0gYXJyYXlGb3JFYWNoOwogIH0KCiAgaWYgKCFBcnJh eS5wcm90b3R5cGUuZmlsdGVyKSB7CiAgICBBcnJheS5wcm90b3R5cGUuZmls dGVyID0gYXJyYXlGaWx0ZXI7CiAgfQoKICBpZiAoIUFycmF5LnByb3RvdHlw ZS5pbmRleE9mKSB7CiAgICBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9IGFy cmF5SW5kZXhPZjsKICB9Cn0KCn0pKCk7CgoKCihmdW5jdGlvbigpIHsKdmFy IGVycm9yUHJvcHMgPSBbJ2Rlc2NyaXB0aW9uJywgJ2ZpbGVOYW1lJywgJ2xp bmVOdW1iZXInLCAnbWVzc2FnZScsICduYW1lJywgJ251bWJlcicsICdzdGFj ayddOwoKLyoqCiAgQSBzdWJjbGFzcyBvZiB0aGUgSmF2YVNjcmlwdCBFcnJv ciBvYmplY3QgZm9yIHVzZSBpbiBFbWJlci4KCiAgQGNsYXNzIEVycm9yCiAg QG5hbWVzcGFjZSBFbWJlcgogIEBleHRlbmRzIEVycm9yCiAgQGNvbnN0cnVj dG9yCiovCkVtYmVyLkVycm9yID0gZnVuY3Rpb24oKSB7CiAgdmFyIHRtcCA9 IEVycm9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CgogIC8vIEFkZHMgYSBg c3RhY2tgIHByb3BlcnR5IHRvIHRoZSBnaXZlbiBlcnJvciBvYmplY3QgdGhh dCB3aWxsIHlpZWxkIHRoZQogIC8vIHN0YWNrIHRyYWNlIGF0IHRoZSB0aW1l IGNhcHR1cmVTdGFja1RyYWNlIHdhcyBjYWxsZWQuCiAgLy8gV2hlbiBjb2xs ZWN0aW5nIHRoZSBzdGFjayB0cmFjZSBhbGwgZnJhbWVzIGFib3ZlIHRoZSB0 b3Btb3N0IGNhbGwKICAvLyB0byB0aGlzIGZ1bmN0aW9uLCBpbmNsdWRpbmcg dGhhdCBjYWxsLCB3aWxsIGJlIGxlZnQgb3V0IG9mIHRoZQogIC8vIHN0YWNr IHRyYWNlLgogIC8vIFRoaXMgaXMgdXNlZnVsIGJlY2F1c2Ugd2UgY2FuIGhp ZGUgRW1iZXIgaW1wbGVtZW50YXRpb24gZGV0YWlscwogIC8vIHRoYXQgYXJl IG5vdCB2ZXJ5IGhlbHBmdWwgZm9yIHRoZSB1c2VyLgogIGlmIChFcnJvci5j YXB0dXJlU3RhY2tUcmFjZSkgewogICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJh Y2UodGhpcywgRW1iZXIuRXJyb3IpOwogIH0KICAvLyBVbmZvcnR1bmF0ZWx5 IGVycm9ycyBhcmUgbm90IGVudW1lcmFibGUgaW4gQ2hyb21lIChhdCBsZWFz dCksIHNvIGBmb3IgcHJvcCBpbiB0bXBgIGRvZXNuJ3Qgd29yay4KICBmb3Ig KHZhciBpZHggPSAwOyBpZHggPCBlcnJvclByb3BzLmxlbmd0aDsgaWR4Kysp IHsKICAgIHRoaXNbZXJyb3JQcm9wc1tpZHhdXSA9IHRtcFtlcnJvclByb3Bz W2lkeF1dOwogIH0KfTsKCkVtYmVyLkVycm9yLnByb3RvdHlwZSA9IEVtYmVy LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpOwoKLy8gLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgov LyBFUlJPUiBIQU5ETElORwovLwoKLyoqCiAgQSBmdW5jdGlvbiBtYXkgYmUg YXNzaWduZWQgdG8gYEVtYmVyLm9uZXJyb3JgIHRvIGJlIGNhbGxlZCB3aGVu IEVtYmVyCiAgaW50ZXJuYWxzIGVuY291bnRlciBhbiBlcnJvci4gVGhpcyBp cyB1c2VmdWwgZm9yIHNwZWNpYWxpemVkIGVycm9yIGhhbmRsaW5nCiAgYW5k IHJlcG9ydGluZyBjb2RlLgoKICBgYGBqYXZhc2NyaXB0CiAgRW1iZXIub25l cnJvciA9IGZ1bmN0aW9uKGVycm9yKSB7CiAgICBFbS4kLmFqYXgoJy9yZXBv cnQtZXJyb3InLCAnUE9TVCcsIHsKICAgICAgc3RhY2s6IGVycm9yLnN0YWNr LAogICAgICBvdGhlckluZm9ybWF0aW9uOiAnd2hhdGV2ZXIgYXBwIHN0YXRl IHlvdSB3YW50IHRvIHByb3ZpZGUnCiAgICB9KTsKICB9OwogIGBgYAoKICBA ZXZlbnQgb25lcnJvcgogIEBmb3IgRW1iZXIKICBAcGFyYW0ge0V4Y2VwdGlv bn0gZXJyb3IgdGhlIGVycm9yIG9iamVjdAoqLwpFbWJlci5vbmVycm9yID0g bnVsbDsKCn0pKCk7CgoKCihmdW5jdGlvbigpIHsKLyoqCkBtb2R1bGUgZW1i ZXItbWV0YWwKKi8KCi8qKgogIFByZWZpeCB1c2VkIGZvciBndWlkcyB0aHJv dWdoIG91dCBFbWJlci4KICBAcHJpdmF0ZQoqLwpFbWJlci5HVUlEX1BSRUZJ WCA9ICdlbWJlcic7CgoKdmFyIG9fZGVmaW5lUHJvcGVydHkgPSBFbWJlci5w bGF0Zm9ybS5kZWZpbmVQcm9wZXJ0eSwKICAgIG9fY3JlYXRlID0gRW1iZXIu Y3JlYXRlLAogICAgLy8gVXNlZCBmb3IgZ3VpZCBnZW5lcmF0aW9uLi4uCiAg ICBHVUlEX0tFWSA9ICdfX2VtYmVyJysgKCsgbmV3IERhdGUoKSksCiAgICBu dW1iZXJDYWNoZSAgPSBbXSwKICAgIHN0cmluZ0NhY2hlICA9IHt9LAogICAg dXVpZCA9IDA7Cgp2YXIgTUFOREFUT1JZX1NFVFRFUiA9IEVtYmVyLkVOVi5N QU5EQVRPUllfU0VUVEVSOwoKLyoqCiAgQSB1bmlxdWUga2V5IHVzZWQgdG8g YXNzaWduIGd1aWRzIGFuZCBvdGhlciBwcml2YXRlIG1ldGFkYXRhIHRvIG9i amVjdHMuCiAgSWYgeW91IGluc3BlY3QgYW4gb2JqZWN0IGluIHlvdXIgYnJv d3NlciBkZWJ1Z2dlciB5b3Ugd2lsbCBvZnRlbiBzZWUgdGhlc2UuCiAgVGhl eSBjYW4gYmUgc2FmZWx5IGlnbm9yZWQuCgogIE9uIGJyb3dzZXJzIHRoYXQg c3VwcG9ydCBpdCwgdGhlc2UgcHJvcGVydGllcyBhcmUgYWRkZWQgd2l0aCBl bnVtZXJhdGlvbgogIGRpc2FibGVkIHNvIHRoZXkgd29uJ3Qgc2hvdyB1cCB3 aGVuIHlvdSBpdGVyYXRlIG92ZXIgeW91ciBwcm9wZXJ0aWVzLgoKICBAcHJp dmF0ZQogIEBwcm9wZXJ0eSBHVUlEX0tFWQogIEBmb3IgRW1iZXIKICBAdHlw ZSBTdHJpbmcKICBAZmluYWwKKi8KRW1iZXIuR1VJRF9LRVkgPSBHVUlEX0tF WTsKCnZhciBHVUlEX0RFU0MgPSB7CiAgd3JpdGFibGU6ICAgIGZhbHNlLAog IGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgZW51bWVyYWJsZTogIGZhbHNlLAog IHZhbHVlOiBudWxsCn07CgovKioKICBHZW5lcmF0ZXMgYSBuZXcgZ3VpZCwg b3B0aW9uYWxseSBzYXZpbmcgdGhlIGd1aWQgdG8gdGhlIG9iamVjdCB0aGF0 IHlvdQogIHBhc3MgaW4uIFlvdSB3aWxsIHJhcmVseSBuZWVkIHRvIHVzZSB0 aGlzIG1ldGhvZC4gSW5zdGVhZCB5b3Ugc2hvdWxkCiAgY2FsbCBgRW1iZXIu Z3VpZEZvcihvYmopYCwgd2hpY2ggcmV0dXJuIGFuIGV4aXN0aW5nIGd1aWQg aWYgYXZhaWxhYmxlLgoKICBAcHJpdmF0ZQogIEBtZXRob2QgZ2VuZXJhdGVH dWlkCiAgQGZvciBFbWJlcgogIEBwYXJhbSB7T2JqZWN0fSBbb2JqXSBPYmpl Y3QgdGhlIGd1aWQgd2lsbCBiZSB1c2VkIGZvci4gSWYgcGFzc2VkIGluLCB0 aGUgZ3VpZCB3aWxsCiAgICBiZSBzYXZlZCBvbiB0aGUgb2JqZWN0IGFuZCBy ZXVzZWQgd2hlbmV2ZXIgeW91IHBhc3MgdGhlIHNhbWUgb2JqZWN0CiAgICBh Z2Fpbi4KCiAgICBJZiBubyBvYmplY3QgaXMgcGFzc2VkLCBqdXN0IGdlbmVy YXRlIGEgbmV3IGd1aWQuCiAgQHBhcmFtIHtTdHJpbmd9IFtwcmVmaXhdIFBy ZWZpeCB0byBwbGFjZSBpbiBmcm9udCBvZiB0aGUgZ3VpZC4gVXNlZnVsIHdo ZW4geW91IHdhbnQgdG8KICAgIHNlcGFyYXRlIHRoZSBndWlkIGludG8gc2Vw YXJhdGUgbmFtZXNwYWNlcy4KICBAcmV0dXJuIHtTdHJpbmd9IHRoZSBndWlk CiovCkVtYmVyLmdlbmVyYXRlR3VpZCA9IGZ1bmN0aW9uIGdlbmVyYXRlR3Vp ZChvYmosIHByZWZpeCkgewogIGlmICghcHJlZml4KSBwcmVmaXggPSBFbWJl ci5HVUlEX1BSRUZJWDsKICB2YXIgcmV0ID0gKHByZWZpeCArICh1dWlkKysp KTsKICBpZiAob2JqKSB7CiAgICBpZiAob2JqW0dVSURfS0VZXSA9PT0gbnVs bCkgewogICAgICBvYmpbR1VJRF9LRVldID0gcmV0OwogICAgfSBlbHNlIHsK ICAgICAgR1VJRF9ERVNDLnZhbHVlID0gcmV0OwogICAgICBvX2RlZmluZVBy b3BlcnR5KG9iaiwgR1VJRF9LRVksIEdVSURfREVTQyk7CiAgICB9CiAgfQog IHJldHVybiByZXQ7Cn07CgovKioKICBSZXR1cm5zIGEgdW5pcXVlIGlkIGZv ciB0aGUgb2JqZWN0LiBJZiB0aGUgb2JqZWN0IGRvZXMgbm90IHlldCBoYXZl IGEgZ3VpZCwKICBvbmUgd2lsbCBiZSBhc3NpZ25lZCB0byBpdC4gWW91IGNh biBjYWxsIHRoaXMgb24gYW55IG9iamVjdCwKICBgRW1iZXIuT2JqZWN0YC1i YXNlZCBvciBub3QsIGJ1dCBiZSBhd2FyZSB0aGF0IGl0IHdpbGwgYWRkIGEg YF9ndWlkYAogIHByb3BlcnR5LgoKICBZb3UgY2FuIGFsc28gdXNlIHRoaXMg bWV0aG9kIG9uIERPTSBFbGVtZW50IG9iamVjdHMuCgogIEBwcml2YXRlCiAg QG1ldGhvZCBndWlkRm9yCiAgQGZvciBFbWJlcgogIEBwYXJhbSB7T2JqZWN0 fSBvYmogYW55IG9iamVjdCwgc3RyaW5nLCBudW1iZXIsIEVsZW1lbnQsIG9y IHByaW1pdGl2ZQogIEByZXR1cm4ge1N0cmluZ30gdGhlIHVuaXF1ZSBndWlk IGZvciB0aGlzIGluc3RhbmNlLgoqLwpFbWJlci5ndWlkRm9yID0gZnVuY3Rp b24gZ3VpZEZvcihvYmopIHsKCiAgLy8gc3BlY2lhbCBjYXNlcyB3aGVyZSB3 ZSBkb24ndCB3YW50IHRvIGFkZCBhIGtleSB0byBvYmplY3QKICBpZiAob2Jq ID09PSB1bmRlZmluZWQpIHJldHVybiAiKHVuZGVmaW5lZCkiOwogIGlmIChv YmogPT09IG51bGwpIHJldHVybiAiKG51bGwpIjsKCiAgdmFyIHJldDsKICB2 YXIgdHlwZSA9IHR5cGVvZiBvYmo7CgogIC8vIERvbid0IGFsbG93IHByb3Rv dHlwZSBjaGFuZ2VzIHRvIFN0cmluZyBldGMuIHRvIGNoYW5nZSB0aGUgZ3Vp ZEZvcgogIHN3aXRjaCh0eXBlKSB7CiAgICBjYXNlICdudW1iZXInOgogICAg ICByZXQgPSBudW1iZXJDYWNoZVtvYmpdOwogICAgICBpZiAoIXJldCkgcmV0 ID0gbnVtYmVyQ2FjaGVbb2JqXSA9ICdudScrb2JqOwogICAgICByZXR1cm4g cmV0OwoKICAgIGNhc2UgJ3N0cmluZyc6CiAgICAgIHJldCA9IHN0cmluZ0Nh Y2hlW29ial07CiAgICAgIGlmICghcmV0KSByZXQgPSBzdHJpbmdDYWNoZVtv YmpdID0gJ3N0JysodXVpZCsrKTsKICAgICAgcmV0dXJuIHJldDsKCiAgICBj YXNlICdib29sZWFuJzoKICAgICAgcmV0dXJuIG9iaiA/ICcodHJ1ZSknIDog JyhmYWxzZSknOwoKICAgIGRlZmF1bHQ6CiAgICAgIGlmIChvYmpbR1VJRF9L RVldKSByZXR1cm4gb2JqW0dVSURfS0VZXTsKICAgICAgaWYgKG9iaiA9PT0g T2JqZWN0KSByZXR1cm4gJyhPYmplY3QpJzsKICAgICAgaWYgKG9iaiA9PT0g QXJyYXkpICByZXR1cm4gJyhBcnJheSknOwogICAgICByZXQgPSAnZW1iZXIn ICsgKHV1aWQrKyk7CgogICAgICBpZiAob2JqW0dVSURfS0VZXSA9PT0gbnVs bCkgewogICAgICAgIG9ialtHVUlEX0tFWV0gPSByZXQ7CiAgICAgIH0gZWxz ZSB7CiAgICAgICAgR1VJRF9ERVNDLnZhbHVlID0gcmV0OwogICAgICAgIG9f ZGVmaW5lUHJvcGVydHkob2JqLCBHVUlEX0tFWSwgR1VJRF9ERVNDKTsKICAg ICAgfQogICAgICByZXR1cm4gcmV0OwogIH0KfTsKCi8vIC4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4KLy8gTUVUQQovLwoKdmFyIE1FVEFfREVTQyA9IEVtYmVyLk1FVEFfREVT QyA9IHsKICB3cml0YWJsZTogICAgdHJ1ZSwKICBjb25maWd1cmFibGU6IGZh bHNlLAogIGVudW1lcmFibGU6ICBmYWxzZSwKICB2YWx1ZTogbnVsbAp9OwoK dmFyIE1FVEFfS0VZID0gRW1iZXIuR1VJRF9LRVkrJ19tZXRhJzsKCi8qKgog IFRoZSBrZXkgdXNlZCB0byBzdG9yZSBtZXRhIGluZm9ybWF0aW9uIG9uIG9i amVjdCBmb3IgcHJvcGVydHkgb2JzZXJ2aW5nLgoKICBAcHJvcGVydHkgTUVU QV9LRVkKICBAZm9yIEVtYmVyCiAgQHByaXZhdGUKICBAZmluYWwKICBAdHlw ZSBTdHJpbmcKKi8KRW1iZXIuTUVUQV9LRVkgPSBNRVRBX0tFWTsKCnZhciBp c0RlZmluZVByb3BlcnR5U2ltdWxhdGVkID0gRW1iZXIucGxhdGZvcm0uZGVm aW5lUHJvcGVydHkuaXNTaW11bGF0ZWQ7CgpmdW5jdGlvbiBNZXRhKG9iaikg ewogIHRoaXMuZGVzY3MgPSB7fTsKICB0aGlzLndhdGNoaW5nID0ge307CiAg dGhpcy5jYWNoZSA9IHt9OwogIHRoaXMuc291cmNlID0gb2JqOwp9CgpNZXRh LnByb3RvdHlwZSA9IHsKICBkZXNjczogbnVsbCwKICBkZXBzOiBudWxsLAog IHdhdGNoaW5nOiBudWxsLAogIGxpc3RlbmVyczogbnVsbCwKICBjYWNoZTog bnVsbCwKICBzb3VyY2U6IG51bGwsCiAgbWl4aW5zOiBudWxsLAogIGJpbmRp bmdzOiBudWxsLAogIGNoYWluczogbnVsbCwKICBjaGFpbldhdGNoZXJzOiBu dWxsLAogIHZhbHVlczogbnVsbCwKICBwcm90bzogbnVsbAp9OwoKaWYgKGlz RGVmaW5lUHJvcGVydHlTaW11bGF0ZWQpIHsKICAvLyBvbiBwbGF0Zm9ybXMg dGhhdCBkb24ndCBzdXBwb3J0IGVudW1lcmFibGUgZmFsc2UKICAvLyBtYWtl IG1ldGEgZmFpbCBqUXVlcnkuaXNQbGFpbk9iamVjdCgpIHRvIGhpZGUgZnJv bQogIC8vIGpRdWVyeS5leHRlbmQoKSBieSBoYXZpbmcgYSBwcm9wZXJ0eSB0 aGF0IGZhaWxzCiAgLy8gaGFzT3duUHJvcGVydHkgY2hlY2suCiAgTWV0YS5w cm90b3R5cGUuX19wcmV2ZW50UGxhaW5PYmplY3RfXyA9IHRydWU7CgogIC8v IFdpdGhvdXQgbm9uLWVudW1lcmFibGUgcHJvcGVydGllcywgbWV0YSBvYmpl Y3RzIHdpbGwgYmUgb3V0cHV0IGluIEpTT04KICAvLyB1bmxlc3MgZXhwbGlj aXRseSBzdXBwcmVzc2VkCiAgTWV0YS5wcm90b3R5cGUudG9KU09OID0gZnVu Y3Rpb24gKCkgeyB9Owp9CgovLyBQbGFjZWhvbGRlciBmb3Igbm9uLXdyaXRh YmxlIG1ldGFzLgp2YXIgRU1QVFlfTUVUQSA9IG5ldyBNZXRhKG51bGwpOwoK aWYgKE1BTkRBVE9SWV9TRVRURVIpIHsgRU1QVFlfTUVUQS52YWx1ZXMgPSB7 fTsgfQoKRW1iZXIuRU1QVFlfTUVUQSA9IEVNUFRZX01FVEE7CgovKioKICBS ZXRyaWV2ZXMgdGhlIG1ldGEgaGFzaCBmb3IgYW4gb2JqZWN0LiBJZiBgd3Jp dGFibGVgIGlzIHRydWUgZW5zdXJlcyB0aGUKICBoYXNoIGlzIHdyaXRhYmxl IGZvciB0aGlzIG9iamVjdCBhcyB3ZWxsLgoKICBUaGUgbWV0YSBvYmplY3Qg Y29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgY29tcHV0ZWQgcHJvcGVydHkg ZGVzY3JpcHRvcnMgYXMKICB3ZWxsIGFzIGFueSB3YXRjaGVkIHByb3BlcnRp ZXMgYW5kIG90aGVyIGluZm9ybWF0aW9uLiBZb3UgZ2VuZXJhbGx5IHdpbGwK ICBub3QgYWNjZXNzIHRoaXMgaW5mb3JtYXRpb24gZGlyZWN0bHkgYnV0IGlu c3RlYWQgd29yayB3aXRoIGhpZ2hlciBsZXZlbAogIG1ldGhvZHMgdGhhdCBt YW5pcHVsYXRlIHRoaXMgaGFzaCBpbmRpcmVjdGx5LgoKICBAbWV0aG9kIG1l dGEKICBAZm9yIEVtYmVyCiAgQHByaXZhdGUKCiAgQHBhcmFtIHtPYmplY3R9 IG9iaiBUaGUgb2JqZWN0IHRvIHJldHJpZXZlIG1ldGEgZm9yCiAgQHBhcmFt IHtCb29sZWFufSBbd3JpdGFibGU9dHJ1ZV0gUGFzcyBgZmFsc2VgIGlmIHlv dSBkbyBub3QgaW50ZW5kIHRvIG1vZGlmeQogICAgdGhlIG1ldGEgaGFzaCwg YWxsb3dpbmcgdGhlIG1ldGhvZCB0byBhdm9pZCBtYWtpbmcgYW4gdW5uZWNl c3NhcnkgY29weS4KICBAcmV0dXJuIHtPYmplY3R9IHRoZSBtZXRhIGhhc2gg Zm9yIGFuIG9iamVjdAoqLwpFbWJlci5tZXRhID0gZnVuY3Rpb24gbWV0YShv YmosIHdyaXRhYmxlKSB7CgogIHZhciByZXQgPSBvYmpbTUVUQV9LRVldOwog IGlmICh3cml0YWJsZT09PWZhbHNlKSByZXR1cm4gcmV0IHx8IEVNUFRZX01F VEE7CgogIGlmICghcmV0KSB7CiAgICBpZiAoIWlzRGVmaW5lUHJvcGVydHlT aW11bGF0ZWQpIG9fZGVmaW5lUHJvcGVydHkob2JqLCBNRVRBX0tFWSwgTUVU QV9ERVNDKTsKCiAgICByZXQgPSBuZXcgTWV0YShvYmopOwoKICAgIGlmIChN QU5EQVRPUllfU0VUVEVSKSB7IHJldC52YWx1ZXMgPSB7fTsgfQoKICAgIG9i altNRVRBX0tFWV0gPSByZXQ7CgogICAgLy8gbWFrZSBzdXJlIHdlIGRvbid0 IGFjY2lkZW50YWxseSB0cnkgdG8gY3JlYXRlIGNvbnN0cnVjdG9yIGxpa2Ug ZGVzYwogICAgcmV0LmRlc2NzLmNvbnN0cnVjdG9yID0gbnVsbDsKCiAgfSBl bHNlIGlmIChyZXQuc291cmNlICE9PSBvYmopIHsKICAgIGlmICghaXNEZWZp bmVQcm9wZXJ0eVNpbXVsYXRlZCkgb19kZWZpbmVQcm9wZXJ0eShvYmosIE1F VEFfS0VZLCBNRVRBX0RFU0MpOwoKICAgIHJldCA9IG9fY3JlYXRlKHJldCk7 CiAgICByZXQuZGVzY3MgICAgPSBvX2NyZWF0ZShyZXQuZGVzY3MpOwogICAg cmV0LndhdGNoaW5nID0gb19jcmVhdGUocmV0LndhdGNoaW5nKTsKICAgIHJl dC5jYWNoZSAgICA9IHt9OwogICAgcmV0LnNvdXJjZSAgID0gb2JqOwoKICAg IGlmIChNQU5EQVRPUllfU0VUVEVSKSB7IHJldC52YWx1ZXMgPSBvX2NyZWF0 ZShyZXQudmFsdWVzKTsgfQoKICAgIG9ialtNRVRBX0tFWV0gPSByZXQ7CiAg fQogIHJldHVybiByZXQ7Cn07CgpFbWJlci5nZXRNZXRhID0gZnVuY3Rpb24g Z2V0TWV0YShvYmosIHByb3BlcnR5KSB7CiAgdmFyIG1ldGEgPSBFbWJlci5t ZXRhKG9iaiwgZmFsc2UpOwogIHJldHVybiBtZXRhW3Byb3BlcnR5XTsKfTsK CkVtYmVyLnNldE1ldGEgPSBmdW5jdGlvbiBzZXRNZXRhKG9iaiwgcHJvcGVy dHksIHZhbHVlKSB7CiAgdmFyIG1ldGEgPSBFbWJlci5tZXRhKG9iaiwgdHJ1 ZSk7CiAgbWV0YVtwcm9wZXJ0eV0gPSB2YWx1ZTsKICByZXR1cm4gdmFsdWU7 Cn07CgovKioKICBAZGVwcmVjYXRlZAogIEBwcml2YXRlCgogIEluIG9yZGVy IHRvIHN0b3JlIGRlZmF1bHRzIGZvciBhIGNsYXNzLCBhIHByb3RvdHlwZSBt YXkgbmVlZCB0byBjcmVhdGUKICBhIGRlZmF1bHQgbWV0YSBvYmplY3QsIHdo aWNoIHdpbGwgYmUgaW5oZXJpdGVkIGJ5IGFueSBvYmplY3RzIGluc3RhbnRp YXRlZAogIGZyb20gdGhlIGNsYXNzJ3MgY29uc3RydWN0b3IuCgogIEhvd2V2 ZXIsIHRoZSBwcm9wZXJ0aWVzIG9mIHRoYXQgbWV0YSBvYmplY3QgYXJlIG9u bHkgc2hhbGxvdy1jbG9uZWQsCiAgc28gaWYgYSBwcm9wZXJ0eSBpcyBhIGhh c2ggKGxpa2UgdGhlIGV2ZW50IHN5c3RlbSdzIGBsaXN0ZW5lcnNgIGhhc2gp LAogIGl0IHdpbGwgYnkgZGVmYXVsdCBiZSBzaGFyZWQgYWNyb3NzIGFsbCBp bnN0YW5jZXMgb2YgdGhhdCBjbGFzcy4KCiAgVGhpcyBtZXRob2QgYWxsb3dz IGV4dGVuc2lvbnMgdG8gZGVlcGx5IGNsb25lIGEgc2VyaWVzIG9mIG5lc3Rl ZCBoYXNoZXMgb3IKICBvdGhlciBjb21wbGV4IG9iamVjdHMuIEZvciBpbnN0 YW5jZSwgdGhlIGV2ZW50IHN5c3RlbSBtaWdodCBwYXNzCiAgYFsnbGlzdGVu ZXJzJywgJ2ZvbzpjaGFuZ2UnLCAnZW1iZXIxNTcnXWAgdG8gYHByZXBhcmVN ZXRhUGF0aGAsIHdoaWNoIHdpbGwKICB3YWxrIGRvd24gdGhlIGtleXMgcHJv dmlkZWQuCgogIEZvciBlYWNoIGtleSwgaWYgdGhlIGtleSBkb2VzIG5vdCBl eGlzdCwgaXQgaXMgY3JlYXRlZC4gSWYgaXQgYWxyZWFkeQogIGV4aXN0cyBh bmQgaXQgd2FzIGluaGVyaXRlZCBmcm9tIGl0cyBjb25zdHJ1Y3RvciwgdGhl IGNvbnN0cnVjdG9yJ3MKICBrZXkgaXMgY2xvbmVkLgoKICBZb3UgY2FuIGFs c28gcGFzcyBmYWxzZSBmb3IgYHdyaXRhYmxlYCwgd2hpY2ggd2lsbCBzaW1w bHkgcmV0dXJuCiAgdW5kZWZpbmVkIGlmIGBwcmVwYXJlTWV0YVBhdGhgIGRp c2NvdmVycyBhbnkgcGFydCBvZiB0aGUgcGF0aCB0aGF0CiAgc2hhcmVkIG9y IHVuZGVmaW5lZC4KCiAgQG1ldGhvZCBtZXRhUGF0aAogIEBmb3IgRW1iZXIK ICBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3Qgd2hvc2UgbWV0YSB3 ZSBhcmUgZXhhbWluaW5nCiAgQHBhcmFtIHtBcnJheX0gcGF0aCBBbiBhcnJh eSBvZiBrZXlzIHRvIHdhbGsgZG93bgogIEBwYXJhbSB7Qm9vbGVhbn0gd3Jp dGFibGUgd2hldGhlciBvciBub3QgdG8gY3JlYXRlIGEgbmV3IG1ldGEKICAg IChvciBtZXRhIHByb3BlcnR5KSBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBl eGlzdCBvciBpZiBpdCdzCiAgICBzaGFyZWQgd2l0aCBpdHMgY29uc3RydWN0 b3IKKi8KRW1iZXIubWV0YVBhdGggPSBmdW5jdGlvbiBtZXRhUGF0aChvYmos IHBhdGgsIHdyaXRhYmxlKSB7CiAgRW1iZXIuZGVwcmVjYXRlKCJFbWJlci5t ZXRhUGF0aCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgZnJv bSBmdXR1cmUgcmVsZWFzZXMuIik7CiAgdmFyIG1ldGEgPSBFbWJlci5tZXRh KG9iaiwgd3JpdGFibGUpLCBrZXlOYW1lLCB2YWx1ZTsKCiAgZm9yICh2YXIg aT0wLCBsPXBhdGgubGVuZ3RoOyBpPGw7IGkrKykgewogICAga2V5TmFtZSA9 IHBhdGhbaV07CiAgICB2YWx1ZSA9IG1ldGFba2V5TmFtZV07CgogICAgaWYg KCF2YWx1ZSkgewogICAgICBpZiAoIXdyaXRhYmxlKSB7IHJldHVybiB1bmRl ZmluZWQ7IH0KICAgICAgdmFsdWUgPSBtZXRhW2tleU5hbWVdID0geyBfX2Vt YmVyX3NvdXJjZV9fOiBvYmogfTsKICAgIH0gZWxzZSBpZiAodmFsdWUuX19l bWJlcl9zb3VyY2VfXyAhPT0gb2JqKSB7CiAgICAgIGlmICghd3JpdGFibGUp IHsgcmV0dXJuIHVuZGVmaW5lZDsgfQogICAgICB2YWx1ZSA9IG1ldGFba2V5 TmFtZV0gPSBvX2NyZWF0ZSh2YWx1ZSk7CiAgICAgIHZhbHVlLl9fZW1iZXJf c291cmNlX18gPSBvYmo7CiAgICB9CgogICAgbWV0YSA9IHZhbHVlOwogIH0K CiAgcmV0dXJuIHZhbHVlOwp9OwoKLyoqCiAgV3JhcHMgdGhlIHBhc3NlZCBm dW5jdGlvbiBzbyB0aGF0IGB0aGlzLl9zdXBlcmAgd2lsbCBwb2ludCB0byB0 aGUgc3VwZXJGdW5jCiAgd2hlbiB0aGUgZnVuY3Rpb24gaXMgaW52b2tlZC4g VGhpcyBpcyB0aGUgcHJpbWl0aXZlIHdlIHVzZSB0byBpbXBsZW1lbnQKICBj YWxscyB0byBzdXBlci4KCiAgQHByaXZhdGUKICBAbWV0aG9kIHdyYXAKICBA Zm9yIEVtYmVyCiAgQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rp b24gdG8gY2FsbAogIEBwYXJhbSB7RnVuY3Rpb259IHN1cGVyRnVuYyBUaGUg c3VwZXIgZnVuY3Rpb24uCiAgQHJldHVybiB7RnVuY3Rpb259IHdyYXBwZWQg ZnVuY3Rpb24uCiovCkVtYmVyLndyYXAgPSBmdW5jdGlvbihmdW5jLCBzdXBl ckZ1bmMpIHsKICBmdW5jdGlvbiBzdXBlcldyYXBwZXIoKSB7CiAgICB2YXIg cmV0LCBzdXAgPSB0aGlzLl9fbmV4dFN1cGVyOwogICAgdGhpcy5fX25leHRT dXBlciA9IHN1cGVyRnVuYzsKICAgIHJldCA9IGZ1bmMuYXBwbHkodGhpcywg YXJndW1lbnRzKTsKICAgIHRoaXMuX19uZXh0U3VwZXIgPSBzdXA7CiAgICBy ZXR1cm4gcmV0OwogIH0KCiAgc3VwZXJXcmFwcGVyLndyYXBwZWRGdW5jdGlv biA9IGZ1bmM7CiAgc3VwZXJXcmFwcGVyLl9fZW1iZXJfb2JzZXJ2ZXNfXyA9 IGZ1bmMuX19lbWJlcl9vYnNlcnZlc19fOwogIHN1cGVyV3JhcHBlci5fX2Vt YmVyX29ic2VydmVzQmVmb3JlX18gPSBmdW5jLl9fZW1iZXJfb2JzZXJ2ZXNC ZWZvcmVfXzsKICBzdXBlcldyYXBwZXIuX19lbWJlcl9saXN0ZW5zX18gPSBm dW5jLl9fZW1iZXJfbGlzdGVuc19fOwoKICByZXR1cm4gc3VwZXJXcmFwcGVy Owp9OwoKLyoqCiAgUmV0dXJucyB0cnVlIGlmIHRoZSBwYXNzZWQgb2JqZWN0 IGlzIGFuIGFycmF5IG9yIEFycmF5LWxpa2UuCgogIEVtYmVyIEFycmF5IFBy b3RvY29sOgoKICAgIC0gdGhlIG9iamVjdCBoYXMgYW4gb2JqZWN0QXQgcHJv cGVydHkKICAgIC0gdGhlIG9iamVjdCBpcyBhIG5hdGl2ZSBBcnJheQogICAg LSB0aGUgb2JqZWN0IGlzIGFuIE9iamVjdCwgYW5kIGhhcyBhIGxlbmd0aCBw cm9wZXJ0eQoKICBVbmxpa2UgYEVtYmVyLnR5cGVPZmAgdGhpcyBtZXRob2Qg cmV0dXJucyB0cnVlIGV2ZW4gaWYgdGhlIHBhc3NlZCBvYmplY3QgaXMKICBu b3QgZm9ybWFsbHkgYXJyYXkgYnV0IGFwcGVhcnMgdG8gYmUgYXJyYXktbGlr ZSAoaS5lLiBpbXBsZW1lbnRzIGBFbWJlci5BcnJheWApCgogIGBgYGphdmFz Y3JpcHQKICBFbWJlci5pc0FycmF5KCk7ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxzZQogIEVtYmVyLmlzQXJy YXkoW10pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIC8vIHRydWUKICBFbWJlci5pc0FycmF5KCBFbWJlci5BcnJheVByb3h5 LmNyZWF0ZSh7IGNvbnRlbnQ6IFtdIH0pICk7ICAvLyB0cnVlCiAgYGBgCgog IEBtZXRob2QgaXNBcnJheQogIEBmb3IgRW1iZXIKICBAcGFyYW0ge09iamVj dH0gb2JqIFRoZSBvYmplY3QgdG8gdGVzdAogIEByZXR1cm4ge0Jvb2xlYW59 IHRydWUgaWYgdGhlIHBhc3NlZCBvYmplY3QgaXMgYW4gYXJyYXkgb3IgQXJy YXktbGlrZQoqLwpFbWJlci5pc0FycmF5ID0gZnVuY3Rpb24ob2JqKSB7CiAg aWYgKCFvYmogfHwgb2JqLnNldEludGVydmFsKSB7IHJldHVybiBmYWxzZTsg fQogIGlmIChBcnJheS5pc0FycmF5ICYmIEFycmF5LmlzQXJyYXkob2JqKSkg eyByZXR1cm4gdHJ1ZTsgfQogIGlmIChFbWJlci5BcnJheSAmJiBFbWJlci5B cnJheS5kZXRlY3Qob2JqKSkgeyByZXR1cm4gdHJ1ZTsgfQogIGlmICgob2Jq Lmxlbmd0aCAhPT0gdW5kZWZpbmVkKSAmJiAnb2JqZWN0Jz09PXR5cGVvZiBv YmopIHsgcmV0dXJuIHRydWU7IH0KICByZXR1cm4gZmFsc2U7Cn07CgovKioK ICBGb3JjZXMgdGhlIHBhc3NlZCBvYmplY3QgdG8gYmUgcGFydCBvZiBhbiBh cnJheS4gSWYgdGhlIG9iamVjdCBpcyBhbHJlYWR5CiAgYW4gYXJyYXkgb3Ig YXJyYXktbGlrZSwgcmV0dXJucyB0aGUgb2JqZWN0LiBPdGhlcndpc2UgYWRk cyB0aGUgb2JqZWN0IHRvCiAgYW4gYXJyYXkuIElmIG9iaiBpcyBgbnVsbGAg b3IgYHVuZGVmaW5lZGAsIHJldHVybnMgYW4gZW1wdHkgYXJyYXkuCgogIGBg YGphdmFzY3JpcHQKICBFbWJlci5tYWtlQXJyYXkoKTsgICAgICAgICAgICAg ICAgICAgICAgICAgICAvLyBbXQogIEVtYmVyLm1ha2VBcnJheShudWxsKTsg ICAgICAgICAgICAgICAgICAgICAgIC8vIFtdCiAgRW1iZXIubWFrZUFycmF5 KHVuZGVmaW5lZCk7ICAgICAgICAgICAgICAgICAgLy8gW10KICBFbWJlci5t YWtlQXJyYXkoJ2xpbmRzYXknKTsgICAgICAgICAgICAgICAgICAvLyBbJ2xp bmRzYXknXQogIEVtYmVyLm1ha2VBcnJheShbMSwyLDQyXSk7ICAgICAgICAg ICAgICAgICAgIC8vIFsxLDIsNDJdCgogIHZhciBjb250cm9sbGVyID0gRW1i ZXIuQXJyYXlQcm94eS5jcmVhdGUoeyBjb250ZW50OiBbXSB9KTsKICBFbWJl ci5tYWtlQXJyYXkoY29udHJvbGxlcikgPT09IGNvbnRyb2xsZXI7ICAvLyB0 cnVlCiAgYGBgCgogIEBtZXRob2QgbWFrZUFycmF5CiAgQGZvciBFbWJlcgog IEBwYXJhbSB7T2JqZWN0fSBvYmogdGhlIG9iamVjdAogIEByZXR1cm4ge0Fy cmF5fQoqLwpFbWJlci5tYWtlQXJyYXkgPSBmdW5jdGlvbihvYmopIHsKICBp ZiAob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVy biBbXTsgfQogIHJldHVybiBFbWJlci5pc0FycmF5KG9iaikgPyBvYmogOiBb b2JqXTsKfTsKCmZ1bmN0aW9uIGNhbkludm9rZShvYmosIG1ldGhvZE5hbWUp IHsKICByZXR1cm4gISEob2JqICYmIHR5cGVvZiBvYmpbbWV0aG9kTmFtZV0g PT09ICdmdW5jdGlvbicpOwp9CgovKioKICBDaGVja3MgdG8gc2VlIGlmIHRo ZSBgbWV0aG9kTmFtZWAgZXhpc3RzIG9uIHRoZSBgb2JqYC4KCiAgYGBgamF2 YXNjcmlwdAogIHZhciBmb28gPSB7YmFyOiBFbWJlci5LLCBiYXo6IG51bGx9 OwogIEVtYmVyLmNhbkludm9rZShmb28sICdiYXInKTsgLy8gdHJ1ZQogIEVt YmVyLmNhbkludm9rZShmb28sICdiYXonKTsgLy8gZmFsc2UKICBFbWJlci5j YW5JbnZva2UoZm9vLCAnYmF0Jyk7IC8vIGZhbHNlCiAgYGBgCgogIEBtZXRo b2QgY2FuSW52b2tlCiAgQGZvciBFbWJlcgogIEBwYXJhbSB7T2JqZWN0fSBv YmogVGhlIG9iamVjdCB0byBjaGVjayBmb3IgdGhlIG1ldGhvZAogIEBwYXJh bSB7U3RyaW5nfSBtZXRob2ROYW1lIFRoZSBtZXRob2QgbmFtZSB0byBjaGVj ayBmb3IKICBAcmV0dXJuIHtCb29sZWFufQoqLwpFbWJlci5jYW5JbnZva2Ug PSBjYW5JbnZva2U7CgovKioKICBDaGVja3MgdG8gc2VlIGlmIHRoZSBgbWV0 aG9kTmFtZWAgZXhpc3RzIG9uIHRoZSBgb2JqYCwKICBhbmQgaWYgaXQgZG9l cywgaW52b2tlcyBpdCB3aXRoIHRoZSBhcmd1bWVudHMgcGFzc2VkLgoKICBg YGBqYXZhc2NyaXB0CiAgdmFyIGQgPSBuZXcgRGF0ZSgnMDMvMTUvMjAxMycp OwogIEVtYmVyLnRyeUludm9rZShkLCAnZ2V0VGltZScpOyAvLyAxMzYzMzIw MDAwMDAwCiAgRW1iZXIudHJ5SW52b2tlKGQsICdzZXRGdWxsWWVhcicsIFsy MDE0XSk7IC8vIDEzOTQ4NTYwMDAwMDAKICBFbWJlci50cnlJbnZva2UoZCwg J25vU3VjaE1ldGhvZCcsIFsyMDE0XSk7IC8vIHVuZGVmaW5lZAogIGBgYAoK ICBAbWV0aG9kIHRyeUludm9rZQogIEBmb3IgRW1iZXIKICBAcGFyYW0ge09i amVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY2hlY2sgZm9yIHRoZSBtZXRob2QK ICBAcGFyYW0ge1N0cmluZ30gbWV0aG9kTmFtZSBUaGUgbWV0aG9kIG5hbWUg dG8gY2hlY2sgZm9yCiAgQHBhcmFtIHtBcnJheX0gW2FyZ3NdIFRoZSBhcmd1 bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kCiAgQHJldHVybiB7Kn0gdGhl IHJldHVybiB2YWx1ZSBvZiB0aGUgaW52b2tlZCBtZXRob2Qgb3IgdW5kZWZp bmVkIGlmIGl0IGNhbm5vdCBiZSBpbnZva2VkCiovCkVtYmVyLnRyeUludm9r ZSA9IGZ1bmN0aW9uKG9iaiwgbWV0aG9kTmFtZSwgYXJncykgewogIGlmIChj YW5JbnZva2Uob2JqLCBtZXRob2ROYW1lKSkgewogICAgcmV0dXJuIG9ialtt ZXRob2ROYW1lXS5hcHBseShvYmosIGFyZ3MgfHwgW10pOwogIH0KfTsKCi8v IGh0dHBzOi8vZ2l0aHViLmNvbS9lbWJlcmpzL2VtYmVyLmpzL3B1bGwvMTYx Nwp2YXIgbmVlZHNGaW5hbGx5Rml4ID0gKGZ1bmN0aW9uKCkgewogIHZhciBj b3VudCA9IDA7CiAgdHJ5ewogICAgdHJ5IHsgfQogICAgZmluYWxseSB7CiAg ICAgIGNvdW50Kys7CiAgICAgIHRocm93IG5ldyBFcnJvcignbmVlZHNGaW5h bGx5Rml4VGVzdCcpOwogICAgfQogIH0gY2F0Y2ggKGUpIHt9CgogIHJldHVy biBjb3VudCAhPT0gMTsKfSkoKTsKCi8qKgogIFByb3ZpZGVzIHRyeSB7IH0g ZmluYWxseSB7IH0gZnVuY3Rpb25hbGl0eSwgd2hpbGUgd29ya2luZwogIGFy b3VuZCBTYWZhcmkncyBkb3VibGUgZmluYWxseSBidWcuCgogIGBgYGphdmFz Y3JpcHQKICB2YXIgdHJ5YWJsZSA9IGZ1bmN0aW9uKCkgewogICAgc29tZVJl c291cmNlLmxvY2soKTsKICAgIHJ1bkNhbGxiYWNrKCk7IC8vIE1heSB0aHJv dyBlcnJvci4KICB9OwogIHZhciBmaW5hbGl6ZXIgPSBmdW5jdGlvbigpIHsK ICAgIHNvbWVSZXNvdXJjZS51bmxvY2soKTsKICB9OwogIEVtYmVyLnRyeUZp bmFsbHkodHJ5YWJsZSwgZmluYWxpemVyKTsKICBgYGAKCiAgQG1ldGhvZCB0 cnlGaW5hbGx5CiAgQGZvciBFbWJlcgogIEBwYXJhbSB7RnVuY3Rpb259IHRy eWFibGUgVGhlIGZ1bmN0aW9uIHRvIHJ1biB0aGUgdHJ5IGNhbGxiYWNrCiAg QHBhcmFtIHtGdW5jdGlvbn0gZmluYWxpemVyIFRoZSBmdW5jdGlvbiB0byBy dW4gdGhlIGZpbmFsbHkgY2FsbGJhY2sKICBAcGFyYW0ge09iamVjdH0gW2Jp bmRpbmddIFRoZSBvcHRpb25hbCBjYWxsaW5nIG9iamVjdC4gRGVmYXVsdHMg dG8gJ3RoaXMnCiAgQHJldHVybiB7Kn0gVGhlIHJldHVybiB2YWx1ZSBpcyB0 aGUgdGhhdCBvZiB0aGUgZmluYWxpemVyLAogIHVubGVzcyB0aGF0IHZhbHVl IGlzIHVuZGVmaW5lZCwgaW4gd2hpY2ggY2FzZSBpdCBpcyB0aGUgcmV0dXJu IHZhbHVlCiAgb2YgdGhlIHRyeWFibGUKKi8KCmlmIChuZWVkc0ZpbmFsbHlG aXgpIHsKICBFbWJlci50cnlGaW5hbGx5ID0gZnVuY3Rpb24odHJ5YWJsZSwg ZmluYWxpemVyLCBiaW5kaW5nKSB7CiAgICB2YXIgcmVzdWx0LCBmaW5hbFJl c3VsdCwgZmluYWxFcnJvcjsKCiAgICBiaW5kaW5nID0gYmluZGluZyB8fCB0 aGlzOwoKICAgIHRyeSB7CiAgICAgIHJlc3VsdCA9IHRyeWFibGUuY2FsbChi aW5kaW5nKTsKICAgIH0gZmluYWxseSB7CiAgICAgIHRyeSB7CiAgICAgICAg ZmluYWxSZXN1bHQgPSBmaW5hbGl6ZXIuY2FsbChiaW5kaW5nKTsKICAgICAg fSBjYXRjaCAoZSkgewogICAgICAgIGZpbmFsRXJyb3IgPSBlOwogICAgICB9 CiAgICB9CgogICAgaWYgKGZpbmFsRXJyb3IpIHsgdGhyb3cgZmluYWxFcnJv cjsgfQoKICAgIHJldHVybiAoZmluYWxSZXN1bHQgPT09IHVuZGVmaW5lZCkg PyByZXN1bHQgOiBmaW5hbFJlc3VsdDsKICB9Owp9IGVsc2UgewogIEVtYmVy LnRyeUZpbmFsbHkgPSBmdW5jdGlvbih0cnlhYmxlLCBmaW5hbGl6ZXIsIGJp bmRpbmcpIHsKICAgIHZhciByZXN1bHQsIGZpbmFsUmVzdWx0OwoKICAgIGJp bmRpbmcgPSBiaW5kaW5nIHx8IHRoaXM7CgogICAgdHJ5IHsKICAgICAgcmVz dWx0ID0gdHJ5YWJsZS5jYWxsKGJpbmRpbmcpOwogICAgfSBmaW5hbGx5IHsK ICAgICAgZmluYWxSZXN1bHQgPSBmaW5hbGl6ZXIuY2FsbChiaW5kaW5nKTsK ICAgIH0KCiAgICByZXR1cm4gKGZpbmFsUmVzdWx0ID09PSB1bmRlZmluZWQp ID8gcmVzdWx0IDogZmluYWxSZXN1bHQ7CiAgfTsKfQoKLyoqCiAgUHJvdmlk ZXMgdHJ5IHsgfSBjYXRjaCBmaW5hbGx5IHsgfSBmdW5jdGlvbmFsaXR5LCB3 aGlsZSB3b3JraW5nCiAgYXJvdW5kIFNhZmFyaSdzIGRvdWJsZSBmaW5hbGx5 IGJ1Zy4KCiAgYGBgamF2YXNjcmlwdAogIHZhciB0cnlhYmxlID0gZnVuY3Rp b24oKSB7CiAgICBmb3IgKGk9MCwgbD1saXN0ZW5lcnMubGVuZ3RoOyBpPGw7 IGkrKykgewogICAgICBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpXTsKICAgICAg YmVmb3JlVmFsdWVzW2ldID0gbGlzdGVuZXIuYmVmb3JlKG5hbWUsIHRpbWUo KSwgcGF5bG9hZCk7CiAgICB9CgogICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwo YmluZGluZyk7CiAgfTsKCiAgdmFyIGNhdGNoYWJsZSA9IGZ1bmN0aW9uKGUp IHsKICAgIHBheWxvYWQgPSBwYXlsb2FkIHx8IHt9OwogICAgcGF5bG9hZC5l eGNlcHRpb24gPSBlOwogIH07CgogIHZhciBmaW5hbGl6ZXIgPSBmdW5jdGlv bigpIHsKICAgIGZvciAoaT0wLCBsPWxpc3RlbmVycy5sZW5ndGg7IGk8bDsg aSsrKSB7CiAgICAgIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldOwogICAgICBs aXN0ZW5lci5hZnRlcihuYW1lLCB0aW1lKCksIHBheWxvYWQsIGJlZm9yZVZh bHVlc1tpXSk7CiAgICB9CiAgfTsKICBFbWJlci50cnlDYXRjaEZpbmFsbHko dHJ5YWJsZSwgY2F0Y2hhYmxlLCBmaW5hbGl6ZXIpOwogIGBgYAoKICBAbWV0 aG9kIHRyeUNhdGNoRmluYWxseQogIEBmb3IgRW1iZXIKICBAcGFyYW0ge0Z1 bmN0aW9ufSB0cnlhYmxlIFRoZSBmdW5jdGlvbiB0byBydW4gdGhlIHRyeSBj YWxsYmFjawogIEBwYXJhbSB7RnVuY3Rpb259IGNhdGNoYWJsZSBUaGUgZnVu Y3Rpb24gdG8gcnVuIHRoZSBjYXRjaGFibGUgY2FsbGJhY2sKICBAcGFyYW0g e0Z1bmN0aW9ufSBmaW5hbGl6ZXIgVGhlIGZ1bmN0aW9uIHRvIHJ1biB0aGUg ZmluYWxseSBjYWxsYmFjawogIEBwYXJhbSB7T2JqZWN0fSBbYmluZGluZ10g VGhlIG9wdGlvbmFsIGNhbGxpbmcgb2JqZWN0LiBEZWZhdWx0cyB0byAndGhp cycKICBAcmV0dXJuIHsqfSBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSB0aGF0 IG9mIHRoZSBmaW5hbGl6ZXIsCiAgdW5sZXNzIHRoYXQgdmFsdWUgaXMgdW5k ZWZpbmVkLCBpbiB3aGljaCBjYXNlIGl0IGlzIHRoZSByZXR1cm4gdmFsdWUK ICBvZiB0aGUgdHJ5YWJsZS4KKi8KaWYgKG5lZWRzRmluYWxseUZpeCkgewog IEVtYmVyLnRyeUNhdGNoRmluYWxseSA9IGZ1bmN0aW9uKHRyeWFibGUsIGNh dGNoYWJsZSwgZmluYWxpemVyLCBiaW5kaW5nKSB7CiAgICB2YXIgcmVzdWx0 LCBmaW5hbFJlc3VsdCwgZmluYWxFcnJvcjsKCiAgICBiaW5kaW5nID0gYmlu ZGluZyB8fCB0aGlzOwoKICAgIHRyeSB7CiAgICAgIHJlc3VsdCA9IHRyeWFi bGUuY2FsbChiaW5kaW5nKTsKICAgIH0gY2F0Y2goZXJyb3IpIHsKICAgICAg cmVzdWx0ID0gY2F0Y2hhYmxlLmNhbGwoYmluZGluZywgZXJyb3IpOwogICAg fSBmaW5hbGx5IHsKICAgICAgdHJ5IHsKICAgICAgICBmaW5hbFJlc3VsdCA9 IGZpbmFsaXplci5jYWxsKGJpbmRpbmcpOwogICAgICB9IGNhdGNoIChlKSB7 CiAgICAgICAgZmluYWxFcnJvciA9IGU7CiAgICAgIH0KICAgIH0KCiAgICBp ZiAoZmluYWxFcnJvcikgeyB0aHJvdyBmaW5hbEVycm9yOyB9CgogICAgcmV0 dXJuIChmaW5hbFJlc3VsdCA9PT0gdW5kZWZpbmVkKSA/IHJlc3VsdCA6IGZp bmFsUmVzdWx0OwogIH07Cn0gZWxzZSB7CiAgRW1iZXIudHJ5Q2F0Y2hGaW5h bGx5ID0gZnVuY3Rpb24odHJ5YWJsZSwgY2F0Y2hhYmxlLCBmaW5hbGl6ZXIs IGJpbmRpbmcpIHsKICAgIHZhciByZXN1bHQsIGZpbmFsUmVzdWx0OwoKICAg IGJpbmRpbmcgPSBiaW5kaW5nIHx8IHRoaXM7CgogICAgdHJ5IHsKICAgICAg cmVzdWx0ID0gdHJ5YWJsZS5jYWxsKGJpbmRpbmcpOwogICAgfSBjYXRjaChl cnJvcikgewogICAgICByZXN1bHQgPSBjYXRjaGFibGUuY2FsbChiaW5kaW5n LCBlcnJvcik7CiAgICB9IGZpbmFsbHkgewogICAgICBmaW5hbFJlc3VsdCA9 IGZpbmFsaXplci5jYWxsKGJpbmRpbmcpOwogICAgfQoKICAgIHJldHVybiAo ZmluYWxSZXN1bHQgPT09IHVuZGVmaW5lZCkgPyByZXN1bHQgOiBmaW5hbFJl c3VsdDsKICB9Owp9CgovLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uCi8vIFRZUElORyAmIEFSUkFZIE1FU1NBR0lORwovLwoK dmFyIFRZUEVfTUFQID0ge307CnZhciB0ID0gIkJvb2xlYW4gTnVtYmVyIFN0 cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QiLnNwbGl0 KCIgIik7CkVtYmVyLkFycmF5UG9seWZpbGxzLmZvckVhY2guY2FsbCh0LCBm dW5jdGlvbihuYW1lKSB7CiAgVFlQRV9NQVBbICJbb2JqZWN0ICIgKyBuYW1l ICsgIl0iIF0gPSBuYW1lLnRvTG93ZXJDYXNlKCk7Cn0pOwoKdmFyIHRvU3Ry aW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKCi8qKgogIFJldHVy bnMgYSBjb25zaXN0ZW50IHR5cGUgZm9yIHRoZSBwYXNzZWQgaXRlbS4KCiAg VXNlIHRoaXMgaW5zdGVhZCBvZiB0aGUgYnVpbHQtaW4gYHR5cGVvZmAgdG8g Z2V0IHRoZSB0eXBlIG9mIGFuIGl0ZW0uCiAgSXQgd2lsbCByZXR1cm4gdGhl IHNhbWUgcmVzdWx0IGFjcm9zcyBhbGwgYnJvd3NlcnMgYW5kIGluY2x1ZGVz IGEgYml0CiAgbW9yZSBkZXRhaWwuIEhlcmUgaXMgd2hhdCB3aWxsIGJlIHJl dHVybmVkOgoKICAgICAgfCBSZXR1cm4gVmFsdWUgIHwgTWVhbmluZyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAg ICAgIHwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAogICAgICB8ICdzdHJp bmcnICAgICAgfCBTdHJpbmcgcHJpbWl0aXZlIG9yIFN0cmluZyBvYmplY3Qu ICAgICAgICAgICAgICAgICAgIHwKICAgICAgfCAnbnVtYmVyJyAgICAgIHwg TnVtYmVyIHByaW1pdGl2ZSBvciBOdW1iZXIgb2JqZWN0LiAgICAgICAgICAg ICAgICAgICB8CiAgICAgIHwgJ2Jvb2xlYW4nICAgICB8IEJvb2xlYW4gcHJp bWl0aXZlIG9yIEJvb2xlYW4gb2JqZWN0LiAgICAgICAgICAgICAgICAgfAog ICAgICB8ICdudWxsJyAgICAgICAgfCBOdWxsIHZhbHVlICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAgfCAndW5k ZWZpbmVkJyAgIHwgVW5kZWZpbmVkIHZhbHVlICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8CiAgICAgIHwgJ2Z1bmN0aW9uJyAgICB8 IEEgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfAogICAgICB8ICdhcnJheScgICAgICAgfCBBbiBpbnN0YW5j ZSBvZiBBcnJheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwK ICAgICAgfCAncmVnZXhwJyAgICAgIHwgQW4gaW5zdGFuY2Ugb2YgUmVnRXhw ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgIHwgJ2Rh dGUnICAgICAgICB8IEFuIGluc3RhbmNlIG9mIERhdGUgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfAogICAgICB8ICdjbGFzcycgICAgICAg fCBBbiBFbWJlciBjbGFzcyAoY3JlYXRlZCB1c2luZyBFbWJlci5PYmplY3Qu ZXh0ZW5kKCkpIHwKICAgICAgfCAnaW5zdGFuY2UnICAgIHwgQW4gRW1iZXIg b2JqZWN0IGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 CiAgICAgIHwgJ2Vycm9yJyAgICAgICB8IEFuIGluc3RhbmNlIG9mIHRoZSBF cnJvciBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgfAogICAgICB8ICdv YmplY3QnICAgICAgfCBBIEphdmFTY3JpcHQgb2JqZWN0IG5vdCBpbmhlcml0 aW5nIGZyb20gRW1iZXIuT2JqZWN0IHwKCiAgRXhhbXBsZXM6CgogIGBgYGph dmFzY3JpcHQKICBFbWJlci50eXBlT2YoKTsgICAgICAgICAgICAgICAgICAg ICAgIC8vICd1bmRlZmluZWQnCiAgRW1iZXIudHlwZU9mKG51bGwpOyAgICAg ICAgICAgICAgICAgICAvLyAnbnVsbCcKICBFbWJlci50eXBlT2YodW5kZWZp bmVkKTsgICAgICAgICAgICAgIC8vICd1bmRlZmluZWQnCiAgRW1iZXIudHlw ZU9mKCdtaWNoYWVsJyk7ICAgICAgICAgICAgICAvLyAnc3RyaW5nJwogIEVt YmVyLnR5cGVPZihuZXcgU3RyaW5nKCdtaWNoYWVsJykpOyAgLy8gJ3N0cmlu ZycKICBFbWJlci50eXBlT2YoMTAxKTsgICAgICAgICAgICAgICAgICAgIC8v ICdudW1iZXInCiAgRW1iZXIudHlwZU9mKG5ldyBOdW1iZXIoMTAxKSk7ICAg ICAgICAvLyAnbnVtYmVyJwogIEVtYmVyLnR5cGVPZih0cnVlKTsgICAgICAg ICAgICAgICAgICAgLy8gJ2Jvb2xlYW4nCiAgRW1iZXIudHlwZU9mKG5ldyBC b29sZWFuKHRydWUpKTsgICAgICAvLyAnYm9vbGVhbicKICBFbWJlci50eXBl T2YoRW1iZXIubWFrZUFycmF5KTsgICAgICAgIC8vICdmdW5jdGlvbicKICBF bWJlci50eXBlT2YoWzEsMiw5MF0pOyAgICAgICAgICAgICAgIC8vICdhcnJh eScKICBFbWJlci50eXBlT2YoL2FiYy8pOyAgICAgICAgICAgICAgICAgIC8v ICdyZWdleHAnCiAgRW1iZXIudHlwZU9mKG5ldyBEYXRlKCkpOyAgICAgICAg ICAgICAvLyAnZGF0ZScKICBFbWJlci50eXBlT2YoRW1iZXIuT2JqZWN0LmV4 dGVuZCgpKTsgIC8vICdjbGFzcycKICBFbWJlci50eXBlT2YoRW1iZXIuT2Jq ZWN0LmNyZWF0ZSgpKTsgIC8vICdpbnN0YW5jZScKICBFbWJlci50eXBlT2Yo bmV3IEVycm9yKCd0ZWFtb2NpbCcpKTsgIC8vICdlcnJvcicKCiAgLy8gIm5v cm1hbCIgSmF2YVNjcmlwdCBvYmplY3QKICBFbWJlci50eXBlT2Yoe2E6ICdi J30pOyAgICAgICAgICAgICAgLy8gJ29iamVjdCcKICBgYGAKCiAgQG1ldGhv ZCB0eXBlT2YKICBAZm9yIEVtYmVyCiAgQHBhcmFtIHtPYmplY3R9IGl0ZW0g dGhlIGl0ZW0gdG8gY2hlY2sKICBAcmV0dXJuIHtTdHJpbmd9IHRoZSB0eXBl CiovCkVtYmVyLnR5cGVPZiA9IGZ1bmN0aW9uKGl0ZW0pIHsKICB2YXIgcmV0 OwoKICByZXQgPSAoaXRlbSA9PT0gbnVsbCB8fCBpdGVtID09PSB1bmRlZmlu ZWQpID8gU3RyaW5nKGl0ZW0pIDogVFlQRV9NQVBbdG9TdHJpbmcuY2FsbChp dGVtKV0gfHwgJ29iamVjdCc7CgogIGlmIChyZXQgPT09ICdmdW5jdGlvbicp IHsKICAgIGlmIChFbWJlci5PYmplY3QgJiYgRW1iZXIuT2JqZWN0LmRldGVj dChpdGVtKSkgcmV0ID0gJ2NsYXNzJzsKICB9IGVsc2UgaWYgKHJldCA9PT0g J29iamVjdCcpIHsKICAgIGlmIChpdGVtIGluc3RhbmNlb2YgRXJyb3IpIHJl dCA9ICdlcnJvcic7CiAgICBlbHNlIGlmIChFbWJlci5PYmplY3QgJiYgaXRl bSBpbnN0YW5jZW9mIEVtYmVyLk9iamVjdCkgcmV0ID0gJ2luc3RhbmNlJzsK ICAgIGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBEYXRlKSByZXQgPSAnZGF0 ZSc7CiAgfQoKICByZXR1cm4gcmV0Owp9OwoKLyoqCiAgQ29udmVuaWVuY2Ug bWV0aG9kIHRvIGluc3BlY3QgYW4gb2JqZWN0LiBUaGlzIG1ldGhvZCB3aWxs IGF0dGVtcHQgdG8KICBjb252ZXJ0IHRoZSBvYmplY3QgaW50byBhIHVzZWZ1 bCBzdHJpbmcgZGVzY3JpcHRpb24uCgogIEl0IGlzIGEgcHJldHR5IHNpbXBs ZSBpbXBsZW1lbnRhdGlvbi4gSWYgeW91IHdhbnQgc29tZXRoaW5nIG1vcmUg cm9idXN0LAogIHVzZSBzb21ldGhpbmcgbGlrZSBKU0R1bXA6IGh0dHBzOi8v Z2l0aHViLmNvbS9OVi9qc0R1bXAKCiAgQG1ldGhvZCBpbnNwZWN0CiAgQGZv ciBFbWJlcgogIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB5b3Ug d2FudCB0byBpbnNwZWN0LgogIEByZXR1cm4ge1N0cmluZ30gQSBkZXNjcmlw dGlvbiBvZiB0aGUgb2JqZWN0CiovCkVtYmVyLmluc3BlY3QgPSBmdW5jdGlv bihvYmopIHsKICB2YXIgdHlwZSA9IEVtYmVyLnR5cGVPZihvYmopOwogIGlm ICh0eXBlID09PSAnYXJyYXknKSB7CiAgICByZXR1cm4gJ1snICsgb2JqICsg J10nOwogIH0KICBpZiAodHlwZSAhPT0gJ29iamVjdCcpIHsKICAgIHJldHVy biBvYmogKyAnJzsKICB9CgogIHZhciB2LCByZXQgPSBbXTsKICBmb3IodmFy IGtleSBpbiBvYmopIHsKICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5 KSkgewogICAgICB2ID0gb2JqW2tleV07CiAgICAgIGlmICh2ID09PSAndG9T dHJpbmcnKSB7IGNvbnRpbnVlOyB9IC8vIGlnbm9yZSB1c2VsZXNzIGl0ZW1z CiAgICAgIGlmIChFbWJlci50eXBlT2YodikgPT09ICdmdW5jdGlvbicpIHsg diA9ICJmdW5jdGlvbigpIHsgLi4uIH0iOyB9CiAgICAgIHJldC5wdXNoKGtl eSArICI6ICIgKyB2KTsKICAgIH0KICB9CiAgcmV0dXJuICJ7IiArIHJldC5q b2luKCIsICIpICsgIn0iOwp9OwoKCgp9KSgpOwoKCgooZnVuY3Rpb24oKSB7 Ci8vIEVtYmVyLnRyeUNhdGNoRmluYWxseQoKLyoqCiAgVGhlIHB1cnBvc2Ug b2YgdGhlIEVtYmVyIEluc3RydW1lbnRhdGlvbiBtb2R1bGUgaXMKICB0byBw cm92aWRlIGVmZmljaWVudCwgZ2VuZXJhbC1wdXJwb3NlIGluc3RydW1lbnRh dGlvbgogIGZvciBFbWJlci4KCiAgU3Vic2NyaWJlIHRvIGEgbGlzdGVuZXIg YnkgdXNpbmcgYEVtYmVyLnN1YnNjcmliZWA6CgogIGBgYGphdmFzY3JpcHQK ICBFbWJlci5zdWJzY3JpYmUoInJlbmRlciIsIHsKICAgIGJlZm9yZTogZnVu Y3Rpb24obmFtZSwgdGltZXN0YW1wLCBwYXlsb2FkKSB7CgogICAgfSwKCiAg ICBhZnRlcjogZnVuY3Rpb24obmFtZSwgdGltZXN0YW1wLCBwYXlsb2FkKSB7 CgogICAgfQogIH0pOwogIGBgYAoKICBJZiB5b3UgcmV0dXJuIGEgdmFsdWUg ZnJvbSB0aGUgYGJlZm9yZWAgY2FsbGJhY2ssIHRoYXQgc2FtZQogIHZhbHVl IHdpbGwgYmUgcGFzc2VkIGFzIGEgZm91cnRoIHBhcmFtZXRlciB0byB0aGUg YGFmdGVyYAogIGNhbGxiYWNrLgoKICBJbnN0cnVtZW50IGEgYmxvY2sgb2Yg Y29kZSBieSB1c2luZyBgRW1iZXIuaW5zdHJ1bWVudGA6CgogIGBgYGphdmFz Y3JpcHQKICBFbWJlci5pbnN0cnVtZW50KCJyZW5kZXIuaGFuZGxlYmFycyIs IHBheWxvYWQsIGZ1bmN0aW9uKCkgewogICAgLy8gcmVuZGVyaW5nIGxvZ2lj CiAgfSwgYmluZGluZyk7CiAgYGBgCgogIEV2ZW50IG5hbWVzIHBhc3NlZCB0 byBgRW1iZXIuaW5zdHJ1bWVudGAgYXJlIG5hbWVzcGFjZWQKICBieSBwZXJp b2RzLCBmcm9tIG1vcmUgZ2VuZXJhbCB0byBtb3JlIHNwZWNpZmljLiBTdWJz Y3JpYmVycwogIGNhbiBsaXN0ZW4gZm9yIGV2ZW50cyBieSB3aGF0ZXZlciBs ZXZlbCBvZiBncmFudWxhcml0eSB0aGV5CiAgYXJlIGludGVyZXN0ZWQgaW4u CgogIEluIHRoZSBhYm92ZSBleGFtcGxlLCB0aGUgZXZlbnQgaXMgYHJlbmRl ci5oYW5kbGViYXJzYCwKICBhbmQgdGhlIHN1YnNjcmliZXIgbGlzdGVuZWQg Zm9yIGFsbCBldmVudHMgYmVnaW5uaW5nIHdpdGgKICBgcmVuZGVyYC4gSXQg d291bGQgcmVjZWl2ZSBjYWxsYmFja3MgZm9yIGV2ZW50cyBuYW1lZAogIGBy ZW5kZXJgLCBgcmVuZGVyLmhhbmRsZWJhcnNgLCBgcmVuZGVyLmNvbnRhaW5l cmAsIG9yCiAgZXZlbiBgcmVuZGVyLmhhbmRsZWJhcnMubGF5b3V0YC4KCiAg QGNsYXNzIEluc3RydW1lbnRhdGlvbgogIEBuYW1lc3BhY2UgRW1iZXIKICBA c3RhdGljCiovCkVtYmVyLkluc3RydW1lbnRhdGlvbiA9IHt9OwoKdmFyIHN1 YnNjcmliZXJzID0gW10sIGNhY2hlID0ge307Cgp2YXIgcG9wdWxhdGVMaXN0 ZW5lcnMgPSBmdW5jdGlvbihuYW1lKSB7CiAgdmFyIGxpc3RlbmVycyA9IFtd LCBzdWJzY3JpYmVyOwoKICBmb3IgKHZhciBpPTAsIGw9c3Vic2NyaWJlcnMu bGVuZ3RoOyBpPGw7IGkrKykgewogICAgc3Vic2NyaWJlciA9IHN1YnNjcmli ZXJzW2ldOwogICAgaWYgKHN1YnNjcmliZXIucmVnZXgudGVzdChuYW1lKSkg ewogICAgICBsaXN0ZW5lcnMucHVzaChzdWJzY3JpYmVyLm9iamVjdCk7CiAg ICB9CiAgfQoKICBjYWNoZVtuYW1lXSA9IGxpc3RlbmVyczsKICByZXR1cm4g bGlzdGVuZXJzOwp9OwoKdmFyIHRpbWUgPSAoZnVuY3Rpb24oKSB7CiAgdmFy IHBlcmYgPSAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIHdpbmRvdyA/IHdpbmRv dy5wZXJmb3JtYW5jZSB8fCB7fSA6IHt9OwogIHZhciBmbiA9IHBlcmYubm93 IHx8IHBlcmYubW96Tm93IHx8IHBlcmYud2Via2l0Tm93IHx8IHBlcmYubXNO b3cgfHwgcGVyZi5vTm93OwogIC8vIGZuLmJpbmQgd2lsbCBiZSBhdmFpbGFi bGUgaW4gYWxsIHRoZSBicm93c2VycyB0aGF0IHN1cHBvcnQgdGhlIGFkdmFu Y2VkIHdpbmRvdy5wZXJmb3JtYW5jZS4uLiA7LSkKICByZXR1cm4gZm4gPyBm bi5iaW5kKHBlcmYpIDogZnVuY3Rpb24oKSB7IHJldHVybiArbmV3IERhdGUo KTsgfTsKfSkoKTsKCi8qKgogIE5vdGlmaWVzIGV2ZW50J3Mgc3Vic2NyaWJl cnMsIGNhbGxzIGBiZWZvcmVgIGFuZCBgYWZ0ZXJgIGhvb2tzLgoKICBAbWV0 aG9kIGluc3RydW1lbnQKICBAbmFtZXNwYWNlIEVtYmVyLkluc3RydW1lbnRh dGlvbgoKICBAcGFyYW0ge1N0cmluZ30gW25hbWVdIE5hbWVzcGFjZWQgZXZl bnQgbmFtZS4KICBAcGFyYW0ge09iamVjdH0gcGF5bG9hZAogIEBwYXJhbSB7 RnVuY3Rpb259IGNhbGxiYWNrIEZ1bmN0aW9uIHRoYXQgeW91J3JlIGluc3Ry dW1lbnRpbmcuCiAgQHBhcmFtIHtPYmplY3R9IGJpbmRpbmcgQ29udGV4dCB0 aGF0IGluc3RydW1lbnQgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGguCiovCkVt YmVyLkluc3RydW1lbnRhdGlvbi5pbnN0cnVtZW50ID0gZnVuY3Rpb24obmFt ZSwgcGF5bG9hZCwgY2FsbGJhY2ssIGJpbmRpbmcpIHsKICB2YXIgbGlzdGVu ZXJzID0gY2FjaGVbbmFtZV0sIHRpbWVOYW1lLCByZXQ7CgogIGlmIChFbWJl ci5TVFJVQ1RVUkVEX1BST0ZJTEUpIHsKICAgIHRpbWVOYW1lID0gbmFtZSAr ICI6ICIgKyBwYXlsb2FkLm9iamVjdDsKICAgIGNvbnNvbGUudGltZSh0aW1l TmFtZSk7CiAgfQoKICBpZiAoIWxpc3RlbmVycykgewogICAgbGlzdGVuZXJz ID0gcG9wdWxhdGVMaXN0ZW5lcnMobmFtZSk7CiAgfQoKICBpZiAobGlzdGVu ZXJzLmxlbmd0aCA9PT0gMCkgewogICAgcmV0ID0gY2FsbGJhY2suY2FsbChi aW5kaW5nKTsKICAgIGlmIChFbWJlci5TVFJVQ1RVUkVEX1BST0ZJTEUpIHsg Y29uc29sZS50aW1lRW5kKHRpbWVOYW1lKTsgfQogICAgcmV0dXJuIHJldDsK ICB9CgogIHZhciBiZWZvcmVWYWx1ZXMgPSBbXSwgbGlzdGVuZXIsIGksIGw7 CgogIGZ1bmN0aW9uIHRyeWFibGUoKSB7CiAgICBmb3IgKGk9MCwgbD1saXN0 ZW5lcnMubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICBsaXN0ZW5lciA9IGxp c3RlbmVyc1tpXTsKICAgICAgYmVmb3JlVmFsdWVzW2ldID0gbGlzdGVuZXIu YmVmb3JlKG5hbWUsIHRpbWUoKSwgcGF5bG9hZCk7CiAgICB9CgogICAgcmV0 dXJuIGNhbGxiYWNrLmNhbGwoYmluZGluZyk7CiAgfQoKICBmdW5jdGlvbiBj YXRjaGFibGUoZSkgewogICAgcGF5bG9hZCA9IHBheWxvYWQgfHwge307CiAg ICBwYXlsb2FkLmV4Y2VwdGlvbiA9IGU7CiAgfQoKICBmdW5jdGlvbiBmaW5h bGl6ZXIoKSB7CiAgICBmb3IgKGk9MCwgbD1saXN0ZW5lcnMubGVuZ3RoOyBp PGw7IGkrKykgewogICAgICBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpXTsKICAg ICAgbGlzdGVuZXIuYWZ0ZXIobmFtZSwgdGltZSgpLCBwYXlsb2FkLCBiZWZv cmVWYWx1ZXNbaV0pOwogICAgfQoKICAgIGlmIChFbWJlci5TVFJVQ1RVUkVE X1BST0ZJTEUpIHsKICAgICAgY29uc29sZS50aW1lRW5kKHRpbWVOYW1lKTsK ICAgIH0KICB9CgogIHJldHVybiBFbWJlci50cnlDYXRjaEZpbmFsbHkodHJ5 YWJsZSwgY2F0Y2hhYmxlLCBmaW5hbGl6ZXIpOwp9OwoKLyoqCiAgU3Vic2Ny aWJlcyB0byBhIHBhcnRpY3VsYXIgZXZlbnQgb3IgaW5zdHJ1bWVudGVkIGJs b2NrIG9mIGNvZGUuCgogIEBtZXRob2Qgc3Vic2NyaWJlCiAgQG5hbWVzcGFj ZSBFbWJlci5JbnN0cnVtZW50YXRpb24KCiAgQHBhcmFtIHtTdHJpbmd9IFtw YXR0ZXJuXSBOYW1lc3BhY2VkIGV2ZW50IG5hbWUuCiAgQHBhcmFtIHtPYmpl Y3R9IFtvYmplY3RdIEJlZm9yZSBhbmQgQWZ0ZXIgaG9va3MuCgogIEByZXR1 cm4ge1N1YnNjcmliZXJ9CiovCkVtYmVyLkluc3RydW1lbnRhdGlvbi5zdWJz Y3JpYmUgPSBmdW5jdGlvbihwYXR0ZXJuLCBvYmplY3QpIHsKICB2YXIgcGF0 aHMgPSBwYXR0ZXJuLnNwbGl0KCIuIiksIHBhdGgsIHJlZ2V4ID0gW107Cgog IGZvciAodmFyIGk9MCwgbD1wYXRocy5sZW5ndGg7IGk8bDsgaSsrKSB7CiAg ICBwYXRoID0gcGF0aHNbaV07CiAgICBpZiAocGF0aCA9PT0gIioiKSB7CiAg ICAgIHJlZ2V4LnB1c2goIlteXFwuXSoiKTsKICAgIH0gZWxzZSB7CiAgICAg IHJlZ2V4LnB1c2gocGF0aCk7CiAgICB9CiAgfQoKICByZWdleCA9IHJlZ2V4 LmpvaW4oIlxcLiIpOwogIHJlZ2V4ID0gcmVnZXggKyAiKFxcLi4qKT8iOwoK ICB2YXIgc3Vic2NyaWJlciA9IHsKICAgIHBhdHRlcm46IHBhdHRlcm4sCiAg ICByZWdleDogbmV3IFJlZ0V4cCgiXiIgKyByZWdleCArICIkIiksCiAgICBv YmplY3Q6IG9iamVjdAogIH07CgogIHN1YnNjcmliZXJzLnB1c2goc3Vic2Ny aWJlcik7CiAgY2FjaGUgPSB7fTsKCiAgcmV0dXJuIHN1YnNjcmliZXI7Cn07 CgovKioKICBVbnN1YnNjcmliZXMgZnJvbSBhIHBhcnRpY3VsYXIgZXZlbnQg b3IgaW5zdHJ1bWVudGVkIGJsb2NrIG9mIGNvZGUuCgogIEBtZXRob2QgdW5z dWJzY3JpYmUKICBAbmFtZXNwYWNlIEVtYmVyLkluc3RydW1lbnRhdGlvbgoK ICBAcGFyYW0ge09iamVjdH0gW3N1YnNjcmliZXJdCiovCkVtYmVyLkluc3Ry dW1lbnRhdGlvbi51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKHN1YnNjcmliZXIp IHsKICB2YXIgaW5kZXg7CgogIGZvciAodmFyIGk9MCwgbD1zdWJzY3JpYmVy cy5sZW5ndGg7IGk8bDsgaSsrKSB7CiAgICBpZiAoc3Vic2NyaWJlcnNbaV0g PT09IHN1YnNjcmliZXIpIHsKICAgICAgaW5kZXggPSBpOwogICAgfQogIH0K CiAgc3Vic2NyaWJlcnMuc3BsaWNlKGluZGV4LCAxKTsKICBjYWNoZSA9IHt9 Owp9OwoKLyoqCiAgUmVzZXRzIGBFbWJlci5JbnN0cnVtZW50YXRpb25gIGJ5 IGZsdXNoaW5nIGxpc3Qgb2Ygc3Vic2NyaWJlcnMuCgogIEBtZXRob2QgcmVz ZXQKICBAbmFtZXNwYWNlIEVtYmVyLkluc3RydW1lbnRhdGlvbgoqLwpFbWJl ci5JbnN0cnVtZW50YXRpb24ucmVzZXQgPSBmdW5jdGlvbigpIHsKICBzdWJz Y3JpYmVycyA9IFtdOwogIGNhY2hlID0ge307Cn07CgpFbWJlci5pbnN0cnVt ZW50ID0gRW1iZXIuSW5zdHJ1bWVudGF0aW9uLmluc3RydW1lbnQ7CkVtYmVy LnN1YnNjcmliZSA9IEVtYmVyLkluc3RydW1lbnRhdGlvbi5zdWJzY3JpYmU7 Cn0pKCk7CgoKCihmdW5jdGlvbigpIHsKdmFyIG1hcCwgZm9yRWFjaCwgaW5k ZXhPZiwgc3BsaWNlLCBmaWx0ZXI7Cm1hcCAgICAgPSBBcnJheS5wcm90b3R5 cGUubWFwICAgICB8fCBFbWJlci5BcnJheVBvbHlmaWxscy5tYXA7CmZvckVh Y2ggPSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCB8fCBFbWJlci5BcnJheVBv bHlmaWxscy5mb3JFYWNoOwppbmRleE9mID0gQXJyYXkucHJvdG90eXBlLmlu ZGV4T2YgfHwgRW1iZXIuQXJyYXlQb2x5ZmlsbHMuaW5kZXhPZjsKZmlsdGVy ID0gQXJyYXkucHJvdG90eXBlLmZpbHRlciB8fCBFbWJlci5BcnJheVBvbHlm aWxscy5maWx0ZXI7CnNwbGljZSA9IEFycmF5LnByb3RvdHlwZS5zcGxpY2U7 CgovKioKICogRGVmaW5lcyBzb21lIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9y IHdvcmtpbmcgd2l0aCBFbnVtZXJhYmxlcy4KICogYEVtYmVyLkVudW1lcmFi bGVVdGlsc2AgdXNlcyBgRW1iZXIuQXJyYXlQb2x5ZmlsbHNgIHdoZW4gbmVj ZXNzYXJ5LgogKgogKiBAY2xhc3MgRW51bWVyYWJsZVV0aWxzCiAqIEBuYW1l c3BhY2UgRW1iZXIKICogQHN0YXRpYwogKiAqLwp2YXIgdXRpbHMgPSBFbWJl ci5FbnVtZXJhYmxlVXRpbHMgPSB7CiAgLyoqCiAgICogQ2FsbHMgdGhlIG1h cCBmdW5jdGlvbiBvbiB0aGUgcGFzc2VkIG9iamVjdCB3aXRoIGEgc3BlY2lm aWVkIGNhbGxiYWNrLiBUaGlzCiAgICogdXNlcyBgRW1iZXIuQXJyYXlQb2x5 ZmlsbGAncy1tYXAgbWV0aG9kIHdoZW4gbmVjZXNzYXJ5LgogICAqCiAgICog QG1ldGhvZCBtYXAKICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmpl Y3QgdGhhdCBzaG91bGQgYmUgbWFwcGVkCiAgICogQHBhcmFtIHtGdW5jdGlv bn0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUKICAgKiBAcGFy YW0ge09iamVjdH0gdGhpc0FyZyBWYWx1ZSB0byB1c2UgYXMgdGhpcyB3aGVu IGV4ZWN1dGluZyAqY2FsbGJhY2sqCiAgICoKICAgKiBAcmV0dXJuIHtBcnJh eX0gQW4gYXJyYXkgb2YgbWFwcGVkIHZhbHVlcy4KICAgKi8KICBtYXA6IGZ1 bmN0aW9uKG9iaiwgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIHJldHVybiBv YmoubWFwID8gb2JqLm1hcC5jYWxsKG9iaiwgY2FsbGJhY2ssIHRoaXNBcmcp IDogbWFwLmNhbGwob2JqLCBjYWxsYmFjaywgdGhpc0FyZyk7CiAgfSwKCiAg LyoqCiAgICogQ2FsbHMgdGhlIGZvckVhY2ggZnVuY3Rpb24gb24gdGhlIHBh c3NlZCBvYmplY3Qgd2l0aCBhIHNwZWNpZmllZCBjYWxsYmFjay4gVGhpcwog ICAqIHVzZXMgYEVtYmVyLkFycmF5UG9seWZpbGxgJ3MtZm9yRWFjaCBtZXRo b2Qgd2hlbiBuZWNlc3NhcnkuCiAgICoKICAgKiBAbWV0aG9kIGZvckVhY2gK ICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY2FsbCBm b3JFYWNoIG9uCiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhl IGNhbGxiYWNrIHRvIGV4ZWN1dGUKICAgKiBAcGFyYW0ge09iamVjdH0gdGhp c0FyZyBWYWx1ZSB0byB1c2UgYXMgdGhpcyB3aGVuIGV4ZWN1dGluZyAqY2Fs bGJhY2sqCiAgICoKICAgKi8KICBmb3JFYWNoOiBmdW5jdGlvbihvYmosIGNh bGxiYWNrLCB0aGlzQXJnKSB7CiAgICByZXR1cm4gb2JqLmZvckVhY2ggPyBv YmouZm9yRWFjaC5jYWxsKG9iaiwgY2FsbGJhY2ssIHRoaXNBcmcpIDogZm9y RWFjaC5jYWxsKG9iaiwgY2FsbGJhY2ssIHRoaXNBcmcpOwogIH0sCgogIC8q KgogICAqIENhbGxzIHRoZSBmaWx0ZXIgZnVuY3Rpb24gb24gdGhlIHBhc3Nl ZCBvYmplY3Qgd2l0aCBhIHNwZWNpZmllZCBjYWxsYmFjay4gVGhpcwogICAq IHVzZXMgYEVtYmVyLkFycmF5UG9seWZpbGxgJ3MtZmlsdGVyIG1ldGhvZCB3 aGVuIG5lY2Vzc2FyeS4KICAgKgogICAqIEBtZXRob2QgZmlsdGVyCiAgICog QHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNhbGwgZmlsdGVy IG9uCiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGNhbGxi YWNrIHRvIGV4ZWN1dGUKICAgKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBW YWx1ZSB0byB1c2UgYXMgdGhpcyB3aGVuIGV4ZWN1dGluZyAqY2FsbGJhY2sq CiAgICoKICAgKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgY29udGFpbmlu ZyB0aGUgZmlsdGVyZWQgdmFsdWVzCiAgICovCiAgZmlsdGVyOiBmdW5jdGlv bihvYmosIGNhbGxiYWNrLCB0aGlzQXJnKSB7CiAgICByZXR1cm4gb2JqLmZp bHRlciA/IG9iai5maWx0ZXIuY2FsbChvYmosIGNhbGxiYWNrLCB0aGlzQXJn KSA6IGZpbHRlci5jYWxsKG9iaiwgY2FsbGJhY2ssIHRoaXNBcmcpOwogIH0s CgogIC8qKgogICAqIENhbGxzIHRoZSBpbmRleE9mIGZ1bmN0aW9uIG9uIHRo ZSBwYXNzZWQgb2JqZWN0IHdpdGggYSBzcGVjaWZpZWQgY2FsbGJhY2suIFRo aXMKICAgKiB1c2VzIGBFbWJlci5BcnJheVBvbHlmaWxsYCdzLWluZGV4T2Yg bWV0aG9kIHdoZW4gbmVjZXNzYXJ5LgogICAqCiAgICogQG1ldGhvZCBpbmRl eE9mCiAgICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNh bGwgaW5kZXhPbiBvbgogICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNr IFRoZSBjYWxsYmFjayB0byBleGVjdXRlCiAgICogQHBhcmFtIHtPYmplY3R9 IGluZGV4IFRoZSBpbmRleCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbQogICAq CiAgICovCiAgaW5kZXhPZjogZnVuY3Rpb24ob2JqLCBlbGVtZW50LCBpbmRl eCkgewogICAgcmV0dXJuIG9iai5pbmRleE9mID8gb2JqLmluZGV4T2YuY2Fs bChvYmosIGVsZW1lbnQsIGluZGV4KSA6IGluZGV4T2YuY2FsbChvYmosIGVs ZW1lbnQsIGluZGV4KTsKICB9LAoKICAvKioKICAgKiBSZXR1cm5zIGFuIGFy cmF5IG9mIGluZGV4ZXMgb2YgdGhlIGZpcnN0IG9jY3VycmVuY2VzIG9mIHRo ZSBwYXNzZWQgZWxlbWVudHMKICAgKiBvbiB0aGUgcGFzc2VkIG9iamVjdC4K ICAgKgogICAqIGBgYGphdmFzY3JpcHQKICAgKiAgdmFyIGFycmF5ID0gWzEs IDIsIDMsIDQsIDVdOwogICAqICBFbWJlci5FbnVtZXJhYmxlVXRpbHMuaW5k ZXhlc09mKGFycmF5LCBbMiwgNV0pOyAvLyBbMSwgNF0KICAgKgogICAqICB2 YXIgZnViYXIgPSAiRnViYXJyIjsKICAgKiAgRW1iZXIuRW51bWVyYWJsZVV0 aWxzLmluZGV4ZXNPZihmdWJhciwgWydiJywgJ3InXSk7IC8vIFsyLCA0XQog ICAqIGBgYAogICAqCiAgICogQG1ldGhvZCBpbmRleGVzT2YKICAgKiBAcGFy YW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY2hlY2sgZm9yIGVsZW1l bnQgaW5kZXhlcwogICAqIEBwYXJhbSB7QXJyYXl9IGVsZW1lbnRzIFRoZSBl bGVtZW50cyB0byBzZWFyY2ggZm9yIG9uICpvYmoqCiAgICoKICAgKiBAcmV0 dXJuIHtBcnJheX0gQW4gYXJyYXkgb2YgaW5kZXhlcy4KICAgKgogICAqLwog IGluZGV4ZXNPZjogZnVuY3Rpb24ob2JqLCBlbGVtZW50cykgewogICAgcmV0 dXJuIGVsZW1lbnRzID09PSB1bmRlZmluZWQgPyBbXSA6IHV0aWxzLm1hcChl bGVtZW50cywgZnVuY3Rpb24oaXRlbSkgewogICAgICByZXR1cm4gdXRpbHMu aW5kZXhPZihvYmosIGl0ZW0pOwogICAgfSk7CiAgfSwKCiAgLyoqIAogICAq IEFkZHMgYW4gb2JqZWN0IHRvIGFuIGFycmF5LiBJZiB0aGUgYXJyYXkgYWxy ZWFkeSBpbmNsdWRlcyB0aGUgb2JqZWN0IHRoaXMKICAgKiBtZXRob2QgaGFz IG5vIGVmZmVjdC4KICAgKgogICAqIEBtZXRob2QgYWRkT2JqZWN0CiAgICog QHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRoZSBwYXNzZWQgaXRl bSBzaG91bGQgYmUgYWRkZWQgdG8KICAgKiBAcGFyYW0ge09iamVjdH0gaXRl bSBUaGUgaXRlbSB0byBhZGQgdG8gdGhlIHBhc3NlZCBhcnJheQogICAqCiAg ICogQHJldHVybiAndW5kZWZpbmVkJwogICAqLwogIGFkZE9iamVjdDogZnVu Y3Rpb24oYXJyYXksIGl0ZW0pIHsKICAgIHZhciBpbmRleCA9IHV0aWxzLmlu ZGV4T2YoYXJyYXksIGl0ZW0pOwogICAgaWYgKGluZGV4ID09PSAtMSkgeyBh cnJheS5wdXNoKGl0ZW0pOyB9CiAgfSwKCiAgLyoqCiAgICogUmVtb3ZlcyBh biBvYmplY3QgZnJvbSBhbiBhcnJheS4gSWYgdGhlIGFycmF5IGRvZXMgbm90 IGNvbnRhaW4gdGhlIHBhc3NlZAogICAqIG9iamVjdCB0aGlzIG1ldGhvZCBo YXMgbm8gZWZmZWN0LgogICAqCiAgICogQG1ldGhvZCByZW1vdmVPYmplY3QK ICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcmVtb3Zl IHRoZSBpdGVtIGZyb20uCiAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gVGhl IGl0ZW0gdG8gcmVtb3ZlIGZyb20gdGhlIHBhc3NlZCBhcnJheS4KICAgKgog ICAqIEByZXR1cm4gJ3VuZGVmaW5lZCcKICAgKi8KICByZW1vdmVPYmplY3Q6 IGZ1bmN0aW9uKGFycmF5LCBpdGVtKSB7CiAgICB2YXIgaW5kZXggPSB1dGls cy5pbmRleE9mKGFycmF5LCBpdGVtKTsKICAgIGlmIChpbmRleCAhPT0gLTEp IHsgYXJyYXkuc3BsaWNlKGluZGV4LCAxKTsgfQogIH0sCgogIF9yZXBsYWNl OiBmdW5jdGlvbihhcnJheSwgaWR4LCBhbXQsIG9iamVjdHMpIHsKICAgIHZh ciBhcmdzID0gW10uY29uY2F0KG9iamVjdHMpLCBjaHVuaywgcmV0ID0gW10s CiAgICAgICAgLy8gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1 bS9pc3N1ZXMvZGV0YWlsP2lkPTU2NTg4CiAgICAgICAgc2l6ZSA9IDYwMDAw LCBzdGFydCA9IGlkeCwgZW5kcyA9IGFtdCwgY291bnQ7CgogICAgd2hpbGUg KGFyZ3MubGVuZ3RoKSB7CiAgICAgIGNvdW50ID0gZW5kcyA+IHNpemUgPyBz aXplIDogZW5kczsKICAgICAgaWYgKGNvdW50IDw9IDApIHsgY291bnQgPSAw OyB9CgogICAgICBjaHVuayA9IGFyZ3Muc3BsaWNlKDAsIHNpemUpOwogICAg ICBjaHVuayA9IFtzdGFydCwgY291bnRdLmNvbmNhdChjaHVuayk7CgogICAg ICBzdGFydCArPSBzaXplOwogICAgICBlbmRzIC09IGNvdW50OwoKICAgICAg cmV0ID0gcmV0LmNvbmNhdChzcGxpY2UuYXBwbHkoYXJyYXksIGNodW5rKSk7 CiAgICB9CiAgICByZXR1cm4gcmV0OwogIH0sCgogIC8qKgogICAqIFJlcGxh Y2VzIG9iamVjdHMgaW4gYW4gYXJyYXkgd2l0aCB0aGUgcGFzc2VkIG9iamVj dHMuCiAgICoKICAgKiBgYGBqYXZhc2NyaXB0CiAgICogICB2YXIgYXJyYXkg PSBbMSwyLDNdOwogICAqICAgRW1iZXIuRW51bWVyYWJsZVV0aWxzLnJlcGxh Y2UoYXJyYXksIDEsIDIsIFs0LCA1XSk7IC8vIFsxLCA0LCA1XQogICAqCiAg ICogICB2YXIgYXJyYXkgPSBbMSwyLDNdOwogICAqICAgRW1iZXIuRW51bWVy YWJsZVV0aWxzLnJlcGxhY2UoYXJyYXksIDEsIDEsIFs0LCA1XSk7IC8vIFsx LCA0LCA1LCAzXQogICAqCiAgICogICB2YXIgYXJyYXkgPSBbMSwyLDNdOwog ICAqICAgRW1iZXIuRW51bWVyYWJsZVV0aWxzLnJlcGxhY2UoYXJyYXksIDEw LCAxLCBbNCwgNV0pOyAvLyBbMSwgMiwgMywgNCwgNV0KICAgKiBgYGAKICAg KiAKICAgKiBAbWV0aG9kIHJlcGxhY2UKICAgKiBAcGFyYW0ge0FycmF5fSBh cnJheSBUaGUgYXJyYXkgdGhlIG9iamVjdHMgc2hvdWxkIGJlIGluc2VydGVk IGludG8uCiAgICogQHBhcmFtIHtOdW1iZXJ9IGlkeCBTdGFydGluZyBpbmRl eCBpbiB0aGUgYXJyYXkgdG8gcmVwbGFjZS4gSWYgKmlkeCogPj0KICAgKiBs ZW5ndGgsIHRoZW4gYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5Lgog ICAqIEBwYXJhbSB7TnVtYmVyfSBhbXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRo YXQgc2hvdWxkIGJlIHJlbW92ZSBmcm9tIHRoZSBhcnJheSwKICAgKiBzdGFy dGluZyBhdCAqaWR4KgogICAqIEBwYXJhbSB7QXJyYXl9IG9iamVjdHMgQW4g YXJyYXkgb2YgemVybyBvciBtb3JlIG9iamVjdHMgdGhhdCBzaG91bGQgYmUK ICAgKiBpbnNlcnRlZCBpbnRvIHRoZSBhcnJheSBhdCAqaWR4KgogICAqCiAg ICogQHJldHVybiB7QXJyYXl9IFRoZSBjaGFuZ2VkIGFycmF5LgogICAqLwog IHJlcGxhY2U6IGZ1bmN0aW9uKGFycmF5LCBpZHgsIGFtdCwgb2JqZWN0cykg ewogICAgaWYgKGFycmF5LnJlcGxhY2UpIHsKICAgICAgcmV0dXJuIGFycmF5 LnJlcGxhY2UoaWR4LCBhbXQsIG9iamVjdHMpOwogICAgfSBlbHNlIHsKICAg ICAgcmV0dXJuIHV0aWxzLl9yZXBsYWNlKGFycmF5LCBpZHgsIGFtdCwgb2Jq ZWN0cyk7CiAgICB9CiAgfSwKCiAgLyoqCiAgICogQ2FsY3VsYXRlcyB0aGUg aW50ZXJzZWN0aW9uIG9mIHR3byBhcnJheXMuIFRoaXMgbWV0aG9kIHJldHVy bnMgYSBuZXcgYXJyYXkKICAgKiBmaWxsZWQgd2l0aCB0aGUgcmVjb3JkcyB0 aGF0IHRoZSB0d28gcGFzc2VkIGFycmF5cyBzaGFyZSB3aXRoIGVhY2ggb3Ro ZXIuIAogICAqIElmIHRoZXJlIGlzIG5vIGludGVyc2VjdGlvbiwgYW4gZW1w dHkgYXJyYXkgd2lsbCBiZSByZXR1cm5lZC4KICAgKgogICAqIGBgYGphdmFz Y3JpcHQKICAgKiB2YXIgYXJyYXkxID0gWzEsIDIsIDMsIDQsIDVdOwogICAq IHZhciBhcnJheTIgPSBbMSwgMywgNSwgNiwgN107CiAgICoKICAgKiBFbWJl ci5FbnVtZXJhYmxlVXRpbHMuaW50ZXJzZWN0aW9uKGFycmF5MSwgYXJyYXky KTsgLy8gWzEsIDMsIDVdCiAgICoKICAgKiB2YXIgYXJyYXkxID0gWzEsIDIs IDNdOwogICAqIHZhciBhcnJheTIgPSBbNCwgNSwgNl07CiAgICoKICAgKiBF bWJlci5FbnVtZXJhYmxlVXRpbHMuaW50ZXJzZWN0aW9uKGFycmF5MSwgYXJy YXkyKTsgLy8gW10KICAgKiBgYGAKICAgKgogICAqIEBtZXRob2QgaW50ZXJz ZWN0aW9uCiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkxIFRoZSBmaXJzdCBh cnJheQogICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5MiBUaGUgc2Vjb25kIGFy cmF5CiAgICoKICAgKiBAcmV0dXJuIHtBcnJheX0gVGhlIGludGVyc2VjdGlv biBvZiB0aGUgdHdvIHBhc3NlZCBhcnJheXMuCiAgICovCiAgaW50ZXJzZWN0 aW9uOiBmdW5jdGlvbihhcnJheTEsIGFycmF5MikgewogICAgdmFyIGludGVy c2VjdGlvbiA9IFtdOwoKICAgIHV0aWxzLmZvckVhY2goYXJyYXkxLCBmdW5j dGlvbihlbGVtZW50KSB7CiAgICAgIGlmICh1dGlscy5pbmRleE9mKGFycmF5 MiwgZWxlbWVudCkgPj0gMCkgewogICAgICAgIGludGVyc2VjdGlvbi5wdXNo KGVsZW1lbnQpOwogICAgICB9CiAgICB9KTsKCiAgICByZXR1cm4gaW50ZXJz ZWN0aW9uOwogIH0KfTsKCn0pKCk7CgoKCihmdW5jdGlvbigpIHsKLyoqCkBt b2R1bGUgZW1iZXItbWV0YWwKKi8KCnZhciBNRVRBX0tFWSA9IEVtYmVyLk1F VEFfS0VZLCBnZXQ7Cgp2YXIgTUFOREFUT1JZX1NFVFRFUiA9IEVtYmVyLkVO Vi5NQU5EQVRPUllfU0VUVEVSOwoKdmFyIElTX0dMT0JBTF9QQVRIID0gL14o W0EtWiRdfChbMC05XVtBLVokXSkpLipbXC5cKl0vOwp2YXIgSEFTX1RISVMg ID0gL150aGlzW1wuXCpdLzsKdmFyIEZJUlNUX0tFWSA9IC9eKFteXC5cKl0r KS87CgovLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uCi8vIEdFVCBBTkQgU0VUCi8vCi8vIElm IHdlIGFyZSBvbiBhIHBsYXRmb3JtIHRoYXQgc3VwcG9ydHMgYWNjZXNzb3Jz IHdlIGNhbiB1c2UgdGhvc2UuCi8vIE90aGVyd2lzZSBzaW11bGF0ZSBhY2Nl c3NvcnMgYnkgbG9va2luZyB1cCB0aGUgcHJvcGVydHkgZGlyZWN0bHkgb24g dGhlCi8vIG9iamVjdC4KCi8qKgogIEdldHMgdGhlIHZhbHVlIG9mIGEgcHJv cGVydHkgb24gYW4gb2JqZWN0LiBJZiB0aGUgcHJvcGVydHkgaXMgY29tcHV0 ZWQsCiAgdGhlIGZ1bmN0aW9uIHdpbGwgYmUgaW52b2tlZC4gSWYgdGhlIHBy b3BlcnR5IGlzIG5vdCBkZWZpbmVkIGJ1dCB0aGUKICBvYmplY3QgaW1wbGVt ZW50cyB0aGUgYHVua25vd25Qcm9wZXJ0eWAgbWV0aG9kIHRoZW4gdGhhdCB3 aWxsIGJlIGludm9rZWQuCgogIElmIHlvdSBwbGFuIHRvIHJ1biBvbiBJRTgg YW5kIG9sZGVyIGJyb3dzZXJzIHRoZW4geW91IHNob3VsZCB1c2UgdGhpcwog IG1ldGhvZCBhbnl0aW1lIHlvdSB3YW50IHRvIHJldHJpZXZlIGEgcHJvcGVy dHkgb24gYW4gb2JqZWN0IHRoYXQgeW91IGRvbid0CiAga25vdyBmb3Igc3Vy ZSBpcyBwcml2YXRlLiAoUHJvcGVydGllcyBiZWdpbm5pbmcgd2l0aCBhbiB1 bmRlcnNjb3JlICdfJwogIGFyZSBjb25zaWRlcmVkIHByaXZhdGUuKQoKICBP biBhbGwgbmV3ZXIgYnJvd3NlcnMsIHlvdSBvbmx5IG5lZWQgdG8gdXNlIHRo aXMgbWV0aG9kIHRvIHJldHJpZXZlCiAgcHJvcGVydGllcyBpZiB0aGUgcHJv cGVydHkgbWlnaHQgbm90IGJlIGRlZmluZWQgb24gdGhlIG9iamVjdCBhbmQg eW91IHdhbnQKICB0byByZXNwZWN0IHRoZSBgdW5rbm93blByb3BlcnR5YCBo YW5kbGVyLiBPdGhlcndpc2UgeW91IGNhbiBpZ25vcmUgdGhpcwogIG1ldGhv ZC4KCiAgTm90ZSB0aGF0IGlmIHRoZSBvYmplY3QgaXRzZWxmIGlzIGB1bmRl ZmluZWRgLCB0aGlzIG1ldGhvZCB3aWxsIHRocm93CiAgYW4gZXJyb3IuCgog IEBtZXRob2QgZ2V0CiAgQGZvciBFbWJlcgogIEBwYXJhbSB7T2JqZWN0fSBv YmogVGhlIG9iamVjdCB0byByZXRyaWV2ZSBmcm9tLgogIEBwYXJhbSB7U3Ry aW5nfSBrZXlOYW1lIFRoZSBwcm9wZXJ0eSBrZXkgdG8gcmV0cmlldmUKICBA cmV0dXJuIHtPYmplY3R9IHRoZSBwcm9wZXJ0eSB2YWx1ZSBvciBgbnVsbGAu CiovCmdldCA9IGZ1bmN0aW9uIGdldChvYmosIGtleU5hbWUpIHsKICAvLyBI ZWxwZXJzIHRoYXQgb3BlcmF0ZSB3aXRoICd0aGlzJyB3aXRoaW4gYW4gI2Vh Y2gKICBpZiAoa2V5TmFtZSA9PT0gJycpIHsKICAgIHJldHVybiBvYmo7CiAg fQoKICBpZiAoIWtleU5hbWUgJiYgJ3N0cmluZyc9PT10eXBlb2Ygb2JqKSB7 CiAgICBrZXlOYW1lID0gb2JqOwogICAgb2JqID0gbnVsbDsKICB9CgogIEVt YmVyLmFzc2VydCgiQ2Fubm90IGNhbGwgZ2V0IHdpdGggIisga2V5TmFtZSAr IiBrZXkuIiwgISFrZXlOYW1lKTsKICBFbWJlci5hc3NlcnQoIkNhbm5vdCBj YWxsIGdldCB3aXRoICciKyBrZXlOYW1lICsiJyBvbiBhbiB1bmRlZmluZWQg b2JqZWN0LiIsIG9iaiAhPT0gdW5kZWZpbmVkKTsKCiAgaWYgKG9iaiA9PT0g bnVsbCB8fCBrZXlOYW1lLmluZGV4T2YoJy4nKSAhPT0gLTEpIHsKICAgIHJl dHVybiBnZXRQYXRoKG9iaiwga2V5TmFtZSk7CiAgfQoKICB2YXIgbWV0YSA9 IG9ialtNRVRBX0tFWV0sIGRlc2MgPSBtZXRhICYmIG1ldGEuZGVzY3Nba2V5 TmFtZV0sIHJldDsKICBpZiAoZGVzYykgewogICAgcmV0dXJuIGRlc2MuZ2V0 KG9iaiwga2V5TmFtZSk7CiAgfSBlbHNlIHsKICAgIGlmIChNQU5EQVRPUllf U0VUVEVSICYmIG1ldGEgJiYgbWV0YS53YXRjaGluZ1trZXlOYW1lXSA+IDAp IHsKICAgICAgcmV0ID0gbWV0YS52YWx1ZXNba2V5TmFtZV07CiAgICB9IGVs c2UgewogICAgICByZXQgPSBvYmpba2V5TmFtZV07CiAgICB9CgogICAgaWYg KHJldCA9PT0gdW5kZWZpbmVkICYmCiAgICAgICAgJ29iamVjdCcgPT09IHR5 cGVvZiBvYmogJiYgIShrZXlOYW1lIGluIG9iaikgJiYgJ2Z1bmN0aW9uJyA9 PT0gdHlwZW9mIG9iai51bmtub3duUHJvcGVydHkpIHsKICAgICAgcmV0dXJu IG9iai51bmtub3duUHJvcGVydHkoa2V5TmFtZSk7CiAgICB9CgogICAgcmV0 dXJuIHJldDsKICB9Cn07CgovLyBDdXJyZW50bHkgdXNlZCBvbmx5IGJ5IEVt YmVyIERhdGEgdGVzdHMKaWYgKEVtYmVyLmNvbmZpZy5vdmVycmlkZUFjY2Vz c29ycykgewogIEVtYmVyLmdldCA9IGdldDsKICBFbWJlci5jb25maWcub3Zl cnJpZGVBY2Nlc3NvcnMoKTsKICBnZXQgPSBFbWJlci5nZXQ7Cn0KCi8qKgog IE5vcm1hbGl6ZXMgYSB0YXJnZXQvcGF0aCBwYWlyIHRvIHJlZmxlY3QgdGhh dCBhY3R1YWwgdGFyZ2V0L3BhdGggdGhhdCBzaG91bGQKICBiZSBvYnNlcnZl ZCwgZXRjLiBUaGlzIHRha2VzIGludG8gYWNjb3VudCBwYXNzaW5nIGluIGds b2JhbCBwcm9wZXJ0eQogIHBhdGhzIChpLmUuIGEgcGF0aCBiZWdpbm5pbmcg d2l0aCBhIGNhcHRpYWwgbGV0dGVyIG5vdCBkZWZpbmVkIG9uIHRoZQogIHRh cmdldCkgYW5kICogc2VwYXJhdG9ycy4KCiAgQHByaXZhdGUKICBAbWV0aG9k IG5vcm1hbGl6ZVR1cGxlCiAgQGZvciBFbWJlcgogIEBwYXJhbSB7T2JqZWN0 fSB0YXJnZXQgVGhlIGN1cnJlbnQgdGFyZ2V0LiBNYXkgYmUgYG51bGxgLgog IEBwYXJhbSB7U3RyaW5nfSBwYXRoIEEgcGF0aCBvbiB0aGUgdGFyZ2V0IG9y IGEgZ2xvYmFsIHByb3BlcnR5IHBhdGguCiAgQHJldHVybiB7QXJyYXl9IGEg dGVtcG9yYXJ5IGFycmF5IHdpdGggdGhlIG5vcm1hbGl6ZWQgdGFyZ2V0L3Bh dGggcGFpci4KKi8KdmFyIG5vcm1hbGl6ZVR1cGxlID0gRW1iZXIubm9ybWFs aXplVHVwbGUgPSBmdW5jdGlvbih0YXJnZXQsIHBhdGgpIHsKICB2YXIgaGFz VGhpcyAgPSBIQVNfVEhJUy50ZXN0KHBhdGgpLAogICAgICBpc0dsb2JhbCA9 ICFoYXNUaGlzICYmIElTX0dMT0JBTF9QQVRILnRlc3QocGF0aCksCiAgICAg IGtleTsKCiAgaWYgKCF0YXJnZXQgfHwgaXNHbG9iYWwpIHRhcmdldCA9IEVt YmVyLmxvb2t1cDsKICBpZiAoaGFzVGhpcykgcGF0aCA9IHBhdGguc2xpY2Uo NSk7CgogIGlmICh0YXJnZXQgPT09IEVtYmVyLmxvb2t1cCkgewogICAga2V5 ID0gcGF0aC5tYXRjaChGSVJTVF9LRVkpWzBdOwogICAgdGFyZ2V0ID0gZ2V0 KHRhcmdldCwga2V5KTsKICAgIHBhdGggICA9IHBhdGguc2xpY2Uoa2V5Lmxl bmd0aCsxKTsKICB9CgogIC8vIG11c3QgcmV0dXJuIHNvbWUga2luZCBvZiBw YXRoIHRvIGJlIHZhbGlkIGVsc2Ugb3RoZXIgdGhpbmdzIHdpbGwgYnJlYWsu CiAgaWYgKCFwYXRoIHx8IHBhdGgubGVuZ3RoPT09MCkgdGhyb3cgbmV3IEVt YmVyLkVycm9yKCdQYXRoIGNhbm5vdCBiZSBlbXB0eScpOwoKICByZXR1cm4g WyB0YXJnZXQsIHBhdGggXTsKfTsKCnZhciBnZXRQYXRoID0gRW1iZXIuX2dl dFBhdGggPSBmdW5jdGlvbihyb290LCBwYXRoKSB7CiAgdmFyIGhhc1RoaXMs IHBhcnRzLCB0dXBsZSwgaWR4LCBsZW47CgogIC8vIElmIHRoZXJlIGlzIG5v IHJvb3QgYW5kIHBhdGggaXMgYSBrZXkgbmFtZSwgcmV0dXJuIHRoYXQKICAv LyBwcm9wZXJ0eSBmcm9tIHRoZSBnbG9iYWwgb2JqZWN0LgogIC8vIEUuZy4g Z2V0KCdFbWJlcicpIC0+IEVtYmVyCiAgaWYgKHJvb3QgPT09IG51bGwgJiYg cGF0aC5pbmRleE9mKCcuJykgPT09IC0xKSB7IHJldHVybiBnZXQoRW1iZXIu bG9va3VwLCBwYXRoKTsgfQoKICAvLyBkZXRlY3QgY29tcGxpY2F0ZWQgcGF0 aHMgYW5kIG5vcm1hbGl6ZSB0aGVtCiAgaGFzVGhpcyAgPSBIQVNfVEhJUy50 ZXN0KHBhdGgpOwoKICBpZiAoIXJvb3QgfHwgaGFzVGhpcykgewogICAgdHVw bGUgPSBub3JtYWxpemVUdXBsZShyb290LCBwYXRoKTsKICAgIHJvb3QgPSB0 dXBsZVswXTsKICAgIHBhdGggPSB0dXBsZVsxXTsKICAgIHR1cGxlLmxlbmd0 aCA9IDA7CiAgfQoKICBwYXJ0cyA9IHBhdGguc3BsaXQoIi4iKTsKICBsZW4g PSBwYXJ0cy5sZW5ndGg7CiAgZm9yIChpZHggPSAwOyByb290ICE9IG51bGwg JiYgaWR4IDwgbGVuOyBpZHgrKykgewogICAgcm9vdCA9IGdldChyb290LCBw YXJ0c1tpZHhdLCB0cnVlKTsKICAgIGlmIChyb290ICYmIHJvb3QuaXNEZXN0 cm95ZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfQogIH0KICByZXR1cm4gcm9v dDsKfTsKCkVtYmVyLmdldFdpdGhEZWZhdWx0ID0gZnVuY3Rpb24ocm9vdCwg a2V5LCBkZWZhdWx0VmFsdWUpIHsKICB2YXIgdmFsdWUgPSBnZXQocm9vdCwg a2V5KTsKCiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIGRl ZmF1bHRWYWx1ZTsgfQogIHJldHVybiB2YWx1ZTsKfTsKCgpFbWJlci5nZXQg PSBnZXQ7Cgp9KSgpOwoKCgooZnVuY3Rpb24oKSB7Ci8qKgpAbW9kdWxlIGVt YmVyLW1ldGFsCiovCgp2YXIgb19jcmVhdGUgPSBFbWJlci5jcmVhdGUsCiAg ICBtZXRhRm9yID0gRW1iZXIubWV0YSwKICAgIE1FVEFfS0VZID0gRW1iZXIu TUVUQV9LRVksCiAgICBhX3NsaWNlID0gW10uc2xpY2UsCiAgICAvKiBsaXN0 ZW5lciBmbGFncyAqLwogICAgT05DRSA9IDEsIFNVU1BFTkRFRCA9IDI7Cgov KgogIFRoZSBldmVudCBzeXN0ZW0gdXNlcyBhIHNlcmllcyBvZiBuZXN0ZWQg aGFzaGVzIHRvIHN0b3JlIGxpc3RlbmVycyBvbiBhbgogIG9iamVjdC4gV2hl biBhIGxpc3RlbmVyIGlzIHJlZ2lzdGVyZWQsIG9yIHdoZW4gYW4gZXZlbnQg YXJyaXZlcywgdGhlc2UKICBoYXNoZXMgYXJlIGNvbnN1bHRlZCB0byBkZXRl cm1pbmUgd2hpY2ggdGFyZ2V0IGFuZCBhY3Rpb24gcGFpciB0byBpbnZva2Uu CgogIFRoZSBoYXNoZXMgYXJlIHN0b3JlZCBpbiB0aGUgb2JqZWN0J3MgbWV0 YSBoYXNoLCBhbmQgbG9vayBsaWtlIHRoaXM6CgogICAgICAvLyBPYmplY3Qn cyBtZXRhIGhhc2gKICAgICAgewogICAgICAgIGxpc3RlbmVyczogeyAgICAg ICAvLyB2YXJpYWJsZSBuYW1lOiBgbGlzdGVuZXJTZXRgCiAgICAgICAgICAi Zm9vOmNoYW5nZWQiOiBbIC8vIHZhcmlhYmxlIG5hbWU6IGBhY3Rpb25zYAog ICAgICAgICAgICB0YXJnZXQsIG1ldGhvZCwgZmxhZ3MKICAgICAgICAgIF0K ICAgICAgICB9CiAgICAgIH0KCiovCgpmdW5jdGlvbiBpbmRleE9mKGFycmF5 LCB0YXJnZXQsIG1ldGhvZCkgewogIHZhciBpbmRleCA9IC0xOwogIC8vIGhh c2hlcyBhcmUgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgZXZlbnQgYXJyYXkK ICAvLyBzbyBpdCBtYWtlcyBzZW5zZSB0byBzdGFydCBzZWFyY2hpbmcgYXQg dGhlIGVuZAogIC8vIG9mIHRoZSBhcnJheSBhbmQgc2VhcmNoIGluIHJldmVy c2UKICBmb3IgKHZhciBpID0gYXJyYXkubGVuZ3RoIC0gMyA7IGkgPj0wOyBp IC09IDMpIHsKICAgIGlmICh0YXJnZXQgPT09IGFycmF5W2ldICYmIG1ldGhv ZCA9PT0gYXJyYXlbaSArIDFdKSB7CiAgICAgICAgIGluZGV4ID0gaTsgYnJl YWs7CiAgICB9CiAgfQogIHJldHVybiBpbmRleDsKfQoKZnVuY3Rpb24gYWN0 aW9uc0ZvcihvYmosIGV2ZW50TmFtZSkgewogIHZhciBtZXRhID0gbWV0YUZv cihvYmosIHRydWUpLAogICAgICBhY3Rpb25zOwoKICBpZiAoIW1ldGEubGlz dGVuZXJzKSB7IG1ldGEubGlzdGVuZXJzID0ge307IH0KCiAgaWYgKCFtZXRh Lmhhc093blByb3BlcnR5KCdsaXN0ZW5lcnMnKSkgewogICAgLy8gc2V0dXAg aW5oZXJpdGVkIGNvcHkgb2YgdGhlIGxpc3RlbmVycyBvYmplY3QKICAgIG1l dGEubGlzdGVuZXJzID0gb19jcmVhdGUobWV0YS5saXN0ZW5lcnMpOwogIH0K CiAgYWN0aW9ucyA9IG1ldGEubGlzdGVuZXJzW2V2ZW50TmFtZV07CgogIC8v IGlmIHRoZXJlIGFyZSBhY3Rpb25zLCBidXQgdGhlIGV2ZW50TmFtZSBkb2Vz bid0IGV4aXN0IGluIG91ciBsaXN0ZW5lcnMsIHRoZW4gY29weSB0aGVtIGZy b20gdGhlIHByb3RvdHlwZQogIGlmIChhY3Rpb25zICYmICFtZXRhLmxpc3Rl bmVycy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpKSB7CiAgICBhY3Rpb25z ID0gbWV0YS5saXN0ZW5lcnNbZXZlbnROYW1lXSA9IG1ldGEubGlzdGVuZXJz W2V2ZW50TmFtZV0uc2xpY2UoKTsKICB9IGVsc2UgaWYgKCFhY3Rpb25zKSB7 CiAgICBhY3Rpb25zID0gbWV0YS5saXN0ZW5lcnNbZXZlbnROYW1lXSA9IFtd OwogIH0KCiAgcmV0dXJuIGFjdGlvbnM7Cn0KCmZ1bmN0aW9uIGFjdGlvbnNV bmlvbihvYmosIGV2ZW50TmFtZSwgb3RoZXJBY3Rpb25zKSB7CiAgdmFyIG1l dGEgPSBvYmpbTUVUQV9LRVldLAogICAgICBhY3Rpb25zID0gbWV0YSAmJiBt ZXRhLmxpc3RlbmVycyAmJiBtZXRhLmxpc3RlbmVyc1tldmVudE5hbWVdOwoK ICBpZiAoIWFjdGlvbnMpIHsgcmV0dXJuOyB9CiAgZm9yICh2YXIgaSA9IGFj dGlvbnMubGVuZ3RoIC0gMzsgaSA+PSAwOyBpIC09IDMpIHsKICAgIHZhciB0 YXJnZXQgPSBhY3Rpb25zW2ldLAogICAgICAgIG1ldGhvZCA9IGFjdGlvbnNb aSsxXSwKICAgICAgICBmbGFncyA9IGFjdGlvbnNbaSsyXSwKICAgICAgICBh Y3Rpb25JbmRleCA9IGluZGV4T2Yob3RoZXJBY3Rpb25zLCB0YXJnZXQsIG1l dGhvZCk7CgogICAgaWYgKGFjdGlvbkluZGV4ID09PSAtMSkgewogICAgICBv dGhlckFjdGlvbnMucHVzaCh0YXJnZXQsIG1ldGhvZCwgZmxhZ3MpOwogICAg fQogIH0KfQoKZnVuY3Rpb24gYWN0aW9uc0RpZmYob2JqLCBldmVudE5hbWUs IG90aGVyQWN0aW9ucykgewogIHZhciBtZXRhID0gb2JqW01FVEFfS0VZXSwK ICAgICAgYWN0aW9ucyA9IG1ldGEgJiYgbWV0YS5saXN0ZW5lcnMgJiYgbWV0 YS5saXN0ZW5lcnNbZXZlbnROYW1lXSwKICAgICAgZGlmZkFjdGlvbnMgPSBb XTsKCiAgaWYgKCFhY3Rpb25zKSB7IHJldHVybjsgfQogIGZvciAodmFyIGkg PSBhY3Rpb25zLmxlbmd0aCAtIDM7IGkgPj0gMDsgaSAtPSAzKSB7CiAgICB2 YXIgdGFyZ2V0ID0gYWN0aW9uc1tpXSwKICAgICAgICBtZXRob2QgPSBhY3Rp b25zW2krMV0sCiAgICAgICAgZmxhZ3MgPSBhY3Rpb25zW2krMl0sCiAgICAg ICAgYWN0aW9uSW5kZXggPSBpbmRleE9mKG90aGVyQWN0aW9ucywgdGFyZ2V0 LCBtZXRob2QpOwoKICAgIGlmIChhY3Rpb25JbmRleCAhPT0gLTEpIHsgY29u dGludWU7IH0KCiAgICBvdGhlckFjdGlvbnMucHVzaCh0YXJnZXQsIG1ldGhv ZCwgZmxhZ3MpOwogICAgZGlmZkFjdGlvbnMucHVzaCh0YXJnZXQsIG1ldGhv ZCwgZmxhZ3MpOwogIH0KCiAgcmV0dXJuIGRpZmZBY3Rpb25zOwp9CgovKioK ICBBZGQgYW4gZXZlbnQgbGlzdGVuZXIKCiAgQG1ldGhvZCBhZGRMaXN0ZW5l cgogIEBmb3IgRW1iZXIKICBAcGFyYW0gb2JqCiAgQHBhcmFtIHtTdHJpbmd9 IGV2ZW50TmFtZQogIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSB0YXJnZXRP ck1ldGhvZCBBIHRhcmdldCBvYmplY3Qgb3IgYSBmdW5jdGlvbgogIEBwYXJh bSB7RnVuY3Rpb258U3RyaW5nfSBtZXRob2QgQSBmdW5jdGlvbiBvciB0aGUg bmFtZSBvZiBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBgdGFyZ2V0YAog IEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBBIGZsYWcgd2hldGhlciBhIGZ1bmN0 aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlCiovCmZ1bmN0aW9uIGFk ZExpc3RlbmVyKG9iaiwgZXZlbnROYW1lLCB0YXJnZXQsIG1ldGhvZCwgb25j ZSkgewogIEVtYmVyLmFzc2VydCgiWW91IG11c3QgcGFzcyBhdCBsZWFzdCBh biBvYmplY3QgYW5kIGV2ZW50IG5hbWUgdG8gRW1iZXIuYWRkTGlzdGVuZXIi LCAhIW9iaiAmJiAhIWV2ZW50TmFtZSk7CgogIGlmICghbWV0aG9kICYmICdm dW5jdGlvbicgPT09IHR5cGVvZiB0YXJnZXQpIHsKICAgIG1ldGhvZCA9IHRh cmdldDsKICAgIHRhcmdldCA9IG51bGw7CiAgfQoKICB2YXIgYWN0aW9ucyA9 IGFjdGlvbnNGb3Iob2JqLCBldmVudE5hbWUpLAogICAgICBhY3Rpb25JbmRl eCA9IGluZGV4T2YoYWN0aW9ucywgdGFyZ2V0LCBtZXRob2QpLAogICAgICBm bGFncyA9IDA7CgogIGlmIChvbmNlKSBmbGFncyB8PSBPTkNFOwoKICBpZiAo YWN0aW9uSW5kZXggIT09IC0xKSB7IHJldHVybjsgfQoKICBhY3Rpb25zLnB1 c2godGFyZ2V0LCBtZXRob2QsIGZsYWdzKTsKCiAgaWYgKCdmdW5jdGlvbicg PT09IHR5cGVvZiBvYmouZGlkQWRkTGlzdGVuZXIpIHsKICAgIG9iai5kaWRB ZGRMaXN0ZW5lcihldmVudE5hbWUsIHRhcmdldCwgbWV0aG9kKTsKICB9Cn0K Ci8qKgogIFJlbW92ZSBhbiBldmVudCBsaXN0ZW5lcgoKICBBcmd1bWVudHMg c2hvdWxkIG1hdGNoIHRob3NlIHBhc3NlZCB0byBgRW1iZXIuYWRkTGlzdGVu ZXJgLgoKICBAbWV0aG9kIHJlbW92ZUxpc3RlbmVyCiAgQGZvciBFbWJlcgog IEBwYXJhbSBvYmoKICBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lCiAgQHBh cmFtIHtPYmplY3R8RnVuY3Rpb259IHRhcmdldE9yTWV0aG9kIEEgdGFyZ2V0 IG9iamVjdCBvciBhIGZ1bmN0aW9uCiAgQHBhcmFtIHtGdW5jdGlvbnxTdHJp bmd9IG1ldGhvZCBBIGZ1bmN0aW9uIG9yIHRoZSBuYW1lIG9mIGEgZnVuY3Rp b24gdG8gYmUgY2FsbGVkIG9uIGB0YXJnZXRgCiovCmZ1bmN0aW9uIHJlbW92 ZUxpc3RlbmVyKG9iaiwgZXZlbnROYW1lLCB0YXJnZXQsIG1ldGhvZCkgewog IEVtYmVyLmFzc2VydCgiWW91IG11c3QgcGFzcyBhdCBsZWFzdCBhbiBvYmpl Y3QgYW5kIGV2ZW50IG5hbWUgdG8gRW1iZXIucmVtb3ZlTGlzdGVuZXIiLCAh IW9iaiAmJiAhIWV2ZW50TmFtZSk7CgogIGlmICghbWV0aG9kICYmICdmdW5j dGlvbicgPT09IHR5cGVvZiB0YXJnZXQpIHsKICAgIG1ldGhvZCA9IHRhcmdl dDsKICAgIHRhcmdldCA9IG51bGw7CiAgfQoKICBmdW5jdGlvbiBfcmVtb3Zl TGlzdGVuZXIodGFyZ2V0LCBtZXRob2QpIHsKICAgIHZhciBhY3Rpb25zID0g YWN0aW9uc0ZvcihvYmosIGV2ZW50TmFtZSksCiAgICAgICAgYWN0aW9uSW5k ZXggPSBpbmRleE9mKGFjdGlvbnMsIHRhcmdldCwgbWV0aG9kKTsKCiAgICAv LyBhY3Rpb24gZG9lc24ndCBleGlzdCwgZ2l2ZSB1cCBzaWxlbnRseQogICAg aWYgKGFjdGlvbkluZGV4ID09PSAtMSkgeyByZXR1cm47IH0KCiAgICBhY3Rp b25zLnNwbGljZShhY3Rpb25JbmRleCwgMyk7CgogICAgaWYgKCdmdW5jdGlv bicgPT09IHR5cGVvZiBvYmouZGlkUmVtb3ZlTGlzdGVuZXIpIHsKICAgICAg b2JqLmRpZFJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSwgdGFyZ2V0LCBtZXRo b2QpOwogICAgfQogIH0KCiAgaWYgKG1ldGhvZCkgewogICAgX3JlbW92ZUxp c3RlbmVyKHRhcmdldCwgbWV0aG9kKTsKICB9IGVsc2UgewogICAgdmFyIG1l dGEgPSBvYmpbTUVUQV9LRVldLAogICAgICAgIGFjdGlvbnMgPSBtZXRhICYm IG1ldGEubGlzdGVuZXJzICYmIG1ldGEubGlzdGVuZXJzW2V2ZW50TmFtZV07 CgogICAgaWYgKCFhY3Rpb25zKSB7IHJldHVybjsgfQogICAgZm9yICh2YXIg aSA9IGFjdGlvbnMubGVuZ3RoIC0gMzsgaSA+PSAwOyBpIC09IDMpIHsKICAg ICAgX3JlbW92ZUxpc3RlbmVyKGFjdGlvbnNbaV0sIGFjdGlvbnNbaSsxXSk7 CiAgICB9CiAgfQp9CgovKioKICBTdXNwZW5kIGxpc3RlbmVyIGR1cmluZyBj YWxsYmFjay4KCiAgVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IHRoZSB0 YXJnZXQgb2YgdGhlIGV2ZW50IGxpc3RlbmVyCiAgd2hlbiBpdCBpcyB0YWtp bmcgYW4gYWN0aW9uIHRoYXQgd291bGQgY2F1c2UgdGhlIGV2ZW50LCBlLmcu CiAgYW4gb2JqZWN0IG1pZ2h0IHN1c3BlbmQgaXRzIHByb3BlcnR5IGNoYW5n ZSBsaXN0ZW5lciB3aGlsZSBpdCBpcwogIHNldHRpbmcgdGhhdCBwcm9wZXJ0 eS4KCiAgQG1ldGhvZCBzdXNwZW5kTGlzdGVuZXIKICBAZm9yIEVtYmVyCgog IEBwcml2YXRlCiAgQHBhcmFtIG9iagogIEBwYXJhbSB7U3RyaW5nfSBldmVu dE5hbWUKICBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gdGFyZ2V0T3JNZXRo b2QgQSB0YXJnZXQgb2JqZWN0IG9yIGEgZnVuY3Rpb24KICBAcGFyYW0ge0Z1 bmN0aW9ufFN0cmluZ30gbWV0aG9kIEEgZnVuY3Rpb24gb3IgdGhlIG5hbWUg b2YgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gYHRhcmdldGAKICBAcGFy YW0ge0Z1bmN0aW9ufSBjYWxsYmFjawoqLwpmdW5jdGlvbiBzdXNwZW5kTGlz dGVuZXIob2JqLCBldmVudE5hbWUsIHRhcmdldCwgbWV0aG9kLCBjYWxsYmFj aykgewogIGlmICghbWV0aG9kICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiB0 YXJnZXQpIHsKICAgIG1ldGhvZCA9IHRhcmdldDsKICAgIHRhcmdldCA9IG51 bGw7CiAgfQoKICB2YXIgYWN0aW9ucyA9IGFjdGlvbnNGb3Iob2JqLCBldmVu dE5hbWUpLAogICAgICBhY3Rpb25JbmRleCA9IGluZGV4T2YoYWN0aW9ucywg dGFyZ2V0LCBtZXRob2QpOwoKICBpZiAoYWN0aW9uSW5kZXggIT09IC0xKSB7 CiAgICBhY3Rpb25zW2FjdGlvbkluZGV4KzJdIHw9IFNVU1BFTkRFRDsgLy8g bWFyayB0aGUgYWN0aW9uIGFzIHN1c3BlbmRlZAogIH0KCiAgZnVuY3Rpb24g dHJ5YWJsZSgpICAgeyByZXR1cm4gY2FsbGJhY2suY2FsbCh0YXJnZXQpOyB9 CiAgZnVuY3Rpb24gZmluYWxpemVyKCkgeyBpZiAoYWN0aW9uSW5kZXggIT09 IC0xKSB7IGFjdGlvbnNbYWN0aW9uSW5kZXgrMl0gJj0gflNVU1BFTkRFRDsg fSB9CgogIHJldHVybiBFbWJlci50cnlGaW5hbGx5KHRyeWFibGUsIGZpbmFs aXplcik7Cn0KCi8qKgogIFN1c3BlbmRzIG11bHRpcGxlIGxpc3RlbmVycyBk dXJpbmcgYSBjYWxsYmFjay4KCiAgQG1ldGhvZCBzdXNwZW5kTGlzdGVuZXJz CiAgQGZvciBFbWJlcgoKICBAcHJpdmF0ZQogIEBwYXJhbSBvYmoKICBAcGFy YW0ge0FycmF5fSBldmVudE5hbWUgQXJyYXkgb2YgZXZlbnQgbmFtZXMKICBA cGFyYW0ge09iamVjdHxGdW5jdGlvbn0gdGFyZ2V0T3JNZXRob2QgQSB0YXJn ZXQgb2JqZWN0IG9yIGEgZnVuY3Rpb24KICBAcGFyYW0ge0Z1bmN0aW9ufFN0 cmluZ30gbWV0aG9kIEEgZnVuY3Rpb24gb3IgdGhlIG5hbWUgb2YgYSBmdW5j dGlvbiB0byBiZSBjYWxsZWQgb24gYHRhcmdldGAKICBAcGFyYW0ge0Z1bmN0 aW9ufSBjYWxsYmFjawoqLwpmdW5jdGlvbiBzdXNwZW5kTGlzdGVuZXJzKG9i aiwgZXZlbnROYW1lcywgdGFyZ2V0LCBtZXRob2QsIGNhbGxiYWNrKSB7CiAg aWYgKCFtZXRob2QgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHRhcmdldCkg ewogICAgbWV0aG9kID0gdGFyZ2V0OwogICAgdGFyZ2V0ID0gbnVsbDsKICB9 CgogIHZhciBzdXNwZW5kZWRBY3Rpb25zID0gW10sCiAgICAgIGFjdGlvbnNM aXN0ID0gW10sCiAgICAgIGV2ZW50TmFtZSwgYWN0aW9ucywgaSwgbDsKCiAg Zm9yIChpPTAsIGw9ZXZlbnROYW1lcy5sZW5ndGg7IGk8bDsgaSsrKSB7CiAg ICBldmVudE5hbWUgPSBldmVudE5hbWVzW2ldOwogICAgYWN0aW9ucyA9IGFj dGlvbnNGb3Iob2JqLCBldmVudE5hbWUpOwogICAgdmFyIGFjdGlvbkluZGV4 ID0gaW5kZXhPZihhY3Rpb25zLCB0YXJnZXQsIG1ldGhvZCk7CgogICAgaWYg KGFjdGlvbkluZGV4ICE9PSAtMSkgewogICAgICBhY3Rpb25zW2FjdGlvbklu ZGV4KzJdIHw9IFNVU1BFTkRFRDsKICAgICAgc3VzcGVuZGVkQWN0aW9ucy5w dXNoKGFjdGlvbkluZGV4KTsKICAgICAgYWN0aW9uc0xpc3QucHVzaChhY3Rp b25zKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHRyeWFibGUoKSB7IHJldHVy biBjYWxsYmFjay5jYWxsKHRhcmdldCk7IH0KCiAgZnVuY3Rpb24gZmluYWxp emVyKCkgewogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBzdXNwZW5kZWRBY3Rp b25zLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICB2YXIgYWN0aW9uSW5k ZXggPSBzdXNwZW5kZWRBY3Rpb25zW2ldOwogICAgICBhY3Rpb25zTGlzdFtp XVthY3Rpb25JbmRleCsyXSAmPSB+U1VTUEVOREVEOwogICAgfQogIH0KCiAg cmV0dXJuIEVtYmVyLnRyeUZpbmFsbHkodHJ5YWJsZSwgZmluYWxpemVyKTsK fQoKLyoqCiAgUmV0dXJuIGEgbGlzdCBvZiBjdXJyZW50bHkgd2F0Y2hlZCBl dmVudHMKCiAgQHByaXZhdGUKICBAbWV0aG9kIHdhdGNoZWRFdmVudHMKICBA Zm9yIEVtYmVyCiAgQHBhcmFtIG9iagoqLwpmdW5jdGlvbiB3YXRjaGVkRXZl bnRzKG9iaikgewogIHZhciBsaXN0ZW5lcnMgPSBvYmpbTUVUQV9LRVldLmxp c3RlbmVycywgcmV0ID0gW107CgogIGlmIChsaXN0ZW5lcnMpIHsKICAgIGZv cih2YXIgZXZlbnROYW1lIGluIGxpc3RlbmVycykgewogICAgICBpZiAobGlz dGVuZXJzW2V2ZW50TmFtZV0pIHsgcmV0LnB1c2goZXZlbnROYW1lKTsgfQog ICAgfQogIH0KICByZXR1cm4gcmV0Owp9CgovKioKICBTZW5kIGFuIGV2ZW50 LiBUaGUgZXhlY3V0aW9uIG9mIHN1c3BlbmRlZCBsaXN0ZW5lcnMKICBpcyBz a2lwcGVkLCBhbmQgb25jZSBsaXN0ZW5lcnMgYXJlIHJlbW92ZWQuIEEgbGlz dGVuZXIgd2l0aG91dAogIGEgdGFyZ2V0IGlzIGV4ZWN1dGVkIG9uIHRoZSBw YXNzZWQgb2JqZWN0LiBJZiBhbiBhcnJheSBvZiBhY3Rpb25zCiAgaXMgbm90 IHBhc3NlZCwgdGhlIGFjdGlvbnMgc3RvcmVkIG9uIHRoZSBwYXNzZWQgb2Jq ZWN0IGFyZSBpbnZva2VkLgoKICBAbWV0aG9kIHNlbmRFdmVudAogIEBmb3Ig RW1iZXIKICBAcGFyYW0gb2JqCiAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFt ZQogIEBwYXJhbSB7QXJyYXl9IHBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJz IGZvciBlYWNoIGxpc3RlbmVyLgogIEBwYXJhbSB7QXJyYXl9IGFjdGlvbnMg T3B0aW9uYWwgYXJyYXkgb2YgYWN0aW9ucyAobGlzdGVuZXJzKS4KICBAcmV0 dXJuIHRydWUKKi8KZnVuY3Rpb24gc2VuZEV2ZW50KG9iaiwgZXZlbnROYW1l LCBwYXJhbXMsIGFjdGlvbnMpIHsKICAvLyBmaXJzdCBnaXZlIG9iamVjdCBh IGNoYW5jZSB0byBoYW5kbGUgaXQKICBpZiAob2JqICE9PSBFbWJlciAmJiAn ZnVuY3Rpb24nID09PSB0eXBlb2Ygb2JqLnNlbmRFdmVudCkgewogICAgb2Jq LnNlbmRFdmVudChldmVudE5hbWUsIHBhcmFtcyk7CiAgfQoKICBpZiAoIWFj dGlvbnMpIHsKICAgIHZhciBtZXRhID0gb2JqW01FVEFfS0VZXTsKICAgIGFj dGlvbnMgPSBtZXRhICYmIG1ldGEubGlzdGVuZXJzICYmIG1ldGEubGlzdGVu ZXJzW2V2ZW50TmFtZV07CiAgfQoKICBpZiAoIWFjdGlvbnMpIHsgcmV0dXJu OyB9CgogIGZvciAodmFyIGkgPSBhY3Rpb25zLmxlbmd0aCAtIDM7IGkgPj0g MDsgaSAtPSAzKSB7IC8vIGxvb3BpbmcgaW4gcmV2ZXJzZSBmb3Igb25jZSBs aXN0ZW5lcnMKICAgIHZhciB0YXJnZXQgPSBhY3Rpb25zW2ldLCBtZXRob2Qg PSBhY3Rpb25zW2krMV0sIGZsYWdzID0gYWN0aW9uc1tpKzJdOwogICAgaWYg KCFtZXRob2QpIHsgY29udGludWU7IH0KICAgIGlmIChmbGFncyAmIFNVU1BF TkRFRCkgeyBjb250aW51ZTsgfQogICAgaWYgKGZsYWdzICYgT05DRSkgeyBy ZW1vdmVMaXN0ZW5lcihvYmosIGV2ZW50TmFtZSwgdGFyZ2V0LCBtZXRob2Qp OyB9CiAgICBpZiAoIXRhcmdldCkgeyB0YXJnZXQgPSBvYmo7IH0KICAgIGlm ICgnc3RyaW5nJyA9PT0gdHlwZW9mIG1ldGhvZCkgeyBtZXRob2QgPSB0YXJn ZXRbbWV0aG9kXTsgfQogICAgaWYgKHBhcmFtcykgewogICAgICBtZXRob2Qu YXBwbHkodGFyZ2V0LCBwYXJhbXMpOwogICAgfSBlbHNlIHsKICAgICAgbWV0 aG9kLmNhbGwodGFyZ2V0KTsKICAgIH0KICB9CiAgcmV0dXJuIHRydWU7Cn0K Ci8qKgogIEBwcml2YXRlCiAgQG1ldGhvZCBoYXNMaXN0ZW5lcnMKICBAZm9y IEVtYmVyCiAgQHBhcmFtIG9iagogIEBwYXJhbSB7U3RyaW5nfSBldmVudE5h bWUKKi8KZnVuY3Rpb24gaGFzTGlzdGVuZXJzKG9iaiwgZXZlbnROYW1lKSB7 CiAgdmFyIG1ldGEgPSBvYmpbTUVUQV9LRVldLAogICAgICBhY3Rpb25zID0g bWV0YSAmJiBtZXRhLmxpc3RlbmVycyAmJiBtZXRhLmxpc3RlbmVyc1tldmVu dE5hbWVdOwoKICByZXR1cm4gISEoYWN0aW9ucyAmJiBhY3Rpb25zLmxlbmd0 aCk7Cn0KCi8qKgogIEBwcml2YXRlCiAgQG1ldGhvZCBsaXN0ZW5lcnNGb3IK ICBAZm9yIEVtYmVyCiAgQHBhcmFtIG9iagogIEBwYXJhbSB7U3RyaW5nfSBl dmVudE5hbWUKKi8KZnVuY3Rpb24gbGlzdGVuZXJzRm9yKG9iaiwgZXZlbnRO YW1lKSB7CiAgdmFyIHJldCA9IFtdOwogIHZhciBtZXRhID0gb2JqW01FVEFf S0VZXSwKICAgICAgYWN0aW9ucyA9IG1ldGEgJiYgbWV0YS5saXN0ZW5lcnMg JiYgbWV0YS5saXN0ZW5lcnNbZXZlbnROYW1lXTsKCiAgaWYgKCFhY3Rpb25z KSB7IHJldHVybiByZXQ7IH0KCiAgZm9yICh2YXIgaSA9IDAsIGwgPSBhY3Rp b25zLmxlbmd0aDsgaSA8IGw7IGkgKz0gMykgewogICAgdmFyIHRhcmdldCA9 IGFjdGlvbnNbaV0sCiAgICAgICAgbWV0aG9kID0gYWN0aW9uc1tpKzFdOwog ICAgcmV0LnB1c2goW3RhcmdldCwgbWV0aG9kXSk7CiAgfQoKICByZXR1cm4g cmV0Owp9CgovKioKICBEZWZpbmUgYSBwcm9wZXJ0eSBhcyBhIGZ1bmN0aW9u IHRoYXQgc2hvdWxkIGJlIGV4ZWN1dGVkIHdoZW4KICBhIHNwZWNpZmllZCBl dmVudCBvciBldmVudHMgYXJlIHRyaWdnZXJlZC4KCgogIGBgYCBqYXZhc2Ny aXB0CiAgdmFyIEpvYiA9IEVtYmVyLk9iamVjdC5leHRlbmQoewogICAgbG9n Q29tcGxldGVkOiBFbWJlci5vbignY29tcGxldGVkJywgZnVuY3Rpb24oKXsK ICAgICAgY29uc29sZS5sb2coJ0pvYiBjb21wbGV0ZWQhJyk7CiAgICB9KQog IH0pOwogIHZhciBqb2IgPSBKb2IuY3JlYXRlKCk7CiAgRW1iZXIuc2VuZEV2 ZW50KGpvYiwgJ2NvbXBsZXRlZCcpOyAvLyBMb2dzICJKb2IgY29tcGxldGVk ISIKIGBgYAoKICBAbWV0aG9kIG9uCiAgQGZvciBFbWJlcgogIEBwYXJhbSB7 U3RyaW5nfSBldmVudE5hbWVzKgogIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMK ICBAcmV0dXJuIGZ1bmMKKi8KRW1iZXIub24gPSBmdW5jdGlvbigpewogIHZh ciBmdW5jID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cywgLTEpWzBdLAogICAg ICBldmVudHMgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzLCAwLCAtMSk7CiAg ZnVuYy5fX2VtYmVyX2xpc3RlbnNfXyA9IGV2ZW50czsKICByZXR1cm4gZnVu YzsKfTsKCkVtYmVyLmFkZExpc3RlbmVyID0gYWRkTGlzdGVuZXI7CkVtYmVy LnJlbW92ZUxpc3RlbmVyID0gcmVtb3ZlTGlzdGVuZXI7CkVtYmVyLl9zdXNw ZW5kTGlzdGVuZXIgPSBzdXNwZW5kTGlzdGVuZXI7CkVtYmVyLl9zdXNwZW5k TGlzdGVuZXJzID0gc3VzcGVuZExpc3RlbmVyczsKRW1iZXIuc2VuZEV2ZW50 ID0gc2VuZEV2ZW50OwpFbWJlci5oYXNMaXN0ZW5lcnMgPSBoYXNMaXN0ZW5l cnM7CkVtYmVyLndhdGNoZWRFdmVudHMgPSB3YXRjaGVkRXZlbnRzOwpFbWJl ci5saXN0ZW5lcnNGb3IgPSBsaXN0ZW5lcnNGb3I7CkVtYmVyLmxpc3RlbmVy c0RpZmYgPSBhY3Rpb25zRGlmZjsKRW1iZXIubGlzdGVuZXJzVW5pb24gPSBh Y3Rpb25zVW5pb247Cgp9KSgpOwoKCgooZnVuY3Rpb24oKSB7CnZhciBndWlk Rm9yID0gRW1iZXIuZ3VpZEZvciwKICAgIHNlbmRFdmVudCA9IEVtYmVyLnNl bmRFdmVudDsKCi8qCiAgdGhpcy5vYnNlcnZlclNldCA9IHsKICAgIFtzZW5k ZXJHdWlkXTogeyAvLyB2YXJpYWJsZSBuYW1lOiBga2V5U2V0YAogICAgICBb a2V5TmFtZV06IGxpc3RJbmRleAogICAgfQogIH0sCiAgdGhpcy5vYnNlcnZl cnMgPSBbCiAgICB7CiAgICAgIHNlbmRlcjogb2JqLAogICAgICBrZXlOYW1l OiBrZXlOYW1lLAogICAgICBldmVudE5hbWU6IGV2ZW50TmFtZSwKICAgICAg bGlzdGVuZXJzOiBbCiAgICAgICAgW3RhcmdldCwgbWV0aG9kLCBmbGFnc10K ICAgICAgXQogICAgfSwKICAgIC4uLgogIF0KKi8KdmFyIE9ic2VydmVyU2V0 ID0gRW1iZXIuX09ic2VydmVyU2V0ID0gZnVuY3Rpb24oKSB7CiAgdGhpcy5j bGVhcigpOwp9OwoKT2JzZXJ2ZXJTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0 aW9uKHNlbmRlciwga2V5TmFtZSwgZXZlbnROYW1lKSB7CiAgdmFyIG9ic2Vy dmVyU2V0ID0gdGhpcy5vYnNlcnZlclNldCwKICAgICAgb2JzZXJ2ZXJzID0g dGhpcy5vYnNlcnZlcnMsCiAgICAgIHNlbmRlckd1aWQgPSBndWlkRm9yKHNl bmRlciksCiAgICAgIGtleVNldCA9IG9ic2VydmVyU2V0W3NlbmRlckd1aWRd LAogICAgICBpbmRleDsKCiAgaWYgKCFrZXlTZXQpIHsKICAgIG9ic2VydmVy U2V0W3NlbmRlckd1aWRdID0ga2V5U2V0ID0ge307CiAgfQogIGluZGV4ID0g a2V5U2V0W2tleU5hbWVdOwogIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7 CiAgICBpbmRleCA9IG9ic2VydmVycy5wdXNoKHsKICAgICAgc2VuZGVyOiBz ZW5kZXIsCiAgICAgIGtleU5hbWU6IGtleU5hbWUsCiAgICAgIGV2ZW50TmFt ZTogZXZlbnROYW1lLAogICAgICBsaXN0ZW5lcnM6IFtdCiAgICB9KSAtIDE7 CiAgICBrZXlTZXRba2V5TmFtZV0gPSBpbmRleDsKICB9CiAgcmV0dXJuIG9i c2VydmVyc1tpbmRleF0ubGlzdGVuZXJzOwp9OwoKT2JzZXJ2ZXJTZXQucHJv dG90eXBlLmZsdXNoID0gZnVuY3Rpb24oKSB7CiAgdmFyIG9ic2VydmVycyA9 IHRoaXMub2JzZXJ2ZXJzLCBpLCBsZW4sIG9ic2VydmVyLCBzZW5kZXI7CiAg dGhpcy5jbGVhcigpOwogIGZvciAoaT0wLCBsZW49b2JzZXJ2ZXJzLmxlbmd0 aDsgaSA8IGxlbjsgKytpKSB7CiAgICBvYnNlcnZlciA9IG9ic2VydmVyc1tp XTsKICAgIHNlbmRlciA9IG9ic2VydmVyLnNlbmRlcjsKICAgIGlmIChzZW5k ZXIuaXNEZXN0cm95aW5nIHx8IHNlbmRlci5pc0Rlc3Ryb3llZCkgeyBjb250 aW51ZTsgfQogICAgc2VuZEV2ZW50KHNlbmRlciwgb2JzZXJ2ZXIuZXZlbnRO YW1lLCBbc2VuZGVyLCBvYnNlcnZlci5rZXlOYW1lXSwgb2JzZXJ2ZXIubGlz dGVuZXJzKTsKICB9Cn07CgpPYnNlcnZlclNldC5wcm90b3R5cGUuY2xlYXIg PSBmdW5jdGlvbigpIHsKICB0aGlzLm9ic2VydmVyU2V0ID0ge307CiAgdGhp cy5vYnNlcnZlcnMgPSBbXTsKfTsKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewp2 YXIgTUVUQV9LRVkgPSBFbWJlci5NRVRBX0tFWSwKICAgIGd1aWRGb3IgPSBF bWJlci5ndWlkRm9yLAogICAgdHJ5RmluYWxseSA9IEVtYmVyLnRyeUZpbmFs bHksCiAgICBzZW5kRXZlbnQgPSBFbWJlci5zZW5kRXZlbnQsCiAgICBsaXN0 ZW5lcnNVbmlvbiA9IEVtYmVyLmxpc3RlbmVyc1VuaW9uLAogICAgbGlzdGVu ZXJzRGlmZiA9IEVtYmVyLmxpc3RlbmVyc0RpZmYsCiAgICBPYnNlcnZlclNl dCA9IEVtYmVyLl9PYnNlcnZlclNldCwKICAgIGJlZm9yZU9ic2VydmVyU2V0 ID0gbmV3IE9ic2VydmVyU2V0KCksCiAgICBvYnNlcnZlclNldCA9IG5ldyBP YnNlcnZlclNldCgpLAogICAgZGVmZXJyZWQgPSAwOwoKLy8gLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLgovLyBQUk9QRVJUWSBDSEFOR0VTCi8vCgovKioKICBUaGlzIGZ1bmN0 aW9uIGlzIGNhbGxlZCBqdXN0IGJlZm9yZSBhbiBvYmplY3QgcHJvcGVydHkg aXMgYWJvdXQgdG8gY2hhbmdlLgogIEl0IHdpbGwgbm90aWZ5IGFueSBiZWZv cmUgb2JzZXJ2ZXJzIGFuZCBwcmVwYXJlIGNhY2hlcyBhbW9uZyBvdGhlciB0 aGluZ3MuCgogIE5vcm1hbGx5IHlvdSB3aWxsIG5vdCBuZWVkIHRvIGNhbGwg dGhpcyBtZXRob2QgZGlyZWN0bHkgYnV0IGlmIGZvciBzb21lCiAgcmVhc29u IHlvdSBjYW4ndCBkaXJlY3RseSB3YXRjaCBhIHByb3BlcnR5IHlvdSBjYW4g aW52b2tlIHRoaXMgbWV0aG9kCiAgbWFudWFsbHkgYWxvbmcgd2l0aCBgRW1i ZXIucHJvcGVydHlEaWRDaGFuZ2UoKWAgd2hpY2ggeW91IHNob3VsZCBjYWxs IGp1c3QKICBhZnRlciB0aGUgcHJvcGVydHkgdmFsdWUgY2hhbmdlcy4KCiAg QG1ldGhvZCBwcm9wZXJ0eVdpbGxDaGFuZ2UKICBAZm9yIEVtYmVyCiAgQHBh cmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHdpdGggdGhlIHByb3BlcnR5 IHRoYXQgd2lsbCBjaGFuZ2UKICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZSBU aGUgcHJvcGVydHkga2V5IChvciBwYXRoKSB0aGF0IHdpbGwgY2hhbmdlLgog IEByZXR1cm4ge3ZvaWR9CiovCmZ1bmN0aW9uIHByb3BlcnR5V2lsbENoYW5n ZShvYmosIGtleU5hbWUpIHsKICB2YXIgbSA9IG9ialtNRVRBX0tFWV0sCiAg ICAgIHdhdGNoaW5nID0gKG0gJiYgbS53YXRjaGluZ1trZXlOYW1lXSA+IDAp IHx8IGtleU5hbWUgPT09ICdsZW5ndGgnLAogICAgICBwcm90byA9IG0gJiYg bS5wcm90bywKICAgICAgZGVzYyA9IG0gJiYgbS5kZXNjc1trZXlOYW1lXTsK CiAgaWYgKCF3YXRjaGluZykgeyByZXR1cm47IH0KICBpZiAocHJvdG8gPT09 IG9iaikgeyByZXR1cm47IH0KICBpZiAoZGVzYyAmJiBkZXNjLndpbGxDaGFu Z2UpIHsgZGVzYy53aWxsQ2hhbmdlKG9iaiwga2V5TmFtZSk7IH0KICBkZXBl bmRlbnRLZXlzV2lsbENoYW5nZShvYmosIGtleU5hbWUsIG0pOwogIGNoYWlu c1dpbGxDaGFuZ2Uob2JqLCBrZXlOYW1lLCBtKTsKICBub3RpZnlCZWZvcmVP YnNlcnZlcnMob2JqLCBrZXlOYW1lKTsKfQpFbWJlci5wcm9wZXJ0eVdpbGxD aGFuZ2UgPSBwcm9wZXJ0eVdpbGxDaGFuZ2U7CgovKioKICBUaGlzIGZ1bmN0 aW9uIGlzIGNhbGxlZCBqdXN0IGFmdGVyIGFuIG9iamVjdCBwcm9wZXJ0eSBo YXMgY2hhbmdlZC4KICBJdCB3aWxsIG5vdGlmeSBhbnkgb2JzZXJ2ZXJzIGFu ZCBjbGVhciBjYWNoZXMgYW1vbmcgb3RoZXIgdGhpbmdzLgoKICBOb3JtYWxs eSB5b3Ugd2lsbCBub3QgbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVj dGx5IGJ1dCBpZiBmb3Igc29tZQogIHJlYXNvbiB5b3UgY2FuJ3QgZGlyZWN0 bHkgd2F0Y2ggYSBwcm9wZXJ0eSB5b3UgY2FuIGludm9rZSB0aGlzIG1ldGhv ZAogIG1hbnVhbGx5IGFsb25nIHdpdGggYEVtYmVyLnByb3BlcnR5V2lsbENo YW5nZSgpYCB3aGljaCB5b3Ugc2hvdWxkIGNhbGwganVzdAogIGJlZm9yZSB0 aGUgcHJvcGVydHkgdmFsdWUgY2hhbmdlcy4KCiAgQG1ldGhvZCBwcm9wZXJ0 eURpZENoYW5nZQogIEBmb3IgRW1iZXIKICBAcGFyYW0ge09iamVjdH0gb2Jq IFRoZSBvYmplY3Qgd2l0aCB0aGUgcHJvcGVydHkgdGhhdCB3aWxsIGNoYW5n ZQogIEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRoZSBwcm9wZXJ0eSBrZXkg KG9yIHBhdGgpIHRoYXQgd2lsbCBjaGFuZ2UuCiAgQHJldHVybiB7dm9pZH0K Ki8KZnVuY3Rpb24gcHJvcGVydHlEaWRDaGFuZ2Uob2JqLCBrZXlOYW1lKSB7 CiAgdmFyIG0gPSBvYmpbTUVUQV9LRVldLAogICAgICB3YXRjaGluZyA9ICht ICYmIG0ud2F0Y2hpbmdba2V5TmFtZV0gPiAwKSB8fCBrZXlOYW1lID09PSAn bGVuZ3RoJywKICAgICAgcHJvdG8gPSBtICYmIG0ucHJvdG8sCiAgICAgIGRl c2MgPSBtICYmIG0uZGVzY3Nba2V5TmFtZV07CgogIGlmIChwcm90byA9PT0g b2JqKSB7IHJldHVybjsgfQoKICAvLyBzaG91bGRuJ3QgdGhpcyBtZWFuIHRo YXQgd2UncmUgd2F0Y2hpbmcgdGhpcyBrZXk/CiAgaWYgKGRlc2MgJiYgZGVz Yy5kaWRDaGFuZ2UpIHsgZGVzYy5kaWRDaGFuZ2Uob2JqLCBrZXlOYW1lKTsg fQogIGlmICghd2F0Y2hpbmcgJiYga2V5TmFtZSAhPT0gJ2xlbmd0aCcpIHsg cmV0dXJuOyB9CgogIGRlcGVuZGVudEtleXNEaWRDaGFuZ2Uob2JqLCBrZXlO YW1lLCBtKTsKICBjaGFpbnNEaWRDaGFuZ2Uob2JqLCBrZXlOYW1lLCBtLCBm YWxzZSk7CiAgbm90aWZ5T2JzZXJ2ZXJzKG9iaiwga2V5TmFtZSk7Cn0KRW1i ZXIucHJvcGVydHlEaWRDaGFuZ2UgPSBwcm9wZXJ0eURpZENoYW5nZTsKCnZh ciBXSUxMX1NFRU4sIERJRF9TRUVOOwoKLy8gY2FsbGVkIHdoZW5ldmVyIGEg cHJvcGVydHkgaXMgYWJvdXQgdG8gY2hhbmdlIHRvIGNsZWFyIHRoZSBjYWNo ZSBvZiBhbnkgZGVwZW5kZW50IGtleXMgKGFuZCBub3RpZnkgdGhvc2UgcHJv cGVydGllcyBvZiBjaGFuZ2VzLCBldGMuLi4pCmZ1bmN0aW9uIGRlcGVuZGVu dEtleXNXaWxsQ2hhbmdlKG9iaiwgZGVwS2V5LCBtZXRhKSB7CiAgaWYgKG9i ai5pc0Rlc3Ryb3lpbmcpIHsgcmV0dXJuOyB9CgogIHZhciBzZWVuID0gV0lM TF9TRUVOLCB0b3AgPSAhc2VlbjsKICBpZiAodG9wKSB7IHNlZW4gPSBXSUxM X1NFRU4gPSB7fTsgfQogIGl0ZXJEZXBzKHByb3BlcnR5V2lsbENoYW5nZSwg b2JqLCBkZXBLZXksIHNlZW4sIG1ldGEpOwogIGlmICh0b3ApIHsgV0lMTF9T RUVOID0gbnVsbDsgfQp9CgovLyBjYWxsZWQgd2hlbmV2ZXIgYSBwcm9wZXJ0 eSBoYXMganVzdCBjaGFuZ2VkIHRvIHVwZGF0ZSBkZXBlbmRlbnQga2V5cwpm dW5jdGlvbiBkZXBlbmRlbnRLZXlzRGlkQ2hhbmdlKG9iaiwgZGVwS2V5LCBt ZXRhKSB7CiAgaWYgKG9iai5pc0Rlc3Ryb3lpbmcpIHsgcmV0dXJuOyB9Cgog IHZhciBzZWVuID0gRElEX1NFRU4sIHRvcCA9ICFzZWVuOwogIGlmICh0b3Ap IHsgc2VlbiA9IERJRF9TRUVOID0ge307IH0KICBpdGVyRGVwcyhwcm9wZXJ0 eURpZENoYW5nZSwgb2JqLCBkZXBLZXksIHNlZW4sIG1ldGEpOwogIGlmICh0 b3ApIHsgRElEX1NFRU4gPSBudWxsOyB9Cn0KCmZ1bmN0aW9uIGl0ZXJEZXBz KG1ldGhvZCwgb2JqLCBkZXBLZXksIHNlZW4sIG1ldGEpIHsKICB2YXIgZ3Vp ZCA9IGd1aWRGb3Iob2JqKTsKICBpZiAoIXNlZW5bZ3VpZF0pIHNlZW5bZ3Vp ZF0gPSB7fTsKICBpZiAoc2VlbltndWlkXVtkZXBLZXldKSByZXR1cm47CiAg c2VlbltndWlkXVtkZXBLZXldID0gdHJ1ZTsKCiAgdmFyIGRlcHMgPSBtZXRh LmRlcHM7CiAgZGVwcyA9IGRlcHMgJiYgZGVwc1tkZXBLZXldOwogIGlmIChk ZXBzKSB7CiAgICBmb3IodmFyIGtleSBpbiBkZXBzKSB7CiAgICAgIHZhciBk ZXNjID0gbWV0YS5kZXNjc1trZXldOwogICAgICBpZiAoZGVzYyAmJiBkZXNj Ll9zdXNwZW5kZWQgPT09IG9iaikgY29udGludWU7CiAgICAgIG1ldGhvZChv YmosIGtleSk7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBjaGFpbnNXaWxsQ2hh bmdlKG9iaiwga2V5TmFtZSwgbSkgewogIGlmICghKG0uaGFzT3duUHJvcGVy dHkoJ2NoYWluV2F0Y2hlcnMnKSAmJgogICAgICAgIG0uY2hhaW5XYXRjaGVy c1trZXlOYW1lXSkpIHsKICAgIHJldHVybjsKICB9CgogIHZhciBub2RlcyA9 IG0uY2hhaW5XYXRjaGVyc1trZXlOYW1lXSwKICAgICAgZXZlbnRzID0gW10s CiAgICAgIGksIGw7CgogIGZvcihpID0gMCwgbCA9IG5vZGVzLmxlbmd0aDsg aSA8IGw7IGkrKykgewogICAgbm9kZXNbaV0ud2lsbENoYW5nZShldmVudHMp OwogIH0KCiAgZm9yIChpID0gMCwgbCA9IGV2ZW50cy5sZW5ndGg7IGkgPCBs OyBpICs9IDIpIHsKICAgIHByb3BlcnR5V2lsbENoYW5nZShldmVudHNbaV0s IGV2ZW50c1tpKzFdKTsKICB9Cn0KCmZ1bmN0aW9uIGNoYWluc0RpZENoYW5n ZShvYmosIGtleU5hbWUsIG0sIHN1cHByZXNzRXZlbnRzKSB7CiAgaWYgKCEo bSAmJiBtLmhhc093blByb3BlcnR5KCdjaGFpbldhdGNoZXJzJykgJiYKICAg ICAgICBtLmNoYWluV2F0Y2hlcnNba2V5TmFtZV0pKSB7CiAgICByZXR1cm47 CiAgfQoKICB2YXIgbm9kZXMgPSBtLmNoYWluV2F0Y2hlcnNba2V5TmFtZV0s CiAgICAgIGV2ZW50cyA9IHN1cHByZXNzRXZlbnRzID8gbnVsbCA6IFtdLAog ICAgICBpLCBsOwoKICBmb3IoaSA9IDAsIGwgPSBub2Rlcy5sZW5ndGg7IGkg PCBsOyBpKyspIHsKICAgIG5vZGVzW2ldLmRpZENoYW5nZShldmVudHMpOwog IH0KCiAgaWYgKHN1cHByZXNzRXZlbnRzKSB7CiAgICByZXR1cm47CiAgfQoK ICBmb3IgKGkgPSAwLCBsID0gZXZlbnRzLmxlbmd0aDsgaSA8IGw7IGkgKz0g MikgewogICAgcHJvcGVydHlEaWRDaGFuZ2UoZXZlbnRzW2ldLCBldmVudHNb aSsxXSk7CiAgfQp9CgpFbWJlci5vdmVycmlkZUNoYWlucyA9IGZ1bmN0aW9u KG9iaiwga2V5TmFtZSwgbSkgewogIGNoYWluc0RpZENoYW5nZShvYmosIGtl eU5hbWUsIG0sIHRydWUpOwp9OwoKLyoqCiAgQG1ldGhvZCBiZWdpblByb3Bl cnR5Q2hhbmdlcwogIEBjaGFpbmFibGUKICBAcHJpdmF0ZQoqLwpmdW5jdGlv biBiZWdpblByb3BlcnR5Q2hhbmdlcygpIHsKICBkZWZlcnJlZCsrOwp9CgpF bWJlci5iZWdpblByb3BlcnR5Q2hhbmdlcyA9IGJlZ2luUHJvcGVydHlDaGFu Z2VzOwoKLyoqCiAgQG1ldGhvZCBlbmRQcm9wZXJ0eUNoYW5nZXMKICBAcHJp dmF0ZQoqLwpmdW5jdGlvbiBlbmRQcm9wZXJ0eUNoYW5nZXMoKSB7CiAgZGVm ZXJyZWQtLTsKICBpZiAoZGVmZXJyZWQ8PTApIHsKICAgIGJlZm9yZU9ic2Vy dmVyU2V0LmNsZWFyKCk7CiAgICBvYnNlcnZlclNldC5mbHVzaCgpOwogIH0K fQoKRW1iZXIuZW5kUHJvcGVydHlDaGFuZ2VzID0gZW5kUHJvcGVydHlDaGFu Z2VzOwoKLyoqCiAgTWFrZSBhIHNlcmllcyBvZiBwcm9wZXJ0eSBjaGFuZ2Vz IHRvZ2V0aGVyIGluIGFuCiAgZXhjZXB0aW9uLXNhZmUgd2F5LgoKICBgYGBq YXZhc2NyaXB0CiAgRW1iZXIuY2hhbmdlUHJvcGVydGllcyhmdW5jdGlvbigp IHsKICAgIG9iajEuc2V0KCdmb28nLCBtYXlCbG93VXBXaGVuU2V0KTsKICAg IG9iajIuc2V0KCdiYXInLCBiYXopOwogIH0pOwogIGBgYAoKICBAbWV0aG9k IGNoYW5nZVByb3BlcnRpZXMKICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFj awogIEBwYXJhbSBbYmluZGluZ10KKi8KRW1iZXIuY2hhbmdlUHJvcGVydGll cyA9IGZ1bmN0aW9uKGNiLCBiaW5kaW5nKSB7CiAgYmVnaW5Qcm9wZXJ0eUNo YW5nZXMoKTsKICB0cnlGaW5hbGx5KGNiLCBlbmRQcm9wZXJ0eUNoYW5nZXMs IGJpbmRpbmcpOwp9OwoKZnVuY3Rpb24gbm90aWZ5QmVmb3JlT2JzZXJ2ZXJz KG9iaiwga2V5TmFtZSkgewogIGlmIChvYmouaXNEZXN0cm95aW5nKSB7IHJl dHVybjsgfQoKICB2YXIgZXZlbnROYW1lID0ga2V5TmFtZSArICc6YmVmb3Jl JywgbGlzdGVuZXJzLCBkaWZmOwogIGlmIChkZWZlcnJlZCkgewogICAgbGlz dGVuZXJzID0gYmVmb3JlT2JzZXJ2ZXJTZXQuYWRkKG9iaiwga2V5TmFtZSwg ZXZlbnROYW1lKTsKICAgIGRpZmYgPSBsaXN0ZW5lcnNEaWZmKG9iaiwgZXZl bnROYW1lLCBsaXN0ZW5lcnMpOwogICAgc2VuZEV2ZW50KG9iaiwgZXZlbnRO YW1lLCBbb2JqLCBrZXlOYW1lXSwgZGlmZik7CiAgfSBlbHNlIHsKICAgIHNl bmRFdmVudChvYmosIGV2ZW50TmFtZSwgW29iaiwga2V5TmFtZV0pOwogIH0K fQoKZnVuY3Rpb24gbm90aWZ5T2JzZXJ2ZXJzKG9iaiwga2V5TmFtZSkgewog IGlmIChvYmouaXNEZXN0cm95aW5nKSB7IHJldHVybjsgfQoKICB2YXIgZXZl bnROYW1lID0ga2V5TmFtZSArICc6Y2hhbmdlJywgbGlzdGVuZXJzOwogIGlm IChkZWZlcnJlZCkgewogICAgbGlzdGVuZXJzID0gb2JzZXJ2ZXJTZXQuYWRk KG9iaiwga2V5TmFtZSwgZXZlbnROYW1lKTsKICAgIGxpc3RlbmVyc1VuaW9u KG9iaiwgZXZlbnROYW1lLCBsaXN0ZW5lcnMpOwogIH0gZWxzZSB7CiAgICBz ZW5kRXZlbnQob2JqLCBldmVudE5hbWUsIFtvYmosIGtleU5hbWVdKTsKICB9 Cn0KCn0pKCk7CgoKCihmdW5jdGlvbigpIHsKLy8gTUVUQV9LRVkKLy8gX2dl dFBhdGgKLy8gcHJvcGVydHlXaWxsQ2hhbmdlLCBwcm9wZXJ0eURpZENoYW5n ZQoKdmFyIE1FVEFfS0VZID0gRW1iZXIuTUVUQV9LRVksCiAgICBNQU5EQVRP UllfU0VUVEVSID0gRW1iZXIuRU5WLk1BTkRBVE9SWV9TRVRURVIsCiAgICBJ U19HTE9CQUwgPSAvXihbQS1aJF18KFswLTldW0EtWiRdKSkvLAogICAgZ2V0 UGF0aCA9IEVtYmVyLl9nZXRQYXRoOwoKLyoqCiAgU2V0cyB0aGUgdmFsdWUg b2YgYSBwcm9wZXJ0eSBvbiBhbiBvYmplY3QsIHJlc3BlY3RpbmcgY29tcHV0 ZWQgcHJvcGVydGllcwogIGFuZCBub3RpZnlpbmcgb2JzZXJ2ZXJzIGFuZCBv dGhlciBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZS4gSWYgdGhlCiAgcHJvcGVy dHkgaXMgbm90IGRlZmluZWQgYnV0IHRoZSBvYmplY3QgaW1wbGVtZW50cyB0 aGUgYHNldFVua25vd25Qcm9wZXJ0eWAKICBtZXRob2QgdGhlbiB0aGF0IHdp bGwgYmUgaW52b2tlZCBhcyB3ZWxsLgoKICBAbWV0aG9kIHNldAogIEBmb3Ig RW1iZXIKICBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gbW9k aWZ5LgogIEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRoZSBwcm9wZXJ0eSBr ZXkgdG8gc2V0CiAgQHBhcmFtIHtPYmplY3R9IHZhbHVlIFRoZSB2YWx1ZSB0 byBzZXQKICBAcmV0dXJuIHtPYmplY3R9IHRoZSBwYXNzZWQgdmFsdWUuCiov CnZhciBzZXQgPSBmdW5jdGlvbiBzZXQob2JqLCBrZXlOYW1lLCB2YWx1ZSwg dG9sZXJhbnQpIHsKICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHsK ICAgIEVtYmVyLmFzc2VydCgiUGF0aCAnIiArIG9iaiArICInIG11c3QgYmUg Z2xvYmFsIGlmIG5vIG9iaiBpcyBnaXZlbi4iLCBJU19HTE9CQUwudGVzdChv YmopKTsKICAgIHZhbHVlID0ga2V5TmFtZTsKICAgIGtleU5hbWUgPSBvYmo7 CiAgICBvYmogPSBudWxsOwogIH0KCiAgRW1iZXIuYXNzZXJ0KCJDYW5ub3Qg Y2FsbCBzZXQgd2l0aCAiKyBrZXlOYW1lICsiIGtleS4iLCAhIWtleU5hbWUp OwoKICBpZiAoIW9iaiB8fCBrZXlOYW1lLmluZGV4T2YoJy4nKSAhPT0gLTEp IHsKICAgIHJldHVybiBzZXRQYXRoKG9iaiwga2V5TmFtZSwgdmFsdWUsIHRv bGVyYW50KTsKICB9CgogIEVtYmVyLmFzc2VydCgiWW91IG5lZWQgdG8gcHJv dmlkZSBhbiBvYmplY3QgYW5kIGtleSB0byBgc2V0YC4iLCAhIW9iaiAmJiBr ZXlOYW1lICE9PSB1bmRlZmluZWQpOwogIEVtYmVyLmFzc2VydCgnY2FsbGlu ZyBzZXQgb24gZGVzdHJveWVkIG9iamVjdCcsICFvYmouaXNEZXN0cm95ZWQp OwoKICB2YXIgbWV0YSA9IG9ialtNRVRBX0tFWV0sIGRlc2MgPSBtZXRhICYm IG1ldGEuZGVzY3Nba2V5TmFtZV0sCiAgICAgIGlzVW5rbm93biwgY3VycmVu dFZhbHVlOwogIGlmIChkZXNjKSB7CiAgICBkZXNjLnNldChvYmosIGtleU5h bWUsIHZhbHVlKTsKICB9IGVsc2UgewogICAgaXNVbmtub3duID0gJ29iamVj dCcgPT09IHR5cGVvZiBvYmogJiYgIShrZXlOYW1lIGluIG9iaik7CgogICAg Ly8gc2V0VW5rbm93blByb3BlcnR5IGlzIGNhbGxlZCBpZiBgb2JqYCBpcyBh biBvYmplY3QsCiAgICAvLyB0aGUgcHJvcGVydHkgZG9lcyBub3QgYWxyZWFk eSBleGlzdCwgYW5kIHRoZQogICAgLy8gYHNldFVua25vd25Qcm9wZXJ0eWAg bWV0aG9kIGV4aXN0cyBvbiB0aGUgb2JqZWN0CiAgICBpZiAoaXNVbmtub3du ICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBvYmouc2V0VW5rbm93blByb3Bl cnR5KSB7CiAgICAgIG9iai5zZXRVbmtub3duUHJvcGVydHkoa2V5TmFtZSwg dmFsdWUpOwogICAgfSBlbHNlIGlmIChtZXRhICYmIG1ldGEud2F0Y2hpbmdb a2V5TmFtZV0gPiAwKSB7CiAgICAgIGlmIChNQU5EQVRPUllfU0VUVEVSKSB7 CiAgICAgICAgY3VycmVudFZhbHVlID0gbWV0YS52YWx1ZXNba2V5TmFtZV07 CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3VycmVudFZhbHVlID0gb2JqW2tl eU5hbWVdOwogICAgICB9CiAgICAgIC8vIG9ubHkgdHJpZ2dlciBhIGNoYW5n ZSBpZiB0aGUgdmFsdWUgaGFzIGNoYW5nZWQKICAgICAgaWYgKHZhbHVlICE9 PSBjdXJyZW50VmFsdWUpIHsKICAgICAgICBFbWJlci5wcm9wZXJ0eVdpbGxD aGFuZ2Uob2JqLCBrZXlOYW1lKTsKICAgICAgICBpZiAoTUFOREFUT1JZX1NF VFRFUikgewogICAgICAgICAgaWYgKChjdXJyZW50VmFsdWUgPT09IHVuZGVm aW5lZCAmJiAhKGtleU5hbWUgaW4gb2JqKSkgfHwgIW9iai5wcm9wZXJ0eUlz RW51bWVyYWJsZShrZXlOYW1lKSkgewogICAgICAgICAgICBFbWJlci5kZWZp bmVQcm9wZXJ0eShvYmosIGtleU5hbWUsIG51bGwsIHZhbHVlKTsgLy8gc2V0 dXAgbWFuZGF0b3J5IHNldHRlcgogICAgICAgICAgfSBlbHNlIHsKICAgICAg ICAgICAgbWV0YS52YWx1ZXNba2V5TmFtZV0gPSB2YWx1ZTsKICAgICAgICAg IH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgb2JqW2tleU5hbWVdID0g dmFsdWU7CiAgICAgICAgfQogICAgICAgIEVtYmVyLnByb3BlcnR5RGlkQ2hh bmdlKG9iaiwga2V5TmFtZSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAg IG9ialtrZXlOYW1lXSA9IHZhbHVlOwogICAgfQogIH0KICByZXR1cm4gdmFs dWU7Cn07CgovLyBDdXJyZW50bHkgdXNlZCBvbmx5IGJ5IEVtYmVyIERhdGEg dGVzdHMKaWYgKEVtYmVyLmNvbmZpZy5vdmVycmlkZUFjY2Vzc29ycykgewog IEVtYmVyLnNldCA9IHNldDsKICBFbWJlci5jb25maWcub3ZlcnJpZGVBY2Nl c3NvcnMoKTsKICBzZXQgPSBFbWJlci5zZXQ7Cn0KCmZ1bmN0aW9uIHNldFBh dGgocm9vdCwgcGF0aCwgdmFsdWUsIHRvbGVyYW50KSB7CiAgdmFyIGtleU5h bWU7CgogIC8vIGdldCB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBwYXRoCiAga2V5 TmFtZSA9IHBhdGguc2xpY2UocGF0aC5sYXN0SW5kZXhPZignLicpICsgMSk7 CgogIC8vIGdldCB0aGUgZmlyc3QgcGFydCBvZiB0aGUgcGFydAogIHBhdGgg ICAgPSAocGF0aCA9PT0ga2V5TmFtZSkgPyBrZXlOYW1lIDogcGF0aC5zbGlj ZSgwLCBwYXRoLmxlbmd0aC0oa2V5TmFtZS5sZW5ndGgrMSkpOwoKICAvLyB1 bmxlc3MgdGhlIHBhdGggaXMgdGhpcywgbG9vayB1cCB0aGUgZmlyc3QgcGFy dCB0bwogIC8vIGdldCB0aGUgcm9vdAogIGlmIChwYXRoICE9PSAndGhpcycp IHsKICAgIHJvb3QgPSBnZXRQYXRoKHJvb3QsIHBhdGgpOwogIH0KCiAgaWYg KCFrZXlOYW1lIHx8IGtleU5hbWUubGVuZ3RoID09PSAwKSB7CiAgICB0aHJv dyBuZXcgRW1iZXIuRXJyb3IoJ1Byb3BlcnR5IHNldCBmYWlsZWQ6IFlvdSBw YXNzZWQgYW4gZW1wdHkgcGF0aCcpOwogIH0KCiAgaWYgKCFyb290KSB7CiAg ICBpZiAodG9sZXJhbnQpIHsgcmV0dXJuOyB9CiAgICBlbHNlIHsgdGhyb3cg bmV3IEVtYmVyLkVycm9yKCdQcm9wZXJ0eSBzZXQgZmFpbGVkOiBvYmplY3Qg aW4gcGF0aCAiJytwYXRoKyciIGNvdWxkIG5vdCBiZSBmb3VuZCBvciB3YXMg ZGVzdHJveWVkLicpOyB9CiAgfQoKICByZXR1cm4gc2V0KHJvb3QsIGtleU5h bWUsIHZhbHVlKTsKfQoKRW1iZXIuc2V0ID0gc2V0OwoKLyoqCiAgRXJyb3It dG9sZXJhbnQgZm9ybSBvZiBgRW1iZXIuc2V0YC4gV2lsbCBub3QgYmxvdyB1 cCBpZiBhbnkgcGFydCBvZiB0aGUKICBjaGFpbiBpcyBgdW5kZWZpbmVkYCwg YG51bGxgLCBvciBkZXN0cm95ZWQuCgogIFRoaXMgaXMgcHJpbWFyaWx5IHVz ZWQgd2hlbiBzeW5jaW5nIGJpbmRpbmdzLCB3aGljaCBtYXkgdHJ5IHRvIHVw ZGF0ZSBhZnRlcgogIGFuIG9iamVjdCBoYXMgYmVlbiBkZXN0cm95ZWQuCgog IEBtZXRob2QgdHJ5U2V0CiAgQGZvciBFbWJlcgogIEBwYXJhbSB7T2JqZWN0 fSBvYmogVGhlIG9iamVjdCB0byBtb2RpZnkuCiAgQHBhcmFtIHtTdHJpbmd9 IHBhdGggVGhlIHByb3BlcnR5IHBhdGggdG8gc2V0CiAgQHBhcmFtIHtPYmpl Y3R9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQKKi8KRW1iZXIudHJ5U2V0ID0g ZnVuY3Rpb24ocm9vdCwgcGF0aCwgdmFsdWUpIHsKICByZXR1cm4gc2V0KHJv b3QsIHBhdGgsIHZhbHVlLCB0cnVlKTsKfTsKCn0pKCk7CgoKCihmdW5jdGlv bigpIHsKLyoqCkBtb2R1bGUgZW1iZXItbWV0YWwKKi8KCi8qCiAgSmF2YVNj cmlwdCAoYmVmb3JlIEVTNikgZG9lcyBub3QgaGF2ZSBhIE1hcCBpbXBsZW1l bnRhdGlvbi4gT2JqZWN0cywKICB3aGljaCBhcmUgb2Z0ZW4gdXNlZCBhcyBk aWN0aW9uYXJpZXMsIG1heSBvbmx5IGhhdmUgU3RyaW5ncyBhcyBrZXlzLgoK ICBCZWNhdXNlIEVtYmVyIGhhcyBhIHdheSB0byBnZXQgYSB1bmlxdWUgaWRl bnRpZmllciBmb3IgZXZlcnkgb2JqZWN0CiAgdmlhIGBFbWJlci5ndWlkRm9y YCwgd2UgY2FuIGltcGxlbWVudCBhIHBlcmZvcm1hbnQgTWFwIHdpdGggYXJi aXRyYXJ5CiAga2V5cy4gQmVjYXVzZSBpdCBpcyBjb21tb25seSB1c2VkIGlu IGxvdy1sZXZlbCBib29ra2VlcGluZywgTWFwIGlzCiAgaW1wbGVtZW50ZWQg YXMgYSBwdXJlIEphdmFTY3JpcHQgb2JqZWN0IGZvciBwZXJmb3JtYW5jZS4K CiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBmb2xsb3dzIHRoZSBjdXJyZW50IGl0 ZXJhdGlvbiBvZiB0aGUgRVM2IHByb3Bvc2FsIGZvcgogIG1hcHMgKGh0dHA6 Ly93aWtpLmVjbWFzY3JpcHQub3JnL2Rva3UucGhwP2lkPWhhcm1vbnk6c2lt cGxlX21hcHNfYW5kX3NldHMpLAogIHdpdGggdHdvIGV4Y2VwdGlvbnMuIEZp cnN0LCBiZWNhdXNlIHdlIG5lZWQgb3VyIGltcGxlbWVudGF0aW9uIHRvIGJl IHBsZWFzYW50CiAgb24gb2xkZXIgYnJvd3NlcnMsIHdlIGRvIG5vdCB1c2Ug dGhlIGBkZWxldGVgIG5hbWUgKHVzaW5nIGByZW1vdmVgIGluc3RlYWQpLgog IFNlY29uZCwgYXMgd2UgZG8gbm90IGhhdmUgdGhlIGx1eHVyeSBvZiBpbi1W TSBpdGVyYXRpb24sIHdlIGltcGxlbWVudCBhCiAgZm9yRWFjaCBtZXRob2Qg Zm9yIGl0ZXJhdGlvbi4KCiAgTWFwIGlzIG1vY2tlZCBvdXQgdG8gbG9vayBs aWtlIGFuIEVtYmVyIG9iamVjdCwgc28geW91IGNhbiBkbwogIGBFbWJlci5N YXAuY3JlYXRlKClgIGZvciBzeW1tZXRyeSB3aXRoIG90aGVyIEVtYmVyIGNs YXNzZXMuCiovCnZhciBzZXQgPSBFbWJlci5zZXQsCiAgICBndWlkRm9yID0g RW1iZXIuZ3VpZEZvciwKICAgIGluZGV4T2YgPSBFbWJlci5BcnJheVBvbHlm aWxscy5pbmRleE9mOwoKdmFyIGNvcHkgPSBmdW5jdGlvbihvYmopIHsKICB2 YXIgb3V0cHV0ID0ge307CgogIGZvciAodmFyIHByb3AgaW4gb2JqKSB7CiAg ICBpZiAob2JqLmhhc093blByb3BlcnR5KHByb3ApKSB7IG91dHB1dFtwcm9w XSA9IG9ialtwcm9wXTsgfQogIH0KCiAgcmV0dXJuIG91dHB1dDsKfTsKCnZh ciBjb3B5TWFwID0gZnVuY3Rpb24ob3JpZ2luYWwsIG5ld09iamVjdCkgewog IHZhciBrZXlzID0gb3JpZ2luYWwua2V5cy5jb3B5KCksCiAgICAgIHZhbHVl cyA9IGNvcHkob3JpZ2luYWwudmFsdWVzKTsKCiAgbmV3T2JqZWN0LmtleXMg PSBrZXlzOwogIG5ld09iamVjdC52YWx1ZXMgPSB2YWx1ZXM7CiAgbmV3T2Jq ZWN0Lmxlbmd0aCA9IG9yaWdpbmFsLmxlbmd0aDsKCiAgcmV0dXJuIG5ld09i amVjdDsKfTsKCi8qKgogIFRoaXMgY2xhc3MgaXMgdXNlZCBpbnRlcm5hbGx5 IGJ5IEVtYmVyIGFuZCBFbWJlciBEYXRhLgogIFBsZWFzZSBkbyBub3QgdXNl IGl0IGF0IHRoaXMgdGltZS4gV2UgcGxhbiB0byBjbGVhbiBpdCB1cAogIGFu ZCBhZGQgbWFueSB0ZXN0cyBzb29uLgoKICBAY2xhc3MgT3JkZXJlZFNldAog IEBuYW1lc3BhY2UgRW1iZXIKICBAY29uc3RydWN0b3IKICBAcHJpdmF0ZQoq Lwp2YXIgT3JkZXJlZFNldCA9IEVtYmVyLk9yZGVyZWRTZXQgPSBmdW5jdGlv bigpIHsKICB0aGlzLmNsZWFyKCk7Cn07CgovKioKICBAbWV0aG9kIGNyZWF0 ZQogIEBzdGF0aWMKICBAcmV0dXJuIHtFbWJlci5PcmRlcmVkU2V0fQoqLwpP cmRlcmVkU2V0LmNyZWF0ZSA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBuZXcg T3JkZXJlZFNldCgpOwp9OwoKCk9yZGVyZWRTZXQucHJvdG90eXBlID0gewog IC8qKgogICAgQG1ldGhvZCBjbGVhcgogICovCiAgY2xlYXI6IGZ1bmN0aW9u KCkgewogICAgdGhpcy5wcmVzZW5jZVNldCA9IHt9OwogICAgdGhpcy5saXN0 ID0gW107CiAgfSwKCiAgLyoqCiAgICBAbWV0aG9kIGFkZAogICAgQHBhcmFt IG9iagogICovCiAgYWRkOiBmdW5jdGlvbihvYmopIHsKICAgIHZhciBndWlk ID0gZ3VpZEZvcihvYmopLAogICAgICAgIHByZXNlbmNlU2V0ID0gdGhpcy5w cmVzZW5jZVNldCwKICAgICAgICBsaXN0ID0gdGhpcy5saXN0OwoKICAgIGlm IChndWlkIGluIHByZXNlbmNlU2V0KSB7IHJldHVybjsgfQoKICAgIHByZXNl bmNlU2V0W2d1aWRdID0gdHJ1ZTsKICAgIGxpc3QucHVzaChvYmopOwogIH0s CgogIC8qKgogICAgQG1ldGhvZCByZW1vdmUKICAgIEBwYXJhbSBvYmoKICAq LwogIHJlbW92ZTogZnVuY3Rpb24ob2JqKSB7CiAgICB2YXIgZ3VpZCA9IGd1 aWRGb3Iob2JqKSwKICAgICAgICBwcmVzZW5jZVNldCA9IHRoaXMucHJlc2Vu Y2VTZXQsCiAgICAgICAgbGlzdCA9IHRoaXMubGlzdDsKCiAgICBkZWxldGUg cHJlc2VuY2VTZXRbZ3VpZF07CgogICAgdmFyIGluZGV4ID0gaW5kZXhPZi5j YWxsKGxpc3QsIG9iaik7CiAgICBpZiAoaW5kZXggPiAtMSkgewogICAgICBs aXN0LnNwbGljZShpbmRleCwgMSk7CiAgICB9CiAgfSwKCiAgLyoqCiAgICBA bWV0aG9kIGlzRW1wdHkKICAgIEByZXR1cm4ge0Jvb2xlYW59CiAgKi8KICBp c0VtcHR5OiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmxpc3QubGVu Z3RoID09PSAwOwogIH0sCgogIC8qKgogICAgQG1ldGhvZCBoYXMKICAgIEBw YXJhbSBvYmoKICAgIEByZXR1cm4ge0Jvb2xlYW59CiAgKi8KICBoYXM6IGZ1 bmN0aW9uKG9iaikgewogICAgdmFyIGd1aWQgPSBndWlkRm9yKG9iaiksCiAg ICAgICAgcHJlc2VuY2VTZXQgPSB0aGlzLnByZXNlbmNlU2V0OwoKICAgIHJl dHVybiBndWlkIGluIHByZXNlbmNlU2V0OwogIH0sCgogIC8qKgogICAgQG1l dGhvZCBmb3JFYWNoCiAgICBAcGFyYW0ge0Z1bmN0aW9ufSBmbgogICAgQHBh cmFtIHNlbGYKICAqLwogIGZvckVhY2g6IGZ1bmN0aW9uKGZuLCBzZWxmKSB7 CiAgICAvLyBhbGxvdyBtdXRhdGlvbiBkdXJpbmcgaXRlcmF0aW9uCiAgICB2 YXIgbGlzdCA9IHRoaXMudG9BcnJheSgpOwoKICAgIGZvciAodmFyIGkgPSAw LCBqID0gbGlzdC5sZW5ndGg7IGkgPCBqOyBpKyspIHsKICAgICAgZm4uY2Fs bChzZWxmLCBsaXN0W2ldKTsKICAgIH0KICB9LAoKICAvKioKICAgIEBtZXRo b2QgdG9BcnJheQogICAgQHJldHVybiB7QXJyYXl9CiAgKi8KICB0b0FycmF5 OiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmxpc3Quc2xpY2UoKTsK ICB9LAoKICAvKioKICAgIEBtZXRob2QgY29weQogICAgQHJldHVybiB7RW1i ZXIuT3JkZXJlZFNldH0KICAqLwogIGNvcHk6IGZ1bmN0aW9uKCkgewogICAg dmFyIHNldCA9IG5ldyBPcmRlcmVkU2V0KCk7CgogICAgc2V0LnByZXNlbmNl U2V0ID0gY29weSh0aGlzLnByZXNlbmNlU2V0KTsKICAgIHNldC5saXN0ID0g dGhpcy50b0FycmF5KCk7CgogICAgcmV0dXJuIHNldDsKICB9Cn07CgovKioK ICBBIE1hcCBzdG9yZXMgdmFsdWVzIGluZGV4ZWQgYnkga2V5cy4gVW5saWtl IEphdmFTY3JpcHQncwogIGRlZmF1bHQgT2JqZWN0cywgdGhlIGtleXMgb2Yg YSBNYXAgY2FuIGJlIGFueSBKYXZhU2NyaXB0CiAgb2JqZWN0LgoKICBJbnRl cm5hbGx5LCBhIE1hcCBoYXMgdHdvIGRhdGEgc3RydWN0dXJlczoKCiAgMS4g YGtleXNgOiBhbiBPcmRlcmVkU2V0IG9mIGFsbCBvZiB0aGUgZXhpc3Rpbmcg a2V5cwogIDIuIGB2YWx1ZXNgOiBhIEphdmFTY3JpcHQgT2JqZWN0IGluZGV4 ZWQgYnkgdGhlIGBFbWJlci5ndWlkRm9yKGtleSlgCgogIFdoZW4gYSBrZXkv dmFsdWUgcGFpciBpcyBhZGRlZCBmb3IgdGhlIGZpcnN0IHRpbWUsIHdlCiAg YWRkIHRoZSBrZXkgdG8gdGhlIGBrZXlzYCBPcmRlcmVkU2V0LCBhbmQgY3Jl YXRlIG9yCiAgcmVwbGFjZSBhbiBlbnRyeSBpbiBgdmFsdWVzYC4gV2hlbiBh biBlbnRyeSBpcyBkZWxldGVkLAogIHdlIGRlbGV0ZSBpdHMgZW50cnkgaW4g YGtleXNgIGFuZCBgdmFsdWVzYC4KCiAgQGNsYXNzIE1hcAogIEBuYW1lc3Bh Y2UgRW1iZXIKICBAcHJpdmF0ZQogIEBjb25zdHJ1Y3RvcgoqLwp2YXIgTWFw ID0gRW1iZXIuTWFwID0gZnVuY3Rpb24oKSB7CiAgdGhpcy5rZXlzID0gRW1i ZXIuT3JkZXJlZFNldC5jcmVhdGUoKTsKICB0aGlzLnZhbHVlcyA9IHt9Owp9 OwoKLyoqCiAgQG1ldGhvZCBjcmVhdGUKICBAc3RhdGljCiovCk1hcC5jcmVh dGUgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gbmV3IE1hcCgpOwp9OwoKTWFw LnByb3RvdHlwZSA9IHsKICAvKioKICAgIFRoaXMgcHJvcGVydHkgd2lsbCBj aGFuZ2UgYXMgdGhlIG51bWJlciBvZiBvYmplY3RzIGluIHRoZSBtYXAgY2hh bmdlcy4KICAgCiAgICBAcHJvcGVydHkgbGVuZ3RoCiAgICBAdHlwZSBudW1i ZXIKICAgIEBkZWZhdWx0IDAKICAqLwogIGxlbmd0aDogMCwKICAgIAogICAg CiAgLyoqCiAgICBSZXRyaWV2ZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRo IGEgZ2l2ZW4ga2V5LgoKICAgIEBtZXRob2QgZ2V0CiAgICBAcGFyYW0geyp9 IGtleQogICAgQHJldHVybiB7Kn0gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0 aCB0aGUga2V5LCBvciBgdW5kZWZpbmVkYAogICovCiAgZ2V0OiBmdW5jdGlv bihrZXkpIHsKICAgIHZhciB2YWx1ZXMgPSB0aGlzLnZhbHVlcywKICAgICAg ICBndWlkID0gZ3VpZEZvcihrZXkpOwoKICAgIHJldHVybiB2YWx1ZXNbZ3Vp ZF07CiAgfSwKCiAgLyoqCiAgICBBZGRzIGEgdmFsdWUgdG8gdGhlIG1hcC4g SWYgYSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSBoYXMgYWxyZWFkeSBiZWVu CiAgICBwcm92aWRlZCwgdGhlIG5ldyB2YWx1ZSB3aWxsIHJlcGxhY2UgdGhl IG9sZCB2YWx1ZS4KCiAgICBAbWV0aG9kIHNldAogICAgQHBhcmFtIHsqfSBr ZXkKICAgIEBwYXJhbSB7Kn0gdmFsdWUKICAqLwogIHNldDogZnVuY3Rpb24o a2V5LCB2YWx1ZSkgewogICAgdmFyIGtleXMgPSB0aGlzLmtleXMsCiAgICAg ICAgdmFsdWVzID0gdGhpcy52YWx1ZXMsCiAgICAgICAgZ3VpZCA9IGd1aWRG b3Ioa2V5KTsKCiAgICBrZXlzLmFkZChrZXkpOwogICAgdmFsdWVzW2d1aWRd ID0gdmFsdWU7CiAgICBzZXQodGhpcywgJ2xlbmd0aCcsIGtleXMubGlzdC5s ZW5ndGgpOwogIH0sCgogIC8qKgogICAgUmVtb3ZlcyBhIHZhbHVlIGZyb20g dGhlIG1hcCBmb3IgYW4gYXNzb2NpYXRlZCBrZXkuCgogICAgQG1ldGhvZCBy ZW1vdmUKICAgIEBwYXJhbSB7Kn0ga2V5CiAgICBAcmV0dXJuIHtCb29sZWFu fSB0cnVlIGlmIGFuIGl0ZW0gd2FzIHJlbW92ZWQsIGZhbHNlIG90aGVyd2lz ZQogICovCiAgcmVtb3ZlOiBmdW5jdGlvbihrZXkpIHsKICAgIC8vIGRvbid0 IHVzZSBFUzYgImRlbGV0ZSIgYmVjYXVzZSBpdCB3aWxsIGJlIGFubm95aW5n CiAgICAvLyB0byB1c2UgaW4gYnJvd3NlcnMgdGhhdCBhcmUgbm90IEVTNiBm cmllbmRseTsKICAgIHZhciBrZXlzID0gdGhpcy5rZXlzLAogICAgICAgIHZh bHVlcyA9IHRoaXMudmFsdWVzLAogICAgICAgIGd1aWQgPSBndWlkRm9yKGtl eSk7CgogICAgaWYgKHZhbHVlcy5oYXNPd25Qcm9wZXJ0eShndWlkKSkgewog ICAgICBrZXlzLnJlbW92ZShrZXkpOwogICAgICBkZWxldGUgdmFsdWVzW2d1 aWRdOwogICAgICBzZXQodGhpcywgJ2xlbmd0aCcsIGtleXMubGlzdC5sZW5n dGgpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHJl dHVybiBmYWxzZTsKICAgIH0KICB9LAoKICAvKioKICAgIENoZWNrIHdoZXRo ZXIgYSBrZXkgaXMgcHJlc2VudC4KCiAgICBAbWV0aG9kIGhhcwogICAgQHBh cmFtIHsqfSBrZXkKICAgIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhl IGl0ZW0gd2FzIHByZXNlbnQsIGZhbHNlIG90aGVyd2lzZQogICovCiAgaGFz OiBmdW5jdGlvbihrZXkpIHsKICAgIHZhciB2YWx1ZXMgPSB0aGlzLnZhbHVl cywKICAgICAgICBndWlkID0gZ3VpZEZvcihrZXkpOwoKICAgIHJldHVybiB2 YWx1ZXMuaGFzT3duUHJvcGVydHkoZ3VpZCk7CiAgfSwKCiAgLyoqCiAgICBJ dGVyYXRlIG92ZXIgYWxsIHRoZSBrZXlzIGFuZCB2YWx1ZXMuIENhbGxzIHRo ZSBmdW5jdGlvbiBvbmNlCiAgICBmb3IgZWFjaCBrZXksIHBhc3NpbmcgaW4g dGhlIGtleSBhbmQgdmFsdWUsIGluIHRoYXQgb3JkZXIuCgogICAgVGhlIGtl eXMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgaXRlcmF0ZWQgb3ZlciBpbiBpbnNl cnRpb24gb3JkZXIuCgogICAgQG1ldGhvZCBmb3JFYWNoCiAgICBAcGFyYW0g e0Z1bmN0aW9ufSBjYWxsYmFjawogICAgQHBhcmFtIHsqfSBzZWxmIGlmIHBh c3NlZCwgdGhlIGB0aGlzYCB2YWx1ZSBpbnNpZGUgdGhlCiAgICAgIGNhbGxi YWNrLiBCeSBkZWZhdWx0LCBgdGhpc2AgaXMgdGhlIG1hcC4KICAqLwogIGZv ckVhY2g6IGZ1bmN0aW9uKGNhbGxiYWNrLCBzZWxmKSB7CiAgICB2YXIga2V5 cyA9IHRoaXMua2V5cywKICAgICAgICB2YWx1ZXMgPSB0aGlzLnZhbHVlczsK CiAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7CiAgICAgIHZhciBn dWlkID0gZ3VpZEZvcihrZXkpOwogICAgICBjYWxsYmFjay5jYWxsKHNlbGYs IGtleSwgdmFsdWVzW2d1aWRdKTsKICAgIH0pOwogIH0sCgogIC8qKgogICAg QG1ldGhvZCBjb3B5CiAgICBAcmV0dXJuIHtFbWJlci5NYXB9CiAgKi8KICBj b3B5OiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBjb3B5TWFwKHRoaXMsIG5l dyBNYXAoKSk7CiAgfQp9OwoKLyoqCiAgQGNsYXNzIE1hcFdpdGhEZWZhdWx0 CiAgQG5hbWVzcGFjZSBFbWJlcgogIEBleHRlbmRzIEVtYmVyLk1hcAogIEBw cml2YXRlCiAgQGNvbnN0cnVjdG9yCiAgQHBhcmFtIFtvcHRpb25zXQogICAg QHBhcmFtIHsqfSBbb3B0aW9ucy5kZWZhdWx0VmFsdWVdCiovCnZhciBNYXBX aXRoRGVmYXVsdCA9IEVtYmVyLk1hcFdpdGhEZWZhdWx0ID0gZnVuY3Rpb24o b3B0aW9ucykgewogIE1hcC5jYWxsKHRoaXMpOwogIHRoaXMuZGVmYXVsdFZh bHVlID0gb3B0aW9ucy5kZWZhdWx0VmFsdWU7Cn07CgovKioKICBAbWV0aG9k IGNyZWF0ZQogIEBzdGF0aWMKICBAcGFyYW0gW29wdGlvbnNdCiAgICBAcGFy YW0geyp9IFtvcHRpb25zLmRlZmF1bHRWYWx1ZV0KICBAcmV0dXJuIHtFbWJl ci5NYXBXaXRoRGVmYXVsdHxFbWJlci5NYXB9IElmIG9wdGlvbnMgYXJlIHBh c3NlZCwgcmV0dXJucwogICAgYEVtYmVyLk1hcFdpdGhEZWZhdWx0YCBvdGhl cndpc2UgcmV0dXJucyBgRW1iZXIuTWFwYAoqLwpNYXBXaXRoRGVmYXVsdC5j cmVhdGUgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgaWYgKG9wdGlvbnMpIHsK ICAgIHJldHVybiBuZXcgTWFwV2l0aERlZmF1bHQob3B0aW9ucyk7CiAgfSBl bHNlIHsKICAgIHJldHVybiBuZXcgTWFwKCk7CiAgfQp9OwoKTWFwV2l0aERl ZmF1bHQucHJvdG90eXBlID0gRW1iZXIuY3JlYXRlKE1hcC5wcm90b3R5cGUp OwoKLyoqCiAgUmV0cmlldmUgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBh IGdpdmVuIGtleS4KCiAgQG1ldGhvZCBnZXQKICBAcGFyYW0geyp9IGtleQog IEByZXR1cm4geyp9IHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtl eSwgb3IgdGhlIGRlZmF1bHQgdmFsdWUKKi8KTWFwV2l0aERlZmF1bHQucHJv dG90eXBlLmdldCA9IGZ1bmN0aW9uKGtleSkgewogIHZhciBoYXNWYWx1ZSA9 IHRoaXMuaGFzKGtleSk7CgogIGlmIChoYXNWYWx1ZSkgewogICAgcmV0dXJu IE1hcC5wcm90b3R5cGUuZ2V0LmNhbGwodGhpcywga2V5KTsKICB9IGVsc2Ug ewogICAgdmFyIGRlZmF1bHRWYWx1ZSA9IHRoaXMuZGVmYXVsdFZhbHVlKGtl eSk7CiAgICB0aGlzLnNldChrZXksIGRlZmF1bHRWYWx1ZSk7CiAgICByZXR1 cm4gZGVmYXVsdFZhbHVlOwogIH0KfTsKCi8qKgogIEBtZXRob2QgY29weQog IEByZXR1cm4ge0VtYmVyLk1hcFdpdGhEZWZhdWx0fQoqLwpNYXBXaXRoRGVm YXVsdC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBj b3B5TWFwKHRoaXMsIG5ldyBNYXBXaXRoRGVmYXVsdCh7CiAgICBkZWZhdWx0 VmFsdWU6IHRoaXMuZGVmYXVsdFZhbHVlCiAgfSkpOwp9OwoKfSkoKTsKCgoK KGZ1bmN0aW9uKCkgewpmdW5jdGlvbiBjb25zb2xlTWV0aG9kKG5hbWUpIHsK ICB2YXIgY29uc29sZU9iaiwgbG9nVG9Db25zb2xlOwogIGlmIChFbWJlci5p bXBvcnRzLmNvbnNvbGUpIHsKICAgIGNvbnNvbGVPYmogPSBFbWJlci5pbXBv cnRzLmNvbnNvbGU7CiAgfSBlbHNlIGlmICh0eXBlb2YgY29uc29sZSAhPT0g J3VuZGVmaW5lZCcpIHsKICAgIGNvbnNvbGVPYmogPSBjb25zb2xlOwogIH0K CiAgdmFyIG1ldGhvZCA9IHR5cGVvZiBjb25zb2xlT2JqID09PSAnb2JqZWN0 JyA/IGNvbnNvbGVPYmpbbmFtZV0gOiBudWxsOwoKICBpZiAobWV0aG9kKSB7 CiAgICAvLyBPbGRlciBJRSBkb2Vzbid0IHN1cHBvcnQgYXBwbHksIGJ1dCBD aHJvbWUgbmVlZHMgaXQKICAgIGlmICh0eXBlb2YgbWV0aG9kLmFwcGx5ID09 PSAnZnVuY3Rpb24nKSB7CiAgICAgIGxvZ1RvQ29uc29sZSA9IGZ1bmN0aW9u KCkgewogICAgICAgIG1ldGhvZC5hcHBseShjb25zb2xlT2JqLCBhcmd1bWVu dHMpOwogICAgICB9OwogICAgICBsb2dUb0NvbnNvbGUuZGlzcGxheU5hbWUg PSAnY29uc29sZS4nICsgbmFtZTsKICAgICAgcmV0dXJuIGxvZ1RvQ29uc29s ZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAg ICAgICB2YXIgbWVzc2FnZSA9IEFycmF5LnByb3RvdHlwZS5qb2luLmNhbGwo YXJndW1lbnRzLCAnLCAnKTsKICAgICAgICBtZXRob2QobWVzc2FnZSk7CiAg ICAgIH07CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBhc3NlcnRQb2x5ZmlsbCh0 ZXN0LCBtZXNzYWdlKSB7CiAgaWYgKCF0ZXN0KSB7CiAgICB0cnkgewogICAg ICAvLyBhdHRlbXB0IHRvIHByZXNlcnZlIHRoZSBzdGFjawogICAgICB0aHJv dyBuZXcgRW1iZXIuRXJyb3IoImFzc2VydGlvbiBmYWlsZWQ6ICIgKyBtZXNz YWdlKTsKICAgIH0gY2F0Y2goZXJyb3IpIHsKICAgICAgc2V0VGltZW91dChm dW5jdGlvbigpIHsKICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgfSwgMCk7 CiAgICB9CiAgfQp9CgovKioKICBJbnNpZGUgRW1iZXItTWV0YWwsIHNpbXBs eSB1c2VzIHRoZSBtZXRob2RzIGZyb20gYGltcG9ydHMuY29uc29sZWAuCiAg T3ZlcnJpZGUgdGhpcyB0byBwcm92aWRlIG1vcmUgcm9idXN0IGxvZ2dpbmcg ZnVuY3Rpb25hbGl0eS4KCiAgQGNsYXNzIExvZ2dlcgogIEBuYW1lc3BhY2Ug RW1iZXIKKi8KRW1iZXIuTG9nZ2VyID0gewogIC8qKgogICBMb2dzIHRoZSBh cmd1bWVudHMgdG8gdGhlIGNvbnNvbGUuCiAgIFlvdSBjYW4gcGFzcyBhcyBt YW55IGFyZ3VtZW50cyBhcyB5b3Ugd2FudCBhbmQgdGhleSB3aWxsIGJlIGpv aW5lZCB0b2dldGhlciB3aXRoIGEgc3BhY2UuCgogICAgYGBgamF2YXNjcmlw dAogICAgdmFyIGZvbyA9IDE7CiAgICBFbWJlci5Mb2dnZXIubG9nKCdsb2cg dmFsdWUgb2YgZm9vOicsIGZvbyk7CiAgICAvLyAibG9nIHZhbHVlIG9mIGZv bzogMSIgd2lsbCBiZSBwcmludGVkIHRvIHRoZSBjb25zb2xlCiAgICBgYGAK CiAgIEBtZXRob2QgbG9nCiAgIEBmb3IgRW1iZXIuTG9nZ2VyCiAgIEBwYXJh bSB7Kn0gYXJndW1lbnRzCiAgKi8KICBsb2c6ICAgY29uc29sZU1ldGhvZCgn bG9nJykgICB8fCBFbWJlci5LLAoKICAvKioKICAgUHJpbnRzIHRoZSBhcmd1 bWVudHMgdG8gdGhlIGNvbnNvbGUgd2l0aCBhIHdhcm5pbmcgaWNvbi4KICAg WW91IGNhbiBwYXNzIGFzIG1hbnkgYXJndW1lbnRzIGFzIHlvdSB3YW50IGFu ZCB0aGV5IHdpbGwgYmUgam9pbmVkIHRvZ2V0aGVyIHdpdGggYSBzcGFjZS4K CiAgICBgYGBqYXZhc2NyaXB0CiAgICBFbWJlci5Mb2dnZXIud2FybignU29t ZXRoaW5nIGhhcHBlbmVkIScpOwogICAgLy8gIlNvbWV0aGluZyBoYXBwZW5l ZCEiIHdpbGwgYmUgcHJpbnRlZCB0byB0aGUgY29uc29sZSB3aXRoIGEgd2Fy bmluZyBpY29uLgogICAgYGBgCgogICBAbWV0aG9kIHdhcm4KICAgQGZvciBF bWJlci5Mb2dnZXIKICAgQHBhcmFtIHsqfSBhcmd1bWVudHMKICAqLwogIHdh cm46ICBjb25zb2xlTWV0aG9kKCd3YXJuJykgIHx8IEVtYmVyLkssCgogIC8q KgogICBQcmludHMgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29uc29sZSB3aXRo IGFuIGVycm9yIGljb24sIHJlZCB0ZXh0IGFuZCBhIHN0YWNrIHRyYWNlLgog ICBZb3UgY2FuIHBhc3MgYXMgbWFueSBhcmd1bWVudHMgYXMgeW91IHdhbnQg YW5kIHRoZXkgd2lsbCBiZSBqb2luZWQgdG9nZXRoZXIgd2l0aCBhIHNwYWNl LgoKICAgIGBgYGphdmFzY3JpcHQKICAgIEVtYmVyLkxvZ2dlci5lcnJvcign RGFuZ2VyISBEYW5nZXIhJyk7CiAgICAvLyAiRGFuZ2VyISBEYW5nZXIhIiB3 aWxsIGJlIHByaW50ZWQgdG8gdGhlIGNvbnNvbGUgaW4gcmVkIHRleHQuCiAg ICBgYGAKCiAgIEBtZXRob2QgZXJyb3IKICAgQGZvciBFbWJlci5Mb2dnZXIK ICAgQHBhcmFtIHsqfSBhcmd1bWVudHMKICAqLwogIGVycm9yOiBjb25zb2xl TWV0aG9kKCdlcnJvcicpIHx8IEVtYmVyLkssCgogIC8qKgogICBMb2dzIHRo ZSBhcmd1bWVudHMgdG8gdGhlIGNvbnNvbGUuCiAgIFlvdSBjYW4gcGFzcyBh cyBtYW55IGFyZ3VtZW50cyBhcyB5b3Ugd2FudCBhbmQgdGhleSB3aWxsIGJl IGpvaW5lZCB0b2dldGhlciB3aXRoIGEgc3BhY2UuCgogICAgYGBgamF2YXNj cmlwdAogICAgdmFyIGZvbyA9IDE7CiAgICBFbWJlci5Mb2dnZXIuaW5mbygn bG9nIHZhbHVlIG9mIGZvbzonLCBmb28pOwogICAgLy8gImxvZyB2YWx1ZSBv ZiBmb286IDEiIHdpbGwgYmUgcHJpbnRlZCB0byB0aGUgY29uc29sZQogICAg YGBgCgogICBAbWV0aG9kIGluZm8KICAgQGZvciBFbWJlci5Mb2dnZXIKICAg QHBhcmFtIHsqfSBhcmd1bWVudHMKICAqLwogIGluZm86ICBjb25zb2xlTWV0 aG9kKCdpbmZvJykgIHx8IEVtYmVyLkssCgogIC8qKgogICBMb2dzIHRoZSBh cmd1bWVudHMgdG8gdGhlIGNvbnNvbGUgaW4gYmx1ZSB0ZXh0LgogICBZb3Ug Y2FuIHBhc3MgYXMgbWFueSBhcmd1bWVudHMgYXMgeW91IHdhbnQgYW5kIHRo ZXkgd2lsbCBiZSBqb2luZWQgdG9nZXRoZXIgd2l0aCBhIHNwYWNlLgoKICAg IGBgYGphdmFzY3JpcHQKICAgIHZhciBmb28gPSAxOwogICAgRW1iZXIuTG9n Z2VyLmRlYnVnKCdsb2cgdmFsdWUgb2YgZm9vOicsIGZvbyk7CiAgICAvLyAi bG9nIHZhbHVlIG9mIGZvbzogMSIgd2lsbCBiZSBwcmludGVkIHRvIHRoZSBj b25zb2xlCiAgICBgYGAKCiAgIEBtZXRob2QgZGVidWcKICAgQGZvciBFbWJl ci5Mb2dnZXIKICAgQHBhcmFtIHsqfSBhcmd1bWVudHMKICAqLwogIGRlYnVn OiBjb25zb2xlTWV0aG9kKCdkZWJ1ZycpIHx8IGNvbnNvbGVNZXRob2QoJ2lu Zm8nKSB8fCBFbWJlci5LLAoKICAvKioKICAgSWYgdGhlIHZhbHVlIHBhc3Nl ZCBpbnRvIGBFbWJlci5Mb2dnZXIuYXNzZXJ0YCBpcyBub3QgdHJ1dGh5IGl0 IHdpbGwgdGhyb3cgYW4gZXJyb3Igd2l0aCBhIHN0YWNrIHRyYWNlLgoKICAg IGBgYGphdmFzY3JpcHQKICAgIEVtYmVyLkxvZ2dlci5hc3NlcnQodHJ1ZSk7 IC8vIHVuZGVmaW5lZAogICAgRW1iZXIuTG9nZ2VyLmFzc2VydCh0cnVlID09 PSBmYWxzZSk7IC8vIFRocm93cyBhbiBBc3NlcnRpb24gZmFpbGVkIGVycm9y LgogICAgYGBgCgogICBAbWV0aG9kIGFzc2VydAogICBAZm9yIEVtYmVyLkxv Z2dlcgogICBAcGFyYW0ge0Jvb2xlYW59IGJvb2wgVmFsdWUgdG8gdGVzdAog ICovCiAgYXNzZXJ0OiBjb25zb2xlTWV0aG9kKCdhc3NlcnQnKSB8fCBhc3Nl cnRQb2x5ZmlsbAp9OwoKCn0pKCk7CgoKCihmdW5jdGlvbigpIHsKLyoqCkBt b2R1bGUgZW1iZXItbWV0YWwKKi8KCnZhciBNRVRBX0tFWSA9IEVtYmVyLk1F VEFfS0VZLAogICAgbWV0YUZvciA9IEVtYmVyLm1ldGEsCiAgICBvYmplY3RE ZWZpbmVQcm9wZXJ0eSA9IEVtYmVyLnBsYXRmb3JtLmRlZmluZVByb3BlcnR5 OwoKdmFyIE1BTkRBVE9SWV9TRVRURVIgPSBFbWJlci5FTlYuTUFOREFUT1JZ X1NFVFRFUjsKCi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLy8gREVTQ1JJUFRPUgovLwoK LyoqCiAgT2JqZWN0cyBvZiB0aGlzIHR5cGUgY2FuIGltcGxlbWVudCBhbiBp bnRlcmZhY2UgdG8gcmVzcG9uZCB0byByZXF1ZXN0cyB0bwogIGdldCBhbmQg c2V0LiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBoYW5kbGVzIHNpbXBs ZSBwcm9wZXJ0aWVzLgoKICBZb3UgZ2VuZXJhbGx5IHdvbid0IG5lZWQgdG8g Y3JlYXRlIG9yIHN1YmNsYXNzIHRoaXMgZGlyZWN0bHkuCgogIEBjbGFzcyBE ZXNjcmlwdG9yCiAgQG5hbWVzcGFjZSBFbWJlcgogIEBwcml2YXRlCiAgQGNv bnN0cnVjdG9yCiovCkVtYmVyLkRlc2NyaXB0b3IgPSBmdW5jdGlvbigpIHt9 OwoKLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLgovLyBERUZJTklORyBQUk9QRVJUSUVTIEFQ SQovLwoKdmFyIE1BTkRBVE9SWV9TRVRURVJfRlVOQ1RJT04gPSBFbWJlci5N QU5EQVRPUllfU0VUVEVSX0ZVTkNUSU9OID0gZnVuY3Rpb24odmFsdWUpIHsK ICBFbWJlci5hc3NlcnQoIllvdSBtdXN0IHVzZSBFbWJlci5zZXQoKSB0byBh Y2Nlc3MgdGhpcyBwcm9wZXJ0eSAob2YgIiArIHRoaXMgKyAiKSIsIGZhbHNl KTsKfTsKCnZhciBERUZBVUxUX0dFVFRFUl9GVU5DVElPTiA9IEVtYmVyLkRF RkFVTFRfR0VUVEVSX0ZVTkNUSU9OID0gZnVuY3Rpb24obmFtZSkgewogIHJl dHVybiBmdW5jdGlvbigpIHsKICAgIHZhciBtZXRhID0gdGhpc1tNRVRBX0tF WV07CiAgICByZXR1cm4gbWV0YSAmJiBtZXRhLnZhbHVlc1tuYW1lXTsKICB9 Owp9OwoKLyoqCiAgTk9URTogVGhpcyBpcyBhIGxvdy1sZXZlbCBtZXRob2Qg dXNlZCBieSBvdGhlciBwYXJ0cyBvZiB0aGUgQVBJLiBZb3UgYWxtb3N0CiAg bmV2ZXIgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kIGRpcmVjdGx5LiBJbnN0 ZWFkIHlvdSBzaG91bGQgdXNlCiAgYEVtYmVyLm1peGluKClgIHRvIGRlZmlu ZSBuZXcgcHJvcGVydGllcy4KCiAgRGVmaW5lcyBhIHByb3BlcnR5IG9uIGFu IG9iamVjdC4gVGhpcyBtZXRob2Qgd29ya3MgbXVjaCBsaWtlIHRoZSBFUzUK ICBgT2JqZWN0LmRlZmluZVByb3BlcnR5KClgIG1ldGhvZCBleGNlcHQgdGhh dCBpdCBjYW4gYWxzbyBhY2NlcHQgY29tcHV0ZWQKICBwcm9wZXJ0aWVzIGFu ZCBvdGhlciBzcGVjaWFsIGRlc2NyaXB0b3JzLgoKICBOb3JtYWxseSB0aGlz IG1ldGhvZCB0YWtlcyBvbmx5IHRocmVlIHBhcmFtZXRlcnMuIEhvd2V2ZXIg aWYgeW91IHBhc3MgYW4KICBpbnN0YW5jZSBvZiBgRW1iZXIuRGVzY3JpcHRv cmAgYXMgdGhlIHRoaXJkIHBhcmFtIHRoZW4geW91IGNhbiBwYXNzIGFuCiAg b3B0aW9uYWwgdmFsdWUgYXMgdGhlIGZvdXJ0aCBwYXJhbWV0ZXIuIFRoaXMg aXMgb2Z0ZW4gbW9yZSBlZmZpY2llbnQgdGhhbgogIGNyZWF0aW5nIG5ldyBk ZXNjcmlwdG9yIGhhc2hlcyBmb3IgZWFjaCBwcm9wZXJ0eS4KCiAgIyMgRXhh bXBsZXMKCiAgYGBgamF2YXNjcmlwdAogIC8vIEVTNSBjb21wYXRpYmxlIG1v ZGUKICBFbWJlci5kZWZpbmVQcm9wZXJ0eShjb250YWN0LCAnZmlyc3ROYW1l JywgewogICAgd3JpdGFibGU6IHRydWUsCiAgICBjb25maWd1cmFibGU6IGZh bHNlLAogICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgIHZhbHVlOiAnQ2hhcmxl cycKICB9KTsKCiAgLy8gZGVmaW5lIGEgc2ltcGxlIHByb3BlcnR5CiAgRW1i ZXIuZGVmaW5lUHJvcGVydHkoY29udGFjdCwgJ2xhc3ROYW1lJywgdW5kZWZp bmVkLCAnSm9sbGV5Jyk7CgogIC8vIGRlZmluZSBhIGNvbXB1dGVkIHByb3Bl cnR5CiAgRW1iZXIuZGVmaW5lUHJvcGVydHkoY29udGFjdCwgJ2Z1bGxOYW1l JywgRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhp cy5maXJzdE5hbWUrJyAnK3RoaXMubGFzdE5hbWU7CiAgfSkucHJvcGVydHko J2ZpcnN0TmFtZScsICdsYXN0TmFtZScpKTsKICBgYGAKCiAgQHByaXZhdGUK ICBAbWV0aG9kIGRlZmluZVByb3BlcnR5CiAgQGZvciBFbWJlcgogIEBwYXJh bSB7T2JqZWN0fSBvYmogdGhlIG9iamVjdCB0byBkZWZpbmUgdGhpcyBwcm9w ZXJ0eSBvbi4gVGhpcyBtYXkgYmUgYSBwcm90b3R5cGUuCiAgQHBhcmFtIHtT dHJpbmd9IGtleU5hbWUgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5CiAgQHBh cmFtIHtFbWJlci5EZXNjcmlwdG9yfSBbZGVzY10gYW4gaW5zdGFuY2Ugb2Yg YEVtYmVyLkRlc2NyaXB0b3JgICh0eXBpY2FsbHkgYQogICAgY29tcHV0ZWQg cHJvcGVydHkpIG9yIGFuIEVTNSBkZXNjcmlwdG9yLgogICAgWW91IG11c3Qg cHJvdmlkZSB0aGlzIG9yIGBkYXRhYCBidXQgbm90IGJvdGguCiAgQHBhcmFt IHsqfSBbZGF0YV0gc29tZXRoaW5nIG90aGVyIHRoYW4gYSBkZXNjcmlwdG9y LCB0aGF0IHdpbGwKICAgIGJlY29tZSB0aGUgZXhwbGljaXQgdmFsdWUgb2Yg dGhpcyBwcm9wZXJ0eS4KKi8KRW1iZXIuZGVmaW5lUHJvcGVydHkgPSBmdW5j dGlvbihvYmosIGtleU5hbWUsIGRlc2MsIGRhdGEsIG1ldGEpIHsKICB2YXIg ZGVzY3MsIGV4aXN0aW5nRGVzYywgd2F0Y2hpbmcsIHZhbHVlOwoKICBpZiAo IW1ldGEpIG1ldGEgPSBtZXRhRm9yKG9iaik7CiAgZGVzY3MgPSBtZXRhLmRl c2NzOwogIGV4aXN0aW5nRGVzYyA9IG1ldGEuZGVzY3Nba2V5TmFtZV07CiAg d2F0Y2hpbmcgPSBtZXRhLndhdGNoaW5nW2tleU5hbWVdID4gMDsKCiAgaWYg KGV4aXN0aW5nRGVzYyBpbnN0YW5jZW9mIEVtYmVyLkRlc2NyaXB0b3IpIHsK ICAgIGV4aXN0aW5nRGVzYy50ZWFyZG93bihvYmosIGtleU5hbWUpOwogIH0K CiAgaWYgKGRlc2MgaW5zdGFuY2VvZiBFbWJlci5EZXNjcmlwdG9yKSB7CiAg ICB2YWx1ZSA9IGRlc2M7CgogICAgZGVzY3Nba2V5TmFtZV0gPSBkZXNjOwog ICAgaWYgKE1BTkRBVE9SWV9TRVRURVIgJiYgd2F0Y2hpbmcpIHsKICAgICAg b2JqZWN0RGVmaW5lUHJvcGVydHkob2JqLCBrZXlOYW1lLCB7CiAgICAgICAg Y29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgIGVudW1lcmFibGU6IHRydWUs CiAgICAgICAgd3JpdGFibGU6IHRydWUsCiAgICAgICAgdmFsdWU6IHVuZGVm aW5lZCAvLyBtYWtlIGVudW1lcmFibGUKICAgICAgfSk7CiAgICB9IGVsc2Ug ewogICAgICBvYmpba2V5TmFtZV0gPSB1bmRlZmluZWQ7IC8vIG1ha2UgZW51 bWVyYWJsZQogICAgfQoKICAgIGlmIChFbWJlci5GRUFUVVJFUy5pc0VuYWJs ZWQoJ2NvbXBvc2FibGUtY29tcHV0ZWQtcHJvcGVydGllcycpKSB7CiAgICAg IGlmIChkZXNjLmZ1bmMgJiYgZGVzYy5fZGVwZW5kZW50Q1BzKSB7CiAgICAg ICAgYWRkSW1wbGljaXRDUHMob2JqLCBkZXNjLl9kZXBlbmRlbnRDUHMsIG1l dGEpOwogICAgICB9CiAgICB9CiAgfSBlbHNlIHsKICAgIGRlc2NzW2tleU5h bWVdID0gdW5kZWZpbmVkOyAvLyBzaGFkb3cgZGVzY3JpcHRvciBpbiBwcm90 bwogICAgaWYgKGRlc2MgPT0gbnVsbCkgewogICAgICB2YWx1ZSA9IGRhdGE7 CgogICAgICBpZiAoTUFOREFUT1JZX1NFVFRFUiAmJiB3YXRjaGluZykgewog ICAgICAgIG1ldGEudmFsdWVzW2tleU5hbWVdID0gZGF0YTsKICAgICAgICBv YmplY3REZWZpbmVQcm9wZXJ0eShvYmosIGtleU5hbWUsIHsKICAgICAgICAg IGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgIGVudW1lcmFibGU6IHRy dWUsCiAgICAgICAgICBzZXQ6IE1BTkRBVE9SWV9TRVRURVJfRlVOQ1RJT04s CiAgICAgICAgICBnZXQ6IERFRkFVTFRfR0VUVEVSX0ZVTkNUSU9OKGtleU5h bWUpCiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb2JqW2tl eU5hbWVdID0gZGF0YTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdmFs dWUgPSBkZXNjOwoKICAgICAgLy8gY29tcGF0aWJpbGl0eSB3aXRoIEVTNQog ICAgICBvYmplY3REZWZpbmVQcm9wZXJ0eShvYmosIGtleU5hbWUsIGRlc2Mp OwogICAgfQogIH0KCiAgLy8gaWYga2V5IGlzIGJlaW5nIHdhdGNoZWQsIG92 ZXJyaWRlIGNoYWlucyB0aGF0CiAgLy8gd2VyZSBpbml0aWFsaXplZCB3aXRo IHRoZSBwcm90b3R5cGUKICBpZiAod2F0Y2hpbmcpIHsgRW1iZXIub3ZlcnJp ZGVDaGFpbnMob2JqLCBrZXlOYW1lLCBtZXRhKTsgfQoKICAvLyBUaGUgYHZh bHVlYCBwYXNzZWQgdG8gdGhlIGBkaWREZWZpbmVQcm9wZXJ0eWAgaG9vayBp cwogIC8vIGVpdGhlciB0aGUgZGVzY3JpcHRvciBvciBkYXRhLCB3aGljaGV2 ZXIgd2FzIHBhc3NlZC4KICBpZiAob2JqLmRpZERlZmluZVByb3BlcnR5KSB7 IG9iai5kaWREZWZpbmVQcm9wZXJ0eShvYmosIGtleU5hbWUsIHZhbHVlKTsg fQoKICByZXR1cm4gdGhpczsKfTsKCmlmIChFbWJlci5GRUFUVVJFUy5pc0Vu YWJsZWQoJ2NvbXBvc2FibGUtY29tcHV0ZWQtcHJvcGVydGllcycpKSB7CiAg dmFyIGFkZEltcGxpY2l0Q1BzID0gZnVuY3Rpb24gZGVmaW5lSW1wbGljaXRD UHMob2JqLCBpbXBsaWNpdENQcywgbWV0YSkgewogICAgdmFyIGNwLCBrZXks IGxlbmd0aCA9IGltcGxpY2l0Q1BzLmxlbmd0aDsKCiAgICBmb3IgKHZhciBp PTA7IGk8bGVuZ3RoOyArK2kpIHsKICAgICAgY3AgPSBpbXBsaWNpdENQc1tp XTsKICAgICAga2V5ID0gY3AuaW1wbGljaXRDUEtleTsKCiAgICAgIEVtYmVy LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCBjcCwgdW5kZWZpbmVkLCBtZXRh KTsKCiAgICAgIGlmIChjcC5fZGVwZW5kZW50Q1BzKSB7CiAgICAgICAgYWRk SW1wbGljaXRDUHMob2JqLCBjcC5fZGVwZW5kZW50Q1BzLCBtZXRhKTsKICAg ICAgfQogICAgfQogIH07Cn0KCn0pKCk7CgoKCihmdW5jdGlvbigpIHsKdmFy IGdldCA9IEVtYmVyLmdldDsKCi8qKgogIFRvIGdldCBtdWx0aXBsZSBwcm9w ZXJ0aWVzIGF0IG9uY2UsIGNhbGwgYEVtYmVyLmdldFByb3BlcnRpZXNgCiAg d2l0aCBhbiBvYmplY3QgZm9sbG93ZWQgYnkgYSBsaXN0IG9mIHN0cmluZ3Mg b3IgYW4gYXJyYXk6CgogIGBgYGphdmFzY3JpcHQKICBFbWJlci5nZXRQcm9w ZXJ0aWVzKHJlY29yZCwgJ2ZpcnN0TmFtZScsICdsYXN0TmFtZScsICd6aXBD b2RlJyk7ICAvLyB7IGZpcnN0TmFtZTogJ0pvaG4nLCBsYXN0TmFtZTogJ0Rv ZScsIHppcENvZGU6ICcxMDAxMScgfQogIGBgYAoKICBpcyBlcXVpdmFsZW50 IHRvOgoKICBgYGBqYXZhc2NyaXB0CiAgRW1iZXIuZ2V0UHJvcGVydGllcyhy ZWNvcmQsIFsnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJywgJ3ppcENvZGUnXSk7 ICAvLyB7IGZpcnN0TmFtZTogJ0pvaG4nLCBsYXN0TmFtZTogJ0RvZScsIHpp cENvZGU6ICcxMDAxMScgfQogIGBgYAoKICBAbWV0aG9kIGdldFByb3BlcnRp ZXMKICBAcGFyYW0gb2JqCiAgQHBhcmFtIHtTdHJpbmcuLi58QXJyYXl9IGxp c3Qgb2Yga2V5cyB0byBnZXQKICBAcmV0dXJuIHtIYXNofQoqLwpFbWJlci5n ZXRQcm9wZXJ0aWVzID0gZnVuY3Rpb24ob2JqKSB7CiAgdmFyIHJldCA9IHt9 LAogICAgICBwcm9wZXJ0eU5hbWVzID0gYXJndW1lbnRzLAogICAgICBpID0g MTsKCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIgJiYgRW1iZXIudHlw ZU9mKGFyZ3VtZW50c1sxXSkgPT09ICdhcnJheScpIHsKICAgIGkgPSAwOwog ICAgcHJvcGVydHlOYW1lcyA9IGFyZ3VtZW50c1sxXTsKICB9CiAgZm9yKHZh ciBsZW4gPSBwcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7 CiAgICByZXRbcHJvcGVydHlOYW1lc1tpXV0gPSBnZXQob2JqLCBwcm9wZXJ0 eU5hbWVzW2ldKTsKICB9CiAgcmV0dXJuIHJldDsKfTsKCn0pKCk7CgoKCihm dW5jdGlvbigpIHsKdmFyIGNoYW5nZVByb3BlcnRpZXMgPSBFbWJlci5jaGFu Z2VQcm9wZXJ0aWVzLAogICAgc2V0ID0gRW1iZXIuc2V0OwoKLyoqCiAgU2V0 IGEgbGlzdCBvZiBwcm9wZXJ0aWVzIG9uIGFuIG9iamVjdC4gVGhlc2UgcHJv cGVydGllcyBhcmUgc2V0IGluc2lkZQogIGEgc2luZ2xlIGBiZWdpblByb3Bl cnR5Q2hhbmdlc2AgYW5kIGBlbmRQcm9wZXJ0eUNoYW5nZXNgIGJhdGNoLCBz bwogIG9ic2VydmVycyB3aWxsIGJlIGJ1ZmZlcmVkLgoKICBgYGBqYXZhc2Ny aXB0CiAgYW5PYmplY3Quc2V0UHJvcGVydGllcyh7CiAgICBmaXJzdE5hbWU6 ICJTdGFubGV5IiwKICAgIGxhc3ROYW1lOiAiU3R1YXJ0IiwKICAgIGFnZTog IjIxIgogIH0pCiAgYGBgCgogIEBtZXRob2Qgc2V0UHJvcGVydGllcwogIEBw YXJhbSBzZWxmCiAgQHBhcmFtIHtPYmplY3R9IGhhc2gKICBAcmV0dXJuIHNl bGYKKi8KRW1iZXIuc2V0UHJvcGVydGllcyA9IGZ1bmN0aW9uKHNlbGYsIGhh c2gpIHsKICBjaGFuZ2VQcm9wZXJ0aWVzKGZ1bmN0aW9uKCkgewogICAgZm9y KHZhciBwcm9wIGluIGhhc2gpIHsKICAgICAgaWYgKGhhc2guaGFzT3duUHJv cGVydHkocHJvcCkpIHsgc2V0KHNlbGYsIHByb3AsIGhhc2hbcHJvcF0pOyB9 CiAgICB9CiAgfSk7CiAgcmV0dXJuIHNlbGY7Cn07Cgp9KSgpOwoKCgooZnVu Y3Rpb24oKSB7CnZhciBtZXRhRm9yID0gRW1iZXIubWV0YSwgLy8gdXRpbHMu anMKICAgIHR5cGVPZiA9IEVtYmVyLnR5cGVPZiwgLy8gdXRpbHMuanMKICAg IE1BTkRBVE9SWV9TRVRURVIgPSBFbWJlci5FTlYuTUFOREFUT1JZX1NFVFRF UiwKICAgIG9fZGVmaW5lUHJvcGVydHkgPSBFbWJlci5wbGF0Zm9ybS5kZWZp bmVQcm9wZXJ0eTsKCkVtYmVyLndhdGNoS2V5ID0gZnVuY3Rpb24ob2JqLCBr ZXlOYW1lLCBtZXRhKSB7CiAgLy8gY2FuJ3Qgd2F0Y2ggbGVuZ3RoIG9uIEFy cmF5IC0gaXQgaXMgc3BlY2lhbC4uLgogIGlmIChrZXlOYW1lID09PSAnbGVu Z3RoJyAmJiB0eXBlT2Yob2JqKSA9PT0gJ2FycmF5JykgeyByZXR1cm47IH0K CiAgdmFyIG0gPSBtZXRhIHx8IG1ldGFGb3Iob2JqKSwgd2F0Y2hpbmcgPSBt LndhdGNoaW5nOwoKICAvLyBhY3RpdmF0ZSB3YXRjaGluZyBmaXJzdCB0aW1l CiAgaWYgKCF3YXRjaGluZ1trZXlOYW1lXSkgewogICAgd2F0Y2hpbmdba2V5 TmFtZV0gPSAxOwoKICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2Ygb2Jq LndpbGxXYXRjaFByb3BlcnR5KSB7CiAgICAgIG9iai53aWxsV2F0Y2hQcm9w ZXJ0eShrZXlOYW1lKTsKICAgIH0KCiAgICBpZiAoTUFOREFUT1JZX1NFVFRF UiAmJiBrZXlOYW1lIGluIG9iaikgewogICAgICBtLnZhbHVlc1trZXlOYW1l XSA9IG9ialtrZXlOYW1lXTsKICAgICAgb19kZWZpbmVQcm9wZXJ0eShvYmos IGtleU5hbWUsIHsKICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAg ICAgZW51bWVyYWJsZTogb2JqLnByb3BlcnR5SXNFbnVtZXJhYmxlKGtleU5h bWUpLAogICAgICAgIHNldDogRW1iZXIuTUFOREFUT1JZX1NFVFRFUl9GVU5D VElPTiwKICAgICAgICBnZXQ6IEVtYmVyLkRFRkFVTFRfR0VUVEVSX0ZVTkNU SU9OKGtleU5hbWUpCiAgICAgIH0pOwogICAgfQogIH0gZWxzZSB7CiAgICB3 YXRjaGluZ1trZXlOYW1lXSA9ICh3YXRjaGluZ1trZXlOYW1lXSB8fCAwKSAr IDE7CiAgfQp9OwoKCkVtYmVyLnVud2F0Y2hLZXkgPSBmdW5jdGlvbihvYmos IGtleU5hbWUsIG1ldGEpIHsKICB2YXIgbSA9IG1ldGEgfHwgbWV0YUZvcihv YmopLCB3YXRjaGluZyA9IG0ud2F0Y2hpbmc7CgogIGlmICh3YXRjaGluZ1tr ZXlOYW1lXSA9PT0gMSkgewogICAgd2F0Y2hpbmdba2V5TmFtZV0gPSAwOwoK ICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2Ygb2JqLmRpZFVud2F0Y2hQ cm9wZXJ0eSkgewogICAgICBvYmouZGlkVW53YXRjaFByb3BlcnR5KGtleU5h bWUpOwogICAgfQoKICAgIGlmIChNQU5EQVRPUllfU0VUVEVSICYmIGtleU5h bWUgaW4gb2JqKSB7CiAgICAgIG9fZGVmaW5lUHJvcGVydHkob2JqLCBrZXlO YW1lLCB7CiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgIGVu dW1lcmFibGU6IG9iai5wcm9wZXJ0eUlzRW51bWVyYWJsZShrZXlOYW1lKSwK ICAgICAgICBzZXQ6IGZ1bmN0aW9uKHZhbCkgewogICAgICAgICAgLy8gcmVk ZWZpbmUgdG8gc2V0IGFzIGVudW1lcmFibGUKICAgICAgICAgIG9fZGVmaW5l UHJvcGVydHkob2JqLCBrZXlOYW1lLCB7CiAgICAgICAgICAgIGNvbmZpZ3Vy YWJsZTogdHJ1ZSwKICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsCiAgICAg ICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiB2 YWwKICAgICAgICAgIH0pOwogICAgICAgICAgZGVsZXRlIG0udmFsdWVzW2tl eU5hbWVdOwogICAgICAgIH0sCiAgICAgICAgZ2V0OiBFbWJlci5ERUZBVUxU X0dFVFRFUl9GVU5DVElPTihrZXlOYW1lKQogICAgICB9KTsKICAgIH0KICB9 IGVsc2UgaWYgKHdhdGNoaW5nW2tleU5hbWVdID4gMSkgewogICAgd2F0Y2hp bmdba2V5TmFtZV0tLTsKICB9Cn07Cgp9KSgpOwoKCgooZnVuY3Rpb24oKSB7 CnZhciBtZXRhRm9yID0gRW1iZXIubWV0YSwgLy8gdXRpbHMuanMKICAgIGdl dCA9IEVtYmVyLmdldCwgLy8gcHJvcGVydHlfZ2V0LmpzCiAgICBub3JtYWxp emVUdXBsZSA9IEVtYmVyLm5vcm1hbGl6ZVR1cGxlLCAvLyBwcm9wZXJ0eV9n ZXQuanMKICAgIGZvckVhY2ggPSBFbWJlci5BcnJheVBvbHlmaWxscy5mb3JF YWNoLCAvLyBhcnJheS5qcwogICAgd2FybiA9IEVtYmVyLndhcm4sCiAgICB3 YXRjaEtleSA9IEVtYmVyLndhdGNoS2V5LAogICAgdW53YXRjaEtleSA9IEVt YmVyLnVud2F0Y2hLZXksCiAgICBGSVJTVF9LRVkgPSAvXihbXlwuXCpdKykv LAogICAgTUVUQV9LRVkgPSBFbWJlci5NRVRBX0tFWTsKCmZ1bmN0aW9uIGZp cnN0S2V5KHBhdGgpIHsKICByZXR1cm4gcGF0aC5tYXRjaChGSVJTVF9LRVkp WzBdOwp9Cgp2YXIgcGVuZGluZ1F1ZXVlID0gW107CgovLyBhdHRlbXB0cyB0 byBhZGQgdGhlIHBlbmRpbmdRdWV1ZSBjaGFpbnMgYWdhaW4uIElmIHNvbWUg b2YgdGhlbSBlbmQgdXAKLy8gYmFjayBpbiB0aGUgcXVldWUgYW5kIHJlc2No ZWR1bGUgaXMgdHJ1ZSwgc2NoZWR1bGVzIGEgdGltZW91dCB0byB0cnkKLy8g YWdhaW4uCkVtYmVyLmZsdXNoUGVuZGluZ0NoYWlucyA9IGZ1bmN0aW9uKCkg ewogIGlmIChwZW5kaW5nUXVldWUubGVuZ3RoID09PSAwKSB7IHJldHVybjsg fSAvLyBub3RoaW5nIHRvIGRvCgogIHZhciBxdWV1ZSA9IHBlbmRpbmdRdWV1 ZTsKICBwZW5kaW5nUXVldWUgPSBbXTsKCiAgZm9yRWFjaC5jYWxsKHF1ZXVl LCBmdW5jdGlvbihxKSB7IHFbMF0uYWRkKHFbMV0pOyB9KTsKCiAgd2Fybign V2F0Y2hpbmcgYW4gdW5kZWZpbmVkIGdsb2JhbCwgRW1iZXIgZXhwZWN0cyB3 YXRjaGVkIGdsb2JhbHMgdG8gYmUgc2V0dXAgYnkgdGhlIHRpbWUgdGhlIHJ1 biBsb29wIGlzIGZsdXNoZWQsIGNoZWNrIGZvciB0eXBvcycsIHBlbmRpbmdR dWV1ZS5sZW5ndGggPT09IDApOwp9OwoKCmZ1bmN0aW9uIGFkZENoYWluV2F0 Y2hlcihvYmosIGtleU5hbWUsIG5vZGUpIHsKICBpZiAoIW9iaiB8fCAoJ29i amVjdCcgIT09IHR5cGVvZiBvYmopKSB7IHJldHVybjsgfSAvLyBub3RoaW5n IHRvIGRvCgogIHZhciBtID0gbWV0YUZvcihvYmopLCBub2RlcyA9IG0uY2hh aW5XYXRjaGVyczsKCiAgaWYgKCFtLmhhc093blByb3BlcnR5KCdjaGFpbldh dGNoZXJzJykpIHsKICAgIG5vZGVzID0gbS5jaGFpbldhdGNoZXJzID0ge307 CiAgfQoKICBpZiAoIW5vZGVzW2tleU5hbWVdKSB7IG5vZGVzW2tleU5hbWVd ID0gW107IH0KICBub2Rlc1trZXlOYW1lXS5wdXNoKG5vZGUpOwogIHdhdGNo S2V5KG9iaiwga2V5TmFtZSwgbSk7Cn0KCnZhciByZW1vdmVDaGFpbldhdGNo ZXIgPSBFbWJlci5yZW1vdmVDaGFpbldhdGNoZXIgPSBmdW5jdGlvbihvYmos IGtleU5hbWUsIG5vZGUpIHsKICBpZiAoIW9iaiB8fCAnb2JqZWN0JyAhPT0g dHlwZW9mIG9iaikgeyByZXR1cm47IH0gLy8gbm90aGluZyB0byBkbwoKICB2 YXIgbSA9IG9ialtNRVRBX0tFWV07CiAgaWYgKG0gJiYgIW0uaGFzT3duUHJv cGVydHkoJ2NoYWluV2F0Y2hlcnMnKSkgeyByZXR1cm47IH0gLy8gbm90aGlu ZyB0byBkbwoKICB2YXIgbm9kZXMgPSBtICYmIG0uY2hhaW5XYXRjaGVyczsK CiAgaWYgKG5vZGVzICYmIG5vZGVzW2tleU5hbWVdKSB7CiAgICBub2RlcyA9 IG5vZGVzW2tleU5hbWVdOwogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBub2Rl cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgaWYgKG5vZGVzW2ldID09 PSBub2RlKSB7IG5vZGVzLnNwbGljZShpLCAxKTsgfQogICAgfQogIH0KICB1 bndhdGNoS2V5KG9iaiwga2V5TmFtZSwgbSk7Cn07CgovLyBBIENoYWluTm9k ZSB3YXRjaGVzIGEgc2luZ2xlIGtleSBvbiBhbiBvYmplY3QuIElmIHlvdSBw cm92aWRlIGEgc3RhcnRpbmcKLy8gdmFsdWUgZm9yIHRoZSBrZXkgdGhlbiB0 aGUgbm9kZSB3b24ndCBhY3R1YWxseSB3YXRjaCBpdC4gRm9yIGEgcm9vdCBu b2RlCi8vIHBhc3MgbnVsbCBmb3IgcGFyZW50IGFuZCBrZXkgYW5kIG9iamVj dCBmb3IgdmFsdWUuCnZhciBDaGFpbk5vZGUgPSBFbWJlci5fQ2hhaW5Ob2Rl ID0gZnVuY3Rpb24ocGFyZW50LCBrZXksIHZhbHVlKSB7CiAgdGhpcy5fcGFy ZW50ID0gcGFyZW50OwogIHRoaXMuX2tleSAgICA9IGtleTsKCiAgLy8gX3dh dGNoaW5nIGlzIHRydWUgd2hlbiBjYWxsaW5nIGdldCh0aGlzLl9wYXJlbnQs IHRoaXMuX2tleSkgd2lsbAogIC8vIHJldHVybiB0aGUgdmFsdWUgb2YgdGhp cyBub2RlLgogIC8vCiAgLy8gSXQgaXMgZmFsc2UgZm9yIHRoZSByb290IG9m IGEgY2hhaW4gKGJlY2F1c2Ugd2UgaGF2ZSBubyBwYXJlbnQpCiAgLy8gYW5k IGZvciBnbG9iYWwgcGF0aHMgKGJlY2F1c2UgdGhlIHBhcmVudCBub2RlIGlz IHRoZSBvYmplY3Qgd2l0aAogIC8vIHRoZSBvYnNlcnZlciBvbiBpdCkKICB0 aGlzLl93YXRjaGluZyA9IHZhbHVlPT09dW5kZWZpbmVkOwoKICB0aGlzLl92 YWx1ZSAgPSB2YWx1ZTsKICB0aGlzLl9wYXRocyA9IHt9OwogIGlmICh0aGlz Ll93YXRjaGluZykgewogICAgdGhpcy5fb2JqZWN0ID0gcGFyZW50LnZhbHVl KCk7CiAgICBpZiAodGhpcy5fb2JqZWN0KSB7IGFkZENoYWluV2F0Y2hlcih0 aGlzLl9vYmplY3QsIHRoaXMuX2tleSwgdGhpcyk7IH0KICB9CgogIC8vIFNw ZWNpYWwtY2FzZTogdGhlIEVhY2hQcm94eSByZWxpZXMgb24gaW1tZWRpYXRl IGV2YWx1YXRpb24gdG8KICAvLyBlc3RhYmxpc2ggaXRzIG9ic2VydmVycy4K ICAvLwogIC8vIFRPRE86IFJlcGxhY2UgdGhpcyB3aXRoIGFuIGVmZmljaWVu dCBjYWxsYmFjayB0aGF0IHRoZSBFYWNoUHJveHkKICAvLyBjYW4gaW1wbGVt ZW50LgogIGlmICh0aGlzLl9wYXJlbnQgJiYgdGhpcy5fcGFyZW50Ll9rZXkg PT09ICdAZWFjaCcpIHsKICAgIHRoaXMudmFsdWUoKTsKICB9Cn07Cgp2YXIg Q2hhaW5Ob2RlUHJvdG90eXBlID0gQ2hhaW5Ob2RlLnByb3RvdHlwZTsKCmZ1 bmN0aW9uIGxhenlHZXQob2JqLCBrZXkpIHsKICBpZiAoIW9iaikgcmV0dXJu IHVuZGVmaW5lZDsKCiAgdmFyIG1ldGEgPSBvYmpbTUVUQV9LRVldOwogIC8v IGNoZWNrIGlmIG9iamVjdCBtZWFudCBvbmx5IHRvIGJlIGEgcHJvdG90eXBl CiAgaWYgKG1ldGEgJiYgbWV0YS5wcm90byA9PT0gb2JqKSByZXR1cm4gdW5k ZWZpbmVkOwoKICBpZiAoa2V5ID09PSAiQGVhY2giKSByZXR1cm4gZ2V0KG9i aiwga2V5KTsKCiAgLy8gaWYgYSBDUCBvbmx5IHJldHVybiBjYWNoZWQgdmFs dWUKICB2YXIgZGVzYyA9IG1ldGEgJiYgbWV0YS5kZXNjc1trZXldOwogIGlm IChkZXNjICYmIGRlc2MuX2NhY2hlYWJsZSkgewogICAgaWYgKGtleSBpbiBt ZXRhLmNhY2hlKSB7CiAgICAgIHJldHVybiBtZXRhLmNhY2hlW2tleV07CiAg ICB9IGVsc2UgewogICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgfQogIH0K CiAgcmV0dXJuIGdldChvYmosIGtleSk7Cn0KCkNoYWluTm9kZVByb3RvdHlw ZS52YWx1ZSA9IGZ1bmN0aW9uKCkgewogIGlmICh0aGlzLl92YWx1ZSA9PT0g dW5kZWZpbmVkICYmIHRoaXMuX3dhdGNoaW5nKSB7CiAgICB2YXIgb2JqID0g dGhpcy5fcGFyZW50LnZhbHVlKCk7CiAgICB0aGlzLl92YWx1ZSA9IGxhenlH ZXQob2JqLCB0aGlzLl9rZXkpOwogIH0KICByZXR1cm4gdGhpcy5fdmFsdWU7 Cn07CgpDaGFpbk5vZGVQcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkg ewogIGlmICh0aGlzLl93YXRjaGluZykgewogICAgdmFyIG9iaiA9IHRoaXMu X29iamVjdDsKICAgIGlmIChvYmopIHsgcmVtb3ZlQ2hhaW5XYXRjaGVyKG9i aiwgdGhpcy5fa2V5LCB0aGlzKTsgfQogICAgdGhpcy5fd2F0Y2hpbmcgPSBm YWxzZTsgLy8gc28gZnV0dXJlIGNhbGxzIGRvIG5vdGhpbmcKICB9Cn07Cgov LyBjb3BpZXMgYSB0b3AgbGV2ZWwgb2JqZWN0IG9ubHkKQ2hhaW5Ob2RlUHJv dG90eXBlLmNvcHkgPSBmdW5jdGlvbihvYmopIHsKICB2YXIgcmV0ID0gbmV3 IENoYWluTm9kZShudWxsLCBudWxsLCBvYmopLAogICAgICBwYXRocyA9IHRo aXMuX3BhdGhzLCBwYXRoOwogIGZvciAocGF0aCBpbiBwYXRocykgewogICAg aWYgKHBhdGhzW3BhdGhdIDw9IDApIHsgY29udGludWU7IH0gLy8gdGhpcyBj aGVjayB3aWxsIGFsc28gY2F0Y2ggbm9uLW51bWJlciB2YWxzLgogICAgcmV0 LmFkZChwYXRoKTsKICB9CiAgcmV0dXJuIHJldDsKfTsKCi8vIGNhbGxlZCBv biB0aGUgcm9vdCBub2RlIG9mIGEgY2hhaW4gdG8gc2V0dXAgd2F0Y2hlcnMg b24gdGhlIHNwZWNpZmllZAovLyBwYXRoLgpDaGFpbk5vZGVQcm90b3R5cGUu YWRkID0gZnVuY3Rpb24ocGF0aCkgewogIHZhciBvYmosIHR1cGxlLCBrZXks IHNyYywgcGF0aHM7CgogIHBhdGhzID0gdGhpcy5fcGF0aHM7CiAgcGF0aHNb cGF0aF0gPSAocGF0aHNbcGF0aF0gfHwgMCkgKyAxOwoKICBvYmogPSB0aGlz LnZhbHVlKCk7CiAgdHVwbGUgPSBub3JtYWxpemVUdXBsZShvYmosIHBhdGgp OwoKICAvLyB0aGUgcGF0aCB3YXMgYSBsb2NhbCBwYXRoCiAgaWYgKHR1cGxl WzBdICYmIHR1cGxlWzBdID09PSBvYmopIHsKICAgIHBhdGggPSB0dXBsZVsx XTsKICAgIGtleSAgPSBmaXJzdEtleShwYXRoKTsKICAgIHBhdGggPSBwYXRo LnNsaWNlKGtleS5sZW5ndGgrMSk7CgogIC8vIGdsb2JhbCBwYXRoLCBidXQg b2JqZWN0IGRvZXMgbm90IGV4aXN0IHlldC4KICAvLyBwdXQgaW50byBhIHF1 ZXVlIGFuZCB0cnkgdG8gY29ubmVjdCBsYXRlci4KICB9IGVsc2UgaWYgKCF0 dXBsZVswXSkgewogICAgcGVuZGluZ1F1ZXVlLnB1c2goW3RoaXMsIHBhdGhd KTsKICAgIHR1cGxlLmxlbmd0aCA9IDA7CiAgICByZXR1cm47CgogIC8vIGds b2JhbCBwYXRoLCBhbmQgb2JqZWN0IGFscmVhZHkgZXhpc3RzCiAgfSBlbHNl IHsKICAgIHNyYyAgPSB0dXBsZVswXTsKICAgIGtleSAgPSBwYXRoLnNsaWNl KDAsIDAtKHR1cGxlWzFdLmxlbmd0aCsxKSk7CiAgICBwYXRoID0gdHVwbGVb MV07CiAgfQoKICB0dXBsZS5sZW5ndGggPSAwOwogIHRoaXMuY2hhaW4oa2V5 LCBwYXRoLCBzcmMpOwp9OwoKLy8gY2FsbGVkIG9uIHRoZSByb290IG5vZGUg b2YgYSBjaGFpbiB0byB0ZWFyZG93biB3YXRjaGVyIG9uIHRoZSBzcGVjaWZp ZWQKLy8gcGF0aApDaGFpbk5vZGVQcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rp b24ocGF0aCkgewogIHZhciBvYmosIHR1cGxlLCBrZXksIHNyYywgcGF0aHM7 CgogIHBhdGhzID0gdGhpcy5fcGF0aHM7CiAgaWYgKHBhdGhzW3BhdGhdID4g MCkgeyBwYXRoc1twYXRoXS0tOyB9CgogIG9iaiA9IHRoaXMudmFsdWUoKTsK ICB0dXBsZSA9IG5vcm1hbGl6ZVR1cGxlKG9iaiwgcGF0aCk7CiAgaWYgKHR1 cGxlWzBdID09PSBvYmopIHsKICAgIHBhdGggPSB0dXBsZVsxXTsKICAgIGtl eSAgPSBmaXJzdEtleShwYXRoKTsKICAgIHBhdGggPSBwYXRoLnNsaWNlKGtl eS5sZW5ndGgrMSk7CiAgfSBlbHNlIHsKICAgIHNyYyAgPSB0dXBsZVswXTsK ICAgIGtleSAgPSBwYXRoLnNsaWNlKDAsIDAtKHR1cGxlWzFdLmxlbmd0aCsx KSk7CiAgICBwYXRoID0gdHVwbGVbMV07CiAgfQoKICB0dXBsZS5sZW5ndGgg PSAwOwogIHRoaXMudW5jaGFpbihrZXksIHBhdGgpOwp9OwoKQ2hhaW5Ob2Rl UHJvdG90eXBlLmNvdW50ID0gMDsKCkNoYWluTm9kZVByb3RvdHlwZS5jaGFp biA9IGZ1bmN0aW9uKGtleSwgcGF0aCwgc3JjKSB7CiAgdmFyIGNoYWlucyA9 IHRoaXMuX2NoYWlucywgbm9kZTsKICBpZiAoIWNoYWlucykgeyBjaGFpbnMg PSB0aGlzLl9jaGFpbnMgPSB7fTsgfQoKICBub2RlID0gY2hhaW5zW2tleV07 CiAgaWYgKCFub2RlKSB7IG5vZGUgPSBjaGFpbnNba2V5XSA9IG5ldyBDaGFp bk5vZGUodGhpcywga2V5LCBzcmMpOyB9CiAgbm9kZS5jb3VudCsrOyAvLyBj b3VudCBjaGFpbnMuLi4KCiAgLy8gY2hhaW4gcmVzdCBvZiBwYXRoIGlmIHRo ZXJlIGlzIG9uZQogIGlmIChwYXRoICYmIHBhdGgubGVuZ3RoPjApIHsKICAg IGtleSA9IGZpcnN0S2V5KHBhdGgpOwogICAgcGF0aCA9IHBhdGguc2xpY2Uo a2V5Lmxlbmd0aCsxKTsKICAgIG5vZGUuY2hhaW4oa2V5LCBwYXRoKTsgLy8g Tk9URTogbm8gc3JjIG1lYW5zIGl0IHdpbGwgb2JzZXJ2ZSBjaGFuZ2VzLi4u CiAgfQp9OwoKQ2hhaW5Ob2RlUHJvdG90eXBlLnVuY2hhaW4gPSBmdW5jdGlv bihrZXksIHBhdGgpIHsKICB2YXIgY2hhaW5zID0gdGhpcy5fY2hhaW5zLCBu b2RlID0gY2hhaW5zW2tleV07CgogIC8vIHVuY2hhaW4gcmVzdCBvZiBwYXRo IGZpcnN0Li4uCiAgaWYgKHBhdGggJiYgcGF0aC5sZW5ndGg+MSkgewogICAg a2V5ICA9IGZpcnN0S2V5KHBhdGgpOwogICAgcGF0aCA9IHBhdGguc2xpY2Uo a2V5Lmxlbmd0aCsxKTsKICAgIG5vZGUudW5jaGFpbihrZXksIHBhdGgpOwog IH0KCiAgLy8gZGVsZXRlIG5vZGUgaWYgbmVlZGVkLgogIG5vZGUuY291bnQt LTsKICBpZiAobm9kZS5jb3VudDw9MCkgewogICAgZGVsZXRlIGNoYWluc1tu b2RlLl9rZXldOwogICAgbm9kZS5kZXN0cm95KCk7CiAgfQoKfTsKCkNoYWlu Tm9kZVByb3RvdHlwZS53aWxsQ2hhbmdlID0gZnVuY3Rpb24oZXZlbnRzKSB7 CiAgdmFyIGNoYWlucyA9IHRoaXMuX2NoYWluczsKICBpZiAoY2hhaW5zKSB7 CiAgICBmb3IodmFyIGtleSBpbiBjaGFpbnMpIHsKICAgICAgaWYgKCFjaGFp bnMuaGFzT3duUHJvcGVydHkoa2V5KSkgeyBjb250aW51ZTsgfQogICAgICBj aGFpbnNba2V5XS53aWxsQ2hhbmdlKGV2ZW50cyk7CiAgICB9CiAgfQoKICBp ZiAodGhpcy5fcGFyZW50KSB7IHRoaXMuX3BhcmVudC5jaGFpbldpbGxDaGFu Z2UodGhpcywgdGhpcy5fa2V5LCAxLCBldmVudHMpOyB9Cn07CgpDaGFpbk5v ZGVQcm90b3R5cGUuY2hhaW5XaWxsQ2hhbmdlID0gZnVuY3Rpb24oY2hhaW4s IHBhdGgsIGRlcHRoLCBldmVudHMpIHsKICBpZiAodGhpcy5fa2V5KSB7IHBh dGggPSB0aGlzLl9rZXkgKyAnLicgKyBwYXRoOyB9CgogIGlmICh0aGlzLl9w YXJlbnQpIHsKICAgIHRoaXMuX3BhcmVudC5jaGFpbldpbGxDaGFuZ2UodGhp cywgcGF0aCwgZGVwdGgrMSwgZXZlbnRzKTsKICB9IGVsc2UgewogICAgaWYg KGRlcHRoID4gMSkgewogICAgICBldmVudHMucHVzaCh0aGlzLnZhbHVlKCks IHBhdGgpOwogICAgfQogICAgcGF0aCA9ICd0aGlzLicgKyBwYXRoOwogICAg aWYgKHRoaXMuX3BhdGhzW3BhdGhdID4gMCkgewogICAgICBldmVudHMucHVz aCh0aGlzLnZhbHVlKCksIHBhdGgpOwogICAgfQogIH0KfTsKCkNoYWluTm9k ZVByb3RvdHlwZS5jaGFpbkRpZENoYW5nZSA9IGZ1bmN0aW9uKGNoYWluLCBw YXRoLCBkZXB0aCwgZXZlbnRzKSB7CiAgaWYgKHRoaXMuX2tleSkgeyBwYXRo ID0gdGhpcy5fa2V5ICsgJy4nICsgcGF0aDsgfQogIGlmICh0aGlzLl9wYXJl bnQpIHsKICAgIHRoaXMuX3BhcmVudC5jaGFpbkRpZENoYW5nZSh0aGlzLCBw YXRoLCBkZXB0aCsxLCBldmVudHMpOwogIH0gZWxzZSB7CiAgICBpZiAoZGVw dGggPiAxKSB7CiAgICAgIGV2ZW50cy5wdXNoKHRoaXMudmFsdWUoKSwgcGF0 aCk7CiAgICB9CiAgICBwYXRoID0gJ3RoaXMuJyArIHBhdGg7CiAgICBpZiAo dGhpcy5fcGF0aHNbcGF0aF0gPiAwKSB7CiAgICAgIGV2ZW50cy5wdXNoKHRo aXMudmFsdWUoKSwgcGF0aCk7CiAgICB9CiAgfQp9OwoKQ2hhaW5Ob2RlUHJv dG90eXBlLmRpZENoYW5nZSA9IGZ1bmN0aW9uKGV2ZW50cykgewogIC8vIGlu dmFsaWRhdGUgbXkgb3duIHZhbHVlIGZpcnN0LgogIGlmICh0aGlzLl93YXRj aGluZykgewogICAgdmFyIG9iaiA9IHRoaXMuX3BhcmVudC52YWx1ZSgpOwog ICAgaWYgKG9iaiAhPT0gdGhpcy5fb2JqZWN0KSB7CiAgICAgIHJlbW92ZUNo YWluV2F0Y2hlcih0aGlzLl9vYmplY3QsIHRoaXMuX2tleSwgdGhpcyk7CiAg ICAgIHRoaXMuX29iamVjdCA9IG9iajsKICAgICAgYWRkQ2hhaW5XYXRjaGVy KG9iaiwgdGhpcy5fa2V5LCB0aGlzKTsKICAgIH0KICAgIHRoaXMuX3ZhbHVl ICA9IHVuZGVmaW5lZDsKCiAgICAvLyBTcGVjaWFsLWNhc2U6IHRoZSBFYWNo UHJveHkgcmVsaWVzIG9uIGltbWVkaWF0ZSBldmFsdWF0aW9uIHRvCiAgICAv LyBlc3RhYmxpc2ggaXRzIG9ic2VydmVycy4KICAgIGlmICh0aGlzLl9wYXJl bnQgJiYgdGhpcy5fcGFyZW50Ll9rZXkgPT09ICdAZWFjaCcpCiAgICAgIHRo aXMudmFsdWUoKTsKICB9CgogIC8vIHRoZW4gbm90aWZ5IGNoYWlucy4uLgog IHZhciBjaGFpbnMgPSB0aGlzLl9jaGFpbnM7CiAgaWYgKGNoYWlucykgewog ICAgZm9yKHZhciBrZXkgaW4gY2hhaW5zKSB7CiAgICAgIGlmICghY2hhaW5z Lmhhc093blByb3BlcnR5KGtleSkpIHsgY29udGludWU7IH0KICAgICAgY2hh aW5zW2tleV0uZGlkQ2hhbmdlKGV2ZW50cyk7CiAgICB9CiAgfQoKICAvLyBp ZiBubyBldmVudHMgYXJlIHBhc3NlZCBpbiB0aGVuIHdlIG9ubHkgY2FyZSBh Ym91dCB0aGUgYWJvdmUgd2lyaW5nIHVwZGF0ZQogIGlmIChldmVudHMgPT09 IG51bGwpIHsgcmV0dXJuOyB9CgogIC8vIGFuZCBmaW5hbGx5IHRlbGwgcGFy ZW50IGFib3V0IG15IHBhdGggY2hhbmdpbmcuLi4KICBpZiAodGhpcy5fcGFy ZW50KSB7IHRoaXMuX3BhcmVudC5jaGFpbkRpZENoYW5nZSh0aGlzLCB0aGlz Ll9rZXksIDEsIGV2ZW50cyk7IH0KfTsKCkVtYmVyLmZpbmlzaENoYWlucyA9 IGZ1bmN0aW9uKG9iaikgewogIC8vIFdlIG9ubHkgY3JlYXRlIG1ldGEgaWYg d2UgcmVhbGx5IGhhdmUgdG8KICB2YXIgbSA9IG9ialtNRVRBX0tFWV0sIGNo YWlucyA9IG0gJiYgbS5jaGFpbnM7CiAgaWYgKGNoYWlucykgewogICAgaWYg KGNoYWlucy52YWx1ZSgpICE9PSBvYmopIHsKICAgICAgbWV0YUZvcihvYmop LmNoYWlucyA9IGNoYWlucyA9IGNoYWlucy5jb3B5KG9iaik7CiAgICB9IGVs c2UgewogICAgICBjaGFpbnMuZGlkQ2hhbmdlKG51bGwpOwogICAgfQogIH0K fTsKCn0pKCk7CgoKCihmdW5jdGlvbigpIHsKLyoqCiAgQG1vZHVsZSBlbWJl ci1tZXRhbAogICovCgp2YXIgZm9yRWFjaCA9IEVtYmVyLkVudW1lcmFibGVV dGlscy5mb3JFYWNoLApCUkFDRV9FWFBBTlNJT04gPSAvXigoPzpbXlwuXSpc LikqKVx7KC4qKVx9JC87CgovKioKICBFeHBhbmRzIGBwYXR0ZXJuYCwgaW52 b2tpbmcgYGNhbGxiYWNrYCBmb3IgZWFjaCBleHBhbnNpb24uCgogIFRoZSBv bmx5IHBhdHRlcm4gc3VwcG9ydGVkIGlzIGJyYWNlLWV4cGFuc2lvbiwgYW55 dGhpbmcgZWxzZSB3aWxsIGJlIHBhc3NlZAogIG9uY2UgdG8gYGNhbGxiYWNr YCBkaXJlY3RseS4gQnJhY2UgZXhwYW5zaW9uIGNhbiBvbmx5IGFwcGVhciBh dCB0aGUgZW5kIG9mIGEKICBwYXR0ZXJuLCBmb3IgZXhhbXBsZSBhcyB0aGUg bGFzdCBpdGVtIGluIGEgY2hhaW4uCgogIEV4YW1wbGUKICBgYGBqcwogIGZ1 bmN0aW9uIGVjaG8oYXJnKXsgY29uc29sZS5sb2coYXJnKTsgfQoKICBFbWJl ci5leHBhbmRQcm9wZXJ0aWVzKCdmb28uYmFyJywgZWNobyk7ICAgICAgICAv Lz0+ICdmb28uYmFyJwogIEVtYmVyLmV4cGFuZFByb3BlcnRpZXMoJ3tmb28s YmFyfScsIGVjaG8pOyAgICAgIC8vPT4gJ2ZvbycsICdiYXInCiAgRW1iZXIu ZXhwYW5kUHJvcGVydGllcygnZm9vLntiYXIsYmF6fScsIGVjaG8pOyAgLy89 PiAnZm9vLmJhcicsICdmb28uYmF6JwogIEVtYmVyLmV4cGFuZFByb3BlcnRp ZXMoJ3tmb28sYmFyfS5iYXonLCBlY2hvKTsgIC8vPT4gJ3tmb28sYmFyfS5i YXonCiAgYGBgCgogIEBtZXRob2QKICBAcHJpdmF0ZQogIEBwYXJhbSB7c3Ry aW5nfSBwYXR0ZXJuIFRoZSBwcm9wZXJ0eSBwYXR0ZXJuIHRvIGV4cGFuZC4K ICBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8g aW52b2tlLiAgSXQgaXMgaW52b2tlZCBvbmNlIHBlcgogIGV4cGFuc2lvbiwg YW5kIGlzIHBhc3NlZCB0aGUgZXhwYW5zaW9uLgogICovCkVtYmVyLmV4cGFu ZFByb3BlcnRpZXMgPSBmdW5jdGlvbiAocGF0dGVybiwgY2FsbGJhY2spIHsK ICB2YXIgbWF0Y2gsIHByZWZpeCwgbGlzdDsKCiAgaWYgKG1hdGNoID0gQlJB Q0VfRVhQQU5TSU9OLmV4ZWMocGF0dGVybikpIHsKICAgIHByZWZpeCA9IG1h dGNoWzFdOwogICAgbGlzdCA9IG1hdGNoWzJdOwoKICAgIGZvckVhY2gobGlz dC5zcGxpdCgnLCcpLCBmdW5jdGlvbiAoc3VmZml4KSB7CiAgICAgIGNhbGxi YWNrKHByZWZpeCArIHN1ZmZpeCk7CiAgICB9KTsKICB9IGVsc2UgewogICAg Y2FsbGJhY2socGF0dGVybik7CiAgfQp9OwoKfSkoKTsKCgoKKGZ1bmN0aW9u KCkgewp2YXIgbWV0YUZvciA9IEVtYmVyLm1ldGEsIC8vIHV0aWxzLmpzCiAg ICB0eXBlT2YgPSBFbWJlci50eXBlT2YsIC8vIHV0aWxzLmpzCiAgICBDaGFp bk5vZGUgPSBFbWJlci5fQ2hhaW5Ob2RlOyAvLyBjaGFpbnMuanMKCi8vIGdl dCB0aGUgY2hhaW5zIGZvciB0aGUgY3VycmVudCBvYmplY3QuIElmIHRoZSBj dXJyZW50IG9iamVjdCBoYXMKLy8gY2hhaW5zIGluaGVyaXRlZCBmcm9tIHRo ZSBwcm90byB0aGV5IHdpbGwgYmUgY2xvbmVkIGFuZCByZWNvbmZpZ3VyZWQg Zm9yCi8vIHRoZSBjdXJyZW50IG9iamVjdC4KZnVuY3Rpb24gY2hhaW5zRm9y KG9iaiwgbWV0YSkgewogIHZhciBtID0gbWV0YSB8fCBtZXRhRm9yKG9iaiks IHJldCA9IG0uY2hhaW5zOwogIGlmICghcmV0KSB7CiAgICByZXQgPSBtLmNo YWlucyA9IG5ldyBDaGFpbk5vZGUobnVsbCwgbnVsbCwgb2JqKTsKICB9IGVs c2UgaWYgKHJldC52YWx1ZSgpICE9PSBvYmopIHsKICAgIHJldCA9IG0uY2hh aW5zID0gcmV0LmNvcHkob2JqKTsKICB9CiAgcmV0dXJuIHJldDsKfQoKRW1i ZXIud2F0Y2hQYXRoID0gZnVuY3Rpb24ob2JqLCBrZXlQYXRoLCBtZXRhKSB7 CiAgLy8gY2FuJ3Qgd2F0Y2ggbGVuZ3RoIG9uIEFycmF5IC0gaXQgaXMgc3Bl Y2lhbC4uLgogIGlmIChrZXlQYXRoID09PSAnbGVuZ3RoJyAmJiB0eXBlT2Yo b2JqKSA9PT0gJ2FycmF5JykgeyByZXR1cm47IH0KCiAgdmFyIG0gPSBtZXRh IHx8IG1ldGFGb3Iob2JqKSwgd2F0Y2hpbmcgPSBtLndhdGNoaW5nOwoKICBp ZiAoIXdhdGNoaW5nW2tleVBhdGhdKSB7IC8vIGFjdGl2YXRlIHdhdGNoaW5n IGZpcnN0IHRpbWUKICAgIHdhdGNoaW5nW2tleVBhdGhdID0gMTsKICAgIGNo YWluc0ZvcihvYmosIG0pLmFkZChrZXlQYXRoKTsKICB9IGVsc2UgewogICAg d2F0Y2hpbmdba2V5UGF0aF0gPSAod2F0Y2hpbmdba2V5UGF0aF0gfHwgMCkg KyAxOwogIH0KfTsKCkVtYmVyLnVud2F0Y2hQYXRoID0gZnVuY3Rpb24ob2Jq LCBrZXlQYXRoLCBtZXRhKSB7CiAgdmFyIG0gPSBtZXRhIHx8IG1ldGFGb3Io b2JqKSwgd2F0Y2hpbmcgPSBtLndhdGNoaW5nOwoKICBpZiAod2F0Y2hpbmdb a2V5UGF0aF0gPT09IDEpIHsKICAgIHdhdGNoaW5nW2tleVBhdGhdID0gMDsK ICAgIGNoYWluc0ZvcihvYmosIG0pLnJlbW92ZShrZXlQYXRoKTsKICB9IGVs c2UgaWYgKHdhdGNoaW5nW2tleVBhdGhdID4gMSkgewogICAgd2F0Y2hpbmdb a2V5UGF0aF0tLTsKICB9Cn07Cn0pKCk7CgoKCihmdW5jdGlvbigpIHsKLyoq CkBtb2R1bGUgZW1iZXItbWV0YWwKKi8KCnZhciBtZXRhRm9yID0gRW1iZXIu bWV0YSwgLy8gdXRpbHMuanMKICAgIEdVSURfS0VZID0gRW1iZXIuR1VJRF9L RVksIC8vIHV0aWxzLmpzCiAgICBNRVRBX0tFWSA9IEVtYmVyLk1FVEFfS0VZ LCAvLyB1dGlscy5qcwogICAgcmVtb3ZlQ2hhaW5XYXRjaGVyID0gRW1iZXIu cmVtb3ZlQ2hhaW5XYXRjaGVyLAogICAgd2F0Y2hLZXkgPSBFbWJlci53YXRj aEtleSwgLy8gd2F0Y2hfa2V5LmpzCiAgICB1bndhdGNoS2V5ID0gRW1iZXIu dW53YXRjaEtleSwKICAgIHdhdGNoUGF0aCA9IEVtYmVyLndhdGNoUGF0aCwg Ly8gd2F0Y2hfcGF0aC5qcwogICAgdW53YXRjaFBhdGggPSBFbWJlci51bndh dGNoUGF0aCwKICAgIHR5cGVPZiA9IEVtYmVyLnR5cGVPZiwgLy8gdXRpbHMu anMKICAgIGdlbmVyYXRlR3VpZCA9IEVtYmVyLmdlbmVyYXRlR3VpZCwKICAg IElTX1BBVEggPSAvW1wuXCpdLzsKCi8vIHJldHVybnMgdHJ1ZSBpZiB0aGUg cGFzc2VkIHBhdGggaXMganVzdCBhIGtleU5hbWUKZnVuY3Rpb24gaXNLZXlO YW1lKHBhdGgpIHsKICByZXR1cm4gcGF0aD09PScqJyB8fCAhSVNfUEFUSC50 ZXN0KHBhdGgpOwp9CgovKioKICBTdGFydHMgd2F0Y2hpbmcgYSBwcm9wZXJ0 eSBvbiBhbiBvYmplY3QuIFdoZW5ldmVyIHRoZSBwcm9wZXJ0eSBjaGFuZ2Vz LAogIGludm9rZXMgYEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZWAgYW5kIGBF bWJlci5wcm9wZXJ0eURpZENoYW5nZWAuIFRoaXMgaXMgdGhlCiAgcHJpbWl0 aXZlIHVzZWQgYnkgb2JzZXJ2ZXJzIGFuZCBkZXBlbmRlbnQga2V5czsgdXN1 YWxseSB5b3Ugd2lsbCBuZXZlciBjYWxsCiAgdGhpcyBtZXRob2QgZGlyZWN0 bHkgYnV0IGluc3RlYWQgdXNlIGhpZ2hlciBsZXZlbCBtZXRob2RzIGxpa2UK ICBgRW1iZXIuYWRkT2JzZXJ2ZXIoKWAKCiAgQHByaXZhdGUKICBAbWV0aG9k IHdhdGNoCiAgQGZvciBFbWJlcgogIEBwYXJhbSBvYmoKICBAcGFyYW0ge1N0 cmluZ30ga2V5TmFtZQoqLwpFbWJlci53YXRjaCA9IGZ1bmN0aW9uKG9iaiwg X2tleVBhdGgsIG0pIHsKICAvLyBjYW4ndCB3YXRjaCBsZW5ndGggb24gQXJy YXkgLSBpdCBpcyBzcGVjaWFsLi4uCiAgaWYgKF9rZXlQYXRoID09PSAnbGVu Z3RoJyAmJiB0eXBlT2Yob2JqKSA9PT0gJ2FycmF5JykgeyByZXR1cm47IH0K CiAgaWYgKGlzS2V5TmFtZShfa2V5UGF0aCkpIHsKICAgIHdhdGNoS2V5KG9i aiwgX2tleVBhdGgsIG0pOwogIH0gZWxzZSB7CiAgICB3YXRjaFBhdGgob2Jq LCBfa2V5UGF0aCwgbSk7CiAgfQp9OwoKRW1iZXIuaXNXYXRjaGluZyA9IGZ1 bmN0aW9uIGlzV2F0Y2hpbmcob2JqLCBrZXkpIHsKICB2YXIgbWV0YSA9IG9i altNRVRBX0tFWV07CiAgcmV0dXJuIChtZXRhICYmIG1ldGEud2F0Y2hpbmdb a2V5XSkgPiAwOwp9OwoKRW1iZXIud2F0Y2guZmx1c2hQZW5kaW5nID0gRW1i ZXIuZmx1c2hQZW5kaW5nQ2hhaW5zOwoKRW1iZXIudW53YXRjaCA9IGZ1bmN0 aW9uKG9iaiwgX2tleVBhdGgsIG0pIHsKICAvLyBjYW4ndCB3YXRjaCBsZW5n dGggb24gQXJyYXkgLSBpdCBpcyBzcGVjaWFsLi4uCiAgaWYgKF9rZXlQYXRo ID09PSAnbGVuZ3RoJyAmJiB0eXBlT2Yob2JqKSA9PT0gJ2FycmF5JykgeyBy ZXR1cm47IH0KCiAgaWYgKGlzS2V5TmFtZShfa2V5UGF0aCkpIHsKICAgIHVu d2F0Y2hLZXkob2JqLCBfa2V5UGF0aCwgbSk7CiAgfSBlbHNlIHsKICAgIHVu d2F0Y2hQYXRoKG9iaiwgX2tleVBhdGgsIG0pOwogIH0KfTsKCi8qKgogIENh bGwgb24gYW4gb2JqZWN0IHdoZW4geW91IGZpcnN0IGJlZ2V0IGl0IGZyb20g YW5vdGhlciBvYmplY3QuIFRoaXMgd2lsbAogIHNldHVwIGFueSBjaGFpbmVk IHdhdGNoZXJzIG9uIHRoZSBvYmplY3QgaW5zdGFuY2UgYXMgbmVlZGVkLiBU aGlzIG1ldGhvZCBpcwogIHNhZmUgdG8gY2FsbCBtdWx0aXBsZSB0aW1lcy4K CiAgQHByaXZhdGUKICBAbWV0aG9kIHJld2F0Y2gKICBAZm9yIEVtYmVyCiAg QHBhcmFtIG9iagoqLwpFbWJlci5yZXdhdGNoID0gZnVuY3Rpb24ob2JqKSB7 CiAgdmFyIG0gPSBvYmpbTUVUQV9LRVldLCBjaGFpbnMgPSBtICYmIG0uY2hh aW5zOwoKICAvLyBtYWtlIHN1cmUgdGhlIG9iamVjdCBoYXMgaXRzIG93biBn dWlkLgogIGlmIChHVUlEX0tFWSBpbiBvYmogJiYgIW9iai5oYXNPd25Qcm9w ZXJ0eShHVUlEX0tFWSkpIHsKICAgIGdlbmVyYXRlR3VpZChvYmopOwogIH0K CiAgLy8gbWFrZSBzdXJlIGFueSBjaGFpbmVkIHdhdGNoZXJzIHVwZGF0ZS4K ICBpZiAoY2hhaW5zICYmIGNoYWlucy52YWx1ZSgpICE9PSBvYmopIHsKICAg IG0uY2hhaW5zID0gY2hhaW5zLmNvcHkob2JqKTsKICB9Cn07Cgp2YXIgTk9E RV9TVEFDSyA9IFtdOwoKLyoqCiAgVGVhcnMgZG93biB0aGUgbWV0YSBvbiBh biBvYmplY3Qgc28gdGhhdCBpdCBjYW4gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQu CiAgTXVsdGlwbGUgY2FsbHMgd2lsbCBoYXZlIG5vIGVmZmVjdC4KCiAgQG1l dGhvZCBkZXN0cm95CiAgQGZvciBFbWJlcgogIEBwYXJhbSB7T2JqZWN0fSBv YmogIHRoZSBvYmplY3QgdG8gZGVzdHJveQogIEByZXR1cm4ge3ZvaWR9Ciov CkVtYmVyLmRlc3Ryb3kgPSBmdW5jdGlvbiAob2JqKSB7CiAgdmFyIG1ldGEg PSBvYmpbTUVUQV9LRVldLCBub2RlLCBub2Rlcywga2V5LCBub2RlT2JqZWN0 OwogIGlmIChtZXRhKSB7CiAgICBvYmpbTUVUQV9LRVldID0gbnVsbDsKICAg IC8vIHJlbW92ZSBjaGFpbldhdGNoZXJzIHRvIHJlbW92ZSBjaXJjdWxhciBy ZWZlcmVuY2VzIHRoYXQgd291bGQgcHJldmVudCBHQwogICAgbm9kZSA9IG1l dGEuY2hhaW5zOwogICAgaWYgKG5vZGUpIHsKICAgICAgTk9ERV9TVEFDSy5w dXNoKG5vZGUpOwogICAgICAvLyBwcm9jZXNzIHRyZWUKICAgICAgd2hpbGUg KE5PREVfU1RBQ0subGVuZ3RoID4gMCkgewogICAgICAgIG5vZGUgPSBOT0RF X1NUQUNLLnBvcCgpOwogICAgICAgIC8vIHB1c2ggY2hpbGRyZW4KICAgICAg ICBub2RlcyA9IG5vZGUuX2NoYWluczsKICAgICAgICBpZiAobm9kZXMpIHsK ICAgICAgICAgIGZvciAoa2V5IGluIG5vZGVzKSB7CiAgICAgICAgICAgIGlm IChub2Rlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAg Tk9ERV9TVEFDSy5wdXNoKG5vZGVzW2tleV0pOwogICAgICAgICAgICB9CiAg ICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIHJlbW92ZSBjaGFpbldh dGNoZXIgaW4gbm9kZSBvYmplY3QKICAgICAgICBpZiAobm9kZS5fd2F0Y2hp bmcpIHsKICAgICAgICAgIG5vZGVPYmplY3QgPSBub2RlLl9vYmplY3Q7CiAg ICAgICAgICBpZiAobm9kZU9iamVjdCkgewogICAgICAgICAgICByZW1vdmVD aGFpbldhdGNoZXIobm9kZU9iamVjdCwgbm9kZS5fa2V5LCBub2RlKTsKICAg ICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn07Cgp9KSgp OwoKCgooZnVuY3Rpb24oKSB7Ci8qKgpAbW9kdWxlIGVtYmVyLW1ldGFsCiov CgpFbWJlci53YXJuKCJUaGUgQ1BfREVGQVVMVF9DQUNIRUFCTEUgZmxhZyBo YXMgYmVlbiByZW1vdmVkIGFuZCBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSBh bHdheXMgY2FjaGVkIGJ5IGRlZmF1bHQuIFVzZSBgdm9sYXRpbGVgIGlmIHlv dSBkb24ndCB3YW50IGNhY2hpbmcuIiwgRW1iZXIuRU5WLkNQX0RFRkFVTFRf Q0FDSEVBQkxFICE9PSBmYWxzZSk7CgoKdmFyIGdldCA9IEVtYmVyLmdldCwK ICAgIHNldCA9IEVtYmVyLnNldCwKICAgIG1ldGFGb3IgPSBFbWJlci5tZXRh LAogICAgYV9zbGljZSA9IFtdLnNsaWNlLAogICAgb19jcmVhdGUgPSBFbWJl ci5jcmVhdGUsCiAgICBNRVRBX0tFWSA9IEVtYmVyLk1FVEFfS0VZLAogICAg d2F0Y2ggPSBFbWJlci53YXRjaCwKICAgIHVud2F0Y2ggPSBFbWJlci51bndh dGNoOwoKdmFyIGV4cGFuZFByb3BlcnRpZXMgPSBFbWJlci5leHBhbmRQcm9w ZXJ0aWVzOwoKaWYgKEVtYmVyLkZFQVRVUkVTLmlzRW5hYmxlZCgnZW1iZXIt bWV0YWwtY29tcHV0ZWQtZW1wdHktYXJyYXknKSkgewogIHZhciBsZW5ndGhQ YXR0ZXJuID0gL1wuKGxlbmd0aHxcW1xdKSQvOwp9CgovLyAuLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uCi8vIERFUEVOREVOVCBLRVlTCi8vCgovLyBkYXRhIHN0cnVjdHVyZToK Ly8gIG1ldGEuZGVwcyA9IHsKLy8gICAnZGVwS2V5JzogewovLyAgICAgJ2tl eU5hbWUnOiBjb3VudCwKLy8gICB9Ci8vICB9CgovKgogIFRoaXMgZnVuY3Rp b24gcmV0dXJucyBhIG1hcCBvZiB1bmlxdWUgZGVwZW5kZW5jaWVzIGZvciBh CiAgZ2l2ZW4gb2JqZWN0IGFuZCBrZXkuCiovCmZ1bmN0aW9uIGtleXNGb3JE ZXAoZGVwc01ldGEsIGRlcEtleSkgewogIHZhciBrZXlzID0gZGVwc01ldGFb ZGVwS2V5XTsKICBpZiAoIWtleXMpIHsKICAgIC8vIGlmIHRoZXJlIGFyZSBu byBkZXBlbmRlbmNpZXMgeWV0IGZvciBhIHRoZSBnaXZlbiBrZXkKICAgIC8v IGNyZWF0ZSBhIG5ldyBlbXB0eSBsaXN0IG9mIGRlcGVuZGVuY2llcyBmb3Ig dGhlIGtleQogICAga2V5cyA9IGRlcHNNZXRhW2RlcEtleV0gPSB7fTsKICB9 IGVsc2UgaWYgKCFkZXBzTWV0YS5oYXNPd25Qcm9wZXJ0eShkZXBLZXkpKSB7 CiAgICAvLyBvdGhlcndpc2UgaWYgdGhlIGRlcGVuZGVuY3kgbGlzdCBpcyBp bmhlcml0ZWQgZnJvbQogICAgLy8gYSBzdXBlcmNsYXNzLCBjbG9uZSB0aGUg aGFzaAogICAga2V5cyA9IGRlcHNNZXRhW2RlcEtleV0gPSBvX2NyZWF0ZShr ZXlzKTsKICB9CiAgcmV0dXJuIGtleXM7Cn0KCmZ1bmN0aW9uIG1ldGFGb3JE ZXBzKG1ldGEpIHsKICByZXR1cm4ga2V5c0ZvckRlcChtZXRhLCAnZGVwcycp Owp9CgpmdW5jdGlvbiBhZGREZXBlbmRlbnRLZXlzKGRlc2MsIG9iaiwga2V5 TmFtZSwgbWV0YSkgewogIC8vIHRoZSBkZXNjcmlwdG9yIGhhcyBhIGxpc3Qg b2YgZGVwZW5kZW50IGtleXMsIHNvCiAgLy8gYWRkIGFsbCBvZiBpdHMgZGVw ZW5kZW50IGtleXMuCiAgdmFyIGRlcEtleXMgPSBkZXNjLl9kZXBlbmRlbnRL ZXlzLCBkZXBzTWV0YSwgaWR4LCBsZW4sIGRlcEtleSwga2V5czsKICBpZiAo IWRlcEtleXMpIHJldHVybjsKCiAgZGVwc01ldGEgPSBtZXRhRm9yRGVwcyht ZXRhKTsKCiAgZm9yKGlkeCA9IDAsIGxlbiA9IGRlcEtleXMubGVuZ3RoOyBp ZHggPCBsZW47IGlkeCsrKSB7CiAgICBkZXBLZXkgPSBkZXBLZXlzW2lkeF07 CiAgICAvLyBMb29rdXAga2V5cyBtZXRhIGZvciBkZXBLZXkKICAgIGtleXMg PSBrZXlzRm9yRGVwKGRlcHNNZXRhLCBkZXBLZXkpOwogICAgLy8gSW5jcmVt ZW50IHRoZSBudW1iZXIgb2YgdGltZXMgZGVwS2V5IGRlcGVuZHMgb24ga2V5 TmFtZS4KICAgIGtleXNba2V5TmFtZV0gPSAoa2V5c1trZXlOYW1lXSB8fCAw KSArIDE7CiAgICAvLyBXYXRjaCB0aGUgZGVwS2V5CiAgICB3YXRjaChvYmos IGRlcEtleSwgbWV0YSk7CiAgfQp9CgpmdW5jdGlvbiByZW1vdmVEZXBlbmRl bnRLZXlzKGRlc2MsIG9iaiwga2V5TmFtZSwgbWV0YSkgewogIC8vIHRoZSBk ZXNjcmlwdG9yIGhhcyBhIGxpc3Qgb2YgZGVwZW5kZW50IGtleXMsIHNvCiAg Ly8gYWRkIGFsbCBvZiBpdHMgZGVwZW5kZW50IGtleXMuCiAgdmFyIGRlcEtl eXMgPSBkZXNjLl9kZXBlbmRlbnRLZXlzLCBkZXBzTWV0YSwgaWR4LCBsZW4s IGRlcEtleSwga2V5czsKICBpZiAoIWRlcEtleXMpIHJldHVybjsKCiAgZGVw c01ldGEgPSBtZXRhRm9yRGVwcyhtZXRhKTsKCiAgZm9yKGlkeCA9IDAsIGxl biA9IGRlcEtleXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7CiAgICBk ZXBLZXkgPSBkZXBLZXlzW2lkeF07CiAgICAvLyBMb29rdXAga2V5cyBtZXRh IGZvciBkZXBLZXkKICAgIGtleXMgPSBrZXlzRm9yRGVwKGRlcHNNZXRhLCBk ZXBLZXkpOwogICAgLy8gSW5jcmVtZW50IHRoZSBudW1iZXIgb2YgdGltZXMg ZGVwS2V5IGRlcGVuZHMgb24ga2V5TmFtZS4KICAgIGtleXNba2V5TmFtZV0g PSAoa2V5c1trZXlOYW1lXSB8fCAwKSAtIDE7CiAgICAvLyBXYXRjaCB0aGUg ZGVwS2V5CiAgICB1bndhdGNoKG9iaiwgZGVwS2V5LCBtZXRhKTsKICB9Cn0K Ci8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4KLy8gQ09NUFVURUQgUFJPUEVSVFkKLy8KCi8q KgogIEEgY29tcHV0ZWQgcHJvcGVydHkgdHJhbnNmb3JtcyBhbiBvYmplY3Rz IGZ1bmN0aW9uIGludG8gYSBwcm9wZXJ0eS4KCiAgQnkgZGVmYXVsdCB0aGUg ZnVuY3Rpb24gYmFja2luZyB0aGUgY29tcHV0ZWQgcHJvcGVydHkgd2lsbCBv bmx5IGJlIGNhbGxlZAogIG9uY2UgYW5kIHRoZSByZXN1bHQgd2lsbCBiZSBj YWNoZWQuIFlvdSBjYW4gc3BlY2lmeSB2YXJpb3VzIHByb3BlcnRpZXMKICB0 aGF0IHlvdXIgY29tcHV0ZWQgcHJvcGVydHkgaXMgZGVwZW5kZW50IG9uLiBU aGlzIHdpbGwgZm9yY2UgdGhlIGNhY2hlZAogIHJlc3VsdCB0byBiZSByZWNv bXB1dGVkIGlmIHRoZSBkZXBlbmRlbmNpZXMgYXJlIG1vZGlmaWVkLgoKICBJ biB0aGUgZm9sbG93aW5nIGV4YW1wbGUgd2UgZGVjbGFyZSBhIGNvbXB1dGVk IHByb3BlcnR5IChieSBjYWxsaW5nCiAgYC5wcm9wZXJ0eSgpYCBvbiB0aGUg ZnVsbE5hbWUgZnVuY3Rpb24pIGFuZCBzZXR1cCB0aGUgcHJvcGVydGllcwog IGRlcGVuZGVuY2llcyAoZGVwZW5kaW5nIG9uIGZpcnN0TmFtZSBhbmQgbGFz dE5hbWUpLiBUaGUgZnVsbE5hbWUgZnVuY3Rpb24KICB3aWxsIGJlIGNhbGxl ZCBvbmNlIChyZWdhcmRsZXNzIG9mIGhvdyBtYW55IHRpbWVzIGl0IGlzIGFj Y2Vzc2VkKSBhcyBsb25nCiAgYXMgaXQncyBkZXBlbmRlbmNpZXMgaGF2ZSBu b3QgYmVlbiBjaGFuZ2VkLiBPbmNlIGZpcnN0TmFtZSBvciBsYXN0TmFtZSBh cmUgdXBkYXRlZAogIGFueSBmdXR1cmUgY2FsbHMgKG9yIGFueXRoaW5nIGJv dW5kKSB0byBmdWxsTmFtZSB3aWxsIGluY29ycG9yYXRlIHRoZSBuZXcKICB2 YWx1ZXMuCgogIGBgYGphdmFzY3JpcHQKICBQZXJzb24gPSBFbWJlci5PYmpl Y3QuZXh0ZW5kKHsKICAgIC8vIHRoZXNlIHdpbGwgYmUgc3VwcGxpZWQgYnkg YGNyZWF0ZWAKICAgIGZpcnN0TmFtZTogbnVsbCwKICAgIGxhc3ROYW1lOiBu dWxsLAoKICAgIGZ1bGxOYW1lOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIGZp cnN0TmFtZSA9IHRoaXMuZ2V0KCdmaXJzdE5hbWUnKTsKICAgICAgdmFyIGxh c3ROYW1lID0gdGhpcy5nZXQoJ2xhc3ROYW1lJyk7CgogICAgIHJldHVybiBm aXJzdE5hbWUgKyAnICcgKyBsYXN0TmFtZTsKICAgIH0ucHJvcGVydHkoJ2Zp cnN0TmFtZScsICdsYXN0TmFtZScpCiAgfSk7CgogIHZhciB0b20gPSBQZXJz b24uY3JlYXRlKHsKICAgIGZpcnN0TmFtZTogIlRvbSIsCiAgICBsYXN0TmFt ZTogIkRhbGUiCiAgfSk7CgogIHRvbS5nZXQoJ2Z1bGxOYW1lJykgLy8gIlRv bSBEYWxlIgogIGBgYAoKICBZb3UgY2FuIGFsc28gZGVmaW5lIHdoYXQgRW1i ZXIgc2hvdWxkIGRvIHdoZW4gc2V0dGluZyBhIGNvbXB1dGVkIHByb3BlcnR5 LgogIElmIHlvdSB0cnkgdG8gc2V0IGEgY29tcHV0ZWQgcHJvcGVydHksIGl0 IHdpbGwgYmUgaW52b2tlZCB3aXRoIHRoZSBrZXkgYW5kCiAgdmFsdWUgeW91 IHdhbnQgdG8gc2V0IGl0IHRvLiBZb3UgY2FuIGFsc28gYWNjZXB0IHRoZSBw cmV2aW91cyB2YWx1ZSBhcyB0aGUKICB0aGlyZCBwYXJhbWV0ZXIuCgogIGBg YGphdmFzY3JpcHQKCiBQZXJzb24gPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsK ICAgIC8vIHRoZXNlIHdpbGwgYmUgc3VwcGxpZWQgYnkgYGNyZWF0ZWAKICAg IGZpcnN0TmFtZTogbnVsbCwKICAgIGxhc3ROYW1lOiBudWxsLAoKICAgIGZ1 bGxOYW1lOiBmdW5jdGlvbihrZXksIHZhbHVlLCBvbGRWYWx1ZSkgewogICAg ICAvLyBnZXR0ZXIKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEp IHsKICAgICAgICB2YXIgZmlyc3ROYW1lID0gdGhpcy5nZXQoJ2ZpcnN0TmFt ZScpOwogICAgICAgIHZhciBsYXN0TmFtZSA9IHRoaXMuZ2V0KCdsYXN0TmFt ZScpOwoKICAgICAgICByZXR1cm4gZmlyc3ROYW1lICsgJyAnICsgbGFzdE5h bWU7CgogICAgICAvLyBzZXR0ZXIKICAgICAgfSBlbHNlIHsKICAgICAgICB2 YXIgbmFtZSA9IHZhbHVlLnNwbGl0KCIgIik7CgogICAgICAgIHRoaXMuc2V0 KCdmaXJzdE5hbWUnLCBuYW1lWzBdKTsKICAgICAgICB0aGlzLnNldCgnbGFz dE5hbWUnLCBuYW1lWzFdKTsKCiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAg ICB9CiAgICB9LnByb3BlcnR5KCdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnKQog IH0pOwoKICB2YXIgcGVyc29uID0gUGVyc29uLmNyZWF0ZSgpOwogIHBlcnNv bi5zZXQoJ2Z1bGxOYW1lJywgIlBldGVyIFdhZ2VuZXQiKTsKICBwZXJzb24u Z2V0KCdmaXJzdE5hbWUnKSAvLyBQZXRlcgogIHBlcnNvbi5nZXQoJ2xhc3RO YW1lJykgLy8gV2FnZW5ldAogIGBgYAoKICBAY2xhc3MgQ29tcHV0ZWRQcm9w ZXJ0eQogIEBuYW1lc3BhY2UgRW1iZXIKICBAZXh0ZW5kcyBFbWJlci5EZXNj cmlwdG9yCiAgQGNvbnN0cnVjdG9yCiovCmZ1bmN0aW9uIENvbXB1dGVkUHJv cGVydHkoZnVuYywgb3B0cykgewogIHRoaXMuZnVuYyA9IGZ1bmM7CiAgaWYg KEVtYmVyLkZFQVRVUkVTLmlzRW5hYmxlZCgnY29tcG9zYWJsZS1jb21wdXRl ZC1wcm9wZXJ0aWVzJykpIHsKICAgIHNldERlcGVuZGVudEtleXModGhpcywg b3B0cyAmJiBvcHRzLmRlcGVuZGVudEtleXMpOwogIH0gZWxzZSB7CiAgICB0 aGlzLl9kZXBlbmRlbnRLZXlzID0gb3B0cyAmJiBvcHRzLmRlcGVuZGVudEtl eXM7CiAgfQoKICB0aGlzLl9jYWNoZWFibGUgPSAob3B0cyAmJiBvcHRzLmNh Y2hlYWJsZSAhPT0gdW5kZWZpbmVkKSA/IG9wdHMuY2FjaGVhYmxlIDogdHJ1 ZTsKICB0aGlzLl9yZWFkT25seSA9IG9wdHMgJiYgKG9wdHMucmVhZE9ubHkg IT09IHVuZGVmaW5lZCB8fCAhIW9wdHMucmVhZE9ubHkpOwp9CgpFbWJlci5D b21wdXRlZFByb3BlcnR5ID0gQ29tcHV0ZWRQcm9wZXJ0eTsKCkNvbXB1dGVk UHJvcGVydHkucHJvdG90eXBlID0gbmV3IEVtYmVyLkRlc2NyaXB0b3IoKTsK CnZhciBDb21wdXRlZFByb3BlcnR5UHJvdG90eXBlID0gQ29tcHV0ZWRQcm9w ZXJ0eS5wcm90b3R5cGU7CkNvbXB1dGVkUHJvcGVydHlQcm90b3R5cGUuX2Rl cGVuZGVudEtleXMgPSB1bmRlZmluZWQ7CkNvbXB1dGVkUHJvcGVydHlQcm90 b3R5cGUuX3N1c3BlbmRlZCA9IHVuZGVmaW5lZDsKQ29tcHV0ZWRQcm9wZXJ0 eVByb3RvdHlwZS5fbWV0YSA9IHVuZGVmaW5lZDsKCmlmIChFbWJlci5GRUFU VVJFUy5pc0VuYWJsZWQoJ2NvbXBvc2FibGUtY29tcHV0ZWQtcHJvcGVydGll cycpKSB7CiAgQ29tcHV0ZWRQcm9wZXJ0eVByb3RvdHlwZS5fZGVwZW5kZW50 Q1BzID0gdW5kZWZpbmVkOwogIENvbXB1dGVkUHJvcGVydHlQcm90b3R5cGUu aW1wbGljaXRDUEtleSA9IHVuZGVmaW5lZDsKCiAgQ29tcHV0ZWRQcm9wZXJ0 eVByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHRo aXMuaW1wbGljaXRDUEtleSkgewogICAgICByZXR1cm4gdGhpcy5pbXBsaWNp dENQS2V5OwogICAgfQogICAgcmV0dXJuIEVtYmVyLkRlc2NyaXB0b3IucHJv dG90eXBlLnRvU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfTsK fQoKLyoqCiAgUHJvcGVydGllcyBhcmUgY2FjaGVhYmxlIGJ5IGRlZmF1bHQu IENvbXB1dGVkIHByb3BlcnR5IHdpbGwgYXV0b21hdGljYWxseQogIGNhY2hl IHRoZSByZXR1cm4gdmFsdWUgb2YgeW91ciBmdW5jdGlvbiB1bnRpbCBvbmUg b2YgdGhlIGRlcGVuZGVudCBrZXlzIGNoYW5nZXMuCgogIENhbGwgYHZvbGF0 aWxlKClgIHRvIHNldCBpdCBpbnRvIG5vbi1jYWNoZWQgbW9kZS4gV2hlbiBp biB0aGlzIG1vZGUKICB0aGUgY29tcHV0ZWQgcHJvcGVydHkgd2lsbCBub3Qg YXV0b21hdGljYWxseSBjYWNoZSB0aGUgcmV0dXJuIHZhbHVlLgoKICBIb3dl dmVyLCBpZiBhIHByb3BlcnR5IGlzIHByb3Blcmx5IG9ic2VydmFibGUsIHRo ZXJlIGlzIG5vIHJlYXNvbiB0byBkaXNhYmxlCiAgY2FjaGluZy4KCiAgQG1l dGhvZCBjYWNoZWFibGUKICBAcGFyYW0ge0Jvb2xlYW59IGFGbGFnIG9wdGlv bmFsIHNldCB0byBgZmFsc2VgIHRvIGRpc2FibGUgY2FjaGluZwogIEByZXR1 cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IHRoaXMKICBAY2hhaW5hYmxl CiovCkNvbXB1dGVkUHJvcGVydHlQcm90b3R5cGUuY2FjaGVhYmxlID0gZnVu Y3Rpb24oYUZsYWcpIHsKICB0aGlzLl9jYWNoZWFibGUgPSBhRmxhZyAhPT0g ZmFsc2U7CiAgcmV0dXJuIHRoaXM7Cn07CgovKioKICBDYWxsIG9uIGEgY29t cHV0ZWQgcHJvcGVydHkgdG8gc2V0IGl0IGludG8gbm9uLWNhY2hlZCBtb2Rl LiBXaGVuIGluIHRoaXMKICBtb2RlIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSB3 aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGNhY2hlIHRoZSByZXR1cm4gdmFsdWUu CgogIGBgYGphdmFzY3JpcHQKICBNeUFwcC5vdXRzaWRlU2VydmljZSA9IEVt YmVyLk9iamVjdC5leHRlbmQoewogICAgdmFsdWU6IGZ1bmN0aW9uKCkgewog ICAgICByZXR1cm4gT3V0c2lkZVNlcnZpY2UuZ2V0VmFsdWUoKTsKICAgIH0u cHJvcGVydHkoKS52b2xhdGlsZSgpCiAgfSkuY3JlYXRlKCk7CiAgYGBgCgog IEBtZXRob2Qgdm9sYXRpbGUKICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFBy b3BlcnR5fSB0aGlzCiAgQGNoYWluYWJsZQoqLwpDb21wdXRlZFByb3BlcnR5 UHJvdG90eXBlLnZvbGF0aWxlID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIHRo aXMuY2FjaGVhYmxlKGZhbHNlKTsKfTsKCi8qKgogIENhbGwgb24gYSBjb21w dXRlZCBwcm9wZXJ0eSB0byBzZXQgaXQgaW50byByZWFkLW9ubHkgbW9kZS4g V2hlbiBpbiB0aGlzCiAgbW9kZSB0aGUgY29tcHV0ZWQgcHJvcGVydHkgd2ls bCB0aHJvdyBhbiBlcnJvciB3aGVuIHNldC4KCiAgYGBgamF2YXNjcmlwdAog IE15QXBwLlBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoewogICAgZ3Vp ZDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiAnZ3VpZC1ndWlkLWd1aWQn OwogICAgfS5wcm9wZXJ0eSgpLnJlYWRPbmx5KCkKICB9KTsKCiAgTXlBcHAu cGVyc29uID0gTXlBcHAuUGVyc29uLmNyZWF0ZSgpOwoKICBNeUFwcC5wZXJz b24uc2V0KCdndWlkJywgJ25ldy1ndWlkJyk7IC8vIHdpbGwgdGhyb3cgYW4g ZXhjZXB0aW9uCiAgYGBgCgogIEBtZXRob2QgcmVhZE9ubHkKICBAcmV0dXJu IHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSB0aGlzCiAgQGNoYWluYWJsZQoq LwpDb21wdXRlZFByb3BlcnR5UHJvdG90eXBlLnJlYWRPbmx5ID0gZnVuY3Rp b24ocmVhZE9ubHkpIHsKICB0aGlzLl9yZWFkT25seSA9IHJlYWRPbmx5ID09 PSB1bmRlZmluZWQgfHwgISFyZWFkT25seTsKICByZXR1cm4gdGhpczsKfTsK Ci8qKgogIFNldHMgdGhlIGRlcGVuZGVudCBrZXlzIG9uIHRoaXMgY29tcHV0 ZWQgcHJvcGVydHkuIFBhc3MgYW55IG51bWJlciBvZgogIGFyZ3VtZW50cyBj b250YWluaW5nIGtleSBwYXRocyB0aGF0IHRoaXMgY29tcHV0ZWQgcHJvcGVy dHkgZGVwZW5kcyBvbi4KCiAgYGBgamF2YXNjcmlwdAogIE15QXBwLlByZXNp ZGVudCA9IEVtYmVyLk9iamVjdC5leHRlbmQoewogICAgZnVsbE5hbWU6IEVt YmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5n ZXQoJ2ZpcnN0TmFtZScpICsgJyAnICsgdGhpcy5nZXQoJ2xhc3ROYW1lJyk7 CgogICAgICAvLyBUZWxsIEVtYmVyIHRoYXQgdGhpcyBjb21wdXRlZCBwcm9w ZXJ0eSBkZXBlbmRzIG9uIGZpcnN0TmFtZQogICAgICAvLyBhbmQgbGFzdE5h bWUKICAgIH0pLnByb3BlcnR5KCdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnKQog IH0pOwoKICBNeUFwcC5wcmVzaWRlbnQgPSBNeUFwcC5QcmVzaWRlbnQuY3Jl YXRlKHsKICAgIGZpcnN0TmFtZTogJ0JhcmFjaycsCiAgICBsYXN0TmFtZTog J09iYW1hJywKICB9KTsKICBNeUFwcC5wcmVzaWRlbnQuZ2V0KCdmdWxsTmFt ZScpOyAvLyBCYXJhY2sgT2JhbWEKICBgYGAKCiAgQG1ldGhvZCBwcm9wZXJ0 eQogIEBwYXJhbSB7U3RyaW5nfSBwYXRoKiB6ZXJvIG9yIG1vcmUgcHJvcGVy dHkgcGF0aHMKICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSB0 aGlzCiAgQGNoYWluYWJsZQoqLwpDb21wdXRlZFByb3BlcnR5UHJvdG90eXBl LnByb3BlcnR5ID0gZnVuY3Rpb24oKSB7CiAgdmFyIGFyZ3M7CgogIHZhciBh ZGRBcmcgPSBmdW5jdGlvbiAocHJvcGVydHkpIHsKICAgIGFyZ3MucHVzaChw cm9wZXJ0eSk7CiAgfTsKCiAgYXJncyA9IFtdOwogIGZvciAodmFyIGkgPSAw LCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgZXhw YW5kUHJvcGVydGllcyhhcmd1bWVudHNbaV0sIGFkZEFyZyk7CiAgfQoKICBp ZiAoRW1iZXIuRkVBVFVSRVMuaXNFbmFibGVkKCdjb21wb3NhYmxlLWNvbXB1 dGVkLXByb3BlcnRpZXMnKSkgewogICAgc2V0RGVwZW5kZW50S2V5cyh0aGlz LCBhcmdzKTsKICB9IGVsc2UgewogICAgdGhpcy5fZGVwZW5kZW50S2V5cyA9 IGFyZ3M7CiAgfQoKICByZXR1cm4gdGhpczsKfTsKCi8qKgogIEluIHNvbWUg Y2FzZXMsIHlvdSBtYXkgd2FudCB0byBhbm5vdGF0ZSBjb21wdXRlZCBwcm9w ZXJ0aWVzIHdpdGggYWRkaXRpb25hbAogIG1ldGFkYXRhIGFib3V0IGhvdyB0 aGV5IGZ1bmN0aW9uIG9yIHdoYXQgdmFsdWVzIHRoZXkgb3BlcmF0ZSBvbi4g Rm9yIGV4YW1wbGUsCiAgY29tcHV0ZWQgcHJvcGVydHkgZnVuY3Rpb25zIG1h eSBjbG9zZSBvdmVyIHZhcmlhYmxlcyB0aGF0IGFyZSB0aGVuIG5vIGxvbmdl cgogIGF2YWlsYWJsZSBmb3IgaW50cm9zcGVjdGlvbi4KCiAgWW91IGNhbiBw YXNzIGEgaGFzaCBvZiB0aGVzZSB2YWx1ZXMgdG8gYSBjb21wdXRlZCBwcm9w ZXJ0eSBsaWtlIHRoaXM6CgogIGBgYAogIHBlcnNvbjogZnVuY3Rpb24oKSB7 CiAgICB2YXIgcGVyc29uSWQgPSB0aGlzLmdldCgncGVyc29uSWQnKTsKICAg IHJldHVybiBBcHAuUGVyc29uLmNyZWF0ZSh7IGlkOiBwZXJzb25JZCB9KTsK ICB9LnByb3BlcnR5KCkubWV0YSh7IHR5cGU6IEFwcC5QZXJzb24gfSkKICBg YGAKCiAgVGhlIGhhc2ggdGhhdCB5b3UgcGFzcyB0byB0aGUgYG1ldGEoKWAg ZnVuY3Rpb24gd2lsbCBiZSBzYXZlZCBvbiB0aGUKICBjb21wdXRlZCBwcm9w ZXJ0eSBkZXNjcmlwdG9yIHVuZGVyIHRoZSBgX21ldGFgIGtleS4gRW1iZXIg cnVudGltZQogIGV4cG9zZXMgYSBwdWJsaWMgQVBJIGZvciByZXRyaWV2aW5n IHRoZXNlIHZhbHVlcyBmcm9tIGNsYXNzZXMsCiAgdmlhIHRoZSBgbWV0YUZv clByb3BlcnR5KClgIGZ1bmN0aW9uLgoKICBAbWV0aG9kIG1ldGEKICBAcGFy YW0ge0hhc2h9IG1ldGEKICBAY2hhaW5hYmxlCiovCgpDb21wdXRlZFByb3Bl cnR5UHJvdG90eXBlLm1ldGEgPSBmdW5jdGlvbihtZXRhKSB7CiAgaWYgKGFy Z3VtZW50cy5sZW5ndGggPT09IDApIHsKICAgIHJldHVybiB0aGlzLl9tZXRh IHx8IHt9OwogIH0gZWxzZSB7CiAgICB0aGlzLl9tZXRhID0gbWV0YTsKICAg IHJldHVybiB0aGlzOwogIH0KfTsKCi8qIGltcGwgZGVzY3JpcHRvciBBUEkg Ki8KQ29tcHV0ZWRQcm9wZXJ0eVByb3RvdHlwZS5kaWRDaGFuZ2UgPSBmdW5j dGlvbihvYmosIGtleU5hbWUpIHsKICAvLyBfc3VzcGVuZGVkIGlzIHNldCB2 aWEgYSBDUC5zZXQgdG8gZW5zdXJlIHdlIGRvbid0IGNsZWFyCiAgLy8gdGhl IGNhY2hlZCB2YWx1ZSBzZXQgYnkgdGhlIHNldHRlcgogIGlmICh0aGlzLl9j YWNoZWFibGUgJiYgdGhpcy5fc3VzcGVuZGVkICE9PSBvYmopIHsKICAgIHZh ciBtZXRhID0gbWV0YUZvcihvYmopOwogICAgaWYgKGtleU5hbWUgaW4gbWV0 YS5jYWNoZSkgewogICAgICBkZWxldGUgbWV0YS5jYWNoZVtrZXlOYW1lXTsK ICAgICAgcmVtb3ZlRGVwZW5kZW50S2V5cyh0aGlzLCBvYmosIGtleU5hbWUs IG1ldGEpOwogICAgfQogIH0KfTsKCmZ1bmN0aW9uIGZpbmlzaENoYWlucyhj aGFpbk5vZGVzKQp7CiAgZm9yICh2YXIgaT0wLCBsPWNoYWluTm9kZXMubGVu Z3RoOyBpPGw7IGkrKykgewogICAgY2hhaW5Ob2Rlc1tpXS5kaWRDaGFuZ2Uo bnVsbCk7CiAgfQp9CgovKioKICBBY2Nlc3MgdGhlIHZhbHVlIG9mIHRoZSBm dW5jdGlvbiBiYWNraW5nIHRoZSBjb21wdXRlZCBwcm9wZXJ0eS4KICBJZiB0 aGlzIHByb3BlcnR5IGhhcyBhbHJlYWR5IGJlZW4gY2FjaGVkLCByZXR1cm4g dGhlIGNhY2hlZCByZXN1bHQuCiAgT3RoZXJ3aXNlLCBjYWxsIHRoZSBmdW5j dGlvbiBwYXNzaW5nIHRoZSBwcm9wZXJ0eSBuYW1lIGFzIGFuIGFyZ3VtZW50 LgoKICBgYGBqYXZhc2NyaXB0CiAgUGVyc29uID0gRW1iZXIuT2JqZWN0LmV4 dGVuZCh7CiAgICBmdWxsTmFtZTogZnVuY3Rpb24oa2V5TmFtZSkgewogICAg ICAvLyB0aGUga2V5TmFtZSBwYXJhbWV0ZXIgaXMgJ2Z1bGxOYW1lJyBpbiB0 aGlzIGNhc2UuCgogICAgICByZXR1cm4gdGhpcy5nZXQoJ2ZpcnN0TmFtZScp ICsgJyAnICsgdGhpcy5nZXQoJ2xhc3ROYW1lJyk7CiAgICB9LnByb3BlcnR5 KCdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnKQogIH0pOwoKCiAgdmFyIHRvbSA9 IFBlcnNvbi5jcmVhdGUoewogICAgZmlyc3ROYW1lOiAiVG9tIiwKICAgIGxh c3ROYW1lOiAiRGFsZSIKICB9KTsKCiAgdG9tLmdldCgnZnVsbE5hbWUnKSAv LyAiVG9tIERhbGUiCiAgYGBgCgogIEBtZXRob2QgZ2V0CiAgQHBhcmFtIHtT dHJpbmd9IGtleU5hbWUgVGhlIGtleSBiZWluZyBhY2Nlc3NlZC4KICBAcmV0 dXJuIHtPYmplY3R9IFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9u IGJhY2tpbmcgdGhlIENQLgoqLwpDb21wdXRlZFByb3BlcnR5UHJvdG90eXBl LmdldCA9IGZ1bmN0aW9uKG9iaiwga2V5TmFtZSkgewogIHZhciByZXQsIGNh Y2hlLCBtZXRhLCBjaGFpbk5vZGVzOwogIGlmICh0aGlzLl9jYWNoZWFibGUp IHsKICAgIG1ldGEgPSBtZXRhRm9yKG9iaik7CiAgICBjYWNoZSA9IG1ldGEu Y2FjaGU7CiAgICBpZiAoa2V5TmFtZSBpbiBjYWNoZSkgeyByZXR1cm4gY2Fj aGVba2V5TmFtZV07IH0KICAgIHJldCA9IGNhY2hlW2tleU5hbWVdID0gdGhp cy5mdW5jLmNhbGwob2JqLCBrZXlOYW1lKTsKICAgIGNoYWluTm9kZXMgPSBt ZXRhLmNoYWluV2F0Y2hlcnMgJiYgbWV0YS5jaGFpbldhdGNoZXJzW2tleU5h bWVdOwogICAgaWYgKGNoYWluTm9kZXMpIHsgZmluaXNoQ2hhaW5zKGNoYWlu Tm9kZXMpOyB9CiAgICBhZGREZXBlbmRlbnRLZXlzKHRoaXMsIG9iaiwga2V5 TmFtZSwgbWV0YSk7CiAgfSBlbHNlIHsKICAgIHJldCA9IHRoaXMuZnVuYy5j YWxsKG9iaiwga2V5TmFtZSk7CiAgfQogIHJldHVybiByZXQ7Cn07CgovKioK ICBTZXQgdGhlIHZhbHVlIG9mIGEgY29tcHV0ZWQgcHJvcGVydHkuIElmIHRo ZSBmdW5jdGlvbiB0aGF0IGJhY2tzIHlvdXIKICBjb21wdXRlZCBwcm9wZXJ0 eSBkb2VzIG5vdCBhY2NlcHQgYXJndW1lbnRzIHRoZW4gdGhlIGRlZmF1bHQg YWN0aW9uIGZvcgogIHNldHRpbmcgd291bGQgYmUgdG8gZGVmaW5lIHRoZSBw cm9wZXJ0eSBvbiB0aGUgY3VycmVudCBvYmplY3QsIGFuZCBzZXQKICB0aGUg dmFsdWUgb2YgdGhlIHByb3BlcnR5IHRvIHRoZSB2YWx1ZSBiZWluZyBzZXQu CgogIEdlbmVyYWxseSBzcGVha2luZyBpZiB5b3UgaW50ZW5kIGZvciB5b3Vy IGNvbXB1dGVkIHByb3BlcnR5IHRvIGJlIHNldAogIHlvdXIgYmFja2luZyBm dW5jdGlvbiBzaG91bGQgYWNjZXB0IGVpdGhlciB0d28gb3IgdGhyZWUgYXJn dW1lbnRzLgoKICBAbWV0aG9kIHNldAogIEBwYXJhbSB7U3RyaW5nfSBrZXlO YW1lIFRoZSBrZXkgYmVpbmcgYWNjZXNzZWQuCiAgQHBhcmFtIHtPYmplY3R9 IG5ld1ZhbHVlIFRoZSBuZXcgdmFsdWUgYmVpbmcgYXNzaWduZWQuCiAgQHBh cmFtIHtTdHJpbmd9IG9sZFZhbHVlIFRoZSBvbGQgdmFsdWUgYmVpbmcgcmVw bGFjZWQuCiAgQHJldHVybiB7T2JqZWN0fSBUaGUgcmV0dXJuIHZhbHVlIG9m IHRoZSBmdW5jdGlvbiBiYWNraW5nIHRoZSBDUC4KKi8KQ29tcHV0ZWRQcm9w ZXJ0eVByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbihvYmosIGtleU5hbWUsIHZh bHVlKSB7CiAgdmFyIGNhY2hlYWJsZSA9IHRoaXMuX2NhY2hlYWJsZSwKICAg ICAgZnVuYyA9IHRoaXMuZnVuYywKICAgICAgbWV0YSA9IG1ldGFGb3Iob2Jq LCBjYWNoZWFibGUpLAogICAgICB3YXRjaGVkID0gbWV0YS53YXRjaGluZ1tr ZXlOYW1lXSwKICAgICAgb2xkU3VzcGVuZGVkID0gdGhpcy5fc3VzcGVuZGVk LAogICAgICBoYWRDYWNoZWRWYWx1ZSA9IGZhbHNlLAogICAgICBjYWNoZSA9 IG1ldGEuY2FjaGUsCiAgICAgIGZ1bmNBcmdMZW5ndGgsIGNhY2hlZFZhbHVl LCByZXQ7CgogIGlmICh0aGlzLl9yZWFkT25seSkgewogICAgdGhyb3cgbmV3 IEVtYmVyLkVycm9yKCdDYW5ub3Qgc2V0IHJlYWQtb25seSBwcm9wZXJ0eSAi JyArIGtleU5hbWUgKyAnIiBvbiBvYmplY3Q6ICcgKyBFbWJlci5pbnNwZWN0 KG9iaikpOwogIH0KCiAgdGhpcy5fc3VzcGVuZGVkID0gb2JqOwoKICB0cnkg ewoKICAgIGlmIChjYWNoZWFibGUgJiYgY2FjaGUuaGFzT3duUHJvcGVydHko a2V5TmFtZSkpIHsKICAgICAgY2FjaGVkVmFsdWUgPSBjYWNoZVtrZXlOYW1l XTsKICAgICAgaGFkQ2FjaGVkVmFsdWUgPSB0cnVlOwogICAgfQoKICAgIC8v IENoZWNrIGlmIHRoZSBDUCBoYXMgYmVlbiB3cmFwcGVkLiBJZiBpZiBoYXMs IHVzZSB0aGUKICAgIC8vIGxlbmd0aCBmcm9tIHRoZSB3cmFwcGVkIGZ1bmN0 aW9uLgogICAgZnVuY0FyZ0xlbmd0aCA9IChmdW5jLndyYXBwZWRGdW5jdGlv biA/IGZ1bmMud3JhcHBlZEZ1bmN0aW9uLmxlbmd0aCA6IGZ1bmMubGVuZ3Ro KTsKCiAgICAvLyBGb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgd2l0aCBj b21wdXRlZCBwcm9wZXJ0aWVzCiAgICAvLyB0aGF0IGNoZWNrIGZvciBhcmd1 bWVudHMubGVuZ3RoID09PSAyIHRvIGRldGVybWluZSBpZgogICAgLy8gdGhl eSBhcmUgYmVpbmcgZ2V0IG9yIHNldCwgb25seSBwYXNzIHRoZSBvbGQgY2Fj aGVkCiAgICAvLyB2YWx1ZSBpZiB0aGUgY29tcHV0ZWQgcHJvcGVydHkgb3B0 cyBpbnRvIGEgdGhpcmQKICAgIC8vIGFyZ3VtZW50LgogICAgaWYgKGZ1bmNB cmdMZW5ndGggPT09IDMpIHsKICAgICAgcmV0ID0gZnVuYy5jYWxsKG9iaiwg a2V5TmFtZSwgdmFsdWUsIGNhY2hlZFZhbHVlKTsKICAgIH0gZWxzZSBpZiAo ZnVuY0FyZ0xlbmd0aCA9PT0gMikgewogICAgICByZXQgPSBmdW5jLmNhbGwo b2JqLCBrZXlOYW1lLCB2YWx1ZSk7CiAgICB9IGVsc2UgewogICAgICBFbWJl ci5kZWZpbmVQcm9wZXJ0eShvYmosIGtleU5hbWUsIG51bGwsIGNhY2hlZFZh bHVlKTsKICAgICAgRW1iZXIuc2V0KG9iaiwga2V5TmFtZSwgdmFsdWUpOwog ICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKGhhZENhY2hlZFZhbHVlICYm IGNhY2hlZFZhbHVlID09PSByZXQpIHsgcmV0dXJuOyB9CgogICAgaWYgKHdh dGNoZWQpIHsgRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKG9iaiwga2V5TmFt ZSk7IH0KCiAgICBpZiAoaGFkQ2FjaGVkVmFsdWUpIHsKICAgICAgZGVsZXRl IGNhY2hlW2tleU5hbWVdOwogICAgfQoKICAgIGlmIChjYWNoZWFibGUpIHsK ICAgICAgaWYgKCFoYWRDYWNoZWRWYWx1ZSkgewogICAgICAgIGFkZERlcGVu ZGVudEtleXModGhpcywgb2JqLCBrZXlOYW1lLCBtZXRhKTsKICAgICAgfQog ICAgICBjYWNoZVtrZXlOYW1lXSA9IHJldDsKICAgIH0KCiAgICBpZiAod2F0 Y2hlZCkgeyBFbWJlci5wcm9wZXJ0eURpZENoYW5nZShvYmosIGtleU5hbWUp OyB9CiAgfSBmaW5hbGx5IHsKICAgIHRoaXMuX3N1c3BlbmRlZCA9IG9sZFN1 c3BlbmRlZDsKICB9CiAgcmV0dXJuIHJldDsKfTsKCi8qIGNhbGxlZCBiZWZv cmUgcHJvcGVydHkgaXMgb3ZlcnJpZGRlbiAqLwpDb21wdXRlZFByb3BlcnR5 UHJvdG90eXBlLnRlYXJkb3duID0gZnVuY3Rpb24ob2JqLCBrZXlOYW1lKSB7 CiAgdmFyIG1ldGEgPSBtZXRhRm9yKG9iaik7CgogIGlmIChrZXlOYW1lIGlu IG1ldGEuY2FjaGUpIHsKICAgIHJlbW92ZURlcGVuZGVudEtleXModGhpcywg b2JqLCBrZXlOYW1lLCBtZXRhKTsKICB9CgogIGlmICh0aGlzLl9jYWNoZWFi bGUpIHsgZGVsZXRlIG1ldGEuY2FjaGVba2V5TmFtZV07IH0KCiAgcmV0dXJu IG51bGw7IC8vIG5vIHZhbHVlIHRvIHJlc3RvcmUKfTsKCgovKioKICBUaGlz IGhlbHBlciByZXR1cm5zIGEgbmV3IHByb3BlcnR5IGRlc2NyaXB0b3IgdGhh dCB3cmFwcyB0aGUgcGFzc2VkCiAgY29tcHV0ZWQgcHJvcGVydHkgZnVuY3Rp b24uIFlvdSBjYW4gdXNlIHRoaXMgaGVscGVyIHRvIGRlZmluZSBwcm9wZXJ0 aWVzCiAgd2l0aCBtaXhpbnMgb3IgdmlhIGBFbWJlci5kZWZpbmVQcm9wZXJ0 eSgpYC4KCiAgVGhlIGZ1bmN0aW9uIHlvdSBwYXNzIHdpbGwgYmUgdXNlZCB0 byBib3RoIGdldCBhbmQgc2V0IHByb3BlcnR5IHZhbHVlcy4KICBUaGUgZnVu Y3Rpb24gc2hvdWxkIGFjY2VwdCB0d28gcGFyYW1ldGVycywga2V5IGFuZCB2 YWx1ZS4gSWYgdmFsdWUgaXMgbm90CiAgdW5kZWZpbmVkIHlvdSBzaG91bGQg c2V0IHRoZSB2YWx1ZSBmaXJzdC4gSW4gZWl0aGVyIGNhc2UgcmV0dXJuIHRo ZQogIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgogIEBtZXRob2Qg Y29tcHV0ZWQKICBAZm9yIEVtYmVyCiAgQHBhcmFtIHtGdW5jdGlvbn0gZnVu YyBUaGUgY29tcHV0ZWQgcHJvcGVydHkgZnVuY3Rpb24uCiAgQHJldHVybiB7 RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gcHJvcGVydHkgZGVzY3JpcHRvciBp bnN0YW5jZQoqLwpFbWJlci5jb21wdXRlZCA9IGZ1bmN0aW9uKGZ1bmMpIHsK ICB2YXIgYXJnczsKCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7CiAg ICBhcmdzID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cywgMCwgLTEpOwogICAg ZnVuYyA9IGFfc2xpY2UuY2FsbChhcmd1bWVudHMsIC0xKVswXTsKICB9Cgog IGlmICh0eXBlb2YgZnVuYyAhPT0gImZ1bmN0aW9uIikgewogICAgdGhyb3cg bmV3IEVtYmVyLkVycm9yKCJDb21wdXRlZCBQcm9wZXJ0eSBkZWNsYXJlZCB3 aXRob3V0IGEgcHJvcGVydHkgZnVuY3Rpb24iKTsKICB9CgogIHZhciBjcCA9 IG5ldyBDb21wdXRlZFByb3BlcnR5KGZ1bmMpOwoKICBpZiAoYXJncykgewog ICAgY3AucHJvcGVydHkuYXBwbHkoY3AsIGFyZ3MpOwogIH0KCiAgcmV0dXJu IGNwOwp9OwoKLyoqCiAgUmV0dXJucyB0aGUgY2FjaGVkIHZhbHVlIGZvciBh IHByb3BlcnR5LCBpZiBvbmUgZXhpc3RzLgogIFRoaXMgY2FuIGJlIHVzZWZ1 bCBmb3IgcGVla2luZyBhdCB0aGUgdmFsdWUgb2YgYSBjb21wdXRlZAogIHBy b3BlcnR5IHRoYXQgaXMgZ2VuZXJhdGVkIGxhemlseSwgd2l0aG91dCBhY2Np ZGVudGFsbHkgY2F1c2luZwogIGl0IHRvIGJlIGNyZWF0ZWQuCgogIEBtZXRo b2QgY2FjaGVGb3IKICBAZm9yIEVtYmVyCiAgQHBhcmFtIHtPYmplY3R9IG9i aiB0aGUgb2JqZWN0IHdob3NlIHByb3BlcnR5IHlvdSB3YW50IHRvIGNoZWNr CiAgQHBhcmFtIHtTdHJpbmd9IGtleSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVy dHkgd2hvc2UgY2FjaGVkIHZhbHVlIHlvdSB3YW50CiAgICB0byByZXR1cm4K ICBAcmV0dXJuIHtPYmplY3R9IHRoZSBjYWNoZWQgdmFsdWUKKi8KRW1iZXIu Y2FjaGVGb3IgPSBmdW5jdGlvbiBjYWNoZUZvcihvYmosIGtleSkgewogIHZh ciBtZXRhID0gb2JqW01FVEFfS0VZXSwKICAgICAgY2FjaGUgPSBtZXRhICYm IG1ldGEuY2FjaGU7CgogIGlmIChjYWNoZSAmJiBrZXkgaW4gY2FjaGUpIHsK ICAgIHJldHVybiBjYWNoZVtrZXldOwogIH0KfTsKCmZ1bmN0aW9uIGdldFBy b3BlcnRpZXMoc2VsZiwgcHJvcGVydHlOYW1lcykgewogIHZhciByZXQgPSB7 fTsKICBmb3IodmFyIGkgPSAwOyBpIDwgcHJvcGVydHlOYW1lcy5sZW5ndGg7 IGkrKykgewogICAgcmV0W3Byb3BlcnR5TmFtZXNbaV1dID0gZ2V0KHNlbGYs IHByb3BlcnR5TmFtZXNbaV0pOwogIH0KICByZXR1cm4gcmV0Owp9Cgp2YXIg cmVnaXN0ZXJDb21wdXRlZCwgcmVnaXN0ZXJDb21wdXRlZFdpdGhQcm9wZXJ0 aWVzOwoKaWYgKEVtYmVyLkZFQVRVUkVTLmlzRW5hYmxlZCgnY29tcG9zYWJs ZS1jb21wdXRlZC1wcm9wZXJ0aWVzJykpIHsKICB2YXIgZ3VpZEZvciA9IEVt YmVyLmd1aWRGb3IsCiAgICAgIG1hcCA9IEVtYmVyLkVudW1lcmFibGVVdGls cy5tYXAsCiAgICAgIGZpbHRlciA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5m aWx0ZXIsCiAgICAgIHR5cGVPZiA9IEVtYmVyLnR5cGVPZjsKCiAgdmFyIGlt cGxpY2l0S2V5ID0gZnVuY3Rpb24gKGNwKSB7CiAgICByZXR1cm4gW2d1aWRG b3IoY3ApXS5jb25jYXQoY3AuX2RlcGVuZGVudEtleXMpLmpvaW4oJ18nKS5y ZXBsYWNlKC9cLi9nLCAnX0RPVF8nKTsKICB9OwoKICB2YXIgbm9ybWFsaXpl RGVwZW5kZW50S2V5ID0gZnVuY3Rpb24gKGtleSkgewogICAgaWYgKGtleSBp bnN0YW5jZW9mIEVtYmVyLkNvbXB1dGVkUHJvcGVydHkpIHsKICAgICAgcmV0 dXJuIGltcGxpY2l0S2V5KGtleSk7CiAgICB9IGVsc2UgewogICAgICByZXR1 cm4ga2V5OwogICAgfQogIH07CgogIHZhciBub3JtYWxpemVEZXBlbmRlbnRL ZXlzID0gZnVuY3Rpb24gKGtleXMpIHsKICAgIHJldHVybiBtYXAoa2V5cywg ZnVuY3Rpb24gKGtleSkgewogICAgICByZXR1cm4gbm9ybWFsaXplRGVwZW5k ZW50S2V5KGtleSk7CiAgICB9KTsKICB9OwoKICB2YXIgc2VsZWN0RGVwZW5k ZW50Q1BzID0gZnVuY3Rpb24gKGtleXMpIHsKICAgIHJldHVybiBmaWx0ZXIo a2V5cywgZnVuY3Rpb24gKGtleSkgewogICAgICByZXR1cm4ga2V5IGluc3Rh bmNlb2YgRW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eTsKICAgIH0pOwogIH07Cgog IHZhciBzZXREZXBlbmRlbnRLZXlzID0gZnVuY3Rpb24oY3AsIGRlcGVuZGVu dEtleXMpIHsKICAgIGlmIChkZXBlbmRlbnRLZXlzKSB7CiAgICAgIGNwLl9k ZXBlbmRlbnRLZXlzID0gbm9ybWFsaXplRGVwZW5kZW50S2V5cyhkZXBlbmRl bnRLZXlzKTsKICAgICAgY3AuX2RlcGVuZGVudENQcyA9IHNlbGVjdERlcGVu ZGVudENQcyhkZXBlbmRlbnRLZXlzKTsKICAgIH0gZWxzZSB7CiAgICAgIGNw Ll9kZXBlbmRlbnRLZXlzID0gY3AuX2RlcGVuZGVudENQcyA9IFtdOwogICAg fQogICAgY3AuaW1wbGljaXRDUEtleSA9IGltcGxpY2l0S2V5KGNwKTsKICB9 OwogIC8vIGV4cG9zZSBgbm9ybWFsaXplRGVwZW5kZW50S2V5W3NdYCBzbyB1 c2VyIENQIG1hY3JvcyBjYW4gZWFzaWx5IHN1cHBvcnQKICAvLyBjb21wb3Np dGlvbgogIEVtYmVyLmNvbXB1dGVkLm5vcm1hbGl6ZURlcGVuZGVudEtleSA9 IG5vcm1hbGl6ZURlcGVuZGVudEtleTsKICBFbWJlci5jb21wdXRlZC5ub3Jt YWxpemVEZXBlbmRlbnRLZXlzID0gbm9ybWFsaXplRGVwZW5kZW50S2V5czsK CiAgcmVnaXN0ZXJDb21wdXRlZCA9IGZ1bmN0aW9uIChuYW1lLCBtYWNybykg ewogICAgRW1iZXIuY29tcHV0ZWRbbmFtZV0gPSBmdW5jdGlvbihkZXBlbmRl bnRLZXkpIHsKICAgICAgdmFyIGFyZ3MgPSBub3JtYWxpemVEZXBlbmRlbnRL ZXlzKGFfc2xpY2UuY2FsbChhcmd1bWVudHMpKTsKICAgICAgcmV0dXJuIEVt YmVyLmNvbXB1dGVkKGRlcGVuZGVudEtleSwgZnVuY3Rpb24oKSB7CiAgICAg ICAgcmV0dXJuIG1hY3JvLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICB9KTsK ICAgIH07CiAgfTsKfQoKaWYgKEVtYmVyLkZFQVRVUkVTLmlzRW5hYmxlZCgn Y29tcG9zYWJsZS1jb21wdXRlZC1wcm9wZXJ0aWVzJykpIHsKICByZWdpc3Rl ckNvbXB1dGVkV2l0aFByb3BlcnRpZXMgPSBmdW5jdGlvbihuYW1lLCBtYWNy bykgewogICAgRW1iZXIuY29tcHV0ZWRbbmFtZV0gPSBmdW5jdGlvbigpIHsK ICAgICAgdmFyIGFyZ3MgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAg ICAgdmFyIHByb3BlcnRpZXMgPSBub3JtYWxpemVEZXBlbmRlbnRLZXlzKGFy Z3MpOwoKICAgICAgdmFyIGNvbXB1dGVkID0gRW1iZXIuY29tcHV0ZWQoZnVu Y3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIG1hY3JvLmFwcGx5KHRoaXMsIFtn ZXRQcm9wZXJ0aWVzKHRoaXMsIHByb3BlcnRpZXMpXSk7CiAgICAgIH0pOwoK ICAgICAgcmV0dXJuIGNvbXB1dGVkLnByb3BlcnR5LmFwcGx5KGNvbXB1dGVk LCBhcmdzKTsKICAgIH07CiAgfTsKfSBlbHNlIHsKICByZWdpc3RlckNvbXB1 dGVkID0gZnVuY3Rpb24gKG5hbWUsIG1hY3JvKSB7CiAgICBFbWJlci5jb21w dXRlZFtuYW1lXSA9IGZ1bmN0aW9uKGRlcGVuZGVudEtleSkgewogICAgICB2 YXIgYXJncyA9IGFfc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICByZXR1 cm4gRW1iZXIuY29tcHV0ZWQoZGVwZW5kZW50S2V5LCBmdW5jdGlvbigpIHsK ICAgICAgICByZXR1cm4gbWFjcm8uYXBwbHkodGhpcywgYXJncyk7CiAgICAg IH0pOwogICAgfTsKICB9OwoKICByZWdpc3RlckNvbXB1dGVkV2l0aFByb3Bl cnRpZXMgPSBmdW5jdGlvbihuYW1lLCBtYWNybykgewogICAgRW1iZXIuY29t cHV0ZWRbbmFtZV0gPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIHByb3BlcnRp ZXMgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzKTsKCiAgICAgIHZhciBjb21w dXRlZCA9IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewogICAgICAgIHJl dHVybiBtYWNyby5hcHBseSh0aGlzLCBbZ2V0UHJvcGVydGllcyh0aGlzLCBw cm9wZXJ0aWVzKV0pOwogICAgICB9KTsKCiAgICAgIHJldHVybiBjb21wdXRl ZC5wcm9wZXJ0eS5hcHBseShjb21wdXRlZCwgcHJvcGVydGllcyk7CiAgICB9 OwogIH07Cn0KCgppZiAoRW1iZXIuRkVBVFVSRVMuaXNFbmFibGVkKCdjb21w b3NhYmxlLWNvbXB1dGVkLXByb3BlcnRpZXMnKSkgewogIEVtYmVyLmNvbXB1 dGVkLmxpdGVyYWwgPSBmdW5jdGlvbiAodmFsdWUpIHsKICAgIHJldHVybiBF bWJlci5jb21wdXRlZChmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB2YWx1 ZTsKICAgIH0pOwogIH07Cn0KCmlmIChFbWJlci5GRUFUVVJFUy5pc0VuYWJs ZWQoJ2VtYmVyLW1ldGFsLWNvbXB1dGVkLWVtcHR5LWFycmF5JykpIHsKICBp ZiAoRW1iZXIuRkVBVFVSRVMuaXNFbmFibGVkKCdjb21wb3NhYmxlLWNvbXB1 dGVkLXByb3BlcnRpZXMnKSkgewogICAgLyoqCiAgICAgIEEgY29tcHV0ZWQg cHJvcGVydHkgdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIG9mIHRo ZSBkZXBlbmRlbnQKICAgICAgcHJvcGVydHkgaXMgbnVsbCwgYW4gZW1wdHkg c3RyaW5nLCBlbXB0eSBhcnJheSwgb3IgZW1wdHkgZnVuY3Rpb24uCgogICAg ICBFeGFtcGxlCgogICAgICBgYGBqYXZhc2NyaXB0CiAgICAgIHZhciBUb0Rv TGlzdCA9IEVtYmVyLk9iamVjdC5leHRlbmQoewogICAgICAgIGRvbmU6IEVt YmVyLmNvbXB1dGVkLmVtcHR5KCd0b2RvcycpCiAgICAgIH0pOwogICAgICB2 YXIgdG9kb0xpc3QgPSBUb0RvTGlzdC5jcmVhdGUoe3RvZG9zOiBbJ1VuaXQg VGVzdCcsICdEb2N1bWVudGF0aW9uJywgJ1JlbGVhc2UnXX0pOwogICAgICB0 b2RvTGlzdC5nZXQoJ2RvbmUnKTsgLy8gZmFsc2UKICAgICAgdG9kb0xpc3Qu Z2V0KCd0b2RvcycpLmNsZWFyKCk7CiAgICAgIHRvZG9MaXN0LmdldCgnZG9u ZScpOyAvLyB0cnVlCiAgICAgIGBgYAoKICAgICAgQG1ldGhvZCBjb21wdXRl ZC5lbXB0eQogICAgICBAZm9yIEVtYmVyCiAgICAgIEBwYXJhbSB7U3RyaW5n fSBkZXBlbmRlbnRLZXkKICAgICAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQ cm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVydHkgd2hpY2ggbmVnYXRlCiAgICAg IHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgcHJvcGVydHkKICAgICovCiAgICBF bWJlci5jb21wdXRlZC5lbXB0eSA9IGZ1bmN0aW9uIChkZXBlbmRlbnRLZXkp IHsKICAgICAgdmFyIGFyZ3MgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzKSwK ICAgICAgICAgIG5vcm1hbGl6ZWRLZXkgPSBub3JtYWxpemVEZXBlbmRlbnRL ZXkoZGVwZW5kZW50S2V5KTsKCiAgICAgIC8vIEVtYmVyLmNvbXB1dGVkLmVt cHR5KCdteUFycmF5JykKICAgICAgaWYgKHR5cGVvZiBkZXBlbmRlbnRLZXkg PT09ICdzdHJpbmcnICYmICEgbGVuZ3RoUGF0dGVybi50ZXN0KGRlcGVuZGVu dEtleSkpIHsKICAgICAgICBhcmdzWzBdID0gZGVwZW5kZW50S2V5ICsgJy5s ZW5ndGgnOwogICAgICAvLyBFbWJlci5jb21wdXRlZC5lbXB0eShFbWJlci5j b21wdXRlZC5hbGlhcygnbXlBcnJheScpKQogICAgICB9IGVsc2UgewogICAg ICAgIGFyZ3MucHVzaChub3JtYWxpemVkS2V5ICsgJy5sZW5ndGgnKTsKICAg ICAgfQoKICAgICAgcmV0dXJuIEVtYmVyLmNvbXB1dGVkLmFwcGx5KEVtYmVy LmNvbXB1dGVkLCBhcmdzLmNvbmNhdChmdW5jdGlvbiAoKSB7CiAgICAgICAg cmV0dXJuIEVtYmVyLmlzRW1wdHkoZ2V0KHRoaXMsIG5vcm1hbGl6ZWRLZXkp KTsKICAgICAgfSkpOwogICAgfTsKICB9IGVsc2UgewogICAgLyoqCiAgICAg IEEgY29tcHV0ZWQgcHJvcGVydHkgdGhhdCByZXR1cm5zIHRydWUgaWYgdGhl IHZhbHVlIG9mIHRoZSBkZXBlbmRlbnQKICAgICAgcHJvcGVydHkgaXMgbnVs bCwgYW4gZW1wdHkgc3RyaW5nLCBlbXB0eSBhcnJheSwgb3IgZW1wdHkgZnVu Y3Rpb24uCgogICAgICBFeGFtcGxlCgogICAgICBgYGBqYXZhc2NyaXB0CiAg ICAgIHZhciBUb0RvTGlzdCA9IEVtYmVyLk9iamVjdC5leHRlbmQoewogICAg ICAgIGRvbmU6IEVtYmVyLmNvbXB1dGVkLmVtcHR5KCd0b2RvcycpCiAgICAg IH0pOwogICAgICB2YXIgdG9kb0xpc3QgPSBUb0RvTGlzdC5jcmVhdGUoe3Rv ZG9zOiBbJ1VuaXQgVGVzdCcsICdEb2N1bWVudGF0aW9uJywgJ1JlbGVhc2Un XX0pOwogICAgICB0b2RvTGlzdC5nZXQoJ2RvbmUnKTsgLy8gZmFsc2UKICAg ICAgdG9kb0xpc3QuZ2V0KCd0b2RvcycpLmNsZWFyKCk7CiAgICAgIHRvZG9M aXN0LmdldCgnZG9uZScpOyAvLyB0cnVlCiAgICAgIGBgYAoKICAgICAgQG1l dGhvZCBjb21wdXRlZC5lbXB0eQogICAgICBAZm9yIEVtYmVyCiAgICAgIEBw YXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkKICAgICAgQHJldHVybiB7RW1i ZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVydHkgd2hpY2gg bmVnYXRlCiAgICAgIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgcHJvcGVydHkK ICAgICovCiAgICBFbWJlci5jb21wdXRlZC5lbXB0eSA9IGZ1bmN0aW9uIChk ZXBlbmRlbnRLZXkpIHsKICAgICAgcmV0dXJuIEVtYmVyLmNvbXB1dGVkKGRl cGVuZGVudEtleSArICcubGVuZ3RoJywgZnVuY3Rpb24gKCkgewogICAgICAg IHJldHVybiBFbWJlci5pc0VtcHR5KGdldCh0aGlzLCBkZXBlbmRlbnRLZXkp KTsKICAgICAgfSk7CiAgICB9OwogIH0KfSBlbHNlIHsKICAvKioKICAgIEEg Y29tcHV0ZWQgcHJvcGVydHkgdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIHZh bHVlIG9mIHRoZSBkZXBlbmRlbnQKICAgIHByb3BlcnR5IGlzIG51bGwsIGFu IGVtcHR5IHN0cmluZywgZW1wdHkgYXJyYXksIG9yIGVtcHR5IGZ1bmN0aW9u LgoKICAgIE5vdGU6IFdoZW4gdXNpbmcgYEVtYmVyLmNvbXB1dGVkLmVtcHR5 YCB0byB3YXRjaCBhbiBhcnJheSBtYWtlIHN1cmUgdG8KICAgIHVzZSB0aGUg YGFycmF5LltdYCBzeW50YXggc28gdGhlIGNvbXB1dGVkIGNhbiBzdWJzY3Jp YmUgdG8gdHJhbnNpdGlvbnMKICAgIGZyb20gZW1wdHkgdG8gbm9uLWVtcHR5 IHN0YXRlcy4KCiAgICBFeGFtcGxlCgogICAgYGBgamF2YXNjcmlwdAogICAg dmFyIFRvRG9MaXN0ID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CiAgICAgIGRv bmU6IEVtYmVyLmNvbXB1dGVkLmVtcHR5KCd0b2Rvcy5bXScpIC8vIGRldGVj dCBhcnJheSBjaGFuZ2VzCiAgICB9KTsKICAgIHZhciB0b2RvTGlzdCA9IFRv RG9MaXN0LmNyZWF0ZSh7dG9kb3M6IFsnVW5pdCBUZXN0JywgJ0RvY3VtZW50 YXRpb24nLCAnUmVsZWFzZSddfSk7CiAgICB0b2RvTGlzdC5nZXQoJ2RvbmUn KTsgLy8gZmFsc2UKICAgIHRvZG9MaXN0LmdldCgndG9kb3MnKS5jbGVhcigp OyAvLyBbXQogICAgdG9kb0xpc3QuZ2V0KCdkb25lJyk7IC8vIHRydWUKICAg IGBgYAoKICAgIEBtZXRob2QgY29tcHV0ZWQuZW1wdHkKICAgIEBmb3IgRW1i ZXIKICAgIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkKICAgIEByZXR1 cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5 IHdoaWNoIG5lZ2F0ZQogICAgdGhlIG9yaWdpbmFsIHZhbHVlIGZvciBwcm9w ZXJ0eQogICovCiAgcmVnaXN0ZXJDb21wdXRlZCgnZW1wdHknLCBmdW5jdGlv bihkZXBlbmRlbnRLZXkpIHsKICAgIHJldHVybiBFbWJlci5pc0VtcHR5KGdl dCh0aGlzLCBkZXBlbmRlbnRLZXkpKTsKICB9KTsKfQoKLyoqCiAgQSBjb21w dXRlZCBwcm9wZXJ0eSB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUg b2YgdGhlIGRlcGVuZGVudAogIHByb3BlcnR5IGlzIE5PVCBudWxsLCBhbiBl bXB0eSBzdHJpbmcsIGVtcHR5IGFycmF5LCBvciBlbXB0eSBmdW5jdGlvbi4K CiAgTm90ZTogV2hlbiB1c2luZyBgRW1iZXIuY29tcHV0ZWQubm90RW1wdHlg IHRvIHdhdGNoIGFuIGFycmF5IG1ha2Ugc3VyZSB0bwogIHVzZSB0aGUgYGFy cmF5LltdYCBzeW50YXggc28gdGhlIGNvbXB1dGVkIGNhbiBzdWJzY3JpYmUg dG8gdHJhbnNpdGlvbnMKICBmcm9tIGVtcHR5IHRvIG5vbi1lbXB0eSBzdGF0 ZXMuCgogIEV4YW1wbGUKCiAgYGBgamF2YXNjcmlwdAogIHZhciBIYW1zdGVy ID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CiAgICBoYXNTdHVmZjogRW1iZXIu Y29tcHV0ZWQubm90RW1wdHkoJ2JhY2twYWNrLltdJykKICB9KTsKICB2YXIg aGFtc3RlciA9IEhhbXN0ZXIuY3JlYXRlKHtiYWNrcGFjazogWydGb29kJywg J1NsZWVwaW5nIEJhZycsICdUZW50J119KTsKICBoYW1zdGVyLmdldCgnaGFz U3R1ZmYnKTsgLy8gdHJ1ZQogIGhhbXN0ZXIuZ2V0KCdiYWNrcGFjaycpLmNs ZWFyKCk7IC8vIFtdCiAgaGFtc3Rlci5nZXQoJ2hhc1N0dWZmJyk7IC8vIGZh bHNlCiAgYGBgCgogIEBtZXRob2QgY29tcHV0ZWQubm90RW1wdHkKICBAZm9y IEVtYmVyCiAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQogIEByZXR1 cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5 IHdoaWNoIHJldHVybnMgdHJ1ZSBpZgogIG9yaWdpbmFsIHZhbHVlIGZvciBw cm9wZXJ0eSBpcyBub3QgZW1wdHkuCiovCnJlZ2lzdGVyQ29tcHV0ZWQoJ25v dEVtcHR5JywgZnVuY3Rpb24oZGVwZW5kZW50S2V5KSB7CiAgcmV0dXJuICFF bWJlci5pc0VtcHR5KGdldCh0aGlzLCBkZXBlbmRlbnRLZXkpKTsKfSk7Cgov KioKICBBIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgcmV0dXJucyB0cnVlIGlm IHRoZSB2YWx1ZSBvZiB0aGUgZGVwZW5kZW50CiAgcHJvcGVydHkgaXMgbnVs bCBvciB1bmRlZmluZWQuIFRoaXMgYXZvaWRzIGVycm9ycyBmcm9tIEpTTGlu dCBjb21wbGFpbmluZwogIGFib3V0IHVzZSBvZiA9PSwgd2hpY2ggY2FuIGJl IHRlY2huaWNhbGx5IGNvbmZ1c2luZy4KCiAgRXhhbXBsZQoKICBgYGBqYXZh c2NyaXB0CiAgdmFyIEhhbXN0ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsK ICAgIGlzSHVuZ3J5OiBFbWJlci5jb21wdXRlZC5ub25lKCdmb29kJykKICB9 KTsKICB2YXIgaGFtc3RlciA9IEhhbXN0ZXIuY3JlYXRlKCk7CiAgaGFtc3Rl ci5nZXQoJ2lzSHVuZ3J5Jyk7IC8vIHRydWUKICBoYW1zdGVyLnNldCgnZm9v ZCcsICdCYW5hbmEnKTsKICBoYW1zdGVyLmdldCgnaXNIdW5ncnknKTsgLy8g ZmFsc2UKICBoYW1zdGVyLnNldCgnZm9vZCcsIG51bGwpOwogIGhhbXN0ZXIu Z2V0KCdpc0h1bmdyeScpOyAvLyB0cnVlCiAgYGBgCgogIEBtZXRob2QgY29t cHV0ZWQubm9uZQogIEBmb3IgRW1iZXIKICBAcGFyYW0ge1N0cmluZ30gZGVw ZW5kZW50S2V5CiAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0g Y29tcHV0ZWQgcHJvcGVydHkgd2hpY2gKICByZXR1cm5zIHRydWUgaWYgb3Jp Z2luYWwgdmFsdWUgZm9yIHByb3BlcnR5IGlzIG51bGwgb3IgdW5kZWZpbmVk LgoqLwpyZWdpc3RlckNvbXB1dGVkKCdub25lJywgZnVuY3Rpb24oZGVwZW5k ZW50S2V5KSB7CiAgcmV0dXJuIEVtYmVyLmlzTm9uZShnZXQodGhpcywgZGVw ZW5kZW50S2V5KSk7Cn0pOwoKLyoqCiAgQSBjb21wdXRlZCBwcm9wZXJ0eSB0 aGF0IHJldHVybnMgdGhlIGludmVyc2UgYm9vbGVhbiB2YWx1ZQogIG9mIHRo ZSBvcmlnaW5hbCB2YWx1ZSBmb3IgdGhlIGRlcGVuZGVudCBwcm9wZXJ0eS4K CiAgRXhhbXBsZQoKICBgYGBqYXZhc2NyaXB0CiAgdmFyIFVzZXIgPSBFbWJl ci5PYmplY3QuZXh0ZW5kKHsKICAgIGlzQW5vbnltb3VzOiBFbWJlci5jb21w dXRlZC5ub3QoJ2xvZ2dlZEluJykKICB9KTsKICB2YXIgdXNlciA9IFVzZXIu Y3JlYXRlKHtsb2dnZWRJbjogZmFsc2V9KTsKICB1c2VyLmdldCgnaXNBbm9u eW1vdXMnKTsgLy8gdHJ1ZQogIHVzZXIuc2V0KCdsb2dnZWRJbicsIHRydWUp OwogIHVzZXIuZ2V0KCdpc0Fub255bW91cycpOyAvLyBmYWxzZQogIGBgYAoK ICBAbWV0aG9kIGNvbXB1dGVkLm5vdAogIEBmb3IgRW1iZXIKICBAcGFyYW0g e1N0cmluZ30gZGVwZW5kZW50S2V5CiAgQHJldHVybiB7RW1iZXIuQ29tcHV0 ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJvcGVydHkgd2hpY2ggcmV0dXJucwog IGludmVyc2Ugb2YgdGhlIG9yaWdpbmFsIHZhbHVlIGZvciBwcm9wZXJ0eQoq LwpyZWdpc3RlckNvbXB1dGVkKCdub3QnLCBmdW5jdGlvbihkZXBlbmRlbnRL ZXkpIHsKICByZXR1cm4gIWdldCh0aGlzLCBkZXBlbmRlbnRLZXkpOwp9KTsK Ci8qKgogIEEgY29tcHV0ZWQgcHJvcGVydHkgdGhhdCBjb252ZXJ0cyB0aGUg cHJvdmlkZWQgZGVwZW5kZW50IHByb3BlcnR5CiAgaW50byBhIGJvb2xlYW4g dmFsdWUuCgogIGBgYGphdmFzY3JpcHQKICB2YXIgSGFtc3RlciA9IEVtYmVy Lk9iamVjdC5leHRlbmQoewogICAgaGFzQmFuYW5hczogRW1iZXIuY29tcHV0 ZWQuYm9vbCgnbnVtQmFuYW5hcycpCiAgfSk7CiAgdmFyIGhhbXN0ZXIgPSBI YW1zdGVyLmNyZWF0ZSgpOwogIGhhbXN0ZXIuZ2V0KCdoYXNCYW5hbmFzJyk7 IC8vIGZhbHNlCiAgaGFtc3Rlci5zZXQoJ251bUJhbmFuYXMnLCAwKTsKICBo YW1zdGVyLmdldCgnaGFzQmFuYW5hcycpOyAvLyBmYWxzZQogIGhhbXN0ZXIu c2V0KCdudW1CYW5hbmFzJywgMSk7CiAgaGFtc3Rlci5nZXQoJ2hhc0JhbmFu YXMnKTsgLy8gdHJ1ZQogIGhhbXN0ZXIuc2V0KCdudW1CYW5hbmFzJywgbnVs bCk7CiAgaGFtc3Rlci5nZXQoJ2hhc0JhbmFuYXMnKTsgLy8gZmFsc2UKICBg YGAKCiAgQG1ldGhvZCBjb21wdXRlZC5ib29sCiAgQGZvciBFbWJlcgogIEBw YXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkKICBAcmV0dXJuIHtFbWJlci5D b21wdXRlZFByb3BlcnR5fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCBjb252 ZXJ0cwogIHRvIGJvb2xlYW4gdGhlIG9yaWdpbmFsIHZhbHVlIGZvciBwcm9w ZXJ0eQoqLwpyZWdpc3RlckNvbXB1dGVkKCdib29sJywgZnVuY3Rpb24oZGVw ZW5kZW50S2V5KSB7CiAgcmV0dXJuICEhZ2V0KHRoaXMsIGRlcGVuZGVudEtl eSk7Cn0pOwoKLyoqCiAgQSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCBtYXRj aGVzIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgdGhlCiAgZGVwZW5kZW50IHBy b3BlcnR5IGFnYWluc3QgYSBnaXZlbiBSZWdFeHAsIHJldHVybmluZyBgdHJ1 ZWAKICBpZiB0aGV5IHZhbHVlcyBtYXRjaGVzIHRoZSBSZWdFeHAgYW5kIGBm YWxzZWAgaWYgaXQgZG9lcyBub3QuCgogIEV4YW1wbGUKCiAgYGBgamF2YXNj cmlwdAogIHZhciBVc2VyID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CiAgICBo YXNWYWxpZEVtYWlsOiBFbWJlci5jb21wdXRlZC5tYXRjaCgnZW1haWwnLCAv Xi4rQC4rXC4uKyQvKQogIH0pOwogIHZhciB1c2VyID0gVXNlci5jcmVhdGUo e2xvZ2dlZEluOiBmYWxzZX0pOwogIHVzZXIuZ2V0KCdoYXNWYWxpZEVtYWls Jyk7IC8vIGZhbHNlCiAgdXNlci5zZXQoJ2VtYWlsJywgJycpOwogIHVzZXIu Z2V0KCdoYXNWYWxpZEVtYWlsJyk7IC8vIGZhbHNlCiAgdXNlci5zZXQoJ2Vt YWlsJywgJ2VtYmVyX2hhbXN0ZXJAZXhhbXBsZS5jb20nKTsKICB1c2VyLmdl dCgnaGFzVmFsaWRFbWFpbCcpOyAvLyB0cnVlCiAgYGBgCgogIEBtZXRob2Qg Y29tcHV0ZWQubWF0Y2gKICBAZm9yIEVtYmVyCiAgQHBhcmFtIHtTdHJpbmd9 IGRlcGVuZGVudEtleQogIEBwYXJhbSB7UmVnRXhwfSByZWdleHAKICBAcmV0 dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlZCBwcm9wZXJ0 eSB3aGljaCBtYXRjaAogIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgcHJvcGVy dHkgYWdhaW5zdCBhIGdpdmVuIFJlZ0V4cAoqLwpyZWdpc3RlckNvbXB1dGVk KCdtYXRjaCcsIGZ1bmN0aW9uKGRlcGVuZGVudEtleSwgcmVnZXhwKSB7CiAg dmFyIHZhbHVlID0gZ2V0KHRoaXMsIGRlcGVuZGVudEtleSk7CiAgcmV0dXJu IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyByZWdleHAudGVzdCh2YWx1 ZSkgOiBmYWxzZTsKfSk7CgovKioKICBBIGNvbXB1dGVkIHByb3BlcnR5IHRo YXQgcmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBkZXBlbmRlbnQgcHJv cGVydHkKICBpcyBlcXVhbCB0byB0aGUgZ2l2ZW4gdmFsdWUuCgogIEV4YW1w bGUKCiAgYGBgamF2YXNjcmlwdAogIHZhciBIYW1zdGVyID0gRW1iZXIuT2Jq ZWN0LmV4dGVuZCh7CiAgICBuYXBUaW1lOiBFbWJlci5jb21wdXRlZC5lcXVh bCgnc3RhdGUnLCAnc2xlZXB5JykKICB9KTsKICB2YXIgaGFtc3RlciA9IEhh bXN0ZXIuY3JlYXRlKCk7CiAgaGFtc3Rlci5nZXQoJ25hcFRpbWUnKTsgLy8g ZmFsc2UKICBoYW1zdGVyLnNldCgnc3RhdGUnLCAnc2xlZXB5Jyk7CiAgaGFt c3Rlci5nZXQoJ25hcFRpbWUnKTsgLy8gdHJ1ZQogIGhhbXN0ZXIuc2V0KCdz dGF0ZScsICdodW5ncnknKTsKICBoYW1zdGVyLmdldCgnbmFwVGltZScpOyAv LyBmYWxzZQogIGBgYAoKICBAbWV0aG9kIGNvbXB1dGVkLmVxdWFsCiAgQGZv ciBFbWJlcgogIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkKICBAcGFy YW0ge1N0cmluZ3xOdW1iZXJ8T2JqZWN0fSB2YWx1ZQogIEByZXR1cm4ge0Vt YmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNo IHJldHVybnMgdHJ1ZSBpZgogIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgcHJv cGVydHkgaXMgZXF1YWwgdG8gdGhlIGdpdmVuIHZhbHVlLgoqLwpyZWdpc3Rl ckNvbXB1dGVkKCdlcXVhbCcsIGZ1bmN0aW9uKGRlcGVuZGVudEtleSwgdmFs dWUpIHsKICByZXR1cm4gZ2V0KHRoaXMsIGRlcGVuZGVudEtleSkgPT09IHZh bHVlOwp9KTsKCi8qKgogIEEgY29tcHV0ZWQgcHJvcGVydHkgdGhhdCByZXR1 cm5zIHRydWUgaWYgdGhlIHByb3ZpZWQgZGVwZW5kZW50IHByb3BlcnR5CiAg aXMgZ3JlYXRlciB0aGFuIHRoZSBwcm92aWRlZCB2YWx1ZS4KCiAgRXhhbXBs ZQoKICBgYGBqYXZhc2NyaXB0CiAgdmFyIEhhbXN0ZXIgPSBFbWJlci5PYmpl Y3QuZXh0ZW5kKHsKICAgIGhhc1Rvb01hbnlCYW5hbmFzOiBFbWJlci5jb21w dXRlZC5ndCgnbnVtQmFuYW5hcycsIDEwKQogIH0pOwogIHZhciBoYW1zdGVy ID0gSGFtc3Rlci5jcmVhdGUoKTsKICBoYW1zdGVyLmdldCgnaGFzVG9vTWFu eUJhbmFuYXMnKTsgLy8gZmFsc2UKICBoYW1zdGVyLnNldCgnbnVtQmFuYW5h cycsIDMpOwogIGhhbXN0ZXIuZ2V0KCdoYXNUb29NYW55QmFuYW5hcycpOyAv LyBmYWxzZQogIGhhbXN0ZXIuc2V0KCdudW1CYW5hbmFzJywgMTEpOwogIGhh bXN0ZXIuZ2V0KCdoYXNUb29NYW55QmFuYW5hcycpOyAvLyB0cnVlCiAgYGBg CgogIEBtZXRob2QgY29tcHV0ZWQuZ3QKICBAZm9yIEVtYmVyCiAgQHBhcmFt IHtTdHJpbmd9IGRlcGVuZGVudEtleQogIEBwYXJhbSB7TnVtYmVyfSB2YWx1 ZQogIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVk IHByb3BlcnR5IHdoaWNoIHJldHVybnMgdHJ1ZSBpZgogIHRoZSBvcmlnaW5h bCB2YWx1ZSBmb3IgcHJvcGVydHkgaXMgZ3JlYXRlciB0aGVuIGdpdmVuIHZh bHVlLgoqLwpyZWdpc3RlckNvbXB1dGVkKCdndCcsIGZ1bmN0aW9uKGRlcGVu ZGVudEtleSwgdmFsdWUpIHsKICByZXR1cm4gZ2V0KHRoaXMsIGRlcGVuZGVu dEtleSkgPiB2YWx1ZTsKfSk7CgovKioKICBBIGNvbXB1dGVkIHByb3BlcnR5 IHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBkZXBlbmRlbnQg cHJvcGVydHkKICBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHBy b3ZpZGVkIHZhbHVlLgoKICBFeGFtcGxlCgogIGBgYGphdmFzY3JpcHQKICB2 YXIgSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewogICAgaGFzVG9v TWFueUJhbmFuYXM6IEVtYmVyLmNvbXB1dGVkLmd0ZSgnbnVtQmFuYW5hcycs IDEwKQogIH0pOwogIHZhciBoYW1zdGVyID0gSGFtc3Rlci5jcmVhdGUoKTsK ICBoYW1zdGVyLmdldCgnaGFzVG9vTWFueUJhbmFuYXMnKTsgLy8gZmFsc2UK ICBoYW1zdGVyLnNldCgnbnVtQmFuYW5hcycsIDMpOwogIGhhbXN0ZXIuZ2V0 KCdoYXNUb29NYW55QmFuYW5hcycpOyAvLyBmYWxzZQogIGhhbXN0ZXIuc2V0 KCdudW1CYW5hbmFzJywgMTApOwogIGhhbXN0ZXIuZ2V0KCdoYXNUb29NYW55 QmFuYW5hcycpOyAvLyB0cnVlCiAgYGBgCgogIEBtZXRob2QgY29tcHV0ZWQu Z3RlCiAgQGZvciBFbWJlcgogIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRL ZXkKICBAcGFyYW0ge051bWJlcn0gdmFsdWUKICBAcmV0dXJuIHtFbWJlci5D b21wdXRlZFByb3BlcnR5fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCByZXR1 cm5zIHRydWUgaWYKICB0aGUgb3JpZ2luYWwgdmFsdWUgZm9yIHByb3BlcnR5 IGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhlbiBnaXZlbiB2YWx1ZS4KKi8KcmVn aXN0ZXJDb21wdXRlZCgnZ3RlJywgZnVuY3Rpb24oZGVwZW5kZW50S2V5LCB2 YWx1ZSkgewogIHJldHVybiBnZXQodGhpcywgZGVwZW5kZW50S2V5KSA+PSB2 YWx1ZTsKfSk7CgovKioKICBBIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgcmV0 dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBkZXBlbmRlbnQgcHJvcGVydHkK ICBpcyBsZXNzIHRoYW4gdGhlIHByb3ZpZGVkIHZhbHVlLgoKICBFeGFtcGxl CgogIGBgYGphdmFzY3JpcHQKICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVj dC5leHRlbmQoewogICAgbmVlZHNNb3JlQmFuYW5hczogRW1iZXIuY29tcHV0 ZWQubHQoJ251bUJhbmFuYXMnLCAzKQogIH0pOwogIHZhciBoYW1zdGVyID0g SGFtc3Rlci5jcmVhdGUoKTsKICBoYW1zdGVyLmdldCgnbmVlZHNNb3JlQmFu YW5hcycpOyAvLyB0cnVlCiAgaGFtc3Rlci5zZXQoJ251bUJhbmFuYXMnLCAz KTsKICBoYW1zdGVyLmdldCgnbmVlZHNNb3JlQmFuYW5hcycpOyAvLyBmYWxz ZQogIGhhbXN0ZXIuc2V0KCdudW1CYW5hbmFzJywgMik7CiAgaGFtc3Rlci5n ZXQoJ25lZWRzTW9yZUJhbmFuYXMnKTsgLy8gdHJ1ZQogIGBgYAoKICBAbWV0 aG9kIGNvbXB1dGVkLmx0CiAgQGZvciBFbWJlcgogIEBwYXJhbSB7U3RyaW5n fSBkZXBlbmRlbnRLZXkKICBAcGFyYW0ge051bWJlcn0gdmFsdWUKICBAcmV0 dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlZCBwcm9wZXJ0 eSB3aGljaCByZXR1cm5zIHRydWUgaWYKICB0aGUgb3JpZ2luYWwgdmFsdWUg Zm9yIHByb3BlcnR5IGlzIGxlc3MgdGhlbiBnaXZlbiB2YWx1ZS4KKi8KcmVn aXN0ZXJDb21wdXRlZCgnbHQnLCBmdW5jdGlvbihkZXBlbmRlbnRLZXksIHZh bHVlKSB7CiAgcmV0dXJuIGdldCh0aGlzLCBkZXBlbmRlbnRLZXkpIDwgdmFs dWU7Cn0pOwoKLyoqCiAgQSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IHJldHVy bnMgdHJ1ZSBpZiB0aGUgcHJvdmlkZWQgZGVwZW5kZW50IHByb3BlcnR5CiAg aXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwcm92aWRlZCB2YWx1ZS4K CiAgRXhhbXBsZQoKICBgYGBqYXZhc2NyaXB0CiAgdmFyIEhhbXN0ZXIgPSBF bWJlci5PYmplY3QuZXh0ZW5kKHsKICAgIG5lZWRzTW9yZUJhbmFuYXM6IEVt YmVyLmNvbXB1dGVkLmx0ZSgnbnVtQmFuYW5hcycsIDMpCiAgfSk7CiAgdmFy IGhhbXN0ZXIgPSBIYW1zdGVyLmNyZWF0ZSgpOwogIGhhbXN0ZXIuZ2V0KCdu ZWVkc01vcmVCYW5hbmFzJyk7IC8vIHRydWUKICBoYW1zdGVyLnNldCgnbnVt QmFuYW5hcycsIDUpOwogIGhhbXN0ZXIuZ2V0KCduZWVkc01vcmVCYW5hbmFz Jyk7IC8vIGZhbHNlCiAgaGFtc3Rlci5zZXQoJ251bUJhbmFuYXMnLCAzKTsK ICBoYW1zdGVyLmdldCgnbmVlZHNNb3JlQmFuYW5hcycpOyAvLyB0cnVlCiAg YGBgCgogIEBtZXRob2QgY29tcHV0ZWQubHRlCiAgQGZvciBFbWJlcgogIEBw YXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkKICBAcGFyYW0ge051bWJlcn0g dmFsdWUKICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21w dXRlZCBwcm9wZXJ0eSB3aGljaCByZXR1cm5zIHRydWUgaWYKICB0aGUgb3Jp Z2luYWwgdmFsdWUgZm9yIHByb3BlcnR5IGlzIGxlc3Mgb3IgZXF1YWwgdGhl biBnaXZlbiB2YWx1ZS4KKi8KcmVnaXN0ZXJDb21wdXRlZCgnbHRlJywgZnVu Y3Rpb24oZGVwZW5kZW50S2V5LCB2YWx1ZSkgewogIHJldHVybiBnZXQodGhp cywgZGVwZW5kZW50S2V5KSA8PSB2YWx1ZTsKfSk7CgovKioKICBBIGNvbXB1 dGVkIHByb3BlcnR5IHRoYXQgcGVyZm9ybXMgYSBsb2dpY2FsIGBhbmRgIG9u IHRoZQogIG9yaWdpbmFsIHZhbHVlcyBmb3IgdGhlIHByb3ZpZGVkIGRlcGVu ZGVudCBwcm9wZXJ0aWVzLgoKICBFeGFtcGxlCgogIGBgYGphdmFzY3JpcHQK ICB2YXIgSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoewogICAgcmVh ZHlGb3JDYW1wOiBFbWJlci5jb21wdXRlZC5hbmQoJ2hhc1RlbnQnLCAnaGFz QmFja3BhY2snKQogIH0pOwogIHZhciBoYW1zdGVyID0gSGFtc3Rlci5jcmVh dGUoKTsKICBoYW1zdGVyLmdldCgncmVhZHlGb3JDYW1wJyk7IC8vIGZhbHNl CiAgaGFtc3Rlci5zZXQoJ2hhc1RlbnQnLCB0cnVlKTsKICBoYW1zdGVyLmdl dCgncmVhZHlGb3JDYW1wJyk7IC8vIGZhbHNlCiAgaGFtc3Rlci5zZXQoJ2hh c0JhY2twYWNrJywgdHJ1ZSk7CiAgaGFtc3Rlci5nZXQoJ3JlYWR5Rm9yQ2Ft cCcpOyAvLyB0cnVlCiAgYGBgCgogIEBtZXRob2QgY29tcHV0ZWQuYW5kCiAg QGZvciBFbWJlcgogIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkqCiAg QHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZWQgcHJv cGVydHkgd2hpY2ggcGVyZm9ybXMKICBhIGxvZ2ljYWwgYGFuZGAgb24gdGhl IHZhbHVlcyBvZiBhbGwgdGhlIG9yaWdpbmFsIHZhbHVlcyBmb3IgcHJvcGVy dGllcy4KKi8KcmVnaXN0ZXJDb21wdXRlZFdpdGhQcm9wZXJ0aWVzKCdhbmQn LCBmdW5jdGlvbihwcm9wZXJ0aWVzKSB7CiAgZm9yICh2YXIga2V5IGluIHBy b3BlcnRpZXMpIHsKICAgIGlmIChwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5 KGtleSkgJiYgIXByb3BlcnRpZXNba2V5XSkgewogICAgICByZXR1cm4gZmFs c2U7CiAgICB9CiAgfQogIHJldHVybiB0cnVlOwp9KTsKCi8qKgogIEEgY29t cHV0ZWQgcHJvcGVydHkgd2hpY2ggcGVyZm9ybXMgYSBsb2dpY2FsIGBvcmAg b24gdGhlCiAgb3JpZ2luYWwgdmFsdWVzIGZvciB0aGUgcHJvdmlkZWQgZGVw ZW5kZW50IHByb3BlcnRpZXMuCgogIEV4YW1wbGUKCiAgYGBgamF2YXNjcmlw dAogIHZhciBIYW1zdGVyID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CiAgICBy ZWFkeUZvclJhaW46IEVtYmVyLmNvbXB1dGVkLm9yKCdoYXNKYWNrZXQnLCAn aGFzVW1icmVsbGEnKQogIH0pOwogIHZhciBoYW1zdGVyID0gSGFtc3Rlci5j cmVhdGUoKTsKICBoYW1zdGVyLmdldCgncmVhZHlGb3JSYWluJyk7IC8vIGZh bHNlCiAgaGFtc3Rlci5zZXQoJ2hhc0phY2tldCcsIHRydWUpOwogIGhhbXN0 ZXIuZ2V0KCdyZWFkeUZvclJhaW4nKTsgLy8gdHJ1ZQogIGBgYAoKICBAbWV0 aG9kIGNvbXB1dGVkLm9yCiAgQGZvciBFbWJlcgogIEBwYXJhbSB7U3RyaW5n fSBkZXBlbmRlbnRLZXkqCiAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9w ZXJ0eX0gY29tcHV0ZWQgcHJvcGVydHkgd2hpY2ggcGVyZm9ybXMKICBhIGxv Z2ljYWwgYG9yYCBvbiB0aGUgdmFsdWVzIG9mIGFsbCB0aGUgb3JpZ2luYWwg dmFsdWVzIGZvciBwcm9wZXJ0aWVzLgoqLwpyZWdpc3RlckNvbXB1dGVkV2l0 aFByb3BlcnRpZXMoJ29yJywgZnVuY3Rpb24ocHJvcGVydGllcykgewogIGZv ciAodmFyIGtleSBpbiBwcm9wZXJ0aWVzKSB7CiAgICBpZiAocHJvcGVydGll cy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIHByb3BlcnRpZXNba2V5XSkgewog ICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICB9CiAgcmV0dXJuIGZhbHNlOwp9 KTsKCi8qKgogIEEgY29tcHV0ZWQgcHJvcGVydHkgdGhhdCByZXR1cm5zIHRo ZSBmaXJzdCB0cnV0aHkgdmFsdWUKICBmcm9tIGEgbGlzdCBvZiBkZXBlbmRl bnQgcHJvcGVydGllcy4KCiAgRXhhbXBsZQoKICBgYGBqYXZhc2NyaXB0CiAg dmFyIEhhbXN0ZXIgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKICAgIGhhc0Ns b3RoZXM6IEVtYmVyLmNvbXB1dGVkLmFueSgnaGF0JywgJ3NoaXJ0JykKICB9 KTsKICB2YXIgaGFtc3RlciA9IEhhbXN0ZXIuY3JlYXRlKCk7CiAgaGFtc3Rl ci5nZXQoJ2hhc0Nsb3RoZXMnKTsgLy8gbnVsbAogIGhhbXN0ZXIuc2V0KCdz aGlydCcsICdIYXdhaWlhbiBTaGlydCcpOwogIGhhbXN0ZXIuZ2V0KCdoYXND bG90aGVzJyk7IC8vICdIYXdhaWlhbiBTaGlydCcKICBgYGAKCiAgQG1ldGhv ZCBjb21wdXRlZC5hbnkKICBAZm9yIEVtYmVyCiAgQHBhcmFtIHtTdHJpbmd9 IGRlcGVuZGVudEtleSoKICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3Bl cnR5fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCByZXR1cm5zCiAgdGhlIGZp cnN0IHRydXRoeSB2YWx1ZSBvZiBnaXZlbiBsaXN0IG9mIHByb3BlcnRpZXMu CiovCnJlZ2lzdGVyQ29tcHV0ZWRXaXRoUHJvcGVydGllcygnYW55JywgZnVu Y3Rpb24ocHJvcGVydGllcykgewogIGZvciAodmFyIGtleSBpbiBwcm9wZXJ0 aWVzKSB7CiAgICBpZiAocHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShrZXkp ICYmIHByb3BlcnRpZXNba2V5XSkgewogICAgICByZXR1cm4gcHJvcGVydGll c1trZXldOwogICAgfQogIH0KICByZXR1cm4gbnVsbDsKfSk7CgovKioKICBB IGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgcmV0dXJucyB0aGUgYXJyYXkgb2Yg dmFsdWVzCiAgZm9yIHRoZSBwcm92aWRlZCBkZXBlbmRlbnQgcHJvcGVydGll cy4KCiAgRXhhbXBsZQoKICBgYGBqYXZhc2NyaXB0CiAgdmFyIEhhbXN0ZXIg PSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKICAgIGNsb3RoZXM6IEVtYmVyLmNv bXB1dGVkLmNvbGxlY3QoJ2hhdCcsICdzaGlydCcpCiAgfSk7CiAgdmFyIGhh bXN0ZXIgPSBIYW1zdGVyLmNyZWF0ZSgpOwogIGhhbXN0ZXIuZ2V0KCdjbG90 aGVzJyk7IC8vIFtudWxsLCBudWxsXQogIGhhbXN0ZXIuc2V0KCdoYXQnLCAn Q2FtcCBIYXQnKTsKICBoYW1zdGVyLnNldCgnc2hpcnQnLCAnQ2FtcCBTaGly dCcpOwogIGhhbXN0ZXIuZ2V0KCdjbG90aGVzJyk7IC8vIFsnQ2FtcCBIYXQn LCAnQ2FtcCBTaGlydCddCiAgYGBgCgogIEBtZXRob2QgY29tcHV0ZWQuY29s bGVjdAogIEBmb3IgRW1iZXIKICBAcGFyYW0ge1N0cmluZ30gZGVwZW5kZW50 S2V5KgogIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1 dGVkIHByb3BlcnR5IHdoaWNoIG1hcHMKICB2YWx1ZXMgb2YgYWxsIHBhc3Nl ZCBwcm9wZXJ0aWVzIGluIHRvIGFuIGFycmF5LgoqLwpyZWdpc3RlckNvbXB1 dGVkV2l0aFByb3BlcnRpZXMoJ2NvbGxlY3QnLCBmdW5jdGlvbihwcm9wZXJ0 aWVzKSB7CiAgdmFyIHJlcyA9IFtdOwogIGZvciAodmFyIGtleSBpbiBwcm9w ZXJ0aWVzKSB7CiAgICBpZiAocHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShr ZXkpKSB7CiAgICAgIGlmIChFbWJlci5pc05vbmUocHJvcGVydGllc1trZXld KSkgewogICAgICAgIHJlcy5wdXNoKG51bGwpOwogICAgICB9IGVsc2Ugewog ICAgICAgIHJlcy5wdXNoKHByb3BlcnRpZXNba2V5XSk7CiAgICAgIH0KICAg IH0KICB9CiAgcmV0dXJuIHJlczsKfSk7CgovKioKICBDcmVhdGVzIGEgbmV3 IHByb3BlcnR5IHRoYXQgaXMgYW4gYWxpYXMgZm9yIGFub3RoZXIgcHJvcGVy dHkKICBvbiBhbiBvYmplY3QuIENhbGxzIHRvIGBnZXRgIG9yIGBzZXRgIHRo aXMgcHJvcGVydHkgYmVoYXZlIGFzCiAgdGhvdWdoIHRoZXkgd2VyZSBjYWxs ZWQgb24gdGhlIG9yaWdpbmFsIHByb3BlcnR5LgoKICBgYGBqYXZhc2NyaXB0 CiAgUGVyc29uID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CiAgICBuYW1lOiAn QWxleCBNYXRjaG5lZXInLAogICAgbm9tZW46IEVtYmVyLmNvbXB1dGVkLmFs aWFzKCduYW1lJykKICB9KTsKCiAgYWxleCA9IFBlcnNvbi5jcmVhdGUoKTsK ICBhbGV4LmdldCgnbm9tZW4nKTsgLy8gJ0FsZXggTWF0Y2huZWVyJwogIGFs ZXguZ2V0KCduYW1lJyk7ICAvLyAnQWxleCBNYXRjaG5lZXInCgogIGFsZXgu c2V0KCdub21lbicsICdAbWFjaHR5Jyk7CiAgYWxleC5nZXQoJ25hbWUnKTsg IC8vICdAbWFjaHR5JwogIGBgYAogIEBtZXRob2QgY29tcHV0ZWQuYWxpYXMK ICBAZm9yIEVtYmVyCiAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQog IEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVkIHBy b3BlcnR5IHdoaWNoIGNyZWF0ZXMgYW4KICBhbGlhcyB0byB0aGUgb3JpZ2lu YWwgdmFsdWUgZm9yIHByb3BlcnR5LgoqLwpFbWJlci5jb21wdXRlZC5hbGlh cyA9IGZ1bmN0aW9uKGRlcGVuZGVudEtleSkgewogIHJldHVybiBFbWJlci5j b21wdXRlZChkZXBlbmRlbnRLZXksIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsK ICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgewogICAgICBzZXQodGhp cywgZGVwZW5kZW50S2V5LCB2YWx1ZSk7CiAgICAgIHJldHVybiB2YWx1ZTsK ICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBnZXQodGhpcywgZGVwZW5kZW50 S2V5KTsKICAgIH0KICB9KTsKfTsKCi8qKgogIFdoZXJlIGBjb21wdXRlZC5h bGlhc2AgYWxpYXNlcyBgZ2V0YCBhbmQgYHNldGAsIGFuZCBhbGxvd3MgZm9y IGJpZGlyZWN0aW9uYWwKICBkYXRhIGZsb3csIGBjb21wdXRlZC5vbmVXYXlg IG9ubHkgcHJvdmlkZXMgYW4gYWxpYXNlZCBgZ2V0YC4gVGhlIGBzZXRgIHdp bGwKICBub3QgbXV0YXRlIHRoZSB1cHN0cmVhbSBwcm9wZXJ0eSwgcmF0aGVy IGNhdXNlcyB0aGUgY3VycmVudCBwcm9wZXJ0eSB0bwogIGJlY29tZSB0aGUg dmFsdWUgc2V0LiBUaGlzIGNhdXNlcyB0aGUgZG93bnN0cmVhbSBwcm9wZXJ0 eSB0byBwZXJtZW50YW50bHkKICBkaXZlcmdlIGZyb20gdGhlIHVwc3RyZWFt IHByb3BlcnR5LgoKICBFeGFtcGxlCgogIGBgYGphdmFzY3JpcHQKICBVc2Vy ID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CiAgICBmaXJzdE5hbWU6IG51bGws CiAgICBsYXN0TmFtZTogbnVsbCwKICAgIG5pY2tOYW1lOiBFbWJlci5jb21w dXRlZC5vbmVXYXkoJ2ZpcnN0TmFtZScpCiAgfSk7CgogIHVzZXIgPSBVc2Vy LmNyZWF0ZSh7CiAgICBmaXJzdE5hbWU6ICdUZWRkeScsCiAgICBsYXN0TmFt ZTogICdaZWVubnknCiAgfSk7CgogIHVzZXIuZ2V0KCduaWNrTmFtZScpOwog ICMgJ1RlZGR5JwoKICB1c2VyLnNldCgnbmlja05hbWUnLCAnVGVkZHlCZWFy Jyk7CiAgIyAnVGVkZHlCZWFyJwoKICB1c2VyLmdldCgnZmlyc3ROYW1lJyk7 CiAgIyAnVGVkZHknCiAgYGBgCgogIEBtZXRob2QgY29tcHV0ZWQub25lV2F5 CiAgQGZvciBFbWJlcgogIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkK ICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlZCBw cm9wZXJ0eSB3aGljaCBjcmVhdGVzIGEKICBvbmUgd2F5IGNvbXB1dGVkIHBy b3BlcnR5IHRvIHRoZSBvcmlnaW5hbCB2YWx1ZSBmb3IgcHJvcGVydHkuCiov CkVtYmVyLmNvbXB1dGVkLm9uZVdheSA9IGZ1bmN0aW9uKGRlcGVuZGVudEtl eSkgewogIHJldHVybiBFbWJlci5jb21wdXRlZChkZXBlbmRlbnRLZXksIGZ1 bmN0aW9uKCkgewogICAgcmV0dXJuIGdldCh0aGlzLCBkZXBlbmRlbnRLZXkp OwogIH0pOwp9OwoKaWYgKEVtYmVyLkZFQVRVUkVTLmlzRW5hYmxlZCgncXVl cnktcGFyYW1zLW5ldycpKSB7CiAgLyoqCiAgICBUaGlzIGlzIGEgbW9yZSBz ZW1hbnRpY2FsbHkgbWVhbmluZ2Z1bCBhbGlhcyBvZiBgY29tcHV0ZWQub25l V2F5YCwKICAgIHdob3NlIG5hbWUgaXMgc29tZXdoYXQgYW1iaWd1b3VzIGFz IHRvIHdoaWNoIGRpcmVjdGlvbiB0aGUgZGF0YSBmbG93cy4KCiAgICBAbWV0 aG9kIGNvbXB1dGVkLnJlYWRzCiAgICBAZm9yIEVtYmVyCiAgICBAcGFyYW0g e1N0cmluZ30gZGVwZW5kZW50S2V5CiAgICBAcmV0dXJuIHtFbWJlci5Db21w dXRlZFByb3BlcnR5fSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCBjcmVhdGVz IGEKICAgICAgb25lIHdheSBjb21wdXRlZCBwcm9wZXJ0eSB0byB0aGUgb3Jp Z2luYWwgdmFsdWUgZm9yIHByb3BlcnR5LgogICAqLwogIEVtYmVyLmNvbXB1 dGVkLnJlYWRzID0gRW1iZXIuY29tcHV0ZWQub25lV2F5Owp9CgoKLyoqCiAg V2hlcmUgYGNvbXB1dGVkLm9uZVdheWAgcHJvdmlkZXMgb25lV2F5IGJpbmRp bmdzLCBgY29tcHV0ZWQucmVhZE9ubHlgIHByb3ZpZGVzCiAgYSByZWFkT25s eSBvbmUgd2F5IGJpbmRpbmcuIFZlcnkgb2Z0ZW4gd2hlbiB1c2luZyBgY29t cHV0ZWQub25lV2F5YCBvbmUgZG9lcwogIG5vdCBhbHNvIHdhbnQgY2hhbmdl cyB0byBwcm9wb2dhdGUgYmFjayB1cCwgYXMgdGhleSB3aWxsIHJlcGxhY2Ug dGhlIHZhbHVlLgoKICBUaGlzIHByZXZlbnRzIHRoZSByZXZlcnNlIGZsb3cs IGFuZCBhbHNvIHRocm93cyBhbiBleGNlcHRpb24gd2hlbiBpdCBvY2N1cnMu CgogIEV4YW1wbGUKCiAgYGBgamF2YXNjcmlwdAogIFVzZXIgPSBFbWJlci5P YmplY3QuZXh0ZW5kKHsKICAgIGZpcnN0TmFtZTogbnVsbCwKICAgIGxhc3RO YW1lOiBudWxsLAogICAgbmlja05hbWU6IEVtYmVyLmNvbXB1dGVkLnJlYWRP bmx5KCdmaXJzdE5hbWUnKQogIH0pOwoKICB1c2VyID0gVXNlci5jcmVhdGUo ewogICAgZmlyc3ROYW1lOiAnVGVkZHknLAogICAgbGFzdE5hbWU6ICAnWmVl bm55JwogIH0pOwoKICB1c2VyLmdldCgnbmlja05hbWUnKTsKICAjICdUZWRk eScKCiAgdXNlci5zZXQoJ25pY2tOYW1lJywgJ1RlZGR5QmVhcicpOwogICMg dGhyb3dzIEV4Y2VwdGlvbgogICMgdGhyb3cgbmV3IEVtYmVyLkVycm9yKCdD YW5ub3QgU2V0OiBuaWNrTmFtZSBvbjogPFVzZXI6ZW1iZXIyNzI4OD4nICk7 YAoKICB1c2VyLmdldCgnZmlyc3ROYW1lJyk7CiAgIyAnVGVkZHknCiAgYGBg CgogIEBtZXRob2QgY29tcHV0ZWQucmVhZE9ubHkKICBAZm9yIEVtYmVyCiAg QHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleQogIEByZXR1cm4ge0VtYmVy LkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIGNy ZWF0ZXMgYQogIG9uZSB3YXkgY29tcHV0ZWQgcHJvcGVydHkgdG8gdGhlIG9y aWdpbmFsIHZhbHVlIGZvciBwcm9wZXJ0eS4KKi8KRW1iZXIuY29tcHV0ZWQu cmVhZE9ubHkgPSBmdW5jdGlvbihkZXBlbmRlbnRLZXkpIHsKICByZXR1cm4g RW1iZXIuY29tcHV0ZWQoZGVwZW5kZW50S2V5LCBmdW5jdGlvbigpIHsKICAg IHJldHVybiBnZXQodGhpcywgZGVwZW5kZW50S2V5KTsKICB9KS5yZWFkT25s eSgpOwp9OwoKLyoqCiAgQSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IGFjdHMg bGlrZSBhIHN0YW5kYXJkIGdldHRlciBhbmQgc2V0dGVyLAogIGJ1dCByZXR1 cm5zIHRoZSB2YWx1ZSBhdCB0aGUgcHJvdmlkZWQgYGRlZmF1bHRQYXRoYCBp ZiB0aGUKICBwcm9wZXJ0eSBpdHNlbGYgaGFzIG5vdCBiZWVuIHNldCB0byBh IHZhbHVlCgogIEV4YW1wbGUKCiAgYGBgamF2YXNjcmlwdAogIHZhciBIYW1z dGVyID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CiAgICB3aXNoTGlzdDogRW1i ZXIuY29tcHV0ZWQuZGVmYXVsdFRvKCdmYXZvcml0ZUZvb2QnKQogIH0pOwog IHZhciBoYW1zdGVyID0gSGFtc3Rlci5jcmVhdGUoe2Zhdm9yaXRlRm9vZDog J0JhbmFuYSd9KTsKICBoYW1zdGVyLmdldCgnd2lzaExpc3QnKTsgLy8gJ0Jh bmFuYScKICBoYW1zdGVyLnNldCgnd2lzaExpc3QnLCAnTW9yZSBVbml0IFRl c3RzJyk7CiAgaGFtc3Rlci5nZXQoJ3dpc2hMaXN0Jyk7IC8vICdNb3JlIFVu aXQgVGVzdHMnCiAgaGFtc3Rlci5nZXQoJ2Zhdm9yaXRlRm9vZCcpOyAvLyAn QmFuYW5hJwogIGBgYAoKICBAbWV0aG9kIGNvbXB1dGVkLmRlZmF1bHRUbwog IEBmb3IgRW1iZXIKICBAcGFyYW0ge1N0cmluZ30gZGVmYXVsdFBhdGgKICBA cmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlZCBwcm9w ZXJ0eSB3aGljaCBhY3RzIGxpa2UKICBhIHN0YW5kYXJkIGdldHRlciBhbmQg c2V0dGVyLCBidXQgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIGZyb20gYGRlZmF1 bHRQYXRoYC4KKi8KRW1iZXIuY29tcHV0ZWQuZGVmYXVsdFRvID0gZnVuY3Rp b24oZGVmYXVsdFBhdGgpIHsKICByZXR1cm4gRW1iZXIuY29tcHV0ZWQoZnVu Y3Rpb24oa2V5LCBuZXdWYWx1ZSwgY2FjaGVkVmFsdWUpIHsKICAgIGlmIChh cmd1bWVudHMubGVuZ3RoID09PSAxKSB7CiAgICAgIHJldHVybiBnZXQodGhp cywgZGVmYXVsdFBhdGgpOwogICAgfQogICAgcmV0dXJuIG5ld1ZhbHVlICE9 IG51bGwgPyBuZXdWYWx1ZSA6IGdldCh0aGlzLCBkZWZhdWx0UGF0aCk7CiAg fSk7Cn07CgoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewovLyBFbWJlci50cnlG aW5hbGx5Ci8qKgpAbW9kdWxlIGVtYmVyLW1ldGFsCiovCgp2YXIgQUZURVJf T0JTRVJWRVJTID0gJzpjaGFuZ2UnLAogICAgQkVGT1JFX09CU0VSVkVSUyA9 ICc6YmVmb3JlJzsKCmZ1bmN0aW9uIGNoYW5nZUV2ZW50KGtleU5hbWUpIHsK ICByZXR1cm4ga2V5TmFtZStBRlRFUl9PQlNFUlZFUlM7Cn0KCmZ1bmN0aW9u IGJlZm9yZUV2ZW50KGtleU5hbWUpIHsKICByZXR1cm4ga2V5TmFtZStCRUZP UkVfT0JTRVJWRVJTOwp9CgovKioKICBAbWV0aG9kIGFkZE9ic2VydmVyCiAg QHBhcmFtIG9iagogIEBwYXJhbSB7U3RyaW5nfSBwYXRoCiAgQHBhcmFtIHtP YmplY3R8RnVuY3Rpb259IHRhcmdldE9yTWV0aG9kCiAgQHBhcmFtIHtGdW5j dGlvbnxTdHJpbmd9IFttZXRob2RdCiovCkVtYmVyLmFkZE9ic2VydmVyID0g ZnVuY3Rpb24ob2JqLCBfcGF0aCwgdGFyZ2V0LCBtZXRob2QpIHsKICBFbWJl ci5hZGRMaXN0ZW5lcihvYmosIGNoYW5nZUV2ZW50KF9wYXRoKSwgdGFyZ2V0 LCBtZXRob2QpOwogIEVtYmVyLndhdGNoKG9iaiwgX3BhdGgpOwoKICByZXR1 cm4gdGhpczsKfTsKCkVtYmVyLm9ic2VydmVyc0ZvciA9IGZ1bmN0aW9uKG9i aiwgcGF0aCkgewogIHJldHVybiBFbWJlci5saXN0ZW5lcnNGb3Iob2JqLCBj aGFuZ2VFdmVudChwYXRoKSk7Cn07CgovKioKICBAbWV0aG9kIHJlbW92ZU9i c2VydmVyCiAgQHBhcmFtIG9iagogIEBwYXJhbSB7U3RyaW5nfSBwYXRoCiAg QHBhcmFtIHtPYmplY3R8RnVuY3Rpb259IHRhcmdldE9yTWV0aG9kCiAgQHBh cmFtIHtGdW5jdGlvbnxTdHJpbmd9IFttZXRob2RdCiovCkVtYmVyLnJlbW92 ZU9ic2VydmVyID0gZnVuY3Rpb24ob2JqLCBfcGF0aCwgdGFyZ2V0LCBtZXRo b2QpIHsKICBFbWJlci51bndhdGNoKG9iaiwgX3BhdGgpOwogIEVtYmVyLnJl bW92ZUxpc3RlbmVyKG9iaiwgY2hhbmdlRXZlbnQoX3BhdGgpLCB0YXJnZXQs IG1ldGhvZCk7CgogIHJldHVybiB0aGlzOwp9OwoKLyoqCiAgQG1ldGhvZCBh ZGRCZWZvcmVPYnNlcnZlcgogIEBwYXJhbSBvYmoKICBAcGFyYW0ge1N0cmlu Z30gcGF0aAogIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSB0YXJnZXRPck1l dGhvZAogIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBbbWV0aG9kXQoqLwpF bWJlci5hZGRCZWZvcmVPYnNlcnZlciA9IGZ1bmN0aW9uKG9iaiwgX3BhdGgs IHRhcmdldCwgbWV0aG9kKSB7CiAgRW1iZXIuYWRkTGlzdGVuZXIob2JqLCBi ZWZvcmVFdmVudChfcGF0aCksIHRhcmdldCwgbWV0aG9kKTsKICBFbWJlci53 YXRjaChvYmosIF9wYXRoKTsKCiAgcmV0dXJuIHRoaXM7Cn07CgovLyBTdXNw ZW5kIG9ic2VydmVyIGR1cmluZyBjYWxsYmFjay4KLy8KLy8gVGhpcyBzaG91 bGQgb25seSBiZSB1c2VkIGJ5IHRoZSB0YXJnZXQgb2YgdGhlIG9ic2VydmVy Ci8vIHdoaWxlIGl0IGlzIHNldHRpbmcgdGhlIG9ic2VydmVkIHBhdGguCkVt YmVyLl9zdXNwZW5kQmVmb3JlT2JzZXJ2ZXIgPSBmdW5jdGlvbihvYmosIHBh dGgsIHRhcmdldCwgbWV0aG9kLCBjYWxsYmFjaykgewogIHJldHVybiBFbWJl ci5fc3VzcGVuZExpc3RlbmVyKG9iaiwgYmVmb3JlRXZlbnQocGF0aCksIHRh cmdldCwgbWV0aG9kLCBjYWxsYmFjayk7Cn07CgpFbWJlci5fc3VzcGVuZE9i c2VydmVyID0gZnVuY3Rpb24ob2JqLCBwYXRoLCB0YXJnZXQsIG1ldGhvZCwg Y2FsbGJhY2spIHsKICByZXR1cm4gRW1iZXIuX3N1c3BlbmRMaXN0ZW5lcihv YmosIGNoYW5nZUV2ZW50KHBhdGgpLCB0YXJnZXQsIG1ldGhvZCwgY2FsbGJh Y2spOwp9OwoKdmFyIG1hcCA9IEVtYmVyLkFycmF5UG9seWZpbGxzLm1hcDsK CkVtYmVyLl9zdXNwZW5kQmVmb3JlT2JzZXJ2ZXJzID0gZnVuY3Rpb24ob2Jq LCBwYXRocywgdGFyZ2V0LCBtZXRob2QsIGNhbGxiYWNrKSB7CiAgdmFyIGV2 ZW50cyA9IG1hcC5jYWxsKHBhdGhzLCBiZWZvcmVFdmVudCk7CiAgcmV0dXJu IEVtYmVyLl9zdXNwZW5kTGlzdGVuZXJzKG9iaiwgZXZlbnRzLCB0YXJnZXQs IG1ldGhvZCwgY2FsbGJhY2spOwp9OwoKRW1iZXIuX3N1c3BlbmRPYnNlcnZl cnMgPSBmdW5jdGlvbihvYmosIHBhdGhzLCB0YXJnZXQsIG1ldGhvZCwgY2Fs bGJhY2spIHsKICB2YXIgZXZlbnRzID0gbWFwLmNhbGwocGF0aHMsIGNoYW5n ZUV2ZW50KTsKICByZXR1cm4gRW1iZXIuX3N1c3BlbmRMaXN0ZW5lcnMob2Jq LCBldmVudHMsIHRhcmdldCwgbWV0aG9kLCBjYWxsYmFjayk7Cn07CgpFbWJl ci5iZWZvcmVPYnNlcnZlcnNGb3IgPSBmdW5jdGlvbihvYmosIHBhdGgpIHsK ICByZXR1cm4gRW1iZXIubGlzdGVuZXJzRm9yKG9iaiwgYmVmb3JlRXZlbnQo cGF0aCkpOwp9OwoKLyoqCiAgQG1ldGhvZCByZW1vdmVCZWZvcmVPYnNlcnZl cgogIEBwYXJhbSBvYmoKICBAcGFyYW0ge1N0cmluZ30gcGF0aAogIEBwYXJh bSB7T2JqZWN0fEZ1bmN0aW9ufSB0YXJnZXRPck1ldGhvZAogIEBwYXJhbSB7 RnVuY3Rpb258U3RyaW5nfSBbbWV0aG9kXQoqLwpFbWJlci5yZW1vdmVCZWZv cmVPYnNlcnZlciA9IGZ1bmN0aW9uKG9iaiwgX3BhdGgsIHRhcmdldCwgbWV0 aG9kKSB7CiAgRW1iZXIudW53YXRjaChvYmosIF9wYXRoKTsKICBFbWJlci5y ZW1vdmVMaXN0ZW5lcihvYmosIGJlZm9yZUV2ZW50KF9wYXRoKSwgdGFyZ2V0 LCBtZXRob2QpOwoKICByZXR1cm4gdGhpczsKfTsKCn0pKCk7CgoKCihmdW5j dGlvbigpIHsKZGVmaW5lKCJiYWNrYnVybmVyL3F1ZXVlIiwgCiAgWyJleHBv cnRzIl0sCiAgZnVuY3Rpb24oX19leHBvcnRzX18pIHsKICAgICJ1c2Ugc3Ry aWN0IjsKICAgIGZ1bmN0aW9uIFF1ZXVlKGRhcSwgbmFtZSwgb3B0aW9ucykg ewogICAgICB0aGlzLmRhcSA9IGRhcTsKICAgICAgdGhpcy5uYW1lID0gbmFt ZTsKICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgICAgdGhpcy5f cXVldWUgPSBbXTsKICAgIH0KCiAgICBRdWV1ZS5wcm90b3R5cGUgPSB7CiAg ICAgIGRhcTogbnVsbCwKICAgICAgbmFtZTogbnVsbCwKICAgICAgb3B0aW9u czogbnVsbCwKICAgICAgX3F1ZXVlOiBudWxsLAoKICAgICAgcHVzaDogZnVu Y3Rpb24odGFyZ2V0LCBtZXRob2QsIGFyZ3MsIHN0YWNrKSB7CiAgICAgICAg dmFyIHF1ZXVlID0gdGhpcy5fcXVldWU7CiAgICAgICAgcXVldWUucHVzaCh0 YXJnZXQsIG1ldGhvZCwgYXJncywgc3RhY2spOwogICAgICAgIHJldHVybiB7 cXVldWU6IHRoaXMsIHRhcmdldDogdGFyZ2V0LCBtZXRob2Q6IG1ldGhvZH07 CiAgICAgIH0sCgogICAgICBwdXNoVW5pcXVlOiBmdW5jdGlvbih0YXJnZXQs IG1ldGhvZCwgYXJncywgc3RhY2spIHsKICAgICAgICB2YXIgcXVldWUgPSB0 aGlzLl9xdWV1ZSwgY3VycmVudFRhcmdldCwgY3VycmVudE1ldGhvZCwgaSwg bDsKCiAgICAgICAgZm9yIChpID0gMCwgbCA9IHF1ZXVlLmxlbmd0aDsgaSA8 IGw7IGkgKz0gNCkgewogICAgICAgICAgY3VycmVudFRhcmdldCA9IHF1ZXVl W2ldOwogICAgICAgICAgY3VycmVudE1ldGhvZCA9IHF1ZXVlW2krMV07Cgog ICAgICAgICAgaWYgKGN1cnJlbnRUYXJnZXQgPT09IHRhcmdldCAmJiBjdXJy ZW50TWV0aG9kID09PSBtZXRob2QpIHsKICAgICAgICAgICAgcXVldWVbaSsy XSA9IGFyZ3M7IC8vIHJlcGxhY2UgYXJncwogICAgICAgICAgICBxdWV1ZVtp KzNdID0gc3RhY2s7IC8vIHJlcGxhY2Ugc3RhY2sKICAgICAgICAgICAgcmV0 dXJuIHtxdWV1ZTogdGhpcywgdGFyZ2V0OiB0YXJnZXQsIG1ldGhvZDogbWV0 aG9kfTsgLy8gVE9ETzogdGVzdCB0aGlzIGNvZGUgcGF0aAogICAgICAgICAg fQogICAgICAgIH0KCiAgICAgICAgdGhpcy5fcXVldWUucHVzaCh0YXJnZXQs IG1ldGhvZCwgYXJncywgc3RhY2spOwogICAgICAgIHJldHVybiB7cXVldWU6 IHRoaXMsIHRhcmdldDogdGFyZ2V0LCBtZXRob2Q6IG1ldGhvZH07CiAgICAg IH0sCgogICAgICAvLyBUT0RPOiByZW1vdmUgbWUsIG9ubHkgYmVpbmcgdXNl ZCBmb3IgRW1iZXIucnVuLnN5bmMKICAgICAgZmx1c2g6IGZ1bmN0aW9uKCkg ewogICAgICAgIHZhciBxdWV1ZSA9IHRoaXMuX3F1ZXVlLAogICAgICAgICAg ICBvcHRpb25zID0gdGhpcy5vcHRpb25zLAogICAgICAgICAgICBiZWZvcmUg PSBvcHRpb25zICYmIG9wdGlvbnMuYmVmb3JlLAogICAgICAgICAgICBhZnRl ciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5hZnRlciwKICAgICAgICAgICAgdGFy Z2V0LCBtZXRob2QsIGFyZ3MsIHN0YWNrLCBpLCBsID0gcXVldWUubGVuZ3Ro OwoKICAgICAgICBpZiAobCAmJiBiZWZvcmUpIHsgYmVmb3JlKCk7IH0KICAg ICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSArPSA0KSB7CiAgICAgICAgICB0 YXJnZXQgPSBxdWV1ZVtpXTsKICAgICAgICAgIG1ldGhvZCA9IHF1ZXVlW2kr MV07CiAgICAgICAgICBhcmdzICAgPSBxdWV1ZVtpKzJdOwogICAgICAgICAg c3RhY2sgID0gcXVldWVbaSszXTsgLy8gRGVidWdnaW5nIGFzc2lzdGFuY2UK CiAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZwogICAgICAgICAg aWYgKGFyZ3MgJiYgYXJncy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIG1l dGhvZC5hcHBseSh0YXJnZXQsIGFyZ3MpOwogICAgICAgICAgfSBlbHNlIHsK ICAgICAgICAgICAgbWV0aG9kLmNhbGwodGFyZ2V0KTsKICAgICAgICAgIH0K ICAgICAgICB9CiAgICAgICAgaWYgKGwgJiYgYWZ0ZXIpIHsgYWZ0ZXIoKTsg fQoKICAgICAgICAvLyBjaGVjayBpZiBuZXcgaXRlbXMgaGF2ZSBiZWVuIGFk ZGVkCiAgICAgICAgaWYgKHF1ZXVlLmxlbmd0aCA+IGwpIHsKICAgICAgICAg IHRoaXMuX3F1ZXVlID0gcXVldWUuc2xpY2UobCk7CiAgICAgICAgICB0aGlz LmZsdXNoKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX3F1 ZXVlLmxlbmd0aCA9IDA7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgY2Fu Y2VsOiBmdW5jdGlvbihhY3Rpb25Ub0NhbmNlbCkgewogICAgICAgIHZhciBx dWV1ZSA9IHRoaXMuX3F1ZXVlLCBjdXJyZW50VGFyZ2V0LCBjdXJyZW50TWV0 aG9kLCBpLCBsOwoKICAgICAgICBmb3IgKGkgPSAwLCBsID0gcXVldWUubGVu Z3RoOyBpIDwgbDsgaSArPSA0KSB7CiAgICAgICAgICBjdXJyZW50VGFyZ2V0 ID0gcXVldWVbaV07CiAgICAgICAgICBjdXJyZW50TWV0aG9kID0gcXVldWVb aSsxXTsKCiAgICAgICAgICBpZiAoY3VycmVudFRhcmdldCA9PT0gYWN0aW9u VG9DYW5jZWwudGFyZ2V0ICYmIGN1cnJlbnRNZXRob2QgPT09IGFjdGlvblRv Q2FuY2VsLm1ldGhvZCkgewogICAgICAgICAgICBxdWV1ZS5zcGxpY2UoaSwg NCk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAg ICAgIH0KCiAgICAgICAgLy8gaWYgbm90IGZvdW5kIGluIGN1cnJlbnQgcXVl dWUKICAgICAgICAvLyBjb3VsZCBiZSBpbiB0aGUgcXVldWUgdGhhdCBpcyBi ZWluZyBmbHVzaGVkCiAgICAgICAgcXVldWUgPSB0aGlzLl9xdWV1ZUJlaW5n Rmx1c2hlZDsKICAgICAgICBpZiAoIXF1ZXVlKSB7CiAgICAgICAgICByZXR1 cm47CiAgICAgICAgfQogICAgICAgIGZvciAoaSA9IDAsIGwgPSBxdWV1ZS5s ZW5ndGg7IGkgPCBsOyBpICs9IDQpIHsKICAgICAgICAgIGN1cnJlbnRUYXJn ZXQgPSBxdWV1ZVtpXTsKICAgICAgICAgIGN1cnJlbnRNZXRob2QgPSBxdWV1 ZVtpKzFdOwoKICAgICAgICAgIGlmIChjdXJyZW50VGFyZ2V0ID09PSBhY3Rp b25Ub0NhbmNlbC50YXJnZXQgJiYgY3VycmVudE1ldGhvZCA9PT0gYWN0aW9u VG9DYW5jZWwubWV0aG9kKSB7CiAgICAgICAgICAgIC8vIGRvbid0IG1lc3Mg d2l0aCBhcnJheSBkdXJpbmcgZmx1c2gKICAgICAgICAgICAgLy8ganVzdCBu dWxsaWZ5IHRoZSBtZXRob2QKICAgICAgICAgICAgcXVldWVbaSsxXSA9IG51 bGw7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAg ICAgIH0KICAgICAgfQogICAgfTsKCiAgICBfX2V4cG9ydHNfXy5RdWV1ZSA9 IFF1ZXVlOwogIH0pOwoKZGVmaW5lKCJiYWNrYnVybmVyL2RlZmVycmVkX2Fj dGlvbl9xdWV1ZXMiLCAKICBbImJhY2tidXJuZXIvcXVldWUiLCJleHBvcnRz Il0sCiAgZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2V4cG9ydHNfXykg ewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFF1ZXVlID0gX19kZXBlbmRl bmN5MV9fLlF1ZXVlOwoKICAgIGZ1bmN0aW9uIERlZmVycmVkQWN0aW9uUXVl dWVzKHF1ZXVlTmFtZXMsIG9wdGlvbnMpIHsKICAgICAgdmFyIHF1ZXVlcyA9 IHRoaXMucXVldWVzID0ge307CiAgICAgIHRoaXMucXVldWVOYW1lcyA9IHF1 ZXVlTmFtZXMgPSBxdWV1ZU5hbWVzIHx8IFtdOwoKICAgICAgdmFyIHF1ZXVl TmFtZTsKICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBxdWV1ZU5hbWVzLmxl bmd0aDsgaSA8IGw7IGkrKykgewogICAgICAgIHF1ZXVlTmFtZSA9IHF1ZXVl TmFtZXNbaV07CiAgICAgICAgcXVldWVzW3F1ZXVlTmFtZV0gPSBuZXcgUXVl dWUodGhpcywgcXVldWVOYW1lLCBvcHRpb25zW3F1ZXVlTmFtZV0pOwogICAg ICB9CiAgICB9CgogICAgRGVmZXJyZWRBY3Rpb25RdWV1ZXMucHJvdG90eXBl ID0gewogICAgICBxdWV1ZU5hbWVzOiBudWxsLAogICAgICBxdWV1ZXM6IG51 bGwsCgogICAgICBzY2hlZHVsZTogZnVuY3Rpb24ocXVldWVOYW1lLCB0YXJn ZXQsIG1ldGhvZCwgYXJncywgb25jZUZsYWcsIHN0YWNrKSB7CiAgICAgICAg dmFyIHF1ZXVlcyA9IHRoaXMucXVldWVzLAogICAgICAgICAgICBxdWV1ZSA9 IHF1ZXVlc1txdWV1ZU5hbWVdOwoKICAgICAgICBpZiAoIXF1ZXVlKSB7IHRo cm93IG5ldyBFcnJvcigiWW91IGF0dGVtcHRlZCB0byBzY2hlZHVsZSBhbiBh Y3Rpb24gaW4gYSBxdWV1ZSAoIiArIHF1ZXVlTmFtZSArICIpIHRoYXQgZG9l c24ndCBleGlzdCIpOyB9CgogICAgICAgIGlmIChvbmNlRmxhZykgewogICAg ICAgICAgcmV0dXJuIHF1ZXVlLnB1c2hVbmlxdWUodGFyZ2V0LCBtZXRob2Qs IGFyZ3MsIHN0YWNrKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0 dXJuIHF1ZXVlLnB1c2godGFyZ2V0LCBtZXRob2QsIGFyZ3MsIHN0YWNrKTsK ICAgICAgICB9CiAgICAgIH0sCgogICAgICBmbHVzaDogZnVuY3Rpb24oKSB7 CiAgICAgICAgdmFyIHF1ZXVlcyA9IHRoaXMucXVldWVzLAogICAgICAgICAg ICBxdWV1ZU5hbWVzID0gdGhpcy5xdWV1ZU5hbWVzLAogICAgICAgICAgICBx dWV1ZU5hbWUsIHF1ZXVlLCBxdWV1ZUl0ZW1zLCBwcmlvclF1ZXVlTmFtZUlu ZGV4LAogICAgICAgICAgICBxdWV1ZU5hbWVJbmRleCA9IDAsIG51bWJlck9m UXVldWVzID0gcXVldWVOYW1lcy5sZW5ndGg7CgogICAgICAgIG91dGVybG9v cDoKICAgICAgICB3aGlsZSAocXVldWVOYW1lSW5kZXggPCBudW1iZXJPZlF1 ZXVlcykgewogICAgICAgICAgcXVldWVOYW1lID0gcXVldWVOYW1lc1txdWV1 ZU5hbWVJbmRleF07CiAgICAgICAgICBxdWV1ZSA9IHF1ZXVlc1txdWV1ZU5h bWVdOwogICAgICAgICAgcXVldWVJdGVtcyA9IHF1ZXVlLl9xdWV1ZUJlaW5n Rmx1c2hlZCA9IHF1ZXVlLl9xdWV1ZS5zbGljZSgpOwogICAgICAgICAgcXVl dWUuX3F1ZXVlID0gW107CgogICAgICAgICAgdmFyIG9wdGlvbnMgPSBxdWV1 ZS5vcHRpb25zLAogICAgICAgICAgICAgIGJlZm9yZSA9IG9wdGlvbnMgJiYg b3B0aW9ucy5iZWZvcmUsCiAgICAgICAgICAgICAgYWZ0ZXIgPSBvcHRpb25z ICYmIG9wdGlvbnMuYWZ0ZXIsCiAgICAgICAgICAgICAgdGFyZ2V0LCBtZXRo b2QsIGFyZ3MsIHN0YWNrLAogICAgICAgICAgICAgIHF1ZXVlSW5kZXggPSAw LCBudW1iZXJPZlF1ZXVlSXRlbXMgPSBxdWV1ZUl0ZW1zLmxlbmd0aDsKCiAg ICAgICAgICBpZiAobnVtYmVyT2ZRdWV1ZUl0ZW1zICYmIGJlZm9yZSkgeyBi ZWZvcmUoKTsgfQogICAgICAgICAgd2hpbGUgKHF1ZXVlSW5kZXggPCBudW1i ZXJPZlF1ZXVlSXRlbXMpIHsKICAgICAgICAgICAgdGFyZ2V0ID0gcXVldWVJ dGVtc1txdWV1ZUluZGV4XTsKICAgICAgICAgICAgbWV0aG9kID0gcXVldWVJ dGVtc1txdWV1ZUluZGV4KzFdOwogICAgICAgICAgICBhcmdzICAgPSBxdWV1 ZUl0ZW1zW3F1ZXVlSW5kZXgrMl07CiAgICAgICAgICAgIHN0YWNrICA9IHF1 ZXVlSXRlbXNbcXVldWVJbmRleCszXTsgLy8gRGVidWdnaW5nIGFzc2lzdGFu Y2UKCiAgICAgICAgICAgIGlmICh0eXBlb2YgbWV0aG9kID09PSAnc3RyaW5n JykgeyBtZXRob2QgPSB0YXJnZXRbbWV0aG9kXTsgfQoKICAgICAgICAgICAg Ly8gbWV0aG9kIGNvdWxkIGhhdmUgYmVlbiBudWxsaWZpZWQgLyBjYW5jZWxl ZCBkdXJpbmcgZmx1c2gKICAgICAgICAgICAgaWYgKG1ldGhvZCkgewogICAg ICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nCiAgICAgICAgICAg ICAgaWYgKGFyZ3MgJiYgYXJncy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAg ICAgICBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmdzKTsKICAgICAgICAgICAg ICB9IGVsc2UgewogICAgICAgICAgICAgICAgbWV0aG9kLmNhbGwodGFyZ2V0 KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAg IHF1ZXVlSW5kZXggKz0gNDsKICAgICAgICAgIH0KICAgICAgICAgIHF1ZXVl Ll9xdWV1ZUJlaW5nRmx1c2hlZCA9IG51bGw7CiAgICAgICAgICBpZiAobnVt YmVyT2ZRdWV1ZUl0ZW1zICYmIGFmdGVyKSB7IGFmdGVyKCk7IH0KCiAgICAg ICAgICBpZiAoKHByaW9yUXVldWVOYW1lSW5kZXggPSBpbmRleE9mUHJpb3JR dWV1ZVdpdGhBY3Rpb25zKHRoaXMsIHF1ZXVlTmFtZUluZGV4KSkgIT09IC0x KSB7CiAgICAgICAgICAgIHF1ZXVlTmFtZUluZGV4ID0gcHJpb3JRdWV1ZU5h bWVJbmRleDsKICAgICAgICAgICAgY29udGludWUgb3V0ZXJsb29wOwogICAg ICAgICAgfQoKICAgICAgICAgIHF1ZXVlTmFtZUluZGV4Kys7CiAgICAgICAg fQogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGluZGV4T2ZQcmlvclF1 ZXVlV2l0aEFjdGlvbnMoZGFxLCBjdXJyZW50UXVldWVJbmRleCkgewogICAg ICB2YXIgcXVldWVOYW1lLCBxdWV1ZTsKCiAgICAgIGZvciAodmFyIGkgPSAw LCBsID0gY3VycmVudFF1ZXVlSW5kZXg7IGkgPD0gbDsgaSsrKSB7CiAgICAg ICAgcXVldWVOYW1lID0gZGFxLnF1ZXVlTmFtZXNbaV07CiAgICAgICAgcXVl dWUgPSBkYXEucXVldWVzW3F1ZXVlTmFtZV07CiAgICAgICAgaWYgKHF1ZXVl Ll9xdWV1ZS5sZW5ndGgpIHsgcmV0dXJuIGk7IH0KICAgICAgfQoKICAgICAg cmV0dXJuIC0xOwogICAgfQoKICAgIF9fZXhwb3J0c19fLkRlZmVycmVkQWN0 aW9uUXVldWVzID0gRGVmZXJyZWRBY3Rpb25RdWV1ZXM7CiAgfSk7CgpkZWZp bmUoImJhY2tidXJuZXIiLCAKICBbImJhY2tidXJuZXIvZGVmZXJyZWRfYWN0 aW9uX3F1ZXVlcyIsImV4cG9ydHMiXSwKICBmdW5jdGlvbihfX2RlcGVuZGVu Y3kxX18sIF9fZXhwb3J0c19fKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2 YXIgRGVmZXJyZWRBY3Rpb25RdWV1ZXMgPSBfX2RlcGVuZGVuY3kxX18uRGVm ZXJyZWRBY3Rpb25RdWV1ZXM7CgogICAgdmFyIHNsaWNlID0gW10uc2xpY2Us CiAgICAgICAgcG9wID0gW10ucG9wLAogICAgICAgIHRocm90dGxlcnMgPSBb XSwKICAgICAgICBkZWJvdW5jZWVzID0gW10sCiAgICAgICAgdGltZXJzID0g W10sCiAgICAgICAgYXV0b3J1biwgbGF0ZXJUaW1lciwgbGF0ZXJUaW1lckV4 cGlyZXNBdCwKICAgICAgICBnbG9iYWwgPSB0aGlzLAogICAgICAgIE5VTUJF UiA9IC9cZCsvOwoKICAgIGZ1bmN0aW9uIGlzQ29lcmNhYmxlTnVtYmVyKG51 bWJlcikgewogICAgICByZXR1cm4gdHlwZW9mIG51bWJlciA9PT0gJ251bWJl cicgfHwgTlVNQkVSLnRlc3QobnVtYmVyKTsKICAgIH0KCiAgICBmdW5jdGlv biBCYWNrYnVybmVyKHF1ZXVlTmFtZXMsIG9wdGlvbnMpIHsKICAgICAgdGhp cy5xdWV1ZU5hbWVzID0gcXVldWVOYW1lczsKICAgICAgdGhpcy5vcHRpb25z ID0gb3B0aW9ucyB8fCB7fTsKICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGVm YXVsdFF1ZXVlKSB7CiAgICAgICAgdGhpcy5vcHRpb25zLmRlZmF1bHRRdWV1 ZSA9IHF1ZXVlTmFtZXNbMF07CiAgICAgIH0KICAgICAgdGhpcy5pbnN0YW5j ZVN0YWNrID0gW107CiAgICB9CgogICAgQmFja2J1cm5lci5wcm90b3R5cGUg PSB7CiAgICAgIHF1ZXVlTmFtZXM6IG51bGwsCiAgICAgIG9wdGlvbnM6IG51 bGwsCiAgICAgIGN1cnJlbnRJbnN0YW5jZTogbnVsbCwKICAgICAgaW5zdGFu Y2VTdGFjazogbnVsbCwKCiAgICAgIGJlZ2luOiBmdW5jdGlvbigpIHsKICAg ICAgICB2YXIgb25CZWdpbiA9IHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlv bnMub25CZWdpbiwKICAgICAgICAgICAgcHJldmlvdXNJbnN0YW5jZSA9IHRo aXMuY3VycmVudEluc3RhbmNlOwoKICAgICAgICBpZiAocHJldmlvdXNJbnN0 YW5jZSkgewogICAgICAgICAgdGhpcy5pbnN0YW5jZVN0YWNrLnB1c2gocHJl dmlvdXNJbnN0YW5jZSk7CiAgICAgICAgfQoKICAgICAgICB0aGlzLmN1cnJl bnRJbnN0YW5jZSA9IG5ldyBEZWZlcnJlZEFjdGlvblF1ZXVlcyh0aGlzLnF1 ZXVlTmFtZXMsIHRoaXMub3B0aW9ucyk7CiAgICAgICAgaWYgKG9uQmVnaW4p IHsKICAgICAgICAgIG9uQmVnaW4odGhpcy5jdXJyZW50SW5zdGFuY2UsIHBy ZXZpb3VzSW5zdGFuY2UpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIGVu ZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIG9uRW5kID0gdGhpcy5vcHRp b25zICYmIHRoaXMub3B0aW9ucy5vbkVuZCwKICAgICAgICAgICAgY3VycmVu dEluc3RhbmNlID0gdGhpcy5jdXJyZW50SW5zdGFuY2UsCiAgICAgICAgICAg IG5leHRJbnN0YW5jZSA9IG51bGw7CgogICAgICAgIHRyeSB7CiAgICAgICAg ICBjdXJyZW50SW5zdGFuY2UuZmx1c2goKTsKICAgICAgICB9IGZpbmFsbHkg ewogICAgICAgICAgdGhpcy5jdXJyZW50SW5zdGFuY2UgPSBudWxsOwoKICAg ICAgICAgIGlmICh0aGlzLmluc3RhbmNlU3RhY2subGVuZ3RoKSB7CiAgICAg ICAgICAgIG5leHRJbnN0YW5jZSA9IHRoaXMuaW5zdGFuY2VTdGFjay5wb3Ao KTsKICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5zdGFuY2UgPSBuZXh0SW5z dGFuY2U7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKG9uRW5kKSB7CiAg ICAgICAgICAgIG9uRW5kKGN1cnJlbnRJbnN0YW5jZSwgbmV4dEluc3RhbmNl KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCgogICAgICBydW46 IGZ1bmN0aW9uKHRhcmdldCwgbWV0aG9kIC8qLCBhcmdzICovKSB7CiAgICAg ICAgdmFyIHJldDsKICAgICAgICB0aGlzLmJlZ2luKCk7CgogICAgICAgIGlm ICghbWV0aG9kKSB7CiAgICAgICAgICBtZXRob2QgPSB0YXJnZXQ7CiAgICAg ICAgICB0YXJnZXQgPSBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKHR5 cGVvZiBtZXRob2QgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICBtZXRob2Qg PSB0YXJnZXRbbWV0aG9kXTsKICAgICAgICB9CgogICAgICAgIC8vIFByZXZl bnQgU2FmYXJpIGRvdWJsZS1maW5hbGx5LgogICAgICAgIHZhciBmaW5hbGx5 QWxyZWFkeUNhbGxlZCA9IGZhbHNlOwogICAgICAgIHRyeSB7CiAgICAgICAg ICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHsKICAgICAgICAgICAgcmV0 ID0gbWV0aG9kLmFwcGx5KHRhcmdldCwgc2xpY2UuY2FsbChhcmd1bWVudHMs IDIpKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldCA9IG1l dGhvZC5jYWxsKHRhcmdldCk7CiAgICAgICAgICB9CiAgICAgICAgfSBmaW5h bGx5IHsKICAgICAgICAgIGlmICghZmluYWxseUFscmVhZHlDYWxsZWQpIHsK ICAgICAgICAgICAgZmluYWxseUFscmVhZHlDYWxsZWQgPSB0cnVlOwogICAg ICAgICAgICB0aGlzLmVuZCgpOwogICAgICAgICAgfQogICAgICAgIH0KICAg ICAgICByZXR1cm4gcmV0OwogICAgICB9LAoKICAgICAgZGVmZXI6IGZ1bmN0 aW9uKHF1ZXVlTmFtZSwgdGFyZ2V0LCBtZXRob2QgLyogLCBhcmdzICovKSB7 CiAgICAgICAgaWYgKCFtZXRob2QpIHsKICAgICAgICAgIG1ldGhvZCA9IHRh cmdldDsKICAgICAgICAgIHRhcmdldCA9IG51bGw7CiAgICAgICAgfQoKICAg ICAgICBpZiAodHlwZW9mIG1ldGhvZCA9PT0gJ3N0cmluZycpIHsKICAgICAg ICAgIG1ldGhvZCA9IHRhcmdldFttZXRob2RdOwogICAgICAgIH0KCiAgICAg ICAgdmFyIHN0YWNrID0gdGhpcy5ERUJVRyA/IG5ldyBFcnJvcigpIDogdW5k ZWZpbmVkLAogICAgICAgICAgICBhcmdzID0gYXJndW1lbnRzLmxlbmd0aCA+ IDMgPyBzbGljZS5jYWxsKGFyZ3VtZW50cywgMykgOiB1bmRlZmluZWQ7CiAg ICAgICAgaWYgKCF0aGlzLmN1cnJlbnRJbnN0YW5jZSkgeyBjcmVhdGVBdXRv cnVuKHRoaXMpOyB9CiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudEluc3Rh bmNlLnNjaGVkdWxlKHF1ZXVlTmFtZSwgdGFyZ2V0LCBtZXRob2QsIGFyZ3Ms IGZhbHNlLCBzdGFjayk7CiAgICAgIH0sCgogICAgICBkZWZlck9uY2U6IGZ1 bmN0aW9uKHF1ZXVlTmFtZSwgdGFyZ2V0LCBtZXRob2QgLyogLCBhcmdzICov KSB7CiAgICAgICAgaWYgKCFtZXRob2QpIHsKICAgICAgICAgIG1ldGhvZCA9 IHRhcmdldDsKICAgICAgICAgIHRhcmdldCA9IG51bGw7CiAgICAgICAgfQoK ICAgICAgICBpZiAodHlwZW9mIG1ldGhvZCA9PT0gJ3N0cmluZycpIHsKICAg ICAgICAgIG1ldGhvZCA9IHRhcmdldFttZXRob2RdOwogICAgICAgIH0KCiAg ICAgICAgdmFyIHN0YWNrID0gdGhpcy5ERUJVRyA/IG5ldyBFcnJvcigpIDog dW5kZWZpbmVkLAogICAgICAgICAgICBhcmdzID0gYXJndW1lbnRzLmxlbmd0 aCA+IDMgPyBzbGljZS5jYWxsKGFyZ3VtZW50cywgMykgOiB1bmRlZmluZWQ7 CiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRJbnN0YW5jZSkgeyBjcmVhdGVB dXRvcnVuKHRoaXMpOyB9CiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudElu c3RhbmNlLnNjaGVkdWxlKHF1ZXVlTmFtZSwgdGFyZ2V0LCBtZXRob2QsIGFy Z3MsIHRydWUsIHN0YWNrKTsKICAgICAgfSwKCiAgICAgIHNldFRpbWVvdXQ6 IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChh cmd1bWVudHMpOwogICAgICAgIHZhciBsZW5ndGggPSBhcmdzLmxlbmd0aDsK ICAgICAgICB2YXIgbWV0aG9kLCB3YWl0LCB0YXJnZXQ7CiAgICAgICAgdmFy IHNlbGYgPSB0aGlzOwogICAgICAgIHZhciBtZXRob2RPclRhcmdldCwgbWV0 aG9kT3JXYWl0LCBtZXRob2RPckFyZ3M7CgogICAgICAgIGlmIChsZW5ndGgg PT09IDApIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9IGVsc2UgaWYg KGxlbmd0aCA9PT0gMSkgewogICAgICAgICAgbWV0aG9kID0gYXJncy5zaGlm dCgpOwogICAgICAgICAgd2FpdCA9IDA7CiAgICAgICAgfSBlbHNlIGlmIChs ZW5ndGggPT09IDIpIHsKICAgICAgICAgIG1ldGhvZE9yVGFyZ2V0ID0gYXJn c1swXTsKICAgICAgICAgIG1ldGhvZE9yV2FpdCA9IGFyZ3NbMV07CgogICAg ICAgICAgaWYgKHR5cGVvZiBtZXRob2RPcldhaXQgPT09ICdmdW5jdGlvbicg fHwgdHlwZW9mICBtZXRob2RPclRhcmdldFttZXRob2RPcldhaXRdID09PSAn ZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHRhcmdldCA9IGFyZ3Muc2hpZnQo KTsKICAgICAgICAgICAgbWV0aG9kID0gYXJncy5zaGlmdCgpOwogICAgICAg ICAgICB3YWl0ID0gMDsKICAgICAgICAgIH0gZWxzZSBpZiAoaXNDb2VyY2Fi bGVOdW1iZXIobWV0aG9kT3JXYWl0KSkgewogICAgICAgICAgICBtZXRob2Qg PSBhcmdzLnNoaWZ0KCk7CiAgICAgICAgICAgIHdhaXQgPSBhcmdzLnNoaWZ0 KCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtZXRob2QgPSBh cmdzLnNoaWZ0KCk7CiAgICAgICAgICAgIHdhaXQgPSAgMDsKICAgICAgICAg IH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIGxhc3QgPSBhcmdz W2FyZ3MubGVuZ3RoIC0gMV07CgogICAgICAgICAgaWYgKGlzQ29lcmNhYmxl TnVtYmVyKGxhc3QpKSB7CiAgICAgICAgICAgIHdhaXQgPSBhcmdzLnBvcCgp OwogICAgICAgICAgfQoKICAgICAgICAgIG1ldGhvZE9yVGFyZ2V0ID0gYXJn c1swXTsKICAgICAgICAgIG1ldGhvZE9yQXJncyA9IGFyZ3NbMV07CgogICAg ICAgICAgaWYgKHR5cGVvZiBtZXRob2RPckFyZ3MgPT09ICdmdW5jdGlvbicg fHwgKHR5cGVvZiBtZXRob2RPckFyZ3MgPT09ICdzdHJpbmcnICYmCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgbWV0aG9kT3JUYXJnZXQgIT09IG51bGwgJiYKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RP ckFyZ3MgaW4gbWV0aG9kT3JUYXJnZXQpKSB7CiAgICAgICAgICAgIHRhcmdl dCA9IGFyZ3Muc2hpZnQoKTsKICAgICAgICAgICAgbWV0aG9kID0gYXJncy5z aGlmdCgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbWV0aG9k ID0gYXJncy5zaGlmdCgpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAg ICAgdmFyIGV4ZWN1dGVBdCA9ICgrbmV3IERhdGUoKSkgKyBwYXJzZUludCh3 YWl0LCAxMCk7CgogICAgICAgIGlmICh0eXBlb2YgbWV0aG9kID09PSAnc3Ry aW5nJykgewogICAgICAgICAgbWV0aG9kID0gdGFyZ2V0W21ldGhvZF07CiAg ICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBmbigpIHsKICAgICAgICAgIG1l dGhvZC5hcHBseSh0YXJnZXQsIGFyZ3MpOwogICAgICAgIH0KCiAgICAgICAg Ly8gZmluZCBwb3NpdGlvbiB0byBpbnNlcnQgLSBUT0RPOiBiaW5hcnkgc2Vh cmNoCiAgICAgICAgdmFyIGksIGw7CiAgICAgICAgZm9yIChpID0gMCwgbCA9 IHRpbWVycy5sZW5ndGg7IGkgPCBsOyBpICs9IDIpIHsKICAgICAgICAgIGlm IChleGVjdXRlQXQgPCB0aW1lcnNbaV0pIHsgYnJlYWs7IH0KICAgICAgICB9 CgogICAgICAgIHRpbWVycy5zcGxpY2UoaSwgMCwgZXhlY3V0ZUF0LCBmbik7 CgogICAgICAgIHVwZGF0ZUxhdGVyVGltZXIoc2VsZiwgZXhlY3V0ZUF0LCB3 YWl0KTsKCiAgICAgICAgcmV0dXJuIGZuOwogICAgICB9LAoKICAgICAgdGhy b3R0bGU6IGZ1bmN0aW9uKHRhcmdldCwgbWV0aG9kIC8qICwgYXJncywgd2Fp dCwgW2ltbWVkaWF0ZV0gKi8pIHsKICAgICAgICB2YXIgc2VsZiA9IHRoaXMs CiAgICAgICAgICAgIGFyZ3MgPSBhcmd1bWVudHMsCiAgICAgICAgICAgIGlt bWVkaWF0ZSA9IHBvcC5jYWxsKGFyZ3MpLAogICAgICAgICAgICB3YWl0LAog ICAgICAgICAgICB0aHJvdHRsZXIsCiAgICAgICAgICAgIGluZGV4LAogICAg ICAgICAgICB0aW1lcjsKCiAgICAgICAgaWYgKHR5cGVvZiBpbW1lZGlhdGUg PT09ICJudW1iZXIiIHx8IHR5cGVvZiBpbW1lZGlhdGUgPT09ICJzdHJpbmci KSB7CiAgICAgICAgICB3YWl0ID0gaW1tZWRpYXRlOwogICAgICAgICAgaW1t ZWRpYXRlID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgd2Fp dCA9IHBvcC5jYWxsKGFyZ3MpOwogICAgICAgIH0KCiAgICAgICAgd2FpdCA9 IHBhcnNlSW50KHdhaXQsIDEwKTsKCiAgICAgICAgaW5kZXggPSBmaW5kVGhy b3R0bGVyKHRhcmdldCwgbWV0aG9kKTsKICAgICAgICBpZiAoaW5kZXggPiAt MSkgeyByZXR1cm4gdGhyb3R0bGVyc1tpbmRleF07IH0gLy8gdGhyb3R0bGVk CgogICAgICAgIHRpbWVyID0gZ2xvYmFsLnNldFRpbWVvdXQoZnVuY3Rpb24o KSB7CiAgICAgICAgICBpZiAoIWltbWVkaWF0ZSkgewogICAgICAgICAgICBz ZWxmLnJ1bi5hcHBseShzZWxmLCBhcmdzKTsKICAgICAgICAgIH0KICAgICAg ICAgIHZhciBpbmRleCA9IGZpbmRUaHJvdHRsZXIodGFyZ2V0LCBtZXRob2Qp OwogICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHsgdGhyb3R0bGVycy5zcGxp Y2UoaW5kZXgsIDEpOyB9CiAgICAgICAgfSwgd2FpdCk7CgogICAgICAgIGlm IChpbW1lZGlhdGUpIHsKICAgICAgICAgIHNlbGYucnVuLmFwcGx5KHNlbGYs IGFyZ3MpOwogICAgICAgIH0KCiAgICAgICAgdGhyb3R0bGVyID0gW3Rhcmdl dCwgbWV0aG9kLCB0aW1lcl07CgogICAgICAgIHRocm90dGxlcnMucHVzaCh0 aHJvdHRsZXIpOwoKICAgICAgICByZXR1cm4gdGhyb3R0bGVyOwogICAgICB9 LAoKICAgICAgZGVib3VuY2U6IGZ1bmN0aW9uKHRhcmdldCwgbWV0aG9kIC8q ICwgYXJncywgd2FpdCwgW2ltbWVkaWF0ZV0gKi8pIHsKICAgICAgICB2YXIg c2VsZiA9IHRoaXMsCiAgICAgICAgICAgIGFyZ3MgPSBhcmd1bWVudHMsCiAg ICAgICAgICAgIGltbWVkaWF0ZSA9IHBvcC5jYWxsKGFyZ3MpLAogICAgICAg ICAgICB3YWl0LAogICAgICAgICAgICBpbmRleCwKICAgICAgICAgICAgZGVi b3VuY2VlLAogICAgICAgICAgICB0aW1lcjsKCiAgICAgICAgaWYgKHR5cGVv ZiBpbW1lZGlhdGUgPT09ICJudW1iZXIiIHx8IHR5cGVvZiBpbW1lZGlhdGUg PT09ICJzdHJpbmciKSB7CiAgICAgICAgICB3YWl0ID0gaW1tZWRpYXRlOwog ICAgICAgICAgaW1tZWRpYXRlID0gZmFsc2U7CiAgICAgICAgfSBlbHNlIHsK ICAgICAgICAgIHdhaXQgPSBwb3AuY2FsbChhcmdzKTsKICAgICAgICB9Cgog ICAgICAgIHdhaXQgPSBwYXJzZUludCh3YWl0LCAxMCk7CiAgICAgICAgLy8g UmVtb3ZlIGRlYm91bmNlZQogICAgICAgIGluZGV4ID0gZmluZERlYm91bmNl ZSh0YXJnZXQsIG1ldGhvZCk7CgogICAgICAgIGlmIChpbmRleCA+IC0xKSB7 CiAgICAgICAgICBkZWJvdW5jZWUgPSBkZWJvdW5jZWVzW2luZGV4XTsKICAg ICAgICAgIGRlYm91bmNlZXMuc3BsaWNlKGluZGV4LCAxKTsKICAgICAgICAg IGNsZWFyVGltZW91dChkZWJvdW5jZWVbMl0pOwogICAgICAgIH0KCiAgICAg ICAgdGltZXIgPSBnbG9iYWwuc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAg ICAgICAgIGlmICghaW1tZWRpYXRlKSB7CiAgICAgICAgICAgIHNlbGYucnVu LmFwcGx5KHNlbGYsIGFyZ3MpOwogICAgICAgICAgfQogICAgICAgICAgdmFy IGluZGV4ID0gZmluZERlYm91bmNlZSh0YXJnZXQsIG1ldGhvZCk7CiAgICAg ICAgICBpZiAoaW5kZXggPiAtMSkgewogICAgICAgICAgICBkZWJvdW5jZWVz LnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICB9CiAgICAgICAgfSwgd2Fp dCk7CgogICAgICAgIGlmIChpbW1lZGlhdGUgJiYgaW5kZXggPT09IC0xKSB7 CiAgICAgICAgICBzZWxmLnJ1bi5hcHBseShzZWxmLCBhcmdzKTsKICAgICAg ICB9CgogICAgICAgIGRlYm91bmNlZSA9IFt0YXJnZXQsIG1ldGhvZCwgdGlt ZXJdOwoKICAgICAgICBkZWJvdW5jZWVzLnB1c2goZGVib3VuY2VlKTsKCiAg ICAgICAgcmV0dXJuIGRlYm91bmNlZTsKICAgICAgfSwKCiAgICAgIGNhbmNl bFRpbWVyczogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGksIGxlbjsKCiAg ICAgICAgZm9yIChpID0gMCwgbGVuID0gdGhyb3R0bGVycy5sZW5ndGg7IGkg PCBsZW47IGkrKykgewogICAgICAgICAgY2xlYXJUaW1lb3V0KHRocm90dGxl cnNbaV1bMl0pOwogICAgICAgIH0KICAgICAgICB0aHJvdHRsZXJzID0gW107 CgogICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IGRlYm91bmNlZXMubGVuZ3Ro OyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgIGNsZWFyVGltZW91dChkZWJv dW5jZWVzW2ldWzJdKTsKICAgICAgICB9CiAgICAgICAgZGVib3VuY2VlcyA9 IFtdOwoKICAgICAgICBpZiAobGF0ZXJUaW1lcikgewogICAgICAgICAgY2xl YXJUaW1lb3V0KGxhdGVyVGltZXIpOwogICAgICAgICAgbGF0ZXJUaW1lciA9 IG51bGw7CiAgICAgICAgfQogICAgICAgIHRpbWVycyA9IFtdOwoKICAgICAg ICBpZiAoYXV0b3J1bikgewogICAgICAgICAgY2xlYXJUaW1lb3V0KGF1dG9y dW4pOwogICAgICAgICAgYXV0b3J1biA9IG51bGw7CiAgICAgICAgfQogICAg ICB9LAoKICAgICAgaGFzVGltZXJzOiBmdW5jdGlvbigpIHsKICAgICAgICBy ZXR1cm4gISF0aW1lcnMubGVuZ3RoIHx8IGF1dG9ydW47CiAgICAgIH0sCgog ICAgICBjYW5jZWw6IGZ1bmN0aW9uKHRpbWVyKSB7CiAgICAgICAgdmFyIHRp bWVyVHlwZSA9IHR5cGVvZiB0aW1lcjsKCiAgICAgICAgaWYgKHRpbWVyICYm IHRpbWVyVHlwZSA9PT0gJ29iamVjdCcgJiYgdGltZXIucXVldWUgJiYgdGlt ZXIubWV0aG9kKSB7IC8vIHdlJ3JlIGNhbmNlbGxpbmcgYSBkZWZlck9uY2UK ICAgICAgICAgIHJldHVybiB0aW1lci5xdWV1ZS5jYW5jZWwodGltZXIpOwog ICAgICAgIH0gZWxzZSBpZiAodGltZXJUeXBlID09PSAnZnVuY3Rpb24nKSB7 IC8vIHdlJ3JlIGNhbmNlbGxpbmcgYSBzZXRUaW1lb3V0CiAgICAgICAgICBm b3IgKHZhciBpID0gMCwgbCA9IHRpbWVycy5sZW5ndGg7IGkgPCBsOyBpICs9 IDIpIHsKICAgICAgICAgICAgaWYgKHRpbWVyc1tpICsgMV0gPT09IHRpbWVy KSB7CiAgICAgICAgICAgICAgdGltZXJzLnNwbGljZShpLCAyKTsgLy8gcmVt b3ZlIHRoZSB0d28gZWxlbWVudHMKICAgICAgICAgICAgICByZXR1cm4gdHJ1 ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBp ZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHRpbWVyKSA9PT0g IltvYmplY3QgQXJyYXldIil7IC8vIHdlJ3JlIGNhbmNlbGxpbmcgYSB0aHJv dHRsZSBvciBkZWJvdW5jZQogICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbmNl bEl0ZW0oZmluZFRocm90dGxlciwgdGhyb3R0bGVycywgdGltZXIpIHx8CiAg ICAgICAgICAgICAgICAgICB0aGlzLl9jYW5jZWxJdGVtKGZpbmREZWJvdW5j ZWUsIGRlYm91bmNlZXMsIHRpbWVyKTsKICAgICAgICB9IGVsc2UgewogICAg ICAgICAgcmV0dXJuOyAvLyB0aW1lciB3YXMgbnVsbCBvciBub3QgYSB0aW1l cgogICAgICAgIH0KICAgICAgfSwKCiAgICAgIF9jYW5jZWxJdGVtOiBmdW5j dGlvbihmaW5kTWV0aG9kLCBhcnJheSwgdGltZXIpewogICAgICAgIHZhciBp dGVtLAogICAgICAgICAgICBpbmRleDsKCiAgICAgICAgaWYgKHRpbWVyLmxl bmd0aCA8IDMpIHsgcmV0dXJuIGZhbHNlOyB9CgogICAgICAgIGluZGV4ID0g ZmluZE1ldGhvZCh0aW1lclswXSwgdGltZXJbMV0pOwoKICAgICAgICBpZihp bmRleCA+IC0xKSB7CgogICAgICAgICAgaXRlbSA9IGFycmF5W2luZGV4XTsK CiAgICAgICAgICBpZihpdGVtWzJdID09PSB0aW1lclsyXSl7CiAgICAgICAg ICAgIGFycmF5LnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgIGNsZWFy VGltZW91dCh0aW1lclsyXSk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwog ICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwog ICAgICB9CgogICAgfTsKCiAgICBCYWNrYnVybmVyLnByb3RvdHlwZS5zY2hl ZHVsZSA9IEJhY2tidXJuZXIucHJvdG90eXBlLmRlZmVyOwogICAgQmFja2J1 cm5lci5wcm90b3R5cGUuc2NoZWR1bGVPbmNlID0gQmFja2J1cm5lci5wcm90 b3R5cGUuZGVmZXJPbmNlOwogICAgQmFja2J1cm5lci5wcm90b3R5cGUubGF0 ZXIgPSBCYWNrYnVybmVyLnByb3RvdHlwZS5zZXRUaW1lb3V0OwoKICAgIGZ1 bmN0aW9uIGNyZWF0ZUF1dG9ydW4oYmFja2J1cm5lcikgewogICAgICBiYWNr YnVybmVyLmJlZ2luKCk7CiAgICAgIGF1dG9ydW4gPSBnbG9iYWwuc2V0VGlt ZW91dChmdW5jdGlvbigpIHsKICAgICAgICBhdXRvcnVuID0gbnVsbDsKICAg ICAgICBiYWNrYnVybmVyLmVuZCgpOwogICAgICB9KTsKICAgIH0KCiAgICBm dW5jdGlvbiB1cGRhdGVMYXRlclRpbWVyKHNlbGYsIGV4ZWN1dGVBdCwgd2Fp dCkgewogICAgICBpZiAoIWxhdGVyVGltZXIgfHwgZXhlY3V0ZUF0IDwgbGF0 ZXJUaW1lckV4cGlyZXNBdCkgewogICAgICAgIGlmIChsYXRlclRpbWVyKSB7 CiAgICAgICAgICBjbGVhclRpbWVvdXQobGF0ZXJUaW1lcik7CiAgICAgICAg fQogICAgICAgIGxhdGVyVGltZXIgPSBnbG9iYWwuc2V0VGltZW91dChmdW5j dGlvbigpIHsKICAgICAgICAgIGxhdGVyVGltZXIgPSBudWxsOwogICAgICAg ICAgbGF0ZXJUaW1lckV4cGlyZXNBdCA9IG51bGw7CiAgICAgICAgICBleGVj dXRlVGltZXJzKHNlbGYpOwogICAgICAgIH0sIHdhaXQpOwogICAgICAgIGxh dGVyVGltZXJFeHBpcmVzQXQgPSBleGVjdXRlQXQ7CiAgICAgIH0KICAgIH0K CiAgICBmdW5jdGlvbiBleGVjdXRlVGltZXJzKHNlbGYpIHsKICAgICAgdmFy IG5vdyA9ICtuZXcgRGF0ZSgpLAogICAgICAgICAgdGltZSwgZm5zLCBpLCBs OwoKICAgICAgc2VsZi5ydW4oZnVuY3Rpb24oKSB7CiAgICAgICAgLy8gVE9E TzogYmluYXJ5IHNlYXJjaAogICAgICAgIGZvciAoaSA9IDAsIGwgPSB0aW1l cnMubGVuZ3RoOyBpIDwgbDsgaSArPSAyKSB7CiAgICAgICAgICB0aW1lID0g dGltZXJzW2ldOwogICAgICAgICAgaWYgKHRpbWUgPiBub3cpIHsgYnJlYWs7 IH0KICAgICAgICB9CgogICAgICAgIGZucyA9IHRpbWVycy5zcGxpY2UoMCwg aSk7CgogICAgICAgIGZvciAoaSA9IDEsIGwgPSBmbnMubGVuZ3RoOyBpIDwg bDsgaSArPSAyKSB7CiAgICAgICAgICBzZWxmLnNjaGVkdWxlKHNlbGYub3B0 aW9ucy5kZWZhdWx0UXVldWUsIG51bGwsIGZuc1tpXSk7CiAgICAgICAgfQog ICAgICB9KTsKCiAgICAgIGlmICh0aW1lcnMubGVuZ3RoKSB7CiAgICAgICAg dXBkYXRlTGF0ZXJUaW1lcihzZWxmLCB0aW1lcnNbMF0sIHRpbWVyc1swXSAt IG5vdyk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBmaW5kRGVib3Vu Y2VlKHRhcmdldCwgbWV0aG9kKSB7CiAgICAgIHZhciBkZWJvdW5jZWUsCiAg ICAgICAgICBpbmRleCA9IC0xOwoKICAgICAgZm9yICh2YXIgaSA9IDAsIGwg PSBkZWJvdW5jZWVzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICAgIGRl Ym91bmNlZSA9IGRlYm91bmNlZXNbaV07CiAgICAgICAgaWYgKGRlYm91bmNl ZVswXSA9PT0gdGFyZ2V0ICYmIGRlYm91bmNlZVsxXSA9PT0gbWV0aG9kKSB7 CiAgICAgICAgICBpbmRleCA9IGk7CiAgICAgICAgICBicmVhazsKICAgICAg ICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBpbmRleDsKICAgIH0KCiAgICBm dW5jdGlvbiBmaW5kVGhyb3R0bGVyKHRhcmdldCwgbWV0aG9kKSB7CiAgICAg IHZhciB0aHJvdHRsZXIsCiAgICAgICAgICBpbmRleCA9IC0xOwoKICAgICAg Zm9yICh2YXIgaSA9IDAsIGwgPSB0aHJvdHRsZXJzLmxlbmd0aDsgaSA8IGw7 IGkrKykgewogICAgICAgIHRocm90dGxlciA9IHRocm90dGxlcnNbaV07CiAg ICAgICAgaWYgKHRocm90dGxlclswXSA9PT0gdGFyZ2V0ICYmIHRocm90dGxl clsxXSA9PT0gbWV0aG9kKSB7CiAgICAgICAgICBpbmRleCA9IGk7CiAgICAg ICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBp bmRleDsKICAgIH0KCiAgICBfX2V4cG9ydHNfXy5CYWNrYnVybmVyID0gQmFj a2J1cm5lcjsKICB9KTsKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewp2YXIgb25C ZWdpbiA9IGZ1bmN0aW9uKGN1cnJlbnQpIHsKICBFbWJlci5ydW4uY3VycmVu dFJ1bkxvb3AgPSBjdXJyZW50Owp9OwoKdmFyIG9uRW5kID0gZnVuY3Rpb24o Y3VycmVudCwgbmV4dCkgewogIEVtYmVyLnJ1bi5jdXJyZW50UnVuTG9vcCA9 IG5leHQ7Cn07Cgp2YXIgQmFja2J1cm5lciA9IHJlcXVpcmVNb2R1bGUoJ2Jh Y2tidXJuZXInKS5CYWNrYnVybmVyLAogICAgYmFja2J1cm5lciA9IG5ldyBC YWNrYnVybmVyKFsnc3luYycsICdhY3Rpb25zJywgJ2Rlc3Ryb3knXSwgewog ICAgICBzeW5jOiB7CiAgICAgICAgYmVmb3JlOiBFbWJlci5iZWdpblByb3Bl cnR5Q2hhbmdlcywKICAgICAgICBhZnRlcjogRW1iZXIuZW5kUHJvcGVydHlD aGFuZ2VzCiAgICAgIH0sCiAgICAgIGRlZmF1bHRRdWV1ZTogJ2FjdGlvbnMn LAogICAgICBvbkJlZ2luOiBvbkJlZ2luLAogICAgICBvbkVuZDogb25FbmQK ICAgIH0pLAogICAgc2xpY2UgPSBbXS5zbGljZSwKICAgIGNvbmNhdCA9IFtd LmNvbmNhdDsKCi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLy8gRW1iZXIucnVuIC0gdGhp cyBpcyBpZGVhbGx5IHRoZSBvbmx5IHB1YmxpYyBBUEkgdGhlIGRldiBzZWVz Ci8vCgovKioKICBSdW5zIHRoZSBwYXNzZWQgdGFyZ2V0IGFuZCBtZXRob2Qg aW5zaWRlIG9mIGEgUnVuTG9vcCwgZW5zdXJpbmcgYW55CiAgZGVmZXJyZWQg YWN0aW9ucyBpbmNsdWRpbmcgYmluZGluZ3MgYW5kIHZpZXdzIHVwZGF0ZXMg YXJlIGZsdXNoZWQgYXQgdGhlCiAgZW5kLgoKICBOb3JtYWxseSB5b3Ugc2hv dWxkIG5vdCBuZWVkIHRvIGludm9rZSB0aGlzIG1ldGhvZCB5b3Vyc2VsZi4g SG93ZXZlciBpZgogIHlvdSBhcmUgaW1wbGVtZW50aW5nIHJhdyBldmVudCBo YW5kbGVycyB3aGVuIGludGVyZmFjaW5nIHdpdGggb3RoZXIKICBsaWJyYXJp ZXMgb3IgcGx1Z2lucywgeW91IHNob3VsZCBwcm9iYWJseSB3cmFwIGFsbCBv ZiB5b3VyIGNvZGUgaW5zaWRlIHRoaXMKICBjYWxsLgoKICBgYGBqYXZhc2Ny aXB0CiAgRW1iZXIucnVuKGZ1bmN0aW9uKCkgewogICAgLy8gY29kZSB0byBi ZSBleGVjdXRlIHdpdGhpbiBhIFJ1bkxvb3AKICB9KTsKICBgYGAKCiAgQGNs YXNzIHJ1bgogIEBuYW1lc3BhY2UgRW1iZXIKICBAc3RhdGljCiAgQGNvbnN0 cnVjdG9yCiAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIHRhcmdldCBvZiBt ZXRob2QgdG8gY2FsbAogIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBtZXRo b2QgTWV0aG9kIHRvIGludm9rZS4KICAgIE1heSBiZSBhIGZ1bmN0aW9uIG9y IGEgc3RyaW5nLiBJZiB5b3UgcGFzcyBhIHN0cmluZwogICAgdGhlbiBpdCB3 aWxsIGJlIGxvb2tlZCB1cCBvbiB0aGUgcGFzc2VkIHRhcmdldC4KICBAcGFy YW0ge09iamVjdH0gW2FyZ3MqXSBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMg eW91IHdpc2ggdG8gcGFzcyB0byB0aGUgbWV0aG9kLgogIEByZXR1cm4ge09i amVjdH0gcmV0dXJuIHZhbHVlIGZyb20gaW52b2tpbmcgdGhlIHBhc3NlZCBm dW5jdGlvbi4KKi8KRW1iZXIucnVuID0gZnVuY3Rpb24oKSB7CiAgaWYgKEVt YmVyLm9uZXJyb3IpIHsKICAgIHJldHVybiBvbmVycm9yKGFyZ3VtZW50cyk7 CiAgfSBlbHNlIHsKICAgIHJldHVybiBiYWNrYnVybmVyLnJ1bi5hcHBseShi YWNrYnVybmVyLCBhcmd1bWVudHMpOwogIH0KfTsKCmZ1bmN0aW9uIG9uZXJy b3IoYXJncykgewogIHRyeSB7CiAgICByZXR1cm4gYmFja2J1cm5lci5ydW4u YXBwbHkoYmFja2J1cm5lciwgYXJncyk7CiAgfSBjYXRjaChlcnJvcikgewog ICAgRW1iZXIub25lcnJvcihlcnJvcik7CiAgfQp9Ci8qKgogIElmIG5vIHJ1 bi1sb29wIGlzIHByZXNlbnQsIGl0IGNyZWF0ZXMgYSBuZXcgb25lLiBJZiBh IHJ1biBsb29wIGlzCiAgcHJlc2VudCBpdCB3aWxsIHF1ZXVlIGl0c2VsZiB0 byBydW4gb24gdGhlIGV4aXN0aW5nIHJ1bi1sb29wcyBhY3Rpb24KICBxdWV1 ZS4KCiAgUGxlYXNlIG5vdGU6IFRoaXMgaXMgbm90IGZvciBub3JtYWwgdXNh Z2UsIGFuZCBzaG91bGQgYmUgdXNlZCBzcGFyaW5nbHkuCgogIElmIGludm9r ZWQgd2hlbiBub3Qgd2l0aGluIGEgcnVuIGxvb3A6CgogIGBgYGphdmFzY3Jp cHQKICBFbWJlci5ydW4uam9pbihmdW5jdGlvbigpIHsKICAgIC8vIGNyZWF0 ZXMgYSBuZXcgcnVuLWxvb3AKICB9KTsKICBgYGAKCiAgQWx0ZXJuYXRpdmVs eSwgaWYgY2FsbGVkIHdpdGhpbiBhbiBleGlzdGluZyBydW4gbG9vcDoKCiAg YGBgamF2YXNjcmlwdAogIEVtYmVyLnJ1bihmdW5jdGlvbigpIHsKICAgIC8v IGNyZWF0ZXMgYSBuZXcgcnVuLWxvb3AKICAgIEVtYmVyLnJ1bi5qb2luKGZ1 bmN0aW9uKCkgewogICAgICAvLyBqb2lucyB3aXRoIHRoZSBleGlzdGluZyBy dW4tbG9vcCwgYW5kIHF1ZXVlcyBmb3IgaW52b2NhdGlvbiBvbgogICAgICAv LyB0aGUgZXhpc3RpbmcgcnVuLWxvb3BzIGFjdGlvbiBxdWV1ZS4KICAgIH0p OwogIH0pOwogIGBgYAoKICBAbWV0aG9kIGpvaW4KICBAbmFtZXNwYWNlIEVt YmVyCiAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIHRhcmdldCBvZiBtZXRo b2QgdG8gY2FsbAogIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBtZXRob2Qg TWV0aG9kIHRvIGludm9rZS4KICAgIE1heSBiZSBhIGZ1bmN0aW9uIG9yIGEg c3RyaW5nLiBJZiB5b3UgcGFzcyBhIHN0cmluZwogICAgdGhlbiBpdCB3aWxs IGJlIGxvb2tlZCB1cCBvbiB0aGUgcGFzc2VkIHRhcmdldC4KICBAcGFyYW0g e09iamVjdH0gW2FyZ3MqXSBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgeW91 IHdpc2ggdG8gcGFzcyB0byB0aGUgbWV0aG9kLgogIEByZXR1cm4ge09iamVj dH0gUmV0dXJuIHZhbHVlIGZyb20gaW52b2tpbmcgdGhlIHBhc3NlZCBmdW5j dGlvbi4gUGxlYXNlIG5vdGUsCiAgd2hlbiBjYWxsZWQgd2l0aGluIGFuIGV4 aXN0aW5nIGxvb3AsIG5vIHJldHVybiB2YWx1ZSBpcyBwb3NzaWJsZS4KKi8K RW1iZXIucnVuLmpvaW4gPSBmdW5jdGlvbih0YXJnZXQsIG1ldGhvZCAvKiBh cmdzICovKSB7CiAgaWYgKCFFbWJlci5ydW4uY3VycmVudFJ1bkxvb3ApIHsK ICAgIHJldHVybiBFbWJlci5ydW4uYXBwbHkoRW1iZXIucnVuLCBhcmd1bWVu dHMpOwogIH0KCiAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7 CiAgYXJncy51bnNoaWZ0KCdhY3Rpb25zJyk7CiAgRW1iZXIucnVuLnNjaGVk dWxlLmFwcGx5KEVtYmVyLnJ1biwgYXJncyk7Cn07CgovKioKICBQcm92aWRl cyBhIHVzZWZ1bCB1dGlsaXR5IGZvciB3aGVuIGludGVncmF0aW5nIHdpdGgg bm9uLUVtYmVyIGxpYnJhcmllcwogIHRoYXQgcHJvdmlkZSBhc3luY2hyb25v dXMgY2FsbGJhY2tzLgoKICBFbWJlciB1dGlsaXplcyBhIHJ1bi1sb29wIHRv IGJhdGNoIGFuZCBjb2FsZXNjZSBjaGFuZ2VzLiBUaGlzIHdvcmtzIGJ5CiAg bWFya2luZyB0aGUgc3RhcnQgYW5kIGVuZCBvZiBFbWJlci1yZWxhdGVkIEph dmFzY3JpcHQgZXhlY3V0aW9uLgoKICBXaGVuIHVzaW5nIGV2ZW50cyBzdWNo IGFzIGEgVmlldydzIGNsaWNrIGhhbmRsZXIsIEVtYmVyIHdyYXBzIHRoZSBl dmVudAogIGhhbmRsZXIgaW4gYSBydW4tbG9vcCwgYnV0IHdoZW4gaW50ZWdy YXRpbmcgd2l0aCBub24tRW1iZXIgbGlicmFyaWVzIHRoaXMKICBjYW4gYmUg dGVkaW91cy4KCiAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgaXMgcmF0 aGVyIHZlcmJvc2UgYnV0IGlzIHRoZSBjb3JyZWN0IHdheSB0byBjb21iaW5l CiAgdGhpcmQtcGFydHkgZXZlbnRzIGFuZCBFbWJlciBjb2RlLgoKICBgYGBq YXZhc2NyaXB0CiAgdmFyIHRoYXQgPSB0aGlzOwogIGpRdWVyeSh3aW5kb3cp Lm9uKCdyZXNpemUnLCBmdW5jdGlvbigpewogICAgRW1iZXIucnVuKGZ1bmN0 aW9uKCl7CiAgICAgIHRoYXQuaGFuZGxlUmVzaXplKCk7CiAgICB9KTsKICB9 KTsKICBgYGAKCiAgVG8gcmVkdWNlIHRoZSBib2lsZXJwbGF0ZSwgdGhlIGZv bGxvd2luZyBjYW4gYmUgdXNlZCB0byBjb25zdHJ1Y3QgYQogIHJ1bi1sb29w LXdyYXBwZWQgY2FsbGJhY2sgaGFuZGxlci4KCiAgYGBgamF2YXNjcmlwdAog IGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCBFbWJlci5ydW4uYmluZCh0 aGlzLCB0aGlzLmhhbmRsZVJlc2l6ZSkpOwogIGBgYAoKICBAbWV0aG9kIGJp bmQKICBAbmFtZXNwYWNlIEVtYmVyLnJ1bgogIEBwYXJhbSB7T2JqZWN0fSBb dGFyZ2V0XSB0YXJnZXQgb2YgbWV0aG9kIHRvIGNhbGwKICBAcGFyYW0ge0Z1 bmN0aW9ufFN0cmluZ30gbWV0aG9kIE1ldGhvZCB0byBpbnZva2UuCiAgICBN YXkgYmUgYSBmdW5jdGlvbiBvciBhIHN0cmluZy4gSWYgeW91IHBhc3MgYSBz dHJpbmcKICAgIHRoZW4gaXQgd2lsbCBiZSBsb29rZWQgdXAgb24gdGhlIHBh c3NlZCB0YXJnZXQuCiAgQHBhcmFtIHtPYmplY3R9IFthcmdzKl0gQW55IGFk ZGl0aW9uYWwgYXJndW1lbnRzIHlvdSB3aXNoIHRvIHBhc3MgdG8gdGhlIG1l dGhvZC4KICBAcmV0dXJuIHtPYmplY3R9IHJldHVybiB2YWx1ZSBmcm9tIGlu dm9raW5nIHRoZSBwYXNzZWQgZnVuY3Rpb24uIFBsZWFzZSBub3RlLAogIHdo ZW4gY2FsbGVkIHdpdGhpbiBhbiBleGlzdGluZyBsb29wLCBubyByZXR1cm4g dmFsdWUgaXMgcG9zc2libGUuCiovCkVtYmVyLnJ1bi5iaW5kID0gZnVuY3Rp b24odGFyZ2V0LCBtZXRob2QgLyogYXJncyovKSB7CiAgdmFyIGFyZ3MgPSBh cmd1bWVudHM7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIEVt YmVyLnJ1bi5qb2luLmFwcGx5KEVtYmVyLnJ1biwgYXJncyk7CiAgfTsKfTsK CkVtYmVyLnJ1bi5iYWNrYnVybmVyID0gYmFja2J1cm5lcjsKCnZhciBydW4g PSBFbWJlci5ydW47CgpFbWJlci5ydW4uY3VycmVudFJ1bkxvb3AgPSBudWxs OwoKRW1iZXIucnVuLnF1ZXVlcyA9IGJhY2tidXJuZXIucXVldWVOYW1lczsK Ci8qKgogIEJlZ2lucyBhIG5ldyBSdW5Mb29wLiBBbnkgZGVmZXJyZWQgYWN0 aW9ucyBpbnZva2VkIGFmdGVyIHRoZSBiZWdpbiB3aWxsCiAgYmUgYnVmZmVy ZWQgdW50aWwgeW91IGludm9rZSBhIG1hdGNoaW5nIGNhbGwgdG8gYEVtYmVy LnJ1bi5lbmQoKWAuIFRoaXMgaXMKICBhIGxvd2VyLWxldmVsIHdheSB0byB1 c2UgYSBSdW5Mb29wIGluc3RlYWQgb2YgdXNpbmcgYEVtYmVyLnJ1bigpYC4K CiAgYGBgamF2YXNjcmlwdAogIEVtYmVyLnJ1bi5iZWdpbigpOwogIC8vIGNv ZGUgdG8gYmUgZXhlY3V0ZSB3aXRoaW4gYSBSdW5Mb29wCiAgRW1iZXIucnVu LmVuZCgpOwogIGBgYAoKICBAbWV0aG9kIGJlZ2luCiAgQHJldHVybiB7dm9p ZH0KKi8KRW1iZXIucnVuLmJlZ2luID0gZnVuY3Rpb24oKSB7CiAgYmFja2J1 cm5lci5iZWdpbigpOwp9OwoKLyoqCiAgRW5kcyBhIFJ1bkxvb3AuIFRoaXMg bXVzdCBiZSBjYWxsZWQgc29tZXRpbWUgYWZ0ZXIgeW91IGNhbGwKICBgRW1i ZXIucnVuLmJlZ2luKClgIHRvIGZsdXNoIGFueSBkZWZlcnJlZCBhY3Rpb25z LiBUaGlzIGlzIGEgbG93ZXItbGV2ZWwgd2F5CiAgdG8gdXNlIGEgUnVuTG9v cCBpbnN0ZWFkIG9mIHVzaW5nIGBFbWJlci5ydW4oKWAuCgogIGBgYGphdmFz Y3JpcHQKICBFbWJlci5ydW4uYmVnaW4oKTsKICAvLyBjb2RlIHRvIGJlIGV4 ZWN1dGUgd2l0aGluIGEgUnVuTG9vcAogIEVtYmVyLnJ1bi5lbmQoKTsKICBg YGAKCiAgQG1ldGhvZCBlbmQKICBAcmV0dXJuIHt2b2lkfQoqLwpFbWJlci5y dW4uZW5kID0gZnVuY3Rpb24oKSB7CiAgYmFja2J1cm5lci5lbmQoKTsKfTsK Ci8qKgogIEFycmF5IG9mIG5hbWVkIHF1ZXVlcy4gVGhpcyBhcnJheSBkZXRl cm1pbmVzIHRoZSBvcmRlciBpbiB3aGljaCBxdWV1ZXMKICBhcmUgZmx1c2hl ZCBhdCB0aGUgZW5kIG9mIHRoZSBSdW5Mb29wLiBZb3UgY2FuIGRlZmluZSB5 b3VyIG93biBxdWV1ZXMgYnkKICBzaW1wbHkgYWRkaW5nIHRoZSBxdWV1ZSBu YW1lIHRvIHRoaXMgYXJyYXkuIE5vcm1hbGx5IHlvdSBzaG91bGQgbm90IG5l ZWQKICB0byBpbnNwZWN0IG9yIG1vZGlmeSB0aGlzIHByb3BlcnR5LgoKICBA cHJvcGVydHkgcXVldWVzCiAgQHR5cGUgQXJyYXkKICBAZGVmYXVsdCBbJ3N5 bmMnLCAnYWN0aW9ucycsICdkZXN0cm95J10KKi8KCi8qKgogIEFkZHMgdGhl IHBhc3NlZCB0YXJnZXQvbWV0aG9kIGFuZCBhbnkgb3B0aW9uYWwgYXJndW1l bnRzIHRvIHRoZSBuYW1lZAogIHF1ZXVlIHRvIGJlIGV4ZWN1dGVkIGF0IHRo ZSBlbmQgb2YgdGhlIFJ1bkxvb3AuIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5 CiAgc3RhcnRlZCBhIFJ1bkxvb3Agd2hlbiBjYWxsaW5nIHRoaXMgbWV0aG9k IG9uZSB3aWxsIGJlIHN0YXJ0ZWQgZm9yIHlvdQogIGF1dG9tYXRpY2FsbHku CgogIEF0IHRoZSBlbmQgb2YgYSBSdW5Mb29wLCBhbnkgbWV0aG9kcyBzY2hl ZHVsZWQgaW4gdGhpcyB3YXkgd2lsbCBiZSBpbnZva2VkLgogIE1ldGhvZHMg d2lsbCBiZSBpbnZva2VkIGluIGFuIG9yZGVyIG1hdGNoaW5nIHRoZSBuYW1l ZCBxdWV1ZXMgZGVmaW5lZCBpbgogIHRoZSBgRW1iZXIucnVuLnF1ZXVlc2Ag cHJvcGVydHkuCgogIGBgYGphdmFzY3JpcHQKICBFbWJlci5ydW4uc2NoZWR1 bGUoJ3N5bmMnLCB0aGlzLCBmdW5jdGlvbigpIHsKICAgIC8vIHRoaXMgd2ls bCBiZSBleGVjdXRlZCBpbiB0aGUgZmlyc3QgUnVuTG9vcCBxdWV1ZSwgd2hl biBiaW5kaW5ncyBhcmUgc3luY2VkCiAgICBjb25zb2xlLmxvZygic2NoZWR1 bGVkIG9uIHN5bmMgcXVldWUiKTsKICB9KTsKCiAgRW1iZXIucnVuLnNjaGVk dWxlKCdhY3Rpb25zJywgdGhpcywgZnVuY3Rpb24oKSB7CiAgICAvLyB0aGlz IHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlICdhY3Rpb25zJyBxdWV1ZSwgYWZ0 ZXIgYmluZGluZ3MgaGF2ZSBzeW5jZWQuCiAgICBjb25zb2xlLmxvZygic2No ZWR1bGVkIG9uIGFjdGlvbnMgcXVldWUiKTsKICB9KTsKCiAgLy8gTm90ZSB0 aGUgZnVuY3Rpb25zIHdpbGwgYmUgcnVuIGluIG9yZGVyIGJhc2VkIG9uIHRo ZSBydW4gcXVldWVzIG9yZGVyLgogIC8vIE91dHB1dCB3b3VsZCBiZToKICAv LyAgIHNjaGVkdWxlZCBvbiBzeW5jIHF1ZXVlCiAgLy8gICBzY2hlZHVsZWQg b24gYWN0aW9ucyBxdWV1ZQogIGBgYAoKICBAbWV0aG9kIHNjaGVkdWxlCiAg QHBhcmFtIHtTdHJpbmd9IHF1ZXVlIFRoZSBuYW1lIG9mIHRoZSBxdWV1ZSB0 byBzY2hlZHVsZSBhZ2FpbnN0LgogICAgRGVmYXVsdCBxdWV1ZXMgYXJlICdz eW5jJyBhbmQgJ2FjdGlvbnMnCiAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRd IHRhcmdldCBvYmplY3QgdG8gdXNlIGFzIHRoZSBjb250ZXh0IHdoZW4gaW52 b2tpbmcgYSBtZXRob2QuCiAgQHBhcmFtIHtTdHJpbmd8RnVuY3Rpb259IG1l dGhvZCBUaGUgbWV0aG9kIHRvIGludm9rZS4gSWYgeW91IHBhc3MgYSBzdHJp bmcgaXQKICAgIHdpbGwgYmUgcmVzb2x2ZWQgb24gdGhlIHRhcmdldCBvYmpl Y3QgYXQgdGhlIHRpbWUgdGhlIHNjaGVkdWxlZCBpdGVtIGlzCiAgICBpbnZv a2VkIGFsbG93aW5nIHlvdSB0byBjaGFuZ2UgdGhlIHRhcmdldCBmdW5jdGlv bi4KICBAcGFyYW0ge09iamVjdH0gW2FyZ3VtZW50cypdIE9wdGlvbmFsIGFy Z3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIHF1ZXVlZCBtZXRob2QuCiAg QHJldHVybiB7dm9pZH0KKi8KRW1iZXIucnVuLnNjaGVkdWxlID0gZnVuY3Rp b24ocXVldWUsIHRhcmdldCwgbWV0aG9kKSB7CiAgY2hlY2tBdXRvUnVuKCk7 CiAgYmFja2J1cm5lci5zY2hlZHVsZS5hcHBseShiYWNrYnVybmVyLCBhcmd1 bWVudHMpOwp9OwoKLy8gVXNlZCBieSBnbG9iYWwgdGVzdCB0ZWFyZG93bgpF bWJlci5ydW4uaGFzU2NoZWR1bGVkVGltZXJzID0gZnVuY3Rpb24oKSB7CiAg cmV0dXJuIGJhY2tidXJuZXIuaGFzVGltZXJzKCk7Cn07CgovLyBVc2VkIGJ5 IGdsb2JhbCB0ZXN0IHRlYXJkb3duCkVtYmVyLnJ1bi5jYW5jZWxUaW1lcnMg PSBmdW5jdGlvbiAoKSB7CiAgYmFja2J1cm5lci5jYW5jZWxUaW1lcnMoKTsK fTsKCi8qKgogIEltbWVkaWF0ZWx5IGZsdXNoZXMgYW55IGV2ZW50cyBzY2hl ZHVsZWQgaW4gdGhlICdzeW5jJyBxdWV1ZS4gQmluZGluZ3MKICB1c2UgdGhp cyBxdWV1ZSBzbyB0aGlzIG1ldGhvZCBpcyBhIHVzZWZ1bCB3YXkgdG8gaW1t ZWRpYXRlbHkgZm9yY2UgYWxsCiAgYmluZGluZ3MgaW4gdGhlIGFwcGxpY2F0 aW9uIHRvIHN5bmMuCgogIFlvdSBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCBh bnl0aW1lIHlvdSBuZWVkIGFueSBjaGFuZ2VkIHN0YXRlIHRvIHByb3BhZ2F0 ZQogIHRocm91Z2hvdXQgdGhlIGFwcCBpbW1lZGlhdGVseSB3aXRob3V0IHJl cGFpbnRpbmcgdGhlIFVJICh3aGljaCBoYXBwZW5zCiAgaW4gdGhlIGxhdGVy ICdyZW5kZXInIHF1ZXVlIGFkZGVkIGJ5IHRoZSBgZW1iZXItdmlld3NgIHBh Y2thZ2UpLgoKICBgYGBqYXZhc2NyaXB0CiAgRW1iZXIucnVuLnN5bmMoKTsK ICBgYGAKCiAgQG1ldGhvZCBzeW5jCiAgQHJldHVybiB7dm9pZH0KKi8KRW1i ZXIucnVuLnN5bmMgPSBmdW5jdGlvbigpIHsKICBpZiAoYmFja2J1cm5lci5j dXJyZW50SW5zdGFuY2UpIHsKICAgIGJhY2tidXJuZXIuY3VycmVudEluc3Rh bmNlLnF1ZXVlcy5zeW5jLmZsdXNoKCk7CiAgfQp9OwoKLyoqCiAgSW52b2tl cyB0aGUgcGFzc2VkIHRhcmdldC9tZXRob2QgYW5kIG9wdGlvbmFsIGFyZ3Vt ZW50cyBhZnRlciBhIHNwZWNpZmllZAogIHBlcmlvZCBpZiB0aW1lLiBUaGUg bGFzdCBwYXJhbWV0ZXIgb2YgdGhpcyBtZXRob2QgbXVzdCBhbHdheXMgYmUg YSBudW1iZXIKICBvZiBtaWxsaXNlY29uZHMuCgogIFlvdSBzaG91bGQgdXNl IHRoaXMgbWV0aG9kIHdoZW5ldmVyIHlvdSBuZWVkIHRvIHJ1biBzb21lIGFj dGlvbiBhZnRlciBhCiAgcGVyaW9kIG9mIHRpbWUgaW5zdGVhZCBvZiB1c2lu ZyBgc2V0VGltZW91dCgpYC4gVGhpcyBtZXRob2Qgd2lsbCBlbnN1cmUgdGhh dAogIGl0ZW1zIHRoYXQgZXhwaXJlIGR1cmluZyB0aGUgc2FtZSBzY3JpcHQg ZXhlY3V0aW9uIGN5Y2xlIGFsbCBleGVjdXRlCiAgdG9nZXRoZXIsIHdoaWNo IGlzIG9mdGVuIG1vcmUgZWZmaWNpZW50IHRoYW4gdXNpbmcgYSByZWFsIHNl dFRpbWVvdXQuCgogIGBgYGphdmFzY3JpcHQKICBFbWJlci5ydW4ubGF0ZXIo bXlDb250ZXh0LCBmdW5jdGlvbigpIHsKICAgIC8vIGNvZGUgaGVyZSB3aWxs IGV4ZWN1dGUgd2l0aGluIGEgUnVuTG9vcCBpbiBhYm91dCA1MDBtcyB3aXRo IHRoaXMgPT0gbXlDb250ZXh0CiAgfSwgNTAwKTsKICBgYGAKCiAgQG1ldGhv ZCBsYXRlcgogIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSB0YXJnZXQgb2Yg bWV0aG9kIHRvIGludm9rZQogIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBt ZXRob2QgVGhlIG1ldGhvZCB0byBpbnZva2UuCiAgICBJZiB5b3UgcGFzcyBh IHN0cmluZyBpdCB3aWxsIGJlIHJlc29sdmVkIG9uIHRoZQogICAgdGFyZ2V0 IGF0IHRoZSB0aW1lIHRoZSBtZXRob2QgaXMgaW52b2tlZC4KICBAcGFyYW0g e09iamVjdH0gW2FyZ3MqXSBPcHRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0 byB0aGUgdGltZW91dC4KICBAcGFyYW0ge051bWJlcn0gd2FpdCBOdW1iZXIg b2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQuCiAgQHJldHVybiB7U3RyaW5nfSBh IHN0cmluZyB5b3UgY2FuIHVzZSB0byBjYW5jZWwgdGhlIHRpbWVyIGluCiAg ICBgRW1iZXIucnVuLmNhbmNlbGAgbGF0ZXIuCiovCkVtYmVyLnJ1bi5sYXRl ciA9IGZ1bmN0aW9uKHRhcmdldCwgbWV0aG9kKSB7CiAgcmV0dXJuIGJhY2ti dXJuZXIubGF0ZXIuYXBwbHkoYmFja2J1cm5lciwgYXJndW1lbnRzKTsKfTsK Ci8qKgogIFNjaGVkdWxlIGEgZnVuY3Rpb24gdG8gcnVuIG9uZSB0aW1lIGR1 cmluZyB0aGUgY3VycmVudCBSdW5Mb29wLiBUaGlzIGlzIGVxdWl2YWxlbnQK ICB0byBjYWxsaW5nIGBzY2hlZHVsZU9uY2VgIHdpdGggdGhlICJhY3Rpb25z IiBxdWV1ZS4KCiAgQG1ldGhvZCBvbmNlCiAgQHBhcmFtIHtPYmplY3R9IFt0 YXJnZXRdIFRoZSB0YXJnZXQgb2YgdGhlIG1ldGhvZCB0byBpbnZva2UuCiAg QHBhcmFtIHtGdW5jdGlvbnxTdHJpbmd9IG1ldGhvZCBUaGUgbWV0aG9kIHRv IGludm9rZS4KICAgIElmIHlvdSBwYXNzIGEgc3RyaW5nIGl0IHdpbGwgYmUg cmVzb2x2ZWQgb24gdGhlCiAgICB0YXJnZXQgYXQgdGhlIHRpbWUgdGhlIG1l dGhvZCBpcyBpbnZva2VkLgogIEBwYXJhbSB7T2JqZWN0fSBbYXJncypdIE9w dGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSB0aW1lb3V0LgogIEBy ZXR1cm4ge09iamVjdH0gVGltZXIgaW5mb3JtYXRpb24gZm9yIHVzZSBpbiBj YW5jZWxsaW5nLCBzZWUgYEVtYmVyLnJ1bi5jYW5jZWxgLgoqLwpFbWJlci5y dW4ub25jZSA9IGZ1bmN0aW9uKHRhcmdldCwgbWV0aG9kKSB7CiAgY2hlY2tB dXRvUnVuKCk7CiAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7 CiAgYXJncy51bnNoaWZ0KCdhY3Rpb25zJyk7CiAgcmV0dXJuIGJhY2tidXJu ZXIuc2NoZWR1bGVPbmNlLmFwcGx5KGJhY2tidXJuZXIsIGFyZ3MpOwp9OwoK LyoqCiAgU2NoZWR1bGVzIGEgZnVuY3Rpb24gdG8gcnVuIG9uZSB0aW1lIGlu IGEgZ2l2ZW4gcXVldWUgb2YgdGhlIGN1cnJlbnQgUnVuTG9vcC4KICBDYWxs aW5nIHRoaXMgbWV0aG9kIHdpdGggdGhlIHNhbWUgcXVldWUvdGFyZ2V0L21l dGhvZCBjb21iaW5hdGlvbiB3aWxsIGhhdmUKICBubyBlZmZlY3QgKHBhc3Qg dGhlIGluaXRpYWwgY2FsbCkuCgogIE5vdGUgdGhhdCBhbHRob3VnaCB5b3Ug Y2FuIHBhc3Mgb3B0aW9uYWwgYXJndW1lbnRzIHRoZXNlIHdpbGwgbm90IGJl CiAgY29uc2lkZXJlZCB3aGVuIGxvb2tpbmcgZm9yIGR1cGxpY2F0ZXMuIE5l dyBhcmd1bWVudHMgd2lsbCByZXBsYWNlIHByZXZpb3VzCiAgY2FsbHMuCgog IGBgYGphdmFzY3JpcHQKICBFbWJlci5ydW4oZnVuY3Rpb24oKSB7CiAgICB2 YXIgc2F5SGkgPSBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2hpJyk7IH0K ICAgIEVtYmVyLnJ1bi5zY2hlZHVsZU9uY2UoJ2FmdGVyUmVuZGVyJywgbXlD b250ZXh0LCBzYXlIaSk7CiAgICBFbWJlci5ydW4uc2NoZWR1bGVPbmNlKCdh ZnRlclJlbmRlcicsIG15Q29udGV4dCwgc2F5SGkpOwogICAgLy8gc2F5SGkg d2lsbCBvbmx5IGJlIGV4ZWN1dGVkIG9uY2UsIGluIHRoZSBhZnRlclJlbmRl ciBxdWV1ZSBvZiB0aGUgUnVuTG9vcAogIH0pOwogIGBgYAoKICBBbHNvIG5v dGUgdGhhdCBwYXNzaW5nIGFuIGFub255bW91cyBmdW5jdGlvbiB0byBgRW1i ZXIucnVuLnNjaGVkdWxlT25jZWAgd2lsbAogIG5vdCBwcmV2ZW50IGFkZGl0 aW9uYWwgY2FsbHMgd2l0aCBhbiBpZGVudGljYWwgYW5vbnltb3VzIGZ1bmN0 aW9uIGZyb20KICBzY2hlZHVsaW5nIHRoZSBpdGVtcyBtdWx0aXBsZSB0aW1l cywgZS5nLjoKCiAgYGBgamF2YXNjcmlwdAogIGZ1bmN0aW9uIHNjaGVkdWxl SXQoKSB7CiAgICBFbWJlci5ydW4uc2NoZWR1bGVPbmNlKCdhY3Rpb25zJywg bXlDb250ZXh0LCBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coIkNsb3N1cmUi KTsgfSk7CiAgfQogIHNjaGVkdWxlSXQoKTsKICBzY2hlZHVsZUl0KCk7CiAg Ly8gIkNsb3N1cmUiIHdpbGwgcHJpbnQgdHdpY2UsIGV2ZW4gdGhvdWdoIHdl J3JlIHVzaW5nIGBFbWJlci5ydW4uc2NoZWR1bGVPbmNlYCwKICAvLyBiZWNh dXNlIHRoZSBmdW5jdGlvbiB3ZSBwYXNzIHRvIGl0IGlzIGFub255bW91cyBh bmQgd29uJ3QgbWF0Y2ggdGhlCiAgLy8gcHJldmlvdXNseSBzY2hlZHVsZWQg b3BlcmF0aW9uLgogIGBgYAoKICBBdmFpbGFibGUgcXVldWVzLCBhbmQgdGhl aXIgb3JkZXIsIGNhbiBiZSBmb3VuZCBhdCBgRW1iZXIucnVuLnF1ZXVlc2AK CiAgQG1ldGhvZCBzY2hlZHVsZU9uY2UKICBAcGFyYW0ge1N0cmluZ30gW3F1 ZXVlXSBUaGUgbmFtZSBvZiB0aGUgcXVldWUgdG8gc2NoZWR1bGUgYWdhaW5z dC4gRGVmYXVsdCBxdWV1ZXMgYXJlICdzeW5jJyBhbmQgJ2FjdGlvbnMnLgog IEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSBUaGUgdGFyZ2V0IG9mIHRoZSBt ZXRob2QgdG8gaW52b2tlLgogIEBwYXJhbSB7RnVuY3Rpb258U3RyaW5nfSBt ZXRob2QgVGhlIG1ldGhvZCB0byBpbnZva2UuCiAgICBJZiB5b3UgcGFzcyBh IHN0cmluZyBpdCB3aWxsIGJlIHJlc29sdmVkIG9uIHRoZQogICAgdGFyZ2V0 IGF0IHRoZSB0aW1lIHRoZSBtZXRob2QgaXMgaW52b2tlZC4KICBAcGFyYW0g e09iamVjdH0gW2FyZ3MqXSBPcHRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0 byB0aGUgdGltZW91dC4KICBAcmV0dXJuIHtPYmplY3R9IFRpbWVyIGluZm9y bWF0aW9uIGZvciB1c2UgaW4gY2FuY2VsbGluZywgc2VlIGBFbWJlci5ydW4u Y2FuY2VsYC4KKi8KRW1iZXIucnVuLnNjaGVkdWxlT25jZSA9IGZ1bmN0aW9u KHF1ZXVlLCB0YXJnZXQsIG1ldGhvZCkgewogIGNoZWNrQXV0b1J1bigpOwog IHJldHVybiBiYWNrYnVybmVyLnNjaGVkdWxlT25jZS5hcHBseShiYWNrYnVy bmVyLCBhcmd1bWVudHMpOwp9OwoKLyoqCiAgU2NoZWR1bGVzIGFuIGl0ZW0g dG8gcnVuIGZyb20gd2l0aGluIGEgc2VwYXJhdGUgcnVuIGxvb3AsIGFmdGVy CiAgY29udHJvbCBoYXMgYmVlbiByZXR1cm5lZCB0byB0aGUgc3lzdGVtLiBU aGlzIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZwogIGBFbWJlci5ydW4ubGF0 ZXJgIHdpdGggYSB3YWl0IHRpbWUgb2YgMW1zLgoKICBgYGBqYXZhc2NyaXB0 CiAgRW1iZXIucnVuLm5leHQobXlDb250ZXh0LCBmdW5jdGlvbigpIHsKICAg IC8vIGNvZGUgdG8gYmUgZXhlY3V0ZWQgaW4gdGhlIG5leHQgcnVuIGxvb3As CiAgICAvLyB3aGljaCB3aWxsIGJlIHNjaGVkdWxlZCBhZnRlciB0aGUgY3Vy cmVudCBvbmUKICB9KTsKICBgYGAKCiAgTXVsdGlwbGUgb3BlcmF0aW9ucyBz Y2hlZHVsZWQgd2l0aCBgRW1iZXIucnVuLm5leHRgIHdpbGwgY29hbGVzY2UK ICBpbnRvIHRoZSBzYW1lIGxhdGVyIHJ1biBsb29wLCBhbG9uZyB3aXRoIGFu eSBvdGhlciBvcGVyYXRpb25zCiAgc2NoZWR1bGVkIGJ5IGBFbWJlci5ydW4u bGF0ZXJgIHRoYXQgZXhwaXJlIHJpZ2h0IGFyb3VuZCB0aGUgc2FtZQogIHRp bWUgdGhhdCBgRW1iZXIucnVuLm5leHRgIG9wZXJhdGlvbnMgd2lsbCBmaXJl LgoKICBOb3RlIHRoYXQgdGhlcmUgYXJlIG9mdGVuIGFsdGVybmF0aXZlcyB0 byB1c2luZyBgRW1iZXIucnVuLm5leHRgLgogIEZvciBpbnN0YW5jZSwgaWYg eW91J2QgbGlrZSB0byBzY2hlZHVsZSBhbiBvcGVyYXRpb24gdG8gaGFwcGVu CiAgYWZ0ZXIgYWxsIERPTSBlbGVtZW50IG9wZXJhdGlvbnMgaGF2ZSBjb21w bGV0ZWQgd2l0aGluIHRoZSBjdXJyZW50CiAgcnVuIGxvb3AsIHlvdSBjYW4g bWFrZSB1c2Ugb2YgdGhlIGBhZnRlclJlbmRlcmAgcnVuIGxvb3AgcXVldWUg KGFkZGVkCiAgYnkgdGhlIGBlbWJlci12aWV3c2AgcGFja2FnZSwgYWxvbmcg d2l0aCB0aGUgcHJlY2VkaW5nIGByZW5kZXJgIHF1ZXVlCiAgd2hlcmUgYWxs IHRoZSBET00gZWxlbWVudCBvcGVyYXRpb25zIGhhcHBlbikuIEV4YW1wbGU6 CgogIGBgYGphdmFzY3JpcHQKICBBcHAuTXlDb2xsZWN0aW9uVmlldyA9IEVt YmVyLkNvbGxlY3Rpb25WaWV3LmV4dGVuZCh7CiAgICBkaWRJbnNlcnRFbGVt ZW50OiBmdW5jdGlvbigpIHsKICAgICAgRW1iZXIucnVuLnNjaGVkdWxlT25j ZSgnYWZ0ZXJSZW5kZXInLCB0aGlzLCAncHJvY2Vzc0NoaWxkRWxlbWVudHMn KTsKICAgIH0sCiAgICBwcm9jZXNzQ2hpbGRFbGVtZW50czogZnVuY3Rpb24o KSB7CiAgICAgIC8vIC4uLiBkbyBzb21ldGhpbmcgd2l0aCBjb2xsZWN0aW9u VmlldydzIGNoaWxkIHZpZXcKICAgICAgLy8gZWxlbWVudHMgYWZ0ZXIgdGhl eSd2ZSBmaW5pc2hlZCByZW5kZXJpbmcsIHdoaWNoCiAgICAgIC8vIGNhbid0 IGJlIGRvbmUgd2l0aGluIHRoZSBDb2xsZWN0aW9uVmlldydzCiAgICAgIC8v IGBkaWRJbnNlcnRFbGVtZW50YCBob29rIGJlY2F1c2UgdGhhdCBnZXRzIHJ1 bgogICAgICAvLyBiZWZvcmUgdGhlIGNoaWxkIGVsZW1lbnRzIGhhdmUgYmVl biBhZGRlZCB0byB0aGUgRE9NLgogICAgfQogIH0pOwogIGBgYAoKICBPbmUg YmVuZWZpdCBvZiB0aGUgYWJvdmUgYXBwcm9hY2ggY29tcGFyZWQgdG8gdXNp bmcgYEVtYmVyLnJ1bi5uZXh0YCBpcwogIHRoYXQgeW91IHdpbGwgYmUgYWJs ZSB0byBwZXJmb3JtIERPTS9DU1Mgb3BlcmF0aW9ucyBiZWZvcmUgdW5wcm9j ZXNzZWQKICBlbGVtZW50cyBhcmUgcmVuZGVyZWQgdG8gdGhlIHNjcmVlbiwg d2hpY2ggbWF5IHByZXZlbnQgZmxpY2tlcmluZyBvcgogIG90aGVyIGFydGlm YWN0cyBjYXVzZWQgYnkgZGVsYXlpbmcgcHJvY2Vzc2luZyB1bnRpbCBhZnRl ciByZW5kZXJpbmcuCgogIFRoZSBvdGhlciBtYWpvciBiZW5lZml0IHRvIHRo ZSBhYm92ZSBhcHByb2FjaCBpcyB0aGF0IGBFbWJlci5ydW4ubmV4dGAKICBp bnRyb2R1Y2VzIGFuIGVsZW1lbnQgb2Ygbm9uLWRldGVybWluaXNtLCB3aGlj aCBjYW4gbWFrZSB0aGluZ3MgbXVjaAogIGhhcmRlciB0byB0ZXN0LCBkdWUg dG8gaXRzIHJlbGlhbmNlIG9uIGBzZXRUaW1lb3V0YDsgaXQncyBtdWNoIGhh cmRlcgogIHRvIGd1YXJhbnRlZSB0aGUgb3JkZXIgb2Ygc2NoZWR1bGVkIG9w ZXJhdGlvbnMgd2hlbiB0aGV5IGFyZSBzY2hlZHVsZWQKICBvdXRzaWRlIG9m IHRoZSBjdXJyZW50IHJ1biBsb29wLCBpLmUuIHdpdGggYEVtYmVyLnJ1bi5u ZXh0YC4KCiAgQG1ldGhvZCBuZXh0CiAgQHBhcmFtIHtPYmplY3R9IFt0YXJn ZXRdIHRhcmdldCBvZiBtZXRob2QgdG8gaW52b2tlCiAgQHBhcmFtIHtGdW5j dGlvbnxTdHJpbmd9IG1ldGhvZCBUaGUgbWV0aG9kIHRvIGludm9rZS4KICAg IElmIHlvdSBwYXNzIGEgc3RyaW5nIGl0IHdpbGwgYmUgcmVzb2x2ZWQgb24g dGhlCiAgICB0YXJnZXQgYXQgdGhlIHRpbWUgdGhlIG1ldGhvZCBpcyBpbnZv a2VkLgogIEBwYXJhbSB7T2JqZWN0fSBbYXJncypdIE9wdGlvbmFsIGFyZ3Vt ZW50cyB0byBwYXNzIHRvIHRoZSB0aW1lb3V0LgogIEByZXR1cm4ge09iamVj dH0gVGltZXIgaW5mb3JtYXRpb24gZm9yIHVzZSBpbiBjYW5jZWxsaW5nLCBz ZWUgYEVtYmVyLnJ1bi5jYW5jZWxgLgoqLwpFbWJlci5ydW4ubmV4dCA9IGZ1 bmN0aW9uKCkgewogIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMp OwogIGFyZ3MucHVzaCgxKTsKICByZXR1cm4gYmFja2J1cm5lci5sYXRlci5h cHBseShiYWNrYnVybmVyLCBhcmdzKTsKfTsKCi8qKgogIENhbmNlbHMgYSBz Y2hlZHVsZWQgaXRlbS4gTXVzdCBiZSBhIHZhbHVlIHJldHVybmVkIGJ5IGBF bWJlci5ydW4ubGF0ZXIoKWAsCiAgYEVtYmVyLnJ1bi5vbmNlKClgLCBgRW1i ZXIucnVuLm5leHQoKWAsIGBFbWJlci5ydW4uZGVib3VuY2UoKWAsIG9yCiAg YEVtYmVyLnJ1bi50aHJvdHRsZSgpYC4KCiAgYGBgamF2YXNjcmlwdAogIHZh ciBydW5OZXh0ID0gRW1iZXIucnVuLm5leHQobXlDb250ZXh0LCBmdW5jdGlv bigpIHsKICAgIC8vIHdpbGwgbm90IGJlIGV4ZWN1dGVkCiAgfSk7CiAgRW1i ZXIucnVuLmNhbmNlbChydW5OZXh0KTsKCiAgdmFyIHJ1bkxhdGVyID0gRW1i ZXIucnVuLmxhdGVyKG15Q29udGV4dCwgZnVuY3Rpb24oKSB7CiAgICAvLyB3 aWxsIG5vdCBiZSBleGVjdXRlZAogIH0sIDUwMCk7CiAgRW1iZXIucnVuLmNh bmNlbChydW5MYXRlcik7CgogIHZhciBydW5PbmNlID0gRW1iZXIucnVuLm9u Y2UobXlDb250ZXh0LCBmdW5jdGlvbigpIHsKICAgIC8vIHdpbGwgbm90IGJl IGV4ZWN1dGVkCiAgfSk7CiAgRW1iZXIucnVuLmNhbmNlbChydW5PbmNlKTsK CiAgdmFyIHRocm90dGxlID0gRW1iZXIucnVuLnRocm90dGxlKG15Q29udGV4 dCwgZnVuY3Rpb24oKSB7CiAgICAvLyB3aWxsIG5vdCBiZSBleGVjdXRlZAog IH0sIDEsIGZhbHNlKTsKICBFbWJlci5ydW4uY2FuY2VsKHRocm90dGxlKTsK CiAgdmFyIGRlYm91bmNlID0gRW1iZXIucnVuLmRlYm91bmNlKG15Q29udGV4 dCwgZnVuY3Rpb24oKSB7CiAgICAvLyB3aWxsIG5vdCBiZSBleGVjdXRlZAog IH0sIDEpOwogIEVtYmVyLnJ1bi5jYW5jZWwoZGVib3VuY2UpOwoKICB2YXIg ZGVib3VuY2VJbW1lZGlhdGUgPSBFbWJlci5ydW4uZGVib3VuY2UobXlDb250 ZXh0LCBmdW5jdGlvbigpIHsKICAgIC8vIHdpbGwgYmUgZXhlY3V0ZWQgc2lu Y2Ugd2UgcGFzc2VkIGluIHRydWUgKGltbWVkaWF0ZSkKICB9LCAxMDAsIHRy dWUpOwogIC8vIHRoZSAxMDBtcyBkZWxheSB1bnRpbCB0aGlzIG1ldGhvZCBj YW4gYmUgY2FsbGVkIGFnYWluIHdpbGwgYmUgY2FuY2VsbGVkCiAgRW1iZXIu cnVuLmNhbmNlbChkZWJvdW5jZUltbWVkaWF0ZSk7CiAgYGBgCiAgYGBgCiAg YGBgCgogIEBtZXRob2QgY2FuY2VsCiAgQHBhcmFtIHtPYmplY3R9IHRpbWVy IFRpbWVyIG9iamVjdCB0byBjYW5jZWwKICBAcmV0dXJuIHtCb29sZWFufSB0 cnVlIGlmIGNhbmNlbGxlZCBvciBmYWxzZS91bmRlZmluZWQgaWYgaXQgd2Fz bid0IGZvdW5kCiovCkVtYmVyLnJ1bi5jYW5jZWwgPSBmdW5jdGlvbih0aW1l cikgewogIHJldHVybiBiYWNrYnVybmVyLmNhbmNlbCh0aW1lcik7Cn07Cgov KioKICBEZWxheSBjYWxsaW5nIHRoZSB0YXJnZXQgbWV0aG9kIHVudGlsIHRo ZSBkZWJvdW5jZSBwZXJpb2QgaGFzIGVsYXBzZWQKICB3aXRoIG5vIGFkZGl0 aW9uYWwgZGVib3VuY2UgY2FsbHMuIElmIGBkZWJvdW5jZWAgaXMgY2FsbGVk IGFnYWluIGJlZm9yZQogIHRoZSBzcGVjaWZpZWQgdGltZSBoYXMgZWxhcHNl ZCwgdGhlIHRpbWVyIGlzIHJlc2V0IGFuZCB0aGUgZW50aXJlIHBlcmlvZAog IG11c3QgcGFzcyBhZ2FpbiBiZWZvcmUgdGhlIHRhcmdldCBtZXRob2QgaXMg Y2FsbGVkLgoKICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCB3aGVuIGFu IGV2ZW50IG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMKICBidXQgdGhl IGFjdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSB3aGVuIHRoZSBl dmVudCBpcyBkb25lIGZpcmluZy4KICBBIGNvbW1vbiBleGFtcGxlIGlzIGZv ciBzY3JvbGwgZXZlbnRzIHdoZXJlIHlvdSBvbmx5IHdhbnQgdXBkYXRlcyB0 bwogIGhhcHBlbiBvbmNlIHNjcm9sbGluZyBoYXMgY2Vhc2VkLgoKICBgYGBq YXZhc2NyaXB0CiAgICB2YXIgbXlGdW5jID0gZnVuY3Rpb24oKSB7IGNvbnNv bGUubG9nKHRoaXMubmFtZSArICcgcmFuLicpOyB9OwogICAgdmFyIG15Q29u dGV4dCA9IHtuYW1lOiAnZGVib3VuY2UnfTsKCiAgICBFbWJlci5ydW4uZGVi b3VuY2UobXlDb250ZXh0LCBteUZ1bmMsIDE1MCk7CgogICAgLy8gbGVzcyB0 aGFuIDE1MG1zIHBhc3NlcwoKICAgIEVtYmVyLnJ1bi5kZWJvdW5jZShteUNv bnRleHQsIG15RnVuYywgMTUwKTsKCiAgICAvLyAxNTBtcyBwYXNzZXMKICAg IC8vIG15RnVuYyBpcyBpbnZva2VkIHdpdGggY29udGV4dCBteUNvbnRleHQK ICAgIC8vIGNvbnNvbGUgbG9ncyAnZGVib3VuY2UgcmFuLicgb25lIHRpbWUu CiAgYGBgCgogIEltbWVkaWF0ZSBhbGxvd3MgeW91IHRvIHJ1biB0aGUgZnVu Y3Rpb24gaW1tZWRpYXRlbHksIGJ1dCBkZWJvdW5jZQogIG90aGVyIGNhbGxz IGZvciB0aGlzIGZ1bmN0aW9uIHVudGlsIHRoZSB3YWl0IHRpbWUgaGFzIGVs YXBzZWQuIElmCiAgYGRlYm91bmNlYCBpcyBjYWxsZWQgYWdhaW4gYmVmb3Jl IHRoZSBzcGVjaWZpZWQgdGltZSBoYXMgZWxhcHNlZCwKICB0aGUgdGltZXIg aXMgcmVzZXQgYW5kIHRoZSBlbnRpcmUgcGVyaW9kIG1zdXQgcGFzcyBhZ2Fp biBiZWZvcmUKICB0aGUgbWV0aG9kIGNhbiBiZSBjYWxsZWQgYWdhaW4uCgog IGBgYGphdmFzY3JpcHQKICAgIHZhciBteUZ1bmMgPSBmdW5jdGlvbigpIHsg Y29uc29sZS5sb2codGhpcy5uYW1lICsgJyByYW4uJyk7IH07CiAgICB2YXIg bXlDb250ZXh0ID0ge25hbWU6ICdkZWJvdW5jZSd9OwoKICAgIEVtYmVyLnJ1 bi5kZWJvdW5jZShteUNvbnRleHQsIG15RnVuYywgMTUwLCB0cnVlKTsKCiAg ICAvLyBjb25zb2xlIGxvZ3MgJ2RlYm91bmNlIHJhbi4nIG9uZSB0aW1lIGlt bWVkaWF0ZWx5LgogICAgLy8gMTAwbXMgcGFzc2VzCgogICAgRW1iZXIucnVu LmRlYm91bmNlKG15Q29udGV4dCwgbXlGdW5jLCAxNTAsIHRydWUpOwoKICAg IC8vIDE1MG1zIHBhc3NlcyBhbmQgbm90aGluZyBlbHNlIGlzIGxvZ2dlZCB0 byB0aGUgY29uc29sZSBhbmQKICAgIC8vIHRoZSBkZWJvdW5jZWUgaXMgbm8g bG9uZ2VyIGJlaW5nIHdhdGNoZWQKCiAgICBFbWJlci5ydW4uZGVib3VuY2Uo bXlDb250ZXh0LCBteUZ1bmMsIDE1MCwgdHJ1ZSk7CgogICAgLy8gY29uc29s ZSBsb2dzICdkZWJvdW5jZSByYW4uJyBvbmUgdGltZSBpbW1lZGlhdGVseS4K ICAgIC8vIDE1MG1zIHBhc3NlcyBhbmQgbm90aGluZyBlbHNlIGlzIGxvZ2dl ZCB0b3QgaGUgY29uc29sZSBhbmQKICAgIC8vIHRoZSBkZWJvdW5jZWUgaXMg bm8gbG9uZ2VyIGJlaW5nIHdhdGNoZWQKCiAgYGBgCgogIEBtZXRob2QgZGVi b3VuY2UKICBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0gdGFyZ2V0IG9mIG1l dGhvZCB0byBpbnZva2UKICBAcGFyYW0ge0Z1bmN0aW9ufFN0cmluZ30gbWV0 aG9kIFRoZSBtZXRob2QgdG8gaW52b2tlLgogICAgTWF5IGJlIGEgZnVuY3Rp b24gb3IgYSBzdHJpbmcuIElmIHlvdSBwYXNzIGEgc3RyaW5nCiAgICB0aGVu IGl0IHdpbGwgYmUgbG9va2VkIHVwIG9uIHRoZSBwYXNzZWQgdGFyZ2V0Lgog IEBwYXJhbSB7T2JqZWN0fSBbYXJncypdIE9wdGlvbmFsIGFyZ3VtZW50cyB0 byBwYXNzIHRvIHRoZSB0aW1lb3V0LgogIEBwYXJhbSB7TnVtYmVyfSB3YWl0 IE51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdC4KICBAcGFyYW0ge0Jv b2xlYW59IGltbWVkaWF0ZSBUcmlnZ2VyIHRoZSBmdW5jdGlvbiBvbiB0aGUg bGVhZGluZyBpbnN0ZWFkIAogICAgb2YgdGhlIHRyYWlsaW5nIGVkZ2Ugb2Yg dGhlIHdhaXQgaW50ZXJ2YWwuIERlZmF1bHRzIHRvIGZhbHNlLgogIEByZXR1 cm4ge0FycmF5fSBUaW1lciBpbmZvcm1hdGlvbiBmb3IgdXNlIGluIGNhbmNl bGxpbmcsIHNlZSBgRW1iZXIucnVuLmNhbmNlbGAuCiovCkVtYmVyLnJ1bi5k ZWJvdW5jZSA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBiYWNrYnVybmVyLmRl Ym91bmNlLmFwcGx5KGJhY2tidXJuZXIsIGFyZ3VtZW50cyk7Cn07CgovKioK ICBFbnN1cmUgdGhhdCB0aGUgdGFyZ2V0IG1ldGhvZCBpcyBuZXZlciBjYWxs ZWQgbW9yZSBmcmVxdWVudGx5IHRoYW4KICB0aGUgc3BlY2lmaWVkIHNwYWNp bmcgcGVyaW9kLgoKICBgYGBqYXZhc2NyaXB0CiAgICB2YXIgbXlGdW5jID0g ZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKHRoaXMubmFtZSArICcgcmFuLicp OyB9OwogICAgdmFyIG15Q29udGV4dCA9IHtuYW1lOiAndGhyb3R0bGUnfTsK CiAgICBFbWJlci5ydW4udGhyb3R0bGUobXlDb250ZXh0LCBteUZ1bmMsIDE1 MCk7CiAgICAvLyBteUZ1bmMgaXMgaW52b2tlZCB3aXRoIGNvbnRleHQgbXlD b250ZXh0CgogICAgLy8gNTBtcyBwYXNzZXMKICAgIEVtYmVyLnJ1bi50aHJv dHRsZShteUNvbnRleHQsIG15RnVuYywgMTUwKTsKCiAgICAvLyA1MG1zIHBh c3NlcwogICAgRW1iZXIucnVuLnRocm90dGxlKG15Q29udGV4dCwgbXlGdW5j LCAxNTApOwoKICAgIC8vIDE1MG1zIHBhc3NlcwogICAgRW1iZXIucnVuLnRo cm90dGxlKG15Q29udGV4dCwgbXlGdW5jLCAxNTApOwogICAgLy8gbXlGdW5j IGlzIGludm9rZWQgd2l0aCBjb250ZXh0IG15Q29udGV4dAogICAgLy8gY29u c29sZSBsb2dzICd0aHJvdHRsZSByYW4uJyB0d2ljZSwgMjUwbXMgYXBhcnQu CiAgYGBgCgogIEBtZXRob2QgdGhyb3R0bGUKICBAcGFyYW0ge09iamVjdH0g W3RhcmdldF0gdGFyZ2V0IG9mIG1ldGhvZCB0byBpbnZva2UKICBAcGFyYW0g e0Z1bmN0aW9ufFN0cmluZ30gbWV0aG9kIFRoZSBtZXRob2QgdG8gaW52b2tl LgogICAgTWF5IGJlIGEgZnVuY3Rpb24gb3IgYSBzdHJpbmcuIElmIHlvdSBw YXNzIGEgc3RyaW5nCiAgICB0aGVuIGl0IHdpbGwgYmUgbG9va2VkIHVwIG9u IHRoZSBwYXNzZWQgdGFyZ2V0LgogIEBwYXJhbSB7T2JqZWN0fSBbYXJncypd IE9wdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSB0aW1lb3V0Lgog IEBwYXJhbSB7TnVtYmVyfSBzcGFjaW5nIE51bWJlciBvZiBtaWxsaXNlY29u ZHMgdG8gc3BhY2Ugb3V0IHJlcXVlc3RzLgogIEByZXR1cm4ge0FycmF5fSBU aW1lciBpbmZvcm1hdGlvbiBmb3IgdXNlIGluIGNhbmNlbGxpbmcsIHNlZSBg RW1iZXIucnVuLmNhbmNlbGAuCiovCkVtYmVyLnJ1bi50aHJvdHRsZSA9IGZ1 bmN0aW9uKCkgewogIHJldHVybiBiYWNrYnVybmVyLnRocm90dGxlLmFwcGx5 KGJhY2tidXJuZXIsIGFyZ3VtZW50cyk7Cn07CgovLyBNYWtlIHN1cmUgaXQn cyBub3QgYW4gYXV0b3J1biBkdXJpbmcgdGVzdGluZwpmdW5jdGlvbiBjaGVj a0F1dG9SdW4oKSB7CiAgaWYgKCFFbWJlci5ydW4uY3VycmVudFJ1bkxvb3Ap IHsKICAgIEVtYmVyLmFzc2VydCgiWW91IGhhdmUgdHVybmVkIG9uIHRlc3Rp bmcgbW9kZSwgd2hpY2ggZGlzYWJsZWQgdGhlIHJ1bi1sb29wJ3MgYXV0b3J1 bi4gWW91IHdpbGwgbmVlZCB0byB3cmFwIGFueSBjb2RlIHdpdGggYXN5bmNo cm9ub3VzIHNpZGUtZWZmZWN0cyBpbiBhbiBFbWJlci5ydW4iLCAhRW1iZXIu dGVzdGluZyk7CiAgfQp9Cgp9KSgpOwoKCgooZnVuY3Rpb24oKSB7Ci8vIEVt YmVyLkxvZ2dlcgovLyBnZXQKLy8gc2V0Ci8vIGd1aWRGb3IsIG1ldGEKLy8g YWRkT2JzZXJ2ZXIsIHJlbW92ZU9ic2VydmVyCi8vIEVtYmVyLnJ1bi5zY2hl ZHVsZQovKioKQG1vZHVsZSBlbWJlci1tZXRhbAoqLwoKLy8gLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLgovLyBDT05TVEFOVFMKLy8KCi8qKgogIERlYnVnIHBhcmFtZXRlciB5 b3UgY2FuIHR1cm4gb24uIFRoaXMgd2lsbCBsb2cgYWxsIGJpbmRpbmdzIHRo YXQgZmlyZSB0bwogIHRoZSBjb25zb2xlLiBUaGlzIHNob3VsZCBiZSBkaXNh YmxlZCBpbiBwcm9kdWN0aW9uIGNvZGUuIE5vdGUgdGhhdCB5b3UKICBjYW4g YWxzbyBlbmFibGUgdGhpcyBmcm9tIHRoZSBjb25zb2xlIG9yIHRlbXBvcmFy aWx5LgoKICBAcHJvcGVydHkgTE9HX0JJTkRJTkdTCiAgQGZvciBFbWJlcgog IEB0eXBlIEJvb2xlYW4KICBAZGVmYXVsdCBmYWxzZQoqLwpFbWJlci5MT0df QklORElOR1MgPSBmYWxzZSB8fCAhIUVtYmVyLkVOVi5MT0dfQklORElOR1M7 Cgp2YXIgZ2V0ICAgICA9IEVtYmVyLmdldCwKICAgIHNldCAgICAgPSBFbWJl ci5zZXQsCiAgICBndWlkRm9yID0gRW1iZXIuZ3VpZEZvciwKICAgIElTX0dM T0JBTCA9IC9eKFtBLVokXXwoWzAtOV1bQS1aJF0pKS87CgovKioKICBSZXR1 cm5zIHRydWUgaWYgdGhlIHByb3ZpZGVkIHBhdGggaXMgZ2xvYmFsIChlLmcu LCBgTXlBcHAuZm9vQ29udHJvbGxlci5iYXJgKQogIGluc3RlYWQgb2YgbG9j YWwgKGBmb28uYmFyLmJhemApLgoKICBAbWV0aG9kIGlzR2xvYmFsUGF0aAog IEBmb3IgRW1iZXIKICBAcHJpdmF0ZQogIEBwYXJhbSB7U3RyaW5nfSBwYXRo CiAgQHJldHVybiBCb29sZWFuCiovCnZhciBpc0dsb2JhbFBhdGggPSBFbWJl ci5pc0dsb2JhbFBhdGggPSBmdW5jdGlvbihwYXRoKSB7CiAgcmV0dXJuIElT X0dMT0JBTC50ZXN0KHBhdGgpOwp9OwoKZnVuY3Rpb24gZ2V0V2l0aEdsb2Jh bHMob2JqLCBwYXRoKSB7CiAgcmV0dXJuIGdldChpc0dsb2JhbFBhdGgocGF0 aCkgPyBFbWJlci5sb29rdXAgOiBvYmosIHBhdGgpOwp9CgovLyAuLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uCi8vIEJJTkRJTkcKLy8KCnZhciBCaW5kaW5nID0gZnVuY3Rpb24o dG9QYXRoLCBmcm9tUGF0aCkgewogIHRoaXMuX2RpcmVjdGlvbiA9ICdmd2Qn OwogIHRoaXMuX2Zyb20gPSBmcm9tUGF0aDsKICB0aGlzLl90byAgID0gdG9Q YXRoOwogIHRoaXMuX2RpcmVjdGlvbk1hcCA9IEVtYmVyLk1hcC5jcmVhdGUo KTsKfTsKCi8qKgpAY2xhc3MgQmluZGluZwpAbmFtZXNwYWNlIEVtYmVyCiov CgpCaW5kaW5nLnByb3RvdHlwZSA9IHsKICAvKioKICAgIFRoaXMgY29waWVz IHRoZSBCaW5kaW5nIHNvIGl0IGNhbiBiZSBjb25uZWN0ZWQgdG8gYW5vdGhl ciBvYmplY3QuCgogICAgQG1ldGhvZCBjb3B5CiAgICBAcmV0dXJuIHtFbWJl ci5CaW5kaW5nfSBgdGhpc2AKICAqLwogIGNvcHk6IGZ1bmN0aW9uICgpIHsK ICAgIHZhciBjb3B5ID0gbmV3IEJpbmRpbmcodGhpcy5fdG8sIHRoaXMuX2Zy b20pOwogICAgaWYgKHRoaXMuX29uZVdheSkgeyBjb3B5Ll9vbmVXYXkgPSB0 cnVlOyB9CiAgICByZXR1cm4gY29weTsKICB9LAoKICAvLyAuLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uCiAgLy8gQ09ORklHCiAgLy8KCiAgLyoqCiAgICBUaGlzIHdpbGwgc2V0 IGBmcm9tYCBwcm9wZXJ0eSBwYXRoIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUu IEl0IHdpbGwgbm90CiAgICBhdHRlbXB0IHRvIHJlc29sdmUgdGhpcyBwcm9w ZXJ0eSBwYXRoIHRvIGFuIGFjdHVhbCBvYmplY3QgdW50aWwgeW91CiAgICBj b25uZWN0IHRoZSBiaW5kaW5nLgoKICAgIFRoZSBiaW5kaW5nIHdpbGwgc2Vh cmNoIGZvciB0aGUgcHJvcGVydHkgcGF0aCBzdGFydGluZyBhdCB0aGUgcm9v dCBvYmplY3QKICAgIHlvdSBwYXNzIHdoZW4geW91IGBjb25uZWN0KClgIHRo ZSBiaW5kaW5nLiBJdCBmb2xsb3dzIHRoZSBzYW1lIHJ1bGVzIGFzCiAgICBg Z2V0KClgIC0gc2VlIHRoYXQgbWV0aG9kIGZvciBtb3JlIGluZm9ybWF0aW9u LgoKICAgIEBtZXRob2QgZnJvbQogICAgQHBhcmFtIHtTdHJpbmd9IHBhdGgg dGhlIHByb3BlcnR5IHBhdGggdG8gY29ubmVjdCB0bwogICAgQHJldHVybiB7 RW1iZXIuQmluZGluZ30gYHRoaXNgCiAgKi8KICBmcm9tOiBmdW5jdGlvbihw YXRoKSB7CiAgICB0aGlzLl9mcm9tID0gcGF0aDsKICAgIHJldHVybiB0aGlz OwogIH0sCgogIC8qKgogICAgVGhpcyB3aWxsIHNldCB0aGUgYHRvYCBwcm9w ZXJ0eSBwYXRoIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuIEl0IHdpbGwgbm90 CiAgICBhdHRlbXB0IHRvIHJlc29sdmUgdGhpcyBwcm9wZXJ0eSBwYXRoIHRv IGFuIGFjdHVhbCBvYmplY3QgdW50aWwgeW91CiAgICBjb25uZWN0IHRoZSBi aW5kaW5nLgoKICAgIFRoZSBiaW5kaW5nIHdpbGwgc2VhcmNoIGZvciB0aGUg cHJvcGVydHkgcGF0aCBzdGFydGluZyBhdCB0aGUgcm9vdCBvYmplY3QKICAg IHlvdSBwYXNzIHdoZW4geW91IGBjb25uZWN0KClgIHRoZSBiaW5kaW5nLiBJ dCBmb2xsb3dzIHRoZSBzYW1lIHJ1bGVzIGFzCiAgICBgZ2V0KClgIC0gc2Vl IHRoYXQgbWV0aG9kIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKICAgIEBtZXRo b2QgdG8KICAgIEBwYXJhbSB7U3RyaW5nfFR1cGxlfSBwYXRoIEEgcHJvcGVy dHkgcGF0aCBvciB0dXBsZQogICAgQHJldHVybiB7RW1iZXIuQmluZGluZ30g YHRoaXNgCiAgKi8KICB0bzogZnVuY3Rpb24ocGF0aCkgewogICAgdGhpcy5f dG8gPSBwYXRoOwogICAgcmV0dXJuIHRoaXM7CiAgfSwKCiAgLyoqCiAgICBD b25maWd1cmVzIHRoZSBiaW5kaW5nIGFzIG9uZSB3YXkuIEEgb25lLXdheSBi aW5kaW5nIHdpbGwgcmVsYXkgY2hhbmdlcwogICAgb24gdGhlIGBmcm9tYCBz aWRlIHRvIHRoZSBgdG9gIHNpZGUsIGJ1dCBub3QgdGhlIG90aGVyIHdheSBh cm91bmQuIFRoaXMKICAgIG1lYW5zIHRoYXQgaWYgeW91IGNoYW5nZSB0aGUg YHRvYCBzaWRlIGRpcmVjdGx5LCB0aGUgYGZyb21gIHNpZGUgbWF5IGhhdmUK ICAgIGEgZGlmZmVyZW50IHZhbHVlLgoKICAgIEBtZXRob2Qgb25lV2F5CiAg ICBAcmV0dXJuIHtFbWJlci5CaW5kaW5nfSBgdGhpc2AKICAqLwogIG9uZVdh eTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9vbmVXYXkgPSB0cnVlOwogICAg cmV0dXJuIHRoaXM7CiAgfSwKCiAgLyoqCiAgICBAbWV0aG9kIHRvU3RyaW5n CiAgICBAcmV0dXJuIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBv ZiBiaW5kaW5nCiAgKi8KICB0b1N0cmluZzogZnVuY3Rpb24oKSB7CiAgICB2 YXIgb25lV2F5ID0gdGhpcy5fb25lV2F5ID8gJ1tvbmVXYXldJyA6ICcnOwog ICAgcmV0dXJuICJFbWJlci5CaW5kaW5nPCIgKyBndWlkRm9yKHRoaXMpICsg Ij4oIiArIHRoaXMuX2Zyb20gKyAiIC0+ICIgKyB0aGlzLl90byArICIpIiAr IG9uZVdheTsKICB9LAoKICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCiAgLy8gQ09OTkVD VCBBTkQgU1lOQwogIC8vCgogIC8qKgogICAgQXR0ZW1wdHMgdG8gY29ubmVj dCB0aGlzIGJpbmRpbmcgaW5zdGFuY2Ugc28gdGhhdCBpdCBjYW4gcmVjZWl2 ZSBhbmQgcmVsYXkKICAgIGNoYW5nZXMuIFRoaXMgbWV0aG9kIHdpbGwgcmFp c2UgYW4gZXhjZXB0aW9uIGlmIHlvdSBoYXZlIG5vdCBzZXQgdGhlCiAgICBm cm9tL3RvIHByb3BlcnRpZXMgeWV0LgoKICAgIEBtZXRob2QgY29ubmVjdAog ICAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgcm9vdCBvYmplY3QgZm9yIHRo aXMgYmluZGluZy4KICAgIEByZXR1cm4ge0VtYmVyLkJpbmRpbmd9IGB0aGlz YAogICovCiAgY29ubmVjdDogZnVuY3Rpb24ob2JqKSB7CiAgICBFbWJlci5h c3NlcnQoJ011c3QgcGFzcyBhIHZhbGlkIG9iamVjdCB0byBFbWJlci5CaW5k aW5nLmNvbm5lY3QoKScsICEhb2JqKTsKCiAgICB2YXIgZnJvbVBhdGggPSB0 aGlzLl9mcm9tLCB0b1BhdGggPSB0aGlzLl90bzsKICAgIEVtYmVyLnRyeVNl dChvYmosIHRvUGF0aCwgZ2V0V2l0aEdsb2JhbHMob2JqLCBmcm9tUGF0aCkp OwoKICAgIC8vIGFkZCBhbiBvYnNlcnZlciBvbiB0aGUgb2JqZWN0IHRvIGJl IG5vdGlmaWVkIHdoZW4gdGhlIGJpbmRpbmcgc2hvdWxkIGJlIHVwZGF0ZWQK ICAgIEVtYmVyLmFkZE9ic2VydmVyKG9iaiwgZnJvbVBhdGgsIHRoaXMsIHRo aXMuZnJvbURpZENoYW5nZSk7CgogICAgLy8gaWYgdGhlIGJpbmRpbmcgaXMg YSB0d28td2F5IGJpbmRpbmcsIGFsc28gc2V0IHVwIGFuIG9ic2VydmVyIG9u IHRoZSB0YXJnZXQKICAgIGlmICghdGhpcy5fb25lV2F5KSB7IEVtYmVyLmFk ZE9ic2VydmVyKG9iaiwgdG9QYXRoLCB0aGlzLCB0aGlzLnRvRGlkQ2hhbmdl KTsgfQoKICAgIHRoaXMuX3JlYWR5VG9TeW5jID0gdHJ1ZTsKCiAgICByZXR1 cm4gdGhpczsKICB9LAoKICAvKioKICAgIERpc2Nvbm5lY3RzIHRoZSBiaW5k aW5nIGluc3RhbmNlLiBDaGFuZ2VzIHdpbGwgbm8gbG9uZ2VyIGJlIHJlbGF5 ZWQuIFlvdQogICAgd2lsbCBub3QgdXN1YWxseSBuZWVkIHRvIGNhbGwgdGhp cyBtZXRob2QuCgogICAgQG1ldGhvZCBkaXNjb25uZWN0CiAgICBAcGFyYW0g e09iamVjdH0gb2JqIFRoZSByb290IG9iamVjdCB5b3UgcGFzc2VkIHdoZW4g Y29ubmVjdGluZyB0aGUgYmluZGluZy4KICAgIEByZXR1cm4ge0VtYmVyLkJp bmRpbmd9IGB0aGlzYAogICovCiAgZGlzY29ubmVjdDogZnVuY3Rpb24ob2Jq KSB7CiAgICBFbWJlci5hc3NlcnQoJ011c3QgcGFzcyBhIHZhbGlkIG9iamVj dCB0byBFbWJlci5CaW5kaW5nLmRpc2Nvbm5lY3QoKScsICEhb2JqKTsKCiAg ICB2YXIgdHdvV2F5ID0gIXRoaXMuX29uZVdheTsKCiAgICAvLyByZW1vdmUg YW4gb2JzZXJ2ZXIgb24gdGhlIG9iamVjdCBzbyB3ZSdyZSBubyBsb25nZXIg bm90aWZpZWQgb2YKICAgIC8vIGNoYW5nZXMgdGhhdCBzaG91bGQgdXBkYXRl IGJpbmRpbmdzLgogICAgRW1iZXIucmVtb3ZlT2JzZXJ2ZXIob2JqLCB0aGlz Ll9mcm9tLCB0aGlzLCB0aGlzLmZyb21EaWRDaGFuZ2UpOwoKICAgIC8vIGlm IHRoZSBiaW5kaW5nIGlzIHR3by13YXksIHJlbW92ZSB0aGUgb2JzZXJ2ZXIg ZnJvbSB0aGUgdGFyZ2V0IGFzIHdlbGwKICAgIGlmICh0d29XYXkpIHsgRW1i ZXIucmVtb3ZlT2JzZXJ2ZXIob2JqLCB0aGlzLl90bywgdGhpcywgdGhpcy50 b0RpZENoYW5nZSk7IH0KCiAgICB0aGlzLl9yZWFkeVRvU3luYyA9IGZhbHNl OyAvLyBkaXNhYmxlIHNjaGVkdWxlZCBzeW5jcy4uLgogICAgcmV0dXJuIHRo aXM7CiAgfSwKCiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgogIC8vIFBSSVZBVEUKICAv LwoKICAvKiBjYWxsZWQgd2hlbiB0aGUgZnJvbSBzaWRlIGNoYW5nZXMgKi8K ICBmcm9tRGlkQ2hhbmdlOiBmdW5jdGlvbih0YXJnZXQpIHsKICAgIHRoaXMu X3NjaGVkdWxlU3luYyh0YXJnZXQsICdmd2QnKTsKICB9LAoKICAvKiBjYWxs ZWQgd2hlbiB0aGUgdG8gc2lkZSBjaGFuZ2VzICovCiAgdG9EaWRDaGFuZ2U6 IGZ1bmN0aW9uKHRhcmdldCkgewogICAgdGhpcy5fc2NoZWR1bGVTeW5jKHRh cmdldCwgJ2JhY2snKTsKICB9LAoKICBfc2NoZWR1bGVTeW5jOiBmdW5jdGlv bihvYmosIGRpcikgewogICAgdmFyIGRpcmVjdGlvbk1hcCA9IHRoaXMuX2Rp cmVjdGlvbk1hcDsKICAgIHZhciBleGlzdGluZ0RpciA9IGRpcmVjdGlvbk1h cC5nZXQob2JqKTsKCiAgICAvLyBpZiB3ZSBoYXZlbid0IHNjaGVkdWxlZCB0 aGUgYmluZGluZyB5ZXQsIHNjaGVkdWxlIGl0CiAgICBpZiAoIWV4aXN0aW5n RGlyKSB7CiAgICAgIEVtYmVyLnJ1bi5zY2hlZHVsZSgnc3luYycsIHRoaXMs IHRoaXMuX3N5bmMsIG9iaik7CiAgICAgIGRpcmVjdGlvbk1hcC5zZXQob2Jq LCBkaXIpOwogICAgfQoKICAgIC8vIElmIGJvdGggYSAnYmFjaycgYW5kICdm d2QnIHN5bmMgaGF2ZSBiZWVuIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSBvYmpl Y3QsCiAgICAvLyBkZWZhdWx0IHRvIGEgJ2Z3ZCcgc3luYyBzbyB0aGF0IGl0 IHJlbWFpbnMgZGV0ZXJtaW5pc3RpYy4KICAgIGlmIChleGlzdGluZ0RpciA9 PT0gJ2JhY2snICYmIGRpciA9PT0gJ2Z3ZCcpIHsKICAgICAgZGlyZWN0aW9u TWFwLnNldChvYmosICdmd2QnKTsKICAgIH0KICB9LAoKICBfc3luYzogZnVu Y3Rpb24ob2JqKSB7CiAgICB2YXIgbG9nID0gRW1iZXIuTE9HX0JJTkRJTkdT OwoKICAgIC8vIGRvbid0IHN5bmNocm9uaXplIGRlc3Ryb3llZCBvYmplY3Rz IG9yIGRpc2Nvbm5lY3RlZCBiaW5kaW5ncwogICAgaWYgKG9iai5pc0Rlc3Ry b3llZCB8fCAhdGhpcy5fcmVhZHlUb1N5bmMpIHsgcmV0dXJuOyB9CgogICAg Ly8gZ2V0IHRoZSBkaXJlY3Rpb24gb2YgdGhlIGJpbmRpbmcgZm9yIHRoZSBv YmplY3Qgd2UgYXJlCiAgICAvLyBzeW5jaHJvbml6aW5nIGZyb20KICAgIHZh ciBkaXJlY3Rpb25NYXAgPSB0aGlzLl9kaXJlY3Rpb25NYXA7CiAgICB2YXIg ZGlyZWN0aW9uID0gZGlyZWN0aW9uTWFwLmdldChvYmopOwoKICAgIHZhciBm cm9tUGF0aCA9IHRoaXMuX2Zyb20sIHRvUGF0aCA9IHRoaXMuX3RvOwoKICAg IGRpcmVjdGlvbk1hcC5yZW1vdmUob2JqKTsKCiAgICAvLyBpZiB3ZSdyZSBz eW5jaHJvbml6aW5nIGZyb20gdGhlIHJlbW90ZSBvYmplY3QuLi4KICAgIGlm IChkaXJlY3Rpb24gPT09ICdmd2QnKSB7CiAgICAgIHZhciBmcm9tVmFsdWUg PSBnZXRXaXRoR2xvYmFscyhvYmosIHRoaXMuX2Zyb20pOwogICAgICBpZiAo bG9nKSB7CiAgICAgICAgRW1iZXIuTG9nZ2VyLmxvZygnICcsIHRoaXMudG9T dHJpbmcoKSwgJy0+JywgZnJvbVZhbHVlLCBvYmopOwogICAgICB9CiAgICAg IGlmICh0aGlzLl9vbmVXYXkpIHsKICAgICAgICBFbWJlci50cnlTZXQob2Jq LCB0b1BhdGgsIGZyb21WYWx1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAg RW1iZXIuX3N1c3BlbmRPYnNlcnZlcihvYmosIHRvUGF0aCwgdGhpcywgdGhp cy50b0RpZENoYW5nZSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgRW1iZXIu dHJ5U2V0KG9iaiwgdG9QYXRoLCBmcm9tVmFsdWUpOwogICAgICAgIH0pOwog ICAgICB9CiAgICAvLyBpZiB3ZSdyZSBzeW5jaHJvbml6aW5nICp0byogdGhl IHJlbW90ZSBvYmplY3QKICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09PSAn YmFjaycpIHsKICAgICAgdmFyIHRvVmFsdWUgPSBnZXQob2JqLCB0aGlzLl90 byk7CiAgICAgIGlmIChsb2cpIHsKICAgICAgICBFbWJlci5Mb2dnZXIubG9n KCcgJywgdGhpcy50b1N0cmluZygpLCAnPC0nLCB0b1ZhbHVlLCBvYmopOwog ICAgICB9CiAgICAgIEVtYmVyLl9zdXNwZW5kT2JzZXJ2ZXIob2JqLCBmcm9t UGF0aCwgdGhpcywgdGhpcy5mcm9tRGlkQ2hhbmdlLCBmdW5jdGlvbiAoKSB7 CiAgICAgICAgRW1iZXIudHJ5U2V0KEVtYmVyLmlzR2xvYmFsUGF0aChmcm9t UGF0aCkgPyBFbWJlci5sb29rdXAgOiBvYmosIGZyb21QYXRoLCB0b1ZhbHVl KTsKICAgICAgfSk7CiAgICB9CiAgfQoKfTsKCmZ1bmN0aW9uIG1peGluUHJv cGVydGllcyh0bywgZnJvbSkgewogIGZvciAodmFyIGtleSBpbiBmcm9tKSB7 CiAgICBpZiAoZnJvbS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgIHRv W2tleV0gPSBmcm9tW2tleV07CiAgICB9CiAgfQp9CgptaXhpblByb3BlcnRp ZXMoQmluZGluZywgewoKICAvKgogICAgU2VlIGBFbWJlci5CaW5kaW5nLmZy b21gLgoKICAgIEBtZXRob2QgZnJvbQogICAgQHN0YXRpYwogICovCiAgZnJv bTogZnVuY3Rpb24oKSB7CiAgICB2YXIgQyA9IHRoaXMsIGJpbmRpbmcgPSBu ZXcgQygpOwogICAgcmV0dXJuIGJpbmRpbmcuZnJvbS5hcHBseShiaW5kaW5n LCBhcmd1bWVudHMpOwogIH0sCgogIC8qCiAgICBTZWUgYEVtYmVyLkJpbmRp bmcudG9gLgoKICAgIEBtZXRob2QgdG8KICAgIEBzdGF0aWMKICAqLwogIHRv OiBmdW5jdGlvbigpIHsKICAgIHZhciBDID0gdGhpcywgYmluZGluZyA9IG5l dyBDKCk7CiAgICByZXR1cm4gYmluZGluZy50by5hcHBseShiaW5kaW5nLCBh cmd1bWVudHMpOwogIH0sCgogIC8qKgogICAgQ3JlYXRlcyBhIG5ldyBCaW5k aW5nIGluc3RhbmNlIGFuZCBtYWtlcyBpdCBhcHBseSBpbiBhIHNpbmdsZSBk aXJlY3Rpb24uCiAgICBBIG9uZS13YXkgYmluZGluZyB3aWxsIHJlbGF5IGNo YW5nZXMgb24gdGhlIGBmcm9tYCBzaWRlIG9iamVjdCAoc3VwcGxpZWQKICAg IGFzIHRoZSBgZnJvbWAgYXJndW1lbnQpIHRoZSBgdG9gIHNpZGUsIGJ1dCBu b3QgdGhlIG90aGVyIHdheSBhcm91bmQuCiAgICBUaGlzIG1lYW5zIHRoYXQg aWYgeW91IGNoYW5nZSB0aGUgInRvIiBzaWRlIGRpcmVjdGx5LCB0aGUgImZy b20iIHNpZGUgbWF5IGhhdmUKICAgIGEgZGlmZmVyZW50IHZhbHVlLgoKICAg IFNlZSBgQmluZGluZy5vbmVXYXlgLgoKICAgIEBtZXRob2Qgb25lV2F5CiAg ICBAcGFyYW0ge1N0cmluZ30gZnJvbSBmcm9tIHBhdGguCiAgICBAcGFyYW0g e0Jvb2xlYW59IFtmbGFnXSAoT3B0aW9uYWwpIHBhc3Npbmcgbm90aGluZyBo ZXJlIHdpbGwgbWFrZSB0aGUKICAgICAgYmluZGluZyBgb25lV2F5YC4gWW91 IGNhbiBpbnN0ZWFkIHBhc3MgYGZhbHNlYCB0byBkaXNhYmxlIGBvbmVXYXlg LCBtYWtpbmcgdGhlCiAgICAgIGJpbmRpbmcgdHdvIHdheSBhZ2Fpbi4KICAg IEByZXR1cm4ge0VtYmVyLkJpbmRpbmd9IGB0aGlzYAogICovCiAgb25lV2F5 OiBmdW5jdGlvbihmcm9tLCBmbGFnKSB7CiAgICB2YXIgQyA9IHRoaXMsIGJp bmRpbmcgPSBuZXcgQyhudWxsLCBmcm9tKTsKICAgIHJldHVybiBiaW5kaW5n Lm9uZVdheShmbGFnKTsKICB9Cgp9KTsKCi8qKgogIEFuIGBFbWJlci5CaW5k aW5nYCBjb25uZWN0cyB0aGUgcHJvcGVydGllcyBvZiB0d28gb2JqZWN0cyBz byB0aGF0IHdoZW5ldmVyCiAgdGhlIHZhbHVlIG9mIG9uZSBwcm9wZXJ0eSBj aGFuZ2VzLCB0aGUgb3RoZXIgcHJvcGVydHkgd2lsbCBiZSBjaGFuZ2VkIGFs c28uCgogICMjIEF1dG9tYXRpYyBDcmVhdGlvbiBvZiBCaW5kaW5ncyB3aXRo IGAvXipCaW5kaW5nL2AtbmFtZWQgUHJvcGVydGllcwoKICBZb3UgZG8gbm90 IHVzdWFsbHkgY3JlYXRlIEJpbmRpbmcgb2JqZWN0cyBkaXJlY3RseSBidXQg aW5zdGVhZCBkZXNjcmliZQogIGJpbmRpbmdzIGluIHlvdXIgY2xhc3Mgb3Ig b2JqZWN0IGRlZmluaXRpb24gdXNpbmcgYXV0b21hdGljIGJpbmRpbmcKICBk ZXRlY3Rpb24uCgogIFByb3BlcnRpZXMgZW5kaW5nIGluIGEgYEJpbmRpbmdg IHN1ZmZpeCB3aWxsIGJlIGNvbnZlcnRlZCB0byBgRW1iZXIuQmluZGluZ2AK ICBpbnN0YW5jZXMuIFRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IHNob3Vs ZCBiZSBhIHN0cmluZyByZXByZXNlbnRpbmcgYSBwYXRoCiAgdG8gYW5vdGhl ciBvYmplY3Qgb3IgYSBjdXN0b20gYmluZGluZyBpbnN0YW5jZWQgY3JlYXRl ZCB1c2luZyBCaW5kaW5nIGhlbHBlcnMKICAoc2VlICJPbmUgV2F5IEJpbmRp bmdzIik6CgogIGBgYAogIHZhbHVlQmluZGluZzogIk15QXBwLnNvbWVDb250 cm9sbGVyLnRpdGxlIgogIGBgYAoKICBUaGlzIHdpbGwgY3JlYXRlIGEgYmlu ZGluZyBmcm9tIGBNeUFwcC5zb21lQ29udHJvbGxlci50aXRsZWAgdG8gdGhl IGB2YWx1ZWAKICBwcm9wZXJ0eSBvZiB5b3VyIG9iamVjdCBpbnN0YW5jZSBh dXRvbWF0aWNhbGx5LiBOb3cgdGhlIHR3byB2YWx1ZXMgd2lsbCBiZQogIGtl cHQgaW4gc3luYy4KCiAgIyMgT25lIFdheSBCaW5kaW5ncwoKICBPbmUgZXNw ZWNpYWxseSB1c2VmdWwgYmluZGluZyBjdXN0b21pemF0aW9uIHlvdSBjYW4g dXNlIGlzIHRoZSBgb25lV2F5KClgCiAgaGVscGVyLiBUaGlzIGhlbHBlciB0 ZWxscyBFbWJlciB0aGF0IHlvdSBhcmUgb25seSBpbnRlcmVzdGVkIGluCiAg cmVjZWl2aW5nIGNoYW5nZXMgb24gdGhlIG9iamVjdCB5b3UgYXJlIGJpbmRp bmcgZnJvbS4gRm9yIGV4YW1wbGUsIGlmIHlvdQogIGFyZSBiaW5kaW5nIHRv IGEgcHJlZmVyZW5jZSBhbmQgeW91IHdhbnQgdG8gYmUgbm90aWZpZWQgaWYg dGhlIHByZWZlcmVuY2UKICBoYXMgY2hhbmdlZCwgYnV0IHlvdXIgb2JqZWN0 IHdpbGwgbm90IGJlIGNoYW5naW5nIHRoZSBwcmVmZXJlbmNlIGl0c2VsZiwg eW91CiAgY291bGQgZG86CgogIGBgYAogIGJpZ1RpdGxlc0JpbmRpbmc6IEVt YmVyLkJpbmRpbmcub25lV2F5KCJNeUFwcC5wcmVmZXJlbmNlc0NvbnRyb2xs ZXIuYmlnVGl0bGVzIikKICBgYGAKCiAgVGhpcyB3YXkgaWYgdGhlIHZhbHVl IG9mIGBNeUFwcC5wcmVmZXJlbmNlc0NvbnRyb2xsZXIuYmlnVGl0bGVzYCBj aGFuZ2VzIHRoZQogIGBiaWdUaXRsZXNgIHByb3BlcnR5IG9mIHlvdXIgb2Jq ZWN0IHdpbGwgY2hhbmdlIGFsc28uIEhvd2V2ZXIsIGlmIHlvdQogIGNoYW5n ZSB0aGUgdmFsdWUgb2YgeW91ciBgYmlnVGl0bGVzYCBwcm9wZXJ0eSwgaXQg d2lsbCBub3QgdXBkYXRlIHRoZQogIGBwcmVmZXJlbmNlc0NvbnRyb2xsZXJg LgoKICBPbmUgd2F5IGJpbmRpbmdzIGFyZSBhbG1vc3QgdHdpY2UgYXMgZmFz dCB0byBzZXR1cCBhbmQgdHdpY2UgYXMgZmFzdCB0bwogIGV4ZWN1dGUgYmVj YXVzZSB0aGUgYmluZGluZyBvbmx5IGhhcyB0byB3b3JyeSBhYm91dCBjaGFu Z2VzIHRvIG9uZSBzaWRlLgoKICBZb3Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5n IG9uZSB3YXkgYmluZGluZ3MgYW55dGltZSB5b3UgaGF2ZSBhbiBvYmplY3Qg dGhhdAogIG1heSBiZSBjcmVhdGVkIGZyZXF1ZW50bHkgYW5kIHlvdSBkbyBu b3QgaW50ZW5kIHRvIGNoYW5nZSBhIHByb3BlcnR5OyBvbmx5CiAgdG8gbW9u aXRvciBpdCBmb3IgY2hhbmdlcyAoc3VjaCBhcyBpbiB0aGUgZXhhbXBsZSBh Ym92ZSkuCgogICMjIEFkZGluZyBCaW5kaW5ncyBNYW51YWxseQoKICBBbGwg b2YgdGhlIGV4YW1wbGVzIGFib3ZlIHNob3cgeW91IGhvdyB0byBjb25maWd1 cmUgYSBjdXN0b20gYmluZGluZywgYnV0IHRoZQogIHJlc3VsdCBvZiB0aGVz ZSBjdXN0b21pemF0aW9ucyB3aWxsIGJlIGEgYmluZGluZyB0ZW1wbGF0ZSwg bm90IGEgZnVsbHkgYWN0aXZlCiAgQmluZGluZyBpbnN0YW5jZS4gVGhlIGJp bmRpbmcgd2lsbCBhY3R1YWxseSBiZWNvbWUgYWN0aXZlIG9ubHkgd2hlbiB5 b3UKICBpbnN0YW50aWF0ZSB0aGUgb2JqZWN0IHRoZSBiaW5kaW5nIGJlbG9u Z3MgdG8uIEl0IGlzIHVzZWZ1bCBob3dldmVyLCB0bwogIHVuZGVyc3RhbmQg d2hhdCBhY3R1YWxseSBoYXBwZW5zIHdoZW4gdGhlIGJpbmRpbmcgaXMgYWN0 aXZhdGVkLgoKICBGb3IgYSBiaW5kaW5nIHRvIGZ1bmN0aW9uIGl0IG11c3Qg aGF2ZSBhdCBsZWFzdCBhIGBmcm9tYCBwcm9wZXJ0eSBhbmQgYSBgdG9gCiAg cHJvcGVydHkuIFRoZSBgZnJvbWAgcHJvcGVydHkgcGF0aCBwb2ludHMgdG8g dGhlIG9iamVjdC9rZXkgdGhhdCB5b3Ugd2FudCB0bwogIGJpbmQgZnJvbSB3 aGlsZSB0aGUgYHRvYCBwYXRoIHBvaW50cyB0byB0aGUgb2JqZWN0L2tleSB5 b3Ugd2FudCB0byBiaW5kIHRvLgoKICBXaGVuIHlvdSBkZWZpbmUgYSBjdXN0 b20gYmluZGluZywgeW91IGFyZSB1c3VhbGx5IGRlc2NyaWJpbmcgdGhlIHBy b3BlcnR5CiAgeW91IHdhbnQgdG8gYmluZCBmcm9tIChzdWNoIGFzIGBNeUFw cC5zb21lQ29udHJvbGxlci52YWx1ZWAgaW4gdGhlIGV4YW1wbGVzCiAgYWJv dmUpLiBXaGVuIHlvdXIgb2JqZWN0IGlzIGNyZWF0ZWQsIGl0IHdpbGwgYXV0 b21hdGljYWxseSBhc3NpZ24gdGhlIHZhbHVlCiAgeW91IHdhbnQgdG8gYmlu ZCBgdG9gIGJhc2VkIG9uIHRoZSBuYW1lIG9mIHlvdXIgYmluZGluZyBrZXku IEluIHRoZQogIGV4YW1wbGVzIGFib3ZlLCBkdXJpbmcgaW5pdCwgRW1iZXIg b2JqZWN0cyB3aWxsIGVmZmVjdGl2ZWx5IGNhbGwKICBzb21ldGhpbmcgbGlr ZSB0aGlzIG9uIHlvdXIgYmluZGluZzoKCiAgYGBgamF2YXNjcmlwdAogIGJp bmRpbmcgPSBFbWJlci5CaW5kaW5nLmZyb20odGhpcy52YWx1ZUJpbmRpbmcp LnRvKCJ2YWx1ZSIpOwogIGBgYAoKICBUaGlzIGNyZWF0ZXMgYSBuZXcgYmlu ZGluZyBpbnN0YW5jZSBiYXNlZCBvbiB0aGUgdGVtcGxhdGUgeW91IHByb3Zp ZGUsIGFuZAogIHNldHMgdGhlIHRvIHBhdGggdG8gdGhlIGB2YWx1ZWAgcHJv cGVydHkgb2YgdGhlIG5ldyBvYmplY3QuIE5vdyB0aGF0IHRoZQogIGJpbmRp bmcgaXMgZnVsbHkgY29uZmlndXJlZCB3aXRoIGEgYGZyb21gIGFuZCBhIGB0 b2AsIGl0IHNpbXBseSBuZWVkcyB0byBiZQogIGNvbm5lY3RlZCB0byBiZWNv bWUgYWN0aXZlLiBUaGlzIGlzIGRvbmUgdGhyb3VnaCB0aGUgYGNvbm5lY3Qo KWAgbWV0aG9kOgoKICBgYGBqYXZhc2NyaXB0CiAgYmluZGluZy5jb25uZWN0 KHRoaXMpOwogIGBgYAoKICBOb3RlIHRoYXQgd2hlbiB5b3UgY29ubmVjdCBh IGJpbmRpbmcgeW91IHBhc3MgdGhlIG9iamVjdCB5b3Ugd2FudCBpdCB0byBi ZQogIGNvbm5lY3RlZCB0by4gVGhpcyBvYmplY3Qgd2lsbCBiZSB1c2VkIGFz IHRoZSByb290IGZvciBib3RoIHRoZSBmcm9tIGFuZAogIHRvIHNpZGUgb2Yg dGhlIGJpbmRpbmcgd2hlbiBpbnNwZWN0aW5nIHJlbGF0aXZlIHBhdGhzLiBU aGlzIGFsbG93cyB0aGUKICBiaW5kaW5nIHRvIGJlIGF1dG9tYXRpY2FsbHkg aW5oZXJpdGVkIGJ5IHN1YmNsYXNzZWQgb2JqZWN0cyBhcyB3ZWxsLgoKICBO b3cgdGhhdCB0aGUgYmluZGluZyBpcyBjb25uZWN0ZWQsIGl0IHdpbGwgb2Jz ZXJ2ZSBib3RoIHRoZSBmcm9tIGFuZCB0byBzaWRlCiAgYW5kIHJlbGF5IGNo YW5nZXMuCgogIElmIHlvdSBldmVyIG5lZWRlZCB0byBkbyBzbyAoeW91IGFs bW9zdCBuZXZlciB3aWxsLCBidXQgaXQgaXMgdXNlZnVsIHRvCiAgdW5kZXJz dGFuZCB0aGlzIGFueXdheSksIHlvdSBjb3VsZCBtYW51YWxseSBjcmVhdGUg YW4gYWN0aXZlIGJpbmRpbmcgYnkKICB1c2luZyB0aGUgYEVtYmVyLmJpbmQo KWAgaGVscGVyIG1ldGhvZC4gKFRoaXMgaXMgdGhlIHNhbWUgbWV0aG9kIHVz ZWQgYnkKICB0byBzZXR1cCB5b3VyIGJpbmRpbmdzIG9uIG9iamVjdHMpOgoK ICBgYGBqYXZhc2NyaXB0CiAgRW1iZXIuYmluZChNeUFwcC5hbm90aGVyT2Jq ZWN0LCAidmFsdWUiLCAiTXlBcHAuc29tZUNvbnRyb2xsZXIudmFsdWUiKTsK ICBgYGAKCiAgQm90aCBvZiB0aGVzZSBjb2RlIGZyYWdtZW50cyBoYXZlIHRo ZSBzYW1lIGVmZmVjdCBhcyBkb2luZyB0aGUgbW9zdCBmcmllbmRseQogIGZv cm0gb2YgYmluZGluZyBjcmVhdGlvbiBsaWtlIHNvOgoKICBgYGBqYXZhc2Ny aXB0CiAgTXlBcHAuYW5vdGhlck9iamVjdCA9IEVtYmVyLk9iamVjdC5jcmVh dGUoewogICAgdmFsdWVCaW5kaW5nOiAiTXlBcHAuc29tZUNvbnRyb2xsZXIu dmFsdWUiLAoKICAgIC8vIE9USEVSIENPREUgRk9SIFRISVMgT0JKRUNULi4u CiAgfSk7CiAgYGBgCgogIEVtYmVyJ3MgYnVpbHQgaW4gYmluZGluZyBjcmVh dGlvbiBtZXRob2QgbWFrZXMgaXQgZWFzeSB0byBhdXRvbWF0aWNhbGx5CiAg Y3JlYXRlIGJpbmRpbmdzIGZvciB5b3UuIFlvdSBzaG91bGQgYWx3YXlzIHVz ZSB0aGUgaGlnaGVzdC1sZXZlbCBBUElzCiAgYXZhaWxhYmxlLCBldmVuIGlm IHlvdSB1bmRlcnN0YW5kIGhvdyBpdCB3b3JrcyB1bmRlcm5lYXRoLgoKICBA Y2xhc3MgQmluZGluZwogIEBuYW1lc3BhY2UgRW1iZXIKICBAc2luY2UgRW1i ZXIgMC45CiovCkVtYmVyLkJpbmRpbmcgPSBCaW5kaW5nOwoKCi8qKgogIEds b2JhbCBoZWxwZXIgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBiaW5kaW5nLiBK dXN0IHBhc3MgdGhlIHJvb3Qgb2JqZWN0CiAgYWxvbmcgd2l0aCBhIGB0b2Ag YW5kIGBmcm9tYCBwYXRoIHRvIGNyZWF0ZSBhbmQgY29ubmVjdCB0aGUgYmlu ZGluZy4KCiAgQG1ldGhvZCBiaW5kCiAgQGZvciBFbWJlcgogIEBwYXJhbSB7 T2JqZWN0fSBvYmogVGhlIHJvb3Qgb2JqZWN0IG9mIHRoZSB0cmFuc2Zvcm0u CiAgQHBhcmFtIHtTdHJpbmd9IHRvIFRoZSBwYXRoIHRvIHRoZSAndG8nIHNp ZGUgb2YgdGhlIGJpbmRpbmcuCiAgICBNdXN0IGJlIHJlbGF0aXZlIHRvIG9i ai4KICBAcGFyYW0ge1N0cmluZ30gZnJvbSBUaGUgcGF0aCB0byB0aGUgJ2Zy b20nIHNpZGUgb2YgdGhlIGJpbmRpbmcuCiAgICBNdXN0IGJlIHJlbGF0aXZl IHRvIG9iaiBvciBhIGdsb2JhbCBwYXRoLgogIEByZXR1cm4ge0VtYmVyLkJp bmRpbmd9IGJpbmRpbmcgaW5zdGFuY2UKKi8KRW1iZXIuYmluZCA9IGZ1bmN0 aW9uKG9iaiwgdG8sIGZyb20pIHsKICByZXR1cm4gbmV3IEVtYmVyLkJpbmRp bmcodG8sIGZyb20pLmNvbm5lY3Qob2JqKTsKfTsKCi8qKgogIEBtZXRob2Qg b25lV2F5CiAgQGZvciBFbWJlcgogIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhl IHJvb3Qgb2JqZWN0IG9mIHRoZSB0cmFuc2Zvcm0uCiAgQHBhcmFtIHtTdHJp bmd9IHRvIFRoZSBwYXRoIHRvIHRoZSAndG8nIHNpZGUgb2YgdGhlIGJpbmRp bmcuCiAgICBNdXN0IGJlIHJlbGF0aXZlIHRvIG9iai4KICBAcGFyYW0ge1N0 cmluZ30gZnJvbSBUaGUgcGF0aCB0byB0aGUgJ2Zyb20nIHNpZGUgb2YgdGhl IGJpbmRpbmcuCiAgICBNdXN0IGJlIHJlbGF0aXZlIHRvIG9iaiBvciBhIGds b2JhbCBwYXRoLgogIEByZXR1cm4ge0VtYmVyLkJpbmRpbmd9IGJpbmRpbmcg aW5zdGFuY2UKKi8KRW1iZXIub25lV2F5ID0gZnVuY3Rpb24ob2JqLCB0bywg ZnJvbSkgewogIHJldHVybiBuZXcgRW1iZXIuQmluZGluZyh0bywgZnJvbSku b25lV2F5KCkuY29ubmVjdChvYmopOwp9OwoKfSkoKTsKCgoKKGZ1bmN0aW9u KCkgewovKioKQG1vZHVsZSBlbWJlcgpAc3VibW9kdWxlIGVtYmVyLW1ldGFs CiovCgp2YXIgTWl4aW4sIFJFUVVJUkVELCBBbGlhcywKICAgIGFfbWFwID0g RW1iZXIuQXJyYXlQb2x5ZmlsbHMubWFwLAogICAgYV9pbmRleE9mID0gRW1i ZXIuQXJyYXlQb2x5ZmlsbHMuaW5kZXhPZiwKICAgIGFfZm9yRWFjaCA9IEVt YmVyLkFycmF5UG9seWZpbGxzLmZvckVhY2gsCiAgICBhX3NsaWNlID0gW10u c2xpY2UsCiAgICBvX2NyZWF0ZSA9IEVtYmVyLmNyZWF0ZSwKICAgIGRlZmlu ZVByb3BlcnR5ID0gRW1iZXIuZGVmaW5lUHJvcGVydHksCiAgICBndWlkRm9y ID0gRW1iZXIuZ3VpZEZvciwKICAgIG1ldGFGb3IgPSBFbWJlci5tZXRhLAog ICAgTUVUQV9LRVkgPSBFbWJlci5NRVRBX0tFWTsKCnZhciBleHBhbmRQcm9w ZXJ0aWVzID0gRW1iZXIuZXhwYW5kUHJvcGVydGllczsKCmZ1bmN0aW9uIHN1 cGVyRnVuY3Rpb24oKXsKICB2YXIgcmV0LCBmdW5jID0gdGhpcy5fX25leHRT dXBlcjsKICBpZiAoZnVuYykgewogICAgdGhpcy5fX25leHRTdXBlciA9IG51 bGw7CiAgICByZXQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAg ICB0aGlzLl9fbmV4dFN1cGVyID0gZnVuYzsKICB9CiAgcmV0dXJuIHJldDsK fQoKZnVuY3Rpb24gbWl4aW5zTWV0YShvYmopIHsKICB2YXIgbSA9IG1ldGFG b3Iob2JqLCB0cnVlKSwgcmV0ID0gbS5taXhpbnM7CiAgaWYgKCFyZXQpIHsK ICAgIHJldCA9IG0ubWl4aW5zID0ge307CiAgfSBlbHNlIGlmICghbS5oYXNP d25Qcm9wZXJ0eSgnbWl4aW5zJykpIHsKICAgIHJldCA9IG0ubWl4aW5zID0g b19jcmVhdGUocmV0KTsKICB9CiAgcmV0dXJuIHJldDsKfQoKZnVuY3Rpb24g aW5pdE1peGluKG1peGluLCBhcmdzKSB7CiAgaWYgKGFyZ3MgJiYgYXJncy5s ZW5ndGggPiAwKSB7CiAgICBtaXhpbi5taXhpbnMgPSBhX21hcC5jYWxsKGFy Z3MsIGZ1bmN0aW9uKHgpIHsKICAgICAgaWYgKHggaW5zdGFuY2VvZiBNaXhp bikgeyByZXR1cm4geDsgfQoKICAgICAgLy8gTm90ZTogTWFudWFsbHkgc2V0 dXAgYSBwcmltaXRpdmUgbWl4aW4gaGVyZS4gVGhpcyBpcyB0aGUgb25seQog ICAgICAvLyB3YXkgdG8gYWN0dWFsbHkgZ2V0IGEgcHJpbWl0aXZlIG1peGlu LiBUaGlzIHdheSBub3JtYWwgY3JlYXRpb24KICAgICAgLy8gb2YgbWl4aW5z IHdpbGwgZ2l2ZSB5b3UgY29tYmluZWQgbWl4aW5zLi4uCiAgICAgIHZhciBt aXhpbiA9IG5ldyBNaXhpbigpOwogICAgICBtaXhpbi5wcm9wZXJ0aWVzID0g eDsKICAgICAgcmV0dXJuIG1peGluOwogICAgfSk7CiAgfQogIHJldHVybiBt aXhpbjsKfQoKZnVuY3Rpb24gaXNNZXRob2Qob2JqKSB7CiAgcmV0dXJuICdm dW5jdGlvbicgPT09IHR5cGVvZiBvYmogJiYKICAgICAgICAgb2JqLmlzTWV0 aG9kICE9PSBmYWxzZSAmJgogICAgICAgICBvYmogIT09IEJvb2xlYW4gJiYg b2JqICE9PSBPYmplY3QgJiYgb2JqICE9PSBOdW1iZXIgJiYgb2JqICE9PSBB cnJheSAmJiBvYmogIT09IERhdGUgJiYgb2JqICE9PSBTdHJpbmc7Cn0KCnZh ciBDT05USU5VRSA9IHt9OwoKZnVuY3Rpb24gbWl4aW5Qcm9wZXJ0aWVzKG1p eGluc01ldGEsIG1peGluKSB7CiAgdmFyIGd1aWQ7CgogIGlmIChtaXhpbiBp bnN0YW5jZW9mIE1peGluKSB7CiAgICBndWlkID0gZ3VpZEZvcihtaXhpbik7 CiAgICBpZiAobWl4aW5zTWV0YVtndWlkXSkgeyByZXR1cm4gQ09OVElOVUU7 IH0KICAgIG1peGluc01ldGFbZ3VpZF0gPSBtaXhpbjsKICAgIHJldHVybiBt aXhpbi5wcm9wZXJ0aWVzOwogIH0gZWxzZSB7CiAgICByZXR1cm4gbWl4aW47 IC8vIGFwcGx5IGFub255bW91cyBtaXhpbiBwcm9wZXJ0aWVzCiAgfQp9Cgpm dW5jdGlvbiBjb25jYXRlbmF0ZWRNaXhpblByb3BlcnRpZXMoY29uY2F0UHJv cCwgcHJvcHMsIHZhbHVlcywgYmFzZSkgewogIHZhciBjb25jYXRzOwoKICAv LyByZXNldCBiZWZvcmUgYWRkaW5nIGVhY2ggbmV3IG1peGluIHRvIHBpY2t1 cCBjb25jYXRzIGZyb20gcHJldmlvdXMKICBjb25jYXRzID0gdmFsdWVzW2Nv bmNhdFByb3BdIHx8IGJhc2VbY29uY2F0UHJvcF07CiAgaWYgKHByb3BzW2Nv bmNhdFByb3BdKSB7CiAgICBjb25jYXRzID0gY29uY2F0cyA/IGNvbmNhdHMu Y29uY2F0KHByb3BzW2NvbmNhdFByb3BdKSA6IHByb3BzW2NvbmNhdFByb3Bd OwogIH0KCiAgcmV0dXJuIGNvbmNhdHM7Cn0KCmZ1bmN0aW9uIGdpdmVEZXNj cmlwdG9yU3VwZXIobWV0YSwga2V5LCBwcm9wZXJ0eSwgdmFsdWVzLCBkZXNj cykgewogIHZhciBzdXBlclByb3BlcnR5OwoKICAvLyBDb21wdXRlZCBwcm9w ZXJ0aWVzIG92ZXJyaWRlIG1ldGhvZHMsIGFuZCBkbyBub3QgY2FsbCBzdXBl ciB0byB0aGVtCiAgaWYgKHZhbHVlc1trZXldID09PSB1bmRlZmluZWQpIHsK ICAgIC8vIEZpbmQgdGhlIG9yaWdpbmFsIGRlc2NyaXB0b3IgaW4gYSBwYXJl bnQgbWl4aW4KICAgIHN1cGVyUHJvcGVydHkgPSBkZXNjc1trZXldOwogIH0K CiAgLy8gSWYgd2UgZGlkbid0IGZpbmQgdGhlIG9yaWdpbmFsIGRlc2NyaXB0 b3IgaW4gYSBwYXJlbnQgbWl4aW4sIGZpbmQKICAvLyBpdCBvbiB0aGUgb3Jp Z2luYWwgb2JqZWN0LgogIHN1cGVyUHJvcGVydHkgPSBzdXBlclByb3BlcnR5 IHx8IG1ldGEuZGVzY3Nba2V5XTsKCiAgaWYgKCFzdXBlclByb3BlcnR5IHx8 ICEoc3VwZXJQcm9wZXJ0eSBpbnN0YW5jZW9mIEVtYmVyLkNvbXB1dGVkUHJv cGVydHkpKSB7CiAgICByZXR1cm4gcHJvcGVydHk7CiAgfQoKICAvLyBTaW5j ZSBtdWx0aXBsZSBtaXhpbnMgbWF5IGluaGVyaXQgZnJvbSB0aGUgc2FtZSBw YXJlbnQsIHdlIG5lZWQKICAvLyB0byBjbG9uZSB0aGUgY29tcHV0ZWQgcHJv cGVydHkgc28gdGhhdCBvdGhlciBtaXhpbnMgZG8gbm90IHJlY2VpdmUKICAv LyB0aGUgd3JhcHBlZCB2ZXJzaW9uLgogIHByb3BlcnR5ID0gb19jcmVhdGUo cHJvcGVydHkpOwogIHByb3BlcnR5LmZ1bmMgPSBFbWJlci53cmFwKHByb3Bl cnR5LmZ1bmMsIHN1cGVyUHJvcGVydHkuZnVuYyk7CgogIHJldHVybiBwcm9w ZXJ0eTsKfQoKZnVuY3Rpb24gZ2l2ZU1ldGhvZFN1cGVyKG9iaiwga2V5LCBt ZXRob2QsIHZhbHVlcywgZGVzY3MpIHsKICB2YXIgc3VwZXJNZXRob2Q7Cgog IC8vIE1ldGhvZHMgb3ZlcndyaXRlIGNvbXB1dGVkIHByb3BlcnRpZXMsIGFu ZCBkbyBub3QgY2FsbCBzdXBlciB0byB0aGVtLgogIGlmIChkZXNjc1trZXld ID09PSB1bmRlZmluZWQpIHsKICAgIC8vIEZpbmQgdGhlIG9yaWdpbmFsIG1l dGhvZCBpbiBhIHBhcmVudCBtaXhpbgogICAgc3VwZXJNZXRob2QgPSB2YWx1 ZXNba2V5XTsKICB9CgogIC8vIElmIHdlIGRpZG4ndCBmaW5kIHRoZSBvcmln aW5hbCB2YWx1ZSBpbiBhIHBhcmVudCBtaXhpbiwgZmluZCBpdCBpbgogIC8v IHRoZSBvcmlnaW5hbCBvYmplY3QKICBzdXBlck1ldGhvZCA9IHN1cGVyTWV0 aG9kIHx8IG9ialtrZXldOwoKICAvLyBPbmx5IHdyYXAgdGhlIG5ldyBtZXRo b2QgaWYgdGhlIG9yaWdpbmFsIG1ldGhvZCB3YXMgYSBmdW5jdGlvbgogIGlm ICgnZnVuY3Rpb24nICE9PSB0eXBlb2Ygc3VwZXJNZXRob2QpIHsKICAgIHJl dHVybiBtZXRob2Q7CiAgfQoKICByZXR1cm4gRW1iZXIud3JhcChtZXRob2Qs IHN1cGVyTWV0aG9kKTsKfQoKZnVuY3Rpb24gYXBwbHlDb25jYXRlbmF0ZWRQ cm9wZXJ0aWVzKG9iaiwga2V5LCB2YWx1ZSwgdmFsdWVzKSB7CiAgdmFyIGJh c2VWYWx1ZSA9IHZhbHVlc1trZXldIHx8IG9ialtrZXldOwoKICBpZiAoYmFz ZVZhbHVlKSB7CiAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGJhc2VW YWx1ZS5jb25jYXQpIHsKICAgICAgcmV0dXJuIGJhc2VWYWx1ZS5jb25jYXQo dmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIEVtYmVyLm1ha2VB cnJheShiYXNlVmFsdWUpLmNvbmNhdCh2YWx1ZSk7CiAgICB9CiAgfSBlbHNl IHsKICAgIHJldHVybiBFbWJlci5tYWtlQXJyYXkodmFsdWUpOwogIH0KfQoK ZnVuY3Rpb24gYXBwbHlNZXJnZWRQcm9wZXJ0aWVzKG9iaiwga2V5LCB2YWx1 ZSwgdmFsdWVzKSB7CiAgdmFyIGJhc2VWYWx1ZSA9IHZhbHVlc1trZXldIHx8 IG9ialtrZXldOwoKICBpZiAoIWJhc2VWYWx1ZSkgeyByZXR1cm4gdmFsdWU7 IH0KCiAgdmFyIG5ld0Jhc2UgPSBFbWJlci5tZXJnZSh7fSwgYmFzZVZhbHVl KSwKICAgICAgaGFzRnVuY3Rpb24gPSBmYWxzZTsKCiAgZm9yICh2YXIgcHJv cCBpbiB2YWx1ZSkgewogICAgaWYgKCF2YWx1ZS5oYXNPd25Qcm9wZXJ0eShw cm9wKSkgeyBjb250aW51ZTsgfQoKICAgIHZhciBwcm9wVmFsdWUgPSB2YWx1 ZVtwcm9wXTsKICAgIGlmIChpc01ldGhvZChwcm9wVmFsdWUpKSB7CiAgICAg IC8vIFRPRE86IHN1cHBvcnQgZm9yIENvbXB1dGVkIFByb3BlcnRpZXMsIGV0 Yz8KICAgICAgaGFzRnVuY3Rpb24gPSB0cnVlOwogICAgICBuZXdCYXNlW3By b3BdID0gZ2l2ZU1ldGhvZFN1cGVyKG9iaiwgcHJvcCwgcHJvcFZhbHVlLCBi YXNlVmFsdWUsIHt9KTsKICAgIH0gZWxzZSB7CiAgICAgIG5ld0Jhc2VbcHJv cF0gPSBwcm9wVmFsdWU7CiAgICB9CiAgfQoKICBpZiAoaGFzRnVuY3Rpb24p IHsKICAgIG5ld0Jhc2UuX3N1cGVyID0gc3VwZXJGdW5jdGlvbjsKICB9Cgog IHJldHVybiBuZXdCYXNlOwp9CgpmdW5jdGlvbiBhZGROb3JtYWxpemVkUHJv cGVydHkoYmFzZSwga2V5LCB2YWx1ZSwgbWV0YSwgZGVzY3MsIHZhbHVlcywg Y29uY2F0cywgbWVyZ2luZ3MpIHsKICBpZiAodmFsdWUgaW5zdGFuY2VvZiBF bWJlci5EZXNjcmlwdG9yKSB7CiAgICBpZiAodmFsdWUgPT09IFJFUVVJUkVE ICYmIGRlc2NzW2tleV0pIHsgcmV0dXJuIENPTlRJTlVFOyB9CgogICAgLy8g V3JhcCBkZXNjcmlwdG9yIGZ1bmN0aW9uIHRvIGltcGxlbWVudAogICAgLy8g X19uZXh0U3VwZXIoKSBpZiBuZWVkZWQKICAgIGlmICh2YWx1ZS5mdW5jKSB7 CiAgICAgIHZhbHVlID0gZ2l2ZURlc2NyaXB0b3JTdXBlcihtZXRhLCBrZXks IHZhbHVlLCB2YWx1ZXMsIGRlc2NzKTsKICAgIH0KCiAgICBkZXNjc1trZXld ICA9IHZhbHVlOwogICAgdmFsdWVzW2tleV0gPSB1bmRlZmluZWQ7CiAgfSBl bHNlIHsKICAgIGlmICgoY29uY2F0cyAmJiBhX2luZGV4T2YuY2FsbChjb25j YXRzLCBrZXkpID49IDApIHx8CiAgICAgICAgICAgICAgICBrZXkgPT09ICdj b25jYXRlbmF0ZWRQcm9wZXJ0aWVzJyB8fAogICAgICAgICAgICAgICAga2V5 ID09PSAnbWVyZ2VkUHJvcGVydGllcycpIHsKICAgICAgdmFsdWUgPSBhcHBs eUNvbmNhdGVuYXRlZFByb3BlcnRpZXMoYmFzZSwga2V5LCB2YWx1ZSwgdmFs dWVzKTsKICAgIH0gZWxzZSBpZiAoKG1lcmdpbmdzICYmIGFfaW5kZXhPZi5j YWxsKG1lcmdpbmdzLCBrZXkpID49IDApKSB7CiAgICAgIHZhbHVlID0gYXBw bHlNZXJnZWRQcm9wZXJ0aWVzKGJhc2UsIGtleSwgdmFsdWUsIHZhbHVlcyk7 CiAgICB9IGVsc2UgaWYgKGlzTWV0aG9kKHZhbHVlKSkgewogICAgICB2YWx1 ZSA9IGdpdmVNZXRob2RTdXBlcihiYXNlLCBrZXksIHZhbHVlLCB2YWx1ZXMs IGRlc2NzKTsKICAgIH0KCiAgICBkZXNjc1trZXldID0gdW5kZWZpbmVkOwog ICAgdmFsdWVzW2tleV0gPSB2YWx1ZTsKICB9Cn0KCmZ1bmN0aW9uIG1lcmdl TWl4aW5zKG1peGlucywgbSwgZGVzY3MsIHZhbHVlcywgYmFzZSwga2V5cykg ewogIHZhciBtaXhpbiwgcHJvcHMsIGtleSwgY29uY2F0cywgbWVyZ2luZ3Ms IG1ldGE7CgogIGZ1bmN0aW9uIHJlbW92ZUtleXMoa2V5TmFtZSkgewogICAg ZGVsZXRlIGRlc2NzW2tleU5hbWVdOwogICAgZGVsZXRlIHZhbHVlc1trZXlO YW1lXTsKICB9CgogIGZvcih2YXIgaT0wLCBsPW1peGlucy5sZW5ndGg7IGk8 bDsgaSsrKSB7CiAgICBtaXhpbiA9IG1peGluc1tpXTsKICAgIEVtYmVyLmFz c2VydCgnRXhwZWN0ZWQgaGFzaCBvciBNaXhpbiBpbnN0YW5jZSwgZ290ICcg KyBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobWl4aW4pLAogICAg ICAgICAgICAgICAgIHR5cGVvZiBtaXhpbiA9PT0gJ29iamVjdCcgJiYgbWl4 aW4gIT09IG51bGwgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxs KG1peGluKSAhPT0gJ1tvYmplY3QgQXJyYXldJyk7CgogICAgcHJvcHMgPSBt aXhpblByb3BlcnRpZXMobSwgbWl4aW4pOwogICAgaWYgKHByb3BzID09PSBD T05USU5VRSkgeyBjb250aW51ZTsgfQoKICAgIGlmIChwcm9wcykgewogICAg ICBtZXRhID0gbWV0YUZvcihiYXNlKTsKICAgICAgaWYgKGJhc2Uud2lsbE1l cmdlTWl4aW4pIHsgYmFzZS53aWxsTWVyZ2VNaXhpbihwcm9wcyk7IH0KICAg ICAgY29uY2F0cyA9IGNvbmNhdGVuYXRlZE1peGluUHJvcGVydGllcygnY29u Y2F0ZW5hdGVkUHJvcGVydGllcycsIHByb3BzLCB2YWx1ZXMsIGJhc2UpOwog ICAgICBtZXJnaW5ncyA9IGNvbmNhdGVuYXRlZE1peGluUHJvcGVydGllcygn bWVyZ2VkUHJvcGVydGllcycsIHByb3BzLCB2YWx1ZXMsIGJhc2UpOwoKICAg ICAgZm9yIChrZXkgaW4gcHJvcHMpIHsKICAgICAgICBpZiAoIXByb3BzLmhh c093blByb3BlcnR5KGtleSkpIHsgY29udGludWU7IH0KICAgICAgICBrZXlz LnB1c2goa2V5KTsKICAgICAgICBhZGROb3JtYWxpemVkUHJvcGVydHkoYmFz ZSwga2V5LCBwcm9wc1trZXldLCBtZXRhLCBkZXNjcywgdmFsdWVzLCBjb25j YXRzLCBtZXJnaW5ncyk7CiAgICAgIH0KCiAgICAgIC8vIG1hbnVhbGx5IGNv cHkgdG9TdHJpbmcoKSBiZWNhdXNlIHNvbWUgSlMgZW5naW5lcyBkbyBub3Qg ZW51bWVyYXRlIGl0CiAgICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgn dG9TdHJpbmcnKSkgeyBiYXNlLnRvU3RyaW5nID0gcHJvcHMudG9TdHJpbmc7 IH0KICAgIH0gZWxzZSBpZiAobWl4aW4ubWl4aW5zKSB7CiAgICAgIG1lcmdl TWl4aW5zKG1peGluLm1peGlucywgbSwgZGVzY3MsIHZhbHVlcywgYmFzZSwg a2V5cyk7CiAgICAgIGlmIChtaXhpbi5fd2l0aG91dCkgeyBhX2ZvckVhY2gu Y2FsbChtaXhpbi5fd2l0aG91dCwgcmVtb3ZlS2V5cyk7IH0KICAgIH0KICB9 Cn0KCnZhciBJU19CSU5ESU5HID0gRW1iZXIuSVNfQklORElORyA9IC9eLitC aW5kaW5nJC87CgpmdW5jdGlvbiBkZXRlY3RCaW5kaW5nKG9iaiwga2V5LCB2 YWx1ZSwgbSkgewogIGlmIChJU19CSU5ESU5HLnRlc3Qoa2V5KSkgewogICAg dmFyIGJpbmRpbmdzID0gbS5iaW5kaW5nczsKICAgIGlmICghYmluZGluZ3Mp IHsKICAgICAgYmluZGluZ3MgPSBtLmJpbmRpbmdzID0ge307CiAgICB9IGVs c2UgaWYgKCFtLmhhc093blByb3BlcnR5KCdiaW5kaW5ncycpKSB7CiAgICAg IGJpbmRpbmdzID0gbS5iaW5kaW5ncyA9IG9fY3JlYXRlKG0uYmluZGluZ3Mp OwogICAgfQogICAgYmluZGluZ3Nba2V5XSA9IHZhbHVlOwogIH0KfQoKZnVu Y3Rpb24gY29ubmVjdEJpbmRpbmdzKG9iaiwgbSkgewogIC8vIFRPRE8gTWl4 aW4uYXBwbHkoaW5zdGFuY2UpIHNob3VsZCBkaXNjb25uZWN0IGJpbmRpbmcg aWYgZXhpc3RzCiAgdmFyIGJpbmRpbmdzID0gbS5iaW5kaW5ncywga2V5LCBi aW5kaW5nLCB0bzsKICBpZiAoYmluZGluZ3MpIHsKICAgIGZvciAoa2V5IGlu IGJpbmRpbmdzKSB7CiAgICAgIGJpbmRpbmcgPSBiaW5kaW5nc1trZXldOwog ICAgICBpZiAoYmluZGluZykgewogICAgICAgIHRvID0ga2V5LnNsaWNlKDAs IC03KTsgLy8gc3RyaXAgQmluZGluZyBvZmYgZW5kCiAgICAgICAgaWYgKGJp bmRpbmcgaW5zdGFuY2VvZiBFbWJlci5CaW5kaW5nKSB7CiAgICAgICAgICBi aW5kaW5nID0gYmluZGluZy5jb3B5KCk7IC8vIGNvcHkgcHJvdG90eXBlcycg aW5zdGFuY2UKICAgICAgICAgIGJpbmRpbmcudG8odG8pOwogICAgICAgIH0g ZWxzZSB7IC8vIGJpbmRpbmcgaXMgc3RyaW5nIHBhdGgKICAgICAgICAgIGJp bmRpbmcgPSBuZXcgRW1iZXIuQmluZGluZyh0bywgYmluZGluZyk7CiAgICAg ICAgfQogICAgICAgIGJpbmRpbmcuY29ubmVjdChvYmopOwogICAgICAgIG9i altrZXldID0gYmluZGluZzsKICAgICAgfQogICAgfQogICAgLy8gbWFyayBh cyBhcHBsaWVkCiAgICBtLmJpbmRpbmdzID0ge307CiAgfQp9CgpmdW5jdGlv biBmaW5pc2hQYXJ0aWFsKG9iaiwgbSkgewogIGNvbm5lY3RCaW5kaW5ncyhv YmosIG0gfHwgbWV0YUZvcihvYmopKTsKICByZXR1cm4gb2JqOwp9CgpmdW5j dGlvbiBmb2xsb3dBbGlhcyhvYmosIGRlc2MsIG0sIGRlc2NzLCB2YWx1ZXMp IHsKICB2YXIgYWx0S2V5ID0gZGVzYy5tZXRob2ROYW1lLCB2YWx1ZTsKICBp ZiAoZGVzY3NbYWx0S2V5XSB8fCB2YWx1ZXNbYWx0S2V5XSkgewogICAgdmFs dWUgPSB2YWx1ZXNbYWx0S2V5XTsKICAgIGRlc2MgID0gZGVzY3NbYWx0S2V5 XTsKICB9IGVsc2UgaWYgKG0uZGVzY3NbYWx0S2V5XSkgewogICAgZGVzYyAg PSBtLmRlc2NzW2FsdEtleV07CiAgICB2YWx1ZSA9IHVuZGVmaW5lZDsKICB9 IGVsc2UgewogICAgZGVzYyA9IHVuZGVmaW5lZDsKICAgIHZhbHVlID0gb2Jq W2FsdEtleV07CiAgfQoKICByZXR1cm4geyBkZXNjOiBkZXNjLCB2YWx1ZTog dmFsdWUgfTsKfQoKZnVuY3Rpb24gdXBkYXRlT2JzZXJ2ZXJzQW5kTGlzdGVu ZXJzKG9iaiwga2V5LCBvYnNlcnZlck9yTGlzdGVuZXIsIHBhdGhzS2V5LCB1 cGRhdGVNZXRob2QpIHsKICB2YXIgcGF0aHMgPSBvYnNlcnZlck9yTGlzdGVu ZXJbcGF0aHNLZXldOwoKICBpZiAocGF0aHMpIHsKICAgIGZvciAodmFyIGk9 MCwgbD1wYXRocy5sZW5ndGg7IGk8bDsgaSsrKSB7CiAgICAgIEVtYmVyW3Vw ZGF0ZU1ldGhvZF0ob2JqLCBwYXRoc1tpXSwgbnVsbCwga2V5KTsKICAgIH0K ICB9Cn0KCmZ1bmN0aW9uIHJlcGxhY2VPYnNlcnZlcnNBbmRMaXN0ZW5lcnMo b2JqLCBrZXksIG9ic2VydmVyT3JMaXN0ZW5lcikgewogIHZhciBwcmV2ID0g b2JqW2tleV07CgogIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgcHJldikg ewogICAgdXBkYXRlT2JzZXJ2ZXJzQW5kTGlzdGVuZXJzKG9iaiwga2V5LCBw cmV2LCAnX19lbWJlcl9vYnNlcnZlc0JlZm9yZV9fJywgJ3JlbW92ZUJlZm9y ZU9ic2VydmVyJyk7CiAgICB1cGRhdGVPYnNlcnZlcnNBbmRMaXN0ZW5lcnMo b2JqLCBrZXksIHByZXYsICdfX2VtYmVyX29ic2VydmVzX18nLCAncmVtb3Zl T2JzZXJ2ZXInKTsKICAgIHVwZGF0ZU9ic2VydmVyc0FuZExpc3RlbmVycyhv YmosIGtleSwgcHJldiwgJ19fZW1iZXJfbGlzdGVuc19fJywgJ3JlbW92ZUxp c3RlbmVyJyk7CiAgfQoKICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG9i c2VydmVyT3JMaXN0ZW5lcikgewogICAgdXBkYXRlT2JzZXJ2ZXJzQW5kTGlz dGVuZXJzKG9iaiwga2V5LCBvYnNlcnZlck9yTGlzdGVuZXIsICdfX2VtYmVy X29ic2VydmVzQmVmb3JlX18nLCAnYWRkQmVmb3JlT2JzZXJ2ZXInKTsKICAg IHVwZGF0ZU9ic2VydmVyc0FuZExpc3RlbmVycyhvYmosIGtleSwgb2JzZXJ2 ZXJPckxpc3RlbmVyLCAnX19lbWJlcl9vYnNlcnZlc19fJywgJ2FkZE9ic2Vy dmVyJyk7CiAgICB1cGRhdGVPYnNlcnZlcnNBbmRMaXN0ZW5lcnMob2JqLCBr ZXksIG9ic2VydmVyT3JMaXN0ZW5lciwgJ19fZW1iZXJfbGlzdGVuc19fJywg J2FkZExpc3RlbmVyJyk7CiAgfQp9CgpmdW5jdGlvbiBhcHBseU1peGluKG9i aiwgbWl4aW5zLCBwYXJ0aWFsKSB7CiAgdmFyIGRlc2NzID0ge30sIHZhbHVl cyA9IHt9LCBtID0gbWV0YUZvcihvYmopLAogICAgICBrZXksIHZhbHVlLCBk ZXNjLCBrZXlzID0gW107CgogIG9iai5fc3VwZXIgPSBzdXBlckZ1bmN0aW9u OwoKICAvLyBHbyB0aHJvdWdoIGFsbCBtaXhpbnMgYW5kIGhhc2hlcyBwYXNz ZWQgaW4sIGFuZDoKICAvLwogIC8vICogSGFuZGxlIGNvbmNhdGVuYXRlZCBw cm9wZXJ0aWVzCiAgLy8gKiBIYW5kbGUgbWVyZ2VkIHByb3BlcnRpZXMKICAv LyAqIFNldCB1cCBfc3VwZXIgd3JhcHBpbmcgaWYgbmVjZXNzYXJ5CiAgLy8g KiBTZXQgdXAgY29tcHV0ZWQgcHJvcGVydHkgZGVzY3JpcHRvcnMKICAvLyAq IENvcHlpbmcgYHRvU3RyaW5nYCBpbiBicm9rZW4gYnJvd3NlcnMKICBtZXJn ZU1peGlucyhtaXhpbnMsIG1peGluc01ldGEob2JqKSwgZGVzY3MsIHZhbHVl cywgb2JqLCBrZXlzKTsKCiAgZm9yKHZhciBpID0gMCwgbCA9IGtleXMubGVu Z3RoOyBpIDwgbDsgaSsrKSB7CiAgICBrZXkgPSBrZXlzW2ldOwogICAgaWYg KGtleSA9PT0gJ2NvbnN0cnVjdG9yJyB8fCAhdmFsdWVzLmhhc093blByb3Bl cnR5KGtleSkpIHsgY29udGludWU7IH0KCiAgICBkZXNjID0gZGVzY3Nba2V5 XTsKICAgIHZhbHVlID0gdmFsdWVzW2tleV07CgogICAgaWYgKGRlc2MgPT09 IFJFUVVJUkVEKSB7IGNvbnRpbnVlOyB9CgogICAgd2hpbGUgKGRlc2MgJiYg ZGVzYyBpbnN0YW5jZW9mIEFsaWFzKSB7CiAgICAgIHZhciBmb2xsb3dlZCA9 IGZvbGxvd0FsaWFzKG9iaiwgZGVzYywgbSwgZGVzY3MsIHZhbHVlcyk7CiAg ICAgIGRlc2MgPSBmb2xsb3dlZC5kZXNjOwogICAgICB2YWx1ZSA9IGZvbGxv d2VkLnZhbHVlOwogICAgfQoKICAgIGlmIChkZXNjID09PSB1bmRlZmluZWQg JiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgeyBjb250aW51ZTsgfQoKICAgIHJl cGxhY2VPYnNlcnZlcnNBbmRMaXN0ZW5lcnMob2JqLCBrZXksIHZhbHVlKTsK ICAgIGRldGVjdEJpbmRpbmcob2JqLCBrZXksIHZhbHVlLCBtKTsKICAgIGRl ZmluZVByb3BlcnR5KG9iaiwga2V5LCBkZXNjLCB2YWx1ZSwgbSk7CiAgfQoK ICBpZiAoIXBhcnRpYWwpIHsgLy8gZG9uJ3QgYXBwbHkgdG8gcHJvdG90eXBl CiAgICBmaW5pc2hQYXJ0aWFsKG9iaiwgbSk7CiAgfQoKICByZXR1cm4gb2Jq Owp9CgovKioKICBAbWV0aG9kIG1peGluCiAgQGZvciBFbWJlcgogIEBwYXJh bSBvYmoKICBAcGFyYW0gbWl4aW5zKgogIEByZXR1cm4gb2JqCiovCkVtYmVy Lm1peGluID0gZnVuY3Rpb24ob2JqKSB7CiAgdmFyIGFyZ3MgPSBhX3NsaWNl LmNhbGwoYXJndW1lbnRzLCAxKTsKICBhcHBseU1peGluKG9iaiwgYXJncywg ZmFsc2UpOwogIHJldHVybiBvYmo7Cn07CgovKioKICBUaGUgYEVtYmVyLk1p eGluYCBjbGFzcyBhbGxvd3MgeW91IHRvIGNyZWF0ZSBtaXhpbnMsIHdob3Nl IHByb3BlcnRpZXMgY2FuIGJlCiAgYWRkZWQgdG8gb3RoZXIgY2xhc3Nlcy4g Rm9yIGluc3RhbmNlLAoKICBgYGBqYXZhc2NyaXB0CiAgQXBwLkVkaXRhYmxl ID0gRW1iZXIuTWl4aW4uY3JlYXRlKHsKICAgIGVkaXQ6IGZ1bmN0aW9uKCkg ewogICAgICBjb25zb2xlLmxvZygnc3RhcnRpbmcgdG8gZWRpdCcpOwogICAg ICB0aGlzLnNldCgnaXNFZGl0aW5nJywgdHJ1ZSk7CiAgICB9LAogICAgaXNF ZGl0aW5nOiBmYWxzZQogIH0pOwoKICAvLyBNaXggbWl4aW5zIGludG8gY2xh c3NlcyBieSBwYXNzaW5nIHRoZW0gYXMgdGhlIGZpcnN0IGFyZ3VtZW50cyB0 bwogIC8vIC5leHRlbmQuCiAgQXBwLkNvbW1lbnRWaWV3ID0gRW1iZXIuVmll dy5leHRlbmQoQXBwLkVkaXRhYmxlLCB7CiAgICB0ZW1wbGF0ZTogRW1iZXIu SGFuZGxlYmFycy5jb21waWxlKCd7eyNpZiB2aWV3LmlzRWRpdGluZ319Li4u e3tlbHNlfX0uLi57ey9pZn19JykKICB9KTsKCiAgY29tbWVudFZpZXcgPSBB cHAuQ29tbWVudFZpZXcuY3JlYXRlKCk7CiAgY29tbWVudFZpZXcuZWRpdCgp OyAvLyBvdXRwdXRzICdzdGFydGluZyB0byBlZGl0JwogIGBgYAoKICBOb3Rl IHRoYXQgTWl4aW5zIGFyZSBjcmVhdGVkIHdpdGggYEVtYmVyLk1peGluLmNy ZWF0ZWAsIG5vdAogIGBFbWJlci5NaXhpbi5leHRlbmRgLgoKICBOb3RlIHRo YXQgbWl4aW5zIGV4dGVuZCBhIGNvbnN0cnVjdG9yJ3MgcHJvdG90eXBlIHNv IGFycmF5cyBhbmQgb2JqZWN0IGxpdGVyYWxzCiAgZGVmaW5lZCBhcyBwcm9w ZXJ0aWVzIHdpbGwgYmUgc2hhcmVkIGFtb25nc3Qgb2JqZWN0cyB0aGF0IGlt cGxlbWVudCB0aGUgbWl4aW4uCiAgSWYgeW91IHdhbnQgdG8gZGVmaW5lIGEg cHJvcGVydHkgaW4gYSBtaXhpbiB0aGF0IGlzIG5vdCBzaGFyZWQsIHlvdSBj YW4gZGVmaW5lCiAgaXQgZWl0aGVyIGFzIGEgY29tcHV0ZWQgcHJvcGVydHkg b3IgaGF2ZSBpdCBiZSBjcmVhdGVkIG9uIGluaXRpYWxpemF0aW9uIG9mIHRo ZSBvYmplY3QuCgogIGBgYGphdmFzY3JpcHQKICAvL2ZpbHRlcnMgYXJyYXkg d2lsbCBiZSBzaGFyZWQgYW1vbmdzdCBhbnkgb2JqZWN0IGltcGxlbWVudGlu ZyBtaXhpbgogIEFwcC5GaWx0ZXJhYmxlID0gRW1iZXIuTWl4aW4uY3JlYXRl KHsKICAgIGZpbHRlcnM6IEVtYmVyLkEoKQogIH0pOwoKICAvL2ZpbHRlcnMg d2lsbCBiZSBhIHNlcGFyYXRlICBhcnJheSBmb3IgZXZlcnkgb2JqZWN0IGlt cGxlbWVudGluZyB0aGUgbWl4aW4KICBBcHAuRmlsdGVyYWJsZSA9IEVtYmVy Lk1peGluLmNyZWF0ZSh7CiAgICBmaWx0ZXJzOiBFbWJlci5jb21wdXRlZChm dW5jdGlvbigpe3JldHVybiBFbWJlci5BKCk7fSkKICB9KTsKCiAgLy9maWx0 ZXJzIHdpbGwgYmUgY3JlYXRlZCBhcyBhIHNlcGFyYXRlIGFycmF5IGR1cmlu ZyB0aGUgb2JqZWN0J3MgaW5pdGlhbGl6YXRpb24KICBBcHAuRmlsdGVyYWJs ZSA9IEVtYmVyLk1peGluLmNyZWF0ZSh7CiAgICBpbml0OiBmdW5jdGlvbigp IHsKICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgdGhpcy5zZXQoImZpbHRl cnMiLCBFbWJlci5BKCkpOwogICAgfQogIH0pOwogIGBgYAoKICBAY2xhc3Mg TWl4aW4KICBAbmFtZXNwYWNlIEVtYmVyCiovCkVtYmVyLk1peGluID0gZnVu Y3Rpb24oKSB7IHJldHVybiBpbml0TWl4aW4odGhpcywgYXJndW1lbnRzKTsg fTsKCk1peGluID0gRW1iZXIuTWl4aW47CgpNaXhpbi5wcm90b3R5cGUgPSB7 CiAgcHJvcGVydGllczogbnVsbCwKICBtaXhpbnM6IG51bGwsCiAgb3duZXJD b25zdHJ1Y3RvcjogbnVsbAp9OwoKTWl4aW4uX2FwcGx5ID0gYXBwbHlNaXhp bjsKCk1peGluLmFwcGx5UGFydGlhbCA9IGZ1bmN0aW9uKG9iaikgewogIHZh ciBhcmdzID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgcmV0dXJu IGFwcGx5TWl4aW4ob2JqLCBhcmdzLCB0cnVlKTsKfTsKCk1peGluLmZpbmlz aFBhcnRpYWwgPSBmaW5pc2hQYXJ0aWFsOwoKRW1iZXIuYW55VW5wcm9jZXNz ZWRNaXhpbnMgPSBmYWxzZTsKCi8qKgogIEBtZXRob2QgY3JlYXRlCiAgQHN0 YXRpYwogIEBwYXJhbSBhcmd1bWVudHMqCiovCk1peGluLmNyZWF0ZSA9IGZ1 bmN0aW9uKCkgewogIEVtYmVyLmFueVVucHJvY2Vzc2VkTWl4aW5zID0gdHJ1 ZTsKICB2YXIgTSA9IHRoaXM7CiAgcmV0dXJuIGluaXRNaXhpbihuZXcgTSgp LCBhcmd1bWVudHMpOwp9OwoKdmFyIE1peGluUHJvdG90eXBlID0gTWl4aW4u cHJvdG90eXBlOwoKLyoqCiAgQG1ldGhvZCByZW9wZW4KICBAcGFyYW0gYXJn dW1lbnRzKgoqLwpNaXhpblByb3RvdHlwZS5yZW9wZW4gPSBmdW5jdGlvbigp IHsKICB2YXIgbWl4aW4sIHRtcDsKCiAgaWYgKHRoaXMucHJvcGVydGllcykg ewogICAgbWl4aW4gPSBNaXhpbi5jcmVhdGUoKTsKICAgIG1peGluLnByb3Bl cnRpZXMgPSB0aGlzLnByb3BlcnRpZXM7CiAgICBkZWxldGUgdGhpcy5wcm9w ZXJ0aWVzOwogICAgdGhpcy5taXhpbnMgPSBbbWl4aW5dOwogIH0gZWxzZSBp ZiAoIXRoaXMubWl4aW5zKSB7CiAgICB0aGlzLm1peGlucyA9IFtdOwogIH0K CiAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1peGlucyA9IHRoaXMu bWl4aW5zLCBpZHg7CgogIGZvcihpZHg9MDsgaWR4IDwgbGVuOyBpZHgrKykg ewogICAgbWl4aW4gPSBhcmd1bWVudHNbaWR4XTsKICAgIEVtYmVyLmFzc2Vy dCgnRXhwZWN0ZWQgaGFzaCBvciBNaXhpbiBpbnN0YW5jZSwgZ290ICcgKyBP YmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobWl4aW4pLAogICAgICAg ICAgICAgICAgIHR5cGVvZiBtaXhpbiA9PT0gJ29iamVjdCcgJiYgbWl4aW4g IT09IG51bGwgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG1p eGluKSAhPT0gJ1tvYmplY3QgQXJyYXldJyk7CgogICAgaWYgKG1peGluIGlu c3RhbmNlb2YgTWl4aW4pIHsKICAgICAgbWl4aW5zLnB1c2gobWl4aW4pOwog ICAgfSBlbHNlIHsKICAgICAgdG1wID0gTWl4aW4uY3JlYXRlKCk7CiAgICAg IHRtcC5wcm9wZXJ0aWVzID0gbWl4aW47CiAgICAgIG1peGlucy5wdXNoKHRt cCk7CiAgICB9CiAgfQoKICByZXR1cm4gdGhpczsKfTsKCi8qKgogIEBtZXRo b2QgYXBwbHkKICBAcGFyYW0gb2JqCiAgQHJldHVybiBhcHBsaWVkIG9iamVj dAoqLwpNaXhpblByb3RvdHlwZS5hcHBseSA9IGZ1bmN0aW9uKG9iaikgewog IHJldHVybiBhcHBseU1peGluKG9iaiwgW3RoaXNdLCBmYWxzZSk7Cn07CgpN aXhpblByb3RvdHlwZS5hcHBseVBhcnRpYWwgPSBmdW5jdGlvbihvYmopIHsK ICByZXR1cm4gYXBwbHlNaXhpbihvYmosIFt0aGlzXSwgdHJ1ZSk7Cn07Cgpm dW5jdGlvbiBfZGV0ZWN0KGN1ck1peGluLCB0YXJnZXRNaXhpbiwgc2Vlbikg ewogIHZhciBndWlkID0gZ3VpZEZvcihjdXJNaXhpbik7CgogIGlmIChzZWVu W2d1aWRdKSB7IHJldHVybiBmYWxzZTsgfQogIHNlZW5bZ3VpZF0gPSB0cnVl OwoKICBpZiAoY3VyTWl4aW4gPT09IHRhcmdldE1peGluKSB7IHJldHVybiB0 cnVlOyB9CiAgdmFyIG1peGlucyA9IGN1ck1peGluLm1peGlucywgbG9jID0g bWl4aW5zID8gbWl4aW5zLmxlbmd0aCA6IDA7CiAgd2hpbGUgKC0tbG9jID49 IDApIHsKICAgIGlmIChfZGV0ZWN0KG1peGluc1tsb2NdLCB0YXJnZXRNaXhp biwgc2VlbikpIHsgcmV0dXJuIHRydWU7IH0KICB9CiAgcmV0dXJuIGZhbHNl Owp9CgovKioKICBAbWV0aG9kIGRldGVjdAogIEBwYXJhbSBvYmoKICBAcmV0 dXJuIHtCb29sZWFufQoqLwpNaXhpblByb3RvdHlwZS5kZXRlY3QgPSBmdW5j dGlvbihvYmopIHsKICBpZiAoIW9iaikgeyByZXR1cm4gZmFsc2U7IH0KICBp ZiAob2JqIGluc3RhbmNlb2YgTWl4aW4pIHsgcmV0dXJuIF9kZXRlY3Qob2Jq LCB0aGlzLCB7fSk7IH0KICB2YXIgbSA9IG9ialtNRVRBX0tFWV0sCiAgICAg IG1peGlucyA9IG0gJiYgbS5taXhpbnM7CiAgaWYgKG1peGlucykgewogICAg cmV0dXJuICEhbWl4aW5zW2d1aWRGb3IodGhpcyldOwogIH0KICByZXR1cm4g ZmFsc2U7Cn07CgpNaXhpblByb3RvdHlwZS53aXRob3V0ID0gZnVuY3Rpb24o KSB7CiAgdmFyIHJldCA9IG5ldyBNaXhpbih0aGlzKTsKICByZXQuX3dpdGhv dXQgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzKTsKICByZXR1cm4gcmV0Owp9 OwoKZnVuY3Rpb24gX2tleXMocmV0LCBtaXhpbiwgc2VlbikgewogIGlmIChz ZWVuW2d1aWRGb3IobWl4aW4pXSkgeyByZXR1cm47IH0KICBzZWVuW2d1aWRG b3IobWl4aW4pXSA9IHRydWU7CgogIGlmIChtaXhpbi5wcm9wZXJ0aWVzKSB7 CiAgICB2YXIgcHJvcHMgPSBtaXhpbi5wcm9wZXJ0aWVzOwogICAgZm9yICh2 YXIga2V5IGluIHByb3BzKSB7CiAgICAgIGlmIChwcm9wcy5oYXNPd25Qcm9w ZXJ0eShrZXkpKSB7IHJldFtrZXldID0gdHJ1ZTsgfQogICAgfQogIH0gZWxz ZSBpZiAobWl4aW4ubWl4aW5zKSB7CiAgICBhX2ZvckVhY2guY2FsbChtaXhp bi5taXhpbnMsIGZ1bmN0aW9uKHgpIHsgX2tleXMocmV0LCB4LCBzZWVuKTsg fSk7CiAgfQp9CgpNaXhpblByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24oKSB7 CiAgdmFyIGtleXMgPSB7fSwgc2VlbiA9IHt9LCByZXQgPSBbXTsKICBfa2V5 cyhrZXlzLCB0aGlzLCBzZWVuKTsKICBmb3IodmFyIGtleSBpbiBrZXlzKSB7 CiAgICBpZiAoa2V5cy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IHJldC5wdXNo KGtleSk7IH0KICB9CiAgcmV0dXJuIHJldDsKfTsKCi8vIHJldHVybnMgdGhl IG1peGlucyBjdXJyZW50bHkgYXBwbGllZCB0byB0aGUgc3BlY2lmaWVkIG9i amVjdAovLyBUT0RPOiBNYWtlIEVtYmVyLm1peGluCk1peGluLm1peGlucyA9 IGZ1bmN0aW9uKG9iaikgewogIHZhciBtID0gb2JqW01FVEFfS0VZXSwKICAg ICAgbWl4aW5zID0gbSAmJiBtLm1peGlucywgcmV0ID0gW107CgogIGlmICgh bWl4aW5zKSB7IHJldHVybiByZXQ7IH0KCiAgZm9yICh2YXIga2V5IGluIG1p eGlucykgewogICAgdmFyIG1peGluID0gbWl4aW5zW2tleV07CgogICAgLy8g c2tpcCBwcmltaXRpdmUgbWl4aW5zIHNpbmNlIHRoZXNlIGFyZSBhbHdheXMg YW5vbnltb3VzCiAgICBpZiAoIW1peGluLnByb3BlcnRpZXMpIHsgcmV0LnB1 c2gobWl4aW4pOyB9CiAgfQoKICByZXR1cm4gcmV0Owp9OwoKUkVRVUlSRUQg PSBuZXcgRW1iZXIuRGVzY3JpcHRvcigpOwpSRVFVSVJFRC50b1N0cmluZyA9 IGZ1bmN0aW9uKCkgeyByZXR1cm4gJyhSZXF1aXJlZCBQcm9wZXJ0eSknOyB9 OwoKLyoqCiAgRGVub3RlcyBhIHJlcXVpcmVkIHByb3BlcnR5IGZvciBhIG1p eGluCgogIEBtZXRob2QgcmVxdWlyZWQKICBAZm9yIEVtYmVyCiovCkVtYmVy LnJlcXVpcmVkID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIFJFUVVJUkVEOwp9 OwoKQWxpYXMgPSBmdW5jdGlvbihtZXRob2ROYW1lKSB7CiAgdGhpcy5tZXRo b2ROYW1lID0gbWV0aG9kTmFtZTsKfTsKQWxpYXMucHJvdG90eXBlID0gbmV3 IEVtYmVyLkRlc2NyaXB0b3IoKTsKCi8qKgogIE1ha2VzIGEgbWV0aG9kIGF2 YWlsYWJsZSB2aWEgYW4gYWRkaXRpb25hbCBuYW1lLgoKICBgYGBqYXZhc2Ny aXB0CiAgQXBwLlBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoewogICAg bmFtZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiAnVG9taHVkYSBLYXR6 ZGFsZSc7CiAgICB9LAogICAgbW9uaWtlcjogRW1iZXIuYWxpYXNNZXRob2Qo J25hbWUnKQogIH0pOwoKICB2YXIgZ29vZEd1eSA9IEFwcC5QZXJzb24uY3Jl YXRlKCkKICBgYGAKCiAgQG1ldGhvZCBhbGlhc01ldGhvZAogIEBmb3IgRW1i ZXIKICBAcGFyYW0ge1N0cmluZ30gbWV0aG9kTmFtZSBuYW1lIG9mIHRoZSBt ZXRob2QgdG8gYWxpYXMKICBAcmV0dXJuIHtFbWJlci5EZXNjcmlwdG9yfQoq LwpFbWJlci5hbGlhc01ldGhvZCA9IGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHsK ICByZXR1cm4gbmV3IEFsaWFzKG1ldGhvZE5hbWUpOwp9OwoKLy8gLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLgovLyBPQlNFUlZFUiBIRUxQRVIKLy8KCi8qKgogIFNwZWNpZnkg YSBtZXRob2QgdGhhdCBvYnNlcnZlcyBwcm9wZXJ0eSBjaGFuZ2VzLgoKICBg YGBqYXZhc2NyaXB0CiAgRW1iZXIuT2JqZWN0LmV4dGVuZCh7CiAgICB2YWx1 ZU9ic2VydmVyOiBFbWJlci5vYnNlcnZlcigndmFsdWUnLCBmdW5jdGlvbigp IHsKICAgICAgLy8gRXhlY3V0ZXMgd2hlbmV2ZXIgdGhlICJ2YWx1ZSIgcHJv cGVydHkgY2hhbmdlcwogICAgfSkKICB9KTsKICBgYGAKCiAgSW4gdGhlIGZ1 dHVyZSB0aGlzIG1ldGhvZCBtYXkgYmVjb21lIGFzeW5jaHJvbm91cy4gSWYg eW91IHdhbnQgdG8gZW5zdXJlCiAgc3luY2hyb25vdXMgYmVoYXZpb3IsIHVz ZSBgaW1tZWRpYXRlT2JzZXJ2ZXJgLgoKICBBbHNvIGF2YWlsYWJsZSBhcyBg RnVuY3Rpb24ucHJvdG90eXBlLm9ic2VydmVzYCBpZiBwcm90b3R5cGUgZXh0 ZW5zaW9ucyBhcmUKICBlbmFibGVkLgoKICBAbWV0aG9kIG9ic2VydmVyCiAg QGZvciBFbWJlcgogIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eU5hbWVzKgog IEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMKICBAcmV0dXJuIGZ1bmMKKi8KRW1i ZXIub2JzZXJ2ZXIgPSBmdW5jdGlvbigpIHsKICB2YXIgZnVuYyAgPSBhX3Ns aWNlLmNhbGwoYXJndW1lbnRzLCAtMSlbMF07CiAgdmFyIHBhdGhzOwoKICB2 YXIgYWRkV2F0Y2hlZFByb3BlcnR5ID0gZnVuY3Rpb24gKHBhdGgpIHsgcGF0 aHMucHVzaChwYXRoKTsgfTsKICB2YXIgX3BhdGhzID0gYV9zbGljZS5jYWxs KGFyZ3VtZW50cywgMCwgLTEpOwoKICBpZiAodHlwZW9mIGZ1bmMgIT09ICJm dW5jdGlvbiIpIHsKICAgIC8vIHJldmVydCB0byBvbGQsIHNvZnQtZGVwcmVj YXRlZCBhcmd1bWVudCBvcmRlcmluZwoKICAgIGZ1bmMgID0gYXJndW1lbnRz WzBdOwogICAgX3BhdGhzID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7 CiAgfQoKICBwYXRocyA9IFtdOwoKICBmb3IgKHZhciBpPTA7IGk8X3BhdGhz Lmxlbmd0aDsgKytpKSB7CiAgICBleHBhbmRQcm9wZXJ0aWVzKF9wYXRoc1tp XSwgYWRkV2F0Y2hlZFByb3BlcnR5KTsKICB9CgogIGlmICh0eXBlb2YgZnVu YyAhPT0gImZ1bmN0aW9uIikgewogICAgdGhyb3cgbmV3IEVtYmVyLkVycm9y KCJFbWJlci5vYnNlcnZlciBjYWxsZWQgd2l0aG91dCBhIGZ1bmN0aW9uIik7 CiAgfQoKICBmdW5jLl9fZW1iZXJfb2JzZXJ2ZXNfXyA9IHBhdGhzOwogIHJl dHVybiBmdW5jOwp9OwoKLyoqCiAgU3BlY2lmeSBhIG1ldGhvZCB0aGF0IG9i c2VydmVzIHByb3BlcnR5IGNoYW5nZXMuCgogIGBgYGphdmFzY3JpcHQKICBF bWJlci5PYmplY3QuZXh0ZW5kKHsKICAgIHZhbHVlT2JzZXJ2ZXI6IEVtYmVy LmltbWVkaWF0ZU9ic2VydmVyKCd2YWx1ZScsIGZ1bmN0aW9uKCkgewogICAg ICAvLyBFeGVjdXRlcyB3aGVuZXZlciB0aGUgInZhbHVlIiBwcm9wZXJ0eSBj aGFuZ2VzCiAgICB9KQogIH0pOwogIGBgYAoKICBJbiB0aGUgZnV0dXJlLCBg RW1iZXIub2JzZXJ2ZXJgIG1heSBiZWNvbWUgYXN5bmNocm9ub3VzLiBJbiB0 aGlzIGV2ZW50LAogIGBFbWJlci5pbW1lZGlhdGVPYnNlcnZlcmAgd2lsbCBt YWludGFpbiB0aGUgc3luY2hyb25vdXMgYmVoYXZpb3IuCgogIEFsc28gYXZh aWxhYmxlIGFzIGBGdW5jdGlvbi5wcm90b3R5cGUub2JzZXJ2ZXNJbW1lZGlh dGVseWAgaWYgcHJvdG90eXBlIGV4dGVuc2lvbnMgYXJlCiAgZW5hYmxlZC4K CiAgQG1ldGhvZCBpbW1lZGlhdGVPYnNlcnZlcgogIEBmb3IgRW1iZXIKICBA cGFyYW0ge1N0cmluZ30gcHJvcGVydHlOYW1lcyoKICBAcGFyYW0ge0Z1bmN0 aW9ufSBmdW5jCiAgQHJldHVybiBmdW5jCiovCkVtYmVyLmltbWVkaWF0ZU9i c2VydmVyID0gZnVuY3Rpb24oKSB7CiAgZm9yICh2YXIgaT0wLCBsPWFyZ3Vt ZW50cy5sZW5ndGg7IGk8bDsgaSsrKSB7CiAgICB2YXIgYXJnID0gYXJndW1l bnRzW2ldOwogICAgRW1iZXIuYXNzZXJ0KCJJbW1lZGlhdGUgb2JzZXJ2ZXJz IG11c3Qgb2JzZXJ2ZSBpbnRlcm5hbCBwcm9wZXJ0aWVzIG9ubHksIG5vdCBw cm9wZXJ0aWVzIG9uIG90aGVyIG9iamVjdHMuIiwgdHlwZW9mIGFyZyAhPT0g InN0cmluZyIgfHwgYXJnLmluZGV4T2YoJy4nKSA9PT0gLTEpOwogIH0KCiAg cmV0dXJuIEVtYmVyLm9ic2VydmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7 Cn07CgovKioKICBXaGVuIG9ic2VydmVycyBmaXJlLCB0aGV5IGFyZSBjYWxs ZWQgd2l0aCB0aGUgYXJndW1lbnRzIGBvYmpgLCBga2V5TmFtZWAuCgogIE5v dGUsIGBAZWFjaC5wcm9wZXJ0eWAgb2JzZXJ2ZXIgaXMgY2FsbGVkIHBlciBl YWNoIGFkZCBvciByZXBsYWNlIG9mIGFuIGVsZW1lbnQKICBhbmQgaXQncyBu b3QgY2FsbGVkIHdpdGggYSBzcGVjaWZpYyBlbnVtZXJhdGlvbiBpdGVtLgoK ICBBIGBiZWZvcmVPYnNlcnZlcmAgZmlyZXMgYmVmb3JlIGEgcHJvcGVydHkg Y2hhbmdlcy4KCiAgQSBgYmVmb3JlT2JzZXJ2ZXJgIGlzIGFuIGFsdGVybmF0 aXZlIGZvcm0gb2YgYC5vYnNlcnZlc0JlZm9yZSgpYC4KCiAgYGBgamF2YXNj cmlwdAogIEFwcC5QZXJzb25WaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoewoK ICAgIGZyaWVuZHM6IFt7IG5hbWU6ICdUb20nIH0sIHsgbmFtZTogJ1N0ZWZh bicgfSwgeyBuYW1lOiAnS3JpcycgfV0sCgogICAgdmFsdWVXaWxsQ2hhbmdl OiBFbWJlci5iZWZvcmVPYnNlcnZlcignY29udGVudC52YWx1ZScsIGZ1bmN0 aW9uKG9iaiwga2V5TmFtZSkgewogICAgICB0aGlzLmNoYW5naW5nRnJvbSA9 IG9iai5nZXQoa2V5TmFtZSk7CiAgICB9KSwKCiAgICB2YWx1ZURpZENoYW5n ZTogRW1iZXIub2JzZXJ2ZXIoJ2NvbnRlbnQudmFsdWUnLCBmdW5jdGlvbihv YmosIGtleU5hbWUpIHsKICAgICAgICAvLyBvbmx5IHJ1biBpZiB1cGRhdGlu ZyBhIHZhbHVlIGFscmVhZHkgaW4gdGhlIERPTQogICAgICAgIGlmICh0aGlz LmdldCgnc3RhdGUnKSA9PT0gJ2luRE9NJykgewogICAgICAgICAgdmFyIGNv bG9yID0gb2JqLmdldChrZXlOYW1lKSA+IHRoaXMuY2hhbmdpbmdGcm9tID8g J2dyZWVuJyA6ICdyZWQnOwogICAgICAgICAgLy8gbG9naWMKICAgICAgICB9 CiAgICB9KSwKCiAgICBmcmllbmRzRGlkQ2hhbmdlOiBFbWJlci5vYnNlcnZl cignZnJpZW5kcy5AZWFjaC5uYW1lJywgZnVuY3Rpb24ob2JqLCBrZXlOYW1l KSB7CiAgICAgIC8vIHNvbWUgbG9naWMKICAgICAgLy8gb2JqLmdldChrZXlO YW1lKSByZXR1cm5zIGZyaWVuZHMgYXJyYXkKICAgIH0pCiAgfSk7CiAgYGBg CgogIEFsc28gYXZhaWxhYmxlIGFzIGBGdW5jdGlvbi5wcm90b3R5cGUub2Jz ZXJ2ZXNCZWZvcmVgIGlmIHByb3RvdHlwZSBleHRlbnNpb25zIGFyZQogIGVu YWJsZWQuCgogIEBtZXRob2QgYmVmb3JlT2JzZXJ2ZXIKICBAZm9yIEVtYmVy CiAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5TmFtZXMqCiAgQHBhcmFtIHtG dW5jdGlvbn0gZnVuYwogIEByZXR1cm4gZnVuYwoqLwpFbWJlci5iZWZvcmVP YnNlcnZlciA9IGZ1bmN0aW9uKCkgewogIHZhciBmdW5jICA9IGFfc2xpY2Uu Y2FsbChhcmd1bWVudHMsIC0xKVswXTsKICB2YXIgcGF0aHM7CgogIHZhciBh ZGRXYXRjaGVkUHJvcGVydHkgPSBmdW5jdGlvbihwYXRoKSB7IHBhdGhzLnB1 c2gocGF0aCk7IH07CgogIHZhciBfcGF0aHMgPSBhX3NsaWNlLmNhbGwoYXJn dW1lbnRzLCAwLCAtMSk7CgogIGlmICh0eXBlb2YgZnVuYyAhPT0gImZ1bmN0 aW9uIikgewogICAgLy8gcmV2ZXJ0IHRvIG9sZCwgc29mdC1kZXByZWNhdGVk IGFyZ3VtZW50IG9yZGVyaW5nCgogICAgZnVuYyAgPSBhcmd1bWVudHNbMF07 CiAgICBfcGF0aHMgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICB9 CgogIHBhdGhzID0gW107CgogIGZvciAodmFyIGk9MDsgaTxfcGF0aHMubGVu Z3RoOyArK2kpIHsKICAgIGV4cGFuZFByb3BlcnRpZXMoX3BhdGhzW2ldLCBh ZGRXYXRjaGVkUHJvcGVydHkpOwogIH0KCiAgaWYgKHR5cGVvZiBmdW5jICE9 PSAiZnVuY3Rpb24iKSB7CiAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoIkVt YmVyLmJlZm9yZU9ic2VydmVyIGNhbGxlZCB3aXRob3V0IGEgZnVuY3Rpb24i KTsKICB9CgogIGZ1bmMuX19lbWJlcl9vYnNlcnZlc0JlZm9yZV9fID0gcGF0 aHM7CiAgcmV0dXJuIGZ1bmM7Cn07Cgp9KSgpOwoKCgooZnVuY3Rpb24oKSB7 Ci8vIFByb3ZpZGVzIGEgd2F5IHRvIHJlZ2lzdGVyIGxpYnJhcnkgdmVyc2lv bnMgd2l0aCBlbWJlci4KdmFyIGZvckVhY2ggPSBFbWJlci5FbnVtZXJhYmxl VXRpbHMuZm9yRWFjaCwKICAgIGluZGV4T2YgPSBFbWJlci5FbnVtZXJhYmxl VXRpbHMuaW5kZXhPZjsKCkVtYmVyLmxpYnJhcmllcyA9IGZ1bmN0aW9uKCkg ewogIHZhciBsaWJyYXJpZXMgICAgPSBbXTsKICB2YXIgY29yZUxpYkluZGV4 ID0gMDsKCiAgdmFyIGdldExpYnJhcnkgPSBmdW5jdGlvbihuYW1lKSB7CiAg ICBmb3IgKHZhciBpID0gMDsgaSA8IGxpYnJhcmllcy5sZW5ndGg7IGkrKykg ewogICAgICBpZiAobGlicmFyaWVzW2ldLm5hbWUgPT09IG5hbWUpIHsKICAg ICAgICByZXR1cm4gbGlicmFyaWVzW2ldOwogICAgICB9CiAgICB9CiAgfTsK CiAgbGlicmFyaWVzLnJlZ2lzdGVyID0gZnVuY3Rpb24obmFtZSwgdmVyc2lv bikgewogICAgaWYgKCFnZXRMaWJyYXJ5KG5hbWUpKSB7CiAgICAgIGxpYnJh cmllcy5wdXNoKHtuYW1lOiBuYW1lLCB2ZXJzaW9uOiB2ZXJzaW9ufSk7CiAg ICB9CiAgfTsKCiAgbGlicmFyaWVzLnJlZ2lzdGVyQ29yZUxpYnJhcnkgPSBm dW5jdGlvbihuYW1lLCB2ZXJzaW9uKSB7CiAgICBpZiAoIWdldExpYnJhcnko bmFtZSkpIHsKICAgICAgbGlicmFyaWVzLnNwbGljZShjb3JlTGliSW5kZXgr KywgMCwge25hbWU6IG5hbWUsIHZlcnNpb246IHZlcnNpb259KTsKICAgIH0K ICB9OwoKICBsaWJyYXJpZXMuZGVSZWdpc3RlciA9IGZ1bmN0aW9uKG5hbWUp IHsKICAgIHZhciBsaWIgPSBnZXRMaWJyYXJ5KG5hbWUpOwogICAgaWYgKGxp YikgbGlicmFyaWVzLnNwbGljZShpbmRleE9mKGxpYnJhcmllcywgbGliKSwg MSk7CiAgfTsKCiAgbGlicmFyaWVzLmVhY2ggPSBmdW5jdGlvbiAoY2FsbGJh Y2spIHsKICAgIGZvckVhY2gobGlicmFyaWVzLCBmdW5jdGlvbihsaWIpIHsK ICAgICAgY2FsbGJhY2sobGliLm5hbWUsIGxpYi52ZXJzaW9uKTsKICAgIH0p OwogIH07CgogIHJldHVybiBsaWJyYXJpZXM7Cn0oKTsKCkVtYmVyLmxpYnJh cmllcy5yZWdpc3RlckNvcmVMaWJyYXJ5KCdFbWJlcicsIEVtYmVyLlZFUlNJ T04pOwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewovKioKRW1iZXIgTWV0YWwK CkBtb2R1bGUgZW1iZXIKQHN1Ym1vZHVsZSBlbWJlci1tZXRhbAoqLwoKfSko KTsKCihmdW5jdGlvbigpIHsKLyoqCiAgQGNsYXNzIFJTVlAKICBAbW9kdWxl IFJTVlAKICAqLwpkZWZpbmUoInJzdnAvYWxsIiwgCiAgWyIuL3Byb21pc2Ui LCJleHBvcnRzIl0sCiAgZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2V4 cG9ydHNfXykgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFByb21pc2Ug PSBfX2RlcGVuZGVuY3kxX19bImRlZmF1bHQiXTsKCiAgICAvKioKICAgICAg VGhpcyBpcyBhIGNvbnZlbmllbnQgYWxpYXMgZm9yIGBSU1ZQLlByb21pc2Uu YWxsYC4KCiAgICAgIEBtZXRob2QgYWxsCiAgICAgIEBmb3IgUlNWUAogICAg ICBAcGFyYW0ge0FycmF5fSBhcnJheSBBcnJheSBvZiBwcm9taXNlcy4KICAg ICAgQHBhcmFtIHtTdHJpbmd9IGxhYmVsIEFuIG9wdGlvbmFsIGxhYmVsLiBU aGlzIGlzIHVzZWZ1bAogICAgICBmb3IgdG9vbGluZy4KICAgICAgQHN0YXRp YwogICAgKi8KICAgIF9fZXhwb3J0c19fWyJkZWZhdWx0Il0gPSBmdW5jdGlv biBhbGwoYXJyYXksIGxhYmVsKSB7CiAgICAgIHJldHVybiBQcm9taXNlLmFs bChhcnJheSwgbGFiZWwpOwogICAgfTsKICB9KTsKZGVmaW5lKCJyc3ZwL2Fs bF9zZXR0bGVkIiwgCiAgWyIuL3Byb21pc2UiLCIuL3V0aWxzIiwiZXhwb3J0 cyJdLAogIGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19kZXBlbmRlbmN5 Ml9fLCBfX2V4cG9ydHNfXykgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFy IFByb21pc2UgPSBfX2RlcGVuZGVuY3kxX19bImRlZmF1bHQiXTsKICAgIHZh ciBpc0FycmF5ID0gX19kZXBlbmRlbmN5Ml9fLmlzQXJyYXk7CiAgICB2YXIg aXNOb25UaGVuYWJsZSA9IF9fZGVwZW5kZW5jeTJfXy5pc05vblRoZW5hYmxl OwoKICAgIC8qKgogICAgICBgUlNWUC5hbGxTZXR0bGVkYCBpcyBzaW1pbGFy IHRvIGBSU1ZQLmFsbGAsIGJ1dCBpbnN0ZWFkIG9mIGltcGxlbWVudGluZwog ICAgICBhIGZhaWwtZmFzdCBtZXRob2QsIGl0IHdhaXRzIHVudGlsIGFsbCB0 aGUgcHJvbWlzZXMgaGF2ZSByZXR1cm5lZCBhbmQKICAgICAgc2hvd3MgeW91 IGFsbCB0aGUgcmVzdWx0cy4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQg dG8gaGFuZGxlIG11bHRpcGxlCiAgICAgIHByb21pc2VzJyBmYWlsdXJlIHN0 YXRlcyB0b2dldGhlciBhcyBhIHNldC4KCiAgICAgIFJldHVybnMgYSBwcm9t aXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gYWxsIHRoZSBnaXZlbiBwcm9t aXNlcyBoYXZlIGJlZW4KICAgICAgc2V0dGxlZC4gVGhlIHJldHVybiBwcm9t aXNlIGlzIGZ1bGZpbGxlZCB3aXRoIGFuIGFycmF5IG9mIHRoZSBzdGF0ZXMg b2YKICAgICAgdGhlIHByb21pc2VzIHBhc3NlZCBpbnRvIHRoZSBgcHJvbWlz ZXNgIGFycmF5IGFyZ3VtZW50LgoKICAgICAgRWFjaCBzdGF0ZSBvYmplY3Qg d2lsbCBlaXRoZXIgaW5kaWNhdGUgZnVsZmlsbG1lbnQgb3IgcmVqZWN0aW9u LCBhbmQKICAgICAgcHJvdmlkZSB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBv ciByZWFzb24uIFRoZSBzdGF0ZXMgd2lsbCB0YWtlIG9uZSBvZgogICAgICB0 aGUgZm9sbG93aW5nIGZvcm1hdHM6CgogICAgICBgYGBqYXZhc2NyaXB0CiAg ICAgIHsgc3RhdGU6ICdmdWxmaWxsZWQnLCB2YWx1ZTogdmFsdWUgfQogICAg ICAgIG9yCiAgICAgIHsgc3RhdGU6ICdyZWplY3RlZCcsIHJlYXNvbjogcmVh c29uIH0KICAgICAgYGBgCgogICAgICBFeGFtcGxlOgoKICAgICAgYGBgamF2 YXNjcmlwdAogICAgICB2YXIgcHJvbWlzZTEgPSBSU1ZQLlByb21pc2UucmVz b2x2ZSgxKTsKICAgICAgdmFyIHByb21pc2UyID0gUlNWUC5Qcm9taXNlLnJl amVjdChuZXcgRXJyb3IoJzInKSk7CiAgICAgIHZhciBwcm9taXNlMyA9IFJT VlAuUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCczJykpOwogICAgICB2YXIg cHJvbWlzZXMgPSBbIHByb21pc2UxLCBwcm9taXNlMiwgcHJvbWlzZTMgXTsK CiAgICAgIFJTVlAuYWxsU2V0dGxlZChwcm9taXNlcykudGhlbihmdW5jdGlv bihhcnJheSl7CiAgICAgICAgLy8gYXJyYXkgPT0gWwogICAgICAgIC8vICAg eyBzdGF0ZTogJ2Z1bGZpbGxlZCcsIHZhbHVlOiAxIH0sCiAgICAgICAgLy8g ICB7IHN0YXRlOiAncmVqZWN0ZWQnLCByZWFzb246IEVycm9yIH0sCiAgICAg ICAgLy8gICB7IHN0YXRlOiAncmVqZWN0ZWQnLCByZWFzb246IEVycm9yIH0K ICAgICAgICAvLyBdCiAgICAgICAgLy8gTm90ZSB0aGF0IGZvciB0aGUgc2Vj b25kIGl0ZW0sIHJlYXNvbi5tZXNzYWdlIHdpbGwgYmUgIjIiLCBhbmQgZm9y IHRoZQogICAgICAgIC8vIHRoaXJkIGl0ZW0sIHJlYXNvbi5tZXNzYWdlIHdp bGwgYmUgIjMiLgogICAgICB9LCBmdW5jdGlvbihlcnJvcikgewogICAgICAg IC8vIE5vdCBydW4uIChUaGlzIGJsb2NrIHdvdWxkIG9ubHkgYmUgY2FsbGVk IGlmIGFsbFNldHRsZWQgaGFkIGZhaWxlZCwKICAgICAgICAvLyBmb3IgaW5z dGFuY2UgaWYgcGFzc2VkIGFuIGluY29ycmVjdCBhcmd1bWVudCB0eXBlLikK ICAgICAgfSk7CiAgICAgIGBgYAoKICAgICAgQG1ldGhvZCBhbGxTZXR0bGVk CiAgICAgIEBmb3IgUlNWUAogICAgICBAcGFyYW0ge0FycmF5fSBwcm9taXNl cwogICAgICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgLSBvcHRpb25hbCBzdHJp bmcgdGhhdCBkZXNjcmliZXMgdGhlIHByb21pc2UuCiAgICAgIFVzZWZ1bCBm b3IgdG9vbGluZy4KICAgICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZSB0 aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIGFuIGFycmF5IG9mIHRoZSBzZXR0bGVk CiAgICAgIHN0YXRlcyBvZiB0aGUgY29uc3RpdHVlbnQgcHJvbWlzZXMuCiAg ICAgIEBzdGF0aWMKICAgICovCgogICAgX19leHBvcnRzX19bImRlZmF1bHQi XSA9IGZ1bmN0aW9uIGFsbFNldHRsZWQoZW50cmllcywgbGFiZWwpIHsKICAg ICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVj dCkgewogICAgICAgIGlmICghaXNBcnJheShlbnRyaWVzKSkgewogICAgICAg ICAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhbiBhcnJh eSB0byBhbGxTZXR0bGVkLicpOwogICAgICAgIH0KCiAgICAgICAgdmFyIHJl bWFpbmluZyA9IGVudHJpZXMubGVuZ3RoOwogICAgICAgIHZhciBlbnRyeTsK CiAgICAgICAgaWYgKHJlbWFpbmluZyA9PT0gMCkgewogICAgICAgICAgcmVz b2x2ZShbXSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAg ICB2YXIgcmVzdWx0cyA9IG5ldyBBcnJheShyZW1haW5pbmcpOwoKICAgICAg ICBmdW5jdGlvbiBmdWxmaWxsZWRSZXNvbHZlcihpbmRleCkgewogICAgICAg ICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIHJlc29s dmVBbGwoaW5kZXgsIGZ1bGZpbGxlZCh2YWx1ZSkpOwogICAgICAgICAgfTsK ICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkUmVzb2x2ZXIo aW5kZXgpIHsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbihyZWFzb24pIHsK ICAgICAgICAgICAgcmVzb2x2ZUFsbChpbmRleCwgcmVqZWN0ZWQocmVhc29u KSk7CiAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24g cmVzb2x2ZUFsbChpbmRleCwgdmFsdWUpIHsKICAgICAgICAgIHJlc3VsdHNb aW5kZXhdID0gdmFsdWU7CiAgICAgICAgICBpZiAoLS1yZW1haW5pbmcgPT09 IDApIHsKICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHRzKTsKICAgICAgICAg IH0KICAgICAgICB9CgogICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5k ZXggPCBlbnRyaWVzLmxlbmd0aDsgaW5kZXgrKykgewogICAgICAgICAgZW50 cnkgPSBlbnRyaWVzW2luZGV4XTsKCiAgICAgICAgICBpZiAoaXNOb25UaGVu YWJsZShlbnRyeSkpIHsKICAgICAgICAgICAgcmVzb2x2ZUFsbChpbmRleCwg ZnVsZmlsbGVkKGVudHJ5KSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAg ICAgICBQcm9taXNlLmNhc3QoZW50cnkpLnRoZW4oZnVsZmlsbGVkUmVzb2x2 ZXIoaW5kZXgpLCByZWplY3RlZFJlc29sdmVyKGluZGV4KSk7CiAgICAgICAg ICB9CiAgICAgICAgfQogICAgICB9LCBsYWJlbCk7CiAgICB9OwoKICAgIGZ1 bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgewogICAgICByZXR1cm4geyBzdGF0 ZTogJ2Z1bGZpbGxlZCcsIHZhbHVlOiB2YWx1ZSB9OwogICAgfQoKICAgIGZ1 bmN0aW9uIHJlamVjdGVkKHJlYXNvbikgewogICAgICByZXR1cm4geyBzdGF0 ZTogJ3JlamVjdGVkJywgcmVhc29uOiByZWFzb24gfTsKICAgIH0KICB9KTsK ZGVmaW5lKCJyc3ZwL2NvbmZpZyIsIAogIFsiLi9ldmVudHMiLCJleHBvcnRz Il0sCiAgZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2V4cG9ydHNfXykg ewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIEV2ZW50VGFyZ2V0ID0gX19k ZXBlbmRlbmN5MV9fWyJkZWZhdWx0Il07CgogICAgdmFyIGNvbmZpZyA9IHsK ICAgICAgaW5zdHJ1bWVudDogZmFsc2UKICAgIH07CgogICAgRXZlbnRUYXJn ZXQubWl4aW4oY29uZmlnKTsKCiAgICBmdW5jdGlvbiBjb25maWd1cmUobmFt ZSwgdmFsdWUpIHsKICAgICAgaWYgKG5hbWUgPT09ICdvbmVycm9yJykgewog ICAgICAgIC8vIGhhbmRsZSBmb3IgbGVnYWN5IHVzZXJzIHRoYXQgZXhwZWN0 IHRoZSBhY3R1YWwKICAgICAgICAvLyBlcnJvciB0byBiZSBwYXNzZWQgdG8g dGhlaXIgZnVuY3Rpb24gYWRkZWQgdmlhCiAgICAgICAgLy8gYFJTVlAuY29u ZmlndXJlKCdvbmVycm9yJywgc29tZUZ1bmN0aW9uSGVyZSk7YAogICAgICAg IGNvbmZpZy5vbignZXJyb3InLCB2YWx1ZSk7CiAgICAgICAgcmV0dXJuOwog ICAgICB9CgogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgewog ICAgICAgIGNvbmZpZ1tuYW1lXSA9IHZhbHVlOwogICAgICB9IGVsc2Ugewog ICAgICAgIHJldHVybiBjb25maWdbbmFtZV07CiAgICAgIH0KICAgIH0KCiAg ICBfX2V4cG9ydHNfXy5jb25maWcgPSBjb25maWc7CiAgICBfX2V4cG9ydHNf Xy5jb25maWd1cmUgPSBjb25maWd1cmU7CiAgfSk7CmRlZmluZSgicnN2cC9k ZWZlciIsIAogIFsiLi9wcm9taXNlIiwiZXhwb3J0cyJdLAogIGZ1bmN0aW9u KF9fZGVwZW5kZW5jeTFfXywgX19leHBvcnRzX18pIHsKICAgICJ1c2Ugc3Ry aWN0IjsKICAgIHZhciBQcm9taXNlID0gX19kZXBlbmRlbmN5MV9fWyJkZWZh dWx0Il07CgogICAgLyoqCiAgICAgIGBSU1ZQLmRlZmVyYCByZXR1cm5zIGFu IG9iamVjdCBzaW1pbGFyIHRvIGpRdWVyeSdzIGAkLkRlZmVycmVkYC4KICAg ICAgYFJTVlAuZGVmZXJgIHNob3VsZCBiZSB1c2VkIHdoZW4gcG9ydGluZyBv dmVyIGNvZGUgcmVsaWFudCBvbiBgJC5EZWZlcnJlZGAncwogICAgICBpbnRl cmZhY2UuIE5ldyBjb2RlIHNob3VsZCB1c2UgdGhlIGBSU1ZQLlByb21pc2Vg IGNvbnN0cnVjdG9yIGluc3RlYWQuCgogICAgICBUaGUgb2JqZWN0IHJldHVy bmVkIGZyb20gYFJTVlAuZGVmZXJgIGlzIGEgcGxhaW4gb2JqZWN0IHdpdGgg dGhyZWUgcHJvcGVydGllczoKCiAgICAgICogcHJvbWlzZSAtIGFuIGBSU1ZQ LlByb21pc2VgLgogICAgICAqIHJlamVjdCAtIGEgZnVuY3Rpb24gdGhhdCBj YXVzZXMgdGhlIGBwcm9taXNlYCBwcm9wZXJ0eSBvbiB0aGlzIG9iamVjdCB0 bwogICAgICAgIGJlY29tZSByZWplY3RlZAogICAgICAqIHJlc29sdmUgLSBh IGZ1bmN0aW9uIHRoYXQgY2F1c2VzIHRoZSBgcHJvbWlzZWAgcHJvcGVydHkg b24gdGhpcyBvYmplY3QgdG8KICAgICAgICBiZWNvbWUgZnVsZmlsbGVkLgoK ICAgICAgRXhhbXBsZToKCiAgICAgICBgYGBqYXZhc2NyaXB0CiAgICAgICB2 YXIgZGVmZXJyZWQgPSBSU1ZQLmRlZmVyKCk7CgogICAgICAgZGVmZXJyZWQu cmVzb2x2ZSgiU3VjY2VzcyEiKTsKCiAgICAgICBkZWZlcmVkLnByb21pc2Uu dGhlbihmdW5jdGlvbih2YWx1ZSl7CiAgICAgICAgIC8vIHZhbHVlIGhlcmUg aXMgIlN1Y2Nlc3MhIgogICAgICAgfSk7CiAgICAgICBgYGAKCiAgICAgIEBt ZXRob2QgZGVmZXIKICAgICAgQGZvciBSU1ZQCiAgICAgIEBwYXJhbSB7U3Ry aW5nfSBsYWJlbCBvcHRpb25hbCBzdHJpbmcgZm9yIGxhYmVsaW5nIHRoZSBw cm9taXNlLgogICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuCiAgICAgIEByZXR1 cm4ge09iamVjdH0KICAgICAqLwoKICAgIF9fZXhwb3J0c19fWyJkZWZhdWx0 Il0gPSBmdW5jdGlvbiBkZWZlcihsYWJlbCkgewogICAgICB2YXIgZGVmZXJy ZWQgPSB7IH07CgogICAgICBkZWZlcnJlZC5wcm9taXNlID0gbmV3IFByb21p c2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgZGVmZXJy ZWQucmVzb2x2ZSA9IHJlc29sdmU7CiAgICAgICAgZGVmZXJyZWQucmVqZWN0 ID0gcmVqZWN0OwogICAgICB9LCBsYWJlbCk7CgogICAgICByZXR1cm4gZGVm ZXJyZWQ7CiAgICB9OwogIH0pOwpkZWZpbmUoInJzdnAvZXZlbnRzIiwgCiAg WyJleHBvcnRzIl0sCiAgZnVuY3Rpb24oX19leHBvcnRzX18pIHsKICAgICJ1 c2Ugc3RyaWN0IjsKICAgIHZhciBpbmRleE9mID0gZnVuY3Rpb24oY2FsbGJh Y2tzLCBjYWxsYmFjaykgewogICAgICBmb3IgKHZhciBpPTAsIGw9Y2FsbGJh Y2tzLmxlbmd0aDsgaTxsOyBpKyspIHsKICAgICAgICBpZiAoY2FsbGJhY2tz W2ldID09PSBjYWxsYmFjaykgeyByZXR1cm4gaTsgfQogICAgICB9CgogICAg ICByZXR1cm4gLTE7CiAgICB9OwoKICAgIHZhciBjYWxsYmFja3NGb3IgPSBm dW5jdGlvbihvYmplY3QpIHsKICAgICAgdmFyIGNhbGxiYWNrcyA9IG9iamVj dC5fcHJvbWlzZUNhbGxiYWNrczsKCiAgICAgIGlmICghY2FsbGJhY2tzKSB7 CiAgICAgICAgY2FsbGJhY2tzID0gb2JqZWN0Ll9wcm9taXNlQ2FsbGJhY2tz ID0ge307CiAgICAgIH0KCiAgICAgIHJldHVybiBjYWxsYmFja3M7CiAgICB9 OwoKICAgIC8qKgogICAgICBAY2xhc3MgUlNWUC5FdmVudFRhcmdldAogICAg Ki8KICAgIF9fZXhwb3J0c19fWyJkZWZhdWx0Il0gPSB7CgogICAgICAvKioK ICAgICAgICBgUlNWUC5FdmVudFRhcmdldC5taXhpbmAgZXh0ZW5kcyBhbiBv YmplY3Qgd2l0aCBFdmVudFRhcmdldCBtZXRob2RzLiBGb3IKICAgICAgICBF eGFtcGxlOgoKICAgICAgICBgYGBqYXZhc2NyaXB0CiAgICAgICAgdmFyIG9i amVjdCA9IHt9OwoKICAgICAgICBSU1ZQLkV2ZW50VGFyZ2V0Lm1peGluKG9i amVjdCk7CgogICAgICAgIG9iamVjdC5vbigiZmluaXNoZWQiLCBmdW5jdGlv bihldmVudCkgewogICAgICAgICAgLy8gaGFuZGxlIGV2ZW50CiAgICAgICAg fSk7CgogICAgICAgIG9iamVjdC50cmlnZ2VyKCJmaW5pc2hlZCIsIHsgZGV0 YWlsOiB2YWx1ZSB9KTsKICAgICAgICBgYGAKCiAgICAgICAgYEV2ZW50VGFy Z2V0Lm1peGluYCBhbHNvIHdvcmtzIHdpdGggcHJvdG90eXBlczoKCiAgICAg ICAgYGBgamF2YXNjcmlwdAogICAgICAgIHZhciBQZXJzb24gPSBmdW5jdGlv bigpIHt9OwogICAgICAgIFJTVlAuRXZlbnRUYXJnZXQubWl4aW4oUGVyc29u LnByb3RvdHlwZSk7CgogICAgICAgIHZhciB5ZWh1ZGEgPSBuZXcgUGVyc29u KCk7CiAgICAgICAgdmFyIHRvbSA9IG5ldyBQZXJzb24oKTsKCiAgICAgICAg eWVodWRhLm9uKCJwb2tlIiwgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAg IGNvbnNvbGUubG9nKCJZZWh1ZGEgc2F5cyBPVyIpOwogICAgICAgIH0pOwoK ICAgICAgICB0b20ub24oInBva2UiLCBmdW5jdGlvbihldmVudCkgewogICAg ICAgICAgY29uc29sZS5sb2coIlRvbSBzYXlzIE9XIik7CiAgICAgICAgfSk7 CgogICAgICAgIHllaHVkYS50cmlnZ2VyKCJwb2tlIik7CiAgICAgICAgdG9t LnRyaWdnZXIoInBva2UiKTsKICAgICAgICBgYGAKCiAgICAgICAgQG1ldGhv ZCBtaXhpbgogICAgICAgIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb2JqZWN0 IHRvIGV4dGVuZCB3aXRoIEV2ZW50VGFyZ2V0IG1ldGhvZHMKICAgICAgICBA cHJpdmF0ZQogICAgICAqLwogICAgICBtaXhpbjogZnVuY3Rpb24ob2JqZWN0 KSB7CiAgICAgICAgb2JqZWN0Lm9uID0gdGhpcy5vbjsKICAgICAgICBvYmpl Y3Qub2ZmID0gdGhpcy5vZmY7CiAgICAgICAgb2JqZWN0LnRyaWdnZXIgPSB0 aGlzLnRyaWdnZXI7CiAgICAgICAgb2JqZWN0Ll9wcm9taXNlQ2FsbGJhY2tz ID0gdW5kZWZpbmVkOwogICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgIH0s CgogICAgICAvKioKICAgICAgICBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBi ZSBleGVjdXRlZCB3aGVuIGBldmVudE5hbWVgIGlzIHRyaWdnZXJlZAoKICAg ICAgICBgYGBqYXZhc2NyaXB0CiAgICAgICAgb2JqZWN0Lm9uKCdldmVudCcs IGZ1bmN0aW9uKGV2ZW50SW5mbyl7CiAgICAgICAgICAvLyBoYW5kbGUgdGhl IGV2ZW50CiAgICAgICAgfSk7CgogICAgICAgIG9iamVjdC50cmlnZ2VyKCdl dmVudCcpOwogICAgICAgIGBgYAoKICAgICAgICBAbWV0aG9kIG9uCiAgICAg ICAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZSBuYW1lIG9mIHRoZSBldmVu dCB0byBsaXN0ZW4gZm9yCiAgICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gY2Fs bGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlz IHRyaWdnZXJlZC4KICAgICAgICBAcHJpdmF0ZQogICAgICAqLwogICAgICBv bjogZnVuY3Rpb24oZXZlbnROYW1lLCBjYWxsYmFjaykgewogICAgICAgIHZh ciBhbGxDYWxsYmFja3MgPSBjYWxsYmFja3NGb3IodGhpcyksIGNhbGxiYWNr czsKCiAgICAgICAgY2FsbGJhY2tzID0gYWxsQ2FsbGJhY2tzW2V2ZW50TmFt ZV07CgogICAgICAgIGlmICghY2FsbGJhY2tzKSB7CiAgICAgICAgICBjYWxs YmFja3MgPSBhbGxDYWxsYmFja3NbZXZlbnROYW1lXSA9IFtdOwogICAgICAg IH0KCiAgICAgICAgaWYgKGluZGV4T2YoY2FsbGJhY2tzLCBjYWxsYmFjaykg PT09IC0xKSB7CiAgICAgICAgICBjYWxsYmFja3MucHVzaChjYWxsYmFjayk7 CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAgWW91IGNh biB1c2UgYG9mZmAgdG8gc3RvcCBmaXJpbmcgYSBwYXJ0aWN1bGFyIGNhbGxi YWNrIGZvciBhbiBldmVudDoKCiAgICAgICAgYGBgamF2YXNjcmlwdAogICAg ICAgIGZ1bmN0aW9uIGRvU3R1ZmYoKSB7IC8vIGRvIHN0dWZmISB9CiAgICAg ICAgb2JqZWN0Lm9uKCdzdHVmZicsIGRvU3R1ZmYpOwoKICAgICAgICBvYmpl Y3QudHJpZ2dlcignc3R1ZmYnKTsgLy8gZG9TdHVmZiB3aWxsIGJlIGNhbGxl ZAoKICAgICAgICAvLyBVbnJlZ2lzdGVyIE9OTFkgdGhlIGRvU3R1ZmYgY2Fs bGJhY2sKICAgICAgICBvYmplY3Qub2ZmKCdzdHVmZicsIGRvU3R1ZmYpOwog ICAgICAgIG9iamVjdC50cmlnZ2VyKCdzdHVmZicpOyAvLyBkb1N0dWZmIHdp bGwgTk9UIGJlIGNhbGxlZAogICAgICAgIGBgYAoKICAgICAgICBJZiB5b3Ug ZG9uJ3QgcGFzcyBhIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYG9mZmAsIEFM TCBjYWxsYmFja3MgZm9yIHRoZQogICAgICAgIGV2ZW50IHdpbGwgbm90IGJl IGV4ZWN1dGVkIHdoZW4gdGhlIGV2ZW50IGZpcmVzLiBGb3IgZXhhbXBsZToK CiAgICAgICAgYGBgamF2YXNjcmlwdAogICAgICAgIHZhciBjYWxsYmFjazEg PSBmdW5jdGlvbigpe307CiAgICAgICAgdmFyIGNhbGxiYWNrMiA9IGZ1bmN0 aW9uKCl7fTsKCiAgICAgICAgb2JqZWN0Lm9uKCdzdHVmZicsIGNhbGxiYWNr MSk7CiAgICAgICAgb2JqZWN0Lm9uKCdzdHVmZicsIGNhbGxiYWNrMik7Cgog ICAgICAgIG9iamVjdC50cmlnZ2VyKCdzdHVmZicpOyAvLyBjYWxsYmFjazEg YW5kIGNhbGxiYWNrMiB3aWxsIGJlIGV4ZWN1dGVkLgoKICAgICAgICBvYmpl Y3Qub2ZmKCdzdHVmZicpOwogICAgICAgIG9iamVjdC50cmlnZ2VyKCdzdHVm ZicpOyAvLyBjYWxsYmFjazEgYW5kIGNhbGxiYWNrMiB3aWxsIG5vdCBiZSBl eGVjdXRlZCEKICAgICAgICBgYGAKCiAgICAgICAgQG1ldGhvZCBvZmYKICAg ICAgICBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lIGV2ZW50IHRvIHN0b3Ag bGlzdGVuaW5nIHRvCiAgICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJh Y2sgb3B0aW9uYWwgYXJndW1lbnQuIElmIGdpdmVuLCBvbmx5IHRoZSBmdW5j dGlvbgogICAgICAgIGdpdmVuIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBl dmVudCdzIGNhbGxiYWNrIHF1ZXVlLiBJZiBubyBgY2FsbGJhY2tgCiAgICAg ICAgYXJndW1lbnQgaXMgZ2l2ZW4sIGFsbCBjYWxsYmFja3Mgd2lsbCBiZSBy ZW1vdmVkIGZyb20gdGhlIGV2ZW50J3MgY2FsbGJhY2sKICAgICAgICBxdWV1 ZS4KICAgICAgICBAcHJpdmF0ZQoKICAgICAgKi8KICAgICAgb2ZmOiBmdW5j dGlvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7CiAgICAgICAgdmFyIGFsbENh bGxiYWNrcyA9IGNhbGxiYWNrc0Zvcih0aGlzKSwgY2FsbGJhY2tzLCBpbmRl eDsKCiAgICAgICAgaWYgKCFjYWxsYmFjaykgewogICAgICAgICAgYWxsQ2Fs bGJhY2tzW2V2ZW50TmFtZV0gPSBbXTsKICAgICAgICAgIHJldHVybjsKICAg ICAgICB9CgogICAgICAgIGNhbGxiYWNrcyA9IGFsbENhbGxiYWNrc1tldmVu dE5hbWVdOwoKICAgICAgICBpbmRleCA9IGluZGV4T2YoY2FsbGJhY2tzLCBj YWxsYmFjayk7CgogICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHsgY2FsbGJh Y2tzLnNwbGljZShpbmRleCwgMSk7IH0KICAgICAgfSwKCiAgICAgIC8qKgog ICAgICAgIFVzZSBgdHJpZ2dlcmAgdG8gZmlyZSBjdXN0b20gZXZlbnRzLiBG b3IgZXhhbXBsZToKCiAgICAgICAgYGBgamF2YXNjcmlwdAogICAgICAgIG9i amVjdC5vbignZm9vJywgZnVuY3Rpb24oKXsKICAgICAgICAgIGNvbnNvbGUu bG9nKCdmb28gZXZlbnQgaGFwcGVuZWQhJyk7CiAgICAgICAgfSk7CiAgICAg ICAgb2JqZWN0LnRyaWdnZXIoJ2ZvbycpOwogICAgICAgIC8vICdmb28gZXZl bnQgaGFwcGVuZWQhJyBsb2dnZWQgdG8gdGhlIGNvbnNvbGUKICAgICAgICBg YGAKCiAgICAgICAgWW91IGNhbiBhbHNvIHBhc3MgYSB2YWx1ZSBhcyBhIHNl Y29uZCBhcmd1bWVudCB0byBgdHJpZ2dlcmAgdGhhdCB3aWxsIGJlCiAgICAg ICAgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIGFsbCBldmVudCBsaXN0ZW5l cnMgZm9yIHRoZSBldmVudDoKCiAgICAgICAgYGBgamF2YXNjcmlwdAogICAg ICAgIG9iamVjdC5vbignZm9vJywgZnVuY3Rpb24odmFsdWUpewogICAgICAg ICAgY29uc29sZS5sb2codmFsdWUubmFtZSk7CiAgICAgICAgfSk7CgogICAg ICAgIG9iamVjdC50cmlnZ2VyKCdmb28nLCB7IG5hbWU6ICdiYXInIH0pOwog ICAgICAgIC8vICdiYXInIGxvZ2dlZCB0byB0aGUgY29uc29sZQogICAgICAg IGBgYAoKICAgICAgICBAbWV0aG9kIHRyaWdnZXIKICAgICAgICBAcGFyYW0g e1N0cmluZ30gZXZlbnROYW1lIG5hbWUgb2YgdGhlIGV2ZW50IHRvIGJlIHRy aWdnZXJlZAogICAgICAgIEBwYXJhbSB7QW55fSBvcHRpb25zIG9wdGlvbmFs IHZhbHVlIHRvIGJlIHBhc3NlZCB0byBhbnkgZXZlbnQgaGFuZGxlcnMgZm9y CiAgICAgICAgdGhlIGdpdmVuIGBldmVudE5hbWVgCiAgICAgICAgQHByaXZh dGUKICAgICAgKi8KICAgICAgdHJpZ2dlcjogZnVuY3Rpb24oZXZlbnROYW1l LCBvcHRpb25zKSB7CiAgICAgICAgdmFyIGFsbENhbGxiYWNrcyA9IGNhbGxi YWNrc0Zvcih0aGlzKSwKICAgICAgICAgICAgY2FsbGJhY2tzLCBjYWxsYmFj a1R1cGxlLCBjYWxsYmFjaywgYmluZGluZzsKCiAgICAgICAgaWYgKGNhbGxi YWNrcyA9IGFsbENhbGxiYWNrc1tldmVudE5hbWVdKSB7CiAgICAgICAgICAv LyBEb24ndCBjYWNoZSB0aGUgY2FsbGJhY2tzLmxlbmd0aCBzaW5jZSBpdCBt YXkgZ3JvdwogICAgICAgICAgZm9yICh2YXIgaT0wOyBpPGNhbGxiYWNrcy5s ZW5ndGg7IGkrKykgewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNr c1tpXTsKCiAgICAgICAgICAgIGNhbGxiYWNrKG9wdGlvbnMpOwogICAgICAg ICAgfQogICAgICAgIH0KICAgICAgfQogICAgfTsKICB9KTsKZGVmaW5lKCJy c3ZwL2ZpbHRlciIsIAogIFsiLi9hbGwiLCIuL21hcCIsIi4vdXRpbHMiLCJl eHBvcnRzIl0sCiAgZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2RlcGVu ZGVuY3kyX18sIF9fZGVwZW5kZW5jeTNfXywgX19leHBvcnRzX18pIHsKICAg ICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBhbGwgPSBfX2RlcGVuZGVuY3kxX19b ImRlZmF1bHQiXTsKICAgIHZhciBtYXAgPSBfX2RlcGVuZGVuY3kyX19bImRl ZmF1bHQiXTsKICAgIHZhciBpc0Z1bmN0aW9uID0gX19kZXBlbmRlbmN5M19f LmlzRnVuY3Rpb247CiAgICB2YXIgaXNBcnJheSA9IF9fZGVwZW5kZW5jeTNf Xy5pc0FycmF5OwoKICAgIC8qKgogICAgIGBSU1ZQLmZpbHRlcmAgaXMgc2lt aWxhciB0byBKYXZhU2NyaXB0J3MgbmF0aXZlIGBmaWx0ZXJgIG1ldGhvZCwg ZXhjZXB0IHRoYXQgaXQKICAgICAgd2FpdHMgZm9yIGFsbCBwcm9taXNlcyB0 byBiZWNvbWUgZnVsZmlsbGVkIGJlZm9yZSBydW5uaW5nIHRoZSBgZmlsdGVy Rm5gIG9uCiAgICAgIGVhY2ggaXRlbSBpbiBnaXZlbiB0byBgcHJvbWlzZXNg LiBgUlNWUC5maWx0ZXJgIHJldHVybnMgYSBwcm9taXNlIHRoYXQgd2lsbAog ICAgICBiZWNvbWUgZnVsZmlsbGVkIHdpdGggdGhlIHJlc3VsdCBvZiBydW5u aW5nIGBmaWx0ZXJGbmAgb24gdGhlIHZhbHVlcyB0aGUKICAgICAgcHJvbWlz ZXMgYmVjb21lIGZ1bGZpbGxlZCB3aXRoLgoKICAgICAgRm9yIGV4YW1wbGU6 CgogICAgICBgYGBqYXZhc2NyaXB0CgogICAgICB2YXIgcHJvbWlzZTEgPSBS U1ZQLnJlc29sdmUoMSk7CiAgICAgIHZhciBwcm9taXNlMiA9IFJTVlAucmVz b2x2ZSgyKTsKICAgICAgdmFyIHByb21pc2UzID0gUlNWUC5yZXNvbHZlKDMp OwoKICAgICAgdmFyIGZpbHRlckZuID0gZnVuY3Rpb24oaXRlbSl7CiAgICAg ICAgcmV0dXJuIGl0ZW0gPiAxOwogICAgICB9OwoKICAgICAgUlNWUC5maWx0 ZXIocHJvbWlzZXMsIGZpbHRlckZuKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCl7 CiAgICAgICAgLy8gcmVzdWx0IGlzIFsgMiwgMyBdCiAgICAgIH0pOwogICAg ICBgYGAKCiAgICAgIElmIGFueSBvZiB0aGUgYHByb21pc2VzYCBnaXZlbiB0 byBgUlNWUC5maWx0ZXJgIGFyZSByZWplY3RlZCwgdGhlIGZpcnN0IHByb21p c2UKICAgICAgdGhhdCBpcyByZWplY3RlZCB3aWxsIGJlIGdpdmVuIGFzIGFu IGFyZ3VtZW50IHRvIHRoZSByZXR1cm5lZCBwcm9taXNlJ3MKICAgICAgcmVq ZWN0aW9uIGhhbmRsZXIuIEZvciBleGFtcGxlOgoKICAgICAgYGBgamF2YXNj cmlwdAogICAgICB2YXIgcHJvbWlzZTEgPSBSU1ZQLnJlc29sdmUoMSk7CiAg ICAgIHZhciBwcm9taXNlMiA9IFJTVlAucmVqZWN0KG5ldyBFcnJvcigiMiIp KTsKICAgICAgdmFyIHByb21pc2UzID0gUlNWUC5yZWplY3QobmV3IEVycm9y KCIzIikpOwogICAgICB2YXIgcHJvbWlzZXMgPSBbIHByb21pc2UxLCBwcm9t aXNlMiwgcHJvbWlzZTMgXTsKCiAgICAgIHZhciBmaWx0ZXJGbiA9IGZ1bmN0 aW9uKGl0ZW0pewogICAgICAgIHJldHVybiBpdGVtID4gMTsKICAgICAgfTsK CiAgICAgIFJTVlAuZmlsdGVyKHByb21pc2VzLCBmaWx0ZXJGbikudGhlbihm dW5jdGlvbihhcnJheSl7CiAgICAgICAgLy8gQ29kZSBoZXJlIG5ldmVyIHJ1 bnMgYmVjYXVzZSB0aGVyZSBhcmUgcmVqZWN0ZWQgcHJvbWlzZXMhCiAgICAg IH0sIGZ1bmN0aW9uKHJlYXNvbikgewogICAgICAgIC8vIHJlYXNvbi5tZXNz YWdlID09PSAiMiIKICAgICAgfSk7CiAgICAgIGBgYAoKICAgICAgYFJTVlAu ZmlsdGVyYCB3aWxsIGFsc28gd2FpdCBmb3IgYW55IHByb21pc2VzIHJldHVy bmVkIGZyb20gYGZpbHRlckZuYC4KICAgICAgRm9yIGluc3RhbmNlLCB5b3Ug bWF5IHdhbnQgdG8gZmV0Y2ggYSBsaXN0IG9mIHVzZXJzIHRoZW4gcmV0dXJu IGEgc3Vic2V0CiAgICAgIG9mIHRob3NlIHVzZXJzIGJhc2VkIG9uIHNvbWUg YXN5bmNocm9ub3VzIG9wZXJhdGlvbjoKCiAgICAgIGBgYGphdmFzY3JpcHQK CiAgICAgIHZhciBhbGljZSA9IHsgbmFtZTogJ2FsaWNlJyB9OwogICAgICB2 YXIgYm9iICAgPSB7IG5hbWU6ICdib2InIH07CiAgICAgIHZhciB1c2VycyA9 IFsgYWxpY2UsIGJvYiBdOwoKICAgICAgdmFyIHByb21pc2VzID0gdXNlcnMu bWFwKGZ1bmN0aW9uKHVzZXIpewogICAgICAgIHJldHVybiBSU1ZQLnJlc29s dmUodXNlcik7CiAgICAgIH0pOwoKICAgICAgdmFyIGZpbHRlckZuID0gZnVu Y3Rpb24odXNlcil7CiAgICAgICAgLy8gSGVyZSwgQWxpY2UgaGFzIHBlcm1p c3Npb25zIHRvIGNyZWF0ZSBhIGJsb2cgcG9zdCwgYnV0IEJvYiBkb2VzIG5v dC4KICAgICAgICByZXR1cm4gZ2V0UHJpdmlsZWdlc0ZvclVzZXIodXNlciku dGhlbihmdW5jdGlvbihwcml2cyl7CiAgICAgICAgICByZXR1cm4gcHJpdnMu Y2FuX2NyZWF0ZV9ibG9nX3Bvc3QgPT09IHRydWU7CiAgICAgICAgfSk7CiAg ICAgIH07CiAgICAgIFJTVlAuZmlsdGVyKHByb21pc2VzLCBmaWx0ZXJGbiku dGhlbihmdW5jdGlvbih1c2Vycyl7CiAgICAgICAgLy8gdHJ1ZSwgYmVjYXVz ZSB0aGUgc2VydmVyIHRvbGQgdXMgb25seSBBbGljZSBjYW4gY3JlYXRlIGEg YmxvZyBwb3N0LgogICAgICAgIHVzZXJzLmxlbmd0aCA9PT0gMTsKICAgICAg ICAvLyBmYWxzZSwgYmVjYXVzZSBBbGljZSBpcyB0aGUgb25seSB1c2VyIHBy ZXNlbnQgaW4gYHVzZXJzYAogICAgICAgIHVzZXJzWzBdID09PSBib2I7CiAg ICAgIH0pOwogICAgICBgYGAKCiAgICAgIEBtZXRob2QgZmlsdGVyCiAgICAg IEBmb3IgUlNWUAogICAgICBAcGFyYW0ge0FycmF5fSBwcm9taXNlcwogICAg ICBAcGFyYW0ge0Z1bmN0aW9ufSBmaWx0ZXJGbiAtIGZ1bmN0aW9uIHRvIGJl IGNhbGxlZCBvbiBlYWNoIHJlc29sdmVkIHZhbHVlIHRvCiAgICAgIGZpbHRl ciB0aGUgZmluYWwgcmVzdWx0cy4KICAgICAgQHBhcmFtIHtTdHJpbmd9IGxh YmVsIG9wdGlvbmFsIHN0cmluZyBkZXNjcmliaW5nIHRoZSBwcm9taXNlLiBV c2VmdWwgZm9yCiAgICAgIHRvb2xpbmcuCiAgICAgIEByZXR1cm4ge1Byb21p c2V9CiAgICAqLwogICAgZnVuY3Rpb24gZmlsdGVyKHByb21pc2VzLCBmaWx0 ZXJGbiwgbGFiZWwpIHsKICAgICAgcmV0dXJuIGFsbChwcm9taXNlcywgbGFi ZWwpLnRoZW4oZnVuY3Rpb24odmFsdWVzKXsKICAgICAgICBpZiAoIWlzQXJy YXkocHJvbWlzZXMpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9y KCdZb3UgbXVzdCBwYXNzIGFuIGFycmF5IHRvIGZpbHRlci4nKTsKICAgICAg ICB9CgogICAgICAgIGlmICghaXNGdW5jdGlvbihmaWx0ZXJGbikpewogICAg ICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiWW91IG11c3QgcGFzcyBhIGZ1 bmN0aW9uIHRvIGZpbHRlcidzIHNlY29uZCBhcmd1bWVudC4iKTsKICAgICAg ICB9CgogICAgICAgIHJldHVybiBtYXAocHJvbWlzZXMsIGZpbHRlckZuLCBs YWJlbCkudGhlbihmdW5jdGlvbihmaWx0ZXJSZXN1bHRzKXsKICAgICAgICAg ICB2YXIgaSwKICAgICAgICAgICAgICAgdmFsdWVzTGVuID0gdmFsdWVzLmxl bmd0aCwKICAgICAgICAgICAgICAgZmlsdGVyZWQgPSBbXTsKCiAgICAgICAg ICAgZm9yIChpID0gMDsgaSA8IHZhbHVlc0xlbjsgaSsrKXsKICAgICAgICAg ICAgIGlmKGZpbHRlclJlc3VsdHNbaV0pIGZpbHRlcmVkLnB1c2godmFsdWVz W2ldKTsKICAgICAgICAgICB9CiAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVk OwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KCiAgICBfX2V4cG9ydHNf X1siZGVmYXVsdCJdID0gZmlsdGVyOwogIH0pOwpkZWZpbmUoInJzdnAvaGFz aCIsIAogIFsiLi9wcm9taXNlIiwiLi91dGlscyIsImV4cG9ydHMiXSwKICBm dW5jdGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZGVwZW5kZW5jeTJfXywgX19l eHBvcnRzX18pIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBQcm9taXNl ID0gX19kZXBlbmRlbmN5MV9fWyJkZWZhdWx0Il07CiAgICB2YXIgaXNOb25U aGVuYWJsZSA9IF9fZGVwZW5kZW5jeTJfXy5pc05vblRoZW5hYmxlOwogICAg dmFyIGtleXNPZiA9IF9fZGVwZW5kZW5jeTJfXy5rZXlzT2Y7CgogICAgLyoq CiAgICAgIGBSU1ZQLmhhc2hgIGlzIHNpbWlsYXIgdG8gYFJTVlAuYWxsYCwg YnV0IHRha2VzIGFuIG9iamVjdCBpbnN0ZWFkIG9mIGFuIGFycmF5CiAgICAg IGZvciBpdHMgYHByb21pc2VzYCBhcmd1bWVudC4KCiAgICAgIFJldHVybnMg YSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gYWxsIHRoZSBnaXZl biBwcm9taXNlcyBoYXZlIGJlZW4KICAgICAgZnVsZmlsbGVkLCBvciByZWpl Y3RlZCBpZiBhbnkgb2YgdGhlbSBiZWNvbWUgcmVqZWN0ZWQuIFRoZSByZXR1 cm5lZCBwcm9taXNlCiAgICAgIGlzIGZ1bGZpbGxlZCB3aXRoIGEgaGFzaCB0 aGF0IGhhcyB0aGUgc2FtZSBrZXkgbmFtZXMgYXMgdGhlIGBwcm9taXNlc2Ag b2JqZWN0CiAgICAgIGFyZ3VtZW50LiBJZiBhbnkgb2YgdGhlIHZhbHVlcyBp biB0aGUgb2JqZWN0IGFyZSBub3QgcHJvbWlzZXMsIHRoZXkgd2lsbAogICAg ICBzaW1wbHkgYmUgY29waWVkIG92ZXIgdG8gdGhlIGZ1bGZpbGxlZCBvYmpl Y3QuCgogICAgICBFeGFtcGxlOgoKICAgICAgYGBgamF2YXNjcmlwdAogICAg ICB2YXIgcHJvbWlzZXMgPSB7CiAgICAgICAgbXlQcm9taXNlOiBSU1ZQLnJl c29sdmUoMSksCiAgICAgICAgeW91clByb21pc2U6IFJTVlAucmVzb2x2ZSgy KSwKICAgICAgICB0aGVpclByb21pc2U6IFJTVlAucmVzb2x2ZSgzKSwKICAg ICAgICBub3RBUHJvbWlzZTogNAogICAgICB9OwoKICAgICAgUlNWUC5oYXNo KHByb21pc2VzKS50aGVuKGZ1bmN0aW9uKGhhc2gpewogICAgICAgIC8vIGhh c2ggaGVyZSBpcyBhbiBvYmplY3QgdGhhdCBsb29rcyBsaWtlOgogICAgICAg IC8vIHsKICAgICAgICAvLyAgIG15UHJvbWlzZTogMSwKICAgICAgICAvLyAg IHlvdXJQcm9taXNlOiAyLAogICAgICAgIC8vICAgdGhlaXJQcm9taXNlOiAz LAogICAgICAgIC8vICAgbm90QVByb21pc2U6IDQKICAgICAgICAvLyB9CiAg ICAgIH0pOwogICAgICBgYGBgCgogICAgICBJZiBhbnkgb2YgdGhlIGBwcm9t aXNlc2AgZ2l2ZW4gdG8gYFJTVlAuaGFzaGAgYXJlIHJlamVjdGVkLCB0aGUg Zmlyc3QgcHJvbWlzZQogICAgICB0aGF0IGlzIHJlamVjdGVkIHdpbGwgYmUg Z2l2ZW4gYXMgdGhlIHJlYXNvbiB0byB0aGUgcmVqZWN0aW9uIGhhbmRsZXIu CgogICAgICBFeGFtcGxlOgoKICAgICAgYGBgamF2YXNjcmlwdAogICAgICB2 YXIgcHJvbWlzZXMgPSB7CiAgICAgICAgbXlQcm9taXNlOiBSU1ZQLnJlc29s dmUoMSksCiAgICAgICAgcmVqZWN0ZWRQcm9taXNlOiBSU1ZQLnJlamVjdChu ZXcgRXJyb3IoInJlamVjdGVkUHJvbWlzZSIpKSwKICAgICAgICBhbm90aGVy UmVqZWN0ZWRQcm9taXNlOiBSU1ZQLnJlamVjdChuZXcgRXJyb3IoImFub3Ro ZXJSZWplY3RlZFByb21pc2UiKSksCiAgICAgIH07CgogICAgICBSU1ZQLmhh c2gocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24oaGFzaCl7CiAgICAgICAgLy8g Q29kZSBoZXJlIG5ldmVyIHJ1bnMgYmVjYXVzZSB0aGVyZSBhcmUgcmVqZWN0 ZWQgcHJvbWlzZXMhCiAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikgewogICAg ICAgIC8vIHJlYXNvbi5tZXNzYWdlID09PSAicmVqZWN0ZWRQcm9taXNlIgog ICAgICB9KTsKICAgICAgYGBgCgogICAgICBBbiBpbXBvcnRhbnQgbm90ZTog YFJTVlAuaGFzaGAgaXMgaW50ZW5kZWQgZm9yIHBsYWluIEphdmFTY3JpcHQg b2JqZWN0cyB0aGF0CiAgICAgIGFyZSBqdXN0IGEgc2V0IG9mIGtleXMgYW5k IHZhbHVlcy4gYFJTVlAuaGFzaGAgd2lsbCBOT1QgcHJlc2VydmUgcHJvdG90 eXBlCiAgICAgIGNoYWlucy4KCiAgICAgIEV4YW1wbGU6CgogICAgICBgYGBq YXZhc2NyaXB0CiAgICAgIGZ1bmN0aW9uIE15Q29uc3RydWN0b3IoKXsKICAg ICAgICB0aGlzLmV4YW1wbGUgPSBSU1ZQLnJlc29sdmUoIkV4YW1wbGUiKTsK ICAgICAgfQoKICAgICAgTXlDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSB7CiAg ICAgICAgcHJvdG9Qcm9wZXJ0eTogUlNWUC5yZXNvbHZlKCJQcm90byBQcm9w ZXJ0eSIpCiAgICAgIH07CgogICAgICB2YXIgbXlPYmplY3QgPSBuZXcgTXlD b25zdHJ1Y3RvcigpOwoKICAgICAgUlNWUC5oYXNoKG15T2JqZWN0KS50aGVu KGZ1bmN0aW9uKGhhc2gpewogICAgICAgIC8vIHByb3RvUHJvcGVydHkgd2ls bCBub3QgYmUgcHJlc2VudCwgaW5zdGVhZCB5b3Ugd2lsbCBqdXN0IGhhdmUg YW4KICAgICAgICAvLyBvYmplY3QgdGhhdCBsb29rcyBsaWtlOgogICAgICAg IC8vIHsKICAgICAgICAvLyAgIGV4YW1wbGU6ICJFeGFtcGxlIgogICAgICAg IC8vIH0KICAgICAgICAvLwogICAgICAgIC8vIGhhc2guaGFzT3duUHJvcGVy dHkoJ3Byb3RvUHJvcGVydHknKTsgLy8gZmFsc2UKICAgICAgICAvLyAndW5k ZWZpbmVkJyA9PT0gdHlwZW9mIGhhc2gucHJvdG9Qcm9wZXJ0eQogICAgICB9 KTsKICAgICAgYGBgCgogICAgICBAbWV0aG9kIGhhc2gKICAgICAgQGZvciBS U1ZQCiAgICAgIEBwYXJhbSB7T2JqZWN0fSBwcm9taXNlcwogICAgICBAcGFy YW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIHRoYXQgZGVzY3Jp YmVzIHRoZSBwcm9taXNlLgogICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuCiAg ICAgIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UgdGhhdCBpcyBmdWxmaWxs ZWQgd2hlbiBhbGwgcHJvcGVydGllcyBvZiBgcHJvbWlzZXNgCiAgICAgIGhh dmUgYmVlbiBmdWxmaWxsZWQsIG9yIHJlamVjdGVkIGlmIGFueSBvZiB0aGVt IGJlY29tZSByZWplY3RlZC4KICAgICAgQHN0YXRpYwogICAgKi8KICAgIF9f ZXhwb3J0c19fWyJkZWZhdWx0Il0gPSBmdW5jdGlvbiBoYXNoKG9iamVjdCwg bGFiZWwpIHsKICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJl c29sdmUsIHJlamVjdCl7CiAgICAgICAgdmFyIHJlc3VsdHMgPSB7fTsKICAg ICAgICB2YXIga2V5cyA9IGtleXNPZihvYmplY3QpOwogICAgICAgIHZhciBy ZW1haW5pbmcgPSBrZXlzLmxlbmd0aDsKICAgICAgICB2YXIgZW50cnksIHBy b3BlcnR5OwoKICAgICAgICBpZiAocmVtYWluaW5nID09PSAwKSB7CiAgICAg ICAgICByZXNvbHZlKHJlc3VsdHMpOwogICAgICAgICAgcmV0dXJuOwogICAg ICAgIH0KCiAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWRUbyhwcm9wZXJ0eSkg ewogICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAg ICAgIHJlc3VsdHNbcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgICAgIGlm ICgtLXJlbWFpbmluZyA9PT0gMCkgewogICAgICAgICAgICAgIHJlc29sdmUo cmVzdWx0cyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAg fQoKICAgICAgICBmdW5jdGlvbiBvblJlamVjdGlvbihyZWFzb24pIHsKICAg ICAgICAgIHJlbWFpbmluZyA9IDA7CiAgICAgICAgICByZWplY3QocmVhc29u KTsKICAgICAgICB9CgogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5 cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgcHJvcGVydHkgPSBrZXlzW2ld OwogICAgICAgICAgZW50cnkgPSBvYmplY3RbcHJvcGVydHldOwoKICAgICAg ICAgIGlmIChpc05vblRoZW5hYmxlKGVudHJ5KSkgewogICAgICAgICAgICBy ZXN1bHRzW3Byb3BlcnR5XSA9IGVudHJ5OwogICAgICAgICAgICBpZiAoLS1y ZW1haW5pbmcgPT09IDApIHsKICAgICAgICAgICAgICByZXNvbHZlKHJlc3Vs dHMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAg ICAgICBQcm9taXNlLmNhc3QoZW50cnkpLnRoZW4oZnVsZmlsbGVkVG8ocHJv cGVydHkpLCBvblJlamVjdGlvbik7CiAgICAgICAgICB9CiAgICAgICAgfQog ICAgICB9KTsKICAgIH07CiAgfSk7CmRlZmluZSgicnN2cC9pbnN0cnVtZW50 IiwgCiAgWyIuL2NvbmZpZyIsIi4vdXRpbHMiLCJleHBvcnRzIl0sCiAgZnVu Y3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2RlcGVuZGVuY3kyX18sIF9fZXhw b3J0c19fKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgY29uZmlnID0g X19kZXBlbmRlbmN5MV9fLmNvbmZpZzsKICAgIHZhciBub3cgPSBfX2RlcGVu ZGVuY3kyX18ubm93OwoKICAgIF9fZXhwb3J0c19fWyJkZWZhdWx0Il0gPSBm dW5jdGlvbiBpbnN0cnVtZW50KGV2ZW50TmFtZSwgcHJvbWlzZSwgY2hpbGQp IHsKICAgICAgLy8gaW5zdHJ1bWVudGF0aW9uIHNob3VsZCBub3QgZGlzcnVw dCBub3JtYWwgdXNhZ2UuCiAgICAgIHRyeSB7CiAgICAgICAgY29uZmlnLnRy aWdnZXIoZXZlbnROYW1lLCB7CiAgICAgICAgICBndWlkOiBwcm9taXNlLl9n dWlkS2V5ICsgcHJvbWlzZS5faWQsCiAgICAgICAgICBldmVudE5hbWU6IGV2 ZW50TmFtZSwKICAgICAgICAgIGRldGFpbDogcHJvbWlzZS5fZGV0YWlsLAog ICAgICAgICAgY2hpbGRHdWlkOiBjaGlsZCAmJiBwcm9taXNlLl9ndWlkS2V5 ICsgY2hpbGQuX2lkLAogICAgICAgICAgbGFiZWw6IHByb21pc2UuX2xhYmVs LAogICAgICAgICAgdGltZVN0YW1wOiBub3coKSwKICAgICAgICAgIHN0YWNr OiBuZXcgRXJyb3IocHJvbWlzZS5fbGFiZWwpLnN0YWNrCiAgICAgICAgfSk7 CiAgICAgIH0gY2F0Y2goZXJyb3IpIHsKICAgICAgICBzZXRUaW1lb3V0KGZ1 bmN0aW9uKCl7CiAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICB9LCAw KTsKICAgICAgfQogICAgfTsKICB9KTsKZGVmaW5lKCJyc3ZwL21hcCIsIAog IFsiLi9wcm9taXNlIiwiLi9hbGwiLCIuL3V0aWxzIiwiZXhwb3J0cyJdLAog IGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19kZXBlbmRlbmN5Ml9fLCBf X2RlcGVuZGVuY3kzX18sIF9fZXhwb3J0c19fKSB7CiAgICAidXNlIHN0cmlj dCI7CiAgICB2YXIgUHJvbWlzZSA9IF9fZGVwZW5kZW5jeTFfX1siZGVmYXVs dCJdOwogICAgdmFyIGFsbCA9IF9fZGVwZW5kZW5jeTJfX1siZGVmYXVsdCJd OwogICAgdmFyIGlzQXJyYXkgPSBfX2RlcGVuZGVuY3kzX18uaXNBcnJheTsK ICAgIHZhciBpc0Z1bmN0aW9uID0gX19kZXBlbmRlbmN5M19fLmlzRnVuY3Rp b247CgogICAgLyoqCiAgICAgYFJTVlAubWFwYCBpcyBzaW1pbGFyIHRvIEph dmFTY3JpcHQncyBuYXRpdmUgYG1hcGAgbWV0aG9kLCBleGNlcHQgdGhhdCBp dAogICAgICB3YWl0cyBmb3IgYWxsIHByb21pc2VzIHRvIGJlY29tZSBmdWxm aWxsZWQgYmVmb3JlIHJ1bm5pbmcgdGhlIGBtYXBGbmAgb24KICAgICAgZWFj aCBpdGVtIGluIGdpdmVuIHRvIGBwcm9taXNlc2AuIGBSU1ZQLm1hcGAgcmV0 dXJucyBhIHByb21pc2UgdGhhdCB3aWxsCiAgICAgIGJlY29tZSBmdWxmaWxs ZWQgd2l0aCB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgYG1hcEZuYCBvbiB0aGUg dmFsdWVzIHRoZSBwcm9taXNlcwogICAgICBiZWNvbWUgZnVsZmlsbGVkIHdp dGguCgogICAgICBGb3IgZXhhbXBsZToKCiAgICAgIGBgYGphdmFzY3JpcHQK CiAgICAgIHZhciBwcm9taXNlMSA9IFJTVlAucmVzb2x2ZSgxKTsKICAgICAg dmFyIHByb21pc2UyID0gUlNWUC5yZXNvbHZlKDIpOwogICAgICB2YXIgcHJv bWlzZTMgPSBSU1ZQLnJlc29sdmUoMyk7CiAgICAgIHZhciBwcm9taXNlcyA9 IFsgcHJvbWlzZTEsIHByb21pc2UyLCBwcm9taXNlMyBdOwoKICAgICAgdmFy IG1hcEZuID0gZnVuY3Rpb24oaXRlbSl7CiAgICAgICAgcmV0dXJuIGl0ZW0g KyAxOwogICAgICB9OwoKICAgICAgUlNWUC5tYXAocHJvbWlzZXMsIG1hcEZu KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCl7CiAgICAgICAgLy8gcmVzdWx0IGlz IFsgMiwgMywgNCBdCiAgICAgIH0pOwogICAgICBgYGAKCiAgICAgIElmIGFu eSBvZiB0aGUgYHByb21pc2VzYCBnaXZlbiB0byBgUlNWUC5tYXBgIGFyZSBy ZWplY3RlZCwgdGhlIGZpcnN0IHByb21pc2UKICAgICAgdGhhdCBpcyByZWpl Y3RlZCB3aWxsIGJlIGdpdmVuIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSByZXR1 cm5lZCBwcm9taXNlJ3MKICAgICAgcmVqZWN0aW9uIGhhbmRsZXIuIEZvciBl eGFtcGxlOgoKICAgICAgYGBgamF2YXNjcmlwdAogICAgICB2YXIgcHJvbWlz ZTEgPSBSU1ZQLnJlc29sdmUoMSk7CiAgICAgIHZhciBwcm9taXNlMiA9IFJT VlAucmVqZWN0KG5ldyBFcnJvcigiMiIpKTsKICAgICAgdmFyIHByb21pc2Uz ID0gUlNWUC5yZWplY3QobmV3IEVycm9yKCIzIikpOwogICAgICB2YXIgcHJv bWlzZXMgPSBbIHByb21pc2UxLCBwcm9taXNlMiwgcHJvbWlzZTMgXTsKCiAg ICAgIHZhciBtYXBGbiA9IGZ1bmN0aW9uKGl0ZW0pewogICAgICAgIHJldHVy biBpdGVtICsgMTsKICAgICAgfTsKCiAgICAgIFJTVlAubWFwKHByb21pc2Vz LCBtYXBGbikudGhlbihmdW5jdGlvbihhcnJheSl7CiAgICAgICAgLy8gQ29k ZSBoZXJlIG5ldmVyIHJ1bnMgYmVjYXVzZSB0aGVyZSBhcmUgcmVqZWN0ZWQg cHJvbWlzZXMhCiAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikgewogICAgICAg IC8vIHJlYXNvbi5tZXNzYWdlID09PSAiMiIKICAgICAgfSk7CiAgICAgIGBg YAoKICAgICAgYFJTVlAubWFwYCB3aWxsIGFsc28gd2FpdCBpZiBhIHByb21p c2UgaXMgcmV0dXJuZWQgZnJvbSBgbWFwRm5gLiBGb3IgZXhhbXBsZSwKICAg ICAgc2F5IHlvdSB3YW50IHRvIGdldCBhbGwgY29tbWVudHMgZnJvbSBhIHNl dCBvZiBibG9nIHBvc3RzLCBidXQgeW91IG5lZWQKICAgICAgdGhlIGJsb2cg cG9zdHMgZmlyc3QgYmVjdWFzZSB0aGV5IGNvbnRhaW4gYSB1cmwgdG8gdGhv c2UgY29tbWVudHMuCgogICAgICBgYGBqYXZzY3JpcHQKCiAgICAgIHZhciBt YXBGbiA9IGZ1bmN0aW9uKGJsb2dQb3N0KXsKICAgICAgICAvLyBnZXRDb21t ZW50cyBkb2VzIHNvbWUgYWpheCBhbmQgcmV0dXJucyBhbiBSU1ZQLlByb21p c2UgdGhhdCBpcyBmdWxmaWxsZWQKICAgICAgICAvLyB3aXRoIHNvbWUgY29t bWVudHMgZGF0YQogICAgICAgIHJldHVybiBnZXRDb21tZW50cyhibG9nUG9z dC5jb21tZW50c191cmwpOwogICAgICB9OwoKICAgICAgLy8gZ2V0QmxvZ1Bv c3RzIGRvZXMgc29tZSBhamF4IGFuZCByZXR1cm5zIGFuIFJTVlAuUHJvbWlz ZSB0aGF0IGlzIGZ1bGZpbGxlZAogICAgICAvLyB3aXRoIHNvbWUgYmxvZyBw b3N0IGRhdGEKICAgICAgUlNWUC5tYXAoZ2V0QmxvZ1Bvc3RzKCksIG1hcEZu KS50aGVuKGZ1bmN0aW9uKGNvbW1lbnRzKXsKICAgICAgICAvLyBjb21tZW50 cyBpcyB0aGUgcmVzdWx0IG9mIGFza2luZyB0aGUgc2VydmVyIGZvciB0aGUg Y29tbWVudHMKICAgICAgICAvLyBvZiBhbGwgYmxvZyBwb3N0cyByZXR1cm5l ZCBmcm9tIGdldEJsb2dQb3N0cygpCiAgICAgIH0pOwogICAgICBgYGAKCiAg ICAgIEBtZXRob2QgbWFwCiAgICAgIEBmb3IgUlNWUAogICAgICBAcGFyYW0g e0FycmF5fSBwcm9taXNlcwogICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBtYXBG biBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gZWFjaCBmdWxmaWxsZWQgcHJv bWlzZS4KICAgICAgQHBhcmFtIHtTdHJpbmd9IGxhYmVsIG9wdGlvbmFsIHN0 cmluZyBmb3IgbGFiZWxpbmcgdGhlIHByb21pc2UuCiAgICAgIFVzZWZ1bCBm b3IgdG9vbGluZy4KICAgICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZSB0 aGF0IGlzIGZ1bGZpbGxlZCB3aXRoIHRoZSByZXN1bHQgb2YgY2FsbGluZwog ICAgICBgbWFwRm5gIG9uIGVhY2ggZnVsZmlsbGVkIHByb21pc2Ugb3IgdmFs dWUgd2hlbiB0aGV5IGJlY29tZSBmdWxmaWxsZWQuCiAgICAgICBUaGUgcHJv bWlzZSB3aWxsIGJlIHJlamVjdGVkIGlmIGFueSBvZiB0aGUgZ2l2ZW4gYHBy b21pc2VzYCBiZWNvbWUgcmVqZWN0ZWQuCiAgICAgIEBzdGF0aWMKICAgICov CiAgICBfX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gZnVuY3Rpb24gbWFwKHBy b21pc2VzLCBtYXBGbiwgbGFiZWwpIHsKICAgICAgcmV0dXJuIGFsbChwcm9t aXNlcywgbGFiZWwpLnRoZW4oZnVuY3Rpb24ocmVzdWx0cyl7CiAgICAgICAg aWYgKCFpc0FycmF5KHByb21pc2VzKSkgewogICAgICAgICAgdGhyb3cgbmV3 IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhbiBhcnJheSB0byBtYXAuJyk7 CiAgICAgICAgfQoKICAgICAgICBpZiAoIWlzRnVuY3Rpb24obWFwRm4pKXsK ICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIllvdSBtdXN0IHBhc3Mg YSBmdW5jdGlvbiB0byBtYXAncyBzZWNvbmQgYXJndW1lbnQuIik7CiAgICAg ICAgfQoKCiAgICAgICAgdmFyIHJlc3VsdExlbiA9IHJlc3VsdHMubGVuZ3Ro LAogICAgICAgICAgICBtYXBwZWRSZXN1bHRzID0gW10sCiAgICAgICAgICAg IGk7CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCByZXN1bHRMZW47IGkrKyl7 CiAgICAgICAgICBtYXBwZWRSZXN1bHRzLnB1c2gobWFwRm4ocmVzdWx0c1tp XSkpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGFsbChtYXBwZWRSZXN1 bHRzLCBsYWJlbCk7CiAgICAgIH0pOwogICAgfTsKICB9KTsKZGVmaW5lKCJy c3ZwL25vZGUiLCAKICBbIi4vcHJvbWlzZSIsImV4cG9ydHMiXSwKICBmdW5j dGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZXhwb3J0c19fKSB7CiAgICAidXNl IHN0cmljdCI7CiAgICB2YXIgUHJvbWlzZSA9IF9fZGVwZW5kZW5jeTFfX1si ZGVmYXVsdCJdOwoKICAgIHZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5z bGljZTsKCiAgICBmdW5jdGlvbiBtYWtlTm9kZUNhbGxiYWNrRm9yKHJlc29s dmUsIHJlamVjdCkgewogICAgICByZXR1cm4gZnVuY3Rpb24gKGVycm9yLCB2 YWx1ZSkgewogICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgcmVqZWN0 KGVycm9yKTsKICAgICAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGgg PiAyKSB7CiAgICAgICAgICByZXNvbHZlKHNsaWNlLmNhbGwoYXJndW1lbnRz LCAxKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlc29sdmUodmFs dWUpOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAg YFJTVlAuZGVub2RlaWZ5YCB0YWtlcyBhICJub2RlLXN0eWxlIiBmdW5jdGlv biBhbmQgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQKICAgICAgd2lsbCByZXR1 cm4gYW4gYFJTVlAuUHJvbWlzZWAuIFlvdSBjYW4gdXNlIGBkZW5vZGVpZnlg IGluIE5vZGUuanMgb3IgdGhlCiAgICAgIGJyb3dzZXIgd2hlbiB5b3UnZCBw cmVmZXIgdG8gdXNlIHByb21pc2VzIG92ZXIgdXNpbmcgY2FsbGJhY2tzLiBG b3IgZXhhbXBsZSwKICAgICAgYGRlbm9kZWlmeWAgdHJhbnNmb3JtcyB0aGUg Zm9sbG93aW5nOgoKICAgICAgYGBgamF2YXNjcmlwdAogICAgICB2YXIgZnMg PSByZXF1aXJlKCdmcycpOwoKICAgICAgZnMucmVhZEZpbGUoJ215ZmlsZS50 eHQnLCBmdW5jdGlvbihlcnIsIGRhdGEpewogICAgICAgIGlmIChlcnIpIHJl dHVybiBoYW5kbGVFcnJvcihlcnIpOwogICAgICAgIGhhbmRsZURhdGEoZGF0 YSk7CiAgICAgIH0pOwogICAgICBgYGAKCiAgICAgIGludG86CgogICAgICBg YGBqYXZhc2NyaXB0CiAgICAgIHZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7Cgog ICAgICB2YXIgcmVhZEZpbGUgPSBSU1ZQLmRlbm9kZWlmeShmcy5yZWFkRmls ZSk7CgogICAgICByZWFkRmlsZSgnbXlmaWxlLnR4dCcpLnRoZW4oaGFuZGxl RGF0YSwgaGFuZGxlRXJyb3IpOwogICAgICBgYGAKCiAgICAgIFVzaW5nIGBk ZW5vZGVpZnlgIG1ha2VzIGl0IGVhc2llciB0byBjb21wb3NlIGFzeW5jaHJv bm91cyBvcGVyYXRpb25zIGluc3RlYWQKICAgICAgb2YgdXNpbmcgY2FsbGJh Y2tzLiBGb3IgZXhhbXBsZSwgaW5zdGVhZCBvZjoKCiAgICAgIGBgYGphdmFz Y3JpcHQKICAgICAgdmFyIGZzID0gcmVxdWlyZSgnZnMnKTsKICAgICAgdmFy IGxvZyA9IHJlcXVpcmUoJ3NvbWUtYXN5bmMtbG9nZ2VyJyk7CgogICAgICBm cy5yZWFkRmlsZSgnbXlmaWxlLnR4dCcsIGZ1bmN0aW9uKGVyciwgZGF0YSl7 CiAgICAgICAgaWYgKGVycikgcmV0dXJuIGhhbmRsZUVycm9yKGVycik7CiAg ICAgICAgZnMud3JpdGVGaWxlKCdteWZpbGUyLnR4dCcsIGRhdGEsIGZ1bmN0 aW9uKGVycil7CiAgICAgICAgICBpZiAoZXJyKSB0aHJvdyBlcnI7CiAgICAg ICAgICBsb2coJ3N1Y2Nlc3MnLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAg ICAgaWYgKGVycikgdGhyb3cgZXJyOwogICAgICAgICAgfSk7CiAgICAgICAg fSk7CiAgICAgIH0pOwogICAgICBgYGAKCiAgICAgIFlvdSBjYW4gY2hhaW4g dGhlIG9wZXJhdGlvbnMgdG9nZXRoZXIgdXNpbmcgYHRoZW5gIGZyb20gdGhl IHJldHVybmVkIHByb21pc2U6CgogICAgICBgYGBqYXZhc2NyaXB0CiAgICAg IHZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7CiAgICAgIHZhciBkZW5vZGVpZnkg PSBSU1ZQLmRlbm9kZWlmeTsKICAgICAgdmFyIHJlYWRGaWxlID0gZGVub2Rl aWZ5KGZzLnJlYWRGaWxlKTsKICAgICAgdmFyIHdyaXRlRmlsZSA9IGRlbm9k ZWlmeShmcy53cml0ZUZpbGUpOwogICAgICB2YXIgbG9nID0gZGVub2RlaWZ5 KHJlcXVpcmUoJ3NvbWUtYXN5bmMtbG9nZ2VyJykpOwoKICAgICAgcmVhZEZp bGUoJ215ZmlsZS50eHQnKS50aGVuKGZ1bmN0aW9uKGRhdGEpewogICAgICAg IHJldHVybiB3cml0ZUZpbGUoJ215ZmlsZTIudHh0JywgZGF0YSk7CiAgICAg IH0pLnRoZW4oZnVuY3Rpb24oKXsKICAgICAgICByZXR1cm4gbG9nKCdTVUND RVNTJyk7CiAgICAgIH0pLnRoZW4oZnVuY3Rpb24oKXsKICAgICAgICAvLyBz dWNjZXNzIGhhbmRsZXIKICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKXsKICAg ICAgICAvLyByZWplY3Rpb24gaGFuZGxlcgogICAgICB9KTsKICAgICAgYGBg CgogICAgICBAbWV0aG9kIGRlbm9kZWlmeQogICAgICBAZm9yIFJTVlAKICAg ICAgQHBhcmFtIHtGdW5jdGlvbn0gbm9kZUZ1bmMgYSAibm9kZS1zdHlsZSIg ZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGNhbGxiYWNrIGFzCiAgICAgIGl0cyBs YXN0IGFyZ3VtZW50LiBUaGUgY2FsbGJhY2sgZXhwZWN0cyBhbiBlcnJvciB0 byBiZSBwYXNzZWQgYXMgaXRzIGZpcnN0CiAgICAgIGFyZ3VtZW50IChpZiBh biBlcnJvciBvY2N1cnJlZCwgb3RoZXJ3aXNlIG51bGwpLCBhbmQgdGhlIHZh bHVlIGZyb20gdGhlCiAgICAgIG9wZXJhdGlvbiBhcyBpdHMgc2Vjb25kIGFy Z3VtZW50ICgiZnVuY3Rpb24oZXJyLCB2YWx1ZSl7IH0iKS4KICAgICAgQHBh cmFtIHtBbnl9IGJpbmRpbmcgb3B0aW9uYWwgYXJndW1lbnQgZm9yIGJpbmRp bmcgdGhlICJ0aGlzIiB2YWx1ZSB3aGVuCiAgICAgIGNhbGxpbmcgdGhlIGBu b2RlRnVuY2AgZnVuY3Rpb24uCiAgICAgIEByZXR1cm4ge0Z1bmN0aW9ufSBh IGZ1bmN0aW9uIHRoYXQgd3JhcHMgYG5vZGVGdW5jYCB0byByZXR1cm4gYW4K ICAgICAgYFJTVlAuUHJvbWlzZWAKICAgICAgQHN0YXRpYwogICAgKi8KICAg IF9fZXhwb3J0c19fWyJkZWZhdWx0Il0gPSBmdW5jdGlvbiBkZW5vZGVpZnko bm9kZUZ1bmMsIGJpbmRpbmcpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkg IHsKICAgICAgICB2YXIgbm9kZUFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50 cyksIHJlc29sdmUsIHJlamVjdDsKICAgICAgICB2YXIgdGhpc0FyZyA9IHRo aXMgfHwgYmluZGluZzsKCiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1 bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgUHJvbWlzZS5h bGwobm9kZUFyZ3MpLnRoZW4oZnVuY3Rpb24obm9kZUFyZ3MpIHsKICAgICAg ICAgICAgdHJ5IHsKICAgICAgICAgICAgICBub2RlQXJncy5wdXNoKG1ha2VO b2RlQ2FsbGJhY2tGb3IocmVzb2x2ZSwgcmVqZWN0KSk7CiAgICAgICAgICAg ICAgbm9kZUZ1bmMuYXBwbHkodGhpc0FyZywgbm9kZUFyZ3MpOwogICAgICAg ICAgICB9IGNhdGNoKGUpIHsKICAgICAgICAgICAgICByZWplY3QoZSk7CiAg ICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9 OwogICAgfTsKICB9KTsKZGVmaW5lKCJyc3ZwL3Byb21pc2UiLCAKICBbIi4v Y29uZmlnIiwiLi9ldmVudHMiLCIuL2luc3RydW1lbnQiLCIuL3V0aWxzIiwi Li9wcm9taXNlL2Nhc3QiLCIuL3Byb21pc2UvYWxsIiwiLi9wcm9taXNlL3Jh Y2UiLCIuL3Byb21pc2UvcmVzb2x2ZSIsIi4vcHJvbWlzZS9yZWplY3QiLCJl eHBvcnRzIl0sCiAgZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2RlcGVu ZGVuY3kyX18sIF9fZGVwZW5kZW5jeTNfXywgX19kZXBlbmRlbmN5NF9fLCBf X2RlcGVuZGVuY3k1X18sIF9fZGVwZW5kZW5jeTZfXywgX19kZXBlbmRlbmN5 N19fLCBfX2RlcGVuZGVuY3k4X18sIF9fZGVwZW5kZW5jeTlfXywgX19leHBv cnRzX18pIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBjb25maWcgPSBf X2RlcGVuZGVuY3kxX18uY29uZmlnOwogICAgdmFyIEV2ZW50VGFyZ2V0ID0g X19kZXBlbmRlbmN5Ml9fWyJkZWZhdWx0Il07CiAgICB2YXIgaW5zdHJ1bWVu dCA9IF9fZGVwZW5kZW5jeTNfX1siZGVmYXVsdCJdOwogICAgdmFyIG9iamVj dE9yRnVuY3Rpb24gPSBfX2RlcGVuZGVuY3k0X18ub2JqZWN0T3JGdW5jdGlv bjsKICAgIHZhciBpc0Z1bmN0aW9uID0gX19kZXBlbmRlbmN5NF9fLmlzRnVu Y3Rpb247CiAgICB2YXIgbm93ID0gX19kZXBlbmRlbmN5NF9fLm5vdzsKICAg IHZhciBjYXN0ID0gX19kZXBlbmRlbmN5NV9fWyJkZWZhdWx0Il07CiAgICB2 YXIgYWxsID0gX19kZXBlbmRlbmN5Nl9fWyJkZWZhdWx0Il07CiAgICB2YXIg cmFjZSA9IF9fZGVwZW5kZW5jeTdfX1siZGVmYXVsdCJdOwogICAgdmFyIFJl c29sdmUgPSBfX2RlcGVuZGVuY3k4X19bImRlZmF1bHQiXTsKICAgIHZhciBS ZWplY3QgPSBfX2RlcGVuZGVuY3k5X19bImRlZmF1bHQiXTsKCiAgICB2YXIg Z3VpZEtleSA9ICdyc3ZwXycgKyBub3coKSArICctJzsKICAgIHZhciBjb3Vu dGVyID0gMDsKCiAgICBmdW5jdGlvbiBub29wKCkge30KCiAgICBfX2V4cG9y dHNfX1siZGVmYXVsdCJdID0gUHJvbWlzZTsKCgogICAgLyoqCiAgICAgIFBy b21pc2Ugb2JqZWN0cyByZXByZXNlbnQgdGhlIGV2ZW50dWFsIHJlc3VsdCBv ZiBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uLiBUaGUKICAgICAgcHJpbWFy eSB3YXkgb2YgaW50ZXJhY3Rpbmcgd2l0aCBhIHByb21pc2UgaXMgdGhyb3Vn aCBpdHMgYHRoZW5gIG1ldGhvZCwgd2hpY2gKICAgICAgcmVnaXN0ZXJzIGNh bGxiYWNrcyB0byByZWNlaXZlIGVpdGhlciBhIHByb21pc2XigJlzIGV2ZW50 dWFsIHZhbHVlIG9yIHRoZSByZWFzb24KICAgICAgd2h5IHRoZSBwcm9taXNl IGNhbm5vdCBiZSBmdWxmaWxsZWQuCgogICAgICBUZXJtaW5vbG9neQogICAg ICAtLS0tLS0tLS0tLQoKICAgICAgLSBgcHJvbWlzZWAgaXMgYW4gb2JqZWN0 IG9yIGZ1bmN0aW9uIHdpdGggYSBgdGhlbmAgbWV0aG9kIHdob3NlIGJlaGF2 aW9yIGNvbmZvcm1zIHRvIHRoaXMgc3BlY2lmaWNhdGlvbi4KICAgICAgLSBg dGhlbmFibGVgIGlzIGFuIG9iamVjdCBvciBmdW5jdGlvbiB0aGF0IGRlZmlu ZXMgYSBgdGhlbmAgbWV0aG9kLgogICAgICAtIGB2YWx1ZWAgaXMgYW55IGxl Z2FsIEphdmFTY3JpcHQgdmFsdWUgKGluY2x1ZGluZyB1bmRlZmluZWQsIGEg dGhlbmFibGUsIG9yIGEgcHJvbWlzZSkuCiAgICAgIC0gYGV4Y2VwdGlvbmAg aXMgYSB2YWx1ZSB0aGF0IGlzIHRocm93biB1c2luZyB0aGUgdGhyb3cgc3Rh dGVtZW50LgogICAgICAtIGByZWFzb25gIGlzIGEgdmFsdWUgdGhhdCBpbmRp Y2F0ZXMgd2h5IGEgcHJvbWlzZSB3YXMgcmVqZWN0ZWQuCiAgICAgIC0gYHNl dHRsZWRgIHRoZSBmaW5hbCByZXN0aW5nIHN0YXRlIG9mIGEgcHJvbWlzZSwg ZnVsZmlsbGVkIG9yIHJlamVjdGVkLgoKICAgICAgQSBwcm9taXNlIGNhbiBi ZSBpbiBvbmUgb2YgdGhyZWUgc3RhdGVzOiBwZW5kaW5nLCBmdWxmaWxsZWQs IG9yIHJlamVjdGVkLgoKICAgICAgUHJvbWlzZXMgdGhhdCBhcmUgZnVsZmls bGVkIGhhdmUgYSBmdWxmaWxsbWVudCB2YWx1ZSBhbmQgYXJlIGluIHRoZSBm dWxmaWxsZWQKICAgICAgc3RhdGUuICBQcm9taXNlcyB0aGF0IGFyZSByZWpl Y3RlZCBoYXZlIGEgcmVqZWN0aW9uIHJlYXNvbiBhbmQgYXJlIGluIHRoZQog ICAgICByZWplY3RlZCBzdGF0ZS4gIEEgZnVsZmlsbG1lbnQgdmFsdWUgaXMg bmV2ZXIgYSB0aGVuYWJsZS4gIFNpbWlsYXJseSwgYQogICAgICByZWplY3Rp b24gcmVhc29uIGlzIG5ldmVyIGEgdGhlbmFibGUuCgogICAgICBQcm9taXNl cyBjYW4gYWxzbyBiZSBzYWlkIHRvICpyZXNvbHZlKiBhIHZhbHVlLiAgSWYg dGhpcyB2YWx1ZSBpcyBhbHNvIGEKICAgICAgcHJvbWlzZSwgdGhlbiB0aGUg b3JpZ2luYWwgcHJvbWlzZSdzIHNldHRsZWQgc3RhdGUgd2lsbCBtYXRjaCB0 aGUgdmFsdWUncwogICAgICBzZXR0bGVkIHN0YXRlLiAgU28gYSBwcm9taXNl IHRoYXQgKnJlc29sdmVzKiBhIHByb21pc2UgdGhhdCByZWplY3RzIHdpbGwK ICAgICAgaXRzZWxmIHJlamVjdCwgYW5kIGEgcHJvbWlzZSB0aGF0ICpyZXNv bHZlcyogYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgd2lsbAogICAgICBpdHNl bGYgZnVsZmlsbC4KCgogICAgICBCYXNpYyBVc2FnZToKICAgICAgLS0tLS0t LS0tLS0tCgogICAgICBgYGBqcwogICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQ cm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgIC8v IG9uIHN1Y2Nlc3MKICAgICAgICByZXNvbHZlKHZhbHVlKTsKCiAgICAgICAg Ly8gb24gZmFpbHVyZQogICAgICAgIHJlamVjdChyZWFzb24pOwogICAgICB9 KTsKCiAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbih2YWx1ZSkgewogICAg ICAgIC8vIG9uIGZ1bGZpbGxtZW50CiAgICAgIH0sIGZ1bmN0aW9uKHJlYXNv bikgewogICAgICAgIC8vIG9uIHJlamVjdGlvbgogICAgICB9KTsKICAgICAg YGBgCgogICAgICBBZHZhbmNlZCBVc2FnZToKICAgICAgLS0tLS0tLS0tLS0t LS0tCgogICAgICBQcm9taXNlcyBzaGluZSB3aGVuIGFic3RyYWN0aW5nIGF3 YXkgYXN5bmNocm9ub3VzIGludGVyYWN0aW9ucyBzdWNoIGFzCiAgICAgIGBY TUxIdHRwUmVxdWVzdGBzLgoKICAgICAgYGBganMKICAgICAgZnVuY3Rpb24g Z2V0SlNPTih1cmwpIHsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVu Y3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXsKICAgICAgICAgIHZhciB4aHIgPSBu ZXcgWE1MSHR0cFJlcXVlc3QoKTsKCiAgICAgICAgICB4aHIub3BlbignR0VU JywgdXJsKTsKICAgICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBo YW5kbGVyOwogICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdqc29uJzsK ICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdBY2NlcHQnLCAnYXBw bGljYXRpb24vanNvbicpOwogICAgICAgICAgeGhyLnNlbmQoKTsKCiAgICAg ICAgICBmdW5jdGlvbiBoYW5kbGVyKCkgewogICAgICAgICAgICBpZiAodGhp cy5yZWFkeVN0YXRlID09PSB0aGlzLkRPTkUpIHsKICAgICAgICAgICAgICBp ZiAodGhpcy5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgcmVz b2x2ZSh0aGlzLnJlc3BvbnNlKTsKICAgICAgICAgICAgICB9IGVsc2Ugewog ICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcigiZ2V0SlNPTjogYCIg KyB1cmwgKyAiYCBmYWlsZWQgd2l0aCBzdGF0dXM6IFsiICsgdGhpcy5zdGF0 dXMgKyAiXSIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAg ICAgICAgfTsKICAgICAgICB9KTsKICAgICAgfQoKICAgICAgZ2V0SlNPTign L3Bvc3RzLmpzb24nKS50aGVuKGZ1bmN0aW9uKGpzb24pIHsKICAgICAgICAv LyBvbiBmdWxmaWxsbWVudAogICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHsK ICAgICAgICAvLyBvbiByZWplY3Rpb24KICAgICAgfSk7CiAgICAgIGBgYAoK ICAgICAgVW5saWtlIGNhbGxiYWNrcywgcHJvbWlzZXMgYXJlIGdyZWF0IGNv bXBvc2FibGUgcHJpbWl0aXZlcy4KCiAgICAgIGBgYGpzCiAgICAgIFByb21p c2UuYWxsKFsKICAgICAgICBnZXRKU09OKCcvcG9zdHMnKSwKICAgICAgICBn ZXRKU09OKCcvY29tbWVudHMnKQogICAgICBdKS50aGVuKGZ1bmN0aW9uKHZh bHVlcyl7CiAgICAgICAgdmFsdWVzWzBdIC8vID0+IHBvc3RzSlNPTgogICAg ICAgIHZhbHVlc1sxXSAvLyA9PiBjb21tZW50c0pTT04KCiAgICAgICAgcmV0 dXJuIHZhbHVlczsKICAgICAgfSk7CiAgICAgIGBgYAoKICAgICAgQGNsYXNz IFJTVlAuUHJvbWlzZQogICAgICBAcGFyYW0ge2Z1bmN0aW9ufQogICAgICBA cGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIGZvciBsYWJl bGluZyB0aGUgcHJvbWlzZS4KICAgICAgVXNlZnVsIGZvciB0b29saW5nLgog ICAgICBAY29uc3RydWN0b3IKICAgICovCiAgICBmdW5jdGlvbiBQcm9taXNl KHJlc29sdmVyLCBsYWJlbCkgewogICAgICBpZiAoIWlzRnVuY3Rpb24ocmVz b2x2ZXIpKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IG11 c3QgcGFzcyBhIHJlc29sdmVyIGZ1bmN0aW9uIGFzIHRoZSBmaXJzdCBhcmd1 bWVudCB0byB0aGUgcHJvbWlzZSBjb25zdHJ1Y3RvcicpOwogICAgICB9Cgog ICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUHJvbWlzZSkpIHsKICAgICAg ICB0aHJvdyBuZXcgVHlwZUVycm9yKCJGYWlsZWQgdG8gY29uc3RydWN0ICdQ cm9taXNlJzogUGxlYXNlIHVzZSB0aGUgJ25ldycgb3BlcmF0b3IsIHRoaXMg b2JqZWN0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5j dGlvbi4iKTsKICAgICAgfQoKICAgICAgdGhpcy5faWQgPSBjb3VudGVyKys7 CiAgICAgIHRoaXMuX2xhYmVsID0gbGFiZWw7CiAgICAgIHRoaXMuX3N1YnNj cmliZXJzID0gW107CgogICAgICBpZiAoY29uZmlnLmluc3RydW1lbnQpIHsK ICAgICAgICBpbnN0cnVtZW50KCdjcmVhdGVkJywgdGhpcyk7CiAgICAgIH0K CiAgICAgIGlmIChub29wICE9PSByZXNvbHZlcikgewogICAgICAgIGludm9r ZVJlc29sdmVyKHJlc29sdmVyLCB0aGlzKTsKICAgICAgfQogICAgfQoKICAg IGZ1bmN0aW9uIGludm9rZVJlc29sdmVyKHJlc29sdmVyLCBwcm9taXNlKSB7 CiAgICAgIGZ1bmN0aW9uIHJlc29sdmVQcm9taXNlKHZhbHVlKSB7CiAgICAg ICAgcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7CiAgICAgIH0KCiAgICAgIGZ1 bmN0aW9uIHJlamVjdFByb21pc2UocmVhc29uKSB7CiAgICAgICAgcmVqZWN0 KHByb21pc2UsIHJlYXNvbik7CiAgICAgIH0KCiAgICAgIHRyeSB7CiAgICAg ICAgcmVzb2x2ZXIocmVzb2x2ZVByb21pc2UsIHJlamVjdFByb21pc2UpOwog ICAgICB9IGNhdGNoKGUpIHsKICAgICAgICByZWplY3RQcm9taXNlKGUpOwog ICAgICB9CiAgICB9CgogICAgUHJvbWlzZS5jYXN0ID0gY2FzdDsKICAgIFBy b21pc2UuYWxsID0gYWxsOwogICAgUHJvbWlzZS5yYWNlID0gcmFjZTsKICAg IFByb21pc2UucmVzb2x2ZSA9IFJlc29sdmU7CiAgICBQcm9taXNlLnJlamVj dCA9IFJlamVjdDsKCiAgICB2YXIgUEVORElORyAgID0gdm9pZCAwOwogICAg dmFyIFNFQUxFRCAgICA9IDA7CiAgICB2YXIgRlVMRklMTEVEID0gMTsKICAg IHZhciBSRUpFQ1RFRCAgPSAyOwoKICAgIGZ1bmN0aW9uIHN1YnNjcmliZShw YXJlbnQsIGNoaWxkLCBvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbikgewog ICAgICB2YXIgc3Vic2NyaWJlcnMgPSBwYXJlbnQuX3N1YnNjcmliZXJzOwog ICAgICB2YXIgbGVuZ3RoID0gc3Vic2NyaWJlcnMubGVuZ3RoOwoKICAgICAg c3Vic2NyaWJlcnNbbGVuZ3RoXSA9IGNoaWxkOwogICAgICBzdWJzY3JpYmVy c1tsZW5ndGggKyBGVUxGSUxMRURdID0gb25GdWxmaWxsbWVudDsKICAgICAg c3Vic2NyaWJlcnNbbGVuZ3RoICsgUkVKRUNURURdICA9IG9uUmVqZWN0aW9u OwogICAgfQoKICAgIGZ1bmN0aW9uIHB1Ymxpc2gocHJvbWlzZSwgc2V0dGxl ZCkgewogICAgICB2YXIgY2hpbGQsIGNhbGxiYWNrLCBzdWJzY3JpYmVycyA9 IHByb21pc2UuX3N1YnNjcmliZXJzLCBkZXRhaWwgPSBwcm9taXNlLl9kZXRh aWw7CgogICAgICBpZiAoY29uZmlnLmluc3RydW1lbnQpIHsKICAgICAgICBp bnN0cnVtZW50KHNldHRsZWQgPT09IEZVTEZJTExFRCA/ICdmdWxmaWxsZWQn IDogJ3JlamVjdGVkJywgcHJvbWlzZSk7CiAgICAgIH0KCiAgICAgIGZvciAo dmFyIGkgPSAwOyBpIDwgc3Vic2NyaWJlcnMubGVuZ3RoOyBpICs9IDMpIHsK ICAgICAgICBjaGlsZCA9IHN1YnNjcmliZXJzW2ldOwogICAgICAgIGNhbGxi YWNrID0gc3Vic2NyaWJlcnNbaSArIHNldHRsZWRdOwoKICAgICAgICBpbnZv a2VDYWxsYmFjayhzZXR0bGVkLCBjaGlsZCwgY2FsbGJhY2ssIGRldGFpbCk7 CiAgICAgIH0KCiAgICAgIHByb21pc2UuX3N1YnNjcmliZXJzID0gbnVsbDsK ICAgIH0KCiAgICBQcm9taXNlLnByb3RvdHlwZSA9IHsKICAgICAgY29uc3Ry dWN0b3I6IFByb21pc2UsCgogICAgICBfaWQ6IHVuZGVmaW5lZCwKICAgICAg X2d1aWRLZXk6IGd1aWRLZXksCiAgICAgIF9sYWJlbDogdW5kZWZpbmVkLAoK ICAgICAgX3N0YXRlOiB1bmRlZmluZWQsCiAgICAgIF9kZXRhaWw6IHVuZGVm aW5lZCwKICAgICAgX3N1YnNjcmliZXJzOiB1bmRlZmluZWQsCgogICAgICBf b25lcnJvcjogZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgIGNvbmZpZy50 cmlnZ2VyKCdlcnJvcicsIHJlYXNvbik7CiAgICAgIH0sCgogICAgLyoqCiAg ICAgIFRoZSBwcmltYXJ5IHdheSBvZiBpbnRlcmFjdGluZyB3aXRoIGEgcHJv bWlzZSBpcyB0aHJvdWdoIGl0cyBgdGhlbmAgbWV0aG9kLAogICAgICB3aGlj aCByZWdpc3RlcnMgY2FsbGJhY2tzIHRvIHJlY2VpdmUgZWl0aGVyIGEgcHJv bWlzZSdzIGV2ZW50dWFsIHZhbHVlIG9yIHRoZQogICAgICByZWFzb24gd2h5 IHRoZSBwcm9taXNlIGNhbm5vdCBiZSBmdWxmaWxsZWQuCgogICAgICBgYGBq cwogICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24odXNlcil7CiAgICAg ICAgLy8gdXNlciBpcyBhdmFpbGFibGUKICAgICAgfSwgZnVuY3Rpb24ocmVh c29uKXsKICAgICAgICAvLyB1c2VyIGlzIHVuYXZhaWxhYmxlLCBhbmQgeW91 IGFyZSBnaXZlbiB0aGUgcmVhc29uIHdoeQogICAgICB9KTsKICAgICAgYGBg CgogICAgICBDaGFpbmluZwogICAgICAtLS0tLS0tLQoKICAgICAgVGhlIHJl dHVybiB2YWx1ZSBvZiBgdGhlbmAgaXMgaXRzZWxmIGEgcHJvbWlzZS4gIFRo aXMgc2Vjb25kLCAiZG93bnN0cmVhbSIKICAgICAgcHJvbWlzZSBpcyByZXNv bHZlZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZpcnN0IHByb21p c2UncyBmdWxmaWxsbWVudAogICAgICBvciByZWplY3Rpb24gaGFuZGxlciwg b3IgcmVqZWN0ZWQgaWYgdGhlIGhhbmRsZXIgdGhyb3dzIGFuIGV4Y2VwdGlv bi4KCiAgICAgIGBgYGpzCiAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlv biAodXNlcikgewogICAgICAgIHJldHVybiB1c2VyLm5hbWU7CiAgICAgIH0s IGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICByZXR1cm4gImRlZmF1bHQg bmFtZSI7CiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHVzZXJOYW1lKSB7CiAg ICAgICAgLy8gSWYgYGZpbmRVc2VyYCBmdWxmaWxsZWQsIGB1c2VyTmFtZWAg d2lsbCBiZSB0aGUgdXNlcidzIG5hbWUsIG90aGVyd2lzZSBpdAogICAgICAg IC8vIHdpbGwgYmUgYCJkZWZhdWx0IG5hbWUiYAogICAgICB9KTsKCiAgICAg IGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikgewogICAgICAgIHRo cm93IG5ldyBFcnJvcigiRm91bmQgdXNlciwgYnV0IHN0aWxsIHVuaGFwcHki KTsKICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgIHRocm93 IG5ldyBFcnJvcigiYGZpbmRVc2VyYCByZWplY3RlZCBhbmQgd2UncmUgdW5o YXBweSIpOwogICAgICB9KS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkgewogICAg ICAgIC8vIG5ldmVyIHJlYWNoZWQKICAgICAgfSwgZnVuY3Rpb24gKHJlYXNv bikgewogICAgICAgIC8vIGlmIGBmaW5kVXNlcmAgZnVsZmlsbGVkLCBgcmVh c29uYCB3aWxsIGJlICJGb3VuZCB1c2VyLCBidXQgc3RpbGwgdW5oYXBweSIu CiAgICAgICAgLy8gSWYgYGZpbmRVc2VyYCByZWplY3RlZCwgYHJlYXNvbmAg d2lsbCBiZSAiYGZpbmRVc2VyYCByZWplY3RlZCBhbmQgd2UncmUgdW5oYXBw eSIuCiAgICAgIH0pOwogICAgICBgYGAKICAgICAgSWYgdGhlIGRvd25zdHJl YW0gcHJvbWlzZSBkb2VzIG5vdCBzcGVjaWZ5IGEgcmVqZWN0aW9uIGhhbmRs ZXIsIHJlamVjdGlvbiByZWFzb25zIHdpbGwgYmUgcHJvcGFnYXRlZCBmdXJ0 aGVyIGRvd25zdHJlYW0uCgogICAgICBgYGBqcwogICAgICBmaW5kVXNlcigp LnRoZW4oZnVuY3Rpb24gKHVzZXIpIHsKICAgICAgICB0aHJvdyBuZXcgUGVk YWdvZ2ljYWxFeGNlcHRpb24oIlVwc3RyZWFtIGVycm9yIik7CiAgICAgIH0p LnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgLy8gbmV2ZXIgcmVh Y2hlZAogICAgICB9KS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAg IC8vIG5ldmVyIHJlYWNoZWQKICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikg ewogICAgICAgIC8vIFRoZSBgUGVkZ2Fnb2NpYWxFeGNlcHRpb25gIGlzIHBy b3BhZ2F0ZWQgYWxsIHRoZSB3YXkgZG93biB0byBoZXJlCiAgICAgIH0pOwog ICAgICBgYGAKCiAgICAgIEFzc2ltaWxhdGlvbgogICAgICAtLS0tLS0tLS0t LS0KCiAgICAgIFNvbWV0aW1lcyB0aGUgdmFsdWUgeW91IHdhbnQgdG8gcHJv cGFnYXRlIHRvIGEgZG93bnN0cmVhbSBwcm9taXNlIGNhbiBvbmx5IGJlCiAg ICAgIHJldHJpZXZlZCBhc3luY2hyb25vdXNseS4gVGhpcyBjYW4gYmUgYWNo aWV2ZWQgYnkgcmV0dXJuaW5nIGEgcHJvbWlzZSBpbiB0aGUKICAgICAgZnVs ZmlsbG1lbnQgb3IgcmVqZWN0aW9uIGhhbmRsZXIuIFRoZSBkb3duc3RyZWFt IHByb21pc2Ugd2lsbCB0aGVuIGJlIHBlbmRpbmcKICAgICAgdW50aWwgdGhl IHJldHVybmVkIHByb21pc2UgaXMgc2V0dGxlZC4gVGhpcyBpcyBjYWxsZWQg KmFzc2ltaWxhdGlvbiouCgogICAgICBgYGBqcwogICAgICBmaW5kVXNlcigp LnRoZW4oZnVuY3Rpb24gKHVzZXIpIHsKICAgICAgICByZXR1cm4gZmluZENv bW1lbnRzQnlBdXRob3IodXNlcik7CiAgICAgIH0pLnRoZW4oZnVuY3Rpb24g KGNvbW1lbnRzKSB7CiAgICAgICAgLy8gVGhlIHVzZXIncyBjb21tZW50cyBh cmUgbm93IGF2YWlsYWJsZQogICAgICB9KTsKICAgICAgYGBgCgogICAgICBJ ZiB0aGUgYXNzaW1saWF0ZWQgcHJvbWlzZSByZWplY3RzLCB0aGVuIHRoZSBk b3duc3RyZWFtIHByb21pc2Ugd2lsbCBhbHNvIHJlamVjdC4KCiAgICAgIGBg YGpzCiAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikgewog ICAgICAgIHJldHVybiBmaW5kQ29tbWVudHNCeUF1dGhvcih1c2VyKTsKICAg ICAgfSkudGhlbihmdW5jdGlvbiAoY29tbWVudHMpIHsKICAgICAgICAvLyBJ ZiBgZmluZENvbW1lbnRzQnlBdXRob3JgIGZ1bGZpbGxzLCB3ZSdsbCBoYXZl IHRoZSB2YWx1ZSBoZXJlCiAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsK ICAgICAgICAvLyBJZiBgZmluZENvbW1lbnRzQnlBdXRob3JgIHJlamVjdHMs IHdlJ2xsIGhhdmUgdGhlIHJlYXNvbiBoZXJlCiAgICAgIH0pOwogICAgICBg YGAKCiAgICAgIFNpbXBsZSBFeGFtcGxlCiAgICAgIC0tLS0tLS0tLS0tLS0t CgogICAgICBTeW5jaHJvbm91cyBFeGFtcGxlCgogICAgICBgYGBqYXZhc2Ny aXB0CiAgICAgIHZhciByZXN1bHQ7CgogICAgICB0cnkgewogICAgICAgIHJl c3VsdCA9IGZpbmRSZXN1bHQoKTsKICAgICAgICAvLyBzdWNjZXNzCiAgICAg IH0gY2F0Y2gocmVhc29uKSB7CiAgICAgICAgLy8gZmFpbHVyZQogICAgICB9 CiAgICAgIGBgYAoKICAgICAgRXJyYmFjayBFeGFtcGxlCgogICAgICBgYGBq cwogICAgICBmaW5kUmVzdWx0KGZ1bmN0aW9uKHJlc3VsdCwgZXJyKXsKICAg ICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAvLyBmYWlsdXJlCiAgICAgICAg fSBlbHNlIHsKICAgICAgICAgIC8vIHN1Y2Nlc3MKICAgICAgICB9CiAgICAg IH0pOwogICAgICBgYGAKCiAgICAgIFByb21pc2UgRXhhbXBsZTsKCiAgICAg IGBgYGphdmFzY3JpcHQKICAgICAgZmluZFJlc3VsdCgpLnRoZW4oZnVuY3Rp b24ocmVzdWx0KXsKICAgICAgICAvLyBzdWNjZXNzCiAgICAgIH0sIGZ1bmN0 aW9uKHJlYXNvbil7CiAgICAgICAgLy8gZmFpbHVyZQogICAgICB9KTsKICAg ICAgYGBgCgogICAgICBBZHZhbmNlZCBFeGFtcGxlCiAgICAgIC0tLS0tLS0t LS0tLS0tCgogICAgICBTeW5jaHJvbm91cyBFeGFtcGxlCgogICAgICBgYGBq YXZhc2NyaXB0CiAgICAgIHZhciBhdXRob3IsIGJvb2tzOwoKICAgICAgdHJ5 IHsKICAgICAgICBhdXRob3IgPSBmaW5kQXV0aG9yKCk7CiAgICAgICAgYm9v a3MgID0gZmluZEJvb2tzQnlBdXRob3IoYXV0aG9yKTsKICAgICAgICAvLyBz dWNjZXNzCiAgICAgIH0gY2F0Y2gocmVhc29uKSB7CiAgICAgICAgLy8gZmFp bHVyZQogICAgICB9CiAgICAgIGBgYAoKICAgICAgRXJyYmFjayBFeGFtcGxl CgogICAgICBgYGBqcwoKICAgICAgZnVuY3Rpb24gZm91bmRCb29rcyhib29r cykgewoKICAgICAgfQoKICAgICAgZnVuY3Rpb24gZmFpbHVyZShyZWFzb24p IHsKCiAgICAgIH0KCiAgICAgIGZpbmRBdXRob3IoZnVuY3Rpb24oYXV0aG9y LCBlcnIpewogICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgIGZhaWx1cmUo ZXJyKTsKICAgICAgICAgIC8vIGZhaWx1cmUKICAgICAgICB9IGVsc2Ugewog ICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZmluZEJvb29rc0J5QXV0aG9y KGF1dGhvciwgZnVuY3Rpb24oYm9va3MsIGVycikgewogICAgICAgICAgICAg IGlmIChlcnIpIHsKICAgICAgICAgICAgICAgIGZhaWx1cmUoZXJyKTsKICAg ICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdHJ5IHsKICAg ICAgICAgICAgICAgICAgZm91bmRCb29rcyhib29rcyk7CiAgICAgICAgICAg ICAgICB9IGNhdGNoKHJlYXNvbikgewogICAgICAgICAgICAgICAgICBmYWls dXJlKHJlYXNvbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAg fQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0gY2F0Y2goZXJyb3IpIHsK ICAgICAgICAgICAgZmFpbHVyZShlcnIpOwogICAgICAgICAgfQogICAgICAg ICAgLy8gc3VjY2VzcwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGBgYAoK ICAgICAgUHJvbWlzZSBFeGFtcGxlOwoKICAgICAgYGBgamF2YXNjcmlwdAog ICAgICBmaW5kQXV0aG9yKCkuCiAgICAgICAgdGhlbihmaW5kQm9va3NCeUF1 dGhvcikuCiAgICAgICAgdGhlbihmdW5jdGlvbihib29rcyl7CiAgICAgICAg ICAvLyBmb3VuZCBib29rcwogICAgICB9KS5jYXRjaChmdW5jdGlvbihyZWFz b24pewogICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nCiAgICAgIH0p OwogICAgICBgYGAKCiAgICAgIEBtZXRob2QgdGhlbgogICAgICBAcGFyYW0g e0Z1bmN0aW9ufSBvbkZ1bGZpbGxlZAogICAgICBAcGFyYW0ge0Z1bmN0aW9u fSBvblJlamVjdGVkCiAgICAgIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBvcHRp b25hbCBzdHJpbmcgZm9yIGxhYmVsaW5nIHRoZSBwcm9taXNlLgogICAgICBV c2VmdWwgZm9yIHRvb2xpbmcuCiAgICAgIEByZXR1cm4ge1Byb21pc2V9CiAg ICAqLwogICAgICB0aGVuOiBmdW5jdGlvbihvbkZ1bGZpbGxtZW50LCBvblJl amVjdGlvbiwgbGFiZWwpIHsKICAgICAgICB2YXIgcHJvbWlzZSA9IHRoaXM7 CiAgICAgICAgdGhpcy5fb25lcnJvciA9IG51bGw7CgogICAgICAgIHZhciB0 aGVuUHJvbWlzZSA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKG5vb3AsIGxhYmVs KTsKCiAgICAgICAgaWYgKHRoaXMuX3N0YXRlKSB7CiAgICAgICAgICB2YXIg Y2FsbGJhY2tzID0gYXJndW1lbnRzOwogICAgICAgICAgY29uZmlnLmFzeW5j KGZ1bmN0aW9uIGludm9rZVByb21pc2VDYWxsYmFjaygpIHsKICAgICAgICAg ICAgaW52b2tlQ2FsbGJhY2socHJvbWlzZS5fc3RhdGUsIHRoZW5Qcm9taXNl LCBjYWxsYmFja3NbcHJvbWlzZS5fc3RhdGUgLSAxXSwgcHJvbWlzZS5fZGV0 YWlsKTsKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAg ICBzdWJzY3JpYmUodGhpcywgdGhlblByb21pc2UsIG9uRnVsZmlsbG1lbnQs IG9uUmVqZWN0aW9uKTsKICAgICAgICB9CgogICAgICAgIGlmIChjb25maWcu aW5zdHJ1bWVudCkgewogICAgICAgICAgaW5zdHJ1bWVudCgnY2hhaW5lZCcs IHByb21pc2UsIHRoZW5Qcm9taXNlKTsKICAgICAgICB9CgogICAgICAgIHJl dHVybiB0aGVuUHJvbWlzZTsKICAgICAgfSwKCiAgICAvKioKICAgICAgYGNh dGNoYCBpcyBzaW1wbHkgc3VnYXIgZm9yIGB0aGVuKHVuZGVmaW5lZCwgb25S ZWplY3Rpb24pYCB3aGljaCBtYWtlcyBpdCB0aGUgc2FtZQogICAgICBhcyB0 aGUgY2F0Y2ggYmxvY2sgb2YgYSB0cnkvY2F0Y2ggc3RhdGVtZW50LgoKICAg ICAgYGBganMKICAgICAgZnVuY3Rpb24gZmluZEF1dGhvcigpewogICAgICAg IHRocm93IG5ldyBFcnJvcigiY291bGRuJ3QgZmluZCB0aGF0IGF1dGhvciIp OwogICAgICB9CgogICAgICAvLyBzeW5jaHJvbm91cwogICAgICB0cnkgewog ICAgICAgIGZpbmRBdXRob3IoKTsKICAgICAgfSBjYXRjaChyZWFzb24pIHsK ICAgICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZwogICAgICB9CgogICAg ICAvLyBhc3luYyB3aXRoIHByb21pc2VzCiAgICAgIGZpbmRBdXRob3IoKS5j YXRjaChmdW5jdGlvbihyZWFzb24pewogICAgICAgIC8vIHNvbWV0aGluZyB3 ZW50IHdyb25nCiAgICAgIH0pOwogICAgICBgYGAKCiAgICAgIEBtZXRob2Qg Y2F0Y2gKICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gb25SZWplY3Rpb24KICAg ICAgQHBhcmFtIHtTdHJpbmd9IGxhYmVsIG9wdGlvbmFsIHN0cmluZyBmb3Ig bGFiZWxpbmcgdGhlIHByb21pc2UuCiAgICAgIFVzZWZ1bCBmb3IgdG9vbGlu Zy4KICAgICAgQHJldHVybiB7UHJvbWlzZX0KICAgICovCiAgICAgICdjYXRj aCc6IGZ1bmN0aW9uKG9uUmVqZWN0aW9uLCBsYWJlbCkgewogICAgICAgIHJl dHVybiB0aGlzLnRoZW4obnVsbCwgb25SZWplY3Rpb24sIGxhYmVsKTsKICAg ICAgfSwKCiAgICAvKioKICAgICAgYGZpbmFsbHlgIHdpbGwgYmUgaW52b2tl ZCByZWdhcmRsZXNzIG9mIHRoZSBwcm9taXNlJ3MgZmF0ZSBqdXN0IGFzIG5h dGl2ZQogICAgICB0cnkvY2F0Y2gvZmluYWxseSBiZWhhdmVzCgogICAgICBT eW5jaHJvbm91cyBleGFtcGxlOgoKICAgICAgYGBganMKICAgICAgZmluZEF1 dGhvcigpIHsKICAgICAgICBpZiAoTWF0aC5yYW5kb20oKSA+IDAuNSkgewog ICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7CiAgICAgICAgfQogICAgICAg IHJldHVybiBuZXcgQXV0aG9yKCk7CiAgICAgIH0KCiAgICAgIHRyeSB7CiAg ICAgICAgcmV0dXJuIGZpbmRBdXRob3IoKTsgLy8gc3VjY2VlZCBvciBmYWls CiAgICAgIH0gY2F0Y2goZXJyb3IpIHsKICAgICAgICByZXR1cm4gZmluZE90 aGVyQXV0aGVyKCk7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgLy8gYWx3 YXlzIHJ1bnMKICAgICAgICAvLyBkb2Vzbid0IGFmZmVjdCB0aGUgcmV0dXJu IHZhbHVlCiAgICAgIH0KICAgICAgYGBgCgogICAgICBBc3luY2hyb25vdXMg ZXhhbXBsZToKCiAgICAgIGBgYGpzCiAgICAgIGZpbmRBdXRob3IoKS5jYXRj aChmdW5jdGlvbihyZWFzb24pewogICAgICAgIHJldHVybiBmaW5kT3RoZXJB dXRoZXIoKTsKICAgICAgfSkuZmluYWxseShmdW5jdGlvbigpewogICAgICAg IC8vIGF1dGhvciB3YXMgZWl0aGVyIGZvdW5kLCBvciBub3QKICAgICAgfSk7 CiAgICAgIGBgYAoKICAgICAgQG1ldGhvZCBmaW5hbGx5CiAgICAgIEBwYXJh bSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgIEBwYXJhbSB7U3RyaW5nfSBs YWJlbCBvcHRpb25hbCBzdHJpbmcgZm9yIGxhYmVsaW5nIHRoZSBwcm9taXNl LgogICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuCiAgICAgIEByZXR1cm4ge1By b21pc2V9CiAgICAqLwogICAgICAnZmluYWxseSc6IGZ1bmN0aW9uKGNhbGxi YWNrLCBsYWJlbCkgewogICAgICAgIHZhciBjb25zdHJ1Y3RvciA9IHRoaXMu Y29uc3RydWN0b3I7CgogICAgICAgIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rp b24odmFsdWUpIHsKICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5jYXN0 KGNhbGxiYWNrKCkpLnRoZW4oZnVuY3Rpb24oKXsKICAgICAgICAgICAgcmV0 dXJuIHZhbHVlOwogICAgICAgICAgfSk7CiAgICAgICAgfSwgZnVuY3Rpb24o cmVhc29uKSB7CiAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3IuY2FzdChj YWxsYmFjaygpKS50aGVuKGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIHRocm93 IHJlYXNvbjsKICAgICAgICAgIH0pOwogICAgICAgIH0sIGxhYmVsKTsKICAg ICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBpbnZva2VDYWxsYmFjayhzZXR0 bGVkLCBwcm9taXNlLCBjYWxsYmFjaywgZGV0YWlsKSB7CiAgICAgIHZhciBo YXNDYWxsYmFjayA9IGlzRnVuY3Rpb24oY2FsbGJhY2spLAogICAgICAgICAg dmFsdWUsIGVycm9yLCBzdWNjZWVkZWQsIGZhaWxlZDsKCiAgICAgIGlmICho YXNDYWxsYmFjaykgewogICAgICAgIHRyeSB7CiAgICAgICAgICB2YWx1ZSA9 IGNhbGxiYWNrKGRldGFpbCk7CiAgICAgICAgICBzdWNjZWVkZWQgPSB0cnVl OwogICAgICAgIH0gY2F0Y2goZSkgewogICAgICAgICAgZmFpbGVkID0gdHJ1 ZTsKICAgICAgICAgIGVycm9yID0gZTsKICAgICAgICB9CiAgICAgIH0gZWxz ZSB7CiAgICAgICAgdmFsdWUgPSBkZXRhaWw7CiAgICAgICAgc3VjY2VlZGVk ID0gdHJ1ZTsKICAgICAgfQoKICAgICAgaWYgKGhhbmRsZVRoZW5hYmxlKHBy b21pc2UsIHZhbHVlKSkgewogICAgICAgIHJldHVybjsKICAgICAgfSBlbHNl IGlmIChoYXNDYWxsYmFjayAmJiBzdWNjZWVkZWQpIHsKICAgICAgICByZXNv bHZlKHByb21pc2UsIHZhbHVlKTsKICAgICAgfSBlbHNlIGlmIChmYWlsZWQp IHsKICAgICAgICByZWplY3QocHJvbWlzZSwgZXJyb3IpOwogICAgICB9IGVs c2UgaWYgKHNldHRsZWQgPT09IEZVTEZJTExFRCkgewogICAgICAgIHJlc29s dmUocHJvbWlzZSwgdmFsdWUpOwogICAgICB9IGVsc2UgaWYgKHNldHRsZWQg PT09IFJFSkVDVEVEKSB7CiAgICAgICAgcmVqZWN0KHByb21pc2UsIHZhbHVl KTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGhhbmRsZVRoZW5hYmxl KHByb21pc2UsIHZhbHVlKSB7CiAgICAgIHZhciB0aGVuID0gbnVsbCwKICAg ICAgcmVzb2x2ZWQ7CgogICAgICB0cnkgewogICAgICAgIGlmIChwcm9taXNl ID09PSB2YWx1ZSkgewogICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigi QSBwcm9taXNlcyBjYWxsYmFjayBjYW5ub3QgcmV0dXJuIHRoYXQgc2FtZSBw cm9taXNlLiIpOwogICAgICAgIH0KCiAgICAgICAgaWYgKG9iamVjdE9yRnVu Y3Rpb24odmFsdWUpKSB7CiAgICAgICAgICB0aGVuID0gdmFsdWUudGhlbjsK CiAgICAgICAgICBpZiAoaXNGdW5jdGlvbih0aGVuKSkgewogICAgICAgICAg ICB0aGVuLmNhbGwodmFsdWUsIGZ1bmN0aW9uKHZhbCkgewogICAgICAgICAg ICAgIGlmIChyZXNvbHZlZCkgeyByZXR1cm4gdHJ1ZTsgfQogICAgICAgICAg ICAgIHJlc29sdmVkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgaWYgKHZhbHVl ICE9PSB2YWwpIHsKICAgICAgICAgICAgICAgIHJlc29sdmUocHJvbWlzZSwg dmFsKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAg ZnVsZmlsbChwcm9taXNlLCB2YWwpOwogICAgICAgICAgICAgIH0KICAgICAg ICAgICAgfSwgZnVuY3Rpb24odmFsKSB7CiAgICAgICAgICAgICAgaWYgKHJl c29sdmVkKSB7IHJldHVybiB0cnVlOyB9CiAgICAgICAgICAgICAgcmVzb2x2 ZWQgPSB0cnVlOwoKICAgICAgICAgICAgICByZWplY3QocHJvbWlzZSwgdmFs KTsKICAgICAgICAgICAgfSwgJ2Rlcml2ZWQgZnJvbTogJyArIChwcm9taXNl Ll9sYWJlbCB8fCAnIHVua25vd24gcHJvbWlzZScpKTsKCiAgICAgICAgICAg IHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBj YXRjaCAoZXJyb3IpIHsKICAgICAgICBpZiAocmVzb2x2ZWQpIHsgcmV0dXJu IHRydWU7IH0KICAgICAgICByZWplY3QocHJvbWlzZSwgZXJyb3IpOwogICAg ICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgICByZXR1cm4gZmFsc2U7 CiAgICB9CgogICAgZnVuY3Rpb24gcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSkg ewogICAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHsKICAgICAgICBmdWxm aWxsKHByb21pc2UsIHZhbHVlKTsKICAgICAgfSBlbHNlIGlmICghaGFuZGxl VGhlbmFibGUocHJvbWlzZSwgdmFsdWUpKSB7CiAgICAgICAgZnVsZmlsbChw cm9taXNlLCB2YWx1ZSk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBm dWxmaWxsKHByb21pc2UsIHZhbHVlKSB7CiAgICAgIGlmIChwcm9taXNlLl9z dGF0ZSAhPT0gUEVORElORykgeyByZXR1cm47IH0KICAgICAgcHJvbWlzZS5f c3RhdGUgPSBTRUFMRUQ7CiAgICAgIHByb21pc2UuX2RldGFpbCA9IHZhbHVl OwoKICAgICAgY29uZmlnLmFzeW5jKHB1Ymxpc2hGdWxmaWxsbWVudCwgcHJv bWlzZSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVqZWN0KHByb21pc2UsIHJl YXNvbikgewogICAgICBpZiAocHJvbWlzZS5fc3RhdGUgIT09IFBFTkRJTkcp IHsgcmV0dXJuOyB9CiAgICAgIHByb21pc2UuX3N0YXRlID0gU0VBTEVEOwog ICAgICBwcm9taXNlLl9kZXRhaWwgPSByZWFzb247CgogICAgICBjb25maWcu YXN5bmMocHVibGlzaFJlamVjdGlvbiwgcHJvbWlzZSk7CiAgICB9CgogICAg ZnVuY3Rpb24gcHVibGlzaEZ1bGZpbGxtZW50KHByb21pc2UpIHsKICAgICAg cHVibGlzaChwcm9taXNlLCBwcm9taXNlLl9zdGF0ZSA9IEZVTEZJTExFRCk7 CiAgICB9CgogICAgZnVuY3Rpb24gcHVibGlzaFJlamVjdGlvbihwcm9taXNl KSB7CiAgICAgIGlmIChwcm9taXNlLl9vbmVycm9yKSB7CiAgICAgICAgcHJv bWlzZS5fb25lcnJvcihwcm9taXNlLl9kZXRhaWwpOwogICAgICB9CgogICAg ICBwdWJsaXNoKHByb21pc2UsIHByb21pc2UuX3N0YXRlID0gUkVKRUNURUQp OwogICAgfQogIH0pOwpkZWZpbmUoInJzdnAvcHJvbWlzZS9hbGwiLCAKICBb Ii4uL3V0aWxzIiwiZXhwb3J0cyJdLAogIGZ1bmN0aW9uKF9fZGVwZW5kZW5j eTFfXywgX19leHBvcnRzX18pIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZh ciBpc0FycmF5ID0gX19kZXBlbmRlbmN5MV9fLmlzQXJyYXk7CiAgICB2YXIg aXNOb25UaGVuYWJsZSA9IF9fZGVwZW5kZW5jeTFfXy5pc05vblRoZW5hYmxl OwoKICAgIC8qKgogICAgICBgUlNWUC5Qcm9taXNlLmFsbGAgYWNjZXB0cyBh biBhcnJheSBvZiBwcm9taXNlcywgYW5kIHJldHVybnMgYSBuZXcgcHJvbWlz ZSB3aGljaAogICAgICBpcyBmdWxmaWxsZWQgd2l0aCBhbiBhcnJheSBvZiBm dWxmaWxsbWVudCB2YWx1ZXMgZm9yIHRoZSBwYXNzZWQgcHJvbWlzZXMsIG9y CiAgICAgIHJlamVjdGVkIHdpdGggdGhlIHJlYXNvbiBvZiB0aGUgZmlyc3Qg cGFzc2VkIHByb21pc2UgdG8gYmUgcmVqZWN0ZWQuIEl0IGNhc3RzIGFsbAog ICAgICBlbGVtZW50cyBvZiB0aGUgcGFzc2VkIGl0ZXJhYmxlIHRvIHByb21p c2VzIGFzIGl0IHJ1bnMgdGhpcyBhbGdvcml0aG0uCgogICAgICBFeGFtcGxl OgoKICAgICAgYGBgamF2YXNjcmlwdAogICAgICB2YXIgcHJvbWlzZTEgPSBS U1ZQLnJlc29sdmUoMSk7CiAgICAgIHZhciBwcm9taXNlMiA9IFJTVlAucmVz b2x2ZSgyKTsKICAgICAgdmFyIHByb21pc2UzID0gUlNWUC5yZXNvbHZlKDMp OwogICAgICB2YXIgcHJvbWlzZXMgPSBbIHByb21pc2UxLCBwcm9taXNlMiwg cHJvbWlzZTMgXTsKCiAgICAgIFJTVlAuUHJvbWlzZS5hbGwocHJvbWlzZXMp LnRoZW4oZnVuY3Rpb24oYXJyYXkpewogICAgICAgIC8vIFRoZSBhcnJheSBo ZXJlIHdvdWxkIGJlIFsgMSwgMiwgMyBdOwogICAgICB9KTsKICAgICAgYGBg CgogICAgICBJZiBhbnkgb2YgdGhlIGBwcm9taXNlc2AgZ2l2ZW4gdG8gYFJT VlAuYWxsYCBhcmUgcmVqZWN0ZWQsIHRoZSBmaXJzdCBwcm9taXNlCiAgICAg IHRoYXQgaXMgcmVqZWN0ZWQgd2lsbCBiZSBnaXZlbiBhcyBhbiBhcmd1bWVu dCB0byB0aGUgcmV0dXJuZWQgcHJvbWlzZXMncwogICAgICByZWplY3Rpb24g aGFuZGxlci4gRm9yIGV4YW1wbGU6CgogICAgICBFeGFtcGxlOgoKICAgICAg YGBgamF2YXNjcmlwdAogICAgICB2YXIgcHJvbWlzZTEgPSBSU1ZQLnJlc29s dmUoMSk7CiAgICAgIHZhciBwcm9taXNlMiA9IFJTVlAucmVqZWN0KG5ldyBF cnJvcigiMiIpKTsKICAgICAgdmFyIHByb21pc2UzID0gUlNWUC5yZWplY3Qo bmV3IEVycm9yKCIzIikpOwogICAgICB2YXIgcHJvbWlzZXMgPSBbIHByb21p c2UxLCBwcm9taXNlMiwgcHJvbWlzZTMgXTsKCiAgICAgIFJTVlAuUHJvbWlz ZS5hbGwocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24oYXJyYXkpewogICAgICAg IC8vIENvZGUgaGVyZSBuZXZlciBydW5zIGJlY2F1c2UgdGhlcmUgYXJlIHJl amVjdGVkIHByb21pc2VzIQogICAgICB9LCBmdW5jdGlvbihlcnJvcikgewog ICAgICAgIC8vIGVycm9yLm1lc3NhZ2UgPT09ICIyIgogICAgICB9KTsKICAg ICAgYGBgCgogICAgICBAbWV0aG9kIGFsbAogICAgICBAZm9yIEVtYmVyLlJT VlAuUHJvbWlzZQogICAgICBAcGFyYW0ge0FycmF5fSBlbnRyaWVzIGFycmF5 IG9mIHByb21pc2VzCiAgICAgIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBvcHRp b25hbCBzdHJpbmcgZm9yIGxhYmVsaW5nIHRoZSBwcm9taXNlLgogICAgICBV c2VmdWwgZm9yIHRvb2xpbmcuCiAgICAgIEByZXR1cm4ge1Byb21pc2V9IHBy b21pc2UgdGhhdCBpcyBmdWxmaWxsZWQgd2hlbiBhbGwgYHByb21pc2VzYCBo YXZlIGJlZW4KICAgICAgZnVsZmlsbGVkLCBvciByZWplY3RlZCBpZiBhbnkg b2YgdGhlbSBiZWNvbWUgcmVqZWN0ZWQuCiAgICAgIEBzdGF0aWMKICAgICov CiAgICBfX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gZnVuY3Rpb24gYWxsKGVu dHJpZXMsIGxhYmVsKSB7CgogICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1 ZSAqLwogICAgICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzOwoKICAgICAgcmV0 dXJuIG5ldyBDb25zdHJ1Y3RvcihmdW5jdGlvbihyZXNvbHZlLCByZWplY3Qp IHsKICAgICAgICBpZiAoIWlzQXJyYXkoZW50cmllcykpIHsKICAgICAgICAg IHRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHBhc3MgYW4gYXJyYXkg dG8gYWxsLicpOwogICAgICAgIH0KCiAgICAgICAgdmFyIHJlbWFpbmluZyA9 IGVudHJpZXMubGVuZ3RoOwogICAgICAgIHZhciByZXN1bHRzID0gbmV3IEFy cmF5KHJlbWFpbmluZyk7CiAgICAgICAgdmFyIGVudHJ5LCBwZW5kaW5nID0g dHJ1ZTsKCiAgICAgICAgaWYgKHJlbWFpbmluZyA9PT0gMCkgewogICAgICAg ICAgcmVzb2x2ZShyZXN1bHRzKTsKICAgICAgICAgIHJldHVybjsKICAgICAg ICB9CgogICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxtZW50QXQoaW5kZXgpIHsK ICAgICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAg ICByZXN1bHRzW2luZGV4XSA9IHZhbHVlOwogICAgICAgICAgICBpZiAoLS1y ZW1haW5pbmcgPT09IDApIHsKICAgICAgICAgICAgICByZXNvbHZlKHJlc3Vs dHMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9OwogICAgICAgIH0KCiAg ICAgICAgZnVuY3Rpb24gb25SZWplY3Rpb24ocmVhc29uKSB7CiAgICAgICAg ICByZW1haW5pbmcgPSAwOwogICAgICAgICAgcmVqZWN0KHJlYXNvbik7CiAg ICAgICAgfQoKICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwg ZW50cmllcy5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgICAgIGVudHJ5ID0g ZW50cmllc1tpbmRleF07CiAgICAgICAgICBpZiAoaXNOb25UaGVuYWJsZShl bnRyeSkpIHsKICAgICAgICAgICAgcmVzdWx0c1tpbmRleF0gPSBlbnRyeTsK ICAgICAgICAgICAgaWYgKC0tcmVtYWluaW5nID09PSAwKSB7CiAgICAgICAg ICAgICAgcmVzb2x2ZShyZXN1bHRzKTsKICAgICAgICAgICAgfQogICAgICAg ICAgfSBlbHNlIHsKICAgICAgICAgICAgQ29uc3RydWN0b3IuY2FzdChlbnRy eSkudGhlbihmdWxmaWxsbWVudEF0KGluZGV4KSwgb25SZWplY3Rpb24pOwog ICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwgbGFiZWwpOwogICAgfTsK ICB9KTsKZGVmaW5lKCJyc3ZwL3Byb21pc2UvY2FzdCIsIAogIFsiZXhwb3J0 cyJdLAogIGZ1bmN0aW9uKF9fZXhwb3J0c19fKSB7CiAgICAidXNlIHN0cmlj dCI7CiAgICAvKioKICAgICAgYFJTVlAuUHJvbWlzZS5jYXN0YCBjb2VyY2Vz IGl0cyBhcmd1bWVudCB0byBhIHByb21pc2UsIG9yIHJldHVybnMgdGhlCiAg ICAgIGFyZ3VtZW50IGlmIGl0IGlzIGFscmVhZHkgYSBwcm9taXNlIHdoaWNo IHNoYXJlcyBhIGNvbnN0cnVjdG9yIHdpdGggdGhlIGNhc3Rlci4KCiAgICAg IEV4YW1wbGU6CgogICAgICBgYGBqYXZhc2NyaXB0CiAgICAgIHZhciBwcm9t aXNlID0gUlNWUC5Qcm9taXNlLnJlc29sdmUoMSk7CiAgICAgIHZhciBjYXN0 ZWQgPSBSU1ZQLlByb21pc2UuY2FzdChwcm9taXNlKTsKCiAgICAgIGNvbnNv bGUubG9nKHByb21pc2UgPT09IGNhc3RlZCk7IC8vIHRydWUKICAgICAgYGBg CgogICAgICBJbiB0aGUgY2FzZSBvZiBhIHByb21pc2Ugd2hvc2UgY29uc3Ry dWN0b3IgZG9lcyBub3QgbWF0Y2gsIGl0IGlzIGFzc2ltaWxhdGVkLgogICAg ICBUaGUgcmVzdWx0aW5nIHByb21pc2Ugd2lsbCBmdWxmaWxsIG9yIHJlamVj dCBiYXNlZCBvbiB0aGUgb3V0Y29tZSBvZiB0aGUKICAgICAgcHJvbWlzZSBi ZWluZyBjYXN0ZWQuCgogICAgICBFeGFtcGxlOgoKICAgICAgYGBgamF2YXNj cmlwdAogICAgICB2YXIgdGhlbm5hYmxlID0gJC5nZXRKU09OKCcvYXBpL2Zv bycpOwogICAgICB2YXIgY2FzdGVkID0gUlNWUC5Qcm9taXNlLmNhc3QodGhl bm5hYmxlKTsKCiAgICAgIGNvbnNvbGUubG9nKHRoZW5uYWJsZSA9PT0gY2Fz dGVkKTsgLy8gZmFsc2UKICAgICAgY29uc29sZS5sb2coY2FzdGVkIGluc3Rh bmNlb2YgUlNWUC5Qcm9taXNlKSAvLyB0cnVlCgogICAgICBjYXN0ZWQudGhl bihmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgLy8gZGF0YSBpcyB0aGUgdmFs dWUgZ2V0SlNPTiBmdWxmaWxscyB3aXRoCiAgICAgIH0pOwogICAgICBgYGAK CiAgICAgIEluIHRoZSBjYXNlIG9mIGEgbm9uLXByb21pc2UsIGEgcHJvbWlz ZSB3aGljaCB3aWxsIGZ1bGZpbGwgd2l0aCB0aGF0IHZhbHVlIGlzCiAgICAg IHJldHVybmVkLgoKICAgICAgRXhhbXBsZToKCiAgICAgIGBgYGphdmFzY3Jp cHQKICAgICAgdmFyIHZhbHVlID0gMTsgLy8gY291bGQgYmUgYSBudW1iZXIs IGJvb2xlYW4sIHN0cmluZywgdW5kZWZpbmVkLi4uCiAgICAgIHZhciBjYXN0 ZWQgPSBSU1ZQLlByb21pc2UuY2FzdCh2YWx1ZSk7CgogICAgICBjb25zb2xl LmxvZyh2YWx1ZSA9PT0gY2FzdGVkKTsgLy8gZmFsc2UKICAgICAgY29uc29s ZS5sb2coY2FzdGVkIGluc3RhbmNlb2YgUlNWUC5Qcm9taXNlKSAvLyB0cnVl CgogICAgICBjYXN0ZWQudGhlbihmdW5jdGlvbih2YWwpIHsKICAgICAgICB2 YWwgPT09IHZhbHVlIC8vID0+IHRydWUKICAgICAgfSk7CiAgICAgIGBgYAoK ICAgICAgYFJTVlAuUHJvbWlzZS5jYXN0YCBpcyBzaW1pbGFyIHRvIGBSU1ZQ LlByb21pc2UucmVzb2x2ZWAsIGJ1dCBgUlNWUC5Qcm9taXNlLmNhc3RgIGRp ZmZlcnMgaW4gdGhlCiAgICAgIGZvbGxvd2luZyB3YXlzOgoKICAgICAgKiBg UlNWUC5Qcm9taXNlLmNhc3RgIHNlcnZlcyBhcyBhIG1lbW9yeS1lZmZpY2ll bnQgd2F5IG9mIGdldHRpbmcgYSBwcm9taXNlLCB3aGVuIHlvdQogICAgICBo YXZlIHNvbWV0aGluZyB0aGF0IGNvdWxkIGVpdGhlciBiZSBhIHByb21pc2Ug b3IgYSB2YWx1ZS4gUlNWUC5yZXNvbHZlCiAgICAgIHdpbGwgaGF2ZSB0aGUg c2FtZSBlZmZlY3QgYnV0IHdpbGwgY3JlYXRlIGEgbmV3IHByb21pc2Ugd3Jh cHBlciBpZiB0aGUKICAgICAgYXJndW1lbnQgaXMgYSBwcm9taXNlLgogICAg ICAqIGBSU1ZQLlByb21pc2UuY2FzdGAgaXMgYSB3YXkgb2YgY2FzdGluZyBp bmNvbWluZyB0aGVuYWJsZXMgb3IgcHJvbWlzZSBzdWJjbGFzc2VzIHRvCiAg ICAgIHByb21pc2VzIG9mIHRoZSBleGFjdCBjbGFzcyBzcGVjaWZpZWQsIHNv IHRoYXQgdGhlIHJlc3VsdGluZyBvYmplY3QncyBgdGhlbmAgaXMKICAgICAg ZW5zdXJlZCB0byBoYXZlIHRoZSBiZWhhdmlvciBvZiB0aGUgY29uc3RydWN0 b3IgeW91IGFyZSBjYWxsaW5nIGNhc3Qgb24gKGkuZS4sIFJTVlAuUHJvbWlz ZSkuCgogICAgICBAbWV0aG9kIGNhc3QKICAgICAgQHBhcmFtIHtPYmplY3R9 IG9iamVjdCB0byBiZSBjYXN0ZWQKICAgICAgQHBhcmFtIHtTdHJpbmd9IGxh YmVsIG9wdGlvbmFsIHN0cmluZyBmb3IgbGFiZWxpbmcgdGhlIHByb21pc2Uu CiAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy4KICAgICAgQHJldHVybiB7UHJv bWlzZX0gcHJvbWlzZQogICAgICBAc3RhdGljCiAgICAqLwoKICAgIF9fZXhw b3J0c19fWyJkZWZhdWx0Il0gPSBmdW5jdGlvbiBjYXN0KG9iamVjdCwgbGFi ZWwpIHsKICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi8KICAgICAg dmFyIENvbnN0cnVjdG9yID0gdGhpczsKCiAgICAgIGlmIChvYmplY3QgJiYg dHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0LmNvbnN0cnVj dG9yID09PSBDb25zdHJ1Y3RvcikgewogICAgICAgIHJldHVybiBvYmplY3Q7 CiAgICAgIH0KCiAgICAgIHJldHVybiBuZXcgQ29uc3RydWN0b3IoZnVuY3Rp b24ocmVzb2x2ZSkgewogICAgICAgIHJlc29sdmUob2JqZWN0KTsKICAgICAg fSwgbGFiZWwpOwogICAgfTsKICB9KTsKZGVmaW5lKCJyc3ZwL3Byb21pc2Uv cmFjZSIsIAogIFsiLi4vdXRpbHMiLCJleHBvcnRzIl0sCiAgZnVuY3Rpb24o X19kZXBlbmRlbmN5MV9fLCBfX2V4cG9ydHNfXykgewogICAgInVzZSBzdHJp Y3QiOwogICAgLyogZ2xvYmFsIHRvU3RyaW5nICovCgogICAgdmFyIGlzQXJy YXkgPSBfX2RlcGVuZGVuY3kxX18uaXNBcnJheTsKICAgIHZhciBpc0Z1bmN0 aW9uID0gX19kZXBlbmRlbmN5MV9fLmlzRnVuY3Rpb247CiAgICB2YXIgaXNO b25UaGVuYWJsZSA9IF9fZGVwZW5kZW5jeTFfXy5pc05vblRoZW5hYmxlOwoK ICAgIC8qKgogICAgICBgUlNWUC5Qcm9taXNlLnJhY2VgIHJldHVybnMgYSBu ZXcgcHJvbWlzZSB3aGljaCBpcyBzZXR0bGVkIGluIHRoZSBzYW1lIHdheSBh cyB0aGUKICAgICAgZmlyc3QgcGFzc2VkIHByb21pc2UgdG8gc2V0dGxlLgoK ICAgICAgRXhhbXBsZToKCiAgICAgIGBgYGphdmFzY3JpcHQKICAgICAgdmFy IHByb21pc2UxID0gbmV3IFJTVlAuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZl LCByZWplY3QpewogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAg ICAgICAgIHJlc29sdmUoInByb21pc2UgMSIpOwogICAgICAgIH0sIDIwMCk7 CiAgICAgIH0pOwoKICAgICAgdmFyIHByb21pc2UyID0gbmV3IFJTVlAuUHJv bWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgIHNldFRp bWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgIHJlc29sdmUoInByb21pc2Ug MiIpOwogICAgICAgIH0sIDEwMCk7CiAgICAgIH0pOwoKICAgICAgUlNWUC5Q cm9taXNlLnJhY2UoW3Byb21pc2UxLCBwcm9taXNlMl0pLnRoZW4oZnVuY3Rp b24ocmVzdWx0KXsKICAgICAgICAvLyByZXN1bHQgPT09ICJwcm9taXNlIDIi IGJlY2F1c2UgaXQgd2FzIHJlc29sdmVkIGJlZm9yZSBwcm9taXNlMQogICAg ICAgIC8vIHdhcyByZXNvbHZlZC4KICAgICAgfSk7CiAgICAgIGBgYAoKICAg ICAgYFJTVlAuUHJvbWlzZS5yYWNlYCBpcyBkZXRlcm1pbmlzdGljIGluIHRo YXQgb25seSB0aGUgc3RhdGUgb2YgdGhlIGZpcnN0CiAgICAgIHNldHRsZWQg cHJvbWlzZSBtYXR0ZXJzLiBGb3IgZXhhbXBsZSwgZXZlbiBpZiBvdGhlciBw cm9taXNlcyBnaXZlbiB0byB0aGUKICAgICAgYHByb21pc2VzYCBhcnJheSBh cmd1bWVudCBhcmUgcmVzb2x2ZWQsIGJ1dCB0aGUgZmlyc3Qgc2V0dGxlZCBw cm9taXNlIGhhcwogICAgICBiZWNvbWUgcmVqZWN0ZWQgYmVmb3JlIHRoZSBv dGhlciBwcm9taXNlcyBiZWNhbWUgZnVsZmlsbGVkLCB0aGUgcmV0dXJuZWQK ICAgICAgcHJvbWlzZSB3aWxsIGJlY29tZSByZWplY3RlZDoKCiAgICAgIGBg YGphdmFzY3JpcHQKICAgICAgdmFyIHByb21pc2UxID0gbmV3IFJTVlAuUHJv bWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgIHNldFRp bWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgIHJlc29sdmUoInByb21pc2Ug MSIpOwogICAgICAgIH0sIDIwMCk7CiAgICAgIH0pOwoKICAgICAgdmFyIHBy b21pc2UyID0gbmV3IFJTVlAuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCBy ZWplY3QpewogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAg ICAgIHJlamVjdChuZXcgRXJyb3IoInByb21pc2UgMiIpKTsKICAgICAgICB9 LCAxMDApOwogICAgICB9KTsKCiAgICAgIFJTVlAuUHJvbWlzZS5yYWNlKFtw cm9taXNlMSwgcHJvbWlzZTJdKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCl7CiAg ICAgICAgLy8gQ29kZSBoZXJlIG5ldmVyIHJ1bnMKICAgICAgfSwgZnVuY3Rp b24ocmVhc29uKXsKICAgICAgICAvLyByZWFzb24ubWVzc2FnZSA9PT0gInBy b21pc2UyIiBiZWNhdXNlIHByb21pc2UgMiBiZWNhbWUgcmVqZWN0ZWQgYmVm b3JlCiAgICAgICAgLy8gcHJvbWlzZSAxIGJlY2FtZSBmdWxmaWxsZWQKICAg ICAgfSk7CiAgICAgIGBgYAoKICAgICAgQW4gZXhhbXBsZSByZWFsLXdvcmxk IHVzZSBjYXNlIGlzIGltcGxlbWVudGluZyB0aW1lb3V0czoKCiAgICAgIGBg YGphdmFzY3JpcHQKICAgICAgUlNWUC5Qcm9taXNlLnJhY2UoW2FqYXgoJ2Zv by5qc29uJyksIHRpbWVvdXQoNTAwMCldKQogICAgICBgYGAKCiAgICAgIEBt ZXRob2QgcmFjZQogICAgICBAcGFyYW0ge0FycmF5fSBwcm9taXNlcyBhcnJh eSBvZiBwcm9taXNlcyB0byBvYnNlcnZlCiAgICAgIEBwYXJhbSB7U3RyaW5n fSBsYWJlbCBvcHRpb25hbCBzdHJpbmcgZm9yIGRlc2NyaWJpbmcgdGhlIHBy b21pc2UgcmV0dXJuZWQuCiAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy4KICAg ICAgQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIHdoaWNoIHNldHRsZXMg aW4gdGhlIHNhbWUgd2F5IGFzIHRoZSBmaXJzdCBwYXNzZWQKICAgICAgcHJv bWlzZSB0byBzZXR0bGUuCiAgICAgIEBzdGF0aWMKICAgICovCiAgICBfX2V4 cG9ydHNfX1siZGVmYXVsdCJdID0gZnVuY3Rpb24gcmFjZShlbnRyaWVzLCBs YWJlbCkgewogICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqLwogICAg ICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzLCBlbnRyeTsKCiAgICAgIHJldHVy biBuZXcgQ29uc3RydWN0b3IoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7 CiAgICAgICAgaWYgKCFpc0FycmF5KGVudHJpZXMpKSB7CiAgICAgICAgICB0 aHJvdyBuZXcgVHlwZUVycm9yKCdZb3UgbXVzdCBwYXNzIGFuIGFycmF5IHRv IHJhY2UuJyk7CiAgICAgICAgfQoKICAgICAgICB2YXIgcGVuZGluZyA9IHRy dWU7CgogICAgICAgIGZ1bmN0aW9uIG9uRnVsZmlsbG1lbnQodmFsdWUpIHsg aWYgKHBlbmRpbmcpIHsgcGVuZGluZyA9IGZhbHNlOyByZXNvbHZlKHZhbHVl KTsgfSB9CiAgICAgICAgZnVuY3Rpb24gb25SZWplY3Rpb24ocmVhc29uKSAg eyBpZiAocGVuZGluZykgeyBwZW5kaW5nID0gZmFsc2U7IHJlamVjdChyZWFz b24pOyB9IH0KCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyaWVz Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBlbnRyeSA9IGVudHJpZXNbaV07 CiAgICAgICAgICBpZiAoaXNOb25UaGVuYWJsZShlbnRyeSkpIHsKICAgICAg ICAgICAgcGVuZGluZyA9IGZhbHNlOwogICAgICAgICAgICByZXNvbHZlKGVu dHJ5KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfSBlbHNlIHsK ICAgICAgICAgICAgQ29uc3RydWN0b3IuY2FzdChlbnRyeSkudGhlbihvbkZ1 bGZpbGxtZW50LCBvblJlamVjdGlvbik7CiAgICAgICAgICB9CiAgICAgICAg fQogICAgICB9LCBsYWJlbCk7CiAgICB9OwogIH0pOwpkZWZpbmUoInJzdnAv cHJvbWlzZS9yZWplY3QiLCAKICBbImV4cG9ydHMiXSwKICBmdW5jdGlvbihf X2V4cG9ydHNfXykgewogICAgInVzZSBzdHJpY3QiOwogICAgLyoqCiAgICAg IGBSU1ZQLlByb21pc2UucmVqZWN0YCByZXR1cm5zIGEgcHJvbWlzZSByZWpl Y3RlZCB3aXRoIHRoZSBwYXNzZWQgYHJlYXNvbmAuCiAgICAgIEl0IGlzIHNo b3J0aGFuZCBmb3IgdGhlIGZvbGxvd2luZzoKCiAgICAgIGBgYGphdmFzY3Jp cHQKICAgICAgdmFyIHByb21pc2UgPSBuZXcgUlNWUC5Qcm9taXNlKGZ1bmN0 aW9uKHJlc29sdmUsIHJlamVjdCl7CiAgICAgICAgcmVqZWN0KG5ldyBFcnJv cignV0hPT1BTJykpOwogICAgICB9KTsKCiAgICAgIHByb21pc2UudGhlbihm dW5jdGlvbih2YWx1ZSl7CiAgICAgICAgLy8gQ29kZSBoZXJlIGRvZXNuJ3Qg cnVuIGJlY2F1c2UgdGhlIHByb21pc2UgaXMgcmVqZWN0ZWQhCiAgICAgIH0s IGZ1bmN0aW9uKHJlYXNvbil7CiAgICAgICAgLy8gcmVhc29uLm1lc3NhZ2Ug PT09ICdXSE9PUFMnCiAgICAgIH0pOwogICAgICBgYGAKCiAgICAgIEluc3Rl YWQgb2Ygd3JpdGluZyB0aGUgYWJvdmUsIHlvdXIgY29kZSBub3cgc2ltcGx5 IGJlY29tZXMgdGhlIGZvbGxvd2luZzoKCiAgICAgIGBgYGphdmFzY3JpcHQK ICAgICAgdmFyIHByb21pc2UgPSBSU1ZQLlByb21pc2UucmVqZWN0KG5ldyBF cnJvcignV0hPT1BTJykpOwoKICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9u KHZhbHVlKXsKICAgICAgICAvLyBDb2RlIGhlcmUgZG9lc24ndCBydW4gYmVj YXVzZSB0aGUgcHJvbWlzZSBpcyByZWplY3RlZCEKICAgICAgfSwgZnVuY3Rp b24ocmVhc29uKXsKICAgICAgICAvLyByZWFzb24ubWVzc2FnZSA9PT0gJ1dI T09QUycKICAgICAgfSk7CiAgICAgIGBgYAoKICAgICAgQG1ldGhvZCByZWpl Y3QKICAgICAgQHBhcmFtIHtBbnl9IHJlYXNvbiB2YWx1ZSB0aGF0IHRoZSBy ZXR1cm5lZCBwcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQgd2l0aC4KICAgICAg QHBhcmFtIHtTdHJpbmd9IGxhYmVsIG9wdGlvbmFsIHN0cmluZyBmb3IgaWRl bnRpZnlpbmcgdGhlIHJldHVybmVkIHByb21pc2UuCiAgICAgIFVzZWZ1bCBm b3IgdG9vbGluZy4KICAgICAgQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNl IHJlamVjdGVkIHdpdGggdGhlIGdpdmVuIGByZWFzb25gLgogICAgICBAc3Rh dGljCiAgICAqLwogICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9IGZ1bmN0 aW9uIHJlamVjdChyZWFzb24sIGxhYmVsKSB7CiAgICAgIC8qanNoaW50IHZh bGlkdGhpczp0cnVlICovCiAgICAgIHZhciBDb25zdHJ1Y3RvciA9IHRoaXM7 CgogICAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNv bHZlLCByZWplY3QpIHsKICAgICAgICByZWplY3QocmVhc29uKTsKICAgICAg fSwgbGFiZWwpOwogICAgfTsKICB9KTsKZGVmaW5lKCJyc3ZwL3Byb21pc2Uv cmVzb2x2ZSIsIAogIFsiZXhwb3J0cyJdLAogIGZ1bmN0aW9uKF9fZXhwb3J0 c19fKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICAvKioKICAgICAgYFJTVlAu UHJvbWlzZS5yZXNvbHZlYCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwg YmVjb21lIHJlc29sdmVkIHdpdGggdGhlCiAgICAgIHBhc3NlZCBgdmFsdWVg LiBJdCBpcyBzaG9ydGhhbmQgZm9yIHRoZSBmb2xsb3dpbmc6CgogICAgICBg YGBqYXZhc2NyaXB0CiAgICAgIHZhciBwcm9taXNlID0gbmV3IFJTVlAuUHJv bWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgIHJlc29s dmUoMSk7CiAgICAgIH0pOwoKICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9u KHZhbHVlKXsKICAgICAgICAvLyB2YWx1ZSA9PT0gMQogICAgICB9KTsKICAg ICAgYGBgCgogICAgICBJbnN0ZWFkIG9mIHdyaXRpbmcgdGhlIGFib3ZlLCB5 b3VyIGNvZGUgbm93IHNpbXBseSBiZWNvbWVzIHRoZSBmb2xsb3dpbmc6Cgog ICAgICBgYGBqYXZhc2NyaXB0CiAgICAgIHZhciBwcm9taXNlID0gUlNWUC5Q cm9taXNlLnJlc29sdmUoMSk7CgogICAgICBwcm9taXNlLnRoZW4oZnVuY3Rp b24odmFsdWUpewogICAgICAgIC8vIHZhbHVlID09PSAxCiAgICAgIH0pOwog ICAgICBgYGAKCiAgICAgIEBtZXRob2QgcmVzb2x2ZQogICAgICBAcGFyYW0g e0FueX0gdmFsdWUgdmFsdWUgdGhhdCB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3 aWxsIGJlIHJlc29sdmVkIHdpdGgKICAgICAgQHBhcmFtIHtTdHJpbmd9IGxh YmVsIG9wdGlvbmFsIHN0cmluZyBmb3IgaWRlbnRpZnlpbmcgdGhlIHJldHVy bmVkIHByb21pc2UuCiAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy4KICAgICAg QHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIHRoYXQgd2lsbCBiZWNvbWUg ZnVsZmlsbGVkIHdpdGggdGhlIGdpdmVuCiAgICAgIGB2YWx1ZWAKICAgICAg QHN0YXRpYwogICAgKi8KICAgIF9fZXhwb3J0c19fWyJkZWZhdWx0Il0gPSBm dW5jdGlvbiByZXNvbHZlKHZhbHVlLCBsYWJlbCkgewogICAgICAvKmpzaGlu dCB2YWxpZHRoaXM6dHJ1ZSAqLwogICAgICB2YXIgQ29uc3RydWN0b3IgPSB0 aGlzOwoKICAgICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3RvcihmdW5jdGlvbihy ZXNvbHZlLCByZWplY3QpIHsKICAgICAgICByZXNvbHZlKHZhbHVlKTsKICAg ICAgfSwgbGFiZWwpOwogICAgfTsKICB9KTsKZGVmaW5lKCJyc3ZwL3JhY2Ui LCAKICBbIi4vcHJvbWlzZSIsImV4cG9ydHMiXSwKICBmdW5jdGlvbihfX2Rl cGVuZGVuY3kxX18sIF9fZXhwb3J0c19fKSB7CiAgICAidXNlIHN0cmljdCI7 CiAgICB2YXIgUHJvbWlzZSA9IF9fZGVwZW5kZW5jeTFfX1siZGVmYXVsdCJd OwoKICAgIC8qKgogICAgICBUaGlzIGlzIGEgY29udmVuaWVudCBhbGlhcyBm b3IgYFJTVlAuUHJvbWlzZS5yYWNlYC4KCiAgICAgIEBtZXRob2QgcmFjZQog ICAgICBAcGFyYW0ge0FycmF5fSBhcnJheSBBcnJheSBvZiBwcm9taXNlcy4K ICAgICAgQHBhcmFtIHtTdHJpbmd9IGxhYmVsIEFuIG9wdGlvbmFsIGxhYmVs LiBUaGlzIGlzIHVzZWZ1bAogICAgICBmb3IgdG9vbGluZy4KICAgICAgQHN0 YXRpYwogICAgKi8KICAgIF9fZXhwb3J0c19fWyJkZWZhdWx0Il0gPSBmdW5j dGlvbiByYWNlKGFycmF5LCBsYWJlbCkgewogICAgICByZXR1cm4gUHJvbWlz ZS5yYWNlKGFycmF5LCBsYWJlbCk7CiAgICB9OwogIH0pOwpkZWZpbmUoInJz dnAvcmVqZWN0IiwgCiAgWyIuL3Byb21pc2UiLCJleHBvcnRzIl0sCiAgZnVu Y3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2V4cG9ydHNfXykgewogICAgInVz ZSBzdHJpY3QiOwogICAgdmFyIFByb21pc2UgPSBfX2RlcGVuZGVuY3kxX19b ImRlZmF1bHQiXTsKCiAgICAvKioKICAgICAgVGhpcyBpcyBhIGNvbnZlbmll bnQgYWxpYXMgZm9yIGBSU1ZQLlByb21pc2UucmVqZWN0YC4KCiAgICAgIEBt ZXRob2QgcmVqZWN0CiAgICAgIEBmb3IgUlNWUAogICAgICBAcGFyYW0ge0Fu eX0gcmVhc29uIHZhbHVlIHRoYXQgdGhlIHJldHVybmVkIHByb21pc2Ugd2ls bCBiZSByZWplY3RlZCB3aXRoLgogICAgICBAcGFyYW0ge1N0cmluZ30gbGFi ZWwgb3B0aW9uYWwgc3RyaW5nIGZvciBpZGVudGlmeWluZyB0aGUgcmV0dXJu ZWQgcHJvbWlzZS4KICAgICAgVXNlZnVsIGZvciB0b29saW5nLgogICAgICBA cmV0dXJuIHtQcm9taXNlfSBhIHByb21pc2UgcmVqZWN0ZWQgd2l0aCB0aGUg Z2l2ZW4gYHJlYXNvbmAuCiAgICAgIEBzdGF0aWMKICAgICovCiAgICBfX2V4 cG9ydHNfX1siZGVmYXVsdCJdID0gZnVuY3Rpb24gcmVqZWN0KHJlYXNvbiwg bGFiZWwpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlYXNvbiwg bGFiZWwpOwogICAgfTsKICB9KTsKZGVmaW5lKCJyc3ZwL3Jlc29sdmUiLCAK ICBbIi4vcHJvbWlzZSIsImV4cG9ydHMiXSwKICBmdW5jdGlvbihfX2RlcGVu ZGVuY3kxX18sIF9fZXhwb3J0c19fKSB7CiAgICAidXNlIHN0cmljdCI7CiAg ICB2YXIgUHJvbWlzZSA9IF9fZGVwZW5kZW5jeTFfX1siZGVmYXVsdCJdOwoK ICAgIC8qKgogICAgICBUaGlzIGlzIGEgY29udmVuaWVudCBhbGlhcyBmb3Ig YFJTVlAuUHJvbWlzZS5yZXNvbHZlYC4KCiAgICAgIEBtZXRob2QgcmVzb2x2 ZQogICAgICBAZm9yIFJTVlAKICAgICAgQHBhcmFtIHtBbnl9IHZhbHVlIHZh bHVlIHRoYXQgdGhlIHJldHVybmVkIHByb21pc2Ugd2lsbCBiZSByZXNvbHZl ZCB3aXRoCiAgICAgIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCBvcHRpb25hbCBz dHJpbmcgZm9yIGlkZW50aWZ5aW5nIHRoZSByZXR1cm5lZCBwcm9taXNlLgog ICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuCiAgICAgIEByZXR1cm4ge1Byb21p c2V9IGEgcHJvbWlzZSB0aGF0IHdpbGwgYmVjb21lIGZ1bGZpbGxlZCB3aXRo IHRoZSBnaXZlbgogICAgICBgdmFsdWVgCiAgICAgIEBzdGF0aWMKICAgICov CiAgICBfX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gZnVuY3Rpb24gcmVzb2x2 ZSh2YWx1ZSwgbGFiZWwpIHsKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2 ZSh2YWx1ZSwgbGFiZWwpOwogICAgfTsKICB9KTsKZGVmaW5lKCJyc3ZwL3Jl dGhyb3ciLCAKICBbImV4cG9ydHMiXSwKICBmdW5jdGlvbihfX2V4cG9ydHNf XykgewogICAgInVzZSBzdHJpY3QiOwogICAgLyoqCiAgICAgIGBSU1ZQLnJl dGhyb3dgIHdpbGwgcmV0aHJvdyBhbiBlcnJvciBvbiB0aGUgbmV4dCB0dXJu IG9mIHRoZSBKYXZhU2NyaXB0IGV2ZW50CiAgICAgIGxvb3AgaW4gb3JkZXIg dG8gYWlkIGRlYnVnZ2luZy4KCiAgICAgIFByb21pc2VzIEErIHNwZWNpZmll cyB0aGF0IGFueSBleGNlcHRpb25zIHRoYXQgb2NjdXIgd2l0aCBhIHByb21p c2UgbXVzdCBiZQogICAgICBjYXVnaHQgYnkgdGhlIHByb21pc2VzIGltcGxl bWVudGF0aW9uIGFuZCBidWJibGVkIHRvIHRoZSBsYXN0IGhhbmRsZXIuIEZv cgogICAgICB0aGlzIHJlYXNvbiwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5 b3UgYWx3YXlzIHNwZWNpZnkgYSBzZWNvbmQgcmVqZWN0aW9uCiAgICAgIGhh bmRsZXIgZnVuY3Rpb24gdG8gYHRoZW5gLiBIb3dldmVyLCBgUlNWUC5yZXRo cm93YCB3aWxsIHRocm93IHRoZSBleGNlcHRpb24KICAgICAgb3V0c2lkZSBv ZiB0aGUgcHJvbWlzZSwgc28gaXQgYnViYmxlcyB1cCB0byB5b3VyIGNvbnNv bGUgaWYgaW4gdGhlIGJyb3dzZXIsCiAgICAgIG9yIGRvbWFpbi9jYXVzZSB1 bmNhdWdodCBleGNlcHRpb24gaW4gTm9kZS4gYHJldGhyb3dgIHdpbGwgYWxz byB0aHJvdyB0aGUKICAgICAgZXJyb3IgYWdhaW4gc28gdGhlIGVycm9yIGNh biBiZSBoYW5kbGVkIGJ5IHRoZSBwcm9taXNlIHBlciB0aGUgc3BlYy4KCiAg ICAgIGBgYGphdmFzY3JpcHQKICAgICAgZnVuY3Rpb24gdGhyb3dzKCl7CiAg ICAgICAgdGhyb3cgbmV3IEVycm9yKCdXaG9vcHMhJyk7CiAgICAgIH0KCiAg ICAgIHZhciBwcm9taXNlID0gbmV3IFJTVlAuUHJvbWlzZShmdW5jdGlvbihy ZXNvbHZlLCByZWplY3QpewogICAgICAgIHRocm93cygpOwogICAgICB9KTsK CiAgICAgIHByb21pc2UuY2F0Y2goUlNWUC5yZXRocm93KS50aGVuKGZ1bmN0 aW9uKCl7CiAgICAgICAgLy8gQ29kZSBoZXJlIGRvZXNuJ3QgcnVuIGJlY2F1 c2UgdGhlIHByb21pc2UgYmVjYW1lIHJlamVjdGVkIGR1ZSB0byBhbgogICAg ICAgIC8vIGVycm9yIQogICAgICB9LCBmdW5jdGlvbiAoZXJyKXsKICAgICAg ICAvLyBoYW5kbGUgdGhlIGVycm9yIGhlcmUKICAgICAgfSk7CiAgICAgIGBg YAoKICAgICAgVGhlICdXaG9vcHMnIGVycm9yIHdpbGwgYmUgdGhyb3duIG9u IHRoZSBuZXh0IHR1cm4gb2YgdGhlIGV2ZW50IGxvb3AKICAgICAgYW5kIHlv dSBjYW4gd2F0Y2ggZm9yIGl0IGluIHlvdXIgY29uc29sZS4gWW91IGNhbiBh bHNvIGhhbmRsZSBpdCB1c2luZyBhCiAgICAgIHJlamVjdGlvbiBoYW5kbGVy IGdpdmVuIHRvIGAudGhlbmAgb3IgYC5jYXRjaGAgb24gdGhlIHJldHVybmVk IHByb21pc2UuCgogICAgICBAbWV0aG9kIHJldGhyb3cKICAgICAgQGZvciBS U1ZQCiAgICAgIEBwYXJhbSB7RXJyb3J9IHJlYXNvbiByZWFzb24gdGhlIHBy b21pc2UgYmVjYW1lIHJlamVjdGVkLgogICAgICBAdGhyb3dzIEVycm9yCiAg ICAgIEBzdGF0aWMKICAgICovCiAgICBfX2V4cG9ydHNfX1siZGVmYXVsdCJd ID0gZnVuY3Rpb24gcmV0aHJvdyhyZWFzb24pIHsKICAgICAgc2V0VGltZW91 dChmdW5jdGlvbigpIHsKICAgICAgICB0aHJvdyByZWFzb247CiAgICAgIH0p OwogICAgICB0aHJvdyByZWFzb247CiAgICB9OwogIH0pOwpkZWZpbmUoInJz dnAvdXRpbHMiLCAKICBbImV4cG9ydHMiXSwKICBmdW5jdGlvbihfX2V4cG9y dHNfXykgewogICAgInVzZSBzdHJpY3QiOwogICAgZnVuY3Rpb24gb2JqZWN0 T3JGdW5jdGlvbih4KSB7CiAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gImZ1 bmN0aW9uIiB8fCAodHlwZW9mIHggPT09ICJvYmplY3QiICYmIHggIT09IG51 bGwpOwogICAgfQoKICAgIF9fZXhwb3J0c19fLm9iamVjdE9yRnVuY3Rpb24g PSBvYmplY3RPckZ1bmN0aW9uO2Z1bmN0aW9uIGlzRnVuY3Rpb24oeCkgewog ICAgICByZXR1cm4gdHlwZW9mIHggPT09ICJmdW5jdGlvbiI7CiAgICB9Cgog ICAgX19leHBvcnRzX18uaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247ZnVuY3Rp b24gaXNOb25UaGVuYWJsZSh4KSB7CiAgICAgIHJldHVybiAhb2JqZWN0T3JG dW5jdGlvbih4KTsKICAgIH0KCiAgICBfX2V4cG9ydHNfXy5pc05vblRoZW5h YmxlID0gaXNOb25UaGVuYWJsZTtmdW5jdGlvbiBpc0FycmF5KHgpIHsKICAg ICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KSA9 PT0gIltvYmplY3QgQXJyYXldIjsKICAgIH0KCiAgICBfX2V4cG9ydHNfXy5p c0FycmF5ID0gaXNBcnJheTsvLyBEYXRlLm5vdyBpcyBub3QgYXZhaWxhYmxl IGluIGJyb3dzZXJzIDwgSUU5CiAgICAvLyBodHRwczovL2RldmVsb3Blci5t b3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5j ZS9HbG9iYWxfT2JqZWN0cy9EYXRlL25vdyNDb21wYXRpYmlsaXR5CiAgICB2 YXIgbm93ID0gRGF0ZS5ub3cgfHwgZnVuY3Rpb24oKSB7IHJldHVybiBuZXcg RGF0ZSgpLmdldFRpbWUoKTsgfTsKICAgIF9fZXhwb3J0c19fLm5vdyA9IG5v dzsKICAgIHZhciBrZXlzT2YgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbihv YmplY3QpIHsKICAgICAgdmFyIHJlc3VsdCA9IFtdOwoKICAgICAgZm9yICh2 YXIgcHJvcCBpbiBvYmplY3QpIHsKICAgICAgICByZXN1bHQucHVzaChwcm9w KTsKICAgICAgfQoKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07CiAgICBf X2V4cG9ydHNfXy5rZXlzT2YgPSBrZXlzT2Y7CiAgfSk7CmRlZmluZSgicnN2 cCIsIAogIFsiLi9yc3ZwL3Byb21pc2UiLCIuL3JzdnAvZXZlbnRzIiwiLi9y c3ZwL25vZGUiLCIuL3JzdnAvYWxsIiwiLi9yc3ZwL2FsbF9zZXR0bGVkIiwi Li9yc3ZwL3JhY2UiLCIuL3JzdnAvaGFzaCIsIi4vcnN2cC9yZXRocm93Iiwi Li9yc3ZwL2RlZmVyIiwiLi9yc3ZwL2NvbmZpZyIsIi4vcnN2cC9tYXAiLCIu L3JzdnAvcmVzb2x2ZSIsIi4vcnN2cC9yZWplY3QiLCIuL3JzdnAvZmlsdGVy IiwiZXhwb3J0cyJdLAogIGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19k ZXBlbmRlbmN5Ml9fLCBfX2RlcGVuZGVuY3kzX18sIF9fZGVwZW5kZW5jeTRf XywgX19kZXBlbmRlbmN5NV9fLCBfX2RlcGVuZGVuY3k2X18sIF9fZGVwZW5k ZW5jeTdfXywgX19kZXBlbmRlbmN5OF9fLCBfX2RlcGVuZGVuY3k5X18sIF9f ZGVwZW5kZW5jeTEwX18sIF9fZGVwZW5kZW5jeTExX18sIF9fZGVwZW5kZW5j eTEyX18sIF9fZGVwZW5kZW5jeTEzX18sIF9fZGVwZW5kZW5jeTE0X18sIF9f ZXhwb3J0c19fKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgUHJvbWlz ZSA9IF9fZGVwZW5kZW5jeTFfX1siZGVmYXVsdCJdOwogICAgdmFyIEV2ZW50 VGFyZ2V0ID0gX19kZXBlbmRlbmN5Ml9fWyJkZWZhdWx0Il07CiAgICB2YXIg ZGVub2RlaWZ5ID0gX19kZXBlbmRlbmN5M19fWyJkZWZhdWx0Il07CiAgICB2 YXIgYWxsID0gX19kZXBlbmRlbmN5NF9fWyJkZWZhdWx0Il07CiAgICB2YXIg YWxsU2V0dGxlZCA9IF9fZGVwZW5kZW5jeTVfX1siZGVmYXVsdCJdOwogICAg dmFyIHJhY2UgPSBfX2RlcGVuZGVuY3k2X19bImRlZmF1bHQiXTsKICAgIHZh ciBoYXNoID0gX19kZXBlbmRlbmN5N19fWyJkZWZhdWx0Il07CiAgICB2YXIg cmV0aHJvdyA9IF9fZGVwZW5kZW5jeThfX1siZGVmYXVsdCJdOwogICAgdmFy IGRlZmVyID0gX19kZXBlbmRlbmN5OV9fWyJkZWZhdWx0Il07CiAgICB2YXIg Y29uZmlnID0gX19kZXBlbmRlbmN5MTBfXy5jb25maWc7CiAgICB2YXIgY29u ZmlndXJlID0gX19kZXBlbmRlbmN5MTBfXy5jb25maWd1cmU7CiAgICB2YXIg bWFwID0gX19kZXBlbmRlbmN5MTFfX1siZGVmYXVsdCJdOwogICAgdmFyIHJl c29sdmUgPSBfX2RlcGVuZGVuY3kxMl9fWyJkZWZhdWx0Il07CiAgICB2YXIg cmVqZWN0ID0gX19kZXBlbmRlbmN5MTNfX1siZGVmYXVsdCJdOwogICAgdmFy IGZpbHRlciA9IF9fZGVwZW5kZW5jeTE0X19bImRlZmF1bHQiXTsKCiAgICBm dW5jdGlvbiBhc3luYyhjYWxsYmFjaywgYXJnKSB7CiAgICAgIGNvbmZpZy5h c3luYyhjYWxsYmFjaywgYXJnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBvbigp IHsKICAgICAgY29uZmlnLm9uLmFwcGx5KGNvbmZpZywgYXJndW1lbnRzKTsK ICAgIH0KCiAgICBmdW5jdGlvbiBvZmYoKSB7CiAgICAgIGNvbmZpZy5vZmYu YXBwbHkoY29uZmlnLCBhcmd1bWVudHMpOwogICAgfQoKICAgIC8vIFNldCB1 cCBpbnN0cnVtZW50YXRpb24gdGhyb3VnaCBgd2luZG93Ll9fUFJPTUlTRV9J TlRSVU1FTlRBVElPTl9fYAogICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1 bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuX19QUk9NSVNFX0lOU1RSVU1F TlRBVElPTl9fID09PSAnb2JqZWN0JykgewogICAgICB2YXIgY2FsbGJhY2tz ID0gd2luZG93Ll9fUFJPTUlTRV9JTlNUUlVNRU5UQVRJT05fXzsKICAgICAg Y29uZmlndXJlKCdpbnN0cnVtZW50JywgdHJ1ZSk7CiAgICAgIGZvciAodmFy IGV2ZW50TmFtZSBpbiBjYWxsYmFja3MpIHsKICAgICAgICBpZiAoY2FsbGJh Y2tzLmhhc093blByb3BlcnR5KGV2ZW50TmFtZSkpIHsKICAgICAgICAgIG9u KGV2ZW50TmFtZSwgY2FsbGJhY2tzW2V2ZW50TmFtZV0pOwogICAgICAgIH0K ICAgICAgfQogICAgfQoKICAgIF9fZXhwb3J0c19fLlByb21pc2UgPSBQcm9t aXNlOwogICAgX19leHBvcnRzX18uRXZlbnRUYXJnZXQgPSBFdmVudFRhcmdl dDsKICAgIF9fZXhwb3J0c19fLmFsbCA9IGFsbDsKICAgIF9fZXhwb3J0c19f LmFsbFNldHRsZWQgPSBhbGxTZXR0bGVkOwogICAgX19leHBvcnRzX18ucmFj ZSA9IHJhY2U7CiAgICBfX2V4cG9ydHNfXy5oYXNoID0gaGFzaDsKICAgIF9f ZXhwb3J0c19fLnJldGhyb3cgPSByZXRocm93OwogICAgX19leHBvcnRzX18u ZGVmZXIgPSBkZWZlcjsKICAgIF9fZXhwb3J0c19fLmRlbm9kZWlmeSA9IGRl bm9kZWlmeTsKICAgIF9fZXhwb3J0c19fLmNvbmZpZ3VyZSA9IGNvbmZpZ3Vy ZTsKICAgIF9fZXhwb3J0c19fLm9uID0gb247CiAgICBfX2V4cG9ydHNfXy5v ZmYgPSBvZmY7CiAgICBfX2V4cG9ydHNfXy5yZXNvbHZlID0gcmVzb2x2ZTsK ICAgIF9fZXhwb3J0c19fLnJlamVjdCA9IHJlamVjdDsKICAgIF9fZXhwb3J0 c19fLmFzeW5jID0gYXN5bmM7CiAgICBfX2V4cG9ydHNfXy5tYXAgPSBtYXA7 CiAgICBfX2V4cG9ydHNfXy5maWx0ZXIgPSBmaWx0ZXI7CiAgfSk7Cgp9KSgp OwoKKGZ1bmN0aW9uKCkgewpkZWZpbmUoImNvbnRhaW5lci9jb250YWluZXIi LCAKICBbImNvbnRhaW5lci9pbmhlcml0aW5nX2RpY3QiLCJleHBvcnRzIl0s CiAgZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2V4cG9ydHNfXykgewog ICAgInVzZSBzdHJpY3QiOwogICAgdmFyIEluaGVyaXRpbmdEaWN0ID0gX19k ZXBlbmRlbmN5MV9fWyJkZWZhdWx0Il07CgogICAgLy8gQSBsaWdodHdlaWdo dCBjb250YWluZXIgdGhhdCBoZWxwcyB0byBhc3NlbWJsZSBhbmQgZGVjb3Vw bGUgY29tcG9uZW50cy4KICAgIC8vIFB1YmxpYyBhcGkgZm9yIHRoZSBjb250 YWluZXIgaXMgc3RpbGwgaW4gZmx1eC4KICAgIC8vIFRoZSBwdWJsaWMgYXBp LCBzcGVjaWZpZWQgb24gdGhlIGFwcGxpY2F0aW9uIG5hbWVzcGFjZSBzaG91 bGQgYmUgY29uc2lkZXJlZCB0aGUgc3RhYmxlIGFwaS4KICAgIGZ1bmN0aW9u IENvbnRhaW5lcihwYXJlbnQpIHsKICAgICAgdGhpcy5wYXJlbnQgPSBwYXJl bnQ7CiAgICAgIHRoaXMuY2hpbGRyZW4gPSBbXTsKCiAgICAgIHRoaXMucmVz b2x2ZXIgPSBwYXJlbnQgJiYgcGFyZW50LnJlc29sdmVyIHx8IGZ1bmN0aW9u KCkge307CgogICAgICB0aGlzLnJlZ2lzdHJ5ID0gbmV3IEluaGVyaXRpbmdE aWN0KHBhcmVudCAmJiBwYXJlbnQucmVnaXN0cnkpOwogICAgICB0aGlzLmNh Y2hlID0gbmV3IEluaGVyaXRpbmdEaWN0KHBhcmVudCAmJiBwYXJlbnQuY2Fj aGUpOwogICAgICB0aGlzLmZhY3RvcnlDYWNoZSA9IG5ldyBJbmhlcml0aW5n RGljdChwYXJlbnQgJiYgcGFyZW50LmZhY3RvcnlDYWNoZSk7CiAgICAgIHRo aXMucmVzb2x2ZUNhY2hlID0gbmV3IEluaGVyaXRpbmdEaWN0KHBhcmVudCAm JiBwYXJlbnQucmVzb2x2ZUNhY2hlKTsKICAgICAgdGhpcy50eXBlSW5qZWN0 aW9ucyA9IG5ldyBJbmhlcml0aW5nRGljdChwYXJlbnQgJiYgcGFyZW50LnR5 cGVJbmplY3Rpb25zKTsKICAgICAgdGhpcy5pbmplY3Rpb25zID0ge307Cgog ICAgICB0aGlzLmZhY3RvcnlUeXBlSW5qZWN0aW9ucyA9IG5ldyBJbmhlcml0 aW5nRGljdChwYXJlbnQgJiYgcGFyZW50LmZhY3RvcnlUeXBlSW5qZWN0aW9u cyk7CiAgICAgIHRoaXMuZmFjdG9yeUluamVjdGlvbnMgPSB7fTsKCiAgICAg IHRoaXMuX29wdGlvbnMgPSBuZXcgSW5oZXJpdGluZ0RpY3QocGFyZW50ICYm IHBhcmVudC5fb3B0aW9ucyk7CiAgICAgIHRoaXMuX3R5cGVPcHRpb25zID0g bmV3IEluaGVyaXRpbmdEaWN0KHBhcmVudCAmJiBwYXJlbnQuX3R5cGVPcHRp b25zKTsKICAgIH0KCiAgICBDb250YWluZXIucHJvdG90eXBlID0gewoKICAg ICAgLyoqCiAgICAgICAgQHByb3BlcnR5IHBhcmVudAogICAgICAgIEB0eXBl IENvbnRhaW5lcgogICAgICAgIEBkZWZhdWx0IG51bGwKICAgICAgKi8KICAg ICAgcGFyZW50OiBudWxsLAoKICAgICAgLyoqCiAgICAgICAgQHByb3BlcnR5 IGNoaWxkcmVuCiAgICAgICAgQHR5cGUgQXJyYXkKICAgICAgICBAZGVmYXVs dCBbXQogICAgICAqLwogICAgICBjaGlsZHJlbjogbnVsbCwKCiAgICAgIC8q KgogICAgICAgIEBwcm9wZXJ0eSByZXNvbHZlcgogICAgICAgIEB0eXBlIGZ1 bmN0aW9uCiAgICAgICovCiAgICAgIHJlc29sdmVyOiBudWxsLAoKICAgICAg LyoqCiAgICAgICAgQHByb3BlcnR5IHJlZ2lzdHJ5CiAgICAgICAgQHR5cGUg SW5oZXJpdGluZ0RpY3QKICAgICAgKi8KICAgICAgcmVnaXN0cnk6IG51bGws CgogICAgICAvKioKICAgICAgICBAcHJvcGVydHkgY2FjaGUKICAgICAgICBA dHlwZSBJbmhlcml0aW5nRGljdAogICAgICAqLwogICAgICBjYWNoZTogbnVs bCwKCiAgICAgIC8qKgogICAgICAgIEBwcm9wZXJ0eSB0eXBlSW5qZWN0aW9u cwogICAgICAgIEB0eXBlIEluaGVyaXRpbmdEaWN0CiAgICAgICovCiAgICAg IHR5cGVJbmplY3Rpb25zOiBudWxsLAoKICAgICAgLyoqCiAgICAgICAgQHBy b3BlcnR5IGluamVjdGlvbnMKICAgICAgICBAdHlwZSBPYmplY3QKICAgICAg ICBAZGVmYXVsdCB7fQogICAgICAqLwogICAgICBpbmplY3Rpb25zOiBudWxs LAoKICAgICAgLyoqCiAgICAgICAgQHByaXZhdGUKCiAgICAgICAgQHByb3Bl cnR5IF9vcHRpb25zCiAgICAgICAgQHR5cGUgSW5oZXJpdGluZ0RpY3QKICAg ICAgICBAZGVmYXVsdCBudWxsCiAgICAgICovCiAgICAgIF9vcHRpb25zOiBu dWxsLAoKICAgICAgLyoqCiAgICAgICAgQHByaXZhdGUKCiAgICAgICAgQHBy b3BlcnR5IF90eXBlT3B0aW9ucwogICAgICAgIEB0eXBlIEluaGVyaXRpbmdE aWN0CiAgICAgICovCiAgICAgIF90eXBlT3B0aW9uczogbnVsbCwKCiAgICAg IC8qKgogICAgICAgIFJldHVybnMgYSBuZXcgY2hpbGQgb2YgdGhlIGN1cnJl bnQgY29udGFpbmVyLiBUaGVzZSBjaGlsZHJlbiBhcmUgY29uZmlndXJlZAog ICAgICAgIHRvIGNvcnJlY3RseSBpbmhlcml0IGZyb20gdGhlIGN1cnJlbnQg Y29udGFpbmVyLgoKICAgICAgICBAbWV0aG9kIGNoaWxkCiAgICAgICAgQHJl dHVybiB7Q29udGFpbmVyfQogICAgICAqLwogICAgICBjaGlsZDogZnVuY3Rp b24oKSB7CiAgICAgICAgdmFyIGNvbnRhaW5lciA9IG5ldyBDb250YWluZXIo dGhpcyk7CiAgICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNvbnRhaW5lcik7 CiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjsKICAgICAgfSwKCiAgICAgIC8q KgogICAgICAgIFNldHMgYSBrZXktdmFsdWUgcGFpciBvbiB0aGUgY3VycmVu dCBjb250YWluZXIuIElmIGEgcGFyZW50IGNvbnRhaW5lciwKICAgICAgICBo YXMgdGhlIHNhbWUga2V5LCBvbmNlIHNldCBvbiBhIGNoaWxkLCB0aGUgcGFy ZW50IGFuZCBjaGlsZCB3aWxsIGRpdmVyZ2UKICAgICAgICBhcyBleHBlY3Rl ZC4KCiAgICAgICAgQG1ldGhvZCBzZXQKICAgICAgICBAcGFyYW0ge09iamVj dH0gb2JqZWN0CiAgICAgICAgQHBhcmFtIHtTdHJpbmd9IGtleQogICAgICAg IEBwYXJhbSB7YW55fSB2YWx1ZQogICAgICAqLwogICAgICBzZXQ6IGZ1bmN0 aW9uKG9iamVjdCwga2V5LCB2YWx1ZSkgewogICAgICAgIG9iamVjdFtrZXld ID0gdmFsdWU7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICBSZWdpc3Rl cnMgYSBmYWN0b3J5IGZvciBsYXRlciBpbmplY3Rpb24uCgogICAgICAgIEV4 YW1wbGU6CgogICAgICAgIGBgYGphdmFzY3JpcHQKICAgICAgICB2YXIgY29u dGFpbmVyID0gbmV3IENvbnRhaW5lcigpOwoKICAgICAgICBjb250YWluZXIu cmVnaXN0ZXIoJ21vZGVsOnVzZXInLCBQZXJzb24sIHtzaW5nbGV0b246IGZh bHNlIH0pOwogICAgICAgIGNvbnRhaW5lci5yZWdpc3RlcignZnJ1aXQ6ZmF2 b3JpdGUnLCBPcmFuZ2UpOwogICAgICAgIGNvbnRhaW5lci5yZWdpc3Rlcign Y29tbXVuaWNhdGlvbjptYWluJywgRW1haWwsIHtzaW5nbGV0b246IGZhbHNl fSk7CiAgICAgICAgYGBgCgogICAgICAgIEBtZXRob2QgcmVnaXN0ZXIKICAg ICAgICBAcGFyYW0ge1N0cmluZ30gZnVsbE5hbWUKICAgICAgICBAcGFyYW0g e0Z1bmN0aW9ufSBmYWN0b3J5CiAgICAgICAgQHBhcmFtIHtPYmplY3R9IG9w dGlvbnMKICAgICAgKi8KICAgICAgcmVnaXN0ZXI6IGZ1bmN0aW9uKGZ1bGxO YW1lLCBmYWN0b3J5LCBvcHRpb25zKSB7CiAgICAgICAgdmFsaWRhdGVGdWxs TmFtZShmdWxsTmFtZSk7CgogICAgICAgIGlmIChmYWN0b3J5ID09PSB1bmRl ZmluZWQpIHsKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0F0dGVt cHRpbmcgdG8gcmVnaXN0ZXIgYW4gdW5rbm93biBmYWN0b3J5OiBgJyArIGZ1 bGxOYW1lICsgJ2AnKTsKICAgICAgICB9CgogICAgICAgIHZhciBub3JtYWxp emVkTmFtZSA9IHRoaXMubm9ybWFsaXplKGZ1bGxOYW1lKTsKCiAgICAgICAg aWYgKHRoaXMuY2FjaGUuaGFzKG5vcm1hbGl6ZWROYW1lKSkgewogICAgICAg ICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmUtcmVnaXN0ZXI6IGAnICsg ZnVsbE5hbWUgKydgLCBhcyBpdCBoYXMgYWxyZWFkeSBiZWVuIGxvb2tlZCB1 cC4nKTsKICAgICAgICB9CgogICAgICAgIHRoaXMucmVnaXN0cnkuc2V0KG5v cm1hbGl6ZWROYW1lLCBmYWN0b3J5KTsKICAgICAgICB0aGlzLl9vcHRpb25z LnNldChub3JtYWxpemVkTmFtZSwgb3B0aW9ucyB8fCB7fSk7CiAgICAgIH0s CgogICAgICAvKioKICAgICAgICBVbnJlZ2lzdGVyIGEgZnVsbE5hbWUKCiAg ICAgICAgYGBgamF2YXNjcmlwdAogICAgICAgIHZhciBjb250YWluZXIgPSBu ZXcgQ29udGFpbmVyKCk7CiAgICAgICAgY29udGFpbmVyLnJlZ2lzdGVyKCdt b2RlbDp1c2VyJywgVXNlcik7CgogICAgICAgIGNvbnRhaW5lci5sb29rdXAo J21vZGVsOnVzZXInKSBpbnN0YW5jZW9mIFVzZXIgLy89PiB0cnVlCgogICAg ICAgIGNvbnRhaW5lci51bnJlZ2lzdGVyKCdtb2RlbDp1c2VyJykKICAgICAg ICBjb250YWluZXIubG9va3VwKCdtb2RlbDp1c2VyJykgPT09IHVuZGVmaW5l ZCAvLz0+IHRydWUKICAgICAgICBgYGAKCiAgICAgICAgQG1ldGhvZCB1bnJl Z2lzdGVyCiAgICAgICAgQHBhcmFtIHtTdHJpbmd9IGZ1bGxOYW1lCiAgICAg ICAqLwogICAgICB1bnJlZ2lzdGVyOiBmdW5jdGlvbihmdWxsTmFtZSkgewog ICAgICAgIHZhbGlkYXRlRnVsbE5hbWUoZnVsbE5hbWUpOwoKICAgICAgICB2 YXIgbm9ybWFsaXplZE5hbWUgPSB0aGlzLm5vcm1hbGl6ZShmdWxsTmFtZSk7 CgogICAgICAgIHRoaXMucmVnaXN0cnkucmVtb3ZlKG5vcm1hbGl6ZWROYW1l KTsKICAgICAgICB0aGlzLmNhY2hlLnJlbW92ZShub3JtYWxpemVkTmFtZSk7 CiAgICAgICAgdGhpcy5mYWN0b3J5Q2FjaGUucmVtb3ZlKG5vcm1hbGl6ZWRO YW1lKTsKICAgICAgICB0aGlzLnJlc29sdmVDYWNoZS5yZW1vdmUobm9ybWFs aXplZE5hbWUpOwogICAgICAgIHRoaXMuX29wdGlvbnMucmVtb3ZlKG5vcm1h bGl6ZWROYW1lKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgIEdpdmVu IGEgZnVsbE5hbWUgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGZhY3Rvcnku CgogICAgICAgIEJ5IGRlZmF1bHQgYHJlc29sdmVgIHdpbGwgcmV0cmlldmUg dGhlIGZhY3RvcnkgZnJvbQogICAgICAgIGl0cyBjb250YWluZXIncyByZWdp c3RyeS4KCiAgICAgICAgYGBgamF2YXNjcmlwdAogICAgICAgIHZhciBjb250 YWluZXIgPSBuZXcgQ29udGFpbmVyKCk7CiAgICAgICAgY29udGFpbmVyLnJl Z2lzdGVyKCdhcGk6dHdpdHRlcicsIFR3aXR0ZXIpOwoKICAgICAgICBjb250 YWluZXIucmVzb2x2ZSgnYXBpOnR3aXR0ZXInKSAvLyA9PiBUd2l0dGVyCiAg ICAgICAgYGBgCgogICAgICAgIE9wdGlvbmFsbHkgdGhlIGNvbnRhaW5lciBj YW4gYmUgcHJvdmlkZWQgd2l0aCBhIGN1c3RvbSByZXNvbHZlci4KICAgICAg ICBJZiBwcm92aWRlZCwgYHJlc29sdmVgIHdpbGwgZmlyc3QgcHJvdmlkZSB0 aGUgY3VzdG9tIHJlc29sdmVyCiAgICAgICAgdGhlIG9wcGVydHVuaXR5IHRv IHJlc29sdmUgdGhlIGZ1bGxOYW1lLCBvdGhlcndpc2UgaXQgd2lsbCBmYWxs YmFjawogICAgICAgIHRvIHRoZSByZWdpc3RyeS4KCiAgICAgICAgYGBgamF2 YXNjcmlwdAogICAgICAgIHZhciBjb250YWluZXIgPSBuZXcgQ29udGFpbmVy KCk7CiAgICAgICAgY29udGFpbmVyLnJlc29sdmVyID0gZnVuY3Rpb24oZnVs bE5hbWUpIHsKICAgICAgICAgIC8vIGxvb2t1cCB2aWEgdGhlIG1vZHVsZSBz eXN0ZW0gb2YgY2hvaWNlCiAgICAgICAgfTsKCiAgICAgICAgLy8gdGhlIHR3 aXR0ZXIgZmFjdG9yeSBpcyBhZGRlZCB0byB0aGUgbW9kdWxlIHN5c3RlbQog ICAgICAgIGNvbnRhaW5lci5yZXNvbHZlKCdhcGk6dHdpdHRlcicpIC8vID0+ IFR3aXR0ZXIKICAgICAgICBgYGAKCiAgICAgICAgQG1ldGhvZCByZXNvbHZl CiAgICAgICAgQHBhcmFtIHtTdHJpbmd9IGZ1bGxOYW1lCiAgICAgICAgQHJl dHVybiB7RnVuY3Rpb259IGZ1bGxOYW1lJ3MgZmFjdG9yeQogICAgICAqLwog ICAgICByZXNvbHZlOiBmdW5jdGlvbihmdWxsTmFtZSkgewogICAgICAgIHZh bGlkYXRlRnVsbE5hbWUoZnVsbE5hbWUpOwoKICAgICAgICB2YXIgbm9ybWFs aXplZE5hbWUgPSB0aGlzLm5vcm1hbGl6ZShmdWxsTmFtZSk7CiAgICAgICAg dmFyIGNhY2hlZCA9IHRoaXMucmVzb2x2ZUNhY2hlLmdldChub3JtYWxpemVk TmFtZSk7CgogICAgICAgIGlmIChjYWNoZWQpIHsgcmV0dXJuIGNhY2hlZDsg fQoKICAgICAgICB2YXIgcmVzb2x2ZWQgPSB0aGlzLnJlc29sdmVyKG5vcm1h bGl6ZWROYW1lKSB8fCB0aGlzLnJlZ2lzdHJ5LmdldChub3JtYWxpemVkTmFt ZSk7CgogICAgICAgIHRoaXMucmVzb2x2ZUNhY2hlLnNldChub3JtYWxpemVk TmFtZSwgcmVzb2x2ZWQpOwoKICAgICAgICByZXR1cm4gcmVzb2x2ZWQ7CiAg ICAgIH0sCgogICAgICAvKioKICAgICAgICBBIGhvb2sgdGhhdCBjYW4gYmUg dXNlZCB0byBkZXNjcmliZSBob3cgdGhlIHJlc29sdmVyIHdpbGwKICAgICAg ICBhdHRlbXB0IHRvIGZpbmQgdGhlIGZhY3RvcnkuCgogICAgICAgIEZvciBl eGFtcGxlLCB0aGUgZGVmYXVsdCBFbWJlciBgLmRlc2NyaWJlYCByZXR1cm5z IHRoZSBmdWxsCiAgICAgICAgY2xhc3MgbmFtZSAoaW5jbHVkaW5nIG5hbWVz cGFjZSkgd2hlcmUgRW1iZXIncyByZXNvbHZlciBleHBlY3RzCiAgICAgICAg dG8gZmluZCB0aGUgYGZ1bGxOYW1lYC4KCiAgICAgICAgQG1ldGhvZCBkZXNj cmliZQogICAgICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFtZQogICAgICAg IEByZXR1cm4ge3N0cmluZ30gZGVzY3JpYmVkIGZ1bGxOYW1lCiAgICAgICov CiAgICAgIGRlc2NyaWJlOiBmdW5jdGlvbihmdWxsTmFtZSkgewogICAgICAg IHJldHVybiBmdWxsTmFtZTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAg IEEgaG9vayB0byBlbmFibGUgY3VzdG9tIGZ1bGxOYW1lIG5vcm1hbGl6YXRp b24gYmVoYXZpb3VyCgogICAgICAgIEBtZXRob2Qgbm9ybWFsaXplCiAgICAg ICAgQHBhcmFtIHtTdHJpbmd9IGZ1bGxOYW1lCiAgICAgICAgQHJldHVybiB7 c3RyaW5nfSBub3JtYWxpemVkIGZ1bGxOYW1lCiAgICAgICovCiAgICAgIG5v cm1hbGl6ZTogZnVuY3Rpb24oZnVsbE5hbWUpIHsKICAgICAgICByZXR1cm4g ZnVsbE5hbWU7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICBAbWV0aG9k IG1ha2VUb1N0cmluZwoKICAgICAgICBAcGFyYW0ge2FueX0gZmFjdG9yeQog ICAgICAgIEBwYXJhbSB7c3RyaW5nfSBmdWxsTmFtZQogICAgICAgIEByZXR1 cm4ge2Z1bmN0aW9ufSB0b1N0cmluZyBmdW5jdGlvbgogICAgICAqLwogICAg ICBtYWtlVG9TdHJpbmc6IGZ1bmN0aW9uKGZhY3RvcnksIGZ1bGxOYW1lKSB7 CiAgICAgICAgcmV0dXJuIGZhY3RvcnkudG9TdHJpbmcoKTsKICAgICAgfSwK CiAgICAgIC8qKgogICAgICAgIEdpdmVuIGEgZnVsbE5hbWUgcmV0dXJuIGEg Y29ycmVzcG9uZGluZyBpbnN0YW5jZS4KCiAgICAgICAgVGhlIGRlZmF1bHQg YmVoYXZpb3VyIGlzIGZvciBsb29rdXAgdG8gcmV0dXJuIGEgc2luZ2xldG9u IGluc3RhbmNlLgogICAgICAgIFRoZSBzaW5nbGV0b24gaXMgc2NvcGVkIHRv IHRoZSBjb250YWluZXIsIGFsbG93aW5nIG11bHRpcGxlIGNvbnRhaW5lcnMK ICAgICAgICB0byBhbGwgaGF2ZSB0aGVpciBvd24gbG9jYWxseSBzY29wZWQg c2luZ2xldG9ucy4KCiAgICAgICAgYGBgamF2YXNjcmlwdAogICAgICAgIHZh ciBjb250YWluZXIgPSBuZXcgQ29udGFpbmVyKCk7CiAgICAgICAgY29udGFp bmVyLnJlZ2lzdGVyKCdhcGk6dHdpdHRlcicsIFR3aXR0ZXIpOwoKICAgICAg ICB2YXIgdHdpdHRlciA9IGNvbnRhaW5lci5sb29rdXAoJ2FwaTp0d2l0dGVy Jyk7CgogICAgICAgIHR3aXR0ZXIgaW5zdGFuY2VvZiBUd2l0dGVyOyAvLyA9 PiB0cnVlCgogICAgICAgIC8vIGJ5IGRlZmF1bHQgdGhlIGNvbnRhaW5lciB3 aWxsIHJldHVybiBzaW5nbGV0b25zCiAgICAgICAgdmFyIHR3aXR0ZXIyID0g Y29udGFpbmVyLmxvb2t1cCgnYXBpOnR3aXR0ZXInKTsKICAgICAgICB0d2l0 dGVyIGluc3RhbmNlb2YgVHdpdHRlcjsgLy8gPT4gdHJ1ZQoKICAgICAgICB0 d2l0dGVyID09PSB0d2l0dGVyMjsgLy89PiB0cnVlCiAgICAgICAgYGBgCgog ICAgICAgIElmIHNpbmdsZXRvbnMgYXJlIG5vdCB3YW50ZWQgYW4gb3B0aW9u YWwgZmxhZyBjYW4gYmUgcHJvdmlkZWQgYXQgbG9va3VwLgoKICAgICAgICBg YGBqYXZhc2NyaXB0CiAgICAgICAgdmFyIGNvbnRhaW5lciA9IG5ldyBDb250 YWluZXIoKTsKICAgICAgICBjb250YWluZXIucmVnaXN0ZXIoJ2FwaTp0d2l0 dGVyJywgVHdpdHRlcik7CgogICAgICAgIHZhciB0d2l0dGVyID0gY29udGFp bmVyLmxvb2t1cCgnYXBpOnR3aXR0ZXInLCB7IHNpbmdsZXRvbjogZmFsc2Ug fSk7CiAgICAgICAgdmFyIHR3aXR0ZXIyID0gY29udGFpbmVyLmxvb2t1cCgn YXBpOnR3aXR0ZXInLCB7IHNpbmdsZXRvbjogZmFsc2UgfSk7CgogICAgICAg IHR3aXR0ZXIgPT09IHR3aXR0ZXIyOyAvLz0+IGZhbHNlCiAgICAgICAgYGBg CgogICAgICAgIEBtZXRob2QgbG9va3VwCiAgICAgICAgQHBhcmFtIHtTdHJp bmd9IGZ1bGxOYW1lCiAgICAgICAgQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMK ICAgICAgICBAcmV0dXJuIHthbnl9CiAgICAgICovCiAgICAgIGxvb2t1cDog ZnVuY3Rpb24oZnVsbE5hbWUsIG9wdGlvbnMpIHsKICAgICAgICB2YWxpZGF0 ZUZ1bGxOYW1lKGZ1bGxOYW1lKTsKICAgICAgICByZXR1cm4gbG9va3VwKHRo aXMsIHRoaXMubm9ybWFsaXplKGZ1bGxOYW1lKSwgb3B0aW9ucyk7CiAgICAg IH0sCgogICAgICAvKioKICAgICAgICBHaXZlbiBhIGZ1bGxOYW1lIHJldHVy biB0aGUgY29ycmVzcG9uZGluZyBmYWN0b3J5LgoKICAgICAgICBAbWV0aG9k IGxvb2t1cEZhY3RvcnkKICAgICAgICBAcGFyYW0ge1N0cmluZ30gZnVsbE5h bWUKICAgICAgICBAcmV0dXJuIHthbnl9CiAgICAgICovCiAgICAgIGxvb2t1 cEZhY3Rvcnk6IGZ1bmN0aW9uKGZ1bGxOYW1lKSB7CiAgICAgICAgdmFsaWRh dGVGdWxsTmFtZShmdWxsTmFtZSk7CiAgICAgICAgcmV0dXJuIGZhY3RvcnlG b3IodGhpcywgdGhpcy5ub3JtYWxpemUoZnVsbE5hbWUpKTsKICAgICAgfSwK CiAgICAgIC8qKgogICAgICAgIEdpdmVuIGEgZnVsbE5hbWUgY2hlY2sgaWYg dGhlIGNvbnRhaW5lciBpcyBhd2FyZSBvZiBpdHMgZmFjdG9yeQogICAgICAg IG9yIHNpbmdsZXRvbiBpbnN0YW5jZS4KCiAgICAgICAgQG1ldGhvZCBoYXMK ICAgICAgICBAcGFyYW0ge1N0cmluZ30gZnVsbE5hbWUKICAgICAgICBAcmV0 dXJuIHtCb29sZWFufQogICAgICAqLwogICAgICBoYXM6IGZ1bmN0aW9uKGZ1 bGxOYW1lKSB7CiAgICAgICAgdmFsaWRhdGVGdWxsTmFtZShmdWxsTmFtZSk7 CiAgICAgICAgcmV0dXJuIGhhcyh0aGlzLCB0aGlzLm5vcm1hbGl6ZShmdWxs TmFtZSkpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAgQWxsb3cgcmVn aXN0ZXJpbmcgb3B0aW9ucyBmb3IgYWxsIGZhY3RvcmllcyBvZiBhIHR5cGUu CgogICAgICAgIGBgYGphdmFzY3JpcHQKICAgICAgICB2YXIgY29udGFpbmVy ID0gbmV3IENvbnRhaW5lcigpOwoKICAgICAgICAvLyBpZiBhbGwgb2YgdHlw ZSBgY29ubmVjdGlvbmAgbXVzdCBub3QgYmUgc2luZ2xldG9ucwogICAgICAg IGNvbnRhaW5lci5vcHRpb25zRm9yVHlwZSgnY29ubmVjdGlvbicsIHsgc2lu Z2xldG9uOiBmYWxzZSB9KTsKCiAgICAgICAgY29udGFpbmVyLnJlZ2lzdGVy KCdjb25uZWN0aW9uOnR3aXR0ZXInLCBUd2l0dGVyQ29ubmVjdGlvbik7CiAg ICAgICAgY29udGFpbmVyLnJlZ2lzdGVyKCdjb25uZWN0aW9uOmZhY2Vib29r JywgRmFjZWJvb2tDb25uZWN0aW9uKTsKCiAgICAgICAgdmFyIHR3aXR0ZXIg PSBjb250YWluZXIubG9va3VwKCdjb25uZWN0aW9uOnR3aXR0ZXInKTsKICAg ICAgICB2YXIgdHdpdHRlcjIgPSBjb250YWluZXIubG9va3VwKCdjb25uZWN0 aW9uOnR3aXR0ZXInKTsKCiAgICAgICAgdHdpdHRlciA9PT0gdHdpdHRlcjI7 IC8vID0+IGZhbHNlCgogICAgICAgIHZhciBmYWNlYm9vayA9IGNvbnRhaW5l ci5sb29rdXAoJ2Nvbm5lY3Rpb246ZmFjZWJvb2snKTsKICAgICAgICB2YXIg ZmFjZWJvb2syID0gY29udGFpbmVyLmxvb2t1cCgnY29ubmVjdGlvbjpmYWNl Ym9vaycpOwoKICAgICAgICBmYWNlYm9vayA9PT0gZmFjZWJvb2syOyAvLyA9 PiBmYWxzZQogICAgICAgIGBgYAoKICAgICAgICBAbWV0aG9kIG9wdGlvbnNG b3JUeXBlCiAgICAgICAgQHBhcmFtIHtTdHJpbmd9IHR5cGUKICAgICAgICBA cGFyYW0ge09iamVjdH0gb3B0aW9ucwogICAgICAqLwogICAgICBvcHRpb25z Rm9yVHlwZTogZnVuY3Rpb24odHlwZSwgb3B0aW9ucykgewogICAgICAgIGlm ICh0aGlzLnBhcmVudCkgeyBpbGxlZ2FsQ2hpbGRPcGVyYXRpb24oJ29wdGlv bnNGb3JUeXBlJyk7IH0KCiAgICAgICAgdGhpcy5fdHlwZU9wdGlvbnMuc2V0 KHR5cGUsIG9wdGlvbnMpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAg QG1ldGhvZCBvcHRpb25zCiAgICAgICAgQHBhcmFtIHtTdHJpbmd9IHR5cGUK ICAgICAgICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucwogICAgICAqLwogICAg ICBvcHRpb25zOiBmdW5jdGlvbih0eXBlLCBvcHRpb25zKSB7CiAgICAgICAg dGhpcy5vcHRpb25zRm9yVHlwZSh0eXBlLCBvcHRpb25zKTsKICAgICAgfSwK CiAgICAgIC8qKgogICAgICAgIFVzZWQgb25seSB2aWEgYGluamVjdGlvbmAu CgogICAgICAgIFByb3ZpZGVzIGEgc3BlY2lhbGl6ZWQgZm9ybSBvZiBpbmpl Y3Rpb24sIHNwZWNpZmljYWxseSBlbmFibGluZwogICAgICAgIGFsbCBvYmpl Y3RzIG9mIG9uZSB0eXBlIHRvIGJlIGluamVjdGVkIHdpdGggYSByZWZlcmVu Y2UgdG8gYW5vdGhlcgogICAgICAgIG9iamVjdC4KCiAgICAgICAgRm9yIGV4 YW1wbGUsIHByb3ZpZGVkIGVhY2ggb2JqZWN0IG9mIHR5cGUgYGNvbnRyb2xs ZXJgIG5lZWRlZCBhIGByb3V0ZXJgLgogICAgICAgIG9uZSB3b3VsZCBkbyB0 aGUgZm9sbG93aW5nOgoKICAgICAgICBgYGBqYXZhc2NyaXB0CiAgICAgICAg dmFyIGNvbnRhaW5lciA9IG5ldyBDb250YWluZXIoKTsKCiAgICAgICAgY29u dGFpbmVyLnJlZ2lzdGVyKCdyb3V0ZXI6bWFpbicsIFJvdXRlcik7CiAgICAg ICAgY29udGFpbmVyLnJlZ2lzdGVyKCdjb250cm9sbGVyOnVzZXInLCBVc2Vy Q29udHJvbGxlcik7CiAgICAgICAgY29udGFpbmVyLnJlZ2lzdGVyKCdjb250 cm9sbGVyOnBvc3QnLCBQb3N0Q29udHJvbGxlcik7CgogICAgICAgIGNvbnRh aW5lci50eXBlSW5qZWN0aW9uKCdjb250cm9sbGVyJywgJ3JvdXRlcicsICdy b3V0ZXI6bWFpbicpOwoKICAgICAgICB2YXIgdXNlciA9IGNvbnRhaW5lci5s b29rdXAoJ2NvbnRyb2xsZXI6dXNlcicpOwogICAgICAgIHZhciBwb3N0ID0g Y29udGFpbmVyLmxvb2t1cCgnY29udHJvbGxlcjpwb3N0Jyk7CgogICAgICAg IHVzZXIucm91dGVyIGluc3RhbmNlb2YgUm91dGVyOyAvLz0+IHRydWUKICAg ICAgICBwb3N0LnJvdXRlciBpbnN0YW5jZW9mIFJvdXRlcjsgLy89PiB0cnVl CgogICAgICAgIC8vIGJvdGggY29udHJvbGxlcnMgc2hhcmUgdGhlIHNhbWUg cm91dGVyCiAgICAgICAgdXNlci5yb3V0ZXIgPT09IHBvc3Qucm91dGVyOyAv Lz0+IHRydWUKICAgICAgICBgYGAKCiAgICAgICAgQHByaXZhdGUKICAgICAg ICBAbWV0aG9kIHR5cGVJbmplY3Rpb24KICAgICAgICBAcGFyYW0ge1N0cmlu Z30gdHlwZQogICAgICAgIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eQogICAg ICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFtZQogICAgICAqLwogICAgICB0 eXBlSW5qZWN0aW9uOiBmdW5jdGlvbih0eXBlLCBwcm9wZXJ0eSwgZnVsbE5h bWUpIHsKICAgICAgICB2YWxpZGF0ZUZ1bGxOYW1lKGZ1bGxOYW1lKTsKICAg ICAgICBpZiAodGhpcy5wYXJlbnQpIHsgaWxsZWdhbENoaWxkT3BlcmF0aW9u KCd0eXBlSW5qZWN0aW9uJyk7IH0KCiAgICAgICAgYWRkVHlwZUluamVjdGlv bih0aGlzLnR5cGVJbmplY3Rpb25zLCB0eXBlLCBwcm9wZXJ0eSwgZnVsbE5h bWUpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAgRGVmaW5lcyBpbmpl Y3Rpb24gcnVsZXMuCgogICAgICAgIFRoZXNlIHJ1bGVzIGFyZSB1c2VkIHRv IGluamVjdCBkZXBlbmRlbmNpZXMgb250byBvYmplY3RzIHdoZW4gdGhleQog ICAgICAgIGFyZSBpbnN0YW50aWF0ZWQuCgogICAgICAgIFR3byBmb3JtcyBv ZiBpbmplY3Rpb25zIGFyZSBwb3NzaWJsZToKCiAgICAgICAgKiBJbmplY3Rp bmcgb25lIGZ1bGxOYW1lIG9uIGFub3RoZXIgZnVsbE5hbWUKICAgICAgICAq IEluamVjdGluZyBvbmUgZnVsbE5hbWUgb24gYSB0eXBlCgogICAgICAgIEV4 YW1wbGU6CgogICAgICAgIGBgYGphdmFzY3JpcHQKICAgICAgICB2YXIgY29u dGFpbmVyID0gbmV3IENvbnRhaW5lcigpOwoKICAgICAgICBjb250YWluZXIu cmVnaXN0ZXIoJ3NvdXJjZTptYWluJywgU291cmNlKTsKICAgICAgICBjb250 YWluZXIucmVnaXN0ZXIoJ21vZGVsOnVzZXInLCBVc2VyKTsKICAgICAgICBj b250YWluZXIucmVnaXN0ZXIoJ21vZGVsOnBvc3QnLCBQb3N0KTsKCiAgICAg ICAgLy8gaW5qZWN0aW5nIG9uZSBmdWxsTmFtZSBvbiBhbm90aGVyIGZ1bGxO YW1lCiAgICAgICAgLy8gZWcuIGVhY2ggdXNlciBtb2RlbCBnZXRzIGEgcG9z dCBtb2RlbAogICAgICAgIGNvbnRhaW5lci5pbmplY3Rpb24oJ21vZGVsOnVz ZXInLCAncG9zdCcsICdtb2RlbDpwb3N0Jyk7CgogICAgICAgIC8vIGluamVj dGluZyBvbmUgZnVsbE5hbWUgb24gYW5vdGhlciB0eXBlCiAgICAgICAgY29u dGFpbmVyLmluamVjdGlvbignbW9kZWwnLCAnc291cmNlJywgJ3NvdXJjZTpt YWluJyk7CgogICAgICAgIHZhciB1c2VyID0gY29udGFpbmVyLmxvb2t1cCgn bW9kZWw6dXNlcicpOwogICAgICAgIHZhciBwb3N0ID0gY29udGFpbmVyLmxv b2t1cCgnbW9kZWw6cG9zdCcpOwoKICAgICAgICB1c2VyLnNvdXJjZSBpbnN0 YW5jZW9mIFNvdXJjZTsgLy89PiB0cnVlCiAgICAgICAgcG9zdC5zb3VyY2Ug aW5zdGFuY2VvZiBTb3VyY2U7IC8vPT4gdHJ1ZQoKICAgICAgICB1c2VyLnBv c3QgaW5zdGFuY2VvZiBQb3N0OyAvLz0+IHRydWUKCiAgICAgICAgLy8gYW5k IGJvdGggbW9kZWxzIHNoYXJlIHRoZSBzYW1lIHNvdXJjZQogICAgICAgIHVz ZXIuc291cmNlID09PSBwb3N0LnNvdXJjZTsgLy89PiB0cnVlCiAgICAgICAg YGBgCgogICAgICAgIEBtZXRob2QgaW5qZWN0aW9uCiAgICAgICAgQHBhcmFt IHtTdHJpbmd9IGZhY3RvcnlOYW1lCiAgICAgICAgQHBhcmFtIHtTdHJpbmd9 IHByb3BlcnR5CiAgICAgICAgQHBhcmFtIHtTdHJpbmd9IGluamVjdGlvbk5h bWUKICAgICAgKi8KICAgICAgaW5qZWN0aW9uOiBmdW5jdGlvbihmdWxsTmFt ZSwgcHJvcGVydHksIGluamVjdGlvbk5hbWUpIHsKICAgICAgICBpZiAodGhp cy5wYXJlbnQpIHsgaWxsZWdhbENoaWxkT3BlcmF0aW9uKCdpbmplY3Rpb24n KTsgfQoKICAgICAgICB2YWxpZGF0ZUZ1bGxOYW1lKGluamVjdGlvbk5hbWUp OwogICAgICAgIHZhciBub3JtYWxpemVkSW5qZWN0aW9uTmFtZSA9IHRoaXMu bm9ybWFsaXplKGluamVjdGlvbk5hbWUpOwoKICAgICAgICBpZiAoZnVsbE5h bWUuaW5kZXhPZignOicpID09PSAtMSkgewogICAgICAgICAgcmV0dXJuIHRo aXMudHlwZUluamVjdGlvbihmdWxsTmFtZSwgcHJvcGVydHksIG5vcm1hbGl6 ZWRJbmplY3Rpb25OYW1lKTsKICAgICAgICB9CgogICAgICAgIHZhbGlkYXRl RnVsbE5hbWUoZnVsbE5hbWUpOwogICAgICAgIHZhciBub3JtYWxpemVkTmFt ZSA9IHRoaXMubm9ybWFsaXplKGZ1bGxOYW1lKTsKCiAgICAgICAgYWRkSW5q ZWN0aW9uKHRoaXMuaW5qZWN0aW9ucywgbm9ybWFsaXplZE5hbWUsIHByb3Bl cnR5LCBub3JtYWxpemVkSW5qZWN0aW9uTmFtZSk7CiAgICAgIH0sCgoKICAg ICAgLyoqCiAgICAgICAgVXNlZCBvbmx5IHZpYSBgZmFjdG9yeUluamVjdGlv bmAuCgogICAgICAgIFByb3ZpZGVzIGEgc3BlY2lhbGl6ZWQgZm9ybSBvZiBp bmplY3Rpb24sIHNwZWNpZmljYWxseSBlbmFibGluZwogICAgICAgIGFsbCBm YWN0b3J5IG9mIG9uZSB0eXBlIHRvIGJlIGluamVjdGVkIHdpdGggYSByZWZl cmVuY2UgdG8gYW5vdGhlcgogICAgICAgIG9iamVjdC4KCiAgICAgICAgRm9y IGV4YW1wbGUsIHByb3ZpZGVkIGVhY2ggZmFjdG9yeSBvZiB0eXBlIGBtb2Rl bGAgbmVlZGVkIGEgYHN0b3JlYC4KICAgICAgICBvbmUgd291bGQgZG8gdGhl IGZvbGxvd2luZzoKCiAgICAgICAgYGBgamF2YXNjcmlwdAogICAgICAgIHZh ciBjb250YWluZXIgPSBuZXcgQ29udGFpbmVyKCk7CgogICAgICAgIGNvbnRh aW5lci5yZWdpc3Rlcignc3RvcmU6bWFpbicsIFNvbWVTdG9yZSk7CgogICAg ICAgIGNvbnRhaW5lci5mYWN0b3J5VHlwZUluamVjdGlvbignbW9kZWwnLCAn c3RvcmUnLCAnc3RvcmU6bWFpbicpOwoKICAgICAgICB2YXIgc3RvcmUgPSBj b250YWluZXIubG9va3VwKCdzdG9yZTptYWluJyk7CiAgICAgICAgdmFyIFVz ZXJGYWN0b3J5ID0gY29udGFpbmVyLmxvb2t1cEZhY3RvcnkoJ21vZGVsOnVz ZXInKTsKCiAgICAgICAgVXNlckZhY3Rvcnkuc3RvcmUgaW5zdGFuY2VvZiBT b21lU3RvcmU7IC8vPT4gdHJ1ZQogICAgICAgIGBgYAoKICAgICAgICBAcHJp dmF0ZQogICAgICAgIEBtZXRob2QgZmFjdG9yeVR5cGVJbmplY3Rpb24KICAg ICAgICBAcGFyYW0ge1N0cmluZ30gdHlwZQogICAgICAgIEBwYXJhbSB7U3Ry aW5nfSBwcm9wZXJ0eQogICAgICAgIEBwYXJhbSB7U3RyaW5nfSBmdWxsTmFt ZQogICAgICAqLwogICAgICBmYWN0b3J5VHlwZUluamVjdGlvbjogZnVuY3Rp b24odHlwZSwgcHJvcGVydHksIGZ1bGxOYW1lKSB7CiAgICAgICAgaWYgKHRo aXMucGFyZW50KSB7IGlsbGVnYWxDaGlsZE9wZXJhdGlvbignZmFjdG9yeVR5 cGVJbmplY3Rpb24nKTsgfQoKICAgICAgICBhZGRUeXBlSW5qZWN0aW9uKHRo aXMuZmFjdG9yeVR5cGVJbmplY3Rpb25zLCB0eXBlLCBwcm9wZXJ0eSwgdGhp cy5ub3JtYWxpemUoZnVsbE5hbWUpKTsKICAgICAgfSwKCiAgICAgIC8qKgog ICAgICAgIERlZmluZXMgZmFjdG9yeSBpbmplY3Rpb24gcnVsZXMuCgogICAg ICAgIFNpbWlsYXIgdG8gcmVndWxhciBpbmplY3Rpb24gcnVsZXMsIGJ1dCBh cmUgcnVuIGFnYWluc3QgZmFjdG9yaWVzLCB2aWEKICAgICAgICBgQ29udGFp bmVyI2xvb2t1cEZhY3RvcnlgLgoKICAgICAgICBUaGVzZSBydWxlcyBhcmUg dXNlZCB0byBpbmplY3Qgb2JqZWN0cyBvbnRvIGZhY3RvcmllcyB3aGVuIHRo ZXkKICAgICAgICBhcmUgbG9va2VkIHVwLgoKICAgICAgICBUd28gZm9ybXMg b2YgaW5qZWN0aW9ucyBhcmUgcG9zc2libGU6CgogICAgICAqIEluamVjdGlu ZyBvbmUgZnVsbE5hbWUgb24gYW5vdGhlciBmdWxsTmFtZQogICAgICAqIElu amVjdGluZyBvbmUgZnVsbE5hbWUgb24gYSB0eXBlCgogICAgICAgIEV4YW1w bGU6CgogICAgICAgIGBgYGphdmFzY3JpcHQKICAgICAgICB2YXIgY29udGFp bmVyID0gbmV3IENvbnRhaW5lcigpOwoKICAgICAgICBjb250YWluZXIucmVn aXN0ZXIoJ3N0b3JlOm1haW4nLCBTdG9yZSk7CiAgICAgICAgY29udGFpbmVy LnJlZ2lzdGVyKCdzdG9yZTpzZWNvbmRhcnknLCBPdGhlclN0b3JlKTsKICAg ICAgICBjb250YWluZXIucmVnaXN0ZXIoJ21vZGVsOnVzZXInLCBVc2VyKTsK ICAgICAgICBjb250YWluZXIucmVnaXN0ZXIoJ21vZGVsOnBvc3QnLCBQb3N0 KTsKCiAgICAgICAgLy8gaW5qZWN0aW5nIG9uZSBmdWxsTmFtZSBvbiBhbm90 aGVyIHR5cGUKICAgICAgICBjb250YWluZXIuZmFjdG9yeUluamVjdGlvbign bW9kZWwnLCAnc3RvcmUnLCAnc3RvcmU6bWFpbicpOwoKICAgICAgICAvLyBp bmplY3Rpbmcgb25lIGZ1bGxOYW1lIG9uIGFub3RoZXIgZnVsbE5hbWUKICAg ICAgICBjb250YWluZXIuZmFjdG9yeUluamVjdGlvbignbW9kZWw6cG9zdCcs ICdzZWNvbmRhcnlTdG9yZScsICdzdG9yZTpzZWNvbmRhcnknKTsKCiAgICAg ICAgdmFyIFVzZXJGYWN0b3J5ID0gY29udGFpbmVyLmxvb2t1cEZhY3Rvcnko J21vZGVsOnVzZXInKTsKICAgICAgICB2YXIgUG9zdEZhY3RvcnkgPSBjb250 YWluZXIubG9va3VwRmFjdG9yeSgnbW9kZWw6cG9zdCcpOwogICAgICAgIHZh ciBzdG9yZSA9IGNvbnRhaW5lci5sb29rdXAoJ3N0b3JlOm1haW4nKTsKCiAg ICAgICAgVXNlckZhY3Rvcnkuc3RvcmUgaW5zdGFuY2VvZiBTdG9yZTsgLy89 PiB0cnVlCiAgICAgICAgVXNlckZhY3Rvcnkuc2Vjb25kYXJ5U3RvcmUgaW5z dGFuY2VvZiBPdGhlclN0b3JlOyAvLz0+IGZhbHNlCgogICAgICAgIFBvc3RG YWN0b3J5LnN0b3JlIGluc3RhbmNlb2YgU3RvcmU7IC8vPT4gdHJ1ZQogICAg ICAgIFBvc3RGYWN0b3J5LnNlY29uZGFyeVN0b3JlIGluc3RhbmNlb2YgT3Ro ZXJTdG9yZTsgLy89PiB0cnVlCgogICAgICAgIC8vIGFuZCBib3RoIG1vZGVs cyBzaGFyZSB0aGUgc2FtZSBzb3VyY2UgaW5zdGFuY2UKICAgICAgICBVc2Vy RmFjdG9yeS5zdG9yZSA9PT0gUG9zdEZhY3Rvcnkuc3RvcmU7IC8vPT4gdHJ1 ZQogICAgICAgIGBgYAoKICAgICAgICBAbWV0aG9kIGZhY3RvcnlJbmplY3Rp b24KICAgICAgICBAcGFyYW0ge1N0cmluZ30gZmFjdG9yeU5hbWUKICAgICAg ICBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkKICAgICAgICBAcGFyYW0ge1N0 cmluZ30gaW5qZWN0aW9uTmFtZQogICAgICAqLwogICAgICBmYWN0b3J5SW5q ZWN0aW9uOiBmdW5jdGlvbihmdWxsTmFtZSwgcHJvcGVydHksIGluamVjdGlv bk5hbWUpIHsKICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHsgaWxsZWdhbENo aWxkT3BlcmF0aW9uKCdpbmplY3Rpb24nKTsgfQoKICAgICAgICB2YXIgbm9y bWFsaXplZE5hbWUgPSB0aGlzLm5vcm1hbGl6ZShmdWxsTmFtZSk7CiAgICAg ICAgdmFyIG5vcm1hbGl6ZWRJbmplY3Rpb25OYW1lID0gdGhpcy5ub3JtYWxp emUoaW5qZWN0aW9uTmFtZSk7CgogICAgICAgIHZhbGlkYXRlRnVsbE5hbWUo aW5qZWN0aW9uTmFtZSk7CgogICAgICAgIGlmIChmdWxsTmFtZS5pbmRleE9m KCc6JykgPT09IC0xKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5mYWN0b3J5 VHlwZUluamVjdGlvbihub3JtYWxpemVkTmFtZSwgcHJvcGVydHksIG5vcm1h bGl6ZWRJbmplY3Rpb25OYW1lKTsKICAgICAgICB9CgogICAgICAgIHZhbGlk YXRlRnVsbE5hbWUoZnVsbE5hbWUpOwoKICAgICAgICBhZGRJbmplY3Rpb24o dGhpcy5mYWN0b3J5SW5qZWN0aW9ucywgbm9ybWFsaXplZE5hbWUsIHByb3Bl cnR5LCBub3JtYWxpemVkSW5qZWN0aW9uTmFtZSk7CiAgICAgIH0sCgogICAg ICAvKioKICAgICAgICBBIGRlcHRoIGZpcnN0IHRyYXZlcnNhbCwgZGVzdHJv eWluZyB0aGUgY29udGFpbmVyLCBpdHMgZGVzY2VuZGFudCBjb250YWluZXJz IGFuZCBhbGwKICAgICAgICB0aGVpciBtYW5hZ2VkIG9iamVjdHMuCgogICAg ICAgIEBtZXRob2QgZGVzdHJveQogICAgICAqLwogICAgICBkZXN0cm95OiBm dW5jdGlvbigpIHsKICAgICAgICBmb3IgKHZhciBpPTAsIGw9dGhpcy5jaGls ZHJlbi5sZW5ndGg7IGk8bDsgaSsrKSB7CiAgICAgICAgICB0aGlzLmNoaWxk cmVuW2ldLmRlc3Ryb3koKTsKICAgICAgICB9CgogICAgICAgIHRoaXMuY2hp bGRyZW4gPSBbXTsKCiAgICAgICAgZWFjaERlc3Ryb3lhYmxlKHRoaXMsIGZ1 bmN0aW9uKGl0ZW0pIHsKICAgICAgICAgIGl0ZW0uZGVzdHJveSgpOwogICAg ICAgIH0pOwoKICAgICAgICB0aGlzLnBhcmVudCA9IHVuZGVmaW5lZDsKICAg ICAgICB0aGlzLmlzRGVzdHJveWVkID0gdHJ1ZTsKICAgICAgfSwKCiAgICAg IC8qKgogICAgICAgIEBtZXRob2QgcmVzZXQKICAgICAgKi8KICAgICAgcmVz ZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGZvciAodmFyIGk9MCwgbD10aGlz LmNoaWxkcmVuLmxlbmd0aDsgaTxsOyBpKyspIHsKICAgICAgICAgIHJlc2V0 Q2FjaGUodGhpcy5jaGlsZHJlbltpXSk7CiAgICAgICAgfQogICAgICAgIHJl c2V0Q2FjaGUodGhpcyk7CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24g aGFzKGNvbnRhaW5lciwgZnVsbE5hbWUpewogICAgICBpZiAoY29udGFpbmVy LmNhY2hlLmhhcyhmdWxsTmFtZSkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsK ICAgICAgfQoKICAgICAgcmV0dXJuICEhY29udGFpbmVyLnJlc29sdmUoZnVs bE5hbWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGxvb2t1cChjb250YWluZXIs IGZ1bGxOYW1lLCBvcHRpb25zKSB7CiAgICAgIG9wdGlvbnMgPSBvcHRpb25z IHx8IHt9OwoKICAgICAgaWYgKGNvbnRhaW5lci5jYWNoZS5oYXMoZnVsbE5h bWUpICYmIG9wdGlvbnMuc2luZ2xldG9uICE9PSBmYWxzZSkgewogICAgICAg IHJldHVybiBjb250YWluZXIuY2FjaGUuZ2V0KGZ1bGxOYW1lKTsKICAgICAg fQoKICAgICAgdmFyIHZhbHVlID0gaW5zdGFudGlhdGUoY29udGFpbmVyLCBm dWxsTmFtZSk7CgogICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgeyBy ZXR1cm47IH0KCiAgICAgIGlmIChpc1NpbmdsZXRvbihjb250YWluZXIsIGZ1 bGxOYW1lKSAmJiBvcHRpb25zLnNpbmdsZXRvbiAhPT0gZmFsc2UpIHsKICAg ICAgICBjb250YWluZXIuY2FjaGUuc2V0KGZ1bGxOYW1lLCB2YWx1ZSk7CiAg ICAgIH0KCiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KCiAgICBmdW5jdGlv biBpbGxlZ2FsQ2hpbGRPcGVyYXRpb24ob3BlcmF0aW9uKSB7CiAgICAgIHRo cm93IG5ldyBFcnJvcihvcGVyYXRpb24gKyAiIGlzIG5vdCBjdXJyZW50bHkg c3VwcG9ydGVkIG9uIGNoaWxkIGNvbnRhaW5lcnMiKTsKICAgIH0KCiAgICBm dW5jdGlvbiBpc1NpbmdsZXRvbihjb250YWluZXIsIGZ1bGxOYW1lKSB7CiAg ICAgIHZhciBzaW5nbGV0b24gPSBvcHRpb24oY29udGFpbmVyLCBmdWxsTmFt ZSwgJ3NpbmdsZXRvbicpOwoKICAgICAgcmV0dXJuIHNpbmdsZXRvbiAhPT0g ZmFsc2U7CiAgICB9CgogICAgZnVuY3Rpb24gYnVpbGRJbmplY3Rpb25zKGNv bnRhaW5lciwgaW5qZWN0aW9ucykgewogICAgICB2YXIgaGFzaCA9IHt9OwoK ICAgICAgaWYgKCFpbmplY3Rpb25zKSB7IHJldHVybiBoYXNoOyB9CgogICAg ICB2YXIgaW5qZWN0aW9uLCBpbmplY3RhYmxlOwoKICAgICAgZm9yICh2YXIg aT0wLCBsPWluamVjdGlvbnMubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAg IGluamVjdGlvbiA9IGluamVjdGlvbnNbaV07CiAgICAgICAgaW5qZWN0YWJs ZSA9IGxvb2t1cChjb250YWluZXIsIGluamVjdGlvbi5mdWxsTmFtZSk7Cgog ICAgICAgIGlmIChpbmplY3RhYmxlICE9PSB1bmRlZmluZWQpIHsKICAgICAg ICAgIGhhc2hbaW5qZWN0aW9uLnByb3BlcnR5XSA9IGluamVjdGFibGU7CiAg ICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXR0 ZW1wdGluZyB0byBpbmplY3QgYW4gdW5rbm93biBpbmplY3Rpb246IGAnICsg aW5qZWN0aW9uLmZ1bGxOYW1lICsgJ2AnKTsKICAgICAgICB9CiAgICAgIH0K CiAgICAgIHJldHVybiBoYXNoOwogICAgfQoKICAgIGZ1bmN0aW9uIG9wdGlv bihjb250YWluZXIsIGZ1bGxOYW1lLCBvcHRpb25OYW1lKSB7CiAgICAgIHZh ciBvcHRpb25zID0gY29udGFpbmVyLl9vcHRpb25zLmdldChmdWxsTmFtZSk7 CgogICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zW29wdGlvbk5hbWVdICE9 PSB1bmRlZmluZWQpIHsKICAgICAgICByZXR1cm4gb3B0aW9uc1tvcHRpb25O YW1lXTsKICAgICAgfQoKICAgICAgdmFyIHR5cGUgPSBmdWxsTmFtZS5zcGxp dCgiOiIpWzBdOwogICAgICBvcHRpb25zID0gY29udGFpbmVyLl90eXBlT3B0 aW9ucy5nZXQodHlwZSk7CgogICAgICBpZiAob3B0aW9ucykgewogICAgICAg IHJldHVybiBvcHRpb25zW29wdGlvbk5hbWVdOwogICAgICB9CiAgICB9Cgog ICAgZnVuY3Rpb24gZmFjdG9yeUZvcihjb250YWluZXIsIGZ1bGxOYW1lKSB7 CiAgICAgIHZhciBuYW1lID0gZnVsbE5hbWU7CiAgICAgIHZhciBmYWN0b3J5 ID0gY29udGFpbmVyLnJlc29sdmUobmFtZSk7CiAgICAgIHZhciBpbmplY3Rl ZEZhY3Rvcnk7CiAgICAgIHZhciBjYWNoZSA9IGNvbnRhaW5lci5mYWN0b3J5 Q2FjaGU7CiAgICAgIHZhciB0eXBlID0gZnVsbE5hbWUuc3BsaXQoIjoiKVsw XTsKCiAgICAgIGlmIChmYWN0b3J5ID09PSB1bmRlZmluZWQpIHsgcmV0dXJu OyB9CgogICAgICBpZiAoY2FjaGUuaGFzKGZ1bGxOYW1lKSkgewogICAgICAg IHJldHVybiBjYWNoZS5nZXQoZnVsbE5hbWUpOwogICAgICB9CgogICAgICBp ZiAoIWZhY3RvcnkgfHwgdHlwZW9mIGZhY3RvcnkuZXh0ZW5kICE9PSAnZnVu Y3Rpb24nIHx8ICghRW1iZXIuTU9ERUxfRkFDVE9SWV9JTkpFQ1RJT05TICYm IHR5cGUgPT09ICdtb2RlbCcpKSB7CiAgICAgICAgLy8gVE9ETzogdGhpbmsg YWJvdXQgYSAnc2FmZScgbWVyZ2Ugc3R5bGUgZXh0ZW5zaW9uCiAgICAgICAg Ly8gZm9yIG5vdyBqdXN0IGZhbGxiYWNrIHRvIGNyZWF0ZSB0aW1lIGluamVj dGlvbgogICAgICAgIHJldHVybiBmYWN0b3J5OwogICAgICB9IGVsc2UgewoK ICAgICAgICB2YXIgaW5qZWN0aW9ucyAgICAgICAgPSBpbmplY3Rpb25zRm9y KGNvbnRhaW5lciwgZnVsbE5hbWUpOwogICAgICAgIHZhciBmYWN0b3J5SW5q ZWN0aW9ucyA9IGZhY3RvcnlJbmplY3Rpb25zRm9yKGNvbnRhaW5lciwgZnVs bE5hbWUpOwoKICAgICAgICBmYWN0b3J5SW5qZWN0aW9ucy5fdG9TdHJpbmcg PSBjb250YWluZXIubWFrZVRvU3RyaW5nKGZhY3RvcnksIGZ1bGxOYW1lKTsK CiAgICAgICAgaW5qZWN0ZWRGYWN0b3J5ID0gZmFjdG9yeS5leHRlbmQoaW5q ZWN0aW9ucyk7CiAgICAgICAgaW5qZWN0ZWRGYWN0b3J5LnJlb3BlbkNsYXNz KGZhY3RvcnlJbmplY3Rpb25zKTsKCiAgICAgICAgY2FjaGUuc2V0KGZ1bGxO YW1lLCBpbmplY3RlZEZhY3RvcnkpOwoKICAgICAgICByZXR1cm4gaW5qZWN0 ZWRGYWN0b3J5OwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gaW5qZWN0 aW9uc0Zvcihjb250YWluZXIsIGZ1bGxOYW1lKSB7CiAgICAgIHZhciBzcGxp dE5hbWUgPSBmdWxsTmFtZS5zcGxpdCgiOiIpLAogICAgICAgIHR5cGUgPSBz cGxpdE5hbWVbMF0sCiAgICAgICAgaW5qZWN0aW9ucyA9IFtdOwoKICAgICAg aW5qZWN0aW9ucyA9IGluamVjdGlvbnMuY29uY2F0KGNvbnRhaW5lci50eXBl SW5qZWN0aW9ucy5nZXQodHlwZSkgfHwgW10pOwogICAgICBpbmplY3Rpb25z ID0gaW5qZWN0aW9ucy5jb25jYXQoY29udGFpbmVyLmluamVjdGlvbnNbZnVs bE5hbWVdIHx8IFtdKTsKCiAgICAgIGluamVjdGlvbnMgPSBidWlsZEluamVj dGlvbnMoY29udGFpbmVyLCBpbmplY3Rpb25zKTsKICAgICAgaW5qZWN0aW9u cy5fZGVidWdDb250YWluZXJLZXkgPSBmdWxsTmFtZTsKICAgICAgaW5qZWN0 aW9ucy5jb250YWluZXIgPSBjb250YWluZXI7CgogICAgICByZXR1cm4gaW5q ZWN0aW9uczsKICAgIH0KCiAgICBmdW5jdGlvbiBmYWN0b3J5SW5qZWN0aW9u c0Zvcihjb250YWluZXIsIGZ1bGxOYW1lKSB7CiAgICAgIHZhciBzcGxpdE5h bWUgPSBmdWxsTmFtZS5zcGxpdCgiOiIpLAogICAgICAgIHR5cGUgPSBzcGxp dE5hbWVbMF0sCiAgICAgICAgZmFjdG9yeUluamVjdGlvbnMgPSBbXTsKCiAg ICAgIGZhY3RvcnlJbmplY3Rpb25zID0gZmFjdG9yeUluamVjdGlvbnMuY29u Y2F0KGNvbnRhaW5lci5mYWN0b3J5VHlwZUluamVjdGlvbnMuZ2V0KHR5cGUp IHx8IFtdKTsKICAgICAgZmFjdG9yeUluamVjdGlvbnMgPSBmYWN0b3J5SW5q ZWN0aW9ucy5jb25jYXQoY29udGFpbmVyLmZhY3RvcnlJbmplY3Rpb25zW2Z1 bGxOYW1lXSB8fCBbXSk7CgogICAgICBmYWN0b3J5SW5qZWN0aW9ucyA9IGJ1 aWxkSW5qZWN0aW9ucyhjb250YWluZXIsIGZhY3RvcnlJbmplY3Rpb25zKTsK ICAgICAgZmFjdG9yeUluamVjdGlvbnMuX2RlYnVnQ29udGFpbmVyS2V5ID0g ZnVsbE5hbWU7CgogICAgICByZXR1cm4gZmFjdG9yeUluamVjdGlvbnM7CiAg ICB9CgogICAgZnVuY3Rpb24gaW5zdGFudGlhdGUoY29udGFpbmVyLCBmdWxs TmFtZSkgewogICAgICB2YXIgZmFjdG9yeSA9IGZhY3RvcnlGb3IoY29udGFp bmVyLCBmdWxsTmFtZSk7CgogICAgICBpZiAob3B0aW9uKGNvbnRhaW5lciwg ZnVsbE5hbWUsICdpbnN0YW50aWF0ZScpID09PSBmYWxzZSkgewogICAgICAg IHJldHVybiBmYWN0b3J5OwogICAgICB9CgogICAgICBpZiAoZmFjdG9yeSkg ewogICAgICAgIGlmICh0eXBlb2YgZmFjdG9yeS5leHRlbmQgPT09ICdmdW5j dGlvbicpIHsKICAgICAgICAgIC8vIGFzc3VtZSB0aGUgZmFjdG9yeSB3YXMg ZXh0ZW5kYWJsZSBhbmQgaXMgYWxyZWFkeSBpbmplY3RlZAogICAgICAgICAg cmV0dXJuIGZhY3RvcnkuY3JlYXRlKCk7CiAgICAgICAgfSBlbHNlIHsKICAg ICAgICAgIC8vIGFzc3VtZSB0aGUgZmFjdG9yeSB3YXMgZXh0ZW5kYWJsZQog ICAgICAgICAgLy8gdG8gY3JlYXRlIHRpbWUgaW5qZWN0aW9ucwogICAgICAg ICAgLy8gVE9ETzogc3VwcG9ydCBuZXcnaW5nIGZvciBpbnN0YW50aWF0aW9u IGFuZCBtZXJnZSBpbmplY3Rpb25zIGZvciBwdXJlIEpTIEZ1bmN0aW9ucwog ICAgICAgICAgcmV0dXJuIGZhY3RvcnkuY3JlYXRlKGluamVjdGlvbnNGb3Io Y29udGFpbmVyLCBmdWxsTmFtZSkpOwogICAgICAgIH0KICAgICAgfQogICAg fQoKICAgIGZ1bmN0aW9uIGVhY2hEZXN0cm95YWJsZShjb250YWluZXIsIGNh bGxiYWNrKSB7CiAgICAgIGNvbnRhaW5lci5jYWNoZS5lYWNoTG9jYWwoZnVu Y3Rpb24oa2V5LCB2YWx1ZSkgewogICAgICAgIGlmIChvcHRpb24oY29udGFp bmVyLCBrZXksICdpbnN0YW50aWF0ZScpID09PSBmYWxzZSkgeyByZXR1cm47 IH0KICAgICAgICBjYWxsYmFjayh2YWx1ZSk7CiAgICAgIH0pOwogICAgfQoK ICAgIGZ1bmN0aW9uIHJlc2V0Q2FjaGUoY29udGFpbmVyKSB7CiAgICAgIGNv bnRhaW5lci5jYWNoZS5lYWNoTG9jYWwoZnVuY3Rpb24oa2V5LCB2YWx1ZSkg ewogICAgICAgIGlmIChvcHRpb24oY29udGFpbmVyLCBrZXksICdpbnN0YW50 aWF0ZScpID09PSBmYWxzZSkgeyByZXR1cm47IH0KICAgICAgICB2YWx1ZS5k ZXN0cm95KCk7CiAgICAgIH0pOwogICAgICBjb250YWluZXIuY2FjaGUuZGlj dCA9IHt9OwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZFR5cGVJbmplY3Rpb24o cnVsZXMsIHR5cGUsIHByb3BlcnR5LCBmdWxsTmFtZSkgewogICAgICB2YXIg aW5qZWN0aW9ucyA9IHJ1bGVzLmdldCh0eXBlKTsKCiAgICAgIGlmICghaW5q ZWN0aW9ucykgewogICAgICAgIGluamVjdGlvbnMgPSBbXTsKICAgICAgICBy dWxlcy5zZXQodHlwZSwgaW5qZWN0aW9ucyk7CiAgICAgIH0KCiAgICAgIGlu amVjdGlvbnMucHVzaCh7CiAgICAgICAgcHJvcGVydHk6IHByb3BlcnR5LAog ICAgICAgIGZ1bGxOYW1lOiBmdWxsTmFtZQogICAgICB9KTsKICAgIH0KCiAg ICB2YXIgVkFMSURfRlVMTF9OQU1FX1JFR0VYUCA9IC9eW146XSsuKzpbXjpd KyQvOwogICAgZnVuY3Rpb24gdmFsaWRhdGVGdWxsTmFtZShmdWxsTmFtZSkg ewogICAgICBpZiAoIVZBTElEX0ZVTExfTkFNRV9SRUdFWFAudGVzdChmdWxs TmFtZSkpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlk IEZ1bGxuYW1lLCBleHBlY3RlZDogYHR5cGU6bmFtZWAgZ290OiAnICsgZnVs bE5hbWUpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYWRkSW5qZWN0 aW9uKHJ1bGVzLCBmYWN0b3J5TmFtZSwgcHJvcGVydHksIGluamVjdGlvbk5h bWUpIHsKICAgICAgdmFyIGluamVjdGlvbnMgPSBydWxlc1tmYWN0b3J5TmFt ZV0gPSBydWxlc1tmYWN0b3J5TmFtZV0gfHwgW107CiAgICAgIGluamVjdGlv bnMucHVzaCh7IHByb3BlcnR5OiBwcm9wZXJ0eSwgZnVsbE5hbWU6IGluamVj dGlvbk5hbWUgfSk7CiAgICB9CgogICAgX19leHBvcnRzX19bImRlZmF1bHQi XSA9IENvbnRhaW5lcjsKICB9KTsKZGVmaW5lKCJjb250YWluZXIvaW5oZXJp dGluZ19kaWN0IiwgCiAgWyJleHBvcnRzIl0sCiAgZnVuY3Rpb24oX19leHBv cnRzX18pIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIC8vIEEgc2FmZSBhbmQg c2ltcGxlIGluaGVyaXRpbmcgb2JqZWN0LgogICAgZnVuY3Rpb24gSW5oZXJp dGluZ0RpY3QocGFyZW50KSB7CiAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50 OwogICAgICB0aGlzLmRpY3QgPSB7fTsKICAgIH0KCiAgICBJbmhlcml0aW5n RGljdC5wcm90b3R5cGUgPSB7CgogICAgICAvKioKICAgICAgICBAcHJvcGVy dHkgcGFyZW50CiAgICAgICAgQHR5cGUgSW5oZXJpdGluZ0RpY3QKICAgICAg ICBAZGVmYXVsdCBudWxsCiAgICAgICovCgogICAgICBwYXJlbnQ6IG51bGws CgogICAgICAvKioKICAgICAgICBPYmplY3QgdXNlZCB0byBzdG9yZSB0aGUg Y3VycmVudCBub2RlcyBkYXRhLgoKICAgICAgICBAcHJvcGVydHkgZGljdAog ICAgICAgIEB0eXBlIE9iamVjdAogICAgICAgIEBkZWZhdWx0IE9iamVjdAog ICAgICAqLwogICAgICBkaWN0OiBudWxsLAoKICAgICAgLyoqCiAgICAgICAg UmV0cmlldmUgdGhlIHZhbHVlIGdpdmVuIGEga2V5LCBpZiB0aGUgdmFsdWUg aXMgcHJlc2VudCBhdCB0aGUgY3VycmVudAogICAgICAgIGxldmVsIHVzZSBp dCwgb3RoZXJ3aXNlIHdhbGsgdXAgdGhlIHBhcmVudCBoaWVyYXJjaHkgYW5k IHRyeSBhZ2Fpbi4gSWYKICAgICAgICBubyBtYXRjaGluZyBrZXkgaXMgZm91 bmQsIHJldHVybiB1bmRlZmluZWQuCgogICAgICAgIEBtZXRob2QgZ2V0CiAg ICAgICAgQHBhcmFtIHtTdHJpbmd9IGtleQogICAgICAgIEByZXR1cm4ge2Fu eX0KICAgICAgKi8KICAgICAgZ2V0OiBmdW5jdGlvbihrZXkpIHsKICAgICAg ICB2YXIgZGljdCA9IHRoaXMuZGljdDsKCiAgICAgICAgaWYgKGRpY3QuaGFz T3duUHJvcGVydHkoa2V5KSkgewogICAgICAgICAgcmV0dXJuIGRpY3Rba2V5 XTsKICAgICAgICB9CgogICAgICAgIGlmICh0aGlzLnBhcmVudCkgewogICAg ICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmdldChrZXkpOwogICAgICAgIH0K ICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgIFNldCB0aGUgZ2l2ZW4gdmFs dWUgZm9yIHRoZSBnaXZlbiBrZXksIGF0IHRoZSBjdXJyZW50IGxldmVsLgoK ICAgICAgICBAbWV0aG9kIHNldAogICAgICAgIEBwYXJhbSB7U3RyaW5nfSBr ZXkKICAgICAgICBAcGFyYW0ge0FueX0gdmFsdWUKICAgICAgKi8KICAgICAg c2V0OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7CiAgICAgICAgdGhpcy5kaWN0 W2tleV0gPSB2YWx1ZTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgIERl bGV0ZSB0aGUgZ2l2ZW4ga2V5CgogICAgICAgIEBtZXRob2QgcmVtb3ZlCiAg ICAgICAgQHBhcmFtIHtTdHJpbmd9IGtleQogICAgICAqLwogICAgICByZW1v dmU6IGZ1bmN0aW9uKGtleSkgewogICAgICAgIGRlbGV0ZSB0aGlzLmRpY3Rb a2V5XTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgIENoZWNrIGZvciB0 aGUgZXhpc3RlbmNlIG9mIGdpdmVuIGEga2V5LCBpZiB0aGUga2V5IGlzIHBy ZXNlbnQgYXQgdGhlIGN1cnJlbnQKICAgICAgICBsZXZlbCByZXR1cm4gdHJ1 ZSwgb3RoZXJ3aXNlIHdhbGsgdXAgdGhlIHBhcmVudCBoaWVyYXJjaHkgYW5k IHRyeSBhZ2Fpbi4gSWYKICAgICAgICBubyBtYXRjaGluZyBrZXkgaXMgZm91 bmQsIHJldHVybiBmYWxzZS4KCiAgICAgICAgQG1ldGhvZCBoYXMKICAgICAg ICBAcGFyYW0ge1N0cmluZ30ga2V5CiAgICAgICAgQHJldHVybiB7Qm9vbGVh bn0KICAgICAgKi8KICAgICAgaGFzOiBmdW5jdGlvbihrZXkpIHsKICAgICAg ICB2YXIgZGljdCA9IHRoaXMuZGljdDsKCiAgICAgICAgaWYgKGRpY3QuaGFz T3duUHJvcGVydHkoa2V5KSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAg ICAgICAgfQoKICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHsKICAgICAgICAg IHJldHVybiB0aGlzLnBhcmVudC5oYXMoa2V5KTsKICAgICAgICB9CgogICAg ICAgIHJldHVybiBmYWxzZTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAg IEl0ZXJhdGUgYW5kIGludm9rZSBhIGNhbGxiYWNrIGZvciBlYWNoIGxvY2Fs IGtleS12YWx1ZSBwYWlyLgoKICAgICAgICBAbWV0aG9kIGVhY2hMb2NhbAog ICAgICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgICAgQHBh cmFtIHtPYmplY3R9IGJpbmRpbmcKICAgICAgKi8KICAgICAgZWFjaExvY2Fs OiBmdW5jdGlvbihjYWxsYmFjaywgYmluZGluZykgewogICAgICAgIHZhciBk aWN0ID0gdGhpcy5kaWN0OwoKICAgICAgICBmb3IgKHZhciBwcm9wIGluIGRp Y3QpIHsKICAgICAgICAgIGlmIChkaWN0Lmhhc093blByb3BlcnR5KHByb3Ap KSB7CiAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoYmluZGluZywgcHJvcCwg ZGljdFtwcm9wXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAg ICB9OwoKICAgIF9fZXhwb3J0c19fWyJkZWZhdWx0Il0gPSBJbmhlcml0aW5n RGljdDsKICB9KTsKZGVmaW5lKCJjb250YWluZXIiLCAKICBbImNvbnRhaW5l ci9jb250YWluZXIiLCJleHBvcnRzIl0sCiAgZnVuY3Rpb24oX19kZXBlbmRl bmN5MV9fLCBfX2V4cG9ydHNfXykgewogICAgInVzZSBzdHJpY3QiOwogICAg LyoqCiAgICBQdWJsaWMgYXBpIGZvciB0aGUgY29udGFpbmVyIGlzIHN0aWxs IGluIGZsdXguCiAgICBUaGUgcHVibGljIGFwaSwgc3BlY2lmaWVkIG9uIHRo ZSBhcHBsaWNhdGlvbiBuYW1lc3BhY2Ugc2hvdWxkIGJlIGNvbnNpZGVyZWQg dGhlIHN0YWJsZSBhcGkuCiAgICAvLyBAbW9kdWxlIGNvbnRhaW5lcgogICAg ICBAcHJpdmF0ZQogICAgKi8KCiAgICAvKgogICAgIEZsYWcgdG8gZW5hYmxl L2Rpc2FibGUgbW9kZWwgZmFjdG9yeSBpbmplY3Rpb25zIChkaXNhYmxlZCBi eSBkZWZhdWx0KQogICAgIElmIG1vZGVsIGZhY3RvcnkgaW5qZWN0aW9ucyBh cmUgZW5hYmxlZCwgbW9kZWxzIHNob3VsZCBub3QgYmUKICAgICBhY2Nlc3Nl ZCBnbG9iYWxseSAob25seSB0aHJvdWdoIGBjb250YWluZXIubG9va3VwRmFj dG9yeSgnbW9kZWw6bW9kZWxOYW1lJykpYCk7CiAgICAqLwogICAgRW1iZXIu TU9ERUxfRkFDVE9SWV9JTkpFQ1RJT05TID0gZmFsc2UgfHwgISFFbWJlci5F TlYuTU9ERUxfRkFDVE9SWV9JTkpFQ1RJT05TOwoKICAgIHZhciBDb250YWlu ZXIgPSBfX2RlcGVuZGVuY3kxX19bImRlZmF1bHQiXTsKCiAgICBfX2V4cG9y dHNfX1siZGVmYXVsdCJdID0gQ29udGFpbmVyOwogIH0pOwp9KSgpOwoKKGZ1 bmN0aW9uKCkgewovKmdsb2JhbHMgRU5WICovCi8qKgpAbW9kdWxlIGVtYmVy CkBzdWJtb2R1bGUgZW1iZXItcnVudGltZQoqLwoKdmFyIGluZGV4T2YgPSBF bWJlci5FbnVtZXJhYmxlVXRpbHMuaW5kZXhPZjsKCi8qKgogVGhpcyB3aWxs IGNvbXBhcmUgdHdvIGphdmFzY3JpcHQgdmFsdWVzIG9mIHBvc3NpYmx5IGRp ZmZlcmVudCB0eXBlcy4KIEl0IHdpbGwgdGVsbCB5b3Ugd2hpY2ggb25lIGlz IGdyZWF0ZXIgdGhhbiB0aGUgb3RoZXIgYnkgcmV0dXJuaW5nOgoKICAtIC0x IGlmIHRoZSBmaXJzdCBpcyBzbWFsbGVyIHRoYW4gdGhlIHNlY29uZCwKICAt IDAgaWYgYm90aCBhcmUgZXF1YWwsCiAgLSAxIGlmIHRoZSBmaXJzdCBpcyBn cmVhdGVyIHRoYW4gdGhlIHNlY29uZC4KCiBUaGUgb3JkZXIgaXMgY2FsY3Vs YXRlZCBiYXNlZCBvbiBgRW1iZXIuT1JERVJfREVGSU5JVElPTmAsIGlmIHR5 cGVzIGFyZSBkaWZmZXJlbnQuCiBJbiBjYXNlIHRoZXkgaGF2ZSB0aGUgc2Ft ZSB0eXBlIGFuIGFwcHJvcHJpYXRlIGNvbXBhcmlzb24gZm9yIHRoaXMgdHlw ZSBpcyBtYWRlLgoKICBgYGBqYXZhc2NyaXB0CiAgRW1iZXIuY29tcGFyZSgn aGVsbG8nLCAnaGVsbG8nKTsgIC8vIDAKICBFbWJlci5jb21wYXJlKCdhYmMn LCAnZGZnJyk7ICAgICAgLy8gLTEKICBFbWJlci5jb21wYXJlKDIsIDEpOyAg ICAgICAgICAgICAgLy8gMQogIGBgYAoKIEBtZXRob2QgY29tcGFyZQogQGZv ciBFbWJlcgogQHBhcmFtIHtPYmplY3R9IHYgRmlyc3QgdmFsdWUgdG8gY29t cGFyZQogQHBhcmFtIHtPYmplY3R9IHcgU2Vjb25kIHZhbHVlIHRvIGNvbXBh cmUKIEByZXR1cm4ge051bWJlcn0gLTEgaWYgdiA8IHcsIDAgaWYgdiA9IHcg YW5kIDEgaWYgdiA+IHcuCiovCkVtYmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBj b21wYXJlKHYsIHcpIHsKICBpZiAodiA9PT0gdykgeyByZXR1cm4gMDsgfQoK ICB2YXIgdHlwZTEgPSBFbWJlci50eXBlT2Yodik7CiAgdmFyIHR5cGUyID0g RW1iZXIudHlwZU9mKHcpOwoKICB2YXIgQ29tcGFyYWJsZSA9IEVtYmVyLkNv bXBhcmFibGU7CiAgaWYgKENvbXBhcmFibGUpIHsKICAgIGlmICh0eXBlMT09 PSdpbnN0YW5jZScgJiYgQ29tcGFyYWJsZS5kZXRlY3Qodi5jb25zdHJ1Y3Rv cikpIHsKICAgICAgcmV0dXJuIHYuY29uc3RydWN0b3IuY29tcGFyZSh2LCB3 KTsKICAgIH0KCiAgICBpZiAodHlwZTIgPT09ICdpbnN0YW5jZScgJiYgQ29t cGFyYWJsZS5kZXRlY3Qody5jb25zdHJ1Y3RvcikpIHsKICAgICAgcmV0dXJu IDEtdy5jb25zdHJ1Y3Rvci5jb21wYXJlKHcsIHYpOwogICAgfQogIH0KCiAg Ly8gSWYgd2UgaGF2ZW4ndCB5ZXQgZ2VuZXJhdGVkIGEgcmV2ZXJzZS1tYXBw aW5nIG9mIEVtYmVyLk9SREVSX0RFRklOSVRJT04sCiAgLy8gZG8gc28gbm93 LgogIHZhciBtYXBwaW5nID0gRW1iZXIuT1JERVJfREVGSU5JVElPTl9NQVBQ SU5HOwogIGlmICghbWFwcGluZykgewogICAgdmFyIG9yZGVyID0gRW1iZXIu T1JERVJfREVGSU5JVElPTjsKICAgIG1hcHBpbmcgPSBFbWJlci5PUkRFUl9E RUZJTklUSU9OX01BUFBJTkcgPSB7fTsKICAgIHZhciBpZHgsIGxlbjsKICAg IGZvciAoaWR4ID0gMCwgbGVuID0gb3JkZXIubGVuZ3RoOyBpZHggPCBsZW47 ICArK2lkeCkgewogICAgICBtYXBwaW5nW29yZGVyW2lkeF1dID0gaWR4Owog ICAgfQoKICAgIC8vIFdlIG5vIGxvbmdlciBuZWVkIEVtYmVyLk9SREVSX0RF RklOSVRJT04uCiAgICBkZWxldGUgRW1iZXIuT1JERVJfREVGSU5JVElPTjsK ICB9CgogIHZhciB0eXBlMUluZGV4ID0gbWFwcGluZ1t0eXBlMV07CiAgdmFy IHR5cGUySW5kZXggPSBtYXBwaW5nW3R5cGUyXTsKCiAgaWYgKHR5cGUxSW5k ZXggPCB0eXBlMkluZGV4KSB7IHJldHVybiAtMTsgfQogIGlmICh0eXBlMUlu ZGV4ID4gdHlwZTJJbmRleCkgeyByZXR1cm4gMTsgfQoKICAvLyB0eXBlcyBh cmUgZXF1YWwgLSBzbyB3ZSBoYXZlIHRvIGNoZWNrIHZhbHVlcyBub3cKICBz d2l0Y2ggKHR5cGUxKSB7CiAgICBjYXNlICdib29sZWFuJzoKICAgIGNhc2Ug J251bWJlcic6CiAgICAgIGlmICh2IDwgdykgeyByZXR1cm4gLTE7IH0KICAg ICAgaWYgKHYgPiB3KSB7IHJldHVybiAxOyB9CiAgICAgIHJldHVybiAwOwoK ICAgIGNhc2UgJ3N0cmluZyc6CiAgICAgIHZhciBjb21wID0gdi5sb2NhbGVD b21wYXJlKHcpOwogICAgICBpZiAoY29tcCA8IDApIHsgcmV0dXJuIC0xOyB9 CiAgICAgIGlmIChjb21wID4gMCkgeyByZXR1cm4gMTsgfQogICAgICByZXR1 cm4gMDsKCiAgICBjYXNlICdhcnJheSc6CiAgICAgIHZhciB2TGVuID0gdi5s ZW5ndGg7CiAgICAgIHZhciB3TGVuID0gdy5sZW5ndGg7CiAgICAgIHZhciBs ID0gTWF0aC5taW4odkxlbiwgd0xlbik7CiAgICAgIHZhciByID0gMDsKICAg ICAgdmFyIGkgPSAwOwogICAgICB3aGlsZSAociA9PT0gMCAmJiBpIDwgbCkg ewogICAgICAgIHIgPSBjb21wYXJlKHZbaV0sd1tpXSk7CiAgICAgICAgaSsr OwogICAgICB9CiAgICAgIGlmIChyICE9PSAwKSB7IHJldHVybiByOyB9Cgog ICAgICAvLyBhbGwgZWxlbWVudHMgYXJlIGVxdWFsIG5vdwogICAgICAvLyBz aG9ydGVyIGFycmF5IHNob3VsZCBiZSBvcmRlcmVkIGZpcnN0CiAgICAgIGlm ICh2TGVuIDwgd0xlbikgeyByZXR1cm4gLTE7IH0KICAgICAgaWYgKHZMZW4g PiB3TGVuKSB7IHJldHVybiAxOyB9CiAgICAgIC8vIGFycmF5cyBhcmUgZXF1 YWwgbm93CiAgICAgIHJldHVybiAwOwoKICAgIGNhc2UgJ2luc3RhbmNlJzoK ICAgICAgaWYgKEVtYmVyLkNvbXBhcmFibGUgJiYgRW1iZXIuQ29tcGFyYWJs ZS5kZXRlY3QodikpIHsKICAgICAgICByZXR1cm4gdi5jb21wYXJlKHYsIHcp OwogICAgICB9CiAgICAgIHJldHVybiAwOwoKICAgIGNhc2UgJ2RhdGUnOgog ICAgICB2YXIgdk51bSA9IHYuZ2V0VGltZSgpOwogICAgICB2YXIgd051bSA9 IHcuZ2V0VGltZSgpOwogICAgICBpZiAodk51bSA8IHdOdW0pIHsgcmV0dXJu IC0xOyB9CiAgICAgIGlmICh2TnVtID4gd051bSkgeyByZXR1cm4gMTsgfQog ICAgICByZXR1cm4gMDsKCiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gMDsK ICB9Cn07CgpmdW5jdGlvbiBfY29weShvYmosIGRlZXAsIHNlZW4sIGNvcGll cykgewogIHZhciByZXQsIGxvYywga2V5OwoKICAvLyBwcmltaXRpdmUgZGF0 YSB0eXBlcyBhcmUgaW1tdXRhYmxlLCBqdXN0IHJldHVybiB0aGVtLgogIGlm ICgnb2JqZWN0JyAhPT0gdHlwZW9mIG9iaiB8fCBvYmo9PT1udWxsKSByZXR1 cm4gb2JqOwoKICAvLyBhdm9pZCBjeWNsaWNhbCBsb29wcwogIGlmIChkZWVw ICYmIChsb2M9aW5kZXhPZihzZWVuLCBvYmopKT49MCkgcmV0dXJuIGNvcGll c1tsb2NdOwoKICBFbWJlci5hc3NlcnQoJ0Nhbm5vdCBjbG9uZSBhbiBFbWJl ci5PYmplY3QgdGhhdCBkb2VzIG5vdCBpbXBsZW1lbnQgRW1iZXIuQ29weWFi bGUnLCAhKG9iaiBpbnN0YW5jZW9mIEVtYmVyLk9iamVjdCkgfHwgKEVtYmVy LkNvcHlhYmxlICYmIEVtYmVyLkNvcHlhYmxlLmRldGVjdChvYmopKSk7Cgog IC8vIElNUE9SVEFOVDogdGhpcyBzcGVjaWZpYyB0ZXN0IHdpbGwgZGV0ZWN0 IGEgbmF0aXZlIGFycmF5IG9ubHkuIEFueSBvdGhlcgogIC8vIG9iamVjdCB3 aWxsIG5lZWQgdG8gaW1wbGVtZW50IENvcHlhYmxlLgogIGlmIChFbWJlci50 eXBlT2Yob2JqKSA9PT0gJ2FycmF5JykgewogICAgcmV0ID0gb2JqLnNsaWNl KCk7CiAgICBpZiAoZGVlcCkgewogICAgICBsb2MgPSByZXQubGVuZ3RoOwog ICAgICB3aGlsZSgtLWxvYz49MCkgcmV0W2xvY10gPSBfY29weShyZXRbbG9j XSwgZGVlcCwgc2VlbiwgY29waWVzKTsKICAgIH0KICB9IGVsc2UgaWYgKEVt YmVyLkNvcHlhYmxlICYmIEVtYmVyLkNvcHlhYmxlLmRldGVjdChvYmopKSB7 CiAgICByZXQgPSBvYmouY29weShkZWVwLCBzZWVuLCBjb3BpZXMpOwogIH0g ZWxzZSB7CiAgICByZXQgPSB7fTsKICAgIGZvcihrZXkgaW4gb2JqKSB7CiAg ICAgIGlmICghb2JqLmhhc093blByb3BlcnR5KGtleSkpIGNvbnRpbnVlOwoK ICAgICAgLy8gUHJldmVudHMgYnJvd3NlcnMgdGhhdCBkb24ndCByZXNwZWN0 IG5vbi1lbnVtZXJhYmlsaXR5IGZyb20KICAgICAgLy8gY29weWluZyBpbnRl cm5hbCBFbWJlciBwcm9wZXJ0aWVzCiAgICAgIGlmIChrZXkuc3Vic3RyaW5n KDAsMikgPT09ICdfXycpIGNvbnRpbnVlOwoKICAgICAgcmV0W2tleV0gPSBk ZWVwID8gX2NvcHkob2JqW2tleV0sIGRlZXAsIHNlZW4sIGNvcGllcykgOiBv Ympba2V5XTsKICAgIH0KICB9CgogIGlmIChkZWVwKSB7CiAgICBzZWVuLnB1 c2gob2JqKTsKICAgIGNvcGllcy5wdXNoKHJldCk7CiAgfQoKICByZXR1cm4g cmV0Owp9CgovKioKICBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIHBhc3NlZCBv YmplY3QuIFRoaXMgZnVuY3Rpb24gY2FuIHRha2UganVzdCBhYm91dAogIGFu eSB0eXBlIG9mIG9iamVjdCBhbmQgY3JlYXRlIGEgY2xvbmUgb2YgaXQsIGlu Y2x1ZGluZyBwcmltaXRpdmUgdmFsdWVzCiAgKHdoaWNoIGFyZSBub3QgYWN0 dWFsbHkgY2xvbmVkIGJlY2F1c2UgdGhleSBhcmUgaW1tdXRhYmxlKS4KCiAg SWYgdGhlIHBhc3NlZCBvYmplY3QgaW1wbGVtZW50cyB0aGUgYGNsb25lKClg IG1ldGhvZCwgdGhlbiB0aGlzIGZ1bmN0aW9uCiAgd2lsbCBzaW1wbHkgY2Fs bCB0aGF0IG1ldGhvZCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCgogIEBtZXRo b2QgY29weQogIEBmb3IgRW1iZXIKICBAcGFyYW0ge09iamVjdH0gb2JqIFRo ZSBvYmplY3QgdG8gY2xvbmUKICBAcGFyYW0ge0Jvb2xlYW59IGRlZXAgSWYg dHJ1ZSwgYSBkZWVwIGNvcHkgb2YgdGhlIG9iamVjdCBpcyBtYWRlCiAgQHJl dHVybiB7T2JqZWN0fSBUaGUgY2xvbmVkIG9iamVjdAoqLwpFbWJlci5jb3B5 ID0gZnVuY3Rpb24ob2JqLCBkZWVwKSB7CiAgLy8gZmFzdCBwYXRocwogIGlm ICgnb2JqZWN0JyAhPT0gdHlwZW9mIG9iaiB8fCBvYmo9PT1udWxsKSByZXR1 cm4gb2JqOyAvLyBjYW4ndCBjb3B5IHByaW1pdGl2ZXMKICBpZiAoRW1iZXIu Q29weWFibGUgJiYgRW1iZXIuQ29weWFibGUuZGV0ZWN0KG9iaikpIHJldHVy biBvYmouY29weShkZWVwKTsKICByZXR1cm4gX2NvcHkob2JqLCBkZWVwLCBk ZWVwID8gW10gOiBudWxsLCBkZWVwID8gW10gOiBudWxsKTsKfTsKCi8qKgog IENvbXBhcmVzIHR3byBvYmplY3RzLCByZXR1cm5pbmcgdHJ1ZSBpZiB0aGV5 IGFyZSBsb2dpY2FsbHkgZXF1YWwuIFRoaXMgaXMKICBhIGRlZXBlciBjb21w YXJpc29uIHRoYW4gYSBzaW1wbGUgdHJpcGxlIGVxdWFsLiBGb3Igc2V0cyBp dCB3aWxsIGNvbXBhcmUgdGhlCiAgaW50ZXJuYWwgb2JqZWN0cy4gRm9yIGFu eSBvdGhlciBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIGBpc0VxdWFsKClgIGl0 IHdpbGwKICByZXNwZWN0IHRoYXQgbWV0aG9kLgoKICBgYGBqYXZhc2NyaXB0 CiAgRW1iZXIuaXNFcXVhbCgnaGVsbG8nLCAnaGVsbG8nKTsgIC8vIHRydWUK ICBFbWJlci5pc0VxdWFsKDEsIDIpOyAgICAgICAgICAgICAgLy8gZmFsc2UK ICBFbWJlci5pc0VxdWFsKFs0LDJdLCBbNCwyXSk7ICAgICAgLy8gZmFsc2UK ICBgYGAKCiAgQG1ldGhvZCBpc0VxdWFsCiAgQGZvciBFbWJlcgogIEBwYXJh bSB7T2JqZWN0fSBhIGZpcnN0IG9iamVjdCB0byBjb21wYXJlCiAgQHBhcmFt IHtPYmplY3R9IGIgc2Vjb25kIG9iamVjdCB0byBjb21wYXJlCiAgQHJldHVy biB7Qm9vbGVhbn0KKi8KRW1iZXIuaXNFcXVhbCA9IGZ1bmN0aW9uKGEsIGIp IHsKICBpZiAoYSAmJiAnZnVuY3Rpb24nPT09dHlwZW9mIGEuaXNFcXVhbCkg cmV0dXJuIGEuaXNFcXVhbChiKTsKICByZXR1cm4gYSA9PT0gYjsKfTsKCi8v IFVzZWQgYnkgRW1iZXIuY29tcGFyZQpFbWJlci5PUkRFUl9ERUZJTklUSU9O ID0gRW1iZXIuRU5WLk9SREVSX0RFRklOSVRJT04gfHwgWwogICd1bmRlZmlu ZWQnLAogICdudWxsJywKICAnYm9vbGVhbicsCiAgJ251bWJlcicsCiAgJ3N0 cmluZycsCiAgJ2FycmF5JywKICAnb2JqZWN0JywKICAnaW5zdGFuY2UnLAog ICdmdW5jdGlvbicsCiAgJ2NsYXNzJywKICAnZGF0ZScKXTsKCi8qKgogIFJl dHVybnMgYWxsIG9mIHRoZSBrZXlzIGRlZmluZWQgb24gYW4gb2JqZWN0IG9y IGhhc2guIFRoaXMgaXMgdXNlZnVsCiAgd2hlbiBpbnNwZWN0aW5nIG9iamVj dHMgZm9yIGRlYnVnZ2luZy4gT24gYnJvd3NlcnMgdGhhdCBzdXBwb3J0IGl0 LCB0aGlzCiAgdXNlcyB0aGUgbmF0aXZlIGBPYmplY3Qua2V5c2AgaW1wbGVt ZW50YXRpb24uCgogIEBtZXRob2Qga2V5cwogIEBmb3IgRW1iZXIKICBAcGFy YW0ge09iamVjdH0gb2JqCiAgQHJldHVybiB7QXJyYXl9IEFycmF5IGNvbnRh aW5pbmcga2V5cyBvZiBvYmoKKi8KRW1iZXIua2V5cyA9IE9iamVjdC5rZXlz OwoKaWYgKCFFbWJlci5rZXlzIHx8IEVtYmVyLmNyZWF0ZS5pc1NpbXVsYXRl ZCkgewogIHZhciBwcm90b3R5cGVQcm9wZXJ0aWVzID0gWwogICAgJ2NvbnN0 cnVjdG9yJywKICAgICdoYXNPd25Qcm9wZXJ0eScsCiAgICAnaXNQcm90b3R5 cGVPZicsCiAgICAncHJvcGVydHlJc0VudW1lcmFibGUnLAogICAgJ3ZhbHVl T2YnLAogICAgJ3RvTG9jYWxlU3RyaW5nJywKICAgICd0b1N0cmluZycKICBd LAogIHB1c2hQcm9wZXJ0eU5hbWUgPSBmdW5jdGlvbihvYmosIGFycmF5LCBr ZXkpIHsKICAgIC8vIFByZXZlbnRzIGJyb3dzZXJzIHRoYXQgZG9uJ3QgcmVz cGVjdCBub24tZW51bWVyYWJpbGl0eSBmcm9tCiAgICAvLyBjb3B5aW5nIGlu dGVybmFsIEVtYmVyIHByb3BlcnRpZXMKICAgIGlmIChrZXkuc3Vic3RyaW5n KDAsMikgPT09ICdfXycpIHJldHVybjsKICAgIGlmIChrZXkgPT09ICdfc3Vw ZXInKSByZXR1cm47CiAgICBpZiAoaW5kZXhPZihhcnJheSwga2V5KSA+PSAw KSByZXR1cm47CiAgICBpZiAoIW9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSBy ZXR1cm47CgogICAgYXJyYXkucHVzaChrZXkpOwogIH07CgogIEVtYmVyLmtl eXMgPSBmdW5jdGlvbihvYmopIHsKICAgIHZhciByZXQgPSBbXSwga2V5Owog ICAgZm9yIChrZXkgaW4gb2JqKSB7CiAgICAgIHB1c2hQcm9wZXJ0eU5hbWUo b2JqLCByZXQsIGtleSk7CiAgICB9CgogICAgLy8gSUU4IGRvZXNuJ3QgZW51 bWVyYXRlIHByb3BlcnR5IHRoYXQgbmFtZWQgdGhlIHNhbWUgYXMgcHJvdG90 eXBlIHByb3BlcnRpZXMuCiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHByb3Rv dHlwZVByb3BlcnRpZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIGtl eSA9IHByb3RvdHlwZVByb3BlcnRpZXNbaV07CgogICAgICBwdXNoUHJvcGVy dHlOYW1lKG9iaiwgcmV0LCBrZXkpOwogICAgfQoKICAgIHJldHVybiByZXQ7 CiAgfTsKfQoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewovKioKQG1vZHVsZSBl bWJlcgpAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKKi8KCnZhciBTVFJJTkdf REFTSEVSSVpFX1JFR0VYUCA9ICgvWyBfXS9nKTsKdmFyIFNUUklOR19EQVNI RVJJWkVfQ0FDSEUgPSB7fTsKdmFyIFNUUklOR19ERUNBTUVMSVpFX1JFR0VY UCA9ICgvKFthLXpcZF0pKFtBLVpdKS9nKTsKdmFyIFNUUklOR19DQU1FTEla RV9SRUdFWFAgPSAoLyhcLXxffFwufFxzKSsoLik/L2cpOwp2YXIgU1RSSU5H X1VOREVSU0NPUkVfUkVHRVhQXzEgPSAoLyhbYS16XGRdKShbQS1aXSspL2cp Owp2YXIgU1RSSU5HX1VOREVSU0NPUkVfUkVHRVhQXzIgPSAoL1wtfFxzKy9n KTsKdmFyIFNUUklOR19QQVJBTUVURVJJWkVfUkVHRVhQXzEgPSAoL1tffFwv fFxzXSsvZyk7CnZhciBTVFJJTkdfUEFSQU1FVEVSSVpFX1JFR0VYUF8yID0g KC9bXmEtejAtOVwtXSsvZ2kpOwp2YXIgU1RSSU5HX1BBUkFNRVRFUklaRV9S RUdFWFBfMyA9ICgvW1wtXSsvZyk7CnZhciBTVFJJTkdfUEFSQU1FVEVSSVpF X1JFR0VYUF80ID0gKC9eLSt8LSskL2cpOwoKLyoqCiAgRGVmaW5lcyB0aGUg aGFzaCBvZiBsb2NhbGl6ZWQgc3RyaW5ncyBmb3IgdGhlIGN1cnJlbnQgbGFu Z3VhZ2UuIFVzZWQgYnkKICB0aGUgYEVtYmVyLlN0cmluZy5sb2MoKWAgaGVs cGVyLiBUbyBsb2NhbGl6ZSwgYWRkIHN0cmluZyB2YWx1ZXMgdG8gdGhpcwog IGhhc2guCgogIEBwcm9wZXJ0eSBTVFJJTkdTCiAgQGZvciBFbWJlcgogIEB0 eXBlIEhhc2gKKi8KRW1iZXIuU1RSSU5HUyA9IHt9OwoKLyoqCiAgRGVmaW5l cyBzdHJpbmcgaGVscGVyIG1ldGhvZHMgaW5jbHVkaW5nIHN0cmluZyBmb3Jt YXR0aW5nIGFuZCBsb2NhbGl6YXRpb24uCiAgVW5sZXNzIGBFbWJlci5FWFRF TkRfUFJPVE9UWVBFUy5TdHJpbmdgIGlzIGBmYWxzZWAgdGhlc2UgbWV0aG9k cyB3aWxsIGFsc28gYmUKICBhZGRlZCB0byB0aGUgYFN0cmluZy5wcm90b3R5 cGVgIGFzIHdlbGwuCgogIEBjbGFzcyBTdHJpbmcKICBAbmFtZXNwYWNlIEVt YmVyCiAgQHN0YXRpYwoqLwpFbWJlci5TdHJpbmcgPSB7CgogIC8qKgogICAg QXBwbHkgZm9ybWF0dGluZyBvcHRpb25zIHRvIHRoZSBzdHJpbmcuIFRoaXMg d2lsbCBsb29rIGZvciBvY2N1cnJlbmNlcwogICAgb2YgIiVAIiBpbiB5b3Vy IHN0cmluZyBhbmQgc3Vic3RpdHV0ZSB0aGVtIHdpdGggdGhlIGFyZ3VtZW50 cyB5b3UgcGFzcyBpbnRvCiAgICB0aGlzIG1ldGhvZC4gSWYgeW91IHdhbnQg dG8gY29udHJvbCB0aGUgc3BlY2lmaWMgb3JkZXIgb2YgcmVwbGFjZW1lbnQs CiAgICB5b3UgY2FuIGFkZCBhIG51bWJlciBhZnRlciB0aGUga2V5IGFzIHdl bGwgdG8gaW5kaWNhdGUgd2hpY2ggYXJndW1lbnQKICAgIHlvdSB3YW50IHRv IGluc2VydC4KCiAgICBPcmRlcmVkIGluc2VydGlvbnMgYXJlIG1vc3QgdXNl ZnVsIHdoZW4gYnVpbGRpbmcgbG9jIHN0cmluZ3Mgd2hlcmUgdmFsdWVzCiAg ICB5b3UgbmVlZCB0byBpbnNlcnQgbWF5IGFwcGVhciBpbiBkaWZmZXJlbnQg b3JkZXJzLgoKICAgIGBgYGphdmFzY3JpcHQKICAgICJIZWxsbyAlQCAlQCIu Zm10KCdKb2huJywgJ0RvZScpOyAgICAgLy8gIkhlbGxvIEpvaG4gRG9lIgog ICAgIkhlbGxvICVAMiwgJUAxIi5mbXQoJ0pvaG4nLCAnRG9lJyk7ICAvLyAi SGVsbG8gRG9lLCBKb2huIgogICAgYGBgCgogICAgQG1ldGhvZCBmbXQKICAg IEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0byBmb3JtYXQKICAg IEBwYXJhbSB7QXJyYXl9IGZvcm1hdHMgQW4gYXJyYXkgb2YgcGFyYW1ldGVy cyB0byBpbnRlcnBvbGF0ZSBpbnRvIHN0cmluZy4KICAgIEByZXR1cm4ge1N0 cmluZ30gZm9ybWF0dGVkIHN0cmluZwogICovCiAgZm10OiBmdW5jdGlvbihz dHIsIGZvcm1hdHMpIHsKICAgIC8vIGZpcnN0LCByZXBsYWNlIGFueSBPUkRF UkVEIHJlcGxhY2VtZW50cy4KICAgIHZhciBpZHggID0gMDsgLy8gdGhlIGN1 cnJlbnQgaW5kZXggZm9yIG5vbi1udW1lcmljYWwgcmVwbGFjZW1lbnRzCiAg ICByZXR1cm4gc3RyLnJlcGxhY2UoLyVAKFswLTldKyk/L2csIGZ1bmN0aW9u KHMsIGFyZ0luZGV4KSB7CiAgICAgIGFyZ0luZGV4ID0gKGFyZ0luZGV4KSA/ IHBhcnNlSW50KGFyZ0luZGV4LCAxMCkgLSAxIDogaWR4Kys7CiAgICAgIHMg PSBmb3JtYXRzW2FyZ0luZGV4XTsKICAgICAgcmV0dXJuIChzID09PSBudWxs KSA/ICcobnVsbCknIDogKHMgPT09IHVuZGVmaW5lZCkgPyAnJyA6IEVtYmVy Lmluc3BlY3Qocyk7CiAgICB9KSA7CiAgfSwKCiAgLyoqCiAgICBGb3JtYXRz IHRoZSBwYXNzZWQgc3RyaW5nLCBidXQgZmlyc3QgbG9va3MgdXAgdGhlIHN0 cmluZyBpbiB0aGUgbG9jYWxpemVkCiAgICBzdHJpbmdzIGhhc2guIFRoaXMg aXMgYSBjb252ZW5pZW50IHdheSB0byBsb2NhbGl6ZSB0ZXh0LiBTZWUKICAg IGBFbWJlci5TdHJpbmcuZm10KClgIGZvciBtb3JlIGluZm9ybWF0aW9uIG9u IGZvcm1hdHRpbmcuCgogICAgTm90ZSB0aGF0IGl0IGlzIHRyYWRpdGlvbmFs IGJ1dCBub3QgcmVxdWlyZWQgdG8gcHJlZml4IGxvY2FsaXplZCBzdHJpbmcK ICAgIGtleXMgd2l0aCBhbiB1bmRlcnNjb3JlIG9yIG90aGVyIGNoYXJhY3Rl ciBzbyB5b3UgY2FuIGVhc2lseSBpZGVudGlmeQogICAgbG9jYWxpemVkIHN0 cmluZ3MuCgogICAgYGBgamF2YXNjcmlwdAogICAgRW1iZXIuU1RSSU5HUyA9 IHsKICAgICAgJ19IZWxsbyBXb3JsZCc6ICdCb25qb3VyIGxlIG1vbmRlJywK ICAgICAgJ19IZWxsbyAlQCAlQCc6ICdCb25qb3VyICVAICVAJwogICAgfTsK CiAgICBFbWJlci5TdHJpbmcubG9jKCJfSGVsbG8gV29ybGQiKTsgIC8vICdC b25qb3VyIGxlIG1vbmRlJzsKICAgIEVtYmVyLlN0cmluZy5sb2MoIl9IZWxs byAlQCAlQCIsIFsiSm9obiIsICJTbWl0aCJdKTsgIC8vICJCb25qb3VyIEpv aG4gU21pdGgiOwogICAgYGBgCgogICAgQG1ldGhvZCBsb2MKICAgIEBwYXJh bSB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0byBmb3JtYXQKICAgIEBwYXJh bSB7QXJyYXl9IGZvcm1hdHMgT3B0aW9uYWwgYXJyYXkgb2YgcGFyYW1ldGVy cyB0byBpbnRlcnBvbGF0ZSBpbnRvIHN0cmluZy4KICAgIEByZXR1cm4ge1N0 cmluZ30gZm9ybWF0dGVkIHN0cmluZwogICovCiAgbG9jOiBmdW5jdGlvbihz dHIsIGZvcm1hdHMpIHsKICAgIHN0ciA9IEVtYmVyLlNUUklOR1Nbc3RyXSB8 fCBzdHI7CiAgICByZXR1cm4gRW1iZXIuU3RyaW5nLmZtdChzdHIsIGZvcm1h dHMpIDsKICB9LAoKICAvKioKICAgIFNwbGl0cyBhIHN0cmluZyBpbnRvIHNl cGFyYXRlIHVuaXRzIHNlcGFyYXRlZCBieSBzcGFjZXMsIGVsaW1pbmF0aW5n IGFueQogICAgZW1wdHkgc3RyaW5ncyBpbiB0aGUgcHJvY2Vzcy4gVGhpcyBp cyBhIGNvbnZlbmllbmNlIG1ldGhvZCBmb3Igc3BsaXQgdGhhdAogICAgaXMg bW9zdGx5IHVzZWZ1bCB3aGVuIGFwcGxpZWQgdG8gdGhlIGBTdHJpbmcucHJv dG90eXBlYC4KCiAgICBgYGBqYXZhc2NyaXB0CiAgICBFbWJlci5TdHJpbmcu dygiYWxwaGEgYmV0YSBnYW1tYSIpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7 CiAgICAgIGNvbnNvbGUubG9nKGtleSk7CiAgICB9KTsKCiAgICAvLyA+IGFs cGhhCiAgICAvLyA+IGJldGEKICAgIC8vID4gZ2FtbWEKICAgIGBgYAoKICAg IEBtZXRob2QgdwogICAgQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5n IHRvIHNwbGl0CiAgICBAcmV0dXJuIHtTdHJpbmd9IHNwbGl0IHN0cmluZwog ICovCiAgdzogZnVuY3Rpb24oc3RyKSB7IHJldHVybiBzdHIuc3BsaXQoL1xz Ky8pOyB9LAoKICAvKioKICAgIENvbnZlcnRzIGEgY2FtZWxpemVkIHN0cmlu ZyBpbnRvIGFsbCBsb3dlciBjYXNlIHNlcGFyYXRlZCBieSB1bmRlcnNjb3Jl cy4KCiAgICBgYGBqYXZhc2NyaXB0CiAgICAnaW5uZXJIVE1MJy5kZWNhbWVs aXplKCk7ICAgICAgICAgICAvLyAnaW5uZXJfaHRtbCcKICAgICdhY3Rpb25f bmFtZScuZGVjYW1lbGl6ZSgpOyAgICAgICAgLy8gJ2FjdGlvbl9uYW1lJwog ICAgJ2Nzcy1jbGFzcy1uYW1lJy5kZWNhbWVsaXplKCk7ICAgICAvLyAnY3Nz LWNsYXNzLW5hbWUnCiAgICAnbXkgZmF2b3JpdGUgaXRlbXMnLmRlY2FtZWxp emUoKTsgIC8vICdteSBmYXZvcml0ZSBpdGVtcycKICAgIGBgYAoKICAgIEBt ZXRob2QgZGVjYW1lbGl6ZQogICAgQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUg c3RyaW5nIHRvIGRlY2FtZWxpemUuCiAgICBAcmV0dXJuIHtTdHJpbmd9IHRo ZSBkZWNhbWVsaXplZCBzdHJpbmcuCiAgKi8KICBkZWNhbWVsaXplOiBmdW5j dGlvbihzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZShTVFJJTkdfREVD QU1FTElaRV9SRUdFWFAsICckMV8kMicpLnRvTG93ZXJDYXNlKCk7CiAgfSwK CiAgLyoqCiAgICBSZXBsYWNlcyB1bmRlcnNjb3Jlcywgc3BhY2VzLCBvciBj YW1lbENhc2Ugd2l0aCBkYXNoZXMuCgogICAgYGBgamF2YXNjcmlwdAogICAg J2lubmVySFRNTCcuZGFzaGVyaXplKCk7ICAgICAgICAgIC8vICdpbm5lci1o dG1sJwogICAgJ2FjdGlvbl9uYW1lJy5kYXNoZXJpemUoKTsgICAgICAgIC8v ICdhY3Rpb24tbmFtZScKICAgICdjc3MtY2xhc3MtbmFtZScuZGFzaGVyaXpl KCk7ICAgICAvLyAnY3NzLWNsYXNzLW5hbWUnCiAgICAnbXkgZmF2b3JpdGUg aXRlbXMnLmRhc2hlcml6ZSgpOyAgLy8gJ215LWZhdm9yaXRlLWl0ZW1zJwog ICAgYGBgCgogICAgQG1ldGhvZCBkYXNoZXJpemUKICAgIEBwYXJhbSB7U3Ry aW5nfSBzdHIgVGhlIHN0cmluZyB0byBkYXNoZXJpemUuCiAgICBAcmV0dXJu IHtTdHJpbmd9IHRoZSBkYXNoZXJpemVkIHN0cmluZy4KICAqLwogIGRhc2hl cml6ZTogZnVuY3Rpb24oc3RyKSB7CiAgICB2YXIgY2FjaGUgPSBTVFJJTkdf REFTSEVSSVpFX0NBQ0hFLAogICAgICAgIGhpdCAgID0gY2FjaGUuaGFzT3du UHJvcGVydHkoc3RyKSwKICAgICAgICByZXQ7CgogICAgaWYgKGhpdCkgewog ICAgICByZXR1cm4gY2FjaGVbc3RyXTsKICAgIH0gZWxzZSB7CiAgICAgIHJl dCA9IEVtYmVyLlN0cmluZy5kZWNhbWVsaXplKHN0cikucmVwbGFjZShTVFJJ TkdfREFTSEVSSVpFX1JFR0VYUCwnLScpOwogICAgICBjYWNoZVtzdHJdID0g cmV0OwogICAgfQoKICAgIHJldHVybiByZXQ7CiAgfSwKCiAgLyoqCiAgICBS ZXR1cm5zIHRoZSBsb3dlckNhbWVsQ2FzZSBmb3JtIG9mIGEgc3RyaW5nLgoK ICAgIGBgYGphdmFzY3JpcHQKICAgICdpbm5lckhUTUwnLmNhbWVsaXplKCk7 ICAgICAgICAgIC8vICdpbm5lckhUTUwnCiAgICAnYWN0aW9uX25hbWUnLmNh bWVsaXplKCk7ICAgICAgICAvLyAnYWN0aW9uTmFtZScKICAgICdjc3MtY2xh c3MtbmFtZScuY2FtZWxpemUoKTsgICAgIC8vICdjc3NDbGFzc05hbWUnCiAg ICAnbXkgZmF2b3JpdGUgaXRlbXMnLmNhbWVsaXplKCk7ICAvLyAnbXlGYXZv cml0ZUl0ZW1zJwogICAgJ015IEZhdm9yaXRlIEl0ZW1zJy5jYW1lbGl6ZSgp OyAgLy8gJ215RmF2b3JpdGVJdGVtcycKICAgIGBgYAoKICAgIEBtZXRob2Qg Y2FtZWxpemUKICAgIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0 byBjYW1lbGl6ZS4KICAgIEByZXR1cm4ge1N0cmluZ30gdGhlIGNhbWVsaXpl ZCBzdHJpbmcuCiAgKi8KICBjYW1lbGl6ZTogZnVuY3Rpb24oc3RyKSB7CiAg ICByZXR1cm4gc3RyLnJlcGxhY2UoU1RSSU5HX0NBTUVMSVpFX1JFR0VYUCwg ZnVuY3Rpb24obWF0Y2gsIHNlcGFyYXRvciwgY2hyKSB7CiAgICAgIHJldHVy biBjaHIgPyBjaHIudG9VcHBlckNhc2UoKSA6ICcnOwogICAgfSkucmVwbGFj ZSgvXihbQS1aXSkvLCBmdW5jdGlvbihtYXRjaCwgc2VwYXJhdG9yLCBjaHIp IHsKICAgICAgcmV0dXJuIG1hdGNoLnRvTG93ZXJDYXNlKCk7CiAgICB9KTsK ICB9LAoKICAvKioKICAgIFJldHVybnMgdGhlIFVwcGVyQ2FtZWxDYXNlIGZv cm0gb2YgYSBzdHJpbmcuCgogICAgYGBgamF2YXNjcmlwdAogICAgJ2lubmVy SFRNTCcuY2xhc3NpZnkoKTsgICAgICAgICAgLy8gJ0lubmVySFRNTCcKICAg ICdhY3Rpb25fbmFtZScuY2xhc3NpZnkoKTsgICAgICAgIC8vICdBY3Rpb25O YW1lJwogICAgJ2Nzcy1jbGFzcy1uYW1lJy5jbGFzc2lmeSgpOyAgICAgLy8g J0Nzc0NsYXNzTmFtZScKICAgICdteSBmYXZvcml0ZSBpdGVtcycuY2xhc3Np ZnkoKTsgIC8vICdNeUZhdm9yaXRlSXRlbXMnCiAgICBgYGAKCiAgICBAbWV0 aG9kIGNsYXNzaWZ5CiAgICBAcGFyYW0ge1N0cmluZ30gc3RyIHRoZSBzdHJp bmcgdG8gY2xhc3NpZnkKICAgIEByZXR1cm4ge1N0cmluZ30gdGhlIGNsYXNz aWZpZWQgc3RyaW5nCiAgKi8KICBjbGFzc2lmeTogZnVuY3Rpb24oc3RyKSB7 CiAgICB2YXIgcGFydHMgPSBzdHIuc3BsaXQoIi4iKSwKICAgICAgICBvdXQg PSBbXTsKCiAgICBmb3IgKHZhciBpPTAsIGw9cGFydHMubGVuZ3RoOyBpPGw7 IGkrKykgewogICAgICB2YXIgY2FtZWxpemVkID0gRW1iZXIuU3RyaW5nLmNh bWVsaXplKHBhcnRzW2ldKTsKICAgICAgb3V0LnB1c2goY2FtZWxpemVkLmNo YXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgY2FtZWxpemVkLnN1YnN0cigxKSk7 CiAgICB9CgogICAgcmV0dXJuIG91dC5qb2luKCIuIik7CiAgfSwKCiAgLyoq CiAgICBNb3JlIGdlbmVyYWwgdGhhbiBkZWNhbWVsaXplLiBSZXR1cm5zIHRo ZSBsb3dlclxfY2FzZVxfYW5kXF91bmRlcnNjb3JlZAogICAgZm9ybSBvZiBh IHN0cmluZy4KCiAgICBgYGBqYXZhc2NyaXB0CiAgICAnaW5uZXJIVE1MJy51 bmRlcnNjb3JlKCk7ICAgICAgICAgIC8vICdpbm5lcl9odG1sJwogICAgJ2Fj dGlvbl9uYW1lJy51bmRlcnNjb3JlKCk7ICAgICAgICAvLyAnYWN0aW9uX25h bWUnCiAgICAnY3NzLWNsYXNzLW5hbWUnLnVuZGVyc2NvcmUoKTsgICAgIC8v ICdjc3NfY2xhc3NfbmFtZScKICAgICdteSBmYXZvcml0ZSBpdGVtcycudW5k ZXJzY29yZSgpOyAgLy8gJ215X2Zhdm9yaXRlX2l0ZW1zJwogICAgYGBgCgog ICAgQG1ldGhvZCB1bmRlcnNjb3JlCiAgICBAcGFyYW0ge1N0cmluZ30gc3Ry IFRoZSBzdHJpbmcgdG8gdW5kZXJzY29yZS4KICAgIEByZXR1cm4ge1N0cmlu Z30gdGhlIHVuZGVyc2NvcmVkIHN0cmluZy4KICAqLwogIHVuZGVyc2NvcmU6 IGZ1bmN0aW9uKHN0cikgewogICAgcmV0dXJuIHN0ci5yZXBsYWNlKFNUUklO R19VTkRFUlNDT1JFX1JFR0VYUF8xLCAnJDFfJDInKS4KICAgICAgcmVwbGFj ZShTVFJJTkdfVU5ERVJTQ09SRV9SRUdFWFBfMiwgJ18nKS50b0xvd2VyQ2Fz ZSgpOwogIH0sCgogIC8qKgogICAgUmV0dXJucyB0aGUgQ2FwaXRhbGl6ZWQg Zm9ybSBvZiBhIHN0cmluZwoKICAgIGBgYGphdmFzY3JpcHQKICAgICdpbm5l ckhUTUwnLmNhcGl0YWxpemUoKSAgICAgICAgIC8vICdJbm5lckhUTUwnCiAg ICAnYWN0aW9uX25hbWUnLmNhcGl0YWxpemUoKSAgICAgICAvLyAnQWN0aW9u X25hbWUnCiAgICAnY3NzLWNsYXNzLW5hbWUnLmNhcGl0YWxpemUoKSAgICAv LyAnQ3NzLWNsYXNzLW5hbWUnCiAgICAnbXkgZmF2b3JpdGUgaXRlbXMnLmNh cGl0YWxpemUoKSAvLyAnTXkgZmF2b3JpdGUgaXRlbXMnCiAgICBgYGAKCiAg ICBAbWV0aG9kIGNhcGl0YWxpemUKICAgIEBwYXJhbSB7U3RyaW5nfSBzdHIg VGhlIHN0cmluZyB0byBjYXBpdGFsaXplLgogICAgQHJldHVybiB7U3RyaW5n fSBUaGUgY2FwaXRhbGl6ZWQgc3RyaW5nLgogICovCiAgY2FwaXRhbGl6ZTog ZnVuY3Rpb24oc3RyKSB7CiAgICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b1Vw cGVyQ2FzZSgpICsgc3RyLnN1YnN0cigxKTsKICB9Cn07CgppZiAoRW1iZXIu RkVBVFVSRVMuaXNFbmFibGVkKCJzdHJpbmctcGFyYW1ldGVyaXplIikpIHsK ICAvKioKICAgIFRyYW5zZm9ybXMgYSBzdHJpbmcgc28gdGhhdCBpdCBtYXkg YmUgdXNlZCBhcyBwYXJ0IG9mIGEgJ3ByZXR0eScgLyBTRU8gZnJpZW5kbHkg VVJMLgoKICAgIGBgYGphdmFzY3JpcHQKICAgICdNeSBmYXZvcml0ZSBpdGVt cy4nLnBhcmFtZXRlcml6ZSgpOyAgICAgICAgICAgICAgICAgICAgICAgIC8v ICdteS1mYXZvcml0ZS1pdGVtcycKICAgICdhY3Rpb25fbmFtZScucGFyYW1l dGVyaXplKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICdh Y3Rpb24tbmFtZScKICAgICcxMDAgd2F5cyBFbWJlci5qcyBpcyBiZXR0ZXIg dGhhbiBBbmd1bGFyLicucGFyYW1ldGVyaXplKCk7IC8vICcxMDAtd2F5cy1l bWJlcmpzLWlzLWJldHRlci10aGFuLWFuZ3VsYXInCiAgICBgYGAKCiAgICBA bWV0aG9kIHBhcmFtZXRlcml6ZQogICAgQHBhcmFtIHtTdHJpbmd9IHN0ciBU aGUgc3RyaW5nIHRvIHBhcmFtZXRlcml6ZS4KICAgIEByZXR1cm4ge1N0cmlu Z30gdGhlIHBhcmFtZXRlcml6ZWQgc3RyaW5nLgogICovCiAgRW1iZXIuU3Ry aW5nLnBhcmFtZXRlcml6ZSA9IGZ1bmN0aW9uKHN0cikgewogICAgcmV0dXJu IHN0ci5yZXBsYWNlKFNUUklOR19QQVJBTUVURVJJWkVfUkVHRVhQXzEsICct JykgLy8gcmVwbGFjZSB1bmRlcnNjb3Jlcywgc2xhc2hlcyBhbmQgc3BhY2Vz IHdpdGggc2VwYXJhdG9yCiAgICAgICAgICAgICAgLnJlcGxhY2UoU1RSSU5H X1BBUkFNRVRFUklaRV9SRUdFWFBfMiwgJycpICAvLyByZW1vdmUgbm9uLWFs cGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGV4Y2VwdCB0aGUgc2VwYXJhdG9yCiAg ICAgICAgICAgICAgLnJlcGxhY2UoU1RSSU5HX1BBUkFNRVRFUklaRV9SRUdF WFBfMywgJy0nKSAvLyByZXBsYWNlIG11bHRpcGxlIG9jY3VycmluZyBzZXBh cmF0b3JzCiAgICAgICAgICAgICAgLnJlcGxhY2UoU1RSSU5HX1BBUkFNRVRF UklaRV9SRUdFWFBfNCwgJycpICAvLyB0cmltIGxlYWRpbmcgYW5kIHRyYWls aW5nIHNlcGFyYXRvcnMgCiAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKCk7 CiAgfTsKfQoKCn0pKCk7CgoKCihmdW5jdGlvbigpIHsKLyoqCkBtb2R1bGUg ZW1iZXIKQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCiovCgoKCnZhciBmbXQg PSBFbWJlci5TdHJpbmcuZm10LAogICAgdyAgID0gRW1iZXIuU3RyaW5nLncs CiAgICBsb2MgPSBFbWJlci5TdHJpbmcubG9jLAogICAgY2FtZWxpemUgPSBF bWJlci5TdHJpbmcuY2FtZWxpemUsCiAgICBkZWNhbWVsaXplID0gRW1iZXIu U3RyaW5nLmRlY2FtZWxpemUsCiAgICBkYXNoZXJpemUgPSBFbWJlci5TdHJp bmcuZGFzaGVyaXplLAogICAgdW5kZXJzY29yZSA9IEVtYmVyLlN0cmluZy51 bmRlcnNjb3JlLAogICAgY2FwaXRhbGl6ZSA9IEVtYmVyLlN0cmluZy5jYXBp dGFsaXplLAogICAgY2xhc3NpZnkgPSBFbWJlci5TdHJpbmcuY2xhc3NpZnk7 CgppZiAoRW1iZXIuRkVBVFVSRVMuaXNFbmFibGVkKCJzdHJpbmctcGFyYW1l dGVyaXplIikpIHsKICB2YXIgcGFyYW1ldGVyaXplID0gRW1iZXIuU3RyaW5n LnBhcmFtZXRlcml6ZTsKfQoKaWYgKEVtYmVyLkVYVEVORF9QUk9UT1RZUEVT ID09PSB0cnVlIHx8IEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTLlN0cmluZykg ewoKICAvKioKICAgIFNlZSBbRW1iZXIuU3RyaW5nLmZtdF0oL2FwaS9jbGFz c2VzL0VtYmVyLlN0cmluZy5odG1sI21ldGhvZF9mbXQpLgoKICAgIEBtZXRo b2QgZm10CiAgICBAZm9yIFN0cmluZwogICovCiAgU3RyaW5nLnByb3RvdHlw ZS5mbXQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBmbXQodGhpcywgYXJn dW1lbnRzKTsKICB9OwoKICAvKioKICAgIFNlZSBbRW1iZXIuU3RyaW5nLndd KC9hcGkvY2xhc3Nlcy9FbWJlci5TdHJpbmcuaHRtbCNtZXRob2RfdykuCgog ICAgQG1ldGhvZCB3CiAgICBAZm9yIFN0cmluZwogICovCiAgU3RyaW5nLnBy b3RvdHlwZS53ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdyh0aGlzKTsK ICB9OwoKICAvKioKICAgIFNlZSBbRW1iZXIuU3RyaW5nLmxvY10oL2FwaS9j bGFzc2VzL0VtYmVyLlN0cmluZy5odG1sI21ldGhvZF9sb2MpLgoKICAgIEBt ZXRob2QgbG9jCiAgICBAZm9yIFN0cmluZwogICovCiAgU3RyaW5nLnByb3Rv dHlwZS5sb2MgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBsb2ModGhpcywg YXJndW1lbnRzKTsKICB9OwoKICAvKioKICAgIFNlZSBbRW1iZXIuU3RyaW5n LmNhbWVsaXplXSgvYXBpL2NsYXNzZXMvRW1iZXIuU3RyaW5nLmh0bWwjbWV0 aG9kX2NhbWVsaXplKS4KCiAgICBAbWV0aG9kIGNhbWVsaXplCiAgICBAZm9y IFN0cmluZwogICovCiAgU3RyaW5nLnByb3RvdHlwZS5jYW1lbGl6ZSA9IGZ1 bmN0aW9uKCkgewogICAgcmV0dXJuIGNhbWVsaXplKHRoaXMpOwogIH07Cgog IC8qKgogICAgU2VlIFtFbWJlci5TdHJpbmcuZGVjYW1lbGl6ZV0oL2FwaS9j bGFzc2VzL0VtYmVyLlN0cmluZy5odG1sI21ldGhvZF9kZWNhbWVsaXplKS4K CiAgICBAbWV0aG9kIGRlY2FtZWxpemUKICAgIEBmb3IgU3RyaW5nCiAgKi8K ICBTdHJpbmcucHJvdG90eXBlLmRlY2FtZWxpemUgPSBmdW5jdGlvbigpIHsK ICAgIHJldHVybiBkZWNhbWVsaXplKHRoaXMpOwogIH07CgogIC8qKgogICAg U2VlIFtFbWJlci5TdHJpbmcuZGFzaGVyaXplXSgvYXBpL2NsYXNzZXMvRW1i ZXIuU3RyaW5nLmh0bWwjbWV0aG9kX2Rhc2hlcml6ZSkuCgogICAgQG1ldGhv ZCBkYXNoZXJpemUKICAgIEBmb3IgU3RyaW5nCiAgKi8KICBTdHJpbmcucHJv dG90eXBlLmRhc2hlcml6ZSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGRh c2hlcml6ZSh0aGlzKTsKICB9OwoKICAvKioKICAgIFNlZSBbRW1iZXIuU3Ry aW5nLnVuZGVyc2NvcmVdKC9hcGkvY2xhc3Nlcy9FbWJlci5TdHJpbmcuaHRt bCNtZXRob2RfdW5kZXJzY29yZSkuCgogICAgQG1ldGhvZCB1bmRlcnNjb3Jl CiAgICBAZm9yIFN0cmluZwogICovCiAgU3RyaW5nLnByb3RvdHlwZS51bmRl cnNjb3JlID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdW5kZXJzY29yZSh0 aGlzKTsKICB9OwoKICAvKioKICAgIFNlZSBbRW1iZXIuU3RyaW5nLmNsYXNz aWZ5XSgvYXBpL2NsYXNzZXMvRW1iZXIuU3RyaW5nLmh0bWwjbWV0aG9kX2Ns YXNzaWZ5KS4KCiAgICBAbWV0aG9kIGNsYXNzaWZ5CiAgICBAZm9yIFN0cmlu ZwogICovCiAgU3RyaW5nLnByb3RvdHlwZS5jbGFzc2lmeSA9IGZ1bmN0aW9u KCkgewogICAgcmV0dXJuIGNsYXNzaWZ5KHRoaXMpOwogIH07CgogIC8qKgog ICAgU2VlIFtFbWJlci5TdHJpbmcuY2FwaXRhbGl6ZV0oL2FwaS9jbGFzc2Vz L0VtYmVyLlN0cmluZy5odG1sI21ldGhvZF9jYXBpdGFsaXplKS4KCiAgICBA bWV0aG9kIGNhcGl0YWxpemUKICAgIEBmb3IgU3RyaW5nCiAgKi8KICBTdHJp bmcucHJvdG90eXBlLmNhcGl0YWxpemUgPSBmdW5jdGlvbigpIHsKICAgIHJl dHVybiBjYXBpdGFsaXplKHRoaXMpOwogIH07CgogIGlmIChFbWJlci5GRUFU VVJFUy5pc0VuYWJsZWQoInN0cmluZy1wYXJhbWV0ZXJpemUiKSkgewogICAg LyoqCiAgICAgIFNlZSBbRW1iZXIuU3RyaW5nLnBhcmFtZXRlcml6ZV0oL2Fw aS9jbGFzc2VzL0VtYmVyLlN0cmluZy5odG1sI21ldGhvZF9wYXJhbWV0ZXJp emUpLgoKICAgICAgQG1ldGhvZCBwYXJhbWV0ZXJpemUKICAgICAgQGZvciBT dHJpbmcKICAgICovCiAgICBTdHJpbmcucHJvdG90eXBlLnBhcmFtZXRlcml6 ZSA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gcGFyYW1ldGVyaXplKHRo aXMpOwogICAgfTsKICB9Cgp9CgoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewov KioKQG1vZHVsZSBlbWJlcgpAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKKi8K CnZhciBnZXQgPSBFbWJlci5nZXQsCiAgICBzZXQgPSBFbWJlci5zZXQsCiAg ICBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZSwKICAgIGdldFByb3Bl cnRpZXMgPSBFbWJlci5nZXRQcm9wZXJ0aWVzOwoKLyoqCiAgIyMgT3ZlcnZp ZXcKCiAgVGhpcyBtaXhpbiBwcm92aWRlcyBwcm9wZXJ0aWVzIGFuZCBwcm9w ZXJ0eSBvYnNlcnZpbmcgZnVuY3Rpb25hbGl0eSwgY29yZQogIGZlYXR1cmVz IG9mIHRoZSBFbWJlciBvYmplY3QgbW9kZWwuCgogIFByb3BlcnRpZXMgYW5k IG9ic2VydmVycyBhbGxvdyBvbmUgb2JqZWN0IHRvIG9ic2VydmUgY2hhbmdl cyB0byBhCiAgcHJvcGVydHkgb24gYW5vdGhlciBvYmplY3QuIFRoaXMgaXMg b25lIG9mIHRoZSBmdW5kYW1lbnRhbCB3YXlzIHRoYXQKICBtb2RlbHMsIGNv bnRyb2xsZXJzIGFuZCB2aWV3cyBjb21tdW5pY2F0ZSB3aXRoIGVhY2ggb3Ro ZXIgaW4gYW4gRW1iZXIKICBhcHBsaWNhdGlvbi4KCiAgQW55IG9iamVjdCB0 aGF0IGhhcyB0aGlzIG1peGluIGFwcGxpZWQgY2FuIGJlIHVzZWQgaW4gb2Jz ZXJ2ZXIKICBvcGVyYXRpb25zLiBUaGF0IGluY2x1ZGVzIGBFbWJlci5PYmpl Y3RgIGFuZCBtb3N0IG9iamVjdHMgeW91IHdpbGwKICBpbnRlcmFjdCB3aXRo IGFzIHlvdSB3cml0ZSB5b3VyIEVtYmVyIGFwcGxpY2F0aW9uLgoKICBOb3Rl IHRoYXQgeW91IHdpbGwgbm90IGdlbmVyYWxseSBhcHBseSB0aGlzIG1peGlu IHRvIGNsYXNzZXMgeW91cnNlbGYsCiAgYnV0IHlvdSB3aWxsIHVzZSB0aGUg ZmVhdHVyZXMgcHJvdmlkZWQgYnkgdGhpcyBtb2R1bGUgZnJlcXVlbnRseSwg c28gaXQKICBpcyBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCBob3cgdG8gdXNl IGl0LgoKICAjIyBVc2luZyBgZ2V0KClgIGFuZCBgc2V0KClgCgogIEJlY2F1 c2Ugb2YgRW1iZXIncyBzdXBwb3J0IGZvciBiaW5kaW5ncyBhbmQgb2JzZXJ2 ZXJzLCB5b3Ugd2lsbCBhbHdheXMKICBhY2Nlc3MgcHJvcGVydGllcyB1c2lu ZyB0aGUgZ2V0IG1ldGhvZCwgYW5kIHNldCBwcm9wZXJ0aWVzIHVzaW5nIHRo ZQogIHNldCBtZXRob2QuIFRoaXMgYWxsb3dzIHRoZSBvYnNlcnZpbmcgb2Jq ZWN0cyB0byBiZSBub3RpZmllZCBhbmQKICBjb21wdXRlZCBwcm9wZXJ0aWVz IHRvIGJlIGhhbmRsZWQgcHJvcGVybHkuCgogIE1vcmUgZG9jdW1lbnRhdGlv biBhYm91dCBgZ2V0YCBhbmQgYHNldGAgYXJlIGJlbG93LgoKICAjIyBPYnNl cnZpbmcgUHJvcGVydHkgQ2hhbmdlcwoKICBZb3UgdHlwaWNhbGx5IG9ic2Vy dmUgcHJvcGVydHkgY2hhbmdlcyBzaW1wbHkgYnkgYWRkaW5nIHRoZSBgb2Jz ZXJ2ZXNgCiAgY2FsbCB0byB0aGUgZW5kIG9mIHlvdXIgbWV0aG9kIGRlY2xh cmF0aW9ucyBpbiBjbGFzc2VzIHRoYXQgeW91IHdyaXRlLgogIEZvciBleGFt cGxlOgoKICBgYGBqYXZhc2NyaXB0CiAgRW1iZXIuT2JqZWN0LmV4dGVuZCh7 CiAgICB2YWx1ZU9ic2VydmVyOiBmdW5jdGlvbigpIHsKICAgICAgLy8gRXhl Y3V0ZXMgd2hlbmV2ZXIgdGhlICJ2YWx1ZSIgcHJvcGVydHkgY2hhbmdlcwog ICAgfS5vYnNlcnZlcygndmFsdWUnKQogIH0pOwogIGBgYAoKICBBbHRob3Vn aCB0aGlzIGlzIHRoZSBtb3N0IGNvbW1vbiB3YXkgdG8gYWRkIGFuIG9ic2Vy dmVyLCB0aGlzIGNhcGFiaWxpdHkKICBpcyBhY3R1YWxseSBidWlsdCBpbnRv IHRoZSBgRW1iZXIuT2JqZWN0YCBjbGFzcyBvbiB0b3Agb2YgdHdvIG1ldGhv ZHMKICBkZWZpbmVkIGluIHRoaXMgbWl4aW46IGBhZGRPYnNlcnZlcmAgYW5k IGByZW1vdmVPYnNlcnZlcmAuIFlvdSBjYW4gdXNlCiAgdGhlc2UgdHdvIG1l dGhvZHMgdG8gYWRkIGFuZCByZW1vdmUgb2JzZXJ2ZXJzIHlvdXJzZWxmIGlm IHlvdSBuZWVkIHRvCiAgZG8gc28gYXQgcnVudGltZS4KCiAgVG8gYWRkIGFu IG9ic2VydmVyIGZvciBhIHByb3BlcnR5LCBjYWxsOgoKICBgYGBqYXZhc2Ny aXB0CiAgb2JqZWN0LmFkZE9ic2VydmVyKCdwcm9wZXJ0eUtleScsIHRhcmdl dE9iamVjdCwgdGFyZ2V0QWN0aW9uKQogIGBgYAoKICBUaGlzIHdpbGwgY2Fs bCB0aGUgYHRhcmdldEFjdGlvbmAgbWV0aG9kIG9uIHRoZSBgdGFyZ2V0T2Jq ZWN0YCB3aGVuZXZlcgogIHRoZSB2YWx1ZSBvZiB0aGUgYHByb3BlcnR5S2V5 YCBjaGFuZ2VzLgoKICBOb3RlIHRoYXQgaWYgYHByb3BlcnR5S2V5YCBpcyBh IGNvbXB1dGVkIHByb3BlcnR5LCB0aGUgb2JzZXJ2ZXIgd2lsbCBiZQogIGNh bGxlZCB3aGVuIGFueSBvZiB0aGUgcHJvcGVydHkgZGVwZW5kZW5jaWVzIGFy ZSBjaGFuZ2VkLCBldmVuIGlmIHRoZQogIHJlc3VsdGluZyB2YWx1ZSBvZiB0 aGUgY29tcHV0ZWQgcHJvcGVydHkgaXMgdW5jaGFuZ2VkLiBUaGlzIGlzIG5l Y2Vzc2FyeQogIGJlY2F1c2UgY29tcHV0ZWQgcHJvcGVydGllcyBhcmUgbm90 IGNvbXB1dGVkIHVudGlsIGBnZXRgIGlzIGNhbGxlZC4KCiAgQGNsYXNzIE9i c2VydmFibGUKICBAbmFtZXNwYWNlIEVtYmVyCiovCkVtYmVyLk9ic2VydmFi bGUgPSBFbWJlci5NaXhpbi5jcmVhdGUoewoKICAvKioKICAgIFJldHJpZXZl cyB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSBmcm9tIHRoZSBvYmplY3QuCgog ICAgVGhpcyBtZXRob2QgaXMgdXN1YWxseSBzaW1pbGFyIHRvIHVzaW5nIGBv YmplY3Rba2V5TmFtZV1gIG9yIGBvYmplY3Qua2V5TmFtZWAsCiAgICBob3dl dmVyIGl0IHN1cHBvcnRzIGJvdGggY29tcHV0ZWQgcHJvcGVydGllcyBhbmQg dGhlIHVua25vd25Qcm9wZXJ0eQogICAgaGFuZGxlci4KCiAgICBCZWNhdXNl IGBnZXRgIHVuaWZpZXMgdGhlIHN5bnRheCBmb3IgYWNjZXNzaW5nIGFsbCB0 aGVzZSBraW5kcwogICAgb2YgcHJvcGVydGllcywgaXQgY2FuIG1ha2UgbWFu eSByZWZhY3RvcmluZ3MgZWFzaWVyLCBzdWNoIGFzIHJlcGxhY2luZyBhCiAg ICBzaW1wbGUgcHJvcGVydHkgd2l0aCBhIGNvbXB1dGVkIHByb3BlcnR5LCBv ciB2aWNlIHZlcnNhLgoKICAgICMjIyBDb21wdXRlZCBQcm9wZXJ0aWVzCgog ICAgQ29tcHV0ZWQgcHJvcGVydGllcyBhcmUgbWV0aG9kcyBkZWZpbmVkIHdp dGggdGhlIGBwcm9wZXJ0eWAgbW9kaWZpZXIKICAgIGRlY2xhcmVkIGF0IHRo ZSBlbmQsIHN1Y2ggYXM6CgogICAgYGBgamF2YXNjcmlwdAogICAgZnVsbE5h bWU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5nZXQoJ2ZpcnN0 TmFtZScpICsgJyAnICsgdGhpcy5nZXQoJ2xhc3ROYW1lJyk7CiAgICB9LnBy b3BlcnR5KCdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnKQogICAgYGBgCgogICAg V2hlbiB5b3UgY2FsbCBgZ2V0YCBvbiBhIGNvbXB1dGVkIHByb3BlcnR5LCB0 aGUgZnVuY3Rpb24gd2lsbCBiZQogICAgY2FsbGVkIGFuZCB0aGUgcmV0dXJu IHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZCBvZiB0aGUgZnVuY3Rp b24KICAgIGl0c2VsZi4KCiAgICAjIyMgVW5rbm93biBQcm9wZXJ0aWVzCgog ICAgTGlrZXdpc2UsIGlmIHlvdSB0cnkgdG8gY2FsbCBgZ2V0YCBvbiBhIHBy b3BlcnR5IHdob3NlIHZhbHVlIGlzCiAgICBgdW5kZWZpbmVkYCwgdGhlIGB1 bmtub3duUHJvcGVydHkoKWAgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIG9uIHRo ZSBvYmplY3QuCiAgICBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIGFueSB2YWx1 ZSBvdGhlciB0aGFuIGB1bmRlZmluZWRgLCBpdCB3aWxsIGJlIHJldHVybmVk CiAgICBpbnN0ZWFkLiBUaGlzIGFsbG93cyB5b3UgdG8gaW1wbGVtZW50ICJ2 aXJ0dWFsIiBwcm9wZXJ0aWVzIHRoYXQgYXJlCiAgICBub3QgZGVmaW5lZCB1 cGZyb250LgoKICAgIEBtZXRob2QgZ2V0CiAgICBAcGFyYW0ge1N0cmluZ30g a2V5TmFtZSBUaGUgcHJvcGVydHkgdG8gcmV0cmlldmUKICAgIEByZXR1cm4g e09iamVjdH0gVGhlIHByb3BlcnR5IHZhbHVlIG9yIHVuZGVmaW5lZC4KICAq LwogIGdldDogZnVuY3Rpb24oa2V5TmFtZSkgewogICAgcmV0dXJuIGdldCh0 aGlzLCBrZXlOYW1lKTsKICB9LAoKICAvKioKICAgIFRvIGdldCBtdWx0aXBs ZSBwcm9wZXJ0aWVzIGF0IG9uY2UsIGNhbGwgYGdldFByb3BlcnRpZXNgCiAg ICB3aXRoIGEgbGlzdCBvZiBzdHJpbmdzIG9yIGFuIGFycmF5OgoKICAgIGBg YGphdmFzY3JpcHQKICAgIHJlY29yZC5nZXRQcm9wZXJ0aWVzKCdmaXJzdE5h bWUnLCAnbGFzdE5hbWUnLCAnemlwQ29kZScpOyAgLy8geyBmaXJzdE5hbWU6 ICdKb2huJywgbGFzdE5hbWU6ICdEb2UnLCB6aXBDb2RlOiAnMTAwMTEnIH0K ICAgIGBgYAoKICAgIGlzIGVxdWl2YWxlbnQgdG86CgogICAgYGBgamF2YXNj cmlwdAogICAgcmVjb3JkLmdldFByb3BlcnRpZXMoWydmaXJzdE5hbWUnLCAn bGFzdE5hbWUnLCAnemlwQ29kZSddKTsgIC8vIHsgZmlyc3ROYW1lOiAnSm9o bicsIGxhc3ROYW1lOiAnRG9lJywgemlwQ29kZTogJzEwMDExJyB9CiAgICBg YGAKCiAgICBAbWV0aG9kIGdldFByb3BlcnRpZXMKICAgIEBwYXJhbSB7U3Ry aW5nLi4ufEFycmF5fSBsaXN0IG9mIGtleXMgdG8gZ2V0CiAgICBAcmV0dXJu IHtIYXNofQogICovCiAgZ2V0UHJvcGVydGllczogZnVuY3Rpb24oKSB7CiAg ICByZXR1cm4gZ2V0UHJvcGVydGllcy5hcHBseShudWxsLCBbdGhpc10uY29u Y2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkpOwogIH0sCgogIC8qKgogICAg U2V0cyB0aGUgcHJvdmlkZWQga2V5IG9yIHBhdGggdG8gdGhlIHZhbHVlLgoK ICAgIFRoaXMgbWV0aG9kIGlzIGdlbmVyYWxseSB2ZXJ5IHNpbWlsYXIgdG8g Y2FsbGluZyBgb2JqZWN0W2tleV0gPSB2YWx1ZWAgb3IKICAgIGBvYmplY3Qu a2V5ID0gdmFsdWVgLCBleGNlcHQgdGhhdCBpdCBwcm92aWRlcyBzdXBwb3J0 IGZvciBjb21wdXRlZAogICAgcHJvcGVydGllcywgdGhlIGBzZXRVbmtub3du UHJvcGVydHkoKWAgbWV0aG9kIGFuZCBwcm9wZXJ0eSBvYnNlcnZlcnMuCgog ICAgIyMjIENvbXB1dGVkIFByb3BlcnRpZXMKCiAgICBJZiB5b3UgdHJ5IHRv IHNldCBhIHZhbHVlIG9uIGEga2V5IHRoYXQgaGFzIGEgY29tcHV0ZWQgcHJv cGVydHkgaGFuZGxlcgogICAgZGVmaW5lZCAoc2VlIHRoZSBgZ2V0KClgIG1l dGhvZCBmb3IgYW4gZXhhbXBsZSksIHRoZW4gYHNldCgpYCB3aWxsIGNhbGwK ICAgIHRoYXQgbWV0aG9kLCBwYXNzaW5nIGJvdGggdGhlIHZhbHVlIGFuZCBr ZXkgaW5zdGVhZCBvZiBzaW1wbHkgY2hhbmdpbmcKICAgIHRoZSB2YWx1ZSBp dHNlbGYuIFRoaXMgaXMgdXNlZnVsIGZvciB0aG9zZSB0aW1lcyB3aGVuIHlv dSBuZWVkIHRvCiAgICBpbXBsZW1lbnQgYSBwcm9wZXJ0eSB0aGF0IGlzIGNv bXBvc2VkIG9mIG9uZSBvciBtb3JlIG1lbWJlcgogICAgcHJvcGVydGllcy4K CiAgICAjIyMgVW5rbm93biBQcm9wZXJ0aWVzCgogICAgSWYgeW91IHRyeSB0 byBzZXQgYSB2YWx1ZSBvbiBhIGtleSB0aGF0IGlzIHVuZGVmaW5lZCBpbiB0 aGUgdGFyZ2V0CiAgICBvYmplY3QsIHRoZW4gdGhlIGBzZXRVbmtub3duUHJv cGVydHkoKWAgaGFuZGxlciB3aWxsIGJlIGNhbGxlZCBpbnN0ZWFkLiBUaGlz CiAgICBnaXZlcyB5b3UgYW4gb3Bwb3J0dW5pdHkgdG8gaW1wbGVtZW50IGNv bXBsZXggInZpcnR1YWwiIHByb3BlcnRpZXMgdGhhdAogICAgYXJlIG5vdCBw cmVkZWZpbmVkIG9uIHRoZSBvYmplY3QuIElmIGBzZXRVbmtub3duUHJvcGVy dHkoKWAgcmV0dXJucwogICAgdW5kZWZpbmVkLCB0aGVuIGBzZXQoKWAgd2ls bCBzaW1wbHkgc2V0IHRoZSB2YWx1ZSBvbiB0aGUgb2JqZWN0LgoKICAgICMj IyBQcm9wZXJ0eSBPYnNlcnZlcnMKCiAgICBJbiBhZGRpdGlvbiB0byBjaGFu Z2luZyB0aGUgcHJvcGVydHksIGBzZXQoKWAgd2lsbCBhbHNvIHJlZ2lzdGVy IGEgcHJvcGVydHkKICAgIGNoYW5nZSB3aXRoIHRoZSBvYmplY3QuIFVubGVz cyB5b3UgaGF2ZSBwbGFjZWQgdGhpcyBjYWxsIGluc2lkZSBvZiBhCiAgICBg YmVnaW5Qcm9wZXJ0eUNoYW5nZXMoKWAgYW5kIGBlbmRQcm9wZXJ0eUNoYW5n ZXMoKSxgIGFueSAibG9jYWwiIG9ic2VydmVycwogICAgKGkuZS4gb2JzZXJ2 ZXIgbWV0aG9kcyBkZWNsYXJlZCBvbiB0aGUgc2FtZSBvYmplY3QpLCB3aWxs IGJlIGNhbGxlZAogICAgaW1tZWRpYXRlbHkuIEFueSAicmVtb3RlIiBvYnNl cnZlcnMgKGkuZS4gb2JzZXJ2ZXIgbWV0aG9kcyBkZWNsYXJlZCBvbgogICAg YW5vdGhlciBvYmplY3QpIHdpbGwgYmUgcGxhY2VkIGluIGEgcXVldWUgYW5k IGNhbGxlZCBhdCBhIGxhdGVyIHRpbWUgaW4gYQogICAgY29hbGVzY2VkIG1h bm5lci4KCiAgICAjIyMgQ2hhaW5pbmcKCiAgICBJbiBhZGRpdGlvbiB0byBw cm9wZXJ0eSBjaGFuZ2VzLCBgc2V0KClgIHJldHVybnMgdGhlIHZhbHVlIG9m IHRoZSBvYmplY3QKICAgIGl0c2VsZiBzbyB5b3UgY2FuIGRvIGNoYWluaW5n IGxpa2UgdGhpczoKCiAgICBgYGBqYXZhc2NyaXB0CiAgICByZWNvcmQuc2V0 KCdmaXJzdE5hbWUnLCAnQ2hhcmxlcycpLnNldCgnbGFzdE5hbWUnLCAnSm9s bGV5Jyk7CiAgICBgYGAKCiAgICBAbWV0aG9kIHNldAogICAgQHBhcmFtIHtT dHJpbmd9IGtleU5hbWUgVGhlIHByb3BlcnR5IHRvIHNldAogICAgQHBhcmFt IHtPYmplY3R9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQgb3IgYG51bGxgLgog ICAgQHJldHVybiB7RW1iZXIuT2JzZXJ2YWJsZX0KICAqLwogIHNldDogZnVu Y3Rpb24oa2V5TmFtZSwgdmFsdWUpIHsKICAgIHNldCh0aGlzLCBrZXlOYW1l LCB2YWx1ZSk7CiAgICByZXR1cm4gdGhpczsKICB9LAoKCiAgLyoqCiAgICBT ZXRzIGEgbGlzdCBvZiBwcm9wZXJ0aWVzIGF0IG9uY2UuIFRoZXNlIHByb3Bl cnRpZXMgYXJlIHNldCBpbnNpZGUKICAgIGEgc2luZ2xlIGBiZWdpblByb3Bl cnR5Q2hhbmdlc2AgYW5kIGBlbmRQcm9wZXJ0eUNoYW5nZXNgIGJhdGNoLCBz bwogICAgb2JzZXJ2ZXJzIHdpbGwgYmUgYnVmZmVyZWQuCgogICAgYGBgamF2 YXNjcmlwdAogICAgcmVjb3JkLnNldFByb3BlcnRpZXMoeyBmaXJzdE5hbWU6 ICdDaGFybGVzJywgbGFzdE5hbWU6ICdKb2xsZXknIH0pOwogICAgYGBgCgog ICAgQG1ldGhvZCBzZXRQcm9wZXJ0aWVzCiAgICBAcGFyYW0ge0hhc2h9IGhh c2ggdGhlIGhhc2ggb2Yga2V5cyBhbmQgdmFsdWVzIHRvIHNldAogICAgQHJl dHVybiB7RW1iZXIuT2JzZXJ2YWJsZX0KICAqLwogIHNldFByb3BlcnRpZXM6 IGZ1bmN0aW9uKGhhc2gpIHsKICAgIHJldHVybiBFbWJlci5zZXRQcm9wZXJ0 aWVzKHRoaXMsIGhhc2gpOwogIH0sCgogIC8qKgogICAgQmVnaW5zIGEgZ3Jv dXBpbmcgb2YgcHJvcGVydHkgY2hhbmdlcy4KCiAgICBZb3UgY2FuIHVzZSB0 aGlzIG1ldGhvZCB0byBncm91cCBwcm9wZXJ0eSBjaGFuZ2VzIHNvIHRoYXQg bm90aWZpY2F0aW9ucwogICAgd2lsbCBub3QgYmUgc2VudCB1bnRpbCB0aGUg Y2hhbmdlcyBhcmUgZmluaXNoZWQuIElmIHlvdSBwbGFuIHRvIG1ha2UgYQog ICAgbGFyZ2UgbnVtYmVyIG9mIGNoYW5nZXMgdG8gYW4gb2JqZWN0IGF0IG9u ZSB0aW1lLCB5b3Ugc2hvdWxkIGNhbGwgdGhpcwogICAgbWV0aG9kIGF0IHRo ZSBiZWdpbm5pbmcgb2YgdGhlIGNoYW5nZXMgdG8gYmVnaW4gZGVmZXJyaW5n IGNoYW5nZQogICAgbm90aWZpY2F0aW9ucy4gV2hlbiB5b3UgYXJlIGRvbmUg bWFraW5nIGNoYW5nZXMsIGNhbGwKICAgIGBlbmRQcm9wZXJ0eUNoYW5nZXMo KWAgdG8gZGVsaXZlciB0aGUgZGVmZXJyZWQgY2hhbmdlIG5vdGlmaWNhdGlv bnMgYW5kIGVuZAogICAgZGVmZXJyaW5nLgoKICAgIEBtZXRob2QgYmVnaW5Q cm9wZXJ0eUNoYW5nZXMKICAgIEByZXR1cm4ge0VtYmVyLk9ic2VydmFibGV9 CiAgKi8KICBiZWdpblByb3BlcnR5Q2hhbmdlczogZnVuY3Rpb24oKSB7CiAg ICBFbWJlci5iZWdpblByb3BlcnR5Q2hhbmdlcygpOwogICAgcmV0dXJuIHRo aXM7CiAgfSwKCiAgLyoqCiAgICBFbmRzIGEgZ3JvdXBpbmcgb2YgcHJvcGVy dHkgY2hhbmdlcy4KCiAgICBZb3UgY2FuIHVzZSB0aGlzIG1ldGhvZCB0byBn cm91cCBwcm9wZXJ0eSBjaGFuZ2VzIHNvIHRoYXQgbm90aWZpY2F0aW9ucwog ICAgd2lsbCBub3QgYmUgc2VudCB1bnRpbCB0aGUgY2hhbmdlcyBhcmUgZmlu aXNoZWQuIElmIHlvdSBwbGFuIHRvIG1ha2UgYQogICAgbGFyZ2UgbnVtYmVy IG9mIGNoYW5nZXMgdG8gYW4gb2JqZWN0IGF0IG9uZSB0aW1lLCB5b3Ugc2hv dWxkIGNhbGwKICAgIGBiZWdpblByb3BlcnR5Q2hhbmdlcygpYCBhdCB0aGUg YmVnaW5uaW5nIG9mIHRoZSBjaGFuZ2VzIHRvIGRlZmVyIGNoYW5nZQogICAg bm90aWZpY2F0aW9ucy4gV2hlbiB5b3UgYXJlIGRvbmUgbWFraW5nIGNoYW5n ZXMsIGNhbGwgdGhpcyBtZXRob2QgdG8KICAgIGRlbGl2ZXIgdGhlIGRlZmVy cmVkIGNoYW5nZSBub3RpZmljYXRpb25zIGFuZCBlbmQgZGVmZXJyaW5nLgoK ICAgIEBtZXRob2QgZW5kUHJvcGVydHlDaGFuZ2VzCiAgICBAcmV0dXJuIHtF bWJlci5PYnNlcnZhYmxlfQogICovCiAgZW5kUHJvcGVydHlDaGFuZ2VzOiBm dW5jdGlvbigpIHsKICAgIEVtYmVyLmVuZFByb3BlcnR5Q2hhbmdlcygpOwog ICAgcmV0dXJuIHRoaXM7CiAgfSwKCiAgLyoqCiAgICBOb3RpZnkgdGhlIG9i c2VydmVyIHN5c3RlbSB0aGF0IGEgcHJvcGVydHkgaXMgYWJvdXQgdG8gY2hh bmdlLgoKICAgIFNvbWV0aW1lcyB5b3UgbmVlZCB0byBjaGFuZ2UgYSB2YWx1 ZSBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHdpdGhvdXQKICAgIGFjdHVhbGx5 IGNhbGxpbmcgYGdldCgpYCBvciBgc2V0KClgIG9uIGl0LiBJbiB0aGlzIGNh c2UsIHlvdSBjYW4gdXNlIHRoaXMKICAgIG1ldGhvZCBhbmQgYHByb3BlcnR5 RGlkQ2hhbmdlKClgIGluc3RlYWQuIENhbGxpbmcgdGhlc2UgdHdvIG1ldGhv ZHMKICAgIHRvZ2V0aGVyIHdpbGwgbm90aWZ5IGFsbCBvYnNlcnZlcnMgdGhh dCB0aGUgcHJvcGVydHkgaGFzIHBvdGVudGlhbGx5CiAgICBjaGFuZ2VkIHZh bHVlLgoKICAgIE5vdGUgdGhhdCB5b3UgbXVzdCBhbHdheXMgY2FsbCBgcHJv cGVydHlXaWxsQ2hhbmdlYCBhbmQgYHByb3BlcnR5RGlkQ2hhbmdlYAogICAg YXMgYSBwYWlyLiBJZiB5b3UgZG8gbm90LCBpdCBtYXkgZ2V0IHRoZSBwcm9w ZXJ0eSBjaGFuZ2UgZ3JvdXBzIG91dCBvZgogICAgb3JkZXIgYW5kIGNhdXNl IG5vdGlmaWNhdGlvbnMgdG8gYmUgZGVsaXZlcmVkIG1vcmUgb2Z0ZW4gdGhh biB5b3Ugd291bGQKICAgIGxpa2UuCgogICAgQG1ldGhvZCBwcm9wZXJ0eVdp bGxDaGFuZ2UKICAgIEBwYXJhbSB7U3RyaW5nfSBrZXlOYW1lIFRoZSBwcm9w ZXJ0eSBrZXkgdGhhdCBpcyBhYm91dCB0byBjaGFuZ2UuCiAgICBAcmV0dXJu IHtFbWJlci5PYnNlcnZhYmxlfQogICovCiAgcHJvcGVydHlXaWxsQ2hhbmdl OiBmdW5jdGlvbihrZXlOYW1lKSB7CiAgICBFbWJlci5wcm9wZXJ0eVdpbGxD aGFuZ2UodGhpcywga2V5TmFtZSk7CiAgICByZXR1cm4gdGhpczsKICB9LAoK ICAvKioKICAgIE5vdGlmeSB0aGUgb2JzZXJ2ZXIgc3lzdGVtIHRoYXQgYSBw cm9wZXJ0eSBoYXMganVzdCBjaGFuZ2VkLgoKICAgIFNvbWV0aW1lcyB5b3Ug bmVlZCB0byBjaGFuZ2UgYSB2YWx1ZSBkaXJlY3RseSBvciBpbmRpcmVjdGx5 IHdpdGhvdXQKICAgIGFjdHVhbGx5IGNhbGxpbmcgYGdldCgpYCBvciBgc2V0 KClgIG9uIGl0LiBJbiB0aGlzIGNhc2UsIHlvdSBjYW4gdXNlIHRoaXMKICAg IG1ldGhvZCBhbmQgYHByb3BlcnR5V2lsbENoYW5nZSgpYCBpbnN0ZWFkLiBD YWxsaW5nIHRoZXNlIHR3byBtZXRob2RzCiAgICB0b2dldGhlciB3aWxsIG5v dGlmeSBhbGwgb2JzZXJ2ZXJzIHRoYXQgdGhlIHByb3BlcnR5IGhhcyBwb3Rl bnRpYWxseQogICAgY2hhbmdlZCB2YWx1ZS4KCiAgICBOb3RlIHRoYXQgeW91 IG11c3QgYWx3YXlzIGNhbGwgYHByb3BlcnR5V2lsbENoYW5nZWAgYW5kIGBw cm9wZXJ0eURpZENoYW5nZWAKICAgIGFzIGEgcGFpci4gSWYgeW91IGRvIG5v dCwgaXQgbWF5IGdldCB0aGUgcHJvcGVydHkgY2hhbmdlIGdyb3VwcyBvdXQg b2YKICAgIG9yZGVyIGFuZCBjYXVzZSBub3RpZmljYXRpb25zIHRvIGJlIGRl bGl2ZXJlZCBtb3JlIG9mdGVuIHRoYW4geW91IHdvdWxkCiAgICBsaWtlLgoK ICAgIEBtZXRob2QgcHJvcGVydHlEaWRDaGFuZ2UKICAgIEBwYXJhbSB7U3Ry aW5nfSBrZXlOYW1lIFRoZSBwcm9wZXJ0eSBrZXkgdGhhdCBoYXMganVzdCBj aGFuZ2VkLgogICAgQHJldHVybiB7RW1iZXIuT2JzZXJ2YWJsZX0KICAqLwog IHByb3BlcnR5RGlkQ2hhbmdlOiBmdW5jdGlvbihrZXlOYW1lKSB7CiAgICBF bWJlci5wcm9wZXJ0eURpZENoYW5nZSh0aGlzLCBrZXlOYW1lKTsKICAgIHJl dHVybiB0aGlzOwogIH0sCgogIC8qKgogICAgQ29udmVuaWVuY2UgbWV0aG9k IHRvIGNhbGwgYHByb3BlcnR5V2lsbENoYW5nZWAgYW5kIGBwcm9wZXJ0eURp ZENoYW5nZWAgaW4KICAgIHN1Y2Nlc3Npb24uCgogICAgQG1ldGhvZCBub3Rp ZnlQcm9wZXJ0eUNoYW5nZQogICAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUg VGhlIHByb3BlcnR5IGtleSB0byBiZSBub3RpZmllZCBhYm91dC4KICAgIEBy ZXR1cm4ge0VtYmVyLk9ic2VydmFibGV9CiAgKi8KICBub3RpZnlQcm9wZXJ0 eUNoYW5nZTogZnVuY3Rpb24oa2V5TmFtZSkgewogICAgdGhpcy5wcm9wZXJ0 eVdpbGxDaGFuZ2Uoa2V5TmFtZSk7CiAgICB0aGlzLnByb3BlcnR5RGlkQ2hh bmdlKGtleU5hbWUpOwogICAgcmV0dXJuIHRoaXM7CiAgfSwKCiAgYWRkQmVm b3JlT2JzZXJ2ZXI6IGZ1bmN0aW9uKGtleSwgdGFyZ2V0LCBtZXRob2QpIHsK ICAgIEVtYmVyLmFkZEJlZm9yZU9ic2VydmVyKHRoaXMsIGtleSwgdGFyZ2V0 LCBtZXRob2QpOwogIH0sCgogIC8qKgogICAgQWRkcyBhbiBvYnNlcnZlciBv biBhIHByb3BlcnR5LgoKICAgIFRoaXMgaXMgdGhlIGNvcmUgbWV0aG9kIHVz ZWQgdG8gcmVnaXN0ZXIgYW4gb2JzZXJ2ZXIgZm9yIGEgcHJvcGVydHkuCgog ICAgT25jZSB5b3UgY2FsbCB0aGlzIG1ldGhvZCwgYW55IHRpbWUgdGhlIGtl eSdzIHZhbHVlIGlzIHNldCwgeW91ciBvYnNlcnZlcgogICAgd2lsbCBiZSBu b3RpZmllZC4gTm90ZSB0aGF0IHRoZSBvYnNlcnZlcnMgYXJlIHRyaWdnZXJl ZCBhbnkgdGltZSB0aGUKICAgIHZhbHVlIGlzIHNldCwgcmVnYXJkbGVzcyBv ZiB3aGV0aGVyIGl0IGhhcyBhY3R1YWxseSBjaGFuZ2VkLiBZb3VyCiAgICBv YnNlcnZlciBzaG91bGQgYmUgcHJlcGFyZWQgdG8gaGFuZGxlIHRoYXQuCgog ICAgWW91IGNhbiBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgY29udGV4dCBwYXJh bWV0ZXIgdG8gdGhpcyBtZXRob2QuIFRoZQogICAgY29udGV4dCB3aWxsIGJl IHBhc3NlZCB0byB5b3VyIG9ic2VydmVyIG1ldGhvZCB3aGVuZXZlciBpdCBp cyB0cmlnZ2VyZWQuCiAgICBOb3RlIHRoYXQgaWYgeW91IGFkZCB0aGUgc2Ft ZSB0YXJnZXQvbWV0aG9kIHBhaXIgb24gYSBrZXkgbXVsdGlwbGUgdGltZXMK ICAgIHdpdGggZGlmZmVyZW50IGNvbnRleHQgcGFyYW1ldGVycywgeW91ciBv YnNlcnZlciB3aWxsIG9ubHkgYmUgY2FsbGVkIG9uY2UKICAgIHdpdGggdGhl IGxhc3QgY29udGV4dCB5b3UgcGFzc2VkLgoKICAgICMjIyBPYnNlcnZlciBN ZXRob2RzCgogICAgT2JzZXJ2ZXIgbWV0aG9kcyB5b3UgcGFzcyBzaG91bGQg Z2VuZXJhbGx5IGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmUgaWYKICAg IHlvdSBkbyBub3QgcGFzcyBhIGBjb250ZXh0YCBwYXJhbWV0ZXI6CgogICAg YGBgamF2YXNjcmlwdAogICAgZm9vRGlkQ2hhbmdlOiBmdW5jdGlvbihzZW5k ZXIsIGtleSwgdmFsdWUsIHJldikgeyB9OwogICAgYGBgCgogICAgVGhlIHNl bmRlciBpcyB0aGUgb2JqZWN0IHRoYXQgY2hhbmdlZC4gVGhlIGtleSBpcyB0 aGUgcHJvcGVydHkgdGhhdAogICAgY2hhbmdlcy4gVGhlIHZhbHVlIHByb3Bl cnR5IGlzIGN1cnJlbnRseSByZXNlcnZlZCBhbmQgdW51c2VkLiBUaGUgcmV2 CiAgICBpcyB0aGUgbGFzdCBwcm9wZXJ0eSByZXZpc2lvbiBvZiB0aGUgb2Jq ZWN0IHdoZW4gaXQgY2hhbmdlZCwgd2hpY2ggeW91IGNhbgogICAgdXNlIHRv IGRldGVjdCBpZiB0aGUga2V5IHZhbHVlIGhhcyByZWFsbHkgY2hhbmdlZCBv ciBub3QuCgogICAgSWYgeW91IHBhc3MgYSBgY29udGV4dGAgcGFyYW1ldGVy LCB0aGUgY29udGV4dCB3aWxsIGJlIHBhc3NlZCBiZWZvcmUgdGhlCiAgICBy ZXZpc2lvbiBsaWtlIHNvOgoKICAgIGBgYGphdmFzY3JpcHQKICAgIGZvb0Rp ZENoYW5nZTogZnVuY3Rpb24oc2VuZGVyLCBrZXksIHZhbHVlLCBjb250ZXh0 LCByZXYpIHsgfTsKICAgIGBgYAoKICAgIFVzdWFsbHkgeW91IHdpbGwgbm90 IG5lZWQgdGhlIHZhbHVlLCBjb250ZXh0IG9yIHJldmlzaW9uIHBhcmFtZXRl cnMgYXQKICAgIHRoZSBlbmQuIEluIHRoaXMgY2FzZSwgaXQgaXMgY29tbW9u IHRvIHdyaXRlIG9ic2VydmVyIG1ldGhvZHMgdGhhdCB0YWtlCiAgICBvbmx5 IGEgc2VuZGVyIGFuZCBrZXkgdmFsdWUgYXMgcGFyYW1ldGVycyBvciwgaWYg eW91IGFyZW4ndCBpbnRlcmVzdGVkIGluCiAgICBhbnkgb2YgdGhlc2UgdmFs dWVzLCB0byB3cml0ZSBhbiBvYnNlcnZlciB0aGF0IGhhcyBubyBwYXJhbWV0 ZXJzIGF0IGFsbC4KCiAgICBAbWV0aG9kIGFkZE9ic2VydmVyCiAgICBAcGFy YW0ge1N0cmluZ30ga2V5IFRoZSBrZXkgdG8gb2JzZXJ2ZXIKICAgIEBwYXJh bSB7T2JqZWN0fSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gaW52b2tl CiAgICBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gbWV0aG9kIFRoZSBtZXRo b2QgdG8gaW52b2tlLgogICAgQHJldHVybiB7RW1iZXIuT2JqZWN0fSBzZWxm CiAgKi8KICBhZGRPYnNlcnZlcjogZnVuY3Rpb24oa2V5LCB0YXJnZXQsIG1l dGhvZCkgewogICAgRW1iZXIuYWRkT2JzZXJ2ZXIodGhpcywga2V5LCB0YXJn ZXQsIG1ldGhvZCk7CiAgfSwKCiAgLyoqCiAgICBSZW1vdmUgYW4gb2JzZXJ2 ZXIgeW91IGhhdmUgcHJldmlvdXNseSByZWdpc3RlcmVkIG9uIHRoaXMgb2Jq ZWN0LiBQYXNzCiAgICB0aGUgc2FtZSBrZXksIHRhcmdldCwgYW5kIG1ldGhv ZCB5b3UgcGFzc2VkIHRvIGBhZGRPYnNlcnZlcigpYCBhbmQgeW91cgogICAg dGFyZ2V0IHdpbGwgbm8gbG9uZ2VyIHJlY2VpdmUgbm90aWZpY2F0aW9ucy4K CiAgICBAbWV0aG9kIHJlbW92ZU9ic2VydmVyCiAgICBAcGFyYW0ge1N0cmlu Z30ga2V5IFRoZSBrZXkgdG8gb2JzZXJ2ZXIKICAgIEBwYXJhbSB7T2JqZWN0 fSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gaW52b2tlCiAgICBAcGFy YW0ge1N0cmluZ3xGdW5jdGlvbn0gbWV0aG9kIFRoZSBtZXRob2QgdG8gaW52 b2tlLgogICAgQHJldHVybiB7RW1iZXIuT2JzZXJ2YWJsZX0gcmVjZWl2ZXIK ICAqLwogIHJlbW92ZU9ic2VydmVyOiBmdW5jdGlvbihrZXksIHRhcmdldCwg bWV0aG9kKSB7CiAgICBFbWJlci5yZW1vdmVPYnNlcnZlcih0aGlzLCBrZXks IHRhcmdldCwgbWV0aG9kKTsKICB9LAoKICAvKioKICAgIFJldHVybnMgYHRy dWVgIGlmIHRoZSBvYmplY3QgY3VycmVudGx5IGhhcyBvYnNlcnZlcnMgcmVn aXN0ZXJlZCBmb3IgYQogICAgcGFydGljdWxhciBrZXkuIFlvdSBjYW4gdXNl IHRoaXMgbWV0aG9kIHRvIHBvdGVudGlhbGx5IGRlZmVyIHBlcmZvcm1pbmcK ICAgIGFuIGV4cGVuc2l2ZSBhY3Rpb24gdW50aWwgc29tZW9uZSBiZWdpbnMg b2JzZXJ2aW5nIGEgcGFydGljdWxhciBwcm9wZXJ0eQogICAgb24gdGhlIG9i amVjdC4KCiAgICBAbWV0aG9kIGhhc09ic2VydmVyRm9yCiAgICBAcGFyYW0g e1N0cmluZ30ga2V5IEtleSB0byBjaGVjawogICAgQHJldHVybiB7Qm9vbGVh bn0KICAqLwogIGhhc09ic2VydmVyRm9yOiBmdW5jdGlvbihrZXkpIHsKICAg IHJldHVybiBFbWJlci5oYXNMaXN0ZW5lcnModGhpcywga2V5Kyc6Y2hhbmdl Jyk7CiAgfSwKCiAgLyoqCiAgICBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIGEg cHJvcGVydHksIG9yIGEgZGVmYXVsdCB2YWx1ZSBpbiB0aGUgY2FzZSB0aGF0 IHRoZQogICAgcHJvcGVydHkgcmV0dXJucyBgdW5kZWZpbmVkYC4KCiAgICBg YGBqYXZhc2NyaXB0CiAgICBwZXJzb24uZ2V0V2l0aERlZmF1bHQoJ2xhc3RO YW1lJywgJ0RvZScpOwogICAgYGBgCgogICAgQG1ldGhvZCBnZXRXaXRoRGVm YXVsdAogICAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhlIG5hbWUgb2Yg dGhlIHByb3BlcnR5IHRvIHJldHJpZXZlCiAgICBAcGFyYW0ge09iamVjdH0g ZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byByZXR1cm4gaWYgdGhlIHByb3Bl cnR5IHZhbHVlIGlzIHVuZGVmaW5lZAogICAgQHJldHVybiB7T2JqZWN0fSBU aGUgcHJvcGVydHkgdmFsdWUgb3IgdGhlIGRlZmF1bHRWYWx1ZS4KICAqLwog IGdldFdpdGhEZWZhdWx0OiBmdW5jdGlvbihrZXlOYW1lLCBkZWZhdWx0VmFs dWUpIHsKICAgIHJldHVybiBFbWJlci5nZXRXaXRoRGVmYXVsdCh0aGlzLCBr ZXlOYW1lLCBkZWZhdWx0VmFsdWUpOwogIH0sCgogIC8qKgogICAgU2V0IHRo ZSB2YWx1ZSBvZiBhIHByb3BlcnR5IHRvIHRoZSBjdXJyZW50IHZhbHVlIHBs dXMgc29tZSBhbW91bnQuCgogICAgYGBgamF2YXNjcmlwdAogICAgcGVyc29u LmluY3JlbWVudFByb3BlcnR5KCdhZ2UnKTsKICAgIHRlYW0uaW5jcmVtZW50 UHJvcGVydHkoJ3Njb3JlJywgMik7CiAgICBgYGAKCiAgICBAbWV0aG9kIGlu Y3JlbWVudFByb3BlcnR5CiAgICBAcGFyYW0ge1N0cmluZ30ga2V5TmFtZSBU aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gaW5jcmVtZW50CiAgICBAcGFy YW0ge051bWJlcn0gaW5jcmVtZW50IFRoZSBhbW91bnQgdG8gaW5jcmVtZW50 IGJ5LiBEZWZhdWx0cyB0byAxCiAgICBAcmV0dXJuIHtOdW1iZXJ9IFRoZSBu ZXcgcHJvcGVydHkgdmFsdWUKICAqLwogIGluY3JlbWVudFByb3BlcnR5OiBm dW5jdGlvbihrZXlOYW1lLCBpbmNyZW1lbnQpIHsKICAgIGlmIChFbWJlci5p c05vbmUoaW5jcmVtZW50KSkgeyBpbmNyZW1lbnQgPSAxOyB9CiAgICBFbWJl ci5hc3NlcnQoIk11c3QgcGFzcyBhIG51bWVyaWMgdmFsdWUgdG8gaW5jcmVt ZW50UHJvcGVydHkiLCAoIWlzTmFOKHBhcnNlRmxvYXQoaW5jcmVtZW50KSkg JiYgaXNGaW5pdGUoaW5jcmVtZW50KSkpOwogICAgc2V0KHRoaXMsIGtleU5h bWUsIChnZXQodGhpcywga2V5TmFtZSkgfHwgMCkgKyBpbmNyZW1lbnQpOwog ICAgcmV0dXJuIGdldCh0aGlzLCBrZXlOYW1lKTsKICB9LAoKICAvKioKICAg IFNldCB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSB0byB0aGUgY3VycmVudCB2 YWx1ZSBtaW51cyBzb21lIGFtb3VudC4KCiAgICBgYGBqYXZhc2NyaXB0CiAg ICBwbGF5ZXIuZGVjcmVtZW50UHJvcGVydHkoJ2xpdmVzJyk7CiAgICBvcmMu ZGVjcmVtZW50UHJvcGVydHkoJ2hlYWx0aCcsIDUpOwogICAgYGBgCgogICAg QG1ldGhvZCBkZWNyZW1lbnRQcm9wZXJ0eQogICAgQHBhcmFtIHtTdHJpbmd9 IGtleU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGRlY3JlbWVu dAogICAgQHBhcmFtIHtOdW1iZXJ9IGRlY3JlbWVudCBUaGUgYW1vdW50IHRv IGRlY3JlbWVudCBieS4gRGVmYXVsdHMgdG8gMQogICAgQHJldHVybiB7TnVt YmVyfSBUaGUgbmV3IHByb3BlcnR5IHZhbHVlCiAgKi8KICBkZWNyZW1lbnRQ cm9wZXJ0eTogZnVuY3Rpb24oa2V5TmFtZSwgZGVjcmVtZW50KSB7CiAgICBp ZiAoRW1iZXIuaXNOb25lKGRlY3JlbWVudCkpIHsgZGVjcmVtZW50ID0gMTsg fQogICAgRW1iZXIuYXNzZXJ0KCJNdXN0IHBhc3MgYSBudW1lcmljIHZhbHVl IHRvIGRlY3JlbWVudFByb3BlcnR5IiwgKCFpc05hTihwYXJzZUZsb2F0KGRl Y3JlbWVudCkpICYmIGlzRmluaXRlKGRlY3JlbWVudCkpKTsKICAgIHNldCh0 aGlzLCBrZXlOYW1lLCAoZ2V0KHRoaXMsIGtleU5hbWUpIHx8IDApIC0gZGVj cmVtZW50KTsKICAgIHJldHVybiBnZXQodGhpcywga2V5TmFtZSk7CiAgfSwK CiAgLyoqCiAgICBTZXQgdGhlIHZhbHVlIG9mIGEgYm9vbGVhbiBwcm9wZXJ0 eSB0byB0aGUgb3Bwb3NpdGUgb2YgaXQncwogICAgY3VycmVudCB2YWx1ZS4K CiAgICBgYGBqYXZhc2NyaXB0CiAgICBzdGFyc2hpcC50b2dnbGVQcm9wZXJ0 eSgnd2FycERyaXZlRW5nYWdlZCcpOwogICAgYGBgCgogICAgQG1ldGhvZCB0 b2dnbGVQcm9wZXJ0eQogICAgQHBhcmFtIHtTdHJpbmd9IGtleU5hbWUgVGhl IG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHRvZ2dsZQogICAgQHJldHVybiB7 T2JqZWN0fSBUaGUgbmV3IHByb3BlcnR5IHZhbHVlCiAgKi8KICB0b2dnbGVQ cm9wZXJ0eTogZnVuY3Rpb24oa2V5TmFtZSkgewogICAgc2V0KHRoaXMsIGtl eU5hbWUsICFnZXQodGhpcywga2V5TmFtZSkpOwogICAgcmV0dXJuIGdldCh0 aGlzLCBrZXlOYW1lKTsKICB9LAoKICAvKioKICAgIFJldHVybnMgdGhlIGNh Y2hlZCB2YWx1ZSBvZiBhIGNvbXB1dGVkIHByb3BlcnR5LCBpZiBpdCBleGlz dHMuCiAgICBUaGlzIGFsbG93cyB5b3UgdG8gaW5zcGVjdCB0aGUgdmFsdWUg b2YgYSBjb21wdXRlZCBwcm9wZXJ0eQogICAgd2l0aG91dCBhY2NpZGVudGFs bHkgaW52b2tpbmcgaXQgaWYgaXQgaXMgaW50ZW5kZWQgdG8gYmUKICAgIGdl bmVyYXRlZCBsYXppbHkuCgogICAgQG1ldGhvZCBjYWNoZUZvcgogICAgQHBh cmFtIHtTdHJpbmd9IGtleU5hbWUKICAgIEByZXR1cm4ge09iamVjdH0gVGhl IGNhY2hlZCB2YWx1ZSBvZiB0aGUgY29tcHV0ZWQgcHJvcGVydHksIGlmIGFu eQogICovCiAgY2FjaGVGb3I6IGZ1bmN0aW9uKGtleU5hbWUpIHsKICAgIHJl dHVybiBFbWJlci5jYWNoZUZvcih0aGlzLCBrZXlOYW1lKTsKICB9LAoKICAv LyBpbnRlbmRlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzCiAgb2JzZXJ2ZXJz Rm9yS2V5OiBmdW5jdGlvbihrZXlOYW1lKSB7CiAgICByZXR1cm4gRW1iZXIu b2JzZXJ2ZXJzRm9yKHRoaXMsIGtleU5hbWUpOwogIH0KfSk7Cgp9KSgpOwoK CgooZnVuY3Rpb24oKSB7Ci8qKgogIEBtb2R1bGUgZW1iZXIKICBAc3VibW9k dWxlIGVtYmVyLXJ1bnRpbWUKKi8KCgovLyBOT1RFOiB0aGlzIG9iamVjdCBz aG91bGQgbmV2ZXIgYmUgaW5jbHVkZWQgZGlyZWN0bHkuIEluc3RlYWQgdXNl IGBFbWJlci5PYmplY3RgLgovLyBXZSBvbmx5IGRlZmluZSB0aGlzIHNlcGFy YXRlbHkgc28gdGhhdCBgRW1iZXIuU2V0YCBjYW4gZGVwZW5kIG9uIGl0LgoK CnZhciBzZXQgPSBFbWJlci5zZXQsIGdldCA9IEVtYmVyLmdldCwKICAgIG9f Y3JlYXRlID0gRW1iZXIuY3JlYXRlLAogICAgb19kZWZpbmVQcm9wZXJ0eSA9 IEVtYmVyLnBsYXRmb3JtLmRlZmluZVByb3BlcnR5LAogICAgR1VJRF9LRVkg PSBFbWJlci5HVUlEX0tFWSwKICAgIGd1aWRGb3IgPSBFbWJlci5ndWlkRm9y LAogICAgZ2VuZXJhdGVHdWlkID0gRW1iZXIuZ2VuZXJhdGVHdWlkLAogICAg bWV0YSA9IEVtYmVyLm1ldGEsCiAgICBNRVRBX0tFWSA9IEVtYmVyLk1FVEFf S0VZLAogICAgcmV3YXRjaCA9IEVtYmVyLnJld2F0Y2gsCiAgICBmaW5pc2hD aGFpbnMgPSBFbWJlci5maW5pc2hDaGFpbnMsCiAgICBzZW5kRXZlbnQgPSBF bWJlci5zZW5kRXZlbnQsCiAgICBkZXN0cm95ID0gRW1iZXIuZGVzdHJveSwK ICAgIHNjaGVkdWxlID0gRW1iZXIucnVuLnNjaGVkdWxlLAogICAgTWl4aW4g PSBFbWJlci5NaXhpbiwKICAgIGFwcGx5TWl4aW4gPSBNaXhpbi5fYXBwbHks CiAgICBmaW5pc2hQYXJ0aWFsID0gTWl4aW4uZmluaXNoUGFydGlhbCwKICAg IHJlb3BlbiA9IE1peGluLnByb3RvdHlwZS5yZW9wZW4sCiAgICBNQU5EQVRP UllfU0VUVEVSID0gRW1iZXIuRU5WLk1BTkRBVE9SWV9TRVRURVIsCiAgICBp bmRleE9mID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmluZGV4T2Y7Cgp2YXIg dW5kZWZpbmVkRGVzY3JpcHRvciA9IHsKICBjb25maWd1cmFibGU6IHRydWUs CiAgd3JpdGFibGU6IHRydWUsCiAgZW51bWVyYWJsZTogZmFsc2UsCiAgdmFs dWU6IHVuZGVmaW5lZAp9OwoKdmFyIG51bGxEZXNjcmlwdG9yID0gewogIGNv bmZpZ3VyYWJsZTogdHJ1ZSwKICB3cml0YWJsZTogdHJ1ZSwKICBlbnVtZXJh YmxlOiBmYWxzZSwKICB2YWx1ZTogbnVsbAp9OwoKZnVuY3Rpb24gbWFrZUN0 b3IoKSB7CgogIC8vIE5vdGU6IGF2b2lkIGFjY2Vzc2luZyBhbnkgcHJvcGVy dGllcyBvbiB0aGUgb2JqZWN0IHNpbmNlIGl0IG1ha2VzIHRoZQogIC8vIG1l dGhvZCBhIGxvdCBmYXN0ZXIuIFRoaXMgaXMgZ2x1ZSBjb2RlIHNvIHdlIHdh bnQgaXQgdG8gYmUgYXMgZmFzdCBhcwogIC8vIHBvc3NpYmxlLgoKICB2YXIg d2FzQXBwbGllZCA9IGZhbHNlLCBpbml0TWl4aW5zLCBpbml0UHJvcGVydGll czsKCiAgdmFyIENsYXNzID0gZnVuY3Rpb24oKSB7CiAgICBpZiAoIXdhc0Fw cGxpZWQpIHsKICAgICAgQ2xhc3MucHJvdG8oKTsgLy8gcHJlcGFyZSBwcm90 b3R5cGUuLi4KICAgIH0KICAgIG9fZGVmaW5lUHJvcGVydHkodGhpcywgR1VJ RF9LRVksIG51bGxEZXNjcmlwdG9yKTsKICAgIG9fZGVmaW5lUHJvcGVydHko dGhpcywgJ19fbmV4dFN1cGVyJywgdW5kZWZpbmVkRGVzY3JpcHRvcik7CiAg ICB2YXIgbSA9IG1ldGEodGhpcyksIHByb3RvID0gbS5wcm90bzsKICAgIG0u cHJvdG8gPSB0aGlzOwogICAgaWYgKGluaXRNaXhpbnMpIHsKICAgICAgLy8g Y2FwdHVyZSBsb2NhbGx5IHNvIHdlIGNhbiBjbGVhciB0aGUgY2xvc2VkIG92 ZXIgdmFyaWFibGUKICAgICAgdmFyIG1peGlucyA9IGluaXRNaXhpbnM7CiAg ICAgIGluaXRNaXhpbnMgPSBudWxsOwogICAgICB0aGlzLnJlb3Blbi5hcHBs eSh0aGlzLCBtaXhpbnMpOwogICAgfQogICAgaWYgKGluaXRQcm9wZXJ0aWVz KSB7CiAgICAgIC8vIGNhcHR1cmUgbG9jYWxseSBzbyB3ZSBjYW4gY2xlYXIg dGhlIGNsb3NlZCBvdmVyIHZhcmlhYmxlCiAgICAgIHZhciBwcm9wcyA9IGlu aXRQcm9wZXJ0aWVzOwogICAgICBpbml0UHJvcGVydGllcyA9IG51bGw7Cgog ICAgICB2YXIgY29uY2F0ZW5hdGVkUHJvcGVydGllcyA9IHRoaXMuY29uY2F0 ZW5hdGVkUHJvcGVydGllczsKCiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0g cHJvcHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgdmFyIHByb3Bl cnRpZXMgPSBwcm9wc1tpXTsKCiAgICAgICAgRW1iZXIuYXNzZXJ0KCJFbWJl ci5PYmplY3QuY3JlYXRlIG5vIGxvbmdlciBzdXBwb3J0cyBtaXhpbmcgaW4g b3RoZXIgZGVmaW5pdGlvbnMsIHVzZSBjcmVhdGVXaXRoTWl4aW5zIGluc3Rl YWQuIiwgIShwcm9wZXJ0aWVzIGluc3RhbmNlb2YgRW1iZXIuTWl4aW4pKTsK CiAgICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0aWVzICE9PSAnb2JqZWN0JyAm JiBwcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIHRocm93 IG5ldyBFbWJlci5FcnJvcigiRW1iZXIuT2JqZWN0LmNyZWF0ZSBvbmx5IGFj Y2VwdHMgb2JqZWN0cy4iKTsKICAgICAgICB9CgogICAgICAgIGlmICghcHJv cGVydGllcykgeyBjb250aW51ZTsgfQoKICAgICAgICB2YXIga2V5TmFtZXMg PSBFbWJlci5rZXlzKHByb3BlcnRpZXMpOwoKICAgICAgICBmb3IgKHZhciBq ID0gMCwgbGwgPSBrZXlOYW1lcy5sZW5ndGg7IGogPCBsbDsgaisrKSB7CiAg ICAgICAgICB2YXIga2V5TmFtZSA9IGtleU5hbWVzW2pdOwogICAgICAgICAg aWYgKCFwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGtleU5hbWUpKSB7IGNv bnRpbnVlOyB9CgogICAgICAgICAgdmFyIHZhbHVlID0gcHJvcGVydGllc1tr ZXlOYW1lXSwKICAgICAgICAgICAgICBJU19CSU5ESU5HID0gRW1iZXIuSVNf QklORElORzsKCiAgICAgICAgICBpZiAoSVNfQklORElORy50ZXN0KGtleU5h bWUpKSB7CiAgICAgICAgICAgIHZhciBiaW5kaW5ncyA9IG0uYmluZGluZ3M7 CiAgICAgICAgICAgIGlmICghYmluZGluZ3MpIHsKICAgICAgICAgICAgICBi aW5kaW5ncyA9IG0uYmluZGluZ3MgPSB7fTsKICAgICAgICAgICAgfSBlbHNl IGlmICghbS5oYXNPd25Qcm9wZXJ0eSgnYmluZGluZ3MnKSkgewogICAgICAg ICAgICAgIGJpbmRpbmdzID0gbS5iaW5kaW5ncyA9IG9fY3JlYXRlKG0uYmlu ZGluZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJpbmRpbmdzW2tl eU5hbWVdID0gdmFsdWU7CiAgICAgICAgICB9CgogICAgICAgICAgdmFyIGRl c2MgPSBtLmRlc2NzW2tleU5hbWVdOwoKICAgICAgICAgIEVtYmVyLmFzc2Vy dCgiRW1iZXIuT2JqZWN0LmNyZWF0ZSBubyBsb25nZXIgc3VwcG9ydHMgZGVm aW5pbmcgY29tcHV0ZWQgcHJvcGVydGllcy4iLCAhKHZhbHVlIGluc3RhbmNl b2YgRW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eSkpOwogICAgICAgICAgRW1iZXIu YXNzZXJ0KCJFbWJlci5PYmplY3QuY3JlYXRlIG5vIGxvbmdlciBzdXBwb3J0 cyBkZWZpbmluZyBtZXRob2RzIHRoYXQgY2FsbCBfc3VwZXIuIiwgISh0eXBl b2YgdmFsdWUgPT09ICdmdW5jdGlvbicgJiYgdmFsdWUudG9TdHJpbmcoKS5p bmRleE9mKCcuX3N1cGVyJykgIT09IC0xKSk7CiAgICAgICAgICBFbWJlci5h c3NlcnQoImBhY3Rpb25zYCBtdXN0IGJlIHByb3ZpZGVkIGF0IGV4dGVuZCB0 aW1lLCBub3QgYXQgY3JlYXRlICIgKwogICAgICAgICAgICAgICAgICAgICAg ICJ0aW1lLCB3aGVuIEVtYmVyLkFjdGlvbkhhbmRsZXIgaXMgdXNlZCAoaS5l LiB2aWV3cywgIiArCiAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2xs ZXJzICYgcm91dGVzKS4iLCAhKChrZXlOYW1lID09PSAnYWN0aW9ucycpICYm IEVtYmVyLkFjdGlvbkhhbmRsZXIuZGV0ZWN0KHRoaXMpKSk7CgogICAgICAg ICAgaWYgKGNvbmNhdGVuYXRlZFByb3BlcnRpZXMgJiYgaW5kZXhPZihjb25j YXRlbmF0ZWRQcm9wZXJ0aWVzLCBrZXlOYW1lKSA+PSAwKSB7CiAgICAgICAg ICAgIHZhciBiYXNlVmFsdWUgPSB0aGlzW2tleU5hbWVdOwoKICAgICAgICAg ICAgaWYgKGJhc2VWYWx1ZSkgewogICAgICAgICAgICAgIGlmICgnZnVuY3Rp b24nID09PSB0eXBlb2YgYmFzZVZhbHVlLmNvbmNhdCkgewogICAgICAgICAg ICAgICAgdmFsdWUgPSBiYXNlVmFsdWUuY29uY2F0KHZhbHVlKTsKICAgICAg ICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFsdWUgPSBFbWJl ci5tYWtlQXJyYXkoYmFzZVZhbHVlKS5jb25jYXQodmFsdWUpOwogICAgICAg ICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2 YWx1ZSA9IEVtYmVyLm1ha2VBcnJheSh2YWx1ZSk7CiAgICAgICAgICAgIH0K ICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoZGVzYykgewogICAgICAgICAg ICBkZXNjLnNldCh0aGlzLCBrZXlOYW1lLCB2YWx1ZSk7CiAgICAgICAgICB9 IGVsc2UgewogICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2V0VW5rbm93 blByb3BlcnR5ID09PSAnZnVuY3Rpb24nICYmICEoa2V5TmFtZSBpbiB0aGlz KSkgewogICAgICAgICAgICAgIHRoaXMuc2V0VW5rbm93blByb3BlcnR5KGtl eU5hbWUsIHZhbHVlKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChNQU5EQVRP UllfU0VUVEVSKSB7CiAgICAgICAgICAgICAgRW1iZXIuZGVmaW5lUHJvcGVy dHkodGhpcywga2V5TmFtZSwgbnVsbCwgdmFsdWUpOyAvLyBzZXR1cCBtYW5k YXRvcnkgc2V0dGVyCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAg ICAgdGhpc1trZXlOYW1lXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAg ICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmaW5pc2hQYXJ0 aWFsKHRoaXMsIG0pOwogICAgdGhpcy5pbml0LmFwcGx5KHRoaXMsIGFyZ3Vt ZW50cyk7CiAgICBtLnByb3RvID0gcHJvdG87CiAgICBmaW5pc2hDaGFpbnMo dGhpcyk7CiAgICBzZW5kRXZlbnQodGhpcywgImluaXQiKTsKICB9OwoKICBD bGFzcy50b1N0cmluZyA9IE1peGluLnByb3RvdHlwZS50b1N0cmluZzsKICBD bGFzcy53aWxsUmVvcGVuID0gZnVuY3Rpb24oKSB7CiAgICBpZiAod2FzQXBw bGllZCkgewogICAgICBDbGFzcy5Qcm90b3R5cGVNaXhpbiA9IE1peGluLmNy ZWF0ZShDbGFzcy5Qcm90b3R5cGVNaXhpbik7CiAgICB9CgogICAgd2FzQXBw bGllZCA9IGZhbHNlOwogIH07CiAgQ2xhc3MuX2luaXRNaXhpbnMgPSBmdW5j dGlvbihhcmdzKSB7IGluaXRNaXhpbnMgPSBhcmdzOyB9OwogIENsYXNzLl9p bml0UHJvcGVydGllcyA9IGZ1bmN0aW9uKGFyZ3MpIHsgaW5pdFByb3BlcnRp ZXMgPSBhcmdzOyB9OwoKICBDbGFzcy5wcm90byA9IGZ1bmN0aW9uKCkgewog ICAgdmFyIHN1cGVyY2xhc3MgPSBDbGFzcy5zdXBlcmNsYXNzOwogICAgaWYg KHN1cGVyY2xhc3MpIHsgc3VwZXJjbGFzcy5wcm90bygpOyB9CgogICAgaWYg KCF3YXNBcHBsaWVkKSB7CiAgICAgIHdhc0FwcGxpZWQgPSB0cnVlOwogICAg ICBDbGFzcy5Qcm90b3R5cGVNaXhpbi5hcHBseVBhcnRpYWwoQ2xhc3MucHJv dG90eXBlKTsKICAgICAgcmV3YXRjaChDbGFzcy5wcm90b3R5cGUpOwogICAg fQoKICAgIHJldHVybiB0aGlzLnByb3RvdHlwZTsKICB9OwoKICByZXR1cm4g Q2xhc3M7Cgp9CgovKioKICBAY2xhc3MgQ29yZU9iamVjdAogIEBuYW1lc3Bh Y2UgRW1iZXIKKi8KdmFyIENvcmVPYmplY3QgPSBtYWtlQ3RvcigpOwpDb3Jl T2JqZWN0LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiAiRW1iZXIu Q29yZU9iamVjdCI7IH07CgpDb3JlT2JqZWN0LlByb3RvdHlwZU1peGluID0g TWl4aW4uY3JlYXRlKHsKICByZW9wZW46IGZ1bmN0aW9uKCkgewogICAgYXBw bHlNaXhpbih0aGlzLCBhcmd1bWVudHMsIHRydWUpOwogICAgcmV0dXJuIHRo aXM7CiAgfSwKCiAgLyoqCiAgICBBbiBvdmVycmlkYWJsZSBtZXRob2QgY2Fs bGVkIHdoZW4gb2JqZWN0cyBhcmUgaW5zdGFudGlhdGVkLiBCeSBkZWZhdWx0 LAogICAgZG9lcyBub3RoaW5nIHVubGVzcyBpdCBpcyBvdmVycmlkZGVuIGR1 cmluZyBjbGFzcyBkZWZpbml0aW9uLgoKICAgIEV4YW1wbGU6CgogICAgYGBg amF2YXNjcmlwdAogICAgQXBwLlBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRl bmQoewogICAgICBpbml0OiBmdW5jdGlvbigpIHsKICAgICAgICBhbGVydCgn TmFtZSBpcyAnICsgdGhpcy5nZXQoJ25hbWUnKSk7CiAgICAgIH0KICAgIH0p OwoKICAgIHZhciBzdGV2ZSA9IEFwcC5QZXJzb24uY3JlYXRlKHsKICAgICAg bmFtZTogIlN0ZXZlIgogICAgfSk7CgogICAgLy8gYWxlcnRzICdOYW1lIGlz IFN0ZXZlJy4KICAgIGBgYAoKICAgIE5PVEU6IElmIHlvdSBkbyBvdmVycmlk ZSBgaW5pdGAgZm9yIGEgZnJhbWV3b3JrIGNsYXNzIGxpa2UgYEVtYmVyLlZp ZXdgIG9yCiAgICBgRW1iZXIuQXJyYXlDb250cm9sbGVyYCwgYmUgc3VyZSB0 byBjYWxsIGB0aGlzLl9zdXBlcigpYCBpbiB5b3VyCiAgICBgaW5pdGAgZGVj bGFyYXRpb24hIElmIHlvdSBkb24ndCwgRW1iZXIgbWF5IG5vdCBoYXZlIGFu IG9wcG9ydHVuaXR5IHRvCiAgICBkbyBpbXBvcnRhbnQgc2V0dXAgd29yaywg YW5kIHlvdSdsbCBzZWUgc3RyYW5nZSBiZWhhdmlvciBpbiB5b3VyCiAgICBh cHBsaWNhdGlvbi4KCiAgICBAbWV0aG9kIGluaXQKICAqLwogIGluaXQ6IGZ1 bmN0aW9uKCkge30sCgogIC8qKgogICAgRGVmaW5lcyB0aGUgcHJvcGVydGll cyB0aGF0IHdpbGwgYmUgY29uY2F0ZW5hdGVkIGZyb20gdGhlIHN1cGVyY2xh c3MKICAgIChpbnN0ZWFkIG9mIG92ZXJyaWRkZW4pLgoKICAgIEJ5IGRlZmF1 bHQsIHdoZW4geW91IGV4dGVuZCBhbiBFbWJlciBjbGFzcyBhIHByb3BlcnR5 IGRlZmluZWQgaW4KICAgIHRoZSBzdWJjbGFzcyBvdmVycmlkZXMgYSBwcm9w ZXJ0eSB3aXRoIHRoZSBzYW1lIG5hbWUgdGhhdCBpcyBkZWZpbmVkCiAgICBp biB0aGUgc3VwZXJjbGFzcy4gSG93ZXZlciwgdGhlcmUgYXJlIHNvbWUgY2Fz ZXMgd2hlcmUgaXQgaXMgcHJlZmVyYWJsZQogICAgdG8gYnVpbGQgdXAgYSBw cm9wZXJ0eSdzIHZhbHVlIGJ5IGNvbWJpbmluZyB0aGUgc3VwZXJjbGFzcycg cHJvcGVydHkKICAgIHZhbHVlIHdpdGggdGhlIHN1YmNsYXNzJyB2YWx1ZS4g QW4gZXhhbXBsZSBvZiB0aGlzIGluIHVzZSB3aXRoaW4gRW1iZXIKICAgIGlz IHRoZSBgY2xhc3NOYW1lc2AgcHJvcGVydHkgb2YgYEVtYmVyLlZpZXdgLgoK ICAgIEhlcmUgaXMgc29tZSBzYW1wbGUgY29kZSBzaG93aW5nIHRoZSBkaWZm ZXJlbmNlIGJldHdlZW4gYSBjb25jYXRlbmF0ZWQKICAgIHByb3BlcnR5IGFu ZCBhIG5vcm1hbCBvbmU6CgogICAgYGBgamF2YXNjcmlwdAogICAgQXBwLkJh clZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7CiAgICAgIHNvbWVOb25Db25j YXRlbmF0ZWRQcm9wZXJ0eTogWydiYXInXSwKICAgICAgY2xhc3NOYW1lczog WydiYXInXQogICAgfSk7CgogICAgQXBwLkZvb0JhclZpZXcgPSBBcHAuQmFy Vmlldy5leHRlbmQoewogICAgICBzb21lTm9uQ29uY2F0ZW5hdGVkUHJvcGVy dHk6IFsnZm9vJ10sCiAgICAgIGNsYXNzTmFtZXM6IFsnZm9vJ10sCiAgICB9 KTsKCiAgICB2YXIgZm9vQmFyVmlldyA9IEFwcC5Gb29CYXJWaWV3LmNyZWF0 ZSgpOwogICAgZm9vQmFyVmlldy5nZXQoJ3NvbWVOb25Db25jYXRlbmF0ZWRQ cm9wZXJ0eScpOyAvLyBbJ2ZvbyddCiAgICBmb29CYXJWaWV3LmdldCgnY2xh c3NOYW1lcycpOyAvLyBbJ2VtYmVyLXZpZXcnLCAnYmFyJywgJ2ZvbyddCiAg ICBgYGAKCiAgICBUaGlzIGJlaGF2aW9yIGV4dGVuZHMgdG8gb2JqZWN0IGNy ZWF0aW9uIGFzIHdlbGwuIENvbnRpbnVpbmcgdGhlCiAgICBhYm92ZSBleGFt cGxlOgoKICAgIGBgYGphdmFzY3JpcHQKICAgIHZhciB2aWV3ID0gQXBwLkZv b0JhclZpZXcuY3JlYXRlKHsKICAgICAgc29tZU5vbkNvbmNhdGVuYXRlZFBy b3BlcnR5OiBbJ2JheiddLAogICAgICBjbGFzc05hbWVzOiBbJ2JheiddCiAg ICB9KQogICAgdmlldy5nZXQoJ3NvbWVOb25Db25jYXRlbmF0ZWRQcm9wZXJ0 eScpOyAvLyBbJ2JheiddCiAgICB2aWV3LmdldCgnY2xhc3NOYW1lcycpOyAv LyBbJ2VtYmVyLXZpZXcnLCAnYmFyJywgJ2ZvbycsICdiYXonXQogICAgYGBg CiAgICBBZGRpbmcgYSBzaW5nbGUgcHJvcGVydHkgdGhhdCBpcyBub3QgYW4g YXJyYXkgd2lsbCBqdXN0IGFkZCBpdCBpbiB0aGUgYXJyYXk6CgogICAgYGBg amF2YXNjcmlwdAogICAgdmFyIHZpZXcgPSBBcHAuRm9vQmFyVmlldy5jcmVh dGUoewogICAgICBjbGFzc05hbWVzOiAnYmF6JwogICAgfSkKICAgIHZpZXcu Z2V0KCdjbGFzc05hbWVzJyk7IC8vIFsnZW1iZXItdmlldycsICdiYXInLCAn Zm9vJywgJ2JheiddCiAgICBgYGAKCiAgICBVc2luZyB0aGUgYGNvbmNhdGVu YXRlZFByb3BlcnRpZXNgIHByb3BlcnR5LCB3ZSBjYW4gdGVsbCB0byBFbWJl ciB0aGF0IG1peAogICAgdGhlIGNvbnRlbnQgb2YgdGhlIHByb3BlcnRpZXMu CgogICAgSW4gYEVtYmVyLlZpZXdgIHRoZSBgY2xhc3NOYW1lQmluZGluZ3Ng IGFuZCBgYXR0cmlidXRlQmluZGluZ3NgIHByb3BlcnRpZXMKICAgIGFyZSBh bHNvIGNvbmNhdGVuYXRlZCwgaW4gYWRkaXRpb24gdG8gYGNsYXNzTmFtZXNg LgoKICAgIFRoaXMgZmVhdHVyZSBpcyBhdmFpbGFibGUgZm9yIHlvdSB0byB1 c2UgdGhyb3VnaG91dCB0aGUgRW1iZXIgb2JqZWN0IG1vZGVsLAogICAgYWx0 aG91Z2ggdHlwaWNhbCBhcHAgZGV2ZWxvcGVycyBhcmUgbGlrZWx5IHRvIHVz ZSBpdCBpbmZyZXF1ZW50bHkuIFNpbmNlCiAgICBpdCBjaGFuZ2VzIGV4cGVj dGF0aW9ucyBhYm91dCBiZWhhdmlvciBvZiBwcm9wZXJ0aWVzLCB5b3Ugc2hv dWxkIHByb3Blcmx5CiAgICBkb2N1bWVudCBpdHMgdXNhZ2UgaW4gZWFjaCBp bmRpdmlkdWFsIGNvbmNhdGVuYXRlZCBwcm9wZXJ0eSAodG8gbm90CiAgICBt aXNsZWFkIHlvdXIgdXNlcnMgdG8gdGhpbmsgdGhleSBjYW4gb3ZlcnJpZGUg dGhlIHByb3BlcnR5IGluIGEgc3ViY2xhc3MpLgoKICAgIEBwcm9wZXJ0eSBj b25jYXRlbmF0ZWRQcm9wZXJ0aWVzCiAgICBAdHlwZSBBcnJheQogICAgQGRl ZmF1bHQgbnVsbAogICovCiAgY29uY2F0ZW5hdGVkUHJvcGVydGllczogbnVs bCwKCiAgLyoqCiAgICBEZXN0cm95ZWQgb2JqZWN0IHByb3BlcnR5IGZsYWcu CgogICAgaWYgdGhpcyBwcm9wZXJ0eSBpcyBgdHJ1ZWAgdGhlIG9ic2VydmVy cyBhbmQgYmluZGluZ3Mgd2VyZSBhbHJlYWR5CiAgICByZW1vdmVkIGJ5IHRo ZSBlZmZlY3Qgb2YgY2FsbGluZyB0aGUgYGRlc3Ryb3koKWAgbWV0aG9kLgoK ICAgIEBwcm9wZXJ0eSBpc0Rlc3Ryb3llZAogICAgQGRlZmF1bHQgZmFsc2UK ICAqLwogIGlzRGVzdHJveWVkOiBmYWxzZSwKCiAgLyoqCiAgICBEZXN0cnVj dGlvbiBzY2hlZHVsZWQgZmxhZy4gVGhlIGBkZXN0cm95KClgIG1ldGhvZCBo YXMgYmVlbiBjYWxsZWQuCgogICAgVGhlIG9iamVjdCBzdGF5cyBpbnRhY3Qg dW50aWwgdGhlIGVuZCBvZiB0aGUgcnVuIGxvb3AgYXQgd2hpY2ggcG9pbnQK ICAgIHRoZSBgaXNEZXN0cm95ZWRgIGZsYWcgaXMgc2V0LgoKICAgIEBwcm9w ZXJ0eSBpc0Rlc3Ryb3lpbmcKICAgIEBkZWZhdWx0IGZhbHNlCiAgKi8KICBp c0Rlc3Ryb3lpbmc6IGZhbHNlLAoKICAvKioKICAgIERlc3Ryb3lzIGFuIG9i amVjdCBieSBzZXR0aW5nIHRoZSBgaXNEZXN0cm95ZWRgIGZsYWcgYW5kIHJl bW92aW5nIGl0cwogICAgbWV0YWRhdGEsIHdoaWNoIGVmZmVjdGl2ZWx5IGRl c3Ryb3lzIG9ic2VydmVycyBhbmQgYmluZGluZ3MuCgogICAgSWYgeW91IHRy eSB0byBzZXQgYSBwcm9wZXJ0eSBvbiBhIGRlc3Ryb3llZCBvYmplY3QsIGFu IGV4Y2VwdGlvbiB3aWxsIGJlCiAgICByYWlzZWQuCgogICAgTm90ZSB0aGF0 IGRlc3RydWN0aW9uIGlzIHNjaGVkdWxlZCBmb3IgdGhlIGVuZCBvZiB0aGUg cnVuIGxvb3AgYW5kIGRvZXMgbm90CiAgICBoYXBwZW4gaW1tZWRpYXRlbHku ICBJdCB3aWxsIHNldCBhbiBpc0Rlc3Ryb3lpbmcgZmxhZyBpbW1lZGlhdGVs eS4KCiAgICBAbWV0aG9kIGRlc3Ryb3kKICAgIEByZXR1cm4ge0VtYmVyLk9i amVjdH0gcmVjZWl2ZXIKICAqLwogIGRlc3Ryb3k6IGZ1bmN0aW9uKCkgewog ICAgaWYgKHRoaXMuaXNEZXN0cm95aW5nKSB7IHJldHVybjsgfQogICAgdGhp cy5pc0Rlc3Ryb3lpbmcgPSB0cnVlOwoKICAgIHNjaGVkdWxlKCdhY3Rpb25z JywgdGhpcywgdGhpcy53aWxsRGVzdHJveSk7CiAgICBzY2hlZHVsZSgnZGVz dHJveScsIHRoaXMsIHRoaXMuX3NjaGVkdWxlZERlc3Ryb3kpOwogICAgcmV0 dXJuIHRoaXM7CiAgfSwKCiAgLyoqCiAgICBPdmVycmlkZSB0byBpbXBsZW1l bnQgdGVhcmRvd24uCgogICAgQG1ldGhvZCB3aWxsRGVzdHJveQogICAqLwog IHdpbGxEZXN0cm95OiBFbWJlci5LLAoKICAvKioKICAgIEludm9rZWQgYnkg dGhlIHJ1biBsb29wIHRvIGFjdHVhbGx5IGRlc3Ryb3kgdGhlIG9iamVjdC4g VGhpcyBpcwogICAgc2NoZWR1bGVkIGZvciBleGVjdXRpb24gYnkgdGhlIGBk ZXN0cm95YCBtZXRob2QuCgogICAgQHByaXZhdGUKICAgIEBtZXRob2QgX3Nj aGVkdWxlZERlc3Ryb3kKICAqLwogIF9zY2hlZHVsZWREZXN0cm95OiBmdW5j dGlvbigpIHsKICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSB7IHJldHVybjsg fQogICAgZGVzdHJveSh0aGlzKTsKICAgIHRoaXMuaXNEZXN0cm95ZWQgPSB0 cnVlOwogIH0sCgogIGJpbmQ6IGZ1bmN0aW9uKHRvLCBmcm9tKSB7CiAgICBp ZiAoIShmcm9tIGluc3RhbmNlb2YgRW1iZXIuQmluZGluZykpIHsgZnJvbSA9 IEVtYmVyLkJpbmRpbmcuZnJvbShmcm9tKTsgfQogICAgZnJvbS50byh0byku Y29ubmVjdCh0aGlzKTsKICAgIHJldHVybiBmcm9tOwogIH0sCgogIC8qKgog ICAgUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiB3aGljaCBhdHRl bXB0cyB0byBwcm92aWRlIG1vcmUgaW5mb3JtYXRpb24KICAgIHRoYW4gSmF2 YXNjcmlwdCdzIGB0b1N0cmluZ2AgdHlwaWNhbGx5IGRvZXMsIGluIGEgZ2Vu ZXJpYyB3YXkgZm9yIGFsbCBFbWJlcgogICAgb2JqZWN0cy4KCiAgICBgYGBq YXZhc2NyaXB0CiAgICBBcHAuUGVyc29uID0gRW0uT2JqZWN0LmV4dGVuZCgp CiAgICBwZXJzb24gPSBBcHAuUGVyc29uLmNyZWF0ZSgpCiAgICBwZXJzb24u dG9TdHJpbmcoKSAvLz0+ICI8QXBwLlBlcnNvbjplbWJlcjEwMjQ+IgogICAg YGBgCgogICAgSWYgdGhlIG9iamVjdCdzIGNsYXNzIGlzIG5vdCBkZWZpbmVk IG9uIGFuIEVtYmVyIG5hbWVzcGFjZSwgaXQgd2lsbAogICAgaW5kaWNhdGUg aXQgaXMgYSBzdWJjbGFzcyBvZiB0aGUgcmVnaXN0ZXJlZCBzdXBlcmNsYXNz OgoKICAgYGBgamF2YXNjcmlwdAogICAgU3R1ZGVudCA9IEFwcC5QZXJzb24u ZXh0ZW5kKCkKICAgIHN0dWRlbnQgPSBTdHVkZW50LmNyZWF0ZSgpCiAgICBz dHVkZW50LnRvU3RyaW5nKCkgLy89PiAiPChzdWJjbGFzcyBvZiBBcHAuUGVy c29uKTplbWJlcjEwMjU+IgogICAgYGBgCgogICAgSWYgdGhlIG1ldGhvZCBg dG9TdHJpbmdFeHRlbnNpb25gIGlzIGRlZmluZWQsIGl0cyByZXR1cm4gdmFs dWUgd2lsbCBiZQogICAgaW5jbHVkZWQgaW4gdGhlIG91dHB1dC4KCiAgICBg YGBqYXZhc2NyaXB0CiAgICBBcHAuVGVhY2hlciA9IEFwcC5QZXJzb24uZXh0 ZW5kKHsKICAgICAgdG9TdHJpbmdFeHRlbnNpb246IGZ1bmN0aW9uKCkgewog ICAgICAgIHJldHVybiB0aGlzLmdldCgnZnVsbE5hbWUnKTsKICAgICAgfQog ICAgfSk7CiAgICB0ZWFjaGVyID0gQXBwLlRlYWNoZXIuY3JlYXRlKCkKICAg IHRlYWNoZXIudG9TdHJpbmcoKTsgLy89PiAiPEFwcC5UZWFjaGVyOmVtYmVy MTAyNjpUb20gRGFsZT4iCiAgICBgYGAKCiAgICBAbWV0aG9kIHRvU3RyaW5n CiAgICBAcmV0dXJuIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbgog ICovCiAgdG9TdHJpbmc6IGZ1bmN0aW9uIHRvU3RyaW5nKCkgewogICAgdmFy IGhhc1RvU3RyaW5nRXh0ZW5zaW9uID0gdHlwZW9mIHRoaXMudG9TdHJpbmdF eHRlbnNpb24gPT09ICdmdW5jdGlvbicsCiAgICAgICAgZXh0ZW5zaW9uID0g aGFzVG9TdHJpbmdFeHRlbnNpb24gPyAiOiIgKyB0aGlzLnRvU3RyaW5nRXh0 ZW5zaW9uKCkgOiAnJzsKICAgIHZhciByZXQgPSAnPCcrdGhpcy5jb25zdHJ1 Y3Rvci50b1N0cmluZygpKyc6JytndWlkRm9yKHRoaXMpK2V4dGVuc2lvbisn Pic7CiAgICB0aGlzLnRvU3RyaW5nID0gbWFrZVRvU3RyaW5nKHJldCk7CiAg ICByZXR1cm4gcmV0OwogIH0KfSk7CgpDb3JlT2JqZWN0LlByb3RvdHlwZU1p eGluLm93bmVyQ29uc3RydWN0b3IgPSBDb3JlT2JqZWN0OwoKZnVuY3Rpb24g bWFrZVRvU3RyaW5nKHJldCkgewogIHJldHVybiBmdW5jdGlvbigpIHsgcmV0 dXJuIHJldDsgfTsKfQoKaWYgKEVtYmVyLmNvbmZpZy5vdmVycmlkZVByb3Rv dHlwZU1peGluKSB7CiAgRW1iZXIuY29uZmlnLm92ZXJyaWRlUHJvdG90eXBl TWl4aW4oQ29yZU9iamVjdC5Qcm90b3R5cGVNaXhpbik7Cn0KCkNvcmVPYmpl Y3QuX19zdXBlcl9fID0gbnVsbDsKCnZhciBDbGFzc01peGluID0gTWl4aW4u Y3JlYXRlKHsKCiAgQ2xhc3NNaXhpbjogRW1iZXIucmVxdWlyZWQoKSwKCiAg UHJvdG90eXBlTWl4aW46IEVtYmVyLnJlcXVpcmVkKCksCgogIGlzQ2xhc3M6 IHRydWUsCgogIGlzTWV0aG9kOiBmYWxzZSwKCiAgLyoqCiAgICBDcmVhdGVz IGEgbmV3IHN1YmNsYXNzLgoKICAgIGBgYGphdmFzY3JpcHQKICAgIEFwcC5Q ZXJzb24gPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKICAgICAgc2F5OiBmdW5j dGlvbih0aGluZykgewogICAgICAgIGFsZXJ0KHRoaW5nKTsKICAgICAgIH0K ICAgIH0pOwogICAgYGBgCgogICAgVGhpcyBkZWZpbmVzIGEgbmV3IHN1YmNs YXNzIG9mIEVtYmVyLk9iamVjdDogYEFwcC5QZXJzb25gLiBJdCBjb250YWlu cyBvbmUgbWV0aG9kOiBgc2F5KClgLgoKICAgIFlvdSBjYW4gYWxzbyBjcmVh dGUgYSBzdWJjbGFzcyBmcm9tIGFueSBleGlzdGluZyBjbGFzcyBieSBjYWxs aW5nIGl0cyBgZXh0ZW5kKClgICBtZXRob2QuIEZvciBleGFtcGxlLCB5b3Ug bWlnaHQgd2FudCB0byBjcmVhdGUgYSBzdWJjbGFzcyBvZiBFbWJlcidzIGJ1 aWx0LWluIGBFbWJlci5WaWV3YCBjbGFzczoKCiAgICBgYGBqYXZhc2NyaXB0 CiAgICBBcHAuUGVyc29uVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKICAg ICAgdGFnTmFtZTogJ2xpJywKICAgICAgY2xhc3NOYW1lQmluZGluZ3M6IFsn aXNBZG1pbmlzdHJhdG9yJ10KICAgIH0pOwogICAgYGBgCgogICAgV2hlbiBk ZWZpbmluZyBhIHN1YmNsYXNzLCB5b3UgY2FuIG92ZXJyaWRlIG1ldGhvZHMg YnV0IHN0aWxsIGFjY2VzcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgeW91ciBw YXJlbnQgY2xhc3MgYnkgY2FsbGluZyB0aGUgc3BlY2lhbCBgX3N1cGVyKClg IG1ldGhvZDoKCiAgICBgYGBqYXZhc2NyaXB0CiAgICBBcHAuUGVyc29uID0g RW1iZXIuT2JqZWN0LmV4dGVuZCh7CiAgICAgIHNheTogZnVuY3Rpb24odGhp bmcpIHsKICAgICAgICB2YXIgbmFtZSA9IHRoaXMuZ2V0KCduYW1lJyk7CiAg ICAgICAgYWxlcnQobmFtZSArICcgc2F5czogJyArIHRoaW5nKTsKICAgICAg fQogICAgfSk7CgogICAgQXBwLlNvbGRpZXIgPSBBcHAuUGVyc29uLmV4dGVu ZCh7CiAgICAgIHNheTogZnVuY3Rpb24odGhpbmcpIHsKICAgICAgICB0aGlz Ll9zdXBlcih0aGluZyArICIsIHNpciEiKTsKICAgICAgfSwKICAgICAgbWFy Y2g6IGZ1bmN0aW9uKG51bWJlck9mSG91cnMpIHsKICAgICAgICBhbGVydCh0 aGlzLmdldCgnbmFtZScpICsgJyBtYXJjaGVzIGZvciAnICsgbnVtYmVyT2ZI b3VycyArICcgaG91cnMuJykKICAgICAgfQogICAgfSk7CgogICAgdmFyIHll aHVkYSA9IEFwcC5Tb2xkaWVyLmNyZWF0ZSh7CiAgICAgIG5hbWU6ICJZZWh1 ZGEgS2F0eiIKICAgIH0pOwoKICAgIHllaHVkYS5zYXkoIlllcyIpOyAgLy8g YWxlcnRzICJZZWh1ZGEgS2F0eiBzYXlzOiBZZXMsIHNpciEiCiAgICBgYGAK CiAgICBUaGUgYGNyZWF0ZSgpYCBvbiBsaW5lICMxNyBjcmVhdGVzIGFuICpp bnN0YW5jZSogb2YgdGhlIGBBcHAuU29sZGllcmAgY2xhc3MuIFRoZSBgZXh0 ZW5kKClgIG9uIGxpbmUgIzggY3JlYXRlcyBhICpzdWJjbGFzcyogb2YgYEFw cC5QZXJzb25gLiBBbnkgaW5zdGFuY2Ugb2YgdGhlIGBBcHAuUGVyc29uYCBj bGFzcyB3aWxsICpub3QqIGhhdmUgdGhlIGBtYXJjaCgpYCBtZXRob2QuCgog ICAgWW91IGNhbiBhbHNvIHBhc3MgYEVtYmVyLk1peGluYCBjbGFzc2VzIHRv IGFkZCBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gdGhlIHN1YmNsYXNzLgoK ICAgIGBgYGphdmFzY3JpcHQKICAgIEFwcC5QZXJzb24gPSBFbWJlci5PYmpl Y3QuZXh0ZW5kKHsKICAgICAgc2F5OiBmdW5jdGlvbih0aGluZykgewogICAg ICAgIGFsZXJ0KHRoaXMuZ2V0KCduYW1lJykgKyAnIHNheXM6ICcgKyB0aGlu Zyk7CiAgICAgIH0KICAgIH0pOwoKICAgIEFwcC5TaW5naW5nTWl4aW4gPSBF bWJlci5NaXhpbi5jcmVhdGUoewogICAgICBzaW5nOiBmdW5jdGlvbih0aGlu Zyl7CiAgICAgICAgYWxlcnQodGhpcy5nZXQoJ25hbWUnKSArICcgc2luZ3M6 IGxhIGxhIGxhICcgKyB0aGluZyk7CiAgICAgIH0KICAgIH0pOwoKICAgIEFw cC5Ccm9hZHdheVN0YXIgPSBBcHAuUGVyc29uLmV4dGVuZChBcHAuU2luZ2lu Z01peGluLCB7CiAgICAgIGRhbmNlOiBmdW5jdGlvbigpIHsKICAgICAgICBh bGVydCh0aGlzLmdldCgnbmFtZScpICsgJyBkYW5jZXM6IHRhcCB0YXAgdGFw IHRhcCAnKTsKICAgICAgfQogICAgfSk7CiAgICBgYGAKCiAgICBUaGUgYEFw cC5Ccm9hZHdheVN0YXJgIGNsYXNzIGNvbnRhaW5zIHRocmVlIG1ldGhvZHM6 IGBzYXkoKWAsIGBzaW5nKClgLCBhbmQgYGRhbmNlKClgLgoKICAgIEBtZXRo b2QgZXh0ZW5kCiAgICBAc3RhdGljCgogICAgQHBhcmFtIHtFbWJlci5NaXhp bn0gW21peGluc10qIE9uZSBvciBtb3JlIEVtYmVyLk1peGluIGNsYXNzZXMK ICAgIEBwYXJhbSB7T2JqZWN0fSBbYXJndW1lbnRzXSogT2JqZWN0IGNvbnRh aW5pbmcgdmFsdWVzIHRvIHVzZSB3aXRoaW4gdGhlIG5ldyBjbGFzcwogICov CiAgZXh0ZW5kOiBmdW5jdGlvbigpIHsKICAgIHZhciBDbGFzcyA9IG1ha2VD dG9yKCksIHByb3RvOwogICAgQ2xhc3MuQ2xhc3NNaXhpbiA9IE1peGluLmNy ZWF0ZSh0aGlzLkNsYXNzTWl4aW4pOwogICAgQ2xhc3MuUHJvdG90eXBlTWl4 aW4gPSBNaXhpbi5jcmVhdGUodGhpcy5Qcm90b3R5cGVNaXhpbik7CgogICAg Q2xhc3MuQ2xhc3NNaXhpbi5vd25lckNvbnN0cnVjdG9yID0gQ2xhc3M7CiAg ICBDbGFzcy5Qcm90b3R5cGVNaXhpbi5vd25lckNvbnN0cnVjdG9yID0gQ2xh c3M7CgogICAgcmVvcGVuLmFwcGx5KENsYXNzLlByb3RvdHlwZU1peGluLCBh cmd1bWVudHMpOwoKICAgIENsYXNzLnN1cGVyY2xhc3MgPSB0aGlzOwogICAg Q2xhc3MuX19zdXBlcl9fICA9IHRoaXMucHJvdG90eXBlOwoKICAgIHByb3Rv ID0gQ2xhc3MucHJvdG90eXBlID0gb19jcmVhdGUodGhpcy5wcm90b3R5cGUp OwogICAgcHJvdG8uY29uc3RydWN0b3IgPSBDbGFzczsKICAgIGdlbmVyYXRl R3VpZChwcm90byk7CiAgICBtZXRhKHByb3RvKS5wcm90byA9IHByb3RvOyAv LyB0aGlzIHdpbGwgZGlzYWJsZSBvYnNlcnZlcnMgb24gcHJvdG90eXBlCgog ICAgQ2xhc3MuQ2xhc3NNaXhpbi5hcHBseShDbGFzcyk7CiAgICByZXR1cm4g Q2xhc3M7CiAgfSwKCiAgLyoqCiAgICBFcXVpdmFsZW50IHRvIGRvaW5nIGBl eHRlbmQoYXJndW1lbnRzKS5jcmVhdGUoKWAuCiAgICBJZiBwb3NzaWJsZSB1 c2UgdGhlIG5vcm1hbCBgY3JlYXRlYCBtZXRob2QgaW5zdGVhZC4KCiAgICBA bWV0aG9kIGNyZWF0ZVdpdGhNaXhpbnMKICAgIEBzdGF0aWMKICAgIEBwYXJh bSBbYXJndW1lbnRzXSoKICAqLwogIGNyZWF0ZVdpdGhNaXhpbnM6IGZ1bmN0 aW9uKCkgewogICAgdmFyIEMgPSB0aGlzOwogICAgaWYgKGFyZ3VtZW50cy5s ZW5ndGg+MCkgeyB0aGlzLl9pbml0TWl4aW5zKGFyZ3VtZW50cyk7IH0KICAg IHJldHVybiBuZXcgQygpOwogIH0sCgogIC8qKgogICAgQ3JlYXRlcyBhbiBp bnN0YW5jZSBvZiBhIGNsYXNzLiBBY2NlcHRzIGVpdGhlciBubyBhcmd1bWVu dHMsIG9yIGFuIG9iamVjdAogICAgY29udGFpbmluZyB2YWx1ZXMgdG8gaW5p dGlhbGl6ZSB0aGUgbmV3bHkgaW5zdGFudGlhdGVkIG9iamVjdCB3aXRoLgoK ICAgIGBgYGphdmFzY3JpcHQKICAgIEFwcC5QZXJzb24gPSBFbWJlci5PYmpl Y3QuZXh0ZW5kKHsKICAgICAgaGVsbG9Xb3JsZDogZnVuY3Rpb24oKSB7CiAg ICAgICAgYWxlcnQoIkhpLCBteSBuYW1lIGlzICIgKyB0aGlzLmdldCgnbmFt ZScpKTsKICAgICAgfQogICAgfSk7CgogICAgdmFyIHRvbSA9IEFwcC5QZXJz b24uY3JlYXRlKHsKICAgICAgbmFtZTogJ1RvbSBEYWxlJwogICAgfSk7Cgog ICAgdG9tLmhlbGxvV29ybGQoKTsgLy8gYWxlcnRzICJIaSwgbXkgbmFtZSBp cyBUb20gRGFsZSIuCiAgICBgYGAKCiAgICBgY3JlYXRlYCB3aWxsIGNhbGwg dGhlIGBpbml0YCBmdW5jdGlvbiBpZiBkZWZpbmVkIGR1cmluZwogICAgYEVt YmVyLkFueU9iamVjdC5leHRlbmRgCgogICAgSWYgbm8gYXJndW1lbnRzIGFy ZSBwYXNzZWQgdG8gYGNyZWF0ZWAsIGl0IHdpbGwgbm90IHNldCB2YWx1ZXMg dG8gdGhlIG5ldwogICAgaW5zdGFuY2UgZHVyaW5nIGluaXRpYWxpemF0aW9u OgoKICAgIGBgYGphdmFzY3JpcHQKICAgIHZhciBub05hbWUgPSBBcHAuUGVy c29uLmNyZWF0ZSgpOwogICAgbm9OYW1lLmhlbGxvV29ybGQoKTsgLy8gYWxl cnRzIHVuZGVmaW5lZAogICAgYGBgCgogICAgTk9URTogRm9yIHBlcmZvcm1h bmNlIHJlYXNvbnMsIHlvdSBjYW5ub3QgZGVjbGFyZSBtZXRob2RzIG9yIGNv bXB1dGVkCiAgICBwcm9wZXJ0aWVzIGR1cmluZyBgY3JlYXRlYC4gWW91IHNo b3VsZCBpbnN0ZWFkIGRlY2xhcmUgbWV0aG9kcyBhbmQgY29tcHV0ZWQKICAg IHByb3BlcnRpZXMgd2hlbiB1c2luZyBgZXh0ZW5kYCBvciB1c2UgdGhlIGBj cmVhdGVXaXRoTWl4aW5zYCBzaG9ydGhhbmQuCgogICAgQG1ldGhvZCBjcmVh dGUKICAgIEBzdGF0aWMKICAgIEBwYXJhbSBbYXJndW1lbnRzXSoKICAqLwog IGNyZWF0ZTogZnVuY3Rpb24oKSB7CiAgICB2YXIgQyA9IHRoaXM7CiAgICBp ZiAoYXJndW1lbnRzLmxlbmd0aD4wKSB7IHRoaXMuX2luaXRQcm9wZXJ0aWVz KGFyZ3VtZW50cyk7IH0KICAgIHJldHVybiBuZXcgQygpOwogIH0sCgogIC8q KgogICAgQXVnbWVudHMgYSBjb25zdHJ1Y3RvcidzIHByb3RvdHlwZSB3aXRo IGFkZGl0aW9uYWwKICAgIHByb3BlcnRpZXMgYW5kIGZ1bmN0aW9uczoKCiAg ICBgYGBqYXZhc2NyaXB0CiAgICBNeU9iamVjdCA9IEVtYmVyLk9iamVjdC5l eHRlbmQoewogICAgICBuYW1lOiAnYW4gb2JqZWN0JwogICAgfSk7CgogICAg byA9IE15T2JqZWN0LmNyZWF0ZSgpOwogICAgby5nZXQoJ25hbWUnKTsgLy8g J2FuIG9iamVjdCcKCiAgICBNeU9iamVjdC5yZW9wZW4oewogICAgICBzYXk6 IGZ1bmN0aW9uKG1zZyl7CiAgICAgICAgY29uc29sZS5sb2cobXNnKTsKICAg ICAgfQogICAgfSkKCiAgICBvMiA9IE15T2JqZWN0LmNyZWF0ZSgpOwogICAg bzIuc2F5KCJoZWxsbyIpOyAvLyBsb2dzICJoZWxsbyIKCiAgICBvLnNheSgi Z29vZGJ5ZSIpOyAvLyBsb2dzICJnb29kYnllIgogICAgYGBgCgogICAgVG8g YWRkIGZ1bmN0aW9ucyBhbmQgcHJvcGVydGllcyB0byB0aGUgY29uc3RydWN0 b3IgaXRzZWxmLAogICAgc2VlIGByZW9wZW5DbGFzc2AKCiAgICBAbWV0aG9k IHJlb3BlbgogICovCiAgcmVvcGVuOiBmdW5jdGlvbigpIHsKICAgIHRoaXMu d2lsbFJlb3BlbigpOwogICAgcmVvcGVuLmFwcGx5KHRoaXMuUHJvdG90eXBl TWl4aW4sIGFyZ3VtZW50cyk7CiAgICByZXR1cm4gdGhpczsKICB9LAoKICAv KioKICAgIEF1Z21lbnRzIGEgY29uc3RydWN0b3IncyBvd24gcHJvcGVydGll cyBhbmQgZnVuY3Rpb25zOgoKICAgIGBgYGphdmFzY3JpcHQKICAgIE15T2Jq ZWN0ID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CiAgICAgIG5hbWU6ICdhbiBv YmplY3QnCiAgICB9KTsKCiAgICBNeU9iamVjdC5yZW9wZW5DbGFzcyh7CiAg ICAgIGNhbkJ1aWxkOiBmYWxzZQogICAgfSk7CgogICAgTXlPYmplY3QuY2Fu QnVpbGQ7IC8vIGZhbHNlCiAgICBvID0gTXlPYmplY3QuY3JlYXRlKCk7CiAg ICBgYGAKCiAgICBJbiBvdGhlciB3b3JkcywgdGhpcyBjcmVhdGVzIHN0YXRp YyBwcm9wZXJ0aWVzIGFuZCBmdW5jdGlvbnMgZm9yIHRoZSBjbGFzcy4gVGhl c2UgYXJlIG9ubHkgYXZhaWxhYmxlIG9uIHRoZSBjbGFzcwogICAgYW5kIG5v dCBvbiBhbnkgaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcy4KCiAgICBgYGBqYXZh c2NyaXB0CiAgICBBcHAuUGVyc29uID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7 CiAgICAgIG5hbWUgOiAiIiwKICAgICAgc2F5SGVsbG8gOiBmdW5jdGlvbigp ewogICAgICAgIGFsZXJ0KCJIZWxsby4gTXkgbmFtZSBpcyAiICsgdGhpcy5n ZXQoJ25hbWUnKSk7CiAgICAgIH0KICAgIH0pOwoKICAgIEFwcC5QZXJzb24u cmVvcGVuQ2xhc3MoewogICAgICBzcGVjaWVzIDogIkhvbW8gc2FwaWVucyIs CiAgICAgIGNyZWF0ZVBlcnNvbjogZnVuY3Rpb24obmV3UGVyc29uc05hbWUp ewogICAgICAgIHJldHVybiBBcHAuUGVyc29uLmNyZWF0ZSh7CiAgICAgICAg ICBuYW1lOm5ld1BlcnNvbnNOYW1lCiAgICAgICAgfSk7CiAgICAgIH0KICAg IH0pOwoKICAgIHZhciB0b20gPSBBcHAuUGVyc29uLmNyZWF0ZSh7CiAgICAg IG5hbWUgOiAiVG9tIERhbGUiCiAgICB9KTsKICAgIHZhciB5ZWh1ZGEgPSBB cHAuUGVyc29uLmNyZWF0ZVBlcnNvbigiWWVodWRhIEthdHoiKTsKCiAgICB0 b20uc2F5SGVsbG8oKTsgLy8gIkhlbGxvLiBNeSBuYW1lIGlzIFRvbSBEYWxl IgogICAgeWVodWRhLnNheUhlbGxvKCk7IC8vICJIZWxsby4gTXkgbmFtZSBp cyBZZWh1ZGEgS2F0eiIKICAgIGFsZXJ0KEFwcC5QZXJzb24uc3BlY2llcyk7 IC8vICJIb21vIHNhcGllbnMiCiAgICBgYGAKCiAgICBOb3RlIHRoYXQgYHNw ZWNpZXNgIGFuZCBgY3JlYXRlUGVyc29uYCBhcmUgKm5vdCogdmFsaWQgb24g dGhlIGB0b21gIGFuZCBgeWVodWRhYAogICAgdmFyaWFibGVzLiBUaGV5IGFy ZSBvbmx5IHZhbGlkIG9uIGBBcHAuUGVyc29uYC4KCiAgICBUbyBhZGQgZnVu Y3Rpb25zIGFuZCBwcm9wZXJ0aWVzIHRvIGluc3RhbmNlcyBvZgogICAgYSBj b25zdHJ1Y3RvciBieSBleHRlbmRpbmcgdGhlIGNvbnN0cnVjdG9yJ3MgcHJv dG90eXBlCiAgICBzZWUgYHJlb3BlbmAKCiAgICBAbWV0aG9kIHJlb3BlbkNs YXNzCiAgKi8KICByZW9wZW5DbGFzczogZnVuY3Rpb24oKSB7CiAgICByZW9w ZW4uYXBwbHkodGhpcy5DbGFzc01peGluLCBhcmd1bWVudHMpOwogICAgYXBw bHlNaXhpbih0aGlzLCBhcmd1bWVudHMsIGZhbHNlKTsKICAgIHJldHVybiB0 aGlzOwogIH0sCgogIGRldGVjdDogZnVuY3Rpb24ob2JqKSB7CiAgICBpZiAo J2Z1bmN0aW9uJyAhPT0gdHlwZW9mIG9iaikgeyByZXR1cm4gZmFsc2U7IH0K ICAgIHdoaWxlKG9iaikgewogICAgICBpZiAob2JqPT09dGhpcykgeyByZXR1 cm4gdHJ1ZTsgfQogICAgICBvYmogPSBvYmouc3VwZXJjbGFzczsKICAgIH0K ICAgIHJldHVybiBmYWxzZTsKICB9LAoKICBkZXRlY3RJbnN0YW5jZTogZnVu Y3Rpb24ob2JqKSB7CiAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgdGhpczsK ICB9LAoKICAvKioKICAgIEluIHNvbWUgY2FzZXMsIHlvdSBtYXkgd2FudCB0 byBhbm5vdGF0ZSBjb21wdXRlZCBwcm9wZXJ0aWVzIHdpdGggYWRkaXRpb25h bAogICAgbWV0YWRhdGEgYWJvdXQgaG93IHRoZXkgZnVuY3Rpb24gb3Igd2hh dCB2YWx1ZXMgdGhleSBvcGVyYXRlIG9uLiBGb3IKICAgIGV4YW1wbGUsIGNv bXB1dGVkIHByb3BlcnR5IGZ1bmN0aW9ucyBtYXkgY2xvc2Ugb3ZlciB2YXJp YWJsZXMgdGhhdCBhcmUgdGhlbgogICAgbm8gbG9uZ2VyIGF2YWlsYWJsZSBm b3IgaW50cm9zcGVjdGlvbi4KCiAgICBZb3UgY2FuIHBhc3MgYSBoYXNoIG9m IHRoZXNlIHZhbHVlcyB0byBhIGNvbXB1dGVkIHByb3BlcnR5IGxpa2UgdGhp czoKCiAgICBgYGBqYXZhc2NyaXB0CiAgICBwZXJzb246IGZ1bmN0aW9uKCkg ewogICAgICB2YXIgcGVyc29uSWQgPSB0aGlzLmdldCgncGVyc29uSWQnKTsK ICAgICAgcmV0dXJuIEFwcC5QZXJzb24uY3JlYXRlKHsgaWQ6IHBlcnNvbklk IH0pOwogICAgfS5wcm9wZXJ0eSgpLm1ldGEoeyB0eXBlOiBBcHAuUGVyc29u IH0pCiAgICBgYGAKCiAgICBPbmNlIHlvdSd2ZSBkb25lIHRoaXMsIHlvdSBj YW4gcmV0cmlldmUgdGhlIHZhbHVlcyBzYXZlZCB0byB0aGUgY29tcHV0ZWQK ICAgIHByb3BlcnR5IGZyb20geW91ciBjbGFzcyBsaWtlIHRoaXM6CgogICAg YGBgamF2YXNjcmlwdAogICAgTXlDbGFzcy5tZXRhRm9yUHJvcGVydHkoJ3Bl cnNvbicpOwogICAgYGBgCgogICAgVGhpcyB3aWxsIHJldHVybiB0aGUgb3Jp Z2luYWwgaGFzaCB0aGF0IHdhcyBwYXNzZWQgdG8gYG1ldGEoKWAuCgogICAg QG1ldGhvZCBtZXRhRm9yUHJvcGVydHkKICAgIEBwYXJhbSBrZXkge1N0cmlu Z30gcHJvcGVydHkgbmFtZQogICovCiAgbWV0YUZvclByb3BlcnR5OiBmdW5j dGlvbihrZXkpIHsKICAgIHZhciBtZXRhID0gdGhpcy5wcm90bygpW01FVEFf S0VZXSwKICAgICAgICBkZXNjID0gbWV0YSAmJiBtZXRhLmRlc2NzW2tleV07 CgogICAgRW1iZXIuYXNzZXJ0KCJtZXRhRm9yUHJvcGVydHkoKSBjb3VsZCBu b3QgZmluZCBhIGNvbXB1dGVkIHByb3BlcnR5IHdpdGgga2V5ICciK2tleSsi Jy4iLCAhIWRlc2MgJiYgZGVzYyBpbnN0YW5jZW9mIEVtYmVyLkNvbXB1dGVk UHJvcGVydHkpOwogICAgcmV0dXJuIGRlc2MuX21ldGEgfHwge307CiAgfSwK CiAgLyoqCiAgICBJdGVyYXRlIG92ZXIgZWFjaCBjb21wdXRlZCBwcm9wZXJ0 eSBmb3IgdGhlIGNsYXNzLCBwYXNzaW5nIGl0cyBuYW1lCiAgICBhbmQgYW55 IGFzc29jaWF0ZWQgbWV0YWRhdGEgKHNlZSBgbWV0YUZvclByb3BlcnR5YCkg dG8gdGhlIGNhbGxiYWNrLgoKICAgIEBtZXRob2QgZWFjaENvbXB1dGVkUHJv cGVydHkKICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICBAcGFy YW0ge09iamVjdH0gYmluZGluZwogICovCiAgZWFjaENvbXB1dGVkUHJvcGVy dHk6IGZ1bmN0aW9uKGNhbGxiYWNrLCBiaW5kaW5nKSB7CiAgICB2YXIgcHJv dG8gPSB0aGlzLnByb3RvKCksCiAgICAgICAgZGVzY3MgPSBtZXRhKHByb3Rv KS5kZXNjcywKICAgICAgICBlbXB0eSA9IHt9LAogICAgICAgIHByb3BlcnR5 OwoKICAgIGZvciAodmFyIG5hbWUgaW4gZGVzY3MpIHsKICAgICAgcHJvcGVy dHkgPSBkZXNjc1tuYW1lXTsKCiAgICAgIGlmIChwcm9wZXJ0eSBpbnN0YW5j ZW9mIEVtYmVyLkNvbXB1dGVkUHJvcGVydHkpIHsKICAgICAgICBjYWxsYmFj ay5jYWxsKGJpbmRpbmcgfHwgdGhpcywgbmFtZSwgcHJvcGVydHkuX21ldGEg fHwgZW1wdHkpOwogICAgICB9CiAgICB9CiAgfQoKfSk7CgpDbGFzc01peGlu Lm93bmVyQ29uc3RydWN0b3IgPSBDb3JlT2JqZWN0OwoKaWYgKEVtYmVyLmNv bmZpZy5vdmVycmlkZUNsYXNzTWl4aW4pIHsKICBFbWJlci5jb25maWcub3Zl cnJpZGVDbGFzc01peGluKENsYXNzTWl4aW4pOwp9CgpDb3JlT2JqZWN0LkNs YXNzTWl4aW4gPSBDbGFzc01peGluOwpDbGFzc01peGluLmFwcGx5KENvcmVP YmplY3QpOwoKRW1iZXIuQ29yZU9iamVjdCA9IENvcmVPYmplY3Q7Cgp9KSgp OwoKCgooZnVuY3Rpb24oKSB7Ci8qKgpAbW9kdWxlIGVtYmVyCkBzdWJtb2R1 bGUgZW1iZXItcnVudGltZQoqLwoKLyoqCiAgYEVtYmVyLk9iamVjdGAgaXMg dGhlIG1haW4gYmFzZSBjbGFzcyBmb3IgYWxsIEVtYmVyIG9iamVjdHMuIEl0 IGlzIGEgc3ViY2xhc3MKICBvZiBgRW1iZXIuQ29yZU9iamVjdGAgd2l0aCB0 aGUgYEVtYmVyLk9ic2VydmFibGVgIG1peGluIGFwcGxpZWQuIEZvciBkZXRh aWxzLAogIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgZWFjaCBvZiB0aGVz ZS4KCiAgQGNsYXNzIE9iamVjdAogIEBuYW1lc3BhY2UgRW1iZXIKICBAZXh0 ZW5kcyBFbWJlci5Db3JlT2JqZWN0CiAgQHVzZXMgRW1iZXIuT2JzZXJ2YWJs ZQoqLwpFbWJlci5PYmplY3QgPSBFbWJlci5Db3JlT2JqZWN0LmV4dGVuZChF bWJlci5PYnNlcnZhYmxlKTsKRW1iZXIuT2JqZWN0LnRvU3RyaW5nID0gZnVu Y3Rpb24oKSB7IHJldHVybiAiRW1iZXIuT2JqZWN0IjsgfTsKCn0pKCk7CgoK CihmdW5jdGlvbigpIHsKLyoqCkBtb2R1bGUgZW1iZXIKQHN1Ym1vZHVsZSBl bWJlci1ydW50aW1lCiovCgp2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBpbmRleE9m ID0gRW1iZXIuQXJyYXlQb2x5ZmlsbHMuaW5kZXhPZjsKCi8qKgogIEEgTmFt ZXNwYWNlIGlzIGFuIG9iamVjdCB1c3VhbGx5IHVzZWQgdG8gY29udGFpbiBv dGhlciBvYmplY3RzIG9yIG1ldGhvZHMKICBzdWNoIGFzIGFuIGFwcGxpY2F0 aW9uIG9yIGZyYW1ld29yay4gQ3JlYXRlIGEgbmFtZXNwYWNlIGFueXRpbWUg eW91IHdhbnQKICB0byBkZWZpbmUgb25lIG9mIHRoZXNlIG5ldyBjb250YWlu ZXJzLgoKICAjIEV4YW1wbGUgVXNhZ2UKCiAgYGBgamF2YXNjcmlwdAogIE15 RnJhbWV3b3JrID0gRW1iZXIuTmFtZXNwYWNlLmNyZWF0ZSh7CiAgICBWRVJT SU9OOiAnMS4wLjAnCiAgfSk7CiAgYGBgCgogIEBjbGFzcyBOYW1lc3BhY2UK ICBAbmFtZXNwYWNlIEVtYmVyCiAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0Ciov CnZhciBOYW1lc3BhY2UgPSBFbWJlci5OYW1lc3BhY2UgPSBFbWJlci5PYmpl Y3QuZXh0ZW5kKHsKICBpc05hbWVzcGFjZTogdHJ1ZSwKCiAgaW5pdDogZnVu Y3Rpb24oKSB7CiAgICBFbWJlci5OYW1lc3BhY2UuTkFNRVNQQUNFUy5wdXNo KHRoaXMpOwogICAgRW1iZXIuTmFtZXNwYWNlLlBST0NFU1NFRCA9IGZhbHNl OwogIH0sCgogIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKICAgIHZhciBuYW1l ID0gZ2V0KHRoaXMsICduYW1lJyk7CiAgICBpZiAobmFtZSkgeyByZXR1cm4g bmFtZTsgfQoKICAgIGZpbmROYW1lc3BhY2VzKCk7CiAgICByZXR1cm4gdGhp c1tFbWJlci5HVUlEX0tFWSsnX25hbWUnXTsKICB9LAoKICBuYW1lQ2xhc3Nl czogZnVuY3Rpb24oKSB7CiAgICBwcm9jZXNzTmFtZXNwYWNlKFt0aGlzLnRv U3RyaW5nKCldLCB0aGlzLCB7fSk7CiAgfSwKCiAgZGVzdHJveTogZnVuY3Rp b24oKSB7CiAgICB2YXIgbmFtZXNwYWNlcyA9IEVtYmVyLk5hbWVzcGFjZS5O QU1FU1BBQ0VTOwoKICAgIEVtYmVyLmxvb2t1cFt0aGlzLnRvU3RyaW5nKCld ID0gdW5kZWZpbmVkOwogICAgZGVsZXRlIEVtYmVyLk5hbWVzcGFjZS5OQU1F U1BBQ0VTX0JZX0lEW3RoaXMudG9TdHJpbmcoKV07CiAgICBuYW1lc3BhY2Vz LnNwbGljZShpbmRleE9mLmNhbGwobmFtZXNwYWNlcywgdGhpcyksIDEpOwog ICAgdGhpcy5fc3VwZXIoKTsKICB9Cn0pOwoKTmFtZXNwYWNlLnJlb3BlbkNs YXNzKHsKICBOQU1FU1BBQ0VTOiBbRW1iZXJdLAogIE5BTUVTUEFDRVNfQllf SUQ6IHt9LAogIFBST0NFU1NFRDogZmFsc2UsCiAgcHJvY2Vzc0FsbDogcHJv Y2Vzc0FsbE5hbWVzcGFjZXMsCiAgYnlOYW1lOiBmdW5jdGlvbihuYW1lKSB7 CiAgICBpZiAoIUVtYmVyLkJPT1RFRCkgewogICAgICBwcm9jZXNzQWxsTmFt ZXNwYWNlcygpOwogICAgfQoKICAgIHJldHVybiBOQU1FU1BBQ0VTX0JZX0lE W25hbWVdOwogIH0KfSk7Cgp2YXIgTkFNRVNQQUNFU19CWV9JRCA9IE5hbWVz cGFjZS5OQU1FU1BBQ0VTX0JZX0lEOwoKdmFyIGhhc093blByb3AgPSAoe30p Lmhhc093blByb3BlcnR5LAogICAgZ3VpZEZvciA9IEVtYmVyLmd1aWRGb3I7 CgpmdW5jdGlvbiBwcm9jZXNzTmFtZXNwYWNlKHBhdGhzLCByb290LCBzZWVu KSB7CiAgdmFyIGlkeCA9IHBhdGhzLmxlbmd0aDsKCiAgTkFNRVNQQUNFU19C WV9JRFtwYXRocy5qb2luKCcuJyldID0gcm9vdDsKCiAgLy8gTG9vcCBvdmVy IGFsbCBvZiB0aGUga2V5cyBpbiB0aGUgbmFtZXNwYWNlLCBsb29raW5nIGZv ciBjbGFzc2VzCiAgZm9yKHZhciBrZXkgaW4gcm9vdCkgewogICAgaWYgKCFo YXNPd25Qcm9wLmNhbGwocm9vdCwga2V5KSkgeyBjb250aW51ZTsgfQogICAg dmFyIG9iaiA9IHJvb3Rba2V5XTsKCiAgICAvLyBJZiB3ZSBhcmUgcHJvY2Vz c2luZyB0aGUgYEVtYmVyYCBuYW1lc3BhY2UsIGZvciBleGFtcGxlLCB0aGUK ICAgIC8vIGBwYXRoc2Agd2lsbCBzdGFydCB3aXRoIGBbIkVtYmVyIl1gLiBF dmVyeSBpdGVyYXRpb24gdGhyb3VnaAogICAgLy8gdGhlIGxvb3Agd2lsbCB1 cGRhdGUgdGhlICoqc2Vjb25kKiogZWxlbWVudCBvZiB0aGlzIGxpc3Qgd2l0 aAogICAgLy8gdGhlIGtleSwgc28gcHJvY2Vzc2luZyBgRW1iZXIuVmlld2Ag d2lsbCBtYWtlIHRoZSBBcnJheQogICAgLy8gYFsnRW1iZXInLCAnVmlldydd YC4KICAgIHBhdGhzW2lkeF0gPSBrZXk7CgogICAgLy8gSWYgd2UgaGF2ZSBm b3VuZCBhbiB1bnByb2Nlc3NlZCBjbGFzcwogICAgaWYgKG9iaiAmJiBvYmou dG9TdHJpbmcgPT09IGNsYXNzVG9TdHJpbmcpIHsKICAgICAgLy8gUmVwbGFj ZSB0aGUgY2xhc3MnIGB0b1N0cmluZ2Agd2l0aCB0aGUgZG90LXNlcGFyYXRl ZCBwYXRoCiAgICAgIC8vIGFuZCBzZXQgaXRzIGBOQU1FX0tFWWAKICAgICAg b2JqLnRvU3RyaW5nID0gbWFrZVRvU3RyaW5nKHBhdGhzLmpvaW4oJy4nKSk7 CiAgICAgIG9ialtOQU1FX0tFWV0gPSBwYXRocy5qb2luKCcuJyk7CgogICAg Ly8gU3VwcG9ydCBuZXN0ZWQgbmFtZXNwYWNlcwogICAgfSBlbHNlIGlmIChv YmogJiYgb2JqLmlzTmFtZXNwYWNlKSB7CiAgICAgIC8vIFNraXAgYWxpYXNl ZCBuYW1lc3BhY2VzCiAgICAgIGlmIChzZWVuW2d1aWRGb3Iob2JqKV0pIHsg Y29udGludWU7IH0KICAgICAgc2VlbltndWlkRm9yKG9iaildID0gdHJ1ZTsK CiAgICAgIC8vIFByb2Nlc3MgdGhlIGNoaWxkIG5hbWVzcGFjZQogICAgICBw cm9jZXNzTmFtZXNwYWNlKHBhdGhzLCBvYmosIHNlZW4pOwogICAgfQogIH0K CiAgcGF0aHMubGVuZ3RoID0gaWR4OyAvLyBjdXQgb3V0IGxhc3QgaXRlbQp9 CgpmdW5jdGlvbiBmaW5kTmFtZXNwYWNlcygpIHsKICB2YXIgTmFtZXNwYWNl ID0gRW1iZXIuTmFtZXNwYWNlLCBsb29rdXAgPSBFbWJlci5sb29rdXAsIG9i aiwgaXNOYW1lc3BhY2U7CgogIGlmIChOYW1lc3BhY2UuUFJPQ0VTU0VEKSB7 IHJldHVybjsgfQoKICBmb3IgKHZhciBwcm9wIGluIGxvb2t1cCkgewogICAg Ly8gVGhlc2UgZG9uJ3QgcmFpc2UgZXhjZXB0aW9ucyBidXQgY2FuIGNhdXNl IHdhcm5pbmdzCiAgICBpZiAocHJvcCA9PT0gInBhcmVudCIgfHwgcHJvcCA9 PT0gInRvcCIgfHwgcHJvcCA9PT0gImZyYW1lRWxlbWVudCIgfHwgcHJvcCA9 PT0gIndlYmtpdFN0b3JhZ2VJbmZvIikgeyBjb250aW51ZTsgfQoKICAgIC8v ICBnZXQod2luZG93Lmdsb2JhbFN0b3JhZ2UsICdpc05hbWVzcGFjZScpIHdv dWxkIHRyeSB0byByZWFkIHRoZSBzdG9yYWdlIGZvciBkb21haW4gaXNOYW1l c3BhY2UgYW5kIGNhdXNlIGV4Y2VwdGlvbiBpbiBGaXJlZm94LgogICAgLy8g Z2xvYmFsU3RvcmFnZSBpcyBhIHN0b3JhZ2Ugb2Jzb2xldGVkIGJ5IHRoZSBX aGF0V0cgc3RvcmFnZSBzcGVjaWZpY2F0aW9uLiBTZWUgaHR0cHM6Ly9kZXZl bG9wZXIubW96aWxsYS5vcmcvZW4vRE9NL1N0b3JhZ2UjZ2xvYmFsU3RvcmFn ZQogICAgaWYgKHByb3AgPT09ICJnbG9iYWxTdG9yYWdlIiAmJiBsb29rdXAu U3RvcmFnZUxpc3QgJiYgbG9va3VwLmdsb2JhbFN0b3JhZ2UgaW5zdGFuY2Vv ZiBsb29rdXAuU3RvcmFnZUxpc3QpIHsgY29udGludWU7IH0KICAgIC8vIFVu Zm9ydHVuYXRlbHksIHNvbWUgdmVyc2lvbnMgb2YgSUUgZG9uJ3Qgc3VwcG9y dCB3aW5kb3cuaGFzT3duUHJvcGVydHkKICAgIGlmIChsb29rdXAuaGFzT3du UHJvcGVydHkgJiYgIWxvb2t1cC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgeyBj b250aW51ZTsgfQoKICAgIC8vIEF0IHRpbWVzIHdlIGFyZSBub3QgYWxsb3dl ZCB0byBhY2Nlc3MgY2VydGFpbiBwcm9wZXJ0aWVzIGZvciBzZWN1cml0eSBy ZWFzb25zLgogICAgLy8gVGhlcmUgYXJlIGFsc28gdGltZXMgd2hlcmUgZXZl biBpZiB3ZSBjYW4gYWNjZXNzIHRoZW0sIHdlIGFyZSBub3QgYWxsb3dlZCB0 byBhY2Nlc3MgdGhlaXIgcHJvcGVydGllcy4KICAgIHRyeSB7CiAgICAgIG9i aiA9IEVtYmVyLmxvb2t1cFtwcm9wXTsKICAgICAgaXNOYW1lc3BhY2UgPSBv YmogJiYgb2JqLmlzTmFtZXNwYWNlOwogICAgfSBjYXRjaCAoZSkgewogICAg ICBjb250aW51ZTsKICAgIH0KCiAgICBpZiAoaXNOYW1lc3BhY2UpIHsKICAg ICAgRW1iZXIuZGVwcmVjYXRlKCJOYW1lc3BhY2VzIHNob3VsZCBub3QgYmVn aW4gd2l0aCBsb3dlcmNhc2UuIiwgL15bQS1aXS8udGVzdChwcm9wKSk7CiAg ICAgIG9ialtOQU1FX0tFWV0gPSBwcm9wOwogICAgfQogIH0KfQoKdmFyIE5B TUVfS0VZID0gRW1iZXIuTkFNRV9LRVkgPSBFbWJlci5HVUlEX0tFWSArICdf bmFtZSc7CgpmdW5jdGlvbiBzdXBlckNsYXNzU3RyaW5nKG1peGluKSB7CiAg dmFyIHN1cGVyY2xhc3MgPSBtaXhpbi5zdXBlcmNsYXNzOwogIGlmIChzdXBl cmNsYXNzKSB7CiAgICBpZiAoc3VwZXJjbGFzc1tOQU1FX0tFWV0pIHsgcmV0 dXJuIHN1cGVyY2xhc3NbTkFNRV9LRVldOyB9CiAgICBlbHNlIHsgcmV0dXJu IHN1cGVyQ2xhc3NTdHJpbmcoc3VwZXJjbGFzcyk7IH0KICB9IGVsc2Ugewog ICAgcmV0dXJuOwogIH0KfQoKZnVuY3Rpb24gY2xhc3NUb1N0cmluZygpIHsK ICBpZiAoIUVtYmVyLkJPT1RFRCAmJiAhdGhpc1tOQU1FX0tFWV0pIHsKICAg IHByb2Nlc3NBbGxOYW1lc3BhY2VzKCk7CiAgfQoKICB2YXIgcmV0OwoKICBp ZiAodGhpc1tOQU1FX0tFWV0pIHsKICAgIHJldCA9IHRoaXNbTkFNRV9LRVld OwogIH0gZWxzZSBpZiAodGhpcy5fdG9TdHJpbmcpIHsKICAgIHJldCA9IHRo aXMuX3RvU3RyaW5nOyAKICB9IGVsc2UgewogICAgdmFyIHN0ciA9IHN1cGVy Q2xhc3NTdHJpbmcodGhpcyk7CiAgICBpZiAoc3RyKSB7CiAgICAgIHJldCA9 ICIoc3ViY2xhc3Mgb2YgIiArIHN0ciArICIpIjsKICAgIH0gZWxzZSB7CiAg ICAgIHJldCA9ICIodW5rbm93biBtaXhpbikiOwogICAgfQogICAgdGhpcy50 b1N0cmluZyA9IG1ha2VUb1N0cmluZyhyZXQpOwogIH0KCiAgcmV0dXJuIHJl dDsKfQoKZnVuY3Rpb24gcHJvY2Vzc0FsbE5hbWVzcGFjZXMoKSB7CiAgdmFy IHVucHJvY2Vzc2VkTmFtZXNwYWNlcyA9ICFOYW1lc3BhY2UuUFJPQ0VTU0VE LAogICAgICB1bnByb2Nlc3NlZE1peGlucyA9IEVtYmVyLmFueVVucHJvY2Vz c2VkTWl4aW5zOwoKICBpZiAodW5wcm9jZXNzZWROYW1lc3BhY2VzKSB7CiAg ICBmaW5kTmFtZXNwYWNlcygpOwogICAgTmFtZXNwYWNlLlBST0NFU1NFRCA9 IHRydWU7CiAgfQoKICBpZiAodW5wcm9jZXNzZWROYW1lc3BhY2VzIHx8IHVu cHJvY2Vzc2VkTWl4aW5zKSB7CiAgICB2YXIgbmFtZXNwYWNlcyA9IE5hbWVz cGFjZS5OQU1FU1BBQ0VTLCBuYW1lc3BhY2U7CiAgICBmb3IgKHZhciBpPTAs IGw9bmFtZXNwYWNlcy5sZW5ndGg7IGk8bDsgaSsrKSB7CiAgICAgIG5hbWVz cGFjZSA9IG5hbWVzcGFjZXNbaV07CiAgICAgIHByb2Nlc3NOYW1lc3BhY2Uo W25hbWVzcGFjZS50b1N0cmluZygpXSwgbmFtZXNwYWNlLCB7fSk7CiAgICB9 CgogICAgRW1iZXIuYW55VW5wcm9jZXNzZWRNaXhpbnMgPSBmYWxzZTsKICB9 Cn0KCmZ1bmN0aW9uIG1ha2VUb1N0cmluZyhyZXQpIHsKICByZXR1cm4gZnVu Y3Rpb24oKSB7IHJldHVybiByZXQ7IH07Cn0KCkVtYmVyLk1peGluLnByb3Rv dHlwZS50b1N0cmluZyA9IGNsYXNzVG9TdHJpbmc7Cgp9KSgpOwoKCgooZnVu Y3Rpb24oKSB7Ci8qKgpAbW9kdWxlIGVtYmVyCkBzdWJtb2R1bGUgZW1iZXIt cnVudGltZQoqLwoKdmFyIGdldCA9IEVtYmVyLmdldCwKICAgIHNldCA9IEVt YmVyLnNldCwKICAgIGZtdCA9IEVtYmVyLlN0cmluZy5mbXQsCiAgICBhZGRC ZWZvcmVPYnNlcnZlciA9IEVtYmVyLmFkZEJlZm9yZU9ic2VydmVyLAogICAg YWRkT2JzZXJ2ZXIgPSBFbWJlci5hZGRPYnNlcnZlciwKICAgIHJlbW92ZUJl Zm9yZU9ic2VydmVyID0gRW1iZXIucmVtb3ZlQmVmb3JlT2JzZXJ2ZXIsCiAg ICByZW1vdmVPYnNlcnZlciA9IEVtYmVyLnJlbW92ZU9ic2VydmVyLAogICAg cHJvcGVydHlXaWxsQ2hhbmdlID0gRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdl LAogICAgcHJvcGVydHlEaWRDaGFuZ2UgPSBFbWJlci5wcm9wZXJ0eURpZENo YW5nZSwKICAgIG1ldGEgPSBFbWJlci5tZXRhLAogICAgZGVmaW5lUHJvcGVy dHkgPSBFbWJlci5kZWZpbmVQcm9wZXJ0eTsKCmZ1bmN0aW9uIGNvbnRlbnRQ cm9wZXJ0eVdpbGxDaGFuZ2UoY29udGVudCwgY29udGVudEtleSkgewogIHZh ciBrZXkgPSBjb250ZW50S2V5LnNsaWNlKDgpOyAvLyByZW1vdmUgImNvbnRl bnQuIgogIGlmIChrZXkgaW4gdGhpcykgeyByZXR1cm47IH0gIC8vIGlmIHNo YWRvd2VkIGluIHByb3h5CiAgcHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsIGtl eSk7Cn0KCmZ1bmN0aW9uIGNvbnRlbnRQcm9wZXJ0eURpZENoYW5nZShjb250 ZW50LCBjb250ZW50S2V5KSB7CiAgdmFyIGtleSA9IGNvbnRlbnRLZXkuc2xp Y2UoOCk7IC8vIHJlbW92ZSAiY29udGVudC4iCiAgaWYgKGtleSBpbiB0aGlz KSB7IHJldHVybjsgfSAvLyBpZiBzaGFkb3dlZCBpbiBwcm94eQogIHByb3Bl cnR5RGlkQ2hhbmdlKHRoaXMsIGtleSk7Cn0KCi8qKgogIGBFbWJlci5PYmpl Y3RQcm94eWAgZm9yd2FyZHMgYWxsIHByb3BlcnRpZXMgbm90IGRlZmluZWQg YnkgdGhlIHByb3h5IGl0c2VsZgogIHRvIGEgcHJveGllZCBgY29udGVudGAg b2JqZWN0LgoKICBgYGBqYXZhc2NyaXB0CiAgb2JqZWN0ID0gRW1iZXIuT2Jq ZWN0LmNyZWF0ZSh7CiAgICBuYW1lOiAnRm9vJwogIH0pOwoKICBwcm94eSA9 IEVtYmVyLk9iamVjdFByb3h5LmNyZWF0ZSh7CiAgICBjb250ZW50OiBvYmpl Y3QKICB9KTsKCiAgLy8gQWNjZXNzIGFuZCBjaGFuZ2UgZXhpc3RpbmcgcHJv cGVydGllcwogIHByb3h5LmdldCgnbmFtZScpICAgICAgICAgIC8vICdGb28n CiAgcHJveHkuc2V0KCduYW1lJywgJ0JhcicpOwogIG9iamVjdC5nZXQoJ25h bWUnKSAgICAgICAgIC8vICdCYXInCgogIC8vIENyZWF0ZSBuZXcgJ2Rlc2Ny aXB0aW9uJyBwcm9wZXJ0eSBvbiBgb2JqZWN0YAogIHByb3h5LnNldCgnZGVz Y3JpcHRpb24nLCAnRm9vIGlzIGEgd2hpemJvbyBiYXonKTsKICBvYmplY3Qu Z2V0KCdkZXNjcmlwdGlvbicpICAvLyAnRm9vIGlzIGEgd2hpemJvbyBiYXon CiAgYGBgCgogIFdoaWxlIGBjb250ZW50YCBpcyB1bnNldCwgc2V0dGluZyBh IHByb3BlcnR5IHRvIGJlIGRlbGVnYXRlZCB3aWxsIHRocm93IGFuCiAgRXJy b3IuCgogIGBgYGphdmFzY3JpcHQKICBwcm94eSA9IEVtYmVyLk9iamVjdFBy b3h5LmNyZWF0ZSh7CiAgICBjb250ZW50OiBudWxsLAogICAgZmxhZzogbnVs bAogIH0pOwogIHByb3h5LnNldCgnZmxhZycsIHRydWUpOwogIHByb3h5Lmdl dCgnZmxhZycpOyAgICAgICAgIC8vIHRydWUKICBwcm94eS5nZXQoJ2Zvbycp OyAgICAgICAgICAvLyB1bmRlZmluZWQKICBwcm94eS5zZXQoJ2ZvbycsICdk YXRhJyk7ICAvLyB0aHJvd3MgRXJyb3IKICBgYGAKCiAgRGVsZWdhdGVkIHBy b3BlcnRpZXMgY2FuIGJlIGJvdW5kIHRvIGFuZCB3aWxsIGNoYW5nZSB3aGVu IGNvbnRlbnQgaXMgdXBkYXRlZC4KCiAgQ29tcHV0ZWQgcHJvcGVydGllcyBv biB0aGUgcHJveHkgaXRzZWxmIGNhbiBkZXBlbmQgb24gZGVsZWdhdGVkIHBy b3BlcnRpZXMuCgogIGBgYGphdmFzY3JpcHQKICBQcm94eVdpdGhDb21wdXRl ZFByb3BlcnR5ID0gRW1iZXIuT2JqZWN0UHJveHkuZXh0ZW5kKHsKICAgIGZ1 bGxOYW1lOiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBmaXJzdE5hbWUgPSB0 aGlzLmdldCgnZmlyc3ROYW1lJyksCiAgICAgICAgICBsYXN0TmFtZSA9IHRo aXMuZ2V0KCdsYXN0TmFtZScpOwogICAgICBpZiAoZmlyc3ROYW1lICYmIGxh c3ROYW1lKSB7CiAgICAgICAgcmV0dXJuIGZpcnN0TmFtZSArICcgJyArIGxh c3ROYW1lOwogICAgICB9CiAgICAgIHJldHVybiBmaXJzdE5hbWUgfHwgbGFz dE5hbWU7CiAgICB9LnByb3BlcnR5KCdmaXJzdE5hbWUnLCAnbGFzdE5hbWUn KQogIH0pOwoKICBwcm94eSA9IFByb3h5V2l0aENvbXB1dGVkUHJvcGVydHku Y3JlYXRlKCk7CgogIHByb3h5LmdldCgnZnVsbE5hbWUnKTsgIC8vIHVuZGVm aW5lZAogIHByb3h5LnNldCgnY29udGVudCcsIHsKICAgIGZpcnN0TmFtZTog J1RvbScsIGxhc3ROYW1lOiAnRGFsZScKICB9KTsgLy8gdHJpZ2dlcnMgcHJv cGVydHkgY2hhbmdlIGZvciBmdWxsTmFtZSBvbiBwcm94eQoKICBwcm94eS5n ZXQoJ2Z1bGxOYW1lJyk7ICAvLyAnVG9tIERhbGUnCiAgYGBgCgogIEBjbGFz cyBPYmplY3RQcm94eQogIEBuYW1lc3BhY2UgRW1iZXIKICBAZXh0ZW5kcyBF bWJlci5PYmplY3QKKi8KRW1iZXIuT2JqZWN0UHJveHkgPSBFbWJlci5PYmpl Y3QuZXh0ZW5kKHsKICAvKioKICAgIFRoZSBvYmplY3Qgd2hvc2UgcHJvcGVy dGllcyB3aWxsIGJlIGZvcndhcmRlZC4KCiAgICBAcHJvcGVydHkgY29udGVu dAogICAgQHR5cGUgRW1iZXIuT2JqZWN0CiAgICBAZGVmYXVsdCBudWxsCiAg Ki8KICBjb250ZW50OiBudWxsLAogIF9jb250ZW50RGlkQ2hhbmdlOiBFbWJl ci5vYnNlcnZlcignY29udGVudCcsIGZ1bmN0aW9uKCkgewogICAgRW1iZXIu YXNzZXJ0KCJDYW4ndCBzZXQgT2JqZWN0UHJveHkncyBjb250ZW50IHRvIGl0 c2VsZiIsIHRoaXMuZ2V0KCdjb250ZW50JykgIT09IHRoaXMpOwogIH0pLAoK ICBpc1RydXRoeTogRW1iZXIuY29tcHV0ZWQuYm9vbCgnY29udGVudCcpLAoK ICBfZGVidWdDb250YWluZXJLZXk6IG51bGwsCgogIHdpbGxXYXRjaFByb3Bl cnR5OiBmdW5jdGlvbiAoa2V5KSB7CiAgICB2YXIgY29udGVudEtleSA9ICdj b250ZW50LicgKyBrZXk7CiAgICBhZGRCZWZvcmVPYnNlcnZlcih0aGlzLCBj b250ZW50S2V5LCBudWxsLCBjb250ZW50UHJvcGVydHlXaWxsQ2hhbmdlKTsK ICAgIGFkZE9ic2VydmVyKHRoaXMsIGNvbnRlbnRLZXksIG51bGwsIGNvbnRl bnRQcm9wZXJ0eURpZENoYW5nZSk7CiAgfSwKCiAgZGlkVW53YXRjaFByb3Bl cnR5OiBmdW5jdGlvbiAoa2V5KSB7CiAgICB2YXIgY29udGVudEtleSA9ICdj b250ZW50LicgKyBrZXk7CiAgICByZW1vdmVCZWZvcmVPYnNlcnZlcih0aGlz LCBjb250ZW50S2V5LCBudWxsLCBjb250ZW50UHJvcGVydHlXaWxsQ2hhbmdl KTsKICAgIHJlbW92ZU9ic2VydmVyKHRoaXMsIGNvbnRlbnRLZXksIG51bGws IGNvbnRlbnRQcm9wZXJ0eURpZENoYW5nZSk7CiAgfSwKCiAgdW5rbm93blBy b3BlcnR5OiBmdW5jdGlvbiAoa2V5KSB7CiAgICB2YXIgY29udGVudCA9IGdl dCh0aGlzLCAnY29udGVudCcpOwogICAgaWYgKGNvbnRlbnQpIHsKICAgICAg cmV0dXJuIGdldChjb250ZW50LCBrZXkpOwogICAgfQogIH0sCgogIHNldFVu a25vd25Qcm9wZXJ0eTogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgIHZh ciBtID0gbWV0YSh0aGlzKTsKICAgIGlmIChtLnByb3RvID09PSB0aGlzKSB7 CiAgICAgIC8vIGlmIG1hcmtlZCBhcyBwcm90b3R5cGUgdGhlbiBqdXN0IGRl ZmluZVByb3BlcnR5CiAgICAgIC8vIHJhdGhlciB0aGFuIGRlbGVnYXRlCiAg ICAgIGRlZmluZVByb3BlcnR5KHRoaXMsIGtleSwgbnVsbCwgdmFsdWUpOwog ICAgICByZXR1cm4gdmFsdWU7CiAgICB9CgogICAgdmFyIGNvbnRlbnQgPSBn ZXQodGhpcywgJ2NvbnRlbnQnKTsKICAgIEVtYmVyLmFzc2VydChmbXQoIkNh bm5vdCBkZWxlZ2F0ZSBzZXQoJyVAJywgJUApIHRvIHRoZSAnY29udGVudCcg cHJvcGVydHkgb2Ygb2JqZWN0IHByb3h5ICVAOiBpdHMgJ2NvbnRlbnQnIGlz IHVuZGVmaW5lZC4iLCBba2V5LCB2YWx1ZSwgdGhpc10pLCBjb250ZW50KTsK ICAgIHJldHVybiBzZXQoY29udGVudCwga2V5LCB2YWx1ZSk7CiAgfQoKfSk7 Cgp9KSgpOwoKCgooZnVuY3Rpb24oKSB7Ci8qKgpAbW9kdWxlIGVtYmVyCkBz dWJtb2R1bGUgZW1iZXItcnVudGltZQoqLwoKLy8gLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgov LyBIRUxQRVJTCi8vCgp2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJl ci5zZXQ7CnZhciBhX3NsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlOwp2 YXIgYV9pbmRleE9mID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmluZGV4T2Y7 Cgp2YXIgY29udGV4dHMgPSBbXTsKCmZ1bmN0aW9uIHBvcEN0eCgpIHsKICBy ZXR1cm4gY29udGV4dHMubGVuZ3RoPT09MCA/IHt9IDogY29udGV4dHMucG9w KCk7Cn0KCmZ1bmN0aW9uIHB1c2hDdHgoY3R4KSB7CiAgY29udGV4dHMucHVz aChjdHgpOwogIHJldHVybiBudWxsOwp9CgpmdW5jdGlvbiBpdGVyKGtleSwg dmFsdWUpIHsKICB2YXIgdmFsdWVQcm92aWRlZCA9IGFyZ3VtZW50cy5sZW5n dGggPT09IDI7CgogIGZ1bmN0aW9uIGkoaXRlbSkgewogICAgdmFyIGN1ciA9 IGdldChpdGVtLCBrZXkpOwogICAgcmV0dXJuIHZhbHVlUHJvdmlkZWQgPyB2 YWx1ZT09PWN1ciA6ICEhY3VyOwogIH0KICByZXR1cm4gaSA7Cn0KCi8qKgog IFRoaXMgbWl4aW4gZGVmaW5lcyB0aGUgY29tbW9uIGludGVyZmFjZSBpbXBs ZW1lbnRlZCBieSBlbnVtZXJhYmxlIG9iamVjdHMKICBpbiBFbWJlci4gTW9z dCBvZiB0aGVzZSBtZXRob2RzIGZvbGxvdyB0aGUgc3RhbmRhcmQgQXJyYXkg aXRlcmF0aW9uCiAgQVBJIGRlZmluZWQgdXAgdG8gSmF2YVNjcmlwdCAxLjgg KGV4Y2x1ZGluZyBsYW5ndWFnZS1zcGVjaWZpYyBmZWF0dXJlcyB0aGF0CiAg Y2Fubm90IGJlIGVtdWxhdGVkIGluIG9sZGVyIHZlcnNpb25zIG9mIEphdmFT Y3JpcHQpLgoKICBUaGlzIG1peGluIGlzIGFwcGxpZWQgYXV0b21hdGljYWxs eSB0byB0aGUgQXJyYXkgY2xhc3Mgb24gcGFnZSBsb2FkLCBzbyB5b3UKICBj YW4gdXNlIGFueSBvZiB0aGVzZSBtZXRob2RzIG9uIHNpbXBsZSBhcnJheXMu IElmIEFycmF5IGFscmVhZHkgaW1wbGVtZW50cwogIG9uZSBvZiB0aGVzZSBt ZXRob2RzLCB0aGUgbWl4aW4gd2lsbCBub3Qgb3ZlcnJpZGUgdGhlbS4KCiAg IyMgV3JpdGluZyBZb3VyIE93biBFbnVtZXJhYmxlCgogIFRvIG1ha2UgeW91 ciBvd24gY3VzdG9tIGNsYXNzIGVudW1lcmFibGUsIHlvdSBuZWVkIHR3byBp dGVtczoKCiAgMS4gWW91IG11c3QgaGF2ZSBhIGxlbmd0aCBwcm9wZXJ0eS4g VGhpcyBwcm9wZXJ0eSBzaG91bGQgY2hhbmdlIHdoZW5ldmVyCiAgICAgdGhl IG51bWJlciBvZiBpdGVtcyBpbiB5b3VyIGVudW1lcmFibGUgb2JqZWN0IGNo YW5nZXMuIElmIHlvdSB1c2UgdGhpcwogICAgIHdpdGggYW4gYEVtYmVyLk9i amVjdGAgc3ViY2xhc3MsIHlvdSBzaG91bGQgYmUgc3VyZSB0byBjaGFuZ2Ug dGhlIGxlbmd0aAogICAgIHByb3BlcnR5IHVzaW5nIGBzZXQoKS5gCgogIDIu IFlvdSBtdXN0IGltcGxlbWVudCBgbmV4dE9iamVjdCgpLmAgU2VlIGRvY3Vt ZW50YXRpb24uCgogIE9uY2UgeW91IGhhdmUgdGhlc2UgdHdvIG1ldGhvZHMg aW1wbGVtZW50ZWQsIGFwcGx5IHRoZSBgRW1iZXIuRW51bWVyYWJsZWAgbWl4 aW4KICB0byB5b3VyIGNsYXNzIGFuZCB5b3Ugd2lsbCBiZSBhYmxlIHRvIGVu dW1lcmF0ZSB0aGUgY29udGVudHMgb2YgeW91ciBvYmplY3QKICBsaWtlIGFu eSBvdGhlciBjb2xsZWN0aW9uLgoKICAjIyBVc2luZyBFbWJlciBFbnVtZXJh dGlvbiB3aXRoIE90aGVyIExpYnJhcmllcwoKICBNYW55IG90aGVyIGxpYnJh cmllcyBwcm92aWRlIHNvbWUga2luZCBvZiBpdGVyYXRvciBvciBlbnVtZXJh dGlvbiBsaWtlCiAgZmFjaWxpdHkuIFRoaXMgaXMgb2Z0ZW4gd2hlcmUgdGhl IG1vc3QgY29tbW9uIEFQSSBjb25mbGljdHMgb2NjdXIuCiAgRW1iZXIncyBB UEkgaXMgZGVzaWduZWQgdG8gYmUgYXMgZnJpZW5kbHkgYXMgcG9zc2libGUg d2l0aCBvdGhlcgogIGxpYnJhcmllcyBieSBpbXBsZW1lbnRpbmcgb25seSBt ZXRob2RzIHRoYXQgbW9zdGx5IGNvcnJlc3BvbmQgdG8gdGhlCiAgSmF2YVNj cmlwdCAxLjggQVBJLgoKICBAY2xhc3MgRW51bWVyYWJsZQogIEBuYW1lc3Bh Y2UgRW1iZXIKICBAc2luY2UgRW1iZXIgMC45CiovCkVtYmVyLkVudW1lcmFi bGUgPSBFbWJlci5NaXhpbi5jcmVhdGUoewoKICAvKioKICAgIEltcGxlbWVu dCB0aGlzIG1ldGhvZCB0byBtYWtlIHlvdXIgY2xhc3MgZW51bWVyYWJsZS4K CiAgICBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGwgcmVwZWF0ZWRseSBkdXJp bmcgZW51bWVyYXRpb24uIFRoZSBpbmRleCB2YWx1ZQogICAgd2lsbCBhbHdh eXMgYmVnaW4gd2l0aCAwIGFuZCBpbmNyZW1lbnQgbW9ub3RvbmljYWxseS4g WW91IGRvbid0IGhhdmUgdG8KICAgIHJlbHkgb24gdGhlIGluZGV4IHZhbHVl IHRvIGRldGVybWluZSB3aGF0IG9iamVjdCB0byByZXR1cm4sIGJ1dCB5b3Ug c2hvdWxkCiAgICBhbHdheXMgY2hlY2sgdGhlIHZhbHVlIGFuZCBzdGFydCBm cm9tIHRoZSBiZWdpbm5pbmcgd2hlbiB5b3Ugc2VlIHRoZQogICAgcmVxdWVz dGVkIGluZGV4IGlzIDAuCgogICAgVGhlIGBwcmV2aW91c09iamVjdGAgaXMg dGhlIG9iamVjdCB0aGF0IHdhcyByZXR1cm5lZCBmcm9tIHRoZSBsYXN0IGNh bGwKICAgIHRvIGBuZXh0T2JqZWN0YCBmb3IgdGhlIGN1cnJlbnQgaXRlcmF0 aW9uLiBUaGlzIGlzIGEgdXNlZnVsIHdheSB0bwogICAgbWFuYWdlIGl0ZXJh dGlvbiBpZiB5b3UgYXJlIHRyYWNpbmcgYSBsaW5rZWQgbGlzdCwgZm9yIGV4 YW1wbGUuCgogICAgRmluYWxseSB0aGUgY29udGV4dCBwYXJhbWV0ZXIgd2ls bCBhbHdheXMgY29udGFpbiBhIGhhc2ggeW91IGNhbiB1c2UgYXMKICAgIGEg InNjcmF0Y2hwYWQiIHRvIG1haW50YWluIGFueSBvdGhlciBzdGF0ZSB5b3Ug bmVlZCBpbiBvcmRlciB0byBpdGVyYXRlCiAgICBwcm9wZXJseS4gVGhlIGNv bnRleHQgb2JqZWN0IGlzIHJldXNlZCBhbmQgaXMgbm90IHJlc2V0IGJldHdl ZW4KICAgIGl0ZXJhdGlvbnMgc28gbWFrZSBzdXJlIHlvdSBzZXR1cCB0aGUg Y29udGV4dCB3aXRoIGEgZnJlc2ggc3RhdGUgd2hlbmV2ZXIKICAgIHRoZSBp bmRleCBwYXJhbWV0ZXIgaXMgMC4KCiAgICBHZW5lcmFsbHkgaXRlcmF0b3Jz IHdpbGwgY29udGludWUgdG8gY2FsbCBgbmV4dE9iamVjdGAgdW50aWwgdGhl IGluZGV4CiAgICByZWFjaGVzIHRoZSB5b3VyIGN1cnJlbnQgbGVuZ3RoLTEu IElmIHlvdSBydW4gb3V0IG9mIGRhdGEgYmVmb3JlIHRoaXMKICAgIHRpbWUg Zm9yIHNvbWUgcmVhc29uLCB5b3Ugc2hvdWxkIHNpbXBseSByZXR1cm4gdW5k ZWZpbmVkLgoKICAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRo aXMgbWV0aG9kIHNpbXBseSBsb29rcyB1cCB0aGUgaW5kZXguCiAgICBUaGlz IHdvcmtzIGdyZWF0IG9uIGFueSBBcnJheS1saWtlIG9iamVjdHMuCgogICAg QG1ldGhvZCBuZXh0T2JqZWN0CiAgICBAcGFyYW0ge051bWJlcn0gaW5kZXgg dGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIGl0ZXJhdGlvbgogICAgQHBhcmFt IHtPYmplY3R9IHByZXZpb3VzT2JqZWN0IHRoZSB2YWx1ZSByZXR1cm5lZCBi eSB0aGUgbGFzdCBjYWxsIHRvCiAgICAgIGBuZXh0T2JqZWN0YC4KICAgIEBw YXJhbSB7T2JqZWN0fSBjb250ZXh0IGEgY29udGV4dCBvYmplY3QgeW91IGNh biB1c2UgdG8gbWFpbnRhaW4gc3RhdGUuCiAgICBAcmV0dXJuIHtPYmplY3R9 IHRoZSBuZXh0IG9iamVjdCBpbiB0aGUgaXRlcmF0aW9uIG9yIHVuZGVmaW5l ZAogICovCiAgbmV4dE9iamVjdDogRW1iZXIucmVxdWlyZWQoRnVuY3Rpb24p LAoKICAvKioKICAgIEhlbHBlciBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3Qg b2JqZWN0IGZyb20gYSBjb2xsZWN0aW9uLiBUaGlzIGlzIHVzdWFsbHkKICAg IHVzZWQgYnkgYmluZGluZ3MgYW5kIG90aGVyIHBhcnRzIG9mIHRoZSBmcmFt ZXdvcmsgdG8gZXh0cmFjdCBhIHNpbmdsZQogICAgb2JqZWN0IGlmIHRoZSBl bnVtZXJhYmxlIGNvbnRhaW5zIG9ubHkgb25lIGl0ZW0uCgogICAgSWYgeW91 IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCB5b3Ugc2hvdWxkIGltcGxlbWVudCBp dCBzbyB0aGF0IGl0IHdpbGwKICAgIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUg dmFsdWUgZWFjaCB0aW1lIGl0IGlzIGNhbGxlZC4gSWYgeW91ciBlbnVtZXJh YmxlCiAgICBjb250YWlucyBvbmx5IG9uZSBvYmplY3QsIHRoaXMgbWV0aG9k IHNob3VsZCBhbHdheXMgcmV0dXJuIHRoYXQgb2JqZWN0LgogICAgSWYgeW91 ciBlbnVtZXJhYmxlIGlzIGVtcHR5LCB0aGlzIG1ldGhvZCBzaG91bGQgcmV0 dXJuIGB1bmRlZmluZWRgLgoKICAgIGBgYGphdmFzY3JpcHQKICAgIHZhciBh cnIgPSBbImEiLCAiYiIsICJjIl07CiAgICBhcnIuZ2V0KCdmaXJzdE9iamVj dCcpOyAgLy8gImEiCgogICAgdmFyIGFyciA9IFtdOwogICAgYXJyLmdldCgn Zmlyc3RPYmplY3QnKTsgIC8vIHVuZGVmaW5lZAogICAgYGBgCgogICAgQHBy b3BlcnR5IGZpcnN0T2JqZWN0CiAgICBAcmV0dXJuIHtPYmplY3R9IHRoZSBv YmplY3Qgb3IgdW5kZWZpbmVkCiAgKi8KICBmaXJzdE9iamVjdDogRW1iZXIu Y29tcHV0ZWQoZnVuY3Rpb24oKSB7CiAgICBpZiAoZ2V0KHRoaXMsICdsZW5n dGgnKT09PTApIHJldHVybiB1bmRlZmluZWQgOwoKICAgIC8vIGhhbmRsZSBn ZW5lcmljIGVudW1lcmFibGVzCiAgICB2YXIgY29udGV4dCA9IHBvcEN0eCgp LCByZXQ7CiAgICByZXQgPSB0aGlzLm5leHRPYmplY3QoMCwgbnVsbCwgY29u dGV4dCk7CiAgICBwdXNoQ3R4KGNvbnRleHQpOwogICAgcmV0dXJuIHJldCA7 CiAgfSkucHJvcGVydHkoJ1tdJyksCgogIC8qKgogICAgSGVscGVyIG1ldGhv ZCByZXR1cm5zIHRoZSBsYXN0IG9iamVjdCBmcm9tIGEgY29sbGVjdGlvbi4g SWYgeW91ciBlbnVtZXJhYmxlCiAgICBjb250YWlucyBvbmx5IG9uZSBvYmpl Y3QsIHRoaXMgbWV0aG9kIHNob3VsZCBhbHdheXMgcmV0dXJuIHRoYXQgb2Jq ZWN0LgogICAgSWYgeW91ciBlbnVtZXJhYmxlIGlzIGVtcHR5LCB0aGlzIG1l dGhvZCBzaG91bGQgcmV0dXJuIGB1bmRlZmluZWRgLgoKICAgIGBgYGphdmFz Y3JpcHQKICAgIHZhciBhcnIgPSBbImEiLCAiYiIsICJjIl07CiAgICBhcnIu Z2V0KCdsYXN0T2JqZWN0Jyk7ICAvLyAiYyIKCiAgICB2YXIgYXJyID0gW107 CiAgICBhcnIuZ2V0KCdsYXN0T2JqZWN0Jyk7ICAvLyB1bmRlZmluZWQKICAg IGBgYAoKICAgIEBwcm9wZXJ0eSBsYXN0T2JqZWN0CiAgICBAcmV0dXJuIHtP YmplY3R9IHRoZSBsYXN0IG9iamVjdCBvciB1bmRlZmluZWQKICAqLwogIGxh c3RPYmplY3Q6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewogICAgdmFy IGxlbiA9IGdldCh0aGlzLCAnbGVuZ3RoJyk7CiAgICBpZiAobGVuPT09MCkg cmV0dXJuIHVuZGVmaW5lZCA7CiAgICB2YXIgY29udGV4dCA9IHBvcEN0eCgp LCBpZHg9MCwgY3VyLCBsYXN0ID0gbnVsbDsKICAgIGRvIHsKICAgICAgbGFz dCA9IGN1cjsKICAgICAgY3VyID0gdGhpcy5uZXh0T2JqZWN0KGlkeCsrLCBs YXN0LCBjb250ZXh0KTsKICAgIH0gd2hpbGUgKGN1ciAhPT0gdW5kZWZpbmVk KTsKICAgIHB1c2hDdHgoY29udGV4dCk7CiAgICByZXR1cm4gbGFzdDsKICB9 KS5wcm9wZXJ0eSgnW10nKSwKCiAgLyoqCiAgICBSZXR1cm5zIGB0cnVlYCBp ZiB0aGUgcGFzc2VkIG9iamVjdCBjYW4gYmUgZm91bmQgaW4gdGhlIHJlY2Vp dmVyLiBUaGUKICAgIGRlZmF1bHQgdmVyc2lvbiB3aWxsIGl0ZXJhdGUgdGhy b3VnaCB0aGUgZW51bWVyYWJsZSB1bnRpbCB0aGUgb2JqZWN0CiAgICBpcyBm b3VuZC4gWW91IG1heSB3YW50IHRvIG92ZXJyaWRlIHRoaXMgd2l0aCBhIG1v cmUgZWZmaWNpZW50IHZlcnNpb24uCgogICAgYGBgamF2YXNjcmlwdAogICAg dmFyIGFyciA9IFsiYSIsICJiIiwgImMiXTsKICAgIGFyci5jb250YWlucygi YSIpOyAvLyB0cnVlCiAgICBhcnIuY29udGFpbnMoInoiKTsgLy8gZmFsc2UK ICAgIGBgYAoKICAgIEBtZXRob2QgY29udGFpbnMKICAgIEBwYXJhbSB7T2Jq ZWN0fSBvYmogVGhlIG9iamVjdCB0byBzZWFyY2ggZm9yLgogICAgQHJldHVy biB7Qm9vbGVhbn0gYHRydWVgIGlmIG9iamVjdCBpcyBmb3VuZCBpbiBlbnVt ZXJhYmxlLgogICovCiAgY29udGFpbnM6IGZ1bmN0aW9uKG9iaikgewogICAg cmV0dXJuIHRoaXMuZmluZChmdW5jdGlvbihpdGVtKSB7IHJldHVybiBpdGVt PT09b2JqOyB9KSAhPT0gdW5kZWZpbmVkOwogIH0sCgogIC8qKgogICAgSXRl cmF0ZXMgdGhyb3VnaCB0aGUgZW51bWVyYWJsZSwgY2FsbGluZyB0aGUgcGFz c2VkIGZ1bmN0aW9uIG9uIGVhY2gKICAgIGl0ZW0uIFRoaXMgbWV0aG9kIGNv cnJlc3BvbmRzIHRvIHRoZSBgZm9yRWFjaCgpYCBtZXRob2QgZGVmaW5lZCBp bgogICAgSmF2YVNjcmlwdCAxLjYuCgogICAgVGhlIGNhbGxiYWNrIG1ldGhv ZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25h dHVyZSAoYWxsCiAgICBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbCk6CgogICAg YGBgamF2YXNjcmlwdAogICAgZnVuY3Rpb24oaXRlbSwgaW5kZXgsIGVudW1l cmFibGUpOwogICAgYGBgCgogICAgLSBgaXRlbWAgaXMgdGhlIGN1cnJlbnQg aXRlbSBpbiB0aGUgaXRlcmF0aW9uLgogICAgLSBgaW5kZXhgIGlzIHRoZSBj dXJyZW50IGluZGV4IGluIHRoZSBpdGVyYXRpb24uCiAgICAtIGBlbnVtZXJh YmxlYCBpcyB0aGUgZW51bWVyYWJsZSBvYmplY3QgaXRzZWxmLgoKICAgIE5v dGUgdGhhdCBpbiBhZGRpdGlvbiB0byBhIGNhbGxiYWNrLCB5b3UgY2FuIGFs c28gcGFzcyBhbiBvcHRpb25hbCB0YXJnZXQKICAgIG9iamVjdCB0aGF0IHdp bGwgYmUgc2V0IGFzIGB0aGlzYCBvbiB0aGUgY29udGV4dC4gVGhpcyBpcyBh IGdvb2Qgd2F5CiAgICB0byBnaXZlIHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24g YWNjZXNzIHRvIHRoZSBjdXJyZW50IG9iamVjdC4KCiAgICBAbWV0aG9kIGZv ckVhY2gKICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxs YmFjayB0byBleGVjdXRlCiAgICBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0g VGhlIHRhcmdldCBvYmplY3QgdG8gdXNlCiAgICBAcmV0dXJuIHtPYmplY3R9 IHJlY2VpdmVyCiAgKi8KICBmb3JFYWNoOiBmdW5jdGlvbihjYWxsYmFjaywg dGFyZ2V0KSB7CiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAiZnVuY3Rp b24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCkgOwogICAgdmFyIGxlbiA9IGdl dCh0aGlzLCAnbGVuZ3RoJyksIGxhc3QgPSBudWxsLCBjb250ZXh0ID0gcG9w Q3R4KCk7CgogICAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkKSB0YXJnZXQg PSBudWxsOwoKICAgIGZvcih2YXIgaWR4PTA7aWR4PGxlbjtpZHgrKykgewog ICAgICB2YXIgbmV4dCA9IHRoaXMubmV4dE9iamVjdChpZHgsIGxhc3QsIGNv bnRleHQpIDsKICAgICAgY2FsbGJhY2suY2FsbCh0YXJnZXQsIG5leHQsIGlk eCwgdGhpcyk7CiAgICAgIGxhc3QgPSBuZXh0IDsKICAgIH0KICAgIGxhc3Qg PSBudWxsIDsKICAgIGNvbnRleHQgPSBwdXNoQ3R4KGNvbnRleHQpOwogICAg cmV0dXJuIHRoaXMgOwogIH0sCgogIC8qKgogICAgQWxpYXMgZm9yIGBtYXBC eWAKCiAgICBAbWV0aG9kIGdldEVhY2gKICAgIEBwYXJhbSB7U3RyaW5nfSBr ZXkgbmFtZSBvZiB0aGUgcHJvcGVydHkKICAgIEByZXR1cm4ge0FycmF5fSBU aGUgbWFwcGVkIGFycmF5LgogICovCiAgZ2V0RWFjaDogZnVuY3Rpb24oa2V5 KSB7CiAgICByZXR1cm4gdGhpcy5tYXBCeShrZXkpOwogIH0sCgogIC8qKgog ICAgU2V0cyB0aGUgdmFsdWUgb24gdGhlIG5hbWVkIHByb3BlcnR5IGZvciBl YWNoIG1lbWJlci4gVGhpcyBpcyBtb3JlCiAgICBlZmZpY2llbnQgdGhhbiB1 c2luZyBvdGhlciBtZXRob2RzIGRlZmluZWQgb24gdGhpcyBoZWxwZXIuIElm IHRoZSBvYmplY3QKICAgIGltcGxlbWVudHMgRW1iZXIuT2JzZXJ2YWJsZSwg dGhlIHZhbHVlIHdpbGwgYmUgY2hhbmdlZCB0byBgc2V0KCksYCBvdGhlcndp c2UKICAgIGl0IHdpbGwgYmUgc2V0IGRpcmVjdGx5LiBgbnVsbGAgb2JqZWN0 cyBhcmUgc2tpcHBlZC4KCiAgICBAbWV0aG9kIHNldEVhY2gKICAgIEBwYXJh bSB7U3RyaW5nfSBrZXkgVGhlIGtleSB0byBzZXQKICAgIEBwYXJhbSB7T2Jq ZWN0fSB2YWx1ZSBUaGUgb2JqZWN0IHRvIHNldAogICAgQHJldHVybiB7T2Jq ZWN0fSByZWNlaXZlcgogICovCiAgc2V0RWFjaDogZnVuY3Rpb24oa2V5LCB2 YWx1ZSkgewogICAgcmV0dXJuIHRoaXMuZm9yRWFjaChmdW5jdGlvbihpdGVt KSB7CiAgICAgIHNldChpdGVtLCBrZXksIHZhbHVlKTsKICAgIH0pOwogIH0s CgogIC8qKgogICAgTWFwcyBhbGwgb2YgdGhlIGl0ZW1zIGluIHRoZSBlbnVt ZXJhdGlvbiB0byBhbm90aGVyIHZhbHVlLCByZXR1cm5pbmcKICAgIGEgbmV3 IGFycmF5LiBUaGlzIG1ldGhvZCBjb3JyZXNwb25kcyB0byBgbWFwKClgIGRl ZmluZWQgaW4gSmF2YVNjcmlwdCAxLjYuCgogICAgVGhlIGNhbGxiYWNrIG1l dGhvZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNp Z25hdHVyZSAoYWxsCiAgICBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbCk6Cgog ICAgYGBgamF2YXNjcmlwdAogICAgZnVuY3Rpb24oaXRlbSwgaW5kZXgsIGVu dW1lcmFibGUpOwogICAgYGBgCgogICAgLSBgaXRlbWAgaXMgdGhlIGN1cnJl bnQgaXRlbSBpbiB0aGUgaXRlcmF0aW9uLgogICAgLSBgaW5kZXhgIGlzIHRo ZSBjdXJyZW50IGluZGV4IGluIHRoZSBpdGVyYXRpb24uCiAgICAtIGBlbnVt ZXJhYmxlYCBpcyB0aGUgZW51bWVyYWJsZSBvYmplY3QgaXRzZWxmLgoKICAg IEl0IHNob3VsZCByZXR1cm4gdGhlIG1hcHBlZCB2YWx1ZS4KCiAgICBOb3Rl IHRoYXQgaW4gYWRkaXRpb24gdG8gYSBjYWxsYmFjaywgeW91IGNhbiBhbHNv IHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0CiAgICBvYmplY3QgdGhhdCB3aWxs IGJlIHNldCBhcyBgdGhpc2Agb24gdGhlIGNvbnRleHQuIFRoaXMgaXMgYSBn b29kIHdheQogICAgdG8gZ2l2ZSB5b3VyIGl0ZXJhdG9yIGZ1bmN0aW9uIGFj Y2VzcyB0byB0aGUgY3VycmVudCBvYmplY3QuCgogICAgQG1ldGhvZCBtYXAK ICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0 byBleGVjdXRlCiAgICBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0gVGhlIHRh cmdldCBvYmplY3QgdG8gdXNlCiAgICBAcmV0dXJuIHtBcnJheX0gVGhlIG1h cHBlZCBhcnJheS4KICAqLwogIG1hcDogZnVuY3Rpb24oY2FsbGJhY2ssIHRh cmdldCkgewogICAgdmFyIHJldCA9IEVtYmVyLkEoKTsKICAgIHRoaXMuZm9y RWFjaChmdW5jdGlvbih4LCBpZHgsIGkpIHsKICAgICAgcmV0W2lkeF0gPSBj YWxsYmFjay5jYWxsKHRhcmdldCwgeCwgaWR4LGkpOwogICAgfSk7CiAgICBy ZXR1cm4gcmV0IDsKICB9LAoKICAvKioKICAgIFNpbWlsYXIgdG8gbWFwLCB0 aGlzIHNwZWNpYWxpemVkIGZ1bmN0aW9uIHJldHVybnMgdGhlIHZhbHVlIG9m IHRoZSBuYW1lZAogICAgcHJvcGVydHkgb24gYWxsIGl0ZW1zIGluIHRoZSBl bnVtZXJhdGlvbi4KCiAgICBAbWV0aG9kIG1hcEJ5CiAgICBAcGFyYW0ge1N0 cmluZ30ga2V5IG5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICBAcmV0dXJuIHtB cnJheX0gVGhlIG1hcHBlZCBhcnJheS4KICAqLwogIG1hcEJ5OiBmdW5jdGlv bihrZXkpIHsKICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbihuZXh0KSB7 CiAgICAgIHJldHVybiBnZXQobmV4dCwga2V5KTsKICAgIH0pOwogIH0sCgog IC8qKgogICAgU2ltaWxhciB0byBtYXAsIHRoaXMgc3BlY2lhbGl6ZWQgZnVu Y3Rpb24gcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIG5hbWVkCiAgICBwcm9w ZXJ0eSBvbiBhbGwgaXRlbXMgaW4gdGhlIGVudW1lcmF0aW9uLgoKICAgIEBt ZXRob2QgbWFwUHJvcGVydHkKICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgbmFt ZSBvZiB0aGUgcHJvcGVydHkKICAgIEByZXR1cm4ge0FycmF5fSBUaGUgbWFw cGVkIGFycmF5LgogICAgQGRlcHJlY2F0ZWQgVXNlIGBtYXBCeWAgaW5zdGVh ZAogICovCgogIG1hcFByb3BlcnR5OiBFbWJlci5hbGlhc01ldGhvZCgnbWFw QnknKSwKCiAgLyoqCiAgICBSZXR1cm5zIGFuIGFycmF5IHdpdGggYWxsIG9m IHRoZSBpdGVtcyBpbiB0aGUgZW51bWVyYXRpb24gdGhhdCB0aGUgcGFzc2Vk CiAgICBmdW5jdGlvbiByZXR1cm5zIHRydWUgZm9yLiBUaGlzIG1ldGhvZCBj b3JyZXNwb25kcyB0byBgZmlsdGVyKClgIGRlZmluZWQgaW4KICAgIEphdmFT Y3JpcHQgMS42LgoKICAgIFRoZSBjYWxsYmFjayBtZXRob2QgeW91IHByb3Zp ZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmUgKGFsbAog ICAgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwpOgoKICAgIGBgYGphdmFzY3Jp cHQKICAgIGZ1bmN0aW9uKGl0ZW0sIGluZGV4LCBlbnVtZXJhYmxlKTsKICAg IGBgYAoKICAgIC0gYGl0ZW1gIGlzIHRoZSBjdXJyZW50IGl0ZW0gaW4gdGhl IGl0ZXJhdGlvbi4KICAgIC0gYGluZGV4YCBpcyB0aGUgY3VycmVudCBpbmRl eCBpbiB0aGUgaXRlcmF0aW9uLgogICAgLSBgZW51bWVyYWJsZWAgaXMgdGhl IGVudW1lcmFibGUgb2JqZWN0IGl0c2VsZi4KCiAgICBJdCBzaG91bGQgcmV0 dXJuIHRoZSBgdHJ1ZWAgdG8gaW5jbHVkZSB0aGUgaXRlbSBpbiB0aGUgcmVz dWx0cywgYGZhbHNlYAogICAgb3RoZXJ3aXNlLgoKICAgIE5vdGUgdGhhdCBp biBhZGRpdGlvbiB0byBhIGNhbGxiYWNrLCB5b3UgY2FuIGFsc28gcGFzcyBh biBvcHRpb25hbCB0YXJnZXQKICAgIG9iamVjdCB0aGF0IHdpbGwgYmUgc2V0 IGFzIGB0aGlzYCBvbiB0aGUgY29udGV4dC4gVGhpcyBpcyBhIGdvb2Qgd2F5 CiAgICB0byBnaXZlIHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24gYWNjZXNzIHRv IHRoZSBjdXJyZW50IG9iamVjdC4KCiAgICBAbWV0aG9kIGZpbHRlcgogICAg QHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGV4 ZWN1dGUKICAgIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSBUaGUgdGFyZ2V0 IG9iamVjdCB0byB1c2UKICAgIEByZXR1cm4ge0FycmF5fSBBIGZpbHRlcmVk IGFycmF5LgogICovCiAgZmlsdGVyOiBmdW5jdGlvbihjYWxsYmFjaywgdGFy Z2V0KSB7CiAgICB2YXIgcmV0ID0gRW1iZXIuQSgpOwogICAgdGhpcy5mb3JF YWNoKGZ1bmN0aW9uKHgsIGlkeCwgaSkgewogICAgICBpZiAoY2FsbGJhY2su Y2FsbCh0YXJnZXQsIHgsIGlkeCwgaSkpIHJldC5wdXNoKHgpOwogICAgfSk7 CiAgICByZXR1cm4gcmV0IDsKICB9LAoKICAvKioKICAgIFJldHVybnMgYW4g YXJyYXkgd2l0aCBhbGwgb2YgdGhlIGl0ZW1zIGluIHRoZSBlbnVtZXJhdGlv biB3aGVyZSB0aGUgcGFzc2VkCiAgICBmdW5jdGlvbiByZXR1cm5zIGZhbHNl IGZvci4gVGhpcyBtZXRob2QgaXMgdGhlIGludmVyc2Ugb2YgZmlsdGVyKCku CgogICAgVGhlIGNhbGxiYWNrIG1ldGhvZCB5b3UgcHJvdmlkZSBzaG91bGQg aGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZSAoYWxsCiAgICBwYXJhbWV0 ZXJzIGFyZSBvcHRpb25hbCk6CgogICAgYGBgamF2YXNjcmlwdAogICAgZnVu Y3Rpb24oaXRlbSwgaW5kZXgsIGVudW1lcmFibGUpOwogICAgYGBgCgogICAg LSAqaXRlbSogaXMgdGhlIGN1cnJlbnQgaXRlbSBpbiB0aGUgaXRlcmF0aW9u LgogICAgLSAqaW5kZXgqIGlzIHRoZSBjdXJyZW50IGluZGV4IGluIHRoZSBp dGVyYXRpb24KICAgIC0gKmVudW1lcmFibGUqIGlzIHRoZSBlbnVtZXJhYmxl IG9iamVjdCBpdHNlbGYuCgogICAgSXQgc2hvdWxkIHJldHVybiB0aGUgYSBm YWxzZXkgdmFsdWUgdG8gaW5jbHVkZSB0aGUgaXRlbSBpbiB0aGUgcmVzdWx0 cy4KCiAgICBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gYSBjYWxsYmFjaywg eW91IGNhbiBhbHNvIHBhc3MgYW4gb3B0aW9uYWwgdGFyZ2V0CiAgICBvYmpl Y3QgdGhhdCB3aWxsIGJlIHNldCBhcyAidGhpcyIgb24gdGhlIGNvbnRleHQu IFRoaXMgaXMgYSBnb29kIHdheQogICAgdG8gZ2l2ZSB5b3VyIGl0ZXJhdG9y IGZ1bmN0aW9uIGFjY2VzcyB0byB0aGUgY3VycmVudCBvYmplY3QuCgogICAg QG1ldGhvZCByZWplY3QKICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNr IFRoZSBjYWxsYmFjayB0byBleGVjdXRlCiAgICBAcGFyYW0ge09iamVjdH0g W3RhcmdldF0gVGhlIHRhcmdldCBvYmplY3QgdG8gdXNlCiAgICBAcmV0dXJu IHtBcnJheX0gQSByZWplY3RlZCBhcnJheS4KICAgKi8KICByZWplY3Q6IGZ1 bmN0aW9uKGNhbGxiYWNrLCB0YXJnZXQpIHsKICAgIHJldHVybiB0aGlzLmZp bHRlcihmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuICEoY2FsbGJhY2suYXBw bHkodGFyZ2V0LCBhcmd1bWVudHMpKTsKICAgIH0pOwogIH0sCgogIC8qKgog ICAgUmV0dXJucyBhbiBhcnJheSB3aXRoIGp1c3QgdGhlIGl0ZW1zIHdpdGgg dGhlIG1hdGNoZWQgcHJvcGVydHkuIFlvdQogICAgY2FuIHBhc3MgYW4gb3B0 aW9uYWwgc2Vjb25kIGFyZ3VtZW50IHdpdGggdGhlIHRhcmdldCB2YWx1ZS4g T3RoZXJ3aXNlCiAgICB0aGlzIHdpbGwgbWF0Y2ggYW55IHByb3BlcnR5IHRo YXQgZXZhbHVhdGVzIHRvIGB0cnVlYC4KCiAgICBAbWV0aG9kIGZpbHRlckJ5 CiAgICBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBwcm9wZXJ0eSB0byB0ZXN0 CiAgICBAcGFyYW0ge1N0cmluZ30gW3ZhbHVlXSBvcHRpb25hbCB2YWx1ZSB0 byB0ZXN0IGFnYWluc3QuCiAgICBAcmV0dXJuIHtBcnJheX0gZmlsdGVyZWQg YXJyYXkKICAqLwogIGZpbHRlckJ5OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7 CiAgICByZXR1cm4gdGhpcy5maWx0ZXIoaXRlci5hcHBseSh0aGlzLCBhcmd1 bWVudHMpKTsKICB9LAoKICAvKioKICAgIFJldHVybnMgYW4gYXJyYXkgd2l0 aCBqdXN0IHRoZSBpdGVtcyB3aXRoIHRoZSBtYXRjaGVkIHByb3BlcnR5LiBZ b3UKICAgIGNhbiBwYXNzIGFuIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCB3 aXRoIHRoZSB0YXJnZXQgdmFsdWUuIE90aGVyd2lzZQogICAgdGhpcyB3aWxs IG1hdGNoIGFueSBwcm9wZXJ0eSB0aGF0IGV2YWx1YXRlcyB0byBgdHJ1ZWAu CgogICAgQG1ldGhvZCBmaWx0ZXJQcm9wZXJ0eQogICAgQHBhcmFtIHtTdHJp bmd9IGtleSB0aGUgcHJvcGVydHkgdG8gdGVzdAogICAgQHBhcmFtIHtTdHJp bmd9IFt2YWx1ZV0gb3B0aW9uYWwgdmFsdWUgdG8gdGVzdCBhZ2FpbnN0Lgog ICAgQHJldHVybiB7QXJyYXl9IGZpbHRlcmVkIGFycmF5CiAgICBAZGVwcmVj YXRlZCBVc2UgYGZpbHRlckJ5YCBpbnN0ZWFkCiAgKi8KICBmaWx0ZXJQcm9w ZXJ0eTogRW1iZXIuYWxpYXNNZXRob2QoJ2ZpbHRlckJ5JyksCgogIC8qKgog ICAgUmV0dXJucyBhbiBhcnJheSB3aXRoIHRoZSBpdGVtcyB0aGF0IGRvIG5v dCBoYXZlIHRydXRoeSB2YWx1ZXMgZm9yCiAgICBrZXkuICBZb3UgY2FuIHBh c3MgYW4gb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IHdpdGggdGhlIHRhcmdl dCB2YWx1ZS4gIE90aGVyd2lzZQogICAgdGhpcyB3aWxsIG1hdGNoIGFueSBw cm9wZXJ0eSB0aGF0IGV2YWx1YXRlcyB0byBmYWxzZS4KCiAgICBAbWV0aG9k IHJlamVjdEJ5CiAgICBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBwcm9wZXJ0 eSB0byB0ZXN0CiAgICBAcGFyYW0ge1N0cmluZ30gW3ZhbHVlXSBvcHRpb25h bCB2YWx1ZSB0byB0ZXN0IGFnYWluc3QuCiAgICBAcmV0dXJuIHtBcnJheX0g cmVqZWN0ZWQgYXJyYXkKICAqLwogIHJlamVjdEJ5OiBmdW5jdGlvbihrZXks IHZhbHVlKSB7CiAgICB2YXIgZXhhY3RWYWx1ZSA9IGZ1bmN0aW9uKGl0ZW0p IHsgcmV0dXJuIGdldChpdGVtLCBrZXkpID09PSB2YWx1ZTsgfSwKICAgICAg ICBoYXNWYWx1ZSA9IGZ1bmN0aW9uKGl0ZW0pIHsgcmV0dXJuICEhZ2V0KGl0 ZW0sIGtleSk7IH0sCiAgICAgICAgdXNlID0gKGFyZ3VtZW50cy5sZW5ndGgg PT09IDIgPyBleGFjdFZhbHVlIDogaGFzVmFsdWUpOwoKICAgIHJldHVybiB0 aGlzLnJlamVjdCh1c2UpOwogIH0sCgogIC8qKgogICAgUmV0dXJucyBhbiBh cnJheSB3aXRoIHRoZSBpdGVtcyB0aGF0IGRvIG5vdCBoYXZlIHRydXRoeSB2 YWx1ZXMgZm9yCiAgICBrZXkuICBZb3UgY2FuIHBhc3MgYW4gb3B0aW9uYWwg c2Vjb25kIGFyZ3VtZW50IHdpdGggdGhlIHRhcmdldCB2YWx1ZS4gIE90aGVy d2lzZQogICAgdGhpcyB3aWxsIG1hdGNoIGFueSBwcm9wZXJ0eSB0aGF0IGV2 YWx1YXRlcyB0byBmYWxzZS4KCiAgICBAbWV0aG9kIHJlamVjdFByb3BlcnR5 CiAgICBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBwcm9wZXJ0eSB0byB0ZXN0 CiAgICBAcGFyYW0ge1N0cmluZ30gW3ZhbHVlXSBvcHRpb25hbCB2YWx1ZSB0 byB0ZXN0IGFnYWluc3QuCiAgICBAcmV0dXJuIHtBcnJheX0gcmVqZWN0ZWQg YXJyYXkKICAgIEBkZXByZWNhdGVkIFVzZSBgcmVqZWN0QnlgIGluc3RlYWQK ICAqLwogIHJlamVjdFByb3BlcnR5OiBFbWJlci5hbGlhc01ldGhvZCgncmVq ZWN0QnknKSwKCiAgLyoqCiAgICBSZXR1cm5zIHRoZSBmaXJzdCBpdGVtIGlu IHRoZSBhcnJheSBmb3Igd2hpY2ggdGhlIGNhbGxiYWNrIHJldHVybnMgdHJ1 ZS4KICAgIFRoaXMgbWV0aG9kIHdvcmtzIHNpbWlsYXIgdG8gdGhlIGBmaWx0 ZXIoKWAgbWV0aG9kIGRlZmluZWQgaW4gSmF2YVNjcmlwdCAxLjYKICAgIGV4 Y2VwdCB0aGF0IGl0IHdpbGwgc3RvcCB3b3JraW5nIG9uIHRoZSBhcnJheSBv bmNlIGEgbWF0Y2ggaXMgZm91bmQuCgogICAgVGhlIGNhbGxiYWNrIG1ldGhv ZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25h dHVyZSAoYWxsCiAgICBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbCk6CgogICAg YGBgamF2YXNjcmlwdAogICAgZnVuY3Rpb24oaXRlbSwgaW5kZXgsIGVudW1l cmFibGUpOwogICAgYGBgCgogICAgLSBgaXRlbWAgaXMgdGhlIGN1cnJlbnQg aXRlbSBpbiB0aGUgaXRlcmF0aW9uLgogICAgLSBgaW5kZXhgIGlzIHRoZSBj dXJyZW50IGluZGV4IGluIHRoZSBpdGVyYXRpb24uCiAgICAtIGBlbnVtZXJh YmxlYCBpcyB0aGUgZW51bWVyYWJsZSBvYmplY3QgaXRzZWxmLgoKICAgIEl0 IHNob3VsZCByZXR1cm4gdGhlIGB0cnVlYCB0byBpbmNsdWRlIHRoZSBpdGVt IGluIHRoZSByZXN1bHRzLCBgZmFsc2VgCiAgICBvdGhlcndpc2UuCgogICAg Tm90ZSB0aGF0IGluIGFkZGl0aW9uIHRvIGEgY2FsbGJhY2ssIHlvdSBjYW4g YWxzbyBwYXNzIGFuIG9wdGlvbmFsIHRhcmdldAogICAgb2JqZWN0IHRoYXQg d2lsbCBiZSBzZXQgYXMgYHRoaXNgIG9uIHRoZSBjb250ZXh0LiBUaGlzIGlz IGEgZ29vZCB3YXkKICAgIHRvIGdpdmUgeW91ciBpdGVyYXRvciBmdW5jdGlv biBhY2Nlc3MgdG8gdGhlIGN1cnJlbnQgb2JqZWN0LgoKICAgIEBtZXRob2Qg ZmluZAogICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGNhbGxi YWNrIHRvIGV4ZWN1dGUKICAgIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSBU aGUgdGFyZ2V0IG9iamVjdCB0byB1c2UKICAgIEByZXR1cm4ge09iamVjdH0g Rm91bmQgaXRlbSBvciBgdW5kZWZpbmVkYC4KICAqLwogIGZpbmQ6IGZ1bmN0 aW9uKGNhbGxiYWNrLCB0YXJnZXQpIHsKICAgIHZhciBsZW4gPSBnZXQodGhp cywgJ2xlbmd0aCcpIDsKICAgIGlmICh0YXJnZXQgPT09IHVuZGVmaW5lZCkg dGFyZ2V0ID0gbnVsbDsKCiAgICB2YXIgbGFzdCA9IG51bGwsIG5leHQsIGZv dW5kID0gZmFsc2UsIHJldCA7CiAgICB2YXIgY29udGV4dCA9IHBvcEN0eCgp OwogICAgZm9yKHZhciBpZHg9MDtpZHg8bGVuICYmICFmb3VuZDtpZHgrKykg ewogICAgICBuZXh0ID0gdGhpcy5uZXh0T2JqZWN0KGlkeCwgbGFzdCwgY29u dGV4dCkgOwogICAgICBpZiAoZm91bmQgPSBjYWxsYmFjay5jYWxsKHRhcmdl dCwgbmV4dCwgaWR4LCB0aGlzKSkgcmV0ID0gbmV4dCA7CiAgICAgIGxhc3Qg PSBuZXh0IDsKICAgIH0KICAgIG5leHQgPSBsYXN0ID0gbnVsbCA7CiAgICBj b250ZXh0ID0gcHVzaEN0eChjb250ZXh0KTsKICAgIHJldHVybiByZXQgOwog IH0sCgogIC8qKgogICAgUmV0dXJucyB0aGUgZmlyc3QgaXRlbSB3aXRoIGEg cHJvcGVydHkgbWF0Y2hpbmcgdGhlIHBhc3NlZCB2YWx1ZS4gWW91CiAgICBj YW4gcGFzcyBhbiBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgd2l0aCB0aGUg dGFyZ2V0IHZhbHVlLiBPdGhlcndpc2UKICAgIHRoaXMgd2lsbCBtYXRjaCBh bnkgcHJvcGVydHkgdGhhdCBldmFsdWF0ZXMgdG8gYHRydWVgLgoKICAgIFRo aXMgbWV0aG9kIHdvcmtzIG11Y2ggbGlrZSB0aGUgbW9yZSBnZW5lcmljIGBm aW5kKClgIG1ldGhvZC4KCiAgICBAbWV0aG9kIGZpbmRCeQogICAgQHBhcmFt IHtTdHJpbmd9IGtleSB0aGUgcHJvcGVydHkgdG8gdGVzdAogICAgQHBhcmFt IHtTdHJpbmd9IFt2YWx1ZV0gb3B0aW9uYWwgdmFsdWUgdG8gdGVzdCBhZ2Fp bnN0LgogICAgQHJldHVybiB7T2JqZWN0fSBmb3VuZCBpdGVtIG9yIGB1bmRl ZmluZWRgCiAgKi8KICBmaW5kQnk6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsK ICAgIHJldHVybiB0aGlzLmZpbmQoaXRlci5hcHBseSh0aGlzLCBhcmd1bWVu dHMpKTsKICB9LAoKICAvKioKICAgIFJldHVybnMgdGhlIGZpcnN0IGl0ZW0g d2l0aCBhIHByb3BlcnR5IG1hdGNoaW5nIHRoZSBwYXNzZWQgdmFsdWUuIFlv dQogICAgY2FuIHBhc3MgYW4gb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IHdp dGggdGhlIHRhcmdldCB2YWx1ZS4gT3RoZXJ3aXNlCiAgICB0aGlzIHdpbGwg bWF0Y2ggYW55IHByb3BlcnR5IHRoYXQgZXZhbHVhdGVzIHRvIGB0cnVlYC4K CiAgICBUaGlzIG1ldGhvZCB3b3JrcyBtdWNoIGxpa2UgdGhlIG1vcmUgZ2Vu ZXJpYyBgZmluZCgpYCBtZXRob2QuCgogICAgQG1ldGhvZCBmaW5kUHJvcGVy dHkKICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgdGhlIHByb3BlcnR5IHRvIHRl c3QKICAgIEBwYXJhbSB7U3RyaW5nfSBbdmFsdWVdIG9wdGlvbmFsIHZhbHVl IHRvIHRlc3QgYWdhaW5zdC4KICAgIEByZXR1cm4ge09iamVjdH0gZm91bmQg aXRlbSBvciBgdW5kZWZpbmVkYAogICAgQGRlcHJlY2F0ZWQgVXNlIGBmaW5k QnlgIGluc3RlYWQKICAqLwogIGZpbmRQcm9wZXJ0eTogRW1iZXIuYWxpYXNN ZXRob2QoJ2ZpbmRCeScpLAoKICAvKioKICAgIFJldHVybnMgYHRydWVgIGlm IHRoZSBwYXNzZWQgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGZvciBldmVyeSBp dGVtIGluIHRoZQogICAgZW51bWVyYXRpb24uIFRoaXMgY29ycmVzcG9uZHMg d2l0aCB0aGUgYGV2ZXJ5KClgIG1ldGhvZCBpbiBKYXZhU2NyaXB0IDEuNi4K CiAgICBUaGUgY2FsbGJhY2sgbWV0aG9kIHlvdSBwcm92aWRlIHNob3VsZCBo YXZlIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlIChhbGwKICAgIHBhcmFtZXRl cnMgYXJlIG9wdGlvbmFsKToKCiAgICBgYGBqYXZhc2NyaXB0CiAgICBmdW5j dGlvbihpdGVtLCBpbmRleCwgZW51bWVyYWJsZSk7CiAgICBgYGAKCiAgICAt IGBpdGVtYCBpcyB0aGUgY3VycmVudCBpdGVtIGluIHRoZSBpdGVyYXRpb24u CiAgICAtIGBpbmRleGAgaXMgdGhlIGN1cnJlbnQgaW5kZXggaW4gdGhlIGl0 ZXJhdGlvbi4KICAgIC0gYGVudW1lcmFibGVgIGlzIHRoZSBlbnVtZXJhYmxl IG9iamVjdCBpdHNlbGYuCgogICAgSXQgc2hvdWxkIHJldHVybiB0aGUgYHRy dWVgIG9yIGBmYWxzZWAuCgogICAgTm90ZSB0aGF0IGluIGFkZGl0aW9uIHRv IGEgY2FsbGJhY2ssIHlvdSBjYW4gYWxzbyBwYXNzIGFuIG9wdGlvbmFsIHRh cmdldAogICAgb2JqZWN0IHRoYXQgd2lsbCBiZSBzZXQgYXMgYHRoaXNgIG9u IHRoZSBjb250ZXh0LiBUaGlzIGlzIGEgZ29vZCB3YXkKICAgIHRvIGdpdmUg eW91ciBpdGVyYXRvciBmdW5jdGlvbiBhY2Nlc3MgdG8gdGhlIGN1cnJlbnQg b2JqZWN0LgoKICAgIEV4YW1wbGUgVXNhZ2U6CgogICAgYGBgamF2YXNjcmlw dAogICAgaWYgKHBlb3BsZS5ldmVyeShpc0VuZ2luZWVyKSkgeyBQYXljaGVj a3MuYWRkQmlnQm9udXMoKTsgfQogICAgYGBgCgogICAgQG1ldGhvZCBldmVy eQogICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGNhbGxiYWNr IHRvIGV4ZWN1dGUKICAgIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0XSBUaGUg dGFyZ2V0IG9iamVjdCB0byB1c2UKICAgIEByZXR1cm4ge0Jvb2xlYW59CiAg Ki8KICBldmVyeTogZnVuY3Rpb24oY2FsbGJhY2ssIHRhcmdldCkgewogICAg cmV0dXJuICF0aGlzLmZpbmQoZnVuY3Rpb24oeCwgaWR4LCBpKSB7CiAgICAg IHJldHVybiAhY2FsbGJhY2suY2FsbCh0YXJnZXQsIHgsIGlkeCwgaSk7CiAg ICB9KTsKICB9LAoKICAvKioKICAgIEBtZXRob2QgZXZlcnlCeQogICAgQHBh cmFtIHtTdHJpbmd9IGtleSB0aGUgcHJvcGVydHkgdG8gdGVzdAogICAgQHBh cmFtIHtTdHJpbmd9IFt2YWx1ZV0gb3B0aW9uYWwgdmFsdWUgdG8gdGVzdCBh Z2FpbnN0LgogICAgQGRlcHJlY2F0ZWQgVXNlIGBpc0V2ZXJ5YCBpbnN0ZWFk CiAgICBAcmV0dXJuIHtCb29sZWFufQogICovCiAgZXZlcnlCeTogRW1iZXIu YWxpYXNNZXRob2QoJ2lzRXZlcnknKSwKCiAgLyoqCiAgICBAbWV0aG9kIGV2 ZXJ5UHJvcGVydHkKICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgdGhlIHByb3Bl cnR5IHRvIHRlc3QKICAgIEBwYXJhbSB7U3RyaW5nfSBbdmFsdWVdIG9wdGlv bmFsIHZhbHVlIHRvIHRlc3QgYWdhaW5zdC4KICAgIEBkZXByZWNhdGVkIFVz ZSBgaXNFdmVyeWAgaW5zdGVhZAogICAgQHJldHVybiB7Qm9vbGVhbn0KICAq LwogIGV2ZXJ5UHJvcGVydHk6IEVtYmVyLmFsaWFzTWV0aG9kKCdpc0V2ZXJ5 JyksCgogIC8qKgogICAgUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhc3NlZCBw cm9wZXJ0eSByZXNvbHZlcyB0byBgdHJ1ZWAgZm9yIGFsbCBpdGVtcyBpbgog ICAgdGhlIGVudW1lcmFibGUuIFRoaXMgbWV0aG9kIGlzIG9mdGVuIHNpbXBs ZXIvZmFzdGVyIHRoYW4gdXNpbmcgYSBjYWxsYmFjay4KCiAgICBAbWV0aG9k IGlzRXZlcnkKICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgdGhlIHByb3BlcnR5 IHRvIHRlc3QKICAgIEBwYXJhbSB7U3RyaW5nfSBbdmFsdWVdIG9wdGlvbmFs IHZhbHVlIHRvIHRlc3QgYWdhaW5zdC4KICAgIEByZXR1cm4ge0Jvb2xlYW59 CiAgKi8KICBpc0V2ZXJ5OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7CiAgICBy ZXR1cm4gdGhpcy5ldmVyeShpdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykp OwogIH0sCgogIC8qKgogICAgUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhc3Nl ZCBmdW5jdGlvbiByZXR1cm5zIHRydWUgZm9yIGFueSBpdGVtIGluIHRoZQog ICAgZW51bWVyYXRpb24uIFRoaXMgY29ycmVzcG9uZHMgd2l0aCB0aGUgYHNv bWUoKWAgbWV0aG9kIGluIEphdmFTY3JpcHQgMS42LgoKICAgIFRoZSBjYWxs YmFjayBtZXRob2QgeW91IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxv d2luZyBzaWduYXR1cmUgKGFsbAogICAgcGFyYW1ldGVycyBhcmUgb3B0aW9u YWwpOgoKICAgIGBgYGphdmFzY3JpcHQKICAgIGZ1bmN0aW9uKGl0ZW0sIGlu ZGV4LCBlbnVtZXJhYmxlKTsKICAgIGBgYAoKICAgIC0gYGl0ZW1gIGlzIHRo ZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGl0ZXJhdGlvbi4KICAgIC0gYGluZGV4 YCBpcyB0aGUgY3VycmVudCBpbmRleCBpbiB0aGUgaXRlcmF0aW9uLgogICAg LSBgZW51bWVyYWJsZWAgaXMgdGhlIGVudW1lcmFibGUgb2JqZWN0IGl0c2Vs Zi4KCiAgICBJdCBzaG91bGQgcmV0dXJuIHRoZSBgdHJ1ZWAgdG8gaW5jbHVk ZSB0aGUgaXRlbSBpbiB0aGUgcmVzdWx0cywgYGZhbHNlYAogICAgb3RoZXJ3 aXNlLgoKICAgIE5vdGUgdGhhdCBpbiBhZGRpdGlvbiB0byBhIGNhbGxiYWNr LCB5b3UgY2FuIGFsc28gcGFzcyBhbiBvcHRpb25hbCB0YXJnZXQKICAgIG9i amVjdCB0aGF0IHdpbGwgYmUgc2V0IGFzIGB0aGlzYCBvbiB0aGUgY29udGV4 dC4gVGhpcyBpcyBhIGdvb2Qgd2F5CiAgICB0byBnaXZlIHlvdXIgaXRlcmF0 b3IgZnVuY3Rpb24gYWNjZXNzIHRvIHRoZSBjdXJyZW50IG9iamVjdC4KCiAg ICBVc2FnZSBFeGFtcGxlOgoKICAgIGBgYGphdmFzY3JpcHQKICAgIGlmIChw ZW9wbGUuYW55KGlzTWFuYWdlcikpIHsgUGF5Y2hlY2tzLmFkZEJpZ2dlckJv bnVzKCk7IH0KICAgIGBgYAoKICAgIEBtZXRob2QgYW55CiAgICBAcGFyYW0g e0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZQog ICAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIFRoZSB0YXJnZXQgb2JqZWN0 IHRvIHVzZQogICAgQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBw YXNzZWQgZnVuY3Rpb24gcmV0dXJucyBgdHJ1ZWAgZm9yIGFueSBpdGVtCiAg Ki8KICBhbnk6IGZ1bmN0aW9uKGNhbGxiYWNrLCB0YXJnZXQpIHsKICAgIHZh ciBsZW4gICAgID0gZ2V0KHRoaXMsICdsZW5ndGgnKSwKICAgICAgICBjb250 ZXh0ID0gcG9wQ3R4KCksCiAgICAgICAgZm91bmQgICA9IGZhbHNlLAogICAg ICAgIGxhc3QgICAgPSBudWxsLAogICAgICAgIG5leHQsIGlkeDsKCiAgICBp ZiAodGFyZ2V0ID09PSB1bmRlZmluZWQpIHsgdGFyZ2V0ID0gbnVsbDsgfQoK ICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgbGVuICYmICFmb3VuZDsgaWR4Kysp IHsKICAgICAgbmV4dCAgPSB0aGlzLm5leHRPYmplY3QoaWR4LCBsYXN0LCBj b250ZXh0KTsKICAgICAgZm91bmQgPSBjYWxsYmFjay5jYWxsKHRhcmdldCwg bmV4dCwgaWR4LCB0aGlzKTsKICAgICAgbGFzdCAgPSBuZXh0OwogICAgfQoK ICAgIG5leHQgPSBsYXN0ID0gbnVsbDsKICAgIGNvbnRleHQgPSBwdXNoQ3R4 KGNvbnRleHQpOwogICAgcmV0dXJuIGZvdW5kOwogIH0sCgogIC8qKgogICAg UmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhc3NlZCBmdW5jdGlvbiByZXR1cm5z IHRydWUgZm9yIGFueSBpdGVtIGluIHRoZQogICAgZW51bWVyYXRpb24uIFRo aXMgY29ycmVzcG9uZHMgd2l0aCB0aGUgYHNvbWUoKWAgbWV0aG9kIGluIEph dmFTY3JpcHQgMS42LgoKICAgIFRoZSBjYWxsYmFjayBtZXRob2QgeW91IHBy b3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmUgKGFs bAogICAgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwpOgoKICAgIGBgYGphdmFz Y3JpcHQKICAgIGZ1bmN0aW9uKGl0ZW0sIGluZGV4LCBlbnVtZXJhYmxlKTsK ICAgIGBgYAoKICAgIC0gYGl0ZW1gIGlzIHRoZSBjdXJyZW50IGl0ZW0gaW4g dGhlIGl0ZXJhdGlvbi4KICAgIC0gYGluZGV4YCBpcyB0aGUgY3VycmVudCBp bmRleCBpbiB0aGUgaXRlcmF0aW9uLgogICAgLSBgZW51bWVyYWJsZWAgaXMg dGhlIGVudW1lcmFibGUgb2JqZWN0IGl0c2VsZi4KCiAgICBJdCBzaG91bGQg cmV0dXJuIHRoZSBgdHJ1ZWAgdG8gaW5jbHVkZSB0aGUgaXRlbSBpbiB0aGUg cmVzdWx0cywgYGZhbHNlYAogICAgb3RoZXJ3aXNlLgoKICAgIE5vdGUgdGhh dCBpbiBhZGRpdGlvbiB0byBhIGNhbGxiYWNrLCB5b3UgY2FuIGFsc28gcGFz cyBhbiBvcHRpb25hbCB0YXJnZXQKICAgIG9iamVjdCB0aGF0IHdpbGwgYmUg c2V0IGFzIGB0aGlzYCBvbiB0aGUgY29udGV4dC4gVGhpcyBpcyBhIGdvb2Qg d2F5CiAgICB0byBnaXZlIHlvdXIgaXRlcmF0b3IgZnVuY3Rpb24gYWNjZXNz IHRvIHRoZSBjdXJyZW50IG9iamVjdC4KCiAgICBVc2FnZSBFeGFtcGxlOgoK ICAgIGBgYGphdmFzY3JpcHQKICAgIGlmIChwZW9wbGUuc29tZShpc01hbmFn ZXIpKSB7IFBheWNoZWNrcy5hZGRCaWdnZXJCb251cygpOyB9CiAgICBgYGAK CiAgICBAbWV0aG9kIHNvbWUKICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxi YWNrIFRoZSBjYWxsYmFjayB0byBleGVjdXRlCiAgICBAcGFyYW0ge09iamVj dH0gW3RhcmdldF0gVGhlIHRhcmdldCBvYmplY3QgdG8gdXNlCiAgICBAcmV0 dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIHBhc3NlZCBmdW5jdGlvbiBy ZXR1cm5zIGB0cnVlYCBmb3IgYW55IGl0ZW0KICAgIEBkZXByZWNhdGVkIFVz ZSBgYW55YCBpbnN0ZWFkCiAgKi8KICBzb21lOiBFbWJlci5hbGlhc01ldGhv ZCgnYW55JyksCgogIC8qKgogICAgUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBh c3NlZCBwcm9wZXJ0eSByZXNvbHZlcyB0byBgdHJ1ZWAgZm9yIGFueSBpdGVt IGluCiAgICB0aGUgZW51bWVyYWJsZS4gVGhpcyBtZXRob2QgaXMgb2Z0ZW4g c2ltcGxlci9mYXN0ZXIgdGhhbiB1c2luZyBhIGNhbGxiYWNrLgoKICAgIEBt ZXRob2QgaXNBbnkKICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkgdGhlIHByb3Bl cnR5IHRvIHRlc3QKICAgIEBwYXJhbSB7U3RyaW5nfSBbdmFsdWVdIG9wdGlv bmFsIHZhbHVlIHRvIHRlc3QgYWdhaW5zdC4KICAgIEByZXR1cm4ge0Jvb2xl YW59IGB0cnVlYCBpZiB0aGUgcGFzc2VkIGZ1bmN0aW9uIHJldHVybnMgYHRy dWVgIGZvciBhbnkgaXRlbQogICovCiAgaXNBbnk6IGZ1bmN0aW9uKGtleSwg dmFsdWUpIHsKICAgIHJldHVybiB0aGlzLmFueShpdGVyLmFwcGx5KHRoaXMs IGFyZ3VtZW50cykpOwogIH0sCgogIC8qKgogICAgQG1ldGhvZCBhbnlCeQog ICAgQHBhcmFtIHtTdHJpbmd9IGtleSB0aGUgcHJvcGVydHkgdG8gdGVzdAog ICAgQHBhcmFtIHtTdHJpbmd9IFt2YWx1ZV0gb3B0aW9uYWwgdmFsdWUgdG8g dGVzdCBhZ2FpbnN0LgogICAgQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlm IHRoZSBwYXNzZWQgZnVuY3Rpb24gcmV0dXJucyBgdHJ1ZWAgZm9yIGFueSBp dGVtCiAgICBAZGVwcmVjYXRlZCBVc2UgYGlzQW55YCBpbnN0ZWFkCiAgKi8K ICBhbnlCeTogRW1iZXIuYWxpYXNNZXRob2QoJ2lzQW55JyksCgogIC8qKgog ICAgQG1ldGhvZCBzb21lUHJvcGVydHkKICAgIEBwYXJhbSB7U3RyaW5nfSBr ZXkgdGhlIHByb3BlcnR5IHRvIHRlc3QKICAgIEBwYXJhbSB7U3RyaW5nfSBb dmFsdWVdIG9wdGlvbmFsIHZhbHVlIHRvIHRlc3QgYWdhaW5zdC4KICAgIEBy ZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgcGFzc2VkIGZ1bmN0aW9u IHJldHVybnMgYHRydWVgIGZvciBhbnkgaXRlbQogICAgQGRlcHJlY2F0ZWQg VXNlIGBpc0FueWAgaW5zdGVhZAogICovCiAgc29tZVByb3BlcnR5OiBFbWJl ci5hbGlhc01ldGhvZCgnaXNBbnknKSwKCiAgLyoqCiAgICBUaGlzIHdpbGwg Y29tYmluZSB0aGUgdmFsdWVzIG9mIHRoZSBlbnVtZXJhdG9yIGludG8gYSBz aW5nbGUgdmFsdWUuIEl0CiAgICBpcyBhIHVzZWZ1bCB3YXkgdG8gY29sbGVj dCBhIHN1bW1hcnkgdmFsdWUgZnJvbSBhbiBlbnVtZXJhdGlvbi4gVGhpcwog ICAgY29ycmVzcG9uZHMgdG8gdGhlIGByZWR1Y2UoKWAgbWV0aG9kIGRlZmlu ZWQgaW4gSmF2YVNjcmlwdCAxLjguCgogICAgVGhlIGNhbGxiYWNrIG1ldGhv ZCB5b3UgcHJvdmlkZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25h dHVyZSAoYWxsCiAgICBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbCk6CgogICAg YGBgamF2YXNjcmlwdAogICAgZnVuY3Rpb24ocHJldmlvdXNWYWx1ZSwgaXRl bSwgaW5kZXgsIGVudW1lcmFibGUpOwogICAgYGBgCgogICAgLSBgcHJldmlv dXNWYWx1ZWAgaXMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBsYXN0IGNh bGwgdG8gdGhlIGl0ZXJhdG9yLgogICAgLSBgaXRlbWAgaXMgdGhlIGN1cnJl bnQgaXRlbSBpbiB0aGUgaXRlcmF0aW9uLgogICAgLSBgaW5kZXhgIGlzIHRo ZSBjdXJyZW50IGluZGV4IGluIHRoZSBpdGVyYXRpb24uCiAgICAtIGBlbnVt ZXJhYmxlYCBpcyB0aGUgZW51bWVyYWJsZSBvYmplY3QgaXRzZWxmLgoKICAg IFJldHVybiB0aGUgbmV3IGN1bXVsYXRpdmUgdmFsdWUuCgogICAgSW4gYWRk aXRpb24gdG8gdGhlIGNhbGxiYWNrIHlvdSBjYW4gYWxzbyBwYXNzIGFuIGBp bml0aWFsVmFsdWVgLiBBbiBlcnJvcgogICAgd2lsbCBiZSByYWlzZWQgaWYg eW91IGRvIG5vdCBwYXNzIGFuIGluaXRpYWwgdmFsdWUgYW5kIHRoZSBlbnVt ZXJhdG9yIGlzCiAgICBlbXB0eS4KCiAgICBOb3RlIHRoYXQgdW5saWtlIHRo ZSBvdGhlciBtZXRob2RzLCB0aGlzIG1ldGhvZCBkb2VzIG5vdCBhbGxvdyB5 b3UgdG8KICAgIHBhc3MgYSB0YXJnZXQgb2JqZWN0IHRvIHNldCBhcyB0aGlz IGZvciB0aGUgY2FsbGJhY2suIEl0J3MgcGFydCBvZiB0aGUKICAgIHNwZWMu IFNvcnJ5LgoKICAgIEBtZXRob2QgcmVkdWNlCiAgICBAcGFyYW0ge0Z1bmN0 aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZQogICAgQHBh cmFtIHtPYmplY3R9IGluaXRpYWxWYWx1ZSBJbml0aWFsIHZhbHVlIGZvciB0 aGUgcmVkdWNlCiAgICBAcGFyYW0ge1N0cmluZ30gcmVkdWNlclByb3BlcnR5 IGludGVybmFsIHVzZSBvbmx5LgogICAgQHJldHVybiB7T2JqZWN0fSBUaGUg cmVkdWNlZCB2YWx1ZS4KICAqLwogIHJlZHVjZTogZnVuY3Rpb24oY2FsbGJh Y2ssIGluaXRpYWxWYWx1ZSwgcmVkdWNlclByb3BlcnR5KSB7CiAgICBpZiAo dHlwZW9mIGNhbGxiYWNrICE9PSAiZnVuY3Rpb24iKSB7IHRocm93IG5ldyBU eXBlRXJyb3IoKTsgfQoKICAgIHZhciByZXQgPSBpbml0aWFsVmFsdWU7Cgog ICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0sIGkpIHsKICAgICAgcmV0 ID0gY2FsbGJhY2socmV0LCBpdGVtLCBpLCB0aGlzLCByZWR1Y2VyUHJvcGVy dHkpOwogICAgfSwgdGhpcyk7CgogICAgcmV0dXJuIHJldDsKICB9LAoKICAv KioKICAgIEludm9rZXMgdGhlIG5hbWVkIG1ldGhvZCBvbiBldmVyeSBvYmpl Y3QgaW4gdGhlIHJlY2VpdmVyIHRoYXQKICAgIGltcGxlbWVudHMgaXQuIFRo aXMgbWV0aG9kIGNvcnJlc3BvbmRzIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBp bgogICAgUHJvdG90eXBlIDEuNi4KCiAgICBAbWV0aG9kIGludm9rZQogICAg QHBhcmFtIHtTdHJpbmd9IG1ldGhvZE5hbWUgdGhlIG5hbWUgb2YgdGhlIG1l dGhvZAogICAgQHBhcmFtIHtPYmplY3QuLi59IGFyZ3Mgb3B0aW9uYWwgYXJn dW1lbnRzIHRvIHBhc3MgYXMgd2VsbC4KICAgIEByZXR1cm4ge0FycmF5fSBy ZXR1cm4gdmFsdWVzIGZyb20gY2FsbGluZyBpbnZva2UuCiAgKi8KICBpbnZv a2U6IGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHsKICAgIHZhciBhcmdzLCByZXQg PSBFbWJlci5BKCk7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aD4xKSBhcmdz ID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CgogICAgdGhpcy5mb3JF YWNoKGZ1bmN0aW9uKHgsIGlkeCkgewogICAgICB2YXIgbWV0aG9kID0geCAm JiB4W21ldGhvZE5hbWVdOwogICAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlw ZW9mIG1ldGhvZCkgewogICAgICAgIHJldFtpZHhdID0gYXJncyA/IG1ldGhv ZC5hcHBseSh4LCBhcmdzKSA6IHhbbWV0aG9kTmFtZV0oKTsKICAgICAgfQog ICAgfSwgdGhpcyk7CgogICAgcmV0dXJuIHJldDsKICB9LAoKICAvKioKICAg IFNpbXBseSBjb252ZXJ0cyB0aGUgZW51bWVyYWJsZSBpbnRvIGEgZ2VudWlu ZSBhcnJheS4gVGhlIG9yZGVyIGlzIG5vdAogICAgZ3VhcmFudGVlZC4gQ29y cmVzcG9uZHMgdG8gdGhlIG1ldGhvZCBpbXBsZW1lbnRlZCBieSBQcm90b3R5 cGUuCgogICAgQG1ldGhvZCB0b0FycmF5CiAgICBAcmV0dXJuIHtBcnJheX0g dGhlIGVudW1lcmFibGUgYXMgYW4gYXJyYXkuCiAgKi8KICB0b0FycmF5OiBm dW5jdGlvbigpIHsKICAgIHZhciByZXQgPSBFbWJlci5BKCk7CiAgICB0aGlz LmZvckVhY2goZnVuY3Rpb24obywgaWR4KSB7IHJldFtpZHhdID0gbzsgfSk7 CiAgICByZXR1cm4gcmV0IDsKICB9LAoKICAvKioKICAgIFJldHVybnMgYSBj b3B5IG9mIHRoZSBhcnJheSB3aXRoIGFsbCBudWxsIGFuZCB1bmRlZmluZWQg ZWxlbWVudHMgcmVtb3ZlZC4KCiAgICBgYGBqYXZhc2NyaXB0CiAgICB2YXIg YXJyID0gWyJhIiwgbnVsbCwgImMiLCB1bmRlZmluZWRdOwogICAgYXJyLmNv bXBhY3QoKTsgIC8vIFsiYSIsICJjIl0KICAgIGBgYAoKICAgIEBtZXRob2Qg Y29tcGFjdAogICAgQHJldHVybiB7QXJyYXl9IHRoZSBhcnJheSB3aXRob3V0 IG51bGwgYW5kIHVuZGVmaW5lZCBlbGVtZW50cy4KICAqLwogIGNvbXBhY3Q6 IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9u KHZhbHVlKSB7IHJldHVybiB2YWx1ZSAhPSBudWxsOyB9KTsKICB9LAoKICAv KioKICAgIFJldHVybnMgYSBuZXcgZW51bWVyYWJsZSB0aGF0IGV4Y2x1ZGVz IHRoZSBwYXNzZWQgdmFsdWUuIFRoZSBkZWZhdWx0CiAgICBpbXBsZW1lbnRh dGlvbiByZXR1cm5zIGFuIGFycmF5IHJlZ2FyZGxlc3Mgb2YgdGhlIHJlY2Vp dmVyIHR5cGUgdW5sZXNzCiAgICB0aGUgcmVjZWl2ZXIgZG9lcyBub3QgY29u dGFpbiB0aGUgdmFsdWUuCgogICAgYGBgamF2YXNjcmlwdAogICAgdmFyIGFy ciA9IFsiYSIsICJiIiwgImEiLCAiYyJdOwogICAgYXJyLndpdGhvdXQoImEi KTsgIC8vIFsiYiIsICJjIl0KICAgIGBgYAoKICAgIEBtZXRob2Qgd2l0aG91 dAogICAgQHBhcmFtIHtPYmplY3R9IHZhbHVlCiAgICBAcmV0dXJuIHtFbWJl ci5FbnVtZXJhYmxlfQogICovCiAgd2l0aG91dDogZnVuY3Rpb24odmFsdWUp IHsKICAgIGlmICghdGhpcy5jb250YWlucyh2YWx1ZSkpIHJldHVybiB0aGlz OyAvLyBub3RoaW5nIHRvIGRvCiAgICB2YXIgcmV0ID0gRW1iZXIuQSgpOwog ICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGspIHsKICAgICAgaWYgKGsgIT09 IHZhbHVlKSByZXRbcmV0Lmxlbmd0aF0gPSBrOwogICAgfSkgOwogICAgcmV0 dXJuIHJldCA7CiAgfSwKCiAgLyoqCiAgICBSZXR1cm5zIGEgbmV3IGVudW1l cmFibGUgdGhhdCBjb250YWlucyBvbmx5IHVuaXF1ZSB2YWx1ZXMuIFRoZSBk ZWZhdWx0CiAgICBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGFuIGFycmF5IHJl Z2FyZGxlc3Mgb2YgdGhlIHJlY2VpdmVyIHR5cGUuCgogICAgYGBgamF2YXNj cmlwdAogICAgdmFyIGFyciA9IFsiYSIsICJhIiwgImIiLCAiYiJdOwogICAg YXJyLnVuaXEoKTsgIC8vIFsiYSIsICJiIl0KICAgIGBgYAoKICAgIEBtZXRo b2QgdW5pcQogICAgQHJldHVybiB7RW1iZXIuRW51bWVyYWJsZX0KICAqLwog IHVuaXE6IGZ1bmN0aW9uKCkgewogICAgdmFyIHJldCA9IEVtYmVyLkEoKTsK ICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbihrKSB7CiAgICAgIGlmIChhX2lu ZGV4T2YocmV0LCBrKTwwKSByZXQucHVzaChrKTsKICAgIH0pOwogICAgcmV0 dXJuIHJldDsKICB9LAoKICAvKioKICAgIFRoaXMgcHJvcGVydHkgd2lsbCB0 cmlnZ2VyIGFueXRpbWUgdGhlIGVudW1lcmFibGUncyBjb250ZW50IGNoYW5n ZXMuCiAgICBZb3UgY2FuIG9ic2VydmUgdGhpcyBwcm9wZXJ0eSB0byBiZSBu b3RpZmllZCBvZiBjaGFuZ2VzIHRvIHRoZSBlbnVtZXJhYmxlcwogICAgY29u dGVudC4KCiAgICBGb3IgcGxhaW4gZW51bWVyYWJsZXMsIHRoaXMgcHJvcGVy dHkgaXMgcmVhZCBvbmx5LiBgRW1iZXIuQXJyYXlgIG92ZXJyaWRlcwogICAg dGhpcyBtZXRob2QuCgogICAgQHByb3BlcnR5IFtdCiAgICBAdHlwZSBFbWJl ci5BcnJheQogICAgQHJldHVybiB0aGlzCiAgKi8KICAnW10nOiBFbWJlci5j b21wdXRlZChmdW5jdGlvbihrZXksIHZhbHVlKSB7CiAgICByZXR1cm4gdGhp czsKICB9KSwKCiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgogIC8vIEVOVU1FUkFCTEUg T0JTRVJWRVJTCiAgLy8KCiAgLyoqCiAgICBSZWdpc3RlcnMgYW4gZW51bWVy YWJsZSBvYnNlcnZlci4gTXVzdCBpbXBsZW1lbnQgYEVtYmVyLkVudW1lcmFi bGVPYnNlcnZlcmAKICAgIG1peGluLgoKICAgIEBtZXRob2QgYWRkRW51bWVy YWJsZU9ic2VydmVyCiAgICBAcGFyYW0ge09iamVjdH0gdGFyZ2V0CiAgICBA cGFyYW0ge0hhc2h9IFtvcHRzXQogICAgQHJldHVybiB0aGlzCiAgKi8KICBh ZGRFbnVtZXJhYmxlT2JzZXJ2ZXI6IGZ1bmN0aW9uKHRhcmdldCwgb3B0cykg ewogICAgdmFyIHdpbGxDaGFuZ2UgPSAob3B0cyAmJiBvcHRzLndpbGxDaGFu Z2UpIHx8ICdlbnVtZXJhYmxlV2lsbENoYW5nZScsCiAgICAgICAgZGlkQ2hh bmdlICA9IChvcHRzICYmIG9wdHMuZGlkQ2hhbmdlKSB8fCAnZW51bWVyYWJs ZURpZENoYW5nZSc7CgogICAgdmFyIGhhc09ic2VydmVycyA9IGdldCh0aGlz LCAnaGFzRW51bWVyYWJsZU9ic2VydmVycycpOwogICAgaWYgKCFoYXNPYnNl cnZlcnMpIEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAnaGFzRW51 bWVyYWJsZU9ic2VydmVycycpOwogICAgRW1iZXIuYWRkTGlzdGVuZXIodGhp cywgJ0BlbnVtZXJhYmxlOmJlZm9yZScsIHRhcmdldCwgd2lsbENoYW5nZSk7 CiAgICBFbWJlci5hZGRMaXN0ZW5lcih0aGlzLCAnQGVudW1lcmFibGU6Y2hh bmdlJywgdGFyZ2V0LCBkaWRDaGFuZ2UpOwogICAgaWYgKCFoYXNPYnNlcnZl cnMpIEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsICdoYXNFbnVtZXJh YmxlT2JzZXJ2ZXJzJyk7CiAgICByZXR1cm4gdGhpczsKICB9LAoKICAvKioK ICAgIFJlbW92ZXMgYSByZWdpc3RlcmVkIGVudW1lcmFibGUgb2JzZXJ2ZXIu CgogICAgQG1ldGhvZCByZW1vdmVFbnVtZXJhYmxlT2JzZXJ2ZXIKICAgIEBw YXJhbSB7T2JqZWN0fSB0YXJnZXQKICAgIEBwYXJhbSB7SGFzaH0gW29wdHNd CiAgICBAcmV0dXJuIHRoaXMKICAqLwogIHJlbW92ZUVudW1lcmFibGVPYnNl cnZlcjogZnVuY3Rpb24odGFyZ2V0LCBvcHRzKSB7CiAgICB2YXIgd2lsbENo YW5nZSA9IChvcHRzICYmIG9wdHMud2lsbENoYW5nZSkgfHwgJ2VudW1lcmFi bGVXaWxsQ2hhbmdlJywKICAgICAgICBkaWRDaGFuZ2UgID0gKG9wdHMgJiYg b3B0cy5kaWRDaGFuZ2UpIHx8ICdlbnVtZXJhYmxlRGlkQ2hhbmdlJzsKCiAg ICB2YXIgaGFzT2JzZXJ2ZXJzID0gZ2V0KHRoaXMsICdoYXNFbnVtZXJhYmxl T2JzZXJ2ZXJzJyk7CiAgICBpZiAoaGFzT2JzZXJ2ZXJzKSBFbWJlci5wcm9w ZXJ0eVdpbGxDaGFuZ2UodGhpcywgJ2hhc0VudW1lcmFibGVPYnNlcnZlcnMn KTsKICAgIEVtYmVyLnJlbW92ZUxpc3RlbmVyKHRoaXMsICdAZW51bWVyYWJs ZTpiZWZvcmUnLCB0YXJnZXQsIHdpbGxDaGFuZ2UpOwogICAgRW1iZXIucmVt b3ZlTGlzdGVuZXIodGhpcywgJ0BlbnVtZXJhYmxlOmNoYW5nZScsIHRhcmdl dCwgZGlkQ2hhbmdlKTsKICAgIGlmIChoYXNPYnNlcnZlcnMpIEVtYmVyLnBy b3BlcnR5RGlkQ2hhbmdlKHRoaXMsICdoYXNFbnVtZXJhYmxlT2JzZXJ2ZXJz Jyk7CiAgICByZXR1cm4gdGhpczsKICB9LAoKICAvKioKICAgIEJlY29tZXMg dHJ1ZSB3aGVuZXZlciB0aGUgYXJyYXkgY3VycmVudGx5IGhhcyBvYnNlcnZl cnMgd2F0Y2hpbmcgY2hhbmdlcwogICAgb24gdGhlIGFycmF5LgoKICAgIEBw cm9wZXJ0eSBoYXNFbnVtZXJhYmxlT2JzZXJ2ZXJzCiAgICBAdHlwZSBCb29s ZWFuCiAgKi8KICBoYXNFbnVtZXJhYmxlT2JzZXJ2ZXJzOiBFbWJlci5jb21w dXRlZChmdW5jdGlvbigpIHsKICAgIHJldHVybiBFbWJlci5oYXNMaXN0ZW5l cnModGhpcywgJ0BlbnVtZXJhYmxlOmNoYW5nZScpIHx8IEVtYmVyLmhhc0xp c3RlbmVycyh0aGlzLCAnQGVudW1lcmFibGU6YmVmb3JlJyk7CiAgfSksCgoK ICAvKioKICAgIEludm9rZSB0aGlzIG1ldGhvZCBqdXN0IGJlZm9yZSB0aGUg Y29udGVudHMgb2YgeW91ciBlbnVtZXJhYmxlIHdpbGwKICAgIGNoYW5nZS4g WW91IGNhbiBlaXRoZXIgb21pdCB0aGUgcGFyYW1ldGVycyBjb21wbGV0ZWx5 IG9yIHBhc3MgdGhlIG9iamVjdHMKICAgIHRvIGJlIHJlbW92ZWQgb3IgYWRk ZWQgaWYgYXZhaWxhYmxlIG9yIGp1c3QgYSBjb3VudC4KCiAgICBAbWV0aG9k IGVudW1lcmFibGVDb250ZW50V2lsbENoYW5nZQogICAgQHBhcmFtIHtFbWJl ci5FbnVtZXJhYmxlfE51bWJlcn0gcmVtb3ZpbmcgQW4gZW51bWVyYWJsZSBv ZiB0aGUgb2JqZWN0cyB0bwogICAgICBiZSByZW1vdmVkIG9yIHRoZSBudW1i ZXIgb2YgaXRlbXMgdG8gYmUgcmVtb3ZlZC4KICAgIEBwYXJhbSB7RW1iZXIu RW51bWVyYWJsZXxOdW1iZXJ9IGFkZGluZyBBbiBlbnVtZXJhYmxlIG9mIHRo ZSBvYmplY3RzIHRvIGJlCiAgICAgIGFkZGVkIG9yIHRoZSBudW1iZXIgb2Yg aXRlbXMgdG8gYmUgYWRkZWQuCiAgICBAY2hhaW5hYmxlCiAgKi8KICBlbnVt ZXJhYmxlQ29udGVudFdpbGxDaGFuZ2U6IGZ1bmN0aW9uKHJlbW92aW5nLCBh ZGRpbmcpIHsKCiAgICB2YXIgcmVtb3ZlQ250LCBhZGRDbnQsIGhhc0RlbHRh OwoKICAgIGlmICgnbnVtYmVyJyA9PT0gdHlwZW9mIHJlbW92aW5nKSByZW1v dmVDbnQgPSByZW1vdmluZzsKICAgIGVsc2UgaWYgKHJlbW92aW5nKSByZW1v dmVDbnQgPSBnZXQocmVtb3ZpbmcsICdsZW5ndGgnKTsKICAgIGVsc2UgcmVt b3ZlQ250ID0gcmVtb3ZpbmcgPSAtMTsKCiAgICBpZiAoJ251bWJlcicgPT09 IHR5cGVvZiBhZGRpbmcpIGFkZENudCA9IGFkZGluZzsKICAgIGVsc2UgaWYg KGFkZGluZykgYWRkQ250ID0gZ2V0KGFkZGluZywnbGVuZ3RoJyk7CiAgICBl bHNlIGFkZENudCA9IGFkZGluZyA9IC0xOwoKICAgIGhhc0RlbHRhID0gYWRk Q250PDAgfHwgcmVtb3ZlQ250PDAgfHwgYWRkQ250LXJlbW92ZUNudCE9PTA7 CgogICAgaWYgKHJlbW92aW5nID09PSAtMSkgcmVtb3ZpbmcgPSBudWxsOwog ICAgaWYgKGFkZGluZyAgID09PSAtMSkgYWRkaW5nICAgPSBudWxsOwoKICAg IEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAnW10nKTsKICAgIGlm IChoYXNEZWx0YSkgRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsICds ZW5ndGgnKTsKICAgIEVtYmVyLnNlbmRFdmVudCh0aGlzLCAnQGVudW1lcmFi bGU6YmVmb3JlJywgW3RoaXMsIHJlbW92aW5nLCBhZGRpbmddKTsKCiAgICBy ZXR1cm4gdGhpczsKICB9LAoKICAvKioKICAgIEludm9rZSB0aGlzIG1ldGhv ZCB3aGVuIHRoZSBjb250ZW50cyBvZiB5b3VyIGVudW1lcmFibGUgaGFzIGNo YW5nZWQuCiAgICBUaGlzIHdpbGwgbm90aWZ5IGFueSBvYnNlcnZlcnMgd2F0 Y2hpbmcgZm9yIGNvbnRlbnQgY2hhbmdlcy4gSWYgeW91ciBhcmUKICAgIGlt cGxlbWVudGluZyBhbiBvcmRlcmVkIGVudW1lcmFibGUgKHN1Y2ggYXMgYW4g YXJyYXkpLCBhbHNvIHBhc3MgdGhlCiAgICBzdGFydCBhbmQgZW5kIHZhbHVl cyB3aGVyZSB0aGUgY29udGVudCBjaGFuZ2VkIHNvIHRoYXQgaXQgY2FuIGJl IHVzZWQgdG8KICAgIG5vdGlmeSByYW5nZSBvYnNlcnZlcnMuCgogICAgQG1l dGhvZCBlbnVtZXJhYmxlQ29udGVudERpZENoYW5nZQogICAgQHBhcmFtIHtF bWJlci5FbnVtZXJhYmxlfE51bWJlcn0gcmVtb3ZpbmcgQW4gZW51bWVyYWJs ZSBvZiB0aGUgb2JqZWN0cyB0bwogICAgICBiZSByZW1vdmVkIG9yIHRoZSBu dW1iZXIgb2YgaXRlbXMgdG8gYmUgcmVtb3ZlZC4KICAgIEBwYXJhbSB7RW1i ZXIuRW51bWVyYWJsZXxOdW1iZXJ9IGFkZGluZyAgQW4gZW51bWVyYWJsZSBv ZiB0aGUgb2JqZWN0cyB0bwogICAgICBiZSBhZGRlZCBvciB0aGUgbnVtYmVy IG9mIGl0ZW1zIHRvIGJlIGFkZGVkLgogICAgQGNoYWluYWJsZQogICovCiAg ZW51bWVyYWJsZUNvbnRlbnREaWRDaGFuZ2U6IGZ1bmN0aW9uKHJlbW92aW5n LCBhZGRpbmcpIHsKICAgIHZhciByZW1vdmVDbnQsIGFkZENudCwgaGFzRGVs dGE7CgogICAgaWYgKCdudW1iZXInID09PSB0eXBlb2YgcmVtb3ZpbmcpIHJl bW92ZUNudCA9IHJlbW92aW5nOwogICAgZWxzZSBpZiAocmVtb3ZpbmcpIHJl bW92ZUNudCA9IGdldChyZW1vdmluZywgJ2xlbmd0aCcpOwogICAgZWxzZSBy ZW1vdmVDbnQgPSByZW1vdmluZyA9IC0xOwoKICAgIGlmICgnbnVtYmVyJyA9 PT0gdHlwZW9mIGFkZGluZykgYWRkQ250ID0gYWRkaW5nOwogICAgZWxzZSBp ZiAoYWRkaW5nKSBhZGRDbnQgPSBnZXQoYWRkaW5nLCAnbGVuZ3RoJyk7CiAg ICBlbHNlIGFkZENudCA9IGFkZGluZyA9IC0xOwoKICAgIGhhc0RlbHRhID0g YWRkQ250PDAgfHwgcmVtb3ZlQ250PDAgfHwgYWRkQ250LXJlbW92ZUNudCE9 PTA7CgogICAgaWYgKHJlbW92aW5nID09PSAtMSkgcmVtb3ZpbmcgPSBudWxs OwogICAgaWYgKGFkZGluZyAgID09PSAtMSkgYWRkaW5nICAgPSBudWxsOwoK ICAgIEVtYmVyLnNlbmRFdmVudCh0aGlzLCAnQGVudW1lcmFibGU6Y2hhbmdl JywgW3RoaXMsIHJlbW92aW5nLCBhZGRpbmddKTsKICAgIGlmIChoYXNEZWx0 YSkgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ2xlbmd0aCcpOwog ICAgRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywgJ1tdJyk7CgogICAg cmV0dXJuIHRoaXMgOwogIH0sCgogIC8qKgogICAgQ29udmVydHMgdGhlIGVu dW1lcmFibGUgaW50byBhbiBhcnJheSBhbmQgc29ydHMgYnkgdGhlIGtleXMK ICAgIHNwZWNpZmllZCBpbiB0aGUgYXJndW1lbnQuCgogICAgWW91IG1heSBw cm92aWRlIG11bHRpcGxlIGFyZ3VtZW50cyB0byBzb3J0IGJ5IG11bHRpcGxl IHByb3BlcnRpZXMuCgogICAgQG1ldGhvZCBzb3J0QnkKICAgIEBwYXJhbSB7 U3RyaW5nfSBwcm9wZXJ0eSBuYW1lKHMpIHRvIHNvcnQgb24KICAgIEByZXR1 cm4ge0FycmF5fSBUaGUgc29ydGVkIGFycmF5LgogICAgKi8KICBzb3J0Qnk6 IGZ1bmN0aW9uKCkgewogICAgdmFyIHNvcnRLZXlzID0gYXJndW1lbnRzOwog ICAgcmV0dXJuIHRoaXMudG9BcnJheSgpLnNvcnQoZnVuY3Rpb24oYSwgYil7 CiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBzb3J0S2V5cy5sZW5ndGg7IGkr KykgewogICAgICAgIHZhciBrZXkgPSBzb3J0S2V5c1tpXSwKICAgICAgICBw cm9wQSA9IGdldChhLCBrZXkpLAogICAgICAgIHByb3BCID0gZ2V0KGIsIGtl eSk7CiAgICAgICAgLy8gcmV0dXJuIDEgb3IgLTEgZWxzZSBjb250aW51ZSB0 byB0aGUgbmV4dCBzb3J0S2V5CiAgICAgICAgdmFyIGNvbXBhcmVWYWx1ZSA9 IEVtYmVyLmNvbXBhcmUocHJvcEEsIHByb3BCKTsKICAgICAgICBpZiAoY29t cGFyZVZhbHVlKSB7IHJldHVybiBjb21wYXJlVmFsdWU7IH0KICAgICAgfQog ICAgICByZXR1cm4gMDsKICAgIH0pOwogIH0KfSk7Cgp9KSgpOwoKCgooZnVu Y3Rpb24oKSB7Ci8qKgpAbW9kdWxlIGVtYmVyCkBzdWJtb2R1bGUgZW1iZXIt cnVudGltZQoqLwoKLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgovLyBIRUxQRVJTCi8vCgp2 YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsIGlzTm9uZSA9 IEVtYmVyLmlzTm9uZSwgbWFwID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLm1h cCwgY2FjaGVGb3IgPSBFbWJlci5jYWNoZUZvcjsKCi8vIC4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4KLy8gQVJSQVkKLy8KLyoqCiAgVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBP YnNlcnZlci1mcmllbmRseSBBcnJheS1saWtlIGJlaGF2aW9yLiBUaGlzIG1p eGluIGlzCiAgcGlja2VkIHVwIGJ5IHRoZSBBcnJheSBjbGFzcyBhcyB3ZWxs IGFzIG90aGVyIGNvbnRyb2xsZXJzLCBldGMuIHRoYXQgd2FudCB0bwogIGFw cGVhciB0byBiZSBhcnJheXMuCgogIFVubGlrZSBgRW1iZXIuRW51bWVyYWJs ZSxgIHRoaXMgbWl4aW4gZGVmaW5lcyBtZXRob2RzIHNwZWNpZmljYWxseSBm b3IKICBjb2xsZWN0aW9ucyB0aGF0IHByb3ZpZGUgaW5kZXgtb3JkZXJlZCBh Y2Nlc3MgdG8gdGhlaXIgY29udGVudHMuIFdoZW4geW91CiAgYXJlIGRlc2ln bmluZyBjb2RlIHRoYXQgbmVlZHMgdG8gYWNjZXB0IGFueSBraW5kIG9mIEFy cmF5LWxpa2Ugb2JqZWN0LCB5b3UKICBzaG91bGQgdXNlIHRoZXNlIG1ldGhv ZHMgaW5zdGVhZCBvZiBBcnJheSBwcmltaXRpdmVzIGJlY2F1c2UgdGhlc2Ug d2lsbAogIHByb3Blcmx5IG5vdGlmeSBvYnNlcnZlcnMgb2YgY2hhbmdlcyB0 byB0aGUgYXJyYXkuCgogIEFsdGhvdWdoIHRoZXNlIG1ldGhvZHMgYXJlIGVm ZmljaWVudCwgdGhleSBkbyBhZGQgYSBsYXllciBvZiBpbmRpcmVjdGlvbiB0 bwogIHlvdXIgYXBwbGljYXRpb24gc28gaXQgaXMgYSBnb29kIGlkZWEgdG8g dXNlIHRoZW0gb25seSB3aGVuIHlvdSBuZWVkIHRoZQogIGZsZXhpYmlsaXR5 IG9mIHVzaW5nIGJvdGggdHJ1ZSBKYXZhU2NyaXB0IGFycmF5cyBhbmQgInZp cnR1YWwiIGFycmF5cyBzdWNoCiAgYXMgY29udHJvbGxlcnMgYW5kIGNvbGxl Y3Rpb25zLgoKICBZb3UgY2FuIHVzZSB0aGUgbWV0aG9kcyBkZWZpbmVkIGlu IHRoaXMgbW9kdWxlIHRvIGFjY2VzcyBhbmQgbW9kaWZ5IGFycmF5CiAgY29u dGVudHMgaW4gYSBLVk8tZnJpZW5kbHkgd2F5LiBZb3UgY2FuIGFsc28gYmUg bm90aWZpZWQgd2hlbmV2ZXIgdGhlCiAgbWVtYmVyc2hpcCBvZiBhbiBhcnJh eSBjaGFuZ2VzIGJ5IGNoYW5naW5nIHRoZSBzeW50YXggb2YgdGhlIHByb3Bl cnR5IHRvCiAgYC5vYnNlcnZlcygnKm15UHJvcGVydHkuW10nKWAuCgogIFRv IHN1cHBvcnQgYEVtYmVyLkFycmF5YCBpbiB5b3VyIG93biBjbGFzcywgeW91 IG11c3Qgb3ZlcnJpZGUgdHdvCiAgcHJpbWl0aXZlcyB0byB1c2UgaXQ6IGBy ZXBsYWNlKClgIGFuZCBgb2JqZWN0QXQoKWAuCgogIE5vdGUgdGhhdCB0aGUg RW1iZXIuQXJyYXkgbWl4aW4gYWxzbyBpbmNvcnBvcmF0ZXMgdGhlIGBFbWJl ci5FbnVtZXJhYmxlYAogIG1peGluLiBBbGwgYEVtYmVyLkFycmF5YC1saWtl IG9iamVjdHMgYXJlIGFsc28gZW51bWVyYWJsZS4KCiAgQGNsYXNzIEFycmF5 CiAgQG5hbWVzcGFjZSBFbWJlcgogIEB1c2VzIEVtYmVyLkVudW1lcmFibGUK ICBAc2luY2UgRW1iZXIgMC45LjAKKi8KRW1iZXIuQXJyYXkgPSBFbWJlci5N aXhpbi5jcmVhdGUoRW1iZXIuRW51bWVyYWJsZSwgewoKICAvKioKICAgIFlv dXIgYXJyYXkgbXVzdCBzdXBwb3J0IHRoZSBgbGVuZ3RoYCBwcm9wZXJ0eS4g WW91ciByZXBsYWNlIG1ldGhvZHMgc2hvdWxkCiAgICBzZXQgdGhpcyBwcm9w ZXJ0eSB3aGVuZXZlciBpdCBjaGFuZ2VzLgoKICAgIEBwcm9wZXJ0eSB7TnVt YmVyfSBsZW5ndGgKICAqLwogIGxlbmd0aDogRW1iZXIucmVxdWlyZWQoKSwK CiAgLyoqCiAgICBSZXR1cm5zIHRoZSBvYmplY3QgYXQgdGhlIGdpdmVuIGBp bmRleGAuIElmIHRoZSBnaXZlbiBgaW5kZXhgIGlzIG5lZ2F0aXZlCiAgICBv ciBpcyBncmVhdGVyIG9yIGVxdWFsIHRoYW4gdGhlIGFycmF5IGxlbmd0aCwg cmV0dXJucyBgdW5kZWZpbmVkYC4KCiAgICBUaGlzIGlzIG9uZSBvZiB0aGUg cHJpbWl0aXZlcyB5b3UgbXVzdCBpbXBsZW1lbnQgdG8gc3VwcG9ydCBgRW1i ZXIuQXJyYXlgLgogICAgSWYgeW91ciBvYmplY3Qgc3VwcG9ydHMgcmV0cmll dmluZyB0aGUgdmFsdWUgb2YgYW4gYXJyYXkgaXRlbSB1c2luZyBgZ2V0KClg CiAgICAoaS5lLiBgbXlBcnJheS5nZXQoMClgKSwgdGhlbiB5b3UgZG8gbm90 IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kCiAgICB5b3Vyc2VsZi4K CiAgICBgYGBqYXZhc2NyaXB0CiAgICB2YXIgYXJyID0gWydhJywgJ2InLCAn YycsICdkJ107CiAgICBhcnIub2JqZWN0QXQoMCk7ICAgLy8gImEiCiAgICBh cnIub2JqZWN0QXQoMyk7ICAgLy8gImQiCiAgICBhcnIub2JqZWN0QXQoLTEp OyAgLy8gdW5kZWZpbmVkCiAgICBhcnIub2JqZWN0QXQoNCk7ICAgLy8gdW5k ZWZpbmVkCiAgICBhcnIub2JqZWN0QXQoNSk7ICAgLy8gdW5kZWZpbmVkCiAg ICBgYGAKCiAgICBAbWV0aG9kIG9iamVjdEF0CiAgICBAcGFyYW0ge051bWJl cn0gaWR4IFRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXR1cm4uCiAgICBA cmV0dXJuIHsqfSBpdGVtIGF0IGluZGV4IG9yIHVuZGVmaW5lZAogICovCiAg b2JqZWN0QXQ6IGZ1bmN0aW9uKGlkeCkgewogICAgaWYgKChpZHggPCAwKSB8 fCAoaWR4Pj1nZXQodGhpcywgJ2xlbmd0aCcpKSkgcmV0dXJuIHVuZGVmaW5l ZCA7CiAgICByZXR1cm4gZ2V0KHRoaXMsIGlkeCk7CiAgfSwKCiAgLyoqCiAg ICBUaGlzIHJldHVybnMgdGhlIG9iamVjdHMgYXQgdGhlIHNwZWNpZmllZCBp bmRleGVzLCB1c2luZyBgb2JqZWN0QXRgLgoKICAgIGBgYGphdmFzY3JpcHQK ICAgIHZhciBhcnIgPcKgWydhJywgJ2InLCAnYycsICdkJ107CiAgICBhcnIu b2JqZWN0c0F0KFswLCAxLCAyXSk7ICAvLyBbImEiLCAiYiIsICJjIl0KICAg IGFyci5vYmplY3RzQXQoWzIsIDMsIDRdKTsgIC8vIFsiYyIsICJkIiwgdW5k ZWZpbmVkXQogICAgYGBgCgogICAgQG1ldGhvZCBvYmplY3RzQXQKICAgIEBw YXJhbSB7QXJyYXl9IGluZGV4ZXMgQW4gYXJyYXkgb2YgaW5kZXhlcyBvZiBp dGVtcyB0byByZXR1cm4uCiAgICBAcmV0dXJuIHtBcnJheX0KICAgKi8KICBv YmplY3RzQXQ6IGZ1bmN0aW9uKGluZGV4ZXMpIHsKICAgIHZhciBzZWxmID0g dGhpczsKICAgIHJldHVybiBtYXAoaW5kZXhlcywgZnVuY3Rpb24oaWR4KSB7 IHJldHVybiBzZWxmLm9iamVjdEF0KGlkeCk7IH0pOwogIH0sCgogIC8vIG92 ZXJyaWRlcyBFbWJlci5FbnVtZXJhYmxlIHZlcnNpb24KICBuZXh0T2JqZWN0 OiBmdW5jdGlvbihpZHgpIHsKICAgIHJldHVybiB0aGlzLm9iamVjdEF0KGlk eCk7CiAgfSwKCiAgLyoqCiAgICBUaGlzIGlzIHRoZSBoYW5kbGVyIGZvciB0 aGUgc3BlY2lhbCBhcnJheSBjb250ZW50IHByb3BlcnR5LiBJZiB5b3UgZ2V0 CiAgICB0aGlzIHByb3BlcnR5LCBpdCB3aWxsIHJldHVybiB0aGlzLiBJZiB5 b3Ugc2V0IHRoaXMgcHJvcGVydHkgaXQgYSBuZXcKICAgIGFycmF5LCBpdCB3 aWxsIHJlcGxhY2UgdGhlIGN1cnJlbnQgY29udGVudC4KCiAgICBUaGlzIHBy b3BlcnR5IG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBwcm9wZXJ0eSBkZWZpbmVk IGluIGBFbWJlci5FbnVtZXJhYmxlYC4KCiAgICBAcHJvcGVydHkgW10KICAg IEByZXR1cm4gdGhpcwogICovCiAgJ1tdJzogRW1iZXIuY29tcHV0ZWQoZnVu Y3Rpb24oa2V5LCB2YWx1ZSkgewogICAgaWYgKHZhbHVlICE9PSB1bmRlZmlu ZWQpIHRoaXMucmVwbGFjZSgwLCBnZXQodGhpcywgJ2xlbmd0aCcpLCB2YWx1 ZSkgOwogICAgcmV0dXJuIHRoaXMgOwogIH0pLAoKICBmaXJzdE9iamVjdDog RW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5v YmplY3RBdCgwKTsKICB9KSwKCiAgbGFzdE9iamVjdDogRW1iZXIuY29tcHV0 ZWQoZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5vYmplY3RBdChnZXQo dGhpcywgJ2xlbmd0aCcpLTEpOwogIH0pLAoKICAvLyBvcHRpbWl6ZWQgdmVy c2lvbiBmcm9tIEVudW1lcmFibGUKICBjb250YWluczogZnVuY3Rpb24ob2Jq KSB7CiAgICByZXR1cm4gdGhpcy5pbmRleE9mKG9iaikgPj0gMDsKICB9LAoK ICAvLyBBZGQgYW55IGV4dHJhIG1ldGhvZHMgdG8gRW1iZXIuQXJyYXkgdGhh dCBhcmUgbmF0aXZlIHRvIHRoZSBidWlsdC1pbiBBcnJheS4KICAvKioKICAg IFJldHVybnMgYSBuZXcgYXJyYXkgdGhhdCBpcyBhIHNsaWNlIG9mIHRoZSBy ZWNlaXZlci4gVGhpcyBpbXBsZW1lbnRhdGlvbgogICAgdXNlcyB0aGUgb2Jz ZXJ2YWJsZSBhcnJheSBtZXRob2RzIHRvIHJldHJpZXZlIHRoZSBvYmplY3Rz IGZvciB0aGUgbmV3CiAgICBzbGljZS4KCiAgICBgYGBqYXZhc2NyaXB0CiAg ICB2YXIgYXJyID0gWydyZWQnLCAnZ3JlZW4nLCAnYmx1ZSddOwogICAgYXJy LnNsaWNlKDApOyAgICAgICAvLyBbJ3JlZCcsICdncmVlbicsICdibHVlJ10K ICAgIGFyci5zbGljZSgwLCAyKTsgICAgLy8gWydyZWQnLCAnZ3JlZW4nXQog ICAgYXJyLnNsaWNlKDEsIDEwMCk7ICAvLyBbJ2dyZWVuJywgJ2JsdWUnXQog ICAgYGBgCgogICAgQG1ldGhvZCBzbGljZQogICAgQHBhcmFtIHtJbnRlZ2Vy fSBiZWdpbkluZGV4IChPcHRpb25hbCkgaW5kZXggdG8gYmVnaW4gc2xpY2lu ZyBmcm9tLgogICAgQHBhcmFtIHtJbnRlZ2VyfSBlbmRJbmRleCAoT3B0aW9u YWwpIGluZGV4IHRvIGVuZCB0aGUgc2xpY2UgYXQgKGJ1dCBub3QgaW5jbHVk ZWQpLgogICAgQHJldHVybiB7QXJyYXl9IE5ldyBhcnJheSB3aXRoIHNwZWNp ZmllZCBzbGljZQogICovCiAgc2xpY2U6IGZ1bmN0aW9uKGJlZ2luSW5kZXgs IGVuZEluZGV4KSB7CiAgICB2YXIgcmV0ID0gRW1iZXIuQSgpOwogICAgdmFy IGxlbmd0aCA9IGdldCh0aGlzLCAnbGVuZ3RoJykgOwogICAgaWYgKGlzTm9u ZShiZWdpbkluZGV4KSkgYmVnaW5JbmRleCA9IDAgOwogICAgaWYgKGlzTm9u ZShlbmRJbmRleCkgfHwgKGVuZEluZGV4ID4gbGVuZ3RoKSkgZW5kSW5kZXgg PSBsZW5ndGggOwoKICAgIGlmIChiZWdpbkluZGV4IDwgMCkgYmVnaW5JbmRl eCA9IGxlbmd0aCArIGJlZ2luSW5kZXg7CiAgICBpZiAoZW5kSW5kZXggPCAw KSBlbmRJbmRleCA9IGxlbmd0aCArIGVuZEluZGV4OwoKICAgIHdoaWxlKGJl Z2luSW5kZXggPCBlbmRJbmRleCkgewogICAgICByZXRbcmV0Lmxlbmd0aF0g PSB0aGlzLm9iamVjdEF0KGJlZ2luSW5kZXgrKykgOwogICAgfQogICAgcmV0 dXJuIHJldCA7CiAgfSwKCiAgLyoqCiAgICBSZXR1cm5zIHRoZSBpbmRleCBv ZiB0aGUgZ2l2ZW4gb2JqZWN0J3MgZmlyc3Qgb2NjdXJyZW5jZS4KICAgIElm IG5vIGBzdGFydEF0YCBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIHN0YXJ0aW5n IGxvY2F0aW9uIHRvCiAgICBzZWFyY2ggaXMgMC4gSWYgaXQncyBuZWdhdGl2 ZSwgd2lsbCBjb3VudCBiYWNrd2FyZCBmcm9tCiAgICB0aGUgZW5kIG9mIHRo ZSBhcnJheS4gUmV0dXJucyAtMSBpZiBubyBtYXRjaCBpcyBmb3VuZC4KCiAg ICBgYGBqYXZhc2NyaXB0CiAgICB2YXIgYXJyID0gWyJhIiwgImIiLCAiYyIs ICJkIiwgImEiXTsKICAgIGFyci5pbmRleE9mKCJhIik7ICAgICAgIC8vICAw CiAgICBhcnIuaW5kZXhPZigieiIpOyAgICAgICAvLyAtMQogICAgYXJyLmlu ZGV4T2YoImEiLCAyKTsgICAgLy8gIDQKICAgIGFyci5pbmRleE9mKCJhIiwg LTEpOyAgIC8vICA0CiAgICBhcnIuaW5kZXhPZigiYiIsIDMpOyAgICAvLyAt MQogICAgYXJyLmluZGV4T2YoImEiLCAxMDApOyAgLy8gLTEKICAgIGBgYAoK ICAgIEBtZXRob2QgaW5kZXhPZgogICAgQHBhcmFtIHtPYmplY3R9IG9iamVj dCB0aGUgaXRlbSB0byBzZWFyY2ggZm9yCiAgICBAcGFyYW0ge051bWJlcn0g c3RhcnRBdCBvcHRpb25hbCBzdGFydGluZyBsb2NhdGlvbiB0byBzZWFyY2gs IGRlZmF1bHQgMAogICAgQHJldHVybiB7TnVtYmVyfSBpbmRleCBvciAtMSBp ZiBub3QgZm91bmQKICAqLwogIGluZGV4T2Y6IGZ1bmN0aW9uKG9iamVjdCwg c3RhcnRBdCkgewogICAgdmFyIGlkeCwgbGVuID0gZ2V0KHRoaXMsICdsZW5n dGgnKTsKCiAgICBpZiAoc3RhcnRBdCA9PT0gdW5kZWZpbmVkKSBzdGFydEF0 ID0gMDsKICAgIGlmIChzdGFydEF0IDwgMCkgc3RhcnRBdCArPSBsZW47Cgog ICAgZm9yKGlkeD1zdGFydEF0O2lkeDxsZW47aWR4KyspIHsKICAgICAgaWYg KHRoaXMub2JqZWN0QXQoaWR4KSA9PT0gb2JqZWN0KSByZXR1cm4gaWR4IDsK ICAgIH0KICAgIHJldHVybiAtMTsKICB9LAoKICAvKioKICAgIFJldHVybnMg dGhlIGluZGV4IG9mIHRoZSBnaXZlbiBvYmplY3QncyBsYXN0IG9jY3VycmVu Y2UuCiAgICBJZiBubyBgc3RhcnRBdGAgYXJndW1lbnQgaXMgZ2l2ZW4sIHRo ZSBzZWFyY2ggc3RhcnRzIGZyb20KICAgIHRoZSBsYXN0IHBvc2l0aW9uLiBJ ZiBpdCdzIG5lZ2F0aXZlLCB3aWxsIGNvdW50IGJhY2t3YXJkCiAgICBmcm9t IHRoZSBlbmQgb2YgdGhlIGFycmF5LiBSZXR1cm5zIC0xIGlmIG5vIG1hdGNo IGlzIGZvdW5kLgoKICAgIGBgYGphdmFzY3JpcHQKICAgIHZhciBhcnIgPSBb ImEiLCAiYiIsICJjIiwgImQiLCAiYSJdOwogICAgYXJyLmxhc3RJbmRleE9m KCJhIik7ICAgICAgIC8vICA0CiAgICBhcnIubGFzdEluZGV4T2YoInoiKTsg ICAgICAgLy8gLTEKICAgIGFyci5sYXN0SW5kZXhPZigiYSIsIDIpOyAgICAv LyAgMAogICAgYXJyLmxhc3RJbmRleE9mKCJhIiwgLTEpOyAgIC8vICA0CiAg ICBhcnIubGFzdEluZGV4T2YoImIiLCAzKTsgICAgLy8gIDEKICAgIGFyci5s YXN0SW5kZXhPZigiYSIsIDEwMCk7ICAvLyAgNAogICAgYGBgCgogICAgQG1l dGhvZCBsYXN0SW5kZXhPZgogICAgQHBhcmFtIHtPYmplY3R9IG9iamVjdCB0 aGUgaXRlbSB0byBzZWFyY2ggZm9yCiAgICBAcGFyYW0ge051bWJlcn0gc3Rh cnRBdCBvcHRpb25hbCBzdGFydGluZyBsb2NhdGlvbiB0byBzZWFyY2gsIGRl ZmF1bHQgMAogICAgQHJldHVybiB7TnVtYmVyfSBpbmRleCBvciAtMSBpZiBu b3QgZm91bmQKICAqLwogIGxhc3RJbmRleE9mOiBmdW5jdGlvbihvYmplY3Qs IHN0YXJ0QXQpIHsKICAgIHZhciBpZHgsIGxlbiA9IGdldCh0aGlzLCAnbGVu Z3RoJyk7CgogICAgaWYgKHN0YXJ0QXQgPT09IHVuZGVmaW5lZCB8fCBzdGFy dEF0ID49IGxlbikgc3RhcnRBdCA9IGxlbi0xOwogICAgaWYgKHN0YXJ0QXQg PCAwKSBzdGFydEF0ICs9IGxlbjsKCiAgICBmb3IoaWR4PXN0YXJ0QXQ7aWR4 Pj0wO2lkeC0tKSB7CiAgICAgIGlmICh0aGlzLm9iamVjdEF0KGlkeCkgPT09 IG9iamVjdCkgcmV0dXJuIGlkeCA7CiAgICB9CiAgICByZXR1cm4gLTE7CiAg fSwKCiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLgogIC8vIEFSUkFZIE9CU0VSVkVSUwog IC8vCgogIC8qKgogICAgQWRkcyBhbiBhcnJheSBvYnNlcnZlciB0byB0aGUg cmVjZWl2aW5nIGFycmF5LiBUaGUgYXJyYXkgb2JzZXJ2ZXIgb2JqZWN0CiAg ICBub3JtYWxseSBtdXN0IGltcGxlbWVudCB0d28gbWV0aG9kczoKCiAgICAq IGBhcnJheVdpbGxDaGFuZ2Uob2JzZXJ2ZWRPYmosIHN0YXJ0LCByZW1vdmVD b3VudCwgYWRkQ291bnQpYCAtIFRoaXMgbWV0aG9kIHdpbGwgYmUKICAgICAg Y2FsbGVkIGp1c3QgYmVmb3JlIHRoZSBhcnJheSBpcyBtb2RpZmllZC4KICAg ICogYGFycmF5RGlkQ2hhbmdlKG9ic2VydmVkT2JqLCBzdGFydCwgcmVtb3Zl Q291bnQsIGFkZENvdW50KWAgLSBUaGlzIG1ldGhvZCB3aWxsIGJlCiAgICAg IGNhbGxlZCBqdXN0IGFmdGVyIHRoZSBhcnJheSBpcyBtb2RpZmllZC4KCiAg ICBCb3RoIGNhbGxiYWNrcyB3aWxsIGJlIHBhc3NlZCB0aGUgb2JzZXJ2ZWQg b2JqZWN0LCBzdGFydGluZyBpbmRleCBvZiB0aGUKICAgIGNoYW5nZSBhcyB3 ZWxsIGEgYSBjb3VudCBvZiB0aGUgaXRlbXMgdG8gYmUgcmVtb3ZlZCBhbmQg YWRkZWQuIFlvdSBjYW4gdXNlCiAgICB0aGVzZSBjYWxsYmFja3MgdG8gb3B0 aW9uYWxseSBpbnNwZWN0IHRoZSBhcnJheSBkdXJpbmcgdGhlIGNoYW5nZSwg Y2xlYXIKICAgIGNhY2hlcywgb3IgZG8gYW55IG90aGVyIGJvb2trZWVwaW5n IG5lY2Vzc2FyeS4KCiAgICBJbiBhZGRpdGlvbiB0byBwYXNzaW5nIGEgdGFy Z2V0LCB5b3UgY2FuIGFsc28gaW5jbHVkZSBhbiBvcHRpb25zIGhhc2gKICAg IHdoaWNoIHlvdSBjYW4gdXNlIHRvIG92ZXJyaWRlIHRoZSBtZXRob2QgbmFt ZXMgdGhhdCB3aWxsIGJlIGludm9rZWQgb24gdGhlCiAgICB0YXJnZXQuCgog ICAgQG1ldGhvZCBhZGRBcnJheU9ic2VydmVyCiAgICBAcGFyYW0ge09iamVj dH0gdGFyZ2V0IFRoZSBvYnNlcnZlciBvYmplY3QuCiAgICBAcGFyYW0ge0hh c2h9IG9wdHMgT3B0aW9uYWwgaGFzaCBvZiBjb25maWd1cmF0aW9uIG9wdGlv bnMgaW5jbHVkaW5nCiAgICAgIGB3aWxsQ2hhbmdlYCBhbmQgYGRpZENoYW5n ZWAgb3B0aW9uLgogICAgQHJldHVybiB7RW1iZXIuQXJyYXl9IHJlY2VpdmVy CiAgKi8KICBhZGRBcnJheU9ic2VydmVyOiBmdW5jdGlvbih0YXJnZXQsIG9w dHMpIHsKICAgIHZhciB3aWxsQ2hhbmdlID0gKG9wdHMgJiYgb3B0cy53aWxs Q2hhbmdlKSB8fCAnYXJyYXlXaWxsQ2hhbmdlJywKICAgICAgICBkaWRDaGFu Z2UgID0gKG9wdHMgJiYgb3B0cy5kaWRDaGFuZ2UpIHx8ICdhcnJheURpZENo YW5nZSc7CgogICAgdmFyIGhhc09ic2VydmVycyA9IGdldCh0aGlzLCAnaGFz QXJyYXlPYnNlcnZlcnMnKTsKICAgIGlmICghaGFzT2JzZXJ2ZXJzKSBFbWJl ci5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcywgJ2hhc0FycmF5T2JzZXJ2ZXJz Jyk7CiAgICBFbWJlci5hZGRMaXN0ZW5lcih0aGlzLCAnQGFycmF5OmJlZm9y ZScsIHRhcmdldCwgd2lsbENoYW5nZSk7CiAgICBFbWJlci5hZGRMaXN0ZW5l cih0aGlzLCAnQGFycmF5OmNoYW5nZScsIHRhcmdldCwgZGlkQ2hhbmdlKTsK ICAgIGlmICghaGFzT2JzZXJ2ZXJzKSBFbWJlci5wcm9wZXJ0eURpZENoYW5n ZSh0aGlzLCAnaGFzQXJyYXlPYnNlcnZlcnMnKTsKICAgIHJldHVybiB0aGlz OwogIH0sCgogIC8qKgogICAgUmVtb3ZlcyBhbiBhcnJheSBvYnNlcnZlciBm cm9tIHRoZSBvYmplY3QgaWYgdGhlIG9ic2VydmVyIGlzIGN1cnJlbnQKICAg IHJlZ2lzdGVyZWQuIENhbGxpbmcgdGhpcyBtZXRob2QgbXVsdGlwbGUgdGlt ZXMgd2l0aCB0aGUgc2FtZSBvYmplY3Qgd2lsbAogICAgaGF2ZSBubyBlZmZl Y3QuCgogICAgQG1ldGhvZCByZW1vdmVBcnJheU9ic2VydmVyCiAgICBAcGFy YW0ge09iamVjdH0gdGFyZ2V0IFRoZSBvYmplY3Qgb2JzZXJ2aW5nIHRoZSBh cnJheS4KICAgIEBwYXJhbSB7SGFzaH0gb3B0cyBPcHRpb25hbCBoYXNoIG9m IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcKICAgICAgYHdpbGxD aGFuZ2VgIGFuZCBgZGlkQ2hhbmdlYCBvcHRpb24uCiAgICBAcmV0dXJuIHtF bWJlci5BcnJheX0gcmVjZWl2ZXIKICAqLwogIHJlbW92ZUFycmF5T2JzZXJ2 ZXI6IGZ1bmN0aW9uKHRhcmdldCwgb3B0cykgewogICAgdmFyIHdpbGxDaGFu Z2UgPSAob3B0cyAmJiBvcHRzLndpbGxDaGFuZ2UpIHx8ICdhcnJheVdpbGxD aGFuZ2UnLAogICAgICAgIGRpZENoYW5nZSAgPSAob3B0cyAmJiBvcHRzLmRp ZENoYW5nZSkgfHwgJ2FycmF5RGlkQ2hhbmdlJzsKCiAgICB2YXIgaGFzT2Jz ZXJ2ZXJzID0gZ2V0KHRoaXMsICdoYXNBcnJheU9ic2VydmVycycpOwogICAg aWYgKGhhc09ic2VydmVycykgRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRo aXMsICdoYXNBcnJheU9ic2VydmVycycpOwogICAgRW1iZXIucmVtb3ZlTGlz dGVuZXIodGhpcywgJ0BhcnJheTpiZWZvcmUnLCB0YXJnZXQsIHdpbGxDaGFu Z2UpOwogICAgRW1iZXIucmVtb3ZlTGlzdGVuZXIodGhpcywgJ0BhcnJheTpj aGFuZ2UnLCB0YXJnZXQsIGRpZENoYW5nZSk7CiAgICBpZiAoaGFzT2JzZXJ2 ZXJzKSBFbWJlci5wcm9wZXJ0eURpZENoYW5nZSh0aGlzLCAnaGFzQXJyYXlP YnNlcnZlcnMnKTsKICAgIHJldHVybiB0aGlzOwogIH0sCgogIC8qKgogICAg QmVjb21lcyB0cnVlIHdoZW5ldmVyIHRoZSBhcnJheSBjdXJyZW50bHkgaGFz IG9ic2VydmVycyB3YXRjaGluZyBjaGFuZ2VzCiAgICBvbiB0aGUgYXJyYXku CgogICAgQHByb3BlcnR5IHtCb29sZWFufSBoYXNBcnJheU9ic2VydmVycwog ICovCiAgaGFzQXJyYXlPYnNlcnZlcnM6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0 aW9uKCkgewogICAgcmV0dXJuIEVtYmVyLmhhc0xpc3RlbmVycyh0aGlzLCAn QGFycmF5OmNoYW5nZScpIHx8IEVtYmVyLmhhc0xpc3RlbmVycyh0aGlzLCAn QGFycmF5OmJlZm9yZScpOwogIH0pLAoKICAvKioKICAgIElmIHlvdSBhcmUg aW1wbGVtZW50aW5nIGFuIG9iamVjdCB0aGF0IHN1cHBvcnRzIGBFbWJlci5B cnJheWAsIGNhbGwgdGhpcwogICAgbWV0aG9kIGp1c3QgYmVmb3JlIHRoZSBh cnJheSBjb250ZW50IGNoYW5nZXMgdG8gbm90aWZ5IGFueSBvYnNlcnZlcnMg YW5kCiAgICBpbnZhbGlkYXRlIGFueSByZWxhdGVkIHByb3BlcnRpZXMuIFBh c3MgdGhlIHN0YXJ0aW5nIGluZGV4IG9mIHRoZSBjaGFuZ2UKICAgIGFzIHdl bGwgYXMgYSBkZWx0YSBvZiB0aGUgYW1vdW50cyB0byBjaGFuZ2UuCgogICAg QG1ldGhvZCBhcnJheUNvbnRlbnRXaWxsQ2hhbmdlCiAgICBAcGFyYW0ge051 bWJlcn0gc3RhcnRJZHggVGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSBhcnJh eSB0aGF0IHdpbGwgY2hhbmdlLgogICAgQHBhcmFtIHtOdW1iZXJ9IHJlbW92 ZUFtdCBUaGUgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgd2lsbCBiZSByZW1vdmVk LiBJZiB5b3UKICAgICAgcGFzcyBgbnVsbGAgYXNzdW1lcyAwCiAgICBAcGFy YW0ge051bWJlcn0gYWRkQW10IFRoZSBudW1iZXIgb2YgaXRlbXMgdGhhdCB3 aWxsIGJlIGFkZGVkLiBJZiB5b3UKICAgICAgcGFzcyBgbnVsbGAgYXNzdW1l cyAwLgogICAgQHJldHVybiB7RW1iZXIuQXJyYXl9IHJlY2VpdmVyCiAgKi8K ICBhcnJheUNvbnRlbnRXaWxsQ2hhbmdlOiBmdW5jdGlvbihzdGFydElkeCwg cmVtb3ZlQW10LCBhZGRBbXQpIHsKCiAgICAvLyBpZiBubyBhcmdzIGFyZSBw YXNzZWQgYXNzdW1lIGV2ZXJ5dGhpbmcgY2hhbmdlcwogICAgaWYgKHN0YXJ0 SWR4PT09dW5kZWZpbmVkKSB7CiAgICAgIHN0YXJ0SWR4ID0gMDsKICAgICAg cmVtb3ZlQW10ID0gYWRkQW10ID0gLTE7CiAgICB9IGVsc2UgewogICAgICBp ZiAocmVtb3ZlQW10ID09PSB1bmRlZmluZWQpIHJlbW92ZUFtdD0tMTsKICAg ICAgaWYgKGFkZEFtdCAgICA9PT0gdW5kZWZpbmVkKSBhZGRBbXQ9LTE7CiAg ICB9CgogICAgLy8gTWFrZSBzdXJlIHRoZSBAZWFjaCBwcm94eSBpcyBzZXQg dXAgaWYgYW55b25lIGlzIG9ic2VydmluZyBAZWFjaAogICAgaWYgKEVtYmVy LmlzV2F0Y2hpbmcodGhpcywgJ0BlYWNoJykpIHsgZ2V0KHRoaXMsICdAZWFj aCcpOyB9CgogICAgRW1iZXIuc2VuZEV2ZW50KHRoaXMsICdAYXJyYXk6YmVm b3JlJywgW3RoaXMsIHN0YXJ0SWR4LCByZW1vdmVBbXQsIGFkZEFtdF0pOwoK ICAgIHZhciByZW1vdmluZywgbGltOwogICAgaWYgKHN0YXJ0SWR4Pj0wICYm IHJlbW92ZUFtdD49MCAmJiBnZXQodGhpcywgJ2hhc0VudW1lcmFibGVPYnNl cnZlcnMnKSkgewogICAgICByZW1vdmluZyA9IFtdOwogICAgICBsaW0gPSBz dGFydElkeCtyZW1vdmVBbXQ7CiAgICAgIGZvcih2YXIgaWR4PXN0YXJ0SWR4 O2lkeDxsaW07aWR4KyspIHJlbW92aW5nLnB1c2godGhpcy5vYmplY3RBdChp ZHgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlbW92aW5nID0gcmVtb3ZlQW10 OwogICAgfQoKICAgIHRoaXMuZW51bWVyYWJsZUNvbnRlbnRXaWxsQ2hhbmdl KHJlbW92aW5nLCBhZGRBbXQpOwoKICAgIHJldHVybiB0aGlzOwogIH0sCgog IC8qKgogICAgSWYgeW91IGFyZSBpbXBsZW1lbnRpbmcgYW4gb2JqZWN0IHRo YXQgc3VwcG9ydHMgYEVtYmVyLkFycmF5YCwgY2FsbCB0aGlzCiAgICBtZXRo b2QganVzdCBhZnRlciB0aGUgYXJyYXkgY29udGVudCBjaGFuZ2VzIHRvIG5v dGlmeSBhbnkgb2JzZXJ2ZXJzIGFuZAogICAgaW52YWxpZGF0ZSBhbnkgcmVs YXRlZCBwcm9wZXJ0aWVzLiBQYXNzIHRoZSBzdGFydGluZyBpbmRleCBvZiB0 aGUgY2hhbmdlCiAgICBhcyB3ZWxsIGFzIGEgZGVsdGEgb2YgdGhlIGFtb3Vu dHMgdG8gY2hhbmdlLgoKICAgIEBtZXRob2QgYXJyYXlDb250ZW50RGlkQ2hh bmdlCiAgICBAcGFyYW0ge051bWJlcn0gc3RhcnRJZHggVGhlIHN0YXJ0aW5n IGluZGV4IGluIHRoZSBhcnJheSB0aGF0IGRpZCBjaGFuZ2UuCiAgICBAcGFy YW0ge051bWJlcn0gcmVtb3ZlQW10IFRoZSBudW1iZXIgb2YgaXRlbXMgdGhh dCB3ZXJlIHJlbW92ZWQuIElmIHlvdQogICAgICBwYXNzIGBudWxsYCBhc3N1 bWVzIDAKICAgIEBwYXJhbSB7TnVtYmVyfSBhZGRBbXQgVGhlIG51bWJlciBv ZiBpdGVtcyB0aGF0IHdlcmUgYWRkZWQuIElmIHlvdQogICAgICBwYXNzIGBu dWxsYCBhc3N1bWVzIDAuCiAgICBAcmV0dXJuIHtFbWJlci5BcnJheX0gcmVj ZWl2ZXIKICAqLwogIGFycmF5Q29udGVudERpZENoYW5nZTogZnVuY3Rpb24o c3RhcnRJZHgsIHJlbW92ZUFtdCwgYWRkQW10KSB7CgogICAgLy8gaWYgbm8g YXJncyBhcmUgcGFzc2VkIGFzc3VtZSBldmVyeXRoaW5nIGNoYW5nZXMKICAg IGlmIChzdGFydElkeD09PXVuZGVmaW5lZCkgewogICAgICBzdGFydElkeCA9 IDA7CiAgICAgIHJlbW92ZUFtdCA9IGFkZEFtdCA9IC0xOwogICAgfSBlbHNl IHsKICAgICAgaWYgKHJlbW92ZUFtdCA9PT0gdW5kZWZpbmVkKSByZW1vdmVB bXQ9LTE7CiAgICAgIGlmIChhZGRBbXQgICAgPT09IHVuZGVmaW5lZCkgYWRk QW10PS0xOwogICAgfQoKICAgIHZhciBhZGRpbmcsIGxpbTsKICAgIGlmIChz dGFydElkeD49MCAmJiBhZGRBbXQ+PTAgJiYgZ2V0KHRoaXMsICdoYXNFbnVt ZXJhYmxlT2JzZXJ2ZXJzJykpIHsKICAgICAgYWRkaW5nID0gW107CiAgICAg IGxpbSA9IHN0YXJ0SWR4K2FkZEFtdDsKICAgICAgZm9yKHZhciBpZHg9c3Rh cnRJZHg7aWR4PGxpbTtpZHgrKykgYWRkaW5nLnB1c2godGhpcy5vYmplY3RB dChpZHgpKTsKICAgIH0gZWxzZSB7CiAgICAgIGFkZGluZyA9IGFkZEFtdDsK ICAgIH0KCiAgICB0aGlzLmVudW1lcmFibGVDb250ZW50RGlkQ2hhbmdlKHJl bW92ZUFtdCwgYWRkaW5nKTsKICAgIEVtYmVyLnNlbmRFdmVudCh0aGlzLCAn QGFycmF5OmNoYW5nZScsIFt0aGlzLCBzdGFydElkeCwgcmVtb3ZlQW10LCBh ZGRBbXRdKTsKCiAgICB2YXIgbGVuZ3RoICAgICAgPSBnZXQodGhpcywgJ2xl bmd0aCcpLAogICAgICAgIGNhY2hlZEZpcnN0ID0gY2FjaGVGb3IodGhpcywg J2ZpcnN0T2JqZWN0JyksCiAgICAgICAgY2FjaGVkTGFzdCAgPSBjYWNoZUZv cih0aGlzLCAnbGFzdE9iamVjdCcpOwogICAgaWYgKHRoaXMub2JqZWN0QXQo MCkgIT09IGNhY2hlZEZpcnN0KSB7CiAgICAgIEVtYmVyLnByb3BlcnR5V2ls bENoYW5nZSh0aGlzLCAnZmlyc3RPYmplY3QnKTsKICAgICAgRW1iZXIucHJv cGVydHlEaWRDaGFuZ2UodGhpcywgJ2ZpcnN0T2JqZWN0Jyk7CiAgICB9CiAg ICBpZiAodGhpcy5vYmplY3RBdChsZW5ndGgtMSkgIT09IGNhY2hlZExhc3Qp IHsKICAgICAgRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsICdsYXN0 T2JqZWN0Jyk7CiAgICAgIEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMs ICdsYXN0T2JqZWN0Jyk7CiAgICB9CgogICAgcmV0dXJuIHRoaXM7CiAgfSwK CiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLgogIC8vIEVOVU1FUkFURUQgUFJPUEVSVElF UwogIC8vCgogIC8qKgogICAgUmV0dXJucyBhIHNwZWNpYWwgb2JqZWN0IHRo YXQgY2FuIGJlIHVzZWQgdG8gb2JzZXJ2ZSBpbmRpdmlkdWFsIHByb3BlcnRp ZXMKICAgIG9uIHRoZSBhcnJheS4gSnVzdCBnZXQgYW4gZXF1aXZhbGVudCBw cm9wZXJ0eSBvbiB0aGlzIG9iamVjdCBhbmQgaXQgd2lsbAogICAgcmV0dXJu IGFuIGVudW1lcmFibGUgdGhhdCBtYXBzIGF1dG9tYXRpY2FsbHkgdG8gdGhl IG5hbWVkIGtleSBvbiB0aGUKICAgIG1lbWJlciBvYmplY3RzLgoKICAgIElm IHlvdSBtZXJlbHkgd2FudCB0byB3YXRjaCBmb3IgYW55IGl0ZW1zIGJlaW5n IGFkZGVkIG9yIHJlbW92ZWQgdG8gdGhlIGFycmF5LAogICAgdXNlIHRoZSBg W11gIHByb3BlcnR5IGluc3RlYWQgb2YgYEBlYWNoYC4KCiAgICBAcHJvcGVy dHkgQGVhY2gKICAqLwogICdAZWFjaCc6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0 aW9uKCkgewogICAgaWYgKCF0aGlzLl9fZWFjaCkgdGhpcy5fX2VhY2ggPSBu ZXcgRW1iZXIuRWFjaFByb3h5KHRoaXMpOwogICAgcmV0dXJuIHRoaXMuX19l YWNoOwogIH0pCgp9KSA7Cgp9KSgpOwoKCgooZnVuY3Rpb24oKSB7CnZhciBl X2dldCA9IEVtYmVyLmdldCwKICAgIHNldCA9IEVtYmVyLnNldCwKICAgIGd1 aWRGb3IgPSBFbWJlci5ndWlkRm9yLAogICAgbWV0YUZvciA9IEVtYmVyLm1l dGEsCiAgICBwcm9wZXJ0eVdpbGxDaGFuZ2UgPSBFbWJlci5wcm9wZXJ0eVdp bGxDaGFuZ2UsCiAgICBwcm9wZXJ0eURpZENoYW5nZSA9IEVtYmVyLnByb3Bl cnR5RGlkQ2hhbmdlLAogICAgYWRkQmVmb3JlT2JzZXJ2ZXIgPSBFbWJlci5h ZGRCZWZvcmVPYnNlcnZlciwKICAgIHJlbW92ZUJlZm9yZU9ic2VydmVyID0g RW1iZXIucmVtb3ZlQmVmb3JlT2JzZXJ2ZXIsCiAgICBhZGRPYnNlcnZlciA9 IEVtYmVyLmFkZE9ic2VydmVyLAogICAgcmVtb3ZlT2JzZXJ2ZXIgPSBFbWJl ci5yZW1vdmVPYnNlcnZlciwKICAgIENvbXB1dGVkUHJvcGVydHkgPSBFbWJl ci5Db21wdXRlZFByb3BlcnR5LAogICAgYV9zbGljZSA9IFtdLnNsaWNlLAog ICAgb19jcmVhdGUgPSBFbWJlci5jcmVhdGUsCiAgICBmb3JFYWNoID0gRW1i ZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2gsCiAgICAvLyBIZXJlIHdlIGV4 cGxpY2l0bHkgZG9uJ3QgYWxsb3cgYEBlYWNoLmZvb2A7IGl0IHdvdWxkIHJl cXVpcmUgc29tZSBzcGVjaWFsCiAgICAvLyB0ZXN0aW5nLCBidXQgdGhlcmUn cyBubyBwYXJ0aWN1bGFyIHJlYXNvbiB3aHkgaXQgc2hvdWxkIGJlIGRpc2Fs bG93ZWQuCiAgICBlYWNoUHJvcGVydHlQYXR0ZXJuID0gL14oLiopXC5AZWFj aFwuKC4qKS8sCiAgICBkb3VibGVFYWNoUHJvcGVydHlQYXR0ZXJuID0gLygu KlwuQGVhY2gpezIsfS8sCiAgICBhcnJheUJyYWNrZXRQYXR0ZXJuID0gL1wu XFtcXSQvOwoKdmFyIGV4cGFuZFByb3BlcnRpZXMgPSBFbWJlci5leHBhbmRQ cm9wZXJ0aWVzOwoKZnVuY3Rpb24gZ2V0KG9iaiwga2V5KSB7CiAgaWYgKGtl eSA9PT0gJ0B0aGlzJykgewogICAgcmV0dXJuIG9iajsKICB9CgogIHJldHVy biBlX2dldChvYmosIGtleSk7Cn0KCi8qCiAgVHJhY2tzIGNoYW5nZXMgdG8g ZGVwZW5kZW50IGFycmF5cywgYXMgd2VsbCBhcyB0byBwcm9wZXJ0aWVzIG9m IGl0ZW1zIGluCiAgZGVwZW5kZW50IGFycmF5cy4KCiAgQGNsYXNzIERlcGVu ZGVudEFycmF5c09ic2VydmVyCiovCmZ1bmN0aW9uIERlcGVuZGVudEFycmF5 c09ic2VydmVyKGNhbGxiYWNrcywgY3AsIGluc3RhbmNlTWV0YSwgY29udGV4 dCwgcHJvcGVydHlOYW1lLCBzdWdhck1ldGEpIHsKICAvLyB1c2VyIHNwZWNp ZmllZCBjYWxsYmFja3MgZm9yIGBhZGRlZEl0ZW1gIGFuZCBgcmVtb3ZlZEl0 ZW1gCiAgdGhpcy5jYWxsYmFja3MgPSBjYWxsYmFja3M7CgogIC8vIHRoZSBj b21wdXRlZCBwcm9wZXJ0eTogcmVtZW1iZXIgdGhlc2UgYXJlIHNoYXJlZCBh Y3Jvc3MgaW5zdGFuY2VzCiAgdGhpcy5jcCA9IGNwOwoKICAvLyB0aGUgUmVk dWNlQ29tcHV0ZWRQcm9wZXJ0eUluc3RhbmNlTWV0YSB0aGlzIERlcGVuZGVu dEFycmF5c09ic2VydmVyIGlzCiAgLy8gYXNzb2NpYXRlZCB3aXRoCiAgdGhp cy5pbnN0YW5jZU1ldGEgPSBpbnN0YW5jZU1ldGE7CgogIC8vIEEgbWFwIG9m IGFycmF5IGd1aWRzIHRvIGRlcGVuZGVudEtleXMsIGZvciB0aGUgZ2l2ZW4g Y29udGV4dC4gIFdlIHRyYWNrCiAgLy8gdGhpcyBiZWNhdXNlIHdlIHdhbnQg dG8gc2V0IHVwIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSBwb3RlbnRpYWxseSBi ZWZvcmUgdGhlCiAgLy8gZGVwZW5kZW50IGFycmF5IGV2ZW4gZXhpc3RzLCBi dXQgd2hlbiB0aGUgYXJyYXkgb2JzZXJ2ZXIgZmlyZXMsIHdlIGxhY2sKICAv LyBlbm91Z2ggY29udGV4dCB0byBrbm93IHdoYXQgdG8gdXBkYXRlOiB3ZSBj YW4gcmVjb3ZlciB0aGF0IGNvbnRleHQgYnkKICAvLyBnZXR0aW5nIHRoZSBk ZXBlbmRlbnRLZXkuCiAgdGhpcy5kZXBlbmRlbnRLZXlzQnlHdWlkID0ge307 CgogIC8vIGEgbWFwIG9mIGRlcGVuZGVudCBhcnJheSBndWlkcyAtPiBFbWJl ci5UcmFja2VkQXJyYXkgaW5zdGFuY2VzLiAgV2UgdXNlCiAgLy8gdGhpcyB0 byBsYXppbHkgcmVjb21wdXRlIGluZGV4ZXMgZm9yIGl0ZW0gcHJvcGVydHkg b2JzZXJ2ZXJzLgogIHRoaXMudHJhY2tlZEFycmF5c0J5R3VpZCA9IHt9OwoK ICAvLyBXZSBzdXNwZW5kIG9ic2VydmVycyB0byBpZ25vcmUgcmVwbGFjZW1l bnRzIGZyb20gYHJlc2V0YCB3aGVuIHRvdGFsbHkKICAvLyByZWNvbXB1dGlu Zy4gIFVuZm9ydHVuYXRlbHkgd2UgY2Fubm90IHByb3Blcmx5IHN1c3BlbmQg dGhlIG9ic2VydmVycwogIC8vIGJlY2F1c2Ugd2Ugb25seSBoYXZlIHRoZSBr ZXk7IGluc3RlYWQgd2UgbWFrZSB0aGUgb2JzZXJ2ZXJzIG5vLW9wcwogIHRo aXMuc3VzcGVuZGVkID0gZmFsc2U7CgogIC8vIFRoaXMgaXMgdXNlZCB0byBj b2FsZXNjZSBpdGVtIGNoYW5nZXMgZnJvbSBwcm9wZXJ0eSBvYnNlcnZlcnMu CiAgdGhpcy5jaGFuZ2VkSXRlbXMgPSB7fTsKfQoKZnVuY3Rpb24gSXRlbVBy b3BlcnR5T2JzZXJ2ZXJDb250ZXh0IChkZXBlbmRlbnRBcnJheSwgaW5kZXgs IHRyYWNrZWRBcnJheSkgewogIEVtYmVyLmFzc2VydCgiSW50ZXJuYWwgZXJy b3I6IHRyYWNrZWRBcnJheSBpcyBudWxsIG9yIHVuZGVmaW5lZCIsIHRyYWNr ZWRBcnJheSk7CgogIHRoaXMuZGVwZW5kZW50QXJyYXkgPSBkZXBlbmRlbnRB cnJheTsKICB0aGlzLmluZGV4ID0gaW5kZXg7CiAgdGhpcy5pdGVtID0gZGVw ZW5kZW50QXJyYXkub2JqZWN0QXQoaW5kZXgpOwogIHRoaXMudHJhY2tlZEFy cmF5ID0gdHJhY2tlZEFycmF5OwogIHRoaXMuYmVmb3JlT2JzZXJ2ZXIgPSBu dWxsOwogIHRoaXMub2JzZXJ2ZXIgPSBudWxsOwoKICB0aGlzLmRlc3Ryb3ll ZCA9IGZhbHNlOwp9CgpEZXBlbmRlbnRBcnJheXNPYnNlcnZlci5wcm90b3R5 cGUgPSB7CiAgc2V0VmFsdWU6IGZ1bmN0aW9uIChuZXdWYWx1ZSkgewogICAg dGhpcy5pbnN0YW5jZU1ldGEuc2V0VmFsdWUobmV3VmFsdWUsIHRydWUpOwog IH0sCiAgZ2V0VmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgIHJldHVybiB0aGlz Lmluc3RhbmNlTWV0YS5nZXRWYWx1ZSgpOwogIH0sCgogIHNldHVwT2JzZXJ2 ZXJzOiBmdW5jdGlvbiAoZGVwZW5kZW50QXJyYXksIGRlcGVuZGVudEtleSkg ewogICAgdGhpcy5kZXBlbmRlbnRLZXlzQnlHdWlkW2d1aWRGb3IoZGVwZW5k ZW50QXJyYXkpXSA9IGRlcGVuZGVudEtleTsKCiAgICBkZXBlbmRlbnRBcnJh eS5hZGRBcnJheU9ic2VydmVyKHRoaXMsIHsKICAgICAgd2lsbENoYW5nZTog J2RlcGVuZGVudEFycmF5V2lsbENoYW5nZScsCiAgICAgIGRpZENoYW5nZTog J2RlcGVuZGVudEFycmF5RGlkQ2hhbmdlJwogICAgfSk7CgogICAgaWYgKHRo aXMuY3AuX2l0ZW1Qcm9wZXJ0eUtleXNbZGVwZW5kZW50S2V5XSkgewogICAg ICB0aGlzLnNldHVwUHJvcGVydHlPYnNlcnZlcnMoZGVwZW5kZW50S2V5LCB0 aGlzLmNwLl9pdGVtUHJvcGVydHlLZXlzW2RlcGVuZGVudEtleV0pOwogICAg fQogIH0sCgogIHRlYXJkb3duT2JzZXJ2ZXJzOiBmdW5jdGlvbiAoZGVwZW5k ZW50QXJyYXksIGRlcGVuZGVudEtleSkgewogICAgdmFyIGl0ZW1Qcm9wZXJ0 eUtleXMgPSB0aGlzLmNwLl9pdGVtUHJvcGVydHlLZXlzW2RlcGVuZGVudEtl eV0gfHwgW107CgogICAgZGVsZXRlIHRoaXMuZGVwZW5kZW50S2V5c0J5R3Vp ZFtndWlkRm9yKGRlcGVuZGVudEFycmF5KV07CgogICAgdGhpcy50ZWFyZG93 blByb3BlcnR5T2JzZXJ2ZXJzKGRlcGVuZGVudEtleSwgaXRlbVByb3BlcnR5 S2V5cyk7CgogICAgZGVwZW5kZW50QXJyYXkucmVtb3ZlQXJyYXlPYnNlcnZl cih0aGlzLCB7CiAgICAgIHdpbGxDaGFuZ2U6ICdkZXBlbmRlbnRBcnJheVdp bGxDaGFuZ2UnLAogICAgICBkaWRDaGFuZ2U6ICdkZXBlbmRlbnRBcnJheURp ZENoYW5nZScKICAgIH0pOwogIH0sCgogIHN1c3BlbmRBcnJheU9ic2VydmVy czogZnVuY3Rpb24gKGNhbGxiYWNrLCBiaW5kaW5nKSB7CiAgICB2YXIgb2xk U3VzcGVuZGVkID0gdGhpcy5zdXNwZW5kZWQ7CiAgICB0aGlzLnN1c3BlbmRl ZCA9IHRydWU7CiAgICBjYWxsYmFjay5jYWxsKGJpbmRpbmcpOwogICAgdGhp cy5zdXNwZW5kZWQgPSBvbGRTdXNwZW5kZWQ7CiAgfSwKCiAgc2V0dXBQcm9w ZXJ0eU9ic2VydmVyczogZnVuY3Rpb24gKGRlcGVuZGVudEtleSwgaXRlbVBy b3BlcnR5S2V5cykgewogICAgdmFyIGRlcGVuZGVudEFycmF5ID0gZ2V0KHRo aXMuaW5zdGFuY2VNZXRhLmNvbnRleHQsIGRlcGVuZGVudEtleSksCiAgICAg ICAgbGVuZ3RoID0gZ2V0KGRlcGVuZGVudEFycmF5LCAnbGVuZ3RoJyksCiAg ICAgICAgb2JzZXJ2ZXJDb250ZXh0cyA9IG5ldyBBcnJheShsZW5ndGgpOwoK ICAgIHRoaXMucmVzZXRUcmFuc2Zvcm1hdGlvbnMoZGVwZW5kZW50S2V5LCBv YnNlcnZlckNvbnRleHRzKTsKCiAgICBmb3JFYWNoKGRlcGVuZGVudEFycmF5 LCBmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHsKICAgICAgdmFyIG9ic2VydmVy Q29udGV4dCA9IHRoaXMuY3JlYXRlUHJvcGVydHlPYnNlcnZlckNvbnRleHQo ZGVwZW5kZW50QXJyYXksIGluZGV4LCB0aGlzLnRyYWNrZWRBcnJheXNCeUd1 aWRbZGVwZW5kZW50S2V5XSk7CiAgICAgIG9ic2VydmVyQ29udGV4dHNbaW5k ZXhdID0gb2JzZXJ2ZXJDb250ZXh0OwoKICAgICAgZm9yRWFjaChpdGVtUHJv cGVydHlLZXlzLCBmdW5jdGlvbiAocHJvcGVydHlLZXkpIHsKICAgICAgICBh ZGRCZWZvcmVPYnNlcnZlcihpdGVtLCBwcm9wZXJ0eUtleSwgdGhpcywgb2Jz ZXJ2ZXJDb250ZXh0LmJlZm9yZU9ic2VydmVyKTsKICAgICAgICBhZGRPYnNl cnZlcihpdGVtLCBwcm9wZXJ0eUtleSwgdGhpcywgb2JzZXJ2ZXJDb250ZXh0 Lm9ic2VydmVyKTsKICAgICAgfSwgdGhpcyk7CiAgICB9LCB0aGlzKTsKICB9 LAoKICB0ZWFyZG93blByb3BlcnR5T2JzZXJ2ZXJzOiBmdW5jdGlvbiAoZGVw ZW5kZW50S2V5LCBpdGVtUHJvcGVydHlLZXlzKSB7CiAgICB2YXIgZGVwZW5k ZW50QXJyYXlPYnNlcnZlciA9IHRoaXMsCiAgICAgICAgdHJhY2tlZEFycmF5 ID0gdGhpcy50cmFja2VkQXJyYXlzQnlHdWlkW2RlcGVuZGVudEtleV0sCiAg ICAgICAgYmVmb3JlT2JzZXJ2ZXIsCiAgICAgICAgb2JzZXJ2ZXIsCiAgICAg ICAgaXRlbTsKCiAgICBpZiAoIXRyYWNrZWRBcnJheSkgeyByZXR1cm47IH0K CiAgICB0cmFja2VkQXJyYXkuYXBwbHkoZnVuY3Rpb24gKG9ic2VydmVyQ29u dGV4dHMsIG9mZnNldCwgb3BlcmF0aW9uKSB7CiAgICAgIGlmIChvcGVyYXRp b24gPT09IEVtYmVyLlRyYWNrZWRBcnJheS5ERUxFVEUpIHsgcmV0dXJuOyB9 CgogICAgICBmb3JFYWNoKG9ic2VydmVyQ29udGV4dHMsIGZ1bmN0aW9uIChv YnNlcnZlckNvbnRleHQpIHsKICAgICAgICBvYnNlcnZlckNvbnRleHQuZGVz dHJveWVkID0gdHJ1ZTsKICAgICAgICBiZWZvcmVPYnNlcnZlciA9IG9ic2Vy dmVyQ29udGV4dC5iZWZvcmVPYnNlcnZlcjsKICAgICAgICBvYnNlcnZlciA9 IG9ic2VydmVyQ29udGV4dC5vYnNlcnZlcjsKICAgICAgICBpdGVtID0gb2Jz ZXJ2ZXJDb250ZXh0Lml0ZW07CgogICAgICAgIGZvckVhY2goaXRlbVByb3Bl cnR5S2V5cywgZnVuY3Rpb24gKHByb3BlcnR5S2V5KSB7CiAgICAgICAgICBy ZW1vdmVCZWZvcmVPYnNlcnZlcihpdGVtLCBwcm9wZXJ0eUtleSwgZGVwZW5k ZW50QXJyYXlPYnNlcnZlciwgYmVmb3JlT2JzZXJ2ZXIpOwogICAgICAgICAg cmVtb3ZlT2JzZXJ2ZXIoaXRlbSwgcHJvcGVydHlLZXksIGRlcGVuZGVudEFy cmF5T2JzZXJ2ZXIsIG9ic2VydmVyKTsKICAgICAgICB9KTsKICAgICAgfSk7 CiAgICB9KTsKICB9LAoKICBjcmVhdGVQcm9wZXJ0eU9ic2VydmVyQ29udGV4 dDogZnVuY3Rpb24gKGRlcGVuZGVudEFycmF5LCBpbmRleCwgdHJhY2tlZEFy cmF5KSB7CiAgICB2YXIgb2JzZXJ2ZXJDb250ZXh0ID0gbmV3IEl0ZW1Qcm9w ZXJ0eU9ic2VydmVyQ29udGV4dChkZXBlbmRlbnRBcnJheSwgaW5kZXgsIHRy YWNrZWRBcnJheSk7CgogICAgdGhpcy5jcmVhdGVQcm9wZXJ0eU9ic2VydmVy KG9ic2VydmVyQ29udGV4dCk7CgogICAgcmV0dXJuIG9ic2VydmVyQ29udGV4 dDsKICB9LAoKICBjcmVhdGVQcm9wZXJ0eU9ic2VydmVyOiBmdW5jdGlvbiAo b2JzZXJ2ZXJDb250ZXh0KSB7CiAgICB2YXIgZGVwZW5kZW50QXJyYXlPYnNl cnZlciA9IHRoaXM7CgogICAgb2JzZXJ2ZXJDb250ZXh0LmJlZm9yZU9ic2Vy dmVyID0gZnVuY3Rpb24gKG9iaiwga2V5TmFtZSkgewogICAgICByZXR1cm4g ZGVwZW5kZW50QXJyYXlPYnNlcnZlci5pdGVtUHJvcGVydHlXaWxsQ2hhbmdl KG9iaiwga2V5TmFtZSwgb2JzZXJ2ZXJDb250ZXh0LmRlcGVuZGVudEFycmF5 LCBvYnNlcnZlckNvbnRleHQpOwogICAgfTsKICAgIG9ic2VydmVyQ29udGV4 dC5vYnNlcnZlciA9IGZ1bmN0aW9uIChvYmosIGtleU5hbWUpIHsKICAgICAg cmV0dXJuIGRlcGVuZGVudEFycmF5T2JzZXJ2ZXIuaXRlbVByb3BlcnR5RGlk Q2hhbmdlKG9iaiwga2V5TmFtZSwgb2JzZXJ2ZXJDb250ZXh0LmRlcGVuZGVu dEFycmF5LCBvYnNlcnZlckNvbnRleHQpOwogICAgfTsKICB9LAoKICByZXNl dFRyYW5zZm9ybWF0aW9uczogZnVuY3Rpb24gKGRlcGVuZGVudEtleSwgb2Jz ZXJ2ZXJDb250ZXh0cykgewogICAgdGhpcy50cmFja2VkQXJyYXlzQnlHdWlk W2RlcGVuZGVudEtleV0gPSBuZXcgRW1iZXIuVHJhY2tlZEFycmF5KG9ic2Vy dmVyQ29udGV4dHMpOwogIH0sCgogIHRyYWNrQWRkOiBmdW5jdGlvbiAoZGVw ZW5kZW50S2V5LCBpbmRleCwgbmV3SXRlbXMpIHsKICAgIHZhciB0cmFja2Vk QXJyYXkgPSB0aGlzLnRyYWNrZWRBcnJheXNCeUd1aWRbZGVwZW5kZW50S2V5 XTsKICAgIGlmICh0cmFja2VkQXJyYXkpIHsKICAgICAgdHJhY2tlZEFycmF5 LmFkZEl0ZW1zKGluZGV4LCBuZXdJdGVtcyk7CiAgICB9CiAgfSwKCiAgdHJh Y2tSZW1vdmU6IGZ1bmN0aW9uIChkZXBlbmRlbnRLZXksIGluZGV4LCByZW1v dmVkQ291bnQpIHsKICAgIHZhciB0cmFja2VkQXJyYXkgPSB0aGlzLnRyYWNr ZWRBcnJheXNCeUd1aWRbZGVwZW5kZW50S2V5XTsKCiAgICBpZiAodHJhY2tl ZEFycmF5KSB7CiAgICAgIHJldHVybiB0cmFja2VkQXJyYXkucmVtb3ZlSXRl bXMoaW5kZXgsIHJlbW92ZWRDb3VudCk7CiAgICB9CgogICAgcmV0dXJuIFtd OwogIH0sCgogIHVwZGF0ZUluZGV4ZXM6IGZ1bmN0aW9uICh0cmFja2VkQXJy YXksIGFycmF5KSB7CiAgICB2YXIgbGVuZ3RoID0gZ2V0KGFycmF5LCAnbGVu Z3RoJyk7CiAgICAvLyBPUFRJTUlaRTogd2UgY291bGQgc3RvcCB1cGRhdGlu ZyBvbmNlIHdlIGhpdCB0aGUgb2JqZWN0IHdob3NlIG9ic2VydmVyCiAgICAv LyBmaXJlZDsgaWUgcGFydGlhbGx5IGFwcGx5IHRoZSB0cmFuc2Zvcm1hdGlv bnMKICAgIHRyYWNrZWRBcnJheS5hcHBseShmdW5jdGlvbiAob2JzZXJ2ZXJD b250ZXh0cywgb2Zmc2V0LCBvcGVyYXRpb24pIHsKICAgICAgLy8gd2UgZG9u J3QgZXZlbiBoYXZlIG9ic2VydmVyIGNvbnRleHRzIGZvciByZW1vdmVkIGl0 ZW1zLCBldmVuIGlmIHdlIGRpZCwKICAgICAgLy8gdGhleSBubyBsb25nZXIg aGF2ZSBhbnkgaW5kZXggaW4gdGhlIGFycmF5CiAgICAgIGlmIChvcGVyYXRp b24gPT09IEVtYmVyLlRyYWNrZWRBcnJheS5ERUxFVEUpIHsgcmV0dXJuOyB9 CiAgICAgIGlmIChvcGVyYXRpb24gPT09IEVtYmVyLlRyYWNrZWRBcnJheS5S RVRBSU4gJiYgb2JzZXJ2ZXJDb250ZXh0cy5sZW5ndGggPT09IGxlbmd0aCAm JiBvZmZzZXQgPT09IDApIHsKICAgICAgICAvLyBJZiB3ZSB1cGRhdGUgbWFu eSBpdGVtcyB3ZSBkb24ndCB3YW50IHRvIHdhbGsgdGhlIGFycmF5IGVhY2gg dGltZTogd2UKICAgICAgICAvLyBvbmx5IG5lZWQgdG8gdXBkYXRlIHRoZSBp bmRleGVzIGF0IG1vc3Qgb25jZSBwZXIgcnVuIGxvb3AuCiAgICAgICAgcmV0 dXJuOwogICAgICB9CgogICAgICBmb3JFYWNoKG9ic2VydmVyQ29udGV4dHMs IGZ1bmN0aW9uIChjb250ZXh0LCBpbmRleCkgewogICAgICAgIGNvbnRleHQu aW5kZXggPSBpbmRleCArIG9mZnNldDsKICAgICAgfSk7CiAgICB9KTsKICB9 LAoKICBkZXBlbmRlbnRBcnJheVdpbGxDaGFuZ2U6IGZ1bmN0aW9uIChkZXBl bmRlbnRBcnJheSwgaW5kZXgsIHJlbW92ZWRDb3VudCwgYWRkZWRDb3VudCkg ewogICAgaWYgKHRoaXMuc3VzcGVuZGVkKSB7IHJldHVybjsgfQoKICAgIHZh ciByZW1vdmVkSXRlbSA9IHRoaXMuY2FsbGJhY2tzLnJlbW92ZWRJdGVtLAog ICAgICAgIGNoYW5nZU1ldGEsCiAgICAgICAgZ3VpZCA9IGd1aWRGb3IoZGVw ZW5kZW50QXJyYXkpLAogICAgICAgIGRlcGVuZGVudEtleSA9IHRoaXMuZGVw ZW5kZW50S2V5c0J5R3VpZFtndWlkXSwKICAgICAgICBpdGVtUHJvcGVydHlL ZXlzID0gdGhpcy5jcC5faXRlbVByb3BlcnR5S2V5c1tkZXBlbmRlbnRLZXld IHx8IFtdLAogICAgICAgIGxlbmd0aCA9IGdldChkZXBlbmRlbnRBcnJheSwg J2xlbmd0aCcpLAogICAgICAgIG5vcm1hbGl6ZWRJbmRleCA9IG5vcm1hbGl6 ZUluZGV4KGluZGV4LCBsZW5ndGgsIDApLAogICAgICAgIG5vcm1hbGl6ZWRS ZW1vdmVDb3VudCA9IG5vcm1hbGl6ZVJlbW92ZUNvdW50KG5vcm1hbGl6ZWRJ bmRleCwgbGVuZ3RoLCByZW1vdmVkQ291bnQpLAogICAgICAgIGl0ZW0sCiAg ICAgICAgaXRlbUluZGV4LAogICAgICAgIHNsaWNlSW5kZXgsCiAgICAgICAg b2JzZXJ2ZXJDb250ZXh0czsKCiAgICBvYnNlcnZlckNvbnRleHRzID0gdGhp cy50cmFja1JlbW92ZShkZXBlbmRlbnRLZXksIG5vcm1hbGl6ZWRJbmRleCwg bm9ybWFsaXplZFJlbW92ZUNvdW50KTsKCiAgICBmdW5jdGlvbiByZW1vdmVP YnNlcnZlcnMocHJvcGVydHlLZXkpIHsKICAgICAgb2JzZXJ2ZXJDb250ZXh0 c1tzbGljZUluZGV4XS5kZXN0cm95ZWQgPSB0cnVlOwogICAgICByZW1vdmVC ZWZvcmVPYnNlcnZlcihpdGVtLCBwcm9wZXJ0eUtleSwgdGhpcywgb2JzZXJ2 ZXJDb250ZXh0c1tzbGljZUluZGV4XS5iZWZvcmVPYnNlcnZlcik7CiAgICAg IHJlbW92ZU9ic2VydmVyKGl0ZW0sIHByb3BlcnR5S2V5LCB0aGlzLCBvYnNl cnZlckNvbnRleHRzW3NsaWNlSW5kZXhdLm9ic2VydmVyKTsKICAgIH0KCiAg ICBmb3IgKHNsaWNlSW5kZXggPSBub3JtYWxpemVkUmVtb3ZlQ291bnQgLSAx OyBzbGljZUluZGV4ID49IDA7IC0tc2xpY2VJbmRleCkgewogICAgICBpdGVt SW5kZXggPSBub3JtYWxpemVkSW5kZXggKyBzbGljZUluZGV4OwogICAgICBp ZiAoaXRlbUluZGV4ID49IGxlbmd0aCkgeyBicmVhazsgfQoKICAgICAgaXRl bSA9IGRlcGVuZGVudEFycmF5Lm9iamVjdEF0KGl0ZW1JbmRleCk7CgogICAg ICBmb3JFYWNoKGl0ZW1Qcm9wZXJ0eUtleXMsIHJlbW92ZU9ic2VydmVycywg dGhpcyk7CgogICAgICBjaGFuZ2VNZXRhID0gY3JlYXRlQ2hhbmdlTWV0YShk ZXBlbmRlbnRBcnJheSwgaXRlbSwgaXRlbUluZGV4LCB0aGlzLmluc3RhbmNl TWV0YS5wcm9wZXJ0eU5hbWUsIHRoaXMuY3ApOwogICAgICB0aGlzLnNldFZh bHVlKCByZW1vdmVkSXRlbS5jYWxsKAogICAgICAgIHRoaXMuaW5zdGFuY2VN ZXRhLmNvbnRleHQsIHRoaXMuZ2V0VmFsdWUoKSwgaXRlbSwgY2hhbmdlTWV0 YSwgdGhpcy5pbnN0YW5jZU1ldGEuc3VnYXJNZXRhKSk7CiAgICB9CiAgfSwK CiAgZGVwZW5kZW50QXJyYXlEaWRDaGFuZ2U6IGZ1bmN0aW9uIChkZXBlbmRl bnRBcnJheSwgaW5kZXgsIHJlbW92ZWRDb3VudCwgYWRkZWRDb3VudCkgewog ICAgaWYgKHRoaXMuc3VzcGVuZGVkKSB7IHJldHVybjsgfQoKICAgIHZhciBh ZGRlZEl0ZW0gPSB0aGlzLmNhbGxiYWNrcy5hZGRlZEl0ZW0sCiAgICAgICAg Z3VpZCA9IGd1aWRGb3IoZGVwZW5kZW50QXJyYXkpLAogICAgICAgIGRlcGVu ZGVudEtleSA9IHRoaXMuZGVwZW5kZW50S2V5c0J5R3VpZFtndWlkXSwKICAg ICAgICBvYnNlcnZlckNvbnRleHRzID0gbmV3IEFycmF5KGFkZGVkQ291bnQp LAogICAgICAgIGl0ZW1Qcm9wZXJ0eUtleXMgPSB0aGlzLmNwLl9pdGVtUHJv cGVydHlLZXlzW2RlcGVuZGVudEtleV0sCiAgICAgICAgbGVuZ3RoID0gZ2V0 KGRlcGVuZGVudEFycmF5LCAnbGVuZ3RoJyksCiAgICAgICAgbm9ybWFsaXpl ZEluZGV4ID0gbm9ybWFsaXplSW5kZXgoaW5kZXgsIGxlbmd0aCwgYWRkZWRD b3VudCksCiAgICAgICAgY2hhbmdlTWV0YSwKICAgICAgICBvYnNlcnZlckNv bnRleHQ7CgogICAgZm9yRWFjaChkZXBlbmRlbnRBcnJheS5zbGljZShub3Jt YWxpemVkSW5kZXgsIG5vcm1hbGl6ZWRJbmRleCArIGFkZGVkQ291bnQpLCBm dW5jdGlvbiAoaXRlbSwgc2xpY2VJbmRleCkgewogICAgICBpZiAoaXRlbVBy b3BlcnR5S2V5cykgewogICAgICAgIG9ic2VydmVyQ29udGV4dCA9CiAgICAg ICAgICBvYnNlcnZlckNvbnRleHRzW3NsaWNlSW5kZXhdID0KICAgICAgICAg IHRoaXMuY3JlYXRlUHJvcGVydHlPYnNlcnZlckNvbnRleHQoZGVwZW5kZW50 QXJyYXksIG5vcm1hbGl6ZWRJbmRleCArIHNsaWNlSW5kZXgsIHRoaXMudHJh Y2tlZEFycmF5c0J5R3VpZFtkZXBlbmRlbnRLZXldKTsKICAgICAgICBmb3JF YWNoKGl0ZW1Qcm9wZXJ0eUtleXMsIGZ1bmN0aW9uIChwcm9wZXJ0eUtleSkg ewogICAgICAgICAgYWRkQmVmb3JlT2JzZXJ2ZXIoaXRlbSwgcHJvcGVydHlL ZXksIHRoaXMsIG9ic2VydmVyQ29udGV4dC5iZWZvcmVPYnNlcnZlcik7CiAg ICAgICAgICBhZGRPYnNlcnZlcihpdGVtLCBwcm9wZXJ0eUtleSwgdGhpcywg b2JzZXJ2ZXJDb250ZXh0Lm9ic2VydmVyKTsKICAgICAgICB9LCB0aGlzKTsK ICAgICAgfQoKICAgICAgY2hhbmdlTWV0YSA9IGNyZWF0ZUNoYW5nZU1ldGEo ZGVwZW5kZW50QXJyYXksIGl0ZW0sIG5vcm1hbGl6ZWRJbmRleCArIHNsaWNl SW5kZXgsIHRoaXMuaW5zdGFuY2VNZXRhLnByb3BlcnR5TmFtZSwgdGhpcy5j cCk7CiAgICAgIHRoaXMuc2V0VmFsdWUoIGFkZGVkSXRlbS5jYWxsKAogICAg ICAgIHRoaXMuaW5zdGFuY2VNZXRhLmNvbnRleHQsIHRoaXMuZ2V0VmFsdWUo KSwgaXRlbSwgY2hhbmdlTWV0YSwgdGhpcy5pbnN0YW5jZU1ldGEuc3VnYXJN ZXRhKSk7CiAgICB9LCB0aGlzKTsKCiAgICB0aGlzLnRyYWNrQWRkKGRlcGVu ZGVudEtleSwgbm9ybWFsaXplZEluZGV4LCBvYnNlcnZlckNvbnRleHRzKTsK ICB9LAoKICBpdGVtUHJvcGVydHlXaWxsQ2hhbmdlOiBmdW5jdGlvbiAob2Jq LCBrZXlOYW1lLCBhcnJheSwgb2JzZXJ2ZXJDb250ZXh0KSB7CiAgICB2YXIg Z3VpZCA9IGd1aWRGb3Iob2JqKTsKCiAgICBpZiAoIXRoaXMuY2hhbmdlZEl0 ZW1zW2d1aWRdKSB7CiAgICAgIHRoaXMuY2hhbmdlZEl0ZW1zW2d1aWRdID0g ewogICAgICAgIGFycmF5OiAgICAgICAgICAgIGFycmF5LAogICAgICAgIG9i c2VydmVyQ29udGV4dDogIG9ic2VydmVyQ29udGV4dCwKICAgICAgICBvYmo6 ICAgICAgICAgICAgICBvYmosCiAgICAgICAgcHJldmlvdXNWYWx1ZXM6ICAg e30KICAgICAgfTsKICAgIH0KCiAgICB0aGlzLmNoYW5nZWRJdGVtc1tndWlk XS5wcmV2aW91c1ZhbHVlc1trZXlOYW1lXSA9IGdldChvYmosIGtleU5hbWUp OwogIH0sCgogIGl0ZW1Qcm9wZXJ0eURpZENoYW5nZTogZnVuY3Rpb24ob2Jq LCBrZXlOYW1lLCBhcnJheSwgb2JzZXJ2ZXJDb250ZXh0KSB7CiAgICB0aGlz LmZsdXNoQ2hhbmdlcygpOwogIH0sCgogIGZsdXNoQ2hhbmdlczogZnVuY3Rp b24oKSB7CiAgICB2YXIgY2hhbmdlZEl0ZW1zID0gdGhpcy5jaGFuZ2VkSXRl bXMsIGtleSwgYywgY2hhbmdlTWV0YTsKCiAgICBmb3IgKGtleSBpbiBjaGFu Z2VkSXRlbXMpIHsKICAgICAgYyA9IGNoYW5nZWRJdGVtc1trZXldOwogICAg ICBpZiAoYy5vYnNlcnZlckNvbnRleHQuZGVzdHJveWVkKSB7IGNvbnRpbnVl OyB9CgogICAgICB0aGlzLnVwZGF0ZUluZGV4ZXMoYy5vYnNlcnZlckNvbnRl eHQudHJhY2tlZEFycmF5LCBjLm9ic2VydmVyQ29udGV4dC5kZXBlbmRlbnRB cnJheSk7CgogICAgICBjaGFuZ2VNZXRhID0gY3JlYXRlQ2hhbmdlTWV0YShj LmFycmF5LCBjLm9iaiwgYy5vYnNlcnZlckNvbnRleHQuaW5kZXgsIHRoaXMu aW5zdGFuY2VNZXRhLnByb3BlcnR5TmFtZSwgdGhpcy5jcCwgYy5wcmV2aW91 c1ZhbHVlcyk7CiAgICAgIHRoaXMuc2V0VmFsdWUoCiAgICAgICAgdGhpcy5j YWxsYmFja3MucmVtb3ZlZEl0ZW0uY2FsbCh0aGlzLmluc3RhbmNlTWV0YS5j b250ZXh0LCB0aGlzLmdldFZhbHVlKCksIGMub2JqLCBjaGFuZ2VNZXRhLCB0 aGlzLmluc3RhbmNlTWV0YS5zdWdhck1ldGEpKTsKICAgICAgdGhpcy5zZXRW YWx1ZSgKICAgICAgICB0aGlzLmNhbGxiYWNrcy5hZGRlZEl0ZW0uY2FsbCh0 aGlzLmluc3RhbmNlTWV0YS5jb250ZXh0LCB0aGlzLmdldFZhbHVlKCksIGMu b2JqLCBjaGFuZ2VNZXRhLCB0aGlzLmluc3RhbmNlTWV0YS5zdWdhck1ldGEp KTsKICAgIH0KICAgIHRoaXMuY2hhbmdlZEl0ZW1zID0ge307CiAgfQp9OwoK ZnVuY3Rpb24gbm9ybWFsaXplSW5kZXgoaW5kZXgsIGxlbmd0aCwgbmV3SXRl bXNPZmZzZXQpIHsKICBpZiAoaW5kZXggPCAwKSB7CiAgICByZXR1cm4gTWF0 aC5tYXgoMCwgbGVuZ3RoICsgaW5kZXgpOwogIH0gZWxzZSBpZiAoaW5kZXgg PCBsZW5ndGgpIHsKICAgIHJldHVybiBpbmRleDsKICB9IGVsc2UgLyogaW5k ZXggPiBsZW5ndGggKi8gewogICAgcmV0dXJuIE1hdGgubWluKGxlbmd0aCAt IG5ld0l0ZW1zT2Zmc2V0LCBpbmRleCk7CiAgfQp9CgpmdW5jdGlvbiBub3Jt YWxpemVSZW1vdmVDb3VudChpbmRleCwgbGVuZ3RoLCByZW1vdmVkQ291bnQp IHsKICByZXR1cm4gTWF0aC5taW4ocmVtb3ZlZENvdW50LCBsZW5ndGggLSBp bmRleCk7Cn0KCmZ1bmN0aW9uIGNyZWF0ZUNoYW5nZU1ldGEoZGVwZW5kZW50 QXJyYXksIGl0ZW0sIGluZGV4LCBwcm9wZXJ0eU5hbWUsIHByb3BlcnR5LCBw cmV2aW91c1ZhbHVlcykgewogIHZhciBtZXRhID0gewogICAgYXJyYXlDaGFu Z2VkOiBkZXBlbmRlbnRBcnJheSwKICAgIGluZGV4OiBpbmRleCwKICAgIGl0 ZW06IGl0ZW0sCiAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSwKICAg IHByb3BlcnR5OiBwcm9wZXJ0eQogIH07CgogIGlmIChwcmV2aW91c1ZhbHVl cykgewogICAgLy8gcHJldmlvdXMgdmFsdWVzIG9ubHkgYXZhaWxhYmxlIGZv ciBpdGVtIHByb3BlcnR5IGNoYW5nZXMKICAgIG1ldGEucHJldmlvdXNWYWx1 ZXMgPSBwcmV2aW91c1ZhbHVlczsKICB9CgogIHJldHVybiBtZXRhOwp9Cgpm dW5jdGlvbiBhZGRJdGVtcyAoZGVwZW5kZW50QXJyYXksIGNhbGxiYWNrcywg Y3AsIHByb3BlcnR5TmFtZSwgbWV0YSkgewogIGZvckVhY2goZGVwZW5kZW50 QXJyYXksIGZ1bmN0aW9uIChpdGVtLCBpbmRleCkgewogICAgbWV0YS5zZXRW YWx1ZSggY2FsbGJhY2tzLmFkZGVkSXRlbS5jYWxsKAogICAgICB0aGlzLCBt ZXRhLmdldFZhbHVlKCksIGl0ZW0sIGNyZWF0ZUNoYW5nZU1ldGEoZGVwZW5k ZW50QXJyYXksIGl0ZW0sIGluZGV4LCBwcm9wZXJ0eU5hbWUsIGNwKSwgbWV0 YS5zdWdhck1ldGEpKTsKICB9LCB0aGlzKTsKfQoKZnVuY3Rpb24gcmVzZXQo Y3AsIHByb3BlcnR5TmFtZSkgewogIHZhciBjYWxsYmFja3MgPSBjcC5fY2Fs bGJhY2tzKCksCiAgICAgIG1ldGE7CgogIGlmIChjcC5faGFzSW5zdGFuY2VN ZXRhKHRoaXMsIHByb3BlcnR5TmFtZSkpIHsKICAgIG1ldGEgPSBjcC5faW5z dGFuY2VNZXRhKHRoaXMsIHByb3BlcnR5TmFtZSk7CiAgICBtZXRhLnNldFZh bHVlKGNwLnJlc2V0VmFsdWUobWV0YS5nZXRWYWx1ZSgpKSk7CiAgfSBlbHNl IHsKICAgIG1ldGEgPSBjcC5faW5zdGFuY2VNZXRhKHRoaXMsIHByb3BlcnR5 TmFtZSk7CiAgfQoKICBpZiAoY3Aub3B0aW9ucy5pbml0aWFsaXplKSB7CiAg ICBjcC5vcHRpb25zLmluaXRpYWxpemUuY2FsbCh0aGlzLCBtZXRhLmdldFZh bHVlKCksIHsgcHJvcGVydHk6IGNwLCBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5 TmFtZSB9LCBtZXRhLnN1Z2FyTWV0YSk7CiAgfQp9CgpmdW5jdGlvbiBwYXJ0 aWFsbHlSZWNvbXB1dGVGb3Iob2JqLCBkZXBlbmRlbnRLZXkpIHsKICBpZiAo YXJyYXlCcmFja2V0UGF0dGVybi50ZXN0KGRlcGVuZGVudEtleSkpIHsKICAg IHJldHVybiBmYWxzZTsKICB9CgogIHZhciB2YWx1ZSA9IGdldChvYmosIGRl cGVuZGVudEtleSk7CiAgcmV0dXJuIEVtYmVyLkFycmF5LmRldGVjdCh2YWx1 ZSk7Cn0KCmZ1bmN0aW9uIFJlZHVjZUNvbXB1dGVkUHJvcGVydHlJbnN0YW5j ZU1ldGEoY29udGV4dCwgcHJvcGVydHlOYW1lLCBpbml0aWFsVmFsdWUpIHsK ICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwogIHRoaXMucHJvcGVydHlOYW1l ID0gcHJvcGVydHlOYW1lOwogIHRoaXMuY2FjaGUgPSBtZXRhRm9yKGNvbnRl eHQpLmNhY2hlOwoKICB0aGlzLmRlcGVuZGVudEFycmF5cyA9IHt9OwogIHRo aXMuc3VnYXJNZXRhID0ge307CgogIHRoaXMuaW5pdGlhbFZhbHVlID0gaW5p dGlhbFZhbHVlOwp9CgpSZWR1Y2VDb21wdXRlZFByb3BlcnR5SW5zdGFuY2VN ZXRhLnByb3RvdHlwZSA9IHsKICBnZXRWYWx1ZTogZnVuY3Rpb24gKCkgewog ICAgaWYgKHRoaXMucHJvcGVydHlOYW1lIGluIHRoaXMuY2FjaGUpIHsKICAg ICAgcmV0dXJuIHRoaXMuY2FjaGVbdGhpcy5wcm9wZXJ0eU5hbWVdOwogICAg fSBlbHNlIHsKICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhbFZhbHVlOwogICAg fQogIH0sCgogIHNldFZhbHVlOiBmdW5jdGlvbihuZXdWYWx1ZSwgdHJpZ2dl ck9ic2VydmVycykgewogICAgLy8gVGhpcyBsZXRzIHN1Z2FycyBmb3JjZSBh IHJlY29tcHV0YXRpb24sIGhhbmR5IGZvciB2ZXJ5IHNpbXBsZQogICAgLy8g aW1wbGVtZW50YXRpb25zIG9mIGVnIG1heC4KICAgIGlmIChuZXdWYWx1ZSA9 PT0gdGhpcy5jYWNoZVt0aGlzLnByb3BlcnR5TmFtZV0pIHsKICAgICAgcmV0 dXJuOwogICAgfQoKICAgIGlmICh0cmlnZ2VyT2JzZXJ2ZXJzKSB7CiAgICAg IHByb3BlcnR5V2lsbENoYW5nZSh0aGlzLmNvbnRleHQsIHRoaXMucHJvcGVy dHlOYW1lKTsKICAgIH0KCiAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5l ZCkgewogICAgICBkZWxldGUgdGhpcy5jYWNoZVt0aGlzLnByb3BlcnR5TmFt ZV07CiAgICB9IGVsc2UgewogICAgICB0aGlzLmNhY2hlW3RoaXMucHJvcGVy dHlOYW1lXSA9IG5ld1ZhbHVlOwogICAgfQoKICAgIGlmICh0cmlnZ2VyT2Jz ZXJ2ZXJzKSB7CiAgICAgIHByb3BlcnR5RGlkQ2hhbmdlKHRoaXMuY29udGV4 dCwgdGhpcy5wcm9wZXJ0eU5hbWUpOwogICAgfQogIH0KfTsKCi8qKgogIEEg Y29tcHV0ZWQgcHJvcGVydHkgd2hvc2UgZGVwZW5kZW50IGtleXMgYXJlIGFy cmF5cyBhbmQgd2hpY2ggaXMgdXBkYXRlZCB3aXRoCiAgIm9uZSBhdCBhIHRp bWUiIHNlbWFudGljcy4KCiAgQGNsYXNzIFJlZHVjZUNvbXB1dGVkUHJvcGVy dHkKICBAbmFtZXNwYWNlIEVtYmVyCiAgQGV4dGVuZHMgRW1iZXIuQ29tcHV0 ZWRQcm9wZXJ0eQogIEBjb25zdHJ1Y3RvcgoqLwpmdW5jdGlvbiBSZWR1Y2VD b21wdXRlZFByb3BlcnR5KG9wdGlvbnMpIHsKICB2YXIgY3AgPSB0aGlzOwoK ICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwogIHRoaXMuX2luc3RhbmNlTWV0 YXMgPSB7fTsKCiAgdGhpcy5fZGVwZW5kZW50S2V5cyA9IG51bGw7CiAgLy8g QSBtYXAgb2YgZGVwZW5kZW50S2V5IC0+IFtpdGVtUHJvcGVydHksIC4uLl0g dGhhdCB0cmFja3Mgd2hhdCBwcm9wZXJ0aWVzIG9mCiAgLy8gaXRlbXMgaW4g dGhlIGFycmF5IHdlIG11c3QgdHJhY2sgdG8gdXBkYXRlIHRoaXMgcHJvcGVy dHkuCiAgdGhpcy5faXRlbVByb3BlcnR5S2V5cyA9IHt9OwogIHRoaXMuX3By ZXZpb3VzSXRlbVByb3BlcnR5S2V5cyA9IHt9OwoKICB0aGlzLnJlYWRPbmx5 KCk7CiAgdGhpcy5jYWNoZWFibGUoKTsKCiAgdGhpcy5yZWNvbXB1dGVPbmNl ID0gZnVuY3Rpb24ocHJvcGVydHlOYW1lKSB7CiAgICAvLyBXaGF0IHdlIHJl YWxseSB3YW50IHRvIGRvIGlzIGNvYWxlc2NlIGJ5IDxjcCwgcHJvcGVydHlO YW1lPi4KICAgIC8vIFdlIG5lZWQgYSBmb3JtIG9mIGBzY2hlZHVsZU9uY2Vg IHRoYXQgYWNjZXB0cyBhbiBhcmJpdHJhcnkgdG9rZW4gdG8KICAgIC8vIGNv YWxlc2NlIGJ5LCBpbiBhZGRpdGlvbiB0byB0aGUgdGFyZ2V0IGFuZCBtZXRo b2QuCiAgICBFbWJlci5ydW4ub25jZSh0aGlzLCByZWNvbXB1dGUsIHByb3Bl cnR5TmFtZSk7CiAgfTsKICB2YXIgcmVjb21wdXRlID0gZnVuY3Rpb24ocHJv cGVydHlOYW1lKSB7CiAgICB2YXIgZGVwZW5kZW50S2V5cyA9IGNwLl9kZXBl bmRlbnRLZXlzLAogICAgICAgIG1ldGEgPSBjcC5faW5zdGFuY2VNZXRhKHRo aXMsIHByb3BlcnR5TmFtZSksCiAgICAgICAgY2FsbGJhY2tzID0gY3AuX2Nh bGxiYWNrcygpOwoKICAgIHJlc2V0LmNhbGwodGhpcywgY3AsIHByb3BlcnR5 TmFtZSk7CgogICAgbWV0YS5kZXBlbmRlbnRBcnJheXNPYnNlcnZlci5zdXNw ZW5kQXJyYXlPYnNlcnZlcnMoZnVuY3Rpb24gKCkgewogICAgICBmb3JFYWNo KGNwLl9kZXBlbmRlbnRLZXlzLCBmdW5jdGlvbiAoZGVwZW5kZW50S2V5KSB7 CiAgICAgICAgRW1iZXIuYXNzZXJ0KAogICAgICAgICAgImRlcGVuZGVudCBh cnJheSAiICsgZGVwZW5kZW50S2V5ICsgIiBtdXN0IGJlIGFuIGBFbWJlci5B cnJheWAuICAiICsKICAgICAgICAgICJJZiB5b3UgYXJlIG5vdCBleHRlbmRp bmcgYXJyYXlzLCB5b3Ugd2lsbCBuZWVkIHRvIHdyYXAgbmF0aXZlIGFycmF5 cyB3aXRoIGBFbWJlci5BYCIsCiAgICAgICAgICAhKEVtYmVyLmlzQXJyYXko Z2V0KHRoaXMsIGRlcGVuZGVudEtleSkpICYmICFFbWJlci5BcnJheS5kZXRl Y3QoZ2V0KHRoaXMsIGRlcGVuZGVudEtleSkpKSk7CgogICAgICAgIGlmICgh cGFydGlhbGx5UmVjb21wdXRlRm9yKHRoaXMsIGRlcGVuZGVudEtleSkpIHsg cmV0dXJuOyB9CgogICAgICAgIHZhciBkZXBlbmRlbnRBcnJheSA9IGdldCh0 aGlzLCBkZXBlbmRlbnRLZXkpLAogICAgICAgICAgICBwcmV2aW91c0RlcGVu ZGVudEFycmF5ID0gbWV0YS5kZXBlbmRlbnRBcnJheXNbZGVwZW5kZW50S2V5 XTsKCiAgICAgICAgaWYgKGRlcGVuZGVudEFycmF5ID09PSBwcmV2aW91c0Rl cGVuZGVudEFycmF5KSB7CiAgICAgICAgICAvLyBUaGUgYXJyYXkgbWF5IGJl IHRoZSBzYW1lLCBidXQgb3VyIGl0ZW0gcHJvcGVydHkga2V5cyBtYXkgaGF2 ZQogICAgICAgICAgLy8gY2hhbmdlZCwgc28gd2Ugc2V0IHRoZW0gdXAgYWdh aW4uICBXZSBjYW4ndCBlYXNpbHkgdGVsbCBpZiB0aGV5J3ZlCiAgICAgICAg ICAvLyBjaGFuZ2VkOiB0aGUgYXJyYXkgbWF5IGJlIHRoZSBzYW1lIG9iamVj dCwgYnV0IHdpdGggZGlmZmVyZW50CiAgICAgICAgICAvLyBjb250ZW50cy4K ICAgICAgICAgIGlmIChjcC5fcHJldmlvdXNJdGVtUHJvcGVydHlLZXlzW2Rl cGVuZGVudEtleV0pIHsKICAgICAgICAgICAgZGVsZXRlIGNwLl9wcmV2aW91 c0l0ZW1Qcm9wZXJ0eUtleXNbZGVwZW5kZW50S2V5XTsKICAgICAgICAgICAg bWV0YS5kZXBlbmRlbnRBcnJheXNPYnNlcnZlci5zZXR1cFByb3BlcnR5T2Jz ZXJ2ZXJzKGRlcGVuZGVudEtleSwgY3AuX2l0ZW1Qcm9wZXJ0eUtleXNbZGVw ZW5kZW50S2V5XSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAg ICAgICAgIG1ldGEuZGVwZW5kZW50QXJyYXlzW2RlcGVuZGVudEtleV0gPSBk ZXBlbmRlbnRBcnJheTsKCiAgICAgICAgICBpZiAocHJldmlvdXNEZXBlbmRl bnRBcnJheSkgewogICAgICAgICAgICBtZXRhLmRlcGVuZGVudEFycmF5c09i c2VydmVyLnRlYXJkb3duT2JzZXJ2ZXJzKHByZXZpb3VzRGVwZW5kZW50QXJy YXksIGRlcGVuZGVudEtleSk7CiAgICAgICAgICB9CgogICAgICAgICAgaWYg KGRlcGVuZGVudEFycmF5KSB7CiAgICAgICAgICAgIG1ldGEuZGVwZW5kZW50 QXJyYXlzT2JzZXJ2ZXIuc2V0dXBPYnNlcnZlcnMoZGVwZW5kZW50QXJyYXks IGRlcGVuZGVudEtleSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9 LCB0aGlzKTsKICAgIH0sIHRoaXMpOwoKICAgIGZvckVhY2goY3AuX2RlcGVu ZGVudEtleXMsIGZ1bmN0aW9uKGRlcGVuZGVudEtleSkgewogICAgICBpZiAo IXBhcnRpYWxseVJlY29tcHV0ZUZvcih0aGlzLCBkZXBlbmRlbnRLZXkpKSB7 IHJldHVybjsgfQoKICAgICAgdmFyIGRlcGVuZGVudEFycmF5ID0gZ2V0KHRo aXMsIGRlcGVuZGVudEtleSk7CiAgICAgIGlmIChkZXBlbmRlbnRBcnJheSkg ewogICAgICAgIGFkZEl0ZW1zLmNhbGwodGhpcywgZGVwZW5kZW50QXJyYXks IGNhbGxiYWNrcywgY3AsIHByb3BlcnR5TmFtZSwgbWV0YSk7CiAgICAgIH0K ICAgIH0sIHRoaXMpOwogIH07CgoKICB0aGlzLmZ1bmMgPSBmdW5jdGlvbiAo cHJvcGVydHlOYW1lKSB7CiAgICBFbWJlci5hc3NlcnQoIkNvbXB1dGVkIHJl ZHVjZSB2YWx1ZXMgcmVxdWlyZSBhdCBsZWFzdCBvbmUgZGVwZW5kZW50IGtl eSIsIGNwLl9kZXBlbmRlbnRLZXlzKTsKCiAgICByZWNvbXB1dGUuY2FsbCh0 aGlzLCBwcm9wZXJ0eU5hbWUpOwoKICAgIHJldHVybiBjcC5faW5zdGFuY2VN ZXRhKHRoaXMsIHByb3BlcnR5TmFtZSkuZ2V0VmFsdWUoKTsKICB9Owp9CgpF bWJlci5SZWR1Y2VDb21wdXRlZFByb3BlcnR5ID0gUmVkdWNlQ29tcHV0ZWRQ cm9wZXJ0eTsKUmVkdWNlQ29tcHV0ZWRQcm9wZXJ0eS5wcm90b3R5cGUgPSBv X2NyZWF0ZShDb21wdXRlZFByb3BlcnR5LnByb3RvdHlwZSk7CgpmdW5jdGlv biBkZWZhdWx0Q2FsbGJhY2soY29tcHV0ZWRWYWx1ZSkgewogIHJldHVybiBj b21wdXRlZFZhbHVlOwp9CgpSZWR1Y2VDb21wdXRlZFByb3BlcnR5LnByb3Rv dHlwZS5fY2FsbGJhY2tzID0gZnVuY3Rpb24gKCkgewogIGlmICghdGhpcy5j YWxsYmFja3MpIHsKICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOwog ICAgdGhpcy5jYWxsYmFja3MgPSB7CiAgICAgIHJlbW92ZWRJdGVtOiBvcHRp b25zLnJlbW92ZWRJdGVtIHx8IGRlZmF1bHRDYWxsYmFjaywKICAgICAgYWRk ZWRJdGVtOiBvcHRpb25zLmFkZGVkSXRlbSB8fCBkZWZhdWx0Q2FsbGJhY2sK ICAgIH07CiAgfQogIHJldHVybiB0aGlzLmNhbGxiYWNrczsKfTsKClJlZHVj ZUNvbXB1dGVkUHJvcGVydHkucHJvdG90eXBlLl9oYXNJbnN0YW5jZU1ldGEg PSBmdW5jdGlvbiAoY29udGV4dCwgcHJvcGVydHlOYW1lKSB7CiAgdmFyIGd1 aWQgPSBndWlkRm9yKGNvbnRleHQpLAogICAgICBrZXkgPSBndWlkICsgJzon ICsgcHJvcGVydHlOYW1lOwoKICByZXR1cm4gISF0aGlzLl9pbnN0YW5jZU1l dGFzW2tleV07Cn07CgpSZWR1Y2VDb21wdXRlZFByb3BlcnR5LnByb3RvdHlw ZS5faW5zdGFuY2VNZXRhID0gZnVuY3Rpb24gKGNvbnRleHQsIHByb3BlcnR5 TmFtZSkgewogIHZhciBndWlkID0gZ3VpZEZvcihjb250ZXh0KSwKICAgICAg a2V5ID0gZ3VpZCArICc6JyArIHByb3BlcnR5TmFtZSwKICAgICAgbWV0YSA9 IHRoaXMuX2luc3RhbmNlTWV0YXNba2V5XTsKCiAgaWYgKCFtZXRhKSB7CiAg ICBtZXRhID0gdGhpcy5faW5zdGFuY2VNZXRhc1trZXldID0gbmV3IFJlZHVj ZUNvbXB1dGVkUHJvcGVydHlJbnN0YW5jZU1ldGEoY29udGV4dCwgcHJvcGVy dHlOYW1lLCB0aGlzLmluaXRpYWxWYWx1ZSgpKTsKICAgIG1ldGEuZGVwZW5k ZW50QXJyYXlzT2JzZXJ2ZXIgPSBuZXcgRGVwZW5kZW50QXJyYXlzT2JzZXJ2 ZXIodGhpcy5fY2FsbGJhY2tzKCksIHRoaXMsIG1ldGEsIGNvbnRleHQsIHBy b3BlcnR5TmFtZSwgbWV0YS5zdWdhck1ldGEpOwogIH0KCiAgcmV0dXJuIG1l dGE7Cn07CgpSZWR1Y2VDb21wdXRlZFByb3BlcnR5LnByb3RvdHlwZS5pbml0 aWFsVmFsdWUgPSBmdW5jdGlvbiAoKSB7CiAgaWYgKHR5cGVvZiB0aGlzLm9w dGlvbnMuaW5pdGlhbFZhbHVlID09PSAnZnVuY3Rpb24nKSB7CiAgICByZXR1 cm4gdGhpcy5vcHRpb25zLmluaXRpYWxWYWx1ZSgpOwogIH0KICBlbHNlIHsK ICAgIHJldHVybiB0aGlzLm9wdGlvbnMuaW5pdGlhbFZhbHVlOwogIH0KfTsK ClJlZHVjZUNvbXB1dGVkUHJvcGVydHkucHJvdG90eXBlLnJlc2V0VmFsdWUg PSBmdW5jdGlvbiAodmFsdWUpIHsKICByZXR1cm4gdGhpcy5pbml0aWFsVmFs dWUoKTsKfTsKClJlZHVjZUNvbXB1dGVkUHJvcGVydHkucHJvdG90eXBlLml0 ZW1Qcm9wZXJ0eUtleSA9IGZ1bmN0aW9uIChkZXBlbmRlbnRBcnJheUtleSwg aXRlbVByb3BlcnR5S2V5KSB7CiAgdGhpcy5faXRlbVByb3BlcnR5S2V5c1tk ZXBlbmRlbnRBcnJheUtleV0gPSB0aGlzLl9pdGVtUHJvcGVydHlLZXlzW2Rl cGVuZGVudEFycmF5S2V5XSB8fCBbXTsKICB0aGlzLl9pdGVtUHJvcGVydHlL ZXlzW2RlcGVuZGVudEFycmF5S2V5XS5wdXNoKGl0ZW1Qcm9wZXJ0eUtleSk7 Cn07CgpSZWR1Y2VDb21wdXRlZFByb3BlcnR5LnByb3RvdHlwZS5jbGVhckl0 ZW1Qcm9wZXJ0eUtleXMgPSBmdW5jdGlvbiAoZGVwZW5kZW50QXJyYXlLZXkp IHsKICBpZiAodGhpcy5faXRlbVByb3BlcnR5S2V5c1tkZXBlbmRlbnRBcnJh eUtleV0pIHsKICAgIHRoaXMuX3ByZXZpb3VzSXRlbVByb3BlcnR5S2V5c1tk ZXBlbmRlbnRBcnJheUtleV0gPSB0aGlzLl9pdGVtUHJvcGVydHlLZXlzW2Rl cGVuZGVudEFycmF5S2V5XTsKICAgIHRoaXMuX2l0ZW1Qcm9wZXJ0eUtleXNb ZGVwZW5kZW50QXJyYXlLZXldID0gW107CiAgfQp9OwoKUmVkdWNlQ29tcHV0 ZWRQcm9wZXJ0eS5wcm90b3R5cGUucHJvcGVydHkgPSBmdW5jdGlvbiAoKSB7 CiAgdmFyIGNwID0gdGhpcywKICAgICAgYXJncyA9IGFfc2xpY2UuY2FsbChh cmd1bWVudHMpLAogICAgICBwcm9wZXJ0eUFyZ3MgPSBuZXcgRW1iZXIuU2V0 KCksCiAgICAgIG1hdGNoLAogICAgICBkZXBlbmRlbnRBcnJheUtleSwKICAg ICAgaXRlbVByb3BlcnR5S2V5OwoKICBmb3JFYWNoKGFyZ3MsIGZ1bmN0aW9u IChkZXBlbmRlbnRLZXkpIHsKICAgIGlmIChkb3VibGVFYWNoUHJvcGVydHlQ YXR0ZXJuLnRlc3QoZGVwZW5kZW50S2V5KSkgewogICAgICB0aHJvdyBuZXcg RW1iZXIuRXJyb3IoIk5lc3RlZCBAZWFjaCBwcm9wZXJ0aWVzIG5vdCBzdXBw b3J0ZWQ6ICIgKyBkZXBlbmRlbnRLZXkpOwogICAgfSBlbHNlIGlmIChtYXRj aCA9IGVhY2hQcm9wZXJ0eVBhdHRlcm4uZXhlYyhkZXBlbmRlbnRLZXkpKSB7 CiAgICAgIGRlcGVuZGVudEFycmF5S2V5ID0gbWF0Y2hbMV07CgogICAgICB2 YXIgaXRlbVByb3BlcnR5S2V5UGF0dGVybiA9IG1hdGNoWzJdLAogICAgICAg ICAgYWRkSXRlbVByb3BlcnR5S2V5ID0gZnVuY3Rpb24gKGl0ZW1Qcm9wZXJ0 eUtleSkgewogICAgICAgICAgICBjcC5pdGVtUHJvcGVydHlLZXkoZGVwZW5k ZW50QXJyYXlLZXksIGl0ZW1Qcm9wZXJ0eUtleSk7CiAgICAgICAgICB9OwoK ICAgICAgZXhwYW5kUHJvcGVydGllcyhpdGVtUHJvcGVydHlLZXlQYXR0ZXJu LCBhZGRJdGVtUHJvcGVydHlLZXkpOwogICAgICBwcm9wZXJ0eUFyZ3MuYWRk KGRlcGVuZGVudEFycmF5S2V5KTsKICAgIH0gZWxzZSB7CiAgICAgIHByb3Bl cnR5QXJncy5hZGQoZGVwZW5kZW50S2V5KTsKICAgIH0KICB9KTsKCiAgcmV0 dXJuIENvbXB1dGVkUHJvcGVydHkucHJvdG90eXBlLnByb3BlcnR5LmFwcGx5 KHRoaXMsIHByb3BlcnR5QXJncy50b0FycmF5KCkpOwoKfTsKCi8qKgogIENy ZWF0ZXMgYSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCBvcGVyYXRlcyBvbiBk ZXBlbmRlbnQgYXJyYXlzIGFuZAogIGlzIHVwZGF0ZWQgd2l0aCAib25lIGF0 IGEgdGltZSIgc2VtYW50aWNzLiBXaGVuIGl0ZW1zIGFyZSBhZGRlZCBvcgog IHJlbW92ZWQgZnJvbSB0aGUgZGVwZW5kZW50IGFycmF5KHMpIGEgcmVkdWNl IGNvbXB1dGVkIG9ubHkgb3BlcmF0ZXMKICBvbiB0aGUgY2hhbmdlIGluc3Rl YWQgb2YgcmUtZXZhbHVhdGluZyB0aGUgZW50aXJlIGFycmF5LgoKICBJZiB0 aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudHMgdGhlIGZpcnN0IGFy Z3VtZW50cyBhcmUKICBjb25zaWRlcmVkIHRvIGJlIGRlcGVuZGVudCBwcm9w ZXJ0eSBrZXlzLiBUaGUgbGFzdCBhcmd1bWVudCBpcwogIHJlcXVpcmVkIHRv IGJlIGFuIG9wdGlvbnMgb2JqZWN0LiBUaGUgb3B0aW9ucyBvYmplY3QgY2Fu IGhhdmUgdGhlCiAgZm9sbG93aW5nIGZvdXIgcHJvcGVydGllczoKCiAgYGlu aXRpYWxWYWx1ZWAgLSBBIHZhbHVlIG9yIGZ1bmN0aW9uIHRoYXQgd2lsbCBi ZSB1c2VkIGFzIHRoZSBpbml0aWFsCiAgdmFsdWUgZm9yIHRoZSBjb21wdXRl ZC4gSWYgdGhpcyBwcm9wZXJ0eSBpcyBhIGZ1bmN0aW9uIHRoZSByZXN1bHQg b2YgY2FsbGluZwogIHRoZSBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgYXMgdGhl IGluaXRpYWwgdmFsdWUuIFRoaXMgcHJvcGVydHkgaXMgcmVxdWlyZWQuCgog IGBpbml0aWFsaXplYCAtIEFuIG9wdGlvbmFsIGluaXRpYWxpemUgZnVuY3Rp b24uIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgdXNlZAogIHRvIHNldCB1cCBz dGF0ZSBvbiB0aGUgaW5zdGFuY2VNZXRhIG9iamVjdC4KCiAgYHJlbW92ZWRJ dGVtYCAtIEEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgZWFjaCB0aW1lIGFu IGVsZW1lbnQgaXMgcmVtb3ZlZAogIGZyb20gdGhlIGFycmF5LgoKICBgYWRk ZWRJdGVtYCAtIEEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgZWFjaCB0aW1l IGFuIGVsZW1lbnQgaXMgYWRkZWQgdG8KICB0aGUgYXJyYXkuCgoKICBUaGUg YGluaXRpYWxpemVgIGZ1bmN0aW9uIGhhcyB0aGUgZm9sbG93aW5nIHNpZ25h dHVyZToKCiAgYGBgamF2YXNjcmlwdAogICBmdW5jdGlvbiAoaW5pdGlhbFZh bHVlLCBjaGFuZ2VNZXRhLCBpbnN0YW5jZU1ldGEpCiAgYGBgCgogIGBpbml0 aWFsVmFsdWVgIC0gVGhlIHZhbHVlIG9mIHRoZSBgaW5pdGlhbFZhbHVlYCBw cm9wZXJ0eSBmcm9tIHRoZQogIG9wdGlvbnMgb2JqZWN0LgoKICBgY2hhbmdl TWV0YWAgLSBBbiBvYmplY3Qgd2hpY2ggY29udGFpbnMgbWV0YSBpbmZvcm1h dGlvbiBhYm91dCB0aGUKICBjb21wdXRlZC4gSXQgY29udGFpbnMgdGhlIGZv bGxvd2luZyBwcm9wZXJ0aWVzOgoKICAgICAtIGBwcm9wZXJ0eWAgdGhlIGNv bXB1dGVkIHByb3BlcnR5CiAgICAgLSBgcHJvcGVydHlOYW1lYCB0aGUgbmFt ZSBvZiB0aGUgcHJvcGVydHkgb24gdGhlIG9iamVjdAoKICBgaW5zdGFuY2VN ZXRhYCAtIEFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHN0b3JlIG1l dGEKICBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIGNhbGN1bGF0aW5nIHlvdXIg Y29tcHV0ZWQuIEZvciBleGFtcGxlIGEKICB1bmlxdWUgY29tcHV0ZWQgbWln aHQgdXNlIHRoaXMgdG8gc3RvcmUgdGhlIG51bWJlciBvZiB0aW1lcyBhIGdp dmVuCiAgZWxlbWVudCBpcyBmb3VuZCBpbiB0aGUgZGVwZW5kZW50IGFycmF5 LgoKCiAgVGhlIGByZW1vdmVkSXRlbWAgYW5kIGBhZGRlZEl0ZW1gIGZ1bmN0 aW9ucyBib3RoIGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmU6CgogIGBg YGphdmFzY3JpcHQKICBmdW5jdGlvbiAoYWNjdW11bGF0ZWRWYWx1ZSwgaXRl bSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKQogIGBgYAoKICBgYWNjdW11 bGF0ZWRWYWx1ZWAgLSBUaGUgdmFsdWUgcmV0dXJuZWQgZnJvbSB0aGUgbGFz dCB0aW1lCiAgYHJlbW92ZWRJdGVtYCBvciBgYWRkZWRJdGVtYCB3YXMgY2Fs bGVkIG9yIGBpbml0aWFsVmFsdWVgLgoKICBgaXRlbWAgLSB0aGUgZWxlbWVu dCBhZGRlZCBvciByZW1vdmVkIGZyb20gdGhlIGFycmF5CgogIGBjaGFuZ2VN ZXRhYCAtIEFuIG9iamVjdCB3aGljaCBjb250YWlucyBtZXRhIGluZm9ybWF0 aW9uIGFib3V0IHRoZQogIGNoYW5nZS4gSXQgY29udGFpbnMgdGhlIGZvbGxv d2luZyBwcm9wZXJ0aWVzOgoKICAgIC0gYHByb3BlcnR5YCB0aGUgY29tcHV0 ZWQgcHJvcGVydHkKICAgIC0gYHByb3BlcnR5TmFtZWAgdGhlIG5hbWUgb2Yg dGhlIHByb3BlcnR5IG9uIHRoZSBvYmplY3QKICAgIC0gYGluZGV4YCB0aGUg aW5kZXggb2YgdGhlIGFkZGVkIG9yIHJlbW92ZWQgaXRlbQogICAgLSBgaXRl bWAgdGhlIGFkZGVkIG9yIHJlbW92ZWQgaXRlbTogdGhpcyBpcyBleGFjdGx5 IHRoZSBzYW1lIGFzCiAgICAgIHRoZSBzZWNvbmQgYXJnCiAgICAtIGBhcnJh eUNoYW5nZWRgIHRoZSBhcnJheSB0aGF0IHRyaWdnZXJlZCB0aGUgY2hhbmdl LiBDYW4gYmUKICAgICAgdXNlZnVsIHdoZW4gZGVwZW5kaW5nIG9uIG11bHRp cGxlIGFycmF5cy4KCiAgRm9yIHByb3BlcnR5IGNoYW5nZXMgdHJpZ2dlcmVk IG9uIGFuIGl0ZW0gcHJvcGVydHkgY2hhbmdlICh3aGVuCiAgZGVwS2V5IGlz IHNvbWV0aGluZyBsaWtlIGBzb21lQXJyYXkuQGVhY2guc29tZVByb3BlcnR5 YCksCiAgYGNoYW5nZU1ldGFgIHdpbGwgYWxzbyBjb250YWluIHRoZSBmb2xs b3dpbmcgcHJvcGVydHk6CgogICAgLSBgcHJldmlvdXNWYWx1ZXNgIGFuIG9i amVjdCB3aG9zZSBrZXlzIGFyZSB0aGUgcHJvcGVydGllcyB0aGF0IGNoYW5n ZWQgb24KICAgIHRoZSBpdGVtLCBhbmQgd2hvc2UgdmFsdWVzIGFyZSB0aGUg aXRlbSdzIHByZXZpb3VzIHZhbHVlcy4KCiAgYHByZXZpb3VzVmFsdWVzYCBp cyBpbXBvcnRhbnQgRW1iZXIgY29hbGVzY2VzIGl0ZW0gcHJvcGVydHkgY2hh bmdlcyB2aWEKICBFbWJlci5ydW4ub25jZS4gVGhpcyBtZWFucyB0aGF0IGJ5 IHRoZSB0aW1lIHJlbW92ZWRJdGVtIGdldHMgY2FsbGVkLCBpdGVtIGhhcwog IHRoZSBuZXcgdmFsdWVzLCBidXQgeW91IG1heSBuZWVkIHRoZSBwcmV2aW91 cyB2YWx1ZSAoZWcgZm9yIHNvcnRpbmcgJgogIGZpbHRlcmluZykuCgogIGBp bnN0YW5jZU1ldGFgIC0gQW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8g c3RvcmUgbWV0YQogIGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgY2FsY3VsYXRp bmcgeW91ciBjb21wdXRlZC4gRm9yIGV4YW1wbGUgYQogIHVuaXF1ZSBjb21w dXRlZCBtaWdodCB1c2UgdGhpcyB0byBzdG9yZSB0aGUgbnVtYmVyIG9mIHRp bWVzIGEgZ2l2ZW4KICBlbGVtZW50IGlzIGZvdW5kIGluIHRoZSBkZXBlbmRl bnQgYXJyYXkuCgogIFRoZSBgcmVtb3ZlZEl0ZW1gIGFuZCBgYWRkZWRJdGVt YCBmdW5jdGlvbnMgc2hvdWxkIHJldHVybiB0aGUgYWNjdW11bGF0ZWQKICB2 YWx1ZS4gSXQgaXMgYWNjZXB0YWJsZSB0byBub3QgcmV0dXJuIGFueXRoaW5n IChpZSByZXR1cm4gdW5kZWZpbmVkKQogIHRvIGludmFsaWRhdGUgdGhlIGNv bXB1dGF0aW9uLiBUaGlzIGlzIGdlbmVyYWxseSBub3QgYSBnb29kIGlkZWEg Zm9yCiAgYXJyYXlDb21wdXRlZCBidXQgaXQncyB1c2VkIGluIGVnIG1heCBh bmQgbWluLgoKICBOb3RlIHRoYXQgb2JzZXJ2ZXJzIHdpbGwgYmUgZmlyZWQg aWYgZWl0aGVyIG9mIHRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gYSB2YWx1ZQog IHRoYXQgZGlmZmVycyBmcm9tIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS4gIFdo ZW4gcmV0dXJuaW5nIGFuIG9iamVjdCB0aGF0CiAgbXV0YXRlcyBpbiByZXNw b25zZSB0byBhcnJheSBjaGFuZ2VzLCBmb3IgZXhhbXBsZSBhbiBhcnJheSB0 aGF0IG1hcHMKICBldmVyeXRoaW5nIGZyb20gc29tZSBvdGhlciBhcnJheSAo c2VlIGBFbWJlci5jb21wdXRlZC5tYXBgKSwgaXQgaXMgdXN1YWxseQogIGlt cG9ydGFudCB0aGF0IHRoZSAqc2FtZSogYXJyYXkgYmUgcmV0dXJuZWQgdG8g YXZvaWQgYWNjaWRlbnRhbGx5IHRyaWdnZXJpbmcgb2JzZXJ2ZXJzLgoKICBF eGFtcGxlCgogIGBgYGphdmFzY3JpcHQKICBFbWJlci5jb21wdXRlZC5tYXgg PSBmdW5jdGlvbiAoZGVwZW5kZW50S2V5KSB7CiAgICByZXR1cm4gRW1iZXIu cmVkdWNlQ29tcHV0ZWQoZGVwZW5kZW50S2V5LCB7CiAgICAgIGluaXRpYWxW YWx1ZTogLUluZmluaXR5LAoKICAgICAgYWRkZWRJdGVtOiBmdW5jdGlvbiAo YWNjdW11bGF0ZWRWYWx1ZSwgaXRlbSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VN ZXRhKSB7CiAgICAgICAgcmV0dXJuIE1hdGgubWF4KGFjY3VtdWxhdGVkVmFs dWUsIGl0ZW0pOwogICAgICB9LAoKICAgICAgcmVtb3ZlZEl0ZW06IGZ1bmN0 aW9uIChhY2N1bXVsYXRlZFZhbHVlLCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0 YW5jZU1ldGEpIHsKICAgICAgICBpZiAoaXRlbSA8IGFjY3VtdWxhdGVkVmFs dWUpIHsKICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRlZFZhbHVlOwogICAg ICAgIH0KICAgICAgfQogICAgfSk7CiAgfTsKICBgYGAKCiAgRGVwZW5kZW50 IGtleXMgbWF5IHJlZmVyIHRvIGBAdGhpc2AgdG8gb2JzZXJ2ZSBjaGFuZ2Vz IHRvIHRoZSBvYmplY3QgaXRzZWxmLAogIHdoaWNoIG11c3QgYmUgYXJyYXkt bGlrZSwgcmF0aGVyIHRoYW4gYSBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0LiAg VGhpcyBpcwogIG1vc3RseSB1c2VmdWwgZm9yIGFycmF5IHByb3hpZXMsIHRv IGVuc3VyZSBvYmplY3RzIGFyZSByZXRyaWV2ZWQgdmlhCiAgYG9iamVjdEF0 Q29udGVudGAuICBUaGlzIGlzIGhvdyB5b3UgY291bGQgc29ydCBpdGVtcyBi eSBwcm9wZXJ0aWVzIGRlZmluZWQgb24gYW4gaXRlbSBjb250cm9sbGVyLgoK ICBFeGFtcGxlCgogIGBgYGphdmFzY3JpcHQKICBBcHAuUGVvcGxlQ29udHJv bGxlciA9IEVtYmVyLkFycmF5Q29udHJvbGxlci5leHRlbmQoewogICAgaXRl bUNvbnRyb2xsZXI6ICdwZXJzb24nLAoKICAgIHNvcnRlZFBlb3BsZTogRW1i ZXIuY29tcHV0ZWQuc29ydCgnQHRoaXMuQGVhY2gucmV2ZXJzZWROYW1lJywg ZnVuY3Rpb24ocGVyc29uQSwgcGVyc29uQikgewogICAgICAvLyBgcmV2ZXJz ZWROYW1lYCBpc24ndCBkZWZpbmVkIG9uIFBlcnNvbiwgYnV0IHdlIGhhdmUg YWNjZXNzIHRvIGl0IHZpYQogICAgICAvLyB0aGUgaXRlbSBjb250cm9sbGVy IEFwcC5QZXJzb25Db250cm9sbGVyLiAgSWYgd2UnZCB1c2VkCiAgICAgIC8v IGBjb250ZW50LkBlYWNoLnJldmVyc2VkTmFtZWAgYWJvdmUsIHdlIHdvdWxk IGJlIGdldHRpbmcgdGhlIG9iamVjdHMKICAgICAgLy8gZGlyZWN0bHkgYW5k IG5vdCBoYXZlIGFjY2VzcyB0byBgcmV2ZXJzZWROYW1lYC4KICAgICAgLy8K ICAgICAgdmFyIHJldmVyc2VkTmFtZUEgPSBnZXQocGVyc29uQSwgJ3JldmVy c2VkTmFtZScpLAogICAgICAgICAgcmV2ZXJzZWROYW1lQiA9IGdldChwZXJz b25CLCAncmV2ZXJzZWROYW1lJyk7CgogICAgICByZXR1cm4gRW1iZXIuY29t cGFyZShyZXZlcnNlZE5hbWVBLCByZXZlcnNlZE5hbWVCKTsKICAgIH0pCiAg fSk7CgogIEFwcC5QZXJzb25Db250cm9sbGVyID0gRW1iZXIuT2JqZWN0Q29u dHJvbGxlci5leHRlbmQoewogICAgcmV2ZXJzZWROYW1lOiBmdW5jdGlvbiAo KSB7CiAgICAgIHJldHVybiByZXZlcnNlKGdldCh0aGlzLCAnbmFtZScpKTsK ICAgIH0ucHJvcGVydHkoJ25hbWUnKQogIH0pCiAgYGBgCgogIERlcGVuZGVu dCBrZXlzIHdob3NlIHZhbHVlcyBhcmUgbm90IGFycmF5cyBhcmUgdHJlYXRl ZCBhcyByZWd1bGFyCiAgZGVwZW5kZW5jaWVzOiB3aGVuIHRoZXkgY2hhbmdl LCB0aGUgY29tcHV0ZWQgcHJvcGVydHkgaXMgY29tcGxldGVseQogIHJlY2Fs Y3VsYXRlZC4gIEl0IGlzIHNvbWV0aW1lcyB1c2VmdWwgdG8gaGF2ZSBkZXBl bmRlbnQgYXJyYXlzIHdpdGggc2ltaWxhcgogIHNlbWFudGljcy4gIERlcGVu ZGVudCBrZXlzIHdoaWNoIGVuZCBpbiBgLltdYCBkbyBub3QgdXNlICJvbmUg YXQgYSB0aW1lIgogIHNlbWFudGljcy4gIFdoZW4gYW4gaXRlbSBpcyBhZGRl ZCBvciByZW1vdmVkIGZyb20gc3VjaCBhIGRlcGVuZGVuY3ksIHRoZQogIGNv bXB1dGVkIHByb3BlcnR5IGlzIGNvbXBsZXRlbHkgcmVjb21wdXRlZC4KCiAg RXhhbXBsZQoKICBgYGBqYXZhc2NyaXB0CiAgRW1iZXIuT2JqZWN0LmV4dGVu ZCh7CiAgICAvLyBXaGVuIGBzdHJpbmdgIGlzIGNoYW5nZWQsIGBjb21wdXRl ZGAgaXMgY29tcGxldGVseSByZWNvbXB1dGVkLgogICAgc3RyaW5nOiAnYSBz dHJpbmcnLAoKICAgIC8vIFdoZW4gYW4gaXRlbSBpcyBhZGRlZCB0byBgYXJy YXlgLCBgYWRkZWRJdGVtYCBpcyBjYWxsZWQuCiAgICBhcnJheTogW10sCgog ICAgLy8gV2hlbiBhbiBpdGVtIGlzIGFkZGVkIHRvIGBhbm90aGVyQXJyYXlg LCBgY29tcHV0ZWRgIGlzIGNvbXBsZXRlbHkKICAgIC8vIHJlY29tcHV0ZWQu CiAgICBhbm90aGVyQXJyYXk6IFtdLAoKICAgIGNvbXB1dGVkOiBFbWJlci5y ZWR1Y2VDb21wdXRlZCgnc3RyaW5nJywgJ2FycmF5JywgJ2Fub3RoZXJBcnJh eS5bXScsIHsKICAgICAgYWRkZWRJdGVtOiBhZGRlZEl0ZW1DYWxsYmFjaywK ICAgICAgcmVtb3ZlZEl0ZW06IHJlbW92ZWRJdGVtQ2FsbGJhY2sKICAgIH0p CiAgfSk7CiAgYGBgCgogIEBtZXRob2QgcmVkdWNlQ29tcHV0ZWQKICBAZm9y IEVtYmVyCiAgQHBhcmFtIHtTdHJpbmd9IFtkZXBlbmRlbnRLZXlzKl0KICBA cGFyYW0ge09iamVjdH0gb3B0aW9ucwogIEByZXR1cm4ge0VtYmVyLkNvbXB1 dGVkUHJvcGVydHl9CiovCkVtYmVyLnJlZHVjZUNvbXB1dGVkID0gZnVuY3Rp b24gKG9wdGlvbnMpIHsKICB2YXIgYXJnczsKCiAgaWYgKGFyZ3VtZW50cy5s ZW5ndGggPiAxKSB7CiAgICBhcmdzID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50 cywgMCwgLTEpOwogICAgb3B0aW9ucyA9IGFfc2xpY2UuY2FsbChhcmd1bWVu dHMsIC0xKVswXTsKICB9CgogIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gIm9i amVjdCIpIHsKICAgIHRocm93IG5ldyBFbWJlci5FcnJvcigiUmVkdWNlIENv bXB1dGVkIFByb3BlcnR5IGRlY2xhcmVkIHdpdGhvdXQgYW4gb3B0aW9ucyBo YXNoIik7CiAgfQoKICBpZiAoISgnaW5pdGlhbFZhbHVlJyBpbiBvcHRpb25z KSkgewogICAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKCJSZWR1Y2UgQ29tcHV0 ZWQgUHJvcGVydHkgZGVjbGFyZWQgd2l0aG91dCBhbiBpbml0aWFsIHZhbHVl Iik7CiAgfQoKICB2YXIgY3AgPSBuZXcgUmVkdWNlQ29tcHV0ZWRQcm9wZXJ0 eShvcHRpb25zKTsKCiAgaWYgKGFyZ3MpIHsKICAgIGNwLnByb3BlcnR5LmFw cGx5KGNwLCBhcmdzKTsKICB9CgogIHJldHVybiBjcDsKfTsKCn0pKCk7CgoK CihmdW5jdGlvbigpIHsKdmFyIFJlZHVjZUNvbXB1dGVkUHJvcGVydHkgPSBF bWJlci5SZWR1Y2VDb21wdXRlZFByb3BlcnR5LAogICAgYV9zbGljZSA9IFtd LnNsaWNlLAogICAgb19jcmVhdGUgPSBFbWJlci5jcmVhdGUsCiAgICBmb3JF YWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2g7CgpmdW5jdGlv biBBcnJheUNvbXB1dGVkUHJvcGVydHkoKSB7CiAgdmFyIGNwID0gdGhpczsK CiAgUmVkdWNlQ29tcHV0ZWRQcm9wZXJ0eS5hcHBseSh0aGlzLCBhcmd1bWVu dHMpOwoKICB0aGlzLmZ1bmMgPSAoZnVuY3Rpb24ocmVkdWNlRnVuYykgewog ICAgcmV0dXJuIGZ1bmN0aW9uIChwcm9wZXJ0eU5hbWUpIHsKICAgICAgaWYg KCFjcC5faGFzSW5zdGFuY2VNZXRhKHRoaXMsIHByb3BlcnR5TmFtZSkpIHsK ICAgICAgICAvLyBXaGVuIHdlIHJlY29tcHV0ZSBhbiBhcnJheSBjb21wdXRl ZCBwcm9wZXJ0eSwgd2UgbmVlZCBhbHJlYWR5CiAgICAgICAgLy8gcmV0cmll dmVkIGFycmF5cyB0byBiZSB1cGRhdGVkOyB3ZSBjYW4ndCBzaW1wbHkgZW1w dHkgdGhlIGNhY2hlIGFuZAogICAgICAgIC8vIGhvcGUgdGhlIGFycmF5IGlz IHJlLXJldHJpZXZlZC4KICAgICAgICBmb3JFYWNoKGNwLl9kZXBlbmRlbnRL ZXlzLCBmdW5jdGlvbihkZXBlbmRlbnRLZXkpIHsKICAgICAgICAgIEVtYmVy LmFkZE9ic2VydmVyKHRoaXMsIGRlcGVuZGVudEtleSwgZnVuY3Rpb24oKSB7 CiAgICAgICAgICAgIGNwLnJlY29tcHV0ZU9uY2UuY2FsbCh0aGlzLCBwcm9w ZXJ0eU5hbWUpOwogICAgICAgICAgfSk7CiAgICAgICAgfSwgdGhpcyk7CiAg ICAgIH0KCiAgICAgIHJldHVybiByZWR1Y2VGdW5jLmFwcGx5KHRoaXMsIGFy Z3VtZW50cyk7CiAgICB9OwogIH0pKHRoaXMuZnVuYyk7CgogIHJldHVybiB0 aGlzOwp9CkVtYmVyLkFycmF5Q29tcHV0ZWRQcm9wZXJ0eSA9IEFycmF5Q29t cHV0ZWRQcm9wZXJ0eTsKQXJyYXlDb21wdXRlZFByb3BlcnR5LnByb3RvdHlw ZSA9IG9fY3JlYXRlKFJlZHVjZUNvbXB1dGVkUHJvcGVydHkucHJvdG90eXBl KTsKQXJyYXlDb21wdXRlZFByb3BlcnR5LnByb3RvdHlwZS5pbml0aWFsVmFs dWUgPSBmdW5jdGlvbiAoKSB7CiAgcmV0dXJuIEVtYmVyLkEoKTsKfTsKQXJy YXlDb21wdXRlZFByb3BlcnR5LnByb3RvdHlwZS5yZXNldFZhbHVlID0gZnVu Y3Rpb24gKGFycmF5KSB7CiAgYXJyYXkuY2xlYXIoKTsKICByZXR1cm4gYXJy YXk7Cn07CgovLyBUaGlzIGlzIGEgc3RvcGdhcCB0byBrZWVwIHRoZSByZWZl cmVuY2UgY291bnRzIGNvcnJlY3Qgd2l0aCBsYXp5IENQcy4KQXJyYXlDb21w dXRlZFByb3BlcnR5LnByb3RvdHlwZS5kaWRDaGFuZ2UgPSBmdW5jdGlvbiAo b2JqLCBrZXlOYW1lKSB7CiAgcmV0dXJuOwp9OwoKLyoqCiAgQ3JlYXRlcyBh IGNvbXB1dGVkIHByb3BlcnR5IHdoaWNoIG9wZXJhdGVzIG9uIGRlcGVuZGVu dCBhcnJheXMgYW5kCiAgaXMgdXBkYXRlZCB3aXRoICJvbmUgYXQgYSB0aW1l IiBzZW1hbnRpY3MuIFdoZW4gaXRlbXMgYXJlIGFkZGVkIG9yCiAgcmVtb3Zl ZCBmcm9tIHRoZSBkZXBlbmRlbnQgYXJyYXkocykgYW4gYXJyYXkgY29tcHV0 ZWQgb25seSBvcGVyYXRlcwogIG9uIHRoZSBjaGFuZ2UgaW5zdGVhZCBvZiBy ZS1ldmFsdWF0aW5nIHRoZSBlbnRpcmUgYXJyYXkuIFRoaXMgc2hvdWxkCiAg cmV0dXJuIGFuIGFycmF5LCBpZiB5b3UnZCBsaWtlIHRvIHVzZSAib25lIGF0 IGEgdGltZSIgc2VtYW50aWNzIGFuZAogIGNvbXB1dGUgc29tZSB2YWx1ZSBv dGhlciB0aGVuIGFuIGFycmF5IGxvb2sgYXQKICBgRW1iZXIucmVkdWNlQ29t cHV0ZWRgLgoKICBJZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBhcmd1bWVu dHMgdGhlIGZpcnN0IGFyZ3VtZW50cyBhcmUKICBjb25zaWRlcmVkIHRvIGJl IGRlcGVuZGVudCBwcm9wZXJ0eSBrZXlzLiBUaGUgbGFzdCBhcmd1bWVudCBp cwogIHJlcXVpcmVkIHRvIGJlIGFuIG9wdGlvbnMgb2JqZWN0LiBUaGUgb3B0 aW9ucyBvYmplY3QgY2FuIGhhdmUgdGhlCiAgZm9sbG93aW5nIHRocmVlIHBy b3BlcnRpZXMuCgogIGBpbml0aWFsaXplYCAtIEFuIG9wdGlvbmFsIGluaXRp YWxpemUgZnVuY3Rpb24uIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgdXNlZAog IHRvIHNldCB1cCBzdGF0ZSBvbiB0aGUgaW5zdGFuY2VNZXRhIG9iamVjdC4K CiAgYHJlbW92ZWRJdGVtYCAtIEEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQg ZWFjaCB0aW1lIGFuIGVsZW1lbnQgaXMKICByZW1vdmVkIGZyb20gdGhlIGFy cmF5LgoKICBgYWRkZWRJdGVtYCAtIEEgZnVuY3Rpb24gdGhhdCBpcyBjYWxs ZWQgZWFjaCB0aW1lIGFuIGVsZW1lbnQgaXMKICBhZGRlZCB0byB0aGUgYXJy YXkuCgoKICBUaGUgYGluaXRpYWxpemVgIGZ1bmN0aW9uIGhhcyB0aGUgZm9s bG93aW5nIHNpZ25hdHVyZToKCiAgYGBgamF2YXNjcmlwdAogICBmdW5jdGlv biAoYXJyYXksIGNoYW5nZU1ldGEsIGluc3RhbmNlTWV0YSkKICBgYGAKCiAg YGFycmF5YCAtIFRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBhcnJheUNvbXB1 dGVkLCBhbiBlbXB0eSBhcnJheS4KCiAgYGNoYW5nZU1ldGFgIC0gQW4gb2Jq ZWN0IHdoaWNoIGNvbnRhaW5zIG1ldGEgaW5mb3JtYXRpb24gYWJvdXQgdGhl CiAgY29tcHV0ZWQuIEl0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgcHJvcGVy dGllczoKCiAgICAgLSBgcHJvcGVydHlgIHRoZSBjb21wdXRlZCBwcm9wZXJ0 eQogICAgIC0gYHByb3BlcnR5TmFtZWAgdGhlIG5hbWUgb2YgdGhlIHByb3Bl cnR5IG9uIHRoZSBvYmplY3QKCiAgYGluc3RhbmNlTWV0YWAgLSBBbiBvYmpl Y3QgdGhhdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBtZXRhCiAgaW5mb3JtYXRp b24gbmVlZGVkIGZvciBjYWxjdWxhdGluZyB5b3VyIGNvbXB1dGVkLiBGb3Ig ZXhhbXBsZSBhCiAgdW5pcXVlIGNvbXB1dGVkIG1pZ2h0IHVzZSB0aGlzIHRv IHN0b3JlIHRoZSBudW1iZXIgb2YgdGltZXMgYSBnaXZlbgogIGVsZW1lbnQg aXMgZm91bmQgaW4gdGhlIGRlcGVuZGVudCBhcnJheS4KCgogIFRoZSBgcmVt b3ZlZEl0ZW1gIGFuZCBgYWRkZWRJdGVtYCBmdW5jdGlvbnMgYm90aCBoYXZl IHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlOgoKICBgYGBqYXZhc2NyaXB0CiAg ZnVuY3Rpb24gKGFjY3VtdWxhdGVkVmFsdWUsIGl0ZW0sIGNoYW5nZU1ldGEs IGluc3RhbmNlTWV0YSkKICBgYGAKCiAgYGFjY3VtdWxhdGVkVmFsdWVgIC0g VGhlIHZhbHVlIHJldHVybmVkIGZyb20gdGhlIGxhc3QgdGltZQogIGByZW1v dmVkSXRlbWAgb3IgYGFkZGVkSXRlbWAgd2FzIGNhbGxlZCBvciBhbiBlbXB0 eSBhcnJheS4KCiAgYGl0ZW1gIC0gdGhlIGVsZW1lbnQgYWRkZWQgb3IgcmVt b3ZlZCBmcm9tIHRoZSBhcnJheQoKICBgY2hhbmdlTWV0YWAgLSBBbiBvYmpl Y3Qgd2hpY2ggY29udGFpbnMgbWV0YSBpbmZvcm1hdGlvbiBhYm91dCB0aGUK ICBjaGFuZ2UuIEl0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgcHJvcGVydGll czoKCiAgICAtIGBwcm9wZXJ0eWAgdGhlIGNvbXB1dGVkIHByb3BlcnR5CiAg ICAtIGBwcm9wZXJ0eU5hbWVgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBv biB0aGUgb2JqZWN0CiAgICAtIGBpbmRleGAgdGhlIGluZGV4IG9mIHRoZSBh ZGRlZCBvciByZW1vdmVkIGl0ZW0KICAgIC0gYGl0ZW1gIHRoZSBhZGRlZCBv ciByZW1vdmVkIGl0ZW06IHRoaXMgaXMgZXhhY3RseSB0aGUgc2FtZSBhcwog ICAgICB0aGUgc2Vjb25kIGFyZwogICAgLSBgYXJyYXlDaGFuZ2VkYCB0aGUg YXJyYXkgdGhhdCB0cmlnZ2VyZWQgdGhlIGNoYW5nZS4gQ2FuIGJlCiAgICAg IHVzZWZ1bCB3aGVuIGRlcGVuZGluZyBvbiBtdWx0aXBsZSBhcnJheXMuCgog IEZvciBwcm9wZXJ0eSBjaGFuZ2VzIHRyaWdnZXJlZCBvbiBhbiBpdGVtIHBy b3BlcnR5IGNoYW5nZSAod2hlbgogIGRlcEtleSBpcyBzb21ldGhpbmcgbGlr ZSBgc29tZUFycmF5LkBlYWNoLnNvbWVQcm9wZXJ0eWApLAogIGBjaGFuZ2VN ZXRhYCB3aWxsIGFsc28gY29udGFpbiB0aGUgZm9sbG93aW5nIHByb3BlcnR5 OgoKICAgIC0gYHByZXZpb3VzVmFsdWVzYCBhbiBvYmplY3Qgd2hvc2Uga2V5 cyBhcmUgdGhlIHByb3BlcnRpZXMgdGhhdCBjaGFuZ2VkIG9uCiAgICB0aGUg aXRlbSwgYW5kIHdob3NlIHZhbHVlcyBhcmUgdGhlIGl0ZW0ncyBwcmV2aW91 cyB2YWx1ZXMuCgogIGBwcmV2aW91c1ZhbHVlc2AgaXMgaW1wb3J0YW50IEVt YmVyIGNvYWxlc2NlcyBpdGVtIHByb3BlcnR5IGNoYW5nZXMgdmlhCiAgRW1i ZXIucnVuLm9uY2UuIFRoaXMgbWVhbnMgdGhhdCBieSB0aGUgdGltZSByZW1v dmVkSXRlbSBnZXRzIGNhbGxlZCwgaXRlbSBoYXMKICB0aGUgbmV3IHZhbHVl cywgYnV0IHlvdSBtYXkgbmVlZCB0aGUgcHJldmlvdXMgdmFsdWUgKGVnIGZv ciBzb3J0aW5nICYKICBmaWx0ZXJpbmcpLgoKICBgaW5zdGFuY2VNZXRhYCAt IEFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHN0b3JlIG1ldGEKICBp bmZvcm1hdGlvbiBuZWVkZWQgZm9yIGNhbGN1bGF0aW5nIHlvdXIgY29tcHV0 ZWQuIEZvciBleGFtcGxlIGEKICB1bmlxdWUgY29tcHV0ZWQgbWlnaHQgdXNl IHRoaXMgdG8gc3RvcmUgdGhlIG51bWJlciBvZiB0aW1lcyBhIGdpdmVuCiAg ZWxlbWVudCBpcyBmb3VuZCBpbiB0aGUgZGVwZW5kZW50IGFycmF5LgoKICBU aGUgYHJlbW92ZWRJdGVtYCBhbmQgYGFkZGVkSXRlbWAgZnVuY3Rpb25zIHNo b3VsZCByZXR1cm4gdGhlIGFjY3VtdWxhdGVkCiAgdmFsdWUuIEl0IGlzIGFj Y2VwdGFibGUgdG8gbm90IHJldHVybiBhbnl0aGluZyAoaWUgcmV0dXJuIHVu ZGVmaW5lZCkKICB0byBpbnZhbGlkYXRlIHRoZSBjb21wdXRhdGlvbi4gVGhp cyBpcyBnZW5lcmFsbHkgbm90IGEgZ29vZCBpZGVhIGZvcgogIGFycmF5Q29t cHV0ZWQgYnV0IGl0J3MgdXNlZCBpbiBlZyBtYXggYW5kIG1pbi4KCiAgRXhh bXBsZQoKICBgYGBqYXZhc2NyaXB0CiAgRW1iZXIuY29tcHV0ZWQubWFwID0g ZnVuY3Rpb24oZGVwZW5kZW50S2V5LCBjYWxsYmFjaykgewogICAgdmFyIG9w dGlvbnMgPSB7CiAgICAgIGFkZGVkSXRlbTogZnVuY3Rpb24oYXJyYXksIGl0 ZW0sIGNoYW5nZU1ldGEsIGluc3RhbmNlTWV0YSkgewogICAgICAgIHZhciBt YXBwZWQgPSBjYWxsYmFjayhpdGVtKTsKICAgICAgICBhcnJheS5pbnNlcnRB dChjaGFuZ2VNZXRhLmluZGV4LCBtYXBwZWQpOwogICAgICAgIHJldHVybiBh cnJheTsKICAgICAgfSwKICAgICAgcmVtb3ZlZEl0ZW06IGZ1bmN0aW9uKGFy cmF5LCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5jZU1ldGEpIHsKICAgICAg ICBhcnJheS5yZW1vdmVBdChjaGFuZ2VNZXRhLmluZGV4LCAxKTsKICAgICAg ICByZXR1cm4gYXJyYXk7CiAgICAgIH0KICAgIH07CgogICAgcmV0dXJuIEVt YmVyLmFycmF5Q29tcHV0ZWQoZGVwZW5kZW50S2V5LCBvcHRpb25zKTsKICB9 OwogIGBgYAoKICBAbWV0aG9kIGFycmF5Q29tcHV0ZWQKICBAZm9yIEVtYmVy CiAgQHBhcmFtIHtTdHJpbmd9IFtkZXBlbmRlbnRLZXlzKl0KICBAcGFyYW0g e09iamVjdH0gb3B0aW9ucwogIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJv cGVydHl9CiovCkVtYmVyLmFycmF5Q29tcHV0ZWQgPSBmdW5jdGlvbiAob3B0 aW9ucykgewogIHZhciBhcmdzOwoKICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+ IDEpIHsKICAgIGFyZ3MgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzLCAwLCAt MSk7CiAgICBvcHRpb25zID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cywgLTEp WzBdOwogIH0KCiAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAib2JqZWN0Iikg ewogICAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKCJBcnJheSBDb21wdXRlZCBQ cm9wZXJ0eSBkZWNsYXJlZCB3aXRob3V0IGFuIG9wdGlvbnMgaGFzaCIpOwog IH0KCiAgdmFyIGNwID0gbmV3IEFycmF5Q29tcHV0ZWRQcm9wZXJ0eShvcHRp b25zKTsKCiAgaWYgKGFyZ3MpIHsKICAgIGNwLnByb3BlcnR5LmFwcGx5KGNw LCBhcmdzKTsKICB9CgogIHJldHVybiBjcDsKfTsKCn0pKCk7CgoKCihmdW5j dGlvbigpIHsKLyoqCkBtb2R1bGUgZW1iZXIKQHN1Ym1vZHVsZSBlbWJlci1y dW50aW1lCiovCgp2YXIgZ2V0ID0gRW1iZXIuZ2V0LAogICAgc2V0ID0gRW1i ZXIuc2V0LAogICAgZ3VpZEZvciA9IEVtYmVyLmd1aWRGb3IsCiAgICBtZXJn ZSA9IEVtYmVyLm1lcmdlLAogICAgYV9zbGljZSA9IFtdLnNsaWNlLAogICAg Zm9yRWFjaCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5mb3JFYWNoLAogICAg bWFwID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLm1hcCwKICAgIFNlYXJjaFBy b3h5OwoKLyoqCiBBIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgcmV0dXJucyB0 aGUgc3VtIG9mIHRoZSB2YWx1ZQogaW4gdGhlIGRlcGVuZGVudCBhcnJheS4K CiBAbWV0aG9kIGNvbXB1dGVkLnN1bQogQGZvciBFbWJlcgogQHBhcmFtIHtT dHJpbmd9IGRlcGVuZGVudEtleQogQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQ cm9wZXJ0eX0gY29tcHV0ZXMgdGhlIHN1bSBvZiBhbGwgdmFsdWVzIGluIHRo ZSBkZXBlbmRlbnRLZXkncyBhcnJheQoqLwoKRW1iZXIuY29tcHV0ZWQuc3Vt ID0gZnVuY3Rpb24oZGVwZW5kZW50S2V5KXsKICByZXR1cm4gRW1iZXIucmVk dWNlQ29tcHV0ZWQoZGVwZW5kZW50S2V5LCB7CiAgICBpbml0aWFsVmFsdWU6 IDAsCgogICAgYWRkZWRJdGVtOiBmdW5jdGlvbihhY2N1bXVsYXRlZFZhbHVl LCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5jZU1ldGEpewogICAgICByZXR1 cm4gYWNjdW11bGF0ZWRWYWx1ZSArIGl0ZW07CiAgICB9LAoKICAgIHJlbW92 ZWRJdGVtOiBmdW5jdGlvbihhY2N1bXVsYXRlZFZhbHVlLCBpdGVtLCBjaGFu Z2VNZXRhLCBpbnN0YW5jZU1ldGEpewogICAgICByZXR1cm4gYWNjdW11bGF0 ZWRWYWx1ZSAtIGl0ZW07CiAgICB9CiAgfSk7Cn07CgovKioKICBBIGNvbXB1 dGVkIHByb3BlcnR5IHRoYXQgY2FsY3VsYXRlcyB0aGUgbWF4aW11bSB2YWx1 ZSBpbiB0aGUKICBkZXBlbmRlbnQgYXJyYXkuIFRoaXMgd2lsbCByZXR1cm4g YC1JbmZpbml0eWAgd2hlbiB0aGUgZGVwZW5kZW50CiAgYXJyYXkgaXMgZW1w dHkuCgogIGBgYGphdmFzY3JpcHQKICBBcHAuUGVyc29uID0gRW1iZXIuT2Jq ZWN0LmV4dGVuZCh7CiAgICBjaGlsZEFnZXM6IEVtYmVyLmNvbXB1dGVkLm1h cEJ5KCdjaGlsZHJlbicsICdhZ2UnKSwKICAgIG1heENoaWxkQWdlOiBFbWJl ci5jb21wdXRlZC5tYXgoJ2NoaWxkQWdlcycpCiAgfSk7CgogIHZhciBsb3Jk Qnlyb24gPSBBcHAuUGVyc29uLmNyZWF0ZSh7Y2hpbGRyZW46IFtdfSk7CiAg bG9yZEJ5cm9uLmdldCgnbWF4Q2hpbGRBZ2UnKTsgLy8gLUluZmluaXR5CiAg bG9yZEJ5cm9uLmdldCgnY2hpbGRyZW4nKS5wdXNoT2JqZWN0KHsKICAgIG5h bWU6ICdBdWd1c3RhIEFkYSBCeXJvbicsIGFnZTogNwogIH0pOwogIGxvcmRC eXJvbi5nZXQoJ21heENoaWxkQWdlJyk7IC8vIDcKICBsb3JkQnlyb24uZ2V0 KCdjaGlsZHJlbicpLnB1c2hPYmplY3RzKFt7CiAgICBuYW1lOiAnQWxsZWdy YSBCeXJvbicsCiAgICBhZ2U6IDUKICB9LCB7CiAgICBuYW1lOiAnRWxpemFi ZXRoIE1lZG9yYSBMZWlnaCcsCiAgICBhZ2U6IDgKICB9XSk7CiAgbG9yZEJ5 cm9uLmdldCgnbWF4Q2hpbGRBZ2UnKTsgLy8gOAogIGBgYAoKICBAbWV0aG9k IGNvbXB1dGVkLm1heAogIEBmb3IgRW1iZXIKICBAcGFyYW0ge1N0cmluZ30g ZGVwZW5kZW50S2V5CiAgQHJldHVybiB7RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0 eX0gY29tcHV0ZXMgdGhlIGxhcmdlc3QgdmFsdWUgaW4gdGhlIGRlcGVuZGVu dEtleSdzIGFycmF5CiovCkVtYmVyLmNvbXB1dGVkLm1heCA9IGZ1bmN0aW9u IChkZXBlbmRlbnRLZXkpIHsKICByZXR1cm4gRW1iZXIucmVkdWNlQ29tcHV0 ZWQoZGVwZW5kZW50S2V5LCB7CiAgICBpbml0aWFsVmFsdWU6IC1JbmZpbml0 eSwKCiAgICBhZGRlZEl0ZW06IGZ1bmN0aW9uIChhY2N1bXVsYXRlZFZhbHVl LCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5jZU1ldGEpIHsKICAgICAgcmV0 dXJuIE1hdGgubWF4KGFjY3VtdWxhdGVkVmFsdWUsIGl0ZW0pOwogICAgfSwK CiAgICByZW1vdmVkSXRlbTogZnVuY3Rpb24gKGFjY3VtdWxhdGVkVmFsdWUs IGl0ZW0sIGNoYW5nZU1ldGEsIGluc3RhbmNlTWV0YSkgewogICAgICBpZiAo aXRlbSA8IGFjY3VtdWxhdGVkVmFsdWUpIHsKICAgICAgICByZXR1cm4gYWNj dW11bGF0ZWRWYWx1ZTsKICAgICAgfQogICAgfQogIH0pOwp9OwoKLyoqCiAg QSBjb21wdXRlZCBwcm9wZXJ0eSB0aGF0IGNhbGN1bGF0ZXMgdGhlIG1pbmlt dW0gdmFsdWUgaW4gdGhlCiAgZGVwZW5kZW50IGFycmF5LiBUaGlzIHdpbGwg cmV0dXJuIGBJbmZpbml0eWAgd2hlbiB0aGUgZGVwZW5kZW50CiAgYXJyYXkg aXMgZW1wdHkuCgogIGBgYGphdmFzY3JpcHQKICBBcHAuUGVyc29uID0gRW1i ZXIuT2JqZWN0LmV4dGVuZCh7CiAgICBjaGlsZEFnZXM6IEVtYmVyLmNvbXB1 dGVkLm1hcEJ5KCdjaGlsZHJlbicsICdhZ2UnKSwKICAgIG1pbkNoaWxkQWdl OiBFbWJlci5jb21wdXRlZC5taW4oJ2NoaWxkQWdlcycpCiAgfSk7CgogIHZh ciBsb3JkQnlyb24gPSBBcHAuUGVyc29uLmNyZWF0ZSh7Y2hpbGRyZW46IFtd fSk7CiAgbG9yZEJ5cm9uLmdldCgnbWluQ2hpbGRBZ2UnKTsgLy8gSW5maW5p dHkKICBsb3JkQnlyb24uZ2V0KCdjaGlsZHJlbicpLnB1c2hPYmplY3Qoewog ICAgbmFtZTogJ0F1Z3VzdGEgQWRhIEJ5cm9uJywgYWdlOiA3CiAgfSk7CiAg bG9yZEJ5cm9uLmdldCgnbWluQ2hpbGRBZ2UnKTsgLy8gNwogIGxvcmRCeXJv bi5nZXQoJ2NoaWxkcmVuJykucHVzaE9iamVjdHMoW3sKICAgIG5hbWU6ICdB bGxlZ3JhIEJ5cm9uJywKICAgIGFnZTogNQogIH0sIHsKICAgIG5hbWU6ICdF bGl6YWJldGggTWVkb3JhIExlaWdoJywKICAgIGFnZTogOAogIH1dKTsKICBs b3JkQnlyb24uZ2V0KCdtaW5DaGlsZEFnZScpOyAvLyA1CiAgYGBgCgogIEBt ZXRob2QgY29tcHV0ZWQubWluCiAgQGZvciBFbWJlcgogIEBwYXJhbSB7U3Ry aW5nfSBkZXBlbmRlbnRLZXkKICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFBy b3BlcnR5fSBjb21wdXRlcyB0aGUgc21hbGxlc3QgdmFsdWUgaW4gdGhlIGRl cGVuZGVudEtleSdzIGFycmF5CiovCkVtYmVyLmNvbXB1dGVkLm1pbiA9IGZ1 bmN0aW9uIChkZXBlbmRlbnRLZXkpIHsKICByZXR1cm4gRW1iZXIucmVkdWNl Q29tcHV0ZWQoZGVwZW5kZW50S2V5LCB7CiAgICBpbml0aWFsVmFsdWU6IElu ZmluaXR5LAoKICAgIGFkZGVkSXRlbTogZnVuY3Rpb24gKGFjY3VtdWxhdGVk VmFsdWUsIGl0ZW0sIGNoYW5nZU1ldGEsIGluc3RhbmNlTWV0YSkgewogICAg ICByZXR1cm4gTWF0aC5taW4oYWNjdW11bGF0ZWRWYWx1ZSwgaXRlbSk7CiAg ICB9LAoKICAgIHJlbW92ZWRJdGVtOiBmdW5jdGlvbiAoYWNjdW11bGF0ZWRW YWx1ZSwgaXRlbSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7CiAgICAg IGlmIChpdGVtID4gYWNjdW11bGF0ZWRWYWx1ZSkgewogICAgICAgIHJldHVy biBhY2N1bXVsYXRlZFZhbHVlOwogICAgICB9CiAgICB9CiAgfSk7Cn07Cgov KioKICBSZXR1cm5zIGFuIGFycmF5IG1hcHBlZCB2aWEgdGhlIGNhbGxiYWNr CgogIFRoZSBjYWxsYmFjayBtZXRob2QgeW91IHByb3ZpZGUgc2hvdWxkIGhh dmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmUuCiAgYGl0ZW1gIGlzIHRoZSBj dXJyZW50IGl0ZW0gaW4gdGhlIGl0ZXJhdGlvbi4KCiAgYGBgamF2YXNjcmlw dAogIGZ1bmN0aW9uKGl0ZW0pOwogIGBgYAoKICBFeGFtcGxlCgogIGBgYGph dmFzY3JpcHQKICBBcHAuSGFtc3RlciA9IEVtYmVyLk9iamVjdC5leHRlbmQo ewogICAgZXhjaXRpbmdDaG9yZXM6IEVtYmVyLmNvbXB1dGVkLm1hcCgnY2hv cmVzJywgZnVuY3Rpb24oY2hvcmUpIHsKICAgICAgcmV0dXJuIGNob3JlLnRv VXBwZXJDYXNlKCkgKyAnISc7CiAgICB9KQogIH0pOwoKICB2YXIgaGFtc3Rl ciA9IEFwcC5IYW1zdGVyLmNyZWF0ZSh7CiAgICBjaG9yZXM6IFsnY2xlYW4n LCAnd3JpdGUgbW9yZSB1bml0IHRlc3RzJ10KICB9KTsKICBoYW1zdGVyLmdl dCgnZXhjaXRpbmdDaG9yZXMnKTsgLy8gWydDTEVBTiEnLCAnV1JJVEUgTU9S RSBVTklUIFRFU1RTISddCiAgYGBgCgogIEBtZXRob2QgY29tcHV0ZWQubWFw CiAgQGZvciBFbWJlcgogIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkK ICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjawogIEByZXR1cm4ge0VtYmVy LkNvbXB1dGVkUHJvcGVydHl9IGFuIGFycmF5IG1hcHBlZCB2aWEgdGhlIGNh bGxiYWNrCiovCkVtYmVyLmNvbXB1dGVkLm1hcCA9IGZ1bmN0aW9uKGRlcGVu ZGVudEtleSwgY2FsbGJhY2spIHsKICB2YXIgb3B0aW9ucyA9IHsKICAgIGFk ZGVkSXRlbTogZnVuY3Rpb24oYXJyYXksIGl0ZW0sIGNoYW5nZU1ldGEsIGlu c3RhbmNlTWV0YSkgewogICAgICB2YXIgbWFwcGVkID0gY2FsbGJhY2suY2Fs bCh0aGlzLCBpdGVtKTsKICAgICAgYXJyYXkuaW5zZXJ0QXQoY2hhbmdlTWV0 YS5pbmRleCwgbWFwcGVkKTsKICAgICAgcmV0dXJuIGFycmF5OwogICAgfSwK ICAgIHJlbW92ZWRJdGVtOiBmdW5jdGlvbihhcnJheSwgaXRlbSwgY2hhbmdl TWV0YSwgaW5zdGFuY2VNZXRhKSB7CiAgICAgIGFycmF5LnJlbW92ZUF0KGNo YW5nZU1ldGEuaW5kZXgsIDEpOwogICAgICByZXR1cm4gYXJyYXk7CiAgICB9 CiAgfTsKCiAgcmV0dXJuIEVtYmVyLmFycmF5Q29tcHV0ZWQoZGVwZW5kZW50 S2V5LCBvcHRpb25zKTsKfTsKCi8qKgogIFJldHVybnMgYW4gYXJyYXkgbWFw cGVkIHRvIHRoZSBzcGVjaWZpZWQga2V5LgoKICBgYGBqYXZhc2NyaXB0CiAg QXBwLlBlcnNvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoewogICAgY2hpbGRB Z2VzOiBFbWJlci5jb21wdXRlZC5tYXBCeSgnY2hpbGRyZW4nLCAnYWdlJykK ICB9KTsKCiAgdmFyIGxvcmRCeXJvbiA9IEFwcC5QZXJzb24uY3JlYXRlKHtj aGlsZHJlbjogW119KTsKICBsb3JkQnlyb24uZ2V0KCdjaGlsZEFnZXMnKTsg Ly8gW10KICBsb3JkQnlyb24uZ2V0KCdjaGlsZHJlbicpLnB1c2hPYmplY3Qo e25hbWU6ICdBdWd1c3RhIEFkYSBCeXJvbicsIGFnZTogN30pOwogIGxvcmRC eXJvbi5nZXQoJ2NoaWxkQWdlcycpOyAvLyBbN10KICBsb3JkQnlyb24uZ2V0 KCdjaGlsZHJlbicpLnB1c2hPYmplY3RzKFt7CiAgICBuYW1lOiAnQWxsZWdy YSBCeXJvbicsCiAgICBhZ2U6IDUKICB9LCB7CiAgICBuYW1lOiAnRWxpemFi ZXRoIE1lZG9yYSBMZWlnaCcsCiAgICBhZ2U6IDgKICB9XSk7CiAgbG9yZEJ5 cm9uLmdldCgnY2hpbGRBZ2VzJyk7IC8vIFs3LCA1LCA4XQogIGBgYAoKICBA bWV0aG9kIGNvbXB1dGVkLm1hcEJ5CiAgQGZvciBFbWJlcgogIEBwYXJhbSB7 U3RyaW5nfSBkZXBlbmRlbnRLZXkKICBAcGFyYW0ge1N0cmluZ30gcHJvcGVy dHlLZXkKICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSBhbiBh cnJheSBtYXBwZWQgdG8gdGhlIHNwZWNpZmllZCBrZXkKKi8KRW1iZXIuY29t cHV0ZWQubWFwQnkgPSBmdW5jdGlvbihkZXBlbmRlbnRLZXksIHByb3BlcnR5 S2V5KSB7CiAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24oaXRlbSkgeyByZXR1 cm4gZ2V0KGl0ZW0sIHByb3BlcnR5S2V5KTsgfTsKICByZXR1cm4gRW1iZXIu Y29tcHV0ZWQubWFwKGRlcGVuZGVudEtleSArICcuQGVhY2guJyArIHByb3Bl cnR5S2V5LCBjYWxsYmFjayk7Cn07CgovKioKICBAbWV0aG9kIGNvbXB1dGVk Lm1hcFByb3BlcnR5CiAgQGZvciBFbWJlcgogIEBkZXByZWNhdGVkIFVzZSBg RW1iZXIuY29tcHV0ZWQubWFwQnlgIGluc3RlYWQKICBAcGFyYW0gZGVwZW5k ZW50S2V5CiAgQHBhcmFtIHByb3BlcnR5S2V5CiovCkVtYmVyLmNvbXB1dGVk Lm1hcFByb3BlcnR5ID0gRW1iZXIuY29tcHV0ZWQubWFwQnk7CgovKioKICBG aWx0ZXJzIHRoZSBhcnJheSBieSB0aGUgY2FsbGJhY2suCgogIFRoZSBjYWxs YmFjayBtZXRob2QgeW91IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxv d2luZyBzaWduYXR1cmUuCiAgYGl0ZW1gIGlzIHRoZSBjdXJyZW50IGl0ZW0g aW4gdGhlIGl0ZXJhdGlvbi4KCiAgYGBgamF2YXNjcmlwdAogIGZ1bmN0aW9u KGl0ZW0pOwogIGBgYAoKICBgYGBqYXZhc2NyaXB0CiAgQXBwLkhhbXN0ZXIg PSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKICAgIHJlbWFpbmluZ0Nob3Jlczog RW1iZXIuY29tcHV0ZWQuZmlsdGVyKCdjaG9yZXMnLCBmdW5jdGlvbihjaG9y ZSkgewogICAgICByZXR1cm4gIWNob3JlLmRvbmU7CiAgICB9KQogIH0pOwoK ICB2YXIgaGFtc3RlciA9IEFwcC5IYW1zdGVyLmNyZWF0ZSh7Y2hvcmVzOiBb CiAgICB7bmFtZTogJ2Nvb2snLCBkb25lOiB0cnVlfSwKICAgIHtuYW1lOiAn Y2xlYW4nLCBkb25lOiB0cnVlfSwKICAgIHtuYW1lOiAnd3JpdGUgbW9yZSB1 bml0IHRlc3RzJywgZG9uZTogZmFsc2V9CiAgXX0pOwogIGhhbXN0ZXIuZ2V0 KCdyZW1haW5pbmdDaG9yZXMnKTsgLy8gW3tuYW1lOiAnd3JpdGUgbW9yZSB1 bml0IHRlc3RzJywgZG9uZTogZmFsc2V9XQogIGBgYAoKICBAbWV0aG9kIGNv bXB1dGVkLmZpbHRlcgogIEBmb3IgRW1iZXIKICBAcGFyYW0ge1N0cmluZ30g ZGVwZW5kZW50S2V5CiAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKICBA cmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3BlcnR5fSB0aGUgZmlsdGVyZWQg YXJyYXkKKi8KRW1iZXIuY29tcHV0ZWQuZmlsdGVyID0gZnVuY3Rpb24oZGVw ZW5kZW50S2V5LCBjYWxsYmFjaykgewogIHZhciBvcHRpb25zID0gewogICAg aW5pdGlhbGl6ZTogZnVuY3Rpb24gKGFycmF5LCBjaGFuZ2VNZXRhLCBpbnN0 YW5jZU1ldGEpIHsKICAgICAgaW5zdGFuY2VNZXRhLmZpbHRlcmVkQXJyYXlJ bmRleGVzID0gbmV3IEVtYmVyLlN1YkFycmF5KCk7CiAgICB9LAoKICAgIGFk ZGVkSXRlbTogZnVuY3Rpb24oYXJyYXksIGl0ZW0sIGNoYW5nZU1ldGEsIGlu c3RhbmNlTWV0YSkgewogICAgICB2YXIgbWF0Y2ggPSAhIWNhbGxiYWNrLmNh bGwodGhpcywgaXRlbSksCiAgICAgICAgICBmaWx0ZXJJbmRleCA9IGluc3Rh bmNlTWV0YS5maWx0ZXJlZEFycmF5SW5kZXhlcy5hZGRJdGVtKGNoYW5nZU1l dGEuaW5kZXgsIG1hdGNoKTsKCiAgICAgIGlmIChtYXRjaCkgewogICAgICAg IGFycmF5Lmluc2VydEF0KGZpbHRlckluZGV4LCBpdGVtKTsKICAgICAgfQoK ICAgICAgcmV0dXJuIGFycmF5OwogICAgfSwKCiAgICByZW1vdmVkSXRlbTog ZnVuY3Rpb24oYXJyYXksIGl0ZW0sIGNoYW5nZU1ldGEsIGluc3RhbmNlTWV0 YSkgewogICAgICB2YXIgZmlsdGVySW5kZXggPSBpbnN0YW5jZU1ldGEuZmls dGVyZWRBcnJheUluZGV4ZXMucmVtb3ZlSXRlbShjaGFuZ2VNZXRhLmluZGV4 KTsKCiAgICAgIGlmIChmaWx0ZXJJbmRleCA+IC0xKSB7CiAgICAgICAgYXJy YXkucmVtb3ZlQXQoZmlsdGVySW5kZXgpOwogICAgICB9CgogICAgICByZXR1 cm4gYXJyYXk7CiAgICB9CiAgfTsKCiAgcmV0dXJuIEVtYmVyLmFycmF5Q29t cHV0ZWQoZGVwZW5kZW50S2V5LCBvcHRpb25zKTsKfTsKCi8qKgogIEZpbHRl cnMgdGhlIGFycmF5IGJ5IHRoZSBwcm9wZXJ0eSBhbmQgdmFsdWUKCiAgYGBg amF2YXNjcmlwdAogIEFwcC5IYW1zdGVyID0gRW1iZXIuT2JqZWN0LmV4dGVu ZCh7CiAgICByZW1haW5pbmdDaG9yZXM6IEVtYmVyLmNvbXB1dGVkLmZpbHRl ckJ5KCdjaG9yZXMnLCAnZG9uZScsIGZhbHNlKQogIH0pOwoKICB2YXIgaGFt c3RlciA9IEFwcC5IYW1zdGVyLmNyZWF0ZSh7Y2hvcmVzOiBbCiAgICB7bmFt ZTogJ2Nvb2snLCBkb25lOiB0cnVlfSwKICAgIHtuYW1lOiAnY2xlYW4nLCBk b25lOiB0cnVlfSwKICAgIHtuYW1lOiAnd3JpdGUgbW9yZSB1bml0IHRlc3Rz JywgZG9uZTogZmFsc2V9CiAgXX0pOwogIGhhbXN0ZXIuZ2V0KCdyZW1haW5p bmdDaG9yZXMnKTsgLy8gW3tuYW1lOiAnd3JpdGUgbW9yZSB1bml0IHRlc3Rz JywgZG9uZTogZmFsc2V9XQogIGBgYAoKICBAbWV0aG9kIGNvbXB1dGVkLmZp bHRlckJ5CiAgQGZvciBFbWJlcgogIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRl bnRLZXkKICBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlLZXkKICBAcGFyYW0g e1N0cmluZ30gdmFsdWUKICBAcmV0dXJuIHtFbWJlci5Db21wdXRlZFByb3Bl cnR5fSB0aGUgZmlsdGVyZWQgYXJyYXkKKi8KRW1iZXIuY29tcHV0ZWQuZmls dGVyQnkgPSBmdW5jdGlvbihkZXBlbmRlbnRLZXksIHByb3BlcnR5S2V5LCB2 YWx1ZSkgewogIHZhciBjYWxsYmFjazsKCiAgaWYgKGFyZ3VtZW50cy5sZW5n dGggPT09IDIpIHsKICAgIGNhbGxiYWNrID0gZnVuY3Rpb24oaXRlbSkgewog ICAgICByZXR1cm4gZ2V0KGl0ZW0sIHByb3BlcnR5S2V5KTsKICAgIH07CiAg fSBlbHNlIHsKICAgIGNhbGxiYWNrID0gZnVuY3Rpb24oaXRlbSkgewogICAg ICByZXR1cm4gZ2V0KGl0ZW0sIHByb3BlcnR5S2V5KSA9PT0gdmFsdWU7CiAg ICB9OwogIH0KCiAgcmV0dXJuIEVtYmVyLmNvbXB1dGVkLmZpbHRlcihkZXBl bmRlbnRLZXkgKyAnLkBlYWNoLicgKyBwcm9wZXJ0eUtleSwgY2FsbGJhY2sp Owp9OwoKLyoqCiAgQG1ldGhvZCBjb21wdXRlZC5maWx0ZXJQcm9wZXJ0eQog IEBmb3IgRW1iZXIKICBAcGFyYW0gZGVwZW5kZW50S2V5CiAgQHBhcmFtIHBy b3BlcnR5S2V5CiAgQHBhcmFtIHZhbHVlCiAgQGRlcHJlY2F0ZWQgVXNlIGBF bWJlci5jb21wdXRlZC5maWx0ZXJCeWAgaW5zdGVhZAoqLwpFbWJlci5jb21w dXRlZC5maWx0ZXJQcm9wZXJ0eSA9IEVtYmVyLmNvbXB1dGVkLmZpbHRlckJ5 OwoKLyoqCiAgQSBjb21wdXRlZCBwcm9wZXJ0eSB3aGljaCByZXR1cm5zIGEg bmV3IGFycmF5IHdpdGggYWxsIHRoZSB1bmlxdWUKICBlbGVtZW50cyBmcm9t IG9uZSBvciBtb3JlIGRlcGVuZGVudCBhcnJheXMuCgogIEV4YW1wbGUKCiAg YGBgamF2YXNjcmlwdAogIEFwcC5IYW1zdGVyID0gRW1iZXIuT2JqZWN0LmV4 dGVuZCh7CiAgICB1bmlxdWVGcnVpdHM6IEVtYmVyLmNvbXB1dGVkLnVuaXEo J2ZydWl0cycpCiAgfSk7CgogIHZhciBoYW1zdGVyID0gQXBwLkhhbXN0ZXIu Y3JlYXRlKHtmcnVpdHM6IFsKICAgICdiYW5hbmEnLAogICAgJ2dyYXBlJywK ICAgICdrYWxlJywKICAgICdiYW5hbmEnCiAgXX0pOwogIGhhbXN0ZXIuZ2V0 KCd1bmlxdWVGcnVpdHMnKTsgLy8gWydiYW5hbmEnLCAnZ3JhcGUnLCAna2Fs ZSddCiAgYGBgCgogIEBtZXRob2QgY29tcHV0ZWQudW5pcQogIEBmb3IgRW1i ZXIKICBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlLZXkqCiAgQHJldHVybiB7 RW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eX0gY29tcHV0ZXMgYSBuZXcgYXJyYXkg d2l0aCBhbGwgdGhlCiAgdW5pcXVlIGVsZW1lbnRzIGZyb20gdGhlIGRlcGVu ZGVudCBhcnJheQoqLwpFbWJlci5jb21wdXRlZC51bmlxID0gZnVuY3Rpb24o KSB7CiAgdmFyIGFyZ3MgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzKTsKICBh cmdzLnB1c2goewogICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oYXJyYXksIGNo YW5nZU1ldGEsIGluc3RhbmNlTWV0YSkgewogICAgICBpbnN0YW5jZU1ldGEu aXRlbUNvdW50cyA9IHt9OwogICAgfSwKCiAgICBhZGRlZEl0ZW06IGZ1bmN0 aW9uKGFycmF5LCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5jZU1ldGEpIHsK ICAgICAgdmFyIGd1aWQgPSBndWlkRm9yKGl0ZW0pOwoKICAgICAgaWYgKCFp bnN0YW5jZU1ldGEuaXRlbUNvdW50c1tndWlkXSkgewogICAgICAgIGluc3Rh bmNlTWV0YS5pdGVtQ291bnRzW2d1aWRdID0gMTsKICAgICAgfSBlbHNlIHsK ICAgICAgICArK2luc3RhbmNlTWV0YS5pdGVtQ291bnRzW2d1aWRdOwogICAg ICB9CiAgICAgIGFycmF5LmFkZE9iamVjdChpdGVtKTsKICAgICAgcmV0dXJu IGFycmF5OwogICAgfSwKICAgIHJlbW92ZWRJdGVtOiBmdW5jdGlvbihhcnJh eSwgaXRlbSwgXywgaW5zdGFuY2VNZXRhKSB7CiAgICAgIHZhciBndWlkID0g Z3VpZEZvcihpdGVtKSwKICAgICAgICAgIGl0ZW1Db3VudHMgPSBpbnN0YW5j ZU1ldGEuaXRlbUNvdW50czsKCiAgICAgIGlmICgtLWl0ZW1Db3VudHNbZ3Vp ZF0gPT09IDApIHsKICAgICAgICBhcnJheS5yZW1vdmVPYmplY3QoaXRlbSk7 CiAgICAgIH0KICAgICAgcmV0dXJuIGFycmF5OwogICAgfQogIH0pOwogIHJl dHVybiBFbWJlci5hcnJheUNvbXB1dGVkLmFwcGx5KG51bGwsIGFyZ3MpOwp9 OwoKLyoqCiAgQWxpYXMgZm9yIFtFbWJlci5jb21wdXRlZC51bmlxXSgvYXBp LyNtZXRob2RfY29tcHV0ZWRfdW5pcSkuCgogIEBtZXRob2QgY29tcHV0ZWQu dW5pb24KICBAZm9yIEVtYmVyCiAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5 S2V5KgogIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1 dGVzIGEgbmV3IGFycmF5IHdpdGggYWxsIHRoZQogIHVuaXF1ZSBlbGVtZW50 cyBmcm9tIHRoZSBkZXBlbmRlbnQgYXJyYXkKKi8KRW1iZXIuY29tcHV0ZWQu dW5pb24gPSBFbWJlci5jb21wdXRlZC51bmlxOwoKLyoqCiAgQSBjb21wdXRl ZCBwcm9wZXJ0eSB3aGljaCByZXR1cm5zIGEgbmV3IGFycmF5IHdpdGggYWxs IHRoZSBkdXBsaWNhdGVkCiAgZWxlbWVudHMgZnJvbSB0d28gb3IgbW9yZSBk ZXBlbmRlbnQgYXJyYXlzLgoKICBFeGFtcGxlCgogIGBgYGphdmFzY3JpcHQK ICB2YXIgb2JqID0gRW1iZXIuT2JqZWN0LmNyZWF0ZVdpdGhNaXhpbnMoewog ICAgYWRhRnJpZW5kczogWydDaGFybGVzIEJhYmJhZ2UnLCAnSm9obiBIb2Jo b3VzZScsICdXaWxsaWFtIEtpbmcnLCAnTWFyeSBTb21lcnZpbGxlJ10sCiAg ICBjaGFybGVzRnJpZW5kczogWydXaWxsaWFtIEtpbmcnLCAnTWFyeSBTb21l cnZpbGxlJywgJ0FkYSBMb3ZlbGFjZScsICdHZW9yZ2UgUGVhY29jayddLAog ICAgZnJpZW5kc0luQ29tbW9uOiBFbWJlci5jb21wdXRlZC5pbnRlcnNlY3Qo J2FkYUZyaWVuZHMnLCAnY2hhcmxlc0ZyaWVuZHMnKQogIH0pOwoKICBvYmou Z2V0KCdmcmllbmRzSW5Db21tb24nKTsgLy8gWydXaWxsaWFtIEtpbmcnLCAn TWFyeSBTb21lcnZpbGxlJ10KICBgYGAKCiAgQG1ldGhvZCBjb21wdXRlZC5p bnRlcnNlY3QKICBAZm9yIEVtYmVyCiAgQHBhcmFtIHtTdHJpbmd9IHByb3Bl cnR5S2V5KgogIEByZXR1cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNv bXB1dGVzIGEgbmV3IGFycmF5IHdpdGggYWxsIHRoZQogIGR1cGxpY2F0ZWQg ZWxlbWVudHMgZnJvbSB0aGUgZGVwZW5kZW50IGFycmF5cwoqLwpFbWJlci5j b21wdXRlZC5pbnRlcnNlY3QgPSBmdW5jdGlvbiAoKSB7CiAgdmFyIGdldERl cGVuZGVudEtleUd1aWRzID0gZnVuY3Rpb24gKGNoYW5nZU1ldGEpIHsKICAg IHJldHVybiBtYXAoY2hhbmdlTWV0YS5wcm9wZXJ0eS5fZGVwZW5kZW50S2V5 cywgZnVuY3Rpb24gKGRlcGVuZGVudEtleSkgewogICAgICByZXR1cm4gZ3Vp ZEZvcihkZXBlbmRlbnRLZXkpOwogICAgfSk7CiAgfTsKCiAgdmFyIGFyZ3Mg PSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzKTsKICBhcmdzLnB1c2goewogICAg aW5pdGlhbGl6ZTogZnVuY3Rpb24gKGFycmF5LCBjaGFuZ2VNZXRhLCBpbnN0 YW5jZU1ldGEpIHsKICAgICAgaW5zdGFuY2VNZXRhLml0ZW1Db3VudHMgPSB7 fTsKICAgIH0sCgogICAgYWRkZWRJdGVtOiBmdW5jdGlvbihhcnJheSwgaXRl bSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRhKSB7CiAgICAgIHZhciBpdGVt R3VpZCA9IGd1aWRGb3IoaXRlbSksCiAgICAgICAgICBkZXBlbmRlbnRHdWlk cyA9IGdldERlcGVuZGVudEtleUd1aWRzKGNoYW5nZU1ldGEpLAogICAgICAg ICAgZGVwZW5kZW50R3VpZCA9IGd1aWRGb3IoY2hhbmdlTWV0YS5hcnJheUNo YW5nZWQpLAogICAgICAgICAgbnVtYmVyT2ZEZXBlbmRlbnRBcnJheXMgPSBj aGFuZ2VNZXRhLnByb3BlcnR5Ll9kZXBlbmRlbnRLZXlzLmxlbmd0aCwKICAg ICAgICAgIGl0ZW1Db3VudHMgPSBpbnN0YW5jZU1ldGEuaXRlbUNvdW50czsK CiAgICAgIGlmICghaXRlbUNvdW50c1tpdGVtR3VpZF0pIHsgaXRlbUNvdW50 c1tpdGVtR3VpZF0gPSB7fTsgfQogICAgICBpZiAoaXRlbUNvdW50c1tpdGVt R3VpZF1bZGVwZW5kZW50R3VpZF0gPT09IHVuZGVmaW5lZCkgeyBpdGVtQ291 bnRzW2l0ZW1HdWlkXVtkZXBlbmRlbnRHdWlkXSA9IDA7IH0KCiAgICAgIGlm ICgrK2l0ZW1Db3VudHNbaXRlbUd1aWRdW2RlcGVuZGVudEd1aWRdID09PSAx ICYmCiAgICAgICAgICBudW1iZXJPZkRlcGVuZGVudEFycmF5cyA9PT0gRW1i ZXIua2V5cyhpdGVtQ291bnRzW2l0ZW1HdWlkXSkubGVuZ3RoKSB7CgogICAg ICAgIGFycmF5LmFkZE9iamVjdChpdGVtKTsKICAgICAgfQogICAgICByZXR1 cm4gYXJyYXk7CiAgICB9LAogICAgcmVtb3ZlZEl0ZW06IGZ1bmN0aW9uKGFy cmF5LCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5jZU1ldGEpIHsKICAgICAg dmFyIGl0ZW1HdWlkID0gZ3VpZEZvcihpdGVtKSwKICAgICAgICAgIGRlcGVu ZGVudEd1aWRzID0gZ2V0RGVwZW5kZW50S2V5R3VpZHMoY2hhbmdlTWV0YSks CiAgICAgICAgICBkZXBlbmRlbnRHdWlkID0gZ3VpZEZvcihjaGFuZ2VNZXRh LmFycmF5Q2hhbmdlZCksCiAgICAgICAgICBudW1iZXJPZkRlcGVuZGVudEFy cmF5cyA9IGNoYW5nZU1ldGEucHJvcGVydHkuX2RlcGVuZGVudEtleXMubGVu Z3RoLAogICAgICAgICAgbnVtYmVyT2ZBcnJheXNJdGVtQXBwZWFyc0luLAog ICAgICAgICAgaXRlbUNvdW50cyA9IGluc3RhbmNlTWV0YS5pdGVtQ291bnRz OwoKICAgICAgaWYgKGl0ZW1Db3VudHNbaXRlbUd1aWRdW2RlcGVuZGVudEd1 aWRdID09PSB1bmRlZmluZWQpIHsgaXRlbUNvdW50c1tpdGVtR3VpZF1bZGVw ZW5kZW50R3VpZF0gPSAwOyB9CiAgICAgIGlmICgtLWl0ZW1Db3VudHNbaXRl bUd1aWRdW2RlcGVuZGVudEd1aWRdID09PSAwKSB7CiAgICAgICAgZGVsZXRl IGl0ZW1Db3VudHNbaXRlbUd1aWRdW2RlcGVuZGVudEd1aWRdOwogICAgICAg IG51bWJlck9mQXJyYXlzSXRlbUFwcGVhcnNJbiA9IEVtYmVyLmtleXMoaXRl bUNvdW50c1tpdGVtR3VpZF0pLmxlbmd0aDsKCiAgICAgICAgaWYgKG51bWJl ck9mQXJyYXlzSXRlbUFwcGVhcnNJbiA9PT0gMCkgewogICAgICAgICAgZGVs ZXRlIGl0ZW1Db3VudHNbaXRlbUd1aWRdOwogICAgICAgIH0KICAgICAgICBh cnJheS5yZW1vdmVPYmplY3QoaXRlbSk7CiAgICAgIH0KICAgICAgcmV0dXJu IGFycmF5OwogICAgfQogIH0pOwogIHJldHVybiBFbWJlci5hcnJheUNvbXB1 dGVkLmFwcGx5KG51bGwsIGFyZ3MpOwp9OwoKLyoqCiAgQSBjb21wdXRlZCBw cm9wZXJ0eSB3aGljaCByZXR1cm5zIGEgbmV3IGFycmF5IHdpdGggYWxsIHRo ZQogIHByb3BlcnRpZXMgZnJvbSB0aGUgZmlyc3QgZGVwZW5kZW50IGFycmF5 IHRoYXQgYXJlIG5vdCBpbiB0aGUgc2Vjb25kCiAgZGVwZW5kZW50IGFycmF5 LgoKICBFeGFtcGxlCgogIGBgYGphdmFzY3JpcHQKICBBcHAuSGFtc3RlciA9 IEVtYmVyLk9iamVjdC5leHRlbmQoewogICAgbGlrZXM6IFsnYmFuYW5hJywg J2dyYXBlJywgJ2thbGUnXSwKICAgIHdhbnRzOiBFbWJlci5jb21wdXRlZC5z ZXREaWZmKCdsaWtlcycsICdmcnVpdHMnKQogIH0pOwoKICB2YXIgaGFtc3Rl ciA9IEFwcC5IYW1zdGVyLmNyZWF0ZSh7ZnJ1aXRzOiBbCiAgICAnZ3JhcGUn LAogICAgJ2thbGUnLAogIF19KTsKICBoYW1zdGVyLmdldCgnd2FudHMnKTsg Ly8gWydiYW5hbmEnXQogIGBgYAoKICBAbWV0aG9kIGNvbXB1dGVkLnNldERp ZmYKICBAZm9yIEVtYmVyCiAgQHBhcmFtIHtTdHJpbmd9IHNldEFQcm9wZXJ0 eQogIEBwYXJhbSB7U3RyaW5nfSBzZXRCUHJvcGVydHkKICBAcmV0dXJuIHtF bWJlci5Db21wdXRlZFByb3BlcnR5fSBjb21wdXRlcyBhIG5ldyBhcnJheSB3 aXRoIGFsbCB0aGUKICBpdGVtcyBmcm9tIHRoZSBmaXJzdCBkZXBlbmRlbnQg YXJyYXkgdGhhdCBhcmUgbm90IGluIHRoZSBzZWNvbmQKICBkZXBlbmRlbnQg YXJyYXkKKi8KRW1iZXIuY29tcHV0ZWQuc2V0RGlmZiA9IGZ1bmN0aW9uIChz ZXRBUHJvcGVydHksIHNldEJQcm9wZXJ0eSkgewogIGlmIChhcmd1bWVudHMu bGVuZ3RoICE9PSAyKSB7CiAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoInNl dERpZmYgcmVxdWlyZXMgZXhhY3RseSB0d28gZGVwZW5kZW50IGFycmF5cy4i KTsKICB9CiAgcmV0dXJuIEVtYmVyLmFycmF5Q29tcHV0ZWQoc2V0QVByb3Bl cnR5LCBzZXRCUHJvcGVydHksIHsKICAgIGFkZGVkSXRlbTogZnVuY3Rpb24g KGFycmF5LCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5jZU1ldGEpIHsKICAg ICAgdmFyIHNldEEgPSBnZXQodGhpcywgc2V0QVByb3BlcnR5KSwKICAgICAg ICAgIHNldEIgPSBnZXQodGhpcywgc2V0QlByb3BlcnR5KTsKCiAgICAgIGlm IChjaGFuZ2VNZXRhLmFycmF5Q2hhbmdlZCA9PT0gc2V0QSkgewogICAgICAg IGlmICghc2V0Qi5jb250YWlucyhpdGVtKSkgewogICAgICAgICAgYXJyYXku YWRkT2JqZWN0KGl0ZW0pOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAg ICAgICBhcnJheS5yZW1vdmVPYmplY3QoaXRlbSk7CiAgICAgIH0KICAgICAg cmV0dXJuIGFycmF5OwogICAgfSwKCiAgICByZW1vdmVkSXRlbTogZnVuY3Rp b24gKGFycmF5LCBpdGVtLCBjaGFuZ2VNZXRhLCBpbnN0YW5jZU1ldGEpIHsK ICAgICAgdmFyIHNldEEgPSBnZXQodGhpcywgc2V0QVByb3BlcnR5KSwKICAg ICAgICAgIHNldEIgPSBnZXQodGhpcywgc2V0QlByb3BlcnR5KTsKCiAgICAg IGlmIChjaGFuZ2VNZXRhLmFycmF5Q2hhbmdlZCA9PT0gc2V0QikgewogICAg ICAgIGlmIChzZXRBLmNvbnRhaW5zKGl0ZW0pKSB7CiAgICAgICAgICBhcnJh eS5hZGRPYmplY3QoaXRlbSk7CiAgICAgICAgfQogICAgICB9IGVsc2Ugewog ICAgICAgIGFycmF5LnJlbW92ZU9iamVjdChpdGVtKTsKICAgICAgfQogICAg ICByZXR1cm4gYXJyYXk7CiAgICB9CiAgfSk7Cn07CgpmdW5jdGlvbiBiaW5h cnlTZWFyY2goYXJyYXksIGl0ZW0sIGxvdywgaGlnaCkgewogIHZhciBtaWQs IG1pZEl0ZW0sIHJlcywgZ3VpZE1pZCwgZ3VpZEl0ZW07CgogIGlmIChhcmd1 bWVudHMubGVuZ3RoIDwgNCkgeyBoaWdoID0gZ2V0KGFycmF5LCAnbGVuZ3Ro Jyk7IH0KICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIHsgbG93ID0gMDsg fQoKICBpZiAobG93ID09PSBoaWdoKSB7CiAgICByZXR1cm4gbG93OwogIH0K CiAgbWlkID0gbG93ICsgTWF0aC5mbG9vcigoaGlnaCAtIGxvdykgLyAyKTsK ICBtaWRJdGVtID0gYXJyYXkub2JqZWN0QXQobWlkKTsKCiAgZ3VpZE1pZCA9 IF9ndWlkRm9yKG1pZEl0ZW0pOwogIGd1aWRJdGVtID0gX2d1aWRGb3IoaXRl bSk7CgogIGlmIChndWlkTWlkID09PSBndWlkSXRlbSkgewogICAgcmV0dXJu IG1pZDsKICB9CgogIHJlcyA9IHRoaXMub3JkZXIobWlkSXRlbSwgaXRlbSk7 CiAgaWYgKHJlcyA9PT0gMCkgewogICAgcmVzID0gZ3VpZE1pZCA8IGd1aWRJ dGVtID8gLTEgOiAxOwogIH0KCgogIGlmIChyZXMgPCAwKSB7CiAgICByZXR1 cm4gdGhpcy5iaW5hcnlTZWFyY2goYXJyYXksIGl0ZW0sIG1pZCsxLCBoaWdo KTsKICB9IGVsc2UgaWYgKHJlcyA+IDApIHsKICAgIHJldHVybiB0aGlzLmJp bmFyeVNlYXJjaChhcnJheSwgaXRlbSwgbG93LCBtaWQpOwogIH0KCiAgcmV0 dXJuIG1pZDsKCiAgZnVuY3Rpb24gX2d1aWRGb3IoaXRlbSkgewogICAgaWYg KFNlYXJjaFByb3h5LmRldGVjdEluc3RhbmNlKGl0ZW0pKSB7CiAgICAgIHJl dHVybiBndWlkRm9yKGdldChpdGVtLCAnY29udGVudCcpKTsKICAgIH0KICAg IHJldHVybiBndWlkRm9yKGl0ZW0pOwogIH0KfQoKClNlYXJjaFByb3h5ID0g RW1iZXIuT2JqZWN0UHJveHkuZXh0ZW5kKCk7CgovKioKICBBIGNvbXB1dGVk IHByb3BlcnR5IHdoaWNoIHJldHVybnMgYSBuZXcgYXJyYXkgd2l0aCBhbGwg dGhlCiAgcHJvcGVydGllcyBmcm9tIHRoZSBmaXJzdCBkZXBlbmRlbnQgYXJy YXkgc29ydGVkIGJhc2VkIG9uIGEgcHJvcGVydHkKICBvciBzb3J0IGZ1bmN0 aW9uLgoKICBUaGUgY2FsbGJhY2sgbWV0aG9kIHlvdSBwcm92aWRlIHNob3Vs ZCBoYXZlIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlOgoKICBgYGBqYXZhc2Ny aXB0CiAgZnVuY3Rpb24oaXRlbUEsIGl0ZW1CKTsKICBgYGAKCiAgLSBgaXRl bUFgIHRoZSBmaXJzdCBpdGVtIHRvIGNvbXBhcmUuCiAgLSBgaXRlbUJgIHRo ZSBzZWNvbmQgaXRlbSB0byBjb21wYXJlLgoKICBUaGlzIGZ1bmN0aW9uIHNo b3VsZCByZXR1cm4gYC0xYCB3aGVuIGBpdGVtQWAgc2hvdWxkIGNvbWUgYmVm b3JlCiAgYGl0ZW1CYC4gSXQgc2hvdWxkIHJldHVybiBgMWAgd2hlbiBgaXRl bUFgIHNob3VsZCBjb21lIGFmdGVyCiAgYGl0ZW1CYC4gSWYgdGhlIGBpdGVt QWAgYW5kIGBpdGVtQmAgYXJlIGVxdWFsIHRoaXMgZnVuY3Rpb24gc2hvdWxk IHJldHVybiBgMGAuCgogIEV4YW1wbGUKCiAgYGBgamF2YXNjcmlwdAogIHZh ciBUb0RvTGlzdCA9IEVtYmVyLk9iamVjdC5leHRlbmQoewogICAgdG9kb3NT b3J0aW5nOiBbJ25hbWUnXSwKICAgIHNvcnRlZFRvZG9zOiBFbWJlci5jb21w dXRlZC5zb3J0KCd0b2RvcycsICd0b2Rvc1NvcnRpbmcnKSwKICAgIHByaW9y aXR5VG9kb3M6IEVtYmVyLmNvbXB1dGVkLnNvcnQoJ3RvZG9zJywgZnVuY3Rp b24oYSwgYil7CiAgICAgIGlmIChhLnByaW9yaXR5ID4gYi5wcmlvcml0eSkg ewogICAgICAgIHJldHVybiAxOwogICAgICB9IGVsc2UgaWYgKGEucHJpb3Jp dHkgPCBiLnByaW9yaXR5KSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgICB9 CiAgICAgIHJldHVybiAwOwogICAgfSksCiAgfSk7CiAgdmFyIHRvZG9MaXN0 ID0gVG9Eb0xpc3QuY3JlYXRlKHt0b2RvczogWwogICAge25hbWU6ICdVbml0 IFRlc3QnLCBwcmlvcml0eTogMn0sCiAgICB7bmFtZTogJ0RvY3VtZW50YXRp b24nLCBwcmlvcml0eTogM30sCiAgICB7bmFtZTogJ1JlbGVhc2UnLCBwcmlv cml0eTogMX0KICBdfSk7CgogIHRvZG9MaXN0LmdldCgnc29ydGVkVG9kb3Mn KTsgLy8gW3tuYW1lOidEb2N1bWVudGF0aW9uJywgcHJpb3JpdHk6M30sIHtu YW1lOidSZWxlYXNlJywgcHJpb3JpdHk6MX0sIHtuYW1lOidVbml0IFRlc3Qn LCBwcmlvcml0eToyfV0KICB0b2RvTGlzdC5nZXQoJ3ByaW9yaXR5VG9kb3Mn KTsgLy8gW3tuYW1lOidSZWxlYXNlJywgcHJpb3JpdHk6MX0sIHtuYW1lOidV bml0IFRlc3QnLCBwcmlvcml0eToyfSwge25hbWU6J0RvY3VtZW50YXRpb24n LCBwcmlvcml0eTozfV0KICBgYGAKCiAgQG1ldGhvZCBjb21wdXRlZC5zb3J0 CiAgQGZvciBFbWJlcgogIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRlbnRLZXkK ICBAcGFyYW0ge1N0cmluZyBvciBGdW5jdGlvbn0gc29ydERlZmluaXRpb24g YSBkZXBlbmRlbnQga2V5IHRvIGFuCiAgYXJyYXkgb2Ygc29ydCBwcm9wZXJ0 aWVzIG9yIGEgZnVuY3Rpb24gdG8gdXNlIHdoZW4gc29ydGluZwogIEByZXR1 cm4ge0VtYmVyLkNvbXB1dGVkUHJvcGVydHl9IGNvbXB1dGVzIGEgbmV3IHNv cnRlZCBhcnJheSBiYXNlZAogIG9uIHRoZSBzb3J0IHByb3BlcnR5IGFycmF5 IG9yIGNhbGxiYWNrIGZ1bmN0aW9uCiovCkVtYmVyLmNvbXB1dGVkLnNvcnQg PSBmdW5jdGlvbiAoaXRlbXNLZXksIHNvcnREZWZpbml0aW9uKSB7CiAgRW1i ZXIuYXNzZXJ0KCJFbWJlci5jb21wdXRlZC5zb3J0IHJlcXVpcmVzIHR3byBh cmd1bWVudHM6IGFuIGFycmF5IGtleSB0byBzb3J0IGFuZCBlaXRoZXIgYSBz b3J0IHByb3BlcnRpZXMga2V5IG9yIHNvcnQgZnVuY3Rpb24iLCBhcmd1bWVu dHMubGVuZ3RoID09PSAyKTsKCiAgdmFyIGluaXRGbiwgc29ydFByb3BlcnRp ZXNLZXk7CgogIGlmICh0eXBlb2Ygc29ydERlZmluaXRpb24gPT09ICdmdW5j dGlvbicpIHsKICAgIGluaXRGbiA9IGZ1bmN0aW9uIChhcnJheSwgY2hhbmdl TWV0YSwgaW5zdGFuY2VNZXRhKSB7CiAgICAgIGluc3RhbmNlTWV0YS5vcmRl ciA9IHNvcnREZWZpbml0aW9uOwogICAgICBpbnN0YW5jZU1ldGEuYmluYXJ5 U2VhcmNoID0gYmluYXJ5U2VhcmNoOwogICAgfTsKICB9IGVsc2UgewogICAg c29ydFByb3BlcnRpZXNLZXkgPSBzb3J0RGVmaW5pdGlvbjsKICAgIGluaXRG biA9IGZ1bmN0aW9uIChhcnJheSwgY2hhbmdlTWV0YSwgaW5zdGFuY2VNZXRh KSB7CiAgICAgIGZ1bmN0aW9uIHNldHVwU29ydFByb3BlcnRpZXMoKSB7CiAg ICAgICAgdmFyIHNvcnRQcm9wZXJ0eURlZmluaXRpb25zID0gZ2V0KHRoaXMs IHNvcnRQcm9wZXJ0aWVzS2V5KSwKICAgICAgICAgICAgc29ydFByb3BlcnR5 LAogICAgICAgICAgICBzb3J0UHJvcGVydGllcyA9IGluc3RhbmNlTWV0YS5z b3J0UHJvcGVydGllcyA9IFtdLAogICAgICAgICAgICBzb3J0UHJvcGVydHlB c2NlbmRpbmcgPSBpbnN0YW5jZU1ldGEuc29ydFByb3BlcnR5QXNjZW5kaW5n ID0ge30sCiAgICAgICAgICAgIGlkeCwKICAgICAgICAgICAgYXNjOwoKICAg ICAgICBFbWJlci5hc3NlcnQoIkNhbm5vdCBzb3J0OiAnIiArIHNvcnRQcm9w ZXJ0aWVzS2V5ICsgIicgaXMgbm90IGFuIGFycmF5LiIsIEVtYmVyLmlzQXJy YXkoc29ydFByb3BlcnR5RGVmaW5pdGlvbnMpKTsKCiAgICAgICAgY2hhbmdl TWV0YS5wcm9wZXJ0eS5jbGVhckl0ZW1Qcm9wZXJ0eUtleXMoaXRlbXNLZXkp OwoKICAgICAgICBmb3JFYWNoKHNvcnRQcm9wZXJ0eURlZmluaXRpb25zLCBm dW5jdGlvbiAoc29ydFByb3BlcnR5RGVmaW5pdGlvbikgewogICAgICAgICAg aWYgKChpZHggPSBzb3J0UHJvcGVydHlEZWZpbml0aW9uLmluZGV4T2YoJzon KSkgIT09IC0xKSB7CiAgICAgICAgICAgIHNvcnRQcm9wZXJ0eSA9IHNvcnRQ cm9wZXJ0eURlZmluaXRpb24uc3Vic3RyaW5nKDAsIGlkeCk7CiAgICAgICAg ICAgIGFzYyA9IHNvcnRQcm9wZXJ0eURlZmluaXRpb24uc3Vic3RyaW5nKGlk eCsxKS50b0xvd2VyQ2FzZSgpICE9PSAnZGVzYyc7CiAgICAgICAgICB9IGVs c2UgewogICAgICAgICAgICBzb3J0UHJvcGVydHkgPSBzb3J0UHJvcGVydHlE ZWZpbml0aW9uOwogICAgICAgICAgICBhc2MgPSB0cnVlOwogICAgICAgICAg fQoKICAgICAgICAgIHNvcnRQcm9wZXJ0aWVzLnB1c2goc29ydFByb3BlcnR5 KTsKICAgICAgICAgIHNvcnRQcm9wZXJ0eUFzY2VuZGluZ1tzb3J0UHJvcGVy dHldID0gYXNjOwogICAgICAgICAgY2hhbmdlTWV0YS5wcm9wZXJ0eS5pdGVt UHJvcGVydHlLZXkoaXRlbXNLZXksIHNvcnRQcm9wZXJ0eSk7CiAgICAgICAg fSk7CgogICAgICAgIHNvcnRQcm9wZXJ0eURlZmluaXRpb25zLmFkZE9ic2Vy dmVyKCdAZWFjaCcsIHRoaXMsIHVwZGF0ZVNvcnRQcm9wZXJ0aWVzT25jZSk7 CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZVNvcnRQcm9wZXJ0aWVz T25jZSgpIHsKICAgICAgICBFbWJlci5ydW4ub25jZSh0aGlzLCB1cGRhdGVT b3J0UHJvcGVydGllcywgY2hhbmdlTWV0YS5wcm9wZXJ0eU5hbWUpOwogICAg ICB9CgogICAgICBmdW5jdGlvbiB1cGRhdGVTb3J0UHJvcGVydGllcyhwcm9w ZXJ0eU5hbWUpIHsKICAgICAgICBzZXR1cFNvcnRQcm9wZXJ0aWVzLmNhbGwo dGhpcyk7CiAgICAgICAgY2hhbmdlTWV0YS5wcm9wZXJ0eS5yZWNvbXB1dGVP bmNlLmNhbGwodGhpcywgcHJvcGVydHlOYW1lKTsKICAgICAgfQoKICAgICAg RW1iZXIuYWRkT2JzZXJ2ZXIodGhpcywgc29ydFByb3BlcnRpZXNLZXksIHVw ZGF0ZVNvcnRQcm9wZXJ0aWVzT25jZSk7CgogICAgICBzZXR1cFNvcnRQcm9w ZXJ0aWVzLmNhbGwodGhpcyk7CgoKICAgICAgaW5zdGFuY2VNZXRhLm9yZGVy ID0gZnVuY3Rpb24gKGl0ZW1BLCBpdGVtQikgewogICAgICAgIHZhciBpc1By b3h5ID0gaXRlbUIgaW5zdGFuY2VvZiBTZWFyY2hQcm94eSwKICAgICAgICAg ICAgc29ydFByb3BlcnR5LCByZXN1bHQsIGFzYzsKCiAgICAgICAgZm9yICh2 YXIgaSA9IDA7IGkgPCB0aGlzLnNvcnRQcm9wZXJ0aWVzLmxlbmd0aDsgKytp KSB7CiAgICAgICAgICBzb3J0UHJvcGVydHkgPSB0aGlzLnNvcnRQcm9wZXJ0 aWVzW2ldOwogICAgICAgICAgcmVzdWx0ID0gRW1iZXIuY29tcGFyZShnZXQo aXRlbUEsIHNvcnRQcm9wZXJ0eSksIGlzUHJveHkgPyBpdGVtQltzb3J0UHJv cGVydHldIDogZ2V0KGl0ZW1CLCBzb3J0UHJvcGVydHkpKTsKCiAgICAgICAg ICBpZiAocmVzdWx0ICE9PSAwKSB7CiAgICAgICAgICAgIGFzYyA9IHRoaXMu c29ydFByb3BlcnR5QXNjZW5kaW5nW3NvcnRQcm9wZXJ0eV07CiAgICAgICAg ICAgIHJldHVybiBhc2MgPyByZXN1bHQgOiAoLTEgKiByZXN1bHQpOwogICAg ICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH07 CgogICAgICBpbnN0YW5jZU1ldGEuYmluYXJ5U2VhcmNoID0gYmluYXJ5U2Vh cmNoOwogICAgfTsKICB9CgogIHJldHVybiBFbWJlci5hcnJheUNvbXB1dGVk KGl0ZW1zS2V5LCB7CiAgICBpbml0aWFsaXplOiBpbml0Rm4sCgogICAgYWRk ZWRJdGVtOiBmdW5jdGlvbiAoYXJyYXksIGl0ZW0sIGNoYW5nZU1ldGEsIGlu c3RhbmNlTWV0YSkgewogICAgICB2YXIgaW5kZXggPSBpbnN0YW5jZU1ldGEu YmluYXJ5U2VhcmNoKGFycmF5LCBpdGVtKTsKICAgICAgYXJyYXkuaW5zZXJ0 QXQoaW5kZXgsIGl0ZW0pOwogICAgICByZXR1cm4gYXJyYXk7CiAgICB9LAoK ICAgIHJlbW92ZWRJdGVtOiBmdW5jdGlvbiAoYXJyYXksIGl0ZW0sIGNoYW5n ZU1ldGEsIGluc3RhbmNlTWV0YSkgewogICAgICB2YXIgcHJveHlQcm9wZXJ0 aWVzLCBpbmRleCwgc2VhcmNoSXRlbTsKCiAgICAgIGlmIChjaGFuZ2VNZXRh LnByZXZpb3VzVmFsdWVzKSB7CiAgICAgICAgcHJveHlQcm9wZXJ0aWVzID0g bWVyZ2UoeyBjb250ZW50OiBpdGVtIH0sIGNoYW5nZU1ldGEucHJldmlvdXNW YWx1ZXMpOwoKICAgICAgICBzZWFyY2hJdGVtID0gU2VhcmNoUHJveHkuY3Jl YXRlKHByb3h5UHJvcGVydGllcyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAg c2VhcmNoSXRlbSA9IGl0ZW07CiAgICAgIH0KCiAgICAgIGluZGV4ID0gaW5z dGFuY2VNZXRhLmJpbmFyeVNlYXJjaChhcnJheSwgc2VhcmNoSXRlbSk7CiAg ICAgIGFycmF5LnJlbW92ZUF0KGluZGV4KTsKICAgICAgcmV0dXJuIGFycmF5 OwogICAgfQogIH0pOwp9OwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewpFbWJl ci5SU1ZQID0gcmVxdWlyZU1vZHVsZSgncnN2cCcpOwoKRW1iZXIuUlNWUC5v bmVycm9yRGVmYXVsdCA9IGZ1bmN0aW9uKGVycm9yKSB7CiAgaWYgKGVycm9y IGluc3RhbmNlb2YgRXJyb3IpIHsKICAgIGlmIChFbWJlci50ZXN0aW5nKSB7 CiAgICAgIGlmIChFbWJlci5UZXN0ICYmIEVtYmVyLlRlc3QuYWRhcHRlcikg ewogICAgICAgIEVtYmVyLlRlc3QuYWRhcHRlci5leGNlcHRpb24oZXJyb3Ip OwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IGVycm9yOwogICAgICB9 CiAgICB9IGVsc2UgewogICAgICBFbWJlci5Mb2dnZXIuZXJyb3IoZXJyb3Iu c3RhY2spOwogICAgICBFbWJlci5hc3NlcnQoZXJyb3IsIGZhbHNlKTsKICAg IH0KICB9Cn07CgpFbWJlci5SU1ZQLm9uKCdlcnJvcicsIEVtYmVyLlJTVlAu b25lcnJvckRlZmF1bHQpOwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewovKioK QG1vZHVsZSBlbWJlcgpAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKKi8KCnZh ciBhX3NsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlOwoKdmFyIGV4cGFu ZFByb3BlcnRpZXMgPSBFbWJlci5leHBhbmRQcm9wZXJ0aWVzOwoKaWYgKEVt YmVyLkVYVEVORF9QUk9UT1RZUEVTID09PSB0cnVlIHx8IEVtYmVyLkVYVEVO RF9QUk9UT1RZUEVTLkZ1bmN0aW9uKSB7CgogIC8qKgogICAgVGhlIGBwcm9w ZXJ0eWAgZXh0ZW5zaW9uIG9mIEphdmFzY3JpcHQncyBGdW5jdGlvbiBwcm90 b3R5cGUgaXMgYXZhaWxhYmxlCiAgICB3aGVuIGBFbWJlci5FWFRFTkRfUFJP VE9UWVBFU2Agb3IgYEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTLkZ1bmN0aW9u YCBpcwogICAgYHRydWVgLCB3aGljaCBpcyB0aGUgZGVmYXVsdC4KCiAgICBD b21wdXRlZCBwcm9wZXJ0aWVzIGFsbG93IHlvdSB0byB0cmVhdCBhIGZ1bmN0 aW9uIGxpa2UgYSBwcm9wZXJ0eToKCiAgICBgYGBqYXZhc2NyaXB0CiAgICBN eUFwcC5QcmVzaWRlbnQgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHsKICAgICAg Zmlyc3ROYW1lOiAnJywKICAgICAgbGFzdE5hbWU6ICAnJywKCiAgICAgIGZ1 bGxOYW1lOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXQo J2ZpcnN0TmFtZScpICsgJyAnICsgdGhpcy5nZXQoJ2xhc3ROYW1lJyk7Cgog ICAgICAgIC8vIENhbGwgdGhpcyBmbGFnIHRvIG1hcmsgdGhlIGZ1bmN0aW9u IGFzIGEgcHJvcGVydHkKICAgICAgfS5wcm9wZXJ0eSgpCiAgICB9KTsKCiAg ICB2YXIgcHJlc2lkZW50ID0gTXlBcHAuUHJlc2lkZW50LmNyZWF0ZSh7CiAg ICAgIGZpcnN0TmFtZTogIkJhcmFjayIsCiAgICAgIGxhc3ROYW1lOiAiT2Jh bWEiCiAgICB9KTsKCiAgICBwcmVzaWRlbnQuZ2V0KCdmdWxsTmFtZScpOyAg ICAvLyAiQmFyYWNrIE9iYW1hIgogICAgYGBgCgogICAgVHJlYXRpbmcgYSBm dW5jdGlvbiBsaWtlIGEgcHJvcGVydHkgaXMgdXNlZnVsIGJlY2F1c2UgdGhl eSBjYW4gd29yayB3aXRoCiAgICBiaW5kaW5ncywganVzdCBsaWtlIGFueSBv dGhlciBwcm9wZXJ0eS4KCiAgICBNYW55IGNvbXB1dGVkIHByb3BlcnRpZXMg aGF2ZSBkZXBlbmRlbmNpZXMgb24gb3RoZXIgcHJvcGVydGllcy4gRm9yCiAg ICBleGFtcGxlLCBpbiB0aGUgYWJvdmUgZXhhbXBsZSwgdGhlIGBmdWxsTmFt ZWAgcHJvcGVydHkgZGVwZW5kcyBvbgogICAgYGZpcnN0TmFtZWAgYW5kIGBs YXN0TmFtZWAgdG8gZGV0ZXJtaW5lIGl0cyB2YWx1ZS4gWW91IGNhbiB0ZWxs IEVtYmVyCiAgICBhYm91dCB0aGVzZSBkZXBlbmRlbmNpZXMgbGlrZSB0aGlz OgoKICAgIGBgYGphdmFzY3JpcHQKICAgIE15QXBwLlByZXNpZGVudCA9IEVt YmVyLk9iamVjdC5leHRlbmQoewogICAgICBmaXJzdE5hbWU6ICcnLAogICAg ICBsYXN0TmFtZTogICcnLAoKICAgICAgZnVsbE5hbWU6IGZ1bmN0aW9uKCkg ewogICAgICAgIHJldHVybiB0aGlzLmdldCgnZmlyc3ROYW1lJykgKyAnICcg KyB0aGlzLmdldCgnbGFzdE5hbWUnKTsKCiAgICAgICAgLy8gVGVsbCBFbWJl ci5qcyB0aGF0IHRoaXMgY29tcHV0ZWQgcHJvcGVydHkgZGVwZW5kcyBvbiBm aXJzdE5hbWUKICAgICAgICAvLyBhbmQgbGFzdE5hbWUKICAgICAgfS5wcm9w ZXJ0eSgnZmlyc3ROYW1lJywgJ2xhc3ROYW1lJykKICAgIH0pOwogICAgYGBg CgogICAgTWFrZSBzdXJlIHlvdSBsaXN0IHRoZXNlIGRlcGVuZGVuY2llcyBz byBFbWJlciBrbm93cyB3aGVuIHRvIHVwZGF0ZQogICAgYmluZGluZ3MgdGhh dCBjb25uZWN0IHRvIGEgY29tcHV0ZWQgcHJvcGVydHkuIENoYW5naW5nIGEg ZGVwZW5kZW5jeQogICAgd2lsbCBub3QgaW1tZWRpYXRlbHkgdHJpZ2dlciBh biB1cGRhdGUgb2YgdGhlIGNvbXB1dGVkIHByb3BlcnR5LCBidXQKICAgIHdp bGwgaW5zdGVhZCBjbGVhciB0aGUgY2FjaGUgc28gdGhhdCBpdCBpcyB1cGRh dGVkIHdoZW4gdGhlIG5leHQgYGdldGAKICAgIGlzIGNhbGxlZCBvbiB0aGUg cHJvcGVydHkuCgogICAgU2VlIFtFbWJlci5Db21wdXRlZFByb3BlcnR5XSgv YXBpL2NsYXNzZXMvRW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eS5odG1sKSwgW0Vt YmVyLmNvbXB1dGVkXSgvYXBpLyNtZXRob2RfY29tcHV0ZWQpLgoKICAgIEBt ZXRob2QgcHJvcGVydHkKICAgIEBmb3IgRnVuY3Rpb24KICAqLwogIEZ1bmN0 aW9uLnByb3RvdHlwZS5wcm9wZXJ0eSA9IGZ1bmN0aW9uKCkgewogICAgdmFy IHJldCA9IEVtYmVyLmNvbXB1dGVkKHRoaXMpOwogICAgLy8gQ29tcHV0ZWRQ cm9wZXJ0eS5wcm90b3R5cGUucHJvcGVydHkgZXhwYW5kcyBwcm9wZXJ0aWVz OyBubyBuZWVkIGZvciB1cyB0bwogICAgLy8gZG8gc28gaGVyZS4KICAgIHJl dHVybiByZXQucHJvcGVydHkuYXBwbHkocmV0LCBhcmd1bWVudHMpOwogIH07 CgogIC8qKgogICAgVGhlIGBvYnNlcnZlc2AgZXh0ZW5zaW9uIG9mIEphdmFz Y3JpcHQncyBGdW5jdGlvbiBwcm90b3R5cGUgaXMgYXZhaWxhYmxlCiAgICB3 aGVuIGBFbWJlci5FWFRFTkRfUFJPVE9UWVBFU2Agb3IgYEVtYmVyLkVYVEVO RF9QUk9UT1RZUEVTLkZ1bmN0aW9uYCBpcwogICAgdHJ1ZSwgd2hpY2ggaXMg dGhlIGRlZmF1bHQuCgogICAgWW91IGNhbiBvYnNlcnZlIHByb3BlcnR5IGNo YW5nZXMgc2ltcGx5IGJ5IGFkZGluZyB0aGUgYG9ic2VydmVzYAogICAgY2Fs bCB0byB0aGUgZW5kIG9mIHlvdXIgbWV0aG9kIGRlY2xhcmF0aW9ucyBpbiBj bGFzc2VzIHRoYXQgeW91IHdyaXRlLgogICAgRm9yIGV4YW1wbGU6CgogICAg YGBgamF2YXNjcmlwdAogICAgRW1iZXIuT2JqZWN0LmV4dGVuZCh7CiAgICAg IHZhbHVlT2JzZXJ2ZXI6IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIEV4ZWN1 dGVzIHdoZW5ldmVyIHRoZSAidmFsdWUiIHByb3BlcnR5IGNoYW5nZXMKICAg ICAgfS5vYnNlcnZlcygndmFsdWUnKQogICAgfSk7CiAgICBgYGAKCiAgICBJ biB0aGUgZnV0dXJlIHRoaXMgbWV0aG9kIG1heSBiZWNvbWUgYXN5bmNocm9u b3VzLiBJZiB5b3Ugd2FudCB0byBlbnN1cmUKICAgIHN5bmNocm9ub3VzIGJl aGF2aW9yLCB1c2UgYG9ic2VydmVzSW1tZWRpYXRlbHlgLgoKICAgIFNlZSBg RW1iZXIub2JzZXJ2ZXJgLgoKICAgIEBtZXRob2Qgb2JzZXJ2ZXMKICAgIEBm b3IgRnVuY3Rpb24KICAqLwogIEZ1bmN0aW9uLnByb3RvdHlwZS5vYnNlcnZl cyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGFkZFdhdGNoZWRQcm9wZXJ0eSA9 IGZ1bmN0aW9uIChvYnMpIHsgd2F0Y2hlZC5wdXNoKG9icyk7IH07CiAgICB2 YXIgd2F0Y2hlZCA9IFtdOwoKICAgIGZvciAodmFyIGk9MDsgaTxhcmd1bWVu dHMubGVuZ3RoOyArK2kpIHsKICAgICAgZXhwYW5kUHJvcGVydGllcyhhcmd1 bWVudHNbaV0sIGFkZFdhdGNoZWRQcm9wZXJ0eSk7CiAgICB9CgogICAgdGhp cy5fX2VtYmVyX29ic2VydmVzX18gPSB3YXRjaGVkOwoKICAgIHJldHVybiB0 aGlzOwogIH07CgogIC8qKgogICAgVGhlIGBvYnNlcnZlc0ltbWVkaWF0ZWx5 YCBleHRlbnNpb24gb2YgSmF2YXNjcmlwdCdzIEZ1bmN0aW9uIHByb3RvdHlw ZSBpcwogICAgYXZhaWxhYmxlIHdoZW4gYEVtYmVyLkVYVEVORF9QUk9UT1RZ UEVTYCBvcgogICAgYEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTLkZ1bmN0aW9u YCBpcyB0cnVlLCB3aGljaCBpcyB0aGUgZGVmYXVsdC4KCiAgICBZb3UgY2Fu IG9ic2VydmUgcHJvcGVydHkgY2hhbmdlcyBzaW1wbHkgYnkgYWRkaW5nIHRo ZSBgb2JzZXJ2ZXNJbW1lZGlhdGVseWAKICAgIGNhbGwgdG8gdGhlIGVuZCBv ZiB5b3VyIG1ldGhvZCBkZWNsYXJhdGlvbnMgaW4gY2xhc3NlcyB0aGF0IHlv dSB3cml0ZS4KICAgIEZvciBleGFtcGxlOgoKICAgIGBgYGphdmFzY3JpcHQK ICAgIEVtYmVyLk9iamVjdC5leHRlbmQoewogICAgICB2YWx1ZU9ic2VydmVy OiBmdW5jdGlvbigpIHsKICAgICAgICAvLyBFeGVjdXRlcyBpbW1lZGlhdGVs eSBhZnRlciB0aGUgInZhbHVlIiBwcm9wZXJ0eSBjaGFuZ2VzCiAgICAgIH0u b2JzZXJ2ZXNJbW1lZGlhdGVseSgndmFsdWUnKQogICAgfSk7CiAgICBgYGAK CiAgICBJbiB0aGUgZnV0dXJlLCBgb2JzZXJ2ZXNgIG1heSBiZWNvbWUgYXN5 bmNocm9ub3VzLiBJbiB0aGlzIGV2ZW50LAogICAgYG9ic2VydmVzSW1tZWRp YXRlbHlgIHdpbGwgbWFpbnRhaW4gdGhlIHN5bmNocm9ub3VzIGJlaGF2aW9y LgoKICAgIFNlZSBgRW1iZXIuaW1tZWRpYXRlT2JzZXJ2ZXJgLgoKICAgIEBt ZXRob2Qgb2JzZXJ2ZXNJbW1lZGlhdGVseQogICAgQGZvciBGdW5jdGlvbgog ICovCiAgRnVuY3Rpb24ucHJvdG90eXBlLm9ic2VydmVzSW1tZWRpYXRlbHkg PSBmdW5jdGlvbigpIHsKICAgIGZvciAodmFyIGk9MCwgbD1hcmd1bWVudHMu bGVuZ3RoOyBpPGw7IGkrKykgewogICAgICB2YXIgYXJnID0gYXJndW1lbnRz W2ldOwogICAgICBFbWJlci5hc3NlcnQoIkltbWVkaWF0ZSBvYnNlcnZlcnMg bXVzdCBvYnNlcnZlIGludGVybmFsIHByb3BlcnRpZXMgb25seSwgbm90IHBy b3BlcnRpZXMgb24gb3RoZXIgb2JqZWN0cy4iLCBhcmcuaW5kZXhPZignLicp ID09PSAtMSk7CiAgICB9CgogICAgLy8gb2JzZXJ2ZXMgaGFuZGxlcyBwcm9w ZXJ0eSBleHBhbnNpb24KICAgIHJldHVybiB0aGlzLm9ic2VydmVzLmFwcGx5 KHRoaXMsIGFyZ3VtZW50cyk7CiAgfTsKCiAgLyoqCiAgICBUaGUgYG9ic2Vy dmVzQmVmb3JlYCBleHRlbnNpb24gb2YgSmF2YXNjcmlwdCdzIEZ1bmN0aW9u IHByb3RvdHlwZSBpcwogICAgYXZhaWxhYmxlIHdoZW4gYEVtYmVyLkVYVEVO RF9QUk9UT1RZUEVTYCBvcgogICAgYEVtYmVyLkVYVEVORF9QUk9UT1RZUEVT LkZ1bmN0aW9uYCBpcyB0cnVlLCB3aGljaCBpcyB0aGUgZGVmYXVsdC4KCiAg ICBZb3UgY2FuIGdldCBub3RpZmllZCB3aGVuIGEgcHJvcGVydHkgY2hhbmdl IGlzIGFib3V0IHRvIGhhcHBlbiBieQogICAgYnkgYWRkaW5nIHRoZSBgb2Jz ZXJ2ZXNCZWZvcmVgIGNhbGwgdG8gdGhlIGVuZCBvZiB5b3VyIG1ldGhvZAog ICAgZGVjbGFyYXRpb25zIGluIGNsYXNzZXMgdGhhdCB5b3Ugd3JpdGUuIEZv ciBleGFtcGxlOgoKICAgIGBgYGphdmFzY3JpcHQKICAgIEVtYmVyLk9iamVj dC5leHRlbmQoewogICAgICB2YWx1ZU9ic2VydmVyOiBmdW5jdGlvbigpIHsK ICAgICAgICAvLyBFeGVjdXRlcyB3aGVuZXZlciB0aGUgInZhbHVlIiBwcm9w ZXJ0eSBpcyBhYm91dCB0byBjaGFuZ2UKICAgICAgfS5vYnNlcnZlc0JlZm9y ZSgndmFsdWUnKQogICAgfSk7CiAgICBgYGAKCiAgICBTZWUgYEVtYmVyLmJl Zm9yZU9ic2VydmVyYC4KCiAgICBAbWV0aG9kIG9ic2VydmVzQmVmb3JlCiAg ICBAZm9yIEZ1bmN0aW9uCiAgKi8KICBGdW5jdGlvbi5wcm90b3R5cGUub2Jz ZXJ2ZXNCZWZvcmUgPSBmdW5jdGlvbigpIHsKICAgIHZhciBhZGRXYXRjaGVk UHJvcGVydHkgPSBmdW5jdGlvbiAob2JzKSB7IHdhdGNoZWQucHVzaChvYnMp OyB9OwogICAgdmFyIHdhdGNoZWQgPSBbXTsKCiAgICBmb3IgKHZhciBpPTA7 IGk8YXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgIGV4cGFuZFByb3Bl cnRpZXMoYXJndW1lbnRzW2ldLCBhZGRXYXRjaGVkUHJvcGVydHkpOwogICAg fQoKICAgIHRoaXMuX19lbWJlcl9vYnNlcnZlc0JlZm9yZV9fID0gd2F0Y2hl ZDsKCiAgICByZXR1cm4gdGhpczsKICB9OwoKICAvKioKICAgIFRoZSBgb25g IGV4dGVuc2lvbiBvZiBKYXZhc2NyaXB0J3MgRnVuY3Rpb24gcHJvdG90eXBl IGlzIGF2YWlsYWJsZQogICAgd2hlbiBgRW1iZXIuRVhURU5EX1BST1RPVFlQ RVNgIG9yIGBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5GdW5jdGlvbmAgaXMK ICAgIHRydWUsIHdoaWNoIGlzIHRoZSBkZWZhdWx0LgoKICAgIFlvdSBjYW4g bGlzdGVuIGZvciBldmVudHMgc2ltcGx5IGJ5IGFkZGluZyB0aGUgYG9uYCBj YWxsIHRvIHRoZSBlbmQgb2YKICAgIHlvdXIgbWV0aG9kIGRlY2xhcmF0aW9u cyBpbiBjbGFzc2VzIG9yIG1peGlucyB0aGF0IHlvdSB3cml0ZS4gRm9yIGV4 YW1wbGU6CgogICAgYGBgamF2YXNjcmlwdAogICAgRW1iZXIuTWl4aW4uY3Jl YXRlKHsKICAgICAgZG9Tb21ldGhpbmdXaXRoRWxlbWVudDogZnVuY3Rpb24o KSB7CiAgICAgICAgLy8gRXhlY3V0ZXMgd2hlbmV2ZXIgdGhlICJkaWRJbnNl cnRFbGVtZW50IiBldmVudCBmaXJlcwogICAgICB9Lm9uKCdkaWRJbnNlcnRF bGVtZW50JykKICAgIH0pOwogICAgYGBgCgogICAgU2VlIGBFbWJlci5vbmAu CgogICAgQG1ldGhvZCBvbgogICAgQGZvciBGdW5jdGlvbgogICovCiAgRnVu Y3Rpb24ucHJvdG90eXBlLm9uID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgZXZl bnRzID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cyk7CiAgICB0aGlzLl9fZW1i ZXJfbGlzdGVuc19fID0gZXZlbnRzOwogICAgcmV0dXJuIHRoaXM7CiAgfTsK fQoKCn0pKCk7CgoKCihmdW5jdGlvbigpIHsKCn0pKCk7CgoKCihmdW5jdGlv bigpIHsKLyoqCkBtb2R1bGUgZW1iZXIKQHN1Ym1vZHVsZSBlbWJlci1ydW50 aW1lCiovCgoKLyoqCiAgSW1wbGVtZW50cyBzb21lIHN0YW5kYXJkIG1ldGhv ZHMgZm9yIGNvbXBhcmluZyBvYmplY3RzLiBBZGQgdGhpcyBtaXhpbiB0bwog IGFueSBjbGFzcyB5b3UgY3JlYXRlIHRoYXQgY2FuIGNvbXBhcmUgaXRzIGlu c3RhbmNlcy4KCiAgWW91IHNob3VsZCBpbXBsZW1lbnQgdGhlIGBjb21wYXJl KClgIG1ldGhvZC4KCiAgQGNsYXNzIENvbXBhcmFibGUKICBAbmFtZXNwYWNl IEVtYmVyCiAgQHNpbmNlIEVtYmVyIDAuOQoqLwpFbWJlci5Db21wYXJhYmxl ID0gRW1iZXIuTWl4aW4uY3JlYXRlKHsKCiAgLyoqCiAgICBPdmVycmlkZSB0 byByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbiBvZiB0aGUg dHdvIHBhcmFtZXRlcnMuIFRoZQogICAgY29tcGFyZSBtZXRob2Qgc2hvdWxk IHJldHVybjoKCiAgICAtIGAtMWAgaWYgYGEgPCBiYAogICAgLSBgMGAgaWYg YGEgPT0gYmAKICAgIC0gYDFgIGlmIGBhID4gYmAKCiAgICBEZWZhdWx0IGlt cGxlbWVudGF0aW9uIHJhaXNlcyBhbiBleGNlcHRpb24uCgogICAgQG1ldGhv ZCBjb21wYXJlCiAgICBAcGFyYW0gYSB7T2JqZWN0fSB0aGUgZmlyc3Qgb2Jq ZWN0IHRvIGNvbXBhcmUKICAgIEBwYXJhbSBiIHtPYmplY3R9IHRoZSBzZWNv bmQgb2JqZWN0IHRvIGNvbXBhcmUKICAgIEByZXR1cm4ge0ludGVnZXJ9IHRo ZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb24KICAqLwogIGNvbXBhcmU6IEVt YmVyLnJlcXVpcmVkKEZ1bmN0aW9uKQoKfSk7CgoKfSkoKTsKCgoKKGZ1bmN0 aW9uKCkgewovKioKQG1vZHVsZSBlbWJlcgpAc3VibW9kdWxlIGVtYmVyLXJ1 bnRpbWUKKi8KCgoKdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIu c2V0OwoKLyoqCiAgSW1wbGVtZW50cyBzb21lIHN0YW5kYXJkIG1ldGhvZHMg Zm9yIGNvcHlpbmcgYW4gb2JqZWN0LiBBZGQgdGhpcyBtaXhpbiB0bwogIGFu eSBvYmplY3QgeW91IGNyZWF0ZSB0aGF0IGNhbiBjcmVhdGUgYSBjb3B5IG9m IGl0c2VsZi4gVGhpcyBtaXhpbiBpcwogIGFkZGVkIGF1dG9tYXRpY2FsbHkg dG8gdGhlIGJ1aWx0LWluIGFycmF5LgoKICBZb3Ugc2hvdWxkIGdlbmVyYWxs eSBpbXBsZW1lbnQgdGhlIGBjb3B5KClgIG1ldGhvZCB0byByZXR1cm4gYSBj b3B5IG9mIHRoZQogIHJlY2VpdmVyLgoKICBOb3RlIHRoYXQgYGZyb3plbkNv cHkoKWAgd2lsbCBvbmx5IHdvcmsgaWYgeW91IGFsc28gaW1wbGVtZW50CiAg YEVtYmVyLkZyZWV6YWJsZWAuCgogIEBjbGFzcyBDb3B5YWJsZQogIEBuYW1l c3BhY2UgRW1iZXIKICBAc2luY2UgRW1iZXIgMC45CiovCkVtYmVyLkNvcHlh YmxlID0gRW1iZXIuTWl4aW4uY3JlYXRlKHsKCiAgLyoqCiAgICBPdmVycmlk ZSB0byByZXR1cm4gYSBjb3B5IG9mIHRoZSByZWNlaXZlci4gRGVmYXVsdCBp bXBsZW1lbnRhdGlvbiByYWlzZXMKICAgIGFuIGV4Y2VwdGlvbi4KCiAgICBA bWV0aG9kIGNvcHkKICAgIEBwYXJhbSB7Qm9vbGVhbn0gZGVlcCBpZiBgdHJ1 ZWAsIGEgZGVlcCBjb3B5IG9mIHRoZSBvYmplY3Qgc2hvdWxkIGJlIG1hZGUK ICAgIEByZXR1cm4ge09iamVjdH0gY29weSBvZiByZWNlaXZlcgogICovCiAg Y29weTogRW1iZXIucmVxdWlyZWQoRnVuY3Rpb24pLAoKICAvKioKICAgIElm IHRoZSBvYmplY3QgaW1wbGVtZW50cyBgRW1iZXIuRnJlZXphYmxlYCwgdGhl biB0aGlzIHdpbGwgcmV0dXJuIGEgbmV3CiAgICBjb3B5IGlmIHRoZSBvYmpl Y3QgaXMgbm90IGZyb3plbiBhbmQgdGhlIHJlY2VpdmVyIGlmIHRoZSBvYmpl Y3QgaXMgZnJvemVuLgoKICAgIFJhaXNlcyBhbiBleGNlcHRpb24gaWYgeW91 IHRyeSB0byBjYWxsIHRoaXMgbWV0aG9kIG9uIGEgb2JqZWN0IHRoYXQgZG9l cwogICAgbm90IHN1cHBvcnQgZnJlZXppbmcuCgogICAgWW91IHNob3VsZCB1 c2UgdGhpcyBtZXRob2Qgd2hlbmV2ZXIgeW91IHdhbnQgYSBjb3B5IG9mIGEg ZnJlZXphYmxlIG9iamVjdAogICAgc2luY2UgYSBmcmVlemFibGUgb2JqZWN0 IGNhbiBzaW1wbHkgcmV0dXJuIGl0c2VsZiB3aXRob3V0IGFjdHVhbGx5CiAg ICBjb25zdW1pbmcgbW9yZSBtZW1vcnkuCgogICAgQG1ldGhvZCBmcm96ZW5D b3B5CiAgICBAcmV0dXJuIHtPYmplY3R9IGNvcHkgb2YgcmVjZWl2ZXIgb3Ig cmVjZWl2ZXIKICAqLwogIGZyb3plbkNvcHk6IGZ1bmN0aW9uKCkgewogICAg aWYgKEVtYmVyLkZyZWV6YWJsZSAmJiBFbWJlci5GcmVlemFibGUuZGV0ZWN0 KHRoaXMpKSB7CiAgICAgIHJldHVybiBnZXQodGhpcywgJ2lzRnJvemVuJykg PyB0aGlzIDogdGhpcy5jb3B5KCkuZnJlZXplKCk7CiAgICB9IGVsc2Ugewog ICAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoRW1iZXIuU3RyaW5nLmZtdCgi JUAgZG9lcyBub3Qgc3VwcG9ydCBmcmVlemluZyIsIFt0aGlzXSkpOwogICAg fQogIH0KfSk7Cgp9KSgpOwoKCgooZnVuY3Rpb24oKSB7Ci8qKgpAbW9kdWxl IGVtYmVyCkBzdWJtb2R1bGUgZW1iZXItcnVudGltZQoqLwoKCnZhciBnZXQg PSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKCi8qKgogIFRoZSBgRW1i ZXIuRnJlZXphYmxlYCBtaXhpbiBpbXBsZW1lbnRzIHNvbWUgYmFzaWMgbWV0 aG9kcyBmb3IgbWFya2luZyBhbgogIG9iamVjdCBhcyBmcm96ZW4uIE9uY2Ug YW4gb2JqZWN0IGlzIGZyb3plbiBpdCBzaG91bGQgYmUgcmVhZCBvbmx5LiBO byBjaGFuZ2VzCiAgbWF5IGJlIG1hZGUgdGhlIGludGVybmFsIHN0YXRlIG9m IHRoZSBvYmplY3QuCgogICMjIEVuZm9yY2VtZW50CgogIFRvIGZ1bGx5IHN1 cHBvcnQgZnJlZXppbmcgaW4geW91ciBzdWJjbGFzcywgeW91IG11c3QgaW5j bHVkZSB0aGlzIG1peGluIGFuZAogIG92ZXJyaWRlIGFueSBtZXRob2QgdGhh dCBtaWdodCBhbHRlciBhbnkgcHJvcGVydHkgb24gdGhlIG9iamVjdCB0byBp bnN0ZWFkCiAgcmFpc2UgYW4gZXhjZXB0aW9uLiBZb3UgY2FuIGNoZWNrIHRo ZSBzdGF0ZSBvZiBhbiBvYmplY3QgYnkgY2hlY2tpbmcgdGhlCiAgYGlzRnJv emVuYCBwcm9wZXJ0eS4KCiAgQWx0aG91Z2ggZnV0dXJlIHZlcnNpb25zIG9m IEphdmFTY3JpcHQgbWF5IHN1cHBvcnQgbGFuZ3VhZ2UtbGV2ZWwgZnJlZXpp bmcKICBvYmplY3Qgb2JqZWN0cywgdGhhdCBpcyBub3QgdGhlIGNhc2UgdG9k YXkuIEV2ZW4gaWYgYW4gb2JqZWN0IGlzIGZyZWV6YWJsZSwKICBpdCBpcyBz dGlsbCB0ZWNobmljYWxseSBwb3NzaWJsZSB0byBtb2RpZnkgdGhlIG9iamVj dCwgZXZlbiB0aG91Z2ggaXQgY291bGQKICBicmVhayBvdGhlciBwYXJ0cyBv ZiB5b3VyIGFwcGxpY2F0aW9uIHRoYXQgZG8gbm90IGV4cGVjdCBhIGZyb3pl biBvYmplY3QgdG8KICBjaGFuZ2UuIEl0IGlzLCB0aGVyZWZvcmUsIHZlcnkg aW1wb3J0YW50IHRoYXQgeW91IGFsd2F5cyByZXNwZWN0IHRoZQogIGBpc0Zy b3plbmAgcHJvcGVydHkgb24gYWxsIGZyZWV6YWJsZSBvYmplY3RzLgoKICAj IyBFeGFtcGxlIFVzYWdlCgogIFRoZSBleGFtcGxlIGJlbG93IHNob3dzIGEg c2ltcGxlIG9iamVjdCB0aGF0IGltcGxlbWVudCB0aGUgYEVtYmVyLkZyZWV6 YWJsZWAKICBwcm90b2NvbC4KCiAgYGBgamF2YXNjcmlwdAogIENvbnRhY3Qg PSBFbWJlci5PYmplY3QuZXh0ZW5kKEVtYmVyLkZyZWV6YWJsZSwgewogICAg Zmlyc3ROYW1lOiBudWxsLAogICAgbGFzdE5hbWU6IG51bGwsCgogICAgLy8g c3dhcHMgdGhlIG5hbWVzCiAgICBzd2FwTmFtZXM6IGZ1bmN0aW9uKCkgewog ICAgICBpZiAodGhpcy5nZXQoJ2lzRnJvemVuJykpIHRocm93IEVtYmVyLkZS T1pFTl9FUlJPUjsKICAgICAgdmFyIHRtcCA9IHRoaXMuZ2V0KCdmaXJzdE5h bWUnKTsKICAgICAgdGhpcy5zZXQoJ2ZpcnN0TmFtZScsIHRoaXMuZ2V0KCds YXN0TmFtZScpKTsKICAgICAgdGhpcy5zZXQoJ2xhc3ROYW1lJywgdG1wKTsK ICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogIH0pOwoKICBjID0gQ29udGFj dC5jcmVhdGUoeyBmaXJzdE5hbWU6ICJKb2huIiwgbGFzdE5hbWU6ICJEb2Ui IH0pOwogIGMuc3dhcE5hbWVzKCk7ICAvLyByZXR1cm5zIGMKICBjLmZyZWV6 ZSgpOwogIGMuc3dhcE5hbWVzKCk7ICAvLyBFWENFUFRJT04KICBgYGAKCiAg IyMgQ29weWluZwoKICBVc3VhbGx5IHRoZSBgRW1iZXIuRnJlZXphYmxlYCBw cm90b2NvbCBpcyBpbXBsZW1lbnRlZCBpbiBjb29wZXJhdGlvbiB3aXRoIHRo ZQogIGBFbWJlci5Db3B5YWJsZWAgcHJvdG9jb2wsIHdoaWNoIGRlZmluZXMg YSBgZnJvemVuQ29weSgpYCBtZXRob2QgdGhhdCB3aWxsCiAgcmV0dXJuIGEg ZnJvemVuIG9iamVjdCwgaWYgdGhlIG9iamVjdCBpbXBsZW1lbnRzIHRoaXMg bWV0aG9kIGFzIHdlbGwuCgogIEBjbGFzcyBGcmVlemFibGUKICBAbmFtZXNw YWNlIEVtYmVyCiAgQHNpbmNlIEVtYmVyIDAuOQoqLwpFbWJlci5GcmVlemFi bGUgPSBFbWJlci5NaXhpbi5jcmVhdGUoewoKICAvKioKICAgIFNldCB0byBg dHJ1ZWAgd2hlbiB0aGUgb2JqZWN0IGlzIGZyb3plbi4gVXNlIHRoaXMgcHJv cGVydHkgdG8gZGV0ZWN0CiAgICB3aGV0aGVyIHlvdXIgb2JqZWN0IGlzIGZy b3plbiBvciBub3QuCgogICAgQHByb3BlcnR5IGlzRnJvemVuCiAgICBAdHlw ZSBCb29sZWFuCiAgKi8KICBpc0Zyb3plbjogZmFsc2UsCgogIC8qKgogICAg RnJlZXplcyB0aGUgb2JqZWN0LiBPbmNlIHRoaXMgbWV0aG9kIGhhcyBiZWVu IGNhbGxlZCB0aGUgb2JqZWN0IHNob3VsZAogICAgbm8gbG9uZ2VyIGFsbG93 IGFueSBwcm9wZXJ0aWVzIHRvIGJlIGVkaXRlZC4KCiAgICBAbWV0aG9kIGZy ZWV6ZQogICAgQHJldHVybiB7T2JqZWN0fSByZWNlaXZlcgogICovCiAgZnJl ZXplOiBmdW5jdGlvbigpIHsKICAgIGlmIChnZXQodGhpcywgJ2lzRnJvemVu JykpIHJldHVybiB0aGlzOwogICAgc2V0KHRoaXMsICdpc0Zyb3plbicsIHRy dWUpOwogICAgcmV0dXJuIHRoaXM7CiAgfQoKfSk7CgpFbWJlci5GUk9aRU5f RVJST1IgPSAiRnJvemVuIG9iamVjdCBjYW5ub3QgYmUgbW9kaWZpZWQuIjsK Cn0pKCk7CgoKCihmdW5jdGlvbigpIHsKLyoqCkBtb2R1bGUgZW1iZXIKQHN1 Ym1vZHVsZSBlbWJlci1ydW50aW1lCiovCgp2YXIgZm9yRWFjaCA9IEVtYmVy LkVudW1lcmFibGVVdGlscy5mb3JFYWNoOwoKLyoqCiAgVGhpcyBtaXhpbiBk ZWZpbmVzIHRoZSBBUEkgZm9yIG1vZGlmeWluZyBnZW5lcmljIGVudW1lcmFi bGVzLiBUaGVzZSBtZXRob2RzCiAgY2FuIGJlIGFwcGxpZWQgdG8gYW4gb2Jq ZWN0IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBvcmRlcmVkIG9yCiAg dW5vcmRlcmVkLgoKICBOb3RlIHRoYXQgYW4gRW51bWVyYWJsZSBjYW4gY2hh bmdlIGV2ZW4gaWYgaXQgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgbWl4aW4u CiAgRm9yIGV4YW1wbGUsIGEgTWFwcGVkRW51bWVyYWJsZSBjYW5ub3QgYmUg ZGlyZWN0bHkgbW9kaWZpZWQgYnV0IGlmIGl0cwogIHVuZGVybHlpbmcgZW51 bWVyYWJsZSBjaGFuZ2VzLCBpdCB3aWxsIGNoYW5nZSBhbHNvLgoKICAjIyBB ZGRpbmcgT2JqZWN0cwoKICBUbyBhZGQgYW4gb2JqZWN0IHRvIGFuIGVudW1l cmFibGUsIHVzZSB0aGUgYGFkZE9iamVjdCgpYCBtZXRob2QuIFRoaXMKICBt ZXRob2Qgd2lsbCBvbmx5IGFkZCB0aGUgb2JqZWN0IHRvIHRoZSBlbnVtZXJh YmxlIGlmIHRoZSBvYmplY3QgaXMgbm90CiAgYWxyZWFkeSBwcmVzZW50IGFu ZCBpcyBvZiBhIHR5cGUgc3VwcG9ydGVkIGJ5IHRoZSBlbnVtZXJhYmxlLgoK ICBgYGBqYXZhc2NyaXB0CiAgc2V0LmFkZE9iamVjdChjb250YWN0KTsKICBg YGAKCiAgIyMgUmVtb3ZpbmcgT2JqZWN0cwoKICBUbyByZW1vdmUgYW4gb2Jq ZWN0IGZyb20gYW4gZW51bWVyYWJsZSwgdXNlIHRoZSBgcmVtb3ZlT2JqZWN0 KClgIG1ldGhvZC4gVGhpcwogIHdpbGwgb25seSByZW1vdmUgdGhlIG9iamVj dCBpZiBpdCBpcyBwcmVzZW50IGluIHRoZSBlbnVtZXJhYmxlLCBvdGhlcndp c2UKICB0aGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0LgoKICBgYGBqYXZhc2Ny aXB0CiAgc2V0LnJlbW92ZU9iamVjdChjb250YWN0KTsKICBgYGAKCiAgIyMg SW1wbGVtZW50aW5nIEluIFlvdXIgT3duIENvZGUKCiAgSWYgeW91IGFyZSBp bXBsZW1lbnRpbmcgYW4gb2JqZWN0IGFuZCB3YW50IHRvIHN1cHBvcnQgdGhp cyBBUEksIGp1c3QgaW5jbHVkZQogIHRoaXMgbWl4aW4gaW4geW91ciBjbGFz cyBhbmQgaW1wbGVtZW50IHRoZSByZXF1aXJlZCBtZXRob2RzLiBJbiB5b3Vy IHVuaXQKICB0ZXN0cywgYmUgc3VyZSB0byBhcHBseSB0aGUgRW1iZXIuTXV0 YWJsZUVudW1lcmFibGVUZXN0cyB0byB5b3VyIG9iamVjdC4KCiAgQGNsYXNz IE11dGFibGVFbnVtZXJhYmxlCiAgQG5hbWVzcGFjZSBFbWJlcgogIEB1c2Vz IEVtYmVyLkVudW1lcmFibGUKKi8KRW1iZXIuTXV0YWJsZUVudW1lcmFibGUg PSBFbWJlci5NaXhpbi5jcmVhdGUoRW1iZXIuRW51bWVyYWJsZSwgewoKICAv KioKICAgIF9fUmVxdWlyZWQuX18gWW91IG11c3QgaW1wbGVtZW50IHRoaXMg bWV0aG9kIHRvIGFwcGx5IHRoaXMgbWl4aW4uCgogICAgQXR0ZW1wdHMgdG8g YWRkIHRoZSBwYXNzZWQgb2JqZWN0IHRvIHRoZSByZWNlaXZlciBpZiB0aGUg b2JqZWN0IGlzIG5vdAogICAgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBjb2xs ZWN0aW9uLiBJZiB0aGUgb2JqZWN0IGlzIHByZXNlbnQsIHRoaXMgbWV0aG9k CiAgICBoYXMgbm8gZWZmZWN0LgoKICAgIElmIHRoZSBwYXNzZWQgb2JqZWN0 IGlzIG9mIGEgdHlwZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSByZWNlaXZlciwK ICAgIHRoZW4gdGhpcyBtZXRob2Qgc2hvdWxkIHJhaXNlIGFuIGV4Y2VwdGlv bi4KCiAgICBAbWV0aG9kIGFkZE9iamVjdAogICAgQHBhcmFtIHtPYmplY3R9 IG9iamVjdCBUaGUgb2JqZWN0IHRvIGFkZCB0byB0aGUgZW51bWVyYWJsZS4K ICAgIEByZXR1cm4ge09iamVjdH0gdGhlIHBhc3NlZCBvYmplY3QKICAqLwog IGFkZE9iamVjdDogRW1iZXIucmVxdWlyZWQoRnVuY3Rpb24pLAoKICAvKioK ICAgIEFkZHMgZWFjaCBvYmplY3QgaW4gdGhlIHBhc3NlZCBlbnVtZXJhYmxl IHRvIHRoZSByZWNlaXZlci4KCiAgICBAbWV0aG9kIGFkZE9iamVjdHMKICAg IEBwYXJhbSB7RW1iZXIuRW51bWVyYWJsZX0gb2JqZWN0cyB0aGUgb2JqZWN0 cyB0byBhZGQuCiAgICBAcmV0dXJuIHtPYmplY3R9IHJlY2VpdmVyCiAgKi8K ICBhZGRPYmplY3RzOiBmdW5jdGlvbihvYmplY3RzKSB7CiAgICBFbWJlci5i ZWdpblByb3BlcnR5Q2hhbmdlcyh0aGlzKTsKICAgIGZvckVhY2gob2JqZWN0 cywgZnVuY3Rpb24ob2JqKSB7IHRoaXMuYWRkT2JqZWN0KG9iaik7IH0sIHRo aXMpOwogICAgRW1iZXIuZW5kUHJvcGVydHlDaGFuZ2VzKHRoaXMpOwogICAg cmV0dXJuIHRoaXM7CiAgfSwKCiAgLyoqCiAgICBfX1JlcXVpcmVkLl9fIFlv dSBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBhcHBseSB0aGlzIG1p eGluLgoKICAgIEF0dGVtcHRzIHRvIHJlbW92ZSB0aGUgcGFzc2VkIG9iamVj dCBmcm9tIHRoZSByZWNlaXZlciBjb2xsZWN0aW9uIGlmIHRoZQogICAgb2Jq ZWN0IGlzIHByZXNlbnQgaW4gdGhlIGNvbGxlY3Rpb24uIElmIHRoZSBvYmpl Y3QgaXMgbm90IHByZXNlbnQsCiAgICB0aGlzIG1ldGhvZCBoYXMgbm8gZWZm ZWN0LgoKICAgIElmIHRoZSBwYXNzZWQgb2JqZWN0IGlzIG9mIGEgdHlwZSBu b3Qgc3VwcG9ydGVkIGJ5IHRoZSByZWNlaXZlciwKICAgIHRoZW4gdGhpcyBt ZXRob2Qgc2hvdWxkIHJhaXNlIGFuIGV4Y2VwdGlvbi4KCiAgICBAbWV0aG9k IHJlbW92ZU9iamVjdAogICAgQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUg b2JqZWN0IHRvIHJlbW92ZSBmcm9tIHRoZSBlbnVtZXJhYmxlLgogICAgQHJl dHVybiB7T2JqZWN0fSB0aGUgcGFzc2VkIG9iamVjdAogICovCiAgcmVtb3Zl T2JqZWN0OiBFbWJlci5yZXF1aXJlZChGdW5jdGlvbiksCgoKICAvKioKICAg IFJlbW92ZXMgZWFjaCBvYmplY3QgaW4gdGhlIHBhc3NlZCBlbnVtZXJhYmxl IGZyb20gdGhlIHJlY2VpdmVyLgoKICAgIEBtZXRob2QgcmVtb3ZlT2JqZWN0 cwogICAgQHBhcmFtIHtFbWJlci5FbnVtZXJhYmxlfSBvYmplY3RzIHRoZSBv YmplY3RzIHRvIHJlbW92ZQogICAgQHJldHVybiB7T2JqZWN0fSByZWNlaXZl cgogICovCiAgcmVtb3ZlT2JqZWN0czogZnVuY3Rpb24ob2JqZWN0cykgewog ICAgRW1iZXIuYmVnaW5Qcm9wZXJ0eUNoYW5nZXModGhpcyk7CiAgICBmb3JF YWNoKG9iamVjdHMsIGZ1bmN0aW9uKG9iaikgeyB0aGlzLnJlbW92ZU9iamVj dChvYmopOyB9LCB0aGlzKTsKICAgIEVtYmVyLmVuZFByb3BlcnR5Q2hhbmdl cyh0aGlzKTsKICAgIHJldHVybiB0aGlzOwogIH0KCn0pOwoKfSkoKTsKCgoK KGZ1bmN0aW9uKCkgewovKioKQG1vZHVsZSBlbWJlcgpAc3VibW9kdWxlIGVt YmVyLXJ1bnRpbWUKKi8KLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgovLyBDT05TVEFOVFMK Ly8KCnZhciBPVVRfT0ZfUkFOR0VfRVhDRVBUSU9OID0gIkluZGV4IG91dCBv ZiByYW5nZSIgOwp2YXIgRU1QVFkgPSBbXTsKCi8vIC4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4K Ly8gSEVMUEVSUwovLwoKdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1i ZXIuc2V0OwoKLyoqCiAgVGhpcyBtaXhpbiBkZWZpbmVzIHRoZSBBUEkgZm9y IG1vZGlmeWluZyBhcnJheS1saWtlIG9iamVjdHMuIFRoZXNlIG1ldGhvZHMK ICBjYW4gYmUgYXBwbGllZCBvbmx5IHRvIGEgY29sbGVjdGlvbiB0aGF0IGtl ZXBzIGl0cyBpdGVtcyBpbiBhbiBvcmRlcmVkIHNldC4KCiAgTm90ZSB0aGF0 IGFuIEFycmF5IGNhbiBjaGFuZ2UgZXZlbiBpZiBpdCBkb2VzIG5vdCBpbXBs ZW1lbnQgdGhpcyBtaXhpbi4KICBGb3IgZXhhbXBsZSwgb25lIG1pZ2h0IGlt cGxlbWVudCBhIFNwYXJzZUFycmF5IHRoYXQgY2Fubm90IGJlIGRpcmVjdGx5 CiAgbW9kaWZpZWQsIGJ1dCBpZiBpdHMgdW5kZXJseWluZyBlbnVtZXJhYmxl IGNoYW5nZXMsIGl0IHdpbGwgY2hhbmdlIGFsc28uCgogIEBjbGFzcyBNdXRh YmxlQXJyYXkKICBAbmFtZXNwYWNlIEVtYmVyCiAgQHVzZXMgRW1iZXIuQXJy YXkKICBAdXNlcyBFbWJlci5NdXRhYmxlRW51bWVyYWJsZQoqLwpFbWJlci5N dXRhYmxlQXJyYXkgPSBFbWJlci5NaXhpbi5jcmVhdGUoRW1iZXIuQXJyYXks IEVtYmVyLk11dGFibGVFbnVtZXJhYmxlLCB7CgogIC8qKgogICAgX19SZXF1 aXJlZC5fXyBZb3UgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gYXBw bHkgdGhpcyBtaXhpbi4KCiAgICBUaGlzIGlzIG9uZSBvZiB0aGUgcHJpbWl0 aXZlcyB5b3UgbXVzdCBpbXBsZW1lbnQgdG8gc3VwcG9ydCBgRW1iZXIuQXJy YXlgLgogICAgWW91IHNob3VsZCByZXBsYWNlIGFtdCBvYmplY3RzIHN0YXJ0 ZWQgYXQgaWR4IHdpdGggdGhlIG9iamVjdHMgaW4gdGhlCiAgICBwYXNzZWQg YXJyYXkuIFlvdSBzaG91bGQgYWxzbyBjYWxsIGB0aGlzLmVudW1lcmFibGVD b250ZW50RGlkQ2hhbmdlKClgCgogICAgQG1ldGhvZCByZXBsYWNlCiAgICBA cGFyYW0ge051bWJlcn0gaWR4IFN0YXJ0aW5nIGluZGV4IGluIHRoZSBhcnJh eSB0byByZXBsYWNlLiBJZgogICAgICBpZHggPj0gbGVuZ3RoLCB0aGVuIGFw cGVuZCB0byB0aGUgZW5kIG9mIHRoZSBhcnJheS4KICAgIEBwYXJhbSB7TnVt YmVyfSBhbXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIHJl bW92ZWQgZnJvbQogICAgICB0aGUgYXJyYXksIHN0YXJ0aW5nIGF0ICppZHgq LgogICAgQHBhcmFtIHtBcnJheX0gb2JqZWN0cyBBbiBhcnJheSBvZiB6ZXJv IG9yIG1vcmUgb2JqZWN0cyB0aGF0IHNob3VsZCBiZQogICAgICBpbnNlcnRl ZCBpbnRvIHRoZSBhcnJheSBhdCAqaWR4KgogICovCiAgcmVwbGFjZTogRW1i ZXIucmVxdWlyZWQoKSwKCiAgLyoqCiAgICBSZW1vdmUgYWxsIGVsZW1lbnRz IGZyb20gc2VsZi4gVGhpcyBpcyB1c2VmdWwgaWYgeW91CiAgICB3YW50IHRv IHJldXNlIGFuIGV4aXN0aW5nIGFycmF5IHdpdGhvdXQgaGF2aW5nIHRvIHJl Y3JlYXRlIGl0LgoKICAgIGBgYGphdmFzY3JpcHQKICAgIHZhciBjb2xvcnMg PSBbInJlZCIsICJncmVlbiIsICJibHVlIl07CiAgICBjb2xvci5sZW5ndGgo KTsgICAvLyAgMwogICAgY29sb3JzLmNsZWFyKCk7ICAgLy8gIFtdCiAgICBj b2xvcnMubGVuZ3RoKCk7ICAvLyAgMAogICAgYGBgCgogICAgQG1ldGhvZCBj bGVhcgogICAgQHJldHVybiB7RW1iZXIuQXJyYXl9IEFuIGVtcHR5IEFycmF5 LgogICovCiAgY2xlYXI6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBsZW4gPSBn ZXQodGhpcywgJ2xlbmd0aCcpOwogICAgaWYgKGxlbiA9PT0gMCkgcmV0dXJu IHRoaXM7CiAgICB0aGlzLnJlcGxhY2UoMCwgbGVuLCBFTVBUWSk7CiAgICBy ZXR1cm4gdGhpczsKICB9LAoKICAvKioKICAgIFRoaXMgd2lsbCB1c2UgdGhl IHByaW1pdGl2ZSBgcmVwbGFjZSgpYCBtZXRob2QgdG8gaW5zZXJ0IGFuIG9i amVjdCBhdCB0aGUKICAgIHNwZWNpZmllZCBpbmRleC4KCiAgICBgYGBqYXZh c2NyaXB0CiAgICB2YXIgY29sb3JzID0gWyJyZWQiLCAiZ3JlZW4iLCAiYmx1 ZSJdOwogICAgY29sb3JzLmluc2VydEF0KDIsICJ5ZWxsb3ciKTsgIC8vIFsi cmVkIiwgImdyZWVuIiwgInllbGxvdyIsICJibHVlIl0KICAgIGNvbG9ycy5p bnNlcnRBdCg1LCAib3JhbmdlIik7ICAvLyBFcnJvcjogSW5kZXggb3V0IG9m IHJhbmdlCiAgICBgYGAKCiAgICBAbWV0aG9kIGluc2VydEF0CiAgICBAcGFy YW0ge051bWJlcn0gaWR4IGluZGV4IG9mIGluc2VydCB0aGUgb2JqZWN0IGF0 LgogICAgQHBhcmFtIHtPYmplY3R9IG9iamVjdCBvYmplY3QgdG8gaW5zZXJ0 CiAgICBAcmV0dXJuIHRoaXMKICAqLwogIGluc2VydEF0OiBmdW5jdGlvbihp ZHgsIG9iamVjdCkgewogICAgaWYgKGlkeCA+IGdldCh0aGlzLCAnbGVuZ3Ro JykpIHRocm93IG5ldyBFbWJlci5FcnJvcihPVVRfT0ZfUkFOR0VfRVhDRVBU SU9OKSA7CiAgICB0aGlzLnJlcGxhY2UoaWR4LCAwLCBbb2JqZWN0XSkgOwog ICAgcmV0dXJuIHRoaXMgOwogIH0sCgogIC8qKgogICAgUmVtb3ZlIGFuIG9i amVjdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IHVzaW5nIHRoZSBgcmVwbGFj ZSgpYCBwcmltaXRpdmUKICAgIG1ldGhvZC4gWW91IGNhbiBwYXNzIGVpdGhl ciBhIHNpbmdsZSBpbmRleCwgb3IgYSBzdGFydCBhbmQgYSBsZW5ndGguCgog ICAgSWYgeW91IHBhc3MgYSBzdGFydCBhbmQgbGVuZ3RoIHRoYXQgaXMgYmV5 b25kIHRoZQogICAgbGVuZ3RoIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4g YE9VVF9PRl9SQU5HRV9FWENFUFRJT05gLgoKICAgIGBgYGphdmFzY3JpcHQK ICAgIHZhciBjb2xvcnMgPSBbInJlZCIsICJncmVlbiIsICJibHVlIiwgInll bGxvdyIsICJvcmFuZ2UiXTsKICAgIGNvbG9ycy5yZW1vdmVBdCgwKTsgICAg IC8vIFsiZ3JlZW4iLCAiYmx1ZSIsICJ5ZWxsb3ciLCAib3JhbmdlIl0KICAg IGNvbG9ycy5yZW1vdmVBdCgyLCAyKTsgIC8vIFsiZ3JlZW4iLCAiYmx1ZSJd CiAgICBjb2xvcnMucmVtb3ZlQXQoNCwgMik7ICAvLyBFcnJvcjogSW5kZXgg b3V0IG9mIHJhbmdlCiAgICBgYGAKCiAgICBAbWV0aG9kIHJlbW92ZUF0CiAg ICBAcGFyYW0ge051bWJlcn0gc3RhcnQgaW5kZXgsIHN0YXJ0IG9mIHJhbmdl CiAgICBAcGFyYW0ge051bWJlcn0gbGVuIGxlbmd0aCBvZiBwYXNzaW5nIHJh bmdlCiAgICBAcmV0dXJuIHtPYmplY3R9IHJlY2VpdmVyCiAgKi8KICByZW1v dmVBdDogZnVuY3Rpb24oc3RhcnQsIGxlbikgewogICAgaWYgKCdudW1iZXIn ID09PSB0eXBlb2Ygc3RhcnQpIHsKCiAgICAgIGlmICgoc3RhcnQgPCAwKSB8 fCAoc3RhcnQgPj0gZ2V0KHRoaXMsICdsZW5ndGgnKSkpIHsKICAgICAgICB0 aHJvdyBuZXcgRW1iZXIuRXJyb3IoT1VUX09GX1JBTkdFX0VYQ0VQVElPTik7 CiAgICAgIH0KCiAgICAgIC8vIGZhc3QgY2FzZQogICAgICBpZiAobGVuID09 PSB1bmRlZmluZWQpIGxlbiA9IDE7CiAgICAgIHRoaXMucmVwbGFjZShzdGFy dCwgbGVuLCBFTVBUWSk7CiAgICB9CgogICAgcmV0dXJuIHRoaXMgOwogIH0s CgogIC8qKgogICAgUHVzaCB0aGUgb2JqZWN0IG9udG8gdGhlIGVuZCBvZiB0 aGUgYXJyYXkuIFdvcmtzIGp1c3QgbGlrZSBgcHVzaCgpYCBidXQgaXQKICAg IGlzIEtWTy1jb21wbGlhbnQuCgogICAgYGBgamF2YXNjcmlwdAogICAgdmFy IGNvbG9ycyA9IFsicmVkIiwgImdyZWVuIl07CiAgICBjb2xvcnMucHVzaE9i amVjdCgiYmxhY2siKTsgICAgIC8vIFsicmVkIiwgImdyZWVuIiwgImJsYWNr Il0KICAgIGNvbG9ycy5wdXNoT2JqZWN0KFsieWVsbG93Il0pOyAgLy8gWyJy ZWQiLCAiZ3JlZW4iLCBbInllbGxvdyJdXQogICAgYGBgCgogICAgQG1ldGhv ZCBwdXNoT2JqZWN0CiAgICBAcGFyYW0geyp9IG9iaiBvYmplY3QgdG8gcHVz aAogICAgQHJldHVybiBUaGUgc2FtZSBvYmogcGFzc2VkIGFzIHBhcmFtCiAg Ki8KICBwdXNoT2JqZWN0OiBmdW5jdGlvbihvYmopIHsKICAgIHRoaXMuaW5z ZXJ0QXQoZ2V0KHRoaXMsICdsZW5ndGgnKSwgb2JqKSA7CiAgICByZXR1cm4g b2JqOwogIH0sCgogIC8qKgogICAgQWRkIHRoZSBvYmplY3RzIGluIHRoZSBw YXNzZWQgbnVtZXJhYmxlIHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5LiBEZWZl cnMKICAgIG5vdGlmeWluZyBvYnNlcnZlcnMgb2YgdGhlIGNoYW5nZSB1bnRp bCBhbGwgb2JqZWN0cyBhcmUgYWRkZWQuCgogICAgYGBgamF2YXNjcmlwdAog ICAgdmFyIGNvbG9ycyA9IFsicmVkIl07CiAgICBjb2xvcnMucHVzaE9iamVj dHMoWyJ5ZWxsb3ciLCAib3JhbmdlIl0pOyAgLy8gWyJyZWQiLCAieWVsbG93 IiwgIm9yYW5nZSJdCiAgICBgYGAKCiAgICBAbWV0aG9kIHB1c2hPYmplY3Rz CiAgICBAcGFyYW0ge0VtYmVyLkVudW1lcmFibGV9IG9iamVjdHMgdGhlIG9i amVjdHMgdG8gYWRkCiAgICBAcmV0dXJuIHtFbWJlci5BcnJheX0gcmVjZWl2 ZXIKICAqLwogIHB1c2hPYmplY3RzOiBmdW5jdGlvbihvYmplY3RzKSB7CiAg ICBpZiAoIShFbWJlci5FbnVtZXJhYmxlLmRldGVjdChvYmplY3RzKSB8fCBF bWJlci5pc0FycmF5KG9iamVjdHMpKSkgewogICAgICB0aHJvdyBuZXcgVHlw ZUVycm9yKCJNdXN0IHBhc3MgRW1iZXIuRW51bWVyYWJsZSB0byBFbWJlci5N dXRhYmxlQXJyYXkjcHVzaE9iamVjdHMiKTsKICAgIH0KICAgIHRoaXMucmVw bGFjZShnZXQodGhpcywgJ2xlbmd0aCcpLCAwLCBvYmplY3RzKTsKICAgIHJl dHVybiB0aGlzOwogIH0sCgogIC8qKgogICAgUG9wIG9iamVjdCBmcm9tIGFy cmF5IG9yIG5pbCBpZiBub25lIGFyZSBsZWZ0LiBXb3JrcyBqdXN0IGxpa2Ug YHBvcCgpYCBidXQKICAgIGl0IGlzIEtWTy1jb21wbGlhbnQuCgogICAgYGBg amF2YXNjcmlwdAogICAgdmFyIGNvbG9ycyA9IFsicmVkIiwgImdyZWVuIiwg ImJsdWUiXTsKICAgIGNvbG9ycy5wb3BPYmplY3QoKTsgICAvLyAiYmx1ZSIK ICAgIGNvbnNvbGUubG9nKGNvbG9ycyk7ICAvLyBbInJlZCIsICJncmVlbiJd CiAgICBgYGAKCiAgICBAbWV0aG9kIHBvcE9iamVjdAogICAgQHJldHVybiBv YmplY3QKICAqLwogIHBvcE9iamVjdDogZnVuY3Rpb24oKSB7CiAgICB2YXIg bGVuID0gZ2V0KHRoaXMsICdsZW5ndGgnKSA7CiAgICBpZiAobGVuID09PSAw KSByZXR1cm4gbnVsbCA7CgogICAgdmFyIHJldCA9IHRoaXMub2JqZWN0QXQo bGVuLTEpIDsKICAgIHRoaXMucmVtb3ZlQXQobGVuLTEsIDEpIDsKICAgIHJl dHVybiByZXQgOwogIH0sCgogIC8qKgogICAgU2hpZnQgYW4gb2JqZWN0IGZy b20gc3RhcnQgb2YgYXJyYXkgb3IgbmlsIGlmIG5vbmUgYXJlIGxlZnQuIFdv cmtzIGp1c3QKICAgIGxpa2UgYHNoaWZ0KClgIGJ1dCBpdCBpcyBLVk8tY29t cGxpYW50LgoKICAgIGBgYGphdmFzY3JpcHQKICAgIHZhciBjb2xvcnMgPSBb InJlZCIsICJncmVlbiIsICJibHVlIl07CiAgICBjb2xvcnMuc2hpZnRPYmpl Y3QoKTsgIC8vICJyZWQiCiAgICBjb25zb2xlLmxvZyhjb2xvcnMpOyAgIC8v IFsiZ3JlZW4iLCAiYmx1ZSJdCiAgICBgYGAKCiAgICBAbWV0aG9kIHNoaWZ0 T2JqZWN0CiAgICBAcmV0dXJuIG9iamVjdAogICovCiAgc2hpZnRPYmplY3Q6 IGZ1bmN0aW9uKCkgewogICAgaWYgKGdldCh0aGlzLCAnbGVuZ3RoJykgPT09 IDApIHJldHVybiBudWxsIDsKICAgIHZhciByZXQgPSB0aGlzLm9iamVjdEF0 KDApIDsKICAgIHRoaXMucmVtb3ZlQXQoMCkgOwogICAgcmV0dXJuIHJldCA7 CiAgfSwKCiAgLyoqCiAgICBVbnNoaWZ0IGFuIG9iamVjdCB0byBzdGFydCBv ZiBhcnJheS4gV29ya3MganVzdCBsaWtlIGB1bnNoaWZ0KClgIGJ1dCBpdCBp cwogICAgS1ZPLWNvbXBsaWFudC4KCiAgICBgYGBqYXZhc2NyaXB0CiAgICB2 YXIgY29sb3JzID0gWyJyZWQiXTsKICAgIGNvbG9ycy51bnNoaWZ0T2JqZWN0 KCJ5ZWxsb3ciKTsgICAgLy8gWyJ5ZWxsb3ciLCAicmVkIl0KICAgIGNvbG9y cy51bnNoaWZ0T2JqZWN0KFsiYmxhY2siXSk7ICAgLy8gW1siYmxhY2siXSwg InllbGxvdyIsICJyZWQiXQogICAgYGBgCgogICAgQG1ldGhvZCB1bnNoaWZ0 T2JqZWN0CiAgICBAcGFyYW0geyp9IG9iaiBvYmplY3QgdG8gdW5zaGlmdAog ICAgQHJldHVybiBUaGUgc2FtZSBvYmogcGFzc2VkIGFzIHBhcmFtCiAgKi8K ICB1bnNoaWZ0T2JqZWN0OiBmdW5jdGlvbihvYmopIHsKICAgIHRoaXMuaW5z ZXJ0QXQoMCwgb2JqKSA7CiAgICByZXR1cm4gb2JqIDsKICB9LAoKICAvKioK ICAgIEFkZHMgdGhlIG5hbWVkIG9iamVjdHMgdG8gdGhlIGJlZ2lubmluZyBv ZiB0aGUgYXJyYXkuIERlZmVycyBub3RpZnlpbmcKICAgIG9ic2VydmVycyB1 bnRpbCBhbGwgb2JqZWN0cyBoYXZlIGJlZW4gYWRkZWQuCgogICAgYGBgamF2 YXNjcmlwdAogICAgdmFyIGNvbG9ycyA9IFsicmVkIl07CiAgICBjb2xvcnMu dW5zaGlmdE9iamVjdHMoWyJibGFjayIsICJ3aGl0ZSJdKTsgICAvLyBbImJs YWNrIiwgIndoaXRlIiwgInJlZCJdCiAgICBjb2xvcnMudW5zaGlmdE9iamVj dHMoInllbGxvdyIpOyAvLyBUeXBlIEVycm9yOiAndW5kZWZpbmVkJyBpcyBu b3QgYSBmdW5jdGlvbgogICAgYGBgCgogICAgQG1ldGhvZCB1bnNoaWZ0T2Jq ZWN0cwogICAgQHBhcmFtIHtFbWJlci5FbnVtZXJhYmxlfSBvYmplY3RzIHRo ZSBvYmplY3RzIHRvIGFkZAogICAgQHJldHVybiB7RW1iZXIuQXJyYXl9IHJl Y2VpdmVyCiAgKi8KICB1bnNoaWZ0T2JqZWN0czogZnVuY3Rpb24ob2JqZWN0 cykgewogICAgdGhpcy5yZXBsYWNlKDAsIDAsIG9iamVjdHMpOwogICAgcmV0 dXJuIHRoaXM7CiAgfSwKCiAgLyoqCiAgICBSZXZlcnNlIG9iamVjdHMgaW4g dGhlIGFycmF5LiBXb3JrcyBqdXN0IGxpa2UgYHJldmVyc2UoKWAgYnV0IGl0 IGlzCiAgICBLVk8tY29tcGxpYW50LgoKICAgIEBtZXRob2QgcmV2ZXJzZU9i amVjdHMKICAgIEByZXR1cm4ge0VtYmVyLkFycmF5fSByZWNlaXZlcgogICAq LwogIHJldmVyc2VPYmplY3RzOiBmdW5jdGlvbigpIHsKICAgIHZhciBsZW4g PSBnZXQodGhpcywgJ2xlbmd0aCcpOwogICAgaWYgKGxlbiA9PT0gMCkgcmV0 dXJuIHRoaXM7CiAgICB2YXIgb2JqZWN0cyA9IHRoaXMudG9BcnJheSgpLnJl dmVyc2UoKTsKICAgIHRoaXMucmVwbGFjZSgwLCBsZW4sIG9iamVjdHMpOwog ICAgcmV0dXJuIHRoaXM7CiAgfSwKCiAgLyoqCiAgICBSZXBsYWNlIGFsbCB0 aGUgdGhlIHJlY2VpdmVyJ3MgY29udGVudCB3aXRoIGNvbnRlbnQgb2YgdGhl IGFyZ3VtZW50LgogICAgSWYgYXJndW1lbnQgaXMgYW4gZW1wdHkgYXJyYXkg cmVjZWl2ZXIgd2lsbCBiZSBjbGVhcmVkLgoKICAgIGBgYGphdmFzY3JpcHQK ICAgIHZhciBjb2xvcnMgPSBbInJlZCIsICJncmVlbiIsICJibHVlIl07CiAg ICBjb2xvcnMuc2V0T2JqZWN0cyhbImJsYWNrIiwgIndoaXRlIl0pOyAgLy8g WyJibGFjayIsICJ3aGl0ZSJdCiAgICBjb2xvcnMuc2V0T2JqZWN0cyhbXSk7 ICAgICAgICAgICAgICAgICAgLy8gW10KICAgIGBgYAoKICAgIEBtZXRob2Qg c2V0T2JqZWN0cwogICAgQHBhcmFtIHtFbWJlci5BcnJheX0gb2JqZWN0cyBh cnJheSB3aG9zZSBjb250ZW50IHdpbGwgYmUgdXNlZCBmb3IgcmVwbGFjaW5n CiAgICAgICAgdGhlIGNvbnRlbnQgb2YgdGhlIHJlY2VpdmVyCiAgICBAcmV0 dXJuIHtFbWJlci5BcnJheX0gcmVjZWl2ZXIgd2l0aCB0aGUgbmV3IGNvbnRl bnQKICAgKi8KICBzZXRPYmplY3RzOiBmdW5jdGlvbihvYmplY3RzKSB7CiAg ICBpZiAob2JqZWN0cy5sZW5ndGggPT09IDApIHJldHVybiB0aGlzLmNsZWFy KCk7CgogICAgdmFyIGxlbiA9IGdldCh0aGlzLCAnbGVuZ3RoJyk7CiAgICB0 aGlzLnJlcGxhY2UoMCwgbGVuLCBvYmplY3RzKTsKICAgIHJldHVybiB0aGlz OwogIH0sCgogIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KICAvLyBJTVBMRU1FTlQgRW1i ZXIuTXV0YWJsZUVudW1lcmFibGUKICAvLwoKICByZW1vdmVPYmplY3Q6IGZ1 bmN0aW9uKG9iaikgewogICAgdmFyIGxvYyA9IGdldCh0aGlzLCAnbGVuZ3Ro JykgfHwgMDsKICAgIHdoaWxlKC0tbG9jID49IDApIHsKICAgICAgdmFyIGN1 ck9iamVjdCA9IHRoaXMub2JqZWN0QXQobG9jKSA7CiAgICAgIGlmIChjdXJP YmplY3QgPT09IG9iaikgdGhpcy5yZW1vdmVBdChsb2MpIDsKICAgIH0KICAg IHJldHVybiB0aGlzIDsKICB9LAoKICBhZGRPYmplY3Q6IGZ1bmN0aW9uKG9i aikgewogICAgaWYgKCF0aGlzLmNvbnRhaW5zKG9iaikpIHRoaXMucHVzaE9i amVjdChvYmopOwogICAgcmV0dXJuIHRoaXMgOwogIH0KCn0pOwoKfSkoKTsK CgoKKGZ1bmN0aW9uKCkgewovKioKQG1vZHVsZSBlbWJlcgpAc3VibW9kdWxl IGVtYmVyLXJ1bnRpbWUKKi8KCnZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9 IEVtYmVyLnNldDsKCi8qKgpgRW1iZXIuVGFyZ2V0QWN0aW9uU3VwcG9ydGAg aXMgYSBtaXhpbiB0aGF0IGNhbiBiZSBpbmNsdWRlZCBpbiBhIGNsYXNzCnRv IGFkZCBhIGB0cmlnZ2VyQWN0aW9uYCBtZXRob2Qgd2l0aCBzZW1hbnRpY3Mg c2ltaWxhciB0byB0aGUgSGFuZGxlYmFycwpge3thY3Rpb259fWAgaGVscGVy LiBJbiBub3JtYWwgRW1iZXIgdXNhZ2UsIHRoZSBge3thY3Rpb259fWAgaGVs cGVyIGlzCnVzdWFsbHkgdGhlIGJlc3QgY2hvaWNlLiBUaGlzIG1peGluIGlz IG1vc3Qgb2Z0ZW4gdXNlZnVsIHdoZW4geW91IGFyZQpkb2luZyBtb3JlIGNv bXBsZXggZXZlbnQgaGFuZGxpbmcgaW4gVmlldyBvYmplY3RzLgoKU2VlIGFs c28gYEVtYmVyLlZpZXdUYXJnZXRBY3Rpb25TdXBwb3J0YCwgd2hpY2ggaGFz CnZpZXctYXdhcmUgZGVmYXVsdHMgZm9yIHRhcmdldCBhbmQgYWN0aW9uQ29u dGV4dC4KCkBjbGFzcyBUYXJnZXRBY3Rpb25TdXBwb3J0CkBuYW1lc3BhY2Ug RW1iZXIKQGV4dGVuZHMgRW1iZXIuTWl4aW4KKi8KRW1iZXIuVGFyZ2V0QWN0 aW9uU3VwcG9ydCA9IEVtYmVyLk1peGluLmNyZWF0ZSh7CiAgdGFyZ2V0OiBu dWxsLAogIGFjdGlvbjogbnVsbCwKICBhY3Rpb25Db250ZXh0OiBudWxsLAoK ICB0YXJnZXRPYmplY3Q6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewog ICAgdmFyIHRhcmdldCA9IGdldCh0aGlzLCAndGFyZ2V0Jyk7CgogICAgaWYg KEVtYmVyLnR5cGVPZih0YXJnZXQpID09PSAic3RyaW5nIikgewogICAgICB2 YXIgdmFsdWUgPSBnZXQodGhpcywgdGFyZ2V0KTsKICAgICAgaWYgKHZhbHVl ID09PSB1bmRlZmluZWQpIHsgdmFsdWUgPSBnZXQoRW1iZXIubG9va3VwLCB0 YXJnZXQpOyB9CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0gZWxzZSB7CiAg ICAgIHJldHVybiB0YXJnZXQ7CiAgICB9CiAgfSkucHJvcGVydHkoJ3Rhcmdl dCcpLAoKICBhY3Rpb25Db250ZXh0T2JqZWN0OiBFbWJlci5jb21wdXRlZChm dW5jdGlvbigpIHsKICAgIHZhciBhY3Rpb25Db250ZXh0ID0gZ2V0KHRoaXMs ICdhY3Rpb25Db250ZXh0Jyk7CgogICAgaWYgKEVtYmVyLnR5cGVPZihhY3Rp b25Db250ZXh0KSA9PT0gInN0cmluZyIpIHsKICAgICAgdmFyIHZhbHVlID0g Z2V0KHRoaXMsIGFjdGlvbkNvbnRleHQpOwogICAgICBpZiAodmFsdWUgPT09 IHVuZGVmaW5lZCkgeyB2YWx1ZSA9IGdldChFbWJlci5sb29rdXAsIGFjdGlv bkNvbnRleHQpOyB9CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0gZWxzZSB7 CiAgICAgIHJldHVybiBhY3Rpb25Db250ZXh0OwogICAgfQogIH0pLnByb3Bl cnR5KCdhY3Rpb25Db250ZXh0JyksCgogIC8qKgogIFNlbmQgYW4gYGFjdGlv bmAgd2l0aCBhbiBgYWN0aW9uQ29udGV4dGAgdG8gYSBgdGFyZ2V0YC4gVGhl IGFjdGlvbiwgYWN0aW9uQ29udGV4dAogIGFuZCB0YXJnZXQgd2lsbCBiZSBy ZXRyaWV2ZWQgZnJvbSBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3QuIEZvciBl eGFtcGxlOgoKICBgYGBqYXZhc2NyaXB0CiAgQXBwLlNhdmVCdXR0b25WaWV3 ID0gRW1iZXIuVmlldy5leHRlbmQoRW1iZXIuVGFyZ2V0QWN0aW9uU3VwcG9y dCwgewogICAgdGFyZ2V0OiBFbWJlci5jb21wdXRlZC5hbGlhcygnY29udHJv bGxlcicpLAogICAgYWN0aW9uOiAnc2F2ZScsCiAgICBhY3Rpb25Db250ZXh0 OiBFbWJlci5jb21wdXRlZC5hbGlhcygnY29udGV4dCcpLAogICAgY2xpY2s6 IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLnRyaWdnZXJBY3Rpb24oKTsgLy8g U2VuZHMgdGhlIGBzYXZlYCBhY3Rpb24sIGFsb25nIHdpdGggdGhlIGN1cnJl bnQgY29udGV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8g dGhlIGN1cnJlbnQgY29udHJvbGxlcgogICAgfQogIH0pOwogIGBgYAoKICBU aGUgYHRhcmdldGAsIGBhY3Rpb25gLCBhbmQgYGFjdGlvbkNvbnRleHRgIGNh biBiZSBwcm92aWRlZCBhcyBwcm9wZXJ0aWVzIG9mCiAgYW4gb3B0aW9uYWwg b2JqZWN0IGFyZ3VtZW50IHRvIGB0cmlnZ2VyQWN0aW9uYCBhcyB3ZWxsLgoK ICBgYGBqYXZhc2NyaXB0CiAgQXBwLlNhdmVCdXR0b25WaWV3ID0gRW1iZXIu Vmlldy5leHRlbmQoRW1iZXIuVGFyZ2V0QWN0aW9uU3VwcG9ydCwgewogICAg Y2xpY2s6IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLnRyaWdnZXJBY3Rpb24o ewogICAgICAgIGFjdGlvbjogJ3NhdmUnLAogICAgICAgIHRhcmdldDogdGhp cy5nZXQoJ2NvbnRyb2xsZXInKSwKICAgICAgICBhY3Rpb25Db250ZXh0OiB0 aGlzLmdldCgnY29udGV4dCcpLAogICAgICB9KTsgLy8gU2VuZHMgdGhlIGBz YXZlYCBhY3Rpb24sIGFsb25nIHdpdGggdGhlIGN1cnJlbnQgY29udGV4dAog ICAgICAgICAgLy8gdG8gdGhlIGN1cnJlbnQgY29udHJvbGxlcgogICAgfQog IH0pOwogIGBgYAoKICBUaGUgYGFjdGlvbkNvbnRleHRgIGRlZmF1bHRzIHRv IHRoZSBvYmplY3QgeW91IG1peGluZyBgVGFyZ2V0QWN0aW9uU3VwcG9ydGAg aW50by4KICBCdXQgYHRhcmdldGAgYW5kIGBhY3Rpb25gIG11c3QgYmUgc3Bl Y2lmaWVkIGVpdGhlciBhcyBwcm9wZXJ0aWVzIG9yIHdpdGggdGhlIGFyZ3Vt ZW50CiAgdG8gYHRyaWdnZXJBY3Rpb25gLCBvciBhIGNvbWJpbmF0aW9uOgoK ICBgYGBqYXZhc2NyaXB0CiAgQXBwLlNhdmVCdXR0b25WaWV3ID0gRW1iZXIu Vmlldy5leHRlbmQoRW1iZXIuVGFyZ2V0QWN0aW9uU3VwcG9ydCwgewogICAg dGFyZ2V0OiBFbWJlci5jb21wdXRlZC5hbGlhcygnY29udHJvbGxlcicpLAog ICAgY2xpY2s6IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLnRyaWdnZXJBY3Rp b24oewogICAgICAgIGFjdGlvbjogJ3NhdmUnCiAgICAgIH0pOyAvLyBTZW5k cyB0aGUgYHNhdmVgIGFjdGlvbiwgYWxvbmcgd2l0aCBhIHJlZmVyZW5jZSB0 byBgdGhpc2AsCiAgICAgICAgICAvLyB0byB0aGUgY3VycmVudCBjb250cm9s bGVyCiAgICB9CiAgfSk7CiAgYGBgCgogIEBtZXRob2QgdHJpZ2dlckFjdGlv bgogIEBwYXJhbSBvcHRzIHtIYXNofSAob3B0aW9uYWwsIHdpdGggdGhlIG9w dGlvbmFsIGtleXMgYWN0aW9uLCB0YXJnZXQgYW5kL29yIGFjdGlvbkNvbnRl eHQpCiAgQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgYWN0aW9uIHdh cyBzZW50IHN1Y2Nlc3NmdWxseSBhbmQgZGlkIG5vdCByZXR1cm4gZmFsc2UK ICAqLwogIHRyaWdnZXJBY3Rpb246IGZ1bmN0aW9uKG9wdHMpIHsKICAgIG9w dHMgPSBvcHRzIHx8IHt9OwogICAgdmFyIGFjdGlvbiA9IG9wdHMuYWN0aW9u IHx8IGdldCh0aGlzLCAnYWN0aW9uJyksCiAgICAgICAgdGFyZ2V0ID0gb3B0 cy50YXJnZXQgfHwgZ2V0KHRoaXMsICd0YXJnZXRPYmplY3QnKSwKICAgICAg ICBhY3Rpb25Db250ZXh0ID0gb3B0cy5hY3Rpb25Db250ZXh0OwoKICAgIGZ1 bmN0aW9uIGFyZ3Mob3B0aW9ucywgYWN0aW9uTmFtZSkgewogICAgICB2YXIg cmV0ID0gW107CiAgICAgIGlmIChhY3Rpb25OYW1lKSB7IHJldC5wdXNoKGFj dGlvbk5hbWUpOyB9CgogICAgICByZXR1cm4gcmV0LmNvbmNhdChvcHRpb25z KTsKICAgIH0KCiAgICBpZiAodHlwZW9mIGFjdGlvbkNvbnRleHQgPT09ICd1 bmRlZmluZWQnKSB7CiAgICAgIGFjdGlvbkNvbnRleHQgPSBnZXQodGhpcywg J2FjdGlvbkNvbnRleHRPYmplY3QnKSB8fCB0aGlzOwogICAgfQoKICAgIGlm ICh0YXJnZXQgJiYgYWN0aW9uKSB7CiAgICAgIHZhciByZXQ7CgogICAgICBp ZiAodGFyZ2V0LnNlbmQpIHsKICAgICAgICByZXQgPSB0YXJnZXQuc2VuZC5h cHBseSh0YXJnZXQsIGFyZ3MoYWN0aW9uQ29udGV4dCwgYWN0aW9uKSk7CiAg ICAgIH0gZWxzZSB7CiAgICAgICAgRW1iZXIuYXNzZXJ0KCJUaGUgYWN0aW9u ICciICsgYWN0aW9uICsgIicgZGlkIG5vdCBleGlzdCBvbiAiICsgdGFyZ2V0 LCB0eXBlb2YgdGFyZ2V0W2FjdGlvbl0gPT09ICdmdW5jdGlvbicpOwogICAg ICAgIHJldCA9IHRhcmdldFthY3Rpb25dLmFwcGx5KHRhcmdldCwgYXJncyhh Y3Rpb25Db250ZXh0KSk7CiAgICAgIH0KCiAgICAgIGlmIChyZXQgIT09IGZh bHNlKSByZXQgPSB0cnVlOwoKICAgICAgcmV0dXJuIHJldDsKICAgIH0gZWxz ZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9Cn0pOwoKfSkoKTsK CgoKKGZ1bmN0aW9uKCkgewovKioKQG1vZHVsZSBlbWJlcgpAc3VibW9kdWxl IGVtYmVyLXJ1bnRpbWUKKi8KCi8qKgogIFRoaXMgbWl4aW4gYWxsb3dzIGZv ciBFbWJlciBvYmplY3RzIHRvIHN1YnNjcmliZSB0byBhbmQgZW1pdCBldmVu dHMuCgogIGBgYGphdmFzY3JpcHQKICBBcHAuUGVyc29uID0gRW1iZXIuT2Jq ZWN0LmV4dGVuZChFbWJlci5FdmVudGVkLCB7CiAgICBncmVldDogZnVuY3Rp b24oKSB7CiAgICAgIC8vIC4uLgogICAgICB0aGlzLnRyaWdnZXIoJ2dyZWV0 Jyk7CiAgICB9CiAgfSk7CgogIHZhciBwZXJzb24gPSBBcHAuUGVyc29uLmNy ZWF0ZSgpOwoKICBwZXJzb24ub24oJ2dyZWV0JywgZnVuY3Rpb24oKSB7CiAg ICBjb25zb2xlLmxvZygnT3VyIHBlcnNvbiBoYXMgZ3JlZXRlZCcpOwogIH0p OwoKICBwZXJzb24uZ3JlZXQoKTsKCiAgLy8gb3V0cHV0czogJ091ciBwZXJz b24gaGFzIGdyZWV0ZWQnCiAgYGBgCgogIFlvdSBjYW4gYWxzbyBjaGFpbiBt dWx0aXBsZSBldmVudCBzdWJzY3JpcHRpb25zOgoKICBgYGBqYXZhc2NyaXB0 CiAgcGVyc29uLm9uKCdncmVldCcsIGZ1bmN0aW9uKCkgewogICAgY29uc29s ZS5sb2coJ091ciBwZXJzb24gaGFzIGdyZWV0ZWQnKTsKICB9KS5vbmUoJ2dy ZWV0JywgZnVuY3Rpb24oKSB7CiAgICBjb25zb2xlLmxvZygnT2ZmZXIgb25l LXRpbWUgc3BlY2lhbCcpOwogIH0pLm9mZignZXZlbnQnLCB0aGlzLCBmb3Jn ZXRUaGlzKTsKICBgYGAKCiAgQGNsYXNzIEV2ZW50ZWQKICBAbmFtZXNwYWNl IEVtYmVyCiAqLwpFbWJlci5FdmVudGVkID0gRW1iZXIuTWl4aW4uY3JlYXRl KHsKCiAgLyoqCiAgIFN1YnNjcmliZXMgdG8gYSBuYW1lZCBldmVudCB3aXRo IGdpdmVuIGZ1bmN0aW9uLgoKICAgYGBgamF2YXNjcmlwdAogICBwZXJzb24u b24oJ2RpZExvYWQnLCBmdW5jdGlvbigpIHsKICAgICAvLyBmaXJlZCBvbmNl IHRoZSBwZXJzb24gaGFzIGxvYWRlZAogICB9KTsKICAgYGBgCgogICBBbiBv cHRpb25hbCB0YXJnZXQgY2FuIGJlIHBhc3NlZCBpbiBhcyB0aGUgMm5kIGFy Z3VtZW50IHRoYXQgd2lsbAogICBiZSBzZXQgYXMgdGhlICJ0aGlzIiBmb3Ig dGhlIGNhbGxiYWNrLiBUaGlzIGlzIGEgZ29vZCB3YXkgdG8gZ2l2ZSB5b3Vy CiAgIGZ1bmN0aW9uIGFjY2VzcyB0byB0aGUgb2JqZWN0IHRyaWdnZXJpbmcg dGhlIGV2ZW50LiBXaGVuIHRoZSB0YXJnZXQKICAgcGFyYW1ldGVyIGlzIHVz ZWQgdGhlIGNhbGxiYWNrIGJlY29tZXMgdGhlIHRoaXJkIGFyZ3VtZW50LgoK ICAgQG1ldGhvZCBvbgogICBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFt ZSBvZiB0aGUgZXZlbnQKICAgQHBhcmFtIHtPYmplY3R9IFt0YXJnZXRdIFRo ZSAidGhpcyIgYmluZGluZyBmb3IgdGhlIGNhbGxiYWNrCiAgIEBwYXJhbSB7 RnVuY3Rpb259IG1ldGhvZCBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZQogICBA cmV0dXJuIHRoaXMKICAqLwogIG9uOiBmdW5jdGlvbihuYW1lLCB0YXJnZXQs IG1ldGhvZCkgewogICAgRW1iZXIuYWRkTGlzdGVuZXIodGhpcywgbmFtZSwg dGFyZ2V0LCBtZXRob2QpOwogICAgcmV0dXJuIHRoaXM7CiAgfSwKCiAgLyoq CiAgICBTdWJzY3JpYmVzIGEgZnVuY3Rpb24gdG8gYSBuYW1lZCBldmVudCBh bmQgdGhlbiBjYW5jZWxzIHRoZSBzdWJzY3JpcHRpb24KICAgIGFmdGVyIHRo ZSBmaXJzdCB0aW1lIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuIEl0IGlzIGdv b2QgdG8gdXNlIGBgb25lYGAgd2hlbgogICAgeW91IG9ubHkgY2FyZSBhYm91 dCB0aGUgZmlyc3QgdGltZSBhbiBldmVudCBoYXMgdGFrZW4gcGxhY2UuCgog ICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhbiBvcHRpb25hbCAybmQgYXJndW1l bnQgdGhhdCB3aWxsIGJlY29tZSB0aGUgInRoaXMiCiAgICB2YWx1ZSBmb3Ig dGhlIGNhbGxiYWNrLiBJZiB0aGlzIGFyZ3VtZW50IGlzIHBhc3NlZCB0aGVu IHRoZSAzcmQgYXJndW1lbnQKICAgIGJlY29tZXMgdGhlIGZ1bmN0aW9uLgoK ICAgIEBtZXRob2Qgb25lCiAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUg bmFtZSBvZiB0aGUgZXZlbnQKICAgIEBwYXJhbSB7T2JqZWN0fSBbdGFyZ2V0 XSBUaGUgInRoaXMiIGJpbmRpbmcgZm9yIHRoZSBjYWxsYmFjawogICAgQHBh cmFtIHtGdW5jdGlvbn0gbWV0aG9kIFRoZSBjYWxsYmFjayB0byBleGVjdXRl CiAgICBAcmV0dXJuIHRoaXMKICAqLwogIG9uZTogZnVuY3Rpb24obmFtZSwg dGFyZ2V0LCBtZXRob2QpIHsKICAgIGlmICghbWV0aG9kKSB7CiAgICAgIG1l dGhvZCA9IHRhcmdldDsKICAgICAgdGFyZ2V0ID0gbnVsbDsKICAgIH0KCiAg ICBFbWJlci5hZGRMaXN0ZW5lcih0aGlzLCBuYW1lLCB0YXJnZXQsIG1ldGhv ZCwgdHJ1ZSk7CiAgICByZXR1cm4gdGhpczsKICB9LAoKICAvKioKICAgIFRy aWdnZXJzIGEgbmFtZWQgZXZlbnQgZm9yIHRoZSBvYmplY3QuIEFueSBhZGRp dGlvbmFsIGFyZ3VtZW50cwogICAgd2lsbCBiZSBwYXNzZWQgYXMgcGFyYW1l dGVycyB0byB0aGUgZnVuY3Rpb25zIHRoYXQgYXJlIHN1YnNjcmliZWQgdG8g dGhlCiAgICBldmVudC4KCiAgICBgYGBqYXZhc2NyaXB0CiAgICBwZXJzb24u b24oJ2RpZEVhdCcsIGZ1bmN0aW9uKGZvb2QpIHsKICAgICAgY29uc29sZS5s b2coJ3BlcnNvbiBhdGUgc29tZSAnICsgZm9vZCk7CiAgICB9KTsKCiAgICBw ZXJzb24udHJpZ2dlcignZGlkRWF0JywgJ2Jyb2Njb2xpJyk7CgogICAgLy8g b3V0cHV0czogcGVyc29uIGF0ZSBzb21lIGJyb2Njb2xpCiAgICBgYGAKICAg IEBtZXRob2QgdHJpZ2dlcgogICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhl IG5hbWUgb2YgdGhlIGV2ZW50CiAgICBAcGFyYW0ge09iamVjdC4uLn0gYXJn cyBPcHRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyBvbgogICovCiAgdHJpZ2dl cjogZnVuY3Rpb24obmFtZSkgewogICAgdmFyIGFyZ3MgPSBbXSwgaSwgbDsK ICAgIGZvciAoaSA9IDEsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsg aSsrKSB7CiAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwogICAgfQog ICAgRW1iZXIuc2VuZEV2ZW50KHRoaXMsIG5hbWUsIGFyZ3MpOwogIH0sCgog IC8qKgogICAgQ2FuY2VscyBzdWJzY3JpcHRpb24gZm9yIGdpdmVuIG5hbWUs IHRhcmdldCwgYW5kIG1ldGhvZC4KCiAgICBAbWV0aG9kIG9mZgogICAgQHBh cmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50CiAgICBA cGFyYW0ge09iamVjdH0gdGFyZ2V0IFRoZSB0YXJnZXQgb2YgdGhlIHN1YnNj cmlwdGlvbgogICAgQHBhcmFtIHtGdW5jdGlvbn0gbWV0aG9kIFRoZSBmdW5j dGlvbiBvZiB0aGUgc3Vic2NyaXB0aW9uCiAgICBAcmV0dXJuIHRoaXMKICAq LwogIG9mZjogZnVuY3Rpb24obmFtZSwgdGFyZ2V0LCBtZXRob2QpIHsKICAg IEVtYmVyLnJlbW92ZUxpc3RlbmVyKHRoaXMsIG5hbWUsIHRhcmdldCwgbWV0 aG9kKTsKICAgIHJldHVybiB0aGlzOwogIH0sCgogIC8qKgogICAgQ2hlY2tz IHRvIHNlZSBpZiBvYmplY3QgaGFzIGFueSBzdWJzY3JpcHRpb25zIGZvciBu YW1lZCBldmVudC4KCiAgICBAbWV0aG9kIGhhcwogICAgQHBhcmFtIHtTdHJp bmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50CiAgICBAcmV0dXJuIHtC b29sZWFufSBkb2VzIHRoZSBvYmplY3QgaGF2ZSBhIHN1YnNjcmlwdGlvbiBm b3IgZXZlbnQKICAgKi8KICBoYXM6IGZ1bmN0aW9uKG5hbWUpIHsKICAgIHJl dHVybiBFbWJlci5oYXNMaXN0ZW5lcnModGhpcywgbmFtZSk7CiAgfQp9KTsK Cn0pKCk7CgoKCihmdW5jdGlvbigpIHsKdmFyIFJTVlAgPSByZXF1aXJlTW9k dWxlKCJyc3ZwIik7CgppZiAoRW1iZXIuRkVBVFVSRVNbJ2VtYmVyLXJ1bnRp bWUtdGVzdC1mcmllbmRseS1wcm9taXNlcyddKSB7CgogIHZhciBhc3luY1N0 YXJ0ID0gZnVuY3Rpb24oKSB7CiAgICBpZiAoRW1iZXIuVGVzdCAmJiBFbWJl ci5UZXN0LmFkYXB0ZXIpIHsKICAgICAgRW1iZXIuVGVzdC5hZGFwdGVyLmFz eW5jU3RhcnQoKTsKICAgIH0KICB9OwoKICB2YXIgYXN5bmNFbmQgPSBmdW5j dGlvbigpIHsKICAgIGlmIChFbWJlci5UZXN0ICYmIEVtYmVyLlRlc3QuYWRh cHRlcikgewogICAgICBFbWJlci5UZXN0LmFkYXB0ZXIuYXN5bmNFbmQoKTsK ICAgIH0KICB9OwoKICBSU1ZQLmNvbmZpZ3VyZSgnYXN5bmMnLCBmdW5jdGlv bihjYWxsYmFjaywgcHJvbWlzZSkgewogICAgdmFyIGFzeW5jID0gIUVtYmVy LnJ1bi5jdXJyZW50UnVuTG9vcDsKCiAgICBpZiAoRW1iZXIudGVzdGluZyAm JiBhc3luYykgeyBhc3luY1N0YXJ0KCk7IH0KCiAgICBFbWJlci5ydW4uYmFj a2J1cm5lci5zY2hlZHVsZSgnYWN0aW9ucycsIGZ1bmN0aW9uKCl7CiAgICAg IGlmIChFbWJlci50ZXN0aW5nICYmIGFzeW5jKSB7IGFzeW5jRW5kKCk7IH0K ICAgICAgY2FsbGJhY2socHJvbWlzZSk7CiAgICB9KTsKICB9KTsKfSBlbHNl IHsKICBSU1ZQLmNvbmZpZ3VyZSgnYXN5bmMnLCBmdW5jdGlvbihjYWxsYmFj aywgcHJvbWlzZSkgewogICAgRW1iZXIucnVuLmJhY2tidXJuZXIuc2NoZWR1 bGUoJ2FjdGlvbnMnLCBmdW5jdGlvbigpewogICAgICBjYWxsYmFjayhwcm9t aXNlKTsKICAgIH0pOwogIH0pOwp9CgpSU1ZQLlByb21pc2UucHJvdG90eXBl LmZhaWwgPSBmdW5jdGlvbihjYWxsYmFjaywgbGFiZWwpewogIEVtYmVyLmRl cHJlY2F0ZSgnUlNWUC5Qcm9taXNlLmZhaWwgaGFzIGJlZW4gcmVuYW1lZCBh cyBSU1ZQLlByb21pc2UuY2F0Y2gnKTsKICByZXR1cm4gdGhpc1snY2F0Y2gn XShjYWxsYmFjaywgbGFiZWwpOwp9OwoKLyoqCkBtb2R1bGUgZW1iZXIKQHN1 Ym1vZHVsZSBlbWJlci1ydW50aW1lCiovCgp2YXIgZ2V0ID0gRW1iZXIuZ2V0 OwoKLyoqCiAgQGNsYXNzIERlZmVycmVkCiAgQG5hbWVzcGFjZSBFbWJlcgog Ki8KRW1iZXIuRGVmZXJyZWRNaXhpbiA9IEVtYmVyLk1peGluLmNyZWF0ZSh7 CiAgLyoqCiAgICBBZGQgaGFuZGxlcnMgdG8gYmUgY2FsbGVkIHdoZW4gdGhl IERlZmVycmVkIG9iamVjdCBpcyByZXNvbHZlZCBvciByZWplY3RlZC4KCiAg ICBAbWV0aG9kIHRoZW4KICAgIEBwYXJhbSB7RnVuY3Rpb259IHJlc29sdmUg YSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBkb25lCiAg ICBAcGFyYW0ge0Z1bmN0aW9ufSByZWplY3QgIGEgY2FsbGJhY2sgZnVuY3Rp b24gdG8gYmUgY2FsbGVkIHdoZW4gZmFpbGVkCiAgKi8KICB0aGVuOiBmdW5j dGlvbihyZXNvbHZlLCByZWplY3QsIGxhYmVsKSB7CiAgICB2YXIgZGVmZXJy ZWQsIHByb21pc2UsIGVudGl0eTsKCiAgICBlbnRpdHkgPSB0aGlzOwogICAg ZGVmZXJyZWQgPSBnZXQodGhpcywgJ19kZWZlcnJlZCcpOwogICAgcHJvbWlz ZSA9IGRlZmVycmVkLnByb21pc2U7CgogICAgZnVuY3Rpb24gZnVsZmlsbG1l bnRIYW5kbGVyKGZ1bGZpbGxtZW50KSB7CiAgICAgIGlmIChmdWxmaWxsbWVu dCA9PT0gcHJvbWlzZSkgewogICAgICAgIHJldHVybiByZXNvbHZlKGVudGl0 eSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHJlc29sdmUoZnVs ZmlsbG1lbnQpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHByb21pc2Uu dGhlbihyZXNvbHZlICYmIGZ1bGZpbGxtZW50SGFuZGxlciwgcmVqZWN0LCBs YWJlbCk7CiAgfSwKCiAgLyoqCiAgICBSZXNvbHZlIGEgRGVmZXJyZWQgb2Jq ZWN0IGFuZCBjYWxsIGFueSBgZG9uZUNhbGxiYWNrc2Agd2l0aCB0aGUgZ2l2 ZW4gYXJncy4KCiAgICBAbWV0aG9kIHJlc29sdmUKICAqLwogIHJlc29sdmU6 IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICB2YXIgZGVmZXJyZWQsIHByb21pc2U7 CgogICAgZGVmZXJyZWQgPSBnZXQodGhpcywgJ19kZWZlcnJlZCcpOwogICAg cHJvbWlzZSA9IGRlZmVycmVkLnByb21pc2U7CgogICAgaWYgKHZhbHVlID09 PSB0aGlzKSB7CiAgICAgIGRlZmVycmVkLnJlc29sdmUocHJvbWlzZSk7CiAg ICB9IGVsc2UgewogICAgICBkZWZlcnJlZC5yZXNvbHZlKHZhbHVlKTsKICAg IH0KICB9LAoKICAvKioKICAgIFJlamVjdCBhIERlZmVycmVkIG9iamVjdCBh bmQgY2FsbCBhbnkgYGZhaWxDYWxsYmFja3NgIHdpdGggdGhlIGdpdmVuIGFy Z3MuCgogICAgQG1ldGhvZCByZWplY3QKICAqLwogIHJlamVjdDogZnVuY3Rp b24odmFsdWUpIHsKICAgIGdldCh0aGlzLCAnX2RlZmVycmVkJykucmVqZWN0 KHZhbHVlKTsKICB9LAoKICBfZGVmZXJyZWQ6IEVtYmVyLmNvbXB1dGVkKGZ1 bmN0aW9uKCkgewogICAgcmV0dXJuIFJTVlAuZGVmZXIoJ0VtYmVyOiBEZWZl cnJlZE1peGluIC0gJyArIHRoaXMpOwogIH0pCn0pOwoKCn0pKCk7CgoKCihm dW5jdGlvbigpIHsKLyoqCkBtb2R1bGUgZW1iZXIKQHN1Ym1vZHVsZSBlbWJl ci1ydW50aW1lCiovCgp2YXIgZ2V0ID0gRW1iZXIuZ2V0LCB0eXBlT2YgPSBF bWJlci50eXBlT2Y7CgovKioKICBUaGUgYEVtYmVyLkFjdGlvbkhhbmRsZXJg IG1peGluIGltcGxlbWVudHMgc3VwcG9ydCBmb3IgbW92aW5nIGFuIGBhY3Rp b25zYAogIHByb3BlcnR5IHRvIGFuIGBfYWN0aW9uc2AgcHJvcGVydHkgYXQg ZXh0ZW5kIHRpbWUsIGFuZCBhZGRpbmcgYF9hY3Rpb25zYAogIHRvIHRoZSBv YmplY3QncyBtZXJnZWRQcm9wZXJ0aWVzIGxpc3QuCgogIGBFbWJlci5BY3Rp b25IYW5kbGVyYCBpcyB1c2VkIGludGVybmFsbHkgYnkgRW1iZXIgaW4gIGBF bWJlci5WaWV3YCwKICBgRW1iZXIuQ29udHJvbGxlcmAsIGFuZCBgRW1iZXIu Um91dGVgLgoKICBAY2xhc3MgQWN0aW9uSGFuZGxlcgogIEBuYW1lc3BhY2Ug RW1iZXIKKi8KRW1iZXIuQWN0aW9uSGFuZGxlciA9IEVtYmVyLk1peGluLmNy ZWF0ZSh7CiAgbWVyZ2VkUHJvcGVydGllczogWydfYWN0aW9ucyddLAoKICAv KioKICAgIFRoZSBjb2xsZWN0aW9uIG9mIGZ1bmN0aW9ucywga2V5ZWQgYnkg bmFtZSwgYXZhaWxhYmxlIG9uIHRoaXMKICAgIGBBY3Rpb25IYW5kbGVyYCBh cyBhY3Rpb24gdGFyZ2V0cy4KCiAgICBUaGVzZSBmdW5jdGlvbnMgd2lsbCBi ZSBpbnZva2VkIHdoZW4gYSBtYXRjaGluZyBge3thY3Rpb259fWAgaXMgdHJp Z2dlcmVkCiAgICBmcm9tIHdpdGhpbiBhIHRlbXBsYXRlIGFuZCB0aGUgYXBw bGljYXRpb24ncyBjdXJyZW50IHJvdXRlIGlzIHRoaXMgcm91dGUuCgogICAg QWN0aW9ucyBjYW4gYWxzbyBiZSBpbnZva2VkIGZyb20gb3RoZXIgcGFydHMg b2YgeW91ciBhcHBsaWNhdGlvbgogICAgdmlhIGBBY3Rpb25IYW5kbGVyI3Nl bmRgLgoKICAgIFRoZSBgYWN0aW9uc2AgaGFzaCB3aWxsIGluaGVyaXQgYWN0 aW9uIGhhbmRsZXJzIGZyb20KICAgIHRoZSBgYWN0aW9uc2AgaGFzaCBkZWZp bmVkIG9uIGV4dGVuZGVkIHBhcmVudCBjbGFzc2VzCiAgICBvciBtaXhpbnMg cmF0aGVyIHRoYW4ganVzdCByZXBsYWNlIHRoZSBlbnRpcmUgaGFzaCwgZS5n LjoKCiAgICBgYGBqcwogICAgQXBwLkNhbkRpc3BsYXlCYW5uZXIgPSBFbWJl ci5NaXhpbi5jcmVhdGUoewogICAgICBhY3Rpb25zOiB7CiAgICAgICAgZGlz cGxheUJhbm5lcjogZnVuY3Rpb24obXNnKSB7CiAgICAgICAgICAvLyAuLi4K ICAgICAgICB9CiAgICAgIH0KICAgIH0pOwoKICAgIEFwcC5XZWxjb21lUm91 dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoQXBwLkNhbkRpc3BsYXlCYW5uZXIs IHsKICAgICAgYWN0aW9uczogewogICAgICAgIHBsYXlNdXNpYzogZnVuY3Rp b24oKSB7CiAgICAgICAgICAvLyAuLi4KICAgICAgICB9CiAgICAgIH0KICAg IH0pOwoKICAgIC8vIGBXZWxjb21lUm91dGVgLCB3aGVuIGFjdGl2ZSwgd2ls bCBiZSBhYmxlIHRvIHJlc3BvbmQKICAgIC8vIHRvIGJvdGggYWN0aW9ucywg c2luY2UgdGhlIGFjdGlvbnMgaGFzaCBpcyBtZXJnZWQgcmF0aGVyCiAgICAv LyB0aGVuIHJlcGxhY2VkIHdoZW4gZXh0ZW5kaW5nIG1peGlucyAvIHBhcmVu dCBjbGFzc2VzLgogICAgdGhpcy5zZW5kKCdkaXNwbGF5QmFubmVyJyk7CiAg ICB0aGlzLnNlbmQoJ3BsYXlNdXNpYycpOwogICAgYGBgCgogICAgV2l0aGlu IGEgQ29udHJvbGxlciwgUm91dGUsIFZpZXcgb3IgQ29tcG9uZW50J3MgYWN0 aW9uIGhhbmRsZXIsCiAgICB0aGUgdmFsdWUgb2YgdGhlIGB0aGlzYCBjb250 ZXh0IGlzIHRoZSBDb250cm9sbGVyLCBSb3V0ZSwgVmlldyBvcgogICAgQ29t cG9uZW50IG9iamVjdDoKCiAgICBgYGBqcwogICAgQXBwLlNvbmdSb3V0ZSA9 IEVtYmVyLlJvdXRlLmV4dGVuZCh7CiAgICAgIGFjdGlvbnM6IHsKICAgICAg ICBteUFjdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICB0aGlzLmNvbnRy b2xsZXJGb3IoInNvbmciKTsKICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRv KCJvdGhlci5yb3V0ZSIpOwogICAgICAgICAgLi4uCiAgICAgICAgfQogICAg ICB9CiAgICB9KTsKICAgIGBgYAoKICAgIEl0IGlzIGFsc28gcG9zc2libGUg dG8gY2FsbCBgdGhpcy5fc3VwZXIoKWAgZnJvbSB3aXRoaW4gYW4KICAgIGFj dGlvbiBoYW5kbGVyIGlmIGl0IG92ZXJyaWRlcyBhIGhhbmRsZXIgZGVmaW5l ZCBvbiBhIHBhcmVudAogICAgY2xhc3Mgb3IgbWl4aW46CgogICAgVGFrZSBm b3IgZXhhbXBsZSB0aGUgZm9sbG93aW5nIHJvdXRlczoKCiAgICBgYGBqcwog ICAgQXBwLkRlYnVnUm91dGUgPSBFbWJlci5NaXhpbi5jcmVhdGUoewogICAg ICBhY3Rpb25zOiB7CiAgICAgICAgZGVidWdSb3V0ZUluZm9ybWF0aW9uOiBm dW5jdGlvbigpIHsKICAgICAgICAgIGNvbnNvbGUuZGVidWcoInRyb2xvbG8i KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwoKICAgIEFwcC5Bbm5veWlu Z0RlYnVnUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoQXBwLkRlYnVnUm91 dGUsIHsKICAgICAgYWN0aW9uczogewogICAgICAgIGRlYnVnUm91dGVJbmZv cm1hdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAvLyBhbHNvIGNhbGwg dGhlIGRlYnVnUm91dGVJbmZvcm1hdGlvbiBvZiBtaXhlZCBpbiBBcHAuRGVi dWdSb3V0ZQogICAgICAgICAgdGhpcy5fc3VwZXIoKTsKCiAgICAgICAgICAv LyBzaG93IGFkZGl0aW9uYWwgYW5ub3lhbmNlCiAgICAgICAgICB3aW5kb3cu YWxlcnQoLi4uKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogICAgYGBg CgogICAgIyMgQnViYmxpbmcKCiAgICBCeSBkZWZhdWx0LCBhbiBhY3Rpb24g d2lsbCBzdG9wIGJ1YmJsaW5nIG9uY2UgYSBoYW5kbGVyIGRlZmluZWQKICAg IG9uIHRoZSBgYWN0aW9uc2AgaGFzaCBoYW5kbGVzIGl0LiBUbyBjb250aW51 ZSBidWJibGluZyB0aGUgYWN0aW9uLAogICAgeW91IG11c3QgcmV0dXJuIGB0 cnVlYCBmcm9tIHRoZSBoYW5kbGVyOgoKICAgIGBgYGpzCiAgICBBcHAuUm91 dGVyLm1hcChmdW5jdGlvbigpIHsKICAgICAgdGhpcy5yZXNvdXJjZSgiYWxi dW0iLCBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnJvdXRlKCJzb25nIik7 CiAgICAgIH0pOwogICAgfSk7CgogICAgQXBwLkFsYnVtUm91dGUgPSBFbWJl ci5Sb3V0ZS5leHRlbmQoewogICAgICBhY3Rpb25zOiB7CiAgICAgICAgc3Rh cnRQbGF5aW5nOiBmdW5jdGlvbigpIHsKICAgICAgICB9CiAgICAgIH0KICAg IH0pOwoKICAgIEFwcC5BbGJ1bVNvbmdSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4 dGVuZCh7CiAgICAgIGFjdGlvbnM6IHsKICAgICAgICBzdGFydFBsYXlpbmc6 IGZ1bmN0aW9uKCkgewogICAgICAgICAgLy8gLi4uCgogICAgICAgICAgaWYg KGFjdGlvblNob3VsZEFsc29CZVRyaWdnZXJlZE9uUGFyZW50Um91dGUpIHsK ICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAg fQogICAgICB9CiAgICB9KTsKICAgIGBgYAoKICAgIEBwcm9wZXJ0eSBhY3Rp b25zCiAgICBAdHlwZSBIYXNoCiAgICBAZGVmYXVsdCBudWxsCiAgKi8KCiAg LyoqCiAgICBNb3ZlcyBgYWN0aW9uc2AgdG8gYF9hY3Rpb25zYCBhdCBleHRl bmQgdGltZS4gTm90ZSB0aGF0IHRoaXMgY3VycmVudGx5CiAgICBtb2RpZmll cyB0aGUgbWl4aW4gdGhlbXNlbHZlcywgd2hpY2ggaXMgdGVjaG5pY2FsbHkg ZHViaW91cyBidXQKICAgIGlzIHByYWN0aWNhbGx5IG9mIGxpdHRsZSBjb25z ZXF1ZW5jZS4gVGhpcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuCgogICAg QHByaXZhdGUKICAgIEBtZXRob2Qgd2lsbE1lcmdlTWl4aW4KICAqLwogIHdp bGxNZXJnZU1peGluOiBmdW5jdGlvbihwcm9wcykgewogICAgdmFyIGhhc2hO YW1lOwoKICAgIGlmICghcHJvcHMuX2FjdGlvbnMpIHsKICAgICAgRW1iZXIu YXNzZXJ0KCInYWN0aW9ucycgc2hvdWxkIG5vdCBiZSBhIGZ1bmN0aW9uIiwg dHlwZW9mKHByb3BzLmFjdGlvbnMpICE9PSAnZnVuY3Rpb24nKTsKCiAgICAg IGlmICh0eXBlT2YocHJvcHMuYWN0aW9ucykgPT09ICdvYmplY3QnKSB7CiAg ICAgICAgaGFzaE5hbWUgPSAnYWN0aW9ucyc7CiAgICAgIH0gZWxzZSBpZiAo dHlwZU9mKHByb3BzLmV2ZW50cykgPT09ICdvYmplY3QnKSB7CiAgICAgICAg RW1iZXIuZGVwcmVjYXRlKCdBY3Rpb24gaGFuZGxlcnMgY29udGFpbmVkIGlu IGFuIGBldmVudHNgIG9iamVjdCBhcmUgZGVwcmVjYXRlZCBpbiBmYXZvciBv ZiBwdXR0aW5nIHRoZW0gaW4gYW4gYGFjdGlvbnNgIG9iamVjdCcsIGZhbHNl KTsKICAgICAgICBoYXNoTmFtZSA9ICdldmVudHMnOwogICAgICB9CgogICAg ICBpZiAoaGFzaE5hbWUpIHsKICAgICAgICBwcm9wcy5fYWN0aW9ucyA9IEVt YmVyLm1lcmdlKHByb3BzLl9hY3Rpb25zIHx8IHt9LCBwcm9wc1toYXNoTmFt ZV0pOwogICAgICB9CgogICAgICBkZWxldGUgcHJvcHNbaGFzaE5hbWVdOwog ICAgfQogIH0sCgogIC8qKgogICAgVHJpZ2dlcnMgYSBuYW1lZCBhY3Rpb24g b24gdGhlIGBBY3Rpb25IYW5kbGVyYC4gQW55IHBhcmFtZXRlcnMKICAgIHN1 cHBsaWVkIGFmdGVyIHRoZSBgYWN0aW9uTmFtZWAgc3RyaW5nIHdpbGwgYmUg cGFzc2VkIGFzIGFyZ3VtZW50cwogICAgdG8gdGhlIGFjdGlvbiB0YXJnZXQg ZnVuY3Rpb24uCgogICAgSWYgdGhlIGBBY3Rpb25IYW5kbGVyYCBoYXMgaXRz IGB0YXJnZXRgIHByb3BlcnR5IHNldCwgYWN0aW9ucyBtYXkKICAgIGJ1YmJs ZSB0byB0aGUgYHRhcmdldGAuIEJ1YmJsaW5nIGhhcHBlbnMgd2hlbiBhbiBg YWN0aW9uTmFtZWAgY2FuCiAgICBub3QgYmUgZm91bmQgaW4gdGhlIGBBY3Rp b25IYW5kbGVyYCdzIGBhY3Rpb25zYCBoYXNoIG9yIGlmIHRoZQogICAgYWN0 aW9uIHRhcmdldCBmdW5jdGlvbiByZXR1cm5zIGB0cnVlYC4KCiAgICBFeGFt cGxlCgogICAgYGBganMKICAgIEFwcC5XZWxjb21lUm91dGUgPSBFbWJlci5S b3V0ZS5leHRlbmQoewogICAgICBhY3Rpb25zOiB7CiAgICAgICAgcGxheVRo ZW1lOiBmdW5jdGlvbigpIHsKICAgICAgICAgICB0aGlzLnNlbmQoJ3BsYXlN dXNpYycsICd0aGVtZS5tcDMnKTsKICAgICAgICB9LAogICAgICAgIHBsYXlN dXNpYzogZnVuY3Rpb24odHJhY2spIHsKICAgICAgICAgIC8vIC4uLgogICAg ICAgIH0KICAgICAgfQogICAgfSk7CiAgICBgYGAKCiAgICBAbWV0aG9kIHNl bmQKICAgIEBwYXJhbSB7U3RyaW5nfSBhY3Rpb25OYW1lIFRoZSBhY3Rpb24g dG8gdHJpZ2dlcgogICAgQHBhcmFtIHsqfSBjb250ZXh0IGEgY29udGV4dCB0 byBzZW5kIHdpdGggdGhlIGFjdGlvbgogICovCiAgc2VuZDogZnVuY3Rpb24o YWN0aW9uTmFtZSkgewogICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFy Z3VtZW50cywgMSksIHRhcmdldDsKCiAgICBpZiAodGhpcy5fYWN0aW9ucyAm JiB0aGlzLl9hY3Rpb25zW2FjdGlvbk5hbWVdKSB7CiAgICAgIGlmICh0aGlz Ll9hY3Rpb25zW2FjdGlvbk5hbWVdLmFwcGx5KHRoaXMsIGFyZ3MpID09PSB0 cnVlKSB7CiAgICAgICAgLy8gaGFuZGxlciByZXR1cm5lZCB0cnVlLCBzbyB0 aGlzIGFjdGlvbiB3aWxsIGJ1YmJsZQogICAgICB9IGVsc2UgewogICAgICAg IHJldHVybjsKICAgICAgfQogICAgfSBlbHNlIGlmICghRW1iZXIuRkVBVFVS RVMuaXNFbmFibGVkKCdlbWJlci1yb3V0aW5nLWRyb3AtZGVwcmVjYXRlZC1h Y3Rpb24tc3R5bGUnKSAmJiB0aGlzLmRlcHJlY2F0ZWRTZW5kICYmIHRoaXMu ZGVwcmVjYXRlZFNlbmRIYW5kbGVzICYmIHRoaXMuZGVwcmVjYXRlZFNlbmRI YW5kbGVzKGFjdGlvbk5hbWUpKSB7CiAgICAgIEVtYmVyLndhcm4oIlRoZSBj dXJyZW50IGRlZmF1bHQgaXMgZGVwcmVjYXRlZCBidXQgd2lsbCBwcmVmZXIg dG8gaGFuZGxlIGFjdGlvbnMgZGlyZWN0bHkgb24gdGhlIGNvbnRyb2xsZXIg aW5zdGVhZCBvZiBhIHNpbWlsYXJseSBuYW1lZCBhY3Rpb24gaW4gdGhlIGFj dGlvbnMgaGFzaC4gVG8gdHVybiBvZmYgdGhpcyBkZXByZWNhdGVkIGZlYXR1 cmUgc2V0OiBFbWJlci5GRUFUVVJFU1snZW1iZXItcm91dGluZy1kcm9wLWRl cHJlY2F0ZWQtYWN0aW9uLXN0eWxlJ10gPSB0cnVlIik7CiAgICAgIGlmICh0 aGlzLmRlcHJlY2F0ZWRTZW5kLmFwcGx5KHRoaXMsIFtdLnNsaWNlLmNhbGwo YXJndW1lbnRzKSkgPT09IHRydWUpIHsKICAgICAgICAvLyBoYW5kbGVyIHJl dHVybiB0cnVlLCBzbyB0aGlzIGFjdGlvbiB3aWxsIGJ1YmJsZQogICAgICB9 IGVsc2UgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQoKICAgIGlm ICh0YXJnZXQgPSBnZXQodGhpcywgJ3RhcmdldCcpKSB7CiAgICAgIEVtYmVy LmFzc2VydCgiVGhlIGB0YXJnZXRgIGZvciAiICsgdGhpcyArICIgKCIgKyB0 YXJnZXQgKyAiKSBkb2VzIG5vdCBoYXZlIGEgYHNlbmRgIG1ldGhvZCIsIHR5 cGVvZiB0YXJnZXQuc2VuZCA9PT0gJ2Z1bmN0aW9uJyk7CiAgICAgIHRhcmdl dC5zZW5kLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH0KICB9Cgp9 KTsKCn0pKCk7CgoKCihmdW5jdGlvbigpIHsKdmFyIHNldCA9IEVtYmVyLnNl dCwgZ2V0ID0gRW1iZXIuZ2V0LAogICAgbm90ID0gRW1iZXIuY29tcHV0ZWQu bm90LAogICAgb3IgPSBFbWJlci5jb21wdXRlZC5vcjsKCi8qKgogIEBtb2R1 bGUgZW1iZXIKICBAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKICovCgpmdW5j dGlvbiB0YXAocHJveHksIHByb21pc2UpIHsKICByZXR1cm4gcHJvbWlzZS50 aGVuKGZ1bmN0aW9uKHZhbHVlKSB7CiAgICBzZXQocHJveHksICdpc0Z1bGZp bGxlZCcsIHRydWUpOwogICAgc2V0KHByb3h5LCAnY29udGVudCcsIHZhbHVl KTsKICAgIHJldHVybiB2YWx1ZTsKICB9LCBmdW5jdGlvbihyZWFzb24pIHsK ICAgIHNldChwcm94eSwgJ2lzUmVqZWN0ZWQnLCB0cnVlKTsKICAgIHNldChw cm94eSwgJ3JlYXNvbicsIHJlYXNvbik7CiAgICB0aHJvdyByZWFzb247CiAg fSwgIkVtYmVyOiBQcm9taXNlUHJveHkiKTsKfQoKLyoqCiAgQSBsb3cgbGV2 ZWwgbWl4aW4gbWFraW5nIE9iamVjdFByb3h5LCBPYmplY3RDb250cm9sbGVy IG9yIEFycmF5Q29udHJvbGxlcidzIHByb21pc2UgYXdhcmUuCgogIGBgYGph dmFzY3JpcHQKICB2YXIgT2JqZWN0UHJvbWlzZUNvbnRyb2xsZXIgPSBFbWJl ci5PYmplY3RDb250cm9sbGVyLmV4dGVuZChFbWJlci5Qcm9taXNlUHJveHlN aXhpbik7CgogIHZhciBjb250cm9sbGVyID0gT2JqZWN0UHJvbWlzZUNvbnRy b2xsZXIuY3JlYXRlKHsKICAgIHByb21pc2U6ICQuZ2V0SlNPTignL3NvbWUv cmVtb3RlL2RhdGEuanNvbicpCiAgfSk7CgogIGNvbnRyb2xsZXIudGhlbihm dW5jdGlvbihqc29uKXsKICAgICAvLyB0aGUganNvbgogIH0sIGZ1bmN0aW9u KHJlYXNvbikgewogICAgIC8vIHRoZSByZWFzb24gd2h5IHlvdSBoYXZlIG5v IGpzb24KICB9KTsKICBgYGAKCiAgdGhlIGNvbnRyb2xsZXIgaGFzIGJpbmRh YmxlIGF0dHJpYnV0ZXMgd2hpY2gKICB0cmFjayB0aGUgcHJvbWlzZXMgbGlm ZSBjeWNsZQoKICBgYGBqYXZhc2NyaXB0CiAgY29udHJvbGxlci5nZXQoJ2lz UGVuZGluZycpICAgLy89PiB0cnVlCiAgY29udHJvbGxlci5nZXQoJ2lzU2V0 dGxlZCcpICAvLz0+IGZhbHNlCiAgY29udHJvbGxlci5nZXQoJ2lzUmVqZWN0 ZWQnKSAgLy89PiBmYWxzZQogIGNvbnRyb2xsZXIuZ2V0KCdpc0Z1bGZpbGxl ZCcpIC8vPT4gZmFsc2UKICBgYGAKCiAgV2hlbiB0aGUgdGhlICQuZ2V0SlNP TiBjb21wbGV0ZXMsIGFuZCB0aGUgcHJvbWlzZSBpcyBmdWxmaWxsZWQKICB3 aXRoIGpzb24sIHRoZSBsaWZlIGN5Y2xlIGF0dHJpYnV0ZXMgd2lsbCB1cGRh dGUgYWNjb3JkaW5nbHkuCgogIGBgYGphdmFzY3JpcHQKICBjb250cm9sbGVy LmdldCgnaXNQZW5kaW5nJykgICAvLz0+IGZhbHNlCiAgY29udHJvbGxlci5n ZXQoJ2lzU2V0dGxlZCcpICAgLy89PiB0cnVlCiAgY29udHJvbGxlci5nZXQo J2lzUmVqZWN0ZWQnKSAgLy89PiBmYWxzZQogIGNvbnRyb2xsZXIuZ2V0KCdp c0Z1bGZpbGxlZCcpIC8vPT4gdHJ1ZQogIGBgYAoKICBBcyB0aGUgY29udHJv bGxlciBpcyBhbiBPYmplY3RDb250cm9sbGVyLCBhbmQgdGhlIGpzb24gbm93 IGl0cyBjb250ZW50LAogIGFsbCB0aGUganNvbiBwcm9wZXJ0aWVzIHdpbGwg YmUgYXZhaWxhYmxlIGRpcmVjdGx5IGZyb20gdGhlIGNvbnRyb2xsZXIuCgog IGBgYGphdmFzY3JpcHQKICAvLyBBc3N1bWluZyB0aGUgZm9sbG93aW5nIGpz b246CiAgewogICAgZmlyc3ROYW1lOiAnU3RlZmFuJywKICAgIGxhc3ROYW1l OiAnUGVubmVyJwogIH0KCiAgLy8gYm90aCBwcm9wZXJ0aWVzIHdpbGwgYWNj ZXNzaWJsZSBvbiB0aGUgY29udHJvbGxlcgogIGNvbnRyb2xsZXIuZ2V0KCdm aXJzdE5hbWUnKSAvLz0+ICdTdGVmYW4nCiAgY29udHJvbGxlci5nZXQoJ2xh c3ROYW1lJykgIC8vPT4gJ1Blbm5lcicKICBgYGAKCiAgSWYgdGhlIGNvbnRy b2xsZXIgaXMgYmFja2luZyBhIHRlbXBsYXRlLCB0aGUgYXR0cmlidXRlcyBh cmUKICBiaW5kYWJsZSBmcm9tIHdpdGhpbiB0aGF0IHRlbXBsYXRlCgogIGBg YGhhbmRsZWJhcnMKICB7eyNpZiBpc1BlbmRpbmd9fQogICAgbG9hZGluZy4u LgogIHt7ZWxzZX19CiAgICBmaXJzdE5hbWU6IHt7Zmlyc3ROYW1lfX0KICAg IGxhc3ROYW1lOiB7e2xhc3ROYW1lfX0KICB7ey9pZn19CiAgYGBgCiAgQGNs YXNzIEVtYmVyLlByb21pc2VQcm94eU1peGluCiovCkVtYmVyLlByb21pc2VQ cm94eU1peGluID0gRW1iZXIuTWl4aW4uY3JlYXRlKHsKICAvKioKICAgIElm IHRoZSBwcm94aWVkIHByb21pc2UgaXMgcmVqZWN0ZWQgdGhpcyB3aWxsIGNv bnRhaW4gdGhlIHJlYXNvbgogICAgcHJvdmlkZWQuCgogICAgQHByb3BlcnR5 IHJlYXNvbgogICAgQGRlZmF1bHQgbnVsbAogICovCiAgcmVhc29uOiAgICBu dWxsLAoKICAvKioKICAgIE9uY2UgdGhlIHByb3hpZWQgcHJvbWlzZSBoYXMg c2V0dGxlZCB0aGlzIHdpbGwgYmVjb21lIGBmYWxzZWAuCgogICAgQHByb3Bl cnR5IGlzUGVuZGluZwogICAgQGRlZmF1bHQgdHJ1ZQogICovCiAgaXNQZW5k aW5nOiAgbm90KCdpc1NldHRsZWQnKS5yZWFkT25seSgpLAoKICAvKioKICAg IE9uY2UgdGhlIHByb3hpZWQgcHJvbWlzZSBoYXMgc2V0dGxlZCB0aGlzIHdp bGwgYmVjb21lIGB0cnVlYC4KCiAgICBAcHJvcGVydHkgaXNTZXR0bGVkCiAg ICBAZGVmYXVsdCBmYWxzZQogICovCiAgaXNTZXR0bGVkOiAgb3IoJ2lzUmVq ZWN0ZWQnLCAnaXNGdWxmaWxsZWQnKS5yZWFkT25seSgpLAoKICAvKioKICAg IFdpbGwgYmVjb21lIGB0cnVlYCBpZiB0aGUgcHJveGllZCBwcm9taXNlIGlz IHJlamVjdGVkLgoKICAgIEBwcm9wZXJ0eSBpc1JlamVjdGVkCiAgICBAZGVm YXVsdCBmYWxzZQogICovCiAgaXNSZWplY3RlZDogIGZhbHNlLAoKICAvKioK ICAgIFdpbGwgYmVjb21lIGB0cnVlYCBpZiB0aGUgcHJveGllZCBwcm9taXNl IGlzIGZ1bGZpbGxlZC4KCiAgICBAcHJvcGVydHkgaXNGdWxsZmlsbGVkCiAg ICBAZGVmYXVsdCBmYWxzZQogICovCiAgaXNGdWxmaWxsZWQ6IGZhbHNlLAoK ICAvKioKICAgIFRoZSBwcm9taXNlIHdob3NlIGZ1bGZpbGxtZW50IHZhbHVl IGlzIGJlaW5nIHByb3hpZWQgYnkgdGhpcyBvYmplY3QuCgogICAgVGhpcyBw cm9wZXJ0eSBtdXN0IGJlIHNwZWNpZmllZCB1cG9uIGNyZWF0aW9uLCBhbmQg c2hvdWxkIG5vdCBiZQogICAgY2hhbmdlZCBvbmNlIGNyZWF0ZWQuCgogICAg RXhhbXBsZToKCiAgICBgYGBqYXZhc2NyaXB0CiAgICBFbWJlci5PYmplY3RD b250cm9sbGVyLmV4dGVuZChFbWJlci5Qcm9taXNlUHJveHlNaXhpbikuY3Jl YXRlKHsKICAgICAgcHJvbWlzZTogPHRoZW5hYmxlPgogICAgfSk7CiAgICBg YGAKCiAgICBAcHJvcGVydHkgcHJvbWlzZQogICovCiAgcHJvbWlzZTogRW1i ZXIuY29tcHV0ZWQoZnVuY3Rpb24oa2V5LCBwcm9taXNlKSB7CiAgICBpZiAo YXJndW1lbnRzLmxlbmd0aCA9PT0gMikgewogICAgICByZXR1cm4gdGFwKHRo aXMsIHByb21pc2UpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEVt YmVyLkVycm9yKCJQcm9taXNlUHJveHkncyBwcm9taXNlIG11c3QgYmUgc2V0 Iik7CiAgICB9CiAgfSksCgogIC8qKgogICAgQW4gYWxpYXMgdG8gdGhlIHBy b3hpZWQgcHJvbWlzZSdzIGB0aGVuYC4KCiAgICBTZWUgUlNWUC5Qcm9taXNl LnRoZW4uCgogICAgQG1ldGhvZCB0aGVuCiAgICBAcGFyYW0ge0Z1bmN0aW9u fSBjYWxsYmFjawogICAgQHJldHVybiB7UlNWUC5Qcm9taXNlfQogICovCiAg dGhlbjogcHJvbWlzZUFsaWFzKCd0aGVuJyksCgogIC8qKgogICAgQW4gYWxp YXMgdG8gdGhlIHByb3hpZWQgcHJvbWlzZSdzIGBjYXRjaGAuCgogICAgU2Vl IFJTVlAuUHJvbWlzZS5jYXRjaC4KCiAgICBAbWV0aG9kIGNhdGNoCiAgICBA cGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjawogICAgQHJldHVybiB7UlNWUC5Q cm9taXNlfQogICovCiAgJ2NhdGNoJzogcHJvbWlzZUFsaWFzKCdjYXRjaCcp LAoKICAvKioKICAgIEFuIGFsaWFzIHRvIHRoZSBwcm94aWVkIHByb21pc2Un cyBgZmluYWxseWAuCgogICAgU2VlIFJTVlAuUHJvbWlzZS5maW5hbGx5LgoK ICAgIEBtZXRob2QgZmluYWxseQogICAgQHBhcmFtIHtGdW5jdGlvbn0gY2Fs bGJhY2sKICAgIEByZXR1cm4ge1JTVlAuUHJvbWlzZX0KICAqLwogICdmaW5h bGx5JzogcHJvbWlzZUFsaWFzKCdmaW5hbGx5JykKCn0pOwoKZnVuY3Rpb24g cHJvbWlzZUFsaWFzKG5hbWUpIHsKICByZXR1cm4gZnVuY3Rpb24gKCkgewog ICAgdmFyIHByb21pc2UgPSBnZXQodGhpcywgJ3Byb21pc2UnKTsKICAgIHJl dHVybiBwcm9taXNlW25hbWVdLmFwcGx5KHByb21pc2UsIGFyZ3VtZW50cyk7 CiAgfTsKfQoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewoKfSkoKTsKCgoKKGZ1 bmN0aW9uKCkgewp2YXIgZ2V0ID0gRW1iZXIuZ2V0LAogICAgZm9yRWFjaCA9 IEVtYmVyLkVudW1lcmFibGVVdGlscy5mb3JFYWNoLAogICAgUkVUQUlOID0g J3InLAogICAgSU5TRVJUID0gJ2knLAogICAgREVMRVRFID0gJ2QnOwoKLyoq CiAgQW4gYEVtYmVyLlRyYWNrZWRBcnJheWAgdHJhY2tzIGFycmF5IG9wZXJh dGlvbnMuICBJdCdzIHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvCiAgbGF6aWx5 IGNvbXB1dGUgdGhlIGluZGV4ZXMgb2YgaXRlbXMgaW4gYW4gYXJyYXkgYWZ0 ZXIgdGhleSd2ZSBiZWVuIHNoaWZ0ZWQgYnkKICBzdWJzZXF1ZW50IG9wZXJh dGlvbnMuCgogIEBjbGFzcyBUcmFja2VkQXJyYXkKICBAbmFtZXNwYWNlIEVt YmVyCiAgQHBhcmFtIHthcnJheX0gW2l0ZW1zPVtdXSBUaGUgYXJyYXkgdG8g YmUgdHJhY2tlZC4gIFRoaXMgaXMgdXNlZCBqdXN0IHRvIGdldAogIHRoZSBp bml0aWFsIGl0ZW1zIGZvciB0aGUgc3RhcnRpbmcgc3RhdGUgb2YgcmV0YWlu Om4uCiovCkVtYmVyLlRyYWNrZWRBcnJheSA9IGZ1bmN0aW9uIChpdGVtcykg ewogIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMSkgeyBpdGVtcyA9IFtdOyB9 CgogIHZhciBsZW5ndGggPSBnZXQoaXRlbXMsICdsZW5ndGgnKTsKCiAgaWYg KGxlbmd0aCkgewogICAgdGhpcy5fb3BlcmF0aW9ucyA9IFtuZXcgQXJyYXlP cGVyYXRpb24oUkVUQUlOLCBsZW5ndGgsIGl0ZW1zKV07CiAgfSBlbHNlIHsK ICAgIHRoaXMuX29wZXJhdGlvbnMgPSBbXTsKICB9Cn07CgpFbWJlci5UcmFj a2VkQXJyYXkuUkVUQUlOID0gUkVUQUlOOwpFbWJlci5UcmFja2VkQXJyYXku SU5TRVJUID0gSU5TRVJUOwpFbWJlci5UcmFja2VkQXJyYXkuREVMRVRFID0g REVMRVRFOwoKRW1iZXIuVHJhY2tlZEFycmF5LnByb3RvdHlwZSA9IHsKCiAg LyoqCiAgICBUcmFjayB0aGF0IGBuZXdJdGVtc2Agd2VyZSBhZGRlZCB0byB0 aGUgdHJhY2tlZCBhcnJheSBhdCBgaW5kZXhgLgoKICAgIEBtZXRob2QgYWRk SXRlbXMKICAgIEBwYXJhbSBpbmRleAogICAgQHBhcmFtIG5ld0l0ZW1zCiAg Ki8KICBhZGRJdGVtczogZnVuY3Rpb24gKGluZGV4LCBuZXdJdGVtcykgewog ICAgdmFyIGNvdW50ID0gZ2V0KG5ld0l0ZW1zLCAnbGVuZ3RoJyk7CiAgICBp ZiAoY291bnQgPCAxKSB7IHJldHVybjsgfQoKICAgIHZhciBtYXRjaCA9IHRo aXMuX2ZpbmRBcnJheU9wZXJhdGlvbihpbmRleCksCiAgICAgICAgYXJyYXlP cGVyYXRpb24gPSBtYXRjaC5vcGVyYXRpb24sCiAgICAgICAgYXJyYXlPcGVy YXRpb25JbmRleCA9IG1hdGNoLmluZGV4LAogICAgICAgIGFycmF5T3BlcmF0 aW9uUmFuZ2VTdGFydCA9IG1hdGNoLnJhbmdlU3RhcnQsCiAgICAgICAgY29t cG9zZUluZGV4LAogICAgICAgIHNwbGl0SW5kZXgsCiAgICAgICAgc3BsaXRJ dGVtcywKICAgICAgICBzcGxpdEFycmF5T3BlcmF0aW9uLAogICAgICAgIG5l d0FycmF5T3BlcmF0aW9uOwoKICAgIG5ld0FycmF5T3BlcmF0aW9uID0gbmV3 IEFycmF5T3BlcmF0aW9uKElOU0VSVCwgY291bnQsIG5ld0l0ZW1zKTsKCiAg ICBpZiAoYXJyYXlPcGVyYXRpb24pIHsKICAgICAgaWYgKCFtYXRjaC5zcGxp dCkgewogICAgICAgIC8vIGluc2VydCBsZWZ0IG9mIGFycmF5T3BlcmF0aW9u CiAgICAgICAgdGhpcy5fb3BlcmF0aW9ucy5zcGxpY2UoYXJyYXlPcGVyYXRp b25JbmRleCwgMCwgbmV3QXJyYXlPcGVyYXRpb24pOwogICAgICAgIGNvbXBv c2VJbmRleCA9IGFycmF5T3BlcmF0aW9uSW5kZXg7CiAgICAgIH0gZWxzZSB7 CiAgICAgICAgdGhpcy5fc3BsaXQoYXJyYXlPcGVyYXRpb25JbmRleCwgaW5k ZXggLSBhcnJheU9wZXJhdGlvblJhbmdlU3RhcnQsIG5ld0FycmF5T3BlcmF0 aW9uKTsKICAgICAgICBjb21wb3NlSW5kZXggPSBhcnJheU9wZXJhdGlvbklu ZGV4ICsgMTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy8gaW5zZXJ0 IGF0IGVuZAogICAgICB0aGlzLl9vcGVyYXRpb25zLnB1c2gobmV3QXJyYXlP cGVyYXRpb24pOwogICAgICBjb21wb3NlSW5kZXggPSBhcnJheU9wZXJhdGlv bkluZGV4OwogICAgfQoKICAgIHRoaXMuX2NvbXBvc2VJbnNlcnQoY29tcG9z ZUluZGV4KTsKICB9LAoKICAvKioKICAgIFRyYWNrIHRoYXQgYGNvdW50YCBp dGVtcyB3ZXJlIHJlbW92ZWQgYXQgYGluZGV4YC4KCiAgICBAbWV0aG9kIHJl bW92ZUl0ZW1zCiAgICBAcGFyYW0gaW5kZXgKICAgIEBwYXJhbSBjb3VudAog ICovCiAgcmVtb3ZlSXRlbXM6IGZ1bmN0aW9uIChpbmRleCwgY291bnQpIHsK ICAgIGlmIChjb3VudCA8IDEpIHsgcmV0dXJuOyB9CgogICAgdmFyIG1hdGNo ID0gdGhpcy5fZmluZEFycmF5T3BlcmF0aW9uKGluZGV4KSwKICAgICAgICBh cnJheU9wZXJhdGlvbiA9IG1hdGNoLm9wZXJhdGlvbiwKICAgICAgICBhcnJh eU9wZXJhdGlvbkluZGV4ID0gbWF0Y2guaW5kZXgsCiAgICAgICAgYXJyYXlP cGVyYXRpb25SYW5nZVN0YXJ0ID0gbWF0Y2gucmFuZ2VTdGFydCwKICAgICAg ICBuZXdBcnJheU9wZXJhdGlvbiwKICAgICAgICBjb21wb3NlSW5kZXg7Cgog ICAgbmV3QXJyYXlPcGVyYXRpb24gPSBuZXcgQXJyYXlPcGVyYXRpb24oREVM RVRFLCBjb3VudCk7CiAgICBpZiAoIW1hdGNoLnNwbGl0KSB7CiAgICAgIC8v IGluc2VydCBsZWZ0IG9mIGFycmF5T3BlcmF0aW9uCiAgICAgIHRoaXMuX29w ZXJhdGlvbnMuc3BsaWNlKGFycmF5T3BlcmF0aW9uSW5kZXgsIDAsIG5ld0Fy cmF5T3BlcmF0aW9uKTsKICAgICAgY29tcG9zZUluZGV4ID0gYXJyYXlPcGVy YXRpb25JbmRleDsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuX3NwbGl0KGFy cmF5T3BlcmF0aW9uSW5kZXgsIGluZGV4IC0gYXJyYXlPcGVyYXRpb25SYW5n ZVN0YXJ0LCBuZXdBcnJheU9wZXJhdGlvbik7CiAgICAgIGNvbXBvc2VJbmRl eCA9IGFycmF5T3BlcmF0aW9uSW5kZXggKyAxOwogICAgfQoKICAgIHJldHVy biB0aGlzLl9jb21wb3NlRGVsZXRlKGNvbXBvc2VJbmRleCk7CiAgfSwKCiAg LyoqCiAgICBBcHBseSBhbGwgb3BlcmF0aW9ucywgcmVkdWNpbmcgdGhlbSB0 byByZXRhaW46biwgZm9yIGBuYCwgdGhlIG51bWJlciBvZgogICAgaXRlbXMg aW4gdGhlIGFycmF5LgoKICAgIGBjYWxsYmFja2Agd2lsbCBiZSBjYWxsZWQg Zm9yIGVhY2ggb3BlcmF0aW9uIGFuZCB3aWxsIGJlIHBhc3NlZCB0aGUgZm9s bG93aW5nIGFyZ3VtZW50czoKCiAgICAqIHthcnJheX0gaXRlbXMgVGhlIGl0 ZW1zIGZvciB0aGUgZ2l2ZW4gb3BlcmF0aW9uCiAgICAqIHtudW1iZXJ9IG9m ZnNldCBUaGUgY29tcHV0ZWQgb2Zmc2V0IG9mIHRoZSBpdGVtcywgaWUgdGhl IGluZGV4IGluIHRoZQogICAgYXJyYXkgb2YgdGhlIGZpcnN0IGl0ZW0gZm9y IHRoaXMgb3BlcmF0aW9uLgogICAgKiB7c3RyaW5nfSBvcGVyYXRpb24gVGhl IHR5cGUgb2YgdGhlIG9wZXJhdGlvbi4gIE9uZSBvZgogICAgYEVtYmVyLlRy YWNrZWRBcnJheS57UkVUQUlOLCBERUxFVEUsIElOU0VSVH1gCgogICAgQG1l dGhvZCBhcHBseQogICAgQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sKICAq LwogIGFwcGx5OiBmdW5jdGlvbiAoY2FsbGJhY2spIHsKICAgIHZhciBpdGVt cyA9IFtdLAogICAgICAgIG9mZnNldCA9IDA7CgogICAgZm9yRWFjaCh0aGlz Ll9vcGVyYXRpb25zLCBmdW5jdGlvbiAoYXJyYXlPcGVyYXRpb24pIHsKICAg ICAgY2FsbGJhY2soYXJyYXlPcGVyYXRpb24uaXRlbXMsIG9mZnNldCwgYXJy YXlPcGVyYXRpb24udHlwZSk7CgogICAgICBpZiAoYXJyYXlPcGVyYXRpb24u dHlwZSAhPT0gREVMRVRFKSB7CiAgICAgICAgb2Zmc2V0ICs9IGFycmF5T3Bl cmF0aW9uLmNvdW50OwogICAgICAgIGl0ZW1zID0gaXRlbXMuY29uY2F0KGFy cmF5T3BlcmF0aW9uLml0ZW1zKTsKICAgICAgfQogICAgfSk7CgogICAgdGhp cy5fb3BlcmF0aW9ucyA9IFtuZXcgQXJyYXlPcGVyYXRpb24oUkVUQUlOLCBp dGVtcy5sZW5ndGgsIGl0ZW1zKV07CiAgfSwKCiAgLyoqCiAgICBSZXR1cm4g YW4gYEFycmF5T3BlcmF0aW9uTWF0Y2hgIGZvciB0aGUgb3BlcmF0aW9uIHRo YXQgY29udGFpbnMgdGhlIGl0ZW0gYXQgYGluZGV4YC4KCiAgICBAbWV0aG9k IF9maW5kQXJyYXlPcGVyYXRpb24KCiAgICBAcGFyYW0ge251bWJlcn0gaW5k ZXggdGhlIGluZGV4IG9mIHRoZSBpdGVtIHdob3NlIG9wZXJhdGlvbiBpbmZv cm1hdGlvbgogICAgc2hvdWxkIGJlIHJldHVybmVkLgogICAgQHByaXZhdGUK ICAqLwogIF9maW5kQXJyYXlPcGVyYXRpb246IGZ1bmN0aW9uIChpbmRleCkg ewogICAgdmFyIGFycmF5T3BlcmF0aW9uSW5kZXgsCiAgICAgICAgbGVuLAog ICAgICAgIHNwbGl0ID0gZmFsc2UsCiAgICAgICAgYXJyYXlPcGVyYXRpb24s CiAgICAgICAgYXJyYXlPcGVyYXRpb25SYW5nZVN0YXJ0LAogICAgICAgIGFy cmF5T3BlcmF0aW9uUmFuZ2VFbmQ7CgogICAgLy8gT1BUSU1JWkU6IHdlIGNv dWxkIHNlYXJjaCB0aGVzZSBmYXN0ZXIgaWYgd2Uga2VwdCBhIGJhbGFuY2Vk IHRyZWUuCiAgICAvLyBmaW5kIGxlZnRtb3N0IGFycmF5T3BlcmF0aW9uIHRv IHRoZSByaWdodCBvZiBgaW5kZXhgCiAgICBmb3IgKGFycmF5T3BlcmF0aW9u SW5kZXggPSBhcnJheU9wZXJhdGlvblJhbmdlU3RhcnQgPSAwLCBsZW4gPSB0 aGlzLl9vcGVyYXRpb25zLmxlbmd0aDsgYXJyYXlPcGVyYXRpb25JbmRleCA8 IGxlbjsgKythcnJheU9wZXJhdGlvbkluZGV4KSB7CiAgICAgIGFycmF5T3Bl cmF0aW9uID0gdGhpcy5fb3BlcmF0aW9uc1thcnJheU9wZXJhdGlvbkluZGV4 XTsKCiAgICAgIGlmIChhcnJheU9wZXJhdGlvbi50eXBlID09PSBERUxFVEUp IHsgY29udGludWU7IH0KCiAgICAgIGFycmF5T3BlcmF0aW9uUmFuZ2VFbmQg PSBhcnJheU9wZXJhdGlvblJhbmdlU3RhcnQgKyBhcnJheU9wZXJhdGlvbi5j b3VudCAtIDE7CgogICAgICBpZiAoaW5kZXggPT09IGFycmF5T3BlcmF0aW9u UmFuZ2VTdGFydCkgewogICAgICAgIGJyZWFrOwogICAgICB9IGVsc2UgaWYg KGluZGV4ID4gYXJyYXlPcGVyYXRpb25SYW5nZVN0YXJ0ICYmIGluZGV4IDw9 IGFycmF5T3BlcmF0aW9uUmFuZ2VFbmQpIHsKICAgICAgICBzcGxpdCA9IHRy dWU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXJy YXlPcGVyYXRpb25SYW5nZVN0YXJ0ID0gYXJyYXlPcGVyYXRpb25SYW5nZUVu ZCArIDE7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbmV3IEFycmF5T3Bl cmF0aW9uTWF0Y2goYXJyYXlPcGVyYXRpb24sIGFycmF5T3BlcmF0aW9uSW5k ZXgsIHNwbGl0LCBhcnJheU9wZXJhdGlvblJhbmdlU3RhcnQpOwogIH0sCgog IF9zcGxpdDogZnVuY3Rpb24gKGFycmF5T3BlcmF0aW9uSW5kZXgsIHNwbGl0 SW5kZXgsIG5ld0FycmF5T3BlcmF0aW9uKSB7CiAgICB2YXIgYXJyYXlPcGVy YXRpb24gPSB0aGlzLl9vcGVyYXRpb25zW2FycmF5T3BlcmF0aW9uSW5kZXhd LAogICAgICAgIHNwbGl0SXRlbXMgPSBhcnJheU9wZXJhdGlvbi5pdGVtcy5z bGljZShzcGxpdEluZGV4KSwKICAgICAgICBzcGxpdEFycmF5T3BlcmF0aW9u ID0gbmV3IEFycmF5T3BlcmF0aW9uKGFycmF5T3BlcmF0aW9uLnR5cGUsIHNw bGl0SXRlbXMubGVuZ3RoLCBzcGxpdEl0ZW1zKTsKCiAgICAvLyB0cnVuY2F0 ZSBMSFMKICAgIGFycmF5T3BlcmF0aW9uLmNvdW50ID0gc3BsaXRJbmRleDsK ICAgIGFycmF5T3BlcmF0aW9uLml0ZW1zID0gYXJyYXlPcGVyYXRpb24uaXRl bXMuc2xpY2UoMCwgc3BsaXRJbmRleCk7CgogICAgdGhpcy5fb3BlcmF0aW9u cy5zcGxpY2UoYXJyYXlPcGVyYXRpb25JbmRleCArIDEsIDAsIG5ld0FycmF5 T3BlcmF0aW9uLCBzcGxpdEFycmF5T3BlcmF0aW9uKTsKICB9LAoKICAvLyBz ZWUgU3ViQXJyYXkgZm9yIGEgYmV0dGVyIGltcGxlbWVudGF0aW9uLgogIF9j b21wb3NlSW5zZXJ0OiBmdW5jdGlvbiAoaW5kZXgpIHsKICAgIHZhciBuZXdB cnJheU9wZXJhdGlvbiA9IHRoaXMuX29wZXJhdGlvbnNbaW5kZXhdLAogICAg ICAgIGxlZnRBcnJheU9wZXJhdGlvbiA9IHRoaXMuX29wZXJhdGlvbnNbaW5k ZXgtMV0sIC8vIG1heSBiZSB1bmRlZmluZWQKICAgICAgICByaWdodEFycmF5 T3BlcmF0aW9uID0gdGhpcy5fb3BlcmF0aW9uc1tpbmRleCsxXSwgLy8gbWF5 IGJlIHVuZGVmaW5lZAogICAgICAgIGxlZnRPcCA9IGxlZnRBcnJheU9wZXJh dGlvbiAmJiBsZWZ0QXJyYXlPcGVyYXRpb24udHlwZSwKICAgICAgICByaWdo dE9wID0gcmlnaHRBcnJheU9wZXJhdGlvbiAmJiByaWdodEFycmF5T3BlcmF0 aW9uLnR5cGU7CgogICAgaWYgKGxlZnRPcCA9PT0gSU5TRVJUKSB7CiAgICAg ICAgLy8gbWVyZ2UgbGVmdAogICAgICAgIGxlZnRBcnJheU9wZXJhdGlvbi5j b3VudCArPSBuZXdBcnJheU9wZXJhdGlvbi5jb3VudDsKICAgICAgICBsZWZ0 QXJyYXlPcGVyYXRpb24uaXRlbXMgPSBsZWZ0QXJyYXlPcGVyYXRpb24uaXRl bXMuY29uY2F0KG5ld0FycmF5T3BlcmF0aW9uLml0ZW1zKTsKCiAgICAgIGlm IChyaWdodE9wID09PSBJTlNFUlQpIHsKICAgICAgICAvLyBhbHNvIG1lcmdl IHJpZ2h0ICh3ZSBoYXZlIHNwbGl0IGFuIGluc2VydCB3aXRoIGFuIGluc2Vy dCkKICAgICAgICBsZWZ0QXJyYXlPcGVyYXRpb24uY291bnQgKz0gcmlnaHRB cnJheU9wZXJhdGlvbi5jb3VudDsKICAgICAgICBsZWZ0QXJyYXlPcGVyYXRp b24uaXRlbXMgPSBsZWZ0QXJyYXlPcGVyYXRpb24uaXRlbXMuY29uY2F0KHJp Z2h0QXJyYXlPcGVyYXRpb24uaXRlbXMpOwogICAgICAgIHRoaXMuX29wZXJh dGlvbnMuc3BsaWNlKGluZGV4LCAyKTsKICAgICAgfSBlbHNlIHsKICAgICAg ICAvLyBvbmx5IG1lcmdlIGxlZnQKICAgICAgICB0aGlzLl9vcGVyYXRpb25z LnNwbGljZShpbmRleCwgMSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAocmln aHRPcCA9PT0gSU5TRVJUKSB7CiAgICAgIC8vIG1lcmdlIHJpZ2h0CiAgICAg IG5ld0FycmF5T3BlcmF0aW9uLmNvdW50ICs9IHJpZ2h0QXJyYXlPcGVyYXRp b24uY291bnQ7CiAgICAgIG5ld0FycmF5T3BlcmF0aW9uLml0ZW1zID0gbmV3 QXJyYXlPcGVyYXRpb24uaXRlbXMuY29uY2F0KHJpZ2h0QXJyYXlPcGVyYXRp b24uaXRlbXMpOwogICAgICB0aGlzLl9vcGVyYXRpb25zLnNwbGljZShpbmRl eCArIDEsIDEpOwogICAgfQogIH0sCgogIF9jb21wb3NlRGVsZXRlOiBmdW5j dGlvbiAoaW5kZXgpIHsKICAgIHZhciBhcnJheU9wZXJhdGlvbiA9IHRoaXMu X29wZXJhdGlvbnNbaW5kZXhdLAogICAgICAgIGRlbGV0ZXNUb0dvID0gYXJy YXlPcGVyYXRpb24uY291bnQsCiAgICAgICAgbGVmdEFycmF5T3BlcmF0aW9u ID0gdGhpcy5fb3BlcmF0aW9uc1tpbmRleC0xXSwgLy8gbWF5IGJlIHVuZGVm aW5lZAogICAgICAgIGxlZnRPcCA9IGxlZnRBcnJheU9wZXJhdGlvbiAmJiBs ZWZ0QXJyYXlPcGVyYXRpb24udHlwZSwKICAgICAgICBuZXh0QXJyYXlPcGVy YXRpb24sCiAgICAgICAgbmV4dE9wLAogICAgICAgIG5leHRDb3VudCwKICAg ICAgICByZW1vdmVOZXdBbmROZXh0T3AgPSBmYWxzZSwKICAgICAgICByZW1v dmVkSXRlbXMgPSBbXTsKCiAgICBpZiAobGVmdE9wID09PSBERUxFVEUpIHsK ICAgICAgYXJyYXlPcGVyYXRpb24gPSBsZWZ0QXJyYXlPcGVyYXRpb247CiAg ICAgIGluZGV4IC09IDE7CiAgICB9CgogICAgZm9yICh2YXIgaSA9IGluZGV4 ICsgMTsgZGVsZXRlc1RvR28gPiAwOyArK2kpIHsKICAgICAgbmV4dEFycmF5 T3BlcmF0aW9uID0gdGhpcy5fb3BlcmF0aW9uc1tpXTsKICAgICAgbmV4dE9w ID0gbmV4dEFycmF5T3BlcmF0aW9uLnR5cGU7CiAgICAgIG5leHRDb3VudCA9 IG5leHRBcnJheU9wZXJhdGlvbi5jb3VudDsKCiAgICAgIGlmIChuZXh0T3Ag PT09IERFTEVURSkgewogICAgICAgIGFycmF5T3BlcmF0aW9uLmNvdW50ICs9 IG5leHRDb3VudDsKICAgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgICAg aWYgKG5leHRDb3VudCA+IGRlbGV0ZXNUb0dvKSB7CiAgICAgICAgLy8gZDoy IHtyLGl9OjUgIHdlIHJlZHVjZSB0aGUgcmV0YWluIG9yIGluc2VydCwgYnV0 IGl0IHN0YXlzCiAgICAgICAgcmVtb3ZlZEl0ZW1zID0gcmVtb3ZlZEl0ZW1z LmNvbmNhdChuZXh0QXJyYXlPcGVyYXRpb24uaXRlbXMuc3BsaWNlKDAsIGRl bGV0ZXNUb0dvKSk7CiAgICAgICAgbmV4dEFycmF5T3BlcmF0aW9uLmNvdW50 IC09IGRlbGV0ZXNUb0dvOwoKICAgICAgICAvLyBJbiB0aGUgY2FzZSB3aGVy ZSB3ZSB0cnVuY2F0ZSB0aGUgbGFzdCBhcnJheU9wZXJhdGlvbiwgd2UgZG9u J3QgbmVlZCB0bwogICAgICAgIC8vIHJlbW92ZSBpdDsgYWxzbyB0aGUgZGVs ZXRlc1RvR28gcmVkdWN0aW9uIGlzIG5vdCB0aGUgZW50aXJldHkgb2YKICAg ICAgICAvLyBuZXh0Q291bnQKICAgICAgICBpIC09IDE7CiAgICAgICAgbmV4 dENvdW50ID0gZGVsZXRlc1RvR287CgogICAgICAgIGRlbGV0ZXNUb0dvID0g MDsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAobmV4dENvdW50ID09PSBk ZWxldGVzVG9HbykgewogICAgICAgICAgLy8gSGFuZGxlIGVkZ2UgY2FzZSBv ZiBkOjIgaToyIGluIHdoaWNoIGNhc2UgYm90aCBvcGVyYXRpb25zIGdvIGF3 YXkKICAgICAgICAgIC8vIGR1cmluZyBjb21wb3NpdGlvbi4KICAgICAgICAg IHJlbW92ZU5ld0FuZE5leHRPcCA9IHRydWU7CiAgICAgICAgfQogICAgICAg IHJlbW92ZWRJdGVtcyA9IHJlbW92ZWRJdGVtcy5jb25jYXQobmV4dEFycmF5 T3BlcmF0aW9uLml0ZW1zKTsKICAgICAgICBkZWxldGVzVG9HbyAtPSBuZXh0 Q291bnQ7CiAgICAgIH0KCiAgICAgIGlmIChuZXh0T3AgPT09IElOU0VSVCkg ewogICAgICAgIC8vIGQ6MiBpOjMgd2lsbCByZXN1bHQgaW4gZGVsZXRlIGdv aW5nIGF3YXkKICAgICAgICBhcnJheU9wZXJhdGlvbi5jb3VudCAtPSBuZXh0 Q291bnQ7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoYXJyYXlPcGVyYXRpb24u Y291bnQgPiAwKSB7CiAgICAgIC8vIGNvbXBvc2Ugb3VyIG5ldyBkZWxldGUg d2l0aCBwb3NzaWJseSBzZXZlcmFsIG9wZXJhdGlvbnMgdG8gdGhlIHJpZ2h0 IG9mCiAgICAgIC8vIGRpc3BhcmF0ZSB0eXBlcwogICAgICB0aGlzLl9vcGVy YXRpb25zLnNwbGljZShpbmRleCsxLCBpLTEtaW5kZXgpOwogICAgfSBlbHNl IHsKICAgICAgLy8gVGhlIGRlbGV0ZSBvcGVyYXRpb24gY2FuIGdvIGF3YXk7 IGl0IGhhcyBtZXJlbHkgcmVkdWNlZCBzb21lIG90aGVyCiAgICAgIC8vIG9w ZXJhdGlvbiwgYXMgaW4gZDozIGk6NDsgaXQgbWF5IGFsc28gaGF2ZSBlbGlt aW5hdGVkIHRoYXQgb3BlcmF0aW9uLAogICAgICAvLyBhcyBpbiBkOjMgaToz LgogICAgICB0aGlzLl9vcGVyYXRpb25zLnNwbGljZShpbmRleCwgcmVtb3Zl TmV3QW5kTmV4dE9wID8gMiA6IDEpOwogICAgfQoKICAgIHJldHVybiByZW1v dmVkSXRlbXM7CiAgfSwKCiAgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHsKICAg IHZhciBzdHIgPSAiIjsKICAgIGZvckVhY2godGhpcy5fb3BlcmF0aW9ucywg ZnVuY3Rpb24gKG9wZXJhdGlvbikgewogICAgICBzdHIgKz0gIiAiICsgb3Bl cmF0aW9uLnR5cGUgKyAiOiIgKyBvcGVyYXRpb24uY291bnQ7CiAgICB9KTsK ICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKDEpOwogIH0KfTsKCi8qKgogIElu dGVybmFsIGRhdGEgc3RydWN0dXJlIHRvIHJlcHJlc2VudCBhbiBhcnJheSBv cGVyYXRpb24uCgogIEBtZXRob2QgQXJyYXlPcGVyYXRpb24KICBAcHJpdmF0 ZQogIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBvcGVy YXRpb24uICBPbmUgb2YKICBgRW1iZXIuVHJhY2tlZEFycmF5LntSRVRBSU4s IElOU0VSVCwgREVMRVRFfWAKICBAcGFyYW0ge251bWJlcn0gY291bnQgVGhl IG51bWJlciBvZiBpdGVtcyBpbiB0aGlzIG9wZXJhdGlvbi4KICBAcGFyYW0g e2FycmF5fSBpdGVtcyBUaGUgaXRlbXMgb2YgdGhlIG9wZXJhdGlvbiwgaWYg aW5jbHVkZWQuICBSRVRBSU4gYW5kCiAgSU5TRVJUIGluY2x1ZGUgdGhlaXIg aXRlbXMsIERFTEVURSBkb2VzIG5vdC4KKi8KZnVuY3Rpb24gQXJyYXlPcGVy YXRpb24gKG9wZXJhdGlvbiwgY291bnQsIGl0ZW1zKSB7CiAgdGhpcy50eXBl ID0gb3BlcmF0aW9uOyAvLyBSRVRBSU4gfCBJTlNFUlQgfCBERUxFVEUKICB0 aGlzLmNvdW50ID0gY291bnQ7CiAgdGhpcy5pdGVtcyA9IGl0ZW1zOwp9Cgov KioKICBJbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSB1c2VkIHRvIGluY2x1ZGUg aW5mb3JtYXRpb24gd2hlbiBsb29raW5nIHVwIG9wZXJhdGlvbnMKICBieSBp dGVtIGluZGV4LgoKICBAbWV0aG9kIEFycmF5T3BlcmF0aW9uTWF0Y2gKICBA cHJpdmF0ZQogIEBwYXJhbSB7QXJyYXlPcGVyYXRpb259IG9wZXJhdGlvbgog IEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgYG9wZXJhdGlv bmAgaW4gdGhlIGFycmF5IG9mIG9wZXJhdGlvbnMuCiAgQHBhcmFtIHtib29s ZWFufSBzcGxpdCBXaGV0aGVyIG9yIG5vdCB0aGUgaXRlbSBpbmRleCBzZWFy Y2hlZCBmb3Igd291bGQKICByZXF1aXJlIGEgc3BsaXQgZm9yIGEgbmV3IG9w ZXJhdGlvbiB0eXBlLgogIEBwYXJhbSB7bnVtYmVyfSByYW5nZVN0YXJ0IFRo ZSBpbmRleCBvZiB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgb3BlcmF0aW9uLAog IHdpdGggcmVzcGVjdCB0byB0aGUgdHJhY2tlZCBhcnJheS4gIFRoZSBpbmRl eCBvZiB0aGUgbGFzdCBpdGVtIGNhbiBiZSBjb21wdXRlZAogIGZyb20gYHJh bmdlU3RhcnRgIGFuZCBgb3BlcmF0aW9uLmNvdW50YC4KKi8KZnVuY3Rpb24g QXJyYXlPcGVyYXRpb25NYXRjaChvcGVyYXRpb24sIGluZGV4LCBzcGxpdCwg cmFuZ2VTdGFydCkgewogIHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uOwog IHRoaXMuaW5kZXggPSBpbmRleDsKICB0aGlzLnNwbGl0ID0gc3BsaXQ7CiAg dGhpcy5yYW5nZVN0YXJ0ID0gcmFuZ2VTdGFydDsKfQoKfSkoKTsKCgoKKGZ1 bmN0aW9uKCkgewp2YXIgZ2V0ID0gRW1iZXIuZ2V0LAogICAgZm9yRWFjaCA9 IEVtYmVyLkVudW1lcmFibGVVdGlscy5mb3JFYWNoLAogICAgUkVUQUlOID0g J3InLAogICAgRklMVEVSID0gJ2YnOwoKZnVuY3Rpb24gT3BlcmF0aW9uICh0 eXBlLCBjb3VudCkgewogIHRoaXMudHlwZSA9IHR5cGU7CiAgdGhpcy5jb3Vu dCA9IGNvdW50Owp9CgovKioKICBBbiBgRW1iZXIuU3ViQXJyYXlgIHRyYWNr cyBhbiBhcnJheSBpbiBhIHdheSBzaW1pbGFyIHRvLCBidXQgbW9yZSBzcGVj aWFsaXplZAogIHRoYW4sIGBFbWJlci5UcmFja2VkQXJyYXlgLiAgSXQgaXMg dXNlZnVsIGZvciBrZWVwaW5nIHRyYWNrIG9mIHRoZSBpbmRleGVzIG9mCiAg aXRlbXMgd2l0aGluIGEgZmlsdGVyZWQgYXJyYXkuCgogIEBjbGFzcyBTdWJB cnJheQogIEBuYW1lc3BhY2UgRW1iZXIKKi8KRW1iZXIuU3ViQXJyYXkgPSBm dW5jdGlvbiAobGVuZ3RoKSB7CiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAx KSB7IGxlbmd0aCA9IDA7IH0KCiAgaWYgKGxlbmd0aCA+IDApIHsKICAgIHRo aXMuX29wZXJhdGlvbnMgPSBbbmV3IE9wZXJhdGlvbihSRVRBSU4sIGxlbmd0 aCldOwogIH0gZWxzZSB7CiAgICB0aGlzLl9vcGVyYXRpb25zID0gW107CiAg fQp9OwoKRW1iZXIuU3ViQXJyYXkucHJvdG90eXBlID0gewogIC8qKgogICAg VHJhY2sgdGhhdCBhbiBpdGVtIHdhcyBhZGRlZCB0byB0aGUgdHJhY2tlZCBh cnJheS4KCiAgICBAbWV0aG9kIGFkZEl0ZW0KCiAgICBAcGFyYW0ge251bWJl cn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBpdGVtIGluIHRoZSB0cmFja2Vk IGFycmF5LgogICAgQHBhcmFtIHtib29sZWFufSBtYXRjaCBgdHJ1ZWAgaWZm IHRoZSBpdGVtIGlzIGluY2x1ZGVkIGluIHRoZSBzdWJhcnJheS4KCiAgICBA cmV0dXJuIHtudW1iZXJ9IFRoZSBpbmRleCBvZiB0aGUgaXRlbSBpbiB0aGUg c3ViYXJyYXkuCiAgKi8KICBhZGRJdGVtOiBmdW5jdGlvbihpbmRleCwgbWF0 Y2gpIHsKICAgIHZhciByZXR1cm5WYWx1ZSA9IC0xLAogICAgICAgIGl0ZW1U eXBlID0gbWF0Y2ggPyBSRVRBSU4gOiBGSUxURVIsCiAgICAgICAgc2VsZiA9 IHRoaXM7CgogICAgdGhpcy5fZmluZE9wZXJhdGlvbihpbmRleCwgZnVuY3Rp b24ob3BlcmF0aW9uLCBvcGVyYXRpb25JbmRleCwgcmFuZ2VTdGFydCwgcmFu Z2VFbmQsIHNlZW5JblN1YkFycmF5KSB7CiAgICAgIHZhciBuZXdPcGVyYXRp b24sIHNwbGl0T3BlcmF0aW9uOwoKICAgICAgaWYgKGl0ZW1UeXBlID09PSBv cGVyYXRpb24udHlwZSkgewogICAgICAgICsrb3BlcmF0aW9uLmNvdW50Owog ICAgICB9IGVsc2UgaWYgKGluZGV4ID09PSByYW5nZVN0YXJ0KSB7CiAgICAg ICAgLy8gaW5zZXJ0IHRvIHRoZSBsZWZ0IG9mIGBvcGVyYXRpb25gCiAgICAg ICAgc2VsZi5fb3BlcmF0aW9ucy5zcGxpY2Uob3BlcmF0aW9uSW5kZXgsIDAs IG5ldyBPcGVyYXRpb24oaXRlbVR5cGUsIDEpKTsKICAgICAgfSBlbHNlIHsK ICAgICAgICBuZXdPcGVyYXRpb24gPSBuZXcgT3BlcmF0aW9uKGl0ZW1UeXBl LCAxKTsKICAgICAgICBzcGxpdE9wZXJhdGlvbiA9IG5ldyBPcGVyYXRpb24o b3BlcmF0aW9uLnR5cGUsIHJhbmdlRW5kIC0gaW5kZXggKyAxKTsKICAgICAg ICBvcGVyYXRpb24uY291bnQgPSBpbmRleCAtIHJhbmdlU3RhcnQ7CgogICAg ICAgIHNlbGYuX29wZXJhdGlvbnMuc3BsaWNlKG9wZXJhdGlvbkluZGV4ICsg MSwgMCwgbmV3T3BlcmF0aW9uLCBzcGxpdE9wZXJhdGlvbik7CiAgICAgIH0K CiAgICAgIGlmIChtYXRjaCkgewogICAgICAgIGlmIChvcGVyYXRpb24udHlw ZSA9PT0gUkVUQUlOKSB7CiAgICAgICAgICByZXR1cm5WYWx1ZSA9IHNlZW5J blN1YkFycmF5ICsgKGluZGV4IC0gcmFuZ2VTdGFydCk7CiAgICAgICAgfSBl bHNlIHsKICAgICAgICAgIHJldHVyblZhbHVlID0gc2VlbkluU3ViQXJyYXk7 CiAgICAgICAgfQogICAgICB9CgogICAgICBzZWxmLl9jb21wb3NlQXQob3Bl cmF0aW9uSW5kZXgpOwogICAgfSwgZnVuY3Rpb24oc2VlbkluU3ViQXJyYXkp IHsKICAgICAgc2VsZi5fb3BlcmF0aW9ucy5wdXNoKG5ldyBPcGVyYXRpb24o aXRlbVR5cGUsIDEpKTsKCiAgICAgIGlmIChtYXRjaCkgewogICAgICAgIHJl dHVyblZhbHVlID0gc2VlbkluU3ViQXJyYXk7CiAgICAgIH0KCiAgICAgIHNl bGYuX2NvbXBvc2VBdChzZWxmLl9vcGVyYXRpb25zLmxlbmd0aC0xKTsKICAg IH0pOwoKICAgIHJldHVybiByZXR1cm5WYWx1ZTsKICB9LAoKICAvKioKICAg IFRyYWNrIHRoYXQgYW4gaXRlbSB3YXMgcmVtb3ZlZCBmcm9tIHRoZSB0cmFj a2VkIGFycmF5LgoKICAgIEBtZXRob2QgcmVtb3ZlSXRlbQoKICAgIEBwYXJh bSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gaW4gdGhl IHRyYWNrZWQgYXJyYXkuCgogICAgQHJldHVybiB7bnVtYmVyfSBUaGUgaW5k ZXggb2YgdGhlIGl0ZW0gaW4gdGhlIHN1YmFycmF5LCBvciBgLTFgIGlmIHRo ZSBpdGVtCiAgICB3YXMgbm90IGluIHRoZSBzdWJhcnJheS4KICAqLwogIHJl bW92ZUl0ZW06IGZ1bmN0aW9uKGluZGV4KSB7CiAgICB2YXIgcmV0dXJuVmFs dWUgPSAtMSwKICAgICAgICBzZWxmID0gdGhpczsKCiAgICB0aGlzLl9maW5k T3BlcmF0aW9uKGluZGV4LCBmdW5jdGlvbiAob3BlcmF0aW9uLCBvcGVyYXRp b25JbmRleCwgcmFuZ2VTdGFydCwgcmFuZ2VFbmQsIHNlZW5JblN1YkFycmF5 KSB7CiAgICAgIGlmIChvcGVyYXRpb24udHlwZSA9PT0gUkVUQUlOKSB7CiAg ICAgICAgcmV0dXJuVmFsdWUgPSBzZWVuSW5TdWJBcnJheSArIChpbmRleCAt IHJhbmdlU3RhcnQpOwogICAgICB9CgogICAgICBpZiAob3BlcmF0aW9uLmNv dW50ID4gMSkgewogICAgICAgIC0tb3BlcmF0aW9uLmNvdW50OwogICAgICB9 IGVsc2UgewogICAgICAgIHNlbGYuX29wZXJhdGlvbnMuc3BsaWNlKG9wZXJh dGlvbkluZGV4LCAxKTsKICAgICAgICBzZWxmLl9jb21wb3NlQXQob3BlcmF0 aW9uSW5kZXgpOwogICAgICB9CiAgICB9LCBmdW5jdGlvbigpIHsKICAgICAg dGhyb3cgbmV3IEVtYmVyLkVycm9yKCJDYW4ndCByZW1vdmUgYW4gaXRlbSB0 aGF0IGhhcyBuZXZlciBiZWVuIGFkZGVkLiIpOwogICAgfSk7CgogICAgcmV0 dXJuIHJldHVyblZhbHVlOwogIH0sCgoKICBfZmluZE9wZXJhdGlvbjogZnVu Y3Rpb24gKGluZGV4LCBmb3VuZENhbGxiYWNrLCBub3RGb3VuZENhbGxiYWNr KSB7CiAgICB2YXIgb3BlcmF0aW9uSW5kZXgsCiAgICAgICAgbGVuLAogICAg ICAgIG9wZXJhdGlvbiwKICAgICAgICByYW5nZVN0YXJ0LAogICAgICAgIHJh bmdlRW5kLAogICAgICAgIHNlZW5JblN1YkFycmF5ID0gMDsKCiAgICAvLyBP UFRJTUlaRTogY2hhbmdlIHRvIGJhbGFuY2VkIHRyZWUKICAgIC8vIGZpbmQg bGVmdG1vc3Qgb3BlcmF0aW9uIHRvIHRoZSByaWdodCBvZiBgaW5kZXhgCiAg ICBmb3IgKG9wZXJhdGlvbkluZGV4ID0gcmFuZ2VTdGFydCA9IDAsIGxlbiA9 IHRoaXMuX29wZXJhdGlvbnMubGVuZ3RoOyBvcGVyYXRpb25JbmRleCA8IGxl bjsgcmFuZ2VTdGFydCA9IHJhbmdlRW5kICsgMSwgKytvcGVyYXRpb25JbmRl eCkgewogICAgICBvcGVyYXRpb24gPSB0aGlzLl9vcGVyYXRpb25zW29wZXJh dGlvbkluZGV4XTsKICAgICAgcmFuZ2VFbmQgPSByYW5nZVN0YXJ0ICsgb3Bl cmF0aW9uLmNvdW50IC0gMTsKCiAgICAgIGlmIChpbmRleCA+PSByYW5nZVN0 YXJ0ICYmIGluZGV4IDw9IHJhbmdlRW5kKSB7CiAgICAgICAgZm91bmRDYWxs YmFjayhvcGVyYXRpb24sIG9wZXJhdGlvbkluZGV4LCByYW5nZVN0YXJ0LCBy YW5nZUVuZCwgc2VlbkluU3ViQXJyYXkpOwogICAgICAgIHJldHVybjsKICAg ICAgfSBlbHNlIGlmIChvcGVyYXRpb24udHlwZSA9PT0gUkVUQUlOKSB7CiAg ICAgICAgc2VlbkluU3ViQXJyYXkgKz0gb3BlcmF0aW9uLmNvdW50OwogICAg ICB9CiAgICB9CgogICAgbm90Rm91bmRDYWxsYmFjayhzZWVuSW5TdWJBcnJh eSk7CiAgfSwKCiAgX2NvbXBvc2VBdDogZnVuY3Rpb24oaW5kZXgpIHsKICAg IHZhciBvcCA9IHRoaXMuX29wZXJhdGlvbnNbaW5kZXhdLAogICAgICAgIG90 aGVyT3A7CgogICAgaWYgKCFvcCkgewogICAgICAvLyBDb21wb3Npbmcgb3V0 IG9mIGJvdW5kcyBpcyBhIG5vLW9wLCBhcyB3aGVuIHJlbW92aW5nIHRoZSBs YXN0IG9wZXJhdGlvbgogICAgICAvLyBpbiB0aGUgbGlzdC4KICAgICAgcmV0 dXJuOwogICAgfQoKICAgIGlmIChpbmRleCA+IDApIHsKICAgICAgb3RoZXJP cCA9IHRoaXMuX29wZXJhdGlvbnNbaW5kZXgtMV07CiAgICAgIGlmIChvdGhl ck9wLnR5cGUgPT09IG9wLnR5cGUpIHsKICAgICAgICBvcC5jb3VudCArPSBv dGhlck9wLmNvdW50OwogICAgICAgIHRoaXMuX29wZXJhdGlvbnMuc3BsaWNl KGluZGV4LTEsIDEpOwogICAgICAgIC0taW5kZXg7CiAgICAgIH0KICAgIH0K CiAgICBpZiAoaW5kZXggPCB0aGlzLl9vcGVyYXRpb25zLmxlbmd0aC0xKSB7 CiAgICAgIG90aGVyT3AgPSB0aGlzLl9vcGVyYXRpb25zW2luZGV4KzFdOwog ICAgICBpZiAob3RoZXJPcC50eXBlID09PSBvcC50eXBlKSB7CiAgICAgICAg b3AuY291bnQgKz0gb3RoZXJPcC5jb3VudDsKICAgICAgICB0aGlzLl9vcGVy YXRpb25zLnNwbGljZShpbmRleCsxLCAxKTsKICAgICAgfQogICAgfQogIH0s CgogIHRvU3RyaW5nOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc3RyID0gIiI7 CiAgICBmb3JFYWNoKHRoaXMuX29wZXJhdGlvbnMsIGZ1bmN0aW9uIChvcGVy YXRpb24pIHsKICAgICAgc3RyICs9ICIgIiArIG9wZXJhdGlvbi50eXBlICsg IjoiICsgb3BlcmF0aW9uLmNvdW50OwogICAgfSk7CiAgICByZXR1cm4gc3Ry LnN1YnN0cmluZygxKTsKICB9Cn07Cgp9KSgpOwoKCgooZnVuY3Rpb24oKSB7 CkVtYmVyLkNvbnRhaW5lciA9IHJlcXVpcmVNb2R1bGUoJ2NvbnRhaW5lcicp WydkZWZhdWx0J107CkVtYmVyLkNvbnRhaW5lci5zZXQgPSBFbWJlci5zZXQ7 Cgp9KSgpOwoKCgooZnVuY3Rpb24oKSB7CkVtYmVyLkFwcGxpY2F0aW9uID0g RW1iZXIuTmFtZXNwYWNlLmV4dGVuZCgpOwoKfSkoKTsKCgoKKGZ1bmN0aW9u KCkgewovKioKQG1vZHVsZSBlbWJlcgpAc3VibW9kdWxlIGVtYmVyLXJ1bnRp bWUKKi8KCnZhciBPVVRfT0ZfUkFOR0VfRVhDRVBUSU9OID0gIkluZGV4IG91 dCBvZiByYW5nZSI7CnZhciBFTVBUWSA9IFtdOwoKdmFyIGdldCA9IEVtYmVy LmdldCwgc2V0ID0gRW1iZXIuc2V0OwoKLyoqCiAgQW4gQXJyYXlQcm94eSB3 cmFwcyBhbnkgb3RoZXIgb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBgRW1iZXIu QXJyYXlgIGFuZC9vcgogIGBFbWJlci5NdXRhYmxlQXJyYXksYCBmb3J3YXJk aW5nIGFsbCByZXF1ZXN0cy4gVGhpcyBtYWtlcyBpdCB2ZXJ5IHVzZWZ1bCBm b3IKICBhIG51bWJlciBvZiBiaW5kaW5nIHVzZSBjYXNlcyBvciBvdGhlciBj YXNlcyB3aGVyZSBiZWluZyBhYmxlIHRvIHN3YXAKICBvdXQgdGhlIHVuZGVy bHlpbmcgYXJyYXkgaXMgdXNlZnVsLgoKICBBIHNpbXBsZSBleGFtcGxlIG9m IHVzYWdlOgoKICBgYGBqYXZhc2NyaXB0CiAgdmFyIHBldHMgPSBbJ2RvZycs ICdjYXQnLCAnZmlzaCddOwogIHZhciBhcCA9IEVtYmVyLkFycmF5UHJveHku Y3JlYXRlKHsgY29udGVudDogRW1iZXIuQShwZXRzKSB9KTsKCiAgYXAuZ2V0 KCdmaXJzdE9iamVjdCcpOyAgICAgICAgICAgICAgICAgICAgICAgIC8vICdk b2cnCiAgYXAuc2V0KCdjb250ZW50JywgWydhbW9lYmEnLCAncGFyYW1lY2l1 bSddKTsKICBhcC5nZXQoJ2ZpcnN0T2JqZWN0Jyk7ICAgICAgICAgICAgICAg ICAgICAgICAgLy8gJ2Ftb2ViYScKICBgYGAKCiAgVGhpcyBjbGFzcyBjYW4g YWxzbyBiZSB1c2VmdWwgYXMgYSBsYXllciB0byB0cmFuc2Zvcm0gdGhlIGNv bnRlbnRzIG9mCiAgYW4gYXJyYXksIGFzIHRoZXkgYXJlIGFjY2Vzc2VkLiBU aGlzIGNhbiBiZSBkb25lIGJ5IG92ZXJyaWRpbmcKICBgb2JqZWN0QXRDb250 ZW50YDoKCiAgYGBgamF2YXNjcmlwdAogIHZhciBwZXRzID0gWydkb2cnLCAn Y2F0JywgJ2Zpc2gnXTsKICB2YXIgYXAgPSBFbWJlci5BcnJheVByb3h5LmNy ZWF0ZSh7CiAgICAgIGNvbnRlbnQ6IEVtYmVyLkEocGV0cyksCiAgICAgIG9i amVjdEF0Q29udGVudDogZnVuY3Rpb24oaWR4KSB7CiAgICAgICAgICByZXR1 cm4gdGhpcy5nZXQoJ2NvbnRlbnQnKS5vYmplY3RBdChpZHgpLnRvVXBwZXJD YXNlKCk7CiAgICAgIH0KICB9KTsKCiAgYXAuZ2V0KCdmaXJzdE9iamVjdCcp OyAvLyAuICdET0cnCiAgYGBgCgogIEBjbGFzcyBBcnJheVByb3h5CiAgQG5h bWVzcGFjZSBFbWJlcgogIEBleHRlbmRzIEVtYmVyLk9iamVjdAogIEB1c2Vz IEVtYmVyLk11dGFibGVBcnJheQoqLwpFbWJlci5BcnJheVByb3h5ID0gRW1i ZXIuT2JqZWN0LmV4dGVuZChFbWJlci5NdXRhYmxlQXJyYXksIHsKCiAgLyoq CiAgICBUaGUgY29udGVudCBhcnJheS4gTXVzdCBiZSBhbiBvYmplY3QgdGhh dCBpbXBsZW1lbnRzIGBFbWJlci5BcnJheWAgYW5kL29yCiAgICBgRW1iZXIu TXV0YWJsZUFycmF5LmAKCiAgICBAcHJvcGVydHkgY29udGVudAogICAgQHR5 cGUgRW1iZXIuQXJyYXkKICAqLwogIGNvbnRlbnQ6IG51bGwsCgogIC8qKgog ICBUaGUgYXJyYXkgdGhhdCB0aGUgcHJveHkgcHJldGVuZHMgdG8gYmUuIElu IHRoZSBkZWZhdWx0IGBBcnJheVByb3h5YAogICBpbXBsZW1lbnRhdGlvbiwg dGhpcyBhbmQgYGNvbnRlbnRgIGFyZSB0aGUgc2FtZS4gU3ViY2xhc3NlcyBv ZiBgQXJyYXlQcm94eWAKICAgY2FuIG92ZXJyaWRlIHRoaXMgcHJvcGVydHkg dG8gcHJvdmlkZSB0aGluZ3MgbGlrZSBzb3J0aW5nIGFuZCBmaWx0ZXJpbmcu CgogICBAcHJvcGVydHkgYXJyYW5nZWRDb250ZW50CiAgKi8KICBhcnJhbmdl ZENvbnRlbnQ6IEVtYmVyLmNvbXB1dGVkLmFsaWFzKCdjb250ZW50JyksCgog IC8qKgogICAgU2hvdWxkIGFjdHVhbGx5IHJldHJpZXZlIHRoZSBvYmplY3Qg YXQgdGhlIHNwZWNpZmllZCBpbmRleCBmcm9tIHRoZQogICAgY29udGVudC4g WW91IGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCBpbiBzdWJjbGFzc2VzIHRv IHRyYW5zZm9ybSB0aGUKICAgIGNvbnRlbnQgaXRlbSB0byBzb21ldGhpbmcg bmV3LgoKICAgIFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBjYWxsZWQgaWYg Y29udGVudCBpcyBub24tYG51bGxgLgoKICAgIEBtZXRob2Qgb2JqZWN0QXRD b250ZW50CiAgICBAcGFyYW0ge051bWJlcn0gaWR4IFRoZSBpbmRleCB0byBy ZXRyaWV2ZS4KICAgIEByZXR1cm4ge09iamVjdH0gdGhlIHZhbHVlIG9yIHVu ZGVmaW5lZCBpZiBub25lIGZvdW5kCiAgKi8KICBvYmplY3RBdENvbnRlbnQ6 IGZ1bmN0aW9uKGlkeCkgewogICAgcmV0dXJuIGdldCh0aGlzLCAnYXJyYW5n ZWRDb250ZW50Jykub2JqZWN0QXQoaWR4KTsKICB9LAoKICAvKioKICAgIFNo b3VsZCBhY3R1YWxseSByZXBsYWNlIHRoZSBzcGVjaWZpZWQgb2JqZWN0cyBv biB0aGUgY29udGVudCBhcnJheS4KICAgIFlvdSBjYW4gb3ZlcnJpZGUgdGhp cyBtZXRob2QgaW4gc3ViY2xhc3NlcyB0byB0cmFuc2Zvcm0gdGhlIGNvbnRl bnQgaXRlbQogICAgaW50byBzb21ldGhpbmcgbmV3LgoKICAgIFRoaXMgbWV0 aG9kIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgY29udGVudCBpcyBub24tYG51 bGxgLgoKICAgIEBtZXRob2QgcmVwbGFjZUNvbnRlbnQKICAgIEBwYXJhbSB7 TnVtYmVyfSBpZHggVGhlIHN0YXJ0aW5nIGluZGV4CiAgICBAcGFyYW0ge051 bWJlcn0gYW10IFRoZSBudW1iZXIgb2YgaXRlbXMgdG8gcmVtb3ZlIGZyb20g dGhlIGNvbnRlbnQuCiAgICBAcGFyYW0ge0FycmF5fSBvYmplY3RzIE9wdGlv bmFsIGFycmF5IG9mIG9iamVjdHMgdG8gaW5zZXJ0IG9yIG51bGwgaWYgbm8K ICAgICAgb2JqZWN0cy4KICAgIEByZXR1cm4ge3ZvaWR9CiAgKi8KICByZXBs YWNlQ29udGVudDogZnVuY3Rpb24oaWR4LCBhbXQsIG9iamVjdHMpIHsKICAg IGdldCh0aGlzLCAnY29udGVudCcpLnJlcGxhY2UoaWR4LCBhbXQsIG9iamVj dHMpOwogIH0sCgogIC8qKgogICAgSW52b2tlZCB3aGVuIHRoZSBjb250ZW50 IHByb3BlcnR5IGlzIGFib3V0IHRvIGNoYW5nZS4gTm90aWZpZXMgb2JzZXJ2 ZXJzIHRoYXQgdGhlCiAgICBlbnRpcmUgYXJyYXkgY29udGVudCB3aWxsIGNo YW5nZS4KCiAgICBAcHJpdmF0ZQogICAgQG1ldGhvZCBfY29udGVudFdpbGxD aGFuZ2UKICAqLwogIF9jb250ZW50V2lsbENoYW5nZTogRW1iZXIuYmVmb3Jl T2JzZXJ2ZXIoJ2NvbnRlbnQnLCBmdW5jdGlvbigpIHsKICAgIHRoaXMuX3Rl YXJkb3duQ29udGVudCgpOwogIH0pLAoKICBfdGVhcmRvd25Db250ZW50OiBm dW5jdGlvbigpIHsKICAgIHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250 ZW50Jyk7CgogICAgaWYgKGNvbnRlbnQpIHsKICAgICAgY29udGVudC5yZW1v dmVBcnJheU9ic2VydmVyKHRoaXMsIHsKICAgICAgICB3aWxsQ2hhbmdlOiAn Y29udGVudEFycmF5V2lsbENoYW5nZScsCiAgICAgICAgZGlkQ2hhbmdlOiAn Y29udGVudEFycmF5RGlkQ2hhbmdlJwogICAgICB9KTsKICAgIH0KICB9LAoK ICBjb250ZW50QXJyYXlXaWxsQ2hhbmdlOiBFbWJlci5LLAogIGNvbnRlbnRB cnJheURpZENoYW5nZTogRW1iZXIuSywKCiAgLyoqCiAgICBJbnZva2VkIHdo ZW4gdGhlIGNvbnRlbnQgcHJvcGVydHkgY2hhbmdlcy4gTm90aWZpZXMgb2Jz ZXJ2ZXJzIHRoYXQgdGhlCiAgICBlbnRpcmUgYXJyYXkgY29udGVudCBoYXMg Y2hhbmdlZC4KCiAgICBAcHJpdmF0ZQogICAgQG1ldGhvZCBfY29udGVudERp ZENoYW5nZQogICovCiAgX2NvbnRlbnREaWRDaGFuZ2U6IEVtYmVyLm9ic2Vy dmVyKCdjb250ZW50JywgZnVuY3Rpb24oKSB7CiAgICB2YXIgY29udGVudCA9 IGdldCh0aGlzLCAnY29udGVudCcpOwoKICAgIEVtYmVyLmFzc2VydCgiQ2Fu J3Qgc2V0IEFycmF5UHJveHkncyBjb250ZW50IHRvIGl0c2VsZiIsIGNvbnRl bnQgIT09IHRoaXMpOwoKICAgIHRoaXMuX3NldHVwQ29udGVudCgpOwogIH0p LAoKICBfc2V0dXBDb250ZW50OiBmdW5jdGlvbigpIHsKICAgIHZhciBjb250 ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50Jyk7CgogICAgaWYgKGNvbnRlbnQp IHsKICAgICAgY29udGVudC5hZGRBcnJheU9ic2VydmVyKHRoaXMsIHsKICAg ICAgICB3aWxsQ2hhbmdlOiAnY29udGVudEFycmF5V2lsbENoYW5nZScsCiAg ICAgICAgZGlkQ2hhbmdlOiAnY29udGVudEFycmF5RGlkQ2hhbmdlJwogICAg ICB9KTsKICAgIH0KICB9LAoKICBfYXJyYW5nZWRDb250ZW50V2lsbENoYW5n ZTogRW1iZXIuYmVmb3JlT2JzZXJ2ZXIoJ2FycmFuZ2VkQ29udGVudCcsIGZ1 bmN0aW9uKCkgewogICAgdmFyIGFycmFuZ2VkQ29udGVudCA9IGdldCh0aGlz LCAnYXJyYW5nZWRDb250ZW50JyksCiAgICAgICAgbGVuID0gYXJyYW5nZWRD b250ZW50ID8gZ2V0KGFycmFuZ2VkQ29udGVudCwgJ2xlbmd0aCcpIDogMDsK CiAgICB0aGlzLmFycmFuZ2VkQ29udGVudEFycmF5V2lsbENoYW5nZSh0aGlz LCAwLCBsZW4sIHVuZGVmaW5lZCk7CiAgICB0aGlzLmFycmFuZ2VkQ29udGVu dFdpbGxDaGFuZ2UodGhpcyk7CgogICAgdGhpcy5fdGVhcmRvd25BcnJhbmdl ZENvbnRlbnQoYXJyYW5nZWRDb250ZW50KTsKICB9KSwKCiAgX2FycmFuZ2Vk Q29udGVudERpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIoJ2FycmFuZ2VkQ29u dGVudCcsIGZ1bmN0aW9uKCkgewogICAgdmFyIGFycmFuZ2VkQ29udGVudCA9 IGdldCh0aGlzLCAnYXJyYW5nZWRDb250ZW50JyksCiAgICAgICAgbGVuID0g YXJyYW5nZWRDb250ZW50ID8gZ2V0KGFycmFuZ2VkQ29udGVudCwgJ2xlbmd0 aCcpIDogMDsKCiAgICBFbWJlci5hc3NlcnQoIkNhbid0IHNldCBBcnJheVBy b3h5J3MgY29udGVudCB0byBpdHNlbGYiLCBhcnJhbmdlZENvbnRlbnQgIT09 IHRoaXMpOwoKICAgIHRoaXMuX3NldHVwQXJyYW5nZWRDb250ZW50KCk7Cgog ICAgdGhpcy5hcnJhbmdlZENvbnRlbnREaWRDaGFuZ2UodGhpcyk7CiAgICB0 aGlzLmFycmFuZ2VkQ29udGVudEFycmF5RGlkQ2hhbmdlKHRoaXMsIDAsIHVu ZGVmaW5lZCwgbGVuKTsKICB9KSwKCiAgX3NldHVwQXJyYW5nZWRDb250ZW50 OiBmdW5jdGlvbigpIHsKICAgIHZhciBhcnJhbmdlZENvbnRlbnQgPSBnZXQo dGhpcywgJ2FycmFuZ2VkQ29udGVudCcpOwoKICAgIGlmIChhcnJhbmdlZENv bnRlbnQpIHsKICAgICAgYXJyYW5nZWRDb250ZW50LmFkZEFycmF5T2JzZXJ2 ZXIodGhpcywgewogICAgICAgIHdpbGxDaGFuZ2U6ICdhcnJhbmdlZENvbnRl bnRBcnJheVdpbGxDaGFuZ2UnLAogICAgICAgIGRpZENoYW5nZTogJ2FycmFu Z2VkQ29udGVudEFycmF5RGlkQ2hhbmdlJwogICAgICB9KTsKICAgIH0KICB9 LAoKICBfdGVhcmRvd25BcnJhbmdlZENvbnRlbnQ6IGZ1bmN0aW9uKCkgewog ICAgdmFyIGFycmFuZ2VkQ29udGVudCA9IGdldCh0aGlzLCAnYXJyYW5nZWRD b250ZW50Jyk7CgogICAgaWYgKGFycmFuZ2VkQ29udGVudCkgewogICAgICBh cnJhbmdlZENvbnRlbnQucmVtb3ZlQXJyYXlPYnNlcnZlcih0aGlzLCB7CiAg ICAgICAgd2lsbENoYW5nZTogJ2FycmFuZ2VkQ29udGVudEFycmF5V2lsbENo YW5nZScsCiAgICAgICAgZGlkQ2hhbmdlOiAnYXJyYW5nZWRDb250ZW50QXJy YXlEaWRDaGFuZ2UnCiAgICAgIH0pOwogICAgfQogIH0sCgogIGFycmFuZ2Vk Q29udGVudFdpbGxDaGFuZ2U6IEVtYmVyLkssCiAgYXJyYW5nZWRDb250ZW50 RGlkQ2hhbmdlOiBFbWJlci5LLAoKICBvYmplY3RBdDogZnVuY3Rpb24oaWR4 KSB7CiAgICByZXR1cm4gZ2V0KHRoaXMsICdjb250ZW50JykgJiYgdGhpcy5v YmplY3RBdENvbnRlbnQoaWR4KTsKICB9LAoKICBsZW5ndGg6IEVtYmVyLmNv bXB1dGVkKGZ1bmN0aW9uKCkgewogICAgdmFyIGFycmFuZ2VkQ29udGVudCA9 IGdldCh0aGlzLCAnYXJyYW5nZWRDb250ZW50Jyk7CiAgICByZXR1cm4gYXJy YW5nZWRDb250ZW50ID8gZ2V0KGFycmFuZ2VkQ29udGVudCwgJ2xlbmd0aCcp IDogMDsKICAgIC8vIE5vIGRlcGVuZGVuY2llcyBzaW5jZSBFbnVtZXJhYmxl IG5vdGlmaWVzIGxlbmd0aCBvZiBjaGFuZ2UKICB9KSwKCiAgX3JlcGxhY2U6 IGZ1bmN0aW9uKGlkeCwgYW10LCBvYmplY3RzKSB7CiAgICB2YXIgY29udGVu dCA9IGdldCh0aGlzLCAnY29udGVudCcpOwogICAgRW1iZXIuYXNzZXJ0KCdU aGUgY29udGVudCBwcm9wZXJ0eSBvZiAnKyB0aGlzLmNvbnN0cnVjdG9yICsg JyBzaG91bGQgYmUgc2V0IGJlZm9yZSBtb2RpZnlpbmcgaXQnLCBjb250ZW50 KTsKICAgIGlmIChjb250ZW50KSB0aGlzLnJlcGxhY2VDb250ZW50KGlkeCwg YW10LCBvYmplY3RzKTsKICAgIHJldHVybiB0aGlzOwogIH0sCgogIHJlcGxh Y2U6IGZ1bmN0aW9uKCkgewogICAgaWYgKGdldCh0aGlzLCAnYXJyYW5nZWRD b250ZW50JykgPT09IGdldCh0aGlzLCAnY29udGVudCcpKSB7CiAgICAgIHRo aXMuX3JlcGxhY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH0gZWxz ZSB7CiAgICAgIHRocm93IG5ldyBFbWJlci5FcnJvcigiVXNpbmcgcmVwbGFj ZSBvbiBhbiBhcnJhbmdlZCBBcnJheVByb3h5IGlzIG5vdCBhbGxvd2VkLiIp OwogICAgfQogIH0sCgogIF9pbnNlcnRBdDogZnVuY3Rpb24oaWR4LCBvYmpl Y3QpIHsKICAgIGlmIChpZHggPiBnZXQodGhpcywgJ2NvbnRlbnQubGVuZ3Ro JykpIHRocm93IG5ldyBFbWJlci5FcnJvcihPVVRfT0ZfUkFOR0VfRVhDRVBU SU9OKTsKICAgIHRoaXMuX3JlcGxhY2UoaWR4LCAwLCBbb2JqZWN0XSk7CiAg ICByZXR1cm4gdGhpczsKICB9LAoKICBpbnNlcnRBdDogZnVuY3Rpb24oaWR4 LCBvYmplY3QpIHsKICAgIGlmIChnZXQodGhpcywgJ2FycmFuZ2VkQ29udGVu dCcpID09PSBnZXQodGhpcywgJ2NvbnRlbnQnKSkgewogICAgICByZXR1cm4g dGhpcy5faW5zZXJ0QXQoaWR4LCBvYmplY3QpOwogICAgfSBlbHNlIHsKICAg ICAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKCJVc2luZyBpbnNlcnRBdCBvbiBh biBhcnJhbmdlZCBBcnJheVByb3h5IGlzIG5vdCBhbGxvd2VkLiIpOwogICAg fQogIH0sCgogIHJlbW92ZUF0OiBmdW5jdGlvbihzdGFydCwgbGVuKSB7CiAg ICBpZiAoJ251bWJlcicgPT09IHR5cGVvZiBzdGFydCkgewogICAgICB2YXIg Y29udGVudCA9IGdldCh0aGlzLCAnY29udGVudCcpLAogICAgICAgICAgYXJy YW5nZWRDb250ZW50ID0gZ2V0KHRoaXMsICdhcnJhbmdlZENvbnRlbnQnKSwK ICAgICAgICAgIGluZGljZXMgPSBbXSwgaTsKCiAgICAgIGlmICgoc3RhcnQg PCAwKSB8fCAoc3RhcnQgPj0gZ2V0KHRoaXMsICdsZW5ndGgnKSkpIHsKICAg ICAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoT1VUX09GX1JBTkdFX0VYQ0VQ VElPTik7CiAgICAgIH0KCiAgICAgIGlmIChsZW4gPT09IHVuZGVmaW5lZCkg bGVuID0gMTsKCiAgICAgIC8vIEdldCBhIGxpc3Qgb2YgaW5kaWNlcyBpbiBv cmlnaW5hbCBjb250ZW50IHRvIHJlbW92ZQogICAgICBmb3IgKGk9c3RhcnQ7 IGk8c3RhcnQrbGVuOyBpKyspIHsKICAgICAgICAvLyBVc2UgYXJyYW5nZWRD b250ZW50IGhlcmUgc28gd2UgYXZvaWQgY29uZnVzaW9uIHdpdGggb2JqZWN0 cyB0cmFuc2Zvcm1lZCBieSBvYmplY3RBdENvbnRlbnQKICAgICAgICBpbmRp Y2VzLnB1c2goY29udGVudC5pbmRleE9mKGFycmFuZ2VkQ29udGVudC5vYmpl Y3RBdChpKSkpOwogICAgICB9CgogICAgICAvLyBSZXBsYWNlIGluIHJldmVy c2Ugb3JkZXIgc2luY2UgaW5kaWNlcyB3aWxsIGNoYW5nZQogICAgICBpbmRp Y2VzLnNvcnQoZnVuY3Rpb24oYSxiKSB7IHJldHVybiBiIC0gYTsgfSk7Cgog ICAgICBFbWJlci5iZWdpblByb3BlcnR5Q2hhbmdlcygpOwogICAgICBmb3Ig KGk9MDsgaTxpbmRpY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdGhpcy5f cmVwbGFjZShpbmRpY2VzW2ldLCAxLCBFTVBUWSk7CiAgICAgIH0KICAgICAg RW1iZXIuZW5kUHJvcGVydHlDaGFuZ2VzKCk7CiAgICB9CgogICAgcmV0dXJu IHRoaXMgOwogIH0sCgogIHB1c2hPYmplY3Q6IGZ1bmN0aW9uKG9iaikgewog ICAgdGhpcy5faW5zZXJ0QXQoZ2V0KHRoaXMsICdjb250ZW50Lmxlbmd0aCcp LCBvYmopIDsKICAgIHJldHVybiBvYmogOwogIH0sCgogIHB1c2hPYmplY3Rz OiBmdW5jdGlvbihvYmplY3RzKSB7CiAgICBpZiAoIShFbWJlci5FbnVtZXJh YmxlLmRldGVjdChvYmplY3RzKSB8fCBFbWJlci5pc0FycmF5KG9iamVjdHMp KSkgewogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJNdXN0IHBhc3MgRW1i ZXIuRW51bWVyYWJsZSB0byBFbWJlci5NdXRhYmxlQXJyYXkjcHVzaE9iamVj dHMiKTsKICAgIH0KICAgIHRoaXMuX3JlcGxhY2UoZ2V0KHRoaXMsICdsZW5n dGgnKSwgMCwgb2JqZWN0cyk7CiAgICByZXR1cm4gdGhpczsKICB9LAoKICBz ZXRPYmplY3RzOiBmdW5jdGlvbihvYmplY3RzKSB7CiAgICBpZiAob2JqZWN0 cy5sZW5ndGggPT09IDApIHJldHVybiB0aGlzLmNsZWFyKCk7CgogICAgdmFy IGxlbiA9IGdldCh0aGlzLCAnbGVuZ3RoJyk7CiAgICB0aGlzLl9yZXBsYWNl KDAsIGxlbiwgb2JqZWN0cyk7CiAgICByZXR1cm4gdGhpczsKICB9LAoKICB1 bnNoaWZ0T2JqZWN0OiBmdW5jdGlvbihvYmopIHsKICAgIHRoaXMuX2luc2Vy dEF0KDAsIG9iaikgOwogICAgcmV0dXJuIG9iaiA7CiAgfSwKCiAgdW5zaGlm dE9iamVjdHM6IGZ1bmN0aW9uKG9iamVjdHMpIHsKICAgIHRoaXMuX3JlcGxh Y2UoMCwgMCwgb2JqZWN0cyk7CiAgICByZXR1cm4gdGhpczsKICB9LAoKICBz bGljZTogZnVuY3Rpb24oKSB7CiAgICB2YXIgYXJyID0gdGhpcy50b0FycmF5 KCk7CiAgICByZXR1cm4gYXJyLnNsaWNlLmFwcGx5KGFyciwgYXJndW1lbnRz KTsKICB9LAoKICBhcnJhbmdlZENvbnRlbnRBcnJheVdpbGxDaGFuZ2U6IGZ1 bmN0aW9uKGl0ZW0sIGlkeCwgcmVtb3ZlZENudCwgYWRkZWRDbnQpIHsKICAg IHRoaXMuYXJyYXlDb250ZW50V2lsbENoYW5nZShpZHgsIHJlbW92ZWRDbnQs IGFkZGVkQ250KTsKICB9LAoKICBhcnJhbmdlZENvbnRlbnRBcnJheURpZENo YW5nZTogZnVuY3Rpb24oaXRlbSwgaWR4LCByZW1vdmVkQ250LCBhZGRlZENu dCkgewogICAgdGhpcy5hcnJheUNvbnRlbnREaWRDaGFuZ2UoaWR4LCByZW1v dmVkQ250LCBhZGRlZENudCk7CiAgfSwKCiAgaW5pdDogZnVuY3Rpb24oKSB7 CiAgICB0aGlzLl9zdXBlcigpOwogICAgdGhpcy5fc2V0dXBDb250ZW50KCk7 CiAgICB0aGlzLl9zZXR1cEFycmFuZ2VkQ29udGVudCgpOwogIH0sCgogIHdp bGxEZXN0cm95OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX3RlYXJkb3duQXJy YW5nZWRDb250ZW50KCk7CiAgICB0aGlzLl90ZWFyZG93bkNvbnRlbnQoKTsK ICB9Cn0pOwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewovKioKQG1vZHVsZSBl bWJlcgpAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKKi8KCgp2YXIgc2V0ID0g RW1iZXIuc2V0LCBnZXQgPSBFbWJlci5nZXQsIGd1aWRGb3IgPSBFbWJlci5n dWlkRm9yOwp2YXIgZm9yRWFjaCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5m b3JFYWNoLAogICAgaW5kZXhPZiA9IEVtYmVyLkFycmF5UG9seWZpbGxzLmlu ZGV4T2Y7Cgp2YXIgRWFjaEFycmF5ID0gRW1iZXIuT2JqZWN0LmV4dGVuZChF bWJlci5BcnJheSwgewoKICBpbml0OiBmdW5jdGlvbihjb250ZW50LCBrZXlO YW1lLCBvd25lcikgewogICAgdGhpcy5fc3VwZXIoKTsKICAgIHRoaXMuX2tl eU5hbWUgPSBrZXlOYW1lOwogICAgdGhpcy5fb3duZXIgICA9IG93bmVyOwog ICAgdGhpcy5fY29udGVudCA9IGNvbnRlbnQ7CiAgfSwKCiAgb2JqZWN0QXQ6 IGZ1bmN0aW9uKGlkeCkgewogICAgdmFyIGl0ZW0gPSB0aGlzLl9jb250ZW50 Lm9iamVjdEF0KGlkeCk7CiAgICByZXR1cm4gaXRlbSAmJiBnZXQoaXRlbSwg dGhpcy5fa2V5TmFtZSk7CiAgfSwKCiAgbGVuZ3RoOiBFbWJlci5jb21wdXRl ZChmdW5jdGlvbigpIHsKICAgIHZhciBjb250ZW50ID0gdGhpcy5fY29udGVu dDsKICAgIHJldHVybiBjb250ZW50ID8gZ2V0KGNvbnRlbnQsICdsZW5ndGgn KSA6IDA7CiAgfSkKCn0pOwoKdmFyIElTX09CU0VSVkVSID0gL14uKzooYmVm b3JlfGNoYW5nZSkkLzsKCmZ1bmN0aW9uIGFkZE9ic2VydmVyRm9yQ29udGVu dEtleShjb250ZW50LCBrZXlOYW1lLCBwcm94eSwgaWR4LCBsb2MpIHsKICB2 YXIgb2JqZWN0cyA9IHByb3h5Ll9vYmplY3RzLCBndWlkOwogIGlmICghb2Jq ZWN0cykgb2JqZWN0cyA9IHByb3h5Ll9vYmplY3RzID0ge307CgogIHdoaWxl KC0tbG9jPj1pZHgpIHsKICAgIHZhciBpdGVtID0gY29udGVudC5vYmplY3RB dChsb2MpOwogICAgaWYgKGl0ZW0pIHsKICAgICAgRW1iZXIuYXNzZXJ0KCdX aGVuIHVzaW5nIEBlYWNoIHRvIG9ic2VydmUgdGhlIGFycmF5ICcgKyBjb250 ZW50ICsgJywgdGhlIGFycmF5IG11c3QgcmV0dXJuIGFuIG9iamVjdCcsIEVt YmVyLnR5cGVPZihpdGVtKSA9PT0gJ2luc3RhbmNlJyB8fCBFbWJlci50eXBl T2YoaXRlbSkgPT09ICdvYmplY3QnKTsKICAgICAgRW1iZXIuYWRkQmVmb3Jl T2JzZXJ2ZXIoaXRlbSwga2V5TmFtZSwgcHJveHksICdjb250ZW50S2V5V2ls bENoYW5nZScpOwogICAgICBFbWJlci5hZGRPYnNlcnZlcihpdGVtLCBrZXlO YW1lLCBwcm94eSwgJ2NvbnRlbnRLZXlEaWRDaGFuZ2UnKTsKCiAgICAgIC8v IGtlZXAgdHJhY2sgb2YgdGhlIGluZGV4IGVhY2ggaXRlbSB3YXMgZm91bmQg YXQgc28gd2UgY2FuIG1hcAogICAgICAvLyBpdCBiYWNrIHdoZW4gdGhlIG9i aiBjaGFuZ2VzLgogICAgICBndWlkID0gZ3VpZEZvcihpdGVtKTsKICAgICAg aWYgKCFvYmplY3RzW2d1aWRdKSBvYmplY3RzW2d1aWRdID0gW107CiAgICAg IG9iamVjdHNbZ3VpZF0ucHVzaChsb2MpOwogICAgfQogIH0KfQoKZnVuY3Rp b24gcmVtb3ZlT2JzZXJ2ZXJGb3JDb250ZW50S2V5KGNvbnRlbnQsIGtleU5h bWUsIHByb3h5LCBpZHgsIGxvYykgewogIHZhciBvYmplY3RzID0gcHJveHku X29iamVjdHM7CiAgaWYgKCFvYmplY3RzKSBvYmplY3RzID0gcHJveHkuX29i amVjdHMgPSB7fTsKICB2YXIgaW5kaWNpZXMsIGd1aWQ7CgogIHdoaWxlKC0t bG9jPj1pZHgpIHsKICAgIHZhciBpdGVtID0gY29udGVudC5vYmplY3RBdChs b2MpOwogICAgaWYgKGl0ZW0pIHsKICAgICAgRW1iZXIucmVtb3ZlQmVmb3Jl T2JzZXJ2ZXIoaXRlbSwga2V5TmFtZSwgcHJveHksICdjb250ZW50S2V5V2ls bENoYW5nZScpOwogICAgICBFbWJlci5yZW1vdmVPYnNlcnZlcihpdGVtLCBr ZXlOYW1lLCBwcm94eSwgJ2NvbnRlbnRLZXlEaWRDaGFuZ2UnKTsKCiAgICAg IGd1aWQgPSBndWlkRm9yKGl0ZW0pOwogICAgICBpbmRpY2llcyA9IG9iamVj dHNbZ3VpZF07CiAgICAgIGluZGljaWVzW2luZGV4T2YuY2FsbChpbmRpY2ll cywgbG9jKV0gPSBudWxsOwogICAgfQogIH0KfQoKLyoqCiAgVGhpcyBpcyB0 aGUgb2JqZWN0IGluc3RhbmNlIHJldHVybmVkIHdoZW4geW91IGdldCB0aGUg YEBlYWNoYCBwcm9wZXJ0eSBvbiBhbgogIGFycmF5LiBJdCB1c2VzIHRoZSB1 bmtub3duUHJvcGVydHkgaGFuZGxlciB0byBhdXRvbWF0aWNhbGx5IGNyZWF0 ZQogIEVhY2hBcnJheSBpbnN0YW5jZXMgZm9yIHByb3BlcnR5IG5hbWVzLgoK ICBAcHJpdmF0ZQogIEBjbGFzcyBFYWNoUHJveHkKICBAbmFtZXNwYWNlIEVt YmVyCiAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0CiovCkVtYmVyLkVhY2hQcm94 eSA9IEVtYmVyLk9iamVjdC5leHRlbmQoewoKICBpbml0OiBmdW5jdGlvbihj b250ZW50KSB7CiAgICB0aGlzLl9zdXBlcigpOwogICAgdGhpcy5fY29udGVu dCA9IGNvbnRlbnQ7CiAgICBjb250ZW50LmFkZEFycmF5T2JzZXJ2ZXIodGhp cyk7CgogICAgLy8gaW4gY2FzZSBzb21lb25lIGlzIGFscmVhZHkgb2JzZXJ2 aW5nIHNvbWUga2V5cyBtYWtlIHN1cmUgdGhleSBhcmUKICAgIC8vIGFkZGVk CiAgICBmb3JFYWNoKEVtYmVyLndhdGNoZWRFdmVudHModGhpcyksIGZ1bmN0 aW9uKGV2ZW50TmFtZSkgewogICAgICB0aGlzLmRpZEFkZExpc3RlbmVyKGV2 ZW50TmFtZSk7CiAgICB9LCB0aGlzKTsKICB9LAoKICAvKioKICAgIFlvdSBj YW4gZGlyZWN0bHkgYWNjZXNzIG1hcHBlZCBwcm9wZXJ0aWVzIGJ5IHNpbXBs eSByZXF1ZXN0aW5nIHRoZW0uCiAgICBUaGUgYHVua25vd25Qcm9wZXJ0eWAg aGFuZGxlciB3aWxsIGdlbmVyYXRlIGFuIEVhY2hBcnJheSBvZiBlYWNoIGl0 ZW0uCgogICAgQG1ldGhvZCB1bmtub3duUHJvcGVydHkKICAgIEBwYXJhbSBr ZXlOYW1lIHtTdHJpbmd9CiAgICBAcGFyYW0gdmFsdWUgeyp9CiAgKi8KICB1 bmtub3duUHJvcGVydHk6IGZ1bmN0aW9uKGtleU5hbWUsIHZhbHVlKSB7CiAg ICB2YXIgcmV0OwogICAgcmV0ID0gbmV3IEVhY2hBcnJheSh0aGlzLl9jb250 ZW50LCBrZXlOYW1lLCB0aGlzKTsKICAgIEVtYmVyLmRlZmluZVByb3BlcnR5 KHRoaXMsIGtleU5hbWUsIG51bGwsIHJldCk7CiAgICB0aGlzLmJlZ2luT2Jz ZXJ2aW5nQ29udGVudEtleShrZXlOYW1lKTsKICAgIHJldHVybiByZXQ7CiAg fSwKCiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLgogIC8vIEFSUkFZIENIQU5HRVMKICAv LyBJbnZva2VzIHdoZW5ldmVyIHRoZSBjb250ZW50IGFycmF5IGl0c2VsZiBj aGFuZ2VzLgoKICBhcnJheVdpbGxDaGFuZ2U6IGZ1bmN0aW9uKGNvbnRlbnQs IGlkeCwgcmVtb3ZlZENudCwgYWRkZWRDbnQpIHsKICAgIHZhciBrZXlzID0g dGhpcy5fa2V5cywga2V5LCBsaW07CgogICAgbGltID0gcmVtb3ZlZENudD4w ID8gaWR4K3JlbW92ZWRDbnQgOiAtMTsKICAgIEVtYmVyLmJlZ2luUHJvcGVy dHlDaGFuZ2VzKHRoaXMpOwoKICAgIGZvcihrZXkgaW4ga2V5cykgewogICAg ICBpZiAoIWtleXMuaGFzT3duUHJvcGVydHkoa2V5KSkgeyBjb250aW51ZTsg fQoKICAgICAgaWYgKGxpbT4wKSB7IHJlbW92ZU9ic2VydmVyRm9yQ29udGVu dEtleShjb250ZW50LCBrZXksIHRoaXMsIGlkeCwgbGltKTsgfQoKICAgICAg RW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsIGtleSk7CiAgICB9Cgog ICAgRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMuX2NvbnRlbnQsICdA ZWFjaCcpOwogICAgRW1iZXIuZW5kUHJvcGVydHlDaGFuZ2VzKHRoaXMpOwog IH0sCgogIGFycmF5RGlkQ2hhbmdlOiBmdW5jdGlvbihjb250ZW50LCBpZHgs IHJlbW92ZWRDbnQsIGFkZGVkQ250KSB7CiAgICB2YXIga2V5cyA9IHRoaXMu X2tleXMsIGxpbTsKCiAgICBsaW0gPSBhZGRlZENudD4wID8gaWR4K2FkZGVk Q250IDogLTE7CiAgICBFbWJlci5jaGFuZ2VQcm9wZXJ0aWVzKGZ1bmN0aW9u KCkgewogICAgICBmb3IodmFyIGtleSBpbiBrZXlzKSB7CiAgICAgICAgaWYg KCFrZXlzLmhhc093blByb3BlcnR5KGtleSkpIHsgY29udGludWU7IH0KCiAg ICAgICAgaWYgKGxpbT4wKSB7IGFkZE9ic2VydmVyRm9yQ29udGVudEtleShj b250ZW50LCBrZXksIHRoaXMsIGlkeCwgbGltKTsgfQoKICAgICAgICBFbWJl ci5wcm9wZXJ0eURpZENoYW5nZSh0aGlzLCBrZXkpOwogICAgICB9CgogICAg ICBFbWJlci5wcm9wZXJ0eURpZENoYW5nZSh0aGlzLl9jb250ZW50LCAnQGVh Y2gnKTsKICAgIH0sIHRoaXMpOwogIH0sCgogIC8vIC4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4K ICAvLyBMSVNURU4gRk9SIE5FVyBPQlNFUlZFUlMgQU5EIE9USEVSIEVWRU5U IExJU1RFTkVSUwogIC8vIFN0YXJ0IG1vbml0b3Jpbmcga2V5cyBiYXNlZCBv biB3aG8gaXMgbGlzdGVuaW5nLi4uCgogIGRpZEFkZExpc3RlbmVyOiBmdW5j dGlvbihldmVudE5hbWUpIHsKICAgIGlmIChJU19PQlNFUlZFUi50ZXN0KGV2 ZW50TmFtZSkpIHsKICAgICAgdGhpcy5iZWdpbk9ic2VydmluZ0NvbnRlbnRL ZXkoZXZlbnROYW1lLnNsaWNlKDAsIC03KSk7CiAgICB9CiAgfSwKCiAgZGlk UmVtb3ZlTGlzdGVuZXI6IGZ1bmN0aW9uKGV2ZW50TmFtZSkgewogICAgaWYg KElTX09CU0VSVkVSLnRlc3QoZXZlbnROYW1lKSkgewogICAgICB0aGlzLnN0 b3BPYnNlcnZpbmdDb250ZW50S2V5KGV2ZW50TmFtZS5zbGljZSgwLCAtNykp OwogICAgfQogIH0sCgogIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KICAvLyBDT05URU5U IEtFWSBPQlNFUlZJTkcKICAvLyBBY3R1YWwgd2F0Y2gga2V5cyBvbiB0aGUg c291cmNlIGNvbnRlbnQuCgogIGJlZ2luT2JzZXJ2aW5nQ29udGVudEtleTog ZnVuY3Rpb24oa2V5TmFtZSkgewogICAgdmFyIGtleXMgPSB0aGlzLl9rZXlz OwogICAgaWYgKCFrZXlzKSBrZXlzID0gdGhpcy5fa2V5cyA9IHt9OwogICAg aWYgKCFrZXlzW2tleU5hbWVdKSB7CiAgICAgIGtleXNba2V5TmFtZV0gPSAx OwogICAgICB2YXIgY29udGVudCA9IHRoaXMuX2NvbnRlbnQsCiAgICAgICAg ICBsZW4gPSBnZXQoY29udGVudCwgJ2xlbmd0aCcpOwogICAgICBhZGRPYnNl cnZlckZvckNvbnRlbnRLZXkoY29udGVudCwga2V5TmFtZSwgdGhpcywgMCwg bGVuKTsKICAgIH0gZWxzZSB7CiAgICAgIGtleXNba2V5TmFtZV0rKzsKICAg IH0KICB9LAoKICBzdG9wT2JzZXJ2aW5nQ29udGVudEtleTogZnVuY3Rpb24o a2V5TmFtZSkgewogICAgdmFyIGtleXMgPSB0aGlzLl9rZXlzOwogICAgaWYg KGtleXMgJiYgKGtleXNba2V5TmFtZV0+MCkgJiYgKC0ta2V5c1trZXlOYW1l XTw9MCkpIHsKICAgICAgdmFyIGNvbnRlbnQgPSB0aGlzLl9jb250ZW50LAog ICAgICAgICAgbGVuICAgICA9IGdldChjb250ZW50LCAnbGVuZ3RoJyk7CiAg ICAgIHJlbW92ZU9ic2VydmVyRm9yQ29udGVudEtleShjb250ZW50LCBrZXlO YW1lLCB0aGlzLCAwLCBsZW4pOwogICAgfQogIH0sCgogIGNvbnRlbnRLZXlX aWxsQ2hhbmdlOiBmdW5jdGlvbihvYmosIGtleU5hbWUpIHsKICAgIEVtYmVy LnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCBrZXlOYW1lKTsKICB9LAoKICBj b250ZW50S2V5RGlkQ2hhbmdlOiBmdW5jdGlvbihvYmosIGtleU5hbWUpIHsK ICAgIEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsIGtleU5hbWUpOwog IH0KCn0pOwoKCgp9KSgpOwoKCgooZnVuY3Rpb24oKSB7Ci8qKgpAbW9kdWxl IGVtYmVyCkBzdWJtb2R1bGUgZW1iZXItcnVudGltZQoqLwoKCnZhciBnZXQg PSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgcmVwbGFjZSA9IEVtYmVy LkVudW1lcmFibGVVdGlscy5fcmVwbGFjZTsKCi8vIEFkZCBFbWJlci5BcnJh eSB0byBBcnJheS5wcm90b3R5cGUuIFJlbW92ZSBtZXRob2RzIHdpdGggbmF0 aXZlCi8vIGltcGxlbWVudGF0aW9ucyBhbmQgc3VwcGx5IHNvbWUgbW9yZSBv cHRpbWl6ZWQgdmVyc2lvbnMgb2YgZ2VuZXJpYyBtZXRob2RzCi8vIGJlY2F1 c2UgdGhleSBhcmUgc28gY29tbW9uLgp2YXIgTmF0aXZlQXJyYXkgPSBFbWJl ci5NaXhpbi5jcmVhdGUoRW1iZXIuTXV0YWJsZUFycmF5LCBFbWJlci5PYnNl cnZhYmxlLCBFbWJlci5Db3B5YWJsZSwgewoKICAvLyBiZWNhdXNlIGxlbmd0 aCBpcyBhIGJ1aWx0LWluIHByb3BlcnR5IHdlIG5lZWQgdG8ga25vdyB0byBq dXN0IGdldCB0aGUKICAvLyBvcmlnaW5hbCBwcm9wZXJ0eS4KICBnZXQ6IGZ1 bmN0aW9uKGtleSkgewogICAgaWYgKGtleT09PSdsZW5ndGgnKSByZXR1cm4g dGhpcy5sZW5ndGg7CiAgICBlbHNlIGlmICgnbnVtYmVyJyA9PT0gdHlwZW9m IGtleSkgcmV0dXJuIHRoaXNba2V5XTsKICAgIGVsc2UgcmV0dXJuIHRoaXMu X3N1cGVyKGtleSk7CiAgfSwKCiAgb2JqZWN0QXQ6IGZ1bmN0aW9uKGlkeCkg ewogICAgcmV0dXJuIHRoaXNbaWR4XTsKICB9LAoKICAvLyBwcmltaXRpdmUg Zm9yIGFycmF5IHN1cHBvcnQuCiAgcmVwbGFjZTogZnVuY3Rpb24oaWR4LCBh bXQsIG9iamVjdHMpIHsKCiAgICBpZiAodGhpcy5pc0Zyb3plbikgdGhyb3cg RW1iZXIuRlJPWkVOX0VSUk9SOwoKICAgIC8vIGlmIHdlIHJlcGxhY2VkIGV4 YWN0bHkgdGhlIHNhbWUgbnVtYmVyIG9mIGl0ZW1zLCB0aGVuIHBhc3Mgb25s eSB0aGUKICAgIC8vIHJlcGxhY2VkIHJhbmdlLiBPdGhlcndpc2UsIHBhc3Mg dGhlIGZ1bGwgcmVtYWluaW5nIGFycmF5IGxlbmd0aAogICAgLy8gc2luY2Ug ZXZlcnl0aGluZyBoYXMgc2hpZnRlZAogICAgdmFyIGxlbiA9IG9iamVjdHMg PyBnZXQob2JqZWN0cywgJ2xlbmd0aCcpIDogMDsKICAgIHRoaXMuYXJyYXlD b250ZW50V2lsbENoYW5nZShpZHgsIGFtdCwgbGVuKTsKCiAgICBpZiAobGVu ID09PSAwKSB7CiAgICAgIHRoaXMuc3BsaWNlKGlkeCwgYW10KTsKICAgIH0g ZWxzZSB7CiAgICAgIHJlcGxhY2UodGhpcywgaWR4LCBhbXQsIG9iamVjdHMp OwogICAgfQoKICAgIHRoaXMuYXJyYXlDb250ZW50RGlkQ2hhbmdlKGlkeCwg YW10LCBsZW4pOwogICAgcmV0dXJuIHRoaXM7CiAgfSwKCiAgLy8gSWYgeW91 IGFzayBmb3IgYW4gdW5rbm93biBwcm9wZXJ0eSwgdGhlbiB0cnkgdG8gY29s bGVjdCB0aGUgdmFsdWUKICAvLyBmcm9tIG1lbWJlciBpdGVtcy4KICB1bmtu b3duUHJvcGVydHk6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgIHZhciBy ZXQ7Ly8gPSB0aGlzLnJlZHVjZWRQcm9wZXJ0eShrZXksIHZhbHVlKSA7CiAg ICBpZiAoKHZhbHVlICE9PSB1bmRlZmluZWQpICYmIHJldCA9PT0gdW5kZWZp bmVkKSB7CiAgICAgIHJldCA9IHRoaXNba2V5XSA9IHZhbHVlOwogICAgfQog ICAgcmV0dXJuIHJldCA7CiAgfSwKCiAgLy8gSWYgYnJvd3NlciBkaWQgbm90 IGltcGxlbWVudCBpbmRleE9mIG5hdGl2ZWx5LCB0aGVuIG92ZXJyaWRlIHdp dGgKICAvLyBzcGVjaWFsaXplZCB2ZXJzaW9uCiAgaW5kZXhPZjogZnVuY3Rp b24ob2JqZWN0LCBzdGFydEF0KSB7CiAgICB2YXIgaWR4LCBsZW4gPSB0aGlz Lmxlbmd0aDsKCiAgICBpZiAoc3RhcnRBdCA9PT0gdW5kZWZpbmVkKSBzdGFy dEF0ID0gMDsKICAgIGVsc2Ugc3RhcnRBdCA9IChzdGFydEF0IDwgMCkgPyBN YXRoLmNlaWwoc3RhcnRBdCkgOiBNYXRoLmZsb29yKHN0YXJ0QXQpOwogICAg aWYgKHN0YXJ0QXQgPCAwKSBzdGFydEF0ICs9IGxlbjsKCiAgICBmb3IoaWR4 PXN0YXJ0QXQ7aWR4PGxlbjtpZHgrKykgewogICAgICBpZiAodGhpc1tpZHhd ID09PSBvYmplY3QpIHJldHVybiBpZHggOwogICAgfQogICAgcmV0dXJuIC0x OwogIH0sCgogIGxhc3RJbmRleE9mOiBmdW5jdGlvbihvYmplY3QsIHN0YXJ0 QXQpIHsKICAgIHZhciBpZHgsIGxlbiA9IHRoaXMubGVuZ3RoOwoKICAgIGlm IChzdGFydEF0ID09PSB1bmRlZmluZWQpIHN0YXJ0QXQgPSBsZW4tMTsKICAg IGVsc2Ugc3RhcnRBdCA9IChzdGFydEF0IDwgMCkgPyBNYXRoLmNlaWwoc3Rh cnRBdCkgOiBNYXRoLmZsb29yKHN0YXJ0QXQpOwogICAgaWYgKHN0YXJ0QXQg PCAwKSBzdGFydEF0ICs9IGxlbjsKCiAgICBmb3IoaWR4PXN0YXJ0QXQ7aWR4 Pj0wO2lkeC0tKSB7CiAgICAgIGlmICh0aGlzW2lkeF0gPT09IG9iamVjdCkg cmV0dXJuIGlkeCA7CiAgICB9CiAgICByZXR1cm4gLTE7CiAgfSwKCiAgY29w eTogZnVuY3Rpb24oZGVlcCkgewogICAgaWYgKGRlZXApIHsKICAgICAgcmV0 dXJuIHRoaXMubWFwKGZ1bmN0aW9uKGl0ZW0pIHsgcmV0dXJuIEVtYmVyLmNv cHkoaXRlbSwgdHJ1ZSk7IH0pOwogICAgfQoKICAgIHJldHVybiB0aGlzLnNs aWNlKCk7CiAgfQp9KTsKCi8vIFJlbW92ZSBhbnkgbWV0aG9kcyBpbXBsZW1l bnRlZCBuYXRpdmVseSBzbyB3ZSBkb24ndCBvdmVycmlkZSB0aGVtCnZhciBp Z25vcmUgPSBbJ2xlbmd0aCddOwpFbWJlci5FbnVtZXJhYmxlVXRpbHMuZm9y RWFjaChOYXRpdmVBcnJheS5rZXlzKCksIGZ1bmN0aW9uKG1ldGhvZE5hbWUp IHsKICBpZiAoQXJyYXkucHJvdG90eXBlW21ldGhvZE5hbWVdKSBpZ25vcmUu cHVzaChtZXRob2ROYW1lKTsKfSk7CgppZiAoaWdub3JlLmxlbmd0aD4wKSB7 CiAgTmF0aXZlQXJyYXkgPSBOYXRpdmVBcnJheS53aXRob3V0LmFwcGx5KE5h dGl2ZUFycmF5LCBpZ25vcmUpOwp9CgovKioKICBUaGUgTmF0aXZlQXJyYXkg bWl4aW4gY29udGFpbnMgdGhlIHByb3BlcnRpZXMgbmVlZGVkIHRvIHRvIG1h a2UgdGhlIG5hdGl2ZQogIEFycmF5IHN1cHBvcnQgRW1iZXIuTXV0YWJsZUFy cmF5IGFuZCBhbGwgb2YgaXRzIGRlcGVuZGVudCBBUElzLiBVbmxlc3MgeW91 CiAgaGF2ZSBgRW1iZXIuRVhURU5EX1BST1RPVFlQRVNgIG9yIGBFbWJlci5F WFRFTkRfUFJPVE9UWVBFUy5BcnJheWAgc2V0IHRvCiAgZmFsc2UsIHRoaXMg d2lsbCBiZSBhcHBsaWVkIGF1dG9tYXRpY2FsbHkuIE90aGVyd2lzZSB5b3Ug Y2FuIGFwcGx5IHRoZSBtaXhpbgogIGF0IGFueXRpbWUgYnkgY2FsbGluZyBg RW1iZXIuTmF0aXZlQXJyYXkuYWN0aXZhdGVgLgoKICBAY2xhc3MgTmF0aXZl QXJyYXkKICBAbmFtZXNwYWNlIEVtYmVyCiAgQHVzZXMgRW1iZXIuTXV0YWJs ZUFycmF5CiAgQHVzZXMgRW1iZXIuT2JzZXJ2YWJsZQogIEB1c2VzIEVtYmVy LkNvcHlhYmxlCiovCkVtYmVyLk5hdGl2ZUFycmF5ID0gTmF0aXZlQXJyYXk7 CgovKioKICBDcmVhdGVzIGFuIGBFbWJlci5OYXRpdmVBcnJheWAgZnJvbSBh biBBcnJheSBsaWtlIG9iamVjdC4KICBEb2VzIG5vdCBtb2RpZnkgdGhlIG9y aWdpbmFsIG9iamVjdC4gRW1iZXIuQSBpcyBub3QgbmVlZGVkIGlmCiAgYEVt YmVyLkVYVEVORF9QUk9UT1RZUEVTYCBpcyBgdHJ1ZWAgKHRoZSBkZWZhdWx0 IHZhbHVlKS4gSG93ZXZlciwKICBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlv dSB1c2UgRW1iZXIuQSB3aGVuIGNyZWF0aW5nIGFkZG9ucyBmb3IKICBlbWJl ciBvciB3aGVuIHlvdSBjYW4gbm90IGd1YXJhbnRlZSB0aGF0IGBFbWJlci5F WFRFTkRfUFJPVE9UWVBFU2AKICB3aWxsIGJlIGB0cnVlYC4KCiAgRXhhbXBs ZQoKICBgYGBqcwogIHZhciBQYWdpbmF0aW9uID0gRW1iZXIuQ29sbGVjdGlv blZpZXcuZXh0ZW5kKHsKICAgIHRhZ05hbWU6ICd1bCcsCiAgICBjbGFzc05h bWVzOiBbJ3BhZ2luYXRpb24nXSwKICAgIGluaXQ6IGZ1bmN0aW9uKCkgewog ICAgICB0aGlzLl9zdXBlcigpOwogICAgICBpZiAoIXRoaXMuZ2V0KCdjb250 ZW50JykpIHsKICAgICAgICB0aGlzLnNldCgnY29udGVudCcsIEVtYmVyLkEo W10pKTsKICAgICAgfQogICAgfQogIH0pOwogIGBgYAoKICBAbWV0aG9kIEEK ICBAZm9yIEVtYmVyCiAgQHJldHVybiB7RW1iZXIuTmF0aXZlQXJyYXl9Ciov CkVtYmVyLkEgPSBmdW5jdGlvbihhcnIpIHsKICBpZiAoYXJyID09PSB1bmRl ZmluZWQpIHsgYXJyID0gW107IH0KICByZXR1cm4gRW1iZXIuQXJyYXkuZGV0 ZWN0KGFycikgPyBhcnIgOiBFbWJlci5OYXRpdmVBcnJheS5hcHBseShhcnIp Owp9OwoKLyoqCiAgQWN0aXZhdGVzIHRoZSBtaXhpbiBvbiB0aGUgQXJyYXku cHJvdG90eXBlIGlmIG5vdCBhbHJlYWR5IGFwcGxpZWQuIENhbGxpbmcKICB0 aGlzIG1ldGhvZCBtb3JlIHRoYW4gb25jZSBpcyBzYWZlLiBUaGlzIHdpbGwg YmUgY2FsbGVkIHdoZW4gZW1iZXIgaXMgbG9hZGVkCiAgdW5sZXNzIHlvdSBo YXZlIGBFbWJlci5FWFRFTkRfUFJPVE9UWVBFU2Agb3IgYEVtYmVyLkVYVEVO RF9QUk9UT1RZUEVTLkFycmF5YAogIHNldCB0byBgZmFsc2VgLgoKICBFeGFt cGxlCgogIGBgYGpzCiAgaWYgKEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTID09 PSB0cnVlIHx8IEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTLkFycmF5KSB7CiAg ICBFbWJlci5OYXRpdmVBcnJheS5hY3RpdmF0ZSgpOwogIH0KICBgYGAKCiAg QG1ldGhvZCBhY3RpdmF0ZQogIEBmb3IgRW1iZXIuTmF0aXZlQXJyYXkKICBA c3RhdGljCiAgQHJldHVybiB7dm9pZH0KKi8KRW1iZXIuTmF0aXZlQXJyYXku YWN0aXZhdGUgPSBmdW5jdGlvbigpIHsKICBOYXRpdmVBcnJheS5hcHBseShB cnJheS5wcm90b3R5cGUpOwoKICBFbWJlci5BID0gZnVuY3Rpb24oYXJyKSB7 IHJldHVybiBhcnIgfHwgW107IH07Cn07CgppZiAoRW1iZXIuRVhURU5EX1BS T1RPVFlQRVMgPT09IHRydWUgfHwgRW1iZXIuRVhURU5EX1BST1RPVFlQRVMu QXJyYXkpIHsKICBFbWJlci5OYXRpdmVBcnJheS5hY3RpdmF0ZSgpOwp9CgoK fSkoKTsKCgoKKGZ1bmN0aW9uKCkgewovKioKQG1vZHVsZSBlbWJlcgpAc3Vi bW9kdWxlIGVtYmVyLXJ1bnRpbWUKKi8KCnZhciBnZXQgPSBFbWJlci5nZXQs IHNldCA9IEVtYmVyLnNldCwgZ3VpZEZvciA9IEVtYmVyLmd1aWRGb3IsIGlz Tm9uZSA9IEVtYmVyLmlzTm9uZSwgZm10ID0gRW1iZXIuU3RyaW5nLmZtdDsK Ci8qKgogIEFuIHVub3JkZXJlZCBjb2xsZWN0aW9uIG9mIG9iamVjdHMuCgog IEEgU2V0IHdvcmtzIGEgYml0IGxpa2UgYW4gYXJyYXkgZXhjZXB0IHRoYXQg aXRzIGl0ZW1zIGFyZSBub3Qgb3JkZXJlZC4gWW91CiAgY2FuIGNyZWF0ZSBh IHNldCB0byBlZmZpY2llbnRseSB0ZXN0IGZvciBtZW1iZXJzaGlwIGZvciBh biBvYmplY3QuIFlvdSBjYW4KICBhbHNvIGl0ZXJhdGUgdGhyb3VnaCBhIHNl dCBqdXN0IGxpa2UgYW4gYXJyYXksIGV2ZW4gYWNjZXNzaW5nIG9iamVjdHMg YnkKICBpbmRleCwgaG93ZXZlciB0aGVyZSBpcyBubyBndWFyYW50ZWUgYXMg dG8gdGhlaXIgb3JkZXIuCgogIEFsbCBTZXRzIGFyZSBvYnNlcnZhYmxlIHZp YSB0aGUgRW51bWVyYWJsZSBPYnNlcnZlciBBUEkgLSB3aGljaCB3b3Jrcwog IG9uIGFueSBlbnVtZXJhYmxlIG9iamVjdCBpbmNsdWRpbmcgYm90aCBTZXRz IGFuZCBBcnJheXMuCgogICMjIENyZWF0aW5nIGEgU2V0CgogIFlvdSBjYW4g Y3JlYXRlIGEgc2V0IGxpa2UgeW91IHdvdWxkIG1vc3Qgb2JqZWN0cyB1c2lu ZwogIGBuZXcgRW1iZXIuU2V0KClgLiBNb3N0IG5ldyBzZXRzIHlvdSBjcmVh dGUgd2lsbCBiZSBlbXB0eSwgYnV0IHlvdSBjYW4KICBhbHNvIGluaXRpYWxp emUgdGhlIHNldCB3aXRoIHNvbWUgY29udGVudCBieSBwYXNzaW5nIGFuIGFy cmF5IG9yIG90aGVyCiAgZW51bWVyYWJsZSBvZiBvYmplY3RzIHRvIHRoZSBj b25zdHJ1Y3Rvci4KCiAgRmluYWxseSwgeW91IGNhbiBwYXNzIGluIGFuIGV4 aXN0aW5nIHNldCBhbmQgdGhlIHNldCB3aWxsIGJlIGNvcGllZC4gWW91CiAg Y2FuIGFsc28gY3JlYXRlIGEgY29weSBvZiBhIHNldCBieSBjYWxsaW5nIGBF bWJlci5TZXQjY29weSgpYC4KCiAgYGBgamF2YXNjcmlwdAogIC8vIGNyZWF0 ZXMgYSBuZXcgZW1wdHkgc2V0CiAgdmFyIGZvdW5kTmFtZXMgPSBuZXcgRW1i ZXIuU2V0KCk7CgogIC8vIGNyZWF0ZXMgYSBzZXQgd2l0aCBmb3VyIG5hbWVz IGluIGl0LgogIHZhciBuYW1lcyA9IG5ldyBFbWJlci5TZXQoWyJDaGFybGVz IiwgIlRvbSIsICJKdWFuIiwgIkFsZXgiXSk7IC8vIDpQCgogIC8vIGNyZWF0 ZXMgYSBjb3B5IG9mIHRoZSBuYW1lcyBzZXQuCiAgdmFyIG5hbWVzQ29weSA9 IG5ldyBFbWJlci5TZXQobmFtZXMpOwoKICAvLyBzYW1lIGFzIGFib3ZlLgog IHZhciBhbm90aGVyTmFtZXNDb3B5ID0gbmFtZXMuY29weSgpOwogIGBgYAoK ICAjIyBBZGRpbmcvUmVtb3ZpbmcgT2JqZWN0cwoKICBZb3UgZ2VuZXJhbGx5 IGFkZCBvciByZW1vdmUgb2JqZWN0cyBmcm9tIGEgc2V0IHVzaW5nIGBhZGQo KWAgb3IKICBgcmVtb3ZlKClgLiBZb3UgY2FuIGFkZCBhbnkgdHlwZSBvZiBv YmplY3QgaW5jbHVkaW5nIHByaW1pdGl2ZXMgc3VjaCBhcwogIG51bWJlcnMs IHN0cmluZ3MsIGFuZCBib29sZWFucy4KCiAgVW5saWtlIGFycmF5cywgb2Jq ZWN0cyBjYW4gb25seSBleGlzdCBvbmUgdGltZSBpbiBhIHNldC4gSWYgeW91 IGNhbGwgYGFkZCgpYAogIG9uIGEgc2V0IHdpdGggdGhlIHNhbWUgb2JqZWN0 IG11bHRpcGxlIHRpbWVzLCB0aGUgb2JqZWN0IHdpbGwgb25seSBiZSBhZGRl ZAogIG9uY2UuIExpa2V3aXNlLCBjYWxsaW5nIGByZW1vdmUoKWAgd2l0aCB0 aGUgc2FtZSBvYmplY3QgbXVsdGlwbGUgdGltZXMgd2lsbAogIHJlbW92ZSB0 aGUgb2JqZWN0IHRoZSBmaXJzdCB0aW1lIGFuZCBoYXZlIG5vIGVmZmVjdCBv biBmdXR1cmUgY2FsbHMgdW50aWwKICB5b3UgYWRkIHRoZSBvYmplY3QgdG8g dGhlIHNldCBhZ2Fpbi4KCiAgTk9URTogWW91IGNhbm5vdCBhZGQvcmVtb3Zl IGBudWxsYCBvciBgdW5kZWZpbmVkYCB0byBhIHNldC4gQW55IGF0dGVtcHQg dG8gZG8KICBzbyB3aWxsIGJlIGlnbm9yZWQuCgogIEluIGFkZGl0aW9uIHRv IGFkZC9yZW1vdmUgeW91IGNhbiBhbHNvIGNhbGwgYHB1c2goKWAvYHBvcCgp YC4gUHVzaCBiZWhhdmVzCiAganVzdCBsaWtlIGBhZGQoKWAgYnV0IGBwb3Ao KWAsIHVubGlrZSBgcmVtb3ZlKClgIHdpbGwgcGljayBhbiBhcmJpdHJhcnkK ICBvYmplY3QsIHJlbW92ZSBpdCBhbmQgcmV0dXJuIGl0LiBUaGlzIGlzIGEg Z29vZCB3YXkgdG8gdXNlIGEgc2V0IGFzIGEgam9iCiAgcXVldWUgd2hlbiB5 b3UgZG9uJ3QgY2FyZSB3aGljaCBvcmRlciB0aGUgam9icyBhcmUgZXhlY3V0 ZWQgaW4uCgogICMjIFRlc3RpbmcgZm9yIGFuIE9iamVjdAoKICBUbyB0ZXN0 IGZvciBhbiBvYmplY3QncyBwcmVzZW5jZSBpbiBhIHNldCB5b3Ugc2ltcGx5 IGNhbGwKICBgRW1iZXIuU2V0I2NvbnRhaW5zKClgLgoKICAjIyBPYnNlcnZp bmcgY2hhbmdlcwoKICBXaGVuIHVzaW5nIGBFbWJlci5TZXRgLCB5b3UgY2Fu IG9ic2VydmUgdGhlIGAiW10iYCBwcm9wZXJ0eSB0byBiZQogIGFsZXJ0ZWQg d2hlbmV2ZXIgdGhlIGNvbnRlbnQgY2hhbmdlcy4gWW91IGNhbiBhbHNvIGFk ZCBhbiBlbnVtZXJhYmxlCiAgb2JzZXJ2ZXIgdG8gdGhlIHNldCB0byBiZSBu b3RpZmllZCBvZiBzcGVjaWZpYyBvYmplY3RzIHRoYXQgYXJlIGFkZGVkIGFu ZAogIHJlbW92ZWQgZnJvbSB0aGUgc2V0LiBTZWUgW0VtYmVyLkVudW1lcmFi bGVdKC9hcGkvY2xhc3Nlcy9FbWJlci5FbnVtZXJhYmxlLmh0bWwpCiAgZm9y IG1vcmUgaW5mb3JtYXRpb24gb24gZW51bWVyYWJsZXMuCgogIFRoaXMgaXMg b2Z0ZW4gdW5oZWxwZnVsLiBJZiB5b3UgYXJlIGZpbHRlcmluZyBzZXRzIG9m IG9iamVjdHMsIGZvciBpbnN0YW5jZSwKICBpdCBpcyB2ZXJ5IGluZWZmaWNp ZW50IHRvIHJlLWZpbHRlciBhbGwgb2YgdGhlIGl0ZW1zIGVhY2ggdGltZSB0 aGUgc2V0CiAgY2hhbmdlcy4gSXQgd291bGQgYmUgYmV0dGVyIGlmIHlvdSBj b3VsZCBqdXN0IGFkanVzdCB0aGUgZmlsdGVyZWQgc2V0IGJhc2VkCiAgb24g d2hhdCB3YXMgY2hhbmdlZCBvbiB0aGUgb3JpZ2luYWwgc2V0LiBUaGUgc2Ft ZSBpc3N1ZSBhcHBsaWVzIHRvIG1lcmdpbmcKICBzZXRzLCBhcyB3ZWxsLgoK ICAjIyBPdGhlciBNZXRob2RzCgogIGBFbWJlci5TZXRgIHByaW1hcnkgaW1w bGVtZW50cyBvdGhlciBtaXhpbiBBUElzLiBGb3IgYSBjb21wbGV0ZSByZWZl cmVuY2UKICBvbiB0aGUgbWV0aG9kcyB5b3Ugd2lsbCB1c2Ugd2l0aCBgRW1i ZXIuU2V0YCwgcGxlYXNlIGNvbnN1bHQgdGhlc2UgbWl4aW5zLgogIFRoZSBt b3N0IHVzZWZ1bCBvbmVzIHdpbGwgYmUgYEVtYmVyLkVudW1lcmFibGVgIGFu ZAogIGBFbWJlci5NdXRhYmxlRW51bWVyYWJsZWAgd2hpY2ggaW1wbGVtZW50 IG1vc3Qgb2YgdGhlIGNvbW1vbiBpdGVyYXRvcgogIG1ldGhvZHMgeW91IGFy ZSB1c2VkIHRvIG9uIEFycmF5LgoKICBOb3RlIHRoYXQgeW91IGNhbiBhbHNv IHVzZSB0aGUgYEVtYmVyLkNvcHlhYmxlYCBhbmQgYEVtYmVyLkZyZWV6YWJs ZWAKICBBUElzIG9uIGBFbWJlci5TZXRgIGFzIHdlbGwuIE9uY2UgYSBzZXQg aXMgZnJvemVuIGl0IGNhbiBubyBsb25nZXIgYmUKICBtb2RpZmllZC4gVGhl IGJlbmVmaXQgb2YgdGhpcyBpcyB0aGF0IHdoZW4geW91IGNhbGwgYGZyb3pl bkNvcHkoKWAgb24gaXQsCiAgRW1iZXIgd2lsbCBhdm9pZCBtYWtpbmcgY29w aWVzIG9mIHRoZSBzZXQuIFRoaXMgYWxsb3dzIHlvdSB0byB3cml0ZQogIGNv ZGUgdGhhdCBjYW4ga25vdyB3aXRoIGNlcnRhaW50eSB3aGVuIHRoZSB1bmRl cmx5aW5nIHNldCBkYXRhIHdpbGwgb3IKICB3aWxsIG5vdCBiZSBtb2RpZmll ZC4KCiAgQGNsYXNzIFNldAogIEBuYW1lc3BhY2UgRW1iZXIKICBAZXh0ZW5k cyBFbWJlci5Db3JlT2JqZWN0CiAgQHVzZXMgRW1iZXIuTXV0YWJsZUVudW1l cmFibGUKICBAdXNlcyBFbWJlci5Db3B5YWJsZQogIEB1c2VzIEVtYmVyLkZy ZWV6YWJsZQogIEBzaW5jZSBFbWJlciAwLjkKKi8KRW1iZXIuU2V0ID0gRW1i ZXIuQ29yZU9iamVjdC5leHRlbmQoRW1iZXIuTXV0YWJsZUVudW1lcmFibGUs IEVtYmVyLkNvcHlhYmxlLCBFbWJlci5GcmVlemFibGUsCiAgewoKICAvLyAu Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uCiAgLy8gSU1QTEVNRU5UIEVOVU1FUkFCTEUgQVBJUwog IC8vCgogIC8qKgogICAgVGhpcyBwcm9wZXJ0eSB3aWxsIGNoYW5nZSBhcyB0 aGUgbnVtYmVyIG9mIG9iamVjdHMgaW4gdGhlIHNldCBjaGFuZ2VzLgoKICAg IEBwcm9wZXJ0eSBsZW5ndGgKICAgIEB0eXBlIG51bWJlcgogICAgQGRlZmF1 bHQgMAogICovCiAgbGVuZ3RoOiAwLAoKICAvKioKICAgIENsZWFycyB0aGUg c2V0LiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byByZXVzZSBhbiBl eGlzdGluZyBzZXQKICAgIHdpdGhvdXQgaGF2aW5nIHRvIHJlY3JlYXRlIGl0 LgoKICAgIGBgYGphdmFzY3JpcHQKICAgIHZhciBjb2xvcnMgPSBuZXcgRW1i ZXIuU2V0KFsicmVkIiwgImdyZWVuIiwgImJsdWUiXSk7CiAgICBjb2xvcnMu bGVuZ3RoOyAgLy8gMwogICAgY29sb3JzLmNsZWFyKCk7CiAgICBjb2xvcnMu bGVuZ3RoOyAgLy8gMAogICAgYGBgCgogICAgQG1ldGhvZCBjbGVhcgogICAg QHJldHVybiB7RW1iZXIuU2V0fSBBbiBlbXB0eSBTZXQKICAqLwogIGNsZWFy OiBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmlzRnJvemVuKSB7IHRocm93 IG5ldyBFbWJlci5FcnJvcihFbWJlci5GUk9aRU5fRVJST1IpOyB9CgogICAg dmFyIGxlbiA9IGdldCh0aGlzLCAnbGVuZ3RoJyk7CiAgICBpZiAobGVuID09 PSAwKSB7IHJldHVybiB0aGlzOyB9CgogICAgdmFyIGd1aWQ7CgogICAgdGhp cy5lbnVtZXJhYmxlQ29udGVudFdpbGxDaGFuZ2UobGVuLCAwKTsKICAgIEVt YmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAnZmlyc3RPYmplY3QnKTsK ICAgIEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAnbGFzdE9iamVj dCcpOwoKICAgIGZvciAodmFyIGk9MDsgaSA8IGxlbjsgaSsrKSB7CiAgICAg IGd1aWQgPSBndWlkRm9yKHRoaXNbaV0pOwogICAgICBkZWxldGUgdGhpc1tn dWlkXTsKICAgICAgZGVsZXRlIHRoaXNbaV07CiAgICB9CgogICAgc2V0KHRo aXMsICdsZW5ndGgnLCAwKTsKCiAgICBFbWJlci5wcm9wZXJ0eURpZENoYW5n ZSh0aGlzLCAnZmlyc3RPYmplY3QnKTsKICAgIEVtYmVyLnByb3BlcnR5RGlk Q2hhbmdlKHRoaXMsICdsYXN0T2JqZWN0Jyk7CiAgICB0aGlzLmVudW1lcmFi bGVDb250ZW50RGlkQ2hhbmdlKGxlbiwgMCk7CgogICAgcmV0dXJuIHRoaXM7 CiAgfSwKCiAgLyoqCiAgICBSZXR1cm5zIHRydWUgaWYgdGhlIHBhc3NlZCBv YmplY3QgaXMgYWxzbyBhbiBlbnVtZXJhYmxlIHRoYXQgY29udGFpbnMgdGhl CiAgICBzYW1lIG9iamVjdHMgYXMgdGhlIHJlY2VpdmVyLgoKICAgIGBgYGph dmFzY3JpcHQKICAgIHZhciBjb2xvcnMgPSBbInJlZCIsICJncmVlbiIsICJi bHVlIl0sCiAgICAgICAgc2FtZV9jb2xvcnMgPSBuZXcgRW1iZXIuU2V0KGNv bG9ycyk7CgogICAgc2FtZV9jb2xvcnMuaXNFcXVhbChjb2xvcnMpOyAgICAg ICAgICAgICAgIC8vIHRydWUKICAgIHNhbWVfY29sb3JzLmlzRXF1YWwoWyJw dXJwbGUiLCAiYnJvd24iXSk7ICAvLyBmYWxzZQogICAgYGBgCgogICAgQG1l dGhvZCBpc0VxdWFsCiAgICBAcGFyYW0ge0VtYmVyLlNldH0gb2JqIHRoZSBv dGhlciBvYmplY3QuCiAgICBAcmV0dXJuIHtCb29sZWFufQogICovCiAgaXNF cXVhbDogZnVuY3Rpb24ob2JqKSB7CiAgICAvLyBmYWlsIGZhc3QKICAgIGlm ICghRW1iZXIuRW51bWVyYWJsZS5kZXRlY3Qob2JqKSkgcmV0dXJuIGZhbHNl OwoKICAgIHZhciBsb2MgPSBnZXQodGhpcywgJ2xlbmd0aCcpOwogICAgaWYg KGdldChvYmosICdsZW5ndGgnKSAhPT0gbG9jKSByZXR1cm4gZmFsc2U7Cgog ICAgd2hpbGUoLS1sb2MgPj0gMCkgewogICAgICBpZiAoIW9iai5jb250YWlu cyh0aGlzW2xvY10pKSByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcmV0dXJu IHRydWU7CiAgfSwKCiAgLyoqCiAgICBBZGRzIGFuIG9iamVjdCB0byB0aGUg c2V0LiBPbmx5IG5vbi1gbnVsbGAgb2JqZWN0cyBjYW4gYmUgYWRkZWQgdG8g YSBzZXQKICAgIGFuZCB0aG9zZSBjYW4gb25seSBiZSBhZGRlZCBvbmNlLiBJ ZiB0aGUgb2JqZWN0IGlzIGFscmVhZHkgaW4gdGhlIHNldCBvcgogICAgdGhl IHBhc3NlZCB2YWx1ZSBpcyBudWxsIHRoaXMgbWV0aG9kIHdpbGwgaGF2ZSBu byBlZmZlY3QuCgogICAgVGhpcyBpcyBhbiBhbGlhcyBmb3IgYEVtYmVyLk11 dGFibGVFbnVtZXJhYmxlLmFkZE9iamVjdCgpYC4KCiAgICBgYGBqYXZhc2Ny aXB0CiAgICB2YXIgY29sb3JzID0gbmV3IEVtYmVyLlNldCgpOwogICAgY29s b3JzLmFkZCgiYmx1ZSIpOyAgICAgLy8gWyJibHVlIl0KICAgIGNvbG9ycy5h ZGQoImJsdWUiKTsgICAgIC8vIFsiYmx1ZSJdCiAgICBjb2xvcnMuYWRkKCJy ZWQiKTsgICAgICAvLyBbImJsdWUiLCAicmVkIl0KICAgIGNvbG9ycy5hZGQo bnVsbCk7ICAgICAgIC8vIFsiYmx1ZSIsICJyZWQiXQogICAgY29sb3JzLmFk ZCh1bmRlZmluZWQpOyAgLy8gWyJibHVlIiwgInJlZCJdCiAgICBgYGAKCiAg ICBAbWV0aG9kIGFkZAogICAgQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2Jq ZWN0IHRvIGFkZC4KICAgIEByZXR1cm4ge0VtYmVyLlNldH0gVGhlIHNldCBp dHNlbGYuCiAgKi8KICBhZGQ6IEVtYmVyLmFsaWFzTWV0aG9kKCdhZGRPYmpl Y3QnKSwKCiAgLyoqCiAgICBSZW1vdmVzIHRoZSBvYmplY3QgZnJvbSB0aGUg c2V0IGlmIGl0IGlzIGZvdW5kLiBJZiB5b3UgcGFzcyBhIGBudWxsYCB2YWx1 ZQogICAgb3IgYW4gb2JqZWN0IHRoYXQgaXMgYWxyZWFkeSBub3QgaW4gdGhl IHNldCwgdGhpcyBtZXRob2Qgd2lsbCBoYXZlIG5vCiAgICBlZmZlY3QuIFRo aXMgaXMgYW4gYWxpYXMgZm9yIGBFbWJlci5NdXRhYmxlRW51bWVyYWJsZS5y ZW1vdmVPYmplY3QoKWAuCgogICAgYGBgamF2YXNjcmlwdAogICAgdmFyIGNv bG9ycyA9IG5ldyBFbWJlci5TZXQoWyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSJd KTsKICAgIGNvbG9ycy5yZW1vdmUoInJlZCIpOyAgICAgLy8gWyJibHVlIiwg ImdyZWVuIl0KICAgIGNvbG9ycy5yZW1vdmUoInB1cnBsZSIpOyAgLy8gWyJi bHVlIiwgImdyZWVuIl0KICAgIGNvbG9ycy5yZW1vdmUobnVsbCk7ICAgICAg Ly8gWyJibHVlIiwgImdyZWVuIl0KICAgIGBgYAoKICAgIEBtZXRob2QgcmVt b3ZlCiAgICBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcmVt b3ZlCiAgICBAcmV0dXJuIHtFbWJlci5TZXR9IFRoZSBzZXQgaXRzZWxmLgog ICovCiAgcmVtb3ZlOiBFbWJlci5hbGlhc01ldGhvZCgncmVtb3ZlT2JqZWN0 JyksCgogIC8qKgogICAgUmVtb3ZlcyB0aGUgbGFzdCBlbGVtZW50IGZyb20g dGhlIHNldCBhbmQgcmV0dXJucyBpdCwgb3IgYG51bGxgIGlmIGl0J3MgZW1w dHkuCgogICAgYGBgamF2YXNjcmlwdAogICAgdmFyIGNvbG9ycyA9IG5ldyBF bWJlci5TZXQoWyJncmVlbiIsICJibHVlIl0pOwogICAgY29sb3JzLnBvcCgp OyAgLy8gImJsdWUiCiAgICBjb2xvcnMucG9wKCk7ICAvLyAiZ3JlZW4iCiAg ICBjb2xvcnMucG9wKCk7ICAvLyBudWxsCiAgICBgYGAKCiAgICBAbWV0aG9k IHBvcAogICAgQHJldHVybiB7T2JqZWN0fSBUaGUgcmVtb3ZlZCBvYmplY3Qg ZnJvbSB0aGUgc2V0IG9yIG51bGwuCiAgKi8KICBwb3A6IGZ1bmN0aW9uKCkg ewogICAgaWYgKGdldCh0aGlzLCAnaXNGcm96ZW4nKSkgdGhyb3cgbmV3IEVt YmVyLkVycm9yKEVtYmVyLkZST1pFTl9FUlJPUik7CiAgICB2YXIgb2JqID0g dGhpcy5sZW5ndGggPiAwID8gdGhpc1t0aGlzLmxlbmd0aC0xXSA6IG51bGw7 CiAgICB0aGlzLnJlbW92ZShvYmopOwogICAgcmV0dXJuIG9iajsKICB9LAoK ICAvKioKICAgIEluc2VydHMgdGhlIGdpdmVuIG9iamVjdCBvbiB0byB0aGUg ZW5kIG9mIHRoZSBzZXQuIEl0IHJldHVybnMKICAgIHRoZSBzZXQgaXRzZWxm LgoKICAgIFRoaXMgaXMgYW4gYWxpYXMgZm9yIGBFbWJlci5NdXRhYmxlRW51 bWVyYWJsZS5hZGRPYmplY3QoKWAuCgogICAgYGBgamF2YXNjcmlwdAogICAg dmFyIGNvbG9ycyA9IG5ldyBFbWJlci5TZXQoKTsKICAgIGNvbG9ycy5wdXNo KCJyZWQiKTsgICAvLyBbInJlZCJdCiAgICBjb2xvcnMucHVzaCgiZ3JlZW4i KTsgLy8gWyJyZWQiLCAiZ3JlZW4iXQogICAgY29sb3JzLnB1c2goImJsdWUi KTsgIC8vIFsicmVkIiwgImdyZWVuIiwgImJsdWUiXQogICAgYGBgCgogICAg QG1ldGhvZCBwdXNoCiAgICBAcmV0dXJuIHtFbWJlci5TZXR9IFRoZSBzZXQg aXRzZWxmLgogICovCiAgcHVzaDogRW1iZXIuYWxpYXNNZXRob2QoJ2FkZE9i amVjdCcpLAoKICAvKioKICAgIFJlbW92ZXMgdGhlIGxhc3QgZWxlbWVudCBm cm9tIHRoZSBzZXQgYW5kIHJldHVybnMgaXQsIG9yIGBudWxsYCBpZiBpdCdz IGVtcHR5LgoKICAgIFRoaXMgaXMgYW4gYWxpYXMgZm9yIGBFbWJlci5TZXQu cG9wKClgLgoKICAgIGBgYGphdmFzY3JpcHQKICAgIHZhciBjb2xvcnMgPSBu ZXcgRW1iZXIuU2V0KFsiZ3JlZW4iLCAiYmx1ZSJdKTsKICAgIGNvbG9ycy5z aGlmdCgpOyAgLy8gImJsdWUiCiAgICBjb2xvcnMuc2hpZnQoKTsgIC8vICJn cmVlbiIKICAgIGNvbG9ycy5zaGlmdCgpOyAgLy8gbnVsbAogICAgYGBgCgog ICAgQG1ldGhvZCBzaGlmdAogICAgQHJldHVybiB7T2JqZWN0fSBUaGUgcmVt b3ZlZCBvYmplY3QgZnJvbSB0aGUgc2V0IG9yIG51bGwuCiAgKi8KICBzaGlm dDogRW1iZXIuYWxpYXNNZXRob2QoJ3BvcCcpLAoKICAvKioKICAgIEluc2Vy dHMgdGhlIGdpdmVuIG9iamVjdCBvbiB0byB0aGUgZW5kIG9mIHRoZSBzZXQu IEl0IHJldHVybnMKICAgIHRoZSBzZXQgaXRzZWxmLgoKICAgIFRoaXMgaXMg YW4gYWxpYXMgb2YgYEVtYmVyLlNldC5wdXNoKClgCgogICAgYGBgamF2YXNj cmlwdAogICAgdmFyIGNvbG9ycyA9IG5ldyBFbWJlci5TZXQoKTsKICAgIGNv bG9ycy51bnNoaWZ0KCJyZWQiKTsgICAgLy8gWyJyZWQiXQogICAgY29sb3Jz LnVuc2hpZnQoImdyZWVuIik7ICAvLyBbInJlZCIsICJncmVlbiJdCiAgICBj b2xvcnMudW5zaGlmdCgiYmx1ZSIpOyAgIC8vIFsicmVkIiwgImdyZWVuIiwg ImJsdWUiXQogICAgYGBgCgogICAgQG1ldGhvZCB1bnNoaWZ0CiAgICBAcmV0 dXJuIHtFbWJlci5TZXR9IFRoZSBzZXQgaXRzZWxmLgogICovCiAgdW5zaGlm dDogRW1iZXIuYWxpYXNNZXRob2QoJ3B1c2gnKSwKCiAgLyoqCiAgICBBZGRz IGVhY2ggb2JqZWN0IGluIHRoZSBwYXNzZWQgZW51bWVyYWJsZSB0byB0aGUg c2V0LgoKICAgIFRoaXMgaXMgYW4gYWxpYXMgb2YgYEVtYmVyLk11dGFibGVF bnVtZXJhYmxlLmFkZE9iamVjdHMoKWAKCiAgICBgYGBqYXZhc2NyaXB0CiAg ICB2YXIgY29sb3JzID0gbmV3IEVtYmVyLlNldCgpOwogICAgY29sb3JzLmFk ZEVhY2goWyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSJdKTsgIC8vIFsicmVkIiwg ImdyZWVuIiwgImJsdWUiXQogICAgYGBgCgogICAgQG1ldGhvZCBhZGRFYWNo CiAgICBAcGFyYW0ge0VtYmVyLkVudW1lcmFibGV9IG9iamVjdHMgdGhlIG9i amVjdHMgdG8gYWRkLgogICAgQHJldHVybiB7RW1iZXIuU2V0fSBUaGUgc2V0 IGl0c2VsZi4KICAqLwogIGFkZEVhY2g6IEVtYmVyLmFsaWFzTWV0aG9kKCdh ZGRPYmplY3RzJyksCgogIC8qKgogICAgUmVtb3ZlcyBlYWNoIG9iamVjdCBp biB0aGUgcGFzc2VkIGVudW1lcmFibGUgdG8gdGhlIHNldC4KCiAgICBUaGlz IGlzIGFuIGFsaWFzIG9mIGBFbWJlci5NdXRhYmxlRW51bWVyYWJsZS5yZW1v dmVPYmplY3RzKClgCgogICAgYGBgamF2YXNjcmlwdAogICAgdmFyIGNvbG9y cyA9IG5ldyBFbWJlci5TZXQoWyJyZWQiLCAiZ3JlZW4iLCAiYmx1ZSJdKTsK ICAgIGNvbG9ycy5yZW1vdmVFYWNoKFsicmVkIiwgImJsdWUiXSk7ICAvLyAg WyJncmVlbiJdCiAgICBgYGAKCiAgICBAbWV0aG9kIHJlbW92ZUVhY2gKICAg IEBwYXJhbSB7RW1iZXIuRW51bWVyYWJsZX0gb2JqZWN0cyB0aGUgb2JqZWN0 cyB0byByZW1vdmUuCiAgICBAcmV0dXJuIHtFbWJlci5TZXR9IFRoZSBzZXQg aXRzZWxmLgogICovCiAgcmVtb3ZlRWFjaDogRW1iZXIuYWxpYXNNZXRob2Qo J3JlbW92ZU9iamVjdHMnKSwKCiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgogIC8vIFBS SVZBVEUgRU5VTUVSQUJMRSBTVVBQT1JUCiAgLy8KCiAgaW5pdDogZnVuY3Rp b24oaXRlbXMpIHsKICAgIHRoaXMuX3N1cGVyKCk7CiAgICBpZiAoaXRlbXMp IHRoaXMuYWRkT2JqZWN0cyhpdGVtcyk7CiAgfSwKCiAgLy8gaW1wbGVtZW50 IEVtYmVyLkVudW1lcmFibGUKICBuZXh0T2JqZWN0OiBmdW5jdGlvbihpZHgp IHsKICAgIHJldHVybiB0aGlzW2lkeF07CiAgfSwKCiAgLy8gbW9yZSBvcHRp bWl6ZWQgdmVyc2lvbgogIGZpcnN0T2JqZWN0OiBFbWJlci5jb21wdXRlZChm dW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmxlbmd0aCA+IDAgPyB0aGlz WzBdIDogdW5kZWZpbmVkOwogIH0pLAoKICAvLyBtb3JlIG9wdGltaXplZCB2 ZXJzaW9uCiAgbGFzdE9iamVjdDogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24o KSB7CiAgICByZXR1cm4gdGhpcy5sZW5ndGggPiAwID8gdGhpc1t0aGlzLmxl bmd0aC0xXSA6IHVuZGVmaW5lZDsKICB9KSwKCiAgLy8gaW1wbGVtZW50cyBF bWJlci5NdXRhYmxlRW51bWVyYWJsZQogIGFkZE9iamVjdDogZnVuY3Rpb24o b2JqKSB7CiAgICBpZiAoZ2V0KHRoaXMsICdpc0Zyb3plbicpKSB0aHJvdyBu ZXcgRW1iZXIuRXJyb3IoRW1iZXIuRlJPWkVOX0VSUk9SKTsKICAgIGlmIChp c05vbmUob2JqKSkgcmV0dXJuIHRoaXM7IC8vIG5vdGhpbmcgdG8gZG8KCiAg ICB2YXIgZ3VpZCA9IGd1aWRGb3Iob2JqKSwKICAgICAgICBpZHggID0gdGhp c1tndWlkXSwKICAgICAgICBsZW4gID0gZ2V0KHRoaXMsICdsZW5ndGgnKSwK ICAgICAgICBhZGRlZCA7CgogICAgaWYgKGlkeD49MCAmJiBpZHg8bGVuICYm ICh0aGlzW2lkeF0gPT09IG9iaikpIHJldHVybiB0aGlzOyAvLyBhZGRlZAoK ICAgIGFkZGVkID0gW29ial07CgogICAgdGhpcy5lbnVtZXJhYmxlQ29udGVu dFdpbGxDaGFuZ2UobnVsbCwgYWRkZWQpOwogICAgRW1iZXIucHJvcGVydHlX aWxsQ2hhbmdlKHRoaXMsICdsYXN0T2JqZWN0Jyk7CgogICAgbGVuID0gZ2V0 KHRoaXMsICdsZW5ndGgnKTsKICAgIHRoaXNbZ3VpZF0gPSBsZW47CiAgICB0 aGlzW2xlbl0gPSBvYmo7CiAgICBzZXQodGhpcywgJ2xlbmd0aCcsIGxlbisx KTsKCiAgICBFbWJlci5wcm9wZXJ0eURpZENoYW5nZSh0aGlzLCAnbGFzdE9i amVjdCcpOwogICAgdGhpcy5lbnVtZXJhYmxlQ29udGVudERpZENoYW5nZShu dWxsLCBhZGRlZCk7CgogICAgcmV0dXJuIHRoaXM7CiAgfSwKCiAgLy8gaW1w bGVtZW50cyBFbWJlci5NdXRhYmxlRW51bWVyYWJsZQogIHJlbW92ZU9iamVj dDogZnVuY3Rpb24ob2JqKSB7CiAgICBpZiAoZ2V0KHRoaXMsICdpc0Zyb3pl bicpKSB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoRW1iZXIuRlJPWkVOX0VSUk9S KTsKICAgIGlmIChpc05vbmUob2JqKSkgcmV0dXJuIHRoaXM7IC8vIG5vdGhp bmcgdG8gZG8KCiAgICB2YXIgZ3VpZCA9IGd1aWRGb3Iob2JqKSwKICAgICAg ICBpZHggID0gdGhpc1tndWlkXSwKICAgICAgICBsZW4gPSBnZXQodGhpcywg J2xlbmd0aCcpLAogICAgICAgIGlzRmlyc3QgPSBpZHggPT09IDAsCiAgICAg ICAgaXNMYXN0ID0gaWR4ID09PSBsZW4tMSwKICAgICAgICBsYXN0LCByZW1v dmVkOwoKCiAgICBpZiAoaWR4Pj0wICYmIGlkeDxsZW4gJiYgKHRoaXNbaWR4 XSA9PT0gb2JqKSkgewogICAgICByZW1vdmVkID0gW29ial07CgogICAgICB0 aGlzLmVudW1lcmFibGVDb250ZW50V2lsbENoYW5nZShyZW1vdmVkLCBudWxs KTsKICAgICAgaWYgKGlzRmlyc3QpIHsgRW1iZXIucHJvcGVydHlXaWxsQ2hh bmdlKHRoaXMsICdmaXJzdE9iamVjdCcpOyB9CiAgICAgIGlmIChpc0xhc3Qp ICB7IEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCAnbGFzdE9iamVj dCcpOyB9CgogICAgICAvLyBzd2FwIGl0ZW1zIC0gYmFzaWNhbGx5IG1vdmUg dGhlIGl0ZW0gdG8gdGhlIGVuZCBzbyBpdCBjYW4gYmUgcmVtb3ZlZAogICAg ICBpZiAoaWR4IDwgbGVuLTEpIHsKICAgICAgICBsYXN0ID0gdGhpc1tsZW4t MV07CiAgICAgICAgdGhpc1tpZHhdID0gbGFzdDsKICAgICAgICB0aGlzW2d1 aWRGb3IobGFzdCldID0gaWR4OwogICAgICB9CgogICAgICBkZWxldGUgdGhp c1tndWlkXTsKICAgICAgZGVsZXRlIHRoaXNbbGVuLTFdOwogICAgICBzZXQo dGhpcywgJ2xlbmd0aCcsIGxlbi0xKTsKCiAgICAgIGlmIChpc0ZpcnN0KSB7 IEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsICdmaXJzdE9iamVjdCcp OyB9CiAgICAgIGlmIChpc0xhc3QpICB7IEVtYmVyLnByb3BlcnR5RGlkQ2hh bmdlKHRoaXMsICdsYXN0T2JqZWN0Jyk7IH0KICAgICAgdGhpcy5lbnVtZXJh YmxlQ29udGVudERpZENoYW5nZShyZW1vdmVkLCBudWxsKTsKICAgIH0KCiAg ICByZXR1cm4gdGhpczsKICB9LAoKICAvLyBvcHRpbWl6ZWQgdmVyc2lvbgog IGNvbnRhaW5zOiBmdW5jdGlvbihvYmopIHsKICAgIHJldHVybiB0aGlzW2d1 aWRGb3Iob2JqKV0+PTA7CiAgfSwKCiAgY29weTogZnVuY3Rpb24oKSB7CiAg ICB2YXIgQyA9IHRoaXMuY29uc3RydWN0b3IsIHJldCA9IG5ldyBDKCksIGxv YyA9IGdldCh0aGlzLCAnbGVuZ3RoJyk7CiAgICBzZXQocmV0LCAnbGVuZ3Ro JywgbG9jKTsKICAgIHdoaWxlKC0tbG9jPj0wKSB7CiAgICAgIHJldFtsb2Nd ID0gdGhpc1tsb2NdOwogICAgICByZXRbZ3VpZEZvcih0aGlzW2xvY10pXSA9 IGxvYzsKICAgIH0KICAgIHJldHVybiByZXQ7CiAgfSwKCiAgdG9TdHJpbmc6 IGZ1bmN0aW9uKCkgewogICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoLCBpZHgs IGFycmF5ID0gW107CiAgICBmb3IoaWR4ID0gMDsgaWR4IDwgbGVuOyBpZHgr KykgewogICAgICBhcnJheVtpZHhdID0gdGhpc1tpZHhdOwogICAgfQogICAg cmV0dXJuIGZtdCgiRW1iZXIuU2V0PCVAPiIsIFthcnJheS5qb2luKCcsJyld KTsKICB9Cgp9KTsKCn0pKCk7CgoKCihmdW5jdGlvbigpIHsKdmFyIERlZmVy cmVkTWl4aW4gPSBFbWJlci5EZWZlcnJlZE1peGluLCAvLyBtaXhpbnMvZGVm ZXJyZWQKICAgIGdldCA9IEVtYmVyLmdldDsKCnZhciBEZWZlcnJlZCA9IEVt YmVyLk9iamVjdC5leHRlbmQoRGVmZXJyZWRNaXhpbik7CgpEZWZlcnJlZC5y ZW9wZW5DbGFzcyh7CiAgcHJvbWlzZTogZnVuY3Rpb24oY2FsbGJhY2ssIGJp bmRpbmcpIHsKICAgIHZhciBkZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSgp OwogICAgY2FsbGJhY2suY2FsbChiaW5kaW5nLCBkZWZlcnJlZCk7CiAgICBy ZXR1cm4gZGVmZXJyZWQ7CiAgfQp9KTsKCkVtYmVyLkRlZmVycmVkID0gRGVm ZXJyZWQ7Cgp9KSgpOwoKCgooZnVuY3Rpb24oKSB7CnZhciBmb3JFYWNoID0g RW1iZXIuQXJyYXlQb2x5ZmlsbHMuZm9yRWFjaDsKCi8qKgogIEBtb2R1bGUg ZW1iZXIKICBAc3VibW9kdWxlIGVtYmVyLXJ1bnRpbWUKKi8KCnZhciBsb2Fk SG9va3MgPSBFbWJlci5FTlYuRU1CRVJfTE9BRF9IT09LUyB8fCB7fTsKdmFy IGxvYWRlZCA9IHt9OwoKLyoqCiAgRGV0ZWN0cyB3aGVuIGEgc3BlY2lmaWMg cGFja2FnZSBvZiBFbWJlciAoZS5nLiAnRW1iZXIuSGFuZGxlYmFycycpCiAg aGFzIGZ1bGx5IGxvYWRlZCBhbmQgaXMgYXZhaWxhYmxlIGZvciBleHRlbnNp b24uCgogIFRoZSBwcm92aWRlZCBgY2FsbGJhY2tgIHdpbGwgYmUgY2FsbGVk IHdpdGggdGhlIGBuYW1lYCBwYXNzZWQKICByZXNvbHZlZCBmcm9tIGEgc3Ry aW5nIGludG8gdGhlIG9iamVjdDoKCiAgYGBgIGphdmFzY3JpcHQKICBFbWJl ci5vbkxvYWQoJ0VtYmVyLkhhbmRsZWJhcnMnIGZ1bmN0aW9uKGhiYXJzKXsK ICAgIGhiYXJzLnJlZ2lzdGVySGVscGVyKC4uLik7CiAgfSk7CiAgYGBgCgog IEBtZXRob2Qgb25Mb2FkCiAgQGZvciBFbWJlcgogIEBwYXJhbSBuYW1lIHtT dHJpbmd9IG5hbWUgb2YgaG9vawogIEBwYXJhbSBjYWxsYmFjayB7RnVuY3Rp b259IGNhbGxiYWNrIHRvIGJlIGNhbGxlZAoqLwpFbWJlci5vbkxvYWQgPSBm dW5jdGlvbihuYW1lLCBjYWxsYmFjaykgewogIHZhciBvYmplY3Q7CgogIGxv YWRIb29rc1tuYW1lXSA9IGxvYWRIb29rc1tuYW1lXSB8fCBFbWJlci5BKCk7 CiAgbG9hZEhvb2tzW25hbWVdLnB1c2hPYmplY3QoY2FsbGJhY2spOwoKICBp ZiAob2JqZWN0ID0gbG9hZGVkW25hbWVdKSB7CiAgICBjYWxsYmFjayhvYmpl Y3QpOwogIH0KfTsKCi8qKgogIENhbGxlZCB3aGVuIGFuIEVtYmVyLmpzIHBh Y2thZ2UgKGUuZyBFbWJlci5IYW5kbGViYXJzKSBoYXMgZmluaXNoZWQKICBs b2FkaW5nLiBUcmlnZ2VycyBhbnkgY2FsbGJhY2tzIHJlZ2lzdGVyZWQgZm9y IHRoaXMgZXZlbnQuCgogIEBtZXRob2QgcnVuTG9hZEhvb2tzCiAgQGZvciBF bWJlcgogIEBwYXJhbSBuYW1lIHtTdHJpbmd9IG5hbWUgb2YgaG9vawogIEBw YXJhbSBvYmplY3Qge09iamVjdH0gb2JqZWN0IHRvIHBhc3MgdG8gY2FsbGJh Y2tzCiovCkVtYmVyLnJ1bkxvYWRIb29rcyA9IGZ1bmN0aW9uKG5hbWUsIG9i amVjdCkgewogIGxvYWRlZFtuYW1lXSA9IG9iamVjdDsKCiAgaWYgKGxvYWRI b29rc1tuYW1lXSkgewogICAgZm9yRWFjaC5jYWxsKGxvYWRIb29rc1tuYW1l XSwgZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgICAgY2FsbGJhY2sob2JqZWN0 KTsKICAgIH0pOwogIH0KfTsKCn0pKCk7CgoKCihmdW5jdGlvbigpIHsKCn0p KCk7CgoKCihmdW5jdGlvbigpIHsKdmFyIGdldCA9IEVtYmVyLmdldDsKCi8q KgpAbW9kdWxlIGVtYmVyCkBzdWJtb2R1bGUgZW1iZXItcnVudGltZQoqLwoK LyoqCiAgYEVtYmVyLkNvbnRyb2xsZXJNaXhpbmAgcHJvdmlkZXMgYSBzdGFu ZGFyZCBpbnRlcmZhY2UgZm9yIGFsbCBjbGFzc2VzIHRoYXQKICBjb21wb3Nl IEVtYmVyJ3MgY29udHJvbGxlciBsYXllcjogYEVtYmVyLkNvbnRyb2xsZXJg LAogIGBFbWJlci5BcnJheUNvbnRyb2xsZXJgLCBhbmQgYEVtYmVyLk9iamVj dENvbnRyb2xsZXJgLgoKICBAY2xhc3MgQ29udHJvbGxlck1peGluCiAgQG5h bWVzcGFjZSBFbWJlcgogIEB1c2VzIEVtYmVyLkFjdGlvbkhhbmRsZXIKKi8K RW1iZXIuQ29udHJvbGxlck1peGluID0gRW1iZXIuTWl4aW4uY3JlYXRlKEVt YmVyLkFjdGlvbkhhbmRsZXIsIHsKICAvKiBkdWNrdHlwZSBhcyBhIGNvbnRy b2xsZXIgKi8KICBpc0NvbnRyb2xsZXI6IHRydWUsCgogIC8qKgogICAgVGhl IG9iamVjdCB0byB3aGljaCBhY3Rpb25zIGZyb20gdGhlIHZpZXcgc2hvdWxk IGJlIHNlbnQuCgogICAgRm9yIGV4YW1wbGUsIHdoZW4gYSBIYW5kbGViYXJz IHRlbXBsYXRlIHVzZXMgdGhlIGB7e2FjdGlvbn19YCBoZWxwZXIsCiAgICBp dCB3aWxsIGF0dGVtcHQgdG8gc2VuZCB0aGUgYWN0aW9uIHRvIHRoZSB2aWV3 J3MgY29udHJvbGxlcidzIGB0YXJnZXRgLgoKICAgIEJ5IGRlZmF1bHQsIGEg Y29udHJvbGxlcidzIGB0YXJnZXRgIGlzIHNldCB0byB0aGUgcm91dGVyIGFm dGVyIGl0IGlzCiAgICBpbnN0YW50aWF0ZWQgYnkgYEVtYmVyLkFwcGxpY2F0 aW9uI2luaXRpYWxpemVgLgoKICAgIEBwcm9wZXJ0eSB0YXJnZXQKICAgIEBk ZWZhdWx0IG51bGwKICAqLwogIHRhcmdldDogbnVsbCwKCiAgY29udGFpbmVy OiBudWxsLAoKICBwYXJlbnRDb250cm9sbGVyOiBudWxsLAoKICBzdG9yZTog bnVsbCwKCiAgbW9kZWw6IEVtYmVyLmNvbXB1dGVkLmFsaWFzKCdjb250ZW50 JyksCgogIGRlcHJlY2F0ZWRTZW5kSGFuZGxlczogZnVuY3Rpb24oYWN0aW9u TmFtZSkgewogICAgcmV0dXJuICEhdGhpc1thY3Rpb25OYW1lXTsKICB9LAoK ICBkZXByZWNhdGVkU2VuZDogZnVuY3Rpb24oYWN0aW9uTmFtZSkgewogICAg dmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICBF bWJlci5hc3NlcnQoJycgKyB0aGlzICsgIiBoYXMgdGhlIGFjdGlvbiAiICsg YWN0aW9uTmFtZSArICIgYnV0IGl0IGlzIG5vdCBhIGZ1bmN0aW9uIiwgdHlw ZW9mIHRoaXNbYWN0aW9uTmFtZV0gPT09ICdmdW5jdGlvbicpOwogICAgRW1i ZXIuZGVwcmVjYXRlKCdBY3Rpb24gaGFuZGxlcnMgaW1wbGVtZW50ZWQgZGly ZWN0bHkgb24gY29udHJvbGxlcnMgYXJlIGRlcHJlY2F0ZWQgaW4gZmF2b3Ig b2YgYWN0aW9uIGhhbmRsZXJzIG9uIGFuIGBhY3Rpb25zYCBvYmplY3QgKCBh Y3Rpb246IGAnICsgYWN0aW9uTmFtZSArICdgIG9uICcgKyB0aGlzICsgJykn LCBmYWxzZSk7CiAgICB0aGlzW2FjdGlvbk5hbWVdLmFwcGx5KHRoaXMsIGFy Z3MpOwogICAgcmV0dXJuOwogIH0KfSk7CgovKioKICBAY2xhc3MgQ29udHJv bGxlcgogIEBuYW1lc3BhY2UgRW1iZXIKICBAZXh0ZW5kcyBFbWJlci5PYmpl Y3QKICBAdXNlcyBFbWJlci5Db250cm9sbGVyTWl4aW4KKi8KRW1iZXIuQ29u dHJvbGxlciA9IEVtYmVyLk9iamVjdC5leHRlbmQoRW1iZXIuQ29udHJvbGxl ck1peGluKTsKCn0pKCk7CgoKCihmdW5jdGlvbigpIHsKLyoqCkBtb2R1bGUg ZW1iZXIKQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCiovCgp2YXIgZ2V0ID0g RW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsIGZvckVhY2ggPSBFbWJlci5F bnVtZXJhYmxlVXRpbHMuZm9yRWFjaDsKCi8qKgogIGBFbWJlci5Tb3J0YWJs ZU1peGluYCBwcm92aWRlcyBhIHN0YW5kYXJkIGludGVyZmFjZSBmb3IgYXJy YXkgcHJveGllcwogIHRvIHNwZWNpZnkgYSBzb3J0IG9yZGVyIGFuZCBtYWlu dGFpbiB0aGlzIHNvcnRpbmcgd2hlbiBvYmplY3RzIGFyZSBhZGRlZCwKICBy ZW1vdmVkLCBvciB1cGRhdGVkIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGltcGxp Y2l0IG9yZGVyIG9mIHRoZWlyIHVuZGVybHlpbmcKICBjb250ZW50IGFycmF5 OgoKICBgYGBqYXZhc2NyaXB0CiAgc29uZ3MgPSBbCiAgICB7dHJhY2tOdW1i ZXI6IDQsIHRpdGxlOiAnT2ItTGEtRGksIE9iLUxhLURhJ30sCiAgICB7dHJh Y2tOdW1iZXI6IDIsIHRpdGxlOiAnQmFjayBpbiB0aGUgVS5TLlMuUi4nfSwK ICAgIHt0cmFja051bWJlcjogMywgdGl0bGU6ICdHbGFzcyBPbmlvbid9LAog IF07CgogIHNvbmdzQ29udHJvbGxlciA9IEVtYmVyLkFycmF5Q29udHJvbGxl ci5jcmVhdGUoewogICAgY29udGVudDogc29uZ3MsCiAgICBzb3J0UHJvcGVy dGllczogWyd0cmFja051bWJlciddLAogICAgc29ydEFzY2VuZGluZzogdHJ1 ZQogIH0pOwoKICBzb25nc0NvbnRyb2xsZXIuZ2V0KCdmaXJzdE9iamVjdCcp OyAgLy8ge3RyYWNrTnVtYmVyOiAyLCB0aXRsZTogJ0JhY2sgaW4gdGhlIFUu Uy5TLlIuJ30KCiAgc29uZ3NDb250cm9sbGVyLmFkZE9iamVjdCh7dHJhY2tO dW1iZXI6IDEsIHRpdGxlOiAnRGVhciBQcnVkZW5jZSd9KTsKICBzb25nc0Nv bnRyb2xsZXIuZ2V0KCdmaXJzdE9iamVjdCcpOyAgLy8ge3RyYWNrTnVtYmVy OiAxLCB0aXRsZTogJ0RlYXIgUHJ1ZGVuY2UnfQogIGBgYAoKICBJZiB5b3Ug YWRkIG9yIHJlbW92ZSB0aGUgcHJvcGVydGllcyB0byBzb3J0IGJ5IG9yIGNo YW5nZSB0aGUgc29ydCBkaXJlY3Rpb24gdGhlIGNvbnRlbnQKICBzb3J0IG9y ZGVyIHdpbGwgYmUgYXV0b21hdGljYWxseSB1cGRhdGVkLgoKICBgYGBqYXZh c2NyaXB0CiAgc29uZ3NDb250cm9sbGVyLnNldCgnc29ydFByb3BlcnRpZXMn LCBbJ3RpdGxlJ10pOwogIHNvbmdzQ29udHJvbGxlci5nZXQoJ2ZpcnN0T2Jq ZWN0Jyk7IC8vIHt0cmFja051bWJlcjogMiwgdGl0bGU6ICdCYWNrIGluIHRo ZSBVLlMuUy5SLid9CgogIHNvbmdzQ29udHJvbGxlci50b2dnbGVQcm9wZXJ0 eSgnc29ydEFzY2VuZGluZycpOwogIHNvbmdzQ29udHJvbGxlci5nZXQoJ2Zp cnN0T2JqZWN0Jyk7IC8vIHt0cmFja051bWJlcjogNCwgdGl0bGU6ICdPYi1M YS1EaSwgT2ItTGEtRGEnfQogIGBgYAoKICBTb3J0YWJsZU1peGluIHdvcmtz IGJ5IHNvcnRpbmcgdGhlIGFycmFuZ2VkQ29udGVudCBhcnJheSwgd2hpY2gg aXMgdGhlIGFycmF5IHRoYXQKICBhcnJheVByb3h5IGRpc3BsYXlzLiBEdWUg dG8gdGhlIGZhY3QgdGhhdCB0aGUgdW5kZXJseWluZyAnY29udGVudCcgYXJy YXkgaXMgbm90IGNoYW5nZWQsIHRoYXQKICBhcnJheSB3aWxsIG5vdCBkaXNw bGF5IHRoZSBzb3J0ZWQgbGlzdDoKCiAgIGBgYGphdmFzY3JpcHQKICBzb25n c0NvbnRyb2xsZXIuZ2V0KCdjb250ZW50JykuZ2V0KCdmaXJzdE9iamVjdCcp OyAvLyBSZXR1cm5zIHRoZSB1bnNvcnRlZCBvcmlnaW5hbCBjb250ZW50CiAg c29uZ3NDb250cm9sbGVyLmdldCgnZmlyc3RPYmplY3QnKTsgLy8gUmV0dXJu cyB0aGUgc29ydGVkIGNvbnRlbnQuCiAgYGBgIAogIAogIEFsdGhvdWdoIHRo ZSBzb3J0ZWQgY29udGVudCBjYW4gYWxzbyBiZSBhY2Nlc3NlZCB0aHJvdWdo IHRoZSBhcnJhbmdlZENvbnRlbnQgcHJvcGVydHksCiAgaXQgaXMgcHJlZmVy YWJsZSB0byB1c2UgdGhlIHByb3hpZWQgY2xhc3MgYW5kIG5vdCB0aGUgYXJy YW5nZWRDb250ZW50IGFycmF5IGRpcmVjdGx5LgoKICBAY2xhc3MgU29ydGFi bGVNaXhpbgogIEBuYW1lc3BhY2UgRW1iZXIKICBAdXNlcyBFbWJlci5NdXRh YmxlRW51bWVyYWJsZQoqLwpFbWJlci5Tb3J0YWJsZU1peGluID0gRW1iZXIu TWl4aW4uY3JlYXRlKEVtYmVyLk11dGFibGVFbnVtZXJhYmxlLCB7CgogIC8q KgogICAgU3BlY2lmaWVzIHdoaWNoIHByb3BlcnRpZXMgZGljdGF0ZSB0aGUg YXJyYW5nZWRDb250ZW50J3Mgc29ydCBvcmRlci4KCiAgICBXaGVuIHNwZWNp ZnlpbmcgbXVsdGlwbGUgcHJvcGVydGllcyB0aGUgc29ydGluZyB3aWxsIHVz ZSBwcm9wZXJ0aWVzCiAgICBmcm9tIHRoZSBgc29ydFByb3BlcnRpZXNgIGFy cmF5IHByaW9yaXRpemVkIGZyb20gZmlyc3QgdG8gbGFzdC4KCiAgICBAcHJv cGVydHkge0FycmF5fSBzb3J0UHJvcGVydGllcwogICovCiAgc29ydFByb3Bl cnRpZXM6IG51bGwsCgogIC8qKgogICAgU3BlY2lmaWVzIHRoZSBhcnJhbmdl ZENvbnRlbnQncyBzb3J0IGRpcmVjdGlvbgoKICAgIEBwcm9wZXJ0eSB7Qm9v bGVhbn0gc29ydEFzY2VuZGluZwogICovCiAgc29ydEFzY2VuZGluZzogdHJ1 ZSwKCiAgLyoqCiAgICBUaGUgZnVuY3Rpb24gdXNlZCB0byBjb21wYXJlIHR3 byB2YWx1ZXMuIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBpZiB5b3UKICAgIHdh bnQgdG8gZG8gY3VzdG9tIGNvbXBhcmlzb25zLiBGdW5jdGlvbnMgbXVzdCBi ZSBvZiB0aGUgdHlwZSBleHBlY3RlZCBieQogICAgQXJyYXkjc29ydCwgaS5l LgogICAgICByZXR1cm4gMCBpZiB0aGUgdHdvIHBhcmFtZXRlcnMgYXJlIGVx dWFsLAogICAgICByZXR1cm4gYSBuZWdhdGl2ZSB2YWx1ZSBpZiB0aGUgZmly c3QgcGFyYW1ldGVyIGlzIHNtYWxsZXIgdGhhbiB0aGUgc2Vjb25kIG9yCiAg ICAgIHJldHVybiBhIHBvc2l0aXZlIHZhbHVlIG90aGVyd2lzZToKCiAgICBg YGBqYXZhc2NyaXB0CiAgICBmdW5jdGlvbih4LHkpIHsgLy8gVGhlc2UgYXJl IGFzc3VtZWQgdG8gYmUgaW50ZWdlcnMKICAgICAgaWYgKHggPT09IHkpCiAg ICAgICAgcmV0dXJuIDA7CiAgICAgIHJldHVybiB4IDwgeSA/IC0xIDogMTsK ICAgIH0KICAgIGBgYAoKICAgIEBwcm9wZXJ0eSBzb3J0RnVuY3Rpb24KICAg IEB0eXBlIHtGdW5jdGlvbn0KICAgIEBkZWZhdWx0IEVtYmVyLmNvbXBhcmUK ICAqLwogIHNvcnRGdW5jdGlvbjogRW1iZXIuY29tcGFyZSwKCiAgb3JkZXJC eTogZnVuY3Rpb24oaXRlbTEsIGl0ZW0yKSB7CiAgICB2YXIgcmVzdWx0ID0g MCwKICAgICAgICBzb3J0UHJvcGVydGllcyA9IGdldCh0aGlzLCAnc29ydFBy b3BlcnRpZXMnKSwKICAgICAgICBzb3J0QXNjZW5kaW5nID0gZ2V0KHRoaXMs ICdzb3J0QXNjZW5kaW5nJyksCiAgICAgICAgc29ydEZ1bmN0aW9uID0gZ2V0 KHRoaXMsICdzb3J0RnVuY3Rpb24nKTsKCiAgICBFbWJlci5hc3NlcnQoInlv dSBuZWVkIHRvIGRlZmluZSBgc29ydFByb3BlcnRpZXNgIiwgISFzb3J0UHJv cGVydGllcyk7CgogICAgZm9yRWFjaChzb3J0UHJvcGVydGllcywgZnVuY3Rp b24ocHJvcGVydHlOYW1lKSB7CiAgICAgIGlmIChyZXN1bHQgPT09IDApIHsK ICAgICAgICByZXN1bHQgPSBzb3J0RnVuY3Rpb24oZ2V0KGl0ZW0xLCBwcm9w ZXJ0eU5hbWUpLCBnZXQoaXRlbTIsIHByb3BlcnR5TmFtZSkpOwogICAgICAg IGlmICgocmVzdWx0ICE9PSAwKSAmJiAhc29ydEFzY2VuZGluZykgewogICAg ICAgICAgcmVzdWx0ID0gKC0xKSAqIHJlc3VsdDsKICAgICAgICB9CiAgICAg IH0KICAgIH0pOwoKICAgIHJldHVybiByZXN1bHQ7CiAgfSwKCiAgZGVzdHJv eTogZnVuY3Rpb24oKSB7CiAgICB2YXIgY29udGVudCA9IGdldCh0aGlzLCAn Y29udGVudCcpLAogICAgICAgIHNvcnRQcm9wZXJ0aWVzID0gZ2V0KHRoaXMs ICdzb3J0UHJvcGVydGllcycpOwoKICAgIGlmIChjb250ZW50ICYmIHNvcnRQ cm9wZXJ0aWVzKSB7CiAgICAgIGZvckVhY2goY29udGVudCwgZnVuY3Rpb24o aXRlbSkgewogICAgICAgIGZvckVhY2goc29ydFByb3BlcnRpZXMsIGZ1bmN0 aW9uKHNvcnRQcm9wZXJ0eSkgewogICAgICAgICAgRW1iZXIucmVtb3ZlT2Jz ZXJ2ZXIoaXRlbSwgc29ydFByb3BlcnR5LCB0aGlzLCAnY29udGVudEl0ZW1T b3J0UHJvcGVydHlEaWRDaGFuZ2UnKTsKICAgICAgICB9LCB0aGlzKTsKICAg ICAgfSwgdGhpcyk7CiAgICB9CgogICAgcmV0dXJuIHRoaXMuX3N1cGVyKCk7 CiAgfSwKCiAgaXNTb3J0ZWQ6IEVtYmVyLmNvbXB1dGVkLmJvb2woJ3NvcnRQ cm9wZXJ0aWVzJyksCgogIC8qKgogICAgT3ZlcnJpZGVzIHRoZSBkZWZhdWx0 IGFycmFuZ2VkQ29udGVudCBmcm9tIGFycmF5UHJveHkgaW4gb3JkZXIgdG8g c29ydCBieSBzb3J0RnVuY3Rpb24uCiAgICBBbHNvIHNldHMgdXAgb2JzZXJ2 ZXJzIGZvciBlYWNoIHNvcnRQcm9wZXJ0eSBvbiBlYWNoIGl0ZW0gaW4gdGhl IGNvbnRlbnQgQXJyYXkuCiAgICAKICAgIEBwcm9wZXJ0eSBhcnJhbmdlZENv bnRlbnQKICAqLwoKICBhcnJhbmdlZENvbnRlbnQ6IEVtYmVyLmNvbXB1dGVk KCdjb250ZW50JywgJ3NvcnRQcm9wZXJ0aWVzLkBlYWNoJywgZnVuY3Rpb24o a2V5LCB2YWx1ZSkgewogICAgdmFyIGNvbnRlbnQgPSBnZXQodGhpcywgJ2Nv bnRlbnQnKSwKICAgICAgICBpc1NvcnRlZCA9IGdldCh0aGlzLCAnaXNTb3J0 ZWQnKSwKICAgICAgICBzb3J0UHJvcGVydGllcyA9IGdldCh0aGlzLCAnc29y dFByb3BlcnRpZXMnKSwKICAgICAgICBzZWxmID0gdGhpczsKCiAgICBpZiAo Y29udGVudCAmJiBpc1NvcnRlZCkgewogICAgICBjb250ZW50ID0gY29udGVu dC5zbGljZSgpOwogICAgICBjb250ZW50LnNvcnQoZnVuY3Rpb24oaXRlbTEs IGl0ZW0yKSB7CiAgICAgICAgcmV0dXJuIHNlbGYub3JkZXJCeShpdGVtMSwg aXRlbTIpOwogICAgICB9KTsKICAgICAgZm9yRWFjaChjb250ZW50LCBmdW5j dGlvbihpdGVtKSB7CiAgICAgICAgZm9yRWFjaChzb3J0UHJvcGVydGllcywg ZnVuY3Rpb24oc29ydFByb3BlcnR5KSB7CiAgICAgICAgICBFbWJlci5hZGRP YnNlcnZlcihpdGVtLCBzb3J0UHJvcGVydHksIHRoaXMsICdjb250ZW50SXRl bVNvcnRQcm9wZXJ0eURpZENoYW5nZScpOwogICAgICAgIH0sIHRoaXMpOwog ICAgICB9LCB0aGlzKTsKICAgICAgcmV0dXJuIEVtYmVyLkEoY29udGVudCk7 CiAgICB9CgogICAgcmV0dXJuIGNvbnRlbnQ7CiAgfSksCgogIF9jb250ZW50 V2lsbENoYW5nZTogRW1iZXIuYmVmb3JlT2JzZXJ2ZXIoJ2NvbnRlbnQnLCBm dW5jdGlvbigpIHsKICAgIHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250 ZW50JyksCiAgICAgICAgc29ydFByb3BlcnRpZXMgPSBnZXQodGhpcywgJ3Nv cnRQcm9wZXJ0aWVzJyk7CgogICAgaWYgKGNvbnRlbnQgJiYgc29ydFByb3Bl cnRpZXMpIHsKICAgICAgZm9yRWFjaChjb250ZW50LCBmdW5jdGlvbihpdGVt KSB7CiAgICAgICAgZm9yRWFjaChzb3J0UHJvcGVydGllcywgZnVuY3Rpb24o c29ydFByb3BlcnR5KSB7CiAgICAgICAgICBFbWJlci5yZW1vdmVPYnNlcnZl cihpdGVtLCBzb3J0UHJvcGVydHksIHRoaXMsICdjb250ZW50SXRlbVNvcnRQ cm9wZXJ0eURpZENoYW5nZScpOwogICAgICAgIH0sIHRoaXMpOwogICAgICB9 LCB0aGlzKTsKICAgIH0KCiAgICB0aGlzLl9zdXBlcigpOwogIH0pLAoKICBz b3J0QXNjZW5kaW5nV2lsbENoYW5nZTogRW1iZXIuYmVmb3JlT2JzZXJ2ZXIo J3NvcnRBc2NlbmRpbmcnLCBmdW5jdGlvbigpIHsKICAgIHRoaXMuX2xhc3RT b3J0QXNjZW5kaW5nID0gZ2V0KHRoaXMsICdzb3J0QXNjZW5kaW5nJyk7CiAg fSksCgogIHNvcnRBc2NlbmRpbmdEaWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVy KCdzb3J0QXNjZW5kaW5nJywgZnVuY3Rpb24oKSB7CiAgICBpZiAoZ2V0KHRo aXMsICdzb3J0QXNjZW5kaW5nJykgIT09IHRoaXMuX2xhc3RTb3J0QXNjZW5k aW5nKSB7CiAgICAgIHZhciBhcnJhbmdlZENvbnRlbnQgPSBnZXQodGhpcywg J2FycmFuZ2VkQ29udGVudCcpOwogICAgICBhcnJhbmdlZENvbnRlbnQucmV2 ZXJzZU9iamVjdHMoKTsKICAgIH0KICB9KSwKCiAgY29udGVudEFycmF5V2ls bENoYW5nZTogZnVuY3Rpb24oYXJyYXksIGlkeCwgcmVtb3ZlZENvdW50LCBh ZGRlZENvdW50KSB7CiAgICB2YXIgaXNTb3J0ZWQgPSBnZXQodGhpcywgJ2lz U29ydGVkJyk7CgogICAgaWYgKGlzU29ydGVkKSB7CiAgICAgIHZhciBhcnJh bmdlZENvbnRlbnQgPSBnZXQodGhpcywgJ2FycmFuZ2VkQ29udGVudCcpOwog ICAgICB2YXIgcmVtb3ZlZE9iamVjdHMgPSBhcnJheS5zbGljZShpZHgsIGlk eCtyZW1vdmVkQ291bnQpOwogICAgICB2YXIgc29ydFByb3BlcnRpZXMgPSBn ZXQodGhpcywgJ3NvcnRQcm9wZXJ0aWVzJyk7CgogICAgICBmb3JFYWNoKHJl bW92ZWRPYmplY3RzLCBmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgYXJyYW5n ZWRDb250ZW50LnJlbW92ZU9iamVjdChpdGVtKTsKCiAgICAgICAgZm9yRWFj aChzb3J0UHJvcGVydGllcywgZnVuY3Rpb24oc29ydFByb3BlcnR5KSB7CiAg ICAgICAgICBFbWJlci5yZW1vdmVPYnNlcnZlcihpdGVtLCBzb3J0UHJvcGVy dHksIHRoaXMsICdjb250ZW50SXRlbVNvcnRQcm9wZXJ0eURpZENoYW5nZScp OwogICAgICAgIH0sIHRoaXMpOwogICAgICB9LCB0aGlzKTsKICAgIH0KCiAg ICByZXR1cm4gdGhpcy5fc3VwZXIoYXJyYXksIGlkeCwgcmVtb3ZlZENvdW50 LCBhZGRlZENvdW50KTsKICB9LAoKICBjb250ZW50QXJyYXlEaWRDaGFuZ2U6 IGZ1bmN0aW9uKGFycmF5LCBpZHgsIHJlbW92ZWRDb3VudCwgYWRkZWRDb3Vu dCkgewogICAgdmFyIGlzU29ydGVkID0gZ2V0KHRoaXMsICdpc1NvcnRlZCcp LAogICAgICAgIHNvcnRQcm9wZXJ0aWVzID0gZ2V0KHRoaXMsICdzb3J0UHJv cGVydGllcycpOwoKICAgIGlmIChpc1NvcnRlZCkgewogICAgICB2YXIgYWRk ZWRPYmplY3RzID0gYXJyYXkuc2xpY2UoaWR4LCBpZHgrYWRkZWRDb3VudCk7 CgogICAgICBmb3JFYWNoKGFkZGVkT2JqZWN0cywgZnVuY3Rpb24oaXRlbSkg ewogICAgICAgIHRoaXMuaW5zZXJ0SXRlbVNvcnRlZChpdGVtKTsKCiAgICAg ICAgZm9yRWFjaChzb3J0UHJvcGVydGllcywgZnVuY3Rpb24oc29ydFByb3Bl cnR5KSB7CiAgICAgICAgICBFbWJlci5hZGRPYnNlcnZlcihpdGVtLCBzb3J0 UHJvcGVydHksIHRoaXMsICdjb250ZW50SXRlbVNvcnRQcm9wZXJ0eURpZENo YW5nZScpOwogICAgICAgIH0sIHRoaXMpOwogICAgICB9LCB0aGlzKTsKICAg IH0KCiAgICByZXR1cm4gdGhpcy5fc3VwZXIoYXJyYXksIGlkeCwgcmVtb3Zl ZENvdW50LCBhZGRlZENvdW50KTsKICB9LAoKICBpbnNlcnRJdGVtU29ydGVk OiBmdW5jdGlvbihpdGVtKSB7CiAgICB2YXIgYXJyYW5nZWRDb250ZW50ID0g Z2V0KHRoaXMsICdhcnJhbmdlZENvbnRlbnQnKTsKICAgIHZhciBsZW5ndGgg PSBnZXQoYXJyYW5nZWRDb250ZW50LCAnbGVuZ3RoJyk7CgogICAgdmFyIGlk eCA9IHRoaXMuX2JpbmFyeVNlYXJjaChpdGVtLCAwLCBsZW5ndGgpOwogICAg YXJyYW5nZWRDb250ZW50Lmluc2VydEF0KGlkeCwgaXRlbSk7CiAgfSwKCiAg Y29udGVudEl0ZW1Tb3J0UHJvcGVydHlEaWRDaGFuZ2U6IGZ1bmN0aW9uKGl0 ZW0pIHsKICAgIHZhciBhcnJhbmdlZENvbnRlbnQgPSBnZXQodGhpcywgJ2Fy cmFuZ2VkQ29udGVudCcpLAogICAgICAgIG9sZEluZGV4ID0gYXJyYW5nZWRD b250ZW50LmluZGV4T2YoaXRlbSksCiAgICAgICAgbGVmdEl0ZW0gPSBhcnJh bmdlZENvbnRlbnQub2JqZWN0QXQob2xkSW5kZXggLSAxKSwKICAgICAgICBy aWdodEl0ZW0gPSBhcnJhbmdlZENvbnRlbnQub2JqZWN0QXQob2xkSW5kZXgg KyAxKSwKICAgICAgICBsZWZ0UmVzdWx0ID0gbGVmdEl0ZW0gJiYgdGhpcy5v cmRlckJ5KGl0ZW0sIGxlZnRJdGVtKSwKICAgICAgICByaWdodFJlc3VsdCA9 IHJpZ2h0SXRlbSAmJiB0aGlzLm9yZGVyQnkoaXRlbSwgcmlnaHRJdGVtKTsK CiAgICBpZiAobGVmdFJlc3VsdCA8IDAgfHwgcmlnaHRSZXN1bHQgPiAwKSB7 CiAgICAgIGFycmFuZ2VkQ29udGVudC5yZW1vdmVPYmplY3QoaXRlbSk7CiAg ICAgIHRoaXMuaW5zZXJ0SXRlbVNvcnRlZChpdGVtKTsKICAgIH0KICB9LAoK ICBfYmluYXJ5U2VhcmNoOiBmdW5jdGlvbihpdGVtLCBsb3csIGhpZ2gpIHsK ICAgIHZhciBtaWQsIG1pZEl0ZW0sIHJlcywgYXJyYW5nZWRDb250ZW50OwoK ICAgIGlmIChsb3cgPT09IGhpZ2gpIHsKICAgICAgcmV0dXJuIGxvdzsKICAg IH0KCiAgICBhcnJhbmdlZENvbnRlbnQgPSBnZXQodGhpcywgJ2FycmFuZ2Vk Q29udGVudCcpOwoKICAgIG1pZCA9IGxvdyArIE1hdGguZmxvb3IoKGhpZ2gg LSBsb3cpIC8gMik7CiAgICBtaWRJdGVtID0gYXJyYW5nZWRDb250ZW50Lm9i amVjdEF0KG1pZCk7CgogICAgcmVzID0gdGhpcy5vcmRlckJ5KG1pZEl0ZW0s IGl0ZW0pOwoKICAgIGlmIChyZXMgPCAwKSB7CiAgICAgIHJldHVybiB0aGlz Ll9iaW5hcnlTZWFyY2goaXRlbSwgbWlkKzEsIGhpZ2gpOwogICAgfSBlbHNl IGlmIChyZXMgPiAwKSB7CiAgICAgIHJldHVybiB0aGlzLl9iaW5hcnlTZWFy Y2goaXRlbSwgbG93LCBtaWQpOwogICAgfQoKICAgIHJldHVybiBtaWQ7CiAg fQp9KTsKCn0pKCk7CgoKCihmdW5jdGlvbigpIHsKLyoqCkBtb2R1bGUgZW1i ZXIKQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCiovCgp2YXIgZ2V0ID0gRW1i ZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsIGZvckVhY2ggPSBFbWJlci5FbnVt ZXJhYmxlVXRpbHMuZm9yRWFjaCwKICAgIHJlcGxhY2UgPSBFbWJlci5FbnVt ZXJhYmxlVXRpbHMucmVwbGFjZTsKCi8qKgogIGBFbWJlci5BcnJheUNvbnRy b2xsZXJgIHByb3ZpZGVzIGEgd2F5IGZvciB5b3UgdG8gcHVibGlzaCBhIGNv bGxlY3Rpb24gb2YKICBvYmplY3RzIHNvIHRoYXQgeW91IGNhbiBlYXNpbHkg YmluZCB0byB0aGUgY29sbGVjdGlvbiBmcm9tIGEgSGFuZGxlYmFycwogIGAj ZWFjaGAgaGVscGVyLCBhbiBgRW1iZXIuQ29sbGVjdGlvblZpZXdgLCBvciBv dGhlciBjb250cm9sbGVycy4KCiAgVGhlIGFkdmFudGFnZSBvZiB1c2luZyBh biBgQXJyYXlDb250cm9sbGVyYCBpcyB0aGF0IHlvdSBvbmx5IGhhdmUgdG8g c2V0IHVwCiAgeW91ciB2aWV3IGJpbmRpbmdzIG9uY2U7IHRvIGNoYW5nZSB3 aGF0J3MgZGlzcGxheWVkLCBzaW1wbHkgc3dhcCBvdXQgdGhlCiAgYGNvbnRl bnRgIHByb3BlcnR5IG9uIHRoZSBjb250cm9sbGVyLgoKICBGb3IgZXhhbXBs ZSwgaW1hZ2luZSB5b3Ugd2FudGVkIHRvIGRpc3BsYXkgYSBsaXN0IG9mIGl0 ZW1zIGZldGNoZWQgdmlhIGFuIFhIUgogIHJlcXVlc3QuIENyZWF0ZSBhbiBg RW1iZXIuQXJyYXlDb250cm9sbGVyYCBhbmQgc2V0IGl0cyBgY29udGVudGAg cHJvcGVydHk6CgogIGBgYGphdmFzY3JpcHQKICBNeUFwcC5saXN0Q29udHJv bGxlciA9IEVtYmVyLkFycmF5Q29udHJvbGxlci5jcmVhdGUoKTsKCiAgJC5n ZXQoJ3Blb3BsZS5qc29uJywgZnVuY3Rpb24oZGF0YSkgewogICAgTXlBcHAu bGlzdENvbnRyb2xsZXIuc2V0KCdjb250ZW50JywgZGF0YSk7CiAgfSk7CiAg YGBgCgogIFRoZW4sIGNyZWF0ZSBhIHZpZXcgdGhhdCBiaW5kcyB0byB5b3Vy IG5ldyBjb250cm9sbGVyOgoKICBgYGBoYW5kbGViYXJzCiAge3sjZWFjaCBN eUFwcC5saXN0Q29udHJvbGxlcn19CiAgICB7e2ZpcnN0TmFtZX19IHt7bGFz dE5hbWV9fQogIHt7L2VhY2h9fQogIGBgYAoKICBBbHRob3VnaCB5b3UgYXJl IGJpbmRpbmcgdG8gdGhlIGNvbnRyb2xsZXIsIHRoZSBiZWhhdmlvciBvZiB0 aGlzIGNvbnRyb2xsZXIKICBpcyB0byBwYXNzIHRocm91Z2ggYW55IG1ldGhv ZHMgb3IgcHJvcGVydGllcyB0byB0aGUgdW5kZXJseWluZyBhcnJheS4gVGhp cwogIGNhcGFiaWxpdHkgY29tZXMgZnJvbSBgRW1iZXIuQXJyYXlQcm94eWAs IHdoaWNoIHRoaXMgY2xhc3MgaW5oZXJpdHMgZnJvbS4KCiAgU29tZXRpbWVz IHlvdSB3YW50IHRvIGRpc3BsYXkgY29tcHV0ZWQgcHJvcGVydGllcyB3aXRo aW4gdGhlIGJvZHkgb2YgYW4KICBgI2VhY2hgIGhlbHBlciB0aGF0IGRlcGVu ZCBvbiB0aGUgdW5kZXJseWluZyBpdGVtcyBpbiBgY29udGVudGAsIGJ1dCBh cmUgbm90CiAgcHJlc2VudCBvbiB0aG9zZSBpdGVtcy4gICBUbyBkbyB0aGlz LCBzZXQgYGl0ZW1Db250cm9sbGVyYCB0byB0aGUgbmFtZSBvZiBhCiAgY29u dHJvbGxlciAocHJvYmFibHkgYW4gYE9iamVjdENvbnRyb2xsZXJgKSB0aGF0 IHdpbGwgd3JhcCBlYWNoIGluZGl2aWR1YWwgaXRlbS4KCiAgRm9yIGV4YW1w bGU6CgogIGBgYGhhbmRsZWJhcnMKICAgIHt7I2VhY2ggcG9zdCBpbiBjb250 cm9sbGVyfX0KICAgICAgPGxpPnt7dGl0bGV9fSAoe3t0aXRsZUxlbmd0aH19 IGNoYXJhY3RlcnMpPC9saT4KICAgIHt7L2VhY2h9fQogIGBgYAoKICBgYGBq YXZhc2NyaXB0CiAgQXBwLlBvc3RzQ29udHJvbGxlciA9IEVtYmVyLkFycmF5 Q29udHJvbGxlci5leHRlbmQoewogICAgaXRlbUNvbnRyb2xsZXI6ICdwb3N0 JwogIH0pOwoKICBBcHAuUG9zdENvbnRyb2xsZXIgPSBFbWJlci5PYmplY3RD b250cm9sbGVyLmV4dGVuZCh7CiAgICAvLyB0aGUgYHRpdGxlYCBwcm9wZXJ0 eSB3aWxsIGJlIHByb3hpZWQgdG8gdGhlIHVuZGVybHlpbmcgcG9zdC4KCiAg ICB0aXRsZUxlbmd0aDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlz LmdldCgndGl0bGUnKS5sZW5ndGg7CiAgICB9LnByb3BlcnR5KCd0aXRsZScp CiAgfSk7CiAgYGBgCgogIEluIHNvbWUgY2FzZXMgaXQgaXMgaGVscGZ1bCB0 byByZXR1cm4gYSBkaWZmZXJlbnQgYGl0ZW1Db250cm9sbGVyYCBkZXBlbmRp bmcKICBvbiB0aGUgcGFydGljdWxhciBpdGVtLiAgU3ViY2xhc3NlcyBjYW4g ZG8gdGhpcyBieSBvdmVycmlkaW5nCiAgYGxvb2t1cEl0ZW1Db250cm9sbGVy YC4KCiAgRm9yIGV4YW1wbGU6CgogIGBgYGphdmFzY3JpcHQKICBBcHAuTXlB cnJheUNvbnRyb2xsZXIgPSBFbWJlci5BcnJheUNvbnRyb2xsZXIuZXh0ZW5k KHsKICAgIGxvb2t1cEl0ZW1Db250cm9sbGVyOiBmdW5jdGlvbiggb2JqZWN0 ICkgewogICAgICBpZiAob2JqZWN0LmdldCgnaXNTcGVjaWFsJykpIHsKICAg ICAgICByZXR1cm4gInNwZWNpYWwiOyAvLyB1c2UgQXBwLlNwZWNpYWxDb250 cm9sbGVyCiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICJyZWd1bGFy IjsgLy8gdXNlIEFwcC5SZWd1bGFyQ29udHJvbGxlcgogICAgICB9CiAgICB9 CiAgfSk7CiAgYGBgCgogIFRoZSBpdGVtQ29udHJvbGxlciBpbnN0YW5jZXMg d2lsbCBoYXZlIGEgYHBhcmVudENvbnRyb2xsZXJgIHByb3BlcnR5IHNldCB0 bwogIHRoZSBgQXJyYXlDb250cm9sbGVyYCBpbnN0YW5jZS4KCiAgQGNsYXNz IEFycmF5Q29udHJvbGxlcgogIEBuYW1lc3BhY2UgRW1iZXIKICBAZXh0ZW5k cyBFbWJlci5BcnJheVByb3h5CiAgQHVzZXMgRW1iZXIuU29ydGFibGVNaXhp bgogIEB1c2VzIEVtYmVyLkNvbnRyb2xsZXJNaXhpbgoqLwoKRW1iZXIuQXJy YXlDb250cm9sbGVyID0gRW1iZXIuQXJyYXlQcm94eS5leHRlbmQoRW1iZXIu Q29udHJvbGxlck1peGluLAogIEVtYmVyLlNvcnRhYmxlTWl4aW4sIHsKCiAg LyoqCiAgICBUaGUgY29udHJvbGxlciB1c2VkIHRvIHdyYXAgaXRlbXMsIGlm IGFueS4KCiAgICBAcHJvcGVydHkgaXRlbUNvbnRyb2xsZXIKICAgIEB0eXBl IFN0cmluZwogICAgQGRlZmF1bHQgbnVsbAogICovCiAgaXRlbUNvbnRyb2xs ZXI6IG51bGwsCgogIC8qKgogICAgUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBj b250cm9sbGVyIHRvIHdyYXAgaXRlbXMsIG9yIGBudWxsYCBpZiBpdGVtcyBz aG91bGQKICAgIGJlIHJldHVybmVkIGRpcmVjdGx5LiAgVGhlIGRlZmF1bHQg aW1wbGVtZW50YXRpb24gc2ltcGx5IHJldHVybnMgdGhlCiAgICBgaXRlbUNv bnRyb2xsZXJgIHByb3BlcnR5LCBidXQgc3ViY2xhc3NlcyBjYW4gb3ZlcnJp ZGUgdGhpcyBtZXRob2QgdG8gcmV0dXJuCiAgICBkaWZmZXJlbnQgY29udHJv bGxlcnMgZm9yIGRpZmZlcmVudCBvYmplY3RzLgoKICAgIEZvciBleGFtcGxl OgoKICAgIGBgYGphdmFzY3JpcHQKICAgIEFwcC5NeUFycmF5Q29udHJvbGxl ciA9IEVtYmVyLkFycmF5Q29udHJvbGxlci5leHRlbmQoewogICAgICBsb29r dXBJdGVtQ29udHJvbGxlcjogZnVuY3Rpb24oIG9iamVjdCApIHsKICAgICAg ICBpZiAob2JqZWN0LmdldCgnaXNTcGVjaWFsJykpIHsKICAgICAgICAgIHJl dHVybiAic3BlY2lhbCI7IC8vIHVzZSBBcHAuU3BlY2lhbENvbnRyb2xsZXIK ICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuICJyZWd1bGFyIjsg Ly8gdXNlIEFwcC5SZWd1bGFyQ29udHJvbGxlcgogICAgICAgIH0KICAgICAg fQogICAgfSk7CiAgICBgYGAKCiAgICBAbWV0aG9kIGxvb2t1cEl0ZW1Db250 cm9sbGVyCiAgICBAcGFyYW0ge09iamVjdH0gb2JqZWN0CiAgICBAcmV0dXJu IHtTdHJpbmd9CiAgKi8KICBsb29rdXBJdGVtQ29udHJvbGxlcjogZnVuY3Rp b24ob2JqZWN0KSB7CiAgICByZXR1cm4gZ2V0KHRoaXMsICdpdGVtQ29udHJv bGxlcicpOwogIH0sCgogIG9iamVjdEF0Q29udGVudDogZnVuY3Rpb24oaWR4 KSB7CiAgICB2YXIgbGVuZ3RoID0gZ2V0KHRoaXMsICdsZW5ndGgnKSwKICAg ICAgICBhcnJhbmdlZENvbnRlbnQgPSBnZXQodGhpcywnYXJyYW5nZWRDb250 ZW50JyksCiAgICAgICAgb2JqZWN0ID0gYXJyYW5nZWRDb250ZW50ICYmIGFy cmFuZ2VkQ29udGVudC5vYmplY3RBdChpZHgpOwoKICAgIGlmIChpZHggPj0g MCAmJiBpZHggPCBsZW5ndGgpIHsKICAgICAgdmFyIGNvbnRyb2xsZXJDbGFz cyA9IHRoaXMubG9va3VwSXRlbUNvbnRyb2xsZXIob2JqZWN0KTsKICAgICAg aWYgKGNvbnRyb2xsZXJDbGFzcykgewogICAgICAgIHJldHVybiB0aGlzLmNv bnRyb2xsZXJBdChpZHgsIG9iamVjdCwgY29udHJvbGxlckNsYXNzKTsKICAg ICAgfQogICAgfQoKICAgIC8vIFdoZW4gYGNvbnRyb2xsZXJDbGFzc2AgaXMg ZmFsc3ksIHdlIGhhdmUgbm90IG9wdGVkIGluIHRvIHVzaW5nIGl0ZW0KICAg IC8vIGNvbnRyb2xsZXJzLCBzbyByZXR1cm4gdGhlIG9iamVjdCBkaXJlY3Rs eS4KCiAgICAvLyBXaGVuIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UsIHdl IHdhbnQgdG8gcmV0dXJuIHRoZSAib3V0IG9mIHJhbmdlIgogICAgLy8gdmFs dWUsIHdoYXRldmVyIHRoYXQgbWlnaHQgYmUuICBSYXRoZXIgdGhhbiBtYWtl IGFzc3VtcHRpb25zCiAgICAvLyAoZS5nLiBndWVzc2luZyBgbnVsbGAgb3Ig YHVuZGVmaW5lZGApIHdlIGRlZmVyIHRoaXMgdG8gYGFycmFuZ2VkQ29udGVu dGAuCiAgICByZXR1cm4gb2JqZWN0OwogIH0sCgogIGFycmFuZ2VkQ29udGVu dERpZENoYW5nZTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9zdXBlcigpOwog ICAgdGhpcy5fcmVzZXRTdWJDb250cm9sbGVycygpOwogIH0sCgogIGFycmF5 Q29udGVudERpZENoYW5nZTogZnVuY3Rpb24oaWR4LCByZW1vdmVkQ250LCBh ZGRlZENudCkgewogICAgdmFyIHN1YkNvbnRyb2xsZXJzID0gZ2V0KHRoaXMs ICdfc3ViQ29udHJvbGxlcnMnKSwKICAgICAgICBzdWJDb250cm9sbGVyc1Rv UmVtb3ZlID0gc3ViQ29udHJvbGxlcnMuc2xpY2UoaWR4LCBpZHgrcmVtb3Zl ZENudCk7CgogICAgZm9yRWFjaChzdWJDb250cm9sbGVyc1RvUmVtb3ZlLCBm dW5jdGlvbihzdWJDb250cm9sbGVyKSB7CiAgICAgIGlmIChzdWJDb250cm9s bGVyKSB7IHN1YkNvbnRyb2xsZXIuZGVzdHJveSgpOyB9CiAgICB9KTsKCiAg ICByZXBsYWNlKHN1YkNvbnRyb2xsZXJzLCBpZHgsIHJlbW92ZWRDbnQsIG5l dyBBcnJheShhZGRlZENudCkpOwoKICAgIC8vIFRoZSBzaGFkb3cgYXJyYXkg b2Ygc3ViY29udHJvbGxlcnMgbXVzdCBiZSB1cGRhdGVkIGJlZm9yZSB3ZSB0 cmlnZ2VyCiAgICAvLyBvYnNlcnZlcnMsIG90aGVyd2lzZSBvYnNlcnZlcnMg d2lsbCBnZXQgdGhlIHdyb25nIHN1YmNvbnRhaW5lciB3aGVuCiAgICAvLyBj YWxsaW5nIGBvYmplY3RBdGAKICAgIHRoaXMuX3N1cGVyKGlkeCwgcmVtb3Zl ZENudCwgYWRkZWRDbnQpOwogIH0sCgogIGluaXQ6IGZ1bmN0aW9uKCkgewog ICAgdGhpcy5fc3VwZXIoKTsKCiAgICB0aGlzLnNldCgnX3N1YkNvbnRyb2xs ZXJzJywgRW1iZXIuQSgpKTsKICB9LAoKICBjb250ZW50OiBFbWJlci5jb21w dXRlZChmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gRW1iZXIuQSgpOwogIH0p LAoKICAvKioKICAgKiBGbGFnIHRvIG1hcmsgYXMgYmVpbmcgInZpcnR1YWwi LiBVc2VkIHRvIGtlZXAgdGhpcyBpbnN0YW5jZQogICAqIGZyb20gcGFydGlj aXBhdGluZyBpbiB0aGUgcGFyZW50Q29udHJvbGxlciBoaWVyYXJjaHkuCiAg ICoKICAgKiBAcHJpdmF0ZQogICAqIEB0eXBlIEJvb2xlYW4KICAgKi8KICBf aXNWaXJ0dWFsOiBmYWxzZSwKCiAgY29udHJvbGxlckF0OiBmdW5jdGlvbihp ZHgsIG9iamVjdCwgY29udHJvbGxlckNsYXNzKSB7CiAgICB2YXIgY29udGFp bmVyID0gZ2V0KHRoaXMsICdjb250YWluZXInKSwKICAgICAgICBzdWJDb250 cm9sbGVycyA9IGdldCh0aGlzLCAnX3N1YkNvbnRyb2xsZXJzJyksCiAgICAg ICAgc3ViQ29udHJvbGxlciA9IHN1YkNvbnRyb2xsZXJzW2lkeF0sCiAgICAg ICAgZnVsbE5hbWU7CgogICAgaWYgKHN1YkNvbnRyb2xsZXIpIHsgcmV0dXJu IHN1YkNvbnRyb2xsZXI7IH0KCiAgICBmdWxsTmFtZSA9ICJjb250cm9sbGVy OiIgKyBjb250cm9sbGVyQ2xhc3M7CgogICAgaWYgKCFjb250YWluZXIuaGFz KGZ1bGxOYW1lKSkgewogICAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoJ0Nv dWxkIG5vdCByZXNvbHZlIGl0ZW1Db250cm9sbGVyOiAiJyArIGNvbnRyb2xs ZXJDbGFzcyArICciJyk7CiAgICB9CiAgICB2YXIgcGFyZW50Q29udHJvbGxl cjsKICAgIGlmICh0aGlzLl9pc1ZpcnR1YWwpIHsKICAgICAgcGFyZW50Q29u dHJvbGxlciA9IGdldCh0aGlzLCAncGFyZW50Q29udHJvbGxlcicpOwogICAg fQogICAgcGFyZW50Q29udHJvbGxlciA9IHBhcmVudENvbnRyb2xsZXIgfHwg dGhpczsKICAgIHN1YkNvbnRyb2xsZXIgPSBjb250YWluZXIubG9va3VwRmFj dG9yeShmdWxsTmFtZSkuY3JlYXRlKHsKICAgICAgdGFyZ2V0OiB0aGlzLAog ICAgICBwYXJlbnRDb250cm9sbGVyOiBwYXJlbnRDb250cm9sbGVyLAogICAg ICBjb250ZW50OiBvYmplY3QKICAgIH0pOwoKICAgIHN1YkNvbnRyb2xsZXJz W2lkeF0gPSBzdWJDb250cm9sbGVyOwoKICAgIHJldHVybiBzdWJDb250cm9s bGVyOwogIH0sCgogIF9zdWJDb250cm9sbGVyczogbnVsbCwKCiAgX3Jlc2V0 U3ViQ29udHJvbGxlcnM6IGZ1bmN0aW9uKCkgewogICAgdmFyIHN1YkNvbnRy b2xsZXJzID0gZ2V0KHRoaXMsICdfc3ViQ29udHJvbGxlcnMnKTsKICAgIGlm IChzdWJDb250cm9sbGVycykgewogICAgICBmb3JFYWNoKHN1YkNvbnRyb2xs ZXJzLCBmdW5jdGlvbihzdWJDb250cm9sbGVyKSB7CiAgICAgICAgaWYgKHN1 YkNvbnRyb2xsZXIpIHsgc3ViQ29udHJvbGxlci5kZXN0cm95KCk7IH0KICAg ICAgfSk7CiAgICB9CgogICAgdGhpcy5zZXQoJ19zdWJDb250cm9sbGVycycs IEVtYmVyLkEoKSk7CiAgfQp9KTsKCn0pKCk7CgoKCihmdW5jdGlvbigpIHsK LyoqCkBtb2R1bGUgZW1iZXIKQHN1Ym1vZHVsZSBlbWJlci1ydW50aW1lCiov CgovKioKICBgRW1iZXIuT2JqZWN0Q29udHJvbGxlcmAgaXMgcGFydCBvZiBF bWJlcidzIENvbnRyb2xsZXIgbGF5ZXIuIEl0IGlzIGludGVuZGVkCiAgdG8g d3JhcCBhIHNpbmdsZSBvYmplY3QsIHByb3h5aW5nIHVuaGFuZGxlZCBhdHRl bXB0cyB0byBgZ2V0YCBhbmQgYHNldGAgdG8gdGhlIHVuZGVybHlpbmcKICBj b250ZW50IG9iamVjdCwgYW5kIHRvIGZvcndhcmQgdW5oYW5kbGVkIGFjdGlv biBhdHRlbXB0cyB0byBpdHMgYHRhcmdldGAuCgogIGBFbWJlci5PYmplY3RD b250cm9sbGVyYCBkZXJpdmVzIHRoaXMgZnVuY3Rpb25hbGl0eSBmcm9tIGl0 cyBzdXBlcmNsYXNzCiAgYEVtYmVyLk9iamVjdFByb3h5YCBhbmQgdGhlIGBF bWJlci5Db250cm9sbGVyTWl4aW5gIG1peGluLgoKICBAY2xhc3MgT2JqZWN0 Q29udHJvbGxlcgogIEBuYW1lc3BhY2UgRW1iZXIKICBAZXh0ZW5kcyBFbWJl ci5PYmplY3RQcm94eQogIEB1c2VzIEVtYmVyLkNvbnRyb2xsZXJNaXhpbgoq Ki8KRW1iZXIuT2JqZWN0Q29udHJvbGxlciA9IEVtYmVyLk9iamVjdFByb3h5 LmV4dGVuZChFbWJlci5Db250cm9sbGVyTWl4aW4pOwoKfSkoKTsKCgoKKGZ1 bmN0aW9uKCkgewoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewovKioKRW1iZXIg UnVudGltZQoKQG1vZHVsZSBlbWJlcgpAc3VibW9kdWxlIGVtYmVyLXJ1bnRp bWUKQHJlcXVpcmVzIGVtYmVyLW1ldGFsCiovCgp9KSgpOwoKKGZ1bmN0aW9u KCkgewovKioKQG1vZHVsZSBlbWJlcgpAc3VibW9kdWxlIGVtYmVyLXZpZXdz CiovCgp2YXIgalF1ZXJ5ID0gKHRoaXMgJiYgdGhpcy5qUXVlcnkpIHx8IChF bWJlci5pbXBvcnRzICYmIEVtYmVyLmltcG9ydHMualF1ZXJ5KTsKaWYgKCFq UXVlcnkgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicpIHsKICBq UXVlcnkgPSByZXF1aXJlKCdqcXVlcnknKTsKfQoKRW1iZXIuYXNzZXJ0KCJF bWJlciBWaWV3cyByZXF1aXJlIGpRdWVyeSBiZXR3ZWVuIDEuNyBhbmQgMi4x IiwgalF1ZXJ5ICYmIChqUXVlcnkoKS5qcXVlcnkubWF0Y2goL14oKDFcLig3 fDh8OXwxMHwxMSkpfCgyXC4oMHwxKSkpKFwuXGQrKT8ocHJlfHJjXGQ/KT8v KSB8fCBFbWJlci5FTlYuRk9SQ0VfSlFVRVJZKSk7CgovKioKICBBbGlhcyBm b3IgalF1ZXJ5CgogIEBtZXRob2QgJAogIEBmb3IgRW1iZXIKKi8KRW1iZXIu JCA9IGpRdWVyeTsKCn0pKCk7CgoKCihmdW5jdGlvbigpIHsKLyoqCkBtb2R1 bGUgZW1iZXIKQHN1Ym1vZHVsZSBlbWJlci12aWV3cwoqLwppZiAoRW1iZXIu JCkgewogIC8vIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBw cy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL2RuZC5odG1sI2RuZGV2ZW50cwog IHZhciBkcmFnRXZlbnRzID0gRW1iZXIuU3RyaW5nLncoJ2RyYWdzdGFydCBk cmFnIGRyYWdlbnRlciBkcmFnbGVhdmUgZHJhZ292ZXIgZHJvcCBkcmFnZW5k Jyk7CgogIC8vIENvcGllcyB0aGUgYGRhdGFUcmFuc2ZlcmAgcHJvcGVydHkg ZnJvbSBhIGJyb3dzZXIgZXZlbnQgb2JqZWN0IG9udG8gdGhlCiAgLy8galF1 ZXJ5IGV2ZW50IG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBldmVudHMKICBF bWJlci5FbnVtZXJhYmxlVXRpbHMuZm9yRWFjaChkcmFnRXZlbnRzLCBmdW5j dGlvbihldmVudE5hbWUpIHsKICAgIEVtYmVyLiQuZXZlbnQuZml4SG9va3Nb ZXZlbnROYW1lXSA9IHsgcHJvcHM6IFsnZGF0YVRyYW5zZmVyJ10gfTsKICB9 KTsKfQoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewovKioKQG1vZHVsZSBlbWJl cgpAc3VibW9kdWxlIGVtYmVyLXZpZXdzCiovCgovKiBCRUdJTiBNRVRBTU9S UEggSEVMUEVSUyAqLwoKLy8gSW50ZXJuZXQgRXhwbG9yZXIgcHJpb3IgdG8g OSBkb2VzIG5vdCBhbGxvdyBzZXR0aW5nIGlubmVySFRNTCBpZiB0aGUgZmly c3QgZWxlbWVudAovLyBpcyBhICJ6ZXJvLXNjb3BlIiBlbGVtZW50LiBUaGlz IHByb2JsZW0gY2FuIGJlIHdvcmtlZCBhcm91bmQgYnkgbWFraW5nCi8vIHRo ZSBmaXJzdCBub2RlIGFuIGludmlzaWJsZSB0ZXh0IG5vZGUuIFdlLCBsaWtl IE1vZGVybml6ciwgdXNlICZzaHk7Cgp2YXIgbmVlZHNTaHkgPSB0eXBlb2Yg ZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIChmdW5jdGlvbigpIHsKICB2 YXIgdGVzdEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAg dGVzdEVsLmlubmVySFRNTCA9ICI8ZGl2PjwvZGl2PiI7CiAgdGVzdEVsLmZp cnN0Q2hpbGQuaW5uZXJIVE1MID0gIjxzY3JpcHQ+PC9zY3JpcHQ+IjsKICBy ZXR1cm4gdGVzdEVsLmZpcnN0Q2hpbGQuaW5uZXJIVE1MID09PSAnJzsKfSko KTsKCi8vIElFIDggKGFuZCBsaWtlbHkgZWFybGllcikgbGlrZXMgdG8gbW92 ZSB3aGl0ZXNwYWNlIHByZWNlZWRpbmcKLy8gYSBzY3JpcHQgdGFnIHRvIGFw cGVhciBhZnRlciBpdC4gVGhpcyBtZWFucyB0aGF0IHdlIGNhbgovLyBhY2Np ZGVudGFsbHkgcmVtb3ZlIHdoaXRlc3BhY2Ugd2hlbiB1cGRhdGluZyBhIG1v cnBoLgp2YXIgbW92ZXNXaGl0ZXNwYWNlID0gdHlwZW9mIGRvY3VtZW50ICE9 PSAndW5kZWZpbmVkJyAmJiAoZnVuY3Rpb24oKSB7CiAgdmFyIHRlc3RFbCA9 IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIHRlc3RFbC5pbm5l ckhUTUwgPSAiVGVzdDogPHNjcmlwdCB0eXBlPSd0ZXh0L3gtcGxhY2Vob2xk ZXInPjwvc2NyaXB0PlZhbHVlIjsKICByZXR1cm4gdGVzdEVsLmNoaWxkTm9k ZXNbMF0ubm9kZVZhbHVlID09PSAnVGVzdDonICYmCiAgICAgICAgICB0ZXN0 RWwuY2hpbGROb2Rlc1syXS5ub2RlVmFsdWUgPT09ICcgVmFsdWUnOwp9KSgp OwoKLy8gVXNlIHRoaXMgdG8gZmluZCBjaGlsZHJlbiBieSBJRCBpbnN0ZWFk IG9mIHVzaW5nIGpRdWVyeQp2YXIgZmluZENoaWxkQnlJZCA9IGZ1bmN0aW9u KGVsZW1lbnQsIGlkKSB7CiAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdp ZCcpID09PSBpZCkgeyByZXR1cm4gZWxlbWVudDsgfQoKICB2YXIgbGVuID0g ZWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aCwgaWR4LCBub2RlLCBmb3VuZDsK ICBmb3IgKGlkeD0wOyBpZHg8bGVuOyBpZHgrKykgewogICAgbm9kZSA9IGVs ZW1lbnQuY2hpbGROb2Rlc1tpZHhdOwogICAgZm91bmQgPSBub2RlLm5vZGVU eXBlID09PSAxICYmIGZpbmRDaGlsZEJ5SWQobm9kZSwgaWQpOwogICAgaWYg KGZvdW5kKSB7IHJldHVybiBmb3VuZDsgfQogIH0KfTsKCnZhciBzZXRJbm5l ckhUTUxXaXRob3V0Rml4ID0gZnVuY3Rpb24oZWxlbWVudCwgaHRtbCkgewog IGlmIChuZWVkc1NoeSkgewogICAgaHRtbCA9ICcmc2h5OycgKyBodG1sOwog IH0KCiAgdmFyIG1hdGNoZXMgPSBbXTsKICBpZiAobW92ZXNXaGl0ZXNwYWNl KSB7CiAgICAvLyBSaWdodCBub3cgd2Ugb25seSBjaGVjayBmb3Igc2NyaXB0 IHRhZ3Mgd2l0aCBpZHMgd2l0aCB0aGUKICAgIC8vIGdvYWwgb2YgdGFyZ2V0 aW5nIG1vcnBocy4KICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoLyhccyspKDxz Y3JpcHQgaWQ9JyhbXiddKyknKS9nLCBmdW5jdGlvbihtYXRjaCwgc3BhY2Vz LCB0YWcsIGlkKSB7CiAgICAgIG1hdGNoZXMucHVzaChbaWQsIHNwYWNlc10p OwogICAgICByZXR1cm4gdGFnOwogICAgfSk7CiAgfQoKICBlbGVtZW50Lmlu bmVySFRNTCA9IGh0bWw7CgogIC8vIElmIHdlIGhhdmUgdG8gZG8gYW55IHdo aXRlc3BhY2UgYWRqdXN0bWVudHMgZG8gdGhlbSBub3cKICBpZiAobWF0Y2hl cy5sZW5ndGggPiAwKSB7CiAgICB2YXIgbGVuID0gbWF0Y2hlcy5sZW5ndGgs IGlkeDsKICAgIGZvciAoaWR4PTA7IGlkeDxsZW47IGlkeCsrKSB7CiAgICAg IHZhciBzY3JpcHQgPSBmaW5kQ2hpbGRCeUlkKGVsZW1lbnQsIG1hdGNoZXNb aWR4XVswXSksCiAgICAgICAgICBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4 dE5vZGUobWF0Y2hlc1tpZHhdWzFdKTsKICAgICAgc2NyaXB0LnBhcmVudE5v ZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIHNjcmlwdCk7CiAgICB9CiAgfQoKICBp ZiAobmVlZHNTaHkpIHsKICAgIHZhciBzaHlFbGVtZW50ID0gZWxlbWVudC5m aXJzdENoaWxkOwogICAgd2hpbGUgKHNoeUVsZW1lbnQubm9kZVR5cGUgPT09 IDEgJiYgIXNoeUVsZW1lbnQubm9kZU5hbWUpIHsKICAgICAgc2h5RWxlbWVu dCA9IHNoeUVsZW1lbnQuZmlyc3RDaGlsZDsKICAgIH0KICAgIGlmIChzaHlF bGVtZW50Lm5vZGVUeXBlID09PSAzICYmIHNoeUVsZW1lbnQubm9kZVZhbHVl LmNoYXJBdCgwKSA9PT0gIlx1MDBBRCIpIHsKICAgICAgc2h5RWxlbWVudC5u b2RlVmFsdWUgPSBzaHlFbGVtZW50Lm5vZGVWYWx1ZS5zbGljZSgxKTsKICAg IH0KICB9Cn07CgovKiBFTkQgTUVUQU1PUlBIIEhFTFBFUlMgKi8KCgp2YXIg aW5uZXJIVE1MVGFncyA9IHt9Owp2YXIgY2FuU2V0SW5uZXJIVE1MID0gZnVu Y3Rpb24odGFnTmFtZSkgewogIGlmIChpbm5lckhUTUxUYWdzW3RhZ05hbWVd ICE9PSB1bmRlZmluZWQpIHsKICAgIHJldHVybiBpbm5lckhUTUxUYWdzW3Rh Z05hbWVdOwogIH0KCiAgdmFyIGNhblNldCA9IHRydWU7CgogIC8vIElFIDgg YW5kIGVhcmxpZXIgZG9uJ3QgYWxsb3cgdXMgdG8gZG8gaW5uZXJIVE1MIG9u IHNlbGVjdAogIGlmICh0YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdzZWxl Y3QnKSB7CiAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdz ZWxlY3QnKTsKICAgIHNldElubmVySFRNTFdpdGhvdXRGaXgoZWwsICc8b3B0 aW9uIHZhbHVlPSJ0ZXN0Ij5UZXN0PC9vcHRpb24+Jyk7CiAgICBjYW5TZXQg PSBlbC5vcHRpb25zLmxlbmd0aCA9PT0gMTsKICB9CgogIGlubmVySFRNTFRh Z3NbdGFnTmFtZV0gPSBjYW5TZXQ7CgogIHJldHVybiBjYW5TZXQ7Cn07Cgp2 YXIgc2V0SW5uZXJIVE1MID0gZnVuY3Rpb24oZWxlbWVudCwgaHRtbCkgewog IHZhciB0YWdOYW1lID0gZWxlbWVudC50YWdOYW1lOwoKICBpZiAoY2FuU2V0 SW5uZXJIVE1MKHRhZ05hbWUpKSB7CiAgICBzZXRJbm5lckhUTUxXaXRob3V0 Rml4KGVsZW1lbnQsIGh0bWwpOwogIH0gZWxzZSB7CiAgICAvLyBGaXJlZm94 IHZlcnNpb25zIDwgMTEgZG8gbm90IGhhdmUgc3VwcG9ydCBmb3IgZWxlbWVu dC5vdXRlckhUTUwuCiAgICB2YXIgb3V0ZXJIVE1MID0gZWxlbWVudC5vdXRl ckhUTUwgfHwgbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmlu ZyhlbGVtZW50KTsKICAgIEVtYmVyLmFzc2VydCgiQ2FuJ3Qgc2V0IGlubmVy SFRNTCBvbiAiK2VsZW1lbnQudGFnTmFtZSsiIGluIHRoaXMgYnJvd3NlciIs IG91dGVySFRNTCk7CgogICAgdmFyIHN0YXJ0VGFnID0gb3V0ZXJIVE1MLm1h dGNoKG5ldyBSZWdFeHAoIjwiK3RhZ05hbWUrIihbXj5dKik+IiwgJ2knKSlb MF0sCiAgICAgICAgZW5kVGFnID0gJzwvJyt0YWdOYW1lKyc+JzsKCiAgICB2 YXIgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwog ICAgc2V0SW5uZXJIVE1MV2l0aG91dEZpeCh3cmFwcGVyLCBzdGFydFRhZyAr IGh0bWwgKyBlbmRUYWcpOwogICAgZWxlbWVudCA9IHdyYXBwZXIuZmlyc3RD aGlsZDsKICAgIHdoaWxlIChlbGVtZW50LnRhZ05hbWUgIT09IHRhZ05hbWUp IHsKICAgICAgZWxlbWVudCA9IGVsZW1lbnQubmV4dFNpYmxpbmc7CiAgICB9 CiAgfQoKICByZXR1cm4gZWxlbWVudDsKfTsKCmZ1bmN0aW9uIGlzU2ltcGxl Q2xpY2soZXZlbnQpIHsKICB2YXIgbW9kaWZpZXIgPSBldmVudC5zaGlmdEtl eSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LmFsdEtleSB8fCBldmVudC5j dHJsS2V5LAogICAgICBzZWNvbmRhcnlDbGljayA9IGV2ZW50LndoaWNoID4g MTsgLy8gSUU5IG1heSByZXR1cm4gdW5kZWZpbmVkCgogIHJldHVybiAhbW9k aWZpZXIgJiYgIXNlY29uZGFyeUNsaWNrOwp9CgpFbWJlci5WaWV3VXRpbHMg PSB7CiAgc2V0SW5uZXJIVE1MOiBzZXRJbm5lckhUTUwsCiAgaXNTaW1wbGVD bGljazogaXNTaW1wbGVDbGljawp9OwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkg ewovKioKQG1vZHVsZSBlbWJlcgpAc3VibW9kdWxlIGVtYmVyLXZpZXdzCiov Cgp2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7Cgp2YXIg Q2xhc3NTZXQgPSBmdW5jdGlvbigpIHsKICB0aGlzLnNlZW4gPSB7fTsKICB0 aGlzLmxpc3QgPSBbXTsKfTsKCkNsYXNzU2V0LnByb3RvdHlwZSA9IHsKICBh ZGQ6IGZ1bmN0aW9uKHN0cmluZykgewogICAgaWYgKHN0cmluZyBpbiB0aGlz LnNlZW4pIHsgcmV0dXJuOyB9CiAgICB0aGlzLnNlZW5bc3RyaW5nXSA9IHRy dWU7CgogICAgdGhpcy5saXN0LnB1c2goc3RyaW5nKTsKICB9LAoKICB0b0RP TTogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5saXN0LmpvaW4oIiAi KTsKICB9Cn07Cgp2YXIgQkFEX1RBR19OQU1FX1RFU1RfUkVHRVhQID0gL1te YS16QS1aMC05XC1dLzsKdmFyIEJBRF9UQUdfTkFNRV9SRVBMQUNFX1JFR0VY UCA9IC9bXmEtekEtWjAtOVwtXS9nOwoKZnVuY3Rpb24gc3RyaXBUYWdOYW1l KHRhZ05hbWUpIHsKICBpZiAoIXRhZ05hbWUpIHsKICAgIHJldHVybiB0YWdO YW1lOwogIH0KCiAgaWYgKCFCQURfVEFHX05BTUVfVEVTVF9SRUdFWFAudGVz dCh0YWdOYW1lKSkgewogICAgcmV0dXJuIHRhZ05hbWU7CiAgfQoKICByZXR1 cm4gdGFnTmFtZS5yZXBsYWNlKEJBRF9UQUdfTkFNRV9SRVBMQUNFX1JFR0VY UCwgJycpOwp9Cgp2YXIgQkFEX0NIQVJTX1JFR0VYUCA9IC8mKD8hXHcrOyl8 Wzw+IidgXS9nOwp2YXIgUE9TU0lCTEVfQ0hBUlNfUkVHRVhQID0gL1smPD4i J2BdLzsKCmZ1bmN0aW9uIGVzY2FwZUF0dHJpYnV0ZSh2YWx1ZSkgewogIC8v IFN0b2xlbiBzaGFtZWxlc3NseSBmcm9tIEhhbmRsZWJhcnMKCiAgdmFyIGVz Y2FwZSA9IHsKICAgICI8IjogIiZsdDsiLAogICAgIj4iOiAiJmd0OyIsCiAg ICAnIic6ICImcXVvdDsiLAogICAgIiciOiAiJiN4Mjc7IiwKICAgICJgIjog IiYjeDYwOyIKICB9OwoKICB2YXIgZXNjYXBlQ2hhciA9IGZ1bmN0aW9uKGNo cikgewogICAgcmV0dXJuIGVzY2FwZVtjaHJdIHx8ICImYW1wOyI7CiAgfTsK CiAgdmFyIHN0cmluZyA9IHZhbHVlLnRvU3RyaW5nKCk7CgogIGlmKCFQT1NT SUJMRV9DSEFSU19SRUdFWFAudGVzdChzdHJpbmcpKSB7IHJldHVybiBzdHJp bmc7IH0KICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoQkFEX0NIQVJTX1JFR0VY UCwgZXNjYXBlQ2hhcik7Cn0KCi8vIElFIDYvNyBoYXZlIGJ1Z3MgYXJvdW5k IHNldHRpbmcgbmFtZXMgb24gaW5wdXRzIGR1cmluZyBjcmVhdGlvbi4KLy8g RnJvbSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkv aWUvbXM1MzYzODkodj12cy44NSkuYXNweDoKLy8gIlRvIGluY2x1ZGUgdGhl IE5BTUUgYXR0cmlidXRlIGF0IHJ1biB0aW1lIG9uIG9iamVjdHMgY3JlYXRl ZCB3aXRoIHRoZSBjcmVhdGVFbGVtZW50IG1ldGhvZCwgdXNlIHRoZSBlVGFn LiIKdmFyIGNhblNldE5hbWVPbklucHV0cyA9IChmdW5jdGlvbigpIHsKICB2 YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksCiAgICAg IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTsKCiAgZWwu c2V0QXR0cmlidXRlKCduYW1lJywgJ2ZvbycpOwogIGRpdi5hcHBlbmRDaGls ZChlbCk7CgogIHJldHVybiAhIWRpdi5pbm5lckhUTUwubWF0Y2goJ2Zvbycp Owp9KSgpOwoKLyoqCiAgYEVtYmVyLlJlbmRlckJ1ZmZlcmAgZ2F0aGVycyBp bmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIGEgdmlldyBhbmQgZ2VuZXJhdGVz IHRoZQogIGZpbmFsIHJlcHJlc2VudGF0aW9uLiBgRW1iZXIuUmVuZGVyQnVm ZmVyYCB3aWxsIGdlbmVyYXRlIEhUTUwgd2hpY2ggY2FuIGJlIHB1c2hlZAog IHRvIHRoZSBET00uCgogICBgYGBqYXZhc2NyaXB0CiAgIHZhciBidWZmZXIg PSBFbWJlci5SZW5kZXJCdWZmZXIoJ2RpdicpOwogIGBgYAoKICBAY2xhc3Mg UmVuZGVyQnVmZmVyCiAgQG5hbWVzcGFjZSBFbWJlcgogIEBjb25zdHJ1Y3Rv cgogIEBwYXJhbSB7U3RyaW5nfSB0YWdOYW1lIHRhZyBuYW1lIChzdWNoIGFz ICdkaXYnIG9yICdwJykgdXNlZCBmb3IgdGhlIGJ1ZmZlcgoqLwpFbWJlci5S ZW5kZXJCdWZmZXIgPSBmdW5jdGlvbih0YWdOYW1lKSB7CiAgcmV0dXJuIG5l dyBFbWJlci5fUmVuZGVyQnVmZmVyKHRhZ05hbWUpOwp9OwoKRW1iZXIuX1Jl bmRlckJ1ZmZlciA9IGZ1bmN0aW9uKHRhZ05hbWUpIHsKICB0aGlzLnRhZ05h bWVzID0gW3RhZ05hbWUgfHwgbnVsbF07CiAgdGhpcy5idWZmZXIgPSAiIjsK fTsKCkVtYmVyLl9SZW5kZXJCdWZmZXIucHJvdG90eXBlID0gewoKICAvLyBU aGUgcm9vdCB2aWV3J3MgZWxlbWVudAogIF9lbGVtZW50OiBudWxsLAoKICBf aGFzRWxlbWVudDogdHJ1ZSwKCiAgLyoqCiAgICBBbiBpbnRlcm5hbCBzZXQg dXNlZCB0byBkZS1kdXBlIGNsYXNzIG5hbWVzIHdoZW4gYGFkZENsYXNzKClg IGlzCiAgICB1c2VkLiBBZnRlciBlYWNoIGNhbGwgdG8gYGFkZENsYXNzKClg LCB0aGUgYGNsYXNzZXNgIHByb3BlcnR5CiAgICB3aWxsIGJlIHVwZGF0ZWQu CgogICAgQHByaXZhdGUKICAgIEBwcm9wZXJ0eSBlbGVtZW50Q2xhc3Nlcwog ICAgQHR5cGUgQXJyYXkKICAgIEBkZWZhdWx0IFtdCiAgKi8KICBlbGVtZW50 Q2xhc3NlczogbnVsbCwKCiAgLyoqCiAgICBBcnJheSBvZiBjbGFzcyBuYW1l cyB3aGljaCB3aWxsIGJlIGFwcGxpZWQgaW4gdGhlIGNsYXNzIGF0dHJpYnV0 ZS4KCiAgICBZb3UgY2FuIHVzZSBgc2V0Q2xhc3NlcygpYCB0byBzZXQgdGhp cyBwcm9wZXJ0eSBkaXJlY3RseS4gSWYgeW91CiAgICB1c2UgYGFkZENsYXNz KClgLCBpdCB3aWxsIGJlIG1haW50YWluZWQgZm9yIHlvdS4KCiAgICBAcHJv cGVydHkgY2xhc3NlcwogICAgQHR5cGUgQXJyYXkKICAgIEBkZWZhdWx0IFtd CiAgKi8KICBjbGFzc2VzOiBudWxsLAoKICAvKioKICAgIFRoZSBpZCBpbiBv ZiB0aGUgZWxlbWVudCwgdG8gYmUgYXBwbGllZCBpbiB0aGUgaWQgYXR0cmli dXRlLgoKICAgIFlvdSBzaG91bGQgbm90IHNldCB0aGlzIHByb3BlcnR5IHlv dXJzZWxmLCByYXRoZXIsIHlvdSBzaG91bGQgdXNlCiAgICB0aGUgYGlkKClg IG1ldGhvZCBvZiBgRW1iZXIuUmVuZGVyQnVmZmVyYC4KCiAgICBAcHJvcGVy dHkgZWxlbWVudElkCiAgICBAdHlwZSBTdHJpbmcKICAgIEBkZWZhdWx0IG51 bGwKICAqLwogIGVsZW1lbnRJZDogbnVsbCwKCiAgLyoqCiAgICBBIGhhc2gg a2V5ZWQgb24gdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBhbmQgd2hvc2Ug dmFsdWUgd2lsbCBiZQogICAgYXBwbGllZCB0byB0aGF0IGF0dHJpYnV0ZS4g Rm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8gYXBwbHkgYQogICAgYGRh dGEtdmlldz0iRm9vLmJhciJgIHByb3BlcnR5IHRvIGFuIGVsZW1lbnQsIHlv dSB3b3VsZCBzZXQgdGhlCiAgICBlbGVtZW50QXR0cmlidXRlcyBoYXNoIHRv IGB7J2RhdGEtdmlldyc6J0Zvby5iYXInfWAuCgogICAgWW91IHNob3VsZCBu b3QgbWFpbnRhaW4gdGhpcyBoYXNoIHlvdXJzZWxmLCByYXRoZXIsIHlvdSBz aG91bGQgdXNlCiAgICB0aGUgYGF0dHIoKWAgbWV0aG9kIG9mIGBFbWJlci5S ZW5kZXJCdWZmZXJgLgoKICAgIEBwcm9wZXJ0eSBlbGVtZW50QXR0cmlidXRl cwogICAgQHR5cGUgSGFzaAogICAgQGRlZmF1bHQge30KICAqLwogIGVsZW1l bnRBdHRyaWJ1dGVzOiBudWxsLAoKICAvKioKICAgIEEgaGFzaCBrZXllZCBv biB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydGllcyBhbmQgd2hvc2UgdmFsdWUg d2lsbCBiZQogICAgYXBwbGllZCB0byB0aGF0IHByb3BlcnR5LiBGb3IgZXhh bXBsZSwgaWYgeW91IHdhbnRlZCB0byBhcHBseSBhCiAgICBgY2hlY2tlZD10 cnVlYCBwcm9wZXJ0eSB0byBhbiBlbGVtZW50LCB5b3Ugd291bGQgc2V0IHRo ZQogICAgZWxlbWVudFByb3BlcnRpZXMgaGFzaCB0byBgeydjaGVja2VkJzp0 cnVlfWAuCgogICAgWW91IHNob3VsZCBub3QgbWFpbnRhaW4gdGhpcyBoYXNo IHlvdXJzZWxmLCByYXRoZXIsIHlvdSBzaG91bGQgdXNlCiAgICB0aGUgYHBy b3AoKWAgbWV0aG9kIG9mIGBFbWJlci5SZW5kZXJCdWZmZXJgLgoKICAgIEBw cm9wZXJ0eSBlbGVtZW50UHJvcGVydGllcwogICAgQHR5cGUgSGFzaAogICAg QGRlZmF1bHQge30KICAqLwogIGVsZW1lbnRQcm9wZXJ0aWVzOiBudWxsLAoK ICAvKioKICAgIFRoZSB0YWduYW1lIG9mIHRoZSBlbGVtZW50IGFuIGluc3Rh bmNlIG9mIGBFbWJlci5SZW5kZXJCdWZmZXJgIHJlcHJlc2VudHMuCgogICAg VXN1YWxseSwgdGhpcyBnZXRzIHNldCBhcyB0aGUgZmlyc3QgcGFyYW1ldGVy IHRvIGBFbWJlci5SZW5kZXJCdWZmZXJgLiBGb3IKICAgIGV4YW1wbGUsIGlm IHlvdSB3YW50ZWQgdG8gY3JlYXRlIGEgYHBgIHRhZywgdGhlbiB5b3Ugd291 bGQgY2FsbAoKICAgIGBgYGphdmFzY3JpcHQKICAgIEVtYmVyLlJlbmRlckJ1 ZmZlcigncCcpCiAgICBgYGAKCiAgICBAcHJvcGVydHkgZWxlbWVudFRhZwog ICAgQHR5cGUgU3RyaW5nCiAgICBAZGVmYXVsdCBudWxsCiAgKi8KICBlbGVt ZW50VGFnOiBudWxsLAoKICAvKioKICAgIEEgaGFzaCBrZXllZCBvbiB0aGUg bmFtZSBvZiB0aGUgc3R5bGUgYXR0cmlidXRlIGFuZCB3aG9zZSB2YWx1ZSB3 aWxsCiAgICBiZSBhcHBsaWVkIHRvIHRoYXQgYXR0cmlidXRlLiBGb3IgZXhh bXBsZSwgaWYgeW91IHdhbnRlZCB0byBhcHBseSBhCiAgICBgYmFja2dyb3Vu ZC1jb2xvcjpibGFjaztgIHN0eWxlIHRvIGFuIGVsZW1lbnQsIHlvdSB3b3Vs ZCBzZXQgdGhlCiAgICBlbGVtZW50U3R5bGUgaGFzaCB0byBgeydiYWNrZ3Jv dW5kLWNvbG9yJzonYmxhY2snfWAuCgogICAgWW91IHNob3VsZCBub3QgbWFp bnRhaW4gdGhpcyBoYXNoIHlvdXJzZWxmLCByYXRoZXIsIHlvdSBzaG91bGQg dXNlCiAgICB0aGUgYHN0eWxlKClgIG1ldGhvZCBvZiBgRW1iZXIuUmVuZGVy QnVmZmVyYC4KCiAgICBAcHJvcGVydHkgZWxlbWVudFN0eWxlCiAgICBAdHlw ZSBIYXNoCiAgICBAZGVmYXVsdCB7fQogICovCiAgZWxlbWVudFN0eWxlOiBu dWxsLAoKICAvKioKICAgIE5lc3RlZCBgUmVuZGVyQnVmZmVyc2Agd2lsbCBz ZXQgdGhpcyB0byB0aGVpciBwYXJlbnQgYFJlbmRlckJ1ZmZlcmAKICAgIGlu c3RhbmNlLgoKICAgIEBwcm9wZXJ0eSBwYXJlbnRCdWZmZXIKICAgIEB0eXBl IEVtYmVyLl9SZW5kZXJCdWZmZXIKICAqLwogIHBhcmVudEJ1ZmZlcjogbnVs bCwKCiAgLyoqCiAgICBBZGRzIGEgc3RyaW5nIG9mIEhUTUwgdG8gdGhlIGBS ZW5kZXJCdWZmZXJgLgoKICAgIEBtZXRob2QgcHVzaAogICAgQHBhcmFtIHtT dHJpbmd9IHN0cmluZyBIVE1MIHRvIHB1c2ggaW50byB0aGUgYnVmZmVyCiAg ICBAY2hhaW5hYmxlCiAgKi8KICBwdXNoOiBmdW5jdGlvbihzdHJpbmcpIHsK ICAgIHRoaXMuYnVmZmVyICs9IHN0cmluZzsKICAgIHJldHVybiB0aGlzOwog IH0sCgogIC8qKgogICAgQWRkcyBhIGNsYXNzIHRvIHRoZSBidWZmZXIsIHdo aWNoIHdpbGwgYmUgcmVuZGVyZWQgdG8gdGhlIGNsYXNzIGF0dHJpYnV0ZS4K CiAgICBAbWV0aG9kIGFkZENsYXNzCiAgICBAcGFyYW0ge1N0cmluZ30gY2xh c3NOYW1lIENsYXNzIG5hbWUgdG8gYWRkIHRvIHRoZSBidWZmZXIKICAgIEBj aGFpbmFibGUKICAqLwogIGFkZENsYXNzOiBmdW5jdGlvbihjbGFzc05hbWUp IHsKICAgIC8vIGxhemlseSBjcmVhdGUgZWxlbWVudENsYXNzZXMKICAgIHRo aXMuZWxlbWVudENsYXNzZXMgPSAodGhpcy5lbGVtZW50Q2xhc3NlcyB8fCBu ZXcgQ2xhc3NTZXQoKSk7CiAgICB0aGlzLmVsZW1lbnRDbGFzc2VzLmFkZChj bGFzc05hbWUpOwogICAgdGhpcy5jbGFzc2VzID0gdGhpcy5lbGVtZW50Q2xh c3Nlcy5saXN0OwoKICAgIHJldHVybiB0aGlzOwogIH0sCgogIHNldENsYXNz ZXM6IGZ1bmN0aW9uKGNsYXNzTmFtZXMpIHsKICAgIHRoaXMuZWxlbWVudENs YXNzZXMgPSBudWxsOwogICAgdmFyIGxlbiA9IGNsYXNzTmFtZXMubGVuZ3Ro LCBpOwogICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgIHRo aXMuYWRkQ2xhc3MoY2xhc3NOYW1lc1tpXSk7CiAgICB9CiAgfSwKCiAgLyoq CiAgICBTZXRzIHRoZSBlbGVtZW50SUQgdG8gYmUgdXNlZCBmb3IgdGhlIGVs ZW1lbnQuCgogICAgQG1ldGhvZCBpZAogICAgQHBhcmFtIHtTdHJpbmd9IGlk CiAgICBAY2hhaW5hYmxlCiAgKi8KICBpZDogZnVuY3Rpb24oaWQpIHsKICAg IHRoaXMuZWxlbWVudElkID0gaWQ7CiAgICByZXR1cm4gdGhpczsKICB9LAoK ICAvLyBkdWNrIHR5cGUgYXR0cmlidXRlIGZ1bmN0aW9uYWxpdHkgbGlrZSBq UXVlcnkgc28gYSByZW5kZXIgYnVmZmVyCiAgLy8gY2FuIGJlIHVzZWQgbGlr ZSBhIGpRdWVyeSBvYmplY3QgaW4gYXR0cmlidXRlIGJpbmRpbmcgc2NlbmFy aW9zLgoKICAvKioKICAgIEFkZHMgYW4gYXR0cmlidXRlIHdoaWNoIHdpbGwg YmUgcmVuZGVyZWQgdG8gdGhlIGVsZW1lbnQuCgogICAgQG1ldGhvZCBhdHRy CiAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0 cmlidXRlCiAgICBAcGFyYW0ge1N0cmluZ30gdmFsdWUgVGhlIHZhbHVlIHRv IGFkZCB0byB0aGUgYXR0cmlidXRlCiAgICBAY2hhaW5hYmxlCiAgICBAcmV0 dXJuIHtFbWJlci5SZW5kZXJCdWZmZXJ8U3RyaW5nfSB0aGlzIG9yIHRoZSBj dXJyZW50IGF0dHJpYnV0ZSB2YWx1ZQogICovCiAgYXR0cjogZnVuY3Rpb24o bmFtZSwgdmFsdWUpIHsKICAgIHZhciBhdHRyaWJ1dGVzID0gdGhpcy5lbGVt ZW50QXR0cmlidXRlcyA9ICh0aGlzLmVsZW1lbnRBdHRyaWJ1dGVzIHx8IHt9 KTsKCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgewogICAgICBy ZXR1cm4gYXR0cmlidXRlc1tuYW1lXTsKICAgIH0gZWxzZSB7CiAgICAgIGF0 dHJpYnV0ZXNbbmFtZV0gPSB2YWx1ZTsKICAgIH0KCiAgICByZXR1cm4gdGhp czsKICB9LAoKICAvKioKICAgIFJlbW92ZSBhbiBhdHRyaWJ1dGUgZnJvbSB0 aGUgbGlzdCBvZiBhdHRyaWJ1dGVzIHRvIHJlbmRlci4KCiAgICBAbWV0aG9k IHJlbW92ZUF0dHIKICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1l IG9mIHRoZSBhdHRyaWJ1dGUKICAgIEBjaGFpbmFibGUKICAqLwogIHJlbW92 ZUF0dHI6IGZ1bmN0aW9uKG5hbWUpIHsKICAgIHZhciBhdHRyaWJ1dGVzID0g dGhpcy5lbGVtZW50QXR0cmlidXRlczsKICAgIGlmIChhdHRyaWJ1dGVzKSB7 IGRlbGV0ZSBhdHRyaWJ1dGVzW25hbWVdOyB9CgogICAgcmV0dXJuIHRoaXM7 CiAgfSwKCiAgLyoqCiAgICBBZGRzIGEgcHJvcGVydHkgd2hpY2ggd2lsbCBi ZSByZW5kZXJlZCB0byB0aGUgZWxlbWVudC4KCiAgICBAbWV0aG9kIHByb3AK ICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9w ZXJ0eQogICAgQHBhcmFtIHtTdHJpbmd9IHZhbHVlIFRoZSB2YWx1ZSB0byBh ZGQgdG8gdGhlIHByb3BlcnR5CiAgICBAY2hhaW5hYmxlCiAgICBAcmV0dXJu IHtFbWJlci5SZW5kZXJCdWZmZXJ8U3RyaW5nfSB0aGlzIG9yIHRoZSBjdXJy ZW50IHByb3BlcnR5IHZhbHVlCiAgKi8KICBwcm9wOiBmdW5jdGlvbihuYW1l LCB2YWx1ZSkgewogICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmVsZW1lbnRQ cm9wZXJ0aWVzID0gKHRoaXMuZWxlbWVudFByb3BlcnRpZXMgfHwge30pOwoK ICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7CiAgICAgIHJldHVy biBwcm9wZXJ0aWVzW25hbWVdOwogICAgfSBlbHNlIHsKICAgICAgcHJvcGVy dGllc1tuYW1lXSA9IHZhbHVlOwogICAgfQoKICAgIHJldHVybiB0aGlzOwog IH0sCgogIC8qKgogICAgUmVtb3ZlIGFuIHByb3BlcnR5IGZyb20gdGhlIGxp c3Qgb2YgcHJvcGVydGllcyB0byByZW5kZXIuCgogICAgQG1ldGhvZCByZW1v dmVQcm9wCiAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0 aGUgcHJvcGVydHkKICAgIEBjaGFpbmFibGUKICAqLwogIHJlbW92ZVByb3A6 IGZ1bmN0aW9uKG5hbWUpIHsKICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5l bGVtZW50UHJvcGVydGllczsKICAgIGlmIChwcm9wZXJ0aWVzKSB7IGRlbGV0 ZSBwcm9wZXJ0aWVzW25hbWVdOyB9CgogICAgcmV0dXJuIHRoaXM7CiAgfSwK CiAgLyoqCiAgICBBZGRzIGEgc3R5bGUgdG8gdGhlIHN0eWxlIGF0dHJpYnV0 ZSB3aGljaCB3aWxsIGJlIHJlbmRlcmVkIHRvIHRoZSBlbGVtZW50LgoKICAg IEBtZXRob2Qgc3R5bGUKICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIE5hbWUg b2YgdGhlIHN0eWxlCiAgICBAcGFyYW0ge1N0cmluZ30gdmFsdWUKICAgIEBj aGFpbmFibGUKICAqLwogIHN0eWxlOiBmdW5jdGlvbihuYW1lLCB2YWx1ZSkg ewogICAgdGhpcy5lbGVtZW50U3R5bGUgPSAodGhpcy5lbGVtZW50U3R5bGUg fHwge30pOwoKICAgIHRoaXMuZWxlbWVudFN0eWxlW25hbWVdID0gdmFsdWU7 CiAgICByZXR1cm4gdGhpczsKICB9LAoKICBiZWdpbjogZnVuY3Rpb24odGFn TmFtZSkgewogICAgdGhpcy50YWdOYW1lcy5wdXNoKHRhZ05hbWUgfHwgbnVs bCk7CiAgICByZXR1cm4gdGhpczsKICB9LAoKICBwdXNoT3BlbmluZ1RhZzog ZnVuY3Rpb24oKSB7CiAgICB2YXIgdGFnTmFtZSA9IHRoaXMuY3VycmVudFRh Z05hbWUoKTsKICAgIGlmICghdGFnTmFtZSkgeyByZXR1cm47IH0KCiAgICBp ZiAodGhpcy5faGFzRWxlbWVudCAmJiAhdGhpcy5fZWxlbWVudCAmJiB0aGlz LmJ1ZmZlci5sZW5ndGggPT09IDApIHsKICAgICAgdGhpcy5fZWxlbWVudCA9 IHRoaXMuZ2VuZXJhdGVFbGVtZW50KCk7CiAgICAgIHJldHVybjsKICAgIH0K CiAgICB2YXIgYnVmZmVyID0gdGhpcy5idWZmZXIsCiAgICAgICAgaWQgPSB0 aGlzLmVsZW1lbnRJZCwKICAgICAgICBjbGFzc2VzID0gdGhpcy5jbGFzc2Vz LAogICAgICAgIGF0dHJzID0gdGhpcy5lbGVtZW50QXR0cmlidXRlcywKICAg ICAgICBwcm9wcyA9IHRoaXMuZWxlbWVudFByb3BlcnRpZXMsCiAgICAgICAg c3R5bGUgPSB0aGlzLmVsZW1lbnRTdHlsZSwKICAgICAgICBhdHRyLCBwcm9w OwoKICAgIGJ1ZmZlciArPSAnPCcgKyBzdHJpcFRhZ05hbWUodGFnTmFtZSk7 CgogICAgaWYgKGlkKSB7CiAgICAgIGJ1ZmZlciArPSAnIGlkPSInICsgZXNj YXBlQXR0cmlidXRlKGlkKSArICciJzsKICAgICAgdGhpcy5lbGVtZW50SWQg PSBudWxsOwogICAgfQogICAgaWYgKGNsYXNzZXMpIHsKICAgICAgYnVmZmVy ICs9ICcgY2xhc3M9IicgKyBlc2NhcGVBdHRyaWJ1dGUoY2xhc3Nlcy5qb2lu KCcgJykpICsgJyInOwogICAgICB0aGlzLmNsYXNzZXMgPSBudWxsOwogICAg ICB0aGlzLmVsZW1lbnRDbGFzc2VzID0gbnVsbDsKICAgIH0KCiAgICBpZiAo c3R5bGUpIHsKICAgICAgYnVmZmVyICs9ICcgc3R5bGU9Iic7CgogICAgICBm b3IgKHByb3AgaW4gc3R5bGUpIHsKICAgICAgICBpZiAoc3R5bGUuaGFzT3du UHJvcGVydHkocHJvcCkpIHsKICAgICAgICAgIGJ1ZmZlciArPSBwcm9wICsg JzonICsgZXNjYXBlQXR0cmlidXRlKHN0eWxlW3Byb3BdKSArICc7JzsKICAg ICAgICB9CiAgICAgIH0KCiAgICAgIGJ1ZmZlciArPSAnIic7CgogICAgICB0 aGlzLmVsZW1lbnRTdHlsZSA9IG51bGw7CiAgICB9CgogICAgaWYgKGF0dHJz KSB7CiAgICAgIGZvciAoYXR0ciBpbiBhdHRycykgewogICAgICAgIGlmIChh dHRycy5oYXNPd25Qcm9wZXJ0eShhdHRyKSkgewogICAgICAgICAgYnVmZmVy ICs9ICcgJyArIGF0dHIgKyAnPSInICsgZXNjYXBlQXR0cmlidXRlKGF0dHJz W2F0dHJdKSArICciJzsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRoaXMu ZWxlbWVudEF0dHJpYnV0ZXMgPSBudWxsOwogICAgfQoKICAgIGlmIChwcm9w cykgewogICAgICBmb3IgKHByb3AgaW4gcHJvcHMpIHsKICAgICAgICBpZiAo cHJvcHMuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKICAgICAgICAgIHZhciB2 YWx1ZSA9IHByb3BzW3Byb3BdOwogICAgICAgICAgaWYgKHZhbHVlIHx8IHR5 cGVvZih2YWx1ZSkgPT09ICdudW1iZXInKSB7CiAgICAgICAgICAgIGlmICh2 YWx1ZSA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgIGJ1ZmZlciArPSAnICcg KyBwcm9wICsgJz0iJyArIHByb3AgKyAnIic7CiAgICAgICAgICAgIH0gZWxz ZSB7CiAgICAgICAgICAgICAgYnVmZmVyICs9ICcgJyArIHByb3AgKyAnPSIn ICsgZXNjYXBlQXR0cmlidXRlKHByb3BzW3Byb3BdKSArICciJzsKICAgICAg ICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAg dGhpcy5lbGVtZW50UHJvcGVydGllcyA9IG51bGw7CiAgICB9CgogICAgYnVm ZmVyICs9ICc+JzsKICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOwogIH0sCgog IHB1c2hDbG9zaW5nVGFnOiBmdW5jdGlvbigpIHsKICAgIHZhciB0YWdOYW1l ID0gdGhpcy50YWdOYW1lcy5wb3AoKTsKICAgIGlmICh0YWdOYW1lKSB7IHRo aXMuYnVmZmVyICs9ICc8LycgKyBzdHJpcFRhZ05hbWUodGFnTmFtZSkgKyAn Pic7IH0KICB9LAoKICBjdXJyZW50VGFnTmFtZTogZnVuY3Rpb24oKSB7CiAg ICByZXR1cm4gdGhpcy50YWdOYW1lc1t0aGlzLnRhZ05hbWVzLmxlbmd0aC0x XTsKICB9LAoKICBnZW5lcmF0ZUVsZW1lbnQ6IGZ1bmN0aW9uKCkgewogICAg dmFyIHRhZ05hbWUgPSB0aGlzLnRhZ05hbWVzLnBvcCgpLCAvLyBwb3Agc2lu Y2Ugd2UgZG9uJ3QgbmVlZCB0byBjbG9zZQogICAgICAgIGlkID0gdGhpcy5l bGVtZW50SWQsCiAgICAgICAgY2xhc3NlcyA9IHRoaXMuY2xhc3NlcywKICAg ICAgICBhdHRycyA9IHRoaXMuZWxlbWVudEF0dHJpYnV0ZXMsCiAgICAgICAg cHJvcHMgPSB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzLAogICAgICAgIHN0eWxl ID0gdGhpcy5lbGVtZW50U3R5bGUsCiAgICAgICAgc3R5bGVCdWZmZXIgPSAn JywgYXR0ciwgcHJvcCwgdGFnU3RyaW5nOwoKICAgIGlmIChhdHRycyAmJiBh dHRycy5uYW1lICYmICFjYW5TZXROYW1lT25JbnB1dHMpIHsKICAgICAgLy8g SUUgYWxsb3dzIHBhc3NpbmcgYSB0YWcgdG8gY3JlYXRlRWxlbWVudC4gU2Vl IG5vdGUgb24gYGNhblNldE5hbWVPbklucHV0c2AgYWJvdmUgYXMgd2VsbC4K ICAgICAgdGFnU3RyaW5nID0gJzwnK3N0cmlwVGFnTmFtZSh0YWdOYW1lKSsn IG5hbWU9IicrZXNjYXBlQXR0cmlidXRlKGF0dHJzLm5hbWUpKyciPic7CiAg ICB9IGVsc2UgewogICAgICB0YWdTdHJpbmcgPSB0YWdOYW1lOwogICAgfQoK ICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdT dHJpbmcpLAogICAgICAgICRlbGVtZW50ID0gRW1iZXIuJChlbGVtZW50KTsK CiAgICBpZiAoaWQpIHsKICAgICAgJGVsZW1lbnQuYXR0cignaWQnLCBpZCk7 CiAgICAgIHRoaXMuZWxlbWVudElkID0gbnVsbDsKICAgIH0KICAgIGlmIChj bGFzc2VzKSB7CiAgICAgICRlbGVtZW50LmF0dHIoJ2NsYXNzJywgY2xhc3Nl cy5qb2luKCcgJykpOwogICAgICB0aGlzLmNsYXNzZXMgPSBudWxsOwogICAg ICB0aGlzLmVsZW1lbnRDbGFzc2VzID0gbnVsbDsKICAgIH0KCiAgICBpZiAo c3R5bGUpIHsKICAgICAgZm9yIChwcm9wIGluIHN0eWxlKSB7CiAgICAgICAg aWYgKHN0eWxlLmhhc093blByb3BlcnR5KHByb3ApKSB7CiAgICAgICAgICBz dHlsZUJ1ZmZlciArPSAocHJvcCArICc6JyArIHN0eWxlW3Byb3BdICsgJzsn KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICRlbGVtZW50LmF0dHIoJ3N0 eWxlJywgc3R5bGVCdWZmZXIpOwoKICAgICAgdGhpcy5lbGVtZW50U3R5bGUg PSBudWxsOwogICAgfQoKICAgIGlmIChhdHRycykgewogICAgICBmb3IgKGF0 dHIgaW4gYXR0cnMpIHsKICAgICAgICBpZiAoYXR0cnMuaGFzT3duUHJvcGVy dHkoYXR0cikpIHsKICAgICAgICAgICRlbGVtZW50LmF0dHIoYXR0ciwgYXR0 cnNbYXR0cl0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdGhpcy5lbGVt ZW50QXR0cmlidXRlcyA9IG51bGw7CiAgICB9CgogICAgaWYgKHByb3BzKSB7 CiAgICAgIGZvciAocHJvcCBpbiBwcm9wcykgewogICAgICAgIGlmIChwcm9w cy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgJGVsZW1lbnQu cHJvcChwcm9wLCBwcm9wc1twcm9wXSk7CiAgICAgICAgfQogICAgICB9Cgog ICAgICB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzID0gbnVsbDsKICAgIH0KCiAg ICByZXR1cm4gZWxlbWVudDsKICB9LAoKICAvKioKICAgIEBtZXRob2QgZWxl bWVudAogICAgQHJldHVybiB7RE9NRWxlbWVudH0gVGhlIGVsZW1lbnQgY29y cmVzcG9uZGluZyB0byB0aGUgZ2VuZXJhdGVkIEhUTUwKICAgICAgb2YgdGhp cyBidWZmZXIKICAqLwogIGVsZW1lbnQ6IGZ1bmN0aW9uKCkgewogICAgdmFy IGh0bWwgPSB0aGlzLmlubmVyU3RyaW5nKCk7CgogICAgaWYgKGh0bWwpIHsK ICAgICAgdGhpcy5fZWxlbWVudCA9IEVtYmVyLlZpZXdVdGlscy5zZXRJbm5l ckhUTUwodGhpcy5fZWxlbWVudCwgaHRtbCk7CiAgICB9CgogICAgcmV0dXJu IHRoaXMuX2VsZW1lbnQ7CiAgfSwKCiAgLyoqCiAgICBHZW5lcmF0ZXMgdGhl IEhUTUwgY29udGVudCBmb3IgdGhpcyBidWZmZXIuCgogICAgQG1ldGhvZCBz dHJpbmcKICAgIEByZXR1cm4ge1N0cmluZ30gVGhlIGdlbmVyYXRlZCBIVE1M CiAgKi8KICBzdHJpbmc6IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuX2hh c0VsZW1lbnQgJiYgdGhpcy5fZWxlbWVudCkgewogICAgICAvLyBGaXJlZm94 IHZlcnNpb25zIDwgMTEgZG8gbm90IGhhdmUgc3VwcG9ydCBmb3IgZWxlbWVu dC5vdXRlckhUTUwuCiAgICAgIHZhciB0aGlzRWxlbWVudCA9IHRoaXMuZWxl bWVudCgpLCBvdXRlckhUTUwgPSB0aGlzRWxlbWVudC5vdXRlckhUTUw7CiAg ICAgIGlmICh0eXBlb2Ygb3V0ZXJIVE1MID09PSAndW5kZWZpbmVkJykgewog ICAgICAgIHJldHVybiBFbWJlci4kKCc8ZGl2Lz4nKS5hcHBlbmQodGhpc0Vs ZW1lbnQpLmh0bWwoKTsKICAgICAgfQogICAgICByZXR1cm4gb3V0ZXJIVE1M OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHRoaXMuaW5uZXJTdHJpbmco KTsKICAgIH0KICB9LAoKICBpbm5lclN0cmluZzogZnVuY3Rpb24oKSB7CiAg ICByZXR1cm4gdGhpcy5idWZmZXI7CiAgfQp9OwoKfSkoKTsKCgoKKGZ1bmN0 aW9uKCkgewovKioKQG1vZHVsZSBlbWJlcgpAc3VibW9kdWxlIGVtYmVyLXZp ZXdzCiovCgp2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQs IGZtdCA9IEVtYmVyLlN0cmluZy5mbXQ7CgovKioKICBgRW1iZXIuRXZlbnRE aXNwYXRjaGVyYCBoYW5kbGVzIGRlbGVnYXRpbmcgYnJvd3NlciBldmVudHMg dG8gdGhlaXIKICBjb3JyZXNwb25kaW5nIGBFbWJlci5WaWV3cy5gIEZvciBl eGFtcGxlLCB3aGVuIHlvdSBjbGljayBvbiBhIHZpZXcsCiAgYEVtYmVyLkV2 ZW50RGlzcGF0Y2hlcmAgZW5zdXJlcyB0aGF0IHRoYXQgdmlldydzIGBtb3Vz ZURvd25gIG1ldGhvZCBnZXRzCiAgY2FsbGVkLgoKICBAY2xhc3MgRXZlbnRE aXNwYXRjaGVyCiAgQG5hbWVzcGFjZSBFbWJlcgogIEBwcml2YXRlCiAgQGV4 dGVuZHMgRW1iZXIuT2JqZWN0CiovCkVtYmVyLkV2ZW50RGlzcGF0Y2hlciA9 IEVtYmVyLk9iamVjdC5leHRlbmQoewoKICAvKioKICAgIFRoZSBzZXQgb2Yg ZXZlbnRzIG5hbWVzIChhbmQgYXNzb2NpYXRlZCBoYW5kbGVyIGZ1bmN0aW9u IG5hbWVzKSB0byBiZSBzZXR1cAogICAgYW5kIGRpc3BhdGNoZWQgYnkgdGhl IGBFdmVudERpc3BhdGNoZXJgLiBDdXN0b20gZXZlbnRzIGNhbiBhZGRlZCB0 byB0aGlzIGxpc3QgYXQgc2V0dXAKICAgIHRpbWUsIGdlbmVyYWxseSB2aWEg dGhlIGBFbWJlci5BcHBsaWNhdGlvbi5jdXN0b21FdmVudHNgIGhhc2guIE9u bHkgb3ZlcnJpZGUgdGhpcwogICAgZGVmYXVsdCBzZXQgdG8gcHJldmVudCB0 aGUgRXZlbnREaXNwYXRjaGVyIGZyb20gbGlzdGVuaW5nIG9uIHNvbWUgZXZl bnRzIGFsbCB0b2dldGhlci4KCiAgICBUaGlzIHNldCB3aWxsIGJlIG1vZGlm aWVkIGJ5IGBzZXR1cGAgdG8gYWxzbyBpbmNsdWRlIGFueSBldmVudHMgYWRk ZWQgYXQgdGhhdCB0aW1lLgoKICAgIEBwcm9wZXJ0eSBldmVudHMKICAgIEB0 eXBlIE9iamVjdAogICovCiAgZXZlbnRzOiB7CiAgICB0b3VjaHN0YXJ0ICA6 ICd0b3VjaFN0YXJ0JywKICAgIHRvdWNobW92ZSAgIDogJ3RvdWNoTW92ZScs CiAgICB0b3VjaGVuZCAgICA6ICd0b3VjaEVuZCcsCiAgICB0b3VjaGNhbmNl bCA6ICd0b3VjaENhbmNlbCcsCiAgICBrZXlkb3duICAgICA6ICdrZXlEb3du JywKICAgIGtleXVwICAgICAgIDogJ2tleVVwJywKICAgIGtleXByZXNzICAg IDogJ2tleVByZXNzJywKICAgIG1vdXNlZG93biAgIDogJ21vdXNlRG93bics CiAgICBtb3VzZXVwICAgICA6ICdtb3VzZVVwJywKICAgIGNvbnRleHRtZW51 IDogJ2NvbnRleHRNZW51JywKICAgIGNsaWNrICAgICAgIDogJ2NsaWNrJywK ICAgIGRibGNsaWNrICAgIDogJ2RvdWJsZUNsaWNrJywKICAgIG1vdXNlbW92 ZSAgIDogJ21vdXNlTW92ZScsCiAgICBmb2N1c2luICAgICA6ICdmb2N1c0lu JywKICAgIGZvY3Vzb3V0ICAgIDogJ2ZvY3VzT3V0JywKICAgIG1vdXNlZW50 ZXIgIDogJ21vdXNlRW50ZXInLAogICAgbW91c2VsZWF2ZSAgOiAnbW91c2VM ZWF2ZScsCiAgICBzdWJtaXQgICAgICA6ICdzdWJtaXQnLAogICAgaW5wdXQg ICAgICAgOiAnaW5wdXQnLAogICAgY2hhbmdlICAgICAgOiAnY2hhbmdlJywK ICAgIGRyYWdzdGFydCAgIDogJ2RyYWdTdGFydCcsCiAgICBkcmFnICAgICAg ICA6ICdkcmFnJywKICAgIGRyYWdlbnRlciAgIDogJ2RyYWdFbnRlcicsCiAg ICBkcmFnbGVhdmUgICA6ICdkcmFnTGVhdmUnLAogICAgZHJhZ292ZXIgICAg OiAnZHJhZ092ZXInLAogICAgZHJvcCAgICAgICAgOiAnZHJvcCcsCiAgICBk cmFnZW5kICAgICA6ICdkcmFnRW5kJwogIH0sCgogIC8qKgogICAgVGhlIHJv b3QgRE9NIGVsZW1lbnQgdG8gd2hpY2ggZXZlbnQgbGlzdGVuZXJzIHNob3Vs ZCBiZSBhdHRhY2hlZC4gRXZlbnQKICAgIGxpc3RlbmVycyB3aWxsIGJlIGF0 dGFjaGVkIHRvIHRoZSBkb2N1bWVudCB1bmxlc3MgdGhpcyBpcyBvdmVycmlk ZGVuLgoKICAgIENhbiBiZSBzcGVjaWZpZWQgYXMgYSBET01FbGVtZW50IG9y IGEgc2VsZWN0b3Igc3RyaW5nLgoKICAgIFRoZSBkZWZhdWx0IGJvZHkgaXMg YSBzdHJpbmcgc2luY2UgdGhpcyBtYXkgYmUgZXZhbHVhdGVkIGJlZm9yZSBk b2N1bWVudC5ib2R5CiAgICBleGlzdHMgaW4gdGhlIERPTS4KCiAgICBAcHJp dmF0ZQogICAgQHByb3BlcnR5IHJvb3RFbGVtZW50CiAgICBAdHlwZSBET01F bGVtZW50CiAgICBAZGVmYXVsdCAnYm9keScKICAqLwogIHJvb3RFbGVtZW50 OiAnYm9keScsCgogIC8qKgogICAgU2V0cyB1cCBldmVudCBsaXN0ZW5lcnMg Zm9yIHN0YW5kYXJkIGJyb3dzZXIgZXZlbnRzLgoKICAgIFRoaXMgd2lsbCBi ZSBjYWxsZWQgYWZ0ZXIgdGhlIGJyb3dzZXIgc2VuZHMgYSBgRE9NQ29udGVu dFJlYWR5YCBldmVudC4gQnkKICAgIGRlZmF1bHQsIGl0IHdpbGwgc2V0IHVw IGFsbCBvZiB0aGUgbGlzdGVuZXJzIG9uIHRoZSBkb2N1bWVudCBib2R5LiBJ ZiB5b3UKICAgIHdvdWxkIGxpa2UgdG8gcmVnaXN0ZXIgdGhlIGxpc3RlbmVy cyBvbiBhIGRpZmZlcmVudCBlbGVtZW50LCBzZXQgdGhlIGV2ZW50CiAgICBk aXNwYXRjaGVyJ3MgYHJvb3RgIHByb3BlcnR5LgoKICAgIEBwcml2YXRlCiAg ICBAbWV0aG9kIHNldHVwCiAgICBAcGFyYW0gYWRkZWRFdmVudHMge0hhc2h9 CiAgKi8KICBzZXR1cDogZnVuY3Rpb24oYWRkZWRFdmVudHMsIHJvb3RFbGVt ZW50KSB7CiAgICB2YXIgZXZlbnQsIGV2ZW50cyA9IGdldCh0aGlzLCAnZXZl bnRzJyk7CgogICAgRW1iZXIuJC5leHRlbmQoZXZlbnRzLCBhZGRlZEV2ZW50 cyB8fCB7fSk7CgoKICAgIGlmICghRW1iZXIuaXNOb25lKHJvb3RFbGVtZW50 KSkgewogICAgICBzZXQodGhpcywgJ3Jvb3RFbGVtZW50Jywgcm9vdEVsZW1l bnQpOwogICAgfQoKICAgIHJvb3RFbGVtZW50ID0gRW1iZXIuJChnZXQodGhp cywgJ3Jvb3RFbGVtZW50JykpOwoKICAgIEVtYmVyLmFzc2VydChmbXQoJ1lv dSBjYW5ub3QgdXNlIHRoZSBzYW1lIHJvb3QgZWxlbWVudCAoJUApIG11bHRp cGxlIHRpbWVzIGluIGFuIEVtYmVyLkFwcGxpY2F0aW9uJywgW3Jvb3RFbGVt ZW50LnNlbGVjdG9yIHx8IHJvb3RFbGVtZW50WzBdLnRhZ05hbWVdKSwgIXJv b3RFbGVtZW50LmlzKCcuZW1iZXItYXBwbGljYXRpb24nKSk7CiAgICBFbWJl ci5hc3NlcnQoJ1lvdSBjYW5ub3QgbWFrZSBhIG5ldyBFbWJlci5BcHBsaWNh dGlvbiB1c2luZyBhIHJvb3QgZWxlbWVudCB0aGF0IGlzIGEgZGVzY2VuZGVu dCBvZiBhbiBleGlzdGluZyBFbWJlci5BcHBsaWNhdGlvbicsICFyb290RWxl bWVudC5jbG9zZXN0KCcuZW1iZXItYXBwbGljYXRpb24nKS5sZW5ndGgpOwog ICAgRW1iZXIuYXNzZXJ0KCdZb3UgY2Fubm90IG1ha2UgYSBuZXcgRW1iZXIu QXBwbGljYXRpb24gdXNpbmcgYSByb290IGVsZW1lbnQgdGhhdCBpcyBhbiBh bmNlc3RvciBvZiBhbiBleGlzdGluZyBFbWJlci5BcHBsaWNhdGlvbicsICFy b290RWxlbWVudC5maW5kKCcuZW1iZXItYXBwbGljYXRpb24nKS5sZW5ndGgp OwoKICAgIHJvb3RFbGVtZW50LmFkZENsYXNzKCdlbWJlci1hcHBsaWNhdGlv bicpOwoKICAgIEVtYmVyLmFzc2VydCgnVW5hYmxlIHRvIGFkZCAiZW1iZXIt YXBwbGljYXRpb24iIGNsYXNzIHRvIHJvb3RFbGVtZW50LiBNYWtlIHN1cmUg eW91IHNldCByb290RWxlbWVudCB0byB0aGUgYm9keSBvciBhbiBlbGVtZW50 IGluIHRoZSBib2R5LicsIHJvb3RFbGVtZW50LmlzKCcuZW1iZXItYXBwbGlj YXRpb24nKSk7CgogICAgZm9yIChldmVudCBpbiBldmVudHMpIHsKICAgICAg aWYgKGV2ZW50cy5oYXNPd25Qcm9wZXJ0eShldmVudCkpIHsKICAgICAgICB0 aGlzLnNldHVwSGFuZGxlcihyb290RWxlbWVudCwgZXZlbnQsIGV2ZW50c1tl dmVudF0pOwogICAgICB9CiAgICB9CiAgfSwKCiAgLyoqCiAgICBSZWdpc3Rl cnMgYW4gZXZlbnQgbGlzdGVuZXIgb24gdGhlIGRvY3VtZW50LiBJZiB0aGUg Z2l2ZW4gZXZlbnQgaXMKICAgIHRyaWdnZXJlZCwgdGhlIHByb3ZpZGVkIGV2 ZW50IGhhbmRsZXIgd2lsbCBiZSB0cmlnZ2VyZWQgb24gdGhlIHRhcmdldCB2 aWV3LgoKICAgIElmIHRoZSB0YXJnZXQgdmlldyBkb2VzIG5vdCBpbXBsZW1l bnQgdGhlIGV2ZW50IGhhbmRsZXIsIG9yIGlmIHRoZSBoYW5kbGVyCiAgICBy ZXR1cm5zIGBmYWxzZWAsIHRoZSBwYXJlbnQgdmlldyB3aWxsIGJlIGNhbGxl ZC4gVGhlIGV2ZW50IHdpbGwgY29udGludWUgdG8KICAgIGJ1YmJsZSB0byBl YWNoIHN1Y2Nlc3NpdmUgcGFyZW50IHZpZXcgdW50aWwgaXQgcmVhY2hlcyB0 aGUgdG9wLgoKICAgIEZvciBleGFtcGxlLCB0byBoYXZlIHRoZSBgbW91c2VE b3duYCBtZXRob2QgY2FsbGVkIG9uIHRoZSB0YXJnZXQgdmlldyB3aGVuCiAg ICBhIGBtb3VzZWRvd25gIGV2ZW50IGlzIHJlY2VpdmVkIGZyb20gdGhlIGJy b3dzZXIsIGRvIHRoZSBmb2xsb3dpbmc6CgogICAgYGBgamF2YXNjcmlwdAog ICAgc2V0dXBIYW5kbGVyKCdtb3VzZWRvd24nLCAnbW91c2VEb3duJyk7CiAg ICBgYGAKCiAgICBAcHJpdmF0ZQogICAgQG1ldGhvZCBzZXR1cEhhbmRsZXIK ICAgIEBwYXJhbSB7RWxlbWVudH0gcm9vdEVsZW1lbnQKICAgIEBwYXJhbSB7 U3RyaW5nfSBldmVudCB0aGUgYnJvd3Nlci1vcmlnaW5hdGVkIGV2ZW50IHRv IGxpc3RlbiB0bwogICAgQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZSB0aGUg bmFtZSBvZiB0aGUgbWV0aG9kIHRvIGNhbGwgb24gdGhlIHZpZXcKICAqLwog IHNldHVwSGFuZGxlcjogZnVuY3Rpb24ocm9vdEVsZW1lbnQsIGV2ZW50LCBl dmVudE5hbWUpIHsKICAgIHZhciBzZWxmID0gdGhpczsKCiAgICByb290RWxl bWVudC5vbihldmVudCArICcuZW1iZXInLCAnLmVtYmVyLXZpZXcnLCBmdW5j dGlvbihldnQsIHRyaWdnZXJpbmdNYW5hZ2VyKSB7CiAgICAgIHZhciB2aWV3 ID0gRW1iZXIuVmlldy52aWV3c1t0aGlzLmlkXSwKICAgICAgICAgIHJlc3Vs dCA9IHRydWUsIG1hbmFnZXIgPSBudWxsOwoKICAgICAgbWFuYWdlciA9IHNl bGYuX2ZpbmROZWFyZXN0RXZlbnRNYW5hZ2VyKHZpZXcsIGV2ZW50TmFtZSk7 CgogICAgICBpZiAobWFuYWdlciAmJiBtYW5hZ2VyICE9PSB0cmlnZ2VyaW5n TWFuYWdlcikgewogICAgICAgIHJlc3VsdCA9IHNlbGYuX2Rpc3BhdGNoRXZl bnQobWFuYWdlciwgZXZ0LCBldmVudE5hbWUsIHZpZXcpOwogICAgICB9IGVs c2UgaWYgKHZpZXcpIHsKICAgICAgICByZXN1bHQgPSBzZWxmLl9idWJibGVF dmVudCh2aWV3LCBldnQsIGV2ZW50TmFtZSk7CiAgICAgIH0gZWxzZSB7CiAg ICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICB9CgogICAgICBy ZXR1cm4gcmVzdWx0OwogICAgfSk7CgogICAgcm9vdEVsZW1lbnQub24oZXZl bnQgKyAnLmVtYmVyJywgJ1tkYXRhLWVtYmVyLWFjdGlvbl0nLCBmdW5jdGlv bihldnQpIHsKICAgICAgdmFyIGFjdGlvbklkID0gRW1iZXIuJChldnQuY3Vy cmVudFRhcmdldCkuYXR0cignZGF0YS1lbWJlci1hY3Rpb24nKSwKICAgICAg ICAgIGFjdGlvbiAgID0gRW1iZXIuSGFuZGxlYmFycy5BY3Rpb25IZWxwZXIu cmVnaXN0ZXJlZEFjdGlvbnNbYWN0aW9uSWRdOwoKICAgICAgLy8gV2UgaGF2 ZSB0byBjaGVjayBmb3IgYWN0aW9uIGhlcmUgc2luY2UgaW4gc29tZSBjYXNl cywgalF1ZXJ5IHdpbGwgdHJpZ2dlcgogICAgICAvLyBhbiBldmVudCBvbiBg cmVtb3ZlQ2hpbGRgIChpLmUuIGZvY3Vzb3V0KSBhZnRlciB3ZSd2ZSBhbHJl YWR5IHRvcm4gZG93biB0aGUKICAgICAgLy8gYWN0aW9uIGhhbmRsZXJzIGZv ciB0aGUgdmlldy4KICAgICAgaWYgKGFjdGlvbiAmJiBhY3Rpb24uZXZlbnRO YW1lID09PSBldmVudE5hbWUpIHsKICAgICAgICByZXR1cm4gYWN0aW9uLmhh bmRsZXIoZXZ0KTsKICAgICAgfQogICAgfSk7CiAgfSwKCiAgX2ZpbmROZWFy ZXN0RXZlbnRNYW5hZ2VyOiBmdW5jdGlvbih2aWV3LCBldmVudE5hbWUpIHsK ICAgIHZhciBtYW5hZ2VyID0gbnVsbDsKCiAgICB3aGlsZSAodmlldykgewog ICAgICBtYW5hZ2VyID0gZ2V0KHZpZXcsICdldmVudE1hbmFnZXInKTsKICAg ICAgaWYgKG1hbmFnZXIgJiYgbWFuYWdlcltldmVudE5hbWVdKSB7IGJyZWFr OyB9CgogICAgICB2aWV3ID0gZ2V0KHZpZXcsICdwYXJlbnRWaWV3Jyk7CiAg ICB9CgogICAgcmV0dXJuIG1hbmFnZXI7CiAgfSwKCiAgX2Rpc3BhdGNoRXZl bnQ6IGZ1bmN0aW9uKG9iamVjdCwgZXZ0LCBldmVudE5hbWUsIHZpZXcpIHsK ICAgIHZhciByZXN1bHQgPSB0cnVlOwoKICAgIHZhciBoYW5kbGVyID0gb2Jq ZWN0W2V2ZW50TmFtZV07CiAgICBpZiAoRW1iZXIudHlwZU9mKGhhbmRsZXIp ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHJlc3VsdCA9IEVtYmVyLnJ1bihv YmplY3QsIGhhbmRsZXIsIGV2dCwgdmlldyk7CiAgICAgIC8vIERvIG5vdCBw cmV2ZW50RGVmYXVsdCBpbiBldmVudE1hbmFnZXJzLgogICAgICBldnQuc3Rv cFByb3BhZ2F0aW9uKCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgcmVzdWx0 ID0gdGhpcy5fYnViYmxlRXZlbnQodmlldywgZXZ0LCBldmVudE5hbWUpOwog ICAgfQoKICAgIHJldHVybiByZXN1bHQ7CiAgfSwKCiAgX2J1YmJsZUV2ZW50 OiBmdW5jdGlvbih2aWV3LCBldnQsIGV2ZW50TmFtZSkgewogICAgcmV0dXJu IEVtYmVyLnJ1bih2aWV3LCB2aWV3LmhhbmRsZUV2ZW50LCBldmVudE5hbWUs IGV2dCk7CiAgfSwKCiAgZGVzdHJveTogZnVuY3Rpb24oKSB7CiAgICB2YXIg cm9vdEVsZW1lbnQgPSBnZXQodGhpcywgJ3Jvb3RFbGVtZW50Jyk7CiAgICBF bWJlci4kKHJvb3RFbGVtZW50KS5vZmYoJy5lbWJlcicsICcqKicpLnJlbW92 ZUNsYXNzKCdlbWJlci1hcHBsaWNhdGlvbicpOwogICAgcmV0dXJuIHRoaXMu X3N1cGVyKCk7CiAgfQp9KTsKCn0pKCk7CgoKCihmdW5jdGlvbigpIHsKLyoq CkBtb2R1bGUgZW1iZXIKQHN1Ym1vZHVsZSBlbWJlci12aWV3cwoqLwoKLy8g QWRkIGEgbmV3IG5hbWVkIHF1ZXVlIGZvciByZW5kZXJpbmcgdmlld3MgdGhh dCBoYXBwZW5zCi8vIGFmdGVyIGJpbmRpbmdzIGhhdmUgc3luY2VkLCBhbmQg YSBxdWV1ZSBmb3Igc2NoZWR1bGluZyBhY3Rpb25zCi8vIHRoYXQgdGhhdCBz aG91bGQgb2NjdXIgYWZ0ZXIgdmlldyByZW5kZXJpbmcuCnZhciBxdWV1ZXMg PSBFbWJlci5ydW4ucXVldWVzLAogICAgaW5kZXhPZiA9IEVtYmVyLkFycmF5 UG9seWZpbGxzLmluZGV4T2Y7CnF1ZXVlcy5zcGxpY2UoaW5kZXhPZi5jYWxs KHF1ZXVlcywgJ2FjdGlvbnMnKSsxLCAwLCAncmVuZGVyJywgJ2FmdGVyUmVu ZGVyJyk7Cgp9KSgpOwoKCgooZnVuY3Rpb24oKSB7Cgp9KSgpOwoKCgooZnVu Y3Rpb24oKSB7CnZhciBzdGF0ZXMgPSB7fTsKCi8qKgpAbW9kdWxlIGVtYmVy CkBzdWJtb2R1bGUgZW1iZXItdmlld3MKKi8KCnZhciBnZXQgPSBFbWJlci5n ZXQsIHNldCA9IEVtYmVyLnNldCwKICAgIGd1aWRGb3IgPSBFbWJlci5ndWlk Rm9yLAogICAgYV9mb3JFYWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmZv ckVhY2gsCiAgICBhX2FkZE9iamVjdCA9IEVtYmVyLkVudW1lcmFibGVVdGls cy5hZGRPYmplY3QsCiAgICBtZXRhID0gRW1iZXIubWV0YSwKICAgIGRlZmlu ZVByb3BlcnR5ID0gRW1iZXIuZGVmaW5lUHJvcGVydHk7CgpmdW5jdGlvbiBu dWxsVmlld3NCdWZmZXIodmlldykgewogIHZpZXcuYnVmZmVyID0gbnVsbDsK fQoKdmFyIGNoaWxkVmlld3NQcm9wZXJ0eSA9IEVtYmVyLmNvbXB1dGVkKGZ1 bmN0aW9uKCkgewogIHZhciBjaGlsZFZpZXdzID0gdGhpcy5fY2hpbGRWaWV3 cywgcmV0ID0gRW1iZXIuQSgpLCB2aWV3ID0gdGhpczsKCiAgYV9mb3JFYWNo KGNoaWxkVmlld3MsIGZ1bmN0aW9uKHZpZXcpIHsKICAgIHZhciBjdXJyZW50 Q2hpbGRWaWV3czsKICAgIGlmICh2aWV3LmlzVmlydHVhbCkgewogICAgICBp ZiAoY3VycmVudENoaWxkVmlld3MgPSBnZXQodmlldywgJ2NoaWxkVmlld3Mn KSkgewogICAgICAgIHJldC5wdXNoT2JqZWN0cyhjdXJyZW50Q2hpbGRWaWV3 cyk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHJldC5wdXNoKHZpZXcp OwogICAgfQogIH0pOwoKICByZXQucmVwbGFjZSA9IGZ1bmN0aW9uIChpZHgs IHJlbW92ZWRDb3VudCwgYWRkZWRWaWV3cykgewogICAgaWYgKHZpZXcgaW5z dGFuY2VvZiBFbWJlci5Db250YWluZXJWaWV3KSB7CiAgICAgIEVtYmVyLmRl cHJlY2F0ZSgiTWFuaXB1bGF0aW5nIGFuIEVtYmVyLkNvbnRhaW5lclZpZXcg dGhyb3VnaCBpdHMgY2hpbGRWaWV3cyBwcm9wZXJ0eSBpcyBkZXByZWNhdGVk LiBQbGVhc2UgdXNlIHRoZSBDb250YWluZXJWaWV3IGluc3RhbmNlIGl0c2Vs ZiBhcyBhbiBFbWJlci5NdXRhYmxlQXJyYXkuIik7CiAgICAgIHJldHVybiB2 aWV3LnJlcGxhY2UoaWR4LCByZW1vdmVkQ291bnQsIGFkZGVkVmlld3MpOwog ICAgfQogICAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKCJjaGlsZFZpZXdzIGlz IGltbXV0YWJsZSIpOwogIH07CgogIHJldHVybiByZXQ7Cn0pOwoKRW1iZXIu d2FybigiVGhlIFZJRVdfUFJFU0VSVkVTX0NPTlRFWFQgZmxhZyBoYXMgYmVl biByZW1vdmVkIGFuZCB0aGUgZnVuY3Rpb25hbGl0eSBjYW4gbm8gbG9uZ2Vy IGJlIGRpc2FibGVkLiIsIEVtYmVyLkVOVi5WSUVXX1BSRVNFUlZFU19DT05U RVhUICE9PSBmYWxzZSk7CgovKioKICBHbG9iYWwgaGFzaCBvZiBzaGFyZWQg dGVtcGxhdGVzLiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBiZSBwb3B1bGF0 ZWQKICBieSB0aGUgYnVpbGQgdG9vbHMgc28gdGhhdCB5b3UgY2FuIHN0b3Jl IHlvdXIgSGFuZGxlYmFycyB0ZW1wbGF0ZXMgaW4KICBzZXBhcmF0ZSBmaWxl cyB0aGF0IGdldCBsb2FkZWQgaW50byBKYXZhU2NyaXB0IGF0IGJ1aWxkdGlt ZS4KCiAgQHByb3BlcnR5IFRFTVBMQVRFUwogIEBmb3IgRW1iZXIKICBAdHlw ZSBIYXNoCiovCkVtYmVyLlRFTVBMQVRFUyA9IHt9OwoKLyoqCiAgYEVtYmVy LkNvcmVWaWV3YCBpcyBhbiBhYnN0cmFjdCBjbGFzcyB0aGF0IGV4aXN0cyB0 byBnaXZlIHZpZXctbGlrZSBiZWhhdmlvcgogIHRvIGJvdGggRW1iZXIncyBt YWluIHZpZXcgY2xhc3MgYEVtYmVyLlZpZXdgIGFuZCBvdGhlciBjbGFzc2Vz IGxpa2UKICBgRW1iZXIuX1NpbXBsZU1ldGFtb3JwaFZpZXdgIHRoYXQgZG9u J3QgbmVlZCB0aGUgZnVsbHkgZnVuY3Rpb25hbHRpeSBvZgogIGBFbWJlci5W aWV3YC4KCiAgVW5sZXNzIHlvdSBoYXZlIHNwZWNpZmljIG5lZWRzIGZvciBg Q29yZVZpZXdgLCB5b3Ugd2lsbCB1c2UgYEVtYmVyLlZpZXdgCiAgaW4geW91 ciBhcHBsaWNhdGlvbnMuCgogIEBjbGFzcyBDb3JlVmlldwogIEBuYW1lc3Bh Y2UgRW1iZXIKICBAZXh0ZW5kcyBFbWJlci5PYmplY3QKICBAdXNlcyBFbWJl ci5FdmVudGVkCiAgQHVzZXMgRW1iZXIuQWN0aW9uSGFuZGxlcgoqLwoKRW1i ZXIuQ29yZVZpZXcgPSBFbWJlci5PYmplY3QuZXh0ZW5kKEVtYmVyLkV2ZW50 ZWQsIEVtYmVyLkFjdGlvbkhhbmRsZXIsIHsKICBpc1ZpZXc6IHRydWUsCgog IHN0YXRlczogc3RhdGVzLAoKICBpbml0OiBmdW5jdGlvbigpIHsKICAgIHRo aXMuX3N1cGVyKCk7CiAgICB0aGlzLnRyYW5zaXRpb25UbygncHJlUmVuZGVy Jyk7CiAgICB0aGlzLl9pc1Zpc2libGUgPSBnZXQodGhpcywgJ2lzVmlzaWJs ZScpOwogIH0sCgogIC8qKgogICAgSWYgdGhlIHZpZXcgaXMgY3VycmVudGx5 IGluc2VydGVkIGludG8gdGhlIERPTSBvZiBhIHBhcmVudCB2aWV3LCB0aGlz CiAgICBwcm9wZXJ0eSB3aWxsIHBvaW50IHRvIHRoZSBwYXJlbnQgb2YgdGhl IHZpZXcuCgogICAgQHByb3BlcnR5IHBhcmVudFZpZXcKICAgIEB0eXBlIEVt YmVyLlZpZXcKICAgIEBkZWZhdWx0IG51bGwKICAqLwogIHBhcmVudFZpZXc6 IEVtYmVyLmNvbXB1dGVkKCdfcGFyZW50VmlldycsIGZ1bmN0aW9uKCkgewog ICAgdmFyIHBhcmVudCA9IHRoaXMuX3BhcmVudFZpZXc7CgogICAgaWYgKHBh cmVudCAmJiBwYXJlbnQuaXNWaXJ0dWFsKSB7CiAgICAgIHJldHVybiBnZXQo cGFyZW50LCAncGFyZW50VmlldycpOwogICAgfSBlbHNlIHsKICAgICAgcmV0 dXJuIHBhcmVudDsKICAgIH0KICB9KSwKCiAgc3RhdGU6IG51bGwsCgogIF9w YXJlbnRWaWV3OiBudWxsLAoKICAvLyByZXR1cm4gdGhlIGN1cnJlbnQgdmll dywgbm90IGluY2x1ZGluZyB2aXJ0dWFsIHZpZXdzCiAgY29uY3JldGVWaWV3 OiBFbWJlci5jb21wdXRlZCgncGFyZW50VmlldycsIGZ1bmN0aW9uKCkgewog ICAgaWYgKCF0aGlzLmlzVmlydHVhbCkgeyByZXR1cm4gdGhpczsgfQogICAg ZWxzZSB7IHJldHVybiBnZXQodGhpcywgJ3BhcmVudFZpZXcnKTsgfQogIH0p LAoKICBpbnN0cnVtZW50TmFtZTogJ2NvcmVfdmlldycsCgogIGluc3RydW1l bnREZXRhaWxzOiBmdW5jdGlvbihoYXNoKSB7CiAgICBoYXNoLm9iamVjdCA9 IHRoaXMudG9TdHJpbmcoKTsKICB9LAoKICAvKioKICAgIEludm9rZWQgYnkg dGhlIHZpZXcgc3lzdGVtIHdoZW4gdGhpcyB2aWV3IG5lZWRzIHRvIHByb2R1 Y2UgYW4gSFRNTAogICAgcmVwcmVzZW50YXRpb24uIFRoaXMgbWV0aG9kIHdp bGwgY3JlYXRlIGEgbmV3IHJlbmRlciBidWZmZXIsIGlmIG5lZWRlZCwKICAg IHRoZW4gYXBwbHkgYW55IGRlZmF1bHQgYXR0cmlidXRlcywgc3VjaCBhcyBj bGFzcyBuYW1lcyBhbmQgdmlzaWJpbGl0eS4KICAgIEZpbmFsbHksIHRoZSBg cmVuZGVyKClgIG1ldGhvZCBpcyBpbnZva2VkLCB3aGljaCBpcyByZXNwb25z aWJsZSBmb3IKICAgIGRvaW5nIHRoZSBidWxrIG9mIHRoZSByZW5kZXJpbmcu CgogICAgWW91IHNob3VsZCBub3QgbmVlZCB0byBvdmVycmlkZSB0aGlzIG1l dGhvZDsgaW5zdGVhZCwgaW1wbGVtZW50IHRoZQogICAgYHRlbXBsYXRlYCBw cm9wZXJ0eSwgb3IgaWYgeW91IG5lZWQgbW9yZSBjb250cm9sLCBvdmVycmlk ZSB0aGUgYHJlbmRlcmAKICAgIG1ldGhvZC4KCiAgICBAbWV0aG9kIHJlbmRl clRvQnVmZmVyCiAgICBAcGFyYW0ge0VtYmVyLlJlbmRlckJ1ZmZlcn0gYnVm ZmVyIHRoZSByZW5kZXIgYnVmZmVyLiBJZiBubyBidWZmZXIgaXMKICAgICAg cGFzc2VkLCBhIGRlZmF1bHQgYnVmZmVyLCB1c2luZyB0aGUgY3VycmVudCB2 aWV3J3MgYHRhZ05hbWVgLCB3aWxsCiAgICAgIGJlIHVzZWQuCiAgICBAcHJp dmF0ZQogICovCiAgcmVuZGVyVG9CdWZmZXI6IGZ1bmN0aW9uKHBhcmVudEJ1 ZmZlciwgYnVmZmVyT3BlcmF0aW9uKSB7CiAgICB2YXIgbmFtZSA9ICdyZW5k ZXIuJyArIHRoaXMuaW5zdHJ1bWVudE5hbWUsCiAgICAgICAgZGV0YWlscyA9 IHt9OwoKICAgIHRoaXMuaW5zdHJ1bWVudERldGFpbHMoZGV0YWlscyk7Cgog ICAgcmV0dXJuIEVtYmVyLmluc3RydW1lbnQobmFtZSwgZGV0YWlscywgZnVu Y3Rpb24gaW5zdHJ1bWVudFJlbmRlclRvQnVmZmVyKCkgewogICAgICByZXR1 cm4gdGhpcy5fcmVuZGVyVG9CdWZmZXIocGFyZW50QnVmZmVyLCBidWZmZXJP cGVyYXRpb24pOwogICAgfSwgdGhpcyk7CiAgfSwKCiAgX3JlbmRlclRvQnVm ZmVyOiBmdW5jdGlvbihwYXJlbnRCdWZmZXIsIGJ1ZmZlck9wZXJhdGlvbikg ewogICAgLy8gSWYgdGhpcyBpcyB0aGUgdG9wLW1vc3Qgdmlldywgc3RhcnQg YSBuZXcgYnVmZmVyLiBPdGhlcndpc2UsCiAgICAvLyBjcmVhdGUgYSBuZXcg YnVmZmVyIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW5hbCB1c2luZyB0aGUKICAg IC8vIHByb3ZpZGVkIGJ1ZmZlciBvcGVyYXRpb24gKGZvciBleGFtcGxlLCBg aW5zZXJ0QWZ0ZXJgIHdpbGwKICAgIC8vIGluc2VydCBhIG5ldyBidWZmZXIg YWZ0ZXIgdGhlICJwYXJlbnQgYnVmZmVyIikuCiAgICB2YXIgdGFnTmFtZSA9 IHRoaXMudGFnTmFtZTsKCiAgICBpZiAodGFnTmFtZSA9PT0gbnVsbCB8fCB0 YWdOYW1lID09PSB1bmRlZmluZWQpIHsKICAgICAgdGFnTmFtZSA9ICdkaXYn OwogICAgfQoKICAgIHZhciBidWZmZXIgPSB0aGlzLmJ1ZmZlciA9IHBhcmVu dEJ1ZmZlciAmJiBwYXJlbnRCdWZmZXIuYmVnaW4odGFnTmFtZSkgfHwgRW1i ZXIuUmVuZGVyQnVmZmVyKHRhZ05hbWUpOwogICAgdGhpcy50cmFuc2l0aW9u VG8oJ2luQnVmZmVyJywgZmFsc2UpOwoKICAgIHRoaXMuYmVmb3JlUmVuZGVy KGJ1ZmZlcik7CiAgICB0aGlzLnJlbmRlcihidWZmZXIpOwogICAgdGhpcy5h ZnRlclJlbmRlcihidWZmZXIpOwoKICAgIHJldHVybiBidWZmZXI7CiAgfSwK CiAgLyoqCiAgICBPdmVycmlkZSB0aGUgZGVmYXVsdCBldmVudCBmaXJpbmcg ZnJvbSBgRW1iZXIuRXZlbnRlZGAgdG8KICAgIGFsc28gY2FsbCBtZXRob2Rz IHdpdGggdGhlIGdpdmVuIG5hbWUuCgogICAgQG1ldGhvZCB0cmlnZ2VyCiAg ICBAcGFyYW0gbmFtZSB7U3RyaW5nfQogICAgQHByaXZhdGUKICAqLwogIHRy aWdnZXI6IGZ1bmN0aW9uKG5hbWUpIHsKICAgIHRoaXMuX3N1cGVyLmFwcGx5 KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB2YXIgbWV0aG9kID0gdGhpc1tuYW1l XTsKICAgIGlmIChtZXRob2QpIHsKICAgICAgdmFyIGFyZ3MgPSBbXSwgaSwg bDsKICAgICAgZm9yIChpID0gMSwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkg PCBsOyBpKyspIHsKICAgICAgICBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTsK ICAgICAgfQogICAgICByZXR1cm4gbWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3Mp OwogICAgfQogIH0sCgogIGRlcHJlY2F0ZWRTZW5kSGFuZGxlczogZnVuY3Rp b24oYWN0aW9uTmFtZSkgewogICAgcmV0dXJuICEhdGhpc1thY3Rpb25OYW1l XTsKICB9LAoKICBkZXByZWNhdGVkU2VuZDogZnVuY3Rpb24oYWN0aW9uTmFt ZSkgewogICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywg MSk7CiAgICBFbWJlci5hc3NlcnQoJycgKyB0aGlzICsgIiBoYXMgdGhlIGFj dGlvbiAiICsgYWN0aW9uTmFtZSArICIgYnV0IGl0IGlzIG5vdCBhIGZ1bmN0 aW9uIiwgdHlwZW9mIHRoaXNbYWN0aW9uTmFtZV0gPT09ICdmdW5jdGlvbicp OwogICAgRW1iZXIuZGVwcmVjYXRlKCdBY3Rpb24gaGFuZGxlcnMgaW1wbGVt ZW50ZWQgZGlyZWN0bHkgb24gdmlld3MgYXJlIGRlcHJlY2F0ZWQgaW4gZmF2 b3Igb2YgYWN0aW9uIGhhbmRsZXJzIG9uIGFuIGBhY3Rpb25zYCBvYmplY3Qg KCBhY3Rpb246IGAnICsgYWN0aW9uTmFtZSArICdgIG9uICcgKyB0aGlzICsg JyknLCBmYWxzZSk7CiAgICB0aGlzW2FjdGlvbk5hbWVdLmFwcGx5KHRoaXMs IGFyZ3MpOwogICAgcmV0dXJuOwogIH0sCgogIGhhczogZnVuY3Rpb24obmFt ZSkgewogICAgcmV0dXJuIEVtYmVyLnR5cGVPZih0aGlzW25hbWVdKSA9PT0g J2Z1bmN0aW9uJyB8fCB0aGlzLl9zdXBlcihuYW1lKTsKICB9LAoKICBkZXN0 cm95OiBmdW5jdGlvbigpIHsKICAgIHZhciBwYXJlbnQgPSB0aGlzLl9wYXJl bnRWaWV3OwoKICAgIGlmICghdGhpcy5fc3VwZXIoKSkgeyByZXR1cm47IH0K CiAgICAvLyBkZXN0cm95IHRoZSBlbGVtZW50IC0tIHRoaXMgd2lsbCBhdm9p ZCBlYWNoIGNoaWxkIHZpZXcgZGVzdHJveWluZwogICAgLy8gdGhlIGVsZW1l bnQgb3ZlciBhbmQgb3ZlciBhZ2Fpbi4uLgogICAgaWYgKCF0aGlzLnJlbW92 ZWRGcm9tRE9NKSB7IHRoaXMuZGVzdHJveUVsZW1lbnQoKTsgfQoKICAgIC8v IHJlbW92ZSBmcm9tIHBhcmVudCBpZiBmb3VuZC4gRG9uJ3QgY2FsbCByZW1v dmVGcm9tUGFyZW50LAogICAgLy8gYXMgcmVtb3ZlRnJvbVBhcmVudCB3aWxs IHRyeSB0byByZW1vdmUgdGhlIGVsZW1lbnQgZnJvbQogICAgLy8gdGhlIERP TSBhZ2Fpbi4KICAgIGlmIChwYXJlbnQpIHsgcGFyZW50LnJlbW92ZUNoaWxk KHRoaXMpOyB9CgogICAgdGhpcy50cmFuc2l0aW9uVG8oJ2Rlc3Ryb3lpbmcn LCBmYWxzZSk7CgogICAgcmV0dXJuIHRoaXM7CiAgfSwKCiAgY2xlYXJSZW5k ZXJlZENoaWxkcmVuOiBFbWJlci5LLAogIHRyaWdnZXJSZWN1cnNpdmVseTog RW1iZXIuSywKICBpbnZva2VSZWN1cnNpdmVseTogRW1iZXIuSywKICB0cmFu c2l0aW9uVG86IEVtYmVyLkssCiAgZGVzdHJveUVsZW1lbnQ6IEVtYmVyLksK fSk7Cgp2YXIgVmlld0NvbGxlY3Rpb24gPSBFbWJlci5fVmlld0NvbGxlY3Rp b24gPSBmdW5jdGlvbihpbml0aWFsVmlld3MpIHsKICB2YXIgdmlld3MgPSB0 aGlzLnZpZXdzID0gaW5pdGlhbFZpZXdzIHx8IFtdOwogIHRoaXMubGVuZ3Ro ID0gdmlld3MubGVuZ3RoOwp9OwoKVmlld0NvbGxlY3Rpb24ucHJvdG90eXBl ID0gewogIGxlbmd0aDogMCwKCiAgdHJpZ2dlcjogZnVuY3Rpb24oZXZlbnRO YW1lKSB7CiAgICB2YXIgdmlld3MgPSB0aGlzLnZpZXdzLCB2aWV3OwogICAg Zm9yICh2YXIgaSA9IDAsIGwgPSB2aWV3cy5sZW5ndGg7IGkgPCBsOyBpKysp IHsKICAgICAgdmlldyA9IHZpZXdzW2ldOwogICAgICBpZiAodmlldy50cmln Z2VyKSB7IHZpZXcudHJpZ2dlcihldmVudE5hbWUpOyB9CiAgICB9CiAgfSwK CiAgdHJpZ2dlclJlY3Vyc2l2ZWx5OiBmdW5jdGlvbihldmVudE5hbWUpIHsK ICAgIHZhciB2aWV3cyA9IHRoaXMudmlld3M7CiAgICBmb3IgKHZhciBpID0g MCwgbCA9IHZpZXdzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICB2aWV3 c1tpXS50cmlnZ2VyUmVjdXJzaXZlbHkoZXZlbnROYW1lKTsKICAgIH0KICB9 LAoKICBpbnZva2VSZWN1cnNpdmVseTogZnVuY3Rpb24oZm4pIHsKICAgIHZh ciB2aWV3cyA9IHRoaXMudmlld3MsIHZpZXc7CgogICAgZm9yICh2YXIgaSA9 IDAsIGwgPSB2aWV3cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgdmll dyA9IHZpZXdzW2ldOwogICAgICBmbih2aWV3KTsKICAgIH0KICB9LAoKICB0 cmFuc2l0aW9uVG86IGZ1bmN0aW9uKHN0YXRlLCBjaGlsZHJlbikgewogICAg dmFyIHZpZXdzID0gdGhpcy52aWV3czsKICAgIGZvciAodmFyIGkgPSAwLCBs ID0gdmlld3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIHZpZXdzW2ld LnRyYW5zaXRpb25UbyhzdGF0ZSwgY2hpbGRyZW4pOwogICAgfQogIH0sCgog IHB1c2g6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5sZW5ndGggKz0gYXJndW1l bnRzLmxlbmd0aDsKICAgIHZhciB2aWV3cyA9IHRoaXMudmlld3M7CiAgICBy ZXR1cm4gdmlld3MucHVzaC5hcHBseSh2aWV3cywgYXJndW1lbnRzKTsKICB9 LAoKICBvYmplY3RBdDogZnVuY3Rpb24oaWR4KSB7CiAgICByZXR1cm4gdGhp cy52aWV3c1tpZHhdOwogIH0sCgogIGZvckVhY2g6IGZ1bmN0aW9uKGNhbGxi YWNrKSB7CiAgICB2YXIgdmlld3MgPSB0aGlzLnZpZXdzOwogICAgcmV0dXJu IGFfZm9yRWFjaCh2aWV3cywgY2FsbGJhY2spOwogIH0sCgogIGNsZWFyOiBm dW5jdGlvbigpIHsKICAgIHRoaXMubGVuZ3RoID0gMDsKICAgIHRoaXMudmll d3MubGVuZ3RoID0gMDsKICB9Cn07Cgp2YXIgRU1QVFlfQVJSQVkgPSBbXTsK Ci8qKgogIGBFbWJlci5WaWV3YCBpcyB0aGUgY2xhc3MgaW4gRW1iZXIgcmVz cG9uc2libGUgZm9yIGVuY2Fwc3VsYXRpbmcgdGVtcGxhdGVzIG9mCiAgSFRN TCBjb250ZW50LCBjb21iaW5pbmcgdGVtcGxhdGVzIHdpdGggZGF0YSB0byBy ZW5kZXIgYXMgc2VjdGlvbnMgb2YgYSBwYWdlJ3MKICBET00sIGFuZCByZWdp c3RlcmluZyBhbmQgcmVzcG9uZGluZyB0byB1c2VyLWluaXRpYXRlZCBldmVu dHMuCgogICMjIEhUTUwgVGFnCgogIFRoZSBkZWZhdWx0IEhUTUwgdGFnIG5h bWUgdXNlZCBmb3IgYSB2aWV3J3MgRE9NIHJlcHJlc2VudGF0aW9uIGlzIGBk aXZgLiBUaGlzCiAgY2FuIGJlIGN1c3RvbWl6ZWQgYnkgc2V0dGluZyB0aGUg YHRhZ05hbWVgIHByb3BlcnR5LiBUaGUgZm9sbG93aW5nIHZpZXcKICBjbGFz czoKCiAgYGBgamF2YXNjcmlwdAogIFBhcmFncmFwaFZpZXcgPSBFbWJlci5W aWV3LmV4dGVuZCh7CiAgICB0YWdOYW1lOiAnZW0nCiAgfSk7CiAgYGBgCgog IFdvdWxkIHJlc3VsdCBpbiBpbnN0YW5jZXMgd2l0aCB0aGUgZm9sbG93aW5n IEhUTUw6CgogIGBgYGh0bWwKICA8ZW0gaWQ9ImVtYmVyMSIgY2xhc3M9ImVt YmVyLXZpZXciPjwvZW0+CiAgYGBgCgogICMjIEhUTUwgYGNsYXNzYCBBdHRy aWJ1dGUKCiAgVGhlIEhUTUwgYGNsYXNzYCBhdHRyaWJ1dGUgb2YgYSB2aWV3 J3MgdGFnIGNhbiBiZSBzZXQgYnkgcHJvdmlkaW5nIGEKICBgY2xhc3NOYW1l c2AgcHJvcGVydHkgdGhhdCBpcyBzZXQgdG8gYW4gYXJyYXkgb2Ygc3RyaW5n czoKCiAgYGBgamF2YXNjcmlwdAogIE15VmlldyA9IEVtYmVyLlZpZXcuZXh0 ZW5kKHsKICAgIGNsYXNzTmFtZXM6IFsnbXktY2xhc3MnLCAnbXktb3RoZXIt Y2xhc3MnXQogIH0pOwogIGBgYAoKICBXaWxsIHJlc3VsdCBpbiB2aWV3IGlu c3RhbmNlcyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6CgogIGBg YGh0bWwKICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3IG15 LWNsYXNzIG15LW90aGVyLWNsYXNzIj48L2Rpdj4KICBgYGAKCiAgYGNsYXNz YCBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBhbHNvIGJlIHNldCBieSBwcm92aWRp bmcgYSBgY2xhc3NOYW1lQmluZGluZ3NgCiAgcHJvcGVydHkgc2V0IHRvIGFu IGFycmF5IG9mIHByb3BlcnRpZXMgbmFtZXMgZm9yIHRoZSB2aWV3LiBUaGUg cmV0dXJuIHZhbHVlCiAgb2YgdGhlc2UgcHJvcGVydGllcyB3aWxsIGJlIGFk ZGVkIGFzIHBhcnQgb2YgdGhlIHZhbHVlIGZvciB0aGUgdmlldydzIGBjbGFz c2AKICBhdHRyaWJ1dGUuIFRoZXNlIHByb3BlcnRpZXMgY2FuIGJlIGNvbXB1 dGVkIHByb3BlcnRpZXM6CgogIGBgYGphdmFzY3JpcHQKICBNeVZpZXcgPSBF bWJlci5WaWV3LmV4dGVuZCh7CiAgICBjbGFzc05hbWVCaW5kaW5nczogWydw cm9wZXJ0eUEnLCAncHJvcGVydHlCJ10sCiAgICBwcm9wZXJ0eUE6ICdmcm9t LWEnLAogICAgcHJvcGVydHlCOiBmdW5jdGlvbigpIHsKICAgICAgaWYgKHNv bWVMb2dpYykgeyByZXR1cm4gJ2Zyb20tYic7IH0KICAgIH0ucHJvcGVydHko KQogIH0pOwogIGBgYAoKICBXaWxsIHJlc3VsdCBpbiB2aWV3IGluc3RhbmNl cyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6CgogIGBgYGh0bWwK ICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3IGZyb20tYSBm cm9tLWIiPjwvZGl2PgogIGBgYAoKICBJZiB0aGUgdmFsdWUgb2YgYSBjbGFz cyBuYW1lIGJpbmRpbmcgcmV0dXJucyBhIGJvb2xlYW4gdGhlIHByb3BlcnR5 IG5hbWUKICBpdHNlbGYgd2lsbCBiZSB1c2VkIGFzIHRoZSBjbGFzcyBuYW1l IGlmIHRoZSBwcm9wZXJ0eSBpcyB0cnVlLiBUaGUgY2xhc3MgbmFtZQogIHdp bGwgbm90IGJlIGFkZGVkIGlmIHRoZSB2YWx1ZSBpcyBgZmFsc2VgIG9yIGB1 bmRlZmluZWRgLgoKICBgYGBqYXZhc2NyaXB0CiAgTXlWaWV3ID0gRW1iZXIu Vmlldy5leHRlbmQoewogICAgY2xhc3NOYW1lQmluZGluZ3M6IFsnaG92ZXJl ZCddLAogICAgaG92ZXJlZDogdHJ1ZQogIH0pOwogIGBgYAoKICBXaWxsIHJl c3VsdCBpbiB2aWV3IGluc3RhbmNlcyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50 YXRpb24gb2Y6CgogIGBgYGh0bWwKICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNz PSJlbWJlci12aWV3IGhvdmVyZWQiPjwvZGl2PgogIGBgYAoKICBXaGVuIHVz aW5nIGJvb2xlYW4gY2xhc3MgbmFtZSBiaW5kaW5ncyB5b3UgY2FuIHN1cHBs eSBhIHN0cmluZyB2YWx1ZSBvdGhlcgogIHRoYW4gdGhlIHByb3BlcnR5IG5h bWUgZm9yIHVzZSBhcyB0aGUgYGNsYXNzYCBIVE1MIGF0dHJpYnV0ZSBieSBh cHBlbmRpbmcgdGhlCiAgcHJlZmVycmVkIHZhbHVlIGFmdGVyIGEgIjoiIGNo YXJhY3RlciB3aGVuIGRlZmluaW5nIHRoZSBiaW5kaW5nOgoKICBgYGBqYXZh c2NyaXB0CiAgTXlWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoewogICAgY2xh c3NOYW1lQmluZGluZ3M6IFsnYXdlc29tZTpzby12ZXJ5LWNvb2wnXSwKICAg IGF3ZXNvbWU6IHRydWUKICB9KTsKICBgYGAKCiAgV2lsbCByZXN1bHQgaW4g dmlldyBpbnN0YW5jZXMgd2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9m OgoKICBgYGBodG1sCiAgPGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXIt dmlldyBzby12ZXJ5LWNvb2wiPjwvZGl2PgogIGBgYAoKICBCb29sZWFuIHZh bHVlIGNsYXNzIG5hbWUgYmluZGluZ3Mgd2hvc2UgcHJvcGVydHkgbmFtZXMg YXJlIGluIGEKICBjYW1lbENhc2Utc3R5bGUgZm9ybWF0IHdpbGwgYmUgY29u dmVydGVkIHRvIGEgZGFzaGVyaXplZCBmb3JtYXQ6CgogIGBgYGphdmFzY3Jp cHQKICBNeVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7CiAgICBjbGFzc05h bWVCaW5kaW5nczogWydpc1VyZ2VudCddLAogICAgaXNVcmdlbnQ6IHRydWUK ICB9KTsKICBgYGAKCiAgV2lsbCByZXN1bHQgaW4gdmlldyBpbnN0YW5jZXMg d2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgoKICBgYGBodG1sCiAg PGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyBpcy11cmdlbnQi PjwvZGl2PgogIGBgYAoKICBDbGFzcyBuYW1lIGJpbmRpbmdzIGNhbiBhbHNv IHJlZmVyIHRvIG9iamVjdCB2YWx1ZXMgdGhhdCBhcmUgZm91bmQgYnkKICB0 cmF2ZXJzaW5nIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgdmlldyBpdHNlbGY6 CgogIGBgYGphdmFzY3JpcHQKICBNeVZpZXcgPSBFbWJlci5WaWV3LmV4dGVu ZCh7CiAgICBjbGFzc05hbWVCaW5kaW5nczogWydtZXNzYWdlcy5lbXB0eSdd CiAgICBtZXNzYWdlczogRW1iZXIuT2JqZWN0LmNyZWF0ZSh7CiAgICAgIGVt cHR5OiB0cnVlCiAgICB9KQogIH0pOwogIGBgYAoKICBXaWxsIHJlc3VsdCBp biB2aWV3IGluc3RhbmNlcyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50YXRpb24g b2Y6CgogIGBgYGh0bWwKICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJl ci12aWV3IGVtcHR5Ij48L2Rpdj4KICBgYGAKCiAgSWYgeW91IHdhbnQgdG8g YWRkIGEgY2xhc3MgbmFtZSBmb3IgYSBwcm9wZXJ0eSB3aGljaCBldmFsdWF0 ZXMgdG8gdHJ1ZSBhbmQKICBhbmQgYSBkaWZmZXJlbnQgY2xhc3MgbmFtZSBp ZiBpdCBldmFsdWF0ZXMgdG8gZmFsc2UsIHlvdSBjYW4gcGFzcyBhIGJpbmRp bmcKICBsaWtlIHRoaXM6CgogIGBgYGphdmFzY3JpcHQKICAvLyBBcHBsaWVz ICdlbmFibGVkJyBjbGFzcyB3aGVuIGlzRW5hYmxlZCBpcyB0cnVlIGFuZCAn ZGlzYWJsZWQnIHdoZW4gaXNFbmFibGVkIGlzIGZhbHNlCiAgRW1iZXIuVmll dy5leHRlbmQoewogICAgY2xhc3NOYW1lQmluZGluZ3M6IFsnaXNFbmFibGVk OmVuYWJsZWQ6ZGlzYWJsZWQnXQogICAgaXNFbmFibGVkOiB0cnVlCiAgfSk7 CiAgYGBgCgogIFdpbGwgcmVzdWx0IGluIHZpZXcgaW5zdGFuY2VzIHdpdGgg YW4gSFRNTCByZXByZXNlbnRhdGlvbiBvZjoKCiAgYGBgaHRtbAogIDxkaXYg aWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXcgZW5hYmxlZCI+PC9kaXY+ CiAgYGBgCgogIFdoZW4gaXNFbmFibGVkIGlzIGBmYWxzZWAsIHRoZSByZXN1 bHRpbmcgSFRNTCByZXByZW5zZW50YXRpb24gbG9va3MgbGlrZQogIHRoaXM6 CgogIGBgYGh0bWwKICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12 aWV3IGRpc2FibGVkIj48L2Rpdj4KICBgYGAKCiAgVGhpcyBzeW50YXggb2Zm ZXJzIHRoZSBjb252ZW5pZW5jZSB0byBhZGQgYSBjbGFzcyBpZiBhIHByb3Bl cnR5IGlzIGBmYWxzZWA6CgogIGBgYGphdmFzY3JpcHQKICAvLyBBcHBsaWVz IG5vIGNsYXNzIHdoZW4gaXNFbmFibGVkIGlzIHRydWUgYW5kIGNsYXNzICdk aXNhYmxlZCcgd2hlbiBpc0VuYWJsZWQgaXMgZmFsc2UKICBFbWJlci5WaWV3 LmV4dGVuZCh7CiAgICBjbGFzc05hbWVCaW5kaW5nczogWydpc0VuYWJsZWQ6 OmRpc2FibGVkJ10KICAgIGlzRW5hYmxlZDogdHJ1ZQogIH0pOwogIGBgYAoK ICBXaWxsIHJlc3VsdCBpbiB2aWV3IGluc3RhbmNlcyB3aXRoIGFuIEhUTUwg cmVwcmVzZW50YXRpb24gb2Y6CgogIGBgYGh0bWwKICA8ZGl2IGlkPSJlbWJl cjEiIGNsYXNzPSJlbWJlci12aWV3Ij48L2Rpdj4KICBgYGAKCiAgV2hlbiB0 aGUgYGlzRW5hYmxlZGAgcHJvcGVydHkgb24gdGhlIHZpZXcgaXMgc2V0IHRv IGBmYWxzZWAsIGl0IHdpbGwgcmVzdWx0CiAgaW4gdmlldyBpbnN0YW5jZXMg d2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgoKICBgYGBodG1sCiAg PGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyBkaXNhYmxlZCI+ PC9kaXY+CiAgYGBgCgogIFVwZGF0ZXMgdG8gdGhlIHRoZSB2YWx1ZSBvZiBh IGNsYXNzIG5hbWUgYmluZGluZyB3aWxsIHJlc3VsdCBpbiBhdXRvbWF0aWMK ICB1cGRhdGUgb2YgdGhlICBIVE1MIGBjbGFzc2AgYXR0cmlidXRlIGluIHRo ZSB2aWV3J3MgcmVuZGVyZWQgSFRNTAogIHJlcHJlc2VudGF0aW9uLiBJZiB0 aGUgdmFsdWUgYmVjb21lcyBgZmFsc2VgIG9yIGB1bmRlZmluZWRgIHRoZSBj bGFzcyBuYW1lCiAgd2lsbCBiZSByZW1vdmVkLgoKICBCb3RoIGBjbGFzc05h bWVzYCBhbmQgYGNsYXNzTmFtZUJpbmRpbmdzYCBhcmUgY29uY2F0ZW5hdGVk IHByb3BlcnRpZXMuIFNlZQogIFtFbWJlci5PYmplY3RdKC9hcGkvY2xhc3Nl cy9FbWJlci5PYmplY3QuaHRtbCkgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZQog IGluZm9ybWF0aW9uIGFib3V0IGNvbmNhdGVuYXRlZCBwcm9wZXJ0aWVzLgoK ICAjIyBIVE1MIEF0dHJpYnV0ZXMKCiAgVGhlIEhUTUwgYXR0cmlidXRlIHNl Y3Rpb24gb2YgYSB2aWV3J3MgdGFnIGNhbiBiZSBzZXQgYnkgcHJvdmlkaW5n IGFuCiAgYGF0dHJpYnV0ZUJpbmRpbmdzYCBwcm9wZXJ0eSBzZXQgdG8gYW4g YXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgb24gdGhlIHZpZXcuCiAgVGhlIHJl dHVybiB2YWx1ZSBvZiB0aGVzZSBwcm9wZXJ0aWVzIHdpbGwgYmUgdXNlZCBh cyB0aGUgdmFsdWUgb2YgdGhlIHZpZXcncwogIEhUTUwgYXNzb2NpYXRlZCBh dHRyaWJ1dGU6CgogIGBgYGphdmFzY3JpcHQKICBBbmNob3JWaWV3ID0gRW1i ZXIuVmlldy5leHRlbmQoewogICAgdGFnTmFtZTogJ2EnLAogICAgYXR0cmli dXRlQmluZGluZ3M6IFsnaHJlZiddLAogICAgaHJlZjogJ2h0dHA6Ly9nb29n bGUuY29tJwogIH0pOwogIGBgYAoKICBXaWxsIHJlc3VsdCBpbiB2aWV3IGlu c3RhbmNlcyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6CgogIGBg YGh0bWwKICA8YSBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmlldyIgaHJl Zj0iaHR0cDovL2dvb2dsZS5jb20iPjwvYT4KICBgYGAKCiAgSWYgdGhlIHJl dHVybiB2YWx1ZSBvZiBhbiBgYXR0cmlidXRlQmluZGluZ3NgIG1vbml0b3Jl ZCBwcm9wZXJ0eSBpcyBhIGJvb2xlYW4KICB0aGUgcHJvcGVydHkgd2lsbCBm b2xsb3cgSFRNTCdzIHBhdHRlcm4gb2YgcmVwZWF0aW5nIHRoZSBhdHRyaWJ1 dGUncyBuYW1lIGFzCiAgaXRzIHZhbHVlOgoKICBgYGBqYXZhc2NyaXB0CiAg TXlUZXh0SW5wdXQgPSBFbWJlci5WaWV3LmV4dGVuZCh7CiAgICB0YWdOYW1l OiAnaW5wdXQnLAogICAgYXR0cmlidXRlQmluZGluZ3M6IFsnZGlzYWJsZWQn XSwKICAgIGRpc2FibGVkOiB0cnVlCiAgfSk7CiAgYGBgCgogIFdpbGwgcmVz dWx0IGluIHZpZXcgaW5zdGFuY2VzIHdpdGggYW4gSFRNTCByZXByZXNlbnRh dGlvbiBvZjoKCiAgYGBgaHRtbAogIDxpbnB1dCBpZD0iZW1iZXIxIiBjbGFz cz0iZW1iZXItdmlldyIgZGlzYWJsZWQ9ImRpc2FibGVkIiAvPgogIGBgYAoK ICBgYXR0cmlidXRlQmluZGluZ3NgIGNhbiByZWZlciB0byBjb21wdXRlZCBw cm9wZXJ0aWVzOgoKICBgYGBqYXZhc2NyaXB0CiAgTXlUZXh0SW5wdXQgPSBF bWJlci5WaWV3LmV4dGVuZCh7CiAgICB0YWdOYW1lOiAnaW5wdXQnLAogICAg YXR0cmlidXRlQmluZGluZ3M6IFsnZGlzYWJsZWQnXSwKICAgIGRpc2FibGVk OiBmdW5jdGlvbigpIHsKICAgICAgaWYgKHNvbWVMb2dpYykgewogICAgICAg IHJldHVybiB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBm YWxzZTsKICAgICAgfQogICAgfS5wcm9wZXJ0eSgpCiAgfSk7CiAgYGBgCgog IFVwZGF0ZXMgdG8gdGhlIHRoZSBwcm9wZXJ0eSBvZiBhbiBhdHRyaWJ1dGUg YmluZGluZyB3aWxsIHJlc3VsdCBpbiBhdXRvbWF0aWMKICB1cGRhdGUgb2Yg dGhlICBIVE1MIGF0dHJpYnV0ZSBpbiB0aGUgdmlldydzIHJlbmRlcmVkIEhU TUwgcmVwcmVzZW50YXRpb24uCgogIGBhdHRyaWJ1dGVCaW5kaW5nc2AgaXMg YSBjb25jYXRlbmF0ZWQgcHJvcGVydHkuIFNlZSBbRW1iZXIuT2JqZWN0XSgv YXBpL2NsYXNzZXMvRW1iZXIuT2JqZWN0Lmh0bWwpCiAgZG9jdW1lbnRhdGlv biBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBjb25jYXRlbmF0ZWQgcHJv cGVydGllcy4KCiAgIyMgVGVtcGxhdGVzCgogIFRoZSBIVE1MIGNvbnRlbnRz IG9mIGEgdmlldydzIHJlbmRlcmVkIHJlcHJlc2VudGF0aW9uIGFyZSBkZXRl cm1pbmVkIGJ5IGl0cwogIHRlbXBsYXRlLiBUZW1wbGF0ZXMgY2FuIGJlIGFu eSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYW4gb3B0aW9uYWwgY29udGV4dAog IHBhcmFtZXRlciBhbmQgcmV0dXJucyBhIHN0cmluZyBvZiBIVE1MIHRoYXQg d2lsbCBiZSBpbnNlcnRlZCB3aXRoaW4gdGhlCiAgdmlldydzIHRhZy4gTW9z dCB0eXBpY2FsbHkgaW4gRW1iZXIgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGEg Y29tcGlsZWQKICBgRW1iZXIuSGFuZGxlYmFyc2AgdGVtcGxhdGUuCgogIGBg YGphdmFzY3JpcHQKICBBVmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKICAg IHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoJ0kgYW0gdGhl IHRlbXBsYXRlJykKICB9KTsKICBgYGAKCiAgV2lsbCByZXN1bHQgaW4gdmll dyBpbnN0YW5jZXMgd2l0aCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgoK ICBgYGBodG1sCiAgPGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmll dyI+SSBhbSB0aGUgdGVtcGxhdGU8L2Rpdj4KICBgYGAKCiAgV2l0aGluIGFu IEVtYmVyIGFwcGxpY2F0aW9uIGlzIG1vcmUgY29tbW9uIHRvIGRlZmluZSBh IEhhbmRsZWJhcnMgdGVtcGxhdGVzIGFzCiAgcGFydCBvZiBhIHBhZ2U6Cgog IGBgYGh0bWwKICA8c2NyaXB0IHR5cGU9J3RleHQveC1oYW5kbGViYXJzJyBk YXRhLXRlbXBsYXRlLW5hbWU9J3NvbWUtdGVtcGxhdGUnPgogICAgSGVsbG8K ICA8L3NjcmlwdD4KICBgYGAKCiAgQW5kIGFzc29jaWF0ZSBpdCBieSBuYW1l IHVzaW5nIGEgdmlldydzIGB0ZW1wbGF0ZU5hbWVgIHByb3BlcnR5OgoKICBg YGBqYXZhc2NyaXB0CiAgQVZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7CiAg ICB0ZW1wbGF0ZU5hbWU6ICdzb21lLXRlbXBsYXRlJwogIH0pOwogIGBgYAoK ICBJZiB5b3UgaGF2ZSBuZXN0ZWQgcmVzb3VyY2VzLCB5b3VyIEhhbmRsZWJh cnMgdGVtcGxhdGUgd2lsbCBsb29rIGxpa2UgdGhpczoKCiAgYGBgaHRtbAog IDxzY3JpcHQgdHlwZT0ndGV4dC94LWhhbmRsZWJhcnMnIGRhdGEtdGVtcGxh dGUtbmFtZT0ncG9zdHMvbmV3Jz4KICAgIDxoMT5OZXcgUG9zdDwvaDE+CiAg PC9zY3JpcHQ+CiAgYGBgCgogIEFuZCBgdGVtcGxhdGVOYW1lYCBwcm9wZXJ0 eToKCiAgYGBgamF2YXNjcmlwdAogIEFWaWV3ID0gRW1iZXIuVmlldy5leHRl bmQoewogICAgdGVtcGxhdGVOYW1lOiAncG9zdHMvbmV3JwogIH0pOwogIGBg YAoKICBVc2luZyBhIHZhbHVlIGZvciBgdGVtcGxhdGVOYW1lYCB0aGF0IGRv ZXMgbm90IGhhdmUgYSBIYW5kbGViYXJzIHRlbXBsYXRlCiAgd2l0aCBhIG1h dGNoaW5nIGBkYXRhLXRlbXBsYXRlLW5hbWVgIGF0dHJpYnV0ZSB3aWxsIHRo cm93IGFuIGVycm9yLgoKICBGb3Igdmlld3MgY2xhc3NlcyB0aGF0IG1heSBo YXZlIGEgdGVtcGxhdGUgbGF0ZXIgZGVmaW5lZCAoZS5nLiBhcyB0aGUgYmxv Y2sKICBwb3J0aW9uIG9mIGEgYHt7dmlld319YCBIYW5kbGViYXJzIGhlbHBl ciBjYWxsIGluIGFub3RoZXIgdGVtcGxhdGUgb3IgaW4KICBhIHN1YmNsYXNz KSwgeW91IGNhbiBwcm92aWRlIGEgYGRlZmF1bHRUZW1wbGF0ZWAgcHJvcGVy dHkgc2V0IHRvIGNvbXBpbGVkCiAgdGVtcGxhdGUgZnVuY3Rpb24uIElmIGEg dGVtcGxhdGUgaXMgbm90IGxhdGVyIHByb3ZpZGVkIGZvciB0aGUgdmlldyBp bnN0YW5jZQogIHRoZSBgZGVmYXVsdFRlbXBsYXRlYCB2YWx1ZSB3aWxsIGJl IHVzZWQ6CgogIGBgYGphdmFzY3JpcHQKICBBVmlldyA9IEVtYmVyLlZpZXcu ZXh0ZW5kKHsKICAgIGRlZmF1bHRUZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFy cy5jb21waWxlKCdJIHdhcyB0aGUgZGVmYXVsdCcpLAogICAgdGVtcGxhdGU6 IG51bGwsCiAgICB0ZW1wbGF0ZU5hbWU6IG51bGwKICB9KTsKICBgYGAKCiAg V2lsbCByZXN1bHQgaW4gaW5zdGFuY2VzIHdpdGggYW4gSFRNTCByZXByZXNl bnRhdGlvbiBvZjoKCiAgYGBgaHRtbAogIDxkaXYgaWQ9ImVtYmVyMSIgY2xh c3M9ImVtYmVyLXZpZXciPkkgd2FzIHRoZSBkZWZhdWx0PC9kaXY+CiAgYGBg CgogIElmIGEgYHRlbXBsYXRlYCBvciBgdGVtcGxhdGVOYW1lYCBpcyBwcm92 aWRlZCBpdCB3aWxsIHRha2UgcHJlY2VkZW5jZSBvdmVyCiAgYGRlZmF1bHRU ZW1wbGF0ZWA6CgogIGBgYGphdmFzY3JpcHQKICBBVmlldyA9IEVtYmVyLlZp ZXcuZXh0ZW5kKHsKICAgIGRlZmF1bHRUZW1wbGF0ZTogRW1iZXIuSGFuZGxl YmFycy5jb21waWxlKCdJIHdhcyB0aGUgZGVmYXVsdCcpCiAgfSk7CgogIGFW aWV3ID0gQVZpZXcuY3JlYXRlKHsKICAgIHRlbXBsYXRlOiBFbWJlci5IYW5k bGViYXJzLmNvbXBpbGUoJ0kgd2FzIHRoZSB0ZW1wbGF0ZSwgbm90IGRlZmF1 bHQnKQogIH0pOwogIGBgYAoKICBXaWxsIHJlc3VsdCBpbiB0aGUgZm9sbG93 aW5nIEhUTUwgcmVwcmVzZW50YXRpb24gd2hlbiByZW5kZXJlZDoKCiAgYGBg aHRtbAogIDxkaXYgaWQ9ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXZpZXciPkkg d2FzIHRoZSB0ZW1wbGF0ZSwgbm90IGRlZmF1bHQ8L2Rpdj4KICBgYGAKCiAg IyMgVmlldyBDb250ZXh0CgogIFRoZSBkZWZhdWx0IGNvbnRleHQgb2YgdGhl IGNvbXBpbGVkIHRlbXBsYXRlIGlzIHRoZSB2aWV3J3MgY29udHJvbGxlcjoK CiAgYGBgamF2YXNjcmlwdAogIEFWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQo ewogICAgdGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgnSGVs bG8ge3tleGNpdGVkR3JlZXRpbmd9fScpCiAgfSk7CgogIGFDb250cm9sbGVy ID0gRW1iZXIuT2JqZWN0LmNyZWF0ZSh7CiAgICBmaXJzdE5hbWU6ICdCYXJy eScsCiAgICBleGNpdGVkR3JlZXRpbmc6IGZ1bmN0aW9uKCkgewogICAgICBy ZXR1cm4gdGhpcy5nZXQoImNvbnRlbnQuZmlyc3ROYW1lIikgKyAiISEhIgog ICAgfS5wcm9wZXJ0eSgpCiAgfSk7CgogIGFWaWV3ID0gQVZpZXcuY3JlYXRl KHsKICAgIGNvbnRyb2xsZXI6IGFDb250cm9sbGVyLAogIH0pOwogIGBgYAoK ICBXaWxsIHJlc3VsdCBpbiBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mOgoK ICBgYGBodG1sCiAgPGRpdiBpZD0iZW1iZXIxIiBjbGFzcz0iZW1iZXItdmll dyI+SGVsbG8gQmFycnkhISE8L2Rpdj4KICBgYGAKCiAgQSBjb250ZXh0IGNh biBhbHNvIGJlIGV4cGxpY2l0bHkgc3VwcGxpZWQgdGhyb3VnaCB0aGUgdmll dydzIGBjb250ZXh0YAogIHByb3BlcnR5LiBJZiB0aGUgdmlldyBoYXMgbmVp dGhlciBgY29udGV4dGAgbm9yIGBjb250cm9sbGVyYCBwcm9wZXJ0aWVzLCB0 aGUKICBgcGFyZW50Vmlld2AncyBjb250ZXh0IHdpbGwgYmUgdXNlZC4KCiAg IyMgTGF5b3V0cwoKICBWaWV3cyBjYW4gaGF2ZSBhIHNlY29uZGFyeSB0ZW1w bGF0ZSB0aGF0IHdyYXBzIHRoZWlyIG1haW4gdGVtcGxhdGUuIExpa2UKICBw cmltYXJ5IHRlbXBsYXRlcywgbGF5b3V0cyBjYW4gYmUgYW55IGZ1bmN0aW9u IHRoYXQgIGFjY2VwdHMgYW4gb3B0aW9uYWwKICBjb250ZXh0IHBhcmFtZXRl ciBhbmQgcmV0dXJucyBhIHN0cmluZyBvZiBIVE1MIHRoYXQgd2lsbCBiZSBp bnNlcnRlZCBpbnNpZGUKICB2aWV3J3MgdGFnLiBWaWV3cyB3aG9zZSBIVE1M IGVsZW1lbnQgaXMgc2VsZiBjbG9zaW5nIChlLmcuIGA8aW5wdXQgLz5gKQog IGNhbm5vdCBoYXZlIGEgbGF5b3V0IGFuZCB0aGlzIHByb3BlcnR5IHdpbGwg YmUgaWdub3JlZC4KCiAgTW9zdCB0eXBpY2FsbHkgaW4gRW1iZXIgYSBsYXlv dXQgd2lsbCBiZSBhIGNvbXBpbGVkIGBFbWJlci5IYW5kbGViYXJzYAogIHRl bXBsYXRlLgoKICBBIHZpZXcncyBsYXlvdXQgY2FuIGJlIHNldCBkaXJlY3Rs eSB3aXRoIHRoZSBgbGF5b3V0YCBwcm9wZXJ0eSBvciByZWZlcmVuY2UKICBh biBleGlzdGluZyBIYW5kbGViYXJzIHRlbXBsYXRlIGJ5IG5hbWUgd2l0aCB0 aGUgYGxheW91dE5hbWVgIHByb3BlcnR5LgoKICBBIHRlbXBsYXRlIHVzZWQg YXMgYSBsYXlvdXQgbXVzdCBjb250YWluIGEgc2luZ2xlIHVzZSBvZiB0aGUg SGFuZGxlYmFycwogIGB7e3lpZWxkfX1gIGhlbHBlci4gVGhlIEhUTUwgY29u dGVudHMgb2YgYSB2aWV3J3MgcmVuZGVyZWQgYHRlbXBsYXRlYCB3aWxsIGJl CiAgaW5zZXJ0ZWQgYXQgdGhpcyBsb2NhdGlvbjoKCiAgYGBgamF2YXNjcmlw dAogIEFWaWV3V2l0aExheW91dCA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKICAg IGxheW91dDogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCI8ZGl2IGNsYXNz PSdteS1kZWNvcmF0aXZlLWNsYXNzJz57e3lpZWxkfX08L2Rpdj4iKQogICAg dGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgiSSBnb3Qgd3Jh cHBlZCIpLAogIH0pOwogIGBgYAoKICBXaWxsIHJlc3VsdCBpbiB2aWV3IGlu c3RhbmNlcyB3aXRoIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2Y6CgogIGBg YGh0bWwKICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12aWV3Ij4K ICAgIDxkaXYgY2xhc3M9Im15LWRlY29yYXRpdmUtY2xhc3MiPgogICAgICBJ IGdvdCB3cmFwcGVkCiAgICA8L2Rpdj4KICA8L2Rpdj4KICBgYGAKCiAgU2Vl IFtFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMueWllbGRdKC9hcGkvY2xhc3Nl cy9FbWJlci5IYW5kbGViYXJzLmhlbHBlcnMuaHRtbCNtZXRob2RfeWllbGQp CiAgZm9yIG1vcmUgaW5mb3JtYXRpb24uCgogICMjIFJlc3BvbmRpbmcgdG8g QnJvd3NlciBFdmVudHMKCiAgVmlld3MgY2FuIHJlc3BvbmQgdG8gdXNlci1p bml0aWF0ZWQgZXZlbnRzIGluIG9uZSBvZiB0aHJlZSB3YXlzOiBtZXRob2QK ICBpbXBsZW1lbnRhdGlvbiwgdGhyb3VnaCBhbiBldmVudCBtYW5hZ2VyLCBh bmQgdGhyb3VnaCBge3thY3Rpb259fWAgaGVscGVyIHVzZQogIGluIHRoZWly IHRlbXBsYXRlIG9yIGxheW91dC4KCiAgIyMjIE1ldGhvZCBJbXBsZW1lbnRh dGlvbgoKICBWaWV3cyBjYW4gcmVzcG9uZCB0byB1c2VyLWluaXRpYXRlZCBl dmVudHMgYnkgaW1wbGVtZW50aW5nIGEgbWV0aG9kIHRoYXQKICBtYXRjaGVz IHRoZSBldmVudCBuYW1lLiBBIGBqUXVlcnkuRXZlbnRgIG9iamVjdCB3aWxs IGJlIHBhc3NlZCBhcyB0aGUKICBhcmd1bWVudCB0byB0aGlzIG1ldGhvZC4K CiAgYGBgamF2YXNjcmlwdAogIEFWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQo ewogICAgY2xpY2s6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgIC8vIHdpbGwg YmUgY2FsbGVkIHdoZW4gd2hlbiBhbiBpbnN0YW5jZSdzCiAgICAgIC8vIHJl bmRlcmVkIGVsZW1lbnQgaXMgY2xpY2tlZAogICAgfQogIH0pOwogIGBgYAoK ICAjIyMgRXZlbnQgTWFuYWdlcnMKCiAgVmlld3MgY2FuIGRlZmluZSBhbiBv YmplY3QgYXMgdGhlaXIgYGV2ZW50TWFuYWdlcmAgcHJvcGVydHkuIFRoaXMg b2JqZWN0IGNhbgogIHRoZW4gaW1wbGVtZW50IG1ldGhvZHMgdGhhdCBtYXRj aCB0aGUgZGVzaXJlZCBldmVudCBuYW1lcy4gTWF0Y2hpbmcgZXZlbnRzCiAg dGhhdCBvY2N1ciBvbiB0aGUgdmlldydzIHJlbmRlcmVkIEhUTUwgb3IgdGhl IHJlbmRlcmVkIEhUTUwgb2YgYW55IG9mIGl0cyBET00KICBkZXNjZW5kYW50 cyB3aWxsIHRyaWdnZXIgdGhpcyBtZXRob2QuIEEgYGpRdWVyeS5FdmVudGAg b2JqZWN0IHdpbGwgYmUgcGFzc2VkCiAgYXMgdGhlIGZpcnN0IGFyZ3VtZW50 IHRvIHRoZSBtZXRob2QgYW5kIGFuICBgRW1iZXIuVmlld2Agb2JqZWN0IGFz IHRoZQogIHNlY29uZC4gVGhlIGBFbWJlci5WaWV3YCB3aWxsIGJlIHRoZSB2 aWV3IHdob3NlIHJlbmRlcmVkIEhUTUwgd2FzIGludGVyYWN0ZWQKICB3aXRo LiBUaGlzIG1heSBiZSB0aGUgdmlldyB3aXRoIHRoZSBgZXZlbnRNYW5hZ2Vy YCBwcm9wZXJ0eSBvciBvbmUgb2YgaXRzCiAgZGVzY2VuZGVudCB2aWV3cy4K CiAgYGBgamF2YXNjcmlwdAogIEFWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQo ewogICAgZXZlbnRNYW5hZ2VyOiBFbWJlci5PYmplY3QuY3JlYXRlKHsKICAg ICAgZG91YmxlQ2xpY2s6IGZ1bmN0aW9uKGV2ZW50LCB2aWV3KSB7CiAgICAg ICAgLy8gd2lsbCBiZSBjYWxsZWQgd2hlbiB3aGVuIGFuIGluc3RhbmNlJ3MK ICAgICAgICAvLyByZW5kZXJlZCBlbGVtZW50IG9yIGFueSByZW5kZXJpbmcK ICAgICAgICAvLyBvZiB0aGlzIHZpZXdzJ3MgZGVzY2VuZGVudAogICAgICAg IC8vIGVsZW1lbnRzIGlzIGNsaWNrZWQKICAgICAgfQogICAgfSkKICB9KTsK ICBgYGAKCiAgQW4gZXZlbnQgZGVmaW5lZCBmb3IgYW4gZXZlbnQgbWFuYWdl ciB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgZXZlbnRzIG9mIHRoZQogIHNhbWUg bmFtZSBoYW5kbGVkIHRocm91Z2ggbWV0aG9kcyBvbiB0aGUgdmlldy4KCiAg YGBgamF2YXNjcmlwdAogIEFWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoewog ICAgbW91c2VFbnRlcjogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgLy8gd2ls bCBuZXZlciB0cmlnZ2VyLgogICAgfSwKICAgIGV2ZW50TWFuYWdlcjogRW1i ZXIuT2JqZWN0LmNyZWF0ZSh7CiAgICAgIG1vdXNlRW50ZXI6IGZ1bmN0aW9u KGV2ZW50LCB2aWV3KSB7CiAgICAgICAgLy8gdGFrZXMgcHJlY2VkZW5jZSBv dmVyIEFWaWV3I21vdXNlRW50ZXIKICAgICAgfQogICAgfSkKICB9KTsKICBg YGAKCiAgU2ltaWxhcmx5IGEgdmlldydzIGV2ZW50IG1hbmFnZXIgd2lsbCB0 YWtlIHByZWNlZGVuY2UgZm9yIGV2ZW50cyBvZiBhbnkgdmlld3MKICByZW5k ZXJlZCBhcyBhIGRlc2NlbmRlbnQuIEEgbWV0aG9kIG5hbWUgdGhhdCBtYXRj aGVzIGFuIGV2ZW50IG5hbWUgd2lsbCBub3QKICBiZSBjYWxsZWQgaWYgdGhl IHZpZXcgaW5zdGFuY2Ugd2FzIHJlbmRlcmVkIGluc2lkZSB0aGUgSFRNTCBy ZXByZXNlbnRhdGlvbiBvZgogIGEgdmlldyB0aGF0IGhhcyBhbiBgZXZlbnRN YW5hZ2VyYCBwcm9wZXJ0eSBkZWZpbmVkIHRoYXQgaGFuZGxlcyBldmVudHMg b2YgdGhlCiAgbmFtZS4gRXZlbnRzIG5vdCBoYW5kbGVkIGJ5IHRoZSBldmVu dCBtYW5hZ2VyIHdpbGwgc3RpbGwgdHJpZ2dlciBtZXRob2QgY2FsbHMKICBv biB0aGUgZGVzY2VuZGVudC4KCiAgYGBgamF2YXNjcmlwdAogIE91dGVyVmll dyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKICAgIHRlbXBsYXRlOiBFbWJlci5I YW5kbGViYXJzLmNvbXBpbGUoIm91dGVyIHt7I3ZpZXcgSW5uZXJWaWV3fX1p bm5lcnt7L3ZpZXd9fSBvdXRlciIpLAogICAgZXZlbnRNYW5hZ2VyOiBFbWJl ci5PYmplY3QuY3JlYXRlKHsKICAgICAgbW91c2VFbnRlcjogZnVuY3Rpb24o ZXZlbnQsIHZpZXcpIHsKICAgICAgICAvLyB2aWV3IG1pZ2h0IGJlIGluc3Rh bmNlIG9mIGVpdGhlcgogICAgICAgIC8vIE91dGVyVmlldyBvciBJbm5lclZp ZXcgZGVwZW5kaW5nIG9uCiAgICAgICAgLy8gd2hlcmUgb24gdGhlIHBhZ2Ug dGhlIHVzZXIgaW50ZXJhY3Rpb24gb2NjdXJlZAogICAgICB9CiAgICB9KQog IH0pOwoKICBJbm5lclZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7CiAgICBj bGljazogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgLy8gd2lsbCBiZSBjYWxs ZWQgaWYgcmVuZGVyZWQgaW5zaWRlCiAgICAgIC8vIGFuIE91dGVyVmlldyBi ZWNhdXNlIE91dGVyVmlldydzCiAgICAgIC8vIGV2ZW50TWFuYWdlciBkb2Vz bid0IGhhbmRsZSBjbGljayBldmVudHMKICAgIH0sCiAgICBtb3VzZUVudGVy OiBmdW5jdGlvbihldmVudCkgewogICAgICAvLyB3aWxsIG5ldmVyIGJlIGNh bGxlZCBpZiByZW5kZXJlZCBpbnNpZGUKICAgICAgLy8gYW4gT3V0ZXJWaWV3 LgogICAgfQogIH0pOwogIGBgYAoKICAjIyMgSGFuZGxlYmFycyBge3thY3Rp b259fWAgSGVscGVyCgogIFNlZSBbSGFuZGxlYmFycy5oZWxwZXJzLmFjdGlv bl0oL2FwaS9jbGFzc2VzL0VtYmVyLkhhbmRsZWJhcnMuaGVscGVycy5odG1s I21ldGhvZF9hY3Rpb24pLgoKICAjIyMgRXZlbnQgTmFtZXMKCiAgQWxsIG9m IHRoZSBldmVudCBoYW5kbGluZyBhcHByb2FjaGVzIGRlc2NyaWJlZCBhYm92 ZSByZXNwb25kIHRvIHRoZSBzYW1lIHNldAogIG9mIGV2ZW50cy4gVGhlIG5h bWVzIG9mIHRoZSBidWlsdC1pbiBldmVudHMgYXJlIGxpc3RlZCBiZWxvdy4g KFRoZSBoYXNoIG9mCiAgYnVpbHQtaW4gZXZlbnRzIGV4aXN0cyBpbiBgRW1i ZXIuRXZlbnREaXNwYXRjaGVyYC4pIEFkZGl0aW9uYWwsIGN1c3RvbSBldmVu dHMKICBjYW4gYmUgcmVnaXN0ZXJlZCBieSB1c2luZyBgRW1iZXIuQXBwbGlj YXRpb24uY3VzdG9tRXZlbnRzYC4KCiAgVG91Y2ggZXZlbnRzOgoKICAqIGB0 b3VjaFN0YXJ0YAogICogYHRvdWNoTW92ZWAKICAqIGB0b3VjaEVuZGAKICAq IGB0b3VjaENhbmNlbGAKCiAgS2V5Ym9hcmQgZXZlbnRzCgogICogYGtleURv d25gCiAgKiBga2V5VXBgCiAgKiBga2V5UHJlc3NgCgogIE1vdXNlIGV2ZW50 cwoKICAqIGBtb3VzZURvd25gCiAgKiBgbW91c2VVcGAKICAqIGBjb250ZXh0 TWVudWAKICAqIGBjbGlja2AKICAqIGBkb3VibGVDbGlja2AKICAqIGBtb3Vz ZU1vdmVgCiAgKiBgZm9jdXNJbmAKICAqIGBmb2N1c091dGAKICAqIGBtb3Vz ZUVudGVyYAogICogYG1vdXNlTGVhdmVgCgogIEZvcm0gZXZlbnRzOgoKICAq IGBzdWJtaXRgCiAgKiBgY2hhbmdlYAogICogYGZvY3VzSW5gCiAgKiBgZm9j dXNPdXRgCiAgKiBgaW5wdXRgCgogIEhUTUw1IGRyYWcgYW5kIGRyb3AgZXZl bnRzOgoKICAqIGBkcmFnU3RhcnRgCiAgKiBgZHJhZ2AKICAqIGBkcmFnRW50 ZXJgCiAgKiBgZHJhZ0xlYXZlYAogICogYGRyb3BgCiAgKiBgZHJhZ0VuZGAK CiAgIyMgSGFuZGxlYmFycyBge3t2aWV3fX1gIEhlbHBlcgoKICBPdGhlciBg RW1iZXIuVmlld2AgaW5zdGFuY2VzIGNhbiBiZSBpbmNsdWRlZCBhcyBwYXJ0 IG9mIGEgdmlldydzIHRlbXBsYXRlIGJ5CiAgdXNpbmcgdGhlIGB7e3ZpZXd9 fWAgSGFuZGxlYmFycyBoZWxwZXIuIFNlZSBbRW1iZXIuSGFuZGxlYmFycy5o ZWxwZXJzLnZpZXddKC9hcGkvY2xhc3Nlcy9FbWJlci5IYW5kbGViYXJzLmhl bHBlcnMuaHRtbCNtZXRob2RfdmlldykKICBmb3IgYWRkaXRpb25hbCBpbmZv cm1hdGlvbi4KCiAgQGNsYXNzIFZpZXcKICBAbmFtZXNwYWNlIEVtYmVyCiAg QGV4dGVuZHMgRW1iZXIuQ29yZVZpZXcKKi8KRW1iZXIuVmlldyA9IEVtYmVy LkNvcmVWaWV3LmV4dGVuZCh7CgogIGNvbmNhdGVuYXRlZFByb3BlcnRpZXM6 IFsnY2xhc3NOYW1lcycsICdjbGFzc05hbWVCaW5kaW5ncycsICdhdHRyaWJ1 dGVCaW5kaW5ncyddLAoKICAvKioKICAgIEBwcm9wZXJ0eSBpc1ZpZXcKICAg IEB0eXBlIEJvb2xlYW4KICAgIEBkZWZhdWx0IHRydWUKICAgIEBzdGF0aWMK ICAqLwogIGlzVmlldzogdHJ1ZSwKCiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgogIC8v IFRFTVBMQVRFIFNVUFBPUlQKICAvLwoKICAvKioKICAgIFRoZSBuYW1lIG9m IHRoZSB0ZW1wbGF0ZSB0byBsb29rdXAgaWYgbm8gdGVtcGxhdGUgaXMgcHJv dmlkZWQuCgogICAgQnkgZGVmYXVsdCBgRW1iZXIuVmlld2Agd2lsbCBsb29r dXAgYSB0ZW1wbGF0ZSB3aXRoIHRoaXMgbmFtZSBpbgogICAgYEVtYmVyLlRF TVBMQVRFU2AgKGEgc2hhcmVkIGdsb2JhbCBvYmplY3QpLgoKICAgIEBwcm9w ZXJ0eSB0ZW1wbGF0ZU5hbWUKICAgIEB0eXBlIFN0cmluZwogICAgQGRlZmF1 bHQgbnVsbAogICovCiAgdGVtcGxhdGVOYW1lOiBudWxsLAoKICAvKioKICAg IFRoZSBuYW1lIG9mIHRoZSBsYXlvdXQgdG8gbG9va3VwIGlmIG5vIGxheW91 dCBpcyBwcm92aWRlZC4KCiAgICBCeSBkZWZhdWx0IGBFbWJlci5WaWV3YCB3 aWxsIGxvb2t1cCBhIHRlbXBsYXRlIHdpdGggdGhpcyBuYW1lIGluCiAgICBg RW1iZXIuVEVNUExBVEVTYCAoYSBzaGFyZWQgZ2xvYmFsIG9iamVjdCkuCgog ICAgQHByb3BlcnR5IGxheW91dE5hbWUKICAgIEB0eXBlIFN0cmluZwogICAg QGRlZmF1bHQgbnVsbAogICovCiAgbGF5b3V0TmFtZTogbnVsbCwKCiAgLyoq CiAgICBUaGUgdGVtcGxhdGUgdXNlZCB0byByZW5kZXIgdGhlIHZpZXcuIFRo aXMgc2hvdWxkIGJlIGEgZnVuY3Rpb24gdGhhdAogICAgYWNjZXB0cyBhbiBv cHRpb25hbCBjb250ZXh0IHBhcmFtZXRlciBhbmQgcmV0dXJucyBhIHN0cmlu ZyBvZiBIVE1MIHRoYXQKICAgIHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUg RE9NIHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQgdmlldy4KCiAgICBJbiBnZW5l cmFsLCB5b3Ugc2hvdWxkIHNldCB0aGUgYHRlbXBsYXRlTmFtZWAgcHJvcGVy dHkgaW5zdGVhZCBvZiBzZXR0aW5nCiAgICB0aGUgdGVtcGxhdGUgeW91cnNl bGYuCgogICAgQHByb3BlcnR5IHRlbXBsYXRlCiAgICBAdHlwZSBGdW5jdGlv bgogICovCiAgdGVtcGxhdGU6IEVtYmVyLmNvbXB1dGVkKCd0ZW1wbGF0ZU5h bWUnLCBmdW5jdGlvbihrZXksIHZhbHVlKSB7CiAgICBpZiAodmFsdWUgIT09 IHVuZGVmaW5lZCkgeyByZXR1cm4gdmFsdWU7IH0KCiAgICB2YXIgdGVtcGxh dGVOYW1lID0gZ2V0KHRoaXMsICd0ZW1wbGF0ZU5hbWUnKSwKICAgICAgICB0 ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGVGb3JOYW1lKHRlbXBsYXRlTmFtZSwg J3RlbXBsYXRlJyk7CgogICAgRW1iZXIuYXNzZXJ0KCJZb3Ugc3BlY2lmaWVk IHRoZSB0ZW1wbGF0ZU5hbWUgIiArIHRlbXBsYXRlTmFtZSArICIgZm9yICIg KyB0aGlzICsgIiwgYnV0IGl0IGRpZCBub3QgZXhpc3QuIiwgIXRlbXBsYXRl TmFtZSB8fCB0ZW1wbGF0ZSk7CgogICAgcmV0dXJuIHRlbXBsYXRlIHx8IGdl dCh0aGlzLCAnZGVmYXVsdFRlbXBsYXRlJyk7CiAgfSksCgogIC8qKgogICAg VGhlIGNvbnRyb2xsZXIgbWFuYWdpbmcgdGhpcyB2aWV3LiBJZiB0aGlzIHBy b3BlcnR5IGlzIHNldCwgaXQgd2lsbCBiZQogICAgbWFkZSBhdmFpbGFibGUg Zm9yIHVzZSBieSB0aGUgdGVtcGxhdGUuCgogICAgQHByb3BlcnR5IGNvbnRy b2xsZXIKICAgIEB0eXBlIE9iamVjdAogICovCiAgY29udHJvbGxlcjogRW1i ZXIuY29tcHV0ZWQoJ19wYXJlbnRWaWV3JywgZnVuY3Rpb24oa2V5KSB7CiAg ICB2YXIgcGFyZW50VmlldyA9IGdldCh0aGlzLCAnX3BhcmVudFZpZXcnKTsK ICAgIHJldHVybiBwYXJlbnRWaWV3ID8gZ2V0KHBhcmVudFZpZXcsICdjb250 cm9sbGVyJykgOiBudWxsOwogIH0pLAoKICAvKioKICAgIEEgdmlldyBtYXkg Y29udGFpbiBhIGxheW91dC4gQSBsYXlvdXQgaXMgYSByZWd1bGFyIHRlbXBs YXRlIGJ1dAogICAgc3VwZXJzZWRlcyB0aGUgYHRlbXBsYXRlYCBwcm9wZXJ0 eSBkdXJpbmcgcmVuZGVyaW5nLiBJdCBpcyB0aGUKICAgIHJlc3BvbnNpYmls aXR5IG9mIHRoZSBsYXlvdXQgdGVtcGxhdGUgdG8gcmV0cmlldmUgdGhlIGB0 ZW1wbGF0ZWAKICAgIHByb3BlcnR5IGZyb20gdGhlIHZpZXcgKG9yIGFsdGVy bmF0aXZlbHksIGNhbGwgYEhhbmRsZWJhcnMuaGVscGVycy55aWVsZGAsCiAg ICBge3t5aWVsZH19YCkgdG8gcmVuZGVyIGl0IGluIHRoZSBjb3JyZWN0IGxv Y2F0aW9uLgoKICAgIFRoaXMgaXMgdXNlZnVsIGZvciBhIHZpZXcgdGhhdCBo YXMgYSBzaGFyZWQgd3JhcHBlciwgYnV0IHdoaWNoIGRlbGVnYXRlcwogICAg dGhlIHJlbmRlcmluZyBvZiB0aGUgY29udGVudHMgb2YgdGhlIHdyYXBwZXIg dG8gdGhlIGB0ZW1wbGF0ZWAgcHJvcGVydHkKICAgIG9uIGEgc3ViY2xhc3Mu CgogICAgQHByb3BlcnR5IGxheW91dAogICAgQHR5cGUgRnVuY3Rpb24KICAq LwogIGxheW91dDogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oa2V5KSB7CiAg ICB2YXIgbGF5b3V0TmFtZSA9IGdldCh0aGlzLCAnbGF5b3V0TmFtZScpLAog ICAgICAgIGxheW91dCA9IHRoaXMudGVtcGxhdGVGb3JOYW1lKGxheW91dE5h bWUsICdsYXlvdXQnKTsKCiAgICBFbWJlci5hc3NlcnQoIllvdSBzcGVjaWZp ZWQgdGhlIGxheW91dE5hbWUgIiArIGxheW91dE5hbWUgKyAiIGZvciAiICsg dGhpcyArICIsIGJ1dCBpdCBkaWQgbm90IGV4aXN0LiIsICFsYXlvdXROYW1l IHx8IGxheW91dCk7CgogICAgcmV0dXJuIGxheW91dCB8fCBnZXQodGhpcywg J2RlZmF1bHRMYXlvdXQnKTsKICB9KS5wcm9wZXJ0eSgnbGF5b3V0TmFtZScp LAoKICBfeWllbGQ6IGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHsKICAg IHZhciB0ZW1wbGF0ZSA9IGdldCh0aGlzLCAndGVtcGxhdGUnKTsKICAgIGlm ICh0ZW1wbGF0ZSkgeyB0ZW1wbGF0ZShjb250ZXh0LCBvcHRpb25zKTsgfQog IH0sCgogIHRlbXBsYXRlRm9yTmFtZTogZnVuY3Rpb24obmFtZSwgdHlwZSkg ewogICAgaWYgKCFuYW1lKSB7IHJldHVybjsgfQogICAgRW1iZXIuYXNzZXJ0 KCJ0ZW1wbGF0ZU5hbWVzIGFyZSBub3QgYWxsb3dlZCB0byBjb250YWluIHBl cmlvZHM6ICIrbmFtZSwgbmFtZS5pbmRleE9mKCcuJykgPT09IC0xKTsKCiAg ICAvLyB0aGUgZGVmYXVsdENvbnRhaW5lciBpcyBkZXByZWNhdGVkCiAgICB2 YXIgY29udGFpbmVyID0gdGhpcy5jb250YWluZXIgfHwgKEVtYmVyLkNvbnRh aW5lciAmJiBFbWJlci5Db250YWluZXIuZGVmYXVsdENvbnRhaW5lcik7CiAg ICByZXR1cm4gY29udGFpbmVyICYmIGNvbnRhaW5lci5sb29rdXAoJ3RlbXBs YXRlOicgKyBuYW1lKTsKICB9LAoKICAvKioKICAgIFRoZSBvYmplY3QgZnJv bSB3aGljaCB0ZW1wbGF0ZXMgc2hvdWxkIGFjY2VzcyBwcm9wZXJ0aWVzLgoK ICAgIFRoaXMgb2JqZWN0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSB0ZW1wbGF0 ZSBmdW5jdGlvbiBlYWNoIHRpbWUgdGhlIHJlbmRlcgogICAgbWV0aG9kIGlz IGNhbGxlZCwgYnV0IGl0IGlzIHVwIHRvIHRoZSBpbmRpdmlkdWFsIGZ1bmN0 aW9uIHRvIGRlY2lkZSB3aGF0CiAgICB0byBkbyB3aXRoIGl0LgoKICAgIEJ5 IGRlZmF1bHQsIHRoaXMgd2lsbCBiZSB0aGUgdmlldydzIGNvbnRyb2xsZXIu CgogICAgQHByb3BlcnR5IGNvbnRleHQKICAgIEB0eXBlIE9iamVjdAogICov CiAgY29udGV4dDogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oa2V5LCB2YWx1 ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKICAgICAg c2V0KHRoaXMsICdfY29udGV4dCcsIHZhbHVlKTsKICAgICAgcmV0dXJuIHZh bHVlOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGdldCh0aGlzLCAnX2Nv bnRleHQnKTsKICAgIH0KICB9KS52b2xhdGlsZSgpLAoKICAvKioKICAgIFBy aXZhdGUgY29weSBvZiB0aGUgdmlldydzIHRlbXBsYXRlIGNvbnRleHQuIFRo aXMgY2FuIGJlIHNldCBkaXJlY3RseQogICAgYnkgSGFuZGxlYmFycyB3aXRo b3V0IHRyaWdnZXJpbmcgdGhlIG9ic2VydmVyIHRoYXQgY2F1c2VzIHRoZSB2 aWV3CiAgICB0byBiZSByZS1yZW5kZXJlZC4KCiAgICBUaGUgY29udGV4dCBv ZiBhIHZpZXcgaXMgbG9va2VkIHVwIGFzIGZvbGxvd3M6CgogICAgMS4gU3Vw cGxpZWQgY29udGV4dCAodXN1YWxseSBieSBIYW5kbGViYXJzKQogICAgMi4g U3BlY2lmaWVkIGNvbnRyb2xsZXIKICAgIDMuIGBwYXJlbnRWaWV3YCdzIGNv bnRleHQgKGZvciBhIGNoaWxkIG9mIGEgQ29udGFpbmVyVmlldykKCiAgICBU aGUgY29kZSBpbiBIYW5kbGViYXJzIHRoYXQgb3ZlcnJpZGVzIHRoZSBgX2Nv bnRleHRgIHByb3BlcnR5IGZpcnN0CiAgICBjaGVja3MgdG8gc2VlIHdoZXRo ZXIgdGhlIHZpZXcgaGFzIGEgc3BlY2lmaWVkIGNvbnRyb2xsZXIuIFRoaXMg aXMKICAgIHNvbWV0aGluZyBvZiBhIGhhY2sgYW5kIHNob3VsZCBiZSByZXZp c2l0ZWQuCgogICAgQHByb3BlcnR5IF9jb250ZXh0CiAgICBAcHJpdmF0ZQog ICovCiAgX2NvbnRleHQ6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKGtleSkg ewogICAgdmFyIHBhcmVudFZpZXcsIGNvbnRyb2xsZXI7CgogICAgaWYgKGNv bnRyb2xsZXIgPSBnZXQodGhpcywgJ2NvbnRyb2xsZXInKSkgewogICAgICBy ZXR1cm4gY29udHJvbGxlcjsKICAgIH0KCiAgICBwYXJlbnRWaWV3ID0gdGhp cy5fcGFyZW50VmlldzsKICAgIGlmIChwYXJlbnRWaWV3KSB7CiAgICAgIHJl dHVybiBnZXQocGFyZW50VmlldywgJ19jb250ZXh0Jyk7CiAgICB9CgogICAg cmV0dXJuIG51bGw7CiAgfSksCgogIC8qKgogICAgSWYgYSB2YWx1ZSB0aGF0 IGFmZmVjdHMgdGVtcGxhdGUgcmVuZGVyaW5nIGNoYW5nZXMsIHRoZSB2aWV3 IHNob3VsZCBiZQogICAgcmUtcmVuZGVyZWQgdG8gcmVmbGVjdCB0aGUgbmV3 IHZhbHVlLgoKICAgIEBtZXRob2QgX2NvbnRleHREaWRDaGFuZ2UKICAgIEBw cml2YXRlCiAgKi8KICBfY29udGV4dERpZENoYW5nZTogRW1iZXIub2JzZXJ2 ZXIoJ2NvbnRleHQnLCBmdW5jdGlvbigpIHsKICAgIHRoaXMucmVyZW5kZXIo KTsKICB9KSwKCiAgLyoqCiAgICBJZiBgZmFsc2VgLCB0aGUgdmlldyB3aWxs IGFwcGVhciBoaWRkZW4gaW4gRE9NLgoKICAgIEBwcm9wZXJ0eSBpc1Zpc2li bGUKICAgIEB0eXBlIEJvb2xlYW4KICAgIEBkZWZhdWx0IG51bGwKICAqLwog IGlzVmlzaWJsZTogdHJ1ZSwKCiAgLyoqCiAgICBBcnJheSBvZiBjaGlsZCB2 aWV3cy4gWW91IHNob3VsZCBuZXZlciBlZGl0IHRoaXMgYXJyYXkgZGlyZWN0 bHkuCiAgICBJbnN0ZWFkLCB1c2UgYGFwcGVuZENoaWxkYCBhbmQgYHJlbW92 ZUZyb21QYXJlbnRgLgoKICAgIEBwcm9wZXJ0eSBjaGlsZFZpZXdzCiAgICBA dHlwZSBBcnJheQogICAgQGRlZmF1bHQgW10KICAgIEBwcml2YXRlCiAgKi8K ICBjaGlsZFZpZXdzOiBjaGlsZFZpZXdzUHJvcGVydHksCgogIF9jaGlsZFZp ZXdzOiBFTVBUWV9BUlJBWSwKCiAgLy8gV2hlbiBpdCdzIGEgdmlydHVhbCB2 aWV3LCB3ZSBuZWVkIHRvIG5vdGlmeSB0aGUgcGFyZW50IHRoYXQgdGhlaXIK ICAvLyBjaGlsZFZpZXdzIHdpbGwgY2hhbmdlLgogIF9jaGlsZFZpZXdzV2ls bENoYW5nZTogRW1iZXIuYmVmb3JlT2JzZXJ2ZXIoJ2NoaWxkVmlld3MnLCBm dW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmlzVmlydHVhbCkgewogICAgICB2 YXIgcGFyZW50VmlldyA9IGdldCh0aGlzLCAncGFyZW50VmlldycpOwogICAg ICBpZiAocGFyZW50VmlldykgeyBFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2Uo cGFyZW50VmlldywgJ2NoaWxkVmlld3MnKTsgfQogICAgfQogIH0pLAoKICAv LyBXaGVuIGl0J3MgYSB2aXJ0dWFsIHZpZXcsIHdlIG5lZWQgdG8gbm90aWZ5 IHRoZSBwYXJlbnQgdGhhdCB0aGVpcgogIC8vIGNoaWxkVmlld3MgZGlkIGNo YW5nZS4KICBfY2hpbGRWaWV3c0RpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIo J2NoaWxkVmlld3MnLCBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmlzVmly dHVhbCkgewogICAgICB2YXIgcGFyZW50VmlldyA9IGdldCh0aGlzLCAncGFy ZW50VmlldycpOwogICAgICBpZiAocGFyZW50VmlldykgeyBFbWJlci5wcm9w ZXJ0eURpZENoYW5nZShwYXJlbnRWaWV3LCAnY2hpbGRWaWV3cycpOyB9CiAg ICB9CiAgfSksCgogIC8qKgogICAgUmV0dXJuIHRoZSBuZWFyZXN0IGFuY2Vz dG9yIHRoYXQgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHByb3ZpZGVkCiAgICBj bGFzcy4KCiAgICBAcHJvcGVydHkgbmVhcmVzdEluc3RhbmNlT2YKICAgIEBw YXJhbSB7Q2xhc3N9IGtsYXNzIFN1YmNsYXNzIG9mIEVtYmVyLlZpZXcgKG9y IEVtYmVyLlZpZXcgaXRzZWxmKQogICAgQHJldHVybiBFbWJlci5WaWV3CiAg ICBAZGVwcmVjYXRlZAogICovCiAgbmVhcmVzdEluc3RhbmNlT2Y6IGZ1bmN0 aW9uKGtsYXNzKSB7CiAgICBFbWJlci5kZXByZWNhdGUoIm5lYXJlc3RJbnN0 YW5jZU9mIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBmcm9t IGZ1dHVyZSByZWxlYXNlcy4gVXNlIG5lYXJlc3RPZlR5cGUuIik7CiAgICB2 YXIgdmlldyA9IGdldCh0aGlzLCAncGFyZW50VmlldycpOwoKICAgIHdoaWxl ICh2aWV3KSB7CiAgICAgIGlmICh2aWV3IGluc3RhbmNlb2Yga2xhc3MpIHsg cmV0dXJuIHZpZXc7IH0KICAgICAgdmlldyA9IGdldCh2aWV3LCAncGFyZW50 VmlldycpOwogICAgfQogIH0sCgogIC8qKgogICAgUmV0dXJuIHRoZSBuZWFy ZXN0IGFuY2VzdG9yIHRoYXQgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHByb3Zp ZGVkCiAgICBjbGFzcyBvciBtaXhpbi4KCiAgICBAcHJvcGVydHkgbmVhcmVz dE9mVHlwZQogICAgQHBhcmFtIHtDbGFzcyxNaXhpbn0ga2xhc3MgU3ViY2xh c3Mgb2YgRW1iZXIuVmlldyAob3IgRW1iZXIuVmlldyBpdHNlbGYpLAogICAg ICAgICAgIG9yIGFuIGluc3RhbmNlIG9mIEVtYmVyLk1peGluLgogICAgQHJl dHVybiBFbWJlci5WaWV3CiAgKi8KICBuZWFyZXN0T2ZUeXBlOiBmdW5jdGlv bihrbGFzcykgewogICAgdmFyIHZpZXcgPSBnZXQodGhpcywgJ3BhcmVudFZp ZXcnKSwKICAgICAgICBpc09mVHlwZSA9IGtsYXNzIGluc3RhbmNlb2YgRW1i ZXIuTWl4aW4gPwogICAgICAgICAgICAgICAgICAgZnVuY3Rpb24odmlldykg eyByZXR1cm4ga2xhc3MuZGV0ZWN0KHZpZXcpOyB9IDoKICAgICAgICAgICAg ICAgICAgIGZ1bmN0aW9uKHZpZXcpIHsgcmV0dXJuIGtsYXNzLmRldGVjdCh2 aWV3LmNvbnN0cnVjdG9yKTsgfTsKCiAgICB3aGlsZSAodmlldykgewogICAg ICBpZiAoaXNPZlR5cGUodmlldykpIHsgcmV0dXJuIHZpZXc7IH0KICAgICAg dmlldyA9IGdldCh2aWV3LCAncGFyZW50VmlldycpOwogICAgfQogIH0sCgog IC8qKgogICAgUmV0dXJuIHRoZSBuZWFyZXN0IGFuY2VzdG9yIHRoYXQgaGFz IGEgZ2l2ZW4gcHJvcGVydHkuCgogICAgQGZ1bmN0aW9uIG5lYXJlc3RXaXRo UHJvcGVydHkKICAgIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBBIHByb3Bl cnR5IG5hbWUKICAgIEByZXR1cm4gRW1iZXIuVmlldwogICovCiAgbmVhcmVz dFdpdGhQcm9wZXJ0eTogZnVuY3Rpb24ocHJvcGVydHkpIHsKICAgIHZhciB2 aWV3ID0gZ2V0KHRoaXMsICdwYXJlbnRWaWV3Jyk7CgogICAgd2hpbGUgKHZp ZXcpIHsKICAgICAgaWYgKHByb3BlcnR5IGluIHZpZXcpIHsgcmV0dXJuIHZp ZXc7IH0KICAgICAgdmlldyA9IGdldCh2aWV3LCAncGFyZW50VmlldycpOwog ICAgfQogIH0sCgogIC8qKgogICAgUmV0dXJuIHRoZSBuZWFyZXN0IGFuY2Vz dG9yIHdob3NlIHBhcmVudCBpcyBhbiBpbnN0YW5jZSBvZgogICAgYGtsYXNz YC4KCiAgICBAbWV0aG9kIG5lYXJlc3RDaGlsZE9mCiAgICBAcGFyYW0ge0Ns YXNzfSBrbGFzcyBTdWJjbGFzcyBvZiBFbWJlci5WaWV3IChvciBFbWJlci5W aWV3IGl0c2VsZikKICAgIEByZXR1cm4gRW1iZXIuVmlldwogICovCiAgbmVh cmVzdENoaWxkT2Y6IGZ1bmN0aW9uKGtsYXNzKSB7CiAgICB2YXIgdmlldyA9 IGdldCh0aGlzLCAncGFyZW50VmlldycpOwoKICAgIHdoaWxlICh2aWV3KSB7 CiAgICAgIGlmIChnZXQodmlldywgJ3BhcmVudFZpZXcnKSBpbnN0YW5jZW9m IGtsYXNzKSB7IHJldHVybiB2aWV3OyB9CiAgICAgIHZpZXcgPSBnZXQodmll dywgJ3BhcmVudFZpZXcnKTsKICAgIH0KICB9LAoKICAvKioKICAgIFdoZW4g dGhlIHBhcmVudCB2aWV3IGNoYW5nZXMsIHJlY3Vyc2l2ZWx5IGludmFsaWRh dGUgYGNvbnRyb2xsZXJgCgogICAgQG1ldGhvZCBfcGFyZW50Vmlld0RpZENo YW5nZQogICAgQHByaXZhdGUKICAqLwogIF9wYXJlbnRWaWV3RGlkQ2hhbmdl OiBFbWJlci5vYnNlcnZlcignX3BhcmVudFZpZXcnLCBmdW5jdGlvbigpIHsK ICAgIGlmICh0aGlzLmlzRGVzdHJveWluZykgeyByZXR1cm47IH0KCiAgICB0 aGlzLnRyaWdnZXIoJ3BhcmVudFZpZXdEaWRDaGFuZ2UnKTsKCiAgICBpZiAo Z2V0KHRoaXMsICdwYXJlbnRWaWV3LmNvbnRyb2xsZXInKSAmJiAhZ2V0KHRo aXMsICdjb250cm9sbGVyJykpIHsKICAgICAgdGhpcy5ub3RpZnlQcm9wZXJ0 eUNoYW5nZSgnY29udHJvbGxlcicpOwogICAgfQogIH0pLAoKICBfY29udHJv bGxlckRpZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIoJ2NvbnRyb2xsZXInLCBm dW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmlzRGVzdHJveWluZykgeyByZXR1 cm47IH0KCiAgICB0aGlzLnJlcmVuZGVyKCk7CgogICAgdGhpcy5mb3JFYWNo Q2hpbGRWaWV3KGZ1bmN0aW9uKHZpZXcpIHsKICAgICAgdmlldy5wcm9wZXJ0 eURpZENoYW5nZSgnY29udHJvbGxlcicpOwogICAgfSk7CiAgfSksCgogIGNs b25lS2V5d29yZHM6IGZ1bmN0aW9uKCkgewogICAgdmFyIHRlbXBsYXRlRGF0 YSA9IGdldCh0aGlzLCAndGVtcGxhdGVEYXRhJyk7CgogICAgdmFyIGtleXdv cmRzID0gdGVtcGxhdGVEYXRhID8gRW1iZXIuY29weSh0ZW1wbGF0ZURhdGEu a2V5d29yZHMpIDoge307CiAgICBzZXQoa2V5d29yZHMsICd2aWV3JywgZ2V0 KHRoaXMsICdjb25jcmV0ZVZpZXcnKSk7CiAgICBzZXQoa2V5d29yZHMsICdf dmlldycsIHRoaXMpOwogICAgc2V0KGtleXdvcmRzLCAnY29udHJvbGxlcics IGdldCh0aGlzLCAnY29udHJvbGxlcicpKTsKCiAgICByZXR1cm4ga2V5d29y ZHM7CiAgfSwKCiAgLyoqCiAgICBDYWxsZWQgb24geW91ciB2aWV3IHdoZW4g aXQgc2hvdWxkIHB1c2ggc3RyaW5ncyBvZiBIVE1MIGludG8gYQogICAgYEVt YmVyLlJlbmRlckJ1ZmZlcmAuIE1vc3QgdXNlcnMgd2lsbCB3YW50IHRvIG92 ZXJyaWRlIHRoZSBgdGVtcGxhdGVgCiAgICBvciBgdGVtcGxhdGVOYW1lYCBw cm9wZXJ0aWVzIGluc3RlYWQgb2YgdGhpcyBtZXRob2QuCgogICAgQnkgZGVm YXVsdCwgYEVtYmVyLlZpZXdgIHdpbGwgbG9vayBmb3IgYSBmdW5jdGlvbiBp biB0aGUgYHRlbXBsYXRlYAogICAgcHJvcGVydHkgYW5kIGludm9rZSBpdCB3 aXRoIHRoZSB2YWx1ZSBvZiBgY29udGV4dGAuIFRoZSB2YWx1ZSBvZgogICAg YGNvbnRleHRgIHdpbGwgYmUgdGhlIHZpZXcncyBjb250cm9sbGVyIHVubGVz cyB5b3Ugb3ZlcnJpZGUgaXQuCgogICAgQG1ldGhvZCByZW5kZXIKICAgIEBw YXJhbSB7RW1iZXIuUmVuZGVyQnVmZmVyfSBidWZmZXIgVGhlIHJlbmRlciBi dWZmZXIKICAqLwogIHJlbmRlcjogZnVuY3Rpb24oYnVmZmVyKSB7CiAgICAv LyBJZiB0aGlzIHZpZXcgaGFzIGEgbGF5b3V0LCBpdCBpcyB0aGUgcmVzcG9u c2liaWxpdHkgb2YgdGhlCiAgICAvLyB0aGUgbGF5b3V0IHRvIHJlbmRlciB0 aGUgdmlldydzIHRlbXBsYXRlLiBPdGhlcndpc2UsIHJlbmRlciB0aGUgdGVt cGxhdGUKICAgIC8vIGRpcmVjdGx5LgogICAgdmFyIHRlbXBsYXRlID0gZ2V0 KHRoaXMsICdsYXlvdXQnKSB8fCBnZXQodGhpcywgJ3RlbXBsYXRlJyk7Cgog ICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgIHZhciBjb250ZXh0ID0gZ2V0KHRo aXMsICdjb250ZXh0Jyk7CiAgICAgIHZhciBrZXl3b3JkcyA9IHRoaXMuY2xv bmVLZXl3b3JkcygpOwogICAgICB2YXIgb3V0cHV0OwoKICAgICAgdmFyIGRh dGEgPSB7CiAgICAgICAgdmlldzogdGhpcywKICAgICAgICBidWZmZXI6IGJ1 ZmZlciwKICAgICAgICBpc1JlbmRlckRhdGE6IHRydWUsCiAgICAgICAga2V5 d29yZHM6IGtleXdvcmRzLAogICAgICAgIGluc2lkZUdyb3VwOiBnZXQodGhp cywgJ3RlbXBsYXRlRGF0YS5pbnNpZGVHcm91cCcpCiAgICAgIH07CgogICAg ICAvLyBJbnZva2UgdGhlIHRlbXBsYXRlIHdpdGggdGhlIHByb3ZpZGVkIHRl bXBsYXRlIGNvbnRleHQsIHdoaWNoCiAgICAgIC8vIGlzIHRoZSB2aWV3J3Mg Y29udHJvbGxlciBieSBkZWZhdWx0LiBBIGhhc2ggb2YgZGF0YSBpcyBhbHNv IHBhc3NlZCB0aGF0IHByb3ZpZGVzCiAgICAgIC8vIHRoZSB0ZW1wbGF0ZSB3 aXRoIGFjY2VzcyB0byB0aGUgdmlldyBhbmQgcmVuZGVyIGJ1ZmZlci4KCiAg ICAgIEVtYmVyLmFzc2VydCgndGVtcGxhdGUgbXVzdCBiZSBhIGZ1bmN0aW9u LiBEaWQgeW91IG1lYW4gdG8gY2FsbCBFbWJlci5IYW5kbGViYXJzLmNvbXBp bGUoIi4uLiIpIG9yIHNwZWNpZnkgdGVtcGxhdGVOYW1lIGluc3RlYWQ/Jywg dHlwZW9mIHRlbXBsYXRlID09PSAnZnVuY3Rpb24nKTsKICAgICAgLy8gVGhl IHRlbXBsYXRlIHNob3VsZCB3cml0ZSBkaXJlY3RseSB0byB0aGUgcmVuZGVy IGJ1ZmZlciBpbnN0ZWFkCiAgICAgIC8vIG9mIHJldHVybmluZyBhIHN0cmlu Zy4KICAgICAgb3V0cHV0ID0gdGVtcGxhdGUoY29udGV4dCwgeyBkYXRhOiBk YXRhIH0pOwoKICAgICAgLy8gSWYgdGhlIHRlbXBsYXRlIHJldHVybmVkIGEg c3RyaW5nIGluc3RlYWQgb2Ygd3JpdGluZyB0byB0aGUgYnVmZmVyLAogICAg ICAvLyBwdXNoIHRoZSBzdHJpbmcgb250byB0aGUgYnVmZmVyLgogICAgICBp ZiAob3V0cHV0ICE9PSB1bmRlZmluZWQpIHsgYnVmZmVyLnB1c2gob3V0cHV0 KTsgfQogICAgfQogIH0sCgogIC8qKgogICAgUmVuZGVycyB0aGUgdmlldyBh Z2Fpbi4gVGhpcyB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRo ZQogICAgdmlldyBpcyBhbHJlYWR5IGluIHRoZSBET00gb3Igbm90LiBJZiB0 aGUgdmlldyBpcyBpbiB0aGUgRE9NLCB0aGUKICAgIHJlbmRlcmluZyBwcm9j ZXNzIHdpbGwgYmUgZGVmZXJyZWQgdG8gZ2l2ZSBiaW5kaW5ncyBhIGNoYW5j ZQogICAgdG8gc3luY2hyb25pemUuCgogICAgSWYgY2hpbGRyZW4gd2VyZSBh ZGRlZCBkdXJpbmcgdGhlIHJlbmRlcmluZyBwcm9jZXNzIHVzaW5nIGBhcHBl bmRDaGlsZGAsCiAgICBgcmVyZW5kZXJgIHdpbGwgcmVtb3ZlIHRoZW0sIGJl Y2F1c2UgdGhleSB3aWxsIGJlIGFkZGVkIGFnYWluCiAgICBpZiBuZWVkZWQg YnkgdGhlIG5leHQgYHJlbmRlcmAuCgogICAgSW4gZ2VuZXJhbCwgaWYgdGhl IGRpc3BsYXkgb2YgeW91ciB2aWV3IGNoYW5nZXMsIHlvdSBzaG91bGQgbW9k aWZ5CiAgICB0aGUgRE9NIGVsZW1lbnQgZGlyZWN0bHkgaW5zdGVhZCBvZiBt YW51YWxseSBjYWxsaW5nIGByZXJlbmRlcmAsIHdoaWNoIGNhbgogICAgYmUg c2xvdy4KCiAgICBAbWV0aG9kIHJlcmVuZGVyCiAgKi8KICByZXJlbmRlcjog ZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RhdGUucmVy ZW5kZXIodGhpcyk7CiAgfSwKCiAgY2xlYXJSZW5kZXJlZENoaWxkcmVuOiBm dW5jdGlvbigpIHsKICAgIHZhciBsZW5ndGhCZWZvcmUgPSB0aGlzLmxlbmd0 aEJlZm9yZVJlbmRlciwKICAgICAgICBsZW5ndGhBZnRlciAgPSB0aGlzLmxl bmd0aEFmdGVyUmVuZGVyOwoKICAgIC8vIElmIHRoZXJlIHdlcmUgY2hpbGQg dmlld3MgY3JlYXRlZCBkdXJpbmcgdGhlIGxhc3QgY2FsbCB0byByZW5kZXIo KSwKICAgIC8vIHJlbW92ZSB0aGVtIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRo YXQgdGhleSB3aWxsIGJlIHJlLWNyZWF0ZWQgd2hlbgogICAgLy8gd2UgcmUt cmVuZGVyLgoKICAgIC8vIFZJRVctVE9ETzogVW5pdCB0ZXN0IHRoaXMgcGF0 aC4KICAgIHZhciBjaGlsZFZpZXdzID0gdGhpcy5fY2hpbGRWaWV3czsKICAg IGZvciAodmFyIGk9bGVuZ3RoQWZ0ZXItMTsgaT49bGVuZ3RoQmVmb3JlOyBp LS0pIHsKICAgICAgaWYgKGNoaWxkVmlld3NbaV0pIHsgY2hpbGRWaWV3c1tp XS5kZXN0cm95KCk7IH0KICAgIH0KICB9LAoKICAvKioKICAgIEl0ZXJhdGVz IG92ZXIgdGhlIHZpZXcncyBgY2xhc3NOYW1lQmluZGluZ3NgIGFycmF5LCBp bnNlcnRzIHRoZSB2YWx1ZQogICAgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0 eSBpbnRvIHRoZSBgY2xhc3NOYW1lc2AgYXJyYXksIHRoZW4gY3JlYXRlcyBh bgogICAgb2JzZXJ2ZXIgdG8gdXBkYXRlIHRoZSB2aWV3J3MgZWxlbWVudCBp ZiB0aGUgYm91bmQgcHJvcGVydHkgZXZlciBjaGFuZ2VzCiAgICBpbiB0aGUg ZnV0dXJlLgoKICAgIEBtZXRob2QgX2FwcGx5Q2xhc3NOYW1lQmluZGluZ3MK ICAgIEBwcml2YXRlCiAgKi8KICBfYXBwbHlDbGFzc05hbWVCaW5kaW5nczog ZnVuY3Rpb24oY2xhc3NCaW5kaW5ncykgewogICAgdmFyIGNsYXNzTmFtZXMg PSB0aGlzLmNsYXNzTmFtZXMsCiAgICBlbGVtLCBuZXdDbGFzcywgZGFzaGVy aXplZENsYXNzOwoKICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgb2YgdGhlIGNv bmZpZ3VyZWQgYmluZGluZ3MuIFRoZXNlIHdpbGwgYmUgZWl0aGVyCiAgICAv LyBwcm9wZXJ0eSBuYW1lcyAoJ2lzVXJnZW50Jykgb3IgcHJvcGVydHkgcGF0 aHMgcmVsYXRpdmUgdG8gdGhlIHZpZXcKICAgIC8vICgnY29udGVudC5pc1Vy Z2VudCcpCiAgICBhX2ZvckVhY2goY2xhc3NCaW5kaW5ncywgZnVuY3Rpb24o YmluZGluZykgewoKICAgICAgRW1iZXIuYXNzZXJ0KCJjbGFzc05hbWVCaW5k aW5ncyBtdXN0IG5vdCBoYXZlIHNwYWNlcyBpbiB0aGVtLiBNdWx0aXBsZSBj bGFzcyBuYW1lIGJpbmRpbmdzIGNhbiBiZSBwcm92aWRlZCBhcyBlbGVtZW50 cyBvZiBhbiBhcnJheSwgZS5nLiBbJ2ZvbycsICc6YmFyJ10iLCBiaW5kaW5n LmluZGV4T2YoJyAnKSA9PT0gLTEpOwoKICAgICAgLy8gVmFyaWFibGUgaW4g d2hpY2ggdGhlIG9sZCBjbGFzcyB2YWx1ZSBpcyBzYXZlZC4gVGhlIG9ic2Vy dmVyIGZ1bmN0aW9uCiAgICAgIC8vIGNsb3NlcyBvdmVyIHRoaXMgdmFyaWFi bGUsIHNvIGl0IGtub3dzIHdoaWNoIHN0cmluZyB0byByZW1vdmUgd2hlbgog ICAgICAvLyB0aGUgcHJvcGVydHkgY2hhbmdlcy4KICAgICAgdmFyIG9sZENs YXNzOwogICAgICAvLyBFeHRyYWN0IGp1c3QgdGhlIHByb3BlcnR5IG5hbWUg ZnJvbSBiaW5kaW5ncyBsaWtlICdmb286YmFyJwogICAgICB2YXIgcGFyc2Vk UGF0aCA9IEVtYmVyLlZpZXcuX3BhcnNlUHJvcGVydHlQYXRoKGJpbmRpbmcp OwoKICAgICAgLy8gU2V0IHVwIGFuIG9ic2VydmVyIG9uIHRoZSBjb250ZXh0 LiBJZiB0aGUgcHJvcGVydHkgY2hhbmdlcywgdG9nZ2xlIHRoZQogICAgICAv LyBjbGFzcyBuYW1lLgogICAgICB2YXIgb2JzZXJ2ZXIgPSBmdW5jdGlvbigp IHsKICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHBy b3BlcnR5CiAgICAgICAgbmV3Q2xhc3MgPSB0aGlzLl9jbGFzc1N0cmluZ0Zv clByb3BlcnR5KGJpbmRpbmcpOwogICAgICAgIGVsZW0gPSB0aGlzLiQoKTsK CiAgICAgICAgLy8gSWYgd2UgaGFkIHByZXZpb3VzbHkgYWRkZWQgYSBjbGFz cyB0byB0aGUgZWxlbWVudCwgcmVtb3ZlIGl0LgogICAgICAgIGlmIChvbGRD bGFzcykgewogICAgICAgICAgZWxlbS5yZW1vdmVDbGFzcyhvbGRDbGFzcyk7 CiAgICAgICAgICAvLyBBbHNvIHJlbW92ZSBmcm9tIGNsYXNzTmFtZXMgc28g dGhhdCBpZiB0aGUgdmlldyBnZXRzIHJlcmVuZGVyZWQsCiAgICAgICAgICAv LyB0aGUgY2xhc3MgZG9lc24ndCBnZXQgYWRkZWQgYmFjayB0byB0aGUgRE9N LgogICAgICAgICAgY2xhc3NOYW1lcy5yZW1vdmVPYmplY3Qob2xkQ2xhc3Mp OwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgbmVjZXNzYXJ5LCBhZGQgYSBu ZXcgY2xhc3MuIE1ha2Ugc3VyZSB3ZSBrZWVwIHRyYWNrIG9mIGl0IHNvCiAg ICAgICAgLy8gaXQgY2FuIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KICAg ICAgICBpZiAobmV3Q2xhc3MpIHsKICAgICAgICAgIGVsZW0uYWRkQ2xhc3Mo bmV3Q2xhc3MpOwogICAgICAgICAgb2xkQ2xhc3MgPSBuZXdDbGFzczsKICAg ICAgICB9IGVsc2UgewogICAgICAgICAgb2xkQ2xhc3MgPSBudWxsOwogICAg ICAgIH0KICAgICAgfTsKCiAgICAgIC8vIEdldCB0aGUgY2xhc3MgbmFtZSBm b3IgdGhlIHByb3BlcnR5IGF0IGl0cyBjdXJyZW50IHZhbHVlCiAgICAgIGRh c2hlcml6ZWRDbGFzcyA9IHRoaXMuX2NsYXNzU3RyaW5nRm9yUHJvcGVydHko YmluZGluZyk7CgogICAgICBpZiAoZGFzaGVyaXplZENsYXNzKSB7CiAgICAg ICAgLy8gRW5zdXJlIHRoYXQgaXQgZ2V0cyBpbnRvIHRoZSBjbGFzc05hbWVz IGFycmF5CiAgICAgICAgLy8gc28gaXQgaXMgZGlzcGxheWVkIHdoZW4gd2Ug cmVuZGVyLgogICAgICAgIGFfYWRkT2JqZWN0KGNsYXNzTmFtZXMsIGRhc2hl cml6ZWRDbGFzcyk7CgogICAgICAgIC8vIFNhdmUgYSByZWZlcmVuY2UgdG8g dGhlIGNsYXNzIG5hbWUgc28gd2UgY2FuIHJlbW92ZSBpdAogICAgICAgIC8v IGlmIHRoZSBvYnNlcnZlciBmaXJlcy4gUmVtZW1iZXIgdGhhdCB0aGlzIHZh cmlhYmxlIGhhcwogICAgICAgIC8vIGJlZW4gY2xvc2VkIG92ZXIgYnkgdGhl IG9ic2VydmVyLgogICAgICAgIG9sZENsYXNzID0gZGFzaGVyaXplZENsYXNz OwogICAgICB9CgogICAgICB0aGlzLnJlZ2lzdGVyT2JzZXJ2ZXIodGhpcywg cGFyc2VkUGF0aC5wYXRoLCBvYnNlcnZlcik7CiAgICAgIC8vIFJlbW92ZSBj bGFzc05hbWUgc28gd2hlbiB0aGUgdmlldyBpcyByZXJlbmRlcmVkLAogICAg ICAvLyB0aGUgY2xhc3NOYW1lIGlzIGFkZGVkIGJhc2VkIG9uIGJpbmRpbmcg cmVldmFsdWF0aW9uCiAgICAgIHRoaXMub25lKCd3aWxsQ2xlYXJSZW5kZXIn LCBmdW5jdGlvbigpIHsKICAgICAgICBpZiAob2xkQ2xhc3MpIHsKICAgICAg ICAgIGNsYXNzTmFtZXMucmVtb3ZlT2JqZWN0KG9sZENsYXNzKTsKICAgICAg ICAgIG9sZENsYXNzID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0pOwoKICAg IH0sIHRoaXMpOwogIH0sCgogIF91bnNwZWNpZmllZEF0dHJpYnV0ZUJpbmRp bmdzOiBudWxsLAoKICAvKioKICAgIEl0ZXJhdGVzIHRocm91Z2ggdGhlIHZp ZXcncyBhdHRyaWJ1dGUgYmluZGluZ3MsIHNldHMgdXAgb2JzZXJ2ZXJzIGZv ciBlYWNoLAogICAgdGhlbiBhcHBsaWVzIHRoZSBjdXJyZW50IHZhbHVlIG9m IHRoZSBhdHRyaWJ1dGVzIHRvIHRoZSBwYXNzZWQgcmVuZGVyIGJ1ZmZlci4K CiAgICBAbWV0aG9kIF9hcHBseUF0dHJpYnV0ZUJpbmRpbmdzCiAgICBAcGFy YW0ge0VtYmVyLlJlbmRlckJ1ZmZlcn0gYnVmZmVyCiAgICBAcHJpdmF0ZQog ICovCiAgX2FwcGx5QXR0cmlidXRlQmluZGluZ3M6IGZ1bmN0aW9uKGJ1ZmZl ciwgYXR0cmlidXRlQmluZGluZ3MpIHsKICAgIHZhciBhdHRyaWJ1dGVWYWx1 ZSwKICAgICAgICB1bnNwZWNpZmllZEF0dHJpYnV0ZUJpbmRpbmdzID0gdGhp cy5fdW5zcGVjaWZpZWRBdHRyaWJ1dGVCaW5kaW5ncyA9IHRoaXMuX3Vuc3Bl Y2lmaWVkQXR0cmlidXRlQmluZGluZ3MgfHwge307CgogICAgYV9mb3JFYWNo KGF0dHJpYnV0ZUJpbmRpbmdzLCBmdW5jdGlvbihiaW5kaW5nKSB7CiAgICAg IHZhciBzcGxpdCA9IGJpbmRpbmcuc3BsaXQoJzonKSwKICAgICAgICAgIHBy b3BlcnR5ID0gc3BsaXRbMF0sCiAgICAgICAgICBhdHRyaWJ1dGVOYW1lID0g c3BsaXRbMV0gfHwgcHJvcGVydHk7CgogICAgICBpZiAocHJvcGVydHkgaW4g dGhpcykgewogICAgICAgIHRoaXMuX3NldHVwQXR0cmlidXRlQmluZGluZ09i c2VydmF0aW9uKHByb3BlcnR5LCBhdHRyaWJ1dGVOYW1lKTsKCiAgICAgICAg Ly8gRGV0ZXJtaW5lIHRoZSBjdXJyZW50IHZhbHVlIGFuZCBhZGQgaXQgdG8g dGhlIHJlbmRlciBidWZmZXIKICAgICAgICAvLyBpZiBuZWNlc3NhcnkuCiAg ICAgICAgYXR0cmlidXRlVmFsdWUgPSBnZXQodGhpcywgcHJvcGVydHkpOwog ICAgICAgIEVtYmVyLlZpZXcuYXBwbHlBdHRyaWJ1dGVCaW5kaW5ncyhidWZm ZXIsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKICAgICAgfSBl bHNlIHsKICAgICAgICB1bnNwZWNpZmllZEF0dHJpYnV0ZUJpbmRpbmdzW3By b3BlcnR5XSA9IGF0dHJpYnV0ZU5hbWU7CiAgICAgIH0KICAgIH0sIHRoaXMp OwoKICAgIC8vIExhemlseSBzZXR1cCBzZXRVbmtub3duUHJvcGVydHkgYWZ0 ZXIgYXR0cmlidXRlQmluZGluZ3MgYXJlIGluaXRpYWxseSBhcHBsaWVkCiAg ICB0aGlzLnNldFVua25vd25Qcm9wZXJ0eSA9IHRoaXMuX3NldFVua25vd25Q cm9wZXJ0eTsKICB9LAoKICBfc2V0dXBBdHRyaWJ1dGVCaW5kaW5nT2JzZXJ2 YXRpb246IGZ1bmN0aW9uKHByb3BlcnR5LCBhdHRyaWJ1dGVOYW1lKSB7CiAg ICB2YXIgYXR0cmlidXRlVmFsdWUsIGVsZW07CgogICAgLy8gQ3JlYXRlIGFu IG9ic2VydmVyIHRvIGFkZC9yZW1vdmUvY2hhbmdlIHRoZSBhdHRyaWJ1dGUg aWYgdGhlCiAgICAvLyBKYXZhU2NyaXB0IHByb3BlcnR5IGNoYW5nZXMuCiAg ICB2YXIgb2JzZXJ2ZXIgPSBmdW5jdGlvbigpIHsKICAgICAgZWxlbSA9IHRo aXMuJCgpOwoKICAgICAgYXR0cmlidXRlVmFsdWUgPSBnZXQodGhpcywgcHJv cGVydHkpOwoKICAgICAgRW1iZXIuVmlldy5hcHBseUF0dHJpYnV0ZUJpbmRp bmdzKGVsZW0sIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKICAg IH07CgogICAgdGhpcy5yZWdpc3Rlck9ic2VydmVyKHRoaXMsIHByb3BlcnR5 LCBvYnNlcnZlcik7CiAgfSwKCiAgLyoqCiAgICBXZSdyZSB1c2luZyBzZXRV bmtub3duUHJvcGVydHkgYXMgYSBob29rIHRvIHNldHVwIGF0dHJpYnV0ZUJp bmRpbmcgb2JzZXJ2ZXJzIGZvcgogICAgcHJvcGVydGllcyB0aGF0IGFyZW4n dCBkZWZpbmVkIG9uIGEgdmlldyBhdCBpbml0aWFsaXphdGlvbiB0aW1lLgoK ICAgIE5vdGU6IHNldFVua25vd25Qcm9wZXJ0eSB3aWxsIG9ubHkgYmUgY2Fs bGVkIG9uY2UgZm9yIGVhY2ggcHJvcGVydHkuCgogICAgQG1ldGhvZCBzZXRV bmtub3duUHJvcGVydHkKICAgIEBwYXJhbSBrZXkKICAgIEBwYXJhbSB2YWx1 ZQogICAgQHByaXZhdGUKICAqLwogIHNldFVua25vd25Qcm9wZXJ0eTogbnVs bCwgLy8gR2V0cyBkZWZpbmVkIGFmdGVyIGluaXRpYWxpemF0aW9uIGJ5IF9h cHBseUF0dHJpYnV0ZUJpbmRpbmdzCgogIF9zZXRVbmtub3duUHJvcGVydHk6 IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgIHZhciBhdHRyaWJ1dGVOYW1l ID0gdGhpcy5fdW5zcGVjaWZpZWRBdHRyaWJ1dGVCaW5kaW5ncyAmJiB0aGlz Ll91bnNwZWNpZmllZEF0dHJpYnV0ZUJpbmRpbmdzW2tleV07CiAgICBpZiAo YXR0cmlidXRlTmFtZSkgewogICAgICB0aGlzLl9zZXR1cEF0dHJpYnV0ZUJp bmRpbmdPYnNlcnZhdGlvbihrZXksIGF0dHJpYnV0ZU5hbWUpOwogICAgfQoK ICAgIGRlZmluZVByb3BlcnR5KHRoaXMsIGtleSk7CiAgICByZXR1cm4gc2V0 KHRoaXMsIGtleSwgdmFsdWUpOwogIH0sCgogIC8qKgogICAgR2l2ZW4gYSBw cm9wZXJ0eSBuYW1lLCByZXR1cm5zIGEgZGFzaGVyaXplZCB2ZXJzaW9uIG9m IHRoYXQKICAgIHByb3BlcnR5IG5hbWUgaWYgdGhlIHByb3BlcnR5IGV2YWx1 YXRlcyB0byBhIG5vbi1mYWxzeSB2YWx1ZS4KCiAgICBGb3IgZXhhbXBsZSwg aWYgdGhlIHZpZXcgaGFzIHByb3BlcnR5IGBpc1VyZ2VudGAgdGhhdCBldmFs dWF0ZXMgdG8gdHJ1ZSwKICAgIHBhc3NpbmcgYGlzVXJnZW50YCB0byB0aGlz IG1ldGhvZCB3aWxsIHJldHVybiBgImlzLXVyZ2VudCJgLgoKICAgIEBtZXRo b2QgX2NsYXNzU3RyaW5nRm9yUHJvcGVydHkKICAgIEBwYXJhbSBwcm9wZXJ0 eQogICAgQHByaXZhdGUKICAqLwogIF9jbGFzc1N0cmluZ0ZvclByb3BlcnR5 OiBmdW5jdGlvbihwcm9wZXJ0eSkgewogICAgdmFyIHBhcnNlZFBhdGggPSBF bWJlci5WaWV3Ll9wYXJzZVByb3BlcnR5UGF0aChwcm9wZXJ0eSk7CiAgICB2 YXIgcGF0aCA9IHBhcnNlZFBhdGgucGF0aDsKCiAgICB2YXIgdmFsID0gZ2V0 KHRoaXMsIHBhdGgpOwogICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkICYmIEVt YmVyLmlzR2xvYmFsUGF0aChwYXRoKSkgewogICAgICB2YWwgPSBnZXQoRW1i ZXIubG9va3VwLCBwYXRoKTsKICAgIH0KCiAgICByZXR1cm4gRW1iZXIuVmll dy5fY2xhc3NTdHJpbmdGb3JWYWx1ZShwYXRoLCB2YWwsIHBhcnNlZFBhdGgu Y2xhc3NOYW1lLCBwYXJzZWRQYXRoLmZhbHN5Q2xhc3NOYW1lKTsKICB9LAoK ICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uCiAgLy8gRUxFTUVOVCBTVVBQT1JUCiAgLy8K CiAgLyoqCiAgICBSZXR1cm5zIHRoZSBjdXJyZW50IERPTSBlbGVtZW50IGZv ciB0aGUgdmlldy4KCiAgICBAcHJvcGVydHkgZWxlbWVudAogICAgQHR5cGUg RE9NRWxlbWVudAogICovCiAgZWxlbWVudDogRW1iZXIuY29tcHV0ZWQoJ19w YXJlbnRWaWV3JywgZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewogICAgaWYgKHZh bHVlICE9PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuIHRoaXMuY3VycmVu dFN0YXRlLnNldEVsZW1lbnQodGhpcywgdmFsdWUpOwogICAgfSBlbHNlIHsK ICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlLmdldEVsZW1lbnQodGhp cyk7CiAgICB9CiAgfSksCgogIC8qKgogICAgUmV0dXJucyBhIGpRdWVyeSBv YmplY3QgZm9yIHRoaXMgdmlldydzIGVsZW1lbnQuIElmIHlvdSBwYXNzIGlu IGEgc2VsZWN0b3IKICAgIHN0cmluZywgdGhpcyBtZXRob2Qgd2lsbCByZXR1 cm4gYSBqUXVlcnkgb2JqZWN0LCB1c2luZyB0aGUgY3VycmVudCBlbGVtZW50 CiAgICBhcyBpdHMgYnVmZmVyLgoKICAgIEZvciBleGFtcGxlLCBjYWxsaW5n IGB2aWV3LiQoJ2xpJylgIHdpbGwgcmV0dXJuIGEgalF1ZXJ5IG9iamVjdCBj b250YWluaW5nCiAgICBhbGwgb2YgdGhlIGBsaWAgZWxlbWVudHMgaW5zaWRl IHRoZSBET00gZWxlbWVudCBvZiB0aGlzIHZpZXcuCgogICAgQG1ldGhvZCAk CiAgICBAcGFyYW0ge1N0cmluZ30gW3NlbGVjdG9yXSBhIGpRdWVyeS1jb21w YXRpYmxlIHNlbGVjdG9yIHN0cmluZwogICAgQHJldHVybiB7alF1ZXJ5fSB0 aGUgalF1ZXJ5IG9iamVjdCBmb3IgdGhlIERPTSBub2RlCiAgKi8KICAkOiBm dW5jdGlvbihzZWwpIHsKICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZS4k KHRoaXMsIHNlbCk7CiAgfSwKCiAgbXV0YXRlQ2hpbGRWaWV3czogZnVuY3Rp b24oY2FsbGJhY2spIHsKICAgIHZhciBjaGlsZFZpZXdzID0gdGhpcy5fY2hp bGRWaWV3cywKICAgICAgICBpZHggPSBjaGlsZFZpZXdzLmxlbmd0aCwKICAg ICAgICB2aWV3OwoKICAgIHdoaWxlKC0taWR4ID49IDApIHsKICAgICAgdmll dyA9IGNoaWxkVmlld3NbaWR4XTsKICAgICAgY2FsbGJhY2sodGhpcywgdmll dywgaWR4KTsKICAgIH0KCiAgICByZXR1cm4gdGhpczsKICB9LAoKICBmb3JF YWNoQ2hpbGRWaWV3OiBmdW5jdGlvbihjYWxsYmFjaykgewogICAgdmFyIGNo aWxkVmlld3MgPSB0aGlzLl9jaGlsZFZpZXdzOwoKICAgIGlmICghY2hpbGRW aWV3cykgeyByZXR1cm4gdGhpczsgfQoKICAgIHZhciBsZW4gPSBjaGlsZFZp ZXdzLmxlbmd0aCwKICAgICAgICB2aWV3LCBpZHg7CgogICAgZm9yIChpZHgg PSAwOyBpZHggPCBsZW47IGlkeCsrKSB7CiAgICAgIHZpZXcgPSBjaGlsZFZp ZXdzW2lkeF07CiAgICAgIGNhbGxiYWNrKHZpZXcpOwogICAgfQoKICAgIHJl dHVybiB0aGlzOwogIH0sCgogIC8qKgogICAgQXBwZW5kcyB0aGUgdmlldydz IGVsZW1lbnQgdG8gdGhlIHNwZWNpZmllZCBwYXJlbnQgZWxlbWVudC4KCiAg ICBJZiB0aGUgdmlldyBkb2VzIG5vdCBoYXZlIGFuIEhUTUwgcmVwcmVzZW50 YXRpb24geWV0LCBgY3JlYXRlRWxlbWVudCgpYAogICAgd2lsbCBiZSBjYWxs ZWQgYXV0b21hdGljYWxseS4KCiAgICBOb3RlIHRoYXQgdGhpcyBtZXRob2Qg anVzdCBzY2hlZHVsZXMgdGhlIHZpZXcgdG8gYmUgYXBwZW5kZWQ7IHRoZSBE T00KICAgIGVsZW1lbnQgd2lsbCBub3QgYmUgYXBwZW5kZWQgdG8gdGhlIGdp dmVuIGVsZW1lbnQgdW50aWwgYWxsIGJpbmRpbmdzIGhhdmUKICAgIGZpbmlz aGVkIHN5bmNocm9uaXppbmcuCgogICAgVGhpcyBpcyBub3QgdHlwaWNhbGx5 IGEgZnVuY3Rpb24gdGhhdCB5b3Ugd2lsbCBuZWVkIHRvIGNhbGwgZGlyZWN0 bHkgd2hlbgogICAgYnVpbGRpbmcgeW91ciBhcHBsaWNhdGlvbi4gWW91IG1p Z2h0IGNvbnNpZGVyIHVzaW5nIGBFbWJlci5Db250YWluZXJWaWV3YAogICAg aW5zdGVhZC4gSWYgeW91IGRvIG5lZWQgdG8gdXNlIGBhcHBlbmRUb2AsIGJl IHN1cmUgdGhhdCB0aGUgdGFyZ2V0IGVsZW1lbnQKICAgIHlvdSBhcmUgcHJv dmlkaW5nIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBgRW1iZXIuQXBwbGljYXRp b25gIGFuZCBkb2VzIG5vdAogICAgaGF2ZSBhbiBhbmNlc3RvciBlbGVtZW50 IHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIEVtYmVyIHZpZXcuCgogICAg QG1ldGhvZCBhcHBlbmRUbwogICAgQHBhcmFtIHtTdHJpbmd8RE9NRWxlbWVu dHxqUXVlcnl9IEEgc2VsZWN0b3IsIGVsZW1lbnQsIEhUTUwgc3RyaW5nLCBv ciBqUXVlcnkgb2JqZWN0CiAgICBAcmV0dXJuIHtFbWJlci5WaWV3fSByZWNl aXZlcgogICovCiAgYXBwZW5kVG86IGZ1bmN0aW9uKHRhcmdldCkgewogICAg Ly8gU2NoZWR1bGUgdGhlIERPTSBlbGVtZW50IHRvIGJlIGNyZWF0ZWQgYW5k IGFwcGVuZGVkIHRvIHRoZSBnaXZlbgogICAgLy8gZWxlbWVudCBhZnRlciBi aW5kaW5ncyBoYXZlIHN5bmNocm9uaXplZC4KICAgIHRoaXMuX2luc2VydEVs ZW1lbnRMYXRlcihmdW5jdGlvbigpIHsKICAgICAgRW1iZXIuYXNzZXJ0KCJZ b3UgdHJpZWQgdG8gYXBwZW5kIHRvICgiICsgdGFyZ2V0ICsgIikgYnV0IHRo YXQgaXNuJ3QgaW4gdGhlIERPTSIsIEVtYmVyLiQodGFyZ2V0KS5sZW5ndGgg PiAwKTsKICAgICAgRW1iZXIuYXNzZXJ0KCJZb3UgY2Fubm90IGFwcGVuZCB0 byBhbiBleGlzdGluZyBFbWJlci5WaWV3LiBDb25zaWRlciB1c2luZyBFbWJl ci5Db250YWluZXJWaWV3IGluc3RlYWQuIiwgIUVtYmVyLiQodGFyZ2V0KS5p cygnLmVtYmVyLXZpZXcnKSAmJiAhRW1iZXIuJCh0YXJnZXQpLnBhcmVudHMo KS5pcygnLmVtYmVyLXZpZXcnKSk7CiAgICAgIHRoaXMuJCgpLmFwcGVuZFRv KHRhcmdldCk7CiAgICB9KTsKCiAgICByZXR1cm4gdGhpczsKICB9LAoKICAv KioKICAgIFJlcGxhY2VzIHRoZSBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQg cGFyZW50IGVsZW1lbnQgd2l0aCB0aGlzIHZpZXcncwogICAgZWxlbWVudC4g SWYgdGhlIHZpZXcgZG9lcyBub3QgaGF2ZSBhbiBIVE1MIHJlcHJlc2VudGF0 aW9uIHlldCwKICAgIGBjcmVhdGVFbGVtZW50KClgIHdpbGwgYmUgY2FsbGVk IGF1dG9tYXRpY2FsbHkuCgogICAgTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGp1 c3Qgc2NoZWR1bGVzIHRoZSB2aWV3IHRvIGJlIGFwcGVuZGVkOyB0aGUgRE9N CiAgICBlbGVtZW50IHdpbGwgbm90IGJlIGFwcGVuZGVkIHRvIHRoZSBnaXZl biBlbGVtZW50IHVudGlsIGFsbCBiaW5kaW5ncyBoYXZlCiAgICBmaW5pc2hl ZCBzeW5jaHJvbml6aW5nCgogICAgQG1ldGhvZCByZXBsYWNlSW4KICAgIEBw YXJhbSB7U3RyaW5nfERPTUVsZW1lbnR8alF1ZXJ5fSB0YXJnZXQgQSBzZWxl Y3RvciwgZWxlbWVudCwgSFRNTCBzdHJpbmcsIG9yIGpRdWVyeSBvYmplY3QK ICAgIEByZXR1cm4ge0VtYmVyLlZpZXd9IHJlY2VpdmVkCiAgKi8KICByZXBs YWNlSW46IGZ1bmN0aW9uKHRhcmdldCkgewogICAgRW1iZXIuYXNzZXJ0KCJZ b3UgdHJpZWQgdG8gcmVwbGFjZSBpbiAoIiArIHRhcmdldCArICIpIGJ1dCB0 aGF0IGlzbid0IGluIHRoZSBET00iLCBFbWJlci4kKHRhcmdldCkubGVuZ3Ro ID4gMCk7CiAgICBFbWJlci5hc3NlcnQoIllvdSBjYW5ub3QgcmVwbGFjZSBh biBleGlzdGluZyBFbWJlci5WaWV3LiBDb25zaWRlciB1c2luZyBFbWJlci5D b250YWluZXJWaWV3IGluc3RlYWQuIiwgIUVtYmVyLiQodGFyZ2V0KS5pcygn LmVtYmVyLXZpZXcnKSAmJiAhRW1iZXIuJCh0YXJnZXQpLnBhcmVudHMoKS5p cygnLmVtYmVyLXZpZXcnKSk7CgogICAgdGhpcy5faW5zZXJ0RWxlbWVudExh dGVyKGZ1bmN0aW9uKCkgewogICAgICBFbWJlci4kKHRhcmdldCkuZW1wdHko KTsKICAgICAgdGhpcy4kKCkuYXBwZW5kVG8odGFyZ2V0KTsKICAgIH0pOwoK ICAgIHJldHVybiB0aGlzOwogIH0sCgogIC8qKgogICAgU2NoZWR1bGVzIGEg RE9NIG9wZXJhdGlvbiB0byBvY2N1ciBkdXJpbmcgdGhlIG5leHQgcmVuZGVy IHBoYXNlLiBUaGlzCiAgICBlbnN1cmVzIHRoYXQgYWxsIGJpbmRpbmdzIGhh dmUgZmluaXNoZWQgc3luY2hyb25pemluZyBiZWZvcmUgdGhlIHZpZXcgaXMK ICAgIHJlbmRlcmVkLgoKICAgIFRvIHVzZSwgcGFzcyBhIGZ1bmN0aW9uIHRo YXQgcGVyZm9ybXMgYSBET00gb3BlcmF0aW9uLgoKICAgIEJlZm9yZSB5b3Vy IGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhpcyB2aWV3IGFuZCBhbGwgY2hpbGQg dmlld3Mgd2lsbCByZWNlaXZlCiAgICB0aGUgYHdpbGxJbnNlcnRFbGVtZW50 YCBldmVudC4gQWZ0ZXIgeW91ciBmdW5jdGlvbiBpcyBpbnZva2VkLCB0aGlz IHZpZXcKICAgIGFuZCBhbGwgb2YgaXRzIGNoaWxkIHZpZXdzIHdpbGwgcmVj ZWl2ZSB0aGUgYGRpZEluc2VydEVsZW1lbnRgIGV2ZW50LgoKICAgIGBgYGph dmFzY3JpcHQKICAgIHZpZXcuX2luc2VydEVsZW1lbnRMYXRlcihmdW5jdGlv bigpIHsKICAgICAgdGhpcy5jcmVhdGVFbGVtZW50KCk7CiAgICAgIHRoaXMu JCgpLmFwcGVuZFRvKCdib2R5Jyk7CiAgICB9KTsKICAgIGBgYAoKICAgIEBt ZXRob2QgX2luc2VydEVsZW1lbnRMYXRlcgogICAgQHBhcmFtIHtGdW5jdGlv bn0gZm4gdGhlIGZ1bmN0aW9uIHRoYXQgaW5zZXJ0cyB0aGUgZWxlbWVudCBp bnRvIHRoZSBET00KICAgIEBwcml2YXRlCiAgKi8KICBfaW5zZXJ0RWxlbWVu dExhdGVyOiBmdW5jdGlvbihmbikgewogICAgdGhpcy5fc2NoZWR1bGVkSW5z ZXJ0ID0gRW1iZXIucnVuLnNjaGVkdWxlT25jZSgncmVuZGVyJywgdGhpcywg J19pbnNlcnRFbGVtZW50JywgZm4pOwogIH0sCgogIF9pbnNlcnRFbGVtZW50 OiBmdW5jdGlvbiAoZm4pIHsKICAgIHRoaXMuX3NjaGVkdWxlZEluc2VydCA9 IG51bGw7CiAgICB0aGlzLmN1cnJlbnRTdGF0ZS5pbnNlcnRFbGVtZW50KHRo aXMsIGZuKTsKICB9LAoKICAvKioKICAgIEFwcGVuZHMgdGhlIHZpZXcncyBl bGVtZW50IHRvIHRoZSBkb2N1bWVudCBib2R5LiBJZiB0aGUgdmlldyBkb2Vz CiAgICBub3QgaGF2ZSBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIHlldCwgYGNy ZWF0ZUVsZW1lbnQoKWAgd2lsbCBiZSBjYWxsZWQKICAgIGF1dG9tYXRpY2Fs bHkuCgogICAgSWYgeW91ciBhcHBsaWNhdGlvbiB1c2VzIHRoZSBgcm9vdEVs ZW1lbnRgIHByb3BlcnR5LCB5b3UgbXVzdCBhcHBlbmQKICAgIHRoZSB2aWV3 IHdpdGhpbiB0aGF0IGVsZW1lbnQuIFJlbmRlcmluZyB2aWV3cyBvdXRzaWRl IG9mIHRoZSBgcm9vdEVsZW1lbnRgCiAgICBpcyBub3Qgc3VwcG9ydGVkLgoK ICAgIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBqdXN0IHNjaGVkdWxlcyB0aGUg dmlldyB0byBiZSBhcHBlbmRlZDsgdGhlIERPTQogICAgZWxlbWVudCB3aWxs IG5vdCBiZSBhcHBlbmRlZCB0byB0aGUgZG9jdW1lbnQgYm9keSB1bnRpbCBh bGwgYmluZGluZ3MgaGF2ZQogICAgZmluaXNoZWQgc3luY2hyb25pemluZy4K CiAgICBAbWV0aG9kIGFwcGVuZAogICAgQHJldHVybiB7RW1iZXIuVmlld30g cmVjZWl2ZXIKICAqLwogIGFwcGVuZDogZnVuY3Rpb24oKSB7CiAgICByZXR1 cm4gdGhpcy5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KTsKICB9LAoKICAvKioK ICAgIFJlbW92ZXMgdGhlIHZpZXcncyBlbGVtZW50IGZyb20gdGhlIGVsZW1l bnQgdG8gd2hpY2ggaXQgaXMgYXR0YWNoZWQuCgogICAgQG1ldGhvZCByZW1v dmUKICAgIEByZXR1cm4ge0VtYmVyLlZpZXd9IHJlY2VpdmVyCiAgKi8KICBy ZW1vdmU6IGZ1bmN0aW9uKCkgewogICAgLy8gV2hhdCB3ZSBzaG91bGQgcmVh bGx5IGRvIGhlcmUgaXMgd2FpdCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBydW4g bG9vcAogICAgLy8gdG8gZGV0ZXJtaW5lIGlmIHRoZSBlbGVtZW50IGhhcyBi ZWVuIHJlLWFwcGVuZGVkIHRvIGEgZGlmZmVyZW50CiAgICAvLyBlbGVtZW50 LgogICAgLy8gSW4gdGhlIGludGVyaW0sIHdlIHdpbGwganVzdCByZS1yZW5k ZXIgaWYgdGhhdCBoYXBwZW5zLiBJdCBpcyBtb3JlCiAgICAvLyBpbXBvcnRh bnQgdGhhbiBlbGVtZW50cyBnZXQgZ2FyYmFnZSBjb2xsZWN0ZWQuCiAgICBp ZiAoIXRoaXMucmVtb3ZlZEZyb21ET00pIHsgdGhpcy5kZXN0cm95RWxlbWVu dCgpOyB9CiAgICB0aGlzLmludm9rZVJlY3Vyc2l2ZWx5KGZ1bmN0aW9uKHZp ZXcpIHsKICAgICAgaWYgKHZpZXcuY2xlYXJSZW5kZXJlZENoaWxkcmVuKSB7 IHZpZXcuY2xlYXJSZW5kZXJlZENoaWxkcmVuKCk7IH0KICAgIH0pOwogIH0s CgogIGVsZW1lbnRJZDogbnVsbCwKCiAgLyoqCiAgICBBdHRlbXB0cyB0byBk aXNjb3ZlciB0aGUgZWxlbWVudCBpbiB0aGUgcGFyZW50IGVsZW1lbnQuIFRo ZSBkZWZhdWx0CiAgICBpbXBsZW1lbnRhdGlvbiBsb29rcyBmb3IgYW4gZWxl bWVudCB3aXRoIGFuIElEIG9mIGBlbGVtZW50SWRgIChvciB0aGUKICAgIHZp ZXcncyBndWlkIGlmIGBlbGVtZW50SWRgIGlzIG51bGwpLiBZb3UgY2FuIG92 ZXJyaWRlIHRoaXMgbWV0aG9kIHRvCiAgICBwcm92aWRlIHlvdXIgb3duIGZv cm0gb2YgbG9va3VwLiBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gZGlz Y292ZXIgeW91cgogICAgZWxlbWVudCB1c2luZyBhIENTUyBjbGFzcyBuYW1l IGluc3RlYWQgb2YgYW4gSUQuCgogICAgQG1ldGhvZCBmaW5kRWxlbWVudElu UGFyZW50RWxlbWVudAogICAgQHBhcmFtIHtET01FbGVtZW50fSBwYXJlbnRF bGVtZW50IFRoZSBwYXJlbnQncyBET00gZWxlbWVudAogICAgQHJldHVybiB7 RE9NRWxlbWVudH0gVGhlIGRpc2NvdmVyZWQgZWxlbWVudAogICovCiAgZmlu ZEVsZW1lbnRJblBhcmVudEVsZW1lbnQ6IGZ1bmN0aW9uKHBhcmVudEVsZW0p IHsKICAgIHZhciBpZCA9ICIjIiArIHRoaXMuZWxlbWVudElkOwogICAgcmV0 dXJuIEVtYmVyLiQoaWQpWzBdIHx8IEVtYmVyLiQoaWQsIHBhcmVudEVsZW0p WzBdOwogIH0sCgogIC8qKgogICAgQ3JlYXRlcyBhIERPTSByZXByZXNlbnRh dGlvbiBvZiB0aGUgdmlldyBhbmQgYWxsIG9mIGl0cwogICAgY2hpbGQgdmll d3MgYnkgcmVjdXJzaXZlbHkgY2FsbGluZyB0aGUgYHJlbmRlcigpYCBtZXRo b2QuCgogICAgQWZ0ZXIgdGhlIGVsZW1lbnQgaGFzIGJlZW4gY3JlYXRlZCwg YGRpZEluc2VydEVsZW1lbnRgIHdpbGwKICAgIGJlIGNhbGxlZCBvbiB0aGlz IHZpZXcgYW5kIGFsbCBvZiBpdHMgY2hpbGQgdmlld3MuCgogICAgQG1ldGhv ZCBjcmVhdGVFbGVtZW50CiAgICBAcmV0dXJuIHtFbWJlci5WaWV3fSByZWNl aXZlcgogICovCiAgY3JlYXRlRWxlbWVudDogZnVuY3Rpb24oKSB7CiAgICBp ZiAoZ2V0KHRoaXMsICdlbGVtZW50JykpIHsgcmV0dXJuIHRoaXM7IH0KCiAg ICB2YXIgYnVmZmVyID0gdGhpcy5yZW5kZXJUb0J1ZmZlcigpOwogICAgc2V0 KHRoaXMsICdlbGVtZW50JywgYnVmZmVyLmVsZW1lbnQoKSk7CgogICAgcmV0 dXJuIHRoaXM7CiAgfSwKCiAgLyoqCiAgICBDYWxsZWQgd2hlbiBhIHZpZXcg aXMgZ29pbmcgdG8gaW5zZXJ0IGFuIGVsZW1lbnQgaW50byB0aGUgRE9NLgoK ICAgIEBldmVudCB3aWxsSW5zZXJ0RWxlbWVudAogICovCiAgd2lsbEluc2Vy dEVsZW1lbnQ6IEVtYmVyLkssCgogIC8qKgogICAgQ2FsbGVkIHdoZW4gdGhl IGVsZW1lbnQgb2YgdGhlIHZpZXcgaGFzIGJlZW4gaW5zZXJ0ZWQgaW50byB0 aGUgRE9NCiAgICBvciBhZnRlciB0aGUgdmlldyB3YXMgcmUtcmVuZGVyZWQu IE92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gdG8gZG8gYW55CiAgICBzZXQgdXAg dGhhdCByZXF1aXJlcyBhbiBlbGVtZW50IGluIHRoZSBkb2N1bWVudCBib2R5 LgoKICAgIEBldmVudCBkaWRJbnNlcnRFbGVtZW50CiAgKi8KICBkaWRJbnNl cnRFbGVtZW50OiBFbWJlci5LLAoKICAvKioKICAgIENhbGxlZCB3aGVuIHRo ZSB2aWV3IGlzIGFib3V0IHRvIHJlcmVuZGVyLCBidXQgYmVmb3JlIGFueXRo aW5nIGhhcwogICAgYmVlbiB0b3JuIGRvd24uIFRoaXMgaXMgYSBnb29kIG9w cG9ydHVuaXR5IHRvIHRlYXIgZG93biBhbnkgbWFudWFsCiAgICBvYnNlcnZl cnMgeW91IGhhdmUgaW5zdGFsbGVkIGJhc2VkIG9uIHRoZSBET00gc3RhdGUK CiAgICBAZXZlbnQgd2lsbENsZWFyUmVuZGVyCiAgKi8KICB3aWxsQ2xlYXJS ZW5kZXI6IEVtYmVyLkssCgogIC8qKgogICAgUnVuIHRoaXMgY2FsbGJhY2sg b24gdGhlIGN1cnJlbnQgdmlldyAodW5sZXNzIGluY2x1ZGVTZWxmIGlzIGZh bHNlKSBhbmQgcmVjdXJzaXZlbHkgb24gY2hpbGQgdmlld3MuCgogICAgQG1l dGhvZCBpbnZva2VSZWN1cnNpdmVseQogICAgQHBhcmFtIGZuIHtGdW5jdGlv bn0KICAgIEBwYXJhbSBpbmNsdWRlU2VsZiB7Qm9vbGVhbn0gSW5jbHVkZXMg aXRzZWxmIGlmIHRydWUuCiAgICBAcHJpdmF0ZQogICovCiAgaW52b2tlUmVj dXJzaXZlbHk6IGZ1bmN0aW9uKGZuLCBpbmNsdWRlU2VsZikgewogICAgdmFy IGNoaWxkVmlld3MgPSAoaW5jbHVkZVNlbGYgPT09IGZhbHNlKSA/IHRoaXMu X2NoaWxkVmlld3MgOiBbdGhpc107CiAgICB2YXIgY3VycmVudFZpZXdzLCB2 aWV3LCBjdXJyZW50Q2hpbGRWaWV3czsKCiAgICB3aGlsZSAoY2hpbGRWaWV3 cy5sZW5ndGgpIHsKICAgICAgY3VycmVudFZpZXdzID0gY2hpbGRWaWV3cy5z bGljZSgpOwogICAgICBjaGlsZFZpZXdzID0gW107CgogICAgICBmb3IgKHZh ciBpPTAsIGw9Y3VycmVudFZpZXdzLmxlbmd0aDsgaTxsOyBpKyspIHsKICAg ICAgICB2aWV3ID0gY3VycmVudFZpZXdzW2ldOwogICAgICAgIGN1cnJlbnRD aGlsZFZpZXdzID0gdmlldy5fY2hpbGRWaWV3cyA/IHZpZXcuX2NoaWxkVmll d3Muc2xpY2UoMCkgOiBudWxsOwogICAgICAgIGZuKHZpZXcpOwogICAgICAg IGlmIChjdXJyZW50Q2hpbGRWaWV3cykgewogICAgICAgICAgY2hpbGRWaWV3 cy5wdXNoLmFwcGx5KGNoaWxkVmlld3MsIGN1cnJlbnRDaGlsZFZpZXdzKTsK ICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9LAoKICB0cmlnZ2VyUmVjdXJz aXZlbHk6IGZ1bmN0aW9uKGV2ZW50TmFtZSkgewogICAgdmFyIGNoaWxkVmll d3MgPSBbdGhpc10sIGN1cnJlbnRWaWV3cywgdmlldywgY3VycmVudENoaWxk Vmlld3M7CgogICAgd2hpbGUgKGNoaWxkVmlld3MubGVuZ3RoKSB7CiAgICAg IGN1cnJlbnRWaWV3cyA9IGNoaWxkVmlld3Muc2xpY2UoKTsKICAgICAgY2hp bGRWaWV3cyA9IFtdOwoKICAgICAgZm9yICh2YXIgaT0wLCBsPWN1cnJlbnRW aWV3cy5sZW5ndGg7IGk8bDsgaSsrKSB7CiAgICAgICAgdmlldyA9IGN1cnJl bnRWaWV3c1tpXTsKICAgICAgICBjdXJyZW50Q2hpbGRWaWV3cyA9IHZpZXcu X2NoaWxkVmlld3MgPyB2aWV3Ll9jaGlsZFZpZXdzLnNsaWNlKDApIDogbnVs bDsKICAgICAgICBpZiAodmlldy50cmlnZ2VyKSB7IHZpZXcudHJpZ2dlcihl dmVudE5hbWUpOyB9CiAgICAgICAgaWYgKGN1cnJlbnRDaGlsZFZpZXdzKSB7 CiAgICAgICAgICBjaGlsZFZpZXdzLnB1c2guYXBwbHkoY2hpbGRWaWV3cywg Y3VycmVudENoaWxkVmlld3MpOwogICAgICAgIH0KCiAgICAgIH0KICAgIH0K ICB9LAoKICB2aWV3SGllcmFyY2h5Q29sbGVjdGlvbjogZnVuY3Rpb24oKSB7 CiAgICB2YXIgY3VycmVudFZpZXcsIHZpZXdDb2xsZWN0aW9uID0gbmV3IFZp ZXdDb2xsZWN0aW9uKFt0aGlzXSk7CgogICAgZm9yICh2YXIgaSA9IDA7IGkg PCB2aWV3Q29sbGVjdGlvbi5sZW5ndGg7IGkrKykgewogICAgICBjdXJyZW50 VmlldyA9IHZpZXdDb2xsZWN0aW9uLm9iamVjdEF0KGkpOwogICAgICBpZiAo Y3VycmVudFZpZXcuX2NoaWxkVmlld3MpIHsKICAgICAgICB2aWV3Q29sbGVj dGlvbi5wdXNoLmFwcGx5KHZpZXdDb2xsZWN0aW9uLCBjdXJyZW50Vmlldy5f Y2hpbGRWaWV3cyk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gdmlld0Nv bGxlY3Rpb247CiAgfSwKCiAgLyoqCiAgICBEZXN0cm95cyBhbnkgZXhpc3Rp bmcgZWxlbWVudCBhbG9uZyB3aXRoIHRoZSBlbGVtZW50IGZvciBhbnkgY2hp bGQgdmlld3MKICAgIGFzIHdlbGwuIElmIHRoZSB2aWV3IGRvZXMgbm90IGN1 cnJlbnRseSBoYXZlIGEgZWxlbWVudCwgdGhlbiB0aGlzIG1ldGhvZAogICAg d2lsbCBkbyBub3RoaW5nLgoKICAgIElmIHlvdSBpbXBsZW1lbnQgYHdpbGxE ZXN0cm95RWxlbWVudCgpYCBvbiB5b3VyIHZpZXcsIHRoZW4gdGhpcyBtZXRo b2Qgd2lsbAogICAgYmUgaW52b2tlZCBvbiB5b3VyIHZpZXcgYmVmb3JlIHlv dXIgZWxlbWVudCBpcyBkZXN0cm95ZWQgdG8gZ2l2ZSB5b3UgYQogICAgY2hh bmNlIHRvIGNsZWFuIHVwIGFueSBldmVudCBoYW5kbGVycywgZXRjLgoKICAg IElmIHlvdSB3cml0ZSBhIGB3aWxsRGVzdHJveUVsZW1lbnQoKWAgaGFuZGxl ciwgeW91IGNhbiBhc3N1bWUgdGhhdCB5b3VyCiAgICBgZGlkSW5zZXJ0RWxl bWVudCgpYCBoYW5kbGVyIHdhcyBjYWxsZWQgZWFybGllciBmb3IgdGhlIHNh bWUgZWxlbWVudC4KCiAgICBZb3Ugc2hvdWxkIG5vdCBjYWxsIG9yIG92ZXJy aWRlIHRoaXMgbWV0aG9kIHlvdXJzZWxmLCBidXQgeW91IG1heQogICAgd2Fu dCB0byBpbXBsZW1lbnQgdGhlIGFib3ZlIGNhbGxiYWNrcy4KCiAgICBAbWV0 aG9kIGRlc3Ryb3lFbGVtZW50CiAgICBAcmV0dXJuIHtFbWJlci5WaWV3fSBy ZWNlaXZlcgogICovCiAgZGVzdHJveUVsZW1lbnQ6IGZ1bmN0aW9uKCkgewog ICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlLmRlc3Ryb3lFbGVtZW50KHRo aXMpOwogIH0sCgogIC8qKgogICAgQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQg b2YgdGhlIHZpZXcgaXMgZ29pbmcgdG8gYmUgZGVzdHJveWVkLiBPdmVycmlk ZQogICAgdGhpcyBmdW5jdGlvbiB0byBkbyBhbnkgdGVhcmRvd24gdGhhdCBy ZXF1aXJlcyBhbiBlbGVtZW50LCBsaWtlIHJlbW92aW5nCiAgICBldmVudCBs aXN0ZW5lcnMuCgogICAgQGV2ZW50IHdpbGxEZXN0cm95RWxlbWVudAogICov CiAgd2lsbERlc3Ryb3lFbGVtZW50OiBFbWJlci5LLAoKICAvKioKICAgIFRy aWdnZXJzIHRoZSBgd2lsbERlc3Ryb3lFbGVtZW50YCBldmVudCAod2hpY2gg aW52b2tlcyB0aGUKICAgIGB3aWxsRGVzdHJveUVsZW1lbnQoKWAgbWV0aG9k IGlmIGl0IGV4aXN0cykgb24gdGhpcyB2aWV3IGFuZCBhbGwgY2hpbGQKICAg IHZpZXdzLgoKICAgIEJlZm9yZSB0cmlnZ2VyaW5nIGB3aWxsRGVzdHJveUVs ZW1lbnRgLCBpdCBmaXJzdCB0cmlnZ2VycyB0aGUKICAgIGB3aWxsQ2xlYXJS ZW5kZXJgIGV2ZW50IHJlY3Vyc2l2ZWx5LgoKICAgIEBtZXRob2QgX25vdGlm eVdpbGxEZXN0cm95RWxlbWVudAogICAgQHByaXZhdGUKICAqLwogIF9ub3Rp ZnlXaWxsRGVzdHJveUVsZW1lbnQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIHZp ZXdDb2xsZWN0aW9uID0gdGhpcy52aWV3SGllcmFyY2h5Q29sbGVjdGlvbigp OwogICAgdmlld0NvbGxlY3Rpb24udHJpZ2dlcignd2lsbENsZWFyUmVuZGVy Jyk7CiAgICB2aWV3Q29sbGVjdGlvbi50cmlnZ2VyKCd3aWxsRGVzdHJveUVs ZW1lbnQnKTsKICAgIHJldHVybiB2aWV3Q29sbGVjdGlvbjsKICB9LAoKICAv KioKICAgIElmIHRoaXMgdmlldydzIGVsZW1lbnQgY2hhbmdlcywgd2UgbmVl ZCB0byBpbnZhbGlkYXRlIHRoZSBjYWNoZXMgb2Ygb3VyCiAgICBjaGlsZCB2 aWV3cyBzbyB0aGF0IHdlIGRvIG5vdCByZXRhaW4gcmVmZXJlbmNlcyB0byBE T00gZWxlbWVudHMgdGhhdCBhcmUKICAgIG5vIGxvbmdlciBuZWVkZWQuCgog ICAgQG1ldGhvZCBfZWxlbWVudERpZENoYW5nZQogICAgQHByaXZhdGUKICAq LwogIF9lbGVtZW50RGlkQ2hhbmdlOiBFbWJlci5vYnNlcnZlcignZWxlbWVu dCcsIGZ1bmN0aW9uKCkgewogICAgdGhpcy5mb3JFYWNoQ2hpbGRWaWV3KGZ1 bmN0aW9uKHZpZXcpIHsKICAgICAgZGVsZXRlIG1ldGEodmlldykuY2FjaGUu ZWxlbWVudDsKICAgIH0pOwogIH0pLAoKICAvKioKICAgIENhbGxlZCB3aGVu IHRoZSBwYXJlbnRWaWV3IHByb3BlcnR5IGhhcyBjaGFuZ2VkLgoKICAgIEBl dmVudCBwYXJlbnRWaWV3RGlkQ2hhbmdlCiAgKi8KICBwYXJlbnRWaWV3RGlk Q2hhbmdlOiBFbWJlci5LLAoKICBpbnN0cnVtZW50TmFtZTogJ3ZpZXcnLAoK ICBpbnN0cnVtZW50RGV0YWlsczogZnVuY3Rpb24oaGFzaCkgewogICAgaGFz aC50ZW1wbGF0ZSA9IGdldCh0aGlzLCAndGVtcGxhdGVOYW1lJyk7CiAgICB0 aGlzLl9zdXBlcihoYXNoKTsKICB9LAoKICBfcmVuZGVyVG9CdWZmZXI6IGZ1 bmN0aW9uKHBhcmVudEJ1ZmZlciwgYnVmZmVyT3BlcmF0aW9uKSB7CiAgICB0 aGlzLmxlbmd0aEJlZm9yZVJlbmRlciA9IHRoaXMuX2NoaWxkVmlld3MubGVu Z3RoOwogICAgdmFyIGJ1ZmZlciA9IHRoaXMuX3N1cGVyKHBhcmVudEJ1ZmZl ciwgYnVmZmVyT3BlcmF0aW9uKTsKICAgIHRoaXMubGVuZ3RoQWZ0ZXJSZW5k ZXIgPSB0aGlzLl9jaGlsZFZpZXdzLmxlbmd0aDsKCiAgICByZXR1cm4gYnVm ZmVyOwogIH0sCgogIHJlbmRlclRvQnVmZmVySWZOZWVkZWQ6IGZ1bmN0aW9u IChidWZmZXIpIHsKICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZS5yZW5k ZXJUb0J1ZmZlcklmTmVlZGVkKHRoaXMsIGJ1ZmZlcik7CiAgfSwKCiAgYmVm b3JlUmVuZGVyOiBmdW5jdGlvbihidWZmZXIpIHsKICAgIHRoaXMuYXBwbHlB dHRyaWJ1dGVzVG9CdWZmZXIoYnVmZmVyKTsKICAgIGJ1ZmZlci5wdXNoT3Bl bmluZ1RhZygpOwogIH0sCgogIGFmdGVyUmVuZGVyOiBmdW5jdGlvbihidWZm ZXIpIHsKICAgIGJ1ZmZlci5wdXNoQ2xvc2luZ1RhZygpOwogIH0sCgogIGFw cGx5QXR0cmlidXRlc1RvQnVmZmVyOiBmdW5jdGlvbihidWZmZXIpIHsKICAg IC8vIENyZWF0ZXMgb2JzZXJ2ZXJzIGZvciBhbGwgcmVnaXN0ZXJlZCBjbGFz cyBuYW1lIGFuZCBhdHRyaWJ1dGUgYmluZGluZ3MsCiAgICAvLyB0aGVuIGFk ZHMgdGhlbSB0byB0aGUgZWxlbWVudC4KICAgIHZhciBjbGFzc05hbWVCaW5k aW5ncyA9IGdldCh0aGlzLCAnY2xhc3NOYW1lQmluZGluZ3MnKTsKICAgIGlm IChjbGFzc05hbWVCaW5kaW5ncy5sZW5ndGgpIHsKICAgICAgdGhpcy5fYXBw bHlDbGFzc05hbWVCaW5kaW5ncyhjbGFzc05hbWVCaW5kaW5ncyk7CiAgICB9 CgogICAgLy8gUGFzcyB0aGUgcmVuZGVyIGJ1ZmZlciBzbyB0aGUgbWV0aG9k IGNhbiBhcHBseSBhdHRyaWJ1dGVzIGRpcmVjdGx5LgogICAgLy8gVGhpcyBp c24ndCBuZWVkZWQgZm9yIGNsYXNzIG5hbWUgYmluZGluZ3MgYmVjYXVzZSB0 aGV5IHVzZSB0aGUKICAgIC8vIGV4aXN0aW5nIGNsYXNzTmFtZXMgaW5mcmFz dHJ1Y3R1cmUuCiAgICB2YXIgYXR0cmlidXRlQmluZGluZ3MgPSBnZXQodGhp cywgJ2F0dHJpYnV0ZUJpbmRpbmdzJyk7CiAgICBpZiAoYXR0cmlidXRlQmlu ZGluZ3MubGVuZ3RoKSB7CiAgICAgIHRoaXMuX2FwcGx5QXR0cmlidXRlQmlu ZGluZ3MoYnVmZmVyLCBhdHRyaWJ1dGVCaW5kaW5ncyk7CiAgICB9CgogICAg YnVmZmVyLnNldENsYXNzZXModGhpcy5jbGFzc05hbWVzKTsKICAgIGJ1ZmZl ci5pZCh0aGlzLmVsZW1lbnRJZCk7CgogICAgdmFyIHJvbGUgPSBnZXQodGhp cywgJ2FyaWFSb2xlJyk7CiAgICBpZiAocm9sZSkgewogICAgICBidWZmZXIu YXR0cigncm9sZScsIHJvbGUpOwogICAgfQoKICAgIGlmIChnZXQodGhpcywg J2lzVmlzaWJsZScpID09PSBmYWxzZSkgewogICAgICBidWZmZXIuc3R5bGUo J2Rpc3BsYXknLCAnbm9uZScpOwogICAgfQogIH0sCgogIC8vIC4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4KICAvLyBTVEFOREFSRCBSRU5ERVIgUFJPUEVSVElFUwogIC8vCgog IC8qKgogICAgVGFnIG5hbWUgZm9yIHRoZSB2aWV3J3Mgb3V0ZXIgZWxlbWVu dC4gVGhlIHRhZyBuYW1lIGlzIG9ubHkgdXNlZCB3aGVuIGFuCiAgICBlbGVt ZW50IGlzIGZpcnN0IGNyZWF0ZWQuIElmIHlvdSBjaGFuZ2UgdGhlIGB0YWdO YW1lYCBmb3IgYW4gZWxlbWVudCwgeW91CiAgICBtdXN0IGRlc3Ryb3kgYW5k IHJlY3JlYXRlIHRoZSB2aWV3IGVsZW1lbnQuCgogICAgQnkgZGVmYXVsdCwg dGhlIHJlbmRlciBidWZmZXIgd2lsbCB1c2UgYSBgPGRpdj5gIHRhZyBmb3Ig dmlld3MuCgogICAgQHByb3BlcnR5IHRhZ05hbWUKICAgIEB0eXBlIFN0cmlu ZwogICAgQGRlZmF1bHQgbnVsbAogICovCgogIC8vIFdlIGxlYXZlIHRoaXMg bnVsbCBieSBkZWZhdWx0IHNvIHdlIGNhbiB0ZWxsIHRoZSBkaWZmZXJlbmNl IGJldHdlZW4KICAvLyB0aGUgZGVmYXVsdCBjYXNlIGFuZCBhIHVzZXItc3Bl Y2lmaWVkIHRhZy4KICB0YWdOYW1lOiBudWxsLAoKICAvKioKICAgIFRoZSBX QUktQVJJQSByb2xlIG9mIHRoZSBjb250cm9sIHJlcHJlc2VudGVkIGJ5IHRo aXMgdmlldy4gRm9yIGV4YW1wbGUsIGEKICAgIGJ1dHRvbiBtYXkgaGF2ZSBh IHJvbGUgb2YgdHlwZSAnYnV0dG9uJywgb3IgYSBwYW5lIG1heSBoYXZlIGEg cm9sZSBvZgogICAgdHlwZSAnYWxlcnRkaWFsb2cnLiBUaGlzIHByb3BlcnR5 IGlzIHVzZWQgYnkgYXNzaXN0aXZlIHNvZnR3YXJlIHRvIGhlbHAKICAgIHZp c3VhbGx5IGNoYWxsZW5nZWQgdXNlcnMgbmF2aWdhdGUgcmljaCB3ZWIgYXBw bGljYXRpb25zLgoKICAgIFRoZSBmdWxsIGxpc3Qgb2YgdmFsaWQgV0FJLUFS SUEgcm9sZXMgaXMgYXZhaWxhYmxlIGF0OgogICAgW2h0dHA6Ly93d3cudzMu b3JnL1RSL3dhaS1hcmlhL3JvbGVzI3JvbGVzX2NhdGVnb3JpemF0aW9uXSho dHRwOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS9yb2xlcyNyb2xlc19jYXRl Z29yaXphdGlvbikKCiAgICBAcHJvcGVydHkgYXJpYVJvbGUKICAgIEB0eXBl IFN0cmluZwogICAgQGRlZmF1bHQgbnVsbAogICovCiAgYXJpYVJvbGU6IG51 bGwsCgogIC8qKgogICAgU3RhbmRhcmQgQ1NTIGNsYXNzIG5hbWVzIHRvIGFw cGx5IHRvIHRoZSB2aWV3J3Mgb3V0ZXIgZWxlbWVudC4gVGhpcwogICAgcHJv cGVydHkgYXV0b21hdGljYWxseSBpbmhlcml0cyBhbnkgY2xhc3MgbmFtZXMg ZGVmaW5lZCBieSB0aGUgdmlldydzCiAgICBzdXBlcmNsYXNzZXMgYXMgd2Vs bC4KCiAgICBAcHJvcGVydHkgY2xhc3NOYW1lcwogICAgQHR5cGUgQXJyYXkK ICAgIEBkZWZhdWx0IFsnZW1iZXItdmlldyddCiAgKi8KICBjbGFzc05hbWVz OiBbJ2VtYmVyLXZpZXcnXSwKCiAgLyoqCiAgICBBIGxpc3Qgb2YgcHJvcGVy dGllcyBvZiB0aGUgdmlldyB0byBhcHBseSBhcyBjbGFzcyBuYW1lcy4gSWYg dGhlIHByb3BlcnR5CiAgICBpcyBhIHN0cmluZyB2YWx1ZSwgdGhlIHZhbHVl IG9mIHRoYXQgc3RyaW5nIHdpbGwgYmUgYXBwbGllZCBhcyBhIGNsYXNzCiAg ICBuYW1lLgoKICAgIGBgYGphdmFzY3JpcHQKICAgIC8vIEFwcGxpZXMgdGhl ICdoaWdoJyBjbGFzcyB0byB0aGUgdmlldyBlbGVtZW50CiAgICBFbWJlci5W aWV3LmV4dGVuZCh7CiAgICAgIGNsYXNzTmFtZUJpbmRpbmdzOiBbJ3ByaW9y aXR5J10KICAgICAgcHJpb3JpdHk6ICdoaWdoJwogICAgfSk7CiAgICBgYGAK CiAgICBJZiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGlzIGEgQm9vbGVh biwgdGhlIG5hbWUgb2YgdGhhdCBwcm9wZXJ0eSBpcwogICAgYWRkZWQgYXMg YSBkYXNoZXJpemVkIGNsYXNzIG5hbWUuCgogICAgYGBgamF2YXNjcmlwdAog ICAgLy8gQXBwbGllcyB0aGUgJ2lzLXVyZ2VudCcgY2xhc3MgdG8gdGhlIHZp ZXcgZWxlbWVudAogICAgRW1iZXIuVmlldy5leHRlbmQoewogICAgICBjbGFz c05hbWVCaW5kaW5nczogWydpc1VyZ2VudCddCiAgICAgIGlzVXJnZW50OiB0 cnVlCiAgICB9KTsKICAgIGBgYAoKICAgIElmIHlvdSB3b3VsZCBwcmVmZXIg dG8gdXNlIGEgY3VzdG9tIHZhbHVlIGluc3RlYWQgb2YgdGhlIGRhc2hlcml6 ZWQKICAgIHByb3BlcnR5IG5hbWUsIHlvdSBjYW4gcGFzcyBhIGJpbmRpbmcg bGlrZSB0aGlzOgoKICAgIGBgYGphdmFzY3JpcHQKICAgIC8vIEFwcGxpZXMg dGhlICd1cmdlbnQnIGNsYXNzIHRvIHRoZSB2aWV3IGVsZW1lbnQKICAgIEVt YmVyLlZpZXcuZXh0ZW5kKHsKICAgICAgY2xhc3NOYW1lQmluZGluZ3M6IFsn aXNVcmdlbnQ6dXJnZW50J10KICAgICAgaXNVcmdlbnQ6IHRydWUKICAgIH0p OwogICAgYGBgCgogICAgVGhpcyBsaXN0IG9mIHByb3BlcnRpZXMgaXMgaW5o ZXJpdGVkIGZyb20gdGhlIHZpZXcncyBzdXBlcmNsYXNzZXMgYXMgd2VsbC4K CiAgICBAcHJvcGVydHkgY2xhc3NOYW1lQmluZGluZ3MKICAgIEB0eXBlIEFy cmF5CiAgICBAZGVmYXVsdCBbXQogICovCiAgY2xhc3NOYW1lQmluZGluZ3M6 IEVNUFRZX0FSUkFZLAoKICAvKioKICAgIEEgbGlzdCBvZiBwcm9wZXJ0aWVz IG9mIHRoZSB2aWV3IHRvIGFwcGx5IGFzIGF0dHJpYnV0ZXMuIElmIHRoZSBw cm9wZXJ0eSBpcwogICAgYSBzdHJpbmcgdmFsdWUsIHRoZSB2YWx1ZSBvZiB0 aGF0IHN0cmluZyB3aWxsIGJlIGFwcGxpZWQgYXMgdGhlIGF0dHJpYnV0ZS4K CiAgICBgYGBqYXZhc2NyaXB0CiAgICAvLyBBcHBsaWVzIHRoZSB0eXBlIGF0 dHJpYnV0ZSB0byB0aGUgZWxlbWVudAogICAgLy8gd2l0aCB0aGUgdmFsdWUg ImJ1dHRvbiIsIGxpa2UgPGRpdiB0eXBlPSJidXR0b24iPgogICAgRW1iZXIu Vmlldy5leHRlbmQoewogICAgICBhdHRyaWJ1dGVCaW5kaW5nczogWyd0eXBl J10sCiAgICAgIHR5cGU6ICdidXR0b24nCiAgICB9KTsKICAgIGBgYAoKICAg IElmIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgaXMgYSBCb29sZWFuLCB0 aGUgbmFtZSBvZiB0aGF0IHByb3BlcnR5IGlzCiAgICBhZGRlZCBhcyBhbiBh dHRyaWJ1dGUuCgogICAgYGBgamF2YXNjcmlwdAogICAgLy8gUmVuZGVycyBz b21ldGhpbmcgbGlrZSA8ZGl2IGVuYWJsZWQ9ImVuYWJsZWQiPgogICAgRW1i ZXIuVmlldy5leHRlbmQoewogICAgICBhdHRyaWJ1dGVCaW5kaW5nczogWydl bmFibGVkJ10sCiAgICAgIGVuYWJsZWQ6IHRydWUKICAgIH0pOwogICAgYGBg CgogICAgQHByb3BlcnR5IGF0dHJpYnV0ZUJpbmRpbmdzCiAgKi8KICBhdHRy aWJ1dGVCaW5kaW5nczogRU1QVFlfQVJSQVksCgogIC8vIC4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4K ICAvLyBDT1JFIERJU1BMQVkgTUVUSE9EUwogIC8vCgogIC8qKgogICAgU2V0 dXAgYSB2aWV3LCBidXQgZG8gbm90IGZpbmlzaCB3YWtpbmcgaXQgdXAuCgog ICAgKiBjb25maWd1cmUgYGNoaWxkVmlld3NgCiAgICAqIHJlZ2lzdGVyIHRo ZSB2aWV3IHdpdGggdGhlIGdsb2JhbCB2aWV3cyBoYXNoLCB3aGljaCBpcyB1 c2VkIGZvciBldmVudAogICAgICBkaXNwYXRjaAoKICAgIEBtZXRob2QgaW5p dAogICAgQHByaXZhdGUKICAqLwogIGluaXQ6IGZ1bmN0aW9uKCkgewogICAg dGhpcy5lbGVtZW50SWQgPSB0aGlzLmVsZW1lbnRJZCB8fCBndWlkRm9yKHRo aXMpOwoKICAgIHRoaXMuX3N1cGVyKCk7CgogICAgLy8gc2V0dXAgY2hpbGQg dmlld3MuIGJlIHN1cmUgdG8gY2xvbmUgdGhlIGNoaWxkIHZpZXdzIGFycmF5 IGZpcnN0CiAgICB0aGlzLl9jaGlsZFZpZXdzID0gdGhpcy5fY2hpbGRWaWV3 cy5zbGljZSgpOwoKICAgIEVtYmVyLmFzc2VydCgiT25seSBhcnJheXMgYXJl IGFsbG93ZWQgZm9yICdjbGFzc05hbWVCaW5kaW5ncyciLCBFbWJlci50eXBl T2YodGhpcy5jbGFzc05hbWVCaW5kaW5ncykgPT09ICdhcnJheScpOwogICAg dGhpcy5jbGFzc05hbWVCaW5kaW5ncyA9IEVtYmVyLkEodGhpcy5jbGFzc05h bWVCaW5kaW5ncy5zbGljZSgpKTsKCiAgICBFbWJlci5hc3NlcnQoIk9ubHkg YXJyYXlzIGFyZSBhbGxvd2VkIGZvciAnY2xhc3NOYW1lcyciLCBFbWJlci50 eXBlT2YodGhpcy5jbGFzc05hbWVzKSA9PT0gJ2FycmF5Jyk7CiAgICB0aGlz LmNsYXNzTmFtZXMgPSBFbWJlci5BKHRoaXMuY2xhc3NOYW1lcy5zbGljZSgp KTsKICB9LAoKICBhcHBlbmRDaGlsZDogZnVuY3Rpb24odmlldywgb3B0aW9u cykgewogICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlLmFwcGVuZENoaWxk KHRoaXMsIHZpZXcsIG9wdGlvbnMpOwogIH0sCgogIC8qKgogICAgUmVtb3Zl cyB0aGUgY2hpbGQgdmlldyBmcm9tIHRoZSBwYXJlbnQgdmlldy4KCiAgICBA bWV0aG9kIHJlbW92ZUNoaWxkCiAgICBAcGFyYW0ge0VtYmVyLlZpZXd9IHZp ZXcKICAgIEByZXR1cm4ge0VtYmVyLlZpZXd9IHJlY2VpdmVyCiAgKi8KICBy ZW1vdmVDaGlsZDogZnVuY3Rpb24odmlldykgewogICAgLy8gSWYgd2UncmUg ZGVzdHJveWluZywgdGhlIGVudGlyZSBzdWJ0cmVlIHdpbGwgYmUKICAgIC8v IGZyZWVkLCBhbmQgdGhlIERPTSB3aWxsIGJlIGhhbmRsZWQgc2VwYXJhdGVs eSwKICAgIC8vIHNvIG5vIG5lZWQgdG8gbWVzcyB3aXRoIGNoaWxkVmlld3Mu CiAgICBpZiAodGhpcy5pc0Rlc3Ryb3lpbmcpIHsgcmV0dXJuOyB9CgogICAg Ly8gdXBkYXRlIHBhcmVudCBub2RlCiAgICBzZXQodmlldywgJ19wYXJlbnRW aWV3JywgbnVsbCk7CgogICAgLy8gcmVtb3ZlIHZpZXcgZnJvbSBjaGlsZFZp ZXdzIGFycmF5LgogICAgdmFyIGNoaWxkVmlld3MgPSB0aGlzLl9jaGlsZFZp ZXdzOwoKICAgIEVtYmVyLkVudW1lcmFibGVVdGlscy5yZW1vdmVPYmplY3Qo Y2hpbGRWaWV3cywgdmlldyk7CgogICAgdGhpcy5wcm9wZXJ0eURpZENoYW5n ZSgnY2hpbGRWaWV3cycpOyAvLyBIVUg/ISB3aGF0IGhhcHBlbmVkIHRvIHdp bGwgY2hhbmdlPwoKICAgIHJldHVybiB0aGlzOwogIH0sCgogIC8qKgogICAg UmVtb3ZlcyBhbGwgY2hpbGRyZW4gZnJvbSB0aGUgYHBhcmVudFZpZXdgLgoK ICAgIEBtZXRob2QgcmVtb3ZlQWxsQ2hpbGRyZW4KICAgIEByZXR1cm4ge0Vt YmVyLlZpZXd9IHJlY2VpdmVyCiAgKi8KICByZW1vdmVBbGxDaGlsZHJlbjog ZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5tdXRhdGVDaGlsZFZpZXdz KGZ1bmN0aW9uKHBhcmVudFZpZXcsIHZpZXcpIHsKICAgICAgcGFyZW50Vmll dy5yZW1vdmVDaGlsZCh2aWV3KTsKICAgIH0pOwogIH0sCgogIGRlc3Ryb3lB bGxDaGlsZHJlbjogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5tdXRh dGVDaGlsZFZpZXdzKGZ1bmN0aW9uKHBhcmVudFZpZXcsIHZpZXcpIHsKICAg ICAgdmlldy5kZXN0cm95KCk7CiAgICB9KTsKICB9LAoKICAvKioKICAgIFJl bW92ZXMgdGhlIHZpZXcgZnJvbSBpdHMgYHBhcmVudFZpZXdgLCBpZiBvbmUg aXMgZm91bmQuIE90aGVyd2lzZQogICAgZG9lcyBub3RoaW5nLgoKICAgIEBt ZXRob2QgcmVtb3ZlRnJvbVBhcmVudAogICAgQHJldHVybiB7RW1iZXIuVmll d30gcmVjZWl2ZXIKICAqLwogIHJlbW92ZUZyb21QYXJlbnQ6IGZ1bmN0aW9u KCkgewogICAgdmFyIHBhcmVudCA9IHRoaXMuX3BhcmVudFZpZXc7CgogICAg Ly8gUmVtb3ZlIERPTSBlbGVtZW50IGZyb20gcGFyZW50CiAgICB0aGlzLnJl bW92ZSgpOwoKICAgIGlmIChwYXJlbnQpIHsgcGFyZW50LnJlbW92ZUNoaWxk KHRoaXMpOyB9CiAgICByZXR1cm4gdGhpczsKICB9LAoKICAvKioKICAgIFlv dSBtdXN0IGNhbGwgYGRlc3Ryb3lgIG9uIGEgdmlldyB0byBkZXN0cm95IHRo ZSB2aWV3IChhbmQgYWxsIG9mIGl0cwogICAgY2hpbGQgdmlld3MpLiBUaGlz IHdpbGwgcmVtb3ZlIHRoZSB2aWV3IGZyb20gYW55IHBhcmVudCBub2RlLCB0 aGVuIG1ha2UKICAgIHN1cmUgdGhhdCB0aGUgRE9NIGVsZW1lbnQgbWFuYWdl ZCBieSB0aGUgdmlldyBjYW4gYmUgcmVsZWFzZWQgYnkgdGhlCiAgICBtZW1v cnkgbWFuYWdlci4KCiAgICBAbWV0aG9kIGRlc3Ryb3kKICAqLwogIGRlc3Ry b3k6IGZ1bmN0aW9uKCkgewogICAgdmFyIGNoaWxkVmlld3MgPSB0aGlzLl9j aGlsZFZpZXdzLAogICAgICAgIC8vIGdldCBwYXJlbnRWaWV3IGJlZm9yZSBj YWxsaW5nIHN1cGVyIGJlY2F1c2UgaXQnbGwgYmUgZGVzdHJveWVkCiAgICAg ICAgbm9uVmlydHVhbFBhcmVudFZpZXcgPSBnZXQodGhpcywgJ3BhcmVudFZp ZXcnKSwKICAgICAgICB2aWV3TmFtZSA9IHRoaXMudmlld05hbWUsCiAgICAg ICAgY2hpbGRMZW4sIGk7CgogICAgaWYgKCF0aGlzLl9zdXBlcigpKSB7IHJl dHVybjsgfQoKICAgIGNoaWxkTGVuID0gY2hpbGRWaWV3cy5sZW5ndGg7CiAg ICBmb3IgKGk9Y2hpbGRMZW4tMTsgaT49MDsgaS0tKSB7CiAgICAgIGNoaWxk Vmlld3NbaV0ucmVtb3ZlZEZyb21ET00gPSB0cnVlOwogICAgfQoKICAgIC8v IHJlbW92ZSBmcm9tIG5vbi12aXJ0dWFsIHBhcmVudCB2aWV3IGlmIHZpZXdO YW1lIHdhcyBzcGVjaWZpZWQKICAgIGlmICh2aWV3TmFtZSAmJiBub25WaXJ0 dWFsUGFyZW50VmlldykgewogICAgICBub25WaXJ0dWFsUGFyZW50Vmlldy5z ZXQodmlld05hbWUsIG51bGwpOwogICAgfQoKICAgIGNoaWxkTGVuID0gY2hp bGRWaWV3cy5sZW5ndGg7CiAgICBmb3IgKGk9Y2hpbGRMZW4tMTsgaT49MDsg aS0tKSB7CiAgICAgIGNoaWxkVmlld3NbaV0uZGVzdHJveSgpOwogICAgfQoK ICAgIHJldHVybiB0aGlzOwogIH0sCgogIC8qKgogICAgSW5zdGFudGlhdGVz IGEgdmlldyB0byBiZSBhZGRlZCB0byB0aGUgY2hpbGRWaWV3cyBhcnJheSBk dXJpbmcgdmlldwogICAgaW5pdGlhbGl6YXRpb24uIFlvdSBnZW5lcmFsbHkg d2lsbCBub3QgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseSB1bmxlc3MKICAg IHlvdSBhcmUgb3ZlcnJpZGluZyBgY3JlYXRlQ2hpbGRWaWV3cygpYC4gTm90 ZSB0aGF0IHRoaXMgbWV0aG9kIHdpbGwKICAgIGF1dG9tYXRpY2FsbHkgY29u ZmlndXJlIHRoZSBjb3JyZWN0IHNldHRpbmdzIG9uIHRoZSBuZXcgdmlldyBp bnN0YW5jZSB0bwogICAgYWN0IGFzIGEgY2hpbGQgb2YgdGhlIHBhcmVudC4K CiAgICBAbWV0aG9kIGNyZWF0ZUNoaWxkVmlldwogICAgQHBhcmFtIHtDbGFz c3xTdHJpbmd9IHZpZXdDbGFzcwogICAgQHBhcmFtIHtIYXNofSBbYXR0cnNd IEF0dHJpYnV0ZXMgdG8gYWRkCiAgICBAcmV0dXJuIHtFbWJlci5WaWV3fSBu ZXcgaW5zdGFuY2UKICAqLwogIGNyZWF0ZUNoaWxkVmlldzogZnVuY3Rpb24o dmlldywgYXR0cnMpIHsKICAgIGlmICghdmlldykgewogICAgICB0aHJvdyBu ZXcgVHlwZUVycm9yKCJjcmVhdGVDaGlsZFZpZXdzIGZpcnN0IGFyZ3VtZW50 IG11c3QgZXhpc3QiKTsKICAgIH0KCiAgICBpZiAodmlldy5pc1ZpZXcgJiYg dmlldy5fcGFyZW50VmlldyA9PT0gdGhpcyAmJiB2aWV3LmNvbnRhaW5lciA9 PT0gdGhpcy5jb250YWluZXIpIHsKICAgICAgcmV0dXJuIHZpZXc7CiAgICB9 CgogICAgYXR0cnMgPSBhdHRycyB8fCB7fTsKICAgIGF0dHJzLl9wYXJlbnRW aWV3ID0gdGhpczsKCiAgICBpZiAoRW1iZXIuQ29yZVZpZXcuZGV0ZWN0KHZp ZXcpKSB7CiAgICAgIGF0dHJzLnRlbXBsYXRlRGF0YSA9IGF0dHJzLnRlbXBs YXRlRGF0YSB8fCBnZXQodGhpcywgJ3RlbXBsYXRlRGF0YScpOwoKICAgICAg YXR0cnMuY29udGFpbmVyID0gdGhpcy5jb250YWluZXI7CiAgICAgIHZpZXcg PSB2aWV3LmNyZWF0ZShhdHRycyk7CgogICAgICAvLyBkb24ndCBzZXQgdGhl IHByb3BlcnR5IG9uIGEgdmlydHVhbCB2aWV3LCBhcyB0aGV5IGFyZSBpbnZp c2libGUgdG8KICAgICAgLy8gY29uc3VtZXJzIG9mIHRoZSB2aWV3IEFQSQog ICAgICBpZiAodmlldy52aWV3TmFtZSkgewogICAgICAgIHNldChnZXQodGhp cywgJ2NvbmNyZXRlVmlldycpLCB2aWV3LnZpZXdOYW1lLCB2aWV3KTsKICAg ICAgfQogICAgfSBlbHNlIGlmICgnc3RyaW5nJyA9PT0gdHlwZW9mIHZpZXcp IHsKICAgICAgdmFyIGZ1bGxOYW1lID0gJ3ZpZXc6JyArIHZpZXc7CiAgICAg IHZhciBWaWV3ID0gdGhpcy5jb250YWluZXIubG9va3VwRmFjdG9yeShmdWxs TmFtZSk7CgogICAgICBFbWJlci5hc3NlcnQoIkNvdWxkIG5vdCBmaW5kIHZp ZXc6ICciICsgZnVsbE5hbWUgKyAiJyIsICEhVmlldyk7CgogICAgICBhdHRy cy50ZW1wbGF0ZURhdGEgPSBnZXQodGhpcywgJ3RlbXBsYXRlRGF0YScpOwog ICAgICB2aWV3ID0gVmlldy5jcmVhdGUoYXR0cnMpOwogICAgfSBlbHNlIHsK ICAgICAgRW1iZXIuYXNzZXJ0KCdZb3UgbXVzdCBwYXNzIGluc3RhbmNlIG9y IHN1YmNsYXNzIG9mIFZpZXcnLCB2aWV3LmlzVmlldyk7CiAgICAgIGF0dHJz LmNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyOwoKICAgICAgaWYgKCFnZXQo dmlldywgJ3RlbXBsYXRlRGF0YScpKSB7CiAgICAgICAgYXR0cnMudGVtcGxh dGVEYXRhID0gZ2V0KHRoaXMsICd0ZW1wbGF0ZURhdGEnKTsKICAgICAgfQoK ICAgICAgRW1iZXIuc2V0UHJvcGVydGllcyh2aWV3LCBhdHRycyk7CgogICAg fQoKICAgIHJldHVybiB2aWV3OwogIH0sCgogIGJlY2FtZVZpc2libGU6IEVt YmVyLkssCiAgYmVjYW1lSGlkZGVuOiBFbWJlci5LLAoKICAvKioKICAgIFdo ZW4gdGhlIHZpZXcncyBgaXNWaXNpYmxlYCBwcm9wZXJ0eSBjaGFuZ2VzLCB0 b2dnbGUgdGhlIHZpc2liaWxpdHkKICAgIGVsZW1lbnQgb2YgdGhlIGFjdHVh bCBET00gZWxlbWVudC4KCiAgICBAbWV0aG9kIF9pc1Zpc2libGVEaWRDaGFu Z2UKICAgIEBwcml2YXRlCiAgKi8KICBfaXNWaXNpYmxlRGlkQ2hhbmdlOiBF bWJlci5vYnNlcnZlcignaXNWaXNpYmxlJywgZnVuY3Rpb24oKSB7CiAgICBp ZiAodGhpcy5faXNWaXNpYmxlID09PSBnZXQodGhpcywgJ2lzVmlzaWJsZScp KSB7IHJldHVybiA7IH0KICAgIEVtYmVyLnJ1bi5zY2hlZHVsZU9uY2UoJ3Jl bmRlcicsIHRoaXMsIHRoaXMuX3RvZ2dsZVZpc2liaWxpdHkpOwogIH0pLAoK ICBfdG9nZ2xlVmlzaWJpbGl0eTogZnVuY3Rpb24oKSB7CiAgICB2YXIgJGVs ID0gdGhpcy4kKCk7CiAgICBpZiAoISRlbCkgeyByZXR1cm47IH0KCiAgICB2 YXIgaXNWaXNpYmxlID0gZ2V0KHRoaXMsICdpc1Zpc2libGUnKTsKCiAgICBp ZiAodGhpcy5faXNWaXNpYmxlID09PSBpc1Zpc2libGUpIHsgcmV0dXJuIDsg fQoKICAgICRlbC50b2dnbGUoaXNWaXNpYmxlKTsKCiAgICB0aGlzLl9pc1Zp c2libGUgPSBpc1Zpc2libGU7CgogICAgaWYgKHRoaXMuX2lzQW5jZXN0b3JI aWRkZW4oKSkgeyByZXR1cm47IH0KCiAgICBpZiAoaXNWaXNpYmxlKSB7CiAg ICAgIHRoaXMuX25vdGlmeUJlY2FtZVZpc2libGUoKTsKICAgIH0gZWxzZSB7 CiAgICAgIHRoaXMuX25vdGlmeUJlY2FtZUhpZGRlbigpOwogICAgfQogIH0s CgogIF9ub3RpZnlCZWNhbWVWaXNpYmxlOiBmdW5jdGlvbigpIHsKICAgIHRo aXMudHJpZ2dlcignYmVjYW1lVmlzaWJsZScpOwoKICAgIHRoaXMuZm9yRWFj aENoaWxkVmlldyhmdW5jdGlvbih2aWV3KSB7CiAgICAgIHZhciBpc1Zpc2li bGUgPSBnZXQodmlldywgJ2lzVmlzaWJsZScpOwoKICAgICAgaWYgKGlzVmlz aWJsZSB8fCBpc1Zpc2libGUgPT09IG51bGwpIHsKICAgICAgICB2aWV3Ll9u b3RpZnlCZWNhbWVWaXNpYmxlKCk7CiAgICAgIH0KICAgIH0pOwogIH0sCgog IF9ub3RpZnlCZWNhbWVIaWRkZW46IGZ1bmN0aW9uKCkgewogICAgdGhpcy50 cmlnZ2VyKCdiZWNhbWVIaWRkZW4nKTsKICAgIHRoaXMuZm9yRWFjaENoaWxk VmlldyhmdW5jdGlvbih2aWV3KSB7CiAgICAgIHZhciBpc1Zpc2libGUgPSBn ZXQodmlldywgJ2lzVmlzaWJsZScpOwoKICAgICAgaWYgKGlzVmlzaWJsZSB8 fCBpc1Zpc2libGUgPT09IG51bGwpIHsKICAgICAgICB2aWV3Ll9ub3RpZnlC ZWNhbWVIaWRkZW4oKTsKICAgICAgfQogICAgfSk7CiAgfSwKCiAgX2lzQW5j ZXN0b3JIaWRkZW46IGZ1bmN0aW9uKCkgewogICAgdmFyIHBhcmVudCA9IGdl dCh0aGlzLCAncGFyZW50VmlldycpOwoKICAgIHdoaWxlIChwYXJlbnQpIHsK ICAgICAgaWYgKGdldChwYXJlbnQsICdpc1Zpc2libGUnKSA9PT0gZmFsc2Up IHsgcmV0dXJuIHRydWU7IH0KCiAgICAgIHBhcmVudCA9IGdldChwYXJlbnQs ICdwYXJlbnRWaWV3Jyk7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0s CgogIGNsZWFyQnVmZmVyOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuaW52b2tl UmVjdXJzaXZlbHkobnVsbFZpZXdzQnVmZmVyKTsKICB9LAoKICB0cmFuc2l0 aW9uVG86IGZ1bmN0aW9uKHN0YXRlLCBjaGlsZHJlbikgewogICAgdmFyIHBy aW9yU3RhdGUgPSB0aGlzLmN1cnJlbnRTdGF0ZSwKICAgICAgICBjdXJyZW50 U3RhdGUgPSB0aGlzLmN1cnJlbnRTdGF0ZSA9IHRoaXMuc3RhdGVzW3N0YXRl XTsKICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKCiAgICBpZiAocHJpb3JTdGF0 ZSAmJiBwcmlvclN0YXRlLmV4aXQpIHsgcHJpb3JTdGF0ZS5leGl0KHRoaXMp OyB9CiAgICBpZiAoY3VycmVudFN0YXRlLmVudGVyKSB7IGN1cnJlbnRTdGF0 ZS5lbnRlcih0aGlzKTsgfQogICAgaWYgKHN0YXRlID09PSAnaW5ET00nKSB7 IGRlbGV0ZSBFbWJlci5tZXRhKHRoaXMpLmNhY2hlLmVsZW1lbnQ7IH0KCiAg ICBpZiAoY2hpbGRyZW4gIT09IGZhbHNlKSB7CiAgICAgIHRoaXMuZm9yRWFj aENoaWxkVmlldyhmdW5jdGlvbih2aWV3KSB7CiAgICAgICAgdmlldy50cmFu c2l0aW9uVG8oc3RhdGUpOwogICAgICB9KTsKICAgIH0KICB9LAoKICAvLyAu Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uCiAgLy8gRVZFTlQgSEFORExJTkcKICAvLwoKICAvKioKICAg IEhhbmRsZSBldmVudHMgZnJvbSBgRW1iZXIuRXZlbnREaXNwYXRjaGVyYAoK ICAgIEBtZXRob2QgaGFuZGxlRXZlbnQKICAgIEBwYXJhbSBldmVudE5hbWUg e1N0cmluZ30KICAgIEBwYXJhbSBldnQge0V2ZW50fQogICAgQHByaXZhdGUK ICAqLwogIGhhbmRsZUV2ZW50OiBmdW5jdGlvbihldmVudE5hbWUsIGV2dCkg ewogICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlLmhhbmRsZUV2ZW50KHRo aXMsIGV2ZW50TmFtZSwgZXZ0KTsKICB9LAoKICByZWdpc3Rlck9ic2VydmVy OiBmdW5jdGlvbihyb290LCBwYXRoLCB0YXJnZXQsIG9ic2VydmVyKSB7CiAg ICBpZiAoIW9ic2VydmVyICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiB0YXJn ZXQpIHsKICAgICAgb2JzZXJ2ZXIgPSB0YXJnZXQ7CiAgICAgIHRhcmdldCA9 IG51bGw7CiAgICB9CgogICAgaWYgKCFyb290IHx8IHR5cGVvZiByb290ICE9 PSAnb2JqZWN0JykgewogICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIHZp ZXcgPSB0aGlzLAogICAgICAgIHN0YXRlQ2hlY2tlZE9ic2VydmVyID0gZnVu Y3Rpb24oKSB7CiAgICAgICAgICB2aWV3LmN1cnJlbnRTdGF0ZS5pbnZva2VP YnNlcnZlcih0aGlzLCBvYnNlcnZlcik7CiAgICAgICAgfSwKICAgICAgICBz Y2hlZHVsZWRPYnNlcnZlciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgRW1i ZXIucnVuLnNjaGVkdWxlT25jZSgncmVuZGVyJywgdGhpcywgc3RhdGVDaGVj a2VkT2JzZXJ2ZXIpOwogICAgICAgIH07CgogICAgRW1iZXIuYWRkT2JzZXJ2 ZXIocm9vdCwgcGF0aCwgdGFyZ2V0LCBzY2hlZHVsZWRPYnNlcnZlcik7Cgog ICAgdGhpcy5vbmUoJ3dpbGxDbGVhclJlbmRlcicsIGZ1bmN0aW9uKCkgewog ICAgICBFbWJlci5yZW1vdmVPYnNlcnZlcihyb290LCBwYXRoLCB0YXJnZXQs IHNjaGVkdWxlZE9ic2VydmVyKTsKICAgIH0pOwogIH0KCn0pOwoKLyoKICBE ZXNjcmliZSBob3cgdGhlIHNwZWNpZmllZCBhY3Rpb25zIHNob3VsZCBiZWhh dmUgaW4gdGhlIHZhcmlvdXMKICBzdGF0ZXMgdGhhdCBhIHZpZXcgY2FuIGV4 aXN0IGluLiBQb3NzaWJsZSBzdGF0ZXM6CgogICogcHJlUmVuZGVyOiB3aGVu IGEgdmlldyBpcyBmaXJzdCBpbnN0YW50aWF0ZWQsIGFuZCBhZnRlciBpdHMK ICAgIGVsZW1lbnQgd2FzIGRlc3Ryb3llZCwgaXQgaXMgaW4gdGhlIHByZVJl bmRlciBzdGF0ZQogICogaW5CdWZmZXI6IG9uY2UgYSB2aWV3IGhhcyBiZWVu IHJlbmRlcmVkLCBidXQgYmVmb3JlIGl0IGhhcwogICAgYmVlbiBpbnNlcnRl ZCBpbnRvIHRoZSBET00sIGl0IGlzIGluIHRoZSBpbkJ1ZmZlciBzdGF0ZQog ICogaGFzRWxlbWVudDogdGhlIERPTSByZXByZXNlbnRhdGlvbiBvZiB0aGUg dmlldyBpcyBjcmVhdGVkLAogICAgYW5kIGlzIHJlYWR5IHRvIGJlIGluc2Vy dGVkCiAgKiBpbkRPTTogb25jZSBhIHZpZXcgaGFzIGJlZW4gaW5zZXJ0ZWQg aW50byB0aGUgRE9NIGl0IGlzIGluCiAgICB0aGUgaW5ET00gc3RhdGUuIEEg dmlldyBzcGVuZHMgdGhlIHZhc3QgbWFqb3JpdHkgb2YgaXRzCiAgICBleGlz dGVuY2UgaW4gdGhpcyBzdGF0ZS4KICAqIGRlc3Ryb3llZDogb25jZSBhIHZp ZXcgaGFzIGJlZW4gZGVzdHJveWVkICh1c2luZyB0aGUgZGVzdHJveQogICAg bWV0aG9kKSwgaXQgaXMgaW4gdGhpcyBzdGF0ZS4gTm8gZnVydGhlciBhY3Rp b25zIGNhbiBiZSBpbnZva2VkCiAgICBvbiBhIGRlc3Ryb3llZCB2aWV3Lgoq LwoKICAvLyBpbiB0aGUgZGVzdHJveWVkIHN0YXRlLCBldmVyeXRoaW5nIGlz IGlsbGVnYWwKCiAgLy8gYmVmb3JlIHJlbmRlcmluZyBoYXMgYmVndW4sIGFs bCBsZWdhbCBtYW5pcHVsYXRpb25zIGFyZSBub29wcy4KCiAgLy8gaW5zaWRl IHRoZSBidWZmZXIsIGxlZ2FsIG1hbmlwdWxhdGlvbnMgYXJlIGRvbmUgb24g dGhlIGJ1ZmZlcgoKICAvLyBvbmNlIHRoZSB2aWV3IGhhcyBiZWVuIGluc2Vy dGVkIGludG8gdGhlIERPTSwgbGVnYWwgbWFuaXB1bGF0aW9ucwogIC8vIGFy ZSBkb25lIG9uIHRoZSBET00gZWxlbWVudC4KCmZ1bmN0aW9uIG5vdGlmeU11 dGF0aW9uTGlzdGVuZXJzKCkgewogIEVtYmVyLnJ1bi5vbmNlKEVtYmVyLlZp ZXcsICdub3RpZnlNdXRhdGlvbkxpc3RlbmVycycpOwp9Cgp2YXIgRE9NTWFu YWdlciA9IHsKICBwcmVwZW5kOiBmdW5jdGlvbih2aWV3LCBodG1sKSB7CiAg ICB2aWV3LiQoKS5wcmVwZW5kKGh0bWwpOwogICAgbm90aWZ5TXV0YXRpb25M aXN0ZW5lcnMoKTsKICB9LAoKICBhZnRlcjogZnVuY3Rpb24odmlldywgaHRt bCkgewogICAgdmlldy4kKCkuYWZ0ZXIoaHRtbCk7CiAgICBub3RpZnlNdXRh dGlvbkxpc3RlbmVycygpOwogIH0sCgogIGh0bWw6IGZ1bmN0aW9uKHZpZXcs IGh0bWwpIHsKICAgIHZpZXcuJCgpLmh0bWwoaHRtbCk7CiAgICBub3RpZnlN dXRhdGlvbkxpc3RlbmVycygpOwogIH0sCgogIHJlcGxhY2U6IGZ1bmN0aW9u KHZpZXcpIHsKICAgIHZhciBlbGVtZW50ID0gZ2V0KHZpZXcsICdlbGVtZW50 Jyk7CgogICAgc2V0KHZpZXcsICdlbGVtZW50JywgbnVsbCk7CgogICAgdmll dy5faW5zZXJ0RWxlbWVudExhdGVyKGZ1bmN0aW9uKCkgewogICAgICBFbWJl ci4kKGVsZW1lbnQpLnJlcGxhY2VXaXRoKGdldCh2aWV3LCAnZWxlbWVudCcp KTsKICAgICAgbm90aWZ5TXV0YXRpb25MaXN0ZW5lcnMoKTsKICAgIH0pOwog IH0sCgogIHJlbW92ZTogZnVuY3Rpb24odmlldykgewogICAgdmlldy4kKCku cmVtb3ZlKCk7CiAgICBub3RpZnlNdXRhdGlvbkxpc3RlbmVycygpOwogIH0s CgogIGVtcHR5OiBmdW5jdGlvbih2aWV3KSB7CiAgICB2aWV3LiQoKS5lbXB0 eSgpOwogICAgbm90aWZ5TXV0YXRpb25MaXN0ZW5lcnMoKTsKICB9Cn07CgpF bWJlci5WaWV3LnJlb3Blbih7CiAgZG9tTWFuYWdlcjogRE9NTWFuYWdlcgp9 KTsKCkVtYmVyLlZpZXcucmVvcGVuQ2xhc3MoewoKICAvKioKICAgIFBhcnNl IGEgcGF0aCBhbmQgcmV0dXJuIGFuIG9iamVjdCB3aGljaCBob2xkcyB0aGUg cGFyc2VkIHByb3BlcnRpZXMuCgogICAgRm9yIGV4YW1wbGUgYSBwYXRoIGxp a2UgImNvbnRlbnQuaXNFbmFibGVkOmVuYWJsZWQ6ZGlzYWJsZWQiIHdpbGwg cmV0dXJuIHRoZQogICAgZm9sbG93aW5nIG9iamVjdDoKCiAgICBgYGBqYXZh c2NyaXB0CiAgICB7CiAgICAgIHBhdGg6ICJjb250ZW50LmlzRW5hYmxlZCIs CiAgICAgIGNsYXNzTmFtZTogImVuYWJsZWQiLAogICAgICBmYWxzeUNsYXNz TmFtZTogImRpc2FibGVkIiwKICAgICAgY2xhc3NOYW1lczogIjplbmFibGVk OmRpc2FibGVkIgogICAgfQogICAgYGBgCgogICAgQG1ldGhvZCBfcGFyc2VQ cm9wZXJ0eVBhdGgKICAgIEBzdGF0aWMKICAgIEBwcml2YXRlCiAgKi8KICBf cGFyc2VQcm9wZXJ0eVBhdGg6IGZ1bmN0aW9uKHBhdGgpIHsKICAgIHZhciBz cGxpdCA9IHBhdGguc3BsaXQoJzonKSwKICAgICAgICBwcm9wZXJ0eVBhdGgg PSBzcGxpdFswXSwKICAgICAgICBjbGFzc05hbWVzID0gIiIsCiAgICAgICAg Y2xhc3NOYW1lLAogICAgICAgIGZhbHN5Q2xhc3NOYW1lOwoKICAgIC8vIGNo ZWNrIGlmIHRoZSBwcm9wZXJ0eSBpcyBkZWZpbmVkIGFzIHByb3A6Y2xhc3Mg b3IgcHJvcDp0cnVlQ2xhc3M6ZmFsc2VDbGFzcwogICAgaWYgKHNwbGl0Lmxl bmd0aCA+IDEpIHsKICAgICAgY2xhc3NOYW1lID0gc3BsaXRbMV07CiAgICAg IGlmIChzcGxpdC5sZW5ndGggPT09IDMpIHsgZmFsc3lDbGFzc05hbWUgPSBz cGxpdFsyXTsgfQoKICAgICAgY2xhc3NOYW1lcyA9ICc6JyArIGNsYXNzTmFt ZTsKICAgICAgaWYgKGZhbHN5Q2xhc3NOYW1lKSB7IGNsYXNzTmFtZXMgKz0g IjoiICsgZmFsc3lDbGFzc05hbWU7IH0KICAgIH0KCiAgICByZXR1cm4gewog ICAgICBwYXRoOiBwcm9wZXJ0eVBhdGgsCiAgICAgIGNsYXNzTmFtZXM6IGNs YXNzTmFtZXMsCiAgICAgIGNsYXNzTmFtZTogKGNsYXNzTmFtZSA9PT0gJycp ID8gdW5kZWZpbmVkIDogY2xhc3NOYW1lLAogICAgICBmYWxzeUNsYXNzTmFt ZTogZmFsc3lDbGFzc05hbWUKICAgIH07CiAgfSwKCiAgLyoqCiAgICBHZXQg dGhlIGNsYXNzIG5hbWUgZm9yIGEgZ2l2ZW4gdmFsdWUsIGJhc2VkIG9uIHRo ZSBwYXRoLCBvcHRpb25hbAogICAgYGNsYXNzTmFtZWAgYW5kIG9wdGlvbmFs IGBmYWxzeUNsYXNzTmFtZWAuCgogICAgLSBpZiBhIGBjbGFzc05hbWVgIG9y IGBmYWxzeUNsYXNzTmFtZWAgaGFzIGJlZW4gc3BlY2lmaWVkOgogICAgICAt IGlmIHRoZSB2YWx1ZSBpcyB0cnV0aHkgYW5kIGBjbGFzc05hbWVgIGhhcyBi ZWVuIHNwZWNpZmllZCwKICAgICAgICBgY2xhc3NOYW1lYCBpcyByZXR1cm5l ZAogICAgICAtIGlmIHRoZSB2YWx1ZSBpcyBmYWxzeSBhbmQgYGZhbHN5Q2xh c3NOYW1lYCBoYXMgYmVlbiBzcGVjaWZpZWQsCiAgICAgICAgYGZhbHN5Q2xh c3NOYW1lYCBpcyByZXR1cm5lZAogICAgICAtIG90aGVyd2lzZSBgbnVsbGAg aXMgcmV0dXJuZWQKICAgIC0gaWYgdGhlIHZhbHVlIGlzIGB0cnVlYCwgdGhl IGRhc2hlcml6ZWQgbGFzdCBwYXJ0IG9mIHRoZSBzdXBwbGllZCBwYXRoCiAg ICAgIGlzIHJldHVybmVkCiAgICAtIGlmIHRoZSB2YWx1ZSBpcyBub3QgYGZh bHNlYCwgYHVuZGVmaW5lZGAgb3IgYG51bGxgLCB0aGUgYHZhbHVlYAogICAg ICBpcyByZXR1cm5lZAogICAgLSBpZiBub25lIG9mIHRoZSBhYm92ZSBydWxl cyBhcHBseSwgYG51bGxgIGlzIHJldHVybmVkCgogICAgQG1ldGhvZCBfY2xh c3NTdHJpbmdGb3JWYWx1ZQogICAgQHBhcmFtIHBhdGgKICAgIEBwYXJhbSB2 YWwKICAgIEBwYXJhbSBjbGFzc05hbWUKICAgIEBwYXJhbSBmYWxzeUNsYXNz TmFtZQogICAgQHN0YXRpYwogICAgQHByaXZhdGUKICAqLwogIF9jbGFzc1N0 cmluZ0ZvclZhbHVlOiBmdW5jdGlvbihwYXRoLCB2YWwsIGNsYXNzTmFtZSwg ZmFsc3lDbGFzc05hbWUpIHsKICAgIC8vIFdoZW4gdXNpbmcgdGhlIGNvbG9u IHN5bnRheCwgZXZhbHVhdGUgdGhlIHRydXRoaW5lc3Mgb3IgZmFsc2luZXNz CiAgICAvLyBvZiB0aGUgdmFsdWUgdG8gZGV0ZXJtaW5lIHdoaWNoIGNsYXNz TmFtZSB0byByZXR1cm4KICAgIGlmIChjbGFzc05hbWUgfHwgZmFsc3lDbGFz c05hbWUpIHsKICAgICAgaWYgKGNsYXNzTmFtZSAmJiAhIXZhbCkgewogICAg ICAgIHJldHVybiBjbGFzc05hbWU7CgogICAgICB9IGVsc2UgaWYgKGZhbHN5 Q2xhc3NOYW1lICYmICF2YWwpIHsKICAgICAgICByZXR1cm4gZmFsc3lDbGFz c05hbWU7CgogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBudWxsOwog ICAgICB9CgogICAgLy8gSWYgdmFsdWUgaXMgYSBCb29sZWFuIGFuZCB0cnVl LCByZXR1cm4gdGhlIGRhc2hlcml6ZWQgcHJvcGVydHkKICAgIC8vIG5hbWUu CiAgICB9IGVsc2UgaWYgKHZhbCA9PT0gdHJ1ZSkgewogICAgICAvLyBOb3Jt YWxpemUgcHJvcGVydHkgcGF0aCB0byBiZSBzdWl0YWJsZSBmb3IgdXNlCiAg ICAgIC8vIGFzIGEgY2xhc3MgbmFtZS4gRm9yIGV4YXBsZSwgY29udGVudC5m b28uYmFyQmF6CiAgICAgIC8vIGJlY29tZXMgYmFyLWJhei4KICAgICAgdmFy IHBhcnRzID0gcGF0aC5zcGxpdCgnLicpOwogICAgICByZXR1cm4gRW1iZXIu U3RyaW5nLmRhc2hlcml6ZShwYXJ0c1twYXJ0cy5sZW5ndGgtMV0pOwoKICAg IC8vIElmIHRoZSB2YWx1ZSBpcyBub3QgZmFsc2UsIHVuZGVmaW5lZCwgb3Ig bnVsbCwgcmV0dXJuIHRoZSBjdXJyZW50CiAgICAvLyB2YWx1ZSBvZiB0aGUg cHJvcGVydHkuCiAgICB9IGVsc2UgaWYgKHZhbCAhPT0gZmFsc2UgJiYgdmFs ICE9IG51bGwpIHsKICAgICAgcmV0dXJuIHZhbDsKCiAgICAvLyBOb3RoaW5n IHRvIGRpc3BsYXkuIFJldHVybiBudWxsIHNvIHRoYXQgdGhlIG9sZCBjbGFz cyBpcyByZW1vdmVkCiAgICAvLyBidXQgbm8gbmV3IGNsYXNzIGlzIGFkZGVk LgogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQp9 KTsKCnZhciBtdXRhdGlvbiA9IEVtYmVyLk9iamVjdC5leHRlbmQoRW1iZXIu RXZlbnRlZCkuY3JlYXRlKCk7CgpFbWJlci5WaWV3LmFkZE11dGF0aW9uTGlz dGVuZXIgPSBmdW5jdGlvbihjYWxsYmFjaykgewogIG11dGF0aW9uLm9uKCdj aGFuZ2UnLCBjYWxsYmFjayk7Cn07CgpFbWJlci5WaWV3LnJlbW92ZU11dGF0 aW9uTGlzdGVuZXIgPSBmdW5jdGlvbihjYWxsYmFjaykgewogIG11dGF0aW9u Lm9mZignY2hhbmdlJywgY2FsbGJhY2spOwp9OwoKRW1iZXIuVmlldy5ub3Rp ZnlNdXRhdGlvbkxpc3RlbmVycyA9IGZ1bmN0aW9uKCkgewogIG11dGF0aW9u LnRyaWdnZXIoJ2NoYW5nZScpOwp9OwoKLyoqCiAgR2xvYmFsIHZpZXdzIGhh c2gKCiAgQHByb3BlcnR5IHZpZXdzCiAgQHN0YXRpYwogIEB0eXBlIEhhc2gK Ki8KRW1iZXIuVmlldy52aWV3cyA9IHt9OwoKLy8gSWYgc29tZW9uZSBvdmVy cmlkZXMgdGhlIGNoaWxkIHZpZXdzIGNvbXB1dGVkIHByb3BlcnR5IHdoZW4K Ly8gZGVmaW5pbmcgdGhlaXIgY2xhc3MsIHdlIHdhbnQgdG8gYmUgYWJsZSB0 byBwcm9jZXNzIHRoZSB1c2VyJ3MKLy8gc3VwcGxpZWQgY2hpbGRWaWV3cyBh bmQgdGhlbiByZXN0b3JlIHRoZSBvcmlnaW5hbCBjb21wdXRlZCBwcm9wZXJ0 eQovLyBhdCB2aWV3IGluaXRpYWxpemF0aW9uIHRpbWUuIFRoaXMgaGFwcGVu cyBpbiBFbWJlci5Db250YWluZXJWaWV3J3MgaW5pdAovLyBtZXRob2QuCkVt YmVyLlZpZXcuY2hpbGRWaWV3c1Byb3BlcnR5ID0gY2hpbGRWaWV3c1Byb3Bl cnR5OwoKRW1iZXIuVmlldy5hcHBseUF0dHJpYnV0ZUJpbmRpbmdzID0gZnVu Y3Rpb24oZWxlbSwgbmFtZSwgdmFsdWUpIHsKICB2YXIgdHlwZSA9IEVtYmVy LnR5cGVPZih2YWx1ZSk7CgogIC8vIGlmIHRoaXMgY2hhbmdlcywgYWxzbyBj aGFuZ2UgdGhlIGxvZ2ljIGluIGVtYmVyLWhhbmRsZWJhcnMvbGliL2hlbHBl cnMvYmluZGluZy5qcwogIGlmIChuYW1lICE9PSAndmFsdWUnICYmICh0eXBl ID09PSAnc3RyaW5nJyB8fCAodHlwZSA9PT0gJ251bWJlcicgJiYgIWlzTmFO KHZhbHVlKSkpKSB7CiAgICBpZiAodmFsdWUgIT09IGVsZW0uYXR0cihuYW1l KSkgewogICAgICBlbGVtLmF0dHIobmFtZSwgdmFsdWUpOwogICAgfQogIH0g ZWxzZSBpZiAobmFtZSA9PT0gJ3ZhbHVlJyB8fCB0eXBlID09PSAnYm9vbGVh bicpIHsKICAgIGlmIChFbWJlci5pc05vbmUodmFsdWUpIHx8IHZhbHVlID09 PSBmYWxzZSkgewogICAgICAvLyBgbnVsbGAsIGB1bmRlZmluZWRgIG9yIGBm YWxzZWAgc2hvdWxkIHJlbW92ZSBhdHRyaWJ1dGUKICAgICAgZWxlbS5yZW1v dmVBdHRyKG5hbWUpOwogICAgICBlbGVtLnByb3AobmFtZSwgJycpOwogICAg fSBlbHNlIGlmICh2YWx1ZSAhPT0gZWxlbS5wcm9wKG5hbWUpKSB7CiAgICAg IC8vIHZhbHVlIHNob3VsZCBhbHdheXMgYmUgcHJvcGVydGllcwogICAgICBl bGVtLnByb3AobmFtZSwgdmFsdWUpOwogICAgfQogIH0gZWxzZSBpZiAoIXZh bHVlKSB7CiAgICBlbGVtLnJlbW92ZUF0dHIobmFtZSk7CiAgfQp9OwoKRW1i ZXIuVmlldy5zdGF0ZXMgPSBzdGF0ZXM7Cgp9KSgpOwoKCgooZnVuY3Rpb24o KSB7Ci8qKgpAbW9kdWxlIGVtYmVyCkBzdWJtb2R1bGUgZW1iZXItdmlld3MK Ki8KCnZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKCkVt YmVyLlZpZXcuc3RhdGVzLl9kZWZhdWx0ID0gewogIC8vIGFwcGVuZENoaWxk IGlzIG9ubHkgbGVnYWwgd2hpbGUgcmVuZGVyaW5nIHRoZSBidWZmZXIuCiAg YXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uKCkgewogICAgdGhyb3cgIllvdSBjYW4n dCB1c2UgYXBwZW5kQ2hpbGQgb3V0c2lkZSBvZiB0aGUgcmVuZGVyaW5nIHBy b2Nlc3MiOwogIH0sCgogICQ6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHVu ZGVmaW5lZDsKICB9LAoKICBnZXRFbGVtZW50OiBmdW5jdGlvbigpIHsKICAg IHJldHVybiBudWxsOwogIH0sCgogIC8vIEhhbmRsZSBldmVudHMgZnJvbSBg RW1iZXIuRXZlbnREaXNwYXRjaGVyYAogIGhhbmRsZUV2ZW50OiBmdW5jdGlv bigpIHsKICAgIHJldHVybiB0cnVlOyAvLyBjb250aW51ZSBldmVudCBwcm9w YWdhdGlvbgogIH0sCgogIGRlc3Ryb3lFbGVtZW50OiBmdW5jdGlvbih2aWV3 KSB7CiAgICBzZXQodmlldywgJ2VsZW1lbnQnLCBudWxsKTsKICAgIGlmICh2 aWV3Ll9zY2hlZHVsZWRJbnNlcnQpIHsKICAgICAgRW1iZXIucnVuLmNhbmNl bCh2aWV3Ll9zY2hlZHVsZWRJbnNlcnQpOwogICAgICB2aWV3Ll9zY2hlZHVs ZWRJbnNlcnQgPSBudWxsOwogICAgfQogICAgcmV0dXJuIHZpZXc7CiAgfSwK CiAgcmVuZGVyVG9CdWZmZXJJZk5lZWRlZDogZnVuY3Rpb24gKCkgewogICAg cmV0dXJuIGZhbHNlOwogIH0sCgogIHJlcmVuZGVyOiBFbWJlci5LLAogIGlu dm9rZU9ic2VydmVyOiBFbWJlci5LCn07Cgp9KSgpOwoKCgooZnVuY3Rpb24o KSB7Ci8qKgpAbW9kdWxlIGVtYmVyCkBzdWJtb2R1bGUgZW1iZXItdmlld3MK Ki8KCnZhciBwcmVSZW5kZXIgPSBFbWJlci5WaWV3LnN0YXRlcy5wcmVSZW5k ZXIgPSBFbWJlci5jcmVhdGUoRW1iZXIuVmlldy5zdGF0ZXMuX2RlZmF1bHQp OwoKRW1iZXIubWVyZ2UocHJlUmVuZGVyLCB7CiAgLy8gYSB2aWV3IGxlYXZl cyB0aGUgcHJlUmVuZGVyIHN0YXRlIG9uY2UgaXRzIGVsZW1lbnQgaGFzIGJl ZW4KICAvLyBjcmVhdGVkIChjcmVhdGVFbGVtZW50KS4KICBpbnNlcnRFbGVt ZW50OiBmdW5jdGlvbih2aWV3LCBmbikgewogICAgdmlldy5jcmVhdGVFbGVt ZW50KCk7CiAgICB2YXIgdmlld0NvbGxlY3Rpb24gPSB2aWV3LnZpZXdIaWVy YXJjaHlDb2xsZWN0aW9uKCk7CgogICAgdmlld0NvbGxlY3Rpb24udHJpZ2dl cignd2lsbEluc2VydEVsZW1lbnQnKTsKCiAgICBmbi5jYWxsKHZpZXcpOwoK ICAgIC8vIFdlIHRyYW5zaXRpb24gdG8gYGluRE9NYCBpZiB0aGUgZWxlbWVu dCBleGlzdHMgaW4gdGhlIERPTQogICAgdmFyIGVsZW1lbnQgPSB2aWV3Lmdl dCgnZWxlbWVudCcpOwogICAgaWYgKGRvY3VtZW50LmJvZHkuY29udGFpbnMo ZWxlbWVudCkpIHsKICAgICAgdmlld0NvbGxlY3Rpb24udHJhbnNpdGlvblRv KCdpbkRPTScsIGZhbHNlKTsKICAgICAgdmlld0NvbGxlY3Rpb24udHJpZ2dl cignZGlkSW5zZXJ0RWxlbWVudCcpOwogICAgfQogIH0sCgogIHJlbmRlclRv QnVmZmVySWZOZWVkZWQ6IGZ1bmN0aW9uKHZpZXcsIGJ1ZmZlcikgewogICAg dmlldy5yZW5kZXJUb0J1ZmZlcihidWZmZXIpOwogICAgcmV0dXJuIHRydWU7 CiAgfSwKCiAgZW1wdHk6IEVtYmVyLkssCgogIHNldEVsZW1lbnQ6IGZ1bmN0 aW9uKHZpZXcsIHZhbHVlKSB7CiAgICBpZiAodmFsdWUgIT09IG51bGwpIHsK ICAgICAgdmlldy50cmFuc2l0aW9uVG8oJ2hhc0VsZW1lbnQnKTsKICAgIH0K ICAgIHJldHVybiB2YWx1ZTsKICB9Cn0pOwoKfSkoKTsKCgoKKGZ1bmN0aW9u KCkgewovKioKQG1vZHVsZSBlbWJlcgpAc3VibW9kdWxlIGVtYmVyLXZpZXdz CiovCgp2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7Cgp2 YXIgaW5CdWZmZXIgPSBFbWJlci5WaWV3LnN0YXRlcy5pbkJ1ZmZlciA9IEVt YmVyLmNyZWF0ZShFbWJlci5WaWV3LnN0YXRlcy5fZGVmYXVsdCk7CgpFbWJl ci5tZXJnZShpbkJ1ZmZlciwgewogICQ6IGZ1bmN0aW9uKHZpZXcsIHNlbCkg ewogICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhbiBlbGVtZW50IHlldCwgc29t ZW9uZSBjYWxsaW5nIHRoaXMuJCgpIGlzCiAgICAvLyB0cnlpbmcgdG8gdXBk YXRlIGFuIGVsZW1lbnQgdGhhdCBpc24ndCBpbiB0aGUgRE9NLiBJbnN0ZWFk LAogICAgLy8gcmVyZW5kZXIgdGhlIHZpZXcgdG8gYWxsb3cgdGhlIHJlbmRl ciBtZXRob2QgdG8gcmVmbGVjdCB0aGUKICAgIC8vIGNoYW5nZXMuCiAgICB2 aWV3LnJlcmVuZGVyKCk7CiAgICByZXR1cm4gRW1iZXIuJCgpOwogIH0sCgog IC8vIHdoZW4gYSB2aWV3IGlzIHJlbmRlcmVkIGluIGEgYnVmZmVyLCByZXJl bmRlcmluZyBpdCBzaW1wbHkKICAvLyByZXBsYWNlcyB0aGUgZXhpc3Rpbmcg YnVmZmVyIHdpdGggYSBuZXcgb25lCiAgcmVyZW5kZXI6IGZ1bmN0aW9uKHZp ZXcpIHsKICAgIHRocm93IG5ldyBFbWJlci5FcnJvcigiU29tZXRoaW5nIHlv dSBkaWQgY2F1c2VkIGEgdmlldyB0byByZS1yZW5kZXIgYWZ0ZXIgaXQgcmVu ZGVyZWQgYnV0IGJlZm9yZSBpdCB3YXMgaW5zZXJ0ZWQgaW50byB0aGUgRE9N LiIpOwogIH0sCgogIC8vIHdoZW4gYSB2aWV3IGlzIHJlbmRlcmVkIGluIGEg YnVmZmVyLCBhcHBlbmRpbmcgYSBjaGlsZAogIC8vIHZpZXcgd2lsbCByZW5k ZXIgdGhhdCB2aWV3IGFuZCBhcHBlbmQgdGhlIHJlc3VsdGluZwogIC8vIGJ1 ZmZlciBpbnRvIGl0cyBidWZmZXIuCiAgYXBwZW5kQ2hpbGQ6IGZ1bmN0aW9u KHZpZXcsIGNoaWxkVmlldywgb3B0aW9ucykgewogICAgdmFyIGJ1ZmZlciA9 IHZpZXcuYnVmZmVyLCBfY2hpbGRWaWV3cyA9IHZpZXcuX2NoaWxkVmlld3M7 CgogICAgY2hpbGRWaWV3ID0gdmlldy5jcmVhdGVDaGlsZFZpZXcoY2hpbGRW aWV3LCBvcHRpb25zKTsKICAgIGlmICghX2NoaWxkVmlld3MubGVuZ3RoKSB7 IF9jaGlsZFZpZXdzID0gdmlldy5fY2hpbGRWaWV3cyA9IF9jaGlsZFZpZXdz LnNsaWNlKCk7IH0KICAgIF9jaGlsZFZpZXdzLnB1c2goY2hpbGRWaWV3KTsK CiAgICBjaGlsZFZpZXcucmVuZGVyVG9CdWZmZXIoYnVmZmVyKTsKCiAgICB2 aWV3LnByb3BlcnR5RGlkQ2hhbmdlKCdjaGlsZFZpZXdzJyk7CgogICAgcmV0 dXJuIGNoaWxkVmlldzsKICB9LAoKICAvLyB3aGVuIGEgdmlldyBpcyByZW5k ZXJlZCBpbiBhIGJ1ZmZlciwgZGVzdHJveWluZyB0aGUKICAvLyBlbGVtZW50 IHdpbGwgc2ltcGx5IGRlc3Ryb3kgdGhlIGJ1ZmZlciBhbmQgcHV0IHRoZQog IC8vIHN0YXRlIGJhY2sgaW50byB0aGUgcHJlUmVuZGVyIHN0YXRlLgogIGRl c3Ryb3lFbGVtZW50OiBmdW5jdGlvbih2aWV3KSB7CiAgICB2aWV3LmNsZWFy QnVmZmVyKCk7CiAgICB2YXIgdmlld0NvbGxlY3Rpb24gPSB2aWV3Ll9ub3Rp ZnlXaWxsRGVzdHJveUVsZW1lbnQoKTsKICAgIHZpZXdDb2xsZWN0aW9uLnRy YW5zaXRpb25UbygncHJlUmVuZGVyJywgZmFsc2UpOwoKICAgIHJldHVybiB2 aWV3OwogIH0sCgogIGVtcHR5OiBmdW5jdGlvbigpIHsKICAgIEVtYmVyLmFz c2VydCgiRW1wdHlpbmcgYSB2aWV3IGluIHRoZSBpbkJ1ZmZlciBzdGF0ZSBp cyBub3QgYWxsb3dlZCBhbmQgIiArCiAgICAgICAgICAgICAgICAgInNob3Vs ZCBub3QgaGFwcGVuIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLiBNb3N0 IGxpa2VseSAiICsKICAgICAgICAgICAgICAgICAidGhlcmUgaXMgYSBidWcg aW4geW91ciBhcHBsaWNhdGlvbi4gVGhpcyBtYXkgYmUgZHVlIHRvICIgKwog ICAgICAgICAgICAgICAgICJleGNlc3NpdmUgcHJvcGVydHkgY2hhbmdlIG5v dGlmaWNhdGlvbnMuIik7CiAgfSwKCiAgcmVuZGVyVG9CdWZmZXJJZk5lZWRl ZDogZnVuY3Rpb24gKHZpZXcsIGJ1ZmZlcikgewogICAgcmV0dXJuIGZhbHNl OwogIH0sCgogIC8vIEl0IHNob3VsZCBiZSBpbXBvc3NpYmxlIGZvciBhIHJl bmRlcmVkIHZpZXcgdG8gYmUgc2NoZWR1bGVkIGZvcgogIC8vIGluc2VydGlv bi4KICBpbnNlcnRFbGVtZW50OiBmdW5jdGlvbigpIHsKICAgIHRocm93ICJZ b3UgY2FuJ3QgaW5zZXJ0IGFuIGVsZW1lbnQgdGhhdCBoYXMgYWxyZWFkeSBi ZWVuIHJlbmRlcmVkIjsKICB9LAoKICBzZXRFbGVtZW50OiBmdW5jdGlvbih2 aWV3LCB2YWx1ZSkgewogICAgaWYgKHZhbHVlID09PSBudWxsKSB7CiAgICAg IHZpZXcudHJhbnNpdGlvblRvKCdwcmVSZW5kZXInKTsKICAgIH0gZWxzZSB7 CiAgICAgIHZpZXcuY2xlYXJCdWZmZXIoKTsKICAgICAgdmlldy50cmFuc2l0 aW9uVG8oJ2hhc0VsZW1lbnQnKTsKICAgIH0KCiAgICByZXR1cm4gdmFsdWU7 CiAgfSwKCiAgaW52b2tlT2JzZXJ2ZXI6IGZ1bmN0aW9uKHRhcmdldCwgb2Jz ZXJ2ZXIpIHsKICAgIG9ic2VydmVyLmNhbGwodGFyZ2V0KTsKICB9Cn0pOwoK Cn0pKCk7CgoKCihmdW5jdGlvbigpIHsKLyoqCkBtb2R1bGUgZW1iZXIKQHN1 Ym1vZHVsZSBlbWJlci12aWV3cwoqLwoKdmFyIGdldCA9IEVtYmVyLmdldCwg c2V0ID0gRW1iZXIuc2V0OwoKdmFyIGhhc0VsZW1lbnQgPSBFbWJlci5WaWV3 LnN0YXRlcy5oYXNFbGVtZW50ID0gRW1iZXIuY3JlYXRlKEVtYmVyLlZpZXcu c3RhdGVzLl9kZWZhdWx0KTsKCkVtYmVyLm1lcmdlKGhhc0VsZW1lbnQsIHsK ICAkOiBmdW5jdGlvbih2aWV3LCBzZWwpIHsKICAgIHZhciBlbGVtID0gZ2V0 KHZpZXcsICdlbGVtZW50Jyk7CiAgICByZXR1cm4gc2VsID8gRW1iZXIuJChz ZWwsIGVsZW0pIDogRW1iZXIuJChlbGVtKTsKICB9LAoKICBnZXRFbGVtZW50 OiBmdW5jdGlvbih2aWV3KSB7CiAgICB2YXIgcGFyZW50ID0gZ2V0KHZpZXcs ICdwYXJlbnRWaWV3Jyk7CiAgICBpZiAocGFyZW50KSB7IHBhcmVudCA9IGdl dChwYXJlbnQsICdlbGVtZW50Jyk7IH0KICAgIGlmIChwYXJlbnQpIHsgcmV0 dXJuIHZpZXcuZmluZEVsZW1lbnRJblBhcmVudEVsZW1lbnQocGFyZW50KTsg fQogICAgcmV0dXJuIEVtYmVyLiQoIiMiICsgZ2V0KHZpZXcsICdlbGVtZW50 SWQnKSlbMF07CiAgfSwKCiAgc2V0RWxlbWVudDogZnVuY3Rpb24odmlldywg dmFsdWUpIHsKICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgewogICAgICB2aWV3 LnRyYW5zaXRpb25UbygncHJlUmVuZGVyJyk7CiAgICB9IGVsc2UgewogICAg ICB0aHJvdyAiWW91IGNhbm5vdCBzZXQgYW4gZWxlbWVudCB0byBhIG5vbi1u dWxsIHZhbHVlIHdoZW4gdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBpbiB0aGUg RE9NLiI7CiAgICB9CgogICAgcmV0dXJuIHZhbHVlOwogIH0sCgogIC8vIG9u Y2UgdGhlIHZpZXcgaGFzIGJlZW4gaW5zZXJ0ZWQgaW50byB0aGUgRE9NLCBy ZXJlbmRlcmluZyBpcwogIC8vIGRlZmVycmVkIHRvIGFsbG93IGJpbmRpbmdz IHRvIHN5bmNocm9uaXplLgogIHJlcmVuZGVyOiBmdW5jdGlvbih2aWV3KSB7 CiAgICB2aWV3LnRyaWdnZXJSZWN1cnNpdmVseSgnd2lsbENsZWFyUmVuZGVy Jyk7CgogICAgdmlldy5jbGVhclJlbmRlcmVkQ2hpbGRyZW4oKTsKCiAgICB2 aWV3LmRvbU1hbmFnZXIucmVwbGFjZSh2aWV3KTsKICAgIHJldHVybiB2aWV3 OwogIH0sCgogIC8vIG9uY2UgdGhlIHZpZXcgaXMgYWxyZWFkeSBpbiB0aGUg RE9NLCBkZXN0cm95aW5nIGl0IHJlbW92ZXMgaXQKICAvLyBmcm9tIHRoZSBE T00sIG51a2VzIGl0cyBlbGVtZW50LCBhbmQgcHV0cyBpdCBiYWNrIGludG8g dGhlCiAgLy8gcHJlUmVuZGVyIHN0YXRlIGlmIGluRE9NLgoKICBkZXN0cm95 RWxlbWVudDogZnVuY3Rpb24odmlldykgewogICAgdmlldy5fbm90aWZ5V2ls bERlc3Ryb3lFbGVtZW50KCk7CiAgICB2aWV3LmRvbU1hbmFnZXIucmVtb3Zl KHZpZXcpOwogICAgc2V0KHZpZXcsICdlbGVtZW50JywgbnVsbCk7CiAgICBp ZiAodmlldy5fc2NoZWR1bGVkSW5zZXJ0KSB7CiAgICAgIEVtYmVyLnJ1bi5j YW5jZWwodmlldy5fc2NoZWR1bGVkSW5zZXJ0KTsKICAgICAgdmlldy5fc2No ZWR1bGVkSW5zZXJ0ID0gbnVsbDsKICAgIH0KICAgIHJldHVybiB2aWV3Owog IH0sCgogIGVtcHR5OiBmdW5jdGlvbih2aWV3KSB7CiAgICB2YXIgX2NoaWxk Vmlld3MgPSB2aWV3Ll9jaGlsZFZpZXdzLCBsZW4sIGlkeDsKICAgIGlmIChf Y2hpbGRWaWV3cykgewogICAgICBsZW4gPSBfY2hpbGRWaWV3cy5sZW5ndGg7 CiAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgbGVuOyBpZHgrKykgewogICAg ICAgIF9jaGlsZFZpZXdzW2lkeF0uX25vdGlmeVdpbGxEZXN0cm95RWxlbWVu dCgpOwogICAgICB9CiAgICB9CiAgICB2aWV3LmRvbU1hbmFnZXIuZW1wdHko dmlldyk7CiAgfSwKCiAgLy8gSGFuZGxlIGV2ZW50cyBmcm9tIGBFbWJlci5F dmVudERpc3BhdGNoZXJgCiAgaGFuZGxlRXZlbnQ6IGZ1bmN0aW9uKHZpZXcs IGV2ZW50TmFtZSwgZXZ0KSB7CiAgICBpZiAodmlldy5oYXMoZXZlbnROYW1l KSkgewogICAgICAvLyBIYW5kbGVyIHNob3VsZCBiZSBhYmxlIHRvIHJlLWRp c3BhdGNoIGV2ZW50cywgc28gd2UgZG9uJ3QKICAgICAgLy8gcHJldmVudERl ZmF1bHQgb3Igc3RvcFByb3BhZ2F0aW9uLgogICAgICByZXR1cm4gdmlldy50 cmlnZ2VyKGV2ZW50TmFtZSwgZXZ0KTsKICAgIH0gZWxzZSB7CiAgICAgIHJl dHVybiB0cnVlOyAvLyBjb250aW51ZSBldmVudCBwcm9wYWdhdGlvbgogICAg fQogIH0sCgogIGludm9rZU9ic2VydmVyOiBmdW5jdGlvbih0YXJnZXQsIG9i c2VydmVyKSB7CiAgICBvYnNlcnZlci5jYWxsKHRhcmdldCk7CiAgfQp9KTsK fSkoKTsKCgoKKGZ1bmN0aW9uKCkgewovKioKQG1vZHVsZSBlbWJlcgpAc3Vi bW9kdWxlIGVtYmVyLXZpZXdzCiovCgp2YXIgaGFzRWxlbWVudCA9IEVtYmVy LlZpZXcuc3RhdGVzLmhhc0VsZW1lbnQ7CnZhciBpbkRPTSA9IEVtYmVyLlZp ZXcuc3RhdGVzLmluRE9NID0gRW1iZXIuY3JlYXRlKGhhc0VsZW1lbnQpOwoK RW1iZXIubWVyZ2UoaW5ET00sIHsKICBlbnRlcjogZnVuY3Rpb24odmlldykg ewogICAgLy8gUmVnaXN0ZXIgdGhlIHZpZXcgZm9yIGV2ZW50IGhhbmRsaW5n LiBUaGlzIGhhc2ggaXMgdXNlZCBieQogICAgLy8gRW1iZXIuRXZlbnREaXNw YXRjaGVyIHRvIGRpc3BhdGNoIGluY29taW5nIGV2ZW50cy4KICAgIGlmICgh dmlldy5pc1ZpcnR1YWwpIHsKICAgICAgRW1iZXIuYXNzZXJ0KCJBdHRlbXB0 ZWQgdG8gcmVnaXN0ZXIgYSB2aWV3IHdpdGggYW4gaWQgYWxyZWFkeSBpbiB1 c2U6ICIrdmlldy5lbGVtZW50SWQsICFFbWJlci5WaWV3LnZpZXdzW3ZpZXcu ZWxlbWVudElkXSk7CiAgICAgIEVtYmVyLlZpZXcudmlld3Nbdmlldy5lbGVt ZW50SWRdID0gdmlldzsKICAgIH0KCiAgICB2aWV3LmFkZEJlZm9yZU9ic2Vy dmVyKCdlbGVtZW50SWQnLCBmdW5jdGlvbigpIHsKICAgICAgdGhyb3cgbmV3 IEVtYmVyLkVycm9yKCJDaGFuZ2luZyBhIHZpZXcncyBlbGVtZW50SWQgYWZ0 ZXIgY3JlYXRpb24gaXMgbm90IGFsbG93ZWQiKTsKICAgIH0pOwogIH0sCgog IGV4aXQ6IGZ1bmN0aW9uKHZpZXcpIHsKICAgIGlmICghdGhpcy5pc1ZpcnR1 YWwpIGRlbGV0ZSBFbWJlci5WaWV3LnZpZXdzW3ZpZXcuZWxlbWVudElkXTsK ICB9LAoKICBpbnNlcnRFbGVtZW50OiBmdW5jdGlvbih2aWV3LCBmbikgewog ICAgdGhyb3cgIllvdSBjYW4ndCBpbnNlcnQgYW4gZWxlbWVudCBpbnRvIHRo ZSBET00gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluc2VydGVkIjsKICB9Cn0p OwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewovKioKQG1vZHVsZSBlbWJlcgpA c3VibW9kdWxlIGVtYmVyLXZpZXdzCiovCgp2YXIgZGVzdHJveWluZ0Vycm9y ID0gIllvdSBjYW4ndCBjYWxsICVAIG9uIGEgdmlldyBiZWluZyBkZXN0cm95 ZWQiLCBmbXQgPSBFbWJlci5TdHJpbmcuZm10OwoKdmFyIGRlc3Ryb3lpbmcg PSBFbWJlci5WaWV3LnN0YXRlcy5kZXN0cm95aW5nID0gRW1iZXIuY3JlYXRl KEVtYmVyLlZpZXcuc3RhdGVzLl9kZWZhdWx0KTsKCkVtYmVyLm1lcmdlKGRl c3Ryb3lpbmcsIHsKICBhcHBlbmRDaGlsZDogZnVuY3Rpb24oKSB7CiAgICB0 aHJvdyBmbXQoZGVzdHJveWluZ0Vycm9yLCBbJ2FwcGVuZENoaWxkJ10pOwog IH0sCiAgcmVyZW5kZXI6IGZ1bmN0aW9uKCkgewogICAgdGhyb3cgZm10KGRl c3Ryb3lpbmdFcnJvciwgWydyZXJlbmRlciddKTsKICB9LAogIGRlc3Ryb3lF bGVtZW50OiBmdW5jdGlvbigpIHsKICAgIHRocm93IGZtdChkZXN0cm95aW5n RXJyb3IsIFsnZGVzdHJveUVsZW1lbnQnXSk7CiAgfSwKICBlbXB0eTogZnVu Y3Rpb24oKSB7CiAgICB0aHJvdyBmbXQoZGVzdHJveWluZ0Vycm9yLCBbJ2Vt cHR5J10pOwogIH0sCgogIHNldEVsZW1lbnQ6IGZ1bmN0aW9uKCkgewogICAg dGhyb3cgZm10KGRlc3Ryb3lpbmdFcnJvciwgWyJzZXQoJ2VsZW1lbnQnLCAu Li4pIl0pOwogIH0sCgogIHJlbmRlclRvQnVmZmVySWZOZWVkZWQ6IGZ1bmN0 aW9uKCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0sCgogIC8vIFNpbmNlIGVs ZW1lbnQgaW5zZXJ0aW9uIGlzIHNjaGVkdWxlZCwgZG9uJ3QgZG8gYW55dGhp bmcgaWYKICAvLyB0aGUgdmlldyBoYXMgYmVlbiBkZXN0cm95ZWQgYmV0d2Vl biBzY2hlZHVsaW5nIGFuZCBleGVjdXRpb24KICBpbnNlcnRFbGVtZW50OiBF bWJlci5LCn0pOwoKCn0pKCk7CgoKCihmdW5jdGlvbigpIHsKRW1iZXIuVmll dy5jbG9uZVN0YXRlcyA9IGZ1bmN0aW9uKGZyb20pIHsKICB2YXIgaW50byA9 IHt9OwoKICBpbnRvLl9kZWZhdWx0ID0ge307CiAgaW50by5wcmVSZW5kZXIg PSBFbWJlci5jcmVhdGUoaW50by5fZGVmYXVsdCk7CiAgaW50by5kZXN0cm95 aW5nID0gRW1iZXIuY3JlYXRlKGludG8uX2RlZmF1bHQpOwogIGludG8uaW5C dWZmZXIgPSBFbWJlci5jcmVhdGUoaW50by5fZGVmYXVsdCk7CiAgaW50by5o YXNFbGVtZW50ID0gRW1iZXIuY3JlYXRlKGludG8uX2RlZmF1bHQpOwogIGlu dG8uaW5ET00gPSBFbWJlci5jcmVhdGUoaW50by5oYXNFbGVtZW50KTsKCiAg Zm9yICh2YXIgc3RhdGVOYW1lIGluIGZyb20pIHsKICAgIGlmICghZnJvbS5o YXNPd25Qcm9wZXJ0eShzdGF0ZU5hbWUpKSB7IGNvbnRpbnVlOyB9CiAgICBF bWJlci5tZXJnZShpbnRvW3N0YXRlTmFtZV0sIGZyb21bc3RhdGVOYW1lXSk7 CiAgfQoKICByZXR1cm4gaW50bzsKfTsKCn0pKCk7CgoKCihmdW5jdGlvbigp IHsKdmFyIHN0YXRlcyA9IEVtYmVyLlZpZXcuY2xvbmVTdGF0ZXMoRW1iZXIu Vmlldy5zdGF0ZXMpOwoKLyoqCkBtb2R1bGUgZW1iZXIKQHN1Ym1vZHVsZSBl bWJlci12aWV3cwoqLwoKdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1i ZXIuc2V0Owp2YXIgZm9yRWFjaCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5m b3JFYWNoOwp2YXIgVmlld0NvbGxlY3Rpb24gPSBFbWJlci5fVmlld0NvbGxl Y3Rpb247CgovKioKICBBIGBDb250YWluZXJWaWV3YCBpcyBhbiBgRW1iZXIu Vmlld2Agc3ViY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGBFbWJlci5NdXRhYmxl QXJyYXlgCiAgYWxsb3dpbmcgcHJvZ3JhbW1hdGljIG1hbmFnZW1lbnQgb2Yg aXRzIGNoaWxkIHZpZXdzLgoKICAjIyBTZXR0aW5nIEluaXRpYWwgQ2hpbGQg Vmlld3MKCiAgVGhlIGluaXRpYWwgYXJyYXkgb2YgY2hpbGQgdmlld3MgY2Fu IGJlIHNldCBpbiBvbmUgb2YgdHdvIHdheXMuIFlvdSBjYW4KICBwcm92aWRl IGEgYGNoaWxkVmlld3NgIHByb3BlcnR5IGF0IGNyZWF0aW9uIHRpbWUgdGhh dCBjb250YWlucyBpbnN0YW5jZSBvZgogIGBFbWJlci5WaWV3YDoKCiAgYGBg amF2YXNjcmlwdAogIGFDb250YWluZXIgPSBFbWJlci5Db250YWluZXJWaWV3 LmNyZWF0ZSh7CiAgICBjaGlsZFZpZXdzOiBbRW1iZXIuVmlldy5jcmVhdGUo KSwgRW1iZXIuVmlldy5jcmVhdGUoKV0KICB9KTsKICBgYGAKCiAgWW91IGNh biBhbHNvIHByb3ZpZGUgYSBsaXN0IG9mIHByb3BlcnR5IG5hbWVzIHdob3Nl IHZhbHVlcyBhcmUgaW5zdGFuY2VzIG9mCiAgYEVtYmVyLlZpZXdgOgoKICBg YGBqYXZhc2NyaXB0CiAgYUNvbnRhaW5lciA9IEVtYmVyLkNvbnRhaW5lclZp ZXcuY3JlYXRlKHsKICAgIGNoaWxkVmlld3M6IFsnYVZpZXcnLCAnYlZpZXcn LCAnY1ZpZXcnXSwKICAgIGFWaWV3OiBFbWJlci5WaWV3LmNyZWF0ZSgpLAog ICAgYlZpZXc6IEVtYmVyLlZpZXcuY3JlYXRlKCksCiAgICBjVmlldzogRW1i ZXIuVmlldy5jcmVhdGUoKQogIH0pOwogIGBgYAoKICBUaGUgdHdvIHN0cmF0 ZWdpZXMgY2FuIGJlIGNvbWJpbmVkOgoKICBgYGBqYXZhc2NyaXB0CiAgYUNv bnRhaW5lciA9IEVtYmVyLkNvbnRhaW5lclZpZXcuY3JlYXRlKHsKICAgIGNo aWxkVmlld3M6IFsnYVZpZXcnLCBFbWJlci5WaWV3LmNyZWF0ZSgpXSwKICAg IGFWaWV3OiBFbWJlci5WaWV3LmNyZWF0ZSgpCiAgfSk7CiAgYGBgCgogIEVh Y2ggY2hpbGQgdmlldydzIHJlbmRlcmluZyB3aWxsIGJlIGluc2VydGVkIGlu dG8gdGhlIGNvbnRhaW5lcidzIHJlbmRlcmVkCiAgSFRNTCBpbiB0aGUgc2Ft ZSBvcmRlciBhcyBpdHMgcG9zaXRpb24gaW4gdGhlIGBjaGlsZFZpZXdzYCBw cm9wZXJ0eS4KCiAgIyMgQWRkaW5nIGFuZCBSZW1vdmluZyBDaGlsZCBWaWV3 cwoKICBUaGUgY29udGFpbmVyIHZpZXcgaW1wbGVtZW50cyBgRW1iZXIuTXV0 YWJsZUFycmF5YCBhbGxvd2luZyBwcm9ncmFtbWF0aWMgbWFuYWdlbWVudCBv ZiBpdHMgY2hpbGQgdmlld3MuCgogIFRvIHJlbW92ZSBhIHZpZXcsIHBhc3Mg dGhhdCB2aWV3IGludG8gYSBgcmVtb3ZlT2JqZWN0YCBjYWxsIG9uIHRoZSBj b250YWluZXIgdmlldy4KCiAgR2l2ZW4gYW4gZW1wdHkgYDxib2R5PmAgdGhl IGZvbGxvd2luZyBjb2RlCgogIGBgYGphdmFzY3JpcHQKICBhQ29udGFpbmVy ID0gRW1iZXIuQ29udGFpbmVyVmlldy5jcmVhdGUoewogICAgY2xhc3NOYW1l czogWyd0aGUtY29udGFpbmVyJ10sCiAgICBjaGlsZFZpZXdzOiBbJ2FWaWV3 JywgJ2JWaWV3J10sCiAgICBhVmlldzogRW1iZXIuVmlldy5jcmVhdGUoewog ICAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCJBIikK ICAgIH0pLAogICAgYlZpZXc6IEVtYmVyLlZpZXcuY3JlYXRlKHsKICAgICAg dGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgiQiIpCiAgICB9 KQogIH0pOwoKICBhQ29udGFpbmVyLmFwcGVuZFRvKCdib2R5Jyk7CiAgYGBg CgogIFJlc3VsdHMgaW4gdGhlIEhUTUwKCiAgYGBgaHRtbAogIDxkaXYgY2xh c3M9ImVtYmVyLXZpZXcgdGhlLWNvbnRhaW5lciI+CiAgICA8ZGl2IGNsYXNz PSJlbWJlci12aWV3Ij5BPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJlbWJlci12 aWV3Ij5CPC9kaXY+CiAgPC9kaXY+CiAgYGBgCgogIFJlbW92aW5nIGEgdmll dwoKICBgYGBqYXZhc2NyaXB0CiAgYUNvbnRhaW5lci50b0FycmF5KCk7ICAv LyBbYUNvbnRhaW5lci5hVmlldywgYUNvbnRhaW5lci5iVmlld10KICBhQ29u dGFpbmVyLnJlbW92ZU9iamVjdChhQ29udGFpbmVyLmdldCgnYlZpZXcnKSk7 CiAgYUNvbnRhaW5lci50b0FycmF5KCk7ICAvLyBbYUNvbnRhaW5lci5hVmll d10KICBgYGAKCiAgV2lsbCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1M CgogIGBgYGh0bWwKICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3IHRoZS1jb250 YWluZXIiPgogICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+QTwvZGl2Pgog IDwvZGl2PgogIGBgYAoKICBTaW1pbGFybHksIGFkZGluZyBhIGNoaWxkIHZp ZXcgaXMgYWNjb21wbGlzaGVkIGJ5IGFkZGluZyBgRW1iZXIuVmlld2AgaW5z dGFuY2VzIHRvIHRoZQogIGNvbnRhaW5lciB2aWV3LgoKICBHaXZlbiBhbiBl bXB0eSBgPGJvZHk+YCB0aGUgZm9sbG93aW5nIGNvZGUKCiAgYGBgamF2YXNj cmlwdAogIGFDb250YWluZXIgPSBFbWJlci5Db250YWluZXJWaWV3LmNyZWF0 ZSh7CiAgICBjbGFzc05hbWVzOiBbJ3RoZS1jb250YWluZXInXSwKICAgIGNo aWxkVmlld3M6IFsnYVZpZXcnLCAnYlZpZXcnXSwKICAgIGFWaWV3OiBFbWJl ci5WaWV3LmNyZWF0ZSh7CiAgICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGVi YXJzLmNvbXBpbGUoIkEiKQogICAgfSksCiAgICBiVmlldzogRW1iZXIuVmll dy5jcmVhdGUoewogICAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5j b21waWxlKCJCIikKICAgIH0pCiAgfSk7CgogIGFDb250YWluZXIuYXBwZW5k VG8oJ2JvZHknKTsKICBgYGAKCiAgUmVzdWx0cyBpbiB0aGUgSFRNTAoKICBg YGBodG1sCiAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyB0aGUtY29udGFpbmVy Ij4KICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPkE8L2Rpdj4KICAgIDxk aXYgY2xhc3M9ImVtYmVyLXZpZXciPkI8L2Rpdj4KICA8L2Rpdj4KICBgYGAK CiAgQWRkaW5nIGEgdmlldwoKICBgYGBqYXZhc2NyaXB0CiAgQW5vdGhlclZp ZXdDbGFzcyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKICAgIHRlbXBsYXRlOiBF bWJlci5IYW5kbGViYXJzLmNvbXBpbGUoIkFub3RoZXIgdmlldyIpCiAgfSk7 CgogIGFDb250YWluZXIudG9BcnJheSgpOyAgLy8gW2FDb250YWluZXIuYVZp ZXcsIGFDb250YWluZXIuYlZpZXddCiAgYUNvbnRhaW5lci5wdXNoT2JqZWN0 KEFub3RoZXJWaWV3Q2xhc3MuY3JlYXRlKCkpOwogIGFDb250YWluZXIudG9B cnJheSgpOyAvLyBbYUNvbnRhaW5lci5hVmlldywgYUNvbnRhaW5lci5iVmll dywgPEFub3RoZXJWaWV3Q2xhc3MgaW5zdGFuY2U+XQogIGBgYAoKICBXaWxs IHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUwKCiAgYGBgaHRtbAogIDxk aXYgY2xhc3M9ImVtYmVyLXZpZXcgdGhlLWNvbnRhaW5lciI+CiAgICA8ZGl2 IGNsYXNzPSJlbWJlci12aWV3Ij5BPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJl bWJlci12aWV3Ij5CPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3 Ij5Bbm90aGVyIHZpZXc8L2Rpdj4KICA8L2Rpdj4KICBgYGAKCiAgIyMgVGVt cGxhdGVzIGFuZCBMYXlvdXQKCiAgQSBgdGVtcGxhdGVgLCBgdGVtcGxhdGVO YW1lYCwgYGRlZmF1bHRUZW1wbGF0ZWAsIGBsYXlvdXRgLCBgbGF5b3V0TmFt ZWAgb3IKICBgZGVmYXVsdExheW91dGAgcHJvcGVydHkgb24gYSBjb250YWlu ZXIgdmlldyB3aWxsIG5vdCByZXN1bHQgaW4gdGhlIHRlbXBsYXRlCiAgb3Ig bGF5b3V0IGJlaW5nIHJlbmRlcmVkLiBUaGUgSFRNTCBjb250ZW50cyBvZiBh IGBFbWJlci5Db250YWluZXJWaWV3YCdzIERPTQogIHJlcHJlc2VudGF0aW9u IHdpbGwgb25seSBiZSB0aGUgcmVuZGVyZWQgSFRNTCBvZiBpdHMgY2hpbGQg dmlld3MuCgogIEBjbGFzcyBDb250YWluZXJWaWV3CiAgQG5hbWVzcGFjZSBF bWJlcgogIEBleHRlbmRzIEVtYmVyLlZpZXcKKi8KRW1iZXIuQ29udGFpbmVy VmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKEVtYmVyLk11dGFibGVBcnJheSwg ewogIHN0YXRlczogc3RhdGVzLAoKICBpbml0OiBmdW5jdGlvbigpIHsKICAg IHRoaXMuX3N1cGVyKCk7CgogICAgdmFyIGNoaWxkVmlld3MgPSBnZXQodGhp cywgJ2NoaWxkVmlld3MnKTsKCiAgICAvLyByZWRlZmluZSB2aWV3J3MgY2hp bGRWaWV3cyBwcm9wZXJ0eSB0aGF0IHdhcyBvYmxpdGVyYXRlZAogICAgRW1i ZXIuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NoaWxkVmlld3MnLCBFbWJlci5W aWV3LmNoaWxkVmlld3NQcm9wZXJ0eSk7CgogICAgdmFyIF9jaGlsZFZpZXdz ID0gdGhpcy5fY2hpbGRWaWV3czsKCiAgICBmb3JFYWNoKGNoaWxkVmlld3Ms IGZ1bmN0aW9uKHZpZXdOYW1lLCBpZHgpIHsKICAgICAgdmFyIHZpZXc7Cgog ICAgICBpZiAoJ3N0cmluZycgPT09IHR5cGVvZiB2aWV3TmFtZSkgewogICAg ICAgIHZpZXcgPSBnZXQodGhpcywgdmlld05hbWUpOwogICAgICAgIHZpZXcg PSB0aGlzLmNyZWF0ZUNoaWxkVmlldyh2aWV3KTsKICAgICAgICBzZXQodGhp cywgdmlld05hbWUsIHZpZXcpOwogICAgICB9IGVsc2UgewogICAgICAgIHZp ZXcgPSB0aGlzLmNyZWF0ZUNoaWxkVmlldyh2aWV3TmFtZSk7CiAgICAgIH0K CiAgICAgIF9jaGlsZFZpZXdzW2lkeF0gPSB2aWV3OwogICAgfSwgdGhpcyk7 CgogICAgdmFyIGN1cnJlbnRWaWV3ID0gZ2V0KHRoaXMsICdjdXJyZW50Vmll dycpOwogICAgaWYgKGN1cnJlbnRWaWV3KSB7CiAgICAgIGlmICghX2NoaWxk Vmlld3MubGVuZ3RoKSB7IF9jaGlsZFZpZXdzID0gdGhpcy5fY2hpbGRWaWV3 cyA9IHRoaXMuX2NoaWxkVmlld3Muc2xpY2UoKTsgfQogICAgICBfY2hpbGRW aWV3cy5wdXNoKHRoaXMuY3JlYXRlQ2hpbGRWaWV3KGN1cnJlbnRWaWV3KSk7 CiAgICB9CiAgfSwKCiAgcmVwbGFjZTogZnVuY3Rpb24oaWR4LCByZW1vdmVk Q291bnQsIGFkZGVkVmlld3MpIHsKICAgIHZhciBhZGRlZENvdW50ID0gYWRk ZWRWaWV3cyA/IGdldChhZGRlZFZpZXdzLCAnbGVuZ3RoJykgOiAwOwogICAg dmFyIHNlbGYgPSB0aGlzOwogICAgRW1iZXIuYXNzZXJ0KCJZb3UgY2FuJ3Qg YWRkIGEgY2hpbGQgdG8gYSBjb250YWluZXIgdGhhdCBpcyBhbHJlYWR5IGEg Y2hpbGQgb2YgYW5vdGhlciB2aWV3IiwgRW1iZXIuQShhZGRlZFZpZXdzKS5l dmVyeShmdW5jdGlvbihpdGVtKSB7IHJldHVybiAhZ2V0KGl0ZW0sICdfcGFy ZW50VmlldycpIHx8IGdldChpdGVtLCAnX3BhcmVudFZpZXcnKSA9PT0gc2Vs ZjsgfSkpOwoKICAgIHRoaXMuYXJyYXlDb250ZW50V2lsbENoYW5nZShpZHgs IHJlbW92ZWRDb3VudCwgYWRkZWRDb3VudCk7CiAgICB0aGlzLmNoaWxkVmll d3NXaWxsQ2hhbmdlKHRoaXMuX2NoaWxkVmlld3MsIGlkeCwgcmVtb3ZlZENv dW50KTsKCiAgICBpZiAoYWRkZWRDb3VudCA9PT0gMCkgewogICAgICB0aGlz Ll9jaGlsZFZpZXdzLnNwbGljZShpZHgsIHJlbW92ZWRDb3VudCkgOwogICAg fSBlbHNlIHsKICAgICAgdmFyIGFyZ3MgPSBbaWR4LCByZW1vdmVkQ291bnRd LmNvbmNhdChhZGRlZFZpZXdzKTsKICAgICAgaWYgKGFkZGVkVmlld3MubGVu Z3RoICYmICF0aGlzLl9jaGlsZFZpZXdzLmxlbmd0aCkgeyB0aGlzLl9jaGls ZFZpZXdzID0gdGhpcy5fY2hpbGRWaWV3cy5zbGljZSgpOyB9CiAgICAgIHRo aXMuX2NoaWxkVmlld3Muc3BsaWNlLmFwcGx5KHRoaXMuX2NoaWxkVmlld3Ms IGFyZ3MpOwogICAgfQoKICAgIHRoaXMuYXJyYXlDb250ZW50RGlkQ2hhbmdl KGlkeCwgcmVtb3ZlZENvdW50LCBhZGRlZENvdW50KTsKICAgIHRoaXMuY2hp bGRWaWV3c0RpZENoYW5nZSh0aGlzLl9jaGlsZFZpZXdzLCBpZHgsIHJlbW92 ZWRDb3VudCwgYWRkZWRDb3VudCk7CgogICAgcmV0dXJuIHRoaXM7CiAgfSwK CiAgb2JqZWN0QXQ6IGZ1bmN0aW9uKGlkeCkgewogICAgcmV0dXJuIHRoaXMu X2NoaWxkVmlld3NbaWR4XTsKICB9LAoKICBsZW5ndGg6IEVtYmVyLmNvbXB1 dGVkKGZ1bmN0aW9uICgpIHsKICAgIHJldHVybiB0aGlzLl9jaGlsZFZpZXdz Lmxlbmd0aDsKICB9KS52b2xhdGlsZSgpLAoKICAvKioKICAgIEluc3RydWN0 cyBlYWNoIGNoaWxkIHZpZXcgdG8gcmVuZGVyIHRvIHRoZSBwYXNzZWQgcmVu ZGVyIGJ1ZmZlci4KCiAgICBAcHJpdmF0ZQogICAgQG1ldGhvZCByZW5kZXIK ICAgIEBwYXJhbSB7RW1iZXIuUmVuZGVyQnVmZmVyfSBidWZmZXIgdGhlIGJ1 ZmZlciB0byByZW5kZXIgdG8KICAqLwogIHJlbmRlcjogZnVuY3Rpb24oYnVm ZmVyKSB7CiAgICB0aGlzLmZvckVhY2hDaGlsZFZpZXcoZnVuY3Rpb24odmll dykgewogICAgICB2aWV3LnJlbmRlclRvQnVmZmVyKGJ1ZmZlcik7CiAgICB9 KTsKICB9LAoKICBpbnN0cnVtZW50TmFtZTogJ2NvbnRhaW5lcicsCgogIC8q KgogICAgV2hlbiBhIGNoaWxkIHZpZXcgaXMgcmVtb3ZlZCwgZGVzdHJveSBp dHMgZWxlbWVudCBzbyB0aGF0CiAgICBpdCBpcyByZW1vdmVkIGZyb20gdGhl IERPTS4KCiAgICBUaGUgYXJyYXkgb2JzZXJ2ZXIgdGhhdCB0cmlnZ2VycyB0 aGlzIGFjdGlvbiBpcyBzZXQgdXAgaW4gdGhlCiAgICBgcmVuZGVyVG9CdWZm ZXJgIG1ldGhvZC4KCiAgICBAcHJpdmF0ZQogICAgQG1ldGhvZCBjaGlsZFZp ZXdzV2lsbENoYW5nZQogICAgQHBhcmFtIHtFbWJlci5BcnJheX0gdmlld3Mg dGhlIGNoaWxkIHZpZXdzIGFycmF5IGJlZm9yZSBtdXRhdGlvbgogICAgQHBh cmFtIHtOdW1iZXJ9IHN0YXJ0IHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUg bXV0YXRpb24KICAgIEBwYXJhbSB7TnVtYmVyfSByZW1vdmVkIHRoZSBudW1i ZXIgb2YgY2hpbGQgdmlld3MgcmVtb3ZlZAogICoqLwogIGNoaWxkVmlld3NX aWxsQ2hhbmdlOiBmdW5jdGlvbih2aWV3cywgc3RhcnQsIHJlbW92ZWQpIHsK ICAgIHRoaXMucHJvcGVydHlXaWxsQ2hhbmdlKCdjaGlsZFZpZXdzJyk7Cgog ICAgaWYgKHJlbW92ZWQgPiAwKSB7CiAgICAgIHZhciBjaGFuZ2VkVmlld3Mg PSB2aWV3cy5zbGljZShzdGFydCwgc3RhcnQrcmVtb3ZlZCk7CiAgICAgIC8v IHRyYW5zaXRpb24gdG8gcHJlUmVuZGVyIGJlZm9yZSBjbGVhcmluZyBwYXJl bnRWaWV3CiAgICAgIHRoaXMuY3VycmVudFN0YXRlLmNoaWxkVmlld3NXaWxs Q2hhbmdlKHRoaXMsIHZpZXdzLCBzdGFydCwgcmVtb3ZlZCk7CiAgICAgIHRo aXMuaW5pdGlhbGl6ZVZpZXdzKGNoYW5nZWRWaWV3cywgbnVsbCwgbnVsbCk7 CiAgICB9CiAgfSwKCiAgcmVtb3ZlQ2hpbGQ6IGZ1bmN0aW9uKGNoaWxkKSB7 CiAgICB0aGlzLnJlbW92ZU9iamVjdChjaGlsZCk7CiAgICByZXR1cm4gdGhp czsKICB9LAoKICAvKioKICAgIFdoZW4gYSBjaGlsZCB2aWV3IGlzIGFkZGVk LCBtYWtlIHN1cmUgdGhlIERPTSBnZXRzIHVwZGF0ZWQgYXBwcm9wcmlhdGVs eS4KCiAgICBJZiB0aGUgdmlldyBoYXMgYWxyZWFkeSByZW5kZXJlZCBhbiBl bGVtZW50LCB3ZSB0ZWxsIHRoZSBjaGlsZCB2aWV3IHRvCiAgICBjcmVhdGUg YW4gZWxlbWVudCBhbmQgaW5zZXJ0IGl0IGludG8gdGhlIERPTS4gSWYgdGhl IGVuY2xvc2luZyBjb250YWluZXIKICAgIHZpZXcgaGFzIGFscmVhZHkgd3Jp dHRlbiB0byBhIGJ1ZmZlciwgYnV0IG5vdCB5ZXQgY29udmVydGVkIHRoYXQg YnVmZmVyCiAgICBpbnRvIGFuIGVsZW1lbnQsIHdlIGluc2VydCB0aGUgc3Ry aW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjaGlsZCBpbnRvIHRoZQogICAg YXBwcm9wcmlhdGUgcGxhY2UgaW4gdGhlIGJ1ZmZlci4KCiAgICBAcHJpdmF0 ZQogICAgQG1ldGhvZCBjaGlsZFZpZXdzRGlkQ2hhbmdlCiAgICBAcGFyYW0g e0VtYmVyLkFycmF5fSB2aWV3cyB0aGUgYXJyYXkgb2YgY2hpbGQgdmlld3Mg YWZ0ZSB0aGUgbXV0YXRpb24gaGFzIG9jY3VycmVkCiAgICBAcGFyYW0ge051 bWJlcn0gc3RhcnQgdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBtdXRhdGlv bgogICAgQHBhcmFtIHtOdW1iZXJ9IHJlbW92ZWQgdGhlIG51bWJlciBvZiBj aGlsZCB2aWV3cyByZW1vdmVkCiAgICBAcGFyYW0ge051bWJlcn0gdGhlIG51 bWJlciBvZiBjaGlsZCB2aWV3cyBhZGRlZAogICovCiAgY2hpbGRWaWV3c0Rp ZENoYW5nZTogZnVuY3Rpb24odmlld3MsIHN0YXJ0LCByZW1vdmVkLCBhZGRl ZCkgewogICAgaWYgKGFkZGVkID4gMCkgewogICAgICB2YXIgY2hhbmdlZFZp ZXdzID0gdmlld3Muc2xpY2Uoc3RhcnQsIHN0YXJ0K2FkZGVkKTsKICAgICAg dGhpcy5pbml0aWFsaXplVmlld3MoY2hhbmdlZFZpZXdzLCB0aGlzLCBnZXQo dGhpcywgJ3RlbXBsYXRlRGF0YScpKTsKICAgICAgdGhpcy5jdXJyZW50U3Rh dGUuY2hpbGRWaWV3c0RpZENoYW5nZSh0aGlzLCB2aWV3cywgc3RhcnQsIGFk ZGVkKTsKICAgIH0KICAgIHRoaXMucHJvcGVydHlEaWRDaGFuZ2UoJ2NoaWxk Vmlld3MnKTsKICB9LAoKICBpbml0aWFsaXplVmlld3M6IGZ1bmN0aW9uKHZp ZXdzLCBwYXJlbnRWaWV3LCB0ZW1wbGF0ZURhdGEpIHsKICAgIGZvckVhY2go dmlld3MsIGZ1bmN0aW9uKHZpZXcpIHsKICAgICAgc2V0KHZpZXcsICdfcGFy ZW50VmlldycsIHBhcmVudFZpZXcpOwoKICAgICAgaWYgKCF2aWV3LmNvbnRh aW5lciAmJiBwYXJlbnRWaWV3KSB7CiAgICAgICAgc2V0KHZpZXcsICdjb250 YWluZXInLCBwYXJlbnRWaWV3LmNvbnRhaW5lcik7CiAgICAgIH0KCiAgICAg IGlmICghZ2V0KHZpZXcsICd0ZW1wbGF0ZURhdGEnKSkgewogICAgICAgIHNl dCh2aWV3LCAndGVtcGxhdGVEYXRhJywgdGVtcGxhdGVEYXRhKTsKICAgICAg fQogICAgfSk7CiAgfSwKCiAgY3VycmVudFZpZXc6IG51bGwsCgogIF9jdXJy ZW50Vmlld1dpbGxDaGFuZ2U6IEVtYmVyLmJlZm9yZU9ic2VydmVyKCdjdXJy ZW50VmlldycsIGZ1bmN0aW9uKCkgewogICAgdmFyIGN1cnJlbnRWaWV3ID0g Z2V0KHRoaXMsICdjdXJyZW50VmlldycpOwogICAgaWYgKGN1cnJlbnRWaWV3 KSB7CiAgICAgIGN1cnJlbnRWaWV3LmRlc3Ryb3koKTsKICAgIH0KICB9KSwK CiAgX2N1cnJlbnRWaWV3RGlkQ2hhbmdlOiBFbWJlci5vYnNlcnZlcignY3Vy cmVudFZpZXcnLCBmdW5jdGlvbigpIHsKICAgIHZhciBjdXJyZW50VmlldyA9 IGdldCh0aGlzLCAnY3VycmVudFZpZXcnKTsKICAgIGlmIChjdXJyZW50Vmll dykgewogICAgICBFbWJlci5hc3NlcnQoIllvdSB0cmllZCB0byBzZXQgYSBj dXJyZW50IHZpZXcgdGhhdCBhbHJlYWR5IGhhcyBhIHBhcmVudC4gTWFrZSBz dXJlIHlvdSBkb24ndCBoYXZlIG11bHRpcGxlIG91dGxldHMgaW4gdGhlIHNh bWUgdmlldy4iLCAhZ2V0KGN1cnJlbnRWaWV3LCAnX3BhcmVudFZpZXcnKSk7 CiAgICAgIHRoaXMucHVzaE9iamVjdChjdXJyZW50Vmlldyk7CiAgICB9CiAg fSksCgogIF9lbnN1cmVDaGlsZHJlbkFyZUluRE9NOiBmdW5jdGlvbiAoKSB7 CiAgICB0aGlzLmN1cnJlbnRTdGF0ZS5lbnN1cmVDaGlsZHJlbkFyZUluRE9N KHRoaXMpOwogIH0KfSk7CgpFbWJlci5tZXJnZShzdGF0ZXMuX2RlZmF1bHQs IHsKICBjaGlsZFZpZXdzV2lsbENoYW5nZTogRW1iZXIuSywKICBjaGlsZFZp ZXdzRGlkQ2hhbmdlOiBFbWJlci5LLAogIGVuc3VyZUNoaWxkcmVuQXJlSW5E T006IEVtYmVyLksKfSk7CgpFbWJlci5tZXJnZShzdGF0ZXMuaW5CdWZmZXIs IHsKICBjaGlsZFZpZXdzRGlkQ2hhbmdlOiBmdW5jdGlvbihwYXJlbnRWaWV3 LCB2aWV3cywgc3RhcnQsIGFkZGVkKSB7CiAgICB0aHJvdyBuZXcgRW1iZXIu RXJyb3IoJ1lvdSBjYW5ub3QgbW9kaWZ5IGNoaWxkIHZpZXdzIHdoaWxlIGlu IHRoZSBpbkJ1ZmZlciBzdGF0ZScpOwogIH0KfSk7CgpFbWJlci5tZXJnZShz dGF0ZXMuaGFzRWxlbWVudCwgewogIGNoaWxkVmlld3NXaWxsQ2hhbmdlOiBm dW5jdGlvbih2aWV3LCB2aWV3cywgc3RhcnQsIHJlbW92ZWQpIHsKICAgIGZv ciAodmFyIGk9c3RhcnQ7IGk8c3RhcnQrcmVtb3ZlZDsgaSsrKSB7CiAgICAg IHZpZXdzW2ldLnJlbW92ZSgpOwogICAgfQogIH0sCgogIGNoaWxkVmlld3NE aWRDaGFuZ2U6IGZ1bmN0aW9uKHZpZXcsIHZpZXdzLCBzdGFydCwgYWRkZWQp IHsKICAgIEVtYmVyLnJ1bi5zY2hlZHVsZU9uY2UoJ3JlbmRlcicsIHZpZXcs ICdfZW5zdXJlQ2hpbGRyZW5BcmVJbkRPTScpOwogIH0sCgogIGVuc3VyZUNo aWxkcmVuQXJlSW5ET006IGZ1bmN0aW9uKHZpZXcpIHsKICAgIHZhciBjaGls ZFZpZXdzID0gdmlldy5fY2hpbGRWaWV3cywgaSwgbGVuLCBjaGlsZFZpZXcs IHByZXZpb3VzLCBidWZmZXIsIHZpZXdDb2xsZWN0aW9uID0gbmV3IFZpZXdD b2xsZWN0aW9uKCk7CgogICAgZm9yIChpID0gMCwgbGVuID0gY2hpbGRWaWV3 cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICBjaGlsZFZpZXcgPSBj aGlsZFZpZXdzW2ldOwoKICAgICAgaWYgKCFidWZmZXIpIHsgYnVmZmVyID0g RW1iZXIuUmVuZGVyQnVmZmVyKCk7IGJ1ZmZlci5faGFzRWxlbWVudCA9IGZh bHNlOyB9CgogICAgICBpZiAoY2hpbGRWaWV3LnJlbmRlclRvQnVmZmVySWZO ZWVkZWQoYnVmZmVyKSkgewogICAgICAgIHZpZXdDb2xsZWN0aW9uLnB1c2go Y2hpbGRWaWV3KTsKICAgICAgfSBlbHNlIGlmICh2aWV3Q29sbGVjdGlvbi5s ZW5ndGgpIHsKICAgICAgICBpbnNlcnRWaWV3Q29sbGVjdGlvbih2aWV3LCB2 aWV3Q29sbGVjdGlvbiwgcHJldmlvdXMsIGJ1ZmZlcik7CiAgICAgICAgYnVm ZmVyID0gbnVsbDsKICAgICAgICBwcmV2aW91cyA9IGNoaWxkVmlldzsKICAg ICAgICB2aWV3Q29sbGVjdGlvbi5jbGVhcigpOwogICAgICB9IGVsc2Ugewog ICAgICAgIHByZXZpb3VzID0gY2hpbGRWaWV3OwogICAgICB9CiAgICB9Cgog ICAgaWYgKHZpZXdDb2xsZWN0aW9uLmxlbmd0aCkgewogICAgICBpbnNlcnRW aWV3Q29sbGVjdGlvbih2aWV3LCB2aWV3Q29sbGVjdGlvbiwgcHJldmlvdXMs IGJ1ZmZlcik7CiAgICB9CiAgfQp9KTsKCmZ1bmN0aW9uIGluc2VydFZpZXdD b2xsZWN0aW9uKHZpZXcsIHZpZXdDb2xsZWN0aW9uLCBwcmV2aW91cywgYnVm ZmVyKSB7CiAgdmlld0NvbGxlY3Rpb24udHJpZ2dlclJlY3Vyc2l2ZWx5KCd3 aWxsSW5zZXJ0RWxlbWVudCcpOwoKICBpZiAocHJldmlvdXMpIHsKICAgIHBy ZXZpb3VzLmRvbU1hbmFnZXIuYWZ0ZXIocHJldmlvdXMsIGJ1ZmZlci5zdHJp bmcoKSk7CiAgfSBlbHNlIHsKICAgIHZpZXcuZG9tTWFuYWdlci5wcmVwZW5k KHZpZXcsIGJ1ZmZlci5zdHJpbmcoKSk7CiAgfQoKICB2aWV3Q29sbGVjdGlv bi5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsKICAgIHYudHJhbnNpdGlvblRvKCdp bkRPTScpOwogICAgdi5wcm9wZXJ0eURpZENoYW5nZSgnZWxlbWVudCcpOwog ICAgdi50cmlnZ2VyUmVjdXJzaXZlbHkoJ2RpZEluc2VydEVsZW1lbnQnKTsK ICB9KTsKfQoKCn0pKCk7CgoKCihmdW5jdGlvbigpIHsKLyoqCkBtb2R1bGUg ZW1iZXIKQHN1Ym1vZHVsZSBlbWJlci12aWV3cwoqLwoKdmFyIGdldCA9IEVt YmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0LCBmbXQgPSBFbWJlci5TdHJpbmcu Zm10OwoKLyoqCiAgYEVtYmVyLkNvbGxlY3Rpb25WaWV3YCBpcyBhbiBgRW1i ZXIuVmlld2AgZGVzY2VuZGVudCByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcK ICBhIGNvbGxlY3Rpb24gKGFuIGFycmF5IG9yIGFycmF5LWxpa2Ugb2JqZWN0 KSBieSBtYWludGFpbmluZyBhIGNoaWxkIHZpZXcgb2JqZWN0CiAgYW5kIGFz c29jaWF0ZWQgRE9NIHJlcHJlc2VudGF0aW9uIGZvciBlYWNoIGl0ZW0gaW4g dGhlIGFycmF5IGFuZCBlbnN1cmluZwogIHRoYXQgY2hpbGQgdmlld3MgYW5k IHRoZWlyIGFzc29jaWF0ZWQgcmVuZGVyZWQgSFRNTCBhcmUgdXBkYXRlZCB3 aGVuIGl0ZW1zIGluCiAgdGhlIGFycmF5IGFyZSBhZGRlZCwgcmVtb3ZlZCwg b3IgcmVwbGFjZWQuCgogICMjIFNldHRpbmcgY29udGVudAoKICBUaGUgbWFu YWdlZCBjb2xsZWN0aW9uIG9mIG9iamVjdHMgaXMgcmVmZXJlbmNlZCBhcyB0 aGUgYEVtYmVyLkNvbGxlY3Rpb25WaWV3YAogIGluc3RhbmNlJ3MgYGNvbnRl bnRgIHByb3BlcnR5LgoKICBgYGBqYXZhc2NyaXB0CiAgc29tZUl0ZW1zVmll dyA9IEVtYmVyLkNvbGxlY3Rpb25WaWV3LmNyZWF0ZSh7CiAgICBjb250ZW50 OiBbJ0EnLCAnQicsJ0MnXQogIH0pCiAgYGBgCgogIFRoZSB2aWV3IGZvciBl YWNoIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb24gd2lsbCBoYXZlIGl0cyBgY29u dGVudGAgcHJvcGVydHkgc2V0CiAgdG8gdGhlIGl0ZW0uCgogICMjIFNwZWNp ZnlpbmcgaXRlbVZpZXdDbGFzcwoKICBCeSBkZWZhdWx0IHRoZSB2aWV3IGNs YXNzIGZvciBlYWNoIGl0ZW0gaW4gdGhlIG1hbmFnZWQgY29sbGVjdGlvbiB3 aWxsIGJlIGFuCiAgaW5zdGFuY2Ugb2YgYEVtYmVyLlZpZXdgLiBZb3UgY2Fu IHN1cHBseSBhIGRpZmZlcmVudCBjbGFzcyBieSBzZXR0aW5nIHRoZQogIGBD b2xsZWN0aW9uVmlld2AncyBgaXRlbVZpZXdDbGFzc2AgcHJvcGVydHkuCgog IEdpdmVuIGFuIGVtcHR5IGA8Ym9keT5gIGFuZCB0aGUgZm9sbG93aW5nIGNv ZGU6CgogIGBgYGphdmFzY3JpcHQKICBzb21lSXRlbXNWaWV3ID0gRW1iZXIu Q29sbGVjdGlvblZpZXcuY3JlYXRlKHsKICAgIGNsYXNzTmFtZXM6IFsnYS1j b2xsZWN0aW9uJ10sCiAgICBjb250ZW50OiBbJ0EnLCdCJywnQyddLAogICAg aXRlbVZpZXdDbGFzczogRW1iZXIuVmlldy5leHRlbmQoewogICAgICB0ZW1w bGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCJ0aGUgbGV0dGVyOiB7 e3ZpZXcuY29udGVudH19IikKICAgIH0pCiAgfSk7CgogIHNvbWVJdGVtc1Zp ZXcuYXBwZW5kVG8oJ2JvZHknKTsKICBgYGAKCiAgV2lsbCByZXN1bHQgaW4g dGhlIGZvbGxvd2luZyBIVE1MIHN0cnVjdHVyZQoKICBgYGBodG1sCiAgPGRp diBjbGFzcz0iZW1iZXItdmlldyBhLWNvbGxlY3Rpb24iPgogICAgPGRpdiBj bGFzcz0iZW1iZXItdmlldyI+dGhlIGxldHRlcjogQTwvZGl2PgogICAgPGRp diBjbGFzcz0iZW1iZXItdmlldyI+dGhlIGxldHRlcjogQjwvZGl2PgogICAg PGRpdiBjbGFzcz0iZW1iZXItdmlldyI+dGhlIGxldHRlcjogQzwvZGl2Pgog IDwvZGl2PgogIGBgYAoKICAjIyBBdXRvbWF0aWMgbWF0Y2hpbmcgb2YgcGFy ZW50L2NoaWxkIHRhZ05hbWVzCgogIFNldHRpbmcgdGhlIGB0YWdOYW1lYCBw cm9wZXJ0eSBvZiBhIGBDb2xsZWN0aW9uVmlld2AgdG8gYW55IG9mCiAgInVs IiwgIm9sIiwgInRhYmxlIiwgInRoZWFkIiwgInRib2R5IiwgInRmb290Iiwg InRyIiwgb3IgInNlbGVjdCIgd2lsbCByZXN1bHQKICBpbiB0aGUgaXRlbSB2 aWV3cyByZWNlaXZpbmcgYW4gYXBwcm9wcmlhdGVseSBtYXRjaGVkIGB0YWdO YW1lYCBwcm9wZXJ0eS4KCiAgR2l2ZW4gYW4gZW1wdHkgYDxib2R5PmAgYW5k IHRoZSBmb2xsb3dpbmcgY29kZToKCiAgYGBgamF2YXNjcmlwdAogIGFuVW5v cmRlcmVkTGlzdFZpZXcgPSBFbWJlci5Db2xsZWN0aW9uVmlldy5jcmVhdGUo ewogICAgdGFnTmFtZTogJ3VsJywKICAgIGNvbnRlbnQ6IFsnQScsJ0InLCdD J10sCiAgICBpdGVtVmlld0NsYXNzOiBFbWJlci5WaWV3LmV4dGVuZCh7CiAg ICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUoInRoZSBs ZXR0ZXI6IHt7dmlldy5jb250ZW50fX0iKQogICAgfSkKICB9KTsKCiAgYW5V bm9yZGVyZWRMaXN0Vmlldy5hcHBlbmRUbygnYm9keScpOwogIGBgYAoKICBX aWxsIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUwgc3RydWN0dXJlCgog IGBgYGh0bWwKICA8dWwgY2xhc3M9ImVtYmVyLXZpZXcgYS1jb2xsZWN0aW9u Ij4KICAgIDxsaSBjbGFzcz0iZW1iZXItdmlldyI+dGhlIGxldHRlcjogQTwv bGk+CiAgICA8bGkgY2xhc3M9ImVtYmVyLXZpZXciPnRoZSBsZXR0ZXI6IEI8 L2xpPgogICAgPGxpIGNsYXNzPSJlbWJlci12aWV3Ij50aGUgbGV0dGVyOiBD PC9saT4KICA8L3VsPgogIGBgYAoKICBBZGRpdGlvbmFsIGB0YWdOYW1lYCBw YWlycyBjYW4gYmUgcHJvdmlkZWQgYnkgYWRkaW5nIHRvCiAgYEVtYmVyLkNv bGxlY3Rpb25WaWV3LkNPTlRBSU5FUl9NQVAgYAoKICBgYGBqYXZhc2NyaXB0 CiAgRW1iZXIuQ29sbGVjdGlvblZpZXcuQ09OVEFJTkVSX01BUFsnYXJ0aWNs ZSddID0gJ3NlY3Rpb24nCiAgYGBgCgogICMjIFByb2dyYW1tYXRpYyBjcmVh dGlvbiBvZiBjaGlsZCB2aWV3cwoKICBGb3IgY2FzZXMgd2hlcmUgYWRkaXRp b25hbCBjdXN0b21pemF0aW9uIGJleW9uZCB0aGUgdXNlIG9mIGEgc2luZ2xl CiAgYGl0ZW1WaWV3Q2xhc3NgIG9yIGB0YWdOYW1lYCBtYXRjaGluZyBpcyBy ZXF1aXJlZCBDb2xsZWN0aW9uVmlldydzCiAgYGNyZWF0ZUNoaWxkVmlld2Ag bWV0aG9kIGNhbiBiZSBvdmVyaWRkZW46CgogIGBgYGphdmFzY3JpcHQKICBD dXN0b21Db2xsZWN0aW9uVmlldyA9IEVtYmVyLkNvbGxlY3Rpb25WaWV3LmV4 dGVuZCh7CiAgICBjcmVhdGVDaGlsZFZpZXc6IGZ1bmN0aW9uKHZpZXdDbGFz cywgYXR0cnMpIHsKICAgICAgaWYgKGF0dHJzLmNvbnRlbnQua2luZCA9PSAn YWxidW0nKSB7CiAgICAgICAgdmlld0NsYXNzID0gQXBwLkFsYnVtVmlldzsK ICAgICAgfSBlbHNlIHsKICAgICAgICB2aWV3Q2xhc3MgPSBBcHAuU29uZ1Zp ZXc7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuX3N1cGVyKHZpZXdDbGFz cywgYXR0cnMpOwogICAgfQogIH0pOwogIGBgYAoKICAjIyBFbXB0eSBWaWV3 CgogIFlvdSBjYW4gcHJvdmlkZSBhbiBgRW1iZXIuVmlld2Agc3ViY2xhc3Mg dG8gdGhlIGBFbWJlci5Db2xsZWN0aW9uVmlld2AKICBpbnN0YW5jZSBhcyBp dHMgYGVtcHR5Vmlld2AgcHJvcGVydHkuIElmIHRoZSBgY29udGVudGAgcHJv cGVydHkgb2YgYQogIGBDb2xsZWN0aW9uVmlld2AgaXMgc2V0IHRvIGBudWxs YCBvciBhbiBlbXB0eSBhcnJheSwgYW4gaW5zdGFuY2Ugb2YgdGhpcyB2aWV3 CiAgd2lsbCBiZSB0aGUgYENvbGxlY3Rpb25WaWV3YHMgb25seSBjaGlsZC4K CiAgYGBgamF2YXNjcmlwdAogIGFMaXN0V2l0aE5vdGhpbmcgPSBFbWJlci5D b2xsZWN0aW9uVmlldy5jcmVhdGUoewogICAgY2xhc3NOYW1lczogWydub3Ro aW5nJ10KICAgIGNvbnRlbnQ6IG51bGwsCiAgICBlbXB0eVZpZXc6IEVtYmVy LlZpZXcuZXh0ZW5kKHsKICAgICAgdGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJh cnMuY29tcGlsZSgiVGhlIGNvbGxlY3Rpb24gaXMgZW1wdHkiKQogICAgfSkK ICB9KTsKCiAgYUxpc3RXaXRoTm90aGluZy5hcHBlbmRUbygnYm9keScpOwog IGBgYAoKICBXaWxsIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUwgc3Ry dWN0dXJlCgogIGBgYGh0bWwKICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3IG5v dGhpbmciPgogICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+CiAgICAgIFRo ZSBjb2xsZWN0aW9uIGlzIGVtcHR5CiAgICA8L2Rpdj4KICA8L2Rpdj4KICBg YGAKCiAgIyMgQWRkaW5nIGFuZCBSZW1vdmluZyBpdGVtcwoKICBUaGUgYGNo aWxkVmlld3NgIHByb3BlcnR5IG9mIGEgYENvbGxlY3Rpb25WaWV3YCBzaG91 bGQgbm90IGJlIGRpcmVjdGx5CiAgbWFuaXB1bGF0ZWQuIEluc3RlYWQsIGFk ZCwgcmVtb3ZlLCByZXBsYWNlIGl0ZW1zIGZyb20gaXRzIGBjb250ZW50YCBw cm9wZXJ0eS4KICBUaGlzIHdpbGwgdHJpZ2dlciBhcHByb3ByaWF0ZSBjaGFu Z2VzIHRvIGl0cyByZW5kZXJlZCBIVE1MLgoKCiAgQGNsYXNzIENvbGxlY3Rp b25WaWV3CiAgQG5hbWVzcGFjZSBFbWJlcgogIEBleHRlbmRzIEVtYmVyLkNv bnRhaW5lclZpZXcKICBAc2luY2UgRW1iZXIgMC45CiovCkVtYmVyLkNvbGxl Y3Rpb25WaWV3ID0gRW1iZXIuQ29udGFpbmVyVmlldy5leHRlbmQoewoKICAv KioKICAgIEEgbGlzdCBvZiBpdGVtcyB0byBiZSBkaXNwbGF5ZWQgYnkgdGhl IGBFbWJlci5Db2xsZWN0aW9uVmlld2AuCgogICAgQHByb3BlcnR5IGNvbnRl bnQKICAgIEB0eXBlIEVtYmVyLkFycmF5CiAgICBAZGVmYXVsdCBudWxsCiAg Ki8KICBjb250ZW50OiBudWxsLAoKICAvKioKICAgIFRoaXMgcHJvdmlkZXMg bWV0YWRhdGEgYWJvdXQgd2hhdCBraW5kIG9mIGVtcHR5IHZpZXcgY2xhc3Mg dGhpcwogICAgY29sbGVjdGlvbiB3b3VsZCBsaWtlIGlmIGl0IGlzIGJlaW5n IGluc3RhbnRpYXRlZCBmcm9tIGFub3RoZXIKICAgIHN5c3RlbSAobGlrZSBI YW5kbGViYXJzKQoKICAgIEBwcml2YXRlCiAgICBAcHJvcGVydHkgZW1wdHlW aWV3Q2xhc3MKICAqLwogIGVtcHR5Vmlld0NsYXNzOiBFbWJlci5WaWV3LAoK ICAvKioKICAgIEFuIG9wdGlvbmFsIHZpZXcgdG8gZGlzcGxheSBpZiBjb250 ZW50IGlzIHNldCB0byBhbiBlbXB0eSBhcnJheS4KCiAgICBAcHJvcGVydHkg ZW1wdHlWaWV3CiAgICBAdHlwZSBFbWJlci5WaWV3CiAgICBAZGVmYXVsdCBu dWxsCiAgKi8KICBlbXB0eVZpZXc6IG51bGwsCgogIC8qKgogICAgQHByb3Bl cnR5IGl0ZW1WaWV3Q2xhc3MKICAgIEB0eXBlIEVtYmVyLlZpZXcKICAgIEBk ZWZhdWx0IEVtYmVyLlZpZXcKICAqLwogIGl0ZW1WaWV3Q2xhc3M6IEVtYmVy LlZpZXcsCgogIC8qKgogICAgU2V0dXAgYSBDb2xsZWN0aW9uVmlldwoKICAg IEBtZXRob2QgaW5pdAogICovCiAgaW5pdDogZnVuY3Rpb24oKSB7CiAgICB2 YXIgcmV0ID0gdGhpcy5fc3VwZXIoKTsKICAgIHRoaXMuX2NvbnRlbnREaWRD aGFuZ2UoKTsKICAgIHJldHVybiByZXQ7CiAgfSwKCiAgLyoqCiAgICBJbnZv a2VkIHdoZW4gdGhlIGNvbnRlbnQgcHJvcGVydHkgaXMgYWJvdXQgdG8gY2hh bmdlLiBOb3RpZmllcyBvYnNlcnZlcnMgdGhhdCB0aGUKICAgIGVudGlyZSBh cnJheSBjb250ZW50IHdpbGwgY2hhbmdlLgoKICAgIEBwcml2YXRlCiAgICBA bWV0aG9kIF9jb250ZW50V2lsbENoYW5nZQogICovCiAgX2NvbnRlbnRXaWxs Q2hhbmdlOiBFbWJlci5iZWZvcmVPYnNlcnZlcignY29udGVudCcsIGZ1bmN0 aW9uKCkgewogICAgdmFyIGNvbnRlbnQgPSB0aGlzLmdldCgnY29udGVudCcp OwoKICAgIGlmIChjb250ZW50KSB7IGNvbnRlbnQucmVtb3ZlQXJyYXlPYnNl cnZlcih0aGlzKTsgfQogICAgdmFyIGxlbiA9IGNvbnRlbnQgPyBnZXQoY29u dGVudCwgJ2xlbmd0aCcpIDogMDsKICAgIHRoaXMuYXJyYXlXaWxsQ2hhbmdl KGNvbnRlbnQsIDAsIGxlbik7CiAgfSksCgogIC8qKgogICAgQ2hlY2sgdG8g bWFrZSBzdXJlIHRoYXQgdGhlIGNvbnRlbnQgaGFzIGNoYW5nZWQsIGFuZCBp ZiBzbywKICAgIHVwZGF0ZSB0aGUgY2hpbGRyZW4gZGlyZWN0bHkuIFRoaXMg aXMgYWx3YXlzIHNjaGVkdWxlZAogICAgYXN5bmNocm9ub3VzbHksIHRvIGFs bG93IHRoZSBlbGVtZW50IHRvIGJlIGNyZWF0ZWQgYmVmb3JlCiAgICBiaW5k aW5ncyBoYXZlIHN5bmNocm9uaXplZCBhbmQgdmljZSB2ZXJzYS4KCiAgICBA cHJpdmF0ZQogICAgQG1ldGhvZCBfY29udGVudERpZENoYW5nZQogICovCiAg X2NvbnRlbnREaWRDaGFuZ2U6IEVtYmVyLm9ic2VydmVyKCdjb250ZW50Jywg ZnVuY3Rpb24oKSB7CiAgICB2YXIgY29udGVudCA9IGdldCh0aGlzLCAnY29u dGVudCcpOwoKICAgIGlmIChjb250ZW50KSB7CiAgICAgIHRoaXMuX2Fzc2Vy dEFycmF5TGlrZShjb250ZW50KTsKICAgICAgY29udGVudC5hZGRBcnJheU9i c2VydmVyKHRoaXMpOwogICAgfQoKICAgIHZhciBsZW4gPSBjb250ZW50ID8g Z2V0KGNvbnRlbnQsICdsZW5ndGgnKSA6IDA7CiAgICB0aGlzLmFycmF5RGlk Q2hhbmdlKGNvbnRlbnQsIDAsIG51bGwsIGxlbik7CiAgfSksCgogIC8qKgog ICAgRW5zdXJlIHRoYXQgdGhlIGNvbnRlbnQgaW1wbGVtZW50cyBFbWJlci5B cnJheQoKICAgIEBwcml2YXRlCiAgICBAbWV0aG9kIF9hc3NlcnRBcnJheUxp a2UKICAqLwogIF9hc3NlcnRBcnJheUxpa2U6IGZ1bmN0aW9uKGNvbnRlbnQp IHsKICAgIEVtYmVyLmFzc2VydChmbXQoImFuIEVtYmVyLkNvbGxlY3Rpb25W aWV3J3MgY29udGVudCBtdXN0IGltcGxlbWVudCBFbWJlci5BcnJheS4gWW91 IHBhc3NlZCAlQCIsIFtjb250ZW50XSksIEVtYmVyLkFycmF5LmRldGVjdChj b250ZW50KSk7CiAgfSwKCiAgLyoqCiAgICBSZW1vdmVzIHRoZSBjb250ZW50 IGFuZCBjb250ZW50IG9ic2VydmVycy4KCiAgICBAbWV0aG9kIGRlc3Ryb3kK ICAqLwogIGRlc3Ryb3k6IGZ1bmN0aW9uKCkgewogICAgaWYgKCF0aGlzLl9z dXBlcigpKSB7IHJldHVybjsgfQoKICAgIHZhciBjb250ZW50ID0gZ2V0KHRo aXMsICdjb250ZW50Jyk7CiAgICBpZiAoY29udGVudCkgeyBjb250ZW50LnJl bW92ZUFycmF5T2JzZXJ2ZXIodGhpcyk7IH0KCiAgICBpZiAodGhpcy5fY3Jl YXRlZEVtcHR5VmlldykgewogICAgICB0aGlzLl9jcmVhdGVkRW1wdHlWaWV3 LmRlc3Ryb3koKTsKICAgIH0KCiAgICByZXR1cm4gdGhpczsKICB9LAoKICAv KioKICAgIENhbGxlZCB3aGVuIGEgbXV0YXRpb24gdG8gdGhlIHVuZGVybHlp bmcgY29udGVudCBhcnJheSB3aWxsIG9jY3VyLgoKICAgIFRoaXMgbWV0aG9k IHdpbGwgcmVtb3ZlIGFueSB2aWV3cyB0aGF0IGFyZSBubyBsb25nZXIgaW4g dGhlIHVuZGVybHlpbmcKICAgIGNvbnRlbnQgYXJyYXkuCgogICAgSW52b2tl cyB3aGVuZXZlciB0aGUgY29udGVudCBhcnJheSBpdHNlbGYgd2lsbCBjaGFu Z2UuCgogICAgQG1ldGhvZCBhcnJheVdpbGxDaGFuZ2UKICAgIEBwYXJhbSB7 QXJyYXl9IGNvbnRlbnQgdGhlIG1hbmFnZWQgY29sbGVjdGlvbiBvZiBvYmpl Y3RzCiAgICBAcGFyYW0ge051bWJlcn0gc3RhcnQgdGhlIGluZGV4IGF0IHdo aWNoIHRoZSBjaGFuZ2VzIHdpbGwgb2NjdXJyCiAgICBAcGFyYW0ge051bWJl cn0gcmVtb3ZlZCBudW1iZXIgb2Ygb2JqZWN0IHRvIGJlIHJlbW92ZWQgZnJv bSBjb250ZW50CiAgKi8KICBhcnJheVdpbGxDaGFuZ2U6IGZ1bmN0aW9uKGNv bnRlbnQsIHN0YXJ0LCByZW1vdmVkQ291bnQpIHsKICAgIC8vIElmIHRoZSBj b250ZW50cyB3ZXJlIGVtcHR5IGJlZm9yZSBhbmQgdGhpcyB0ZW1wbGF0ZSBj b2xsZWN0aW9uIGhhcyBhbgogICAgLy8gZW1wdHkgdmlldyByZW1vdmUgaXQg bm93LgogICAgdmFyIGVtcHR5VmlldyA9IGdldCh0aGlzLCAnZW1wdHlWaWV3 Jyk7CiAgICBpZiAoZW1wdHlWaWV3ICYmIGVtcHR5VmlldyBpbnN0YW5jZW9m IEVtYmVyLlZpZXcpIHsKICAgICAgZW1wdHlWaWV3LnJlbW92ZUZyb21QYXJl bnQoKTsKICAgIH0KCiAgICAvLyBMb29wIHRocm91Z2ggY2hpbGQgdmlld3Mg dGhhdCBjb3JyZXNwb25kIHdpdGggdGhlIHJlbW92ZWQgaXRlbXMuCiAgICAv LyBOb3RlIHRoYXQgd2UgbG9vcCBmcm9tIHRoZSBlbmQgb2YgdGhlIGFycmF5 IHRvIHRoZSBiZWdpbm5pbmcgYmVjYXVzZQogICAgLy8gd2UgYXJlIG11dGF0 aW5nIGl0IGFzIHdlIGdvLgogICAgdmFyIGNoaWxkVmlld3MgPSB0aGlzLl9j aGlsZFZpZXdzLCBjaGlsZFZpZXcsIGlkeCwgbGVuOwoKICAgIGxlbiA9IHRo aXMuX2NoaWxkVmlld3MubGVuZ3RoOwoKICAgIHZhciByZW1vdmluZ0FsbCA9 IHJlbW92ZWRDb3VudCA9PT0gbGVuOwoKICAgIGlmIChyZW1vdmluZ0FsbCkg ewogICAgICB0aGlzLmN1cnJlbnRTdGF0ZS5lbXB0eSh0aGlzKTsKICAgICAg dGhpcy5pbnZva2VSZWN1cnNpdmVseShmdW5jdGlvbih2aWV3KSB7CiAgICAg ICAgdmlldy5yZW1vdmVkRnJvbURPTSA9IHRydWU7CiAgICAgIH0sIGZhbHNl KTsKICAgIH0KCiAgICBmb3IgKGlkeCA9IHN0YXJ0ICsgcmVtb3ZlZENvdW50 IC0gMTsgaWR4ID49IHN0YXJ0OyBpZHgtLSkgewogICAgICBjaGlsZFZpZXcg PSBjaGlsZFZpZXdzW2lkeF07CiAgICAgIGNoaWxkVmlldy5kZXN0cm95KCk7 CiAgICB9CiAgfSwKCiAgLyoqCiAgICBDYWxsZWQgd2hlbiBhIG11dGF0aW9u IHRvIHRoZSB1bmRlcmx5aW5nIGNvbnRlbnQgYXJyYXkgb2NjdXJzLgoKICAg IFRoaXMgbWV0aG9kIHdpbGwgcmVwbGF5IHRoYXQgbXV0YXRpb24gYWdhaW5z dCB0aGUgdmlld3MgdGhhdCBjb21wb3NlIHRoZQogICAgYEVtYmVyLkNvbGxl Y3Rpb25WaWV3YCwgZW5zdXJpbmcgdGhhdCB0aGUgdmlldyByZWZsZWN0cyB0 aGUgbW9kZWwuCgogICAgVGhpcyBhcnJheSBvYnNlcnZlciBpcyBhZGRlZCBp biBgY29udGVudERpZENoYW5nZWAuCgogICAgQG1ldGhvZCBhcnJheURpZENo YW5nZQogICAgQHBhcmFtIHtBcnJheX0gY29udGVudCB0aGUgbWFuYWdlZCBj b2xsZWN0aW9uIG9mIG9iamVjdHMKICAgIEBwYXJhbSB7TnVtYmVyfSBzdGFy dCB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGNoYW5nZXMgb2NjdXJyZWQKICAg IEBwYXJhbSB7TnVtYmVyfSByZW1vdmVkIG51bWJlciBvZiBvYmplY3QgcmVt b3ZlZCBmcm9tIGNvbnRlbnQKICAgIEBwYXJhbSB7TnVtYmVyfSBhZGRlZCBu dW1iZXIgb2Ygb2JqZWN0IGFkZGVkIHRvIGNvbnRlbnQKICAqLwogIGFycmF5 RGlkQ2hhbmdlOiBmdW5jdGlvbihjb250ZW50LCBzdGFydCwgcmVtb3ZlZCwg YWRkZWQpIHsKICAgIHZhciBhZGRlZFZpZXdzID0gW10sIHZpZXcsIGl0ZW0s IGlkeCwgbGVuLCBpdGVtVmlld0NsYXNzLAogICAgICBlbXB0eVZpZXc7Cgog ICAgbGVuID0gY29udGVudCA/IGdldChjb250ZW50LCAnbGVuZ3RoJykgOiAw OwoKICAgIGlmIChsZW4pIHsKICAgICAgaXRlbVZpZXdDbGFzcyA9IGdldCh0 aGlzLCAnaXRlbVZpZXdDbGFzcycpOwoKICAgICAgaWYgKCdzdHJpbmcnID09 PSB0eXBlb2YgaXRlbVZpZXdDbGFzcykgewogICAgICAgIGl0ZW1WaWV3Q2xh c3MgPSBnZXQoaXRlbVZpZXdDbGFzcykgfHwgaXRlbVZpZXdDbGFzczsKICAg ICAgfQoKICAgICAgRW1iZXIuYXNzZXJ0KGZtdCgiaXRlbVZpZXdDbGFzcyBt dXN0IGJlIGEgc3ViY2xhc3Mgb2YgRW1iZXIuVmlldywgbm90ICVAIiwKICAg ICAgICAgICAgICAgICAgICAgICBbaXRlbVZpZXdDbGFzc10pLAogICAgICAg ICAgICAgICAgICAgICAgICdzdHJpbmcnID09PSB0eXBlb2YgaXRlbVZpZXdD bGFzcyB8fCBFbWJlci5WaWV3LmRldGVjdChpdGVtVmlld0NsYXNzKSk7Cgog ICAgICBmb3IgKGlkeCA9IHN0YXJ0OyBpZHggPCBzdGFydCthZGRlZDsgaWR4 KyspIHsKICAgICAgICBpdGVtID0gY29udGVudC5vYmplY3RBdChpZHgpOwoK ICAgICAgICB2aWV3ID0gdGhpcy5jcmVhdGVDaGlsZFZpZXcoaXRlbVZpZXdD bGFzcywgewogICAgICAgICAgY29udGVudDogaXRlbSwKICAgICAgICAgIGNv bnRlbnRJbmRleDogaWR4CiAgICAgICAgfSk7CgogICAgICAgIGFkZGVkVmll d3MucHVzaCh2aWV3KTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZW1w dHlWaWV3ID0gZ2V0KHRoaXMsICdlbXB0eVZpZXcnKTsKCiAgICAgIGlmICgh ZW1wdHlWaWV3KSB7IHJldHVybjsgfQoKICAgICAgaWYgKCdzdHJpbmcnID09 PSB0eXBlb2YgZW1wdHlWaWV3KSB7CiAgICAgICAgZW1wdHlWaWV3ID0gZ2V0 KGVtcHR5VmlldykgfHwgZW1wdHlWaWV3OwogICAgICB9CgogICAgICBlbXB0 eVZpZXcgPSB0aGlzLmNyZWF0ZUNoaWxkVmlldyhlbXB0eVZpZXcpOwogICAg ICBhZGRlZFZpZXdzLnB1c2goZW1wdHlWaWV3KTsKICAgICAgc2V0KHRoaXMs ICdlbXB0eVZpZXcnLCBlbXB0eVZpZXcpOwoKICAgICAgaWYgKEVtYmVyLkNv cmVWaWV3LmRldGVjdChlbXB0eVZpZXcpKSB7CiAgICAgICAgdGhpcy5fY3Jl YXRlZEVtcHR5VmlldyA9IGVtcHR5VmlldzsKICAgICAgfQogICAgfQoKICAg IHRoaXMucmVwbGFjZShzdGFydCwgMCwgYWRkZWRWaWV3cyk7CiAgfSwKCiAg LyoqCiAgICBJbnN0YW50aWF0ZXMgYSB2aWV3IHRvIGJlIGFkZGVkIHRvIHRo ZSBjaGlsZFZpZXdzIGFycmF5IGR1cmluZyB2aWV3CiAgICBpbml0aWFsaXph dGlvbi4gWW91IGdlbmVyYWxseSB3aWxsIG5vdCBjYWxsIHRoaXMgbWV0aG9k IGRpcmVjdGx5IHVubGVzcwogICAgeW91IGFyZSBvdmVycmlkaW5nIGBjcmVh dGVDaGlsZFZpZXdzKClgLiBOb3RlIHRoYXQgdGhpcyBtZXRob2Qgd2lsbAog ICAgYXV0b21hdGljYWxseSBjb25maWd1cmUgdGhlIGNvcnJlY3Qgc2V0dGlu Z3Mgb24gdGhlIG5ldyB2aWV3IGluc3RhbmNlIHRvCiAgICBhY3QgYXMgYSBj aGlsZCBvZiB0aGUgcGFyZW50LgoKICAgIFRoZSB0YWcgbmFtZSBmb3IgdGhl IHZpZXcgd2lsbCBiZSBzZXQgdG8gdGhlIHRhZ05hbWUgb2YgdGhlIHZpZXdD bGFzcwogICAgcGFzc2VkIGluLgoKICAgIEBtZXRob2QgY3JlYXRlQ2hpbGRW aWV3CiAgICBAcGFyYW0ge0NsYXNzfSB2aWV3Q2xhc3MKICAgIEBwYXJhbSB7 SGFzaH0gW2F0dHJzXSBBdHRyaWJ1dGVzIHRvIGFkZAogICAgQHJldHVybiB7 RW1iZXIuVmlld30gbmV3IGluc3RhbmNlCiAgKi8KICBjcmVhdGVDaGlsZFZp ZXc6IGZ1bmN0aW9uKHZpZXcsIGF0dHJzKSB7CiAgICB2aWV3ID0gdGhpcy5f c3VwZXIodmlldywgYXR0cnMpOwoKICAgIHZhciBpdGVtVGFnTmFtZSA9IGdl dCh2aWV3LCAndGFnTmFtZScpOwoKICAgIGlmIChpdGVtVGFnTmFtZSA9PT0g bnVsbCB8fCBpdGVtVGFnTmFtZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIGl0 ZW1UYWdOYW1lID0gRW1iZXIuQ29sbGVjdGlvblZpZXcuQ09OVEFJTkVSX01B UFtnZXQodGhpcywgJ3RhZ05hbWUnKV07CiAgICAgIHNldCh2aWV3LCAndGFn TmFtZScsIGl0ZW1UYWdOYW1lKTsKICAgIH0KCiAgICByZXR1cm4gdmlldzsK ICB9Cn0pOwoKLyoqCiAgQSBtYXAgb2YgcGFyZW50IHRhZ3MgdG8gdGhlaXIg ZGVmYXVsdCBjaGlsZCB0YWdzLiBZb3UgY2FuIGFkZAogIGFkZGl0aW9uYWwg cGFyZW50IHRhZ3MgaWYgeW91IHdhbnQgY29sbGVjdGlvbiB2aWV3cyB0aGF0 IHVzZQogIGEgcGFydGljdWxhciBwYXJlbnQgdGFnIHRvIGRlZmF1bHQgdG8g YSBjaGlsZCB0YWcuCgogIEBwcm9wZXJ0eSBDT05UQUlORVJfTUFQCiAgQHR5 cGUgSGFzaAogIEBzdGF0aWMKICBAZmluYWwKKi8KRW1iZXIuQ29sbGVjdGlv blZpZXcuQ09OVEFJTkVSX01BUCA9IHsKICB1bDogJ2xpJywKICBvbDogJ2xp JywKICB0YWJsZTogJ3RyJywKICB0aGVhZDogJ3RyJywKICB0Ym9keTogJ3Ry JywKICB0Zm9vdDogJ3RyJywKICB0cjogJ3RkJywKICBzZWxlY3Q6ICdvcHRp b24nCn07Cgp9KSgpOwoKCgooZnVuY3Rpb24oKSB7Ci8qKgogIFRoZSBDb21w b25lbnRUZW1wbGF0ZURlcHJlY2F0aW9uIG1peGluIGlzIHVzZWQgdG8gcHJv dmlkZSBhIHVzZWZ1bAogIGRlcHJlY2F0aW9uIHdhcm5pbmcgd2hlbiB1c2lu ZyBlaXRoZXIgYHRlbXBsYXRlYCBvciBgdGVtcGxhdGVOYW1lYCB3aXRoCiAg YSBjb21wb25lbnQuIFRoZSBgdGVtcGxhdGVgIGFuZCBgdGVtcGxhdGVOYW1l YCBwcm9wZXJ0aWVzIHNwZWNpZmllZCBhdAogIGV4dGVuZCB0aW1lIGFyZSBt b3ZlZCB0byBgbGF5b3V0YCBhbmQgYGxheW91dE5hbWVgIHJlc3BlY3RpdmVs eS4KCiAgYEVtYmVyLkNvbXBvbmVudFRlbXBsYXRlRGVwcmVjYXRpb25gIGlz IHVzZWQgaW50ZXJuYWxseSBieSBFbWJlciBpbgogIGBFbWJlci5Db21wb25l bnRgLgoKICBAY2xhc3MgQ29tcG9uZW50VGVtcGxhdGVEZXByZWNhdGlvbgog IEBuYW1lc3BhY2UgRW1iZXIKKi8KRW1iZXIuQ29tcG9uZW50VGVtcGxhdGVE ZXByZWNhdGlvbiA9IEVtYmVyLk1peGluLmNyZWF0ZSh7CiAgLyoqCiAgICBA cHJpdmF0ZQoKICAgIE1vdmVzIGB0ZW1wbGF0ZU5hbWVgIHRvIGBsYXlvdXRO YW1lYCBhbmQgYHRlbXBsYXRlYCB0byBgbGF5b3V0YCBhdCBleHRlbmQKICAg IHRpbWUgaWYgYSBsYXlvdXQgaXMgbm90IGFsc28gc3BlY2lmaWVkLgoKICAg IE5vdGUgdGhhdCB0aGlzIGN1cnJlbnRseSBtb2RpZmllcyB0aGUgbWl4aW4g dGhlbXNlbHZlcywgd2hpY2ggaXMgdGVjaG5pY2FsbHkKICAgIGR1YmlvdXMg YnV0IGlzIHByYWN0aWNhbGx5IG9mIGxpdHRsZSBjb25zZXF1ZW5jZS4gVGhp cyBtYXkgY2hhbmdlIGluIHRoZQogICAgZnV0dXJlLgoKICAgIEBtZXRob2Qg d2lsbE1lcmdlTWl4aW4KICAqLwogIHdpbGxNZXJnZU1peGluOiBmdW5jdGlv bihwcm9wcykgewogICAgLy8gbXVzdCBjYWxsIF9zdXBlciBoZXJlIHRvIGVu c3VyZSB0aGF0IHRoZSBBY3Rpb25IYW5kbGVyCiAgICAvLyBtaXhpbiBpcyBz ZXR1cCBwcm9wZXJseSAobW92ZXMgYWN0aW9ucyAtPiBfYWN0aW9ucykKICAg IC8vCiAgICAvLyBDYWxsaW5nIHN1cGVyIGlzIG9ubHkgT0sgaGVyZSBzaW5j ZSB3ZSBLTk9XIHRoYXQKICAgIC8vIHRoZXJlIGlzIGFub3RoZXIgTWl4aW4g bG9hZGVkIGZpcnN0LgogICAgdGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJn dW1lbnRzKTsKCiAgICB2YXIgZGVwcmVjYXRlZFByb3BlcnR5LCByZXBsYWNl bWVudFByb3BlcnR5LAogICAgICAgIGxheW91dFNwZWNpZmllZCA9IChwcm9w cy5sYXlvdXROYW1lIHx8IHByb3BzLmxheW91dCk7CgogICAgaWYgKHByb3Bz LnRlbXBsYXRlTmFtZSAmJiAhbGF5b3V0U3BlY2lmaWVkKSB7CiAgICAgIGRl cHJlY2F0ZWRQcm9wZXJ0eSA9ICd0ZW1wbGF0ZU5hbWUnOwogICAgICByZXBs YWNlbWVudFByb3BlcnR5ID0gJ2xheW91dE5hbWUnOwoKICAgICAgcHJvcHMu bGF5b3V0TmFtZSA9IHByb3BzLnRlbXBsYXRlTmFtZTsKICAgICAgZGVsZXRl IHByb3BzWyd0ZW1wbGF0ZU5hbWUnXTsKICAgIH0KCiAgICBpZiAocHJvcHMu dGVtcGxhdGUgJiYgIWxheW91dFNwZWNpZmllZCkgewogICAgICBkZXByZWNh dGVkUHJvcGVydHkgPSAndGVtcGxhdGUnOwogICAgICByZXBsYWNlbWVudFBy b3BlcnR5ID0gJ2xheW91dCc7CgogICAgICBwcm9wcy5sYXlvdXQgPSBwcm9w cy50ZW1wbGF0ZTsKICAgICAgZGVsZXRlIHByb3BzWyd0ZW1wbGF0ZSddOwog ICAgfQoKICAgIGlmIChkZXByZWNhdGVkUHJvcGVydHkpIHsKICAgICAgRW1i ZXIuZGVwcmVjYXRlKCdEbyBub3Qgc3BlY2lmeSAnICsgZGVwcmVjYXRlZFBy b3BlcnR5ICsgJyBvbiBhIENvbXBvbmVudCwgdXNlICcgKyByZXBsYWNlbWVu dFByb3BlcnR5ICsgJyBpbnN0ZWFkLicsIGZhbHNlKTsKICAgIH0KICB9Cn0p OwoKCn0pKCk7CgoKCihmdW5jdGlvbigpIHsKdmFyIGdldCA9IEVtYmVyLmdl dCwgc2V0ID0gRW1iZXIuc2V0LCBpc05vbmUgPSBFbWJlci5pc05vbmUsCiAg ICBhX3NsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlOwoKCi8qKgpAbW9k dWxlIGVtYmVyCkBzdWJtb2R1bGUgZW1iZXItdmlld3MKKi8KCi8qKgogIEFu IGBFbWJlci5Db21wb25lbnRgIGlzIGEgdmlldyB0aGF0IGlzIGNvbXBsZXRl bHkKICBpc29sYXRlZC4gUHJvcGVydHkgYWNjZXNzIGluIGl0cyB0ZW1wbGF0 ZXMgZ28KICB0byB0aGUgdmlldyBvYmplY3QgYW5kIGFjdGlvbnMgYXJlIHRh cmdldGVkIGF0CiAgdGhlIHZpZXcgb2JqZWN0LiBUaGVyZSBpcyBubyBhY2Nl c3MgdG8gdGhlCiAgc3Vycm91bmRpbmcgY29udGV4dCBvciBvdXRlciBjb250 cm9sbGVyOyBhbGwKICBjb250ZXh0dWFsIGluZm9ybWF0aW9uIG11c3QgYmUg cGFzc2VkIGluLgoKICBUaGUgZWFzaWVzdCB3YXkgdG8gY3JlYXRlIGFuIGBF bWJlci5Db21wb25lbnRgIGlzIHZpYQogIGEgdGVtcGxhdGUuIElmIHlvdSBu YW1lIGEgdGVtcGxhdGUKICBgY29tcG9uZW50cy9teS1mb29gLCB5b3Ugd2ls bCBiZSBhYmxlIHRvIHVzZQogIGB7e215LWZvb319YCBpbiBvdGhlciB0ZW1w bGF0ZXMsIHdoaWNoIHdpbGwgbWFrZQogIGFuIGluc3RhbmNlIG9mIHRoZSBp c29sYXRlZCBjb21wb25lbnQuCgogIGBgYGhhbmRsZWJhcnMKICB7e2FwcC1w cm9maWxlIHBlcnNvbj1jdXJyZW50VXNlcn19CiAgYGBgCgogIGBgYGhhbmRs ZWJhcnMKICA8IS0tIGFwcC1wcm9maWxlIHRlbXBsYXRlIC0tPgogIDxoMT57 e3BlcnNvbi50aXRsZX19PC9oMT4KICA8aW1nIHt7YmluZC1hdHRyIHNyYz1w ZXJzb24uYXZhdGFyfX0+CiAgPHAgY2xhc3M9J3NpZ25hdHVyZSc+e3twZXJz b24uc2lnbmF0dXJlfX08L3A+CiAgYGBgCgogIFlvdSBjYW4gdXNlIGB5aWVs ZGAgaW5zaWRlIGEgdGVtcGxhdGUgdG8KICBpbmNsdWRlIHRoZSAqKmNvbnRl bnRzKiogb2YgYW55IGJsb2NrIGF0dGFjaGVkIHRvCiAgdGhlIGNvbXBvbmVu dC4gVGhlIGJsb2NrIHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlCiAgY29udGV4 dCBvZiB0aGUgc3Vycm91bmRpbmcgY29udGV4dCBvciBvdXRlciBjb250cm9s bGVyOgoKICBgYGBoYW5kbGViYXJzCiAge3sjYXBwLXByb2ZpbGUgcGVyc29u PWN1cnJlbnRVc2VyfX0KICAgIDxwPkFkbWluIG1vZGU8L3A+CiAgICB7eyEg RXhlY3V0ZWQgaW4gdGhlIGNvbnRyb2xsZXIncyBjb250ZXh0LiB9fQogIHt7 L2FwcC1wcm9maWxlfX0KICBgYGAKCiAgYGBgaGFuZGxlYmFycwogIDwhLS0g YXBwLXByb2ZpbGUgdGVtcGxhdGUgLS0+CiAgPGgxPnt7cGVyc29uLnRpdGxl fX08L2gxPgogIHt7ISBFeGVjdXRlZCBpbiB0aGUgY29tcG9uZW50cyBjb250 ZXh0LiB9fQogIHt7eWllbGR9fSB7eyEgYmxvY2sgY29udGVudHMgfX0KICBg YGAKCiAgSWYgeW91IHdhbnQgdG8gY3VzdG9taXplIHRoZSBjb21wb25lbnQs IGluIG9yZGVyIHRvCiAgaGFuZGxlIGV2ZW50cyBvciBhY3Rpb25zLCB5b3Ug aW1wbGVtZW50IGEgc3ViY2xhc3MKICBvZiBgRW1iZXIuQ29tcG9uZW50YCBu YW1lZCBhZnRlciB0aGUgbmFtZSBvZiB0aGUKICBjb21wb25lbnQuIE5vdGUg dGhhdCBgQ29tcG9uZW50YCBuZWVkcyB0byBiZSBhcHBlbmRlZCB0byB0aGUg bmFtZSBvZgogIHlvdXIgc3ViY2xhc3MgbGlrZSBgQXBwUHJvZmlsZUNvbXBv bmVudGAuCgogIEZvciBleGFtcGxlLCB5b3UgY291bGQgaW1wbGVtZW50IHRo ZSBhY3Rpb24KICBgaGVsbG9gIGZvciB0aGUgYGFwcC1wcm9maWxlYCBjb21w b25lbnQ6CgogIGBgYGphdmFzY3JpcHQKICBBcHAuQXBwUHJvZmlsZUNvbXBv bmVudCA9IEVtYmVyLkNvbXBvbmVudC5leHRlbmQoewogICAgYWN0aW9uczog ewogICAgICBoZWxsbzogZnVuY3Rpb24obmFtZSkgewogICAgICAgIGNvbnNv bGUubG9nKCJIZWxsbyIsIG5hbWUpOwogICAgICB9CiAgICB9CiAgfSk7CiAg YGBgCgogIEFuZCB0aGVuIHVzZSBpdCBpbiB0aGUgY29tcG9uZW50J3MgdGVt cGxhdGU6CgogIGBgYGhhbmRsZWJhcnMKICA8IS0tIGFwcC1wcm9maWxlIHRl bXBsYXRlIC0tPgoKICA8aDE+e3twZXJzb24udGl0bGV9fTwvaDE+CiAge3t5 aWVsZH19IDwhLS0gYmxvY2sgY29udGVudHMgLS0+CgogIDxidXR0b24ge3th Y3Rpb24gJ2hlbGxvJyBwZXJzb24ubmFtZX19PgogICAgU2F5IEhlbGxvIHRv IHt7cGVyc29uLm5hbWV9fQogIDwvYnV0dG9uPgogIGBgYAoKICBDb21wb25l bnRzIG11c3QgaGF2ZSBhIGAtYCBpbiB0aGVpciBuYW1lIHRvIGF2b2lkCiAg Y29uZmxpY3RzIHdpdGggYnVpbHQtaW4gY29udHJvbHMgdGhhdCB3cmFwIEhU TUwKICBlbGVtZW50cy4gVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHNh bWUKICByZXF1aXJlbWVudCBpbiB3ZWIgY29tcG9uZW50cy4KCiAgQGNsYXNz IENvbXBvbmVudAogIEBuYW1lc3BhY2UgRW1iZXIKICBAZXh0ZW5kcyBFbWJl ci5WaWV3CiovCkVtYmVyLkNvbXBvbmVudCA9IEVtYmVyLlZpZXcuZXh0ZW5k KEVtYmVyLlRhcmdldEFjdGlvblN1cHBvcnQsIEVtYmVyLkNvbXBvbmVudFRl bXBsYXRlRGVwcmVjYXRpb24sIHsKICBpbml0OiBmdW5jdGlvbigpIHsKICAg IHRoaXMuX3N1cGVyKCk7CiAgICBzZXQodGhpcywgJ2NvbnRleHQnLCB0aGlz KTsKICAgIHNldCh0aGlzLCAnY29udHJvbGxlcicsIHRoaXMpOwogIH0sCgog IGRlZmF1bHRMYXlvdXQ6IGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpewog ICAgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzWyd5aWVsZCddLmNhbGwoY29u dGV4dCwgb3B0aW9ucyk7CiAgfSwKCiAgLyoqCiAgQSBjb21wb25lbnRzIHRl bXBsYXRlIHByb3BlcnR5IGlzIHNldCBieSBwYXNzaW5nIGEgYmxvY2sKICBk dXJpbmcgaXRzIGludm9jYXRpb24uIEl0IGlzIGV4ZWN1dGVkIHdpdGhpbiB0 aGUgcGFyZW50IGNvbnRleHQuCgogIEV4YW1wbGU6CgogIGBgYGhhbmRsZWJh cnMKICB7eyNteS1jb21wb25lbnR9fQogICAgLy8gc29tZXRoaW5nIHRoYXQg aXMgcnVuIGluIHRoZSBjb250ZXh0CiAgICAvLyBvZiB0aGUgcGFyZW50IGNv bnRleHQKICB7ey9teS1jb21wb25lbnR9fQogIGBgYAoKICBTcGVjaWZ5aW5n IGEgdGVtcGxhdGUgZGlyZWN0bHkgdG8gYSBjb21wb25lbnQgaXMgZGVwcmVj YXRlZCB3aXRob3V0CiAgYWxzbyBzcGVjaWZ5aW5nIHRoZSBsYXlvdXQgcHJv cGVydHkuCgogIEBkZXByZWNhdGVkCiAgQHByb3BlcnR5IHRlbXBsYXRlCiAg Ki8KICB0ZW1wbGF0ZTogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oa2V5LCB2 YWx1ZSkgewogICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHsgcmV0dXJu IHZhbHVlOyB9CgogICAgdmFyIHRlbXBsYXRlTmFtZSA9IGdldCh0aGlzLCAn dGVtcGxhdGVOYW1lJyksCiAgICAgICAgdGVtcGxhdGUgPSB0aGlzLnRlbXBs YXRlRm9yTmFtZSh0ZW1wbGF0ZU5hbWUsICd0ZW1wbGF0ZScpOwoKICAgIEVt YmVyLmFzc2VydCgiWW91IHNwZWNpZmllZCB0aGUgdGVtcGxhdGVOYW1lICIg KyB0ZW1wbGF0ZU5hbWUgKyAiIGZvciAiICsgdGhpcyArICIsIGJ1dCBpdCBk aWQgbm90IGV4aXN0LiIsICF0ZW1wbGF0ZU5hbWUgfHwgdGVtcGxhdGUpOwoK ICAgIHJldHVybiB0ZW1wbGF0ZSB8fCBnZXQodGhpcywgJ2RlZmF1bHRUZW1w bGF0ZScpOwogIH0pLnByb3BlcnR5KCd0ZW1wbGF0ZU5hbWUnKSwKCiAgLyoq CiAgU3BlY2lmeWluZyBhIGNvbXBvbmVudHMgYHRlbXBsYXRlTmFtZWAgaXMg ZGVwcmVjYXRlZCB3aXRob3V0IGFsc28KICBwcm92aWRpbmcgdGhlIGBsYXlv dXRgIG9yIGBsYXlvdXROYW1lYCBwcm9wZXJ0aWVzLgoKICBAZGVwcmVjYXRl ZAogIEBwcm9wZXJ0eSB0ZW1wbGF0ZU5hbWUKICAqLwogIHRlbXBsYXRlTmFt ZTogbnVsbCwKCiAgLy8gZHVyaW5nIHJlbmRlciwgaXNvbGF0ZSBrZXl3b3Jk cwogIGNsb25lS2V5d29yZHM6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHsK ICAgICAgdmlldzogdGhpcywKICAgICAgY29udHJvbGxlcjogdGhpcwogICAg fTsKICB9LAoKICBfeWllbGQ6IGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMp IHsKICAgIHZhciB2aWV3ID0gb3B0aW9ucy5kYXRhLnZpZXcsCiAgICAgICAg cGFyZW50VmlldyA9IHRoaXMuX3BhcmVudFZpZXcsCiAgICAgICAgdGVtcGxh dGUgPSBnZXQodGhpcywgJ3RlbXBsYXRlJyk7CgogICAgaWYgKHRlbXBsYXRl KSB7CiAgICAgIEVtYmVyLmFzc2VydCgiQSBDb21wb25lbnQgbXVzdCBoYXZl IGEgcGFyZW50IHZpZXcgaW4gb3JkZXIgdG8geWllbGQuIiwgcGFyZW50Vmll dyk7CgogICAgICB2aWV3LmFwcGVuZENoaWxkKEVtYmVyLlZpZXcsIHsKICAg ICAgICBpc1ZpcnR1YWw6IHRydWUsCiAgICAgICAgdGFnTmFtZTogJycsCiAg ICAgICAgX2NvbnRleHRWaWV3OiBwYXJlbnRWaWV3LAogICAgICAgIHRlbXBs YXRlOiB0ZW1wbGF0ZSwKICAgICAgICBjb250ZXh0OiBnZXQocGFyZW50Vmll dywgJ2NvbnRleHQnKSwKICAgICAgICBjb250cm9sbGVyOiBnZXQocGFyZW50 VmlldywgJ2NvbnRyb2xsZXInKSwKICAgICAgICB0ZW1wbGF0ZURhdGE6IHsg a2V5d29yZHM6IHBhcmVudFZpZXcuY2xvbmVLZXl3b3JkcygpIH0KICAgICAg fSk7CiAgICB9CiAgfSwKCiAgLyoqCiAgICBJZiB0aGUgY29tcG9uZW50IGlz IGN1cnJlbnRseSBpbnNlcnRlZCBpbnRvIHRoZSBET00gb2YgYSBwYXJlbnQg dmlldywgdGhpcwogICAgcHJvcGVydHkgd2lsbCBwb2ludCB0byB0aGUgY29u dHJvbGxlciBvZiB0aGUgcGFyZW50IHZpZXcuCgogICAgQHByb3BlcnR5IHRh cmdldE9iamVjdAogICAgQHR5cGUgRW1iZXIuQ29udHJvbGxlcgogICAgQGRl ZmF1bHQgbnVsbAogICovCiAgdGFyZ2V0T2JqZWN0OiBFbWJlci5jb21wdXRl ZChmdW5jdGlvbihrZXkpIHsKICAgIHZhciBwYXJlbnRWaWV3ID0gZ2V0KHRo aXMsICdfcGFyZW50VmlldycpOwogICAgcmV0dXJuIHBhcmVudFZpZXcgPyBn ZXQocGFyZW50VmlldywgJ2NvbnRyb2xsZXInKSA6IG51bGw7CiAgfSkucHJv cGVydHkoJ19wYXJlbnRWaWV3JyksCgogIC8qKgogICAgVHJpZ2dlcnMgYSBu YW1lZCBhY3Rpb24gb24gdGhlIGNvbnRyb2xsZXIgY29udGV4dCB3aGVyZSB0 aGUgY29tcG9uZW50IGlzIHVzZWQgaWYKICAgIHRoaXMgY29udHJvbGxlciBo YXMgcmVnaXN0ZXJlZCBmb3Igbm90aWZpY2F0aW9ucyBvZiB0aGUgYWN0aW9u LgoKICAgIEZvciBleGFtcGxlIGEgY29tcG9uZW50IGZvciBwbGF5aW5nIG9y IHBhdXNpbmcgbXVzaWMgbWF5IHRyYW5zbGF0ZSBjbGljayBldmVudHMKICAg IGludG8gYWN0aW9uIG5vdGlmaWNhdGlvbnMgb2YgInBsYXkiIG9yICJzdG9w IiBkZXBlbmRpbmcgb24gc29tZSBpbnRlcm5hbCBzdGF0ZQogICAgb2YgdGhl IGNvbXBvbmVudDoKCgogICAgYGBgamF2YXNjcmlwdAogICAgQXBwLlBsYXlC dXR0b25Db21wb25lbnQgPSBFbWJlci5Db21wb25lbnQuZXh0ZW5kKHsKICAg ICAgY2xpY2s6IGZ1bmN0aW9uKCl7CiAgICAgICAgaWYgKHRoaXMuZ2V0KCdp c1BsYXlpbmcnKSkgewogICAgICAgICAgdGhpcy5zZW5kQWN0aW9uKCdwbGF5 Jyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuc2VuZEFjdGlv bignc3RvcCcpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICBgYGAK CiAgICBXaGVuIHVzZWQgaW5zaWRlIGEgdGVtcGxhdGUgdGhlc2UgY29tcG9u ZW50IGFjdGlvbnMgYXJlIGNvbmZpZ3VyZWQgdG8KICAgIHRyaWdnZXIgYWN0 aW9ucyBpbiB0aGUgb3V0ZXIgYXBwbGljYXRpb24gY29udGV4dDoKCiAgICBg YGBoYW5kbGViYXJzCiAgICB7eyEgYXBwbGljYXRpb24uaGJzIH19CiAgICB7 e3BsYXktYnV0dG9uIHBsYXk9Im11c2ljU3RhcnRlZCIgc3RvcD0ibXVzaWNT dG9wcGVkIn19CiAgICBgYGAKCiAgICBXaGVuIHRoZSBjb21wb25lbnQgcmVj ZWl2ZXMgYSBicm93c2VyIGBjbGlja2AgZXZlbnQgaXQgdHJhbnNsYXRlIHRo aXMKICAgIGludGVyYWN0aW9uIGludG8gYXBwbGljYXRpb24tc3BlY2lmaWMg c2VtYW50aWNzICgicGxheSIgb3IgInN0b3AiKSBhbmQKICAgIHRyaWdnZXJz IHRoZSBzcGVjaWZpZWQgYWN0aW9uIG5hbWUgb24gdGhlIGNvbnRyb2xsZXIg Zm9yIHRoZSB0ZW1wbGF0ZQogICAgd2hlcmUgdGhlIGNvbXBvbmVudCBpcyB1 c2VkOiAKCgogICAgYGBgamF2YXNjcmlwdAogICAgQXBwLkFwcGxpY2F0aW9u Q29udHJvbGxlciA9IEVtYmVyLkNvbnRyb2xsZXIuZXh0ZW5kKHsKICAgICAg YWN0aW9uczogewogICAgICAgIG11c2ljU3RhcnRlZDogZnVuY3Rpb24oKXsK ICAgICAgICAgIC8vIGNhbGxlZCB3aGVuIHRoZSBwbGF5IGJ1dHRvbiBpcyBj bGlja2VkCiAgICAgICAgICAvLyBhbmQgdGhlIG11c2ljIHN0YXJ0ZWQgcGxh eWluZwogICAgICAgIH0sCiAgICAgICAgbXVzaWNTdG9wcGVkOiBmdW5jdGlv bigpewogICAgICAgICAgLy8gY2FsbGVkIHdoZW4gdGhlIHBsYXkgYnV0dG9u IGlzIGNsaWNrZWQKICAgICAgICAgIC8vIGFuZCB0aGUgbXVzaWMgc3RvcHBl ZCBwbGF5aW5nCiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIGBgYAoK ICAgIElmIG5vIGFjdGlvbiBuYW1lIGlzIHBhc3NlZCB0byBgc2VuZEFjdGlv bmAgYSBkZWZhdWx0IG5hbWUgb2YgImFjdGlvbiIKICAgIGlzIGFzc3VtZWQu CgogICAgYGBgamF2YXNjcmlwdAogICAgQXBwLk5leHRCdXR0b25Db21wb25l bnQgPSBFbWJlci5Db21wb25lbnQuZXh0ZW5kKHsKICAgICAgY2xpY2s6IGZ1 bmN0aW9uKCl7CiAgICAgICAgdGhpcy5zZW5kQWN0aW9uKCk7CiAgICAgIH0K ICAgIH0pOwogICAgYGBgCgogICAgYGBgaGFuZGxlYmFycwogICAge3shIGFw cGxpY2F0aW9uLmhicyB9fQogICAge3tuZXh0LWJ1dHRvbiBhY3Rpb249InBs YXlOZXh0U29uZ0luQWxidW0ifX0KICAgIGBgYAoKICAgIGBgYGphdmFzY3Jp cHQKICAgIEFwcC5BcHBsaWNhdGlvbkNvbnRyb2xsZXIgPSBFbWJlci5Db250 cm9sbGVyLmV4dGVuZCh7CiAgICAgIGFjdGlvbnM6IHsKICAgICAgICBwbGF5 TmV4dFNvbmdJbkFsYnVtOiBmdW5jdGlvbigpewogICAgICAgICAgLi4uCiAg ICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIGBgYAoKICAgIEBtZXRob2Qg c2VuZEFjdGlvbgogICAgQHBhcmFtIFthY3Rpb25dIHtTdHJpbmd9IHRoZSBh Y3Rpb24gdG8gdHJpZ2dlcgogICAgQHBhcmFtIFtjb250ZXh0XSB7Kn0gYSBj b250ZXh0IHRvIHNlbmQgd2l0aCB0aGUgYWN0aW9uCiAgKi8KICBzZW5kQWN0 aW9uOiBmdW5jdGlvbihhY3Rpb24pIHsKICAgIHZhciBhY3Rpb25OYW1lLAog ICAgICAgIGNvbnRleHRzID0gYV9zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7 CgogICAgLy8gU2VuZCB0aGUgZGVmYXVsdCBhY3Rpb24KICAgIGlmIChhY3Rp b24gPT09IHVuZGVmaW5lZCkgewogICAgICBhY3Rpb25OYW1lID0gZ2V0KHRo aXMsICdhY3Rpb24nKTsKICAgICAgRW1iZXIuYXNzZXJ0KCJUaGUgZGVmYXVs dCBhY3Rpb24gd2FzIHRyaWdnZXJlZCBvbiB0aGUgY29tcG9uZW50ICIgKyB0 aGlzLnRvU3RyaW5nKCkgKwogICAgICAgICAgICAgICAgICAgIiwgYnV0IHRo ZSBhY3Rpb24gbmFtZSAoIiArIGFjdGlvbk5hbWUgKyAiKSB3YXMgbm90IGEg c3RyaW5nLiIsCiAgICAgICAgICAgICAgICAgICBpc05vbmUoYWN0aW9uTmFt ZSkgfHwgdHlwZW9mIGFjdGlvbk5hbWUgPT09ICdzdHJpbmcnKTsKICAgIH0g ZWxzZSB7CiAgICAgIGFjdGlvbk5hbWUgPSBnZXQodGhpcywgYWN0aW9uKTsK ICAgICAgRW1iZXIuYXNzZXJ0KCJUaGUgIiArIGFjdGlvbiArICIgYWN0aW9u IHdhcyB0cmlnZ2VyZWQgb24gdGhlIGNvbXBvbmVudCAiICsKICAgICAgICAg ICAgICAgICAgIHRoaXMudG9TdHJpbmcoKSArICIsIGJ1dCB0aGUgYWN0aW9u IG5hbWUgKCIgKyBhY3Rpb25OYW1lICsKICAgICAgICAgICAgICAgICAgICIp IHdhcyBub3QgYSBzdHJpbmcuIiwKICAgICAgICAgICAgICAgICAgIGlzTm9u ZShhY3Rpb25OYW1lKSB8fCB0eXBlb2YgYWN0aW9uTmFtZSA9PT0gJ3N0cmlu ZycpOwogICAgfQoKICAgIC8vIElmIG5vIGFjdGlvbiBuYW1lIGZvciB0aGF0 IGFjdGlvbiBjb3VsZCBiZSBmb3VuZCwganVzdCBhYm9ydC4KICAgIGlmIChh Y3Rpb25OYW1lID09PSB1bmRlZmluZWQpIHsgcmV0dXJuOyB9CgogICAgdGhp cy50cmlnZ2VyQWN0aW9uKHsKICAgICAgYWN0aW9uOiBhY3Rpb25OYW1lLAog ICAgICBhY3Rpb25Db250ZXh0OiBjb250ZXh0cwogICAgfSk7CiAgfQp9KTsK Cn0pKCk7CgoKCihmdW5jdGlvbigpIHsKCn0pKCk7CgoKCihmdW5jdGlvbigp IHsKLyoqCmBFbWJlci5WaWV3VGFyZ2V0QWN0aW9uU3VwcG9ydGAgaXMgYSBt aXhpbiB0aGF0IGNhbiBiZSBpbmNsdWRlZCBpbiBhCnZpZXcgY2xhc3MgdG8g YWRkIGEgYHRyaWdnZXJBY3Rpb25gIG1ldGhvZCB3aXRoIHNlbWFudGljcyBz aW1pbGFyIHRvCnRoZSBIYW5kbGViYXJzIGB7e2FjdGlvbn19YCBoZWxwZXIu IEl0IHByb3ZpZGVzIGludGVsbGlnZW50IGRlZmF1bHRzCmZvciB0aGUgYWN0 aW9uJ3MgdGFyZ2V0OiB0aGUgdmlldydzIGNvbnRyb2xsZXI7IGFuZCB0aGUg Y29udGV4dCB0aGF0IGlzCnNlbnQgd2l0aCB0aGUgYWN0aW9uOiB0aGUgdmll dydzIGNvbnRleHQuCgpOb3RlOiBJbiBub3JtYWwgRW1iZXIgdXNhZ2UsIHRo ZSBge3thY3Rpb259fWAgaGVscGVyIGlzIHVzdWFsbHkgdGhlIGJlc3QKY2hv aWNlLiBUaGlzIG1peGluIGlzIG1vc3Qgb2Z0ZW4gdXNlZnVsIHdoZW4geW91 IGFyZSBkb2luZyBtb3JlIGNvbXBsZXgKZXZlbnQgaGFuZGxpbmcgaW4gY3Vz dG9tIFZpZXcgc3ViY2xhc3Nlcy4KCkZvciBleGFtcGxlOgoKYGBgamF2YXNj cmlwdApBcHAuU2F2ZUJ1dHRvblZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZChF bWJlci5WaWV3VGFyZ2V0QWN0aW9uU3VwcG9ydCwgewogIGFjdGlvbjogJ3Nh dmUnLAogIGNsaWNrOiBmdW5jdGlvbigpIHsKICAgIHRoaXMudHJpZ2dlckFj dGlvbigpOyAvLyBTZW5kcyB0aGUgYHNhdmVgIGFjdGlvbiwgYWxvbmcgd2l0 aCB0aGUgY3VycmVudCBjb250ZXh0CiAgICAgICAgICAgICAgICAgICAgICAg ICAgLy8gdG8gdGhlIGN1cnJlbnQgY29udHJvbGxlcgogIH0KfSk7CmBgYAoK VGhlIGBhY3Rpb25gIGNhbiBiZSBwcm92aWRlZCBhcyBwcm9wZXJ0aWVzIG9m IGFuIG9wdGlvbmFsIG9iamVjdCBhcmd1bWVudAp0byBgdHJpZ2dlckFjdGlv bmAgYXMgd2VsbC4KCmBgYGphdmFzY3JpcHQKQXBwLlNhdmVCdXR0b25WaWV3 ID0gRW1iZXIuVmlldy5leHRlbmQoRW1iZXIuVmlld1RhcmdldEFjdGlvblN1 cHBvcnQsIHsKICBjbGljazogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnRyaWdn ZXJBY3Rpb24oewogICAgICBhY3Rpb246ICdzYXZlJwogICAgfSk7IC8vIFNl bmRzIHRoZSBgc2F2ZWAgYWN0aW9uLCBhbG9uZyB3aXRoIHRoZSBjdXJyZW50 IGNvbnRleHQKICAgICAgICAvLyB0byB0aGUgY3VycmVudCBjb250cm9sbGVy CiAgfQp9KTsKYGBgCgpAY2xhc3MgVmlld1RhcmdldEFjdGlvblN1cHBvcnQK QG5hbWVzcGFjZSBFbWJlcgpAZXh0ZW5kcyBFbWJlci5UYXJnZXRBY3Rpb25T dXBwb3J0CiovCkVtYmVyLlZpZXdUYXJnZXRBY3Rpb25TdXBwb3J0ID0gRW1i ZXIuTWl4aW4uY3JlYXRlKEVtYmVyLlRhcmdldEFjdGlvblN1cHBvcnQsIHsK ICAvKioKICBAcHJvcGVydHkgdGFyZ2V0CiAgKi8KICB0YXJnZXQ6IEVtYmVy LmNvbXB1dGVkLmFsaWFzKCdjb250cm9sbGVyJyksCiAgLyoqCiAgQHByb3Bl cnR5IGFjdGlvbkNvbnRleHQKICAqLwogIGFjdGlvbkNvbnRleHQ6IEVtYmVy LmNvbXB1dGVkLmFsaWFzKCdjb250ZXh0JykKfSk7Cgp9KSgpOwoKCgooZnVu Y3Rpb24oKSB7Cgp9KSgpOwoKCgooZnVuY3Rpb24oKSB7Ci8qKgpFbWJlciBW aWV3cwoKQG1vZHVsZSBlbWJlcgpAc3VibW9kdWxlIGVtYmVyLXZpZXdzCkBy ZXF1aXJlcyBlbWJlci1ydW50aW1lCkBtYWluIGVtYmVyLXZpZXdzCiovCgp9 KSgpOwoKKGZ1bmN0aW9uKCkgewpkZWZpbmUoIm1ldGFtb3JwaCIsCiAgW10s CiAgZnVuY3Rpb24oKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICAvLyA9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUHJvamVjdDogICBt ZXRhbW9ycGgKICAgIC8vIENvcHlyaWdodDogwqkyMDE0IFRpbGRlLCBJbmMu IEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAvLyA9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PQoKICAgIHZhciBLID0gZnVuY3Rpb24oKSB7fSwKICAg ICAgICBndWlkID0gMCwKICAgICAgICBkaXNhYmxlUmFuZ2UgPSAoZnVuY3Rp b24oKXsKICAgICAgICAgIGlmICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIE1l dGFtb3JwaEVOVikgewogICAgICAgICAgICByZXR1cm4gTWV0YW1vcnBoRU5W LkRJU0FCTEVfUkFOR0VfQVBJOwogICAgICAgICAgfSBlbHNlIGlmICgndW5k ZWZpbmVkJyAhPT0gRU5WKSB7CiAgICAgICAgICAgIHJldHVybiBFTlYuRElT QUJMRV9SQU5HRV9BUEk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAg ICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfSkoKSwKCiAg ICAgICAgLy8gRmVhdHVyZS1kZXRlY3QgdGhlIFczQyByYW5nZSBBUEksIHRo ZSBleHRlbmRlZCBjaGVjayBpcyBmb3IgSUU5IHdoaWNoIG9ubHkgcGFydGlh bGx5IHN1cHBvcnRzIHJhbmdlcwogICAgICAgIHN1cHBvcnRzUmFuZ2UgPSAo IWRpc2FibGVSYW5nZSkgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZp bmVkJyAmJiAoJ2NyZWF0ZVJhbmdlJyBpbiBkb2N1bWVudCkgJiYgKHR5cGVv ZiBSYW5nZSAhPT0gJ3VuZGVmaW5lZCcpICYmIFJhbmdlLnByb3RvdHlwZS5j cmVhdGVDb250ZXh0dWFsRnJhZ21lbnQsCgogICAgICAgIC8vIEludGVybmV0 IEV4cGxvcmVyIHByaW9yIHRvIDkgZG9lcyBub3QgYWxsb3cgc2V0dGluZyBp bm5lckhUTUwgaWYgdGhlIGZpcnN0IGVsZW1lbnQKICAgICAgICAvLyBpcyBh ICJ6ZXJvLXNjb3BlIiBlbGVtZW50LiBUaGlzIHByb2JsZW0gY2FuIGJlIHdv cmtlZCBhcm91bmQgYnkgbWFraW5nCiAgICAgICAgLy8gdGhlIGZpcnN0IG5v ZGUgYW4gaW52aXNpYmxlIHRleHQgbm9kZS4gV2UsIGxpa2UgTW9kZXJuaXpy LCB1c2UgJnNoeTsKICAgICAgICBuZWVkc1NoeSA9IHR5cGVvZiBkb2N1bWVu dCAhPT0gJ3VuZGVmaW5lZCcgJiYgKGZ1bmN0aW9uKCkgewogICAgICAgICAg dmFyIHRlc3RFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwog ICAgICAgICAgdGVzdEVsLmlubmVySFRNTCA9ICI8ZGl2PjwvZGl2PiI7CiAg ICAgICAgICB0ZXN0RWwuZmlyc3RDaGlsZC5pbm5lckhUTUwgPSAiPHNjcmlw dD48L3NjcmlwdD4iOwogICAgICAgICAgcmV0dXJuIHRlc3RFbC5maXJzdENo aWxkLmlubmVySFRNTCA9PT0gJyc7CiAgICAgICAgfSkoKSwKCgogICAgICAg IC8vIElFIDggKGFuZCBsaWtlbHkgZWFybGllcikgbGlrZXMgdG8gbW92ZSB3 aGl0ZXNwYWNlIHByZWNlZWRpbmcKICAgICAgICAvLyBhIHNjcmlwdCB0YWcg dG8gYXBwZWFyIGFmdGVyIGl0LiBUaGlzIG1lYW5zIHRoYXQgd2UgY2FuCiAg ICAgICAgLy8gYWNjaWRlbnRhbGx5IHJlbW92ZSB3aGl0ZXNwYWNlIHdoZW4g dXBkYXRpbmcgYSBtb3JwaC4KICAgICAgICBtb3Zlc1doaXRlc3BhY2UgPSBk b2N1bWVudCAmJiAoZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgdGVzdEVs ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICB0 ZXN0RWwuaW5uZXJIVE1MID0gIlRlc3Q6IDxzY3JpcHQgdHlwZT0ndGV4dC94 LXBsYWNlaG9sZGVyJz48L3NjcmlwdD5WYWx1ZSI7CiAgICAgICAgICByZXR1 cm4gdGVzdEVsLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlID09PSAnVGVzdDon ICYmCiAgICAgICAgICAgICAgICAgIHRlc3RFbC5jaGlsZE5vZGVzWzJdLm5v ZGVWYWx1ZSA9PT0gJyBWYWx1ZSc7CiAgICAgICAgfSkoKTsKCiAgICAvLyBD b25zdHJ1Y3RvciB0aGF0IHN1cHBvcnRzIGVpdGhlciBNZXRhbW9ycGgoJ2Zv bycpIG9yIG5ldwogICAgLy8gTWV0YW1vcnBoKCdmb28nKTsKICAgIC8vCiAg ICAvLyBUYWtlcyBhIHN0cmluZyBvZiBIVE1MIGFzIHRoZSBhcmd1bWVudC4K CiAgICB2YXIgTWV0YW1vcnBoID0gZnVuY3Rpb24oaHRtbCkgewogICAgICB2 YXIgc2VsZjsKCiAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgTWV0YW1vcnBo KSB7CiAgICAgICAgc2VsZiA9IHRoaXM7CiAgICAgIH0gZWxzZSB7CiAgICAg ICAgc2VsZiA9IG5ldyBLKCk7CiAgICAgIH0KCiAgICAgIHNlbGYuaW5uZXJI VE1MID0gaHRtbDsKICAgICAgdmFyIG15R3VpZCA9ICdtZXRhbW9ycGgtJyso Z3VpZCsrKTsKICAgICAgc2VsZi5zdGFydCA9IG15R3VpZCArICctc3RhcnQn OwogICAgICBzZWxmLmVuZCA9IG15R3VpZCArICctZW5kJzsKCiAgICAgIHJl dHVybiBzZWxmOwogICAgfTsKCiAgICBLLnByb3RvdHlwZSA9IE1ldGFtb3Jw aC5wcm90b3R5cGU7CgogICAgdmFyIHJhbmdlRm9yLCBodG1sRnVuYywgcmVt b3ZlRnVuYywgb3V0ZXJIVE1MRnVuYywgYXBwZW5kVG9GdW5jLCBhZnRlckZ1 bmMsIHByZXBlbmRGdW5jLCBzdGFydFRhZ0Z1bmMsIGVuZFRhZ0Z1bmM7Cgog ICAgb3V0ZXJIVE1MRnVuYyA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4g dGhpcy5zdGFydFRhZygpICsgdGhpcy5pbm5lckhUTUwgKyB0aGlzLmVuZFRh ZygpOwogICAgfTsKCiAgICBzdGFydFRhZ0Z1bmMgPSBmdW5jdGlvbigpIHsK ICAgICAgLyoKICAgICAgICogV2UgcmVwbGFjZSBjaGV2cm9uIGJ5IGl0cyBo ZXggY29kZSBpbiBvcmRlciB0byBwcmV2ZW50IGVzY2FwaW5nIHByb2JsZW1z LgogICAgICAgKiBDaGVjayB0aGlzIHRocmVhZCBmb3IgbW9yZSBleHBsYWlu YXRpb246CiAgICAgICAqIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVz dGlvbnMvODIzMTA0OC93aHktdXNlLXgzYy1pbnN0ZWFkLW9mLXdoZW4tZ2Vu ZXJhdGluZy1odG1sLWZyb20tamF2YXNjcmlwdAogICAgICAgKi8KICAgICAg cmV0dXJuICI8c2NyaXB0IGlkPSciICsgdGhpcy5zdGFydCArICInIHR5cGU9 J3RleHQveC1wbGFjZWhvbGRlcic+XHgzQy9zY3JpcHQ+IjsKICAgIH07Cgog ICAgZW5kVGFnRnVuYyA9IGZ1bmN0aW9uKCkgewogICAgICAvKgogICAgICAg KiBXZSByZXBsYWNlIGNoZXZyb24gYnkgaXRzIGhleCBjb2RlIGluIG9yZGVy IHRvIHByZXZlbnQgZXNjYXBpbmcgcHJvYmxlbXMuCiAgICAgICAqIENoZWNr IHRoaXMgdGhyZWFkIGZvciBtb3JlIGV4cGxhaW5hdGlvbjoKICAgICAgICog aHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy84MjMxMDQ4L3do eS11c2UteDNjLWluc3RlYWQtb2Ytd2hlbi1nZW5lcmF0aW5nLWh0bWwtZnJv bS1qYXZhc2NyaXB0CiAgICAgICAqLwogICAgICByZXR1cm4gIjxzY3JpcHQg aWQ9JyIgKyB0aGlzLmVuZCArICInIHR5cGU9J3RleHQveC1wbGFjZWhvbGRl cic+XHgzQy9zY3JpcHQ+IjsKICAgIH07CgogICAgLy8gSWYgd2UgaGF2ZSB0 aGUgVzNDIHJhbmdlIEFQSSwgdGhpcyBwcm9jZXNzIGlzIHJlbGF0aXZlbHkg c3RyYWlnaHQgZm9yd2FyZC4KICAgIGlmIChzdXBwb3J0c1JhbmdlKSB7Cgog ICAgICAvLyBHZXQgYSByYW5nZSBmb3IgdGhlIGN1cnJlbnQgbW9ycGguIE9w dGlvbmFsbHkgaW5jbHVkZSB0aGUgc3RhcnRpbmcgYW5kCiAgICAgIC8vIGVu ZGluZyBwbGFjZWhvbGRlcnMuCiAgICAgIHJhbmdlRm9yID0gZnVuY3Rpb24o bW9ycGgsIG91dGVyVG9vKSB7CiAgICAgICAgdmFyIHJhbmdlID0gZG9jdW1l bnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgICB2YXIgYmVmb3JlID0gZG9jdW1l bnQuZ2V0RWxlbWVudEJ5SWQobW9ycGguc3RhcnQpOwogICAgICAgIHZhciBh ZnRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG1vcnBoLmVuZCk7Cgog ICAgICAgIGlmIChvdXRlclRvbykgewogICAgICAgICAgcmFuZ2Uuc2V0U3Rh cnRCZWZvcmUoYmVmb3JlKTsKICAgICAgICAgIHJhbmdlLnNldEVuZEFmdGVy KGFmdGVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmFuZ2Uuc2V0 U3RhcnRBZnRlcihiZWZvcmUpOwogICAgICAgICAgcmFuZ2Uuc2V0RW5kQmVm b3JlKGFmdGVyKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiByYW5nZTsK ICAgICAgfTsKCiAgICAgIGh0bWxGdW5jID0gZnVuY3Rpb24oaHRtbCwgb3V0 ZXJUb28pIHsKICAgICAgICAvLyBnZXQgYSByYW5nZSBmb3IgdGhlIGN1cnJl bnQgbWV0YW1vcnBoIG9iamVjdAogICAgICAgIHZhciByYW5nZSA9IHJhbmdl Rm9yKHRoaXMsIG91dGVyVG9vKTsKCiAgICAgICAgLy8gZGVsZXRlIHRoZSBj b250ZW50cyBvZiB0aGUgcmFuZ2UsIHdoaWNoIHdpbGwgYmUgdGhlCiAgICAg ICAgLy8gbm9kZXMgYmV0d2VlbiB0aGUgc3RhcnRpbmcgYW5kIGVuZGluZyBw bGFjZWhvbGRlci4KICAgICAgICByYW5nZS5kZWxldGVDb250ZW50cygpOwoK ICAgICAgICAvLyBjcmVhdGUgYSBuZXcgZG9jdW1lbnQgZnJhZ21lbnQgZm9y IHRoZSBIVE1MCiAgICAgICAgdmFyIGZyYWdtZW50ID0gcmFuZ2UuY3JlYXRl Q29udGV4dHVhbEZyYWdtZW50KGh0bWwpOwoKICAgICAgICAvLyBpbnNlcnQg dGhlIGZyYWdtZW50IGludG8gdGhlIHJhbmdlCiAgICAgICAgcmFuZ2UuaW5z ZXJ0Tm9kZShmcmFnbWVudCk7CiAgICAgIH07CgogICAgICAvKioKICAgICAg KiBAcHVibGljCiAgICAgICoKICAgICAgKiBSZW1vdmUgdGhpcyBvYmplY3Qg KGluY2x1ZGluZyBzdGFydGluZyBhbmQgZW5kaW5nCiAgICAgICogcGxhY2Vo b2xkZXJzKS4KICAgICAgKgogICAgICAqIEBtZXRob2QgcmVtb3ZlCiAgICAg ICovCiAgICAgIHJlbW92ZUZ1bmMgPSBmdW5jdGlvbigpIHsKICAgICAgICAv LyBnZXQgYSByYW5nZSBmb3IgdGhlIGN1cnJlbnQgbWV0YW1vcnBoIG9iamVj dCBpbmNsdWRpbmcKICAgICAgICAvLyB0aGUgc3RhcnRpbmcgYW5kIGVuZGlu ZyBwbGFjZWhvbGRlcnMuCiAgICAgICAgdmFyIHJhbmdlID0gcmFuZ2VGb3Io dGhpcywgdHJ1ZSk7CgogICAgICAgIC8vIGRlbGV0ZSB0aGUgZW50aXJlIHJh bmdlLgogICAgICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7CiAgICAgIH07 CgogICAgICBhcHBlbmRUb0Z1bmMgPSBmdW5jdGlvbihub2RlKSB7CiAgICAg ICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAg ICByYW5nZS5zZXRTdGFydChub2RlKTsKICAgICAgICByYW5nZS5jb2xsYXBz ZShmYWxzZSk7CiAgICAgICAgdmFyIGZyYWcgPSByYW5nZS5jcmVhdGVDb250 ZXh0dWFsRnJhZ21lbnQodGhpcy5vdXRlckhUTUwoKSk7CiAgICAgICAgbm9k ZS5hcHBlbmRDaGlsZChmcmFnKTsKICAgICAgfTsKCiAgICAgIGFmdGVyRnVu YyA9IGZ1bmN0aW9uKGh0bWwpIHsKICAgICAgICB2YXIgcmFuZ2UgPSBkb2N1 bWVudC5jcmVhdGVSYW5nZSgpOwogICAgICAgIHZhciBhZnRlciA9IGRvY3Vt ZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZW5kKTsKCiAgICAgICAgcmFuZ2Uu c2V0U3RhcnRBZnRlcihhZnRlcik7CiAgICAgICAgcmFuZ2Uuc2V0RW5kQWZ0 ZXIoYWZ0ZXIpOwoKICAgICAgICB2YXIgZnJhZ21lbnQgPSByYW5nZS5jcmVh dGVDb250ZXh0dWFsRnJhZ21lbnQoaHRtbCk7CiAgICAgICAgcmFuZ2UuaW5z ZXJ0Tm9kZShmcmFnbWVudCk7CiAgICAgIH07CgogICAgICBwcmVwZW5kRnVu YyA9IGZ1bmN0aW9uKGh0bWwpIHsKICAgICAgICB2YXIgcmFuZ2UgPSBkb2N1 bWVudC5jcmVhdGVSYW5nZSgpOwogICAgICAgIHZhciBzdGFydCA9IGRvY3Vt ZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc3RhcnQpOwoKICAgICAgICByYW5n ZS5zZXRTdGFydEFmdGVyKHN0YXJ0KTsKICAgICAgICByYW5nZS5zZXRFbmRB ZnRlcihzdGFydCk7CgogICAgICAgIHZhciBmcmFnbWVudCA9IHJhbmdlLmNy ZWF0ZUNvbnRleHR1YWxGcmFnbWVudChodG1sKTsKICAgICAgICByYW5nZS5p bnNlcnROb2RlKGZyYWdtZW50KTsKICAgICAgfTsKCiAgICB9IGVsc2Ugewog ICAgICAvKgogICAgICAgKiBUaGlzIGNvZGUgaXMgbW9zdGx5IHRha2VuIGZy b20galF1ZXJ5LCB3aXRoIG9uZSBleGNlcHRpb24uIEluIGpRdWVyeSdzIGNh c2UsIHdlCiAgICAgICAqIGhhdmUgc29tZSBIVE1MIGFuZCB3ZSBuZWVkIHRv IGZpZ3VyZSBvdXQgaG93IHRvIGNvbnZlcnQgaXQgaW50byBzb21lIG5vZGVz LgogICAgICAgKgogICAgICAgKiBJbiB0aGlzIGNhc2UsIGpRdWVyeSBuZWVk cyB0byBzY2FuIHRoZSBIVE1MIGxvb2tpbmcgZm9yIGFuIG9wZW5pbmcgdGFn IGFuZCB1c2UKICAgICAgICogdGhhdCBhcyB0aGUga2V5IGZvciB0aGUgd3Jh cCBtYXAuIEluIG91ciBjYXNlLCB3ZSBrbm93IHRoZSBwYXJlbnQgbm9kZSwg YW5kCiAgICAgICAqIGNhbiB1c2UgaXRzIHR5cGUgYXMgdGhlIGtleSBmb3Ig dGhlIHdyYXAgbWFwLgogICAgICAgKiovCiAgICAgIHZhciB3cmFwTWFwID0g ewogICAgICAgIHNlbGVjdDogWyAxLCAiPHNlbGVjdCBtdWx0aXBsZT0nbXVs dGlwbGUnPiIsICI8L3NlbGVjdD4iIF0sCiAgICAgICAgZmllbGRzZXQ6IFsg MSwgIjxmaWVsZHNldD4iLCAiPC9maWVsZHNldD4iIF0sCiAgICAgICAgdGFi bGU6IFsgMSwgIjx0YWJsZT4iLCAiPC90YWJsZT4iIF0sCiAgICAgICAgdGJv ZHk6IFsgMiwgIjx0YWJsZT48dGJvZHk+IiwgIjwvdGJvZHk+PC90YWJsZT4i IF0sCiAgICAgICAgdHI6IFsgMywgIjx0YWJsZT48dGJvZHk+PHRyPiIsICI8 L3RyPjwvdGJvZHk+PC90YWJsZT4iIF0sCiAgICAgICAgY29sZ3JvdXA6IFsg MiwgIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwgIjwvY29s Z3JvdXA+PC90YWJsZT4iIF0sCiAgICAgICAgbWFwOiBbIDEsICI8bWFwPiIs ICI8L21hcD4iIF0sCiAgICAgICAgX2RlZmF1bHQ6IFsgMCwgIiIsICIiIF0K ICAgICAgfTsKCiAgICAgIHZhciBmaW5kQ2hpbGRCeUlkID0gZnVuY3Rpb24o ZWxlbWVudCwgaWQpIHsKICAgICAgICBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1 dGUoJ2lkJykgPT09IGlkKSB7IHJldHVybiBlbGVtZW50OyB9CgogICAgICAg IHZhciBsZW4gPSBlbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoLCBpZHgsIG5v ZGUsIGZvdW5kOwogICAgICAgIGZvciAoaWR4PTA7IGlkeDxsZW47IGlkeCsr KSB7CiAgICAgICAgICBub2RlID0gZWxlbWVudC5jaGlsZE5vZGVzW2lkeF07 CiAgICAgICAgICBmb3VuZCA9IG5vZGUubm9kZVR5cGUgPT09IDEgJiYgZmlu ZENoaWxkQnlJZChub2RlLCBpZCk7CiAgICAgICAgICBpZiAoZm91bmQpIHsg cmV0dXJuIGZvdW5kOyB9CiAgICAgICAgfQogICAgICB9OwoKICAgICAgdmFy IHNldElubmVySFRNTCA9IGZ1bmN0aW9uKGVsZW1lbnQsIGh0bWwpIHsKICAg ICAgICB2YXIgbWF0Y2hlcyA9IFtdOwogICAgICAgIGlmIChtb3Zlc1doaXRl c3BhY2UpIHsKICAgICAgICAgIC8vIFJpZ2h0IG5vdyB3ZSBvbmx5IGNoZWNr IGZvciBzY3JpcHQgdGFncyB3aXRoIGlkcyB3aXRoIHRoZQogICAgICAgICAg Ly8gZ29hbCBvZiB0YXJnZXRpbmcgbW9ycGhzLgogICAgICAgICAgaHRtbCA9 IGh0bWwucmVwbGFjZSgvKFxzKykoPHNjcmlwdCBpZD0nKFteJ10rKScpL2cs IGZ1bmN0aW9uKG1hdGNoLCBzcGFjZXMsIHRhZywgaWQpIHsKICAgICAgICAg ICAgbWF0Y2hlcy5wdXNoKFtpZCwgc3BhY2VzXSk7CiAgICAgICAgICAgIHJl dHVybiB0YWc7CiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIGVs ZW1lbnQuaW5uZXJIVE1MID0gaHRtbDsKCiAgICAgICAgLy8gSWYgd2UgaGF2 ZSB0byBkbyBhbnkgd2hpdGVzcGFjZSBhZGp1c3RtZW50cyBkbyB0aGVtIG5v dwogICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDApIHsKICAgICAgICAg IHZhciBsZW4gPSBtYXRjaGVzLmxlbmd0aCwgaWR4OwogICAgICAgICAgZm9y IChpZHg9MDsgaWR4PGxlbjsgaWR4KyspIHsKICAgICAgICAgICAgdmFyIHNj cmlwdCA9IGZpbmRDaGlsZEJ5SWQoZWxlbWVudCwgbWF0Y2hlc1tpZHhdWzBd KSwKICAgICAgICAgICAgICAgIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0 Tm9kZShtYXRjaGVzW2lkeF1bMV0pOwogICAgICAgICAgICBzY3JpcHQucGFy ZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgc2NyaXB0KTsKICAgICAgICAg IH0KICAgICAgICB9CiAgICAgIH07CgogICAgICAvKgogICAgICAgKiBHaXZl biBhIHBhcmVudCBub2RlIGFuZCBzb21lIEhUTUwsIGdlbmVyYXRlIGEgc2V0 IG9mIG5vZGVzLiBSZXR1cm4gdGhlIGZpcnN0CiAgICAgICAqIG5vZGUsIHdo aWNoIHdpbGwgYWxsb3cgdXMgdG8gdHJhdmVyc2UgdGhlIHJlc3QgdXNpbmcg bmV4dFNpYmxpbmcuCiAgICAgICAqCiAgICAgICAqIFdlIG5lZWQgdG8gZG8g dGhpcyBiZWNhdXNlIGlubmVySFRNTCBpbiBJRSBkb2VzIG5vdCByZWFsbHkg cGFyc2UgdGhlIG5vZGVzLgogICAgICAgKi8KICAgICAgdmFyIGZpcnN0Tm9k ZUZvciA9IGZ1bmN0aW9uKHBhcmVudE5vZGUsIGh0bWwpIHsKICAgICAgICB2 YXIgYXJyID0gd3JhcE1hcFtwYXJlbnROb2RlLnRhZ05hbWUudG9Mb3dlckNh c2UoKV0gfHwgd3JhcE1hcC5fZGVmYXVsdDsKICAgICAgICB2YXIgZGVwdGgg PSBhcnJbMF0sIHN0YXJ0ID0gYXJyWzFdLCBlbmQgPSBhcnJbMl07CgogICAg ICAgIGlmIChuZWVkc1NoeSkgeyBodG1sID0gJyZzaHk7JytodG1sOyB9Cgog ICAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgn ZGl2Jyk7CgogICAgICAgIHNldElubmVySFRNTChlbGVtZW50LCBzdGFydCAr IGh0bWwgKyBlbmQpOwoKICAgICAgICBmb3IgKHZhciBpPTA7IGk8PWRlcHRo OyBpKyspIHsKICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LmZpcnN0Q2hp bGQ7CiAgICAgICAgfQoKICAgICAgICAvLyBMb29rIGZvciAmc2h5OyB0byBy ZW1vdmUgaXQuCiAgICAgICAgaWYgKG5lZWRzU2h5KSB7CiAgICAgICAgICB2 YXIgc2h5RWxlbWVudCA9IGVsZW1lbnQ7CgogICAgICAgICAgLy8gU29tZXRp bWVzIHdlIGdldCBuYW1lbGVzcyBlbGVtZW50cyB3aXRoIHRoZSBzaHkgaW5z aWRlCiAgICAgICAgICB3aGlsZSAoc2h5RWxlbWVudC5ub2RlVHlwZSA9PT0g MSAmJiAhc2h5RWxlbWVudC5ub2RlTmFtZSkgewogICAgICAgICAgICBzaHlF bGVtZW50ID0gc2h5RWxlbWVudC5maXJzdENoaWxkOwogICAgICAgICAgfQoK ICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgaXQncyB0aGUgYWN0dWFsIHVu aWNvZGUgY2hhcmFjdGVyLgogICAgICAgICAgaWYgKHNoeUVsZW1lbnQubm9k ZVR5cGUgPT09IDMgJiYgc2h5RWxlbWVudC5ub2RlVmFsdWUuY2hhckF0KDAp ID09PSAiXHUwMEFEIikgewogICAgICAgICAgICBzaHlFbGVtZW50Lm5vZGVW YWx1ZSA9IHNoeUVsZW1lbnQubm9kZVZhbHVlLnNsaWNlKDEpOwogICAgICAg ICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CiAgICAg IH07CgogICAgICAvKgogICAgICAgKiBJbiBzb21lIGNhc2VzLCBJbnRlcm5l dCBFeHBsb3JlciBjYW4gY3JlYXRlIGFuIGFub255bW91cyBub2RlIGluCiAg ICAgICAqIHRoZSBoaWVyYXJjaHkgd2l0aCBubyB0YWdOYW1lLiBZb3UgY2Fu IGNyZWF0ZSB0aGlzIHNjZW5hcmlvIHZpYToKICAgICAgICoKICAgICAgICog ICAgIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAg ICAgKiAgICAgZGl2LmlubmVySFRNTCA9ICI8dGFibGU+JnNoeTxzY3JpcHQ+ PC9zY3JpcHQ+PHRyPjx0ZD5oaTwvdGQ+PC90cj48L3RhYmxlPiI7CiAgICAg ICAqICAgICBkaXYuZmlyc3RDaGlsZC5maXJzdENoaWxkLnRhZ05hbWUgLy89 PiAiIgogICAgICAgKgogICAgICAgKiBJZiBvdXIgc2NyaXB0IG1hcmtlcnMg YXJlIGluc2lkZSBzdWNoIGEgbm9kZSwgd2UgbmVlZCB0byBmaW5kIHRoYXQK ICAgICAgICogbm9kZSBhbmQgdXNlICppdCogYXMgdGhlIG1hcmtlci4KICAg ICAgICovCiAgICAgIHZhciByZWFsTm9kZSA9IGZ1bmN0aW9uKHN0YXJ0KSB7 CiAgICAgICAgd2hpbGUgKHN0YXJ0LnBhcmVudE5vZGUudGFnTmFtZSA9PT0g IiIpIHsKICAgICAgICAgIHN0YXJ0ID0gc3RhcnQucGFyZW50Tm9kZTsKICAg ICAgICB9CgogICAgICAgIHJldHVybiBzdGFydDsKICAgICAgfTsKCiAgICAg IC8qCiAgICAgICAqIFdoZW4gYXV0b21hdGljYWxseSBhZGRpbmcgYSB0Ym9k eSwgSW50ZXJuZXQgRXhwbG9yZXIgaW5zZXJ0cyB0aGUKICAgICAgICogdGJv ZHkgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBmaXJzdCA8dHI+LiBPdGhlciBi cm93c2VycyBjcmVhdGUgaXQKICAgICAgICogYmVmb3JlIHRoZSBmaXJzdCBu b2RlLCBubyBtYXR0ZXIgd2hhdC4KICAgICAgICoKICAgICAgICogVGhpcyBt ZWFucyB0aGUgdGhlIGZvbGxvd2luZyBjb2RlOgogICAgICAgKgogICAgICAg KiAgICAgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAg ICAgICAqICAgICBkaXYuaW5uZXJIVE1MID0gIjx0YWJsZT48c2NyaXB0IGlk PSdmaXJzdCc+PC9zY3JpcHQ+PHRyPjx0ZD5oaTwvdGQ+PC90cj48c2NyaXB0 IGlkPSdsYXN0Jz48L3NjcmlwdD48L3RhYmxlPgogICAgICAgKgogICAgICAg KiBHZW5lcmF0ZXMgdGhlIGZvbGxvd2luZyBET00gaW4gSUU6CiAgICAgICAq CiAgICAgICAqICAgICArIGRpdgogICAgICAgKiAgICAgICArIHRhYmxlCiAg ICAgICAqICAgICAgICAgLSBzY3JpcHQgaWQ9J2ZpcnN0JwogICAgICAgKiAg ICAgICAgICsgdGJvZHkKICAgICAgICogICAgICAgICAgICsgdHIKICAgICAg ICogICAgICAgICAgICAgKyB0ZAogICAgICAgKiAgICAgICAgICAgICAgIC0g ImhpIgogICAgICAgKiAgICAgICAgICAgLSBzY3JpcHQgaWQ9J2xhc3QnCiAg ICAgICAqCiAgICAgICAqIFdoaWNoIG1lYW5zIHRoYXQgdGhlIHR3byBzY3Jp cHQgdGFncywgZXZlbiB0aG91Z2ggdGhleSB3ZXJlCiAgICAgICAqIGluc2Vy dGVkIGF0IHRoZSBzYW1lIHBvaW50IGluIHRoZSBoaWVyYXJjaHkgaW4gdGhl IG9yaWdpbmFsCiAgICAgICAqIEhUTUwsIG5vdyBoYXZlIGRpZmZlcmVudCBw YXJlbnRzLgogICAgICAgKgogICAgICAgKiBUaGlzIGNvZGUgcmVwYXJlbnRz IHRoZSBmaXJzdCBzY3JpcHQgdGFnIGJ5IG1ha2luZyBpdCB0aGUgdGJvZHkn cwogICAgICAgKiBmaXJzdCBjaGlsZC4KICAgICAgICoKICAgICAgICovCiAg ICAgIHZhciBmaXhQYXJlbnRhZ2UgPSBmdW5jdGlvbihzdGFydCwgZW5kKSB7 CiAgICAgICAgaWYgKHN0YXJ0LnBhcmVudE5vZGUgIT09IGVuZC5wYXJlbnRO b2RlKSB7CiAgICAgICAgICBlbmQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUo c3RhcnQsIGVuZC5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpOwogICAgICAgIH0K ICAgICAgfTsKCiAgICAgIGh0bWxGdW5jID0gZnVuY3Rpb24oaHRtbCwgb3V0 ZXJUb28pIHsKICAgICAgICAvLyBnZXQgdGhlIHJlYWwgc3RhcnRpbmcgbm9k ZS4gc2VlIHJlYWxOb2RlIGZvciBkZXRhaWxzLgogICAgICAgIHZhciBzdGFy dCA9IHJlYWxOb2RlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc3Rh cnQpKTsKICAgICAgICB2YXIgZW5kID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5 SWQodGhpcy5lbmQpOwogICAgICAgIHZhciBwYXJlbnROb2RlID0gZW5kLnBh cmVudE5vZGU7CiAgICAgICAgdmFyIG5vZGUsIG5leHRTaWJsaW5nLCBsYXN0 OwoKICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgc3RhcnQgYW5kIGVu ZCBub2RlcyBzaGFyZSB0aGUgc2FtZQogICAgICAgIC8vIHBhcmVudC4gSWYg bm90LCBmaXggaXQuCiAgICAgICAgZml4UGFyZW50YWdlKHN0YXJ0LCBlbmQp OwoKICAgICAgICAvLyByZW1vdmUgYWxsIG9mIHRoZSBub2RlcyBhZnRlciB0 aGUgc3RhcnRpbmcgcGxhY2Vob2xkZXIgYW5kCiAgICAgICAgLy8gYmVmb3Jl IHRoZSBlbmRpbmcgcGxhY2Vob2xkZXIuCiAgICAgICAgbm9kZSA9IHN0YXJ0 Lm5leHRTaWJsaW5nOwogICAgICAgIHdoaWxlIChub2RlKSB7CiAgICAgICAg ICBuZXh0U2libGluZyA9IG5vZGUubmV4dFNpYmxpbmc7CiAgICAgICAgICBs YXN0ID0gbm9kZSA9PT0gZW5kOwoKICAgICAgICAgIC8vIGlmIHRoaXMgaXMg dGhlIGxhc3Qgbm9kZSwgYW5kIHdlIHdhbnQgdG8gcmVtb3ZlIGl0IGFzIHdl bGwsCiAgICAgICAgICAvLyBzZXQgdGhlIGBlbmRgIG5vZGUgdG8gdGhlIG5l eHQgc2libGluZy4gVGhpcyBpcyBiZWNhdXNlCiAgICAgICAgICAvLyBmb3Ig dGhlIHJlc3Qgb2YgdGhlIGZ1bmN0aW9uLCB3ZSBpbnNlcnQgdGhlIG5ldyBu b2RlcwogICAgICAgICAgLy8gYmVmb3JlIHRoZSBlbmQgKG5vdGUgdGhhdCBp bnNlcnRCZWZvcmUobm9kZSwgbnVsbCkgaXMKICAgICAgICAgIC8vIHRoZSBz YW1lIGFzIGFwcGVuZENoaWxkKG5vZGUpKS4KICAgICAgICAgIC8vCiAgICAg ICAgICAvLyBpZiB3ZSBkbyBub3Qgd2FudCB0byByZW1vdmUgaXQsIGp1c3Qg YnJlYWsuCiAgICAgICAgICBpZiAobGFzdCkgewogICAgICAgICAgICBpZiAo b3V0ZXJUb28pIHsgZW5kID0gbm9kZS5uZXh0U2libGluZzsgfSBlbHNlIHsg YnJlYWs7IH0KICAgICAgICAgIH0KCiAgICAgICAgICBub2RlLnBhcmVudE5v ZGUucmVtb3ZlQ2hpbGQobm9kZSk7CgogICAgICAgICAgLy8gaWYgdGhpcyBp cyB0aGUgbGFzdCBub2RlIGFuZCB3ZSBkaWRuJ3QgYnJlYWsgYmVmb3JlCiAg ICAgICAgICAvLyAoYmVjYXVzZSB3ZSB3YW50ZWQgdG8gcmVtb3ZlIHRoZSBv dXRlciBub2RlcyksIGJyZWFrCiAgICAgICAgICAvLyBub3cuCiAgICAgICAg ICBpZiAobGFzdCkgeyBicmVhazsgfQoKICAgICAgICAgIG5vZGUgPSBuZXh0 U2libGluZzsKICAgICAgICB9CgogICAgICAgIC8vIGdldCB0aGUgZmlyc3Qg bm9kZSBmb3IgdGhlIEhUTUwgc3RyaW5nLCBldmVuIGluIGNhc2VzIGxpa2UK ICAgICAgICAvLyB0YWJsZXMgYW5kIGxpc3RzIHdoZXJlIGEgc2ltcGxlIGlu bmVySFRNTCBvbiBhIGRpdiB3b3VsZAogICAgICAgIC8vIHN3YWxsb3cgc29t ZSBvZiB0aGUgY29udGVudC4KICAgICAgICBub2RlID0gZmlyc3ROb2RlRm9y KHN0YXJ0LnBhcmVudE5vZGUsIGh0bWwpOwoKICAgICAgICBpZiAob3V0ZXJU b28pIHsKICAgICAgICAgIHN0YXJ0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQo c3RhcnQpOwogICAgICAgIH0KCiAgICAgICAgLy8gY29weSB0aGUgbm9kZXMg Zm9yIHRoZSBIVE1MIGJldHdlZW4gdGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcK ICAgICAgICAvLyBwbGFjZWhvbGRlci4KICAgICAgICB3aGlsZSAobm9kZSkg ewogICAgICAgICAgbmV4dFNpYmxpbmcgPSBub2RlLm5leHRTaWJsaW5nOwog ICAgICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgZW5kKTsK ICAgICAgICAgIG5vZGUgPSBuZXh0U2libGluZzsKICAgICAgICB9CiAgICAg IH07CgogICAgICAvLyByZW1vdmUgdGhlIG5vZGVzIGluIHRoZSBET00gcmVw cmVzZW50aW5nIHRoaXMgbWV0YW1vcnBoLgogICAgICAvLwogICAgICAvLyB0 aGlzIGluY2x1ZGVzIHRoZSBzdGFydGluZyBhbmQgZW5kaW5nIHBsYWNlaG9s ZGVycy4KICAgICAgcmVtb3ZlRnVuYyA9IGZ1bmN0aW9uKCkgewogICAgICAg IHZhciBzdGFydCA9IHJlYWxOb2RlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlk KHRoaXMuc3RhcnQpKTsKICAgICAgICB2YXIgZW5kID0gZG9jdW1lbnQuZ2V0 RWxlbWVudEJ5SWQodGhpcy5lbmQpOwoKICAgICAgICB0aGlzLmh0bWwoJycp OwogICAgICAgIHN0YXJ0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3RhcnQp OwogICAgICAgIGVuZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVuZCk7CiAg ICAgIH07CgogICAgICBhcHBlbmRUb0Z1bmMgPSBmdW5jdGlvbihwYXJlbnRO b2RlKSB7CiAgICAgICAgdmFyIG5vZGUgPSBmaXJzdE5vZGVGb3IocGFyZW50 Tm9kZSwgdGhpcy5vdXRlckhUTUwoKSk7CiAgICAgICAgdmFyIG5leHRTaWJs aW5nOwoKICAgICAgICB3aGlsZSAobm9kZSkgewogICAgICAgICAgbmV4dFNp YmxpbmcgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICAgICAgcGFyZW50Tm9k ZS5hcHBlbmRDaGlsZChub2RlKTsKICAgICAgICAgIG5vZGUgPSBuZXh0U2li bGluZzsKICAgICAgICB9CiAgICAgIH07CgogICAgICBhZnRlckZ1bmMgPSBm dW5jdGlvbihodG1sKSB7CiAgICAgICAgLy8gZ2V0IHRoZSByZWFsIHN0YXJ0 aW5nIG5vZGUuIHNlZSByZWFsTm9kZSBmb3IgZGV0YWlscy4KICAgICAgICB2 YXIgZW5kID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5lbmQpOwog ICAgICAgIHZhciBpbnNlcnRCZWZvcmUgPSBlbmQubmV4dFNpYmxpbmc7CiAg ICAgICAgdmFyIHBhcmVudE5vZGUgPSBlbmQucGFyZW50Tm9kZTsKICAgICAg ICB2YXIgbmV4dFNpYmxpbmc7CiAgICAgICAgdmFyIG5vZGU7CgogICAgICAg IC8vIGdldCB0aGUgZmlyc3Qgbm9kZSBmb3IgdGhlIEhUTUwgc3RyaW5nLCBl dmVuIGluIGNhc2VzIGxpa2UKICAgICAgICAvLyB0YWJsZXMgYW5kIGxpc3Rz IHdoZXJlIGEgc2ltcGxlIGlubmVySFRNTCBvbiBhIGRpdiB3b3VsZAogICAg ICAgIC8vIHN3YWxsb3cgc29tZSBvZiB0aGUgY29udGVudC4KICAgICAgICBu b2RlID0gZmlyc3ROb2RlRm9yKHBhcmVudE5vZGUsIGh0bWwpOwoKICAgICAg ICAvLyBjb3B5IHRoZSBub2RlcyBmb3IgdGhlIEhUTUwgYmV0d2VlbiB0aGUg c3RhcnRpbmcgYW5kIGVuZGluZwogICAgICAgIC8vIHBsYWNlaG9sZGVyLgog ICAgICAgIHdoaWxlIChub2RlKSB7CiAgICAgICAgICBuZXh0U2libGluZyA9 IG5vZGUubmV4dFNpYmxpbmc7CiAgICAgICAgICBwYXJlbnROb2RlLmluc2Vy dEJlZm9yZShub2RlLCBpbnNlcnRCZWZvcmUpOwogICAgICAgICAgbm9kZSA9 IG5leHRTaWJsaW5nOwogICAgICAgIH0KICAgICAgfTsKCiAgICAgIHByZXBl bmRGdW5jID0gZnVuY3Rpb24oaHRtbCkgewogICAgICAgIHZhciBzdGFydCA9 IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc3RhcnQpOwogICAgICAg IHZhciBwYXJlbnROb2RlID0gc3RhcnQucGFyZW50Tm9kZTsKICAgICAgICB2 YXIgbmV4dFNpYmxpbmc7CiAgICAgICAgdmFyIG5vZGU7CgogICAgICAgIG5v ZGUgPSBmaXJzdE5vZGVGb3IocGFyZW50Tm9kZSwgaHRtbCk7CiAgICAgICAg dmFyIGluc2VydEJlZm9yZSA9IHN0YXJ0Lm5leHRTaWJsaW5nOwoKICAgICAg ICB3aGlsZSAobm9kZSkgewogICAgICAgICAgbmV4dFNpYmxpbmcgPSBub2Rl Lm5leHRTaWJsaW5nOwogICAgICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZv cmUobm9kZSwgaW5zZXJ0QmVmb3JlKTsKICAgICAgICAgIG5vZGUgPSBuZXh0 U2libGluZzsKICAgICAgICB9CiAgICAgIH07CiAgICB9CgogICAgTWV0YW1v cnBoLnByb3RvdHlwZS5odG1sID0gZnVuY3Rpb24oaHRtbCkgewogICAgICB0 aGlzLmNoZWNrUmVtb3ZlZCgpOwogICAgICBpZiAoaHRtbCA9PT0gdW5kZWZp bmVkKSB7IHJldHVybiB0aGlzLmlubmVySFRNTDsgfQoKICAgICAgaHRtbEZ1 bmMuY2FsbCh0aGlzLCBodG1sKTsKCiAgICAgIHRoaXMuaW5uZXJIVE1MID0g aHRtbDsKICAgIH07CgogICAgTWV0YW1vcnBoLnByb3RvdHlwZS5yZXBsYWNl V2l0aCA9IGZ1bmN0aW9uKGh0bWwpIHsKICAgICAgdGhpcy5jaGVja1JlbW92 ZWQoKTsKICAgICAgaHRtbEZ1bmMuY2FsbCh0aGlzLCBodG1sLCB0cnVlKTsK ICAgIH07CgogICAgTWV0YW1vcnBoLnByb3RvdHlwZS5yZW1vdmUgPSByZW1v dmVGdW5jOwogICAgTWV0YW1vcnBoLnByb3RvdHlwZS5vdXRlckhUTUwgPSBv dXRlckhUTUxGdW5jOwogICAgTWV0YW1vcnBoLnByb3RvdHlwZS5hcHBlbmRU byA9IGFwcGVuZFRvRnVuYzsKICAgIE1ldGFtb3JwaC5wcm90b3R5cGUuYWZ0 ZXIgPSBhZnRlckZ1bmM7CiAgICBNZXRhbW9ycGgucHJvdG90eXBlLnByZXBl bmQgPSBwcmVwZW5kRnVuYzsKICAgIE1ldGFtb3JwaC5wcm90b3R5cGUuc3Rh cnRUYWcgPSBzdGFydFRhZ0Z1bmM7CiAgICBNZXRhbW9ycGgucHJvdG90eXBl LmVuZFRhZyA9IGVuZFRhZ0Z1bmM7CgogICAgTWV0YW1vcnBoLnByb3RvdHlw ZS5pc1JlbW92ZWQgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIGJlZm9yZSA9 IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc3RhcnQpOwogICAgICB2 YXIgYWZ0ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmVuZCk7 CgogICAgICByZXR1cm4gIWJlZm9yZSB8fCAhYWZ0ZXI7CiAgICB9OwoKICAg IE1ldGFtb3JwaC5wcm90b3R5cGUuY2hlY2tSZW1vdmVkID0gZnVuY3Rpb24o KSB7CiAgICAgIGlmICh0aGlzLmlzUmVtb3ZlZCgpKSB7CiAgICAgICAgdGhy b3cgbmV3IEVycm9yKCJDYW5ub3QgcGVyZm9ybSBvcGVyYXRpb25zIG9uIGEg TWV0YW1vcnBoIHRoYXQgaXMgbm90IGluIHRoZSBET00uIik7CiAgICAgIH0K ICAgIH07CgogICAgcmV0dXJuIE1ldGFtb3JwaDsKICB9KTsKCn0pKCk7Cgoo ZnVuY3Rpb24oKSB7Ci8qKgpAbW9kdWxlIGVtYmVyCkBzdWJtb2R1bGUgZW1i ZXItaGFuZGxlYmFycy1jb21waWxlcgoqLwoKLy8gRWxpbWluYXRlIGRlcGVu ZGVuY3kgb24gYW55IEVtYmVyIHRvIHNpbXBsaWZ5IHByZWNvbXBpbGF0aW9u IHdvcmtmbG93CnZhciBvYmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlIHx8 IGZ1bmN0aW9uKHBhcmVudCkgewogIGZ1bmN0aW9uIEYoKSB7fQogIEYucHJv dG90eXBlID0gcGFyZW50OwogIHJldHVybiBuZXcgRigpOwp9OwoKdmFyIEhh bmRsZWJhcnMgPSAoRW1iZXIuaW1wb3J0cyAmJiBFbWJlci5pbXBvcnRzLkhh bmRsZWJhcnMpIHx8ICh0aGlzICYmIHRoaXMuSGFuZGxlYmFycyk7CmlmICgh SGFuZGxlYmFycyAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJykg ewogIEhhbmRsZWJhcnMgPSByZXF1aXJlKCdoYW5kbGViYXJzJyk7Cn0KCkVt YmVyLmFzc2VydCgiRW1iZXIgSGFuZGxlYmFycyByZXF1aXJlcyBIYW5kbGVi YXJzIHZlcnNpb24gMS4wIG9yIDEuMS4gSW5jbHVkZSAiICsKICAgICAgICAg ICAgICJhIFNDUklQVCB0YWcgaW4gdGhlIEhUTUwgSEVBRCBsaW5raW5nIHRv IHRoZSBIYW5kbGViYXJzIGZpbGUgIiArCiAgICAgICAgICAgICAiYmVmb3Jl IHlvdSBsaW5rIHRvIEVtYmVyLiIsIEhhbmRsZWJhcnMpOwoKRW1iZXIuYXNz ZXJ0KCJFbWJlciBIYW5kbGViYXJzIHJlcXVpcmVzIEhhbmRsZWJhcnMgdmVy c2lvbiAxLjAgb3IgMS4xLCAiICsKICAgICAgICAgICAgICJDT01QSUxFUl9S RVZJU0lPTiBleHBlY3RlZDogNCwgZ290OiAiICsgIEhhbmRsZWJhcnMuQ09N UElMRVJfUkVWSVNJT04gKwogICAgICAgICAgICAgIiAtIFBsZWFzZSBub3Rl OiBCdWlsZHMgb2YgbWFzdGVyIG1heSBoYXZlIG90aGVyIENPTVBJTEVSX1JF VklTSU9OIHZhbHVlcy4iLAogICAgICAgICAgICAgSGFuZGxlYmFycy5DT01Q SUxFUl9SRVZJU0lPTiA9PT0gNCk7CgovKioKICBQcmVwYXJlcyB0aGUgSGFu ZGxlYmFycyB0ZW1wbGF0aW5nIGxpYnJhcnkgZm9yIHVzZSBpbnNpZGUgRW1i ZXIncyB2aWV3CiAgc3lzdGVtLgoKICBUaGUgYEVtYmVyLkhhbmRsZWJhcnNg IG9iamVjdCBpcyB0aGUgc3RhbmRhcmQgSGFuZGxlYmFycyBsaWJyYXJ5LCBl eHRlbmRlZCB0bwogIHVzZSBFbWJlcidzIGBnZXQoKWAgbWV0aG9kIGluc3Rl YWQgb2YgZGlyZWN0IHByb3BlcnR5IGFjY2Vzcywgd2hpY2ggYWxsb3dzCiAg Y29tcHV0ZWQgcHJvcGVydGllcyB0byBiZSB1c2VkIGluc2lkZSB0ZW1wbGF0 ZXMuCgogIFRvIGNyZWF0ZSBhbiBgRW1iZXIuSGFuZGxlYmFyc2AgdGVtcGxh dGUsIGNhbGwgYEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgpYC4KICBUaGlz IHdpbGwgcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCBieSBg RW1iZXIuVmlld2AgZm9yIHJlbmRlcmluZy4KCiAgQGNsYXNzIEhhbmRsZWJh cnMKICBAbmFtZXNwYWNlIEVtYmVyCiovCkVtYmVyLkhhbmRsZWJhcnMgPSBv YmplY3RDcmVhdGUoSGFuZGxlYmFycyk7CgovKioKICBSZWdpc3RlciBhIGJv dW5kIGhlbHBlciBvciBjdXN0b20gdmlldyBoZWxwZXIuCgogICMjIFNpbXBs ZSBib3VuZCBoZWxwZXIgZXhhbXBsZQoKICBgYGBqYXZhc2NyaXB0CiAgRW1i ZXIuSGFuZGxlYmFycy5oZWxwZXIoJ2NhcGl0YWxpemUnLCBmdW5jdGlvbih2 YWx1ZSkgewogICAgcmV0dXJuIHZhbHVlLnRvVXBwZXJDYXNlKCk7CiAgfSk7 CiAgYGBgCgogIFRoZSBhYm92ZSBib3VuZCBoZWxwZXIgY2FuIGJlIHVzZWQg aW5zaWRlIG9mIHRlbXBsYXRlcyBhcyBmb2xsb3dzOgoKICBgYGBoYW5kbGVi YXJzCiAge3tjYXBpdGFsaXplIG5hbWV9fQogIGBgYAoKICBJbiB0aGlzIGNh c2UsIHdoZW4gdGhlIGBuYW1lYCBwcm9wZXJ0eSBvZiB0aGUgdGVtcGxhdGUn cyBjb250ZXh0IGNoYW5nZXMsCiAgdGhlIHJlbmRlcmVkIHZhbHVlIG9mIHRo ZSBoZWxwZXIgd2lsbCB1cGRhdGUgdG8gcmVmbGVjdCB0aGlzIGNoYW5nZS4K CiAgRm9yIG1vcmUgZXhhbXBsZXMgb2YgYm91bmQgaGVscGVycywgc2VlIGRv Y3VtZW50YXRpb24gZm9yCiAgYEVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJC b3VuZEhlbHBlcmAuCgogICMjIEN1c3RvbSB2aWV3IGhlbHBlciBleGFtcGxl CgogIEFzc3VtaW5nIGEgdmlldyBzdWJjbGFzcyBuYW1lZCBgQXBwLkNhbGVu ZGFyVmlld2Agd2VyZSBkZWZpbmVkLCBhIGhlbHBlcgogIGZvciByZW5kZXJp bmcgaW5zdGFuY2VzIG9mIHRoaXMgdmlldyBjb3VsZCBiZSByZWdpc3RlcmVk IGFzIGZvbGxvd3M6CgogIGBgYGphdmFzY3JpcHQKICBFbWJlci5IYW5kbGVi YXJzLmhlbHBlcignY2FsZW5kYXInLCBBcHAuQ2FsZW5kYXJWaWV3KToKICBg YGAKCiAgVGhlIGFib3ZlIGJvdW5kIGhlbHBlciBjYW4gYmUgdXNlZCBpbnNp ZGUgb2YgdGVtcGxhdGVzIGFzIGZvbGxvd3M6CgogIGBgYGhhbmRsZWJhcnMK ICB7e2NhbGVuZGFyfX0KICBgYGAKCiAgV2hpY2ggaXMgZnVuY3Rpb25hbGx5 IGVxdWl2YWxlbnQgdG86CgogIGBgYGhhbmRsZWJhcnMKICB7e3ZpZXcgQXBw LkNhbGVuZGFyVmlld319CiAgYGBgCgogIE9wdGlvbnMgaW4gdGhlIGhlbHBl ciB3aWxsIGJlIHBhc3NlZCB0byB0aGUgdmlldyBpbiBleGFjdGx5IHRoZSBz YW1lCiAgbWFubmVyIGFzIHdpdGggdGhlIGB2aWV3YCBoZWxwZXIuCgogIEBt ZXRob2QgaGVscGVyCiAgQGZvciBFbWJlci5IYW5kbGViYXJzCiAgQHBhcmFt IHtTdHJpbmd9IG5hbWUKICBAcGFyYW0ge0Z1bmN0aW9ufEVtYmVyLlZpZXd9 IGZ1bmN0aW9uIG9yIHZpZXcgY2xhc3MgY29uc3RydWN0b3IKICBAcGFyYW0g e1N0cmluZ30gZGVwZW5kZW50S2V5cyoKKi8KRW1iZXIuSGFuZGxlYmFycy5o ZWxwZXIgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgewogIEVtYmVyLmFzc2Vy dCgiWW91IHRyaWVkIHRvIHJlZ2lzdGVyIGEgY29tcG9uZW50IG5hbWVkICci ICsgbmFtZSArICInLCBidXQgY29tcG9uZW50IG5hbWVzIG11c3QgaW5jbHVk ZSBhICctJyIsICFFbWJlci5Db21wb25lbnQuZGV0ZWN0KHZhbHVlKSB8fCBu YW1lLm1hdGNoKC8tLykpOwoKICBpZiAoRW1iZXIuVmlldy5kZXRlY3QodmFs dWUpKSB7CiAgICBFbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKG5h bWUsIEVtYmVyLkhhbmRsZWJhcnMubWFrZVZpZXdIZWxwZXIodmFsdWUpKTsK ICB9IGVsc2UgewogICAgRW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckJvdW5k SGVscGVyLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgfQp9OwoKLyoqCiAg UmV0dXJucyBhIGhlbHBlciBmdW5jdGlvbiB0aGF0IHJlbmRlcnMgdGhlIHBy b3ZpZGVkIFZpZXdDbGFzcy4KCiAgVXNlZCBpbnRlcm5hbGx5IGJ5IEVtYmVy LkhhbmRsZWJhcnMuaGVscGVyIGFuZCBvdGhlciBtZXRob2RzCiAgaW52b2x2 aW5nIGhlbHBlci9jb21wb25lbnQgcmVnaXN0cmF0aW9uLgoKICBAcHJpdmF0 ZQogIEBtZXRob2QgaGVscGVyCiAgQGZvciBFbWJlci5IYW5kbGViYXJzCiAg QHBhcmFtIHtGdW5jdGlvbn0gVmlld0NsYXNzIHZpZXcgY2xhc3MgY29uc3Ry dWN0b3IKKi8KRW1iZXIuSGFuZGxlYmFycy5tYWtlVmlld0hlbHBlciA9IGZ1 bmN0aW9uKFZpZXdDbGFzcykgewogIHJldHVybiBmdW5jdGlvbihvcHRpb25z KSB7CiAgICBFbWJlci5hc3NlcnQoIllvdSBjYW4gb25seSBwYXNzIGF0dHJp YnV0ZXMgKHN1Y2ggYXMgbmFtZT12YWx1ZSkgbm90IGJhcmUgdmFsdWVzIHRv IGEgaGVscGVyIGZvciBhIFZpZXcgZm91bmQgaW4gJyIgKyBWaWV3Q2xhc3Mu dG9TdHJpbmcoKSArICInIiwgYXJndW1lbnRzLmxlbmd0aCA8IDIpOwogICAg cmV0dXJuIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycy52aWV3LmNhbGwodGhp cywgVmlld0NsYXNzLCBvcHRpb25zKTsKICB9Owp9OwoKLyoqCkBjbGFzcyBo ZWxwZXJzCkBuYW1lc3BhY2UgRW1iZXIuSGFuZGxlYmFycwoqLwpFbWJlci5I YW5kbGViYXJzLmhlbHBlcnMgPSBvYmplY3RDcmVhdGUoSGFuZGxlYmFycy5o ZWxwZXJzKTsKCi8qKgogIE92ZXJyaWRlIHRoZSB0aGUgb3Bjb2RlIGNvbXBp bGVyIGFuZCBKYXZhU2NyaXB0IGNvbXBpbGVyIGZvciBIYW5kbGViYXJzLgoK ICBAY2xhc3MgQ29tcGlsZXIKICBAbmFtZXNwYWNlIEVtYmVyLkhhbmRsZWJh cnMKICBAcHJpdmF0ZQogIEBjb25zdHJ1Y3RvcgoqLwpFbWJlci5IYW5kbGVi YXJzLkNvbXBpbGVyID0gZnVuY3Rpb24oKSB7fTsKCi8vIEhhbmRsZWJhcnMu Q29tcGlsZXIgZG9lc24ndCBleGlzdCBpbiBydW50aW1lLW9ubHkKaWYgKEhh bmRsZWJhcnMuQ29tcGlsZXIpIHsKICBFbWJlci5IYW5kbGViYXJzLkNvbXBp bGVyLnByb3RvdHlwZSA9IG9iamVjdENyZWF0ZShIYW5kbGViYXJzLkNvbXBp bGVyLnByb3RvdHlwZSk7Cn0KCkVtYmVyLkhhbmRsZWJhcnMuQ29tcGlsZXIu cHJvdG90eXBlLmNvbXBpbGVyID0gRW1iZXIuSGFuZGxlYmFycy5Db21waWxl cjsKCi8qKgogIEBjbGFzcyBKYXZhU2NyaXB0Q29tcGlsZXIKICBAbmFtZXNw YWNlIEVtYmVyLkhhbmRsZWJhcnMKICBAcHJpdmF0ZQogIEBjb25zdHJ1Y3Rv cgoqLwpFbWJlci5IYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlciA9IGZ1 bmN0aW9uKCkge307CgovLyBIYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxl ciBkb2Vzbid0IGV4aXN0IGluIHJ1bnRpbWUtb25seQppZiAoSGFuZGxlYmFy cy5KYXZhU2NyaXB0Q29tcGlsZXIpIHsKICBFbWJlci5IYW5kbGViYXJzLkph dmFTY3JpcHRDb21waWxlci5wcm90b3R5cGUgPSBvYmplY3RDcmVhdGUoSGFu ZGxlYmFycy5KYXZhU2NyaXB0Q29tcGlsZXIucHJvdG90eXBlKTsKICBFbWJl ci5IYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlci5wcm90b3R5cGUuY29t cGlsZXIgPSBFbWJlci5IYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlcjsK fQoKCkVtYmVyLkhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyLnByb3Rv dHlwZS5uYW1lc3BhY2UgPSAiRW1iZXIuSGFuZGxlYmFycyI7CgpFbWJlci5I YW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlci5wcm90b3R5cGUuaW5pdGlh bGl6ZUJ1ZmZlciA9IGZ1bmN0aW9uKCkgewogIHJldHVybiAiJyciOwp9OwoK LyoqCiAgT3ZlcnJpZGUgdGhlIGRlZmF1bHQgYnVmZmVyIGZvciBFbWJlciBI YW5kbGViYXJzLiBCeSBkZWZhdWx0LCBIYW5kbGViYXJzCiAgY3JlYXRlcyBh biBlbXB0eSBTdHJpbmcgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGludm9j YXRpb24gYW5kIGFwcGVuZHMgdG8KICBpdC4gRW1iZXIncyBIYW5kbGViYXJz IG92ZXJyaWRlcyB0aGlzIHRvIGFwcGVuZCB0byBhIHNpbmdsZSBzaGFyZWQg YnVmZmVyLgoKICBAcHJpdmF0ZQogIEBtZXRob2QgYXBwZW5kVG9CdWZmZXIK ICBAcGFyYW0gc3RyaW5nIHtTdHJpbmd9CiovCkVtYmVyLkhhbmRsZWJhcnMu SmF2YVNjcmlwdENvbXBpbGVyLnByb3RvdHlwZS5hcHBlbmRUb0J1ZmZlciA9 IGZ1bmN0aW9uKHN0cmluZykgewogIHJldHVybiAiZGF0YS5idWZmZXIucHVz aCgiK3N0cmluZysiKTsiOwp9OwoKLy8gSGFja3MgYWhlYWQ6Ci8vIEhhbmRs ZWJhcnMgcHJlc2VudGx5IGhhcyBhIGJ1ZyB3aGVyZSB0aGUgYGJsb2NrSGVs cGVyTWlzc2luZ2AgaG9vawovLyBkb2Vzbid0IGdldCBwYXNzZWQgdGhlIG5h bWUgb2YgdGhlIG1pc3NpbmcgaGVscGVyIG5hbWUsIGJ1dCByYXRoZXIKLy8g Z2V0cyBwYXNzZWQgdGhlIHZhbHVlIG9mIHRoYXQgbWlzc2luZyBoZWxwZXIg ZXZhbHVhdGVkIG9uIHRoZSBjdXJyZW50Ci8vIGNvbnRleHQsIHdoaWNoIGlz IG1vc3QgbGlrZWx5IGB1bmRlZmluZWRgIGFuZCB0b3RhbGx5IHVzZWxlc3Mu Ci8vCi8vIFNvIHdlIGFsdGVyIHRoZSBjb21waWxlZCB0ZW1wbGF0ZSBmdW5j dGlvbiB0byBwYXNzIHRoZSBuYW1lIG9mIHRoZSBoZWxwZXIKLy8gaW5zdGVh ZCwgYXMgZXhwZWN0ZWQuCi8vCi8vIFRoaXMgY2FuIGdvIGF3YXkgb25jZSB0 aGUgZm9sbG93aW5nIGlzIGNsb3NlZDoKLy8gaHR0cHM6Ly9naXRodWIuY29t L3d5Y2F0cy9oYW5kbGViYXJzLmpzL2lzc3Vlcy82MzQKCnZhciBET1RfTE9P S1VQX1JFR0VYID0gL2hlbHBlcnNcLiguKj8pXCkvLAogICAgQlJBQ0tFVF9T VFJJTkdfTE9PS1VQX1JFR0VYID0gL2hlbHBlcnNcWycoLio/KScvLAogICAg SU5WT0NBVElPTl9TUExJVFRJTkdfUkVHRVggPSAvKC4qYmxvY2tIZWxwZXJN aXNzaW5nXC5jYWxsXCguKikoc3RhY2tbMC05XSspKCwuKikvOwoKRW1iZXIu SGFuZGxlYmFycy5KYXZhU2NyaXB0Q29tcGlsZXIuc3RyaW5naWZ5TGFzdEJs b2NrSGVscGVyTWlzc2luZ0ludm9jYXRpb24gPSBmdW5jdGlvbihzb3VyY2Up IHsKICB2YXIgaGVscGVySW52b2NhdGlvbiA9IHNvdXJjZVtzb3VyY2UubGVu Z3RoIC0gMV0sCiAgICAgIGhlbHBlck5hbWUgPSAoRE9UX0xPT0tVUF9SRUdF WC5leGVjKGhlbHBlckludm9jYXRpb24pIHx8IEJSQUNLRVRfU1RSSU5HX0xP T0tVUF9SRUdFWC5leGVjKGhlbHBlckludm9jYXRpb24pKVsxXSwKICAgICAg bWF0Y2hlcyA9IElOVk9DQVRJT05fU1BMSVRUSU5HX1JFR0VYLmV4ZWMoaGVs cGVySW52b2NhdGlvbik7CgogIHNvdXJjZVtzb3VyY2UubGVuZ3RoIC0gMV0g PSBtYXRjaGVzWzFdICsgIiciICsgaGVscGVyTmFtZSArICInIiArIG1hdGNo ZXNbM107Cn0KdmFyIHN0cmluZ2lmeUJsb2NrSGVscGVyTWlzc2luZyA9IEVt YmVyLkhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyLnN0cmluZ2lmeUxh c3RCbG9ja0hlbHBlck1pc3NpbmdJbnZvY2F0aW9uOwoKdmFyIG9yaWdpbmFs QmxvY2tWYWx1ZSA9IEVtYmVyLkhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBp bGVyLnByb3RvdHlwZS5ibG9ja1ZhbHVlOwpFbWJlci5IYW5kbGViYXJzLkph dmFTY3JpcHRDb21waWxlci5wcm90b3R5cGUuYmxvY2tWYWx1ZSA9IGZ1bmN0 aW9uKCkgewogIG9yaWdpbmFsQmxvY2tWYWx1ZS5hcHBseSh0aGlzLCBhcmd1 bWVudHMpOwogIHN0cmluZ2lmeUJsb2NrSGVscGVyTWlzc2luZyh0aGlzLnNv dXJjZSk7Cn07Cgp2YXIgb3JpZ2luYWxBbWJpZ3VvdXNCbG9ja1ZhbHVlID0g RW1iZXIuSGFuZGxlYmFycy5KYXZhU2NyaXB0Q29tcGlsZXIucHJvdG90eXBl LmFtYmlndW91c0Jsb2NrVmFsdWU7CkVtYmVyLkhhbmRsZWJhcnMuSmF2YVNj cmlwdENvbXBpbGVyLnByb3RvdHlwZS5hbWJpZ3VvdXNCbG9ja1ZhbHVlID0g ZnVuY3Rpb24oKSB7CiAgb3JpZ2luYWxBbWJpZ3VvdXNCbG9ja1ZhbHVlLmFw cGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgc3RyaW5naWZ5QmxvY2tIZWxwZXJN aXNzaW5nKHRoaXMuc291cmNlKTsKfTsKCi8qKgogIFJld3JpdGUgc2ltcGxl IG11c3RhY2hlcyBmcm9tIGB7e2Zvb319YCB0byBge3tiaW5kICJmb28ifX1g LiBUaGlzIG1lYW5zIHRoYXQKICBhbGwgc2ltcGxlIG11c3RhY2hlcyBpbiBF bWJlcidzIEhhbmRsZWJhcnMgd2lsbCBhbHNvIHNldCB1cCBhbiBvYnNlcnZl ciB0bwogIGtlZXAgdGhlIERPTSB1cCB0byBkYXRlIHdoZW4gdGhlIHVuZGVy bHlpbmcgcHJvcGVydHkgY2hhbmdlcy4KCiAgQHByaXZhdGUKICBAbWV0aG9k IG11c3RhY2hlCiAgQGZvciBFbWJlci5IYW5kbGViYXJzLkNvbXBpbGVyCiAg QHBhcmFtIG11c3RhY2hlCiovCkVtYmVyLkhhbmRsZWJhcnMuQ29tcGlsZXIu cHJvdG90eXBlLm11c3RhY2hlID0gZnVuY3Rpb24obXVzdGFjaGUpIHsKICBp ZiAoIShtdXN0YWNoZS5wYXJhbXMubGVuZ3RoIHx8IG11c3RhY2hlLmhhc2gp KSB7CiAgICB2YXIgaWQgPSBuZXcgSGFuZGxlYmFycy5BU1QuSWROb2RlKFt7 IHBhcnQ6ICdfdHJpYWdlTXVzdGFjaGUnIH1dKTsKCiAgICAvLyBVcGRhdGUg dGhlIG11c3RhY2hlIG5vZGUgdG8gaW5jbHVkZSBhIGhhc2ggdmFsdWUgaW5k aWNhdGluZyB3aGV0aGVyIHRoZSBvcmlnaW5hbCBub2RlCiAgICAvLyB3YXMg ZXNjYXBlZC4gVGhpcyB3aWxsIGFsbG93IHVzIHRvIHByb3Blcmx5IGVzY2Fw ZSB2YWx1ZXMgd2hlbiB0aGUgdW5kZXJseWluZyB2YWx1ZQogICAgLy8gY2hh bmdlcyBhbmQgd2UgbmVlZCB0byByZS1yZW5kZXIgdGhlIHZhbHVlLgogICAg aWYgKCFtdXN0YWNoZS5lc2NhcGVkKSB7CiAgICAgIG11c3RhY2hlLmhhc2gg PSBtdXN0YWNoZS5oYXNoIHx8IG5ldyBIYW5kbGViYXJzLkFTVC5IYXNoTm9k ZShbXSk7CiAgICAgIG11c3RhY2hlLmhhc2gucGFpcnMucHVzaChbInVuZXNj YXBlZCIsIG5ldyBIYW5kbGViYXJzLkFTVC5TdHJpbmdOb2RlKCJ0cnVlIild KTsKICAgIH0KICAgIG11c3RhY2hlID0gbmV3IEhhbmRsZWJhcnMuQVNULk11 c3RhY2hlTm9kZShbaWRdLmNvbmNhdChbbXVzdGFjaGUuaWRdKSwgbXVzdGFj aGUuaGFzaCwgIW11c3RhY2hlLmVzY2FwZWQpOwogIH0KCiAgcmV0dXJuIEhh bmRsZWJhcnMuQ29tcGlsZXIucHJvdG90eXBlLm11c3RhY2hlLmNhbGwodGhp cywgbXVzdGFjaGUpOwp9OwoKLyoqCiAgVXNlZCBmb3IgcHJlY29tcGlsYXRp b24gb2YgRW1iZXIgSGFuZGxlYmFycyB0ZW1wbGF0ZXMuIFRoaXMgd2lsbCBu b3QgYmUgdXNlZAogIGR1cmluZyBub3JtYWwgYXBwIGV4ZWN1dGlvbi4KCiAg QG1ldGhvZCBwcmVjb21waWxlCiAgQGZvciBFbWJlci5IYW5kbGViYXJzCiAg QHN0YXRpYwogIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcgVGhlIHRlbXBsYXRl IHRvIHByZWNvbXBpbGUKKi8KRW1iZXIuSGFuZGxlYmFycy5wcmVjb21waWxl ID0gZnVuY3Rpb24oc3RyaW5nKSB7CiAgdmFyIGFzdCA9IEhhbmRsZWJhcnMu cGFyc2Uoc3RyaW5nKTsKCiAgdmFyIG9wdGlvbnMgPSB7CiAgICBrbm93bkhl bHBlcnM6IHsKICAgICAgYWN0aW9uOiB0cnVlLAogICAgICB1bmJvdW5kOiB0 cnVlLAogICAgICAnYmluZC1hdHRyJzogdHJ1ZSwKICAgICAgdGVtcGxhdGU6 IHRydWUsCiAgICAgIHZpZXc6IHRydWUsCiAgICAgIF90cmlhZ2VNdXN0YWNo ZTogdHJ1ZQogICAgfSwKICAgIGRhdGE6IHRydWUsCiAgICBzdHJpbmdQYXJh bXM6IHRydWUKICB9OwoKICB2YXIgZW52aXJvbm1lbnQgPSBuZXcgRW1iZXIu SGFuZGxlYmFycy5Db21waWxlcigpLmNvbXBpbGUoYXN0LCBvcHRpb25zKTsK ICByZXR1cm4gbmV3IEVtYmVyLkhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBp bGVyKCkuY29tcGlsZShlbnZpcm9ubWVudCwgb3B0aW9ucywgdW5kZWZpbmVk LCB0cnVlKTsKfTsKCi8vIFdlIGRvbid0IHN1cHBvcnQgdGhpcyBmb3IgSGFu ZGxlYmFycyBydW50aW1lLW9ubHkKaWYgKEhhbmRsZWJhcnMuY29tcGlsZSkg ewogIC8qKgogICAgVGhlIGVudHJ5IHBvaW50IGZvciBFbWJlciBIYW5kbGVi YXJzLiBUaGlzIHJlcGxhY2VzIHRoZSBkZWZhdWx0CiAgICBgSGFuZGxlYmFy cy5jb21waWxlYCBhbmQgdHVybnMgb24gdGVtcGxhdGUtbG9jYWwgZGF0YSBh bmQgU3RyaW5nCiAgICBwYXJhbWV0ZXJzLgoKICAgIEBtZXRob2QgY29tcGls ZQogICAgQGZvciBFbWJlci5IYW5kbGViYXJzCiAgICBAc3RhdGljCiAgICBA cGFyYW0ge1N0cmluZ30gc3RyaW5nIFRoZSB0ZW1wbGF0ZSB0byBjb21waWxl CiAgICBAcmV0dXJuIHtGdW5jdGlvbn0KICAqLwogIEVtYmVyLkhhbmRsZWJh cnMuY29tcGlsZSA9IGZ1bmN0aW9uKHN0cmluZykgewogICAgdmFyIGFzdCA9 IEhhbmRsZWJhcnMucGFyc2Uoc3RyaW5nKTsKICAgIHZhciBvcHRpb25zID0g eyBkYXRhOiB0cnVlLCBzdHJpbmdQYXJhbXM6IHRydWUgfTsKICAgIHZhciBl bnZpcm9ubWVudCA9IG5ldyBFbWJlci5IYW5kbGViYXJzLkNvbXBpbGVyKCku Y29tcGlsZShhc3QsIG9wdGlvbnMpOwogICAgdmFyIHRlbXBsYXRlU3BlYyA9 IG5ldyBFbWJlci5IYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlcigpLmNv bXBpbGUoZW52aXJvbm1lbnQsIG9wdGlvbnMsIHVuZGVmaW5lZCwgdHJ1ZSk7 CgogICAgdmFyIHRlbXBsYXRlID0gRW1iZXIuSGFuZGxlYmFycy50ZW1wbGF0 ZSh0ZW1wbGF0ZVNwZWMpOwogICAgdGVtcGxhdGUuaXNNZXRob2QgPSBmYWxz ZTsgLy9NYWtlIHN1cmUgd2UgZG9uJ3Qgd3JhcCB0ZW1wbGF0ZXMgd2l0aCAu X3N1cGVyCgogICAgcmV0dXJuIHRlbXBsYXRlOwogIH07Cn0KCgp9KSgpOwoK KGZ1bmN0aW9uKCkgewp2YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xp Y2UsCiAgICBvcmlnaW5hbFRlbXBsYXRlID0gRW1iZXIuSGFuZGxlYmFycy50 ZW1wbGF0ZTsKCi8qKgogIElmIGEgcGF0aCBzdGFydHMgd2l0aCBhIHJlc2Vy dmVkIGtleXdvcmQsIHJldHVybnMgdGhlIHJvb3QKICB0aGF0IHNob3VsZCBi ZSB1c2VkLgoKICBAcHJpdmF0ZQogIEBtZXRob2Qgbm9ybWFsaXplUGF0aAog IEBmb3IgRW1iZXIKICBAcGFyYW0gcm9vdCB7T2JqZWN0fQogIEBwYXJhbSBw YXRoIHtTdHJpbmd9CiAgQHBhcmFtIGRhdGEge0hhc2h9CiovCnZhciBub3Jt YWxpemVQYXRoID0gRW1iZXIuSGFuZGxlYmFycy5ub3JtYWxpemVQYXRoID0g ZnVuY3Rpb24ocm9vdCwgcGF0aCwgZGF0YSkgewogIHZhciBrZXl3b3JkcyA9 IChkYXRhICYmIGRhdGEua2V5d29yZHMpIHx8IHt9LAogICAgICBrZXl3b3Jk LCBpc0tleXdvcmQ7CgogIC8vIEdldCB0aGUgZmlyc3Qgc2VnbWVudCBvZiB0 aGUgcGF0aC4gRm9yIGV4YW1wbGUsIGlmIHRoZQogIC8vIHBhdGggaXMgImZv by5iYXIuYmF6IiwgcmV0dXJucyAiZm9vIi4KICBrZXl3b3JkID0gcGF0aC5z cGxpdCgnLicsIDEpWzBdOwoKICAvLyBUZXN0IHRvIHNlZSBpZiB0aGUgZmly c3QgcGF0aCBpcyBhIGtleXdvcmQgdGhhdCBoYXMgYmVlbgogIC8vIHBhc3Nl ZCBhbG9uZyBpbiB0aGUgdmlldydzIGRhdGEgaGFzaC4gSWYgc28sIHdlIHdp bGwgdHJlYXQKICAvLyB0aGF0IG9iamVjdCBhcyB0aGUgbmV3IHJvb3QuCiAg aWYgKGtleXdvcmRzLmhhc093blByb3BlcnR5KGtleXdvcmQpKSB7CiAgICAv LyBMb29rIHVwIHRoZSB2YWx1ZSBpbiB0aGUgdGVtcGxhdGUncyBkYXRhIGhh c2guCiAgICByb290ID0ga2V5d29yZHNba2V5d29yZF07CiAgICBpc0tleXdv cmQgPSB0cnVlOwoKICAgIC8vIEhhbmRsZSBjYXNlcyB3aGVyZSB0aGUgZW50 aXJlIHBhdGggaXMgdGhlIHJlc2VydmVkCiAgICAvLyB3b3JkLiBJbiB0aGF0 IGNhc2UsIHJldHVybiB0aGUgb2JqZWN0IGl0c2VsZi4KICAgIGlmIChwYXRo ID09PSBrZXl3b3JkKSB7CiAgICAgIHBhdGggPSAnJzsKICAgIH0gZWxzZSB7 CiAgICAgIC8vIFN0cmlwIHRoZSBrZXl3b3JkIGZyb20gdGhlIHBhdGggYW5k IGxvb2sgdXAKICAgICAgLy8gdGhlIHJlbWFpbmRlciBmcm9tIHRoZSBuZXds eSBmb3VuZCByb290LgogICAgICBwYXRoID0gcGF0aC5zdWJzdHIoa2V5d29y ZC5sZW5ndGgrMSk7CiAgICB9CiAgfQoKICByZXR1cm4geyByb290OiByb290 LCBwYXRoOiBwYXRoLCBpc0tleXdvcmQ6IGlzS2V5d29yZCB9Owp9OwoKCi8q KgogIExvb2t1cCBib3RoIG9uIHJvb3QgYW5kIG9uIHdpbmRvdy4gSWYgdGhl IHBhdGggc3RhcnRzIHdpdGgKICBhIGtleXdvcmQsIHRoZSBjb3JyZXNwb25k aW5nIG9iamVjdCB3aWxsIGJlIGxvb2tlZCB1cCBpbiB0aGUKICB0ZW1wbGF0 ZSdzIGRhdGEgaGFzaCBhbmQgdXNlZCB0byByZXNvbHZlIHRoZSBwYXRoLgoK ICBAbWV0aG9kIGdldAogIEBmb3IgRW1iZXIuSGFuZGxlYmFycwogIEBwYXJh bSB7T2JqZWN0fSByb290IFRoZSBvYmplY3QgdG8gbG9vayB1cCB0aGUgcHJv cGVydHkgb24KICBAcGFyYW0ge1N0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBi ZSBsb29rZWR1cAogIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSB0ZW1w bGF0ZSdzIG9wdGlvbiBoYXNoCiovCnZhciBoYW5kbGViYXJzR2V0ID0gRW1i ZXIuSGFuZGxlYmFycy5nZXQgPSBmdW5jdGlvbihyb290LCBwYXRoLCBvcHRp b25zKSB7CiAgdmFyIGRhdGEgPSBvcHRpb25zICYmIG9wdGlvbnMuZGF0YSwK ICAgICAgbm9ybWFsaXplZFBhdGggPSBub3JtYWxpemVQYXRoKHJvb3QsIHBh dGgsIGRhdGEpLAogICAgICB2YWx1ZTsKCiAgaWYgKEVtYmVyLkZFQVRVUkVT LmlzRW5hYmxlZCgiZW1iZXItaGFuZGxlYmFycy1jYXBzLWxvb2t1cCIpKSB7 CgogICAgLy8gSWYgdGhlIHBhdGggc3RhcnRzIHdpdGggYSBjYXBpdGFsIGxl dHRlciwgbG9vayBpdCB1cCBvbiBFbWJlci5sb29rdXAsCiAgICAvLyB3aGlj aCBkZWZhdWx0cyB0byB0aGUgYHdpbmRvd2Agb2JqZWN0IGluIGJyb3dzZXJz LgogICAgaWYgKEVtYmVyLmlzR2xvYmFsUGF0aChwYXRoKSkgewogICAgICB2 YWx1ZSA9IEVtYmVyLmdldChFbWJlci5sb29rdXAsIHBhdGgpOwogICAgfSBl bHNlIHsKCiAgICAgIC8vIEluIGNhc2VzIHdoZXJlIHRoZSBwYXRoIGJlZ2lu cyB3aXRoIGEga2V5d29yZCwgY2hhbmdlIHRoZQogICAgICAvLyByb290IHRv IHRoZSB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGF0IGtleXdvcmQsIGFuZCBl bnN1cmUKICAgICAgLy8gdGhlIHBhdGggaXMgcmVsYXRpdmUgdG8gaXQuCiAg ICAgIHZhbHVlID0gRW1iZXIuZ2V0KG5vcm1hbGl6ZWRQYXRoLnJvb3QsIG5v cm1hbGl6ZWRQYXRoLnBhdGgpOwogICAgfQoKICB9IGVsc2UgewogICAgcm9v dCA9IG5vcm1hbGl6ZWRQYXRoLnJvb3Q7CiAgICBwYXRoID0gbm9ybWFsaXpl ZFBhdGgucGF0aDsKCiAgICB2YWx1ZSA9IEVtYmVyLmdldChyb290LCBwYXRo KTsKCiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiByb290ICE9PSBF bWJlci5sb29rdXAgJiYgRW1iZXIuaXNHbG9iYWxQYXRoKHBhdGgpKSB7CiAg ICAgIHZhbHVlID0gRW1iZXIuZ2V0KEVtYmVyLmxvb2t1cCwgcGF0aCk7CiAg ICB9CiAgfQoKICByZXR1cm4gdmFsdWU7Cn07CgovKioKICBUaGlzIG1ldGhv ZCB1c2VzIGBFbWJlci5IYW5kbGViYXJzLmdldGAgdG8gbG9va3VwIGEgdmFs dWUsIHRoZW4gZW5zdXJlcwogIHRoYXQgdGhlIHZhbHVlIGlzIGVzY2FwZWQg cHJvcGVybHkuCgogIElmIGB1bmVzY2FwZWRgIGlzIGEgdHJ1dGh5IHZhbHVl IHRoZW4gdGhlIGVzY2FwaW5nIHdpbGwgbm90IGJlIHBlcmZvcm1lZC4KCiAg QG1ldGhvZCBnZXRFc2NhcGVkCiAgQGZvciBFbWJlci5IYW5kbGViYXJzCiAg QHBhcmFtIHtPYmplY3R9IHJvb3QgVGhlIG9iamVjdCB0byBsb29rIHVwIHRo ZSBwcm9wZXJ0eSBvbgogIEBwYXJhbSB7U3RyaW5nfSBwYXRoIFRoZSBwYXRo IHRvIGJlIGxvb2tlZHVwCiAgQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgVGhl IHRlbXBsYXRlJ3Mgb3B0aW9uIGhhc2gKKi8KRW1iZXIuSGFuZGxlYmFycy5n ZXRFc2NhcGVkID0gZnVuY3Rpb24ocm9vdCwgcGF0aCwgb3B0aW9ucykgewog IHZhciByZXN1bHQgPSBoYW5kbGViYXJzR2V0KHJvb3QsIHBhdGgsIG9wdGlv bnMpOwoKICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHJlc3VsdCA9PT0gdW5k ZWZpbmVkKSB7CiAgICByZXN1bHQgPSAiIjsKICB9IGVsc2UgaWYgKCEocmVz dWx0IGluc3RhbmNlb2YgSGFuZGxlYmFycy5TYWZlU3RyaW5nKSkgewogICAg cmVzdWx0ID0gU3RyaW5nKHJlc3VsdCk7CiAgfQogIGlmICghb3B0aW9ucy5o YXNoLnVuZXNjYXBlZCl7CiAgICByZXN1bHQgPSBIYW5kbGViYXJzLlV0aWxz LmVzY2FwZUV4cHJlc3Npb24ocmVzdWx0KTsKICB9CgogIHJldHVybiByZXN1 bHQ7Cn07CgpFbWJlci5IYW5kbGViYXJzLnJlc29sdmVQYXJhbXMgPSBmdW5j dGlvbihjb250ZXh0LCBwYXJhbXMsIG9wdGlvbnMpIHsKICB2YXIgcmVzb2x2 ZWRQYXJhbXMgPSBbXSwgdHlwZXMgPSBvcHRpb25zLnR5cGVzLCBwYXJhbSwg dHlwZTsKCiAgZm9yICh2YXIgaT0wLCBsPXBhcmFtcy5sZW5ndGg7IGk8bDsg aSsrKSB7CiAgICBwYXJhbSA9IHBhcmFtc1tpXTsKICAgIHR5cGUgPSB0eXBl c1tpXTsKCiAgICBpZiAodHlwZSA9PT0gJ0lEJykgewogICAgICByZXNvbHZl ZFBhcmFtcy5wdXNoKGhhbmRsZWJhcnNHZXQoY29udGV4dCwgcGFyYW0sIG9w dGlvbnMpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlc29sdmVkUGFyYW1zLnB1 c2gocGFyYW0pOwogICAgfQogIH0KCiAgcmV0dXJuIHJlc29sdmVkUGFyYW1z Owp9OwoKRW1iZXIuSGFuZGxlYmFycy5yZXNvbHZlSGFzaCA9IGZ1bmN0aW9u KGNvbnRleHQsIGhhc2gsIG9wdGlvbnMpIHsKICB2YXIgcmVzb2x2ZWRIYXNo ID0ge30sIHR5cGVzID0gb3B0aW9ucy5oYXNoVHlwZXMsIHR5cGU7CgogIGZv ciAodmFyIGtleSBpbiBoYXNoKSB7CiAgICBpZiAoIWhhc2guaGFzT3duUHJv cGVydHkoa2V5KSkgeyBjb250aW51ZTsgfQoKICAgIHR5cGUgPSB0eXBlc1tr ZXldOwoKICAgIGlmICh0eXBlID09PSAnSUQnKSB7CiAgICAgIHJlc29sdmVk SGFzaFtrZXldID0gaGFuZGxlYmFyc0dldChjb250ZXh0LCBoYXNoW2tleV0s IG9wdGlvbnMpOwogICAgfSBlbHNlIHsKICAgICAgcmVzb2x2ZWRIYXNoW2tl eV0gPSBoYXNoW2tleV07CiAgICB9CiAgfQoKICByZXR1cm4gcmVzb2x2ZWRI YXNoOwp9OwoKLyoqCiAgUmVnaXN0ZXJzIGEgaGVscGVyIGluIEhhbmRsZWJh cnMgdGhhdCB3aWxsIGJlIGNhbGxlZCBpZiBubyBwcm9wZXJ0eSB3aXRoIHRo ZQogIGdpdmVuIG5hbWUgY2FuIGJlIGZvdW5kIG9uIHRoZSBjdXJyZW50IGNv bnRleHQgb2JqZWN0LCBhbmQgbm8gaGVscGVyIHdpdGgKICB0aGF0IG5hbWUg aXMgcmVnaXN0ZXJlZC4KCiAgVGhpcyB0aHJvd3MgYW4gZXhjZXB0aW9uIHdp dGggYSBtb3JlIGhlbHBmdWwgZXJyb3IgbWVzc2FnZSBzbyB0aGUgdXNlciBj YW4KICB0cmFjayBkb3duIHdoZXJlIHRoZSBwcm9ibGVtIGlzIGhhcHBlbmlu Zy4KCiAgQHByaXZhdGUKICBAbWV0aG9kIGhlbHBlck1pc3NpbmcKICBAZm9y IEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycwogIEBwYXJhbSB7U3RyaW5nfSBw YXRoCiAgQHBhcmFtIHtIYXNofSBvcHRpb25zCiovCkVtYmVyLkhhbmRsZWJh cnMucmVnaXN0ZXJIZWxwZXIoJ2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbihw YXRoKSB7CiAgdmFyIGVycm9yLCB2aWV3ID0gIiI7CgogIHZhciBvcHRpb25z ID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTsKCiAgdmFyIGhl bHBlciA9IEVtYmVyLkhhbmRsZWJhcnMucmVzb2x2ZUhlbHBlcihvcHRpb25z LmRhdGEudmlldy5jb250YWluZXIsIHBhdGgpOwoKICBpZiAoaGVscGVyKSB7 CiAgICByZXR1cm4gaGVscGVyLmFwcGx5KHRoaXMsIHNsaWNlLmNhbGwoYXJn dW1lbnRzLCAxKSk7CiAgfQoKICBlcnJvciA9ICIlQCBIYW5kbGViYXJzIGVy cm9yOiBDb3VsZCBub3QgZmluZCBwcm9wZXJ0eSAnJUAnIG9uIG9iamVjdCAl QC4iOwogIGlmIChvcHRpb25zLmRhdGEpIHsKICAgIHZpZXcgPSBvcHRpb25z LmRhdGEudmlldzsKICB9CiAgdGhyb3cgbmV3IEVtYmVyLkVycm9yKEVtYmVy LlN0cmluZy5mbXQoZXJyb3IsIFt2aWV3LCBwYXRoLCB0aGlzXSkpOwp9KTsK Ci8qKgogIFJlZ2lzdGVycyBhIGhlbHBlciBpbiBIYW5kbGViYXJzIHRoYXQg d2lsbCBiZSBjYWxsZWQgaWYgbm8gcHJvcGVydHkgd2l0aCB0aGUKICBnaXZl biBuYW1lIGNhbiBiZSBmb3VuZCBvbiB0aGUgY3VycmVudCBjb250ZXh0IG9i amVjdCwgYW5kIG5vIGhlbHBlciB3aXRoCiAgdGhhdCBuYW1lIGlzIHJlZ2lz dGVyZWQuCgogIFRoaXMgdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aXRoIGEgbW9y ZSBoZWxwZnVsIGVycm9yIG1lc3NhZ2Ugc28gdGhlIHVzZXIgY2FuCiAgdHJh Y2sgZG93biB3aGVyZSB0aGUgcHJvYmxlbSBpcyBoYXBwZW5pbmcuCgogIEBw cml2YXRlCiAgQG1ldGhvZCBoZWxwZXJNaXNzaW5nCiAgQGZvciBFbWJlci5I YW5kbGViYXJzLmhlbHBlcnMKICBAcGFyYW0ge1N0cmluZ30gcGF0aAogIEBw YXJhbSB7SGFzaH0gb3B0aW9ucwoqLwpFbWJlci5IYW5kbGViYXJzLnJlZ2lz dGVySGVscGVyKCdibG9ja0hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbihwYXRo KSB7CgogIHZhciBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5n dGggLSAxXTsKCiAgRW1iZXIuYXNzZXJ0KCJgYmxvY2tIZWxwZXJNaXNzaW5n YCB3YXMgaW52b2tlZCB3aXRob3V0IGEgaGVscGVyIG5hbWUsIHdoaWNoICIg KwogICAgICAgICAgICAgICAiaXMgbW9zdCBsaWtlbHkgZHVlIHRvIGEgbWlz bWF0Y2ggYmV0d2VlbiB0aGUgdmVyc2lvbiBvZiAiICsKICAgICAgICAgICAg ICAgIkVtYmVyLmpzIHlvdSdyZSBydW5uaW5nIG5vdyBhbmQgdGhlIG9uZSB1 c2VkIHRvIHByZWNvbXBpbGUgeW91ciAiICsKICAgICAgICAgICAgICAgInRl bXBsYXRlcy4gUGxlYXNlIG1ha2Ugc3VyZSB0aGUgdmVyc2lvbiBvZiAiICsK ICAgICAgICAgICAgICAgImBlbWJlci1oYW5kbGViYXJzLWNvbXBpbGVyYCB5 b3UncmUgdXNpbmcgaXMgdXAgdG8gZGF0ZS4iLCBwYXRoKTsKCiAgdmFyIGhl bHBlciA9IEVtYmVyLkhhbmRsZWJhcnMucmVzb2x2ZUhlbHBlcihvcHRpb25z LmRhdGEudmlldy5jb250YWluZXIsIHBhdGgpOwoKICBpZiAoaGVscGVyKSB7 CiAgICByZXR1cm4gaGVscGVyLmFwcGx5KHRoaXMsIHNsaWNlLmNhbGwoYXJn dW1lbnRzLCAxKSk7CiAgfSBlbHNlIHsKICAgIHJldHVybiBIYW5kbGViYXJz LmhlbHBlcnMuaGVscGVyTWlzc2luZy5jYWxsKHRoaXMsIHBhdGgpOwogIH0K CiAgcmV0dXJuIEhhbmRsZWJhcnMuaGVscGVycy5ibG9ja0hlbHBlck1pc3Np bmcuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKfSk7CgovKioKICBSZWdpc3Rl ciBhIGJvdW5kIGhhbmRsZWJhcnMgaGVscGVyLiBCb3VuZCBoZWxwZXJzIGJl aGF2ZSBzaW1pbGFybHkgdG8gcmVndWxhcgogIGhhbmRsZWJhcnMgaGVscGVy cywgd2l0aCB0aGUgYWRkZWQgYWJpbGl0eSB0byByZS1yZW5kZXIgd2hlbiB0 aGUgdW5kZXJseWluZyBkYXRhCiAgY2hhbmdlcy4KCiAgIyMgU2ltcGxlIGV4 YW1wbGUKCiAgYGBgamF2YXNjcmlwdAogIEVtYmVyLkhhbmRsZWJhcnMucmVn aXN0ZXJCb3VuZEhlbHBlcignY2FwaXRhbGl6ZScsIGZ1bmN0aW9uKHZhbHVl KSB7CiAgICByZXR1cm4gdmFsdWUudG9VcHBlckNhc2UoKTsKICB9KTsKICBg YGAKCiAgVGhlIGFib3ZlIGJvdW5kIGhlbHBlciBjYW4gYmUgdXNlZCBpbnNp ZGUgb2YgdGVtcGxhdGVzIGFzIGZvbGxvd3M6CgogIGBgYGhhbmRsZWJhcnMK ICB7e2NhcGl0YWxpemUgbmFtZX19CiAgYGBgCgogIEluIHRoaXMgY2FzZSwg d2hlbiB0aGUgYG5hbWVgIHByb3BlcnR5IG9mIHRoZSB0ZW1wbGF0ZSdzIGNv bnRleHQgY2hhbmdlcywKICB0aGUgcmVuZGVyZWQgdmFsdWUgb2YgdGhlIGhl bHBlciB3aWxsIHVwZGF0ZSB0byByZWZsZWN0IHRoaXMgY2hhbmdlLgoKICAj IyBFeGFtcGxlIHdpdGggb3B0aW9ucwoKICBMaWtlIG5vcm1hbCBoYW5kbGVi YXJzIGhlbHBlcnMsIGJvdW5kIGhlbHBlcnMgaGF2ZSBhY2Nlc3MgdG8gdGhl IG9wdGlvbnMKICBwYXNzZWQgaW50byB0aGUgaGVscGVyIGNhbGwuCgogIGBg YGphdmFzY3JpcHQKICBFbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVyQm91bmRI ZWxwZXIoJ3JlcGVhdCcsIGZ1bmN0aW9uKHZhbHVlLCBvcHRpb25zKSB7CiAg ICB2YXIgY291bnQgPSBvcHRpb25zLmhhc2guY291bnQ7CiAgICB2YXIgYSA9 IFtdOwogICAgd2hpbGUoYS5sZW5ndGggPCBjb3VudCkgewogICAgICAgIGEu cHVzaCh2YWx1ZSk7CiAgICB9CiAgICByZXR1cm4gYS5qb2luKCcnKTsKICB9 KTsKICBgYGAKCiAgVGhpcyBoZWxwZXIgY291bGQgYmUgdXNlZCBpbiBhIHRl bXBsYXRlIGFzIGZvbGxvd3M6CgogIGBgYGhhbmRsZWJhcnMKICB7e3JlcGVh dCB0ZXh0IGNvdW50PTN9fQogIGBgYAoKICAjIyBFeGFtcGxlIHdpdGggYm91 bmQgb3B0aW9ucwoKICBCb3VuZCBoYXNoIG9wdGlvbnMgYXJlIGFsc28gc3Vw cG9ydGVkLiBFeGFtcGxlOgoKICBgYGBoYW5kbGViYXJzCiAge3tyZXBlYXQg dGV4dCBjb3VudEJpbmRpbmc9Im51bVJlcGVhdHMifX0KICBgYGAKCiAgSW4g dGhpcyBleGFtcGxlLCBjb3VudCB3aWxsIGJlIGJvdW5kIHRvIHRoZSB2YWx1 ZSBvZgogIHRoZSBgbnVtUmVwZWF0c2AgcHJvcGVydHkgb24gdGhlIGNvbnRl eHQuIElmIHRoYXQgcHJvcGVydHkKICBjaGFuZ2VzLCB0aGUgaGVscGVyIHdp bGwgYmUgcmUtcmVuZGVyZWQuCgogICMjIEV4YW1wbGUgd2l0aCBleHRyYSBk ZXBlbmRlbmNpZXMKCiAgVGhlIGBFbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVy Qm91bmRIZWxwZXJgIG1ldGhvZCB0YWtlcyBhIHZhcmlhYmxlIGxlbmd0aAog IHRoaXJkIHBhcmFtZXRlciB3aGljaCBpbmRpY2F0ZXMgZXh0cmEgZGVwZW5k ZW5jaWVzIG9uIHRoZSBwYXNzZWQgaW4gdmFsdWUuCiAgVGhpcyBhbGxvd3Mg dGhlIGhhbmRsZWJhcnMgaGVscGVyIHRvIHVwZGF0ZSB3aGVuIHRoZXNlIGRl cGVuZGVuY2llcyBjaGFuZ2UuCgogIGBgYGphdmFzY3JpcHQKICBFbWJlci5I YW5kbGViYXJzLnJlZ2lzdGVyQm91bmRIZWxwZXIoJ2NhcGl0YWxpemVOYW1l JywgZnVuY3Rpb24odmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZS5nZXQoJ25h bWUnKS50b1VwcGVyQ2FzZSgpOwogIH0sICduYW1lJyk7CiAgYGBgCgogICMj IEV4YW1wbGUgd2l0aCBtdWx0aXBsZSBib3VuZCBwcm9wZXJ0aWVzCgogIGBF bWJlci5IYW5kbGViYXJzLnJlZ2lzdGVyQm91bmRIZWxwZXJgIHN1cHBvcnRz IGJpbmRpbmcgdG8KICBtdWx0aXBsZSBwcm9wZXJ0aWVzLCBlLmcuOgoKICBg YGBqYXZhc2NyaXB0CiAgRW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckJvdW5k SGVscGVyKCdjb25jYXRlbmF0ZScsIGZ1bmN0aW9uKCkgewogICAgdmFyIHZh bHVlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywg MCwgLTEpOwogICAgcmV0dXJuIHZhbHVlcy5qb2luKCd8fCcpOwogIH0pOwog IGBgYAoKICBXaGljaCBhbGxvd3MgZm9yIHRlbXBsYXRlIHN5bnRheCBzdWNo IGFzIGB7e2NvbmNhdGVuYXRlIHByb3AxIHByb3AyfX1gIG9yCiAgYHt7Y29u Y2F0ZW5hdGUgcHJvcDEgcHJvcDIgcHJvcDN9fWAuIElmIGFueSBvZiB0aGUg cHJvcGVydGllcyBjaGFuZ2UsCiAgdGhlIGhlbHByIHdpbGwgcmUtcmVuZGVy LiAgTm90ZSB0aGF0IGRlcGVuZGVuY3kga2V5cyBjYW5ub3QgYmUKICB1c2lu ZyBpbiBjb25qdW5jdGlvbiB3aXRoIG11bHRpLXByb3BlcnR5IGhlbHBlcnMs IHNpbmNlIGl0IGlzIGFtYmlndW91cwogIHdoaWNoIHByb3BlcnR5IHRoZSBk ZXBlbmRlbnQga2V5cyB3b3VsZCBiZWxvbmcgdG8uCgogICMjIFVzZSB3aXRo IHVuYm91bmQgaGVscGVyCgogIFRoZSBge3t1bmJvdW5kfX1gIGhlbHBlciBj YW4gYmUgdXNlZCB3aXRoIGJvdW5kIGhlbHBlciBpbnZvY2F0aW9ucwogIHRv IHJlbmRlciB0aGVtIGluIHRoZWlyIHVuYm91bmQgZm9ybSwgZS5nLgoKICBg YGBoYW5kbGViYXJzCiAge3t1bmJvdW5kIGNhcGl0YWxpemUgbmFtZX19CiAg YGBgCgogIEluIHRoaXMgZXhhbXBsZSwgaWYgdGhlIG5hbWUgcHJvcGVydHkg Y2hhbmdlcywgdGhlIGhlbHBlcgogIHdpbGwgbm90IHJlLXJlbmRlci4KCiAg IyMgVXNlIHdpdGggYmxvY2tzIG5vdCBzdXBwb3J0ZWQKCiAgQm91bmQgaGVs cGVycyBkbyBub3Qgc3VwcG9ydCB1c2Ugd2l0aCBIYW5kbGViYXJzIGJsb2Nr cyBvcgogIHRoZSBhZGRpdGlvbiBvZiBjaGlsZCB2aWV3cyBvZiBhbnkga2lu ZC4KCiAgQG1ldGhvZCByZWdpc3RlckJvdW5kSGVscGVyCiAgQGZvciBFbWJl ci5IYW5kbGViYXJzCiAgQHBhcmFtIHtTdHJpbmd9IG5hbWUKICBAcGFyYW0g e0Z1bmN0aW9ufSBmdW5jdGlvbgogIEBwYXJhbSB7U3RyaW5nfSBkZXBlbmRl bnRLZXlzKgoqLwpFbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVyQm91bmRIZWxw ZXIgPSBmdW5jdGlvbihuYW1lLCBmbikgewogIHZhciBib3VuZEhlbHBlckFy Z3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSksCiAgICAgIGJvdW5kRm4g PSBFbWJlci5IYW5kbGViYXJzLm1ha2VCb3VuZEhlbHBlci5hcHBseSh0aGlz LCBib3VuZEhlbHBlckFyZ3MpOwogIEVtYmVyLkhhbmRsZWJhcnMucmVnaXN0 ZXJIZWxwZXIobmFtZSwgYm91bmRGbik7Cn07CgovKioKICBBIChtb3N0bHkp IHByaXZhdGUgaGVscGVyIGZ1bmN0aW9uIHRvIGByZWdpc3RlckJvdW5kSGVs cGVyYC4gVGFrZXMgdGhlCiAgcHJvdmlkZWQgSGFuZGxlYmFycyBoZWxwZXIg ZnVuY3Rpb24gZm4gYW5kIHJldHVybnMgaXQgaW4gd3JhcHBlZAogIGJvdW5k IGhlbHBlciBmb3JtLgoKICBUaGUgbWFpbiB1c2UgY2FzZSBmb3IgdXNpbmcg dGhpcyBvdXRzaWRlIG9mIGByZWdpc3RlckJvdW5kSGVscGVyYAogIGlzIGZv ciByZWdpc3RlcmluZyBoZWxwZXJzIG9uIHRoZSBjb250YWluZXI6CgogIGBg YGpzCiAgdmFyIGJvdW5kSGVscGVyRm4gPSBFbWJlci5IYW5kbGViYXJzLm1h a2VCb3VuZEhlbHBlcihmdW5jdGlvbih3b3JkKSB7CiAgICByZXR1cm4gd29y ZC50b1VwcGVyQ2FzZSgpOwogIH0pOwoKICBjb250YWluZXIucmVnaXN0ZXIo J2hlbHBlcjpteS1ib3VuZC1oZWxwZXInLCBib3VuZEhlbHBlckZuKTsKICBg YGAKCiAgSW4gdGhlIGFib3ZlIGV4YW1wbGUsIGlmIHRoZSBoZWxwZXIgZnVu Y3Rpb24gaGFkbid0IGJlZW4gd3JhcHBlZCBpbgogIGBtYWtlQm91bmRIZWxw ZXJgLCB0aGUgcmVnaXN0ZXJlZCBoZWxwZXIgd291bGQgYmUgdW5ib3VuZC4K CiAgQHByaXZhdGUKICBAbWV0aG9kIG1ha2VCb3VuZEhlbHBlcgogIEBmb3Ig RW1iZXIuSGFuZGxlYmFycwogIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmN0aW9u CiAgQHBhcmFtIHtTdHJpbmd9IGRlcGVuZGVudEtleXMqCiovCkVtYmVyLkhh bmRsZWJhcnMubWFrZUJvdW5kSGVscGVyID0gZnVuY3Rpb24oZm4pIHsKICB2 YXIgZGVwZW5kZW50S2V5cyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsK CiAgZnVuY3Rpb24gaGVscGVyKCkgewogICAgdmFyIHByb3BlcnRpZXMgPSBz bGljZS5jYWxsKGFyZ3VtZW50cywgMCwgLTEpLAogICAgICBudW1Qcm9wZXJ0 aWVzID0gcHJvcGVydGllcy5sZW5ndGgsCiAgICAgIG9wdGlvbnMgPSBhcmd1 bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdLAogICAgICBub3JtYWxpemVk UHJvcGVydGllcyA9IFtdLAogICAgICBkYXRhID0gb3B0aW9ucy5kYXRhLAog ICAgICB0eXBlcyA9IGRhdGEuaXNVbmJvdW5kID8gc2xpY2UuY2FsbChvcHRp b25zLnR5cGVzLCAxKSA6IG9wdGlvbnMudHlwZXMsCiAgICAgIGhhc2ggPSBv cHRpb25zLmhhc2gsCiAgICAgIHZpZXcgPSBkYXRhLnZpZXcsCiAgICAgIGNv bnRleHRzID0gb3B0aW9ucy5jb250ZXh0cywKICAgICAgY3VycmVudENvbnRl eHQgPSAoY29udGV4dHMgJiYgY29udGV4dHMubGVuZ3RoKSA/IGNvbnRleHRz WzBdIDogdGhpcywKICAgICAgcHJlZml4UGF0aEZvckRlcGVuZGVudEtleXMg PSAnJywKICAgICAgbG9jLCBsZW4sIGhhc2hPcHRpb24sCiAgICAgIGJvdW5k T3B0aW9uLCBwcm9wZXJ0eSwKICAgICAgbm9ybWFsaXplZFZhbHVlID0gRW1i ZXIuX1NpbXBsZUhhbmRsZWJhcnNWaWV3LnByb3RvdHlwZS5ub3JtYWxpemVk VmFsdWU7CgogICAgRW1iZXIuYXNzZXJ0KCJyZWdpc3RlckJvdW5kSGVscGVy LWdlbmVyYXRlZCBoZWxwZXJzIGRvIG5vdCBzdXBwb3J0IHVzZSB3aXRoIEhh bmRsZWJhcnMgYmxvY2tzLiIsICFvcHRpb25zLmZuKTsKCiAgICAvLyBEZXRl Y3QgYm91bmQgb3B0aW9ucyAoZS5nLiBjb3VudEJpbmRpbmc9Im90aGVyQ291 bnQiKQogICAgdmFyIGJvdW5kT3B0aW9ucyA9IGhhc2guYm91bmRPcHRpb25z ID0ge307CiAgICBmb3IgKGhhc2hPcHRpb24gaW4gaGFzaCkgewogICAgICBp ZiAoRW1iZXIuSVNfQklORElORy50ZXN0KGhhc2hPcHRpb24pKSB7CiAgICAg ICAgLy8gTG9wIG9mZiAnQmluZGluZycgc3VmZml4LgogICAgICAgIGJvdW5k T3B0aW9uc1toYXNoT3B0aW9uLnNsaWNlKDAsIC03KV0gPSBoYXNoW2hhc2hP cHRpb25dOwogICAgICB9CiAgICB9CgogICAgLy8gRXhwb3NlIHByb3BlcnR5 IG5hbWVzIG9uIGRhdGEucHJvcGVydGllcyBvYmplY3QuCiAgICB2YXIgd2F0 Y2hlZFByb3BlcnRpZXMgPSBbXTsKICAgIGRhdGEucHJvcGVydGllcyA9IFtd OwogICAgZm9yIChsb2MgPSAwOyBsb2MgPCBudW1Qcm9wZXJ0aWVzOyArK2xv YykgewogICAgICBkYXRhLnByb3BlcnRpZXMucHVzaChwcm9wZXJ0aWVzW2xv Y10pOwogICAgICBpZiAodHlwZXNbbG9jXSA9PT0gJ0lEJykgewogICAgICAg IHZhciBub3JtYWxpemVkUHJvcCA9IG5vcm1hbGl6ZVBhdGgoY3VycmVudENv bnRleHQsIHByb3BlcnRpZXNbbG9jXSwgZGF0YSk7CiAgICAgICAgbm9ybWFs aXplZFByb3BlcnRpZXMucHVzaChub3JtYWxpemVkUHJvcCk7CiAgICAgICAg d2F0Y2hlZFByb3BlcnRpZXMucHVzaChub3JtYWxpemVkUHJvcCk7CiAgICAg IH0gZWxzZSB7CiAgICAgICAgaWYoZGF0YS5pc1VuYm91bmQpIHsKICAgICAg ICAgIG5vcm1hbGl6ZWRQcm9wZXJ0aWVzLnB1c2goe3BhdGg6IHByb3BlcnRp ZXNbbG9jXX0pOwogICAgICAgIH1lbHNlIHsKICAgICAgICAgIG5vcm1hbGl6 ZWRQcm9wZXJ0aWVzLnB1c2gobnVsbCk7CiAgICAgICAgfQogICAgICB9CiAg ICB9CgogICAgLy8gSGFuZGxlIGNhc2Ugd2hlbiBoZWxwZXIgaW52b2NhdGlv biBpcyBwcmVjZWRlZCBieSBgdW5ib3VuZGAsIGUuZy4KICAgIC8vIHt7dW5i b3VuZCBteUhlbHBlciBmb299fQogICAgaWYgKGRhdGEuaXNVbmJvdW5kKSB7 CiAgICAgIHJldHVybiBldmFsdWF0ZVVuYm91bmRIZWxwZXIodGhpcywgZm4s IG5vcm1hbGl6ZWRQcm9wZXJ0aWVzLCBvcHRpb25zKTsKICAgIH0KCiAgICB2 YXIgYmluZFZpZXcgPSBuZXcgRW1iZXIuX1NpbXBsZUhhbmRsZWJhcnNWaWV3 KG51bGwsIG51bGwsICFvcHRpb25zLmhhc2gudW5lc2NhcGVkLCBvcHRpb25z LmRhdGEpOwoKICAgIC8vIE92ZXJyaWRlIFNpbXBsZUhhbmRsZWJhcnNWaWV3 J3MgbWV0aG9kIGZvciBnZW5lcmF0aW5nIHRoZSB2aWV3J3MgY29udGVudC4K ICAgIGJpbmRWaWV3Lm5vcm1hbGl6ZWRWYWx1ZSA9IGZ1bmN0aW9uKCkgewog ICAgICB2YXIgYXJncyA9IFtdLCBib3VuZE9wdGlvbjsKCiAgICAgIC8vIENv cHkgb3ZlciBib3VuZCBoYXNoIG9wdGlvbnMuCiAgICAgIGZvciAoYm91bmRP cHRpb24gaW4gYm91bmRPcHRpb25zKSB7CiAgICAgICAgaWYgKCFib3VuZE9w dGlvbnMuaGFzT3duUHJvcGVydHkoYm91bmRPcHRpb24pKSB7IGNvbnRpbnVl OyB9CiAgICAgICAgcHJvcGVydHkgPSBub3JtYWxpemVQYXRoKGN1cnJlbnRD b250ZXh0LCBib3VuZE9wdGlvbnNbYm91bmRPcHRpb25dLCBkYXRhKTsKICAg ICAgICBiaW5kVmlldy5wYXRoID0gcHJvcGVydHkucGF0aDsKICAgICAgICBi aW5kVmlldy5wYXRoUm9vdCA9IHByb3BlcnR5LnJvb3Q7CiAgICAgICAgaGFz aFtib3VuZE9wdGlvbl0gPSBub3JtYWxpemVkVmFsdWUuY2FsbChiaW5kVmll dyk7CiAgICAgIH0KCiAgICAgIGZvciAobG9jID0gMDsgbG9jIDwgbnVtUHJv cGVydGllczsgKytsb2MpIHsKICAgICAgICBwcm9wZXJ0eSA9IG5vcm1hbGl6 ZWRQcm9wZXJ0aWVzW2xvY107CiAgICAgICAgaWYgKHByb3BlcnR5KSB7CiAg ICAgICAgICBiaW5kVmlldy5wYXRoID0gcHJvcGVydHkucGF0aDsKICAgICAg ICAgIGJpbmRWaWV3LnBhdGhSb290ID0gcHJvcGVydHkucm9vdDsKICAgICAg ICAgIGFyZ3MucHVzaChub3JtYWxpemVkVmFsdWUuY2FsbChiaW5kVmlldykp OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhcmdzLnB1c2gocHJvcGVy dGllc1tsb2NdKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgYXJncy5wdXNo KG9wdGlvbnMpOwoKICAgICAgLy8gUnVuIHRoZSBzdXBwbGllZCBoZWxwZXIg ZnVuY3Rpb24uCiAgICAgIHJldHVybiBmbi5hcHBseShjdXJyZW50Q29udGV4 dCwgYXJncyk7CiAgICB9OwoKICAgIHZpZXcuYXBwZW5kQ2hpbGQoYmluZFZp ZXcpOwoKICAgIC8vIEFzc2VtYmxlIGxpc3Qgb2Ygd2F0Y2hlZCBwcm9wZXJ0 aWVzIHRoYXQnbGwgcmUtcmVuZGVyIHRoaXMgaGVscGVyLgogICAgZm9yIChi b3VuZE9wdGlvbiBpbiBib3VuZE9wdGlvbnMpIHsKICAgICAgaWYgKGJvdW5k T3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShib3VuZE9wdGlvbikpIHsKICAgICAg ICB3YXRjaGVkUHJvcGVydGllcy5wdXNoKG5vcm1hbGl6ZVBhdGgoY3VycmVu dENvbnRleHQsIGJvdW5kT3B0aW9uc1tib3VuZE9wdGlvbl0sIGRhdGEpKTsK ICAgICAgfQogICAgfQoKICAgIC8vIE9ic2VydmUgZWFjaCBwcm9wZXJ0eS4K ICAgIGZvciAobG9jID0gMCwgbGVuID0gd2F0Y2hlZFByb3BlcnRpZXMubGVu Z3RoOyBsb2MgPCBsZW47ICsrbG9jKSB7CiAgICAgIHByb3BlcnR5ID0gd2F0 Y2hlZFByb3BlcnRpZXNbbG9jXTsKICAgICAgdmlldy5yZWdpc3Rlck9ic2Vy dmVyKHByb3BlcnR5LnJvb3QsIHByb3BlcnR5LnBhdGgsIGJpbmRWaWV3LCBi aW5kVmlldy5yZXJlbmRlcik7CiAgICB9CgogICAgaWYgKHR5cGVzWzBdICE9 PSAnSUQnIHx8IG5vcm1hbGl6ZWRQcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMCkg ewogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gQWRkIGRlcGVuZGVudCBr ZXkgb2JzZXJ2ZXJzIHRvIHRoZSBmaXJzdCBwYXJhbQogICAgdmFyIG5vcm1h bGl6ZWQgPSBub3JtYWxpemVkUHJvcGVydGllc1swXSwKICAgICAgICBwYXRo Um9vdCA9IG5vcm1hbGl6ZWQucm9vdCwKICAgICAgICBwYXRoID0gbm9ybWFs aXplZC5wYXRoOwoKICAgIGlmKCFFbWJlci5pc0VtcHR5KHBhdGgpKSB7CiAg ICAgIHByZWZpeFBhdGhGb3JEZXBlbmRlbnRLZXlzID0gcGF0aCArICcuJzsK ICAgIH0KICAgIGZvciAodmFyIGk9MCwgbD1kZXBlbmRlbnRLZXlzLmxlbmd0 aDsgaTxsOyBpKyspIHsKICAgICAgdmlldy5yZWdpc3Rlck9ic2VydmVyKHBh dGhSb290LCBwcmVmaXhQYXRoRm9yRGVwZW5kZW50S2V5cyArIGRlcGVuZGVu dEtleXNbaV0sIGJpbmRWaWV3LCBiaW5kVmlldy5yZXJlbmRlcik7CiAgICB9 CiAgfQoKICBoZWxwZXIuX3Jhd0Z1bmN0aW9uID0gZm47CiAgcmV0dXJuIGhl bHBlcjsKfTsKCi8qKgogIFJlbmRlcnMgdGhlIHVuYm91bmQgZm9ybSBvZiBh biBvdGhlcndpc2UgYm91bmQgaGVscGVyIGZ1bmN0aW9uLgoKICBAcHJpdmF0 ZQogIEBtZXRob2QgZXZhbHVhdGVVbmJvdW5kSGVscGVyCiAgQHBhcmFtIHtG dW5jdGlvbn0gZm4KICBAcGFyYW0ge09iamVjdH0gY29udGV4dAogIEBwYXJh bSB7QXJyYXl9IG5vcm1hbGl6ZWRQcm9wZXJ0aWVzCiAgQHBhcmFtIHtTdHJp bmd9IG9wdGlvbnMKKi8KZnVuY3Rpb24gZXZhbHVhdGVVbmJvdW5kSGVscGVy KGNvbnRleHQsIGZuLCBub3JtYWxpemVkUHJvcGVydGllcywgb3B0aW9ucykg ewogIHZhciBhcmdzID0gW10sCiAgIGhhc2ggPSBvcHRpb25zLmhhc2gsCiAg IGJvdW5kT3B0aW9ucyA9IGhhc2guYm91bmRPcHRpb25zLAogICB0eXBlcyA9 IHNsaWNlLmNhbGwob3B0aW9ucy50eXBlcywgMSksCiAgIGxvYywKICAgbGVu LAogICBwcm9wZXJ0eSwKICAgcHJvcGVydHlUeXBlLAogICBib3VuZE9wdGlv bjsKCiAgZm9yIChib3VuZE9wdGlvbiBpbiBib3VuZE9wdGlvbnMpIHsKICAg IGlmICghYm91bmRPcHRpb25zLmhhc093blByb3BlcnR5KGJvdW5kT3B0aW9u KSkgeyBjb250aW51ZTsgfQogICAgaGFzaFtib3VuZE9wdGlvbl0gPSBFbWJl ci5IYW5kbGViYXJzLmdldChjb250ZXh0LCBib3VuZE9wdGlvbnNbYm91bmRP cHRpb25dLCBvcHRpb25zKTsKICB9CgogIGZvcihsb2MgPSAwLCBsZW4gPSBu b3JtYWxpemVkUHJvcGVydGllcy5sZW5ndGg7IGxvYyA8IGxlbjsgKytsb2Mp IHsKICAgIHByb3BlcnR5ID0gbm9ybWFsaXplZFByb3BlcnRpZXNbbG9jXTsK ICAgIHByb3BlcnR5VHlwZSA9IHR5cGVzW2xvY107CiAgICBpZihwcm9wZXJ0 eVR5cGUgPT09ICJJRCIpIHsKICAgICAgYXJncy5wdXNoKEVtYmVyLkhhbmRs ZWJhcnMuZ2V0KHByb3BlcnR5LnJvb3QsIHByb3BlcnR5LnBhdGgsIG9wdGlv bnMpKTsKICAgIH0gZWxzZSB7CiAgICAgIGFyZ3MucHVzaChwcm9wZXJ0eS5w YXRoKTsKICAgIH0KICB9CiAgYXJncy5wdXNoKG9wdGlvbnMpOwogIHJldHVy biBmbi5hcHBseShjb250ZXh0LCBhcmdzKTsKfQoKLyoqCiAgT3ZlcnJpZGVz IEhhbmRsZWJhcnMudGVtcGxhdGUgc28gdGhhdCB3ZSBjYW4gZGlzdGluZ3Vp c2gKICB1c2VyLWNyZWF0ZWQsIHRvcC1sZXZlbCB0ZW1wbGF0ZXMgZnJvbSBp bm5lciBjb250ZXh0cy4KCiAgQHByaXZhdGUKICBAbWV0aG9kIHRlbXBsYXRl CiAgQGZvciBFbWJlci5IYW5kbGViYXJzCiAgQHBhcmFtIHtTdHJpbmd9IHNw ZWMKKi8KRW1iZXIuSGFuZGxlYmFycy50ZW1wbGF0ZSA9IGZ1bmN0aW9uKHNw ZWMpIHsKICB2YXIgdCA9IG9yaWdpbmFsVGVtcGxhdGUoc3BlYyk7CiAgdC5p c1RvcCA9IHRydWU7CiAgcmV0dXJuIHQ7Cn07Cgp9KSgpOwoKCgooZnVuY3Rp b24oKSB7Ci8qKgogIE1hcmsgYSBzdHJpbmcgYXMgc2FmZSBmb3IgdW5lc2Nh cGVkIG91dHB1dCB3aXRoIEhhbmRsZWJhcnMuIElmIHlvdQogIHJldHVybiBI VE1MIGZyb20gYSBIYW5kbGViYXJzIGhlbHBlciwgdXNlIHRoaXMgZnVuY3Rp b24gdG8KICBlbnN1cmUgSGFuZGxlYmFycyBkb2VzIG5vdCBlc2NhcGUgdGhl IEhUTUwuCgogIGBgYGphdmFzY3JpcHQKICBFbWJlci5TdHJpbmcuaHRtbFNh ZmUoJzxkaXY+c29tZVN0cmluZzwvZGl2PicpCiAgYGBgCgogIEBtZXRob2Qg aHRtbFNhZmUKICBAZm9yIEVtYmVyLlN0cmluZwogIEBzdGF0aWMKICBAcmV0 dXJuIHtIYW5kbGViYXJzLlNhZmVTdHJpbmd9IGEgc3RyaW5nIHRoYXQgd2ls bCBub3QgYmUgaHRtbCBlc2NhcGVkIGJ5IEhhbmRsZWJhcnMKKi8KRW1iZXIu U3RyaW5nLmh0bWxTYWZlID0gZnVuY3Rpb24oc3RyKSB7CiAgcmV0dXJuIG5l dyBIYW5kbGViYXJzLlNhZmVTdHJpbmcoc3RyKTsKfTsKCnZhciBodG1sU2Fm ZSA9IEVtYmVyLlN0cmluZy5odG1sU2FmZTsKCmlmIChFbWJlci5FWFRFTkRf UFJPVE9UWVBFUyA9PT0gdHJ1ZSB8fCBFbWJlci5FWFRFTkRfUFJPVE9UWVBF Uy5TdHJpbmcpIHsKCiAgLyoqCiAgICBNYXJrIGEgc3RyaW5nIGFzIGJlaW5n IHNhZmUgZm9yIHVuZXNjYXBlZCBvdXRwdXQgd2l0aCBIYW5kbGViYXJzLgoK ICAgIGBgYGphdmFzY3JpcHQKICAgICc8ZGl2PnNvbWVTdHJpbmc8L2Rpdj4n Lmh0bWxTYWZlKCkKICAgIGBgYAoKICAgIFNlZSBbRW1iZXIuU3RyaW5nLmh0 bWxTYWZlXSgvYXBpL2NsYXNzZXMvRW1iZXIuU3RyaW5nLmh0bWwjbWV0aG9k X2h0bWxTYWZlKS4KCiAgICBAbWV0aG9kIGh0bWxTYWZlCiAgICBAZm9yIFN0 cmluZwogICAgQHJldHVybiB7SGFuZGxlYmFycy5TYWZlU3RyaW5nfSBhIHN0 cmluZyB0aGF0IHdpbGwgbm90IGJlIGh0bWwgZXNjYXBlZCBieSBIYW5kbGVi YXJzCiAgKi8KICBTdHJpbmcucHJvdG90eXBlLmh0bWxTYWZlID0gZnVuY3Rp b24oKSB7CiAgICByZXR1cm4gaHRtbFNhZmUodGhpcyk7CiAgfTsKfQoKfSko KTsKCgoKKGZ1bmN0aW9uKCkgewpFbWJlci5IYW5kbGViYXJzLnJlc29sdmVQ YXRocyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICB2YXIgcmV0ID0gW10sCiAg ICAgIGNvbnRleHRzID0gb3B0aW9ucy5jb250ZXh0cywKICAgICAgcm9vdHMg PSBvcHRpb25zLnJvb3RzLAogICAgICBkYXRhID0gb3B0aW9ucy5kYXRhOwoK ICBmb3IgKHZhciBpPTAsIGw9Y29udGV4dHMubGVuZ3RoOyBpPGw7IGkrKykg ewogICAgcmV0LnB1c2goIEVtYmVyLkhhbmRsZWJhcnMuZ2V0KHJvb3RzW2ld LCBjb250ZXh0c1tpXSwgeyBkYXRhOiBkYXRhIH0pICk7CiAgfQoKICByZXR1 cm4gcmV0Owp9OwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewovKmpzaGludCBu ZXdjYXA6ZmFsc2UqLwovKioKQG1vZHVsZSBlbWJlcgpAc3VibW9kdWxlIGVt YmVyLWhhbmRsZWJhcnMKKi8KCnZhciBzZXQgPSBFbWJlci5zZXQsIGdldCA9 IEVtYmVyLmdldDsKdmFyIE1ldGFtb3JwaCA9IHJlcXVpcmVNb2R1bGUoJ21l dGFtb3JwaCcpOwoKZnVuY3Rpb24gbm90aWZ5TXV0YXRpb25MaXN0ZW5lcnMo KSB7CiAgRW1iZXIucnVuLm9uY2UoRW1iZXIuVmlldywgJ25vdGlmeU11dGF0 aW9uTGlzdGVuZXJzJyk7Cn0KCi8vIERPTU1hbmFnZXIgc2hvdWxkIGp1c3Qg YWJzdHJhY3QgZG9tIG1hbmlwdWxhdGlvbiBiZXR3ZWVuIGpxdWVyeSBhbmQg bWV0YW1vcnBoCnZhciBET01NYW5hZ2VyID0gewogIHJlbW92ZTogZnVuY3Rp b24odmlldykgewogICAgdmlldy5tb3JwaC5yZW1vdmUoKTsKICAgIG5vdGlm eU11dGF0aW9uTGlzdGVuZXJzKCk7CiAgfSwKCiAgcHJlcGVuZDogZnVuY3Rp b24odmlldywgaHRtbCkgewogICAgdmlldy5tb3JwaC5wcmVwZW5kKGh0bWwp OwogICAgbm90aWZ5TXV0YXRpb25MaXN0ZW5lcnMoKTsKICB9LAoKICBhZnRl cjogZnVuY3Rpb24odmlldywgaHRtbCkgewogICAgdmlldy5tb3JwaC5hZnRl cihodG1sKTsKICAgIG5vdGlmeU11dGF0aW9uTGlzdGVuZXJzKCk7CiAgfSwK CiAgaHRtbDogZnVuY3Rpb24odmlldywgaHRtbCkgewogICAgdmlldy5tb3Jw aC5odG1sKGh0bWwpOwogICAgbm90aWZ5TXV0YXRpb25MaXN0ZW5lcnMoKTsK ICB9LAoKICAvLyBUaGlzIGlzIG1lc3NlZCB1cC4KICByZXBsYWNlOiBmdW5j dGlvbih2aWV3KSB7CiAgICB2YXIgbW9ycGggPSB2aWV3Lm1vcnBoOwoKICAg IHZpZXcudHJhbnNpdGlvblRvKCdwcmVSZW5kZXInKTsKCiAgICBFbWJlci5y dW4uc2NoZWR1bGUoJ3JlbmRlcicsIHRoaXMsIGZ1bmN0aW9uIHJlbmRlck1l dGFtb3JwaFZpZXcoKSB7CiAgICAgIGlmICh2aWV3LmlzRGVzdHJveWluZykg eyByZXR1cm47IH0KCiAgICAgIHZpZXcuY2xlYXJSZW5kZXJlZENoaWxkcmVu KCk7CiAgICAgIHZhciBidWZmZXIgPSB2aWV3LnJlbmRlclRvQnVmZmVyKCk7 CgogICAgICB2aWV3Lmludm9rZVJlY3Vyc2l2ZWx5KGZ1bmN0aW9uKHZpZXcp IHsKICAgICAgICB2aWV3LnByb3BlcnR5V2lsbENoYW5nZSgnZWxlbWVudCcp OwogICAgICB9KTsKICAgICAgdmlldy50cmlnZ2VyUmVjdXJzaXZlbHkoJ3dp bGxJbnNlcnRFbGVtZW50Jyk7CgogICAgICBtb3JwaC5yZXBsYWNlV2l0aChi dWZmZXIuc3RyaW5nKCkpOwogICAgICB2aWV3LnRyYW5zaXRpb25UbygnaW5E T00nKTsKCiAgICAgIHZpZXcuaW52b2tlUmVjdXJzaXZlbHkoZnVuY3Rpb24o dmlldykgewogICAgICAgIHZpZXcucHJvcGVydHlEaWRDaGFuZ2UoJ2VsZW1l bnQnKTsKICAgICAgfSk7CiAgICAgIHZpZXcudHJpZ2dlclJlY3Vyc2l2ZWx5 KCdkaWRJbnNlcnRFbGVtZW50Jyk7CgogICAgICBub3RpZnlNdXRhdGlvbkxp c3RlbmVycygpOwogICAgfSk7CiAgfSwKCiAgZW1wdHk6IGZ1bmN0aW9uKHZp ZXcpIHsKICAgIHZpZXcubW9ycGguaHRtbCgiIik7CiAgICBub3RpZnlNdXRh dGlvbkxpc3RlbmVycygpOwogIH0KfTsKCi8vIFRoZSBgbW9ycGhgIGFuZCBg b3V0ZXJIVE1MYCBwcm9wZXJ0aWVzIGFyZSBpbnRlcm5hbCBvbmx5Ci8vIGFu ZCBub3Qgb2JzZXJ2YWJsZS4KCi8qKgogIEBjbGFzcyBfTWV0YW1vcnBoCiAg QG5hbWVzcGFjZSBFbWJlcgogIEBwcml2YXRlCiovCkVtYmVyLl9NZXRhbW9y cGggPSBFbWJlci5NaXhpbi5jcmVhdGUoewogIGlzVmlydHVhbDogdHJ1ZSwK ICB0YWdOYW1lOiAnJywKCiAgaW5zdHJ1bWVudE5hbWU6ICdtZXRhbW9ycGgn LAoKICBpbml0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX3N1cGVyKCk7CiAg ICB0aGlzLm1vcnBoID0gTWV0YW1vcnBoKCk7CiAgICBFbWJlci5kZXByZWNh dGUoJ1N1cHBseWluZyBhIHRhZ05hbWUgdG8gTWV0YW1vcnBoIHZpZXdzIGlz IHVucmVsaWFibGUgYW5kIGlzIGRlcHJlY2F0ZWQuIFlvdSBtYXkgYmUgc2V0 dGluZyB0aGUgdGFnTmFtZSBvbiBhIEhhbmRsZWJhcnMgaGVscGVyIHRoYXQg Y3JlYXRlcyBhIE1ldGFtb3JwaC4nLCAhdGhpcy50YWdOYW1lKTsKICB9LAoK ICBiZWZvcmVSZW5kZXI6IGZ1bmN0aW9uKGJ1ZmZlcikgewogICAgYnVmZmVy LnB1c2godGhpcy5tb3JwaC5zdGFydFRhZygpKTsKICAgIGJ1ZmZlci5wdXNo T3BlbmluZ1RhZygpOwogIH0sCgogIGFmdGVyUmVuZGVyOiBmdW5jdGlvbihi dWZmZXIpIHsKICAgIGJ1ZmZlci5wdXNoQ2xvc2luZ1RhZygpOwogICAgYnVm ZmVyLnB1c2godGhpcy5tb3JwaC5lbmRUYWcoKSk7CiAgfSwKCiAgY3JlYXRl RWxlbWVudDogZnVuY3Rpb24oKSB7CiAgICB2YXIgYnVmZmVyID0gdGhpcy5y ZW5kZXJUb0J1ZmZlcigpOwogICAgdGhpcy5vdXRlckhUTUwgPSBidWZmZXIu c3RyaW5nKCk7CiAgICB0aGlzLmNsZWFyQnVmZmVyKCk7CiAgfSwKCiAgZG9t TWFuYWdlcjogRE9NTWFuYWdlcgp9KTsKCi8qKgogIEBjbGFzcyBfTWV0YW1v cnBoVmlldwogIEBuYW1lc3BhY2UgRW1iZXIKICBAZXh0ZW5kcyBFbWJlci5W aWV3CiAgQHVzZXMgRW1iZXIuX01ldGFtb3JwaAogIEBwcml2YXRlCiovCkVt YmVyLl9NZXRhbW9ycGhWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoRW1iZXIu X01ldGFtb3JwaCk7CgovKioKICBAY2xhc3MgX1NpbXBsZU1ldGFtb3JwaFZp ZXcKICBAbmFtZXNwYWNlIEVtYmVyCiAgQGV4dGVuZHMgRW1iZXIuQ29yZVZp ZXcKICBAdXNlcyBFbWJlci5fTWV0YW1vcnBoCiAgQHByaXZhdGUKKi8KRW1i ZXIuX1NpbXBsZU1ldGFtb3JwaFZpZXcgPSBFbWJlci5Db3JlVmlldy5leHRl bmQoRW1iZXIuX01ldGFtb3JwaCk7CgoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkg ewovKmdsb2JhbHMgSGFuZGxlYmFycyAqLwovKmpzaGludCBuZXdjYXA6ZmFs c2UqLwovKioKQG1vZHVsZSBlbWJlcgpAc3VibW9kdWxlIGVtYmVyLWhhbmRs ZWJhcnMKKi8KCnZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNl dCwgaGFuZGxlYmFyc0dldCA9IEVtYmVyLkhhbmRsZWJhcnMuZ2V0Owp2YXIg TWV0YW1vcnBoID0gcmVxdWlyZU1vZHVsZSgnbWV0YW1vcnBoJyk7CmZ1bmN0 aW9uIFNpbXBsZUhhbmRsZWJhcnNWaWV3KHBhdGgsIHBhdGhSb290LCBpc0Vz Y2FwZWQsIHRlbXBsYXRlRGF0YSkgewogIHRoaXMucGF0aCA9IHBhdGg7CiAg dGhpcy5wYXRoUm9vdCA9IHBhdGhSb290OwogIHRoaXMuaXNFc2NhcGVkID0g aXNFc2NhcGVkOwogIHRoaXMudGVtcGxhdGVEYXRhID0gdGVtcGxhdGVEYXRh OwoKICB0aGlzLm1vcnBoID0gTWV0YW1vcnBoKCk7CiAgdGhpcy5zdGF0ZSA9 ICdwcmVSZW5kZXInOwogIHRoaXMudXBkYXRlSWQgPSBudWxsOwogIHRoaXMu X3BhcmVudFZpZXcgPSBudWxsOwogIHRoaXMuYnVmZmVyID0gbnVsbDsKfQoK RW1iZXIuX1NpbXBsZUhhbmRsZWJhcnNWaWV3ID0gU2ltcGxlSGFuZGxlYmFy c1ZpZXc7CgpTaW1wbGVIYW5kbGViYXJzVmlldy5wcm90b3R5cGUgPSB7CiAg aXNWaXJ0dWFsOiB0cnVlLAogIGlzVmlldzogdHJ1ZSwKCiAgZGVzdHJveTog ZnVuY3Rpb24gKCkgewogICAgaWYgKHRoaXMudXBkYXRlSWQpIHsKICAgICAg RW1iZXIucnVuLmNhbmNlbCh0aGlzLnVwZGF0ZUlkKTsKICAgICAgdGhpcy51 cGRhdGVJZCA9IG51bGw7CiAgICB9CiAgICBpZiAodGhpcy5fcGFyZW50Vmll dykgewogICAgICB0aGlzLl9wYXJlbnRWaWV3LnJlbW92ZUNoaWxkKHRoaXMp OwogICAgfQogICAgdGhpcy5tb3JwaCA9IG51bGw7CiAgICB0aGlzLnN0YXRl ID0gJ2Rlc3Ryb3llZCc7CiAgfSwKCiAgcHJvcGVydHlXaWxsQ2hhbmdlOiBF bWJlci5LLAoKICBwcm9wZXJ0eURpZENoYW5nZTogRW1iZXIuSywKCiAgbm9y bWFsaXplZFZhbHVlOiBmdW5jdGlvbigpIHsKICAgIHZhciBwYXRoID0gdGhp cy5wYXRoLAogICAgICAgIHBhdGhSb290ID0gdGhpcy5wYXRoUm9vdCwKICAg ICAgICByZXN1bHQsIHRlbXBsYXRlRGF0YTsKCiAgICAvLyBVc2UgdGhlIHBh dGhSb290IGFzIHRoZSByZXN1bHQgaWYgbm8gcGF0aCBpcyBwcm92aWRlZC4g VGhpcwogICAgLy8gaGFwcGVucyBpZiB0aGUgcGF0aCBpcyBgdGhpc2AsIHdo aWNoIGdldHMgbm9ybWFsaXplZCBpbnRvCiAgICAvLyBhIGBwYXRoUm9vdGAg b2YgdGhlIGN1cnJlbnQgSGFuZGxlYmFycyBjb250ZXh0IGFuZCBhIHBhdGgK ICAgIC8vIG9mIGAnJ2AuCiAgICBpZiAocGF0aCA9PT0gJycpIHsKICAgICAg cmVzdWx0ID0gcGF0aFJvb3Q7CiAgICB9IGVsc2UgewogICAgICB0ZW1wbGF0 ZURhdGEgPSB0aGlzLnRlbXBsYXRlRGF0YTsKICAgICAgcmVzdWx0ID0gaGFu ZGxlYmFyc0dldChwYXRoUm9vdCwgcGF0aCwgeyBkYXRhOiB0ZW1wbGF0ZURh dGEgfSk7CiAgICB9CgogICAgcmV0dXJuIHJlc3VsdDsKICB9LAoKICByZW5k ZXJUb0J1ZmZlcjogZnVuY3Rpb24oYnVmZmVyKSB7CiAgICB2YXIgc3RyaW5n ID0gJyc7CgogICAgc3RyaW5nICs9IHRoaXMubW9ycGguc3RhcnRUYWcoKTsK ICAgIHN0cmluZyArPSB0aGlzLnJlbmRlcigpOwogICAgc3RyaW5nICs9IHRo aXMubW9ycGguZW5kVGFnKCk7CgogICAgYnVmZmVyLnB1c2goc3RyaW5nKTsK ICB9LAoKICByZW5kZXI6IGZ1bmN0aW9uKCkgewogICAgLy8gSWYgbm90IGlu dm9rZWQgdmlhIGEgdHJpcGxlLW11c3RhY2hlICh7e3tmb299fX0pLCBlc2Nh cGUKICAgIC8vIHRoZSBjb250ZW50IG9mIHRoZSB0ZW1wbGF0ZS4KICAgIHZh ciBlc2NhcGUgPSB0aGlzLmlzRXNjYXBlZDsKICAgIHZhciByZXN1bHQgPSB0 aGlzLm5vcm1hbGl6ZWRWYWx1ZSgpOwoKICAgIGlmIChyZXN1bHQgPT09IG51 bGwgfHwgcmVzdWx0ID09PSB1bmRlZmluZWQpIHsKICAgICAgcmVzdWx0ID0g IiI7CiAgICB9IGVsc2UgaWYgKCEocmVzdWx0IGluc3RhbmNlb2YgSGFuZGxl YmFycy5TYWZlU3RyaW5nKSkgewogICAgICByZXN1bHQgPSBTdHJpbmcocmVz dWx0KTsKICAgIH0KCiAgICBpZiAoZXNjYXBlKSB7IHJlc3VsdCA9IEhhbmRs ZWJhcnMuVXRpbHMuZXNjYXBlRXhwcmVzc2lvbihyZXN1bHQpOyB9CiAgICBy ZXR1cm4gcmVzdWx0OwogIH0sCgogIHJlcmVuZGVyOiBmdW5jdGlvbigpIHsK ICAgIHN3aXRjaCh0aGlzLnN0YXRlKSB7CiAgICAgIGNhc2UgJ3ByZVJlbmRl cic6CiAgICAgIGNhc2UgJ2Rlc3Ryb3llZCc6CiAgICAgICAgYnJlYWs7CiAg ICAgIGNhc2UgJ2luQnVmZmVyJzoKICAgICAgICB0aHJvdyBuZXcgRW1iZXIu RXJyb3IoIlNvbWV0aGluZyB5b3UgZGlkIHRyaWVkIHRvIHJlcGxhY2UgYW4g e3tleHByZXNzaW9ufX0gYmVmb3JlIGl0IHdhcyBpbnNlcnRlZCBpbnRvIHRo ZSBET00uIik7CiAgICAgIGNhc2UgJ2hhc0VsZW1lbnQnOgogICAgICBjYXNl ICdpbkRPTSc6CiAgICAgICAgdGhpcy51cGRhdGVJZCA9IEVtYmVyLnJ1bi5z Y2hlZHVsZU9uY2UoJ3JlbmRlcicsIHRoaXMsICd1cGRhdGUnKTsKICAgICAg ICBicmVhazsKICAgIH0KCiAgICByZXR1cm4gdGhpczsKICB9LAoKICB1cGRh dGU6IGZ1bmN0aW9uICgpIHsKICAgIHRoaXMudXBkYXRlSWQgPSBudWxsOwog ICAgdGhpcy5tb3JwaC5odG1sKHRoaXMucmVuZGVyKCkpOwogIH0sCgogIHRy YW5zaXRpb25UbzogZnVuY3Rpb24oc3RhdGUpIHsKICAgIHRoaXMuc3RhdGUg PSBzdGF0ZTsKICB9Cn07Cgp2YXIgc3RhdGVzID0gRW1iZXIuVmlldy5jbG9u ZVN0YXRlcyhFbWJlci5WaWV3LnN0YXRlcyksIG1lcmdlID0gRW1iZXIubWVy Z2U7CgptZXJnZShzdGF0ZXMuX2RlZmF1bHQsIHsKICByZXJlbmRlcklmTmVl ZGVkOiBFbWJlci5LCn0pOwoKbWVyZ2Uoc3RhdGVzLmluRE9NLCB7CiAgcmVy ZW5kZXJJZk5lZWRlZDogZnVuY3Rpb24odmlldykgewogICAgaWYgKHZpZXcu bm9ybWFsaXplZFZhbHVlKCkgIT09IHZpZXcuX2xhc3ROb3JtYWxpemVkVmFs dWUpIHsKICAgICAgdmlldy5yZXJlbmRlcigpOwogICAgfQogIH0KfSk7Cgov KioKICBgRW1iZXIuX0hhbmRsZWJhcnNCb3VuZFZpZXdgIGlzIGEgcHJpdmF0 ZSB2aWV3IGNyZWF0ZWQgYnkgdGhlIEhhbmRsZWJhcnMKICBge3tiaW5kfX1g IGhlbHBlcnMgdGhhdCBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgYm91bmQg cHJvcGVydGllcy4KCiAgRXZlcnkgdGltZSBhIHByb3BlcnR5IGlzIGJvdW5k IHVzaW5nIGEgYHt7bXVzdGFjaGV9fWAsIGFuIGFub255bW91cyBzdWJjbGFz cwogIG9mIGBFbWJlci5fSGFuZGxlYmFyc0JvdW5kVmlld2AgaXMgY3JlYXRl ZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBzdWItdGVtcGxhdGUKICBhbmQgY29u dGV4dCBzZXQgdXAuIFdoZW4gdGhlIGFzc29jaWF0ZWQgcHJvcGVydHkgY2hh bmdlcywganVzdCB0aGUgdGVtcGxhdGUKICBmb3IgdGhpcyB2aWV3IHdpbGwg cmUtcmVuZGVyLgoKICBAY2xhc3MgX0hhbmRsZWJhcnNCb3VuZFZpZXcKICBA bmFtZXNwYWNlIEVtYmVyCiAgQGV4dGVuZHMgRW1iZXIuX01ldGFtb3JwaFZp ZXcKICBAcHJpdmF0ZQoqLwpFbWJlci5fSGFuZGxlYmFyc0JvdW5kVmlldyA9 IEVtYmVyLl9NZXRhbW9ycGhWaWV3LmV4dGVuZCh7CiAgaW5zdHJ1bWVudE5h bWU6ICdib3VuZEhhbmRsZWJhcnMnLAogIHN0YXRlczogc3RhdGVzLAoKICAv KioKICAgIFRoZSBmdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUg YGRpc3BsYXlUZW1wbGF0ZWAgb3IKICAgIGBpbnZlcnNlVGVtcGxhdGVgIHNo b3VsZCBiZSByZW5kZXJlZC4gVGhpcyBzaG91bGQgYmUgYSBmdW5jdGlvbiB0 aGF0IHRha2VzCiAgICBhIHZhbHVlIGFuZCByZXR1cm5zIGEgQm9vbGVhbi4K CiAgICBAcHJvcGVydHkgc2hvdWxkRGlzcGxheUZ1bmMKICAgIEB0eXBlIEZ1 bmN0aW9uCiAgICBAZGVmYXVsdCBudWxsCiAgKi8KICBzaG91bGREaXNwbGF5 RnVuYzogbnVsbCwKCiAgLyoqCiAgICBXaGV0aGVyIHRoZSB0ZW1wbGF0ZSBy ZW5kZXJlZCBieSB0aGlzIHZpZXcgZ2V0cyBwYXNzZWQgdGhlIGNvbnRleHQg b2JqZWN0CiAgICBvZiBpdHMgcGFyZW50IHRlbXBsYXRlLCBvciBnZXRzIHBh c3NlZCB0aGUgdmFsdWUgb2YgcmV0cmlldmluZyBgcGF0aGAKICAgIGZyb20g dGhlIGBwYXRoUm9vdGAuCgogICAgRm9yIGV4YW1wbGUsIHRoaXMgaXMgdHJ1 ZSB3aGVuIHVzaW5nIHRoZSBge3sjaWZ9fWAgaGVscGVyLCBiZWNhdXNlIHRo ZQogICAgdGVtcGxhdGUgaW5zaWRlIHRoZSBoZWxwZXIgc2hvdWxkIGxvb2sg dXAgcHJvcGVydGllcyByZWxhdGl2ZSB0byB0aGUgc2FtZQogICAgb2JqZWN0 IGFzIG91dHNpZGUgdGhlIGJsb2NrLiBUaGlzIHdvdWxkIGJlIGBmYWxzZWAg d2hlbiB1c2VkIHdpdGggYHt7I3dpdGgKICAgIGZvb319YCBiZWNhdXNlIHRo ZSB0ZW1wbGF0ZSBzaG91bGQgcmVjZWl2ZSB0aGUgb2JqZWN0IGZvdW5kIGJ5 IGV2YWx1YXRpbmcKICAgIGBmb29gLgoKICAgIEBwcm9wZXJ0eSBwcmVzZXJ2 ZUNvbnRleHQKICAgIEB0eXBlIEJvb2xlYW4KICAgIEBkZWZhdWx0IGZhbHNl CiAgKi8KICBwcmVzZXJ2ZUNvbnRleHQ6IGZhbHNlLAoKICAvKioKICAgIElm IGBwcmVzZXJ2ZUNvbnRleHRgIGlzIHRydWUsIHRoaXMgaXMgdGhlIG9iamVj dCB0aGF0IHdpbGwgYmUgdXNlZAogICAgdG8gcmVuZGVyIHRoZSB0ZW1wbGF0 ZS4KCiAgICBAcHJvcGVydHkgcHJldmlvdXNDb250ZXh0CiAgICBAdHlwZSBP YmplY3QKICAqLwogIHByZXZpb3VzQ29udGV4dDogbnVsbCwKCiAgLyoqCiAg ICBUaGUgdGVtcGxhdGUgdG8gcmVuZGVyIHdoZW4gYHNob3VsZERpc3BsYXlG dW5jYCBldmFsdWF0ZXMgdG8gYHRydWVgLgoKICAgIEBwcm9wZXJ0eSBkaXNw bGF5VGVtcGxhdGUKICAgIEB0eXBlIEZ1bmN0aW9uCiAgICBAZGVmYXVsdCBu dWxsCiAgKi8KICBkaXNwbGF5VGVtcGxhdGU6IG51bGwsCgogIC8qKgogICAg VGhlIHRlbXBsYXRlIHRvIHJlbmRlciB3aGVuIGBzaG91bGREaXNwbGF5RnVu Y2AgZXZhbHVhdGVzIHRvIGBmYWxzZWAuCgogICAgQHByb3BlcnR5IGludmVy c2VUZW1wbGF0ZQogICAgQHR5cGUgRnVuY3Rpb24KICAgIEBkZWZhdWx0IG51 bGwKICAqLwogIGludmVyc2VUZW1wbGF0ZTogbnVsbCwKCgogIC8qKgogICAg VGhlIHBhdGggdG8gbG9vayB1cCBvbiBgcGF0aFJvb3RgIHRoYXQgaXMgcGFz c2VkIHRvCiAgICBgc2hvdWxkRGlzcGxheUZ1bmNgIHRvIGRldGVybWluZSB3 aGljaCB0ZW1wbGF0ZSB0byByZW5kZXIuCgogICAgSW4gYWRkaXRpb24sIGlm IGBwcmVzZXJ2ZUNvbnRleHRgIGlzIGBmYWxzZSxgIHRoZSBvYmplY3QgYXQg dGhpcyBwYXRoIHdpbGwKICAgIGJlIHBhc3NlZCB0byB0aGUgdGVtcGxhdGUg d2hlbiByZW5kZXJpbmcuCgogICAgQHByb3BlcnR5IHBhdGgKICAgIEB0eXBl IFN0cmluZwogICAgQGRlZmF1bHQgbnVsbAogICovCiAgcGF0aDogbnVsbCwK CiAgLyoqCiAgICBUaGUgb2JqZWN0IGZyb20gd2hpY2ggdGhlIGBwYXRoYCB3 aWxsIGJlIGxvb2tlZCB1cC4gU29tZXRpbWVzIHRoaXMgaXMgdGhlCiAgICBz YW1lIGFzIHRoZSBgcHJldmlvdXNDb250ZXh0YCwgYnV0IGluIGNhc2VzIHdo ZXJlIHRoaXMgdmlldyBoYXMgYmVlbgogICAgZ2VuZXJhdGVkIGZvciBwYXRo cyB0aGF0IHN0YXJ0IHdpdGggYSBrZXl3b3JkIHN1Y2ggYXMgYHZpZXdgIG9y CiAgICBgY29udHJvbGxlcmAsIHRoZSBwYXRoIHJvb3Qgd2lsbCBiZSB0aGF0 IHJlc29sdmVkIG9iamVjdC4KCiAgICBAcHJvcGVydHkgcGF0aFJvb3QKICAg IEB0eXBlIE9iamVjdAogICovCiAgcGF0aFJvb3Q6IG51bGwsCgogIG5vcm1h bGl6ZWRWYWx1ZTogZnVuY3Rpb24oKSB7CiAgICB2YXIgcGF0aCA9IGdldCh0 aGlzLCAncGF0aCcpLAogICAgICAgIHBhdGhSb290ICA9IGdldCh0aGlzLCAn cGF0aFJvb3QnKSwKICAgICAgICB2YWx1ZU5vcm1hbGl6ZXIgPSBnZXQodGhp cywgJ3ZhbHVlTm9ybWFsaXplckZ1bmMnKSwKICAgICAgICByZXN1bHQsIHRl bXBsYXRlRGF0YTsKCiAgICAvLyBVc2UgdGhlIHBhdGhSb290IGFzIHRoZSBy ZXN1bHQgaWYgbm8gcGF0aCBpcyBwcm92aWRlZC4gVGhpcwogICAgLy8gaGFw cGVucyBpZiB0aGUgcGF0aCBpcyBgdGhpc2AsIHdoaWNoIGdldHMgbm9ybWFs aXplZCBpbnRvCiAgICAvLyBhIGBwYXRoUm9vdGAgb2YgdGhlIGN1cnJlbnQg SGFuZGxlYmFycyBjb250ZXh0IGFuZCBhIHBhdGgKICAgIC8vIG9mIGAnJ2Au CiAgICBpZiAocGF0aCA9PT0gJycpIHsKICAgICAgcmVzdWx0ID0gcGF0aFJv b3Q7CiAgICB9IGVsc2UgewogICAgICB0ZW1wbGF0ZURhdGEgPSBnZXQodGhp cywgJ3RlbXBsYXRlRGF0YScpOwogICAgICByZXN1bHQgPSBoYW5kbGViYXJz R2V0KHBhdGhSb290LCBwYXRoLCB7IGRhdGE6IHRlbXBsYXRlRGF0YSB9KTsK ICAgIH0KCiAgICByZXR1cm4gdmFsdWVOb3JtYWxpemVyID8gdmFsdWVOb3Jt YWxpemVyKHJlc3VsdCkgOiByZXN1bHQ7CiAgfSwKCiAgcmVyZW5kZXJJZk5l ZWRlZDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmN1cnJlbnRTdGF0ZS5yZXJl bmRlcklmTmVlZGVkKHRoaXMpOwogIH0sCgogIC8qKgogICAgRGV0ZXJtaW5l cyB3aGljaCB0ZW1wbGF0ZSB0byBpbnZva2UsIHNldHMgdXAgdGhlIGNvcnJl Y3Qgc3RhdGUgYmFzZWQgb24KICAgIHRoYXQgbG9naWMsIHRoZW4gaW52b2tl cyB0aGUgZGVmYXVsdCBgRW1iZXIuVmlld2AgYHJlbmRlcmAgaW1wbGVtZW50 YXRpb24uCgogICAgVGhpcyBtZXRob2Qgd2lsbCBmaXJzdCBsb29rIHVwIHRo ZSBgcGF0aGAga2V5IG9uIGBwYXRoUm9vdGAsCiAgICB0aGVuIHBhc3MgdGhh dCB2YWx1ZSB0byB0aGUgYHNob3VsZERpc3BsYXlGdW5jYCBmdW5jdGlvbi4g SWYgdGhhdCByZXR1cm5zCiAgICBgdHJ1ZSxgIHRoZSBgZGlzcGxheVRlbXBs YXRlYCBmdW5jdGlvbiB3aWxsIGJlIHJlbmRlcmVkIHRvIERPTS4gT3RoZXJ3 aXNlLAogICAgYGludmVyc2VUZW1wbGF0ZWAsIGlmIHNwZWNpZmllZCwgd2ls bCBiZSByZW5kZXJlZC4KCiAgICBGb3IgZXhhbXBsZSwgaWYgdGhpcyBgRW1i ZXIuX0hhbmRsZWJhcnNCb3VuZFZpZXdgIHJlcHJlc2VudGVkIHRoZSBge3sj d2l0aAogICAgZm9vfX1gIGhlbHBlciwgaXQgd291bGQgbG9vayB1cCB0aGUg YGZvb2AgcHJvcGVydHkgb2YgaXRzIGNvbnRleHQsIGFuZAogICAgYHNob3Vs ZERpc3BsYXlGdW5jYCB3b3VsZCBhbHdheXMgcmV0dXJuIHRydWUuIFRoZSBv YmplY3QgZm91bmQgYnkgbG9va2luZwogICAgdXAgYGZvb2Agd291bGQgYmUg cGFzc2VkIHRvIGBkaXNwbGF5VGVtcGxhdGVgLgoKICAgIEBtZXRob2QgcmVu ZGVyCiAgICBAcGFyYW0ge0VtYmVyLlJlbmRlckJ1ZmZlcn0gYnVmZmVyCiAg Ki8KICByZW5kZXI6IGZ1bmN0aW9uKGJ1ZmZlcikgewogICAgLy8gSWYgbm90 IGludm9rZWQgdmlhIGEgdHJpcGxlLW11c3RhY2hlICh7e3tmb299fX0pLCBl c2NhcGUKICAgIC8vIHRoZSBjb250ZW50IG9mIHRoZSB0ZW1wbGF0ZS4KICAg IHZhciBlc2NhcGUgPSBnZXQodGhpcywgJ2lzRXNjYXBlZCcpOwoKICAgIHZh ciBzaG91bGREaXNwbGF5ID0gZ2V0KHRoaXMsICdzaG91bGREaXNwbGF5RnVu YycpLAogICAgICAgIHByZXNlcnZlQ29udGV4dCA9IGdldCh0aGlzLCAncHJl c2VydmVDb250ZXh0JyksCiAgICAgICAgY29udGV4dCA9IGdldCh0aGlzLCAn cHJldmlvdXNDb250ZXh0Jyk7CgogICAgdmFyIF9jb250ZXh0Q29udHJvbGxl ciA9IGdldCh0aGlzLCAnX2NvbnRleHRDb250cm9sbGVyJyk7CgogICAgdmFy IGludmVyc2VUZW1wbGF0ZSA9IGdldCh0aGlzLCAnaW52ZXJzZVRlbXBsYXRl JyksCiAgICAgICAgZGlzcGxheVRlbXBsYXRlID0gZ2V0KHRoaXMsICdkaXNw bGF5VGVtcGxhdGUnKTsKCiAgICB2YXIgcmVzdWx0ID0gdGhpcy5ub3JtYWxp emVkVmFsdWUoKTsKICAgIHRoaXMuX2xhc3ROb3JtYWxpemVkVmFsdWUgPSBy ZXN1bHQ7CgogICAgLy8gRmlyc3QsIHRlc3QgdGhlIGNvbmRpdGlvbmFsIHRv IHNlZSBpZiB3ZSBzaG91bGQKICAgIC8vIHJlbmRlciB0aGUgdGVtcGxhdGUg b3Igbm90LgogICAgaWYgKHNob3VsZERpc3BsYXkocmVzdWx0KSkgewogICAg ICBzZXQodGhpcywgJ3RlbXBsYXRlJywgZGlzcGxheVRlbXBsYXRlKTsKCiAg ICAgIC8vIElmIHdlIGFyZSBwcmVzZXJ2aW5nIHRoZSBjb250ZXh0IChmb3Ig ZXhhbXBsZSwgaWYgdGhpcwogICAgICAvLyBpcyBhbiAjaWYgYmxvY2ssIGNh bGwgdGhlIHRlbXBsYXRlIHdpdGggdGhlIHNhbWUgb2JqZWN0LgogICAgICBp ZiAocHJlc2VydmVDb250ZXh0KSB7CiAgICAgICAgc2V0KHRoaXMsICdfY29u dGV4dCcsIGNvbnRleHQpOwogICAgICB9IGVsc2UgewogICAgICAvLyBPdGhl cndpc2UsIGRldGVybWluZSBpZiB0aGlzIGlzIGEgYmxvY2sgYmluZCBvciBu b3QuCiAgICAgIC8vIElmIHNvLCBwYXNzIHRoZSBzcGVjaWZpZWQgb2JqZWN0 IHRvIHRoZSB0ZW1wbGF0ZQogICAgICAgIGlmIChkaXNwbGF5VGVtcGxhdGUp IHsKICAgICAgICAgIGlmIChfY29udGV4dENvbnRyb2xsZXIpIHsKICAgICAg ICAgICAgc2V0KF9jb250ZXh0Q29udHJvbGxlciwgJ2NvbnRlbnQnLCByZXN1 bHQpOwogICAgICAgICAgICByZXN1bHQgPSBfY29udGV4dENvbnRyb2xsZXI7 CiAgICAgICAgICB9CiAgICAgICAgICBzZXQodGhpcywgJ19jb250ZXh0Jywg cmVzdWx0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgIC8vIFRoaXMgaXMg bm90IGEgYmluZCBibG9jaywganVzdCBwdXNoIHRoZSByZXN1bHQgb2YgdGhl CiAgICAgICAgLy8gZXhwcmVzc2lvbiB0byB0aGUgcmVuZGVyIGNvbnRleHQg YW5kIHJldHVybi4KICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwg cmVzdWx0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgcmVzdWx0ID0g IiI7CiAgICAgICAgICB9IGVsc2UgaWYgKCEocmVzdWx0IGluc3RhbmNlb2Yg SGFuZGxlYmFycy5TYWZlU3RyaW5nKSkgewogICAgICAgICAgICByZXN1bHQg PSBTdHJpbmcocmVzdWx0KTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAo ZXNjYXBlKSB7IHJlc3VsdCA9IEhhbmRsZWJhcnMuVXRpbHMuZXNjYXBlRXhw cmVzc2lvbihyZXN1bHQpOyB9CiAgICAgICAgICBidWZmZXIucHVzaChyZXN1 bHQpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAg fSBlbHNlIGlmIChpbnZlcnNlVGVtcGxhdGUpIHsKICAgICAgc2V0KHRoaXMs ICd0ZW1wbGF0ZScsIGludmVyc2VUZW1wbGF0ZSk7CgogICAgICBpZiAocHJl c2VydmVDb250ZXh0KSB7CiAgICAgICAgc2V0KHRoaXMsICdfY29udGV4dCcs IGNvbnRleHQpOwogICAgICB9IGVsc2UgewogICAgICAgIHNldCh0aGlzLCAn X2NvbnRleHQnLCByZXN1bHQpOwogICAgICB9CiAgICB9IGVsc2UgewogICAg ICBzZXQodGhpcywgJ3RlbXBsYXRlJywgZnVuY3Rpb24oKSB7IHJldHVybiAn JzsgfSk7CiAgICB9CgogICAgcmV0dXJuIHRoaXMuX3N1cGVyKGJ1ZmZlcik7 CiAgfQp9KTsKCn0pKCk7CgoKCihmdW5jdGlvbigpIHsKLyoqCkBtb2R1bGUg ZW1iZXIKQHN1Ym1vZHVsZSBlbWJlci1oYW5kbGViYXJzCiovCgp2YXIgZ2V0 ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsIGZtdCA9IEVtYmVyLlN0 cmluZy5mbXQ7CnZhciBoYW5kbGViYXJzR2V0ID0gRW1iZXIuSGFuZGxlYmFy cy5nZXQsIG5vcm1hbGl6ZVBhdGggPSBFbWJlci5IYW5kbGViYXJzLm5vcm1h bGl6ZVBhdGg7CnZhciBoYW5kbGViYXJzR2V0RXNjYXBlZCA9IEVtYmVyLkhh bmRsZWJhcnMuZ2V0RXNjYXBlZDsKdmFyIGZvckVhY2ggPSBFbWJlci5BcnJh eVBvbHlmaWxscy5mb3JFYWNoOwp2YXIgb19jcmVhdGUgPSBFbWJlci5jcmVh dGU7Cgp2YXIgRW1iZXJIYW5kbGViYXJzID0gRW1iZXIuSGFuZGxlYmFycywg aGVscGVycyA9IEVtYmVySGFuZGxlYmFycy5oZWxwZXJzOwoKZnVuY3Rpb24g ZXhpc3RzKHZhbHVlKSB7CiAgcmV0dXJuICFFbWJlci5pc05vbmUodmFsdWUp Owp9CgovLyBCaW5kcyBhIHByb3BlcnR5IGludG8gdGhlIERPTS4gVGhpcyB3 aWxsIGNyZWF0ZSBhIGhvb2sgaW4gRE9NIHRoYXQgdGhlCi8vIEtWTyBzeXN0 ZW0gd2lsbCBsb29rIGZvciBhbmQgdXBkYXRlIGlmIHRoZSBwcm9wZXJ0eSBj aGFuZ2VzLgpmdW5jdGlvbiBiaW5kKHByb3BlcnR5LCBvcHRpb25zLCBwcmVz ZXJ2ZUNvbnRleHQsIHNob3VsZERpc3BsYXksIHZhbHVlTm9ybWFsaXplciwg Y2hpbGRQcm9wZXJ0aWVzKSB7CiAgdmFyIGRhdGEgPSBvcHRpb25zLmRhdGEs CiAgICAgIGZuID0gb3B0aW9ucy5mbiwKICAgICAgaW52ZXJzZSA9IG9wdGlv bnMuaW52ZXJzZSwKICAgICAgdmlldyA9IGRhdGEudmlldywKICAgICAgY3Vy cmVudENvbnRleHQgPSB0aGlzLAogICAgICBub3JtYWxpemVkLCBvYnNlcnZl ciwgaTsKCiAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVBhdGgoY3VycmVudENv bnRleHQsIHByb3BlcnR5LCBkYXRhKTsKCiAgLy8gU2V0IHVwIG9ic2VydmVy cyBmb3Igb2JzZXJ2YWJsZSBvYmplY3RzCiAgaWYgKCdvYmplY3QnID09PSB0 eXBlb2YgdGhpcykgewogICAgaWYgKGRhdGEuaW5zaWRlR3JvdXApIHsKICAg ICAgb2JzZXJ2ZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICBFbWJlci5ydW4u b25jZSh2aWV3LCAncmVyZW5kZXInKTsKICAgICAgfTsKCiAgICAgIHZhciB0 ZW1wbGF0ZSwgY29udGV4dCwgcmVzdWx0ID0gaGFuZGxlYmFyc0dldChjdXJy ZW50Q29udGV4dCwgcHJvcGVydHksIG9wdGlvbnMpOwoKICAgICAgcmVzdWx0 ID0gdmFsdWVOb3JtYWxpemVyID8gdmFsdWVOb3JtYWxpemVyKHJlc3VsdCkg OiByZXN1bHQ7CgogICAgICBjb250ZXh0ID0gcHJlc2VydmVDb250ZXh0ID8g Y3VycmVudENvbnRleHQgOiByZXN1bHQ7CiAgICAgIGlmIChzaG91bGREaXNw bGF5KHJlc3VsdCkpIHsKICAgICAgICB0ZW1wbGF0ZSA9IGZuOwogICAgICB9 IGVsc2UgaWYgKGludmVyc2UpIHsKICAgICAgICB0ZW1wbGF0ZSA9IGludmVy c2U7CiAgICAgIH0KCiAgICAgIHRlbXBsYXRlKGNvbnRleHQsIHsgZGF0YTog b3B0aW9ucy5kYXRhIH0pOwogICAgfSBlbHNlIHsKICAgICAgLy8gQ3JlYXRl IHRoZSB2aWV3IHRoYXQgd2lsbCB3cmFwIHRoZSBvdXRwdXQgb2YgdGhpcyB0 ZW1wbGF0ZS9wcm9wZXJ0eQogICAgICAvLyBhbmQgYWRkIGl0IHRvIHRoZSBu ZWFyZXN0IHZpZXcncyBjaGlsZFZpZXdzIGFycmF5LgogICAgICAvLyBTZWUg dGhlIGRvY3VtZW50YXRpb24gb2YgRW1iZXIuX0hhbmRsZWJhcnNCb3VuZFZp ZXcgZm9yIG1vcmUuCiAgICAgIHZhciBiaW5kVmlldyA9IHZpZXcuY3JlYXRl Q2hpbGRWaWV3KEVtYmVyLl9IYW5kbGViYXJzQm91bmRWaWV3LCB7CiAgICAg ICAgcHJlc2VydmVDb250ZXh0OiBwcmVzZXJ2ZUNvbnRleHQsCiAgICAgICAg c2hvdWxkRGlzcGxheUZ1bmM6IHNob3VsZERpc3BsYXksCiAgICAgICAgdmFs dWVOb3JtYWxpemVyRnVuYzogdmFsdWVOb3JtYWxpemVyLAogICAgICAgIGRp c3BsYXlUZW1wbGF0ZTogZm4sCiAgICAgICAgaW52ZXJzZVRlbXBsYXRlOiBp bnZlcnNlLAogICAgICAgIHBhdGg6IHByb3BlcnR5LAogICAgICAgIHBhdGhS b290OiBjdXJyZW50Q29udGV4dCwKICAgICAgICBwcmV2aW91c0NvbnRleHQ6 IGN1cnJlbnRDb250ZXh0LAogICAgICAgIGlzRXNjYXBlZDogIW9wdGlvbnMu aGFzaC51bmVzY2FwZWQsCiAgICAgICAgdGVtcGxhdGVEYXRhOiBvcHRpb25z LmRhdGEKICAgICAgfSk7CgogICAgICBpZiAob3B0aW9ucy5oYXNoLmNvbnRy b2xsZXIpIHsKICAgICAgICBiaW5kVmlldy5zZXQoJ19jb250ZXh0Q29udHJv bGxlcicsIHRoaXMuY29udGFpbmVyLmxvb2t1cEZhY3RvcnkoJ2NvbnRyb2xs ZXI6JytvcHRpb25zLmhhc2guY29udHJvbGxlcikuY3JlYXRlKHsKICAgICAg ICAgIGNvbnRhaW5lcjogY3VycmVudENvbnRleHQuY29udGFpbmVyLAogICAg ICAgICAgcGFyZW50Q29udHJvbGxlcjogY3VycmVudENvbnRleHQsCiAgICAg ICAgICB0YXJnZXQ6IGN1cnJlbnRDb250ZXh0CiAgICAgICAgfSkpOwogICAg ICB9CgogICAgICB2aWV3LmFwcGVuZENoaWxkKGJpbmRWaWV3KTsKCiAgICAg IG9ic2VydmVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgRW1iZXIucnVuLnNj aGVkdWxlT25jZSgncmVuZGVyJywgYmluZFZpZXcsICdyZXJlbmRlcklmTmVl ZGVkJyk7CiAgICAgIH07CiAgICB9CgogICAgLy8gT2JzZXJ2ZXMgdGhlIGdp dmVuIHByb3BlcnR5IG9uIHRoZSBjb250ZXh0IGFuZAogICAgLy8gdGVsbHMg dGhlIEVtYmVyLl9IYW5kbGViYXJzQm91bmRWaWV3IHRvIHJlLXJlbmRlci4g SWYgcHJvcGVydHkKICAgIC8vIGlzIGFuIGVtcHR5IHN0cmluZywgd2UgYXJl IHByaW50aW5nIHRoZSBjdXJyZW50IGNvbnRleHQKICAgIC8vIG9iamVjdCAo e3t0aGlzfX0pIHNvIHVwZGF0aW5nIGl0IGlzIG5vdCBvdXIgcmVzcG9uc2li aWxpdHkuCiAgICBpZiAobm9ybWFsaXplZC5wYXRoICE9PSAnJykgewogICAg ICB2aWV3LnJlZ2lzdGVyT2JzZXJ2ZXIobm9ybWFsaXplZC5yb290LCBub3Jt YWxpemVkLnBhdGgsIG9ic2VydmVyKTsKICAgICAgaWYgKGNoaWxkUHJvcGVy dGllcykgewogICAgICAgIGZvciAoaT0wOyBpPGNoaWxkUHJvcGVydGllcy5s ZW5ndGg7IGkrKykgewogICAgICAgICAgdmlldy5yZWdpc3Rlck9ic2VydmVy KG5vcm1hbGl6ZWQucm9vdCwgbm9ybWFsaXplZC5wYXRoKycuJytjaGlsZFBy b3BlcnRpZXNbaV0sIG9ic2VydmVyKTsKICAgICAgICB9CiAgICAgIH0KICAg IH0KICB9IGVsc2UgewogICAgLy8gVGhlIG9iamVjdCBpcyBub3Qgb2JzZXJ2 YWJsZSwgc28ganVzdCByZW5kZXIgaXQgb3V0IGFuZAogICAgLy8gYmUgZG9u ZSB3aXRoIGl0LgogICAgZGF0YS5idWZmZXIucHVzaChoYW5kbGViYXJzR2V0 RXNjYXBlZChjdXJyZW50Q29udGV4dCwgcHJvcGVydHksIG9wdGlvbnMpKTsK ICB9Cn0KCkVtYmVySGFuZGxlYmFycy5iaW5kID0gYmluZDsKCmZ1bmN0aW9u IHNpbXBsZUJpbmQoY3VycmVudENvbnRleHQsIHByb3BlcnR5LCBvcHRpb25z KSB7CiAgdmFyIGRhdGEgPSBvcHRpb25zLmRhdGEsCiAgICAgIHZpZXcgPSBk YXRhLnZpZXcsCiAgICAgIG5vcm1hbGl6ZWQsIG9ic2VydmVyLCBwYXRoUm9v dCwgb3V0cHV0OwoKICBub3JtYWxpemVkID0gbm9ybWFsaXplUGF0aChjdXJy ZW50Q29udGV4dCwgcHJvcGVydHksIGRhdGEpOwogIHBhdGhSb290ID0gbm9y bWFsaXplZC5yb290OwoKICAvLyBTZXQgdXAgb2JzZXJ2ZXJzIGZvciBvYnNl cnZhYmxlIG9iamVjdHMKICBpZiAocGF0aFJvb3QgJiYgKCdvYmplY3QnID09 PSB0eXBlb2YgcGF0aFJvb3QpKSB7CiAgICBpZiAoZGF0YS5pbnNpZGVHcm91 cCkgewogICAgICBvYnNlcnZlciA9IGZ1bmN0aW9uKCkgewogICAgICAgIEVt YmVyLnJ1bi5vbmNlKHZpZXcsICdyZXJlbmRlcicpOwogICAgICB9OwoKICAg ICAgb3V0cHV0ID0gaGFuZGxlYmFyc0dldEVzY2FwZWQoY3VycmVudENvbnRl eHQsIHByb3BlcnR5LCBvcHRpb25zKTsKCiAgICAgIGRhdGEuYnVmZmVyLnB1 c2gob3V0cHV0KTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBiaW5kVmlldyA9 IG5ldyBFbWJlci5fU2ltcGxlSGFuZGxlYmFyc1ZpZXcoCiAgICAgICAgcHJv cGVydHksIGN1cnJlbnRDb250ZXh0LCAhb3B0aW9ucy5oYXNoLnVuZXNjYXBl ZCwgb3B0aW9ucy5kYXRhCiAgICAgICk7CgogICAgICBiaW5kVmlldy5fcGFy ZW50VmlldyA9IHZpZXc7CiAgICAgIHZpZXcuYXBwZW5kQ2hpbGQoYmluZFZp ZXcpOwoKICAgICAgb2JzZXJ2ZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICBF bWJlci5ydW4uc2NoZWR1bGVPbmNlKCdyZW5kZXInLCBiaW5kVmlldywgJ3Jl cmVuZGVyJyk7CiAgICAgIH07CiAgICB9CgogICAgLy8gT2JzZXJ2ZXMgdGhl IGdpdmVuIHByb3BlcnR5IG9uIHRoZSBjb250ZXh0IGFuZAogICAgLy8gdGVs bHMgdGhlIEVtYmVyLl9IYW5kbGViYXJzQm91bmRWaWV3IHRvIHJlLXJlbmRl ci4gSWYgcHJvcGVydHkKICAgIC8vIGlzIGFuIGVtcHR5IHN0cmluZywgd2Ug YXJlIHByaW50aW5nIHRoZSBjdXJyZW50IGNvbnRleHQKICAgIC8vIG9iamVj dCAoe3t0aGlzfX0pIHNvIHVwZGF0aW5nIGl0IGlzIG5vdCBvdXIgcmVzcG9u c2liaWxpdHkuCiAgICBpZiAobm9ybWFsaXplZC5wYXRoICE9PSAnJykgewog ICAgICB2aWV3LnJlZ2lzdGVyT2JzZXJ2ZXIobm9ybWFsaXplZC5yb290LCBu b3JtYWxpemVkLnBhdGgsIG9ic2VydmVyKTsKICAgIH0KICB9IGVsc2Ugewog ICAgLy8gVGhlIG9iamVjdCBpcyBub3Qgb2JzZXJ2YWJsZSwgc28ganVzdCBy ZW5kZXIgaXQgb3V0IGFuZAogICAgLy8gYmUgZG9uZSB3aXRoIGl0LgogICAg b3V0cHV0ID0gaGFuZGxlYmFyc0dldEVzY2FwZWQoY3VycmVudENvbnRleHQs IHByb3BlcnR5LCBvcHRpb25zKTsKICAgIGRhdGEuYnVmZmVyLnB1c2gob3V0 cHV0KTsKICB9Cn0KCmZ1bmN0aW9uIHNob3VsZERpc3BsYXlJZkhlbHBlckNv bnRlbnQocmVzdWx0KSB7CiAgdmFyIHRydXRoeSA9IHJlc3VsdCAmJiBnZXQo cmVzdWx0LCAnaXNUcnV0aHknKTsKICBpZiAodHlwZW9mIHRydXRoeSA9PT0g J2Jvb2xlYW4nKSB7IHJldHVybiB0cnV0aHk7IH0KCiAgaWYgKEVtYmVyLmlz QXJyYXkocmVzdWx0KSkgewogICAgcmV0dXJuIGdldChyZXN1bHQsICdsZW5n dGgnKSAhPT0gMDsKICB9IGVsc2UgewogICAgcmV0dXJuICEhcmVzdWx0Owog IH0KfQoKLyoqCiAgJ190cmlhZ2VNdXN0YWNoZScgaXMgdXNlZCBpbnRlcm5h bGx5IHNlbGVjdCBiZXR3ZWVuIGEgYmluZGluZywgaGVscGVyLCBvciBjb21w b25lbnQgZm9yCiAgdGhlIGdpdmVuIGNvbnRleHQuIFVudGlsIHRoaXMgcG9p bnQsIGl0IHdvdWxkIGJlIGhhcmQgdG8gZGV0ZXJtaW5lIGlmIHRoZQogIG11 c3RhY2hlIGlzIGEgcHJvcGVydHkgcmVmZXJlbmNlIG9yIGEgcmVndWxhciBo ZWxwZXIgcmVmZXJlbmNlLiBUaGlzIHRyaWFnZQogIGhlbHBlciByZXNvbHZl cyB0aGF0LgoKICBUaGlzIHdvdWxkIG5vdCBiZSB0eXBpY2FsbHkgaW52b2tl ZCBieSBkaXJlY3RseS4KCiAgQHByaXZhdGUKICBAbWV0aG9kIF90cmlhZ2VN dXN0YWNoZQogIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCiAgQHBh cmFtIHtTdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5L2hlbHBlcklEIHRvIHRy aWFnZQogIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIGhhc2ggb2YgdGVtcGxh dGUvcmVuZGVyaW5nIG9wdGlvbnMKICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwg c3RyaW5nCiovCkVtYmVySGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignX3Ry aWFnZU11c3RhY2hlJywgZnVuY3Rpb24ocHJvcGVydHksIG9wdGlvbnMpIHsK ICBFbWJlci5hc3NlcnQoIllvdSBjYW5ub3QgcGFzcyBtb3JlIHRoYW4gb25l IGFyZ3VtZW50IHRvIHRoZSBfdHJpYWdlTXVzdGFjaGUgaGVscGVyIiwgYXJn dW1lbnRzLmxlbmd0aCA8PSAyKTsKCiAgaWYgKGhlbHBlcnNbcHJvcGVydHld KSB7CiAgICByZXR1cm4gaGVscGVyc1twcm9wZXJ0eV0uY2FsbCh0aGlzLCBv cHRpb25zKTsKICB9CgogIHZhciBoZWxwZXIgPSBFbWJlci5IYW5kbGViYXJz LnJlc29sdmVIZWxwZXIob3B0aW9ucy5kYXRhLnZpZXcuY29udGFpbmVyLCBw cm9wZXJ0eSk7CiAgaWYgKGhlbHBlcikgewogICAgcmV0dXJuIGhlbHBlci5j YWxsKHRoaXMsIG9wdGlvbnMpOwogIH0KCiAgcmV0dXJuIGhlbHBlcnMuYmlu ZC5jYWxsKHRoaXMsIHByb3BlcnR5LCBvcHRpb25zKTsKfSk7CgpFbWJlci5I YW5kbGViYXJzLnJlc29sdmVIZWxwZXIgPSBmdW5jdGlvbihjb250YWluZXIs IG5hbWUpIHsKCiAgaWYgKCFjb250YWluZXIgfHwgbmFtZS5pbmRleE9mKCct JykgPT09IC0xKSB7CiAgICByZXR1cm47CiAgfQoKICB2YXIgaGVscGVyID0g Y29udGFpbmVyLmxvb2t1cCgnaGVscGVyOicgKyBuYW1lKTsKICBpZiAoIWhl bHBlcikgewogICAgdmFyIGNvbXBvbmVudExvb2t1cCA9IGNvbnRhaW5lci5s b29rdXAoJ2NvbXBvbmVudC1sb29rdXA6bWFpbicpOwogICAgRW1iZXIuYXNz ZXJ0KCJDb3VsZCBub3QgZmluZCAnY29tcG9uZW50LWxvb2t1cDptYWluJyBv biB0aGUgcHJvdmlkZWQgY29udGFpbmVyLCB3aGljaCBpcyBuZWNlc3Nhcnkg Zm9yIHBlcmZvcm1pbmcgY29tcG9uZW50IGxvb2t1cHMiLCBjb21wb25lbnRM b29rdXApOwoKICAgIHZhciBDb21wb25lbnQgPSBjb21wb25lbnRMb29rdXAu bG9va3VwRmFjdG9yeShuYW1lLCBjb250YWluZXIpOwogICAgaWYgKENvbXBv bmVudCkgewogICAgICBoZWxwZXIgPSBFbWJlckhhbmRsZWJhcnMubWFrZVZp ZXdIZWxwZXIoQ29tcG9uZW50KTsKICAgICAgY29udGFpbmVyLnJlZ2lzdGVy KCdoZWxwZXI6JyArIG5hbWUsIGhlbHBlcik7CiAgICB9CiAgfQogIHJldHVy biBoZWxwZXI7Cn07CgovKioKICBgYmluZGAgY2FuIGJlIHVzZWQgdG8gZGlz cGxheSBhIHZhbHVlLCB0aGVuIHVwZGF0ZSB0aGF0IHZhbHVlIGlmIGl0CiAg Y2hhbmdlcy4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8gcHJpbnQg dGhlIGB0aXRsZWAgcHJvcGVydHkgb2YKICBgY29udGVudGA6CgogIGBgYGhh bmRsZWJhcnMKICB7e2JpbmQgImNvbnRlbnQudGl0bGUifX0KICBgYGAKCiAg VGhpcyB3aWxsIHJldHVybiB0aGUgYHRpdGxlYCBwcm9wZXJ0eSBhcyBhIHN0 cmluZywgdGhlbiBjcmVhdGUgYSBuZXcgb2JzZXJ2ZXIKICBhdCB0aGUgc3Bl Y2lmaWVkIHBhdGguIElmIGl0IGNoYW5nZXMsIGl0IHdpbGwgdXBkYXRlIHRo ZSB2YWx1ZSBpbiBET00uIE5vdGUKICB0aGF0IGlmIHlvdSBuZWVkIHRvIHN1 cHBvcnQgSUU3IGFuZCBJRTggeW91IG11c3QgbW9kaWZ5IHRoZSBtb2RlbCBv YmplY3RzCiAgcHJvcGVydGllcyB1c2luZyBgRW1iZXIuZ2V0KClgIGFuZCBg RW1iZXIuc2V0KClgIGZvciB0aGlzIHRvIHdvcmsgYXMgaXQKICByZWxpZXMg b24gRW1iZXIncyBLVk8gc3lzdGVtLiBGb3IgYWxsIG90aGVyIGJyb3dzZXJz IHRoaXMgd2lsbCBiZSBoYW5kbGVkIGZvcgogIHlvdSBhdXRvbWF0aWNhbGx5 LgoKICBAcHJpdmF0ZQogIEBtZXRob2QgYmluZAogIEBmb3IgRW1iZXIuSGFu ZGxlYmFycy5oZWxwZXJzCiAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5IFBy b3BlcnR5IHRvIGJpbmQKICBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBDb250ZXh0 IHRvIHByb3ZpZGUgZm9yIHJlbmRlcmluZwogIEByZXR1cm4ge1N0cmluZ30g SFRNTCBzdHJpbmcKKi8KRW1iZXJIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVy KCdiaW5kJywgZnVuY3Rpb24gYmluZEhlbHBlcihwcm9wZXJ0eSwgb3B0aW9u cykgewogIEVtYmVyLmFzc2VydCgiWW91IGNhbm5vdCBwYXNzIG1vcmUgdGhh biBvbmUgYXJndW1lbnQgdG8gdGhlIGJpbmQgaGVscGVyIiwgYXJndW1lbnRz Lmxlbmd0aCA8PSAyKTsKCiAgdmFyIGNvbnRleHQgPSAob3B0aW9ucy5jb250 ZXh0cyAmJiBvcHRpb25zLmNvbnRleHRzLmxlbmd0aCkgPyBvcHRpb25zLmNv bnRleHRzWzBdIDogdGhpczsKCiAgaWYgKCFvcHRpb25zLmZuKSB7CiAgICBy ZXR1cm4gc2ltcGxlQmluZChjb250ZXh0LCBwcm9wZXJ0eSwgb3B0aW9ucyk7 CiAgfQoKICByZXR1cm4gYmluZC5jYWxsKGNvbnRleHQsIHByb3BlcnR5LCBv cHRpb25zLCBmYWxzZSwgZXhpc3RzKTsKfSk7CgovKioKICBVc2UgdGhlIGBi b3VuZElmYCBoZWxwZXIgdG8gY3JlYXRlIGEgY29uZGl0aW9uYWwgdGhhdCBy ZS1ldmFsdWF0ZXMKICB3aGVuZXZlciB0aGUgdHJ1dGhpbmVzcyBvZiB0aGUg Ym91bmQgdmFsdWUgY2hhbmdlcy4KCiAgYGBgaGFuZGxlYmFycwogIHt7I2Jv dW5kSWYgImNvbnRlbnQuc2hvdWxkRGlzcGxheVRpdGxlIn19CiAgICB7e2Nv bnRlbnQudGl0bGV9fQogIHt7L2JvdW5kSWZ9fQogIGBgYAoKICBAcHJpdmF0 ZQogIEBtZXRob2QgYm91bmRJZgogIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5o ZWxwZXJzCiAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRv IGJpbmQKICBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBDb250ZXh0IHRvIHByb3Zp ZGUgZm9yIHJlbmRlcmluZwogIEByZXR1cm4ge1N0cmluZ30gSFRNTCBzdHJp bmcKKi8KRW1iZXJIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdib3VuZElm JywgZnVuY3Rpb24gYm91bmRJZkhlbHBlcihwcm9wZXJ0eSwgZm4pIHsKICB2 YXIgY29udGV4dCA9IChmbi5jb250ZXh0cyAmJiBmbi5jb250ZXh0cy5sZW5n dGgpID8gZm4uY29udGV4dHNbMF0gOiB0aGlzOwoKICByZXR1cm4gYmluZC5j YWxsKGNvbnRleHQsIHByb3BlcnR5LCBmbiwgdHJ1ZSwgc2hvdWxkRGlzcGxh eUlmSGVscGVyQ29udGVudCwgc2hvdWxkRGlzcGxheUlmSGVscGVyQ29udGVu dCwgWydpc1RydXRoeScsICdsZW5ndGgnXSk7Cn0pOwoKCi8qKgogIEBwcml2 YXRlCgogIFVzZSB0aGUgYHVuYm91bmRJZmAgaGVscGVyIHRvIGNyZWF0ZSBh IGNvbmRpdGlvbmFsIHRoYXQgZXZhbHVhdGVzIG9uY2UuCgogIGBgYGhhbmRs ZWJhcnMKICB7eyN1bmJvdW5kSWYgImNvbnRlbnQuc2hvdWxkRGlzcGxheVRp dGxlIn19CiAgICB7e2NvbnRlbnQudGl0bGV9fQogIHt7L3VuYm91bmRJZn19 CiAgYGBgCgogIEBtZXRob2QgdW5ib3VuZElmCiAgQGZvciBFbWJlci5IYW5k bGViYXJzLmhlbHBlcnMKICBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgUHJv cGVydHkgdG8gYmluZAogIEBwYXJhbSB7RnVuY3Rpb259IGZuIENvbnRleHQg dG8gcHJvdmlkZSBmb3IgcmVuZGVyaW5nCiAgQHJldHVybiB7U3RyaW5nfSBI VE1MIHN0cmluZwoqLwpFbWJlckhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIo J3VuYm91bmRJZicsIGZ1bmN0aW9uIHVuYm91bmRJZkhlbHBlcihwcm9wZXJ0 eSwgZm4pIHsKICB2YXIgY29udGV4dCA9IChmbi5jb250ZXh0cyAmJiBmbi5j b250ZXh0cy5sZW5ndGgpID8gZm4uY29udGV4dHNbMF0gOiB0aGlzLAogICAg ICBkYXRhID0gZm4uZGF0YSwKICAgICAgdGVtcGxhdGUgPSBmbi5mbiwKICAg ICAgaW52ZXJzZSA9IGZuLmludmVyc2UsCiAgICAgIG5vcm1hbGl6ZWQsIHBy b3BlcnR5VmFsdWUsIHJlc3VsdDsKCiAgbm9ybWFsaXplZCA9IG5vcm1hbGl6 ZVBhdGgoY29udGV4dCwgcHJvcGVydHksIGRhdGEpOwogIHByb3BlcnR5VmFs dWUgPSBoYW5kbGViYXJzR2V0KGNvbnRleHQsIHByb3BlcnR5LCBmbik7Cgog IGlmICghc2hvdWxkRGlzcGxheUlmSGVscGVyQ29udGVudChwcm9wZXJ0eVZh bHVlKSkgewogICAgdGVtcGxhdGUgPSBpbnZlcnNlOwogIH0KCiAgdGVtcGxh dGUoY29udGV4dCwgeyBkYXRhOiBkYXRhIH0pOwp9KTsKCi8qKgogIFVzZSB0 aGUgYHt7d2l0aH19YCBoZWxwZXIgd2hlbiB5b3Ugd2FudCB0byBzY29wZSBj b250ZXh0LiBUYWtlIHRoZSBmb2xsb3dpbmcgY29kZSBhcyBhbiBleGFtcGxl OgoKICBgYGBoYW5kbGViYXJzCiAgPGg1Pnt7dXNlci5uYW1lfX08L2g1PgoK ICA8ZGl2IGNsYXNzPSJyb2xlIj4KICAgIDxoNj57e3VzZXIucm9sZS5sYWJl bH19PC9oNj4KICAgIDxzcGFuIGNsYXNzPSJyb2xlLWlkIj57e3VzZXIucm9s ZS5pZH19PC9zcGFuPgoKICAgIDxwIGNsYXNzPSJyb2xlLWRlc2MiPnt7dXNl ci5yb2xlLmRlc2NyaXB0aW9ufX08L3A+CiAgPC9kaXY+CiAgYGBgCgogIGB7 e3dpdGh9fWAgY2FuIGJlIG91ciBiZXN0IGZyaWVuZCBpbiB0aGVzZSBjYXNl cywgCiAgaW5zdGVhZCBvZiB3cml0aW5nIGB1c2VyLnJvbGUuKmAgb3ZlciBh bmQgb3Zlciwgd2UgdXNlIGB7eyN3aXRoIHVzZXIucm9sZX19YC4KICBOb3cg dGhlIGNvbnRleHQgd2l0aGluIHRoZSBge3sjd2l0aH19IC4uIHt7L3dpdGh9 fWAgYmxvY2sgaXMgYHVzZXIucm9sZWAgc28geW91IGNhbiBkbyB0aGUgZm9s bG93aW5nOgoKICBgYGBoYW5kbGViYXJzCiAgPGg1Pnt7dXNlci5uYW1lfX08 L2g1PgoKICA8ZGl2IGNsYXNzPSJyb2xlIj4KICAgIHt7I3dpdGggdXNlci5y b2xlfX0KICAgICAgPGg2Pnt7bGFiZWx9fTwvaDY+CiAgICAgIDxzcGFuIGNs YXNzPSJyb2xlLWlkIj57e2lkfX08L3NwYW4+CgogICAgICA8cCBjbGFzcz0i cm9sZS1kZXNjIj57e2Rlc2NyaXB0aW9ufX08L3A+CiAgICB7ey93aXRofX0K ICA8L2Rpdj4KICBgYGAKCiAgIyMjIGBhc2Agb3BlcmF0b3IKCiAgVGhpcyBv cGVyYXRvciBhbGlhc2VzIHRoZSBzY29wZSB0byBhIG5ldyBuYW1lLiBJdCdz IGhlbHBmdWwgZm9yIHNlbWFudGljIGNsYXJpdHkgYW5kIHRvIHJldGFpbiAK ICBkZWZhdWx0IHNjb3BlIG9yIHRvIHJlZmVyZW5jZSBmcm9tIGFub3RoZXIg YHt7d2l0aH19YCBibG9jay4KCiAgYGBgaGFuZGxlYmFycwogIC8vIHBvc3Rz IG1pZ2h0IG5vdCBiZQogIHt7I3dpdGggdXNlci5wb3N0cyBhcyBibG9nUG9z dHN9fQogICAgPGRpdiBjbGFzcz0ibm90aWNlIj4KICAgICAgVGhlcmUgYXJl IHt7YmxvZ1Bvc3RzLmxlbmd0aH19IGJsb2cgcG9zdHMgd3JpdHRlbiBieSB7 e3VzZXIubmFtZX19LgogICAgPC9kaXY+CgogICAge3sjZWFjaCBwb3N0IGlu IGJsb2dQb3N0c319CiAgICAgIDxsaT57e3Bvc3QudGl0bGV9fTwvbGk+CiAg ICB7ey9lYWNofX0KICB7ey93aXRofX0KICBgYGAKCiAgV2l0aG91dCB0aGUg YGFzYCBvcGVyYXRvciwgaXQgd291bGQgYmUgaW1wb3NzaWJsZSB0byByZWZl cmVuY2UgYHVzZXIubmFtZWAgaW4gdGhlIGV4YW1wbGUgYWJvdmUuCgogICMj IyBgY29udHJvbGxlcmAgb3B0aW9uCgogIEFkZGluZyBgY29udHJvbGxlcj0n c29tZXRoaW5nJ2AgaW5zdHJ1Y3RzIHRoZSBge3t3aXRofX1gIGhlbHBlciB0 byBjcmVhdGUgYW5kIHVzZSBhbiBpbnN0YW5jZSBvZgogIHRoZSBzcGVjaWZp ZWQgY29udHJvbGxlciB3aXRoIHRoZSBuZXcgY29udGV4dCBhcyBpdHMgY29u dGVudC4KCiAgVGhpcyBpcyB2ZXJ5IHNpbWlsYXIgdG8gdXNpbmcgYW4gYGl0 ZW1Db250cm9sbGVyYCBvcHRpb24gd2l0aCB0aGUgYHt7ZWFjaH19YCBoZWxw ZXIuCgogIGBgYGhhbmRsZWJhcnMKICB7eyN3aXRoIHVzZXJzLnBvc3RzIGNv bnRyb2xsZXI9J3VzZXJCbG9nUG9zdHMnfX0KICAgIHt7IS0gVGhlIGN1cnJl bnQgY29udGV4dCBpcyB3cmFwcGVkIGluIG91ciBjb250cm9sbGVyIGluc3Rh bmNlIH19CiAge3svd2l0aH19CiAgYGBgCgogIEluIHRoZSBhYm92ZSBleGFt cGxlLCB0aGUgdGVtcGxhdGUgcHJvdmlkZWQgdG8gdGhlIGB7e3dpdGh9fWAg YmxvY2sgaXMgbm93IHdyYXBwZWQgaW4gdGhlCiAgYHVzZXJCbG9nUG9zdGAg Y29udHJvbGxlciwgd2hpY2ggcHJvdmlkZXMgYSB2ZXJ5IGVsZWdhbnQgd2F5 IHRvIGRlY29yYXRlIHRoZSBjb250ZXh0IHdpdGggY3VzdG9tCiAgZnVuY3Rp b25zL3Byb3BlcnRpZXMuCgogIEBtZXRob2Qgd2l0aAogIEBmb3IgRW1iZXIu SGFuZGxlYmFycy5oZWxwZXJzCiAgQHBhcmFtIHtGdW5jdGlvbn0gY29udGV4 dAogIEBwYXJhbSB7SGFzaH0gb3B0aW9ucwogIEByZXR1cm4ge1N0cmluZ30g SFRNTCBzdHJpbmcKKi8KRW1iZXJIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVy KCd3aXRoJywgZnVuY3Rpb24gd2l0aEhlbHBlcihjb250ZXh0LCBvcHRpb25z KSB7CiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQpIHsKICAgIHZhciBr ZXl3b3JkTmFtZSwgcGF0aCwgcm9vdFBhdGgsIG5vcm1hbGl6ZWQsIGNvbnRl eHRQYXRoOwoKICAgIEVtYmVyLmFzc2VydCgiSWYgeW91IHBhc3MgbW9yZSB0 aGFuIG9uZSBhcmd1bWVudCB0byB0aGUgd2l0aCBoZWxwZXIsIGl0IG11c3Qg YmUgaW4gdGhlIGZvcm0gI3dpdGggZm9vIGFzIGJhciIsIGFyZ3VtZW50c1sx XSA9PT0gImFzIik7CiAgICBvcHRpb25zID0gYXJndW1lbnRzWzNdOwogICAg a2V5d29yZE5hbWUgPSBhcmd1bWVudHNbMl07CiAgICBwYXRoID0gYXJndW1l bnRzWzBdOwoKICAgIEVtYmVyLmFzc2VydCgiWW91IG11c3QgcGFzcyBhIGJs b2NrIHRvIHRoZSB3aXRoIGhlbHBlciIsIG9wdGlvbnMuZm4gJiYgb3B0aW9u cy5mbiAhPT0gSGFuZGxlYmFycy5WTS5ub29wKTsKCiAgICB2YXIgbG9jYWxp emVkT3B0aW9ucyA9IG9fY3JlYXRlKG9wdGlvbnMpOwogICAgbG9jYWxpemVk T3B0aW9ucy5kYXRhID0gb19jcmVhdGUob3B0aW9ucy5kYXRhKTsKICAgIGxv Y2FsaXplZE9wdGlvbnMuZGF0YS5rZXl3b3JkcyA9IG9fY3JlYXRlKG9wdGlv bnMuZGF0YS5rZXl3b3JkcyB8fCB7fSk7CgogICAgaWYgKEVtYmVyLmlzR2xv YmFsUGF0aChwYXRoKSkgewogICAgICBjb250ZXh0UGF0aCA9IHBhdGg7CiAg ICB9IGVsc2UgewogICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplUGF0aCh0 aGlzLCBwYXRoLCBvcHRpb25zLmRhdGEpOwogICAgICBwYXRoID0gbm9ybWFs aXplZC5wYXRoOwogICAgICByb290UGF0aCA9IG5vcm1hbGl6ZWQucm9vdDsK CiAgICAgIC8vIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciB0aGUgZmFjdCB0 aGF0IHlvdSBjYW5ub3QgYmluZCBzZXBhcmF0ZSBvYmplY3RzCiAgICAgIC8v IHRvZ2V0aGVyLiBXaGVuIHdlIGltcGxlbWVudCB0aGF0IGZ1bmN0aW9uYWxp dHksIHdlIHNob3VsZCB1c2UgaXQgaGVyZS4KICAgICAgdmFyIGNvbnRleHRL ZXkgPSBFbWJlci4kLmV4cGFuZG8gKyBFbWJlci5ndWlkRm9yKHJvb3RQYXRo KTsKICAgICAgbG9jYWxpemVkT3B0aW9ucy5kYXRhLmtleXdvcmRzW2NvbnRl eHRLZXldID0gcm9vdFBhdGg7CiAgICAgIC8vIGlmIHRoZSBwYXRoIGlzICcn ICgidGhpcyIpLCBqdXN0IGJpbmQgZGlyZWN0bHkgdG8gdGhlIGN1cnJlbnQg Y29udGV4dAogICAgICBjb250ZXh0UGF0aCA9IHBhdGggPyBjb250ZXh0S2V5 ICsgJy4nICsgcGF0aCA6IGNvbnRleHRLZXk7CiAgICB9CgogICAgRW1iZXIu YmluZChsb2NhbGl6ZWRPcHRpb25zLmRhdGEua2V5d29yZHMsIGtleXdvcmRO YW1lLCBjb250ZXh0UGF0aCk7CgogICAgcmV0dXJuIGJpbmQuY2FsbCh0aGlz LCBwYXRoLCBsb2NhbGl6ZWRPcHRpb25zLCB0cnVlLCBleGlzdHMpOwogIH0g ZWxzZSB7CiAgICBFbWJlci5hc3NlcnQoIllvdSBtdXN0IHBhc3MgZXhhY3Rs eSBvbmUgYXJndW1lbnQgdG8gdGhlIHdpdGggaGVscGVyIiwgYXJndW1lbnRz Lmxlbmd0aCA9PT0gMik7CiAgICBFbWJlci5hc3NlcnQoIllvdSBtdXN0IHBh c3MgYSBibG9jayB0byB0aGUgd2l0aCBoZWxwZXIiLCBvcHRpb25zLmZuICYm IG9wdGlvbnMuZm4gIT09IEhhbmRsZWJhcnMuVk0ubm9vcCk7CiAgICByZXR1 cm4gaGVscGVycy5iaW5kLmNhbGwob3B0aW9ucy5jb250ZXh0c1swXSwgY29u dGV4dCwgb3B0aW9ucyk7CiAgfQp9KTsKCgovKioKICBTZWUgW2JvdW5kSWZd KC9hcGkvY2xhc3Nlcy9FbWJlci5IYW5kbGViYXJzLmhlbHBlcnMuaHRtbCNt ZXRob2RfYm91bmRJZikKICBhbmQgW3VuYm91bmRJZl0oL2FwaS9jbGFzc2Vz L0VtYmVyLkhhbmRsZWJhcnMuaGVscGVycy5odG1sI21ldGhvZF91bmJvdW5k SWYpCgogIEBtZXRob2QgaWYKICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVs cGVycwogIEBwYXJhbSB7RnVuY3Rpb259IGNvbnRleHQKICBAcGFyYW0ge0hh c2h9IG9wdGlvbnMKICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgc3RyaW5nCiov CkVtYmVySGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignaWYnLCBmdW5jdGlv biBpZkhlbHBlcihjb250ZXh0LCBvcHRpb25zKSB7CiAgRW1iZXIuYXNzZXJ0 KCJZb3UgbXVzdCBwYXNzIGV4YWN0bHkgb25lIGFyZ3VtZW50IHRvIHRoZSBp ZiBoZWxwZXIiLCBhcmd1bWVudHMubGVuZ3RoID09PSAyKTsKICBFbWJlci5h c3NlcnQoIllvdSBtdXN0IHBhc3MgYSBibG9jayB0byB0aGUgaWYgaGVscGVy Iiwgb3B0aW9ucy5mbiAmJiBvcHRpb25zLmZuICE9PSBIYW5kbGViYXJzLlZN Lm5vb3ApOwogIGlmIChvcHRpb25zLmRhdGEuaXNVbmJvdW5kKSB7CiAgICBy ZXR1cm4gaGVscGVycy51bmJvdW5kSWYuY2FsbChvcHRpb25zLmNvbnRleHRz WzBdLCBjb250ZXh0LCBvcHRpb25zKTsKICB9IGVsc2UgewogICAgcmV0dXJu IGhlbHBlcnMuYm91bmRJZi5jYWxsKG9wdGlvbnMuY29udGV4dHNbMF0sIGNv bnRleHQsIG9wdGlvbnMpOwogIH0KfSk7CgovKioKICBAbWV0aG9kIHVubGVz cwogIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCiAgQHBhcmFtIHtG dW5jdGlvbn0gY29udGV4dAogIEBwYXJhbSB7SGFzaH0gb3B0aW9ucwogIEBy ZXR1cm4ge1N0cmluZ30gSFRNTCBzdHJpbmcKKi8KRW1iZXJIYW5kbGViYXJz LnJlZ2lzdGVySGVscGVyKCd1bmxlc3MnLCBmdW5jdGlvbiB1bmxlc3NIZWxw ZXIoY29udGV4dCwgb3B0aW9ucykgewogIEVtYmVyLmFzc2VydCgiWW91IG11 c3QgcGFzcyBleGFjdGx5IG9uZSBhcmd1bWVudCB0byB0aGUgdW5sZXNzIGhl bHBlciIsIGFyZ3VtZW50cy5sZW5ndGggPT09IDIpOwogIEVtYmVyLmFzc2Vy dCgiWW91IG11c3QgcGFzcyBhIGJsb2NrIHRvIHRoZSB1bmxlc3MgaGVscGVy Iiwgb3B0aW9ucy5mbiAmJiBvcHRpb25zLmZuICE9PSBIYW5kbGViYXJzLlZN Lm5vb3ApOwoKICB2YXIgZm4gPSBvcHRpb25zLmZuLCBpbnZlcnNlID0gb3B0 aW9ucy5pbnZlcnNlOwoKICBvcHRpb25zLmZuID0gaW52ZXJzZTsKICBvcHRp b25zLmludmVyc2UgPSBmbjsKCiAgaWYgKG9wdGlvbnMuZGF0YS5pc1VuYm91 bmQpIHsKICAgIHJldHVybiBoZWxwZXJzLnVuYm91bmRJZi5jYWxsKG9wdGlv bnMuY29udGV4dHNbMF0sIGNvbnRleHQsIG9wdGlvbnMpOwogIH0gZWxzZSB7 CiAgICByZXR1cm4gaGVscGVycy5ib3VuZElmLmNhbGwob3B0aW9ucy5jb250 ZXh0c1swXSwgY29udGV4dCwgb3B0aW9ucyk7CiAgfQp9KTsKCi8qKgogIGBi aW5kLWF0dHJgIGFsbG93cyB5b3UgdG8gY3JlYXRlIGEgYmluZGluZyBiZXR3 ZWVuIERPTSBlbGVtZW50IGF0dHJpYnV0ZXMgYW5kCiAgRW1iZXIgb2JqZWN0 cy4gRm9yIGV4YW1wbGU6CgogIGBgYGhhbmRsZWJhcnMKICA8aW1nIHt7Ymlu ZC1hdHRyIHNyYz0iaW1hZ2VVcmwiIGFsdD0iaW1hZ2VUaXRsZSJ9fT4KICBg YGAKCiAgVGhlIGFib3ZlIGhhbmRsZWJhcnMgdGVtcGxhdGUgd2lsbCBmaWxs IHRoZSBgPGltZz5gJ3MgYHNyY2AgYXR0cmlidXRlIHdpbGwKICB0aGUgdmFs dWUgb2YgdGhlIHByb3BlcnR5IHJlZmVyZW5jZWQgd2l0aCBgImltYWdlVXJs ImAgYW5kIGl0cyBgYWx0YAogIGF0dHJpYnV0ZSB3aXRoIHRoZSB2YWx1ZSBv ZiB0aGUgcHJvcGVydHkgcmVmZXJlbmNlZCB3aXRoIGAiaW1hZ2VUaXRsZSJg LgoKICBJZiB0aGUgcmVuZGVyaW5nIGNvbnRleHQgb2YgdGhpcyB0ZW1wbGF0 ZSBpcyB0aGUgZm9sbG93aW5nIG9iamVjdDoKCiAgYGBgamF2YXNjcmlwdAog IHsKICAgIGltYWdlVXJsOiAnaHR0cDovL2xvbGNhdHMuaW5mby9oYXotYS1m dW5ueScsCiAgICBpbWFnZVRpdGxlOiAnQSBodW1vcm91cyBpbWFnZSBvZiBh IGNhdCcKICB9CiAgYGBgCgogIFRoZSByZXN1bHRpbmcgSFRNTCBvdXRwdXQg d2lsbCBiZToKCiAgYGBgaHRtbAogIDxpbWcgc3JjPSJodHRwOi8vbG9sY2F0 cy5pbmZvL2hhei1hLWZ1bm55IiBhbHQ9IkEgaHVtb3JvdXMgaW1hZ2Ugb2Yg YSBjYXQiPgogIGBgYAoKICBgYmluZC1hdHRyYCBjYW5ub3QgcmVkZWNsYXJl IGV4aXN0aW5nIERPTSBlbGVtZW50IGF0dHJpYnV0ZXMuIFRoZSB1c2Ugb2Yg YHNyY2AKICBpbiB0aGUgZm9sbG93aW5nIGBiaW5kLWF0dHJgIGV4YW1wbGUg d2lsbCBiZSBpZ25vcmVkIGFuZCB0aGUgaGFyZCBjb2RlZCB2YWx1ZQogIG9m IGBzcmM9Ii9mYWlsd2hhbGUuZ2lmImAgd2lsbCB0YWtlIHByZWNlZGVuY2U6 CgogIGBgYGhhbmRsZWJhcnMKICA8aW1nIHNyYz0iL2ZhaWx3aGFsZS5naWYi IHt7YmluZC1hdHRyIHNyYz0iaW1hZ2VVcmwiIGFsdD0iaW1hZ2VUaXRsZSJ9 fT4KICBgYGAKCiAgIyMjIGBiaW5kLWF0dHJgIGFuZCB0aGUgYGNsYXNzYCBh dHRyaWJ1dGUKCiAgYGJpbmQtYXR0cmAgc3VwcG9ydHMgYSBzcGVjaWFsIHN5 bnRheCBmb3IgaGFuZGxpbmcgYSBudW1iZXIgb2YgY2FzZXMgdW5pcXVlCiAg dG8gdGhlIGBjbGFzc2AgRE9NIGVsZW1lbnQgYXR0cmlidXRlLiBUaGUgYGNs YXNzYCBhdHRyaWJ1dGUgY29tYmluZXMKICBtdWx0aXBsZSBkaXNjcmV0ZSB2 YWx1ZXMgaW50byBhIHNpbmdsZSBhdHRyaWJ1dGUgYXMgYSBzcGFjZS1kZWxp bWl0ZWQKICBsaXN0IG9mIHN0cmluZ3MuIEVhY2ggc3RyaW5nIGNhbiBiZToK CiAgKiBhIHN0cmluZyByZXR1cm4gdmFsdWUgb2YgYW4gb2JqZWN0J3MgcHJv cGVydHkuCiAgKiBhIGJvb2xlYW4gcmV0dXJuIHZhbHVlIG9mIGFuIG9iamVj dCdzIHByb3BlcnR5CiAgKiBhIGhhcmQtY29kZWQgdmFsdWUKCiAgQSBzdHJp bmcgcmV0dXJuIHZhbHVlIHdvcmtzIGlkZW50aWNhbGx5IHRvIG90aGVyIHVz ZXMgb2YgYGJpbmQtYXR0cmAuIFRoZQogIHJldHVybiB2YWx1ZSBvZiB0aGUg cHJvcGVydHkgd2lsbCBiZWNvbWUgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1 dGUuIEZvcgogIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgdmlldyBhbmQgdGVt cGxhdGU6CgogIGBgYGphdmFzY3JpcHQKICAgIEFWaWV3ID0gRW1iZXIuVmll dy5leHRlbmQoewogICAgICBzb21lUHJvcGVydHk6IGZ1bmN0aW9uKCkgewog ICAgICAgIHJldHVybiAiYVZhbHVlIjsKICAgICAgfS5wcm9wZXJ0eSgpCiAg ICB9KQogIGBgYAoKICBgYGBoYW5kbGViYXJzCiAgPGltZyB7e2JpbmQtYXR0 ciBjbGFzcz0idmlldy5zb21lUHJvcGVydHl9fT4KICBgYGAKCiAgUmVzdWx0 IGluIHRoZSBmb2xsb3dpbmcgcmVuZGVyZWQgb3V0cHV0OgoKICBgYGBodG1s CiAgPGltZyBjbGFzcz0iYVZhbHVlIj4KICBgYGAKCiAgQSBib29sZWFuIHJl dHVybiB2YWx1ZSB3aWxsIGluc2VydCBhIHNwZWNpZmllZCBjbGFzcyBuYW1l IGlmIHRoZSBwcm9wZXJ0eQogIHJldHVybnMgYHRydWVgIGFuZCByZW1vdmUg dGhlIGNsYXNzIG5hbWUgaWYgdGhlIHByb3BlcnR5IHJldHVybnMgYGZhbHNl YC4KCiAgQSBjbGFzcyBuYW1lIGlzIHByb3ZpZGVkIHZpYSB0aGUgc3ludGF4 CiAgYHNvbWVQcm9wZXJ0eU5hbWU6Y2xhc3MtbmFtZS1pZi10cnVlYC4KCiAg YGBgamF2YXNjcmlwdAogIEFWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoewog ICAgc29tZUJvb2w6IHRydWUKICB9KQogIGBgYAoKICBgYGBoYW5kbGViYXJz CiAgPGltZyB7e2JpbmQtYXR0ciBjbGFzcz0idmlldy5zb21lQm9vbDpjbGFz cy1uYW1lLWlmLXRydWUifX0+CiAgYGBgCgogIFJlc3VsdCBpbiB0aGUgZm9s bG93aW5nIHJlbmRlcmVkIG91dHB1dDoKCiAgYGBgaHRtbAogIDxpbWcgY2xh c3M9ImNsYXNzLW5hbWUtaWYtdHJ1ZSI+CiAgYGBgCgogIEFuIGFkZGl0aW9u YWwgc2VjdGlvbiBvZiB0aGUgYmluZGluZyBjYW4gYmUgcHJvdmlkZWQgaWYg eW91IHdhbnQgdG8KICByZXBsYWNlIHRoZSBleGlzdGluZyBjbGFzcyBpbnN0 ZWFkIG9mIHJlbW92aW5nIGl0IHdoZW4gdGhlIGJvb2xlYW4KICB2YWx1ZSBj aGFuZ2VzOgoKICBgYGBoYW5kbGViYXJzCiAgPGltZyB7e2JpbmQtYXR0ciBj bGFzcz0idmlldy5zb21lQm9vbDpjbGFzcy1uYW1lLWlmLXRydWU6Y2xhc3Mt bmFtZS1pZi1mYWxzZSJ9fT4KICBgYGAKCiAgQSBoYXJkLWNvZGVkIHZhbHVl IGNhbiBiZSB1c2VkIGJ5IHByZXBlbmRpbmcgYDpgIHRvIHRoZSBkZXNpcmVk CiAgY2xhc3MgbmFtZTogYDpjbGFzcy1uYW1lLXRvLWFsd2F5cy1hcHBseWAu CgogIGBgYGhhbmRsZWJhcnMKICA8aW1nIHt7YmluZC1hdHRyIGNsYXNzPSI6 Y2xhc3MtbmFtZS10by1hbHdheXMtYXBwbHkifX0+CiAgYGBgCgogIFJlc3Vs dHMgaW4gdGhlIGZvbGxvd2luZyByZW5kZXJlZCBvdXRwdXQ6CgogIGBgYGh0 bWwKICA8aW1nIGNsYXNzPSJjbGFzcy1uYW1lLXRvLWFsd2F5cy1hcHBseSI+ CiAgYGBgCgogIEFsbCB0aHJlZSBzdHJhdGVnaWVzIC0gc3RyaW5nIHJldHVy biB2YWx1ZSwgYm9vbGVhbiByZXR1cm4gdmFsdWUsIGFuZAogIGhhcmQtY29k ZWQgdmFsdWUg4oCTIGNhbiBiZSBjb21iaW5lZCBpbiBhIHNpbmdsZSBkZWNs YXJhdGlvbjoKCiAgYGBgaGFuZGxlYmFycwogIDxpbWcge3tiaW5kLWF0dHIg Y2xhc3M9IjpjbGFzcy1uYW1lLXRvLWFsd2F5cy1hcHBseSB2aWV3LnNvbWVC b29sOmNsYXNzLW5hbWUtaWYtdHJ1ZSB2aWV3LnNvbWVQcm9wZXJ0eSJ9fT4K ICBgYGAKCiAgQG1ldGhvZCBiaW5kLWF0dHIKICBAZm9yIEVtYmVyLkhhbmRs ZWJhcnMuaGVscGVycwogIEBwYXJhbSB7SGFzaH0gb3B0aW9ucwogIEByZXR1 cm4ge1N0cmluZ30gSFRNTCBzdHJpbmcKKi8KRW1iZXJIYW5kbGViYXJzLnJl Z2lzdGVySGVscGVyKCdiaW5kLWF0dHInLCBmdW5jdGlvbiBiaW5kQXR0ckhl bHBlcihvcHRpb25zKSB7CgogIHZhciBhdHRycyA9IG9wdGlvbnMuaGFzaDsK CiAgRW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9u ZSBoYXNoIGFyZ3VtZW50IHRvIGJpbmQtYXR0ciIsICEhRW1iZXIua2V5cyhh dHRycykubGVuZ3RoKTsKCiAgdmFyIHZpZXcgPSBvcHRpb25zLmRhdGEudmll dzsKICB2YXIgcmV0ID0gW107CiAgdmFyIGN0eCA9IHRoaXM7CgogIC8vIEdl bmVyYXRlIGEgdW5pcXVlIGlkIGZvciB0aGlzIGVsZW1lbnQuIFRoaXMgd2ls bCBiZSBhZGRlZCBhcyBhCiAgLy8gZGF0YSBhdHRyaWJ1dGUgdG8gdGhlIGVs ZW1lbnQgc28gaXQgY2FuIGJlIGxvb2tlZCB1cCB3aGVuCiAgLy8gdGhlIGJv dW5kIHByb3BlcnR5IGNoYW5nZXMuCiAgdmFyIGRhdGFJZCA9ICsrRW1iZXIu dXVpZDsKCiAgLy8gSGFuZGxlIGNsYXNzZXMgZGlmZmVyZW50bHksIGFzIHdl IGNhbiBiaW5kIG11bHRpcGxlIGNsYXNzZXMKICB2YXIgY2xhc3NCaW5kaW5n cyA9IGF0dHJzWydjbGFzcyddOwogIGlmIChjbGFzc0JpbmRpbmdzICE9IG51 bGwpIHsKICAgIHZhciBjbGFzc1Jlc3VsdHMgPSBFbWJlckhhbmRsZWJhcnMu YmluZENsYXNzZXModGhpcywgY2xhc3NCaW5kaW5ncywgdmlldywgZGF0YUlk LCBvcHRpb25zKTsKCiAgICByZXQucHVzaCgnY2xhc3M9IicgKyBIYW5kbGVi YXJzLlV0aWxzLmVzY2FwZUV4cHJlc3Npb24oY2xhc3NSZXN1bHRzLmpvaW4o JyAnKSkgKyAnIicpOwogICAgZGVsZXRlIGF0dHJzWydjbGFzcyddOwogIH0K CiAgdmFyIGF0dHJLZXlzID0gRW1iZXIua2V5cyhhdHRycyk7CgogIC8vIEZv ciBlYWNoIGF0dHJpYnV0ZSBwYXNzZWQsIGNyZWF0ZSBhbiBvYnNlcnZlciBh bmQgZW1pdCB0aGUKICAvLyBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcm9wZXJ0 eSBhcyBhbiBhdHRyaWJ1dGUuCiAgZm9yRWFjaC5jYWxsKGF0dHJLZXlzLCBm dW5jdGlvbihhdHRyKSB7CiAgICB2YXIgcGF0aCA9IGF0dHJzW2F0dHJdLAog ICAgICAgIG5vcm1hbGl6ZWQ7CgogICAgRW1iZXIuYXNzZXJ0KGZtdCgiWW91 IG11c3QgcHJvdmlkZSBhbiBleHByZXNzaW9uIGFzIHRoZSB2YWx1ZSBvZiBi b3VuZCBhdHRyaWJ1dGUuIFlvdSBzcGVjaWZpZWQ6ICVAPSVAIiwgW2F0dHIs IHBhdGhdKSwgdHlwZW9mIHBhdGggPT09ICdzdHJpbmcnKTsKCiAgICBub3Jt YWxpemVkID0gbm9ybWFsaXplUGF0aChjdHgsIHBhdGgsIG9wdGlvbnMuZGF0 YSk7CgogICAgdmFyIHZhbHVlID0gKHBhdGggPT09ICd0aGlzJykgPyBub3Jt YWxpemVkLnJvb3QgOiBoYW5kbGViYXJzR2V0KGN0eCwgcGF0aCwgb3B0aW9u cyksCiAgICAgICAgdHlwZSA9IEVtYmVyLnR5cGVPZih2YWx1ZSk7CgogICAg RW1iZXIuYXNzZXJ0KGZtdCgiQXR0cmlidXRlcyBtdXN0IGJlIG51bWJlcnMs IHN0cmluZ3Mgb3IgYm9vbGVhbnMsIG5vdCAlQCIsIFt2YWx1ZV0pLCB2YWx1 ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGUgPT09 ICdudW1iZXInIHx8IHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGUgPT09ICdi b29sZWFuJyk7CgogICAgdmFyIG9ic2VydmVyLCBpbnZva2VyOwoKICAgIG9i c2VydmVyID0gZnVuY3Rpb24gb2JzZXJ2ZXIoKSB7CiAgICAgIHZhciByZXN1 bHQgPSBoYW5kbGViYXJzR2V0KGN0eCwgcGF0aCwgb3B0aW9ucyk7CgogICAg ICBFbWJlci5hc3NlcnQoZm10KCJBdHRyaWJ1dGVzIG11c3QgYmUgbnVtYmVy cywgc3RyaW5ncyBvciBib29sZWFucywgbm90ICVAIiwgW3Jlc3VsdF0pLAog ICAgICAgICAgICAgICAgICAgcmVzdWx0ID09PSBudWxsIHx8IHJlc3VsdCA9 PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiByZXN1bHQgPT09ICdudW1iZXInIHx8 CiAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiByZXN1bHQgPT09ICdzdHJp bmcnIHx8IHR5cGVvZiByZXN1bHQgPT09ICdib29sZWFuJyk7CgogICAgICB2 YXIgZWxlbSA9IHZpZXcuJCgiW2RhdGEtYmluZGF0dHItIiArIGRhdGFJZCAr ICI9JyIgKyBkYXRhSWQgKyAiJ10iKTsKCiAgICAgIC8vIElmIHdlIGFyZW4n dCBhYmxlIHRvIGZpbmQgdGhlIGVsZW1lbnQsIGl0IG1lYW5zIHRoZSBlbGVt ZW50CiAgICAgIC8vIHRvIHdoaWNoIHdlIHdlcmUgYm91bmQgaGFzIGJlZW4g cmVtb3ZlZCBmcm9tIHRoZSB2aWV3LgogICAgICAvLyBJbiB0aGF0IGNhc2Us IHdlIGNhbiBhc3N1bWUgdGhlIHRlbXBsYXRlIGhhcyBiZWVuIHJlLXJlbmRl cmVkCiAgICAgIC8vIGFuZCB3ZSBuZWVkIHRvIGNsZWFuIHVwIHRoZSBvYnNl cnZlci4KICAgICAgaWYgKCFlbGVtIHx8IGVsZW0ubGVuZ3RoID09PSAwKSB7 CiAgICAgICAgRW1iZXIucmVtb3ZlT2JzZXJ2ZXIobm9ybWFsaXplZC5yb290 LCBub3JtYWxpemVkLnBhdGgsIGludm9rZXIpOwogICAgICAgIHJldHVybjsK ICAgICAgfQoKICAgICAgRW1iZXIuVmlldy5hcHBseUF0dHJpYnV0ZUJpbmRp bmdzKGVsZW0sIGF0dHIsIHJlc3VsdCk7CiAgICB9OwoKICAgIC8vIEFkZCBh biBvYnNlcnZlciB0byB0aGUgdmlldyBmb3Igd2hlbiB0aGUgcHJvcGVydHkg Y2hhbmdlcy4KICAgIC8vIFdoZW4gdGhlIG9ic2VydmVyIGZpcmVzLCBmaW5k IHRoZSBlbGVtZW50IHVzaW5nIHRoZQogICAgLy8gdW5pcXVlIGRhdGEgaWQg YW5kIHVwZGF0ZSB0aGUgYXR0cmlidXRlIHRvIHRoZSBuZXcgdmFsdWUuCiAg ICAvLyBOb3RlOiBkb24ndCBhZGQgb2JzZXJ2ZXIgd2hlbiBwYXRoIGlzICd0 aGlzJyBvciBwYXRoCiAgICAvLyBpcyB3aG9sZSBrZXl3b3JkIGUuZy4ge3sj ZWFjaCB4IGluIGxpc3R9fSAuLi4ge3tiaW5kLWF0dHIgYXR0cj0ieCJ9fQog ICAgaWYgKHBhdGggIT09ICd0aGlzJyAmJiAhKG5vcm1hbGl6ZWQuaXNLZXl3 b3JkICYmIG5vcm1hbGl6ZWQucGF0aCA9PT0gJycgKSkgewogICAgICB2aWV3 LnJlZ2lzdGVyT2JzZXJ2ZXIobm9ybWFsaXplZC5yb290LCBub3JtYWxpemVk LnBhdGgsIG9ic2VydmVyKTsKICAgIH0KCiAgICAvLyBpZiB0aGlzIGNoYW5n ZXMsIGFsc28gY2hhbmdlIHRoZSBsb2dpYyBpbiBlbWJlci12aWV3cy9saWIv dmlld3Mvdmlldy5qcwogICAgaWYgKCh0eXBlID09PSAnc3RyaW5nJyB8fCAo dHlwZSA9PT0gJ251bWJlcicgJiYgIWlzTmFOKHZhbHVlKSkpKSB7CiAgICAg IHJldC5wdXNoKGF0dHIgKyAnPSInICsgSGFuZGxlYmFycy5VdGlscy5lc2Nh cGVFeHByZXNzaW9uKHZhbHVlKSArICciJyk7CiAgICB9IGVsc2UgaWYgKHZh bHVlICYmIHR5cGUgPT09ICdib29sZWFuJykgewogICAgICAvLyBUaGUgZGV2 ZWxvcGVyIGNvbnRyb2xzIHRoZSBhdHRyIG5hbWUsIHNvIGl0IHNob3VsZCBh bHdheXMgYmUgc2FmZQogICAgICByZXQucHVzaChhdHRyICsgJz0iJyArIGF0 dHIgKyAnIicpOwogICAgfQogIH0sIHRoaXMpOwoKICAvLyBBZGQgdGhlIHVu aXF1ZSBpZGVudGlmaWVyCiAgLy8gTk9URTogV2UgdXNlIGFsbCBsb3dlci1j YXNlIHNpbmNlIEZpcmVmb3ggaGFzIHByb2JsZW1zIHdpdGggbWl4ZWQgY2Fz ZSBpbiBTVkcKICByZXQucHVzaCgnZGF0YS1iaW5kYXR0ci0nICsgZGF0YUlk ICsgJz0iJyArIGRhdGFJZCArICciJyk7CiAgcmV0dXJuIG5ldyBFbWJlckhh bmRsZWJhcnMuU2FmZVN0cmluZyhyZXQuam9pbignICcpKTsKfSk7CgovKioK ICBTZWUgYGJpbmQtYXR0cmAKCiAgQG1ldGhvZCBiaW5kQXR0cgogIEBmb3Ig RW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCiAgQGRlcHJlY2F0ZWQKICBAcGFy YW0ge0Z1bmN0aW9ufSBjb250ZXh0CiAgQHBhcmFtIHtIYXNofSBvcHRpb25z CiAgQHJldHVybiB7U3RyaW5nfSBIVE1MIHN0cmluZwoqLwpFbWJlckhhbmRs ZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2JpbmRBdHRyJywgZnVuY3Rpb24gYmlu ZEF0dHJIZWxwZXIoKSB7CiAgRW1iZXIud2FybigiVGhlICdiaW5kQXR0cicg dmlldyBoZWxwZXIgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiAnYmluZC1h dHRyJyIpOwogIHJldHVybiBFbWJlckhhbmRsZWJhcnMuaGVscGVyc1snYmlu ZC1hdHRyJ10uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKfSk7CgovKioKICBI ZWxwZXIgdGhhdCwgZ2l2ZW4gYSBzcGFjZS1zZXBhcmF0ZWQgc3RyaW5nIG9m IHByb3BlcnR5IHBhdGhzIGFuZCBhIGNvbnRleHQsCiAgcmV0dXJucyBhbiBh cnJheSBvZiBjbGFzcyBuYW1lcy4gQ2FsbGluZyB0aGlzIG1ldGhvZCBhbHNv IGhhcyB0aGUgc2lkZQogIGVmZmVjdCBvZiBzZXR0aW5nIHVwIG9ic2VydmVy cyBhdCB0aG9zZSBwcm9wZXJ0eSBwYXRocywgc3VjaCB0aGF0IGlmIHRoZXkK ICBjaGFuZ2UsIHRoZSBjb3JyZWN0IGNsYXNzIG5hbWUgd2lsbCBiZSByZWFw cGxpZWQgdG8gdGhlIERPTSBlbGVtZW50LgoKICBGb3IgZXhhbXBsZSwgaWYg eW91IHBhc3MgdGhlIHN0cmluZyAiZm9vQmFyIiwgaXQgd2lsbCBmaXJzdCBs b29rIHVwIHRoZQogICJmb29CYXIiIHZhbHVlIG9mIHRoZSBjb250ZXh0LiBJ ZiB0aGF0IHZhbHVlIGlzIHRydWUsIGl0IHdpbGwgYWRkIHRoZQogICJmb28t YmFyIiBjbGFzcyB0byB0aGUgY3VycmVudCBlbGVtZW50IChpLmUuLCB0aGUg ZGFzaGVyaXplZCBmb3JtIG9mCiAgImZvb0JhciIpLiBJZiB0aGUgdmFsdWUg aXMgYSBzdHJpbmcsIGl0IHdpbGwgYWRkIHRoYXQgc3RyaW5nIGFzIHRoZSBj bGFzcy4KICBPdGhlcndpc2UsIGl0IHdpbGwgbm90IGFkZCBhbnkgbmV3IGNs YXNzIG5hbWUuCgogIEBwcml2YXRlCiAgQG1ldGhvZCBiaW5kQ2xhc3Nlcwog IEBmb3IgRW1iZXIuSGFuZGxlYmFycwogIEBwYXJhbSB7RW1iZXIuT2JqZWN0 fSBjb250ZXh0IFRoZSBjb250ZXh0IGZyb20gd2hpY2ggdG8gbG9va3VwIHBy b3BlcnRpZXMKICBAcGFyYW0ge1N0cmluZ30gY2xhc3NCaW5kaW5ncyBBIHN0 cmluZywgc3BhY2Utc2VwYXJhdGVkLCBvZiBjbGFzcyBiaW5kaW5ncwogICAg dG8gdXNlCiAgQHBhcmFtIHtFbWJlci5WaWV3fSB2aWV3IFRoZSB2aWV3IGlu IHdoaWNoIG9ic2VydmVycyBzaG91bGQgbG9vayBmb3IgdGhlCiAgICBlbGVt ZW50IHRvIHVwZGF0ZQogIEBwYXJhbSB7U3J0aW5nfSBiaW5kQXR0cklkIE9w dGlvbmFsIGJpbmRBdHRyIGlkIHVzZWQgdG8gbG9va3VwIGVsZW1lbnRzCiAg QHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIGNsYXNzIG5hbWVzIHRvIGFk ZAoqLwpFbWJlckhhbmRsZWJhcnMuYmluZENsYXNzZXMgPSBmdW5jdGlvbihj b250ZXh0LCBjbGFzc0JpbmRpbmdzLCB2aWV3LCBiaW5kQXR0cklkLCBvcHRp b25zKSB7CiAgdmFyIHJldCA9IFtdLCBuZXdDbGFzcywgdmFsdWUsIGVsZW07 CgogIC8vIEhlbHBlciBtZXRob2QgdG8gcmV0cmlldmUgdGhlIHByb3BlcnR5 IGZyb20gdGhlIGNvbnRleHQgYW5kCiAgLy8gZGV0ZXJtaW5lIHdoaWNoIGNs YXNzIHN0cmluZyB0byByZXR1cm4sIGJhc2VkIG9uIHdoZXRoZXIgaXQgaXMK ICAvLyBhIEJvb2xlYW4gb3Igbm90LgogIHZhciBjbGFzc1N0cmluZ0ZvclBh dGggPSBmdW5jdGlvbihyb290LCBwYXJzZWRQYXRoLCBvcHRpb25zKSB7CiAg ICB2YXIgdmFsLAogICAgICAgIHBhdGggPSBwYXJzZWRQYXRoLnBhdGg7Cgog ICAgaWYgKHBhdGggPT09ICd0aGlzJykgewogICAgICB2YWwgPSByb290Owog ICAgfSBlbHNlIGlmIChwYXRoID09PSAnJykgewogICAgICB2YWwgPSB0cnVl OwogICAgfSBlbHNlIHsKICAgICAgdmFsID0gaGFuZGxlYmFyc0dldChyb290 LCBwYXRoLCBvcHRpb25zKTsKICAgIH0KCiAgICByZXR1cm4gRW1iZXIuVmll dy5fY2xhc3NTdHJpbmdGb3JWYWx1ZShwYXRoLCB2YWwsIHBhcnNlZFBhdGgu Y2xhc3NOYW1lLCBwYXJzZWRQYXRoLmZhbHN5Q2xhc3NOYW1lKTsKICB9OwoK ICAvLyBGb3IgZWFjaCBwcm9wZXJ0eSBwYXNzZWQsIGxvb3AgdGhyb3VnaCBh bmQgc2V0dXAKICAvLyBhbiBvYnNlcnZlci4KICBmb3JFYWNoLmNhbGwoY2xh c3NCaW5kaW5ncy5zcGxpdCgnICcpLCBmdW5jdGlvbihiaW5kaW5nKSB7Cgog ICAgLy8gVmFyaWFibGUgaW4gd2hpY2ggdGhlIG9sZCBjbGFzcyB2YWx1ZSBp cyBzYXZlZC4gVGhlIG9ic2VydmVyIGZ1bmN0aW9uCiAgICAvLyBjbG9zZXMg b3ZlciB0aGlzIHZhcmlhYmxlLCBzbyBpdCBrbm93cyB3aGljaCBzdHJpbmcg dG8gcmVtb3ZlIHdoZW4KICAgIC8vIHRoZSBwcm9wZXJ0eSBjaGFuZ2VzLgog ICAgdmFyIG9sZENsYXNzOwoKICAgIHZhciBvYnNlcnZlciwgaW52b2tlcjsK CiAgICB2YXIgcGFyc2VkUGF0aCA9IEVtYmVyLlZpZXcuX3BhcnNlUHJvcGVy dHlQYXRoKGJpbmRpbmcpLAogICAgICAgIHBhdGggPSBwYXJzZWRQYXRoLnBh dGgsCiAgICAgICAgcGF0aFJvb3QgPSBjb250ZXh0LAogICAgICAgIG5vcm1h bGl6ZWQ7CgogICAgaWYgKHBhdGggIT09ICcnICYmIHBhdGggIT09ICd0aGlz JykgewogICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplUGF0aChjb250ZXh0 LCBwYXRoLCBvcHRpb25zLmRhdGEpOwoKICAgICAgcGF0aFJvb3QgPSBub3Jt YWxpemVkLnJvb3Q7CiAgICAgIHBhdGggPSBub3JtYWxpemVkLnBhdGg7CiAg ICB9CgogICAgLy8gU2V0IHVwIGFuIG9ic2VydmVyIG9uIHRoZSBjb250ZXh0 LiBJZiB0aGUgcHJvcGVydHkgY2hhbmdlcywgdG9nZ2xlIHRoZQogICAgLy8g Y2xhc3MgbmFtZS4KICAgIG9ic2VydmVyID0gZnVuY3Rpb24oKSB7CiAgICAg IC8vIEdldCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKICAg ICAgbmV3Q2xhc3MgPSBjbGFzc1N0cmluZ0ZvclBhdGgoY29udGV4dCwgcGFy c2VkUGF0aCwgb3B0aW9ucyk7CiAgICAgIGVsZW0gPSBiaW5kQXR0cklkID8g dmlldy4kKCJbZGF0YS1iaW5kYXR0ci0iICsgYmluZEF0dHJJZCArICI9JyIg KyBiaW5kQXR0cklkICsgIiddIikgOiB2aWV3LiQoKTsKCiAgICAgIC8vIElm IHdlIGNhbid0IGZpbmQgdGhlIGVsZW1lbnQgYW55bW9yZSwgYSBwYXJlbnQg dGVtcGxhdGUgaGFzIGJlZW4KICAgICAgLy8gcmUtcmVuZGVyZWQgYW5kIHdl J3ZlIGJlZW4gbnVrZWQuIFJlbW92ZSB0aGUgb2JzZXJ2ZXIuCiAgICAgIGlm ICghZWxlbSB8fCBlbGVtLmxlbmd0aCA9PT0gMCkgewogICAgICAgIEVtYmVy LnJlbW92ZU9ic2VydmVyKHBhdGhSb290LCBwYXRoLCBpbnZva2VyKTsKICAg ICAgfSBlbHNlIHsKICAgICAgICAvLyBJZiB3ZSBoYWQgcHJldmlvdXNseSBh ZGRlZCBhIGNsYXNzIHRvIHRoZSBlbGVtZW50LCByZW1vdmUgaXQuCiAgICAg ICAgaWYgKG9sZENsYXNzKSB7CiAgICAgICAgICBlbGVtLnJlbW92ZUNsYXNz KG9sZENsYXNzKTsKICAgICAgICB9CgogICAgICAgIC8vIElmIG5lY2Vzc2Fy eSwgYWRkIGEgbmV3IGNsYXNzLiBNYWtlIHN1cmUgd2Uga2VlcCB0cmFjayBv ZiBpdCBzbwogICAgICAgIC8vIGl0IGNhbiBiZSByZW1vdmVkIGluIHRoZSBm dXR1cmUuCiAgICAgICAgaWYgKG5ld0NsYXNzKSB7CiAgICAgICAgICBlbGVt LmFkZENsYXNzKG5ld0NsYXNzKTsKICAgICAgICAgIG9sZENsYXNzID0gbmV3 Q2xhc3M7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG9sZENsYXNzID0g bnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgIH07CgogICAgaWYgKHBhdGgg IT09ICcnICYmIHBhdGggIT09ICd0aGlzJykgewogICAgICB2aWV3LnJlZ2lz dGVyT2JzZXJ2ZXIocGF0aFJvb3QsIHBhdGgsIG9ic2VydmVyKTsKICAgIH0K CiAgICAvLyBXZSd2ZSBhbHJlYWR5IHNldHVwIHRoZSBvYnNlcnZlcjsgbm93 IHdlIGp1c3QgbmVlZCB0byBmaWd1cmUgb3V0IHRoZQogICAgLy8gY29ycmVj dCBiZWhhdmlvciByaWdodCBub3cgb24gdGhlIGZpcnN0IHBhc3MgdGhyb3Vn aC4KICAgIHZhbHVlID0gY2xhc3NTdHJpbmdGb3JQYXRoKGNvbnRleHQsIHBh cnNlZFBhdGgsIG9wdGlvbnMpOwoKICAgIGlmICh2YWx1ZSkgewogICAgICBy ZXQucHVzaCh2YWx1ZSk7CgogICAgICAvLyBNYWtlIHN1cmUgd2Ugc2F2ZSB0 aGUgY3VycmVudCB2YWx1ZSBzbyB0aGF0IGl0IGNhbiBiZSByZW1vdmVkIGlm IHRoZQogICAgICAvLyBvYnNlcnZlciBmaXJlcy4KICAgICAgb2xkQ2xhc3Mg PSB2YWx1ZTsKICAgIH0KICB9KTsKCiAgcmV0dXJuIHJldDsKfTsKCgp9KSgp OwoKCgooZnVuY3Rpb24oKSB7Ci8qZ2xvYmFscyBIYW5kbGViYXJzICovCgov LyBUT0RPOiBEb24ndCByZXF1aXJlIHRoZSBlbnRpcmUgbW9kdWxlCi8qKgpA bW9kdWxlIGVtYmVyCkBzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycwoqLwoK dmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0Owp2YXIgRW1i ZXJIYW5kbGViYXJzID0gRW1iZXIuSGFuZGxlYmFyczsKdmFyIExPV0VSQ0FT RV9BX1ogPSAvXlthLXpdLzsKdmFyIFZJRVdfUFJFRklYID0gL152aWV3XC4v OwoKZnVuY3Rpb24gbWFrZUJpbmRpbmdzKHRoaXNDb250ZXh0LCBvcHRpb25z KSB7CiAgdmFyIGhhc2ggPSBvcHRpb25zLmhhc2gsCiAgICAgIGhhc2hUeXBl ID0gb3B0aW9ucy5oYXNoVHlwZXM7CgogIGZvciAodmFyIHByb3AgaW4gaGFz aCkgewogICAgaWYgKGhhc2hUeXBlW3Byb3BdID09PSAnSUQnKSB7CgogICAg ICB2YXIgdmFsdWUgPSBoYXNoW3Byb3BdOwoKICAgICAgaWYgKEVtYmVyLklT X0JJTkRJTkcudGVzdChwcm9wKSkgewogICAgICAgIEVtYmVyLndhcm4oIllv dSdyZSBhdHRlbXB0aW5nIHRvIHJlbmRlciBhIHZpZXcgYnkgcGFzc2luZyAi ICsgcHJvcCArICI9IiArIHZhbHVlICsgIiB0byBhIHZpZXcgaGVscGVyLCBi dXQgdGhpcyBzeW50YXggaXMgYW1iaWd1b3VzLiBZb3Ugc2hvdWxkIGVpdGhl ciBzdXJyb3VuZCAiICsgdmFsdWUgKyAiIGluIHF1b3RlcyBvciByZW1vdmUg YEJpbmRpbmdgIGZyb20gIiArIHByb3AgKyAiLiIpOwogICAgICB9IGVsc2Ug ewogICAgICAgIGhhc2hbcHJvcCArICdCaW5kaW5nJ10gPSB2YWx1ZTsKICAg ICAgICBoYXNoVHlwZVtwcm9wICsgJ0JpbmRpbmcnXSA9ICdTVFJJTkcnOwog ICAgICAgIGRlbGV0ZSBoYXNoW3Byb3BdOwogICAgICAgIGRlbGV0ZSBoYXNo VHlwZVtwcm9wXTsKICAgICAgfQogICAgfQogIH0KCiAgaWYgKGhhc2guaGFz T3duUHJvcGVydHkoJ2lkQmluZGluZycpKSB7CiAgICAvLyBpZCBjYW4ndCBi ZSBib3VuZCwgc28ganVzdCBwZXJmb3JtIG9uZS10aW1lIGxvb2t1cC4KICAg IGhhc2guaWQgPSBFbWJlckhhbmRsZWJhcnMuZ2V0KHRoaXNDb250ZXh0LCBo YXNoLmlkQmluZGluZywgb3B0aW9ucyk7CiAgICBoYXNoVHlwZS5pZCA9ICdT VFJJTkcnOwogICAgZGVsZXRlIGhhc2guaWRCaW5kaW5nOwogICAgZGVsZXRl IGhhc2hUeXBlLmlkQmluZGluZzsKICB9Cn0KCkVtYmVySGFuZGxlYmFycy5W aWV3SGVscGVyID0gRW1iZXIuT2JqZWN0LmNyZWF0ZSh7CgogIHByb3BlcnRp ZXNGcm9tSFRNTE9wdGlvbnM6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgIHZh ciBoYXNoID0gb3B0aW9ucy5oYXNoLCBkYXRhID0gb3B0aW9ucy5kYXRhOwog ICAgdmFyIGV4dGVuc2lvbnMgPSB7fSwKICAgICAgICBjbGFzc2VzID0gaGFz aFsnY2xhc3MnXSwKICAgICAgICBkdXAgPSBmYWxzZTsKCiAgICBpZiAoaGFz aC5pZCkgewogICAgICBleHRlbnNpb25zLmVsZW1lbnRJZCA9IGhhc2guaWQ7 CiAgICAgIGR1cCA9IHRydWU7CiAgICB9CgogICAgaWYgKGhhc2gudGFnKSB7 CiAgICAgIGV4dGVuc2lvbnMudGFnTmFtZSA9IGhhc2gudGFnOwogICAgICBk dXAgPSB0cnVlOwogICAgfQoKICAgIGlmIChjbGFzc2VzKSB7CiAgICAgIGNs YXNzZXMgPSBjbGFzc2VzLnNwbGl0KCcgJyk7CiAgICAgIGV4dGVuc2lvbnMu Y2xhc3NOYW1lcyA9IGNsYXNzZXM7CiAgICAgIGR1cCA9IHRydWU7CiAgICB9 CgogICAgaWYgKGhhc2guY2xhc3NCaW5kaW5nKSB7CiAgICAgIGV4dGVuc2lv bnMuY2xhc3NOYW1lQmluZGluZ3MgPSBoYXNoLmNsYXNzQmluZGluZy5zcGxp dCgnICcpOwogICAgICBkdXAgPSB0cnVlOwogICAgfQoKICAgIGlmIChoYXNo LmNsYXNzTmFtZUJpbmRpbmdzKSB7CiAgICAgIGlmIChleHRlbnNpb25zLmNs YXNzTmFtZUJpbmRpbmdzID09PSB1bmRlZmluZWQpIGV4dGVuc2lvbnMuY2xh c3NOYW1lQmluZGluZ3MgPSBbXTsKICAgICAgZXh0ZW5zaW9ucy5jbGFzc05h bWVCaW5kaW5ncyA9IGV4dGVuc2lvbnMuY2xhc3NOYW1lQmluZGluZ3MuY29u Y2F0KGhhc2guY2xhc3NOYW1lQmluZGluZ3Muc3BsaXQoJyAnKSk7CiAgICAg IGR1cCA9IHRydWU7CiAgICB9CgogICAgaWYgKGhhc2guYXR0cmlidXRlQmlu ZGluZ3MpIHsKICAgICAgRW1iZXIuYXNzZXJ0KCJTZXR0aW5nICdhdHRyaWJ1 dGVCaW5kaW5ncycgdmlhIEhhbmRsZWJhcnMgaXMgbm90IGFsbG93ZWQuIFBs ZWFzZSBzdWJjbGFzcyBFbWJlci5WaWV3IGFuZCBzZXQgaXQgdGhlcmUgaW5z dGVhZC4iKTsKICAgICAgZXh0ZW5zaW9ucy5hdHRyaWJ1dGVCaW5kaW5ncyA9 IG51bGw7CiAgICAgIGR1cCA9IHRydWU7CiAgICB9CgogICAgaWYgKGR1cCkg ewogICAgICBoYXNoID0gRW1iZXIuJC5leHRlbmQoe30sIGhhc2gpOwogICAg ICBkZWxldGUgaGFzaC5pZDsKICAgICAgZGVsZXRlIGhhc2gudGFnOwogICAg ICBkZWxldGUgaGFzaFsnY2xhc3MnXTsKICAgICAgZGVsZXRlIGhhc2guY2xh c3NCaW5kaW5nOwogICAgfQoKICAgIC8vIFNldCB0aGUgcHJvcGVyIGNvbnRl eHQgZm9yIGFsbCBiaW5kaW5ncyBwYXNzZWQgdG8gdGhlIGhlbHBlci4gVGhp cyBhcHBsaWVzIHRvIHJlZ3VsYXIgYXR0cmlidXRlIGJpbmRpbmdzCiAgICAv LyBhcyB3ZWxsIGFzIGNsYXNzIG5hbWUgYmluZGluZ3MuIElmIHRoZSBiaW5k aW5ncyBhcmUgbG9jYWwsIG1ha2UgdGhlbSByZWxhdGl2ZSB0byB0aGUgY3Vy cmVudCBjb250ZXh0CiAgICAvLyBpbnN0ZWFkIG9mIHRoZSB2aWV3LgogICAg dmFyIHBhdGg7CgogICAgLy8gRXZhbHVhdGUgdGhlIGNvbnRleHQgb2YgcmVn dWxhciBhdHRyaWJ1dGUgYmluZGluZ3M6CiAgICBmb3IgKHZhciBwcm9wIGlu IGhhc2gpIHsKICAgICAgaWYgKCFoYXNoLmhhc093blByb3BlcnR5KHByb3Ap KSB7IGNvbnRpbnVlOyB9CgogICAgICAvLyBUZXN0IGlmIHRoZSBwcm9wZXJ0 eSBlbmRzIGluICJCaW5kaW5nIgogICAgICBpZiAoRW1iZXIuSVNfQklORElO Ry50ZXN0KHByb3ApICYmIHR5cGVvZiBoYXNoW3Byb3BdID09PSAnc3RyaW5n JykgewogICAgICAgIHBhdGggPSB0aGlzLmNvbnRleHR1YWxpemVCaW5kaW5n UGF0aChoYXNoW3Byb3BdLCBkYXRhKTsKICAgICAgICBpZiAocGF0aCkgeyBo YXNoW3Byb3BdID0gcGF0aDsgfQogICAgICB9CiAgICB9CgogICAgLy8gRXZh bHVhdGUgdGhlIGNvbnRleHQgb2YgY2xhc3MgbmFtZSBiaW5kaW5nczoKICAg IGlmIChleHRlbnNpb25zLmNsYXNzTmFtZUJpbmRpbmdzKSB7CiAgICAgIGZv ciAodmFyIGIgaW4gZXh0ZW5zaW9ucy5jbGFzc05hbWVCaW5kaW5ncykgewog ICAgICAgIHZhciBmdWxsID0gZXh0ZW5zaW9ucy5jbGFzc05hbWVCaW5kaW5n c1tiXTsKICAgICAgICBpZiAodHlwZW9mIGZ1bGwgPT09ICdzdHJpbmcnKSB7 CiAgICAgICAgICAvLyBDb250ZXh0dWFsaXplIHRoZSBwYXRoIG9mIGNsYXNz TmFtZUJpbmRpbmcgc28gdGhpczoKICAgICAgICAgIC8vCiAgICAgICAgICAv LyAgICAgY2xhc3NOYW1lQmluZGluZz0iaXNHcmVlbjpncmVlbiIKICAgICAg ICAgIC8vCiAgICAgICAgICAvLyBpcyBjb252ZXJ0ZWQgdG8gdGhpczoKICAg ICAgICAgIC8vCiAgICAgICAgICAvLyAgICAgY2xhc3NOYW1lQmluZGluZz0i X3BhcmVudFZpZXcuY29udGV4dC5pc0dyZWVuOmdyZWVuIgogICAgICAgICAg dmFyIHBhcnNlZFBhdGggPSBFbWJlci5WaWV3Ll9wYXJzZVByb3BlcnR5UGF0 aChmdWxsKTsKICAgICAgICAgIHBhdGggPSB0aGlzLmNvbnRleHR1YWxpemVC aW5kaW5nUGF0aChwYXJzZWRQYXRoLnBhdGgsIGRhdGEpOwogICAgICAgICAg aWYgKHBhdGgpIHsgZXh0ZW5zaW9ucy5jbGFzc05hbWVCaW5kaW5nc1tiXSA9 IHBhdGggKyBwYXJzZWRQYXRoLmNsYXNzTmFtZXM7IH0KICAgICAgICB9CiAg ICAgIH0KICAgIH0KCiAgICByZXR1cm4gRW1iZXIuJC5leHRlbmQoaGFzaCwg ZXh0ZW5zaW9ucyk7CiAgfSwKCiAgLy8gVHJhbnNmb3JtIGJpbmRpbmdzIGZy b20gdGhlIGN1cnJlbnQgY29udGV4dCB0byBhIGNvbnRleHQgdGhhdCBjYW4g YmUgZXZhbHVhdGVkIHdpdGhpbiB0aGUgdmlldy4KICAvLyBSZXR1cm5zIG51 bGwgaWYgdGhlIHBhdGggc2hvdWxkbid0IGJlIGNoYW5nZWQuCiAgLy8KICAv LyBUT0RPOiBjb25zaWRlciB0aGUgYWRkaXRpb24gb2YgYSBwcmVmaXggdGhh dCB3b3VsZCBhbGxvdyB0aGlzIG1ldGhvZCB0byByZXR1cm4gYHBhdGhgLgog IGNvbnRleHR1YWxpemVCaW5kaW5nUGF0aDogZnVuY3Rpb24ocGF0aCwgZGF0 YSkgewogICAgdmFyIG5vcm1hbGl6ZWQgPSBFbWJlci5IYW5kbGViYXJzLm5v cm1hbGl6ZVBhdGgobnVsbCwgcGF0aCwgZGF0YSk7CiAgICBpZiAobm9ybWFs aXplZC5pc0tleXdvcmQpIHsKICAgICAgcmV0dXJuICd0ZW1wbGF0ZURhdGEu a2V5d29yZHMuJyArIHBhdGg7CiAgICB9IGVsc2UgaWYgKEVtYmVyLmlzR2xv YmFsUGF0aChwYXRoKSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxz ZSBpZiAocGF0aCA9PT0gJ3RoaXMnIHx8IHBhdGggPT09ICcnKSB7CiAgICAg IHJldHVybiAnX3BhcmVudFZpZXcuY29udGV4dCc7CiAgICB9IGVsc2Ugewog ICAgICByZXR1cm4gJ19wYXJlbnRWaWV3LmNvbnRleHQuJyArIHBhdGg7CiAg ICB9CiAgfSwKCiAgaGVscGVyOiBmdW5jdGlvbih0aGlzQ29udGV4dCwgcGF0 aCwgb3B0aW9ucykgewogICAgdmFyIGRhdGEgPSBvcHRpb25zLmRhdGEsCiAg ICAgICAgZm4gPSBvcHRpb25zLmZuLAogICAgICAgIG5ld1ZpZXc7CgogICAg bWFrZUJpbmRpbmdzKHRoaXNDb250ZXh0LCBvcHRpb25zKTsKCiAgICBpZiAo J3N0cmluZycgPT09IHR5cGVvZiBwYXRoKSB7CgogICAgICAvLyBUT0RPOiB0 aGlzIGlzIGEgbGFtZSBjb25kaXRpb25hbCwgdGhpcyBzaG91bGQgbGlrZWx5 IGNoYW5nZQogICAgICAvLyBidXQgc29tZXRoaW5nIGFsb25nIHRoZXNlIGxp bmVzIHdpbGwgbGlrZWx5IG5lZWQgdG8gYmUgYWRkZWQKICAgICAgLy8gYXMg ZGVwcmVjYXRpb24gd2FybmluZ3MKICAgICAgLy8KICAgICAgaWYgKG9wdGlv bnMudHlwZXNbMF0gPT09ICdTVFJJTkcnICYmIExPV0VSQ0FTRV9BX1oudGVz dChwYXRoKSAmJiAhVklFV19QUkVGSVgudGVzdChwYXRoKSkgewogICAgICAg IEVtYmVyLmFzc2VydCgiVmlldyByZXF1aXJlcyBhIGNvbnRhaW5lciIsICEh ZGF0YS52aWV3LmNvbnRhaW5lcik7CiAgICAgICAgbmV3VmlldyA9IGRhdGEu dmlldy5jb250YWluZXIubG9va3VwRmFjdG9yeSgndmlldzonICsgcGF0aCk7 CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbmV3VmlldyA9IEVtYmVySGFuZGxl YmFycy5nZXQodGhpc0NvbnRleHQsIHBhdGgsIG9wdGlvbnMpOwogICAgICB9 CgogICAgICBFbWJlci5hc3NlcnQoIlVuYWJsZSB0byBmaW5kIHZpZXcgYXQg cGF0aCAnIiArIHBhdGggKyAiJyIsICEhbmV3Vmlldyk7CiAgICB9IGVsc2Ug ewogICAgICBuZXdWaWV3ID0gcGF0aDsKICAgIH0KCiAgICBFbWJlci5hc3Nl cnQoRW1iZXIuU3RyaW5nLmZtdCgnWW91IG11c3QgcGFzcyBhIHZpZXcgdG8g dGhlICN2aWV3IGhlbHBlciwgbm90ICVAICglQCknLCBbcGF0aCwgbmV3Vmll d10pLCBFbWJlci5WaWV3LmRldGVjdChuZXdWaWV3KSB8fCBFbWJlci5WaWV3 LmRldGVjdEluc3RhbmNlKG5ld1ZpZXcpKTsKCiAgICB2YXIgdmlld09wdGlv bnMgPSB0aGlzLnByb3BlcnRpZXNGcm9tSFRNTE9wdGlvbnMob3B0aW9ucywg dGhpc0NvbnRleHQpOwogICAgdmFyIGN1cnJlbnRWaWV3ID0gZGF0YS52aWV3 OwogICAgdmlld09wdGlvbnMudGVtcGxhdGVEYXRhID0gZGF0YTsKICAgIHZh ciBuZXdWaWV3UHJvdG8gPSBuZXdWaWV3LnByb3RvID8gbmV3Vmlldy5wcm90 bygpIDogbmV3VmlldzsKCiAgICBpZiAoZm4pIHsKICAgICAgRW1iZXIuYXNz ZXJ0KCJZb3UgY2Fubm90IHByb3ZpZGUgYSB0ZW1wbGF0ZSBibG9jayBpZiB5 b3UgYWxzbyBzcGVjaWZpZWQgYSB0ZW1wbGF0ZU5hbWUiLCAhZ2V0KHZpZXdP cHRpb25zLCAndGVtcGxhdGVOYW1lJykgJiYgIWdldChuZXdWaWV3UHJvdG8s ICd0ZW1wbGF0ZU5hbWUnKSk7CiAgICAgIHZpZXdPcHRpb25zLnRlbXBsYXRl ID0gZm47CiAgICB9CgogICAgLy8gV2Ugb25seSB3YW50IHRvIG92ZXJyaWRl IHRoZSBgX2NvbnRleHRgIGNvbXB1dGVkIHByb3BlcnR5IGlmIHRoZXJlIGlz CiAgICAvLyBubyBzcGVjaWZpZWQgY29udHJvbGxlci4gU2VlIFZpZXcjX2Nv bnRleHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICBpZiAoIW5ld1ZpZXdQ cm90by5jb250cm9sbGVyICYmICFuZXdWaWV3UHJvdG8uY29udHJvbGxlckJp bmRpbmcgJiYgIXZpZXdPcHRpb25zLmNvbnRyb2xsZXIgJiYgIXZpZXdPcHRp b25zLmNvbnRyb2xsZXJCaW5kaW5nKSB7CiAgICAgIHZpZXdPcHRpb25zLl9j b250ZXh0ID0gdGhpc0NvbnRleHQ7CiAgICB9CgogICAgY3VycmVudFZpZXcu YXBwZW5kQ2hpbGQobmV3Vmlldywgdmlld09wdGlvbnMpOwogIH0KfSk7Cgov KioKICBge3t2aWV3fX1gIGluc2VydHMgYSBuZXcgaW5zdGFuY2Ugb2YgYEVt YmVyLlZpZXdgIGludG8gYSB0ZW1wbGF0ZSBwYXNzaW5nIGl0cwogIG9wdGlv bnMgdG8gdGhlIGBFbWJlci5WaWV3YCdzIGBjcmVhdGVgIG1ldGhvZCBhbmQg dXNpbmcgdGhlIHN1cHBsaWVkIGJsb2NrIGFzCiAgdGhlIHZpZXcncyBvd24g dGVtcGxhdGUuCgogIEFuIGVtcHR5IGA8Ym9keT5gIGFuZCB0aGUgZm9sbG93 aW5nIHRlbXBsYXRlOgoKICBgYGBoYW5kbGViYXJzCiAgQSBzcGFuOgogIHt7 I3ZpZXcgdGFnTmFtZT0ic3BhbiJ9fQogICAgaGVsbG8uCiAge3svdmlld319 CiAgYGBgCgogIFdpbGwgcmVzdWx0IGluIEhUTUwgc3RydWN0dXJlOgoKICBg YGBodG1sCiAgPGJvZHk+CiAgICA8IS0tIE5vdGU6IHRoZSBoYW5kbGViYXJz IHRlbXBsYXRlIHNjcmlwdAogICAgICAgICBhbHNvIHJlc3VsdHMgaW4gYSBy ZW5kZXJlZCBFbWJlci5WaWV3CiAgICAgICAgIHdoaWNoIGlzIHRoZSBvdXRl ciA8ZGl2PiBoZXJlIC0tPgoKICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXci PgogICAgICBBIHNwYW46CiAgICAgIDxzcGFuIGlkPSJlbWJlcjEiIGNsYXNz PSJlbWJlci12aWV3Ij4KICAgICAgICBIZWxsby4KICAgICAgPC9zcGFuPgog ICAgPC9kaXY+CiAgPC9ib2R5PgogIGBgYAoKICAjIyMgYHBhcmVudFZpZXdg IHNldHRpbmcKCiAgVGhlIGBwYXJlbnRWaWV3YCBwcm9wZXJ0eSBvZiB0aGUg bmV3IGBFbWJlci5WaWV3YCBpbnN0YW5jZSBjcmVhdGVkIHRocm91Z2gKICBg e3t2aWV3fX1gIHdpbGwgYmUgc2V0IHRvIHRoZSBgRW1iZXIuVmlld2AgaW5z dGFuY2Ugb2YgdGhlIHRlbXBsYXRlIHdoZXJlCiAgYHt7dmlld319YCB3YXMg Y2FsbGVkLgoKICBgYGBqYXZhc2NyaXB0CiAgYVZpZXcgPSBFbWJlci5WaWV3 LmNyZWF0ZSh7CiAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21w aWxlKCJ7eyN2aWV3fX0gbXkgcGFyZW50OiB7e3BhcmVudFZpZXcuZWxlbWVu dElkfX0ge3svdmlld319IikKICB9KTsKCiAgYVZpZXcuYXBwZW5kVG8oJ2Jv ZHknKTsKICBgYGAKCiAgV2lsbCByZXN1bHQgaW4gSFRNTCBzdHJ1Y3R1cmU6 CgogIGBgYGh0bWwKICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12 aWV3Ij4KICAgIDxkaXYgaWQ9ImVtYmVyMiIgY2xhc3M9ImVtYmVyLXZpZXci PgogICAgICBteSBwYXJlbnQ6IGVtYmVyMQogICAgPC9kaXY+CiAgPC9kaXY+ CiAgYGBgCgogICMjIyBTZXR0aW5nIENTUyBpZCBhbmQgY2xhc3MgYXR0cmli dXRlcwoKICBUaGUgSFRNTCBgaWRgIGF0dHJpYnV0ZSBjYW4gYmUgc2V0IG9u IHRoZSBge3t2aWV3fX1gJ3MgcmVzdWx0aW5nIGVsZW1lbnQgd2l0aAogIHRo ZSBgaWRgIG9wdGlvbi4gVGhpcyBvcHRpb24gd2lsbCBfbm90XyBiZSBwYXNz ZWQgdG8gYEVtYmVyLlZpZXcuY3JlYXRlYC4KCiAgYGBgaGFuZGxlYmFycwog IHt7I3ZpZXcgdGFnTmFtZT0ic3BhbiIgaWQ9ImEtY3VzdG9tLWlkIn19CiAg ICBoZWxsby4KICB7ey92aWV3fX0KICBgYGAKCiAgUmVzdWx0cyBpbiB0aGUg Zm9sbG93aW5nIEhUTUwgc3RydWN0dXJlOgoKICBgYGBodG1sCiAgPGRpdiBj bGFzcz0iZW1iZXItdmlldyI+CiAgICA8c3BhbiBpZD0iYS1jdXN0b20taWQi IGNsYXNzPSJlbWJlci12aWV3Ij4KICAgICAgaGVsbG8uCiAgICA8L3NwYW4+ CiAgPC9kaXY+CiAgYGBgCgogIFRoZSBIVE1MIGBjbGFzc2AgYXR0cmlidXRl IGNhbiBiZSBzZXQgb24gdGhlIGB7e3ZpZXd9fWAncyByZXN1bHRpbmcgZWxl bWVudAogIHdpdGggdGhlIGBjbGFzc2Agb3IgYGNsYXNzTmFtZUJpbmRpbmdz YCBvcHRpb25zLiBUaGUgYGNsYXNzYCBvcHRpb24gd2lsbAogIGRpcmVjdGx5 IHNldCB0aGUgQ1NTIGBjbGFzc2AgYXR0cmlidXRlIGFuZCB3aWxsIG5vdCBi ZSBwYXNzZWQgdG8KICBgRW1iZXIuVmlldy5jcmVhdGVgLiBgY2xhc3NOYW1l QmluZGluZ3NgIHdpbGwgYmUgcGFzc2VkIHRvIGBjcmVhdGVgIGFuZCB1c2UK ICBgRW1iZXIuVmlld2AncyBjbGFzcyBuYW1lIGJpbmRpbmcgZnVuY3Rpb25h bGl0eToKCiAgYGBgaGFuZGxlYmFycwogIHt7I3ZpZXcgdGFnTmFtZT0ic3Bh biIgY2xhc3M9ImEtY3VzdG9tLWNsYXNzIn19CiAgICBoZWxsby4KICB7ey92 aWV3fX0KICBgYGAKCiAgUmVzdWx0cyBpbiB0aGUgZm9sbG93aW5nIEhUTUwg c3RydWN0dXJlOgoKICBgYGBodG1sCiAgPGRpdiBjbGFzcz0iZW1iZXItdmll dyI+CiAgICA8c3BhbiBpZD0iZW1iZXIyIiBjbGFzcz0iZW1iZXItdmlldyBh LWN1c3RvbS1jbGFzcyI+CiAgICAgIGhlbGxvLgogICAgPC9zcGFuPgogIDwv ZGl2PgogIGBgYAoKICAjIyMgU3VwcGx5aW5nIGEgZGlmZmVyZW50IHZpZXcg Y2xhc3MKCiAgYHt7dmlld319YCBjYW4gdGFrZSBhbiBvcHRpb25hbCBmaXJz dCBhcmd1bWVudCBiZWZvcmUgaXRzIHN1cHBsaWVkIG9wdGlvbnMgdG8KICBz cGVjaWZ5IGEgcGF0aCB0byBhIGN1c3RvbSB2aWV3IGNsYXNzLgoKICBgYGBo YW5kbGViYXJzCiAge3sjdmlldyAiTXlBcHAuQ3VzdG9tVmlldyJ9fQogICAg aGVsbG8uCiAge3svdmlld319CiAgYGBgCgogIFRoZSBmaXJzdCBhcmd1bWVu dCBjYW4gYWxzbyBiZSBhIHJlbGF0aXZlIHBhdGggYWNjZXNzaWJsZSBmcm9t IHRoZSBjdXJyZW50CiAgY29udGV4dC4KCiAgYGBgamF2YXNjcmlwdAogIE15 QXBwID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKHt9KTsKICBNeUFwcC5P dXRlclZpZXcgPSBFbWJlci5WaWV3LmV4dGVuZCh7CiAgICBpbm5lclZpZXdD bGFzczogRW1iZXIuVmlldy5leHRlbmQoewogICAgICBjbGFzc05hbWVzOiBb J2EtY3VzdG9tLXZpZXctY2xhc3MtYXMtcHJvcGVydHknXQogICAgfSksCiAg ICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCd7eyN2aWV3 ICJ2aWV3LmlubmVyVmlld0NsYXNzIn19IGhpIHt7L3ZpZXd9fScpCiAgfSk7 CgogIE15QXBwLk91dGVyVmlldy5jcmVhdGUoKS5hcHBlbmRUbygnYm9keScp OwogIGBgYAoKICBXaWxsIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUw6 CgogIGBgYGh0bWwKICA8ZGl2IGlkPSJlbWJlcjEiIGNsYXNzPSJlbWJlci12 aWV3Ij4KICAgIDxkaXYgaWQ9ImVtYmVyMiIgY2xhc3M9ImVtYmVyLXZpZXcg YS1jdXN0b20tdmlldy1jbGFzcy1hcy1wcm9wZXJ0eSI+CiAgICAgIGhpCiAg ICA8L2Rpdj4KICA8L2Rpdj4KICBgYGAKCiAgIyMjIEJsb2NrbGVzcyB1c2UK CiAgSWYgeW91IHN1cHBseSBhIGN1c3RvbSBgRW1iZXIuVmlld2Agc3ViY2xh c3MgdGhhdCBzcGVjaWZpZXMgaXRzIG93biB0ZW1wbGF0ZQogIG9yIHByb3Zp ZGUgYSBgdGVtcGxhdGVOYW1lYCBvcHRpb24gdG8gYHt7dmlld319YCBpdCBj YW4gYmUgdXNlZCB3aXRob3V0CiAgc3VwcGx5aW5nIGEgYmxvY2suIEF0dGVt cHRzIHRvIHVzZSBib3RoIGEgYHRlbXBsYXRlTmFtZWAgb3B0aW9uIGFuZCBz dXBwbHkgYQogIGJsb2NrIHdpbGwgdGhyb3cgYW4gZXJyb3IuCgogIGBgYGhh bmRsZWJhcnMKICB7e3ZpZXcgIk15QXBwLlZpZXdXaXRoQVRlbXBsYXRlRGVm aW5lZCJ9fQogIGBgYAoKICAjIyMgYHZpZXdOYW1lYCBwcm9wZXJ0eQoKICBZ b3UgY2FuIHN1cHBseSBhIGB2aWV3TmFtZWAgb3B0aW9uIHRvIGB7e3ZpZXd9 fWAuIFRoZSBgRW1iZXIuVmlld2AgaW5zdGFuY2UKICB3aWxsIGJlIHJlZmVy ZW5jZWQgYXMgYSBwcm9wZXJ0eSBvZiBpdHMgcGFyZW50IHZpZXcgYnkgdGhp cyBuYW1lLgoKICBgYGBqYXZhc2NyaXB0CiAgYVZpZXcgPSBFbWJlci5WaWV3 LmNyZWF0ZSh7CiAgICB0ZW1wbGF0ZTogRW1iZXIuSGFuZGxlYmFycy5jb21w aWxlKCd7eyN2aWV3IHZpZXdOYW1lPSJhQ2hpbGRCeU5hbWUifX0gaGkge3sv dmlld319JykKICB9KTsKCiAgYVZpZXcuYXBwZW5kVG8oJ2JvZHknKTsKICBh Vmlldy5nZXQoJ2FDaGlsZEJ5TmFtZScpIC8vIHRoZSBpbnN0YW5jZSBvZiBF bWJlci5WaWV3IGNyZWF0ZWQgYnkge3t2aWV3fX0gaGVscGVyCiAgYGBgCgog IEBtZXRob2QgdmlldwogIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJz CiAgQHBhcmFtIHtTdHJpbmd9IHBhdGgKICBAcGFyYW0ge0hhc2h9IG9wdGlv bnMKICBAcmV0dXJuIHtTdHJpbmd9IEhUTUwgc3RyaW5nCiovCkVtYmVySGFu ZGxlYmFycy5yZWdpc3RlckhlbHBlcigndmlldycsIGZ1bmN0aW9uIHZpZXdI ZWxwZXIocGF0aCwgb3B0aW9ucykgewogIEVtYmVyLmFzc2VydCgiVGhlIHZp ZXcgaGVscGVyIG9ubHkgdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQiLCBhcmd1 bWVudHMubGVuZ3RoIDw9IDIpOwoKICAvLyBJZiBubyBwYXRoIGlzIHByb3Zp ZGVkLCB0cmVhdCBwYXRoIHBhcmFtIGFzIG9wdGlvbnMuCiAgaWYgKHBhdGgg JiYgcGF0aC5kYXRhICYmIHBhdGguZGF0YS5pc1JlbmRlckRhdGEpIHsKICAg IG9wdGlvbnMgPSBwYXRoOwogICAgcGF0aCA9ICJFbWJlci5WaWV3IjsKICB9 CgogIHJldHVybiBFbWJlckhhbmRsZWJhcnMuVmlld0hlbHBlci5oZWxwZXIo dGhpcywgcGF0aCwgb3B0aW9ucyk7Cn0pOwoKCn0pKCk7CgoKCihmdW5jdGlv bigpIHsKLy8gVE9ETzogRG9uJ3QgcmVxdWlyZSBhbGwgb2YgdGhpcyBtb2R1 bGUKLyoqCkBtb2R1bGUgZW1iZXIKQHN1Ym1vZHVsZSBlbWJlci1oYW5kbGVi YXJzCiovCgp2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBoYW5kbGViYXJzR2V0ID0g RW1iZXIuSGFuZGxlYmFycy5nZXQsIGZtdCA9IEVtYmVyLlN0cmluZy5mbXQ7 CgovKioKICBge3tjb2xsZWN0aW9ufX1gIGlzIGEgYEVtYmVyLkhhbmRsZWJh cnNgIGhlbHBlciBmb3IgYWRkaW5nIGluc3RhbmNlcyBvZgogIGBFbWJlci5D b2xsZWN0aW9uVmlld2AgdG8gYSB0ZW1wbGF0ZS4gU2VlIFtFbWJlci5Db2xs ZWN0aW9uVmlld10oL2FwaS9jbGFzc2VzL0VtYmVyLkNvbGxlY3Rpb25WaWV3 Lmh0bWwpCiAgIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGhvdyBh IGBDb2xsZWN0aW9uVmlld2AgZnVuY3Rpb25zLgoKICBge3tjb2xsZWN0aW9u fX1gJ3MgcHJpbWFyeSB1c2UgaXMgYXMgYSBibG9jayBoZWxwZXIgd2l0aCBh IGBjb250ZW50QmluZGluZ2AKICBvcHRpb24gcG9pbnRpbmcgdG93YXJkcyBh biBgRW1iZXIuQXJyYXlgLWNvbXBhdGlibGUgb2JqZWN0LiBBbiBgRW1iZXIu Vmlld2AKICBpbnN0YW5jZSB3aWxsIGJlIGNyZWF0ZWQgZm9yIGVhY2ggaXRl bSBpbiBpdHMgYGNvbnRlbnRgIHByb3BlcnR5LiBFYWNoIHZpZXcKICB3aWxs IGhhdmUgaXRzIG93biBgY29udGVudGAgcHJvcGVydHkgc2V0IHRvIHRoZSBh cHByb3ByaWF0ZSBpdGVtIGluIHRoZQogIGNvbGxlY3Rpb24uCgogIFRoZSBw cm92aWRlZCBibG9jayB3aWxsIGJlIGFwcGxpZWQgYXMgdGhlIHRlbXBsYXRl IGZvciBlYWNoIGl0ZW0ncyB2aWV3LgoKICBHaXZlbiBhbiBlbXB0eSBgPGJv ZHk+YCB0aGUgZm9sbG93aW5nIHRlbXBsYXRlOgoKICBgYGBoYW5kbGViYXJz CiAge3sjY29sbGVjdGlvbiBjb250ZW50QmluZGluZz0iQXBwLml0ZW1zIn19 CiAgICBIaSB7e3ZpZXcuY29udGVudC5uYW1lfX0KICB7ey9jb2xsZWN0aW9u fX0KICBgYGAKCiAgQW5kIHRoZSBmb2xsb3dpbmcgYXBwbGljYXRpb24gY29k ZQoKICBgYGBqYXZhc2NyaXB0CiAgQXBwID0gRW1iZXIuQXBwbGljYXRpb24u Y3JlYXRlKCkKICBBcHAuaXRlbXMgPSBbCiAgICBFbWJlci5PYmplY3QuY3Jl YXRlKHtuYW1lOiAnRGF2ZSd9KSwKICAgIEVtYmVyLk9iamVjdC5jcmVhdGUo e25hbWU6ICdNYXJ5J30pLAogICAgRW1iZXIuT2JqZWN0LmNyZWF0ZSh7bmFt ZTogJ1NhcmEnfSkKICBdCiAgYGBgCgogIFdpbGwgcmVzdWx0IGluIHRoZSBI VE1MIHN0cnVjdHVyZSBiZWxvdwoKICBgYGBodG1sCiAgPGRpdiBjbGFzcz0i ZW1iZXItdmlldyI+CiAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij5IaSBE YXZlPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij5IaSBNYXJ5 PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij5IaSBTYXJhPC9k aXY+CiAgPC9kaXY+CiAgYGBgCgogICMjIyBCbG9ja2xlc3MgdXNlIGluIGEg Y29sbGVjdGlvbgoKICBJZiB5b3UgcHJvdmlkZSBhbiBgaXRlbVZpZXdDbGFz c2Agb3B0aW9uIHRoYXQgaGFzIGl0cyBvd24gYHRlbXBsYXRlYCB5b3UgY2Fu CiAgb21pdCB0aGUgYmxvY2suCgogIFRoZSBmb2xsb3dpbmcgdGVtcGxhdGU6 CgogIGBgYGhhbmRsZWJhcnMKICB7e2NvbGxlY3Rpb24gY29udGVudEJpbmRp bmc9IkFwcC5pdGVtcyIgaXRlbVZpZXdDbGFzcz0iQXBwLkFuSXRlbVZpZXci fX0KICBgYGAKCiAgQW5kIGFwcGxpY2F0aW9uIGNvZGUKCiAgYGBgamF2YXNj cmlwdAogIEFwcCA9IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSgpOwogIEFw cC5pdGVtcyA9IFsKICAgIEVtYmVyLk9iamVjdC5jcmVhdGUoe25hbWU6ICdE YXZlJ30pLAogICAgRW1iZXIuT2JqZWN0LmNyZWF0ZSh7bmFtZTogJ01hcnkn fSksCiAgICBFbWJlci5PYmplY3QuY3JlYXRlKHtuYW1lOiAnU2FyYSd9KQog IF07CgogIEFwcC5Bbkl0ZW1WaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoewog ICAgdGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgiR3JlZXRp bmdzIHt7dmlldy5jb250ZW50Lm5hbWV9fSIpCiAgfSk7CiAgYGBgCgogIFdp bGwgcmVzdWx0IGluIHRoZSBIVE1MIHN0cnVjdHVyZSBiZWxvdwoKICBgYGBo dG1sCiAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+CiAgICA8ZGl2IGNsYXNz PSJlbWJlci12aWV3Ij5HcmVldGluZ3MgRGF2ZTwvZGl2PgogICAgPGRpdiBj bGFzcz0iZW1iZXItdmlldyI+R3JlZXRpbmdzIE1hcnk8L2Rpdj4KICAgIDxk aXYgY2xhc3M9ImVtYmVyLXZpZXciPkdyZWV0aW5ncyBTYXJhPC9kaXY+CiAg PC9kaXY+CiAgYGBgCgogICMjIyBTcGVjaWZ5aW5nIGEgQ29sbGVjdGlvblZp ZXcgc3ViY2xhc3MKCiAgQnkgZGVmYXVsdCB0aGUgYHt7Y29sbGVjdGlvbn19 YCBoZWxwZXIgd2lsbCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YKICBgRW1iZXIu Q29sbGVjdGlvblZpZXdgLiBZb3UgY2FuIHN1cHBseSBhIGBFbWJlci5Db2xs ZWN0aW9uVmlld2Agc3ViY2xhc3MgdG8KICB0aGUgaGVscGVyIGJ5IHBhc3Np bmcgaXQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50OgoKICBgYGBoYW5kbGViYXJz CiAge3sjY29sbGVjdGlvbiBBcHAuTXlDdXN0b21Db2xsZWN0aW9uQ2xhc3Mg Y29udGVudEJpbmRpbmc9IkFwcC5pdGVtcyJ9fQogICAgSGkge3t2aWV3LmNv bnRlbnQubmFtZX19CiAge3svY29sbGVjdGlvbn19CiAgYGBgCgogICMjIyBG b3J3YXJkZWQgYGl0ZW0uKmAtbmFtZWQgT3B0aW9ucwoKICBBcyB3aXRoIHRo ZSBge3t2aWV3fX1gLCBoZWxwZXIgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIGB7 e2NvbGxlY3Rpb259fWAgd2lsbCBiZQogIHNldCBvbiB0aGUgcmVzdWx0aW5n IGBFbWJlci5Db2xsZWN0aW9uVmlld2AgYXMgcHJvcGVydGllcy4gQWRkaXRp b25hbGx5LAogIG9wdGlvbnMgcHJlZml4ZWQgd2l0aCBgaXRlbWAgd2lsbCBi ZSBhcHBsaWVkIHRvIHRoZSB2aWV3cyByZW5kZXJlZCBmb3IgZWFjaAogIGl0 ZW0gKG5vdGUgdGhlIGNhbWVsY2FzaW5nKToKCiAgYGBgaGFuZGxlYmFycwog IHt7I2NvbGxlY3Rpb24gY29udGVudEJpbmRpbmc9IkFwcC5pdGVtcyIKICAg ICAgICAgICAgICAgIGl0ZW1UYWdOYW1lPSJwIgogICAgICAgICAgICAgICAg aXRlbUNsYXNzTmFtZXM9ImdyZWV0aW5nIn19CiAgICBIb3dkeSB7e3ZpZXcu Y29udGVudC5uYW1lfX0KICB7ey9jb2xsZWN0aW9ufX0KICBgYGAKCiAgV2ls bCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1MIHN0cnVjdHVyZToKCiAg YGBgaHRtbAogIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPgogICAgPHAgY2xh c3M9ImVtYmVyLXZpZXcgZ3JlZXRpbmciPkhvd2R5IERhdmU8L3A+CiAgICA8 cCBjbGFzcz0iZW1iZXItdmlldyBncmVldGluZyI+SG93ZHkgTWFyeTwvcD4K ICAgIDxwIGNsYXNzPSJlbWJlci12aWV3IGdyZWV0aW5nIj5Ib3dkeSBTYXJh PC9wPgogIDwvZGl2PgogIGBgYAoKICBAbWV0aG9kIGNvbGxlY3Rpb24KICBA Zm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycwogIEBwYXJhbSB7U3RyaW5n fSBwYXRoCiAgQHBhcmFtIHtIYXNofSBvcHRpb25zCiAgQHJldHVybiB7U3Ry aW5nfSBIVE1MIHN0cmluZwogIEBkZXByZWNhdGVkIFVzZSBge3tlYWNofX1g IGhlbHBlciBpbnN0ZWFkLgoqLwpFbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVy SGVscGVyKCdjb2xsZWN0aW9uJywgZnVuY3Rpb24gY29sbGVjdGlvbkhlbHBl cihwYXRoLCBvcHRpb25zKSB7CiAgRW1iZXIuZGVwcmVjYXRlKCJVc2luZyB0 aGUge3tjb2xsZWN0aW9ufX0gaGVscGVyIHdpdGhvdXQgc3BlY2lmeWluZyBh IGNsYXNzIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYXMgdGhlIHt7ZWFjaH19IGhl bHBlciBub3cgc3VwcG9ydHMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eS4iLCBw YXRoICE9PSAnY29sbGVjdGlvbicpOwoKICAvLyBJZiBubyBwYXRoIGlzIHBy b3ZpZGVkLCB0cmVhdCBwYXRoIHBhcmFtIGFzIG9wdGlvbnMuCiAgaWYgKHBh dGggJiYgcGF0aC5kYXRhICYmIHBhdGguZGF0YS5pc1JlbmRlckRhdGEpIHsK ICAgIG9wdGlvbnMgPSBwYXRoOwogICAgcGF0aCA9IHVuZGVmaW5lZDsKICAg IEVtYmVyLmFzc2VydCgiWW91IGNhbm5vdCBwYXNzIG1vcmUgdGhhbiBvbmUg YXJndW1lbnQgdG8gdGhlIGNvbGxlY3Rpb24gaGVscGVyIiwgYXJndW1lbnRz Lmxlbmd0aCA9PT0gMSk7CiAgfSBlbHNlIHsKICAgIEVtYmVyLmFzc2VydCgi WW91IGNhbm5vdCBwYXNzIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQgdG8gdGhl IGNvbGxlY3Rpb24gaGVscGVyIiwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMik7 CiAgfQoKICB2YXIgZm4gPSBvcHRpb25zLmZuOwogIHZhciBkYXRhID0gb3B0 aW9ucy5kYXRhOwogIHZhciBpbnZlcnNlID0gb3B0aW9ucy5pbnZlcnNlOwog IHZhciB2aWV3ID0gb3B0aW9ucy5kYXRhLnZpZXc7CgoKICB2YXIgY29udHJv bGxlciwgY29udGFpbmVyOwogIC8vIElmIHBhc3NlZCBhIHBhdGggc3RyaW5n LCBjb252ZXJ0IHRoYXQgaW50byBhbiBvYmplY3QuCiAgLy8gT3RoZXJ3aXNl LCBqdXN0IGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIGNsYXNzLgogIHZhciBj b2xsZWN0aW9uQ2xhc3M7CiAgaWYgKHBhdGgpIHsKICAgIGNvbnRyb2xsZXIg PSBkYXRhLmtleXdvcmRzLmNvbnRyb2xsZXI7CiAgICBjb250YWluZXIgPSBj b250cm9sbGVyICYmIGNvbnRyb2xsZXIuY29udGFpbmVyOwogICAgY29sbGVj dGlvbkNsYXNzID0gaGFuZGxlYmFyc0dldCh0aGlzLCBwYXRoLCBvcHRpb25z KSB8fCBjb250YWluZXIubG9va3VwRmFjdG9yeSgndmlldzonICsgcGF0aCk7 IAogICAgRW1iZXIuYXNzZXJ0KGZtdCgiJUAgI2NvbGxlY3Rpb246IENvdWxk IG5vdCBmaW5kIGNvbGxlY3Rpb24gY2xhc3MgJUAiLCBbZGF0YS52aWV3LCBw YXRoXSksICEhY29sbGVjdGlvbkNsYXNzKTsKICB9CiAgZWxzZSB7CiAgICBj b2xsZWN0aW9uQ2xhc3MgPSBFbWJlci5Db2xsZWN0aW9uVmlldzsKICB9Cgog IHZhciBoYXNoID0gb3B0aW9ucy5oYXNoLCBpdGVtSGFzaCA9IHt9LCBtYXRj aDsKCiAgLy8gRXh0cmFjdCBpdGVtIHZpZXcgY2xhc3MgaWYgcHJvdmlkZWQg ZWxzZSBkZWZhdWx0IHRvIHRoZSBzdGFuZGFyZCBjbGFzcwogIHZhciBjb2xs ZWN0aW9uUHJvdG90eXBlID0gY29sbGVjdGlvbkNsYXNzLnByb3RvKCksCiAg ICAgIGl0ZW1WaWV3Q2xhc3M7CgogIGlmIChoYXNoLml0ZW1WaWV3KSB7CiAg ICBjb250cm9sbGVyID0gZGF0YS5rZXl3b3Jkcy5jb250cm9sbGVyOwogICAg RW1iZXIuYXNzZXJ0KCdZb3Ugc3BlY2lmaWVkIGFuIGl0ZW1WaWV3LCBidXQg dGhlIGN1cnJlbnQgY29udGV4dCBoYXMgbm8gJyArCiAgICAgICAgICAgICAg ICAgJ2NvbnRhaW5lciB0byBsb29rIHRoZSBpdGVtVmlldyB1cCBpbi4gVGhp cyBwcm9iYWJseSBtZWFucyAnICsKICAgICAgICAgICAgICAgICAndGhhdCB5 b3UgY3JlYXRlZCBhIHZpZXcgbWFudWFsbHksIGluc3RlYWQgb2YgdGhyb3Vn aCB0aGUgJyArCiAgICAgICAgICAgICAgICAgJ2NvbnRhaW5lci4gSW5zdGVh ZCwgdXNlIGNvbnRhaW5lci5sb29rdXAoInZpZXc6dmlld05hbWUiKSwgJyAr CiAgICAgICAgICAgICAgICAgJ3doaWNoIHdpbGwgcHJvcGVybHkgaW5zdGFu dGlhdGUgeW91ciB2aWV3LicsCiAgICAgICAgICAgICAgICAgY29udHJvbGxl ciAmJiBjb250cm9sbGVyLmNvbnRhaW5lcik7CiAgICBjb250YWluZXIgPSBj b250cm9sbGVyLmNvbnRhaW5lcjsKICAgIGl0ZW1WaWV3Q2xhc3MgPSBjb250 YWluZXIubG9va3VwRmFjdG9yeSgndmlldzonICsgaGFzaC5pdGVtVmlldyk7 CiAgICBFbWJlci5hc3NlcnQoJ1lvdSBzcGVjaWZpZWQgdGhlIGl0ZW1WaWV3 ICcgKyBoYXNoLml0ZW1WaWV3ICsgIiwgYnV0IGl0IHdhcyAiICsKICAgICAg ICAgICAgICAgICAibm90IGZvdW5kIGF0ICIgKyBjb250YWluZXIuZGVzY3Jp YmUoInZpZXc6IiArIGhhc2guaXRlbVZpZXcpICsKICAgICAgICAgICAgICAg ICAiIChhbmQgaXQgd2FzIG5vdCByZWdpc3RlcmVkIGluIHRoZSBjb250YWlu ZXIpIiwgISFpdGVtVmlld0NsYXNzKTsKICB9IGVsc2UgaWYgKGhhc2guaXRl bVZpZXdDbGFzcykgewogICAgaXRlbVZpZXdDbGFzcyA9IGhhbmRsZWJhcnNH ZXQoY29sbGVjdGlvblByb3RvdHlwZSwgaGFzaC5pdGVtVmlld0NsYXNzLCBv cHRpb25zKTsKICB9IGVsc2UgewogICAgaXRlbVZpZXdDbGFzcyA9IGNvbGxl Y3Rpb25Qcm90b3R5cGUuaXRlbVZpZXdDbGFzczsKICB9CgogIEVtYmVyLmFz c2VydChmbXQoIiVAICNjb2xsZWN0aW9uOiBDb3VsZCBub3QgZmluZCBpdGVt Vmlld0NsYXNzICVAIiwgW2RhdGEudmlldywgaXRlbVZpZXdDbGFzc10pLCAh IWl0ZW1WaWV3Q2xhc3MpOwoKICBkZWxldGUgaGFzaC5pdGVtVmlld0NsYXNz OwogIGRlbGV0ZSBoYXNoLml0ZW1WaWV3OwoKICAvLyBHbyB0aHJvdWdoIG9w dGlvbnMgcGFzc2VkIHRvIHRoZSB7e2NvbGxlY3Rpb259fSBoZWxwZXIgYW5k IGV4dHJhY3Qgb3B0aW9ucwogIC8vIHRoYXQgY29uZmlndXJlIGl0ZW0gdmll d3MgaW5zdGVhZCBvZiB0aGUgY29sbGVjdGlvbiBpdHNlbGYuCiAgZm9yICh2 YXIgcHJvcCBpbiBoYXNoKSB7CiAgICBpZiAoaGFzaC5oYXNPd25Qcm9wZXJ0 eShwcm9wKSkgewogICAgICBtYXRjaCA9IHByb3AubWF0Y2goL15pdGVtKC4p KC4qKSQvKTsKCiAgICAgIGlmIChtYXRjaCAmJiBwcm9wICE9PSAnaXRlbUNv bnRyb2xsZXInKSB7CiAgICAgICAgLy8gQ29udmVydCBpdGVtU2hvdWxkRm9v IC0+IHNob3VsZEZvbwogICAgICAgIGl0ZW1IYXNoW21hdGNoWzFdLnRvTG93 ZXJDYXNlKCkgKyBtYXRjaFsyXV0gPSBoYXNoW3Byb3BdOwogICAgICAgIC8v IERlbGV0ZSBmcm9tIGhhc2ggYXMgdGhpcyB3aWxsIGVuZCB1cCBnZXR0aW5n IHBhc3NlZCB0byB0aGUKICAgICAgICAvLyB7e3ZpZXd9fSBoZWxwZXIgbWV0 aG9kLgogICAgICAgIGRlbGV0ZSBoYXNoW3Byb3BdOwogICAgICB9CiAgICB9 CiAgfQoKICBpZiAoZm4pIHsKICAgIGl0ZW1IYXNoLnRlbXBsYXRlID0gZm47 CiAgICBkZWxldGUgb3B0aW9ucy5mbjsKICB9CgogIHZhciBlbXB0eVZpZXdD bGFzczsKICBpZiAoaW52ZXJzZSAmJiBpbnZlcnNlICE9PSBFbWJlci5IYW5k bGViYXJzLlZNLm5vb3ApIHsKICAgIGVtcHR5Vmlld0NsYXNzID0gZ2V0KGNv bGxlY3Rpb25Qcm90b3R5cGUsICdlbXB0eVZpZXdDbGFzcycpOwogICAgZW1w dHlWaWV3Q2xhc3MgPSBlbXB0eVZpZXdDbGFzcy5leHRlbmQoewogICAgICAg ICAgdGVtcGxhdGU6IGludmVyc2UsCiAgICAgICAgICB0YWdOYW1lOiBpdGVt SGFzaC50YWdOYW1lCiAgICB9KTsKICB9IGVsc2UgaWYgKGhhc2guZW1wdHlW aWV3Q2xhc3MpIHsKICAgIGVtcHR5Vmlld0NsYXNzID0gaGFuZGxlYmFyc0dl dCh0aGlzLCBoYXNoLmVtcHR5Vmlld0NsYXNzLCBvcHRpb25zKTsKICB9CiAg aWYgKGVtcHR5Vmlld0NsYXNzKSB7IGhhc2guZW1wdHlWaWV3ID0gZW1wdHlW aWV3Q2xhc3M7IH0KCiAgaWYgKCFoYXNoLmtleXdvcmQpIHsKICAgIGl0ZW1I YXNoLl9jb250ZXh0ID0gRW1iZXIuY29tcHV0ZWQuYWxpYXMoJ2NvbnRlbnQn KTsKICB9CgogIHZhciB2aWV3T3B0aW9ucyA9IEVtYmVyLkhhbmRsZWJhcnMu Vmlld0hlbHBlci5wcm9wZXJ0aWVzRnJvbUhUTUxPcHRpb25zKHsgZGF0YTog ZGF0YSwgaGFzaDogaXRlbUhhc2ggfSwgdGhpcyk7CiAgaGFzaC5pdGVtVmll d0NsYXNzID0gaXRlbVZpZXdDbGFzcy5leHRlbmQodmlld09wdGlvbnMpOwoK ICByZXR1cm4gRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzLnZpZXcuY2FsbCh0 aGlzLCBjb2xsZWN0aW9uQ2xhc3MsIG9wdGlvbnMpOwp9KTsKCgp9KSgpOwoK CgooZnVuY3Rpb24oKSB7Ci8qZ2xvYmFscyBIYW5kbGViYXJzICovCi8qKgpA bW9kdWxlIGVtYmVyCkBzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycwoqLwoK dmFyIGhhbmRsZWJhcnNHZXQgPSBFbWJlci5IYW5kbGViYXJzLmdldDsKCi8q KgogIGB1bmJvdW5kYCBhbGxvd3MgeW91IHRvIG91dHB1dCBhIHByb3BlcnR5 IHdpdGhvdXQgYmluZGluZy4gKkltcG9ydGFudDoqIFRoZQogIG91dHB1dCB3 aWxsIG5vdCBiZSB1cGRhdGVkIGlmIHRoZSBwcm9wZXJ0eSBjaGFuZ2VzLiBV c2Ugd2l0aCBjYXV0aW9uLgoKICBgYGBoYW5kbGViYXJzCiAgPGRpdj57e3Vu Ym91bmQgc29tZVByb3BlcnR5VGhhdERvZXNudENoYW5nZX19PC9kaXY+CiAg YGBgCgogIGB1bmJvdW5kYCBjYW4gYWxzbyBiZSB1c2VkIGluIGNvbmp1bmN0 aW9uIHdpdGggYSBib3VuZCBoZWxwZXIgdG8KICByZW5kZXIgaXQgaW4gaXRz IHVuYm91bmQgZm9ybToKCiAgYGBgaGFuZGxlYmFycwogIDxkaXY+e3t1bmJv dW5kIGhlbHBlck5hbWUgc29tZVByb3BlcnR5VGhhdERvZXNudENoYW5nZX19 PC9kaXY+CiAgYGBgCgogIEBtZXRob2QgdW5ib3VuZAogIEBmb3IgRW1iZXIu SGFuZGxlYmFycy5oZWxwZXJzCiAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5 CiAgQHJldHVybiB7U3RyaW5nfSBIVE1MIHN0cmluZwoqLwpFbWJlci5IYW5k bGViYXJzLnJlZ2lzdGVySGVscGVyKCd1bmJvdW5kJywgZnVuY3Rpb24gdW5i b3VuZEhlbHBlcihwcm9wZXJ0eSwgZm4pIHsKICB2YXIgb3B0aW9ucyA9IGFy Z3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV0sIGhlbHBlciwgY29udGV4 dCwgb3V0OwoKICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHsKICAgIC8v IFVuYm91bmQgaGVscGVyIGNhbGwuCiAgICBvcHRpb25zLmRhdGEuaXNVbmJv dW5kID0gdHJ1ZTsKICAgIGhlbHBlciA9IEVtYmVyLkhhbmRsZWJhcnMuaGVs cGVyc1thcmd1bWVudHNbMF1dIHx8IEVtYmVyLkhhbmRsZWJhcnMuaGVscGVy cy5oZWxwZXJNaXNzaW5nOwogICAgb3V0ID0gaGVscGVyLmFwcGx5KHRoaXMs IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOwog ICAgZGVsZXRlIG9wdGlvbnMuZGF0YS5pc1VuYm91bmQ7CiAgICByZXR1cm4g b3V0OwogIH0KCiAgY29udGV4dCA9IChmbi5jb250ZXh0cyAmJiBmbi5jb250 ZXh0cy5sZW5ndGgpID8gZm4uY29udGV4dHNbMF0gOiB0aGlzOwogIHJldHVy biBoYW5kbGViYXJzR2V0KGNvbnRleHQsIHByb3BlcnR5LCBmbik7Cn0pOwoK fSkoKTsKCgoKKGZ1bmN0aW9uKCkgewovKmpzaGludCBkZWJ1Zzp0cnVlKi8K LyoqCkBtb2R1bGUgZW1iZXIKQHN1Ym1vZHVsZSBlbWJlci1oYW5kbGViYXJz CiovCgp2YXIgZ2V0ID0gRW1iZXIuZ2V0Owp2YXIgaGFuZGxlYmFyc0dldCA9 IEVtYmVyLkhhbmRsZWJhcnMuZ2V0LCBub3JtYWxpemVQYXRoID0gRW1iZXIu SGFuZGxlYmFycy5ub3JtYWxpemVQYXRoOwp2YXIgYV9zbGljZSA9IFtdLnNs aWNlOwoKLyoqCiAgYGxvZ2AgYWxsb3dzIHlvdSB0byBvdXRwdXQgdGhlIHZh bHVlIG9mIHZhcmlhYmxlcyBpbiB0aGUgY3VycmVudCByZW5kZXJpbmcKICBj b250ZXh0LiBgbG9nYCBhbHNvIGFjY2VwdHMgcHJpbWl0aXZlIHR5cGVzIHN1 Y2ggYXMgc3RyaW5ncyBvciBudW1iZXJzLgoKICBgYGBoYW5kbGViYXJzCiAg e3tsb2cgIm15VmFyaWFibGU6IiBteVZhcmlhYmxlIH19CiAgYGBgCgogIEBt ZXRob2QgbG9nCiAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMKICBA cGFyYW0ge1N0cmluZ30gcHJvcGVydHkKKi8KRW1iZXIuSGFuZGxlYmFycy5y ZWdpc3RlckhlbHBlcignbG9nJywgZnVuY3Rpb24gbG9nSGVscGVyKCkgewog IHZhciBwYXJhbXMgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzLCAwLCAtMSks CiAgICAgIG9wdGlvbnMgPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAt IDFdLAogICAgICBsb2dnZXIgPSBFbWJlci5Mb2dnZXIubG9nLAogICAgICB2 YWx1ZXMgPSBbXSwKICAgICAgYWxsb3dQcmltaXRpdmVzID0gZmFsc2U7Cgog IAogICAgYWxsb3dQcmltaXRpdmVzID0gdHJ1ZTsKICAKCiAgZm9yICh2YXIg aSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKICAgIHZhciB0eXBl ID0gb3B0aW9ucy50eXBlc1tpXTsKCiAgICBpZiAodHlwZSA9PT0gJ0lEJyB8 fCAhYWxsb3dQcmltaXRpdmVzKSB7CiAgICAgIHZhciBjb250ZXh0ID0gKG9w dGlvbnMuY29udGV4dHMgJiYgb3B0aW9ucy5jb250ZXh0c1tpXSkgfHwgdGhp cywKICAgICAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVQYXRoKGNvbnRl eHQsIHBhcmFtc1tpXSwgb3B0aW9ucy5kYXRhKTsKCiAgICAgIGlmIChub3Jt YWxpemVkLnBhdGggPT09ICd0aGlzJykgewogICAgICAgIHZhbHVlcy5wdXNo KG5vcm1hbGl6ZWQucm9vdCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFs dWVzLnB1c2goaGFuZGxlYmFyc0dldChub3JtYWxpemVkLnJvb3QsIG5vcm1h bGl6ZWQucGF0aCwgb3B0aW9ucykpOwogICAgICB9CiAgICB9IGVsc2Ugewog ICAgICB2YWx1ZXMucHVzaChwYXJhbXNbaV0pOwogICAgfQogIH0KCiAgbG9n Z2VyLmFwcGx5KGxvZ2dlciwgdmFsdWVzKTsKfSk7CgovKioKICBFeGVjdXRl IHRoZSBgZGVidWdnZXJgIHN0YXRlbWVudCBpbiB0aGUgY3VycmVudCBjb250 ZXh0LgoKICBgYGBoYW5kbGViYXJzCiAge3tkZWJ1Z2dlcn19CiAgYGBgCgog IEJlZm9yZSBpbnZva2luZyB0aGUgYGRlYnVnZ2VyYCBzdGF0ZW1lbnQsIHRo ZXJlCiAgYXJlIGEgZmV3IGhlbHBmdWwgdmFyaWFibGVzIGRlZmluZWQgaW4g dGhlCiAgYm9keSBvZiB0aGlzIGhlbHBlciB0aGF0IHlvdSBjYW4gaW5zcGVj dCB3aGlsZQogIGRlYnVnZ2luZyB0aGF0IGRlc2NyaWJlIGhvdyBhbmQgd2hl cmUgdGhpcwogIGhlbHBlciB3YXMgaW52b2tlZDoKCiAgLSB0ZW1wbGF0ZUNv bnRleHQ6IHRoaXMgaXMgbW9zdCBsaWtlbHkgYSBjb250cm9sbGVyCiAgICBm cm9tIHdoaWNoIHRoaXMgdGVtcGxhdGUgbG9va3MgdXAgLyBkaXNwbGF5cyBw cm9wZXJ0aWVzCiAgLSB0eXBlT2ZUZW1wbGF0ZUNvbnRleHQ6IGEgc3RyaW5n IGRlc2NyaXB0aW9uIG9mCiAgICB3aGF0IHRoZSB0ZW1wbGF0ZUNvbnRleHQg aXMKCiAgRm9yIGV4YW1wbGUsIGlmIHlvdSdyZSB3b25kZXJpbmcgd2h5IGEg dmFsdWUgYHt7Zm9vfX1gCiAgaXNuJ3QgcmVuZGVyaW5nIGFzIGV4cGVjdGVk IHdpdGhpbiBhIHRlbXBsYXRlLCB5b3UKICBjb3VsZCBwbGFjZSBhIGB7e2Rl YnVnZ2VyfX1gIHN0YXRlbWVudCwgYW5kIHdoZW4KICB0aGUgYGRlYnVnZ2Vy O2AgYnJlYWtwb2ludCBpcyBoaXQsIHlvdSBjYW4gaW5zcGVjdAogIGB0ZW1w bGF0ZUNvbnRleHRgLCBkZXRlcm1pbmUgaWYgaXQncyB0aGUgb2JqZWN0IHlv dQogIGV4cGVjdCwgYW5kL29yIGV2YWx1YXRlIGV4cHJlc3Npb25zIGluIHRo ZSBjb25zb2xlCiAgdG8gcGVyZm9ybSBwcm9wZXJ0eSBsb29rdXBzIG9uIHRo ZSBgdGVtcGxhdGVDb250ZXh0YDoKCiAgYGBgCiAgICA+IHRlbXBsYXRlQ29u dGV4dC5nZXQoJ2ZvbycpIC8vIC0+ICI8dmFsdWUgb2Yge3tmb299fT4iCiAg YGBgCgogIEBtZXRob2QgZGVidWdnZXIKICBAZm9yIEVtYmVyLkhhbmRsZWJh cnMuaGVscGVycwogIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eQoqLwpFbWJl ci5IYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdkZWJ1Z2dlcicsIGZ1bmN0 aW9uIGRlYnVnZ2VySGVscGVyKG9wdGlvbnMpIHsKCiAgLy8gVGhlc2UgYXJl IGhlbHBmdWwgdmFsdWVzIHlvdSBjYW4gaW5zcGVjdCB3aGlsZSBkZWJ1Z2dp bmcuCiAgdmFyIHRlbXBsYXRlQ29udGV4dCA9IHRoaXM7CiAgdmFyIHR5cGVP ZlRlbXBsYXRlQ29udGV4dCA9IEVtYmVyLmluc3BlY3QodGVtcGxhdGVDb250 ZXh0KTsKCiAgZGVidWdnZXI7Cn0pOwoKCgp9KSgpOwoKCgooZnVuY3Rpb24o KSB7Ci8qKgpAbW9kdWxlIGVtYmVyCkBzdWJtb2R1bGUgZW1iZXItaGFuZGxl YmFycwoqLwoKdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0 Owp2YXIgZm10ID0gRW1iZXIuU3RyaW5nLmZtdDsKCkVtYmVyLkhhbmRsZWJh cnMuRWFjaFZpZXcgPSBFbWJlci5Db2xsZWN0aW9uVmlldy5leHRlbmQoRW1i ZXIuX01ldGFtb3JwaCwgewogIGluaXQ6IGZ1bmN0aW9uKCkgewogICAgdmFy IGl0ZW1Db250cm9sbGVyID0gZ2V0KHRoaXMsICdpdGVtQ29udHJvbGxlcicp OwogICAgdmFyIGJpbmRpbmc7CgogICAgaWYgKGl0ZW1Db250cm9sbGVyKSB7 CiAgICAgIHZhciBjb250cm9sbGVyID0gZ2V0KHRoaXMsICdjb250cm9sbGVy LmNvbnRhaW5lcicpLmxvb2t1cEZhY3RvcnkoJ2NvbnRyb2xsZXI6YXJyYXkn KS5jcmVhdGUoewogICAgICAgIF9pc1ZpcnR1YWw6IHRydWUsCiAgICAgICAg cGFyZW50Q29udHJvbGxlcjogZ2V0KHRoaXMsICdjb250cm9sbGVyJyksCiAg ICAgICAgaXRlbUNvbnRyb2xsZXI6IGl0ZW1Db250cm9sbGVyLAogICAgICAg IHRhcmdldDogZ2V0KHRoaXMsICdjb250cm9sbGVyJyksCiAgICAgICAgX2Vh Y2hWaWV3OiB0aGlzCiAgICAgIH0pOwoKICAgICAgdGhpcy5kaXNhYmxlQ29u dGVudE9ic2VydmVycyhmdW5jdGlvbigpIHsKICAgICAgICBzZXQodGhpcywg J2NvbnRlbnQnLCBjb250cm9sbGVyKTsKICAgICAgICBiaW5kaW5nID0gbmV3 IEVtYmVyLkJpbmRpbmcoJ2NvbnRlbnQnLCAnX2VhY2hWaWV3LmRhdGFTb3Vy Y2UnKS5vbmVXYXkoKTsKICAgICAgICBiaW5kaW5nLmNvbm5lY3QoY29udHJv bGxlcik7CiAgICAgIH0pOwoKICAgICAgc2V0KHRoaXMsICdfYXJyYXlDb250 cm9sbGVyJywgY29udHJvbGxlcik7CiAgICB9IGVsc2UgewogICAgICB0aGlz LmRpc2FibGVDb250ZW50T2JzZXJ2ZXJzKGZ1bmN0aW9uKCkgewogICAgICAg IGJpbmRpbmcgPSBuZXcgRW1iZXIuQmluZGluZygnY29udGVudCcsICdkYXRh U291cmNlJykub25lV2F5KCk7CiAgICAgICAgYmluZGluZy5jb25uZWN0KHRo aXMpOwogICAgICB9KTsKICAgIH0KCiAgICByZXR1cm4gdGhpcy5fc3VwZXIo KTsKICB9LAoKICBfYXNzZXJ0QXJyYXlMaWtlOiBmdW5jdGlvbihjb250ZW50 KSB7CiAgICBFbWJlci5hc3NlcnQoZm10KCJUaGUgdmFsdWUgdGhhdCAjZWFj aCBsb29wcyBvdmVyIG11c3QgYmUgYW4gQXJyYXkuIFlvdSAiICsKICAgICAg ICAgICAgICAgICAgICAgInBhc3NlZCAlQCwgYnV0IGl0IHNob3VsZCBoYXZl IGJlZW4gYW4gQXJyYXlDb250cm9sbGVyIiwKICAgICAgICAgICAgICAgICAg ICAgW2NvbnRlbnQuY29uc3RydWN0b3JdKSwKICAgICAgICAgICAgICAgICAg ICAgIUVtYmVyLkNvbnRyb2xsZXJNaXhpbi5kZXRlY3QoY29udGVudCkgfHwK ICAgICAgICAgICAgICAgICAgICAgICAoY29udGVudCAmJiBjb250ZW50Lmlz R2VuZXJhdGVkKSB8fAogICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQg aW5zdGFuY2VvZiBFbWJlci5BcnJheUNvbnRyb2xsZXIpOwogICAgRW1iZXIu YXNzZXJ0KGZtdCgiVGhlIHZhbHVlIHRoYXQgI2VhY2ggbG9vcHMgb3ZlciBt dXN0IGJlIGFuIEFycmF5LiBZb3UgcGFzc2VkICVAIiwgWyhFbWJlci5Db250 cm9sbGVyTWl4aW4uZGV0ZWN0KGNvbnRlbnQpICYmIGNvbnRlbnQuZ2V0KCdt b2RlbCcpICE9PSB1bmRlZmluZWQpID8gZm10KCInJUAnICh3cmFwcGVkIGlu ICVAKSIsIFtjb250ZW50LmdldCgnbW9kZWwnKSwgY29udGVudF0pIDogY29u dGVudF0pLCBFbWJlci5BcnJheS5kZXRlY3QoY29udGVudCkpOwogIH0sCgog IGRpc2FibGVDb250ZW50T2JzZXJ2ZXJzOiBmdW5jdGlvbihjYWxsYmFjaykg ewogICAgRW1iZXIucmVtb3ZlQmVmb3JlT2JzZXJ2ZXIodGhpcywgJ2NvbnRl bnQnLCBudWxsLCAnX2NvbnRlbnRXaWxsQ2hhbmdlJyk7CiAgICBFbWJlci5y ZW1vdmVPYnNlcnZlcih0aGlzLCAnY29udGVudCcsIG51bGwsICdfY29udGVu dERpZENoYW5nZScpOwoKICAgIGNhbGxiYWNrLmNhbGwodGhpcyk7CgogICAg RW1iZXIuYWRkQmVmb3JlT2JzZXJ2ZXIodGhpcywgJ2NvbnRlbnQnLCBudWxs LCAnX2NvbnRlbnRXaWxsQ2hhbmdlJyk7CiAgICBFbWJlci5hZGRPYnNlcnZl cih0aGlzLCAnY29udGVudCcsIG51bGwsICdfY29udGVudERpZENoYW5nZScp OwogIH0sCgogIGl0ZW1WaWV3Q2xhc3M6IEVtYmVyLl9NZXRhbW9ycGhWaWV3 LAogIGVtcHR5Vmlld0NsYXNzOiBFbWJlci5fTWV0YW1vcnBoVmlldywKCiAg Y3JlYXRlQ2hpbGRWaWV3OiBmdW5jdGlvbih2aWV3LCBhdHRycykgewogICAg dmlldyA9IHRoaXMuX3N1cGVyKHZpZXcsIGF0dHJzKTsKCiAgICAvLyBBdCB0 aGUgbW9tZW50LCBpZiBhIGNvbnRhaW5lciB2aWV3IHN1YmNsYXNzIHdhbnRz CiAgICAvLyB0byBpbnNlcnQga2V5d29yZHMsIGl0IGlzIHJlc3BvbnNpYmxl IGZvciBjbG9uaW5nCiAgICAvLyB0aGUga2V5d29yZHMgaGFzaC4gVGhpcyB3 aWxsIGJlIGZpeGVkIG1vbWVudGFyaWx5LgogICAgdmFyIGtleXdvcmQgPSBn ZXQodGhpcywgJ2tleXdvcmQnKTsKICAgIHZhciBjb250ZW50ID0gZ2V0KHZp ZXcsICdjb250ZW50Jyk7CgogICAgaWYgKGtleXdvcmQpIHsKICAgICAgdmFy IGRhdGEgPSBnZXQodmlldywgJ3RlbXBsYXRlRGF0YScpOwoKICAgICAgZGF0 YSA9IEVtYmVyLmNvcHkoZGF0YSk7CiAgICAgIGRhdGEua2V5d29yZHMgPSB2 aWV3LmNsb25lS2V5d29yZHMoKTsKICAgICAgc2V0KHZpZXcsICd0ZW1wbGF0 ZURhdGEnLCBkYXRhKTsKCiAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgZG8g bm90IGJpbmQsIGJlY2F1c2UgdGhlIGBjb250ZW50YCBvZgogICAgICAvLyBh ICNlYWNoIGl0ZW0gY2Fubm90IGNoYW5nZS4KICAgICAgZGF0YS5rZXl3b3Jk c1trZXl3b3JkXSA9IGNvbnRlbnQ7CiAgICB9CgogICAgLy8gSWYge3sjZWFj aH19IGlzIGxvb3Bpbmcgb3ZlciBhbiBhcnJheSBvZiBjb250cm9sbGVycywK ICAgIC8vIHBvaW50IGVhY2ggY2hpbGQgdmlldyBhdCB0aGVpciByZXNwZWN0 aXZlIGNvbnRyb2xsZXIuCiAgICBpZiAoY29udGVudCAmJiBjb250ZW50Lmlz Q29udHJvbGxlcikgewogICAgICBzZXQodmlldywgJ2NvbnRyb2xsZXInLCBj b250ZW50KTsKICAgIH0KCiAgICByZXR1cm4gdmlldzsKICB9LAoKICBkZXN0 cm95OiBmdW5jdGlvbigpIHsKICAgIGlmICghdGhpcy5fc3VwZXIoKSkgeyBy ZXR1cm47IH0KCiAgICB2YXIgYXJyYXlDb250cm9sbGVyID0gZ2V0KHRoaXMs ICdfYXJyYXlDb250cm9sbGVyJyk7CgogICAgaWYgKGFycmF5Q29udHJvbGxl cikgewogICAgICBhcnJheUNvbnRyb2xsZXIuZGVzdHJveSgpOwogICAgfQoK ICAgIHJldHVybiB0aGlzOwogIH0KfSk7Cgp2YXIgR3JvdXBlZEVhY2ggPSBF bWJlci5IYW5kbGViYXJzLkdyb3VwZWRFYWNoID0gZnVuY3Rpb24oY29udGV4 dCwgcGF0aCwgb3B0aW9ucykgewogIHZhciBzZWxmID0gdGhpcywKICAgICAg bm9ybWFsaXplZCA9IEVtYmVyLkhhbmRsZWJhcnMubm9ybWFsaXplUGF0aChj b250ZXh0LCBwYXRoLCBvcHRpb25zLmRhdGEpOwoKICB0aGlzLmNvbnRleHQg PSBjb250ZXh0OwogIHRoaXMucGF0aCA9IHBhdGg7CiAgdGhpcy5vcHRpb25z ID0gb3B0aW9uczsKICB0aGlzLnRlbXBsYXRlID0gb3B0aW9ucy5mbjsKICB0 aGlzLmNvbnRhaW5pbmdWaWV3ID0gb3B0aW9ucy5kYXRhLnZpZXc7CiAgdGhp cy5ub3JtYWxpemVkUm9vdCA9IG5vcm1hbGl6ZWQucm9vdDsKICB0aGlzLm5v cm1hbGl6ZWRQYXRoID0gbm9ybWFsaXplZC5wYXRoOwogIHRoaXMuY29udGVu dCA9IHRoaXMubG9va3VwQ29udGVudCgpOwoKICB0aGlzLmFkZENvbnRlbnRP YnNlcnZlcnMoKTsKICB0aGlzLmFkZEFycmF5T2JzZXJ2ZXJzKCk7CgogIHRo aXMuY29udGFpbmluZ1ZpZXcub24oJ3dpbGxDbGVhclJlbmRlcicsIGZ1bmN0 aW9uKCkgewogICAgc2VsZi5kZXN0cm95KCk7CiAgfSk7Cn07CgpHcm91cGVk RWFjaC5wcm90b3R5cGUgPSB7CiAgY29udGVudFdpbGxDaGFuZ2U6IGZ1bmN0 aW9uKCkgewogICAgdGhpcy5yZW1vdmVBcnJheU9ic2VydmVycygpOwogIH0s CgogIGNvbnRlbnREaWRDaGFuZ2U6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5j b250ZW50ID0gdGhpcy5sb29rdXBDb250ZW50KCk7CiAgICB0aGlzLmFkZEFy cmF5T2JzZXJ2ZXJzKCk7CiAgICB0aGlzLnJlcmVuZGVyQ29udGFpbmluZ1Zp ZXcoKTsKICB9LAoKICBjb250ZW50QXJyYXlXaWxsQ2hhbmdlOiBFbWJlci5L LAoKICBjb250ZW50QXJyYXlEaWRDaGFuZ2U6IGZ1bmN0aW9uKCkgewogICAg dGhpcy5yZXJlbmRlckNvbnRhaW5pbmdWaWV3KCk7CiAgfSwKCiAgbG9va3Vw Q29udGVudDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gRW1iZXIuSGFuZGxl YmFycy5nZXQodGhpcy5ub3JtYWxpemVkUm9vdCwgdGhpcy5ub3JtYWxpemVk UGF0aCwgdGhpcy5vcHRpb25zKTsKICB9LAoKICBhZGRBcnJheU9ic2VydmVy czogZnVuY3Rpb24oKSB7CiAgICBpZiAoIXRoaXMuY29udGVudCkgeyByZXR1 cm47IH0KCiAgICB0aGlzLmNvbnRlbnQuYWRkQXJyYXlPYnNlcnZlcih0aGlz LCB7CiAgICAgIHdpbGxDaGFuZ2U6ICdjb250ZW50QXJyYXlXaWxsQ2hhbmdl JywKICAgICAgZGlkQ2hhbmdlOiAnY29udGVudEFycmF5RGlkQ2hhbmdlJwog ICAgfSk7CiAgfSwKCiAgcmVtb3ZlQXJyYXlPYnNlcnZlcnM6IGZ1bmN0aW9u KCkgewogICAgaWYgKCF0aGlzLmNvbnRlbnQpIHsgcmV0dXJuOyB9CgogICAg dGhpcy5jb250ZW50LnJlbW92ZUFycmF5T2JzZXJ2ZXIodGhpcywgewogICAg ICB3aWxsQ2hhbmdlOiAnY29udGVudEFycmF5V2lsbENoYW5nZScsCiAgICAg IGRpZENoYW5nZTogJ2NvbnRlbnRBcnJheURpZENoYW5nZScKICAgIH0pOwog IH0sCgogIGFkZENvbnRlbnRPYnNlcnZlcnM6IGZ1bmN0aW9uKCkgewogICAg RW1iZXIuYWRkQmVmb3JlT2JzZXJ2ZXIodGhpcy5ub3JtYWxpemVkUm9vdCwg dGhpcy5ub3JtYWxpemVkUGF0aCwgdGhpcywgdGhpcy5jb250ZW50V2lsbENo YW5nZSk7CiAgICBFbWJlci5hZGRPYnNlcnZlcih0aGlzLm5vcm1hbGl6ZWRS b290LCB0aGlzLm5vcm1hbGl6ZWRQYXRoLCB0aGlzLCB0aGlzLmNvbnRlbnRE aWRDaGFuZ2UpOwogIH0sCgogIHJlbW92ZUNvbnRlbnRPYnNlcnZlcnM6IGZ1 bmN0aW9uKCkgewogICAgRW1iZXIucmVtb3ZlQmVmb3JlT2JzZXJ2ZXIodGhp cy5ub3JtYWxpemVkUm9vdCwgdGhpcy5ub3JtYWxpemVkUGF0aCwgdGhpcy5j b250ZW50V2lsbENoYW5nZSk7CiAgICBFbWJlci5yZW1vdmVPYnNlcnZlcih0 aGlzLm5vcm1hbGl6ZWRSb290LCB0aGlzLm5vcm1hbGl6ZWRQYXRoLCB0aGlz LmNvbnRlbnREaWRDaGFuZ2UpOwogIH0sCgogIHJlbmRlcjogZnVuY3Rpb24o KSB7CiAgICBpZiAoIXRoaXMuY29udGVudCkgeyByZXR1cm47IH0KCiAgICB2 YXIgY29udGVudCA9IHRoaXMuY29udGVudCwKICAgICAgICBjb250ZW50TGVu Z3RoID0gZ2V0KGNvbnRlbnQsICdsZW5ndGgnKSwKICAgICAgICBkYXRhID0g dGhpcy5vcHRpb25zLmRhdGEsCiAgICAgICAgdGVtcGxhdGUgPSB0aGlzLnRl bXBsYXRlOwoKICAgIGRhdGEuaW5zaWRlRWFjaCA9IHRydWU7CiAgICBmb3Ig KHZhciBpID0gMDsgaSA8IGNvbnRlbnRMZW5ndGg7IGkrKykgewogICAgICB0 ZW1wbGF0ZShjb250ZW50Lm9iamVjdEF0KGkpLCB7IGRhdGE6IGRhdGEgfSk7 CiAgICB9CiAgfSwKCiAgcmVyZW5kZXJDb250YWluaW5nVmlldzogZnVuY3Rp b24oKSB7CiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICBFbWJlci5ydW4uc2No ZWR1bGVPbmNlKCdyZW5kZXInLCB0aGlzLCBmdW5jdGlvbigpIHsKICAgICAg Ly8gSXQncyBwb3NzaWJsZSBpdCdzIGJlZW4gZGVzdHJveWVkIGFmdGVyIHdl IGVucXVldWVkIGEgcmUtcmVuZGVyIGNhbGwuCiAgICAgIGlmICghc2VsZi5k ZXN0cm95ZWQpIHsKICAgICAgICBzZWxmLmNvbnRhaW5pbmdWaWV3LnJlcmVu ZGVyKCk7CiAgICAgIH0KICAgIH0pOwogIH0sCgogIGRlc3Ryb3k6IGZ1bmN0 aW9uKCkgewogICAgdGhpcy5yZW1vdmVDb250ZW50T2JzZXJ2ZXJzKCk7CiAg ICBpZiAodGhpcy5jb250ZW50KSB7CiAgICAgIHRoaXMucmVtb3ZlQXJyYXlP YnNlcnZlcnMoKTsKICAgIH0KICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTsK ICB9Cn07CgovKioKICBUaGUgYHt7I2VhY2h9fWAgaGVscGVyIGxvb3BzIG92 ZXIgZWxlbWVudHMgaW4gYSBjb2xsZWN0aW9uLCByZW5kZXJpbmcgaXRzCiAg YmxvY2sgb25jZSBmb3IgZWFjaCBpdGVtLiBJdCBpcyBhbiBleHRlbnNpb24g b2YgdGhlIGJhc2UgSGFuZGxlYmFycyBge3sjZWFjaH19YAogIGhlbHBlcjoK CiAgYGBgamF2YXNjcmlwdAogIERldmVsb3BlcnMgPSBbe25hbWU6ICdZZWh1 ZGEnfSx7bmFtZTogJ1RvbSd9LCB7bmFtZTogJ1BhdWwnfV07CiAgYGBgCgog IGBgYGhhbmRsZWJhcnMKICB7eyNlYWNoIERldmVsb3BlcnN9fQogICAge3tu YW1lfX0KICB7ey9lYWNofX0KICBgYGAKCiAgYHt7ZWFjaH19YCBzdXBwb3J0 cyBhbiBhbHRlcm5hdGl2ZSBzeW50YXggd2l0aCBlbGVtZW50IG5hbWluZzoK CiAgYGBgaGFuZGxlYmFycwogIHt7I2VhY2ggcGVyc29uIGluIERldmVsb3Bl cnN9fQogICAge3twZXJzb24ubmFtZX19CiAge3svZWFjaH19CiAgYGBgCgog IFdoZW4gbG9vcGluZyBvdmVyIG9iamVjdHMgdGhhdCBkbyBub3QgaGF2ZSBw cm9wZXJ0aWVzLCBge3t0aGlzfX1gIGNhbiBiZSB1c2VkCiAgdG8gcmVuZGVy IHRoZSBvYmplY3Q6CgogIGBgYGphdmFzY3JpcHQKICBEZXZlbG9wZXJOYW1l cyA9IFsnWWVodWRhJywgJ1RvbScsICdQYXVsJ10KICBgYGAKCiAgYGBgaGFu ZGxlYmFycwogIHt7I2VhY2ggRGV2ZWxvcGVyTmFtZXN9fQogICAge3t0aGlz fX0KICB7ey9lYWNofX0KICBgYGAKICAjIyMge3tlbHNlfX0gY29uZGl0aW9u CiAgYHt7I2VhY2h9fWAgY2FuIGhhdmUgYSBtYXRjaGluZyBge3tlbHNlfX1g LiBUaGUgY29udGVudHMgb2YgdGhpcyBibG9jayB3aWxsIHJlbmRlcgogIGlm IHRoZSBjb2xsZWN0aW9uIGlzIGVtcHR5LgoKICBgYGAKICB7eyNlYWNoIHBl cnNvbiBpbiBEZXZlbG9wZXJzfX0KICAgIHt7cGVyc29uLm5hbWV9fQogIHt7 ZWxzZX19CiAgICA8cD5Tb3JyeSwgbm9ib2R5IGlzIGF2YWlsYWJsZSBmb3Ig dGhpcyB0YXNrLjwvcD4KICB7ey9lYWNofX0KICBgYGAKICAjIyMgU3BlY2lm eWluZyBhIFZpZXcgY2xhc3MgZm9yIGl0ZW1zCiAgSWYgeW91IHByb3ZpZGUg YW4gYGl0ZW1WaWV3Q2xhc3NgIG9wdGlvbiB0aGF0IHJlZmVyZW5jZXMgYSB2 aWV3IGNsYXNzCiAgd2l0aCBpdHMgb3duIGB0ZW1wbGF0ZWAgeW91IGNhbiBv bWl0IHRoZSBibG9jay4KCiAgVGhlIGZvbGxvd2luZyB0ZW1wbGF0ZToKCiAg YGBgaGFuZGxlYmFycwogIHt7I3ZpZXcgQXBwLk15VmlldyB9fQogICAge3tl YWNoIHZpZXcuaXRlbXMgaXRlbVZpZXdDbGFzcz0iQXBwLkFuSXRlbVZpZXci fX0KICB7ey92aWV3fX0KICBgYGAKCiAgQW5kIGFwcGxpY2F0aW9uIGNvZGUK CiAgYGBgamF2YXNjcmlwdAogIEFwcCA9IEVtYmVyLkFwcGxpY2F0aW9uLmNy ZWF0ZSh7CiAgICBNeVZpZXc6IEVtYmVyLlZpZXcuZXh0ZW5kKHsKICAgICAg aXRlbXM6IFsKICAgICAgICBFbWJlci5PYmplY3QuY3JlYXRlKHtuYW1lOiAn RGF2ZSd9KSwKICAgICAgICBFbWJlci5PYmplY3QuY3JlYXRlKHtuYW1lOiAn TWFyeSd9KSwKICAgICAgICBFbWJlci5PYmplY3QuY3JlYXRlKHtuYW1lOiAn U2FyYSd9KQogICAgICBdCiAgICB9KQogIH0pOwoKICBBcHAuQW5JdGVtVmll dyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKICAgIHRlbXBsYXRlOiBFbWJlci5I YW5kbGViYXJzLmNvbXBpbGUoIkdyZWV0aW5ncyB7e25hbWV9fSIpCiAgfSk7 CiAgYGBgCgogIFdpbGwgcmVzdWx0IGluIHRoZSBIVE1MIHN0cnVjdHVyZSBi ZWxvdwoKICBgYGBodG1sCiAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+CiAg ICA8ZGl2IGNsYXNzPSJlbWJlci12aWV3Ij5HcmVldGluZ3MgRGF2ZTwvZGl2 PgogICAgPGRpdiBjbGFzcz0iZW1iZXItdmlldyI+R3JlZXRpbmdzIE1hcnk8 L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPkdyZWV0aW5ncyBT YXJhPC9kaXY+CiAgPC9kaXY+CiAgYGBgCgogIElmIGFuIGBpdGVtVmlld0Ns YXNzYCBpcyBkZWZpbmVkIG9uIHRoZSBoZWxwZXIsIGFuZCB0aGVyZWZvcmUg dGhlIGhlbHBlciBpcyBub3QKICBiZWluZyB1c2VkIGFzIGEgYmxvY2ssIGFu IGBlbXB0eVZpZXdDbGFzc2AgY2FuIGFsc28gYmUgcHJvdmlkZWQgb3B0aW9u YWxseS4KICBUaGUgYGVtcHR5Vmlld0NsYXNzYCB3aWxsIG1hdGNoIHRoZSBi ZWhhdmlvciBvZiB0aGUgYHt7ZWxzZX19YCBjb25kaXRpb24KICBkZXNjcmli ZWQgYWJvdmUuIFRoYXQgaXMsIHRoZSBgZW1wdHlWaWV3Q2xhc3NgIHdpbGwg cmVuZGVyIGlmIHRoZSBjb2xsZWN0aW9uCiAgaXMgZW1wdHkuCgogICMjIyBS ZXByZXNlbnRpbmcgZWFjaCBpdGVtIHdpdGggYSBDb250cm9sbGVyLgogIEJ5 IGRlZmF1bHQgdGhlIGNvbnRyb2xsZXIgbG9va3VwIHdpdGhpbiBhbiBge3sj ZWFjaH19YCBibG9jayB3aWxsIGJlCiAgdGhlIGNvbnRyb2xsZXIgb2YgdGhl IHRlbXBsYXRlIHdoZXJlIHRoZSBge3sjZWFjaH19YCB3YXMgdXNlZC4gSWYg ZWFjaAogIGl0ZW0gbmVlZHMgdG8gYmUgcHJlc2VudGVkIGJ5IGEgY3VzdG9t IGNvbnRyb2xsZXIgeW91IGNhbiBwcm92aWRlIGEKICBgaXRlbUNvbnRyb2xs ZXJgIG9wdGlvbiB3aGljaCByZWZlcmVuY2VzIGEgY29udHJvbGxlciBieSBs b29rdXAgbmFtZS4KICBFYWNoIGl0ZW0gaW4gdGhlIGxvb3Agd2lsbCBiZSB3 cmFwcGVkIGluIGFuIGluc3RhbmNlIG9mIHRoaXMgY29udHJvbGxlcgogIGFu ZCB0aGUgaXRlbSBpdHNlbGYgd2lsbCBiZSBzZXQgdG8gdGhlIGBjb250ZW50 YCBwcm9wZXJ0eSBvZiB0aGF0IGNvbnRyb2xsZXIuCgogIFRoaXMgaXMgdXNl ZnVsIGluIGNhc2VzIHdoZXJlIHByb3BlcnRpZXMgb2YgbW9kZWwgb2JqZWN0 cyBuZWVkIHRyYW5zZm9ybWF0aW9uCiAgb3Igc3ludGhlc2lzIGZvciBkaXNw bGF5OgoKICBgYGBqYXZhc2NyaXB0CiAgQXBwLkRldmVsb3BlckNvbnRyb2xs ZXIgPSBFbWJlci5PYmplY3RDb250cm9sbGVyLmV4dGVuZCh7CiAgICBpc0F2 YWlsYWJsZUZvckhpcmU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gIXRo aXMuZ2V0KCdjb250ZW50LmlzRW1wbG95ZWQnKSAmJiB0aGlzLmdldCgnY29u dGVudC5pc1NlZWtpbmdXb3JrJyk7CiAgICB9LnByb3BlcnR5KCdpc0VtcGxv eWVkJywgJ2lzU2Vla2luZ1dvcmsnKQogIH0pCiAgYGBgCgogIGBgYGhhbmRs ZWJhcnMKICB7eyNlYWNoIHBlcnNvbiBpbiBkZXZlbG9wZXJzIGl0ZW1Db250 cm9sbGVyPSJkZXZlbG9wZXIifX0KICAgIHt7cGVyc29uLm5hbWV9fSB7eyNp ZiBwZXJzb24uaXNBdmFpbGFibGVGb3JIaXJlfX1IaXJlIG1lIXt7L2lmfX0K ICB7ey9lYWNofX0KICBgYGAKCiAgRWFjaCBpdGVtQ29udHJvbGxlciB3aWxs IHJlY2VpdmUgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgY29udHJvbGxl ciBhcwogIGEgYHBhcmVudENvbnRyb2xsZXJgIHByb3BlcnR5LgoKICAjIyMg KEV4cGVyaW1lbnRhbCkgR3JvdXBlZCBFYWNoCgogIFdoZW4gdXNlZCBpbiBj b25qdW5jdGlvbiB3aXRoIHRoZSBleHBlcmltZW50YWwgW2dyb3VwIGhlbHBl cl0oaHR0cHM6Ly9naXRodWIuY29tL2VtYmVyanMvZ3JvdXAtaGVscGVyKSwK ICB5b3UgY2FuIGluZm9ybSBIYW5kbGViYXJzIHRvIHJlLXJlbmRlciBhbiBl bnRpcmUgZ3JvdXAgb2YgaXRlbXMgaW5zdGVhZCBvZgogIHJlLXJlbmRlcmlu ZyB0aGVtIG9uZSBhdCBhIHRpbWUgKGluIHRoZSBldmVudCB0aGF0IHRoZXkg YXJlIGNoYW5nZWQgZW4gbWFzc2UKICBvciBhbiBpdGVtIGlzIGFkZGVkL3Jl bW92ZWQpLgoKICBgYGBoYW5kbGViYXJzCiAge3sjZ3JvdXB9fQogICAge3sj ZWFjaCBwZW9wbGV9fQogICAgICB7e2ZpcnN0TmFtZX19IHt7bGFzdE5hbWV9 fQogICAge3svZWFjaH19CiAge3svZ3JvdXB9fQogIGBgYAoKICBUaGlzIGNh biBiZSBmYXN0ZXIgdGhhbiB0aGUgbm9ybWFsIHdheSB0aGF0IEhhbmRsZWJh cnMgcmUtcmVuZGVycyBpdGVtcwogIGluIHNvbWUgY2FzZXMuCgogIElmIGZv ciBzb21lIHJlYXNvbiB5b3UgaGF2ZSBhIGdyb3VwIHdpdGggbW9yZSB0aGFu IG9uZSBgI2VhY2hgLCB5b3UgY2FuIG1ha2UKICBvbmUgb2YgdGhlIGNvbGxl Y3Rpb25zIGJlIHVwZGF0ZWQgaW4gbm9ybWFsIChub24tZ3JvdXBlZCkgZmFz aGlvbiBieSBzZXR0aW5nCiAgdGhlIG9wdGlvbiBgZ3JvdXBlZFJvd3M9dHJ1 ZWAgKGNvdW50ZXItaW50dWl0aXZlLCBJIGtub3cpLgoKICBGb3IgZXhhbXBs ZSwKCiAgYGBgaGFuZGxlYmFycwogIHt7ZGVhbGVyc2hpcE5hbWV9fQoKICB7 eyNncm91cH19CiAgICB7eyNlYWNoIGRlYWxlcnN9fQogICAgICB7e2ZpcnN0 TmFtZX19IHt7bGFzdE5hbWV9fQogICAge3svZWFjaH19CgogICAge3sjZWFj aCBjYXIgaW4gY2FycyBncm91cGVkUm93cz10cnVlfX0KICAgICAge3tjYXIu bWFrZX19IHt7Y2FyLm1vZGVsfX0ge3tjYXIuY29sb3J9fQogICAge3svZWFj aH19CiAge3svZ3JvdXB9fQogIGBgYAogIEFueSBjaGFuZ2UgdG8gYGRlYWxl cnNoaXBOYW1lYCBvciB0aGUgYGRlYWxlcnNgIGNvbGxlY3Rpb24gd2lsbCBj YXVzZSB0aGUKICBlbnRpcmUgZ3JvdXAgdG8gYmUgcmUtcmVuZGVyZWQuIEhv d2V2ZXIsIGNoYW5nZXMgdG8gdGhlIGBjYXJzYCBjb2xsZWN0aW9uCiAgd2ls bCBiZSByZS1yZW5kZXJlZCBpbmRpdmlkdWFsbHkgKGFzIG5vcm1hbCkuCgog IE5vdGUgdGhhdCBgZ3JvdXBgIGJlaGF2aW9yIGlzIGFsc28gZGlzYWJsZWQg Ynkgc3BlY2lmeWluZyBhbiBgaXRlbVZpZXdDbGFzc2AuCgogIEBtZXRob2Qg ZWFjaAogIEBmb3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCiAgQHBhcmFt IFtuYW1lXSB7U3RyaW5nfSBuYW1lIGZvciBpdGVtICh1c2VkIHdpdGggYGlu YCkKICBAcGFyYW0gW3BhdGhdIHtTdHJpbmd9IHBhdGgKICBAcGFyYW0gW29w dGlvbnNdIHtPYmplY3R9IEhhbmRsZWJhcnMga2V5L3ZhbHVlIHBhaXJzIG9m IG9wdGlvbnMKICBAcGFyYW0gW29wdGlvbnMuaXRlbVZpZXdDbGFzc10ge1N0 cmluZ30gYSBwYXRoIHRvIGEgdmlldyBjbGFzcyB1c2VkIGZvciBlYWNoIGl0 ZW0KICBAcGFyYW0gW29wdGlvbnMuaXRlbUNvbnRyb2xsZXJdIHtTdHJpbmd9 IG5hbWUgb2YgYSBjb250cm9sbGVyIHRvIGJlIGNyZWF0ZWQgZm9yIGVhY2gg aXRlbQogIEBwYXJhbSBbb3B0aW9ucy5ncm91cGVkUm93c10ge2Jvb2xlYW59 IGVuYWJsZSBub3JtYWwgaXRlbS1ieS1pdGVtIHJlbmRlcmluZyB3aGVuIGlu c2lkZSBhIGAjZ3JvdXBgIGhlbHBlcgoqLwpFbWJlci5IYW5kbGViYXJzLnJl Z2lzdGVySGVscGVyKCdlYWNoJywgZnVuY3Rpb24gZWFjaEhlbHBlcihwYXRo LCBvcHRpb25zKSB7CiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQpIHsK ICAgIEVtYmVyLmFzc2VydCgiSWYgeW91IHBhc3MgbW9yZSB0aGFuIG9uZSBh cmd1bWVudCB0byB0aGUgZWFjaCBoZWxwZXIsIGl0IG11c3QgYmUgaW4gdGhl IGZvcm0gI2VhY2ggZm9vIGluIGJhciIsIGFyZ3VtZW50c1sxXSA9PT0gImlu Iik7CgogICAgdmFyIGtleXdvcmROYW1lID0gYXJndW1lbnRzWzBdOwoKICAg IG9wdGlvbnMgPSBhcmd1bWVudHNbM107CiAgICBwYXRoID0gYXJndW1lbnRz WzJdOwogICAgaWYgKHBhdGggPT09ICcnKSB7IHBhdGggPSAidGhpcyI7IH0K CiAgICBvcHRpb25zLmhhc2gua2V5d29yZCA9IGtleXdvcmROYW1lOwogIH0K CiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsKICAgIG9wdGlvbnMg PSBwYXRoOwogICAgcGF0aCA9ICd0aGlzJzsKICB9CgogIG9wdGlvbnMuaGFz aC5kYXRhU291cmNlQmluZGluZyA9IHBhdGg7CiAgLy8gU2V0IHVwIGVtcHR5 VmlldyBhcyBhIG1ldGFtb3JwaCB3aXRoIG5vIHRhZwogIC8vb3B0aW9ucy5o YXNoLmVtcHR5Vmlld0NsYXNzID0gRW1iZXIuX01ldGFtb3JwaFZpZXc7Cgog IGlmIChvcHRpb25zLmRhdGEuaW5zaWRlR3JvdXAgJiYgIW9wdGlvbnMuaGFz aC5ncm91cGVkUm93cyAmJiAhb3B0aW9ucy5oYXNoLml0ZW1WaWV3Q2xhc3Mp IHsKICAgIG5ldyBFbWJlci5IYW5kbGViYXJzLkdyb3VwZWRFYWNoKHRoaXMs IHBhdGgsIG9wdGlvbnMpLnJlbmRlcigpOwogIH0gZWxzZSB7CiAgICByZXR1 cm4gRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzLmNvbGxlY3Rpb24uY2FsbCh0 aGlzLCAnRW1iZXIuSGFuZGxlYmFycy5FYWNoVmlldycsIG9wdGlvbnMpOwog IH0KfSk7Cgp9KSgpOwoKCgooZnVuY3Rpb24oKSB7Ci8qKgpAbW9kdWxlIGVt YmVyCkBzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycwoqLwoKLyoqCiAgYHRl bXBsYXRlYCBhbGxvd3MgeW91IHRvIHJlbmRlciBhIHRlbXBsYXRlIGZyb20g aW5zaWRlIGFub3RoZXIgdGVtcGxhdGUuCiAgVGhpcyBhbGxvd3MgeW91IHRv IHJlLXVzZSB0aGUgc2FtZSB0ZW1wbGF0ZSBpbiBtdWx0aXBsZSBwbGFjZXMu IEZvciBleGFtcGxlOgoKICBgYGBodG1sCiAgPHNjcmlwdCB0eXBlPSJ0ZXh0 L3gtaGFuZGxlYmFycyIgZGF0YS10ZW1wbGF0ZS1uYW1lPSJsb2dnZWRfaW5f dXNlciI+CiAgICB7eyN3aXRoIGxvZ2dlZEluVXNlcn19CiAgICAgIExhc3Qg TG9naW46IHt7bGFzdExvZ2lufX0KICAgICAgVXNlciBJbmZvOiB7e3RlbXBs YXRlICJ1c2VyX2luZm8ifX0KICAgIHt7L3dpdGh9fQogIDwvc2NyaXB0Pgog IGBgYAoKICBgYGBodG1sCiAgPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtaGFuZGxl YmFycyIgZGF0YS10ZW1wbGF0ZS1uYW1lPSJ1c2VyX2luZm8iPgogICAgTmFt ZTogPGVtPnt7bmFtZX19PC9lbT4KICAgIEthcm1hOiA8ZW0+e3trYXJtYX19 PC9lbT4KICA8L3NjcmlwdD4KICBgYGAKCiAgYGBgaGFuZGxlYmFycwogIHt7 I2lmIGlzVXNlcn19CiAgICB7e3RlbXBsYXRlICJ1c2VyX2luZm8ifX0KICB7 e2Vsc2V9fQogICAge3t0ZW1wbGF0ZSAidW5sb2dnZWRfdXNlcl9pbmZvIn19 CiAge3svaWZ9fQogIGBgYAoKICBUaGlzIGhlbHBlciBsb29rcyBmb3IgdGVt cGxhdGVzIGluIHRoZSBnbG9iYWwgYEVtYmVyLlRFTVBMQVRFU2AgaGFzaC4g SWYgeW91CiAgYWRkIGA8c2NyaXB0PmAgdGFncyB0byB5b3VyIHBhZ2Ugd2l0 aCB0aGUgYGRhdGEtdGVtcGxhdGUtbmFtZWAgYXR0cmlidXRlIHNldCwKICB0 aGV5IHdpbGwgYmUgY29tcGlsZWQgYW5kIHBsYWNlZCBpbiB0aGlzIGhhc2gg YXV0b21hdGljYWxseS4KCiAgWW91IGNhbiBhbHNvIG1hbnVhbGx5IHJlZ2lz dGVyIHRlbXBsYXRlcyBieSBhZGRpbmcgdGhlbSB0byB0aGUgaGFzaDoKCiAg YGBgamF2YXNjcmlwdAogIEVtYmVyLlRFTVBMQVRFU1sibXlfY29vbF90ZW1w bGF0ZSJdID0gRW1iZXIuSGFuZGxlYmFycy5jb21waWxlKCc8Yj57e3VzZXJ9 fTwvYj4nKTsKICBgYGAKCiAgQGRlcHJlY2F0ZWQKICBAbWV0aG9kIHRlbXBs YXRlCiAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMKICBAcGFyYW0g e1N0cmluZ30gdGVtcGxhdGVOYW1lIHRoZSB0ZW1wbGF0ZSB0byByZW5kZXIK Ki8KCkVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ3RlbXBsYXRl JywgZnVuY3Rpb24obmFtZSwgb3B0aW9ucykgewogIEVtYmVyLmRlcHJlY2F0 ZSgiVGhlIGB0ZW1wbGF0ZWAgaGVscGVyIGhhcyBiZWVuIGRlcHJlY2F0ZWQg aW4gZmF2b3Igb2YgdGhlIGBwYXJ0aWFsYCBoZWxwZXIuIFBsZWFzZSB1c2Ug YHBhcnRpYWxgIGluc3RlYWQsIHdoaWNoIHdpbGwgd29yayB0aGUgc2FtZSB3 YXkuIik7CiAgcmV0dXJuIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycy5wYXJ0 aWFsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cn0pOwoKfSkoKTsKCgoKKGZ1 bmN0aW9uKCkgewovKioKQG1vZHVsZSBlbWJlcgpAc3VibW9kdWxlIGVtYmVy LWhhbmRsZWJhcnMKKi8KCi8qKgogIFRoZSBgcGFydGlhbGAgaGVscGVyIHJl bmRlcnMgYW5vdGhlciB0ZW1wbGF0ZSB3aXRob3V0CiAgY2hhbmdpbmcgdGhl IHRlbXBsYXRlIGNvbnRleHQ6CgogIGBgYGhhbmRsZWJhcnMKICB7e2Zvb319 CiAge3twYXJ0aWFsICJuYXYifX0KICBgYGAKCiAgVGhlIGFib3ZlIGV4YW1w bGUgdGVtcGxhdGUgd2lsbCByZW5kZXIgYSB0ZW1wbGF0ZSBuYW1lZAogICJf bmF2Iiwgd2hpY2ggaGFzIHRoZSBzYW1lIGNvbnRleHQgYXMgdGhlIHBhcmVu dCB0ZW1wbGF0ZQogIGl0J3MgcmVuZGVyZWQgaW50bywgc28gaWYgdGhlICJf bmF2IiB0ZW1wbGF0ZSBhbHNvIHJlZmVyZW5jZWQKICBge3tmb299fWAsIGl0 IHdvdWxkIHByaW50IHRoZSBzYW1lIHRoaW5nIGFzIHRoZSBge3tmb299fWAK ICBpbiB0aGUgYWJvdmUgZXhhbXBsZS4KCiAgSWYgYSAiX25hdiIgdGVtcGxh dGUgaXNuJ3QgZm91bmQsIHRoZSBgcGFydGlhbGAgaGVscGVyIHdpbGwKICBm YWxsIGJhY2sgdG8gYSB0ZW1wbGF0ZSBuYW1lZCAibmF2Ii4KCiAgIyMgQm91 bmQgdGVtcGxhdGUgbmFtZXMKCiAgVGhlIHBhcmFtZXRlciBzdXBwbGllZCB0 byBgcGFydGlhbGAgY2FuIGFsc28gYmUgYSBwYXRoCiAgdG8gYSBwcm9wZXJ0 eSBjb250YWluaW5nIGEgdGVtcGxhdGUgbmFtZSwgZS5nLjoKCiAgYGBgaGFu ZGxlYmFycwogIHt7cGFydGlhbCBzb21lVGVtcGxhdGVOYW1lfX0KICBgYGAK CiAgVGhlIGFib3ZlIGV4YW1wbGUgd2lsbCBsb29rIHVwIHRoZSB2YWx1ZSBv ZiBgc29tZVRlbXBsYXRlTmFtZWAKICBvbiB0aGUgdGVtcGxhdGUgY29udGV4 dCAoZS5nLiBhIGNvbnRyb2xsZXIpIGFuZCB1c2UgdGhhdAogIHZhbHVlIGFz IHRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSB0byByZW5kZXIuIElmIHRoZSBy ZXNvbHZlZAogIHZhbHVlIGlzIGZhbHN5LCBub3RoaW5nIHdpbGwgYmUgcmVu ZGVyZWQuIElmIGBzb21lVGVtcGxhdGVOYW1lYAogIGNoYW5nZXMsIHRoZSBw YXJ0aWFsIHdpbGwgYmUgcmUtcmVuZGVyZWQgdXNpbmcgdGhlIG5ldyB0ZW1w bGF0ZQogIG5hbWUuCgogICMjIFNldHRpbmcgdGhlIHBhcnRpYWwncyBjb250 ZXh0IHdpdGggYHdpdGhgCgogIFRoZSBgcGFydGlhbGAgaGVscGVyIGNhbiBi ZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB3aXRoYAogIGhlbHBl ciB0byBzZXQgYSBjb250ZXh0IHRoYXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBw YXJ0aWFsOgoKICBgYGBoYW5kbGViYXJzCiAge3sjd2l0aCBjdXJyZW50VXNl cn19CiAgICB7e3BhcnRpYWwgInVzZXJfaW5mbyJ9fQogIHt7L3dpdGh9fQog IGBgYAoKICBAbWV0aG9kIHBhcnRpYWwKICBAZm9yIEVtYmVyLkhhbmRsZWJh cnMuaGVscGVycwogIEBwYXJhbSB7U3RyaW5nfSBwYXJ0aWFsTmFtZSB0aGUg bmFtZSBvZiB0aGUgdGVtcGxhdGUgdG8gcmVuZGVyIG1pbnVzIHRoZSBsZWFk aW5nIHVuZGVyc2NvcmUKKi8KCkVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJI ZWxwZXIoJ3BhcnRpYWwnLCBmdW5jdGlvbiBwYXJ0aWFsSGVscGVyKG5hbWUs IG9wdGlvbnMpIHsKCiAgdmFyIGNvbnRleHQgPSAob3B0aW9ucy5jb250ZXh0 cyAmJiBvcHRpb25zLmNvbnRleHRzLmxlbmd0aCkgPyBvcHRpb25zLmNvbnRl eHRzWzBdIDogdGhpczsKCiAgaWYgKG9wdGlvbnMudHlwZXNbMF0gPT09ICJJ RCIpIHsKICAgIC8vIEhlbHBlciB3YXMgcGFzc2VkIGEgcHJvcGVydHkgcGF0 aDsgd2UgbmVlZCB0bwogICAgLy8gY3JlYXRlIGEgYmluZGluZyB0aGF0IHdp bGwgcmUtcmVuZGVyIHdoZW5ldmVyCiAgICAvLyB0aGlzIHByb3BlcnR5IGNo YW5nZXMuCiAgICBvcHRpb25zLmZuID0gZnVuY3Rpb24oY29udGV4dCwgZm5P cHRpb25zKSB7CiAgICAgIHZhciBwYXJ0aWFsTmFtZSA9IEVtYmVyLkhhbmRs ZWJhcnMuZ2V0KGNvbnRleHQsIG5hbWUsIGZuT3B0aW9ucyk7CiAgICAgIHJl bmRlclBhcnRpYWwoY29udGV4dCwgcGFydGlhbE5hbWUsIGZuT3B0aW9ucyk7 CiAgICB9OwoKICAgIHJldHVybiBFbWJlci5IYW5kbGViYXJzLmJpbmQuY2Fs bChjb250ZXh0LCBuYW1lLCBvcHRpb25zLCB0cnVlLCBleGlzdHMpOwogIH0g ZWxzZSB7CiAgICAvLyBSZW5kZXIgdGhlIHBhcnRpYWwgcmlnaHQgaW50byBw YXJlbnQgdGVtcGxhdGUuCiAgICByZW5kZXJQYXJ0aWFsKGNvbnRleHQsIG5h bWUsIG9wdGlvbnMpOwogIH0KfSk7CgpmdW5jdGlvbiBleGlzdHModmFsdWUp IHsKICByZXR1cm4gIUVtYmVyLmlzTm9uZSh2YWx1ZSk7Cn0KCmZ1bmN0aW9u IHJlbmRlclBhcnRpYWwoY29udGV4dCwgbmFtZSwgb3B0aW9ucykgewogIHZh ciBuYW1lUGFydHMgPSBuYW1lLnNwbGl0KCIvIiksCiAgICAgIGxhc3RQYXJ0 ID0gbmFtZVBhcnRzW25hbWVQYXJ0cy5sZW5ndGggLSAxXTsKCiAgbmFtZVBh cnRzW25hbWVQYXJ0cy5sZW5ndGggLSAxXSA9ICJfIiArIGxhc3RQYXJ0OwoK ICB2YXIgdmlldyA9IG9wdGlvbnMuZGF0YS52aWV3LAogICAgICB1bmRlcnNj b3JlZE5hbWUgPSBuYW1lUGFydHMuam9pbigiLyIpLAogICAgICB0ZW1wbGF0 ZSA9IHZpZXcudGVtcGxhdGVGb3JOYW1lKHVuZGVyc2NvcmVkTmFtZSksCiAg ICAgIGRlcHJlY2F0ZWRUZW1wbGF0ZSA9ICF0ZW1wbGF0ZSAmJiB2aWV3LnRl bXBsYXRlRm9yTmFtZShuYW1lKTsKCiAgRW1iZXIuYXNzZXJ0KCJVbmFibGUg dG8gZmluZCBwYXJ0aWFsIHdpdGggbmFtZSAnIituYW1lKyInLiIsIHRlbXBs YXRlIHx8IGRlcHJlY2F0ZWRUZW1wbGF0ZSk7CgogIHRlbXBsYXRlID0gdGVt cGxhdGUgfHwgZGVwcmVjYXRlZFRlbXBsYXRlOwoKICB0ZW1wbGF0ZShjb250 ZXh0LCB7IGRhdGE6IG9wdGlvbnMuZGF0YSB9KTsKfQoKfSkoKTsKCgoKKGZ1 bmN0aW9uKCkgewovKioKQG1vZHVsZSBlbWJlcgpAc3VibW9kdWxlIGVtYmVy LWhhbmRsZWJhcnMKKi8KCnZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVt YmVyLnNldDsKCi8qKgogIGB7e3lpZWxkfX1gIGRlbm90ZXMgYW4gYXJlYSBv ZiBhIHRlbXBsYXRlIHRoYXQgd2lsbCBiZSByZW5kZXJlZCBpbnNpZGUKICBv ZiBhbm90aGVyIHRlbXBsYXRlLiBJdCBoYXMgdHdvIG1haW4gdXNlczoKCiAg IyMjIFVzZSB3aXRoIGBsYXlvdXRgCiAgV2hlbiB1c2VkIGluIGEgSGFuZGxl YmFycyB0ZW1wbGF0ZSB0aGF0IGlzIGFzc2lnbmVkIHRvIGFuIGBFbWJlci5W aWV3YAogIGluc3RhbmNlJ3MgYGxheW91dGAgcHJvcGVydHkgRW1iZXIgd2ls bCByZW5kZXIgdGhlIGxheW91dCB0ZW1wbGF0ZSBmaXJzdCwKICBpbnNlcnRp bmcgdGhlIHZpZXcncyBvd24gcmVuZGVyZWQgb3V0cHV0IGF0IHRoZSBge3t5 aWVsZH19YCBsb2NhdGlvbi4KCiAgQW4gZW1wdHkgYDxib2R5PmAgYW5kIHRo ZSBmb2xsb3dpbmcgYXBwbGljYXRpb24gY29kZToKCiAgYGBgamF2YXNjcmlw dAogIEFWaWV3ID0gRW1iZXIuVmlldy5leHRlbmQoewogICAgY2xhc3NOYW1l czogWydhLXZpZXctd2l0aC1sYXlvdXQnXSwKICAgIGxheW91dDogRW1iZXIu SGFuZGxlYmFycy5jb21waWxlKCc8ZGl2IGNsYXNzPSJ3cmFwcGVyIj57e3lp ZWxkfX08L2Rpdj4nKSwKICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJz LmNvbXBpbGUoJzxzcGFuPkkgYW0gd3JhcHBlZDwvc3Bhbj4nKQogIH0pOwoK ICBhVmlldyA9IEFWaWV3LmNyZWF0ZSgpOwogIGFWaWV3LmFwcGVuZFRvKCdi b2R5Jyk7CiAgYGBgCgogIFdpbGwgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcg SFRNTCBvdXRwdXQ6CgogIGBgYGh0bWwKICA8Ym9keT4KICAgIDxkaXYgY2xh c3M9J2VtYmVyLXZpZXcgYS12aWV3LXdpdGgtbGF5b3V0Jz4KICAgICAgPGRp diBjbGFzcz0id3JhcHBlciI+CiAgICAgICAgPHNwYW4+SSBhbSB3cmFwcGVk PC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvYm9keT4KICBg YGAKCiAgVGhlIGB5aWVsZGAgaGVscGVyIGNhbm5vdCBiZSB1c2VkIG91dHNp ZGUgb2YgYSB0ZW1wbGF0ZSBhc3NpZ25lZCB0byBhbgogIGBFbWJlci5WaWV3 YCdzIGBsYXlvdXRgIHByb3BlcnR5IGFuZCB3aWxsIHRocm93IGFuIGVycm9y IGlmIGF0dGVtcHRlZC4KCiAgYGBgamF2YXNjcmlwdAogIEJWaWV3ID0gRW1i ZXIuVmlldy5leHRlbmQoewogICAgY2xhc3NOYW1lczogWydhLXZpZXctd2l0 aC1sYXlvdXQnXSwKICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNv bXBpbGUoJ3t7eWllbGR9fScpCiAgfSk7CgogIGJWaWV3ID0gQlZpZXcuY3Jl YXRlKCk7CiAgYlZpZXcuYXBwZW5kVG8oJ2JvZHknKTsKCiAgLy8gdGhyb3dz CiAgLy8gVW5jYXVnaHQgRXJyb3I6IGFzc2VydGlvbiBmYWlsZWQ6CiAgLy8g WW91IGNhbGxlZCB5aWVsZCBpbiBhIHRlbXBsYXRlIHRoYXQgd2FzIG5vdCBh IGxheW91dAogIGBgYAoKICAjIyMgVXNlIHdpdGggRW1iZXIuQ29tcG9uZW50 CiAgV2hlbiBkZXNpZ25pbmcgY29tcG9uZW50cyBge3t5aWVsZH19YCBpcyB1 c2VkIHRvIGRlbm90ZSB3aGVyZSwgaW5zaWRlIHRoZSBjb21wb25lbnQncwog IHRlbXBsYXRlLCBhbiBvcHRpb25hbCBibG9jayBwYXNzZWQgdG8gdGhlIGNv bXBvbmVudCBzaG91bGQgcmVuZGVyOgoKICBgYGBoYW5kbGViYXJzCiAgPCEt LSBhcHBsaWNhdGlvbi5oYnMgLS0+CiAge3sjbGFiZWxlZC10ZXh0ZmllbGQg dmFsdWU9c29tZVByb3BlcnR5fX0KICAgIEZpcnN0IG5hbWU6CiAge3svbGFi ZWxlZC10ZXh0ZmllbGR9fQogIGBgYAoKICBgYGBoYW5kbGViYXJzCiAgPCEt LSBjb21wb25lbnRzL2xhYmVsZWQtdGV4dGZpZWxkLmhicyAtLT4KICA8bGFi ZWw+CiAgICB7e3lpZWxkfX0ge3tpbnB1dCB2YWx1ZT12YWx1ZX19CiAgPC9s YWJlbD4KICBgYGAKCiAgUmVzdWx0OgoKICBgYGBodG1sCiAgPGxhYmVsPgog ICAgRmlyc3QgbmFtZTogPGlucHV0IHR5cGU9InRleHQiIC8+CiAgPGxhYmVs PgogIGBgYAoKICBAbWV0aG9kIHlpZWxkCiAgQGZvciBFbWJlci5IYW5kbGVi YXJzLmhlbHBlcnMKICBAcGFyYW0ge0hhc2h9IG9wdGlvbnMKICBAcmV0dXJu IHtTdHJpbmd9IEhUTUwgc3RyaW5nCiovCkVtYmVyLkhhbmRsZWJhcnMucmVn aXN0ZXJIZWxwZXIoJ3lpZWxkJywgZnVuY3Rpb24geWllbGRIZWxwZXIob3B0 aW9ucykgewogIHZhciB2aWV3ID0gb3B0aW9ucy5kYXRhLnZpZXc7CgogIHdo aWxlICh2aWV3ICYmICFnZXQodmlldywgJ2xheW91dCcpKSB7CiAgICBpZiAo dmlldy5fY29udGV4dFZpZXcpIHsKICAgICAgdmlldyA9IHZpZXcuX2NvbnRl eHRWaWV3OwogICAgfSBlbHNlIHsKICAgICAgdmlldyA9IGdldCh2aWV3LCAn cGFyZW50VmlldycpOwogICAgfQogIH0KCiAgRW1iZXIuYXNzZXJ0KCJZb3Ug Y2FsbGVkIHlpZWxkIGluIGEgdGVtcGxhdGUgdGhhdCB3YXMgbm90IGEgbGF5 b3V0IiwgISF2aWV3KTsKCiAgdmlldy5feWllbGQodGhpcywgb3B0aW9ucyk7 Cn0pOwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewovKioKQG1vZHVsZSBlbWJl cgpAc3VibW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKKi8KCi8qKgogIGBsb2Ng IGxvb2tzIHVwIHRoZSBzdHJpbmcgaW4gdGhlIGxvY2FsaXplZCBzdHJpbmdz IGhhc2guCiAgVGhpcyBpcyBhIGNvbnZlbmllbnQgd2F5IHRvIGxvY2FsaXpl IHRleHQuIEZvciBleGFtcGxlOgoKICBgYGBodG1sCiAgPHNjcmlwdCB0eXBl PSJ0ZXh0L3gtaGFuZGxlYmFycyIgZGF0YS10ZW1wbGF0ZS1uYW1lPSJob21l Ij4KICAgIHt7bG9jICJ3ZWxjb21lIn19CiAgPC9zY3JpcHQ+CiAgYGBgCgog IFRha2Ugbm90ZSB0aGF0IGAid2VsY29tZSJgIGlzIGEgc3RyaW5nIGFuZCBu b3QgYW4gb2JqZWN0CiAgcmVmZXJlbmNlLgoKICBAbWV0aG9kIGxvYwogIEBm b3IgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzCiAgQHBhcmFtIHtTdHJpbmd9 IHN0ciBUaGUgc3RyaW5nIHRvIGZvcm1hdAoqLwoKRW1iZXIuSGFuZGxlYmFy cy5yZWdpc3RlckhlbHBlcignbG9jJywgZnVuY3Rpb24gbG9jSGVscGVyKHN0 cikgewogIHJldHVybiBFbWJlci5TdHJpbmcubG9jKHN0cik7Cn0pOwoKfSko KTsKCgoKKGZ1bmN0aW9uKCkgewoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewoK fSkoKTsKCgoKKGZ1bmN0aW9uKCkgewovKioKQG1vZHVsZSBlbWJlcgpAc3Vi bW9kdWxlIGVtYmVyLWhhbmRsZWJhcnMKKi8KCnZhciBzZXQgPSBFbWJlci5z ZXQsIGdldCA9IEVtYmVyLmdldDsKCi8qKgogIFRoZSBpbnRlcm5hbCBjbGFz cyB1c2VkIHRvIGNyZWF0ZSB0ZXh0IGlucHV0cyB3aGVuIHRoZSBge3tpbnB1 dH19YAogIGhlbHBlciBpcyB1c2VkIHdpdGggYHR5cGVgIG9mIGBjaGVja2Jv eGAuCgogIFNlZSBbaGFuZGxlYmFycy5oZWxwZXJzLmlucHV0XSgvYXBpL2Ns YXNzZXMvRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzLmh0bWwjbWV0aG9kX2lu cHV0KSAgZm9yIHVzYWdlIGRldGFpbHMuCgogICMjIERpcmVjdCBtYW5pcHVs YXRpb24gb2YgYGNoZWNrZWRgCgogIFRoZSBgY2hlY2tlZGAgYXR0cmlidXRl IG9mIGFuIGBFbWJlci5DaGVja2JveGAgb2JqZWN0IHNob3VsZCBhbHdheXMg YmUgc2V0CiAgdGhyb3VnaCB0aGUgRW1iZXIgb2JqZWN0IG9yIGJ5IGludGVy YWN0aW5nIHdpdGggaXRzIHJlbmRlcmVkIGVsZW1lbnQKICByZXByZXNlbnRh dGlvbiB2aWEgdGhlIG1vdXNlLCBrZXlib2FyZCwgb3IgdG91Y2guIFVwZGF0 aW5nIHRoZSB2YWx1ZSBvZiB0aGUKICBjaGVja2JveCB2aWEgalF1ZXJ5IHdp bGwgcmVzdWx0IGluIHRoZSBjaGVja2VkIHZhbHVlIG9mIHRoZSBvYmplY3Qg YW5kIGl0cwogIGVsZW1lbnQgbG9zaW5nIHN5bmNocm9uaXphdGlvbi4KCiAg IyMgTGF5b3V0IGFuZCBMYXlvdXROYW1lIHByb3BlcnRpZXMKCiAgQmVjYXVz ZSBIVE1MIGBpbnB1dGAgZWxlbWVudHMgYXJlIHNlbGYgY2xvc2luZyBgbGF5 b3V0YCBhbmQgYGxheW91dE5hbWVgCiAgcHJvcGVydGllcyB3aWxsIG5vdCBi ZSBhcHBsaWVkLiBTZWUgW0VtYmVyLlZpZXddKC9hcGkvY2xhc3Nlcy9FbWJl ci5WaWV3Lmh0bWwpJ3MKICBsYXlvdXQgc2VjdGlvbiBmb3IgbW9yZSBpbmZv cm1hdGlvbi4KCiAgQGNsYXNzIENoZWNrYm94CiAgQG5hbWVzcGFjZSBFbWJl cgogIEBleHRlbmRzIEVtYmVyLlZpZXcKKi8KRW1iZXIuQ2hlY2tib3ggPSBF bWJlci5WaWV3LmV4dGVuZCh7CiAgY2xhc3NOYW1lczogWydlbWJlci1jaGVj a2JveCddLAoKICB0YWdOYW1lOiAnaW5wdXQnLAoKICBhdHRyaWJ1dGVCaW5k aW5nczogWyd0eXBlJywgJ2NoZWNrZWQnLCAnaW5kZXRlcm1pbmF0ZScsICdk aXNhYmxlZCcsICd0YWJpbmRleCcsICduYW1lJywKICAgICAgICAgICAgICAg ICAgICAgICdhdXRvZm9jdXMnLCAnZm9ybSddLAoKICB0eXBlOiAiY2hlY2ti b3giLAogIGNoZWNrZWQ6IGZhbHNlLAogIGRpc2FibGVkOiBmYWxzZSwKICBp bmRldGVybWluYXRlOiBmYWxzZSwKCiAgaW5pdDogZnVuY3Rpb24oKSB7CiAg ICB0aGlzLl9zdXBlcigpOwogICAgdGhpcy5vbigiY2hhbmdlIiwgdGhpcywg dGhpcy5fdXBkYXRlRWxlbWVudFZhbHVlKTsKICB9LAoKICBkaWRJbnNlcnRF bGVtZW50OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX3N1cGVyKCk7CiAgICB0 aGlzLmdldCgnZWxlbWVudCcpLmluZGV0ZXJtaW5hdGUgPSAhIXRoaXMuZ2V0 KCdpbmRldGVybWluYXRlJyk7CiAgfSwKCiAgX3VwZGF0ZUVsZW1lbnRWYWx1 ZTogZnVuY3Rpb24oKSB7CiAgICBzZXQodGhpcywgJ2NoZWNrZWQnLCB0aGlz LiQoKS5wcm9wKCdjaGVja2VkJykpOwogIH0KfSk7Cgp9KSgpOwoKCgooZnVu Y3Rpb24oKSB7Ci8qKgpAbW9kdWxlIGVtYmVyCkBzdWJtb2R1bGUgZW1iZXIt aGFuZGxlYmFycwoqLwoKdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1i ZXIuc2V0OwoKLyoqCiAgU2hhcmVkIG1peGluIHVzZWQgYnkgYEVtYmVyLlRl eHRGaWVsZGAgYW5kIGBFbWJlci5UZXh0QXJlYWAuCgogIEBjbGFzcyBUZXh0 U3VwcG9ydAogIEBuYW1lc3BhY2UgRW1iZXIKICBAdXNlcyBFbWJlci5UYXJn ZXRBY3Rpb25TdXBwb3J0CiAgQGV4dGVuZHMgRW1iZXIuTWl4aW4KICBAcHJp dmF0ZQoqLwpFbWJlci5UZXh0U3VwcG9ydCA9IEVtYmVyLk1peGluLmNyZWF0 ZShFbWJlci5UYXJnZXRBY3Rpb25TdXBwb3J0LCB7CiAgdmFsdWU6ICIiLAoK ICBhdHRyaWJ1dGVCaW5kaW5nczogWydwbGFjZWhvbGRlcicsICdkaXNhYmxl ZCcsICdtYXhsZW5ndGgnLCAndGFiaW5kZXgnLCAncmVhZG9ubHknLAogICAg ICAgICAgICAgICAgICAgICAgJ2F1dG9mb2N1cycsICdmb3JtJywgJ3NlbGVj dGlvbkRpcmVjdGlvbicsICdzcGVsbGNoZWNrJywgJ3JlcXVpcmVkJ10sCiAg cGxhY2Vob2xkZXI6IG51bGwsCiAgZGlzYWJsZWQ6IGZhbHNlLAogIG1heGxl bmd0aDogbnVsbCwKCiAgaW5pdDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9z dXBlcigpOwogICAgdGhpcy5vbigiZm9jdXNPdXQiLCB0aGlzLCB0aGlzLl9l bGVtZW50VmFsdWVEaWRDaGFuZ2UpOwogICAgdGhpcy5vbigiY2hhbmdlIiwg dGhpcywgdGhpcy5fZWxlbWVudFZhbHVlRGlkQ2hhbmdlKTsKICAgIHRoaXMu b24oInBhc3RlIiwgdGhpcywgdGhpcy5fZWxlbWVudFZhbHVlRGlkQ2hhbmdl KTsKICAgIHRoaXMub24oImN1dCIsIHRoaXMsIHRoaXMuX2VsZW1lbnRWYWx1 ZURpZENoYW5nZSk7CiAgICB0aGlzLm9uKCJpbnB1dCIsIHRoaXMsIHRoaXMu X2VsZW1lbnRWYWx1ZURpZENoYW5nZSk7CiAgICB0aGlzLm9uKCJrZXlVcCIs IHRoaXMsIHRoaXMuaW50ZXJwcmV0S2V5RXZlbnRzKTsKICB9LAoKICAvKioK ICAgIFRoZSBhY3Rpb24gdG8gYmUgc2VudCB3aGVuIHRoZSB1c2VyIHByZXNz ZXMgdGhlIHJldHVybiBrZXkuCgogICAgVGhpcyBpcyBzaW1pbGFyIHRvIHRo ZSBge3thY3Rpb259fWAgaGVscGVyLCBidXQgaXMgZmlyZWQgd2hlbgogICAg dGhlIHVzZXIgcHJlc3NlcyB0aGUgcmV0dXJuIGtleSB3aGVuIGVkaXRpbmcg YSB0ZXh0IGZpZWxkLCBhbmQgc2VuZHMKICAgIHRoZSB2YWx1ZSBvZiB0aGUg ZmllbGQgYXMgdGhlIGNvbnRleHQuCgogICAgQHByb3BlcnR5IGFjdGlvbgog ICAgQHR5cGUgU3RyaW5nCiAgICBAZGVmYXVsdCBudWxsCiAgKi8KICBhY3Rp b246IG51bGwsCgogIC8qKgogICAgVGhlIGV2ZW50IHRoYXQgc2hvdWxkIHNl bmQgdGhlIGFjdGlvbi4KCiAgICBPcHRpb25zIGFyZToKCiAgICAqIGBlbnRl cmA6IHRoZSB1c2VyIHByZXNzZWQgZW50ZXIKICAgICogYGtleVByZXNzYDog dGhlIHVzZXIgcHJlc3NlZCBhIGtleQoKICAgIEBwcm9wZXJ0eSBvbkV2ZW50 CiAgICBAdHlwZSBTdHJpbmcKICAgIEBkZWZhdWx0IGVudGVyCiAgKi8KICBv bkV2ZW50OiAnZW50ZXInLAoKICAvKioKICAgIFdoZXRoZXIgdGhleSBga2V5 VXBgIGV2ZW50IHRoYXQgdHJpZ2dlcnMgYW4gYGFjdGlvbmAgdG8gYmUgc2Vu dCBjb250aW51ZXMKICAgIHByb3BhZ2F0aW5nIHRvIG90aGVyIHZpZXdzLgoK ICAgIEJ5IGRlZmF1bHQsIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgcmV0 dXJuIGtleSBvbiB0aGVpciBrZXlib2FyZCBhbmQKICAgIHRoZSB0ZXh0IGZp ZWxkIGhhcyBhbiBgYWN0aW9uYCBzZXQsIHRoZSBhY3Rpb24gd2lsbCBiZSBz ZW50IHRvIHRoZSB2aWV3J3MKICAgIGNvbnRyb2xsZXIgYW5kIHRoZSBrZXkg ZXZlbnQgd2lsbCBzdG9wIHByb3BhZ2F0aW5nLgoKICAgIElmIHlvdSB3b3Vs ZCBsaWtlIHBhcmVudCB2aWV3cyB0byByZWNlaXZlIHRoZSBga2V5VXBgIGV2 ZW50IGV2ZW4gYWZ0ZXIgYW4KICAgIGFjdGlvbiBoYXMgYmVlbiBkaXNwYXRj aGVkLCBzZXQgYGJ1YmJsZXNgIHRvIHRydWUuCgogICAgQHByb3BlcnR5IGJ1 YmJsZXMKICAgIEB0eXBlIEJvb2xlYW4KICAgIEBkZWZhdWx0IGZhbHNlCiAg Ki8KICBidWJibGVzOiBmYWxzZSwKCiAgaW50ZXJwcmV0S2V5RXZlbnRzOiBm dW5jdGlvbihldmVudCkgewogICAgdmFyIG1hcCA9IEVtYmVyLlRleHRTdXBw b3J0LktFWV9FVkVOVFM7CiAgICB2YXIgbWV0aG9kID0gbWFwW2V2ZW50Lmtl eUNvZGVdOwoKICAgIHRoaXMuX2VsZW1lbnRWYWx1ZURpZENoYW5nZSgpOwog ICAgaWYgKG1ldGhvZCkgeyByZXR1cm4gdGhpc1ttZXRob2RdKGV2ZW50KTsg fQogIH0sCgogIF9lbGVtZW50VmFsdWVEaWRDaGFuZ2U6IGZ1bmN0aW9uKCkg ewogICAgc2V0KHRoaXMsICd2YWx1ZScsIHRoaXMuJCgpLnZhbCgpKTsKICB9 LAoKICAvKioKICAgIFRoZSBhY3Rpb24gdG8gYmUgc2VudCB3aGVuIHRoZSB1 c2VyIGluc2VydHMgYSBuZXcgbGluZS4KCiAgICBDYWxsZWQgYnkgdGhlIGBF bWJlci5UZXh0U3VwcG9ydGAgbWl4aW4gb24ga2V5VXAgaWYga2V5Y29kZSBt YXRjaGVzIDEzLgogICAgVXNlcyBzZW5kQWN0aW9uIHRvIHNlbmQgdGhlIGBl bnRlcmAgYWN0aW9uIHRvIHRoZSBjb250cm9sbGVyLgoKICAgIEBtZXRob2Qg aW5zZXJ0TmV3bGluZQogICAgQHBhcmFtIHtFdmVudH0gZXZlbnQKICAqLwog IGluc2VydE5ld2xpbmU6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICBzZW5kQWN0 aW9uKCdlbnRlcicsIHRoaXMsIGV2ZW50KTsKICAgIHNlbmRBY3Rpb24oJ2lu c2VydC1uZXdsaW5lJywgdGhpcywgZXZlbnQpOwogIH0sCgogIC8qKgogICAg Q2FsbGVkIHdoZW4gdGhlIHVzZXIgaGl0cyBlc2NhcGUuCgogICAgQ2FsbGVk IGJ5IHRoZSBgRW1iZXIuVGV4dFN1cHBvcnRgIG1peGluIG9uIGtleVVwIGlm IGtleWNvZGUgbWF0Y2hlcyAyNy4KICAgIFVzZXMgc2VuZEFjdGlvbiB0byBz ZW5kIHRoZSBgZXNjYXBlLXByZXNzYCBhY3Rpb24gdG8gdGhlIGNvbnRyb2xs ZXIuCgogICAgQG1ldGhvZCBjYW5jZWwKICAgIEBwYXJhbSB7RXZlbnR9IGV2 ZW50CiAgKi8KICBjYW5jZWw6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICBzZW5k QWN0aW9uKCdlc2NhcGUtcHJlc3MnLCB0aGlzLCBldmVudCk7CiAgfSwKCiAg LyoqCiAgICBDYWxsZWQgd2hlbiB0aGUgdGV4dCBhcmVhIGlzIGZvY3VzZWQu CgogICAgQG1ldGhvZCBmb2N1c0luCiAgICBAcGFyYW0ge0V2ZW50fSBldmVu dAogICovCiAgZm9jdXNJbjogZnVuY3Rpb24oZXZlbnQpIHsKICAgIHNlbmRB Y3Rpb24oJ2ZvY3VzLWluJywgdGhpcywgZXZlbnQpOwogIH0sCgogIC8qKgog ICAgQ2FsbGVkIHdoZW4gdGhlIHRleHQgYXJlYSBpcyBibHVycmVkLgoKICAg IEBtZXRob2QgZm9jdXNPdXQKICAgIEBwYXJhbSB7RXZlbnR9IGV2ZW50CiAg Ki8KICBmb2N1c091dDogZnVuY3Rpb24oZXZlbnQpIHsKICAgIHNlbmRBY3Rp b24oJ2ZvY3VzLW91dCcsIHRoaXMsIGV2ZW50KTsKICB9LAoKICAvKioKICAg IFRoZSBhY3Rpb24gdG8gYmUgc2VudCB3aGVuIHRoZSB1c2VyIHByZXNzZXMg YSBrZXkuIEVuYWJsZWQgYnkgc2V0dGluZwogICAgdGhlIGBvbkV2ZW50YCBw cm9wZXJ0eSB0byBga2V5UHJlc3NgLgoKICAgIFVzZXMgc2VuZEFjdGlvbiB0 byBzZW5kIHRoZSBga2V5UHJlc3NgIGFjdGlvbiB0byB0aGUgY29udHJvbGxl ci4KCiAgICBAbWV0aG9kIGtleVByZXNzCiAgICBAcGFyYW0ge0V2ZW50fSBl dmVudAogICovCiAga2V5UHJlc3M6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICBz ZW5kQWN0aW9uKCdrZXktcHJlc3MnLCB0aGlzLCBldmVudCk7CiAgfQoKfSk7 CgpFbWJlci5UZXh0U3VwcG9ydC5LRVlfRVZFTlRTID0gewogIDEzOiAnaW5z ZXJ0TmV3bGluZScsCiAgMjc6ICdjYW5jZWwnCn07CgovLyBJbiBwcmluY2lw bGUsIHRoaXMgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSwgYnV0IHRoZSBsZWdh Y3kKLy8gc2VjdGlvbkFjdGlvbiBzZW1hbnRpY3MgZm9yIFRleHRGaWVsZCBh cmUgZGlmZmVyZW50IGZyb20KLy8gdGhlIGNvbXBvbmVudCBzZW1hbnRpY3Mg c28gdGhpcyBtZXRob2Qgbm9ybWFsaXplcyB0aGVtLgpmdW5jdGlvbiBzZW5k QWN0aW9uKGV2ZW50TmFtZSwgdmlldywgZXZlbnQpIHsKICB2YXIgYWN0aW9u ID0gZ2V0KHZpZXcsIGV2ZW50TmFtZSksCiAgICAgIG9uID0gZ2V0KHZpZXcs ICdvbkV2ZW50JyksCiAgICAgIHZhbHVlID0gZ2V0KHZpZXcsICd2YWx1ZScp OwoKICAvLyBiYWNrLWNvbXBhdCBzdXBwb3J0IGZvciBrZXlQcmVzcyBhcyBh biBldmVudCBuYW1lIGV2ZW4gdGhvdWdoCiAgLy8gaXQncyBhbHNvIGEgbWV0 aG9kIG5hbWUgdGhhdCBjb25zdW1lcyB0aGUgZXZlbnQgKGFuZCB0aGVyZWZv cmUKICAvLyBpbmNvbXBhdGlibGUgd2l0aCBzZW5kQWN0aW9uIHNlbWFudGlj cykuCiAgaWYgKG9uID09PSBldmVudE5hbWUgfHwgKG9uID09PSAna2V5UHJl c3MnICYmIGV2ZW50TmFtZSA9PT0gJ2tleS1wcmVzcycpKSB7CiAgICB2aWV3 LnNlbmRBY3Rpb24oJ2FjdGlvbicsIHZhbHVlKTsKICB9CgogIHZpZXcuc2Vu ZEFjdGlvbihldmVudE5hbWUsIHZhbHVlKTsKCiAgaWYgKGFjdGlvbiB8fCBv biA9PT0gZXZlbnROYW1lKSB7CiAgICBpZighZ2V0KHZpZXcsICdidWJibGVz JykpIHsKICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICB9CiAg fQp9Cgp9KSgpOwoKCgooZnVuY3Rpb24oKSB7Ci8qKgpAbW9kdWxlIGVtYmVy CkBzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycwoqLwoKdmFyIGdldCA9IEVt YmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwoKLyoqCgogIFRoZSBpbnRlcm5h bCBjbGFzcyB1c2VkIHRvIGNyZWF0ZSB0ZXh0IGlucHV0cyB3aGVuIHRoZSBg e3tpbnB1dH19YAogIGhlbHBlciBpcyB1c2VkIHdpdGggYHR5cGVgIG9mIGB0 ZXh0YC4KCiAgU2VlIFtIYW5kbGViYXJzLmhlbHBlcnMuaW5wdXRdKC9hcGkv Y2xhc3Nlcy9FbWJlci5IYW5kbGViYXJzLmhlbHBlcnMuaHRtbCNtZXRob2Rf aW5wdXQpICBmb3IgdXNhZ2UgZGV0YWlscy4KCiAgIyMgTGF5b3V0IGFuZCBM YXlvdXROYW1lIHByb3BlcnRpZXMKCiAgQmVjYXVzZSBIVE1MIGBpbnB1dGAg ZWxlbWVudHMgYXJlIHNlbGYgY2xvc2luZyBgbGF5b3V0YCBhbmQgYGxheW91 dE5hbWVgCiAgcHJvcGVydGllcyB3aWxsIG5vdCBiZSBhcHBsaWVkLiBTZWUg W0VtYmVyLlZpZXddKC9hcGkvY2xhc3Nlcy9FbWJlci5WaWV3Lmh0bWwpJ3MK ICBsYXlvdXQgc2VjdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KCiAgQGNs YXNzIFRleHRGaWVsZAogIEBuYW1lc3BhY2UgRW1iZXIKICBAZXh0ZW5kcyBF bWJlci5Db21wb25lbnQKICBAdXNlcyBFbWJlci5UZXh0U3VwcG9ydAoqLwpF bWJlci5UZXh0RmllbGQgPSBFbWJlci5Db21wb25lbnQuZXh0ZW5kKEVtYmVy LlRleHRTdXBwb3J0LCB7CgogIGNsYXNzTmFtZXM6IFsnZW1iZXItdGV4dC1m aWVsZCddLAogIHRhZ05hbWU6ICJpbnB1dCIsCiAgYXR0cmlidXRlQmluZGlu Z3M6IFsndHlwZScsICd2YWx1ZScsICdzaXplJywgJ3BhdHRlcm4nLCAnbmFt ZScsICdtaW4nLCAnbWF4JywKICAgICAgICAgICAgICAgICAgICAgICdhY2Nl cHQnLCAnYXV0b2NvbXBsZXRlJywgJ2F1dG9zYXZlJywgJ2Zvcm1hY3Rpb24n LAogICAgICAgICAgICAgICAgICAgICAgJ2Zvcm1lbmN0eXBlJywgJ2Zvcm1t ZXRob2QnLCAnZm9ybW5vdmFsaWRhdGUnLCAnZm9ybXRhcmdldCcsCiAgICAg ICAgICAgICAgICAgICAgICAnaGVpZ2h0JywgJ2lucHV0bW9kZScsICdsaXN0 JywgJ211bHRpcGxlJywgJ3BhdHRlcm4nLCAnc3RlcCcsCiAgICAgICAgICAg ICAgICAgICAgICAnd2lkdGgnXSwKCiAgLyoqCiAgICBUaGUgYHZhbHVlYCBh dHRyaWJ1dGUgb2YgdGhlIGlucHV0IGVsZW1lbnQuIEFzIHRoZSB1c2VyIGlu cHV0cyB0ZXh0LCB0aGlzCiAgICBwcm9wZXJ0eSBpcyB1cGRhdGVkIGxpdmUu CgogICAgQHByb3BlcnR5IHZhbHVlCiAgICBAdHlwZSBTdHJpbmcKICAgIEBk ZWZhdWx0ICIiCiAgKi8KICB2YWx1ZTogIiIsCgogIC8qKgogICAgVGhlIGB0 eXBlYCBhdHRyaWJ1dGUgb2YgdGhlIGlucHV0IGVsZW1lbnQuCgogICAgQHBy b3BlcnR5IHR5cGUKICAgIEB0eXBlIFN0cmluZwogICAgQGRlZmF1bHQgInRl eHQiCiAgKi8KICB0eXBlOiAidGV4dCIsCgogIC8qKgogICAgVGhlIGBzaXpl YCBvZiB0aGUgdGV4dCBmaWVsZCBpbiBjaGFyYWN0ZXJzLgoKICAgIEBwcm9w ZXJ0eSBzaXplCiAgICBAdHlwZSBTdHJpbmcKICAgIEBkZWZhdWx0IG51bGwK ICAqLwogIHNpemU6IG51bGwsCgogIC8qKgogICAgVGhlIGBwYXR0ZXJuYCBh dHRyaWJ1dGUgb2YgaW5wdXQgZWxlbWVudC4KCiAgICBAcHJvcGVydHkgcGF0 dGVybgogICAgQHR5cGUgU3RyaW5nCiAgICBAZGVmYXVsdCBudWxsCiAgKi8K ICBwYXR0ZXJuOiBudWxsLAoKICAvKioKICAgIFRoZSBgbWluYCBhdHRyaWJ1 dGUgb2YgaW5wdXQgZWxlbWVudCB1c2VkIHdpdGggYHR5cGU9Im51bWJlciJg IG9yIGB0eXBlPSJyYW5nZSJgLgoKICAgIEBwcm9wZXJ0eSBtaW4gCiAgICBA dHlwZSBTdHJpbmcKICAgIEBkZWZhdWx0IG51bGwKICAqLwogIG1pbjogbnVs bCwKCiAgLyoqCiAgICBUaGUgYG1heGAgYXR0cmlidXRlIG9mIGlucHV0IGVs ZW1lbnQgdXNlZCB3aXRoIGB0eXBlPSJudW1iZXIiYCBvciBgdHlwZT0icmFu Z2UiYC4KCiAgICBAcHJvcGVydHkgbWF4IAogICAgQHR5cGUgU3RyaW5nCiAg ICBAZGVmYXVsdCBudWxsCiAgKi8KICBtYXg6IG51bGwKfSk7Cgp9KSgpOwoK CgooZnVuY3Rpb24oKSB7Ci8qKgpAbW9kdWxlIGVtYmVyCkBzdWJtb2R1bGUg ZW1iZXItaGFuZGxlYmFycwoqLwoKdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0 ID0gRW1iZXIuc2V0OwoKLyoqCiAgVGhlIGludGVybmFsIGNsYXNzIHVzZWQg dG8gY3JlYXRlIHRleHRhcmVhIGVsZW1lbnQgd2hlbiB0aGUgYHt7dGV4dGFy ZWF9fWAKICBoZWxwZXIgaXMgdXNlZC4KCiAgU2VlIFtoYW5kbGViYXJzLmhl bHBlcnMudGV4dGFyZWFdKC9hcGkvY2xhc3Nlcy9FbWJlci5IYW5kbGViYXJz LmhlbHBlcnMuaHRtbCNtZXRob2RfdGV4dGFyZWEpICBmb3IgdXNhZ2UgZGV0 YWlscy4KCiAgIyMgTGF5b3V0IGFuZCBMYXlvdXROYW1lIHByb3BlcnRpZXMK CiAgQmVjYXVzZSBIVE1MIGB0ZXh0YXJlYWAgZWxlbWVudHMgZG8gbm90IGNv bnRhaW4gaW5uZXIgSFRNTCB0aGUgYGxheW91dGAgYW5kCiAgYGxheW91dE5h bWVgIHByb3BlcnRpZXMgd2lsbCBub3QgYmUgYXBwbGllZC4gU2VlIFtFbWJl ci5WaWV3XSgvYXBpL2NsYXNzZXMvRW1iZXIuVmlldy5odG1sKSdzCiAgbGF5 b3V0IHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCgogIEBjbGFzcyBU ZXh0QXJlYQogIEBuYW1lc3BhY2UgRW1iZXIKICBAZXh0ZW5kcyBFbWJlci5D b21wb25lbnQKICBAdXNlcyBFbWJlci5UZXh0U3VwcG9ydAoqLwpFbWJlci5U ZXh0QXJlYSA9IEVtYmVyLkNvbXBvbmVudC5leHRlbmQoRW1iZXIuVGV4dFN1 cHBvcnQsIHsKICBjbGFzc05hbWVzOiBbJ2VtYmVyLXRleHQtYXJlYSddLAoK ICB0YWdOYW1lOiAidGV4dGFyZWEiLAogIGF0dHJpYnV0ZUJpbmRpbmdzOiBb J3Jvd3MnLCAnY29scycsICduYW1lJywgJ3NlbGVjdGlvbkVuZCcsICdzZWxl Y3Rpb25TdGFydCcsICd3cmFwJ10sCiAgcm93czogbnVsbCwKICBjb2xzOiBu dWxsLAoKICBfdXBkYXRlRWxlbWVudFZhbHVlOiBFbWJlci5vYnNlcnZlcign dmFsdWUnLCBmdW5jdGlvbigpIHsKICAgIC8vIFdlIGRvIHRoaXMgY2hlY2sg c28gY3Vyc29yIHBvc2l0aW9uIGRvZXNuJ3QgZ2V0IGFmZmVjdGVkIGluIElF CiAgICB2YXIgdmFsdWUgPSBnZXQodGhpcywgJ3ZhbHVlJyksCiAgICAgICAg JGVsID0gdGhpcy4kKCk7CiAgICBpZiAoJGVsICYmIHZhbHVlICE9PSAkZWwu dmFsKCkpIHsKICAgICAgJGVsLnZhbCh2YWx1ZSk7CiAgICB9CiAgfSksCgog IGluaXQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5fc3VwZXIoKTsKICAgIHRo aXMub24oImRpZEluc2VydEVsZW1lbnQiLCB0aGlzLCB0aGlzLl91cGRhdGVF bGVtZW50VmFsdWUpOwogIH0KCn0pOwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkg ewovKmpzaGludCBlcWVxZXE6ZmFsc2UgKi8KCi8qKgpAbW9kdWxlIGVtYmVy CkBzdWJtb2R1bGUgZW1iZXItaGFuZGxlYmFycwoqLwoKdmFyIHNldCA9IEVt YmVyLnNldCwKICAgIGdldCA9IEVtYmVyLmdldCwKICAgIGluZGV4T2YgPSBF bWJlci5FbnVtZXJhYmxlVXRpbHMuaW5kZXhPZiwKICAgIGluZGV4ZXNPZiA9 IEVtYmVyLkVudW1lcmFibGVVdGlscy5pbmRleGVzT2YsCiAgICBmb3JFYWNo ID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2gsCiAgICByZXBsYWNl ID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLnJlcGxhY2UsCiAgICBpc0FycmF5 ID0gRW1iZXIuaXNBcnJheSwKICAgIHByZWNvbXBpbGVUZW1wbGF0ZSA9IEVt YmVyLkhhbmRsZWJhcnMuY29tcGlsZTsKCkVtYmVyLlNlbGVjdE9wdGlvbiA9 IEVtYmVyLlZpZXcuZXh0ZW5kKHsKICB0YWdOYW1lOiAnb3B0aW9uJywKICBh dHRyaWJ1dGVCaW5kaW5nczogWyd2YWx1ZScsICdzZWxlY3RlZCddLAoKICBk ZWZhdWx0VGVtcGxhdGU6IGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHsK ICAgIG9wdGlvbnMgPSB7IGRhdGE6IG9wdGlvbnMuZGF0YSwgaGFzaDoge30g fTsKICAgIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycy5iaW5kLmNhbGwoY29u dGV4dCwgInZpZXcubGFiZWwiLCBvcHRpb25zKTsKICB9LAoKICBpbml0OiBm dW5jdGlvbigpIHsKICAgIHRoaXMubGFiZWxQYXRoRGlkQ2hhbmdlKCk7CiAg ICB0aGlzLnZhbHVlUGF0aERpZENoYW5nZSgpOwoKICAgIHRoaXMuX3N1cGVy KCk7CiAgfSwKCiAgc2VsZWN0ZWQ6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9u KCkgewogICAgdmFyIGNvbnRlbnQgPSBnZXQodGhpcywgJ2NvbnRlbnQnKSwK ICAgICAgICBzZWxlY3Rpb24gPSBnZXQodGhpcywgJ3BhcmVudFZpZXcuc2Vs ZWN0aW9uJyk7CiAgICBpZiAoZ2V0KHRoaXMsICdwYXJlbnRWaWV3Lm11bHRp cGxlJykpIHsKICAgICAgcmV0dXJuIHNlbGVjdGlvbiAmJiBpbmRleE9mKHNl bGVjdGlvbiwgY29udGVudC52YWx1ZU9mKCkpID4gLTE7CiAgICB9IGVsc2Ug ewogICAgICAvLyBQcmltaXRpdmVzIGdldCBwYXNzZWQgdGhyb3VnaCBiaW5k aW5ncyBhcyBvYmplY3RzLi4uIHNpbmNlCiAgICAgIC8vIGBuZXcgTnVtYmVy KDQpICE9PSA0YCwgd2UgdXNlIGA9PWAgYmVsb3cKICAgICAgcmV0dXJuIGNv bnRlbnQgPT0gc2VsZWN0aW9uOwogICAgfQogIH0pLnByb3BlcnR5KCdjb250 ZW50JywgJ3BhcmVudFZpZXcuc2VsZWN0aW9uJyksCgogIGxhYmVsUGF0aERp ZENoYW5nZTogRW1iZXIub2JzZXJ2ZXIoJ3BhcmVudFZpZXcub3B0aW9uTGFi ZWxQYXRoJywgZnVuY3Rpb24oKSB7CiAgICB2YXIgbGFiZWxQYXRoID0gZ2V0 KHRoaXMsICdwYXJlbnRWaWV3Lm9wdGlvbkxhYmVsUGF0aCcpOwoKICAgIGlm ICghbGFiZWxQYXRoKSB7IHJldHVybjsgfQoKICAgIEVtYmVyLmRlZmluZVBy b3BlcnR5KHRoaXMsICdsYWJlbCcsIEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9u KCkgewogICAgICByZXR1cm4gZ2V0KHRoaXMsIGxhYmVsUGF0aCk7CiAgICB9 KS5wcm9wZXJ0eShsYWJlbFBhdGgpKTsKICB9KSwKCiAgdmFsdWVQYXRoRGlk Q2hhbmdlOiBFbWJlci5vYnNlcnZlcigncGFyZW50Vmlldy5vcHRpb25WYWx1 ZVBhdGgnLCBmdW5jdGlvbigpIHsKICAgIHZhciB2YWx1ZVBhdGggPSBnZXQo dGhpcywgJ3BhcmVudFZpZXcub3B0aW9uVmFsdWVQYXRoJyk7CgogICAgaWYg KCF2YWx1ZVBhdGgpIHsgcmV0dXJuOyB9CgogICAgRW1iZXIuZGVmaW5lUHJv cGVydHkodGhpcywgJ3ZhbHVlJywgRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24o KSB7CiAgICAgIHJldHVybiBnZXQodGhpcywgdmFsdWVQYXRoKTsKICAgIH0p LnByb3BlcnR5KHZhbHVlUGF0aCkpOwogIH0pCn0pOwoKRW1iZXIuU2VsZWN0 T3B0Z3JvdXAgPSBFbWJlci5Db2xsZWN0aW9uVmlldy5leHRlbmQoewogIHRh Z05hbWU6ICdvcHRncm91cCcsCiAgYXR0cmlidXRlQmluZGluZ3M6IFsnbGFi ZWwnXSwKCiAgc2VsZWN0aW9uQmluZGluZzogJ3BhcmVudFZpZXcuc2VsZWN0 aW9uJywKICBtdWx0aXBsZUJpbmRpbmc6ICdwYXJlbnRWaWV3Lm11bHRpcGxl JywKICBvcHRpb25MYWJlbFBhdGhCaW5kaW5nOiAncGFyZW50Vmlldy5vcHRp b25MYWJlbFBhdGgnLAogIG9wdGlvblZhbHVlUGF0aEJpbmRpbmc6ICdwYXJl bnRWaWV3Lm9wdGlvblZhbHVlUGF0aCcsCgogIGl0ZW1WaWV3Q2xhc3NCaW5k aW5nOiAncGFyZW50Vmlldy5vcHRpb25WaWV3Jwp9KTsKCi8qKgogIFRoZSBg RW1iZXIuU2VsZWN0YCB2aWV3IGNsYXNzIHJlbmRlcnMgYQogIFtzZWxlY3Rd KGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0hUTUwvRWxlbWVu dC9zZWxlY3QpIEhUTUwgZWxlbWVudCwKICBhbGxvd2luZyB0aGUgdXNlciB0 byBjaG9vc2UgZnJvbSBhIGxpc3Qgb2Ygb3B0aW9ucy4KCiAgVGhlIHRleHQg YW5kIGB2YWx1ZWAgcHJvcGVydHkgb2YgZWFjaCBgPG9wdGlvbj5gIGVsZW1l bnQgd2l0aGluIHRoZQogIGA8c2VsZWN0PmAgZWxlbWVudCBhcmUgcG9wdWxh dGVkIGZyb20gdGhlIG9iamVjdHMgaW4gdGhlIGBFbGVtZW50LlNlbGVjdGAn cwogIGBjb250ZW50YCBwcm9wZXJ0eS4gVGhlIHVuZGVybHlpbmcgZGF0YSBv YmplY3Qgb2YgdGhlIHNlbGVjdGVkIGA8b3B0aW9uPmAgaXMKICBzdG9yZWQg aW4gdGhlIGBFbGVtZW50LlNlbGVjdGAncyBgdmFsdWVgIHByb3BlcnR5LgoK ICAjIyBUaGUgQ29udGVudCBQcm9wZXJ0eSAoYXJyYXkgb2Ygc3RyaW5ncykK CiAgVGhlIHNpbXBsZXN0IHZlcnNpb24gb2YgYW4gYEVtYmVyLlNlbGVjdGAg dGFrZXMgYW4gYXJyYXkgb2Ygc3RyaW5ncyBhcyBpdHMKICBgY29udGVudGAg cHJvcGVydHkuIFRoZSBzdHJpbmcgd2lsbCBiZSB1c2VkIGFzIGJvdGggdGhl IGB2YWx1ZWAgcHJvcGVydHkgYW5kCiAgdGhlIGlubmVyIHRleHQgb2YgZWFj aCBgPG9wdGlvbj5gIGVsZW1lbnQgaW5zaWRlIHRoZSByZW5kZXJlZCBgPHNl bGVjdD5gLgoKICBFeGFtcGxlOgoKICBgYGBqYXZhc2NyaXB0CiAgQXBwLkFw cGxpY2F0aW9uQ29udHJvbGxlciA9IEVtYmVyLkNvbnRyb2xsZXIuZXh0ZW5k KHsKICAgIG5hbWVzOiBbIlllaHVkYSIsICJUb20iXQogIH0pOwogIGBgYAoK ICBgYGBoYW5kbGViYXJzCiAge3t2aWV3IEVtYmVyLlNlbGVjdCBjb250ZW50 PW5hbWVzfX0KICBgYGAKCiAgV291bGQgcmVzdWx0IGluIHRoZSBmb2xsb3dp bmcgSFRNTDoKCiAgYGBgaHRtbAogIDxzZWxlY3QgY2xhc3M9ImVtYmVyLXNl bGVjdCI+CiAgICA8b3B0aW9uIHZhbHVlPSJZZWh1ZGEiPlllaHVkYTwvb3B0 aW9uPgogICAgPG9wdGlvbiB2YWx1ZT0iVG9tIj5Ub208L29wdGlvbj4KICA8 L3NlbGVjdD4KICBgYGAKCiAgWW91IGNhbiBjb250cm9sIHdoaWNoIGA8b3B0 aW9uPmAgaXMgc2VsZWN0ZWQgdGhyb3VnaCB0aGUgYEVtYmVyLlNlbGVjdGAn cwogIGB2YWx1ZWAgcHJvcGVydHk6CgogIGBgYGphdmFzY3JpcHQKICBBcHAu QXBwbGljYXRpb25Db250cm9sbGVyID0gRW1iZXIuQ29udHJvbGxlci5leHRl bmQoewogICAgc2VsZWN0ZWROYW1lOiAnVG9tJywKICAgIG5hbWVzOiBbIlll aHVkYSIsICJUb20iXQogIH0pOwogIGBgYAoKICBgYGBoYW5kbGViYXJzCiAg e3t2aWV3IEVtYmVyLlNlbGVjdAogICAgICAgICBjb250ZW50PW5hbWVzCiAg ICAgICAgIHZhbHVlPXNlbGVjdGVkTmFtZQogIH19CiAgYGBgCgogIFdvdWxk IHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUwgd2l0aCB0aGUgYDxvcHRp b24+YCBmb3IgJ1RvbScgc2VsZWN0ZWQ6CgogIGBgYGh0bWwKICA8c2VsZWN0 IGNsYXNzPSJlbWJlci1zZWxlY3QiPgogICAgPG9wdGlvbiB2YWx1ZT0iWWVo dWRhIj5ZZWh1ZGE8L29wdGlvbj4KICAgIDxvcHRpb24gdmFsdWU9IlRvbSIg c2VsZWN0ZWQ9InNlbGVjdGVkIj5Ub208L29wdGlvbj4KICA8L3NlbGVjdD4K ICBgYGAKCiAgQSB1c2VyIGludGVyYWN0aW5nIHdpdGggdGhlIHJlbmRlcmVk IGA8c2VsZWN0PmAgdG8gY2hvb3NlICJZZWh1ZGEiIHdvdWxkCiAgdXBkYXRl IHRoZSB2YWx1ZSBvZiBgc2VsZWN0ZWROYW1lYCB0byAiWWVodWRhIi4KCiAg IyMgVGhlIENvbnRlbnQgUHJvcGVydHkgKGFycmF5IG9mIE9iamVjdHMpCgog IEFuIGBFbWJlci5TZWxlY3RgIGNhbiBhbHNvIHRha2UgYW4gYXJyYXkgb2Yg SmF2YVNjcmlwdCBvciBFbWJlciBvYmplY3RzIGFzCiAgaXRzIGBjb250ZW50 YCBwcm9wZXJ0eS4KCiAgV2hlbiB1c2luZyBvYmplY3RzIHlvdSBuZWVkIHRv IHRlbGwgdGhlIGBFbWJlci5TZWxlY3RgIHdoaWNoIHByb3BlcnR5IHNob3Vs ZAogIGJlIGFjY2Vzc2VkIG9uIGVhY2ggb2JqZWN0IHRvIHN1cHBseSB0aGUg YHZhbHVlYCBhdHRyaWJ1dGUgb2YgdGhlIGA8b3B0aW9uPmAKICBhbmQgd2hp Y2ggcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQgdG8gc3VwcGx5IHRoZSBlbGVt ZW50IHRleHQuCgogIFRoZSBgb3B0aW9uVmFsdWVQYXRoYCBvcHRpb24gaXMg dXNlZCB0byBzcGVjaWZ5IHRoZSBwYXRoIG9uIGVhY2ggb2JqZWN0IHRvCiAg dGhlIGRlc2lyZWQgcHJvcGVydHkgZm9yIHRoZSBgdmFsdWVgIGF0dHJpYnV0 ZS4gVGhlIGBvcHRpb25MYWJlbFBhdGhgCiAgc3BlY2lmaWVzIHRoZSBwYXRo IG9uIGVhY2ggb2JqZWN0IHRvIHRoZSBkZXNpcmVkIHByb3BlcnR5IGZvciB0 aGUKICBlbGVtZW50J3MgdGV4dC4gQm90aCBwYXRocyBtdXN0IHJlZmVyZW5j ZSBlYWNoIG9iamVjdCBpdHNlbGYgYXMgYGNvbnRlbnRgOgoKICBgYGBqYXZh c2NyaXB0CiAgQXBwLkFwcGxpY2F0aW9uQ29udHJvbGxlciA9IEVtYmVyLkNv bnRyb2xsZXIuZXh0ZW5kKHsKICAgIHByb2dyYW1tZXJzOiBbCiAgICAgIHtm aXJzdE5hbWU6ICJZZWh1ZGEiLCBpZDogMX0sCiAgICAgIHtmaXJzdE5hbWU6 ICJUb20iLCAgICBpZDogMn0KICAgIF0KICB9KTsKICBgYGAKCiAgYGBgaGFu ZGxlYmFycwogIHt7dmlldyBFbWJlci5TZWxlY3QKICAgICAgICAgY29udGVu dD1wcm9ncmFtbWVycwogICAgICAgICBvcHRpb25WYWx1ZVBhdGg9ImNvbnRl bnQuaWQiCiAgICAgICAgIG9wdGlvbkxhYmVsUGF0aD0iY29udGVudC5maXJz dE5hbWUifX0KICBgYGAKCiAgV291bGQgcmVzdWx0IGluIHRoZSBmb2xsb3dp bmcgSFRNTDoKCiAgYGBgaHRtbAogIDxzZWxlY3QgY2xhc3M9ImVtYmVyLXNl bGVjdCI+CiAgICA8b3B0aW9uIHZhbHVlPSIxIj5ZZWh1ZGE8L29wdGlvbj4K ICAgIDxvcHRpb24gdmFsdWU9IjIiPlRvbTwvb3B0aW9uPgogIDwvc2VsZWN0 PgogIGBgYAoKICBUaGUgYHZhbHVlYCBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVj dGVkIGA8b3B0aW9uPmAgd2l0aGluIGFuIGBFbWJlci5TZWxlY3RgCiAgY2Fu IGJlIGJvdW5kIHRvIGEgcHJvcGVydHkgb24gYW5vdGhlciBvYmplY3Q6Cgog IGBgYGphdmFzY3JpcHQKICBBcHAuQXBwbGljYXRpb25Db250cm9sbGVyID0g RW1iZXIuQ29udHJvbGxlci5leHRlbmQoewogICAgcHJvZ3JhbW1lcnM6IFsK ICAgICAge2ZpcnN0TmFtZTogIlllaHVkYSIsIGlkOiAxfSwKICAgICAge2Zp cnN0TmFtZTogIlRvbSIsICAgIGlkOiAyfQogICAgXSwKICAgIGN1cnJlbnRQ cm9ncmFtbWVyOiB7CiAgICAgIGlkOiAyCiAgICB9CiAgfSk7CiAgYGBgCgog IGBgYGhhbmRsZWJhcnMKICB7e3ZpZXcgRW1iZXIuU2VsZWN0CiAgICAgICAg IGNvbnRlbnQ9cHJvZ3JhbW1lcnMKICAgICAgICAgb3B0aW9uVmFsdWVQYXRo PSJjb250ZW50LmlkIgogICAgICAgICBvcHRpb25MYWJlbFBhdGg9ImNvbnRl bnQuZmlyc3ROYW1lIgogICAgICAgICB2YWx1ZT1jdXJyZW50UHJvZ3JhbW1l ci5pZH19CiAgYGBgCgogIFdvdWxkIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5n IEhUTUwgd2l0aCBhIHNlbGVjdGVkIG9wdGlvbjoKCiAgYGBgaHRtbAogIDxz ZWxlY3QgY2xhc3M9ImVtYmVyLXNlbGVjdCI+CiAgICA8b3B0aW9uIHZhbHVl PSIxIj5ZZWh1ZGE8L29wdGlvbj4KICAgIDxvcHRpb24gdmFsdWU9IjIiIHNl bGVjdGVkPSJzZWxlY3RlZCI+VG9tPC9vcHRpb24+CiAgPC9zZWxlY3Q+CiAg YGBgCgogIEludGVyYWN0aW5nIHdpdGggdGhlIHJlbmRlcmVkIGVsZW1lbnQg Ynkgc2VsZWN0aW5nIHRoZSBmaXJzdCBvcHRpb24KICAoJ1llaHVkYScpIHdp bGwgdXBkYXRlIHRoZSBgaWRgIG9mIGBjdXJyZW50UHJvZ3JhbW1lcmAKICB0 byBtYXRjaCB0aGUgYHZhbHVlYCBwcm9wZXJ0eSBvZiB0aGUgbmV3bHkgc2Vs ZWN0ZWQgYDxvcHRpb24+YC4KCiAgQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBj b250cm9sIHNlbGVjdGlvbiB0aHJvdWdoIHRoZSB1bmRlcmx5aW5nIG9iamVj dHMKICB1c2VkIHRvIHJlbmRlciBlYWNoIG9iamVjdCBieSBiaW5kaW5nIHRo ZSBgc2VsZWN0aW9uYCBvcHRpb24uIFdoZW4gdGhlIHNlbGVjdGVkCiAgYDxv cHRpb24+YCBpcyBjaGFuZ2VkLCB0aGUgcHJvcGVydHkgcGF0aCBwcm92aWRl ZCB0byBgc2VsZWN0aW9uYAogIHdpbGwgYmUgdXBkYXRlZCB0byBtYXRjaCB0 aGUgY29udGVudCBvYmplY3Qgb2YgdGhlIHJlbmRlcmVkIGA8b3B0aW9uPmAK ICBlbGVtZW50OgoKICBgYGBqYXZhc2NyaXB0CiAgQXBwLkFwcGxpY2F0aW9u Q29udHJvbGxlciA9IEVtYmVyLkNvbnRyb2xsZXIuZXh0ZW5kKHsKICAgIHNl bGVjdGVkUGVyc29uOiBudWxsLAogICAgcHJvZ3JhbW1lcnM6IFsKICAgICAg e2ZpcnN0TmFtZTogIlllaHVkYSIsIGlkOiAxfSwKICAgICAge2ZpcnN0TmFt ZTogIlRvbSIsICAgIGlkOiAyfQogICAgXQogIH0pOwogIGBgYAoKICBgYGBo YW5kbGViYXJzCiAge3t2aWV3IEVtYmVyLlNlbGVjdAogICAgICAgICBjb250 ZW50PXByb2dyYW1tZXJzCiAgICAgICAgIG9wdGlvblZhbHVlUGF0aD0iY29u dGVudC5pZCIKICAgICAgICAgb3B0aW9uTGFiZWxQYXRoPSJjb250ZW50LmZp cnN0TmFtZSIKICAgICAgICAgc2VsZWN0aW9uPXNlbGVjdGVkUGVyc29ufX0K ICBgYGAKCiAgV291bGQgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgSFRNTCB3 aXRoIGEgc2VsZWN0ZWQgb3B0aW9uOgoKICBgYGBodG1sCiAgPHNlbGVjdCBj bGFzcz0iZW1iZXItc2VsZWN0Ij4KICAgIDxvcHRpb24gdmFsdWU9IjEiPlll aHVkYTwvb3B0aW9uPgogICAgPG9wdGlvbiB2YWx1ZT0iMiIgc2VsZWN0ZWQ9 InNlbGVjdGVkIj5Ub208L29wdGlvbj4KICA8L3NlbGVjdD4KICBgYGAKCiAg SW50ZXJhY3Rpbmcgd2l0aCB0aGUgcmVuZGVyZWQgZWxlbWVudCBieSBzZWxl Y3RpbmcgdGhlIGZpcnN0IG9wdGlvbgogICgnWWVodWRhJykgd2lsbCB1cGRh dGUgdGhlIGBzZWxlY3RlZFBlcnNvbmAgdG8gbWF0Y2ggdGhlIG9iamVjdCBv ZgogIHRoZSBuZXdseSBzZWxlY3RlZCBgPG9wdGlvbj5gLiBJbiB0aGlzIGNh c2UgaXQgaXMgdGhlIGZpcnN0IG9iamVjdAogIGluIHRoZSBgcHJvZ3JhbW1l cnNgCgogICMjIFN1cHBseWluZyBhIFByb21wdAoKICBBIGBudWxsYCB2YWx1 ZSBmb3IgdGhlIGBFbWJlci5TZWxlY3RgJ3MgYHZhbHVlYCBvciBgc2VsZWN0 aW9uYCBwcm9wZXJ0eQogIHJlc3VsdHMgaW4gdGhlcmUgYmVpbmcgbm8gYDxv cHRpb24+YCB3aXRoIGEgYHNlbGVjdGVkYCBhdHRyaWJ1dGU6CgogIGBgYGph dmFzY3JpcHQKICBBcHAuQXBwbGljYXRpb25Db250cm9sbGVyID0gRW1iZXIu Q29udHJvbGxlci5leHRlbmQoewogICAgc2VsZWN0ZWRQcm9ncmFtbWVyOiBu dWxsLAogICAgcHJvZ3JhbW1lcnM6IFsKICAgICAgIlllaHVkYSIsCiAgICAg ICJUb20iCiAgICBdCiAgfSk7CiAgYGBgCgogIGBgYCBoYW5kbGViYXJzCiAg e3t2aWV3IEVtYmVyLlNlbGVjdAogICAgICAgICBjb250ZW50PXByb2dyYW1t ZXJzCiAgICAgICAgIHZhbHVlPXNlbGVjdGVkUHJvZ3JhbW1lcgogIH19CiAg YGBgCgogIFdvdWxkIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIEhUTUw6Cgog IGBgYGh0bWwKICA8c2VsZWN0IGNsYXNzPSJlbWJlci1zZWxlY3QiPgogICAg PG9wdGlvbiB2YWx1ZT0iWWVodWRhIj5ZZWh1ZGE8L29wdGlvbj4KICAgIDxv cHRpb24gdmFsdWU9IlRvbSI+VG9tPC9vcHRpb24+CiAgPC9zZWxlY3Q+CiAg YGBgCgogIEFsdGhvdWdoIGBzZWxlY3RlZFByb2dyYW1tZXJgIGlzIGBudWxs YCBhbmQgbm8gYDxvcHRpb24+YAogIGhhcyBhIGBzZWxlY3RlZGAgYXR0cmli dXRlIHRoZSByZW5kZXJlZCBIVE1MIHdpbGwgZGlzcGxheSB0aGUKICBmaXJz dCBpdGVtIGFzIHRob3VnaCBpdCB3ZXJlIHNlbGVjdGVkLiBZb3UgY2FuIHN1 cHBseSBhIHN0cmluZwogIHZhbHVlIGZvciB0aGUgYEVtYmVyLlNlbGVjdGAg dG8gZGlzcGxheSB3aGVuIHRoZXJlIGlzIG5vIHNlbGVjdGlvbgogIHdpdGgg dGhlIGBwcm9tcHRgIG9wdGlvbjoKCiAgYGBgamF2YXNjcmlwdAogIEFwcC5B cHBsaWNhdGlvbkNvbnRyb2xsZXIgPSBFbWJlci5Db250cm9sbGVyLmV4dGVu ZCh7CiAgICBzZWxlY3RlZFByb2dyYW1tZXI6IG51bGwsCiAgICBwcm9ncmFt bWVyczogWwogICAgICAiWWVodWRhIiwKICAgICAgIlRvbSIKICAgIF0KICB9 KTsKICBgYGAKCiAgYGBgaGFuZGxlYmFycwogIHt7dmlldyBFbWJlci5TZWxl Y3QKICAgICAgICAgY29udGVudD1wcm9ncmFtbWVycwogICAgICAgICB2YWx1 ZT1zZWxlY3RlZFByb2dyYW1tZXIKICAgICAgICAgcHJvbXB0PSJQbGVhc2Ug c2VsZWN0IGEgbmFtZSIKICB9fQogIGBgYAoKICBXb3VsZCByZXN1bHQgaW4g dGhlIGZvbGxvd2luZyBIVE1MOgoKICBgYGBodG1sCiAgPHNlbGVjdCBjbGFz cz0iZW1iZXItc2VsZWN0Ij4KICAgIDxvcHRpb24+UGxlYXNlIHNlbGVjdCBh IG5hbWU8L29wdGlvbj4KICAgIDxvcHRpb24gdmFsdWU9IlllaHVkYSI+WWVo dWRhPC9vcHRpb24+CiAgICA8b3B0aW9uIHZhbHVlPSJUb20iPlRvbTwvb3B0 aW9uPgogIDwvc2VsZWN0PgogIGBgYAoKICBAY2xhc3MgU2VsZWN0CiAgQG5h bWVzcGFjZSBFbWJlcgogIEBleHRlbmRzIEVtYmVyLlZpZXcKKi8KRW1iZXIu U2VsZWN0ID0gRW1iZXIuVmlldy5leHRlbmQoewogIHRhZ05hbWU6ICdzZWxl Y3QnLAogIGNsYXNzTmFtZXM6IFsnZW1iZXItc2VsZWN0J10sCiAgZGVmYXVs dFRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLnRlbXBsYXRlKGZ1bmN0aW9u IGFub255bW91cyhIYW5kbGViYXJzLGRlcHRoMCxoZWxwZXJzLHBhcnRpYWxz LGRhdGEpIHsKdGhpcy5jb21waWxlckluZm8gPSBbNCwnPj0gMS4wLjAnXTsK aGVscGVycyA9IHRoaXMubWVyZ2UoaGVscGVycywgRW1iZXIuSGFuZGxlYmFy cy5oZWxwZXJzKTsgZGF0YSA9IGRhdGEgfHwge307CiAgdmFyIGJ1ZmZlciA9 ICcnLCBzdGFjazEsIGVzY2FwZUV4cHJlc3Npb249dGhpcy5lc2NhcGVFeHBy ZXNzaW9uLCBzZWxmPXRoaXM7CgpmdW5jdGlvbiBwcm9ncmFtMShkZXB0aDAs ZGF0YSkgewogIAogIHZhciBidWZmZXIgPSAnJywgc3RhY2sxOwogIGRhdGEu YnVmZmVyLnB1c2goIjxvcHRpb24gdmFsdWU9XCJcIj4iKTsKICBzdGFjazEg PSBoZWxwZXJzLl90cmlhZ2VNdXN0YWNoZS5jYWxsKGRlcHRoMCwgInZpZXcu cHJvbXB0Iiwge2hhc2g6e30saGFzaFR5cGVzOnt9LGhhc2hDb250ZXh0czp7 fSxjb250ZXh0czpbZGVwdGgwXSx0eXBlczpbIklEIl0sZGF0YTpkYXRhfSk7 CiAgaWYoc3RhY2sxIHx8IHN0YWNrMSA9PT0gMCkgeyBkYXRhLmJ1ZmZlci5w dXNoKHN0YWNrMSk7IH0KICBkYXRhLmJ1ZmZlci5wdXNoKCI8L29wdGlvbj4i KTsKICByZXR1cm4gYnVmZmVyOwogIH0KCmZ1bmN0aW9uIHByb2dyYW0zKGRl cHRoMCxkYXRhKSB7CiAgCiAgdmFyIHN0YWNrMTsKICBzdGFjazEgPSBoZWxw ZXJzLmVhY2guY2FsbChkZXB0aDAsICJ2aWV3Lmdyb3VwZWRDb250ZW50Iiwg e2hhc2g6e30saGFzaFR5cGVzOnt9LGhhc2hDb250ZXh0czp7fSxpbnZlcnNl OnNlbGYubm9vcCxmbjpzZWxmLnByb2dyYW0oNCwgcHJvZ3JhbTQsIGRhdGEp LGNvbnRleHRzOltkZXB0aDBdLHR5cGVzOlsiSUQiXSxkYXRhOmRhdGF9KTsK ICBpZihzdGFjazEgfHwgc3RhY2sxID09PSAwKSB7IGRhdGEuYnVmZmVyLnB1 c2goc3RhY2sxKTsgfQogIGVsc2UgeyBkYXRhLmJ1ZmZlci5wdXNoKCcnKTsg fQogIH0KZnVuY3Rpb24gcHJvZ3JhbTQoZGVwdGgwLGRhdGEpIHsKICAKICAK ICBkYXRhLmJ1ZmZlci5wdXNoKGVzY2FwZUV4cHJlc3Npb24oaGVscGVycy52 aWV3LmNhbGwoZGVwdGgwLCAidmlldy5ncm91cFZpZXciLCB7aGFzaDp7CiAg ICAnY29udGVudCc6ICgiY29udGVudCIpLAogICAgJ2xhYmVsJzogKCJsYWJl bCIpCiAgfSxoYXNoVHlwZXM6eydjb250ZW50JzogIklEIiwnbGFiZWwnOiAi SUQifSxoYXNoQ29udGV4dHM6eydjb250ZW50JzogZGVwdGgwLCdsYWJlbCc6 IGRlcHRoMH0sY29udGV4dHM6W2RlcHRoMF0sdHlwZXM6WyJJRCJdLGRhdGE6 ZGF0YX0pKSk7CiAgfQoKZnVuY3Rpb24gcHJvZ3JhbTYoZGVwdGgwLGRhdGEp IHsKICAKICB2YXIgc3RhY2sxOwogIHN0YWNrMSA9IGhlbHBlcnMuZWFjaC5j YWxsKGRlcHRoMCwgInZpZXcuY29udGVudCIsIHtoYXNoOnt9LGhhc2hUeXBl czp7fSxoYXNoQ29udGV4dHM6e30saW52ZXJzZTpzZWxmLm5vb3AsZm46c2Vs Zi5wcm9ncmFtKDcsIHByb2dyYW03LCBkYXRhKSxjb250ZXh0czpbZGVwdGgw XSx0eXBlczpbIklEIl0sZGF0YTpkYXRhfSk7CiAgaWYoc3RhY2sxIHx8IHN0 YWNrMSA9PT0gMCkgeyBkYXRhLmJ1ZmZlci5wdXNoKHN0YWNrMSk7IH0KICBl bHNlIHsgZGF0YS5idWZmZXIucHVzaCgnJyk7IH0KICB9CmZ1bmN0aW9uIHBy b2dyYW03KGRlcHRoMCxkYXRhKSB7CiAgCiAgCiAgZGF0YS5idWZmZXIucHVz aChlc2NhcGVFeHByZXNzaW9uKGhlbHBlcnMudmlldy5jYWxsKGRlcHRoMCwg InZpZXcub3B0aW9uVmlldyIsIHtoYXNoOnsKICAgICdjb250ZW50JzogKCIi KQogIH0saGFzaFR5cGVzOnsnY29udGVudCc6ICJJRCJ9LGhhc2hDb250ZXh0 czp7J2NvbnRlbnQnOiBkZXB0aDB9LGNvbnRleHRzOltkZXB0aDBdLHR5cGVz OlsiSUQiXSxkYXRhOmRhdGF9KSkpOwogIH0KCiAgc3RhY2sxID0gaGVscGVy c1snaWYnXS5jYWxsKGRlcHRoMCwgInZpZXcucHJvbXB0Iiwge2hhc2g6e30s aGFzaFR5cGVzOnt9LGhhc2hDb250ZXh0czp7fSxpbnZlcnNlOnNlbGYubm9v cCxmbjpzZWxmLnByb2dyYW0oMSwgcHJvZ3JhbTEsIGRhdGEpLGNvbnRleHRz OltkZXB0aDBdLHR5cGVzOlsiSUQiXSxkYXRhOmRhdGF9KTsKICBpZihzdGFj azEgfHwgc3RhY2sxID09PSAwKSB7IGRhdGEuYnVmZmVyLnB1c2goc3RhY2sx KTsgfQogIHN0YWNrMSA9IGhlbHBlcnNbJ2lmJ10uY2FsbChkZXB0aDAsICJ2 aWV3Lm9wdGlvbkdyb3VwUGF0aCIsIHtoYXNoOnt9LGhhc2hUeXBlczp7fSxo YXNoQ29udGV4dHM6e30saW52ZXJzZTpzZWxmLnByb2dyYW0oNiwgcHJvZ3Jh bTYsIGRhdGEpLGZuOnNlbGYucHJvZ3JhbSgzLCBwcm9ncmFtMywgZGF0YSks Y29udGV4dHM6W2RlcHRoMF0sdHlwZXM6WyJJRCJdLGRhdGE6ZGF0YX0pOwog IGlmKHN0YWNrMSB8fCBzdGFjazEgPT09IDApIHsgZGF0YS5idWZmZXIucHVz aChzdGFjazEpOyB9CiAgcmV0dXJuIGJ1ZmZlcjsKICAKfSksCiAgYXR0cmli dXRlQmluZGluZ3M6IFsnbXVsdGlwbGUnLCAnZGlzYWJsZWQnLCAndGFiaW5k ZXgnLCAnbmFtZScsICdyZXF1aXJlZCcsICdhdXRvZm9jdXMnLAogICAgICAg ICAgICAgICAgICAgICAgJ2Zvcm0nLCAnc2l6ZSddLAoKICAvKioKICAgIFRo ZSBgbXVsdGlwbGVgIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0IGVsZW1lbnQu IEluZGljYXRlcyB3aGV0aGVyIG11bHRpcGxlCiAgICBvcHRpb25zIGNhbiBi ZSBzZWxlY3RlZC4KCiAgICBAcHJvcGVydHkgbXVsdGlwbGUKICAgIEB0eXBl IEJvb2xlYW4KICAgIEBkZWZhdWx0IGZhbHNlCiAgKi8KICBtdWx0aXBsZTog ZmFsc2UsCgogIC8qKgogICAgVGhlIGBkaXNhYmxlZGAgYXR0cmlidXRlIG9m IHRoZSBzZWxlY3QgZWxlbWVudC4gSW5kaWNhdGVzIHdoZXRoZXIKICAgIHRo ZSBlbGVtZW50IGlzIGRpc2FibGVkIGZyb20gaW50ZXJhY3Rpb25zLgoKICAg IEBwcm9wZXJ0eSBkaXNhYmxlZAogICAgQHR5cGUgQm9vbGVhbgogICAgQGRl ZmF1bHQgZmFsc2UKICAqLwogIGRpc2FibGVkOiBmYWxzZSwKCiAgLyoqCiAg ICBUaGUgYHJlcXVpcmVkYCBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdCBlbGVt ZW50LiBJbmRpY2F0ZXMgd2hldGhlcgogICAgYSBzZWxlY3RlZCBvcHRpb24g aXMgcmVxdWlyZWQgZm9yIGZvcm0gdmFsaWRhdGlvbi4KCiAgICBAcHJvcGVy dHkgcmVxdWlyZWQKICAgIEB0eXBlIEJvb2xlYW4KICAgIEBkZWZhdWx0IGZh bHNlCiAgKi8KICByZXF1aXJlZDogZmFsc2UsCgogIC8qKgogICAgVGhlIGxp c3Qgb2Ygb3B0aW9ucy4KCiAgICBJZiBgb3B0aW9uTGFiZWxQYXRoYCBhbmQg YG9wdGlvblZhbHVlUGF0aGAgYXJlIG5vdCBvdmVycmlkZGVuLCB0aGlzIHNo b3VsZAogICAgYmUgYSBsaXN0IG9mIHN0cmluZ3MsIHdoaWNoIHdpbGwgc2Vy dmUgc2ltdWx0YW5lb3VzbHkgYXMgbGFiZWxzIGFuZCB2YWx1ZXMuCgogICAg T3RoZXJ3aXNlLCB0aGlzIHNob3VsZCBiZSBhIGxpc3Qgb2Ygb2JqZWN0cy4g Rm9yIGluc3RhbmNlOgoKICAgIGBgYGphdmFzY3JpcHQKICAgIEVtYmVyLlNl bGVjdC5jcmVhdGUoewogICAgICBjb250ZW50OiBFbWJlci5BKFsKICAgICAg ICAgIHsgaWQ6IDEsIGZpcnN0TmFtZTogJ1llaHVkYScgfSwKICAgICAgICAg IHsgaWQ6IDIsIGZpcnN0TmFtZTogJ1RvbScgfQogICAgICAgIF0pLAogICAg ICBvcHRpb25MYWJlbFBhdGg6ICdjb250ZW50LmZpcnN0TmFtZScsCiAgICAg IG9wdGlvblZhbHVlUGF0aDogJ2NvbnRlbnQuaWQnCiAgICB9KTsKICAgIGBg YAoKICAgIEBwcm9wZXJ0eSBjb250ZW50CiAgICBAdHlwZSBBcnJheQogICAg QGRlZmF1bHQgbnVsbAogICovCiAgY29udGVudDogbnVsbCwKCiAgLyoqCiAg ICBXaGVuIGBtdWx0aXBsZWAgaXMgYGZhbHNlYCwgdGhlIGVsZW1lbnQgb2Yg YGNvbnRlbnRgIHRoYXQgaXMgY3VycmVudGx5CiAgICBzZWxlY3RlZCwgaWYg YW55LgoKICAgIFdoZW4gYG11bHRpcGxlYCBpcyBgdHJ1ZWAsIGFuIGFycmF5 IG9mIHN1Y2ggZWxlbWVudHMuCgogICAgQHByb3BlcnR5IHNlbGVjdGlvbgog ICAgQHR5cGUgT2JqZWN0IG9yIEFycmF5CiAgICBAZGVmYXVsdCBudWxsCiAg Ki8KICBzZWxlY3Rpb246IG51bGwsCgogIC8qKgogICAgSW4gc2luZ2xlIHNl bGVjdGlvbiBtb2RlICh3aGVuIGBtdWx0aXBsZWAgaXMgYGZhbHNlYCksIHZh bHVlIGNhbiBiZSB1c2VkIHRvCiAgICBnZXQgdGhlIGN1cnJlbnQgc2VsZWN0 aW9uJ3MgdmFsdWUgb3Igc2V0IHRoZSBzZWxlY3Rpb24gYnkgaXQncyB2YWx1 ZS4KCiAgICBJdCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBpbiBtdWx0 aXBsZSBzZWxlY3Rpb24gbW9kZS4KCiAgICBAcHJvcGVydHkgdmFsdWUKICAg IEB0eXBlIFN0cmluZwogICAgQGRlZmF1bHQgbnVsbAogICovCiAgdmFsdWU6 IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgIGlm IChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7IHJldHVybiB2YWx1ZTsgfQog ICAgdmFyIHZhbHVlUGF0aCA9IGdldCh0aGlzLCAnb3B0aW9uVmFsdWVQYXRo JykucmVwbGFjZSgvXmNvbnRlbnRcLj8vLCAnJyk7CiAgICByZXR1cm4gdmFs dWVQYXRoID8gZ2V0KHRoaXMsICdzZWxlY3Rpb24uJyArIHZhbHVlUGF0aCkg OiBnZXQodGhpcywgJ3NlbGVjdGlvbicpOwogIH0pLnByb3BlcnR5KCdzZWxl Y3Rpb24nKSwKCiAgLyoqCiAgICBJZiBnaXZlbiwgYSB0b3AtbW9zdCBkdW1t eSBvcHRpb24gd2lsbCBiZSByZW5kZXJlZCB0byBzZXJ2ZSBhcyBhIHVzZXIK ICAgIHByb21wdC4KCiAgICBAcHJvcGVydHkgcHJvbXB0CiAgICBAdHlwZSBT dHJpbmcKICAgIEBkZWZhdWx0IG51bGwKICAqLwogIHByb21wdDogbnVsbCwK CiAgLyoqCiAgICBUaGUgcGF0aCBvZiB0aGUgb3B0aW9uIGxhYmVscy4gU2Vl IFtjb250ZW50XSgvYXBpL2NsYXNzZXMvRW1iZXIuU2VsZWN0Lmh0bWwjcHJv cGVydHlfY29udGVudCkuCgogICAgQHByb3BlcnR5IG9wdGlvbkxhYmVsUGF0 aAogICAgQHR5cGUgU3RyaW5nCiAgICBAZGVmYXVsdCAnY29udGVudCcKICAq LwogIG9wdGlvbkxhYmVsUGF0aDogJ2NvbnRlbnQnLAoKICAvKioKICAgIFRo ZSBwYXRoIG9mIHRoZSBvcHRpb24gdmFsdWVzLiBTZWUgW2NvbnRlbnRdKC9h cGkvY2xhc3Nlcy9FbWJlci5TZWxlY3QuaHRtbCNwcm9wZXJ0eV9jb250ZW50 KS4KCiAgICBAcHJvcGVydHkgb3B0aW9uVmFsdWVQYXRoCiAgICBAdHlwZSBT dHJpbmcKICAgIEBkZWZhdWx0ICdjb250ZW50JwogICovCiAgb3B0aW9uVmFs dWVQYXRoOiAnY29udGVudCcsCgogIC8qKgogICAgVGhlIHBhdGggb2YgdGhl IG9wdGlvbiBncm91cC4KICAgIFdoZW4gdGhpcyBwcm9wZXJ0eSBpcyB1c2Vk LCBgY29udGVudGAgc2hvdWxkIGJlIHNvcnRlZCBieSBgb3B0aW9uR3JvdXBQ YXRoYC4KCiAgICBAcHJvcGVydHkgb3B0aW9uR3JvdXBQYXRoCiAgICBAdHlw ZSBTdHJpbmcKICAgIEBkZWZhdWx0IG51bGwKICAqLwogIG9wdGlvbkdyb3Vw UGF0aDogbnVsbCwKCiAgLyoqCiAgICBUaGUgdmlldyBjbGFzcyBmb3Igb3B0 Z3JvdXAuCgogICAgQHByb3BlcnR5IGdyb3VwVmlldwogICAgQHR5cGUgRW1i ZXIuVmlldwogICAgQGRlZmF1bHQgRW1iZXIuU2VsZWN0T3B0Z3JvdXAKICAq LwogIGdyb3VwVmlldzogRW1iZXIuU2VsZWN0T3B0Z3JvdXAsCgogIGdyb3Vw ZWRDb250ZW50OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKICAgIHZh ciBncm91cFBhdGggPSBnZXQodGhpcywgJ29wdGlvbkdyb3VwUGF0aCcpOwog ICAgdmFyIGdyb3VwZWRDb250ZW50ID0gRW1iZXIuQSgpOwogICAgdmFyIGNv bnRlbnQgPSBnZXQodGhpcywgJ2NvbnRlbnQnKSB8fCBbXTsKCiAgICBmb3JF YWNoKGNvbnRlbnQsIGZ1bmN0aW9uKGl0ZW0pIHsKICAgICAgdmFyIGxhYmVs ID0gZ2V0KGl0ZW0sIGdyb3VwUGF0aCk7CgogICAgICBpZiAoZ2V0KGdyb3Vw ZWRDb250ZW50LCAnbGFzdE9iamVjdC5sYWJlbCcpICE9PSBsYWJlbCkgewog ICAgICAgIGdyb3VwZWRDb250ZW50LnB1c2hPYmplY3QoewogICAgICAgICAg bGFiZWw6IGxhYmVsLAogICAgICAgICAgY29udGVudDogRW1iZXIuQSgpCiAg ICAgICAgfSk7CiAgICAgIH0KCiAgICAgIGdldChncm91cGVkQ29udGVudCwg J2xhc3RPYmplY3QuY29udGVudCcpLnB1c2goaXRlbSk7CiAgICB9KTsKCiAg ICByZXR1cm4gZ3JvdXBlZENvbnRlbnQ7CiAgfSkucHJvcGVydHkoJ29wdGlv bkdyb3VwUGF0aCcsICdjb250ZW50LkBlYWNoJyksCgogIC8qKgogICAgVGhl IHZpZXcgY2xhc3MgZm9yIG9wdGlvbi4KCiAgICBAcHJvcGVydHkgb3B0aW9u VmlldwogICAgQHR5cGUgRW1iZXIuVmlldwogICAgQGRlZmF1bHQgRW1iZXIu U2VsZWN0T3B0aW9uCiAgKi8KICBvcHRpb25WaWV3OiBFbWJlci5TZWxlY3RP cHRpb24sCgogIF9jaGFuZ2U6IGZ1bmN0aW9uKCkgewogICAgaWYgKGdldCh0 aGlzLCAnbXVsdGlwbGUnKSkgewogICAgICB0aGlzLl9jaGFuZ2VNdWx0aXBs ZSgpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5fY2hhbmdlU2luZ2xlKCk7 CiAgICB9CiAgfSwKCiAgc2VsZWN0aW9uRGlkQ2hhbmdlOiBFbWJlci5vYnNl cnZlcignc2VsZWN0aW9uLkBlYWNoJywgZnVuY3Rpb24oKSB7CiAgICB2YXIg c2VsZWN0aW9uID0gZ2V0KHRoaXMsICdzZWxlY3Rpb24nKTsKICAgIGlmIChn ZXQodGhpcywgJ211bHRpcGxlJykpIHsKICAgICAgaWYgKCFpc0FycmF5KHNl bGVjdGlvbikpIHsKICAgICAgICBzZXQodGhpcywgJ3NlbGVjdGlvbicsIEVt YmVyLkEoW3NlbGVjdGlvbl0pKTsKICAgICAgICByZXR1cm47CiAgICAgIH0K ICAgICAgdGhpcy5fc2VsZWN0aW9uRGlkQ2hhbmdlTXVsdGlwbGUoKTsKICAg IH0gZWxzZSB7CiAgICAgIHRoaXMuX3NlbGVjdGlvbkRpZENoYW5nZVNpbmds ZSgpOwogICAgfQogIH0pLAoKICB2YWx1ZURpZENoYW5nZTogRW1iZXIub2Jz ZXJ2ZXIoJ3ZhbHVlJywgZnVuY3Rpb24oKSB7CiAgICB2YXIgY29udGVudCA9 IGdldCh0aGlzLCAnY29udGVudCcpLAogICAgICAgIHZhbHVlID0gZ2V0KHRo aXMsICd2YWx1ZScpLAogICAgICAgIHZhbHVlUGF0aCA9IGdldCh0aGlzLCAn b3B0aW9uVmFsdWVQYXRoJykucmVwbGFjZSgvXmNvbnRlbnRcLj8vLCAnJyks CiAgICAgICAgc2VsZWN0ZWRWYWx1ZSA9ICh2YWx1ZVBhdGggPyBnZXQodGhp cywgJ3NlbGVjdGlvbi4nICsgdmFsdWVQYXRoKSA6IGdldCh0aGlzLCAnc2Vs ZWN0aW9uJykpLAogICAgICAgIHNlbGVjdGlvbjsKCiAgICBpZiAodmFsdWUg IT09IHNlbGVjdGVkVmFsdWUpIHsKICAgICAgc2VsZWN0aW9uID0gY29udGVu dCA/IGNvbnRlbnQuZmluZChmdW5jdGlvbihvYmopIHsKICAgICAgICByZXR1 cm4gdmFsdWUgPT09ICh2YWx1ZVBhdGggPyBnZXQob2JqLCB2YWx1ZVBhdGgp IDogb2JqKTsKICAgICAgfSkgOiBudWxsOwoKICAgICAgdGhpcy5zZXQoJ3Nl bGVjdGlvbicsIHNlbGVjdGlvbik7CiAgICB9CiAgfSksCgoKICBfdHJpZ2dl ckNoYW5nZTogZnVuY3Rpb24oKSB7CiAgICB2YXIgc2VsZWN0aW9uID0gZ2V0 KHRoaXMsICdzZWxlY3Rpb24nKTsKICAgIHZhciB2YWx1ZSA9IGdldCh0aGlz LCAndmFsdWUnKTsKCiAgICBpZiAoIUVtYmVyLmlzTm9uZShzZWxlY3Rpb24p KSB7IHRoaXMuc2VsZWN0aW9uRGlkQ2hhbmdlKCk7IH0KICAgIGlmICghRW1i ZXIuaXNOb25lKHZhbHVlKSkgeyB0aGlzLnZhbHVlRGlkQ2hhbmdlKCk7IH0K CiAgICB0aGlzLl9jaGFuZ2UoKTsKICB9LAoKICBfY2hhbmdlU2luZ2xlOiBm dW5jdGlvbigpIHsKICAgIHZhciBzZWxlY3RlZEluZGV4ID0gdGhpcy4kKClb MF0uc2VsZWN0ZWRJbmRleCwKICAgICAgICBjb250ZW50ID0gZ2V0KHRoaXMs ICdjb250ZW50JyksCiAgICAgICAgcHJvbXB0ID0gZ2V0KHRoaXMsICdwcm9t cHQnKTsKCiAgICBpZiAoIWNvbnRlbnQgfHwgIWdldChjb250ZW50LCAnbGVu Z3RoJykpIHsgcmV0dXJuOyB9CiAgICBpZiAocHJvbXB0ICYmIHNlbGVjdGVk SW5kZXggPT09IDApIHsgc2V0KHRoaXMsICdzZWxlY3Rpb24nLCBudWxsKTsg cmV0dXJuOyB9CgogICAgaWYgKHByb21wdCkgeyBzZWxlY3RlZEluZGV4IC09 IDE7IH0KICAgIHNldCh0aGlzLCAnc2VsZWN0aW9uJywgY29udGVudC5vYmpl Y3RBdChzZWxlY3RlZEluZGV4KSk7CiAgfSwKCgogIF9jaGFuZ2VNdWx0aXBs ZTogZnVuY3Rpb24oKSB7CiAgICB2YXIgb3B0aW9ucyA9IHRoaXMuJCgnb3B0 aW9uOnNlbGVjdGVkJyksCiAgICAgICAgcHJvbXB0ID0gZ2V0KHRoaXMsICdw cm9tcHQnKSwKICAgICAgICBvZmZzZXQgPSBwcm9tcHQgPyAxIDogMCwKICAg ICAgICBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50JyksCiAgICAgICAg c2VsZWN0aW9uID0gZ2V0KHRoaXMsICdzZWxlY3Rpb24nKTsKCiAgICBpZiAo IWNvbnRlbnQpIHsgcmV0dXJuOyB9CiAgICBpZiAob3B0aW9ucykgewogICAg ICB2YXIgc2VsZWN0ZWRJbmRleGVzID0gb3B0aW9ucy5tYXAoZnVuY3Rpb24o KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXggLSBvZmZzZXQ7CiAgICAg IH0pLnRvQXJyYXkoKTsKICAgICAgdmFyIG5ld1NlbGVjdGlvbiA9IGNvbnRl bnQub2JqZWN0c0F0KHNlbGVjdGVkSW5kZXhlcyk7CgogICAgICBpZiAoaXNB cnJheShzZWxlY3Rpb24pKSB7CiAgICAgICAgcmVwbGFjZShzZWxlY3Rpb24s IDAsIGdldChzZWxlY3Rpb24sICdsZW5ndGgnKSwgbmV3U2VsZWN0aW9uKTsK ICAgICAgfSBlbHNlIHsKICAgICAgICBzZXQodGhpcywgJ3NlbGVjdGlvbics IG5ld1NlbGVjdGlvbik7CiAgICAgIH0KICAgIH0KICB9LAoKICBfc2VsZWN0 aW9uRGlkQ2hhbmdlU2luZ2xlOiBmdW5jdGlvbigpIHsKICAgIHZhciBlbCA9 IHRoaXMuZ2V0KCdlbGVtZW50Jyk7CiAgICBpZiAoIWVsKSB7IHJldHVybjsg fQoKICAgIHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdjb250ZW50JyksCiAg ICAgICAgc2VsZWN0aW9uID0gZ2V0KHRoaXMsICdzZWxlY3Rpb24nKSwKICAg ICAgICBzZWxlY3Rpb25JbmRleCA9IGNvbnRlbnQgPyBpbmRleE9mKGNvbnRl bnQsIHNlbGVjdGlvbikgOiAtMSwKICAgICAgICBwcm9tcHQgPSBnZXQodGhp cywgJ3Byb21wdCcpOwoKICAgIGlmIChwcm9tcHQpIHsgc2VsZWN0aW9uSW5k ZXggKz0gMTsgfQogICAgaWYgKGVsKSB7IGVsLnNlbGVjdGVkSW5kZXggPSBz ZWxlY3Rpb25JbmRleDsgfQogIH0sCgogIF9zZWxlY3Rpb25EaWRDaGFuZ2VN dWx0aXBsZTogZnVuY3Rpb24oKSB7CiAgICB2YXIgY29udGVudCA9IGdldCh0 aGlzLCAnY29udGVudCcpLAogICAgICAgIHNlbGVjdGlvbiA9IGdldCh0aGlz LCAnc2VsZWN0aW9uJyksCiAgICAgICAgc2VsZWN0ZWRJbmRleGVzID0gY29u dGVudCA/IGluZGV4ZXNPZihjb250ZW50LCBzZWxlY3Rpb24pIDogWy0xXSwK ICAgICAgICBwcm9tcHQgPSBnZXQodGhpcywgJ3Byb21wdCcpLAogICAgICAg IG9mZnNldCA9IHByb21wdCA/IDEgOiAwLAogICAgICAgIG9wdGlvbnMgPSB0 aGlzLiQoJ29wdGlvbicpLAogICAgICAgIGFkanVzdGVkOwoKICAgIGlmIChv cHRpb25zKSB7CiAgICAgIG9wdGlvbnMuZWFjaChmdW5jdGlvbigpIHsKICAg ICAgICBhZGp1c3RlZCA9IHRoaXMuaW5kZXggPiAtMSA/IHRoaXMuaW5kZXgg LSBvZmZzZXQgOiAtMTsKICAgICAgICB0aGlzLnNlbGVjdGVkID0gaW5kZXhP ZihzZWxlY3RlZEluZGV4ZXMsIGFkanVzdGVkKSA+IC0xOwogICAgICB9KTsK ICAgIH0KICB9LAoKICBpbml0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX3N1 cGVyKCk7CiAgICB0aGlzLm9uKCJkaWRJbnNlcnRFbGVtZW50IiwgdGhpcywg dGhpcy5fdHJpZ2dlckNoYW5nZSk7CiAgICB0aGlzLm9uKCJjaGFuZ2UiLCB0 aGlzLCB0aGlzLl9jaGFuZ2UpOwogIH0KfSk7Cgp9KSgpOwoKCgooZnVuY3Rp b24oKSB7Ci8qKgpAbW9kdWxlIGVtYmVyCkBzdWJtb2R1bGUgZW1iZXItaGFu ZGxlYmFycy1jb21waWxlcgoqLwoKLyoqCgogIFRoZSBge3tpbnB1dH19YCBo ZWxwZXIgaW5zZXJ0cyBhbiBIVE1MIGA8aW5wdXQ+YCB0YWcgaW50byB0aGUg dGVtcGxhdGUsCiAgd2l0aCBhIGB0eXBlYCB2YWx1ZSBvZiBlaXRoZXIgYHRl eHRgIG9yIGBjaGVja2JveGAuIElmIG5vIGB0eXBlYCBpcyBwcm92aWRlZCwK ICBgdGV4dGAgd2lsbCBiZSB0aGUgZGVmYXVsdCB2YWx1ZSBhcHBsaWVkLiBU aGUgYXR0cmlidXRlcyBvZiBge3tpbnB1dH19YAogIG1hdGNoIHRob3NlIG9m IHRoZSBuYXRpdmUgSFRNTCB0YWcgYXMgY2xvc2VseSBhcyBwb3NzaWJsZSBm b3IgdGhlc2UgdHdvIHR5cGVzLgoKICAjIyBVc2UgYXMgdGV4dCBmaWVsZAog IEFuIGB7e2lucHV0fX1gIHdpdGggbm8gYHR5cGVgIG9yIGEgYHR5cGVgIG9m IGB0ZXh0YCB3aWxsIHJlbmRlciBhbiBIVE1MIHRleHQgaW5wdXQuCiAgVGhl IGZvbGxvd2luZyBIVE1MIGF0dHJpYnV0ZXMgY2FuIGJlIHNldCB2aWEgdGhl IGhlbHBlcjoKCiA8dGFibGU+CiAgPHRyPjx0ZD5gcmVhZG9ubHlgPC90ZD48 dGQ+YHJlcXVpcmVkYDwvdGQ+PHRkPmBhdXRvZm9jdXNgPC90ZD48L3RyPgog IDx0cj48dGQ+YHZhbHVlYDwvdGQ+PHRkPmBwbGFjZWhvbGRlcmA8L3RkPjx0 ZD5gZGlzYWJsZWRgPC90ZD48L3RyPgogIDx0cj48dGQ+YHNpemVgPC90ZD48 dGQ+YHRhYmluZGV4YDwvdGQ+PHRkPmBtYXhsZW5ndGhgPC90ZD48L3RyPgog IDx0cj48dGQ+YG5hbWVgPC90ZD48dGQ+YG1pbmA8L3RkPjx0ZD5gbWF4YDwv dGQ+PC90cj4KICA8dHI+PHRkPmBwYXR0ZXJuYDwvdGQ+PHRkPmBhY2NlcHRg PC90ZD48dGQ+YGF1dG9jb21wbGV0ZWA8L3RkPjwvdHI+CiAgPHRyPjx0ZD5g YXV0b3NhdmVgPC90ZD48dGQ+YGZvcm1hY3Rpb25gPC90ZD48dGQ+YGZvcm1l bmN0eXBlYDwvdGQ+PC90cj4KICA8dHI+PHRkPmBmb3JtbWV0aG9kYDwvdGQ+ PHRkPmBmb3Jtbm92YWxpZGF0ZWA8L3RkPjx0ZD5gZm9ybXRhcmdldGA8L3Rk PjwvdHI+CiAgPHRyPjx0ZD5gaGVpZ2h0YDwvdGQ+PHRkPmBpbnB1dG1vZGVg PC90ZD48dGQ+YG11bHRpcGxlYDwvdGQ+PC90cj4KICA8dHI+PHRkPmBzdGVw YDwvdGQ+PHRkPmB3aWR0aGA8L3RkPjx0ZD5gZm9ybWA8L3RkPjwvdHI+CiAg PHRyPjx0ZD5gc2VsZWN0aW9uRGlyZWN0aW9uYDwvdGQ+PHRkPmBzcGVsbGNo ZWNrYDwvdGQ+PHRkPiZuYnNwOzwvdGQ+PC90cj4KIDwvdGFibGU+CgoKICBX aGVuIHNldCB0byBhIHF1b3RlZCBzdHJpbmcsIHRoZXNlIHZhbHVlcyB3aWxs IGJlIGRpcmVjdGx5IGFwcGxpZWQgdG8gdGhlIEhUTUwKICBlbGVtZW50LiBX aGVuIGxlZnQgdW5xdW90ZWQsIHRoZXNlIHZhbHVlcyB3aWxsIGJlIGJvdW5k IHRvIGEgcHJvcGVydHkgb24gdGhlCiAgdGVtcGxhdGUncyBjdXJyZW50IHJl bmRlcmluZyBjb250ZXh0IChtb3N0IHR5cGljYWxseSBhIGNvbnRyb2xsZXIg aW5zdGFuY2UpLgoKICAjIyBVbmJvdW5kOgoKICBgYGBoYW5kbGViYXJzCiAg e3tpbnB1dCB2YWx1ZT0iaHR0cDovL3d3dy5mYWNlYm9vay5jb20ifX0KICBg YGAKCgogIGBgYGh0bWwKICA8aW5wdXQgdHlwZT0idGV4dCIgdmFsdWU9Imh0 dHA6Ly93d3cuZmFjZWJvb2suY29tIi8+CiAgYGBgCgogICMjIEJvdW5kOgoK ICBgYGBqYXZhc2NyaXB0CiAgQXBwLkFwcGxpY2F0aW9uQ29udHJvbGxlciA9 IEVtYmVyLkNvbnRyb2xsZXIuZXh0ZW5kKHsKICAgIGZpcnN0TmFtZTogIlN0 YW5sZXkiLAogICAgZW50cnlOb3RBbGxvd2VkOiB0cnVlCiAgfSk7CiAgYGBg CgoKICBgYGBoYW5kbGViYXJzCiAge3tpbnB1dCB0eXBlPSJ0ZXh0IiB2YWx1 ZT1maXJzdE5hbWUgZGlzYWJsZWQ9ZW50cnlOb3RBbGxvd2VkIHNpemU9IjUw In19CiAgYGBgCgoKICBgYGBodG1sCiAgPGlucHV0IHR5cGU9InRleHQiIHZh bHVlPSJTdGFubGV5IiBkaXNhYmxlZD0iZGlzYWJsZWQiIHNpemU9IjUwIi8+ CiAgYGBgCgogICMjIEV4dGVuc2lvbgoKICBJbnRlcm5hbGx5LCBge3tpbnB1 dCB0eXBlPSJ0ZXh0In19YCBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIGBFbWJl ci5UZXh0RmllbGRgLCBwYXNzaW5nCiAgYXJndW1lbnRzIGZyb20gdGhlIGhl bHBlciB0byBgRW1iZXIuVGV4dEZpZWxkYCdzIGBjcmVhdGVgIG1ldGhvZC4g WW91IGNhbiBleHRlbmQgdGhlCiAgY2FwYWJsaWx0aWVzIG9mIHRleHQgaW5w dXRzIGluIHlvdXIgYXBwbGljYXRpb25zIGJ5IHJlb3BlbmluZyB0aGlzIGNs YXNzLiBGb3IgZXhhbXBsZSwKICBpZiB5b3UgYXJlIGRlcGxveWluZyB0byBi cm93c2VycyB3aGVyZSB0aGUgYHJlcXVpcmVkYCBhdHRyaWJ1dGUgaXMgdXNl ZCwgeW91CiAgY2FuIGFkZCB0aGlzIHRvIHRoZSBgVGV4dEZpZWxkYCdzIGBh dHRyaWJ1dGVCaW5kaW5nc2AgcHJvcGVydHk6CgoKICBgYGBqYXZhc2NyaXB0 CiAgRW1iZXIuVGV4dEZpZWxkLnJlb3Blbih7CiAgICBhdHRyaWJ1dGVCaW5k aW5nczogWydyZXF1aXJlZCddCiAgfSk7CiAgYGBgCgogIEtlZXAgaW4gbWlu ZCB3aGVuIHdyaXRpbmcgYEVtYmVyLlRleHRGaWVsZGAgc3ViY2xhc3NlcyB0 aGF0IGBFbWJlci5UZXh0RmllbGRgCiAgaXRzZWxmIGV4dGVuZHMgYEVtYmVy LkNvbXBvbmVudGAsIG1lYW5pbmcgdGhhdCBpdCBkb2VzIE5PVCBpbmhlcml0 CiAgdGhlIGBjb250cm9sbGVyYCBvZiB0aGUgcGFyZW50IHZpZXcuCgogIFNl ZSBtb3JlIGFib3V0IFtFbWJlciBjb21wb25lbnRzXShhcGkvY2xhc3Nlcy9F bWJlci5Db21wb25lbnQuaHRtbCkKCgogICMjIFVzZSBhcyBjaGVja2JveAoK ICBBbiBge3tpbnB1dH19YCB3aXRoIGEgYHR5cGVgIG9mIGBjaGVja2JveGAg d2lsbCByZW5kZXIgYW4gSFRNTCBjaGVja2JveCBpbnB1dC4KICBUaGUgZm9s bG93aW5nIEhUTUwgYXR0cmlidXRlcyBjYW4gYmUgc2V0IHZpYSB0aGUgaGVs cGVyOgoKKiBgY2hlY2tlZGAKKiBgZGlzYWJsZWRgCiogYHRhYmluZGV4YAoq IGBpbmRldGVybWluYXRlYAoqIGBuYW1lYAoqIGBhdXRvZm9jdXNgCiogYGZv cm1gCgoKICBXaGVuIHNldCB0byBhIHF1b3RlZCBzdHJpbmcsIHRoZXNlIHZh bHVlcyB3aWxsIGJlIGRpcmVjdGx5IGFwcGxpZWQgdG8gdGhlIEhUTUwKICBl bGVtZW50LiBXaGVuIGxlZnQgdW5xdW90ZWQsIHRoZXNlIHZhbHVlcyB3aWxs IGJlIGJvdW5kIHRvIGEgcHJvcGVydHkgb24gdGhlCiAgdGVtcGxhdGUncyBj dXJyZW50IHJlbmRlcmluZyBjb250ZXh0IChtb3N0IHR5cGljYWxseSBhIGNv bnRyb2xsZXIgaW5zdGFuY2UpLgoKICAjIyBVbmJvdW5kOgoKICBgYGBoYW5k bGViYXJzCiAge3tpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iaXNBZG1p biJ9fQogIGBgYAoKICBgYGBodG1sCiAgPGlucHV0IHR5cGU9ImNoZWNrYm94 IiBuYW1lPSJpc0FkbWluIiAvPgogIGBgYAoKICAjIyBCb3VuZDoKCiAgYGBg amF2YXNjcmlwdAogIEFwcC5BcHBsaWNhdGlvbkNvbnRyb2xsZXIgPSBFbWJl ci5Db250cm9sbGVyLmV4dGVuZCh7CiAgICBpc0FkbWluOiB0cnVlCiAgfSk7 CiAgYGBgCgoKICBgYGBoYW5kbGViYXJzCiAge3tpbnB1dCB0eXBlPSJjaGVj a2JveCIgY2hlY2tlZD1pc0FkbWluIH19CiAgYGBgCgoKICBgYGBodG1sCiAg PGlucHV0IHR5cGU9ImNoZWNrYm94IiBjaGVja2VkPSJjaGVja2VkIiAvPgog IGBgYAoKICAjIyBFeHRlbnNpb24KCiAgSW50ZXJuYWxseSwgYHt7aW5wdXQg dHlwZT0iY2hlY2tib3gifX1gIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYEVt YmVyLkNoZWNrYm94YCwgcGFzc2luZwogIGFyZ3VtZW50cyBmcm9tIHRoZSBo ZWxwZXIgdG8gYEVtYmVyLkNoZWNrYm94YCdzIGBjcmVhdGVgIG1ldGhvZC4g WW91IGNhbiBleHRlbmQgdGhlCiAgY2FwYWJsaWx0aWVzIG9mIGNoZWNrYm94 IGlucHV0cyBpbiB5b3VyIGFwcGxpY2F0aW9ucyBieSByZW9wZW5pbmcgdGhp cyBjbGFzcy4gRm9yIGV4YW1wbGUsCiAgaWYgeW91IHdhbnRlZCB0byBhZGQg YSBjc3MgY2xhc3MgdG8gYWxsIGNoZWNrYm94ZXMgaW4geW91ciBhcHBsaWNh dGlvbjoKCgogIGBgYGphdmFzY3JpcHQKICBFbWJlci5DaGVja2JveC5yZW9w ZW4oewogICAgY2xhc3NOYW1lczogWydteS1hcHAtY2hlY2tib3gnXQogIH0p OwogIGBgYAoKCiAgQG1ldGhvZCBpbnB1dAogIEBmb3IgRW1iZXIuSGFuZGxl YmFycy5oZWxwZXJzCiAgQHBhcmFtIHtIYXNofSBvcHRpb25zCiovCkVtYmVy LkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2lucHV0JywgZnVuY3Rpb24o b3B0aW9ucykgewogIEVtYmVyLmFzc2VydCgnWW91IGNhbiBvbmx5IHBhc3Mg YXR0cmlidXRlcyB0byB0aGUgYGlucHV0YCBoZWxwZXIsIG5vdCBhcmd1bWVu dHMnLCBhcmd1bWVudHMubGVuZ3RoIDwgMik7CgogIHZhciBoYXNoID0gb3B0 aW9ucy5oYXNoLAogICAgICB0eXBlcyA9IG9wdGlvbnMuaGFzaFR5cGVzLAog ICAgICBpbnB1dFR5cGUgPSBoYXNoLnR5cGUsCiAgICAgIG9uRXZlbnQgPSBo YXNoLm9uOwoKICBkZWxldGUgaGFzaC50eXBlOwogIGRlbGV0ZSBoYXNoLm9u OwoKICBpZiAoaW5wdXRUeXBlID09PSAnY2hlY2tib3gnKSB7CiAgICBFbWJl ci5hc3NlcnQoInt7aW5wdXQgdHlwZT0nY2hlY2tib3gnfX0gZG9lcyBub3Qg c3VwcG9ydCBzZXR0aW5nIGB2YWx1ZT1zb21lQm9vbGVhblZhbHVlYDsgeW91 IG11c3QgdXNlIGBjaGVja2VkPXNvbWVCb29sZWFuVmFsdWVgIGluc3RlYWQu Iiwgb3B0aW9ucy5oYXNoVHlwZXMudmFsdWUgIT09ICdJRCcpOwogICAgcmV0 dXJuIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycy52aWV3LmNhbGwodGhpcywg RW1iZXIuQ2hlY2tib3gsIG9wdGlvbnMpOwogIH0gZWxzZSB7CiAgICBpZiAo aW5wdXRUeXBlKSB7IGhhc2gudHlwZSA9IGlucHV0VHlwZTsgfQogICAgaGFz aC5vbkV2ZW50ID0gb25FdmVudCB8fCAnZW50ZXInOwogICAgcmV0dXJuIEVt YmVyLkhhbmRsZWJhcnMuaGVscGVycy52aWV3LmNhbGwodGhpcywgRW1iZXIu VGV4dEZpZWxkLCBvcHRpb25zKTsKICB9Cn0pOwoKLyoqCiAgYHt7dGV4dGFy ZWF9fWAgaW5zZXJ0cyBhIG5ldyBpbnN0YW5jZSBvZiBgPHRleHRhcmVhPmAg dGFnIGludG8gdGhlIHRlbXBsYXRlLgogIFRoZSBhdHRyaWJ1dGVzIG9mIGB7 e3RleHRhcmVhfX1gIG1hdGNoIHRob3NlIG9mIHRoZSBuYXRpdmUgSFRNTCB0 YWdzIGFzCiAgY2xvc2VseSBhcyBwb3NzaWJsZS4KCiAgVGhlIGZvbGxvd2lu ZyBIVE1MIGF0dHJpYnV0ZXMgY2FuIGJlIHNldDoKCiAgICAqIGB2YWx1ZWAK ICAgICogYG5hbWVgCiAgICAqIGByb3dzYAogICAgKiBgY29sc2AKICAgICog YHBsYWNlaG9sZGVyYAogICAgKiBgZGlzYWJsZWRgCiAgICAqIGBtYXhsZW5n dGhgCiAgICAqIGB0YWJpbmRleGAKICAgICogYHNlbGVjdGlvbkVuZGAKICAg ICogYHNlbGVjdGlvblN0YXJ0YAogICAgKiBgc2VsZWN0aW9uRGlyZWN0aW9u YAogICAgKiBgd3JhcGAKICAgICogYHJlYWRvbmx5YAogICAgKiBgYXV0b2Zv Y3VzYAogICAgKiBgZm9ybWAKICAgICogYHNwZWxsY2hlY2tgCiAgICAqIGBy ZXF1aXJlZGAKCiAgV2hlbiBzZXQgdG8gYSBxdW90ZWQgc3RyaW5nLCB0aGVz ZSB2YWx1ZSB3aWxsIGJlIGRpcmVjdGx5IGFwcGxpZWQgdG8gdGhlIEhUTUwK ICBlbGVtZW50LiBXaGVuIGxlZnQgdW5xdW90ZWQsIHRoZXNlIHZhbHVlcyB3 aWxsIGJlIGJvdW5kIHRvIGEgcHJvcGVydHkgb24gdGhlCiAgdGVtcGxhdGUn cyBjdXJyZW50IHJlbmRlcmluZyBjb250ZXh0IChtb3N0IHR5cGljYWxseSBh IGNvbnRyb2xsZXIgaW5zdGFuY2UpLgoKICBVbmJvdW5kOgoKICBgYGBoYW5k bGViYXJzCiAge3t0ZXh0YXJlYSB2YWx1ZT0iTG90cyBvZiBzdGF0aWMgdGV4 dCB0aGF0IElTTidUIGJvdW5kIn19CiAgYGBgCgogIFdvdWxkIHJlc3VsdCBp biB0aGUgZm9sbG93aW5nIEhUTUw6CgogIGBgYGh0bWwKICA8dGV4dGFyZWEg Y2xhc3M9ImVtYmVyLXRleHQtYXJlYSI+CiAgICBMb3RzIG9mIHN0YXRpYyB0 ZXh0IHRoYXQgSVNOJ1QgYm91bmQKICA8L3RleHRhcmVhPgogIGBgYAoKICBC b3VuZDoKCiAgSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCB0aGUgYHdyaXR0 ZW5Xb3Jkc2AgcHJvcGVydHkgb24gYEFwcC5BcHBsaWNhdGlvbkNvbnRyb2xs ZXJgCiAgd2lsbCBiZSB1cGRhdGVkIGxpdmUgYXMgdGhlIHVzZXIgdHlwZXMg J0xvdHMgb2YgdGV4dCB0aGF0IElTIGJvdW5kJyBpbnRvCiAgdGhlIHRleHQg YXJlYSBvZiB0aGVpciBicm93c2VyJ3Mgd2luZG93LgoKICBgYGBqYXZhc2Ny aXB0CiAgQXBwLkFwcGxpY2F0aW9uQ29udHJvbGxlciA9IEVtYmVyLkNvbnRy b2xsZXIuZXh0ZW5kKHsKICAgIHdyaXR0ZW5Xb3JkczogIkxvdHMgb2YgdGV4 dCB0aGF0IElTIGJvdW5kIgogIH0pOwogIGBgYAoKICBgYGBoYW5kbGViYXJz CiAge3t0ZXh0YXJlYSB2YWx1ZT13cml0dGVuV29yZHN9fQogIGBgYAoKICAg V291bGQgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgSFRNTDoKCiAgYGBgaHRt bAogIDx0ZXh0YXJlYSBjbGFzcz0iZW1iZXItdGV4dC1hcmVhIj4KICAgIExv dHMgb2YgdGV4dCB0aGF0IElTIGJvdW5kCiAgPC90ZXh0YXJlYT4KICBgYGAK CiAgSWYgeW91IHdhbnRlZCBhIG9uZSB3YXkgYmluZGluZyBiZXR3ZWVuIHRo ZSB0ZXh0IGFyZWEgYW5kIGEgZGl2IHRhZwogIHNvbWV3aGVyZSBlbHNlIG9u IHlvdXIgc2NyZWVuLCB5b3UgY291bGQgdXNlIGBFbWJlci5jb21wdXRlZC5v bmVXYXlgOgoKICBgYGBqYXZhc2NyaXB0CiAgQXBwLkFwcGxpY2F0aW9uQ29u dHJvbGxlciA9IEVtYmVyLkNvbnRyb2xsZXIuZXh0ZW5kKHsKICAgIHdyaXR0 ZW5Xb3JkczogIkxvdHMgb2YgdGV4dCB0aGF0IElTIGJvdW5kIiwKICAgIG91 dHB1dFdyaXR0ZW5Xb3JkczogRW1iZXIuY29tcHV0ZWQub25lV2F5KCJ3cml0 dGVuV29yZHMiKQogIH0pOwogIGBgYAoKICBgYGBoYW5kbGViYXJzCiAge3t0 ZXh0YXJlYSB2YWx1ZT13cml0dGVuV29yZHN9fQoKICA8ZGl2PgogICAge3tv dXRwdXRXcml0dGVuV29yZHN9fQogIDwvZGl2PgogIGBgYAoKICBXb3VsZCBy ZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBIVE1MOgoKICBgYGBodG1sCiAgPHRl eHRhcmVhIGNsYXNzPSJlbWJlci10ZXh0LWFyZWEiPgogICAgTG90cyBvZiB0 ZXh0IHRoYXQgSVMgYm91bmQKICA8L3RleHRhcmVhPgoKICA8LS0gdGhlIGZv bGxvd2luZyBkaXYgd2lsbCBiZSB1cGRhdGVkIGluIHJlYWwgdGltZSBhcyB5 b3UgdHlwZSAtLT4KCiAgPGRpdj4KICAgIExvdHMgb2YgdGV4dCB0aGF0IElT IGJvdW5kCiAgPC9kaXY+CiAgYGBgCgogIEZpbmFsbHksIHRoaXMgZXhhbXBs ZSByZWFsbHkgc2hvd3MgdGhlIHBvd2VyIGFuZCBlYXNlIG9mIEVtYmVyIHdo ZW4gdHdvCiAgcHJvcGVydGllcyBhcmUgYm91bmQgdG8gZWFjaG90aGVyIHZp YSBgRW1iZXIuY29tcHV0ZWQuYWxpYXNgLiBUeXBlIGludG8KICBlaXRoZXIg dGV4dCBhcmVhIGJveCBhbmQgdGhleSdsbCBib3RoIHN0YXkgaW4gc3luYy4g Tm90ZSB0aGF0CiAgYEVtYmVyLmNvbXB1dGVkLmFsaWFzYCBjb3N0cyBtb3Jl IGluIHRlcm1zIG9mIHBlcmZvcm1hbmNlLCBzbyBvbmx5IHVzZSBpdCB3aGVu CiAgeW91ciByZWFsbHkgYmluZGluZyBpbiBib3RoIGRpcmVjdGlvbnM6Cgog IGBgYGphdmFzY3JpcHQKICBBcHAuQXBwbGljYXRpb25Db250cm9sbGVyID0g RW1iZXIuQ29udHJvbGxlci5leHRlbmQoewogICAgd3JpdHRlbldvcmRzOiAi TG90cyBvZiB0ZXh0IHRoYXQgSVMgYm91bmQiLAogICAgdHdvV2F5V3JpdHRl bldvcmRzOiBFbWJlci5jb21wdXRlZC5hbGlhcygid3JpdHRlbldvcmRzIikK ICB9KTsKICBgYGAKCiAgYGBgaGFuZGxlYmFycwogIHt7dGV4dGFyZWEgdmFs dWU9d3JpdHRlbldvcmRzfX0KICB7e3RleHRhcmVhIHZhbHVlPXR3b1dheVdy aXR0ZW5Xb3Jkc319CiAgYGBgCgogIGBgYGh0bWwKICA8dGV4dGFyZWEgaWQ9 ImVtYmVyMSIgY2xhc3M9ImVtYmVyLXRleHQtYXJlYSI+CiAgICBMb3RzIG9m IHRleHQgdGhhdCBJUyBib3VuZAogIDwvdGV4dGFyZWE+CgogIDwtLSBib3Ro IHVwZGF0ZWQgaW4gcmVhbCB0aW1lIC0tPgoKICA8dGV4dGFyZWEgaWQ9ImVt YmVyMiIgY2xhc3M9ImVtYmVyLXRleHQtYXJlYSI+CiAgICBMb3RzIG9mIHRl eHQgdGhhdCBJUyBib3VuZAogIDwvdGV4dGFyZWE+CiAgYGBgCgogICMjIEV4 dGVuc2lvbgoKICBJbnRlcm5hbGx5LCBge3t0ZXh0YXJlYX19YCBjcmVhdGVz IGFuIGluc3RhbmNlIG9mIGBFbWJlci5UZXh0QXJlYWAsIHBhc3NpbmcKICBh cmd1bWVudHMgZnJvbSB0aGUgaGVscGVyIHRvIGBFbWJlci5UZXh0QXJlYWAn cyBgY3JlYXRlYCBtZXRob2QuIFlvdSBjYW4KICBleHRlbmQgdGhlIGNhcGFi aWxpdGllcyBvZiB0ZXh0IGFyZWFzIGluIHlvdXIgYXBwbGljYXRpb24gYnkg cmVvcGVuaW5nIHRoaXMKICBjbGFzcy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBh cmUgZGVwbG95aW5nIHRvIGJyb3dzZXJzIHdoZXJlIHRoZSBgcmVxdWlyZWRg CiAgYXR0cmlidXRlIGlzIHVzZWQsIHlvdSBjYW4gZ2xvYmFsbHkgYWRkIHN1 cHBvcnQgZm9yIHRoZSBgcmVxdWlyZWRgIGF0dHJpYnV0ZQogIG9uIGFsbCBg e3t0ZXh0YXJlYX19YHMnIGluIHlvdXIgYXBwIGJ5IHJlb3BlbmluZyBgRW1i ZXIuVGV4dEFyZWFgIG9yCiAgYEVtYmVyLlRleHRTdXBwb3J0YCBhbmQgYWRk aW5nIGl0IHRvIHRoZSBgYXR0cmlidXRlQmluZGluZ3NgIGNvbmNhdGVuYXRl ZAogIHByb3BlcnR5OgoKICBgYGBqYXZhc2NyaXB0CiAgRW1iZXIuVGV4dEFy ZWEucmVvcGVuKHsKICAgIGF0dHJpYnV0ZUJpbmRpbmdzOiBbJ3JlcXVpcmVk J10KICB9KTsKICBgYGAKCiAgS2VlcCBpbiBtaW5kIHdoZW4gd3JpdGluZyBg RW1iZXIuVGV4dEFyZWFgIHN1YmNsYXNzZXMgdGhhdCBgRW1iZXIuVGV4dEFy ZWFgCiAgaXRzZWxmIGV4dGVuZHMgYEVtYmVyLkNvbXBvbmVudGAsIG1lYW5p bmcgdGhhdCBpdCBkb2VzIE5PVCBpbmhlcml0CiAgdGhlIGBjb250cm9sbGVy YCBvZiB0aGUgcGFyZW50IHZpZXcuCgogIFNlZSBtb3JlIGFib3V0IFtFbWJl ciBjb21wb25lbnRzXShhcGkvY2xhc3Nlcy9FbWJlci5Db21wb25lbnQuaHRt bCkKCiAgQG1ldGhvZCB0ZXh0YXJlYQogIEBmb3IgRW1iZXIuSGFuZGxlYmFy cy5oZWxwZXJzCiAgQHBhcmFtIHtIYXNofSBvcHRpb25zCiovCkVtYmVyLkhh bmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ3RleHRhcmVhJywgZnVuY3Rpb24o b3B0aW9ucykgewogIEVtYmVyLmFzc2VydCgnWW91IGNhbiBvbmx5IHBhc3Mg YXR0cmlidXRlcyB0byB0aGUgYHRleHRhcmVhYCBoZWxwZXIsIG5vdCBhcmd1 bWVudHMnLCBhcmd1bWVudHMubGVuZ3RoIDwgMik7CgogIHZhciBoYXNoID0g b3B0aW9ucy5oYXNoLAogICAgICB0eXBlcyA9IG9wdGlvbnMuaGFzaFR5cGVz OwoKICByZXR1cm4gRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzLnZpZXcuY2Fs bCh0aGlzLCBFbWJlci5UZXh0QXJlYSwgb3B0aW9ucyk7Cn0pOwoKfSkoKTsK CgoKKGZ1bmN0aW9uKCkgewpFbWJlci5Db21wb25lbnRMb29rdXAgPSBFbWJl ci5PYmplY3QuZXh0ZW5kKHsKICBsb29rdXBGYWN0b3J5OiBmdW5jdGlvbihu YW1lLCBjb250YWluZXIpIHsKCiAgICBjb250YWluZXIgPSBjb250YWluZXIg fHwgdGhpcy5jb250YWluZXI7CgogICAgdmFyIGZ1bGxOYW1lID0gJ2NvbXBv bmVudDonICsgbmFtZSwKICAgICAgICB0ZW1wbGF0ZUZ1bGxOYW1lID0gJ3Rl bXBsYXRlOmNvbXBvbmVudHMvJyArIG5hbWUsCiAgICAgICAgdGVtcGxhdGVS ZWdpc3RlcmVkID0gY29udGFpbmVyICYmIGNvbnRhaW5lci5oYXModGVtcGxh dGVGdWxsTmFtZSk7CgogICAgaWYgKHRlbXBsYXRlUmVnaXN0ZXJlZCkgewog ICAgICBjb250YWluZXIuaW5qZWN0aW9uKGZ1bGxOYW1lLCAnbGF5b3V0Jywg dGVtcGxhdGVGdWxsTmFtZSk7CiAgICB9CgogICAgdmFyIENvbXBvbmVudCA9 IGNvbnRhaW5lci5sb29rdXBGYWN0b3J5KGZ1bGxOYW1lKTsKCiAgICAvLyBP bmx5IHRyZWF0IGFzIGEgY29tcG9uZW50IGlmIGVpdGhlciB0aGUgY29tcG9u ZW50CiAgICAvLyBvciBhIHRlbXBsYXRlIGhhcyBiZWVuIHJlZ2lzdGVyZWQu CiAgICBpZiAodGVtcGxhdGVSZWdpc3RlcmVkIHx8IENvbXBvbmVudCkgewog ICAgICBpZiAoIUNvbXBvbmVudCkgewogICAgICAgIGNvbnRhaW5lci5yZWdp c3RlcihmdWxsTmFtZSwgRW1iZXIuQ29tcG9uZW50KTsKICAgICAgICBDb21w b25lbnQgPSBjb250YWluZXIubG9va3VwRmFjdG9yeShmdWxsTmFtZSk7CiAg ICAgIH0KICAgICAgcmV0dXJuIENvbXBvbmVudDsKICAgIH0KICB9Cn0pOwoK fSkoKTsKCgoKKGZ1bmN0aW9uKCkgewovKmdsb2JhbHMgSGFuZGxlYmFycyAq LwovKioKQG1vZHVsZSBlbWJlcgpAc3VibW9kdWxlIGVtYmVyLWhhbmRsZWJh cnMKKi8KCi8qKgogIEZpbmQgdGVtcGxhdGVzIHN0b3JlZCBpbiB0aGUgaGVh ZCB0YWcgYXMgc2NyaXB0IHRhZ3MgYW5kIG1ha2UgdGhlbSBhdmFpbGFibGUK ICB0byBgRW1iZXIuQ29yZVZpZXdgIGluIHRoZSBnbG9iYWwgYEVtYmVyLlRF TVBMQVRFU2Agb2JqZWN0LiBUaGlzIHdpbGwgYmUgcnVuCiAgYXMgYXMgalF1 ZXJ5IERPTS1yZWFkeSBjYWxsYmFjay4KCiAgU2NyaXB0IHRhZ3Mgd2l0aCBg dGV4dC94LWhhbmRsZWJhcnNgIHdpbGwgYmUgY29tcGlsZWQKICB3aXRoIEVt YmVyJ3MgSGFuZGxlYmFycyBhbmQgYXJlIHN1aXRhYmxlIGZvciB1c2UgYXMg YSB2aWV3J3MgdGVtcGxhdGUuCiAgVGhvc2Ugd2l0aCB0eXBlIGB0ZXh0L3gt cmF3LWhhbmRsZWJhcnNgIHdpbGwgYmUgY29tcGlsZWQgd2l0aCByZWd1bGFy CiAgSGFuZGxlYmFycyBhbmQgYXJlIHN1aXRhYmxlIGZvciB1c2UgaW4gdmll d3MnIGNvbXB1dGVkIHByb3BlcnRpZXMuCgogIEBwcml2YXRlCiAgQG1ldGhv ZCBib290c3RyYXAKICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMKICBAc3RhdGlj CiAgQHBhcmFtIGN0eAoqLwpFbWJlci5IYW5kbGViYXJzLmJvb3RzdHJhcCA9 IGZ1bmN0aW9uKGN0eCkgewogIHZhciBzZWxlY3RvcnMgPSAnc2NyaXB0W3R5 cGU9InRleHQveC1oYW5kbGViYXJzIl0sIHNjcmlwdFt0eXBlPSJ0ZXh0L3gt cmF3LWhhbmRsZWJhcnMiXSc7CgogIEVtYmVyLiQoc2VsZWN0b3JzLCBjdHgp CiAgICAuZWFjaChmdW5jdGlvbigpIHsKICAgIC8vIEdldCBhIHJlZmVyZW5j ZSB0byB0aGUgc2NyaXB0IHRhZwogICAgdmFyIHNjcmlwdCA9IEVtYmVyLiQo dGhpcyk7CgogICAgdmFyIGNvbXBpbGUgPSAoc2NyaXB0LmF0dHIoJ3R5cGUn KSA9PT0gJ3RleHQveC1yYXctaGFuZGxlYmFycycpID8KICAgICAgICAgICAg ICAgICAgRW1iZXIuJC5wcm94eShIYW5kbGViYXJzLmNvbXBpbGUsIEhhbmRs ZWJhcnMpIDoKICAgICAgICAgICAgICAgICAgRW1iZXIuJC5wcm94eShFbWJl ci5IYW5kbGViYXJzLmNvbXBpbGUsIEVtYmVyLkhhbmRsZWJhcnMpLAogICAg ICAvLyBHZXQgdGhlIG5hbWUgb2YgdGhlIHNjcmlwdCwgdXNlZCBieSBFbWJl ci5WaWV3J3MgdGVtcGxhdGVOYW1lIHByb3BlcnR5LgogICAgICAvLyBGaXJz dCBsb29rIGZvciBkYXRhLXRlbXBsYXRlLW5hbWUgYXR0cmlidXRlLCB0aGVu IGZhbGwgYmFjayB0byBpdHMKICAgICAgLy8gaWQgaWYgbm8gbmFtZSBpcyBm b3VuZC4KICAgICAgdGVtcGxhdGVOYW1lID0gc2NyaXB0LmF0dHIoJ2RhdGEt dGVtcGxhdGUtbmFtZScpIHx8IHNjcmlwdC5hdHRyKCdpZCcpIHx8ICdhcHBs aWNhdGlvbicsCiAgICAgIHRlbXBsYXRlID0gY29tcGlsZShzY3JpcHQuaHRt bCgpKTsKCiAgICAvLyBDaGVjayBpZiB0ZW1wbGF0ZSBvZiBzYW1lIG5hbWUg YWxyZWFkeSBleGlzdHMKICAgIGlmIChFbWJlci5URU1QTEFURVNbdGVtcGxh dGVOYW1lXSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHRocm93IG5ldyBFbWJl ci5FcnJvcignVGVtcGxhdGUgbmFtZWQgIicgKyB0ZW1wbGF0ZU5hbWUgICsg JyIgYWxyZWFkeSBleGlzdHMuJyk7CiAgICB9CgogICAgLy8gRm9yIHRlbXBs YXRlcyB3aGljaCBoYXZlIGEgbmFtZSwgd2Ugc2F2ZSB0aGVtIGFuZCB0aGVu IHJlbW92ZSB0aGVtIGZyb20gdGhlIERPTQogICAgRW1iZXIuVEVNUExBVEVT W3RlbXBsYXRlTmFtZV0gPSB0ZW1wbGF0ZTsKCiAgICAvLyBSZW1vdmUgc2Ny aXB0IHRhZyBmcm9tIERPTQogICAgc2NyaXB0LnJlbW92ZSgpOwogIH0pOwp9 OwoKZnVuY3Rpb24gYm9vdHN0cmFwKCkgewogIEVtYmVyLkhhbmRsZWJhcnMu Ym9vdHN0cmFwKCBFbWJlci4kKGRvY3VtZW50KSApOwp9CgpmdW5jdGlvbiBy ZWdpc3RlckNvbXBvbmVudExvb2t1cChjb250YWluZXIpIHsKICBjb250YWlu ZXIucmVnaXN0ZXIoJ2NvbXBvbmVudC1sb29rdXA6bWFpbicsIEVtYmVyLkNv bXBvbmVudExvb2t1cCk7Cn0KCi8qCiAgV2UgdGllIHRoaXMgdG8gYXBwbGlj YXRpb24ubG9hZCB0byBlbnN1cmUgdGhhdCB3ZSd2ZSBhdCBsZWFzdAogIGF0 dGVtcHRlZCB0byBib290c3RyYXAgYXQgdGhlIHBvaW50IHRoYXQgdGhlIGFw cGxpY2F0aW9uIGlzIGxvYWRlZC4KCiAgV2UgYWxzbyB0aWUgdGhpcyB0byBk b2N1bWVudCByZWFkeSBzaW5jZSB3ZSdyZSBndWFyYW50ZWVkIHRoYXQgYWxs CiAgdGhlIGlubGluZSB0ZW1wbGF0ZXMgYXJlIHByZXNlbnQgYXQgdGhpcyBw b2ludC4KCiAgVGhlcmUncyBubyBoYXJtIHRvIHJ1bm5pbmcgdGhpcyB0d2lj ZSwgc2luY2Ugd2UgcmVtb3ZlIHRoZSB0ZW1wbGF0ZXMKICBmcm9tIHRoZSBE T00gYWZ0ZXIgcHJvY2Vzc2luZy4KKi8KCkVtYmVyLm9uTG9hZCgnRW1iZXIu QXBwbGljYXRpb24nLCBmdW5jdGlvbihBcHBsaWNhdGlvbikgewogIEFwcGxp Y2F0aW9uLmluaXRpYWxpemVyKHsKICAgIG5hbWU6ICdkb21UZW1wbGF0ZXMn LAogICAgaW5pdGlhbGl6ZTogYm9vdHN0cmFwCiAgfSk7CgogIEFwcGxpY2F0 aW9uLmluaXRpYWxpemVyKHsKICAgIG5hbWU6ICdyZWdpc3RlckNvbXBvbmVu dExvb2t1cCcsCiAgICBhZnRlcjogJ2RvbVRlbXBsYXRlcycsCiAgICBpbml0 aWFsaXplOiByZWdpc3RlckNvbXBvbmVudExvb2t1cAogIH0pOwp9KTsKCn0p KCk7CgoKCihmdW5jdGlvbigpIHsKLyoqCkVtYmVyIEhhbmRsZWJhcnMKCkBt b2R1bGUgZW1iZXIKQHN1Ym1vZHVsZSBlbWJlci1oYW5kbGViYXJzCkByZXF1 aXJlcyBlbWJlci12aWV3cwoqLwoKRW1iZXIucnVuTG9hZEhvb2tzKCdFbWJl ci5IYW5kbGViYXJzJywgRW1iZXIuSGFuZGxlYmFycyk7Cgp9KSgpOwoKKGZ1 bmN0aW9uKCkgewpkZWZpbmUoInJvdXRlLXJlY29nbml6ZXIiLAogIFsiZXhw b3J0cyJdLAogIGZ1bmN0aW9uKF9fZXhwb3J0c19fKSB7CiAgICAidXNlIHN0 cmljdCI7CiAgICB2YXIgc3BlY2lhbHMgPSBbCiAgICAgICcvJywgJy4nLCAn KicsICcrJywgJz8nLCAnfCcsCiAgICAgICcoJywgJyknLCAnWycsICddJywg J3snLCAnfScsICdcXCcKICAgIF07CgogICAgdmFyIGVzY2FwZVJlZ2V4ID0g bmV3IFJlZ0V4cCgnKFxcJyArIHNwZWNpYWxzLmpvaW4oJ3xcXCcpICsgJykn LCAnZycpOwoKICAgIGZ1bmN0aW9uIGlzQXJyYXkodGVzdCkgewogICAgICBy ZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHRlc3QpID09 PSAiW29iamVjdCBBcnJheV0iOwogICAgfQoKICAgIC8vIEEgU2VnbWVudCBy ZXByZXNlbnRzIGEgc2VnbWVudCBpbiB0aGUgb3JpZ2luYWwgcm91dGUgZGVz Y3JpcHRpb24uCiAgICAvLyBFYWNoIFNlZ21lbnQgdHlwZSBwcm92aWRlcyBh biBgZWFjaENoYXJgIGFuZCBgcmVnZXhgIG1ldGhvZC4KICAgIC8vCiAgICAv LyBUaGUgYGVhY2hDaGFyYCBtZXRob2QgaW52b2tlcyB0aGUgY2FsbGJhY2sg d2l0aCBvbmUgb3IgbW9yZSBjaGFyYWN0ZXIKICAgIC8vIHNwZWNpZmljYXRp b25zLiBBIGNoYXJhY3RlciBzcGVjaWZpY2F0aW9uIGNvbnN1bWVzIG9uZSBv ciBtb3JlIGlucHV0CiAgICAvLyBjaGFyYWN0ZXJzLgogICAgLy8KICAgIC8v IFRoZSBgcmVnZXhgIG1ldGhvZCByZXR1cm5zIGEgcmVnZXggZnJhZ21lbnQg Zm9yIHRoZSBzZWdtZW50LiBJZiB0aGUKICAgIC8vIHNlZ21lbnQgaXMgYSBk eW5hbWljIG9mIHN0YXIgc2VnbWVudCwgdGhlIHJlZ2V4IGZyYWdtZW50IGFs c28gaW5jbHVkZXMKICAgIC8vIGEgY2FwdHVyZS4KICAgIC8vCiAgICAvLyBB IGNoYXJhY3RlciBzcGVjaWZpY2F0aW9uIGNvbnRhaW5zOgogICAgLy8KICAg IC8vICogYHZhbGlkQ2hhcnNgOiBhIFN0cmluZyB3aXRoIGEgbGlzdCBvZiBh bGwgdmFsaWQgY2hhcmFjdGVycywgb3IKICAgIC8vICogYGludmFsaWRDaGFy c2A6IGEgU3RyaW5nIHdpdGggYSBsaXN0IG9mIGFsbCBpbnZhbGlkIGNoYXJh Y3RlcnMKICAgIC8vICogYHJlcGVhdGA6IHRydWUgaWYgdGhlIGNoYXJhY3Rl ciBzcGVjaWZpY2F0aW9uIGNhbiByZXBlYXQKCiAgICBmdW5jdGlvbiBTdGF0 aWNTZWdtZW50KHN0cmluZykgeyB0aGlzLnN0cmluZyA9IHN0cmluZzsgfQog ICAgU3RhdGljU2VnbWVudC5wcm90b3R5cGUgPSB7CiAgICAgIGVhY2hDaGFy OiBmdW5jdGlvbihjYWxsYmFjaykgewogICAgICAgIHZhciBzdHJpbmcgPSB0 aGlzLnN0cmluZywgY2g7CgogICAgICAgIGZvciAodmFyIGk9MCwgbD1zdHJp bmcubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAgICAgY2ggPSBzdHJpbmcu Y2hhckF0KGkpOwogICAgICAgICAgY2FsbGJhY2soeyB2YWxpZENoYXJzOiBj aCB9KTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICByZWdleDogZnVuY3Rp b24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nLnJlcGxhY2UoZXNj YXBlUmVnZXgsICdcXCQxJyk7CiAgICAgIH0sCgogICAgICBnZW5lcmF0ZTog ZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nOwogICAg ICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIER5bmFtaWNTZWdtZW50KG5hbWUp IHsgdGhpcy5uYW1lID0gbmFtZTsgfQogICAgRHluYW1pY1NlZ21lbnQucHJv dG90eXBlID0gewogICAgICBlYWNoQ2hhcjogZnVuY3Rpb24oY2FsbGJhY2sp IHsKICAgICAgICBjYWxsYmFjayh7IGludmFsaWRDaGFyczogIi8iLCByZXBl YXQ6IHRydWUgfSk7CiAgICAgIH0sCgogICAgICByZWdleDogZnVuY3Rpb24o KSB7CiAgICAgICAgcmV0dXJuICIoW14vXSspIjsKICAgICAgfSwKCiAgICAg IGdlbmVyYXRlOiBmdW5jdGlvbihwYXJhbXMpIHsKICAgICAgICByZXR1cm4g cGFyYW1zW3RoaXMubmFtZV07CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rp b24gU3RhclNlZ21lbnQobmFtZSkgeyB0aGlzLm5hbWUgPSBuYW1lOyB9CiAg ICBTdGFyU2VnbWVudC5wcm90b3R5cGUgPSB7CiAgICAgIGVhY2hDaGFyOiBm dW5jdGlvbihjYWxsYmFjaykgewogICAgICAgIGNhbGxiYWNrKHsgaW52YWxp ZENoYXJzOiAiIiwgcmVwZWF0OiB0cnVlIH0pOwogICAgICB9LAoKICAgICAg cmVnZXg6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAiKC4rKSI7CiAg ICAgIH0sCgogICAgICBnZW5lcmF0ZTogZnVuY3Rpb24ocGFyYW1zKSB7CiAg ICAgICAgcmV0dXJuIHBhcmFtc1t0aGlzLm5hbWVdOwogICAgICB9CiAgICB9 OwoKICAgIGZ1bmN0aW9uIEVwc2lsb25TZWdtZW50KCkge30KICAgIEVwc2ls b25TZWdtZW50LnByb3RvdHlwZSA9IHsKICAgICAgZWFjaENoYXI6IGZ1bmN0 aW9uKCkge30sCiAgICAgIHJlZ2V4OiBmdW5jdGlvbigpIHsgcmV0dXJuICIi OyB9LAogICAgICBnZW5lcmF0ZTogZnVuY3Rpb24oKSB7IHJldHVybiAiIjsg fQogICAgfTsKCiAgICBmdW5jdGlvbiBwYXJzZShyb3V0ZSwgbmFtZXMsIHR5 cGVzKSB7CiAgICAgIC8vIG5vcm1hbGl6ZSByb3V0ZSBhcyBub3Qgc3RhcnRp bmcgd2l0aCBhICIvIi4gUmVjb2duaXRpb24gd2lsbAogICAgICAvLyBhbHNv IG5vcm1hbGl6ZS4KICAgICAgaWYgKHJvdXRlLmNoYXJBdCgwKSA9PT0gIi8i KSB7IHJvdXRlID0gcm91dGUuc3Vic3RyKDEpOyB9CgogICAgICB2YXIgc2Vn bWVudHMgPSByb3V0ZS5zcGxpdCgiLyIpLCByZXN1bHRzID0gW107CgogICAg ICBmb3IgKHZhciBpPTAsIGw9c2VnbWVudHMubGVuZ3RoOyBpPGw7IGkrKykg ewogICAgICAgIHZhciBzZWdtZW50ID0gc2VnbWVudHNbaV0sIG1hdGNoOwoK ICAgICAgICBpZiAobWF0Y2ggPSBzZWdtZW50Lm1hdGNoKC9eOihbXlwvXSsp JC8pKSB7CiAgICAgICAgICByZXN1bHRzLnB1c2gobmV3IER5bmFtaWNTZWdt ZW50KG1hdGNoWzFdKSk7CiAgICAgICAgICBuYW1lcy5wdXNoKG1hdGNoWzFd KTsKICAgICAgICAgIHR5cGVzLmR5bmFtaWNzKys7CiAgICAgICAgfSBlbHNl IGlmIChtYXRjaCA9IHNlZ21lbnQubWF0Y2goL15cKihbXlwvXSspJC8pKSB7 CiAgICAgICAgICByZXN1bHRzLnB1c2gobmV3IFN0YXJTZWdtZW50KG1hdGNo WzFdKSk7CiAgICAgICAgICBuYW1lcy5wdXNoKG1hdGNoWzFdKTsKICAgICAg ICAgIHR5cGVzLnN0YXJzKys7CiAgICAgICAgfSBlbHNlIGlmKHNlZ21lbnQg PT09ICIiKSB7CiAgICAgICAgICByZXN1bHRzLnB1c2gobmV3IEVwc2lsb25T ZWdtZW50KCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXN1bHRz LnB1c2gobmV3IFN0YXRpY1NlZ21lbnQoc2VnbWVudCkpOwogICAgICAgICAg dHlwZXMuc3RhdGljcysrOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0 dXJuIHJlc3VsdHM7CiAgICB9CgogICAgLy8gQSBTdGF0ZSBoYXMgYSBjaGFy YWN0ZXIgc3BlY2lmaWNhdGlvbiBhbmQgKGBjaGFyU3BlY2ApIGFuZCBhIGxp c3Qgb2YgcG9zc2libGUKICAgIC8vIHN1YnNlcXVlbnQgc3RhdGVzIChgbmV4 dFN0YXRlc2ApLgogICAgLy8KICAgIC8vIElmIGEgU3RhdGUgaXMgYW4gYWNj ZXB0aW5nIHN0YXRlLCBpdCB3aWxsIGFsc28gaGF2ZSBzZXZlcmFsIGFkZGl0 aW9uYWwKICAgIC8vIHByb3BlcnRpZXM6CiAgICAvLwogICAgLy8gKiBgcmVn ZXhgOiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IGlzIHVzZWQgdG8gZXh0 cmFjdCBwYXJhbWV0ZXJzIGZyb20gcGF0aHMKICAgIC8vICAgdGhhdCByZWFj aGVkIHRoaXMgYWNjZXB0aW5nIHN0YXRlLgogICAgLy8gKiBgaGFuZGxlcnNg OiBJbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udmVydCB0aGUgbGlzdCBvZiBj YXB0dXJlcyBpbnRvIGNhbGxzCiAgICAvLyAgIHRvIHJlZ2lzdGVyZWQgaGFu ZGxlcnMgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMKICAgIC8vICog YHR5cGVzYDogSG93IG1hbnkgc3RhdGljLCBkeW5hbWljIG9yIHN0YXIgc2Vn bWVudHMgaW4gdGhpcyByb3V0ZS4gVXNlZCB0bwogICAgLy8gICBkZWNpZGUg d2hpY2ggcm91dGUgdG8gdXNlIGlmIG11bHRpcGxlIHJlZ2lzdGVyZWQgcm91 dGVzIG1hdGNoIGEgcGF0aC4KICAgIC8vCiAgICAvLyBDdXJyZW50bHksIFN0 YXRlIGlzIGltcGxlbWVudGVkIG5haXZlbHkgYnkgbG9vcGluZyBvdmVyIGBu ZXh0U3RhdGVzYCBhbmQKICAgIC8vIGNvbXBhcmluZyBhIGNoYXJhY3RlciBz cGVjaWZpY2F0aW9uIGFnYWluc3QgYSBjaGFyYWN0ZXIuIEEgbW9yZSBlZmZp Y2llbnQKICAgIC8vIGltcGxlbWVudGF0aW9uIHdvdWxkIHVzZSBhIGhhc2gg b2Yga2V5cyBwb2ludGluZyBhdCBvbmUgb3IgbW9yZSBuZXh0IHN0YXRlcy4K CiAgICBmdW5jdGlvbiBTdGF0ZShjaGFyU3BlYykgewogICAgICB0aGlzLmNo YXJTcGVjID0gY2hhclNwZWM7CiAgICAgIHRoaXMubmV4dFN0YXRlcyA9IFtd OwogICAgfQoKICAgIFN0YXRlLnByb3RvdHlwZSA9IHsKICAgICAgZ2V0OiBm dW5jdGlvbihjaGFyU3BlYykgewogICAgICAgIHZhciBuZXh0U3RhdGVzID0g dGhpcy5uZXh0U3RhdGVzOwoKICAgICAgICBmb3IgKHZhciBpPTAsIGw9bmV4 dFN0YXRlcy5sZW5ndGg7IGk8bDsgaSsrKSB7CiAgICAgICAgICB2YXIgY2hp bGQgPSBuZXh0U3RhdGVzW2ldOwoKICAgICAgICAgIHZhciBpc0VxdWFsID0g Y2hpbGQuY2hhclNwZWMudmFsaWRDaGFycyA9PT0gY2hhclNwZWMudmFsaWRD aGFyczsKICAgICAgICAgIGlzRXF1YWwgPSBpc0VxdWFsICYmIGNoaWxkLmNo YXJTcGVjLmludmFsaWRDaGFycyA9PT0gY2hhclNwZWMuaW52YWxpZENoYXJz OwoKICAgICAgICAgIGlmIChpc0VxdWFsKSB7IHJldHVybiBjaGlsZDsgfQog ICAgICAgIH0KICAgICAgfSwKCiAgICAgIHB1dDogZnVuY3Rpb24oY2hhclNw ZWMpIHsKICAgICAgICB2YXIgc3RhdGU7CgogICAgICAgIC8vIElmIHRoZSBj aGFyYWN0ZXIgc3BlY2lmaWNhdGlvbiBhbHJlYWR5IGV4aXN0cyBpbiBhIGNo aWxkIG9mIHRoZSBjdXJyZW50CiAgICAgICAgLy8gc3RhdGUsIGp1c3QgcmV0 dXJuIHRoYXQgc3RhdGUuCiAgICAgICAgaWYgKHN0YXRlID0gdGhpcy5nZXQo Y2hhclNwZWMpKSB7IHJldHVybiBzdGF0ZTsgfQoKICAgICAgICAvLyBNYWtl IGEgbmV3IHN0YXRlIGZvciB0aGUgY2hhcmFjdGVyIHNwZWMKICAgICAgICBz dGF0ZSA9IG5ldyBTdGF0ZShjaGFyU3BlYyk7CgogICAgICAgIC8vIEluc2Vy dCB0aGUgbmV3IHN0YXRlIGFzIGEgY2hpbGQgb2YgdGhlIGN1cnJlbnQgc3Rh dGUKICAgICAgICB0aGlzLm5leHRTdGF0ZXMucHVzaChzdGF0ZSk7CgogICAg ICAgIC8vIElmIHRoaXMgY2hhcmFjdGVyIHNwZWNpZmljYXRpb24gcmVwZWF0 cywgaW5zZXJ0IHRoZSBuZXcgc3RhdGUgYXMgYSBjaGlsZAogICAgICAgIC8v IG9mIGl0c2VsZi4gTm90ZSB0aGF0IHRoaXMgd2lsbCBub3QgdHJpZ2dlciBh biBpbmZpbml0ZSBsb29wIGJlY2F1c2UgZWFjaAogICAgICAgIC8vIHRyYW5z aXRpb24gZHVyaW5nIHJlY29nbml0aW9uIGNvbnN1bWVzIGEgY2hhcmFjdGVy LgogICAgICAgIGlmIChjaGFyU3BlYy5yZXBlYXQpIHsKICAgICAgICAgIHN0 YXRlLm5leHRTdGF0ZXMucHVzaChzdGF0ZSk7CiAgICAgICAgfQoKICAgICAg ICAvLyBSZXR1cm4gdGhlIG5ldyBzdGF0ZQogICAgICAgIHJldHVybiBzdGF0 ZTsKICAgICAgfSwKCiAgICAgIC8vIEZpbmQgYSBsaXN0IG9mIGNoaWxkIHN0 YXRlcyBtYXRjaGluZyB0aGUgbmV4dCBjaGFyYWN0ZXIKICAgICAgbWF0Y2g6 IGZ1bmN0aW9uKGNoKSB7CiAgICAgICAgLy8gREVCVUcgIlByb2Nlc3Npbmcg YCIgKyBjaCArICJgOiIKICAgICAgICB2YXIgbmV4dFN0YXRlcyA9IHRoaXMu bmV4dFN0YXRlcywKICAgICAgICAgICAgY2hpbGQsIGNoYXJTcGVjLCBjaGFy czsKCiAgICAgICAgLy8gREVCVUcgIiAgIiArIGRlYnVnU3RhdGUodGhpcykK ICAgICAgICB2YXIgcmV0dXJuZWQgPSBbXTsKCiAgICAgICAgZm9yICh2YXIg aT0wLCBsPW5leHRTdGF0ZXMubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAg ICAgY2hpbGQgPSBuZXh0U3RhdGVzW2ldOwoKICAgICAgICAgIGNoYXJTcGVj ID0gY2hpbGQuY2hhclNwZWM7CgogICAgICAgICAgaWYgKHR5cGVvZiAoY2hh cnMgPSBjaGFyU3BlYy52YWxpZENoYXJzKSAhPT0gJ3VuZGVmaW5lZCcpIHsK ICAgICAgICAgICAgaWYgKGNoYXJzLmluZGV4T2YoY2gpICE9PSAtMSkgeyBy ZXR1cm5lZC5wdXNoKGNoaWxkKTsgfQogICAgICAgICAgfSBlbHNlIGlmICh0 eXBlb2YgKGNoYXJzID0gY2hhclNwZWMuaW52YWxpZENoYXJzKSAhPT0gJ3Vu ZGVmaW5lZCcpIHsKICAgICAgICAgICAgaWYgKGNoYXJzLmluZGV4T2YoY2gp ID09PSAtMSkgeyByZXR1cm5lZC5wdXNoKGNoaWxkKTsgfQogICAgICAgICAg fQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJldHVybmVkOwogICAgICB9 CgogICAgICAvKiogSUYgREVCVUcKICAgICAgLCBkZWJ1ZzogZnVuY3Rpb24o KSB7CiAgICAgICAgdmFyIGNoYXJTcGVjID0gdGhpcy5jaGFyU3BlYywKICAg ICAgICAgICAgZGVidWcgPSAiWyIsCiAgICAgICAgICAgIGNoYXJzID0gY2hh clNwZWMudmFsaWRDaGFycyB8fCBjaGFyU3BlYy5pbnZhbGlkQ2hhcnM7Cgog ICAgICAgIGlmIChjaGFyU3BlYy5pbnZhbGlkQ2hhcnMpIHsgZGVidWcgKz0g Il4iOyB9CiAgICAgICAgZGVidWcgKz0gY2hhcnM7CiAgICAgICAgZGVidWcg Kz0gIl0iOwoKICAgICAgICBpZiAoY2hhclNwZWMucmVwZWF0KSB7IGRlYnVn ICs9ICIrIjsgfQoKICAgICAgICByZXR1cm4gZGVidWc7CiAgICAgIH0KICAg ICAgRU5EIElGICoqLwogICAgfTsKCiAgICAvKiogSUYgREVCVUcKICAgIGZ1 bmN0aW9uIGRlYnVnKGxvZykgewogICAgICBjb25zb2xlLmxvZyhsb2cpOwog ICAgfQoKICAgIGZ1bmN0aW9uIGRlYnVnU3RhdGUoc3RhdGUpIHsKICAgICAg cmV0dXJuIHN0YXRlLm5leHRTdGF0ZXMubWFwKGZ1bmN0aW9uKG4pIHsKICAg ICAgICBpZiAobi5uZXh0U3RhdGVzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4g IiggIiArIG4uZGVidWcoKSArICIgW2FjY2VwdGluZ10gKSI7IH0KICAgICAg ICByZXR1cm4gIiggIiArIG4uZGVidWcoKSArICIgPHRoZW4+ICIgKyBuLm5l eHRTdGF0ZXMubWFwKGZ1bmN0aW9uKHMpIHsgcmV0dXJuIHMuZGVidWcoKSB9 KS5qb2luKCIgb3IgIikgKyAiICkiOwogICAgICB9KS5qb2luKCIsICIpCiAg ICB9CiAgICBFTkQgSUYgKiovCgogICAgLy8gVGhpcyBpcyBhIHNvbWV3aGF0 IG5haXZlIHN0cmF0ZWd5LCBidXQgc2hvdWxkIHdvcmsgaW4gYSBsb3Qgb2Yg Y2FzZXMKICAgIC8vIEEgYmV0dGVyIHN0cmF0ZWd5IHdvdWxkIHByb3Blcmx5 IHJlc29sdmUgL3Bvc3RzLzppZC9uZXcgYW5kIC9wb3N0cy9lZGl0LzppZC4K ICAgIC8vCiAgICAvLyBUaGlzIHN0cmF0ZWd5IGdlbmVyYWxseSBwcmVmZXJz IG1vcmUgc3RhdGljIGFuZCBsZXNzIGR5bmFtaWMgbWF0Y2hpbmcuCiAgICAv LyBTcGVjaWZpY2FsbHksIGl0CiAgICAvLwogICAgLy8gICogcHJlZmVycyBm ZXdlciBzdGFycyB0byBtb3JlLCB0aGVuCiAgICAvLyAgKiBwcmVmZXJzIHVz aW5nIHN0YXJzIGZvciBsZXNzIG9mIHRoZSBtYXRjaCB0byBtb3JlLCB0aGVu CiAgICAvLyAgKiBwcmVmZXJzIGZld2VyIGR5bmFtaWMgc2VnbWVudHMgdG8g bW9yZSwgdGhlbgogICAgLy8gICogcHJlZmVycyBtb3JlIHN0YXRpYyBzZWdt ZW50cyB0byBtb3JlCiAgICBmdW5jdGlvbiBzb3J0U29sdXRpb25zKHN0YXRl cykgewogICAgICByZXR1cm4gc3RhdGVzLnNvcnQoZnVuY3Rpb24oYSwgYikg ewogICAgICAgIGlmIChhLnR5cGVzLnN0YXJzICE9PSBiLnR5cGVzLnN0YXJz KSB7IHJldHVybiBhLnR5cGVzLnN0YXJzIC0gYi50eXBlcy5zdGFyczsgfQoK ICAgICAgICBpZiAoYS50eXBlcy5zdGFycykgewogICAgICAgICAgaWYgKGEu dHlwZXMuc3RhdGljcyAhPT0gYi50eXBlcy5zdGF0aWNzKSB7IHJldHVybiBi LnR5cGVzLnN0YXRpY3MgLSBhLnR5cGVzLnN0YXRpY3M7IH0KICAgICAgICAg IGlmIChhLnR5cGVzLmR5bmFtaWNzICE9PSBiLnR5cGVzLmR5bmFtaWNzKSB7 IHJldHVybiBiLnR5cGVzLmR5bmFtaWNzIC0gYS50eXBlcy5keW5hbWljczsg fQogICAgICAgIH0KCiAgICAgICAgaWYgKGEudHlwZXMuZHluYW1pY3MgIT09 IGIudHlwZXMuZHluYW1pY3MpIHsgcmV0dXJuIGEudHlwZXMuZHluYW1pY3Mg LSBiLnR5cGVzLmR5bmFtaWNzOyB9CiAgICAgICAgaWYgKGEudHlwZXMuc3Rh dGljcyAhPT0gYi50eXBlcy5zdGF0aWNzKSB7IHJldHVybiBiLnR5cGVzLnN0 YXRpY3MgLSBhLnR5cGVzLnN0YXRpY3M7IH0KCiAgICAgICAgcmV0dXJuIDA7 CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlY29nbml6ZUNoYXIo c3RhdGVzLCBjaCkgewogICAgICB2YXIgbmV4dFN0YXRlcyA9IFtdOwoKICAg ICAgZm9yICh2YXIgaT0wLCBsPXN0YXRlcy5sZW5ndGg7IGk8bDsgaSsrKSB7 CiAgICAgICAgdmFyIHN0YXRlID0gc3RhdGVzW2ldOwoKICAgICAgICBuZXh0 U3RhdGVzID0gbmV4dFN0YXRlcy5jb25jYXQoc3RhdGUubWF0Y2goY2gpKTsK ICAgICAgfQoKICAgICAgcmV0dXJuIG5leHRTdGF0ZXM7CiAgICB9CgogICAg dmFyIG9DcmVhdGUgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uKHByb3Rv KSB7CiAgICAgIGZ1bmN0aW9uIEYoKSB7fQogICAgICBGLnByb3RvdHlwZSA9 IHByb3RvOwogICAgICByZXR1cm4gbmV3IEYoKTsKICAgIH07CgogICAgZnVu Y3Rpb24gUmVjb2duaXplUmVzdWx0cyhxdWVyeVBhcmFtcykgewogICAgICB0 aGlzLnF1ZXJ5UGFyYW1zID0gcXVlcnlQYXJhbXMgfHwge307CiAgICB9CiAg ICBSZWNvZ25pemVSZXN1bHRzLnByb3RvdHlwZSA9IG9DcmVhdGUoewogICAg ICBzcGxpY2U6IEFycmF5LnByb3RvdHlwZS5zcGxpY2UsCiAgICAgIHNsaWNl OiAgQXJyYXkucHJvdG90eXBlLnNsaWNlLAogICAgICBwdXNoOiAgIEFycmF5 LnByb3RvdHlwZS5wdXNoLAogICAgICBsZW5ndGg6IDAsCiAgICAgIHF1ZXJ5 UGFyYW1zOiBudWxsCiAgICB9KTsKCiAgICBmdW5jdGlvbiBmaW5kSGFuZGxl cihzdGF0ZSwgcGF0aCwgcXVlcnlQYXJhbXMpIHsKICAgICAgdmFyIGhhbmRs ZXJzID0gc3RhdGUuaGFuZGxlcnMsIHJlZ2V4ID0gc3RhdGUucmVnZXg7CiAg ICAgIHZhciBjYXB0dXJlcyA9IHBhdGgubWF0Y2gocmVnZXgpLCBjdXJyZW50 Q2FwdHVyZSA9IDE7CiAgICAgIHZhciByZXN1bHQgPSBuZXcgUmVjb2duaXpl UmVzdWx0cyhxdWVyeVBhcmFtcyk7CgogICAgICBmb3IgKHZhciBpPTAsIGw9 aGFuZGxlcnMubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAgIHZhciBoYW5k bGVyID0gaGFuZGxlcnNbaV0sIG5hbWVzID0gaGFuZGxlci5uYW1lcywgcGFy YW1zID0ge307CgogICAgICAgIGZvciAodmFyIGo9MCwgbT1uYW1lcy5sZW5n dGg7IGo8bTsgaisrKSB7CiAgICAgICAgICBwYXJhbXNbbmFtZXNbal1dID0g Y2FwdHVyZXNbY3VycmVudENhcHR1cmUrK107CiAgICAgICAgfQoKICAgICAg ICByZXN1bHQucHVzaCh7IGhhbmRsZXI6IGhhbmRsZXIuaGFuZGxlciwgcGFy YW1zOiBwYXJhbXMsIGlzRHluYW1pYzogISFuYW1lcy5sZW5ndGggfSk7CiAg ICAgIH0KCiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgZnVuY3Rp b24gYWRkU2VnbWVudChjdXJyZW50U3RhdGUsIHNlZ21lbnQpIHsKICAgICAg c2VnbWVudC5lYWNoQ2hhcihmdW5jdGlvbihjaCkgewogICAgICAgIHZhciBz dGF0ZTsKCiAgICAgICAgY3VycmVudFN0YXRlID0gY3VycmVudFN0YXRlLnB1 dChjaCk7CiAgICAgIH0pOwoKICAgICAgcmV0dXJuIGN1cnJlbnRTdGF0ZTsK ICAgIH0KCiAgICAvLyBUaGUgbWFpbiBpbnRlcmZhY2UKCiAgICB2YXIgUm91 dGVSZWNvZ25pemVyID0gZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMucm9vdFN0 YXRlID0gbmV3IFN0YXRlKCk7CiAgICAgIHRoaXMubmFtZXMgPSB7fTsKICAg IH07CgoKICAgIFJvdXRlUmVjb2duaXplci5wcm90b3R5cGUgPSB7CiAgICAg IGFkZDogZnVuY3Rpb24ocm91dGVzLCBvcHRpb25zKSB7CiAgICAgICAgdmFy IGN1cnJlbnRTdGF0ZSA9IHRoaXMucm9vdFN0YXRlLCByZWdleCA9ICJeIiwK ICAgICAgICAgICAgdHlwZXMgPSB7IHN0YXRpY3M6IDAsIGR5bmFtaWNzOiAw LCBzdGFyczogMCB9LAogICAgICAgICAgICBoYW5kbGVycyA9IFtdLCBhbGxT ZWdtZW50cyA9IFtdLCBuYW1lOwoKICAgICAgICB2YXIgaXNFbXB0eSA9IHRy dWU7CgogICAgICAgIGZvciAodmFyIGk9MCwgbD1yb3V0ZXMubGVuZ3RoOyBp PGw7IGkrKykgewogICAgICAgICAgdmFyIHJvdXRlID0gcm91dGVzW2ldLCBu YW1lcyA9IFtdOwoKICAgICAgICAgIHZhciBzZWdtZW50cyA9IHBhcnNlKHJv dXRlLnBhdGgsIG5hbWVzLCB0eXBlcyk7CgogICAgICAgICAgYWxsU2VnbWVu dHMgPSBhbGxTZWdtZW50cy5jb25jYXQoc2VnbWVudHMpOwoKICAgICAgICAg IGZvciAodmFyIGo9MCwgbT1zZWdtZW50cy5sZW5ndGg7IGo8bTsgaisrKSB7 CiAgICAgICAgICAgIHZhciBzZWdtZW50ID0gc2VnbWVudHNbal07CgogICAg ICAgICAgICBpZiAoc2VnbWVudCBpbnN0YW5jZW9mIEVwc2lsb25TZWdtZW50 KSB7IGNvbnRpbnVlOyB9CgogICAgICAgICAgICBpc0VtcHR5ID0gZmFsc2U7 CgogICAgICAgICAgICAvLyBBZGQgYSAiLyIgZm9yIHRoZSBuZXcgc2VnbWVu dAogICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBjdXJyZW50U3RhdGUucHV0 KHsgdmFsaWRDaGFyczogIi8iIH0pOwogICAgICAgICAgICByZWdleCArPSAi LyI7CgogICAgICAgICAgICAvLyBBZGQgYSByZXByZXNlbnRhdGlvbiBvZiB0 aGUgc2VnbWVudCB0byB0aGUgTkZBIGFuZCByZWdleAogICAgICAgICAgICBj dXJyZW50U3RhdGUgPSBhZGRTZWdtZW50KGN1cnJlbnRTdGF0ZSwgc2VnbWVu dCk7CiAgICAgICAgICAgIHJlZ2V4ICs9IHNlZ21lbnQucmVnZXgoKTsKICAg ICAgICAgIH0KCiAgICAgICAgICB2YXIgaGFuZGxlciA9IHsgaGFuZGxlcjog cm91dGUuaGFuZGxlciwgbmFtZXM6IG5hbWVzIH07CiAgICAgICAgICBoYW5k bGVycy5wdXNoKGhhbmRsZXIpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlz RW1wdHkpIHsKICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IGN1cnJlbnRTdGF0 ZS5wdXQoeyB2YWxpZENoYXJzOiAiLyIgfSk7CiAgICAgICAgICByZWdleCAr PSAiLyI7CiAgICAgICAgfQoKICAgICAgICBjdXJyZW50U3RhdGUuaGFuZGxl cnMgPSBoYW5kbGVyczsKICAgICAgICBjdXJyZW50U3RhdGUucmVnZXggPSBu ZXcgUmVnRXhwKHJlZ2V4ICsgIiQiKTsKICAgICAgICBjdXJyZW50U3RhdGUu dHlwZXMgPSB0eXBlczsKCiAgICAgICAgaWYgKG5hbWUgPSBvcHRpb25zICYm IG9wdGlvbnMuYXMpIHsKICAgICAgICAgIHRoaXMubmFtZXNbbmFtZV0gPSB7 CiAgICAgICAgICAgIHNlZ21lbnRzOiBhbGxTZWdtZW50cywKICAgICAgICAg ICAgaGFuZGxlcnM6IGhhbmRsZXJzCiAgICAgICAgICB9OwogICAgICAgIH0K ICAgICAgfSwKCiAgICAgIGhhbmRsZXJzRm9yOiBmdW5jdGlvbihuYW1lKSB7 CiAgICAgICAgdmFyIHJvdXRlID0gdGhpcy5uYW1lc1tuYW1lXSwgcmVzdWx0 ID0gW107CiAgICAgICAgaWYgKCFyb3V0ZSkgeyB0aHJvdyBuZXcgRXJyb3Io IlRoZXJlIGlzIG5vIHJvdXRlIG5hbWVkICIgKyBuYW1lKTsgfQoKICAgICAg ICBmb3IgKHZhciBpPTAsIGw9cm91dGUuaGFuZGxlcnMubGVuZ3RoOyBpPGw7 IGkrKykgewogICAgICAgICAgcmVzdWx0LnB1c2gocm91dGUuaGFuZGxlcnNb aV0pOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAg fSwKCiAgICAgIGhhc1JvdXRlOiBmdW5jdGlvbihuYW1lKSB7CiAgICAgICAg cmV0dXJuICEhdGhpcy5uYW1lc1tuYW1lXTsKICAgICAgfSwKCiAgICAgIGdl bmVyYXRlOiBmdW5jdGlvbihuYW1lLCBwYXJhbXMpIHsKICAgICAgICB2YXIg cm91dGUgPSB0aGlzLm5hbWVzW25hbWVdLCBvdXRwdXQgPSAiIjsKICAgICAg ICBpZiAoIXJvdXRlKSB7IHRocm93IG5ldyBFcnJvcigiVGhlcmUgaXMgbm8g cm91dGUgbmFtZWQgIiArIG5hbWUpOyB9CgogICAgICAgIHZhciBzZWdtZW50 cyA9IHJvdXRlLnNlZ21lbnRzOwoKICAgICAgICBmb3IgKHZhciBpPTAsIGw9 c2VnbWVudHMubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAgICAgdmFyIHNl Z21lbnQgPSBzZWdtZW50c1tpXTsKCiAgICAgICAgICBpZiAoc2VnbWVudCBp bnN0YW5jZW9mIEVwc2lsb25TZWdtZW50KSB7IGNvbnRpbnVlOyB9CgogICAg ICAgICAgb3V0cHV0ICs9ICIvIjsKICAgICAgICAgIG91dHB1dCArPSBzZWdt ZW50LmdlbmVyYXRlKHBhcmFtcyk7CiAgICAgICAgfQoKICAgICAgICBpZiAo b3V0cHV0LmNoYXJBdCgwKSAhPT0gJy8nKSB7IG91dHB1dCA9ICcvJyArIG91 dHB1dDsgfQoKICAgICAgICBpZiAocGFyYW1zICYmIHBhcmFtcy5xdWVyeVBh cmFtcykgewogICAgICAgICAgb3V0cHV0ICs9IHRoaXMuZ2VuZXJhdGVRdWVy eVN0cmluZyhwYXJhbXMucXVlcnlQYXJhbXMsIHJvdXRlLmhhbmRsZXJzKTsK ICAgICAgICB9CgogICAgICAgIHJldHVybiBvdXRwdXQ7CiAgICAgIH0sCgog ICAgICBnZW5lcmF0ZVF1ZXJ5U3RyaW5nOiBmdW5jdGlvbihwYXJhbXMsIGhh bmRsZXJzKSB7CiAgICAgICAgdmFyIHBhaXJzID0gW107CiAgICAgICAgdmFy IGtleXMgPSBbXTsKICAgICAgICBmb3IodmFyIGtleSBpbiBwYXJhbXMpIHsK ICAgICAgICAgIGlmIChwYXJhbXMuaGFzT3duUHJvcGVydHkoa2V5KSkgewog ICAgICAgICAgICBrZXlzLnB1c2goa2V5KTsKICAgICAgICAgIH0KICAgICAg ICB9CiAgICAgICAga2V5cy5zb3J0KCk7CiAgICAgICAgZm9yICh2YXIgaSA9 IDAsIGxlbiA9IGtleXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAg ICAgIGtleSA9IGtleXNbaV07CiAgICAgICAgICB2YXIgdmFsdWUgPSBwYXJh bXNba2V5XTsKICAgICAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UgfHwgdmFs dWUgPT0gbnVsbCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAg IH0KICAgICAgICAgIHZhciBwYWlyID0ga2V5OwogICAgICAgICAgaWYgKGlz QXJyYXkodmFsdWUpKSB7CiAgICAgICAgICAgIGZvciAodmFyIGogPSAwLCBs ID0gdmFsdWUubGVuZ3RoOyBqIDwgbDsgaisrKSB7CiAgICAgICAgICAgICAg dmFyIGFycmF5UGFpciA9IGtleSArICdbXScgKyAnPScgKyBlbmNvZGVVUklD b21wb25lbnQodmFsdWVbal0pOwogICAgICAgICAgICAgIHBhaXJzLnB1c2go YXJyYXlQYWlyKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAg ICAgZWxzZSBpZiAodmFsdWUgIT09IHRydWUpIHsKICAgICAgICAgICAgcGFp ciArPSAiPSIgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpOwogICAgICAg ICAgICBwYWlycy5wdXNoKHBhaXIpOwogICAgICAgICAgfSBlbHNlIHsKICAg ICAgICAgICAgcGFpcnMucHVzaChwYWlyKTsKICAgICAgICAgIH0KICAgICAg ICB9CgogICAgICAgIGlmIChwYWlycy5sZW5ndGggPT09IDApIHsgcmV0dXJu ICcnOyB9CgogICAgICAgIHJldHVybiAiPyIgKyBwYWlycy5qb2luKCImIik7 CiAgICAgIH0sCgogICAgICBwYXJzZVF1ZXJ5U3RyaW5nOiBmdW5jdGlvbihx dWVyeVN0cmluZykgewogICAgICAgIHZhciBwYWlycyA9IHF1ZXJ5U3RyaW5n LnNwbGl0KCImIiksIHF1ZXJ5UGFyYW1zID0ge307CiAgICAgICAgZm9yKHZh ciBpPTA7IGkgPCBwYWlycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFy IHBhaXIgICAgICA9IHBhaXJzW2ldLnNwbGl0KCc9JyksCiAgICAgICAgICAg ICAga2V5ICAgICAgID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhaXJbMF0pLAog ICAgICAgICAgICAgIGtleUxlbmd0aCA9IGtleS5sZW5ndGgsCiAgICAgICAg ICAgICAgaXNBcnJheSA9IGZhbHNlLAogICAgICAgICAgICAgIHZhbHVlOwog ICAgICAgICAgaWYgKHBhaXIubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAg IHZhbHVlID0gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAg IC8vSGFuZGxlIGFycmF5cwogICAgICAgICAgICBpZiAoa2V5TGVuZ3RoID4g MiAmJiBrZXkuc2xpY2Uoa2V5TGVuZ3RoIC0yKSA9PT0gJ1tdJykgewogICAg ICAgICAgICAgIGlzQXJyYXkgPSB0cnVlOwogICAgICAgICAgICAgIGtleSA9 IGtleS5zbGljZSgwLCBrZXlMZW5ndGggLSAyKTsKICAgICAgICAgICAgICBp ZighcXVlcnlQYXJhbXNba2V5XSkgewogICAgICAgICAgICAgICAgcXVlcnlQ YXJhbXNba2V5XSA9IFtdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAg fQogICAgICAgICAgICB2YWx1ZSA9IHBhaXJbMV0gPyBkZWNvZGVVUklDb21w b25lbnQocGFpclsxXSkgOiAnJzsKICAgICAgICAgIH0KICAgICAgICAgIGlm IChpc0FycmF5KSB7CiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zW2tleV0ucHVz aCh2YWx1ZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBxdWVy eVBhcmFtc1trZXldID0gdmFsdWU7CiAgICAgICAgICB9CgogICAgICAgIH0K ICAgICAgICByZXR1cm4gcXVlcnlQYXJhbXM7CiAgICAgIH0sCgogICAgICBy ZWNvZ25pemU6IGZ1bmN0aW9uKHBhdGgpIHsKICAgICAgICB2YXIgc3RhdGVz ID0gWyB0aGlzLnJvb3RTdGF0ZSBdLAogICAgICAgICAgICBwYXRoTGVuLCBp LCBsLCBxdWVyeVN0YXJ0LCBxdWVyeVBhcmFtcyA9IHt9LAogICAgICAgICAg ICBpc1NsYXNoRHJvcHBlZCA9IGZhbHNlOwoKICAgICAgICBwYXRoID0gZGVj b2RlVVJJKHBhdGgpOwoKICAgICAgICBxdWVyeVN0YXJ0ID0gcGF0aC5pbmRl eE9mKCc/Jyk7CiAgICAgICAgaWYgKHF1ZXJ5U3RhcnQgIT09IC0xKSB7CiAg ICAgICAgICB2YXIgcXVlcnlTdHJpbmcgPSBwYXRoLnN1YnN0cihxdWVyeVN0 YXJ0ICsgMSwgcGF0aC5sZW5ndGgpOwogICAgICAgICAgcGF0aCA9IHBhdGgu c3Vic3RyKDAsIHF1ZXJ5U3RhcnQpOwogICAgICAgICAgcXVlcnlQYXJhbXMg PSB0aGlzLnBhcnNlUXVlcnlTdHJpbmcocXVlcnlTdHJpbmcpOwogICAgICAg IH0KCiAgICAgICAgLy8gREVCVUcgR1JPVVAgcGF0aAoKICAgICAgICBpZiAo cGF0aC5jaGFyQXQoMCkgIT09ICIvIikgeyBwYXRoID0gIi8iICsgcGF0aDsg fQoKICAgICAgICBwYXRoTGVuID0gcGF0aC5sZW5ndGg7CiAgICAgICAgaWYg KHBhdGhMZW4gPiAxICYmIHBhdGguY2hhckF0KHBhdGhMZW4gLSAxKSA9PT0g Ii8iKSB7CiAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHIoMCwgcGF0aExl biAtIDEpOwogICAgICAgICAgaXNTbGFzaERyb3BwZWQgPSB0cnVlOwogICAg ICAgIH0KCiAgICAgICAgZm9yIChpPTAsIGw9cGF0aC5sZW5ndGg7IGk8bDsg aSsrKSB7CiAgICAgICAgICBzdGF0ZXMgPSByZWNvZ25pemVDaGFyKHN0YXRl cywgcGF0aC5jaGFyQXQoaSkpOwogICAgICAgICAgaWYgKCFzdGF0ZXMubGVu Z3RoKSB7IGJyZWFrOyB9CiAgICAgICAgfQoKICAgICAgICAvLyBFTkQgREVC VUcgR1JPVVAKCiAgICAgICAgdmFyIHNvbHV0aW9ucyA9IFtdOwogICAgICAg IGZvciAoaT0wLCBsPXN0YXRlcy5sZW5ndGg7IGk8bDsgaSsrKSB7CiAgICAg ICAgICBpZiAoc3RhdGVzW2ldLmhhbmRsZXJzKSB7IHNvbHV0aW9ucy5wdXNo KHN0YXRlc1tpXSk7IH0KICAgICAgICB9CgogICAgICAgIHN0YXRlcyA9IHNv cnRTb2x1dGlvbnMoc29sdXRpb25zKTsKCiAgICAgICAgdmFyIHN0YXRlID0g c29sdXRpb25zWzBdOwoKICAgICAgICBpZiAoc3RhdGUgJiYgc3RhdGUuaGFu ZGxlcnMpIHsKICAgICAgICAgIC8vIGlmIGEgdHJhaWxpbmcgc2xhc2ggd2Fz IGRyb3BwZWQgYW5kIGEgc3RhciBzZWdtZW50IGlzIHRoZSBsYXN0IHNlZ21l bnQKICAgICAgICAgIC8vIHNwZWNpZmllZCwgcHV0IHRoZSB0cmFpbGluZyBz bGFzaCBiYWNrCiAgICAgICAgICBpZiAoaXNTbGFzaERyb3BwZWQgJiYgc3Rh dGUucmVnZXguc291cmNlLnNsaWNlKC01KSA9PT0gIiguKykkIikgewogICAg ICAgICAgICBwYXRoID0gcGF0aCArICIvIjsKICAgICAgICAgIH0KICAgICAg ICAgIHJldHVybiBmaW5kSGFuZGxlcihzdGF0ZSwgcGF0aCwgcXVlcnlQYXJh bXMpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKCiAgICBfX2V4cG9ydHNf X1siZGVmYXVsdCJdID0gUm91dGVSZWNvZ25pemVyOwoKICAgIGZ1bmN0aW9u IFRhcmdldChwYXRoLCBtYXRjaGVyLCBkZWxlZ2F0ZSkgewogICAgICB0aGlz LnBhdGggPSBwYXRoOwogICAgICB0aGlzLm1hdGNoZXIgPSBtYXRjaGVyOwog ICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7CiAgICB9CgogICAgVGFy Z2V0LnByb3RvdHlwZSA9IHsKICAgICAgdG86IGZ1bmN0aW9uKHRhcmdldCwg Y2FsbGJhY2spIHsKICAgICAgICB2YXIgZGVsZWdhdGUgPSB0aGlzLmRlbGVn YXRlOwoKICAgICAgICBpZiAoZGVsZWdhdGUgJiYgZGVsZWdhdGUud2lsbEFk ZFJvdXRlKSB7CiAgICAgICAgICB0YXJnZXQgPSBkZWxlZ2F0ZS53aWxsQWRk Um91dGUodGhpcy5tYXRjaGVyLnRhcmdldCwgdGFyZ2V0KTsKICAgICAgICB9 CgogICAgICAgIHRoaXMubWF0Y2hlci5hZGQodGhpcy5wYXRoLCB0YXJnZXQp OwoKICAgICAgICBpZiAoY2FsbGJhY2spIHsKICAgICAgICAgIGlmIChjYWxs YmFjay5sZW5ndGggPT09IDApIHsgdGhyb3cgbmV3IEVycm9yKCJZb3UgbXVz dCBoYXZlIGFuIGFyZ3VtZW50IGluIHRoZSBmdW5jdGlvbiBwYXNzZWQgdG8g YHRvYCIpOyB9CiAgICAgICAgICB0aGlzLm1hdGNoZXIuYWRkQ2hpbGQodGhp cy5wYXRoLCB0YXJnZXQsIGNhbGxiYWNrLCB0aGlzLmRlbGVnYXRlKTsKICAg ICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KICAgIH07Cgog ICAgZnVuY3Rpb24gTWF0Y2hlcih0YXJnZXQpIHsKICAgICAgdGhpcy5yb3V0 ZXMgPSB7fTsKICAgICAgdGhpcy5jaGlsZHJlbiA9IHt9OwogICAgICB0aGlz LnRhcmdldCA9IHRhcmdldDsKICAgIH0KCiAgICBNYXRjaGVyLnByb3RvdHlw ZSA9IHsKICAgICAgYWRkOiBmdW5jdGlvbihwYXRoLCBoYW5kbGVyKSB7CiAg ICAgICAgdGhpcy5yb3V0ZXNbcGF0aF0gPSBoYW5kbGVyOwogICAgICB9LAoK ICAgICAgYWRkQ2hpbGQ6IGZ1bmN0aW9uKHBhdGgsIHRhcmdldCwgY2FsbGJh Y2ssIGRlbGVnYXRlKSB7CiAgICAgICAgdmFyIG1hdGNoZXIgPSBuZXcgTWF0 Y2hlcih0YXJnZXQpOwogICAgICAgIHRoaXMuY2hpbGRyZW5bcGF0aF0gPSBt YXRjaGVyOwoKICAgICAgICB2YXIgbWF0Y2ggPSBnZW5lcmF0ZU1hdGNoKHBh dGgsIG1hdGNoZXIsIGRlbGVnYXRlKTsKCiAgICAgICAgaWYgKGRlbGVnYXRl ICYmIGRlbGVnYXRlLmNvbnRleHRFbnRlcmVkKSB7CiAgICAgICAgICBkZWxl Z2F0ZS5jb250ZXh0RW50ZXJlZCh0YXJnZXQsIG1hdGNoKTsKICAgICAgICB9 CgogICAgICAgIGNhbGxiYWNrKG1hdGNoKTsKICAgICAgfQogICAgfTsKCiAg ICBmdW5jdGlvbiBnZW5lcmF0ZU1hdGNoKHN0YXJ0aW5nUGF0aCwgbWF0Y2hl ciwgZGVsZWdhdGUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHBhdGgsIG5l c3RlZENhbGxiYWNrKSB7CiAgICAgICAgdmFyIGZ1bGxQYXRoID0gc3RhcnRp bmdQYXRoICsgcGF0aDsKCiAgICAgICAgaWYgKG5lc3RlZENhbGxiYWNrKSB7 CiAgICAgICAgICBuZXN0ZWRDYWxsYmFjayhnZW5lcmF0ZU1hdGNoKGZ1bGxQ YXRoLCBtYXRjaGVyLCBkZWxlZ2F0ZSkpOwogICAgICAgIH0gZWxzZSB7CiAg ICAgICAgICByZXR1cm4gbmV3IFRhcmdldChzdGFydGluZ1BhdGggKyBwYXRo LCBtYXRjaGVyLCBkZWxlZ2F0ZSk7CiAgICAgICAgfQogICAgICB9OwogICAg fQoKICAgIGZ1bmN0aW9uIGFkZFJvdXRlKHJvdXRlQXJyYXksIHBhdGgsIGhh bmRsZXIpIHsKICAgICAgdmFyIGxlbiA9IDA7CiAgICAgIGZvciAodmFyIGk9 MCwgbD1yb3V0ZUFycmF5Lmxlbmd0aDsgaTxsOyBpKyspIHsKICAgICAgICBs ZW4gKz0gcm91dGVBcnJheVtpXS5wYXRoLmxlbmd0aDsKICAgICAgfQoKICAg ICAgcGF0aCA9IHBhdGguc3Vic3RyKGxlbik7CiAgICAgIHZhciByb3V0ZSA9 IHsgcGF0aDogcGF0aCwgaGFuZGxlcjogaGFuZGxlciB9OwogICAgICByb3V0 ZUFycmF5LnB1c2gocm91dGUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGVhY2hS b3V0ZShiYXNlUm91dGUsIG1hdGNoZXIsIGNhbGxiYWNrLCBiaW5kaW5nKSB7 CiAgICAgIHZhciByb3V0ZXMgPSBtYXRjaGVyLnJvdXRlczsKCiAgICAgIGZv ciAodmFyIHBhdGggaW4gcm91dGVzKSB7CiAgICAgICAgaWYgKHJvdXRlcy5o YXNPd25Qcm9wZXJ0eShwYXRoKSkgewogICAgICAgICAgdmFyIHJvdXRlQXJy YXkgPSBiYXNlUm91dGUuc2xpY2UoKTsKICAgICAgICAgIGFkZFJvdXRlKHJv dXRlQXJyYXksIHBhdGgsIHJvdXRlc1twYXRoXSk7CgogICAgICAgICAgaWYg KG1hdGNoZXIuY2hpbGRyZW5bcGF0aF0pIHsKICAgICAgICAgICAgZWFjaFJv dXRlKHJvdXRlQXJyYXksIG1hdGNoZXIuY2hpbGRyZW5bcGF0aF0sIGNhbGxi YWNrLCBiaW5kaW5nKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAg IGNhbGxiYWNrLmNhbGwoYmluZGluZywgcm91dGVBcnJheSk7CiAgICAgICAg ICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgUm91dGVSZWNvZ25p emVyLnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbihjYWxsYmFjaywgYWRkUm91 dGVDYWxsYmFjaykgewogICAgICB2YXIgbWF0Y2hlciA9IG5ldyBNYXRjaGVy KCk7CgogICAgICBjYWxsYmFjayhnZW5lcmF0ZU1hdGNoKCIiLCBtYXRjaGVy LCB0aGlzLmRlbGVnYXRlKSk7CgogICAgICBlYWNoUm91dGUoW10sIG1hdGNo ZXIsIGZ1bmN0aW9uKHJvdXRlKSB7CiAgICAgICAgaWYgKGFkZFJvdXRlQ2Fs bGJhY2spIHsgYWRkUm91dGVDYWxsYmFjayh0aGlzLCByb3V0ZSk7IH0KICAg ICAgICBlbHNlIHsgdGhpcy5hZGQocm91dGUpOyB9CiAgICAgIH0sIHRoaXMp OwogICAgfTsKICB9KTsKCn0pKCk7CgoKCihmdW5jdGlvbigpIHsKZGVmaW5l KCJyb3V0ZXIvaGFuZGxlci1pbmZvIiwgCiAgWyIuL3V0aWxzIiwicnN2cCIs ImV4cG9ydHMiXSwKICBmdW5jdGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZGVw ZW5kZW5jeTJfXywgX19leHBvcnRzX18pIHsKICAgICJ1c2Ugc3RyaWN0IjsK ICAgIHZhciBiaW5kID0gX19kZXBlbmRlbmN5MV9fLmJpbmQ7CiAgICB2YXIg bWVyZ2UgPSBfX2RlcGVuZGVuY3kxX18ubWVyZ2U7CiAgICB2YXIgb0NyZWF0 ZSA9IF9fZGVwZW5kZW5jeTFfXy5vQ3JlYXRlOwogICAgdmFyIHNlcmlhbGl6 ZSA9IF9fZGVwZW5kZW5jeTFfXy5zZXJpYWxpemU7CiAgICB2YXIgcHJvbWlz ZUxhYmVsID0gX19kZXBlbmRlbmN5MV9fLnByb21pc2VMYWJlbDsKICAgIHZh ciByZXNvbHZlID0gX19kZXBlbmRlbmN5Ml9fLnJlc29sdmU7CgogICAgZnVu Y3Rpb24gSGFuZGxlckluZm8ocHJvcHMpIHsKICAgICAgaWYgKHByb3BzKSB7 CiAgICAgICAgbWVyZ2UodGhpcywgcHJvcHMpOwogICAgICB9CiAgICB9Cgog ICAgSGFuZGxlckluZm8ucHJvdG90eXBlID0gewogICAgICBuYW1lOiBudWxs LAogICAgICBoYW5kbGVyOiBudWxsLAogICAgICBwYXJhbXM6IG51bGwsCiAg ICAgIGNvbnRleHQ6IG51bGwsCgogICAgICBsb2c6IGZ1bmN0aW9uKHBheWxv YWQsIG1lc3NhZ2UpIHsKICAgICAgICBpZiAocGF5bG9hZC5sb2cpIHsKICAg ICAgICAgIHBheWxvYWQubG9nKHRoaXMubmFtZSArICc6ICcgKyBtZXNzYWdl KTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICBwcm9taXNlTGFiZWw6IGZ1 bmN0aW9uKGxhYmVsKSB7CiAgICAgICAgcmV0dXJuIHByb21pc2VMYWJlbCgi JyIgKyB0aGlzLm5hbWUgKyAiJyAiICsgbGFiZWwpOwogICAgICB9LAoKICAg ICAgcmVzb2x2ZTogZnVuY3Rpb24oYXN5bmMsIHNob3VsZENvbnRpbnVlLCBw YXlsb2FkKSB7CiAgICAgICAgdmFyIGNoZWNrRm9yQWJvcnQgID0gYmluZCh0 aGlzLmNoZWNrRm9yQWJvcnQsICAgICAgdGhpcywgc2hvdWxkQ29udGludWUp LAogICAgICAgICAgICBiZWZvcmVNb2RlbCAgICA9IGJpbmQodGhpcy5ydW5C ZWZvcmVNb2RlbEhvb2ssIHRoaXMsIGFzeW5jLCBwYXlsb2FkKSwKICAgICAg ICAgICAgbW9kZWwgICAgICAgICAgPSBiaW5kKHRoaXMuZ2V0TW9kZWwsICAg ICAgICAgICB0aGlzLCBhc3luYywgcGF5bG9hZCksCiAgICAgICAgICAgIGFm dGVyTW9kZWwgICAgID0gYmluZCh0aGlzLnJ1bkFmdGVyTW9kZWxIb29rLCAg dGhpcywgYXN5bmMsIHBheWxvYWQpLAogICAgICAgICAgICBiZWNvbWVSZXNv bHZlZCA9IGJpbmQodGhpcy5iZWNvbWVSZXNvbHZlZCwgICAgIHRoaXMsIHBh eWxvYWQpOwoKICAgICAgICByZXR1cm4gcmVzb2x2ZSh1bmRlZmluZWQsIHRo aXMucHJvbWlzZUxhYmVsKCJTdGFydCBoYW5kbGVyIikpCiAgICAgICAgICAg ICAgIC50aGVuKGNoZWNrRm9yQWJvcnQsIG51bGwsIHRoaXMucHJvbWlzZUxh YmVsKCJDaGVjayBmb3IgYWJvcnQiKSkKICAgICAgICAgICAgICAgLnRoZW4o YmVmb3JlTW9kZWwsIG51bGwsIHRoaXMucHJvbWlzZUxhYmVsKCJCZWZvcmUg bW9kZWwiKSkKICAgICAgICAgICAgICAgLnRoZW4oY2hlY2tGb3JBYm9ydCwg bnVsbCwgdGhpcy5wcm9taXNlTGFiZWwoIkNoZWNrIGlmIGFib3J0ZWQgZHVy aW5nICdiZWZvcmVNb2RlbCcgaG9vayIpKQogICAgICAgICAgICAgICAudGhl bihtb2RlbCwgbnVsbCwgdGhpcy5wcm9taXNlTGFiZWwoIk1vZGVsIikpCiAg ICAgICAgICAgICAgIC50aGVuKGNoZWNrRm9yQWJvcnQsIG51bGwsIHRoaXMu cHJvbWlzZUxhYmVsKCJDaGVjayBpZiBhYm9ydGVkIGluICdtb2RlbCcgaG9v ayIpKQogICAgICAgICAgICAgICAudGhlbihhZnRlck1vZGVsLCBudWxsLCB0 aGlzLnByb21pc2VMYWJlbCgiQWZ0ZXIgbW9kZWwiKSkKICAgICAgICAgICAg ICAgLnRoZW4oY2hlY2tGb3JBYm9ydCwgbnVsbCwgdGhpcy5wcm9taXNlTGFi ZWwoIkNoZWNrIGlmIGFib3J0ZWQgaW4gJ2FmdGVyTW9kZWwnIGhvb2siKSkK ICAgICAgICAgICAgICAgLnRoZW4oYmVjb21lUmVzb2x2ZWQsIG51bGwsIHRo aXMucHJvbWlzZUxhYmVsKCJCZWNvbWUgcmVzb2x2ZWQiKSk7CiAgICAgIH0s CgogICAgICBydW5CZWZvcmVNb2RlbEhvb2s6IGZ1bmN0aW9uKGFzeW5jLCBw YXlsb2FkKSB7CiAgICAgICAgaWYgKHBheWxvYWQudHJpZ2dlcikgewogICAg ICAgICAgcGF5bG9hZC50cmlnZ2VyKHRydWUsICd3aWxsUmVzb2x2ZU1vZGVs JywgcGF5bG9hZCwgdGhpcy5oYW5kbGVyKTsKICAgICAgICB9CiAgICAgICAg cmV0dXJuIHRoaXMucnVuU2hhcmVkTW9kZWxIb29rKGFzeW5jLCBwYXlsb2Fk LCAnYmVmb3JlTW9kZWwnLCBbXSk7CiAgICAgIH0sCgogICAgICBydW5BZnRl ck1vZGVsSG9vazogZnVuY3Rpb24oYXN5bmMsIHBheWxvYWQsIHJlc29sdmVk TW9kZWwpIHsKICAgICAgICAvLyBTdGFzaCB0aGUgcmVzb2x2ZWQgbW9kZWwg b24gdGhlIHBheWxvYWQuCiAgICAgICAgLy8gVGhpcyBtYWtlcyBpdCBwb3Nz aWJsZSBmb3IgdXNlcnMgdG8gc3dhcCBvdXQKICAgICAgICAvLyB0aGUgcmVz b2x2ZWQgbW9kZWwgaW4gYWZ0ZXJNb2RlbC4KICAgICAgICB2YXIgbmFtZSA9 IHRoaXMubmFtZTsKICAgICAgICB0aGlzLnN0YXNoUmVzb2x2ZWRNb2RlbChw YXlsb2FkLCByZXNvbHZlZE1vZGVsKTsKCiAgICAgICAgcmV0dXJuIHRoaXMu cnVuU2hhcmVkTW9kZWxIb29rKGFzeW5jLCBwYXlsb2FkLCAnYWZ0ZXJNb2Rl bCcsIFtyZXNvbHZlZE1vZGVsXSkKICAgICAgICAgICAgICAgICAgIC50aGVu KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUg dGhlIGZ1bGZpbGxlZCB2YWx1ZSByZXR1cm5lZCBmcm9tIGFmdGVyTW9kZWwu CiAgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgdmFsdWUgc3Rh c2hlZCBpbiByZXNvbHZlZE1vZGVscywgd2hpY2gKICAgICAgICAgICAgICAg ICAgICAgLy8gbWlnaHQgaGF2ZSBiZWVuIHN3YXBwZWQgb3V0IGluIGFmdGVy TW9kZWwuCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXlsb2FkLnJl c29sdmVkTW9kZWxzW25hbWVdOwogICAgICAgICAgICAgICAgICAgfSwgbnVs bCwgdGhpcy5wcm9taXNlTGFiZWwoIklnbm9yZSBmdWxmaWxsbWVudCB2YWx1 ZSBhbmQgcmV0dXJuIG1vZGVsIHZhbHVlIikpOwogICAgICB9LAoKICAgICAg cnVuU2hhcmVkTW9kZWxIb29rOiBmdW5jdGlvbihhc3luYywgcGF5bG9hZCwg aG9va05hbWUsIGFyZ3MpIHsKICAgICAgICB0aGlzLmxvZyhwYXlsb2FkLCAi Y2FsbGluZyAiICsgaG9va05hbWUgKyAiIGhvb2siKTsKCiAgICAgICAgaWYg KHRoaXMucXVlcnlQYXJhbXMpIHsKICAgICAgICAgIGFyZ3MucHVzaCh0aGlz LnF1ZXJ5UGFyYW1zKTsKICAgICAgICB9CiAgICAgICAgYXJncy5wdXNoKHBh eWxvYWQpOwoKICAgICAgICB2YXIgaGFuZGxlciA9IHRoaXMuaGFuZGxlcjsK ICAgICAgICByZXR1cm4gYXN5bmMoZnVuY3Rpb24oKSB7CiAgICAgICAgICBy ZXR1cm4gaGFuZGxlcltob29rTmFtZV0gJiYgaGFuZGxlcltob29rTmFtZV0u YXBwbHkoaGFuZGxlciwgYXJncyk7CiAgICAgICAgfSwgdGhpcy5wcm9taXNl TGFiZWwoIkhhbmRsZSAiICsgaG9va05hbWUpKTsKICAgICAgfSwKCiAgICAg IGdldE1vZGVsOiBmdW5jdGlvbihwYXlsb2FkKSB7CiAgICAgICAgdGhyb3cg bmV3IEVycm9yKCJUaGlzIHNob3VsZCBiZSBvdmVycmlkZGVuIGJ5IGEgc3Vi Y2xhc3Mgb2YgSGFuZGxlckluZm8iKTsKICAgICAgfSwKCiAgICAgIGNoZWNr Rm9yQWJvcnQ6IGZ1bmN0aW9uKHNob3VsZENvbnRpbnVlLCBwcm9taXNlVmFs dWUpIHsKICAgICAgICByZXR1cm4gcmVzb2x2ZShzaG91bGRDb250aW51ZSgp LCB0aGlzLnByb21pc2VMYWJlbCgiQ2hlY2sgZm9yIGFib3J0IikpLnRoZW4o ZnVuY3Rpb24oKSB7CiAgICAgICAgICAvLyBXZSBkb24ndCBjYXJlIGFib3V0 IHNob3VsZENvbnRpbnVlJ3MgcmVzb2x2ZSB2YWx1ZTsKICAgICAgICAgIC8v IHBhc3MgYWxvbmcgdGhlIG9yaWdpbmFsIHZhbHVlIHBhc3NlZCB0byB0aGlz IGZuLgogICAgICAgICAgcmV0dXJuIHByb21pc2VWYWx1ZTsKICAgICAgICB9 LCBudWxsLCB0aGlzLnByb21pc2VMYWJlbCgiSWdub3JlIGZ1bGZpbGxtZW50 IHZhbHVlIGFuZCBjb250aW51ZSIpKTsKICAgICAgfSwKCiAgICAgIHN0YXNo UmVzb2x2ZWRNb2RlbDogZnVuY3Rpb24ocGF5bG9hZCwgcmVzb2x2ZWRNb2Rl bCkgewogICAgICAgIHBheWxvYWQucmVzb2x2ZWRNb2RlbHMgPSBwYXlsb2Fk LnJlc29sdmVkTW9kZWxzIHx8IHt9OwogICAgICAgIHBheWxvYWQucmVzb2x2 ZWRNb2RlbHNbdGhpcy5uYW1lXSA9IHJlc29sdmVkTW9kZWw7CiAgICAgIH0s CgogICAgICBiZWNvbWVSZXNvbHZlZDogZnVuY3Rpb24ocGF5bG9hZCwgcmVz b2x2ZWRDb250ZXh0KSB7CiAgICAgICAgdmFyIHBhcmFtcyA9IHRoaXMucGFy YW1zIHx8IHNlcmlhbGl6ZSh0aGlzLmhhbmRsZXIsIHJlc29sdmVkQ29udGV4 dCwgdGhpcy5uYW1lcyk7CgogICAgICAgIGlmIChwYXlsb2FkKSB7CiAgICAg ICAgICB0aGlzLnN0YXNoUmVzb2x2ZWRNb2RlbChwYXlsb2FkLCByZXNvbHZl ZENvbnRleHQpOwogICAgICAgICAgcGF5bG9hZC5wYXJhbXMgPSBwYXlsb2Fk LnBhcmFtcyB8fCB7fTsKICAgICAgICAgIHBheWxvYWQucGFyYW1zW3RoaXMu bmFtZV0gPSBwYXJhbXM7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3 IFJlc29sdmVkSGFuZGxlckluZm8oewogICAgICAgICAgY29udGV4dDogcmVz b2x2ZWRDb250ZXh0LAogICAgICAgICAgbmFtZTogdGhpcy5uYW1lLAogICAg ICAgICAgaGFuZGxlcjogdGhpcy5oYW5kbGVyLAogICAgICAgICAgcGFyYW1z OiBwYXJhbXMKICAgICAgICB9KTsKICAgICAgfSwKCiAgICAgIHNob3VsZFN1 cGVyY2VkZTogZnVuY3Rpb24ob3RoZXIpIHsKICAgICAgICAvLyBQcmVmZXIg dGhpcyBuZXdlciBoYW5kbGVySW5mbyBvdmVyIGBvdGhlcmAgaWY6CiAgICAg ICAgLy8gMSkgVGhlIG90aGVyIG9uZSBkb2Vzbid0IGV4aXN0CiAgICAgICAg Ly8gMikgVGhlIG5hbWVzIGRvbid0IG1hdGNoCiAgICAgICAgLy8gMykgVGhp cyBoYW5kbGVyIGhhcyBhIGNvbnRleHQgdGhhdCBkb2Vzbid0IG1hdGNoCiAg ICAgICAgLy8gICAgdGhlIG90aGVyIG9uZSAob3IgdGhlIG90aGVyIG9uZSBk b2Vzbid0IGhhdmUgb25lKS4KICAgICAgICAvLyA0KSBUaGlzIGhhbmRsZXIg aGFzIHBhcmFtZXRlcnMgdGhhdCBkb24ndCBtYXRjaCB0aGUgb3RoZXIuCiAg ICAgICAgaWYgKCFvdGhlcikgeyByZXR1cm4gdHJ1ZTsgfQoKICAgICAgICB2 YXIgY29udGV4dHNNYXRjaCA9IChvdGhlci5jb250ZXh0ID09PSB0aGlzLmNv bnRleHQpOwogICAgICAgIHJldHVybiBvdGhlci5uYW1lICE9PSB0aGlzLm5h bWUgfHwKICAgICAgICAgICAgICAgKHRoaXMuaGFzT3duUHJvcGVydHkoJ2Nv bnRleHQnKSAmJiAhY29udGV4dHNNYXRjaCkgfHwKICAgICAgICAgICAgICAg KHRoaXMuaGFzT3duUHJvcGVydHkoJ3BhcmFtcycpICYmICFwYXJhbXNNYXRj aCh0aGlzLnBhcmFtcywgb3RoZXIucGFyYW1zKSk7CiAgICAgIH0KICAgIH07 CgogICAgZnVuY3Rpb24gUmVzb2x2ZWRIYW5kbGVySW5mbyhwcm9wcykgewog ICAgICBIYW5kbGVySW5mby5jYWxsKHRoaXMsIHByb3BzKTsKICAgIH0KCiAg ICBSZXNvbHZlZEhhbmRsZXJJbmZvLnByb3RvdHlwZSA9IG9DcmVhdGUoSGFu ZGxlckluZm8ucHJvdG90eXBlKTsKICAgIFJlc29sdmVkSGFuZGxlckluZm8u cHJvdG90eXBlLnJlc29sdmUgPSBmdW5jdGlvbihhc3luYywgc2hvdWxkQ29u dGludWUsIHBheWxvYWQpIHsKICAgICAgLy8gQSBSZXNvbHZlZEhhbmRsZXJJ bmZvIGp1c3QgcmVzb2x2ZWQgd2l0aCBpdHNlbGYuCiAgICAgIGlmIChwYXls b2FkICYmIHBheWxvYWQucmVzb2x2ZWRNb2RlbHMpIHsKICAgICAgICBwYXls b2FkLnJlc29sdmVkTW9kZWxzW3RoaXMubmFtZV0gPSB0aGlzLmNvbnRleHQ7 CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc29sdmUodGhpcywgdGhpcy5wcm9t aXNlTGFiZWwoIlJlc29sdmUiKSk7CiAgICB9OwoKICAgIC8vIFRoZXNlIGFy ZSBnZW5lcmF0ZWQgYnkgVVJMIHRyYW5zaXRpb25zIGFuZAogICAgLy8gbmFt ZWQgdHJhbnNpdGlvbnMgZm9yIG5vbi1keW5hbWljIHJvdXRlIHNlZ21lbnRz LgogICAgZnVuY3Rpb24gVW5yZXNvbHZlZEhhbmRsZXJJbmZvQnlQYXJhbShw cm9wcykgewogICAgICBIYW5kbGVySW5mby5jYWxsKHRoaXMsIHByb3BzKTsK ICAgICAgdGhpcy5wYXJhbXMgPSB0aGlzLnBhcmFtcyB8fCB7fTsKICAgIH0K CiAgICBVbnJlc29sdmVkSGFuZGxlckluZm9CeVBhcmFtLnByb3RvdHlwZSA9 IG9DcmVhdGUoSGFuZGxlckluZm8ucHJvdG90eXBlKTsKICAgIFVucmVzb2x2 ZWRIYW5kbGVySW5mb0J5UGFyYW0ucHJvdG90eXBlLmdldE1vZGVsID0gZnVu Y3Rpb24oYXN5bmMsIHBheWxvYWQpIHsKICAgICAgdmFyIGZ1bGxQYXJhbXMg PSB0aGlzLnBhcmFtczsKICAgICAgaWYgKHBheWxvYWQgJiYgcGF5bG9hZC5x dWVyeVBhcmFtcykgewogICAgICAgIGZ1bGxQYXJhbXMgPSB7fTsKICAgICAg ICBtZXJnZShmdWxsUGFyYW1zLCB0aGlzLnBhcmFtcyk7CiAgICAgICAgZnVs bFBhcmFtcy5xdWVyeVBhcmFtcyA9IHBheWxvYWQucXVlcnlQYXJhbXM7CiAg ICAgIH0KCiAgICAgIHZhciBob29rTmFtZSA9IHR5cGVvZiB0aGlzLmhhbmRs ZXIuZGVzZXJpYWxpemUgPT09ICdmdW5jdGlvbicgPwogICAgICAgICAgICAg ICAgICAgICAnZGVzZXJpYWxpemUnIDogJ21vZGVsJzsKCiAgICAgIHJldHVy biB0aGlzLnJ1blNoYXJlZE1vZGVsSG9vayhhc3luYywgcGF5bG9hZCwgaG9v a05hbWUsIFtmdWxsUGFyYW1zXSk7CiAgICB9OwoKCiAgICAvLyBUaGVzZSBh cmUgZ2VuZXJhdGVkIG9ubHkgZm9yIG5hbWVkIHRyYW5zaXRpb25zCiAgICAv LyB3aXRoIGR5bmFtaWMgcm91dGUgc2VnbWVudHMuCiAgICBmdW5jdGlvbiBV bnJlc29sdmVkSGFuZGxlckluZm9CeU9iamVjdChwcm9wcykgewogICAgICBI YW5kbGVySW5mby5jYWxsKHRoaXMsIHByb3BzKTsKICAgIH0KCiAgICBVbnJl c29sdmVkSGFuZGxlckluZm9CeU9iamVjdC5wcm90b3R5cGUgPSBvQ3JlYXRl KEhhbmRsZXJJbmZvLnByb3RvdHlwZSk7CiAgICBVbnJlc29sdmVkSGFuZGxl ckluZm9CeU9iamVjdC5wcm90b3R5cGUuZ2V0TW9kZWwgPSBmdW5jdGlvbihh c3luYywgcGF5bG9hZCkgewogICAgICB0aGlzLmxvZyhwYXlsb2FkLCB0aGlz Lm5hbWUgKyAiOiByZXNvbHZpbmcgcHJvdmlkZWQgbW9kZWwiKTsKICAgICAg cmV0dXJuIHJlc29sdmUodGhpcy5jb250ZXh0KTsKICAgIH07CgogICAgZnVu Y3Rpb24gcGFyYW1zTWF0Y2goYSwgYikgewogICAgICBpZiAoKCFhKSBeICgh YikpIHsKICAgICAgICAvLyBPbmx5IG9uZSBpcyBudWxsLgogICAgICAgIHJl dHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgaWYgKCFhKSB7CiAgICAgICAg Ly8gQm90aCBtdXN0IGJlIG51bGwuCiAgICAgICAgcmV0dXJuIHRydWU7CiAg ICAgIH0KCiAgICAgIC8vIE5vdGU6IHRoaXMgYXNzdW1lcyB0aGF0IGJvdGgg cGFyYW1zIGhhdmUgdGhlIHNhbWUKICAgICAgLy8gbnVtYmVyIG9mIGtleXMs IGJ1dCBzaW5jZSB3ZSdyZSBjb21wYXJpbmcgdGhlCiAgICAgIC8vIHNhbWUg aGFuZGxlcnMsIHRoZXkgc2hvdWxkLgogICAgICBmb3IgKHZhciBrIGluIGEp IHsKICAgICAgICBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrKSAmJiBhW2tdICE9 PSBiW2tdKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQog ICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIF9fZXhwb3J0 c19fLkhhbmRsZXJJbmZvID0gSGFuZGxlckluZm87CiAgICBfX2V4cG9ydHNf Xy5SZXNvbHZlZEhhbmRsZXJJbmZvID0gUmVzb2x2ZWRIYW5kbGVySW5mbzsK ICAgIF9fZXhwb3J0c19fLlVucmVzb2x2ZWRIYW5kbGVySW5mb0J5UGFyYW0g PSBVbnJlc29sdmVkSGFuZGxlckluZm9CeVBhcmFtOwogICAgX19leHBvcnRz X18uVW5yZXNvbHZlZEhhbmRsZXJJbmZvQnlPYmplY3QgPSBVbnJlc29sdmVk SGFuZGxlckluZm9CeU9iamVjdDsKICB9KTsKZGVmaW5lKCJyb3V0ZXIvcm91 dGVyIiwgCiAgWyJyb3V0ZS1yZWNvZ25pemVyIiwicnN2cCIsIi4vdXRpbHMi LCIuL3RyYW5zaXRpb24tc3RhdGUiLCIuL3RyYW5zaXRpb24iLCIuL3RyYW5z aXRpb24taW50ZW50L25hbWVkLXRyYW5zaXRpb24taW50ZW50IiwiLi90cmFu c2l0aW9uLWludGVudC91cmwtdHJhbnNpdGlvbi1pbnRlbnQiLCJleHBvcnRz Il0sCiAgZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2RlcGVuZGVuY3ky X18sIF9fZGVwZW5kZW5jeTNfXywgX19kZXBlbmRlbmN5NF9fLCBfX2RlcGVu ZGVuY3k1X18sIF9fZGVwZW5kZW5jeTZfXywgX19kZXBlbmRlbmN5N19fLCBf X2V4cG9ydHNfXykgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFJvdXRl UmVjb2duaXplciA9IF9fZGVwZW5kZW5jeTFfX1siZGVmYXVsdCJdOwogICAg dmFyIHJlc29sdmUgPSBfX2RlcGVuZGVuY3kyX18ucmVzb2x2ZTsKICAgIHZh ciByZWplY3QgPSBfX2RlcGVuZGVuY3kyX18ucmVqZWN0OwogICAgdmFyIGFz eW5jID0gX19kZXBlbmRlbmN5Ml9fLmFzeW5jOwogICAgdmFyIFByb21pc2Ug PSBfX2RlcGVuZGVuY3kyX18uUHJvbWlzZTsKICAgIHZhciB0cmlnZ2VyID0g X19kZXBlbmRlbmN5M19fLnRyaWdnZXI7CiAgICB2YXIgbG9nID0gX19kZXBl bmRlbmN5M19fLmxvZzsKICAgIHZhciBzbGljZSA9IF9fZGVwZW5kZW5jeTNf Xy5zbGljZTsKICAgIHZhciBmb3JFYWNoID0gX19kZXBlbmRlbmN5M19fLmZv ckVhY2g7CiAgICB2YXIgbWVyZ2UgPSBfX2RlcGVuZGVuY3kzX18ubWVyZ2U7 CiAgICB2YXIgc2VyaWFsaXplID0gX19kZXBlbmRlbmN5M19fLnNlcmlhbGl6 ZTsKICAgIHZhciBleHRyYWN0UXVlcnlQYXJhbXMgPSBfX2RlcGVuZGVuY3kz X18uZXh0cmFjdFF1ZXJ5UGFyYW1zOwogICAgdmFyIGdldENoYW5nZWxpc3Qg PSBfX2RlcGVuZGVuY3kzX18uZ2V0Q2hhbmdlbGlzdDsKICAgIHZhciBwcm9t aXNlTGFiZWwgPSBfX2RlcGVuZGVuY3kzX18ucHJvbWlzZUxhYmVsOwogICAg dmFyIFRyYW5zaXRpb25TdGF0ZSA9IF9fZGVwZW5kZW5jeTRfXy5UcmFuc2l0 aW9uU3RhdGU7CiAgICB2YXIgbG9nQWJvcnQgPSBfX2RlcGVuZGVuY3k1X18u bG9nQWJvcnQ7CiAgICB2YXIgVHJhbnNpdGlvbiA9IF9fZGVwZW5kZW5jeTVf Xy5UcmFuc2l0aW9uOwogICAgdmFyIFRyYW5zaXRpb25BYm9ydGVkID0gX19k ZXBlbmRlbmN5NV9fLlRyYW5zaXRpb25BYm9ydGVkOwogICAgdmFyIE5hbWVk VHJhbnNpdGlvbkludGVudCA9IF9fZGVwZW5kZW5jeTZfXy5OYW1lZFRyYW5z aXRpb25JbnRlbnQ7CiAgICB2YXIgVVJMVHJhbnNpdGlvbkludGVudCA9IF9f ZGVwZW5kZW5jeTdfXy5VUkxUcmFuc2l0aW9uSW50ZW50OwoKICAgIHZhciBw b3AgPSBBcnJheS5wcm90b3R5cGUucG9wOwoKICAgIGZ1bmN0aW9uIFJvdXRl cigpIHsKICAgICAgdGhpcy5yZWNvZ25pemVyID0gbmV3IFJvdXRlUmVjb2du aXplcigpOwogICAgICB0aGlzLnJlc2V0KCk7CiAgICB9CgogICAgUm91dGVy LnByb3RvdHlwZSA9IHsKCiAgICAgIC8qKgogICAgICAgIFRoZSBtYWluIGVu dHJ5IHBvaW50IGludG8gdGhlIHJvdXRlci4gVGhlIEFQSSBpcyBlc3NlbnRp YWxseQogICAgICAgIHRoZSBzYW1lIGFzIHRoZSBgbWFwYCBtZXRob2QgaW4g YHJvdXRlLXJlY29nbml6ZXJgLgoKICAgICAgICBUaGlzIG1ldGhvZCBleHRy YWN0cyB0aGUgU3RyaW5nIGhhbmRsZXIgYXQgdGhlIGxhc3QgYC50bygpYAog ICAgICAgIGNhbGwgYW5kIHVzZXMgaXQgYXMgdGhlIG5hbWUgb2YgdGhlIHdo b2xlIHJvdXRlLgoKICAgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFj awogICAgICAqLwogICAgICBtYXA6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAg ICAgICAgdGhpcy5yZWNvZ25pemVyLmRlbGVnYXRlID0gdGhpcy5kZWxlZ2F0 ZTsKCiAgICAgICAgdGhpcy5yZWNvZ25pemVyLm1hcChjYWxsYmFjaywgZnVu Y3Rpb24ocmVjb2duaXplciwgcm91dGVzKSB7CiAgICAgICAgICBmb3IgKHZh ciBpID0gcm91dGVzLmxlbmd0aCAtIDEsIHByb2NlZWQgPSB0cnVlOyBpID49 IDAgJiYgcHJvY2VlZDsgLS1pKSB7CiAgICAgICAgICAgIHZhciByb3V0ZSA9 IHJvdXRlc1tpXTsKICAgICAgICAgICAgcmVjb2duaXplci5hZGQocm91dGVz LCB7IGFzOiByb3V0ZS5oYW5kbGVyIH0pOwogICAgICAgICAgICBwcm9jZWVk ID0gcm91dGUucGF0aCA9PT0gJy8nIHx8IHJvdXRlLnBhdGggPT09ICcnIHx8 IHJvdXRlLmhhbmRsZXIuc2xpY2UoLTYpID09PSAnLmluZGV4JzsKICAgICAg ICAgIH0KICAgICAgICB9KTsKICAgICAgfSwKCiAgICAgIGhhc1JvdXRlOiBm dW5jdGlvbihyb3V0ZSkgewogICAgICAgIHJldHVybiB0aGlzLnJlY29nbml6 ZXIuaGFzUm91dGUocm91dGUpOwogICAgICB9LAoKICAgICAgLy8gTk9URTog dGhpcyBkb2Vzbid0IHJlYWxseSBiZWxvbmcgaGVyZSwgYnV0IGhlcmUKICAg ICAgLy8gaXQgc2hhbGwgcmVtYWluIHVudGlsIG91ciBFUzYgdHJhbnNwaWxl ciBjYW4KICAgICAgLy8gaGFuZGxlIGN5Y2xpY2FsIGRlcHMuCiAgICAgIHRy YW5zaXRpb25CeUludGVudDogZnVuY3Rpb24oaW50ZW50LCBpc0ludGVybWVk aWF0ZSkgewoKICAgICAgICB2YXIgd2FzVHJhbnNpdGlvbmluZyA9ICEhdGhp cy5hY3RpdmVUcmFuc2l0aW9uOwogICAgICAgIHZhciBvbGRTdGF0ZSA9IHdh c1RyYW5zaXRpb25pbmcgPyB0aGlzLmFjdGl2ZVRyYW5zaXRpb24uc3RhdGUg OiB0aGlzLnN0YXRlOwogICAgICAgIHZhciBuZXdUcmFuc2l0aW9uOwogICAg ICAgIHZhciByb3V0ZXIgPSB0aGlzOwoKICAgICAgICB0cnkgewogICAgICAg ICAgdmFyIG5ld1N0YXRlID0gaW50ZW50LmFwcGx5VG9TdGF0ZShvbGRTdGF0 ZSwgdGhpcy5yZWNvZ25pemVyLCB0aGlzLmdldEhhbmRsZXIsIGlzSW50ZXJt ZWRpYXRlKTsKCiAgICAgICAgICBpZiAoaGFuZGxlckluZm9zRXF1YWwobmV3 U3RhdGUuaGFuZGxlckluZm9zLCBvbGRTdGF0ZS5oYW5kbGVySW5mb3MpKSB7 CgogICAgICAgICAgICAvLyBUaGlzIGlzIGEgbm8tb3AgdHJhbnNpdGlvbi4g U2VlIGlmIHF1ZXJ5IHBhcmFtcyBjaGFuZ2VkLgogICAgICAgICAgICB2YXIg cXVlcnlQYXJhbUNoYW5nZWxpc3QgPSBnZXRDaGFuZ2VsaXN0KG9sZFN0YXRl LnF1ZXJ5UGFyYW1zLCBuZXdTdGF0ZS5xdWVyeVBhcmFtcyk7CiAgICAgICAg ICAgIGlmIChxdWVyeVBhcmFtQ2hhbmdlbGlzdCkgewoKICAgICAgICAgICAg ICAvLyBUaGlzIGlzIGEgbGl0dGxlIGhhY2t5IGJ1dCB3ZSBuZWVkIHNvbWUg d2F5IG9mIHN0b3JpbmcKICAgICAgICAgICAgICAvLyBjaGFuZ2VkIHF1ZXJ5 IHBhcmFtcyBnaXZlbiB0aGF0IG5vIGFjdGl2ZVRyYW5zaXRpb24KICAgICAg ICAgICAgICAvLyBpcyBndWFyYW50ZWVkIHRvIGhhdmUgb2NjdXJyZWQuCiAg ICAgICAgICAgICAgdGhpcy5fY2hhbmdlZFF1ZXJ5UGFyYW1zID0gcXVlcnlQ YXJhbUNoYW5nZWxpc3QuY2hhbmdlZDsKICAgICAgICAgICAgICB0cmlnZ2Vy KHRoaXMsIG5ld1N0YXRlLmhhbmRsZXJJbmZvcywgdHJ1ZSwgWydxdWVyeVBh cmFtc0RpZENoYW5nZScsIHF1ZXJ5UGFyYW1DaGFuZ2VsaXN0LmNoYW5nZWQs IHF1ZXJ5UGFyYW1DaGFuZ2VsaXN0LmFsbCwgcXVlcnlQYXJhbUNoYW5nZWxp c3QucmVtb3ZlZF0pOwogICAgICAgICAgICAgIHRoaXMuX2NoYW5nZWRRdWVy eVBhcmFtcyA9IG51bGw7CgogICAgICAgICAgICAgIGlmICghd2FzVHJhbnNp dGlvbmluZyAmJiB0aGlzLmFjdGl2ZVRyYW5zaXRpb24pIHsKICAgICAgICAg ICAgICAgIC8vIE9uZSBvZiB0aGUgaGFuZGxlcnMgaW4gcXVlcnlQYXJhbXNE aWRDaGFuZ2UKICAgICAgICAgICAgICAgIC8vIGNhdXNlZCBhIHRyYW5zaXRp b24uIEp1c3QgcmV0dXJuIHRoYXQgdHJhbnNpdGlvbi4KICAgICAgICAgICAg ICAgIHJldHVybiB0aGlzLmFjdGl2ZVRyYW5zaXRpb247CiAgICAgICAgICAg ICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFJ1bm5pbmcgcXVlcnlQ YXJhbXNEaWRDaGFuZ2UgZGlkbid0IGNoYW5nZSBhbnl0aGluZy4KICAgICAg ICAgICAgICAgIC8vIEp1c3QgdXBkYXRlIHF1ZXJ5IHBhcmFtcyBhbmQgYmUg b24gb3VyIHdheS4KICAgICAgICAgICAgICAgIG9sZFN0YXRlLnF1ZXJ5UGFy YW1zID0gZmluYWxpemVRdWVyeVBhcmFtQ2hhbmdlKHRoaXMsIG5ld1N0YXRl LmhhbmRsZXJJbmZvcywgbmV3U3RhdGUucXVlcnlQYXJhbXMpOwoKICAgICAg ICAgICAgICAgIC8vIFdlIGhhdmUgdG8gcmV0dXJuIGEgbm9vcCB0cmFuc2l0 aW9uIHRoYXQgd2lsbAogICAgICAgICAgICAgICAgLy8gcGVyZm9ybSBhIFVS TCB1cGRhdGUgYXQgdGhlIGVuZC4gVGhpcyBnaXZlcwogICAgICAgICAgICAg ICAgLy8gdGhlIHVzZXIgdGhlIGFiaWxpdHkgdG8gc2V0IHRoZSB1cmwgdXBk YXRlCiAgICAgICAgICAgICAgICAvLyBtZXRob2QgKGRlZmF1bHQgaXMgcmVw bGFjZVN0YXRlKS4KICAgICAgICAgICAgICAgIG5ld1RyYW5zaXRpb24gPSBu ZXcgVHJhbnNpdGlvbih0aGlzKTsKICAgICAgICAgICAgICAgIG5ld1RyYW5z aXRpb24udXJsTWV0aG9kID0gJ3JlcGxhY2UnOwogICAgICAgICAgICAgICAg bmV3VHJhbnNpdGlvbi5wcm9taXNlID0gbmV3VHJhbnNpdGlvbi5wcm9taXNl LnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgIHVw ZGF0ZVVSTChuZXdUcmFuc2l0aW9uLCBvbGRTdGF0ZSwgdHJ1ZSk7CiAgICAg ICAgICAgICAgICAgIGlmIChyb3V0ZXIuZGlkVHJhbnNpdGlvbikgewogICAg ICAgICAgICAgICAgICAgIHJvdXRlci5kaWRUcmFuc2l0aW9uKHJvdXRlci5j dXJyZW50SGFuZGxlckluZm9zKTsKICAgICAgICAgICAgICAgICAgfQogICAg ICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAg fSwgbnVsbCwgcHJvbWlzZUxhYmVsKCJUcmFuc2l0aW9uIGNvbXBsZXRlIikp OwogICAgICAgICAgICAgICAgcmV0dXJuIG5ld1RyYW5zaXRpb247CiAgICAg ICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBOby1v cC4gTm8gbmVlZCB0byBjcmVhdGUgYSBuZXcgdHJhbnNpdGlvbi4KICAgICAg ICAgICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHRoaXMpOwogICAgICAgICAg fQoKICAgICAgICAgIGlmIChpc0ludGVybWVkaWF0ZSkgewogICAgICAgICAg ICBzZXR1cENvbnRleHRzKHRoaXMsIG5ld1N0YXRlKTsKICAgICAgICAgICAg cmV0dXJuOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIENyZWF0ZSBhIG5l dyB0cmFuc2l0aW9uIHRvIHRoZSBkZXN0aW5hdGlvbiByb3V0ZS4KICAgICAg ICAgIG5ld1RyYW5zaXRpb24gPSBuZXcgVHJhbnNpdGlvbih0aGlzLCBpbnRl bnQsIG5ld1N0YXRlKTsKCiAgICAgICAgICAvLyBBYm9ydCBhbmQgdXN1cnAg YW55IHByZXZpb3VzbHkgYWN0aXZlIHRyYW5zaXRpb24uCiAgICAgICAgICBp ZiAodGhpcy5hY3RpdmVUcmFuc2l0aW9uKSB7CiAgICAgICAgICAgIHRoaXMu YWN0aXZlVHJhbnNpdGlvbi5hYm9ydCgpOwogICAgICAgICAgfQogICAgICAg ICAgdGhpcy5hY3RpdmVUcmFuc2l0aW9uID0gbmV3VHJhbnNpdGlvbjsKCiAg ICAgICAgICAvLyBUcmFuc2l0aW9uIHByb21pc2VzIGJ5IGRlZmF1bHQgcmVz b2x2ZSB3aXRoIHJlc29sdmVkIHN0YXRlLgogICAgICAgICAgLy8gRm9yIG91 ciBwdXJwb3Nlcywgc3dhcCBvdXQgdGhlIHByb21pc2UgdG8gcmVzb2x2ZQog ICAgICAgICAgLy8gYWZ0ZXIgdGhlIHRyYW5zaXRpb24gaGFzIGJlZW4gZmlu YWxpemVkLgogICAgICAgICAgbmV3VHJhbnNpdGlvbi5wcm9taXNlID0gbmV3 VHJhbnNpdGlvbi5wcm9taXNlLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CiAg ICAgICAgICAgIHJldHVybiByb3V0ZXIuYXN5bmMoZnVuY3Rpb24oKSB7CiAg ICAgICAgICAgICAgcmV0dXJuIGZpbmFsaXplVHJhbnNpdGlvbihuZXdUcmFu c2l0aW9uLCByZXN1bHQuc3RhdGUpOwogICAgICAgICAgICB9LCAiRmluYWxp emUgdHJhbnNpdGlvbiIpOwogICAgICAgICAgfSwgbnVsbCwgcHJvbWlzZUxh YmVsKCJTZXR0bGUgdHJhbnNpdGlvbiBwcm9taXNlIHdoZW4gdHJhbnNpdGlv biBpcyBmaW5hbGl6ZWQiKSk7CgogICAgICAgICAgaWYgKCF3YXNUcmFuc2l0 aW9uaW5nKSB7CiAgICAgICAgICAgIHRyaWdnZXIodGhpcywgdGhpcy5zdGF0 ZS5oYW5kbGVySW5mb3MsIHRydWUsIFsnd2lsbFRyYW5zaXRpb24nLCBuZXdU cmFuc2l0aW9uXSk7CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIG5l d1RyYW5zaXRpb247CiAgICAgICAgfSBjYXRjaChlKSB7CiAgICAgICAgICBy ZXR1cm4gbmV3IFRyYW5zaXRpb24odGhpcywgaW50ZW50LCBudWxsLCBlKTsK ICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICBDbGVhcnMg dGhlIGN1cnJlbnQgYW5kIHRhcmdldCByb3V0ZSBoYW5kbGVycyBhbmQgdHJp Z2dlcnMgZXhpdAogICAgICAgIG9uIGVhY2ggb2YgdGhlbSBzdGFydGluZyBh dCB0aGUgbGVhZiBhbmQgdHJhdmVyc2luZyB1cCB0aHJvdWdoCiAgICAgICAg aXRzIGFuY2VzdG9ycy4KICAgICAgKi8KICAgICAgcmVzZXQ6IGZ1bmN0aW9u KCkgewogICAgICAgIGlmICh0aGlzLnN0YXRlKSB7CiAgICAgICAgICBmb3JF YWNoKHRoaXMuc3RhdGUuaGFuZGxlckluZm9zLCBmdW5jdGlvbihoYW5kbGVy SW5mbykgewogICAgICAgICAgICB2YXIgaGFuZGxlciA9IGhhbmRsZXJJbmZv LmhhbmRsZXI7CiAgICAgICAgICAgIGlmIChoYW5kbGVyLmV4aXQpIHsKICAg ICAgICAgICAgICBoYW5kbGVyLmV4aXQoKTsKICAgICAgICAgICAgfQogICAg ICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICB0aGlzLnN0YXRlID0gbmV3 IFRyYW5zaXRpb25TdGF0ZSgpOwogICAgICAgIHRoaXMuY3VycmVudEhhbmRs ZXJJbmZvcyA9IG51bGw7CiAgICAgIH0sCgogICAgICBhY3RpdmVUcmFuc2l0 aW9uOiBudWxsLAoKICAgICAgLyoqCiAgICAgICAgdmFyIGhhbmRsZXIgPSBo YW5kbGVySW5mby5oYW5kbGVyOwogICAgICAgIFRoZSBlbnRyeSBwb2ludCBm b3IgaGFuZGxpbmcgYSBjaGFuZ2UgdG8gdGhlIFVSTCAodXN1YWxseQogICAg ICAgIHZpYSB0aGUgYmFjayBhbmQgZm9yd2FyZCBidXR0b24pLgoKICAgICAg ICBSZXR1cm5zIGFuIEFycmF5IG9mIGhhbmRsZXJzIGFuZCB0aGUgcGFyYW1l dGVycyBhc3NvY2lhdGVkCiAgICAgICAgd2l0aCB0aG9zZSBwYXJhbWV0ZXJz LgoKICAgICAgICBAcGFyYW0ge1N0cmluZ30gdXJsIGEgVVJMIHRvIHByb2Nl c3MKCiAgICAgICAgQHJldHVybiB7QXJyYXl9IGFuIEFycmF5IG9mIGBbaGFu ZGxlciwgcGFyYW1ldGVyXWAgdHVwbGVzCiAgICAgICovCiAgICAgIGhhbmRs ZVVSTDogZnVuY3Rpb24odXJsKSB7CiAgICAgICAgLy8gUGVyZm9ybSBhIFVS TC1iYXNlZCB0cmFuc2l0aW9uLCBidXQgZG9uJ3QgY2hhbmdlCiAgICAgICAg Ly8gdGhlIFVSTCBhZnRlcndhcmQsIHNpbmNlIGl0IGFscmVhZHkgaGFwcGVu ZWQuCiAgICAgICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7 CiAgICAgICAgaWYgKHVybC5jaGFyQXQoMCkgIT09ICcvJykgeyBhcmdzWzBd ID0gJy8nICsgdXJsOyB9CgogICAgICAgIHJldHVybiBkb1RyYW5zaXRpb24o dGhpcywgYXJncykubWV0aG9kKCdyZXBsYWNlUXVlcnknKTsKICAgICAgfSwK CiAgICAgIC8qKgogICAgICAgIEhvb2sgcG9pbnQgZm9yIHVwZGF0aW5nIHRo ZSBVUkwuCgogICAgICAgIEBwYXJhbSB7U3RyaW5nfSB1cmwgYSBVUkwgdG8g dXBkYXRlIHRvCiAgICAgICovCiAgICAgIHVwZGF0ZVVSTDogZnVuY3Rpb24o KSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJ1cGRhdGVVUkwgaXMgbm90 IGltcGxlbWVudGVkIik7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICBI b29rIHBvaW50IGZvciByZXBsYWNpbmcgdGhlIGN1cnJlbnQgVVJMLCBpLmUu IHdpdGggcmVwbGFjZVN0YXRlCgogICAgICAgIEJ5IGRlZmF1bHQgdGhpcyBi ZWhhdmVzIHRoZSBzYW1lIGFzIGB1cGRhdGVVUkxgCgogICAgICAgIEBwYXJh bSB7U3RyaW5nfSB1cmwgYSBVUkwgdG8gdXBkYXRlIHRvCiAgICAgICovCiAg ICAgIHJlcGxhY2VVUkw6IGZ1bmN0aW9uKHVybCkgewogICAgICAgIHRoaXMu dXBkYXRlVVJMKHVybCk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICBU cmFuc2l0aW9uIGludG8gdGhlIHNwZWNpZmllZCBuYW1lZCByb3V0ZS4KCiAg ICAgICAgSWYgbmVjZXNzYXJ5LCB0cmlnZ2VyIHRoZSBleGl0IGNhbGxiYWNr IG9uIGFueSBoYW5kbGVycwogICAgICAgIHRoYXQgYXJlIG5vIGxvbmdlciBy ZXByZXNlbnRlZCBieSB0aGUgdGFyZ2V0IHJvdXRlLgoKICAgICAgICBAcGFy YW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcm91dGUKICAgICAg Ki8KICAgICAgdHJhbnNpdGlvblRvOiBmdW5jdGlvbihuYW1lKSB7CiAgICAg ICAgcmV0dXJuIGRvVHJhbnNpdGlvbih0aGlzLCBhcmd1bWVudHMpOwogICAg ICB9LAoKICAgICAgaW50ZXJtZWRpYXRlVHJhbnNpdGlvblRvOiBmdW5jdGlv bihuYW1lKSB7CiAgICAgICAgZG9UcmFuc2l0aW9uKHRoaXMsIGFyZ3VtZW50 cywgdHJ1ZSk7CiAgICAgIH0sCgogICAgICByZWZyZXNoOiBmdW5jdGlvbihw aXZvdEhhbmRsZXIpIHsKCgogICAgICAgIHZhciBzdGF0ZSA9IHRoaXMuYWN0 aXZlVHJhbnNpdGlvbiA/IHRoaXMuYWN0aXZlVHJhbnNpdGlvbi5zdGF0ZSA6 IHRoaXMuc3RhdGU7CiAgICAgICAgdmFyIGhhbmRsZXJJbmZvcyA9IHN0YXRl LmhhbmRsZXJJbmZvczsKICAgICAgICB2YXIgcGFyYW1zID0ge307CiAgICAg ICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGhhbmRsZXJJbmZvcy5sZW5ndGg7 IGkgPCBsZW47ICsraSkgewogICAgICAgICAgdmFyIGhhbmRsZXJJbmZvID0g aGFuZGxlckluZm9zW2ldOwogICAgICAgICAgcGFyYW1zW2hhbmRsZXJJbmZv Lm5hbWVdID0gaGFuZGxlckluZm8ucGFyYW1zIHx8IHt9OwogICAgICAgIH0K CiAgICAgICAgbG9nKHRoaXMsICJTdGFydGluZyBhIHJlZnJlc2ggdHJhbnNp dGlvbiIpOwogICAgICAgIHZhciBpbnRlbnQgPSBuZXcgTmFtZWRUcmFuc2l0 aW9uSW50ZW50KHsKICAgICAgICAgIG5hbWU6IGhhbmRsZXJJbmZvc1toYW5k bGVySW5mb3MubGVuZ3RoIC0gMV0ubmFtZSwKICAgICAgICAgIHBpdm90SGFu ZGxlcjogcGl2b3RIYW5kbGVyIHx8IGhhbmRsZXJJbmZvc1swXS5oYW5kbGVy LAogICAgICAgICAgY29udGV4dHM6IFtdLCAvLyBUT0RPIGNvbGxlY3QgY29u dGV4dHMuLi4/CiAgICAgICAgICBxdWVyeVBhcmFtczogdGhpcy5fY2hhbmdl ZFF1ZXJ5UGFyYW1zIHx8IHN0YXRlLnF1ZXJ5UGFyYW1zIHx8IHt9CiAgICAg ICAgfSk7CgogICAgICAgIHJldHVybiB0aGlzLnRyYW5zaXRpb25CeUludGVu dChpbnRlbnQsIGZhbHNlKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAg IElkZW50aWNhbCB0byBgdHJhbnNpdGlvblRvYCBleGNlcHQgdGhhdCB0aGUg Y3VycmVudCBVUkwgd2lsbCBiZSByZXBsYWNlZAogICAgICAgIGlmIHBvc3Np YmxlLgoKICAgICAgICBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBwcmltYXJp bHkgZm9yIHVzZSB3aXRoIGByZXBsYWNlU3RhdGVgLgoKICAgICAgICBAcGFy YW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcm91dGUKICAgICAg Ki8KICAgICAgcmVwbGFjZVdpdGg6IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAg ICByZXR1cm4gZG9UcmFuc2l0aW9uKHRoaXMsIGFyZ3VtZW50cykubWV0aG9k KCdyZXBsYWNlJyk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICBUYWtl IGEgbmFtZWQgcm91dGUgYW5kIGNvbnRleHQgb2JqZWN0cyBhbmQgZ2VuZXJh dGUgYQogICAgICAgIFVSTC4KCiAgICAgICAgQHBhcmFtIHtTdHJpbmd9IG5h bWUgdGhlIG5hbWUgb2YgdGhlIHJvdXRlIHRvIGdlbmVyYXRlCiAgICAgICAg ICBhIFVSTCBmb3IKICAgICAgICBAcGFyYW0gey4uLk9iamVjdH0gb2JqZWN0 cyBhIGxpc3Qgb2Ygb2JqZWN0cyB0byBzZXJpYWxpemUKCiAgICAgICAgQHJl dHVybiB7U3RyaW5nfSBhIFVSTAogICAgICAqLwogICAgICBnZW5lcmF0ZTog ZnVuY3Rpb24oaGFuZGxlck5hbWUpIHsKCiAgICAgICAgdmFyIHBhcnRpdGlv bmVkQXJncyA9IGV4dHJhY3RRdWVyeVBhcmFtcyhzbGljZS5jYWxsKGFyZ3Vt ZW50cywgMSkpLAogICAgICAgICAgc3VwcGxpZWRQYXJhbXMgPSBwYXJ0aXRp b25lZEFyZ3NbMF0sCiAgICAgICAgICBxdWVyeVBhcmFtcyA9IHBhcnRpdGlv bmVkQXJnc1sxXTsKCiAgICAgICAgLy8gQ29uc3RydWN0IGEgVHJhbnNpdGlv bkludGVudCB3aXRoIHRoZSBwcm92aWRlZCBwYXJhbXMKICAgICAgICAvLyBh bmQgYXBwbHkgaXQgdG8gdGhlIHByZXNlbnQgc3RhdGUgb2YgdGhlIHJvdXRl ci4KICAgICAgICB2YXIgaW50ZW50ID0gbmV3IE5hbWVkVHJhbnNpdGlvbklu dGVudCh7IG5hbWU6IGhhbmRsZXJOYW1lLCBjb250ZXh0czogc3VwcGxpZWRQ YXJhbXMgfSk7CiAgICAgICAgdmFyIHN0YXRlID0gaW50ZW50LmFwcGx5VG9T dGF0ZSh0aGlzLnN0YXRlLCB0aGlzLnJlY29nbml6ZXIsIHRoaXMuZ2V0SGFu ZGxlcik7CiAgICAgICAgdmFyIHBhcmFtcyA9IHt9OwoKICAgICAgICBmb3Ig KHZhciBpID0gMCwgbGVuID0gc3RhdGUuaGFuZGxlckluZm9zLmxlbmd0aDsg aSA8IGxlbjsgKytpKSB7CiAgICAgICAgICB2YXIgaGFuZGxlckluZm8gPSBz dGF0ZS5oYW5kbGVySW5mb3NbaV07CiAgICAgICAgICB2YXIgaGFuZGxlclBh cmFtcyA9IGhhbmRsZXJJbmZvLnBhcmFtcyB8fAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBzZXJpYWxpemUoaGFuZGxlckluZm8uaGFuZGxlciwg aGFuZGxlckluZm8uY29udGV4dCwgaGFuZGxlckluZm8ubmFtZXMpOwogICAg ICAgICAgbWVyZ2UocGFyYW1zLCBoYW5kbGVyUGFyYW1zKTsKICAgICAgICB9 CiAgICAgICAgcGFyYW1zLnF1ZXJ5UGFyYW1zID0gcXVlcnlQYXJhbXM7Cgog ICAgICAgIHJldHVybiB0aGlzLnJlY29nbml6ZXIuZ2VuZXJhdGUoaGFuZGxl ck5hbWUsIHBhcmFtcyk7CiAgICAgIH0sCgogICAgICBpc0FjdGl2ZTogZnVu Y3Rpb24oaGFuZGxlck5hbWUpIHsKCiAgICAgICAgdmFyIHBhcnRpdGlvbmVk QXJncyAgID0gZXh0cmFjdFF1ZXJ5UGFyYW1zKHNsaWNlLmNhbGwoYXJndW1l bnRzLCAxKSksCiAgICAgICAgICAgIGNvbnRleHRzICAgICAgICAgID0gcGFy dGl0aW9uZWRBcmdzWzBdLAogICAgICAgICAgICBxdWVyeVBhcmFtcyAgICAg ICA9IHBhcnRpdGlvbmVkQXJnc1sxXSwKICAgICAgICAgICAgYWN0aXZlUXVl cnlQYXJhbXMgID0gdGhpcy5zdGF0ZS5xdWVyeVBhcmFtczsKCiAgICAgICAg dmFyIHRhcmdldEhhbmRsZXJJbmZvcyA9IHRoaXMuc3RhdGUuaGFuZGxlcklu Zm9zLAogICAgICAgICAgICBmb3VuZCA9IGZhbHNlLCBuYW1lcywgb2JqZWN0 LCBoYW5kbGVySW5mbywgaGFuZGxlck9iaiwgaSwgbGVuOwoKICAgICAgICBp ZiAoIXRhcmdldEhhbmRsZXJJbmZvcy5sZW5ndGgpIHsgcmV0dXJuIGZhbHNl OyB9CgogICAgICAgIHZhciB0YXJnZXRIYW5kbGVyID0gdGFyZ2V0SGFuZGxl ckluZm9zW3RhcmdldEhhbmRsZXJJbmZvcy5sZW5ndGggLSAxXS5uYW1lOwog ICAgICAgIHZhciByZWNvZ0hhbmRsZXJzID0gdGhpcy5yZWNvZ25pemVyLmhh bmRsZXJzRm9yKHRhcmdldEhhbmRsZXIpOwoKICAgICAgICB2YXIgaW5kZXgg PSAwOwogICAgICAgIGZvciAobGVuID0gcmVjb2dIYW5kbGVycy5sZW5ndGg7 IGluZGV4IDwgbGVuOyArK2luZGV4KSB7CiAgICAgICAgICBoYW5kbGVySW5m byA9IHRhcmdldEhhbmRsZXJJbmZvc1tpbmRleF07CiAgICAgICAgICBpZiAo aGFuZGxlckluZm8ubmFtZSA9PT0gaGFuZGxlck5hbWUpIHsgYnJlYWs7IH0K ICAgICAgICB9CgogICAgICAgIGlmIChpbmRleCA9PT0gcmVjb2dIYW5kbGVy cy5sZW5ndGgpIHsKICAgICAgICAgIC8vIFRoZSBwcm92aWRlZCByb3V0ZSBu YW1lIGlzbid0IGV2ZW4gaW4gdGhlIHJvdXRlIGhpZXJhcmNoeS4KICAgICAg ICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHZhciBzdGF0 ZSA9IG5ldyBUcmFuc2l0aW9uU3RhdGUoKTsKICAgICAgICBzdGF0ZS5oYW5k bGVySW5mb3MgPSB0YXJnZXRIYW5kbGVySW5mb3Muc2xpY2UoMCwgaW5kZXgg KyAxKTsKICAgICAgICByZWNvZ0hhbmRsZXJzID0gcmVjb2dIYW5kbGVycy5z bGljZSgwLCBpbmRleCArIDEpOwoKICAgICAgICB2YXIgaW50ZW50ID0gbmV3 IE5hbWVkVHJhbnNpdGlvbkludGVudCh7CiAgICAgICAgICBuYW1lOiB0YXJn ZXRIYW5kbGVyLAogICAgICAgICAgY29udGV4dHM6IGNvbnRleHRzCiAgICAg ICAgfSk7CgogICAgICAgIHZhciBuZXdTdGF0ZSA9IGludGVudC5hcHBseVRv SGFuZGxlcnMoc3RhdGUsIHJlY29nSGFuZGxlcnMsIHRoaXMuZ2V0SGFuZGxl ciwgdGFyZ2V0SGFuZGxlciwgdHJ1ZSwgdHJ1ZSk7CgogICAgICAgIC8vIEdl dCBhIGhhc2ggb2YgUVBzIHRoYXQgd2lsbCBzdGlsbCBiZSBhY3RpdmUgb24g bmV3IHJvdXRlCiAgICAgICAgdmFyIGFjdGl2ZVFQc09uTmV3SGFuZGxlciA9 IHt9OwogICAgICAgIG1lcmdlKGFjdGl2ZVFQc09uTmV3SGFuZGxlciwgcXVl cnlQYXJhbXMpOwogICAgICAgIGZvciAodmFyIGtleSBpbiBhY3RpdmVRdWVy eVBhcmFtcykgewogICAgICAgICAgaWYgKGFjdGl2ZVF1ZXJ5UGFyYW1zLmhh c093blByb3BlcnR5KGtleSkgJiYKICAgICAgICAgICAgICBhY3RpdmVRUHNP bk5ld0hhbmRsZXIuaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgICAgICAg ICBhY3RpdmVRUHNPbk5ld0hhbmRsZXJba2V5XSA9IGFjdGl2ZVF1ZXJ5UGFy YW1zW2tleV07CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1 cm4gaGFuZGxlckluZm9zRXF1YWwobmV3U3RhdGUuaGFuZGxlckluZm9zLCBz dGF0ZS5oYW5kbGVySW5mb3MpICYmCiAgICAgICAgICAgICAgICFnZXRDaGFu Z2VsaXN0KGFjdGl2ZVFQc09uTmV3SGFuZGxlciwgcXVlcnlQYXJhbXMpOwog ICAgICB9LAoKICAgICAgdHJpZ2dlcjogZnVuY3Rpb24obmFtZSkgewogICAg ICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAg IHRyaWdnZXIodGhpcywgdGhpcy5jdXJyZW50SGFuZGxlckluZm9zLCBmYWxz ZSwgYXJncyk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICBAcHJpdmF0 ZQoKICAgICAgICBQbHVnZ2FibGUgaG9vayBmb3IgcG9zc2libHkgcnVubmlu ZyByb3V0ZSBob29rcwogICAgICAgIGluIGEgdHJ5LWNhdGNoIGVzY2FwaW5n IG1hbm5lci4KCiAgICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sg dGhlIGNhbGxiYWNrIHRoYXQgd2lsbAogICAgICAgICAgICAgICAgICAgICAg ICAgIGJlIGFzeW5jaHJvbm91c2x5IGNhbGxlZAoKICAgICAgICBAcmV0dXJu IHtQcm9taXNlfSBhIHByb21pc2UgdGhhdCBmdWxmaWxscyB3aXRoIHRoZQog ICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHJldHVybmVkIGZyb20g dGhlIGNhbGxiYWNrCiAgICAgICAqLwogICAgICBhc3luYzogZnVuY3Rpb24o Y2FsbGJhY2ssIGxhYmVsKSB7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNl KGZ1bmN0aW9uKHJlc29sdmUpIHsKICAgICAgICAgIHJlc29sdmUoY2FsbGJh Y2soKSk7CiAgICAgICAgfSwgbGFiZWwpOwogICAgICB9LAoKICAgICAgLyoq CiAgICAgICAgSG9vayBwb2ludCBmb3IgbG9nZ2luZyB0cmFuc2l0aW9uIHN0 YXR1cyB1cGRhdGVzLgoKICAgICAgICBAcGFyYW0ge1N0cmluZ30gbWVzc2Fn ZSBUaGUgbWVzc2FnZSB0byBsb2cuCiAgICAgICovCiAgICAgIGxvZzogbnVs bAogICAgfTsKCiAgICAvKioKICAgICAgQHByaXZhdGUKCiAgICAgIFRha2Vz IGFuIEFycmF5IG9mIGBIYW5kbGVySW5mb2BzLCBmaWd1cmVzIG91dCB3aGlj aCBvbmVzIGFyZQogICAgICBleGl0aW5nLCBlbnRlcmluZywgb3IgY2hhbmdp bmcgY29udGV4dHMsIGFuZCBjYWxscyB0aGUKICAgICAgcHJvcGVyIGhhbmRs ZXIgaG9va3MuCgogICAgICBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZv bGxvd2luZyB0cmVlIG9mIGhhbmRsZXJzLiBFYWNoIGhhbmRsZXIgaXMKICAg ICAgZm9sbG93ZWQgYnkgdGhlIFVSTCBzZWdtZW50IGl0IGhhbmRsZXMuCgog ICAgICBgYGAKICAgICAgfH5pbmRleCAoIi8iKQogICAgICB8IHx+cG9zdHMg KCIvcG9zdHMiKQogICAgICB8IHwgfC1zaG93UG9zdCAoIi86aWQiKQogICAg ICB8IHwgfC1uZXdQb3N0ICgiL25ldyIpCiAgICAgIHwgfCB8LWVkaXRQb3N0 ICgiL2VkaXQiKQogICAgICB8IHx+YWJvdXQgKCIvYWJvdXQvOmlkIikKICAg ICAgYGBgCgogICAgICBDb25zaWRlciB0aGUgZm9sbG93aW5nIHRyYW5zaXRp b25zOgoKICAgICAgMS4gQSBVUkwgdHJhbnNpdGlvbiB0byBgL3Bvc3RzLzFg LgogICAgICAgICAxLiBUcmlnZ2VycyB0aGUgYCptb2RlbGAgY2FsbGJhY2tz IG9uIHRoZQogICAgICAgICAgICBgaW5kZXhgLCBgcG9zdHNgLCBhbmQgYHNo b3dQb3N0YCBoYW5kbGVycwogICAgICAgICAyLiBUcmlnZ2VycyB0aGUgYGVu dGVyYCBjYWxsYmFjayBvbiB0aGUgc2FtZQogICAgICAgICAzLiBUcmlnZ2Vy cyB0aGUgYHNldHVwYCBjYWxsYmFjayBvbiB0aGUgc2FtZQogICAgICAyLiBB IGRpcmVjdCB0cmFuc2l0aW9uIHRvIGBuZXdQb3N0YAogICAgICAgICAxLiBU cmlnZ2VycyB0aGUgYGV4aXRgIGNhbGxiYWNrIG9uIGBzaG93UG9zdGAKICAg ICAgICAgMi4gVHJpZ2dlcnMgdGhlIGBlbnRlcmAgY2FsbGJhY2sgb24gYG5l d1Bvc3RgCiAgICAgICAgIDMuIFRyaWdnZXJzIHRoZSBgc2V0dXBgIGNhbGxi YWNrIG9uIGBuZXdQb3N0YAogICAgICAzLiBBIGRpcmVjdCB0cmFuc2l0aW9u IHRvIGBhYm91dGAgd2l0aCBhIHNwZWNpZmllZAogICAgICAgICBjb250ZXh0 IG9iamVjdAogICAgICAgICAxLiBUcmlnZ2VycyB0aGUgYGV4aXRgIGNhbGxi YWNrIG9uIGBuZXdQb3N0YAogICAgICAgICAgICBhbmQgYHBvc3RzYAogICAg ICAgICAyLiBUcmlnZ2VycyB0aGUgYHNlcmlhbGl6ZWAgY2FsbGJhY2sgb24g YGFib3V0YAogICAgICAgICAzLiBUcmlnZ2VycyB0aGUgYGVudGVyYCBjYWxs YmFjayBvbiBgYWJvdXRgCiAgICAgICAgIDQuIFRyaWdnZXJzIHRoZSBgc2V0 dXBgIGNhbGxiYWNrIG9uIGBhYm91dGAKCiAgICAgIEBwYXJhbSB7Um91dGVy fSB0cmFuc2l0aW9uCiAgICAgIEBwYXJhbSB7VHJhbnNpdGlvblN0YXRlfSBu ZXdTdGF0ZQogICAgKi8KICAgIGZ1bmN0aW9uIHNldHVwQ29udGV4dHMocm91 dGVyLCBuZXdTdGF0ZSwgdHJhbnNpdGlvbikgewogICAgICB2YXIgcGFydGl0 aW9uID0gcGFydGl0aW9uSGFuZGxlcnMocm91dGVyLnN0YXRlLCBuZXdTdGF0 ZSk7CgogICAgICBmb3JFYWNoKHBhcnRpdGlvbi5leGl0ZWQsIGZ1bmN0aW9u KGhhbmRsZXJJbmZvKSB7CiAgICAgICAgdmFyIGhhbmRsZXIgPSBoYW5kbGVy SW5mby5oYW5kbGVyOwogICAgICAgIGRlbGV0ZSBoYW5kbGVyLmNvbnRleHQ7 CiAgICAgICAgaWYgKGhhbmRsZXIuZXhpdCkgeyBoYW5kbGVyLmV4aXQoKTsg fQogICAgICB9KTsKCiAgICAgIHZhciBvbGRTdGF0ZSA9IHJvdXRlci5vbGRT dGF0ZSA9IHJvdXRlci5zdGF0ZTsKICAgICAgcm91dGVyLnN0YXRlID0gbmV3 U3RhdGU7CiAgICAgIHZhciBjdXJyZW50SGFuZGxlckluZm9zID0gcm91dGVy LmN1cnJlbnRIYW5kbGVySW5mb3MgPSBwYXJ0aXRpb24udW5jaGFuZ2VkLnNs aWNlKCk7CgogICAgICB0cnkgewogICAgICAgIGZvckVhY2gocGFydGl0aW9u LnVwZGF0ZWRDb250ZXh0LCBmdW5jdGlvbihoYW5kbGVySW5mbykgewogICAg ICAgICAgcmV0dXJuIGhhbmRsZXJFbnRlcmVkT3JVcGRhdGVkKGN1cnJlbnRI YW5kbGVySW5mb3MsIGhhbmRsZXJJbmZvLCBmYWxzZSwgdHJhbnNpdGlvbik7 CiAgICAgICAgfSk7CgogICAgICAgIGZvckVhY2gocGFydGl0aW9uLmVudGVy ZWQsIGZ1bmN0aW9uKGhhbmRsZXJJbmZvKSB7CiAgICAgICAgICByZXR1cm4g aGFuZGxlckVudGVyZWRPclVwZGF0ZWQoY3VycmVudEhhbmRsZXJJbmZvcywg aGFuZGxlckluZm8sIHRydWUsIHRyYW5zaXRpb24pOwogICAgICAgIH0pOwog ICAgICB9IGNhdGNoKGUpIHsKICAgICAgICByb3V0ZXIuc3RhdGUgPSBvbGRT dGF0ZTsKICAgICAgICByb3V0ZXIuY3VycmVudEhhbmRsZXJJbmZvcyA9IG9s ZFN0YXRlLmhhbmRsZXJJbmZvczsKICAgICAgICB0aHJvdyBlOwogICAgICB9 CgogICAgICByb3V0ZXIuc3RhdGUucXVlcnlQYXJhbXMgPSBmaW5hbGl6ZVF1 ZXJ5UGFyYW1DaGFuZ2Uocm91dGVyLCBjdXJyZW50SGFuZGxlckluZm9zLCBu ZXdTdGF0ZS5xdWVyeVBhcmFtcyk7CiAgICB9CgoKICAgIC8qKgogICAgICBA cHJpdmF0ZQoKICAgICAgSGVscGVyIG1ldGhvZCB1c2VkIGJ5IHNldHVwQ29u dGV4dHMuIEhhbmRsZXMgZXJyb3JzIG9yIHJlZGlyZWN0cwogICAgICB0aGF0 IG1heSBoYXBwZW4gaW4gZW50ZXIvc2V0dXAuCiAgICAqLwogICAgZnVuY3Rp b24gaGFuZGxlckVudGVyZWRPclVwZGF0ZWQoY3VycmVudEhhbmRsZXJJbmZv cywgaGFuZGxlckluZm8sIGVudGVyLCB0cmFuc2l0aW9uKSB7CgogICAgICB2 YXIgaGFuZGxlciA9IGhhbmRsZXJJbmZvLmhhbmRsZXIsCiAgICAgICAgICBj b250ZXh0ID0gaGFuZGxlckluZm8uY29udGV4dDsKCiAgICAgIGlmIChlbnRl ciAmJiBoYW5kbGVyLmVudGVyKSB7IGhhbmRsZXIuZW50ZXIodHJhbnNpdGlv bik7IH0KICAgICAgaWYgKHRyYW5zaXRpb24gJiYgdHJhbnNpdGlvbi5pc0Fi b3J0ZWQpIHsKICAgICAgICB0aHJvdyBuZXcgVHJhbnNpdGlvbkFib3J0ZWQo KTsKICAgICAgfQoKICAgICAgaGFuZGxlci5jb250ZXh0ID0gY29udGV4dDsK ICAgICAgaWYgKGhhbmRsZXIuY29udGV4dERpZENoYW5nZSkgeyBoYW5kbGVy LmNvbnRleHREaWRDaGFuZ2UoKTsgfQoKICAgICAgaWYgKGhhbmRsZXIuc2V0 dXApIHsgaGFuZGxlci5zZXR1cChjb250ZXh0LCB0cmFuc2l0aW9uKTsgfQog ICAgICBpZiAodHJhbnNpdGlvbiAmJiB0cmFuc2l0aW9uLmlzQWJvcnRlZCkg ewogICAgICAgIHRocm93IG5ldyBUcmFuc2l0aW9uQWJvcnRlZCgpOwogICAg ICB9CgogICAgICBjdXJyZW50SGFuZGxlckluZm9zLnB1c2goaGFuZGxlcklu Zm8pOwoKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgoKICAgIC8qKgogICAg ICBAcHJpdmF0ZQoKICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hl biB0cmFuc2l0aW9uaW5nIGZyb20gb25lIFVSTCB0bwogICAgICBhbm90aGVy IHRvIGRldGVybWluZSB3aGljaCBoYW5kbGVycyBhcmUgbm8gbG9uZ2VyIGFj dGl2ZSwKICAgICAgd2hpY2ggaGFuZGxlcnMgYXJlIG5ld2x5IGFjdGl2ZSwg YW5kIHdoaWNoIGhhbmRsZXJzIHJlbWFpbgogICAgICBhY3RpdmUgYnV0IGhh dmUgdGhlaXIgY29udGV4dCBjaGFuZ2VkLgoKICAgICAgVGFrZSBhIGxpc3Qg b2Ygb2xkIGhhbmRsZXJzIGFuZCBuZXcgaGFuZGxlcnMgYW5kIHBhcnRpdGlv bgogICAgICB0aGVtIGludG8gZm91ciBidWNrZXRzOgoKICAgICAgKiB1bmNo YW5nZWQ6IHRoZSBoYW5kbGVyIHdhcyBhY3RpdmUgaW4gYm90aCB0aGUgb2xk IGFuZAogICAgICAgIG5ldyBVUkwsIGFuZCBpdHMgY29udGV4dCByZW1haW5z IHRoZSBzYW1lCiAgICAgICogdXBkYXRlZCBjb250ZXh0OiB0aGUgaGFuZGxl ciB3YXMgYWN0aXZlIGluIGJvdGggdGhlCiAgICAgICAgb2xkIGFuZCBuZXcg VVJMLCBidXQgaXRzIGNvbnRleHQgY2hhbmdlZC4gVGhlIGhhbmRsZXIncwog ICAgICAgIGBzZXR1cGAgbWV0aG9kLCBpZiBhbnksIHdpbGwgYmUgY2FsbGVk IHdpdGggdGhlIG5ldwogICAgICAgIGNvbnRleHQuCiAgICAgICogZXhpdGVk OiB0aGUgaGFuZGxlciB3YXMgYWN0aXZlIGluIHRoZSBvbGQgVVJMLCBidXQg aXMKICAgICAgICBubyBsb25nZXIgYWN0aXZlLgogICAgICAqIGVudGVyZWQ6 IHRoZSBoYW5kbGVyIHdhcyBub3QgYWN0aXZlIGluIHRoZSBvbGQgVVJMLCBi dXQKICAgICAgICBpcyBub3cgYWN0aXZlLgoKICAgICAgVGhlIFBhcnRpdGlv bmVkSGFuZGxlcnMgc3RydWN0dXJlIGhhcyBmb3VyIGZpZWxkczoKCiAgICAg ICogYHVwZGF0ZWRDb250ZXh0YDogYSBsaXN0IG9mIGBIYW5kbGVySW5mb2Ag b2JqZWN0cyB0aGF0CiAgICAgICAgcmVwcmVzZW50IGhhbmRsZXJzIHRoYXQg cmVtYWluIGFjdGl2ZSBidXQgaGF2ZSBhIGNoYW5nZWQKICAgICAgICBjb250 ZXh0CiAgICAgICogYGVudGVyZWRgOiBhIGxpc3Qgb2YgYEhhbmRsZXJJbmZv YCBvYmplY3RzIHRoYXQgcmVwcmVzZW50CiAgICAgICAgaGFuZGxlcnMgdGhh dCBhcmUgbmV3bHkgYWN0aXZlCiAgICAgICogYGV4aXRlZGA6IGEgbGlzdCBv ZiBgSGFuZGxlckluZm9gIG9iamVjdHMgdGhhdCBhcmUgbm8KICAgICAgICBs b25nZXIgYWN0aXZlLgogICAgICAqIGB1bmNoYW5nZWRgOiBhIGxpc3Qgb2Yg YEhhbmRlckluZm9gIG9iamVjdHMgdGhhdCByZW1haW4gYWN0aXZlLgoKICAg ICAgQHBhcmFtIHtBcnJheVtIYW5kbGVySW5mb119IG9sZEhhbmRsZXJzIGEg bGlzdCBvZiB0aGUgaGFuZGxlcgogICAgICAgIGluZm9ybWF0aW9uIGZvciB0 aGUgcHJldmlvdXMgVVJMIChvciBgW11gIGlmIHRoaXMgaXMgdGhlCiAgICAg ICAgZmlyc3QgaGFuZGxlZCB0cmFuc2l0aW9uKQogICAgICBAcGFyYW0ge0Fy cmF5W0hhbmRsZXJJbmZvXX0gbmV3SGFuZGxlcnMgYSBsaXN0IG9mIHRoZSBo YW5kbGVyCiAgICAgICAgaW5mb3JtYXRpb24gZm9yIHRoZSBuZXcgVVJMCgog ICAgICBAcmV0dXJuIHtQYXJ0aXRpb259CiAgICAqLwogICAgZnVuY3Rpb24g cGFydGl0aW9uSGFuZGxlcnMob2xkU3RhdGUsIG5ld1N0YXRlKSB7CiAgICAg IHZhciBvbGRIYW5kbGVycyA9IG9sZFN0YXRlLmhhbmRsZXJJbmZvczsKICAg ICAgdmFyIG5ld0hhbmRsZXJzID0gbmV3U3RhdGUuaGFuZGxlckluZm9zOwoK ICAgICAgdmFyIGhhbmRsZXJzID0gewogICAgICAgICAgICB1cGRhdGVkQ29u dGV4dDogW10sCiAgICAgICAgICAgIGV4aXRlZDogW10sCiAgICAgICAgICAg IGVudGVyZWQ6IFtdLAogICAgICAgICAgICB1bmNoYW5nZWQ6IFtdCiAgICAg ICAgICB9OwoKICAgICAgdmFyIGhhbmRsZXJDaGFuZ2VkLCBjb250ZXh0Q2hh bmdlZCwgcXVlcnlQYXJhbXNDaGFuZ2VkLCBpLCBsOwoKICAgICAgZm9yIChp PTAsIGw9bmV3SGFuZGxlcnMubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAg IHZhciBvbGRIYW5kbGVyID0gb2xkSGFuZGxlcnNbaV0sIG5ld0hhbmRsZXIg PSBuZXdIYW5kbGVyc1tpXTsKCiAgICAgICAgaWYgKCFvbGRIYW5kbGVyIHx8 IG9sZEhhbmRsZXIuaGFuZGxlciAhPT0gbmV3SGFuZGxlci5oYW5kbGVyKSB7 CiAgICAgICAgICBoYW5kbGVyQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgfQoK ICAgICAgICBpZiAoaGFuZGxlckNoYW5nZWQpIHsKICAgICAgICAgIGhhbmRs ZXJzLmVudGVyZWQucHVzaChuZXdIYW5kbGVyKTsKICAgICAgICAgIGlmIChv bGRIYW5kbGVyKSB7IGhhbmRsZXJzLmV4aXRlZC51bnNoaWZ0KG9sZEhhbmRs ZXIpOyB9CiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Q2hhbmdlZCB8fCBv bGRIYW5kbGVyLmNvbnRleHQgIT09IG5ld0hhbmRsZXIuY29udGV4dCB8fCBx dWVyeVBhcmFtc0NoYW5nZWQpIHsKICAgICAgICAgIGNvbnRleHRDaGFuZ2Vk ID0gdHJ1ZTsKICAgICAgICAgIGhhbmRsZXJzLnVwZGF0ZWRDb250ZXh0LnB1 c2gobmV3SGFuZGxlcik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGhh bmRsZXJzLnVuY2hhbmdlZC5wdXNoKG9sZEhhbmRsZXIpOwogICAgICAgIH0K ICAgICAgfQoKICAgICAgZm9yIChpPW5ld0hhbmRsZXJzLmxlbmd0aCwgbD1v bGRIYW5kbGVycy5sZW5ndGg7IGk8bDsgaSsrKSB7CiAgICAgICAgaGFuZGxl cnMuZXhpdGVkLnVuc2hpZnQob2xkSGFuZGxlcnNbaV0pOwogICAgICB9Cgog ICAgICByZXR1cm4gaGFuZGxlcnM7CiAgICB9CgogICAgZnVuY3Rpb24gdXBk YXRlVVJMKHRyYW5zaXRpb24sIHN0YXRlLCBpbnB1dFVybCkgewogICAgICB2 YXIgdXJsTWV0aG9kID0gdHJhbnNpdGlvbi51cmxNZXRob2Q7CgogICAgICBp ZiAoIXVybE1ldGhvZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAg ICAgdmFyIHJvdXRlciA9IHRyYW5zaXRpb24ucm91dGVyLAogICAgICAgICAg aGFuZGxlckluZm9zID0gc3RhdGUuaGFuZGxlckluZm9zLAogICAgICAgICAg aGFuZGxlck5hbWUgPSBoYW5kbGVySW5mb3NbaGFuZGxlckluZm9zLmxlbmd0 aCAtIDFdLm5hbWUsCiAgICAgICAgICBwYXJhbXMgPSB7fTsKCiAgICAgIGZv ciAodmFyIGkgPSBoYW5kbGVySW5mb3MubGVuZ3RoIC0gMTsgaSA+PSAwOyAt LWkpIHsKICAgICAgICB2YXIgaGFuZGxlckluZm8gPSBoYW5kbGVySW5mb3Nb aV07CiAgICAgICAgbWVyZ2UocGFyYW1zLCBoYW5kbGVySW5mby5wYXJhbXMp OwogICAgICAgIGlmIChoYW5kbGVySW5mby5oYW5kbGVyLmluYWNjZXNzaWJs ZUJ5VVJMKSB7CiAgICAgICAgICB1cmxNZXRob2QgPSBudWxsOwogICAgICAg IH0KICAgICAgfQoKICAgICAgaWYgKHVybE1ldGhvZCkgewogICAgICAgIHBh cmFtcy5xdWVyeVBhcmFtcyA9IHN0YXRlLnF1ZXJ5UGFyYW1zOwogICAgICAg IHZhciB1cmwgPSByb3V0ZXIucmVjb2duaXplci5nZW5lcmF0ZShoYW5kbGVy TmFtZSwgcGFyYW1zKTsKCiAgICAgICAgaWYgKHVybE1ldGhvZCA9PT0gJ3Jl cGxhY2VRdWVyeScpIHsKICAgICAgICAgIGlmICh1cmwgIT09IGlucHV0VXJs KSB7CiAgICAgICAgICAgIHJvdXRlci5yZXBsYWNlVVJMKHVybCk7CiAgICAg ICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh1cmxNZXRob2QgPT09ICdyZXBs YWNlJykgewogICAgICAgICAgcm91dGVyLnJlcGxhY2VVUkwodXJsKTsKICAg ICAgICB9IGVsc2UgewogICAgICAgICAgcm91dGVyLnVwZGF0ZVVSTCh1cmwp OwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICBAcHJp dmF0ZQoKICAgICAgVXBkYXRlcyB0aGUgVVJMIChpZiBuZWNlc3NhcnkpIGFu ZCBjYWxscyBgc2V0dXBDb250ZXh0c2AKICAgICAgdG8gdXBkYXRlIHRoZSBy b3V0ZXIncyBhcnJheSBvZiBgY3VycmVudEhhbmRsZXJJbmZvc2AuCiAgICAg Ki8KICAgIGZ1bmN0aW9uIGZpbmFsaXplVHJhbnNpdGlvbih0cmFuc2l0aW9u LCBuZXdTdGF0ZSkgewoKICAgICAgdHJ5IHsKICAgICAgICBsb2codHJhbnNp dGlvbi5yb3V0ZXIsIHRyYW5zaXRpb24uc2VxdWVuY2UsICJSZXNvbHZlZCBh bGwgbW9kZWxzIG9uIGRlc3RpbmF0aW9uIHJvdXRlOyBmaW5hbGl6aW5nIHRy YW5zaXRpb24uIik7CgogICAgICAgIHZhciByb3V0ZXIgPSB0cmFuc2l0aW9u LnJvdXRlciwKICAgICAgICAgICAgaGFuZGxlckluZm9zID0gbmV3U3RhdGUu aGFuZGxlckluZm9zLAogICAgICAgICAgICBzZXEgPSB0cmFuc2l0aW9uLnNl cXVlbmNlOwoKICAgICAgICAvLyBSdW4gYWxsIHRoZSBuZWNlc3NhcnkgZW50 ZXIvc2V0dXAvZXhpdCBob29rcwogICAgICAgIHNldHVwQ29udGV4dHMocm91 dGVyLCBuZXdTdGF0ZSwgdHJhbnNpdGlvbik7CgogICAgICAgIC8vIENoZWNr IGlmIGEgcmVkaXJlY3Qgb2NjdXJyZWQgaW4gZW50ZXIvc2V0dXAKICAgICAg ICBpZiAodHJhbnNpdGlvbi5pc0Fib3J0ZWQpIHsKICAgICAgICAgIC8vIFRP RE86IGNsZWFuZXIgd2F5PyBkaXN0aW5ndWlzaCBiL3cgdGFyZ2V0SGFuZGxl ckluZm9zPwogICAgICAgICAgcm91dGVyLnN0YXRlLmhhbmRsZXJJbmZvcyA9 IHJvdXRlci5jdXJyZW50SGFuZGxlckluZm9zOwogICAgICAgICAgcmV0dXJu IHJlamVjdChsb2dBYm9ydCh0cmFuc2l0aW9uKSk7CiAgICAgICAgfQoKICAg ICAgICB1cGRhdGVVUkwodHJhbnNpdGlvbiwgbmV3U3RhdGUsIHRyYW5zaXRp b24uaW50ZW50LnVybCk7CgogICAgICAgIHRyYW5zaXRpb24uaXNBY3RpdmUg PSBmYWxzZTsKICAgICAgICByb3V0ZXIuYWN0aXZlVHJhbnNpdGlvbiA9IG51 bGw7CgogICAgICAgIHRyaWdnZXIocm91dGVyLCByb3V0ZXIuY3VycmVudEhh bmRsZXJJbmZvcywgdHJ1ZSwgWydkaWRUcmFuc2l0aW9uJ10pOwoKICAgICAg ICBpZiAocm91dGVyLmRpZFRyYW5zaXRpb24pIHsKICAgICAgICAgIHJvdXRl ci5kaWRUcmFuc2l0aW9uKHJvdXRlci5jdXJyZW50SGFuZGxlckluZm9zKTsK ICAgICAgICB9CgogICAgICAgIGxvZyhyb3V0ZXIsIHRyYW5zaXRpb24uc2Vx dWVuY2UsICJUUkFOU0lUSU9OIENPTVBMRVRFLiIpOwoKICAgICAgICAvLyBS ZXNvbHZlIHdpdGggdGhlIGZpbmFsIGhhbmRsZXIuCiAgICAgICAgcmV0dXJu IGhhbmRsZXJJbmZvc1toYW5kbGVySW5mb3MubGVuZ3RoIC0gMV0uaGFuZGxl cjsKICAgICAgfSBjYXRjaChlKSB7CiAgICAgICAgaWYgKCEoZSBpbnN0YW5j ZW9mIFRyYW5zaXRpb25BYm9ydGVkKSkgewogICAgICAgICAgLy92YXIgZXJy b25lb3VzSGFuZGxlciA9IGhhbmRsZXJJbmZvcy5wb3AoKTsKICAgICAgICAg IHZhciBpbmZvcyA9IHRyYW5zaXRpb24uc3RhdGUuaGFuZGxlckluZm9zOwog ICAgICAgICAgdHJhbnNpdGlvbi50cmlnZ2VyKHRydWUsICdlcnJvcicsIGUs IHRyYW5zaXRpb24sIGluZm9zW2luZm9zLmxlbmd0aC0xXS5oYW5kbGVyKTsK ICAgICAgICAgIHRyYW5zaXRpb24uYWJvcnQoKTsKICAgICAgICB9CgogICAg ICAgIHRocm93IGU7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAgQHBy aXZhdGUKCiAgICAgIEJlZ2lucyBhbmQgcmV0dXJucyBhIFRyYW5zaXRpb24g YmFzZWQgb24gdGhlIHByb3ZpZGVkCiAgICAgIGFyZ3VtZW50cy4gQWNjZXB0 cyBhcmd1bWVudHMgaW4gdGhlIGZvcm0gb2YgYm90aCBVUkwKICAgICAgdHJh bnNpdGlvbnMgYW5kIG5hbWVkIHRyYW5zaXRpb25zLgoKICAgICAgQHBhcmFt IHtSb3V0ZXJ9IHJvdXRlcgogICAgICBAcGFyYW0ge0FycmF5W09iamVjdF19 IGFyZ3MgYXJndW1lbnRzIHBhc3NlZCB0byB0cmFuc2l0aW9uVG8sCiAgICAg ICAgcmVwbGFjZVdpdGgsIG9yIGhhbmRsZVVSTAogICAgKi8KICAgIGZ1bmN0 aW9uIGRvVHJhbnNpdGlvbihyb3V0ZXIsIGFyZ3MsIGlzSW50ZXJtZWRpYXRl KSB7CiAgICAgIC8vIE5vcm1hbGl6ZSBibGFuayB0cmFuc2l0aW9ucyB0byBy b290IFVSTCB0cmFuc2l0aW9ucy4KICAgICAgdmFyIG5hbWUgPSBhcmdzWzBd IHx8ICcvJzsKCiAgICAgIHZhciBsYXN0QXJnID0gYXJnc1thcmdzLmxlbmd0 aC0xXTsKICAgICAgdmFyIHF1ZXJ5UGFyYW1zID0ge307CiAgICAgIGlmIChs YXN0QXJnICYmIGxhc3RBcmcuaGFzT3duUHJvcGVydHkoJ3F1ZXJ5UGFyYW1z JykpIHsKICAgICAgICBxdWVyeVBhcmFtcyA9IHBvcC5jYWxsKGFyZ3MpLnF1 ZXJ5UGFyYW1zOwogICAgICB9CgogICAgICB2YXIgaW50ZW50OwogICAgICBp ZiAoYXJncy5sZW5ndGggPT09IDApIHsKCiAgICAgICAgbG9nKHJvdXRlciwg IlVwZGF0aW5nIHF1ZXJ5IHBhcmFtcyIpOwoKICAgICAgICAvLyBBIHF1ZXJ5 IHBhcmFtIHVwZGF0ZSBpcyByZWFsbHkganVzdCBhIHRyYW5zaXRpb24KICAg ICAgICAvLyBpbnRvIHRoZSByb3V0ZSB5b3UncmUgYWxyZWFkeSBvbi4KICAg ICAgICB2YXIgaGFuZGxlckluZm9zID0gcm91dGVyLnN0YXRlLmhhbmRsZXJJ bmZvczsKICAgICAgICBpbnRlbnQgPSBuZXcgTmFtZWRUcmFuc2l0aW9uSW50 ZW50KHsKICAgICAgICAgIG5hbWU6IGhhbmRsZXJJbmZvc1toYW5kbGVySW5m b3MubGVuZ3RoIC0gMV0ubmFtZSwKICAgICAgICAgIGNvbnRleHRzOiBbXSwK ICAgICAgICAgIHF1ZXJ5UGFyYW1zOiBxdWVyeVBhcmFtcwogICAgICAgIH0p OwoKICAgICAgfSBlbHNlIGlmIChuYW1lLmNoYXJBdCgwKSA9PT0gJy8nKSB7 CgogICAgICAgIGxvZyhyb3V0ZXIsICJBdHRlbXB0aW5nIFVSTCB0cmFuc2l0 aW9uIHRvICIgKyBuYW1lKTsKICAgICAgICBpbnRlbnQgPSBuZXcgVVJMVHJh bnNpdGlvbkludGVudCh7IHVybDogbmFtZSB9KTsKCiAgICAgIH0gZWxzZSB7 CgogICAgICAgIGxvZyhyb3V0ZXIsICJBdHRlbXB0aW5nIHRyYW5zaXRpb24g dG8gIiArIG5hbWUpOwogICAgICAgIGludGVudCA9IG5ldyBOYW1lZFRyYW5z aXRpb25JbnRlbnQoewogICAgICAgICAgbmFtZTogYXJnc1swXSwKICAgICAg ICAgIGNvbnRleHRzOiBzbGljZS5jYWxsKGFyZ3MsIDEpLAogICAgICAgICAg cXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zCiAgICAgICAgfSk7CiAgICAgIH0K CiAgICAgIHJldHVybiByb3V0ZXIudHJhbnNpdGlvbkJ5SW50ZW50KGludGVu dCwgaXNJbnRlcm1lZGlhdGUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGhhbmRs ZXJJbmZvc0VxdWFsKGhhbmRsZXJJbmZvcywgb3RoZXJIYW5kbGVySW5mb3Mp IHsKICAgICAgaWYgKGhhbmRsZXJJbmZvcy5sZW5ndGggIT09IG90aGVySGFu ZGxlckluZm9zLmxlbmd0aCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAg ICAgfQoKICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGhhbmRsZXJJbmZv cy5sZW5ndGg7IGkgPCBsZW47ICsraSkgewogICAgICAgIGlmIChoYW5kbGVy SW5mb3NbaV0gIT09IG90aGVySGFuZGxlckluZm9zW2ldKSB7CiAgICAgICAg ICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVy biB0cnVlOwogICAgfQoKICAgIGZ1bmN0aW9uIGZpbmFsaXplUXVlcnlQYXJh bUNoYW5nZShyb3V0ZXIsIHJlc29sdmVkSGFuZGxlcnMsIG5ld1F1ZXJ5UGFy YW1zKSB7CiAgICAgIC8vIFdlIGZpcmUgYSBmaW5hbGl6ZVF1ZXJ5UGFyYW1D aGFuZ2UgZXZlbnQgd2hpY2gKICAgICAgLy8gZ2l2ZXMgdGhlIG5ldyByb3V0 ZSBoaWVyYXJjaHkgYSBjaGFuY2UgdG8gdGVsbAogICAgICAvLyB1cyB3aGlj aCBxdWVyeSBwYXJhbXMgaXQncyBjb25zdW1pbmcgYW5kIHdoYXQKICAgICAg Ly8gdGhlaXIgZmluYWwgdmFsdWVzIGFyZS4gSWYgYSBxdWVyeSBwYXJhbSBp cwogICAgICAvLyBubyBsb25nZXIgY29uc3VtZWQgaW4gdGhlIGZpbmFsIHJv dXRlIGhpZXJhcmNoeSwKICAgICAgLy8gaXRzIHNlcmlhbGl6ZWQgc2VnbWVu dCB3aWxsIGJlIHJlbW92ZWQKICAgICAgLy8gZnJvbSB0aGUgVVJMLgogICAg ICB2YXIgZmluYWxRdWVyeVBhcmFtc0FycmF5ID0gW107CiAgICAgIHRyaWdn ZXIocm91dGVyLCByZXNvbHZlZEhhbmRsZXJzLCB0cnVlLCBbJ2ZpbmFsaXpl UXVlcnlQYXJhbUNoYW5nZScsIG5ld1F1ZXJ5UGFyYW1zLCBmaW5hbFF1ZXJ5 UGFyYW1zQXJyYXldKTsKCiAgICAgIHZhciBmaW5hbFF1ZXJ5UGFyYW1zID0g e307CiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBmaW5hbFF1ZXJ5UGFy YW1zQXJyYXkubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHsKICAgICAgICB2YXIg cXAgPSBmaW5hbFF1ZXJ5UGFyYW1zQXJyYXlbaV07CiAgICAgICAgZmluYWxR dWVyeVBhcmFtc1txcC5rZXldID0gcXAudmFsdWU7CiAgICAgIH0KICAgICAg cmV0dXJuIGZpbmFsUXVlcnlQYXJhbXM7CiAgICB9CgogICAgX19leHBvcnRz X18uUm91dGVyID0gUm91dGVyOwogIH0pOwpkZWZpbmUoInJvdXRlci90cmFu c2l0aW9uLWludGVudCIsIAogIFsiLi91dGlscyIsImV4cG9ydHMiXSwKICBm dW5jdGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZXhwb3J0c19fKSB7CiAgICAi dXNlIHN0cmljdCI7CiAgICB2YXIgbWVyZ2UgPSBfX2RlcGVuZGVuY3kxX18u bWVyZ2U7CgogICAgZnVuY3Rpb24gVHJhbnNpdGlvbkludGVudChwcm9wcykg ewogICAgICBpZiAocHJvcHMpIHsKICAgICAgICBtZXJnZSh0aGlzLCBwcm9w cyk7CiAgICAgIH0KICAgICAgdGhpcy5kYXRhID0gdGhpcy5kYXRhIHx8IHt9 OwogICAgfQoKICAgIFRyYW5zaXRpb25JbnRlbnQucHJvdG90eXBlLmFwcGx5 VG9TdGF0ZSA9IGZ1bmN0aW9uKG9sZFN0YXRlKSB7CiAgICAgIC8vIERlZmF1 bHQgVHJhbnNpdGlvbkludGVudCBpcyBhIG5vLW9wLgogICAgICByZXR1cm4g b2xkU3RhdGU7CiAgICB9OwoKICAgIF9fZXhwb3J0c19fLlRyYW5zaXRpb25J bnRlbnQgPSBUcmFuc2l0aW9uSW50ZW50OwogIH0pOwpkZWZpbmUoInJvdXRl ci90cmFuc2l0aW9uLWludGVudC9uYW1lZC10cmFuc2l0aW9uLWludGVudCIs IAogIFsiLi4vdHJhbnNpdGlvbi1pbnRlbnQiLCIuLi90cmFuc2l0aW9uLXN0 YXRlIiwiLi4vaGFuZGxlci1pbmZvIiwiLi4vdXRpbHMiLCJleHBvcnRzIl0s CiAgZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2RlcGVuZGVuY3kyX18s IF9fZGVwZW5kZW5jeTNfXywgX19kZXBlbmRlbmN5NF9fLCBfX2V4cG9ydHNf XykgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFRyYW5zaXRpb25JbnRl bnQgPSBfX2RlcGVuZGVuY3kxX18uVHJhbnNpdGlvbkludGVudDsKICAgIHZh ciBUcmFuc2l0aW9uU3RhdGUgPSBfX2RlcGVuZGVuY3kyX18uVHJhbnNpdGlv blN0YXRlOwogICAgdmFyIFVucmVzb2x2ZWRIYW5kbGVySW5mb0J5UGFyYW0g PSBfX2RlcGVuZGVuY3kzX18uVW5yZXNvbHZlZEhhbmRsZXJJbmZvQnlQYXJh bTsKICAgIHZhciBVbnJlc29sdmVkSGFuZGxlckluZm9CeU9iamVjdCA9IF9f ZGVwZW5kZW5jeTNfXy5VbnJlc29sdmVkSGFuZGxlckluZm9CeU9iamVjdDsK ICAgIHZhciBpc1BhcmFtID0gX19kZXBlbmRlbmN5NF9fLmlzUGFyYW07CiAg ICB2YXIgZm9yRWFjaCA9IF9fZGVwZW5kZW5jeTRfXy5mb3JFYWNoOwogICAg dmFyIGV4dHJhY3RRdWVyeVBhcmFtcyA9IF9fZGVwZW5kZW5jeTRfXy5leHRy YWN0UXVlcnlQYXJhbXM7CiAgICB2YXIgb0NyZWF0ZSA9IF9fZGVwZW5kZW5j eTRfXy5vQ3JlYXRlOwogICAgdmFyIG1lcmdlID0gX19kZXBlbmRlbmN5NF9f Lm1lcmdlOwoKICAgIGZ1bmN0aW9uIE5hbWVkVHJhbnNpdGlvbkludGVudChw cm9wcykgewogICAgICBUcmFuc2l0aW9uSW50ZW50LmNhbGwodGhpcywgcHJv cHMpOwogICAgfQoKICAgIE5hbWVkVHJhbnNpdGlvbkludGVudC5wcm90b3R5 cGUgPSBvQ3JlYXRlKFRyYW5zaXRpb25JbnRlbnQucHJvdG90eXBlKTsKICAg IE5hbWVkVHJhbnNpdGlvbkludGVudC5wcm90b3R5cGUuYXBwbHlUb1N0YXRl ID0gZnVuY3Rpb24ob2xkU3RhdGUsIHJlY29nbml6ZXIsIGdldEhhbmRsZXIs IGlzSW50ZXJtZWRpYXRlKSB7CgogICAgICB2YXIgcGFydGl0aW9uZWRBcmdz ICAgICA9IGV4dHJhY3RRdWVyeVBhcmFtcyhbdGhpcy5uYW1lXS5jb25jYXQo dGhpcy5jb250ZXh0cykpLAogICAgICAgIHB1cmVBcmdzICAgICAgICAgICAg ICA9IHBhcnRpdGlvbmVkQXJnc1swXSwKICAgICAgICBxdWVyeVBhcmFtcyAg ICAgICAgICAgPSBwYXJ0aXRpb25lZEFyZ3NbMV0sCiAgICAgICAgaGFuZGxl cnMgICAgICAgICAgICAgID0gcmVjb2duaXplci5oYW5kbGVyc0ZvcihwdXJl QXJnc1swXSk7CgogICAgICB2YXIgdGFyZ2V0Um91dGVOYW1lID0gaGFuZGxl cnNbaGFuZGxlcnMubGVuZ3RoLTFdLmhhbmRsZXI7CgogICAgICByZXR1cm4g dGhpcy5hcHBseVRvSGFuZGxlcnMob2xkU3RhdGUsIGhhbmRsZXJzLCBnZXRI YW5kbGVyLCB0YXJnZXRSb3V0ZU5hbWUsIGlzSW50ZXJtZWRpYXRlKTsKICAg IH07CgogICAgTmFtZWRUcmFuc2l0aW9uSW50ZW50LnByb3RvdHlwZS5hcHBs eVRvSGFuZGxlcnMgPSBmdW5jdGlvbihvbGRTdGF0ZSwgaGFuZGxlcnMsIGdl dEhhbmRsZXIsIHRhcmdldFJvdXRlTmFtZSwgaXNJbnRlcm1lZGlhdGUsIGNo ZWNraW5nSWZBY3RpdmUpIHsKCiAgICAgIHZhciBpOwogICAgICB2YXIgbmV3 U3RhdGUgPSBuZXcgVHJhbnNpdGlvblN0YXRlKCk7CiAgICAgIHZhciBvYmpl Y3RzID0gdGhpcy5jb250ZXh0cy5zbGljZSgwKTsKCiAgICAgIHZhciBpbnZh bGlkYXRlSW5kZXggPSBoYW5kbGVycy5sZW5ndGg7CiAgICAgIHZhciBub25E eW5hbWljSW5kZXhlcyA9IFtdOwoKICAgICAgLy8gUGl2b3QgaGFuZGxlcnMg YXJlIHByb3ZpZGVkIGZvciByZWZyZXNoIHRyYW5zaXRpb25zCiAgICAgIGlm ICh0aGlzLnBpdm90SGFuZGxlcikgewogICAgICAgIGZvciAoaSA9IDA7IGkg PCBoYW5kbGVycy5sZW5ndGg7ICsraSkgewogICAgICAgICAgaWYgKGdldEhh bmRsZXIoaGFuZGxlcnNbaV0uaGFuZGxlcikgPT09IHRoaXMucGl2b3RIYW5k bGVyKSB7CiAgICAgICAgICAgIGludmFsaWRhdGVJbmRleCA9IGk7CiAgICAg ICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoK ICAgICAgdmFyIHBpdm90SGFuZGxlckZvdW5kID0gIXRoaXMucGl2b3RIYW5k bGVyOwoKICAgICAgZm9yIChpID0gaGFuZGxlcnMubGVuZ3RoIC0gMTsgaSA+ PSAwOyAtLWkpIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaGFuZGxlcnNbaV07 CiAgICAgICAgdmFyIG5hbWUgPSByZXN1bHQuaGFuZGxlcjsKICAgICAgICB2 YXIgaGFuZGxlciA9IGdldEhhbmRsZXIobmFtZSk7CgogICAgICAgIHZhciBv bGRIYW5kbGVySW5mbyA9IG9sZFN0YXRlLmhhbmRsZXJJbmZvc1tpXTsKICAg ICAgICB2YXIgbmV3SGFuZGxlckluZm8gPSBudWxsOwoKICAgICAgICBpZiAo cmVzdWx0Lm5hbWVzLmxlbmd0aCA+IDApIHsKICAgICAgICAgIGlmIChpID49 IGludmFsaWRhdGVJbmRleCkgewogICAgICAgICAgICBuZXdIYW5kbGVySW5m byA9IHRoaXMuY3JlYXRlUGFyYW1IYW5kbGVySW5mbyhuYW1lLCBoYW5kbGVy LCByZXN1bHQubmFtZXMsIG9iamVjdHMsIG9sZEhhbmRsZXJJbmZvKTsKICAg ICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5ld0hhbmRsZXJJbmZvID0g dGhpcy5nZXRIYW5kbGVySW5mb0ZvckR5bmFtaWNTZWdtZW50KG5hbWUsIGhh bmRsZXIsIHJlc3VsdC5uYW1lcywgb2JqZWN0cywgb2xkSGFuZGxlckluZm8s IHRhcmdldFJvdXRlTmFtZSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNl IHsKICAgICAgICAgIC8vIFRoaXMgcm91dGUgaGFzIG5vIGR5bmFtaWMgc2Vn bWVudC4KICAgICAgICAgIC8vIFRoZXJlZm9yZSB0cmVhdCBhcyBhIHBhcmFt LWJhc2VkIGhhbmRsZXJJbmZvCiAgICAgICAgICAvLyB3aXRoIGVtcHR5IHBh cmFtcy4gVGhpcyB3aWxsIGNhdXNlIHRoZSBgbW9kZWxgCiAgICAgICAgICAv LyBob29rIHRvIGJlIGNhbGxlZCB3aXRoIGVtcHR5IHBhcmFtcywgd2hpY2gg aXMgZGVzaXJhYmxlLgogICAgICAgICAgbmV3SGFuZGxlckluZm8gPSB0aGlz LmNyZWF0ZVBhcmFtSGFuZGxlckluZm8obmFtZSwgaGFuZGxlciwgcmVzdWx0 Lm5hbWVzLCBvYmplY3RzLCBvbGRIYW5kbGVySW5mbyk7CiAgICAgICAgICBu b25EeW5hbWljSW5kZXhlcy51bnNoaWZ0KGkpOwogICAgICAgIH0KCiAgICAg ICAgaWYgKGNoZWNraW5nSWZBY3RpdmUpIHsKICAgICAgICAgIC8vIElmIHdl J3JlIHBlcmZvcm1pbmcgYW4gaXNBY3RpdmUgY2hlY2ssIHdlIHdhbnQgdG8K ICAgICAgICAgIC8vIHNlcmlhbGl6ZSBVUkwgcGFyYW1zIHdpdGggdGhlIHBy b3ZpZGVkIGNvbnRleHQsIGJ1dAogICAgICAgICAgLy8gaWdub3JlIG1pc21h dGNoZXMgYmV0d2VlbiBvbGQgYW5kIG5ldyBjb250ZXh0LgogICAgICAgICAg bmV3SGFuZGxlckluZm8gPSBuZXdIYW5kbGVySW5mby5iZWNvbWVSZXNvbHZl ZChudWxsLCBuZXdIYW5kbGVySW5mby5jb250ZXh0KTsKICAgICAgICAgIHZh ciBvbGRDb250ZXh0ID0gb2xkSGFuZGxlckluZm8gJiYgb2xkSGFuZGxlcklu Zm8uY29udGV4dDsKICAgICAgICAgIGlmIChyZXN1bHQubmFtZXMubGVuZ3Ro ID4gMCAmJiBuZXdIYW5kbGVySW5mby5jb250ZXh0ID09PSBvbGRDb250ZXh0 KSB7CiAgICAgICAgICAgIC8vIElmIGNvbnRleHRzIG1hdGNoIGluIGlzQWN0 aXZlIHRlc3QsIGFzc3VtZSBwYXJhbXMgYWxzbyBtYXRjaC4KICAgICAgICAg ICAgLy8gVGhpcyBhbGxvd3MgZm9yIGZsZXhpYmlsaXR5IGluIG5vdCByZXF1 aXJpbmcgdGhhdCBldmVyeSBsYXN0CiAgICAgICAgICAgIC8vIGhhbmRsZXIg cHJvdmlkZSBhIGBzZXJpYWxpemVgIG1ldGhvZAogICAgICAgICAgICBuZXdI YW5kbGVySW5mby5wYXJhbXMgPSBvbGRIYW5kbGVySW5mbyAmJiBvbGRIYW5k bGVySW5mby5wYXJhbXM7CiAgICAgICAgICB9CiAgICAgICAgICBuZXdIYW5k bGVySW5mby5jb250ZXh0ID0gb2xkQ29udGV4dDsKICAgICAgICB9CgogICAg ICAgIHZhciBoYW5kbGVyVG9Vc2UgPSBvbGRIYW5kbGVySW5mbzsKICAgICAg ICBpZiAoaSA+PSBpbnZhbGlkYXRlSW5kZXggfHwgbmV3SGFuZGxlckluZm8u c2hvdWxkU3VwZXJjZWRlKG9sZEhhbmRsZXJJbmZvKSkgewogICAgICAgICAg aW52YWxpZGF0ZUluZGV4ID0gTWF0aC5taW4oaSwgaW52YWxpZGF0ZUluZGV4 KTsKICAgICAgICAgIGhhbmRsZXJUb1VzZSA9IG5ld0hhbmRsZXJJbmZvOwog ICAgICAgIH0KCiAgICAgICAgaWYgKGlzSW50ZXJtZWRpYXRlICYmICFjaGVj a2luZ0lmQWN0aXZlKSB7CiAgICAgICAgICBoYW5kbGVyVG9Vc2UgPSBoYW5k bGVyVG9Vc2UuYmVjb21lUmVzb2x2ZWQobnVsbCwgaGFuZGxlclRvVXNlLmNv bnRleHQpOwogICAgICAgIH0KCiAgICAgICAgbmV3U3RhdGUuaGFuZGxlcklu Zm9zLnVuc2hpZnQoaGFuZGxlclRvVXNlKTsKICAgICAgfQoKICAgICAgaWYg KG9iamVjdHMubGVuZ3RoID4gMCkgewogICAgICAgIHRocm93IG5ldyBFcnJv cigiTW9yZSBjb250ZXh0IG9iamVjdHMgd2VyZSBwYXNzZWQgdGhhbiB0aGVy ZSBhcmUgZHluYW1pYyBzZWdtZW50cyBmb3IgdGhlIHJvdXRlOiAiICsgdGFy Z2V0Um91dGVOYW1lKTsKICAgICAgfQoKICAgICAgaWYgKCFpc0ludGVybWVk aWF0ZSkgewogICAgICAgIHRoaXMuaW52YWxpZGF0ZU5vbkR5bmFtaWNIYW5k bGVycyhuZXdTdGF0ZS5oYW5kbGVySW5mb3MsIG5vbkR5bmFtaWNJbmRleGVz LCBpbnZhbGlkYXRlSW5kZXgpOwogICAgICB9CgogICAgICBtZXJnZShuZXdT dGF0ZS5xdWVyeVBhcmFtcywgb2xkU3RhdGUucXVlcnlQYXJhbXMpOwogICAg ICBtZXJnZShuZXdTdGF0ZS5xdWVyeVBhcmFtcywgdGhpcy5xdWVyeVBhcmFt cyB8fCB7fSk7CgogICAgICByZXR1cm4gbmV3U3RhdGU7CiAgICB9OwoKICAg IE5hbWVkVHJhbnNpdGlvbkludGVudC5wcm90b3R5cGUuaW52YWxpZGF0ZU5v bkR5bmFtaWNIYW5kbGVycyA9IGZ1bmN0aW9uKGhhbmRsZXJJbmZvcywgaW5k ZXhlcywgaW52YWxpZGF0ZUluZGV4KSB7CiAgICAgIGZvckVhY2goaW5kZXhl cywgZnVuY3Rpb24oaSkgewogICAgICAgIGlmIChpID49IGludmFsaWRhdGVJ bmRleCkgewogICAgICAgICAgdmFyIGhhbmRsZXJJbmZvID0gaGFuZGxlcklu Zm9zW2ldOwogICAgICAgICAgaGFuZGxlckluZm9zW2ldID0gbmV3IFVucmVz b2x2ZWRIYW5kbGVySW5mb0J5UGFyYW0oewogICAgICAgICAgICBuYW1lOiBo YW5kbGVySW5mby5uYW1lLAogICAgICAgICAgICBoYW5kbGVyOiBoYW5kbGVy SW5mby5oYW5kbGVyLAogICAgICAgICAgICBwYXJhbXM6IHt9CiAgICAgICAg ICB9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfTsKCiAgICBOYW1lZFRy YW5zaXRpb25JbnRlbnQucHJvdG90eXBlLmdldEhhbmRsZXJJbmZvRm9yRHlu YW1pY1NlZ21lbnQgPSBmdW5jdGlvbihuYW1lLCBoYW5kbGVyLCBuYW1lcywg b2JqZWN0cywgb2xkSGFuZGxlckluZm8sIHRhcmdldFJvdXRlTmFtZSkgewoK ICAgICAgdmFyIG51bU5hbWVzID0gbmFtZXMubGVuZ3RoOwogICAgICB2YXIg b2JqZWN0VG9Vc2U7CiAgICAgIGlmIChvYmplY3RzLmxlbmd0aCA+IDApIHsK CiAgICAgICAgLy8gVXNlIHRoZSBvYmplY3RzIHByb3ZpZGVkIGZvciB0aGlz IHRyYW5zaXRpb24uCiAgICAgICAgb2JqZWN0VG9Vc2UgPSBvYmplY3RzW29i amVjdHMubGVuZ3RoIC0gMV07CiAgICAgICAgaWYgKGlzUGFyYW0ob2JqZWN0 VG9Vc2UpKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXJhbUhh bmRsZXJJbmZvKG5hbWUsIGhhbmRsZXIsIG5hbWVzLCBvYmplY3RzLCBvbGRI YW5kbGVySW5mbyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG9iamVj dHMucG9wKCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKG9sZEhhbmRs ZXJJbmZvICYmIG9sZEhhbmRsZXJJbmZvLm5hbWUgPT09IG5hbWUpIHsKICAg ICAgICAvLyBSZXVzZSB0aGUgbWF0Y2hpbmcgb2xkSGFuZGxlckluZm8KICAg ICAgICByZXR1cm4gb2xkSGFuZGxlckluZm87CiAgICAgIH0gZWxzZSB7CiAg ICAgICAgLy8gSWRlYWxseSB3ZSBzaG91bGQgdGhyb3cgdGhpcyBlcnJvciB0 byBwcm92aWRlIG1heGltYWwKICAgICAgICAvLyBpbmZvcm1hdGlvbiB0byB0 aGUgdXNlciB0aGF0IG5vdCBlbm91Z2ggY29udGV4dCBvYmplY3RzCiAgICAg ICAgLy8gd2VyZSBwcm92aWRlZCwgYnV0IHRoaXMgcHJvdmVzIHRvbyBjdW1i ZXJzb21lIGluIEVtYmVyCiAgICAgICAgLy8gaW4gY2FzZXMgd2hlcmUgaW5u ZXIgdGVtcGxhdGUgaGVscGVycyBhcmUgZXZhbHVhdGVkCiAgICAgICAgLy8g YmVmb3JlIHBhcmVudCBoZWxwZXJzIHVuLXJlbmRlciwgaW4gd2hpY2ggY2Fz ZXMgdGhpcwogICAgICAgIC8vIGVycm9yIHNvbWV3aGF0IHByZW1hdHVyZWx5 IGZpcmVzLgogICAgICAgIC8vdGhyb3cgbmV3IEVycm9yKCJOb3QgZW5vdWdo IGNvbnRleHQgb2JqZWN0cyB3ZXJlIHByb3ZpZGVkIHRvIGNvbXBsZXRlIGEg dHJhbnNpdGlvbiB0byAiICsgdGFyZ2V0Um91dGVOYW1lICsgIi4gU3BlY2lm aWNhbGx5LCB0aGUgIiArIG5hbWUgKyAiIHJvdXRlIG5lZWRzIGFuIG9iamVj dCB0aGF0IGNhbiBiZSBzZXJpYWxpemVkIGludG8gaXRzIGR5bmFtaWMgVVJM IHNlZ21lbnRzIFsiICsgbmFtZXMuam9pbignLCAnKSArICJdIik7CiAgICAg ICAgcmV0dXJuIG9sZEhhbmRsZXJJbmZvOwogICAgICB9CgogICAgICByZXR1 cm4gbmV3IFVucmVzb2x2ZWRIYW5kbGVySW5mb0J5T2JqZWN0KHsKICAgICAg ICBuYW1lOiBuYW1lLAogICAgICAgIGhhbmRsZXI6IGhhbmRsZXIsCiAgICAg ICAgY29udGV4dDogb2JqZWN0VG9Vc2UsCiAgICAgICAgbmFtZXM6IG5hbWVz CiAgICAgIH0pOwogICAgfTsKCiAgICBOYW1lZFRyYW5zaXRpb25JbnRlbnQu cHJvdG90eXBlLmNyZWF0ZVBhcmFtSGFuZGxlckluZm8gPSBmdW5jdGlvbihu YW1lLCBoYW5kbGVyLCBuYW1lcywgb2JqZWN0cywgb2xkSGFuZGxlckluZm8p IHsKICAgICAgdmFyIHBhcmFtcyA9IHt9OwoKICAgICAgLy8gU29hayB1cCBh bGwgdGhlIHByb3ZpZGVkIHN0cmluZy9udW1iZXJzCiAgICAgIHZhciBudW1O YW1lcyA9IG5hbWVzLmxlbmd0aDsKICAgICAgd2hpbGUgKG51bU5hbWVzLS0p IHsKCiAgICAgICAgLy8gT25seSB1c2Ugb2xkIHBhcmFtcyBpZiB0aGUgbmFt ZXMgbWF0Y2ggd2l0aCB0aGUgbmV3IGhhbmRsZXIKICAgICAgICB2YXIgb2xk UGFyYW1zID0gKG9sZEhhbmRsZXJJbmZvICYmIG5hbWUgPT09IG9sZEhhbmRs ZXJJbmZvLm5hbWUgJiYgb2xkSGFuZGxlckluZm8ucGFyYW1zKSB8fCB7fTsK CiAgICAgICAgdmFyIHBlZWsgPSBvYmplY3RzW29iamVjdHMubGVuZ3RoIC0g MV07CiAgICAgICAgdmFyIHBhcmFtTmFtZSA9IG5hbWVzW251bU5hbWVzXTsK ICAgICAgICBpZiAoaXNQYXJhbShwZWVrKSkgewogICAgICAgICAgcGFyYW1z W3BhcmFtTmFtZV0gPSAiIiArIG9iamVjdHMucG9wKCk7CiAgICAgICAgfSBl bHNlIHsKICAgICAgICAgIC8vIElmIHdlJ3JlIGhlcmUsIHRoaXMgbWVhbnMg b25seSBzb21lIG9mIHRoZSBwYXJhbXMKICAgICAgICAgIC8vIHdlcmUgc3Ry aW5nL251bWJlciBwYXJhbXMsIHNvIHRyeSBhbmQgdXNlIGEgcGFyYW0KICAg ICAgICAgIC8vIHZhbHVlIGZyb20gYSBwcmV2aW91cyBoYW5kbGVyLgogICAg ICAgICAgaWYgKG9sZFBhcmFtcy5oYXNPd25Qcm9wZXJ0eShwYXJhbU5hbWUp KSB7CiAgICAgICAgICAgIHBhcmFtc1twYXJhbU5hbWVdID0gb2xkUGFyYW1z W3BhcmFtTmFtZV07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0 aHJvdyBuZXcgRXJyb3IoIllvdSBkaWRuJ3QgcHJvdmlkZSBlbm91Z2ggc3Ry aW5nL251bWVyaWMgcGFyYW1ldGVycyB0byBzYXRpc2Z5IGFsbCBvZiB0aGUg ZHluYW1pYyBzZWdtZW50cyBmb3Igcm91dGUgIiArIG5hbWUpOwogICAgICAg ICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIG5ldyBVbnJl c29sdmVkSGFuZGxlckluZm9CeVBhcmFtKHsKICAgICAgICBuYW1lOiBuYW1l LAogICAgICAgIGhhbmRsZXI6IGhhbmRsZXIsCiAgICAgICAgcGFyYW1zOiBw YXJhbXMKICAgICAgfSk7CiAgICB9OwoKICAgIF9fZXhwb3J0c19fLk5hbWVk VHJhbnNpdGlvbkludGVudCA9IE5hbWVkVHJhbnNpdGlvbkludGVudDsKICB9 KTsKZGVmaW5lKCJyb3V0ZXIvdHJhbnNpdGlvbi1pbnRlbnQvdXJsLXRyYW5z aXRpb24taW50ZW50IiwgCiAgWyIuLi90cmFuc2l0aW9uLWludGVudCIsIi4u L3RyYW5zaXRpb24tc3RhdGUiLCIuLi9oYW5kbGVyLWluZm8iLCIuLi91dGls cyIsImV4cG9ydHMiXSwKICBmdW5jdGlvbihfX2RlcGVuZGVuY3kxX18sIF9f ZGVwZW5kZW5jeTJfXywgX19kZXBlbmRlbmN5M19fLCBfX2RlcGVuZGVuY3k0 X18sIF9fZXhwb3J0c19fKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIg VHJhbnNpdGlvbkludGVudCA9IF9fZGVwZW5kZW5jeTFfXy5UcmFuc2l0aW9u SW50ZW50OwogICAgdmFyIFRyYW5zaXRpb25TdGF0ZSA9IF9fZGVwZW5kZW5j eTJfXy5UcmFuc2l0aW9uU3RhdGU7CiAgICB2YXIgVW5yZXNvbHZlZEhhbmRs ZXJJbmZvQnlQYXJhbSA9IF9fZGVwZW5kZW5jeTNfXy5VbnJlc29sdmVkSGFu ZGxlckluZm9CeVBhcmFtOwogICAgdmFyIG9DcmVhdGUgPSBfX2RlcGVuZGVu Y3k0X18ub0NyZWF0ZTsKICAgIHZhciBtZXJnZSA9IF9fZGVwZW5kZW5jeTRf Xy5tZXJnZTsKCiAgICBmdW5jdGlvbiBVUkxUcmFuc2l0aW9uSW50ZW50KHBy b3BzKSB7CiAgICAgIFRyYW5zaXRpb25JbnRlbnQuY2FsbCh0aGlzLCBwcm9w cyk7CiAgICB9CgogICAgVVJMVHJhbnNpdGlvbkludGVudC5wcm90b3R5cGUg PSBvQ3JlYXRlKFRyYW5zaXRpb25JbnRlbnQucHJvdG90eXBlKTsKICAgIFVS TFRyYW5zaXRpb25JbnRlbnQucHJvdG90eXBlLmFwcGx5VG9TdGF0ZSA9IGZ1 bmN0aW9uKG9sZFN0YXRlLCByZWNvZ25pemVyLCBnZXRIYW5kbGVyKSB7CiAg ICAgIHZhciBuZXdTdGF0ZSA9IG5ldyBUcmFuc2l0aW9uU3RhdGUoKTsKCiAg ICAgIHZhciByZXN1bHRzID0gcmVjb2duaXplci5yZWNvZ25pemUodGhpcy51 cmwpLAogICAgICAgICAgcXVlcnlQYXJhbXMgPSB7fSwKICAgICAgICAgIGks IGxlbjsKCiAgICAgIGlmICghcmVzdWx0cykgewogICAgICAgIHRocm93IG5l dyBVbnJlY29nbml6ZWRVUkxFcnJvcih0aGlzLnVybCk7CiAgICAgIH0KCiAg ICAgIHZhciBzdGF0ZXNEaWZmZXIgPSBmYWxzZTsKCiAgICAgIGZvciAoaSA9 IDAsIGxlbiA9IHJlc3VsdHMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHsKICAg ICAgICB2YXIgcmVzdWx0ID0gcmVzdWx0c1tpXTsKICAgICAgICB2YXIgbmFt ZSA9IHJlc3VsdC5oYW5kbGVyOwogICAgICAgIHZhciBoYW5kbGVyID0gZ2V0 SGFuZGxlcihuYW1lKTsKCiAgICAgICAgaWYgKGhhbmRsZXIuaW5hY2Nlc3Np YmxlQnlVUkwpIHsKICAgICAgICAgIHRocm93IG5ldyBVbnJlY29nbml6ZWRV UkxFcnJvcih0aGlzLnVybCk7CiAgICAgICAgfQoKICAgICAgICB2YXIgbmV3 SGFuZGxlckluZm8gPSBuZXcgVW5yZXNvbHZlZEhhbmRsZXJJbmZvQnlQYXJh bSh7CiAgICAgICAgICBuYW1lOiBuYW1lLAogICAgICAgICAgaGFuZGxlcjog aGFuZGxlciwKICAgICAgICAgIHBhcmFtczogcmVzdWx0LnBhcmFtcwogICAg ICAgIH0pOwoKICAgICAgICB2YXIgb2xkSGFuZGxlckluZm8gPSBvbGRTdGF0 ZS5oYW5kbGVySW5mb3NbaV07CiAgICAgICAgaWYgKHN0YXRlc0RpZmZlciB8 fCBuZXdIYW5kbGVySW5mby5zaG91bGRTdXBlcmNlZGUob2xkSGFuZGxlcklu Zm8pKSB7CiAgICAgICAgICBzdGF0ZXNEaWZmZXIgPSB0cnVlOwogICAgICAg ICAgbmV3U3RhdGUuaGFuZGxlckluZm9zW2ldID0gbmV3SGFuZGxlckluZm87 CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5ld1N0YXRlLmhhbmRsZXJJ bmZvc1tpXSA9IG9sZEhhbmRsZXJJbmZvOwogICAgICAgIH0KICAgICAgfQoK ICAgICAgbWVyZ2UobmV3U3RhdGUucXVlcnlQYXJhbXMsIHJlc3VsdHMucXVl cnlQYXJhbXMpOwoKICAgICAgcmV0dXJuIG5ld1N0YXRlOwogICAgfTsKCiAg ICAvKioKICAgICAgUHJvbWlzZSByZWplY3QgcmVhc29ucyBwYXNzZWQgdG8g cHJvbWlzZSByZWplY3Rpb24KICAgICAgaGFuZGxlcnMgZm9yIGZhaWxlZCB0 cmFuc2l0aW9ucy4KICAgICAqLwogICAgZnVuY3Rpb24gVW5yZWNvZ25pemVk VVJMRXJyb3IobWVzc2FnZSkgewogICAgICB0aGlzLm1lc3NhZ2UgPSAobWVz c2FnZSB8fCAiVW5yZWNvZ25pemVkVVJMRXJyb3IiKTsKICAgICAgdGhpcy5u YW1lID0gIlVucmVjb2duaXplZFVSTEVycm9yIjsKICAgIH0KCiAgICBfX2V4 cG9ydHNfXy5VUkxUcmFuc2l0aW9uSW50ZW50ID0gVVJMVHJhbnNpdGlvbklu dGVudDsKICB9KTsKZGVmaW5lKCJyb3V0ZXIvdHJhbnNpdGlvbi1zdGF0ZSIs IAogIFsiLi9oYW5kbGVyLWluZm8iLCIuL3V0aWxzIiwicnN2cCIsImV4cG9y dHMiXSwKICBmdW5jdGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZGVwZW5kZW5j eTJfXywgX19kZXBlbmRlbmN5M19fLCBfX2V4cG9ydHNfXykgewogICAgInVz ZSBzdHJpY3QiOwogICAgdmFyIFJlc29sdmVkSGFuZGxlckluZm8gPSBfX2Rl cGVuZGVuY3kxX18uUmVzb2x2ZWRIYW5kbGVySW5mbzsKICAgIHZhciBmb3JF YWNoID0gX19kZXBlbmRlbmN5Ml9fLmZvckVhY2g7CiAgICB2YXIgcHJvbWlz ZUxhYmVsID0gX19kZXBlbmRlbmN5Ml9fLnByb21pc2VMYWJlbDsKICAgIHZh ciByZXNvbHZlID0gX19kZXBlbmRlbmN5M19fLnJlc29sdmU7CiAgICB2YXIg cmVqZWN0ID0gX19kZXBlbmRlbmN5M19fLnJlamVjdDsKCiAgICBmdW5jdGlv biBUcmFuc2l0aW9uU3RhdGUob3RoZXIpIHsKICAgICAgdGhpcy5oYW5kbGVy SW5mb3MgPSBbXTsKICAgICAgdGhpcy5xdWVyeVBhcmFtcyA9IHt9OwogICAg ICB0aGlzLnBhcmFtcyA9IHt9OwogICAgfQoKICAgIFRyYW5zaXRpb25TdGF0 ZS5wcm90b3R5cGUgPSB7CiAgICAgIGhhbmRsZXJJbmZvczogbnVsbCwKICAg ICAgcXVlcnlQYXJhbXM6IG51bGwsCiAgICAgIHBhcmFtczogbnVsbCwKCiAg ICAgIHByb21pc2VMYWJlbDogZnVuY3Rpb24obGFiZWwpIHsKICAgICAgICB2 YXIgdGFyZ2V0TmFtZSA9ICcnOwogICAgICAgIGZvckVhY2godGhpcy5oYW5k bGVySW5mb3MsIGZ1bmN0aW9uKGhhbmRsZXJJbmZvKSB7CiAgICAgICAgICBp ZiAodGFyZ2V0TmFtZSAhPT0gJycpIHsKICAgICAgICAgICAgdGFyZ2V0TmFt ZSArPSAnLic7CiAgICAgICAgICB9CiAgICAgICAgICB0YXJnZXROYW1lICs9 IGhhbmRsZXJJbmZvLm5hbWU7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJu IHByb21pc2VMYWJlbCgiJyIgKyB0YXJnZXROYW1lICsgIic6ICIgKyBsYWJl bCk7CiAgICAgIH0sCgogICAgICByZXNvbHZlOiBmdW5jdGlvbihhc3luYywg c2hvdWxkQ29udGludWUsIHBheWxvYWQpIHsKICAgICAgICB2YXIgc2VsZiA9 IHRoaXM7CiAgICAgICAgLy8gRmlyc3QsIGNhbGN1bGF0ZSBwYXJhbXMgZm9y IHRoaXMgc3RhdGUuIFRoaXMgaXMgdXNlZnVsCiAgICAgICAgLy8gaW5mb3Jt YXRpb24gdG8gcHJvdmlkZSB0byB0aGUgdmFyaW91cyByb3V0ZSBob29rcy4K ICAgICAgICB2YXIgcGFyYW1zID0gdGhpcy5wYXJhbXM7CiAgICAgICAgZm9y RWFjaCh0aGlzLmhhbmRsZXJJbmZvcywgZnVuY3Rpb24oaGFuZGxlckluZm8p IHsKICAgICAgICAgIHBhcmFtc1toYW5kbGVySW5mby5uYW1lXSA9IGhhbmRs ZXJJbmZvLnBhcmFtcyB8fCB7fTsKICAgICAgICB9KTsKCiAgICAgICAgcGF5 bG9hZCA9IHBheWxvYWQgfHwge307CiAgICAgICAgcGF5bG9hZC5yZXNvbHZl SW5kZXggPSAwOwoKICAgICAgICB2YXIgY3VycmVudFN0YXRlID0gdGhpczsK ICAgICAgICB2YXIgd2FzQWJvcnRlZCA9IGZhbHNlOwoKICAgICAgICAvLyBU aGUgcHJlbHVkZSBSU1ZQLnJlc29sdmUoKSBhc3luY3MgdXMgaW50byB0aGUg cHJvbWlzZSBsYW5kLgogICAgICAgIHJldHVybiByZXNvbHZlKG51bGwsIHRo aXMucHJvbWlzZUxhYmVsKCJTdGFydCB0cmFuc2l0aW9uIikpCiAgICAgICAg LnRoZW4ocmVzb2x2ZU9uZUhhbmRsZXJJbmZvLCBudWxsLCB0aGlzLnByb21p c2VMYWJlbCgnUmVzb2x2ZSBoYW5kbGVyJykpWydjYXRjaCddKGhhbmRsZUVy cm9yLCB0aGlzLnByb21pc2VMYWJlbCgnSGFuZGxlIGVycm9yJykpOwoKICAg ICAgICBmdW5jdGlvbiBpbm5lclNob3VsZENvbnRpbnVlKCkgewogICAgICAg ICAgcmV0dXJuIHJlc29sdmUoc2hvdWxkQ29udGludWUoKSwgcHJvbWlzZUxh YmVsKCJDaGVjayBpZiBzaG91bGQgY29udGludWUiKSlbJ2NhdGNoJ10oZnVu Y3Rpb24ocmVhc29uKSB7CiAgICAgICAgICAgIC8vIFdlIGRpc3Rpbmd1aXNo IGJldHdlZW4gZXJyb3JzIHRoYXQgb2NjdXJyZWQKICAgICAgICAgICAgLy8g ZHVyaW5nIHJlc29sdXRpb24gKGUuZy4gYmVmb3JlTW9kZWwvbW9kZWwvYWZ0 ZXJNb2RlbCksCiAgICAgICAgICAgIC8vIGFuZCBhYm9ydHMgZHVlIHRvIGEg cmVqZWN0aW5nIHByb21pc2UgZnJvbSBzaG91bGRDb250aW51ZSgpLgogICAg ICAgICAgICB3YXNBYm9ydGVkID0gdHJ1ZTsKICAgICAgICAgICAgcmV0dXJu IHJlamVjdChyZWFzb24pOwogICAgICAgICAgfSwgcHJvbWlzZUxhYmVsKCJI YW5kbGUgYWJvcnQiKSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBo YW5kbGVFcnJvcihlcnJvcikgewogICAgICAgICAgLy8gVGhpcyBpcyB0aGUg b25seSBwb3NzaWJsZQogICAgICAgICAgLy8gcmVqZWN0IHZhbHVlIG9mIFRy YW5zaXRpb25TdGF0ZSNyZXNvbHZlCiAgICAgICAgICB2YXIgaGFuZGxlcklu Zm9zID0gY3VycmVudFN0YXRlLmhhbmRsZXJJbmZvczsKICAgICAgICAgIHZh ciBlcnJvckhhbmRsZXJJbmRleCA9IHBheWxvYWQucmVzb2x2ZUluZGV4ID49 IGhhbmRsZXJJbmZvcy5sZW5ndGggPwogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgaGFuZGxlckluZm9zLmxlbmd0aCAtIDEgOiBwYXlsb2Fk LnJlc29sdmVJbmRleDsKICAgICAgICAgIHJldHVybiByZWplY3QoewogICAg ICAgICAgICBlcnJvcjogZXJyb3IsCiAgICAgICAgICAgIGhhbmRsZXJXaXRo RXJyb3I6IGN1cnJlbnRTdGF0ZS5oYW5kbGVySW5mb3NbZXJyb3JIYW5kbGVy SW5kZXhdLmhhbmRsZXIsCiAgICAgICAgICAgIHdhc0Fib3J0ZWQ6IHdhc0Fi b3J0ZWQsCiAgICAgICAgICAgIHN0YXRlOiBjdXJyZW50U3RhdGUKICAgICAg ICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcHJvY2VlZChy ZXNvbHZlZEhhbmRsZXJJbmZvKSB7CiAgICAgICAgICAvLyBTd2FwIHRoZSBw cmV2aW91c2x5IHVucmVzb2x2ZWQgaGFuZGxlckluZm8gd2l0aAogICAgICAg ICAgLy8gdGhlIHJlc29sdmVkIGhhbmRsZXJJbmZvCiAgICAgICAgICBjdXJy ZW50U3RhdGUuaGFuZGxlckluZm9zW3BheWxvYWQucmVzb2x2ZUluZGV4Kytd ID0gcmVzb2x2ZWRIYW5kbGVySW5mbzsKCiAgICAgICAgICAvLyBDYWxsIHRo ZSByZWRpcmVjdCBob29rLiBUaGUgcmVhc29uIHdlIGNhbGwgaXQgaGVyZQog ICAgICAgICAgLy8gdnMuIGFmdGVyTW9kZWwgaXMgc28gdGhhdCByZWRpcmVj dHMgaW50byBjaGlsZAogICAgICAgICAgLy8gcm91dGVzIGRvbid0IHJlLXJ1 biB0aGUgbW9kZWwgaG9va3MgZm9yIHRoaXMKICAgICAgICAgIC8vIGFscmVh ZHktcmVzb2x2ZWQgcm91dGUuCiAgICAgICAgICB2YXIgaGFuZGxlciA9IHJl c29sdmVkSGFuZGxlckluZm8uaGFuZGxlcjsKICAgICAgICAgIGlmIChoYW5k bGVyICYmIGhhbmRsZXIucmVkaXJlY3QpIHsKICAgICAgICAgICAgaGFuZGxl ci5yZWRpcmVjdChyZXNvbHZlZEhhbmRsZXJJbmZvLmNvbnRleHQsIHBheWxv YWQpOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIFByb2NlZWQgYWZ0ZXIg ZW5zdXJpbmcgdGhhdCB0aGUgcmVkaXJlY3QgaG9vawogICAgICAgICAgLy8g ZGlkbid0IGFib3J0IHRoaXMgdHJhbnNpdGlvbiBieSB0cmFuc2l0aW9uaW5n IGVsc2V3aGVyZS4KICAgICAgICAgIHJldHVybiBpbm5lclNob3VsZENvbnRp bnVlKCkudGhlbihyZXNvbHZlT25lSGFuZGxlckluZm8sIG51bGwsIHByb21p c2VMYWJlbCgnUmVzb2x2ZSBoYW5kbGVyJykpOwogICAgICAgIH0KCiAgICAg ICAgZnVuY3Rpb24gcmVzb2x2ZU9uZUhhbmRsZXJJbmZvKCkgewogICAgICAg ICAgaWYgKHBheWxvYWQucmVzb2x2ZUluZGV4ID09PSBjdXJyZW50U3RhdGUu aGFuZGxlckluZm9zLmxlbmd0aCkgewogICAgICAgICAgICAvLyBUaGlzIGlz IGlzIHRoZSBvbmx5IHBvc3NpYmxlCiAgICAgICAgICAgIC8vIGZ1bGZpbGwg dmFsdWUgb2YgVHJhbnNpdGlvblN0YXRlI3Jlc29sdmUKICAgICAgICAgICAg cmV0dXJuIHsKICAgICAgICAgICAgICBlcnJvcjogbnVsbCwKICAgICAgICAg ICAgICBzdGF0ZTogY3VycmVudFN0YXRlCiAgICAgICAgICAgIH07CiAgICAg ICAgICB9CgogICAgICAgICAgdmFyIGhhbmRsZXJJbmZvID0gY3VycmVudFN0 YXRlLmhhbmRsZXJJbmZvc1twYXlsb2FkLnJlc29sdmVJbmRleF07CgogICAg ICAgICAgcmV0dXJuIGhhbmRsZXJJbmZvLnJlc29sdmUoYXN5bmMsIGlubmVy U2hvdWxkQ29udGludWUsIHBheWxvYWQpCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAudGhlbihwcm9jZWVkLCBudWxsLCBwcm9taXNlTGFiZWwoJ1By b2NlZWQnKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwoKICAgIF9fZXhw b3J0c19fLlRyYW5zaXRpb25TdGF0ZSA9IFRyYW5zaXRpb25TdGF0ZTsKICB9 KTsKZGVmaW5lKCJyb3V0ZXIvdHJhbnNpdGlvbiIsIAogIFsicnN2cCIsIi4v aGFuZGxlci1pbmZvIiwiLi91dGlscyIsImV4cG9ydHMiXSwKICBmdW5jdGlv bihfX2RlcGVuZGVuY3kxX18sIF9fZGVwZW5kZW5jeTJfXywgX19kZXBlbmRl bmN5M19fLCBfX2V4cG9ydHNfXykgewogICAgInVzZSBzdHJpY3QiOwogICAg dmFyIHJlamVjdCA9IF9fZGVwZW5kZW5jeTFfXy5yZWplY3Q7CiAgICB2YXIg cmVzb2x2ZSA9IF9fZGVwZW5kZW5jeTFfXy5yZXNvbHZlOwogICAgdmFyIFJl c29sdmVkSGFuZGxlckluZm8gPSBfX2RlcGVuZGVuY3kyX18uUmVzb2x2ZWRI YW5kbGVySW5mbzsKICAgIHZhciB0cmlnZ2VyID0gX19kZXBlbmRlbmN5M19f LnRyaWdnZXI7CiAgICB2YXIgc2xpY2UgPSBfX2RlcGVuZGVuY3kzX18uc2xp Y2U7CiAgICB2YXIgbG9nID0gX19kZXBlbmRlbmN5M19fLmxvZzsKICAgIHZh ciBwcm9taXNlTGFiZWwgPSBfX2RlcGVuZGVuY3kzX18ucHJvbWlzZUxhYmVs OwoKICAgIC8qKgogICAgICBAcHJpdmF0ZQoKICAgICAgQSBUcmFuc2l0aW9u IGlzIGEgdGhlbm5hYmxlIChhIHByb21pc2UtbGlrZSBvYmplY3QpIHRoYXQg cmVwcmVzZW50cwogICAgICBhbiBhdHRlbXB0IHRvIHRyYW5zaXRpb24gdG8g YW5vdGhlciByb3V0ZS4gSXQgY2FuIGJlIGFib3J0ZWQsIGVpdGhlcgogICAg ICBleHBsaWNpdGx5IHZpYSBgYWJvcnRgIG9yIGJ5IGF0dGVtcHRpbmcgYW5v dGhlciB0cmFuc2l0aW9uIHdoaWxlIGEKICAgICAgcHJldmlvdXMgb25lIGlz IHN0aWxsIHVuZGVyd2F5LiBBbiBhYm9ydGVkIHRyYW5zaXRpb24gY2FuIGFs c28KICAgICAgYmUgYHJldHJ5KClgZCBsYXRlci4KICAgICAqLwogICAgZnVu Y3Rpb24gVHJhbnNpdGlvbihyb3V0ZXIsIGludGVudCwgc3RhdGUsIGVycm9y KSB7CiAgICAgIHZhciB0cmFuc2l0aW9uID0gdGhpczsKICAgICAgdGhpcy5z dGF0ZSA9IHN0YXRlIHx8IHJvdXRlci5zdGF0ZTsKICAgICAgdGhpcy5pbnRl bnQgPSBpbnRlbnQ7CiAgICAgIHRoaXMucm91dGVyID0gcm91dGVyOwogICAg ICB0aGlzLmRhdGEgPSB0aGlzLmludGVudCAmJiB0aGlzLmludGVudC5kYXRh IHx8IHt9OwogICAgICB0aGlzLnJlc29sdmVkTW9kZWxzID0ge307CiAgICAg IHRoaXMucXVlcnlQYXJhbXMgPSB7fTsKCiAgICAgIGlmIChlcnJvcikgewog ICAgICAgIHRoaXMucHJvbWlzZSA9IHJlamVjdChlcnJvcik7CiAgICAgICAg cmV0dXJuOwogICAgICB9CgogICAgICBpZiAoc3RhdGUpIHsKICAgICAgICB0 aGlzLnBhcmFtcyA9IHN0YXRlLnBhcmFtczsKICAgICAgICB0aGlzLnF1ZXJ5 UGFyYW1zID0gc3RhdGUucXVlcnlQYXJhbXM7CgogICAgICAgIHZhciBsZW4g PSBzdGF0ZS5oYW5kbGVySW5mb3MubGVuZ3RoOwogICAgICAgIGlmIChsZW4p IHsKICAgICAgICAgIHRoaXMudGFyZ2V0TmFtZSA9IHN0YXRlLmhhbmRsZXJJ bmZvc1tzdGF0ZS5oYW5kbGVySW5mb3MubGVuZ3RoLTFdLm5hbWU7CiAgICAg ICAgfQoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7 CiAgICAgICAgICB2YXIgaGFuZGxlckluZm8gPSBzdGF0ZS5oYW5kbGVySW5m b3NbaV07CiAgICAgICAgICBpZiAoIShoYW5kbGVySW5mbyBpbnN0YW5jZW9m IFJlc29sdmVkSGFuZGxlckluZm8pKSB7CiAgICAgICAgICAgIGJyZWFrOwog ICAgICAgICAgfQogICAgICAgICAgdGhpcy5waXZvdEhhbmRsZXIgPSBoYW5k bGVySW5mby5oYW5kbGVyOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5zZXF1 ZW5jZSA9IFRyYW5zaXRpb24uY3VycmVudFNlcXVlbmNlKys7CiAgICAgICAg dGhpcy5wcm9taXNlID0gc3RhdGUucmVzb2x2ZShyb3V0ZXIuYXN5bmMsIGNo ZWNrRm9yQWJvcnQsIHRoaXMpWydjYXRjaCddKGZ1bmN0aW9uKHJlc3VsdCkg ewogICAgICAgICAgaWYgKHJlc3VsdC53YXNBYm9ydGVkKSB7CiAgICAgICAg ICAgIHJldHVybiByZWplY3QobG9nQWJvcnQodHJhbnNpdGlvbikpOwogICAg ICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdHJhbnNpdGlvbi50cmlnZ2Vy KCdlcnJvcicsIHJlc3VsdC5lcnJvciwgdHJhbnNpdGlvbiwgcmVzdWx0Lmhh bmRsZXJXaXRoRXJyb3IpOwogICAgICAgICAgICB0cmFuc2l0aW9uLmFib3J0 KCk7CiAgICAgICAgICAgIHJldHVybiByZWplY3QocmVzdWx0LmVycm9yKTsK ICAgICAgICAgIH0KICAgICAgICB9LCBwcm9taXNlTGFiZWwoJ0hhbmRsZSBB Ym9ydCcpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnByb21pc2Ug PSByZXNvbHZlKHRoaXMuc3RhdGUpOwogICAgICAgIHRoaXMucGFyYW1zID0g e307CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGNoZWNrRm9yQWJvcnQoKSB7 CiAgICAgICAgaWYgKHRyYW5zaXRpb24uaXNBYm9ydGVkKSB7CiAgICAgICAg ICByZXR1cm4gcmVqZWN0KHVuZGVmaW5lZCwgcHJvbWlzZUxhYmVsKCJUcmFu c2l0aW9uIGFib3J0ZWQgLSByZWplY3QiKSk7CiAgICAgICAgfQogICAgICB9 CiAgICB9CgogICAgVHJhbnNpdGlvbi5jdXJyZW50U2VxdWVuY2UgPSAwOwoK ICAgIFRyYW5zaXRpb24ucHJvdG90eXBlID0gewogICAgICB0YXJnZXROYW1l OiBudWxsLAogICAgICB1cmxNZXRob2Q6ICd1cGRhdGUnLAogICAgICBpbnRl bnQ6IG51bGwsCiAgICAgIHBhcmFtczogbnVsbCwKICAgICAgcGl2b3RIYW5k bGVyOiBudWxsLAogICAgICByZXNvbHZlSW5kZXg6IDAsCiAgICAgIGhhbmRs ZXJJbmZvczogbnVsbCwKICAgICAgcmVzb2x2ZWRNb2RlbHM6IG51bGwsCiAg ICAgIGlzQWN0aXZlOiB0cnVlLAogICAgICBzdGF0ZTogbnVsbCwKCiAgICAg IC8qKgogICAgICAgIEBwdWJsaWMKCiAgICAgICAgVGhlIFRyYW5zaXRpb24n cyBpbnRlcm5hbCBwcm9taXNlLiBDYWxsaW5nIGAudGhlbmAgb24gdGhpcyBw cm9wZXJ0eQogICAgICAgIGlzIHRoYXQgc2FtZSBhcyBjYWxsaW5nIGAudGhl bmAgb24gdGhlIFRyYW5zaXRpb24gb2JqZWN0IGl0c2VsZiwgYnV0CiAgICAg ICAgdGhpcyBwcm9wZXJ0eSBpcyBleHBvc2VkIGZvciB3aGVuIHlvdSB3YW50 IHRvIHBhc3MgYXJvdW5kIGEKICAgICAgICBUcmFuc2l0aW9uJ3MgcHJvbWlz ZSwgYnV0IG5vdCB0aGUgVHJhbnNpdGlvbiBvYmplY3QgaXRzZWxmLCBzaW5j ZQogICAgICAgIFRyYW5zaXRpb24gb2JqZWN0IGNhbiBiZSBleHRlcm5hbGx5 IGBhYm9ydGBlZCwgd2hpbGUgdGhlIHByb21pc2UKICAgICAgICBjYW5ub3Qu CiAgICAgICAqLwogICAgICBwcm9taXNlOiBudWxsLAoKICAgICAgLyoqCiAg ICAgICAgQHB1YmxpYwoKICAgICAgICBDdXN0b20gc3RhdGUgY2FuIGJlIHN0 b3JlZCBvbiBhIFRyYW5zaXRpb24ncyBgZGF0YWAgb2JqZWN0LgogICAgICAg IFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgZGVjb3JhdGluZyBhIFRyYW5zaXRp b24gd2l0aGluIGFuIGVhcmxpZXIKICAgICAgICBob29rIGFuZCBzaGFyZWQg d2l0aCBhIGxhdGVyIGhvb2suIFByb3BlcnRpZXMgc2V0IG9uIGBkYXRhYCB3 aWxsCiAgICAgICAgYmUgY29waWVkIHRvIG5ldyB0cmFuc2l0aW9ucyBnZW5l cmF0ZWQgYnkgY2FsbGluZyBgcmV0cnlgIG9uIHRoaXMKICAgICAgICB0cmFu c2l0aW9uLgogICAgICAgKi8KICAgICAgZGF0YTogbnVsbCwKCiAgICAgIC8q KgogICAgICAgIEBwdWJsaWMKCiAgICAgICAgQSBzdGFuZGFyZCBwcm9taXNl IGhvb2sgdGhhdCByZXNvbHZlcyBpZiB0aGUgdHJhbnNpdGlvbgogICAgICAg IHN1Y2NlZWRzIGFuZCByZWplY3RzIGlmIGl0IGZhaWxzL3JlZGlyZWN0cy9h Ym9ydHMuCgogICAgICAgIEZvcndhcmRzIHRvIHRoZSBpbnRlcm5hbCBgcHJv bWlzZWAgcHJvcGVydHkgd2hpY2ggeW91IGNhbgogICAgICAgIHVzZSBpbiBz aXR1YXRpb25zIHdoZXJlIHlvdSB3YW50IHRvIHBhc3MgYXJvdW5kIGEgdGhl bm5hYmxlLAogICAgICAgIGJ1dCBub3QgdGhlIFRyYW5zaXRpb24gaXRzZWxm LgoKICAgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBzdWNjZXNzCiAgICAgICAg QHBhcmFtIHtGdW5jdGlvbn0gZmFpbHVyZQogICAgICAgKi8KICAgICAgdGhl bjogZnVuY3Rpb24oc3VjY2VzcywgZmFpbHVyZSkgewogICAgICAgIHJldHVy biB0aGlzLnByb21pc2UudGhlbihzdWNjZXNzLCBmYWlsdXJlKTsKICAgICAg fSwKCiAgICAgIC8qKgogICAgICAgIEBwdWJsaWMKCiAgICAgICAgQWJvcnRz IHRoZSBUcmFuc2l0aW9uLiBOb3RlIHlvdSBjYW4gYWxzbyBpbXBsaWNpdGx5 IGFib3J0IGEgdHJhbnNpdGlvbgogICAgICAgIGJ5IGluaXRpYXRpbmcgYW5v dGhlciB0cmFuc2l0aW9uIHdoaWxlIGEgcHJldmlvdXMgb25lIGlzIHVuZGVy d2F5LgogICAgICAgKi8KICAgICAgYWJvcnQ6IGZ1bmN0aW9uKCkgewogICAg ICAgIGlmICh0aGlzLmlzQWJvcnRlZCkgeyByZXR1cm4gdGhpczsgfQogICAg ICAgIGxvZyh0aGlzLnJvdXRlciwgdGhpcy5zZXF1ZW5jZSwgdGhpcy50YXJn ZXROYW1lICsgIjogdHJhbnNpdGlvbiB3YXMgYWJvcnRlZCIpOwogICAgICAg IHRoaXMuaXNBYm9ydGVkID0gdHJ1ZTsKICAgICAgICB0aGlzLmlzQWN0aXZl ID0gZmFsc2U7CiAgICAgICAgdGhpcy5yb3V0ZXIuYWN0aXZlVHJhbnNpdGlv biA9IG51bGw7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0sCgogICAg ICAvKioKICAgICAgICBAcHVibGljCgogICAgICAgIFJldHJpZXMgYSBwcmV2 aW91c2x5LWFib3J0ZWQgdHJhbnNpdGlvbiAobWFraW5nIHN1cmUgdG8gYWJv cnQgdGhlCiAgICAgICAgdHJhbnNpdGlvbiBpZiBpdCdzIHN0aWxsIGFjdGl2 ZSkuIFJldHVybnMgYSBuZXcgdHJhbnNpdGlvbiB0aGF0CiAgICAgICAgcmVw cmVzZW50cyB0aGUgbmV3IGF0dGVtcHQgdG8gdHJhbnNpdGlvbi4KICAgICAg ICovCiAgICAgIHJldHJ5OiBmdW5jdGlvbigpIHsKICAgICAgICAvLyBUT0RP OiBhZGQgdGVzdHMgZm9yIG1lcmdlZCBzdGF0ZSByZXRyeSgpcwogICAgICAg IHRoaXMuYWJvcnQoKTsKICAgICAgICByZXR1cm4gdGhpcy5yb3V0ZXIudHJh bnNpdGlvbkJ5SW50ZW50KHRoaXMuaW50ZW50LCBmYWxzZSk7CiAgICAgIH0s CgogICAgICAvKioKICAgICAgICBAcHVibGljCgogICAgICAgIFNldHMgdGhl IFVSTC1jaGFuZ2luZyBtZXRob2QgdG8gYmUgZW1wbG95ZWQgYXQgdGhlIGVu ZCBvZiBhCiAgICAgICAgc3VjY2Vzc2Z1bCB0cmFuc2l0aW9uLiBCeSBkZWZh dWx0LCBhIG5ldyBUcmFuc2l0aW9uIHdpbGwganVzdAogICAgICAgIHVzZSBg dXBkYXRlVVJMYCwgYnV0IHBhc3NpbmcgJ3JlcGxhY2UnIHRvIHRoaXMgbWV0 aG9kIHdpbGwKICAgICAgICBjYXVzZSB0aGUgVVJMIHRvIHVwZGF0ZSB1c2lu ZyAncmVwbGFjZVdpdGgnIGluc3RlYWQuIE9taXR0aW5nCiAgICAgICAgYSBw YXJhbWV0ZXIgd2lsbCBkaXNhYmxlIHRoZSBVUkwgY2hhbmdlLCBhbGxvd2lu ZyBmb3IgdHJhbnNpdGlvbnMKICAgICAgICB0aGF0IGRvbid0IHVwZGF0ZSB0 aGUgVVJMIGF0IGNvbXBsZXRpb24gKHRoaXMgaXMgYWxzbyB1c2VkIGZvcgog ICAgICAgIGhhbmRsZVVSTCwgc2luY2UgdGhlIFVSTCBoYXMgYWxyZWFkeSBj aGFuZ2VkIGJlZm9yZSB0aGUKICAgICAgICB0cmFuc2l0aW9uIHRvb2sgcGxh Y2UpLgoKICAgICAgICBAcGFyYW0ge1N0cmluZ30gbWV0aG9kIHRoZSB0eXBl IG9mIFVSTC1jaGFuZ2luZyBtZXRob2QgdG8gdXNlCiAgICAgICAgICBhdCB0 aGUgZW5kIG9mIGEgdHJhbnNpdGlvbi4gQWNjZXB0ZWQgdmFsdWVzIGFyZSAn cmVwbGFjZScsCiAgICAgICAgICBmYWxzeSB2YWx1ZXMsIG9yIGFueSBvdGhl ciBub24tZmFsc3kgdmFsdWUgKHdoaWNoIGlzCiAgICAgICAgICBpbnRlcnBy ZXRlZCBhcyBhbiB1cGRhdGVVUkwgdHJhbnNpdGlvbikuCgogICAgICAgIEBy ZXR1cm4ge1RyYW5zaXRpb259IHRoaXMgdHJhbnNpdGlvbgogICAgICAgKi8K ICAgICAgbWV0aG9kOiBmdW5jdGlvbihtZXRob2QpIHsKICAgICAgICB0aGlz LnVybE1ldGhvZCA9IG1ldGhvZDsKICAgICAgICByZXR1cm4gdGhpczsKICAg ICAgfSwKCiAgICAgIC8qKgogICAgICAgIEBwdWJsaWMKCiAgICAgICAgRmly ZXMgYW4gZXZlbnQgb24gdGhlIGN1cnJlbnQgbGlzdCBvZiByZXNvbHZlZC9y ZXNvbHZpbmcKICAgICAgICBoYW5kbGVycyB3aXRoaW4gdGhpcyB0cmFuc2l0 aW9uLiBVc2VmdWwgZm9yIGZpcmluZyBldmVudHMKICAgICAgICBvbiByb3V0 ZSBoaWVyYXJjaGllcyB0aGF0IGhhdmVuJ3QgZnVsbHkgYmVlbiBlbnRlcmVk IHlldC4KCiAgICAgICAgTm90ZTogVGhpcyBtZXRob2QgaXMgYWxzbyBhbGlh c2VkIGFzIGBzZW5kYAoKICAgICAgICBAcGFyYW0ge0Jvb2xlYW59IFtpZ25v cmVGYWlsdXJlPWZhbHNlXSBhIGJvb2xlYW4gc3BlY2lmeWluZyB3aGV0aGVy IHVuaGFuZGxlZCBldmVudHMgdGhyb3cgYW4gZXJyb3IKICAgICAgICBAcGFy YW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gZmly ZQogICAgICAgKi8KICAgICAgdHJpZ2dlcjogZnVuY3Rpb24gKGlnbm9yZUZh aWx1cmUpIHsKICAgICAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1l bnRzKTsKICAgICAgICBpZiAodHlwZW9mIGlnbm9yZUZhaWx1cmUgPT09ICdi b29sZWFuJykgewogICAgICAgICAgYXJncy5zaGlmdCgpOwogICAgICAgIH0g ZWxzZSB7CiAgICAgICAgICAvLyBUaHJvdyBlcnJvcnMgb24gdW5oYW5kbGVk IHRyaWdnZXIgZXZlbnRzIGJ5IGRlZmF1bHQKICAgICAgICAgIGlnbm9yZUZh aWx1cmUgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgdHJpZ2dlcih0aGlz LnJvdXRlciwgdGhpcy5zdGF0ZS5oYW5kbGVySW5mb3Muc2xpY2UoMCwgdGhp cy5yZXNvbHZlSW5kZXggKyAxKSwgaWdub3JlRmFpbHVyZSwgYXJncyk7CiAg ICAgIH0sCgogICAgICAvKioKICAgICAgICBAcHVibGljCgogICAgICAgIFRy YW5zaXRpb25zIGFyZSBhYm9ydGVkIGFuZCB0aGVpciBwcm9taXNlcyByZWpl Y3RlZAogICAgICAgIHdoZW4gcmVkaXJlY3RzIG9jY3VyOyB0aGlzIG1ldGhv ZCByZXR1cm5zIGEgcHJvbWlzZQogICAgICAgIHRoYXQgd2lsbCBmb2xsb3cg YW55IHJlZGlyZWN0cyB0aGF0IG9jY3VyIGFuZCBmdWxmaWxsCiAgICAgICAg d2l0aCB0aGUgdmFsdWUgZnVsZmlsbGVkIGJ5IGFueSByZWRpcmVjdGluZyB0 cmFuc2l0aW9ucwogICAgICAgIHRoYXQgb2NjdXIuCgogICAgICAgIEByZXR1 cm4ge1Byb21pc2V9IGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIHdpdGggdGhl IHNhbWUKICAgICAgICAgIHZhbHVlIHRoYXQgdGhlIGZpbmFsIHJlZGlyZWN0 aW5nIHRyYW5zaXRpb24gZnVsZmlsbHMgd2l0aAogICAgICAgKi8KICAgICAg Zm9sbG93UmVkaXJlY3RzOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgcm91 dGVyID0gdGhpcy5yb3V0ZXI7CiAgICAgICAgcmV0dXJuIHRoaXMucHJvbWlz ZVsnY2F0Y2gnXShmdW5jdGlvbihyZWFzb24pIHsKICAgICAgICAgIGlmIChy b3V0ZXIuYWN0aXZlVHJhbnNpdGlvbikgewogICAgICAgICAgICByZXR1cm4g cm91dGVyLmFjdGl2ZVRyYW5zaXRpb24uZm9sbG93UmVkaXJlY3RzKCk7CiAg ICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcmVqZWN0KHJlYXNvbik7CiAg ICAgICAgfSk7CiAgICAgIH0sCgogICAgICB0b1N0cmluZzogZnVuY3Rpb24o KSB7CiAgICAgICAgcmV0dXJuICJUcmFuc2l0aW9uIChzZXF1ZW5jZSAiICsg dGhpcy5zZXF1ZW5jZSArICIpIjsKICAgICAgfSwKCiAgICAgIC8qKgogICAg ICAgIEBwcml2YXRlCiAgICAgICAqLwogICAgICBsb2c6IGZ1bmN0aW9uKG1l c3NhZ2UpIHsKICAgICAgICBsb2codGhpcy5yb3V0ZXIsIHRoaXMuc2VxdWVu Y2UsIG1lc3NhZ2UpOwogICAgICB9CiAgICB9OwoKICAgIC8vIEFsaWFzICd0 cmlnZ2VyJyBhcyAnc2VuZCcKICAgIFRyYW5zaXRpb24ucHJvdG90eXBlLnNl bmQgPSBUcmFuc2l0aW9uLnByb3RvdHlwZS50cmlnZ2VyOwoKICAgIC8qKgog ICAgICBAcHJpdmF0ZQoKICAgICAgTG9ncyBhbmQgcmV0dXJucyBhIFRyYW5z aXRpb25BYm9ydGVkIGVycm9yLgogICAgICovCiAgICBmdW5jdGlvbiBsb2dB Ym9ydCh0cmFuc2l0aW9uKSB7CiAgICAgIGxvZyh0cmFuc2l0aW9uLnJvdXRl ciwgdHJhbnNpdGlvbi5zZXF1ZW5jZSwgImRldGVjdGVkIGFib3J0LiIpOwog ICAgICByZXR1cm4gbmV3IFRyYW5zaXRpb25BYm9ydGVkKCk7CiAgICB9Cgog ICAgZnVuY3Rpb24gVHJhbnNpdGlvbkFib3J0ZWQobWVzc2FnZSkgewogICAg ICB0aGlzLm1lc3NhZ2UgPSAobWVzc2FnZSB8fCAiVHJhbnNpdGlvbkFib3J0 ZWQiKTsKICAgICAgdGhpcy5uYW1lID0gIlRyYW5zaXRpb25BYm9ydGVkIjsK ICAgIH0KCiAgICBfX2V4cG9ydHNfXy5UcmFuc2l0aW9uID0gVHJhbnNpdGlv bjsKICAgIF9fZXhwb3J0c19fLmxvZ0Fib3J0ID0gbG9nQWJvcnQ7CiAgICBf X2V4cG9ydHNfXy5UcmFuc2l0aW9uQWJvcnRlZCA9IFRyYW5zaXRpb25BYm9y dGVkOwogIH0pOwpkZWZpbmUoInJvdXRlci91dGlscyIsIAogIFsiZXhwb3J0 cyJdLAogIGZ1bmN0aW9uKF9fZXhwb3J0c19fKSB7CiAgICAidXNlIHN0cmlj dCI7CiAgICB2YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7Cgog ICAgZnVuY3Rpb24gaXNBcnJheSh0ZXN0KSB7CiAgICAgIHJldHVybiBPYmpl Y3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGVzdCkgPT09ICJbb2JqZWN0 IEFycmF5XSI7CiAgICB9CgogICAgZnVuY3Rpb24gbWVyZ2UoaGFzaCwgb3Ro ZXIpIHsKICAgICAgZm9yICh2YXIgcHJvcCBpbiBvdGhlcikgewogICAgICAg IGlmIChvdGhlci5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgeyBoYXNoW3Byb3Bd ID0gb3RoZXJbcHJvcF07IH0KICAgICAgfQogICAgfQoKICAgIHZhciBvQ3Jl YXRlID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbihwcm90bykgewogICAg ICBmdW5jdGlvbiBGKCkge30KICAgICAgRi5wcm90b3R5cGUgPSBwcm90bzsK ICAgICAgcmV0dXJuIG5ldyBGKCk7CiAgICB9OwoKICAgIC8qKgogICAgICBA cHJpdmF0ZQoKICAgICAgRXh0cmFjdHMgcXVlcnkgcGFyYW1zIGZyb20gdGhl IGVuZCBvZiBhbiBhcnJheQogICAgKiovCiAgICBmdW5jdGlvbiBleHRyYWN0 UXVlcnlQYXJhbXMoYXJyYXkpIHsKICAgICAgdmFyIGxlbiA9IChhcnJheSAm JiBhcnJheS5sZW5ndGgpLCBoZWFkLCBxdWVyeVBhcmFtczsKCiAgICAgIGlm KGxlbiAmJiBsZW4gPiAwICYmIGFycmF5W2xlbiAtIDFdICYmIGFycmF5W2xl biAtIDFdLmhhc093blByb3BlcnR5KCdxdWVyeVBhcmFtcycpKSB7CiAgICAg ICAgcXVlcnlQYXJhbXMgPSBhcnJheVtsZW4gLSAxXS5xdWVyeVBhcmFtczsK ICAgICAgICBoZWFkID0gc2xpY2UuY2FsbChhcnJheSwgMCwgbGVuIC0gMSk7 CiAgICAgICAgcmV0dXJuIFtoZWFkLCBxdWVyeVBhcmFtc107CiAgICAgIH0g ZWxzZSB7CiAgICAgICAgcmV0dXJuIFthcnJheSwgbnVsbF07CiAgICAgIH0K ICAgIH0KCiAgICAvKioKICAgICAgQHByaXZhdGUKCiAgICAgIENvZXJjZXMg cXVlcnkgcGFyYW0gcHJvcGVydGllcyBhbmQgYXJyYXkgZWxlbWVudHMgaW50 byBzdHJpbmdzLgogICAgKiovCiAgICBmdW5jdGlvbiBjb2VyY2VRdWVyeVBh cmFtc1RvU3RyaW5nKHF1ZXJ5UGFyYW1zKSB7CiAgICAgIGZvciAodmFyIGtl eSBpbiBxdWVyeVBhcmFtcykgewogICAgICAgIGlmICh0eXBlb2YgcXVlcnlQ YXJhbXNba2V5XSA9PT0gJ251bWJlcicpIHsKICAgICAgICAgIHF1ZXJ5UGFy YW1zW2tleV0gPSAnJyArIHF1ZXJ5UGFyYW1zW2tleV07CiAgICAgICAgfSBl bHNlIGlmIChpc0FycmF5KHF1ZXJ5UGFyYW1zW2tleV0pKSB7CiAgICAgICAg ICBmb3IgKHZhciBpID0gMCwgbCA9IHF1ZXJ5UGFyYW1zW2tleV0ubGVuZ3Ro OyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zW2tleV1b aV0gPSAnJyArIHF1ZXJ5UGFyYW1zW2tleV1baV07CiAgICAgICAgICB9CiAg ICAgICAgfQogICAgICB9CiAgICB9CiAgICAvKioKICAgICAgQHByaXZhdGUK ICAgICAqLwogICAgZnVuY3Rpb24gbG9nKHJvdXRlciwgc2VxdWVuY2UsIG1z ZykgewogICAgICBpZiAoIXJvdXRlci5sb2cpIHsgcmV0dXJuOyB9CgogICAg ICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykgewogICAgICAgIHJvdXRl ci5sb2coIlRyYW5zaXRpb24gIyIgKyBzZXF1ZW5jZSArICI6ICIgKyBtc2cp OwogICAgICB9IGVsc2UgewogICAgICAgIG1zZyA9IHNlcXVlbmNlOwogICAg ICAgIHJvdXRlci5sb2cobXNnKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0 aW9uIGJpbmQoZm4sIGNvbnRleHQpIHsKICAgICAgdmFyIGJvdW5kQXJncyA9 IGFyZ3VtZW50czsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7CiAg ICAgICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGJvdW5kQXJncywgMik7CiAg ICAgICAgYXJncy5wdXNoKHZhbHVlKTsKICAgICAgICByZXR1cm4gZm4uYXBw bHkoY29udGV4dCwgYXJncyk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rp b24gaXNQYXJhbShvYmplY3QpIHsKICAgICAgcmV0dXJuICh0eXBlb2Ygb2Jq ZWN0ID09PSAic3RyaW5nIiB8fCBvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcg fHwgdHlwZW9mIG9iamVjdCA9PT0gIm51bWJlciIgfHwgb2JqZWN0IGluc3Rh bmNlb2YgTnVtYmVyKTsKICAgIH0KCgogICAgZnVuY3Rpb24gZm9yRWFjaChh cnJheSwgY2FsbGJhY2spIHsKICAgICAgZm9yICh2YXIgaT0wLCBsPWFycmF5 Lmxlbmd0aDsgaTxsICYmIGZhbHNlICE9PSBjYWxsYmFjayhhcnJheVtpXSk7 IGkrKykgeyB9CiAgICB9CgogICAgLyoqCiAgICAgIEBwcml2YXRlCgogICAg ICBTZXJpYWxpemVzIGEgaGFuZGxlciB1c2luZyBpdHMgY3VzdG9tIGBzZXJp YWxpemVgIG1ldGhvZCBvcgogICAgICBieSBhIGRlZmF1bHQgdGhhdCBsb29r cyB1cCB0aGUgZXhwZWN0ZWQgcHJvcGVydHkgbmFtZSBmcm9tCiAgICAgIHRo ZSBkeW5hbWljIHNlZ21lbnQuCgogICAgICBAcGFyYW0ge09iamVjdH0gaGFu ZGxlciBhIHJvdXRlciBoYW5kbGVyCiAgICAgIEBwYXJhbSB7T2JqZWN0fSBt b2RlbCB0aGUgbW9kZWwgdG8gYmUgc2VyaWFsaXplZCBmb3IgdGhpcyBoYW5k bGVyCiAgICAgIEBwYXJhbSB7QXJyYXlbT2JqZWN0XX0gbmFtZXMgdGhlIG5h bWVzIGFycmF5IGF0dGFjaGVkIHRvIGFuCiAgICAgICAgaGFuZGxlciBvYmpl Y3QgcmV0dXJuZWQgZnJvbSByb3V0ZXIucmVjb2duaXplci5oYW5kbGVyc0Zv cigpCiAgICAqLwogICAgZnVuY3Rpb24gc2VyaWFsaXplKGhhbmRsZXIsIG1v ZGVsLCBuYW1lcykgewogICAgICB2YXIgb2JqZWN0ID0ge307CiAgICAgIGlm IChpc1BhcmFtKG1vZGVsKSkgewogICAgICAgIG9iamVjdFtuYW1lc1swXV0g PSBtb2RlbDsKICAgICAgICByZXR1cm4gb2JqZWN0OwogICAgICB9CgogICAg ICAvLyBVc2UgY3VzdG9tIHNlcmlhbGl6ZSBpZiBpdCBleGlzdHMuCiAgICAg IGlmIChoYW5kbGVyLnNlcmlhbGl6ZSkgewogICAgICAgIHJldHVybiBoYW5k bGVyLnNlcmlhbGl6ZShtb2RlbCwgbmFtZXMpOwogICAgICB9CgogICAgICBp ZiAobmFtZXMubGVuZ3RoICE9PSAxKSB7IHJldHVybjsgfQoKICAgICAgdmFy IG5hbWUgPSBuYW1lc1swXTsKCiAgICAgIGlmICgvX2lkJC8udGVzdChuYW1l KSkgewogICAgICAgIG9iamVjdFtuYW1lXSA9IG1vZGVsLmlkOwogICAgICB9 IGVsc2UgewogICAgICAgIG9iamVjdFtuYW1lXSA9IG1vZGVsOwogICAgICB9 CiAgICAgIHJldHVybiBvYmplY3Q7CiAgICB9CgogICAgZnVuY3Rpb24gdHJp Z2dlcihyb3V0ZXIsIGhhbmRsZXJJbmZvcywgaWdub3JlRmFpbHVyZSwgYXJn cykgewogICAgICBpZiAocm91dGVyLnRyaWdnZXJFdmVudCkgewogICAgICAg IHJvdXRlci50cmlnZ2VyRXZlbnQoaGFuZGxlckluZm9zLCBpZ25vcmVGYWls dXJlLCBhcmdzKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHZh ciBuYW1lID0gYXJncy5zaGlmdCgpOwoKICAgICAgaWYgKCFoYW5kbGVySW5m b3MpIHsKICAgICAgICBpZiAoaWdub3JlRmFpbHVyZSkgeyByZXR1cm47IH0K ICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNvdWxkIG5vdCB0cmlnZ2VyIGV2 ZW50ICciICsgbmFtZSArICInLiBUaGVyZSBhcmUgbm8gYWN0aXZlIGhhbmRs ZXJzIik7CiAgICAgIH0KCiAgICAgIHZhciBldmVudFdhc0hhbmRsZWQgPSBm YWxzZTsKCiAgICAgIGZvciAodmFyIGk9aGFuZGxlckluZm9zLmxlbmd0aC0x OyBpPj0wOyBpLS0pIHsKICAgICAgICB2YXIgaGFuZGxlckluZm8gPSBoYW5k bGVySW5mb3NbaV0sCiAgICAgICAgICAgIGhhbmRsZXIgPSBoYW5kbGVySW5m by5oYW5kbGVyOwoKICAgICAgICBpZiAoaGFuZGxlci5ldmVudHMgJiYgaGFu ZGxlci5ldmVudHNbbmFtZV0pIHsKICAgICAgICAgIGlmIChoYW5kbGVyLmV2 ZW50c1tuYW1lXS5hcHBseShoYW5kbGVyLCBhcmdzKSA9PT0gdHJ1ZSkgewog ICAgICAgICAgICBldmVudFdhc0hhbmRsZWQgPSB0cnVlOwogICAgICAgICAg fSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAg ICAgIH0KICAgICAgfQoKICAgICAgaWYgKCFldmVudFdhc0hhbmRsZWQgJiYg IWlnbm9yZUZhaWx1cmUpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk5v dGhpbmcgaGFuZGxlZCB0aGUgZXZlbnQgJyIgKyBuYW1lICsgIicuIik7CiAg ICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBnZXRDaGFuZ2VsaXN0KG9sZE9i amVjdCwgbmV3T2JqZWN0KSB7CiAgICAgIHZhciBrZXk7CiAgICAgIHZhciBy ZXN1bHRzID0gewogICAgICAgIGFsbDoge30sCiAgICAgICAgY2hhbmdlZDog e30sCiAgICAgICAgcmVtb3ZlZDoge30KICAgICAgfTsKCiAgICAgIG1lcmdl KHJlc3VsdHMuYWxsLCBuZXdPYmplY3QpOwoKICAgICAgdmFyIGRpZENoYW5n ZSA9IGZhbHNlOwogICAgICBjb2VyY2VRdWVyeVBhcmFtc1RvU3RyaW5nKG9s ZE9iamVjdCk7CiAgICAgIGNvZXJjZVF1ZXJ5UGFyYW1zVG9TdHJpbmcobmV3 T2JqZWN0KTsKCiAgICAgIC8vIENhbGN1bGF0ZSByZW1vdmFscwogICAgICBm b3IgKGtleSBpbiBvbGRPYmplY3QpIHsKICAgICAgICBpZiAob2xkT2JqZWN0 Lmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgIGlmICghbmV3T2Jq ZWN0Lmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgZGlkQ2hh bmdlID0gdHJ1ZTsKICAgICAgICAgICAgcmVzdWx0cy5yZW1vdmVkW2tleV0g PSBvbGRPYmplY3Rba2V5XTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAg IH0KCiAgICAgIC8vIENhbGN1bGF0ZSBjaGFuZ2VzCiAgICAgIGZvciAoa2V5 IGluIG5ld09iamVjdCkgewogICAgICAgIGlmIChuZXdPYmplY3QuaGFzT3du UHJvcGVydHkoa2V5KSkgewogICAgICAgICAgaWYgKGlzQXJyYXkob2xkT2Jq ZWN0W2tleV0pICYmIGlzQXJyYXkobmV3T2JqZWN0W2tleV0pKSB7CiAgICAg ICAgICAgIGlmIChvbGRPYmplY3Rba2V5XS5sZW5ndGggIT09IG5ld09iamVj dFtrZXldLmxlbmd0aCkgewogICAgICAgICAgICAgIHJlc3VsdHMuY2hhbmdl ZFtrZXldID0gbmV3T2JqZWN0W2tleV07CiAgICAgICAgICAgICAgZGlkQ2hh bmdlID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAg ICBmb3IgKHZhciBpID0gMCwgbCA9IG9sZE9iamVjdFtrZXldLmxlbmd0aDsg aSA8IGw7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKG9sZE9iamVjdFtr ZXldW2ldICE9PSBuZXdPYmplY3Rba2V5XVtpXSkgewogICAgICAgICAgICAg ICAgICByZXN1bHRzLmNoYW5nZWRba2V5XSA9IG5ld09iamVjdFtrZXldOwog ICAgICAgICAgICAgICAgICBkaWRDaGFuZ2UgPSB0cnVlOwogICAgICAgICAg ICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAg ICAgfQogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmIChvbGRPYmpl Y3Rba2V5XSAhPT0gbmV3T2JqZWN0W2tleV0pIHsKICAgICAgICAgICAgICBy ZXN1bHRzLmNoYW5nZWRba2V5XSA9IG5ld09iamVjdFtrZXldOwogICAgICAg ICAgICAgIGRpZENoYW5nZSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAg ICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBkaWRDaGFu Z2UgJiYgcmVzdWx0czsKICAgIH0KCiAgICBmdW5jdGlvbiBwcm9taXNlTGFi ZWwobGFiZWwpIHsKICAgICAgcmV0dXJuICdSb3V0ZXI6ICcgKyBsYWJlbDsK ICAgIH0KCiAgICBfX2V4cG9ydHNfXy50cmlnZ2VyID0gdHJpZ2dlcjsKICAg IF9fZXhwb3J0c19fLmxvZyA9IGxvZzsKICAgIF9fZXhwb3J0c19fLm9DcmVh dGUgPSBvQ3JlYXRlOwogICAgX19leHBvcnRzX18ubWVyZ2UgPSBtZXJnZTsK ICAgIF9fZXhwb3J0c19fLmV4dHJhY3RRdWVyeVBhcmFtcyA9IGV4dHJhY3RR dWVyeVBhcmFtczsKICAgIF9fZXhwb3J0c19fLmJpbmQgPSBiaW5kOwogICAg X19leHBvcnRzX18uaXNQYXJhbSA9IGlzUGFyYW07CiAgICBfX2V4cG9ydHNf Xy5mb3JFYWNoID0gZm9yRWFjaDsKICAgIF9fZXhwb3J0c19fLnNsaWNlID0g c2xpY2U7CiAgICBfX2V4cG9ydHNfXy5zZXJpYWxpemUgPSBzZXJpYWxpemU7 CiAgICBfX2V4cG9ydHNfXy5nZXRDaGFuZ2VsaXN0ID0gZ2V0Q2hhbmdlbGlz dDsKICAgIF9fZXhwb3J0c19fLmNvZXJjZVF1ZXJ5UGFyYW1zVG9TdHJpbmcg PSBjb2VyY2VRdWVyeVBhcmFtc1RvU3RyaW5nOwogICAgX19leHBvcnRzX18u cHJvbWlzZUxhYmVsID0gcHJvbWlzZUxhYmVsOwogIH0pOwpkZWZpbmUoInJv dXRlciIsIAogIFsiLi9yb3V0ZXIvcm91dGVyIiwiZXhwb3J0cyJdLAogIGZ1 bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19leHBvcnRzX18pIHsKICAgICJ1 c2Ugc3RyaWN0IjsKICAgIHZhciBSb3V0ZXIgPSBfX2RlcGVuZGVuY3kxX18u Um91dGVyOwoKICAgIF9fZXhwb3J0c19fLlJvdXRlciA9IFJvdXRlcjsKICB9 KTsKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewovKioKQG1vZHVsZSBlbWJlcgpA c3VibW9kdWxlIGVtYmVyLXJvdXRpbmcKKi8KCmZ1bmN0aW9uIERTTChuYW1l KSB7CiAgdGhpcy5wYXJlbnQgPSBuYW1lOwogIHRoaXMubWF0Y2hlcyA9IFtd Owp9CgpEU0wucHJvdG90eXBlID0gewogIHJlc291cmNlOiBmdW5jdGlvbihu YW1lLCBvcHRpb25zLCBjYWxsYmFjaykgewogICAgaWYgKGFyZ3VtZW50cy5s ZW5ndGggPT09IDIgJiYgdHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicp IHsKICAgICAgY2FsbGJhY2sgPSBvcHRpb25zOwogICAgICBvcHRpb25zID0g e307CiAgICB9CgogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsK ICAgICAgb3B0aW9ucyA9IHt9OwogICAgfQoKICAgIGlmICh0eXBlb2Ygb3B0 aW9ucy5wYXRoICE9PSAnc3RyaW5nJykgewogICAgICBvcHRpb25zLnBhdGgg PSAiLyIgKyBuYW1lOwogICAgfQoKICAgIGlmIChjYWxsYmFjaykgewogICAg ICB2YXIgZHNsID0gbmV3IERTTChuYW1lKTsKICAgICAgcm91dGUoZHNsLCAn bG9hZGluZycpOwogICAgICByb3V0ZShkc2wsICdlcnJvcicsIHsgcGF0aDog Ii9fdW51c2VkX2R1bW15X2Vycm9yX3BhdGhfcm91dGVfIiArIG5hbWUgKyAi LzplcnJvciIgfSk7CiAgICAgIGNhbGxiYWNrLmNhbGwoZHNsKTsKICAgICAg dGhpcy5wdXNoKG9wdGlvbnMucGF0aCwgbmFtZSwgZHNsLmdlbmVyYXRlKCkp OwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5wdXNoKG9wdGlvbnMucGF0aCwg bmFtZSwgbnVsbCk7CiAgICB9CgoKICAgIGlmIChFbWJlci5GRUFUVVJFUy5p c0VuYWJsZWQoImVtYmVyLXJvdXRpbmctbmFtZWQtc3Vic3RhdGVzIikpIHsK ICAgICAgLy8gRm9yIG5hbWVzcGFjZS1wcmVzZXJ2aW5nIG5lc3RlZCByZXNv dXJjZSAoZS5nLiByZXNvdXJjZSgnZm9vLmJhcicpIHdpdGhpbgogICAgICAv LyByZXNvdXJjZSgnZm9vJykpIHdlIG9ubHkgd2FudCB0byB1c2UgdGhlIGxh c3Qgcm91dGUgbmFtZSBzZWdtZW50IHRvIGRldGVybWluZQogICAgICAvLyB0 aGUgbmFtZXMgb2YgdGhlIGVycm9yL2xvYWRpbmcgc3Vic3RhdGVzIChlLmcu ICdiYXJfbG9hZGluZycpCiAgICAgIG5hbWUgPSBuYW1lLnNwbGl0KCcuJyku cG9wKCk7CiAgICAgIHJvdXRlKHRoaXMsIG5hbWUgKyAnX2xvYWRpbmcnKTsK ICAgICAgcm91dGUodGhpcywgbmFtZSArICdfZXJyb3InLCB7IHBhdGg6ICIv X3VudXNlZF9kdW1teV9lcnJvcl9wYXRoX3JvdXRlXyIgKyBuYW1lICsgIi86 ZXJyb3IiIH0pOwogICAgfQogIH0sCgogIHB1c2g6IGZ1bmN0aW9uKHVybCwg bmFtZSwgY2FsbGJhY2spIHsKICAgIHZhciBwYXJ0cyA9IG5hbWUuc3BsaXQo Jy4nKTsKICAgIGlmICh1cmwgPT09ICIiIHx8IHVybCA9PT0gIi8iIHx8IHBh cnRzW3BhcnRzLmxlbmd0aC0xXSA9PT0gImluZGV4IikgeyB0aGlzLmV4cGxp Y2l0SW5kZXggPSB0cnVlOyB9CgogICAgdGhpcy5tYXRjaGVzLnB1c2goW3Vy bCwgbmFtZSwgY2FsbGJhY2tdKTsKICB9LAoKICByb3V0ZTogZnVuY3Rpb24o bmFtZSwgb3B0aW9ucykgewogICAgcm91dGUodGhpcywgbmFtZSwgb3B0aW9u cyk7CiAgICBpZiAoRW1iZXIuRkVBVFVSRVMuaXNFbmFibGVkKCJlbWJlci1y b3V0aW5nLW5hbWVkLXN1YnN0YXRlcyIpKSB7CiAgICAgIHJvdXRlKHRoaXMs IG5hbWUgKyAnX2xvYWRpbmcnKTsKICAgICAgcm91dGUodGhpcywgbmFtZSAr ICdfZXJyb3InLCB7IHBhdGg6ICIvX3VudXNlZF9kdW1teV9lcnJvcl9wYXRo X3JvdXRlXyIgKyBuYW1lICsgIi86ZXJyb3IiIH0pOwogICAgfQogIH0sCgog IGdlbmVyYXRlOiBmdW5jdGlvbigpIHsKICAgIHZhciBkc2xNYXRjaGVzID0g dGhpcy5tYXRjaGVzOwoKICAgIGlmICghdGhpcy5leHBsaWNpdEluZGV4KSB7 CiAgICAgIHRoaXMucm91dGUoImluZGV4IiwgeyBwYXRoOiAiLyIgfSk7CiAg ICB9CgogICAgcmV0dXJuIGZ1bmN0aW9uKG1hdGNoKSB7CiAgICAgIGZvciAo dmFyIGk9MCwgbD1kc2xNYXRjaGVzLmxlbmd0aDsgaTxsOyBpKyspIHsKICAg ICAgICB2YXIgZHNsTWF0Y2ggPSBkc2xNYXRjaGVzW2ldOwogICAgICAgIHZh ciBtYXRjaE9iaiA9IG1hdGNoKGRzbE1hdGNoWzBdKS50byhkc2xNYXRjaFsx XSwgZHNsTWF0Y2hbMl0pOwogICAgICB9CiAgICB9OwogIH0KfTsKCmZ1bmN0 aW9uIHJvdXRlKGRzbCwgbmFtZSwgb3B0aW9ucykgewogIEVtYmVyLmFzc2Vy dCgiWW91IG11c3QgdXNlIGB0aGlzLnJlc291cmNlYCB0byBuZXN0IiwgdHlw ZW9mIG9wdGlvbnMgIT09ICdmdW5jdGlvbicpOwoKICBvcHRpb25zID0gb3B0 aW9ucyB8fCB7fTsKCiAgaWYgKHR5cGVvZiBvcHRpb25zLnBhdGggIT09ICdz dHJpbmcnKSB7CiAgICBvcHRpb25zLnBhdGggPSAiLyIgKyBuYW1lOwogIH0K CiAgaWYgKGRzbC5wYXJlbnQgJiYgZHNsLnBhcmVudCAhPT0gJ2FwcGxpY2F0 aW9uJykgewogICAgbmFtZSA9IGRzbC5wYXJlbnQgKyAiLiIgKyBuYW1lOwog IH0KCiAgZHNsLnB1c2gob3B0aW9ucy5wYXRoLCBuYW1lLCBudWxsKTsKfQoK RFNMLm1hcCA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgdmFyIGRzbCA9IG5l dyBEU0woKTsKICBjYWxsYmFjay5jYWxsKGRzbCk7CiAgcmV0dXJuIGRzbDsK fTsKCkVtYmVyLlJvdXRlckRTTCA9IERTTDsKCn0pKCk7CgoKCihmdW5jdGlv bigpIHsKdmFyIGdldCA9IEVtYmVyLmdldDsKCi8qKgpAbW9kdWxlIGVtYmVy CkBzdWJtb2R1bGUgZW1iZXItcm91dGluZwoqLwoKLyoqCgogIEZpbmRzIGEg Y29udHJvbGxlciBpbnN0YW5jZS4KCiAgQGZvciBFbWJlcgogIEBtZXRob2Qg Y29udHJvbGxlckZvcgogIEBwcml2YXRlCiovCkVtYmVyLmNvbnRyb2xsZXJG b3IgPSBmdW5jdGlvbihjb250YWluZXIsIGNvbnRyb2xsZXJOYW1lLCBsb29r dXBPcHRpb25zKSB7CiAgcmV0dXJuIGNvbnRhaW5lci5sb29rdXAoJ2NvbnRy b2xsZXI6JyArIGNvbnRyb2xsZXJOYW1lLCBsb29rdXBPcHRpb25zKTsKfTsK Ci8qKgogIEdlbmVyYXRlcyBhIGNvbnRyb2xsZXIgZmFjdG9yeQoKICBUaGUg dHlwZSBvZiB0aGUgZ2VuZXJhdGVkIGNvbnRyb2xsZXIgZmFjdG9yeSBpcyBk ZXJpdmVkCiAgZnJvbSB0aGUgY29udGV4dC4gSWYgdGhlIGNvbnRleHQgaXMg YW4gYXJyYXkgYW4gYXJyYXkgY29udHJvbGxlcgogIGlzIGdlbmVyYXRlZCwg aWYgYW4gb2JqZWN0LCBhbiBvYmplY3QgY29udHJvbGxlciBvdGhlcndpc2Us IGEgYmFzaWMKICBjb250cm9sbGVyIGlzIGdlbmVyYXRlZC4KCiAgWW91IGNh biBjdXN0b21pemUgeW91ciBnZW5lcmF0ZWQgY29udHJvbGxlcnMgYnkgZGVm aW5pbmcKICBgQXBwLk9iamVjdENvbnRyb2xsZXJgIG9yIGBBcHAuQXJyYXlD b250cm9sbGVyYC4KCiAgQGZvciBFbWJlcgogIEBtZXRob2QgZ2VuZXJhdGVD b250cm9sbGVyRmFjdG9yeQogIEBwcml2YXRlCiovCkVtYmVyLmdlbmVyYXRl Q29udHJvbGxlckZhY3RvcnkgPSBmdW5jdGlvbihjb250YWluZXIsIGNvbnRy b2xsZXJOYW1lLCBjb250ZXh0KSB7CiAgdmFyIEZhY3RvcnksIGZ1bGxOYW1l LCBpbnN0YW5jZSwgbmFtZSwgZmFjdG9yeU5hbWUsIGNvbnRyb2xsZXJUeXBl OwoKICBpZiAoY29udGV4dCAmJiBFbWJlci5pc0FycmF5KGNvbnRleHQpKSB7 CiAgICBjb250cm9sbGVyVHlwZSA9ICdhcnJheSc7CiAgfSBlbHNlIGlmIChj b250ZXh0KSB7CiAgICBjb250cm9sbGVyVHlwZSA9ICdvYmplY3QnOwogIH0g ZWxzZSB7CiAgICBjb250cm9sbGVyVHlwZSA9ICdiYXNpYyc7CiAgfQoKICBm YWN0b3J5TmFtZSA9ICdjb250cm9sbGVyOicgKyBjb250cm9sbGVyVHlwZTsK CiAgRmFjdG9yeSA9IGNvbnRhaW5lci5sb29rdXBGYWN0b3J5KGZhY3RvcnlO YW1lKS5leHRlbmQoewogICAgaXNHZW5lcmF0ZWQ6IHRydWUsCiAgICB0b1N0 cmluZzogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiAiKGdlbmVyYXRlZCAi ICsgY29udHJvbGxlck5hbWUgKyAiIGNvbnRyb2xsZXIpIjsKICAgIH0KICB9 KTsKCiAgZnVsbE5hbWUgPSAnY29udHJvbGxlcjonICsgY29udHJvbGxlck5h bWU7CgogIGNvbnRhaW5lci5yZWdpc3RlcihmdWxsTmFtZSwgIEZhY3Rvcnkp OwoKICByZXR1cm4gRmFjdG9yeTsKfTsKCi8qKgogIEdlbmVyYXRlcyBhbmQg aW5zdGFudGlhdGVzIGEgY29udHJvbGxlci4KCiAgVGhlIHR5cGUgb2YgdGhl IGdlbmVyYXRlZCBjb250cm9sbGVyIGZhY3RvcnkgaXMgZGVyaXZlZAogIGZy b20gdGhlIGNvbnRleHQuIElmIHRoZSBjb250ZXh0IGlzIGFuIGFycmF5IGFu IGFycmF5IGNvbnRyb2xsZXIKICBpcyBnZW5lcmF0ZWQsIGlmIGFuIG9iamVj dCwgYW4gb2JqZWN0IGNvbnRyb2xsZXIgb3RoZXJ3aXNlLCBhIGJhc2ljCiAg Y29udHJvbGxlciBpcyBnZW5lcmF0ZWQuCgogIEBmb3IgRW1iZXIKICBAbWV0 aG9kIGdlbmVyYXRlQ29udHJvbGxlcgogIEBwcml2YXRlCiovCkVtYmVyLmdl bmVyYXRlQ29udHJvbGxlciA9IGZ1bmN0aW9uKGNvbnRhaW5lciwgY29udHJv bGxlck5hbWUsIGNvbnRleHQpIHsKICBFbWJlci5nZW5lcmF0ZUNvbnRyb2xs ZXJGYWN0b3J5KGNvbnRhaW5lciwgY29udHJvbGxlck5hbWUsIGNvbnRleHQp OwogIHZhciBmdWxsTmFtZSA9ICdjb250cm9sbGVyOicgKyBjb250cm9sbGVy TmFtZTsKICB2YXIgaW5zdGFuY2UgPSBjb250YWluZXIubG9va3VwKGZ1bGxO YW1lKTsKCiAgaWYgKGdldChpbnN0YW5jZSwgJ25hbWVzcGFjZS5MT0dfQUNU SVZFX0dFTkVSQVRJT04nKSkgewogICAgRW1iZXIuTG9nZ2VyLmluZm8oImdl bmVyYXRlZCAtPiAiICsgZnVsbE5hbWUsIHsgZnVsbE5hbWU6IGZ1bGxOYW1l IH0pOwogIH0KCiAgcmV0dXJuIGluc3RhbmNlOwp9OwoKfSkoKTsKCgoKKGZ1 bmN0aW9uKCkgewovKioKQG1vZHVsZSBlbWJlcgpAc3VibW9kdWxlIGVtYmVy LXJvdXRpbmcKKi8KCnZhciByb3V0ZXJKc01vZHVsZSA9IHJlcXVpcmVNb2R1 bGUoInJvdXRlciIpOwp2YXIgUm91dGVyID0gcm91dGVySnNNb2R1bGUuUm91 dGVyOwp2YXIgVHJhbnNpdGlvbiA9IHJvdXRlckpzTW9kdWxlLlRyYW5zaXRp b247CnZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwgZm10 ID0gRW1iZXIuU3RyaW5nLmZtdDsKdmFyIGRlZmluZVByb3BlcnR5ID0gRW1i ZXIuZGVmaW5lUHJvcGVydHk7CnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlw ZS5zbGljZTsKdmFyIGZvckVhY2ggPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMu Zm9yRWFjaDsKCnZhciBEZWZhdWx0VmlldyA9IEVtYmVyLl9NZXRhbW9ycGhW aWV3OwovKioKICBUaGUgYEVtYmVyLlJvdXRlcmAgY2xhc3MgbWFuYWdlcyB0 aGUgYXBwbGljYXRpb24gc3RhdGUgYW5kIFVSTHMuIFJlZmVyIHRvCiAgdGhl IFtyb3V0aW5nIGd1aWRlXShodHRwOi8vZW1iZXJqcy5jb20vZ3VpZGVzL3Jv dXRpbmcvKSBmb3IgZG9jdW1lbnRhdGlvbi4KCiAgQGNsYXNzIFJvdXRlcgog IEBuYW1lc3BhY2UgRW1iZXIKICBAZXh0ZW5kcyBFbWJlci5PYmplY3QKKi8K RW1iZXIuUm91dGVyID0gRW1iZXIuT2JqZWN0LmV4dGVuZChFbWJlci5FdmVu dGVkLCB7CiAgLyoqCiAgICBUaGUgYGxvY2F0aW9uYCBwcm9wZXJ0eSBkZXRl cm1pbmVzIHRoZSB0eXBlIG9mIFVSTCdzIHRoYXQgeW91cgogICAgYXBwbGlj YXRpb24gd2lsbCB1c2UuCgogICAgVGhlIGZvbGxvd2luZyBsb2NhdGlvbiB0 eXBlcyBhcmUgY3VycmVudGx5IGF2YWlsYWJsZToKCiAgICAqIGBoYXNoYAog ICAgKiBgaGlzdG9yeWAKICAgICogYG5vbmVgCgogICAgQHByb3BlcnR5IGxv Y2F0aW9uCiAgICBAZGVmYXVsdCAnaGFzaCcKICAgIEBzZWUge0VtYmVyLkxv Y2F0aW9ufQogICovCiAgbG9jYXRpb246ICdoYXNoJywKCiAgaW5pdDogZnVu Y3Rpb24oKSB7CiAgICB0aGlzLnJvdXRlciA9IHRoaXMuY29uc3RydWN0b3Iu cm91dGVyIHx8IHRoaXMuY29uc3RydWN0b3IubWFwKEVtYmVyLkspOwogICAg dGhpcy5fYWN0aXZlVmlld3MgPSB7fTsKICAgIHRoaXMuX3NldHVwTG9jYXRp b24oKTsKCiAgICBpZiAoZ2V0KHRoaXMsICduYW1lc3BhY2UuTE9HX1RSQU5T SVRJT05TX0lOVEVSTkFMJykpIHsKICAgICAgdGhpcy5yb3V0ZXIubG9nID0g RW1iZXIuTG9nZ2VyLmRlYnVnOwogICAgfQogIH0sCgogIC8qKgogICAgUmVw cmVzZW50cyB0aGUgY3VycmVudCBVUkwuCgogICAgQG1ldGhvZCB1cmwKICAg IEByZXR1cm5zIHtTdHJpbmd9IFRoZSBjdXJyZW50IFVSTC4KICAqLwogIHVy bDogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZ2V0 KHRoaXMsICdsb2NhdGlvbicpLmdldFVSTCgpOwogIH0pLAoKICAvKioKICAg IEluaXRpYWxpemVzIHRoZSBjdXJyZW50IHJvdXRlciBpbnN0YW5jZSBhbmQg c2V0cyB1cCB0aGUgY2hhbmdlIGhhbmRsaW5nCiAgICBldmVudCBsaXN0ZW5l cnMgdXNlZCBieSB0aGUgaW5zdGFuY2VzIGBsb2NhdGlvbmAgaW1wbGVtZW50 YXRpb24uCgogICAgQSBwcm9wZXJ0eSBuYW1lZCBgaW5pdGlhbFVSTGAgd2ls bCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgaW5pdGlhbCBVUkwuCiAgICBJ ZiBubyB2YWx1ZSBpcyBmb3VuZCBgL2Agd2lsbCBiZSB1c2VkLgoKICAgIEBt ZXRob2Qgc3RhcnRSb3V0aW5nCiAgICBAcHJpdmF0ZQogICovCiAgc3RhcnRS b3V0aW5nOiBmdW5jdGlvbigpIHsKICAgIHRoaXMucm91dGVyID0gdGhpcy5y b3V0ZXIgfHwgdGhpcy5jb25zdHJ1Y3Rvci5tYXAoRW1iZXIuSyk7CgogICAg dmFyIHJvdXRlciA9IHRoaXMucm91dGVyLAogICAgICAgIGxvY2F0aW9uID0g Z2V0KHRoaXMsICdsb2NhdGlvbicpLAogICAgICAgIGNvbnRhaW5lciA9IHRo aXMuY29udGFpbmVyLAogICAgICAgIHNlbGYgPSB0aGlzLAogICAgICAgIGlu aXRpYWxVUkwgPSBnZXQodGhpcywgJ2luaXRpYWxVUkwnKTsKCiAgICAKICAg ICAgLy8gQWxsb3cgdGhlIExvY2F0aW9uIGNsYXNzIHRvIGNhbmNlbCB0aGUg cm91dGVyIHNldHVwIHdoaWxlIGl0IHJlZnJlc2hlcwogICAgICAvLyB0aGUg cGFnZQogICAgICBpZiAoZ2V0KGxvY2F0aW9uLCAnY2FuY2VsUm91dGVyU2V0 dXAnKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgCgogICAgdGhp cy5fc2V0dXBSb3V0ZXIocm91dGVyLCBsb2NhdGlvbik7CgogICAgY29udGFp bmVyLnJlZ2lzdGVyKCd2aWV3OmRlZmF1bHQnLCBEZWZhdWx0Vmlldyk7CiAg ICBjb250YWluZXIucmVnaXN0ZXIoJ3ZpZXc6dG9wbGV2ZWwnLCBFbWJlci5W aWV3LmV4dGVuZCgpKTsKCiAgICBsb2NhdGlvbi5vblVwZGF0ZVVSTChmdW5j dGlvbih1cmwpIHsKICAgICAgc2VsZi5oYW5kbGVVUkwodXJsKTsKICAgIH0p OwoKICAgIGlmICh0eXBlb2YgaW5pdGlhbFVSTCA9PT0gInVuZGVmaW5lZCIp IHsKICAgICAgaW5pdGlhbFVSTCA9IGxvY2F0aW9uLmdldFVSTCgpOwogICAg fQoKICAgIHRoaXMuaGFuZGxlVVJMKGluaXRpYWxVUkwpOwogIH0sCgogIC8q KgogICAgSGFuZGxlcyB1cGRhdGluZyB0aGUgcGF0aHMgYW5kIG5vdGlmeWlu ZyBhbnkgbGlzdGVuZXJzIG9mIHRoZSBVUkwKICAgIGNoYW5nZS4KCiAgICBU cmlnZ2VycyB0aGUgcm91dGVyIGxldmVsIGBkaWRUcmFuc2l0aW9uYCBob29r LgoKICAgIEBtZXRob2QgZGlkVHJhbnNpdGlvbgogICAgQHByaXZhdGUKICAq LwogIGRpZFRyYW5zaXRpb246IGZ1bmN0aW9uKGluZm9zKSB7CiAgICB1cGRh dGVQYXRocyh0aGlzKTsKCiAgICB0aGlzLl9jYW5jZWxMb2FkaW5nRXZlbnQo KTsKCiAgICB0aGlzLm5vdGlmeVByb3BlcnR5Q2hhbmdlKCd1cmwnKTsKCiAg ICAvLyBQdXQgdGhpcyBpbiB0aGUgcnVubG9vcCBzbyB1cmwgd2lsbCBiZSBh Y2N1cmF0ZS4gU2VlbXMKICAgIC8vIGxlc3Mgc3VycHJpc2luZyB0aGFuIGRp ZFRyYW5zaXRpb24gYmVpbmcgb3V0IG9mIHN5bmMuCiAgICBFbWJlci5ydW4u b25jZSh0aGlzLCB0aGlzLnRyaWdnZXIsICdkaWRUcmFuc2l0aW9uJyk7Cgog ICAgaWYgKGdldCh0aGlzLCAnbmFtZXNwYWNlJykuTE9HX1RSQU5TSVRJT05T KSB7CiAgICAgIEVtYmVyLkxvZ2dlci5sb2coIlRyYW5zaXRpb25lZCBpbnRv ICciICsgRW1iZXIuUm91dGVyLl9yb3V0ZVBhdGgoaW5mb3MpICsgIiciKTsK ICAgIH0KICB9LAoKICBoYW5kbGVVUkw6IGZ1bmN0aW9uKHVybCkgewogICAg cmV0dXJuIHRoaXMuX2RvVHJhbnNpdGlvbignaGFuZGxlVVJMJywgW3VybF0p OwogIH0sCgogIHRyYW5zaXRpb25UbzogZnVuY3Rpb24oKSB7CiAgICByZXR1 cm4gdGhpcy5fZG9UcmFuc2l0aW9uKCd0cmFuc2l0aW9uVG8nLCBhcmd1bWVu dHMpOwogIH0sCgogIGludGVybWVkaWF0ZVRyYW5zaXRpb25UbzogZnVuY3Rp b24oKSB7CiAgICB0aGlzLnJvdXRlci5pbnRlcm1lZGlhdGVUcmFuc2l0aW9u VG8uYXBwbHkodGhpcy5yb3V0ZXIsIGFyZ3VtZW50cyk7CgogICAgdXBkYXRl UGF0aHModGhpcyk7CgogICAgdmFyIGluZm9zID0gdGhpcy5yb3V0ZXIuY3Vy cmVudEhhbmRsZXJJbmZvczsKICAgIGlmIChnZXQodGhpcywgJ25hbWVzcGFj ZScpLkxPR19UUkFOU0lUSU9OUykgewogICAgICBFbWJlci5Mb2dnZXIubG9n KCJJbnRlcm1lZGlhdGUtdHJhbnNpdGlvbmVkIGludG8gJyIgKyBFbWJlci5S b3V0ZXIuX3JvdXRlUGF0aChpbmZvcykgKyAiJyIpOwogICAgfQogIH0sCgog IHJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLl9k b1RyYW5zaXRpb24oJ3JlcGxhY2VXaXRoJywgYXJndW1lbnRzKTsKICB9LAoK ICBnZW5lcmF0ZTogZnVuY3Rpb24oKSB7CiAgICB2YXIgdXJsID0gdGhpcy5y b3V0ZXIuZ2VuZXJhdGUuYXBwbHkodGhpcy5yb3V0ZXIsIGFyZ3VtZW50cyk7 CiAgICByZXR1cm4gdGhpcy5sb2NhdGlvbi5mb3JtYXRVUkwodXJsKTsKICB9 LAoKICAvKioKICAgIERldGVybWluZXMgaWYgdGhlIHN1cHBsaWVkIHJvdXRl IGlzIGN1cnJlbnRseSBhY3RpdmUuCgogICAgQG1ldGhvZCBpc0FjdGl2ZQog ICAgQHBhcmFtIHJvdXRlTmFtZQogICAgQHJldHVybnMge0Jvb2xlYW59CiAg ICBAcHJpdmF0ZQogICovCiAgaXNBY3RpdmU6IGZ1bmN0aW9uKHJvdXRlTmFt ZSkgewogICAgdmFyIHJvdXRlciA9IHRoaXMucm91dGVyOwogICAgcmV0dXJu IHJvdXRlci5pc0FjdGl2ZS5hcHBseShyb3V0ZXIsIGFyZ3VtZW50cyk7CiAg fSwKCiAgc2VuZDogZnVuY3Rpb24obmFtZSwgY29udGV4dCkgewogICAgdGhp cy5yb3V0ZXIudHJpZ2dlci5hcHBseSh0aGlzLnJvdXRlciwgYXJndW1lbnRz KTsKICB9LAoKICAvKioKICAgIERvZXMgdGhpcyByb3V0ZXIgaW5zdGFuY2Ug aGF2ZSB0aGUgZ2l2ZW4gcm91dGUuCgogICAgQG1ldGhvZCBoYXNSb3V0ZQog ICAgQHJldHVybnMge0Jvb2xlYW59CiAgICBAcHJpdmF0ZQogICovCiAgaGFz Um91dGU6IGZ1bmN0aW9uKHJvdXRlKSB7CiAgICByZXR1cm4gdGhpcy5yb3V0 ZXIuaGFzUm91dGUocm91dGUpOwogIH0sCgogIC8qKgogICAgUmVzZXRzIHRo ZSBzdGF0ZSBvZiB0aGUgcm91dGVyIGJ5IGNsZWFyaW5nIHRoZSBjdXJyZW50 IHJvdXRlCiAgICBoYW5kbGVycyBhbmQgZGVhY3RpdmF0aW5nIHRoZW0uCgog ICAgQHByaXZhdGUKICAgIEBtZXRob2QgcmVzZXQKICAgKi8KICByZXNldDog ZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJvdXRlci5yZXNldCgpOwogIH0sCgog IF9sb29rdXBBY3RpdmVWaWV3OiBmdW5jdGlvbih0ZW1wbGF0ZU5hbWUpIHsK ICAgIHZhciBhY3RpdmUgPSB0aGlzLl9hY3RpdmVWaWV3c1t0ZW1wbGF0ZU5h bWVdOwogICAgcmV0dXJuIGFjdGl2ZSAmJiBhY3RpdmVbMF07CiAgfSwKCiAg X2Nvbm5lY3RBY3RpdmVWaWV3OiBmdW5jdGlvbih0ZW1wbGF0ZU5hbWUsIHZp ZXcpIHsKICAgIHZhciBleGlzdGluZyA9IHRoaXMuX2FjdGl2ZVZpZXdzW3Rl bXBsYXRlTmFtZV07CgogICAgaWYgKGV4aXN0aW5nKSB7CiAgICAgIGV4aXN0 aW5nWzBdLm9mZignd2lsbERlc3Ryb3lFbGVtZW50JywgdGhpcywgZXhpc3Rp bmdbMV0pOwogICAgfQoKICAgIHZhciBkaXNjb25uZWN0ID0gZnVuY3Rpb24o KSB7CiAgICAgIGRlbGV0ZSB0aGlzLl9hY3RpdmVWaWV3c1t0ZW1wbGF0ZU5h bWVdOwogICAgfTsKCiAgICB0aGlzLl9hY3RpdmVWaWV3c1t0ZW1wbGF0ZU5h bWVdID0gW3ZpZXcsIGRpc2Nvbm5lY3RdOwogICAgdmlldy5vbmUoJ3dpbGxE ZXN0cm95RWxlbWVudCcsIHRoaXMsIGRpc2Nvbm5lY3QpOwogIH0sCgogIF9z ZXR1cExvY2F0aW9uOiBmdW5jdGlvbigpIHsKICAgIHZhciBsb2NhdGlvbiA9 IGdldCh0aGlzLCAnbG9jYXRpb24nKSwKICAgICAgICByb290VVJMID0gZ2V0 KHRoaXMsICdyb290VVJMJyk7CgogICAgaWYgKCdzdHJpbmcnID09PSB0eXBl b2YgbG9jYXRpb24gJiYgdGhpcy5jb250YWluZXIpIHsKICAgICAgdmFyIHJl c29sdmVkTG9jYXRpb24gPSB0aGlzLmNvbnRhaW5lci5sb29rdXAoJ2xvY2F0 aW9uOicgKyBsb2NhdGlvbik7CgogICAgICBpZiAoJ3VuZGVmaW5lZCcgIT09 IHR5cGVvZiByZXNvbHZlZExvY2F0aW9uKSB7CiAgICAgICAgbG9jYXRpb24g PSBzZXQodGhpcywgJ2xvY2F0aW9uJywgcmVzb2x2ZWRMb2NhdGlvbik7CiAg ICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0ZWQg cmVnaXN0cmF0aW9uIG9mIGN1c3RvbSBsb2NhdGlvbiBBUEkncwogICAgICAg IHZhciBvcHRpb25zID0ge2ltcGxlbWVudGF0aW9uOiBsb2NhdGlvbn07Cgog ICAgICAgIGxvY2F0aW9uID0gc2V0KHRoaXMsICdsb2NhdGlvbicsIEVtYmVy LkxvY2F0aW9uLmNyZWF0ZShvcHRpb25zKSk7CiAgICAgIH0KICAgIH0KCiAg ICBpZiAodHlwZW9mIHJvb3RVUkwgPT09ICdzdHJpbmcnKSB7CiAgICAgIGxv Y2F0aW9uLnJvb3RVUkwgPSByb290VVJMOwogICAgfQoKICAgIC8vIGVuc3Vy ZSB0aGF0IGluaXRTdGF0ZSBpcyBjYWxsZWQgQUZURVIgdGhlIHJvb3RVUkwg aXMgc2V0IG9uCiAgICAvLyB0aGUgbG9jYXRpb24gaW5zdGFuY2UKICAgIGlm ICh0eXBlb2YgbG9jYXRpb24uaW5pdFN0YXRlID09PSAnZnVuY3Rpb24nKSB7 IGxvY2F0aW9uLmluaXRTdGF0ZSgpOyB9CiAgfSwKCiAgX2dldEhhbmRsZXJG dW5jdGlvbjogZnVuY3Rpb24oKSB7CiAgICB2YXIgc2VlbiA9IHt9LCBjb250 YWluZXIgPSB0aGlzLmNvbnRhaW5lciwKICAgICAgICBEZWZhdWx0Um91dGUg PSBjb250YWluZXIubG9va3VwRmFjdG9yeSgncm91dGU6YmFzaWMnKSwKICAg ICAgICBzZWxmID0gdGhpczsKCiAgICByZXR1cm4gZnVuY3Rpb24obmFtZSkg ewogICAgICB2YXIgcm91dGVOYW1lID0gJ3JvdXRlOicgKyBuYW1lLAogICAg ICAgICAgaGFuZGxlciA9IGNvbnRhaW5lci5sb29rdXAocm91dGVOYW1lKTsK CiAgICAgIGlmIChzZWVuW25hbWVdKSB7IHJldHVybiBoYW5kbGVyOyB9Cgog ICAgICBzZWVuW25hbWVdID0gdHJ1ZTsKCiAgICAgIGlmICghaGFuZGxlcikg ewogICAgICAgIGNvbnRhaW5lci5yZWdpc3Rlcihyb3V0ZU5hbWUsIERlZmF1 bHRSb3V0ZS5leHRlbmQoKSk7CiAgICAgICAgaGFuZGxlciA9IGNvbnRhaW5l ci5sb29rdXAocm91dGVOYW1lKTsKCiAgICAgICAgaWYgKGdldChzZWxmLCAn bmFtZXNwYWNlLkxPR19BQ1RJVkVfR0VORVJBVElPTicpKSB7CiAgICAgICAg ICBFbWJlci5Mb2dnZXIuaW5mbygiZ2VuZXJhdGVkIC0+ICIgKyByb3V0ZU5h bWUsIHsgZnVsbE5hbWU6IHJvdXRlTmFtZSB9KTsKICAgICAgICB9CiAgICAg IH0KCiAgICAgIGhhbmRsZXIucm91dGVOYW1lID0gbmFtZTsKICAgICAgcmV0 dXJuIGhhbmRsZXI7CiAgICB9OwogIH0sCgogIF9zZXR1cFJvdXRlcjogZnVu Y3Rpb24ocm91dGVyLCBsb2NhdGlvbikgewogICAgdmFyIGxhc3RVUkwsIGVt YmVyUm91dGVyID0gdGhpczsKCiAgICByb3V0ZXIuZ2V0SGFuZGxlciA9IHRo aXMuX2dldEhhbmRsZXJGdW5jdGlvbigpOwoKICAgIHZhciBkb1VwZGF0ZVVS TCA9IGZ1bmN0aW9uKCkgewogICAgICBsb2NhdGlvbi5zZXRVUkwobGFzdFVS TCk7CiAgICB9OwoKICAgIHJvdXRlci51cGRhdGVVUkwgPSBmdW5jdGlvbihw YXRoKSB7CiAgICAgIGxhc3RVUkwgPSBwYXRoOwogICAgICBFbWJlci5ydW4u b25jZShkb1VwZGF0ZVVSTCk7CiAgICB9OwoKICAgIGlmIChsb2NhdGlvbi5y ZXBsYWNlVVJMKSB7CiAgICAgIHZhciBkb1JlcGxhY2VVUkwgPSBmdW5jdGlv bigpIHsKICAgICAgICBsb2NhdGlvbi5yZXBsYWNlVVJMKGxhc3RVUkwpOwog ICAgICB9OwoKICAgICAgcm91dGVyLnJlcGxhY2VVUkwgPSBmdW5jdGlvbihw YXRoKSB7CiAgICAgICAgbGFzdFVSTCA9IHBhdGg7CiAgICAgICAgRW1iZXIu cnVuLm9uY2UoZG9SZXBsYWNlVVJMKTsKICAgICAgfTsKICAgIH0KCiAgICBy b3V0ZXIuZGlkVHJhbnNpdGlvbiA9IGZ1bmN0aW9uKGluZm9zKSB7CiAgICAg IGVtYmVyUm91dGVyLmRpZFRyYW5zaXRpb24oaW5mb3MpOwogICAgfTsKICB9 LAoKICBfZG9UcmFuc2l0aW9uOiBmdW5jdGlvbihtZXRob2QsIGFyZ3MpIHsK ICAgIC8vIE5vcm1hbGl6ZSBibGFuayByb3V0ZSB0byByb290IFVSTC4KICAg IGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3MpOwogICAgYXJnc1swXSA9IGFyZ3Nb MF0gfHwgJy8nOwoKICAgIHZhciBuYW1lID0gYXJnc1swXSwgc2VsZiA9IHRo aXMsCiAgICAgIGlzUXVlcnlQYXJhbXNPbmx5ID0gZmFsc2UsIHF1ZXJ5UGFy YW1zOwoKICAgIGlmIChFbWJlci5GRUFUVVJFUy5pc0VuYWJsZWQoInF1ZXJ5 LXBhcmFtcy1uZXciKSkgewoKICAgICAgdmFyIHBvc3NpYmxlUXVlcnlQYXJh bUFyZyA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTsKICAgICAgaWYgKHBvc3Np YmxlUXVlcnlQYXJhbUFyZyAmJiBwb3NzaWJsZVF1ZXJ5UGFyYW1BcmcuaGFz T3duUHJvcGVydHkoJ3F1ZXJ5UGFyYW1zJykpIHsKICAgICAgICBpZiAoYXJn cy5sZW5ndGggPT09IDEpIHsKICAgICAgICAgIGlzUXVlcnlQYXJhbXNPbmx5 ID0gdHJ1ZTsKICAgICAgICAgIG5hbWUgPSBudWxsOwogICAgICAgIH0KICAg ICAgICBxdWVyeVBhcmFtcyA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXS5xdWVy eVBhcmFtczsKICAgICAgfQogICAgfQoKICAgIGlmICghaXNRdWVyeVBhcmFt c09ubHkgJiYgbmFtZS5jaGFyQXQoMCkgIT09ICcvJykgewogICAgICBFbWJl ci5hc3NlcnQoIlRoZSByb3V0ZSAiICsgbmFtZSArICIgd2FzIG5vdCBmb3Vu ZCIsIHRoaXMucm91dGVyLmhhc1JvdXRlKG5hbWUpKTsKICAgIH0KCiAgICBp ZiAocXVlcnlQYXJhbXMpIHsKICAgICAgLy8gcm91dGVyLmpzIGV4cGVjdHMg cXVlcnlQYXJhbXMgdG8gYmUgcGFzc2VkIGluIGluCiAgICAgIC8vIHRoZWly IGZpbmFsIHNlcmlhbGl6ZWQgZm9ybSwgc28gd2UgbmVlZCB0byB0cmFuc2xh dGUuCgogICAgICBpZiAoIW5hbWUpIHsKICAgICAgICAvLyBOZWVkIHRvIGRl dGVybWluZSBkZXN0aW5hdGlvbiByb3V0ZSBuYW1lLgogICAgICAgIHZhciBo YW5kbGVySW5mb3MgPSB0aGlzLnJvdXRlci5hY3RpdmVUcmFuc2l0aW9uID8K ICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIuYWN0aXZl VHJhbnNpdGlvbi5zdGF0ZS5oYW5kbGVySW5mb3MgOgogICAgICAgICAgICAg ICAgICAgICAgICAgICB0aGlzLnJvdXRlci5zdGF0ZS5oYW5kbGVySW5mb3M7 CiAgICAgICAgbmFtZSA9IGhhbmRsZXJJbmZvc1toYW5kbGVySW5mb3MubGVu Z3RoIC0gMV0ubmFtZTsKICAgICAgICBhcmdzLnVuc2hpZnQobmFtZSk7CiAg ICAgIH0KCiAgICAgIHZhciBxcE1hcHBpbmdzID0gdGhpcy5fcXVlcnlQYXJh bU5hbWVzRm9yKG5hbWUpOwoKCiAgICAgIEVtYmVyLlJvdXRlci5fdHJhbnNs YXRlUXVlcnlQYXJhbXMocXVlcnlQYXJhbXMsIHFwTWFwcGluZ3MudHJhbnNs YXRpb25zLCBuYW1lKTsKICAgICAgdmFyIHZhbHVlOwogICAgICBmb3IgKHZh ciBrZXkgaW4gcXVlcnlQYXJhbXMpIHsKICAgICAgICB2YXIgZGVzY29wZWRQ YXJhbSA9IEVtYmVyLlJvdXRlci5fZGVzY29wZVF1ZXJ5UGFyYW0oa2V5KTsK ICAgICAgICBpZiAoa2V5IGluIHFwTWFwcGluZ3MucXVlcnlQYXJhbXMpIHsK ICAgICAgICAgIHZhbHVlID0gcXVlcnlQYXJhbXNba2V5XTsKICAgICAgICAg IGRlbGV0ZSBxdWVyeVBhcmFtc1trZXldOwogICAgICAgICAgcXVlcnlQYXJh bXNbcXBNYXBwaW5ncy5xdWVyeVBhcmFtc1trZXldXSA9IHZhbHVlOwogICAg ICAgIH0gZWxzZSBpZiAoZGVzY29wZWRQYXJhbSBpbiBxcE1hcHBpbmdzLnZh bGlkUXVlcnlQYXJhbXMpIHsKICAgICAgICAgIHZhbHVlID0gcXVlcnlQYXJh bXNba2V5XTsKICAgICAgICAgIGRlbGV0ZSBxdWVyeVBhcmFtc1trZXldOwog ICAgICAgICAgcXVlcnlQYXJhbXNbZGVzY29wZWRQYXJhbV0gPSB2YWx1ZTsK ICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICB2YXIgdHJhbnNpdGlvblBy b21pc2UgPSB0aGlzLnJvdXRlclttZXRob2RdLmFwcGx5KHRoaXMucm91dGVy LCBhcmdzKTsKCiAgICB0cmFuc2l0aW9uUHJvbWlzZS50aGVuKG51bGwsIGZ1 bmN0aW9uKGVycm9yKSB7CiAgICAgIGlmIChlcnJvciAmJiBlcnJvci5uYW1l ID09PSAiVW5yZWNvZ25pemVkVVJMRXJyb3IiKSB7CiAgICAgICAgRW1iZXIu YXNzZXJ0KCJUaGUgVVJMICciICsgZXJyb3IubWVzc2FnZSArICInIGRpZCBu b3QgbWF0Y2ggYW55IHJvdXRlcyBpbiB5b3VyIGFwcGxpY2F0aW9uIik7CiAg ICAgIH0KICAgIH0sICdFbWJlcjogQ2hlY2sgZm9yIFJvdXRlciB1bnJlY29n bml6ZWQgVVJMIGVycm9yJyk7CgogICAgLy8gV2Ugd2FudCB0byByZXR1cm4g dGhlIGNvbmZpZ3VyYWJsZSBwcm9taXNlIG9iamVjdAogICAgLy8gc28gdGhh dCBjYWxsZXJzIG9mIHRoaXMgZnVuY3Rpb24gY2FuIHVzZSBgLm1ldGhvZCgp YCBvbiBpdCwKICAgIC8vIHdoaWNoIG9idmlvdXNseSBkb2Vzbid0IGV4aXN0 IGZvciBub3JtYWwgUlNWUCBwcm9taXNlcy4KICAgIHJldHVybiB0cmFuc2l0 aW9uUHJvbWlzZTsKICB9LAoKICBfc2NoZWR1bGVMb2FkaW5nRXZlbnQ6IGZ1 bmN0aW9uKHRyYW5zaXRpb24sIG9yaWdpblJvdXRlKSB7CiAgICB0aGlzLl9j YW5jZWxMb2FkaW5nRXZlbnQoKTsKICAgIHRoaXMuX2xvYWRpbmdTdGF0ZVRp bWVyID0gRW1iZXIucnVuLnNjaGVkdWxlT25jZSgncm91dGVyVHJhbnNpdGlv bnMnLCB0aGlzLCAnX2ZpcmVMb2FkaW5nRXZlbnQnLCB0cmFuc2l0aW9uLCBv cmlnaW5Sb3V0ZSk7CiAgfSwKCiAgX2ZpcmVMb2FkaW5nRXZlbnQ6IGZ1bmN0 aW9uKHRyYW5zaXRpb24sIG9yaWdpblJvdXRlKSB7CiAgICBpZiAoIXRoaXMu cm91dGVyLmFjdGl2ZVRyYW5zaXRpb24pIHsKICAgICAgLy8gRG9uJ3QgZmly ZSBhbiBldmVudCBpZiB3ZSd2ZSBzaW5jZSBtb3ZlZCBvbiBmcm9tCiAgICAg IC8vIHRoZSB0cmFuc2l0aW9uIHRoYXQgcHV0IHVzIGluIGEgbG9hZGluZyBz dGF0ZS4KICAgICAgcmV0dXJuOwogICAgfQoKICAgIHRyYW5zaXRpb24udHJp Z2dlcih0cnVlLCAnbG9hZGluZycsIHRyYW5zaXRpb24sIG9yaWdpblJvdXRl KTsKICB9LAoKICBfY2FuY2VsTG9hZGluZ0V2ZW50OiBmdW5jdGlvbiAoKSB7 CiAgICBpZiAodGhpcy5fbG9hZGluZ1N0YXRlVGltZXIpIHsKICAgICAgRW1i ZXIucnVuLmNhbmNlbCh0aGlzLl9sb2FkaW5nU3RhdGVUaW1lcik7CiAgICB9 CiAgICB0aGlzLl9sb2FkaW5nU3RhdGVUaW1lciA9IG51bGw7CiAgfSwKCiAg X3F1ZXJ5UGFyYW1OYW1lc0ZvcjogZnVuY3Rpb24ocm91dGVOYW1lKSB7Cgog ICAgLy8gVE9ETzogYWRkIGNhY2hpbmcKCiAgICB2YXIgaGFuZGxlckluZm9z ID0gdGhpcy5yb3V0ZXIucmVjb2duaXplci5oYW5kbGVyc0Zvcihyb3V0ZU5h bWUpOwogICAgdmFyIHJlc3VsdCA9IHsgcXVlcnlQYXJhbXM6IEVtYmVyLmNy ZWF0ZShudWxsKSwgdHJhbnNsYXRpb25zOiBFbWJlci5jcmVhdGUobnVsbCks IHZhbGlkUXVlcnlQYXJhbXM6IEVtYmVyLmNyZWF0ZShudWxsKSB9OwogICAg dmFyIHJvdXRlcmpzID0gdGhpcy5yb3V0ZXI7CiAgICBmb3JFYWNoKGhhbmRs ZXJJbmZvcywgZnVuY3Rpb24ocmVjb2dIYW5kbGVyKSB7CiAgICAgIHZhciBy b3V0ZSA9IHJvdXRlcmpzLmdldEhhbmRsZXIocmVjb2dIYW5kbGVyLmhhbmRs ZXIpOwogICAgICBnZXRRdWVyeVBhcmFtc0ZvclJvdXRlKHJvdXRlLCByZXN1 bHQpOwogICAgfSk7CgogICAgZGVzY29wZVF1ZXJ5UGFyYW1zKHJlc3VsdC5x dWVyeVBhcmFtcyk7CgogICAgZm9yICh2YXIgayBpbiByZXN1bHQucXVlcnlQ YXJhbXMpIHsKICAgICAgcmVzdWx0LnZhbGlkUXVlcnlQYXJhbXNbcmVzdWx0 LnF1ZXJ5UGFyYW1zW2tdXSA9IHRydWU7CiAgICB9CiAgICByZXR1cm4gcmVz dWx0OwogIH0sCgogIF9xdWVyeVBhcmFtTmFtZXNGb3JTaW5nbGU6IGZ1bmN0 aW9uKHJvdXRlTmFtZSkgewoKICAgIC8vIFRPRE86IGFkZCBjYWNoaW5nCgog ICAgdmFyIHJlc3VsdCA9IHsgcXVlcnlQYXJhbXM6IEVtYmVyLmNyZWF0ZShu dWxsKSwgdHJhbnNsYXRpb25zOiBFbWJlci5jcmVhdGUobnVsbCkgfTsKICAg IHZhciByb3V0ZSA9IHRoaXMucm91dGVyLmdldEhhbmRsZXIocm91dGVOYW1l KTsKCiAgICBnZXRRdWVyeVBhcmFtc0ZvclJvdXRlKHJvdXRlLCByZXN1bHQp OwoKICAgIC8vIERlc2NvcGUgbm9uIGR1cGxpY2F0ZSBwYXJhbXMuCiAgICBp ZiAocm91dGVOYW1lICE9PSAnYXBwbGljYXRpb24nKSB7CiAgICAgIHZhciBh bGxQYXJhbXMgPSB0aGlzLl9xdWVyeVBhcmFtTmFtZXNGb3Iocm91dGVOYW1l KTsKICAgICAgZm9yICh2YXIgayBpbiByZXN1bHQucXVlcnlQYXJhbXMpIHsK ICAgICAgICByZXN1bHQucXVlcnlQYXJhbXNba10gPSBhbGxQYXJhbXMucXVl cnlQYXJhbXNba107CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gcmVzdWx0 OwogIH0sCgogIC8qKgogICAgQHByaXZhdGUKCiAgICBVdGlsaXR5IGZ1bmN0 aW9uIGZvciBmZXRjaGluZyBhbGwgdGhlIGN1cnJlbnQgcXVlcnkgcGFyYW1z CiAgICB2YWx1ZXMgZnJvbSBhIGNvbnRyb2xsZXIuCiAgICovCiAgX3F1ZXJ5 UGFyYW1PdmVycmlkZXM6IGZ1bmN0aW9uKHJlc3VsdHMsIHF1ZXJ5UGFyYW1z LCBjYWxsYmFjaykgewogICAgZm9yICh2YXIgbmFtZSBpbiBxdWVyeVBhcmFt cykgewogICAgICB2YXIgcGFydHMgPSBuYW1lLnNwbGl0KCc6Jyk7CgogICAg ICB2YXIgY29udHJvbGxlciA9IGNvbnRyb2xsZXJPclByb3RvRm9yKHBhcnRz WzBdLCB0aGlzLmNvbnRhaW5lcik7CiAgICAgIEVtYmVyLmFzc2VydChmbXQo IkNvdWxkIG5vdCBsb29rdXAgY29udHJvbGxlciAnJUAnIHdoaWxlIHNldHRp bmcgdXAgcXVlcnkgcGFyYW1zIiwgW2NvbnRyb2xsZXJdKSwgY29udHJvbGxl cik7CgogICAgICAvLyBOb3cgYXNzaWduIHRoZSBmaW5hbCBVUkwtc2VyaWFs aXplZCBrZXktdmFsdWUgcGFpciwKICAgICAgLy8gZS5nLiAiZm9vW3Byb3BO YW1lXSI6ICJ2YWx1ZSIKICAgICAgcmVzdWx0c1txdWVyeVBhcmFtc1tuYW1l XV0gPSBnZXQoY29udHJvbGxlciwgcGFydHNbMV0pOwoKICAgICAgaWYgKGNh bGxiYWNrKSB7CiAgICAgICAgLy8gR2l2ZSBjYWxsYmFjayBhIGNoYW5jZSB0 byBvdmVycmlkZS4KICAgICAgICBjYWxsYmFjayhuYW1lLCBxdWVyeVBhcmFt c1tuYW1lXSwgbmFtZSk7CiAgICAgIH0KICAgIH0KICB9Cn0pOwoKLyoqCiAg QHByaXZhdGUKICovCmZ1bmN0aW9uIGdldFF1ZXJ5UGFyYW1zRm9yUm91dGUo cm91dGUsIHJlc3VsdCkgewogIHZhciBjb250cm9sbGVyTmFtZSA9IHJvdXRl LmNvbnRyb2xsZXJOYW1lIHx8IHJvdXRlLnJvdXRlTmFtZSwKICAgICAgY29u dHJvbGxlciA9IGNvbnRyb2xsZXJPclByb3RvRm9yKGNvbnRyb2xsZXJOYW1l LCByb3V0ZS5jb250YWluZXIpLAogICAgICBxdWVyeVBhcmFtcyA9IGdldChj b250cm9sbGVyLCAncXVlcnlQYXJhbXMnKTsKCiAgaWYgKHF1ZXJ5UGFyYW1z KSB7CiAgICBmb3JFYWNoKHF1ZXJ5UGFyYW1zLCBmdW5jdGlvbihwcm9wTmFt ZSkgewoKICAgICAgdmFyIHBhcnRzID0gcHJvcE5hbWUuc3BsaXQoJzonKTsK CiAgICAgIHZhciB1cmxLZXlOYW1lOwogICAgICBpZiAocGFydHMubGVuZ3Ro ID4gMSkgewogICAgICAgIHVybEtleU5hbWUgPSBwYXJ0c1sxXTsKICAgICAg fSBlbHNlIHsKICAgICAgICAvLyBUT0RPOiB1c2UgX3F1ZXJ5UGFyYW1TY29w ZSBoZXJlPwogICAgICAgIGlmIChjb250cm9sbGVyTmFtZSAhPT0gJ2FwcGxp Y2F0aW9uJykgewogICAgICAgICAgdXJsS2V5TmFtZSA9IGNvbnRyb2xsZXJO YW1lICsgJ1snICsgcHJvcE5hbWUgKyAnXSc7CiAgICAgICAgfSBlbHNlIHsK ICAgICAgICAgIHVybEtleU5hbWUgPSBwcm9wTmFtZTsKICAgICAgICB9CiAg ICAgIH0KCiAgICAgIHZhciBjb250cm9sbGVyRnVsbG5hbWUgPSBjb250cm9s bGVyTmFtZSArICc6JyArIHByb3BOYW1lOwoKICAgICAgcmVzdWx0LnF1ZXJ5 UGFyYW1zW2NvbnRyb2xsZXJGdWxsbmFtZV0gPSB1cmxLZXlOYW1lOwogICAg ICByZXN1bHQudHJhbnNsYXRpb25zW3BhcnRzWzBdXSA9IGNvbnRyb2xsZXJG dWxsbmFtZTsKICAgIH0pOwogIH0KfQoKZnVuY3Rpb24gY29udHJvbGxlck9y UHJvdG9Gb3IoY29udHJvbGxlck5hbWUsIGNvbnRhaW5lcikgewogIHZhciBm dWxsTmFtZSA9ICdjb250cm9sbGVyOicgKyBjb250cm9sbGVyTmFtZTsKICBp ZiAoY29udGFpbmVyLmNhY2hlLmhhcyhmdWxsTmFtZSkpIHsKICAgIHJldHVy biBjb250YWluZXIubG9va3VwKGZ1bGxOYW1lKTsKICB9IGVsc2UgewogICAg Ly8gQ29udHJvbGxlciBoYXNuJ3QgYmVlbiBpbnN0YW50aWF0ZWQgeWV0OyBq dXN0IHJldHVybiBpdHMgcHJvdG8uCiAgICB2YXIgY29udHJvbGxlckNsYXNz ID0gY29udGFpbmVyLmxvb2t1cEZhY3RvcnkoZnVsbE5hbWUpOwogICAgaWYg KGNvbnRyb2xsZXJDbGFzcyAmJiB0eXBlb2YgY29udHJvbGxlckNsYXNzLnBy b3RvID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybiBjb250cm9sbGVy Q2xhc3MucHJvdG8oKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB7fTsK ICAgIH0KICB9Cn0KCmZ1bmN0aW9uIGRlc2NvcGVRdWVyeVBhcmFtcyhwYXJh bXMpIHsKICB2YXIgcGFyYW1Db3VudHMgPSB7fSwKICAgICAgZGVzY29wZWRQ YXJhbSwKICAgICAgazsKCiAgLy8gTG9vcCB0aHJvdWdoIHBhcmFtcyBhbmQg Y291bnQgdGhlIG9jY3VyYW5jZSBvZiBkZXNjb3BlZCBwYXJhbQogIGZvciAo ayBpbiBwYXJhbXMpIHsKICAgIGRlc2NvcGVkUGFyYW0gPSBFbWJlci5Sb3V0 ZXIuX2Rlc2NvcGVRdWVyeVBhcmFtKHBhcmFtc1trXSk7CgogICAgaWYgKCFw YXJhbUNvdW50c1tkZXNjb3BlZFBhcmFtXSkgewogICAgICBwYXJhbUNvdW50 c1tkZXNjb3BlZFBhcmFtXSA9IDE7CiAgICB9IGVsc2UgewogICAgICBwYXJh bUNvdW50c1tkZXNjb3BlZFBhcmFtXSA9IHBhcmFtQ291bnRzW2Rlc2NvcGVk UGFyYW1dICsgMTsKICAgIH0KICB9CgogIC8vIExvb3AgdGhyb3VnaCBhZ2Fp biBkZXNjb3BpbmcgcGFyYW1zIGlmIHRoZSBkZXNjb3BlZCBrZXkgb25seSBv Y2N1cnMgb25jZQogIGZvciAoayBpbiBwYXJhbXMpIHsKICAgIGRlc2NvcGVk UGFyYW0gPSBFbWJlci5Sb3V0ZXIuX2Rlc2NvcGVRdWVyeVBhcmFtKHBhcmFt c1trXSk7CgogICAgaWYgKHBhcmFtQ291bnRzW2Rlc2NvcGVkUGFyYW1dID09 PSAxKSB7CiAgICAgIHBhcmFtc1trXSA9IGRlc2NvcGVkUGFyYW07CiAgICB9 CiAgfQp9CgovKioKICBIZWxwZXIgZnVuY3Rpb24gZm9yIGl0ZXJhdGluZyBy b290LXdhcmQsIHN0YXJ0aW5nCiAgZnJvbSAoYnV0IG5vdCBpbmNsdWRpbmcp IHRoZSBwcm92aWRlZCBgb3JpZ2luUm91dGVgLgoKICBSZXR1cm5zIHRydWUg aWYgdGhlIGxhc3QgY2FsbGJhY2sgZmlyZWQgcmVxdWVzdGVkCiAgdG8gYnVi YmxlIHVwd2FyZC4KCiAgQHByaXZhdGUKICovCmZ1bmN0aW9uIGZvckVhY2hS b3V0ZUFib3ZlKG9yaWdpblJvdXRlLCB0cmFuc2l0aW9uLCBjYWxsYmFjaykg ewogIHZhciBoYW5kbGVySW5mb3MgPSB0cmFuc2l0aW9uLnN0YXRlLmhhbmRs ZXJJbmZvcywKICAgICAgb3JpZ2luUm91dGVGb3VuZCA9IGZhbHNlOwoKICBm b3IgKHZhciBpID0gaGFuZGxlckluZm9zLmxlbmd0aCAtIDE7IGkgPj0gMDsg LS1pKSB7CiAgICB2YXIgaGFuZGxlckluZm8gPSBoYW5kbGVySW5mb3NbaV0s CiAgICAgICAgcm91dGUgPSBoYW5kbGVySW5mby5oYW5kbGVyOwoKICAgIGlm ICghb3JpZ2luUm91dGVGb3VuZCkgewogICAgICBpZiAob3JpZ2luUm91dGUg PT09IHJvdXRlKSB7CiAgICAgICAgb3JpZ2luUm91dGVGb3VuZCA9IHRydWU7 CiAgICAgIH0KICAgICAgY29udGludWU7CiAgICB9CgogICAgaWYgKGNhbGxi YWNrKHJvdXRlLCBoYW5kbGVySW5mb3NbaSArIDFdLmhhbmRsZXIpICE9PSB0 cnVlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgcmV0dXJu IHRydWU7Cn0KCi8vIFRoZXNlIGdldCBpbnZva2VkIHdoZW4gYW4gYWN0aW9u IGJ1YmJsZXMgYWJvdmUgQXBwbGljYXRpb25Sb3V0ZQovLyBhbmQgYXJlIG5v dCBtZWFudCB0byBiZSBvdmVycmlkYWJsZS4KdmFyIGRlZmF1bHRBY3Rpb25I YW5kbGVycyA9IHsKCiAgd2lsbFJlc29sdmVNb2RlbDogZnVuY3Rpb24odHJh bnNpdGlvbiwgb3JpZ2luUm91dGUpIHsKICAgIG9yaWdpblJvdXRlLnJvdXRl ci5fc2NoZWR1bGVMb2FkaW5nRXZlbnQodHJhbnNpdGlvbiwgb3JpZ2luUm91 dGUpOwogIH0sCgogIGVycm9yOiBmdW5jdGlvbihlcnJvciwgdHJhbnNpdGlv biwgb3JpZ2luUm91dGUpIHsKICAgIC8vIEF0dGVtcHQgdG8gZmluZCBhbiBh cHByb3ByaWF0ZSBlcnJvciBzdWJzdGF0ZSB0byBlbnRlci4KICAgIHZhciBy b3V0ZXIgPSBvcmlnaW5Sb3V0ZS5yb3V0ZXI7CgogICAgdmFyIHRyeVRvcExl dmVsID0gZm9yRWFjaFJvdXRlQWJvdmUob3JpZ2luUm91dGUsIHRyYW5zaXRp b24sIGZ1bmN0aW9uKHJvdXRlLCBjaGlsZFJvdXRlKSB7CiAgICAgIHZhciBj aGlsZEVycm9yUm91dGVOYW1lID0gZmluZENoaWxkUm91dGVOYW1lKHJvdXRl LCBjaGlsZFJvdXRlLCAnZXJyb3InKTsKICAgICAgaWYgKGNoaWxkRXJyb3JS b3V0ZU5hbWUpIHsKICAgICAgICByb3V0ZXIuaW50ZXJtZWRpYXRlVHJhbnNp dGlvblRvKGNoaWxkRXJyb3JSb3V0ZU5hbWUsIGVycm9yKTsKICAgICAgICBy ZXR1cm47CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9KTsKCiAg ICBpZiAodHJ5VG9wTGV2ZWwpIHsKICAgICAgLy8gQ2hlY2sgZm9yIHRvcC1s ZXZlbCBlcnJvciBzdGF0ZSB0byBlbnRlci4KICAgICAgaWYgKHJvdXRlSGFz QmVlbkRlZmluZWQob3JpZ2luUm91dGUucm91dGVyLCAnYXBwbGljYXRpb25f ZXJyb3InKSkgewogICAgICAgIHJvdXRlci5pbnRlcm1lZGlhdGVUcmFuc2l0 aW9uVG8oJ2FwcGxpY2F0aW9uX2Vycm9yJywgZXJyb3IpOwogICAgICAgIHJl dHVybjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy8gRG9uJ3QgZmly ZSBhbiBhc3NlcnRpb24gaWYgd2UgZm91bmQgYW4gZXJyb3Igc3Vic3RhdGUu CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBFbWJlci5Mb2dnZXIuZXJyb3Io J0Vycm9yIHdoaWxlIGxvYWRpbmcgcm91dGU6ICcgKyAoZXJyb3IgJiYgZXJy b3Iuc3RhY2spKTsKICB9LAoKICBsb2FkaW5nOiBmdW5jdGlvbih0cmFuc2l0 aW9uLCBvcmlnaW5Sb3V0ZSkgewogICAgLy8gQXR0ZW1wdCB0byBmaW5kIGFu IGFwcHJvcHJpYXRlIGxvYWRpbmcgc3Vic3RhdGUgdG8gZW50ZXIuCiAgICB2 YXIgcm91dGVyID0gb3JpZ2luUm91dGUucm91dGVyOwoKICAgIHZhciB0cnlU b3BMZXZlbCA9IGZvckVhY2hSb3V0ZUFib3ZlKG9yaWdpblJvdXRlLCB0cmFu c2l0aW9uLCBmdW5jdGlvbihyb3V0ZSwgY2hpbGRSb3V0ZSkgewogICAgICB2 YXIgY2hpbGRMb2FkaW5nUm91dGVOYW1lID0gZmluZENoaWxkUm91dGVOYW1l KHJvdXRlLCBjaGlsZFJvdXRlLCAnbG9hZGluZycpOwoKICAgICAgaWYgKGNo aWxkTG9hZGluZ1JvdXRlTmFtZSkgewogICAgICAgIHJvdXRlci5pbnRlcm1l ZGlhdGVUcmFuc2l0aW9uVG8oY2hpbGRMb2FkaW5nUm91dGVOYW1lKTsKICAg ICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIC8vIERvbid0IGJ1YmJsZSBh Ym92ZSBwaXZvdCByb3V0ZS4KICAgICAgaWYgKHRyYW5zaXRpb24ucGl2b3RI YW5kbGVyICE9PSByb3V0ZSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAg ICB9CiAgICB9KTsKCiAgICBpZiAodHJ5VG9wTGV2ZWwpIHsKICAgICAgLy8g Q2hlY2sgZm9yIHRvcC1sZXZlbCBsb2FkaW5nIHN0YXRlIHRvIGVudGVyLgog ICAgICBpZiAocm91dGVIYXNCZWVuRGVmaW5lZChvcmlnaW5Sb3V0ZS5yb3V0 ZXIsICdhcHBsaWNhdGlvbl9sb2FkaW5nJykpIHsKICAgICAgICByb3V0ZXIu aW50ZXJtZWRpYXRlVHJhbnNpdGlvblRvKCdhcHBsaWNhdGlvbl9sb2FkaW5n Jyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgfQp9OwoKZnVu Y3Rpb24gZmluZENoaWxkUm91dGVOYW1lKHBhcmVudFJvdXRlLCBvcmlnaW5h dGluZ0NoaWxkUm91dGUsIG5hbWUpIHsKICB2YXIgcm91dGVyID0gcGFyZW50 Um91dGUucm91dGVyLAogICAgICBjaGlsZE5hbWUsCiAgICAgIHRhcmdldENo aWxkUm91dGVOYW1lID0gb3JpZ2luYXRpbmdDaGlsZFJvdXRlLnJvdXRlTmFt ZS5zcGxpdCgnLicpLnBvcCgpLAogICAgICBuYW1lc3BhY2UgPSBwYXJlbnRS b3V0ZS5yb3V0ZU5hbWUgPT09ICdhcHBsaWNhdGlvbicgPyAnJyA6IHBhcmVu dFJvdXRlLnJvdXRlTmFtZSArICcuJzsKCiAgaWYgKEVtYmVyLkZFQVRVUkVT LmlzRW5hYmxlZCgiZW1iZXItcm91dGluZy1uYW1lZC1zdWJzdGF0ZXMiKSkg ewogICAgLy8gRmlyc3QsIHRyeSBhIG5hbWVkIGxvYWRpbmcgc3RhdGUsIGUu Zy4gJ2Zvb19sb2FkaW5nJwogICAgY2hpbGROYW1lID0gbmFtZXNwYWNlICsg dGFyZ2V0Q2hpbGRSb3V0ZU5hbWUgKyAnXycgKyBuYW1lOwogICAgaWYgKHJv dXRlSGFzQmVlbkRlZmluZWQocm91dGVyLCBjaGlsZE5hbWUpKSB7CiAgICAg IHJldHVybiBjaGlsZE5hbWU7CiAgICB9CiAgfQoKICAvLyBTZWNvbmQsIHRy eSBnZW5lcmFsIGxvYWRpbmcgc3RhdGUsIGUuZy4gJ2xvYWRpbmcnCiAgY2hp bGROYW1lID0gbmFtZXNwYWNlICsgbmFtZTsKICBpZiAocm91dGVIYXNCZWVu RGVmaW5lZChyb3V0ZXIsIGNoaWxkTmFtZSkpIHsKICAgIHJldHVybiBjaGls ZE5hbWU7CiAgfQp9CgpmdW5jdGlvbiByb3V0ZUhhc0JlZW5EZWZpbmVkKHJv dXRlciwgbmFtZSkgewogIHZhciBjb250YWluZXIgPSByb3V0ZXIuY29udGFp bmVyOwogIHJldHVybiByb3V0ZXIuaGFzUm91dGUobmFtZSkgJiYKICAgICAg ICAgKGNvbnRhaW5lci5oYXMoJ3RlbXBsYXRlOicgKyBuYW1lKSB8fCBjb250 YWluZXIuaGFzKCdyb3V0ZTonICsgbmFtZSkpOwp9CgpmdW5jdGlvbiB0cmln Z2VyRXZlbnQoaGFuZGxlckluZm9zLCBpZ25vcmVGYWlsdXJlLCBhcmdzKSB7 CiAgdmFyIG5hbWUgPSBhcmdzLnNoaWZ0KCk7CgogIGlmICghaGFuZGxlcklu Zm9zKSB7CiAgICBpZiAoaWdub3JlRmFpbHVyZSkgeyByZXR1cm47IH0KICAg IHRocm93IG5ldyBFbWJlci5FcnJvcigiQ2FuJ3QgdHJpZ2dlciBhY3Rpb24g JyIgKyBuYW1lICsgIicgYmVjYXVzZSB5b3VyIGFwcCBoYXNuJ3QgZmluaXNo ZWQgdHJhbnNpdGlvbmluZyBpbnRvIGl0cyBmaXJzdCByb3V0ZS4gVG8gdHJp Z2dlciBhbiBhY3Rpb24gb24gZGVzdGluYXRpb24gcm91dGVzIGR1cmluZyBh IHRyYW5zaXRpb24sIHlvdSBjYW4gY2FsbCBgLnNlbmQoKWAgb24gdGhlIGBU cmFuc2l0aW9uYCBvYmplY3QgcGFzc2VkIHRvIHRoZSBgbW9kZWwvYmVmb3Jl TW9kZWwvYWZ0ZXJNb2RlbGAgaG9va3MuIik7CiAgfQoKICB2YXIgZXZlbnRX YXNIYW5kbGVkID0gZmFsc2U7CgogIGZvciAodmFyIGkgPSBoYW5kbGVySW5m b3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgIHZhciBoYW5kbGVy SW5mbyA9IGhhbmRsZXJJbmZvc1tpXSwKICAgICAgICBoYW5kbGVyID0gaGFu ZGxlckluZm8uaGFuZGxlcjsKCiAgICBpZiAoaGFuZGxlci5fYWN0aW9ucyAm JiBoYW5kbGVyLl9hY3Rpb25zW25hbWVdKSB7CiAgICAgIGlmIChoYW5kbGVy Ll9hY3Rpb25zW25hbWVdLmFwcGx5KGhhbmRsZXIsIGFyZ3MpID09PSB0cnVl KSB7CiAgICAgICAgZXZlbnRXYXNIYW5kbGVkID0gdHJ1ZTsKICAgICAgfSBl bHNlIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgIH0KICB9CgogIGlm IChkZWZhdWx0QWN0aW9uSGFuZGxlcnNbbmFtZV0pIHsKICAgIGRlZmF1bHRB Y3Rpb25IYW5kbGVyc1tuYW1lXS5hcHBseShudWxsLCBhcmdzKTsKICAgIHJl dHVybjsKICB9CgogIGlmICghZXZlbnRXYXNIYW5kbGVkICYmICFpZ25vcmVG YWlsdXJlKSB7CiAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoIk5vdGhpbmcg aGFuZGxlZCB0aGUgYWN0aW9uICciICsgbmFtZSArICInLiBJZiB5b3UgZGlk IGhhbmRsZSB0aGUgYWN0aW9uLCB0aGlzIGVycm9yIGNhbiBiZSBjYXVzZWQg YnkgcmV0dXJuaW5nIHRydWUgZnJvbSBhbiBhY3Rpb24gaGFuZGxlciBpbiBh IGNvbnRyb2xsZXIsIGNhdXNpbmcgdGhlIGFjdGlvbiB0byBidWJibGUuIik7 CiAgfQp9CgpmdW5jdGlvbiB1cGRhdGVQYXRocyhyb3V0ZXIpIHsKICB2YXIg YXBwQ29udHJvbGxlciA9IHJvdXRlci5jb250YWluZXIubG9va3VwKCdjb250 cm9sbGVyOmFwcGxpY2F0aW9uJyk7CgogIGlmICghYXBwQ29udHJvbGxlcikg ewogICAgLy8gYXBwQ29udHJvbGxlciBtaWdodCBub3QgZXhpc3Qgd2hlbiB0 b3AtbGV2ZWwgbG9hZGluZy9lcnJvcgogICAgLy8gc3Vic3RhdGVzIGhhdmUg YmVlbiBlbnRlcmVkIHNpbmNlIEFwcGxpY2F0aW9uUm91dGUgaGFzbid0CiAg ICAvLyBhY3R1YWxseSBiZWVuIGVudGVyZWQgYXQgdGhhdCBwb2ludC4KICAg IHJldHVybjsKICB9CgogIHZhciBpbmZvcyA9IHJvdXRlci5yb3V0ZXIuY3Vy cmVudEhhbmRsZXJJbmZvcywKICAgICAgcGF0aCA9IEVtYmVyLlJvdXRlci5f cm91dGVQYXRoKGluZm9zKTsKCiAgaWYgKCEoJ2N1cnJlbnRQYXRoJyBpbiBh cHBDb250cm9sbGVyKSkgewogICAgZGVmaW5lUHJvcGVydHkoYXBwQ29udHJv bGxlciwgJ2N1cnJlbnRQYXRoJyk7CiAgfQoKICBzZXQoYXBwQ29udHJvbGxl ciwgJ2N1cnJlbnRQYXRoJywgcGF0aCk7CgogIGlmICghKCdjdXJyZW50Um91 dGVOYW1lJyBpbiBhcHBDb250cm9sbGVyKSkgewogICAgZGVmaW5lUHJvcGVy dHkoYXBwQ29udHJvbGxlciwgJ2N1cnJlbnRSb3V0ZU5hbWUnKTsKICB9Cgog IHNldChhcHBDb250cm9sbGVyLCAnY3VycmVudFJvdXRlTmFtZScsIGluZm9z W2luZm9zLmxlbmd0aCAtIDFdLm5hbWUpOwp9CgpFbWJlci5Sb3V0ZXIucmVv cGVuQ2xhc3MoewogIHJvdXRlcjogbnVsbCwKICBtYXA6IGZ1bmN0aW9uKGNh bGxiYWNrKSB7CiAgICB2YXIgcm91dGVyID0gdGhpcy5yb3V0ZXI7CiAgICBp ZiAoIXJvdXRlcikgewogICAgICByb3V0ZXIgPSBuZXcgUm91dGVyKCk7CiAg ICAgIHJvdXRlci5jYWxsYmFja3MgPSBbXTsKICAgICAgcm91dGVyLnRyaWdn ZXJFdmVudCA9IHRyaWdnZXJFdmVudDsKICAgICAgdGhpcy5yZW9wZW5DbGFz cyh7IHJvdXRlcjogcm91dGVyIH0pOwogICAgfQoKICAgIHZhciBkc2wgPSBF bWJlci5Sb3V0ZXJEU0wubWFwKGZ1bmN0aW9uKCkgewogICAgICB0aGlzLnJl c291cmNlKCdhcHBsaWNhdGlvbicsIHsgcGF0aDogIi8iIH0sIGZ1bmN0aW9u KCkgewogICAgICAgIGZvciAodmFyIGk9MDsgaSA8IHJvdXRlci5jYWxsYmFj a3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHJvdXRlci5jYWxsYmFja3Nb aV0uY2FsbCh0aGlzKTsKICAgICAgICB9CiAgICAgICAgY2FsbGJhY2suY2Fs bCh0aGlzKTsKICAgICAgfSk7CiAgICB9KTsKCiAgICByb3V0ZXIuY2FsbGJh Y2tzLnB1c2goY2FsbGJhY2spOwogICAgcm91dGVyLm1hcChkc2wuZ2VuZXJh dGUoKSk7CiAgICByZXR1cm4gcm91dGVyOwogIH0sCgogIF9yb3V0ZVBhdGg6 IGZ1bmN0aW9uKGhhbmRsZXJJbmZvcykgewogICAgdmFyIHBhdGggPSBbXTsK CiAgICAvLyBXZSBoYXZlIHRvIGhhbmRsZSBjb2FsZXNjaW5nIHJlc291cmNl IG5hbWVzIHRoYXQKICAgIC8vIGFyZSBwcmVmaXhlZCB3aXRoIHRoZWlyIHBh cmVudCdzIG5hbWVzLCBlLmcuCiAgICAvLyBbJ2ZvbycsICdmb28uYmFyLmJh eiddID0+ICdmb28uYmFyLmJheicsIG5vdCAnZm9vLmZvby5iYXIuYmF6JwoK ICAgIGZ1bmN0aW9uIGludGVyc2VjdGlvbk1hdGNoZXMoYTEsIGEyKSB7CiAg ICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhMS5sZW5ndGg7IGkgPCBsZW47 ICsraSkgewogICAgICAgIGlmIChhMVtpXSAhPT0gYTJbaV0pIHsKICAgICAg ICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0 dXJuIHRydWU7CiAgICB9CgogICAgZm9yICh2YXIgaT0xLCBsPWhhbmRsZXJJ bmZvcy5sZW5ndGg7IGk8bDsgaSsrKSB7CiAgICAgIHZhciBuYW1lID0gaGFu ZGxlckluZm9zW2ldLm5hbWUsCiAgICAgICAgICBuYW1lUGFydHMgPSBuYW1l LnNwbGl0KCIuIiksCiAgICAgICAgICBvbGROYW1lUGFydHMgPSBzbGljZS5j YWxsKHBhdGgpOwoKICAgICAgd2hpbGUgKG9sZE5hbWVQYXJ0cy5sZW5ndGgp IHsKICAgICAgICBpZiAoaW50ZXJzZWN0aW9uTWF0Y2hlcyhvbGROYW1lUGFy dHMsIG5hbWVQYXJ0cykpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0K ICAgICAgICBvbGROYW1lUGFydHMuc2hpZnQoKTsKICAgICAgfQoKICAgICAg cGF0aC5wdXNoLmFwcGx5KHBhdGgsIG5hbWVQYXJ0cy5zbGljZShvbGROYW1l UGFydHMubGVuZ3RoKSk7CiAgICB9CgogICAgcmV0dXJuIHBhdGguam9pbigi LiIpOwogIH0sCgogIF90cmFuc2xhdGVRdWVyeVBhcmFtczogZnVuY3Rpb24o cXVlcnlQYXJhbXMsIHRyYW5zbGF0aW9ucywgcm91dGVOYW1lKSB7CiAgICBm b3IgKHZhciBuYW1lIGluIHF1ZXJ5UGFyYW1zKSB7CiAgICAgIGlmICghcXVl cnlQYXJhbXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHsgY29udGludWU7IH0K CiAgICAgIGlmIChuYW1lIGluIHRyYW5zbGF0aW9ucykgewogICAgICAgIHF1 ZXJ5UGFyYW1zW3RyYW5zbGF0aW9uc1tuYW1lXV0gPSBxdWVyeVBhcmFtc1tu YW1lXTsKICAgICAgICBkZWxldGUgcXVlcnlQYXJhbXNbbmFtZV07CiAgICAg IH0gZWxzZSB7CiAgICAgICAgRW1iZXIuYXNzZXJ0KGZtdCgiWW91IHN1cHBs aWVkIGFuIHVua25vd24gcXVlcnkgcGFyYW0gY29udHJvbGxlciBwcm9wZXJ0 eSAnJUAnIGZvciByb3V0ZSAnJUAnLiBPbmx5IHRoZSBmb2xsb3dpbmcgcXVl cnkgcGFyYW0gcHJvcGVydGllcyBjYW4gYmUgc2V0IGZvciB0aGlzIHJvdXRl OiAlQCIsIFtuYW1lLCByb3V0ZU5hbWUsIEVtYmVyLmtleXModHJhbnNsYXRp b25zKV0pLCBuYW1lIGluIHF1ZXJ5UGFyYW1zKTsKICAgICAgfQogICAgfQog IH0sCgogIF9kZXNjb3BlUXVlcnlQYXJhbTogZnVuY3Rpb24ocGFyYW0pIHsK ICAgIHZhciByZWdleCA9IC9cWyguKylcXS8sCiAgICAgICAgcmVzdWx0ID0g cGFyYW0ubWF0Y2gocmVnZXgpOwoKICAgIGlmICghcmVzdWx0KSB7CiAgICAg IHJlc3VsdCA9IHBhcmFtOwogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0ID0g cmVzdWx0WzFdOwogICAgfQoKICAgIHJldHVybiByZXN1bHQ7CiAgfQp9KTsK CgoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewovKioKQG1vZHVsZSBlbWJlcgpA c3VibW9kdWxlIGVtYmVyLXJvdXRpbmcKKi8KCnZhciBnZXQgPSBFbWJlci5n ZXQsIHNldCA9IEVtYmVyLnNldCwKICAgIGdldFByb3BlcnRpZXMgPSBFbWJl ci5nZXRQcm9wZXJ0aWVzLAogICAgY2xhc3NpZnkgPSBFbWJlci5TdHJpbmcu Y2xhc3NpZnksCiAgICBmbXQgPSBFbWJlci5TdHJpbmcuZm10LAogICAgYV9m b3JFYWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2gsCiAgICBh X3JlcGxhY2UgPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMucmVwbGFjZTsKCgov KioKICBUaGUgYEVtYmVyLlJvdXRlYCBjbGFzcyBpcyB1c2VkIHRvIGRlZmlu ZSBpbmRpdmlkdWFsIHJvdXRlcy4gUmVmZXIgdG8KICB0aGUgW3JvdXRpbmcg Z3VpZGVdKGh0dHA6Ly9lbWJlcmpzLmNvbS9ndWlkZXMvcm91dGluZy8pIGZv ciBkb2N1bWVudGF0aW9uLgoKICBAY2xhc3MgUm91dGUKICBAbmFtZXNwYWNl IEVtYmVyCiAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0CiAgQHVzZXMgRW1iZXIu QWN0aW9uSGFuZGxlcgoqLwpFbWJlci5Sb3V0ZSA9IEVtYmVyLk9iamVjdC5l eHRlbmQoRW1iZXIuQWN0aW9uSGFuZGxlciwgewoKICAvKioKICAgIEBwcml2 YXRlCgogICAgQG1ldGhvZCBleGl0CiAgKi8KICBleGl0OiBmdW5jdGlvbigp IHsKICAgIGlmIChFbWJlci5GRUFUVVJFUy5pc0VuYWJsZWQoInF1ZXJ5LXBh cmFtcy1uZXciKSkgewogICAgICB0aGlzLmNvbnRyb2xsZXIuX2RlYWN0aXZh dGVRdWVyeVBhcmFtT2JzZXJ2ZXJzKCk7CiAgICB9CiAgICB0aGlzLmRlYWN0 aXZhdGUoKTsKICAgIHRoaXMudGVhcmRvd25WaWV3cygpOwogIH0sCgogIC8q KgogICAgQHByaXZhdGUKCiAgICBAbWV0aG9kIGVudGVyCiAgKi8KICBlbnRl cjogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmFjdGl2YXRlKCk7CiAgfSwKCiAg LyoqCiAgICBUaGUgbmFtZSBvZiB0aGUgdmlldyB0byB1c2UgYnkgZGVmYXVs dCB3aGVuIHJlbmRlcmluZyB0aGlzIHJvdXRlcyB0ZW1wbGF0ZS4KCiAgICBX aGVuIHJlbmRlcmluZyBhIHRlbXBsYXRlLCB0aGUgcm91dGUgd2lsbCwgYnkg ZGVmYXVsdCwgZGV0ZXJtaW5lIHRoZQogICAgdGVtcGxhdGUgYW5kIHZpZXcg dG8gdXNlIGZyb20gdGhlIG5hbWUgb2YgdGhlIHJvdXRlIGl0c2VsZi4gSWYg eW91IG5lZWQgdG8KICAgIGRlZmluZSBhIHNwZWNpZmljIHZpZXcsIHNldCB0 aGlzIHByb3BlcnR5LgoKICAgIFRoaXMgaXMgdXNlZnVsIHdoZW4gbXVsdGlw bGUgcm91dGVzIHdvdWxkIGJlbmVmaXQgZnJvbSB1c2luZyB0aGUgc2FtZSB2 aWV3CiAgICBiZWNhdXNlIGl0IGRvZXNuJ3QgcmVxdWlyZSBhIGN1c3RvbSBg cmVuZGVyVGVtcGxhdGVgIG1ldGhvZC4gRm9yIGV4YW1wbGUsCiAgICB0aGUg Zm9sbG93aW5nIHJvdXRlcyB3aWxsIGFsbCByZW5kZXIgdXNpbmcgdGhlIGBB cHAuUG9zdHNMaXN0Vmlld2AgdmlldzoKCiAgICBgYGBqcwogICAgdmFyIFBv c3RzTGlzdCA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7CiAgICAgIHZpZXdOYW1l OiAncG9zdHNMaXN0JywKICAgIH0pOwoKICAgIEFwcC5Qb3N0c0luZGV4Um91 dGUgPSBQb3N0c0xpc3QuZXh0ZW5kKCk7CiAgICBBcHAuUG9zdHNBcmNoaXZl ZFJvdXRlID0gUG9zdHNMaXN0LmV4dGVuZCgpOwogICAgYGBgCgogICAgQHBy b3BlcnR5IHZpZXdOYW1lCiAgICBAdHlwZSBTdHJpbmcKICAgIEBkZWZhdWx0 IG51bGwKICAqLwogIHZpZXdOYW1lOiBudWxsLAoKICAvKioKICAgIFRoZSBu YW1lIG9mIHRoZSB0ZW1wbGF0ZSB0byB1c2UgYnkgZGVmYXVsdCB3aGVuIHJl bmRlcmluZyB0aGlzIHJvdXRlcwogICAgdGVtcGxhdGUuCgogICAgVGhpcyBp cyBzaW1pbGFyIHdpdGggYHZpZXdOYW1lYCwgYnV0IGlzIHVzZWZ1bCB3aGVu IHlvdSBqdXN0IHdhbnQgYSBjdXN0b20KICAgIHRlbXBsYXRlIHdpdGhvdXQg YSB2aWV3LgoKICAgIGBgYGpzCiAgICB2YXIgUG9zdHNMaXN0ID0gRW1iZXIu Um91dGUuZXh0ZW5kKHsKICAgICAgdGVtcGxhdGVOYW1lOiAncG9zdHMvbGlz dCcKICAgIH0pOwoKICAgIEFwcC5Qb3N0c0luZGV4Um91dGUgPSBQb3N0c0xp c3QuZXh0ZW5kKCk7CiAgICBBcHAuUG9zdHNBcmNoaXZlZFJvdXRlID0gUG9z dHNMaXN0LmV4dGVuZCgpOwogICAgYGBgCgogICAgQHByb3BlcnR5IHRlbXBs YXRlTmFtZQogICAgQHR5cGUgU3RyaW5nCiAgICBAZGVmYXVsdCBudWxsCiAg Ki8KICB0ZW1wbGF0ZU5hbWU6IG51bGwsCgogIC8qKgogICAgVGhlIG5hbWUg b2YgdGhlIGNvbnRyb2xsZXIgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyByb3V0 ZS4KCiAgICBCeSBkZWZhdWx0LCBFbWJlciB3aWxsIGxvb2t1cCBhIHJvdXRl J3MgY29udHJvbGxlciB0aGF0IG1hdGNoZXMgdGhlIG5hbWUKICAgIG9mIHRo ZSByb3V0ZSAoaS5lLiBgQXBwLlBvc3RDb250cm9sbGVyYCBmb3IgYEFwcC5Q b3N0Um91dGVgKS4gSG93ZXZlciwKICAgIGlmIHlvdSB3b3VsZCBsaWtlIHRv IGRlZmluZSBhIHNwZWNpZmljIGNvbnRyb2xsZXIgdG8gdXNlLCB5b3UgY2Fu IGRvIHNvCiAgICB1c2luZyB0aGlzIHByb3BlcnR5LgoKICAgIFRoaXMgaXMg dXNlZnVsIGluIG1hbnkgd2F5cywgYXMgdGhlIGNvbnRyb2xsZXIgc3BlY2lm aWVkIHdpbGwgYmU6CgogICAgKiBwYXNzZWQgdG8gdGhlIGBzZXR1cENvbnRy b2xsZXJgIG1ldGhvZC4KICAgICogdXNlZCBhcyB0aGUgY29udHJvbGxlciBm b3IgdGhlIHZpZXcgYmVpbmcgcmVuZGVyZWQgYnkgdGhlIHJvdXRlLgogICAg KiByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byBgY29udHJvbGxlckZvcmAgZm9y IHRoZSByb3V0ZS4KCiAgICBAcHJvcGVydHkgY29udHJvbGxlck5hbWUKICAg IEB0eXBlIFN0cmluZwogICAgQGRlZmF1bHQgbnVsbAogICovCiAgY29udHJv bGxlck5hbWU6IG51bGwsCgogIC8qKgogICAgVGhlIGNvbGxlY3Rpb24gb2Yg ZnVuY3Rpb25zLCBrZXllZCBieSBuYW1lLCBhdmFpbGFibGUgb24gdGhpcyBy b3V0ZSBhcwogICAgYWN0aW9uIHRhcmdldHMuCgogICAgVGhlc2UgZnVuY3Rp b25zIHdpbGwgYmUgaW52b2tlZCB3aGVuIGEgbWF0Y2hpbmcgYHt7YWN0aW9u fX1gIGlzIHRyaWdnZXJlZAogICAgZnJvbSB3aXRoaW4gYSB0ZW1wbGF0ZSBh bmQgdGhlIGFwcGxpY2F0aW9uJ3MgY3VycmVudCByb3V0ZSBpcyB0aGlzIHJv dXRlLgoKICAgIEFjdGlvbnMgY2FuIGFsc28gYmUgaW52b2tlZCBmcm9tIG90 aGVyIHBhcnRzIG9mIHlvdXIgYXBwbGljYXRpb24gdmlhIGBSb3V0ZSNzZW5k YAogICAgb3IgYENvbnRyb2xsZXIjc2VuZGAuCgogICAgVGhlIGBhY3Rpb25z YCBoYXNoIHdpbGwgaW5oZXJpdCBhY3Rpb24gaGFuZGxlcnMgZnJvbQogICAg dGhlIGBhY3Rpb25zYCBoYXNoIGRlZmluZWQgb24gZXh0ZW5kZWQgUm91dGUg cGFyZW50IGNsYXNzZXMKICAgIG9yIG1peGlucyByYXRoZXIgdGhhbiBqdXN0 IHJlcGxhY2UgdGhlIGVudGlyZSBoYXNoLCBlLmcuOgoKICAgIGBgYGpzCiAg ICBBcHAuQ2FuRGlzcGxheUJhbm5lciA9IEVtYmVyLk1peGluLmNyZWF0ZSh7 CiAgICAgIGFjdGlvbnM6IHsKICAgICAgICBkaXNwbGF5QmFubmVyOiBmdW5j dGlvbihtc2cpIHsKICAgICAgICAgIC8vIC4uLgogICAgICAgIH0KICAgICAg fQogICAgfSk7CgogICAgQXBwLldlbGNvbWVSb3V0ZSA9IEVtYmVyLlJvdXRl LmV4dGVuZChBcHAuQ2FuRGlzcGxheUJhbm5lciwgewogICAgICBhY3Rpb25z OiB7CiAgICAgICAgcGxheU11c2ljOiBmdW5jdGlvbigpIHsKICAgICAgICAg IC8vIC4uLgogICAgICAgIH0KICAgICAgfQogICAgfSk7CgogICAgLy8gYFdl bGNvbWVSb3V0ZWAsIHdoZW4gYWN0aXZlLCB3aWxsIGJlIGFibGUgdG8gcmVz cG9uZAogICAgLy8gdG8gYm90aCBhY3Rpb25zLCBzaW5jZSB0aGUgYWN0aW9u cyBoYXNoIGlzIG1lcmdlZCByYXRoZXIKICAgIC8vIHRoZW4gcmVwbGFjZWQg d2hlbiBleHRlbmRpbmcgbWl4aW5zIC8gcGFyZW50IGNsYXNzZXMuCiAgICB0 aGlzLnNlbmQoJ2Rpc3BsYXlCYW5uZXInKTsKICAgIHRoaXMuc2VuZCgncGxh eU11c2ljJyk7CiAgICBgYGAKCiAgICBXaXRoaW4gYSByb3V0ZSdzIGFjdGlv biBoYW5kbGVyLCB0aGUgdmFsdWUgb2YgdGhlIGB0aGlzYCBjb250ZXh0CiAg ICBpcyB0aGUgUm91dGUgb2JqZWN0OgoKICAgIGBgYGpzCiAgICBBcHAuU29u Z1JvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKICAgICAgYWN0aW9uczog ewogICAgICAgIG15QWN0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgIHRo aXMuY29udHJvbGxlckZvcigic29uZyIpOwogICAgICAgICAgdGhpcy50cmFu c2l0aW9uVG8oIm90aGVyLnJvdXRlIik7CiAgICAgICAgICAuLi4KICAgICAg ICB9CiAgICAgIH0KICAgIH0pOwogICAgYGBgCgogICAgSXQgaXMgYWxzbyBw b3NzaWJsZSB0byBjYWxsIGB0aGlzLl9zdXBlcigpYCBmcm9tIHdpdGhpbiBh bgogICAgYWN0aW9uIGhhbmRsZXIgaWYgaXQgb3ZlcnJpZGVzIGEgaGFuZGxl ciBkZWZpbmVkIG9uIGEgcGFyZW50CiAgICBjbGFzcyBvciBtaXhpbjoKCiAg ICBUYWtlIGZvciBleGFtcGxlIHRoZSBmb2xsb3dpbmcgcm91dGVzOgoKICAg IGBgYGpzCiAgICBBcHAuRGVidWdSb3V0ZSA9IEVtYmVyLk1peGluLmNyZWF0 ZSh7CiAgICAgIGFjdGlvbnM6IHsKICAgICAgICBkZWJ1Z1JvdXRlSW5mb3Jt YXRpb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgY29uc29sZS5kZWJ1Zygi dHJvbG9sbyIpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CgogICAgQXBw LkFubm95aW5nRGVidWdSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZChBcHAu RGVidWdSb3V0ZSwgewogICAgICBhY3Rpb25zOiB7CiAgICAgICAgZGVidWdS b3V0ZUluZm9ybWF0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgIC8vIGFs c28gY2FsbCB0aGUgZGVidWdSb3V0ZUluZm9ybWF0aW9uIG9mIG1peGVkIGlu IEFwcC5EZWJ1Z1JvdXRlCiAgICAgICAgICB0aGlzLl9zdXBlcigpOwoKICAg ICAgICAgIC8vIHNob3cgYWRkaXRpb25hbCBhbm5veWFuY2UKICAgICAgICAg IHdpbmRvdy5hbGVydCguLi4pOwogICAgICAgIH0KICAgICAgfQogICAgfSk7 CiAgICBgYGAKCiAgICAjIyBCdWJibGluZwoKICAgIEJ5IGRlZmF1bHQsIGFu IGFjdGlvbiB3aWxsIHN0b3AgYnViYmxpbmcgb25jZSBhIGhhbmRsZXIgZGVm aW5lZAogICAgb24gdGhlIGBhY3Rpb25zYCBoYXNoIGhhbmRsZXMgaXQuIFRv IGNvbnRpbnVlIGJ1YmJsaW5nIHRoZSBhY3Rpb24sCiAgICB5b3UgbXVzdCBy ZXR1cm4gYHRydWVgIGZyb20gdGhlIGhhbmRsZXI6CgogICAgYGBganMKICAg IEFwcC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkgewogICAgICB0aGlzLnJlc291 cmNlKCJhbGJ1bSIsIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMucm91dGUo InNvbmciKTsKICAgICAgfSk7CiAgICB9KTsKCiAgICBBcHAuQWxidW1Sb3V0 ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7CiAgICAgIGFjdGlvbnM6IHsKICAg ICAgICBzdGFydFBsYXlpbmc6IGZ1bmN0aW9uKCkgewogICAgICAgIH0KICAg ICAgfQogICAgfSk7CgogICAgQXBwLkFsYnVtU29uZ1JvdXRlID0gRW1iZXIu Um91dGUuZXh0ZW5kKHsKICAgICAgYWN0aW9uczogewogICAgICAgIHN0YXJ0 UGxheWluZzogZnVuY3Rpb24oKSB7CiAgICAgICAgICAvLyAuLi4KCiAgICAg ICAgICBpZiAoYWN0aW9uU2hvdWxkQWxzb0JlVHJpZ2dlcmVkT25QYXJlbnRS b3V0ZSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0K ICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogICAgYGBgCgogICAgIyMgQnVp bHQtaW4gYWN0aW9ucwoKICAgIFRoZXJlIGFyZSBhIGZldyBidWlsdC1pbiBh Y3Rpb25zIHBlcnRhaW5pbmcgdG8gdHJhbnNpdGlvbnMgdGhhdCB5b3UKICAg IGNhbiB1c2UgdG8gY3VzdG9taXplIHRyYW5zaXRpb24gYmVoYXZpb3I6IGB3 aWxsVHJhbnNpdGlvbmAgYW5kCiAgICBgZXJyb3JgLgoKICAgICMjIyBgd2ls bFRyYW5zaXRpb25gCgogICAgVGhlIGB3aWxsVHJhbnNpdGlvbmAgYWN0aW9u IGlzIGZpcmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYW55CiAgICBhdHRlbXB0 ZWQgdHJhbnNpdGlvbiB3aXRoIGEgYFRyYW5zaXRpb25gIG9iamVjdCBhcyB0 aGUgc29sZQogICAgYXJndW1lbnQuIFRoaXMgYWN0aW9uIGNhbiBiZSB1c2Vk IGZvciBhYm9ydGluZywgcmVkaXJlY3RpbmcsCiAgICBvciBkZWNvcmF0aW5n IHRoZSB0cmFuc2l0aW9uIGZyb20gdGhlIGN1cnJlbnRseSBhY3RpdmUgcm91 dGVzLgoKICAgIEEgZ29vZCBleGFtcGxlIGlzIHByZXZlbnRpbmcgbmF2aWdh dGlvbiB3aGVuIGEgZm9ybSBpcwogICAgaGFsZi1maWxsZWQgb3V0OgoKICAg IGBgYGpzCiAgICBBcHAuQ29udGFjdEZvcm1Sb3V0ZSA9IEVtYmVyLlJvdXRl LmV4dGVuZCh7CiAgICAgIGFjdGlvbnM6IHsKICAgICAgICB3aWxsVHJhbnNp dGlvbjogZnVuY3Rpb24odHJhbnNpdGlvbikgewogICAgICAgICAgaWYgKHRo aXMuY29udHJvbGxlci5nZXQoJ3VzZXJIYXNFbnRlcmVkRGF0YScpKSB7CiAg ICAgICAgICAgIHRoaXMuY29udHJvbGxlci5kaXNwbGF5TmF2aWdhdGlvbkNv bmZpcm0oKTsKICAgICAgICAgICAgdHJhbnNpdGlvbi5hYm9ydCgpOwogICAg ICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICBgYGAKCiAg ICBZb3UgY2FuIGFsc28gcmVkaXJlY3QgZWxzZXdoZXJlIGJ5IGNhbGxpbmcK ICAgIGB0aGlzLnRyYW5zaXRpb25UbygnZWxzZXdoZXJlJylgIGZyb20gd2l0 aGluIGB3aWxsVHJhbnNpdGlvbmAuCiAgICBOb3RlIHRoYXQgYHdpbGxUcmFu c2l0aW9uYCB3aWxsIG5vdCBiZSBmaXJlZCBmb3IgdGhlCiAgICByZWRpcmVj dGluZyBgdHJhbnNpdGlvblRvYCwgc2luY2UgYHdpbGxUcmFuc2l0aW9uYCBk b2Vzbid0CiAgICBmaXJlIHdoZW4gdGhlcmUgaXMgYWxyZWFkeSBhIHRyYW5z aXRpb24gdW5kZXJ3YXkuIElmIHlvdSB3YW50CiAgICBzdWJzZXF1ZW50IGB3 aWxsVHJhbnNpdGlvbmAgYWN0aW9ucyB0byBmaXJlIGZvciB0aGUgcmVkaXJl Y3RpbmcKICAgIHRyYW5zaXRpb24sIHlvdSBtdXN0IGZpcnN0IGV4cGxpY2l0 bHkgY2FsbAogICAgYHRyYW5zaXRpb24uYWJvcnQoKWAuCgogICAgIyMjIGBl cnJvcmAKCiAgICBXaGVuIGF0dGVtcHRpbmcgdG8gdHJhbnNpdGlvbiBpbnRv IGEgcm91dGUsIGFueSBvZiB0aGUgaG9va3MKICAgIG1heSByZXR1cm4gYSBw cm9taXNlIHRoYXQgcmVqZWN0cywgYXQgd2hpY2ggcG9pbnQgYW4gYGVycm9y YAogICAgYWN0aW9uIHdpbGwgYmUgZmlyZWQgb24gdGhlIHBhcnRpYWxseS1l bnRlcmVkIHJvdXRlcywgYWxsb3dpbmcKICAgIGZvciBwZXItcm91dGUgZXJy b3IgaGFuZGxpbmcgbG9naWMsIG9yIHNoYXJlZCBlcnJvciBoYW5kbGluZwog ICAgbG9naWMgZGVmaW5lZCBvbiBhIHBhcmVudCByb3V0ZS4KCiAgICBIZXJl IGlzIGFuIGV4YW1wbGUgb2YgYW4gZXJyb3IgaGFuZGxlciB0aGF0IHdpbGwg YmUgaW52b2tlZAogICAgZm9yIHJlamVjdGVkIHByb21pc2VzIGZyb20gdGhl IHZhcmlvdXMgaG9va3Mgb24gdGhlIHJvdXRlLAogICAgYXMgd2VsbCBhcyBh bnkgdW5oYW5kbGVkIGVycm9ycyBmcm9tIGNoaWxkIHJvdXRlczoKCiAgICBg YGBqcwogICAgQXBwLkFkbWluUm91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQo ewogICAgICBiZWZvcmVNb2RlbDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0 dXJuIEVtYmVyLlJTVlAucmVqZWN0KCJiYWQgdGhpbmdzISIpOwogICAgICB9 LAoKICAgICAgYWN0aW9uczogewogICAgICAgIGVycm9yOiBmdW5jdGlvbihl cnJvciwgdHJhbnNpdGlvbikgewogICAgICAgICAgLy8gQXNzdW1pbmcgd2Ug Z290IGhlcmUgZHVlIHRvIHRoZSBlcnJvciBpbiBgYmVmb3JlTW9kZWxgLAog ICAgICAgICAgLy8gd2UgY2FuIGV4cGVjdCB0aGF0IGVycm9yID09PSAiYmFk IHRoaW5ncyEiLAogICAgICAgICAgLy8gYnV0IGEgcHJvbWlzZSBtb2RlbCBy ZWplY3Rpbmcgd291bGQgYWxzbwogICAgICAgICAgLy8gY2FsbCB0aGlzIGhv b2ssIGFzIHdvdWxkIGFueSBlcnJvcnMgZW5jb3VudGVyZWQKICAgICAgICAg IC8vIGluIGBhZnRlck1vZGVsYC4KCiAgICAgICAgICAvLyBUaGUgYGVycm9y YCBob29rIGlzIGFsc28gcHJvdmlkZWQgdGhlIGZhaWxlZAogICAgICAgICAg Ly8gYHRyYW5zaXRpb25gLCB3aGljaCBjYW4gYmUgc3RvcmVkIGFuZCBsYXRl cgogICAgICAgICAgLy8gYC5yZXRyeSgpYGQgaWYgZGVzaXJlZC4KCiAgICAg ICAgICB0aGlzLnRyYW5zaXRpb25UbygnbG9naW4nKTsKICAgICAgICB9CiAg ICAgIH0KICAgIH0pOwogICAgYGBgCgogICAgYGVycm9yYCBhY3Rpb25zIHRo YXQgYnViYmxlIHVwIGFsbCB0aGUgd2F5IHRvIGBBcHBsaWNhdGlvblJvdXRl YAogICAgd2lsbCBmaXJlIGEgZGVmYXVsdCBlcnJvciBoYW5kbGVyIHRoYXQg bG9ncyB0aGUgZXJyb3IuIFlvdSBjYW4KICAgIHNwZWNpZnkgeW91ciBvd24g Z2xvYmFsIGRlZmF1bHQgZXJyb3IgaGFuZGxlciBieSBvdmVycmlkaW5nIHRo ZQogICAgYGVycm9yYCBoYW5kbGVyIG9uIGBBcHBsaWNhdGlvblJvdXRlYDoK CiAgICBgYGBqcwogICAgQXBwLkFwcGxpY2F0aW9uUm91dGUgPSBFbWJlci5S b3V0ZS5leHRlbmQoewogICAgICBhY3Rpb25zOiB7CiAgICAgICAgZXJyb3I6 IGZ1bmN0aW9uKGVycm9yLCB0cmFuc2l0aW9uKSB7CiAgICAgICAgICB0aGlz LmNvbnRyb2xsZXJGb3IoJ2Jhbm5lcicpLmRpc3BsYXlFcnJvcihlcnJvci5t ZXNzYWdlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogICAgYGBgCgog ICAgQHByb3BlcnR5IGFjdGlvbnMKICAgIEB0eXBlIEhhc2gKICAgIEBkZWZh dWx0IG51bGwKICAqLwogIF9hY3Rpb25zOiB7CiAgICBmaW5hbGl6ZVF1ZXJ5 UGFyYW1DaGFuZ2U6IGZ1bmN0aW9uKHBhcmFtcywgZmluYWxQYXJhbXMpIHsK ICAgICAgaWYgKEVtYmVyLkZFQVRVUkVTLmlzRW5hYmxlZCgicXVlcnktcGFy YW1zLW5ldyIpKSB7CiAgICAgICAgLy8gSW4gdGhpcyBob29rIHdlIHJlY2Vp dmUgYSBsaXN0IG9mIHJhdyBVUkwgcXVlcnkKICAgICAgICAvLyBwYXJhbSBj aGFuZ2VzLiBXZSBuZWVkIHRvIHRha2UgYW55CgogICAgICAgIHZhciBjb250 cm9sbGVyID0gdGhpcy5jb250cm9sbGVyOwogICAgICAgIHZhciBjaGFuZ2Vz ID0gY29udHJvbGxlci5fcXVlcnlQYXJhbUNoYW5nZXNEdXJpbmdTdXNwZW5z aW9uOwogICAgICAgIHZhciBxdWVyeVBhcmFtcyA9IGdldChjb250cm9sbGVy LCAnX3F1ZXJ5UGFyYW1IYXNoJyk7CgogICAgICAgIC8vIExvb3AgdGhyb3Vn aCBhbGwgdGhlIHF1ZXJ5IHBhcmFtcyB0aGF0CiAgICAgICAgLy8gdGhpcyBj b250cm9sbGVyIGtub3dzIGFib3V0LgogICAgICAgIGZvciAodmFyIGsgaW4g cXVlcnlQYXJhbXMpIHsKICAgICAgICAgIGlmIChxdWVyeVBhcmFtcy5oYXNP d25Qcm9wZXJ0eShrKSkgewoKICAgICAgICAgICAgdmFyIGtleSA9IGZhbHNl LAogICAgICAgICAgICAgICAgZGVzY29wZWRLZXkgPSBFbWJlci5Sb3V0ZXIu X2Rlc2NvcGVRdWVyeVBhcmFtKGspOwoKICAgICAgICAgICAgaWYgKHF1ZXJ5 UGFyYW1zW2tdIGluIHBhcmFtcykgewogICAgICAgICAgICAgIGtleSA9IHF1 ZXJ5UGFyYW1zW2tdOwogICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtc1tk ZXNjb3BlZEtleV0gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgIGtl eSA9IGRlc2NvcGVkS2V5OwogICAgICAgICAgICB9CgogICAgICAgICAgICAv LyBEbyBhIHJldmVyc2UgbG9va3VwIHRvIHNlZSBpZiB0aGUgY2hhbmdlZCBx dWVyeQogICAgICAgICAgICAvLyBwYXJhbSBVUkwga2V5IGNvcnJlc3BvbmRz IHRvIGEgUVAgcHJvcGVydHkgb24KICAgICAgICAgICAgLy8gdGhpcyBjb250 cm9sbGVyLgogICAgICAgICAgICBpZiAoa2V5KSB7CiAgICAgICAgICAgICAg Ly8gVXBkYXRlIHRoaXMgY29udHJvbGxlciBwcm9wZXJ0eSBpbiBhIHdheSB0 aGF0CiAgICAgICAgICAgICAgLy8gd29uJ3QgZmlyZSBvYnNlcnZlcnMuCiAg ICAgICAgICAgICAgY29udHJvbGxlci5fZmluYWxpemluZ1F1ZXJ5UGFyYW1z ID0gdHJ1ZTsKICAgICAgICAgICAgICBpZiAoIWNoYW5nZXMgfHwgIShrIGlu IGNoYW5nZXMpKSB7CiAgICAgICAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSB0 aGUgY29udHJvbGxlciBpZiB0aGUgcXVlcnkgcGFyYW0KICAgICAgICAgICAg ICAgIC8vIHZhbHVlIHdhc24ndCBvdmVycmlkZW4gaW4gc2V0dXBDb250cm9s bGVyLgoKICAgICAgICAgICAgICAgIC8vIEFycmF5cyBjb21pbmcgZnJvbSBy b3V0ZXIuanMgc2hvdWxkIGJlIEVtYmVyaXplZC4KICAgICAgICAgICAgICAg IHZhciBuZXdWYWx1ZSA9IHBhcmFtc1trZXldOwogICAgICAgICAgICAgICAg bmV3VmFsdWUgPSBFbWJlci5pc0FycmF5KG5ld1ZhbHVlKSA/IEVtYmVyLkEo bmV3VmFsdWUpIDogbmV3VmFsdWU7CiAgICAgICAgICAgICAgICBzZXQoY29u dHJvbGxlciwgaywgbmV3VmFsdWUpOwogICAgICAgICAgICAgIH0KICAgICAg ICAgICAgICBjb250cm9sbGVyLl9maW5hbGl6aW5nUXVlcnlQYXJhbXMgPSBm YWxzZTsKCiAgICAgICAgICAgICAgLy8gRGVsZXRlIGZyb20gcGFyYW1zIHNv IHRoYXQgY2hpbGQgcm91dGVzCiAgICAgICAgICAgICAgLy8gZG9uJ3QgYWxz byB0cnkgdG8gcmVzcG9uZCB0byBjaGFuZ2VzIHRvCiAgICAgICAgICAgICAg Ly8gbm9uLWZ1bGx5LXF1YWxpZmllZCBxdWVyeSBwYXJhbSBuYW1lIGNoYW5n ZXMuCiAgICAgICAgICAgICAgZGVsZXRlIHBhcmFtc1trZXldOwogICAgICAg ICAgICB9CgogICAgICAgICAgICAvLyBRdWVyeSBwYXJhbXMgYXJlIG9yZGVy ZWQuIFRoaXMgYWN0aW9uIGJ1YmJsZXMgdXAKICAgICAgICAgICAgLy8gdGhl IHJvdXRlIGhpZXJhcmNoeSBzbyB3ZSB1bnNoaWZ0IHNvIHRoYXQgdGhlIGZp bmFsCiAgICAgICAgICAgIC8vIG9yZGVyIG9mIHF1ZXJ5IHBhcmFtcyBnb2Vz IGZyb20gcm9vdCB0byBsZWFmLgogICAgICAgICAgICB2YXIgcGFyYW0gPSB7 CiAgICAgICAgICAgICAgbG9uZ2Zvcm06IHF1ZXJ5UGFyYW1zW2tdLAogICAg ICAgICAgICAgIHNob3J0Zm9ybTogZGVzY29wZWRLZXksCiAgICAgICAgICAg ICAgdmFsdWU6IEVtYmVyLmNvcHkoZ2V0KGNvbnRyb2xsZXIsIGspKQogICAg ICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIHVzZUxvbmdmb3JtID0gZmFs c2U7CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGZpbmFsUGFy YW1zLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICAgICAgICAgIGlmIChm aW5hbFBhcmFtc1tpXS5rZXkgPT09IGRlc2NvcGVkS2V5KSB7CiAgICAgICAg ICAgICAgICB1c2VMb25nZm9ybSA9IHRydWU7CiAgICAgICAgICAgICAgICBm aW5hbFBhcmFtc1tpXS5rZXkgPSBmaW5hbFBhcmFtc1tpXS5sb25nZm9ybTsK ICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHBh cmFtLmtleSA9IHVzZUxvbmdmb3JtID8gcXVlcnlQYXJhbXNba10gOiBkZXNj b3BlZEtleTsKCiAgICAgICAgICAgIGZpbmFsUGFyYW1zLnVuc2hpZnQocGFy YW0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb250cm9sbGVy Ll9xdWVyeVBhcmFtQ2hhbmdlc0R1cmluZ1N1c3BlbnNpb24gPSBudWxsOwoK ICAgICAgICAvLyBCdWJibGUgc28gdGhhdCBwYXJlbnQgcm91dGVzIGNhbiBj bGFpbSBRUHMuCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0K ICB9LAoKICAvKioKICAgIEBkZXByZWNhdGVkCgogICAgUGxlYXNlIHVzZSBg YWN0aW9uc2AgaW5zdGVhZC4KICAgIEBtZXRob2QgZXZlbnRzCiAgKi8KICBl dmVudHM6IG51bGwsCgogIG1lcmdlZFByb3BlcnRpZXM6IFsnZXZlbnRzJ10s CgogIC8qKgogICAgVGhpcyBob29rIGlzIGV4ZWN1dGVkIHdoZW4gdGhlIHJv dXRlciBjb21wbGV0ZWx5IGV4aXRzIHRoaXMgcm91dGUuIEl0IGlzCiAgICBu b3QgZXhlY3V0ZWQgd2hlbiB0aGUgbW9kZWwgZm9yIHRoZSByb3V0ZSBjaGFu Z2VzLgoKICAgIEBtZXRob2QgZGVhY3RpdmF0ZQogICovCiAgZGVhY3RpdmF0 ZTogRW1iZXIuSywKCiAgLyoqCiAgICBUaGlzIGhvb2sgaXMgZXhlY3V0ZWQg d2hlbiB0aGUgcm91dGVyIGVudGVycyB0aGUgcm91dGUuIEl0IGlzIG5vdCBl eGVjdXRlZAogICAgd2hlbiB0aGUgbW9kZWwgZm9yIHRoZSByb3V0ZSBjaGFu Z2VzLgoKICAgIEBtZXRob2QgYWN0aXZhdGUKICAqLwogIGFjdGl2YXRlOiBF bWJlci5LLAoKICAvKioKICAgIFRyYW5zaXRpb24gaW50byBhbm90aGVyIHJv dXRlLiBPcHRpb25hbGx5IHN1cHBseSBtb2RlbChzKSBmb3IgdGhlCiAgICBy b3V0ZSBpbiBxdWVzdGlvbi4gSWYgbXVsdGlwbGUgbW9kZWxzIGFyZSBzdXBw bGllZCB0aGV5IHdpbGwgYmUgYXBwbGllZAogICAgbGFzdCB0byBmaXJzdCBy ZWN1cnNpdmVseSB1cCB0aGUgcmVzb3VyY2UgdHJlZSAoc2VlIE11bHRpcGxl IE1vZGVscyBFeGFtcGxlCiAgICBiZWxvdykuIFRoZSBtb2RlbChzKSB3aWxs IGJlIHNlcmlhbGl6ZWQgaW50byB0aGUgVVJMIHVzaW5nIHRoZSBhcHByb3By aWF0ZQogICAgcm91dGUncyBgc2VyaWFsaXplYCBob29rLiBTZWUgYWxzbyAn cmVwbGFjZVdpdGgnLgoKICAgIFNpbXBsZSBUcmFuc2l0aW9uIEV4YW1wbGUK CiAgICBgYGBqYXZhc2NyaXB0CiAgICBBcHAuUm91dGVyLm1hcChmdW5jdGlv bigpIHsKICAgICAgdGhpcy5yb3V0ZSgiaW5kZXgiKTsKICAgICAgdGhpcy5y b3V0ZSgic2VjcmV0Iik7CiAgICAgIHRoaXMucm91dGUoImZvdXJPaEZvdXIi LCB7IHBhdGg6ICIqOiJ9KTsKICAgIH0pOwoKICAgIEFwcC5JbmRleFJvdXRl ID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKICAgICAgYWN0aW9uczogewogICAg ICAgIG1vdmVUb1NlY3JldDogZnVuY3Rpb24oY29udGV4dCl7CiAgICAgICAg ICBpZiAoYXV0aG9yaXplZCgpKXsKICAgICAgICAgICAgdGhpcy50cmFuc2l0 aW9uVG8oJ3NlY3JldCcsIGNvbnRleHQpOwogICAgICAgICAgfQogICAgICAg ICAgICB0aGlzLnRyYW5zaXRpb25UbygnZm91ck9oRm91cicpOwogICAgICAg IH0KICAgICAgfQogICAgfSk7CiAgICBgYGAKCiAgIFRyYW5zaXRpb24gdG8g YSBuZXN0ZWQgcm91dGUKCiAgIGBgYGphdmFzY3JpcHQKICAgQXBwLlJvdXRl ci5tYXAoZnVuY3Rpb24oKSB7CiAgICAgdGhpcy5yZXNvdXJjZSgnYXJ0aWNs ZXMnLCB7IHBhdGg6ICcvYXJ0aWNsZXMnIH0sIGZ1bmN0aW9uKCkgewogICAg ICAgdGhpcy5yb3V0ZSgnbmV3Jyk7CiAgICAgfSk7CiAgIH0pOwoKICAgQXBw LkluZGV4Um91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoewogICAgIGFjdGlv bnM6IHsKICAgICAgIHRyYW5zaXRpb25Ub05ld0FydGljbGU6IGZ1bmN0aW9u KCkgewogICAgICAgICB0aGlzLnRyYW5zaXRpb25UbygnYXJ0aWNsZXMubmV3 Jyk7CiAgICAgICB9CiAgICAgfQogICB9KTsKICAgYGBgCgogICAgTXVsdGlw bGUgTW9kZWxzIEV4YW1wbGUKCiAgICBgYGBqYXZhc2NyaXB0CiAgICBBcHAu Um91dGVyLm1hcChmdW5jdGlvbigpIHsKICAgICAgdGhpcy5yb3V0ZSgiaW5k ZXgiKTsKICAgICAgdGhpcy5yZXNvdXJjZSgnYnJlYWtmYXN0Jywge3BhdGg6 JzpicmVha2Zhc3RJZCd9LCBmdW5jdGlvbigpewogICAgICAgIHRoaXMucmVz b3VyY2UoJ2NlcmVhbCcsIHtwYXRoOiAnOmNlcmVhbElkJ30pOwogICAgICB9 KTsKICAgIH0pOwoKICAgIEFwcC5JbmRleFJvdXRlID0gRW1iZXIuUm91dGUu ZXh0ZW5kKHsKICAgICAgYWN0aW9uczogewogICAgICAgIG1vdmVUb0Nob2Nv bGF0ZUNlcmVhbDogZnVuY3Rpb24oKXsKICAgICAgICAgIHZhciBjZXJlYWwg PSB7IGNlcmVhbElkOiAiQ2hvY29sYXRlWXVtbWluZXNzIn0sCiAgICAgICAg ICAgICAgYnJlYWtmYXN0ID0ge2JyZWFrZmFzdElkOiAiQ2VyZWFsQW5kTWls ayJ9OwoKICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKCdjZXJlYWwnLCBi cmVha2Zhc3QsIGNlcmVhbCk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsK CiAgICBAbWV0aG9kIHRyYW5zaXRpb25UbwogICAgQHBhcmFtIHtTdHJpbmd9 IG5hbWUgdGhlIG5hbWUgb2YgdGhlIHJvdXRlCiAgICBAcGFyYW0gey4uLk9i amVjdH0gbW9kZWxzIHRoZSBtb2RlbChzKSB0byBiZSB1c2VkIHdoaWxlIHRy YW5zaXRpb25pbmcKICAgIHRvIHRoZSByb3V0ZS4KICAgIEByZXR1cm4ge1Ry YW5zaXRpb259IHRoZSB0cmFuc2l0aW9uIG9iamVjdCBhc3NvY2lhdGVkIHdp dGggdGhpcwogICAgICBhdHRlbXB0ZWQgdHJhbnNpdGlvbgogICovCiAgdHJh bnNpdGlvblRvOiBmdW5jdGlvbihuYW1lLCBjb250ZXh0KSB7CiAgICB2YXIg cm91dGVyID0gdGhpcy5yb3V0ZXI7CiAgICByZXR1cm4gcm91dGVyLnRyYW5z aXRpb25Uby5hcHBseShyb3V0ZXIsIGFyZ3VtZW50cyk7CiAgfSwKCiAgLyoq CiAgICBQZXJmb3JtIGEgc3luY2hyb25vdXMgdHJhbnNpdGlvbiBpbnRvIGFu b3RoZXIgcm91dGUgd2l0aG91dCBhdHRlbXB0aW5nCiAgICB0byByZXNvbHZl IHByb21pc2VzLCB1cGRhdGUgdGhlIFVSTCwgb3IgYWJvcnQgYW55IGN1cnJl bnRseSBhY3RpdmUKICAgIGFzeW5jaHJvbm91cyB0cmFuc2l0aW9ucyAoaS5l LiByZWd1bGFyIHRyYW5zaXRpb25zIGNhdXNlZCBieQogICAgYHRyYW5zaXRp b25Ub2Agb3IgVVJMIGNoYW5nZXMpLgoKICAgIFRoaXMgbWV0aG9kIGlzIGhh bmR5IGZvciBwZXJmb3JtaW5nIGludGVybWVkaWF0ZSB0cmFuc2l0aW9ucyBv biB0aGUKICAgIHdheSB0byBhIGZpbmFsIGRlc3RpbmF0aW9uIHJvdXRlLCBh bmQgaXMgY2FsbGVkIGludGVybmFsbHkgYnkgdGhlCiAgICBkZWZhdWx0IGlt cGxlbWVudGF0aW9ucyBvZiB0aGUgYGVycm9yYCBhbmQgYGxvYWRpbmdgIGhh bmRsZXJzLgoKICAgIEBtZXRob2QgaW50ZXJtZWRpYXRlVHJhbnNpdGlvblRv CiAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcm91 dGUKICAgIEBwYXJhbSB7Li4uT2JqZWN0fSBtb2RlbHMgdGhlIG1vZGVsKHMp IHRvIGJlIHVzZWQgd2hpbGUgdHJhbnNpdGlvbmluZwogICAgdG8gdGhlIHJv dXRlLgogICAqLwogIGludGVybWVkaWF0ZVRyYW5zaXRpb25UbzogZnVuY3Rp b24oKSB7CiAgICB2YXIgcm91dGVyID0gdGhpcy5yb3V0ZXI7CiAgICByb3V0 ZXIuaW50ZXJtZWRpYXRlVHJhbnNpdGlvblRvLmFwcGx5KHJvdXRlciwgYXJn dW1lbnRzKTsKICB9LAoKICAvKioKICAgIFJlZnJlc2ggdGhlIG1vZGVsIG9u IHRoaXMgcm91dGUgYW5kIGFueSBjaGlsZCByb3V0ZXMsIGZpcmluZyB0aGUK ICAgIGBiZWZvcmVNb2RlbGAsIGBtb2RlbGAsIGFuZCBgYWZ0ZXJNb2RlbGAg aG9va3MgaW4gYSBzaW1pbGFyIGZhc2hpb24KICAgIHRvIGhvdyByb3V0ZXMg YXJlIGVudGVyZWQgd2hlbiB0cmFuc2l0aW9uaW5nIGluIGZyb20gb3RoZXIg cm91dGUuCiAgICBUaGUgY3VycmVudCByb3V0ZSBwYXJhbXMgKGUuZy4gYGFy dGljbGVfaWRgKSB3aWxsIGJlIHBhc3NlZCBpbgogICAgdG8gdGhlIHJlc3Bl Y3RpdmUgbW9kZWwgaG9va3MsIGFuZCBpZiBhIGRpZmZlcmVudCBtb2RlbCBp cyByZXR1cm5lZCwKICAgIGBzZXR1cENvbnRyb2xsZXJgIGFuZCBhc3NvY2lh dGVkIHJvdXRlIGhvb2tzIHdpbGwgcmUtZmlyZSBhcyB3ZWxsLgoKICAgIEFu IGV4YW1wbGUgdXNhZ2Ugb2YgdGhpcyBtZXRob2QgaXMgcmUtcXVlcnlpbmcg dGhlIHNlcnZlciBmb3IgdGhlCiAgICBsYXRlc3QgaW5mb3JtYXRpb24gdXNp bmcgdGhlIHNhbWUgcGFyYW1ldGVycyBhcyB3aGVuIHRoZSByb3V0ZQogICAg d2FzIGZpcnN0IGVudGVyZWQuCgogICAgTm90ZSB0aGF0IHRoaXMgd2lsbCBj YXVzZSBgbW9kZWxgIGhvb2tzIHRvIGZpcmUgZXZlbiBvbiByb3V0ZXMKICAg IHRoYXQgd2VyZSBwcm92aWRlZCBhIG1vZGVsIG9iamVjdCB3aGVuIHRoZSBy b3V0ZSB3YXMgaW5pdGlhbGx5CiAgICBlbnRlcmVkLgoKICAgIEBtZXRob2Qg cmVmcmVzaAogICAgQHJldHVybiB7VHJhbnNpdGlvbn0gdGhlIHRyYW5zaXRp b24gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzCiAgICAgIGF0dGVtcHRl ZCB0cmFuc2l0aW9uCiAgICovCiAgcmVmcmVzaDogZnVuY3Rpb24oKSB7CiAg ICByZXR1cm4gdGhpcy5yb3V0ZXIucm91dGVyLnJlZnJlc2godGhpcykubWV0 aG9kKCdyZXBsYWNlJyk7CiAgfSwKCiAgLyoqCiAgICBUcmFuc2l0aW9uIGlu dG8gYW5vdGhlciByb3V0ZSB3aGlsZSByZXBsYWNpbmcgdGhlIGN1cnJlbnQg VVJMLCBpZiBwb3NzaWJsZS4KICAgIFRoaXMgd2lsbCByZXBsYWNlIHRoZSBj dXJyZW50IGhpc3RvcnkgZW50cnkgaW5zdGVhZCBvZiBhZGRpbmcgYSBuZXcg b25lLgogICAgQmVzaWRlIHRoYXQsIGl0IGlzIGlkZW50aWNhbCB0byBgdHJh bnNpdGlvblRvYCBpbiBhbGwgb3RoZXIgcmVzcGVjdHMuIFNlZQogICAgJ3Ry YW5zaXRpb25UbycgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJk aW5nIG11bHRpcGxlIG1vZGVscy4KCiAgICBFeGFtcGxlCgogICAgYGBgamF2 YXNjcmlwdAogICAgQXBwLlJvdXRlci5tYXAoZnVuY3Rpb24oKSB7CiAgICAg IHRoaXMucm91dGUoImluZGV4Iik7CiAgICAgIHRoaXMucm91dGUoInNlY3Jl dCIpOwogICAgfSk7CgogICAgQXBwLlNlY3JldFJvdXRlID0gRW1iZXIuUm91 dGUuZXh0ZW5kKHsKICAgICAgYWZ0ZXJNb2RlbDogZnVuY3Rpb24oKSB7CiAg ICAgICAgaWYgKCFhdXRob3JpemVkKCkpewogICAgICAgICAgdGhpcy5yZXBs YWNlV2l0aCgnaW5kZXgnKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwog ICAgYGBgCgogICAgQG1ldGhvZCByZXBsYWNlV2l0aAogICAgQHBhcmFtIHtT dHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIHJvdXRlCiAgICBAcGFyYW0g ey4uLk9iamVjdH0gbW9kZWxzIHRoZSBtb2RlbChzKSB0byBiZSB1c2VkIHdo aWxlIHRyYW5zaXRpb25pbmcKICAgIHRvIHRoZSByb3V0ZS4KICAgIEByZXR1 cm4ge1RyYW5zaXRpb259IHRoZSB0cmFuc2l0aW9uIG9iamVjdCBhc3NvY2lh dGVkIHdpdGggdGhpcwogICAgICBhdHRlbXB0ZWQgdHJhbnNpdGlvbgogICov CiAgcmVwbGFjZVdpdGg6IGZ1bmN0aW9uKCkgewogICAgdmFyIHJvdXRlciA9 IHRoaXMucm91dGVyOwogICAgcmV0dXJuIHJvdXRlci5yZXBsYWNlV2l0aC5h cHBseShyb3V0ZXIsIGFyZ3VtZW50cyk7CiAgfSwKCiAgLyoqCiAgICBTZW5k cyBhbiBhY3Rpb24gdG8gdGhlIHJvdXRlciwgd2hpY2ggd2lsbCBkZWxlZ2F0 ZSBpdCB0byB0aGUgY3VycmVudGx5CiAgICBhY3RpdmUgcm91dGUgaGllcmFy Y2h5IHBlciB0aGUgYnViYmxpbmcgcnVsZXMgZXhwbGFpbmVkIHVuZGVyIGBh Y3Rpb25zYC4KCiAgICBFeGFtcGxlCgogICAgYGBgamF2YXNjcmlwdAogICAg QXBwLlJvdXRlci5tYXAoZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMucm91dGUo ImluZGV4Iik7CiAgICB9KTsKCiAgICBBcHAuQXBwbGljYXRpb25Sb3V0ZSA9 IEVtYmVyLlJvdXRlLmV4dGVuZCh7CiAgICAgIGFjdGlvbnM6IHsKICAgICAg ICB0cmFjazogZnVuY3Rpb24oYXJnKSB7CiAgICAgICAgICBjb25zb2xlLmxv ZyhhcmcsICd3YXMgY2xpY2tlZCcpOwogICAgICAgIH0KICAgICAgfQogICAg fSk7CgogICAgQXBwLkluZGV4Um91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQo ewogICAgICBhY3Rpb25zOiB7CiAgICAgICAgdHJhY2tJZkRlYnVnOiBmdW5j dGlvbihhcmcpIHsKICAgICAgICAgIGlmIChkZWJ1ZykgewogICAgICAgICAg ICB0aGlzLnNlbmQoJ3RyYWNrJywgYXJnKTsKICAgICAgICAgIH0KICAgICAg ICB9CiAgICAgIH0KICAgIH0pOwogICAgYGBgCgogICAgQG1ldGhvZCBzZW5k CiAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYWN0 aW9uIHRvIHRyaWdnZXIKICAgIEBwYXJhbSB7Li4uKn0gYXJncwogICovCiAg c2VuZDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5yb3V0ZXIuc2Vu ZC5hcHBseSh0aGlzLnJvdXRlciwgYXJndW1lbnRzKTsKICB9LAoKICAvKioK ICAgIFRoaXMgaG9vayBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHJvdXRlci5q cwoKICAgIEBwcml2YXRlCiAgICBAbWV0aG9kIHNldHVwCiAgKi8KICBzZXR1 cDogZnVuY3Rpb24oY29udGV4dCwgdHJhbnNpdGlvbikgewogICAgdmFyIGNv bnRyb2xsZXJOYW1lID0gdGhpcy5jb250cm9sbGVyTmFtZSB8fCB0aGlzLnJv dXRlTmFtZSwKICAgICAgICBjb250cm9sbGVyID0gdGhpcy5jb250cm9sbGVy Rm9yKGNvbnRyb2xsZXJOYW1lLCB0cnVlKTsKICAgIGlmICghY29udHJvbGxl cikgewogICAgICBjb250cm9sbGVyID0gIHRoaXMuZ2VuZXJhdGVDb250cm9s bGVyKGNvbnRyb2xsZXJOYW1lLCBjb250ZXh0KTsKICAgIH0KCiAgICAvLyBB c3NpZ24gdGhlIHJvdXRlJ3MgY29udHJvbGxlciBzbyB0aGF0IGl0IGNhbiBt b3JlIGVhc2lseSBiZQogICAgLy8gcmVmZXJlbmNlZCBpbiBhY3Rpb24gaGFu ZGxlcnMKICAgIHRoaXMuY29udHJvbGxlciA9IGNvbnRyb2xsZXI7CgogICAg aWYgKEVtYmVyLkZFQVRVUkVTLmlzRW5hYmxlZCgicXVlcnktcGFyYW1zLW5l dyIpKSB7CiAgICAgIC8vIFRPRE86IGNvbmZpZ3VyYWJsZSBfcXVlcnlQYXJh bVNjb3BlCiAgICAgIGlmIChjb250cm9sbGVyTmFtZSAhPT0gJ2FwcGxpY2F0 aW9uJykgewogICAgICAgIHRoaXMuY29udHJvbGxlci5fcXVlcnlQYXJhbVNj b3BlID0gY29udHJvbGxlck5hbWU7CiAgICAgIH0KICAgICAgdGhpcy5jb250 cm9sbGVyLl9hY3RpdmF0ZVF1ZXJ5UGFyYW1PYnNlcnZlcnMoKTsKICAgIH0K CiAgICBpZiAodGhpcy5zZXR1cENvbnRyb2xsZXJzKSB7CiAgICAgIEVtYmVy LmRlcHJlY2F0ZSgiRW1iZXIuUm91dGUuc2V0dXBDb250cm9sbGVycyBpcyBk ZXByZWNhdGVkLiBQbGVhc2UgdXNlIEVtYmVyLlJvdXRlLnNldHVwQ29udHJv bGxlcihjb250cm9sbGVyLCBtb2RlbCkgaW5zdGVhZC4iKTsKICAgICAgdGhp cy5zZXR1cENvbnRyb2xsZXJzKGNvbnRyb2xsZXIsIGNvbnRleHQpOwogICAg fSBlbHNlIHsKCiAgICAgIGlmIChFbWJlci5GRUFUVVJFUy5pc0VuYWJsZWQo InF1ZXJ5LXBhcmFtcy1uZXciKSkgewogICAgICAgIC8vIFByZXZlbnQgdXBk YXRlcyB0byBxdWVyeSBwYXJhbXMgaW4gc2V0dXBDb250cm9sbGVyCiAgICAg ICAgLy8gZnJvbSBmaXJpbmcgYW5vdGhlciB0cmFuc2l0aW9uLiBVcGRhdGlu ZyBRUHMgaW4KICAgICAgICAvLyBzZXR1cENvbnRyb2xsZXIgd2lsbCBvbmx5 IGFmZmVjdCB0aGUgZmluYWwKICAgICAgICAvLyBnZW5lcmF0ZWQgVVJMLgog ICAgICAgIGNvbnRyb2xsZXIuX2ZpbmFsaXppbmdRdWVyeVBhcmFtcyA9IHRy dWU7CiAgICAgICAgY29udHJvbGxlci5fcXVlcnlQYXJhbUNoYW5nZXNEdXJp bmdTdXNwZW5zaW9uID0ge307CiAgICAgICAgdGhpcy5zZXR1cENvbnRyb2xs ZXIoY29udHJvbGxlciwgY29udGV4dCwgdHJhbnNpdGlvbik7CiAgICAgICAg Y29udHJvbGxlci5fZmluYWxpemluZ1F1ZXJ5UGFyYW1zID0gZmFsc2U7CiAg ICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5zZXR1cENvbnRyb2xsZXIoY29u dHJvbGxlciwgY29udGV4dCk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAodGhp cy5yZW5kZXJUZW1wbGF0ZXMpIHsKICAgICAgRW1iZXIuZGVwcmVjYXRlKCJF bWJlci5Sb3V0ZS5yZW5kZXJUZW1wbGF0ZXMgaXMgZGVwcmVjYXRlZC4gUGxl YXNlIHVzZSBFbWJlci5Sb3V0ZS5yZW5kZXJUZW1wbGF0ZShjb250cm9sbGVy LCBtb2RlbCkgaW5zdGVhZC4iKTsKICAgICAgdGhpcy5yZW5kZXJUZW1wbGF0 ZXMoY29udGV4dCk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnJlbmRlclRl bXBsYXRlKGNvbnRyb2xsZXIsIGNvbnRleHQpOwogICAgfQogIH0sCgogIC8q KgogICAgVGhpcyBob29rIGlzIHRoZSBmaXJzdCBvZiB0aGUgcm91dGUgZW50 cnkgdmFsaWRhdGlvbiBob29rcwogICAgY2FsbGVkIHdoZW4gYW4gYXR0ZW1w dCBpcyBtYWRlIHRvIHRyYW5zaXRpb24gaW50byBhIHJvdXRlCiAgICBvciBv bmUgb2YgaXRzIGNoaWxkcmVuLiBJdCBpcyBjYWxsZWQgYmVmb3JlIGBtb2Rl bGAgYW5kCiAgICBgYWZ0ZXJNb2RlbGAsIGFuZCBpcyBhcHByb3ByaWF0ZSBm b3IgY2FzZXMgd2hlbjoKCiAgICAxKSBBIGRlY2lzaW9uIGNhbiBiZSBtYWRl IHRvIHJlZGlyZWN0IGVsc2V3aGVyZSB3aXRob3V0CiAgICAgICBuZWVkaW5n IHRvIHJlc29sdmUgdGhlIG1vZGVsIGZpcnN0LgogICAgMikgQW55IGFzeW5j IG9wZXJhdGlvbnMgbmVlZCB0byBvY2N1ciBmaXJzdCBiZWZvcmUgdGhlCiAg ICAgICBtb2RlbCBpcyBhdHRlbXB0ZWQgdG8gYmUgcmVzb2x2ZWQuCgogICAg VGhpcyBob29rIGlzIHByb3ZpZGVkIHRoZSBjdXJyZW50IGB0cmFuc2l0aW9u YCBhdHRlbXB0CiAgICBhcyBhIHBhcmFtZXRlciwgd2hpY2ggY2FuIGJlIHVz ZWQgdG8gYC5hYm9ydCgpYCB0aGUgdHJhbnNpdGlvbiwKICAgIHNhdmUgaXQg Zm9yIGEgbGF0ZXIgYC5yZXRyeSgpYCwgb3IgcmV0cmlldmUgdmFsdWVzIHNl dAogICAgb24gaXQgZnJvbSBhIHByZXZpb3VzIGhvb2suIFlvdSBjYW4gYWxz byBqdXN0IGNhbGwKICAgIGB0aGlzLnRyYW5zaXRpb25Ub2AgdG8gYW5vdGhl ciByb3V0ZSB0byBpbXBsaWNpdGx5CiAgICBhYm9ydCB0aGUgYHRyYW5zaXRp b25gLgoKICAgIFlvdSBjYW4gcmV0dXJuIGEgcHJvbWlzZSBmcm9tIHRoaXMg aG9vayB0byBwYXVzZSB0aGUKICAgIHRyYW5zaXRpb24gdW50aWwgdGhlIHBy b21pc2UgcmVzb2x2ZXMgKG9yIHJlamVjdHMpLiBUaGlzIGNvdWxkCiAgICBi ZSB1c2VmdWwsIGZvciBpbnN0YW5jZSwgZm9yIHJldHJpZXZpbmcgYXN5bmMg Y29kZSBmcm9tCiAgICB0aGUgc2VydmVyIHRoYXQgaXMgcmVxdWlyZWQgdG8g ZW50ZXIgYSByb3V0ZS4KCiAgICBgYGBqcwogICAgQXBwLlBvc3RSb3V0ZSA9 IEVtYmVyLlJvdXRlLmV4dGVuZCh7CiAgICAgIGJlZm9yZU1vZGVsOiBmdW5j dGlvbih0cmFuc2l0aW9uKSB7CiAgICAgICAgaWYgKCFBcHAuUG9zdCkgewog ICAgICAgICAgcmV0dXJuIEVtYmVyLiQuZ2V0U2NyaXB0KCcvbW9kZWxzL3Bv c3QuanMnKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogICAgYGBgCgog ICAgSWYgYEFwcC5Qb3N0YCBkb2Vzbid0IGV4aXN0IGluIHRoZSBhYm92ZSBl eGFtcGxlLAogICAgYGJlZm9yZU1vZGVsYCB3aWxsIHVzZSBqUXVlcnkncyBg Z2V0U2NyaXB0YCwgd2hpY2gKICAgIHJldHVybnMgYSBwcm9taXNlIHRoYXQg cmVzb2x2ZXMgYWZ0ZXIgdGhlIHNlcnZlciBoYXMKICAgIHN1Y2Nlc3NmdWxs eSByZXRyaWV2ZWQgYW5kIGV4ZWN1dGVkIHRoZSBjb2RlIGZyb20gdGhlCiAg ICBzZXJ2ZXIuIE5vdGUgdGhhdCBpZiBhbiBlcnJvciB3ZXJlIHRvIG9jY3Vy LCBpdCB3b3VsZAogICAgYmUgcGFzc2VkIHRvIHRoZSBgZXJyb3JgIGhvb2sg b24gYEVtYmVyLlJvdXRlYCwgYnV0CiAgICBpdCdzIGFsc28gcG9zc2libGUg dG8gaGFuZGxlIGVycm9ycyBzcGVjaWZpYyB0bwogICAgYGJlZm9yZU1vZGVs YCByaWdodCBmcm9tIHdpdGhpbiB0aGUgaG9vayAodG8gZGlzdGluZ3Vpc2gK ICAgIGZyb20gdGhlIHNoYXJlZCBlcnJvciBoYW5kbGluZyBiZWhhdmlvciBv ZiB0aGUgYGVycm9yYAogICAgaG9vayk6CgogICAgYGBganMKICAgIEFwcC5Q b3N0Um91dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoewogICAgICBiZWZvcmVN b2RlbDogZnVuY3Rpb24odHJhbnNpdGlvbikgewogICAgICAgIGlmICghQXBw LlBvc3QpIHsKICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgICAg IHJldHVybiBFbWJlci4kLmdldFNjcmlwdCgncG9zdC5qcycpLnRoZW4obnVs bCwgZnVuY3Rpb24oZSkgewogICAgICAgICAgICBzZWxmLnRyYW5zaXRpb25U bygnaGVscCcpOwoKICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBhYm92 ZSB0cmFuc2l0aW9uVG8gd2lsbCBpbXBsaWNpdGx5CiAgICAgICAgICAgIC8v IGhhbHQgdGhlIHRyYW5zaXRpb24uIElmIHlvdSB3ZXJlIHRvIHJldHVybgog ICAgICAgICAgICAvLyBub3RoaW5nIGZyb20gdGhpcyBwcm9taXNlIHJlamVj dCBoYW5kbGVyLAogICAgICAgICAgICAvLyBhY2NvcmRpbmcgdG8gcHJvbWlz ZSBzZW1hbnRpY3MsIHRoYXQgd291bGQKICAgICAgICAgICAgLy8gY29udmVy dCB0aGUgcmVqZWN0IGludG8gYSByZXNvbHZlIGFuZCB0aGUKICAgICAgICAg ICAgLy8gdHJhbnNpdGlvbiB3b3VsZCBjb250aW51ZS4gVG8gcHJvcGFnYXRl IHRoZQogICAgICAgICAgICAvLyBlcnJvciBzbyB0aGF0IGl0J2QgYmUgaGFu ZGxlZCBieSB0aGUgYGVycm9yYAogICAgICAgICAgICAvLyBob29rLCB5b3Ug d291bGQgaGF2ZSB0byBlaXRoZXIKICAgICAgICAgICAgcmV0dXJuIEVtYmVy LlJTVlAucmVqZWN0KGUpOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAg ICB9CiAgICB9KTsKICAgIGBgYAoKICAgIEBtZXRob2QgYmVmb3JlTW9kZWwK ICAgIEBwYXJhbSB7VHJhbnNpdGlvbn0gdHJhbnNpdGlvbgogICAgQHBhcmFt IHtPYmplY3R9IHF1ZXJ5UGFyYW1zIHRoZSBhY3RpdmUgcXVlcnkgcGFyYW1z IGZvciB0aGlzIHJvdXRlCiAgICBAcmV0dXJuIHtQcm9taXNlfSBpZiB0aGUg dmFsdWUgcmV0dXJuZWQgZnJvbSB0aGlzIGhvb2sgaXMKICAgICAgYSBwcm9t aXNlLCB0aGUgdHJhbnNpdGlvbiB3aWxsIHBhdXNlIHVudGlsIHRoZSB0cmFu c2l0aW9uCiAgICAgIHJlc29sdmVzLiBPdGhlcndpc2UsIG5vbi1wcm9taXNl IHJldHVybiB2YWx1ZXMgYXJlIG5vdAogICAgICB1dGlsaXplZCBpbiBhbnkg d2F5LgogICovCiAgYmVmb3JlTW9kZWw6IEVtYmVyLkssCgogIC8qKgogICAg VGhpcyBob29rIGlzIGNhbGxlZCBhZnRlciB0aGlzIHJvdXRlJ3MgbW9kZWwg aGFzIHJlc29sdmVkLgogICAgSXQgZm9sbG93cyBpZGVudGljYWwgYXN5bmMv cHJvbWlzZSBzZW1hbnRpY3MgdG8gYGJlZm9yZU1vZGVsYAogICAgYnV0IGlz IHByb3ZpZGVkIHRoZSByb3V0ZSdzIHJlc29sdmVkIG1vZGVsIGluIGFkZGl0 aW9uIHRvCiAgICB0aGUgYHRyYW5zaXRpb25gLCBhbmQgaXMgdGhlcmVmb3Jl IHN1aXRlZCB0byBwZXJmb3JtaW5nCiAgICBsb2dpYyB0aGF0IGNhbiBvbmx5 IHRha2UgcGxhY2UgYWZ0ZXIgdGhlIG1vZGVsIGhhcyBhbHJlYWR5CiAgICBy ZXNvbHZlZC4KCiAgICBgYGBqcwogICAgQXBwLlBvc3RzUm91dGUgPSBFbWJl ci5Sb3V0ZS5leHRlbmQoewogICAgICBhZnRlck1vZGVsOiBmdW5jdGlvbihw b3N0cywgdHJhbnNpdGlvbikgewogICAgICAgIGlmIChwb3N0cy5sZW5ndGgg PT09IDEpIHsKICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKCdwb3N0LnNo b3cnLCBwb3N0c1swXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAg IGBgYAoKICAgIFJlZmVyIHRvIGRvY3VtZW50YXRpb24gZm9yIGBiZWZvcmVN b2RlbGAgZm9yIGEgZGVzY3JpcHRpb24KICAgIG9mIHRyYW5zaXRpb24tcGF1 c2luZyBzZW1hbnRpY3Mgd2hlbiBhIHByb21pc2UgaXMgcmV0dXJuZWQKICAg IGZyb20gdGhpcyBob29rLgoKICAgIEBtZXRob2QgYWZ0ZXJNb2RlbAogICAg QHBhcmFtIHtPYmplY3R9IHJlc29sdmVkTW9kZWwgdGhlIHZhbHVlIHJldHVy bmVkIGZyb20gYG1vZGVsYCwKICAgICAgb3IgaXRzIHJlc29sdmVkIHZhbHVl IGlmIGl0IHdhcyBhIHByb21pc2UKICAgIEBwYXJhbSB7VHJhbnNpdGlvbn0g dHJhbnNpdGlvbgogICAgQHBhcmFtIHtPYmplY3R9IHF1ZXJ5UGFyYW1zIHRo ZSBhY3RpdmUgcXVlcnkgcGFyYW1zIGZvciB0aGlzIGhhbmRsZXIKICAgIEBy ZXR1cm4ge1Byb21pc2V9IGlmIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIHRo aXMgaG9vayBpcwogICAgICBhIHByb21pc2UsIHRoZSB0cmFuc2l0aW9uIHdp bGwgcGF1c2UgdW50aWwgdGhlIHRyYW5zaXRpb24KICAgICAgcmVzb2x2ZXMu IE90aGVyd2lzZSwgbm9uLXByb21pc2UgcmV0dXJuIHZhbHVlcyBhcmUgbm90 CiAgICAgIHV0aWxpemVkIGluIGFueSB3YXkuCiAgICovCiAgYWZ0ZXJNb2Rl bDogRW1iZXIuSywKCiAgLyoqCiAgICBBIGhvb2sgeW91IGNhbiBpbXBsZW1l bnQgdG8gb3B0aW9uYWxseSByZWRpcmVjdCB0byBhbm90aGVyIHJvdXRlLgoK ICAgIElmIHlvdSBjYWxsIGB0aGlzLnRyYW5zaXRpb25Ub2AgZnJvbSBpbnNp ZGUgb2YgdGhpcyBob29rLCB0aGlzIHJvdXRlCiAgICB3aWxsIG5vdCBiZSBl bnRlcmVkIGluIGZhdm9yIG9mIHRoZSBvdGhlciBob29rLgoKICAgIGByZWRp cmVjdGAgYW5kIGBhZnRlck1vZGVsYCBiZWhhdmUgdmVyeSBzaW1pbGFybHkg YW5kIGFyZQogICAgY2FsbGVkIGFsbW9zdCBhdCB0aGUgc2FtZSB0aW1lLCBi dXQgdGhleSBoYXZlIGFuIGltcG9ydGFudAogICAgZGlzdGluY3Rpb24gaW4g dGhlIGNhc2UgdGhhdCwgZnJvbSBvbmUgb2YgdGhlc2UgaG9va3MsIGEKICAg IHJlZGlyZWN0IGludG8gYSBjaGlsZCByb3V0ZSBvZiB0aGlzIHJvdXRlIG9j Y3VyczogcmVkaXJlY3RzCiAgICBmcm9tIGBhZnRlck1vZGVsYCBlc3NlbnRp YWxseSBpbnZhbGlkYXRlIHRoZSBjdXJyZW50IGF0dGVtcHQKICAgIHRvIGVu dGVyIHRoaXMgcm91dGUsIGFuZCB3aWxsIHJlc3VsdCBpbiB0aGlzIHJvdXRl J3MgYGJlZm9yZU1vZGVsYCwKICAgIGBtb2RlbGAsIGFuZCBgYWZ0ZXJNb2Rl bGAgaG9va3MgYmVpbmcgZmlyZWQgYWdhaW4gd2l0aGluCiAgICB0aGUgbmV3 LCByZWRpcmVjdGluZyB0cmFuc2l0aW9uLiBSZWRpcmVjdHMgdGhhdCBvY2N1 ciB3aXRoaW4KICAgIHRoZSBgcmVkaXJlY3RgIGhvb2ssIG9uIHRoZSBvdGhl ciBoYW5kLCB3aWxsIF9ub3RfIGNhdXNlCiAgICB0aGVzZSBob29rcyB0byBi ZSBmaXJlZCBhZ2FpbiB0aGUgc2Vjb25kIHRpbWUgYXJvdW5kOyBpbgogICAg b3RoZXIgd29yZHMsIGJ5IHRoZSB0aW1lIHRoZSBgcmVkaXJlY3RgIGhvb2sg aGFzIGJlZW4gY2FsbGVkLAogICAgYm90aCB0aGUgcmVzb2x2ZWQgbW9kZWwg YW5kIGF0dGVtcHRlZCBlbnRyeSBpbnRvIHRoaXMgcm91dGUKICAgIGFyZSBj b25zaWRlcmVkIHRvIGJlIGZ1bGx5IHZhbGlkYXRlZC4KCiAgICBAbWV0aG9k IHJlZGlyZWN0CiAgICBAcGFyYW0ge09iamVjdH0gbW9kZWwgdGhlIG1vZGVs IGZvciB0aGlzIHJvdXRlCiAgKi8KICByZWRpcmVjdDogRW1iZXIuSywKCiAg LyoqCiAgICBDYWxsZWQgd2hlbiB0aGUgY29udGV4dCBpcyBjaGFuZ2VkIGJ5 IHJvdXRlci5qcy4KCiAgICBAcHJpdmF0ZQogICAgQG1ldGhvZCBjb250ZXh0 RGlkQ2hhbmdlCiAgKi8KICBjb250ZXh0RGlkQ2hhbmdlOiBmdW5jdGlvbigp IHsKICAgIHRoaXMuY3VycmVudE1vZGVsID0gdGhpcy5jb250ZXh0OwogIH0s CgogIC8qKgogICAgQSBob29rIHlvdSBjYW4gaW1wbGVtZW50IHRvIGNvbnZl cnQgdGhlIFVSTCBpbnRvIHRoZSBtb2RlbCBmb3IKICAgIHRoaXMgcm91dGUu CgogICAgYGBganMKICAgIEFwcC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkgewog ICAgICB0aGlzLnJlc291cmNlKCdwb3N0Jywge3BhdGg6ICcvcG9zdHMvOnBv c3RfaWQnfSk7CiAgICB9KTsKICAgIGBgYAoKICAgIFRoZSBtb2RlbCBmb3Ig dGhlIGBwb3N0YCByb3V0ZSBpcyBgQXBwLlBvc3QuZmluZChwYXJhbXMucG9z dF9pZClgLgoKICAgIEJ5IGRlZmF1bHQsIGlmIHlvdXIgcm91dGUgaGFzIGEg ZHluYW1pYyBzZWdtZW50IGVuZGluZyBpbiBgX2lkYDoKCiAgICAqIFRoZSBt b2RlbCBjbGFzcyBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIHNlZ21lbnQgKGBw b3N0X2lkYCdzCiAgICAgIGNsYXNzIGlzIGBBcHAuUG9zdGApCiAgICAqIFRo ZSBmaW5kIG1ldGhvZCBpcyBjYWxsZWQgb24gdGhlIG1vZGVsIGNsYXNzIHdp dGggdGhlIHZhbHVlIG9mCiAgICAgIHRoZSBkeW5hbWljIHNlZ21lbnQuCgog ICAgTm90ZSB0aGF0IGZvciByb3V0ZXMgd2l0aCBkeW5hbWljIHNlZ21lbnRz LCB0aGlzIGhvb2sgaXMgb25seQogICAgZXhlY3V0ZWQgd2hlbiBlbnRlcmVk IHZpYSB0aGUgVVJMLiBJZiB0aGUgcm91dGUgaXMgZW50ZXJlZAogICAgdGhy b3VnaCBhIHRyYW5zaXRpb24gKGUuZy4gd2hlbiB1c2luZyB0aGUgYGxpbmst dG9gIEhhbmRsZWJhcnMKICAgIGhlbHBlciksIHRoZW4gYSBtb2RlbCBjb250 ZXh0IGlzIGFscmVhZHkgcHJvdmlkZWQgYW5kIHRoaXMgaG9vawogICAgaXMg bm90IGNhbGxlZC4gUm91dGVzIHdpdGhvdXQgZHluYW1pYyBzZWdtZW50cyB3 aWxsIGFsd2F5cwogICAgZXhlY3V0ZSB0aGUgbW9kZWwgaG9vay4KCiAgICBU aGlzIGhvb2sgZm9sbG93cyB0aGUgYXN5bmNocm9ub3VzL3Byb21pc2Ugc2Vt YW50aWNzCiAgICBkZXNjcmliZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gZm9y IGBiZWZvcmVNb2RlbGAuIEluIHBhcnRpY3VsYXIsCiAgICBpZiBhIHByb21p c2UgcmV0dXJuZWQgZnJvbSBgbW9kZWxgIGZhaWxzLCB0aGUgZXJyb3Igd2ls bCBiZQogICAgaGFuZGxlZCBieSB0aGUgYGVycm9yYCBob29rIG9uIGBFbWJl ci5Sb3V0ZWAuCgogICAgRXhhbXBsZQoKICAgIGBgYGpzCiAgICBBcHAuUG9z dFJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKICAgICAgbW9kZWw6IGZ1 bmN0aW9uKHBhcmFtcykgewogICAgICAgIHJldHVybiBBcHAuUG9zdC5maW5k KHBhcmFtcy5wb3N0X2lkKTsKICAgICAgfQogICAgfSk7CiAgICBgYGAKCiAg ICBAbWV0aG9kIG1vZGVsCiAgICBAcGFyYW0ge09iamVjdH0gcGFyYW1zIHRo ZSBwYXJhbWV0ZXJzIGV4dHJhY3RlZCBmcm9tIHRoZSBVUkwKICAgIEBwYXJh bSB7VHJhbnNpdGlvbn0gdHJhbnNpdGlvbgogICAgQHBhcmFtIHtPYmplY3R9 IHF1ZXJ5UGFyYW1zIHRoZSBxdWVyeSBwYXJhbXMgZm9yIHRoaXMgcm91dGUK ICAgIEByZXR1cm4ge09iamVjdHxQcm9taXNlfSB0aGUgbW9kZWwgZm9yIHRo aXMgcm91dGUuIElmCiAgICAgIGEgcHJvbWlzZSBpcyByZXR1cm5lZCwgdGhl IHRyYW5zaXRpb24gd2lsbCBwYXVzZSB1bnRpbAogICAgICB0aGUgcHJvbWlz ZSByZXNvbHZlcywgYW5kIHRoZSByZXNvbHZlZCB2YWx1ZSBvZiB0aGUgcHJv bWlzZQogICAgICB3aWxsIGJlIHVzZWQgYXMgdGhlIG1vZGVsIGZvciB0aGlz IHJvdXRlLgogICovCiAgbW9kZWw6IGZ1bmN0aW9uKHBhcmFtcywgdHJhbnNp dGlvbikgewogICAgdmFyIG1hdGNoLCBuYW1lLCBzYXdQYXJhbXMsIHZhbHVl OwoKICAgIGZvciAodmFyIHByb3AgaW4gcGFyYW1zKSB7CiAgICAgIGlmIChw cm9wID09PSAncXVlcnlQYXJhbXMnKSB7IGNvbnRpbnVlOyB9CgogICAgICBp ZiAobWF0Y2ggPSBwcm9wLm1hdGNoKC9eKC4qKV9pZCQvKSkgewogICAgICAg IG5hbWUgPSBtYXRjaFsxXTsKICAgICAgICB2YWx1ZSA9IHBhcmFtc1twcm9w XTsKICAgICAgfQogICAgICBzYXdQYXJhbXMgPSB0cnVlOwogICAgfQoKICAg IGlmICghbmFtZSAmJiBzYXdQYXJhbXMpIHsgcmV0dXJuIEVtYmVyLmNvcHko cGFyYW1zKTsgfQogICAgZWxzZSBpZiAoIW5hbWUpIHsKICAgICAgCiAgICAg ICAgaWYgKHRyYW5zaXRpb24ucmVzb2x2ZUluZGV4ICE9PSB0cmFuc2l0aW9u LnN0YXRlLmhhbmRsZXJJbmZvcy5sZW5ndGgtMSkgeyByZXR1cm47IH0KCiAg ICAgICAgdmFyIHBhcmVudE1vZGVsID0gdHJhbnNpdGlvbi5zdGF0ZS5oYW5k bGVySW5mb3NbdHJhbnNpdGlvbi5yZXNvbHZlSW5kZXgtMV0uY29udGV4dDsK CiAgICAgICAgcmV0dXJuIHBhcmVudE1vZGVsOwogICAgICAgICAgfQoKICAg IHJldHVybiB0aGlzLmZpbmRNb2RlbChuYW1lLCB2YWx1ZSk7CiAgfSwKCiAg LyoqCiAgICBAcHJpdmF0ZQoKICAgIFJvdXRlci5qcyBob29rLgogICAqLwog IGRlc2VyaWFsaXplOiBmdW5jdGlvbihwYXJhbXMsIHRyYW5zaXRpb24pIHsK ICAgIGlmIChFbWJlci5GRUFUVVJFUy5pc0VuYWJsZWQoInF1ZXJ5LXBhcmFt cy1uZXciKSkgewogICAgICByZXR1cm4gdGhpcy5tb2RlbCh0aGlzLnBhcmFt c0Zvcih0aGlzLnJvdXRlTmFtZSksIHRyYW5zaXRpb24pOwogICAgfSBlbHNl IHsKICAgICAgcmV0dXJuIHRoaXMubW9kZWwocGFyYW1zLCB0cmFuc2l0aW9u KTsKICAgIH0KICB9LAoKICAvKioKCiAgICBAbWV0aG9kIGZpbmRNb2RlbAog ICAgQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIG1vZGVsIHR5cGUKICAgIEBw YXJhbSB7T2JqZWN0fSB2YWx1ZSB0aGUgdmFsdWUgcGFzc2VkIHRvIGZpbmQK ICAqLwogIGZpbmRNb2RlbDogZnVuY3Rpb24oKXsKICAgIHZhciBzdG9yZSA9 IGdldCh0aGlzLCAnc3RvcmUnKTsKICAgIHJldHVybiBzdG9yZS5maW5kLmFw cGx5KHN0b3JlLCBhcmd1bWVudHMpOwogIH0sCgogIC8qKgogICAgU3RvcmUg cHJvcGVydHkgcHJvdmlkZXMgYSBob29rIGZvciBkYXRhIHBlcnNpc3RlbmNl IGxpYnJhcmllcyB0byBpbmplY3QgdGhlbXNlbHZlcy4KCiAgICBCeSBkZWZh dWx0LCB0aGlzIHN0b3JlIHByb3BlcnR5IHByb3ZpZGVzIHRoZSBleGFjdCBz YW1lIGZ1bmN0aW9uYWxpdHkgcHJldmlvdXNseQogICAgaW4gdGhlIG1vZGVs IGhvb2suCgogICAgQ3VycmVudGx5LCB0aGUgcmVxdWlyZWQgaW50ZXJmYWNl IGlzOgoKICAgIGBzdG9yZS5maW5kKG1vZGVsTmFtZSwgZmluZEFyZ3VtZW50 cylgCgogICAgQG1ldGhvZCBzdG9yZQogICAgQHBhcmFtIHtPYmplY3R9IHN0 b3JlCiAgKi8KICBzdG9yZTogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKXsK ICAgIHZhciBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcjsKICAgIHZhciBy b3V0ZU5hbWUgPSB0aGlzLnJvdXRlTmFtZTsKICAgIHZhciBuYW1lc3BhY2Ug PSBnZXQodGhpcywgJ3JvdXRlci5uYW1lc3BhY2UnKTsKCiAgICByZXR1cm4g ewogICAgICBmaW5kOiBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgewogICAgICAg IHZhciBtb2RlbENsYXNzID0gY29udGFpbmVyLmxvb2t1cEZhY3RvcnkoJ21v ZGVsOicgKyBuYW1lKTsKCiAgICAgICAgRW1iZXIuYXNzZXJ0KCJZb3UgdXNl ZCB0aGUgZHluYW1pYyBzZWdtZW50ICIgKyBuYW1lICsgIl9pZCBpbiB5b3Vy IHJvdXRlICIgKwogICAgICAgICAgICAgICAgICAgICByb3V0ZU5hbWUgKyAi LCBidXQgIiArIG5hbWVzcGFjZSArICIuIiArIGNsYXNzaWZ5KG5hbWUpICsK ICAgICAgICAgICAgICAgICAgICAgIiBkaWQgbm90IGV4aXN0IGFuZCB5b3Ug ZGlkIG5vdCBvdmVycmlkZSB5b3VyIHJvdXRlJ3MgYG1vZGVsYCAiICsKICAg ICAgICAgICAgICAgICAgICAgImhvb2suIiwgbW9kZWxDbGFzcyk7CgogICAg ICAgIGlmICghbW9kZWxDbGFzcykgeyByZXR1cm47IH0KCiAgICAgICAgcmV0 dXJuIG1vZGVsQ2xhc3MuZmluZCh2YWx1ZSk7CiAgICAgIH0KICAgIH07CiAg fSksCgogIC8qKgogICAgQSBob29rIHlvdSBjYW4gaW1wbGVtZW50IHRvIGNv bnZlcnQgdGhlIHJvdXRlJ3MgbW9kZWwgaW50byBwYXJhbWV0ZXJzCiAgICBm b3IgdGhlIFVSTC4KCiAgICBgYGBqcwogICAgQXBwLlJvdXRlci5tYXAoZnVu Y3Rpb24oKSB7CiAgICAgIHRoaXMucmVzb3VyY2UoJ3Bvc3QnLCB7cGF0aDog Jy9wb3N0cy86cG9zdF9pZCd9KTsKICAgIH0pOwoKICAgIEFwcC5Qb3N0Um91 dGUgPSBFbWJlci5Sb3V0ZS5leHRlbmQoewogICAgICBtb2RlbDogZnVuY3Rp b24ocGFyYW1zKSB7CiAgICAgICAgLy8gdGhlIHNlcnZlciByZXR1cm5zIGB7 IGlkOiAxMiB9YAogICAgICAgIHJldHVybiBqUXVlcnkuZ2V0SlNPTigiL3Bv c3RzLyIgKyBwYXJhbXMucG9zdF9pZCk7CiAgICAgIH0sCgogICAgICBzZXJp YWxpemU6IGZ1bmN0aW9uKG1vZGVsKSB7CiAgICAgICAgLy8gdGhpcyB3aWxs IG1ha2UgdGhlIFVSTCBgL3Bvc3RzLzEyYAogICAgICAgIHJldHVybiB7IHBv c3RfaWQ6IG1vZGVsLmlkIH07CiAgICAgIH0KICAgIH0pOwogICAgYGBgCgog ICAgVGhlIGRlZmF1bHQgYHNlcmlhbGl6ZWAgbWV0aG9kIHdpbGwgaW5zZXJ0 IHRoZSBtb2RlbCdzIGBpZGAgaW50byB0aGUKICAgIHJvdXRlJ3MgZHluYW1p YyBzZWdtZW50IChpbiB0aGlzIGNhc2UsIGA6cG9zdF9pZGApIGlmIHRoZSBz ZWdtZW50IGNvbnRhaW5zICdfaWQnLgogICAgSWYgdGhlIHJvdXRlIGhhcyBt dWx0aXBsZSBkeW5hbWljIHNlZ21lbnRzIG9yIGRvZXMgbm90IGNvbnRhaW4g J19pZCcsIGBzZXJpYWxpemVgCiAgICB3aWxsIHJldHVybiBgRW1iZXIuZ2V0 UHJvcGVydGllcyhtb2RlbCwgcGFyYW1zKWAKCiAgICBUaGlzIG1ldGhvZCBp cyBjYWxsZWQgd2hlbiBgdHJhbnNpdGlvblRvYCBpcyBjYWxsZWQgd2l0aCBh IGNvbnRleHQKICAgIGluIG9yZGVyIHRvIHBvcHVsYXRlIHRoZSBVUkwuCgog ICAgQG1ldGhvZCBzZXJpYWxpemUKICAgIEBwYXJhbSB7T2JqZWN0fSBtb2Rl bCB0aGUgcm91dGUncyBtb2RlbAogICAgQHBhcmFtIHtBcnJheX0gcGFyYW1z IGFuIEFycmF5IG9mIHBhcmFtZXRlciBuYW1lcyBmb3IgdGhlIGN1cnJlbnQK ICAgICAgcm91dGUgKGluIHRoZSBleGFtcGxlLCBgWydwb3N0X2lkJ11gLgog ICAgQHJldHVybiB7T2JqZWN0fSB0aGUgc2VyaWFsaXplZCBwYXJhbWV0ZXJz CiAgKi8KICBzZXJpYWxpemU6IGZ1bmN0aW9uKG1vZGVsLCBwYXJhbXMpIHsK ICAgIGlmIChwYXJhbXMubGVuZ3RoIDwgMSkgeyByZXR1cm47IH0KICAgIGlm ICghbW9kZWwpIHsgcmV0dXJuOyB9CgogICAgdmFyIG5hbWUgPSBwYXJhbXNb MF0sIG9iamVjdCA9IHt9OwoKICAgIGlmICgvX2lkJC8udGVzdChuYW1lKSAm JiBwYXJhbXMubGVuZ3RoID09PSAxKSB7CiAgICAgIG9iamVjdFtuYW1lXSA9 IGdldChtb2RlbCwgImlkIik7CiAgICB9IGVsc2UgewogICAgICBvYmplY3Qg PSBnZXRQcm9wZXJ0aWVzKG1vZGVsLCBwYXJhbXMpOwogICAgfQoKICAgIHJl dHVybiBvYmplY3Q7CiAgfSwKCiAgLyoqCiAgICBBIGhvb2sgeW91IGNhbiB1 c2UgdG8gc2V0dXAgdGhlIGNvbnRyb2xsZXIgZm9yIHRoZSBjdXJyZW50IHJv dXRlLgoKICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIHRoZSBjb250 cm9sbGVyIGZvciB0aGUgY3VycmVudCByb3V0ZSBhbmQgdGhlCiAgICBtb2Rl bCBzdXBwbGllZCBieSB0aGUgYG1vZGVsYCBob29rLgoKICAgIEJ5IGRlZmF1 bHQsIHRoZSBgc2V0dXBDb250cm9sbGVyYCBob29rIHNldHMgdGhlIGBjb250 ZW50YCBwcm9wZXJ0eSBvZgogICAgdGhlIGNvbnRyb2xsZXIgdG8gdGhlIGBt b2RlbGAuCgogICAgVGhpcyBtZWFucyB0aGF0IHlvdXIgdGVtcGxhdGUgd2ls bCBnZXQgYSBwcm94eSBmb3IgdGhlIG1vZGVsIGFzIGl0cwogICAgY29udGV4 dCwgYW5kIHlvdSBjYW4gYWN0IGFzIHRob3VnaCB0aGUgbW9kZWwgaXRzZWxm IHdhcyB0aGUgY29udGV4dC4KCiAgICBUaGUgcHJvdmlkZWQgY29udHJvbGxl ciB3aWxsIGJlIG9uZSByZXNvbHZlZCBiYXNlZCBvbiB0aGUgbmFtZQogICAg b2YgdGhpcyByb3V0ZS4KCiAgICBJZiBubyBleHBsaWNpdCBjb250cm9sbGVy IGlzIGRlZmluZWQsIEVtYmVyIHdpbGwgYXV0b21hdGljYWxseSBjcmVhdGUK ICAgIGFuIGFwcHJvcHJpYXRlIGNvbnRyb2xsZXIgZm9yIHRoZSBtb2RlbC4K CiAgICAqIGlmIHRoZSBtb2RlbCBpcyBhbiBgRW1iZXIuQXJyYXlgIChpbmNs dWRpbmcgcmVjb3JkIGFycmF5cyBmcm9tIEVtYmVyCiAgICAgIERhdGEpLCB0 aGUgY29udHJvbGxlciBpcyBhbiBgRW1iZXIuQXJyYXlDb250cm9sbGVyYC4K ICAgICogb3RoZXJ3aXNlLCB0aGUgY29udHJvbGxlciBpcyBhbiBgRW1iZXIu T2JqZWN0Q29udHJvbGxlcmAuCgogICAgQXMgYW4gZXhhbXBsZSwgY29uc2lk ZXIgdGhlIHJvdXRlcjoKCiAgICBgYGBqcwogICAgQXBwLlJvdXRlci5tYXAo ZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMucmVzb3VyY2UoJ3Bvc3QnLCB7cGF0 aDogJy9wb3N0cy86cG9zdF9pZCd9KTsKICAgIH0pOwogICAgYGBgCgogICAg Rm9yIHRoZSBgcG9zdGAgcm91dGUsIGEgY29udHJvbGxlciBuYW1lZCBgQXBw LlBvc3RDb250cm9sbGVyYCB3b3VsZAogICAgYmUgdXNlZCBpZiBpdCBpcyBk ZWZpbmVkLiBJZiBpdCBpcyBub3QgZGVmaW5lZCwgYW4gYEVtYmVyLk9iamVj dENvbnRyb2xsZXJgCiAgICBpbnN0YW5jZSB3b3VsZCBiZSB1c2VkLgoKICAg IEV4YW1wbGUKCiAgICBgYGBqcwogICAgQXBwLlBvc3RSb3V0ZSA9IEVtYmVy LlJvdXRlLmV4dGVuZCh7CiAgICAgIHNldHVwQ29udHJvbGxlcjogZnVuY3Rp b24oY29udHJvbGxlciwgbW9kZWwpIHsKICAgICAgICBjb250cm9sbGVyLnNl dCgnbW9kZWwnLCBtb2RlbCk7CiAgICAgIH0KICAgIH0pOwogICAgYGBgCgog ICAgQG1ldGhvZCBzZXR1cENvbnRyb2xsZXIKICAgIEBwYXJhbSB7Q29udHJv bGxlcn0gY29udHJvbGxlciBpbnN0YW5jZQogICAgQHBhcmFtIHtPYmplY3R9 IG1vZGVsCiAgKi8KICBzZXR1cENvbnRyb2xsZXI6IGZ1bmN0aW9uKGNvbnRy b2xsZXIsIGNvbnRleHQsIHRyYW5zaXRpb24pIHsKICAgIGlmIChjb250cm9s bGVyICYmIChjb250ZXh0ICE9PSB1bmRlZmluZWQpKSB7CiAgICAgIHNldChj b250cm9sbGVyLCAnbW9kZWwnLCBjb250ZXh0KTsKICAgIH0KICB9LAoKICAv KioKICAgIFJldHVybnMgdGhlIGNvbnRyb2xsZXIgZm9yIGEgcGFydGljdWxh ciByb3V0ZSBvciBuYW1lLgoKICAgIFRoZSBjb250cm9sbGVyIGluc3RhbmNl IG11c3QgYWxyZWFkeSBoYXZlIGJlZW4gY3JlYXRlZCwgZWl0aGVyIHRocm91 Z2ggZW50ZXJpbmcgdGhlCiAgICBhc3NvY2lhdGVkIHJvdXRlIG9yIHVzaW5n IGBnZW5lcmF0ZUNvbnRyb2xsZXJgLgoKICAgIGBgYGpzCiAgICBBcHAuUG9z dFJvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsKICAgICAgc2V0dXBDb250 cm9sbGVyOiBmdW5jdGlvbihjb250cm9sbGVyLCBwb3N0KSB7CiAgICAgICAg dGhpcy5fc3VwZXIoY29udHJvbGxlciwgcG9zdCk7CiAgICAgICAgdGhpcy5j b250cm9sbGVyRm9yKCdwb3N0cycpLnNldCgnY3VycmVudFBvc3QnLCBwb3N0 KTsKICAgICAgfQogICAgfSk7CiAgICBgYGAKCiAgICBAbWV0aG9kIGNvbnRy b2xsZXJGb3IKICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9m IHRoZSByb3V0ZSBvciBjb250cm9sbGVyCiAgICBAcmV0dXJuIHtFbWJlci5D b250cm9sbGVyfQogICovCiAgY29udHJvbGxlckZvcjogZnVuY3Rpb24obmFt ZSwgX3NraXBBc3NlcnQpIHsKICAgIHZhciBjb250YWluZXIgPSB0aGlzLmNv bnRhaW5lciwKICAgICAgICByb3V0ZSA9IGNvbnRhaW5lci5sb29rdXAoJ3Jv dXRlOicrbmFtZSksCiAgICAgICAgY29udHJvbGxlcjsKCiAgICBpZiAocm91 dGUgJiYgcm91dGUuY29udHJvbGxlck5hbWUpIHsKICAgICAgbmFtZSA9IHJv dXRlLmNvbnRyb2xsZXJOYW1lOwogICAgfQoKICAgIGNvbnRyb2xsZXIgPSBj b250YWluZXIubG9va3VwKCdjb250cm9sbGVyOicgKyBuYW1lKTsKCiAgICAv LyBOT1RFOiBXZSdyZSBzcGVjaWZpY2FsbHkgY2hlY2tpbmcgdGhhdCBza2lw QXNzZXJ0IGlzIHRydWUsIGJlY2F1c2UgYWNjb3JkaW5nCiAgICAvLyAgIHRv IHRoZSBvbGQgQVBJIHRoZSBzZWNvbmQgcGFyYW1ldGVyIHdhcyBtb2RlbC4g V2UgZG8gbm90IHdhbnQgcGVvcGxlIHdobwogICAgLy8gICBwYXNzZWQgYSBt b2RlbCB0byBza2lwIHRoZSBhc3NlcnRpb24uCiAgICBFbWJlci5hc3NlcnQo IlRoZSBjb250cm9sbGVyIG5hbWVkICciK25hbWUrIicgY291bGQgbm90IGJl IGZvdW5kLiBNYWtlIHN1cmUgIiArCiAgICAgICAgICAgICAgICAgInRoYXQg dGhpcyByb3V0ZSBleGlzdHMgYW5kIGhhcyBhbHJlYWR5IGJlZW4gZW50ZXJl ZCBhdCBsZWFzdCAiICsKICAgICAgICAgICAgICAgICAib25jZS4gSWYgeW91 IGFyZSBhY2Nlc3NpbmcgYSBjb250cm9sbGVyIG5vdCBhc3NvY2lhdGVkIHdp dGggYSAiICsKICAgICAgICAgICAgICAgICAicm91dGUsIG1ha2Ugc3VyZSB0 aGUgY29udHJvbGxlciBjbGFzcyBpcyBleHBsaWNpdGx5IGRlZmluZWQuIiwK ICAgICAgICAgICAgICAgICBjb250cm9sbGVyIHx8IF9za2lwQXNzZXJ0ID09 PSB0cnVlKTsKCiAgICByZXR1cm4gY29udHJvbGxlcjsKICB9LAoKICAvKioK ICAgIEdlbmVyYXRlcyBhIGNvbnRyb2xsZXIgZm9yIGEgcm91dGUuCgogICAg SWYgdGhlIG9wdGlvbmFsIG1vZGVsIGlzIHBhc3NlZCB0aGVuIHRoZSBjb250 cm9sbGVyIHR5cGUgaXMgZGV0ZXJtaW5lZCBhdXRvbWF0aWNhbGx5LAogICAg ZS5nLiwgYW4gQXJyYXlDb250cm9sbGVyIGZvciBhcnJheXMuCgogICAgRXhh bXBsZQoKICAgIGBgYGpzCiAgICBBcHAuUG9zdFJvdXRlID0gRW1iZXIuUm91 dGUuZXh0ZW5kKHsKICAgICAgc2V0dXBDb250cm9sbGVyOiBmdW5jdGlvbihj b250cm9sbGVyLCBwb3N0KSB7CiAgICAgICAgdGhpcy5fc3VwZXIoY29udHJv bGxlciwgcG9zdCk7CiAgICAgICAgdGhpcy5nZW5lcmF0ZUNvbnRyb2xsZXIo J3Bvc3RzJywgcG9zdCk7CiAgICAgIH0KICAgIH0pOwogICAgYGBgCgogICAg QG1ldGhvZCBnZW5lcmF0ZUNvbnRyb2xsZXIKICAgIEBwYXJhbSB7U3RyaW5n fSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb250cm9sbGVyCiAgICBAcGFyYW0g e09iamVjdH0gbW9kZWwgdGhlIG1vZGVsIHRvIGluZmVyIHRoZSB0eXBlIG9m IHRoZSBjb250cm9sbGVyIChvcHRpb25hbCkKICAqLwogIGdlbmVyYXRlQ29u dHJvbGxlcjogZnVuY3Rpb24obmFtZSwgbW9kZWwpIHsKICAgIHZhciBjb250 YWluZXIgPSB0aGlzLmNvbnRhaW5lcjsKCiAgICBtb2RlbCA9IG1vZGVsIHx8 IHRoaXMubW9kZWxGb3IobmFtZSk7CgogICAgcmV0dXJuIEVtYmVyLmdlbmVy YXRlQ29udHJvbGxlcihjb250YWluZXIsIG5hbWUsIG1vZGVsKTsKICB9LAoK ICAvKioKICAgIFJldHVybnMgdGhlIG1vZGVsIG9mIGEgcGFyZW50IChvciBh bnkgYW5jZXN0b3IpIHJvdXRlCiAgICBpbiBhIHJvdXRlIGhpZXJhcmNoeS4g IER1cmluZyBhIHRyYW5zaXRpb24sIGFsbCByb3V0ZXMKICAgIG11c3QgcmVz b2x2ZSBhIG1vZGVsIG9iamVjdCwgYW5kIGlmIGEgcm91dGUKICAgIG5lZWRz IGFjY2VzcyB0byBhIHBhcmVudCByb3V0ZSdzIG1vZGVsIGluIG9yZGVyIHRv CiAgICByZXNvbHZlIGEgbW9kZWwgKG9yIGp1c3QgcmV1c2UgdGhlIG1vZGVs IGZyb20gYSBwYXJlbnQpLAogICAgaXQgY2FuIGNhbGwgYHRoaXMubW9kZWxG b3IodGhlTmFtZU9mUGFyZW50Um91dGUpYCB0bwogICAgcmV0cmlldmUgaXQu CgogICAgRXhhbXBsZQoKICAgIGBgYGpzCiAgICBBcHAuUm91dGVyLm1hcChm dW5jdGlvbigpIHsKICAgICAgICB0aGlzLnJlc291cmNlKCdwb3N0JywgeyBw YXRoOiAnL3Bvc3QvOnBvc3RfaWQnIH0sIGZ1bmN0aW9uKCkgewogICAgICAg ICAgICB0aGlzLnJlc291cmNlKCdjb21tZW50cycpOwogICAgICAgIH0pOwog ICAgfSk7CgogICAgQXBwLkNvbW1lbnRzUm91dGUgPSBFbWJlci5Sb3V0ZS5l eHRlbmQoewogICAgICAgIGFmdGVyTW9kZWw6IGZ1bmN0aW9uKCkgewogICAg ICAgICAgICB0aGlzLnNldCgncG9zdCcsIHRoaXMubW9kZWxGb3IoJ3Bvc3Qn KSk7CiAgICAgICAgfQogICAgfSk7CiAgICBgYGAKCiAgICBAbWV0aG9kIG1v ZGVsRm9yCiAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0 aGUgcm91dGUKICAgIEByZXR1cm4ge09iamVjdH0gdGhlIG1vZGVsIG9iamVj dAogICovCiAgbW9kZWxGb3I6IGZ1bmN0aW9uKG5hbWUpIHsKCiAgICB2YXIg cm91dGUgPSB0aGlzLmNvbnRhaW5lci5sb29rdXAoJ3JvdXRlOicgKyBuYW1l KSwKICAgICAgICB0cmFuc2l0aW9uID0gdGhpcy5yb3V0ZXIucm91dGVyLmFj dGl2ZVRyYW5zaXRpb247CgogICAgLy8gSWYgd2UgYXJlIG1pZC10cmFuc2l0 aW9uLCB3ZSB3YW50IHRvIHRyeSBhbmQgbG9vayB1cAogICAgLy8gcmVzb2x2 ZWQgcGFyZW50IGNvbnRleHRzIG9uIHRoZSBjdXJyZW50IHRyYW5zaXRpb25F dmVudC4KICAgIGlmICh0cmFuc2l0aW9uKSB7CiAgICAgIHZhciBtb2RlbExv b2t1cE5hbWUgPSAocm91dGUgJiYgcm91dGUucm91dGVOYW1lKSB8fCBuYW1l OwogICAgICBpZiAodHJhbnNpdGlvbi5yZXNvbHZlZE1vZGVscy5oYXNPd25Q cm9wZXJ0eShtb2RlbExvb2t1cE5hbWUpKSB7CiAgICAgICAgcmV0dXJuIHRy YW5zaXRpb24ucmVzb2x2ZWRNb2RlbHNbbW9kZWxMb29rdXBOYW1lXTsKICAg ICAgfQogICAgfQoKICAgIHJldHVybiByb3V0ZSAmJiByb3V0ZS5jdXJyZW50 TW9kZWw7CiAgfSwKCiAgLyoqCiAgICBBIGhvb2sgeW91IGNhbiB1c2UgdG8g cmVuZGVyIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGN1cnJlbnQgcm91dGUuCgog ICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdpdGggdGhlIGNvbnRyb2xsZXIg Zm9yIHRoZSBjdXJyZW50IHJvdXRlIGFuZCB0aGUKICAgIG1vZGVsIHN1cHBs aWVkIGJ5IHRoZSBgbW9kZWxgIGhvb2suIEJ5IGRlZmF1bHQsIGl0IHJlbmRl cnMgdGhlIHJvdXRlJ3MKICAgIHRlbXBsYXRlLCBjb25maWd1cmVkIHdpdGgg dGhlIGNvbnRyb2xsZXIgZm9yIHRoZSByb3V0ZS4KCiAgICBUaGlzIG1ldGhv ZCBjYW4gYmUgb3ZlcnJpZGRlbiB0byBzZXQgdXAgYW5kIHJlbmRlciBhZGRp dGlvbmFsIG9yCiAgICBhbHRlcm5hdGl2ZSB0ZW1wbGF0ZXMuCgogICAgYGBg anMKICAgIEFwcC5Qb3N0c1JvdXRlID0gRW1iZXIuUm91dGUuZXh0ZW5kKHsK ICAgICAgcmVuZGVyVGVtcGxhdGU6IGZ1bmN0aW9uKGNvbnRyb2xsZXIsIG1v ZGVsKSB7CiAgICAgICAgdmFyIGZhdkNvbnRyb2xsZXIgPSB0aGlzLmNvbnRy b2xsZXJGb3IoJ2Zhdm9yaXRlUG9zdCcpOwoKICAgICAgICAvLyBSZW5kZXIg dGhlIGBmYXZvcml0ZVBvc3RgIHRlbXBsYXRlIGludG8KICAgICAgICAvLyB0 aGUgb3V0bGV0IGBwb3N0c2AsIGFuZCBkaXNwbGF5IHRoZSBgZmF2b3JpdGVQ b3N0YAogICAgICAgIC8vIGNvbnRyb2xsZXIuCiAgICAgICAgdGhpcy5yZW5k ZXIoJ2Zhdm9yaXRlUG9zdCcsIHsKICAgICAgICAgIG91dGxldDogJ3Bvc3Rz JywKICAgICAgICAgIGNvbnRyb2xsZXI6IGZhdkNvbnRyb2xsZXIKICAgICAg ICB9KTsKICAgICAgfQogICAgfSk7CiAgICBgYGAKCiAgICBAbWV0aG9kIHJl bmRlclRlbXBsYXRlCiAgICBAcGFyYW0ge09iamVjdH0gY29udHJvbGxlciB0 aGUgcm91dGUncyBjb250cm9sbGVyCiAgICBAcGFyYW0ge09iamVjdH0gbW9k ZWwgdGhlIHJvdXRlJ3MgbW9kZWwKICAqLwogIHJlbmRlclRlbXBsYXRlOiBm dW5jdGlvbihjb250cm9sbGVyLCBtb2RlbCkgewogICAgdGhpcy5yZW5kZXIo KTsKICB9LAoKICAvKioKICAgIFJlbmRlcnMgYSB0ZW1wbGF0ZSBpbnRvIGFu IG91dGxldC4KCiAgICBUaGlzIG1ldGhvZCBoYXMgYSBudW1iZXIgb2YgZGVm YXVsdHMsIGJhc2VkIG9uIHRoZSBuYW1lIG9mIHRoZQogICAgcm91dGUgc3Bl Y2lmaWVkIGluIHRoZSByb3V0ZXIuCgogICAgRm9yIGV4YW1wbGU6CgogICAg YGBganMKICAgIEFwcC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkgewogICAgICB0 aGlzLnJvdXRlKCdpbmRleCcpOwogICAgICB0aGlzLnJlc291cmNlKCdwb3N0 Jywge3BhdGg6ICcvcG9zdHMvOnBvc3RfaWQnfSk7CiAgICB9KTsKCiAgICBB cHAuUG9zdFJvdXRlID0gQXBwLlJvdXRlLmV4dGVuZCh7CiAgICAgIHJlbmRl clRlbXBsYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnJlbmRlcigp OwogICAgICB9CiAgICB9KTsKICAgIGBgYAoKICAgIFRoZSBuYW1lIG9mIHRo ZSBgUG9zdFJvdXRlYCwgYXMgZGVmaW5lZCBieSB0aGUgcm91dGVyLCBpcyBg cG9zdGAuCgogICAgQnkgZGVmYXVsdCwgcmVuZGVyIHdpbGw6CgogICAgKiBy ZW5kZXIgdGhlIGBwb3N0YCB0ZW1wbGF0ZQogICAgKiB3aXRoIHRoZSBgcG9z dGAgdmlldyAoYFBvc3RWaWV3YCkgZm9yIGV2ZW50IGhhbmRsaW5nLCBpZiBv bmUgZXhpc3RzCiAgICAqIGFuZCB0aGUgYHBvc3RgIGNvbnRyb2xsZXIgKGBQ b3N0Q29udHJvbGxlcmApLCBpZiBvbmUgZXhpc3RzCiAgICAqIGludG8gdGhl IGBtYWluYCBvdXRsZXQgb2YgdGhlIGBhcHBsaWNhdGlvbmAgdGVtcGxhdGUK CiAgICBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3I6CgogICAgYGBg anMKICAgIEFwcC5Qb3N0Um91dGUgPSBBcHAuUm91dGUuZXh0ZW5kKHsKICAg ICAgcmVuZGVyVGVtcGxhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMu cmVuZGVyKCdteVBvc3QnLCB7ICAgLy8gdGhlIHRlbXBsYXRlIHRvIHJlbmRl cgogICAgICAgICAgaW50bzogJ2luZGV4JywgICAgICAgICAgLy8gdGhlIHRl bXBsYXRlIHRvIHJlbmRlciBpbnRvCiAgICAgICAgICBvdXRsZXQ6ICdkZXRh aWwnLCAgICAgICAvLyB0aGUgbmFtZSBvZiB0aGUgb3V0bGV0IGluIHRoYXQg dGVtcGxhdGUKICAgICAgICAgIGNvbnRyb2xsZXI6ICdibG9nUG9zdCcgIC8v IHRoZSBjb250cm9sbGVyIHRvIHVzZSBmb3IgdGhlIHRlbXBsYXRlCiAgICAg ICAgfSk7CiAgICAgIH0KICAgIH0pOwogICAgYGBgCgogICAgUmVtZW1iZXIg dGhhdCB0aGUgY29udHJvbGxlcidzIGBjb250ZW50YCB3aWxsIGJlIHRoZSBy b3V0ZSdzIG1vZGVsLiBJbgogICAgdGhpcyBjYXNlLCB0aGUgZGVmYXVsdCBt b2RlbCB3aWxsIGJlIGBBcHAuUG9zdC5maW5kKHBhcmFtcy5wb3N0X2lkKWAu CgogICAgQG1ldGhvZCByZW5kZXIKICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1l IHRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSB0byByZW5kZXIKICAgIEBwYXJh bSB7T2JqZWN0fSBvcHRpb25zIHRoZSBvcHRpb25zCiAgKi8KICByZW5kZXI6 IGZ1bmN0aW9uKG5hbWUsIG9wdGlvbnMpIHsKICAgIEVtYmVyLmFzc2VydCgi VGhlIG5hbWUgaW4gdGhlIGdpdmVuIGFyZ3VtZW50cyBpcyB1bmRlZmluZWQi LCBhcmd1bWVudHMubGVuZ3RoID4gMCA/ICFFbWJlci5pc05vbmUoYXJndW1l bnRzWzBdKSA6IHRydWUpOwoKICAgIHZhciBuYW1lUGFzc2VkID0gISFuYW1l OwoKICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ29iamVjdCcgJiYgIW9wdGlv bnMpIHsKICAgICAgb3B0aW9ucyA9IG5hbWU7CiAgICAgIG5hbWUgPSB0aGlz LnJvdXRlTmFtZTsKICAgIH0KCiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7 fTsKCiAgICB2YXIgdGVtcGxhdGVOYW1lOwoKICAgIGlmIChuYW1lKSB7CiAg ICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoL1wvL2csICcuJyk7CiAgICAgIHRl bXBsYXRlTmFtZSA9IG5hbWU7CiAgICB9IGVsc2UgewogICAgICBuYW1lID0g dGhpcy5yb3V0ZU5hbWU7CiAgICAgIHRlbXBsYXRlTmFtZSA9IHRoaXMudGVt cGxhdGVOYW1lIHx8IG5hbWU7CiAgICB9CgogICAgdmFyIHZpZXdOYW1lID0g b3B0aW9ucy52aWV3IHx8IHRoaXMudmlld05hbWUgfHwgbmFtZTsKCiAgICB2 YXIgY29udGFpbmVyID0gdGhpcy5jb250YWluZXIsCiAgICAgICAgdmlldyA9 IGNvbnRhaW5lci5sb29rdXAoJ3ZpZXc6JyArIHZpZXdOYW1lKSwKICAgICAg ICB0ZW1wbGF0ZSA9IHZpZXcgPyB2aWV3LmdldCgndGVtcGxhdGUnKSA6IG51 bGw7CgogICAgaWYgKCF0ZW1wbGF0ZSkgewogICAgICB0ZW1wbGF0ZSA9IGNv bnRhaW5lci5sb29rdXAoJ3RlbXBsYXRlOicgKyB0ZW1wbGF0ZU5hbWUpOwog ICAgfQoKICAgIGlmICghdmlldyAmJiAhdGVtcGxhdGUpIHsKICAgICAgRW1i ZXIuYXNzZXJ0KCJDb3VsZCBub3QgZmluZCBcIiIgKyBuYW1lICsgIlwiIHRl bXBsYXRlIG9yIHZpZXcuIiwgIW5hbWVQYXNzZWQpOwogICAgICBpZiAoZ2V0 KHRoaXMucm91dGVyLCAnbmFtZXNwYWNlLkxPR19WSUVXX0xPT0tVUFMnKSkg ewogICAgICAgIEVtYmVyLkxvZ2dlci5pbmZvKCJDb3VsZCBub3QgZmluZCBc IiIgKyBuYW1lICsgIlwiIHRlbXBsYXRlIG9yIHZpZXcuIE5vdGhpbmcgd2ls bCBiZSByZW5kZXJlZCIsIHsgZnVsbE5hbWU6ICd0ZW1wbGF0ZTonICsgbmFt ZSB9KTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CgogICAgb3B0aW9u cyA9IG5vcm1hbGl6ZU9wdGlvbnModGhpcywgbmFtZSwgdGVtcGxhdGUsIG9w dGlvbnMpOwogICAgdmlldyA9IHNldHVwVmlldyh2aWV3LCBjb250YWluZXIs IG9wdGlvbnMpOwoKICAgIGlmIChvcHRpb25zLm91dGxldCA9PT0gJ21haW4n KSB7IHRoaXMubGFzdFJlbmRlcmVkVGVtcGxhdGUgPSBuYW1lOyB9CgogICAg YXBwZW5kVmlldyh0aGlzLCB2aWV3LCBvcHRpb25zKTsKICB9LAoKICAvKioK ICAgIERpc2Nvbm5lY3RzIGEgdmlldyB0aGF0IGhhcyBiZWVuIHJlbmRlcmVk IGludG8gYW4gb3V0bGV0LgoKICAgIFlvdSBtYXkgcGFzcyBhbnkgb3IgYWxs IG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyB0byBgZGlzY29ubmVjdE91dGxl dGA6CgogICAgKiBgb3V0bGV0YDogdGhlIG5hbWUgb2YgdGhlIG91dGxldCB0 byBjbGVhciAoZGVmYXVsdDogJ21haW4nKQogICAgKiBgcGFyZW50Vmlld2A6 IHRoZSBuYW1lIG9mIHRoZSB2aWV3IGNvbnRhaW5pbmcgdGhlIG91dGxldCB0 byBjbGVhcgogICAgICAgKGRlZmF1bHQ6IHRoZSB2aWV3IHJlbmRlcmVkIGJ5 IHRoZSBwYXJlbnQgcm91dGUpCgogICAgRXhhbXBsZToKCiAgICBgYGBqcwog ICAgQXBwLkFwcGxpY2F0aW9uUm91dGUgPSBBcHAuUm91dGUuZXh0ZW5kKHsK ICAgICAgYWN0aW9uczogewogICAgICAgIHNob3dNb2RhbDogZnVuY3Rpb24o ZXZ0KSB7CiAgICAgICAgICB0aGlzLnJlbmRlcihldnQubW9kYWxOYW1lLCB7 CiAgICAgICAgICAgIG91dGxldDogJ21vZGFsJywKICAgICAgICAgICAgaW50 bzogJ2FwcGxpY2F0aW9uJwogICAgICAgICAgfSk7CiAgICAgICAgfSwKICAg ICAgICBoaWRlTW9kYWw6IGZ1bmN0aW9uKGV2dCkgewogICAgICAgICAgdGhp cy5kaXNjb25uZWN0T3V0bGV0KHsKICAgICAgICAgICAgb3V0bGV0OiAnbW9k YWwnLAogICAgICAgICAgICBwYXJlbnRWaWV3OiAnYXBwbGljYXRpb24nCiAg ICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogICAgYGBg CgogICAgQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBwYXNzIHRoZSBgb3V0bGV0 YCBuYW1lIGRpcmVjdGx5IGFzIGEgc3RyaW5nLgoKICAgIEV4YW1wbGU6Cgog ICAgYGBganMKICAgIGhpZGVNb2RhbDogZnVuY3Rpb24oZXZ0KSB7CiAgICAg IHRoaXMuZGlzY29ubmVjdE91dGxldCgnbW9kYWwnKTsKICAgIH0KICAgIGBg YAoKICAgIEBtZXRob2QgZGlzY29ubmVjdE91dGxldAogICAgQHBhcmFtIHtP YmplY3R8U3RyaW5nfSBvcHRpb25zIHRoZSBvcHRpb25zIGhhc2ggb3Igb3V0 bGV0IG5hbWUKICAqLwogIGRpc2Nvbm5lY3RPdXRsZXQ6IGZ1bmN0aW9uKG9w dGlvbnMpIHsKICAgIGlmICghb3B0aW9ucyB8fCB0eXBlb2Ygb3B0aW9ucyA9 PT0gInN0cmluZyIpIHsKICAgICAgdmFyIG91dGxldE5hbWUgPSBvcHRpb25z OwogICAgICBvcHRpb25zID0ge307CiAgICAgIG9wdGlvbnMub3V0bGV0ID0g b3V0bGV0TmFtZTsKICAgIH0KICAgIG9wdGlvbnMucGFyZW50VmlldyA9IG9w dGlvbnMucGFyZW50VmlldyA/IG9wdGlvbnMucGFyZW50Vmlldy5yZXBsYWNl KC9cLy9nLCAnLicpIDogcGFyZW50VGVtcGxhdGUodGhpcyk7CiAgICBvcHRp b25zLm91dGxldCA9IG9wdGlvbnMub3V0bGV0IHx8ICdtYWluJzsKCiAgICB2 YXIgcGFyZW50VmlldyA9IHRoaXMucm91dGVyLl9sb29rdXBBY3RpdmVWaWV3 KG9wdGlvbnMucGFyZW50Vmlldyk7CiAgICBpZiAocGFyZW50VmlldykgeyBw YXJlbnRWaWV3LmRpc2Nvbm5lY3RPdXRsZXQob3B0aW9ucy5vdXRsZXQpOyB9 CiAgfSwKCiAgd2lsbERlc3Ryb3k6IGZ1bmN0aW9uKCkgewogICAgdGhpcy50 ZWFyZG93blZpZXdzKCk7CiAgfSwKCiAgLyoqCiAgICBAcHJpdmF0ZQoKICAg IEBtZXRob2QgdGVhcmRvd25WaWV3cwogICovCiAgdGVhcmRvd25WaWV3czog ZnVuY3Rpb24oKSB7CiAgICAvLyBUZWFyIGRvd24gdGhlIHRvcCBsZXZlbCB2 aWV3CiAgICBpZiAodGhpcy50ZWFyZG93blRvcExldmVsVmlldykgeyB0aGlz LnRlYXJkb3duVG9wTGV2ZWxWaWV3KCk7IH0KCiAgICAvLyBUZWFyIGRvd24g YW55IG91dGxldHMgcmVuZGVyZWQgd2l0aCAnaW50bycKICAgIHZhciB0ZWFy ZG93bk91dGxldFZpZXdzID0gdGhpcy50ZWFyZG93bk91dGxldFZpZXdzIHx8 IFtdOwogICAgYV9mb3JFYWNoKHRlYXJkb3duT3V0bGV0Vmlld3MsIGZ1bmN0 aW9uKHRlYXJkb3duT3V0bGV0VmlldykgewogICAgICB0ZWFyZG93bk91dGxl dFZpZXcoKTsKICAgIH0pOwoKICAgIGRlbGV0ZSB0aGlzLnRlYXJkb3duVG9w TGV2ZWxWaWV3OwogICAgZGVsZXRlIHRoaXMudGVhcmRvd25PdXRsZXRWaWV3 czsKICAgIGRlbGV0ZSB0aGlzLmxhc3RSZW5kZXJlZFRlbXBsYXRlOwogIH0K fSk7CgoKaWYgKEVtYmVyLkZFQVRVUkVTLmlzRW5hYmxlZCgicXVlcnktcGFy YW1zLW5ldyIpKSB7CiAgRW1iZXIuUm91dGUucmVvcGVuKHsKICAgIHBhcmFt c0ZvcjogZnVuY3Rpb24obmFtZSkgewogICAgICB2YXIgcm91dGUgPSB0aGlz LmNvbnRhaW5lci5sb29rdXAoJ3JvdXRlOicgKyBuYW1lKTsKCiAgICAgIGlm ICghcm91dGUpIHsKICAgICAgICByZXR1cm4ge307CiAgICAgIH0KCiAgICAg IHZhciB0cmFuc2l0aW9uID0gdGhpcy5yb3V0ZXIucm91dGVyLmFjdGl2ZVRy YW5zaXRpb247CiAgICAgIHZhciBxdWVyeVBhcmFtc0hhc2ggPSB0aGlzLnJv dXRlci5fcXVlcnlQYXJhbU5hbWVzRm9yU2luZ2xlKHJvdXRlLnJvdXRlTmFt ZSk7CgogICAgICB2YXIgcGFyYW1zLCBxdWVyeVBhcmFtczsKICAgICAgaWYg KHRyYW5zaXRpb24pIHsKICAgICAgICBwYXJhbXMgPSB0cmFuc2l0aW9uLnBh cmFtc1tuYW1lXSB8fCB7fTsKICAgICAgICBxdWVyeVBhcmFtcyA9IHRyYW5z aXRpb24ucXVlcnlQYXJhbXM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFy IHN0YXRlID0gdGhpcy5yb3V0ZXIucm91dGVyLnN0YXRlOwogICAgICAgIHBh cmFtcyA9IHN0YXRlLnBhcmFtc1tuYW1lXSB8fCB7fTsKICAgICAgICBxdWVy eVBhcmFtcyA9IHN0YXRlLnF1ZXJ5UGFyYW1zOwogICAgICB9CgogICAgICB0 aGlzLnJvdXRlci5fcXVlcnlQYXJhbU92ZXJyaWRlcyhwYXJhbXMsIHF1ZXJ5 UGFyYW1zSGFzaC5xdWVyeVBhcmFtcywgZnVuY3Rpb24obmFtZSwgcmVzdWx0 c05hbWUsIGNvbG9uaXplZCkgewogICAgICAgIC8vIFJlcGxhY2UgdGhlIGNv bnRyb2xsZXItc3VwcGxpZWQgdmFsdWUgd2l0aCBtb3JlIHVwCiAgICAgICAg Ly8gdG8gZGF0ZSB2YWx1ZXMgKGUuZy4gZnJvbSBhbiBpbmNvbWluZyB0cmFu c2l0aW9uKS4KICAgICAgICB2YXIgdmFsdWUgPSAocmVzdWx0c05hbWUgaW4g cXVlcnlQYXJhbXMpID8KICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFt c1tyZXN1bHRzTmFtZV0gIDogIHBhcmFtc1tyZXN1bHRzTmFtZV07CiAgICAg ICAgZGVsZXRlIHBhcmFtc1tyZXN1bHRzTmFtZV07CiAgICAgICAgcGFyYW1z W2NvbG9uaXplZC5zcGxpdCgnOicpLnBvcCgpXSA9IHZhbHVlOwogICAgICB9 KTsKCiAgICAgIHJldHVybiBwYXJhbXM7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0 aW9uIHBhcmVudFJvdXRlKHJvdXRlKSB7CiAgdmFyIGhhbmRsZXJJbmZvcyA9 IHJvdXRlLnJvdXRlci5yb3V0ZXIuc3RhdGUuaGFuZGxlckluZm9zOwoKICBp ZiAoIWhhbmRsZXJJbmZvcykgeyByZXR1cm47IH0KCiAgdmFyIHBhcmVudCwg Y3VycmVudDsKCiAgZm9yICh2YXIgaT0wLCBsPWhhbmRsZXJJbmZvcy5sZW5n dGg7IGk8bDsgaSsrKSB7CiAgICBjdXJyZW50ID0gaGFuZGxlckluZm9zW2ld LmhhbmRsZXI7CiAgICBpZiAoY3VycmVudCA9PT0gcm91dGUpIHsgcmV0dXJu IHBhcmVudDsgfQogICAgcGFyZW50ID0gY3VycmVudDsKICB9Cn0KCmZ1bmN0 aW9uIHBhcmVudFRlbXBsYXRlKHJvdXRlKSB7CiAgdmFyIHBhcmVudCA9IHBh cmVudFJvdXRlKHJvdXRlKSwgdGVtcGxhdGU7CgogIGlmICghcGFyZW50KSB7 IHJldHVybjsgfQoKICBpZiAodGVtcGxhdGUgPSBwYXJlbnQubGFzdFJlbmRl cmVkVGVtcGxhdGUpIHsKICAgIHJldHVybiB0ZW1wbGF0ZTsKICB9IGVsc2Ug ewogICAgcmV0dXJuIHBhcmVudFRlbXBsYXRlKHBhcmVudCk7CiAgfQp9Cgpm dW5jdGlvbiBub3JtYWxpemVPcHRpb25zKHJvdXRlLCBuYW1lLCB0ZW1wbGF0 ZSwgb3B0aW9ucykgewogIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogIG9w dGlvbnMuaW50byA9IG9wdGlvbnMuaW50byA/IG9wdGlvbnMuaW50by5yZXBs YWNlKC9cLy9nLCAnLicpIDogcGFyZW50VGVtcGxhdGUocm91dGUpOwogIG9w dGlvbnMub3V0bGV0ID0gb3B0aW9ucy5vdXRsZXQgfHwgJ21haW4nOwogIG9w dGlvbnMubmFtZSA9IG5hbWU7CiAgb3B0aW9ucy50ZW1wbGF0ZSA9IHRlbXBs YXRlOwogIG9wdGlvbnMuTE9HX1ZJRVdfTE9PS1VQUyA9IGdldChyb3V0ZS5y b3V0ZXIsICduYW1lc3BhY2UuTE9HX1ZJRVdfTE9PS1VQUycpOwoKICBFbWJl ci5hc3NlcnQoIkFuIG91dGxldCAoIitvcHRpb25zLm91dGxldCsiKSB3YXMg c3BlY2lmaWVkIGJ1dCB3YXMgbm90IGZvdW5kLiIsIG9wdGlvbnMub3V0bGV0 ID09PSAnbWFpbicgfHwgb3B0aW9ucy5pbnRvKTsKCiAgdmFyIGNvbnRyb2xs ZXIgPSBvcHRpb25zLmNvbnRyb2xsZXIsIG5hbWVkQ29udHJvbGxlcjsKCiAg aWYgKG9wdGlvbnMuY29udHJvbGxlcikgewogICAgY29udHJvbGxlciA9IG9w dGlvbnMuY29udHJvbGxlcjsKICB9IGVsc2UgaWYgKG5hbWVkQ29udHJvbGxl ciA9IHJvdXRlLmNvbnRhaW5lci5sb29rdXAoJ2NvbnRyb2xsZXI6JyArIG5h bWUpKSB7CiAgICBjb250cm9sbGVyID0gbmFtZWRDb250cm9sbGVyOwogIH0g ZWxzZSB7CiAgICBjb250cm9sbGVyID0gcm91dGUuY29udHJvbGxlck5hbWUg fHwgcm91dGUucm91dGVOYW1lOwogIH0KCiAgaWYgKHR5cGVvZiBjb250cm9s bGVyID09PSAnc3RyaW5nJykgewogICAgdmFyIGNvbnRyb2xsZXJOYW1lID0g Y29udHJvbGxlcjsKICAgIGNvbnRyb2xsZXIgPSByb3V0ZS5jb250YWluZXIu bG9va3VwKCdjb250cm9sbGVyOicgKyBjb250cm9sbGVyTmFtZSk7CiAgICBp ZiAoIWNvbnRyb2xsZXIpIHsKICAgICAgdGhyb3cgbmV3IEVtYmVyLkVycm9y KCJZb3UgcGFzc2VkIGBjb250cm9sbGVyOiAnIiArIGNvbnRyb2xsZXJOYW1l ICsgIidgIGludG8gdGhlIGByZW5kZXJgIG1ldGhvZCwgYnV0IG5vIHN1Y2gg Y29udHJvbGxlciBjb3VsZCBiZSBmb3VuZC4iKTsKICAgIH0KICB9CgogIG9w dGlvbnMuY29udHJvbGxlciA9IGNvbnRyb2xsZXI7CgogIHJldHVybiBvcHRp b25zOwp9CgpmdW5jdGlvbiBzZXR1cFZpZXcodmlldywgY29udGFpbmVyLCBv cHRpb25zKSB7CiAgaWYgKHZpZXcpIHsKICAgIGlmIChvcHRpb25zLkxPR19W SUVXX0xPT0tVUFMpIHsKICAgICAgRW1iZXIuTG9nZ2VyLmluZm8oIlJlbmRl cmluZyAiICsgb3B0aW9ucy5uYW1lICsgIiB3aXRoICIgKyB2aWV3LCB7IGZ1 bGxOYW1lOiAndmlldzonICsgb3B0aW9ucy5uYW1lIH0pOwogICAgfQogIH0g ZWxzZSB7CiAgICB2YXIgZGVmYXVsdFZpZXcgPSBvcHRpb25zLmludG8gPyAn dmlldzpkZWZhdWx0JyA6ICd2aWV3OnRvcGxldmVsJzsKICAgIHZpZXcgPSBj b250YWluZXIubG9va3VwKGRlZmF1bHRWaWV3KTsKICAgIGlmIChvcHRpb25z LkxPR19WSUVXX0xPT0tVUFMpIHsKICAgICAgRW1iZXIuTG9nZ2VyLmluZm8o IlJlbmRlcmluZyAiICsgb3B0aW9ucy5uYW1lICsgIiB3aXRoIGRlZmF1bHQg dmlldyAiICsgdmlldywgeyBmdWxsTmFtZTogJ3ZpZXc6JyArIG9wdGlvbnMu bmFtZSB9KTsKICAgIH0KICB9CgogIGlmICghZ2V0KHZpZXcsICd0ZW1wbGF0 ZU5hbWUnKSkgewogICAgc2V0KHZpZXcsICd0ZW1wbGF0ZScsIG9wdGlvbnMu dGVtcGxhdGUpOwoKICAgIHNldCh2aWV3LCAnX2RlYnVnVGVtcGxhdGVOYW1l Jywgb3B0aW9ucy5uYW1lKTsKICB9CgogIHNldCh2aWV3LCAncmVuZGVyZWRO YW1lJywgb3B0aW9ucy5uYW1lKTsKICBzZXQodmlldywgJ2NvbnRyb2xsZXIn LCBvcHRpb25zLmNvbnRyb2xsZXIpOwoKICByZXR1cm4gdmlldzsKfQoKZnVu Y3Rpb24gYXBwZW5kVmlldyhyb3V0ZSwgdmlldywgb3B0aW9ucykgewogIGlm IChvcHRpb25zLmludG8pIHsKICAgIHZhciBwYXJlbnRWaWV3ID0gcm91dGUu cm91dGVyLl9sb29rdXBBY3RpdmVWaWV3KG9wdGlvbnMuaW50byk7CiAgICB2 YXIgdGVhcmRvd25PdXRsZXRWaWV3ID0gZ2VuZXJhdGVPdXRsZXRUZWFyZG93 bihwYXJlbnRWaWV3LCBvcHRpb25zLm91dGxldCk7CiAgICBpZiAoIXJvdXRl LnRlYXJkb3duT3V0bGV0Vmlld3MpIHsgcm91dGUudGVhcmRvd25PdXRsZXRW aWV3cyA9IFtdOyB9CiAgICBhX3JlcGxhY2Uocm91dGUudGVhcmRvd25PdXRs ZXRWaWV3cywgMCwgMCwgW3RlYXJkb3duT3V0bGV0Vmlld10pOwogICAgcGFy ZW50Vmlldy5jb25uZWN0T3V0bGV0KG9wdGlvbnMub3V0bGV0LCB2aWV3KTsK ICB9IGVsc2UgewogICAgdmFyIHJvb3RFbGVtZW50ID0gZ2V0KHJvdXRlLCAn cm91dGVyLm5hbWVzcGFjZS5yb290RWxlbWVudCcpOwogICAgLy8gdGVhciBk b3duIHZpZXcgaWYgb25lIGlzIGFscmVhZHkgcmVuZGVyZWQKICAgIGlmIChy b3V0ZS50ZWFyZG93blRvcExldmVsVmlldykgewogICAgICByb3V0ZS50ZWFy ZG93blRvcExldmVsVmlldygpOwogICAgfQogICAgcm91dGUucm91dGVyLl9j b25uZWN0QWN0aXZlVmlldyhvcHRpb25zLm5hbWUsIHZpZXcpOwogICAgcm91 dGUudGVhcmRvd25Ub3BMZXZlbFZpZXcgPSBnZW5lcmF0ZVRvcExldmVsVGVh cmRvd24odmlldyk7CiAgICB2aWV3LmFwcGVuZFRvKHJvb3RFbGVtZW50KTsK ICB9Cn0KCmZ1bmN0aW9uIGdlbmVyYXRlVG9wTGV2ZWxUZWFyZG93bih2aWV3 KSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgeyB2aWV3LmRlc3Ryb3koKTsgfTsK fQoKZnVuY3Rpb24gZ2VuZXJhdGVPdXRsZXRUZWFyZG93bihwYXJlbnRWaWV3 LCBvdXRsZXQpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7IHBhcmVudFZpZXcu ZGlzY29ubmVjdE91dGxldChvdXRsZXQpOyB9Owp9Cgp9KSgpOwoKCgooZnVu Y3Rpb24oKSB7Cgp9KSgpOwoKCgooZnVuY3Rpb24oKSB7CkVtYmVyLm9uTG9h ZCgnRW1iZXIuSGFuZGxlYmFycycsIGZ1bmN0aW9uKCkgewogIHZhciBoYW5k bGViYXJzUmVzb2x2ZSA9IEVtYmVyLkhhbmRsZWJhcnMucmVzb2x2ZVBhcmFt cywKICAgICAgbWFwID0gRW1iZXIuQXJyYXlQb2x5ZmlsbHMubWFwLAogICAg ICBnZXQgPSBFbWJlci5nZXQsCiAgICAgIGhhbmRsZWJhcnNHZXQgPSBFbWJl ci5IYW5kbGViYXJzLmdldDsKCiAgZnVuY3Rpb24gcmVzb2x2ZVBhcmFtcyhj b250ZXh0LCBwYXJhbXMsIG9wdGlvbnMpIHsKICAgIHJldHVybiBtYXAuY2Fs bChyZXNvbHZlUGF0aHMoY29udGV4dCwgcGFyYW1zLCBvcHRpb25zKSwgZnVu Y3Rpb24ocGF0aCwgaSkgewogICAgICBpZiAobnVsbCA9PT0gcGF0aCkgewog ICAgICAgIC8vIFBhcmFtIHdhcyBzdHJpbmcvbnVtYmVyLCBub3QgYSBwYXRo LCBzbyBqdXN0IHJldHVybiByYXcgc3RyaW5nL251bWJlci4KICAgICAgICBy ZXR1cm4gcGFyYW1zW2ldOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVy biBoYW5kbGViYXJzR2V0KGNvbnRleHQsIHBhdGgsIG9wdGlvbnMpOwogICAg ICB9CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHJlc29sdmVQYXRocyhjb250 ZXh0LCBwYXJhbXMsIG9wdGlvbnMpIHsKICAgIHZhciByZXNvbHZlZCA9IGhh bmRsZWJhcnNSZXNvbHZlKGNvbnRleHQsIHBhcmFtcywgb3B0aW9ucyksCiAg ICAgICAgdHlwZXMgPSBvcHRpb25zLnR5cGVzOwoKICAgIHJldHVybiBtYXAu Y2FsbChyZXNvbHZlZCwgZnVuY3Rpb24ob2JqZWN0LCBpKSB7CiAgICAgIGlm ICh0eXBlc1tpXSA9PT0gJ0lEJykgewogICAgICAgIHJldHVybiB1bndyYXAo b2JqZWN0LCBwYXJhbXNbaV0pOwogICAgICB9IGVsc2UgewogICAgICAgIHJl dHVybiBudWxsOwogICAgICB9CiAgICB9KTsKCiAgICBmdW5jdGlvbiB1bndy YXAob2JqZWN0LCBwYXRoKSB7CiAgICAgIGlmIChwYXRoID09PSAnY29udHJv bGxlcicpIHsgcmV0dXJuIHBhdGg7IH0KCiAgICAgIGlmIChFbWJlci5Db250 cm9sbGVyTWl4aW4uZGV0ZWN0KG9iamVjdCkpIHsKICAgICAgICByZXR1cm4g dW53cmFwKGdldChvYmplY3QsICdtb2RlbCcpLCBwYXRoID8gcGF0aCArICcu bW9kZWwnIDogJ21vZGVsJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0 dXJuIHBhdGg7CiAgICAgIH0KICAgIH0KICB9CgogIEVtYmVyLlJvdXRlci5y ZXNvbHZlUGFyYW1zID0gcmVzb2x2ZVBhcmFtczsKICBFbWJlci5Sb3V0ZXIu cmVzb2x2ZVBhdGhzID0gcmVzb2x2ZVBhdGhzOwp9KTsKCn0pKCk7CgoKCihm dW5jdGlvbigpIHsKLyoqCkBtb2R1bGUgZW1iZXIKQHN1Ym1vZHVsZSBlbWJl ci1yb3V0aW5nCiovCgp2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJl ci5zZXQsIGZtdCA9IEVtYmVyLlN0cmluZy5mbXQ7Cgp2YXIgc2xpY2UgPSBB cnJheS5wcm90b3R5cGUuc2xpY2U7CkVtYmVyLm9uTG9hZCgnRW1iZXIuSGFu ZGxlYmFycycsIGZ1bmN0aW9uKEhhbmRsZWJhcnMpIHsKCiAgdmFyIFF1ZXJ5 UGFyYW1zID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CiAgICB2YWx1ZXM6IG51 bGwKICB9KTsKCiAgdmFyIHJlc29sdmVQYXJhbXMgPSBFbWJlci5Sb3V0ZXIu cmVzb2x2ZVBhcmFtcywKICAgICAgdHJhbnNsYXRlUXVlcnlQYXJhbXMgPSBF bWJlci5Sb3V0ZXIuX3RyYW5zbGF0ZVF1ZXJ5UGFyYW1zLAogICAgICByZXNv bHZlUGF0aHMgID0gRW1iZXIuUm91dGVyLnJlc29sdmVQYXRocywKICAgICAg aXNTaW1wbGVDbGljayA9IEVtYmVyLlZpZXdVdGlscy5pc1NpbXBsZUNsaWNr OwoKICBmdW5jdGlvbiBnZXRSZXNvbHZlZFBhdGhzKG9wdGlvbnMpIHsKCiAg ICB2YXIgdHlwZXMgPSBvcHRpb25zLm9wdGlvbnMudHlwZXMsCiAgICAgICAg ZGF0YSA9IG9wdGlvbnMub3B0aW9ucy5kYXRhOwoKICAgIHJldHVybiByZXNv bHZlUGF0aHMob3B0aW9ucy5jb250ZXh0LCBvcHRpb25zLnBhcmFtcywgeyB0 eXBlczogdHlwZXMsIGRhdGE6IGRhdGEgfSk7CiAgfQoKICAvKioKICAgIGBF bWJlci5MaW5rVmlld2AgcmVuZGVycyBhbiBlbGVtZW50IHdob3NlIGBjbGlj a2AgZXZlbnQgdHJpZ2dlcnMgYQogICAgdHJhbnNpdGlvbiBvZiB0aGUgYXBw bGljYXRpb24ncyBpbnN0YW5jZSBvZiBgRW1iZXIuUm91dGVyYCB0bwogICAg YSBzdXBwbGllZCByb3V0ZSBieSBuYW1lLgoKICAgIEluc3RhbmNlcyBvZiBg TGlua1ZpZXdgIHdpbGwgbW9zdCBsaWtlbHkgYmUgY3JlYXRlZCB0aHJvdWdo CiAgICB0aGUgYGxpbmstdG9gIEhhbmRsZWJhcnMgaGVscGVyLCBidXQgcHJv cGVydGllcyBvZiB0aGlzIGNsYXNzCiAgICBjYW4gYmUgb3ZlcnJpZGRlbiB0 byBjdXN0b21pemUgYXBwbGljYXRpb24td2lkZSBiZWhhdmlvci4KCiAgICBA Y2xhc3MgTGlua1ZpZXcKICAgIEBuYW1lc3BhY2UgRW1iZXIKICAgIEBleHRl bmRzIEVtYmVyLlZpZXcKICAgIEBzZWUge0hhbmRsZWJhcnMuaGVscGVycy5s aW5rLXRvfQogICoqLwogIHZhciBMaW5rVmlldyA9IEVtYmVyLkxpbmtWaWV3 ID0gRW1iZXIuVmlldy5leHRlbmQoewogICAgdGFnTmFtZTogJ2EnLAogICAg Y3VycmVudFdoZW46IG51bGwsCgogICAgLyoqCiAgICAgIFNldHMgdGhlIGB0 aXRsZWAgYXR0cmlidXRlIG9mIHRoZSBgTGlua1ZpZXdgJ3MgSFRNTCBlbGVt ZW50LgoKICAgICAgQHByb3BlcnR5IHRpdGxlCiAgICAgIEBkZWZhdWx0IG51 bGwKICAgICoqLwogICAgdGl0bGU6IG51bGwsCgogICAgLyoqCiAgICAgIFNl dHMgdGhlIGByZWxgIGF0dHJpYnV0ZSBvZiB0aGUgYExpbmtWaWV3YCdzIEhU TUwgZWxlbWVudC4KCiAgICAgIEBwcm9wZXJ0eSByZWwKICAgICAgQGRlZmF1 bHQgbnVsbAogICAgKiovCiAgICByZWw6IG51bGwsCgogICAgLyoqCiAgICAg IFRoZSBDU1MgY2xhc3MgdG8gYXBwbHkgdG8gYExpbmtWaWV3YCdzIGVsZW1l bnQgd2hlbiBpdHMgYGFjdGl2ZWAKICAgICAgcHJvcGVydHkgaXMgYHRydWVg LgoKICAgICAgQHByb3BlcnR5IGFjdGl2ZUNsYXNzCiAgICAgIEB0eXBlIFN0 cmluZwogICAgICBAZGVmYXVsdCBhY3RpdmUKICAgICoqLwogICAgYWN0aXZl Q2xhc3M6ICdhY3RpdmUnLAoKICAgIC8qKgogICAgICBUaGUgQ1NTIGNsYXNz IHRvIGFwcGx5IHRvIGBMaW5rVmlld2AncyBlbGVtZW50IHdoZW4gaXRzIGBs b2FkaW5nYAogICAgICBwcm9wZXJ0eSBpcyBgdHJ1ZWAuCgogICAgICBAcHJv cGVydHkgbG9hZGluZ0NsYXNzCiAgICAgIEB0eXBlIFN0cmluZwogICAgICBA ZGVmYXVsdCBsb2FkaW5nCiAgICAqKi8KICAgIGxvYWRpbmdDbGFzczogJ2xv YWRpbmcnLAoKICAgIC8qKgogICAgICBUaGUgQ1NTIGNsYXNzIHRvIGFwcGx5 IHRvIGEgYExpbmtWaWV3YCdzIGVsZW1lbnQgd2hlbiBpdHMgYGRpc2FibGVk YAogICAgICBwcm9wZXJ0eSBpcyBgdHJ1ZWAuCgogICAgICBAcHJvcGVydHkg ZGlzYWJsZWRDbGFzcwogICAgICBAdHlwZSBTdHJpbmcKICAgICAgQGRlZmF1 bHQgZGlzYWJsZWQKICAgICoqLwogICAgZGlzYWJsZWRDbGFzczogJ2Rpc2Fi bGVkJywKICAgIF9pc0Rpc2FibGVkOiBmYWxzZSwKCiAgICAvKioKICAgICAg RGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBgTGlua1ZpZXdgIHdpbGwgdHJpZ2dl ciByb3V0aW5nIHZpYQogICAgICB0aGUgYHJlcGxhY2VXaXRoYCByb3V0aW5n IHN0cmF0ZWd5LgoKICAgICAgQHByb3BlcnR5IHJlcGxhY2UKICAgICAgQHR5 cGUgQm9vbGVhbgogICAgICBAZGVmYXVsdCBmYWxzZQogICAgKiovCiAgICBy ZXBsYWNlOiBmYWxzZSwKCiAgICAvKioKICAgICAgQnkgZGVmYXVsdCB0aGUg YHt7bGluay10b319YCBoZWxwZXIgd2lsbCBiaW5kIHRvIHRoZSBgaHJlZmAg YW5kCiAgICAgIGB0aXRsZWAgYXR0cmlidXRlcy4gSXQncyBkaXNjb3VyYWdl IHRoYXQgeW91IG92ZXJyaWRlIHRoZXNlIGRlZmF1bHRzLAogICAgICBob3dl dmVyIHlvdSBjYW4gcHVzaCBvbnRvIHRoZSBhcnJheSBpZiBuZWVkZWQuCgog ICAgICBAcHJvcGVydHkgYXR0cmlidXRlQmluZGluZ3MKICAgICAgQHR5cGUg QXJyYXkgfCBTdHJpbmcKICAgICAgQGRlZmF1bHQgWydocmVmJywgJ3RpdGxl JywgJ3JlbCddCiAgICAgKiovCiAgICBhdHRyaWJ1dGVCaW5kaW5nczogWydo cmVmJywgJ3RpdGxlJywgJ3JlbCddLAoKICAgIC8qKgogICAgICBCeSBkZWZh dWx0IHRoZSBge3tsaW5rLXRvfX1gIGhlbHBlciB3aWxsIGJpbmQgdG8gdGhl IGBhY3RpdmVgLCBgbG9hZGluZ2AsIGFuZAogICAgICBgZGlzYWJsZWRgIGNs YXNzZXMuIEl0IGlzIGRpc2NvdXJhZ2VkIHRvIG92ZXJyaWRlIHRoZXNlIGRp cmVjdGx5LgoKICAgICAgQHByb3BlcnR5IGNsYXNzTmFtZUJpbmRpbmdzCiAg ICAgIEB0eXBlIEFycmF5CiAgICAgIEBkZWZhdWx0IFsnYWN0aXZlJywgJ2xv YWRpbmcnLCAnZGlzYWJsZWQnXQogICAgICoqLwogICAgY2xhc3NOYW1lQmlu ZGluZ3M6IFsnYWN0aXZlJywgJ2xvYWRpbmcnLCAnZGlzYWJsZWQnXSwKCiAg ICAvKioKICAgICAgQnkgZGVmYXVsdCB0aGUgYHt7bGluay10b319YCBoZWxw ZXIgcmVzcG9uZHMgdG8gdGhlIGBjbGlja2AgZXZlbnQuIFlvdQogICAgICBj YW4gb3ZlcnJpZGUgdGhpcyBnbG9iYWxseSBieSBzZXR0aW5nIHRoaXMgcHJv cGVydHkgdG8geW91ciBjdXN0b20KICAgICAgZXZlbnQgbmFtZS4KCiAgICAg IFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBvbiBtb2JpbGUgd2hlbiBv bmUgd2FudHMgdG8gYXZvaWQgdGhlIDMwMG1zCiAgICAgIGNsaWNrIGRlbGF5 IHVzaW5nIHNvbWUgc29ydCBvZiBjdXN0b20gYHRhcGAgZXZlbnQuCgogICAg ICBAcHJvcGVydHkgZXZlbnROYW1lCiAgICAgIEB0eXBlIFN0cmluZwogICAg ICBAZGVmYXVsdCBjbGljawogICAgKi8KICAgIGV2ZW50TmFtZTogJ2NsaWNr JywKCiAgICAvLyB0aGlzIGlzIGRvYydlZCBoZXJlIHNvIGl0IHNob3dzIHVw IGluIHRoZSBldmVudHMKICAgIC8vIHNlY3Rpb24gb2YgdGhlIEFQSSBkb2N1 bWVudGF0aW9uLCB3aGljaCBpcyB3aGVyZQogICAgLy8gcGVvcGxlIHdpbGwg bGlrZWx5IGdvIGxvb2tpbmcgZm9yIGl0LgogICAgLyoqCiAgICAgIFRyaWdn ZXJzIHRoZSBgTGlua1ZpZXdgJ3Mgcm91dGluZyBiZWhhdmlvci4gSWYKICAg ICAgYGV2ZW50TmFtZWAgaXMgY2hhbmdlZCB0byBhIHZhbHVlIG90aGVyIHRo YW4gYGNsaWNrYAogICAgICB0aGUgcm91dGluZyBiZWhhdmlvciB3aWxsIHRy aWdnZXIgb24gdGhhdCBjdXN0b20gZXZlbnQKICAgICAgaW5zdGVhZC4KCiAg ICAgIEBldmVudCBjbGljawogICAgKiovCgogICAgLyoqCiAgICAgIEFuIG92 ZXJyaWRhYmxlIG1ldGhvZCBjYWxsZWQgd2hlbiBMaW5rVmlldyBvYmplY3Rz IGFyZSBpbnN0YW50aWF0ZWQuCgogICAgICBFeGFtcGxlOgoKICAgICAgYGBg amF2YXNjcmlwdAogICAgICBBcHAuTXlMaW5rVmlldyA9IEVtYmVyLkxpbmtW aWV3LmV4dGVuZCh7CiAgICAgICAgaW5pdDogZnVuY3Rpb24oKSB7CiAgICAg ICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgICAgRW1iZXIuTG9nZ2VyLmxv ZygnRXZlbnQgaXMgJyArIHRoaXMuZ2V0KCdldmVudE5hbWUnKSk7CiAgICAg ICAgfQogICAgICB9KTsKICAgICAgYGBgCgogICAgICBOT1RFOiBJZiB5b3Ug ZG8gb3ZlcnJpZGUgYGluaXRgIGZvciBhIGZyYW1ld29yayBjbGFzcyBsaWtl IGBFbWJlci5WaWV3YCBvcgogICAgICBgRW1iZXIuQXJyYXlDb250cm9sbGVy YCwgYmUgc3VyZSB0byBjYWxsIGB0aGlzLl9zdXBlcigpYCBpbiB5b3VyCiAg ICAgIGBpbml0YCBkZWNsYXJhdGlvbiEgSWYgeW91IGRvbid0LCBFbWJlciBt YXkgbm90IGhhdmUgYW4gb3Bwb3J0dW5pdHkgdG8KICAgICAgZG8gaW1wb3J0 YW50IHNldHVwIHdvcmssIGFuZCB5b3UnbGwgc2VlIHN0cmFuZ2UgYmVoYXZp b3IgaW4geW91cgogICAgICBhcHBsaWNhdGlvbi4KCiAgICAgIEBtZXRob2Qg aW5pdAogICAgKi8KICAgIGluaXQ6IGZ1bmN0aW9uKCkgewogICAgICB0aGlz Ll9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwoKICAgICAgLy8gTWFw IGRlc2lyZWQgZXZlbnQgbmFtZSB0byBpbnZva2UgZnVuY3Rpb24KICAgICAg dmFyIGV2ZW50TmFtZSA9IGdldCh0aGlzLCAnZXZlbnROYW1lJyksIGk7CiAg ICAgIHRoaXMub24oZXZlbnROYW1lLCB0aGlzLCB0aGlzLl9pbnZva2UpOwog ICAgfSwKCiAgICAvKioKICAgICAgVGhpcyBtZXRob2QgaXMgaW52b2tlZCBi eSBvYnNlcnZlcnMgaW5zdGFsbGVkIGR1cmluZyBgaW5pdGAgdGhhdCBmaXJl CiAgICAgIHdoZW5ldmVyIHRoZSBwYXJhbXMgY2hhbmdlCgogICAgICBAcHJp dmF0ZQogICAgICBAbWV0aG9kIF9wYXJhbXNDaGFuZ2VkCiAgICAgKi8KICAg IF9wYXJhbXNDaGFuZ2VkOiBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5ub3Rp ZnlQcm9wZXJ0eUNoYW5nZSgncmVzb2x2ZWRQYXJhbXMnKTsKICAgIH0sCgog ICAgLyoqCiAgICAgVGhpcyBpcyBjYWxsZWQgdG8gc2V0dXAgb2JzZXJ2ZXJz IHRoYXQgd2lsbCB0cmlnZ2VyIGEgcmVyZW5kZXIuCgogICAgIEBwcml2YXRl CiAgICAgQG1ldGhvZCBfc2V0dXBQYXRoT2JzZXJ2ZXJzCiAgICAqKi8KICAg IF9zZXR1cFBhdGhPYnNlcnZlcnM6IGZ1bmN0aW9uKCl7CiAgICAgIHZhciBo ZWxwZXJQYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzLAogICAgICAgICAg bGlua1RleHRQYXRoICAgICA9IGhlbHBlclBhcmFtZXRlcnMub3B0aW9ucy5s aW5rVGV4dFBhdGgsCiAgICAgICAgICBwYXRocyA9IGdldFJlc29sdmVkUGF0 aHMoaGVscGVyUGFyYW1ldGVycyksCiAgICAgICAgICBsZW5ndGggPSBwYXRo cy5sZW5ndGgsCiAgICAgICAgICBwYXRoLCBpLCBub3JtYWxpemVkUGF0aDsK CiAgICAgIGlmIChsaW5rVGV4dFBhdGgpIHsKICAgICAgICBub3JtYWxpemVk UGF0aCA9IEVtYmVyLkhhbmRsZWJhcnMubm9ybWFsaXplUGF0aChoZWxwZXJQ YXJhbWV0ZXJzLmNvbnRleHQsIGxpbmtUZXh0UGF0aCwgaGVscGVyUGFyYW1l dGVycy5vcHRpb25zLmRhdGEpOwogICAgICAgIHRoaXMucmVnaXN0ZXJPYnNl cnZlcihub3JtYWxpemVkUGF0aC5yb290LCBub3JtYWxpemVkUGF0aC5wYXRo LCB0aGlzLCB0aGlzLnJlcmVuZGVyKTsKICAgICAgfQoKICAgICAgZm9yKGk9 MDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgcGF0aCA9IHBhdGhzW2ld OwogICAgICAgIGlmIChudWxsID09PSBwYXRoKSB7CiAgICAgICAgICAvLyBB IGxpdGVyYWwgdmFsdWUgd2FzIHByb3ZpZGVkLCBub3QgYSBwYXRoLCBzbyBu b3RoaW5nIHRvIG9ic2VydmUuCiAgICAgICAgICBjb250aW51ZTsKICAgICAg ICB9CgogICAgICAgIG5vcm1hbGl6ZWRQYXRoID0gRW1iZXIuSGFuZGxlYmFy cy5ub3JtYWxpemVQYXRoKGhlbHBlclBhcmFtZXRlcnMuY29udGV4dCwgcGF0 aCwgaGVscGVyUGFyYW1ldGVycy5vcHRpb25zLmRhdGEpOwogICAgICAgIHRo aXMucmVnaXN0ZXJPYnNlcnZlcihub3JtYWxpemVkUGF0aC5yb290LCBub3Jt YWxpemVkUGF0aC5wYXRoLCB0aGlzLCB0aGlzLl9wYXJhbXNDaGFuZ2VkKTsK ICAgICAgfQoKICAgICAgdmFyIHF1ZXJ5UGFyYW1zT2JqZWN0ID0gdGhpcy5x dWVyeVBhcmFtc09iamVjdDsKICAgICAgaWYgKHF1ZXJ5UGFyYW1zT2JqZWN0 KSB7CiAgICAgICAgdmFyIHZhbHVlcyA9IHF1ZXJ5UGFyYW1zT2JqZWN0LnZh bHVlczsKCiAgICAgICAgLy8gSW5zdGFsbCBvYnNlcnZlcnMgZm9yIGFsbCBv ZiB0aGUgaGFzaCBvcHRpb25zCiAgICAgICAgLy8gcHJvdmlkZWQgaW4gdGhl IChxdWVyeS1wYXJhbXMpIHN1YmV4cHJlc3Npb24uCiAgICAgICAgZm9yICh2 YXIgayBpbiB2YWx1ZXMpIHsKICAgICAgICAgIGlmICghdmFsdWVzLmhhc093 blByb3BlcnR5KGspKSB7IGNvbnRpbnVlOyB9CgogICAgICAgICAgaWYgKHF1 ZXJ5UGFyYW1zT2JqZWN0LnR5cGVzW2tdID09PSAnSUQnKSB7CiAgICAgICAg ICAgIG5vcm1hbGl6ZWRQYXRoID0gRW1iZXIuSGFuZGxlYmFycy5ub3JtYWxp emVQYXRoKGhlbHBlclBhcmFtZXRlcnMuY29udGV4dCwgdmFsdWVzW2tdLCBo ZWxwZXJQYXJhbWV0ZXJzLm9wdGlvbnMuZGF0YSk7CiAgICAgICAgICAgIHRo aXMucmVnaXN0ZXJPYnNlcnZlcihub3JtYWxpemVkUGF0aC5yb290LCBub3Jt YWxpemVkUGF0aC5wYXRoLCB0aGlzLCB0aGlzLl9wYXJhbXNDaGFuZ2VkKTsK ICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0sCgogICAgYWZ0 ZXJSZW5kZXI6IGZ1bmN0aW9uKCl7CiAgICAgIHRoaXMuX3N1cGVyLmFwcGx5 KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIHRoaXMuX3NldHVwUGF0aE9ic2Vy dmVycygpOwogICAgfSwKCiAgICAvKioKICAgICAgRXZlbiB0aG91Z2ggdGhp cyBpc24ndCBhIHZpcnR1YWwgdmlldywgd2Ugd2FudCB0byB0cmVhdCBpdCBh cyBpZiBpdCBpcwogICAgICBzbyB0aGF0IHlvdSBjYW4gYWNjZXNzIHRoZSBw YXJlbnQgd2l0aCB7e3ZpZXcucHJvcH19CgogICAgICBAcHJpdmF0ZQogICAg ICBAbWV0aG9kIGNvbmNyZXRlVmlldwogICAgKiovCiAgICBjb25jcmV0ZVZp ZXc6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4g Z2V0KHRoaXMsICdwYXJlbnRWaWV3Jyk7CiAgICB9KS5wcm9wZXJ0eSgncGFy ZW50VmlldycpLAoKICAgIC8qKgoKICAgICAgQWNjZXNzZWQgYXMgYSBjbGFz c25hbWUgYmluZGluZyB0byBhcHBseSB0aGUgYExpbmtWaWV3YCdzIGBkaXNh YmxlZENsYXNzYAogICAgICBDU1MgYGNsYXNzYCB0byB0aGUgZWxlbWVudCB3 aGVuIHRoZSBsaW5rIGlzIGRpc2FibGVkLgoKICAgICAgV2hlbiBgdHJ1ZWAg aW50ZXJhY3Rpb25zIHdpdGggdGhlIGVsZW1lbnQgd2lsbCBub3QgdHJpZ2dl ciByb3V0ZSBjaGFuZ2VzLgogICAgICBAcHJvcGVydHkgZGlzYWJsZWQKICAg ICovCiAgICBkaXNhYmxlZDogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24gY29t cHV0ZUxpbmtWaWV3RGlzYWJsZWQoa2V5LCB2YWx1ZSkgewogICAgICBpZiAo dmFsdWUgIT09IHVuZGVmaW5lZCkgeyB0aGlzLnNldCgnX2lzRGlzYWJsZWQn LCB2YWx1ZSk7IH0KCiAgICAgIHJldHVybiB2YWx1ZSA/IGdldCh0aGlzLCAn ZGlzYWJsZWRDbGFzcycpIDogZmFsc2U7CiAgICB9KSwKCiAgICAvKioKICAg ICAgQWNjZXNzZWQgYXMgYSBjbGFzc25hbWUgYmluZGluZyB0byBhcHBseSB0 aGUgYExpbmtWaWV3YCdzIGBhY3RpdmVDbGFzc2AKICAgICAgQ1NTIGBjbGFz c2AgdG8gdGhlIGVsZW1lbnQgd2hlbiB0aGUgbGluayBpcyBhY3RpdmUuCgog ICAgICBBIGBMaW5rVmlld2AgaXMgY29uc2lkZXJlZCBhY3RpdmUgd2hlbiBp dHMgYGN1cnJlbnRXaGVuYCBwcm9wZXJ0eSBpcyBgdHJ1ZWAKICAgICAgb3Ig dGhlIGFwcGxpY2F0aW9uJ3MgY3VycmVudCByb3V0ZSBpcyB0aGUgcm91dGUg dGhlIGBMaW5rVmlld2Agd291bGQgdHJpZ2dlcgogICAgICB0cmFuc2l0aW9u cyBpbnRvLgoKICAgICAgQHByb3BlcnR5IGFjdGl2ZQogICAgKiovCiAgICBh Y3RpdmU6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uIGNvbXB1dGVMaW5rVmll d0FjdGl2ZSgpIHsKICAgICAgaWYgKGdldCh0aGlzLCAnbG9hZGluZycpKSB7 IHJldHVybiBmYWxzZTsgfQoKICAgICAgdmFyIHJvdXRlciA9IGdldCh0aGlz LCAncm91dGVyJyksCiAgICAgICAgICByb3V0ZUFyZ3MgPSBnZXQodGhpcywg J3JvdXRlQXJncycpLAogICAgICAgICAgY29udGV4dHMgPSByb3V0ZUFyZ3Mu c2xpY2UoMSksCiAgICAgICAgICByZXNvbHZlZFBhcmFtcyA9IGdldCh0aGlz LCAncmVzb2x2ZWRQYXJhbXMnKSwKICAgICAgICAgIGN1cnJlbnRXaGVuID0g dGhpcy5jdXJyZW50V2hlbiB8fCByb3V0ZUFyZ3NbMF07CgogICAgICAvLyBp ZiBvdmVycmlkaW5nIGFjdGl2ZSB3LyBjdXJyZW50V2hlbiB0aGVuIGRvbid0 IGFwcGx5IGNvbnRleHRzIHNpbmNlIHRoZXkgd29uJ3QgbWF0Y2gKICAgICAg aWYgKHRoaXMuY3VycmVudFdoZW4pIHsKICAgICAgICBjb250ZXh0cyA9IFtd OwogICAgICAgIGlmIChFbWJlci5GRUFUVVJFUy5pc0VuYWJsZWQoInF1ZXJ5 LXBhcmFtcy1uZXciKSkgewogICAgICAgICAgY29udGV4dHMucHVzaCh7IHF1 ZXJ5UGFyYW1zOiBnZXQodGhpcywgJ3F1ZXJ5UGFyYW1zJykgfSk7CiAgICAg ICAgfQogICAgICB9CgogICAgICB2YXIgaXNBY3RpdmUgPSByb3V0ZXIuaXNB Y3RpdmUuYXBwbHkocm91dGVyLCBbY3VycmVudFdoZW5dLmNvbmNhdChjb250 ZXh0cykpOwoKICAgICAgaWYgKGlzQWN0aXZlKSB7IHJldHVybiBnZXQodGhp cywgJ2FjdGl2ZUNsYXNzJyk7IH0KICAgIH0pLnByb3BlcnR5KCdyZXNvbHZl ZFBhcmFtcycsICdyb3V0ZUFyZ3MnKSwKCiAgICAvKioKICAgICAgQWNjZXNz ZWQgYXMgYSBjbGFzc25hbWUgYmluZGluZyB0byBhcHBseSB0aGUgYExpbmtW aWV3YCdzIGBsb2FkaW5nQ2xhc3NgCiAgICAgIENTUyBgY2xhc3NgIHRvIHRo ZSBlbGVtZW50IHdoZW4gdGhlIGxpbmsgaXMgbG9hZGluZy4KCiAgICAgIEEg YExpbmtWaWV3YCBpcyBjb25zaWRlcmVkIGxvYWRpbmcgd2hlbiBpdCBoYXMg YXQgbGVhc3Qgb25lCiAgICAgIHBhcmFtZXRlciB3aG9zZSB2YWx1ZSBpcyBj dXJyZW50bHkgbnVsbCBvciB1bmRlZmluZWQuIER1cmluZwogICAgICB0aGlz IHRpbWUsIGNsaWNraW5nIHRoZSBsaW5rIHdpbGwgcGVyZm9ybSBubyB0cmFu c2l0aW9uIGFuZAogICAgICBlbWl0IGEgd2FybmluZyB0aGF0IHRoZSBsaW5r IGlzIHN0aWxsIGluIGEgbG9hZGluZyBzdGF0ZS4KCiAgICAgIEBwcm9wZXJ0 eSBsb2FkaW5nCiAgICAqKi8KICAgIGxvYWRpbmc6IEVtYmVyLmNvbXB1dGVk KGZ1bmN0aW9uIGNvbXB1dGVMaW5rVmlld0xvYWRpbmcoKSB7CiAgICAgIGlm ICghZ2V0KHRoaXMsICdyb3V0ZUFyZ3MnKSkgeyByZXR1cm4gZ2V0KHRoaXMs ICdsb2FkaW5nQ2xhc3MnKTsgfQogICAgfSkucHJvcGVydHkoJ3JvdXRlQXJn cycpLAoKICAgIC8qKgogICAgICBSZXR1cm5zIHRoZSBhcHBsaWNhdGlvbidz IG1haW4gcm91dGVyIGZyb20gdGhlIGNvbnRhaW5lci4KCiAgICAgIEBwcml2 YXRlCiAgICAgIEBwcm9wZXJ0eSByb3V0ZXIKICAgICoqLwogICAgcm91dGVy OiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGdl dCh0aGlzLCAnY29udHJvbGxlcicpLmNvbnRhaW5lci5sb29rdXAoJ3JvdXRl cjptYWluJyk7CiAgICB9KSwKCiAgICAvKioKICAgICAgRXZlbnQgaGFuZGxl ciB0aGF0IGludm9rZXMgdGhlIGxpbmssIGFjdGl2YXRpbmcgdGhlIGFzc29j aWF0ZWQgcm91dGUuCgogICAgICBAcHJpdmF0ZQogICAgICBAbWV0aG9kIF9p bnZva2UKICAgICAgQHBhcmFtIHtFdmVudH0gZXZlbnQKICAgICovCiAgICBf aW52b2tlOiBmdW5jdGlvbihldmVudCkgewogICAgICBpZiAoIWlzU2ltcGxl Q2xpY2soZXZlbnQpKSB7IHJldHVybiB0cnVlOyB9CgogICAgICBpZiAodGhp cy5wcmV2ZW50RGVmYXVsdCAhPT0gZmFsc2UpIHsgZXZlbnQucHJldmVudERl ZmF1bHQoKTsgfQogICAgICBpZiAodGhpcy5idWJibGVzID09PSBmYWxzZSkg eyBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgfQoKICAgICAgaWYgKGdldCh0 aGlzLCAnX2lzRGlzYWJsZWQnKSkgeyByZXR1cm4gZmFsc2U7IH0KCiAgICAg IGlmIChnZXQodGhpcywgJ2xvYWRpbmcnKSkgewogICAgICAgIEVtYmVyLkxv Z2dlci53YXJuKCJUaGlzIGxpbmstdG8gaXMgaW4gYW4gaW5hY3RpdmUgbG9h ZGluZyBzdGF0ZSBiZWNhdXNlIGF0IGxlYXN0IG9uZSBvZiBpdHMgcGFyYW1l dGVycyBwcmVzZW50bHkgaGFzIGEgbnVsbC91bmRlZmluZWQgdmFsdWUsIG9y IHRoZSBwcm92aWRlZCByb3V0ZSBuYW1lIGlzIGludmFsaWQuIik7CiAgICAg ICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICB2YXIgcm91dGVyID0g Z2V0KHRoaXMsICdyb3V0ZXInKSwKICAgICAgICAgIHJvdXRlQXJncyA9IGdl dCh0aGlzLCAncm91dGVBcmdzJyk7CgogICAgICB2YXIgdHJhbnNpdGlvbjsK ICAgICAgaWYgKGdldCh0aGlzLCAncmVwbGFjZScpKSB7CiAgICAgICAgdHJh bnNpdGlvbiA9IHJvdXRlci5yZXBsYWNlV2l0aC5hcHBseShyb3V0ZXIsIHJv dXRlQXJncyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdHJhbnNpdGlvbiA9 IHJvdXRlci50cmFuc2l0aW9uVG8uYXBwbHkocm91dGVyLCByb3V0ZUFyZ3Mp OwogICAgICB9CgogICAgICAvLyBTY2hlZHVsZSBlYWdlciBVUkwgdXBkYXRl LCBidXQgYWZ0ZXIgd2UndmUgZ2l2ZW4gdGhlIHRyYW5zaXRpb24KICAgICAg Ly8gYSBjaGFuY2UgdG8gc3luY2hyb25vdXNseSByZWRpcmVjdC4KICAgICAg CiAgICAgICAgLy8gV2UgbmVlZCB0byBhbHdheXMgZ2VuZXJhdGUgdGhlIFVS TCBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBocmVmIGJlY2F1c2UKICAgICAgICAv LyB0aGUgaHJlZiB3aWxsIGluY2x1ZGUgYW55IHJvb3RVUkwgc2V0LCBidXQg dGhlIHJvdXRlciBleHBlY3RzIGEgVVJMCiAgICAgICAgLy8gd2l0aG91dCBp dCEgTm90ZSB0aGF0IHdlIGRvbid0IHVzZSB0aGUgZmlyc3QgbGV2ZWwgcm91 dGVyIGJlY2F1c2UgaXQKICAgICAgICAvLyBjYWxscyBsb2NhdGlvbi5mb3Jt YXRVUkwoKSwgd2hpY2ggYWxzbyB3b3VsZCBhZGQgdGhlIHJvb3RVUkwhCiAg ICAgICAgdmFyIHVybCA9IHJvdXRlci5yb3V0ZXIuZ2VuZXJhdGUuYXBwbHko cm91dGVyLnJvdXRlciwgZ2V0KHRoaXMsICdyb3V0ZUFyZ3MnKSk7CiAgICAg ICAgRW1iZXIucnVuLnNjaGVkdWxlT25jZSgncm91dGVyVHJhbnNpdGlvbnMn LCB0aGlzLCB0aGlzLl9lYWdlclVwZGF0ZVVybCwgdHJhbnNpdGlvbiwgdXJs KTsKICAgICAgCiAgICB9LAoKICAgIC8qKgogICAgICBAcHJpdmF0ZQogICAg ICovCiAgICBfZWFnZXJVcGRhdGVVcmw6IGZ1bmN0aW9uKHRyYW5zaXRpb24s IGhyZWYpIHsKICAgICAgaWYgKCF0cmFuc2l0aW9uLmlzQWN0aXZlIHx8ICF0 cmFuc2l0aW9uLnVybE1ldGhvZCkgewogICAgICAgIC8vIHRyYW5zaXRpb24g d2FzIGFib3J0ZWQsIGFscmVhZHkgcmFuIHRvIGNvbXBsZXRpb24sCiAgICAg ICAgLy8gb3IgaXQgaGFzIGEgbnVsbCB1cmwtdXBkYXRlZCBtZXRob2QuCiAg ICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBpZiAoaHJlZi5pbmRleE9m KCcjJykgPT09IDApIHsKICAgICAgICBocmVmID0gaHJlZi5zbGljZSgxKTsK ICAgICAgfQoKICAgICAgLy8gUmUtdXNlIHRoZSByb3V0ZXJqcyBob29rcyBz ZXQgdXAgYnkgdGhlIEVtYmVyIHJvdXRlci4KICAgICAgdmFyIHJvdXRlcmpz ID0gZ2V0KHRoaXMsICdyb3V0ZXIucm91dGVyJyk7CiAgICAgIGlmICh0cmFu c2l0aW9uLnVybE1ldGhvZCA9PT0gJ3VwZGF0ZScpIHsKICAgICAgICByb3V0 ZXJqcy51cGRhdGVVUkwoaHJlZik7CiAgICAgIH0gZWxzZSBpZiAodHJhbnNp dGlvbi51cmxNZXRob2QgPT09ICdyZXBsYWNlJykgewogICAgICAgIHJvdXRl cmpzLnJlcGxhY2VVUkwoaHJlZik7CiAgICAgIH0KCiAgICAgIC8vIFByZXZl bnQgbGF0ZXIgdXBkYXRlIHVybCByZWZpcmUuCiAgICAgIHRyYW5zaXRpb24u bWV0aG9kKG51bGwpOwogICAgfSwKCiAgICAvKioKICAgICAgQ29tcHV0ZWQg cHJvcGVydHkgdGhhdCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZQogICAgICBy ZXNvbHZlZCBwYXJhbWV0ZXJzIHBhc3NlZCB0byB0aGUgYGxpbmstdG9gIGhl bHBlciwKICAgICAgZS5nLjoKCiAgICAgIGBgYGhicwogICAgICB7e2xpbmst dG8gYSBiICcxMjMnIGN9fQogICAgICBgYGAKCiAgICAgIHdpbGwgZ2VuZXJh dGUgYSBgcmVzb2x2ZWRQYXJhbXNgIG9mOgoKICAgICAgYGBganMKICAgICAg W2FPYmplY3QsIGJPYmplY3QsICcxMjMnLCBjT2JqZWN0XQogICAgICBgYGAK CiAgICAgIEBwcml2YXRlCiAgICAgIEBwcm9wZXJ0eQogICAgICBAcmV0dXJu IHtBcnJheX0KICAgICAqLwogICAgcmVzb2x2ZWRQYXJhbXM6IEVtYmVyLmNv bXB1dGVkKGZ1bmN0aW9uKCkgewogICAgICB2YXIgcGFyYW1ldGVycyA9IHRo aXMucGFyYW1ldGVycywKICAgICAgICAgIG9wdGlvbnMgPSBwYXJhbWV0ZXJz Lm9wdGlvbnMsCiAgICAgICAgICB0eXBlcyA9IG9wdGlvbnMudHlwZXMsCiAg ICAgICAgICBkYXRhID0gb3B0aW9ucy5kYXRhOwoKICAgICAgaWYgKHBhcmFt ZXRlcnMucGFyYW1zLmxlbmd0aCA9PT0gMCkgewogICAgICAgIHZhciBhcHBD b250cm9sbGVyID0gdGhpcy5jb250YWluZXIubG9va3VwKCdjb250cm9sbGVy OmFwcGxpY2F0aW9uJyk7CiAgICAgICAgcmV0dXJuIFtnZXQoYXBwQ29udHJv bGxlciwgJ2N1cnJlbnRSb3V0ZU5hbWUnKV07CiAgICAgIH0gZWxzZSB7CiAg ICAgICAgcmV0dXJuIHJlc29sdmVQYXJhbXMocGFyYW1ldGVycy5jb250ZXh0 LCBwYXJhbWV0ZXJzLnBhcmFtcywgeyB0eXBlczogdHlwZXMsIGRhdGE6IGRh dGEgfSk7CiAgICAgIH0KCiAgICAgIC8vIE9yaWdpbmFsIGltcGxlbWVudGF0 aW9uIGlmIHF1ZXJ5IHBhcmFtcyBub3QgZW5hYmxlZAogICAgICByZXR1cm4g cmVzb2x2ZVBhcmFtcyhwYXJhbWV0ZXJzLmNvbnRleHQsIHBhcmFtZXRlcnMu cGFyYW1zLCB7IHR5cGVzOiB0eXBlcywgZGF0YTogZGF0YSB9KTsKICAgIH0p LnByb3BlcnR5KCdyb3V0ZXIudXJsJyksCgogICAgLyoqCiAgICAgIENvbXB1 dGVkIHByb3BlcnR5IHRoYXQgcmV0dXJucyB0aGUgY3VycmVudCByb3V0ZSBu YW1lIGFuZAogICAgICBhbnkgZHluYW1pYyBzZWdtZW50cy4KCiAgICAgIEBw cml2YXRlCiAgICAgIEBwcm9wZXJ0eQogICAgICBAcmV0dXJuIHtBcnJheX0g QW4gYXJyYXkgd2l0aCB0aGUgcm91dGUgbmFtZSBhbmQgYW55IGR5bmFtaWMg c2VnbWVudHMKICAgICAqLwogICAgcm91dGVBcmdzOiBFbWJlci5jb21wdXRl ZChmdW5jdGlvbiBjb21wdXRlTGlua1ZpZXdSb3V0ZUFyZ3MoKSB7CiAgICAg IHZhciByZXNvbHZlZFBhcmFtcyA9IGdldCh0aGlzLCAncmVzb2x2ZWRQYXJh bXMnKS5zbGljZSgwKSwKICAgICAgICAgIHJvdXRlciA9IGdldCh0aGlzLCAn cm91dGVyJyksCiAgICAgICAgICBuYW1lZFJvdXRlID0gcmVzb2x2ZWRQYXJh bXNbMF07CgogICAgICBpZiAoIW5hbWVkUm91dGUpIHsgcmV0dXJuOyB9Cgog ICAgICBFbWJlci5hc3NlcnQoZm10KCJUaGUgYXR0ZW1wdCB0byBsaW5rLXRv IHJvdXRlICclQCcgZmFpbGVkLiAiICsKICAgICAgICAgICAgICAgICAgICAg ICAiVGhlIHJvdXRlciBkaWQgbm90IGZpbmQgJyVAJyBpbiBpdHMgcG9zc2li bGUgcm91dGVzOiAnJUAnIiwKICAgICAgICAgICAgICAgICAgICAgICBbbmFt ZWRSb3V0ZSwgbmFtZWRSb3V0ZSwgRW1iZXIua2V5cyhyb3V0ZXIucm91dGVy LnJlY29nbml6ZXIubmFtZXMpLmpvaW4oIicsICciKV0pLAogICAgICAgICAg ICAgICAgICAgICAgIHJvdXRlci5oYXNSb3V0ZShuYW1lZFJvdXRlKSk7Cgog ICAgICAvL25vcm1hbGl6ZSByb3V0ZSBuYW1lCiAgICAgIHZhciBoYW5kbGVy cyA9IHJvdXRlci5yb3V0ZXIucmVjb2duaXplci5oYW5kbGVyc0ZvcihuYW1l ZFJvdXRlKTsKICAgICAgdmFyIG5vcm1hbGl6ZWRQYXRoID0gaGFuZGxlcnNb aGFuZGxlcnMubGVuZ3RoIC0gMV0uaGFuZGxlcjsKICAgICAgaWYgKG5hbWVk Um91dGUgIT09IG5vcm1hbGl6ZWRQYXRoKSB7CiAgICAgICAgdGhpcy5zZXQo J2N1cnJlbnRXaGVuJywgbmFtZWRSb3V0ZSk7CiAgICAgICAgbmFtZWRSb3V0 ZSA9IGhhbmRsZXJzW2hhbmRsZXJzLmxlbmd0aCAtIDFdLmhhbmRsZXI7CiAg ICAgICAgcmVzb2x2ZWRQYXJhbXNbMF0gPSBuYW1lZFJvdXRlOwogICAgICB9 CgogICAgICBmb3IgKHZhciBpID0gMSwgbGVuID0gcmVzb2x2ZWRQYXJhbXMu bGVuZ3RoOyBpIDwgbGVuOyArK2kpIHsKICAgICAgICB2YXIgcGFyYW0gPSBy ZXNvbHZlZFBhcmFtc1tpXTsKICAgICAgICBpZiAocGFyYW0gPT09IG51bGwg fHwgdHlwZW9mIHBhcmFtID09PSAndW5kZWZpbmVkJykgewogICAgICAgICAg Ly8gSWYgY29udGV4dHMgYXJlbid0IHByZXNlbnQsIGNvbnNpZGVyIHRoZSBs aW5rVmlldyB1bmxvYWRlZC4KICAgICAgICAgIHJldHVybjsKICAgICAgICB9 CiAgICAgIH0KCiAgICAgIGlmIChFbWJlci5GRUFUVVJFUy5pc0VuYWJsZWQo InF1ZXJ5LXBhcmFtcy1uZXciKSkgewogICAgICAgIHJlc29sdmVkUGFyYW1z LnB1c2goeyBxdWVyeVBhcmFtczogZ2V0KHRoaXMsICdxdWVyeVBhcmFtcycp IH0pOwogICAgICB9CgogICAgICByZXR1cm4gcmVzb2x2ZWRQYXJhbXM7CiAg ICB9KS5wcm9wZXJ0eSgncmVzb2x2ZWRQYXJhbXMnLCAncXVlcnlQYXJhbXMn KSwKCiAgICBxdWVyeVBhcmFtc09iamVjdDogbnVsbCwKICAgIHF1ZXJ5UGFy YW1zOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbiBjb21wdXRlTGlua1ZpZXdR dWVyeVBhcmFtcygpIHsKCiAgICAgIHZhciBxdWVyeVBhcmFtc09iamVjdCA9 IGdldCh0aGlzLCAncXVlcnlQYXJhbXNPYmplY3QnKSwKICAgICAgICAgIHN1 cHBsaWVkUGFyYW1zID0ge307CgogICAgICBpZiAocXVlcnlQYXJhbXNPYmpl Y3QpIHsKICAgICAgICBFbWJlci5tZXJnZShzdXBwbGllZFBhcmFtcywgcXVl cnlQYXJhbXNPYmplY3QudmFsdWVzKTsKICAgICAgfQoKICAgICAgdmFyIHJl c29sdmVkUGFyYW1zID0gZ2V0KHRoaXMsICdyZXNvbHZlZFBhcmFtcycpLAog ICAgICAgICAgcm91dGVyID0gZ2V0KHRoaXMsICdyb3V0ZXInKSwKICAgICAg ICAgIHJvdXRlTmFtZSA9IHJlc29sdmVkUGFyYW1zWzBdLAogICAgICAgICAg cGFyYW1zRm9yUm91dGUgPSByb3V0ZXIuX3F1ZXJ5UGFyYW1OYW1lc0Zvcihy b3V0ZU5hbWUpLAogICAgICAgICAgcXVlcnlQYXJhbXMgPSBwYXJhbXNGb3JS b3V0ZS5xdWVyeVBhcmFtcywKICAgICAgICAgIHRyYW5zbGF0aW9ucyA9IHBh cmFtc0ZvclJvdXRlLnRyYW5zbGF0aW9ucywKICAgICAgICAgIHBhcmFtc0Zv clJlY29nbml6ZXIgPSB7fTsKCiAgICAgIC8vIE5vcm1hbGl6ZSBzdXBwbGll ZCBwYXJhbXMgaW50byB0aGVpciBsb25nLWZvcm0gbmFtZQogICAgICAvLyBl LmcuICdmb28nIC0+ICdjb250cm9sbGVybmFtZTpmb28nCiAgICAgIHRyYW5z bGF0ZVF1ZXJ5UGFyYW1zKHN1cHBsaWVkUGFyYW1zLCB0cmFuc2xhdGlvbnMs IHJvdXRlTmFtZSk7CgogICAgICB2YXIgaGVscGVyUGFyYW1ldGVycyA9IHRo aXMucGFyYW1ldGVyczsKICAgICAgcm91dGVyLl9xdWVyeVBhcmFtT3ZlcnJp ZGVzKHBhcmFtc0ZvclJlY29nbml6ZXIsIHF1ZXJ5UGFyYW1zLCBmdW5jdGlv bihuYW1lLCByZXN1bHRzTmFtZSkgewogICAgICAgIGlmICghKG5hbWUgaW4g c3VwcGxpZWRQYXJhbXMpKSB7IHJldHVybjsgfQoKICAgICAgICB2YXIgcGFy dHMgPSBuYW1lLnNwbGl0KCc6Jyk7CgogICAgICAgIHZhciB0eXBlID0gcXVl cnlQYXJhbXNPYmplY3QudHlwZXNbcGFydHNbMV1dOwoKICAgICAgICB2YXIg dmFsdWU7CiAgICAgICAgaWYgKHR5cGUgPT09ICdJRCcpIHsKICAgICAgICAg IHZhciBub3JtYWxpemVkUGF0aCA9IEVtYmVyLkhhbmRsZWJhcnMubm9ybWFs aXplUGF0aChoZWxwZXJQYXJhbWV0ZXJzLmNvbnRleHQsIHN1cHBsaWVkUGFy YW1zW25hbWVdLCBoZWxwZXJQYXJhbWV0ZXJzLm9wdGlvbnMuZGF0YSk7CiAg ICAgICAgICB2YWx1ZSA9IEVtYmVyLkhhbmRsZWJhcnMuZ2V0KG5vcm1hbGl6 ZWRQYXRoLnJvb3QsIG5vcm1hbGl6ZWRQYXRoLnBhdGgsIGhlbHBlclBhcmFt ZXRlcnMub3B0aW9ucyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZh bHVlID0gc3VwcGxpZWRQYXJhbXNbbmFtZV07CiAgICAgICAgfQoKICAgICAg ICBkZWxldGUgc3VwcGxpZWRQYXJhbXNbbmFtZV07CgogICAgICAgIHBhcmFt c0ZvclJlY29nbml6ZXJbcmVzdWx0c05hbWVdID0gdmFsdWU7CiAgICAgIH0p OwoKICAgICAgcmV0dXJuIHBhcmFtc0ZvclJlY29nbml6ZXI7CiAgICB9KS5w cm9wZXJ0eSgncmVzb2x2ZWRQYXJhbXMuW10nKSwKCiAgICAvKioKICAgICAg U2V0cyB0aGUgZWxlbWVudCdzIGBocmVmYCBhdHRyaWJ1dGUgdG8gdGhlIHVy bCBmb3IKICAgICAgdGhlIGBMaW5rVmlld2AncyB0YXJnZXRlZCByb3V0ZS4K CiAgICAgIElmIHRoZSBgTGlua1ZpZXdgJ3MgYHRhZ05hbWVgIGlzIGNoYW5n ZWQgdG8gYSB2YWx1ZSBvdGhlcgogICAgICB0aGFuIGBhYCwgdGhpcyBwcm9w ZXJ0eSB3aWxsIGJlIGlnbm9yZWQuCgogICAgICBAcHJvcGVydHkgaHJlZgog ICAgKiovCiAgICBocmVmOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbiBjb21w dXRlTGlua1ZpZXdIcmVmKCkgewogICAgICBpZiAoZ2V0KHRoaXMsICd0YWdO YW1lJykgIT09ICdhJykgeyByZXR1cm47IH0KCiAgICAgIHZhciByb3V0ZXIg PSBnZXQodGhpcywgJ3JvdXRlcicpLAogICAgICAgICAgcm91dGVBcmdzID0g Z2V0KHRoaXMsICdyb3V0ZUFyZ3MnKTsKCiAgICAgIHJldHVybiByb3V0ZUFy Z3MgPyByb3V0ZXIuZ2VuZXJhdGUuYXBwbHkocm91dGVyLCByb3V0ZUFyZ3Mp IDogZ2V0KHRoaXMsICdsb2FkaW5nSHJlZicpOwogICAgfSkucHJvcGVydHko J3JvdXRlQXJncycpLAoKICAgIC8qKgogICAgICBUaGUgZGVmYXVsdCBocmVm IHZhbHVlIHRvIHVzZSB3aGlsZSBhIGxpbmstdG8gaXMgbG9hZGluZy4KICAg ICAgT25seSBhcHBsaWVzIHdoZW4gdGFnTmFtZSBpcyAnYScKCiAgICAgIEBw cm9wZXJ0eSBsb2FkaW5nSHJlZgogICAgICBAdHlwZSBTdHJpbmcKICAgICAg QGRlZmF1bHQgIwogICAgKi8KICAgIGxvYWRpbmdIcmVmOiAnIycKICB9KTsK CiAgTGlua1ZpZXcudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuICJM aW5rVmlldyI7IH07CgogIC8qKgogICAgVGhlIGB7e2xpbmstdG99fWAgaGVs cGVyIHJlbmRlcnMgYSBsaW5rIHRvIHRoZSBzdXBwbGllZAogICAgYHJvdXRl TmFtZWAgcGFzc2luZyBhbiBvcHRpb25hbGx5IHN1cHBsaWVkIG1vZGVsIHRv IHRoZQogICAgcm91dGUgYXMgaXRzIGBtb2RlbGAgY29udGV4dCBvZiB0aGUg cm91dGUuIFRoZSBibG9jawogICAgZm9yIGB7e2xpbmstdG99fWAgYmVjb21l cyB0aGUgaW5uZXJIVE1MIG9mIHRoZSByZW5kZXJlZAogICAgZWxlbWVudDoK CiAgICBgYGBoYW5kbGViYXJzCiAgICB7eyNsaW5rLXRvICdwaG90b0dhbGxl cnknfX0KICAgICAgR3JlYXQgSGFtc3RlciBQaG90b3MKICAgIHt7L2xpbmst dG99fQogICAgYGBgCgogICAgYGBgaHRtbAogICAgPGEgaHJlZj0iL2hhbXN0 ZXItcGhvdG9zIj4KICAgICAgR3JlYXQgSGFtc3RlciBQaG90b3MKICAgIDwv YT4KICAgIGBgYAoKICAgICMjIyBTdXBwbHlpbmcgYSB0YWdOYW1lCiAgICBC eSBkZWZhdWx0IGB7e2xpbmstdG99fWAgcmVuZGVycyBhbiBgPGE+YCBlbGVt ZW50LiBUaGlzIGNhbgogICAgYmUgb3ZlcnJpZGRlbiBmb3IgYSBzaW5nbGUg dXNlIG9mIGB7e2xpbmstdG99fWAgYnkgc3VwcGx5aW5nCiAgICBhIGB0YWdO YW1lYCBvcHRpb246CgogICAgYGBgaGFuZGxlYmFycwogICAge3sjbGluay10 byAncGhvdG9HYWxsZXJ5JyB0YWdOYW1lPSJsaSJ9fQogICAgICBHcmVhdCBI YW1zdGVyIFBob3RvcwogICAge3svbGluay10b319CiAgICBgYGAKCiAgICBg YGBodG1sCiAgICA8bGk+CiAgICAgIEdyZWF0IEhhbXN0ZXIgUGhvdG9zCiAg ICA8L2xpPgogICAgYGBgCgogICAgVG8gb3ZlcnJpZGUgdGhpcyBvcHRpb24g Zm9yIHlvdXIgZW50aXJlIGFwcGxpY2F0aW9uLCBzZWUKICAgICJPdmVycmlk aW5nIEFwcGxpY2F0aW9uLXdpZGUgRGVmYXVsdHMiLgoKICAgICMjIyBEaXNh YmxpbmcgdGhlIGBsaW5rLXRvYCBoZWxwZXIKICAgIEJ5IGRlZmF1bHQgYHt7 bGluay10b319YCBpcyBlbmFibGVkLgogICAgYW55IHBhc3NlZCB2YWx1ZSB0 byBgZGlzYWJsZWRgIGhlbHBlciBwcm9wZXJ0eSB3aWxsIGRpc2FibGUgdGhl IGBsaW5rLXRvYCBoZWxwZXIuCgogICAgc3RhdGljIHVzZTogdGhlIGBkaXNh YmxlZGAgb3B0aW9uOgoKICAgIGBgYGhhbmRsZWJhcnMKICAgIHt7I2xpbmst dG8gJ3Bob3RvR2FsbGVyeScgZGlzYWJsZWQ9dHJ1ZX19CiAgICAgIEdyZWF0 IEhhbXN0ZXIgUGhvdG9zCiAgICB7ey9saW5rLXRvfX0KICAgIGBgYAoKICAg IGR5bmFtaWMgdXNlOiB0aGUgYGRpc2FibGVkV2hlbmAgb3B0aW9uOgoKICAg IGBgYGhhbmRsZWJhcnMKICAgIHt7I2xpbmstdG8gJ3Bob3RvR2FsbGVyeScg ZGlzYWJsZWRXaGVuPWNvbnRyb2xsZXIuc29tZVByb3BlcnR5fX0KICAgICAg R3JlYXQgSGFtc3RlciBQaG90b3MKICAgIHt7L2xpbmstdG99fQogICAgYGBg CgogICAgYW55IHBhc3NlZCB2YWx1ZSB0byBgZGlzYWJsZWRgIHdpbGwgZGlz YWJsZSBpdCBleGNlcHQgYHVuZGVmaW5lZGAuCiAgICB0byBlbnN1cmUgdGhh dCBvbmx5IGB0cnVlYCBkaXNhYmxlIHRoZSBgbGluay10b2AgaGVscGVyIHlv dSBjYW4KICAgIG92ZXJyaWRlIHRoZSBnbG9iYWwgYmVoYXZpb3VyIG9mIGBF bWJlci5MaW5rVmlld2AuCgogICAgYGBgamF2YXNjcmlwdAogICAgRW1iZXIu TGlua1ZpZXcucmVvcGVuKHsKICAgICAgZGlzYWJsZWQ6IEVtYmVyLmNvbXB1 dGVkKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICBpZiAodmFsdWUg IT09IHVuZGVmaW5lZCkgewogICAgICAgICAgdGhpcy5zZXQoJ19pc0Rpc2Fi bGVkJywgdmFsdWUgPT09IHRydWUpOwogICAgICAgIH0KICAgICAgICByZXR1 cm4gdmFsdWUgPT09IHRydWUgPyBnZXQodGhpcywgJ2Rpc2FibGVkQ2xhc3Mn KSA6IGZhbHNlOwogICAgICB9KQogICAgfSk7CiAgICBgYGAKCiAgICBzZWUg Ik92ZXJyaWRpbmcgQXBwbGljYXRpb24td2lkZSBEZWZhdWx0cyIgZm9yIG1v cmUuCgogICAgIyMjIEhhbmRsaW5nIGBocmVmYAogICAgYHt7bGluay10b319 YCB3aWxsIHVzZSB5b3VyIGFwcGxpY2F0aW9uJ3MgUm91dGVyIHRvCiAgICBm aWxsIHRoZSBlbGVtZW50J3MgYGhyZWZgIHByb3BlcnR5IHdpdGggYSB1cmwg dGhhdAogICAgbWF0Y2hlcyB0aGUgcGF0aCB0byB0aGUgc3VwcGxpZWQgYHJv dXRlTmFtZWAgZm9yIHlvdXIKICAgIHJvdXRlcnMncyBjb25maWd1cmVkIGBM b2NhdGlvbmAgc2NoZW1lLCB3aGljaCBkZWZhdWx0cwogICAgdG8gRW1iZXIu SGFzaExvY2F0aW9uLgoKICAgICMjIyBIYW5kbGluZyBjdXJyZW50IHJvdXRl CiAgICBge3tsaW5rLXRvfX1gIHdpbGwgYXBwbHkgYSBDU1MgY2xhc3MgbmFt ZSBvZiAnYWN0aXZlJwogICAgd2hlbiB0aGUgYXBwbGljYXRpb24ncyBjdXJy ZW50IHJvdXRlIG1hdGNoZXMKICAgIHRoZSBzdXBwbGllZCByb3V0ZU5hbWUu IEZvciBleGFtcGxlLCBpZiB0aGUgYXBwbGljYXRpb24ncwogICAgY3VycmVu dCByb3V0ZSBpcyAncGhvdG9HYWxsZXJ5LnJlY2VudCcgdGhlIGZvbGxvd2lu ZwogICAgdXNlIG9mIGB7e2xpbmstdG99fWA6CgogICAgYGBgaGFuZGxlYmFy cwogICAge3sjbGluay10byAncGhvdG9HYWxsZXJ5LnJlY2VudCd9fQogICAg ICBHcmVhdCBIYW1zdGVyIFBob3RvcyBmcm9tIHRoZSBsYXN0IHdlZWsKICAg IHt7L2xpbmstdG99fQogICAgYGBgCgogICAgd2lsbCByZXN1bHQgaW4KCiAg ICBgYGBodG1sCiAgICA8YSBocmVmPSIvaGFtc3Rlci1waG90b3MvdGhpcy13 ZWVrIiBjbGFzcz0iYWN0aXZlIj4KICAgICAgR3JlYXQgSGFtc3RlciBQaG90 b3MKICAgIDwvYT4KICAgIGBgYAoKICAgIFRoZSBDU1MgY2xhc3MgbmFtZSB1 c2VkIGZvciBhY3RpdmUgY2xhc3NlcyBjYW4gYmUgY3VzdG9taXplZAogICAg Zm9yIGEgc2luZ2xlIHVzZSBvZiBge3tsaW5rLXRvfX1gIGJ5IHBhc3Npbmcg YW4gYGFjdGl2ZUNsYXNzYAogICAgb3B0aW9uOgoKICAgIGBgYGhhbmRsZWJh cnMKICAgIHt7I2xpbmstdG8gJ3Bob3RvR2FsbGVyeS5yZWNlbnQnIGFjdGl2 ZUNsYXNzPSJjdXJyZW50LXVybCJ9fQogICAgICBHcmVhdCBIYW1zdGVyIFBo b3RvcyBmcm9tIHRoZSBsYXN0IHdlZWsKICAgIHt7L2xpbmstdG99fQogICAg YGBgCgogICAgYGBgaHRtbAogICAgPGEgaHJlZj0iL2hhbXN0ZXItcGhvdG9z L3RoaXMtd2VlayIgY2xhc3M9ImN1cnJlbnQtdXJsIj4KICAgICAgR3JlYXQg SGFtc3RlciBQaG90b3MKICAgIDwvYT4KICAgIGBgYAoKICAgIFRvIG92ZXJy aWRlIHRoaXMgb3B0aW9uIGZvciB5b3VyIGVudGlyZSBhcHBsaWNhdGlvbiwg c2VlCiAgICAiT3ZlcnJpZGluZyBBcHBsaWNhdGlvbi13aWRlIERlZmF1bHRz Ii4KCiAgICAjIyMgU3VwcGx5aW5nIGEgbW9kZWwKICAgIEFuIG9wdGlvbmFs IG1vZGVsIGFyZ3VtZW50IGNhbiBiZSB1c2VkIGZvciByb3V0ZXMgd2hvc2UK ICAgIHBhdGhzIGNvbnRhaW4gZHluYW1pYyBzZWdtZW50cy4gVGhpcyBhcmd1 bWVudCB3aWxsIGJlY29tZQogICAgdGhlIG1vZGVsIGNvbnRleHQgb2YgdGhl IGxpbmtlZCByb3V0ZToKCiAgICBgYGBqYXZhc2NyaXB0CiAgICBBcHAuUm91 dGVyLm1hcChmdW5jdGlvbigpIHsKICAgICAgdGhpcy5yZXNvdXJjZSgicGhv dG9HYWxsZXJ5Iiwge3BhdGg6ICJoYW1zdGVyLXBob3Rvcy86cGhvdG9faWQi fSk7CiAgICB9KTsKICAgIGBgYAoKICAgIGBgYGhhbmRsZWJhcnMKICAgIHt7 I2xpbmstdG8gJ3Bob3RvR2FsbGVyeScgYVBob3RvfX0KICAgICAge3thUGhv dG8udGl0bGV9fQogICAge3svbGluay10b319CiAgICBgYGAKCiAgICBgYGBo dG1sCiAgICA8YSBocmVmPSIvaGFtc3Rlci1waG90b3MvNDIiPgogICAgICBU b21zdGVyCiAgICA8L2E+CiAgICBgYGAKCiAgICAjIyMgU3VwcGx5aW5nIG11 bHRpcGxlIG1vZGVscwogICAgRm9yIGRlZXAtbGlua2luZyB0byByb3V0ZSBw YXRocyB0aGF0IGNvbnRhaW4gbXVsdGlwbGUKICAgIGR5bmFtaWMgc2VnbWVu dHMsIG11bHRpcGxlIG1vZGVsIGFyZ3VtZW50cyBjYW4gYmUgdXNlZC4KICAg IEFzIHRoZSByb3V0ZXIgdHJhbnNpdGlvbnMgdGhyb3VnaCB0aGUgcm91dGUg cGF0aCwgZWFjaAogICAgc3VwcGxpZWQgbW9kZWwgYXJndW1lbnQgd2lsbCBi ZWNvbWUgdGhlIGNvbnRleHQgZm9yIHRoZQogICAgcm91dGUgd2l0aCB0aGUg ZHluYW1pYyBzZWdtZW50czoKCiAgICBgYGBqYXZhc2NyaXB0CiAgICBBcHAu Um91dGVyLm1hcChmdW5jdGlvbigpIHsKICAgICAgdGhpcy5yZXNvdXJjZSgi cGhvdG9HYWxsZXJ5Iiwge3BhdGg6ICJoYW1zdGVyLXBob3Rvcy86cGhvdG9f aWQifSwgZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5yb3V0ZSgiY29tbWVu dCIsIHtwYXRoOiAiY29tbWVudHMvOmNvbW1lbnRfaWQifSk7CiAgICAgIH0p OwogICAgfSk7CiAgICBgYGAKICAgIFRoaXMgYXJndW1lbnQgd2lsbCBiZWNv bWUgdGhlIG1vZGVsIGNvbnRleHQgb2YgdGhlIGxpbmtlZCByb3V0ZToKCiAg ICBgYGBoYW5kbGViYXJzCiAgICB7eyNsaW5rLXRvICdwaG90b0dhbGxlcnku Y29tbWVudCcgYVBob3RvIGNvbW1lbnR9fQogICAgICB7e2NvbW1lbnQuYm9k eX19CiAgICB7ey9saW5rLXRvfX0KICAgIGBgYAoKICAgIGBgYGh0bWwKICAg IDxhIGhyZWY9Ii9oYW1zdGVyLXBob3Rvcy80Mi9jb21tZW50LzcxOCI+CiAg ICAgIEErKysgd291bGQgc251Z2dsZSBhZ2Fpbi4KICAgIDwvYT4KICAgIGBg YAoKICAgICMjIyBTdXBwbHlpbmcgYW4gZXhwbGljaXQgZHluYW1pYyBzZWdt ZW50IHZhbHVlCiAgICBJZiB5b3UgZG9uJ3QgaGF2ZSBhIG1vZGVsIG9iamVj dCBhdmFpbGFibGUgdG8gcGFzcyB0byBge3tsaW5rLXRvfX1gLAogICAgYW4g b3B0aW9uYWwgc3RyaW5nIG9yIGludGVnZXIgYXJndW1lbnQgY2FuIGJlIHBh c3NlZCBmb3Igcm91dGVzIHdob3NlCiAgICBwYXRocyBjb250YWluIGR5bmFt aWMgc2VnbWVudHMuIFRoaXMgYXJndW1lbnQgd2lsbCBiZWNvbWUgdGhlIHZh bHVlCiAgICBvZiB0aGUgZHluYW1pYyBzZWdtZW50OgoKICAgIGBgYGphdmFz Y3JpcHQKICAgIEFwcC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkgewogICAgICB0 aGlzLnJlc291cmNlKCJwaG90b0dhbGxlcnkiLCB7cGF0aDogImhhbXN0ZXIt cGhvdG9zLzpwaG90b19pZCJ9KTsKICAgIH0pOwogICAgYGBgCgogICAgYGBg aGFuZGxlYmFycwogICAge3sjbGluay10byAncGhvdG9HYWxsZXJ5JyBhUGhv dG9JZH19CiAgICAgIHt7YVBob3RvLnRpdGxlfX0KICAgIHt7L2xpbmstdG99 fQogICAgYGBgCgogICAgYGBgaHRtbAogICAgPGEgaHJlZj0iL2hhbXN0ZXIt cGhvdG9zLzQyIj4KICAgICAgVG9tc3RlcgogICAgPC9hPgogICAgYGBgCgog ICAgV2hlbiB0cmFuc2l0aW9uaW5nIGludG8gdGhlIGxpbmtlZCByb3V0ZSwg dGhlIGBtb2RlbGAgaG9vayB3aWxsCiAgICBiZSB0cmlnZ2VyZWQgd2l0aCBw YXJhbWV0ZXJzIGluY2x1ZGluZyB0aGlzIHBhc3NlZCBpZGVudGlmaWVyLgoK ICAgICMjIyBBbGxvd2luZyBEZWZhdWx0IEFjdGlvbgoKICAgQnkgZGVmYXVs dCB0aGUgYHt7bGluay10b319YCBoZWxwZXIgcHJldmVudHMgdGhlIGRlZmF1 bHQgYnJvd3NlciBhY3Rpb24KICAgYnkgY2FsbGluZyBgcHJldmVudERlZmF1 bHQoKWAgYXMgdGhpcyBzb3J0IG9mIGFjdGlvbiBidWJibGluZyBpcyBub3Jt YWxseQogICBoYW5kbGVkIGludGVybmFsbHkgYW5kIHdlIGRvIG5vdCB3YW50 IHRvIHRha2UgdGhlIGJyb3dzZXIgdG8gYSBuZXcgVVJMIChmb3IKICAgZXhh bXBsZSkuCgogICBJZiB5b3UgbmVlZCB0byBvdmVycmlkZSB0aGlzIGJlaGF2 aW9yIHNwZWNpZnkgYHByZXZlbnREZWZhdWx0PWZhbHNlYCBpbgogICB5b3Vy IHRlbXBsYXRlOgoKICAgIGBgYGhhbmRsZWJhcnMKICAgIHt7I2xpbmstdG8g J3Bob3RvR2FsbGVyeScgYVBob3RvSWQgcHJldmVudERlZmF1bHQ9ZmFsc2V9 fQogICAgICB7e2FQaG90b0lkLnRpdGxlfX0KICAgIHt7L2xpbmstdG99fQog ICAgYGBgCgogICAgIyMjIE92ZXJyaWRpbmcgYXR0cmlidXRlcwogICAgWW91 IGNhbiBvdmVycmlkZSBhbnkgZ2l2ZW4gcHJvcGVydHkgb2YgdGhlIEVtYmVy LkxpbmtWaWV3CiAgICB0aGF0IGlzIGdlbmVyYXRlZCBieSB0aGUgYHt7bGlu ay10b319YCBoZWxwZXIgYnkgcGFzc2luZwogICAga2V5L3ZhbHVlIHBhaXJz LCBsaWtlIHNvOgoKICAgIGBgYGhhbmRsZWJhcnMKICAgIHt7I2xpbmstdG8g IGFQaG90byB0YWdOYW1lPSdsaScgdGl0bGU9J0ZvbGxvd2luZyB0aGlzIGxp bmsgd2lsbCBjaGFuZ2UgeW91ciBsaWZlJyBjbGFzc05hbWVzPSdwaWMgc3dl ZXQnfX0KICAgICAgVWgtbWF6aW5nIQogICAge3svbGluay10b319CiAgICBg YGAKCiAgICBTZWUgW0VtYmVyLkxpbmtWaWV3XSgvYXBpL2NsYXNzZXMvRW1i ZXIuTGlua1ZpZXcuaHRtbCkgZm9yIGEKICAgIGNvbXBsZXRlIGxpc3Qgb2Yg b3ZlcnJpZGVhYmxlIHByb3BlcnRpZXMuIEJlIHN1cmUgdG8gYWxzbwogICAg Y2hlY2sgb3V0IGluaGVyaXRlZCBwcm9wZXJ0aWVzIG9mIGBMaW5rVmlld2Au CgogICAgIyMjIE92ZXJyaWRpbmcgQXBwbGljYXRpb24td2lkZSBEZWZhdWx0 cwogICAgYGB7e2xpbmstdG99fWBgIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2Yg RW1iZXIuTGlua1ZpZXcKICAgIGZvciByZW5kZXJpbmcuIFRvIG92ZXJyaWRl IG9wdGlvbnMgZm9yIHlvdXIgZW50aXJlCiAgICBhcHBsaWNhdGlvbiwgcmVv cGVuIEVtYmVyLkxpbmtWaWV3IGFuZCBzdXBwbHkgdGhlCiAgICBkZXNpcmVk IHZhbHVlczoKCiAgICBgYGAgamF2YXNjcmlwdAogICAgRW1iZXIuTGlua1Zp ZXcucmVvcGVuKHsKICAgICAgYWN0aXZlQ2xhc3M6ICJpcy1hY3RpdmUiLAog ICAgICB0YWdOYW1lOiAnbGknCiAgICB9KQogICAgYGBgCgogICAgSXQgaXMg YWxzbyBwb3NzaWJsZSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBldmVudCBp bgogICAgdGhpcyBtYW5uZXI6CgogICAgYGBgIGphdmFzY3JpcHQKICAgIEVt YmVyLkxpbmtWaWV3LnJlb3Blbih7CiAgICAgIGV2ZW50TmFtZTogJ2N1c3Rv bUV2ZW50TmFtZScKICAgIH0pOwogICAgYGBgCgogICAgQG1ldGhvZCBsaW5r LXRvCiAgICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycwogICAgQHBh cmFtIHtTdHJpbmd9IHJvdXRlTmFtZQogICAgQHBhcmFtIHtPYmplY3R9IFtj b250ZXh0XSoKICAgIEBwYXJhbSBbb3B0aW9uc10ge09iamVjdH0gSGFuZGxl YmFycyBrZXkvdmFsdWUgcGFpcnMgb2Ygb3B0aW9ucywgeW91IGNhbiBvdmVy cmlkZSBhbnkgcHJvcGVydHkgb2YgRW1iZXIuTGlua1ZpZXcKICAgIEByZXR1 cm4ge1N0cmluZ30gSFRNTCBzdHJpbmcKICAgIEBzZWUge0VtYmVyLkxpbmtW aWV3fQogICovCiAgRW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcign bGluay10bycsIGZ1bmN0aW9uIGxpbmtUb0hlbHBlcihuYW1lKSB7CiAgICB2 YXIgb3B0aW9ucyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAtMSlbMF0sCiAg ICAgICAgcGFyYW1zID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDAsIC0xKSwK ICAgICAgICBoYXNoID0gb3B0aW9ucy5oYXNoOwoKICAgIGlmIChwYXJhbXNb cGFyYW1zLmxlbmd0aCAtIDFdIGluc3RhbmNlb2YgUXVlcnlQYXJhbXMpIHsK ICAgICAgaGFzaC5xdWVyeVBhcmFtc09iamVjdCA9IHBhcmFtcy5wb3AoKTsK ICAgIH0KCiAgICBoYXNoLmRpc2FibGVkQmluZGluZyA9IGhhc2guZGlzYWJs ZWRXaGVuOwoKICAgIGlmICghb3B0aW9ucy5mbikgewogICAgICB2YXIgbGlu a1RpdGxlID0gcGFyYW1zLnNoaWZ0KCk7CiAgICAgIHZhciBsaW5rVHlwZSA9 IG9wdGlvbnMudHlwZXMuc2hpZnQoKTsKICAgICAgdmFyIGNvbnRleHQgPSB0 aGlzOwogICAgICBpZiAobGlua1R5cGUgPT09ICdJRCcpIHsKICAgICAgICBv cHRpb25zLmxpbmtUZXh0UGF0aCA9IGxpbmtUaXRsZTsKICAgICAgICBvcHRp b25zLmZuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gRW1iZXIu SGFuZGxlYmFycy5nZXRFc2NhcGVkKGNvbnRleHQsIGxpbmtUaXRsZSwgb3B0 aW9ucyk7CiAgICAgICAgfTsKICAgICAgfSBlbHNlIHsKICAgICAgICBvcHRp b25zLmZuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gbGlua1Rp dGxlOwogICAgICAgIH07CiAgICAgIH0KICAgIH0KCiAgICBoYXNoLnBhcmFt ZXRlcnMgPSB7CiAgICAgIGNvbnRleHQ6IHRoaXMsCiAgICAgIG9wdGlvbnM6 IG9wdGlvbnMsCiAgICAgIHBhcmFtczogcGFyYW1zCiAgICB9OwoKICAgIHJl dHVybiBFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMudmlldy5jYWxsKHRoaXMs IExpbmtWaWV3LCBvcHRpb25zKTsKICB9KTsKCgogIGlmIChFbWJlci5GRUFU VVJFUy5pc0VuYWJsZWQoInF1ZXJ5LXBhcmFtcy1uZXciKSkgewogICAgRW1i ZXIuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigncXVlcnktcGFyYW1zJywg ZnVuY3Rpb24gcXVlcnlQYXJhbXNIZWxwZXIob3B0aW9ucykgewogICAgICBF bWJlci5hc3NlcnQoZm10KCJUaGUgYHF1ZXJ5LXBhcmFtc2AgaGVscGVyIG9u bHkgYWNjZXB0cyBoYXNoIHBhcmFtZXRlcnMsIGUuZy4gKHF1ZXJ5LXBhcmFt cyBxdWVyeVBhcmFtUHJvcGVydHlOYW1lPSclQCcpIGFzIG9wcG9zZWQgdG8g anVzdCAocXVlcnktcGFyYW1zICclQCcpIiwgW29wdGlvbnMsIG9wdGlvbnNd KSwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMSk7CgogICAgICByZXR1cm4gUXVl cnlQYXJhbXMuY3JlYXRlKHsKICAgICAgICB2YWx1ZXM6IG9wdGlvbnMuaGFz aCwKICAgICAgICB0eXBlczogb3B0aW9ucy5oYXNoVHlwZXMKICAgICAgfSk7 CiAgICB9KTsKICB9CgogIC8qKgogICAgU2VlIFtsaW5rLXRvXSgvYXBpL2Ns YXNzZXMvRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzLmh0bWwjbWV0aG9kX2xp bmstdG8pCgogICAgQG1ldGhvZCBsaW5rVG8KICAgIEBmb3IgRW1iZXIuSGFu ZGxlYmFycy5oZWxwZXJzCiAgICBAZGVwcmVjYXRlZAogICAgQHBhcmFtIHtT dHJpbmd9IHJvdXRlTmFtZQogICAgQHBhcmFtIHtPYmplY3R9IFtjb250ZXh0 XSoKICAgIEByZXR1cm4ge1N0cmluZ30gSFRNTCBzdHJpbmcKICAqLwogIEVt YmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2xpbmtUbycsIGZ1bmN0 aW9uIGxpbmtUb0hlbHBlcigpIHsKICAgIEVtYmVyLndhcm4oIlRoZSAnbGlu a1RvJyB2aWV3IGhlbHBlciBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mICds aW5rLXRvJyIpOwogICAgcmV0dXJuIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVy c1snbGluay10byddLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfSk7Cn0p OwoKCgp9KSgpOwoKCgooZnVuY3Rpb24oKSB7Ci8qKgpAbW9kdWxlIGVtYmVy CkBzdWJtb2R1bGUgZW1iZXItcm91dGluZwoqLwoKdmFyIGdldCA9IEVtYmVy LmdldCwgc2V0ID0gRW1iZXIuc2V0OwpFbWJlci5vbkxvYWQoJ0VtYmVyLkhh bmRsZWJhcnMnLCBmdW5jdGlvbihIYW5kbGViYXJzKSB7CiAgLyoqCiAgQG1v ZHVsZSBlbWJlcgogIEBzdWJtb2R1bGUgZW1iZXItcm91dGluZwogICovCgog IEhhbmRsZWJhcnMuT3V0bGV0VmlldyA9IEVtYmVyLkNvbnRhaW5lclZpZXcu ZXh0ZW5kKEVtYmVyLl9NZXRhbW9ycGgpOwoKICAvKioKICAgIFRoZSBgb3V0 bGV0YCBoZWxwZXIgaXMgYSBwbGFjZWhvbGRlciB0aGF0IHRoZSByb3V0ZXIg d2lsbCBmaWxsIGluIHdpdGgKICAgIHRoZSBhcHByb3ByaWF0ZSB0ZW1wbGF0 ZSBiYXNlZCBvbiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXBwbGljYXRp b24uCgogICAgYGBgIGhhbmRsZWJhcnMKICAgIHt7b3V0bGV0fX0KICAgIGBg YAoKICAgIEJ5IGRlZmF1bHQsIGEgdGVtcGxhdGUgYmFzZWQgb24gRW1iZXIn cyBuYW1pbmcgY29udmVudGlvbnMgd2lsbCBiZSByZW5kZXJlZAogICAgaW50 byB0aGUgYG91dGxldGAgKGUuZy4gYEFwcC5Qb3N0c1JvdXRlYCB3aWxsIHJl bmRlciB0aGUgYHBvc3RzYCB0ZW1wbGF0ZSkuCgogICAgWW91IGNhbiByZW5k ZXIgYSBkaWZmZXJlbnQgdGVtcGxhdGUgYnkgdXNpbmcgdGhlIGByZW5kZXIo KWAgbWV0aG9kIGluIHRoZQogICAgcm91dGUncyBgcmVuZGVyVGVtcGxhdGVg IGhvb2suIFRoZSBmb2xsb3dpbmcgd2lsbCByZW5kZXIgdGhlIGBmYXZvcml0 ZVBvc3RgCiAgICB0ZW1wbGF0ZSBpbnRvIHRoZSBgb3V0bGV0YC4KCiAgICBg YGAgamF2YXNjcmlwdAogICAgQXBwLlBvc3RzUm91dGUgPSBFbWJlci5Sb3V0 ZS5leHRlbmQoewogICAgICByZW5kZXJUZW1wbGF0ZTogZnVuY3Rpb24oKSB7 CiAgICAgICAgdGhpcy5yZW5kZXIoJ2Zhdm9yaXRlUG9zdCcpOwogICAgICB9 CiAgICB9KTsKICAgIGBgYAoKICAgIFlvdSBjYW4gY3JlYXRlIGN1c3RvbSBu YW1lZCBvdXRsZXRzIGZvciBtb3JlIGNvbnRyb2wuCgogICAgYGBgIGhhbmRs ZWJhcnMKICAgIHt7b3V0bGV0ICdmYXZvcml0ZVBvc3QnfX0KICAgIHt7b3V0 bGV0ICdwb3N0cyd9fQogICAgYGBgCgogICAgVGhlbiB5b3UgY2FuIGRlZmlu ZSB3aGF0IHRlbXBsYXRlIGlzIHJlbmRlcmVkIGludG8gZWFjaCBvdXRsZXQg aW4geW91cgogICAgcm91dGUuCgoKICAgIGBgYCBqYXZhc2NyaXB0CiAgICBB cHAuUG9zdHNSb3V0ZSA9IEVtYmVyLlJvdXRlLmV4dGVuZCh7CiAgICAgIHJl bmRlclRlbXBsYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnJlbmRl cignZmF2b3JpdGVQb3N0JywgeyBvdXRsZXQ6ICdmYXZvcml0ZVBvc3QnIH0p OwogICAgICAgIHRoaXMucmVuZGVyKCdwb3N0cycsIHsgb3V0bGV0OiAncG9z dHMnIH0pOwogICAgICB9CiAgICB9KTsKICAgIGBgYAoKICAgIFlvdSBjYW4g c3BlY2lmeSB0aGUgdmlldyB0aGF0IHRoZSBvdXRsZXQgdXNlcyB0byBjb250 YWluIGFuZCBtYW5hZ2UgdGhlCiAgICB0ZW1wbGF0ZXMgcmVuZGVyZWQgaW50 byBpdC4KCiAgICBgYGAgaGFuZGxlYmFycwogICAge3tvdXRsZXQgdmlldz0n c2VjdGlvbkNvbnRhaW5lcid9fQogICAgYGBgCgogICAgYGBgIGphdmFzY3Jp cHQKICAgIEFwcC5TZWN0aW9uQ29udGFpbmVyID0gRW1iZXIuQ29udGFpbmVy Vmlldy5leHRlbmQoewogICAgICB0YWdOYW1lOiAnc2VjdGlvbicsCiAgICAg IGNsYXNzTmFtZXM6IFsnc3BlY2lhbCddCiAgICB9KTsKICAgIGBgYAoKICAg IEBtZXRob2Qgb3V0bGV0CiAgICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVs cGVycwogICAgQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5IHRoZSBwcm9wZXJ0 eSBvbiB0aGUgY29udHJvbGxlcgogICAgICB0aGF0IGhvbGRzIHRoZSB2aWV3 IGZvciB0aGlzIG91dGxldAogICAgQHJldHVybiB7U3RyaW5nfSBIVE1MIHN0 cmluZwogICovCiAgSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcignb3V0bGV0 JywgZnVuY3Rpb24gb3V0bGV0SGVscGVyKHByb3BlcnR5LCBvcHRpb25zKSB7 CiAgIAogICAgdmFyIG91dGxldFNvdXJjZSwKICAgICAgICBjb250YWluZXIs CiAgICAgICAgdmlld05hbWUsCiAgICAgICAgdmlld0NsYXNzLAogICAgICAg IHZpZXdGdWxsTmFtZTsKCiAgICBpZiAocHJvcGVydHkgJiYgcHJvcGVydHku ZGF0YSAmJiBwcm9wZXJ0eS5kYXRhLmlzUmVuZGVyRGF0YSkgewogICAgICBv cHRpb25zID0gcHJvcGVydHk7CiAgICAgIHByb3BlcnR5ID0gJ21haW4nOwog ICAgfQoKICAgIGNvbnRhaW5lciA9IG9wdGlvbnMuZGF0YS52aWV3LmNvbnRh aW5lcjsKCiAgICBvdXRsZXRTb3VyY2UgPSBvcHRpb25zLmRhdGEudmlldzsK ICAgIHdoaWxlICghb3V0bGV0U291cmNlLmdldCgndGVtcGxhdGUuaXNUb3An KSkgewogICAgICBvdXRsZXRTb3VyY2UgPSBvdXRsZXRTb3VyY2UuZ2V0KCdf cGFyZW50VmlldycpOwogICAgfQoKICAgIC8vIHByb3ZpZGUgY29udHJvbGxl ciBvdmVycmlkZQogICAgdmlld05hbWUgPSBvcHRpb25zLmhhc2gudmlldzsK CiAgICBpZiAodmlld05hbWUpIHsKICAgICAgdmlld0Z1bGxOYW1lID0gJ3Zp ZXc6JyArIHZpZXdOYW1lOwogICAgICBFbWJlci5hc3NlcnQoIlVzaW5nIGEg cXVvdGVsZXNzIHZpZXcgcGFyYW1ldGVyIHdpdGgge3tvdXRsZXR9fSBpcyBu b3Qgc3VwcG9ydGVkLiBQbGVhc2UgdXBkYXRlIHRvIHF1b3RlZCB1c2FnZSAn e3tvdXRsZXQgXCIiICsgdmlld05hbWUgKyAiXCJ9fS4iLCBvcHRpb25zLmhh c2hUeXBlcy52aWV3ICE9PSAnSUQnKTsKICAgICAgRW1iZXIuYXNzZXJ0KCJU aGUgdmlldyBuYW1lIHlvdSBzdXBwbGllZCAnIiArIHZpZXdOYW1lICsgIicg ZGlkIG5vdCByZXNvbHZlIHRvIGEgdmlldy4iLCBjb250YWluZXIuaGFzKHZp ZXdGdWxsTmFtZSkpOwogICAgfQoKICAgIHZpZXdDbGFzcyA9IHZpZXdOYW1l ID8gY29udGFpbmVyLmxvb2t1cEZhY3Rvcnkodmlld0Z1bGxOYW1lKSA6IG9w dGlvbnMuaGFzaC52aWV3Q2xhc3MgfHwgSGFuZGxlYmFycy5PdXRsZXRWaWV3 OwoKICAgIG9wdGlvbnMuZGF0YS52aWV3LnNldCgnb3V0bGV0U291cmNlJywg b3V0bGV0U291cmNlKTsKICAgIG9wdGlvbnMuaGFzaC5jdXJyZW50Vmlld0Jp bmRpbmcgPSAnX3ZpZXcub3V0bGV0U291cmNlLl9vdXRsZXRzLicgKyBwcm9w ZXJ0eTsKCiAgICByZXR1cm4gSGFuZGxlYmFycy5oZWxwZXJzLnZpZXcuY2Fs bCh0aGlzLCB2aWV3Q2xhc3MsIG9wdGlvbnMpOwogIH0pOwp9KTsKCn0pKCk7 CgoKCihmdW5jdGlvbigpIHsKLyoqCkBtb2R1bGUgZW1iZXIKQHN1Ym1vZHVs ZSBlbWJlci1yb3V0aW5nCiovCgp2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQg PSBFbWJlci5zZXQ7CkVtYmVyLm9uTG9hZCgnRW1iZXIuSGFuZGxlYmFycycs IGZ1bmN0aW9uKEhhbmRsZWJhcnMpIHsKCiAgLyoqCiAgICBDYWxsaW5nIGBg e3tyZW5kZXJ9fWBgIGZyb20gd2l0aGluIGEgdGVtcGxhdGUgd2lsbCBpbnNl cnQgYW5vdGhlcgogICAgdGVtcGxhdGUgdGhhdCBtYXRjaGVzIHRoZSBwcm92 aWRlZCBuYW1lLiBUaGUgaW5zZXJ0ZWQgdGVtcGxhdGUgd2lsbAogICAgYWNj ZXNzIGl0cyBwcm9wZXJ0aWVzIG9uIGl0cyBvd24gY29udHJvbGxlciAocmF0 aGVyIHRoYW4gdGhlIGNvbnRyb2xsZXIKICAgIG9mIHRoZSBwYXJlbnQgdGVt cGxhdGUpLgoKICAgIElmIGEgdmlldyBjbGFzcyB3aXRoIHRoZSBzYW1lIG5h bWUgZXhpc3RzLCB0aGUgdmlldyBjbGFzcyBhbHNvIHdpbGwgYmUgdXNlZC4K CiAgICBOb3RlOiBBIGdpdmVuIGNvbnRyb2xsZXIgbWF5IG9ubHkgYmUgdXNl ZCAqb25jZSogaW4geW91ciBhcHAgaW4gdGhpcyBtYW5uZXIuCiAgICBBIHNp bmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgY29udHJvbGxlciB3aWxsIGJlIGNy ZWF0ZWQgZm9yIHlvdS4KCiAgICBFeGFtcGxlOgoKICAgIGBgYGphdmFzY3Jp cHQKICAgIEFwcC5OYXZpZ2F0aW9uQ29udHJvbGxlciA9IEVtYmVyLkNvbnRy b2xsZXIuZXh0ZW5kKHsKICAgICAgd2hvOiAid29ybGQiCiAgICB9KTsKICAg IGBgYAoKICAgIGBgYGhhbmRsZWJhcnMKICAgIDwhLS0gbmF2aWdhdGlvbi5o YnMgLS0+CiAgICBIZWxsbywge3t3aG99fS4KICAgIGBgYAoKICAgIGBgYGhh bmRlbGJhcnMKICAgIDwhLS0gYXBwbGljYXRpb24uaGJzIC0tPgogICAgPGgx Pk15IGdyZWF0IGFwcDwvaDE+CiAgICB7e3JlbmRlciAibmF2aWdhdGlvbiJ9 fQogICAgYGBgCgogICAgYGBgaHRtbAogICAgPGgxPk15IGdyZWF0IGFwcDwv aDE+CiAgICA8ZGl2IGNsYXNzPSdlbWJlci12aWV3Jz4KICAgICAgSGVsbG8s IHdvcmxkLgogICAgPC9kaXY+CiAgICBgYGAKCiAgICBPcHRpb25hbGx5IHlv dSBtYXkgcHJvdmlkZSBhIHNlY29uZCBhcmd1bWVudDogYSBwcm9wZXJ0eSBw YXRoCiAgICB0aGF0IHdpbGwgYmUgYm91bmQgdG8gdGhlIGBtb2RlbGAgcHJv cGVydHkgb2YgdGhlIGNvbnRyb2xsZXIuCgogICAgSWYgYSBgbW9kZWxgIHBy b3BlcnR5IHBhdGggaXMgc3BlY2lmaWVkLCB0aGVuIGEgbmV3IGluc3RhbmNl IG9mIHRoZQogICAgY29udHJvbGxlciB3aWxsIGJlIGNyZWF0ZWQgYW5kIGB7 e3JlbmRlcn19YCBjYW4gYmUgdXNlZCBtdWx0aXBsZSB0aW1lcwogICAgd2l0 aCB0aGUgc2FtZSBuYW1lLgoKICAgRm9yIGV4YW1wbGUgaWYgeW91IGhhZCB0 aGlzIGBhdXRob3JgIHRlbXBsYXRlLgoKICAgYGBgaGFuZGxlYmFycwo8ZGl2 IGNsYXNzPSJhdXRob3IiPgogIFdyaXR0ZW4gYnkge3tmaXJzdE5hbWV9fSB7 e2xhc3ROYW1lfX0uCiAgVG90YWwgUG9zdHM6IHt7cG9zdENvdW50fX0KPC9k aXY+CiAgYGBgCgogIFlvdSBjb3VsZCByZW5kZXIgaXQgaW5zaWRlIHRoZSBg cG9zdGAgdGVtcGxhdGUgdXNpbmcgdGhlIGByZW5kZXJgIGhlbHBlci4KCiAg YGBgaGFuZGxlYmFycwo8ZGl2IGNsYXNzPSJwb3N0Ij4KICA8aDE+e3t0aXRs ZX19PC9oMT4KICA8ZGl2Pnt7Ym9keX19PC9kaXY+CiAge3tyZW5kZXIgImF1 dGhvciIgYXV0aG9yfX0KPC9kaXY+CiAgIGBgYAoKICAgIEBtZXRob2QgcmVu ZGVyCiAgICBAZm9yIEVtYmVyLkhhbmRsZWJhcnMuaGVscGVycwogICAgQHBh cmFtIHtTdHJpbmd9IG5hbWUKICAgIEBwYXJhbSB7T2JqZWN0P30gY29udGV4 dFN0cmluZwogICAgQHBhcmFtIHtIYXNofSBvcHRpb25zCiAgICBAcmV0dXJu IHtTdHJpbmd9IEhUTUwgc3RyaW5nCiAgKi8KICBFbWJlci5IYW5kbGViYXJz LnJlZ2lzdGVySGVscGVyKCdyZW5kZXInLCBmdW5jdGlvbiByZW5kZXJIZWxw ZXIobmFtZSwgY29udGV4dFN0cmluZywgb3B0aW9ucykgewogICAgdmFyIGxl bmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7CgogICAgdmFyIGNvbnRleHRQcm92 aWRlZCA9IGxlbmd0aCA9PT0gMywKICAgICAgICBjb250YWluZXIsIHJvdXRl ciwgY29udHJvbGxlciwgdmlldywgY29udGV4dCwgbG9va3VwT3B0aW9uczsK CiAgICBjb250YWluZXIgPSAob3B0aW9ucyB8fCBjb250ZXh0U3RyaW5nKS5k YXRhLmtleXdvcmRzLmNvbnRyb2xsZXIuY29udGFpbmVyOwogICAgcm91dGVy ID0gY29udGFpbmVyLmxvb2t1cCgncm91dGVyOm1haW4nKTsKCiAgICBpZiAo bGVuZ3RoID09PSAyKSB7CiAgICAgIC8vIHVzZSB0aGUgc2luZ2xldG9uIGNv bnRyb2xsZXIKICAgICAgb3B0aW9ucyA9IGNvbnRleHRTdHJpbmc7CiAgICAg IGNvbnRleHRTdHJpbmcgPSB1bmRlZmluZWQ7CiAgICAgIEVtYmVyLmFzc2Vy dCgiWW91IGNhbiBvbmx5IHVzZSB0aGUge3tyZW5kZXJ9fSBoZWxwZXIgb25j ZSB3aXRob3V0IGEgbW9kZWwgb2JqZWN0IGFzIGl0cyBzZWNvbmQgYXJndW1l bnQsIGFzIGluIHt7cmVuZGVyIFwicG9zdFwiIHBvc3R9fS4iLCAhcm91dGVy IHx8ICFyb3V0ZXIuX2xvb2t1cEFjdGl2ZVZpZXcobmFtZSkpOwogICAgfSBl bHNlIGlmIChsZW5ndGggPT09IDMpIHsKICAgICAgLy8gY3JlYXRlIGEgbmV3 IGNvbnRyb2xsZXIKICAgICAgY29udGV4dCA9IEVtYmVyLkhhbmRsZWJhcnMu Z2V0KG9wdGlvbnMuY29udGV4dHNbMV0sIGNvbnRleHRTdHJpbmcsIG9wdGlv bnMpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgRW1iZXIuRXJyb3IoIllv dSBtdXN0IHBhc3MgYSB0ZW1wbGF0ZU5hbWUgdG8gcmVuZGVyIik7CiAgICB9 CgogICAgRW1iZXIuZGVwcmVjYXRlKCJVc2luZyBhIHF1b3RlbGVzcyBwYXJh bWV0ZXIgd2l0aCB7e3JlbmRlcn19IGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1 cGRhdGUgdG8gcXVvdGVkIHVzYWdlICd7e3JlbmRlciBcIiIgKyBuYW1lICsg IlwifX0uIiwgb3B0aW9ucy50eXBlc1swXSAhPT0gJ0lEJyk7CgogICAgLy8g IyBsZWdhY3kgbmFtZXNwYWNlCiAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC9c Ly9nLCAnLicpOwogICAgLy8gXCBsZWdhY3kgc2xhc2ggYXMgbmFtZXNwYWNl IHN1cHBvcnQKCgogICAgdmlldyA9IGNvbnRhaW5lci5sb29rdXAoJ3ZpZXc6 JyArIG5hbWUpIHx8IGNvbnRhaW5lci5sb29rdXAoJ3ZpZXc6ZGVmYXVsdCcp OwoKICAgIC8vIHByb3ZpZGUgY29udHJvbGxlciBvdmVycmlkZQogICAgdmFy IGNvbnRyb2xsZXJOYW1lID0gb3B0aW9ucy5oYXNoLmNvbnRyb2xsZXIgfHwg bmFtZTsKICAgIHZhciBjb250cm9sbGVyRnVsbE5hbWUgPSAnY29udHJvbGxl cjonICsgY29udHJvbGxlck5hbWU7CgogICAgaWYgKG9wdGlvbnMuaGFzaC5j b250cm9sbGVyKSB7CiAgICAgIEVtYmVyLmFzc2VydCgiVGhlIGNvbnRyb2xs ZXIgbmFtZSB5b3Ugc3VwcGxpZWQgJyIgKyBjb250cm9sbGVyTmFtZSArICIn IGRpZCBub3QgcmVzb2x2ZSB0byBhIGNvbnRyb2xsZXIuIiwgY29udGFpbmVy Lmhhcyhjb250cm9sbGVyRnVsbE5hbWUpKTsKICAgIH0KCiAgICB2YXIgcGFy ZW50Q29udHJvbGxlciA9IG9wdGlvbnMuZGF0YS5rZXl3b3Jkcy5jb250cm9s bGVyOwoKICAgIC8vIGNob29zZSBuYW1lCiAgICBpZiAobGVuZ3RoID4gMikg ewogICAgICB2YXIgZmFjdG9yeSA9IGNvbnRhaW5lci5sb29rdXBGYWN0b3J5 KGNvbnRyb2xsZXJGdWxsTmFtZSkgfHwKICAgICAgICAgICAgICAgICAgICBF bWJlci5nZW5lcmF0ZUNvbnRyb2xsZXJGYWN0b3J5KGNvbnRhaW5lciwgY29u dHJvbGxlck5hbWUsIGNvbnRleHQpOwoKICAgICAgY29udHJvbGxlciA9IGZh Y3RvcnkuY3JlYXRlKHsKICAgICAgICBtb2RlbDogY29udGV4dCwKICAgICAg ICBwYXJlbnRDb250cm9sbGVyOiBwYXJlbnRDb250cm9sbGVyLAogICAgICAg IHRhcmdldDogcGFyZW50Q29udHJvbGxlcgogICAgICB9KTsKCiAgICB9IGVs c2UgewogICAgICBjb250cm9sbGVyID0gY29udGFpbmVyLmxvb2t1cChjb250 cm9sbGVyRnVsbE5hbWUpIHx8CiAgICAgICAgICAgICAgICAgICBFbWJlci5n ZW5lcmF0ZUNvbnRyb2xsZXIoY29udGFpbmVyLCBjb250cm9sbGVyTmFtZSk7 CgogICAgICBjb250cm9sbGVyLnNldFByb3BlcnRpZXMoewogICAgICAgIHRh cmdldDogcGFyZW50Q29udHJvbGxlciwKICAgICAgICBwYXJlbnRDb250cm9s bGVyOiBwYXJlbnRDb250cm9sbGVyCiAgICAgIH0pOwogICAgfQoKICAgIHZh ciByb290ID0gb3B0aW9ucy5jb250ZXh0c1sxXTsKCiAgICBpZiAocm9vdCkg ewogICAgICB2aWV3LnJlZ2lzdGVyT2JzZXJ2ZXIocm9vdCwgY29udGV4dFN0 cmluZywgZnVuY3Rpb24oKSB7CiAgICAgICAgY29udHJvbGxlci5zZXQoJ21v ZGVsJywgRW1iZXIuSGFuZGxlYmFycy5nZXQocm9vdCwgY29udGV4dFN0cmlu Zywgb3B0aW9ucykpOwogICAgICB9KTsKICAgIH0KCiAgICBvcHRpb25zLmhh c2gudmlld05hbWUgPSBFbWJlci5TdHJpbmcuY2FtZWxpemUobmFtZSk7Cgog ICAgdmFyIHRlbXBsYXRlTmFtZSA9ICd0ZW1wbGF0ZTonICsgbmFtZTsKICAg IEVtYmVyLmFzc2VydCgiWW91IHVzZWQgYHt7cmVuZGVyICciICsgbmFtZSAr ICInfX1gLCBidXQgJyIgKyBuYW1lICsgIicgY2FuIG5vdCBiZSBmb3VuZCBh cyBlaXRoZXIgYSB0ZW1wbGF0ZSBvciBhIHZpZXcuIiwgY29udGFpbmVyLmhh cygidmlldzoiICsgbmFtZSkgfHwgY29udGFpbmVyLmhhcyh0ZW1wbGF0ZU5h bWUpIHx8IG9wdGlvbnMuZm4pOwogICAgb3B0aW9ucy5oYXNoLnRlbXBsYXRl ID0gY29udGFpbmVyLmxvb2t1cCh0ZW1wbGF0ZU5hbWUpOwoKICAgIG9wdGlv bnMuaGFzaC5jb250cm9sbGVyID0gY29udHJvbGxlcjsKCiAgICBpZiAocm91 dGVyICYmICFjb250ZXh0KSB7CiAgICAgIHJvdXRlci5fY29ubmVjdEFjdGl2 ZVZpZXcobmFtZSwgdmlldyk7CiAgICB9CgogICAgRW1iZXIuSGFuZGxlYmFy cy5oZWxwZXJzLnZpZXcuY2FsbCh0aGlzLCB2aWV3LCBvcHRpb25zKTsKICB9 KTsKfSk7Cgp9KSgpOwoKCgooZnVuY3Rpb24oKSB7Ci8qKgpAbW9kdWxlIGVt YmVyCkBzdWJtb2R1bGUgZW1iZXItcm91dGluZwoqLwpFbWJlci5vbkxvYWQo J0VtYmVyLkhhbmRsZWJhcnMnLCBmdW5jdGlvbihIYW5kbGViYXJzKSB7Cgog IHZhciByZXNvbHZlUGFyYW1zID0gRW1iZXIuUm91dGVyLnJlc29sdmVQYXJh bXMsCiAgICAgIGlzU2ltcGxlQ2xpY2sgPSBFbWJlci5WaWV3VXRpbHMuaXNT aW1wbGVDbGljazsKCiAgdmFyIEVtYmVySGFuZGxlYmFycyA9IEVtYmVyLkhh bmRsZWJhcnMsCiAgICAgIGhhbmRsZWJhcnNHZXQgPSBFbWJlckhhbmRsZWJh cnMuZ2V0LAogICAgICBTYWZlU3RyaW5nID0gRW1iZXJIYW5kbGViYXJzLlNh ZmVTdHJpbmcsCiAgICAgIGZvckVhY2ggPSBFbWJlci5BcnJheVBvbHlmaWxs cy5mb3JFYWNoLAogICAgICBnZXQgPSBFbWJlci5nZXQsCiAgICAgIGFfc2xp Y2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CgogIGZ1bmN0aW9uIGFyZ3Mo b3B0aW9ucywgYWN0aW9uTmFtZSkgewogICAgdmFyIHJldCA9IFtdOwogICAg aWYgKGFjdGlvbk5hbWUpIHsgcmV0LnB1c2goYWN0aW9uTmFtZSk7IH0KCiAg ICB2YXIgdHlwZXMgPSBvcHRpb25zLm9wdGlvbnMudHlwZXMuc2xpY2UoMSks CiAgICAgICAgZGF0YSA9IG9wdGlvbnMub3B0aW9ucy5kYXRhOwoKICAgIHJl dHVybiByZXQuY29uY2F0KHJlc29sdmVQYXJhbXMob3B0aW9ucy5jb250ZXh0 LCBvcHRpb25zLnBhcmFtcywgeyB0eXBlczogdHlwZXMsIGRhdGE6IGRhdGEg fSkpOwogIH0KCiAgdmFyIEFjdGlvbkhlbHBlciA9IEVtYmVySGFuZGxlYmFy cy5BY3Rpb25IZWxwZXIgPSB7CiAgICByZWdpc3RlcmVkQWN0aW9uczoge30K ICB9OwoKICB2YXIga2V5cyA9IFsiYWx0IiwgInNoaWZ0IiwgIm1ldGEiLCAi Y3RybCJdOwoKICB2YXIgUE9JTlRFUl9FVkVOVF9UWVBFX1JFR0VYID0gL15j bGlja3xtb3VzZXx0b3VjaC87CgogIHZhciBpc0FsbG93ZWRFdmVudCA9IGZ1 bmN0aW9uKGV2ZW50LCBhbGxvd2VkS2V5cykgewogICAgaWYgKHR5cGVvZiBh bGxvd2VkS2V5cyA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgaWYgKFBPSU5U RVJfRVZFTlRfVFlQRV9SRUdFWC50ZXN0KGV2ZW50LnR5cGUpKSB7CiAgICAg ICAgcmV0dXJuIGlzU2ltcGxlQ2xpY2soZXZlbnQpOwogICAgICB9IGVsc2Ug ewogICAgICAgIGFsbG93ZWRLZXlzID0gJyc7CiAgICAgIH0KICAgIH0KCiAg ICBpZiAoYWxsb3dlZEtleXMuaW5kZXhPZigiYW55IikgPj0gMCkgewogICAg ICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICB2YXIgYWxsb3dlZCA9IHRydWU7 CgogICAgZm9yRWFjaC5jYWxsKGtleXMsIGZ1bmN0aW9uKGtleSkgewogICAg ICBpZiAoZXZlbnRba2V5ICsgIktleSJdICYmIGFsbG93ZWRLZXlzLmluZGV4 T2Yoa2V5KSA9PT0gLTEpIHsKICAgICAgICBhbGxvd2VkID0gZmFsc2U7CiAg ICAgIH0KICAgIH0pOwoKICAgIHJldHVybiBhbGxvd2VkOwogIH07CgogIEFj dGlvbkhlbHBlci5yZWdpc3RlckFjdGlvbiA9IGZ1bmN0aW9uKGFjdGlvbk5h bWVPclBhdGgsIG9wdGlvbnMsIGFsbG93ZWRLZXlzKSB7CiAgICB2YXIgYWN0 aW9uSWQgPSArK0VtYmVyLnV1aWQ7CgogICAgQWN0aW9uSGVscGVyLnJlZ2lz dGVyZWRBY3Rpb25zW2FjdGlvbklkXSA9IHsKICAgICAgZXZlbnROYW1lOiBv cHRpb25zLmV2ZW50TmFtZSwKICAgICAgaGFuZGxlcjogZnVuY3Rpb24gaGFu ZGxlUmVnaXN0ZXJlZEFjdGlvbihldmVudCkgewogICAgICAgIGlmICghaXNB bGxvd2VkRXZlbnQoZXZlbnQsIGFsbG93ZWRLZXlzKSkgeyByZXR1cm4gdHJ1 ZTsgfQoKICAgICAgICBpZiAob3B0aW9ucy5wcmV2ZW50RGVmYXVsdCAhPT0g ZmFsc2UpIHsKICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAg ICAgICAgfQoKICAgICAgICBpZiAob3B0aW9ucy5idWJibGVzID09PSBmYWxz ZSkgewogICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAg ICAgfQoKICAgICAgICB2YXIgdGFyZ2V0ID0gb3B0aW9ucy50YXJnZXQsCiAg ICAgICAgICAgIGFjdGlvbk5hbWU7CgogICAgICAgIGlmICh0YXJnZXQudGFy Z2V0KSB7CiAgICAgICAgICB0YXJnZXQgPSBoYW5kbGViYXJzR2V0KHRhcmdl dC5yb290LCB0YXJnZXQudGFyZ2V0LCB0YXJnZXQub3B0aW9ucyk7CiAgICAg ICAgfSBlbHNlIHsKICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5yb290Owog ICAgICAgIH0KCiAgICAgICAgCiAgICAgICAgICBpZiAob3B0aW9ucy5ib3Vu ZFByb3BlcnR5KSB7CiAgICAgICAgICAgIGFjdGlvbk5hbWUgPSBoYW5kbGVi YXJzR2V0KHRhcmdldCwgYWN0aW9uTmFtZU9yUGF0aCwgb3B0aW9ucy5vcHRp b25zKTsKCiAgICAgICAgICAgIGlmKHR5cGVvZiBhY3Rpb25OYW1lID09PSAn dW5kZWZpbmVkJyB8fCB0eXBlb2YgYWN0aW9uTmFtZSA9PT0gJ2Z1bmN0aW9u JykgewogICAgICAgICAgICAgIEVtYmVyLmFzc2VydCgiWW91IHNwZWNpZmll ZCBhIHF1b3RlbGVzcyBwYXRoIHRvIHRoZSB7e2FjdGlvbn19IGhlbHBlciAn IiArIGFjdGlvbk5hbWVPclBhdGggKyAiJyB3aGljaCBkaWQgbm90IHJlc29s dmUgdG8gYW4gYWN0aW9uTmFtZS4gUGVyaGFwcyB5b3UgbWVhbnQgdG8gdXNl IGEgcXVvdGVkIGFjdGlvbk5hbWU/IChlLmcuIHt7YWN0aW9uICciICsgYWN0 aW9uTmFtZU9yUGF0aCArICInfX0pLiIsIHRydWUpOwogICAgICAgICAgICAg IGFjdGlvbk5hbWUgPSBhY3Rpb25OYW1lT3JQYXRoOwogICAgICAgICAgICB9 CiAgICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKCFhY3Rpb25OYW1l KSB7CiAgICAgICAgICBhY3Rpb25OYW1lID0gYWN0aW9uTmFtZU9yUGF0aDsK ICAgICAgICB9CgogICAgICAgIEVtYmVyLnJ1bihmdW5jdGlvbiBydW5SZWdp c3RlcmVkQWN0aW9uKCkgewogICAgICAgICAgaWYgKHRhcmdldC5zZW5kKSB7 CiAgICAgICAgICAgIHRhcmdldC5zZW5kLmFwcGx5KHRhcmdldCwgYXJncyhv cHRpb25zLnBhcmFtZXRlcnMsIGFjdGlvbk5hbWUpKTsKICAgICAgICAgIH0g ZWxzZSB7CiAgICAgICAgICAgIEVtYmVyLmFzc2VydCgiVGhlIGFjdGlvbiAn IiArIGFjdGlvbk5hbWUgKyAiJyBkaWQgbm90IGV4aXN0IG9uICIgKyB0YXJn ZXQsIHR5cGVvZiB0YXJnZXRbYWN0aW9uTmFtZV0gPT09ICdmdW5jdGlvbicp OwogICAgICAgICAgICB0YXJnZXRbYWN0aW9uTmFtZV0uYXBwbHkodGFyZ2V0 LCBhcmdzKG9wdGlvbnMucGFyYW1ldGVycykpOwogICAgICAgICAgfQogICAg ICAgIH0pOwogICAgICB9CiAgICB9OwoKICAgIG9wdGlvbnMudmlldy5vbign d2lsbENsZWFyUmVuZGVyJywgZnVuY3Rpb24oKSB7CiAgICAgIGRlbGV0ZSBB Y3Rpb25IZWxwZXIucmVnaXN0ZXJlZEFjdGlvbnNbYWN0aW9uSWRdOwogICAg fSk7CgogICAgcmV0dXJuIGFjdGlvbklkOwogIH07CgogIC8qKgogICAgVGhl IGB7e2FjdGlvbn19YCBoZWxwZXIgcmVnaXN0ZXJzIGFuIEhUTUwgZWxlbWVu dCB3aXRoaW4gYSB0ZW1wbGF0ZSBmb3IgRE9NCiAgICBldmVudCBoYW5kbGlu ZyBhbmQgZm9yd2FyZHMgdGhhdCBpbnRlcmFjdGlvbiB0byB0aGUgdGVtcGxh dGVzJ3MgY29udHJvbGxlcgogICAgb3Igc3VwcGxpZWQgYHRhcmdldGAgb3B0 aW9uIChzZWUgJ1NwZWNpZnlpbmcgYSBUYXJnZXQnKS4KCiAgICBJZiB0aGUg Y29udHJvbGxlciBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGV2ZW50LCB0aGUg ZXZlbnQgaXMgc2VudAogICAgdG8gdGhlIGN1cnJlbnQgcm91dGUsIGFuZCBp dCBidWJibGVzIHVwIHRoZSByb3V0ZSBoaWVyYXJjaHkgZnJvbSB0aGVyZS4K CiAgICBVc2VyIGludGVyYWN0aW9uIHdpdGggdGhhdCBlbGVtZW50IHdpbGwg aW52b2tlIHRoZSBzdXBwbGllZCBhY3Rpb24gbmFtZSBvbgogICAgdGhlIGFw cHJvcHJpYXRlIHRhcmdldC4gU3BlY2lmeWluZyBhIG5vbi1xdW90ZWQgYWN0 aW9uIG5hbWUgd2lsbCByZXN1bHQgaW4KICAgIGEgYm91bmQgcHJvcGVydHkg bG9va3VwIGF0IHRoZSB0aW1lIHRoZSBldmVudCB3aWxsIGJlIHRyaWdnZXJl ZC4KCiAgICBHaXZlbiB0aGUgZm9sbG93aW5nIGFwcGxpY2F0aW9uIEhhbmRs ZWJhcnMgdGVtcGxhdGUgb24gdGhlIHBhZ2UKCiAgICBgYGBoYW5kbGViYXJz CiAgICA8ZGl2IHt7YWN0aW9uICdhbkFjdGlvbk5hbWUnfX0+CiAgICAgIGNs aWNrIG1lCiAgICA8L2Rpdj4KICAgIGBgYAoKICAgIEFuZCBhcHBsaWNhdGlv biBjb2RlCgogICAgYGBgamF2YXNjcmlwdAogICAgQXBwLkFwcGxpY2F0aW9u Q29udHJvbGxlciA9IEVtYmVyLkNvbnRyb2xsZXIuZXh0ZW5kKHsKICAgICAg YWN0aW9uczogewogICAgICAgIGFuQWN0aW9uTmFtZTogZnVuY3Rpb24oKSB7 CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIGBgYAoKICAgIFdpbGwg cmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgcmVuZGVyZWQgSFRNTAoKICAgIGBg YGh0bWwKICAgIDxkaXYgY2xhc3M9ImVtYmVyLXZpZXciPgogICAgICA8ZGl2 IGRhdGEtZW1iZXItYWN0aW9uPSIxIj4KICAgICAgICBjbGljayBtZQogICAg ICA8L2Rpdj4KICAgIDwvZGl2PgogICAgYGBgCgogICAgQ2xpY2tpbmcgImNs aWNrIG1lIiB3aWxsIHRyaWdnZXIgdGhlIGBhbkFjdGlvbk5hbWVgIGFjdGlv biBvZiB0aGUKICAgIGBBcHAuQXBwbGljYXRpb25Db250cm9sbGVyYC4gSW4g dGhpcyBjYXNlLCBubyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgd2lsbCBiZSBw YXNzZWQuCgogICAgSWYgeW91IHByb3ZpZGUgYWRkaXRpb25hbCBwYXJhbWV0 ZXJzIHRvIHRoZSBoZWxwZXI6CgogICAgYGBgaGFuZGxlYmFycwogICAgPGJ1 dHRvbiB7e2FjdGlvbiAnZWRpdCcgcG9zdH19PkVkaXQ8L2J1dHRvbj4KICAg IGBgYAoKICAgIFRob3NlIHBhcmFtZXRlcnMgd2lsbCBiZSBwYXNzZWQgYWxv bmcgYXMgYXJndW1lbnRzIHRvIHRoZSBKYXZhU2NyaXB0CiAgICBmdW5jdGlv biBpbXBsZW1lbnRpbmcgdGhlIGFjdGlvbi4KCiAgICAjIyMgRXZlbnQgUHJv cGFnYXRpb24KCiAgICBFdmVudHMgdHJpZ2dlcmVkIHRocm91Z2ggdGhlIGFj dGlvbiBoZWxwZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGhhdmUKICAgIGAucHJl dmVudERlZmF1bHQoKWAgY2FsbGVkIG9uIHRoZW0uIFlvdSBkbyBub3QgbmVl ZCB0byBkbyBzbyBpbiB5b3VyIGV2ZW50CiAgICBoYW5kbGVycy4gSWYgeW91 IG5lZWQgdG8gYWxsb3cgZXZlbnQgcHJvcGFnYXRpb24gKHRvIGhhbmRsZSBm aWxlIGlucHV0cyBmb3IKICAgIGV4YW1wbGUpIHlvdSBjYW4gc3VwcGx5IHRo ZSBgcHJldmVudERlZmF1bHQ9ZmFsc2VgIG9wdGlvbiB0byB0aGUgYHt7YWN0 aW9ufX1gIGhlbHBlcjoKCiAgICBgYGBoYW5kbGViYXJzCiAgICA8ZGl2IHt7 YWN0aW9uICJzYXlIZWxsbyIgcHJldmVudERlZmF1bHQ9ZmFsc2V9fT4KICAg ICAgPGlucHV0IHR5cGU9ImZpbGUiIC8+CiAgICAgIDxpbnB1dCB0eXBlPSJj aGVja2JveCIgLz4KICAgIDwvZGl2PgogICAgYGBgCgogICAgVG8gZGlzYWJs ZSBidWJibGluZywgcGFzcyBgYnViYmxlcz1mYWxzZWAgdG8gdGhlIGhlbHBl cjoKCiAgICBgYGBoYW5kbGViYXJzCiAgICA8YnV0dG9uIHt7YWN0aW9uICdl ZGl0JyBwb3N0IGJ1YmJsZXM9ZmFsc2V9fT5FZGl0PC9idXR0b24+CiAgICBg YGAKCiAgICBJZiB5b3UgbmVlZCB0aGUgZGVmYXVsdCBoYW5kbGVyIHRvIHRy aWdnZXIgeW91IHNob3VsZCBlaXRoZXIgcmVnaXN0ZXIgeW91cgogICAgb3du IGV2ZW50IGhhbmRsZXIsIG9yIHVzZSBldmVudCBtZXRob2RzIG9uIHlvdXIg dmlldyBjbGFzcy4gU2VlIFtFbWJlci5WaWV3XSgvYXBpL2NsYXNzZXMvRW1i ZXIuVmlldy5odG1sKQogICAgJ1Jlc3BvbmRpbmcgdG8gQnJvd3NlciBFdmVu dHMnIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKICAgICMjIyBTcGVjaWZ5aW5n IERPTSBldmVudCB0eXBlCgogICAgQnkgZGVmYXVsdCB0aGUgYHt7YWN0aW9u fX1gIGhlbHBlciByZWdpc3RlcnMgZm9yIERPTSBgY2xpY2tgIGV2ZW50cy4g WW91IGNhbgogICAgc3VwcGx5IGFuIGBvbmAgb3B0aW9uIHRvIHRoZSBoZWxw ZXIgdG8gc3BlY2lmeSBhIGRpZmZlcmVudCBET00gZXZlbnQgbmFtZToKCiAg ICBgYGBoYW5kbGViYXJzCiAgICA8ZGl2IHt7YWN0aW9uICJhbkFjdGlvbk5h bWUiIG9uPSJkb3VibGVDbGljayJ9fT4KICAgICAgY2xpY2sgbWUKICAgIDwv ZGl2PgogICAgYGBgCgogICAgU2VlIGBFbWJlci5WaWV3YCAnUmVzcG9uZGlu ZyB0byBCcm93c2VyIEV2ZW50cycgZm9yIGEgbGlzdCBvZgogICAgYWNjZXB0 YWJsZSBET00gZXZlbnQgbmFtZXMuCgogICAgTk9URTogQmVjYXVzZSBge3th Y3Rpb259fWAgZGVwZW5kcyBvbiBFbWJlcidzIGV2ZW50IGRpc3BhdGNoIHN5 c3RlbSBpdCB3aWxsCiAgICBvbmx5IGZ1bmN0aW9uIGlmIGFuIGBFbWJlci5F dmVudERpc3BhdGNoZXJgIGluc3RhbmNlIGlzIGF2YWlsYWJsZS4gQW4KICAg IGBFbWJlci5FdmVudERpc3BhdGNoZXJgIGluc3RhbmNlIHdpbGwgYmUgY3Jl YXRlZCB3aGVuIGEgbmV3IGBFbWJlci5BcHBsaWNhdGlvbmAKICAgIGlzIGNy ZWF0ZWQuIEhhdmluZyBhbiBpbnN0YW5jZSBvZiBgRW1iZXIuQXBwbGljYXRp b25gIHdpbGwgc2F0aXNmeSB0aGlzCiAgICByZXF1aXJlbWVudC4KCiAgICAj IyMgU3BlY2lmeWluZyB3aGl0ZWxpc3RlZCBtb2RpZmllciBrZXlzCgogICAg QnkgZGVmYXVsdCB0aGUgYHt7YWN0aW9ufX1gIGhlbHBlciB3aWxsIGlnbm9y ZSBjbGljayBldmVudCB3aXRoIHByZXNzZWQgbW9kaWZpZXIKICAgIGtleXMu IFlvdSBjYW4gc3VwcGx5IGFuIGBhbGxvd2VkS2V5c2Agb3B0aW9uIHRvIHNw ZWNpZnkgd2hpY2gga2V5cyBzaG91bGQgbm90IGJlIGlnbm9yZWQuCgogICAg YGBgaGFuZGxlYmFycwogICAgPGRpdiB7e2FjdGlvbiAiYW5BY3Rpb25OYW1l IiBhbGxvd2VkS2V5cz0iYWx0In19PgogICAgICBjbGljayBtZQogICAgPC9k aXY+CiAgICBgYGAKCiAgICBUaGlzIHdheSB0aGUgYHt7YWN0aW9ufX1gIHdp bGwgZmlyZSB3aGVuIGNsaWNraW5nIHdpdGggdGhlIGFsdCBrZXkgcHJlc3Nl ZCBkb3duLgoKICAgIEFsdGVybmF0aXZlbHksIHN1cHBseSAiYW55IiB0byB0 aGUgYGFsbG93ZWRLZXlzYCBvcHRpb24gdG8gYWNjZXB0IGFueSBjb21iaW5h dGlvbiBvZiBtb2RpZmllciBrZXlzLgoKICAgIGBgYGhhbmRsZWJhcnMKICAg IDxkaXYge3thY3Rpb24gImFuQWN0aW9uTmFtZSIgYWxsb3dlZEtleXM9ImFu eSJ9fT4KICAgICAgY2xpY2sgbWUgd2l0aCBhbnkga2V5IHByZXNzZWQKICAg IDwvZGl2PgogICAgYGBgCgogICAgIyMjIFNwZWNpZnlpbmcgYSBUYXJnZXQK CiAgICBUaGVyZSBhcmUgc2V2ZXJhbCBwb3NzaWJsZSB0YXJnZXQgb2JqZWN0 cyBmb3IgYHt7YWN0aW9ufX1gIGhlbHBlcnM6CgogICAgSW4gYSB0eXBpY2Fs IEVtYmVyIGFwcGxpY2F0aW9uLCB3aGVyZSB2aWV3cyBhcmUgbWFuYWdlZCB0 aHJvdWdoIHVzZSBvZiB0aGUKICAgIGB7e291dGxldH19YCBoZWxwZXIsIGFj dGlvbnMgd2lsbCBidWJibGUgdG8gdGhlIGN1cnJlbnQgY29udHJvbGxlciwg dGhlbgogICAgdG8gdGhlIGN1cnJlbnQgcm91dGUsIGFuZCB0aGVuIHVwIHRo ZSByb3V0ZSBoaWVyYXJjaHkuCgogICAgQWx0ZXJuYXRpdmVseSwgYSBgdGFy Z2V0YCBvcHRpb24gY2FuIGJlIHByb3ZpZGVkIHRvIHRoZSBoZWxwZXIgdG8g Y2hhbmdlCiAgICB3aGljaCBvYmplY3Qgd2lsbCByZWNlaXZlIHRoZSBtZXRo b2QgY2FsbC4gVGhpcyBvcHRpb24gbXVzdCBiZSBhIHBhdGgKICAgIHRvIGFu IG9iamVjdCwgYWNjZXNzaWJsZSBpbiB0aGUgY3VycmVudCBjb250ZXh0OgoK ICAgIGBgYGhhbmRsZWJhcnMKICAgIHt7ISB0aGUgYXBwbGljYXRpb24gdGVt cGxhdGUgfX0KICAgIDxkaXYge3thY3Rpb24gImFuQWN0aW9uTmFtZSIgdGFy Z2V0PXZpZXd9fT4KICAgICAgY2xpY2sgbWUKICAgIDwvZGl2PgogICAgYGBg CgogICAgYGBgamF2YXNjcmlwdAogICAgQXBwLkFwcGxpY2F0aW9uVmlldyA9 IEVtYmVyLlZpZXcuZXh0ZW5kKHsKICAgICAgYWN0aW9uczogewogICAgICAg IGFuQWN0aW9uTmFtZTogZnVuY3Rpb24oKXt9CiAgICAgIH0KICAgIH0pOwoK ICAgIGBgYAoKICAgICMjIyBBZGRpdGlvbmFsIFBhcmFtZXRlcnMKCiAgICBZ b3UgbWF5IHNwZWNpZnkgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRvIHRoZSBg e3thY3Rpb259fWAgaGVscGVyLiBUaGVzZQogICAgcGFyYW1ldGVycyBhcmUg cGFzc2VkIGFsb25nIGFzIHRoZSBhcmd1bWVudHMgdG8gdGhlIEphdmFTY3Jp cHQgZnVuY3Rpb24KICAgIGltcGxlbWVudGluZyB0aGUgYWN0aW9uLgoKICAg IGBgYGhhbmRsZWJhcnMKICAgIHt7I2VhY2ggcGVyc29uIGluIHBlb3BsZX19 CiAgICAgIDxkaXYge3thY3Rpb24gImVkaXQiIHBlcnNvbn19PgogICAgICAg IGNsaWNrIG1lCiAgICAgIDwvZGl2PgogICAge3svZWFjaH19CiAgICBgYGAK CiAgICBDbGlja2luZyAiY2xpY2sgbWUiIHdpbGwgdHJpZ2dlciB0aGUgYGVk aXRgIG1ldGhvZCBvbiB0aGUgY3VycmVudCBjb250cm9sbGVyCiAgICB3aXRo IHRoZSB2YWx1ZSBvZiBgcGVyc29uYCBhcyBhIHBhcmFtZXRlci4KCiAgICBA bWV0aG9kIGFjdGlvbgogICAgQGZvciBFbWJlci5IYW5kbGViYXJzLmhlbHBl cnMKICAgIEBwYXJhbSB7U3RyaW5nfSBhY3Rpb25OYW1lCiAgICBAcGFyYW0g e09iamVjdH0gW2NvbnRleHRdKgogICAgQHBhcmFtIHtIYXNofSBvcHRpb25z CiAgKi8KICBFbWJlckhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2FjdGlv bicsIGZ1bmN0aW9uIGFjdGlvbkhlbHBlcihhY3Rpb25OYW1lKSB7CiAgICB2 YXIgb3B0aW9ucyA9IGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV0s CiAgICAgICAgY29udGV4dHMgPSBhX3NsaWNlLmNhbGwoYXJndW1lbnRzLCAx LCAtMSk7CgogICAgdmFyIGhhc2ggPSBvcHRpb25zLmhhc2gsCiAgICAgICAg Y29udHJvbGxlciA9IG9wdGlvbnMuZGF0YS5rZXl3b3Jkcy5jb250cm9sbGVy OwoKICAgIC8vIGNyZWF0ZSBhIGhhc2ggdG8gcGFzcyBhbG9uZyB0byByZWdp c3RlckFjdGlvbgogICAgdmFyIGFjdGlvbiA9IHsKICAgICAgZXZlbnROYW1l OiBoYXNoLm9uIHx8ICJjbGljayIsCiAgICAgIHBhcmFtZXRlcnM6IHsKICAg ICAgICBjb250ZXh0OiB0aGlzLAogICAgICAgIG9wdGlvbnM6IG9wdGlvbnMs CiAgICAgICAgcGFyYW1zOiBjb250ZXh0cwogICAgICB9LAogICAgICB2aWV3 OiBvcHRpb25zLmRhdGEudmlldywKICAgICAgYnViYmxlczogaGFzaC5idWJi bGVzLAogICAgICBwcmV2ZW50RGVmYXVsdDogaGFzaC5wcmV2ZW50RGVmYXVs dCwKICAgICAgdGFyZ2V0OiB7IG9wdGlvbnM6IG9wdGlvbnMgfSwKICAgICAg Ym91bmRQcm9wZXJ0eTogb3B0aW9ucy50eXBlc1swXSA9PT0gIklEIgogICAg fTsKCiAgICBpZiAoaGFzaC50YXJnZXQpIHsKICAgICAgYWN0aW9uLnRhcmdl dC5yb290ID0gdGhpczsKICAgICAgYWN0aW9uLnRhcmdldC50YXJnZXQgPSBo YXNoLnRhcmdldDsKICAgIH0gZWxzZSBpZiAoY29udHJvbGxlcikgewogICAg ICBhY3Rpb24udGFyZ2V0LnJvb3QgPSBjb250cm9sbGVyOwogICAgfQoKICAg IHZhciBhY3Rpb25JZCA9IEFjdGlvbkhlbHBlci5yZWdpc3RlckFjdGlvbihh Y3Rpb25OYW1lLCBhY3Rpb24sIGhhc2guYWxsb3dlZEtleXMpOwogICAgcmV0 dXJuIG5ldyBTYWZlU3RyaW5nKCdkYXRhLWVtYmVyLWFjdGlvbj0iJyArIGFj dGlvbklkICsgJyInKTsKICB9KTsKfSk7Cgp9KSgpOwoKCgooZnVuY3Rpb24o KSB7Cgp9KSgpOwoKCgooZnVuY3Rpb24oKSB7Ci8qKgpAbW9kdWxlIGVtYmVy CkBzdWJtb2R1bGUgZW1iZXItcm91dGluZwoqLwoKdmFyIGdldCA9IEVtYmVy LmdldCwgc2V0ID0gRW1iZXIuc2V0LAogICAgbWFwID0gRW1iZXIuRW51bWVy YWJsZVV0aWxzLm1hcDsKCnZhciBxdWV1ZWRRdWVyeVBhcmFtQ2hhbmdlcyA9 IHt9OwoKRW1iZXIuQ29udHJvbGxlck1peGluLnJlb3Blbih7CiAgLyoqCiAg ICBUcmFuc2l0aW9uIHRoZSBhcHBsaWNhdGlvbiBpbnRvIGFub3RoZXIgcm91 dGUuIFRoZSByb3V0ZSBtYXkKICAgIGJlIGVpdGhlciBhIHNpbmdsZSByb3V0 ZSBvciByb3V0ZSBwYXRoOgoKICAgIGBgYGphdmFzY3JpcHQKICAgIGFDb250 cm9sbGVyLnRyYW5zaXRpb25Ub1JvdXRlKCdibG9nUG9zdHMnKTsKICAgIGFD b250cm9sbGVyLnRyYW5zaXRpb25Ub1JvdXRlKCdibG9nUG9zdHMucmVjZW50 RW50cmllcycpOwogICAgYGBgCgogICAgT3B0aW9uYWxseSBzdXBwbHkgYSBt b2RlbCBmb3IgdGhlIHJvdXRlIGluIHF1ZXN0aW9uLiBUaGUgbW9kZWwKICAg IHdpbGwgYmUgc2VyaWFsaXplZCBpbnRvIHRoZSBVUkwgdXNpbmcgdGhlIGBz ZXJpYWxpemVgIGhvb2sgb2YKICAgIHRoZSByb3V0ZToKCiAgICBgYGBqYXZh c2NyaXB0CiAgICBhQ29udHJvbGxlci50cmFuc2l0aW9uVG9Sb3V0ZSgnYmxv Z1Bvc3QnLCBhUG9zdCk7CiAgICBgYGAKCiAgICBNdWx0aXBsZSBtb2RlbHMg d2lsbCBiZSBhcHBsaWVkIGxhc3QgdG8gZmlyc3QgcmVjdXJzaXZlbHkgdXAg dGhlCiAgICByZXNvdXJjZSB0cmVlLgoKICAgIGBgYGphdmFzY3JpcHQKICAg IHRoaXMucmVzb3VyY2UoJ2Jsb2dQb3N0Jywge3BhdGg6JzpibG9nUG9zdElk J30sIGZ1bmN0aW9uKCl7CiAgICAgIHRoaXMucmVzb3VyY2UoJ2Jsb2dDb21t ZW50Jywge3BhdGg6ICc6YmxvZ0NvbW1lbnRJZCd9KTsKICAgIH0pOwoKICAg IGFDb250cm9sbGVyLnRyYW5zaXRpb25Ub1JvdXRlKCdibG9nQ29tbWVudCcs IGFQb3N0LCBhQ29tbWVudCk7CiAgICBgYGAKCiAgICBTZWUgYWxzbyAncmVw bGFjZVJvdXRlJy4KCiAgICBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbmFt ZSBvZiB0aGUgcm91dGUKICAgIEBwYXJhbSB7Li4uT2JqZWN0fSBtb2RlbHMg dGhlIG1vZGVsKHMpIHRvIGJlIHVzZWQgd2hpbGUgdHJhbnNpdGlvbmluZwog ICAgdG8gdGhlIHJvdXRlLgogICAgQGZvciBFbWJlci5Db250cm9sbGVyTWl4 aW4KICAgIEBtZXRob2QgdHJhbnNpdGlvblRvUm91dGUKICAqLwogIHRyYW5z aXRpb25Ub1JvdXRlOiBmdW5jdGlvbigpIHsKICAgIC8vIHRhcmdldCBtYXkg YmUgZWl0aGVyIGFub3RoZXIgY29udHJvbGxlciBvciBhIHJvdXRlcgogICAg dmFyIHRhcmdldCA9IGdldCh0aGlzLCAndGFyZ2V0JyksCiAgICAgICAgbWV0 aG9kID0gdGFyZ2V0LnRyYW5zaXRpb25Ub1JvdXRlIHx8IHRhcmdldC50cmFu c2l0aW9uVG87CiAgICByZXR1cm4gbWV0aG9kLmFwcGx5KHRhcmdldCwgYXJn dW1lbnRzKTsKICB9LAoKICAvKioKICAgIEBkZXByZWNhdGVkCiAgICBAZm9y IEVtYmVyLkNvbnRyb2xsZXJNaXhpbgogICAgQG1ldGhvZCB0cmFuc2l0aW9u VG8KICAqLwogIHRyYW5zaXRpb25UbzogZnVuY3Rpb24oKSB7CiAgICBFbWJl ci5kZXByZWNhdGUoInRyYW5zaXRpb25UbyBpcyBkZXByZWNhdGVkLiBQbGVh c2UgdXNlIHRyYW5zaXRpb25Ub1JvdXRlLiIpOwogICAgcmV0dXJuIHRoaXMu dHJhbnNpdGlvblRvUm91dGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICB9 LAoKICAvKioKICAgIFRyYW5zaXRpb24gaW50byBhbm90aGVyIHJvdXRlIHdo aWxlIHJlcGxhY2luZyB0aGUgY3VycmVudCBVUkwsIGlmIHBvc3NpYmxlLgog ICAgVGhpcyB3aWxsIHJlcGxhY2UgdGhlIGN1cnJlbnQgaGlzdG9yeSBlbnRy eSBpbnN0ZWFkIG9mIGFkZGluZyBhIG5ldyBvbmUuCiAgICBCZXNpZGUgdGhh dCwgaXQgaXMgaWRlbnRpY2FsIHRvIGB0cmFuc2l0aW9uVG9Sb3V0ZWAgaW4g YWxsIG90aGVyIHJlc3BlY3RzLgoKICAgIGBgYGphdmFzY3JpcHQKICAgIGFD b250cm9sbGVyLnJlcGxhY2VSb3V0ZSgnYmxvZ1Bvc3RzJyk7CiAgICBhQ29u dHJvbGxlci5yZXBsYWNlUm91dGUoJ2Jsb2dQb3N0cy5yZWNlbnRFbnRyaWVz Jyk7CiAgICBgYGAKCiAgICBPcHRpb25hbGx5IHN1cHBseSBhIG1vZGVsIGZv ciB0aGUgcm91dGUgaW4gcXVlc3Rpb24uIFRoZSBtb2RlbAogICAgd2lsbCBi ZSBzZXJpYWxpemVkIGludG8gdGhlIFVSTCB1c2luZyB0aGUgYHNlcmlhbGl6 ZWAgaG9vayBvZgogICAgdGhlIHJvdXRlOgoKICAgIGBgYGphdmFzY3JpcHQK ICAgIGFDb250cm9sbGVyLnJlcGxhY2VSb3V0ZSgnYmxvZ1Bvc3QnLCBhUG9z dCk7CiAgICBgYGAKCiAgICBNdWx0aXBsZSBtb2RlbHMgd2lsbCBiZSBhcHBs aWVkIGxhc3QgdG8gZmlyc3QgcmVjdXJzaXZlbHkgdXAgdGhlCiAgICByZXNv dXJjZSB0cmVlLgoKICAgIGBgYGphdmFzY3JpcHQKICAgIHRoaXMucmVzb3Vy Y2UoJ2Jsb2dQb3N0Jywge3BhdGg6JzpibG9nUG9zdElkJ30sIGZ1bmN0aW9u KCl7CiAgICAgIHRoaXMucmVzb3VyY2UoJ2Jsb2dDb21tZW50Jywge3BhdGg6 ICc6YmxvZ0NvbW1lbnRJZCd9KTsKICAgIH0pOwoKICAgIGFDb250cm9sbGVy LnJlcGxhY2VSb3V0ZSgnYmxvZ0NvbW1lbnQnLCBhUG9zdCwgYUNvbW1lbnQp OwogICAgYGBgCgogICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUg b2YgdGhlIHJvdXRlCiAgICBAcGFyYW0gey4uLk9iamVjdH0gbW9kZWxzIHRo ZSBtb2RlbChzKSB0byBiZSB1c2VkIHdoaWxlIHRyYW5zaXRpb25pbmcKICAg IHRvIHRoZSByb3V0ZS4KICAgIEBmb3IgRW1iZXIuQ29udHJvbGxlck1peGlu CiAgICBAbWV0aG9kIHJlcGxhY2VSb3V0ZQogICovCiAgcmVwbGFjZVJvdXRl OiBmdW5jdGlvbigpIHsKICAgIC8vIHRhcmdldCBtYXkgYmUgZWl0aGVyIGFu b3RoZXIgY29udHJvbGxlciBvciBhIHJvdXRlcgogICAgdmFyIHRhcmdldCA9 IGdldCh0aGlzLCAndGFyZ2V0JyksCiAgICAgICAgbWV0aG9kID0gdGFyZ2V0 LnJlcGxhY2VSb3V0ZSB8fCB0YXJnZXQucmVwbGFjZVdpdGg7CiAgICByZXR1 cm4gbWV0aG9kLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICB9LAoKICAv KioKICAgIEBkZXByZWNhdGVkCiAgICBAZm9yIEVtYmVyLkNvbnRyb2xsZXJN aXhpbgogICAgQG1ldGhvZCByZXBsYWNlV2l0aAogICovCiAgcmVwbGFjZVdp dGg6IGZ1bmN0aW9uKCkgewogICAgRW1iZXIuZGVwcmVjYXRlKCJyZXBsYWNl V2l0aCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHJlcGxhY2VSb3V0ZS4i KTsKICAgIHJldHVybiB0aGlzLnJlcGxhY2VSb3V0ZS5hcHBseSh0aGlzLCBh cmd1bWVudHMpOwogIH0KfSk7CgppZiAoRW1iZXIuRkVBVFVSRVMuaXNFbmFi bGVkKCJxdWVyeS1wYXJhbXMtbmV3IikpIHsKICBFbWJlci5Db250cm9sbGVy TWl4aW4ucmVvcGVuKHsKCiAgICBjb25jYXRlbmF0ZWRQcm9wZXJ0aWVzOiBb J3F1ZXJ5UGFyYW1zJ10sCgogICAgcXVlcnlQYXJhbXM6IG51bGwsCgogICAg X3F1ZXJ5UGFyYW1TY29wZTogbnVsbCwKCiAgICBfZmluYWxpemluZ1F1ZXJ5 UGFyYW1zOiBmYWxzZSwKICAgIF9xdWVyeVBhcmFtSGFzaDogRW1iZXIuY29t cHV0ZWQoZnVuY3Rpb24gY29tcHV0ZVF1ZXJ5UGFyYW1IYXNoKCkgewoKICAg ICAgLy8gR2l2ZW46IHF1ZXJ5UGFyYW1zOiBbJ2ZvbycsICdiYXI6YmF6J10g b24gY29udHJvbGxlcjp0aGluZwogICAgICAvLyBfcXVlcnlQYXJhbUhhc2gg c2hvdWxkIHlpZWxkOiB7ICdmb28nOiAndGhpbmdbZm9vXScgfQoKICAgICAg dmFyIHJlc3VsdCA9IHt9OwogICAgICB2YXIgcXVlcnlQYXJhbXMgPSB0aGlz LnF1ZXJ5UGFyYW1zOwogICAgICBpZiAoIXF1ZXJ5UGFyYW1zKSB7CiAgICAg ICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQoKICAgICAgZm9yICh2YXIgaSA9 IDAsIGxlbiA9IHF1ZXJ5UGFyYW1zLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7 CiAgICAgICAgdmFyIGZ1bGwgPSBxdWVyeVBhcmFtc1tpXTsKICAgICAgICB2 YXIgcGFydHMgPSBmdWxsLnNwbGl0KCc6Jyk7CiAgICAgICAgdmFyIGtleSA9 IHBhcnRzWzBdOwogICAgICAgIHZhciB1cmxLZXkgPSBwYXJ0c1sxXTsKICAg ICAgICBpZiAoIXVybEtleSkgewogICAgICAgICAgaWYgKHRoaXMuX3F1ZXJ5 UGFyYW1TY29wZSkgewogICAgICAgICAgICB1cmxLZXkgPSB0aGlzLl9xdWVy eVBhcmFtU2NvcGUgKyAnWycgKyBrZXkgKyAnXSc7CiAgICAgICAgICB9IGVs c2UgewogICAgICAgICAgICB1cmxLZXkgPSBrZXk7CiAgICAgICAgICB9CiAg ICAgICAgfQogICAgICAgIHJlc3VsdFtrZXldID0gdXJsS2V5OwogICAgICB9 CgogICAgICByZXR1cm4gcmVzdWx0OwogICAgfSksCgogICAgX2FjdGl2YXRl UXVlcnlQYXJhbU9ic2VydmVyczogZnVuY3Rpb24oKSB7CiAgICAgIHZhciBx dWVyeVBhcmFtcyA9IGdldCh0aGlzLCAnX3F1ZXJ5UGFyYW1IYXNoJyk7Cgog ICAgICBmb3IgKHZhciBrIGluIHF1ZXJ5UGFyYW1zKSB7CiAgICAgICAgaWYg KHF1ZXJ5UGFyYW1zLmhhc093blByb3BlcnR5KGspKSB7CiAgICAgICAgICB0 aGlzLmFkZE9ic2VydmVyKGssIHRoaXMsIHRoaXMuX3F1ZXJ5UGFyYW1DaGFu Z2VkKTsKICAgICAgICAgIHRoaXMuYWRkT2JzZXJ2ZXIoayArICcuW10nLCB0 aGlzLCB0aGlzLl9xdWVyeVBhcmFtQ2hhbmdlZCk7CiAgICAgICAgfQogICAg ICB9CiAgICB9LAoKICAgIF9kZWFjdGl2YXRlUXVlcnlQYXJhbU9ic2VydmVy czogZnVuY3Rpb24oKSB7CiAgICAgIHZhciBxdWVyeVBhcmFtcyA9IGdldCh0 aGlzLCAnX3F1ZXJ5UGFyYW1IYXNoJyk7CgogICAgICBmb3IgKHZhciBrIGlu IHF1ZXJ5UGFyYW1zKSB7CiAgICAgICAgaWYgKHF1ZXJ5UGFyYW1zLmhhc093 blByb3BlcnR5KGspKSB7CiAgICAgICAgICB0aGlzLnJlbW92ZU9ic2VydmVy KGssIHRoaXMsIHRoaXMuX3F1ZXJ5UGFyYW1DaGFuZ2VkKTsKICAgICAgICAg IHRoaXMucmVtb3ZlT2JzZXJ2ZXIoayArICcuW10nLCB0aGlzLCB0aGlzLl9x dWVyeVBhcmFtQ2hhbmdlZCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAoK ICAgIF9xdWVyeVBhcmFtQ2hhbmdlZDogZnVuY3Rpb24oY29udHJvbGxlciwg a2V5KSB7CiAgICAgIC8vIE5vcm1hbGl6ZSBhcnJheSBvYnNlcnZlciBmaXJp bmdzLgogICAgICBpZiAoa2V5LnNsaWNlKGtleS5sZW5ndGggLSAzKSA9PT0g Jy5bXScpIHsKICAgICAgICBrZXkgPSBrZXkuc3Vic3RyKDAsIGtleS5sZW5n dGgtMyk7CiAgICAgIH0KCiAgICAgIGlmICh0aGlzLl9maW5hbGl6aW5nUXVl cnlQYXJhbXMpIHsKICAgICAgICB2YXIgY2hhbmdlcyA9IHRoaXMuX3F1ZXJ5 UGFyYW1DaGFuZ2VzRHVyaW5nU3VzcGVuc2lvbjsKICAgICAgICBpZiAoY2hh bmdlcykgewogICAgICAgICAgY2hhbmdlc1trZXldID0gdHJ1ZTsKICAgICAg ICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICB2YXIgcXVlcnlQ YXJhbXMgPSBnZXQodGhpcywgJ19xdWVyeVBhcmFtSGFzaCcpOwogICAgICBx dWV1ZWRRdWVyeVBhcmFtQ2hhbmdlc1txdWVyeVBhcmFtc1trZXldXSA9IEVt YmVyLmNvcHkoZ2V0KHRoaXMsIGtleSkpOwogICAgICBFbWJlci5ydW4ub25j ZSh0aGlzLCB0aGlzLl9maXJlUXVlcnlQYXJhbVRyYW5zaXRpb24pOwogICAg fSwKCiAgICBfZmlyZVF1ZXJ5UGFyYW1UcmFuc2l0aW9uOiBmdW5jdGlvbigp IHsKICAgICAgdGhpcy50cmFuc2l0aW9uVG9Sb3V0ZSh7IHF1ZXJ5UGFyYW1z OiBxdWV1ZWRRdWVyeVBhcmFtQ2hhbmdlcyB9KTsKICAgICAgcXVldWVkUXVl cnlQYXJhbUNoYW5nZXMgPSB7fTsKICAgIH0sCgogICAgX3F1ZXJ5UGFyYW1D aGFuZ2VzRHVyaW5nU3VzcGVuc2lvbjogbnVsbAogIH0pOwp9Cgp9KSgpOwoK CgooZnVuY3Rpb24oKSB7Ci8qKgpAbW9kdWxlIGVtYmVyCkBzdWJtb2R1bGUg ZW1iZXItcm91dGluZwoqLwoKdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0g RW1iZXIuc2V0OwoKRW1iZXIuVmlldy5yZW9wZW4oewoKICAvKioKICAgIFNl dHMgdGhlIHByaXZhdGUgYF9vdXRsZXRzYCBvYmplY3Qgb24gdGhlIHZpZXcu CgogICAgQG1ldGhvZCBpbml0CiAgICovCiAgaW5pdDogZnVuY3Rpb24oKSB7 CiAgICBzZXQodGhpcywgJ19vdXRsZXRzJywge30pOwogICAgdGhpcy5fc3Vw ZXIoKTsKICB9LAoKICAvKioKICAgIE1hbnVhbGx5IGZpbGwgYW55IG9mIGEg dmlldydzIGB7e291dGxldH19YCBhcmVhcyB3aXRoIHRoZQogICAgc3VwcGxp ZWQgdmlldy4KCiAgICBFeGFtcGxlCgogICAgYGBgamF2YXNjcmlwdAogICAg dmFyIE15VmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKHsKICAgICAgdGVtcGxh dGU6IEVtYmVyLkhhbmRsZWJhcnMuY29tcGlsZSgnQ2hpbGQgdmlldzoge3tv dXRsZXQgIm1haW4ifX0gJykKICAgIH0pOwogICAgdmFyIG15VmlldyA9IE15 Vmlldy5jcmVhdGUoKTsKICAgIG15Vmlldy5hcHBlbmRUbygnYm9keScpOwog ICAgLy8gVGhlIGh0bWwgZm9yIG15VmlldyBub3cgbG9va3MgbGlrZToKICAg IC8vIDxkaXYgaWQ9ImVtYmVyMjI4IiBjbGFzcz0iZW1iZXItdmlldyI+Q2hp bGQgdmlldzogPC9kaXY+CgogICAgdmFyIEZvb1ZpZXcgPSBFbWJlci5WaWV3 LmV4dGVuZCh7CiAgICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJzLmNv bXBpbGUoJzxoMT5Gb288L2gxPiAnKQogICAgfSk7CiAgICB2YXIgZm9vVmll dyA9IEZvb1ZpZXcuY3JlYXRlKCk7CiAgICBteVZpZXcuY29ubmVjdE91dGxl dCgnbWFpbicsIGZvb1ZpZXcpOwogICAgLy8gVGhlIGh0bWwgZm9yIG15Vmll dyBub3cgbG9va3MgbGlrZToKICAgIC8vIDxkaXYgaWQ9ImVtYmVyMjI4IiBj bGFzcz0iZW1iZXItdmlldyI+Q2hpbGQgdmlldzoKICAgIC8vICAgPGRpdiBp ZD0iZW1iZXIyMzQiIGNsYXNzPSJlbWJlci12aWV3Ij48aDE+Rm9vPC9oMT4g PC9kaXY+CiAgICAvLyA8L2Rpdj4KICAgIGBgYAogICAgQG1ldGhvZCBjb25u ZWN0T3V0bGV0CiAgICBAcGFyYW0gIHtTdHJpbmd9IG91dGxldE5hbWUgQSB1 bmlxdWUgbmFtZSBmb3IgdGhlIG91dGxldAogICAgQHBhcmFtICB7T2JqZWN0 fSB2aWV3ICAgICAgIEFuIEVtYmVyLlZpZXcKICAgKi8KICBjb25uZWN0T3V0 bGV0OiBmdW5jdGlvbihvdXRsZXROYW1lLCB2aWV3KSB7CiAgICBpZiAodGhp cy5fcGVuZGluZ0Rpc2Nvbm5lY3Rpb25zKSB7CiAgICAgIGRlbGV0ZSB0aGlz Ll9wZW5kaW5nRGlzY29ubmVjdGlvbnNbb3V0bGV0TmFtZV07CiAgICB9Cgog ICAgaWYgKHRoaXMuX2hhc0VxdWl2YWxlbnRWaWV3KG91dGxldE5hbWUsIHZp ZXcpKSB7CiAgICAgIHZpZXcuZGVzdHJveSgpOwogICAgICByZXR1cm47CiAg ICB9CgogICAgdmFyIG91dGxldHMgPSBnZXQodGhpcywgJ19vdXRsZXRzJyks CiAgICAgICAgY29udGFpbmVyID0gZ2V0KHRoaXMsICdjb250YWluZXInKSwK ICAgICAgICByb3V0ZXIgPSBjb250YWluZXIgJiYgY29udGFpbmVyLmxvb2t1 cCgncm91dGVyOm1haW4nKSwKICAgICAgICByZW5kZXJlZE5hbWUgPSBnZXQo dmlldywgJ3JlbmRlcmVkTmFtZScpOwoKICAgIHNldChvdXRsZXRzLCBvdXRs ZXROYW1lLCB2aWV3KTsKCiAgICBpZiAocm91dGVyICYmIHJlbmRlcmVkTmFt ZSkgewogICAgICByb3V0ZXIuX2Nvbm5lY3RBY3RpdmVWaWV3KHJlbmRlcmVk TmFtZSwgdmlldyk7CiAgICB9CiAgfSwKCiAgLyoqCiAgICBEZXRlcm1pbmVz IGlmIHRoZSB2aWV3IGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCBieSBjaGVj a2luZyBpZgogICAgdGhlIHZpZXcgaGFzIHRoZSBzYW1lIGNvbnN0cnVjdG9y LCB0ZW1wbGF0ZSwgYW5kIGNvbnRleHQgYXMgdGhlCiAgICB2aWV3IGluIHRo ZSBgX291dGxldHNgIG9iamVjdC4KCiAgICBAcHJpdmF0ZQogICAgQG1ldGhv ZCBfaGFzRXF1aXZhbGVudFZpZXcKICAgIEBwYXJhbSAge1N0cmluZ30gb3V0 bGV0TmFtZSBUaGUgbmFtZSBvZiB0aGUgb3V0bGV0IHdlIGFyZSBjaGVja2lu ZwogICAgQHBhcmFtICB7T2JqZWN0fSB2aWV3ICAgICAgIEFuIEVtYmVyLlZp ZXcKICAgIEByZXR1cm4ge0Jvb2xlYW59CiAgICovCiAgX2hhc0VxdWl2YWxl bnRWaWV3OiBmdW5jdGlvbihvdXRsZXROYW1lLCB2aWV3KSB7CiAgICB2YXIg ZXhpc3RpbmdWaWV3ID0gZ2V0KHRoaXMsICdfb3V0bGV0cy4nK291dGxldE5h bWUpOwogICAgcmV0dXJuIGV4aXN0aW5nVmlldyAmJgogICAgICBleGlzdGlu Z1ZpZXcuY29uc3RydWN0b3IgPT09IHZpZXcuY29uc3RydWN0b3IgJiYKICAg ICAgZXhpc3RpbmdWaWV3LmdldCgndGVtcGxhdGUnKSA9PT0gdmlldy5nZXQo J3RlbXBsYXRlJykgJiYKICAgICAgZXhpc3RpbmdWaWV3LmdldCgnY29udGV4 dCcpID09PSB2aWV3LmdldCgnY29udGV4dCcpOwogIH0sCgogIC8qKgogICAg UmVtb3ZlcyBhbiBvdXRsZXQgZnJvbSB0aGUgdmlldy4KCiAgICBFeGFtcGxl CgogICAgYGBgamF2YXNjcmlwdAogICAgdmFyIE15VmlldyA9IEVtYmVyLlZp ZXcuZXh0ZW5kKHsKICAgICAgdGVtcGxhdGU6IEVtYmVyLkhhbmRsZWJhcnMu Y29tcGlsZSgnQ2hpbGQgdmlldzoge3tvdXRsZXQgIm1haW4ifX0gJykKICAg IH0pOwogICAgdmFyIG15VmlldyA9IE15Vmlldy5jcmVhdGUoKTsKICAgIG15 Vmlldy5hcHBlbmRUbygnYm9keScpOwogICAgLy8gbXlWaWV3J3MgaHRtbDoK ICAgIC8vIDxkaXYgaWQ9ImVtYmVyMjI4IiBjbGFzcz0iZW1iZXItdmlldyI+ Q2hpbGQgdmlldzogPC9kaXY+CgogICAgdmFyIEZvb1ZpZXcgPSBFbWJlci5W aWV3LmV4dGVuZCh7CiAgICAgIHRlbXBsYXRlOiBFbWJlci5IYW5kbGViYXJz LmNvbXBpbGUoJzxoMT5Gb288L2gxPiAnKQogICAgfSk7CiAgICB2YXIgZm9v VmlldyA9IEZvb1ZpZXcuY3JlYXRlKCk7CiAgICBteVZpZXcuY29ubmVjdE91 dGxldCgnbWFpbicsIGZvb1ZpZXcpOwogICAgLy8gbXlWaWV3J3MgaHRtbDoK ICAgIC8vIDxkaXYgaWQ9ImVtYmVyMjI4IiBjbGFzcz0iZW1iZXItdmlldyI+ Q2hpbGQgdmlldzoKICAgIC8vICAgPGRpdiBpZD0iZW1iZXIyMzQiIGNsYXNz PSJlbWJlci12aWV3Ij48aDE+Rm9vPC9oMT4gPC9kaXY+CiAgICAvLyA8L2Rp dj4KCiAgICBteVZpZXcuZGlzY29ubmVjdE91dGxldCgnbWFpbicpOwogICAg Ly8gbXlWaWV3J3MgaHRtbDoKICAgIC8vIDxkaXYgaWQ9ImVtYmVyMjI4IiBj bGFzcz0iZW1iZXItdmlldyI+Q2hpbGQgdmlldzogPC9kaXY+CiAgICBgYGAK CiAgICBAbWV0aG9kIGRpc2Nvbm5lY3RPdXRsZXQKICAgIEBwYXJhbSAge1N0 cmluZ30gb3V0bGV0TmFtZSBUaGUgbmFtZSBvZiB0aGUgb3V0bGV0IHRvIGJl IHJlbW92ZWQKICAgKi8KICBkaXNjb25uZWN0T3V0bGV0OiBmdW5jdGlvbihv dXRsZXROYW1lKSB7CiAgICBpZiAoIXRoaXMuX3BlbmRpbmdEaXNjb25uZWN0 aW9ucykgewogICAgICB0aGlzLl9wZW5kaW5nRGlzY29ubmVjdGlvbnMgPSB7 fTsKICAgIH0KICAgIHRoaXMuX3BlbmRpbmdEaXNjb25uZWN0aW9uc1tvdXRs ZXROYW1lXSA9IHRydWU7CiAgICBFbWJlci5ydW4ub25jZSh0aGlzLCAnX2Zp bmlzaERpc2Nvbm5lY3Rpb25zJyk7CiAgfSwKCiAgLyoqCiAgICBHZXRzIGFu IG91dGxldCB0aGF0IGlzIHBlbmRpbmcgZGlzY29ubmVjdGlvbiBhbmQgdGhl bgogICAgbnVsbGlmeXMgdGhlIG9iamVjdCBvbiB0aGUgYF9vdXRsZXRgIG9i amVjdC4KCiAgICBAcHJpdmF0ZQogICAgQG1ldGhvZCBfZmluaXNoRGlzY29u bmVjdGlvbnMKICAgKi8KICBfZmluaXNoRGlzY29ubmVjdGlvbnM6IGZ1bmN0 aW9uKCkgewogICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQpIHJldHVybjsgLy8g X291dGxldHMgd2lsbCBiZSBnb25lIGFueXdheQogICAgdmFyIG91dGxldHMg PSBnZXQodGhpcywgJ19vdXRsZXRzJyk7CiAgICB2YXIgcGVuZGluZ0Rpc2Nv bm5lY3Rpb25zID0gdGhpcy5fcGVuZGluZ0Rpc2Nvbm5lY3Rpb25zOwogICAg dGhpcy5fcGVuZGluZ0Rpc2Nvbm5lY3Rpb25zID0gbnVsbDsKCiAgICBmb3Ig KHZhciBvdXRsZXROYW1lIGluIHBlbmRpbmdEaXNjb25uZWN0aW9ucykgewog ICAgICBzZXQob3V0bGV0cywgb3V0bGV0TmFtZSwgbnVsbCk7CiAgICB9CiAg fQp9KTsKCn0pKCk7CgoKCihmdW5jdGlvbigpIHsKLyoqCkBtb2R1bGUgZW1i ZXIKQHN1Ym1vZHVsZSBlbWJlci12aWV3cwoqLwoKLy8gQWRkIGEgbmV3IG5h bWVkIHF1ZXVlIGFmdGVyIHRoZSAnYWN0aW9ucycgcXVldWUgKHdoZXJlIFJT VlAgcHJvbWlzZXMKLy8gcmVzb2x2ZSksIHdoaWNoIGlzIHVzZWQgaW4gcm91 dGVyIHRyYW5zaXRpb25zIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkKLy8gbG9h ZGluZyBzdGF0ZSBlbnRyeSBpZiBhbGwgY29udGV4dCBwcm9taXNlcyByZXNv bHZlIG9uIHRoZSAKLy8gJ2FjdGlvbnMnIHF1ZXVlIGZpcnN0LgoKdmFyIHF1 ZXVlcyA9IEVtYmVyLnJ1bi5xdWV1ZXMsCiAgICBpbmRleE9mID0gRW1iZXIu QXJyYXlQb2x5ZmlsbHMuaW5kZXhPZjsKcXVldWVzLnNwbGljZShpbmRleE9m LmNhbGwocXVldWVzLCAnYWN0aW9ucycpICsgMSwgMCwgJ3JvdXRlclRyYW5z aXRpb25zJyk7Cgp9KSgpOwoKCgooZnVuY3Rpb24oKSB7Ci8qKgpAbW9kdWxl IGVtYmVyCkBzdWJtb2R1bGUgZW1iZXItcm91dGluZwoqLwoKdmFyIGdldCA9 IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwoKLyoqCiAgRW1iZXIuTG9j YXRpb24gcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgY29ycmVjdCBpbXBs ZW1lbnRhdGlvbiBvZgogIHRoZSBgbG9jYXRpb25gIEFQSS4KCiAgIyMgSW1w bGVtZW50YXRpb25zCgogIFlvdSBjYW4gcGFzcyBhbiBpbXBsZW1lbnRhdGlv biBuYW1lIChgaGFzaGAsIGBoaXN0b3J5YCwgYG5vbmVgKSB0byBmb3JjZSBh CiAgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbiB0byBiZSB1c2VkIGluIHlv dXIgYXBwbGljYXRpb24uCgogICMjIyBIYXNoTG9jYXRpb24KCiAgVXNpbmcg YEhhc2hMb2NhdGlvbmAgcmVzdWx0cyBpbiBVUkxzIHdpdGggYSBgI2AgKGhh c2ggc2lnbikgc2VwYXJhdGluZyB0aGUKICBzZXJ2ZXIgc2lkZSBVUkwgcG9y dGlvbiBvZiB0aGUgVVJMIGZyb20gdGhlIHBvcnRpb24gdGhhdCBpcyB1c2Vk IGJ5IEVtYmVyLgogIFRoaXMgcmVsaWVzIHVwb24gdGhlIGBoYXNoY2hhbmdl YCBldmVudCBleGlzdGluZyBpbiB0aGUgYnJvd3Nlci4KCiAgRXhhbXBsZToK CiAgYGBgamF2YXNjcmlwdAogIEFwcC5Sb3V0ZXIubWFwKGZ1bmN0aW9uKCkg ewogICAgdGhpcy5yZXNvdXJjZSgncG9zdHMnLCBmdW5jdGlvbigpIHsKICAg ICAgdGhpcy5yb3V0ZSgnbmV3Jyk7CiAgICB9KTsKICB9KTsKCiAgQXBwLlJv dXRlci5yZW9wZW4oewogICAgbG9jYXRpb246ICdoYXNoJwogIH0pOwogIGBg YAoKICBUaGlzIHdpbGwgcmVzdWx0IGluIGEgcG9zdHMubmV3IHVybCBvZiBg LyMvcG9zdHMvbmV3YC4KCiAgIyMjIEhpc3RvcnlMb2NhdGlvbgoKICBVc2lu ZyBgSGlzdG9yeUxvY2F0aW9uYCByZXN1bHRzIGluIFVSTHMgdGhhdCBhcmUg aW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhCiAgc3RhbmRhcmQgVVJMLiBUaGlz IHJlbGllcyB1cG9uIHRoZSBicm93c2VyJ3MgYGhpc3RvcnlgIEFQSS4KCiAg RXhhbXBsZToKCiAgYGBgamF2YXNjcmlwdAogIEFwcC5Sb3V0ZXIubWFwKGZ1 bmN0aW9uKCkgewogICAgdGhpcy5yZXNvdXJjZSgncG9zdHMnLCBmdW5jdGlv bigpIHsKICAgICAgdGhpcy5yb3V0ZSgnbmV3Jyk7CiAgICB9KTsKICB9KTsK CiAgQXBwLlJvdXRlci5yZW9wZW4oewogICAgbG9jYXRpb246ICdoaXN0b3J5 JwogIH0pOwogIGBgYAoKICBUaGlzIHdpbGwgcmVzdWx0IGluIGEgcG9zdHMu bmV3IHVybCBvZiBgL3Bvc3RzL25ld2AuCgogIEtlZXAgaW4gbWluZCB0aGF0 IHlvdXIgc2VydmVyIG11c3Qgc2VydmUgdGhlIEVtYmVyIGFwcCBhdCBhbGwg dGhlIHJvdXRlcyB5b3UKICBkZWZpbmUuCgogICMjIyBBdXRvTG9jYXRpb24K CiAgVXNpbmcgYEF1dG9Mb2NhdGlvbmAsIHRoZSByb3V0ZXIgd2lsbCB1c2Ug dGhlIGJlc3QgTG9jYXRpb24gY2xhc3Mgc3VwcG9ydGVkIGJ5CiAgdGhlIGJy b3dzZXIgaXQgaXMgcnVubmluZyBpbi4KCiAgQnJvd3NlcnMgdGhhdCBzdXBw b3J0IHRoZSBgaGlzdG9yeWAgQVBJIHdpbGwgdXNlIGBIaXN0b3J5TG9jYXRp b25gLCB0aG9zZSB0aGF0CiAgZG8gbm90LCBidXQgc3RpbGwgc3VwcG9ydCB0 aGUgYGhhc2hjaGFuZ2VgIGV2ZW50IHdpbGwgdXNlIGBIYXNoTG9jYXRpb25g LCBhbmQKICBpbiB0aGUgcmFyZSBjYXNlIG5laXRoZXIgaXMgc3VwcG9ydGVk IHdpbGwgdXNlIGBOb25lTG9jYXRpb25gLgoKICBFeGFtcGxlOgoKICBgYGBq YXZhc2NyaXB0CiAgQXBwLlJvdXRlci5tYXAoZnVuY3Rpb24oKSB7CiAgICB0 aGlzLnJlc291cmNlKCdwb3N0cycsIGZ1bmN0aW9uKCkgewogICAgICB0aGlz LnJvdXRlKCduZXcnKTsKICAgIH0pOwogIH0pOwoKICBBcHAuUm91dGVyLnJl b3Blbih7CiAgICBsb2NhdGlvbjogJ2F1dG8nCiAgfSk7CiAgYGBgCgogIFRo aXMgd2lsbCByZXN1bHQgaW4gYSBwb3N0cy5uZXcgdXJsIG9mIGAvcG9zdHMv bmV3YCBmb3IgbW9kZXJuIGJyb3dzZXJzIHRoYXQKICBzdXBwb3J0IHRoZSBg aGlzdG9yeWAgYXBpIG9yIGAvIy9wb3N0cy9uZXdgIGZvciBvbGRlciBvbmVz LCBsaWtlIEludGVybmV0CiAgRXhwbG9yZXIgOSBhbmQgYmVsb3cuCgogIFdo ZW4gYSB1c2VyIHZpc2l0cyBhIGxpbmsgdG8geW91ciBhcHBsaWNhdGlvbiwg dGhleSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkKICB1cGdyYWRlZCBvciBkb3du Z3JhZGVkIHRvIHRoZSBhcHByb3ByaWF0ZSBgTG9jYXRpb25gIGNsYXNzLCB3 aXRoIHRoZSBVUkwKICB0cmFuc2Zvcm1lZCBhY2NvcmRpbmdseSwgaWYgbmVl ZGVkLgoKICBLZWVwIGluIG1pbmQgdGhhdCBzaW5jZSBzb21lIG9mIHlvdXIg dXNlcnMgd2lsbCB1c2UgYEhpc3RvcnlMb2NhdGlvbmAsIHlvdXIKICBzZXJ2 ZXIgbXVzdCBzZXJ2ZSB0aGUgRW1iZXIgYXBwIGF0IGFsbCB0aGUgcm91dGVz IHlvdSBkZWZpbmUuCgogICMjIyBOb25lTG9jYXRpb24KCiAgVXNpbmcgYE5v bmVMb2NhdGlvbmAgY2F1c2VzIEVtYmVyIHRvIG5vdCBzdG9yZSB0aGUgYXBw bGljYXRpb25zIFVSTCBzdGF0ZQogIGluIHRoZSBhY3R1YWwgVVJMLiBUaGlz IGlzIGdlbmVyYWxseSB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLCBhbmQg aXMgb25lCiAgb2YgdGhlIGNoYW5nZXMgbWFkZSB3aGVuIGNhbGxpbmcgYEFw cC5zZXR1cEZvclRlc3RpbmcoKWAuCgogICMjIExvY2F0aW9uIEFQSQoKICBF YWNoIGxvY2F0aW9uIGltcGxlbWVudGF0aW9uIG11c3QgcHJvdmlkZSB0aGUg Zm9sbG93aW5nIG1ldGhvZHM6CgogICogaW1wbGVtZW50YXRpb246IHJldHVy bnMgdGhlIHN0cmluZyBuYW1lIHVzZWQgdG8gcmVmZXJlbmNlIHRoZSBpbXBs ZW1lbnRhdGlvbi4KICAqIGdldFVSTDogcmV0dXJucyB0aGUgY3VycmVudCBV UkwuCiAgKiBzZXRVUkwocGF0aCk6IHNldHMgdGhlIGN1cnJlbnQgVVJMLgog ICogcmVwbGFjZVVSTChwYXRoKTogcmVwbGFjZSB0aGUgY3VycmVudCBVUkwg KG9wdGlvbmFsKS4KICAqIG9uVXBkYXRlVVJMKGNhbGxiYWNrKTogdHJpZ2dl cnMgdGhlIGNhbGxiYWNrIHdoZW4gdGhlIFVSTCBjaGFuZ2VzLgogICogZm9y bWF0VVJMKHVybCk6IGZvcm1hdHMgYHVybGAgdG8gYmUgcGxhY2VkIGludG8g YGhyZWZgIGF0dHJpYnV0ZS4KCiAgQ2FsbGluZyBzZXRVUkwgb3IgcmVwbGFj ZVVSTCB3aWxsIG5vdCB0cmlnZ2VyIG9uVXBkYXRlVVJMIGNhbGxiYWNrcy4K CiAgQGNsYXNzIExvY2F0aW9uCiAgQG5hbWVzcGFjZSBFbWJlcgogIEBzdGF0 aWMKKi8KRW1iZXIuTG9jYXRpb24gPSB7CiAgLyoqCiAgIFRoaXMgaXMgZGVw cmVjYXRlZCBpbiBmYXZvciBvZiB1c2luZyB0aGUgY29udGFpbmVyIHRvIGxv b2t1cCB0aGUgbG9jYXRpb24KICAgaW1wbGVtZW50YXRpb24gYXMgZGVzaXJl ZC4KCiAgIEZvciBleGFtcGxlOgoKICAgYGBgamF2YXNjcmlwdAogICAvLyBH aXZlbiBhIGxvY2F0aW9uIHJlZ2lzdGVyZWQgYXMgZm9sbG93czoKICAgY29u dGFpbmVyLnJlZ2lzdGVyKCdsb2NhdGlvbjpoaXN0b3J5LXRlc3QnLCBIaXN0 b3J5VGVzdExvY2F0aW9uKTsKCiAgIC8vIFlvdSBjb3VsZCBjcmVhdGUgYSBu ZXcgaW5zdGFuY2UgdmlhOgogICBjb250YWluZXIubG9va3VwKCdsb2NhdGlv bjpoaXN0b3J5LXRlc3QnKTsKICAgYGBgCgogICAgQG1ldGhvZCBjcmVhdGUK ICAgIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zCiAgICBAcmV0dXJuIHtPYmpl Y3R9IGFuIGluc3RhbmNlIG9mIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBg bG9jYXRpb25gIEFQSQogICAgQGRlcHJlY2F0ZWQgVXNlIHRoZSBjb250YWlu ZXIgdG8gbG9va3VwIHRoZSBsb2NhdGlvbiBpbXBsZW1lbnRhdGlvbiB0aGF0 IHlvdQogICAgbmVlZC4KICAqLwogIGNyZWF0ZTogZnVuY3Rpb24ob3B0aW9u cykgewogICAgdmFyIGltcGxlbWVudGF0aW9uID0gb3B0aW9ucyAmJiBvcHRp b25zLmltcGxlbWVudGF0aW9uOwogICAgRW1iZXIuYXNzZXJ0KCJFbWJlci5M b2NhdGlvbi5jcmVhdGU6IHlvdSBtdXN0IHNwZWNpZnkgYSAnaW1wbGVtZW50 YXRpb24nIG9wdGlvbiIsICEhaW1wbGVtZW50YXRpb24pOwoKICAgIHZhciBp bXBsZW1lbnRhdGlvbkNsYXNzID0gdGhpcy5pbXBsZW1lbnRhdGlvbnNbaW1w bGVtZW50YXRpb25dOwogICAgRW1iZXIuYXNzZXJ0KCJFbWJlci5Mb2NhdGlv bi5jcmVhdGU6ICIgKyBpbXBsZW1lbnRhdGlvbiArICIgaXMgbm90IGEgdmFs aWQgaW1wbGVtZW50YXRpb24iLCAhIWltcGxlbWVudGF0aW9uQ2xhc3MpOwoK ICAgIHJldHVybiBpbXBsZW1lbnRhdGlvbkNsYXNzLmNyZWF0ZS5hcHBseShp bXBsZW1lbnRhdGlvbkNsYXNzLCBhcmd1bWVudHMpOwogIH0sCgogIC8qKgog ICBUaGlzIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgdXNpbmcgdGhlIGNv bnRhaW5lciB0byByZWdpc3RlciB0aGUKICAgbG9jYXRpb24gaW1wbGVtZW50 YXRpb24gYXMgZGVzaXJlZC4KCiAgIEV4YW1wbGU6CgogICBgYGBqYXZhc2Ny aXB0CiAgIEFwcGxpY2F0aW9uLmluaXRpYWxpemVyKHsKICAgIG5hbWU6ICJo aXN0b3J5LXRlc3QtbG9jYXRpb24iLAoKICAgIGluaXRpYWxpemU6IGZ1bmN0 aW9uKGNvbnRhaW5lciwgYXBwbGljYXRpb24pIHsKICAgICAgYXBwbGljYXRp b24ucmVnaXN0ZXIoJ2xvY2F0aW9uOmhpc3RvcnktdGVzdCcsIEhpc3RvcnlU ZXN0TG9jYXRpb24pOwogICAgfQogICB9KTsKICAgYGBgCgogICBAbWV0aG9k IHJlZ2lzdGVySW1wbGVtZW50YXRpb24KICAgQHBhcmFtIHtTdHJpbmd9IG5h bWUKICAgQHBhcmFtIHtPYmplY3R9IGltcGxlbWVudGF0aW9uIG9mIHRoZSBg bG9jYXRpb25gIEFQSQogICBAZGVwcmVjYXRlZCBSZWdpc3RlciB5b3VyIGN1 c3RvbSBsb2NhdGlvbiBpbXBsZW1lbnRhdGlvbiB3aXRoIHRoZQogICBjb250 YWluZXIgZGlyZWN0bHkuCiAgKi8KICByZWdpc3RlckltcGxlbWVudGF0aW9u OiBmdW5jdGlvbihuYW1lLCBpbXBsZW1lbnRhdGlvbikgewogICAgRW1iZXIu ZGVwcmVjYXRlKCdVc2luZyB0aGUgRW1iZXIuTG9jYXRpb24ucmVnaXN0ZXJJ bXBsZW1lbnRhdGlvbiBpcyBubyBsb25nZXIgc3VwcG9ydGVkLiBSZWdpc3Rl ciB5b3VyIGN1c3RvbSBsb2NhdGlvbiBpbXBsZW1lbnRhdGlvbiB3aXRoIHRo ZSBjb250YWluZXIgaW5zdGVhZC4nLCBmYWxzZSk7CgogICAgdGhpcy5pbXBs ZW1lbnRhdGlvbnNbbmFtZV0gPSBpbXBsZW1lbnRhdGlvbjsKICB9LAoKICBp bXBsZW1lbnRhdGlvbnM6IHt9LAoKICAvKioKICAgIFJldHVybnMgdGhlIGN1 cnJlbnQgYGxvY2F0aW9uLmhhc2hgIGJ5IHBhcnNpbmcgbG9jYXRpb24uaHJl ZiBzaW5jZSBicm93c2VycwogICAgaW5jb25zaXN0ZW50bHkgVVJMLWRlY29k ZSBgbG9jYXRpb24uaGFzaGAuCiAgCiAgICBodHRwczovL2J1Z3ppbGxhLm1v emlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD00ODMzMDQKCiAgICBAcHJpdmF0 ZQogICAgQG1ldGhvZCBnZXRIYXNoCiAgKi8KICBnZXRIYXNoOiBmdW5jdGlv biAoKSB7CiAgICB2YXIgaHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLAog ICAgICAgIGhhc2hJbmRleCA9IGhyZWYuaW5kZXhPZignIycpOwoKICAgIGlm IChoYXNoSW5kZXggPT09IC0xKSB7CiAgICAgIHJldHVybiAnJzsKICAgIH0g ZWxzZSB7CiAgICAgIHJldHVybiBocmVmLnN1YnN0cihoYXNoSW5kZXgpOwog ICAgfQogIH0KfTsKCn0pKCk7CgoKCihmdW5jdGlvbigpIHsKLyoqCkBtb2R1 bGUgZW1iZXIKQHN1Ym1vZHVsZSBlbWJlci1yb3V0aW5nCiovCgp2YXIgZ2V0 ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7CgovKioKICBFbWJlci5O b25lTG9jYXRpb24gZG9lcyBub3QgaW50ZXJhY3Qgd2l0aCB0aGUgYnJvd3Nl ci4gSXQgaXMgdXNlZnVsIGZvcgogIHRlc3RpbmcsIG9yIHdoZW4geW91IG5l ZWQgdG8gbWFuYWdlIHN0YXRlIHdpdGggeW91ciBSb3V0ZXIsIGJ1dCB0ZW1w b3JhcmlseQogIGRvbid0IHdhbnQgaXQgdG8gbXVjayB3aXRoIHRoZSBVUkwg KGZvciBleGFtcGxlIHdoZW4geW91IGVtYmVkIHlvdXIKICBhcHBsaWNhdGlv biBpbiBhIGxhcmdlciBwYWdlKS4KCiAgQGNsYXNzIE5vbmVMb2NhdGlvbgog IEBuYW1lc3BhY2UgRW1iZXIKICBAZXh0ZW5kcyBFbWJlci5PYmplY3QKKi8K RW1iZXIuTm9uZUxvY2F0aW9uID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CiAg aW1wbGVtZW50YXRpb246ICdub25lJywKICBwYXRoOiAnJywKCiAgLyoqCiAg ICBSZXR1cm5zIHRoZSBjdXJyZW50IHBhdGguCgogICAgQHByaXZhdGUKICAg IEBtZXRob2QgZ2V0VVJMCiAgICBAcmV0dXJuIHtTdHJpbmd9IHBhdGgKICAq LwogIGdldFVSTDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gZ2V0KHRoaXMs ICdwYXRoJyk7CiAgfSwKCiAgLyoqCiAgICBTZXQgdGhlIHBhdGggYW5kIHJl bWVtYmVycyB3aGF0IHdhcyBzZXQuIFVzaW5nIHRoaXMgbWV0aG9kCiAgICB0 byBjaGFuZ2UgdGhlIHBhdGggd2lsbCBub3QgaW52b2tlIHRoZSBgdXBkYXRl VVJMYCBjYWxsYmFjay4KCiAgICBAcHJpdmF0ZQogICAgQG1ldGhvZCBzZXRV UkwKICAgIEBwYXJhbSBwYXRoIHtTdHJpbmd9CiAgKi8KICBzZXRVUkw6IGZ1 bmN0aW9uKHBhdGgpIHsKICAgIHNldCh0aGlzLCAncGF0aCcsIHBhdGgpOwog IH0sCgogIC8qKgogICAgUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZv a2VkIHdoZW4gdGhlIHBhdGggY2hhbmdlcy4gVGhlc2UKICAgIGNhbGxiYWNr cyB3aWxsIGV4ZWN1dGUgd2hlbiB0aGUgdXNlciBwcmVzc2VzIHRoZSBiYWNr IG9yIGZvcndhcmQKICAgIGJ1dHRvbiwgYnV0IG5vdCBhZnRlciBgc2V0VVJM YCBpcyBpbnZva2VkLgoKICAgIEBwcml2YXRlCiAgICBAbWV0aG9kIG9uVXBk YXRlVVJMCiAgICBAcGFyYW0gY2FsbGJhY2sge0Z1bmN0aW9ufQogICovCiAg b25VcGRhdGVVUkw6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICB0aGlzLnVw ZGF0ZUNhbGxiYWNrID0gY2FsbGJhY2s7CiAgfSwKCiAgLyoqCiAgICBTZXRz IHRoZSBwYXRoIGFuZCBjYWxscyB0aGUgYHVwZGF0ZVVSTGAgY2FsbGJhY2su CgogICAgQHByaXZhdGUKICAgIEBtZXRob2QgaGFuZGxlVVJMCiAgICBAcGFy YW0gY2FsbGJhY2sge0Z1bmN0aW9ufQogICovCiAgaGFuZGxlVVJMOiBmdW5j dGlvbih1cmwpIHsKICAgIHNldCh0aGlzLCAncGF0aCcsIHVybCk7CiAgICB0 aGlzLnVwZGF0ZUNhbGxiYWNrKHVybCk7CiAgfSwKCiAgLyoqCiAgICBHaXZl biBhIFVSTCwgZm9ybWF0cyBpdCB0byBiZSBwbGFjZWQgaW50byB0aGUgcGFn ZSBhcyBwYXJ0CiAgICBvZiBhbiBlbGVtZW50J3MgYGhyZWZgIGF0dHJpYnV0 ZS4KCiAgICBUaGlzIGlzIHVzZWQsIGZvciBleGFtcGxlLCB3aGVuIHVzaW5n IHRoZSB7e2FjdGlvbn19IGhlbHBlcgogICAgdG8gZ2VuZXJhdGUgYSBVUkwg YmFzZWQgb24gYW4gZXZlbnQuCgogICAgQHByaXZhdGUKICAgIEBtZXRob2Qg Zm9ybWF0VVJMCiAgICBAcGFyYW0gdXJsIHtTdHJpbmd9CiAgICBAcmV0dXJu IHtTdHJpbmd9IHVybAogICovCiAgZm9ybWF0VVJMOiBmdW5jdGlvbih1cmwp IHsKICAgIC8vIFRoZSByZXR1cm4gdmFsdWUgaXMgbm90IG92ZXJseSBtZWFu aW5nZnVsLCBidXQgd2UgZG8gbm90IHdhbnQgdG8gdGhyb3cKICAgIC8vIGVy cm9ycyB3aGVuIHRlc3QgY29kZSByZW5kZXJzIHRlbXBsYXRlcyBjb250YWlu aW5nIHt7YWN0aW9uIGhyZWY9dHJ1ZX19CiAgICAvLyBoZWxwZXJzLgogICAg cmV0dXJuIHVybDsKICB9Cn0pOwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewov KioKQG1vZHVsZSBlbWJlcgpAc3VibW9kdWxlIGVtYmVyLXJvdXRpbmcKKi8K CnZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwKICAgIGdl dEhhc2ggPSBFbWJlci5Mb2NhdGlvbi5nZXRIYXNoOwoKLyoqCiAgYEVtYmVy Lkhhc2hMb2NhdGlvbmAgaW1wbGVtZW50cyB0aGUgbG9jYXRpb24gQVBJIHVz aW5nIHRoZSBicm93c2VyJ3MKICBoYXNoLiBBdCBwcmVzZW50LCBpdCByZWxp ZXMgb24gYSBgaGFzaGNoYW5nZWAgZXZlbnQgZXhpc3RpbmcgaW4gdGhlCiAg YnJvd3Nlci4KCiAgQGNsYXNzIEhhc2hMb2NhdGlvbgogIEBuYW1lc3BhY2Ug RW1iZXIKICBAZXh0ZW5kcyBFbWJlci5PYmplY3QKKi8KRW1iZXIuSGFzaExv Y2F0aW9uID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CiAgaW1wbGVtZW50YXRp b246ICdoYXNoJywKCiAgaW5pdDogZnVuY3Rpb24oKSB7CiAgICBzZXQodGhp cywgJ2xvY2F0aW9uJywgZ2V0KHRoaXMsICdsb2NhdGlvbicpIHx8IHdpbmRv dy5sb2NhdGlvbik7CiAgfSwKCiAgLyoqCiAgICBSZXR1cm5zIHRoZSBjdXJy ZW50IGBsb2NhdGlvbi5oYXNoYCwgbWludXMgdGhlICcjJyBhdCB0aGUgZnJv bnQuCgogICAgQHByaXZhdGUKICAgIEBtZXRob2QgZ2V0VVJMCiAgKi8KICBn ZXRVUkw6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGdldEhhc2goKS5zdWJz dHIoMSk7CiAgfSwKCiAgLyoqCiAgICBTZXQgdGhlIGBsb2NhdGlvbi5oYXNo YCBhbmQgcmVtZW1iZXJzIHdoYXQgd2FzIHNldC4gVGhpcyBwcmV2ZW50cwog ICAgYG9uVXBkYXRlVVJMYCBjYWxsYmFja3MgZnJvbSB0cmlnZ2VyaW5nIHdo ZW4gdGhlIGhhc2ggd2FzIHNldCBieQogICAgYEhhc2hMb2NhdGlvbmAuCgog ICAgQHByaXZhdGUKICAgIEBtZXRob2Qgc2V0VVJMCiAgICBAcGFyYW0gcGF0 aCB7U3RyaW5nfQogICovCiAgc2V0VVJMOiBmdW5jdGlvbihwYXRoKSB7CiAg ICBnZXQodGhpcywgJ2xvY2F0aW9uJykuaGFzaCA9IHBhdGg7CiAgICBzZXQo dGhpcywgJ2xhc3RTZXRVUkwnLCBwYXRoKTsKICB9LAoKICAvKioKICAgIFVz ZXMgbG9jYXRpb24ucmVwbGFjZSB0byB1cGRhdGUgdGhlIHVybCB3aXRob3V0 IGEgcGFnZSByZWxvYWQKICAgIG9yIGhpc3RvcnkgbW9kaWZpY2F0aW9uLgoK ICAgIEBwcml2YXRlCiAgICBAbWV0aG9kIHJlcGxhY2VVUkwKICAgIEBwYXJh bSBwYXRoIHtTdHJpbmd9CiAgKi8KICByZXBsYWNlVVJMOiBmdW5jdGlvbihw YXRoKSB7CiAgICBnZXQodGhpcywgJ2xvY2F0aW9uJykucmVwbGFjZSgnIycg KyBwYXRoKTsKICAgIHNldCh0aGlzLCAnbGFzdFNldFVSTCcsIHBhdGgpOwog IH0sCgogIC8qKgogICAgUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZv a2VkIHdoZW4gdGhlIGhhc2ggY2hhbmdlcy4gVGhlc2UKICAgIGNhbGxiYWNr cyB3aWxsIGV4ZWN1dGUgd2hlbiB0aGUgdXNlciBwcmVzc2VzIHRoZSBiYWNr IG9yIGZvcndhcmQKICAgIGJ1dHRvbiwgYnV0IG5vdCBhZnRlciBgc2V0VVJM YCBpcyBpbnZva2VkLgoKICAgIEBwcml2YXRlCiAgICBAbWV0aG9kIG9uVXBk YXRlVVJMCiAgICBAcGFyYW0gY2FsbGJhY2sge0Z1bmN0aW9ufQogICovCiAg b25VcGRhdGVVUkw6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICB2YXIgc2Vs ZiA9IHRoaXM7CiAgICB2YXIgZ3VpZCA9IEVtYmVyLmd1aWRGb3IodGhpcyk7 CgogICAgRW1iZXIuJCh3aW5kb3cpLm9uKCdoYXNoY2hhbmdlLmVtYmVyLWxv Y2F0aW9uLScrZ3VpZCwgZnVuY3Rpb24oKSB7CiAgICAgIEVtYmVyLnJ1bihm dW5jdGlvbigpIHsKICAgICAgICB2YXIgcGF0aCA9IHNlbGYuZ2V0VVJMKCk7 CiAgICAgICAgaWYgKGdldChzZWxmLCAnbGFzdFNldFVSTCcpID09PSBwYXRo KSB7IHJldHVybjsgfQoKICAgICAgICBzZXQoc2VsZiwgJ2xhc3RTZXRVUkwn LCBudWxsKTsKCiAgICAgICAgY2FsbGJhY2socGF0aCk7CiAgICAgIH0pOwog ICAgfSk7CiAgfSwKCiAgLyoqCiAgICBHaXZlbiBhIFVSTCwgZm9ybWF0cyBp dCB0byBiZSBwbGFjZWQgaW50byB0aGUgcGFnZSBhcyBwYXJ0CiAgICBvZiBh biBlbGVtZW50J3MgYGhyZWZgIGF0dHJpYnV0ZS4KCiAgICBUaGlzIGlzIHVz ZWQsIGZvciBleGFtcGxlLCB3aGVuIHVzaW5nIHRoZSB7e2FjdGlvbn19IGhl bHBlcgogICAgdG8gZ2VuZXJhdGUgYSBVUkwgYmFzZWQgb24gYW4gZXZlbnQu CgogICAgQHByaXZhdGUKICAgIEBtZXRob2QgZm9ybWF0VVJMCiAgICBAcGFy YW0gdXJsIHtTdHJpbmd9CiAgKi8KICBmb3JtYXRVUkw6IGZ1bmN0aW9uKHVy bCkgewogICAgcmV0dXJuICcjJyt1cmw7CiAgfSwKCiAgLyoqCiAgICBDbGVh bnMgdXAgdGhlIEhhc2hMb2NhdGlvbiBldmVudCBsaXN0ZW5lci4KCiAgICBA cHJpdmF0ZQogICAgQG1ldGhvZCB3aWxsRGVzdHJveQogICovCiAgd2lsbERl c3Ryb3k6IGZ1bmN0aW9uKCkgewogICAgdmFyIGd1aWQgPSBFbWJlci5ndWlk Rm9yKHRoaXMpOwoKICAgIEVtYmVyLiQod2luZG93KS5vZmYoJ2hhc2hjaGFu Z2UuZW1iZXItbG9jYXRpb24tJytndWlkKTsKICB9Cn0pOwoKfSkoKTsKCgoK KGZ1bmN0aW9uKCkgewovKioKQG1vZHVsZSBlbWJlcgpAc3VibW9kdWxlIGVt YmVyLXJvdXRpbmcKKi8KCnZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVt YmVyLnNldDsKdmFyIHBvcHN0YXRlRmlyZWQgPSBmYWxzZTsKdmFyIHN1cHBv cnRzSGlzdG9yeVN0YXRlID0gd2luZG93Lmhpc3RvcnkgJiYgJ3N0YXRlJyBp biB3aW5kb3cuaGlzdG9yeTsKCi8qKgogIEVtYmVyLkhpc3RvcnlMb2NhdGlv biBpbXBsZW1lbnRzIHRoZSBsb2NhdGlvbiBBUEkgdXNpbmcgdGhlIGJyb3dz ZXIncwogIGhpc3RvcnkucHVzaFN0YXRlIEFQSS4KCiAgQGNsYXNzIEhpc3Rv cnlMb2NhdGlvbgogIEBuYW1lc3BhY2UgRW1iZXIKICBAZXh0ZW5kcyBFbWJl ci5PYmplY3QKKi8KRW1iZXIuSGlzdG9yeUxvY2F0aW9uID0gRW1iZXIuT2Jq ZWN0LmV4dGVuZCh7CiAgaW1wbGVtZW50YXRpb246ICdoaXN0b3J5JywKCiAg aW5pdDogZnVuY3Rpb24oKSB7CiAgICBzZXQodGhpcywgJ2xvY2F0aW9uJywg Z2V0KHRoaXMsICdsb2NhdGlvbicpIHx8IHdpbmRvdy5sb2NhdGlvbik7CiAg ICBzZXQodGhpcywgJ2Jhc2VVUkwnLCBFbWJlci4kKCdiYXNlJykuYXR0cign aHJlZicpIHx8ICcnKTsKICB9LAoKICAvKioKICAgIFVzZWQgdG8gc2V0IHN0 YXRlIG9uIGZpcnN0IGNhbGwgdG8gc2V0VVJMCgogICAgQHByaXZhdGUKICAg IEBtZXRob2QgaW5pdFN0YXRlCiAgKi8KICBpbml0U3RhdGU6IGZ1bmN0aW9u KCkgewogICAgc2V0KHRoaXMsICdoaXN0b3J5JywgZ2V0KHRoaXMsICdoaXN0 b3J5JykgfHwgd2luZG93Lmhpc3RvcnkpOwogICAgdGhpcy5yZXBsYWNlU3Rh dGUodGhpcy5mb3JtYXRVUkwodGhpcy5nZXRVUkwoKSkpOwogIH0sCgogIC8q KgogICAgV2lsbCBiZSBwcmUtcGVuZGVkIHRvIHBhdGggdXBvbiBzdGF0ZSBj aGFuZ2UKCiAgICBAcHJvcGVydHkgcm9vdFVSTAogICAgQGRlZmF1bHQgJy8n CiAgKi8KICByb290VVJMOiAnLycsCgogIC8qKgogICAgUmV0dXJucyB0aGUg Y3VycmVudCBgbG9jYXRpb24ucGF0aG5hbWVgIHdpdGhvdXQgYHJvb3RVUkxg LgoKICAgIEBwcml2YXRlCiAgICBAbWV0aG9kIGdldFVSTAogICAgQHJldHVy biB1cmwge1N0cmluZ30KICAqLwogIGdldFVSTDogZnVuY3Rpb24oKSB7CiAg ICB2YXIgcm9vdFVSTCA9IGdldCh0aGlzLCAncm9vdFVSTCcpLAogICAgICAg IGxvY2F0aW9uID0gZ2V0KHRoaXMsICdsb2NhdGlvbicpLAogICAgICAgIHBh dGggPSBsb2NhdGlvbi5wYXRobmFtZSwKICAgICAgICBiYXNlVVJMID0gZ2V0 KHRoaXMsICdiYXNlVVJMJyk7CgogICAgcm9vdFVSTCA9IHJvb3RVUkwucmVw bGFjZSgvXC8kLywgJycpOwogICAgYmFzZVVSTCA9IGJhc2VVUkwucmVwbGFj ZSgvXC8kLywgJycpOwogICAgdmFyIHVybCA9IHBhdGgucmVwbGFjZShiYXNl VVJMLCAnJykucmVwbGFjZShyb290VVJMLCAnJyk7CgogICAgaWYgKEVtYmVy LkZFQVRVUkVTLmlzRW5hYmxlZCgicXVlcnktcGFyYW1zLW5ldyIpKSB7CiAg ICAgIHZhciBzZWFyY2ggPSBsb2NhdGlvbi5zZWFyY2ggfHwgJyc7CiAgICAg IHVybCArPSBzZWFyY2g7CiAgICB9CgogICAgcmV0dXJuIHVybDsKICB9LAoK ICAvKioKICAgIFVzZXMgYGhpc3RvcnkucHVzaFN0YXRlYCB0byB1cGRhdGUg dGhlIHVybCB3aXRob3V0IGEgcGFnZSByZWxvYWQuCgogICAgQHByaXZhdGUK ICAgIEBtZXRob2Qgc2V0VVJMCiAgICBAcGFyYW0gcGF0aCB7U3RyaW5nfQog ICovCiAgc2V0VVJMOiBmdW5jdGlvbihwYXRoKSB7CiAgICB2YXIgc3RhdGUg PSB0aGlzLmdldFN0YXRlKCk7CiAgICBwYXRoID0gdGhpcy5mb3JtYXRVUkwo cGF0aCk7CgogICAgaWYgKCFzdGF0ZSB8fCBzdGF0ZS5wYXRoICE9PSBwYXRo KSB7CiAgICAgIHRoaXMucHVzaFN0YXRlKHBhdGgpOwogICAgfQogIH0sCgog IC8qKgogICAgVXNlcyBgaGlzdG9yeS5yZXBsYWNlU3RhdGVgIHRvIHVwZGF0 ZSB0aGUgdXJsIHdpdGhvdXQgYSBwYWdlIHJlbG9hZAogICAgb3IgaGlzdG9y eSBtb2RpZmljYXRpb24uCgogICAgQHByaXZhdGUKICAgIEBtZXRob2QgcmVw bGFjZVVSTAogICAgQHBhcmFtIHBhdGgge1N0cmluZ30KICAqLwogIHJlcGxh Y2VVUkw6IGZ1bmN0aW9uKHBhdGgpIHsKICAgIHZhciBzdGF0ZSA9IHRoaXMu Z2V0U3RhdGUoKTsKICAgIHBhdGggPSB0aGlzLmZvcm1hdFVSTChwYXRoKTsK CiAgICBpZiAoIXN0YXRlIHx8IHN0YXRlLnBhdGggIT09IHBhdGgpIHsKICAg ICAgdGhpcy5yZXBsYWNlU3RhdGUocGF0aCk7CiAgICB9CiAgfSwKCiAgLyoq CiAgIEdldCB0aGUgY3VycmVudCBgaGlzdG9yeS5zdGF0ZWAuIENoZWNrcyBm b3IgaWYgYSBwb2x5ZmlsbCBpcwogICByZXF1aXJlZCBhbmQgaWYgc28gZmV0 Y2hlcyB0aGlzLl9oaXN0b3J5U3RhdGUuIFRoZSBzdGF0ZSByZXR1cm5lZAog ICBmcm9tIGdldFN0YXRlIG1heSBiZSBudWxsIGlmIGFuIGlmcmFtZSBoYXMg Y2hhbmdlZCBhIHdpbmRvdydzCiAgIGhpc3RvcnkuCgogICBAcHJpdmF0ZQog ICBAbWV0aG9kIGdldFN0YXRlCiAgIEByZXR1cm4gc3RhdGUge09iamVjdH0K ICAqLwogIGdldFN0YXRlOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBzdXBw b3J0c0hpc3RvcnlTdGF0ZSA/IGdldCh0aGlzLCAnaGlzdG9yeScpLnN0YXRl IDogdGhpcy5faGlzdG9yeVN0YXRlOwogIH0sCgogIC8qKgogICBQdXNoZXMg YSBuZXcgc3RhdGUuCgogICBAcHJpdmF0ZQogICBAbWV0aG9kIHB1c2hTdGF0 ZQogICBAcGFyYW0gcGF0aCB7U3RyaW5nfQogICovCiAgcHVzaFN0YXRlOiBm dW5jdGlvbihwYXRoKSB7CiAgICB2YXIgc3RhdGUgPSB7IHBhdGg6IHBhdGgg fTsKCiAgICBnZXQodGhpcywgJ2hpc3RvcnknKS5wdXNoU3RhdGUoc3RhdGUs IG51bGwsIHBhdGgpOwoKICAgIC8vIHN0b3JlIHN0YXRlIGlmIGJyb3dzZXIg ZG9lc24ndCBzdXBwb3J0IGBoaXN0b3J5LnN0YXRlYAogICAgaWYgKCFzdXBw b3J0c0hpc3RvcnlTdGF0ZSkgewogICAgICB0aGlzLl9oaXN0b3J5U3RhdGUg PSBzdGF0ZTsKICAgIH0KCiAgICAvLyB1c2VkIGZvciB3ZWJraXQgd29ya2Fy b3VuZAogICAgdGhpcy5fcHJldmlvdXNVUkwgPSB0aGlzLmdldFVSTCgpOwog IH0sCgogIC8qKgogICBSZXBsYWNlcyB0aGUgY3VycmVudCBzdGF0ZS4KCiAg IEBwcml2YXRlCiAgIEBtZXRob2QgcmVwbGFjZVN0YXRlCiAgIEBwYXJhbSBw YXRoIHtTdHJpbmd9CiAgKi8KICByZXBsYWNlU3RhdGU6IGZ1bmN0aW9uKHBh dGgpIHsKICAgIHZhciBzdGF0ZSA9IHsgcGF0aDogcGF0aCB9OwoKICAgIGdl dCh0aGlzLCAnaGlzdG9yeScpLnJlcGxhY2VTdGF0ZShzdGF0ZSwgbnVsbCwg cGF0aCk7CgogICAgLy8gc3RvcmUgc3RhdGUgaWYgYnJvd3NlciBkb2Vzbid0 IHN1cHBvcnQgYGhpc3Rvcnkuc3RhdGVgCiAgICBpZiAoIXN1cHBvcnRzSGlz dG9yeVN0YXRlKSB7CiAgICAgIHRoaXMuX2hpc3RvcnlTdGF0ZSA9IHN0YXRl OwogICAgfQoKICAgIC8vIHVzZWQgZm9yIHdlYmtpdCB3b3JrYXJvdW5kCiAg ICB0aGlzLl9wcmV2aW91c1VSTCA9IHRoaXMuZ2V0VVJMKCk7CiAgfSwKCiAg LyoqCiAgICBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hl bmV2ZXIgdGhlIGJyb3dzZXIKICAgIGhpc3RvcnkgY2hhbmdlcywgaW5jbHVk aW5nIHVzaW5nIGZvcndhcmQgYW5kIGJhY2sgYnV0dG9ucy4KCiAgICBAcHJp dmF0ZQogICAgQG1ldGhvZCBvblVwZGF0ZVVSTAogICAgQHBhcmFtIGNhbGxi YWNrIHtGdW5jdGlvbn0KICAqLwogIG9uVXBkYXRlVVJMOiBmdW5jdGlvbihj YWxsYmFjaykgewogICAgdmFyIGd1aWQgPSBFbWJlci5ndWlkRm9yKHRoaXMp LAogICAgICAgIHNlbGYgPSB0aGlzOwoKICAgIEVtYmVyLiQod2luZG93KS5v bigncG9wc3RhdGUuZW1iZXItbG9jYXRpb24tJytndWlkLCBmdW5jdGlvbihl KSB7CiAgICAgIC8vIElnbm9yZSBpbml0aWFsIHBhZ2UgbG9hZCBwb3BzdGF0 ZSBldmVudCBpbiBDaHJvbWUKICAgICAgaWYgKCFwb3BzdGF0ZUZpcmVkKSB7 CiAgICAgICAgcG9wc3RhdGVGaXJlZCA9IHRydWU7CiAgICAgICAgaWYgKHNl bGYuZ2V0VVJMKCkgPT09IHNlbGYuX3ByZXZpb3VzVVJMKSB7IHJldHVybjsg fQogICAgICB9CiAgICAgIGNhbGxiYWNrKHNlbGYuZ2V0VVJMKCkpOwogICAg fSk7CiAgfSwKCiAgLyoqCiAgICBVc2VkIHdoZW4gdXNpbmcgYHt7YWN0aW9u fX1gIGhlbHBlci4gIFRoZSB1cmwgaXMgYWx3YXlzIGFwcGVuZGVkIHRvIHRo ZSByb290VVJMLgoKICAgIEBwcml2YXRlCiAgICBAbWV0aG9kIGZvcm1hdFVS TAogICAgQHBhcmFtIHVybCB7U3RyaW5nfQogICAgQHJldHVybiBmb3JtYXR0 ZWQgdXJsIHtTdHJpbmd9CiAgKi8KICBmb3JtYXRVUkw6IGZ1bmN0aW9uKHVy bCkgewogICAgdmFyIHJvb3RVUkwgPSBnZXQodGhpcywgJ3Jvb3RVUkwnKSwK ICAgICAgICBiYXNlVVJMID0gZ2V0KHRoaXMsICdiYXNlVVJMJyk7CgogICAg aWYgKHVybCAhPT0gJycpIHsKICAgICAgcm9vdFVSTCA9IHJvb3RVUkwucmVw bGFjZSgvXC8kLywgJycpOwogICAgICBiYXNlVVJMID0gYmFzZVVSTC5yZXBs YWNlKC9cLyQvLCAnJyk7CiAgICB9IGVsc2UgaWYoYmFzZVVSTC5tYXRjaCgv XlwvLykgJiYgcm9vdFVSTC5tYXRjaCgvXlwvLykpIHsKICAgICAgYmFzZVVS TCA9IGJhc2VVUkwucmVwbGFjZSgvXC8kLywgJycpOwogICAgfQoKICAgIHJl dHVybiBiYXNlVVJMICsgcm9vdFVSTCArIHVybDsKICB9LAoKICAvKioKICAg IENsZWFucyB1cCB0aGUgSGlzdG9yeUxvY2F0aW9uIGV2ZW50IGxpc3RlbmVy LgoKICAgIEBwcml2YXRlCiAgICBAbWV0aG9kIHdpbGxEZXN0cm95CiAgKi8K ICB3aWxsRGVzdHJveTogZnVuY3Rpb24oKSB7CiAgICB2YXIgZ3VpZCA9IEVt YmVyLmd1aWRGb3IodGhpcyk7CgogICAgRW1iZXIuJCh3aW5kb3cpLm9mZign cG9wc3RhdGUuZW1iZXItbG9jYXRpb24tJytndWlkKTsKICB9Cn0pOwoKfSko KTsKCgoKKGZ1bmN0aW9uKCkgewoKICAvKioKICBAbW9kdWxlIGVtYmVyCiAg QHN1Ym1vZHVsZSBlbWJlci1yb3V0aW5nCiAgKi8KCiAgdmFyIGdldCA9IEVt YmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwogIHZhciBkb2N1bWVudE1vZGUg PSBkb2N1bWVudC5kb2N1bWVudE1vZGUsCiAgICAgIGhpc3RvcnkgPSB3aW5k b3cuaGlzdG9yeSwKICAgICAgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb24s CiAgICAgIGdldEhhc2ggPSBFbWJlci5Mb2NhdGlvbi5nZXRIYXNoOwoKICAv KioKICAgIEVtYmVyLkF1dG9Mb2NhdGlvbiB3aWxsIHNlbGVjdCB0aGUgYmVz dCBsb2NhdGlvbiBvcHRpb24gYmFzZWQgb2ZmIGJyb3dzZXIKICAgIHN1cHBv cnQgd2l0aCB0aGUgcHJpb3JpdHkgb3JkZXI6IGhpc3RvcnksIGhhc2gsIG5v bmUuCgogICAgQ2xlYW4gcHVzaFN0YXRlIHBhdGhzIGFjY2Vzc2VkIGJ5IGhh c2hjaGFuZ2Utb25seSBicm93c2VycyB3aWxsIGJlIHJlZGlyZWN0ZWQKICAg IHRvIHRoZSBoYXNoLWVxdWl2YWxlbnQgYW5kIHZpY2UgdmVyc2Egc28gZnV0 dXJlIHRyYW5zaXRpb25zIGFyZSBjb25zaXN0ZW50LgoKICAgIEtlZXAgaW4g bWluZCB0aGF0IHNpbmNlIHNvbWUgb2YgeW91ciB1c2VycyB3aWxsIHVzZSBg SGlzdG9yeUxvY2F0aW9uYCwgeW91cgogICAgc2VydmVyIG11c3Qgc2VydmUg dGhlIEVtYmVyIGFwcCBhdCBhbGwgdGhlIHJvdXRlcyB5b3UgZGVmaW5lLgoK ICAgIEBjbGFzcyBBdXRvTG9jYXRpb24KICAgIEBuYW1lc3BhY2UgRW1iZXIK ICAgIEBzdGF0aWMKICAqLwogIHZhciBBdXRvTG9jYXRpb24gPSBFbWJlci5B dXRvTG9jYXRpb24gPSB7CgogICAgLyoqCiAgICAgIFdpbGwgYmUgcHJlLXBl bmRlZCB0byBwYXRoIHVwb24gc3RhdGUgY2hhbmdlLgoKICAgICAgQHByb3Bl cnR5IHJvb3RVUkwKICAgICAgQGRlZmF1bHQgJy8nCiAgICAqLwogICAgcm9v dFVSTDogJy8nLAoKICAgIC8qKgogICAgICBAcHJpdmF0ZQoKICAgICAgV2Ug YXNzdW1lIHRoYXQgaWYgdGhlIGhpc3Rvcnkgb2JqZWN0IGhhcyBhIHB1c2hT dGF0ZSBtZXRob2QsIHRoZSBob3N0IHNob3VsZAogICAgICBzdXBwb3J0IEhp c3RvcnlMb2NhdGlvbi4KCiAgICAgIEBwcm9wZXJ0eSBzdXBwb3J0c0hpc3Rv cnkKICAgICovCiAgICBzdXBwb3J0c0hpc3Rvcnk6IChmdW5jdGlvbiAoKSB7 CiAgICAgIC8vIEJvb3N0ZWQgZnJvbSBNb2Rlcm5penI6IGh0dHBzOi8vZ2l0 aHViLmNvbS9Nb2Rlcm5penIvTW9kZXJuaXpyL2Jsb2IvbWFzdGVyL2ZlYXR1 cmUtZGV0ZWN0cy9oaXN0b3J5LmpzCiAgICAgIC8vIFRoZSBzdG9jayBicm93 c2VyIG9uIEFuZHJvaWQgMi4yICYgMi4zIHJldHVybnMgcG9zaXRpdmUgb24g aGlzdG9yeSBzdXBwb3J0CiAgICAgIC8vIFVuZm9ydHVuYXRlbHkgc3VwcG9y dCBpcyByZWFsbHkgYnVnZ3kgYW5kIHRoZXJlIGlzIG5vIGNsZWFuIHdheSB0 byBkZXRlY3QKICAgICAgLy8gdGhlc2UgYnVncywgc28gd2UgZmFsbCBiYWNr IHRvIGEgdXNlciBhZ2VudCBzbmlmZiA6KAogICAgICB2YXIgdXNlckFnZW50 ID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7CgogICAgICAvLyBXZSBv bmx5IHdhbnQgQW5kcm9pZCAyLCBzdG9jayBicm93c2VyLCBhbmQgbm90IENo cm9tZSB3aGljaCBpZGVudGlmaWVzCiAgICAgIC8vIGl0c2VsZiBhcyAnTW9i aWxlIFNhZmFyaScgYXMgd2VsbAogICAgICBpZiAodXNlckFnZW50LmluZGV4 T2YoJ0FuZHJvaWQgMicpICE9PSAtMSAmJgogICAgICAgICAgdXNlckFnZW50 LmluZGV4T2YoJ01vYmlsZSBTYWZhcmknKSAhPT0gLTEgJiYKICAgICAgICAg IHVzZXJBZ2VudC5pbmRleE9mKCdDaHJvbWUnKSA9PT0gLTEpIHsKICAgICAg ICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIHJldHVybiAhIShoaXN0 b3J5ICYmICdwdXNoU3RhdGUnIGluIGhpc3RvcnkpOwogICAgfSkoKSwKCiAg ICAvKioKICAgICAgQHByaXZhdGUKCiAgICAgIElFOCBydW5uaW5nIGluIElF NyBjb21wYXRpYmlsaXR5IG1vZGUgZ2l2ZXMgZmFsc2UgcG9zaXRpdmUsIHNv IHdlIG11c3QgYWxzbwogICAgICBjaGVjayBkb2N1bWVudE1vZGUuCgogICAg ICBAcHJvcGVydHkgc3VwcG9ydHNIYXNoQ2hhbmdlCiAgICAqLwogICAgc3Vw cG9ydHNIYXNoQ2hhbmdlOiAoJ29uaGFzaGNoYW5nZScgaW4gd2luZG93ICYm IChkb2N1bWVudE1vZGUgPT09IHVuZGVmaW5lZCB8fCBkb2N1bWVudE1vZGUg PiA3ICkpLAoKICAgIGNyZWF0ZTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAg ICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yb290VVJMKSB7CiAgICAgICAg dGhpcy5yb290VVJMID0gb3B0aW9ucy5yb290VVJMOwogICAgICB9CgogICAg ICB2YXIgaW1wbGVtZW50YXRpb25DbGFzcywgaGlzdG9yeVBhdGgsIGhhc2hQ YXRoLAogICAgICAgICAgY2FuY2VsUm91dGVyU2V0dXAgPSBmYWxzZSwKICAg ICAgICAgIGN1cnJlbnRQYXRoID0gdGhpcy5nZXRGdWxsUGF0aCgpOwoKICAg ICAgaWYgKHRoaXMuc3VwcG9ydHNIaXN0b3J5KSB7CiAgICAgICAgaGlzdG9y eVBhdGggPSB0aGlzLmdldEhpc3RvcnlQYXRoKCk7CgogICAgICAgIC8vIFNp bmNlIHdlIHN1cHBvcnQgaGlzdG9yeSBwYXRocywgbGV0J3MgYmUgc3VyZSB3 ZSdyZSB1c2luZyB0aGVtIGVsc2UgCiAgICAgICAgLy8gc3dpdGNoIHRoZSBs b2NhdGlvbiBvdmVyIHRvIGl0LgogICAgICAgIGlmIChjdXJyZW50UGF0aCA9 PT0gaGlzdG9yeVBhdGgpIHsKICAgICAgICAgIGltcGxlbWVudGF0aW9uQ2xh c3MgPSBFbWJlci5IaXN0b3J5TG9jYXRpb247CiAgICAgICAgfSBlbHNlIHsK ICAgICAgICAgIGNhbmNlbFJvdXRlclNldHVwID0gdHJ1ZTsKICAgICAgICAg IGxvY2F0aW9uLnJlcGxhY2UoaGlzdG9yeVBhdGgpOwogICAgICAgIH0KCiAg ICAgIH0gZWxzZSBpZiAodGhpcy5zdXBwb3J0c0hhc2hDaGFuZ2UpIHsKICAg ICAgICBoYXNoUGF0aCA9IHRoaXMuZ2V0SGFzaFBhdGgoKTsKCiAgICAgICAg Ly8gQmUgc3VyZSB3ZSdyZSB1c2luZyBhIGhhc2hlZCBwYXRoLCBvdGhlcndp c2UgbGV0J3Mgc3dpdGNoIG92ZXIgaXQgdG8gc28KICAgICAgICAvLyB3ZSBz dGFydCBvZmYgY2xlYW4gYW5kIGNvbnNpc3RlbnQuCiAgICAgICAgaWYgKGN1 cnJlbnRQYXRoID09PSBoYXNoUGF0aCkgewogICAgICAgICAgaW1wbGVtZW50 YXRpb25DbGFzcyA9IEVtYmVyLkhhc2hMb2NhdGlvbjsKICAgICAgICB9IGVs c2UgewogICAgICAgICAgY2FuY2VsUm91dGVyU2V0dXAgPSB0cnVlOwogICAg ICAgICAgbG9jYXRpb24ucmVwbGFjZShoYXNoUGF0aCk7CiAgICAgICAgfQog ICAgICB9CgogICAgICAvLyBJZiBub25lIGhhcyBiZWVuIHNldAogICAgICBp ZiAoIWltcGxlbWVudGF0aW9uQ2xhc3MpIHsKICAgICAgICBpbXBsZW1lbnRh dGlvbkNsYXNzID0gRW1iZXIuTm9uZUxvY2F0aW9uOwogICAgICB9CgogICAg ICB2YXIgaW1wbGVtZW50YXRpb24gPSBpbXBsZW1lbnRhdGlvbkNsYXNzLmNy ZWF0ZS5hcHBseShpbXBsZW1lbnRhdGlvbkNsYXNzLCBhcmd1bWVudHMpOwoK ICAgICAgaWYgKGNhbmNlbFJvdXRlclNldHVwKSB7CiAgICAgICAgc2V0KGlt cGxlbWVudGF0aW9uLCAnY2FuY2VsUm91dGVyU2V0dXAnLCB0cnVlKTsKICAg ICAgfQogICAgICAKICAgICAgcmV0dXJuIGltcGxlbWVudGF0aW9uOwogICAg fSwKCiAgICAvKioKICAgICAgQHByaXZhdGUKCiAgICAgIFJldHVybnMgdGhl IGN1cnJlbnQgYGxvY2F0aW9uLnBhdGhuYW1lYCwgbm9ybWFsaXplZCBmb3Ig SUUgaW5jb25zaXN0ZW5jaWVzLgoKICAgICAgQG1ldGhvZCBnZXRQYXRoCiAg ICAqLwogICAgZ2V0UGF0aDogZnVuY3Rpb24gKCkgewogICAgICB2YXIgcGF0 aG5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZTsKICAgICAgLy8gVmFyaW91cyB2 ZXJzaW9ucyBvZiBJRS9PcGVyYSBkb24ndCBhbHdheXMgcmV0dXJuIGEgbGVh ZGluZyBzbGFzaAogICAgICBpZiAocGF0aG5hbWUuY2hhckF0KDApICE9PSAn LycpIHsKICAgICAgICBwYXRobmFtZSA9ICcvJyArIHBhdGhuYW1lOwogICAg ICB9CgogICAgICByZXR1cm4gcGF0aG5hbWU7CiAgICB9LAoKICAgIC8qKgog ICAgICBAcHJpdmF0ZQoKICAgICAgUmV0dXJucyB0aGUgZnVsbCBwYXRobmFt ZSBpbmNsdWRpbmcgdGhlIGhhc2ggc3RyaW5nLgoKICAgICAgQG1ldGhvZCBn ZXRGdWxsUGF0aAogICAgKi8KICAgIGdldEZ1bGxQYXRoOiBmdW5jdGlvbiAo KSB7CiAgICAgIHJldHVybiB0aGlzLmdldFBhdGgoKSArIGdldEhhc2goKS5z dWJzdHIoMSk7CiAgICB9LAoKICAgIC8qKgogICAgICBAcHJpdmF0ZQoKICAg ICAgUmV0dXJucyB0aGUgY3VycmVudCBwYXRoIGFzIGl0IHNob3VsZCBhcHBl YXIgZm9yIEhpc3RvcnlMb2NhdGlvbiBzdXBwb3J0ZWQKICAgICAgYnJvd3Nl cnMuIFRoaXMgbWF5IHZlcnkgd2VsbCBkaWZmZXIgZnJvbSB0aGUgcmVhbCBj dXJyZW50IHBhdGggKGUuZy4gaWYgaXQgCiAgICAgIHN0YXJ0cyBvZmYgYXMg YSBoYXNoZWQgVVJMKQoKICAgICAgQG1ldGhvZCBnZXRIaXN0b3J5UGF0aAog ICAgKi8KICAgIGdldEhpc3RvcnlQYXRoOiBmdW5jdGlvbiAoKSB7CiAgICAg IHZhciBwYXRoID0gdGhpcy5nZXRQYXRoKCksICAKICAgICAgICAgIGhhc2hQ YXRoID0gZ2V0SGFzaCgpLnN1YnN0cigxKSwKICAgICAgICAgIHVybCA9IHBh dGggKyBoYXNoUGF0aDsKCiAgICAgIC8vIFJlbW92ZXMgYW55IHN0YWNrZWQg ZG91YmxlIHN0YXNoZXMKICAgICAgcmV0dXJuIHVybC5yZXBsYWNlKC9cL1wv LywgJy8nKTsKICAgIH0sCgogICAgLyoqCiAgICAgIEBwcml2YXRlCgogICAg ICBSZXR1cm5zIHRoZSBjdXJyZW50IHBhdGggYXMgaXQgc2hvdWxkIGFwcGVh ciBmb3IgSGFzaExvY2F0aW9uIHN1cHBvcnRlZAogICAgICBicm93c2Vycy4g VGhpcyBtYXkgdmVyeSB3ZWxsIGRpZmZlciBmcm9tIHRoZSByZWFsIGN1cnJl bnQgcGF0aC4KCiAgICAgIEBtZXRob2QgZ2V0SGFzaFBhdGgKICAgICovCiAg ICBnZXRIYXNoUGF0aDogZnVuY3Rpb24gKCkgewogICAgICB2YXIgaGlzdG9y eVBhdGggPSB0aGlzLmdldEhpc3RvcnlQYXRoKCksCiAgICAgICAgICBleHAg PSBuZXcgUmVnRXhwKCcoJyArIHRoaXMucm9vdFVSTCArICcpKC4rKScpLAog ICAgICAgICAgdXJsID0gaGlzdG9yeVBhdGgucmVwbGFjZShleHAsICckMSMv JDInKTsKCiAgICAgIC8vIFJlbW92ZSBhbnkgc3RhY2tlZCBkb3VibGUgc3Rh c2hlcwogICAgICB1cmwgPSB1cmwucmVwbGFjZSgvXC9cLy8sICcvJyk7Cgog ICAgICByZXR1cm4gdXJsOwogICAgfQoKICB9OwoKfSkoKTsKCgoKKGZ1bmN0 aW9uKCkgewoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewovKioKRW1iZXIgUm91 dGluZwoKQG1vZHVsZSBlbWJlcgpAc3VibW9kdWxlIGVtYmVyLXJvdXRpbmcK QHJlcXVpcmVzIGVtYmVyLXZpZXdzCiovCgp9KSgpOwoKKGZ1bmN0aW9uKCkg ewpmdW5jdGlvbiB2aXNpdCh2ZXJ0ZXgsIGZuLCB2aXNpdGVkLCBwYXRoKSB7 CiAgdmFyIG5hbWUgPSB2ZXJ0ZXgubmFtZSwKICAgIHZlcnRpY2VzID0gdmVy dGV4LmluY29taW5nLAogICAgbmFtZXMgPSB2ZXJ0ZXguaW5jb21pbmdOYW1l cywKICAgIGxlbiA9IG5hbWVzLmxlbmd0aCwKICAgIGk7CiAgaWYgKCF2aXNp dGVkKSB7CiAgICB2aXNpdGVkID0ge307CiAgfQogIGlmICghcGF0aCkgewog ICAgcGF0aCA9IFtdOwogIH0KICBpZiAodmlzaXRlZC5oYXNPd25Qcm9wZXJ0 eShuYW1lKSkgewogICAgcmV0dXJuOwogIH0KICBwYXRoLnB1c2gobmFtZSk7 CiAgdmlzaXRlZFtuYW1lXSA9IHRydWU7CiAgZm9yIChpID0gMDsgaSA8IGxl bjsgaSsrKSB7CiAgICB2aXNpdCh2ZXJ0aWNlc1tuYW1lc1tpXV0sIGZuLCB2 aXNpdGVkLCBwYXRoKTsKICB9CiAgZm4odmVydGV4LCBwYXRoKTsKICBwYXRo LnBvcCgpOwp9CgpmdW5jdGlvbiBEQUcoKSB7CiAgdGhpcy5uYW1lcyA9IFtd OwogIHRoaXMudmVydGljZXMgPSB7fTsKfQoKREFHLnByb3RvdHlwZS5hZGQg PSBmdW5jdGlvbihuYW1lKSB7CiAgaWYgKCFuYW1lKSB7IHJldHVybjsgfQog IGlmICh0aGlzLnZlcnRpY2VzLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAg ICByZXR1cm4gdGhpcy52ZXJ0aWNlc1tuYW1lXTsKICB9CiAgdmFyIHZlcnRl eCA9IHsKICAgIG5hbWU6IG5hbWUsIGluY29taW5nOiB7fSwgaW5jb21pbmdO YW1lczogW10sIGhhc091dGdvaW5nOiBmYWxzZSwgdmFsdWU6IG51bGwKICB9 OwogIHRoaXMudmVydGljZXNbbmFtZV0gPSB2ZXJ0ZXg7CiAgdGhpcy5uYW1l cy5wdXNoKG5hbWUpOwogIHJldHVybiB2ZXJ0ZXg7Cn07CgpEQUcucHJvdG90 eXBlLm1hcCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7CiAgdGhpcy5hZGQo bmFtZSkudmFsdWUgPSB2YWx1ZTsKfTsKCkRBRy5wcm90b3R5cGUuYWRkRWRn ZSA9IGZ1bmN0aW9uKGZyb21OYW1lLCB0b05hbWUpIHsKICBpZiAoIWZyb21O YW1lIHx8ICF0b05hbWUgfHwgZnJvbU5hbWUgPT09IHRvTmFtZSkgewogICAg cmV0dXJuOwogIH0KICB2YXIgZnJvbSA9IHRoaXMuYWRkKGZyb21OYW1lKSwg dG8gPSB0aGlzLmFkZCh0b05hbWUpOwogIGlmICh0by5pbmNvbWluZy5oYXNP d25Qcm9wZXJ0eShmcm9tTmFtZSkpIHsKICAgIHJldHVybjsKICB9CiAgZnVu Y3Rpb24gY2hlY2tDeWNsZSh2ZXJ0ZXgsIHBhdGgpIHsKICAgIGlmICh2ZXJ0 ZXgubmFtZSA9PT0gdG9OYW1lKSB7CiAgICAgIHRocm93IG5ldyBFbWJlci5F cnJvcigiY3ljbGUgZGV0ZWN0ZWQ6ICIgKyB0b05hbWUgKyAiIDwtICIgKyBw YXRoLmpvaW4oIiA8LSAiKSk7CiAgICB9CiAgfQogIHZpc2l0KGZyb20sIGNo ZWNrQ3ljbGUpOwogIGZyb20uaGFzT3V0Z29pbmcgPSB0cnVlOwogIHRvLmlu Y29taW5nW2Zyb21OYW1lXSA9IGZyb207CiAgdG8uaW5jb21pbmdOYW1lcy5w dXNoKGZyb21OYW1lKTsKfTsKCkRBRy5wcm90b3R5cGUudG9wc29ydCA9IGZ1 bmN0aW9uKGZuKSB7CiAgdmFyIHZpc2l0ZWQgPSB7fSwKICAgIHZlcnRpY2Vz ID0gdGhpcy52ZXJ0aWNlcywKICAgIG5hbWVzID0gdGhpcy5uYW1lcywKICAg IGxlbiA9IG5hbWVzLmxlbmd0aCwKICAgIGksIHZlcnRleDsKICBmb3IgKGkg PSAwOyBpIDwgbGVuOyBpKyspIHsKICAgIHZlcnRleCA9IHZlcnRpY2VzW25h bWVzW2ldXTsKICAgIGlmICghdmVydGV4Lmhhc091dGdvaW5nKSB7CiAgICAg IHZpc2l0KHZlcnRleCwgZm4sIHZpc2l0ZWQpOwogICAgfQogIH0KfTsKCkRB Ry5wcm90b3R5cGUuYWRkRWRnZXMgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwg YmVmb3JlLCBhZnRlcikgewogIHZhciBpOwogIHRoaXMubWFwKG5hbWUsIHZh bHVlKTsKICBpZiAoYmVmb3JlKSB7CiAgICBpZiAodHlwZW9mIGJlZm9yZSA9 PT0gJ3N0cmluZycpIHsKICAgICAgdGhpcy5hZGRFZGdlKG5hbWUsIGJlZm9y ZSk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKGkgPSAwOyBpIDwgYmVmb3Jl Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdGhpcy5hZGRFZGdlKG5hbWUsIGJl Zm9yZVtpXSk7CiAgICAgIH0KICAgIH0KICB9CiAgaWYgKGFmdGVyKSB7CiAg ICBpZiAodHlwZW9mIGFmdGVyID09PSAnc3RyaW5nJykgewogICAgICB0aGlz LmFkZEVkZ2UoYWZ0ZXIsIG5hbWUpOwogICAgfSBlbHNlIHsKICAgICAgZm9y IChpID0gMDsgaSA8IGFmdGVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdGhp cy5hZGRFZGdlKGFmdGVyW2ldLCBuYW1lKTsKICAgICAgfQogICAgfQogIH0K fTsKCkVtYmVyLkRBRyA9IERBRzsKCn0pKCk7CgoKCihmdW5jdGlvbigpIHsK LyoqCkBtb2R1bGUgZW1iZXIKQHN1Ym1vZHVsZSBlbWJlci1hcHBsaWNhdGlv bgoqLwoKdmFyIGdldCA9IEVtYmVyLmdldCwKICAgIGNsYXNzaWZ5ID0gRW1i ZXIuU3RyaW5nLmNsYXNzaWZ5LAogICAgY2FwaXRhbGl6ZSA9IEVtYmVyLlN0 cmluZy5jYXBpdGFsaXplLAogICAgZGVjYW1lbGl6ZSA9IEVtYmVyLlN0cmlu Zy5kZWNhbWVsaXplOwoKLyoqCiAgVGhlIERlZmF1bHRSZXNvbHZlciBkZWZp bmVzIHRoZSBkZWZhdWx0IGxvb2t1cCBydWxlcyB0byByZXNvbHZlCiAgY29u dGFpbmVyIGxvb2t1cHMgYmVmb3JlIGNvbnN1bHRpbmcgdGhlIGNvbnRhaW5l ciBmb3IgcmVnaXN0ZXJlZAogIGl0ZW1zOgoKKiB0ZW1wbGF0ZXMgYXJlIGxv b2tlZCB1cCBvbiBgRW1iZXIuVEVNUExBVEVTYAoqIG90aGVyIG5hbWVzIGFy ZSBsb29rZWQgdXAgb24gdGhlIGFwcGxpY2F0aW9uIGFmdGVyIGNvbnZlcnRp bmcKICB0aGUgbmFtZS4gRm9yIGV4YW1wbGUsIGBjb250cm9sbGVyOnBvc3Rg IGxvb2tzIHVwCiAgYEFwcC5Qb3N0Q29udHJvbGxlcmAgYnkgZGVmYXVsdC4K KiB0aGVyZSBhcmUgc29tZSBudWFuY2VzIChzZWUgZXhhbXBsZXMgYmVsb3cp CgogICMjIyBIb3cgUmVzb2x2aW5nIFdvcmtzCgogIFRoZSBjb250YWluZXIg Y2FsbHMgdGhpcyBvYmplY3QncyBgcmVzb2x2ZWAgbWV0aG9kIHdpdGggdGhl CiAgYGZ1bGxOYW1lYCBhcmd1bWVudC4KCiAgSXQgZmlyc3QgcGFyc2VzIHRo ZSBmdWxsTmFtZSBpbnRvIGFuIG9iamVjdCB1c2luZyBgcGFyc2VOYW1lYC4K CiAgVGhlbiBpdCBjaGVja3MgZm9yIHRoZSBwcmVzZW5jZSBvZiBhIHR5cGUt c3BlY2lmaWMgaW5zdGFuY2UKICBtZXRob2Qgb2YgdGhlIGZvcm0gYHJlc29s dmVbVHlwZV1gIGFuZCBjYWxscyBpdCBpZiBpdCBleGlzdHMuCiAgRm9yIGV4 YW1wbGUgaWYgaXQgd2FzIHJlc29sdmluZyAndGVtcGxhdGU6cG9zdCcsIGl0 IHdvdWxkIGNhbGwKICB0aGUgYHJlc29sdmVUZW1wbGF0ZWAgbWV0aG9kLgoK ICBJdHMgbGFzdCByZXNvcnQgaXMgdG8gY2FsbCB0aGUgYHJlc29sdmVPdGhl cmAgbWV0aG9kLgoKICBUaGUgbWV0aG9kcyBvZiB0aGlzIG9iamVjdCBhcmUg ZGVzaWduZWQgdG8gYmUgZWFzeSB0byBvdmVycmlkZQogIGluIGEgc3ViY2xh c3MuIEZvciBleGFtcGxlLCB5b3UgY291bGQgZW5oYW5jZSBob3cgYSB0ZW1w bGF0ZQogIGlzIHJlc29sdmVkIGxpa2Ugc286CgogIGBgYGphdmFzY3JpcHQK ICBBcHAgPSBFbWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoewogICAgUmVzb2x2 ZXI6IEVtYmVyLkRlZmF1bHRSZXNvbHZlci5leHRlbmQoewogICAgICByZXNv bHZlVGVtcGxhdGU6IGZ1bmN0aW9uKHBhcnNlZE5hbWUpIHsKICAgICAgICB2 YXIgcmVzb2x2ZWRUZW1wbGF0ZSA9IHRoaXMuX3N1cGVyKHBhcnNlZE5hbWUp OwogICAgICAgIGlmIChyZXNvbHZlZFRlbXBsYXRlKSB7IHJldHVybiByZXNv bHZlZFRlbXBsYXRlOyB9CiAgICAgICAgcmV0dXJuIEVtYmVyLlRFTVBMQVRF U1snbm90X2ZvdW5kJ107CiAgICAgIH0KICAgIH0pCiAgfSk7CiAgYGBgCgog IFNvbWUgZXhhbXBsZXMgb2YgaG93IG5hbWVzIGFyZSByZXNvbHZlZDoKCiAg YGBgCiAgJ3RlbXBsYXRlOnBvc3QnIC8vPT4gRW1iZXIuVEVNUExBVEVTWydw b3N0J10KICAndGVtcGxhdGU6cG9zdHMvYnlsaW5lJyAvLz0+IEVtYmVyLlRF TVBMQVRFU1sncG9zdHMvYnlsaW5lJ10KICAndGVtcGxhdGU6cG9zdHMuYnls aW5lJyAvLz0+IEVtYmVyLlRFTVBMQVRFU1sncG9zdHMvYnlsaW5lJ10KICAn dGVtcGxhdGU6YmxvZ1Bvc3QnIC8vPT4gRW1iZXIuVEVNUExBVEVTWydibG9n UG9zdCddCiAgICAgICAgICAgICAgICAgICAgICAvLyAgIE9SCiAgICAgICAg ICAgICAgICAgICAgICAvLyAgIEVtYmVyLlRFTVBMQVRFU1snYmxvZ19wb3N0 J10KICAnY29udHJvbGxlcjpwb3N0JyAvLz0+IEFwcC5Qb3N0Q29udHJvbGxl cgogICdjb250cm9sbGVyOnBvc3RzLmluZGV4JyAvLz0+IEFwcC5Qb3N0c0lu ZGV4Q29udHJvbGxlcgogICdjb250cm9sbGVyOmJsb2cvcG9zdCcgLy89PiBC bG9nLlBvc3RDb250cm9sbGVyCiAgJ2NvbnRyb2xsZXI6YmFzaWMnIC8vPT4g RW1iZXIuQ29udHJvbGxlcgogICdyb3V0ZTpwb3N0JyAvLz0+IEFwcC5Qb3N0 Um91dGUKICAncm91dGU6cG9zdHMuaW5kZXgnIC8vPT4gQXBwLlBvc3RzSW5k ZXhSb3V0ZQogICdyb3V0ZTpibG9nL3Bvc3QnIC8vPT4gQmxvZy5Qb3N0Um91 dGUKICAncm91dGU6YmFzaWMnIC8vPT4gRW1iZXIuUm91dGUKICAndmlldzpw b3N0JyAvLz0+IEFwcC5Qb3N0VmlldwogICd2aWV3OnBvc3RzLmluZGV4JyAv Lz0+IEFwcC5Qb3N0c0luZGV4VmlldwogICd2aWV3OmJsb2cvcG9zdCcgLy89 PiBCbG9nLlBvc3RWaWV3CiAgJ3ZpZXc6YmFzaWMnIC8vPT4gRW1iZXIuVmll dwogICdmb286cG9zdCcgLy89PiBBcHAuUG9zdEZvbwogICdtb2RlbDpwb3N0 JyAvLz0+IEFwcC5Qb3N0CiAgYGBgCgogIEBjbGFzcyBEZWZhdWx0UmVzb2x2 ZXIKICBAbmFtZXNwYWNlIEVtYmVyCiAgQGV4dGVuZHMgRW1iZXIuT2JqZWN0 CiovCkVtYmVyLkRlZmF1bHRSZXNvbHZlciA9IEVtYmVyLk9iamVjdC5leHRl bmQoewogIC8qKgogICAgVGhpcyB3aWxsIGJlIHNldCB0byB0aGUgQXBwbGlj YXRpb24gaW5zdGFuY2Ugd2hlbiBpdCBpcwogICAgY3JlYXRlZC4KCiAgICBA cHJvcGVydHkgbmFtZXNwYWNlCiAgKi8KICBuYW1lc3BhY2U6IG51bGwsCgog IG5vcm1hbGl6ZTogZnVuY3Rpb24oZnVsbE5hbWUpIHsKICAgIHZhciBzcGxp dCA9IGZ1bGxOYW1lLnNwbGl0KCc6JywgMiksCiAgICAgICAgdHlwZSA9IHNw bGl0WzBdLAogICAgICAgIG5hbWUgPSBzcGxpdFsxXTsKCiAgICBFbWJlci5h c3NlcnQoIlRyaWVkIHRvIG5vcm1hbGl6ZSBhIGNvbnRhaW5lciBuYW1lIHdp dGhvdXQgYSBjb2xvbiAoOikgaW4gIiArCiAgICAgICAgICAgICAgICAgIml0 LiBZb3UgcHJvYmFibHkgdHJpZWQgdG8gbG9va3VwIGEgbmFtZSB0aGF0IGRp ZCBub3QgY29udGFpbiAiICsKICAgICAgICAgICAgICAgICAiYSB0eXBlLCBh IGNvbG9uLCBhbmQgYSBuYW1lLiBBIHByb3BlciBsb29rdXAgbmFtZSB3b3Vs ZCBiZSAiICsKICAgICAgICAgICAgICAgICAiYHZpZXc6cG9zdGAuIiwgc3Bs aXQubGVuZ3RoID09PSAyKTsKCiAgICBpZiAodHlwZSAhPT0gJ3RlbXBsYXRl JykgewogICAgICB2YXIgcmVzdWx0ID0gbmFtZTsKCiAgICAgIGlmIChyZXN1 bHQuaW5kZXhPZignLicpID4gLTEpIHsKICAgICAgICByZXN1bHQgPSByZXN1 bHQucmVwbGFjZSgvXC4oLikvZywgZnVuY3Rpb24obSkgeyByZXR1cm4gbS5j aGFyQXQoMSkudG9VcHBlckNhc2UoKTsgfSk7CiAgICAgIH0KCiAgICAgIGlm IChuYW1lLmluZGV4T2YoJ18nKSA+IC0xKSB7CiAgICAgICAgcmVzdWx0ID0g cmVzdWx0LnJlcGxhY2UoL18oLikvZywgZnVuY3Rpb24obSkgeyByZXR1cm4g bS5jaGFyQXQoMSkudG9VcHBlckNhc2UoKTsgfSk7CiAgICAgIH0KCiAgICAg IHJldHVybiB0eXBlICsgJzonICsgcmVzdWx0OwogICAgfSBlbHNlIHsKICAg ICAgcmV0dXJuIGZ1bGxOYW1lOwogICAgfQogIH0sCgoKICAvKioKICAgIFRo aXMgbWV0aG9kIGlzIGNhbGxlZCB2aWEgdGhlIGNvbnRhaW5lcidzIHJlc29s dmVyIG1ldGhvZC4KICAgIEl0IHBhcnNlcyB0aGUgcHJvdmlkZWQgYGZ1bGxO YW1lYCBhbmQgdGhlbiBsb29rcyB1cCBhbmQKICAgIHJldHVybnMgdGhlIGFw cHJvcHJpYXRlIHRlbXBsYXRlIG9yIGNsYXNzLgoKICAgIEBtZXRob2QgcmVz b2x2ZQogICAgQHBhcmFtIHtTdHJpbmd9IGZ1bGxOYW1lIHRoZSBsb29rdXAg c3RyaW5nCiAgICBAcmV0dXJuIHtPYmplY3R9IHRoZSByZXNvbHZlZCBmYWN0 b3J5CiAgKi8KICByZXNvbHZlOiBmdW5jdGlvbihmdWxsTmFtZSkgewogICAg dmFyIHBhcnNlZE5hbWUgPSB0aGlzLnBhcnNlTmFtZShmdWxsTmFtZSksCiAg ICAgICAgcmVzb2x2ZU1ldGhvZE5hbWUgPSBwYXJzZWROYW1lLnJlc29sdmVN ZXRob2ROYW1lOwoKICAgIGlmICghKHBhcnNlZE5hbWUubmFtZSAmJiBwYXJz ZWROYW1lLnR5cGUpKSB7CiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIklu dmFsaWQgZnVsbE5hbWU6IGAiICsgZnVsbE5hbWUgKyAiYCwgbXVzdCBiZSBv ZiB0aGUgZm9ybSBgdHlwZTpuYW1lYCAiKTsKICAgIH0KCiAgICBpZiAodGhp c1tyZXNvbHZlTWV0aG9kTmFtZV0pIHsKICAgICAgdmFyIHJlc29sdmVkID0g dGhpc1tyZXNvbHZlTWV0aG9kTmFtZV0ocGFyc2VkTmFtZSk7CiAgICAgIGlm IChyZXNvbHZlZCkgeyByZXR1cm4gcmVzb2x2ZWQ7IH0KICAgIH0KICAgIHJl dHVybiB0aGlzLnJlc29sdmVPdGhlcihwYXJzZWROYW1lKTsKICB9LAogIC8q KgogICAgQ29udmVydCB0aGUgc3RyaW5nIG5hbWUgb2YgdGhlIGZvcm0gInR5 cGU6bmFtZSIgdG8KICAgIGEgSmF2YXNjcmlwdCBvYmplY3Qgd2l0aCB0aGUg cGFyc2VkIGFzcGVjdHMgb2YgdGhlIG5hbWUKICAgIGJyb2tlbiBvdXQuCgog ICAgQHByb3RlY3RlZAogICAgQHBhcmFtIHtTdHJpbmd9IGZ1bGxOYW1lIHRo ZSBsb29rdXAgc3RyaW5nCiAgICBAbWV0aG9kIHBhcnNlTmFtZQogICovCiAg cGFyc2VOYW1lOiBmdW5jdGlvbihmdWxsTmFtZSkgewogICAgdmFyIG5hbWVQ YXJ0cyA9IGZ1bGxOYW1lLnNwbGl0KCI6IiksCiAgICAgICAgdHlwZSA9IG5h bWVQYXJ0c1swXSwgZnVsbE5hbWVXaXRob3V0VHlwZSA9IG5hbWVQYXJ0c1sx XSwKICAgICAgICBuYW1lID0gZnVsbE5hbWVXaXRob3V0VHlwZSwKICAgICAg ICBuYW1lc3BhY2UgPSBnZXQodGhpcywgJ25hbWVzcGFjZScpLAogICAgICAg IHJvb3QgPSBuYW1lc3BhY2U7CgogICAgaWYgKHR5cGUgIT09ICd0ZW1wbGF0 ZScgJiYgbmFtZS5pbmRleE9mKCcvJykgIT09IC0xKSB7CiAgICAgIHZhciBw YXJ0cyA9IG5hbWUuc3BsaXQoJy8nKTsKICAgICAgbmFtZSA9IHBhcnRzW3Bh cnRzLmxlbmd0aCAtIDFdOwogICAgICB2YXIgbmFtZXNwYWNlTmFtZSA9IGNh cGl0YWxpemUocGFydHMuc2xpY2UoMCwgLTEpLmpvaW4oJy4nKSk7CiAgICAg IHJvb3QgPSBFbWJlci5OYW1lc3BhY2UuYnlOYW1lKG5hbWVzcGFjZU5hbWUp OwoKICAgICAgRW1iZXIuYXNzZXJ0KCdZb3UgYXJlIGxvb2tpbmcgZm9yIGEg JyArIG5hbWUgKyAnICcgKyB0eXBlICsgJyBpbiB0aGUgJyArIG5hbWVzcGFj ZU5hbWUgKyAnIG5hbWVzcGFjZSwgYnV0IHRoZSBuYW1lc3BhY2UgY291bGQg bm90IGJlIGZvdW5kJywgcm9vdCk7CiAgICB9CgogICAgcmV0dXJuIHsKICAg ICAgZnVsbE5hbWU6IGZ1bGxOYW1lLAogICAgICB0eXBlOiB0eXBlLAogICAg ICBmdWxsTmFtZVdpdGhvdXRUeXBlOiBmdWxsTmFtZVdpdGhvdXRUeXBlLAog ICAgICBuYW1lOiBuYW1lLAogICAgICByb290OiByb290LAogICAgICByZXNv bHZlTWV0aG9kTmFtZTogInJlc29sdmUiICsgY2xhc3NpZnkodHlwZSkKICAg IH07CiAgfSwKICAvKioKICAgIExvb2sgdXAgdGhlIHRlbXBsYXRlIGluIEVt YmVyLlRFTVBMQVRFUwoKICAgIEBwcm90ZWN0ZWQKICAgIEBwYXJhbSB7T2Jq ZWN0fSBwYXJzZWROYW1lIGEgcGFyc2VOYW1lIG9iamVjdCB3aXRoIHRoZSBw YXJzZWQKICAgICAgZnVsbE5hbWUgbG9va3VwIHN0cmluZwogICAgQG1ldGhv ZCByZXNvbHZlVGVtcGxhdGUKICAqLwogIHJlc29sdmVUZW1wbGF0ZTogZnVu Y3Rpb24ocGFyc2VkTmFtZSkgewogICAgdmFyIHRlbXBsYXRlTmFtZSA9IHBh cnNlZE5hbWUuZnVsbE5hbWVXaXRob3V0VHlwZS5yZXBsYWNlKC9cLi9nLCAn LycpOwoKICAgIGlmIChFbWJlci5URU1QTEFURVNbdGVtcGxhdGVOYW1lXSkg ewogICAgICByZXR1cm4gRW1iZXIuVEVNUExBVEVTW3RlbXBsYXRlTmFtZV07 CiAgICB9CgogICAgdGVtcGxhdGVOYW1lID0gZGVjYW1lbGl6ZSh0ZW1wbGF0 ZU5hbWUpOwogICAgaWYgKEVtYmVyLlRFTVBMQVRFU1t0ZW1wbGF0ZU5hbWVd KSB7CiAgICAgIHJldHVybiBFbWJlci5URU1QTEFURVNbdGVtcGxhdGVOYW1l XTsKICAgIH0KICB9LAogIC8qKgogICAgR2l2ZW4gYSBwYXJzZU5hbWUgb2Jq ZWN0IChvdXRwdXQgZnJvbSBgcGFyc2VOYW1lYCksIGFwcGx5CiAgICB0aGUg Y29udmVudGlvbnMgZXhwZWN0ZWQgYnkgYEVtYmVyLlJvdXRlcmAKCiAgICBA cHJvdGVjdGVkCiAgICBAcGFyYW0ge09iamVjdH0gcGFyc2VkTmFtZSBhIHBh cnNlTmFtZSBvYmplY3Qgd2l0aCB0aGUgcGFyc2VkCiAgICAgIGZ1bGxOYW1l IGxvb2t1cCBzdHJpbmcKICAgIEBtZXRob2QgdXNlUm91dGVyTmFtaW5nCiAg Ki8KICB1c2VSb3V0ZXJOYW1pbmc6IGZ1bmN0aW9uKHBhcnNlZE5hbWUpIHsK ICAgIHBhcnNlZE5hbWUubmFtZSA9IHBhcnNlZE5hbWUubmFtZS5yZXBsYWNl KC9cLi9nLCAnXycpOwogICAgaWYgKHBhcnNlZE5hbWUubmFtZSA9PT0gJ2Jh c2ljJykgewogICAgICBwYXJzZWROYW1lLm5hbWUgPSAnJzsKICAgIH0KICB9 LAogIC8qKgogICAgTG9va3VwIHRoZSBjb250cm9sbGVyIHVzaW5nIGByZXNv bHZlT3RoZXJgCgogICAgQHByb3RlY3RlZAogICAgQHBhcmFtIHtPYmplY3R9 IHBhcnNlZE5hbWUgYSBwYXJzZU5hbWUgb2JqZWN0IHdpdGggdGhlIHBhcnNl ZAogICAgICBmdWxsTmFtZSBsb29rdXAgc3RyaW5nCiAgICBAbWV0aG9kIHJl c29sdmVDb250cm9sbGVyCiAgKi8KICByZXNvbHZlQ29udHJvbGxlcjogZnVu Y3Rpb24ocGFyc2VkTmFtZSkgewogICAgdGhpcy51c2VSb3V0ZXJOYW1pbmco cGFyc2VkTmFtZSk7CiAgICByZXR1cm4gdGhpcy5yZXNvbHZlT3RoZXIocGFy c2VkTmFtZSk7CiAgfSwKICAvKioKICAgIExvb2t1cCB0aGUgcm91dGUgdXNp bmcgYHJlc29sdmVPdGhlcmAKCiAgICBAcHJvdGVjdGVkCiAgICBAcGFyYW0g e09iamVjdH0gcGFyc2VkTmFtZSBhIHBhcnNlTmFtZSBvYmplY3Qgd2l0aCB0 aGUgcGFyc2VkCiAgICAgIGZ1bGxOYW1lIGxvb2t1cCBzdHJpbmcKICAgIEBt ZXRob2QgcmVzb2x2ZVJvdXRlCiAgKi8KICByZXNvbHZlUm91dGU6IGZ1bmN0 aW9uKHBhcnNlZE5hbWUpIHsKICAgIHRoaXMudXNlUm91dGVyTmFtaW5nKHBh cnNlZE5hbWUpOwogICAgcmV0dXJuIHRoaXMucmVzb2x2ZU90aGVyKHBhcnNl ZE5hbWUpOwogIH0sCiAgLyoqCiAgICBMb29rdXAgdGhlIHZpZXcgdXNpbmcg YHJlc29sdmVPdGhlcmAKCiAgICBAcHJvdGVjdGVkCiAgICBAcGFyYW0ge09i amVjdH0gcGFyc2VkTmFtZSBhIHBhcnNlTmFtZSBvYmplY3Qgd2l0aCB0aGUg cGFyc2VkCiAgICAgIGZ1bGxOYW1lIGxvb2t1cCBzdHJpbmcKICAgIEBtZXRo b2QgcmVzb2x2ZVZpZXcKICAqLwogIHJlc29sdmVWaWV3OiBmdW5jdGlvbihw YXJzZWROYW1lKSB7CiAgICB0aGlzLnVzZVJvdXRlck5hbWluZyhwYXJzZWRO YW1lKTsKICAgIHJldHVybiB0aGlzLnJlc29sdmVPdGhlcihwYXJzZWROYW1l KTsKICB9LAoKICByZXNvbHZlSGVscGVyOiBmdW5jdGlvbihwYXJzZWROYW1l KSB7CiAgICByZXR1cm4gdGhpcy5yZXNvbHZlT3RoZXIocGFyc2VkTmFtZSkg fHwgRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzW3BhcnNlZE5hbWUuZnVsbE5h bWVXaXRob3V0VHlwZV07CiAgfSwKCiAgLyoqCiAgICBMb29rdXAgdGhlIG1v ZGVsIG9uIHRoZSBBcHBsaWNhdGlvbiBuYW1lc3BhY2UKCiAgICBAcHJvdGVj dGVkCiAgICBAcGFyYW0ge09iamVjdH0gcGFyc2VkTmFtZSBhIHBhcnNlTmFt ZSBvYmplY3Qgd2l0aCB0aGUgcGFyc2VkCiAgICAgIGZ1bGxOYW1lIGxvb2t1 cCBzdHJpbmcKICAgIEBtZXRob2QgcmVzb2x2ZU1vZGVsCiAgKi8KICByZXNv bHZlTW9kZWw6IGZ1bmN0aW9uKHBhcnNlZE5hbWUpIHsKICAgIHZhciBjbGFz c05hbWUgPSBjbGFzc2lmeShwYXJzZWROYW1lLm5hbWUpLAogICAgICAgIGZh Y3RvcnkgPSBnZXQocGFyc2VkTmFtZS5yb290LCBjbGFzc05hbWUpOwoKICAg ICBpZiAoZmFjdG9yeSkgeyByZXR1cm4gZmFjdG9yeTsgfQogIH0sCiAgLyoq CiAgICBMb29rIHVwIHRoZSBzcGVjaWZpZWQgb2JqZWN0IChmcm9tIHBhcnNl ZE5hbWUpIG9uIHRoZSBhcHByb3ByaWF0ZQogICAgbmFtZXNwYWNlICh1c3Vh bGx5IG9uIHRoZSBBcHBsaWNhdGlvbikKCiAgICBAcHJvdGVjdGVkCiAgICBA cGFyYW0ge09iamVjdH0gcGFyc2VkTmFtZSBhIHBhcnNlTmFtZSBvYmplY3Qg d2l0aCB0aGUgcGFyc2VkCiAgICAgIGZ1bGxOYW1lIGxvb2t1cCBzdHJpbmcK ICAgIEBtZXRob2QgcmVzb2x2ZU90aGVyCiAgKi8KICByZXNvbHZlT3RoZXI6 IGZ1bmN0aW9uKHBhcnNlZE5hbWUpIHsKICAgIHZhciBjbGFzc05hbWUgPSBj bGFzc2lmeShwYXJzZWROYW1lLm5hbWUpICsgY2xhc3NpZnkocGFyc2VkTmFt ZS50eXBlKSwKICAgICAgICBmYWN0b3J5ID0gZ2V0KHBhcnNlZE5hbWUucm9v dCwgY2xhc3NOYW1lKTsKICAgIGlmIChmYWN0b3J5KSB7IHJldHVybiBmYWN0 b3J5OyB9CiAgfSwKCiAgLyoqCiAgICBSZXR1cm5zIGEgaHVtYW4tcmVhZGFi bGUgZGVzY3JpcHRpb24gZm9yIGEgZnVsbE5hbWUuIFVzZWQgYnkgdGhlCiAg ICBBcHBsaWNhdGlvbiBuYW1lc3BhY2UgaW4gYXNzZXJ0aW9ucyB0byBkZXNj cmliZSB0aGUKICAgIHByZWNpc2UgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCBF bWJlciBpcyBsb29raW5nIGZvciwgcmF0aGVyIHRoYW4KICAgIGNvbnRhaW5l ciBrZXlzLgoKICAgIEBwcm90ZWN0ZWQKICAgIEBwYXJhbSB7U3RyaW5nfSBm dWxsTmFtZSB0aGUgbG9va3VwIHN0cmluZwogICAgQG1ldGhvZCBsb29rdXBE ZXNjcmlwdGlvbgogICovCiAgbG9va3VwRGVzY3JpcHRpb246IGZ1bmN0aW9u KGZ1bGxOYW1lKSB7CiAgICB2YXIgcGFyc2VkTmFtZSA9IHRoaXMucGFyc2VO YW1lKGZ1bGxOYW1lKTsKCiAgICBpZiAocGFyc2VkTmFtZS50eXBlID09PSAn dGVtcGxhdGUnKSB7CiAgICAgIHJldHVybiAidGVtcGxhdGUgYXQgIiArIHBh cnNlZE5hbWUuZnVsbE5hbWVXaXRob3V0VHlwZS5yZXBsYWNlKC9cLi9nLCAn LycpOwogICAgfQoKICAgIHZhciBkZXNjcmlwdGlvbiA9IHBhcnNlZE5hbWUu cm9vdCArICIuIiArIGNsYXNzaWZ5KHBhcnNlZE5hbWUubmFtZSk7CiAgICBp ZiAocGFyc2VkTmFtZS50eXBlICE9PSAnbW9kZWwnKSB7IGRlc2NyaXB0aW9u ICs9IGNsYXNzaWZ5KHBhcnNlZE5hbWUudHlwZSk7IH0KCiAgICByZXR1cm4g ZGVzY3JpcHRpb247CiAgfSwKCiAgbWFrZVRvU3RyaW5nOiBmdW5jdGlvbihm YWN0b3J5LCBmdWxsTmFtZSkgewogICAgcmV0dXJuIGZhY3RvcnkudG9TdHJp bmcoKTsKICB9Cn0pOwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewovKioKQG1v ZHVsZSBlbWJlcgpAc3VibW9kdWxlIGVtYmVyLWFwcGxpY2F0aW9uCiovCgp2 YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7CgpmdW5jdGlv biBEZXByZWNhdGVkQ29udGFpbmVyKGNvbnRhaW5lcikgewogIHRoaXMuX2Nv bnRhaW5lciA9IGNvbnRhaW5lcjsKfQoKRGVwcmVjYXRlZENvbnRhaW5lci5k ZXByZWNhdGUgPSBmdW5jdGlvbihtZXRob2QpIHsKICByZXR1cm4gZnVuY3Rp b24oKSB7CiAgICB2YXIgY29udGFpbmVyID0gdGhpcy5fY29udGFpbmVyOwoK ICAgIEVtYmVyLmRlcHJlY2F0ZSgnVXNpbmcgdGhlIGRlZmF1bHRDb250YWlu ZXIgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gW2RlZmF1bHRDb250YWluZXIj JyArIG1ldGhvZCArICddIHNlZTogaHR0cDovL2dpdC5pby9FS1BwbkEnLCBm YWxzZSk7CiAgICByZXR1cm4gY29udGFpbmVyW21ldGhvZF0uYXBwbHkoY29u dGFpbmVyLCBhcmd1bWVudHMpOwogIH07Cn07CgpEZXByZWNhdGVkQ29udGFp bmVyLnByb3RvdHlwZSA9IHsKICBfY29udGFpbmVyOiBudWxsLAogIGxvb2t1 cDogRGVwcmVjYXRlZENvbnRhaW5lci5kZXByZWNhdGUoJ2xvb2t1cCcpLAog IHJlc29sdmU6IERlcHJlY2F0ZWRDb250YWluZXIuZGVwcmVjYXRlKCdyZXNv bHZlJyksCiAgcmVnaXN0ZXI6IERlcHJlY2F0ZWRDb250YWluZXIuZGVwcmVj YXRlKCdyZWdpc3RlcicpCn07CgovKioKICBBbiBpbnN0YW5jZSBvZiBgRW1i ZXIuQXBwbGljYXRpb25gIGlzIHRoZSBzdGFydGluZyBwb2ludCBmb3IgZXZl cnkgRW1iZXIKICBhcHBsaWNhdGlvbi4gSXQgaGVscHMgdG8gaW5zdGFudGlh dGUsIGluaXRpYWxpemUgYW5kIGNvb3JkaW5hdGUgdGhlIG1hbnkKICBvYmpl Y3RzIHRoYXQgbWFrZSB1cCB5b3VyIGFwcC4KCiAgRWFjaCBFbWJlciBhcHAg aGFzIG9uZSBhbmQgb25seSBvbmUgYEVtYmVyLkFwcGxpY2F0aW9uYCBvYmpl Y3QuIEluIGZhY3QsIHRoZQogIHZlcnkgZmlyc3QgdGhpbmcgeW91IHNob3Vs ZCBkbyBpbiB5b3VyIGFwcGxpY2F0aW9uIGlzIGNyZWF0ZSB0aGUgaW5zdGFu Y2U6CgogIGBgYGphdmFzY3JpcHQKICB3aW5kb3cuQXBwID0gRW1iZXIuQXBw bGljYXRpb24uY3JlYXRlKCk7CiAgYGBgCgogIFR5cGljYWxseSwgdGhlIGFw cGxpY2F0aW9uIG9iamVjdCBpcyB0aGUgb25seSBnbG9iYWwgdmFyaWFibGUu IEFsbCBvdGhlcgogIGNsYXNzZXMgaW4geW91ciBhcHAgc2hvdWxkIGJlIHBy b3BlcnRpZXMgb24gdGhlIGBFbWJlci5BcHBsaWNhdGlvbmAgaW5zdGFuY2Us CiAgd2hpY2ggaGlnaGxpZ2h0cyBpdHMgZmlyc3Qgcm9sZTogYSBnbG9iYWwg bmFtZXNwYWNlLgoKICBGb3IgZXhhbXBsZSwgaWYgeW91IGRlZmluZSBhIHZp ZXcgY2xhc3MsIGl0IG1pZ2h0IGxvb2sgbGlrZSB0aGlzOgoKICBgYGBqYXZh c2NyaXB0CiAgQXBwLk15VmlldyA9IEVtYmVyLlZpZXcuZXh0ZW5kKCk7CiAg YGBgCgogIEJ5IGRlZmF1bHQsIGNhbGxpbmcgYEVtYmVyLkFwcGxpY2F0aW9u LmNyZWF0ZSgpYCB3aWxsIGF1dG9tYXRpY2FsbHkgaW5pdGlhbGl6ZQogIHlv dXIgYXBwbGljYXRpb24gYnkgY2FsbGluZyB0aGUgYEVtYmVyLkFwcGxpY2F0 aW9uLmluaXRpYWxpemUoKWAgbWV0aG9kLiBJZgogIHlvdSBuZWVkIHRvIGRl bGF5IGluaXRpYWxpemF0aW9uLCB5b3UgY2FuIGNhbGwgeW91ciBhcHAncyBg ZGVmZXJSZWFkaW5lc3MoKWAKICBtZXRob2QuIFdoZW4geW91IGFyZSByZWFk eSBmb3IgeW91ciBhcHAgdG8gYmUgaW5pdGlhbGl6ZWQsIGNhbGwgaXRzCiAg YGFkdmFuY2VSZWFkaW5lc3MoKWAgbWV0aG9kLgoKICBZb3UgY2FuIGRlZmlu ZSBhIGByZWFkeWAgbWV0aG9kIG9uIHRoZSBgRW1iZXIuQXBwbGljYXRpb25g IGluc3RhbmNlLCB3aGljaAogIHdpbGwgYmUgcnVuIGJ5IEVtYmVyIHdoZW4g dGhlIGFwcGxpY2F0aW9uIGlzIGluaXRpYWxpemVkLgoKICBCZWNhdXNlIGBF bWJlci5BcHBsaWNhdGlvbmAgaW5oZXJpdHMgZnJvbSBgRW1iZXIuTmFtZXNw YWNlYCwgYW55IGNsYXNzZXMKICB5b3UgY3JlYXRlIHdpbGwgaGF2ZSB1c2Vm dWwgc3RyaW5nIHJlcHJlc2VudGF0aW9ucyB3aGVuIGNhbGxpbmcgYHRvU3Ry aW5nKClgLgogIFNlZSB0aGUgYEVtYmVyLk5hbWVzcGFjZWAgZG9jdW1lbnRh dGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KCiAgV2hpbGUgeW91IGNhbiB0 aGluayBvZiB5b3VyIGBFbWJlci5BcHBsaWNhdGlvbmAgYXMgYSBjb250YWlu ZXIgdGhhdCBob2xkcyB0aGUKICBvdGhlciBjbGFzc2VzIGluIHlvdXIgYXBw bGljYXRpb24sIHRoZXJlIGFyZSBzZXZlcmFsIG90aGVyIHJlc3BvbnNpYmls aXRpZXMKICBnb2luZyBvbiB1bmRlci10aGUtaG9vZCB0aGF0IHlvdSBtYXkg d2FudCB0byB1bmRlcnN0YW5kLgoKICAjIyMgRXZlbnQgRGVsZWdhdGlvbgoK ICBFbWJlciB1c2VzIGEgdGVjaG5pcXVlIGNhbGxlZCBfZXZlbnQgZGVsZWdh dGlvbl8uIFRoaXMgYWxsb3dzIHRoZSBmcmFtZXdvcmsKICB0byBzZXQgdXAg YSBnbG9iYWwsIHNoYXJlZCBldmVudCBsaXN0ZW5lciBpbnN0ZWFkIG9mIHJl cXVpcmluZyBlYWNoIHZpZXcgdG8KICBkbyBpdCBtYW51YWxseS4gRm9yIGV4 YW1wbGUsIGluc3RlYWQgb2YgZWFjaCB2aWV3IHJlZ2lzdGVyaW5nIGl0cyBv d24KICBgbW91c2Vkb3duYCBsaXN0ZW5lciBvbiBpdHMgYXNzb2NpYXRlZCBl bGVtZW50LCBFbWJlciBzZXRzIHVwIGEgYG1vdXNlZG93bmAKICBsaXN0ZW5l ciBvbiB0aGUgYGJvZHlgLgoKICBJZiBhIGBtb3VzZWRvd25gIGV2ZW50IG9j Y3VycywgRW1iZXIgd2lsbCBsb29rIGF0IHRoZSB0YXJnZXQgb2YgdGhlIGV2 ZW50IGFuZAogIHN0YXJ0IHdhbGtpbmcgdXAgdGhlIERPTSBub2RlIHRyZWUs IGZpbmRpbmcgY29ycmVzcG9uZGluZyB2aWV3cyBhbmQgaW52b2tpbmcKICB0 aGVpciBgbW91c2VEb3duYCBtZXRob2QgYXMgaXQgZ29lcy4KCiAgYEVtYmVy LkFwcGxpY2F0aW9uYCBoYXMgYSBudW1iZXIgb2YgZGVmYXVsdCBldmVudHMg dGhhdCBpdCBsaXN0ZW5zIGZvciwgYXMKICB3ZWxsIGFzIGEgbWFwcGluZyBm cm9tIGxvd2VyY2FzZSBldmVudHMgdG8gY2FtZWwtY2FzZWQgdmlldyBtZXRo b2QgbmFtZXMuIEZvcgogIGV4YW1wbGUsIHRoZSBga2V5cHJlc3NgIGV2ZW50 IGNhdXNlcyB0aGUgYGtleVByZXNzYCBtZXRob2Qgb24gdGhlIHZpZXcgdG8g YmUKICBjYWxsZWQsIHRoZSBgZGJsY2xpY2tgIGV2ZW50IGNhdXNlcyBgZG91 YmxlQ2xpY2tgIHRvIGJlIGNhbGxlZCwgYW5kIHNvIG9uLgoKICBJZiB0aGVy ZSBpcyBhIGJ1YmJsaW5nIGJyb3dzZXIgZXZlbnQgdGhhdCBFbWJlciBkb2Vz IG5vdCBsaXN0ZW4gZm9yIGJ5CiAgZGVmYXVsdCwgeW91IGNhbiBzcGVjaWZ5 IGN1c3RvbSBldmVudHMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmlldyBt ZXRob2QKICBuYW1lcyBieSBzZXR0aW5nIHRoZSBhcHBsaWNhdGlvbidzIGBj dXN0b21FdmVudHNgIHByb3BlcnR5OgoKICBgYGBqYXZhc2NyaXB0CiAgQXBw ID0gRW1iZXIuQXBwbGljYXRpb24uY3JlYXRlKHsKICAgIGN1c3RvbUV2ZW50 czogewogICAgICAvLyBhZGQgc3VwcG9ydCBmb3IgdGhlIHBhc3RlIGV2ZW50 CiAgICAgIHBhc3RlOiAicGFzdGUiCiAgICB9CiAgfSk7CiAgYGBgCgogIEJ5 IGRlZmF1bHQsIHRoZSBhcHBsaWNhdGlvbiBzZXRzIHVwIHRoZXNlIGV2ZW50 IGxpc3RlbmVycyBvbiB0aGUgZG9jdW1lbnQKICBib2R5LiBIb3dldmVyLCBp biBjYXNlcyB3aGVyZSB5b3UgYXJlIGVtYmVkZGluZyBhbiBFbWJlciBhcHBs aWNhdGlvbiBpbnNpZGUKICBhbiBleGlzdGluZyBwYWdlLCB5b3UgbWF5IHdh bnQgaXQgdG8gc2V0IHVwIHRoZSBsaXN0ZW5lcnMgb24gYW4gZWxlbWVudAog IGluc2lkZSB0aGUgYm9keS4KCiAgRm9yIGV4YW1wbGUsIGlmIG9ubHkgZXZl bnRzIGluc2lkZSBhIERPTSBlbGVtZW50IHdpdGggdGhlIElEIG9mIGBlbWJl ci1hcHBgCiAgc2hvdWxkIGJlIGRlbGVnYXRlZCwgc2V0IHlvdXIgYXBwbGlj YXRpb24ncyBgcm9vdEVsZW1lbnRgIHByb3BlcnR5OgoKICBgYGBqYXZhc2Ny aXB0CiAgd2luZG93LkFwcCA9IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSh7 CiAgICByb290RWxlbWVudDogJyNlbWJlci1hcHAnCiAgfSk7CiAgYGBgCgog IFRoZSBgcm9vdEVsZW1lbnRgIGNhbiBiZSBlaXRoZXIgYSBET00gZWxlbWVu dCBvciBhIGpRdWVyeS1jb21wYXRpYmxlIHNlbGVjdG9yCiAgc3RyaW5nLiBO b3RlIHRoYXQgKnZpZXdzIGFwcGVuZGVkIHRvIHRoZSBET00gb3V0c2lkZSB0 aGUgcm9vdCBlbGVtZW50IHdpbGwKICBub3QgcmVjZWl2ZSBldmVudHMuKiBJ ZiB5b3Ugc3BlY2lmeSBhIGN1c3RvbSByb290IGVsZW1lbnQsIG1ha2Ugc3Vy ZSB5b3Ugb25seQogIGFwcGVuZCB2aWV3cyBpbnNpZGUgaXQhCgogIFRvIGxl YXJuIG1vcmUgYWJvdXQgdGhlIGFkdmFudGFnZXMgb2YgZXZlbnQgZGVsZWdh dGlvbiBhbmQgdGhlIEVtYmVyIHZpZXcKICBsYXllciwgYW5kIGEgbGlzdCBv ZiB0aGUgZXZlbnQgbGlzdGVuZXJzIHRoYXQgYXJlIHNldHVwIGJ5IGRlZmF1 bHQsIHZpc2l0IHRoZQogIFtFbWJlciBWaWV3IExheWVyIGd1aWRlXShodHRw Oi8vZW1iZXJqcy5jb20vZ3VpZGVzL3VuZGVyc3RhbmRpbmctZW1iZXIvdGhl LXZpZXctbGF5ZXIvI3RvY19ldmVudC1kZWxlZ2F0aW9uKS4KCiAgIyMjIElu aXRpYWxpemVycwoKICBMaWJyYXJpZXMgb24gdG9wIG9mIEVtYmVyIGNhbiBy ZWdpc3RlciBhZGRpdGlvbmFsIGluaXRpYWxpemVycywgbGlrZSBzbzoKCiAg YGBgamF2YXNjcmlwdAogIEVtYmVyLkFwcGxpY2F0aW9uLmluaXRpYWxpemVy KHsKICAgIG5hbWU6ICJzdG9yZSIsCgogICAgaW5pdGlhbGl6ZTogZnVuY3Rp b24oY29udGFpbmVyLCBhcHBsaWNhdGlvbikgewogICAgICBjb250YWluZXIu cmVnaXN0ZXIoJ3N0b3JlOm1haW4nLCBhcHBsaWNhdGlvbi5TdG9yZSk7CiAg ICB9CiAgfSk7CiAgYGBgCgogICMjIyBSb3V0aW5nCgogIEluIGFkZGl0aW9u IHRvIGNyZWF0aW5nIHlvdXIgYXBwbGljYXRpb24ncyByb3V0ZXIsIGBFbWJl ci5BcHBsaWNhdGlvbmAgaXMKICBhbHNvIHJlc3BvbnNpYmxlIGZvciB0ZWxs aW5nIHRoZSByb3V0ZXIgd2hlbiB0byBzdGFydCByb3V0aW5nLiBUcmFuc2l0 aW9ucwogIGJldHdlZW4gcm91dGVzIGNhbiBiZSBsb2dnZWQgd2l0aCB0aGUg YExPR19UUkFOU0lUSU9OU2AgZmxhZywgYW5kIG1vcmUKICBkZXRhaWxlZCBp bnRyYS10cmFuc2l0aW9uIGxvZ2dpbmcgY2FuIGJlIGxvZ2dlZCB3aXRoCiAg dGhlIGBMT0dfVFJBTlNJVElPTlNfSU5URVJOQUxgIGZsYWc6CgogIGBgYGph dmFzY3JpcHQKICB3aW5kb3cuQXBwID0gRW1iZXIuQXBwbGljYXRpb24uY3Jl YXRlKHsKICAgIExPR19UUkFOU0lUSU9OUzogdHJ1ZSwgLy8gYmFzaWMgbG9n Z2luZyBvZiBzdWNjZXNzZnVsIHRyYW5zaXRpb25zCiAgICBMT0dfVFJBTlNJ VElPTlNfSU5URVJOQUw6IHRydWUgLy8gZGV0YWlsZWQgbG9nZ2luZyBvZiBh bGwgcm91dGluZyBzdGVwcwogIH0pOwogIGBgYAoKICBCeSBkZWZhdWx0LCB0 aGUgcm91dGVyIHdpbGwgYmVnaW4gdHJ5aW5nIHRvIHRyYW5zbGF0ZSB0aGUg Y3VycmVudCBVUkwgaW50bwogIGFwcGxpY2F0aW9uIHN0YXRlIG9uY2UgdGhl IGJyb3dzZXIgZW1pdHMgdGhlIGBET01Db250ZW50UmVhZHlgIGV2ZW50LiBJ ZiB5b3UKICBuZWVkIHRvIGRlZmVyIHJvdXRpbmcsIHlvdSBjYW4gY2FsbCB0 aGUgYXBwbGljYXRpb24ncyBgZGVmZXJSZWFkaW5lc3MoKWAKICBtZXRob2Qu IE9uY2Ugcm91dGluZyBjYW4gYmVnaW4sIGNhbGwgdGhlIGBhZHZhbmNlUmVh ZGluZXNzKClgIG1ldGhvZC4KCiAgSWYgdGhlcmUgaXMgYW55IHNldHVwIHJl cXVpcmVkIGJlZm9yZSByb3V0aW5nIGJlZ2lucywgeW91IGNhbiBpbXBsZW1l bnQgYQogIGByZWFkeSgpYCBtZXRob2Qgb24geW91ciBhcHAgdGhhdCB3aWxs IGJlIGludm9rZWQgaW1tZWRpYXRlbHkgYmVmb3JlIHJvdXRpbmcKICBiZWdp bnMuCiAgYGBgCgogIEBjbGFzcyBBcHBsaWNhdGlvbgogIEBuYW1lc3BhY2Ug RW1iZXIKICBAZXh0ZW5kcyBFbWJlci5OYW1lc3BhY2UKKi8KCnZhciBBcHBs aWNhdGlvbiA9IEVtYmVyLkFwcGxpY2F0aW9uID0gRW1iZXIuTmFtZXNwYWNl LmV4dGVuZChFbWJlci5EZWZlcnJlZE1peGluLCB7CgogIC8qKgogICAgVGhl IHJvb3QgRE9NIGVsZW1lbnQgb2YgdGhlIEFwcGxpY2F0aW9uLiBUaGlzIGNh biBiZSBzcGVjaWZpZWQgYXMgYW4KICAgIGVsZW1lbnQgb3IgYQogICAgW2pR dWVyeS1jb21wYXRpYmxlIHNlbGVjdG9yIHN0cmluZ10oaHR0cDovL2FwaS5q cXVlcnkuY29tL2NhdGVnb3J5L3NlbGVjdG9ycy8pLgoKICAgIFRoaXMgaXMg dGhlIGVsZW1lbnQgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgQXBwbGlj YXRpb24ncywKICAgIGBldmVudERpc3BhdGNoZXJgLCB3aGljaCBzZXRzIHVw IHRoZSBsaXN0ZW5lcnMgZm9yIGV2ZW50IGRlbGVnYXRpb24uIEV2ZXJ5CiAg ICB2aWV3IGluIHlvdXIgYXBwbGljYXRpb24gc2hvdWxkIGJlIGEgY2hpbGQg b2YgdGhlIGVsZW1lbnQgeW91IHNwZWNpZnkgaGVyZS4KCiAgICBAcHJvcGVy dHkgcm9vdEVsZW1lbnQKICAgIEB0eXBlIERPTUVsZW1lbnQKICAgIEBkZWZh dWx0ICdib2R5JwogICovCiAgcm9vdEVsZW1lbnQ6ICdib2R5JywKCiAgLyoq CiAgICBUaGUgYEVtYmVyLkV2ZW50RGlzcGF0Y2hlcmAgcmVzcG9uc2libGUg Zm9yIGRlbGVnYXRpbmcgZXZlbnRzIHRvIHRoaXMKICAgIGFwcGxpY2F0aW9u J3Mgdmlld3MuCgogICAgVGhlIGV2ZW50IGRpc3BhdGNoZXIgaXMgY3JlYXRl ZCBieSB0aGUgYXBwbGljYXRpb24gYXQgaW5pdGlhbGl6YXRpb24gdGltZQog ICAgYW5kIHNldHMgdXAgZXZlbnQgbGlzdGVuZXJzIG9uIHRoZSBET00gZWxl bWVudCBkZXNjcmliZWQgYnkgdGhlCiAgICBhcHBsaWNhdGlvbidzIGByb290 RWxlbWVudGAgcHJvcGVydHkuCgogICAgU2VlIHRoZSBkb2N1bWVudGF0aW9u IGZvciBgRW1iZXIuRXZlbnREaXNwYXRjaGVyYCBmb3IgbW9yZSBpbmZvcm1h dGlvbi4KCiAgICBAcHJvcGVydHkgZXZlbnREaXNwYXRjaGVyCiAgICBAdHlw ZSBFbWJlci5FdmVudERpc3BhdGNoZXIKICAgIEBkZWZhdWx0IG51bGwKICAq LwogIGV2ZW50RGlzcGF0Y2hlcjogbnVsbCwKCiAgLyoqCiAgICBUaGUgRE9N IGV2ZW50cyBmb3Igd2hpY2ggdGhlIGV2ZW50IGRpc3BhdGNoZXIgc2hvdWxk IGxpc3Rlbi4KCiAgICBCeSBkZWZhdWx0LCB0aGUgYXBwbGljYXRpb24ncyBg RW1iZXIuRXZlbnREaXNwYXRjaGVyYCBsaXN0ZW5zCiAgICBmb3IgYSBzZXQg b2Ygc3RhbmRhcmQgRE9NIGV2ZW50cywgc3VjaCBhcyBgbW91c2Vkb3duYCBh bmQKICAgIGBrZXl1cGAsIGFuZCBkZWxlZ2F0ZXMgdGhlbSB0byB5b3VyIGFw cGxpY2F0aW9uJ3MgYEVtYmVyLlZpZXdgCiAgICBpbnN0YW5jZXMuCgogICAg SWYgeW91IHdvdWxkIGxpa2UgYWRkaXRpb25hbCBidWJibGluZyBldmVudHMg dG8gYmUgZGVsZWdhdGVkIHRvIHlvdXIKICAgIHZpZXdzLCBzZXQgeW91ciBg RW1iZXIuQXBwbGljYXRpb25gJ3MgYGN1c3RvbUV2ZW50c2AgcHJvcGVydHkK ICAgIHRvIGEgaGFzaCBjb250YWluaW5nIHRoZSBET00gZXZlbnQgbmFtZSBh cyB0aGUga2V5IGFuZCB0aGUKICAgIGNvcnJlc3BvbmRpbmcgdmlldyBtZXRo b2QgbmFtZSBhcyB0aGUgdmFsdWUuIEZvciBleGFtcGxlOgoKICAgIGBgYGph dmFzY3JpcHQKICAgIEFwcCA9IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSh7 CiAgICAgIGN1c3RvbUV2ZW50czogewogICAgICAgIC8vIGFkZCBzdXBwb3J0 IGZvciB0aGUgcGFzdGUgZXZlbnQKICAgICAgICBwYXN0ZTogInBhc3RlIgog ICAgICB9CiAgICB9KTsKICAgIGBgYAoKICAgIEBwcm9wZXJ0eSBjdXN0b21F dmVudHMKICAgIEB0eXBlIE9iamVjdAogICAgQGRlZmF1bHQgbnVsbAogICov CiAgY3VzdG9tRXZlbnRzOiBudWxsLAoKICAvLyBTdGFydCBvZmYgdGhlIG51 bWJlciBvZiBkZWZlcnJhbHMgYXQgMS4gVGhpcyB3aWxsIGJlCiAgLy8gZGVj cmVtZW50ZWQgYnkgdGhlIEFwcGxpY2F0aW9uJ3Mgb3duIGBpbml0aWFsaXpl YCBtZXRob2QuCiAgX3JlYWRpbmVzc0RlZmVycmFsczogMSwKCiAgaW5pdDog ZnVuY3Rpb24oKSB7CiAgICBpZiAoIXRoaXMuJCkgeyB0aGlzLiQgPSBFbWJl ci4kOyB9CiAgICB0aGlzLl9fY29udGFpbmVyX18gPSB0aGlzLmJ1aWxkQ29u dGFpbmVyKCk7CgogICAgdGhpcy5Sb3V0ZXIgPSB0aGlzLmRlZmF1bHRSb3V0 ZXIoKTsKCiAgICB0aGlzLl9zdXBlcigpOwoKICAgIHRoaXMuc2NoZWR1bGVJ bml0aWFsaXplKCk7CgogICAgRW1iZXIubGlicmFyaWVzLnJlZ2lzdGVyQ29y ZUxpYnJhcnkoJ0hhbmRsZWJhcnMnLCBFbWJlci5IYW5kbGViYXJzLlZFUlNJ T04pOwogICAgRW1iZXIubGlicmFyaWVzLnJlZ2lzdGVyQ29yZUxpYnJhcnko J2pRdWVyeScsIEVtYmVyLiQoKS5qcXVlcnkpOwoKICAgIGlmICggRW1iZXIu TE9HX1ZFUlNJT04gKSB7CiAgICAgIEVtYmVyLkxPR19WRVJTSU9OID0gZmFs c2U7IC8vIHdlIG9ubHkgbmVlZCB0byBzZWUgdGhpcyBvbmNlIHBlciBBcHBs aWNhdGlvbiNpbml0CiAgICAgIHZhciBtYXhOYW1lTGVuZ3RoID0gTWF0aC5t YXguYXBwbHkodGhpcywgRW1iZXIuQShFbWJlci5saWJyYXJpZXMpLm1hcEJ5 KCJuYW1lLmxlbmd0aCIpKTsKCiAgICAgIEVtYmVyLmRlYnVnKCctLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7CiAgICAgIEVtYmVyLmxpYnJh cmllcy5lYWNoKGZ1bmN0aW9uKG5hbWUsIHZlcnNpb24pIHsKICAgICAgICB2 YXIgc3BhY2VzID0gbmV3IEFycmF5KG1heE5hbWVMZW5ndGggLSBuYW1lLmxl bmd0aCArIDEpLmpvaW4oIiAiKTsKICAgICAgICBFbWJlci5kZWJ1ZyhbbmFt ZSwgc3BhY2VzLCAnIDogJywgdmVyc2lvbl0uam9pbigiIikpOwogICAgICB9 KTsKICAgICAgRW1iZXIuZGVidWcoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0nKTsKICAgIH0KICB9LAoKICAvKioKICAgIEJ1aWxkIHRoZSBj b250YWluZXIgZm9yIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uLgoKICAgIEFs c28gcmVnaXN0ZXIgYSBkZWZhdWx0IGFwcGxpY2F0aW9uIHZpZXcgaW4gY2Fz ZSB0aGUgYXBwbGljYXRpb24KICAgIGl0c2VsZiBkb2VzIG5vdC4KCiAgICBA cHJpdmF0ZQogICAgQG1ldGhvZCBidWlsZENvbnRhaW5lcgogICAgQHJldHVy biB7RW1iZXIuQ29udGFpbmVyfSB0aGUgY29uZmlndXJlZCBjb250YWluZXIK ICAqLwogIGJ1aWxkQ29udGFpbmVyOiBmdW5jdGlvbigpIHsKICAgIHZhciBj b250YWluZXIgPSB0aGlzLl9fY29udGFpbmVyX18gPSBBcHBsaWNhdGlvbi5i dWlsZENvbnRhaW5lcih0aGlzKTsKCiAgICByZXR1cm4gY29udGFpbmVyOwog IH0sCgogIC8qKgogICAgSWYgdGhlIGFwcGxpY2F0aW9uIGhhcyBub3Qgb3B0 ZWQgb3V0IG9mIHJvdXRpbmcgYW5kIGhhcyBub3QgZXhwbGljaXRseQogICAg ZGVmaW5lZCBhIHJvdXRlciwgc3VwcGx5IGEgZGVmYXVsdCByb3V0ZXIgZm9y IHRoZSBhcHBsaWNhdGlvbiBhdXRob3IKICAgIHRvIGNvbmZpZ3VyZS4KCiAg ICBUaGlzIGFsbG93cyBhcHBsaWNhdGlvbiBkZXZlbG9wZXJzIHRvIGRvOgoK ICAgIGBgYGphdmFzY3JpcHQKICAgIHZhciBBcHAgPSBFbWJlci5BcHBsaWNh dGlvbi5jcmVhdGUoKTsKCiAgICBBcHAuUm91dGVyLm1hcChmdW5jdGlvbigp IHsKICAgICAgdGhpcy5yZXNvdXJjZSgncG9zdHMnKTsKICAgIH0pOwogICAg YGBgCgogICAgQHByaXZhdGUKICAgIEBtZXRob2QgZGVmYXVsdFJvdXRlcgog ICAgQHJldHVybiB7RW1iZXIuUm91dGVyfSB0aGUgZGVmYXVsdCByb3V0ZXIK ICAqLwoKICBkZWZhdWx0Um91dGVyOiBmdW5jdGlvbigpIHsKICAgIGlmICh0 aGlzLlJvdXRlciA9PT0gZmFsc2UpIHsgcmV0dXJuOyB9CiAgICB2YXIgY29u dGFpbmVyID0gdGhpcy5fX2NvbnRhaW5lcl9fOwoKICAgIGlmICh0aGlzLlJv dXRlcikgewogICAgICBjb250YWluZXIudW5yZWdpc3Rlcigncm91dGVyOm1h aW4nKTsKICAgICAgY29udGFpbmVyLnJlZ2lzdGVyKCdyb3V0ZXI6bWFpbics IHRoaXMuUm91dGVyKTsKICAgIH0KCiAgICByZXR1cm4gY29udGFpbmVyLmxv b2t1cEZhY3RvcnkoJ3JvdXRlcjptYWluJyk7CiAgfSwKCiAgLyoqCiAgICBB dXRvbWF0aWNhbGx5IGluaXRpYWxpemUgdGhlIGFwcGxpY2F0aW9uIG9uY2Ug dGhlIERPTSBoYXMKICAgIGJlY29tZSByZWFkeS4KCiAgICBUaGUgaW5pdGlh bGl6YXRpb24gaXRzZWxmIGlzIHNjaGVkdWxlZCBvbiB0aGUgYWN0aW9ucyBx dWV1ZQogICAgd2hpY2ggZW5zdXJlcyB0aGF0IGFwcGxpY2F0aW9uIGxvYWRp bmcgZmluaXNoZXMgYmVmb3JlCiAgICBib290aW5nLgoKICAgIElmIHlvdSBh cmUgYXN5bmNocm9ub3VzbHkgbG9hZGluZyBjb2RlLCB5b3Ugc2hvdWxkIGNh bGwKICAgIGBkZWZlclJlYWRpbmVzcygpYCB0byBkZWZlciBib290aW5nLCBh bmQgdGhlbiBjYWxsCiAgICBgYWR2YW5jZVJlYWRpbmVzcygpYCBvbmNlIGFs bCBvZiB5b3VyIGNvZGUgaGFzIGZpbmlzaGVkCiAgICBsb2FkaW5nLgoKICAg IEBwcml2YXRlCiAgICBAbWV0aG9kIHNjaGVkdWxlSW5pdGlhbGl6ZQogICov CiAgc2NoZWR1bGVJbml0aWFsaXplOiBmdW5jdGlvbigpIHsKICAgIHZhciBz ZWxmID0gdGhpczsKCiAgICBpZiAoIXRoaXMuJCB8fCB0aGlzLiQuaXNSZWFk eSkgewogICAgICBFbWJlci5ydW4uc2NoZWR1bGUoJ2FjdGlvbnMnLCBzZWxm LCAnX2luaXRpYWxpemUnKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuJCgp LnJlYWR5KGZ1bmN0aW9uIHJ1bkluaXRpYWxpemUoKSB7CiAgICAgICAgRW1i ZXIucnVuKHNlbGYsICdfaW5pdGlhbGl6ZScpOwogICAgICB9KTsKICAgIH0K ICB9LAoKICAvKioKICAgIFVzZSB0aGlzIHRvIGRlZmVyIHJlYWRpbmVzcyB1 bnRpbCBzb21lIGNvbmRpdGlvbiBpcyB0cnVlLgoKICAgIEV4YW1wbGU6Cgog ICAgYGBgamF2YXNjcmlwdAogICAgQXBwID0gRW1iZXIuQXBwbGljYXRpb24u Y3JlYXRlKCk7CiAgICBBcHAuZGVmZXJSZWFkaW5lc3MoKTsKCiAgICBqUXVl cnkuZ2V0SlNPTigiL2F1dGgtdG9rZW4iLCBmdW5jdGlvbih0b2tlbikgewog ICAgICBBcHAudG9rZW4gPSB0b2tlbjsKICAgICAgQXBwLmFkdmFuY2VSZWFk aW5lc3MoKTsKICAgIH0pOwogICAgYGBgCgogICAgVGhpcyBhbGxvd3MgeW91 IHRvIHBlcmZvcm0gYXN5bmNocm9ub3VzIHNldHVwIGxvZ2ljIGFuZCBkZWZl cgogICAgYm9vdGluZyB5b3VyIGFwcGxpY2F0aW9uIHVudGlsIHRoZSBzZXR1 cCBoYXMgZmluaXNoZWQuCgogICAgSG93ZXZlciwgaWYgdGhlIHNldHVwIHJl cXVpcmVzIGEgbG9hZGluZyBVSSwgaXQgbWlnaHQgYmUgYmV0dGVyCiAgICB0 byB1c2UgdGhlIHJvdXRlciBmb3IgdGhpcyBwdXJwb3NlLgoKICAgIEBtZXRo b2QgZGVmZXJSZWFkaW5lc3MKICAqLwogIGRlZmVyUmVhZGluZXNzOiBmdW5j dGlvbigpIHsKICAgIEVtYmVyLmFzc2VydCgiWW91IG11c3QgY2FsbCBkZWZl clJlYWRpbmVzcyBvbiBhbiBpbnN0YW5jZSBvZiBFbWJlci5BcHBsaWNhdGlv biIsIHRoaXMgaW5zdGFuY2VvZiBFbWJlci5BcHBsaWNhdGlvbik7CiAgICBF bWJlci5hc3NlcnQoIllvdSBjYW5ub3QgZGVmZXIgcmVhZGluZXNzIHNpbmNl IHRoZSBgcmVhZHkoKWAgaG9vayBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZC4i LCB0aGlzLl9yZWFkaW5lc3NEZWZlcnJhbHMgPiAwKTsKICAgIHRoaXMuX3Jl YWRpbmVzc0RlZmVycmFscysrOwogIH0sCgogIC8qKgogICAgQ2FsbCBgYWR2 YW5jZVJlYWRpbmVzc2AgYWZ0ZXIgYW55IGFzeW5jaHJvbm91cyBzZXR1cCBs b2dpYyBoYXMgY29tcGxldGVkLgogICAgRWFjaCBjYWxsIHRvIGBkZWZlclJl YWRpbmVzc2AgbXVzdCBiZSBtYXRjaGVkIGJ5IGEgY2FsbCB0byBgYWR2YW5j ZVJlYWRpbmVzc2AKICAgIG9yIHRoZSBhcHBsaWNhdGlvbiB3aWxsIG5ldmVy IGJlY29tZSByZWFkeSBhbmQgcm91dGluZyB3aWxsIG5vdCBiZWdpbi4KCiAg ICBAbWV0aG9kIGFkdmFuY2VSZWFkaW5lc3MKICAgIEBzZWUge0VtYmVyLkFw cGxpY2F0aW9uI2RlZmVyUmVhZGluZXNzfQogICovCiAgYWR2YW5jZVJlYWRp bmVzczogZnVuY3Rpb24oKSB7CiAgICBFbWJlci5hc3NlcnQoIllvdSBtdXN0 IGNhbGwgYWR2YW5jZVJlYWRpbmVzcyBvbiBhbiBpbnN0YW5jZSBvZiBFbWJl ci5BcHBsaWNhdGlvbiIsIHRoaXMgaW5zdGFuY2VvZiBFbWJlci5BcHBsaWNh dGlvbik7CiAgICB0aGlzLl9yZWFkaW5lc3NEZWZlcnJhbHMtLTsKCiAgICBp ZiAodGhpcy5fcmVhZGluZXNzRGVmZXJyYWxzID09PSAwKSB7CiAgICAgIEVt YmVyLnJ1bi5vbmNlKHRoaXMsIHRoaXMuZGlkQmVjb21lUmVhZHkpOwogICAg fQogIH0sCgogIC8qKgogICAgcmVnaXN0ZXJzIGEgZmFjdG9yeSBmb3IgbGF0 ZXIgaW5qZWN0aW9uCgogICAgRXhhbXBsZToKCiAgICBgYGBqYXZhc2NyaXB0 CiAgICBBcHAgPSBFbWJlci5BcHBsaWNhdGlvbi5jcmVhdGUoKTsKCiAgICBB cHAuUGVyc29uICA9IEVtYmVyLk9iamVjdC5leHRlbmQoe30pOwogICAgQXBw Lk9yYW5nZSAgPSBFbWJlci5PYmplY3QuZXh0ZW5kKHt9KTsKICAgIEFwcC5F bWFpbCAgID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7fSk7CiAgICBBcHAuc2Vz c2lvbiA9IEVtYmVyLk9iamVjdC5jcmVhdGUoe30pOwoKICAgIEFwcC5yZWdp c3RlcignbW9kZWw6dXNlcicsIEFwcC5QZXJzb24sIHtzaW5nbGV0b246IGZh bHNlIH0pOwogICAgQXBwLnJlZ2lzdGVyKCdmcnVpdDpmYXZvcml0ZScsIEFw cC5PcmFuZ2UpOwogICAgQXBwLnJlZ2lzdGVyKCdjb21tdW5pY2F0aW9uOm1h aW4nLCBBcHAuRW1haWwsIHtzaW5nbGV0b246IGZhbHNlfSk7CiAgICBBcHAu cmVnaXN0ZXIoJ3Nlc3Npb24nLCBBcHAuc2Vzc2lvbiwge2luc3RhbnRpYXRl OiBmYWxzZX0pOwogICAgYGBgCgogICAgQG1ldGhvZCByZWdpc3RlcgogICAg QHBhcmFtICBmdWxsTmFtZSB7U3RyaW5nfSB0eXBlOm5hbWUgKGUuZy4sICdt b2RlbDp1c2VyJykKICAgIEBwYXJhbSAgZmFjdG9yeSB7RnVuY3Rpb259IChl LmcuLCBBcHAuUGVyc29uKQogICAgQHBhcmFtICBvcHRpb25zIHtTdHJpbmd9 IChvcHRpb25hbCkKICAqKi8KICByZWdpc3RlcjogZnVuY3Rpb24oKSB7CiAg ICB2YXIgY29udGFpbmVyID0gdGhpcy5fX2NvbnRhaW5lcl9fOwogICAgY29u dGFpbmVyLnJlZ2lzdGVyLmFwcGx5KGNvbnRhaW5lciwgYXJndW1lbnRzKTsK ICB9LAogIC8qKgogICAgZGVmaW5lcyBhbiBpbmplY3Rpb24gb3IgdHlwZUlu amVjdGlvbgoKICAgIEV4YW1wbGU6CgogICAgYGBgamF2YXNjcmlwdAogICAg QXBwLmluamVjdCg8ZnVsbF9uYW1lIG9yIHR5cGU+LCA8cHJvcGVydHkgbmFt ZT4sIDxmdWxsX25hbWU+KQogICAgQXBwLmluamVjdCgnY29udHJvbGxlcjph cHBsaWNhdGlvbicsICdlbWFpbCcsICdtb2RlbDplbWFpbCcpCiAgICBBcHAu aW5qZWN0KCdjb250cm9sbGVyJywgJ3NvdXJjZScsICdzb3VyY2U6bWFpbicp CiAgICBgYGAKICAgIFBsZWFzZSBub3RlIHRoYXQgaW5qZWN0aW9ucyBvbiBt b2RlbHMgYXJlIGN1cnJlbnRseSBkaXNhYmxlZC4gCiAgICBUaGlzIHdhcyBk b25lIGJlY2F1c2UgZW1iZXItZGF0YSB3YXMgbm90IHJlYWR5IGZvciBmdWxs eSBhIGNvbnRhaW5lciBhd2FyZSBlY29zeXN0ZW0uCiAgICAKICAgIFlvdSBj YW4gZW5hYmxlIGluamVjdGlvbnMgb24gbW9kZWxzIGJ5IHNldHRpbmcgYEVt YmVyLk1PREVMX0ZBQ1RPUllfSU5KRUNUSU9OU2AgZmxhZyB0byBgdHJ1ZWAK ICAgIElmIG1vZGVsIGZhY3RvcnkgaW5qZWN0aW9ucyBhcmUgZW5hYmxlZCwg bW9kZWxzIHNob3VsZCBub3QgYmUKICAgIGFjY2Vzc2VkIGdsb2JhbGx5IChv bmx5IHRocm91Z2ggYGNvbnRhaW5lci5sb29rdXBGYWN0b3J5KCdtb2RlbDpt b2RlbE5hbWUnKSlgKTsKCiAgICBAbWV0aG9kIGluamVjdAogICAgQHBhcmFt ICBmYWN0b3J5TmFtZU9yVHlwZSB7U3RyaW5nfQogICAgQHBhcmFtICBwcm9w ZXJ0eSB7U3RyaW5nfQogICAgQHBhcmFtICBpbmplY3Rpb25OYW1lIHtTdHJp bmd9CiAgKiovCiAgaW5qZWN0OiBmdW5jdGlvbigpIHsKICAgIHZhciBjb250 YWluZXIgPSB0aGlzLl9fY29udGFpbmVyX187CiAgICBjb250YWluZXIuaW5q ZWN0aW9uLmFwcGx5KGNvbnRhaW5lciwgYXJndW1lbnRzKTsKICB9LAoKICAv KioKICAgIENhbGxpbmcgaW5pdGlhbGl6ZSBtYW51YWxseSBpcyBub3Qgc3Vw cG9ydGVkLgoKICAgIFBsZWFzZSBzZWUgRW1iZXIuQXBwbGljYXRpb24jYWR2 YW5jZVJlYWRpbmVzcyBhbmQKICAgIEVtYmVyLkFwcGxpY2F0aW9uI2RlZmVy UmVhZGluZXNzLgoKICAgIEBwcml2YXRlCiAgICBAZGVwcmVjYXRlZAogICAg QG1ldGhvZCBpbml0aWFsaXplCiAgICoqLwogIGluaXRpYWxpemU6IGZ1bmN0 aW9uKCkgewogICAgRW1iZXIuZGVwcmVjYXRlKCdDYWxsaW5nIGluaXRpYWxp emUgbWFudWFsbHkgaXMgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHNlZSBFbWJl ci5BcHBsaWNhdGlvbiNhZHZhbmNlUmVhZGluZXNzIGFuZCBFbWJlci5BcHBs aWNhdGlvbiNkZWZlclJlYWRpbmVzcycpOwogIH0sCiAgLyoqCiAgICBJbml0 aWFsaXplIHRoZSBhcHBsaWNhdGlvbi4gVGhpcyBoYXBwZW5zIGF1dG9tYXRp Y2FsbHkuCgogICAgUnVuIGFueSBpbml0aWFsaXplcnMgYW5kIHJ1biB0aGUg YXBwbGljYXRpb24gbG9hZCBob29rLiBUaGVzZSBob29rcyBtYXkKICAgIGNo b29zZSB0byBkZWZlciByZWFkaW5lc3MuIEZvciBleGFtcGxlLCBhbiBhdXRo ZW50aWNhdGlvbiBob29rIG1pZ2h0IHdhbnQKICAgIHRvIGRlZmVyIHJlYWRp bmVzcyB1bnRpbCB0aGUgYXV0aCB0b2tlbiBoYXMgYmVlbiByZXRyaWV2ZWQu CgogICAgQHByaXZhdGUKICAgIEBtZXRob2QgX2luaXRpYWxpemUKICAqLwog IF9pbml0aWFsaXplOiBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmlzRGVz dHJveWVkKSB7IHJldHVybjsgfQoKICAgIC8vIEF0IHRoaXMgcG9pbnQsIHRo ZSBBcHAuUm91dGVyIG11c3QgYWxyZWFkeSBiZSBhc3NpZ25lZAogICAgaWYg KHRoaXMuUm91dGVyKSB7CiAgICAgIHZhciBjb250YWluZXIgPSB0aGlzLl9f Y29udGFpbmVyX187CiAgICAgIGNvbnRhaW5lci51bnJlZ2lzdGVyKCdyb3V0 ZXI6bWFpbicpOwogICAgICBjb250YWluZXIucmVnaXN0ZXIoJ3JvdXRlcjpt YWluJywgdGhpcy5Sb3V0ZXIpOwogICAgfQoKICAgIHRoaXMucnVuSW5pdGlh bGl6ZXJzKCk7CiAgICBFbWJlci5ydW5Mb2FkSG9va3MoJ2FwcGxpY2F0aW9u JywgdGhpcyk7CgogICAgLy8gQXQgdGhpcyBwb2ludCwgYW55IGluaXRpYWxp emVycyBvciBsb2FkIGhvb2tzIHRoYXQgd291bGQgaGF2ZSB3YW50ZWQKICAg IC8vIHRvIGRlZmVyIHJlYWRpbmVzcyBoYXZlIGZpcmVkLiBJbiBnZW5lcmFs LCBhZHZhbmNpbmcgcmVhZGluZXNzIGhlcmUKICAgIC8vIHdpbGwgcHJvY2Vl ZCB0byBkaWRCZWNvbWVSZWFkeS4KICAgIHRoaXMuYWR2YW5jZVJlYWRpbmVz cygpOwoKICAgIHJldHVybiB0aGlzOwogIH0sCgogIC8qKgogICAgUmVzZXQg dGhlIGFwcGxpY2F0aW9uLiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIG9ubHkg aW4gdGVzdHMuIEl0IGNsZWFucyB1cAogICAgdGhlIGFwcGxpY2F0aW9uIGlu IHRoZSBmb2xsb3dpbmcgb3JkZXI6CgogICAgMS4gRGVhY3RpdmF0ZSBleGlz dGluZyByb3V0ZXMKICAgIDIuIERlc3Ryb3kgYWxsIG9iamVjdHMgaW4gdGhl IGNvbnRhaW5lcgogICAgMy4gQ3JlYXRlIGEgbmV3IGFwcGxpY2F0aW9uIGNv bnRhaW5lcgogICAgNC4gUmUtcm91dGUgdG8gdGhlIGV4aXN0aW5nIHVybAoK ICAgIFR5cGljYWwgRXhhbXBsZToKCiAgICBgYGBqYXZhc2NyaXB0CgogICAg dmFyIEFwcDsKCiAgICBFbWJlci5ydW4oZnVuY3Rpb24oKSB7CiAgICAgIEFw cCA9IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSgpOwogICAgfSk7CgogICAg bW9kdWxlKCJhY2NlcHRhbmNlIHRlc3QiLCB7CiAgICAgIHNldHVwOiBmdW5j dGlvbigpIHsKICAgICAgICBBcHAucmVzZXQoKTsKICAgICAgfQogICAgfSk7 CgogICAgdGVzdCgiZmlyc3QgdGVzdCIsIGZ1bmN0aW9uKCkgewogICAgICAv LyBBcHAgaXMgZnJlc2hseSByZXNldAogICAgfSk7CgogICAgdGVzdCgiZmly c3QgdGVzdCIsIGZ1bmN0aW9uKCkgewogICAgICAvLyBBcHAgaXMgYWdhaW4g ZnJlc2hseSByZXNldAogICAgfSk7CiAgICBgYGAKCiAgICBBZHZhbmNlZCBF eGFtcGxlOgoKICAgIE9jY2FzaW9uYWxseSB5b3UgbWF5IHdhbnQgdG8gcHJl dmVudCB0aGUgYXBwIGZyb20gaW5pdGlhbGl6aW5nIGR1cmluZwogICAgc2V0 dXAuIFRoaXMgY291bGQgZW5hYmxlIGV4dHJhIGNvbmZpZ3VyYXRpb24sIG9y IGVuYWJsZSBhc3NlcnRpbmcgcHJpb3IKICAgIHRvIHRoZSBhcHAgYmVjb21p bmcgcmVhZHkuCgogICAgYGBgamF2YXNjcmlwdAoKICAgIHZhciBBcHA7Cgog ICAgRW1iZXIucnVuKGZ1bmN0aW9uKCkgewogICAgICBBcHAgPSBFbWJlci5B cHBsaWNhdGlvbi5jcmVhdGUoKTsKICAgIH0pOwoKICAgIG1vZHVsZSgiYWNj ZXB0YW5jZSB0ZXN0IiwgewogICAgICBzZXR1cDogZnVuY3Rpb24oKSB7CiAg ICAgICAgRW1iZXIucnVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgQXBwLnJl c2V0KCk7CiAgICAgICAgICBBcHAuZGVmZXJSZWFkaW5lc3MoKTsKICAgICAg ICB9KTsKICAgICAgfQogICAgfSk7CgogICAgdGVzdCgiZmlyc3QgdGVzdCIs IGZ1bmN0aW9uKCkgewogICAgICBvayh0cnVlLCAnc29tZXRoaW5nIGJlZm9y ZSBhcHAgaXMgaW5pdGlhbGl6ZWQnKTsKCiAgICAgIEVtYmVyLnJ1bihmdW5j dGlvbigpIHsKICAgICAgICBBcHAuYWR2YW5jZVJlYWRpbmVzcygpOwogICAg ICB9KTsKICAgICAgb2sodHJ1ZSwgJ3NvbWV0aGluZyBhZnRlciBhcHAgaXMg aW5pdGlhbGl6ZWQnKTsKICAgIH0pOwogICAgYGBgCgogICAgQG1ldGhvZCBy ZXNldAogICoqLwogIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX3Jl YWRpbmVzc0RlZmVycmFscyA9IDE7CgogICAgZnVuY3Rpb24gaGFuZGxlUmVz ZXQoKSB7CiAgICAgIHZhciByb3V0ZXIgPSB0aGlzLl9fY29udGFpbmVyX18u bG9va3VwKCdyb3V0ZXI6bWFpbicpOwogICAgICByb3V0ZXIucmVzZXQoKTsK CiAgICAgIEVtYmVyLnJ1bih0aGlzLl9fY29udGFpbmVyX18sICdkZXN0cm95 Jyk7CgogICAgICB0aGlzLmJ1aWxkQ29udGFpbmVyKCk7CgogICAgICBFbWJl ci5ydW4uc2NoZWR1bGUoJ2FjdGlvbnMnLCB0aGlzLCBmdW5jdGlvbigpIHsK ICAgICAgICB0aGlzLl9pbml0aWFsaXplKCk7CiAgICAgIH0pOwogICAgfQoK ICAgIEVtYmVyLnJ1bi5qb2luKHRoaXMsIGhhbmRsZVJlc2V0KTsKICB9LAoK ICAvKioKICAgIEBwcml2YXRlCiAgICBAbWV0aG9kIHJ1bkluaXRpYWxpemVy cwogICovCiAgcnVuSW5pdGlhbGl6ZXJzOiBmdW5jdGlvbigpIHsKICAgIHZh ciBpbml0aWFsaXplcnMgPSBnZXQodGhpcy5jb25zdHJ1Y3RvciwgJ2luaXRp YWxpemVycycpLAogICAgICAgIGNvbnRhaW5lciA9IHRoaXMuX19jb250YWlu ZXJfXywKICAgICAgICBncmFwaCA9IG5ldyBFbWJlci5EQUcoKSwKICAgICAg ICBuYW1lc3BhY2UgPSB0aGlzLAogICAgICAgIG5hbWUsIGluaXRpYWxpemVy OwoKICAgIGZvciAobmFtZSBpbiBpbml0aWFsaXplcnMpIHsKICAgICAgaW5p dGlhbGl6ZXIgPSBpbml0aWFsaXplcnNbbmFtZV07CiAgICAgIGdyYXBoLmFk ZEVkZ2VzKGluaXRpYWxpemVyLm5hbWUsIGluaXRpYWxpemVyLmluaXRpYWxp emUsIGluaXRpYWxpemVyLmJlZm9yZSwgaW5pdGlhbGl6ZXIuYWZ0ZXIpOwog ICAgfQoKICAgIGdyYXBoLnRvcHNvcnQoZnVuY3Rpb24gKHZlcnRleCkgewog ICAgICB2YXIgaW5pdGlhbGl6ZXIgPSB2ZXJ0ZXgudmFsdWU7CiAgICAgIEVt YmVyLmFzc2VydCgiTm8gYXBwbGljYXRpb24gaW5pdGlhbGl6ZXIgbmFtZWQg JyIrdmVydGV4Lm5hbWUrIiciLCBpbml0aWFsaXplcik7CiAgICAgIGluaXRp YWxpemVyKGNvbnRhaW5lciwgbmFtZXNwYWNlKTsKICAgIH0pOwogIH0sCgog IC8qKgogICAgQHByaXZhdGUKICAgIEBtZXRob2QgZGlkQmVjb21lUmVhZHkK ICAqLwogIGRpZEJlY29tZVJlYWR5OiBmdW5jdGlvbigpIHsKICAgIHRoaXMu c2V0dXBFdmVudERpc3BhdGNoZXIoKTsKICAgIHRoaXMucmVhZHkoKTsgLy8g dXNlciBob29rCiAgICB0aGlzLnN0YXJ0Um91dGluZygpOwoKICAgIGlmICgh RW1iZXIudGVzdGluZykgewogICAgICAvLyBFYWdlcmx5IG5hbWUgYWxsIGNs YXNzZXMgdGhhdCBhcmUgYWxyZWFkeSBsb2FkZWQKICAgICAgRW1iZXIuTmFt ZXNwYWNlLnByb2Nlc3NBbGwoKTsKICAgICAgRW1iZXIuQk9PVEVEID0gdHJ1 ZTsKICAgIH0KCiAgICB0aGlzLnJlc29sdmUodGhpcyk7CiAgfSwKCiAgLyoq CiAgICBTZXR1cCB1cCB0aGUgZXZlbnQgZGlzcGF0Y2hlciB0byByZWNlaXZl IGV2ZW50cyBvbiB0aGUKICAgIGFwcGxpY2F0aW9uJ3MgYHJvb3RFbGVtZW50 YCB3aXRoIGFueSByZWdpc3RlcmVkCiAgICBgY3VzdG9tRXZlbnRzYC4KCiAg ICBAcHJpdmF0ZQogICAgQG1ldGhvZCBzZXR1cEV2ZW50RGlzcGF0Y2hlcgog ICovCiAgc2V0dXBFdmVudERpc3BhdGNoZXI6IGZ1bmN0aW9uKCkgewogICAg dmFyIGN1c3RvbUV2ZW50cyA9IGdldCh0aGlzLCAnY3VzdG9tRXZlbnRzJyks CiAgICAgICAgcm9vdEVsZW1lbnQgPSBnZXQodGhpcywgJ3Jvb3RFbGVtZW50 JyksCiAgICAgICAgZGlzcGF0Y2hlciA9IHRoaXMuX19jb250YWluZXJfXy5s b29rdXAoJ2V2ZW50X2Rpc3BhdGNoZXI6bWFpbicpOwoKICAgIHNldCh0aGlz LCAnZXZlbnREaXNwYXRjaGVyJywgZGlzcGF0Y2hlcik7CiAgICBkaXNwYXRj aGVyLnNldHVwKGN1c3RvbUV2ZW50cywgcm9vdEVsZW1lbnQpOwogIH0sCgog IC8qKgogICAgdHJpZ2dlciBhIG5ldyBjYWxsIHRvIGByb3V0ZWAgd2hlbmV2 ZXIgdGhlIFVSTCBjaGFuZ2VzLgogICAgSWYgdGhlIGFwcGxpY2F0aW9uIGhh cyBhIHJvdXRlciwgdXNlIGl0IHRvIHJvdXRlIHRvIHRoZSBjdXJyZW50IFVS TCwgYW5kCgogICAgQHByaXZhdGUKICAgIEBtZXRob2Qgc3RhcnRSb3V0aW5n CiAgICBAcHJvcGVydHkgcm91dGVyIHtFbWJlci5Sb3V0ZXJ9CiAgKi8KICBz dGFydFJvdXRpbmc6IGZ1bmN0aW9uKCkgewogICAgdmFyIHJvdXRlciA9IHRo aXMuX19jb250YWluZXJfXy5sb29rdXAoJ3JvdXRlcjptYWluJyk7CiAgICBp ZiAoIXJvdXRlcikgeyByZXR1cm47IH0KCiAgICByb3V0ZXIuc3RhcnRSb3V0 aW5nKCk7CiAgfSwKCiAgaGFuZGxlVVJMOiBmdW5jdGlvbih1cmwpIHsKICAg IHZhciByb3V0ZXIgPSB0aGlzLl9fY29udGFpbmVyX18ubG9va3VwKCdyb3V0 ZXI6bWFpbicpOwoKICAgIHJvdXRlci5oYW5kbGVVUkwodXJsKTsKICB9LAoK ICAvKioKICAgIENhbGxlZCB3aGVuIHRoZSBBcHBsaWNhdGlvbiBoYXMgYmVj b21lIHJlYWR5LgogICAgVGhlIGNhbGwgd2lsbCBiZSBkZWxheWVkIHVudGls IHRoZSBET00gaGFzIGJlY29tZSByZWFkeS4KCiAgICBAZXZlbnQgcmVhZHkK ICAqLwogIHJlYWR5OiBFbWJlci5LLAoKICAvKioKICAgIEBkZXByZWNhdGVk IFVzZSAnUmVzb2x2ZXInIGluc3RlYWQKICAgIFNldCB0aGlzIHRvIHByb3Zp ZGUgYW4gYWx0ZXJuYXRlIGNsYXNzIHRvIGBFbWJlci5EZWZhdWx0UmVzb2x2 ZXJgCgoKICAgIEBwcm9wZXJ0eSByZXNvbHZlcgogICovCiAgcmVzb2x2ZXI6 IG51bGwsCgogIC8qKgogICAgU2V0IHRoaXMgdG8gcHJvdmlkZSBhbiBhbHRl cm5hdGUgY2xhc3MgdG8gYEVtYmVyLkRlZmF1bHRSZXNvbHZlcmAKCiAgICBA cHJvcGVydHkgcmVzb2x2ZXIKICAqLwogIFJlc29sdmVyOiBudWxsLAoKICB3 aWxsRGVzdHJveTogZnVuY3Rpb24oKSB7CiAgICBFbWJlci5CT09URUQgPSBm YWxzZTsKICAgIC8vIEVuc3VyZSBkZWFjdGl2YXRpb24gb2Ygcm91dGVzIGJl Zm9yZSBvYmplY3RzIGFyZSBkZXN0cm95ZWQKICAgIHRoaXMuX19jb250YWlu ZXJfXy5sb29rdXAoJ3JvdXRlcjptYWluJykucmVzZXQoKTsKCiAgICB0aGlz Ll9fY29udGFpbmVyX18uZGVzdHJveSgpOwogIH0sCgogIGluaXRpYWxpemVy OiBmdW5jdGlvbihvcHRpb25zKSB7CiAgICB0aGlzLmNvbnN0cnVjdG9yLmlu aXRpYWxpemVyKG9wdGlvbnMpOwogIH0KfSk7CgpFbWJlci5BcHBsaWNhdGlv bi5yZW9wZW5DbGFzcyh7CiAgaW5pdGlhbGl6ZXJzOiB7fSwKICBpbml0aWFs aXplcjogZnVuY3Rpb24oaW5pdGlhbGl6ZXIpIHsKICAgIC8vIElmIHRoaXMg aXMgdGhlIGZpcnN0IGluaXRpYWxpemVyIGJlaW5nIGFkZGVkIHRvIGEgc3Vi Y2xhc3MsIHdlIGFyZSBnb2luZyB0byByZW9wZW4gdGhlIGNsYXNzCiAgICAv LyB0byBtYWtlIHN1cmUgd2UgaGF2ZSBhIG5ldyBgaW5pdGlhbGl6ZXJzYCBv YmplY3QsIHdoaWNoIGV4dGVuZHMgZnJvbSB0aGUgcGFyZW50IGNsYXNzJyB1 c2luZwogICAgLy8gcHJvdG90eXBhbCBpbmhlcml0YW5jZS4gV2l0aG91dCB0 aGlzLCBhdHRlbXB0aW5nIHRvIGFkZCBpbml0aWFsaXplcnMgdG8gdGhlIHN1 YmNsYXNzIHdvdWxkCiAgICAvLyBwb2xsdXRlIHRoZSBwYXJlbnQgY2xhc3Mg YXMgd2VsbCBhcyBvdGhlciBzdWJjbGFzc2VzLgogICAgaWYgKHRoaXMuc3Vw ZXJjbGFzcy5pbml0aWFsaXplcnMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnN1 cGVyY2xhc3MuaW5pdGlhbGl6ZXJzID09PSB0aGlzLmluaXRpYWxpemVycykg ewogICAgICB0aGlzLnJlb3BlbkNsYXNzKHsKICAgICAgICBpbml0aWFsaXpl cnM6IEVtYmVyLmNyZWF0ZSh0aGlzLmluaXRpYWxpemVycykKICAgICAgfSk7 CiAgICB9CgogICAgRW1iZXIuYXNzZXJ0KCJUaGUgaW5pdGlhbGl6ZXIgJyIg KyBpbml0aWFsaXplci5uYW1lICsgIicgaGFzIGFscmVhZHkgYmVlbiByZWdp c3RlcmVkIiwgIXRoaXMuaW5pdGlhbGl6ZXJzW2luaXRpYWxpemVyLm5hbWVd KTsKICAgIEVtYmVyLmFzc2VydCgiQW4gaW5pdGlhbGl6ZXIgY2Fubm90IGJl IHJlZ2lzdGVyZWQgd2l0aCBib3RoIGEgYmVmb3JlIGFuZCBhbiBhZnRlciIs ICEoaW5pdGlhbGl6ZXIuYmVmb3JlICYmIGluaXRpYWxpemVyLmFmdGVyKSk7 CiAgICBFbWJlci5hc3NlcnQoIkFuIGluaXRpYWxpemVyIGNhbm5vdCBiZSBy ZWdpc3RlcmVkIHdpdGhvdXQgYW4gaW5pdGlhbGl6ZSBmdW5jdGlvbiIsIEVt YmVyLmNhbkludm9rZShpbml0aWFsaXplciwgJ2luaXRpYWxpemUnKSk7Cgog ICAgdGhpcy5pbml0aWFsaXplcnNbaW5pdGlhbGl6ZXIubmFtZV0gPSBpbml0 aWFsaXplcjsKICB9LAoKICAvKioKICAgIFRoaXMgY3JlYXRlcyBhIGNvbnRh aW5lciB3aXRoIHRoZSBkZWZhdWx0IEVtYmVyIG5hbWluZyBjb252ZW50aW9u cy4KCiAgICBJdCBhbHNvIGNvbmZpZ3VyZXMgdGhlIGNvbnRhaW5lcjoKCiAg ICAqIHJlZ2lzdGVyZWQgdmlld3MgYXJlIGNyZWF0ZWQgZXZlcnkgdGltZSB0 aGV5IGFyZSBsb29rZWQgdXAgKHRoZXkgYXJlCiAgICAgIG5vdCBzaW5nbGV0 b25zKQogICAgKiByZWdpc3RlcmVkIHRlbXBsYXRlcyBhcmUgbm90IGZhY3Rv cmllczsgdGhlIHJlZ2lzdGVyZWQgdmFsdWUgaXMKICAgICAgcmV0dXJuZWQg ZGlyZWN0bHkuCiAgICAqIHRoZSByb3V0ZXIgcmVjZWl2ZXMgdGhlIGFwcGxp Y2F0aW9uIGFzIGl0cyBgbmFtZXNwYWNlYCBwcm9wZXJ0eQogICAgKiBhbGwg Y29udHJvbGxlcnMgcmVjZWl2ZSB0aGUgcm91dGVyIGFzIHRoZWlyIGB0YXJn ZXRgIGFuZCBgY29udHJvbGxlcnNgCiAgICAgIHByb3BlcnRpZXMKICAgICog YWxsIGNvbnRyb2xsZXJzIHJlY2VpdmUgdGhlIGFwcGxpY2F0aW9uIGFzIHRo ZWlyIGBuYW1lc3BhY2VgIHByb3BlcnR5CiAgICAqIHRoZSBhcHBsaWNhdGlv biB2aWV3IHJlY2VpdmVzIHRoZSBhcHBsaWNhdGlvbiBjb250cm9sbGVyIGFz IGl0cwogICAgICBgY29udHJvbGxlcmAgcHJvcGVydHkKICAgICogdGhlIGFw cGxpY2F0aW9uIHZpZXcgcmVjZWl2ZXMgdGhlIGFwcGxpY2F0aW9uIHRlbXBs YXRlIGFzIGl0cwogICAgICBgZGVmYXVsdFRlbXBsYXRlYCBwcm9wZXJ0eQoK ICAgIEBwcml2YXRlCiAgICBAbWV0aG9kIGJ1aWxkQ29udGFpbmVyCiAgICBA c3RhdGljCiAgICBAcGFyYW0ge0VtYmVyLkFwcGxpY2F0aW9ufSBuYW1lc3Bh Y2UgdGhlIGFwcGxpY2F0aW9uIHRvIGJ1aWxkIHRoZQogICAgICBjb250YWlu ZXIgZm9yLgogICAgQHJldHVybiB7RW1iZXIuQ29udGFpbmVyfSB0aGUgYnVp bHQgY29udGFpbmVyCiAgKi8KICBidWlsZENvbnRhaW5lcjogZnVuY3Rpb24o bmFtZXNwYWNlKSB7CiAgICB2YXIgY29udGFpbmVyID0gbmV3IEVtYmVyLkNv bnRhaW5lcigpOwoKICAgIEVtYmVyLkNvbnRhaW5lci5kZWZhdWx0Q29udGFp bmVyID0gbmV3IERlcHJlY2F0ZWRDb250YWluZXIoY29udGFpbmVyKTsKCiAg ICBjb250YWluZXIuc2V0ID0gRW1iZXIuc2V0OwogICAgY29udGFpbmVyLnJl c29sdmVyICA9IHJlc29sdmVyRm9yKG5hbWVzcGFjZSk7CiAgICBjb250YWlu ZXIubm9ybWFsaXplID0gY29udGFpbmVyLnJlc29sdmVyLm5vcm1hbGl6ZTsK ICAgIGNvbnRhaW5lci5kZXNjcmliZSAgPSBjb250YWluZXIucmVzb2x2ZXIu ZGVzY3JpYmU7CiAgICBjb250YWluZXIubWFrZVRvU3RyaW5nID0gY29udGFp bmVyLnJlc29sdmVyLm1ha2VUb1N0cmluZzsKCiAgICBjb250YWluZXIub3B0 aW9uc0ZvclR5cGUoJ2NvbXBvbmVudCcsIHsgc2luZ2xldG9uOiBmYWxzZSB9 KTsKICAgIGNvbnRhaW5lci5vcHRpb25zRm9yVHlwZSgndmlldycsIHsgc2lu Z2xldG9uOiBmYWxzZSB9KTsKICAgIGNvbnRhaW5lci5vcHRpb25zRm9yVHlw ZSgndGVtcGxhdGUnLCB7IGluc3RhbnRpYXRlOiBmYWxzZSB9KTsKICAgIGNv bnRhaW5lci5vcHRpb25zRm9yVHlwZSgnaGVscGVyJywgeyBpbnN0YW50aWF0 ZTogZmFsc2UgfSk7CgogICAgY29udGFpbmVyLnJlZ2lzdGVyKCdhcHBsaWNh dGlvbjptYWluJywgbmFtZXNwYWNlLCB7IGluc3RhbnRpYXRlOiBmYWxzZSB9 KTsKCiAgICBjb250YWluZXIucmVnaXN0ZXIoJ2NvbnRyb2xsZXI6YmFzaWMn LCBFbWJlci5Db250cm9sbGVyLCB7IGluc3RhbnRpYXRlOiBmYWxzZSB9KTsK ICAgIGNvbnRhaW5lci5yZWdpc3RlcignY29udHJvbGxlcjpvYmplY3QnLCBF bWJlci5PYmplY3RDb250cm9sbGVyLCB7IGluc3RhbnRpYXRlOiBmYWxzZSB9 KTsKICAgIGNvbnRhaW5lci5yZWdpc3RlcignY29udHJvbGxlcjphcnJheScs IEVtYmVyLkFycmF5Q29udHJvbGxlciwgeyBpbnN0YW50aWF0ZTogZmFsc2Ug fSk7CiAgICBjb250YWluZXIucmVnaXN0ZXIoJ3JvdXRlOmJhc2ljJywgRW1i ZXIuUm91dGUsIHsgaW5zdGFudGlhdGU6IGZhbHNlIH0pOwogICAgY29udGFp bmVyLnJlZ2lzdGVyKCdldmVudF9kaXNwYXRjaGVyOm1haW4nLCBFbWJlci5F dmVudERpc3BhdGNoZXIpOwoKICAgIGNvbnRhaW5lci5yZWdpc3Rlcigncm91 dGVyOm1haW4nLCAgRW1iZXIuUm91dGVyKTsKICAgIGNvbnRhaW5lci5pbmpl Y3Rpb24oJ3JvdXRlcjptYWluJywgJ25hbWVzcGFjZScsICdhcHBsaWNhdGlv bjptYWluJyk7CgogICAgCiAgICAgIGNvbnRhaW5lci5yZWdpc3RlcignbG9j YXRpb246YXV0bycsIEVtYmVyLkF1dG9Mb2NhdGlvbik7CiAgICAKICAgIAog ICAgY29udGFpbmVyLnJlZ2lzdGVyKCdsb2NhdGlvbjpoYXNoJywgRW1iZXIu SGFzaExvY2F0aW9uKTsKICAgIGNvbnRhaW5lci5yZWdpc3RlcignbG9jYXRp b246aGlzdG9yeScsIEVtYmVyLkhpc3RvcnlMb2NhdGlvbik7CiAgICBjb250 YWluZXIucmVnaXN0ZXIoJ2xvY2F0aW9uOm5vbmUnLCBFbWJlci5Ob25lTG9j YXRpb24pOwoKICAgIGNvbnRhaW5lci5pbmplY3Rpb24oJ2NvbnRyb2xsZXIn LCAndGFyZ2V0JywgJ3JvdXRlcjptYWluJyk7CiAgICBjb250YWluZXIuaW5q ZWN0aW9uKCdjb250cm9sbGVyJywgJ25hbWVzcGFjZScsICdhcHBsaWNhdGlv bjptYWluJyk7CgogICAgY29udGFpbmVyLmluamVjdGlvbigncm91dGUnLCAn cm91dGVyJywgJ3JvdXRlcjptYWluJyk7CgogICAgcmV0dXJuIGNvbnRhaW5l cjsKICB9Cn0pOwoKLyoqCiAgVGhpcyBmdW5jdGlvbiBkZWZpbmVzIHRoZSBk ZWZhdWx0IGxvb2t1cCBydWxlcyBmb3IgY29udGFpbmVyIGxvb2t1cHM6Cgog ICogdGVtcGxhdGVzIGFyZSBsb29rZWQgdXAgb24gYEVtYmVyLlRFTVBMQVRF U2AKICAqIG90aGVyIG5hbWVzIGFyZSBsb29rZWQgdXAgb24gdGhlIGFwcGxp Y2F0aW9uIGFmdGVyIGNsYXNzaWZ5aW5nIHRoZSBuYW1lLgogICAgRm9yIGV4 YW1wbGUsIGBjb250cm9sbGVyOnBvc3RgIGxvb2tzIHVwIGBBcHAuUG9zdENv bnRyb2xsZXJgIGJ5IGRlZmF1bHQuCiAgKiBpZiB0aGUgZGVmYXVsdCBsb29r dXAgZmFpbHMsIGxvb2sgZm9yIHJlZ2lzdGVyZWQgY2xhc3NlcyBvbiB0aGUg Y29udGFpbmVyCgogIFRoaXMgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byBy ZWdpc3RlciBkZWZhdWx0IGluamVjdGlvbnMgaW4gdGhlIGNvbnRhaW5lcgog IHRoYXQgY291bGQgYmUgb3ZlcnJpZGRlbiBieSB0aGUgbm9ybWFsIG5hbWlu ZyBjb252ZW50aW9uLgoKICBAcHJpdmF0ZQogIEBtZXRob2QgcmVzb2x2ZXJG b3IKICBAcGFyYW0ge0VtYmVyLk5hbWVzcGFjZX0gbmFtZXNwYWNlIHRoZSBu YW1lc3BhY2UgdG8gbG9vayBmb3IgY2xhc3NlcwogIEByZXR1cm4geyp9IHRo ZSByZXNvbHZlZCB2YWx1ZSBmb3IgYSBnaXZlbiBsb29rdXAKKi8KZnVuY3Rp b24gcmVzb2x2ZXJGb3IobmFtZXNwYWNlKSB7CiAgaWYgKG5hbWVzcGFjZS5n ZXQoJ3Jlc29sdmVyJykpIHsKICAgIEVtYmVyLmRlcHJlY2F0ZSgnQXBwbGlj YXRpb24ucmVzb2x2ZXIgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBBcHBs aWNhdGlvbi5SZXNvbHZlcicsIGZhbHNlKTsKICB9CgogIHZhciBSZXNvbHZl ckNsYXNzID0gbmFtZXNwYWNlLmdldCgncmVzb2x2ZXInKSB8fCBuYW1lc3Bh Y2UuZ2V0KCdSZXNvbHZlcicpIHx8IEVtYmVyLkRlZmF1bHRSZXNvbHZlcjsK ICB2YXIgcmVzb2x2ZXIgPSBSZXNvbHZlckNsYXNzLmNyZWF0ZSh7CiAgICBu YW1lc3BhY2U6IG5hbWVzcGFjZQogIH0pOwoKICBmdW5jdGlvbiByZXNvbHZl KGZ1bGxOYW1lKSB7CiAgICByZXR1cm4gcmVzb2x2ZXIucmVzb2x2ZShmdWxs TmFtZSk7CiAgfQoKICByZXNvbHZlLmRlc2NyaWJlID0gZnVuY3Rpb24oZnVs bE5hbWUpIHsKICAgIHJldHVybiByZXNvbHZlci5sb29rdXBEZXNjcmlwdGlv bihmdWxsTmFtZSk7CiAgfTsKCiAgcmVzb2x2ZS5tYWtlVG9TdHJpbmcgPSBm dW5jdGlvbihmYWN0b3J5LCBmdWxsTmFtZSkgewogICAgcmV0dXJuIHJlc29s dmVyLm1ha2VUb1N0cmluZyhmYWN0b3J5LCBmdWxsTmFtZSk7CiAgfTsKCiAg cmVzb2x2ZS5ub3JtYWxpemUgPSBmdW5jdGlvbihmdWxsTmFtZSkgewogICAg aWYgKHJlc29sdmVyLm5vcm1hbGl6ZSkgewogICAgICByZXR1cm4gcmVzb2x2 ZXIubm9ybWFsaXplKGZ1bGxOYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIEVt YmVyLmRlcHJlY2F0ZSgnVGhlIFJlc29sdmVyIHNob3VsZCBub3cgcHJvdmlk ZSBhIFwnbm9ybWFsaXplXCcgZnVuY3Rpb24nLCBmYWxzZSk7CiAgICAgIHJl dHVybiBmdWxsTmFtZTsKICAgIH0KICB9OwoKICByZXR1cm4gcmVzb2x2ZTsK fQoKRW1iZXIucnVuTG9hZEhvb2tzKCdFbWJlci5BcHBsaWNhdGlvbicsIEVt YmVyLkFwcGxpY2F0aW9uKTsKCn0pKCk7CgoKCihmdW5jdGlvbigpIHsKCn0p KCk7CgoKCihmdW5jdGlvbigpIHsKLyoqCkBtb2R1bGUgZW1iZXIKQHN1Ym1v ZHVsZSBlbWJlci1hcHBsaWNhdGlvbgoqLwoKdmFyIGdldCA9IEVtYmVyLmdl dCwgc2V0ID0gRW1iZXIuc2V0OwoKZnVuY3Rpb24gdmVyaWZ5TmVlZHNEZXBl bmRlbmNpZXMoY29udHJvbGxlciwgY29udGFpbmVyLCBuZWVkcykgewogIHZh ciBkZXBlbmRlbmN5LCBpLCBsLCBtaXNzaW5nID0gW107CgogIGZvciAoaT0w LCBsPW5lZWRzLmxlbmd0aDsgaTxsOyBpKyspIHsKICAgIGRlcGVuZGVuY3kg PSBuZWVkc1tpXTsKCiAgICBFbWJlci5hc3NlcnQoRW1iZXIuaW5zcGVjdChj b250cm9sbGVyKSArICIjbmVlZHMgbXVzdCBub3Qgc3BlY2lmeSBkZXBlbmRl bmNpZXMgd2l0aCBwZXJpb2RzIGluIHRoZWlyIG5hbWVzICgiICsgZGVwZW5k ZW5jeSArICIpIiwgZGVwZW5kZW5jeS5pbmRleE9mKCcuJykgPT09IC0xKTsK CiAgICBpZiAoZGVwZW5kZW5jeS5pbmRleE9mKCc6JykgPT09IC0xKSB7CiAg ICAgIGRlcGVuZGVuY3kgPSAiY29udHJvbGxlcjoiICsgZGVwZW5kZW5jeTsK ICAgIH0KCiAgICAvLyBTdHJ1Y3R1cmUgYXNzZXJ0IHRvIHN0aWxsIGRvIHZl cmlmaWNhdGlvbiBidXQgbm90IHN0cmluZyBjb25jYXQgaW4gcHJvZHVjdGlv bgogICAgaWYgKCFjb250YWluZXIuaGFzKGRlcGVuZGVuY3kpKSB7CiAgICAg IG1pc3NpbmcucHVzaChkZXBlbmRlbmN5KTsKICAgIH0KICB9CiAgaWYgKG1p c3NpbmcubGVuZ3RoKSB7CiAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoRW1i ZXIuaW5zcGVjdChjb250cm9sbGVyKSArICIgbmVlZHMgWyAiICsgbWlzc2lu Zy5qb2luKCcsICcpICsgIiBdIGJ1dCAiICsgKG1pc3NpbmcubGVuZ3RoID4g MSA/ICd0aGV5JyA6ICdpdCcpICsgIiBjb3VsZCBub3QgYmUgZm91bmQiKTsK ICB9Cn0KCnZhciBkZWZhdWx0Q29udHJvbGxlcnNDb21wdXRlZFByb3BlcnR5 ID0gRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7CiAgdmFyIGNvbnRyb2xs ZXIgPSB0aGlzOwoKICByZXR1cm4gewogICAgbmVlZHM6IGdldChjb250cm9s bGVyLCAnbmVlZHMnKSwKICAgIGNvbnRhaW5lcjogZ2V0KGNvbnRyb2xsZXIs ICdjb250YWluZXInKSwKICAgIHVua25vd25Qcm9wZXJ0eTogZnVuY3Rpb24o Y29udHJvbGxlck5hbWUpIHsKICAgICAgdmFyIG5lZWRzID0gdGhpcy5uZWVk cywKICAgICAgICBkZXBlbmRlbmN5LCBpLCBsOwogICAgICBmb3IgKGk9MCwg bD1uZWVkcy5sZW5ndGg7IGk8bDsgaSsrKSB7CiAgICAgICAgZGVwZW5kZW5j eSA9IG5lZWRzW2ldOwogICAgICAgIGlmIChkZXBlbmRlbmN5ID09PSBjb250 cm9sbGVyTmFtZSkgewogICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVy Lmxvb2t1cCgnY29udHJvbGxlcjonICsgY29udHJvbGxlck5hbWUpOwogICAg ICAgIH0KICAgICAgfQoKICAgICAgdmFyIGVycm9yTWVzc2FnZSA9IEVtYmVy Lmluc3BlY3QoY29udHJvbGxlcikgKyAnI25lZWRzIGRvZXMgbm90IGluY2x1 ZGUgYCcgKyBjb250cm9sbGVyTmFtZSArICdgLiBUbyBhY2Nlc3MgdGhlICcg KyBjb250cm9sbGVyTmFtZSArICcgY29udHJvbGxlciBmcm9tICcgKyBFbWJl ci5pbnNwZWN0KGNvbnRyb2xsZXIpICsgJywgJyArIEVtYmVyLmluc3BlY3Qo Y29udHJvbGxlcikgKyAnIHNob3VsZCBoYXZlIGEgYG5lZWRzYCBwcm9wZXJ0 eSB0aGF0IGlzIGFuIGFycmF5IG9mIHRoZSBjb250cm9sbGVycyBpdCBoYXMg YWNjZXNzIHRvLic7CiAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihl cnJvck1lc3NhZ2UpOwogICAgfSwKICAgIHNldFVua25vd25Qcm9wZXJ0eTog ZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgdGhyb3cgbmV3IEVycm9y KCJZb3UgY2Fubm90IG92ZXJ3cml0ZSB0aGUgdmFsdWUgb2YgYGNvbnRyb2xs ZXJzLiIgKyBrZXkgKyAiYCBvZiAiICsgRW1iZXIuaW5zcGVjdChjb250cm9s bGVyKSk7CiAgICB9CiAgfTsKfSk7CgovKioKICBAY2xhc3MgQ29udHJvbGxl ck1peGluCiAgQG5hbWVzcGFjZSBFbWJlcgoqLwpFbWJlci5Db250cm9sbGVy TWl4aW4ucmVvcGVuKHsKICBjb25jYXRlbmF0ZWRQcm9wZXJ0aWVzOiBbJ25l ZWRzJ10sCgogIC8qKgogICAgQW4gYXJyYXkgb2Ygb3RoZXIgY29udHJvbGxl ciBvYmplY3RzIGF2YWlsYWJsZSBpbnNpZGUKICAgIGluc3RhbmNlcyBvZiB0 aGlzIGNvbnRyb2xsZXIgdmlhIHRoZSBgY29udHJvbGxlcnNgCiAgICBwcm9w ZXJ0eToKCiAgICBGb3IgZXhhbXBsZSwgd2hlbiB5b3UgZGVmaW5lIGEgY29u dHJvbGxlcjoKCiAgICBgYGBqYXZhc2NyaXB0CiAgICBBcHAuQ29tbWVudHND b250cm9sbGVyID0gRW1iZXIuQXJyYXlDb250cm9sbGVyLmV4dGVuZCh7CiAg ICAgIG5lZWRzOiBbJ3Bvc3QnXQogICAgfSk7CiAgICBgYGAKCiAgICBUaGUg YXBwbGljYXRpb24ncyBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlc2Ugb3RoZXIK ICAgIGNvbnRyb2xsZXJzIGFyZSBhY2Nlc3NpYmxlIGJ5IG5hbWUgdGhyb3Vn aCB0aGUKICAgIGBjb250cm9sbGVyc2AgcHJvcGVydHk6CgogICAgYGBgamF2 YXNjcmlwdAogICAgdGhpcy5nZXQoJ2NvbnRyb2xsZXJzLnBvc3QnKTsgLy8g aW5zdGFuY2Ugb2YgQXBwLlBvc3RDb250cm9sbGVyCiAgICBgYGAKCiAgICBH aXZlbiB0aGF0IHlvdSBoYXZlIGEgbmVzdGVkIGNvbnRyb2xsZXIgKG5lc3Rl ZCByZXNvdXJjZSk6CgogICAgYGBgamF2YXNjcmlwdAogICAgQXBwLkNvbW1l bnRzTmV3Q29udHJvbGxlciA9IEVtYmVyLk9iamVjdENvbnRyb2xsZXIuZXh0 ZW5kKHsKICAgIH0pOwogICAgYGBgCgogICAgV2hlbiB5b3UgZGVmaW5lIGEg Y29udHJvbGxlciB0aGF0IHJlcXVpcmVzIGFjY2VzcyB0byBhIG5lc3RlZCBv bmU6CgogICAgYGBgamF2YXNjcmlwdAogICAgQXBwLkluZGV4Q29udHJvbGxl ciA9IEVtYmVyLk9iamVjdENvbnRyb2xsZXIuZXh0ZW5kKHsKICAgICAgbmVl ZHM6IFsnY29tbWVudHNOZXcnXQogICAgfSk7CiAgICBgYGAKCiAgICBZb3Ug d2lsbCBiZSBhYmxlIHRvIGdldCBhY2Nlc3MgdG8gaXQ6CgogICAgYGBgamF2 YXNjcmlwdAogICAgdGhpcy5nZXQoJ2NvbnRyb2xsZXJzLmNvbW1lbnRzTmV3 Jyk7IC8vIGluc3RhbmNlIG9mIEFwcC5Db21tZW50c05ld0NvbnRyb2xsZXIK ICAgIGBgYAoKICAgIFRoaXMgaXMgb25seSBhdmFpbGFibGUgZm9yIHNpbmds ZXRvbiBjb250cm9sbGVycy4KCiAgICBAcHJvcGVydHkge0FycmF5fSBuZWVk cwogICAgQGRlZmF1bHQgW10KICAqLwogIG5lZWRzOiBbXSwKCiAgaW5pdDog ZnVuY3Rpb24oKSB7CiAgICB2YXIgbmVlZHMgPSBnZXQodGhpcywgJ25lZWRz JyksCiAgICBsZW5ndGggPSBnZXQobmVlZHMsICdsZW5ndGgnKTsKCiAgICBp ZiAobGVuZ3RoID4gMCkgewogICAgICBFbWJlci5hc3NlcnQoJyBgJyArIEVt YmVyLmluc3BlY3QodGhpcykgKyAnIHNwZWNpZmllcyBgbmVlZHNgLCBidXQg ZG9lcyAnICsKICAgICAgICAgICAgICAgICAgICJub3QgaGF2ZSBhIGNvbnRh aW5lci4gUGxlYXNlIGVuc3VyZSB0aGlzIGNvbnRyb2xsZXIgd2FzICIgKwog ICAgICAgICAgICAgICAgICAgImluc3RhbnRpYXRlZCB3aXRoIGEgY29udGFp bmVyLiIsCiAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lciB8fCBF bWJlci5tZXRhKHRoaXMsIGZhbHNlKS5kZXNjcy5jb250cm9sbGVycyAhPT0g ZGVmYXVsdENvbnRyb2xsZXJzQ29tcHV0ZWRQcm9wZXJ0eSk7CgogICAgICBp ZiAodGhpcy5jb250YWluZXIpIHsKICAgICAgICB2ZXJpZnlOZWVkc0RlcGVu ZGVuY2llcyh0aGlzLCB0aGlzLmNvbnRhaW5lciwgbmVlZHMpOwogICAgICB9 CgogICAgICAvLyBpZiBuZWVkcyB0aGVuIGluaXRpYWxpemUgY29udHJvbGxl cnMgcHJveHkKICAgICAgZ2V0KHRoaXMsICdjb250cm9sbGVycycpOwogICAg fQoKICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAg fSwKCiAgLyoqCiAgICBAbWV0aG9kIGNvbnRyb2xsZXJGb3IKICAgIEBzZWUg e0VtYmVyLlJvdXRlI2NvbnRyb2xsZXJGb3J9CiAgICBAZGVwcmVjYXRlZCBV c2UgYG5lZWRzYCBpbnN0ZWFkCiAgKi8KICBjb250cm9sbGVyRm9yOiBmdW5j dGlvbihjb250cm9sbGVyTmFtZSkgewogICAgRW1iZXIuZGVwcmVjYXRlKCJD b250cm9sbGVyI2NvbnRyb2xsZXJGb3IgaXMgZGVwcmVjYXRlZCwgcGxlYXNl IHVzZSBDb250cm9sbGVyI25lZWRzIGluc3RlYWQiKTsKICAgIHJldHVybiBF bWJlci5jb250cm9sbGVyRm9yKGdldCh0aGlzLCAnY29udGFpbmVyJyksIGNv bnRyb2xsZXJOYW1lKTsKICB9LAoKICAvKioKICAgIFN0b3JlcyB0aGUgaW5z dGFuY2VzIG9mIG90aGVyIGNvbnRyb2xsZXJzIGF2YWlsYWJsZSBmcm9tIHdp dGhpbgogICAgdGhpcyBjb250cm9sbGVyLiBBbnkgY29udHJvbGxlciBsaXN0 ZWQgYnkgbmFtZSBpbiB0aGUgYG5lZWRzYAogICAgcHJvcGVydHkgd2lsbCBi ZSBhY2Nlc3NpYmxlIGJ5IG5hbWUgdGhyb3VnaCB0aGlzIHByb3BlcnR5LgoK ICAgIGBgYGphdmFzY3JpcHQKICAgIEFwcC5Db21tZW50c0NvbnRyb2xsZXIg PSBFbWJlci5BcnJheUNvbnRyb2xsZXIuZXh0ZW5kKHsKICAgICAgbmVlZHM6 IFsncG9zdCddLAogICAgICBwb3N0VGl0bGU6IGZ1bmN0aW9uKCl7CiAgICAg ICAgdmFyIGN1cnJlbnRQb3N0ID0gdGhpcy5nZXQoJ2NvbnRyb2xsZXJzLnBv c3QnKTsgLy8gaW5zdGFuY2Ugb2YgQXBwLlBvc3RDb250cm9sbGVyCiAgICAg ICAgcmV0dXJuIGN1cnJlbnRQb3N0LmdldCgndGl0bGUnKTsKICAgICAgfS5w cm9wZXJ0eSgnY29udHJvbGxlcnMucG9zdC50aXRsZScpCiAgICB9KTsKICAg IGBgYAoKICAgIEBzZWUge0VtYmVyLkNvbnRyb2xsZXJNaXhpbiNuZWVkc30K ICAgIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb250cm9sbGVycwogICAgQGRlZmF1 bHQgbnVsbAogICovCiAgY29udHJvbGxlcnM6IGRlZmF1bHRDb250cm9sbGVy c0NvbXB1dGVkUHJvcGVydHkKfSk7Cgp9KSgpOwoKCgooZnVuY3Rpb24oKSB7 Cgp9KSgpOwoKCgooZnVuY3Rpb24oKSB7Ci8qKgpFbWJlciBBcHBsaWNhdGlv bgoKQG1vZHVsZSBlbWJlcgpAc3VibW9kdWxlIGVtYmVyLWFwcGxpY2F0aW9u CkByZXF1aXJlcyBlbWJlci12aWV3cywgZW1iZXItcm91dGluZwoqLwoKfSko KTsKCihmdW5jdGlvbigpIHsKLyoqCkBtb2R1bGUgZW1iZXIKQHN1Ym1vZHVs ZSBlbWJlci1leHRlbnNpb24tc3VwcG9ydAoqLwovKioKICBUaGUgYERhdGFB ZGFwdGVyYCBoZWxwcyBhIGRhdGEgcGVyc2lzdGVuY2UgbGlicmFyeQogIGlu dGVyZmFjZSB3aXRoIHRvb2xzIHRoYXQgZGVidWcgRW1iZXIgc3VjaAogIGFz IHRoZSBbRW1iZXIgRXh0ZW5zaW9uXShodHRwczovL2dpdGh1Yi5jb20vdGls ZGVpby9lbWJlci1leHRlbnNpb24pCiAgZm9yIENocm9tZSBhbmQgRmlyZWZv eC4KCiAgVGhpcyBjbGFzcyB3aWxsIGJlIGV4dGVuZGVkIGJ5IGEgcGVyc2lz dGVuY2UgbGlicmFyeQogIHdoaWNoIHdpbGwgb3ZlcnJpZGUgc29tZSBvZiB0 aGUgbWV0aG9kcyB3aXRoCiAgbGlicmFyeS1zcGVjaWZpYyBjb2RlLgoKICBU aGUgbWV0aG9kcyBsaWtlbHkgdG8gYmUgb3ZlcnJpZGRlbiBhcmU6CgogICog YGdldEZpbHRlcnNgCiAgKiBgZGV0ZWN0YAogICogYGNvbHVtbnNGb3JUeXBl YAogICogYGdldFJlY29yZHNgCiAgKiBgZ2V0UmVjb3JkQ29sdW1uVmFsdWVz YAogICogYGdldFJlY29yZEtleXdvcmRzYAogICogYGdldFJlY29yZEZpbHRl clZhbHVlc2AKICAqIGBnZXRSZWNvcmRDb2xvcmAKICAqIGBvYnNlcnZlUmVj b3JkYAoKICBUaGUgYWRhcHRlciB3aWxsIG5lZWQgdG8gYmUgcmVnaXN0ZXJl ZAogIGluIHRoZSBhcHBsaWNhdGlvbidzIGNvbnRhaW5lciBhcyBgZGF0YUFk YXB0ZXI6bWFpbmAKCiAgRXhhbXBsZToKCiAgYGBgamF2YXNjcmlwdAogIEFw cGxpY2F0aW9uLmluaXRpYWxpemVyKHsKICAgIG5hbWU6ICJkYXRhQWRhcHRl ciIsCgogICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oY29udGFpbmVyLCBhcHBs aWNhdGlvbikgewogICAgICBhcHBsaWNhdGlvbi5yZWdpc3RlcignZGF0YUFk YXB0ZXI6bWFpbicsIERTLkRhdGFBZGFwdGVyKTsKICAgIH0KICB9KTsKICBg YGAKCiAgQGNsYXNzIERhdGFBZGFwdGVyCiAgQG5hbWVzcGFjZSBFbWJlcgog IEBleHRlbmRzIEVtYmVyLk9iamVjdAoqLwpFbWJlci5EYXRhQWRhcHRlciA9 IEVtYmVyLk9iamVjdC5leHRlbmQoewogIGluaXQ6IGZ1bmN0aW9uKCkgewog ICAgdGhpcy5fc3VwZXIoKTsKICAgIHRoaXMucmVsZWFzZU1ldGhvZHMgPSBF bWJlci5BKCk7CiAgfSwKCiAgLyoqCiAgICBUaGUgY29udGFpbmVyIG9mIHRo ZSBhcHBsaWNhdGlvbiBiZWluZyBkZWJ1Z2dlZC4KICAgIFRoaXMgcHJvcGVy dHkgd2lsbCBiZSBpbmplY3RlZAogICAgb24gY3JlYXRpb24uCgogICAgQHBy b3BlcnR5IGNvbnRhaW5lcgogICAgQGRlZmF1bHQgbnVsbAogICovCiAgY29u dGFpbmVyOiBudWxsLAoKICAvKioKICAgIE51bWJlciBvZiBhdHRyaWJ1dGVz IHRvIHNlbmQKICAgIGFzIGNvbHVtbnMuIChFbm91Z2ggdG8gbWFrZSB0aGUg cmVjb3JkCiAgICBpZGVudGlmaWFibGUpLgoKICAgIEBwcml2YXRlCiAgICBA cHJvcGVydHkgYXR0cmlidXRlTGltaXQKICAgIEBkZWZhdWx0IDMKICAqLwog IGF0dHJpYnV0ZUxpbWl0OiAzLAoKICAvKioKICAgIFN0b3JlcyBhbGwgbWV0 aG9kcyB0aGF0IGNsZWFyIG9ic2VydmVycy4KICAgIFRoZXNlIG1ldGhvZHMg d2lsbCBiZSBjYWxsZWQgb24gZGVzdHJ1Y3Rpb24uCgogICAgQHByaXZhdGUK ICAgIEBwcm9wZXJ0eSByZWxlYXNlTWV0aG9kcwogICovCiAgcmVsZWFzZU1l dGhvZHM6IEVtYmVyLkEoKSwKCiAgLyoqCiAgICBTcGVjaWZpZXMgaG93IHJl Y29yZHMgY2FuIGJlIGZpbHRlcmVkLgogICAgUmVjb3JkcyByZXR1cm5lZCB3 aWxsIG5lZWQgdG8gaGF2ZSBhIGBmaWx0ZXJWYWx1ZXNgCiAgICBwcm9wZXJ0 eSB3aXRoIGEga2V5IGZvciBldmVyeSBuYW1lIGluIHRoZSByZXR1cm5lZCBh cnJheS4KCiAgICBAcHVibGljCiAgICBAbWV0aG9kIGdldEZpbHRlcnMKICAg IEByZXR1cm4ge0FycmF5fSBMaXN0IG9mIG9iamVjdHMgZGVmaW5pbmcgZmls dGVycy4KICAgICBUaGUgb2JqZWN0IHNob3VsZCBoYXZlIGEgYG5hbWVgIGFu ZCBgZGVzY2AgcHJvcGVydHkuCiAgKi8KICBnZXRGaWx0ZXJzOiBmdW5jdGlv bigpIHsKICAgIHJldHVybiBFbWJlci5BKCk7CiAgfSwKCiAgLyoqCiAgICBG ZXRjaCB0aGUgbW9kZWwgdHlwZXMgYW5kIG9ic2VydmUgdGhlbSBmb3IgY2hh bmdlcy4KCiAgICBAcHVibGljCiAgICBAbWV0aG9kIHdhdGNoTW9kZWxUeXBl cwoKICAgIEBwYXJhbSB7RnVuY3Rpb259IHR5cGVzQWRkZWQgQ2FsbGJhY2sg dG8gY2FsbCB0byBhZGQgdHlwZXMuCiAgICBUYWtlcyBhbiBhcnJheSBvZiBv YmplY3RzIGNvbnRhaW5pbmcgd3JhcHBlZCB0eXBlcyAocmV0dXJuZWQgZnJv bSBgd3JhcE1vZGVsVHlwZWApLgoKICAgIEBwYXJhbSB7RnVuY3Rpb259IHR5 cGVzVXBkYXRlZCBDYWxsYmFjayB0byBjYWxsIHdoZW4gYSB0eXBlIGhhcyBj aGFuZ2VkLgogICAgVGFrZXMgYW4gYXJyYXkgb2Ygb2JqZWN0cyBjb250YWlu aW5nIHdyYXBwZWQgdHlwZXMuCgogICAgQHJldHVybiB7RnVuY3Rpb259IE1l dGhvZCB0byBjYWxsIHRvIHJlbW92ZSBhbGwgb2JzZXJ2ZXJzCiAgKi8KICB3 YXRjaE1vZGVsVHlwZXM6IGZ1bmN0aW9uKHR5cGVzQWRkZWQsIHR5cGVzVXBk YXRlZCkgewogICAgdmFyIG1vZGVsVHlwZXMgPSB0aGlzLmdldE1vZGVsVHlw ZXMoKSwKICAgICAgICBzZWxmID0gdGhpcywgdHlwZXNUb1NlbmQsIHJlbGVh c2VNZXRob2RzID0gRW1iZXIuQSgpOwoKICAgIHR5cGVzVG9TZW5kID0gbW9k ZWxUeXBlcy5tYXAoZnVuY3Rpb24odHlwZSkgewogICAgICB2YXIgd3JhcHBl ZCA9IHNlbGYud3JhcE1vZGVsVHlwZSh0eXBlKTsKICAgICAgcmVsZWFzZU1l dGhvZHMucHVzaChzZWxmLm9ic2VydmVNb2RlbFR5cGUodHlwZSwgdHlwZXNV cGRhdGVkKSk7CiAgICAgIHJldHVybiB3cmFwcGVkOwogICAgfSk7CgogICAg dHlwZXNBZGRlZCh0eXBlc1RvU2VuZCk7CgogICAgdmFyIHJlbGVhc2UgPSBm dW5jdGlvbigpIHsKICAgICAgcmVsZWFzZU1ldGhvZHMuZm9yRWFjaChmdW5j dGlvbihmbikgeyBmbigpOyB9KTsKICAgICAgc2VsZi5yZWxlYXNlTWV0aG9k cy5yZW1vdmVPYmplY3QocmVsZWFzZSk7CiAgICB9OwogICAgdGhpcy5yZWxl YXNlTWV0aG9kcy5wdXNoT2JqZWN0KHJlbGVhc2UpOwogICAgcmV0dXJuIHJl bGVhc2U7CiAgfSwKCiAgLyoqCiAgICBGZXRjaCB0aGUgcmVjb3JkcyBvZiBh IGdpdmVuIHR5cGUgYW5kIG9ic2VydmUgdGhlbSBmb3IgY2hhbmdlcy4KCiAg ICBAcHVibGljCiAgICBAbWV0aG9kIHdhdGNoUmVjb3JkcwoKICAgIEBwYXJh bSB7RnVuY3Rpb259IHJlY29yZHNBZGRlZCBDYWxsYmFjayB0byBjYWxsIHRv IGFkZCByZWNvcmRzLgogICAgVGFrZXMgYW4gYXJyYXkgb2Ygb2JqZWN0cyBj b250YWluaW5nIHdyYXBwZWQgcmVjb3Jkcy4KICAgIFRoZSBvYmplY3Qgc2hv dWxkIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogICAgICBjb2x1 bW5WYWx1ZXM6IHtPYmplY3R9IGtleSBhbmQgdmFsdWUgb2YgYSB0YWJsZSBj ZWxsCiAgICAgIG9iamVjdDoge09iamVjdH0gdGhlIGFjdHVhbCByZWNvcmQg b2JqZWN0CgogICAgQHBhcmFtIHtGdW5jdGlvbn0gcmVjb3Jkc1VwZGF0ZWQg Q2FsbGJhY2sgdG8gY2FsbCB3aGVuIGEgcmVjb3JkIGhhcyBjaGFuZ2VkLgog ICAgVGFrZXMgYW4gYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIHdyYXBw ZWQgcmVjb3Jkcy4KCiAgICBAcGFyYW0ge0Z1bmN0aW9ufSByZWNvcmRzUmVt b3ZlZCBDYWxsYmFjayB0byBjYWxsIHdoZW4gYSByZWNvcmQgaGFzIHJlbW92 ZWQuCiAgICBUYWtlcyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CiAgICAg IGluZGV4OiB0aGUgYXJyYXkgaW5kZXggd2hlcmUgdGhlIHJlY29yZHMgd2Vy ZSByZW1vdmVkCiAgICAgIGNvdW50OiB0aGUgbnVtYmVyIG9mIHJlY29yZHMg cmVtb3ZlZAoKICAgIEByZXR1cm4ge0Z1bmN0aW9ufSBNZXRob2QgdG8gY2Fs bCB0byByZW1vdmUgYWxsIG9ic2VydmVycwogICovCiAgd2F0Y2hSZWNvcmRz OiBmdW5jdGlvbih0eXBlLCByZWNvcmRzQWRkZWQsIHJlY29yZHNVcGRhdGVk LCByZWNvcmRzUmVtb3ZlZCkgewogICAgdmFyIHNlbGYgPSB0aGlzLCByZWxl YXNlTWV0aG9kcyA9IEVtYmVyLkEoKSwgcmVjb3JkcyA9IHRoaXMuZ2V0UmVj b3Jkcyh0eXBlKSwgcmVsZWFzZTsKCiAgICB2YXIgcmVjb3JkVXBkYXRlZCA9 IGZ1bmN0aW9uKHVwZGF0ZWRSZWNvcmQpIHsKICAgICAgcmVjb3Jkc1VwZGF0 ZWQoW3VwZGF0ZWRSZWNvcmRdKTsKICAgIH07CgogICAgdmFyIHJlY29yZHNU b1NlbmQgPSByZWNvcmRzLm1hcChmdW5jdGlvbihyZWNvcmQpIHsKICAgICAg cmVsZWFzZU1ldGhvZHMucHVzaChzZWxmLm9ic2VydmVSZWNvcmQocmVjb3Jk LCByZWNvcmRVcGRhdGVkKSk7CiAgICAgIHJldHVybiBzZWxmLndyYXBSZWNv cmQocmVjb3JkKTsKICAgIH0pOwoKCiAgICB2YXIgY29udGVudERpZENoYW5n ZSA9IGZ1bmN0aW9uKGFycmF5LCBpZHgsIHJlbW92ZWRDb3VudCwgYWRkZWRD b3VudCkgewogICAgICBmb3IgKHZhciBpID0gaWR4OyBpIDwgaWR4ICsgYWRk ZWRDb3VudDsgaSsrKSB7CiAgICAgICAgdmFyIHJlY29yZCA9IGFycmF5Lm9i amVjdEF0KGkpOwogICAgICAgIHZhciB3cmFwcGVkID0gc2VsZi53cmFwUmVj b3JkKHJlY29yZCk7CiAgICAgICAgcmVsZWFzZU1ldGhvZHMucHVzaChzZWxm Lm9ic2VydmVSZWNvcmQocmVjb3JkLCByZWNvcmRVcGRhdGVkKSk7CiAgICAg ICAgcmVjb3Jkc0FkZGVkKFt3cmFwcGVkXSk7CiAgICAgIH0KCiAgICAgIGlm IChyZW1vdmVkQ291bnQpIHsKICAgICAgICByZWNvcmRzUmVtb3ZlZChpZHgs IHJlbW92ZWRDb3VudCk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIG9ic2Vy dmVyID0geyBkaWRDaGFuZ2U6IGNvbnRlbnREaWRDaGFuZ2UsIHdpbGxDaGFu Z2U6IEVtYmVyLksgfTsKICAgIHJlY29yZHMuYWRkQXJyYXlPYnNlcnZlcihz ZWxmLCBvYnNlcnZlcik7CgogICAgcmVsZWFzZSA9IGZ1bmN0aW9uKCkgewog ICAgICByZWxlYXNlTWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uKGZuKSB7IGZu KCk7IH0pOwogICAgICByZWNvcmRzLnJlbW92ZUFycmF5T2JzZXJ2ZXIoc2Vs Ziwgb2JzZXJ2ZXIpOwogICAgICBzZWxmLnJlbGVhc2VNZXRob2RzLnJlbW92 ZU9iamVjdChyZWxlYXNlKTsKICAgIH07CgogICAgcmVjb3Jkc0FkZGVkKHJl Y29yZHNUb1NlbmQpOwoKICAgIHRoaXMucmVsZWFzZU1ldGhvZHMucHVzaE9i amVjdChyZWxlYXNlKTsKICAgIHJldHVybiByZWxlYXNlOwogIH0sCgogIC8q KgogICAgQ2xlYXIgYWxsIG9ic2VydmVycyBiZWZvcmUgZGVzdHJ1Y3Rpb24K ICAgIEBwcml2YXRlCiAgKi8KICB3aWxsRGVzdHJveTogZnVuY3Rpb24oKSB7 CiAgICB0aGlzLl9zdXBlcigpOwogICAgdGhpcy5yZWxlYXNlTWV0aG9kcy5m b3JFYWNoKGZ1bmN0aW9uKGZuKSB7CiAgICAgIGZuKCk7CiAgICB9KTsKICB9 LAoKICAvKioKICAgIERldGVjdCB3aGV0aGVyIGEgY2xhc3MgaXMgYSBtb2Rl bC4KCiAgICBUZXN0IHRoYXQgYWdhaW5zdCB0aGUgbW9kZWwgY2xhc3MKICAg IG9mIHlvdXIgcGVyc2lzdGVuY2UgbGlicmFyeQoKICAgIEBwcml2YXRlCiAg ICBAbWV0aG9kIGRldGVjdAogICAgQHBhcmFtIHtDbGFzc30ga2xhc3MgVGhl IGNsYXNzIHRvIHRlc3QKICAgIEByZXR1cm4gYm9vbGVhbiBXaGV0aGVyIHRo ZSBjbGFzcyBpcyBhIG1vZGVsIGNsYXNzIG9yIG5vdAogICovCiAgZGV0ZWN0 OiBmdW5jdGlvbihrbGFzcykgewogICAgcmV0dXJuIGZhbHNlOwogIH0sCgog IC8qKgogICAgR2V0IHRoZSBjb2x1bW5zIGZvciBhIGdpdmVuIG1vZGVsIHR5 cGUuCgogICAgQHByaXZhdGUKICAgIEBtZXRob2QgY29sdW1uc0ZvclR5cGUK ICAgIEBwYXJhbSB7Q2xhc3N9IHR5cGUgVGhlIG1vZGVsIHR5cGUKICAgIEBy ZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBjb2x1bW5zIG9mIHRoZSBmb2xs b3dpbmcgZm9ybWF0OgogICAgIG5hbWU6IHtTdHJpbmd9IG5hbWUgb2YgdGhl IGNvbHVtbgogICAgIGRlc2M6IHtTdHJpbmd9IEh1bWFuaXplZCBkZXNjcmlw dGlvbiAod2hhdCB3b3VsZCBzaG93IGluIGEgdGFibGUgY29sdW1uIG5hbWUp CiAgKi8KICBjb2x1bW5zRm9yVHlwZTogZnVuY3Rpb24odHlwZSkgewogICAg cmV0dXJuIEVtYmVyLkEoKTsKICB9LAoKICAvKioKICAgIEFkZHMgb2JzZXJ2 ZXJzIHRvIGEgbW9kZWwgdHlwZSBjbGFzcy4KCiAgICBAcHJpdmF0ZQogICAg QG1ldGhvZCBvYnNlcnZlTW9kZWxUeXBlCiAgICBAcGFyYW0ge0NsYXNzfSB0 eXBlIFRoZSBtb2RlbCB0eXBlIGNsYXNzCiAgICBAcGFyYW0ge0Z1bmN0aW9u fSB0eXBlc1VwZGF0ZWQgQ2FsbGVkIHdoZW4gYSB0eXBlIGlzIG1vZGlmaWVk LgogICAgQHJldHVybiB7RnVuY3Rpb259IFRoZSBmdW5jdGlvbiB0byBjYWxs IHRvIHJlbW92ZSBvYnNlcnZlcnMKICAqLwoKICBvYnNlcnZlTW9kZWxUeXBl OiBmdW5jdGlvbih0eXBlLCB0eXBlc1VwZGF0ZWQpIHsKICAgIHZhciBzZWxm ID0gdGhpcywgcmVjb3JkcyA9IHRoaXMuZ2V0UmVjb3Jkcyh0eXBlKTsKCiAg ICB2YXIgb25DaGFuZ2UgPSBmdW5jdGlvbigpIHsKICAgICAgdHlwZXNVcGRh dGVkKFtzZWxmLndyYXBNb2RlbFR5cGUodHlwZSldKTsKICAgIH07CiAgICB2 YXIgb2JzZXJ2ZXIgPSB7CiAgICAgIGRpZENoYW5nZTogZnVuY3Rpb24oKSB7 CiAgICAgICAgRW1iZXIucnVuLnNjaGVkdWxlT25jZSgnYWN0aW9ucycsIHRo aXMsIG9uQ2hhbmdlKTsKICAgICAgfSwKICAgICAgd2lsbENoYW5nZTogRW1i ZXIuSwogICAgfTsKCiAgICByZWNvcmRzLmFkZEFycmF5T2JzZXJ2ZXIodGhp cywgb2JzZXJ2ZXIpOwoKICAgIHZhciByZWxlYXNlID0gZnVuY3Rpb24oKSB7 CiAgICAgIHJlY29yZHMucmVtb3ZlQXJyYXlPYnNlcnZlcihzZWxmLCBvYnNl cnZlcik7CiAgICB9OwoKICAgIHJldHVybiByZWxlYXNlOwogIH0sCgoKICAv KioKICAgIFdyYXBzIGEgZ2l2ZW4gbW9kZWwgdHlwZSBhbmQgb2JzZXJ2ZXMg Y2hhbmdlcyB0byBpdC4KCiAgICBAcHJpdmF0ZQogICAgQG1ldGhvZCB3cmFw TW9kZWxUeXBlCiAgICBAcGFyYW0ge0NsYXNzfSB0eXBlIEEgbW9kZWwgY2xh c3MKICAgIEBwYXJhbSB7RnVuY3Rpb259IHR5cGVzVXBkYXRlZCBjYWxsYmFj ayB0byBjYWxsIHdoZW4gdGhlIHR5cGUgY2hhbmdlcwogICAgQHJldHVybiB7 T2JqZWN0fSBjb250YWlucyB0aGUgd3JhcHBlZCB0eXBlIGFuZCB0aGUgZnVu Y3Rpb24gdG8gcmVtb3ZlIG9ic2VydmVycwogICAgRm9ybWF0OgogICAgICB0 eXBlOiB7T2JqZWN0fSB0aGUgd3JhcHBlZCB0eXBlCiAgICAgICAgVGhlIHdy YXBwZWQgdHlwZSBoYXMgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CiAgICAgICAg ICBuYW1lOiB7U3RyaW5nfSBuYW1lIG9mIHRoZSB0eXBlCiAgICAgICAgICBj b3VudDoge0ludGVnZXJ9IG51bWJlciBvZiByZWNvcmRzIGF2YWlsYWJsZQog ICAgICAgICAgY29sdW1uczoge0NvbHVtbnN9IGFycmF5IG9mIGNvbHVtbnMg dG8gZGVzY3JpYmUgdGhlIHJlY29yZAogICAgICAgICAgb2JqZWN0OiB7Q2xh c3N9IHRoZSBhY3R1YWwgTW9kZWwgdHlwZSBjbGFzcwogICAgICByZWxlYXNl OiB7RnVuY3Rpb259IFRoZSBmdW5jdGlvbiB0byByZW1vdmUgb2JzZXJ2ZXJz CiAgKi8KICB3cmFwTW9kZWxUeXBlOiBmdW5jdGlvbih0eXBlLCB0eXBlc1Vw ZGF0ZWQpIHsKICAgIHZhciByZWxlYXNlLCByZWNvcmRzID0gdGhpcy5nZXRS ZWNvcmRzKHR5cGUpLAogICAgICAgIHR5cGVUb1NlbmQsIHNlbGYgPSB0aGlz OwoKICAgIHR5cGVUb1NlbmQgPSB7CiAgICAgIG5hbWU6IHR5cGUudG9TdHJp bmcoKSwKICAgICAgY291bnQ6IEVtYmVyLmdldChyZWNvcmRzLCAnbGVuZ3Ro JyksCiAgICAgIGNvbHVtbnM6IHRoaXMuY29sdW1uc0ZvclR5cGUodHlwZSks CiAgICAgIG9iamVjdDogdHlwZQogICAgfTsKCgogICAgcmV0dXJuIHR5cGVU b1NlbmQ7CiAgfSwKCgogIC8qKgogICAgRmV0Y2hlcyBhbGwgbW9kZWxzIGRl ZmluZWQgaW4gdGhlIGFwcGxpY2F0aW9uLgoKICAgIEBwcml2YXRlCiAgICBA bWV0aG9kIGdldE1vZGVsVHlwZXMKICAgIEByZXR1cm4ge0FycmF5fSBBcnJh eSBvZiBtb2RlbCB0eXBlcwogICovCgogLy8gVE9ETzogVXNlIHRoZSByZXNv bHZlciBpbnN0ZWFkIG9mIGxvb3Bpbmcgb3ZlciBuYW1lc3BhY2VzLgogIGdl dE1vZGVsVHlwZXM6IGZ1bmN0aW9uKCkgewogICAgdmFyIG5hbWVzcGFjZXMg PSBFbWJlci5BKEVtYmVyLk5hbWVzcGFjZS5OQU1FU1BBQ0VTKSwgdHlwZXMg PSBFbWJlci5BKCksIHNlbGYgPSB0aGlzOwoKICAgIG5hbWVzcGFjZXMuZm9y RWFjaChmdW5jdGlvbihuYW1lc3BhY2UpIHsKICAgICAgZm9yICh2YXIga2V5 IGluIG5hbWVzcGFjZSkgewogICAgICAgIGlmICghbmFtZXNwYWNlLmhhc093 blByb3BlcnR5KGtleSkpIHsgY29udGludWU7IH0KICAgICAgICB2YXIga2xh c3MgPSBuYW1lc3BhY2Vba2V5XTsKICAgICAgICBpZiAoc2VsZi5kZXRlY3Qo a2xhc3MpKSB7CiAgICAgICAgICB0eXBlcy5wdXNoKGtsYXNzKTsKICAgICAg ICB9CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIHR5cGVzOwogIH0sCgog IC8qKgogICAgRmV0Y2hlcyBhbGwgbG9hZGVkIHJlY29yZHMgZm9yIGEgZ2l2 ZW4gdHlwZS4KCiAgICBAcHJpdmF0ZQogICAgQG1ldGhvZCBnZXRSZWNvcmRz CiAgICBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2YgcmVjb3Jkcy4KICAg ICBUaGlzIGFycmF5IHdpbGwgYmUgb2JzZXJ2ZWQgZm9yIGNoYW5nZXMsCiAg ICAgc28gaXQgc2hvdWxkIHVwZGF0ZSB3aGVuIG5ldyByZWNvcmRzIGFyZSBh ZGRlZC9yZW1vdmVkLgogICovCiAgZ2V0UmVjb3JkczogZnVuY3Rpb24odHlw ZSkgewogICAgcmV0dXJuIEVtYmVyLkEoKTsKICB9LAoKICAvKioKICAgIFdy YXBzIGEgcmVjb3JkIGFuZCBvYnNlcnZlcnMgY2hhbmdlcyB0byBpdC4KCiAg ICBAcHJpdmF0ZQogICAgQG1ldGhvZCB3cmFwUmVjb3JkCiAgICBAcGFyYW0g e09iamVjdH0gcmVjb3JkIFRoZSByZWNvcmQgaW5zdGFuY2UuCiAgICBAcmV0 dXJuIHtPYmplY3R9IFRoZSB3cmFwcGVkIHJlY29yZC4gRm9ybWF0OgogICAg Y29sdW1uVmFsdWVzOiB7QXJyYXl9CiAgICBzZWFyY2hLZXl3b3Jkczoge0Fy cmF5fQogICovCiAgd3JhcFJlY29yZDogZnVuY3Rpb24ocmVjb3JkKSB7CiAg ICB2YXIgcmVjb3JkVG9TZW5kID0geyBvYmplY3Q6IHJlY29yZCB9LCBjb2x1 bW5WYWx1ZXMgPSB7fSwgc2VsZiA9IHRoaXM7CgogICAgcmVjb3JkVG9TZW5k LmNvbHVtblZhbHVlcyA9IHRoaXMuZ2V0UmVjb3JkQ29sdW1uVmFsdWVzKHJl Y29yZCk7CiAgICByZWNvcmRUb1NlbmQuc2VhcmNoS2V5d29yZHMgPSB0aGlz LmdldFJlY29yZEtleXdvcmRzKHJlY29yZCk7CiAgICByZWNvcmRUb1NlbmQu ZmlsdGVyVmFsdWVzID0gdGhpcy5nZXRSZWNvcmRGaWx0ZXJWYWx1ZXMocmVj b3JkKTsKICAgIHJlY29yZFRvU2VuZC5jb2xvciA9IHRoaXMuZ2V0UmVjb3Jk Q29sb3IocmVjb3JkKTsKCiAgICByZXR1cm4gcmVjb3JkVG9TZW5kOwogIH0s CgogIC8qKgogICAgR2V0cyB0aGUgdmFsdWVzIGZvciBlYWNoIGNvbHVtbi4K CiAgICBAcHJpdmF0ZQogICAgQG1ldGhvZCBnZXRSZWNvcmRDb2x1bW5WYWx1 ZXMKICAgIEByZXR1cm4ge09iamVjdH0gS2V5cyBzaG91bGQgbWF0Y2ggY29s dW1uIG5hbWVzIGRlZmluZWQKICAgIGJ5IHRoZSBtb2RlbCB0eXBlLgogICov CiAgZ2V0UmVjb3JkQ29sdW1uVmFsdWVzOiBmdW5jdGlvbihyZWNvcmQpIHsK ICAgIHJldHVybiB7fTsKICB9LAoKICAvKioKICAgIFJldHVybnMga2V5d29y ZHMgdG8gbWF0Y2ggd2hlbiBzZWFyY2hpbmcgcmVjb3Jkcy4KCiAgICBAcHJp dmF0ZQogICAgQG1ldGhvZCBnZXRSZWNvcmRLZXl3b3JkcwogICAgQHJldHVy biB7QXJyYXl9IFJlbGV2YW50IGtleXdvcmRzIGZvciBzZWFyY2guCiAgKi8K ICBnZXRSZWNvcmRLZXl3b3JkczogZnVuY3Rpb24ocmVjb3JkKSB7CiAgICBy ZXR1cm4gRW1iZXIuQSgpOwogIH0sCgogIC8qKgogICAgUmV0dXJucyB0aGUg dmFsdWVzIG9mIGZpbHRlcnMgZGVmaW5lZCBieSBgZ2V0RmlsdGVyc2AuCgog ICAgQHByaXZhdGUKICAgIEBtZXRob2QgZ2V0UmVjb3JkRmlsdGVyVmFsdWVz CiAgICBAcGFyYW0ge09iamVjdH0gcmVjb3JkIFRoZSByZWNvcmQgaW5zdGFu Y2UKICAgIEByZXR1cm4ge09iamVjdH0gVGhlIGZpbHRlciB2YWx1ZXMKICAq LwogIGdldFJlY29yZEZpbHRlclZhbHVlczogZnVuY3Rpb24ocmVjb3JkKSB7 CiAgICByZXR1cm4ge307CiAgfSwKCiAgLyoqCiAgICBFYWNoIHJlY29yZCBj YW4gaGF2ZSBhIGNvbG9yIHRoYXQgcmVwcmVzZW50cyBpdHMgc3RhdGUuCgog ICAgQHByaXZhdGUKICAgIEBtZXRob2QgZ2V0UmVjb3JkQ29sb3IKICAgIEBw YXJhbSB7T2JqZWN0fSByZWNvcmQgVGhlIHJlY29yZCBpbnN0YW5jZQogICAg QHJldHVybiB7U3RyaW5nfSBUaGUgcmVjb3JkJ3MgY29sb3IKICAgICAgUG9z c2libGUgb3B0aW9uczogYmxhY2ssIHJlZCwgYmx1ZSwgZ3JlZW4KICAqLwog IGdldFJlY29yZENvbG9yOiBmdW5jdGlvbihyZWNvcmQpIHsKICAgIHJldHVy biBudWxsOwogIH0sCgogIC8qKgogICAgT2JzZXJ2ZXMgYWxsIHJlbGV2YW50 IHByb3BlcnRpZXMgYW5kIHJlLXNlbmRzIHRoZSB3cmFwcGVkIHJlY29yZAog ICAgd2hlbiBhIGNoYW5nZSBvY2N1cnMuCgogICAgQHByaXZhdGUKICAgIEBt ZXRob2Qgb2JzZXJ2ZXJSZWNvcmQKICAgIEBwYXJhbSB7T2JqZWN0fSByZWNv cmQgVGhlIHJlY29yZCBpbnN0YW5jZQogICAgQHBhcmFtIHtGdW5jdGlvbn0g cmVjb3JkVXBkYXRlZCBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIGEgcmVj b3JkIGlzIHVwZGF0ZWQuCiAgICBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGZ1 bmN0aW9uIHRvIGNhbGwgdG8gcmVtb3ZlIGFsbCBvYnNlcnZlcnMuCiAgKi8K ICBvYnNlcnZlUmVjb3JkOiBmdW5jdGlvbihyZWNvcmQsIHJlY29yZFVwZGF0 ZWQpIHsKICAgIHJldHVybiBmdW5jdGlvbigpe307CiAgfQoKfSk7CgoKfSko KTsKCgoKKGZ1bmN0aW9uKCkgewovKioKRW1iZXIgRXh0ZW5zaW9uIFN1cHBv cnQKCkBtb2R1bGUgZW1iZXIKQHN1Ym1vZHVsZSBlbWJlci1leHRlbnNpb24t c3VwcG9ydApAcmVxdWlyZXMgZW1iZXItYXBwbGljYXRpb24KKi8KCn0pKCk7 CgooZnVuY3Rpb24oKSB7Ci8qKgogIFNldHMgRW1iZXIgdXAgZm9yIHRlc3Rp bmcuIFRoaXMgaXMgdXNlZnVsIHRvIHBlcmZvcm0KICBiYXNpYyBzZXR1cCBz dGVwcyBpbiBvcmRlciB0byB1bml0IHRlc3QuCiAgCiAgVXNlIGBBcHAuc2V0 dXBGb3JUZXN0aW5nYCB0byBwZXJmb3JtIGludGVncmF0aW9uIHRlc3RzIChm dWxsCiAgYXBwbGljYXRpb24gdGVzdGluZykuCgogIEBtZXRob2Qgc2V0dXBG b3JUZXN0aW5nCiAgQG5hbWVzcGFjZSBFbWJlcgoqLwpFbWJlci5zZXR1cEZv clRlc3RpbmcgPSBmdW5jdGlvbigpIHsKICBFbWJlci50ZXN0aW5nID0gdHJ1 ZTsKCiAgLy8gaWYgYWRhcHRlciBpcyBub3QgbWFudWFsbHkgc2V0IGRlZmF1 bHQgdG8gUVVuaXQKICBpZiAoIUVtYmVyLlRlc3QuYWRhcHRlcikgewogICAg RW1iZXIuVGVzdC5hZGFwdGVyID0gRW1iZXIuVGVzdC5RVW5pdEFkYXB0ZXIu Y3JlYXRlKCk7CiAgfQp9OwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewovKioK ICBAbW9kdWxlIGVtYmVyCiAgQHN1Ym1vZHVsZSBlbWJlci10ZXN0aW5nCiAq Lwp2YXIgc2xpY2UgPSBbXS5zbGljZSwKICAgIGhlbHBlcnMgPSB7fSwKICAg IGluamVjdEhlbHBlcnNDYWxsYmFja3MgPSBbXTsKCi8qKgogIFRoaXMgaXMg YSBjb250YWluZXIgZm9yIGFuIGFzc29ydG1lbnQgb2YgdGVzdGluZyByZWxh dGVkIGZ1bmN0aW9uYWxpdHk6CgogICogQ2hvb3NlIHlvdXIgZGVmYXVsdCB0 ZXN0IGFkYXB0ZXIgKGZvciB5b3VyIGZyYW1ld29yayBvZiBjaG9pY2UpLgog ICogUmVnaXN0ZXIvVW5yZWdpc3RlciBhZGRpdGlvbmFsIHRlc3QgaGVscGVy cy4KICAqIFNldHVwIGNhbGxiYWNrcyB0byBiZSBmaXJlZCB3aGVuIHRoZSB0 ZXN0IGhlbHBlcnMgYXJlIGluamVjdGVkIGludG8KICAgIHlvdXIgYXBwbGlj YXRpb24uCgogIEBjbGFzcyBUZXN0CiAgQG5hbWVzcGFjZSBFbWJlcgoqLwpF bWJlci5UZXN0ID0gewoKICAvKioKICAgIGByZWdpc3RlckhlbHBlcmAgaXMg dXNlZCB0byByZWdpc3RlciBhIHRlc3QgaGVscGVyIHRoYXQgd2lsbCBiZSBp bmplY3RlZAogICAgd2hlbiBgQXBwLmluamVjdFRlc3RIZWxwZXJzYCBpcyBj YWxsZWQuCgogICAgVGhlIGhlbHBlciBtZXRob2Qgd2lsbCBhbHdheXMgYmUg Y2FsbGVkIHdpdGggdGhlIGN1cnJlbnQgQXBwbGljYXRpb24gYXMKICAgIHRo ZSBmaXJzdCBwYXJhbWV0ZXIuCgogICAgRm9yIGV4YW1wbGU6CgogICAgYGBg amF2YXNjcmlwdAogICAgRW1iZXIuVGVzdC5yZWdpc3RlckhlbHBlcignYm9v dCcsIGZ1bmN0aW9uKGFwcCkgewogICAgICBFbWJlci5ydW4oYXBwLCBhcHAu YWR2YW5jZVJlYWRpbmVzcyk7CiAgICB9KTsKICAgIGBgYAoKICAgIFRoaXMg aGVscGVyIGNhbiBsYXRlciBiZSBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMg YmVjYXVzZSBpdCB3aWxsIGJlCiAgICBjYWxsZWQgd2l0aCBgYXBwYCBhcyB0 aGUgZmlyc3QgcGFyYW1ldGVyLgoKICAgIGBgYGphdmFzY3JpcHQKICAgIEFw cCA9IEVtYmVyLkFwcGxpY2F0aW9uLmNyZWF0ZSgpOwogICAgQXBwLmluamVj dFRlc3RIZWxwZXJzKCk7CiAgICBib290KCk7CiAgICBgYGAKCiAgICBAcHVi bGljCiAgICBAbWV0aG9kIHJlZ2lzdGVySGVscGVyCiAgICBAcGFyYW0ge1N0 cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgaGVscGVyIG1ldGhvZCB0byBh ZGQuCiAgICBAcGFyYW0ge0Z1bmN0aW9ufSBoZWxwZXJNZXRob2QKICAgIEBw YXJhbSBvcHRpb25zIHtPYmplY3R9CiAgKi8KICByZWdpc3RlckhlbHBlcjog ZnVuY3Rpb24obmFtZSwgaGVscGVyTWV0aG9kKSB7CiAgICBoZWxwZXJzW25h bWVdID0gewogICAgICBtZXRob2Q6IGhlbHBlck1ldGhvZCwKICAgICAgbWV0 YTogeyB3YWl0OiBmYWxzZSB9CiAgICB9OwogIH0sCgogIC8qKgogICAgYHJl Z2lzdGVyQXN5bmNIZWxwZXJgIGlzIHVzZWQgdG8gcmVnaXN0ZXIgYW4gYXN5 bmMgdGVzdCBoZWxwZXIgdGhhdCB3aWxsIGJlIGluamVjdGVkCiAgICB3aGVu IGBBcHAuaW5qZWN0VGVzdEhlbHBlcnNgIGlzIGNhbGxlZC4KCiAgICBUaGUg aGVscGVyIG1ldGhvZCB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgd2l0aCB0aGUg Y3VycmVudCBBcHBsaWNhdGlvbiBhcwogICAgdGhlIGZpcnN0IHBhcmFtZXRl ci4KCiAgICBGb3IgZXhhbXBsZToKCiAgICBgYGBqYXZhc2NyaXB0CiAgICBF bWJlci5UZXN0LnJlZ2lzdGVyQXN5bmNIZWxwZXIoJ2Jvb3QnLCBmdW5jdGlv bihhcHApIHsKICAgICAgRW1iZXIucnVuKGFwcCwgYXBwLmFkdmFuY2VSZWFk aW5lc3MpOwogICAgfSk7CiAgICBgYGAKCiAgICBUaGUgYWR2YW50YWdlIG9m IGFuIGFzeW5jIGhlbHBlciBpcyB0aGF0IGl0IHdpbGwgbm90IHJ1bgogICAg dW50aWwgdGhlIGxhc3QgYXN5bmMgaGVscGVyIGhhcyBjb21wbGV0ZWQuICBB bGwgYXN5bmMgaGVscGVycwogICAgYWZ0ZXIgaXQgd2lsbCB3YWl0IGZvciBp dCBjb21wbGV0ZSBiZWZvcmUgcnVubmluZy4KCgogICAgRm9yIGV4YW1wbGU6 CgogICAgYGBgamF2YXNjcmlwdAogICAgRW1iZXIuVGVzdC5yZWdpc3RlckFz eW5jSGVscGVyKCdkZWxldGVQb3N0JywgZnVuY3Rpb24oYXBwLCBwb3N0SWQp IHsKICAgICAgY2xpY2soJy5kZWxldGUtJyArIHBvc3RJZCk7CiAgICB9KTsK CiAgICAvLyAuLi4gaW4geW91ciB0ZXN0CiAgICB2aXNpdCgnL3Bvc3QvMicp OwogICAgZGVsZXRlUG9zdCgyKTsKICAgIHZpc2l0KCcvcG9zdC8zJyk7CiAg ICBkZWxldGVQb3N0KDMpOwogICAgYGBgCgogICAgQHB1YmxpYwogICAgQG1l dGhvZCByZWdpc3RlckFzeW5jSGVscGVyCiAgICBAcGFyYW0ge1N0cmluZ30g bmFtZSBUaGUgbmFtZSBvZiB0aGUgaGVscGVyIG1ldGhvZCB0byBhZGQuCiAg ICBAcGFyYW0ge0Z1bmN0aW9ufSBoZWxwZXJNZXRob2QKICAqLwogIHJlZ2lz dGVyQXN5bmNIZWxwZXI6IGZ1bmN0aW9uKG5hbWUsIGhlbHBlck1ldGhvZCkg ewogICAgaGVscGVyc1tuYW1lXSA9IHsKICAgICAgbWV0aG9kOiBoZWxwZXJN ZXRob2QsCiAgICAgIG1ldGE6IHsgd2FpdDogdHJ1ZSB9CiAgICB9OwogIH0s CgogIC8qKgogICAgUmVtb3ZlIGEgcHJldmlvdXNseSBhZGRlZCBoZWxwZXIg bWV0aG9kLgoKICAgIEV4YW1wbGU6CgogICAgYGBgamF2YXNjcmlwdAogICAg RW1iZXIuVGVzdC51bnJlZ2lzdGVySGVscGVyKCd3YWl0Jyk7CiAgICBgYGAK CiAgICBAcHVibGljCiAgICBAbWV0aG9kIHVucmVnaXN0ZXJIZWxwZXIKICAg IEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBoZWxwZXIgdG8gcmVtb3ZlLgog ICovCiAgdW5yZWdpc3RlckhlbHBlcjogZnVuY3Rpb24obmFtZSkgewogICAg ZGVsZXRlIGhlbHBlcnNbbmFtZV07CiAgICBkZWxldGUgRW1iZXIuVGVzdC5Q cm9taXNlLnByb3RvdHlwZVtuYW1lXTsKICB9LAoKICAvKioKICAgIFVzZWQg dG8gcmVnaXN0ZXIgY2FsbGJhY2tzIHRvIGJlIGZpcmVkIHdoZW5ldmVyIGBB cHAuaW5qZWN0VGVzdEhlbHBlcnNgCiAgICBpcyBjYWxsZWQuCgogICAgVGhl IGNhbGxiYWNrIHdpbGwgcmVjZWl2ZSB0aGUgY3VycmVudCBhcHBsaWNhdGlv biBhcyBhbiBhcmd1bWVudC4KCiAgICBFeGFtcGxlOgoKICAgIGBgYGphdmFz Y3JpcHQKICAgIEVtYmVyLlRlc3Qub25JbmplY3RIZWxwZXJzKGZ1bmN0aW9u KCkgewogICAgICBFbWJlci4kKGRvY3VtZW50KS5hamF4U3RhcnQoZnVuY3Rp b24oKSB7CiAgICAgICAgVGVzdC5wZW5kaW5nQWpheFJlcXVlc3RzKys7CiAg ICAgIH0pOwoKICAgICAgRW1iZXIuJChkb2N1bWVudCkuYWpheFN0b3AoZnVu Y3Rpb24oKSB7CiAgICAgICAgVGVzdC5wZW5kaW5nQWpheFJlcXVlc3RzLS07 CiAgICAgIH0pOwogICAgfSk7CiAgICBgYGAKCiAgICBAcHVibGljCiAgICBA bWV0aG9kIG9uSW5qZWN0SGVscGVycwogICAgQHBhcmFtIHtGdW5jdGlvbn0g Y2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZC4KICAqLwogIG9u SW5qZWN0SGVscGVyczogZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIGluamVj dEhlbHBlcnNDYWxsYmFja3MucHVzaChjYWxsYmFjayk7CiAgfSwKCiAgLyoq CiAgICBUaGlzIHJldHVybnMgYSB0aGVuYWJsZSB0YWlsb3JlZCBmb3IgdGVz dGluZy4gIEl0IGNhdGNoZXMgZmFpbGVkCiAgICBgb25TdWNjZXNzYCBjYWxs YmFja3MgYW5kIGludm9rZXMgdGhlIGBFbWJlci5UZXN0LmFkYXB0ZXIuZXhj ZXB0aW9uYAogICAgY2FsbGJhY2sgaW4gdGhlIGxhc3QgY2hhaW5lZCB0aGVu LgoKICAgIFRoaXMgbWV0aG9kIHNob3VsZCBiZSByZXR1cm5lZCBieSBhc3lu YyBoZWxwZXJzIHN1Y2ggYXMgYHdhaXRgLgoKICAgIEBwdWJsaWMKICAgIEBt ZXRob2QgcHJvbWlzZQogICAgQHBhcmFtIHtGdW5jdGlvbn0gcmVzb2x2ZXIg VGhlIGZ1bmN0aW9uIHVzZWQgdG8gcmVzb2x2ZSB0aGUgcHJvbWlzZS4KICAq LwogIHByb21pc2U6IGZ1bmN0aW9uKHJlc29sdmVyKSB7CiAgICByZXR1cm4g bmV3IEVtYmVyLlRlc3QuUHJvbWlzZShyZXNvbHZlcik7CiAgfSwKCiAgLyoq CiAgIFVzZWQgdG8gYWxsb3cgZW1iZXItdGVzdGluZyB0byBjb21tdW5pY2F0 ZSB3aXRoIGEgc3BlY2lmaWMgdGVzdGluZwogICBmcmFtZXdvcmsuCgogICBZ b3UgY2FuIG1hbnVhbGx5IHNldCBpdCBiZWZvcmUgY2FsbGluZyBgQXBwLnNl dHVwRm9yVGVzdGluZygpYC4KCiAgIEV4YW1wbGU6CgogICBgYGBqYXZhc2Ny aXB0CiAgIEVtYmVyLlRlc3QuYWRhcHRlciA9IE15Q3VzdG9tQWRhcHRlci5j cmVhdGUoKQogICBgYGAKCiAgIElmIHlvdSBkbyBub3Qgc2V0IGl0LCBlbWJl ci10ZXN0aW5nIHdpbGwgZGVmYXVsdCB0byBgRW1iZXIuVGVzdC5RVW5pdEFk YXB0ZXJgLgoKICAgQHB1YmxpYwogICBAcHJvcGVydHkgYWRhcHRlcgogICBA dHlwZSB7Q2xhc3N9IFRoZSBhZGFwdGVyIHRvIGJlIHVzZWQuCiAgIEBkZWZh dWx0IEVtYmVyLlRlc3QuUVVuaXRBZGFwdGVyCiAgKi8KICBhZGFwdGVyOiBu dWxsLAoKICAvKioKICAgIFJlcGxhY2VtZW50IGZvciBgRW1iZXIuUlNWUC5y ZXNvbHZlYAogICAgVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGlzIHVzZXMK ICAgIGFuZCBpbnN0YW5jZSBvZiBgRW1iZXIuVGVzdC5Qcm9taXNlYAoKICAg IEBwdWJsaWMKICAgIEBtZXRob2QgcmVzb2x2ZQogICAgQHBhcmFtIHtNaXhl ZH0gVGhlIHZhbHVlIHRvIHJlc29sdmUKICAqLwogIHJlc29sdmU6IGZ1bmN0 aW9uKHZhbCkgewogICAgcmV0dXJuIEVtYmVyLlRlc3QucHJvbWlzZShmdW5j dGlvbihyZXNvbHZlKSB7CiAgICAgIHJldHVybiByZXNvbHZlKHZhbCk7CiAg ICB9KTsKICB9LAoKICAvKioKICAgICBUaGlzIGFsbG93cyBlbWJlci10ZXN0 aW5nIHRvIHBsYXkgbmljZWx5IHdpdGggb3RoZXIgYXN5bmNocm9ub3VzCiAg ICAgZXZlbnRzLCBzdWNoIGFzIGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMgd2Fp dGluZyBmb3IgYSBDU1MzCiAgICAgdHJhbnNpdGlvbiBvciBhbiBJbmRleERC IHRyYW5zYWN0aW9uLgoKICAgICBGb3IgZXhhbXBsZToKCiAgICAgYGBgamF2 YXNjcmlwdAogICAgIEVtYmVyLlRlc3QucmVnaXN0ZXJXYWl0ZXIoZnVuY3Rp b24oKSB7CiAgICAgICByZXR1cm4gbXlQZW5kaW5nVHJhbnNhY3Rpb25zKCkg PT0gMDsKICAgICB9KTsKICAgICBgYGAKICAgICBUaGUgYGNvbnRleHRgIGFy Z3VtZW50IGFsbG93cyB5b3UgdG8gb3B0aW9uYWxseSBzcGVjaWZ5IHRoZSBg dGhpc2AKICAgICB3aXRoIHdoaWNoIHlvdXIgY2FsbGJhY2sgd2lsbCBiZSBp bnZva2VkLgoKICAgICBGb3IgZXhhbXBsZToKCiAgICAgYGBgamF2YXNjcmlw dAogICAgIEVtYmVyLlRlc3QucmVnaXN0ZXJXYWl0ZXIoTXlEQiwgTXlEQi5o YXNQZW5kaW5nVHJhbnNhY3Rpb25zKTsKICAgICBgYGAKCiAgICAgQHB1Ymxp YwogICAgIEBtZXRob2QgcmVnaXN0ZXJXYWl0ZXIKICAgICBAcGFyYW0ge09i amVjdH0gY29udGV4dCAob3B0aW9uYWwpCiAgICAgQHBhcmFtIHtGdW5jdGlv bn0gY2FsbGJhY2sKICAqLwogIHJlZ2lzdGVyV2FpdGVyOiBmdW5jdGlvbihj b250ZXh0LCBjYWxsYmFjaykgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgg PT09IDEpIHsKICAgICAgY2FsbGJhY2sgPSBjb250ZXh0OwogICAgICBjb250 ZXh0ID0gbnVsbDsKICAgIH0KICAgIGlmICghdGhpcy53YWl0ZXJzKSB7CiAg ICAgIHRoaXMud2FpdGVycyA9IEVtYmVyLkEoKTsKICAgIH0KICAgIHRoaXMu d2FpdGVycy5wdXNoKFtjb250ZXh0LCBjYWxsYmFja10pOwogIH0sCiAgLyoq CiAgICAgYHVucmVnaXN0ZXJXYWl0ZXJgIGlzIHVzZWQgdG8gdW5yZWdpc3Rl ciBhIGNhbGxiYWNrIHRoYXQgd2FzCiAgICAgcmVnaXN0ZXJlZCB3aXRoIGBy ZWdpc3RlcldhaXRlcmAuCgogICAgIEBwdWJsaWMKICAgICBAbWV0aG9kIHVu cmVnaXN0ZXJXYWl0ZXIKICAgICBAcGFyYW0ge09iamVjdH0gY29udGV4dCAo b3B0aW9uYWwpCiAgICAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKICAq LwogIHVucmVnaXN0ZXJXYWl0ZXI6IGZ1bmN0aW9uKGNvbnRleHQsIGNhbGxi YWNrKSB7CiAgICB2YXIgcGFpcjsKICAgIGlmICghdGhpcy53YWl0ZXJzKSB7 IHJldHVybjsgfQogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHsK ICAgICAgY2FsbGJhY2sgPSBjb250ZXh0OwogICAgICBjb250ZXh0ID0gbnVs bDsKICAgIH0KICAgIHBhaXIgPSBbY29udGV4dCwgY2FsbGJhY2tdOwogICAg dGhpcy53YWl0ZXJzID0gRW1iZXIuQSh0aGlzLndhaXRlcnMuZmlsdGVyKGZ1 bmN0aW9uKGVsdCkgewogICAgICByZXR1cm4gRW1iZXIuY29tcGFyZShlbHQs IHBhaXIpIT09MDsKICAgIH0pKTsKICB9Cn07CgpmdW5jdGlvbiBoZWxwZXIo YXBwLCBuYW1lKSB7CiAgdmFyIGZuID0gaGVscGVyc1tuYW1lXS5tZXRob2Qs CiAgICAgIG1ldGEgPSBoZWxwZXJzW25hbWVdLm1ldGE7CgogIHJldHVybiBm dW5jdGlvbigpIHsKICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVu dHMpLAogICAgICAgIGxhc3RQcm9taXNlID0gRW1iZXIuVGVzdC5sYXN0UHJv bWlzZTsKCiAgICBhcmdzLnVuc2hpZnQoYXBwKTsKCiAgICAvLyBzb21lIGhl bHBlcnMgYXJlIG5vdCBhc3luYyBhbmQKICAgIC8vIG5lZWQgdG8gcmV0dXJu IGEgdmFsdWUgaW1tZWRpYXRlbHkuCiAgICAvLyBleGFtcGxlOiBgZmluZGAK ICAgIGlmICghbWV0YS53YWl0KSB7CiAgICAgIHJldHVybiBmbi5hcHBseShh cHAsIGFyZ3MpOwogICAgfQoKICAgIGlmICghbGFzdFByb21pc2UpIHsKICAg ICAgLy8gSXQncyB0aGUgZmlyc3QgYXN5bmMgaGVscGVyIGluIGN1cnJlbnQg Y29udGV4dAogICAgICBsYXN0UHJvbWlzZSA9IGZuLmFwcGx5KGFwcCwgYXJn cyk7CiAgICB9IGVsc2UgewogICAgICAvLyB3YWl0IGZvciBsYXN0IGhlbHBl cidzIHByb21pc2UgdG8gcmVzb2x2ZQogICAgICAvLyBhbmQgdGhlbiBleGVj dXRlCiAgICAgIHJ1bihmdW5jdGlvbigpIHsKICAgICAgICBsYXN0UHJvbWlz ZSA9IEVtYmVyLlRlc3QucmVzb2x2ZShsYXN0UHJvbWlzZSkudGhlbihmdW5j dGlvbigpIHsKICAgICAgICAgIHJldHVybiBmbi5hcHBseShhcHAsIGFyZ3Mp OwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KCiAgICByZXR1cm4gbGFz dFByb21pc2U7CiAgfTsKfQoKZnVuY3Rpb24gcnVuKGZuKSB7CiAgaWYgKCFF bWJlci5ydW4uY3VycmVudFJ1bkxvb3ApIHsKICAgIEVtYmVyLnJ1bihmbik7 CiAgfSBlbHNlIHsKICAgIGZuKCk7CiAgfQp9CgpFbWJlci5BcHBsaWNhdGlv bi5yZW9wZW4oewogIC8qKgogICBUaGlzIHByb3BlcnR5IGNvbnRhaW5zIHRo ZSB0ZXN0aW5nIGhlbHBlcnMgZm9yIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9u LiBUaGVzZQogICBhcmUgY3JlYXRlZCBvbmNlIHlvdSBjYWxsIGBpbmplY3RU ZXN0SGVscGVyc2Agb24geW91ciBgRW1iZXIuQXBwbGljYXRpb25gCiAgIGlu c3RhbmNlLiBUaGUgaW5jbHVkZWQgaGVscGVycyBhcmUgYWxzbyBhdmFpbGFi bGUgb24gdGhlIGB3aW5kb3dgIG9iamVjdCBieQogICBkZWZhdWx0LCBidXQg Y2FuIGJlIHVzZWQgZnJvbSB0aGlzIG9iamVjdCBvbiB0aGUgaW5kaXZpZHVh bCBhcHBsaWNhdGlvbiBhbHNvLgoKICAgIEBwcm9wZXJ0eSB0ZXN0SGVscGVy cwogICAgQHR5cGUge09iamVjdH0KICAgIEBkZWZhdWx0IHt9CiAgKi8KICB0 ZXN0SGVscGVyczoge30sCgogIC8qKgogICBUaGlzIHByb3BlcnR5IHdpbGwg Y29udGFpbiB0aGUgb3JpZ2luYWwgbWV0aG9kcyB0aGF0IHdlcmUgcmVnaXN0 ZXJlZAogICBvbiB0aGUgYGhlbHBlckNvbnRhaW5lcmAgYmVmb3JlIGBpbmpl Y3RUZXN0SGVscGVyc2AgaXMgY2FsbGVkLgoKICAgV2hlbiBgcmVtb3ZlVGVz dEhlbHBlcnNgIGlzIGNhbGxlZCwgdGhlc2UgbWV0aG9kcyBhcmUgcmVzdG9y ZWQgdG8gdGhlCiAgIGBoZWxwZXJDb250YWluZXJgLgoKICAgIEBwcm9wZXJ0 eSBvcmlnaW5hbE1ldGhvZHMKICAgIEB0eXBlIHtPYmplY3R9CiAgICBAZGVm YXVsdCB7fQogICAgQHByaXZhdGUKICAqLwogIG9yaWdpbmFsTWV0aG9kczog e30sCgoKICAvKioKICBUaGlzIHByb3BlcnR5IGluZGljYXRlcyB3aGV0aGVy IG9yIG5vdCB0aGlzIGFwcGxpY2F0aW9uIGlzIGN1cnJlbnRseSBpbgogIHRl c3RpbmcgbW9kZS4gVGhpcyBpcyBzZXQgd2hlbiBgc2V0dXBGb3JUZXN0aW5n YCBpcyBjYWxsZWQgb24gdGhlIGN1cnJlbnQKICBhcHBsaWNhdGlvbi4KCiAg QHByb3BlcnR5IHRlc3RpbmcKICBAdHlwZSB7Qm9vbGVhbn0KICBAZGVmYXVs dCBmYWxzZQogICovCiAgdGVzdGluZzogZmFsc2UsCgogIC8qKgogICBUaGlz IGhvb2sgZGVmZXJzIHRoZSByZWFkaW5lc3Mgb2YgdGhlIGFwcGxpY2F0aW9u LCBzbyB0aGF0IHlvdSBjYW4gc3RhcnQKICAgdGhlIGFwcCB3aGVuIHlvdXIg dGVzdHMgYXJlIHJlYWR5IHRvIHJ1bi4gSXQgYWxzbyBzZXRzIHRoZSByb3V0 ZXIncwogICBsb2NhdGlvbiB0byAnbm9uZScsIHNvIHRoYXQgdGhlIHdpbmRv dydzIGxvY2F0aW9uIHdpbGwgbm90IGJlIG1vZGlmaWVkCiAgIChwcmV2ZW50 aW5nIGJvdGggYWNjaWRlbnRhbCBsZWFraW5nIG9mIHN0YXRlIGJldHdlZW4g dGVzdHMgYW5kIGludGVyZmVyZW5jZQogICB3aXRoIHlvdXIgdGVzdGluZyBm cmFtZXdvcmspLgoKICAgRXhhbXBsZToKCiAgYGBgCiAgQXBwLnNldHVwRm9y VGVzdGluZygpOwogIGBgYAoKICAgIEBtZXRob2Qgc2V0dXBGb3JUZXN0aW5n CiAgKi8KICBzZXR1cEZvclRlc3Rpbmc6IGZ1bmN0aW9uKCkgewogICAgRW1i ZXIuc2V0dXBGb3JUZXN0aW5nKCk7CgogICAgdGhpcy50ZXN0aW5nID0gdHJ1 ZTsKCiAgICB0aGlzLlJvdXRlci5yZW9wZW4oewogICAgICBsb2NhdGlvbjog J25vbmUnCiAgICB9KTsKCiAgICBpZiAoRW1iZXIuRkVBVFVSRVMuaXNFbmFi bGVkKCdlbWJlci10ZXN0aW5nLXNpbXBsZS1zZXR1cCcpKXsKICAgICAgdGhp cy50ZXN0aW5nU2V0dXAgPSB0cnVlOwogICAgfQogIH0sCgogIC8qKgogICAg VGhpcyB3aWxsIGJlIHVzZWQgYXMgdGhlIGNvbnRhaW5lciB0byBpbmplY3Qg dGhlIHRlc3QgaGVscGVycyBpbnRvLiBCeQogICAgZGVmYXVsdCB0aGUgaGVs cGVycyBhcmUgaW5qZWN0ZWQgaW50byBgd2luZG93YC4KCiAgICBAcHJvcGVy dHkgaGVscGVyQ29udGFpbmVyCiAgIEB0eXBlIHtPYmplY3R9IFRoZSBvYmpl Y3QgdG8gYmUgdXNlZCBmb3IgdGVzdCBoZWxwZXJzLgogICBAZGVmYXVsdCB3 aW5kb3cKICAqLwogIGhlbHBlckNvbnRhaW5lcjogd2luZG93LAoKICAvKioK ICAgIFRoaXMgaW5qZWN0cyB0aGUgdGVzdCBoZWxwZXJzIGludG8gdGhlIGBo ZWxwZXJDb250YWluZXJgIG9iamVjdC4gSWYgYW4gb2JqZWN0IGlzIHByb3Zp ZGVkCiAgICBpdCB3aWxsIGJlIHVzZWQgYXMgdGhlIGhlbHBlckNvbnRhaW5l ci4gSWYgYGhlbHBlckNvbnRhaW5lcmAgaXMgbm90IHNldCBpdCB3aWxsIGRl ZmF1bHQKICAgIHRvIGB3aW5kb3dgLiBJZiBhIGZ1bmN0aW9uIG9mIHRoZSBz YW1lIG5hbWUgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkIGl0IHdpbGwgYmUg Y2FjaGVkCiAgICAoc28gdGhhdCBpdCBjYW4gYmUgcmVzZXQgaWYgdGhlIGhl bHBlciBpcyByZW1vdmVkIHdpdGggYHVucmVnaXN0ZXJIZWxwZXJgIG9yCiAg ICBgcmVtb3ZlVGVzdEhlbHBlcnNgKS4KCiAgIEFueSBjYWxsYmFja3MgcmVn aXN0ZXJlZCB3aXRoIGBvbkluamVjdEhlbHBlcnNgIHdpbGwgYmUgY2FsbGVk IG9uY2UgdGhlCiAgIGhlbHBlcnMgaGF2ZSBiZWVuIGluamVjdGVkLgoKICBF eGFtcGxlOgogIGBgYAogIEFwcC5pbmplY3RUZXN0SGVscGVycygpOwogIGBg YAoKICAgIEBtZXRob2QgaW5qZWN0VGVzdEhlbHBlcnMKICAqLwogIGluamVj dFRlc3RIZWxwZXJzOiBmdW5jdGlvbihoZWxwZXJDb250YWluZXIpIHsKICAg IGlmIChoZWxwZXJDb250YWluZXIpIHsgdGhpcy5oZWxwZXJDb250YWluZXIg PSBoZWxwZXJDb250YWluZXI7IH0KCiAgICB0aGlzLnRlc3RIZWxwZXJzID0g e307CiAgICBmb3IgKHZhciBuYW1lIGluIGhlbHBlcnMpIHsKICAgICAgdGhp cy5vcmlnaW5hbE1ldGhvZHNbbmFtZV0gPSB0aGlzLmhlbHBlckNvbnRhaW5l cltuYW1lXTsKICAgICAgdGhpcy50ZXN0SGVscGVyc1tuYW1lXSA9IHRoaXMu aGVscGVyQ29udGFpbmVyW25hbWVdID0gaGVscGVyKHRoaXMsIG5hbWUpOwog ICAgICBwcm90b1dyYXAoRW1iZXIuVGVzdC5Qcm9taXNlLnByb3RvdHlwZSwg bmFtZSwgaGVscGVyKHRoaXMsIG5hbWUpLCBoZWxwZXJzW25hbWVdLm1ldGEu d2FpdCk7CiAgICB9CgogICAgZm9yKHZhciBpID0gMCwgbCA9IGluamVjdEhl bHBlcnNDYWxsYmFja3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIGlu amVjdEhlbHBlcnNDYWxsYmFja3NbaV0odGhpcyk7CiAgICB9CiAgfSwKCiAg LyoqCiAgICBUaGlzIHJlbW92ZXMgYWxsIGhlbHBlcnMgdGhhdCBoYXZlIGJl ZW4gcmVnaXN0ZXJlZCwgYW5kIHJlc2V0cyBhbmQgZnVuY3Rpb25zCiAgICB0 aGF0IHdlcmUgb3ZlcnJpZGRlbiBieSB0aGUgaGVscGVycy4KCiAgICBFeGFt cGxlOgoKICAgIGBgYGphdmFzY3JpcHQKICAgIEFwcC5yZW1vdmVUZXN0SGVs cGVycygpOwogICAgYGBgCgogICAgQHB1YmxpYwogICAgQG1ldGhvZCByZW1v dmVUZXN0SGVscGVycwogICovCiAgcmVtb3ZlVGVzdEhlbHBlcnM6IGZ1bmN0 aW9uKCkgewogICAgZm9yICh2YXIgbmFtZSBpbiBoZWxwZXJzKSB7CiAgICAg IHRoaXMuaGVscGVyQ29udGFpbmVyW25hbWVdID0gdGhpcy5vcmlnaW5hbE1l dGhvZHNbbmFtZV07CiAgICAgIGRlbGV0ZSB0aGlzLnRlc3RIZWxwZXJzW25h bWVdOwogICAgICBkZWxldGUgdGhpcy5vcmlnaW5hbE1ldGhvZHNbbmFtZV07 CiAgICB9CiAgfQp9KTsKCi8vIFRoaXMgbWV0aG9kIGlzIG5vIGxvbmdlciBu ZWVkZWQKLy8gQnV0IHN0aWxsIGhlcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRp YmlsaXR5Ci8vIG9mIGhlbHBlciBjaGFpbmluZwpmdW5jdGlvbiBwcm90b1dy YXAocHJvdG8sIG5hbWUsIGNhbGxiYWNrLCBpc0FzeW5jKSB7CiAgcHJvdG9b bmFtZV0gPSBmdW5jdGlvbigpIHsKICAgIHZhciBhcmdzID0gYXJndW1lbnRz OwogICAgaWYgKGlzQXN5bmMpIHsKICAgICAgcmV0dXJuIGNhbGxiYWNrLmFw cGx5KHRoaXMsIGFyZ3MpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHRo aXMudGhlbihmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gY2FsbGJhY2su YXBwbHkodGhpcywgYXJncyk7CiAgICAgIH0pOwogICAgfQogIH07Cn0KCkVt YmVyLlRlc3QuUHJvbWlzZSA9IGZ1bmN0aW9uKCkgewogIEVtYmVyLlJTVlAu UHJvbWlzZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogIEVtYmVyLlRlc3Qu bGFzdFByb21pc2UgPSB0aGlzOwp9OwoKRW1iZXIuVGVzdC5Qcm9taXNlLnBy b3RvdHlwZSA9IEVtYmVyLmNyZWF0ZShFbWJlci5SU1ZQLlByb21pc2UucHJv dG90eXBlKTsKRW1iZXIuVGVzdC5Qcm9taXNlLnByb3RvdHlwZS5jb25zdHJ1 Y3RvciA9IEVtYmVyLlRlc3QuUHJvbWlzZTsKCi8vIFBhdGNoIGB0aGVuYCB0 byBpc29sYXRlIGFzeW5jIG1ldGhvZHMKLy8gc3BlY2lmaWNhbGx5IGBFbWJl ci5UZXN0Lmxhc3RQcm9taXNlYAp2YXIgb3JpZ2luYWxUaGVuID0gRW1iZXIu UlNWUC5Qcm9taXNlLnByb3RvdHlwZS50aGVuOwpFbWJlci5UZXN0LlByb21p c2UucHJvdG90eXBlLnRoZW4gPSBmdW5jdGlvbihvblN1Y2Nlc3MsIG9uRmFp bHVyZSkgewogIHJldHVybiBvcmlnaW5hbFRoZW4uY2FsbCh0aGlzLCBmdW5j dGlvbih2YWwpIHsKICAgIHJldHVybiBpc29sYXRlKG9uU3VjY2VzcywgdmFs KTsKICB9LCBvbkZhaWx1cmUpOwp9OwoKLy8gVGhpcyBtZXRob2QgaXNvbGF0 ZXMgbmVzdGVkIGFzeW5jIG1ldGhvZHMKLy8gc28gdGhhdCB0aGV5IGRvbid0 IGNvbmZsaWN0IHdpdGggb3RoZXIgbGFzdCBwcm9taXNlcy4KLy8KLy8gMS4g U2V0IGBFbWJlci5UZXN0Lmxhc3RQcm9taXNlYCB0byBudWxsCi8vIDIuIElu dm9rZSBtZXRob2QKLy8gMy4gUmV0dXJuIHRoZSBsYXN0IHByb21pc2UgY3Jl YXRlZCBkdXJpbmcgbWV0aG9kCi8vIDQuIFJlc3RvcmUgYEVtYmVyLlRlc3Qu bGFzdFByb21pc2VgIHRvIG9yaWdpbmFsIHZhbHVlCmZ1bmN0aW9uIGlzb2xh dGUoZm4sIHZhbCkgewogIHZhciB2YWx1ZSwgbGFzdFByb21pc2U7CgogIC8v IFJlc2V0IGxhc3RQcm9taXNlIGZvciBuZXN0ZWQgaGVscGVycwogIEVtYmVy LlRlc3QubGFzdFByb21pc2UgPSBudWxsOwoKICB2YWx1ZSA9IGZuKHZhbCk7 CgogIGxhc3RQcm9taXNlID0gRW1iZXIuVGVzdC5sYXN0UHJvbWlzZTsKCiAg Ly8gSWYgdGhlIG1ldGhvZCByZXR1cm5lZCBhIHByb21pc2UKICAvLyByZXR1 cm4gdGhhdCBwcm9taXNlLiBJZiBub3QsCiAgLy8gcmV0dXJuIHRoZSBsYXN0 IGFzeW5jIGhlbHBlcidzIHByb21pc2UKICBpZiAoKHZhbHVlICYmICh2YWx1 ZSBpbnN0YW5jZW9mIEVtYmVyLlRlc3QuUHJvbWlzZSkpIHx8ICFsYXN0UHJv bWlzZSkgewogICAgcmV0dXJuIHZhbHVlOwogIH0gZWxzZSB7CiAgICBydW4o ZnVuY3Rpb24oKSB7CiAgICAgIGxhc3RQcm9taXNlID0gRW1iZXIuVGVzdC5y ZXNvbHZlKGxhc3RQcm9taXNlKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAg IHJldHVybiB2YWx1ZTsKICAgICAgfSk7CiAgICB9KTsKICAgIHJldHVybiBs YXN0UHJvbWlzZTsKICB9Cn0KCn0pKCk7CgoKCihmdW5jdGlvbigpIHsKRW1i ZXIub25Mb2FkKCdFbWJlci5BcHBsaWNhdGlvbicsIGZ1bmN0aW9uKEFwcGxp Y2F0aW9uKSB7CiAgQXBwbGljYXRpb24uaW5pdGlhbGl6ZXIoewogICAgbmFt ZTogJ2RlZmVyUmVhZGluZXNzIGluIGB0ZXN0aW5nYCBtb2RlJywKCiAgICBp bml0aWFsaXplOiBmdW5jdGlvbihjb250YWluZXIsIGFwcGxpY2F0aW9uKXsK ICAgICAgaWYgKGFwcGxpY2F0aW9uLnRlc3RpbmcpIHsKICAgICAgICBhcHBs aWNhdGlvbi5kZWZlclJlYWRpbmVzcygpOwogICAgICB9CiAgICB9CiAgfSk7 CgogIGlmIChFbWJlci5GRUFUVVJFUy5pc0VuYWJsZWQoJ2VtYmVyLXRlc3Rp bmctc2ltcGxlLXNldHVwJykpewogICAgQXBwbGljYXRpb24uaW5pdGlhbGl6 ZXIoewogICAgICBuYW1lOiAnc2V0dXBGb3JUZXN0aW5nIGFuZCBpbmplY3RU ZXN0SGVscGVycyB3aGVuIGNyZWF0ZWQgd2l0aCB0ZXN0aW5nID0gdHJ1ZScs CgogICAgICBpbml0aWFsaXplOiBmdW5jdGlvbihjb250YWluZXIsIGFwcGxp Y2F0aW9uKXsKICAgICAgICBpZiAoYXBwbGljYXRpb24udGVzdGluZyAmJiAh YXBwbGljYXRpb24udGVzdGluZ1NldHVwKSB7CiAgICAgICAgICBhcHBsaWNh dGlvbi5zZXR1cEZvclRlc3RpbmcoKTsKICAgICAgICAgIGFwcGxpY2F0aW9u LmluamVjdFRlc3RIZWxwZXJzKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9 KTsKICB9Cn0pOwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewovKioKICBAbW9k dWxlIGVtYmVyCiAgQHN1Ym1vZHVsZSBlbWJlci10ZXN0aW5nCiAqLwoKdmFy ICQgPSBFbWJlci4kOwoKLyoqCiAgVGhpcyBtZXRob2QgY3JlYXRlcyBhIGNo ZWNrYm94IGFuZCB0cmlnZ2VycyB0aGUgY2xpY2sgZXZlbnQgdG8gZmlyZSB0 aGUKICBwYXNzZWQgaW4gaGFuZGxlci4gSXQgaXMgdXNlZCB0byBjb3JyZWN0 IGZvciBhIGJ1ZyBpbiBvbGRlciB2ZXJzaW9ucwogIG9mIGpRdWVyeSAoZS5n IDEuOC4zKS4KCiAgQHByaXZhdGUKICBAbWV0aG9kIHRlc3RDaGVja2JveENs aWNrCiovCmZ1bmN0aW9uIHRlc3RDaGVja2JveENsaWNrKGhhbmRsZXIpIHsK ICAkKCc8aW5wdXQgdHlwZT0iY2hlY2tib3giPicpCiAgICAuY3NzKHsgcG9z aXRpb246ICdhYnNvbHV0ZScsIGxlZnQ6ICctMTAwMHB4JywgdG9wOiAnLTEw MDBweCcgfSkKICAgIC5hcHBlbmRUbygnYm9keScpCiAgICAub24oJ2NsaWNr JywgaGFuZGxlcikKICAgIC50cmlnZ2VyKCdjbGljaycpCiAgICAucmVtb3Zl KCk7Cn0KCiQoZnVuY3Rpb24oKSB7CiAgLyoKICAgIERldGVybWluZSB3aGV0 aGVyIGEgY2hlY2tib3ggY2hlY2tlZCB1c2luZyBqUXVlcnkncyAiY2xpY2si IG1ldGhvZCB3aWxsIGhhdmUKICAgIHRoZSBjb3JyZWN0IHZhbHVlIGZvciBp dHMgY2hlY2tlZCBwcm9wZXJ0eS4KCiAgICBJZiB3ZSBkZXRlcm1pbmUgdGhh dCB0aGUgY3VycmVudCBqUXVlcnkgdmVyc2lvbiBleGhpYml0cyB0aGlzIGJl aGF2aW9yLAogICAgcGF0Y2ggaXQgdG8gd29yayBjb3JyZWN0bHkgYXMgaW4g dGhlIGNvbW1pdCBmb3IgdGhlIGFjdHVhbCBmaXg6CiAgICBodHRwczovL2dp dGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9jb21taXQvMWZiMmY5Mi4KICAqLwog IHRlc3RDaGVja2JveENsaWNrKGZ1bmN0aW9uKCkgewogICAgaWYgKCF0aGlz LmNoZWNrZWQgJiYgISQuZXZlbnQuc3BlY2lhbC5jbGljaykgewogICAgICAk LmV2ZW50LnNwZWNpYWwuY2xpY2sgPSB7CiAgICAgICAgLy8gRm9yIGNoZWNr Ym94LCBmaXJlIG5hdGl2ZSBldmVudCBzbyBjaGVja2VkIHN0YXRlIHdpbGwg YmUgcmlnaHQKICAgICAgICB0cmlnZ2VyOiBmdW5jdGlvbigpIHsKICAgICAg ICAgIGlmICgkLm5vZGVOYW1lKCB0aGlzLCAiaW5wdXQiICkgJiYgdGhpcy50 eXBlID09PSAiY2hlY2tib3giICYmIHRoaXMuY2xpY2spIHsKICAgICAgICAg ICAgdGhpcy5jbGljaygpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAg ICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwogICAgfQogIH0pOwoKICAv LyBUcnkgYWdhaW4gdG8gdmVyaWZ5IHRoYXQgdGhlIHBhdGNoIHRvb2sgZWZm ZWN0IG9yIGJsb3cgdXAuCiAgdGVzdENoZWNrYm94Q2xpY2soZnVuY3Rpb24o KSB7CiAgICBFbWJlci53YXJuKCJjbGlja2VkIGNoZWNrYm94ZXMgc2hvdWxk IGJlIGNoZWNrZWQhIHRoZSBqUXVlcnkgcGF0Y2ggZGlkbid0IHdvcmsiLCB0 aGlzLmNoZWNrZWQpOwogIH0pOwp9KTsKCn0pKCk7CgoKCihmdW5jdGlvbigp IHsKLyoqCiBAbW9kdWxlIGVtYmVyCiBAc3VibW9kdWxlIGVtYmVyLXRlc3Rp bmcKKi8KCnZhciBUZXN0ID0gRW1iZXIuVGVzdDsKCi8qKgogIFRoZSBwcmlt YXJ5IHB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyB0byBjcmVhdGUgaG9va3Mg dGhhdCBjYW4gYmUgaW1wbGVtZW50ZWQKICBieSBhbiBhZGFwdGVyIGZvciB2 YXJpb3VzIHRlc3QgZnJhbWV3b3Jrcy4KCiAgQGNsYXNzIEFkYXB0ZXIKICBA bmFtZXNwYWNlIEVtYmVyLlRlc3QKKi8KVGVzdC5BZGFwdGVyID0gRW1iZXIu T2JqZWN0LmV4dGVuZCh7CiAgLyoqCiAgICBUaGlzIGNhbGxiYWNrIHdpbGwg YmUgY2FsbGVkIHdoZW5ldmVyIGFuIGFzeW5jIG9wZXJhdGlvbiBpcyBhYm91 dCB0byBzdGFydC4KCiAgICBPdmVycmlkZSB0aGlzIHRvIGNhbGwgeW91ciBm cmFtZXdvcmsncyBtZXRob2RzIHRoYXQgaGFuZGxlIGFzeW5jCiAgICBvcGVy YXRpb25zLgoKICAgIEBwdWJsaWMKICAgIEBtZXRob2QgYXN5bmNTdGFydAog ICovCiAgYXN5bmNTdGFydDogRW1iZXIuSywKCiAgLyoqCiAgICBUaGlzIGNh bGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIGFuIGFzeW5jIG9wZXJh dGlvbiBoYXMgY29tcGxldGVkLgoKICAgIEBwdWJsaWMKICAgIEBtZXRob2Qg YXN5bmNFbmQKICAqLwogIGFzeW5jRW5kOiBFbWJlci5LLAoKICAvKioKICAg IE92ZXJyaWRlIHRoaXMgbWV0aG9kIHdpdGggeW91ciB0ZXN0aW5nIGZyYW1l d29yaydzIGZhbHNlIGFzc2VydGlvbi4KICAgIFRoaXMgZnVuY3Rpb24gaXMg Y2FsbGVkIHdoZW5ldmVyIGFuIGV4Y2VwdGlvbiBvY2N1cnMgY2F1c2luZyB0 aGUgdGVzdGluZwogICAgcHJvbWlzZSB0byBmYWlsLgoKICAgIFFVbml0IGV4 YW1wbGU6CgogICAgYGBgamF2YXNjcmlwdAogICAgICBleGNlcHRpb246IGZ1 bmN0aW9uKGVycm9yKSB7CiAgICAgICAgb2soZmFsc2UsIGVycm9yKTsKICAg ICAgfTsKICAgIGBgYAoKICAgIEBwdWJsaWMKICAgIEBtZXRob2QgZXhjZXB0 aW9uCiAgICBAcGFyYW0ge1N0cmluZ30gZXJyb3IgVGhlIGV4Y2VwdGlvbiB0 byBiZSByYWlzZWQuCiAgKi8KICBleGNlcHRpb246IGZ1bmN0aW9uKGVycm9y KSB7CiAgICB0aHJvdyBlcnJvcjsKICB9Cn0pOwoKLyoqCiAgVGhpcyBjbGFz cyBpbXBsZW1lbnRzIHRoZSBtZXRob2RzIGRlZmluZWQgYnkgRW1iZXIuVGVz dC5BZGFwdGVyIGZvciB0aGUKICBRVW5pdCB0ZXN0aW5nIGZyYW1ld29yay4K CiAgQGNsYXNzIFFVbml0QWRhcHRlcgogIEBuYW1lc3BhY2UgRW1iZXIuVGVz dAogIEBleHRlbmRzIEVtYmVyLlRlc3QuQWRhcHRlcgoqLwpUZXN0LlFVbml0 QWRhcHRlciA9IFRlc3QuQWRhcHRlci5leHRlbmQoewogIGFzeW5jU3RhcnQ6 IGZ1bmN0aW9uKCkgewogICAgc3RvcCgpOwogIH0sCiAgYXN5bmNFbmQ6IGZ1 bmN0aW9uKCkgewogICAgc3RhcnQoKTsKICB9LAogIGV4Y2VwdGlvbjogZnVu Y3Rpb24oZXJyb3IpIHsKICAgIG9rKGZhbHNlLCBFbWJlci5pbnNwZWN0KGVy cm9yKSk7CiAgfQp9KTsKCn0pKCk7CgoKCihmdW5jdGlvbigpIHsKLyoqCiog QG1vZHVsZSBlbWJlcgoqIEBzdWJtb2R1bGUgZW1iZXItdGVzdGluZwoqLwoK dmFyIGdldCA9IEVtYmVyLmdldCwKICAgIFRlc3QgPSBFbWJlci5UZXN0LAog ICAgaGVscGVyID0gVGVzdC5yZWdpc3RlckhlbHBlciwKICAgIGFzeW5jSGVs cGVyID0gVGVzdC5yZWdpc3RlckFzeW5jSGVscGVyLAogICAgY291bnRBc3lu YyA9IDA7CgpUZXN0LnBlbmRpbmdBamF4UmVxdWVzdHMgPSAwOwoKVGVzdC5v bkluamVjdEhlbHBlcnMoZnVuY3Rpb24oKSB7CiAgRW1iZXIuJChkb2N1bWVu dCkuYWpheFN0YXJ0KGZ1bmN0aW9uKCkgewogICAgVGVzdC5wZW5kaW5nQWph eFJlcXVlc3RzKys7CiAgfSk7CgogIEVtYmVyLiQoZG9jdW1lbnQpLmFqYXhT dG9wKGZ1bmN0aW9uKCkgewogICAgRW1iZXIuYXNzZXJ0KCJBbiBhamF4U3Rv cCBldmVudCB3aGljaCB3b3VsZCBjYXVzZSB0aGUgbnVtYmVyIG9mIHBlbmRp bmcgQUpBWCAiICsKICAgICAgICAgICAgICAgICAicmVxdWVzdHMgdG8gYmUg bmVnYXRpdmUgaGFzIGJlZW4gdHJpZ2dlcmVkLiBUaGlzIGlzIG1vc3QgbGlr ZWx5ICIgKwogICAgICAgICAgICAgICAgICJjYXVzZWQgYnkgQUpBWCBldmVu dHMgdGhhdCB3ZXJlIHN0YXJ0ZWQgYmVmb3JlIGNhbGxpbmcgIiArCiAgICAg ICAgICAgICAgICAgImBpbmplY3RUZXN0SGVscGVycygpYC4iLCBUZXN0LnBl bmRpbmdBamF4UmVxdWVzdHMgIT09IDApOwogICAgVGVzdC5wZW5kaW5nQWph eFJlcXVlc3RzLS07CiAgfSk7Cn0pOwoKZnVuY3Rpb24gY3VycmVudFJvdXRl TmFtZShhcHApewogIHZhciBhcHBDb250cm9sbGVyID0gYXBwLl9fY29udGFp bmVyX18ubG9va3VwKCdjb250cm9sbGVyOmFwcGxpY2F0aW9uJyk7CgogIHJl dHVybiBnZXQoYXBwQ29udHJvbGxlciwgJ2N1cnJlbnRSb3V0ZU5hbWUnKTsK fQoKZnVuY3Rpb24gY3VycmVudFBhdGgoYXBwKXsKICB2YXIgYXBwQ29udHJv bGxlciA9IGFwcC5fX2NvbnRhaW5lcl9fLmxvb2t1cCgnY29udHJvbGxlcjph cHBsaWNhdGlvbicpOwoKICByZXR1cm4gZ2V0KGFwcENvbnRyb2xsZXIsICdj dXJyZW50UGF0aCcpOwp9CgpmdW5jdGlvbiBjdXJyZW50VVJMKGFwcCl7CiAg dmFyIHJvdXRlciA9IGFwcC5fX2NvbnRhaW5lcl9fLmxvb2t1cCgncm91dGVy Om1haW4nKTsKCiAgcmV0dXJuIGdldChyb3V0ZXIsICdsb2NhdGlvbicpLmdl dFVSTCgpOwp9CgpmdW5jdGlvbiB2aXNpdChhcHAsIHVybCkgewogIHZhciBy b3V0ZXIgPSBhcHAuX19jb250YWluZXJfXy5sb29rdXAoJ3JvdXRlcjptYWlu Jyk7CiAgcm91dGVyLmxvY2F0aW9uLnNldFVSTCh1cmwpOwoKICBpZiAoYXBw Ll9yZWFkaW5lc3NEZWZlcnJhbHMgPiAwKSB7CiAgICByb3V0ZXJbJ2luaXRp YWxVUkwnXSA9IHVybDsKICAgIEVtYmVyLnJ1bihhcHAsICdhZHZhbmNlUmVh ZGluZXNzJyk7CiAgICBkZWxldGUgcm91dGVyWydpbml0aWFsVVJMJ107CiAg fSBlbHNlIHsKICAgIEVtYmVyLnJ1bihhcHAsIGFwcC5oYW5kbGVVUkwsIHVy bCk7CiAgfQoKICByZXR1cm4gd2FpdChhcHApOwp9CgpmdW5jdGlvbiBjbGlj ayhhcHAsIHNlbGVjdG9yLCBjb250ZXh0KSB7CiAgdmFyICRlbCA9IGZpbmRX aXRoQXNzZXJ0KGFwcCwgc2VsZWN0b3IsIGNvbnRleHQpOwogIEVtYmVyLnJ1 bigkZWwsICdtb3VzZWRvd24nKTsKCiAgaWYgKCRlbC5pcygnOmlucHV0Jykp IHsKICAgIHZhciB0eXBlID0gJGVsLnByb3AoJ3R5cGUnKTsKICAgIGlmICh0 eXBlICE9PSAnY2hlY2tib3gnICYmIHR5cGUgIT09ICdyYWRpbycgJiYgdHlw ZSAhPT0gJ2hpZGRlbicpIHsKICAgICAgRW1iZXIucnVuKCRlbCwgZnVuY3Rp b24oKXsKICAgICAgICAvLyBGaXJlZm94IGRvZXMgbm90IHRyaWdnZXIgdGhl IGBmb2N1c2luYCBldmVudCBpZiB0aGUgd2luZG93CiAgICAgICAgLy8gZG9l cyBub3QgaGF2ZSBmb2N1cy4gSWYgdGhlIGRvY3VtZW50IGRvZXNuJ3QgaGF2 ZSBmb2N1cyBqdXN0CiAgICAgICAgLy8gdXNlIHRyaWdnZXIoJ2ZvY3VzaW4n KSBpbnN0ZWFkLgogICAgICAgIGlmICghZG9jdW1lbnQuaGFzRm9jdXMgfHwg ZG9jdW1lbnQuaGFzRm9jdXMoKSkgewogICAgICAgICAgdGhpcy5mb2N1cygp OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2Zv Y3VzaW4nKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0KCiAgRW1i ZXIucnVuKCRlbCwgJ21vdXNldXAnKTsKICBFbWJlci5ydW4oJGVsLCAnY2xp Y2snKTsKCiAgcmV0dXJuIHdhaXQoYXBwKTsKfQoKZnVuY3Rpb24gdHJpZ2dl ckV2ZW50KGFwcCwgc2VsZWN0b3IsIGNvbnRleHQsIHR5cGUsIG9wdGlvbnMp ewogIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7CiAgICB0eXBlID0g Y29udGV4dDsKICAgIGNvbnRleHQgPSBudWxsOwogIH0KCiAgaWYgKHR5cGVv ZiBvcHRpb25zID09PSAndW5kZWZpbmVkJykgewogICAgb3B0aW9ucyA9IHt9 OwogIH0KCiAgdmFyICRlbCA9IGZpbmRXaXRoQXNzZXJ0KGFwcCwgc2VsZWN0 b3IsIGNvbnRleHQpOwoKICB2YXIgZXZlbnQgPSBFbWJlci4kLkV2ZW50KHR5 cGUsIG9wdGlvbnMpOwoKICBFbWJlci5ydW4oJGVsLCAndHJpZ2dlcicsIGV2 ZW50KTsKCiAgcmV0dXJuIHdhaXQoYXBwKTsKfQoKZnVuY3Rpb24ga2V5RXZl bnQoYXBwLCBzZWxlY3RvciwgY29udGV4dCwgdHlwZSwga2V5Q29kZSkgewog IGlmICh0eXBlb2Yga2V5Q29kZSA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgIGtl eUNvZGUgPSB0eXBlOwogICAgdHlwZSA9IGNvbnRleHQ7CiAgICBjb250ZXh0 ID0gbnVsbDsKICB9CgogIHJldHVybiB0cmlnZ2VyRXZlbnQoYXBwLCBzZWxl Y3RvciwgY29udGV4dCwgdHlwZSwgeyBrZXlDb2RlOiBrZXlDb2RlIH0pOwp9 CgpmdW5jdGlvbiBmaWxsSW4oYXBwLCBzZWxlY3RvciwgY29udGV4dCwgdGV4 dCkgewogIHZhciAkZWw7CiAgaWYgKHR5cGVvZiB0ZXh0ID09PSAndW5kZWZp bmVkJykgewogICAgdGV4dCA9IGNvbnRleHQ7CiAgICBjb250ZXh0ID0gbnVs bDsKICB9CiAgJGVsID0gZmluZFdpdGhBc3NlcnQoYXBwLCBzZWxlY3Rvciwg Y29udGV4dCk7CiAgRW1iZXIucnVuKGZ1bmN0aW9uKCkgewogICAgJGVsLnZh bCh0ZXh0KS5jaGFuZ2UoKTsKICB9KTsKICByZXR1cm4gd2FpdChhcHApOwp9 CgpmdW5jdGlvbiBmaW5kV2l0aEFzc2VydChhcHAsIHNlbGVjdG9yLCBjb250 ZXh0KSB7CiAgdmFyICRlbCA9IGZpbmQoYXBwLCBzZWxlY3RvciwgY29udGV4 dCk7CiAgaWYgKCRlbC5sZW5ndGggPT09IDApIHsKICAgIHRocm93IG5ldyBF bWJlci5FcnJvcigiRWxlbWVudCAiICsgc2VsZWN0b3IgKyAiIG5vdCBmb3Vu ZC4iKTsKICB9CiAgcmV0dXJuICRlbDsKfQoKZnVuY3Rpb24gZmluZChhcHAs IHNlbGVjdG9yLCBjb250ZXh0KSB7CiAgdmFyICRlbDsKICBjb250ZXh0ID0g Y29udGV4dCB8fCBnZXQoYXBwLCAncm9vdEVsZW1lbnQnKTsKICAkZWwgPSBh cHAuJChzZWxlY3RvciwgY29udGV4dCk7CgogIHJldHVybiAkZWw7Cn0KCmZ1 bmN0aW9uIGFuZFRoZW4oYXBwLCBjYWxsYmFjaykgewogIHJldHVybiB3YWl0 KGFwcCwgY2FsbGJhY2soYXBwKSk7Cn0KCmZ1bmN0aW9uIHdhaXQoYXBwLCB2 YWx1ZSkgewogIHJldHVybiBUZXN0LnByb21pc2UoZnVuY3Rpb24ocmVzb2x2 ZSkgewogICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgYXN5bmMgcHJvbWlz ZSwga2ljayBvZmYgdGhlIGFzeW5jIHRlc3QKICAgIGlmICgrK2NvdW50QXN5 bmMgPT09IDEpIHsKICAgICAgVGVzdC5hZGFwdGVyLmFzeW5jU3RhcnQoKTsK ICAgIH0KCiAgICAvLyBFdmVyeSAxMG1zLCBwb2xsIGZvciB0aGUgYXN5bmMg dGhpbmcgdG8gaGF2ZSBmaW5pc2hlZAogICAgdmFyIHdhdGNoZXIgPSBzZXRJ bnRlcnZhbChmdW5jdGlvbigpIHsKICAgICAgLy8gMS4gSWYgdGhlIHJvdXRl ciBpcyBsb2FkaW5nLCBrZWVwIHBvbGxpbmcKICAgICAgdmFyIHJvdXRlcklz TG9hZGluZyA9ICEhYXBwLl9fY29udGFpbmVyX18ubG9va3VwKCdyb3V0ZXI6 bWFpbicpLnJvdXRlci5hY3RpdmVUcmFuc2l0aW9uOwogICAgICBpZiAocm91 dGVySXNMb2FkaW5nKSB7IHJldHVybjsgfQoKICAgICAgLy8gMi4gSWYgdGhl cmUgYXJlIHBlbmRpbmcgQWpheCByZXF1ZXN0cywga2VlcCBwb2xsaW5nCiAg ICAgIGlmIChUZXN0LnBlbmRpbmdBamF4UmVxdWVzdHMpIHsgcmV0dXJuOyB9 CgogICAgICAvLyAzLiBJZiB0aGVyZSBhcmUgc2NoZWR1bGVkIHRpbWVycyBv ciB3ZSBhcmUgaW5zaWRlIG9mIGEgcnVuIGxvb3AsIGtlZXAgcG9sbGluZwog ICAgICBpZiAoRW1iZXIucnVuLmhhc1NjaGVkdWxlZFRpbWVycygpIHx8IEVt YmVyLnJ1bi5jdXJyZW50UnVuTG9vcCkgeyByZXR1cm47IH0KICAgICAgaWYg KFRlc3Qud2FpdGVycyAmJiBUZXN0LndhaXRlcnMuYW55KGZ1bmN0aW9uKHdh aXRlcikgewogICAgICAgIHZhciBjb250ZXh0ID0gd2FpdGVyWzBdOwogICAg ICAgIHZhciBjYWxsYmFjayA9IHdhaXRlclsxXTsKICAgICAgICByZXR1cm4g IWNhbGxiYWNrLmNhbGwoY29udGV4dCk7CiAgICAgIH0pKSB7IHJldHVybjsg fQogICAgICAvLyBTdG9wIHBvbGxpbmcKICAgICAgY2xlYXJJbnRlcnZhbCh3 YXRjaGVyKTsKCiAgICAgIC8vIElmIHRoaXMgaXMgdGhlIGxhc3QgYXN5bmMg cHJvbWlzZSwgZW5kIHRoZSBhc3luYyB0ZXN0CiAgICAgIGlmICgtLWNvdW50 QXN5bmMgPT09IDApIHsKICAgICAgICBUZXN0LmFkYXB0ZXIuYXN5bmNFbmQo KTsKICAgICAgfQoKICAgICAgLy8gU3luY2hyb25vdXNseSByZXNvbHZlIHRo ZSBwcm9taXNlCiAgICAgIEVtYmVyLnJ1bihudWxsLCByZXNvbHZlLCB2YWx1 ZSk7CiAgICB9LCAxMCk7CiAgfSk7Cgp9CgoKLyoqCiogTG9hZHMgYSByb3V0 ZSwgc2V0cyB1cCBhbnkgY29udHJvbGxlcnMsIGFuZCByZW5kZXJzIGFueSB0 ZW1wbGF0ZXMgYXNzb2NpYXRlZAoqIHdpdGggdGhlIHJvdXRlIGFzIHRob3Vn aCBhIHJlYWwgdXNlciBoYWQgdHJpZ2dlcmVkIHRoZSByb3V0ZSBjaGFuZ2Ug d2hpbGUKKiB1c2luZyB5b3VyIGFwcC4KKgoqIEV4YW1wbGU6CioKKiBgYGBq YXZhc2NyaXB0CiogdmlzaXQoJ3Bvc3RzL2luZGV4JykudGhlbihmdW5jdGlv bigpIHsKKiAgIC8vIGFzc2VydCBzb21ldGhpbmcKKiB9KTsKKiBgYGAKKgoq IEBtZXRob2QgdmlzaXQKKiBAcGFyYW0ge1N0cmluZ30gdXJsIHRoZSBuYW1l IG9mIHRoZSByb3V0ZQoqIEByZXR1cm4ge1JTVlAuUHJvbWlzZX0KKi8KYXN5 bmNIZWxwZXIoJ3Zpc2l0JywgdmlzaXQpOwoKLyoqCiogQ2xpY2tzIGFuIGVs ZW1lbnQgYW5kIHRyaWdnZXJzIGFueSBhY3Rpb25zIHRyaWdnZXJlZCBieSB0 aGUgZWxlbWVudCdzIGBjbGlja2AKKiBldmVudC4KKgoqIEV4YW1wbGU6CioK KiBgYGBqYXZhc2NyaXB0CiogY2xpY2soJy5zb21lLWpRdWVyeS1zZWxlY3Rv cicpLnRoZW4oZnVuY3Rpb24oKSB7CiogICAvLyBhc3NlcnQgc29tZXRoaW5n CiogfSk7CiogYGBgCioKKiBAbWV0aG9kIGNsaWNrCiogQHBhcmFtIHtTdHJp bmd9IHNlbGVjdG9yIGpRdWVyeSBzZWxlY3RvciBmb3IgZmluZGluZyBlbGVt ZW50IG9uIHRoZSBET00KKiBAcmV0dXJuIHtSU1ZQLlByb21pc2V9CiovCmFz eW5jSGVscGVyKCdjbGljaycsIGNsaWNrKTsKCi8qKgoqIFNpbXVsYXRlcyBh IGtleSBldmVudCwgZS5nLiBga2V5cHJlc3NgLCBga2V5ZG93bmAsIGBrZXl1 cGAgd2l0aCB0aGUgZGVzaXJlZCBrZXlDb2RlCioKKiBFeGFtcGxlOgoqCiog YGBgamF2YXNjcmlwdAoqIGtleUV2ZW50KCcuc29tZS1qUXVlcnktc2VsZWN0 b3InLCAna2V5cHJlc3MnLCAxMykudGhlbihmdW5jdGlvbigpIHsKKiAgLy8g YXNzZXJ0IHNvbWV0aGluZwoqIH0pOwoqIGBgYAoqCiogQG1ldGhvZCBrZXlF dmVudAoqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvciBqUXVlcnkgc2VsZWN0 b3IgZm9yIGZpbmRpbmcgZWxlbWVudCBvbiB0aGUgRE9NCiogQHBhcmFtIHtT dHJpbmd9IHR5cGUgdGhlIHR5cGUgb2Yga2V5IGV2ZW50LCBlLmcuIGBrZXlw cmVzc2AsIGBrZXlkb3duYCwgYGtleXVwYAoqIEBwYXJhbSB7TnVtYmVyfSBr ZXlDb2RlIHRoZSBrZXlDb2RlIG9mIHRoZSBzaW11bGF0ZWQga2V5IGV2ZW50 CiogQHJldHVybiB7UlNWUC5Qcm9taXNlfQoqLwphc3luY0hlbHBlcigna2V5 RXZlbnQnLCBrZXlFdmVudCk7CgovKioKKiBGaWxscyBpbiBhbiBpbnB1dCBl bGVtZW50IHdpdGggc29tZSB0ZXh0LgoqCiogRXhhbXBsZToKKgoqIGBgYGph dmFzY3JpcHQKKiBmaWxsSW4oJyNlbWFpbCcsICd5b3VAZXhhbXBsZS5jb20n KS50aGVuKGZ1bmN0aW9uKCkgewoqICAgLy8gYXNzZXJ0IHNvbWV0aGluZwoq IH0pOwoqIGBgYAoqCiogQG1ldGhvZCBmaWxsSW4KKiBAcGFyYW0ge1N0cmlu Z30gc2VsZWN0b3IgalF1ZXJ5IHNlbGVjdG9yIGZpbmRpbmcgYW4gaW5wdXQg ZWxlbWVudCBvbiB0aGUgRE9NCiogdG8gZmlsbCB0ZXh0IHdpdGgKKiBAcGFy YW0ge1N0cmluZ30gdGV4dCB0ZXh0IHRvIHBsYWNlIGluc2lkZSB0aGUgaW5w dXQgZWxlbWVudAoqIEByZXR1cm4ge1JTVlAuUHJvbWlzZX0KKi8KYXN5bmNI ZWxwZXIoJ2ZpbGxJbicsIGZpbGxJbik7CgovKioKKiBGaW5kcyBhbiBlbGVt ZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSBhcHAncyBjb250YWluZXIgZWxl bWVudC4gQSBzaW1wbGUgYWxpYXMKKiBmb3IgYGFwcC4kKHNlbGVjdG9yKWAu CioKKiBFeGFtcGxlOgoqCiogYGBgamF2YXNjcmlwdAoqIHZhciAkZWwgPSBm aW5kKCcubXktc2VsZWN0b3InKTsKKiBgYGAKKgoqIEBtZXRob2QgZmluZAoq IEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvciBqUXVlcnkgc3RyaW5nIHNlbGVj dG9yIGZvciBlbGVtZW50IGxvb2t1cAoqIEByZXR1cm4ge09iamVjdH0galF1 ZXJ5IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlc3VsdHMgb2YgdGhlIHF1 ZXJ5CiovCmhlbHBlcignZmluZCcsIGZpbmQpOwoKLyoqCiogTGlrZSBgZmlu ZGAsIGJ1dCB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIGVsZW1lbnQgc2VsZWN0 b3IgcmV0dXJucyBubyByZXN1bHRzLgoqCiogRXhhbXBsZToKKgoqIGBgYGph dmFzY3JpcHQKKiB2YXIgJGVsID0gZmluZFdpdGhBc3NlcnQoJy5kb2VzbnQt ZXhpc3QnKTsgLy8gdGhyb3dzIGVycm9yCiogYGBgCioKKiBAbWV0aG9kIGZp bmRXaXRoQXNzZXJ0CiogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yIGpRdWVy eSBzZWxlY3RvciBzdHJpbmcgZm9yIGZpbmRpbmcgYW4gZWxlbWVudCB3aXRo aW4KKiB0aGUgRE9NCiogQHJldHVybiB7T2JqZWN0fSBqUXVlcnkgb2JqZWN0 IHJlcHJlc2VudGluZyB0aGUgcmVzdWx0cyBvZiB0aGUgcXVlcnkKKiBAdGhy b3dzIHtFcnJvcn0gdGhyb3dzIGVycm9yIGlmIGpRdWVyeSBvYmplY3QgcmV0 dXJuZWQgaGFzIGEgbGVuZ3RoIG9mIDAKKi8KaGVscGVyKCdmaW5kV2l0aEFz c2VydCcsIGZpbmRXaXRoQXNzZXJ0KTsKCi8qKgogIENhdXNlcyB0aGUgcnVu IGxvb3AgdG8gcHJvY2VzcyBhbnkgcGVuZGluZyBldmVudHMuIFRoaXMgaXMg dXNlZCB0byBlbnN1cmUgdGhhdAogIGFueSBhc3luYyBvcGVyYXRpb25zIGZy b20gb3RoZXIgaGVscGVycyAob3IgeW91ciBhc3NlcnRpb25zKSBoYXZlIGJl ZW4gcHJvY2Vzc2VkLgoKICBUaGlzIGlzIG1vc3Qgb2Z0ZW4gdXNlZCBhcyB0 aGUgcmV0dXJuIHZhbHVlIGZvciB0aGUgaGVscGVyIGZ1bmN0aW9ucyAoc2Vl ICdjbGljaycsCiAgJ2ZpbGxJbicsJ3Zpc2l0JyxldGMpLgoKICBFeGFtcGxl OgoKICBgYGBqYXZhc2NyaXB0CiAgRW1iZXIuVGVzdC5yZWdpc3RlckFzeW5j SGVscGVyKCdsb2dpblVzZXInLCBmdW5jdGlvbihhcHAsIHVzZXJuYW1lLCBw YXNzd29yZCkgewogICAgdmlzaXQoJ3NlY3VyZWQvcGF0aC9oZXJlJykKICAg IC5maWxsSW4oJyN1c2VybmFtZScsIHVzZXJuYW1lKQogICAgLmZpbGxJbign I3Bhc3N3b3JkJywgdXNlcm5hbWUpCiAgICAuY2xpY2soJy5zdWJtaXQnKQoK ICAgIHJldHVybiB3YWl0KCk7CiAgfSk7CgogIEBtZXRob2Qgd2FpdAogIEBw YXJhbSB7T2JqZWN0fSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQu CiAgQHJldHVybiB7UlNWUC5Qcm9taXNlfQoqLwphc3luY0hlbHBlcignd2Fp dCcsIHdhaXQpOwphc3luY0hlbHBlcignYW5kVGhlbicsIGFuZFRoZW4pOwoK CgogIC8qKgogICAgUmV0dXJucyB0aGUgY3VycmVudGx5IGFjdGl2ZSByb3V0 ZSBuYW1lLgoKICAgIEV4YW1wbGU6CgogICAgYGBgamF2YXNjcmlwdAogICAg ZnVuY3Rpb24gdmFsaWRhdGVSb3V0ZU5hbWUoKXsKICAgICAgZXF1YWwoY3Vy cmVudFJvdXRlTmFtZSgpLCAnc29tZS5wYXRoJywgImNvcnJlY3Qgcm91dGUg d2FzIHRyYW5zaXRpb25lZCBpbnRvLiIpOwogICAgfQoKICAgIHZpc2l0KCcv c29tZS9wYXRoJykudGhlbih2YWxpZGF0ZVJvdXRlTmFtZSkKICAgIGBgYAoK ICAgIEBtZXRob2QgY3VycmVudFJvdXRlTmFtZQogICAgQHJldHVybiB7T2Jq ZWN0fSBUaGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSByb3V0ZS4K ICAqLwogIGhlbHBlcignY3VycmVudFJvdXRlTmFtZScsIGN1cnJlbnRSb3V0 ZU5hbWUpOwoKICAvKioKICAgIFJldHVybnMgdGhlIGN1cnJlbnQgcGF0aC4K CiAgICBFeGFtcGxlOgoKICAgIGBgYGphdmFzY3JpcHQKICAgIGZ1bmN0aW9u IHZhbGlkYXRlVVJMKCl7CiAgICAgIGVxdWFsKGN1cnJlbnRQYXRoKCksICdz b21lLnBhdGguaW5kZXgnLCAiY29ycmVjdCBwYXRoIHdhcyB0cmFuc2l0aW9u ZWQgaW50by4iKTsKICAgIH0KCiAgICBjbGljaygnI3NvbWUtbGluay1pZCcp LnRoZW4odmFsaWRhdGVVUkwpOwogICAgYGBgCgogICAgQG1ldGhvZCBjdXJy ZW50UGF0aAogICAgQHJldHVybiB7T2JqZWN0fSBUaGUgY3VycmVudGx5IGFj dGl2ZSBwYXRoLgogICovCiAgaGVscGVyKCdjdXJyZW50UGF0aCcsIGN1cnJl bnRQYXRoKTsKCiAgLyoqCiAgICBSZXR1cm5zIHRoZSBjdXJyZW50IFVSTC4K CiAgICBFeGFtcGxlOgoKICAgIGBgYGphdmFzY3JpcHQKICAgIGZ1bmN0aW9u IHZhbGlkYXRlVVJMKCl7CiAgICAgIGVxdWFsKGN1cnJlbnRVUkwoKSwgJy9z b21lL3BhdGgnLCAiY29ycmVjdCBVUkwgd2FzIHRyYW5zaXRpb25lZCBpbnRv LiIpOwogICAgfQoKICAgIGNsaWNrKCcjc29tZS1saW5rLWlkJykudGhlbih2 YWxpZGF0ZVVSTCk7CiAgICBgYGAKCiAgICBAbWV0aG9kIGN1cnJlbnRVUkwK ICAgIEByZXR1cm4ge09iamVjdH0gVGhlIGN1cnJlbnRseSBhY3RpdmUgVVJM LgogICovCiAgaGVscGVyKCdjdXJyZW50VVJMJywgY3VycmVudFVSTCk7CgoK CiAgLyoqCiAgICBUcmlnZ2VycyB0aGUgZ2l2ZW4gZXZlbnQgb24gdGhlIGVs ZW1lbnQgaWRlbnRpZmllZCBieSB0aGUgcHJvdmlkZWQgc2VsZWN0b3IuCgog ICAgRXhhbXBsZToKCiAgICBgYGBqYXZhc2NyaXB0CiAgICB0cmlnZ2VyRXZl bnQoJyNzb21lLWVsZW0taWQnLCAnYmx1cicpOwogICAgYGBgCgogICAgVGhp cyBpcyBhY3R1YWxseSB1c2VkIGludGVybmFsbHkgYnkgdGhlIGBrZXlFdmVu dGAgaGVscGVyIGxpa2Ugc286CgogICAgYGBgamF2YXNjcmlwdAogICAgdHJp Z2dlckV2ZW50KCcjc29tZS1lbGVtLWlkJywgJ2tleXByZXNzJywgeyBrZXlD b2RlOiAxMyB9KTsKICAgIGBgYAoKICAgQG1ldGhvZCB0cmlnZ2VyRXZlbnQK ICAgQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yIGpRdWVyeSBzZWxlY3RvciBm b3IgZmluZGluZyBlbGVtZW50IG9uIHRoZSBET00KICAgQHBhcmFtIHtTdHJp bmd9IHR5cGUgVGhlIGV2ZW50IHR5cGUgdG8gYmUgdHJpZ2dlcmVkLgogICBA cGFyYW0ge1N0cmluZ30gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBiZSBwYXNz ZWQgdG8galF1ZXJ5LkV2ZW50LgogICBAcmV0dXJuIHtSU1ZQLlByb21pc2V9 CiAgKi8KICBhc3luY0hlbHBlcigndHJpZ2dlckV2ZW50JywgdHJpZ2dlckV2 ZW50KTsKCgp9KSgpOwoKCgooZnVuY3Rpb24oKSB7Ci8qKgogIEVtYmVyIFRl c3RpbmcKCiAgQG1vZHVsZSBlbWJlcgogIEBzdWJtb2R1bGUgZW1iZXItdGVz dGluZwogIEByZXF1aXJlcyBlbWJlci1hcHBsaWNhdGlvbgoqLwoKfSkoKTsK CihmdW5jdGlvbigpIHsKLyoqCkVtYmVyCgpAbW9kdWxlIGVtYmVyCiovCgpm dW5jdGlvbiB0aHJvd1dpdGhNZXNzYWdlKG1zZykgewogIHJldHVybiBmdW5j dGlvbigpIHsKICAgIHRocm93IG5ldyBFbWJlci5FcnJvcihtc2cpOwogIH07 Cn0KCmZ1bmN0aW9uIGdlbmVyYXRlUmVtb3ZlZENsYXNzKGNsYXNzTmFtZSkg ewogIHZhciBtc2cgPSAiIGhhcyBiZWVuIG1vdmVkIGludG8gYSBwbHVnaW46 IGh0dHBzOi8vZ2l0aHViLmNvbS9lbWJlcmpzL2VtYmVyLXN0YXRlcyI7Cgog IHJldHVybiB7CiAgICBleHRlbmQ6IHRocm93V2l0aE1lc3NhZ2UoY2xhc3NO YW1lICsgbXNnKSwKICAgIGNyZWF0ZTogdGhyb3dXaXRoTWVzc2FnZShjbGFz c05hbWUgKyBtc2cpCiAgfTsKfQoKRW1iZXIuU3RhdGVNYW5hZ2VyID0gZ2Vu ZXJhdGVSZW1vdmVkQ2xhc3MoIkVtYmVyLlN0YXRlTWFuYWdlciIpOwoKLyoq CiAgVGhpcyB3YXMgZXhwb3J0ZWQgdG8gZW1iZXItc3RhdGVzIHBsdWdpbiBm b3IgdiAxLjAuMCByZWxlYXNlLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9l bWJlcmpzL2VtYmVyLXN0YXRlcwogIAogIEBjbGFzcyBTdGF0ZU1hbmFnZXIK ICBAbmFtZXNwYWNlIEVtYmVyCiovCgpFbWJlci5TdGF0ZSA9IGdlbmVyYXRl UmVtb3ZlZENsYXNzKCJFbWJlci5TdGF0ZSIpOwoKLyoqCiAgVGhpcyB3YXMg ZXhwb3J0ZWQgdG8gZW1iZXItc3RhdGVzIHBsdWdpbiBmb3IgdiAxLjAuMCBy ZWxlYXNlLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9lbWJlcmpzL2VtYmVy LXN0YXRlcwogIAogIEBjbGFzcyBTdGF0ZQogIEBuYW1lc3BhY2UgRW1iZXIK Ki8KCn0pKCk7CgoKfSkoKTsK http_version: recorded_at: Mon, 17 Feb 2014 11:45:40 GMT - request: method: get uri: http://builds.emberjs.com/canary/ember.min.js body: encoding: US-ASCII string: '' headers: Accept-Encoding: - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 Accept: - '*/*' User-Agent: - Ruby Host: - builds.emberjs.com response: status: code: 200 message: OK headers: X-Amz-Id-2: - N0TZYuxHAvxBvsm/c6LZLNj5SD+ywIFWNpR7xRBWiowy2yytPMGQaevI7K8aeCd4 X-Amz-Request-Id: - 426EC391D502F54A Date: - Mon, 17 Feb 2014 11:45:41 GMT Last-Modified: - Mon, 17 Feb 2014 05:31:59 GMT Etag: - '"e56ba6f819be8453ce559af4ba3b758d"' Content-Type: - text/javascript Content-Length: - '277589' Server: - AmazonS3 body: encoding: ASCII-8BIT string: !binary |- LyohCiAqIEBvdmVydmlldyAgRW1iZXIgLSBKYXZhU2NyaXB0IEFwcGxpY2F0 aW9uIEZyYW1ld29yawogKiBAY29weXJpZ2h0IENvcHlyaWdodCAyMDExLTIw MTQgVGlsZGUgSW5jLiBhbmQgY29udHJpYnV0b3JzCiAqICAgICAgICAgICAg UG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYtMjAxMSBTdHJvYmUgSW5jLgogKiAg ICAgICAgICAgIFBvcnRpb25zIENvcHlyaWdodCAyMDA4LTIwMTEgQXBwbGUg SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBAbGljZW5zZSAgIExpY2Vu c2VkIHVuZGVyIE1JVCBsaWNlbnNlCiAqICAgICAgICAgICAgU2VlIGh0dHBz Oi8vcmF3LmdpdGh1Yi5jb20vZW1iZXJqcy9lbWJlci5qcy9tYXN0ZXIvTElD RU5TRQogKiBAdmVyc2lvbiAgIDEuNi4wLWJldGEuMStjYW5hcnkuZjc5N2M2 ZDUKICovCiFmdW5jdGlvbigpe3ZhciBlLHQscixuOyFmdW5jdGlvbigpe3Zh ciBpPXt9LG89e307ZT1mdW5jdGlvbihlLHQscil7aVtlXT17ZGVwczp0LGNh bGxiYWNrOnJ9fSxuPXI9dD1mdW5jdGlvbihlKXtmdW5jdGlvbiByKHQpe2lm KCIuIiE9PXQuY2hhckF0KDApKXJldHVybiB0O2Zvcih2YXIgcj10LnNwbGl0 KCIvIiksbj1lLnNwbGl0KCIvIikuc2xpY2UoMCwtMSksaT0wLG89ci5sZW5n dGg7bz5pO2krKyl7dmFyIGE9cltpXTtpZigiLi4iPT09YSluLnBvcCgpO2Vs c2V7aWYoIi4iPT09YSljb250aW51ZTtuLnB1c2goYSl9fXJldHVybiBuLmpv aW4oIi8iKX1pZihuLl9lYWtfc2Vlbj1pLG9bZV0pcmV0dXJuIG9bZV07aWYo b1tlXT17fSwhaVtlXSl0aHJvdyBuZXcgRXJyb3IoIkNvdWxkIG5vdCBmaW5k IG1vZHVsZSAiK2UpO2Zvcih2YXIgYSxzPWlbZV0sdT1zLmRlcHMsbD1zLmNh bGxiYWNrLGM9W10saD0wLG09dS5sZW5ndGg7bT5oO2grKykiZXhwb3J0cyI9 PT11W2hdP2MucHVzaChhPXt9KTpjLnB1c2godChyKHVbaF0pKSk7dmFyIHA9 bC5hcHBseSh0aGlzLGMpO3JldHVybiBvW2VdPWF8fHB9fSgpLGZ1bmN0aW9u KCl7InVuZGVmaW5lZCI9PXR5cGVvZiBFbWJlciYmKEVtYmVyPXt9KTt7dmFy IGU9KEVtYmVyLmltcG9ydHM9RW1iZXIuaW1wb3J0c3x8dGhpcyxFbWJlci5l eHBvcnRzPUVtYmVyLmV4cG9ydHN8fHRoaXMpO0VtYmVyLmxvb2t1cD1FbWJl ci5sb29rdXB8fHRoaXN9ZS5FbT1lLkVtYmVyPUVtPUVtYmVyLEVtYmVyLmlz TmFtZXNwYWNlPSEwLEVtYmVyLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJu IkVtYmVyIn0sRW1iZXIuVkVSU0lPTj0iMS42LjAtYmV0YS4xK2NhbmFyeS5m Nzk3YzZkNSIsRW1iZXIuRU5WfHwoRW1iZXIuRU5WPSJ1bmRlZmluZWQiIT10 eXBlb2YgRW1iZXJFTlY/RW1iZXJFTlY6InVuZGVmaW5lZCIhPXR5cGVvZiBF TlY/RU5WOnt9KSxFbWJlci5jb25maWc9RW1iZXIuY29uZmlnfHx7fSwidW5k ZWZpbmVkIj09dHlwZW9mIEVtYmVyLkVOVi5ESVNBQkxFX1JBTkdFX0FQSSYm KEVtYmVyLkVOVi5ESVNBQkxFX1JBTkdFX0FQST0hMCksInVuZGVmaW5lZCI9 PXR5cGVvZiBNZXRhbW9ycGhFTlYmJihlLk1ldGFtb3JwaEVOVj17fSksTWV0 YW1vcnBoRU5WLkRJU0FCTEVfUkFOR0VfQVBJPUVtYmVyLkVOVi5ESVNBQkxF X1JBTkdFX0FQSSxFbWJlci5GRUFUVVJFUz1FbWJlci5FTlYuRkVBVFVSRVN8 fHt9LEVtYmVyLkZFQVRVUkVTLmlzRW5hYmxlZD1mdW5jdGlvbihlKXt2YXIg dD1FbWJlci5GRUFUVVJFU1tlXTtyZXR1cm4gRW1iZXIuRU5WLkVOQUJMRV9B TExfRkVBVFVSRVM/ITA6dD09PSEwfHx0PT09ITF8fHZvaWQgMD09PXQ/dDpF bWJlci5FTlYuRU5BQkxFX09QVElPTkFMX0ZFQVRVUkVTPyEwOiExfSxFbWJl ci5FWFRFTkRfUFJPVE9UWVBFUz1FbWJlci5FTlYuRVhURU5EX1BST1RPVFlQ RVMsInVuZGVmaW5lZCI9PXR5cGVvZiBFbWJlci5FWFRFTkRfUFJPVE9UWVBF UyYmKEVtYmVyLkVYVEVORF9QUk9UT1RZUEVTPSEwKSxFbWJlci5MT0dfU1RB Q0tUUkFDRV9PTl9ERVBSRUNBVElPTj1FbWJlci5FTlYuTE9HX1NUQUNLVFJB Q0VfT05fREVQUkVDQVRJT04hPT0hMSxFbWJlci5TSElNX0VTNT1FbWJlci5F TlYuU0hJTV9FUzU9PT0hMT8hMTpFbWJlci5FWFRFTkRfUFJPVE9UWVBFUyxF bWJlci5MT0dfVkVSU0lPTj1FbWJlci5FTlYuTE9HX1ZFUlNJT049PT0hMT8h MTohMCxFbWJlci5LPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LCJ1bmRlZmlu ZWQiPT10eXBlb2YgRW1iZXIuYXNzZXJ0JiYoRW1iZXIuYXNzZXJ0PUVtYmVy LkspLCJ1bmRlZmluZWQiPT10eXBlb2YgRW1iZXIud2FybiYmKEVtYmVyLndh cm49RW1iZXIuSyksInVuZGVmaW5lZCI9PXR5cGVvZiBFbWJlci5kZWJ1ZyYm KEVtYmVyLmRlYnVnPUVtYmVyLkspLCJ1bmRlZmluZWQiPT10eXBlb2YgRW1i ZXIuZGVwcmVjYXRlJiYoRW1iZXIuZGVwcmVjYXRlPUVtYmVyLkspLCJ1bmRl ZmluZWQiPT10eXBlb2YgRW1iZXIuZGVwcmVjYXRlRnVuYyYmKEVtYmVyLmRl cHJlY2F0ZUZ1bmM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdH0pLEVtYmVyLnV1 aWQ9MCxFbWJlci5tZXJnZT1mdW5jdGlvbihlLHQpe2Zvcih2YXIgciBpbiB0 KXQuaGFzT3duUHJvcGVydHkocikmJihlW3JdPXRbcl0pO3JldHVybiBlfSxF bWJlci5pc05vbmU9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PT1lfHx2b2lk IDA9PT1lfSxFbWJlci5ub25lPUVtYmVyLmRlcHJlY2F0ZUZ1bmMoIkVtYmVy Lm5vbmUgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBFbWJlci5pc05vbmUg aW5zdGVhZC4iLEVtYmVyLmlzTm9uZSksRW1iZXIuaXNFbXB0eT1mdW5jdGlv bihlKXtyZXR1cm4gRW1iZXIuaXNOb25lKGUpfHwwPT09ZS5sZW5ndGgmJiJm dW5jdGlvbiIhPXR5cGVvZiBlfHwib2JqZWN0Ij09dHlwZW9mIGUmJjA9PT1F bWJlci5nZXQoZSwibGVuZ3RoIil9LEVtYmVyLmVtcHR5PUVtYmVyLmRlcHJl Y2F0ZUZ1bmMoIkVtYmVyLmVtcHR5IGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1 c2UgRW1iZXIuaXNFbXB0eSBpbnN0ZWFkLiIsRW1iZXIuaXNFbXB0eSksRW1i ZXIuaXNCbGFuaz1mdW5jdGlvbihlKXtyZXR1cm4gRW1iZXIuaXNFbXB0eShl KXx8InN0cmluZyI9PXR5cGVvZiBlJiZudWxsPT09ZS5tYXRjaCgvXFMvKX19 KCksZnVuY3Rpb24oKXt2YXIgZT1FbWJlci5wbGF0Zm9ybT17fTtpZihFbWJl ci5jcmVhdGU9T2JqZWN0LmNyZWF0ZSxFbWJlci5jcmVhdGUmJjIhPT1FbWJl ci5jcmVhdGUoe2E6MX0se2E6e3ZhbHVlOjJ9fSkuYSYmKEVtYmVyLmNyZWF0 ZT1udWxsKSwhRW1iZXIuY3JlYXRlfHxFbWJlci5FTlYuU1RVQl9PQkpFQ1Rf Q1JFQVRFKXt2YXIgdD1mdW5jdGlvbigpe307RW1iZXIuY3JlYXRlPWZ1bmN0 aW9uKGUscil7aWYodC5wcm90b3R5cGU9ZSxlPW5ldyB0LHIpe3QucHJvdG90 eXBlPWU7Zm9yKHZhciBuIGluIHIpdC5wcm90b3R5cGVbbl09cltuXS52YWx1 ZTtlPW5ldyB0fXJldHVybiB0LnByb3RvdHlwZT1udWxsLGV9LEVtYmVyLmNy ZWF0ZS5pc1NpbXVsYXRlZD0hMH12YXIgcixuLGk9T2JqZWN0LmRlZmluZVBy b3BlcnR5O2lmKGkpdHJ5e2koe30sImEiLHtnZXQ6ZnVuY3Rpb24oKXt9fSl9 Y2F0Y2gobyl7aT1udWxsfWkmJihyPWZ1bmN0aW9uKCl7dmFyIGU9e307cmV0 dXJuIGkoZSwiYSIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdl dDpmdW5jdGlvbigpe30sc2V0OmZ1bmN0aW9uKCl7fX0pLGkoZSwiYSIse2Nv bmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVl OiEwfSksZS5hPT09ITB9KCksbj1mdW5jdGlvbigpe3RyeXtyZXR1cm4gaShk b2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwiZGVmaW5lUHJvcGVydHlP bkRPTSIse30pLCEwfWNhdGNoKGUpe31yZXR1cm4hMX0oKSxyP258fChpPWZ1 bmN0aW9uKGUsdCxyKXt2YXIgbjtyZXR1cm4gbj0ib2JqZWN0Ij09dHlwZW9m IE5vZGU/ZSBpbnN0YW5jZW9mIE5vZGU6Im9iamVjdCI9PXR5cGVvZiBlJiYi bnVtYmVyIj09dHlwZW9mIGUubm9kZVR5cGUmJiJzdHJpbmciPT10eXBlb2Yg ZS5ub2RlTmFtZSxuP2VbdF09ci52YWx1ZTpPYmplY3QuZGVmaW5lUHJvcGVy dHkoZSx0LHIpfSk6aT1udWxsKSxlLmRlZmluZVByb3BlcnR5PWksZS5oYXNQ cm9wZXJ0eUFjY2Vzc29ycz0hMCxlLmRlZmluZVByb3BlcnR5fHwoZS5oYXNQ cm9wZXJ0eUFjY2Vzc29ycz0hMSxlLmRlZmluZVByb3BlcnR5PWZ1bmN0aW9u KGUsdCxyKXtyLmdldHx8KGVbdF09ci52YWx1ZSl9LGUuZGVmaW5lUHJvcGVy dHkuaXNTaW11bGF0ZWQ9ITApLEVtYmVyLkVOVi5NQU5EQVRPUllfU0VUVEVS JiYhZS5oYXNQcm9wZXJ0eUFjY2Vzc29ycyYmKEVtYmVyLkVOVi5NQU5EQVRP UllfU0VUVEVSPSExKX0oKSxmdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKGUp e3JldHVybiBlJiZGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChl KS5pbmRleE9mKCJbbmF0aXZlIGNvZGVdIik+LTF9LHQ9ZShBcnJheS5wcm90 b3R5cGUubWFwKT9BcnJheS5wcm90b3R5cGUubWFwOmZ1bmN0aW9uKGUpe2lm KHZvaWQgMD09PXRoaXN8fG51bGw9PT10aGlzKXRocm93IG5ldyBUeXBlRXJy b3I7dmFyIHQ9T2JqZWN0KHRoaXMpLHI9dC5sZW5ndGg+Pj4wO2lmKCJmdW5j dGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3I7Zm9yKHZhciBu PW5ldyBBcnJheShyKSxpPWFyZ3VtZW50c1sxXSxvPTA7cj5vO28rKylvIGlu IHQmJihuW29dPWUuY2FsbChpLHRbb10sbyx0KSk7cmV0dXJuIG59LHI9ZShB cnJheS5wcm90b3R5cGUuZm9yRWFjaCk/QXJyYXkucHJvdG90eXBlLmZvckVh Y2g6ZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09dGhpc3x8bnVsbD09PXRoaXMp dGhyb3cgbmV3IFR5cGVFcnJvcjt2YXIgdD1PYmplY3QodGhpcykscj10Lmxl bmd0aD4+PjA7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5 cGVFcnJvcjtmb3IodmFyIG49YXJndW1lbnRzWzFdLGk9MDtyPmk7aSsrKWkg aW4gdCYmZS5jYWxsKG4sdFtpXSxpLHQpfSxuPWUoQXJyYXkucHJvdG90eXBl LmluZGV4T2YpP0FycmF5LnByb3RvdHlwZS5pbmRleE9mOmZ1bmN0aW9uKGUs dCl7bnVsbD09PXR8fHZvaWQgMD09PXQ/dD0wOjA+dCYmKHQ9TWF0aC5tYXgo MCx0aGlzLmxlbmd0aCt0KSk7Zm9yKHZhciByPXQsbj10aGlzLmxlbmd0aDtu PnI7cisrKWlmKHRoaXNbcl09PT1lKXJldHVybiByO3JldHVybi0xfSxpPWUo QXJyYXkucHJvdG90eXBlLmZpbHRlcik/QXJyYXkucHJvdG90eXBlLmZpbHRl cjpmdW5jdGlvbihlLHQpe3ZhciByLG4saT1bXSxvPXRoaXMubGVuZ3RoO2Zv cihyPTA7bz5yO3IrKyl0aGlzLmhhc093blByb3BlcnR5KHIpJiYobj10aGlz W3JdLGUuY2FsbCh0LG4scix0aGlzKSYmaS5wdXNoKG4pKTtyZXR1cm4gaX07 RW1iZXIuQXJyYXlQb2x5ZmlsbHM9e21hcDp0LGZvckVhY2g6cixmaWx0ZXI6 aSxpbmRleE9mOm59LEVtYmVyLlNISU1fRVM1JiYoQXJyYXkucHJvdG90eXBl Lm1hcHx8KEFycmF5LnByb3RvdHlwZS5tYXA9dCksQXJyYXkucHJvdG90eXBl LmZvckVhY2h8fChBcnJheS5wcm90b3R5cGUuZm9yRWFjaD1yKSxBcnJheS5w cm90b3R5cGUuZmlsdGVyfHwoQXJyYXkucHJvdG90eXBlLmZpbHRlcj1pKSxB cnJheS5wcm90b3R5cGUuaW5kZXhPZnx8KEFycmF5LnByb3RvdHlwZS5pbmRl eE9mPW4pKX0oKSxmdW5jdGlvbigpe3ZhciBlPVsiZGVzY3JpcHRpb24iLCJm aWxlTmFtZSIsImxpbmVOdW1iZXIiLCJtZXNzYWdlIiwibmFtZSIsIm51bWJl ciIsInN0YWNrIl07RW1iZXIuRXJyb3I9ZnVuY3Rpb24oKXt2YXIgdD1FcnJv ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7RXJyb3IuY2FwdHVyZVN0YWNrVHJh Y2UmJkVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsRW1iZXIuRXJyb3Ip O2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKXRoaXNbZVtyXV09dFtlW3Jd XX0sRW1iZXIuRXJyb3IucHJvdG90eXBlPUVtYmVyLmNyZWF0ZShFcnJvci5w cm90b3R5cGUpLEVtYmVyLm9uZXJyb3I9bnVsbH0oKSxmdW5jdGlvbigpe2Z1 bmN0aW9uIGUoZSl7dGhpcy5kZXNjcz17fSx0aGlzLndhdGNoaW5nPXt9LHRo aXMuY2FjaGU9e30sdGhpcy5zb3VyY2U9ZX1mdW5jdGlvbiB0KGUsdCl7cmV0 dXJuISghZXx8ImZ1bmN0aW9uIiE9dHlwZW9mIGVbdF0pfUVtYmVyLkdVSURf UFJFRklYPSJlbWJlciI7dmFyIHI9RW1iZXIucGxhdGZvcm0uZGVmaW5lUHJv cGVydHksbj1FbWJlci5jcmVhdGUsaT0iX19lbWJlciIrICtuZXcgRGF0ZSxv PVtdLGE9e30scz0wLHU9RW1iZXIuRU5WLk1BTkRBVE9SWV9TRVRURVI7RW1i ZXIuR1VJRF9LRVk9aTt2YXIgbD17d3JpdGFibGU6ITEsY29uZmlndXJhYmxl OiExLGVudW1lcmFibGU6ITEsdmFsdWU6bnVsbH07RW1iZXIuZ2VuZXJhdGVH dWlkPWZ1bmN0aW9uKGUsdCl7dHx8KHQ9RW1iZXIuR1VJRF9QUkVGSVgpO3Zh ciBuPXQrcysrO3JldHVybiBlJiYobnVsbD09PWVbaV0/ZVtpXT1uOihsLnZh bHVlPW4scihlLGksbCkpKSxufSxFbWJlci5ndWlkRm9yPWZ1bmN0aW9uKGUp e2lmKHZvaWQgMD09PWUpcmV0dXJuIih1bmRlZmluZWQpIjtpZihudWxsPT09 ZSlyZXR1cm4iKG51bGwpIjt2YXIgdCxuPXR5cGVvZiBlO3N3aXRjaChuKXtj YXNlIm51bWJlciI6cmV0dXJuIHQ9b1tlXSx0fHwodD1vW2VdPSJudSIrZSks dDtjYXNlInN0cmluZyI6cmV0dXJuIHQ9YVtlXSx0fHwodD1hW2VdPSJzdCIr cysrKSx0O2Nhc2UiYm9vbGVhbiI6cmV0dXJuIGU/Iih0cnVlKSI6IihmYWxz ZSkiO2RlZmF1bHQ6cmV0dXJuIGVbaV0/ZVtpXTplPT09T2JqZWN0PyIoT2Jq ZWN0KSI6ZT09PUFycmF5PyIoQXJyYXkpIjoodD0iZW1iZXIiK3MrKyxudWxs PT09ZVtpXT9lW2ldPXQ6KGwudmFsdWU9dCxyKGUsaSxsKSksdCl9fTt2YXIg Yz1FbWJlci5NRVRBX0RFU0M9e3dyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZToh MSxlbnVtZXJhYmxlOiExLHZhbHVlOm51bGx9LGg9RW1iZXIuR1VJRF9LRVkr Il9tZXRhIjtFbWJlci5NRVRBX0tFWT1oO3ZhciBtPUVtYmVyLnBsYXRmb3Jt LmRlZmluZVByb3BlcnR5LmlzU2ltdWxhdGVkO2UucHJvdG90eXBlPXtkZXNj czpudWxsLGRlcHM6bnVsbCx3YXRjaGluZzpudWxsLGxpc3RlbmVyczpudWxs LGNhY2hlOm51bGwsc291cmNlOm51bGwsbWl4aW5zOm51bGwsYmluZGluZ3M6 bnVsbCxjaGFpbnM6bnVsbCxjaGFpbldhdGNoZXJzOm51bGwsdmFsdWVzOm51 bGwscHJvdG86bnVsbH0sbSYmKGUucHJvdG90eXBlLl9fcHJldmVudFBsYWlu T2JqZWN0X189ITAsZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7fSk7 dmFyIHA9bmV3IGUobnVsbCk7dSYmKHAudmFsdWVzPXt9KSxFbWJlci5FTVBU WV9NRVRBPXAsRW1iZXIubWV0YT1mdW5jdGlvbih0LGkpe3ZhciBvPXRbaF07 cmV0dXJuIGk9PT0hMT9vfHxwOihvP28uc291cmNlIT09dCYmKG18fHIodCxo LGMpLG89bihvKSxvLmRlc2NzPW4oby5kZXNjcyksby53YXRjaGluZz1uKG8u d2F0Y2hpbmcpLG8uY2FjaGU9e30sby5zb3VyY2U9dCx1JiYoby52YWx1ZXM9 bihvLnZhbHVlcykpLHRbaF09byk6KG18fHIodCxoLGMpLG89bmV3IGUodCks dSYmKG8udmFsdWVzPXt9KSx0W2hdPW8sby5kZXNjcy5jb25zdHJ1Y3Rvcj1u dWxsKSxvKX0sRW1iZXIuZ2V0TWV0YT1mdW5jdGlvbihlLHQpe3ZhciByPUVt YmVyLm1ldGEoZSwhMSk7cmV0dXJuIHJbdF19LEVtYmVyLnNldE1ldGE9ZnVu Y3Rpb24oZSx0LHIpe3ZhciBuPUVtYmVyLm1ldGEoZSwhMCk7cmV0dXJuIG5b dF09cixyfSxFbWJlci5tZXRhUGF0aD1mdW5jdGlvbihlLHQscil7Zm9yKHZh ciBpLG8sYT1FbWJlci5tZXRhKGUscikscz0wLHU9dC5sZW5ndGg7dT5zO3Mr Kyl7aWYoaT10W3NdLG89YVtpXSl7aWYoby5fX2VtYmVyX3NvdXJjZV9fIT09 ZSl7aWYoIXIpcmV0dXJuIHZvaWQgMDtvPWFbaV09bihvKSxvLl9fZW1iZXJf c291cmNlX189ZX19ZWxzZXtpZighcilyZXR1cm4gdm9pZCAwO289YVtpXT17 X19lbWJlcl9zb3VyY2VfXzplfX1hPW99cmV0dXJuIG99LEVtYmVyLndyYXA9 ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiByKCl7dmFyIHIsbj10aGlzLl9fbmV4 dFN1cGVyO3JldHVybiB0aGlzLl9fbmV4dFN1cGVyPXQscj1lLmFwcGx5KHRo aXMsYXJndW1lbnRzKSx0aGlzLl9fbmV4dFN1cGVyPW4scn1yZXR1cm4gci53 cmFwcGVkRnVuY3Rpb249ZSxyLl9fZW1iZXJfb2JzZXJ2ZXNfXz1lLl9fZW1i ZXJfb2JzZXJ2ZXNfXyxyLl9fZW1iZXJfb2JzZXJ2ZXNCZWZvcmVfXz1lLl9f ZW1iZXJfb2JzZXJ2ZXNCZWZvcmVfXyxyLl9fZW1iZXJfbGlzdGVuc19fPWUu X19lbWJlcl9saXN0ZW5zX18scn0sRW1iZXIuaXNBcnJheT1mdW5jdGlvbihl KXtyZXR1cm4hZXx8ZS5zZXRJbnRlcnZhbD8hMTpBcnJheS5pc0FycmF5JiZB cnJheS5pc0FycmF5KGUpPyEwOkVtYmVyLkFycmF5JiZFbWJlci5BcnJheS5k ZXRlY3QoZSk/ITA6dm9pZCAwIT09ZS5sZW5ndGgmJiJvYmplY3QiPT10eXBl b2YgZT8hMDohMX0sRW1iZXIubWFrZUFycmF5PWZ1bmN0aW9uKGUpe3JldHVy biBudWxsPT09ZXx8dm9pZCAwPT09ZT9bXTpFbWJlci5pc0FycmF5KGUpP2U6 W2VdfSxFbWJlci5jYW5JbnZva2U9dCxFbWJlci50cnlJbnZva2U9ZnVuY3Rp b24oZSxyLG4pe3JldHVybiB0KGUscik/ZVtyXS5hcHBseShlLG58fFtdKTp2 b2lkIDB9O3ZhciBmPWZ1bmN0aW9uKCl7dmFyIGU9MDt0cnl7dHJ5e31maW5h bGx5e3Rocm93IGUrKyxuZXcgRXJyb3IoIm5lZWRzRmluYWxseUZpeFRlc3Qi KX19Y2F0Y2godCl7fXJldHVybiAxIT09ZX0oKTtFbWJlci50cnlGaW5hbGx5 PWY/ZnVuY3Rpb24oZSx0LHIpe3ZhciBuLGksbztyPXJ8fHRoaXM7dHJ5e249 ZS5jYWxsKHIpfWZpbmFsbHl7dHJ5e2k9dC5jYWxsKHIpfWNhdGNoKGEpe289 YX19aWYobyl0aHJvdyBvO3JldHVybiB2b2lkIDA9PT1pP246aX06ZnVuY3Rp b24oZSx0LHIpe3ZhciBuLGk7cj1yfHx0aGlzO3RyeXtuPWUuY2FsbChyKX1m aW5hbGx5e2k9dC5jYWxsKHIpfXJldHVybiB2b2lkIDA9PT1pP246aX0sRW1i ZXIudHJ5Q2F0Y2hGaW5hbGx5PWY/ZnVuY3Rpb24oZSx0LHIsbil7dmFyIGks byxhO249bnx8dGhpczt0cnl7aT1lLmNhbGwobil9Y2F0Y2gocyl7aT10LmNh bGwobixzKX1maW5hbGx5e3RyeXtvPXIuY2FsbChuKX1jYXRjaCh1KXthPXV9 fWlmKGEpdGhyb3cgYTtyZXR1cm4gdm9pZCAwPT09bz9pOm99OmZ1bmN0aW9u KGUsdCxyLG4pe3ZhciBpLG87bj1ufHx0aGlzO3RyeXtpPWUuY2FsbChuKX1j YXRjaChhKXtpPXQuY2FsbChuLGEpfWZpbmFsbHl7bz1yLmNhbGwobil9cmV0 dXJuIHZvaWQgMD09PW8/aTpvfTt2YXIgZD17fSxiPSJCb29sZWFuIE51bWJl ciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0Ii5z cGxpdCgiICIpO0VtYmVyLkFycmF5UG9seWZpbGxzLmZvckVhY2guY2FsbChi LGZ1bmN0aW9uKGUpe2RbIltvYmplY3QgIitlKyJdIl09ZS50b0xvd2VyQ2Fz ZSgpfSk7dmFyIEU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztFbWJlci50 eXBlT2Y9ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIHQ9bnVsbD09PWV8fHZv aWQgMD09PWU/U3RyaW5nKGUpOmRbRS5jYWxsKGUpXXx8Im9iamVjdCIsImZ1 bmN0aW9uIj09PXQ/RW1iZXIuT2JqZWN0JiZFbWJlci5PYmplY3QuZGV0ZWN0 KGUpJiYodD0iY2xhc3MiKToib2JqZWN0Ij09PXQmJihlIGluc3RhbmNlb2Yg RXJyb3I/dD0iZXJyb3IiOkVtYmVyLk9iamVjdCYmZSBpbnN0YW5jZW9mIEVt YmVyLk9iamVjdD90PSJpbnN0YW5jZSI6ZSBpbnN0YW5jZW9mIERhdGUmJih0 PSJkYXRlIikpLHR9LEVtYmVyLmluc3BlY3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9 RW1iZXIudHlwZU9mKGUpO2lmKCJhcnJheSI9PT10KXJldHVybiJbIitlKyJd IjtpZigib2JqZWN0IiE9PXQpcmV0dXJuIGUrIiI7dmFyIHIsbj1bXTtmb3Io dmFyIGkgaW4gZSlpZihlLmhhc093blByb3BlcnR5KGkpKXtpZihyPWVbaV0s InRvU3RyaW5nIj09PXIpY29udGludWU7ImZ1bmN0aW9uIj09PUVtYmVyLnR5 cGVPZihyKSYmKHI9ImZ1bmN0aW9uKCkgeyAuLi4gfSIpLG4ucHVzaChpKyI6 ICIrcil9cmV0dXJuInsiK24uam9pbigiLCAiKSsifSJ9fSgpLGZ1bmN0aW9u KCl7RW1iZXIuSW5zdHJ1bWVudGF0aW9uPXt9O3ZhciBlPVtdLHQ9e30scj1m dW5jdGlvbihyKXtmb3IodmFyIG4saT1bXSxvPTAsYT1lLmxlbmd0aDthPm87 bysrKW49ZVtvXSxuLnJlZ2V4LnRlc3QocikmJmkucHVzaChuLm9iamVjdCk7 cmV0dXJuIHRbcl09aSxpfSxuPWZ1bmN0aW9uKCl7dmFyIGU9InVuZGVmaW5l ZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93LnBlcmZvcm1hbmNlfHx7fTp7fSx0 PWUubm93fHxlLm1vek5vd3x8ZS53ZWJraXROb3d8fGUubXNOb3d8fGUub05v dztyZXR1cm4gdD90LmJpbmQoZSk6ZnVuY3Rpb24oKXtyZXR1cm4rbmV3IERh dGV9fSgpO0VtYmVyLkluc3RydW1lbnRhdGlvbi5pbnN0cnVtZW50PWZ1bmN0 aW9uKGUsaSxvLGEpe2Z1bmN0aW9uIHMoKXtmb3IoZj0wLGQ9bS5sZW5ndGg7 ZD5mO2YrKylwPW1bZl0sYltmXT1wLmJlZm9yZShlLG4oKSxpKTtyZXR1cm4g by5jYWxsKGEpfWZ1bmN0aW9uIHUoZSl7aT1pfHx7fSxpLmV4Y2VwdGlvbj1l fWZ1bmN0aW9uIGwoKXtmb3IoZj0wLGQ9bS5sZW5ndGg7ZD5mO2YrKylwPW1b Zl0scC5hZnRlcihlLG4oKSxpLGJbZl0pO0VtYmVyLlNUUlVDVFVSRURfUFJP RklMRSYmY29uc29sZS50aW1lRW5kKGMpfXZhciBjLGgsbT10W2VdO2lmKEVt YmVyLlNUUlVDVFVSRURfUFJPRklMRSYmKGM9ZSsiOiAiK2kub2JqZWN0LGNv bnNvbGUudGltZShjKSksbXx8KG09cihlKSksMD09PW0ubGVuZ3RoKXJldHVy biBoPW8uY2FsbChhKSxFbWJlci5TVFJVQ1RVUkVEX1BST0ZJTEUmJmNvbnNv bGUudGltZUVuZChjKSxoO3ZhciBwLGYsZCxiPVtdO3JldHVybiBFbWJlci50 cnlDYXRjaEZpbmFsbHkocyx1LGwpfSxFbWJlci5JbnN0cnVtZW50YXRpb24u c3Vic2NyaWJlPWZ1bmN0aW9uKHIsbil7Zm9yKHZhciBpLG89ci5zcGxpdCgi LiIpLGE9W10scz0wLHU9by5sZW5ndGg7dT5zO3MrKylpPW9bc10sIioiPT09 aT9hLnB1c2goIlteXFwuXSoiKTphLnB1c2goaSk7YT1hLmpvaW4oIlxcLiIp LGErPSIoXFwuLiopPyI7dmFyIGw9e3BhdHRlcm46cixyZWdleDpuZXcgUmVn RXhwKCJeIithKyIkIiksb2JqZWN0Om59O3JldHVybiBlLnB1c2gobCksdD17 fSxsfSxFbWJlci5JbnN0cnVtZW50YXRpb24udW5zdWJzY3JpYmU9ZnVuY3Rp b24ocil7Zm9yKHZhciBuLGk9MCxvPWUubGVuZ3RoO28+aTtpKyspZVtpXT09 PXImJihuPWkpO2Uuc3BsaWNlKG4sMSksdD17fX0sRW1iZXIuSW5zdHJ1bWVu dGF0aW9uLnJlc2V0PWZ1bmN0aW9uKCl7ZT1bXSx0PXt9fSxFbWJlci5pbnN0 cnVtZW50PUVtYmVyLkluc3RydW1lbnRhdGlvbi5pbnN0cnVtZW50LEVtYmVy LnN1YnNjcmliZT1FbWJlci5JbnN0cnVtZW50YXRpb24uc3Vic2NyaWJlfSgp LGZ1bmN0aW9uKCl7dmFyIGUsdCxyLG4saTtlPUFycmF5LnByb3RvdHlwZS5t YXB8fEVtYmVyLkFycmF5UG9seWZpbGxzLm1hcCx0PUFycmF5LnByb3RvdHlw ZS5mb3JFYWNofHxFbWJlci5BcnJheVBvbHlmaWxscy5mb3JFYWNoLHI9QXJy YXkucHJvdG90eXBlLmluZGV4T2Z8fEVtYmVyLkFycmF5UG9seWZpbGxzLmlu ZGV4T2YsaT1BcnJheS5wcm90b3R5cGUuZmlsdGVyfHxFbWJlci5BcnJheVBv bHlmaWxscy5maWx0ZXIsbj1BcnJheS5wcm90b3R5cGUuc3BsaWNlO3ZhciBv PUVtYmVyLkVudW1lcmFibGVVdGlscz17bWFwOmZ1bmN0aW9uKHQscixuKXty ZXR1cm4gdC5tYXA/dC5tYXAuY2FsbCh0LHIsbik6ZS5jYWxsKHQscixuKX0s Zm9yRWFjaDpmdW5jdGlvbihlLHIsbil7cmV0dXJuIGUuZm9yRWFjaD9lLmZv ckVhY2guY2FsbChlLHIsbik6dC5jYWxsKGUscixuKX0sZmlsdGVyOmZ1bmN0 aW9uKGUsdCxyKXtyZXR1cm4gZS5maWx0ZXI/ZS5maWx0ZXIuY2FsbChlLHQs cik6aS5jYWxsKGUsdCxyKX0saW5kZXhPZjpmdW5jdGlvbihlLHQsbil7cmV0 dXJuIGUuaW5kZXhPZj9lLmluZGV4T2YuY2FsbChlLHQsbik6ci5jYWxsKGUs dCxuKX0saW5kZXhlc09mOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09 PXQ/W106by5tYXAodCxmdW5jdGlvbih0KXtyZXR1cm4gby5pbmRleE9mKGUs dCl9KX0sYWRkT2JqZWN0OmZ1bmN0aW9uKGUsdCl7dmFyIHI9by5pbmRleE9m KGUsdCk7LTE9PT1yJiZlLnB1c2godCl9LHJlbW92ZU9iamVjdDpmdW5jdGlv bihlLHQpe3ZhciByPW8uaW5kZXhPZihlLHQpOy0xIT09ciYmZS5zcGxpY2Uo ciwxKX0sX3JlcGxhY2U6ZnVuY3Rpb24oZSx0LHIsaSl7Zm9yKHZhciBvLGEs cz1bXS5jb25jYXQoaSksdT1bXSxsPTZlNCxjPXQsaD1yO3MubGVuZ3RoOylh PWg+bD9sOmgsMD49YSYmKGE9MCksbz1zLnNwbGljZSgwLGwpLG89W2MsYV0u Y29uY2F0KG8pLGMrPWwsaC09YSx1PXUuY29uY2F0KG4uYXBwbHkoZSxvKSk7 cmV0dXJuIHV9LHJlcGxhY2U6ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIGUu cmVwbGFjZT9lLnJlcGxhY2UodCxyLG4pOm8uX3JlcGxhY2UoZSx0LHIsbil9 LGludGVyc2VjdGlvbjpmdW5jdGlvbihlLHQpe3ZhciByPVtdO3JldHVybiBv LmZvckVhY2goZSxmdW5jdGlvbihlKXtvLmluZGV4T2YodCxlKT49MCYmci5w dXNoKGUpfSkscn19fSgpLGZ1bmN0aW9uKCl7dmFyIGUsdD1FbWJlci5NRVRB X0tFWSxyPUVtYmVyLkVOVi5NQU5EQVRPUllfU0VUVEVSLG49L14oW0EtWiRd fChbMC05XVtBLVokXSkpLipbXC5cKl0vLGk9L150aGlzW1wuXCpdLyxvPS9e KFteXC5cKl0rKS87ZT1mdW5jdGlvbihlLG4pe2lmKCIiPT09bilyZXR1cm4g ZTtpZihufHwic3RyaW5nIiE9dHlwZW9mIGV8fChuPWUsZT1udWxsKSxudWxs PT09ZXx8LTEhPT1uLmluZGV4T2YoIi4iKSlyZXR1cm4gcyhlLG4pO3ZhciBp LG89ZVt0XSxhPW8mJm8uZGVzY3Nbbl07cmV0dXJuIGE/YS5nZXQoZSxuKToo aT1yJiZvJiZvLndhdGNoaW5nW25dPjA/by52YWx1ZXNbbl06ZVtuXSx2b2lk IDAhPT1pfHwib2JqZWN0IiE9dHlwZW9mIGV8fG4gaW4gZXx8ImZ1bmN0aW9u IiE9dHlwZW9mIGUudW5rbm93blByb3BlcnR5P2k6ZS51bmtub3duUHJvcGVy dHkobikpfSxFbWJlci5jb25maWcub3ZlcnJpZGVBY2Nlc3NvcnMmJihFbWJl ci5nZXQ9ZSxFbWJlci5jb25maWcub3ZlcnJpZGVBY2Nlc3NvcnMoKSxlPUVt YmVyLmdldCk7dmFyIGE9RW1iZXIubm9ybWFsaXplVHVwbGU9ZnVuY3Rpb24o dCxyKXt2YXIgYSxzPWkudGVzdChyKSx1PSFzJiZuLnRlc3Qocik7aWYoKCF0 fHx1KSYmKHQ9RW1iZXIubG9va3VwKSxzJiYocj1yLnNsaWNlKDUpKSx0PT09 RW1iZXIubG9va3VwJiYoYT1yLm1hdGNoKG8pWzBdLHQ9ZSh0LGEpLHI9ci5z bGljZShhLmxlbmd0aCsxKSksIXJ8fDA9PT1yLmxlbmd0aCl0aHJvdyBuZXcg RW1iZXIuRXJyb3IoIlBhdGggY2Fubm90IGJlIGVtcHR5Iik7cmV0dXJuW3Qs cl19LHM9RW1iZXIuX2dldFBhdGg9ZnVuY3Rpb24odCxyKXt2YXIgbixvLHMs dSxsO2lmKG51bGw9PT10JiYtMT09PXIuaW5kZXhPZigiLiIpKXJldHVybiBl KEVtYmVyLmxvb2t1cCxyKTtmb3Iobj1pLnRlc3QociksKCF0fHxuKSYmKHM9 YSh0LHIpLHQ9c1swXSxyPXNbMV0scy5sZW5ndGg9MCksbz1yLnNwbGl0KCIu IiksbD1vLmxlbmd0aCx1PTA7bnVsbCE9dCYmbD51O3UrKylpZih0PWUodCxv W3VdLCEwKSx0JiZ0LmlzRGVzdHJveWVkKXJldHVybiB2b2lkIDA7cmV0dXJu IHR9O0VtYmVyLmdldFdpdGhEZWZhdWx0PWZ1bmN0aW9uKHQscixuKXt2YXIg aT1lKHQscik7cmV0dXJuIHZvaWQgMD09PWk/bjppfSxFbWJlci5nZXQ9ZX0o KSxmdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0LHIpe2Zvcih2YXIgbj0tMSxp PWUubGVuZ3RoLTM7aT49MDtpLT0zKWlmKHQ9PT1lW2ldJiZyPT09ZVtpKzFd KXtuPWk7YnJlYWt9cmV0dXJuIG59ZnVuY3Rpb24gdChlLHQpe3ZhciByLG49 cChlLCEwKTtyZXR1cm4gbi5saXN0ZW5lcnN8fChuLmxpc3RlbmVycz17fSks bi5oYXNPd25Qcm9wZXJ0eSgibGlzdGVuZXJzIil8fChuLmxpc3RlbmVycz1t KG4ubGlzdGVuZXJzKSkscj1uLmxpc3RlbmVyc1t0XSxyJiYhbi5saXN0ZW5l cnMuaGFzT3duUHJvcGVydHkodCk/cj1uLmxpc3RlbmVyc1t0XT1uLmxpc3Rl bmVyc1t0XS5zbGljZSgpOnJ8fChyPW4ubGlzdGVuZXJzW3RdPVtdKSxyfWZ1 bmN0aW9uIHIodCxyLG4pe3ZhciBpPXRbZl0sbz1pJiZpLmxpc3RlbmVycyYm aS5saXN0ZW5lcnNbcl07aWYobylmb3IodmFyIGE9by5sZW5ndGgtMzthPj0w O2EtPTMpe3ZhciBzPW9bYV0sdT1vW2ErMV0sbD1vW2ErMl0sYz1lKG4scyx1 KTstMT09PWMmJm4ucHVzaChzLHUsbCl9fWZ1bmN0aW9uIG4odCxyLG4pe3Zh ciBpPXRbZl0sbz1pJiZpLmxpc3RlbmVycyYmaS5saXN0ZW5lcnNbcl0sYT1b XTtpZihvKXtmb3IodmFyIHM9by5sZW5ndGgtMztzPj0wO3MtPTMpe3ZhciB1 PW9bc10sbD1vW3MrMV0sYz1vW3MrMl0saD1lKG4sdSxsKTstMT09PWgmJihu LnB1c2godSxsLGMpLGEucHVzaCh1LGwsYykpfXJldHVybiBhfX1mdW5jdGlv biBpKHIsbixpLG8sYSl7b3x8ImZ1bmN0aW9uIiE9dHlwZW9mIGl8fChvPWks aT1udWxsKTt2YXIgcz10KHIsbiksdT1lKHMsaSxvKSxsPTA7YSYmKGx8PWIp LC0xPT09dSYmKHMucHVzaChpLG8sbCksImZ1bmN0aW9uIj09dHlwZW9mIHIu ZGlkQWRkTGlzdGVuZXImJnIuZGlkQWRkTGlzdGVuZXIobixpLG8pKX1mdW5j dGlvbiBvKHIsbixpLG8pe2Z1bmN0aW9uIGEoaSxvKXt2YXIgYT10KHIsbiks cz1lKGEsaSxvKTstMSE9PXMmJihhLnNwbGljZShzLDMpLCJmdW5jdGlvbiI9 PXR5cGVvZiByLmRpZFJlbW92ZUxpc3RlbmVyJiZyLmRpZFJlbW92ZUxpc3Rl bmVyKG4saSxvKSl9aWYob3x8ImZ1bmN0aW9uIiE9dHlwZW9mIGl8fChvPWks aT1udWxsKSxvKWEoaSxvKTtlbHNle3ZhciBzPXJbZl0sdT1zJiZzLmxpc3Rl bmVycyYmcy5saXN0ZW5lcnNbbl07aWYoIXUpcmV0dXJuO2Zvcih2YXIgbD11 Lmxlbmd0aC0zO2w+PTA7bC09MylhKHVbbF0sdVtsKzFdKX19ZnVuY3Rpb24g YShyLG4saSxvLGEpe2Z1bmN0aW9uIHMoKXtyZXR1cm4gYS5jYWxsKGkpfWZ1 bmN0aW9uIHUoKXstMSE9PWMmJihsW2MrMl0mPX5FKX1vfHwiZnVuY3Rpb24i IT10eXBlb2YgaXx8KG89aSxpPW51bGwpO3ZhciBsPXQocixuKSxjPWUobCxp LG8pO3JldHVybi0xIT09YyYmKGxbYysyXXw9RSksRW1iZXIudHJ5RmluYWxs eShzLHUpfWZ1bmN0aW9uIHMocixuLGksbyxhKXtmdW5jdGlvbiBzKCl7cmV0 dXJuIGEuY2FsbChpKX1mdW5jdGlvbiB1KCl7Zm9yKHZhciBlPTAsdD1wLmxl bmd0aDt0PmU7ZSsrKXt2YXIgcj1wW2VdO2ZbZV1bcisyXSY9fkV9fW98fCJm dW5jdGlvbiIhPXR5cGVvZiBpfHwobz1pLGk9bnVsbCk7dmFyIGwsYyxoLG0s cD1bXSxmPVtdO2ZvcihoPTAsbT1uLmxlbmd0aDttPmg7aCsrKXtsPW5baF0s Yz10KHIsbCk7dmFyIGQ9ZShjLGksbyk7LTEhPT1kJiYoY1tkKzJdfD1FLHAu cHVzaChkKSxmLnB1c2goYykpfXJldHVybiBFbWJlci50cnlGaW5hbGx5KHMs dSl9ZnVuY3Rpb24gdShlKXt2YXIgdD1lW2ZdLmxpc3RlbmVycyxyPVtdO2lm KHQpZm9yKHZhciBuIGluIHQpdFtuXSYmci5wdXNoKG4pO3JldHVybiByfWZ1 bmN0aW9uIGwoZSx0LHIsbil7aWYoZSE9PUVtYmVyJiYiZnVuY3Rpb24iPT10 eXBlb2YgZS5zZW5kRXZlbnQmJmUuc2VuZEV2ZW50KHQsciksIW4pe3ZhciBp PWVbZl07bj1pJiZpLmxpc3RlbmVycyYmaS5saXN0ZW5lcnNbdF19aWYobil7 Zm9yKHZhciBhPW4ubGVuZ3RoLTM7YT49MDthLT0zKXt2YXIgcz1uW2FdLHU9 blthKzFdLGw9blthKzJdO3UmJihsJkV8fChsJmImJm8oZSx0LHMsdSksc3x8 KHM9ZSksInN0cmluZyI9PXR5cGVvZiB1JiYodT1zW3VdKSxyP3UuYXBwbHko cyxyKTp1LmNhbGwocykpKX1yZXR1cm4hMH19ZnVuY3Rpb24gYyhlLHQpe3Zh ciByPWVbZl0sbj1yJiZyLmxpc3RlbmVycyYmci5saXN0ZW5lcnNbdF07cmV0 dXJuISghbnx8IW4ubGVuZ3RoKX1mdW5jdGlvbiBoKGUsdCl7dmFyIHI9W10s bj1lW2ZdLGk9biYmbi5saXN0ZW5lcnMmJm4ubGlzdGVuZXJzW3RdO2lmKCFp KXJldHVybiByO2Zvcih2YXIgbz0wLGE9aS5sZW5ndGg7YT5vO28rPTMpe3Zh ciBzPWlbb10sdT1pW28rMV07ci5wdXNoKFtzLHVdKX1yZXR1cm4gcn12YXIg bT1FbWJlci5jcmVhdGUscD1FbWJlci5tZXRhLGY9RW1iZXIuTUVUQV9LRVks ZD1bXS5zbGljZSxiPTEsRT0yO0VtYmVyLm9uPWZ1bmN0aW9uKCl7dmFyIGU9 ZC5jYWxsKGFyZ3VtZW50cywtMSlbMF0sdD1kLmNhbGwoYXJndW1lbnRzLDAs LTEpO3JldHVybiBlLl9fZW1iZXJfbGlzdGVuc19fPXQsZX0sRW1iZXIuYWRk TGlzdGVuZXI9aSxFbWJlci5yZW1vdmVMaXN0ZW5lcj1vLEVtYmVyLl9zdXNw ZW5kTGlzdGVuZXI9YSxFbWJlci5fc3VzcGVuZExpc3RlbmVycz1zLEVtYmVy LnNlbmRFdmVudD1sLEVtYmVyLmhhc0xpc3RlbmVycz1jLEVtYmVyLndhdGNo ZWRFdmVudHM9dSxFbWJlci5saXN0ZW5lcnNGb3I9aCxFbWJlci5saXN0ZW5l cnNEaWZmPW4sRW1iZXIubGlzdGVuZXJzVW5pb249cn0oKSxmdW5jdGlvbigp e3ZhciBlPUVtYmVyLmd1aWRGb3IsdD1FbWJlci5zZW5kRXZlbnQscj1FbWJl ci5fT2JzZXJ2ZXJTZXQ9ZnVuY3Rpb24oKXt0aGlzLmNsZWFyKCl9O3IucHJv dG90eXBlLmFkZD1mdW5jdGlvbih0LHIsbil7dmFyIGksbz10aGlzLm9ic2Vy dmVyU2V0LGE9dGhpcy5vYnNlcnZlcnMscz1lKHQpLHU9b1tzXTtyZXR1cm4g dXx8KG9bc109dT17fSksaT11W3JdLHZvaWQgMD09PWkmJihpPWEucHVzaCh7 c2VuZGVyOnQsa2V5TmFtZTpyLGV2ZW50TmFtZTpuLGxpc3RlbmVyczpbXX0p LTEsdVtyXT1pKSxhW2ldLmxpc3RlbmVyc30sci5wcm90b3R5cGUuZmx1c2g9 ZnVuY3Rpb24oKXt2YXIgZSxyLG4saSxvPXRoaXMub2JzZXJ2ZXJzO2Zvcih0 aGlzLmNsZWFyKCksZT0wLHI9by5sZW5ndGg7cj5lOysrZSluPW9bZV0saT1u LnNlbmRlcixpLmlzRGVzdHJveWluZ3x8aS5pc0Rlc3Ryb3llZHx8dChpLG4u ZXZlbnROYW1lLFtpLG4ua2V5TmFtZV0sbi5saXN0ZW5lcnMpfSxyLnByb3Rv dHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMub2JzZXJ2ZXJTZXQ9e30sdGhp cy5vYnNlcnZlcnM9W119fSgpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQp e3ZhciBuPWVbaF0saT1uJiZuLndhdGNoaW5nW3RdPjB8fCJsZW5ndGgiPT09 dCxhPW4mJm4ucHJvdG8scz1uJiZuLmRlc2NzW3RdO2kmJmEhPT1lJiYocyYm cy53aWxsQ2hhbmdlJiZzLndpbGxDaGFuZ2UoZSx0KSxyKGUsdCxuKSxvKGUs dCxuKSxsKGUsdCkpfWZ1bmN0aW9uIHQoZSx0KXt2YXIgcj1lW2hdLGk9ciYm ci53YXRjaGluZ1t0XT4wfHwibGVuZ3RoIj09PXQsbz1yJiZyLnByb3RvLHM9 ciYmci5kZXNjc1t0XTtvIT09ZSYmKHMmJnMuZGlkQ2hhbmdlJiZzLmRpZENo YW5nZShlLHQpLChpfHwibGVuZ3RoIj09PXQpJiYobihlLHQsciksYShlLHQs ciwhMSksYyhlLHQpKSl9ZnVuY3Rpb24gcih0LHIsbil7aWYoIXQuaXNEZXN0 cm95aW5nKXt2YXIgbz1fLGE9IW87YSYmKG89Xz17fSksaShlLHQscixvLG4p LGEmJihfPW51bGwpfX1mdW5jdGlvbiBuKGUscixuKXtpZighZS5pc0Rlc3Ry b3lpbmcpe3ZhciBvPXcsYT0hbzthJiYobz13PXt9KSxpKHQsZSxyLG8sbiks YSYmKHc9bnVsbCl9fWZ1bmN0aW9uIGkoZSx0LHIsbixpKXt2YXIgbz1tKHQp O2lmKG5bb118fChuW29dPXt9KSwhbltvXVtyXSl7bltvXVtyXT0hMDt2YXIg YT1pLmRlcHM7aWYoYT1hJiZhW3JdKWZvcih2YXIgcyBpbiBhKXt2YXIgdT1p LmRlc2NzW3NdO3UmJnUuX3N1c3BlbmRlZD09PXR8fGUodCxzKX19fWZ1bmN0 aW9uIG8odCxyLG4pe2lmKG4uaGFzT3duUHJvcGVydHkoImNoYWluV2F0Y2hl cnMiKSYmbi5jaGFpbldhdGNoZXJzW3JdKXt2YXIgaSxvLGE9bi5jaGFpbldh dGNoZXJzW3JdLHM9W107Zm9yKGk9MCxvPWEubGVuZ3RoO28+aTtpKyspYVtp XS53aWxsQ2hhbmdlKHMpO2ZvcihpPTAsbz1zLmxlbmd0aDtvPmk7aSs9Mill KHNbaV0sc1tpKzFdKX19ZnVuY3Rpb24gYShlLHIsbixpKXtpZihuJiZuLmhh c093blByb3BlcnR5KCJjaGFpbldhdGNoZXJzIikmJm4uY2hhaW5XYXRjaGVy c1tyXSl7dmFyIG8sYSxzPW4uY2hhaW5XYXRjaGVyc1tyXSx1PWk/bnVsbDpb XTtmb3Iobz0wLGE9cy5sZW5ndGg7YT5vO28rKylzW29dLmRpZENoYW5nZSh1 KTtpZighaSlmb3Iobz0wLGE9dS5sZW5ndGg7YT5vO28rPTIpdCh1W29dLHVb bysxXSl9fWZ1bmN0aW9uIHMoKXt5Kyt9ZnVuY3Rpb24gdSgpe3ktLSwwPj15 JiYodi5jbGVhcigpLGcuZmx1c2goKSl9ZnVuY3Rpb24gbChlLHQpe2lmKCFl LmlzRGVzdHJveWluZyl7dmFyIHIsbixpPXQrIjpiZWZvcmUiO3k/KHI9di5h ZGQoZSx0LGkpLG49YihlLGksciksZihlLGksW2UsdF0sbikpOmYoZSxpLFtl LHRdKX19ZnVuY3Rpb24gYyhlLHQpe2lmKCFlLmlzRGVzdHJveWluZyl7dmFy IHIsbj10KyI6Y2hhbmdlIjt5PyhyPWcuYWRkKGUsdCxuKSxkKGUsbixyKSk6 ZihlLG4sW2UsdF0pfX12YXIgaD1FbWJlci5NRVRBX0tFWSxtPUVtYmVyLmd1 aWRGb3IscD1FbWJlci50cnlGaW5hbGx5LGY9RW1iZXIuc2VuZEV2ZW50LGQ9 RW1iZXIubGlzdGVuZXJzVW5pb24sYj1FbWJlci5saXN0ZW5lcnNEaWZmLEU9 RW1iZXIuX09ic2VydmVyU2V0LHY9bmV3IEUsZz1uZXcgRSx5PTA7RW1iZXIu cHJvcGVydHlXaWxsQ2hhbmdlPWUsRW1iZXIucHJvcGVydHlEaWRDaGFuZ2U9 dDt2YXIgXyx3O0VtYmVyLm92ZXJyaWRlQ2hhaW5zPWZ1bmN0aW9uKGUsdCxy KXthKGUsdCxyLCEwKX0sRW1iZXIuYmVnaW5Qcm9wZXJ0eUNoYW5nZXM9cyxF bWJlci5lbmRQcm9wZXJ0eUNoYW5nZXM9dSxFbWJlci5jaGFuZ2VQcm9wZXJ0 aWVzPWZ1bmN0aW9uKGUsdCl7cygpLHAoZSx1LHQpfX0oKSxmdW5jdGlvbigp e2Z1bmN0aW9uIGUoZSx0LHIsbyl7dmFyIGE7aWYoYT10LnNsaWNlKHQubGFz dEluZGV4T2YoIi4iKSsxKSx0PXQ9PT1hP2E6dC5zbGljZSgwLHQubGVuZ3Ro LShhLmxlbmd0aCsxKSksInRoaXMiIT09dCYmKGU9bihlLHQpKSwhYXx8MD09 PWEubGVuZ3RoKXRocm93IG5ldyBFbWJlci5FcnJvcigiUHJvcGVydHkgc2V0 IGZhaWxlZDogWW91IHBhc3NlZCBhbiBlbXB0eSBwYXRoIik7aWYoIWUpe2lm KG8pcmV0dXJuO3Rocm93IG5ldyBFbWJlci5FcnJvcignUHJvcGVydHkgc2V0 IGZhaWxlZDogb2JqZWN0IGluIHBhdGggIicrdCsnIiBjb3VsZCBub3QgYmUg Zm91bmQgb3Igd2FzIGRlc3Ryb3llZC4nKX1yZXR1cm4gaShlLGEscil9dmFy IHQ9RW1iZXIuTUVUQV9LRVkscj1FbWJlci5FTlYuTUFOREFUT1JZX1NFVFRF UixuPUVtYmVyLl9nZXRQYXRoLGk9ZnVuY3Rpb24obixpLG8sYSl7aWYoInN0 cmluZyI9PXR5cGVvZiBuJiYobz1pLGk9bixuPW51bGwpLCFufHwtMSE9PWku aW5kZXhPZigiLiIpKXJldHVybiBlKG4saSxvLGEpO3ZhciBzLHUsbD1uW3Rd LGM9bCYmbC5kZXNjc1tpXTtyZXR1cm4gYz9jLnNldChuLGksbyk6KHM9Im9i amVjdCI9PXR5cGVvZiBuJiYhKGkgaW4gbikscyYmImZ1bmN0aW9uIj09dHlw ZW9mIG4uc2V0VW5rbm93blByb3BlcnR5P24uc2V0VW5rbm93blByb3BlcnR5 KGksbyk6bCYmbC53YXRjaGluZ1tpXT4wPyh1PXI/bC52YWx1ZXNbaV06bltp XSxvIT09dSYmKEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZShuLGkpLHI/KHZv aWQgMCE9PXV8fGkgaW4gbikmJm4ucHJvcGVydHlJc0VudW1lcmFibGUoaSk/ bC52YWx1ZXNbaV09bzpFbWJlci5kZWZpbmVQcm9wZXJ0eShuLGksbnVsbCxv KTpuW2ldPW8sRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UobixpKSkpOm5baV09 byksb307RW1iZXIuY29uZmlnLm92ZXJyaWRlQWNjZXNzb3JzJiYoRW1iZXIu c2V0PWksRW1iZXIuY29uZmlnLm92ZXJyaWRlQWNjZXNzb3JzKCksaT1FbWJl ci5zZXQpLEVtYmVyLnNldD1pLEVtYmVyLnRyeVNldD1mdW5jdGlvbihlLHQs cil7cmV0dXJuIGkoZSx0LHIsITApfX0oKSxmdW5jdGlvbigpe3ZhciBlPUVt YmVyLnNldCx0PUVtYmVyLmd1aWRGb3Iscj1FbWJlci5BcnJheVBvbHlmaWxs cy5pbmRleE9mLG49ZnVuY3Rpb24oZSl7dmFyIHQ9e307Zm9yKHZhciByIGlu IGUpZS5oYXNPd25Qcm9wZXJ0eShyKSYmKHRbcl09ZVtyXSk7cmV0dXJuIHR9 LGk9ZnVuY3Rpb24oZSx0KXt2YXIgcj1lLmtleXMuY29weSgpLGk9bihlLnZh bHVlcyk7cmV0dXJuIHQua2V5cz1yLHQudmFsdWVzPWksdC5sZW5ndGg9ZS5s ZW5ndGgsdH0sbz1FbWJlci5PcmRlcmVkU2V0PWZ1bmN0aW9uKCl7dGhpcy5j bGVhcigpfTtvLmNyZWF0ZT1mdW5jdGlvbigpe3JldHVybiBuZXcgb30sby5w cm90b3R5cGU9e2NsZWFyOmZ1bmN0aW9uKCl7dGhpcy5wcmVzZW5jZVNldD17 fSx0aGlzLmxpc3Q9W119LGFkZDpmdW5jdGlvbihlKXt2YXIgcj10KGUpLG49 dGhpcy5wcmVzZW5jZVNldCxpPXRoaXMubGlzdDtyIGluIG58fChuW3JdPSEw LGkucHVzaChlKSl9LHJlbW92ZTpmdW5jdGlvbihlKXt2YXIgbj10KGUpLGk9 dGhpcy5wcmVzZW5jZVNldCxvPXRoaXMubGlzdDtkZWxldGUgaVtuXTt2YXIg YT1yLmNhbGwobyxlKTthPi0xJiZvLnNwbGljZShhLDEpfSxpc0VtcHR5OmZ1 bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLmxpc3QubGVuZ3RofSxoYXM6ZnVu Y3Rpb24oZSl7dmFyIHI9dChlKSxuPXRoaXMucHJlc2VuY2VTZXQ7cmV0dXJu IHIgaW4gbn0sZm9yRWFjaDpmdW5jdGlvbihlLHQpe2Zvcih2YXIgcj10aGlz LnRvQXJyYXkoKSxuPTAsaT1yLmxlbmd0aDtpPm47bisrKWUuY2FsbCh0LHJb bl0pfSx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGlzdC5zbGlj ZSgpfSxjb3B5OmZ1bmN0aW9uKCl7dmFyIGU9bmV3IG87cmV0dXJuIGUucHJl c2VuY2VTZXQ9bih0aGlzLnByZXNlbmNlU2V0KSxlLmxpc3Q9dGhpcy50b0Fy cmF5KCksZX19O3ZhciBhPUVtYmVyLk1hcD1mdW5jdGlvbigpe3RoaXMua2V5 cz1FbWJlci5PcmRlcmVkU2V0LmNyZWF0ZSgpLHRoaXMudmFsdWVzPXt9fTth LmNyZWF0ZT1mdW5jdGlvbigpe3JldHVybiBuZXcgYX0sYS5wcm90b3R5cGU9 e2xlbmd0aDowLGdldDpmdW5jdGlvbihlKXt2YXIgcj10aGlzLnZhbHVlcyxu PXQoZSk7cmV0dXJuIHJbbl19LHNldDpmdW5jdGlvbihyLG4pe3ZhciBpPXRo aXMua2V5cyxvPXRoaXMudmFsdWVzLGE9dChyKTtpLmFkZChyKSxvW2FdPW4s ZSh0aGlzLCJsZW5ndGgiLGkubGlzdC5sZW5ndGgpfSxyZW1vdmU6ZnVuY3Rp b24ocil7dmFyIG49dGhpcy5rZXlzLGk9dGhpcy52YWx1ZXMsbz10KHIpO3Jl dHVybiBpLmhhc093blByb3BlcnR5KG8pPyhuLnJlbW92ZShyKSxkZWxldGUg aVtvXSxlKHRoaXMsImxlbmd0aCIsbi5saXN0Lmxlbmd0aCksITApOiExfSxo YXM6ZnVuY3Rpb24oZSl7dmFyIHI9dGhpcy52YWx1ZXMsbj10KGUpO3JldHVy biByLmhhc093blByb3BlcnR5KG4pfSxmb3JFYWNoOmZ1bmN0aW9uKGUscil7 dmFyIG49dGhpcy5rZXlzLGk9dGhpcy52YWx1ZXM7bi5mb3JFYWNoKGZ1bmN0 aW9uKG4pe3ZhciBvPXQobik7ZS5jYWxsKHIsbixpW29dKX0pfSxjb3B5OmZ1 bmN0aW9uKCl7cmV0dXJuIGkodGhpcyxuZXcgYSl9fTt2YXIgcz1FbWJlci5N YXBXaXRoRGVmYXVsdD1mdW5jdGlvbihlKXthLmNhbGwodGhpcyksdGhpcy5k ZWZhdWx0VmFsdWU9ZS5kZWZhdWx0VmFsdWV9O3MuY3JlYXRlPWZ1bmN0aW9u KGUpe3JldHVybiBlP25ldyBzKGUpOm5ldyBhfSxzLnByb3RvdHlwZT1FbWJl ci5jcmVhdGUoYS5wcm90b3R5cGUpLHMucHJvdG90eXBlLmdldD1mdW5jdGlv bihlKXt2YXIgdD10aGlzLmhhcyhlKTtpZih0KXJldHVybiBhLnByb3RvdHlw ZS5nZXQuY2FsbCh0aGlzLGUpO3ZhciByPXRoaXMuZGVmYXVsdFZhbHVlKGUp O3JldHVybiB0aGlzLnNldChlLHIpLHJ9LHMucHJvdG90eXBlLmNvcHk9ZnVu Y3Rpb24oKXtyZXR1cm4gaSh0aGlzLG5ldyBzKHtkZWZhdWx0VmFsdWU6dGhp cy5kZWZhdWx0VmFsdWV9KSl9fSgpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShl KXt2YXIgdCxyO0VtYmVyLmltcG9ydHMuY29uc29sZT90PUVtYmVyLmltcG9y dHMuY29uc29sZToidW5kZWZpbmVkIiE9dHlwZW9mIGNvbnNvbGUmJih0PWNv bnNvbGUpO3ZhciBuPSJvYmplY3QiPT10eXBlb2YgdD90W2VdOm51bGw7cmV0 dXJuIG4/ImZ1bmN0aW9uIj09dHlwZW9mIG4uYXBwbHk/KHI9ZnVuY3Rpb24o KXtuLmFwcGx5KHQsYXJndW1lbnRzKX0sci5kaXNwbGF5TmFtZT0iY29uc29s ZS4iK2Uscik6ZnVuY3Rpb24oKXt2YXIgZT1BcnJheS5wcm90b3R5cGUuam9p bi5jYWxsKGFyZ3VtZW50cywiLCAiKTtuKGUpfTp2b2lkIDB9ZnVuY3Rpb24g dChlLHQpe2lmKCFlKXRyeXt0aHJvdyBuZXcgRW1iZXIuRXJyb3IoImFzc2Vy dGlvbiBmYWlsZWQ6ICIrdCl9Y2F0Y2gocil7c2V0VGltZW91dChmdW5jdGlv bigpe3Rocm93IHJ9LDApfX1FbWJlci5Mb2dnZXI9e2xvZzplKCJsb2ciKXx8 RW1iZXIuSyx3YXJuOmUoIndhcm4iKXx8RW1iZXIuSyxlcnJvcjplKCJlcnJv ciIpfHxFbWJlci5LLGluZm86ZSgiaW5mbyIpfHxFbWJlci5LLGRlYnVnOmUo ImRlYnVnIil8fGUoImluZm8iKXx8RW1iZXIuSyxhc3NlcnQ6ZSgiYXNzZXJ0 Iil8fHR9fSgpLGZ1bmN0aW9uKCl7dmFyIGU9RW1iZXIuTUVUQV9LRVksdD1F bWJlci5tZXRhLHI9RW1iZXIucGxhdGZvcm0uZGVmaW5lUHJvcGVydHksbj1F bWJlci5FTlYuTUFOREFUT1JZX1NFVFRFUjtFbWJlci5EZXNjcmlwdG9yPWZ1 bmN0aW9uKCl7fTt2YXIgaT1FbWJlci5NQU5EQVRPUllfU0VUVEVSX0ZVTkNU SU9OPWZ1bmN0aW9uKCl7fSxvPUVtYmVyLkRFRkFVTFRfR0VUVEVSX0ZVTkNU SU9OPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciByPXRoaXNb ZV07cmV0dXJuIHImJnIudmFsdWVzW3RdfX07aWYoRW1iZXIuZGVmaW5lUHJv cGVydHk9ZnVuY3Rpb24oZSxzLHUsbCxjKXt2YXIgaCxtLHAsZjtyZXR1cm4g Y3x8KGM9dChlKSksaD1jLmRlc2NzLG09Yy5kZXNjc1tzXSxwPWMud2F0Y2hp bmdbc10+MCxtIGluc3RhbmNlb2YgRW1iZXIuRGVzY3JpcHRvciYmbS50ZWFy ZG93bihlLHMpLHUgaW5zdGFuY2VvZiBFbWJlci5EZXNjcmlwdG9yPyhmPXUs aFtzXT11LG4mJnA/cihlLHMse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxl OiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pOmVbc109dm9pZCAwLEVt YmVyLkZFQVRVUkVTLmlzRW5hYmxlZCgiY29tcG9zYWJsZS1jb21wdXRlZC1w cm9wZXJ0aWVzIikmJnUuZnVuYyYmdS5fZGVwZW5kZW50Q1BzJiZhKGUsdS5f ZGVwZW5kZW50Q1BzLGMpKTooaFtzXT12b2lkIDAsbnVsbD09dT8oZj1sLG4m JnA/KGMudmFsdWVzW3NdPWwscihlLHMse2NvbmZpZ3VyYWJsZTohMCxlbnVt ZXJhYmxlOiEwLHNldDppLGdldDpvKHMpfSkpOmVbc109bCk6KGY9dSxyKGUs cyx1KSkpLHAmJkVtYmVyLm92ZXJyaWRlQ2hhaW5zKGUscyxjKSxlLmRpZERl ZmluZVByb3BlcnR5JiZlLmRpZERlZmluZVByb3BlcnR5KGUscyxmKSx0aGlz fSxFbWJlci5GRUFUVVJFUy5pc0VuYWJsZWQoImNvbXBvc2FibGUtY29tcHV0 ZWQtcHJvcGVydGllcyIpKXZhciBhPWZ1bmN0aW9uKGUsdCxyKXtmb3IodmFy IG4saSxvPXQubGVuZ3RoLHM9MDtvPnM7KytzKW49dFtzXSxpPW4uaW1wbGlj aXRDUEtleSxFbWJlci5kZWZpbmVQcm9wZXJ0eShlLGksbix2b2lkIDAsciks bi5fZGVwZW5kZW50Q1BzJiZhKGUsbi5fZGVwZW5kZW50Q1BzLHIpfX0oKSxm dW5jdGlvbigpe3ZhciBlPUVtYmVyLmdldDtFbWJlci5nZXRQcm9wZXJ0aWVz PWZ1bmN0aW9uKHQpe3ZhciByPXt9LG49YXJndW1lbnRzLGk9MTsyPT09YXJn dW1lbnRzLmxlbmd0aCYmImFycmF5Ij09PUVtYmVyLnR5cGVPZihhcmd1bWVu dHNbMV0pJiYoaT0wLG49YXJndW1lbnRzWzFdKTtmb3IodmFyIG89bi5sZW5n dGg7bz5pO2krKylyW25baV1dPWUodCxuW2ldKTtyZXR1cm4gcn19KCksZnVu Y3Rpb24oKXt2YXIgZT1FbWJlci5jaGFuZ2VQcm9wZXJ0aWVzLHQ9RW1iZXIu c2V0O0VtYmVyLnNldFByb3BlcnRpZXM9ZnVuY3Rpb24ocixuKXtyZXR1cm4g ZShmdW5jdGlvbigpe2Zvcih2YXIgZSBpbiBuKW4uaGFzT3duUHJvcGVydHko ZSkmJnQocixlLG5bZV0pfSkscn19KCksZnVuY3Rpb24oKXt2YXIgZT1FbWJl ci5tZXRhLHQ9RW1iZXIudHlwZU9mLHI9RW1iZXIuRU5WLk1BTkRBVE9SWV9T RVRURVIsbj1FbWJlci5wbGF0Zm9ybS5kZWZpbmVQcm9wZXJ0eTtFbWJlci53 YXRjaEtleT1mdW5jdGlvbihpLG8sYSl7aWYoImxlbmd0aCIhPT1vfHwiYXJy YXkiIT09dChpKSl7dmFyIHM9YXx8ZShpKSx1PXMud2F0Y2hpbmc7dVtvXT91 W29dPSh1W29dfHwwKSsxOih1W29dPTEsImZ1bmN0aW9uIj09dHlwZW9mIGku d2lsbFdhdGNoUHJvcGVydHkmJmkud2lsbFdhdGNoUHJvcGVydHkobyksciYm byBpbiBpJiYocy52YWx1ZXNbb109aVtvXSxuKGksbyx7Y29uZmlndXJhYmxl OiEwLGVudW1lcmFibGU6aS5wcm9wZXJ0eUlzRW51bWVyYWJsZShvKSxzZXQ6 RW1iZXIuTUFOREFUT1JZX1NFVFRFUl9GVU5DVElPTixnZXQ6RW1iZXIuREVG QVVMVF9HRVRURVJfRlVOQ1RJT04obyl9KSkpfX0sRW1iZXIudW53YXRjaEtl eT1mdW5jdGlvbih0LGksbyl7dmFyIGE9b3x8ZSh0KSxzPWEud2F0Y2hpbmc7 MT09PXNbaV0/KHNbaV09MCwiZnVuY3Rpb24iPT10eXBlb2YgdC5kaWRVbndh dGNoUHJvcGVydHkmJnQuZGlkVW53YXRjaFByb3BlcnR5KGkpLHImJmkgaW4g dCYmbih0LGkse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOnQucHJvcGVy dHlJc0VudW1lcmFibGUoaSksc2V0OmZ1bmN0aW9uKGUpe24odCxpLHtjb25m aWd1cmFibGU6ITAsd3JpdGFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpl fSksZGVsZXRlIGEudmFsdWVzW2ldfSxnZXQ6RW1iZXIuREVGQVVMVF9HRVRU RVJfRlVOQ1RJT04oaSl9KSk6c1tpXT4xJiZzW2ldLS19fSgpLGZ1bmN0aW9u KCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gZS5tYXRjaChjKVswXX1mdW5jdGlv biB0KGUsdCxyKXtpZihlJiYib2JqZWN0Ij09dHlwZW9mIGUpe3ZhciBpPW4o ZSksbz1pLmNoYWluV2F0Y2hlcnM7aS5oYXNPd25Qcm9wZXJ0eSgiY2hhaW5X YXRjaGVycyIpfHwobz1pLmNoYWluV2F0Y2hlcnM9e30pLG9bdF18fChvW3Rd PVtdKSxvW3RdLnB1c2gociksdShlLHQsaSl9fWZ1bmN0aW9uIHIoZSx0KXtp ZighZSlyZXR1cm4gdm9pZCAwO3ZhciByPWVbaF07aWYociYmci5wcm90bz09 PWUpcmV0dXJuIHZvaWQgMDtpZigiQGVhY2giPT09dClyZXR1cm4gaShlLHQp O3ZhciBuPXImJnIuZGVzY3NbdF07cmV0dXJuIG4mJm4uX2NhY2hlYWJsZT90 IGluIHIuY2FjaGU/ci5jYWNoZVt0XTp2b2lkIDA6aShlLHQpfXZhciBuPUVt YmVyLm1ldGEsaT1FbWJlci5nZXQsbz1FbWJlci5ub3JtYWxpemVUdXBsZSxh PUVtYmVyLkFycmF5UG9seWZpbGxzLmZvckVhY2gscz1FbWJlci53YXJuLHU9 RW1iZXIud2F0Y2hLZXksbD1FbWJlci51bndhdGNoS2V5LGM9L14oW15cLlwq XSspLyxoPUVtYmVyLk1FVEFfS0VZLG09W107RW1iZXIuZmx1c2hQZW5kaW5n Q2hhaW5zPWZ1bmN0aW9uKCl7aWYoMCE9PW0ubGVuZ3RoKXt2YXIgZT1tO209 W10sYS5jYWxsKGUsZnVuY3Rpb24oZSl7ZVswXS5hZGQoZVsxXSl9KSxzKCJX YXRjaGluZyBhbiB1bmRlZmluZWQgZ2xvYmFsLCBFbWJlciBleHBlY3RzIHdh dGNoZWQgZ2xvYmFscyB0byBiZSBzZXR1cCBieSB0aGUgdGltZSB0aGUgcnVu IGxvb3AgaXMgZmx1c2hlZCwgY2hlY2sgZm9yIHR5cG9zIiwwPT09bS5sZW5n dGgpfX07dmFyIHA9RW1iZXIucmVtb3ZlQ2hhaW5XYXRjaGVyPWZ1bmN0aW9u KGUsdCxyKXtpZihlJiYib2JqZWN0Ij09dHlwZW9mIGUpe3ZhciBuPWVbaF07 aWYoIW58fG4uaGFzT3duUHJvcGVydHkoImNoYWluV2F0Y2hlcnMiKSl7dmFy IGk9biYmbi5jaGFpbldhdGNoZXJzO2lmKGkmJmlbdF0pe2k9aVt0XTtmb3Io dmFyIG89MCxhPWkubGVuZ3RoO2E+bztvKyspaVtvXT09PXImJmkuc3BsaWNl KG8sMSl9bChlLHQsbil9fX0sZj1FbWJlci5fQ2hhaW5Ob2RlPWZ1bmN0aW9u KGUscixuKXt0aGlzLl9wYXJlbnQ9ZSx0aGlzLl9rZXk9cix0aGlzLl93YXRj aGluZz12b2lkIDA9PT1uLHRoaXMuX3ZhbHVlPW4sdGhpcy5fcGF0aHM9e30s dGhpcy5fd2F0Y2hpbmcmJih0aGlzLl9vYmplY3Q9ZS52YWx1ZSgpLHRoaXMu X29iamVjdCYmdCh0aGlzLl9vYmplY3QsdGhpcy5fa2V5LHRoaXMpKSx0aGlz Ll9wYXJlbnQmJiJAZWFjaCI9PT10aGlzLl9wYXJlbnQuX2tleSYmdGhpcy52 YWx1ZSgpfSxkPWYucHJvdG90eXBlO2QudmFsdWU9ZnVuY3Rpb24oKXtpZih2 b2lkIDA9PT10aGlzLl92YWx1ZSYmdGhpcy5fd2F0Y2hpbmcpe3ZhciBlPXRo aXMuX3BhcmVudC52YWx1ZSgpO3RoaXMuX3ZhbHVlPXIoZSx0aGlzLl9rZXkp fXJldHVybiB0aGlzLl92YWx1ZX0sZC5kZXN0cm95PWZ1bmN0aW9uKCl7aWYo dGhpcy5fd2F0Y2hpbmcpe3ZhciBlPXRoaXMuX29iamVjdDtlJiZwKGUsdGhp cy5fa2V5LHRoaXMpLHRoaXMuX3dhdGNoaW5nPSExfX0sZC5jb3B5PWZ1bmN0 aW9uKGUpe3ZhciB0LHI9bmV3IGYobnVsbCxudWxsLGUpLG49dGhpcy5fcGF0 aHM7Zm9yKHQgaW4gbiluW3RdPD0wfHxyLmFkZCh0KTtyZXR1cm4gcn0sZC5h ZGQ9ZnVuY3Rpb24odCl7dmFyIHIsbixpLGEscztpZihzPXRoaXMuX3BhdGhz LHNbdF09KHNbdF18fDApKzEscj10aGlzLnZhbHVlKCksbj1vKHIsdCksblsw XSYmblswXT09PXIpdD1uWzFdLGk9ZSh0KSx0PXQuc2xpY2UoaS5sZW5ndGgr MSk7ZWxzZXtpZighblswXSlyZXR1cm4gbS5wdXNoKFt0aGlzLHRdKSxuLmxl bmd0aD0wLHZvaWQgMDthPW5bMF0saT10LnNsaWNlKDAsMC0oblsxXS5sZW5n dGgrMSkpLHQ9blsxXX1uLmxlbmd0aD0wLHRoaXMuY2hhaW4oaSx0LGEpfSxk LnJlbW92ZT1mdW5jdGlvbih0KXt2YXIgcixuLGksYSxzO3M9dGhpcy5fcGF0 aHMsc1t0XT4wJiZzW3RdLS0scj10aGlzLnZhbHVlKCksbj1vKHIsdCksblsw XT09PXI/KHQ9blsxXSxpPWUodCksdD10LnNsaWNlKGkubGVuZ3RoKzEpKToo YT1uWzBdLGk9dC5zbGljZSgwLDAtKG5bMV0ubGVuZ3RoKzEpKSx0PW5bMV0p LG4ubGVuZ3RoPTAsdGhpcy51bmNoYWluKGksdCl9LGQuY291bnQ9MCxkLmNo YWluPWZ1bmN0aW9uKHQscixuKXt2YXIgaSxvPXRoaXMuX2NoYWlucztvfHwo bz10aGlzLl9jaGFpbnM9e30pLGk9b1t0XSxpfHwoaT1vW3RdPW5ldyBmKHRo aXMsdCxuKSksaS5jb3VudCsrLHImJnIubGVuZ3RoPjAmJih0PWUocikscj1y LnNsaWNlKHQubGVuZ3RoKzEpLGkuY2hhaW4odCxyKSl9LGQudW5jaGFpbj1m dW5jdGlvbih0LHIpe3ZhciBuPXRoaXMuX2NoYWlucyxpPW5bdF07ciYmci5s ZW5ndGg+MSYmKHQ9ZShyKSxyPXIuc2xpY2UodC5sZW5ndGgrMSksaS51bmNo YWluKHQscikpLGkuY291bnQtLSxpLmNvdW50PD0wJiYoZGVsZXRlIG5baS5f a2V5XSxpLmRlc3Ryb3koKSl9LGQud2lsbENoYW5nZT1mdW5jdGlvbihlKXt2 YXIgdD10aGlzLl9jaGFpbnM7aWYodClmb3IodmFyIHIgaW4gdCl0Lmhhc093 blByb3BlcnR5KHIpJiZ0W3JdLndpbGxDaGFuZ2UoZSk7dGhpcy5fcGFyZW50 JiZ0aGlzLl9wYXJlbnQuY2hhaW5XaWxsQ2hhbmdlKHRoaXMsdGhpcy5fa2V5 LDEsZSl9LGQuY2hhaW5XaWxsQ2hhbmdlPWZ1bmN0aW9uKGUsdCxyLG4pe3Ro aXMuX2tleSYmKHQ9dGhpcy5fa2V5KyIuIit0KSx0aGlzLl9wYXJlbnQ/dGhp cy5fcGFyZW50LmNoYWluV2lsbENoYW5nZSh0aGlzLHQscisxLG4pOihyPjEm Jm4ucHVzaCh0aGlzLnZhbHVlKCksdCksdD0idGhpcy4iK3QsdGhpcy5fcGF0 aHNbdF0+MCYmbi5wdXNoKHRoaXMudmFsdWUoKSx0KSl9LGQuY2hhaW5EaWRD aGFuZ2U9ZnVuY3Rpb24oZSx0LHIsbil7dGhpcy5fa2V5JiYodD10aGlzLl9r ZXkrIi4iK3QpLHRoaXMuX3BhcmVudD90aGlzLl9wYXJlbnQuY2hhaW5EaWRD aGFuZ2UodGhpcyx0LHIrMSxuKToocj4xJiZuLnB1c2godGhpcy52YWx1ZSgp LHQpLHQ9InRoaXMuIit0LHRoaXMuX3BhdGhzW3RdPjAmJm4ucHVzaCh0aGlz LnZhbHVlKCksdCkpfSxkLmRpZENoYW5nZT1mdW5jdGlvbihlKXtpZih0aGlz Ll93YXRjaGluZyl7dmFyIHI9dGhpcy5fcGFyZW50LnZhbHVlKCk7ciE9PXRo aXMuX29iamVjdCYmKHAodGhpcy5fb2JqZWN0LHRoaXMuX2tleSx0aGlzKSx0 aGlzLl9vYmplY3Q9cix0KHIsdGhpcy5fa2V5LHRoaXMpKSx0aGlzLl92YWx1 ZT12b2lkIDAsdGhpcy5fcGFyZW50JiYiQGVhY2giPT09dGhpcy5fcGFyZW50 Ll9rZXkmJnRoaXMudmFsdWUoKX12YXIgbj10aGlzLl9jaGFpbnM7aWYobilm b3IodmFyIGkgaW4gbiluLmhhc093blByb3BlcnR5KGkpJiZuW2ldLmRpZENo YW5nZShlKTtudWxsIT09ZSYmdGhpcy5fcGFyZW50JiZ0aGlzLl9wYXJlbnQu Y2hhaW5EaWRDaGFuZ2UodGhpcyx0aGlzLl9rZXksMSxlKX0sRW1iZXIuZmlu aXNoQ2hhaW5zPWZ1bmN0aW9uKGUpe3ZhciB0PWVbaF0scj10JiZ0LmNoYWlu cztyJiYoci52YWx1ZSgpIT09ZT9uKGUpLmNoYWlucz1yPXIuY29weShlKTpy LmRpZENoYW5nZShudWxsKSl9fSgpLGZ1bmN0aW9uKCl7dmFyIGU9RW1iZXIu RW51bWVyYWJsZVV0aWxzLmZvckVhY2gsdD0vXigoPzpbXlwuXSpcLikqKVx7 KC4qKVx9JC87RW1iZXIuZXhwYW5kUHJvcGVydGllcz1mdW5jdGlvbihyLG4p e3ZhciBpLG8sYTsoaT10LmV4ZWMocikpPyhvPWlbMV0sYT1pWzJdLGUoYS5z cGxpdCgiLCIpLGZ1bmN0aW9uKGUpe24obytlKX0pKTpuKHIpfX0oKSxmdW5j dGlvbigpe2Z1bmN0aW9uIGUoZSxyKXt2YXIgaT1yfHx0KGUpLG89aS5jaGFp bnM7cmV0dXJuIG8/by52YWx1ZSgpIT09ZSYmKG89aS5jaGFpbnM9by5jb3B5 KGUpKTpvPWkuY2hhaW5zPW5ldyBuKG51bGwsbnVsbCxlKSxvfXZhciB0PUVt YmVyLm1ldGEscj1FbWJlci50eXBlT2Ysbj1FbWJlci5fQ2hhaW5Ob2RlO0Vt YmVyLndhdGNoUGF0aD1mdW5jdGlvbihuLGksbyl7aWYoImxlbmd0aCIhPT1p fHwiYXJyYXkiIT09cihuKSl7dmFyIGE9b3x8dChuKSxzPWEud2F0Y2hpbmc7 c1tpXT9zW2ldPShzW2ldfHwwKSsxOihzW2ldPTEsZShuLGEpLmFkZChpKSl9 fSxFbWJlci51bndhdGNoUGF0aD1mdW5jdGlvbihyLG4saSl7dmFyIG89aXx8 dChyKSxhPW8ud2F0Y2hpbmc7MT09PWFbbl0/KGFbbl09MCxlKHIsbykucmVt b3ZlKG4pKTphW25dPjEmJmFbbl0tLX19KCksZnVuY3Rpb24oKXtmdW5jdGlv biBlKGUpe3JldHVybiIqIj09PWV8fCFjLnRlc3QoZSl9dmFyIHQ9KEVtYmVy Lm1ldGEsRW1iZXIuR1VJRF9LRVkpLHI9RW1iZXIuTUVUQV9LRVksbj1FbWJl ci5yZW1vdmVDaGFpbldhdGNoZXIsaT1FbWJlci53YXRjaEtleSxvPUVtYmVy LnVud2F0Y2hLZXksYT1FbWJlci53YXRjaFBhdGgscz1FbWJlci51bndhdGNo UGF0aCx1PUVtYmVyLnR5cGVPZixsPUVtYmVyLmdlbmVyYXRlR3VpZCxjPS9b XC5cKl0vO0VtYmVyLndhdGNoPWZ1bmN0aW9uKHQscixuKXsoImxlbmd0aCIh PT1yfHwiYXJyYXkiIT09dSh0KSkmJihlKHIpP2kodCxyLG4pOmEodCxyLG4p KX0sRW1iZXIuaXNXYXRjaGluZz1mdW5jdGlvbihlLHQpe3ZhciBuPWVbcl07 cmV0dXJuKG4mJm4ud2F0Y2hpbmdbdF0pPjB9LEVtYmVyLndhdGNoLmZsdXNo UGVuZGluZz1FbWJlci5mbHVzaFBlbmRpbmdDaGFpbnMsRW1iZXIudW53YXRj aD1mdW5jdGlvbih0LHIsbil7KCJsZW5ndGgiIT09cnx8ImFycmF5IiE9PXUo dCkpJiYoZShyKT9vKHQscixuKTpzKHQscixuKSl9LEVtYmVyLnJld2F0Y2g9 ZnVuY3Rpb24oZSl7dmFyIG49ZVtyXSxpPW4mJm4uY2hhaW5zO3QgaW4gZSYm IWUuaGFzT3duUHJvcGVydHkodCkmJmwoZSksaSYmaS52YWx1ZSgpIT09ZSYm KG4uY2hhaW5zPWkuY29weShlKSl9O3ZhciBoPVtdO0VtYmVyLmRlc3Ryb3k9 ZnVuY3Rpb24oZSl7dmFyIHQsaSxvLGEscz1lW3JdO2lmKHMmJihlW3JdPW51 bGwsdD1zLmNoYWlucykpZm9yKGgucHVzaCh0KTtoLmxlbmd0aD4wOyl7aWYo dD1oLnBvcCgpLGk9dC5fY2hhaW5zKWZvcihvIGluIGkpaS5oYXNPd25Qcm9w ZXJ0eShvKSYmaC5wdXNoKGlbb10pO3QuX3dhdGNoaW5nJiYoYT10Ll9vYmpl Y3QsYSYmbihhLHQuX2tleSx0KSl9fX0oKSxmdW5jdGlvbigpe2Z1bmN0aW9u IGUoZSx0KXt2YXIgcj1lW3RdO3JldHVybiByP2UuaGFzT3duUHJvcGVydHko dCl8fChyPWVbdF09aChyKSk6cj1lW3RdPXt9LHJ9ZnVuY3Rpb24gdCh0KXty ZXR1cm4gZSh0LCJkZXBzIil9ZnVuY3Rpb24gcihyLG4saSxvKXt2YXIgYSxz LHUsbCxjLGg9ci5fZGVwZW5kZW50S2V5cztpZihoKWZvcihhPXQobykscz0w LHU9aC5sZW5ndGg7dT5zO3MrKylsPWhbc10sYz1lKGEsbCksY1tpXT0oY1tp XXx8MCkrMSxwKG4sbCxvKX1mdW5jdGlvbiBuKHIsbixpLG8pe3ZhciBhLHMs dSxsLGMsaD1yLl9kZXBlbmRlbnRLZXlzO2lmKGgpZm9yKGE9dChvKSxzPTAs dT1oLmxlbmd0aDt1PnM7cysrKWw9aFtzXSxjPWUoYSxsKSxjW2ldPShjW2ld fHwwKS0xLGYobixsLG8pfWZ1bmN0aW9uIGkoZSx0KXt0aGlzLmZ1bmM9ZSxF bWJlci5GRUFUVVJFUy5pc0VuYWJsZWQoImNvbXBvc2FibGUtY29tcHV0ZWQt cHJvcGVydGllcyIpP1QodGhpcyx0JiZ0LmRlcGVuZGVudEtleXMpOnRoaXMu X2RlcGVuZGVudEtleXM9dCYmdC5kZXBlbmRlbnRLZXlzLHRoaXMuX2NhY2hl YWJsZT10JiZ2b2lkIDAhPT10LmNhY2hlYWJsZT90LmNhY2hlYWJsZTohMCx0 aGlzLl9yZWFkT25seT10JiYodm9pZCAwIT09dC5yZWFkT25seXx8ISF0LnJl YWRPbmx5KX1mdW5jdGlvbiBvKGUpe2Zvcih2YXIgdD0wLHI9ZS5sZW5ndGg7 cj50O3QrKyllW3RdLmRpZENoYW5nZShudWxsKX1mdW5jdGlvbiBhKGUsdCl7 Zm9yKHZhciByPXt9LG49MDtuPHQubGVuZ3RoO24rKylyW3Rbbl1dPXMoZSx0 W25dKTtyZXR1cm4gcn12YXIgcz1FbWJlci5nZXQsdT1FbWJlci5zZXQsbD1F bWJlci5tZXRhLGM9W10uc2xpY2UsaD1FbWJlci5jcmVhdGUsbT1FbWJlci5N RVRBX0tFWSxwPUVtYmVyLndhdGNoLGY9RW1iZXIudW53YXRjaCxkPUVtYmVy LmV4cGFuZFByb3BlcnRpZXM7aWYoRW1iZXIuRkVBVFVSRVMuaXNFbmFibGVk KCJlbWJlci1tZXRhbC1jb21wdXRlZC1lbXB0eS1hcnJheSIpKXZhciBiPS9c LihsZW5ndGh8XFtcXSkkLztFbWJlci5Db21wdXRlZFByb3BlcnR5PWksaS5w cm90b3R5cGU9bmV3IEVtYmVyLkRlc2NyaXB0b3I7dmFyIEU9aS5wcm90b3R5 cGU7RS5fZGVwZW5kZW50S2V5cz12b2lkIDAsRS5fc3VzcGVuZGVkPXZvaWQg MCxFLl9tZXRhPXZvaWQgMCxFbWJlci5GRUFUVVJFUy5pc0VuYWJsZWQoImNv bXBvc2FibGUtY29tcHV0ZWQtcHJvcGVydGllcyIpJiYoRS5fZGVwZW5kZW50 Q1BzPXZvaWQgMCxFLmltcGxpY2l0Q1BLZXk9dm9pZCAwLEUudG9TdHJpbmc9 ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbXBsaWNpdENQS2V5P3RoaXMuaW1w bGljaXRDUEtleTpFbWJlci5EZXNjcmlwdG9yLnByb3RvdHlwZS50b1N0cmlu Zy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KSxFLmNhY2hlYWJsZT1mdW5jdGlv bihlKXtyZXR1cm4gdGhpcy5fY2FjaGVhYmxlPWUhPT0hMSx0aGlzfSxFLnZv bGF0aWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FjaGVhYmxlKCExKX0s RS5yZWFkT25seT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fcmVhZE9ubHk9 dm9pZCAwPT09ZXx8ISFlLHRoaXN9LEUucHJvcGVydHk9ZnVuY3Rpb24oKXt2 YXIgZSx0PWZ1bmN0aW9uKHQpe2UucHVzaCh0KX07ZT1bXTtmb3IodmFyIHI9 MCxuPWFyZ3VtZW50cy5sZW5ndGg7bj5yO3IrKylkKGFyZ3VtZW50c1tyXSx0 KTtyZXR1cm4gRW1iZXIuRkVBVFVSRVMuaXNFbmFibGVkKCJjb21wb3NhYmxl LWNvbXB1dGVkLXByb3BlcnRpZXMiKT9UKHRoaXMsZSk6dGhpcy5fZGVwZW5k ZW50S2V5cz1lLHRoaXN9LEUubWV0YT1mdW5jdGlvbihlKXtyZXR1cm4gMD09 PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5fbWV0YXx8e306KHRoaXMuX21ldGE9 ZSx0aGlzKX0sRS5kaWRDaGFuZ2U9ZnVuY3Rpb24oZSx0KXtpZih0aGlzLl9j YWNoZWFibGUmJnRoaXMuX3N1c3BlbmRlZCE9PWUpe3ZhciByPWwoZSk7dCBp biByLmNhY2hlJiYoZGVsZXRlIHIuY2FjaGVbdF0sbih0aGlzLGUsdCxyKSl9 fSxFLmdldD1mdW5jdGlvbihlLHQpe3ZhciBuLGksYSxzO2lmKHRoaXMuX2Nh Y2hlYWJsZSl7aWYoYT1sKGUpLGk9YS5jYWNoZSx0IGluIGkpcmV0dXJuIGlb dF07bj1pW3RdPXRoaXMuZnVuYy5jYWxsKGUsdCkscz1hLmNoYWluV2F0Y2hl cnMmJmEuY2hhaW5XYXRjaGVyc1t0XSxzJiZvKHMpLHIodGhpcyxlLHQsYSl9 ZWxzZSBuPXRoaXMuZnVuYy5jYWxsKGUsdCk7cmV0dXJuIG59LEUuc2V0PWZ1 bmN0aW9uKGUsdCxuKXt2YXIgaSxvLGEscz10aGlzLl9jYWNoZWFibGUsdT10 aGlzLmZ1bmMsYz1sKGUscyksaD1jLndhdGNoaW5nW3RdLG09dGhpcy5fc3Vz cGVuZGVkLHA9ITEsZj1jLmNhY2hlO2lmKHRoaXMuX3JlYWRPbmx5KXRocm93 IG5ldyBFbWJlci5FcnJvcignQ2Fubm90IHNldCByZWFkLW9ubHkgcHJvcGVy dHkgIicrdCsnIiBvbiBvYmplY3Q6ICcrRW1iZXIuaW5zcGVjdChlKSk7dGhp cy5fc3VzcGVuZGVkPWU7dHJ5e2lmKHMmJmYuaGFzT3duUHJvcGVydHkodCkm JihvPWZbdF0scD0hMCksaT11LndyYXBwZWRGdW5jdGlvbj91LndyYXBwZWRG dW5jdGlvbi5sZW5ndGg6dS5sZW5ndGgsMz09PWkpYT11LmNhbGwoZSx0LG4s byk7ZWxzZXtpZigyIT09aSlyZXR1cm4gRW1iZXIuZGVmaW5lUHJvcGVydHko ZSx0LG51bGwsbyksRW1iZXIuc2V0KGUsdCxuKSx2b2lkIDA7YT11LmNhbGwo ZSx0LG4pfWlmKHAmJm89PT1hKXJldHVybjtoJiZFbWJlci5wcm9wZXJ0eVdp bGxDaGFuZ2UoZSx0KSxwJiZkZWxldGUgZlt0XSxzJiYocHx8cih0aGlzLGUs dCxjKSxmW3RdPWEpLGgmJkVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKGUsdCl9 ZmluYWxseXt0aGlzLl9zdXNwZW5kZWQ9bX1yZXR1cm4gYX0sRS50ZWFyZG93 bj1mdW5jdGlvbihlLHQpe3ZhciByPWwoZSk7cmV0dXJuIHQgaW4gci5jYWNo ZSYmbih0aGlzLGUsdCxyKSx0aGlzLl9jYWNoZWFibGUmJmRlbGV0ZSByLmNh Y2hlW3RdLG51bGx9LEVtYmVyLmNvbXB1dGVkPWZ1bmN0aW9uKGUpe3ZhciB0 O2lmKGFyZ3VtZW50cy5sZW5ndGg+MSYmKHQ9Yy5jYWxsKGFyZ3VtZW50cyww LC0xKSxlPWMuY2FsbChhcmd1bWVudHMsLTEpWzBdKSwiZnVuY3Rpb24iIT10 eXBlb2YgZSl0aHJvdyBuZXcgRW1iZXIuRXJyb3IoIkNvbXB1dGVkIFByb3Bl cnR5IGRlY2xhcmVkIHdpdGhvdXQgYSBwcm9wZXJ0eSBmdW5jdGlvbiIpO3Zh ciByPW5ldyBpKGUpO3JldHVybiB0JiZyLnByb3BlcnR5LmFwcGx5KHIsdCks cn0sRW1iZXIuY2FjaGVGb3I9ZnVuY3Rpb24oZSx0KXt2YXIgcj1lW21dLG49 ciYmci5jYWNoZTtyZXR1cm4gbiYmdCBpbiBuP25bdF06dm9pZCAwfTt2YXIg dixnO2lmKEVtYmVyLkZFQVRVUkVTLmlzRW5hYmxlZCgiY29tcG9zYWJsZS1j b21wdXRlZC1wcm9wZXJ0aWVzIikpe3ZhciB5PUVtYmVyLmd1aWRGb3IsXz1F bWJlci5FbnVtZXJhYmxlVXRpbHMubWFwLHc9RW1iZXIuRW51bWVyYWJsZVV0 aWxzLmZpbHRlcixDPShFbWJlci50eXBlT2YsZnVuY3Rpb24oZSl7cmV0dXJu W3koZSldLmNvbmNhdChlLl9kZXBlbmRlbnRLZXlzKS5qb2luKCJfIikucmVw bGFjZSgvXC4vZywiX0RPVF8iKQp9KSxPPWZ1bmN0aW9uKGUpe3JldHVybiBl IGluc3RhbmNlb2YgRW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eT9DKGUpOmV9LFA9 ZnVuY3Rpb24oZSl7cmV0dXJuIF8oZSxmdW5jdGlvbihlKXtyZXR1cm4gTyhl KX0pfSxBPWZ1bmN0aW9uKGUpe3JldHVybiB3KGUsZnVuY3Rpb24oZSl7cmV0 dXJuIGUgaW5zdGFuY2VvZiBFbWJlci5Db21wdXRlZFByb3BlcnR5fSl9LFQ9 ZnVuY3Rpb24oZSx0KXt0PyhlLl9kZXBlbmRlbnRLZXlzPVAodCksZS5fZGVw ZW5kZW50Q1BzPUEodCkpOmUuX2RlcGVuZGVudEtleXM9ZS5fZGVwZW5kZW50 Q1BzPVtdLGUuaW1wbGljaXRDUEtleT1DKGUpfTtFbWJlci5jb21wdXRlZC5u b3JtYWxpemVEZXBlbmRlbnRLZXk9TyxFbWJlci5jb21wdXRlZC5ub3JtYWxp emVEZXBlbmRlbnRLZXlzPVAsdj1mdW5jdGlvbihlLHQpe0VtYmVyLmNvbXB1 dGVkW2VdPWZ1bmN0aW9uKGUpe3ZhciByPVAoYy5jYWxsKGFyZ3VtZW50cykp O3JldHVybiBFbWJlci5jb21wdXRlZChlLGZ1bmN0aW9uKCl7cmV0dXJuIHQu YXBwbHkodGhpcyxyKX0pfX19RW1iZXIuRkVBVFVSRVMuaXNFbmFibGVkKCJj b21wb3NhYmxlLWNvbXB1dGVkLXByb3BlcnRpZXMiKT9nPWZ1bmN0aW9uKGUs dCl7RW1iZXIuY29tcHV0ZWRbZV09ZnVuY3Rpb24oKXt2YXIgZT1jLmNhbGwo YXJndW1lbnRzKSxyPVAoZSksbj1FbWJlci5jb21wdXRlZChmdW5jdGlvbigp e3JldHVybiB0LmFwcGx5KHRoaXMsW2EodGhpcyxyKV0pfSk7cmV0dXJuIG4u cHJvcGVydHkuYXBwbHkobixlKX19Oih2PWZ1bmN0aW9uKGUsdCl7RW1iZXIu Y29tcHV0ZWRbZV09ZnVuY3Rpb24oZSl7dmFyIHI9Yy5jYWxsKGFyZ3VtZW50 cyk7cmV0dXJuIEVtYmVyLmNvbXB1dGVkKGUsZnVuY3Rpb24oKXtyZXR1cm4g dC5hcHBseSh0aGlzLHIpfSl9fSxnPWZ1bmN0aW9uKGUsdCl7RW1iZXIuY29t cHV0ZWRbZV09ZnVuY3Rpb24oKXt2YXIgZT1jLmNhbGwoYXJndW1lbnRzKSxy PUVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkodGhp cyxbYSh0aGlzLGUpXSl9KTtyZXR1cm4gci5wcm9wZXJ0eS5hcHBseShyLGUp fX0pLEVtYmVyLkZFQVRVUkVTLmlzRW5hYmxlZCgiY29tcG9zYWJsZS1jb21w dXRlZC1wcm9wZXJ0aWVzIikmJihFbWJlci5jb21wdXRlZC5saXRlcmFsPWZ1 bmN0aW9uKGUpe3JldHVybiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpe3Jl dHVybiBlfSl9KSxFbWJlci5GRUFUVVJFUy5pc0VuYWJsZWQoImVtYmVyLW1l dGFsLWNvbXB1dGVkLWVtcHR5LWFycmF5Iik/RW1iZXIuY29tcHV0ZWQuZW1w dHk9RW1iZXIuRkVBVFVSRVMuaXNFbmFibGVkKCJjb21wb3NhYmxlLWNvbXB1 dGVkLXByb3BlcnRpZXMiKT9mdW5jdGlvbihlKXt2YXIgdD1jLmNhbGwoYXJn dW1lbnRzKSxyPU8oZSk7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBlfHxiLnRl c3QoZSk/dC5wdXNoKHIrIi5sZW5ndGgiKTp0WzBdPWUrIi5sZW5ndGgiLEVt YmVyLmNvbXB1dGVkLmFwcGx5KEVtYmVyLmNvbXB1dGVkLHQuY29uY2F0KGZ1 bmN0aW9uKCl7cmV0dXJuIEVtYmVyLmlzRW1wdHkocyh0aGlzLHIpKX0pKX06 ZnVuY3Rpb24oZSl7cmV0dXJuIEVtYmVyLmNvbXB1dGVkKGUrIi5sZW5ndGgi LGZ1bmN0aW9uKCl7cmV0dXJuIEVtYmVyLmlzRW1wdHkocyh0aGlzLGUpKX0p fTp2KCJlbXB0eSIsZnVuY3Rpb24oZSl7cmV0dXJuIEVtYmVyLmlzRW1wdHko cyh0aGlzLGUpKX0pLHYoIm5vdEVtcHR5IixmdW5jdGlvbihlKXtyZXR1cm4h RW1iZXIuaXNFbXB0eShzKHRoaXMsZSkpfSksdigibm9uZSIsZnVuY3Rpb24o ZSl7cmV0dXJuIEVtYmVyLmlzTm9uZShzKHRoaXMsZSkpfSksdigibm90Iixm dW5jdGlvbihlKXtyZXR1cm4hcyh0aGlzLGUpfSksdigiYm9vbCIsZnVuY3Rp b24oZSl7cmV0dXJuISFzKHRoaXMsZSl9KSx2KCJtYXRjaCIsZnVuY3Rpb24o ZSx0KXt2YXIgcj1zKHRoaXMsZSk7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBy P3QudGVzdChyKTohMX0pLHYoImVxdWFsIixmdW5jdGlvbihlLHQpe3JldHVy biBzKHRoaXMsZSk9PT10fSksdigiZ3QiLGZ1bmN0aW9uKGUsdCl7cmV0dXJu IHModGhpcyxlKT50fSksdigiZ3RlIixmdW5jdGlvbihlLHQpe3JldHVybiBz KHRoaXMsZSk+PXR9KSx2KCJsdCIsZnVuY3Rpb24oZSx0KXtyZXR1cm4gcyh0 aGlzLGUpPHR9KSx2KCJsdGUiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHModGhp cyxlKTw9dH0pLGcoImFuZCIsZnVuY3Rpb24oZSl7Zm9yKHZhciB0IGluIGUp aWYoZS5oYXNPd25Qcm9wZXJ0eSh0KSYmIWVbdF0pcmV0dXJuITE7cmV0dXJu ITB9KSxnKCJvciIsZnVuY3Rpb24oZSl7Zm9yKHZhciB0IGluIGUpaWYoZS5o YXNPd25Qcm9wZXJ0eSh0KSYmZVt0XSlyZXR1cm4hMDtyZXR1cm4hMX0pLGco ImFueSIsZnVuY3Rpb24oZSl7Zm9yKHZhciB0IGluIGUpaWYoZS5oYXNPd25Q cm9wZXJ0eSh0KSYmZVt0XSlyZXR1cm4gZVt0XTtyZXR1cm4gbnVsbH0pLGco ImNvbGxlY3QiLGZ1bmN0aW9uKGUpe3ZhciB0PVtdO2Zvcih2YXIgciBpbiBl KWUuaGFzT3duUHJvcGVydHkocikmJihFbWJlci5pc05vbmUoZVtyXSk/dC5w dXNoKG51bGwpOnQucHVzaChlW3JdKSk7cmV0dXJuIHR9KSxFbWJlci5jb21w dXRlZC5hbGlhcz1mdW5jdGlvbihlKXtyZXR1cm4gRW1iZXIuY29tcHV0ZWQo ZSxmdW5jdGlvbih0LHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/KHUo dGhpcyxlLHIpLHIpOnModGhpcyxlKX0pfSxFbWJlci5jb21wdXRlZC5vbmVX YXk9ZnVuY3Rpb24oZSl7cmV0dXJuIEVtYmVyLmNvbXB1dGVkKGUsZnVuY3Rp b24oKXtyZXR1cm4gcyh0aGlzLGUpfSl9LEVtYmVyLkZFQVRVUkVTLmlzRW5h YmxlZCgicXVlcnktcGFyYW1zLW5ldyIpJiYoRW1iZXIuY29tcHV0ZWQucmVh ZHM9RW1iZXIuY29tcHV0ZWQub25lV2F5KSxFbWJlci5jb21wdXRlZC5yZWFk T25seT1mdW5jdGlvbihlKXtyZXR1cm4gRW1iZXIuY29tcHV0ZWQoZSxmdW5j dGlvbigpe3JldHVybiBzKHRoaXMsZSl9KS5yZWFkT25seSgpfSxFbWJlci5j b21wdXRlZC5kZWZhdWx0VG89ZnVuY3Rpb24oZSl7cmV0dXJuIEVtYmVyLmNv bXB1dGVkKGZ1bmN0aW9uKHQscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVu Z3RoP3ModGhpcyxlKTpudWxsIT1yP3I6cyh0aGlzLGUpfSl9fSgpLGZ1bmN0 aW9uKCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gZStyfWZ1bmN0aW9uIHQoZSl7 cmV0dXJuIGUrbn12YXIgcj0iOmNoYW5nZSIsbj0iOmJlZm9yZSI7RW1iZXIu YWRkT2JzZXJ2ZXI9ZnVuY3Rpb24odCxyLG4saSl7cmV0dXJuIEVtYmVyLmFk ZExpc3RlbmVyKHQsZShyKSxuLGkpLEVtYmVyLndhdGNoKHQsciksdGhpc30s RW1iZXIub2JzZXJ2ZXJzRm9yPWZ1bmN0aW9uKHQscil7cmV0dXJuIEVtYmVy Lmxpc3RlbmVyc0Zvcih0LGUocikpfSxFbWJlci5yZW1vdmVPYnNlcnZlcj1m dW5jdGlvbih0LHIsbixpKXtyZXR1cm4gRW1iZXIudW53YXRjaCh0LHIpLEVt YmVyLnJlbW92ZUxpc3RlbmVyKHQsZShyKSxuLGkpLHRoaXN9LEVtYmVyLmFk ZEJlZm9yZU9ic2VydmVyPWZ1bmN0aW9uKGUscixuLGkpe3JldHVybiBFbWJl ci5hZGRMaXN0ZW5lcihlLHQociksbixpKSxFbWJlci53YXRjaChlLHIpLHRo aXN9LEVtYmVyLl9zdXNwZW5kQmVmb3JlT2JzZXJ2ZXI9ZnVuY3Rpb24oZSxy LG4saSxvKXtyZXR1cm4gRW1iZXIuX3N1c3BlbmRMaXN0ZW5lcihlLHQociks bixpLG8pfSxFbWJlci5fc3VzcGVuZE9ic2VydmVyPWZ1bmN0aW9uKHQscixu LGksbyl7cmV0dXJuIEVtYmVyLl9zdXNwZW5kTGlzdGVuZXIodCxlKHIpLG4s aSxvKX07dmFyIGk9RW1iZXIuQXJyYXlQb2x5ZmlsbHMubWFwO0VtYmVyLl9z dXNwZW5kQmVmb3JlT2JzZXJ2ZXJzPWZ1bmN0aW9uKGUscixuLG8sYSl7dmFy IHM9aS5jYWxsKHIsdCk7cmV0dXJuIEVtYmVyLl9zdXNwZW5kTGlzdGVuZXJz KGUscyxuLG8sYSl9LEVtYmVyLl9zdXNwZW5kT2JzZXJ2ZXJzPWZ1bmN0aW9u KHQscixuLG8sYSl7dmFyIHM9aS5jYWxsKHIsZSk7cmV0dXJuIEVtYmVyLl9z dXNwZW5kTGlzdGVuZXJzKHQscyxuLG8sYSl9LEVtYmVyLmJlZm9yZU9ic2Vy dmVyc0Zvcj1mdW5jdGlvbihlLHIpe3JldHVybiBFbWJlci5saXN0ZW5lcnNG b3IoZSx0KHIpKX0sRW1iZXIucmVtb3ZlQmVmb3JlT2JzZXJ2ZXI9ZnVuY3Rp b24oZSxyLG4saSl7cmV0dXJuIEVtYmVyLnVud2F0Y2goZSxyKSxFbWJlci5y ZW1vdmVMaXN0ZW5lcihlLHQociksbixpKSx0aGlzfX0oKSxmdW5jdGlvbigp e2UoImJhY2tidXJuZXIvcXVldWUiLFsiZXhwb3J0cyJdLGZ1bmN0aW9uKGUp eyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0KGUsdCxyKXt0aGlzLmRhcT1lLHRo aXMubmFtZT10LHRoaXMub3B0aW9ucz1yLHRoaXMuX3F1ZXVlPVtdfXQucHJv dG90eXBlPXtkYXE6bnVsbCxuYW1lOm51bGwsb3B0aW9uczpudWxsLF9xdWV1 ZTpudWxsLHB1c2g6ZnVuY3Rpb24oZSx0LHIsbil7dmFyIGk9dGhpcy5fcXVl dWU7cmV0dXJuIGkucHVzaChlLHQscixuKSx7cXVldWU6dGhpcyx0YXJnZXQ6 ZSxtZXRob2Q6dH19LHB1c2hVbmlxdWU6ZnVuY3Rpb24oZSx0LHIsbil7dmFy IGksbyxhLHMsdT10aGlzLl9xdWV1ZTtmb3IoYT0wLHM9dS5sZW5ndGg7cz5h O2ErPTQpaWYoaT11W2FdLG89dVthKzFdLGk9PT1lJiZvPT09dClyZXR1cm4g dVthKzJdPXIsdVthKzNdPW4se3F1ZXVlOnRoaXMsdGFyZ2V0OmUsbWV0aG9k OnR9O3JldHVybiB0aGlzLl9xdWV1ZS5wdXNoKGUsdCxyLG4pLHtxdWV1ZTp0 aGlzLHRhcmdldDplLG1ldGhvZDp0fX0sZmx1c2g6ZnVuY3Rpb24oKXt2YXIg ZSx0LHIsbixpLG89dGhpcy5fcXVldWUsYT10aGlzLm9wdGlvbnMscz1hJiZh LmJlZm9yZSx1PWEmJmEuYWZ0ZXIsbD1vLmxlbmd0aDtmb3IobCYmcyYmcygp LGk9MDtsPmk7aSs9NCllPW9baV0sdD1vW2krMV0scj1vW2krMl0sbj1vW2kr M10sciYmci5sZW5ndGg+MD90LmFwcGx5KGUscik6dC5jYWxsKGUpO2wmJnUm JnUoKSxvLmxlbmd0aD5sPyh0aGlzLl9xdWV1ZT1vLnNsaWNlKGwpLHRoaXMu Zmx1c2goKSk6dGhpcy5fcXVldWUubGVuZ3RoPTB9LGNhbmNlbDpmdW5jdGlv bihlKXt2YXIgdCxyLG4saSxvPXRoaXMuX3F1ZXVlO2ZvcihuPTAsaT1vLmxl bmd0aDtpPm47bis9NClpZih0PW9bbl0scj1vW24rMV0sdD09PWUudGFyZ2V0 JiZyPT09ZS5tZXRob2QpcmV0dXJuIG8uc3BsaWNlKG4sNCksITA7aWYobz10 aGlzLl9xdWV1ZUJlaW5nRmx1c2hlZClmb3Iobj0wLGk9by5sZW5ndGg7aT5u O24rPTQpaWYodD1vW25dLHI9b1tuKzFdLHQ9PT1lLnRhcmdldCYmcj09PWUu bWV0aG9kKXJldHVybiBvW24rMV09bnVsbCwhMH19LGUuUXVldWU9dH0pLGUo ImJhY2tidXJuZXIvZGVmZXJyZWRfYWN0aW9uX3F1ZXVlcyIsWyJiYWNrYnVy bmVyL3F1ZXVlIiwiZXhwb3J0cyJdLGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJp Y3QiO2Z1bmN0aW9uIHIoZSx0KXt2YXIgcj10aGlzLnF1ZXVlcz17fTt0aGlz LnF1ZXVlTmFtZXM9ZT1lfHxbXTtmb3IodmFyIG4sbz0wLGE9ZS5sZW5ndGg7 YT5vO28rKyluPWVbb10scltuXT1uZXcgaSh0aGlzLG4sdFtuXSl9ZnVuY3Rp b24gbihlLHQpe2Zvcih2YXIgcixuLGk9MCxvPXQ7bz49aTtpKyspaWYocj1l LnF1ZXVlTmFtZXNbaV0sbj1lLnF1ZXVlc1tyXSxuLl9xdWV1ZS5sZW5ndGgp cmV0dXJuIGk7cmV0dXJuLTF9dmFyIGk9ZS5RdWV1ZTtyLnByb3RvdHlwZT17 cXVldWVOYW1lczpudWxsLHF1ZXVlczpudWxsLHNjaGVkdWxlOmZ1bmN0aW9u KGUsdCxyLG4saSxvKXt2YXIgYT10aGlzLnF1ZXVlcyxzPWFbZV07aWYoIXMp dGhyb3cgbmV3IEVycm9yKCJZb3UgYXR0ZW1wdGVkIHRvIHNjaGVkdWxlIGFu IGFjdGlvbiBpbiBhIHF1ZXVlICgiK2UrIikgdGhhdCBkb2Vzbid0IGV4aXN0 Iik7cmV0dXJuIGk/cy5wdXNoVW5pcXVlKHQscixuLG8pOnMucHVzaCh0LHIs bixvKX0sZmx1c2g6ZnVuY3Rpb24oKXtmb3IodmFyIGUsdCxyLGksbz10aGlz LnF1ZXVlcyxhPXRoaXMucXVldWVOYW1lcyxzPTAsdT1hLmxlbmd0aDt1PnM7 KXtlPWFbc10sdD1vW2VdLHI9dC5fcXVldWVCZWluZ0ZsdXNoZWQ9dC5fcXVl dWUuc2xpY2UoKSx0Ll9xdWV1ZT1bXTt2YXIgbCxjLGgsbSxwPXQub3B0aW9u cyxmPXAmJnAuYmVmb3JlLGQ9cCYmcC5hZnRlcixiPTAsRT1yLmxlbmd0aDtm b3IoRSYmZiYmZigpO0U+YjspbD1yW2JdLGM9cltiKzFdLGg9cltiKzJdLG09 cltiKzNdLCJzdHJpbmciPT10eXBlb2YgYyYmKGM9bFtjXSksYyYmKGgmJmgu bGVuZ3RoPjA/Yy5hcHBseShsLGgpOmMuY2FsbChsKSksYis9NDt0Ll9xdWV1 ZUJlaW5nRmx1c2hlZD1udWxsLEUmJmQmJmQoKSwtMT09PShpPW4odGhpcyxz KSk/cysrOnM9aX19fSx0LkRlZmVycmVkQWN0aW9uUXVldWVzPXJ9KSxlKCJi YWNrYnVybmVyIixbImJhY2tidXJuZXIvZGVmZXJyZWRfYWN0aW9uX3F1ZXVl cyIsImV4cG9ydHMiXSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0IjtmdW5j dGlvbiByKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZXx8Zy50ZXN0KGUp fWZ1bmN0aW9uIG4oZSx0KXt0aGlzLnF1ZXVlTmFtZXM9ZSx0aGlzLm9wdGlv bnM9dHx8e30sdGhpcy5vcHRpb25zLmRlZmF1bHRRdWV1ZXx8KHRoaXMub3B0 aW9ucy5kZWZhdWx0UXVldWU9ZVswXSksdGhpcy5pbnN0YW5jZVN0YWNrPVtd fWZ1bmN0aW9uIGkoZSl7ZS5iZWdpbigpLGw9di5zZXRUaW1lb3V0KGZ1bmN0 aW9uKCl7bD1udWxsLGUuZW5kKCl9KX1mdW5jdGlvbiBvKGUsdCxyKXsoIWN8 fGg+dCkmJihjJiZjbGVhclRpbWVvdXQoYyksYz12LnNldFRpbWVvdXQoZnVu Y3Rpb24oKXtjPW51bGwsaD1udWxsLGEoZSl9LHIpLGg9dCl9ZnVuY3Rpb24g YShlKXt2YXIgdCxyLG4saSxhPStuZXcgRGF0ZTtlLnJ1bihmdW5jdGlvbigp e2ZvcihuPTAsaT1FLmxlbmd0aDtpPm4mJih0PUVbbl0sISh0PmEpKTtuKz0y KTtmb3Iocj1FLnNwbGljZSgwLG4pLG49MSxpPXIubGVuZ3RoO2k+bjtuKz0y KWUuc2NoZWR1bGUoZS5vcHRpb25zLmRlZmF1bHRRdWV1ZSxudWxsLHJbbl0p fSksRS5sZW5ndGgmJm8oZSxFWzBdLEVbMF0tYSl9ZnVuY3Rpb24gcyhlLHQp e2Zvcih2YXIgcixuPS0xLGk9MCxvPWIubGVuZ3RoO28+aTtpKyspaWYocj1i W2ldLHJbMF09PT1lJiZyWzFdPT09dCl7bj1pO2JyZWFrfXJldHVybiBufWZ1 bmN0aW9uIHUoZSx0KXtmb3IodmFyIHIsbj0tMSxpPTAsbz1kLmxlbmd0aDtv Pmk7aSsrKWlmKHI9ZFtpXSxyWzBdPT09ZSYmclsxXT09PXQpe249aTticmVh a31yZXR1cm4gbn12YXIgbCxjLGgsbT1lLkRlZmVycmVkQWN0aW9uUXVldWVz LHA9W10uc2xpY2UsZj1bXS5wb3AsZD1bXSxiPVtdLEU9W10sdj10aGlzLGc9 L1xkKy87bi5wcm90b3R5cGU9e3F1ZXVlTmFtZXM6bnVsbCxvcHRpb25zOm51 bGwsY3VycmVudEluc3RhbmNlOm51bGwsaW5zdGFuY2VTdGFjazpudWxsLGJl Z2luOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlv bnMub25CZWdpbix0PXRoaXMuY3VycmVudEluc3RhbmNlO3QmJnRoaXMuaW5z dGFuY2VTdGFjay5wdXNoKHQpLHRoaXMuY3VycmVudEluc3RhbmNlPW5ldyBt KHRoaXMucXVldWVOYW1lcyx0aGlzLm9wdGlvbnMpLGUmJmUodGhpcy5jdXJy ZW50SW5zdGFuY2UsdCl9LGVuZDpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3B0 aW9ucyYmdGhpcy5vcHRpb25zLm9uRW5kLHQ9dGhpcy5jdXJyZW50SW5zdGFu Y2Uscj1udWxsO3RyeXt0LmZsdXNoKCl9ZmluYWxseXt0aGlzLmN1cnJlbnRJ bnN0YW5jZT1udWxsLHRoaXMuaW5zdGFuY2VTdGFjay5sZW5ndGgmJihyPXRo aXMuaW5zdGFuY2VTdGFjay5wb3AoKSx0aGlzLmN1cnJlbnRJbnN0YW5jZT1y KSxlJiZlKHQscil9fSxydW46ZnVuY3Rpb24oZSx0KXt2YXIgcjt0aGlzLmJl Z2luKCksdHx8KHQ9ZSxlPW51bGwpLCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9 ZVt0XSk7dmFyIG49ITE7dHJ5e3I9YXJndW1lbnRzLmxlbmd0aD4yP3QuYXBw bHkoZSxwLmNhbGwoYXJndW1lbnRzLDIpKTp0LmNhbGwoZSl9ZmluYWxseXtu fHwobj0hMCx0aGlzLmVuZCgpKX1yZXR1cm4gcn0sZGVmZXI6ZnVuY3Rpb24o ZSx0LHIpe3J8fChyPXQsdD1udWxsKSwic3RyaW5nIj09dHlwZW9mIHImJihy PXRbcl0pO3ZhciBuPXRoaXMuREVCVUc/bmV3IEVycm9yOnZvaWQgMCxvPWFy Z3VtZW50cy5sZW5ndGg+Mz9wLmNhbGwoYXJndW1lbnRzLDMpOnZvaWQgMDty ZXR1cm4gdGhpcy5jdXJyZW50SW5zdGFuY2V8fGkodGhpcyksdGhpcy5jdXJy ZW50SW5zdGFuY2Uuc2NoZWR1bGUoZSx0LHIsbywhMSxuKX0sZGVmZXJPbmNl OmZ1bmN0aW9uKGUsdCxyKXtyfHwocj10LHQ9bnVsbCksInN0cmluZyI9PXR5 cGVvZiByJiYocj10W3JdKTt2YXIgbj10aGlzLkRFQlVHP25ldyBFcnJvcjp2 b2lkIDAsbz1hcmd1bWVudHMubGVuZ3RoPjM/cC5jYWxsKGFyZ3VtZW50cywz KTp2b2lkIDA7cmV0dXJuIHRoaXMuY3VycmVudEluc3RhbmNlfHxpKHRoaXMp LHRoaXMuY3VycmVudEluc3RhbmNlLnNjaGVkdWxlKGUsdCxyLG8sITAsbil9 LHNldFRpbWVvdXQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dC5hcHBseShp LGwpfXZhciB0LG4saSxhLHMsdSxsPXAuY2FsbChhcmd1bWVudHMpLGM9bC5s ZW5ndGgsaD10aGlzO2lmKDAhPT1jKXtpZigxPT09Yyl0PWwuc2hpZnQoKSxu PTA7ZWxzZSBpZigyPT09YylhPWxbMF0scz1sWzFdLCJmdW5jdGlvbiI9PXR5 cGVvZiBzfHwiZnVuY3Rpb24iPT10eXBlb2YgYVtzXT8oaT1sLnNoaWZ0KCks dD1sLnNoaWZ0KCksbj0wKTpyKHMpPyh0PWwuc2hpZnQoKSxuPWwuc2hpZnQo KSk6KHQ9bC5zaGlmdCgpLG49MCk7ZWxzZXt2YXIgbT1sW2wubGVuZ3RoLTFd O3IobSkmJihuPWwucG9wKCkpLGE9bFswXSx1PWxbMV0sImZ1bmN0aW9uIj09 dHlwZW9mIHV8fCJzdHJpbmciPT10eXBlb2YgdSYmbnVsbCE9PWEmJnUgaW4g YT8oaT1sLnNoaWZ0KCksdD1sLnNoaWZ0KCkpOnQ9bC5zaGlmdCgpfXZhciBm PStuZXcgRGF0ZStwYXJzZUludChuLDEwKTsic3RyaW5nIj09dHlwZW9mIHQm Jih0PWlbdF0pO3ZhciBkLGI7Zm9yKGQ9MCxiPUUubGVuZ3RoO2I+ZCYmIShm PEVbZF0pO2QrPTIpO3JldHVybiBFLnNwbGljZShkLDAsZixlKSxvKGgsZixu KSxlfX0sdGhyb3R0bGU6ZnVuY3Rpb24oZSx0KXt2YXIgcixuLGksbyxhPXRo aXMscz1hcmd1bWVudHMsbD1mLmNhbGwocyk7cmV0dXJuIm51bWJlciI9PXR5 cGVvZiBsfHwic3RyaW5nIj09dHlwZW9mIGw/KHI9bCxsPSEwKTpyPWYuY2Fs bChzKSxyPXBhcnNlSW50KHIsMTApLGk9dShlLHQpLGk+LTE/ZFtpXToobz12 LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtsfHxhLnJ1bi5hcHBseShhLHMpO3Zh ciByPXUoZSx0KTtyPi0xJiZkLnNwbGljZShyLDEpfSxyKSxsJiZhLnJ1bi5h cHBseShhLHMpLG49W2UsdCxvXSxkLnB1c2gobiksbil9LGRlYm91bmNlOmZ1 bmN0aW9uKGUsdCl7dmFyIHIsbixpLG8sYT10aGlzLHU9YXJndW1lbnRzLGw9 Zi5jYWxsKHUpO3JldHVybiJudW1iZXIiPT10eXBlb2YgbHx8InN0cmluZyI9 PXR5cGVvZiBsPyhyPWwsbD0hMSk6cj1mLmNhbGwodSkscj1wYXJzZUludChy LDEwKSxuPXMoZSx0KSxuPi0xJiYoaT1iW25dLGIuc3BsaWNlKG4sMSksY2xl YXJUaW1lb3V0KGlbMl0pKSxvPXYuc2V0VGltZW91dChmdW5jdGlvbigpe2x8 fGEucnVuLmFwcGx5KGEsdSk7dmFyIHI9cyhlLHQpO3I+LTEmJmIuc3BsaWNl KHIsMSl9LHIpLGwmJi0xPT09biYmYS5ydW4uYXBwbHkoYSx1KSxpPVtlLHQs b10sYi5wdXNoKGkpLGl9LGNhbmNlbFRpbWVyczpmdW5jdGlvbigpe3ZhciBl LHQ7Zm9yKGU9MCx0PWQubGVuZ3RoO3Q+ZTtlKyspY2xlYXJUaW1lb3V0KGRb ZV1bMl0pO2ZvcihkPVtdLGU9MCx0PWIubGVuZ3RoO3Q+ZTtlKyspY2xlYXJU aW1lb3V0KGJbZV1bMl0pO2I9W10sYyYmKGNsZWFyVGltZW91dChjKSxjPW51 bGwpLEU9W10sbCYmKGNsZWFyVGltZW91dChsKSxsPW51bGwpfSxoYXNUaW1l cnM6ZnVuY3Rpb24oKXtyZXR1cm4hIUUubGVuZ3RofHxsfSxjYW5jZWw6ZnVu Y3Rpb24oZSl7dmFyIHQ9dHlwZW9mIGU7aWYoZSYmIm9iamVjdCI9PT10JiZl LnF1ZXVlJiZlLm1ldGhvZClyZXR1cm4gZS5xdWV1ZS5jYW5jZWwoZSk7aWYo ImZ1bmN0aW9uIiE9PXQpcmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVj dC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKT90aGlzLl9jYW5jZWxJdGVt KHUsZCxlKXx8dGhpcy5fY2FuY2VsSXRlbShzLGIsZSk6dm9pZCAwO2Zvcih2 YXIgcj0wLG49RS5sZW5ndGg7bj5yO3IrPTIpaWYoRVtyKzFdPT09ZSlyZXR1 cm4gRS5zcGxpY2UociwyKSwhMH0sX2NhbmNlbEl0ZW06ZnVuY3Rpb24oZSx0 LHIpe3ZhciBuLGk7cmV0dXJuIHIubGVuZ3RoPDM/ITE6KGk9ZShyWzBdLHJb MV0pLGk+LTEmJihuPXRbaV0sblsyXT09PXJbMl0pPyh0LnNwbGljZShpLDEp LGNsZWFyVGltZW91dChyWzJdKSwhMCk6ITEpfX0sbi5wcm90b3R5cGUuc2No ZWR1bGU9bi5wcm90b3R5cGUuZGVmZXIsbi5wcm90b3R5cGUuc2NoZWR1bGVP bmNlPW4ucHJvdG90eXBlLmRlZmVyT25jZSxuLnByb3RvdHlwZS5sYXRlcj1u LnByb3RvdHlwZS5zZXRUaW1lb3V0LHQuQmFja2J1cm5lcj1ufSl9KCksZnVu Y3Rpb24oKXtmdW5jdGlvbiBlKGUpe3RyeXtyZXR1cm4gYS5ydW4uYXBwbHko YSxlKX1jYXRjaCh0KXtFbWJlci5vbmVycm9yKHQpfX1mdW5jdGlvbiByKCl7 IUVtYmVyLnJ1bi5jdXJyZW50UnVuTG9vcH17dmFyIG49ZnVuY3Rpb24oZSl7 RW1iZXIucnVuLmN1cnJlbnRSdW5Mb29wPWV9LGk9ZnVuY3Rpb24oZSx0KXtF bWJlci5ydW4uY3VycmVudFJ1bkxvb3A9dH0sbz10KCJiYWNrYnVybmVyIiku QmFja2J1cm5lcixhPW5ldyBvKFsic3luYyIsImFjdGlvbnMiLCJkZXN0cm95 Il0se3N5bmM6e2JlZm9yZTpFbWJlci5iZWdpblByb3BlcnR5Q2hhbmdlcyxh ZnRlcjpFbWJlci5lbmRQcm9wZXJ0eUNoYW5nZXN9LGRlZmF1bHRRdWV1ZToi YWN0aW9ucyIsb25CZWdpbjpuLG9uRW5kOml9KSxzPVtdLnNsaWNlO1tdLmNv bmNhdH1FbWJlci5ydW49ZnVuY3Rpb24oKXtyZXR1cm4gRW1iZXIub25lcnJv cj9lKGFyZ3VtZW50cyk6YS5ydW4uYXBwbHkoYSxhcmd1bWVudHMpfSxFbWJl ci5ydW4uam9pbj1mdW5jdGlvbigpe2lmKCFFbWJlci5ydW4uY3VycmVudFJ1 bkxvb3ApcmV0dXJuIEVtYmVyLnJ1bi5hcHBseShFbWJlci5ydW4sYXJndW1l bnRzKTt2YXIgZT1zLmNhbGwoYXJndW1lbnRzKTtlLnVuc2hpZnQoImFjdGlv bnMiKSxFbWJlci5ydW4uc2NoZWR1bGUuYXBwbHkoRW1iZXIucnVuLGUpfSxF bWJlci5ydW4uYmluZD1mdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cztyZXR1 cm4gZnVuY3Rpb24oKXtyZXR1cm4gRW1iZXIucnVuLmpvaW4uYXBwbHkoRW1i ZXIucnVuLGUpfX0sRW1iZXIucnVuLmJhY2tidXJuZXI9YTtFbWJlci5ydW47 RW1iZXIucnVuLmN1cnJlbnRSdW5Mb29wPW51bGwsRW1iZXIucnVuLnF1ZXVl cz1hLnF1ZXVlTmFtZXMsRW1iZXIucnVuLmJlZ2luPWZ1bmN0aW9uKCl7YS5i ZWdpbigpfSxFbWJlci5ydW4uZW5kPWZ1bmN0aW9uKCl7YS5lbmQoKX0sRW1i ZXIucnVuLnNjaGVkdWxlPWZ1bmN0aW9uKCl7cigpLGEuc2NoZWR1bGUuYXBw bHkoYSxhcmd1bWVudHMpfSxFbWJlci5ydW4uaGFzU2NoZWR1bGVkVGltZXJz PWZ1bmN0aW9uKCl7cmV0dXJuIGEuaGFzVGltZXJzKCl9LEVtYmVyLnJ1bi5j YW5jZWxUaW1lcnM9ZnVuY3Rpb24oKXthLmNhbmNlbFRpbWVycygpfSxFbWJl ci5ydW4uc3luYz1mdW5jdGlvbigpe2EuY3VycmVudEluc3RhbmNlJiZhLmN1 cnJlbnRJbnN0YW5jZS5xdWV1ZXMuc3luYy5mbHVzaCgpfSxFbWJlci5ydW4u bGF0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gYS5sYXRlci5hcHBseShhLGFyZ3Vt ZW50cyl9LEVtYmVyLnJ1bi5vbmNlPWZ1bmN0aW9uKCl7cigpO3ZhciBlPXMu Y2FsbChhcmd1bWVudHMpO3JldHVybiBlLnVuc2hpZnQoImFjdGlvbnMiKSxh LnNjaGVkdWxlT25jZS5hcHBseShhLGUpfSxFbWJlci5ydW4uc2NoZWR1bGVP bmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHIoKSxhLnNjaGVkdWxlT25jZS5hcHBs eShhLGFyZ3VtZW50cyl9LEVtYmVyLnJ1bi5uZXh0PWZ1bmN0aW9uKCl7dmFy IGU9cy5jYWxsKGFyZ3VtZW50cyk7cmV0dXJuIGUucHVzaCgxKSxhLmxhdGVy LmFwcGx5KGEsZSl9LEVtYmVyLnJ1bi5jYW5jZWw9ZnVuY3Rpb24oZSl7cmV0 dXJuIGEuY2FuY2VsKGUpfSxFbWJlci5ydW4uZGVib3VuY2U9ZnVuY3Rpb24o KXtyZXR1cm4gYS5kZWJvdW5jZS5hcHBseShhLGFyZ3VtZW50cyl9LEVtYmVy LnJ1bi50aHJvdHRsZT1mdW5jdGlvbigpe3JldHVybiBhLnRocm90dGxlLmFw cGx5KGEsYXJndW1lbnRzKX19KCksZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUs dCl7cmV0dXJuIHIobyh0KT9FbWJlci5sb29rdXA6ZSx0KX1mdW5jdGlvbiB0 KGUsdCl7Zm9yKHZhciByIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShyKSYmKGVb cl09dFtyXSl9RW1iZXIuTE9HX0JJTkRJTkdTPSExfHwhIUVtYmVyLkVOVi5M T0dfQklORElOR1M7dmFyIHI9RW1iZXIuZ2V0LG49KEVtYmVyLnNldCxFbWJl ci5ndWlkRm9yKSxpPS9eKFtBLVokXXwoWzAtOV1bQS1aJF0pKS8sbz1FbWJl ci5pc0dsb2JhbFBhdGg9ZnVuY3Rpb24oZSl7cmV0dXJuIGkudGVzdChlKX0s YT1mdW5jdGlvbihlLHQpe3RoaXMuX2RpcmVjdGlvbj0iZndkIix0aGlzLl9m cm9tPXQsdGhpcy5fdG89ZSx0aGlzLl9kaXJlY3Rpb25NYXA9RW1iZXIuTWFw LmNyZWF0ZSgpfTthLnByb3RvdHlwZT17Y29weTpmdW5jdGlvbigpe3ZhciBl PW5ldyBhKHRoaXMuX3RvLHRoaXMuX2Zyb20pO3JldHVybiB0aGlzLl9vbmVX YXkmJihlLl9vbmVXYXk9ITApLGV9LGZyb206ZnVuY3Rpb24oZSl7cmV0dXJu IHRoaXMuX2Zyb209ZSx0aGlzfSx0bzpmdW5jdGlvbihlKXtyZXR1cm4gdGhp cy5fdG89ZSx0aGlzfSxvbmVXYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5f b25lV2F5PSEwLHRoaXN9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7dmFyIGU9dGhp cy5fb25lV2F5PyJbb25lV2F5XSI6IiI7cmV0dXJuIkVtYmVyLkJpbmRpbmc8 IituKHRoaXMpKyI+KCIrdGhpcy5fZnJvbSsiIC0+ICIrdGhpcy5fdG8rIiki K2V9LGNvbm5lY3Q6ZnVuY3Rpb24odCl7dmFyIHI9dGhpcy5fZnJvbSxuPXRo aXMuX3RvO3JldHVybiBFbWJlci50cnlTZXQodCxuLGUodCxyKSksRW1iZXIu YWRkT2JzZXJ2ZXIodCxyLHRoaXMsdGhpcy5mcm9tRGlkQ2hhbmdlKSx0aGlz Ll9vbmVXYXl8fEVtYmVyLmFkZE9ic2VydmVyKHQsbix0aGlzLHRoaXMudG9E aWRDaGFuZ2UpLHRoaXMuX3JlYWR5VG9TeW5jPSEwLHRoaXN9LGRpc2Nvbm5l Y3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9IXRoaXMuX29uZVdheTtyZXR1cm4gRW1i ZXIucmVtb3ZlT2JzZXJ2ZXIoZSx0aGlzLl9mcm9tLHRoaXMsdGhpcy5mcm9t RGlkQ2hhbmdlKSx0JiZFbWJlci5yZW1vdmVPYnNlcnZlcihlLHRoaXMuX3Rv LHRoaXMsdGhpcy50b0RpZENoYW5nZSksdGhpcy5fcmVhZHlUb1N5bmM9ITEs dGhpc30sZnJvbURpZENoYW5nZTpmdW5jdGlvbihlKXt0aGlzLl9zY2hlZHVs ZVN5bmMoZSwiZndkIil9LHRvRGlkQ2hhbmdlOmZ1bmN0aW9uKGUpe3RoaXMu X3NjaGVkdWxlU3luYyhlLCJiYWNrIil9LF9zY2hlZHVsZVN5bmM6ZnVuY3Rp b24oZSx0KXt2YXIgcj10aGlzLl9kaXJlY3Rpb25NYXAsbj1yLmdldChlKTtu fHwoRW1iZXIucnVuLnNjaGVkdWxlKCJzeW5jIix0aGlzLHRoaXMuX3N5bmMs ZSksci5zZXQoZSx0KSksImJhY2siPT09biYmImZ3ZCI9PT10JiZyLnNldChl LCJmd2QiKX0sX3N5bmM6ZnVuY3Rpb24odCl7dmFyIG49RW1iZXIuTE9HX0JJ TkRJTkdTO2lmKCF0LmlzRGVzdHJveWVkJiZ0aGlzLl9yZWFkeVRvU3luYyl7 dmFyIGk9dGhpcy5fZGlyZWN0aW9uTWFwLG89aS5nZXQodCksYT10aGlzLl9m cm9tLHM9dGhpcy5fdG87aWYoaS5yZW1vdmUodCksImZ3ZCI9PT1vKXt2YXIg dT1lKHQsdGhpcy5fZnJvbSk7biYmRW1iZXIuTG9nZ2VyLmxvZygiICIsdGhp cy50b1N0cmluZygpLCItPiIsdSx0KSx0aGlzLl9vbmVXYXk/RW1iZXIudHJ5 U2V0KHQscyx1KTpFbWJlci5fc3VzcGVuZE9ic2VydmVyKHQscyx0aGlzLHRo aXMudG9EaWRDaGFuZ2UsZnVuY3Rpb24oKXtFbWJlci50cnlTZXQodCxzLHUp fSl9ZWxzZSBpZigiYmFjayI9PT1vKXt2YXIgbD1yKHQsdGhpcy5fdG8pO24m JkVtYmVyLkxvZ2dlci5sb2coIiAiLHRoaXMudG9TdHJpbmcoKSwiPC0iLGws dCksRW1iZXIuX3N1c3BlbmRPYnNlcnZlcih0LGEsdGhpcyx0aGlzLmZyb21E aWRDaGFuZ2UsZnVuY3Rpb24oKXtFbWJlci50cnlTZXQoRW1iZXIuaXNHbG9i YWxQYXRoKGEpP0VtYmVyLmxvb2t1cDp0LGEsbCl9KX19fX0sdChhLHtmcm9t OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PW5ldyBlO3JldHVybiB0LmZyb20u YXBwbHkodCxhcmd1bWVudHMpfSx0bzpmdW5jdGlvbigpe3ZhciBlPXRoaXMs dD1uZXcgZTtyZXR1cm4gdC50by5hcHBseSh0LGFyZ3VtZW50cyl9LG9uZVdh eTpmdW5jdGlvbihlLHQpe3ZhciByPXRoaXMsbj1uZXcgcihudWxsLGUpO3Jl dHVybiBuLm9uZVdheSh0KX19KSxFbWJlci5CaW5kaW5nPWEsRW1iZXIuYmlu ZD1mdW5jdGlvbihlLHQscil7cmV0dXJuIG5ldyBFbWJlci5CaW5kaW5nKHQs cikuY29ubmVjdChlKX0sRW1iZXIub25lV2F5PWZ1bmN0aW9uKGUsdCxyKXty ZXR1cm4gbmV3IEVtYmVyLkJpbmRpbmcodCxyKS5vbmVXYXkoKS5jb25uZWN0 KGUpfX0oKSxmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt2YXIgZSx0PXRoaXMu X19uZXh0U3VwZXI7cmV0dXJuIHQmJih0aGlzLl9fbmV4dFN1cGVyPW51bGws ZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9fbmV4dFN1cGVyPXQp LGV9ZnVuY3Rpb24gdChlKXt2YXIgdD1OKGUsITApLHI9dC5taXhpbnM7cmV0 dXJuIHI/dC5oYXNPd25Qcm9wZXJ0eSgibWl4aW5zIil8fChyPXQubWl4aW5z PXgocikpOnI9dC5taXhpbnM9e30scn1mdW5jdGlvbiByKGUsdCl7cmV0dXJu IHQmJnQubGVuZ3RoPjAmJihlLm1peGlucz1PLmNhbGwodCxmdW5jdGlvbihl KXtpZihlIGluc3RhbmNlb2YgXylyZXR1cm4gZTt2YXIgdD1uZXcgXztyZXR1 cm4gdC5wcm9wZXJ0aWVzPWUsdH0pKSxlfWZ1bmN0aW9uIG4oZSl7cmV0dXJu ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUuaXNNZXRob2QhPT0hMSYmZSE9PUJv b2xlYW4mJmUhPT1PYmplY3QmJmUhPT1OdW1iZXImJmUhPT1BcnJheSYmZSE9 PURhdGUmJmUhPT1TdHJpbmd9ZnVuY3Rpb24gaShlLHQpe3ZhciByO3JldHVy biB0IGluc3RhbmNlb2YgXz8ocj1WKHQpLGVbcl0/RDooZVtyXT10LHQucHJv cGVydGllcykpOnR9ZnVuY3Rpb24gbyhlLHQscixuKXt2YXIgaTtyZXR1cm4g aT1yW2VdfHxuW2VdLHRbZV0mJihpPWk/aS5jb25jYXQodFtlXSk6dFtlXSks aX1mdW5jdGlvbiBhKGUsdCxyLG4saSl7dmFyIG87cmV0dXJuIHZvaWQgMD09 PW5bdF0mJihvPWlbdF0pLG89b3x8ZS5kZXNjc1t0XSxvJiZvIGluc3RhbmNl b2YgRW1iZXIuQ29tcHV0ZWRQcm9wZXJ0eT8ocj14KHIpLHIuZnVuYz1FbWJl ci53cmFwKHIuZnVuYyxvLmZ1bmMpLHIpOnJ9ZnVuY3Rpb24gcyhlLHQscixu LGkpe3ZhciBvO3JldHVybiB2b2lkIDA9PT1pW3RdJiYobz1uW3RdKSxvPW98 fGVbdF0sImZ1bmN0aW9uIiE9dHlwZW9mIG8/cjpFbWJlci53cmFwKHIsbyl9 ZnVuY3Rpb24gdShlLHQscixuKXt2YXIgaT1uW3RdfHxlW3RdO3JldHVybiBp PyJmdW5jdGlvbiI9PXR5cGVvZiBpLmNvbmNhdD9pLmNvbmNhdChyKTpFbWJl ci5tYWtlQXJyYXkoaSkuY29uY2F0KHIpOkVtYmVyLm1ha2VBcnJheShyKX1m dW5jdGlvbiBsKHQscixpLG8pe3ZhciBhPW9bcl18fHRbcl07aWYoIWEpcmV0 dXJuIGk7dmFyIHU9RW1iZXIubWVyZ2Uoe30sYSksbD0hMTtmb3IodmFyIGMg aW4gaSlpZihpLmhhc093blByb3BlcnR5KGMpKXt2YXIgaD1pW2NdO24oaCk/ KGw9ITAsdVtjXT1zKHQsYyxoLGEse30pKTp1W2NdPWh9cmV0dXJuIGwmJih1 Ll9zdXBlcj1lKSx1fWZ1bmN0aW9uIGMoZSx0LHIsaSxvLGMsaCxtKXtpZihy IGluc3RhbmNlb2YgRW1iZXIuRGVzY3JpcHRvcil7aWYocj09PXcmJm9bdF0p cmV0dXJuIEQ7ci5mdW5jJiYocj1hKGksdCxyLGMsbykpLG9bdF09cixjW3Rd PXZvaWQgMH1lbHNlIGgmJlAuY2FsbChoLHQpPj0wfHwiY29uY2F0ZW5hdGVk UHJvcGVydGllcyI9PT10fHwibWVyZ2VkUHJvcGVydGllcyI9PT10P3I9dShl LHQscixjKTptJiZQLmNhbGwobSx0KT49MD9yPWwoZSx0LHIsYyk6bihyKSYm KHI9cyhlLHQscixjLG8pKSxvW3RdPXZvaWQgMCxjW3RdPXJ9ZnVuY3Rpb24g aChlLHQscixuLGEscyl7ZnVuY3Rpb24gdShlKXtkZWxldGUgcltlXSxkZWxl dGUgbltlXX1mb3IodmFyIGwsbSxwLGYsZCxiLEU9MCx2PWUubGVuZ3RoO3Y+ RTtFKyspaWYobD1lW0VdLG09aSh0LGwpLG0hPT1EKWlmKG0pe2I9TihhKSxh LndpbGxNZXJnZU1peGluJiZhLndpbGxNZXJnZU1peGluKG0pLGY9bygiY29u Y2F0ZW5hdGVkUHJvcGVydGllcyIsbSxuLGEpLGQ9bygibWVyZ2VkUHJvcGVy dGllcyIsbSxuLGEpO2ZvcihwIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShwKSYm KHMucHVzaChwKSxjKGEscCxtW3BdLGIscixuLGYsZCkpO20uaGFzT3duUHJv cGVydHkoInRvU3RyaW5nIikmJihhLnRvU3RyaW5nPW0udG9TdHJpbmcpfWVs c2UgbC5taXhpbnMmJihoKGwubWl4aW5zLHQscixuLGEscyksbC5fd2l0aG91 dCYmQS5jYWxsKGwuX3dpdGhvdXQsdSkpfWZ1bmN0aW9uIG0oZSx0LHIsbil7 aWYoTS50ZXN0KHQpKXt2YXIgaT1uLmJpbmRpbmdzO2k/bi5oYXNPd25Qcm9w ZXJ0eSgiYmluZGluZ3MiKXx8KGk9bi5iaW5kaW5ncz14KG4uYmluZGluZ3Mp KTppPW4uYmluZGluZ3M9e30saVt0XT1yfX1mdW5jdGlvbiBwKGUsdCl7dmFy IHIsbixpLG89dC5iaW5kaW5ncztpZihvKXtmb3IociBpbiBvKW49b1tyXSxu JiYoaT1yLnNsaWNlKDAsLTcpLG4gaW5zdGFuY2VvZiBFbWJlci5CaW5kaW5n PyhuPW4uY29weSgpLG4udG8oaSkpOm49bmV3IEVtYmVyLkJpbmRpbmcoaSxu KSxuLmNvbm5lY3QoZSksZVtyXT1uKTt0LmJpbmRpbmdzPXt9fX1mdW5jdGlv biBmKGUsdCl7cmV0dXJuIHAoZSx0fHxOKGUpKSxlfWZ1bmN0aW9uIGQoZSx0 LHIsbixpKXt2YXIgbyxhPXQubWV0aG9kTmFtZTtyZXR1cm4gblthXXx8aVth XT8obz1pW2FdLHQ9blthXSk6ci5kZXNjc1thXT8odD1yLmRlc2NzW2FdLG89 dm9pZCAwKToodD12b2lkIDAsbz1lW2FdKSx7ZGVzYzp0LHZhbHVlOm99fWZ1 bmN0aW9uIGIoZSx0LHIsbixpKXt2YXIgbz1yW25dO2lmKG8pZm9yKHZhciBh PTAscz1vLmxlbmd0aDtzPmE7YSsrKUVtYmVyW2ldKGUsb1thXSxudWxsLHQp fWZ1bmN0aW9uIEUoZSx0LHIpe3ZhciBuPWVbdF07ImZ1bmN0aW9uIj09dHlw ZW9mIG4mJihiKGUsdCxuLCJfX2VtYmVyX29ic2VydmVzQmVmb3JlX18iLCJy ZW1vdmVCZWZvcmVPYnNlcnZlciIpLGIoZSx0LG4sIl9fZW1iZXJfb2JzZXJ2 ZXNfXyIsInJlbW92ZU9ic2VydmVyIiksYihlLHQsbiwiX19lbWJlcl9saXN0 ZW5zX18iLCJyZW1vdmVMaXN0ZW5lciIpKSwiZnVuY3Rpb24iPT10eXBlb2Yg ciYmKGIoZSx0LHIsIl9fZW1iZXJfb2JzZXJ2ZXNCZWZvcmVfXyIsImFkZEJl Zm9yZU9ic2VydmVyIiksYihlLHQsciwiX19lbWJlcl9vYnNlcnZlc19fIiwi YWRkT2JzZXJ2ZXIiKSxiKGUsdCxyLCJfX2VtYmVyX2xpc3RlbnNfXyIsImFk ZExpc3RlbmVyIikpfWZ1bmN0aW9uIHYocixuLGkpe3ZhciBvLGEscyx1PXt9 LGw9e30sYz1OKHIpLHA9W107ci5fc3VwZXI9ZSxoKG4sdChyKSx1LGwscixw KTtmb3IodmFyIGI9MCx2PXAubGVuZ3RoO3Y+YjtiKyspaWYobz1wW2JdLCJj b25zdHJ1Y3RvciIhPT1vJiZsLmhhc093blByb3BlcnR5KG8pJiYocz11W29d LGE9bFtvXSxzIT09dykpe2Zvcig7cyYmcyBpbnN0YW5jZW9mIEM7KXt2YXIg Zz1kKHIscyxjLHUsbCk7cz1nLmRlc2MsYT1nLnZhbHVlfSh2b2lkIDAhPT1z fHx2b2lkIDAhPT1hKSYmKEUocixvLGEpLG0ocixvLGEsYyksUyhyLG8scyxh LGMpKX1yZXR1cm4gaXx8ZihyLGMpLHJ9ZnVuY3Rpb24gZyhlLHQscil7dmFy IG49VihlKTtpZihyW25dKXJldHVybiExO2lmKHJbbl09ITAsZT09PXQpcmV0 dXJuITA7Zm9yKHZhciBpPWUubWl4aW5zLG89aT9pLmxlbmd0aDowOy0tbz49 MDspaWYoZyhpW29dLHQscikpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24g eShlLHQscil7aWYoIXJbVih0KV0paWYocltWKHQpXT0hMCx0LnByb3BlcnRp ZXMpe3ZhciBuPXQucHJvcGVydGllcztmb3IodmFyIGkgaW4gbiluLmhhc093 blByb3BlcnR5KGkpJiYoZVtpXT0hMCl9ZWxzZSB0Lm1peGlucyYmQS5jYWxs KHQubWl4aW5zLGZ1bmN0aW9uKHQpe3koZSx0LHIpfSl9dmFyIF8sdyxDLE89 RW1iZXIuQXJyYXlQb2x5ZmlsbHMubWFwLFA9RW1iZXIuQXJyYXlQb2x5Zmls bHMuaW5kZXhPZixBPUVtYmVyLkFycmF5UG9seWZpbGxzLmZvckVhY2gsVD1b XS5zbGljZSx4PUVtYmVyLmNyZWF0ZSxTPUVtYmVyLmRlZmluZVByb3BlcnR5 LFY9RW1iZXIuZ3VpZEZvcixOPUVtYmVyLm1ldGEsUj1FbWJlci5NRVRBX0tF WSxJPUVtYmVyLmV4cGFuZFByb3BlcnRpZXMsRD17fSxNPUVtYmVyLklTX0JJ TkRJTkc9L14uK0JpbmRpbmckLztFbWJlci5taXhpbj1mdW5jdGlvbihlKXt2 YXIgdD1ULmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiB2KGUsdCwhMSksZX0s RW1iZXIuTWl4aW49ZnVuY3Rpb24oKXtyZXR1cm4gcih0aGlzLGFyZ3VtZW50 cyl9LF89RW1iZXIuTWl4aW4sXy5wcm90b3R5cGU9e3Byb3BlcnRpZXM6bnVs bCxtaXhpbnM6bnVsbCxvd25lckNvbnN0cnVjdG9yOm51bGx9LF8uX2FwcGx5 PXYsXy5hcHBseVBhcnRpYWw9ZnVuY3Rpb24oZSl7dmFyIHQ9VC5jYWxsKGFy Z3VtZW50cywxKTtyZXR1cm4gdihlLHQsITApfSxfLmZpbmlzaFBhcnRpYWw9 ZixFbWJlci5hbnlVbnByb2Nlc3NlZE1peGlucz0hMSxfLmNyZWF0ZT1mdW5j dGlvbigpe0VtYmVyLmFueVVucHJvY2Vzc2VkTWl4aW5zPSEwO3ZhciBlPXRo aXM7cmV0dXJuIHIobmV3IGUsYXJndW1lbnRzKX07dmFyIGs9Xy5wcm90b3R5 cGU7ay5yZW9wZW49ZnVuY3Rpb24oKXt2YXIgZSx0O3RoaXMucHJvcGVydGll cz8oZT1fLmNyZWF0ZSgpLGUucHJvcGVydGllcz10aGlzLnByb3BlcnRpZXMs ZGVsZXRlIHRoaXMucHJvcGVydGllcyx0aGlzLm1peGlucz1bZV0pOnRoaXMu bWl4aW5zfHwodGhpcy5taXhpbnM9W10pO3ZhciByLG49YXJndW1lbnRzLmxl bmd0aCxpPXRoaXMubWl4aW5zO2ZvcihyPTA7bj5yO3IrKyllPWFyZ3VtZW50 c1tyXSxlIGluc3RhbmNlb2YgXz9pLnB1c2goZSk6KHQ9Xy5jcmVhdGUoKSx0 LnByb3BlcnRpZXM9ZSxpLnB1c2godCkpO3JldHVybiB0aGlzfSxrLmFwcGx5 PWZ1bmN0aW9uKGUpe3JldHVybiB2KGUsW3RoaXNdLCExKX0say5hcHBseVBh cnRpYWw9ZnVuY3Rpb24oZSl7cmV0dXJuIHYoZSxbdGhpc10sITApfSxrLmRl dGVjdD1mdW5jdGlvbihlKXtpZighZSlyZXR1cm4hMTtpZihlIGluc3RhbmNl b2YgXylyZXR1cm4gZyhlLHRoaXMse30pO3ZhciB0PWVbUl0scj10JiZ0Lm1p eGlucztyZXR1cm4gcj8hIXJbVih0aGlzKV06ITF9LGsud2l0aG91dD1mdW5j dGlvbigpe3ZhciBlPW5ldyBfKHRoaXMpO3JldHVybiBlLl93aXRob3V0PVQu Y2FsbChhcmd1bWVudHMpLGV9LGsua2V5cz1mdW5jdGlvbigpe3ZhciBlPXt9 LHQ9e30scj1bXTt5KGUsdGhpcyx0KTtmb3IodmFyIG4gaW4gZSllLmhhc093 blByb3BlcnR5KG4pJiZyLnB1c2gobik7cmV0dXJuIHJ9LF8ubWl4aW5zPWZ1 bmN0aW9uKGUpe3ZhciB0PWVbUl0scj10JiZ0Lm1peGlucyxuPVtdO2lmKCFy KXJldHVybiBuO2Zvcih2YXIgaSBpbiByKXt2YXIgbz1yW2ldO28ucHJvcGVy dGllc3x8bi5wdXNoKG8pfXJldHVybiBufSx3PW5ldyBFbWJlci5EZXNjcmlw dG9yLHcudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iKFJlcXVpcmVkIFBy b3BlcnR5KSJ9LEVtYmVyLnJlcXVpcmVkPWZ1bmN0aW9uKCl7cmV0dXJuIHd9 LEM9ZnVuY3Rpb24oZSl7dGhpcy5tZXRob2ROYW1lPWV9LEMucHJvdG90eXBl PW5ldyBFbWJlci5EZXNjcmlwdG9yLEVtYmVyLmFsaWFzTWV0aG9kPWZ1bmN0 aW9uKGUpe3JldHVybiBuZXcgQyhlKX0sRW1iZXIub2JzZXJ2ZXI9ZnVuY3Rp b24oKXt2YXIgZSx0PVQuY2FsbChhcmd1bWVudHMsLTEpWzBdLHI9ZnVuY3Rp b24odCl7ZS5wdXNoKHQpfSxuPVQuY2FsbChhcmd1bWVudHMsMCwtMSk7ImZ1 bmN0aW9uIiE9dHlwZW9mIHQmJih0PWFyZ3VtZW50c1swXSxuPVQuY2FsbChh cmd1bWVudHMsMSkpLGU9W107Zm9yKHZhciBpPTA7aTxuLmxlbmd0aDsrK2kp SShuW2ldLHIpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBF bWJlci5FcnJvcigiRW1iZXIub2JzZXJ2ZXIgY2FsbGVkIHdpdGhvdXQgYSBm dW5jdGlvbiIpO3JldHVybiB0Ll9fZW1iZXJfb2JzZXJ2ZXNfXz1lLHR9LEVt YmVyLmltbWVkaWF0ZU9ic2VydmVyPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTAs dD1hcmd1bWVudHMubGVuZ3RoO3Q+ZTtlKyspe2FyZ3VtZW50c1tlXX1yZXR1 cm4gRW1iZXIub2JzZXJ2ZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxFbWJl ci5iZWZvcmVPYnNlcnZlcj1mdW5jdGlvbigpe3ZhciBlLHQ9VC5jYWxsKGFy Z3VtZW50cywtMSlbMF0scj1mdW5jdGlvbih0KXtlLnB1c2godCl9LG49VC5j YWxsKGFyZ3VtZW50cywwLC0xKTsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9 YXJndW1lbnRzWzBdLG49VC5jYWxsKGFyZ3VtZW50cywxKSksZT1bXTtmb3Io dmFyIGk9MDtpPG4ubGVuZ3RoOysraSlJKG5baV0scik7aWYoImZ1bmN0aW9u IiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVtYmVyLkVycm9yKCJFbWJlci5iZWZv cmVPYnNlcnZlciBjYWxsZWQgd2l0aG91dCBhIGZ1bmN0aW9uIik7cmV0dXJu IHQuX19lbWJlcl9vYnNlcnZlc0JlZm9yZV9fPWUsdH19KCksZnVuY3Rpb24o KXt2YXIgZT1FbWJlci5FbnVtZXJhYmxlVXRpbHMuZm9yRWFjaCx0PUVtYmVy LkVudW1lcmFibGVVdGlscy5pbmRleE9mO0VtYmVyLmxpYnJhcmllcz1mdW5j dGlvbigpe3ZhciByPVtdLG49MCxpPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0w O3Q8ci5sZW5ndGg7dCsrKWlmKHJbdF0ubmFtZT09PWUpcmV0dXJuIHJbdF19 O3JldHVybiByLnJlZ2lzdGVyPWZ1bmN0aW9uKGUsdCl7aShlKXx8ci5wdXNo KHtuYW1lOmUsdmVyc2lvbjp0fSl9LHIucmVnaXN0ZXJDb3JlTGlicmFyeT1m dW5jdGlvbihlLHQpe2koZSl8fHIuc3BsaWNlKG4rKywwLHtuYW1lOmUsdmVy c2lvbjp0fSl9LHIuZGVSZWdpc3Rlcj1mdW5jdGlvbihlKXt2YXIgbj1pKGUp O24mJnIuc3BsaWNlKHQocixuKSwxKX0sci5lYWNoPWZ1bmN0aW9uKHQpe2Uo cixmdW5jdGlvbihlKXt0KGUubmFtZSxlLnZlcnNpb24pfSl9LHJ9KCksRW1i ZXIubGlicmFyaWVzLnJlZ2lzdGVyQ29yZUxpYnJhcnkoIkVtYmVyIixFbWJl ci5WRVJTSU9OKX0oKSxmdW5jdGlvbigpe2UoInJzdnAvYWxsIixbIi4vcHJv bWlzZSIsImV4cG9ydHMiXSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0Ijt2 YXIgcj1lWyJkZWZhdWx0Il07dFsiZGVmYXVsdCJdPWZ1bmN0aW9uKGUsdCl7 cmV0dXJuIHIuYWxsKGUsdCl9fSksZSgicnN2cC9hbGxfc2V0dGxlZCIsWyIu L3Byb21pc2UiLCIuL3V0aWxzIiwiZXhwb3J0cyJdLGZ1bmN0aW9uKGUsdCxy KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbihlKXtyZXR1cm57c3RhdGU6ImZ1 bGZpbGxlZCIsdmFsdWU6ZX19ZnVuY3Rpb24gaShlKXtyZXR1cm57c3RhdGU6 InJlamVjdGVkIixyZWFzb246ZX19dmFyIG89ZVsiZGVmYXVsdCJdLGE9dC5p c0FycmF5LHM9dC5pc05vblRoZW5hYmxlO3JbImRlZmF1bHQiXT1mdW5jdGlv bihlLHQpe3JldHVybiBuZXcgbyhmdW5jdGlvbih0KXtmdW5jdGlvbiByKGUp e3JldHVybiBmdW5jdGlvbih0KXtsKGUsbih0KSl9fWZ1bmN0aW9uIHUoZSl7 cmV0dXJuIGZ1bmN0aW9uKHQpe2woZSxpKHQpKX19ZnVuY3Rpb24gbChlLHIp e21bZV09ciwwPT09LS1oJiZ0KG0pfWlmKCFhKGUpKXRocm93IG5ldyBUeXBl RXJyb3IoIllvdSBtdXN0IHBhc3MgYW4gYXJyYXkgdG8gYWxsU2V0dGxlZC4i KTt2YXIgYyxoPWUubGVuZ3RoO2lmKDA9PT1oKXJldHVybiB0KFtdKSx2b2lk IDA7Zm9yKHZhciBtPW5ldyBBcnJheShoKSxwPTA7cDxlLmxlbmd0aDtwKysp Yz1lW3BdLHMoYyk/bChwLG4oYykpOm8uY2FzdChjKS50aGVuKHIocCksdShw KSl9LHQpfX0pLGUoInJzdnAvY29uZmlnIixbIi4vZXZlbnRzIiwiZXhwb3J0 cyJdLGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0 KXtyZXR1cm4ib25lcnJvciI9PT1lPyhpLm9uKCJlcnJvciIsdCksdm9pZCAw KToyIT09YXJndW1lbnRzLmxlbmd0aD9pW2VdOihpW2VdPXQsdm9pZCAwKX12 YXIgbj1lWyJkZWZhdWx0Il0saT17aW5zdHJ1bWVudDohMX07bi5taXhpbihp KSx0LmNvbmZpZz1pLHQuY29uZmlndXJlPXJ9KSxlKCJyc3ZwL2RlZmVyIixb Ii4vcHJvbWlzZSIsImV4cG9ydHMiXSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3Ry aWN0Ijt2YXIgcj1lWyJkZWZhdWx0Il07dFsiZGVmYXVsdCJdPWZ1bmN0aW9u KGUpe3ZhciB0PXt9O3JldHVybiB0LnByb21pc2U9bmV3IHIoZnVuY3Rpb24o ZSxyKXt0LnJlc29sdmU9ZSx0LnJlamVjdD1yfSxlKSx0fX0pLGUoInJzdnAv ZXZlbnRzIixbImV4cG9ydHMiXSxmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7 dmFyIHQ9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIHI9MCxuPWUubGVuZ3RoO24+ cjtyKyspaWYoZVtyXT09PXQpcmV0dXJuIHI7cmV0dXJuLTF9LHI9ZnVuY3Rp b24oZSl7dmFyIHQ9ZS5fcHJvbWlzZUNhbGxiYWNrcztyZXR1cm4gdHx8KHQ9 ZS5fcHJvbWlzZUNhbGxiYWNrcz17fSksdH07ZVsiZGVmYXVsdCJdPXttaXhp bjpmdW5jdGlvbihlKXtyZXR1cm4gZS5vbj10aGlzLm9uLGUub2ZmPXRoaXMu b2ZmLGUudHJpZ2dlcj10aGlzLnRyaWdnZXIsZS5fcHJvbWlzZUNhbGxiYWNr cz12b2lkIDAsZX0sb246ZnVuY3Rpb24oZSxuKXt2YXIgaSxvPXIodGhpcyk7 aT1vW2VdLGl8fChpPW9bZV09W10pLC0xPT09dChpLG4pJiZpLnB1c2gobil9 LG9mZjpmdW5jdGlvbihlLG4pe3ZhciBpLG8sYT1yKHRoaXMpO3JldHVybiBu PyhpPWFbZV0sbz10KGksbiksLTEhPT1vJiZpLnNwbGljZShvLDEpLHZvaWQg MCk6KGFbZV09W10sdm9pZCAwKX0sdHJpZ2dlcjpmdW5jdGlvbihlLHQpe3Zh ciBuLGksbz1yKHRoaXMpO2lmKG49b1tlXSlmb3IodmFyIGE9MDthPG4ubGVu Z3RoO2ErKykoaT1uW2FdKSh0KX19fSksZSgicnN2cC9maWx0ZXIiLFsiLi9h bGwiLCIuL21hcCIsIi4vdXRpbHMiLCJleHBvcnRzIl0sZnVuY3Rpb24oZSx0 LHIsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoZSx0LHIpe3JldHVybiBv KGUscikudGhlbihmdW5jdGlvbihuKXtpZighdShlKSl0aHJvdyBuZXcgVHlw ZUVycm9yKCJZb3UgbXVzdCBwYXNzIGFuIGFycmF5IHRvIGZpbHRlci4iKTtp Zighcyh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJZb3UgbXVzdCBwYXNzIGEg ZnVuY3Rpb24gdG8gZmlsdGVyJ3Mgc2Vjb25kIGFyZ3VtZW50LiIpO3JldHVy biBhKGUsdCxyKS50aGVuKGZ1bmN0aW9uKGUpe3ZhciB0LHI9bi5sZW5ndGgs aT1bXTtmb3IodD0wO3I+dDt0KyspZVt0XSYmaS5wdXNoKG5bdF0pO3JldHVy biBpfSl9KX12YXIgbz1lWyJkZWZhdWx0Il0sYT10WyJkZWZhdWx0Il0scz1y LmlzRnVuY3Rpb24sdT1yLmlzQXJyYXk7blsiZGVmYXVsdCJdPWl9KSxlKCJy c3ZwL2hhc2giLFsiLi9wcm9taXNlIiwiLi91dGlscyIsImV4cG9ydHMiXSxm dW5jdGlvbihlLHQscil7InVzZSBzdHJpY3QiO3ZhciBuPWVbImRlZmF1bHQi XSxpPXQuaXNOb25UaGVuYWJsZSxvPXQua2V5c09mO3JbImRlZmF1bHQiXT1m dW5jdGlvbihlKXtyZXR1cm4gbmV3IG4oZnVuY3Rpb24odCxyKXtmdW5jdGlv biBhKGUpe3JldHVybiBmdW5jdGlvbihyKXtjW2VdPXIsMD09PS0tbSYmdChj KX19ZnVuY3Rpb24gcyhlKXttPTAscihlKX12YXIgdSxsLGM9e30saD1vKGUp LG09aC5sZW5ndGg7aWYoMD09PW0pcmV0dXJuIHQoYyksdm9pZCAwO2Zvcih2 YXIgcD0wO3A8aC5sZW5ndGg7cCsrKWw9aFtwXSx1PWVbbF0saSh1KT8oY1ts XT11LDA9PT0tLW0mJnQoYykpOm4uY2FzdCh1KS50aGVuKGEobCkscyl9KX19 KSxlKCJyc3ZwL2luc3RydW1lbnQiLFsiLi9jb25maWciLCIuL3V0aWxzIiwi ZXhwb3J0cyJdLGZ1bmN0aW9uKGUsdCxyKXsidXNlIHN0cmljdCI7dmFyIG49 ZS5jb25maWcsaT10Lm5vdztyWyJkZWZhdWx0Il09ZnVuY3Rpb24oZSx0LHIp e3RyeXtuLnRyaWdnZXIoZSx7Z3VpZDp0Ll9ndWlkS2V5K3QuX2lkLGV2ZW50 TmFtZTplLGRldGFpbDp0Ll9kZXRhaWwsY2hpbGRHdWlkOnImJnQuX2d1aWRL ZXkrci5faWQsbGFiZWw6dC5fbGFiZWwsdGltZVN0YW1wOmkoKSxzdGFjazpu ZXcgRXJyb3IodC5fbGFiZWwpLnN0YWNrfSl9Y2F0Y2gobyl7c2V0VGltZW91 dChmdW5jdGlvbigpe3Rocm93IG99LDApfX19KSxlKCJyc3ZwL21hcCIsWyIu L3Byb21pc2UiLCIuL2FsbCIsIi4vdXRpbHMiLCJleHBvcnRzIl0sZnVuY3Rp b24oZSx0LHIsbil7InVzZSBzdHJpY3QiO3ZhciBpPShlWyJkZWZhdWx0Il0s dFsiZGVmYXVsdCJdKSxvPXIuaXNBcnJheSxhPXIuaXNGdW5jdGlvbjtuWyJk ZWZhdWx0Il09ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBpKGUscikudGhlbihm dW5jdGlvbihuKXtpZighbyhlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJZb3Ug bXVzdCBwYXNzIGFuIGFycmF5IHRvIG1hcC4iKTtpZighYSh0KSl0aHJvdyBu ZXcgVHlwZUVycm9yKCJZb3UgbXVzdCBwYXNzIGEgZnVuY3Rpb24gdG8gbWFw J3Mgc2Vjb25kIGFyZ3VtZW50LiIpO3ZhciBzLHU9bi5sZW5ndGgsbD1bXTtm b3Iocz0wO3U+cztzKyspbC5wdXNoKHQobltzXSkpO3JldHVybiBpKGwscil9 KX19KSxlKCJyc3ZwL25vZGUiLFsiLi9wcm9taXNlIiwiZXhwb3J0cyJdLGZ1 bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXtyZXR1 cm4gZnVuY3Rpb24ocixuKXtyP3Qocik6YXJndW1lbnRzLmxlbmd0aD4yP2Uo aS5jYWxsKGFyZ3VtZW50cywxKSk6ZShuKX19dmFyIG49ZVsiZGVmYXVsdCJd LGk9QXJyYXkucHJvdG90eXBlLnNsaWNlO3RbImRlZmF1bHQiXT1mdW5jdGlv bihlLHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBvPWkuY2FsbChhcmd1bWVu dHMpLGE9dGhpc3x8dDtyZXR1cm4gbmV3IG4oZnVuY3Rpb24odCxpKXtuLmFs bChvKS50aGVuKGZ1bmN0aW9uKG4pe3RyeXtuLnB1c2gocih0LGkpKSxlLmFw cGx5KGEsbil9Y2F0Y2gobyl7aShvKX19KX0pfX19KSxlKCJyc3ZwL3Byb21p c2UiLFsiLi9jb25maWciLCIuL2V2ZW50cyIsIi4vaW5zdHJ1bWVudCIsIi4v dXRpbHMiLCIuL3Byb21pc2UvY2FzdCIsIi4vcHJvbWlzZS9hbGwiLCIuL3By b21pc2UvcmFjZSIsIi4vcHJvbWlzZS9yZXNvbHZlIiwiLi9wcm9taXNlL3Jl amVjdCIsImV4cG9ydHMiXSxmdW5jdGlvbihlLHQscixuLGksbyxhLHMsdSxs KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYygpe31mdW5jdGlvbiBoKGUsdCl7 aWYoIVAoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiWW91IG11c3QgcGFzcyBh IHJlc29sdmVyIGZ1bmN0aW9uIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0 aGUgcHJvbWlzZSBjb25zdHJ1Y3RvciIpO2lmKCEodGhpcyBpbnN0YW5jZW9m IGgpKXRocm93IG5ldyBUeXBlRXJyb3IoIkZhaWxlZCB0byBjb25zdHJ1Y3Qg J1Byb21pc2UnOiBQbGVhc2UgdXNlIHRoZSAnbmV3JyBvcGVyYXRvciwgdGhp cyBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1 bmN0aW9uLiIpO3RoaXMuX2lkPUkrKyx0aGlzLl9sYWJlbD10LHRoaXMuX3N1 YnNjcmliZXJzPVtdLHcuaW5zdHJ1bWVudCYmQygiY3JlYXRlZCIsdGhpcyks YyE9PWUmJm0oZSx0aGlzKX1mdW5jdGlvbiBtKGUsdCl7ZnVuY3Rpb24gcihl KXtFKHQsZSl9ZnVuY3Rpb24gbihlKXtnKHQsZSl9dHJ5e2UocixuKX1jYXRj aChpKXtuKGkpfX1mdW5jdGlvbiBwKGUsdCxyLG4pe3ZhciBpPWUuX3N1YnNj cmliZXJzLG89aS5sZW5ndGg7aVtvXT10LGlbbytrXT1yLGlbbytqXT1ufWZ1 bmN0aW9uIGYoZSx0KXt2YXIgcixuLGk9ZS5fc3Vic2NyaWJlcnMsbz1lLl9k ZXRhaWw7dy5pbnN0cnVtZW50JiZDKHQ9PT1rPyJmdWxmaWxsZWQiOiJyZWpl Y3RlZCIsZSk7Zm9yKHZhciBhPTA7YTxpLmxlbmd0aDthKz0zKXI9aVthXSxu PWlbYSt0XSxkKHQscixuLG8pO2UuX3N1YnNjcmliZXJzPW51bGx9ZnVuY3Rp b24gZChlLHQscixuKXt2YXIgaSxvLGEscyx1PVAocik7aWYodSl0cnl7aT1y KG4pLGE9ITB9Y2F0Y2gobCl7cz0hMCxvPWx9ZWxzZSBpPW4sYT0hMDtiKHQs aSl8fCh1JiZhP0UodCxpKTpzP2codCxvKTplPT09az9FKHQsaSk6ZT09PWom JmcodCxpKSl9ZnVuY3Rpb24gYihlLHQpe3ZhciByLG49bnVsbDt0cnl7aWYo ZT09PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQSBwcm9taXNlcyBjYWxsYmFj ayBjYW5ub3QgcmV0dXJuIHRoYXQgc2FtZSBwcm9taXNlLiIpO2lmKE8odCkm JihuPXQudGhlbixQKG4pKSlyZXR1cm4gbi5jYWxsKHQsZnVuY3Rpb24obil7 cmV0dXJuIHI/ITA6KHI9ITAsdCE9PW4/RShlLG4pOnYoZSxuKSx2b2lkIDAp fSxmdW5jdGlvbih0KXtyZXR1cm4gcj8hMDoocj0hMCxnKGUsdCksdm9pZCAw KX0sImRlcml2ZWQgZnJvbTogIisoZS5fbGFiZWx8fCIgdW5rbm93biBwcm9t aXNlIikpLCEwfWNhdGNoKGkpe3JldHVybiByPyEwOihnKGUsaSksITApfXJl dHVybiExfWZ1bmN0aW9uIEUoZSx0KXtlPT09dD92KGUsdCk6YihlLHQpfHx2 KGUsdCl9ZnVuY3Rpb24gdihlLHQpe2UuX3N0YXRlPT09RCYmKGUuX3N0YXRl PU0sZS5fZGV0YWlsPXQsdy5hc3luYyh5LGUpKX1mdW5jdGlvbiBnKGUsdCl7 ZS5fc3RhdGU9PT1EJiYoZS5fc3RhdGU9TSxlLl9kZXRhaWw9dCx3LmFzeW5j KF8sZSkpfWZ1bmN0aW9uIHkoZSl7ZihlLGUuX3N0YXRlPWspfWZ1bmN0aW9u IF8oZSl7ZS5fb25lcnJvciYmZS5fb25lcnJvcihlLl9kZXRhaWwpLGYoZSxl Ll9zdGF0ZT1qKX12YXIgdz1lLmNvbmZpZyxDPSh0WyJkZWZhdWx0Il0sclsi ZGVmYXVsdCJdKSxPPW4ub2JqZWN0T3JGdW5jdGlvbixQPW4uaXNGdW5jdGlv bixBPW4ubm93LFQ9aVsiZGVmYXVsdCJdLHg9b1siZGVmYXVsdCJdLFM9YVsi ZGVmYXVsdCJdLFY9c1siZGVmYXVsdCJdLE49dVsiZGVmYXVsdCJdLFI9InJz dnBfIitBKCkrIi0iLEk9MDtsWyJkZWZhdWx0Il09aCxoLmNhc3Q9VCxoLmFs bD14LGgucmFjZT1TLGgucmVzb2x2ZT1WLGgucmVqZWN0PU47dmFyIEQ9dm9p ZCAwLE09MCxrPTEsaj0yO2gucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpoLF9p ZDp2b2lkIDAsX2d1aWRLZXk6UixfbGFiZWw6dm9pZCAwLF9zdGF0ZTp2b2lk IDAsX2RldGFpbDp2b2lkIDAsX3N1YnNjcmliZXJzOnZvaWQgMCxfb25lcnJv cjpmdW5jdGlvbihlKXt3LnRyaWdnZXIoImVycm9yIixlKX0sdGhlbjpmdW5j dGlvbihlLHQscil7dmFyIG49dGhpczt0aGlzLl9vbmVycm9yPW51bGw7dmFy IGk9bmV3IHRoaXMuY29uc3RydWN0b3IoYyxyKTtpZih0aGlzLl9zdGF0ZSl7 dmFyIG89YXJndW1lbnRzO3cuYXN5bmMoZnVuY3Rpb24oKXtkKG4uX3N0YXRl LGksb1tuLl9zdGF0ZS0xXSxuLl9kZXRhaWwpfSl9ZWxzZSBwKHRoaXMsaSxl LHQpO3JldHVybiB3Lmluc3RydW1lbnQmJkMoImNoYWluZWQiLG4saSksaX0s ImNhdGNoIjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnRoZW4obnVsbCxl LHQpfSwiZmluYWxseSI6ZnVuY3Rpb24oZSx0KXt2YXIgcj10aGlzLmNvbnN0 cnVjdG9yO3JldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24odCl7cmV0dXJuIHIu Y2FzdChlKCkpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gdH0pfSxmdW5jdGlv bih0KXtyZXR1cm4gci5jYXN0KGUoKSkudGhlbihmdW5jdGlvbigpe3Rocm93 IHR9KX0sdCl9fX0pLGUoInJzdnAvcHJvbWlzZS9hbGwiLFsiLi4vdXRpbHMi LCJleHBvcnRzIl0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7dmFyIHI9 ZS5pc0FycmF5LG49ZS5pc05vblRoZW5hYmxlO3RbImRlZmF1bHQiXT1mdW5j dGlvbihlLHQpe3ZhciBpPXRoaXM7cmV0dXJuIG5ldyBpKGZ1bmN0aW9uKHQs byl7ZnVuY3Rpb24gYShlKXtyZXR1cm4gZnVuY3Rpb24ocil7Y1tlXT1yLDA9 PT0tLWwmJnQoYyl9fWZ1bmN0aW9uIHMoZSl7bD0wLG8oZSl9aWYoIXIoZSkp dGhyb3cgbmV3IFR5cGVFcnJvcigiWW91IG11c3QgcGFzcyBhbiBhcnJheSB0 byBhbGwuIik7dmFyIHUsbD1lLmxlbmd0aCxjPW5ldyBBcnJheShsKTtpZigw PT09bClyZXR1cm4gdChjKSx2b2lkIDA7Zm9yKHZhciBoPTA7aDxlLmxlbmd0 aDtoKyspdT1lW2hdLG4odSk/KGNbaF09dSwwPT09LS1sJiZ0KGMpKTppLmNh c3QodSkudGhlbihhKGgpLHMpfSx0KX19KSxlKCJyc3ZwL3Byb21pc2UvY2Fz dCIsWyJleHBvcnRzIl0sZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2VbImRl ZmF1bHQiXT1mdW5jdGlvbihlLHQpe3ZhciByPXRoaXM7cmV0dXJuIGUmJiJv YmplY3QiPT10eXBlb2YgZSYmZS5jb25zdHJ1Y3Rvcj09PXI/ZTpuZXcgcihm dW5jdGlvbih0KXt0KGUpfSx0KX19KSxlKCJyc3ZwL3Byb21pc2UvcmFjZSIs WyIuLi91dGlscyIsImV4cG9ydHMiXSxmdW5jdGlvbihlLHQpeyJ1c2Ugc3Ry aWN0Ijt2YXIgcj1lLmlzQXJyYXksbj0oZS5pc0Z1bmN0aW9uLGUuaXNOb25U aGVuYWJsZSk7dFsiZGVmYXVsdCJdPWZ1bmN0aW9uKGUsdCl7dmFyIGksbz10 aGlzO3JldHVybiBuZXcgbyhmdW5jdGlvbih0LGEpe2Z1bmN0aW9uIHMoZSl7 bCYmKGw9ITEsdChlKSl9ZnVuY3Rpb24gdShlKXtsJiYobD0hMSxhKGUpKX1p ZighcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJZb3UgbXVzdCBwYXNzIGFu IGFycmF5IHRvIHJhY2UuIik7Zm9yKHZhciBsPSEwLGM9MDtjPGUubGVuZ3Ro O2MrKyl7aWYoaT1lW2NdLG4oaSkpcmV0dXJuIGw9ITEsdChpKSx2b2lkIDA7 by5jYXN0KGkpLnRoZW4ocyx1KX19LHQpfX0pLGUoInJzdnAvcHJvbWlzZS9y ZWplY3QiLFsiZXhwb3J0cyJdLGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0Ijtl WyJkZWZhdWx0Il09ZnVuY3Rpb24oZSx0KXt2YXIgcj10aGlzO3JldHVybiBu ZXcgcihmdW5jdGlvbih0LHIpe3IoZSl9LHQpfX0pLGUoInJzdnAvcHJvbWlz ZS9yZXNvbHZlIixbImV4cG9ydHMiXSxmdW5jdGlvbihlKXsidXNlIHN0cmlj dCI7ZVsiZGVmYXVsdCJdPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcztyZXR1 cm4gbmV3IHIoZnVuY3Rpb24odCl7dChlKX0sdCl9fSksZSgicnN2cC9yYWNl IixbIi4vcHJvbWlzZSIsImV4cG9ydHMiXSxmdW5jdGlvbihlLHQpeyJ1c2Ug c3RyaWN0Ijt2YXIgcj1lWyJkZWZhdWx0Il07dFsiZGVmYXVsdCJdPWZ1bmN0 aW9uKGUsdCl7cmV0dXJuIHIucmFjZShlLHQpfX0pLGUoInJzdnAvcmVqZWN0 IixbIi4vcHJvbWlzZSIsImV4cG9ydHMiXSxmdW5jdGlvbihlLHQpeyJ1c2Ug c3RyaWN0Ijt2YXIgcj1lWyJkZWZhdWx0Il07dFsiZGVmYXVsdCJdPWZ1bmN0 aW9uKGUsdCl7cmV0dXJuIHIucmVqZWN0KGUsdCl9fSksZSgicnN2cC9yZXNv bHZlIixbIi4vcHJvbWlzZSIsImV4cG9ydHMiXSxmdW5jdGlvbihlLHQpeyJ1 c2Ugc3RyaWN0Ijt2YXIgcj1lWyJkZWZhdWx0Il07dFsiZGVmYXVsdCJdPWZ1 bmN0aW9uKGUsdCl7cmV0dXJuIHIucmVzb2x2ZShlLHQpfX0pLGUoInJzdnAv cmV0aHJvdyIsWyJleHBvcnRzIl0sZnVuY3Rpb24oZSl7InVzZSBzdHJpY3Qi O2VbImRlZmF1bHQiXT1mdW5jdGlvbihlKXt0aHJvdyBzZXRUaW1lb3V0KGZ1 bmN0aW9uKCl7dGhyb3cgZX0pLGV9fSksZSgicnN2cC91dGlscyIsWyJleHBv cnRzIl0sZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSl7 cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGV8fCJvYmplY3QiPT10eXBlb2Yg ZSYmbnVsbCE9PWV9ZnVuY3Rpb24gcihlKXtyZXR1cm4iZnVuY3Rpb24iPT10 eXBlb2YgZX1mdW5jdGlvbiBuKGUpe3JldHVybiF0KGUpfWZ1bmN0aW9uIGko ZSl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUu dG9TdHJpbmcuY2FsbChlKX1lLm9iamVjdE9yRnVuY3Rpb249dCxlLmlzRnVu Y3Rpb249cixlLmlzTm9uVGhlbmFibGU9bixlLmlzQXJyYXk9aTt2YXIgbz1E YXRlLm5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUo KX07ZS5ub3c9bzt2YXIgYT1PYmplY3Qua2V5c3x8ZnVuY3Rpb24oZSl7dmFy IHQ9W107Zm9yKHZhciByIGluIGUpdC5wdXNoKHIpO3JldHVybiB0fTtlLmtl eXNPZj1hfSksZSgicnN2cCIsWyIuL3JzdnAvcHJvbWlzZSIsIi4vcnN2cC9l dmVudHMiLCIuL3JzdnAvbm9kZSIsIi4vcnN2cC9hbGwiLCIuL3JzdnAvYWxs X3NldHRsZWQiLCIuL3JzdnAvcmFjZSIsIi4vcnN2cC9oYXNoIiwiLi9yc3Zw L3JldGhyb3ciLCIuL3JzdnAvZGVmZXIiLCIuL3JzdnAvY29uZmlnIiwiLi9y c3ZwL21hcCIsIi4vcnN2cC9yZXNvbHZlIiwiLi9yc3ZwL3JlamVjdCIsIi4v cnN2cC9maWx0ZXIiLCJleHBvcnRzIl0sZnVuY3Rpb24oZSx0LHIsbixpLG8s YSxzLHUsbCxjLGgsbSxwLGYpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBkKGUs dCl7VC5hc3luYyhlLHQpfWZ1bmN0aW9uIGIoKXtULm9uLmFwcGx5KFQsYXJn dW1lbnRzKX1mdW5jdGlvbiBFKCl7VC5vZmYuYXBwbHkoVCxhcmd1bWVudHMp fXZhciB2PWVbImRlZmF1bHQiXSxnPXRbImRlZmF1bHQiXSx5PXJbImRlZmF1 bHQiXSxfPW5bImRlZmF1bHQiXSx3PWlbImRlZmF1bHQiXSxDPW9bImRlZmF1 bHQiXSxPPWFbImRlZmF1bHQiXSxQPXNbImRlZmF1bHQiXSxBPXVbImRlZmF1 bHQiXSxUPWwuY29uZmlnLHg9bC5jb25maWd1cmUsUz1jWyJkZWZhdWx0Il0s Vj1oWyJkZWZhdWx0Il0sTj1tWyJkZWZhdWx0Il0sUj1wWyJkZWZhdWx0Il07 aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJiJvYmplY3QiPT10eXBl b2Ygd2luZG93Ll9fUFJPTUlTRV9JTlNUUlVNRU5UQVRJT05fXyl7dmFyIEk9 d2luZG93Ll9fUFJPTUlTRV9JTlNUUlVNRU5UQVRJT05fXzt4KCJpbnN0cnVt ZW50IiwhMCk7Zm9yKHZhciBEIGluIEkpSS5oYXNPd25Qcm9wZXJ0eShEKSYm YihELElbRF0pfWYuUHJvbWlzZT12LGYuRXZlbnRUYXJnZXQ9ZyxmLmFsbD1f LGYuYWxsU2V0dGxlZD13LGYucmFjZT1DLGYuaGFzaD1PLGYucmV0aHJvdz1Q LGYuZGVmZXI9QSxmLmRlbm9kZWlmeT15LGYuY29uZmlndXJlPXgsZi5vbj1i LGYub2ZmPUUsZi5yZXNvbHZlPVYsZi5yZWplY3Q9TixmLmFzeW5jPWQsZi5t YXA9UyxmLmZpbHRlcj1SfSl9KCksZnVuY3Rpb24oKXtlKCJjb250YWluZXIv Y29udGFpbmVyIixbImNvbnRhaW5lci9pbmhlcml0aW5nX2RpY3QiLCJleHBv cnRzIl0sZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihl KXt0aGlzLnBhcmVudD1lLHRoaXMuY2hpbGRyZW49W10sdGhpcy5yZXNvbHZl cj1lJiZlLnJlc29sdmVyfHxmdW5jdGlvbigpe30sdGhpcy5yZWdpc3RyeT1u ZXcgdihlJiZlLnJlZ2lzdHJ5KSx0aGlzLmNhY2hlPW5ldyB2KGUmJmUuY2Fj aGUpLHRoaXMuZmFjdG9yeUNhY2hlPW5ldyB2KGUmJmUuZmFjdG9yeUNhY2hl KSx0aGlzLnJlc29sdmVDYWNoZT1uZXcgdihlJiZlLnJlc29sdmVDYWNoZSks dGhpcy50eXBlSW5qZWN0aW9ucz1uZXcgdihlJiZlLnR5cGVJbmplY3Rpb25z KSx0aGlzLmluamVjdGlvbnM9e30sdGhpcy5mYWN0b3J5VHlwZUluamVjdGlv bnM9bmV3IHYoZSYmZS5mYWN0b3J5VHlwZUluamVjdGlvbnMpLHRoaXMuZmFj dG9yeUluamVjdGlvbnM9e30sdGhpcy5fb3B0aW9ucz1uZXcgdihlJiZlLl9v cHRpb25zKSx0aGlzLl90eXBlT3B0aW9ucz1uZXcgdihlJiZlLl90eXBlT3B0 aW9ucyl9ZnVuY3Rpb24gbihlLHQpe3JldHVybiBlLmNhY2hlLmhhcyh0KT8h MDohIWUucmVzb2x2ZSh0KX1mdW5jdGlvbiBpKGUsdCxyKXtpZihyPXJ8fHt9 LGUuY2FjaGUuaGFzKHQpJiZyLnNpbmdsZXRvbiE9PSExKXJldHVybiBlLmNh Y2hlLmdldCh0KTt2YXIgbj1tKGUsdCk7cmV0dXJuIHZvaWQgMCE9PW4/KGEo ZSx0KSYmci5zaW5nbGV0b24hPT0hMSYmZS5jYWNoZS5zZXQodCxuKSxuKTp2 b2lkIDB9ZnVuY3Rpb24gbyhlKXt0aHJvdyBuZXcgRXJyb3IoZSsiIGlzIG5v dCBjdXJyZW50bHkgc3VwcG9ydGVkIG9uIGNoaWxkIGNvbnRhaW5lcnMiKX1m dW5jdGlvbiBhKGUsdCl7dmFyIHI9dShlLHQsInNpbmdsZXRvbiIpO3JldHVy biByIT09ITF9ZnVuY3Rpb24gcyhlLHQpe3ZhciByPXt9O2lmKCF0KXJldHVy biByO2Zvcih2YXIgbixvLGE9MCxzPXQubGVuZ3RoO3M+YTthKyspe2lmKG49 dFthXSxvPWkoZSxuLmZ1bGxOYW1lKSx2b2lkIDA9PT1vKXRocm93IG5ldyBF cnJvcigiQXR0ZW1wdGluZyB0byBpbmplY3QgYW4gdW5rbm93biBpbmplY3Rp b246IGAiK24uZnVsbE5hbWUrImAiKTtyW24ucHJvcGVydHldPW99cmV0dXJu IHJ9ZnVuY3Rpb24gdShlLHQscil7dmFyIG49ZS5fb3B0aW9ucy5nZXQodCk7 aWYobiYmdm9pZCAwIT09bltyXSlyZXR1cm4gbltyXTt2YXIgaT10LnNwbGl0 KCI6IilbMF07cmV0dXJuIG49ZS5fdHlwZU9wdGlvbnMuZ2V0KGkpLG4/blty XTp2b2lkIDB9ZnVuY3Rpb24gbChlLHQpe3ZhciByLG49dCxpPWUucmVzb2x2 ZShuKSxvPWUuZmFjdG9yeUNhY2hlLGE9dC5zcGxpdCgiOiIpWzBdO2lmKHZv aWQgMCE9PWkpe2lmKG8uaGFzKHQpKXJldHVybiBvLmdldCh0KTtpZighaXx8 ImZ1bmN0aW9uIiE9dHlwZW9mIGkuZXh0ZW5kfHwhRW1iZXIuTU9ERUxfRkFD VE9SWV9JTkpFQ1RJT05TJiYibW9kZWwiPT09YSlyZXR1cm4gaTt2YXIgcz1j KGUsdCksdT1oKGUsdCk7cmV0dXJuIHUuX3RvU3RyaW5nPWUubWFrZVRvU3Ry aW5nKGksdCkscj1pLmV4dGVuZChzKSxyLnJlb3BlbkNsYXNzKHUpLG8uc2V0 KHQscikscn19ZnVuY3Rpb24gYyhlLHQpe3ZhciByPXQuc3BsaXQoIjoiKSxu PXJbMF0saT1bXTsKcmV0dXJuIGk9aS5jb25jYXQoZS50eXBlSW5qZWN0aW9u cy5nZXQobil8fFtdKSxpPWkuY29uY2F0KGUuaW5qZWN0aW9uc1t0XXx8W10p LGk9cyhlLGkpLGkuX2RlYnVnQ29udGFpbmVyS2V5PXQsaS5jb250YWluZXI9 ZSxpfWZ1bmN0aW9uIGgoZSx0KXt2YXIgcj10LnNwbGl0KCI6Iiksbj1yWzBd LGk9W107cmV0dXJuIGk9aS5jb25jYXQoZS5mYWN0b3J5VHlwZUluamVjdGlv bnMuZ2V0KG4pfHxbXSksaT1pLmNvbmNhdChlLmZhY3RvcnlJbmplY3Rpb25z W3RdfHxbXSksaT1zKGUsaSksaS5fZGVidWdDb250YWluZXJLZXk9dCxpfWZ1 bmN0aW9uIG0oZSx0KXt2YXIgcj1sKGUsdCk7cmV0dXJuIHUoZSx0LCJpbnN0 YW50aWF0ZSIpPT09ITE/cjpyPyJmdW5jdGlvbiI9PXR5cGVvZiByLmV4dGVu ZD9yLmNyZWF0ZSgpOnIuY3JlYXRlKGMoZSx0KSk6dm9pZCAwfWZ1bmN0aW9u IHAoZSx0KXtlLmNhY2hlLmVhY2hMb2NhbChmdW5jdGlvbihyLG4pe3UoZSxy LCJpbnN0YW50aWF0ZSIpIT09ITEmJnQobil9KX1mdW5jdGlvbiBmKGUpe2Uu Y2FjaGUuZWFjaExvY2FsKGZ1bmN0aW9uKHQscil7dShlLHQsImluc3RhbnRp YXRlIikhPT0hMSYmci5kZXN0cm95KCl9KSxlLmNhY2hlLmRpY3Q9e319ZnVu Y3Rpb24gZChlLHQscixuKXt2YXIgaT1lLmdldCh0KTtpfHwoaT1bXSxlLnNl dCh0LGkpKSxpLnB1c2goe3Byb3BlcnR5OnIsZnVsbE5hbWU6bn0pfWZ1bmN0 aW9uIGIoZSl7aWYoIWcudGVzdChlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJ bnZhbGlkIEZ1bGxuYW1lLCBleHBlY3RlZDogYHR5cGU6bmFtZWAgZ290OiAi K2UpfWZ1bmN0aW9uIEUoZSx0LHIsbil7dmFyIGk9ZVt0XT1lW3RdfHxbXTtp LnB1c2goe3Byb3BlcnR5OnIsZnVsbE5hbWU6bn0pfXZhciB2PWVbImRlZmF1 bHQiXTtyLnByb3RvdHlwZT17cGFyZW50Om51bGwsY2hpbGRyZW46bnVsbCxy ZXNvbHZlcjpudWxsLHJlZ2lzdHJ5Om51bGwsY2FjaGU6bnVsbCx0eXBlSW5q ZWN0aW9uczpudWxsLGluamVjdGlvbnM6bnVsbCxfb3B0aW9uczpudWxsLF90 eXBlT3B0aW9uczpudWxsLGNoaWxkOmZ1bmN0aW9uKCl7dmFyIGU9bmV3IHIo dGhpcyk7cmV0dXJuIHRoaXMuY2hpbGRyZW4ucHVzaChlKSxlfSxzZXQ6ZnVu Y3Rpb24oZSx0LHIpe2VbdF09cn0scmVnaXN0ZXI6ZnVuY3Rpb24oZSx0LHIp e2lmKGIoZSksdm9pZCAwPT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJBdHRl bXB0aW5nIHRvIHJlZ2lzdGVyIGFuIHVua25vd24gZmFjdG9yeTogYCIrZSsi YCIpO3ZhciBuPXRoaXMubm9ybWFsaXplKGUpO2lmKHRoaXMuY2FjaGUuaGFz KG4pKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHJlLXJlZ2lzdGVyOiBgIitl KyJgLCBhcyBpdCBoYXMgYWxyZWFkeSBiZWVuIGxvb2tlZCB1cC4iKTt0aGlz LnJlZ2lzdHJ5LnNldChuLHQpLHRoaXMuX29wdGlvbnMuc2V0KG4scnx8e30p fSx1bnJlZ2lzdGVyOmZ1bmN0aW9uKGUpe2IoZSk7dmFyIHQ9dGhpcy5ub3Jt YWxpemUoZSk7dGhpcy5yZWdpc3RyeS5yZW1vdmUodCksdGhpcy5jYWNoZS5y ZW1vdmUodCksdGhpcy5mYWN0b3J5Q2FjaGUucmVtb3ZlKHQpLHRoaXMucmVz b2x2ZUNhY2hlLnJlbW92ZSh0KSx0aGlzLl9vcHRpb25zLnJlbW92ZSh0KX0s cmVzb2x2ZTpmdW5jdGlvbihlKXtiKGUpO3ZhciB0PXRoaXMubm9ybWFsaXpl KGUpLHI9dGhpcy5yZXNvbHZlQ2FjaGUuZ2V0KHQpO2lmKHIpcmV0dXJuIHI7 dmFyIG49dGhpcy5yZXNvbHZlcih0KXx8dGhpcy5yZWdpc3RyeS5nZXQodCk7 cmV0dXJuIHRoaXMucmVzb2x2ZUNhY2hlLnNldCh0LG4pLG59LGRlc2NyaWJl OmZ1bmN0aW9uKGUpe3JldHVybiBlfSxub3JtYWxpemU6ZnVuY3Rpb24oZSl7 cmV0dXJuIGV9LG1ha2VUb1N0cmluZzpmdW5jdGlvbihlKXtyZXR1cm4gZS50 b1N0cmluZygpfSxsb29rdXA6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYihlKSxp KHRoaXMsdGhpcy5ub3JtYWxpemUoZSksdCl9LGxvb2t1cEZhY3Rvcnk6ZnVu Y3Rpb24oZSl7cmV0dXJuIGIoZSksbCh0aGlzLHRoaXMubm9ybWFsaXplKGUp KX0saGFzOmZ1bmN0aW9uKGUpe3JldHVybiBiKGUpLG4odGhpcyx0aGlzLm5v cm1hbGl6ZShlKSl9LG9wdGlvbnNGb3JUeXBlOmZ1bmN0aW9uKGUsdCl7dGhp cy5wYXJlbnQmJm8oIm9wdGlvbnNGb3JUeXBlIiksdGhpcy5fdHlwZU9wdGlv bnMuc2V0KGUsdCl9LG9wdGlvbnM6ZnVuY3Rpb24oZSx0KXt0aGlzLm9wdGlv bnNGb3JUeXBlKGUsdCl9LHR5cGVJbmplY3Rpb246ZnVuY3Rpb24oZSx0LHIp e2IociksdGhpcy5wYXJlbnQmJm8oInR5cGVJbmplY3Rpb24iKSxkKHRoaXMu dHlwZUluamVjdGlvbnMsZSx0LHIpfSxpbmplY3Rpb246ZnVuY3Rpb24oZSx0 LHIpe3RoaXMucGFyZW50JiZvKCJpbmplY3Rpb24iKSxiKHIpO3ZhciBuPXRo aXMubm9ybWFsaXplKHIpO2lmKC0xPT09ZS5pbmRleE9mKCI6IikpcmV0dXJu IHRoaXMudHlwZUluamVjdGlvbihlLHQsbik7YihlKTt2YXIgaT10aGlzLm5v cm1hbGl6ZShlKTtFKHRoaXMuaW5qZWN0aW9ucyxpLHQsbil9LGZhY3RvcnlU eXBlSW5qZWN0aW9uOmZ1bmN0aW9uKGUsdCxyKXt0aGlzLnBhcmVudCYmbygi ZmFjdG9yeVR5cGVJbmplY3Rpb24iKSxkKHRoaXMuZmFjdG9yeVR5cGVJbmpl Y3Rpb25zLGUsdCx0aGlzLm5vcm1hbGl6ZShyKSl9LGZhY3RvcnlJbmplY3Rp b246ZnVuY3Rpb24oZSx0LHIpe3RoaXMucGFyZW50JiZvKCJpbmplY3Rpb24i KTt2YXIgbj10aGlzLm5vcm1hbGl6ZShlKSxpPXRoaXMubm9ybWFsaXplKHIp O3JldHVybiBiKHIpLC0xPT09ZS5pbmRleE9mKCI6Iik/dGhpcy5mYWN0b3J5 VHlwZUluamVjdGlvbihuLHQsaSk6KGIoZSksRSh0aGlzLmZhY3RvcnlJbmpl Y3Rpb25zLG4sdCxpKSx2b2lkIDApfSxkZXN0cm95OmZ1bmN0aW9uKCl7Zm9y KHZhciBlPTAsdD10aGlzLmNoaWxkcmVuLmxlbmd0aDt0PmU7ZSsrKXRoaXMu Y2hpbGRyZW5bZV0uZGVzdHJveSgpO3RoaXMuY2hpbGRyZW49W10scCh0aGlz LGZ1bmN0aW9uKGUpe2UuZGVzdHJveSgpfSksdGhpcy5wYXJlbnQ9dm9pZCAw LHRoaXMuaXNEZXN0cm95ZWQ9ITB9LHJlc2V0OmZ1bmN0aW9uKCl7Zm9yKHZh ciBlPTAsdD10aGlzLmNoaWxkcmVuLmxlbmd0aDt0PmU7ZSsrKWYodGhpcy5j aGlsZHJlbltlXSk7Zih0aGlzKX19O3ZhciBnPS9eW146XSsuKzpbXjpdKyQv O3RbImRlZmF1bHQiXT1yfSksZSgiY29udGFpbmVyL2luaGVyaXRpbmdfZGlj dCIsWyJleHBvcnRzIl0sZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0 aW9uIHQoZSl7dGhpcy5wYXJlbnQ9ZSx0aGlzLmRpY3Q9e319dC5wcm90b3R5 cGU9e3BhcmVudDpudWxsLGRpY3Q6bnVsbCxnZXQ6ZnVuY3Rpb24oZSl7dmFy IHQ9dGhpcy5kaWN0O3JldHVybiB0Lmhhc093blByb3BlcnR5KGUpP3RbZV06 dGhpcy5wYXJlbnQ/dGhpcy5wYXJlbnQuZ2V0KGUpOnZvaWQgMH0sc2V0OmZ1 bmN0aW9uKGUsdCl7dGhpcy5kaWN0W2VdPXR9LHJlbW92ZTpmdW5jdGlvbihl KXtkZWxldGUgdGhpcy5kaWN0W2VdfSxoYXM6ZnVuY3Rpb24oZSl7dmFyIHQ9 dGhpcy5kaWN0O3JldHVybiB0Lmhhc093blByb3BlcnR5KGUpPyEwOnRoaXMu cGFyZW50P3RoaXMucGFyZW50LmhhcyhlKTohMX0sZWFjaExvY2FsOmZ1bmN0 aW9uKGUsdCl7dmFyIHI9dGhpcy5kaWN0O2Zvcih2YXIgbiBpbiByKXIuaGFz T3duUHJvcGVydHkobikmJmUuY2FsbCh0LG4scltuXSl9fSxlWyJkZWZhdWx0 Il09dH0pLGUoImNvbnRhaW5lciIsWyJjb250YWluZXIvY29udGFpbmVyIiwi ZXhwb3J0cyJdLGZ1bmN0aW9uKGUsdCl7InVzZSBzdHJpY3QiO0VtYmVyLk1P REVMX0ZBQ1RPUllfSU5KRUNUSU9OUz0hMXx8ISFFbWJlci5FTlYuTU9ERUxf RkFDVE9SWV9JTkpFQ1RJT05TO3ZhciByPWVbImRlZmF1bHQiXTt0WyJkZWZh dWx0Il09cn0pfSgpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShyLG4saSxvKXt2 YXIgYSxzLHU7aWYoIm9iamVjdCIhPXR5cGVvZiByfHxudWxsPT09cilyZXR1 cm4gcjtpZihuJiYocz10KGkscikpPj0wKXJldHVybiBvW3NdO2lmKCJhcnJh eSI9PT1FbWJlci50eXBlT2Yocikpe2lmKGE9ci5zbGljZSgpLG4pZm9yKHM9 YS5sZW5ndGg7LS1zPj0wOylhW3NdPWUoYVtzXSxuLGksbyl9ZWxzZSBpZihF bWJlci5Db3B5YWJsZSYmRW1iZXIuQ29weWFibGUuZGV0ZWN0KHIpKWE9ci5j b3B5KG4saSxvKTtlbHNle2E9e307Zm9yKHUgaW4gcilyLmhhc093blByb3Bl cnR5KHUpJiYiX18iIT09dS5zdWJzdHJpbmcoMCwyKSYmKGFbdV09bj9lKHJb dV0sbixpLG8pOnJbdV0pfXJldHVybiBuJiYoaS5wdXNoKHIpLG8ucHVzaChh KSksYX12YXIgdD1FbWJlci5FbnVtZXJhYmxlVXRpbHMuaW5kZXhPZjtpZihF bWJlci5jb21wYXJlPWZ1bmN0aW9uIGkoZSx0KXtpZihlPT09dClyZXR1cm4g MDt2YXIgcj1FbWJlci50eXBlT2YoZSksbj1FbWJlci50eXBlT2YodCksbz1F bWJlci5Db21wYXJhYmxlO2lmKG8pe2lmKCJpbnN0YW5jZSI9PT1yJiZvLmRl dGVjdChlLmNvbnN0cnVjdG9yKSlyZXR1cm4gZS5jb25zdHJ1Y3Rvci5jb21w YXJlKGUsdCk7aWYoImluc3RhbmNlIj09PW4mJm8uZGV0ZWN0KHQuY29uc3Ry dWN0b3IpKXJldHVybiAxLXQuY29uc3RydWN0b3IuY29tcGFyZSh0LGUpfXZh ciBhPUVtYmVyLk9SREVSX0RFRklOSVRJT05fTUFQUElORztpZighYSl7dmFy IHM9RW1iZXIuT1JERVJfREVGSU5JVElPTjthPUVtYmVyLk9SREVSX0RFRklO SVRJT05fTUFQUElORz17fTt2YXIgdSxsO2Zvcih1PTAsbD1zLmxlbmd0aDts PnU7Kyt1KWFbc1t1XV09dTtkZWxldGUgRW1iZXIuT1JERVJfREVGSU5JVElP Tn12YXIgYz1hW3JdLGg9YVtuXTtpZihoPmMpcmV0dXJuLTE7aWYoYz5oKXJl dHVybiAxO3N3aXRjaChyKXtjYXNlImJvb2xlYW4iOmNhc2UibnVtYmVyIjpy ZXR1cm4gdD5lPy0xOmU+dD8xOjA7Y2FzZSJzdHJpbmciOnZhciBtPWUubG9j YWxlQ29tcGFyZSh0KTtyZXR1cm4gMD5tPy0xOm0+MD8xOjA7Y2FzZSJhcnJh eSI6Zm9yKHZhciBwPWUubGVuZ3RoLGY9dC5sZW5ndGgsZD1NYXRoLm1pbihw LGYpLGI9MCxFPTA7MD09PWImJmQ+RTspYj1pKGVbRV0sdFtFXSksRSsrO3Jl dHVybiAwIT09Yj9iOmY+cD8tMTpwPmY/MTowO2Nhc2UiaW5zdGFuY2UiOnJl dHVybiBFbWJlci5Db21wYXJhYmxlJiZFbWJlci5Db21wYXJhYmxlLmRldGVj dChlKT9lLmNvbXBhcmUoZSx0KTowO2Nhc2UiZGF0ZSI6dmFyIHY9ZS5nZXRU aW1lKCksZz10LmdldFRpbWUoKTtyZXR1cm4gZz52Py0xOnY+Zz8xOjA7ZGVm YXVsdDpyZXR1cm4gMH19LEVtYmVyLmNvcHk9ZnVuY3Rpb24odCxyKXtyZXR1 cm4ib2JqZWN0IiE9dHlwZW9mIHR8fG51bGw9PT10P3Q6RW1iZXIuQ29weWFi bGUmJkVtYmVyLkNvcHlhYmxlLmRldGVjdCh0KT90LmNvcHkocik6ZSh0LHIs cj9bXTpudWxsLHI/W106bnVsbCl9LEVtYmVyLmlzRXF1YWw9ZnVuY3Rpb24o ZSx0KXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuaXNFcXVhbD9l LmlzRXF1YWwodCk6ZT09PXR9LEVtYmVyLk9SREVSX0RFRklOSVRJT049RW1i ZXIuRU5WLk9SREVSX0RFRklOSVRJT058fFsidW5kZWZpbmVkIiwibnVsbCIs ImJvb2xlYW4iLCJudW1iZXIiLCJzdHJpbmciLCJhcnJheSIsIm9iamVjdCIs Imluc3RhbmNlIiwiZnVuY3Rpb24iLCJjbGFzcyIsImRhdGUiXSxFbWJlci5r ZXlzPU9iamVjdC5rZXlzLCFFbWJlci5rZXlzfHxFbWJlci5jcmVhdGUuaXNT aW11bGF0ZWQpe3ZhciByPVsiY29uc3RydWN0b3IiLCJoYXNPd25Qcm9wZXJ0 eSIsImlzUHJvdG90eXBlT2YiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInZh bHVlT2YiLCJ0b0xvY2FsZVN0cmluZyIsInRvU3RyaW5nIl0sbj1mdW5jdGlv bihlLHIsbil7Il9fIiE9PW4uc3Vic3RyaW5nKDAsMikmJiJfc3VwZXIiIT09 biYmKHQocixuKT49MHx8ZS5oYXNPd25Qcm9wZXJ0eShuKSYmci5wdXNoKG4p KX07RW1iZXIua2V5cz1mdW5jdGlvbihlKXt2YXIgdCxpPVtdO2Zvcih0IGlu IGUpbihlLGksdCk7Zm9yKHZhciBvPTAsYT1yLmxlbmd0aDthPm87bysrKXQ9 cltvXSxuKGUsaSx0KTtyZXR1cm4gaX19fSgpLGZ1bmN0aW9uKCl7dmFyIGU9 L1sgX10vZyx0PXt9LHI9LyhbYS16XGRdKShbQS1aXSkvZyxuPS8oXC18X3xc LnxccykrKC4pPy9nLGk9LyhbYS16XGRdKShbQS1aXSspL2csbz0vXC18XHMr L2csYT0vW198XC98XHNdKy9nLHM9L1teYS16MC05XC1dKy9naSx1PS9bXC1d Ky9nLGw9L14tK3wtKyQvZztFbWJlci5TVFJJTkdTPXt9LEVtYmVyLlN0cmlu Zz17Zm10OmZ1bmN0aW9uKGUsdCl7dmFyIHI9MDtyZXR1cm4gZS5yZXBsYWNl KC8lQChbMC05XSspPy9nLGZ1bmN0aW9uKGUsbil7cmV0dXJuIG49bj9wYXJz ZUludChuLDEwKS0xOnIrKyxlPXRbbl0sbnVsbD09PWU/IihudWxsKSI6dm9p ZCAwPT09ZT8iIjpFbWJlci5pbnNwZWN0KGUpfSl9LGxvYzpmdW5jdGlvbihl LHQpe3JldHVybiBlPUVtYmVyLlNUUklOR1NbZV18fGUsRW1iZXIuU3RyaW5n LmZtdChlLHQpfSx3OmZ1bmN0aW9uKGUpe3JldHVybiBlLnNwbGl0KC9ccysv KX0sZGVjYW1lbGl6ZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKHIs IiQxXyQyIikudG9Mb3dlckNhc2UoKX0sZGFzaGVyaXplOmZ1bmN0aW9uKHIp e3ZhciBuLGk9dCxvPWkuaGFzT3duUHJvcGVydHkocik7cmV0dXJuIG8/aVty XToobj1FbWJlci5TdHJpbmcuZGVjYW1lbGl6ZShyKS5yZXBsYWNlKGUsIi0i KSxpW3JdPW4sbil9LGNhbWVsaXplOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJl cGxhY2UobixmdW5jdGlvbihlLHQscil7cmV0dXJuIHI/ci50b1VwcGVyQ2Fz ZSgpOiIifSkucmVwbGFjZSgvXihbQS1aXSkvLGZ1bmN0aW9uKGUpe3JldHVy biBlLnRvTG93ZXJDYXNlKCl9KX0sY2xhc3NpZnk6ZnVuY3Rpb24oZSl7Zm9y KHZhciB0PWUuc3BsaXQoIi4iKSxyPVtdLG49MCxpPXQubGVuZ3RoO2k+bjtu Kyspe3ZhciBvPUVtYmVyLlN0cmluZy5jYW1lbGl6ZSh0W25dKTtyLnB1c2go by5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStvLnN1YnN0cigxKSl9cmV0dXJu IHIuam9pbigiLiIpfSx1bmRlcnNjb3JlOmZ1bmN0aW9uKGUpe3JldHVybiBl LnJlcGxhY2UoaSwiJDFfJDIiKS5yZXBsYWNlKG8sIl8iKS50b0xvd2VyQ2Fz ZSgpfSxjYXBpdGFsaXplOmZ1bmN0aW9uKGUpe3JldHVybiBlLmNoYXJBdCgw KS50b1VwcGVyQ2FzZSgpK2Uuc3Vic3RyKDEpfX0sRW1iZXIuRkVBVFVSRVMu aXNFbmFibGVkKCJzdHJpbmctcGFyYW1ldGVyaXplIikmJihFbWJlci5TdHJp bmcucGFyYW1ldGVyaXplPWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2Uo YSwiLSIpLnJlcGxhY2UocywiIikucmVwbGFjZSh1LCItIikucmVwbGFjZShs LCIiKS50b0xvd2VyQ2FzZSgpfSl9KCksZnVuY3Rpb24oKXt2YXIgZT1FbWJl ci5TdHJpbmcuZm10LHQ9RW1iZXIuU3RyaW5nLncscj1FbWJlci5TdHJpbmcu bG9jLG49RW1iZXIuU3RyaW5nLmNhbWVsaXplLGk9RW1iZXIuU3RyaW5nLmRl Y2FtZWxpemUsbz1FbWJlci5TdHJpbmcuZGFzaGVyaXplLGE9RW1iZXIuU3Ry aW5nLnVuZGVyc2NvcmUscz1FbWJlci5TdHJpbmcuY2FwaXRhbGl6ZSx1PUVt YmVyLlN0cmluZy5jbGFzc2lmeTtpZihFbWJlci5GRUFUVVJFUy5pc0VuYWJs ZWQoInN0cmluZy1wYXJhbWV0ZXJpemUiKSl2YXIgbD1FbWJlci5TdHJpbmcu cGFyYW1ldGVyaXplOyhFbWJlci5FWFRFTkRfUFJPVE9UWVBFUz09PSEwfHxF bWJlci5FWFRFTkRfUFJPVE9UWVBFUy5TdHJpbmcpJiYoU3RyaW5nLnByb3Rv dHlwZS5mbXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZSh0aGlzLGFyZ3VtZW50cyl9 LFN0cmluZy5wcm90b3R5cGUudz1mdW5jdGlvbigpe3JldHVybiB0KHRoaXMp fSxTdHJpbmcucHJvdG90eXBlLmxvYz1mdW5jdGlvbigpe3JldHVybiByKHRo aXMsYXJndW1lbnRzKX0sU3RyaW5nLnByb3RvdHlwZS5jYW1lbGl6ZT1mdW5j dGlvbigpe3JldHVybiBuKHRoaXMpfSxTdHJpbmcucHJvdG90eXBlLmRlY2Ft ZWxpemU9ZnVuY3Rpb24oKXtyZXR1cm4gaSh0aGlzKX0sU3RyaW5nLnByb3Rv dHlwZS5kYXNoZXJpemU9ZnVuY3Rpb24oKXtyZXR1cm4gbyh0aGlzKX0sU3Ry aW5nLnByb3RvdHlwZS51bmRlcnNjb3JlPWZ1bmN0aW9uKCl7cmV0dXJuIGEo dGhpcyl9LFN0cmluZy5wcm90b3R5cGUuY2xhc3NpZnk9ZnVuY3Rpb24oKXty ZXR1cm4gdSh0aGlzKX0sU3RyaW5nLnByb3RvdHlwZS5jYXBpdGFsaXplPWZ1 bmN0aW9uKCl7cmV0dXJuIHModGhpcyl9LEVtYmVyLkZFQVRVUkVTLmlzRW5h YmxlZCgic3RyaW5nLXBhcmFtZXRlcml6ZSIpJiYoU3RyaW5nLnByb3RvdHlw ZS5wYXJhbWV0ZXJpemU9ZnVuY3Rpb24oKXtyZXR1cm4gbCh0aGlzKX0pKX0o KSxmdW5jdGlvbigpe3ZhciBlPUVtYmVyLmdldCx0PUVtYmVyLnNldCxyPUFy cmF5LnByb3RvdHlwZS5zbGljZSxuPUVtYmVyLmdldFByb3BlcnRpZXM7RW1i ZXIuT2JzZXJ2YWJsZT1FbWJlci5NaXhpbi5jcmVhdGUoe2dldDpmdW5jdGlv bih0KXtyZXR1cm4gZSh0aGlzLHQpfSxnZXRQcm9wZXJ0aWVzOmZ1bmN0aW9u KCl7cmV0dXJuIG4uYXBwbHkobnVsbCxbdGhpc10uY29uY2F0KHIuY2FsbChh cmd1bWVudHMpKSl9LHNldDpmdW5jdGlvbihlLHIpe3JldHVybiB0KHRoaXMs ZSxyKSx0aGlzfSxzZXRQcm9wZXJ0aWVzOmZ1bmN0aW9uKGUpe3JldHVybiBF bWJlci5zZXRQcm9wZXJ0aWVzKHRoaXMsZSl9LGJlZ2luUHJvcGVydHlDaGFu Z2VzOmZ1bmN0aW9uKCl7cmV0dXJuIEVtYmVyLmJlZ2luUHJvcGVydHlDaGFu Z2VzKCksdGhpc30sZW5kUHJvcGVydHlDaGFuZ2VzOmZ1bmN0aW9uKCl7cmV0 dXJuIEVtYmVyLmVuZFByb3BlcnR5Q2hhbmdlcygpLHRoaXN9LHByb3BlcnR5 V2lsbENoYW5nZTpmdW5jdGlvbihlKXtyZXR1cm4gRW1iZXIucHJvcGVydHlX aWxsQ2hhbmdlKHRoaXMsZSksdGhpc30scHJvcGVydHlEaWRDaGFuZ2U6ZnVu Y3Rpb24oZSl7cmV0dXJuIEVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMs ZSksdGhpc30sbm90aWZ5UHJvcGVydHlDaGFuZ2U6ZnVuY3Rpb24oZSl7cmV0 dXJuIHRoaXMucHJvcGVydHlXaWxsQ2hhbmdlKGUpLHRoaXMucHJvcGVydHlE aWRDaGFuZ2UoZSksdGhpc30sYWRkQmVmb3JlT2JzZXJ2ZXI6ZnVuY3Rpb24o ZSx0LHIpe0VtYmVyLmFkZEJlZm9yZU9ic2VydmVyKHRoaXMsZSx0LHIpfSxh ZGRPYnNlcnZlcjpmdW5jdGlvbihlLHQscil7RW1iZXIuYWRkT2JzZXJ2ZXIo dGhpcyxlLHQscil9LHJlbW92ZU9ic2VydmVyOmZ1bmN0aW9uKGUsdCxyKXtF bWJlci5yZW1vdmVPYnNlcnZlcih0aGlzLGUsdCxyKX0saGFzT2JzZXJ2ZXJG b3I6ZnVuY3Rpb24oZSl7cmV0dXJuIEVtYmVyLmhhc0xpc3RlbmVycyh0aGlz LGUrIjpjaGFuZ2UiKX0sZ2V0V2l0aERlZmF1bHQ6ZnVuY3Rpb24oZSx0KXty ZXR1cm4gRW1iZXIuZ2V0V2l0aERlZmF1bHQodGhpcyxlLHQpfSxpbmNyZW1l bnRQcm9wZXJ0eTpmdW5jdGlvbihyLG4pe3JldHVybiBFbWJlci5pc05vbmUo bikmJihuPTEpLHQodGhpcyxyLChlKHRoaXMscil8fDApK24pLGUodGhpcyxy KX0sZGVjcmVtZW50UHJvcGVydHk6ZnVuY3Rpb24ocixuKXtyZXR1cm4gRW1i ZXIuaXNOb25lKG4pJiYobj0xKSx0KHRoaXMsciwoZSh0aGlzLHIpfHwwKS1u KSxlKHRoaXMscil9LHRvZ2dsZVByb3BlcnR5OmZ1bmN0aW9uKHIpe3JldHVy biB0KHRoaXMsciwhZSh0aGlzLHIpKSxlKHRoaXMscil9LGNhY2hlRm9yOmZ1 bmN0aW9uKGUpe3JldHVybiBFbWJlci5jYWNoZUZvcih0aGlzLGUpfSxvYnNl cnZlcnNGb3JLZXk6ZnVuY3Rpb24oZSl7cmV0dXJuIEVtYmVyLm9ic2VydmVy c0Zvcih0aGlzLGUpfX0pfSgpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3Zh ciBlLHQsbz0hMSxhPWZ1bmN0aW9uKCl7b3x8YS5wcm90bygpLG4odGhpcyxp LF8pLG4odGhpcywiX19uZXh0U3VwZXIiLHkpO3ZhciB1PXModGhpcyksbD11 LnByb3RvO2lmKHUucHJvdG89dGhpcyxlKXt2YXIgbT1lO2U9bnVsbCx0aGlz LnJlb3Blbi5hcHBseSh0aGlzLG0pfWlmKHQpe3ZhciBwPXQ7dD1udWxsO2Zv cih2YXIgZj10aGlzLmNvbmNhdGVuYXRlZFByb3BlcnRpZXMsZD0wLEU9cC5s ZW5ndGg7RT5kO2QrKyl7dmFyIHc9cFtkXTtpZigib2JqZWN0IiE9dHlwZW9m IHcmJnZvaWQgMCE9PXcpdGhyb3cgbmV3IEVtYmVyLkVycm9yKCJFbWJlci5P YmplY3QuY3JlYXRlIG9ubHkgYWNjZXB0cyBvYmplY3RzLiIpO2lmKHcpZm9y KHZhciBDPUVtYmVyLmtleXModyksTz0wLFA9Qy5sZW5ndGg7UD5PO08rKyl7 dmFyIEE9Q1tPXTtpZih3Lmhhc093blByb3BlcnR5KEEpKXt2YXIgVD13W0Fd LHg9RW1iZXIuSVNfQklORElORztpZih4LnRlc3QoQSkpe3ZhciBTPXUuYmlu ZGluZ3M7Uz91Lmhhc093blByb3BlcnR5KCJiaW5kaW5ncyIpfHwoUz11LmJp bmRpbmdzPXIodS5iaW5kaW5ncykpOlM9dS5iaW5kaW5ncz17fSxTW0FdPVR9 dmFyIFY9dS5kZXNjc1tBXTtpZihmJiZnKGYsQSk+PTApe3ZhciBOPXRoaXNb QV07VD1OPyJmdW5jdGlvbiI9PXR5cGVvZiBOLmNvbmNhdD9OLmNvbmNhdChU KTpFbWJlci5tYWtlQXJyYXkoTikuY29uY2F0KFQpOkVtYmVyLm1ha2VBcnJh eShUKX1WP1Yuc2V0KHRoaXMsQSxUKToiZnVuY3Rpb24iIT10eXBlb2YgdGhp cy5zZXRVbmtub3duUHJvcGVydHl8fEEgaW4gdGhpcz92P0VtYmVyLmRlZmlu ZVByb3BlcnR5KHRoaXMsQSxudWxsLFQpOnRoaXNbQV09VDp0aGlzLnNldFVu a25vd25Qcm9wZXJ0eShBLFQpfX19fWIodGhpcyx1KSx0aGlzLmluaXQuYXBw bHkodGhpcyxhcmd1bWVudHMpLHUucHJvdG89bCxjKHRoaXMpLGgodGhpcywi aW5pdCIpfTtyZXR1cm4gYS50b1N0cmluZz1mLnByb3RvdHlwZS50b1N0cmlu ZyxhLndpbGxSZW9wZW49ZnVuY3Rpb24oKXtvJiYoYS5Qcm90b3R5cGVNaXhp bj1mLmNyZWF0ZShhLlByb3RvdHlwZU1peGluKSksbz0hMX0sYS5faW5pdE1p eGlucz1mdW5jdGlvbih0KXtlPXR9LGEuX2luaXRQcm9wZXJ0aWVzPWZ1bmN0 aW9uKGUpe3Q9ZX0sYS5wcm90bz1mdW5jdGlvbigpe3ZhciBlPWEuc3VwZXJj bGFzcztyZXR1cm4gZSYmZS5wcm90bygpLG98fChvPSEwLGEuUHJvdG90eXBl TWl4aW4uYXBwbHlQYXJ0aWFsKGEucHJvdG90eXBlKSxsKGEucHJvdG90eXBl KSksdGhpcy5wcm90b3R5cGV9LGF9ZnVuY3Rpb24gdChlKXtyZXR1cm4gZnVu Y3Rpb24oKXtyZXR1cm4gZX19dmFyIHI9KEVtYmVyLnNldCxFbWJlci5nZXQs RW1iZXIuY3JlYXRlKSxuPUVtYmVyLnBsYXRmb3JtLmRlZmluZVByb3BlcnR5 LGk9RW1iZXIuR1VJRF9LRVksbz1FbWJlci5ndWlkRm9yLGE9RW1iZXIuZ2Vu ZXJhdGVHdWlkLHM9RW1iZXIubWV0YSx1PUVtYmVyLk1FVEFfS0VZLGw9RW1i ZXIucmV3YXRjaCxjPUVtYmVyLmZpbmlzaENoYWlucyxoPUVtYmVyLnNlbmRF dmVudCxtPUVtYmVyLmRlc3Ryb3kscD1FbWJlci5ydW4uc2NoZWR1bGUsZj1F bWJlci5NaXhpbixkPWYuX2FwcGx5LGI9Zi5maW5pc2hQYXJ0aWFsLEU9Zi5w cm90b3R5cGUucmVvcGVuLHY9RW1iZXIuRU5WLk1BTkRBVE9SWV9TRVRURVIs Zz1FbWJlci5FbnVtZXJhYmxlVXRpbHMuaW5kZXhPZix5PXtjb25maWd1cmFi bGU6ITAsd3JpdGFibGU6ITAsZW51bWVyYWJsZTohMSx2YWx1ZTp2b2lkIDB9 LF89e2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCxlbnVtZXJhYmxlOiEx LHZhbHVlOm51bGx9LHc9ZSgpO3cudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1 cm4iRW1iZXIuQ29yZU9iamVjdCJ9LHcuUHJvdG90eXBlTWl4aW49Zi5jcmVh dGUoe3Jlb3BlbjpmdW5jdGlvbigpe3JldHVybiBkKHRoaXMsYXJndW1lbnRz LCEwKSx0aGlzfSxpbml0OmZ1bmN0aW9uKCl7fSxjb25jYXRlbmF0ZWRQcm9w ZXJ0aWVzOm51bGwsaXNEZXN0cm95ZWQ6ITEsaXNEZXN0cm95aW5nOiExLGRl c3Ryb3k6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0Rlc3Ryb3lpbmc/dm9p ZCAwOih0aGlzLmlzRGVzdHJveWluZz0hMCxwKCJhY3Rpb25zIix0aGlzLHRo aXMud2lsbERlc3Ryb3kpLHAoImRlc3Ryb3kiLHRoaXMsdGhpcy5fc2NoZWR1 bGVkRGVzdHJveSksdGhpcyl9LHdpbGxEZXN0cm95OkVtYmVyLkssX3NjaGVk dWxlZERlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmlzRGVzdHJveWVkfHwobSh0 aGlzKSx0aGlzLmlzRGVzdHJveWVkPSEwKX0sYmluZDpmdW5jdGlvbihlLHQp e3JldHVybiB0IGluc3RhbmNlb2YgRW1iZXIuQmluZGluZ3x8KHQ9RW1iZXIu QmluZGluZy5mcm9tKHQpKSx0LnRvKGUpLmNvbm5lY3QodGhpcyksdH0sdG9T dHJpbmc6ZnVuY3Rpb24oKXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgdGhp cy50b1N0cmluZ0V4dGVuc2lvbixyPWU/IjoiK3RoaXMudG9TdHJpbmdFeHRl bnNpb24oKToiIixuPSI8Iit0aGlzLmNvbnN0cnVjdG9yLnRvU3RyaW5nKCkr IjoiK28odGhpcykrcisiPiI7cmV0dXJuIHRoaXMudG9TdHJpbmc9dChuKSxu fX0pLHcuUHJvdG90eXBlTWl4aW4ub3duZXJDb25zdHJ1Y3Rvcj13LEVtYmVy LmNvbmZpZy5vdmVycmlkZVByb3RvdHlwZU1peGluJiZFbWJlci5jb25maWcu b3ZlcnJpZGVQcm90b3R5cGVNaXhpbih3LlByb3RvdHlwZU1peGluKSx3Ll9f c3VwZXJfXz1udWxsO3ZhciBDPWYuY3JlYXRlKHtDbGFzc01peGluOkVtYmVy LnJlcXVpcmVkKCksUHJvdG90eXBlTWl4aW46RW1iZXIucmVxdWlyZWQoKSxp c0NsYXNzOiEwLGlzTWV0aG9kOiExLGV4dGVuZDpmdW5jdGlvbigpe3ZhciB0 LG49ZSgpO3JldHVybiBuLkNsYXNzTWl4aW49Zi5jcmVhdGUodGhpcy5DbGFz c01peGluKSxuLlByb3RvdHlwZU1peGluPWYuY3JlYXRlKHRoaXMuUHJvdG90 eXBlTWl4aW4pLG4uQ2xhc3NNaXhpbi5vd25lckNvbnN0cnVjdG9yPW4sbi5Q cm90b3R5cGVNaXhpbi5vd25lckNvbnN0cnVjdG9yPW4sRS5hcHBseShuLlBy b3RvdHlwZU1peGluLGFyZ3VtZW50cyksbi5zdXBlcmNsYXNzPXRoaXMsbi5f X3N1cGVyX189dGhpcy5wcm90b3R5cGUsdD1uLnByb3RvdHlwZT1yKHRoaXMu cHJvdG90eXBlKSx0LmNvbnN0cnVjdG9yPW4sYSh0KSxzKHQpLnByb3RvPXQs bi5DbGFzc01peGluLmFwcGx5KG4pLG59LGNyZWF0ZVdpdGhNaXhpbnM6ZnVu Y3Rpb24oKXt2YXIgZT10aGlzO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjAm JnRoaXMuX2luaXRNaXhpbnMoYXJndW1lbnRzKSxuZXcgZX0sY3JlYXRlOmZ1 bmN0aW9uKCl7dmFyIGU9dGhpcztyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4w JiZ0aGlzLl9pbml0UHJvcGVydGllcyhhcmd1bWVudHMpLG5ldyBlfSxyZW9w ZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53aWxsUmVvcGVuKCksRS5hcHBs eSh0aGlzLlByb3RvdHlwZU1peGluLGFyZ3VtZW50cyksdGhpc30scmVvcGVu Q2xhc3M6ZnVuY3Rpb24oKXtyZXR1cm4gRS5hcHBseSh0aGlzLkNsYXNzTWl4 aW4sYXJndW1lbnRzKSxkKHRoaXMsYXJndW1lbnRzLCExKSx0aGlzfSxkZXRl Y3Q6ZnVuY3Rpb24oZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpcmV0dXJu ITE7Zm9yKDtlOyl7aWYoZT09PXRoaXMpcmV0dXJuITA7ZT1lLnN1cGVyY2xh c3N9cmV0dXJuITF9LGRldGVjdEluc3RhbmNlOmZ1bmN0aW9uKGUpe3JldHVy biBlIGluc3RhbmNlb2YgdGhpc30sbWV0YUZvclByb3BlcnR5OmZ1bmN0aW9u KGUpe3ZhciB0PXRoaXMucHJvdG8oKVt1XSxyPXQmJnQuZGVzY3NbZV07cmV0 dXJuIHIuX21ldGF8fHt9fSxlYWNoQ29tcHV0ZWRQcm9wZXJ0eTpmdW5jdGlv bihlLHQpe3ZhciByLG49dGhpcy5wcm90bygpLGk9cyhuKS5kZXNjcyxvPXt9 O2Zvcih2YXIgYSBpbiBpKXI9aVthXSxyIGluc3RhbmNlb2YgRW1iZXIuQ29t cHV0ZWRQcm9wZXJ0eSYmZS5jYWxsKHR8fHRoaXMsYSxyLl9tZXRhfHxvKX19 KTtDLm93bmVyQ29uc3RydWN0b3I9dyxFbWJlci5jb25maWcub3ZlcnJpZGVD bGFzc01peGluJiZFbWJlci5jb25maWcub3ZlcnJpZGVDbGFzc01peGluKEMp LHcuQ2xhc3NNaXhpbj1DLEMuYXBwbHkodyksRW1iZXIuQ29yZU9iamVjdD13 fSgpLGZ1bmN0aW9uKCl7RW1iZXIuT2JqZWN0PUVtYmVyLkNvcmVPYmplY3Qu ZXh0ZW5kKEVtYmVyLk9ic2VydmFibGUpLEVtYmVyLk9iamVjdC50b1N0cmlu Zz1mdW5jdGlvbigpe3JldHVybiJFbWJlci5PYmplY3QifX0oKSxmdW5jdGlv bigpe2Z1bmN0aW9uIGUodCxyLGkpe3ZhciBhPXQubGVuZ3RoO2xbdC5qb2lu KCIuIildPXI7Zm9yKHZhciBzIGluIHIpaWYoYy5jYWxsKHIscykpe3ZhciB1 PXJbc107aWYodFthXT1zLHUmJnUudG9TdHJpbmc9PT1uKXUudG9TdHJpbmc9 byh0LmpvaW4oIi4iKSksdVttXT10LmpvaW4oIi4iKTtlbHNlIGlmKHUmJnUu aXNOYW1lc3BhY2Upe2lmKGlbaCh1KV0pY29udGludWU7aVtoKHUpXT0hMCxl KHQsdSxpKX19dC5sZW5ndGg9YX1mdW5jdGlvbiB0KCl7dmFyIGUsdCxyPUVt YmVyLk5hbWVzcGFjZSxuPUVtYmVyLmxvb2t1cDtpZighci5QUk9DRVNTRUQp Zm9yKHZhciBpIGluIG4paWYoInBhcmVudCIhPT1pJiYidG9wIiE9PWkmJiJm cmFtZUVsZW1lbnQiIT09aSYmIndlYmtpdFN0b3JhZ2VJbmZvIiE9PWkmJiEo Imdsb2JhbFN0b3JhZ2UiPT09aSYmbi5TdG9yYWdlTGlzdCYmbi5nbG9iYWxT dG9yYWdlIGluc3RhbmNlb2Ygbi5TdG9yYWdlTGlzdHx8bi5oYXNPd25Qcm9w ZXJ0eSYmIW4uaGFzT3duUHJvcGVydHkoaSkpKXt0cnl7ZT1FbWJlci5sb29r dXBbaV0sdD1lJiZlLmlzTmFtZXNwYWNlfWNhdGNoKG8pe2NvbnRpbnVlfXQm JihlW21dPWkpfX1mdW5jdGlvbiByKGUpe3ZhciB0PWUuc3VwZXJjbGFzczty ZXR1cm4gdD90W21dP3RbbV06cih0KTp2b2lkIDB9ZnVuY3Rpb24gbigpe0Vt YmVyLkJPT1RFRHx8dGhpc1ttXXx8aSgpO3ZhciBlO2lmKHRoaXNbbV0pZT10 aGlzW21dO2Vsc2UgaWYodGhpcy5fdG9TdHJpbmcpZT10aGlzLl90b1N0cmlu ZztlbHNle3ZhciB0PXIodGhpcyk7ZT10PyIoc3ViY2xhc3Mgb2YgIit0KyIp IjoiKHVua25vd24gbWl4aW4pIix0aGlzLnRvU3RyaW5nPW8oZSl9cmV0dXJu IGV9ZnVuY3Rpb24gaSgpe3ZhciByPSF1LlBST0NFU1NFRCxuPUVtYmVyLmFu eVVucHJvY2Vzc2VkTWl4aW5zO2lmKHImJih0KCksdS5QUk9DRVNTRUQ9ITAp LHJ8fG4pe2Zvcih2YXIgaSxvPXUuTkFNRVNQQUNFUyxhPTAscz1vLmxlbmd0 aDtzPmE7YSsrKWk9b1thXSxlKFtpLnRvU3RyaW5nKCldLGkse30pO0VtYmVy LmFueVVucHJvY2Vzc2VkTWl4aW5zPSExfX1mdW5jdGlvbiBvKGUpe3JldHVy biBmdW5jdGlvbigpe3JldHVybiBlfX12YXIgYT1FbWJlci5nZXQscz1FbWJl ci5BcnJheVBvbHlmaWxscy5pbmRleE9mLHU9RW1iZXIuTmFtZXNwYWNlPUVt YmVyLk9iamVjdC5leHRlbmQoe2lzTmFtZXNwYWNlOiEwLGluaXQ6ZnVuY3Rp b24oKXtFbWJlci5OYW1lc3BhY2UuTkFNRVNQQUNFUy5wdXNoKHRoaXMpLEVt YmVyLk5hbWVzcGFjZS5QUk9DRVNTRUQ9ITF9LHRvU3RyaW5nOmZ1bmN0aW9u KCl7dmFyIGU9YSh0aGlzLCJuYW1lIik7cmV0dXJuIGU/ZToodCgpLHRoaXNb RW1iZXIuR1VJRF9LRVkrIl9uYW1lIl0pfSxuYW1lQ2xhc3NlczpmdW5jdGlv bigpe2UoW3RoaXMudG9TdHJpbmcoKV0sdGhpcyx7fSl9LGRlc3Ryb3k6ZnVu Y3Rpb24oKXt2YXIgZT1FbWJlci5OYW1lc3BhY2UuTkFNRVNQQUNFUztFbWJl ci5sb29rdXBbdGhpcy50b1N0cmluZygpXT12b2lkIDAsZGVsZXRlIEVtYmVy Lk5hbWVzcGFjZS5OQU1FU1BBQ0VTX0JZX0lEW3RoaXMudG9TdHJpbmcoKV0s ZS5zcGxpY2Uocy5jYWxsKGUsdGhpcyksMSksdGhpcy5fc3VwZXIoKX19KTt1 LnJlb3BlbkNsYXNzKHtOQU1FU1BBQ0VTOltFbWJlcl0sTkFNRVNQQUNFU19C WV9JRDp7fSxQUk9DRVNTRUQ6ITEscHJvY2Vzc0FsbDppLGJ5TmFtZTpmdW5j dGlvbihlKXtyZXR1cm4gRW1iZXIuQk9PVEVEfHxpKCksbFtlXX19KTt2YXIg bD11Lk5BTUVTUEFDRVNfQllfSUQsYz17fS5oYXNPd25Qcm9wZXJ0eSxoPUVt YmVyLmd1aWRGb3IsbT1FbWJlci5OQU1FX0tFWT1FbWJlci5HVUlEX0tFWSsi X25hbWUiO0VtYmVyLk1peGluLnByb3RvdHlwZS50b1N0cmluZz1ufSgpLGZ1 bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe3ZhciByPXQuc2xpY2UoOCk7ciBp biB0aGlzfHx1KHRoaXMscil9ZnVuY3Rpb24gdChlLHQpe3ZhciByPXQuc2xp Y2UoOCk7ciBpbiB0aGlzfHxsKHRoaXMscil9dmFyIHI9RW1iZXIuZ2V0LG49 RW1iZXIuc2V0LGk9KEVtYmVyLlN0cmluZy5mbXQsRW1iZXIuYWRkQmVmb3Jl T2JzZXJ2ZXIpLG89RW1iZXIuYWRkT2JzZXJ2ZXIsYT1FbWJlci5yZW1vdmVC ZWZvcmVPYnNlcnZlcixzPUVtYmVyLnJlbW92ZU9ic2VydmVyLHU9RW1iZXIu cHJvcGVydHlXaWxsQ2hhbmdlLGw9RW1iZXIucHJvcGVydHlEaWRDaGFuZ2Us Yz1FbWJlci5tZXRhLGg9RW1iZXIuZGVmaW5lUHJvcGVydHk7RW1iZXIuT2Jq ZWN0UHJveHk9RW1iZXIuT2JqZWN0LmV4dGVuZCh7Y29udGVudDpudWxsLF9j b250ZW50RGlkQ2hhbmdlOkVtYmVyLm9ic2VydmVyKCJjb250ZW50IixmdW5j dGlvbigpe30pLGlzVHJ1dGh5OkVtYmVyLmNvbXB1dGVkLmJvb2woImNvbnRl bnQiKSxfZGVidWdDb250YWluZXJLZXk6bnVsbCx3aWxsV2F0Y2hQcm9wZXJ0 eTpmdW5jdGlvbihyKXt2YXIgbj0iY29udGVudC4iK3I7aSh0aGlzLG4sbnVs bCxlKSxvKHRoaXMsbixudWxsLHQpfSxkaWRVbndhdGNoUHJvcGVydHk6ZnVu Y3Rpb24ocil7dmFyIG49ImNvbnRlbnQuIityO2EodGhpcyxuLG51bGwsZSks cyh0aGlzLG4sbnVsbCx0KX0sdW5rbm93blByb3BlcnR5OmZ1bmN0aW9uKGUp e3ZhciB0PXIodGhpcywiY29udGVudCIpO3JldHVybiB0P3IodCxlKTp2b2lk IDB9LHNldFVua25vd25Qcm9wZXJ0eTpmdW5jdGlvbihlLHQpe3ZhciBpPWMo dGhpcyk7aWYoaS5wcm90bz09PXRoaXMpcmV0dXJuIGgodGhpcyxlLG51bGws dCksdDt2YXIgbz1yKHRoaXMsImNvbnRlbnQiKTtyZXR1cm4gbihvLGUsdCl9 fSl9KCksZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7cmV0dXJuIDA9PT1zLmxl bmd0aD97fTpzLnBvcCgpfWZ1bmN0aW9uIHQoZSl7cmV0dXJuIHMucHVzaChl KSxudWxsfWZ1bmN0aW9uIHIoZSx0KXtmdW5jdGlvbiByKHIpe3ZhciBvPW4o cixlKTtyZXR1cm4gaT90PT09bzohIW99dmFyIGk9Mj09PWFyZ3VtZW50cy5s ZW5ndGg7cmV0dXJuIHJ9dmFyIG49RW1iZXIuZ2V0LGk9RW1iZXIuc2V0LG89 QXJyYXkucHJvdG90eXBlLnNsaWNlLGE9RW1iZXIuRW51bWVyYWJsZVV0aWxz LmluZGV4T2Yscz1bXTtFbWJlci5FbnVtZXJhYmxlPUVtYmVyLk1peGluLmNy ZWF0ZSh7bmV4dE9iamVjdDpFbWJlci5yZXF1aXJlZChGdW5jdGlvbiksZmly c3RPYmplY3Q6RW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKXtpZigwPT09bih0 aGlzLCJsZW5ndGgiKSlyZXR1cm4gdm9pZCAwO3ZhciByLGk9ZSgpO3JldHVy biByPXRoaXMubmV4dE9iamVjdCgwLG51bGwsaSksdChpKSxyfSkucHJvcGVy dHkoIltdIiksbGFzdE9iamVjdDpFbWJlci5jb21wdXRlZChmdW5jdGlvbigp e3ZhciByPW4odGhpcywibGVuZ3RoIik7aWYoMD09PXIpcmV0dXJuIHZvaWQg MDt2YXIgaSxvPWUoKSxhPTAscz1udWxsO2RvIHM9aSxpPXRoaXMubmV4dE9i amVjdChhKysscyxvKTt3aGlsZSh2b2lkIDAhPT1pKTtyZXR1cm4gdChvKSxz fSkucHJvcGVydHkoIltdIiksY29udGFpbnM6ZnVuY3Rpb24oZSl7cmV0dXJu IHZvaWQgMCE9PXRoaXMuZmluZChmdW5jdGlvbih0KXtyZXR1cm4gdD09PWV9 KX0sZm9yRWFjaDpmdW5jdGlvbihyLGkpe2lmKCJmdW5jdGlvbiIhPXR5cGVv ZiByKXRocm93IG5ldyBUeXBlRXJyb3I7dmFyIG89bih0aGlzLCJsZW5ndGgi KSxhPW51bGwscz1lKCk7dm9pZCAwPT09aSYmKGk9bnVsbCk7Zm9yKHZhciB1 PTA7bz51O3UrKyl7dmFyIGw9dGhpcy5uZXh0T2JqZWN0KHUsYSxzKTtyLmNh bGwoaSxsLHUsdGhpcyksYT1sfXJldHVybiBhPW51bGwscz10KHMpLHRoaXN9 LGdldEVhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMubWFwQnkoZSl9LHNl dEVhY2g6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0 aW9uKHIpe2kocixlLHQpfSl9LG1hcDpmdW5jdGlvbihlLHQpe3ZhciByPUVt YmVyLkEoKTtyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKG4saSxvKXty W2ldPWUuY2FsbCh0LG4saSxvKX0pLHJ9LG1hcEJ5OmZ1bmN0aW9uKGUpe3Jl dHVybiB0aGlzLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gbih0LGUpfSl9LG1h cFByb3BlcnR5OkVtYmVyLmFsaWFzTWV0aG9kKCJtYXBCeSIpLGZpbHRlcjpm dW5jdGlvbihlLHQpe3ZhciByPUVtYmVyLkEoKTtyZXR1cm4gdGhpcy5mb3JF YWNoKGZ1bmN0aW9uKG4saSxvKXtlLmNhbGwodCxuLGksbykmJnIucHVzaChu KX0pLHJ9LHJlamVjdDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmZpbHRl cihmdW5jdGlvbigpe3JldHVybiFlLmFwcGx5KHQsYXJndW1lbnRzKX0pfSxm aWx0ZXJCeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbHRlcihyLmFwcGx5 KHRoaXMsYXJndW1lbnRzKSl9LGZpbHRlclByb3BlcnR5OkVtYmVyLmFsaWFz TWV0aG9kKCJmaWx0ZXJCeSIpLHJlamVjdEJ5OmZ1bmN0aW9uKGUsdCl7dmFy IHI9ZnVuY3Rpb24ocil7cmV0dXJuIG4ocixlKT09PXR9LGk9ZnVuY3Rpb24o dCl7cmV0dXJuISFuKHQsZSl9LG89Mj09PWFyZ3VtZW50cy5sZW5ndGg/cjpp O3JldHVybiB0aGlzLnJlamVjdChvKX0scmVqZWN0UHJvcGVydHk6RW1iZXIu YWxpYXNNZXRob2QoInJlamVjdEJ5IiksZmluZDpmdW5jdGlvbihyLGkpe3Zh ciBvPW4odGhpcywibGVuZ3RoIik7dm9pZCAwPT09aSYmKGk9bnVsbCk7Zm9y KHZhciBhLHMsdT1udWxsLGw9ITEsYz1lKCksaD0wO28+aCYmIWw7aCsrKWE9 dGhpcy5uZXh0T2JqZWN0KGgsdSxjKSwobD1yLmNhbGwoaSxhLGgsdGhpcykp JiYocz1hKSx1PWE7cmV0dXJuIGE9dT1udWxsLGM9dChjKSxzfSxmaW5kQnk6 ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maW5kKHIuYXBwbHkodGhpcyxhcmd1 bWVudHMpKX0sZmluZFByb3BlcnR5OkVtYmVyLmFsaWFzTWV0aG9kKCJmaW5k QnkiKSxldmVyeTpmdW5jdGlvbihlLHQpe3JldHVybiF0aGlzLmZpbmQoZnVu Y3Rpb24ocixuLGkpe3JldHVybiFlLmNhbGwodCxyLG4saSl9KX0sZXZlcnlC eTpFbWJlci5hbGlhc01ldGhvZCgiaXNFdmVyeSIpLGV2ZXJ5UHJvcGVydHk6 RW1iZXIuYWxpYXNNZXRob2QoImlzRXZlcnkiKSxpc0V2ZXJ5OmZ1bmN0aW9u KCl7cmV0dXJuIHRoaXMuZXZlcnkoci5hcHBseSh0aGlzLGFyZ3VtZW50cykp fSxhbnk6ZnVuY3Rpb24ocixpKXt2YXIgbyxhLHM9bih0aGlzLCJsZW5ndGgi KSx1PWUoKSxsPSExLGM9bnVsbDtmb3Iodm9pZCAwPT09aSYmKGk9bnVsbCks YT0wO3M+YSYmIWw7YSsrKW89dGhpcy5uZXh0T2JqZWN0KGEsYyx1KSxsPXIu Y2FsbChpLG8sYSx0aGlzKSxjPW87cmV0dXJuIG89Yz1udWxsLHU9dCh1KSxs fSxzb21lOkVtYmVyLmFsaWFzTWV0aG9kKCJhbnkiKSxpc0FueTpmdW5jdGlv bigpe3JldHVybiB0aGlzLmFueShyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9 LGFueUJ5OkVtYmVyLmFsaWFzTWV0aG9kKCJpc0FueSIpLHNvbWVQcm9wZXJ0 eTpFbWJlci5hbGlhc01ldGhvZCgiaXNBbnkiKSxyZWR1Y2U6ZnVuY3Rpb24o ZSx0LHIpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBl RXJyb3I7dmFyIG49dDtyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHQs aSl7bj1lKG4sdCxpLHRoaXMscil9LHRoaXMpLG59LGludm9rZTpmdW5jdGlv bihlKXt2YXIgdCxyPUVtYmVyLkEoKTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0 aD4xJiYodD1vLmNhbGwoYXJndW1lbnRzLDEpKSx0aGlzLmZvckVhY2goZnVu Y3Rpb24obixpKXt2YXIgbz1uJiZuW2VdOyJmdW5jdGlvbiI9PXR5cGVvZiBv JiYocltpXT10P28uYXBwbHkobix0KTpuW2VdKCkpfSx0aGlzKSxyfSx0b0Fy cmF5OmZ1bmN0aW9uKCl7dmFyIGU9RW1iZXIuQSgpO3JldHVybiB0aGlzLmZv ckVhY2goZnVuY3Rpb24odCxyKXtlW3JdPXR9KSxlfSxjb21wYWN0OmZ1bmN0 aW9uKCl7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBu dWxsIT1lfSl9LHdpdGhvdXQ6ZnVuY3Rpb24oZSl7aWYoIXRoaXMuY29udGFp bnMoZSkpcmV0dXJuIHRoaXM7dmFyIHQ9RW1iZXIuQSgpO3JldHVybiB0aGlz LmZvckVhY2goZnVuY3Rpb24ocil7ciE9PWUmJih0W3QubGVuZ3RoXT1yKX0p LHR9LHVuaXE6ZnVuY3Rpb24oKXt2YXIgZT1FbWJlci5BKCk7cmV0dXJuIHRo aXMuZm9yRWFjaChmdW5jdGlvbih0KXthKGUsdCk8MCYmZS5wdXNoKHQpfSks ZX0sIltdIjpFbWJlci5jb21wdXRlZChmdW5jdGlvbigpe3JldHVybiB0aGlz fSksYWRkRW51bWVyYWJsZU9ic2VydmVyOmZ1bmN0aW9uKGUsdCl7dmFyIHI9 dCYmdC53aWxsQ2hhbmdlfHwiZW51bWVyYWJsZVdpbGxDaGFuZ2UiLGk9dCYm dC5kaWRDaGFuZ2V8fCJlbnVtZXJhYmxlRGlkQ2hhbmdlIixvPW4odGhpcywi aGFzRW51bWVyYWJsZU9ic2VydmVycyIpO3JldHVybiBvfHxFbWJlci5wcm9w ZXJ0eVdpbGxDaGFuZ2UodGhpcywiaGFzRW51bWVyYWJsZU9ic2VydmVycyIp LEVtYmVyLmFkZExpc3RlbmVyKHRoaXMsIkBlbnVtZXJhYmxlOmJlZm9yZSIs ZSxyKSxFbWJlci5hZGRMaXN0ZW5lcih0aGlzLCJAZW51bWVyYWJsZTpjaGFu Z2UiLGUsaSksb3x8RW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywiaGFz RW51bWVyYWJsZU9ic2VydmVycyIpLHRoaXN9LHJlbW92ZUVudW1lcmFibGVP YnNlcnZlcjpmdW5jdGlvbihlLHQpe3ZhciByPXQmJnQud2lsbENoYW5nZXx8 ImVudW1lcmFibGVXaWxsQ2hhbmdlIixpPXQmJnQuZGlkQ2hhbmdlfHwiZW51 bWVyYWJsZURpZENoYW5nZSIsbz1uKHRoaXMsImhhc0VudW1lcmFibGVPYnNl cnZlcnMiKTtyZXR1cm4gbyYmRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRo aXMsImhhc0VudW1lcmFibGVPYnNlcnZlcnMiKSxFbWJlci5yZW1vdmVMaXN0 ZW5lcih0aGlzLCJAZW51bWVyYWJsZTpiZWZvcmUiLGUsciksRW1iZXIucmVt b3ZlTGlzdGVuZXIodGhpcywiQGVudW1lcmFibGU6Y2hhbmdlIixlLGkpLG8m JkVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsImhhc0VudW1lcmFibGVP YnNlcnZlcnMiKSx0aGlzfSxoYXNFbnVtZXJhYmxlT2JzZXJ2ZXJzOkVtYmVy LmNvbXB1dGVkKGZ1bmN0aW9uKCl7cmV0dXJuIEVtYmVyLmhhc0xpc3RlbmVy cyh0aGlzLCJAZW51bWVyYWJsZTpjaGFuZ2UiKXx8RW1iZXIuaGFzTGlzdGVu ZXJzKHRoaXMsIkBlbnVtZXJhYmxlOmJlZm9yZSIpfSksZW51bWVyYWJsZUNv bnRlbnRXaWxsQ2hhbmdlOmZ1bmN0aW9uKGUsdCl7dmFyIHIsaSxvO3JldHVy biByPSJudW1iZXIiPT10eXBlb2YgZT9lOmU/bihlLCJsZW5ndGgiKTplPS0x LGk9Im51bWJlciI9PXR5cGVvZiB0P3Q6dD9uKHQsImxlbmd0aCIpOnQ9LTEs bz0wPml8fDA+cnx8aS1yIT09MCwtMT09PWUmJihlPW51bGwpLC0xPT09dCYm KHQ9bnVsbCksRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsIltdIiks byYmRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsImxlbmd0aCIpLEVt YmVyLnNlbmRFdmVudCh0aGlzLCJAZW51bWVyYWJsZTpiZWZvcmUiLFt0aGlz LGUsdF0pLHRoaXN9LGVudW1lcmFibGVDb250ZW50RGlkQ2hhbmdlOmZ1bmN0 aW9uKGUsdCl7dmFyIHIsaSxvO3JldHVybiByPSJudW1iZXIiPT10eXBlb2Yg ZT9lOmU/bihlLCJsZW5ndGgiKTplPS0xLGk9Im51bWJlciI9PXR5cGVvZiB0 P3Q6dD9uKHQsImxlbmd0aCIpOnQ9LTEsbz0wPml8fDA+cnx8aS1yIT09MCwt MT09PWUmJihlPW51bGwpLC0xPT09dCYmKHQ9bnVsbCksRW1iZXIuc2VuZEV2 ZW50KHRoaXMsIkBlbnVtZXJhYmxlOmNoYW5nZSIsW3RoaXMsZSx0XSksbyYm RW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywibGVuZ3RoIiksRW1iZXIu cHJvcGVydHlEaWRDaGFuZ2UodGhpcywiW10iKSx0aGlzfSxzb3J0Qnk6ZnVu Y3Rpb24oKXt2YXIgZT1hcmd1bWVudHM7cmV0dXJuIHRoaXMudG9BcnJheSgp LnNvcnQoZnVuY3Rpb24odCxyKXtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2kr Kyl7dmFyIG89ZVtpXSxhPW4odCxvKSxzPW4ocixvKSx1PUVtYmVyLmNvbXBh cmUoYSxzKTtpZih1KXJldHVybiB1fXJldHVybiAwfSl9fSl9KCksZnVuY3Rp b24oKXt2YXIgZT1FbWJlci5nZXQsdD0oRW1iZXIuc2V0LEVtYmVyLmlzTm9u ZSkscj1FbWJlci5FbnVtZXJhYmxlVXRpbHMubWFwLG49RW1iZXIuY2FjaGVG b3I7RW1iZXIuQXJyYXk9RW1iZXIuTWl4aW4uY3JlYXRlKEVtYmVyLkVudW1l cmFibGUse2xlbmd0aDpFbWJlci5yZXF1aXJlZCgpLG9iamVjdEF0OmZ1bmN0 aW9uKHQpe3JldHVybiAwPnR8fHQ+PWUodGhpcywibGVuZ3RoIik/dm9pZCAw OmUodGhpcyx0KX0sb2JqZWN0c0F0OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7 cmV0dXJuIHIoZSxmdW5jdGlvbihlKXtyZXR1cm4gdC5vYmplY3RBdChlKX0p fSxuZXh0T2JqZWN0OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9iamVjdEF0 KGUpfSwiW10iOkVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKHQscil7cmV0dXJu IHZvaWQgMCE9PXImJnRoaXMucmVwbGFjZSgwLGUodGhpcywibGVuZ3RoIiks ciksdGhpc30pLGZpcnN0T2JqZWN0OkVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9u KCl7cmV0dXJuIHRoaXMub2JqZWN0QXQoMCl9KSxsYXN0T2JqZWN0OkVtYmVy LmNvbXB1dGVkKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2JqZWN0QXQoZSh0 aGlzLCJsZW5ndGgiKS0xKX0pLGNvbnRhaW5zOmZ1bmN0aW9uKGUpe3JldHVy biB0aGlzLmluZGV4T2YoZSk+PTB9LHNsaWNlOmZ1bmN0aW9uKHIsbil7dmFy IGk9RW1iZXIuQSgpLG89ZSh0aGlzLCJsZW5ndGgiKTtmb3IodChyKSYmKHI9 MCksKHQobil8fG4+bykmJihuPW8pLDA+ciYmKHI9bytyKSwwPm4mJihuPW8r bik7bj5yOylpW2kubGVuZ3RoXT10aGlzLm9iamVjdEF0KHIrKyk7cmV0dXJu IGl9LGluZGV4T2Y6ZnVuY3Rpb24odCxyKXt2YXIgbixpPWUodGhpcywibGVu Z3RoIik7Zm9yKHZvaWQgMD09PXImJihyPTApLDA+ciYmKHIrPWkpLG49cjtp Pm47bisrKWlmKHRoaXMub2JqZWN0QXQobik9PT10KXJldHVybiBuO3JldHVy bi0xfSxsYXN0SW5kZXhPZjpmdW5jdGlvbih0LHIpe3ZhciBuLGk9ZSh0aGlz LCJsZW5ndGgiKTtmb3IoKHZvaWQgMD09PXJ8fHI+PWkpJiYocj1pLTEpLDA+ ciYmKHIrPWkpLG49cjtuPj0wO24tLSlpZih0aGlzLm9iamVjdEF0KG4pPT09 dClyZXR1cm4gbjtyZXR1cm4tMX0sYWRkQXJyYXlPYnNlcnZlcjpmdW5jdGlv bih0LHIpe3ZhciBuPXImJnIud2lsbENoYW5nZXx8ImFycmF5V2lsbENoYW5n ZSIsaT1yJiZyLmRpZENoYW5nZXx8ImFycmF5RGlkQ2hhbmdlIixvPWUodGhp cywiaGFzQXJyYXlPYnNlcnZlcnMiKTtyZXR1cm4gb3x8RW1iZXIucHJvcGVy dHlXaWxsQ2hhbmdlKHRoaXMsImhhc0FycmF5T2JzZXJ2ZXJzIiksRW1iZXIu YWRkTGlzdGVuZXIodGhpcywiQGFycmF5OmJlZm9yZSIsdCxuKSxFbWJlci5h ZGRMaXN0ZW5lcih0aGlzLCJAYXJyYXk6Y2hhbmdlIix0LGkpLG98fEVtYmVy LnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsImhhc0FycmF5T2JzZXJ2ZXJzIiks dGhpc30scmVtb3ZlQXJyYXlPYnNlcnZlcjpmdW5jdGlvbih0LHIpe3ZhciBu PXImJnIud2lsbENoYW5nZXx8ImFycmF5V2lsbENoYW5nZSIsaT1yJiZyLmRp ZENoYW5nZXx8ImFycmF5RGlkQ2hhbmdlIixvPWUodGhpcywiaGFzQXJyYXlP YnNlcnZlcnMiKTtyZXR1cm4gbyYmRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdl KHRoaXMsImhhc0FycmF5T2JzZXJ2ZXJzIiksRW1iZXIucmVtb3ZlTGlzdGVu ZXIodGhpcywiQGFycmF5OmJlZm9yZSIsdCxuKSxFbWJlci5yZW1vdmVMaXN0 ZW5lcih0aGlzLCJAYXJyYXk6Y2hhbmdlIix0LGkpLG8mJkVtYmVyLnByb3Bl cnR5RGlkQ2hhbmdlKHRoaXMsImhhc0FycmF5T2JzZXJ2ZXJzIiksdGhpc30s aGFzQXJyYXlPYnNlcnZlcnM6RW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKXty ZXR1cm4gRW1iZXIuaGFzTGlzdGVuZXJzKHRoaXMsIkBhcnJheTpjaGFuZ2Ui KXx8RW1iZXIuaGFzTGlzdGVuZXJzKHRoaXMsIkBhcnJheTpiZWZvcmUiKX0p LGFycmF5Q29udGVudFdpbGxDaGFuZ2U6ZnVuY3Rpb24odCxyLG4pe3ZvaWQg MD09PXQ/KHQ9MCxyPW49LTEpOih2b2lkIDA9PT1yJiYocj0tMSksdm9pZCAw PT09biYmKG49LTEpKSxFbWJlci5pc1dhdGNoaW5nKHRoaXMsIkBlYWNoIikm JmUodGhpcywiQGVhY2giKSxFbWJlci5zZW5kRXZlbnQodGhpcywiQGFycmF5 OmJlZm9yZSIsW3RoaXMsdCxyLG5dKTt2YXIgaSxvO2lmKHQ+PTAmJnI+PTAm JmUodGhpcywiaGFzRW51bWVyYWJsZU9ic2VydmVycyIpKXtpPVtdLG89dCty O2Zvcih2YXIgYT10O28+YTthKyspaS5wdXNoKHRoaXMub2JqZWN0QXQoYSkp fWVsc2UgaT1yO3JldHVybiB0aGlzLmVudW1lcmFibGVDb250ZW50V2lsbENo YW5nZShpLG4pLHRoaXN9LGFycmF5Q29udGVudERpZENoYW5nZTpmdW5jdGlv bih0LHIsaSl7dm9pZCAwPT09dD8odD0wLHI9aT0tMSk6KHZvaWQgMD09PXIm JihyPS0xKSx2b2lkIDA9PT1pJiYoaT0tMSkpO3ZhciBvLGE7aWYodD49MCYm aT49MCYmZSh0aGlzLCJoYXNFbnVtZXJhYmxlT2JzZXJ2ZXJzIikpe289W10s YT10K2k7Zm9yKHZhciBzPXQ7YT5zO3MrKylvLnB1c2godGhpcy5vYmplY3RB dChzKSl9ZWxzZSBvPWk7dGhpcy5lbnVtZXJhYmxlQ29udGVudERpZENoYW5n ZShyLG8pLEVtYmVyLnNlbmRFdmVudCh0aGlzLCJAYXJyYXk6Y2hhbmdlIixb dGhpcyx0LHIsaV0pO3ZhciB1PWUodGhpcywibGVuZ3RoIiksbD1uKHRoaXMs ImZpcnN0T2JqZWN0IiksYz1uKHRoaXMsImxhc3RPYmplY3QiKTtyZXR1cm4g dGhpcy5vYmplY3RBdCgwKSE9PWwmJihFbWJlci5wcm9wZXJ0eVdpbGxDaGFu Z2UodGhpcywiZmlyc3RPYmplY3QiKSxFbWJlci5wcm9wZXJ0eURpZENoYW5n ZSh0aGlzLCJmaXJzdE9iamVjdCIpKSx0aGlzLm9iamVjdEF0KHUtMSkhPT1j JiYoRW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMsImxhc3RPYmplY3Qi KSxFbWJlci5wcm9wZXJ0eURpZENoYW5nZSh0aGlzLCJsYXN0T2JqZWN0Iikp LHRoaXN9LCJAZWFjaCI6RW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKXtyZXR1 cm4gdGhpcy5fX2VhY2h8fCh0aGlzLl9fZWFjaD1uZXcgRW1iZXIuRWFjaFBy b3h5KHRoaXMpKSx0aGlzLl9fZWFjaH0pfSl9KCksZnVuY3Rpb24oKXtmdW5j dGlvbiBlKGUsdCl7cmV0dXJuIkB0aGlzIj09PXQ/ZTptKGUsdCl9ZnVuY3Rp b24gdChlLHQscil7dGhpcy5jYWxsYmFja3M9ZSx0aGlzLmNwPXQsdGhpcy5p bnN0YW5jZU1ldGE9cix0aGlzLmRlcGVuZGVudEtleXNCeUd1aWQ9e30sdGhp cy50cmFja2VkQXJyYXlzQnlHdWlkPXt9LHRoaXMuc3VzcGVuZGVkPSExLHRo aXMuY2hhbmdlZEl0ZW1zPXt9fWZ1bmN0aW9uIHIoZSx0LHIpe3RoaXMuZGVw ZW5kZW50QXJyYXk9ZSx0aGlzLmluZGV4PXQsdGhpcy5pdGVtPWUub2JqZWN0 QXQodCksdGhpcy50cmFja2VkQXJyYXk9cix0aGlzLmJlZm9yZU9ic2VydmVy PW51bGwsdGhpcy5vYnNlcnZlcj1udWxsLHRoaXMuZGVzdHJveWVkPSExfWZ1 bmN0aW9uIG4oZSx0LHIpe3JldHVybiAwPmU/TWF0aC5tYXgoMCx0K2UpOnQ+ ZT9lOk1hdGgubWluKHQtcixlKX1mdW5jdGlvbiBpKGUsdCxyKXtyZXR1cm4g TWF0aC5taW4ocix0LWUpfWZ1bmN0aW9uIG8oZSx0LHIsbixpLG8pe3ZhciBh PXthcnJheUNoYW5nZWQ6ZSxpbmRleDpyLGl0ZW06dCxwcm9wZXJ0eU5hbWU6 bixwcm9wZXJ0eTppfTtyZXR1cm4gbyYmKGEucHJldmlvdXNWYWx1ZXM9byks YX1mdW5jdGlvbiBhKGUsdCxyLG4saSl7TyhlLGZ1bmN0aW9uKGEscyl7aS5z ZXRWYWx1ZSh0LmFkZGVkSXRlbS5jYWxsKHRoaXMsaS5nZXRWYWx1ZSgpLGEs byhlLGEscyxuLHIpLGkuc3VnYXJNZXRhKSl9LHRoaXMpfWZ1bmN0aW9uIHMo ZSx0KXt7dmFyIHI7ZS5fY2FsbGJhY2tzKCl9ZS5faGFzSW5zdGFuY2VNZXRh KHRoaXMsdCk/KHI9ZS5faW5zdGFuY2VNZXRhKHRoaXMsdCksci5zZXRWYWx1 ZShlLnJlc2V0VmFsdWUoci5nZXRWYWx1ZSgpKSkpOnI9ZS5faW5zdGFuY2VN ZXRhKHRoaXMsdCksZS5vcHRpb25zLmluaXRpYWxpemUmJmUub3B0aW9ucy5p bml0aWFsaXplLmNhbGwodGhpcyxyLmdldFZhbHVlKCkse3Byb3BlcnR5OmUs cHJvcGVydHlOYW1lOnR9LHIuc3VnYXJNZXRhKX1mdW5jdGlvbiB1KHQscil7 aWYoVC50ZXN0KHIpKXJldHVybiExO3ZhciBuPWUodCxyKTtyZXR1cm4gRW1i ZXIuQXJyYXkuZGV0ZWN0KG4pfWZ1bmN0aW9uIGwoZSx0LHIpe3RoaXMuY29u dGV4dD1lLHRoaXMucHJvcGVydHlOYW1lPXQsdGhpcy5jYWNoZT1mKGUpLmNh Y2hlLHRoaXMuZGVwZW5kZW50QXJyYXlzPXt9LHRoaXMuc3VnYXJNZXRhPXt9 LHRoaXMuaW5pdGlhbFZhbHVlPXJ9ZnVuY3Rpb24gYyh0KXt2YXIgcj10aGlz O3RoaXMub3B0aW9ucz10LHRoaXMuX2luc3RhbmNlTWV0YXM9e30sdGhpcy5f ZGVwZW5kZW50S2V5cz1udWxsLHRoaXMuX2l0ZW1Qcm9wZXJ0eUtleXM9e30s dGhpcy5fcHJldmlvdXNJdGVtUHJvcGVydHlLZXlzPXt9LHRoaXMucmVhZE9u bHkoKSx0aGlzLmNhY2hlYWJsZSgpLHRoaXMucmVjb21wdXRlT25jZT1mdW5j dGlvbihlKXtFbWJlci5ydW4ub25jZSh0aGlzLG4sZSl9O3ZhciBuPWZ1bmN0 aW9uKHQpe3ZhciBuPShyLl9kZXBlbmRlbnRLZXlzLHIuX2luc3RhbmNlTWV0 YSh0aGlzLHQpKSxpPXIuX2NhbGxiYWNrcygpO3MuY2FsbCh0aGlzLHIsdCks bi5kZXBlbmRlbnRBcnJheXNPYnNlcnZlci5zdXNwZW5kQXJyYXlPYnNlcnZl cnMoZnVuY3Rpb24oKXtPKHIuX2RlcGVuZGVudEtleXMsZnVuY3Rpb24odCl7 aWYodSh0aGlzLHQpKXt2YXIgaT1lKHRoaXMsdCksbz1uLmRlcGVuZGVudEFy cmF5c1t0XTtpPT09bz9yLl9wcmV2aW91c0l0ZW1Qcm9wZXJ0eUtleXNbdF0m JihkZWxldGUgci5fcHJldmlvdXNJdGVtUHJvcGVydHlLZXlzW3RdLG4uZGVw ZW5kZW50QXJyYXlzT2JzZXJ2ZXIuc2V0dXBQcm9wZXJ0eU9ic2VydmVycyh0 LHIuX2l0ZW1Qcm9wZXJ0eUtleXNbdF0pKToobi5kZXBlbmRlbnRBcnJheXNb dF09aSxvJiZuLmRlcGVuZGVudEFycmF5c09ic2VydmVyLnRlYXJkb3duT2Jz ZXJ2ZXJzKG8sdCksaSYmbi5kZXBlbmRlbnRBcnJheXNPYnNlcnZlci5zZXR1 cE9ic2VydmVycyhpLHQpKX19LHRoaXMpfSx0aGlzKSxPKHIuX2RlcGVuZGVu dEtleXMsZnVuY3Rpb24obyl7aWYodSh0aGlzLG8pKXt2YXIgcz1lKHRoaXMs byk7cyYmYS5jYWxsKHRoaXMscyxpLHIsdCxuKX19LHRoaXMpfTt0aGlzLmZ1 bmM9ZnVuY3Rpb24oZSl7cmV0dXJuIG4uY2FsbCh0aGlzLGUpLHIuX2luc3Rh bmNlTWV0YSh0aGlzLGUpLmdldFZhbHVlKCl9fWZ1bmN0aW9uIGgoZSl7cmV0 dXJuIGV9dmFyIG09RW1iZXIuZ2V0LHA9KEVtYmVyLnNldCxFbWJlci5ndWlk Rm9yKSxmPUVtYmVyLm1ldGEsZD1FbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2Us Yj1FbWJlci5wcm9wZXJ0eURpZENoYW5nZSxFPUVtYmVyLmFkZEJlZm9yZU9i c2VydmVyLHY9RW1iZXIucmVtb3ZlQmVmb3JlT2JzZXJ2ZXIsZz1FbWJlci5h ZGRPYnNlcnZlcix5PUVtYmVyLnJlbW92ZU9ic2VydmVyLF89RW1iZXIuQ29t cHV0ZWRQcm9wZXJ0eSx3PVtdLnNsaWNlLEM9RW1iZXIuY3JlYXRlLE89RW1i ZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2gsUD0vXiguKilcLkBlYWNoXC4o LiopLyxBPS8oLipcLkBlYWNoKXsyLH0vLFQ9L1wuXFtcXSQvLHg9RW1iZXIu ZXhwYW5kUHJvcGVydGllczt0LnByb3RvdHlwZT17c2V0VmFsdWU6ZnVuY3Rp b24oZSl7dGhpcy5pbnN0YW5jZU1ldGEuc2V0VmFsdWUoZSwhMCl9LGdldFZh bHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5zdGFuY2VNZXRhLmdldFZh bHVlKCl9LHNldHVwT2JzZXJ2ZXJzOmZ1bmN0aW9uKGUsdCl7dGhpcy5kZXBl bmRlbnRLZXlzQnlHdWlkW3AoZSldPXQsZS5hZGRBcnJheU9ic2VydmVyKHRo aXMse3dpbGxDaGFuZ2U6ImRlcGVuZGVudEFycmF5V2lsbENoYW5nZSIsZGlk Q2hhbmdlOiJkZXBlbmRlbnRBcnJheURpZENoYW5nZSJ9KSx0aGlzLmNwLl9p dGVtUHJvcGVydHlLZXlzW3RdJiZ0aGlzLnNldHVwUHJvcGVydHlPYnNlcnZl cnModCx0aGlzLmNwLl9pdGVtUHJvcGVydHlLZXlzW3RdKX0sdGVhcmRvd25P YnNlcnZlcnM6ZnVuY3Rpb24oZSx0KXt2YXIgcj10aGlzLmNwLl9pdGVtUHJv cGVydHlLZXlzW3RdfHxbXTtkZWxldGUgdGhpcy5kZXBlbmRlbnRLZXlzQnlH dWlkW3AoZSldLHRoaXMudGVhcmRvd25Qcm9wZXJ0eU9ic2VydmVycyh0LHIp LGUucmVtb3ZlQXJyYXlPYnNlcnZlcih0aGlzLHt3aWxsQ2hhbmdlOiJkZXBl bmRlbnRBcnJheVdpbGxDaGFuZ2UiLGRpZENoYW5nZToiZGVwZW5kZW50QXJy YXlEaWRDaGFuZ2UifSl9LHN1c3BlbmRBcnJheU9ic2VydmVyczpmdW5jdGlv bihlLHQpe3ZhciByPXRoaXMuc3VzcGVuZGVkO3RoaXMuc3VzcGVuZGVkPSEw LGUuY2FsbCh0KSx0aGlzLnN1c3BlbmRlZD1yfSxzZXR1cFByb3BlcnR5T2Jz ZXJ2ZXJzOmZ1bmN0aW9uKHQscil7dmFyIG49ZSh0aGlzLmluc3RhbmNlTWV0 YS5jb250ZXh0LHQpLGk9ZShuLCJsZW5ndGgiKSxvPW5ldyBBcnJheShpKTt0 aGlzLnJlc2V0VHJhbnNmb3JtYXRpb25zKHQsbyksTyhuLGZ1bmN0aW9uKGUs aSl7dmFyIGE9dGhpcy5jcmVhdGVQcm9wZXJ0eU9ic2VydmVyQ29udGV4dChu LGksdGhpcy50cmFja2VkQXJyYXlzQnlHdWlkW3RdKTtvW2ldPWEsTyhyLGZ1 bmN0aW9uKHQpe0UoZSx0LHRoaXMsYS5iZWZvcmVPYnNlcnZlciksZyhlLHQs dGhpcyxhLm9ic2VydmVyKX0sdGhpcyl9LHRoaXMpfSx0ZWFyZG93blByb3Bl cnR5T2JzZXJ2ZXJzOmZ1bmN0aW9uKGUsdCl7dmFyIHIsbixpLG89dGhpcyxh PXRoaXMudHJhY2tlZEFycmF5c0J5R3VpZFtlXTthJiZhLmFwcGx5KGZ1bmN0 aW9uKGUsYSxzKXtzIT09RW1iZXIuVHJhY2tlZEFycmF5LkRFTEVURSYmTyhl LGZ1bmN0aW9uKGUpe2UuZGVzdHJveWVkPSEwLHI9ZS5iZWZvcmVPYnNlcnZl cixuPWUub2JzZXJ2ZXIsaT1lLml0ZW0sTyh0LGZ1bmN0aW9uKGUpe3YoaSxl LG8scikseShpLGUsbyxuKX0pfSl9KX0sY3JlYXRlUHJvcGVydHlPYnNlcnZl ckNvbnRleHQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPW5ldyByKGUsdCxuKTty ZXR1cm4gdGhpcy5jcmVhdGVQcm9wZXJ0eU9ic2VydmVyKGkpLGl9LGNyZWF0 ZVByb3BlcnR5T2JzZXJ2ZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztlLmJl Zm9yZU9ic2VydmVyPWZ1bmN0aW9uKHIsbil7cmV0dXJuIHQuaXRlbVByb3Bl cnR5V2lsbENoYW5nZShyLG4sZS5kZXBlbmRlbnRBcnJheSxlKX0sZS5vYnNl cnZlcj1mdW5jdGlvbihyLG4pe3JldHVybiB0Lml0ZW1Qcm9wZXJ0eURpZENo YW5nZShyLG4sZS5kZXBlbmRlbnRBcnJheSxlKX19LHJlc2V0VHJhbnNmb3Jt YXRpb25zOmZ1bmN0aW9uKGUsdCl7dGhpcy50cmFja2VkQXJyYXlzQnlHdWlk W2VdPW5ldyBFbWJlci5UcmFja2VkQXJyYXkodCl9LHRyYWNrQWRkOmZ1bmN0 aW9uKGUsdCxyKXt2YXIgbj10aGlzLnRyYWNrZWRBcnJheXNCeUd1aWRbZV07 biYmbi5hZGRJdGVtcyh0LHIpfSx0cmFja1JlbW92ZTpmdW5jdGlvbihlLHQs cil7dmFyIG49dGhpcy50cmFja2VkQXJyYXlzQnlHdWlkW2VdO3JldHVybiBu P24ucmVtb3ZlSXRlbXModCxyKTpbXX0sdXBkYXRlSW5kZXhlczpmdW5jdGlv bih0LHIpe3ZhciBuPWUociwibGVuZ3RoIik7dC5hcHBseShmdW5jdGlvbihl LHQscil7ciE9PUVtYmVyLlRyYWNrZWRBcnJheS5ERUxFVEUmJihyIT09RW1i ZXIuVHJhY2tlZEFycmF5LlJFVEFJTnx8ZS5sZW5ndGghPT1ufHwwIT09dCkm Jk8oZSxmdW5jdGlvbihlLHIpe2UuaW5kZXg9cit0fSl9KX0sZGVwZW5kZW50 QXJyYXlXaWxsQ2hhbmdlOmZ1bmN0aW9uKHQscixhKXtmdW5jdGlvbiBzKGUp e21baF0uZGVzdHJveWVkPSEwLHYobCxlLHRoaXMsbVtoXS5iZWZvcmVPYnNl cnZlcikseShsLGUsdGhpcyxtW2hdLm9ic2VydmVyKX1pZighdGhpcy5zdXNw ZW5kZWQpe3ZhciB1LGwsYyxoLG0sZj10aGlzLmNhbGxiYWNrcy5yZW1vdmVk SXRlbSxkPXAodCksYj10aGlzLmRlcGVuZGVudEtleXNCeUd1aWRbZF0sRT10 aGlzLmNwLl9pdGVtUHJvcGVydHlLZXlzW2JdfHxbXSxnPWUodCwibGVuZ3Ro IiksXz1uKHIsZywwKSx3PWkoXyxnLGEpO2ZvcihtPXRoaXMudHJhY2tSZW1v dmUoYixfLHcpLGg9dy0xO2g+PTAmJihjPV8raCwhKGM+PWcpKTstLWgpbD10 Lm9iamVjdEF0KGMpLE8oRSxzLHRoaXMpLHU9byh0LGwsYyx0aGlzLmluc3Rh bmNlTWV0YS5wcm9wZXJ0eU5hbWUsdGhpcy5jcCksdGhpcy5zZXRWYWx1ZShm LmNhbGwodGhpcy5pbnN0YW5jZU1ldGEuY29udGV4dCx0aGlzLmdldFZhbHVl KCksbCx1LHRoaXMuaW5zdGFuY2VNZXRhLnN1Z2FyTWV0YSkpfX0sZGVwZW5k ZW50QXJyYXlEaWRDaGFuZ2U6ZnVuY3Rpb24odCxyLGksYSl7aWYoIXRoaXMu c3VzcGVuZGVkKXt2YXIgcyx1LGw9dGhpcy5jYWxsYmFja3MuYWRkZWRJdGVt LGM9cCh0KSxoPXRoaXMuZGVwZW5kZW50S2V5c0J5R3VpZFtjXSxtPW5ldyBB cnJheShhKSxmPXRoaXMuY3AuX2l0ZW1Qcm9wZXJ0eUtleXNbaF0sZD1lKHQs Imxlbmd0aCIpLGI9bihyLGQsYSk7Tyh0LnNsaWNlKGIsYithKSxmdW5jdGlv bihlLHIpe2YmJih1PW1bcl09dGhpcy5jcmVhdGVQcm9wZXJ0eU9ic2VydmVy Q29udGV4dCh0LGIrcix0aGlzLnRyYWNrZWRBcnJheXNCeUd1aWRbaF0pLE8o ZixmdW5jdGlvbih0KXtFKGUsdCx0aGlzLHUuYmVmb3JlT2JzZXJ2ZXIpLGco ZSx0LHRoaXMsdS5vYnNlcnZlcil9LHRoaXMpKSxzPW8odCxlLGIrcix0aGlz Lmluc3RhbmNlTWV0YS5wcm9wZXJ0eU5hbWUsdGhpcy5jcCksdGhpcy5zZXRW YWx1ZShsLmNhbGwodGhpcy5pbnN0YW5jZU1ldGEuY29udGV4dCx0aGlzLmdl dFZhbHVlKCksZSxzLHRoaXMuaW5zdGFuY2VNZXRhLnN1Z2FyTWV0YSkpfSx0 aGlzKSx0aGlzLnRyYWNrQWRkKGgsYixtKX19LGl0ZW1Qcm9wZXJ0eVdpbGxD aGFuZ2U6ZnVuY3Rpb24odCxyLG4saSl7dmFyIG89cCh0KTt0aGlzLmNoYW5n ZWRJdGVtc1tvXXx8KHRoaXMuY2hhbmdlZEl0ZW1zW29dPXthcnJheTpuLG9i c2VydmVyQ29udGV4dDppLG9iajp0LHByZXZpb3VzVmFsdWVzOnt9fSksdGhp cy5jaGFuZ2VkSXRlbXNbb10ucHJldmlvdXNWYWx1ZXNbcl09ZSh0LHIpfSxp dGVtUHJvcGVydHlEaWRDaGFuZ2U6ZnVuY3Rpb24oKXt0aGlzLmZsdXNoQ2hh bmdlcygpfSxmbHVzaENoYW5nZXM6ZnVuY3Rpb24oKXt2YXIgZSx0LHIsbj10 aGlzLmNoYW5nZWRJdGVtcztmb3IoZSBpbiBuKXQ9bltlXSx0Lm9ic2VydmVy Q29udGV4dC5kZXN0cm95ZWR8fCh0aGlzLnVwZGF0ZUluZGV4ZXModC5vYnNl cnZlckNvbnRleHQudHJhY2tlZEFycmF5LHQub2JzZXJ2ZXJDb250ZXh0LmRl cGVuZGVudEFycmF5KSxyPW8odC5hcnJheSx0Lm9iaix0Lm9ic2VydmVyQ29u dGV4dC5pbmRleCx0aGlzLmluc3RhbmNlTWV0YS5wcm9wZXJ0eU5hbWUsdGhp cy5jcCx0LnByZXZpb3VzVmFsdWVzKSx0aGlzLnNldFZhbHVlKHRoaXMuY2Fs bGJhY2tzLnJlbW92ZWRJdGVtLmNhbGwodGhpcy5pbnN0YW5jZU1ldGEuY29u dGV4dCx0aGlzLmdldFZhbHVlKCksdC5vYmoscix0aGlzLmluc3RhbmNlTWV0 YS5zdWdhck1ldGEpKSx0aGlzLnNldFZhbHVlKHRoaXMuY2FsbGJhY2tzLmFk ZGVkSXRlbS5jYWxsKHRoaXMuaW5zdGFuY2VNZXRhLmNvbnRleHQsdGhpcy5n ZXRWYWx1ZSgpLHQub2JqLHIsdGhpcy5pbnN0YW5jZU1ldGEuc3VnYXJNZXRh KSkpO3RoaXMuY2hhbmdlZEl0ZW1zPXt9fX0sbC5wcm90b3R5cGU9e2dldFZh bHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJvcGVydHlOYW1lIGluIHRo aXMuY2FjaGU/dGhpcy5jYWNoZVt0aGlzLnByb3BlcnR5TmFtZV06dGhpcy5p bml0aWFsVmFsdWV9LHNldFZhbHVlOmZ1bmN0aW9uKGUsdCl7ZSE9PXRoaXMu Y2FjaGVbdGhpcy5wcm9wZXJ0eU5hbWVdJiYodCYmZCh0aGlzLmNvbnRleHQs dGhpcy5wcm9wZXJ0eU5hbWUpLHZvaWQgMD09PWU/ZGVsZXRlIHRoaXMuY2Fj aGVbdGhpcy5wcm9wZXJ0eU5hbWVdOnRoaXMuY2FjaGVbdGhpcy5wcm9wZXJ0 eU5hbWVdPWUsdCYmYih0aGlzLmNvbnRleHQsdGhpcy5wcm9wZXJ0eU5hbWUp KX19LEVtYmVyLlJlZHVjZUNvbXB1dGVkUHJvcGVydHk9YyxjLnByb3RvdHlw ZT1DKF8ucHJvdG90eXBlKSxjLnByb3RvdHlwZS5fY2FsbGJhY2tzPWZ1bmN0 aW9uKCl7aWYoIXRoaXMuY2FsbGJhY2tzKXt2YXIgZT10aGlzLm9wdGlvbnM7 dGhpcy5jYWxsYmFja3M9e3JlbW92ZWRJdGVtOmUucmVtb3ZlZEl0ZW18fGgs YWRkZWRJdGVtOmUuYWRkZWRJdGVtfHxofX1yZXR1cm4gdGhpcy5jYWxsYmFj a3N9LGMucHJvdG90eXBlLl9oYXNJbnN0YW5jZU1ldGE9ZnVuY3Rpb24oZSx0 KXt2YXIgcj1wKGUpLG49cisiOiIrdDtyZXR1cm4hIXRoaXMuX2luc3RhbmNl TWV0YXNbbl19LGMucHJvdG90eXBlLl9pbnN0YW5jZU1ldGE9ZnVuY3Rpb24o ZSxyKXt2YXIgbj1wKGUpLGk9bisiOiIrcixvPXRoaXMuX2luc3RhbmNlTWV0 YXNbaV07cmV0dXJuIG98fChvPXRoaXMuX2luc3RhbmNlTWV0YXNbaV09bmV3 IGwoZSxyLHRoaXMuaW5pdGlhbFZhbHVlKCkpLG8uZGVwZW5kZW50QXJyYXlz T2JzZXJ2ZXI9bmV3IHQodGhpcy5fY2FsbGJhY2tzKCksdGhpcyxvLGUscixv LnN1Z2FyTWV0YSkpLG99LGMucHJvdG90eXBlLmluaXRpYWxWYWx1ZT1mdW5j dGlvbigpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLm9wdGlvbnMu aW5pdGlhbFZhbHVlP3RoaXMub3B0aW9ucy5pbml0aWFsVmFsdWUoKTp0aGlz Lm9wdGlvbnMuaW5pdGlhbFZhbHVlfSxjLnByb3RvdHlwZS5yZXNldFZhbHVl PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5pdGlhbFZhbHVlKCl9LGMucHJv dG90eXBlLml0ZW1Qcm9wZXJ0eUtleT1mdW5jdGlvbihlLHQpe3RoaXMuX2l0 ZW1Qcm9wZXJ0eUtleXNbZV09dGhpcy5faXRlbVByb3BlcnR5S2V5c1tlXXx8 W10sdGhpcy5faXRlbVByb3BlcnR5S2V5c1tlXS5wdXNoKHQpCn0sYy5wcm90 b3R5cGUuY2xlYXJJdGVtUHJvcGVydHlLZXlzPWZ1bmN0aW9uKGUpe3RoaXMu X2l0ZW1Qcm9wZXJ0eUtleXNbZV0mJih0aGlzLl9wcmV2aW91c0l0ZW1Qcm9w ZXJ0eUtleXNbZV09dGhpcy5faXRlbVByb3BlcnR5S2V5c1tlXSx0aGlzLl9p dGVtUHJvcGVydHlLZXlzW2VdPVtdKX0sYy5wcm90b3R5cGUucHJvcGVydHk9 ZnVuY3Rpb24oKXt2YXIgZSx0LHI9dGhpcyxuPXcuY2FsbChhcmd1bWVudHMp LGk9bmV3IEVtYmVyLlNldDtyZXR1cm4gTyhuLGZ1bmN0aW9uKG4pe2lmKEEu dGVzdChuKSl0aHJvdyBuZXcgRW1iZXIuRXJyb3IoIk5lc3RlZCBAZWFjaCBw cm9wZXJ0aWVzIG5vdCBzdXBwb3J0ZWQ6ICIrbik7aWYoZT1QLmV4ZWMobikp e3Q9ZVsxXTt2YXIgbz1lWzJdLGE9ZnVuY3Rpb24oZSl7ci5pdGVtUHJvcGVy dHlLZXkodCxlKX07eChvLGEpLGkuYWRkKHQpfWVsc2UgaS5hZGQobil9KSxf LnByb3RvdHlwZS5wcm9wZXJ0eS5hcHBseSh0aGlzLGkudG9BcnJheSgpKX0s RW1iZXIucmVkdWNlQ29tcHV0ZWQ9ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoYXJn dW1lbnRzLmxlbmd0aD4xJiYodD13LmNhbGwoYXJndW1lbnRzLDAsLTEpLGU9 dy5jYWxsKGFyZ3VtZW50cywtMSlbMF0pLCJvYmplY3QiIT10eXBlb2YgZSl0 aHJvdyBuZXcgRW1iZXIuRXJyb3IoIlJlZHVjZSBDb21wdXRlZCBQcm9wZXJ0 eSBkZWNsYXJlZCB3aXRob3V0IGFuIG9wdGlvbnMgaGFzaCIpO2lmKCEoImlu aXRpYWxWYWx1ZSJpbiBlKSl0aHJvdyBuZXcgRW1iZXIuRXJyb3IoIlJlZHVj ZSBDb21wdXRlZCBQcm9wZXJ0eSBkZWNsYXJlZCB3aXRob3V0IGFuIGluaXRp YWwgdmFsdWUiKTt2YXIgcj1uZXcgYyhlKTtyZXR1cm4gdCYmci5wcm9wZXJ0 eS5hcHBseShyLHQpLHJ9fSgpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3Zh ciBlPXRoaXM7cmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMu ZnVuYz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIGUu X2hhc0luc3RhbmNlTWV0YSh0aGlzLHIpfHxpKGUuX2RlcGVuZGVudEtleXMs ZnVuY3Rpb24odCl7RW1iZXIuYWRkT2JzZXJ2ZXIodGhpcyx0LGZ1bmN0aW9u KCl7ZS5yZWNvbXB1dGVPbmNlLmNhbGwodGhpcyxyKX0pfSx0aGlzKSx0LmFw cGx5KHRoaXMsYXJndW1lbnRzKX19KHRoaXMuZnVuYyksdGhpc312YXIgdD1F bWJlci5SZWR1Y2VDb21wdXRlZFByb3BlcnR5LHI9W10uc2xpY2Usbj1FbWJl ci5jcmVhdGUsaT1FbWJlci5FbnVtZXJhYmxlVXRpbHMuZm9yRWFjaDtFbWJl ci5BcnJheUNvbXB1dGVkUHJvcGVydHk9ZSxlLnByb3RvdHlwZT1uKHQucHJv dG90eXBlKSxlLnByb3RvdHlwZS5pbml0aWFsVmFsdWU9ZnVuY3Rpb24oKXty ZXR1cm4gRW1iZXIuQSgpfSxlLnByb3RvdHlwZS5yZXNldFZhbHVlPWZ1bmN0 aW9uKGUpe3JldHVybiBlLmNsZWFyKCksZX0sZS5wcm90b3R5cGUuZGlkQ2hh bmdlPWZ1bmN0aW9uKCl7fSxFbWJlci5hcnJheUNvbXB1dGVkPWZ1bmN0aW9u KHQpe3ZhciBuO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSYmKG49ci5jYWxsKGFy Z3VtZW50cywwLC0xKSx0PXIuY2FsbChhcmd1bWVudHMsLTEpWzBdKSwib2Jq ZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVtYmVyLkVycm9yKCJBcnJheSBD b21wdXRlZCBQcm9wZXJ0eSBkZWNsYXJlZCB3aXRob3V0IGFuIG9wdGlvbnMg aGFzaCIpO3ZhciBpPW5ldyBlKHQpO3JldHVybiBuJiZpLnByb3BlcnR5LmFw cGx5KGksbiksaX19KCksZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsaSxvLGEp e2Z1bmN0aW9uIHMoZSl7cmV0dXJuIHQuZGV0ZWN0SW5zdGFuY2UoZSk/bihy KGUsImNvbnRlbnQiKSk6bihlKX12YXIgdSxsLGMsaCxtO3JldHVybiBhcmd1 bWVudHMubGVuZ3RoPDQmJihhPXIoZSwibGVuZ3RoIikpLGFyZ3VtZW50cy5s ZW5ndGg8MyYmKG89MCksbz09PWE/bzoodT1vK01hdGguZmxvb3IoKGEtbykv MiksbD1lLm9iamVjdEF0KHUpLGg9cyhsKSxtPXMoaSksaD09PW0/dTooYz10 aGlzLm9yZGVyKGwsaSksMD09PWMmJihjPW0+aD8tMToxKSwwPmM/dGhpcy5i aW5hcnlTZWFyY2goZSxpLHUrMSxhKTpjPjA/dGhpcy5iaW5hcnlTZWFyY2go ZSxpLG8sdSk6dSkpfXZhciB0LHI9RW1iZXIuZ2V0LG49KEVtYmVyLnNldCxF bWJlci5ndWlkRm9yKSxpPUVtYmVyLm1lcmdlLG89W10uc2xpY2UsYT1FbWJl ci5FbnVtZXJhYmxlVXRpbHMuZm9yRWFjaCxzPUVtYmVyLkVudW1lcmFibGVV dGlscy5tYXA7RW1iZXIuY29tcHV0ZWQuc3VtPWZ1bmN0aW9uKGUpe3JldHVy biBFbWJlci5yZWR1Y2VDb21wdXRlZChlLHtpbml0aWFsVmFsdWU6MCxhZGRl ZEl0ZW06ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSt0fSxyZW1vdmVkSXRlbTpm dW5jdGlvbihlLHQpe3JldHVybiBlLXR9fSl9LEVtYmVyLmNvbXB1dGVkLm1h eD1mdW5jdGlvbihlKXtyZXR1cm4gRW1iZXIucmVkdWNlQ29tcHV0ZWQoZSx7 aW5pdGlhbFZhbHVlOi0xLzAsYWRkZWRJdGVtOmZ1bmN0aW9uKGUsdCl7cmV0 dXJuIE1hdGgubWF4KGUsdCl9LHJlbW92ZWRJdGVtOmZ1bmN0aW9uKGUsdCl7 cmV0dXJuIGU+dD9lOnZvaWQgMH19KX0sRW1iZXIuY29tcHV0ZWQubWluPWZ1 bmN0aW9uKGUpe3JldHVybiBFbWJlci5yZWR1Y2VDb21wdXRlZChlLHtpbml0 aWFsVmFsdWU6MS8wLGFkZGVkSXRlbTpmdW5jdGlvbihlLHQpe3JldHVybiBN YXRoLm1pbihlLHQpfSxyZW1vdmVkSXRlbTpmdW5jdGlvbihlLHQpe3JldHVy biB0PmU/ZTp2b2lkIDB9fSl9LEVtYmVyLmNvbXB1dGVkLm1hcD1mdW5jdGlv bihlLHQpe3ZhciByPXthZGRlZEl0ZW06ZnVuY3Rpb24oZSxyLG4pe3ZhciBp PXQuY2FsbCh0aGlzLHIpO3JldHVybiBlLmluc2VydEF0KG4uaW5kZXgsaSks ZX0scmVtb3ZlZEl0ZW06ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlLnJlbW92 ZUF0KHIuaW5kZXgsMSksZX19O3JldHVybiBFbWJlci5hcnJheUNvbXB1dGVk KGUscil9LEVtYmVyLmNvbXB1dGVkLm1hcEJ5PWZ1bmN0aW9uKGUsdCl7dmFy IG49ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZSx0KX07cmV0dXJuIEVtYmVyLmNv bXB1dGVkLm1hcChlKyIuQGVhY2guIit0LG4pfSxFbWJlci5jb21wdXRlZC5t YXBQcm9wZXJ0eT1FbWJlci5jb21wdXRlZC5tYXBCeSxFbWJlci5jb21wdXRl ZC5maWx0ZXI9ZnVuY3Rpb24oZSx0KXt2YXIgcj17aW5pdGlhbGl6ZTpmdW5j dGlvbihlLHQscil7ci5maWx0ZXJlZEFycmF5SW5kZXhlcz1uZXcgRW1iZXIu U3ViQXJyYXl9LGFkZGVkSXRlbTpmdW5jdGlvbihlLHIsbixpKXt2YXIgbz0h IXQuY2FsbCh0aGlzLHIpLGE9aS5maWx0ZXJlZEFycmF5SW5kZXhlcy5hZGRJ dGVtKG4uaW5kZXgsbyk7cmV0dXJuIG8mJmUuaW5zZXJ0QXQoYSxyKSxlfSxy ZW1vdmVkSXRlbTpmdW5jdGlvbihlLHQscixuKXt2YXIgaT1uLmZpbHRlcmVk QXJyYXlJbmRleGVzLnJlbW92ZUl0ZW0oci5pbmRleCk7cmV0dXJuIGk+LTEm JmUucmVtb3ZlQXQoaSksZX19O3JldHVybiBFbWJlci5hcnJheUNvbXB1dGVk KGUscil9LEVtYmVyLmNvbXB1dGVkLmZpbHRlckJ5PWZ1bmN0aW9uKGUsdCxu KXt2YXIgaTtyZXR1cm4gaT0yPT09YXJndW1lbnRzLmxlbmd0aD9mdW5jdGlv bihlKXtyZXR1cm4gcihlLHQpfTpmdW5jdGlvbihlKXtyZXR1cm4gcihlLHQp PT09bn0sRW1iZXIuY29tcHV0ZWQuZmlsdGVyKGUrIi5AZWFjaC4iK3QsaSl9 LEVtYmVyLmNvbXB1dGVkLmZpbHRlclByb3BlcnR5PUVtYmVyLmNvbXB1dGVk LmZpbHRlckJ5LEVtYmVyLmNvbXB1dGVkLnVuaXE9ZnVuY3Rpb24oKXt2YXIg ZT1vLmNhbGwoYXJndW1lbnRzKTtyZXR1cm4gZS5wdXNoKHtpbml0aWFsaXpl OmZ1bmN0aW9uKGUsdCxyKXtyLml0ZW1Db3VudHM9e319LGFkZGVkSXRlbTpm dW5jdGlvbihlLHQscixpKXt2YXIgbz1uKHQpO3JldHVybiBpLml0ZW1Db3Vu dHNbb10/KytpLml0ZW1Db3VudHNbb106aS5pdGVtQ291bnRzW29dPTEsZS5h ZGRPYmplY3QodCksZX0scmVtb3ZlZEl0ZW06ZnVuY3Rpb24oZSx0LHIsaSl7 dmFyIG89bih0KSxhPWkuaXRlbUNvdW50cztyZXR1cm4gMD09PS0tYVtvXSYm ZS5yZW1vdmVPYmplY3QodCksZX19KSxFbWJlci5hcnJheUNvbXB1dGVkLmFw cGx5KG51bGwsZSl9LEVtYmVyLmNvbXB1dGVkLnVuaW9uPUVtYmVyLmNvbXB1 dGVkLnVuaXEsRW1iZXIuY29tcHV0ZWQuaW50ZXJzZWN0PWZ1bmN0aW9uKCl7 dmFyIGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHMoZS5wcm9wZXJ0eS5fZGVwZW5k ZW50S2V5cyxmdW5jdGlvbihlKXtyZXR1cm4gbihlKX0pfSx0PW8uY2FsbChh cmd1bWVudHMpO3JldHVybiB0LnB1c2goe2luaXRpYWxpemU6ZnVuY3Rpb24o ZSx0LHIpe3IuaXRlbUNvdW50cz17fX0sYWRkZWRJdGVtOmZ1bmN0aW9uKHQs cixpLG8pe3ZhciBhPW4ocikscz0oZShpKSxuKGkuYXJyYXlDaGFuZ2VkKSks dT1pLnByb3BlcnR5Ll9kZXBlbmRlbnRLZXlzLmxlbmd0aCxsPW8uaXRlbUNv dW50cztyZXR1cm4gbFthXXx8KGxbYV09e30pLHZvaWQgMD09PWxbYV1bc10m JihsW2FdW3NdPTApLDE9PT0rK2xbYV1bc10mJnU9PT1FbWJlci5rZXlzKGxb YV0pLmxlbmd0aCYmdC5hZGRPYmplY3QociksdH0scmVtb3ZlZEl0ZW06ZnVu Y3Rpb24odCxyLGksbyl7dmFyIGEscz1uKHIpLHU9KGUoaSksbihpLmFycmF5 Q2hhbmdlZCkpLGw9KGkucHJvcGVydHkuX2RlcGVuZGVudEtleXMubGVuZ3Ro LG8uaXRlbUNvdW50cyk7cmV0dXJuIHZvaWQgMD09PWxbc11bdV0mJihsW3Nd W3VdPTApLDA9PT0tLWxbc11bdV0mJihkZWxldGUgbFtzXVt1XSxhPUVtYmVy LmtleXMobFtzXSkubGVuZ3RoLDA9PT1hJiZkZWxldGUgbFtzXSx0LnJlbW92 ZU9iamVjdChyKSksdH19KSxFbWJlci5hcnJheUNvbXB1dGVkLmFwcGx5KG51 bGwsdCl9LEVtYmVyLmNvbXB1dGVkLnNldERpZmY9ZnVuY3Rpb24oZSx0KXtp ZigyIT09YXJndW1lbnRzLmxlbmd0aCl0aHJvdyBuZXcgRW1iZXIuRXJyb3Io InNldERpZmYgcmVxdWlyZXMgZXhhY3RseSB0d28gZGVwZW5kZW50IGFycmF5 cy4iKTtyZXR1cm4gRW1iZXIuYXJyYXlDb21wdXRlZChlLHQse2FkZGVkSXRl bTpmdW5jdGlvbihuLGksbyl7dmFyIGE9cih0aGlzLGUpLHM9cih0aGlzLHQp O3JldHVybiBvLmFycmF5Q2hhbmdlZD09PWE/cy5jb250YWlucyhpKXx8bi5h ZGRPYmplY3QoaSk6bi5yZW1vdmVPYmplY3QoaSksbn0scmVtb3ZlZEl0ZW06 ZnVuY3Rpb24obixpLG8pe3ZhciBhPXIodGhpcyxlKSxzPXIodGhpcyx0KTty ZXR1cm4gby5hcnJheUNoYW5nZWQ9PT1zP2EuY29udGFpbnMoaSkmJm4uYWRk T2JqZWN0KGkpOm4ucmVtb3ZlT2JqZWN0KGkpLG59fSl9LHQ9RW1iZXIuT2Jq ZWN0UHJveHkuZXh0ZW5kKCksRW1iZXIuY29tcHV0ZWQuc29ydD1mdW5jdGlv bihuLG8pe3ZhciBzLHU7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG8/cz1m dW5jdGlvbih0LHIsbil7bi5vcmRlcj1vLG4uYmluYXJ5U2VhcmNoPWV9Oih1 PW8scz1mdW5jdGlvbihpLG8scyl7ZnVuY3Rpb24gbCgpe3ZhciBlLHQsaSxs PXIodGhpcyx1KSxoPXMuc29ydFByb3BlcnRpZXM9W10sbT1zLnNvcnRQcm9w ZXJ0eUFzY2VuZGluZz17fTtvLnByb3BlcnR5LmNsZWFySXRlbVByb3BlcnR5 S2V5cyhuKSxhKGwsZnVuY3Rpb24ocil7LTEhPT0odD1yLmluZGV4T2YoIjoi KSk/KGU9ci5zdWJzdHJpbmcoMCx0KSxpPSJkZXNjIiE9PXIuc3Vic3RyaW5n KHQrMSkudG9Mb3dlckNhc2UoKSk6KGU9cixpPSEwKSxoLnB1c2goZSksbVtl XT1pLG8ucHJvcGVydHkuaXRlbVByb3BlcnR5S2V5KG4sZSl9KSxsLmFkZE9i c2VydmVyKCJAZWFjaCIsdGhpcyxjKX1mdW5jdGlvbiBjKCl7RW1iZXIucnVu Lm9uY2UodGhpcyxoLG8ucHJvcGVydHlOYW1lKX1mdW5jdGlvbiBoKGUpe2wu Y2FsbCh0aGlzKSxvLnByb3BlcnR5LnJlY29tcHV0ZU9uY2UuY2FsbCh0aGlz LGUpfUVtYmVyLmFkZE9ic2VydmVyKHRoaXMsdSxjKSxsLmNhbGwodGhpcyks cy5vcmRlcj1mdW5jdGlvbihlLG4pe2Zvcih2YXIgaSxvLGEscz1uIGluc3Rh bmNlb2YgdCx1PTA7dTx0aGlzLnNvcnRQcm9wZXJ0aWVzLmxlbmd0aDsrK3Up aWYoaT10aGlzLnNvcnRQcm9wZXJ0aWVzW3VdLG89RW1iZXIuY29tcGFyZShy KGUsaSkscz9uW2ldOnIobixpKSksMCE9PW8pcmV0dXJuIGE9dGhpcy5zb3J0 UHJvcGVydHlBc2NlbmRpbmdbaV0sYT9vOi0xKm87cmV0dXJuIDB9LHMuYmlu YXJ5U2VhcmNoPWV9KSxFbWJlci5hcnJheUNvbXB1dGVkKG4se2luaXRpYWxp emU6cyxhZGRlZEl0ZW06ZnVuY3Rpb24oZSx0LHIsbil7dmFyIGk9bi5iaW5h cnlTZWFyY2goZSx0KTtyZXR1cm4gZS5pbnNlcnRBdChpLHQpLGV9LHJlbW92 ZWRJdGVtOmZ1bmN0aW9uKGUscixuLG8pe3ZhciBhLHMsdTtyZXR1cm4gbi5w cmV2aW91c1ZhbHVlcz8oYT1pKHtjb250ZW50OnJ9LG4ucHJldmlvdXNWYWx1 ZXMpLHU9dC5jcmVhdGUoYSkpOnU9cixzPW8uYmluYXJ5U2VhcmNoKGUsdSks ZS5yZW1vdmVBdChzKSxlfX0pfX0oKSxmdW5jdGlvbigpe0VtYmVyLlJTVlA9 dCgicnN2cCIpLEVtYmVyLlJTVlAub25lcnJvckRlZmF1bHQ9ZnVuY3Rpb24o ZSl7aWYoZSBpbnN0YW5jZW9mIEVycm9yKWlmKEVtYmVyLnRlc3Rpbmcpe2lm KCFFbWJlci5UZXN0fHwhRW1iZXIuVGVzdC5hZGFwdGVyKXRocm93IGU7RW1i ZXIuVGVzdC5hZGFwdGVyLmV4Y2VwdGlvbihlKX1lbHNlIEVtYmVyLkxvZ2dl ci5lcnJvcihlLnN0YWNrKX0sRW1iZXIuUlNWUC5vbigiZXJyb3IiLEVtYmVy LlJTVlAub25lcnJvckRlZmF1bHQpfSgpLGZ1bmN0aW9uKCl7dmFyIGU9QXJy YXkucHJvdG90eXBlLnNsaWNlLHQ9RW1iZXIuZXhwYW5kUHJvcGVydGllczso RW1iZXIuRVhURU5EX1BST1RPVFlQRVM9PT0hMHx8RW1iZXIuRVhURU5EX1BS T1RPVFlQRVMuRnVuY3Rpb24pJiYoRnVuY3Rpb24ucHJvdG90eXBlLnByb3Bl cnR5PWZ1bmN0aW9uKCl7dmFyIGU9RW1iZXIuY29tcHV0ZWQodGhpcyk7cmV0 dXJuIGUucHJvcGVydHkuYXBwbHkoZSxhcmd1bWVudHMpfSxGdW5jdGlvbi5w cm90b3R5cGUub2JzZXJ2ZXM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9ZnVuY3Rp b24oZSl7ci5wdXNoKGUpfSxyPVtdLG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7 KytuKXQoYXJndW1lbnRzW25dLGUpO3JldHVybiB0aGlzLl9fZW1iZXJfb2Jz ZXJ2ZXNfXz1yLHRoaXN9LEZ1bmN0aW9uLnByb3RvdHlwZS5vYnNlcnZlc0lt bWVkaWF0ZWx5PWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTAsdD1hcmd1bWVudHMu bGVuZ3RoO3Q+ZTtlKyspe2FyZ3VtZW50c1tlXX1yZXR1cm4gdGhpcy5vYnNl cnZlcy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LEZ1bmN0aW9uLnByb3RvdHlw ZS5vYnNlcnZlc0JlZm9yZT1mdW5jdGlvbigpe2Zvcih2YXIgZT1mdW5jdGlv bihlKXtyLnB1c2goZSl9LHI9W10sbj0wO248YXJndW1lbnRzLmxlbmd0aDsr K24pdChhcmd1bWVudHNbbl0sZSk7cmV0dXJuIHRoaXMuX19lbWJlcl9vYnNl cnZlc0JlZm9yZV9fPXIsdGhpc30sRnVuY3Rpb24ucHJvdG90eXBlLm9uPWZ1 bmN0aW9uKCl7dmFyIHQ9ZS5jYWxsKGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMu X19lbWJlcl9saXN0ZW5zX189dCx0aGlzfSl9KCksZnVuY3Rpb24oKXtFbWJl ci5Db21wYXJhYmxlPUVtYmVyLk1peGluLmNyZWF0ZSh7Y29tcGFyZTpFbWJl ci5yZXF1aXJlZChGdW5jdGlvbil9KX0oKSxmdW5jdGlvbigpe3t2YXIgZT1F bWJlci5nZXQ7RW1iZXIuc2V0fUVtYmVyLkNvcHlhYmxlPUVtYmVyLk1peGlu LmNyZWF0ZSh7Y29weTpFbWJlci5yZXF1aXJlZChGdW5jdGlvbiksZnJvemVu Q29weTpmdW5jdGlvbigpe2lmKEVtYmVyLkZyZWV6YWJsZSYmRW1iZXIuRnJl ZXphYmxlLmRldGVjdCh0aGlzKSlyZXR1cm4gZSh0aGlzLCJpc0Zyb3plbiIp P3RoaXM6dGhpcy5jb3B5KCkuZnJlZXplKCk7dGhyb3cgbmV3IEVtYmVyLkVy cm9yKEVtYmVyLlN0cmluZy5mbXQoIiVAIGRvZXMgbm90IHN1cHBvcnQgZnJl ZXppbmciLFt0aGlzXSkpfX0pfSgpLGZ1bmN0aW9uKCl7dmFyIGU9RW1iZXIu Z2V0LHQ9RW1iZXIuc2V0O0VtYmVyLkZyZWV6YWJsZT1FbWJlci5NaXhpbi5j cmVhdGUoe2lzRnJvemVuOiExLGZyZWV6ZTpmdW5jdGlvbigpe3JldHVybiBl KHRoaXMsImlzRnJvemVuIik/dGhpczoodCh0aGlzLCJpc0Zyb3plbiIsITAp LHRoaXMpfX0pLEVtYmVyLkZST1pFTl9FUlJPUj0iRnJvemVuIG9iamVjdCBj YW5ub3QgYmUgbW9kaWZpZWQuIn0oKSxmdW5jdGlvbigpe3ZhciBlPUVtYmVy LkVudW1lcmFibGVVdGlscy5mb3JFYWNoO0VtYmVyLk11dGFibGVFbnVtZXJh YmxlPUVtYmVyLk1peGluLmNyZWF0ZShFbWJlci5FbnVtZXJhYmxlLHthZGRP YmplY3Q6RW1iZXIucmVxdWlyZWQoRnVuY3Rpb24pLGFkZE9iamVjdHM6ZnVu Y3Rpb24odCl7cmV0dXJuIEVtYmVyLmJlZ2luUHJvcGVydHlDaGFuZ2VzKHRo aXMpLGUodCxmdW5jdGlvbihlKXt0aGlzLmFkZE9iamVjdChlKX0sdGhpcyks RW1iZXIuZW5kUHJvcGVydHlDaGFuZ2VzKHRoaXMpLHRoaXN9LHJlbW92ZU9i amVjdDpFbWJlci5yZXF1aXJlZChGdW5jdGlvbikscmVtb3ZlT2JqZWN0czpm dW5jdGlvbih0KXtyZXR1cm4gRW1iZXIuYmVnaW5Qcm9wZXJ0eUNoYW5nZXMo dGhpcyksZSh0LGZ1bmN0aW9uKGUpe3RoaXMucmVtb3ZlT2JqZWN0KGUpfSx0 aGlzKSxFbWJlci5lbmRQcm9wZXJ0eUNoYW5nZXModGhpcyksdGhpc319KX0o KSxmdW5jdGlvbigpe3t2YXIgZT0iSW5kZXggb3V0IG9mIHJhbmdlIix0PVtd LHI9RW1iZXIuZ2V0O0VtYmVyLnNldH1FbWJlci5NdXRhYmxlQXJyYXk9RW1i ZXIuTWl4aW4uY3JlYXRlKEVtYmVyLkFycmF5LEVtYmVyLk11dGFibGVFbnVt ZXJhYmxlLHtyZXBsYWNlOkVtYmVyLnJlcXVpcmVkKCksY2xlYXI6ZnVuY3Rp b24oKXt2YXIgZT1yKHRoaXMsImxlbmd0aCIpO3JldHVybiAwPT09ZT90aGlz Oih0aGlzLnJlcGxhY2UoMCxlLHQpLHRoaXMpfSxpbnNlcnRBdDpmdW5jdGlv bih0LG4pe2lmKHQ+cih0aGlzLCJsZW5ndGgiKSl0aHJvdyBuZXcgRW1iZXIu RXJyb3IoZSk7cmV0dXJuIHRoaXMucmVwbGFjZSh0LDAsW25dKSx0aGlzfSxy ZW1vdmVBdDpmdW5jdGlvbihuLGkpe2lmKCJudW1iZXIiPT10eXBlb2Ygbil7 aWYoMD5ufHxuPj1yKHRoaXMsImxlbmd0aCIpKXRocm93IG5ldyBFbWJlci5F cnJvcihlKTt2b2lkIDA9PT1pJiYoaT0xKSx0aGlzLnJlcGxhY2UobixpLHQp fXJldHVybiB0aGlzfSxwdXNoT2JqZWN0OmZ1bmN0aW9uKGUpe3JldHVybiB0 aGlzLmluc2VydEF0KHIodGhpcywibGVuZ3RoIiksZSksZX0scHVzaE9iamVj dHM6ZnVuY3Rpb24oZSl7aWYoIUVtYmVyLkVudW1lcmFibGUuZGV0ZWN0KGUp JiYhRW1iZXIuaXNBcnJheShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJNdXN0 IHBhc3MgRW1iZXIuRW51bWVyYWJsZSB0byBFbWJlci5NdXRhYmxlQXJyYXkj cHVzaE9iamVjdHMiKTtyZXR1cm4gdGhpcy5yZXBsYWNlKHIodGhpcywibGVu Z3RoIiksMCxlKSx0aGlzfSxwb3BPYmplY3Q6ZnVuY3Rpb24oKXt2YXIgZT1y KHRoaXMsImxlbmd0aCIpO2lmKDA9PT1lKXJldHVybiBudWxsO3ZhciB0PXRo aXMub2JqZWN0QXQoZS0xKTtyZXR1cm4gdGhpcy5yZW1vdmVBdChlLTEsMSks dH0sc2hpZnRPYmplY3Q6ZnVuY3Rpb24oKXtpZigwPT09cih0aGlzLCJsZW5n dGgiKSlyZXR1cm4gbnVsbDt2YXIgZT10aGlzLm9iamVjdEF0KDApO3JldHVy biB0aGlzLnJlbW92ZUF0KDApLGV9LHVuc2hpZnRPYmplY3Q6ZnVuY3Rpb24o ZSl7cmV0dXJuIHRoaXMuaW5zZXJ0QXQoMCxlKSxlfSx1bnNoaWZ0T2JqZWN0 czpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZXBsYWNlKDAsMCxlKSx0aGlz fSxyZXZlcnNlT2JqZWN0czpmdW5jdGlvbigpe3ZhciBlPXIodGhpcywibGVu Z3RoIik7aWYoMD09PWUpcmV0dXJuIHRoaXM7dmFyIHQ9dGhpcy50b0FycmF5 KCkucmV2ZXJzZSgpO3JldHVybiB0aGlzLnJlcGxhY2UoMCxlLHQpLHRoaXN9 LHNldE9iamVjdHM6ZnVuY3Rpb24oZSl7aWYoMD09PWUubGVuZ3RoKXJldHVy biB0aGlzLmNsZWFyKCk7dmFyIHQ9cih0aGlzLCJsZW5ndGgiKTtyZXR1cm4g dGhpcy5yZXBsYWNlKDAsdCxlKSx0aGlzfSxyZW1vdmVPYmplY3Q6ZnVuY3Rp b24oZSl7Zm9yKHZhciB0PXIodGhpcywibGVuZ3RoIil8fDA7LS10Pj0wOyl7 dmFyIG49dGhpcy5vYmplY3RBdCh0KTtuPT09ZSYmdGhpcy5yZW1vdmVBdCh0 KX1yZXR1cm4gdGhpc30sYWRkT2JqZWN0OmZ1bmN0aW9uKGUpe3JldHVybiB0 aGlzLmNvbnRhaW5zKGUpfHx0aGlzLnB1c2hPYmplY3QoZSksdGhpc319KX0o KSxmdW5jdGlvbigpe3t2YXIgZT1FbWJlci5nZXQ7RW1iZXIuc2V0fUVtYmVy LlRhcmdldEFjdGlvblN1cHBvcnQ9RW1iZXIuTWl4aW4uY3JlYXRlKHt0YXJn ZXQ6bnVsbCxhY3Rpb246bnVsbCxhY3Rpb25Db250ZXh0Om51bGwsdGFyZ2V0 T2JqZWN0OkVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlz LCJ0YXJnZXQiKTtpZigic3RyaW5nIj09PUVtYmVyLnR5cGVPZih0KSl7dmFy IHI9ZSh0aGlzLHQpO3JldHVybiB2b2lkIDA9PT1yJiYocj1lKEVtYmVyLmxv b2t1cCx0KSkscn1yZXR1cm4gdH0pLnByb3BlcnR5KCJ0YXJnZXQiKSxhY3Rp b25Db250ZXh0T2JqZWN0OkVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCl7dmFy IHQ9ZSh0aGlzLCJhY3Rpb25Db250ZXh0Iik7aWYoInN0cmluZyI9PT1FbWJl ci50eXBlT2YodCkpe3ZhciByPWUodGhpcyx0KTtyZXR1cm4gdm9pZCAwPT09 ciYmKHI9ZShFbWJlci5sb29rdXAsdCkpLHJ9cmV0dXJuIHR9KS5wcm9wZXJ0 eSgiYWN0aW9uQ29udGV4dCIpLHRyaWdnZXJBY3Rpb246ZnVuY3Rpb24odCl7 ZnVuY3Rpb24gcihlLHQpe3ZhciByPVtdO3JldHVybiB0JiZyLnB1c2godCks ci5jb25jYXQoZSl9dD10fHx7fTt2YXIgbj10LmFjdGlvbnx8ZSh0aGlzLCJh Y3Rpb24iKSxpPXQudGFyZ2V0fHxlKHRoaXMsInRhcmdldE9iamVjdCIpLG89 dC5hY3Rpb25Db250ZXh0O2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgbyYmKG89 ZSh0aGlzLCJhY3Rpb25Db250ZXh0T2JqZWN0Iil8fHRoaXMpLGkmJm4pe3Zh ciBhO3JldHVybiBhPWkuc2VuZD9pLnNlbmQuYXBwbHkoaSxyKG8sbikpOmlb bl0uYXBwbHkoaSxyKG8pKSxhIT09ITEmJihhPSEwKSxhfXJldHVybiExfX0p fSgpLGZ1bmN0aW9uKCl7RW1iZXIuRXZlbnRlZD1FbWJlci5NaXhpbi5jcmVh dGUoe29uOmZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gRW1iZXIuYWRkTGlzdGVu ZXIodGhpcyxlLHQsciksdGhpc30sb25lOmZ1bmN0aW9uKGUsdCxyKXtyZXR1 cm4gcnx8KHI9dCx0PW51bGwpLEVtYmVyLmFkZExpc3RlbmVyKHRoaXMsZSx0 LHIsITApLHRoaXN9LHRyaWdnZXI6ZnVuY3Rpb24oZSl7dmFyIHQscixuPVtd O2Zvcih0PTEscj1hcmd1bWVudHMubGVuZ3RoO3I+dDt0Kyspbi5wdXNoKGFy Z3VtZW50c1t0XSk7RW1iZXIuc2VuZEV2ZW50KHRoaXMsZSxuKX0sb2ZmOmZ1 bmN0aW9uKGUsdCxyKXtyZXR1cm4gRW1iZXIucmVtb3ZlTGlzdGVuZXIodGhp cyxlLHQsciksdGhpc30saGFzOmZ1bmN0aW9uKGUpe3JldHVybiBFbWJlci5o YXNMaXN0ZW5lcnModGhpcyxlKX19KX0oKSxmdW5jdGlvbigpe3ZhciBlPXQo InJzdnAiKTtpZihFbWJlci5GRUFUVVJFU1siZW1iZXItcnVudGltZS10ZXN0 LWZyaWVuZGx5LXByb21pc2VzIl0pe3ZhciByPWZ1bmN0aW9uKCl7RW1iZXIu VGVzdCYmRW1iZXIuVGVzdC5hZGFwdGVyJiZFbWJlci5UZXN0LmFkYXB0ZXIu YXN5bmNTdGFydCgpfSxuPWZ1bmN0aW9uKCl7RW1iZXIuVGVzdCYmRW1iZXIu VGVzdC5hZGFwdGVyJiZFbWJlci5UZXN0LmFkYXB0ZXIuYXN5bmNFbmQoKX07 ZS5jb25maWd1cmUoImFzeW5jIixmdW5jdGlvbihlLHQpe3ZhciBpPSFFbWJl ci5ydW4uY3VycmVudFJ1bkxvb3A7RW1iZXIudGVzdGluZyYmaSYmcigpLEVt YmVyLnJ1bi5iYWNrYnVybmVyLnNjaGVkdWxlKCJhY3Rpb25zIixmdW5jdGlv bigpe0VtYmVyLnRlc3RpbmcmJmkmJm4oKSxlKHQpfSl9KX1lbHNlIGUuY29u ZmlndXJlKCJhc3luYyIsZnVuY3Rpb24oZSx0KXtFbWJlci5ydW4uYmFja2J1 cm5lci5zY2hlZHVsZSgiYWN0aW9ucyIsZnVuY3Rpb24oKXtlKHQpfSl9KTtl LlByb21pc2UucHJvdG90eXBlLmZhaWw9ZnVuY3Rpb24oZSx0KXtyZXR1cm4g dGhpc1siY2F0Y2giXShlLHQpfTt2YXIgaT1FbWJlci5nZXQ7RW1iZXIuRGVm ZXJyZWRNaXhpbj1FbWJlci5NaXhpbi5jcmVhdGUoe3RoZW46ZnVuY3Rpb24o ZSx0LHIpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIHQ9PT1hP2Uocyk6ZSh0KX12 YXIgbyxhLHM7cmV0dXJuIHM9dGhpcyxvPWkodGhpcywiX2RlZmVycmVkIiks YT1vLnByb21pc2UsYS50aGVuKGUmJm4sdCxyKX0scmVzb2x2ZTpmdW5jdGlv bihlKXt2YXIgdCxyO3Q9aSh0aGlzLCJfZGVmZXJyZWQiKSxyPXQucHJvbWlz ZSxlPT09dGhpcz90LnJlc29sdmUocik6dC5yZXNvbHZlKGUpfSxyZWplY3Q6 ZnVuY3Rpb24oZSl7aSh0aGlzLCJfZGVmZXJyZWQiKS5yZWplY3QoZSl9LF9k ZWZlcnJlZDpFbWJlci5jb21wdXRlZChmdW5jdGlvbigpe3JldHVybiBlLmRl ZmVyKCJFbWJlcjogRGVmZXJyZWRNaXhpbiAtICIrdGhpcyl9KX0pfSgpLGZ1 bmN0aW9uKCl7dmFyIGU9RW1iZXIuZ2V0LHQ9RW1iZXIudHlwZU9mO0VtYmVy LkFjdGlvbkhhbmRsZXI9RW1iZXIuTWl4aW4uY3JlYXRlKHttZXJnZWRQcm9w ZXJ0aWVzOlsiX2FjdGlvbnMiXSx3aWxsTWVyZ2VNaXhpbjpmdW5jdGlvbihl KXt2YXIgcjtlLl9hY3Rpb25zfHwoIm9iamVjdCI9PT10KGUuYWN0aW9ucyk/ cj0iYWN0aW9ucyI6Im9iamVjdCI9PT10KGUuZXZlbnRzKSYmKHI9ImV2ZW50 cyIpLHImJihlLl9hY3Rpb25zPUVtYmVyLm1lcmdlKGUuX2FjdGlvbnN8fHt9 LGVbcl0pKSxkZWxldGUgZVtyXSl9LHNlbmQ6ZnVuY3Rpb24odCl7dmFyIHIs bj1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtpZih0aGlzLl9hY3Rpb25z JiZ0aGlzLl9hY3Rpb25zW3RdKXtpZih0aGlzLl9hY3Rpb25zW3RdLmFwcGx5 KHRoaXMsbikhPT0hMClyZXR1cm59ZWxzZSBpZighRW1iZXIuRkVBVFVSRVMu aXNFbmFibGVkKCJlbWJlci1yb3V0aW5nLWRyb3AtZGVwcmVjYXRlZC1hY3Rp b24tc3R5bGUiKSYmdGhpcy5kZXByZWNhdGVkU2VuZCYmdGhpcy5kZXByZWNh dGVkU2VuZEhhbmRsZXMmJnRoaXMuZGVwcmVjYXRlZFNlbmRIYW5kbGVzKHQp JiZ0aGlzLmRlcHJlY2F0ZWRTZW5kLmFwcGx5KHRoaXMsW10uc2xpY2UuY2Fs bChhcmd1bWVudHMpKSE9PSEwKXJldHVybjsocj1lKHRoaXMsInRhcmdldCIp KSYmci5zZW5kLmFwcGx5KHIsYXJndW1lbnRzKX19KX0oKSxmdW5jdGlvbigp e2Z1bmN0aW9uIGUoZSx0KXtyZXR1cm4gdC50aGVuKGZ1bmN0aW9uKHQpe3Jl dHVybiByKGUsImlzRnVsZmlsbGVkIiwhMCkscihlLCJjb250ZW50Iix0KSx0 fSxmdW5jdGlvbih0KXt0aHJvdyByKGUsImlzUmVqZWN0ZWQiLCEwKSxyKGUs InJlYXNvbiIsdCksdH0sIkVtYmVyOiBQcm9taXNlUHJveHkiKX1mdW5jdGlv biB0KGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PW4odGhpcywicHJvbWlz ZSIpO3JldHVybiB0W2VdLmFwcGx5KHQsYXJndW1lbnRzKX19dmFyIHI9RW1i ZXIuc2V0LG49RW1iZXIuZ2V0LGk9RW1iZXIuY29tcHV0ZWQubm90LG89RW1i ZXIuY29tcHV0ZWQub3I7RW1iZXIuUHJvbWlzZVByb3h5TWl4aW49RW1iZXIu TWl4aW4uY3JlYXRlKHtyZWFzb246bnVsbCxpc1BlbmRpbmc6aSgiaXNTZXR0 bGVkIikucmVhZE9ubHkoKSxpc1NldHRsZWQ6bygiaXNSZWplY3RlZCIsImlz RnVsZmlsbGVkIikucmVhZE9ubHkoKSxpc1JlamVjdGVkOiExLGlzRnVsZmls bGVkOiExLHByb21pc2U6RW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24odCxyKXtp ZigyPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZSh0aGlzLHIpO3Rocm93 IG5ldyBFbWJlci5FcnJvcigiUHJvbWlzZVByb3h5J3MgcHJvbWlzZSBtdXN0 IGJlIHNldCIpfSksdGhlbjp0KCJ0aGVuIiksImNhdGNoIjp0KCJjYXRjaCIp LCJmaW5hbGx5Ijp0KCJmaW5hbGx5Iil9KX0oKSxmdW5jdGlvbigpe2Z1bmN0 aW9uIGUoZSx0LHIpe3RoaXMudHlwZT1lLHRoaXMuY291bnQ9dCx0aGlzLml0 ZW1zPXJ9ZnVuY3Rpb24gdChlLHQscixuKXt0aGlzLm9wZXJhdGlvbj1lLHRo aXMuaW5kZXg9dCx0aGlzLnNwbGl0PXIsdGhpcy5yYW5nZVN0YXJ0PW59dmFy IHI9RW1iZXIuZ2V0LG49RW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2gs aT0iciIsbz0iaSIsYT0iZCI7RW1iZXIuVHJhY2tlZEFycmF5PWZ1bmN0aW9u KHQpe2FyZ3VtZW50cy5sZW5ndGg8MSYmKHQ9W10pO3ZhciBuPXIodCwibGVu Z3RoIik7dGhpcy5fb3BlcmF0aW9ucz1uP1tuZXcgZShpLG4sdCldOltdfSxF bWJlci5UcmFja2VkQXJyYXkuUkVUQUlOPWksRW1iZXIuVHJhY2tlZEFycmF5 LklOU0VSVD1vLEVtYmVyLlRyYWNrZWRBcnJheS5ERUxFVEU9YSxFbWJlci5U cmFja2VkQXJyYXkucHJvdG90eXBlPXthZGRJdGVtczpmdW5jdGlvbih0LG4p e3ZhciBpPXIobiwibGVuZ3RoIik7aWYoISgxPmkpKXt2YXIgYSxzLHU9dGhp cy5fZmluZEFycmF5T3BlcmF0aW9uKHQpLGw9dS5vcGVyYXRpb24sYz11Lmlu ZGV4LGg9dS5yYW5nZVN0YXJ0O3M9bmV3IGUobyxpLG4pLGw/dS5zcGxpdD8o dGhpcy5fc3BsaXQoYyx0LWgscyksYT1jKzEpOih0aGlzLl9vcGVyYXRpb25z LnNwbGljZShjLDAscyksYT1jKToodGhpcy5fb3BlcmF0aW9ucy5wdXNoKHMp LGE9YyksdGhpcy5fY29tcG9zZUluc2VydChhKX19LHJlbW92ZUl0ZW1zOmZ1 bmN0aW9uKHQscil7aWYoISgxPnIpKXt2YXIgbixpLG89dGhpcy5fZmluZEFy cmF5T3BlcmF0aW9uKHQpLHM9KG8ub3BlcmF0aW9uLG8uaW5kZXgpLHU9by5y YW5nZVN0YXJ0O3JldHVybiBuPW5ldyBlKGEsciksby5zcGxpdD8odGhpcy5f c3BsaXQocyx0LXUsbiksaT1zKzEpOih0aGlzLl9vcGVyYXRpb25zLnNwbGlj ZShzLDAsbiksaT1zKSx0aGlzLl9jb21wb3NlRGVsZXRlKGkpfX0sYXBwbHk6 ZnVuY3Rpb24odCl7dmFyIHI9W10sbz0wO24odGhpcy5fb3BlcmF0aW9ucyxm dW5jdGlvbihlKXt0KGUuaXRlbXMsbyxlLnR5cGUpLGUudHlwZSE9PWEmJihv Kz1lLmNvdW50LHI9ci5jb25jYXQoZS5pdGVtcykpfSksdGhpcy5fb3BlcmF0 aW9ucz1bbmV3IGUoaSxyLmxlbmd0aCxyKV19LF9maW5kQXJyYXlPcGVyYXRp b246ZnVuY3Rpb24oZSl7dmFyIHIsbixpLG8scyx1PSExO2ZvcihyPW89MCxu PXRoaXMuX29wZXJhdGlvbnMubGVuZ3RoO24+cjsrK3IpaWYoaT10aGlzLl9v cGVyYXRpb25zW3JdLGkudHlwZSE9PWEpe2lmKHM9bytpLmNvdW50LTEsZT09 PW8pYnJlYWs7aWYoZT5vJiZzPj1lKXt1PSEwO2JyZWFrfW89cysxfXJldHVy biBuZXcgdChpLHIsdSxvKX0sX3NwbGl0OmZ1bmN0aW9uKHQscixuKXt2YXIg aT10aGlzLl9vcGVyYXRpb25zW3RdLG89aS5pdGVtcy5zbGljZShyKSxhPW5l dyBlKGkudHlwZSxvLmxlbmd0aCxvKTtpLmNvdW50PXIsaS5pdGVtcz1pLml0 ZW1zLnNsaWNlKDAsciksdGhpcy5fb3BlcmF0aW9ucy5zcGxpY2UodCsxLDAs bixhKX0sX2NvbXBvc2VJbnNlcnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5f b3BlcmF0aW9uc1tlXSxyPXRoaXMuX29wZXJhdGlvbnNbZS0xXSxuPXRoaXMu X29wZXJhdGlvbnNbZSsxXSxpPXImJnIudHlwZSxhPW4mJm4udHlwZTtpPT09 bz8oci5jb3VudCs9dC5jb3VudCxyLml0ZW1zPXIuaXRlbXMuY29uY2F0KHQu aXRlbXMpLGE9PT1vPyhyLmNvdW50Kz1uLmNvdW50LHIuaXRlbXM9ci5pdGVt cy5jb25jYXQobi5pdGVtcyksdGhpcy5fb3BlcmF0aW9ucy5zcGxpY2UoZSwy KSk6dGhpcy5fb3BlcmF0aW9ucy5zcGxpY2UoZSwxKSk6YT09PW8mJih0LmNv dW50Kz1uLmNvdW50LHQuaXRlbXM9dC5pdGVtcy5jb25jYXQobi5pdGVtcyks dGhpcy5fb3BlcmF0aW9ucy5zcGxpY2UoZSsxLDEpKX0sX2NvbXBvc2VEZWxl dGU6ZnVuY3Rpb24oZSl7dmFyIHQscixuLGk9dGhpcy5fb3BlcmF0aW9uc1tl XSxzPWkuY291bnQsdT10aGlzLl9vcGVyYXRpb25zW2UtMV0sbD11JiZ1LnR5 cGUsYz0hMSxoPVtdO2w9PT1hJiYoaT11LGUtPTEpO2Zvcih2YXIgbT1lKzE7 cz4wOysrbSl0PXRoaXMuX29wZXJhdGlvbnNbbV0scj10LnR5cGUsbj10LmNv dW50LHIhPT1hPyhuPnM/KGg9aC5jb25jYXQodC5pdGVtcy5zcGxpY2UoMCxz KSksdC5jb3VudC09cyxtLT0xLG49cyxzPTApOihuPT09cyYmKGM9ITApLGg9 aC5jb25jYXQodC5pdGVtcykscy09bikscj09PW8mJihpLmNvdW50LT1uKSk6 aS5jb3VudCs9bjtyZXR1cm4gaS5jb3VudD4wP3RoaXMuX29wZXJhdGlvbnMu c3BsaWNlKGUrMSxtLTEtZSk6dGhpcy5fb3BlcmF0aW9ucy5zcGxpY2UoZSxj PzI6MSksaH0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIgZT0iIjtyZXR1cm4g bih0aGlzLl9vcGVyYXRpb25zLGZ1bmN0aW9uKHQpe2UrPSIgIit0LnR5cGUr IjoiK3QuY291bnR9KSxlLnN1YnN0cmluZygxKX19fSgpLGZ1bmN0aW9uKCl7 ZnVuY3Rpb24gZShlLHQpe3RoaXMudHlwZT1lLHRoaXMuY291bnQ9dH12YXIg dD0oRW1iZXIuZ2V0LEVtYmVyLkVudW1lcmFibGVVdGlscy5mb3JFYWNoKSxy PSJyIixuPSJmIjtFbWJlci5TdWJBcnJheT1mdW5jdGlvbih0KXthcmd1bWVu dHMubGVuZ3RoPDEmJih0PTApLHRoaXMuX29wZXJhdGlvbnM9dD4wP1tuZXcg ZShyLHQpXTpbXX0sRW1iZXIuU3ViQXJyYXkucHJvdG90eXBlPXthZGRJdGVt OmZ1bmN0aW9uKHQsaSl7dmFyIG89LTEsYT1pP3I6bixzPXRoaXM7cmV0dXJu IHRoaXMuX2ZpbmRPcGVyYXRpb24odCxmdW5jdGlvbihuLHUsbCxjLGgpe3Zh ciBtLHA7YT09PW4udHlwZT8rK24uY291bnQ6dD09PWw/cy5fb3BlcmF0aW9u cy5zcGxpY2UodSwwLG5ldyBlKGEsMSkpOihtPW5ldyBlKGEsMSkscD1uZXcg ZShuLnR5cGUsYy10KzEpLG4uY291bnQ9dC1sLHMuX29wZXJhdGlvbnMuc3Bs aWNlKHUrMSwwLG0scCkpLGkmJihvPW4udHlwZT09PXI/aCsodC1sKTpoKSxz Ll9jb21wb3NlQXQodSl9LGZ1bmN0aW9uKHQpe3MuX29wZXJhdGlvbnMucHVz aChuZXcgZShhLDEpKSxpJiYobz10KSxzLl9jb21wb3NlQXQocy5fb3BlcmF0 aW9ucy5sZW5ndGgtMSl9KSxvfSxyZW1vdmVJdGVtOmZ1bmN0aW9uKGUpe3Zh ciB0PS0xLG49dGhpcztyZXR1cm4gdGhpcy5fZmluZE9wZXJhdGlvbihlLGZ1 bmN0aW9uKGksbyxhLHMsdSl7aS50eXBlPT09ciYmKHQ9dSsoZS1hKSksaS5j b3VudD4xPy0taS5jb3VudDoobi5fb3BlcmF0aW9ucy5zcGxpY2UobywxKSxu Ll9jb21wb3NlQXQobykpfSxmdW5jdGlvbigpe3Rocm93IG5ldyBFbWJlci5F cnJvcigiQ2FuJ3QgcmVtb3ZlIGFuIGl0ZW0gdGhhdCBoYXMgbmV2ZXIgYmVl biBhZGRlZC4iKX0pLHR9LF9maW5kT3BlcmF0aW9uOmZ1bmN0aW9uKGUsdCxu KXt2YXIgaSxvLGEscyx1LGw9MDtmb3IoaT1zPTAsbz10aGlzLl9vcGVyYXRp b25zLmxlbmd0aDtvPmk7cz11KzEsKytpKXtpZihhPXRoaXMuX29wZXJhdGlv bnNbaV0sdT1zK2EuY291bnQtMSxlPj1zJiZ1Pj1lKXJldHVybiB0KGEsaSxz LHUsbCksdm9pZCAwO2EudHlwZT09PXImJihsKz1hLmNvdW50KX1uKGwpfSxf Y29tcG9zZUF0OmZ1bmN0aW9uKGUpe3ZhciB0LHI9dGhpcy5fb3BlcmF0aW9u c1tlXTtyJiYoZT4wJiYodD10aGlzLl9vcGVyYXRpb25zW2UtMV0sdC50eXBl PT09ci50eXBlJiYoci5jb3VudCs9dC5jb3VudCx0aGlzLl9vcGVyYXRpb25z LnNwbGljZShlLTEsMSksLS1lKSksZTx0aGlzLl9vcGVyYXRpb25zLmxlbmd0 aC0xJiYodD10aGlzLl9vcGVyYXRpb25zW2UrMV0sdC50eXBlPT09ci50eXBl JiYoci5jb3VudCs9dC5jb3VudCx0aGlzLl9vcGVyYXRpb25zLnNwbGljZShl KzEsMSkpKSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7dmFyIGU9IiI7cmV0dXJu IHQodGhpcy5fb3BlcmF0aW9ucyxmdW5jdGlvbih0KXtlKz0iICIrdC50eXBl KyI6Iit0LmNvdW50fSksZS5zdWJzdHJpbmcoMSl9fX0oKSxmdW5jdGlvbigp e0VtYmVyLkNvbnRhaW5lcj10KCJjb250YWluZXIiKVsiZGVmYXVsdCJdLEVt YmVyLkNvbnRhaW5lci5zZXQ9RW1iZXIuc2V0fSgpLGZ1bmN0aW9uKCl7RW1i ZXIuQXBwbGljYXRpb249RW1iZXIuTmFtZXNwYWNlLmV4dGVuZCgpfSgpLGZ1 bmN0aW9uKCl7e3ZhciBlPSJJbmRleCBvdXQgb2YgcmFuZ2UiLHQ9W10scj1F bWJlci5nZXQ7RW1iZXIuc2V0fUVtYmVyLkFycmF5UHJveHk9RW1iZXIuT2Jq ZWN0LmV4dGVuZChFbWJlci5NdXRhYmxlQXJyYXkse2NvbnRlbnQ6bnVsbCxh cnJhbmdlZENvbnRlbnQ6RW1iZXIuY29tcHV0ZWQuYWxpYXMoImNvbnRlbnQi KSxvYmplY3RBdENvbnRlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHIodGhpcywi YXJyYW5nZWRDb250ZW50Iikub2JqZWN0QXQoZSl9LHJlcGxhY2VDb250ZW50 OmZ1bmN0aW9uKGUsdCxuKXtyKHRoaXMsImNvbnRlbnQiKS5yZXBsYWNlKGUs dCxuKX0sX2NvbnRlbnRXaWxsQ2hhbmdlOkVtYmVyLmJlZm9yZU9ic2VydmVy KCJjb250ZW50IixmdW5jdGlvbigpe3RoaXMuX3RlYXJkb3duQ29udGVudCgp fSksX3RlYXJkb3duQ29udGVudDpmdW5jdGlvbigpe3ZhciBlPXIodGhpcywi Y29udGVudCIpO2UmJmUucmVtb3ZlQXJyYXlPYnNlcnZlcih0aGlzLHt3aWxs Q2hhbmdlOiJjb250ZW50QXJyYXlXaWxsQ2hhbmdlIixkaWRDaGFuZ2U6ImNv bnRlbnRBcnJheURpZENoYW5nZSJ9KX0sY29udGVudEFycmF5V2lsbENoYW5n ZTpFbWJlci5LLGNvbnRlbnRBcnJheURpZENoYW5nZTpFbWJlci5LLF9jb250 ZW50RGlkQ2hhbmdlOkVtYmVyLm9ic2VydmVyKCJjb250ZW50IixmdW5jdGlv bigpe3IodGhpcywiY29udGVudCIpO3RoaXMuX3NldHVwQ29udGVudCgpfSks X3NldHVwQ29udGVudDpmdW5jdGlvbigpe3ZhciBlPXIodGhpcywiY29udGVu dCIpO2UmJmUuYWRkQXJyYXlPYnNlcnZlcih0aGlzLHt3aWxsQ2hhbmdlOiJj b250ZW50QXJyYXlXaWxsQ2hhbmdlIixkaWRDaGFuZ2U6ImNvbnRlbnRBcnJh eURpZENoYW5nZSJ9KX0sX2FycmFuZ2VkQ29udGVudFdpbGxDaGFuZ2U6RW1i ZXIuYmVmb3JlT2JzZXJ2ZXIoImFycmFuZ2VkQ29udGVudCIsZnVuY3Rpb24o KXt2YXIgZT1yKHRoaXMsImFycmFuZ2VkQ29udGVudCIpLHQ9ZT9yKGUsImxl bmd0aCIpOjA7dGhpcy5hcnJhbmdlZENvbnRlbnRBcnJheVdpbGxDaGFuZ2Uo dGhpcywwLHQsdm9pZCAwKSx0aGlzLmFycmFuZ2VkQ29udGVudFdpbGxDaGFu Z2UodGhpcyksdGhpcy5fdGVhcmRvd25BcnJhbmdlZENvbnRlbnQoZSl9KSxf YXJyYW5nZWRDb250ZW50RGlkQ2hhbmdlOkVtYmVyLm9ic2VydmVyKCJhcnJh bmdlZENvbnRlbnQiLGZ1bmN0aW9uKCl7dmFyIGU9cih0aGlzLCJhcnJhbmdl ZENvbnRlbnQiKSx0PWU/cihlLCJsZW5ndGgiKTowO3RoaXMuX3NldHVwQXJy YW5nZWRDb250ZW50KCksdGhpcy5hcnJhbmdlZENvbnRlbnREaWRDaGFuZ2Uo dGhpcyksdGhpcy5hcnJhbmdlZENvbnRlbnRBcnJheURpZENoYW5nZSh0aGlz LDAsdm9pZCAwLHQpfSksX3NldHVwQXJyYW5nZWRDb250ZW50OmZ1bmN0aW9u KCl7dmFyIGU9cih0aGlzLCJhcnJhbmdlZENvbnRlbnQiKTtlJiZlLmFkZEFy cmF5T2JzZXJ2ZXIodGhpcyx7d2lsbENoYW5nZToiYXJyYW5nZWRDb250ZW50 QXJyYXlXaWxsQ2hhbmdlIixkaWRDaGFuZ2U6ImFycmFuZ2VkQ29udGVudEFy cmF5RGlkQ2hhbmdlIn0pfSxfdGVhcmRvd25BcnJhbmdlZENvbnRlbnQ6ZnVu Y3Rpb24oKXt2YXIgZT1yKHRoaXMsImFycmFuZ2VkQ29udGVudCIpO2UmJmUu cmVtb3ZlQXJyYXlPYnNlcnZlcih0aGlzLHt3aWxsQ2hhbmdlOiJhcnJhbmdl ZENvbnRlbnRBcnJheVdpbGxDaGFuZ2UiLGRpZENoYW5nZToiYXJyYW5nZWRD b250ZW50QXJyYXlEaWRDaGFuZ2UifSl9LGFycmFuZ2VkQ29udGVudFdpbGxD aGFuZ2U6RW1iZXIuSyxhcnJhbmdlZENvbnRlbnREaWRDaGFuZ2U6RW1iZXIu SyxvYmplY3RBdDpmdW5jdGlvbihlKXtyZXR1cm4gcih0aGlzLCJjb250ZW50 IikmJnRoaXMub2JqZWN0QXRDb250ZW50KGUpfSxsZW5ndGg6RW1iZXIuY29t cHV0ZWQoZnVuY3Rpb24oKXt2YXIgZT1yKHRoaXMsImFycmFuZ2VkQ29udGVu dCIpO3JldHVybiBlP3IoZSwibGVuZ3RoIik6MH0pLF9yZXBsYWNlOmZ1bmN0 aW9uKGUsdCxuKXt2YXIgaT1yKHRoaXMsImNvbnRlbnQiKTtyZXR1cm4gaSYm dGhpcy5yZXBsYWNlQ29udGVudChlLHQsbiksdGhpc30scmVwbGFjZTpmdW5j dGlvbigpe2lmKHIodGhpcywiYXJyYW5nZWRDb250ZW50IikhPT1yKHRoaXMs ImNvbnRlbnQiKSl0aHJvdyBuZXcgRW1iZXIuRXJyb3IoIlVzaW5nIHJlcGxh Y2Ugb24gYW4gYXJyYW5nZWQgQXJyYXlQcm94eSBpcyBub3QgYWxsb3dlZC4i KTt0aGlzLl9yZXBsYWNlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sX2luc2Vy dEF0OmZ1bmN0aW9uKHQsbil7aWYodD5yKHRoaXMsImNvbnRlbnQubGVuZ3Ro IikpdGhyb3cgbmV3IEVtYmVyLkVycm9yKGUpO3JldHVybiB0aGlzLl9yZXBs YWNlKHQsMCxbbl0pLHRoaXN9LGluc2VydEF0OmZ1bmN0aW9uKGUsdCl7aWYo cih0aGlzLCJhcnJhbmdlZENvbnRlbnQiKT09PXIodGhpcywiY29udGVudCIp KXJldHVybiB0aGlzLl9pbnNlcnRBdChlLHQpO3Rocm93IG5ldyBFbWJlci5F cnJvcigiVXNpbmcgaW5zZXJ0QXQgb24gYW4gYXJyYW5nZWQgQXJyYXlQcm94 eSBpcyBub3QgYWxsb3dlZC4iKX0scmVtb3ZlQXQ6ZnVuY3Rpb24obixpKXtp ZigibnVtYmVyIj09dHlwZW9mIG4pe3ZhciBvLGE9cih0aGlzLCJjb250ZW50 Iikscz1yKHRoaXMsImFycmFuZ2VkQ29udGVudCIpLHU9W107aWYoMD5ufHxu Pj1yKHRoaXMsImxlbmd0aCIpKXRocm93IG5ldyBFbWJlci5FcnJvcihlKTtm b3Iodm9pZCAwPT09aSYmKGk9MSksbz1uO24raT5vO28rKyl1LnB1c2goYS5p bmRleE9mKHMub2JqZWN0QXQobykpKTtmb3IodS5zb3J0KGZ1bmN0aW9uKGUs dCl7cmV0dXJuIHQtZX0pLEVtYmVyLmJlZ2luUHJvcGVydHlDaGFuZ2VzKCks bz0wO288dS5sZW5ndGg7bysrKXRoaXMuX3JlcGxhY2UodVtvXSwxLHQpO0Vt YmVyLmVuZFByb3BlcnR5Q2hhbmdlcygpfXJldHVybiB0aGlzfSxwdXNoT2Jq ZWN0OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9pbnNlcnRBdChyKHRoaXMs ImNvbnRlbnQubGVuZ3RoIiksZSksZX0scHVzaE9iamVjdHM6ZnVuY3Rpb24o ZSl7aWYoIUVtYmVyLkVudW1lcmFibGUuZGV0ZWN0KGUpJiYhRW1iZXIuaXNB cnJheShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJNdXN0IHBhc3MgRW1iZXIu RW51bWVyYWJsZSB0byBFbWJlci5NdXRhYmxlQXJyYXkjcHVzaE9iamVjdHMi KTtyZXR1cm4gdGhpcy5fcmVwbGFjZShyKHRoaXMsImxlbmd0aCIpLDAsZSks dGhpc30sc2V0T2JqZWN0czpmdW5jdGlvbihlKXtpZigwPT09ZS5sZW5ndGgp cmV0dXJuIHRoaXMuY2xlYXIoKTt2YXIgdD1yKHRoaXMsImxlbmd0aCIpO3Jl dHVybiB0aGlzLl9yZXBsYWNlKDAsdCxlKSx0aGlzfSx1bnNoaWZ0T2JqZWN0 OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9pbnNlcnRBdCgwLGUpLGV9LHVu c2hpZnRPYmplY3RzOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9yZXBsYWNl KDAsMCxlKSx0aGlzfSxzbGljZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMudG9B cnJheSgpO3JldHVybiBlLnNsaWNlLmFwcGx5KGUsYXJndW1lbnRzKX0sYXJy YW5nZWRDb250ZW50QXJyYXlXaWxsQ2hhbmdlOmZ1bmN0aW9uKGUsdCxyLG4p e3RoaXMuYXJyYXlDb250ZW50V2lsbENoYW5nZSh0LHIsbil9LGFycmFuZ2Vk Q29udGVudEFycmF5RGlkQ2hhbmdlOmZ1bmN0aW9uKGUsdCxyLG4pe3RoaXMu YXJyYXlDb250ZW50RGlkQ2hhbmdlKHQscixuKX0saW5pdDpmdW5jdGlvbigp e3RoaXMuX3N1cGVyKCksdGhpcy5fc2V0dXBDb250ZW50KCksdGhpcy5fc2V0 dXBBcnJhbmdlZENvbnRlbnQoKX0sd2lsbERlc3Ryb3k6ZnVuY3Rpb24oKXt0 aGlzLl90ZWFyZG93bkFycmFuZ2VkQ29udGVudCgpLHRoaXMuX3RlYXJkb3du Q29udGVudCgpfX0pfSgpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQscixp LG8pe3ZhciBhLHM9ci5fb2JqZWN0cztmb3Ioc3x8KHM9ci5fb2JqZWN0cz17 fSk7LS1vPj1pOyl7dmFyIHU9ZS5vYmplY3RBdChvKTt1JiYoRW1iZXIuYWRk QmVmb3JlT2JzZXJ2ZXIodSx0LHIsImNvbnRlbnRLZXlXaWxsQ2hhbmdlIiks RW1iZXIuYWRkT2JzZXJ2ZXIodSx0LHIsImNvbnRlbnRLZXlEaWRDaGFuZ2Ui KSxhPW4odSksc1thXXx8KHNbYV09W10pLHNbYV0ucHVzaChvKSl9fWZ1bmN0 aW9uIHQoZSx0LHIsaSxhKXt2YXIgcz1yLl9vYmplY3RzO3N8fChzPXIuX29i amVjdHM9e30pO2Zvcih2YXIgdSxsOy0tYT49aTspe3ZhciBjPWUub2JqZWN0 QXQoYSk7YyYmKEVtYmVyLnJlbW92ZUJlZm9yZU9ic2VydmVyKGMsdCxyLCJj b250ZW50S2V5V2lsbENoYW5nZSIpLEVtYmVyLnJlbW92ZU9ic2VydmVyKGMs dCxyLCJjb250ZW50S2V5RGlkQ2hhbmdlIiksbD1uKGMpLHU9c1tsXSx1W28u Y2FsbCh1LGEpXT1udWxsKX19dmFyIHI9KEVtYmVyLnNldCxFbWJlci5nZXQp LG49RW1iZXIuZ3VpZEZvcixpPUVtYmVyLkVudW1lcmFibGVVdGlscy5mb3JF YWNoLG89RW1iZXIuQXJyYXlQb2x5ZmlsbHMuaW5kZXhPZixhPUVtYmVyLk9i amVjdC5leHRlbmQoRW1iZXIuQXJyYXkse2luaXQ6ZnVuY3Rpb24oZSx0LHIp e3RoaXMuX3N1cGVyKCksdGhpcy5fa2V5TmFtZT10LHRoaXMuX293bmVyPXIs dGhpcy5fY29udGVudD1lfSxvYmplY3RBdDpmdW5jdGlvbihlKXt2YXIgdD10 aGlzLl9jb250ZW50Lm9iamVjdEF0KGUpO3JldHVybiB0JiZyKHQsdGhpcy5f a2V5TmFtZSl9LGxlbmd0aDpFbWJlci5jb21wdXRlZChmdW5jdGlvbigpe3Zh ciBlPXRoaXMuX2NvbnRlbnQ7cmV0dXJuIGU/cihlLCJsZW5ndGgiKTowfSl9 KSxzPS9eLis6KGJlZm9yZXxjaGFuZ2UpJC87RW1iZXIuRWFjaFByb3h5PUVt YmVyLk9iamVjdC5leHRlbmQoe2luaXQ6ZnVuY3Rpb24oZSl7dGhpcy5fc3Vw ZXIoKSx0aGlzLl9jb250ZW50PWUsZS5hZGRBcnJheU9ic2VydmVyKHRoaXMp LGkoRW1iZXIud2F0Y2hlZEV2ZW50cyh0aGlzKSxmdW5jdGlvbihlKXt0aGlz LmRpZEFkZExpc3RlbmVyKGUpfSx0aGlzKX0sdW5rbm93blByb3BlcnR5OmZ1 bmN0aW9uKGUpe3ZhciB0O3JldHVybiB0PW5ldyBhKHRoaXMuX2NvbnRlbnQs ZSx0aGlzKSxFbWJlci5kZWZpbmVQcm9wZXJ0eSh0aGlzLGUsbnVsbCx0KSx0 aGlzLmJlZ2luT2JzZXJ2aW5nQ29udGVudEtleShlKSx0fSxhcnJheVdpbGxD aGFuZ2U6ZnVuY3Rpb24oZSxyLG4pe3ZhciBpLG8sYT10aGlzLl9rZXlzO289 bj4wP3IrbjotMSxFbWJlci5iZWdpblByb3BlcnR5Q2hhbmdlcyh0aGlzKTtm b3IoaSBpbiBhKWEuaGFzT3duUHJvcGVydHkoaSkmJihvPjAmJnQoZSxpLHRo aXMscixvKSxFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcyxpKSk7RW1i ZXIucHJvcGVydHlXaWxsQ2hhbmdlKHRoaXMuX2NvbnRlbnQsIkBlYWNoIiks RW1iZXIuZW5kUHJvcGVydHlDaGFuZ2VzKHRoaXMpfSxhcnJheURpZENoYW5n ZTpmdW5jdGlvbih0LHIsbixpKXt2YXIgbyxhPXRoaXMuX2tleXM7bz1pPjA/ citpOi0xLEVtYmVyLmNoYW5nZVByb3BlcnRpZXMoZnVuY3Rpb24oKXtmb3Io dmFyIG4gaW4gYSlhLmhhc093blByb3BlcnR5KG4pJiYobz4wJiZlKHQsbix0 aGlzLHIsbyksRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcyxuKSk7RW1i ZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcy5fY29udGVudCwiQGVhY2giKX0s dGhpcyl9LGRpZEFkZExpc3RlbmVyOmZ1bmN0aW9uKGUpe3MudGVzdChlKSYm dGhpcy5iZWdpbk9ic2VydmluZ0NvbnRlbnRLZXkoZS5zbGljZSgwLC03KSl9 LGRpZFJlbW92ZUxpc3RlbmVyOmZ1bmN0aW9uKGUpe3MudGVzdChlKSYmdGhp cy5zdG9wT2JzZXJ2aW5nQ29udGVudEtleShlLnNsaWNlKDAsLTcpKX0sYmVn aW5PYnNlcnZpbmdDb250ZW50S2V5OmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMu X2tleXM7aWYobnx8KG49dGhpcy5fa2V5cz17fSksblt0XSluW3RdKys7ZWxz ZXtuW3RdPTE7dmFyIGk9dGhpcy5fY29udGVudCxvPXIoaSwibGVuZ3RoIik7 ZShpLHQsdGhpcywwLG8pfX0sc3RvcE9ic2VydmluZ0NvbnRlbnRLZXk6ZnVu Y3Rpb24oZSl7dmFyIG49dGhpcy5fa2V5cztpZihuJiZuW2VdPjAmJi0tbltl XTw9MCl7dmFyIGk9dGhpcy5fY29udGVudCxvPXIoaSwibGVuZ3RoIik7dChp LGUsdGhpcywwLG8pfX0sY29udGVudEtleVdpbGxDaGFuZ2U6ZnVuY3Rpb24o ZSx0KXtFbWJlci5wcm9wZXJ0eVdpbGxDaGFuZ2UodGhpcyx0KX0sY29udGVu dEtleURpZENoYW5nZTpmdW5jdGlvbihlLHQpe0VtYmVyLnByb3BlcnR5RGlk Q2hhbmdlKHRoaXMsdCl9fSl9KCksZnVuY3Rpb24oKXt2YXIgZT1FbWJlci5n ZXQsdD0oRW1iZXIuc2V0LEVtYmVyLkVudW1lcmFibGVVdGlscy5fcmVwbGFj ZSkscj1FbWJlci5NaXhpbi5jcmVhdGUoRW1iZXIuTXV0YWJsZUFycmF5LEVt YmVyLk9ic2VydmFibGUsRW1iZXIuQ29weWFibGUse2dldDpmdW5jdGlvbihl KXtyZXR1cm4ibGVuZ3RoIj09PWU/dGhpcy5sZW5ndGg6Im51bWJlciI9PXR5 cGVvZiBlP3RoaXNbZV06dGhpcy5fc3VwZXIoZSl9LG9iamVjdEF0OmZ1bmN0 aW9uKGUpe3JldHVybiB0aGlzW2VdfSxyZXBsYWNlOmZ1bmN0aW9uKHIsbixp KXtpZih0aGlzLmlzRnJvemVuKXRocm93IEVtYmVyLkZST1pFTl9FUlJPUjt2 YXIgbz1pP2UoaSwibGVuZ3RoIik6MDtyZXR1cm4gdGhpcy5hcnJheUNvbnRl bnRXaWxsQ2hhbmdlKHIsbixvKSwwPT09bz90aGlzLnNwbGljZShyLG4pOnQo dGhpcyxyLG4saSksdGhpcy5hcnJheUNvbnRlbnREaWRDaGFuZ2UocixuLG8p LHRoaXN9LHVua25vd25Qcm9wZXJ0eTpmdW5jdGlvbihlLHQpe3ZhciByO3Jl dHVybiB2b2lkIDAhPT10JiZ2b2lkIDA9PT1yJiYocj10aGlzW2VdPXQpLHJ9 LGluZGV4T2Y6ZnVuY3Rpb24oZSx0KXt2YXIgcixuPXRoaXMubGVuZ3RoO2Zv cih0PXZvaWQgMD09PXQ/MDowPnQ/TWF0aC5jZWlsKHQpOk1hdGguZmxvb3Io dCksMD50JiYodCs9bikscj10O24+cjtyKyspaWYodGhpc1tyXT09PWUpcmV0 dXJuIHI7cmV0dXJuLTF9LGxhc3RJbmRleE9mOmZ1bmN0aW9uKGUsdCl7dmFy IHIsbj10aGlzLmxlbmd0aDtmb3IodD12b2lkIDA9PT10P24tMTowPnQ/TWF0 aC5jZWlsKHQpOk1hdGguZmxvb3IodCksMD50JiYodCs9bikscj10O3I+PTA7 ci0tKWlmKHRoaXNbcl09PT1lKXJldHVybiByO3JldHVybi0xfSxjb3B5OmZ1 bmN0aW9uKGUpe3JldHVybiBlP3RoaXMubWFwKGZ1bmN0aW9uKGUpe3JldHVy biBFbWJlci5jb3B5KGUsITApfSk6dGhpcy5zbGljZSgpfX0pLG49WyJsZW5n dGgiXTtFbWJlci5FbnVtZXJhYmxlVXRpbHMuZm9yRWFjaChyLmtleXMoKSxm dW5jdGlvbihlKXtBcnJheS5wcm90b3R5cGVbZV0mJm4ucHVzaChlKX0pLG4u bGVuZ3RoPjAmJihyPXIud2l0aG91dC5hcHBseShyLG4pKSxFbWJlci5OYXRp dmVBcnJheT1yLEVtYmVyLkE9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09 PWUmJihlPVtdKSxFbWJlci5BcnJheS5kZXRlY3QoZSk/ZTpFbWJlci5OYXRp dmVBcnJheS5hcHBseShlKX0sRW1iZXIuTmF0aXZlQXJyYXkuYWN0aXZhdGU9 ZnVuY3Rpb24oKXtyLmFwcGx5KEFycmF5LnByb3RvdHlwZSksRW1iZXIuQT1m dW5jdGlvbihlKXtyZXR1cm4gZXx8W119fSwoRW1iZXIuRVhURU5EX1BST1RP VFlQRVM9PT0hMHx8RW1iZXIuRVhURU5EX1BST1RPVFlQRVMuQXJyYXkpJiZF bWJlci5OYXRpdmVBcnJheS5hY3RpdmF0ZSgpfSgpLGZ1bmN0aW9uKCl7dmFy IGU9RW1iZXIuZ2V0LHQ9RW1iZXIuc2V0LHI9RW1iZXIuZ3VpZEZvcixuPUVt YmVyLmlzTm9uZSxpPUVtYmVyLlN0cmluZy5mbXQ7RW1iZXIuU2V0PUVtYmVy LkNvcmVPYmplY3QuZXh0ZW5kKEVtYmVyLk11dGFibGVFbnVtZXJhYmxlLEVt YmVyLkNvcHlhYmxlLEVtYmVyLkZyZWV6YWJsZSx7bGVuZ3RoOjAsY2xlYXI6 ZnVuY3Rpb24oKXtpZih0aGlzLmlzRnJvemVuKXRocm93IG5ldyBFbWJlci5F cnJvcihFbWJlci5GUk9aRU5fRVJST1IpO3ZhciBuPWUodGhpcywibGVuZ3Ro Iik7aWYoMD09PW4pcmV0dXJuIHRoaXM7dmFyIGk7dGhpcy5lbnVtZXJhYmxl Q29udGVudFdpbGxDaGFuZ2UobiwwKSxFbWJlci5wcm9wZXJ0eVdpbGxDaGFu Z2UodGhpcywiZmlyc3RPYmplY3QiKSxFbWJlci5wcm9wZXJ0eVdpbGxDaGFu Z2UodGhpcywibGFzdE9iamVjdCIpO2Zvcih2YXIgbz0wO24+bztvKyspaT1y KHRoaXNbb10pLGRlbGV0ZSB0aGlzW2ldLGRlbGV0ZSB0aGlzW29dO3JldHVy biB0KHRoaXMsImxlbmd0aCIsMCksRW1iZXIucHJvcGVydHlEaWRDaGFuZ2Uo dGhpcywiZmlyc3RPYmplY3QiKSxFbWJlci5wcm9wZXJ0eURpZENoYW5nZSh0 aGlzLCJsYXN0T2JqZWN0IiksdGhpcy5lbnVtZXJhYmxlQ29udGVudERpZENo YW5nZShuLDApLHRoaXN9LGlzRXF1YWw6ZnVuY3Rpb24odCl7aWYoIUVtYmVy LkVudW1lcmFibGUuZGV0ZWN0KHQpKXJldHVybiExO3ZhciByPWUodGhpcywi bGVuZ3RoIik7aWYoZSh0LCJsZW5ndGgiKSE9PXIpcmV0dXJuITE7Zm9yKDst LXI+PTA7KWlmKCF0LmNvbnRhaW5zKHRoaXNbcl0pKXJldHVybiExO3JldHVy biEwfSxhZGQ6RW1iZXIuYWxpYXNNZXRob2QoImFkZE9iamVjdCIpLHJlbW92 ZTpFbWJlci5hbGlhc01ldGhvZCgicmVtb3ZlT2JqZWN0IikscG9wOmZ1bmN0 aW9uKCl7aWYoZSh0aGlzLCJpc0Zyb3plbiIpKXRocm93IG5ldyBFbWJlci5F cnJvcihFbWJlci5GUk9aRU5fRVJST1IpO3ZhciB0PXRoaXMubGVuZ3RoPjA/ dGhpc1t0aGlzLmxlbmd0aC0xXTpudWxsO3JldHVybiB0aGlzLnJlbW92ZSh0 KSx0fSxwdXNoOkVtYmVyLmFsaWFzTWV0aG9kKCJhZGRPYmplY3QiKSxzaGlm dDpFbWJlci5hbGlhc01ldGhvZCgicG9wIiksdW5zaGlmdDpFbWJlci5hbGlh c01ldGhvZCgicHVzaCIpLGFkZEVhY2g6RW1iZXIuYWxpYXNNZXRob2QoImFk ZE9iamVjdHMiKSxyZW1vdmVFYWNoOkVtYmVyLmFsaWFzTWV0aG9kKCJyZW1v dmVPYmplY3RzIiksaW5pdDpmdW5jdGlvbihlKXt0aGlzLl9zdXBlcigpLGUm JnRoaXMuYWRkT2JqZWN0cyhlKX0sbmV4dE9iamVjdDpmdW5jdGlvbihlKXty ZXR1cm4gdGhpc1tlXX0sZmlyc3RPYmplY3Q6RW1iZXIuY29tcHV0ZWQoZnVu Y3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGg+MD90aGlzWzBdOnZvaWQgMH0p LGxhc3RPYmplY3Q6RW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKXtyZXR1cm4g dGhpcy5sZW5ndGg+MD90aGlzW3RoaXMubGVuZ3RoLTFdOnZvaWQgMH0pLGFk ZE9iamVjdDpmdW5jdGlvbihpKXtpZihlKHRoaXMsImlzRnJvemVuIikpdGhy b3cgbmV3IEVtYmVyLkVycm9yKEVtYmVyLkZST1pFTl9FUlJPUik7aWYobihp KSlyZXR1cm4gdGhpczt2YXIgbyxhPXIoaSkscz10aGlzW2FdLHU9ZSh0aGlz LCJsZW5ndGgiKTtyZXR1cm4gcz49MCYmdT5zJiZ0aGlzW3NdPT09aT90aGlz OihvPVtpXSx0aGlzLmVudW1lcmFibGVDb250ZW50V2lsbENoYW5nZShudWxs LG8pLEVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCJsYXN0T2JqZWN0 IiksdT1lKHRoaXMsImxlbmd0aCIpLHRoaXNbYV09dSx0aGlzW3VdPWksdCh0 aGlzLCJsZW5ndGgiLHUrMSksRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhp cywibGFzdE9iamVjdCIpLHRoaXMuZW51bWVyYWJsZUNvbnRlbnREaWRDaGFu Z2UobnVsbCxvKSx0aGlzKX0scmVtb3ZlT2JqZWN0OmZ1bmN0aW9uKGkpe2lm KGUodGhpcywiaXNGcm96ZW4iKSl0aHJvdyBuZXcgRW1iZXIuRXJyb3IoRW1i ZXIuRlJPWkVOX0VSUk9SKTtpZihuKGkpKXJldHVybiB0aGlzO3ZhciBvLGEs cz1yKGkpLHU9dGhpc1tzXSxsPWUodGhpcywibGVuZ3RoIiksYz0wPT09dSxo PXU9PT1sLTE7cmV0dXJuIHU+PTAmJmw+dSYmdGhpc1t1XT09PWkmJihhPVtp XSx0aGlzLmVudW1lcmFibGVDb250ZW50V2lsbENoYW5nZShhLG51bGwpLGMm JkVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCJmaXJzdE9iamVjdCIp LGgmJkVtYmVyLnByb3BlcnR5V2lsbENoYW5nZSh0aGlzLCJsYXN0T2JqZWN0 IiksbC0xPnUmJihvPXRoaXNbbC0xXSx0aGlzW3VdPW8sdGhpc1tyKG8pXT11 KSxkZWxldGUgdGhpc1tzXSxkZWxldGUgdGhpc1tsLTFdLHQodGhpcywibGVu Z3RoIixsLTEpLGMmJkVtYmVyLnByb3BlcnR5RGlkQ2hhbmdlKHRoaXMsImZp cnN0T2JqZWN0IiksaCYmRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UodGhpcywi bGFzdE9iamVjdCIpLHRoaXMuZW51bWVyYWJsZUNvbnRlbnREaWRDaGFuZ2Uo YSxudWxsKSksdGhpc30sY29udGFpbnM6ZnVuY3Rpb24oZSl7cmV0dXJuIHRo aXNbcihlKV0+PTB9LGNvcHk6ZnVuY3Rpb24oKXt2YXIgbj10aGlzLmNvbnN0 cnVjdG9yLGk9bmV3IG4sbz1lKHRoaXMsImxlbmd0aCIpO2Zvcih0KGksImxl bmd0aCIsbyk7LS1vPj0wOylpW29dPXRoaXNbb10saVtyKHRoaXNbb10pXT1v O3JldHVybiBpfSx0b1N0cmluZzpmdW5jdGlvbigpe3ZhciBlLHQ9dGhpcy5s ZW5ndGgscj1bXTtmb3IoZT0wO3Q+ZTtlKyspcltlXT10aGlzW2VdO3JldHVy biBpKCJFbWJlci5TZXQ8JUA+Iixbci5qb2luKCIsIildKX19KX0oKSxmdW5j dGlvbigpe3ZhciBlPUVtYmVyLkRlZmVycmVkTWl4aW4sdD0oRW1iZXIuZ2V0 LEVtYmVyLk9iamVjdC5leHRlbmQoZSkpO3QucmVvcGVuQ2xhc3Moe3Byb21p c2U6ZnVuY3Rpb24oZSxyKXt2YXIgbj10LmNyZWF0ZSgpO3JldHVybiBlLmNh bGwocixuKSxufX0pLEVtYmVyLkRlZmVycmVkPXR9KCksZnVuY3Rpb24oKXt2 YXIgZT1FbWJlci5BcnJheVBvbHlmaWxscy5mb3JFYWNoLHQ9RW1iZXIuRU5W LkVNQkVSX0xPQURfSE9PS1N8fHt9LHI9e307RW1iZXIub25Mb2FkPWZ1bmN0 aW9uKGUsbil7dmFyIGk7dFtlXT10W2VdfHxFbWJlci5BKCksdFtlXS5wdXNo T2JqZWN0KG4pLChpPXJbZV0pJiZuKGkpfSxFbWJlci5ydW5Mb2FkSG9va3M9 ZnVuY3Rpb24obixpKXtyW25dPWksdFtuXSYmZS5jYWxsKHRbbl0sZnVuY3Rp b24oZSl7ZShpKX0pfX0oKSxmdW5jdGlvbigpe0VtYmVyLmdldDtFbWJlci5D b250cm9sbGVyTWl4aW49RW1iZXIuTWl4aW4uY3JlYXRlKEVtYmVyLkFjdGlv bkhhbmRsZXIse2lzQ29udHJvbGxlcjohMCx0YXJnZXQ6bnVsbCxjb250YWlu ZXI6bnVsbCxwYXJlbnRDb250cm9sbGVyOm51bGwsc3RvcmU6bnVsbCxtb2Rl bDpFbWJlci5jb21wdXRlZC5hbGlhcygiY29udGVudCIpLGRlcHJlY2F0ZWRT ZW5kSGFuZGxlczpmdW5jdGlvbihlKXtyZXR1cm4hIXRoaXNbZV19LGRlcHJl Y2F0ZWRTZW5kOmZ1bmN0aW9uKGUpe3ZhciB0PVtdLnNsaWNlLmNhbGwoYXJn dW1lbnRzLDEpO3RoaXNbZV0uYXBwbHkodGhpcyx0KX19KSxFbWJlci5Db250 cm9sbGVyPUVtYmVyLk9iamVjdC5leHRlbmQoRW1iZXIuQ29udHJvbGxlck1p eGluKX0oKSxmdW5jdGlvbigpe3ZhciBlPUVtYmVyLmdldCx0PShFbWJlci5z ZXQsRW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVhY2gpO0VtYmVyLlNvcnRh YmxlTWl4aW49RW1iZXIuTWl4aW4uY3JlYXRlKEVtYmVyLk11dGFibGVFbnVt ZXJhYmxlLHtzb3J0UHJvcGVydGllczpudWxsLHNvcnRBc2NlbmRpbmc6ITAs c29ydEZ1bmN0aW9uOkVtYmVyLmNvbXBhcmUsb3JkZXJCeTpmdW5jdGlvbihy LG4pe3ZhciBpPTAsbz1lKHRoaXMsInNvcnRQcm9wZXJ0aWVzIiksYT1lKHRo aXMsInNvcnRBc2NlbmRpbmciKSxzPWUodGhpcywic29ydEZ1bmN0aW9uIik7 cmV0dXJuIHQobyxmdW5jdGlvbih0KXswPT09aSYmKGk9cyhlKHIsdCksZShu LHQpKSwwPT09aXx8YXx8KGk9LTEqaSkpfSksaX0sZGVzdHJveTpmdW5jdGlv bigpe3ZhciByPWUodGhpcywiY29udGVudCIpLG49ZSh0aGlzLCJzb3J0UHJv cGVydGllcyIpO3JldHVybiByJiZuJiZ0KHIsZnVuY3Rpb24oZSl7dChuLGZ1 bmN0aW9uKHQpe0VtYmVyLnJlbW92ZU9ic2VydmVyKGUsdCx0aGlzLCJjb250 ZW50SXRlbVNvcnRQcm9wZXJ0eURpZENoYW5nZSIpfSx0aGlzKX0sdGhpcyks dGhpcy5fc3VwZXIoKX0saXNTb3J0ZWQ6RW1iZXIuY29tcHV0ZWQuYm9vbCgi c29ydFByb3BlcnRpZXMiKSxhcnJhbmdlZENvbnRlbnQ6RW1iZXIuY29tcHV0 ZWQoImNvbnRlbnQiLCJzb3J0UHJvcGVydGllcy5AZWFjaCIsZnVuY3Rpb24o KXt2YXIgcj1lKHRoaXMsImNvbnRlbnQiKSxuPWUodGhpcywiaXNTb3J0ZWQi KSxpPWUodGhpcywic29ydFByb3BlcnRpZXMiKSxvPXRoaXM7cmV0dXJuIHIm Jm4/KHI9ci5zbGljZSgpLHIuc29ydChmdW5jdGlvbihlLHQpe3JldHVybiBv Lm9yZGVyQnkoZSx0KX0pLHQocixmdW5jdGlvbihlKXt0KGksZnVuY3Rpb24o dCl7RW1iZXIuYWRkT2JzZXJ2ZXIoZSx0LHRoaXMsImNvbnRlbnRJdGVtU29y dFByb3BlcnR5RGlkQ2hhbmdlIil9LHRoaXMpfSx0aGlzKSxFbWJlci5BKHIp KTpyfSksX2NvbnRlbnRXaWxsQ2hhbmdlOkVtYmVyLmJlZm9yZU9ic2VydmVy KCJjb250ZW50IixmdW5jdGlvbigpe3ZhciByPWUodGhpcywiY29udGVudCIp LG49ZSh0aGlzLCJzb3J0UHJvcGVydGllcyIpO3ImJm4mJnQocixmdW5jdGlv bihlKXt0KG4sZnVuY3Rpb24odCl7RW1iZXIucmVtb3ZlT2JzZXJ2ZXIoZSx0 LHRoaXMsImNvbnRlbnRJdGVtU29ydFByb3BlcnR5RGlkQ2hhbmdlIil9LHRo aXMpfSx0aGlzKSx0aGlzLl9zdXBlcigpfSksc29ydEFzY2VuZGluZ1dpbGxD aGFuZ2U6RW1iZXIuYmVmb3JlT2JzZXJ2ZXIoInNvcnRBc2NlbmRpbmciLGZ1 bmN0aW9uKCl7dGhpcy5fbGFzdFNvcnRBc2NlbmRpbmc9ZSh0aGlzLCJzb3J0 QXNjZW5kaW5nIil9KSxzb3J0QXNjZW5kaW5nRGlkQ2hhbmdlOkVtYmVyLm9i c2VydmVyKCJzb3J0QXNjZW5kaW5nIixmdW5jdGlvbigpe2lmKGUodGhpcywi c29ydEFzY2VuZGluZyIpIT09dGhpcy5fbGFzdFNvcnRBc2NlbmRpbmcpe3Zh ciB0PWUodGhpcywiYXJyYW5nZWRDb250ZW50Iik7dC5yZXZlcnNlT2JqZWN0 cygpfX0pLGNvbnRlbnRBcnJheVdpbGxDaGFuZ2U6ZnVuY3Rpb24ocixuLGks byl7dmFyIGE9ZSh0aGlzLCJpc1NvcnRlZCIpO2lmKGEpe3ZhciBzPWUodGhp cywiYXJyYW5nZWRDb250ZW50IiksdT1yLnNsaWNlKG4sbitpKSxsPWUodGhp cywic29ydFByb3BlcnRpZXMiKTt0KHUsZnVuY3Rpb24oZSl7cy5yZW1vdmVP YmplY3QoZSksdChsLGZ1bmN0aW9uKHQpe0VtYmVyLnJlbW92ZU9ic2VydmVy KGUsdCx0aGlzLCJjb250ZW50SXRlbVNvcnRQcm9wZXJ0eURpZENoYW5nZSIp fSx0aGlzKX0sdGhpcyl9cmV0dXJuIHRoaXMuX3N1cGVyKHIsbixpLG8pfSxj b250ZW50QXJyYXlEaWRDaGFuZ2U6ZnVuY3Rpb24ocixuLGksbyl7dmFyIGE9 ZSh0aGlzLCJpc1NvcnRlZCIpLHM9ZSh0aGlzLCJzb3J0UHJvcGVydGllcyIp O2lmKGEpe3ZhciB1PXIuc2xpY2UobixuK28pO3QodSxmdW5jdGlvbihlKXt0 aGlzLmluc2VydEl0ZW1Tb3J0ZWQoZSksdChzLGZ1bmN0aW9uKHQpe0VtYmVy LmFkZE9ic2VydmVyKGUsdCx0aGlzLCJjb250ZW50SXRlbVNvcnRQcm9wZXJ0 eURpZENoYW5nZSIpfSx0aGlzKX0sdGhpcyl9cmV0dXJuIHRoaXMuX3N1cGVy KHIsbixpLG8pfSxpbnNlcnRJdGVtU29ydGVkOmZ1bmN0aW9uKHQpe3ZhciBy PWUodGhpcywiYXJyYW5nZWRDb250ZW50Iiksbj1lKHIsImxlbmd0aCIpLGk9 dGhpcy5fYmluYXJ5U2VhcmNoKHQsMCxuKTtyLmluc2VydEF0KGksdCl9LGNv bnRlbnRJdGVtU29ydFByb3BlcnR5RGlkQ2hhbmdlOmZ1bmN0aW9uKHQpe3Zh ciByPWUodGhpcywiYXJyYW5nZWRDb250ZW50Iiksbj1yLmluZGV4T2YodCks aT1yLm9iamVjdEF0KG4tMSksbz1yLm9iamVjdEF0KG4rMSksYT1pJiZ0aGlz Lm9yZGVyQnkodCxpKSxzPW8mJnRoaXMub3JkZXJCeSh0LG8pOygwPmF8fHM+ MCkmJihyLnJlbW92ZU9iamVjdCh0KSx0aGlzLmluc2VydEl0ZW1Tb3J0ZWQo dCkpfSxfYmluYXJ5U2VhcmNoOmZ1bmN0aW9uKHQscixuKXt2YXIgaSxvLGEs cztyZXR1cm4gcj09PW4/cjoocz1lKHRoaXMsImFycmFuZ2VkQ29udGVudCIp LGk9citNYXRoLmZsb29yKChuLXIpLzIpLG89cy5vYmplY3RBdChpKSxhPXRo aXMub3JkZXJCeShvLHQpLDA+YT90aGlzLl9iaW5hcnlTZWFyY2godCxpKzEs bik6YT4wP3RoaXMuX2JpbmFyeVNlYXJjaCh0LHIsaSk6aSl9fSl9KCksZnVu Y3Rpb24oKXt2YXIgZT1FbWJlci5nZXQsdD0oRW1iZXIuc2V0LEVtYmVyLkVu dW1lcmFibGVVdGlscy5mb3JFYWNoKSxyPUVtYmVyLkVudW1lcmFibGVVdGls cy5yZXBsYWNlO0VtYmVyLkFycmF5Q29udHJvbGxlcj1FbWJlci5BcnJheVBy b3h5LmV4dGVuZChFbWJlci5Db250cm9sbGVyTWl4aW4sRW1iZXIuU29ydGFi bGVNaXhpbix7aXRlbUNvbnRyb2xsZXI6bnVsbCxsb29rdXBJdGVtQ29udHJv bGxlcjpmdW5jdGlvbigpe3JldHVybiBlKHRoaXMsIml0ZW1Db250cm9sbGVy Iil9LG9iamVjdEF0Q29udGVudDpmdW5jdGlvbih0KXt2YXIgcj1lKHRoaXMs Imxlbmd0aCIpLG49ZSh0aGlzLCJhcnJhbmdlZENvbnRlbnQiKSxpPW4mJm4u b2JqZWN0QXQodCk7aWYodD49MCYmcj50KXt2YXIgbz10aGlzLmxvb2t1cEl0 ZW1Db250cm9sbGVyKGkpO2lmKG8pcmV0dXJuIHRoaXMuY29udHJvbGxlckF0 KHQsaSxvKX1yZXR1cm4gaX0sYXJyYW5nZWRDb250ZW50RGlkQ2hhbmdlOmZ1 bmN0aW9uKCl7dGhpcy5fc3VwZXIoKSx0aGlzLl9yZXNldFN1YkNvbnRyb2xs ZXJzKCl9LGFycmF5Q29udGVudERpZENoYW5nZTpmdW5jdGlvbihuLGksbyl7 dmFyIGE9ZSh0aGlzLCJfc3ViQ29udHJvbGxlcnMiKSxzPWEuc2xpY2Uobixu K2kpO3QocyxmdW5jdGlvbihlKXtlJiZlLmRlc3Ryb3koKX0pLHIoYSxuLGks bmV3IEFycmF5KG8pKSx0aGlzLl9zdXBlcihuLGksbyl9LGluaXQ6ZnVuY3Rp b24oKXt0aGlzLl9zdXBlcigpLHRoaXMuc2V0KCJfc3ViQ29udHJvbGxlcnMi LEVtYmVyLkEoKSl9LGNvbnRlbnQ6RW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24o KXtyZXR1cm4gRW1iZXIuQSgpfSksX2lzVmlydHVhbDohMSxjb250cm9sbGVy QXQ6ZnVuY3Rpb24odCxyLG4pe3ZhciBpLG89ZSh0aGlzLCJjb250YWluZXIi KSxhPWUodGhpcywiX3N1YkNvbnRyb2xsZXJzIikscz1hW3RdOwppZihzKXJl dHVybiBzO2lmKGk9ImNvbnRyb2xsZXI6IituLCFvLmhhcyhpKSl0aHJvdyBu ZXcgRW1iZXIuRXJyb3IoJ0NvdWxkIG5vdCByZXNvbHZlIGl0ZW1Db250cm9s bGVyOiAiJytuKyciJyk7dmFyIHU7cmV0dXJuIHRoaXMuX2lzVmlydHVhbCYm KHU9ZSh0aGlzLCJwYXJlbnRDb250cm9sbGVyIikpLHU9dXx8dGhpcyxzPW8u bG9va3VwRmFjdG9yeShpKS5jcmVhdGUoe3RhcmdldDp0aGlzLHBhcmVudENv bnRyb2xsZXI6dSxjb250ZW50OnJ9KSxhW3RdPXMsc30sX3N1YkNvbnRyb2xs ZXJzOm51bGwsX3Jlc2V0U3ViQ29udHJvbGxlcnM6ZnVuY3Rpb24oKXt2YXIg cj1lKHRoaXMsIl9zdWJDb250cm9sbGVycyIpO3ImJnQocixmdW5jdGlvbihl KXtlJiZlLmRlc3Ryb3koKX0pLHRoaXMuc2V0KCJfc3ViQ29udHJvbGxlcnMi LEVtYmVyLkEoKSl9fSl9KCksZnVuY3Rpb24oKXtFbWJlci5PYmplY3RDb250 cm9sbGVyPUVtYmVyLk9iamVjdFByb3h5LmV4dGVuZChFbWJlci5Db250cm9s bGVyTWl4aW4pfSgpLGZ1bmN0aW9uKCl7dmFyIGU9dGhpcyYmdGhpcy5qUXVl cnl8fEVtYmVyLmltcG9ydHMmJkVtYmVyLmltcG9ydHMualF1ZXJ5O2V8fCJm dW5jdGlvbiIhPXR5cGVvZiByfHwoZT1yKCJqcXVlcnkiKSksRW1iZXIuJD1l fSgpLGZ1bmN0aW9uKCl7aWYoRW1iZXIuJCl7dmFyIGU9RW1iZXIuU3RyaW5n LncoImRyYWdzdGFydCBkcmFnIGRyYWdlbnRlciBkcmFnbGVhdmUgZHJhZ292 ZXIgZHJvcCBkcmFnZW5kIik7RW1iZXIuRW51bWVyYWJsZVV0aWxzLmZvckVh Y2goZSxmdW5jdGlvbihlKXtFbWJlci4kLmV2ZW50LmZpeEhvb2tzW2VdPXtw cm9wczpbImRhdGFUcmFuc2ZlciJdfX0pfX0oKSxmdW5jdGlvbigpe2Z1bmN0 aW9uIGUoZSl7dmFyIHQ9ZS5zaGlmdEtleXx8ZS5tZXRhS2V5fHxlLmFsdEtl eXx8ZS5jdHJsS2V5LHI9ZS53aGljaD4xO3JldHVybiF0JiYhcn12YXIgdD0i dW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiZmdW5jdGlvbigpe3ZhciBl PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBlLmlubmVy SFRNTD0iPGRpdj48L2Rpdj4iLGUuZmlyc3RDaGlsZC5pbm5lckhUTUw9Ijxz Y3JpcHQ+PC9zY3JpcHQ+IiwiIj09PWUuZmlyc3RDaGlsZC5pbm5lckhUTUx9 KCkscj0idW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiZmdW5jdGlvbigp e3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBl LmlubmVySFRNTD0iVGVzdDogPHNjcmlwdCB0eXBlPSd0ZXh0L3gtcGxhY2Vo b2xkZXInPjwvc2NyaXB0PlZhbHVlIiwiVGVzdDoiPT09ZS5jaGlsZE5vZGVz WzBdLm5vZGVWYWx1ZSYmIiBWYWx1ZSI9PT1lLmNoaWxkTm9kZXNbMl0ubm9k ZVZhbHVlfSgpLG49ZnVuY3Rpb24oZSx0KXtpZihlLmdldEF0dHJpYnV0ZSgi aWQiKT09PXQpcmV0dXJuIGU7dmFyIHIsaSxvLGE9ZS5jaGlsZE5vZGVzLmxl bmd0aDtmb3Iocj0wO2E+cjtyKyspaWYoaT1lLmNoaWxkTm9kZXNbcl0sbz0x PT09aS5ub2RlVHlwZSYmbihpLHQpKXJldHVybiBvfSxpPWZ1bmN0aW9uKGUs aSl7dCYmKGk9IiZzaHk7IitpKTt2YXIgbz1bXTtpZihyJiYoaT1pLnJlcGxh Y2UoLyhccyspKDxzY3JpcHQgaWQ9JyhbXiddKyknKS9nLGZ1bmN0aW9uKGUs dCxyLG4pe3JldHVybiBvLnB1c2goW24sdF0pLHJ9KSksZS5pbm5lckhUTUw9 aSxvLmxlbmd0aD4wKXt2YXIgYSxzPW8ubGVuZ3RoO2ZvcihhPTA7cz5hO2Er Kyl7dmFyIHU9bihlLG9bYV1bMF0pLGw9ZG9jdW1lbnQuY3JlYXRlVGV4dE5v ZGUob1thXVsxXSk7dS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShsLHUpfX1p Zih0KXtmb3IodmFyIGM9ZS5maXJzdENoaWxkOzE9PT1jLm5vZGVUeXBlJiYh Yy5ub2RlTmFtZTspYz1jLmZpcnN0Q2hpbGQ7Mz09PWMubm9kZVR5cGUmJiLC rSI9PT1jLm5vZGVWYWx1ZS5jaGFyQXQoMCkmJihjLm5vZGVWYWx1ZT1jLm5v ZGVWYWx1ZS5zbGljZSgxKSl9fSxvPXt9LGE9ZnVuY3Rpb24oZSl7aWYodm9p ZCAwIT09b1tlXSlyZXR1cm4gb1tlXTt2YXIgdD0hMDtpZigic2VsZWN0Ij09 PWUudG9Mb3dlckNhc2UoKSl7dmFyIHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVu dCgic2VsZWN0Iik7aShyLCc8b3B0aW9uIHZhbHVlPSJ0ZXN0Ij5UZXN0PC9v cHRpb24+JyksdD0xPT09ci5vcHRpb25zLmxlbmd0aH1yZXR1cm4gb1tlXT10 LHR9LHM9ZnVuY3Rpb24oZSx0KXt2YXIgcj1lLnRhZ05hbWU7aWYoYShyKSlp KGUsdCk7ZWxzZXt2YXIgbj1lLm91dGVySFRNTHx8KG5ldyBYTUxTZXJpYWxp emVyKS5zZXJpYWxpemVUb1N0cmluZyhlKSxvPW4ubWF0Y2gobmV3IFJlZ0V4 cCgiPCIrcisiKFtePl0qKT4iLCJpIikpWzBdLHM9IjwvIityKyI+Iix1PWRv Y3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2ZvcihpKHUsbyt0K3MpLGU9 dS5maXJzdENoaWxkO2UudGFnTmFtZSE9PXI7KWU9ZS5uZXh0U2libGluZ31y ZXR1cm4gZX07RW1iZXIuVmlld1V0aWxzPXtzZXRJbm5lckhUTUw6cyxpc1Np bXBsZUNsaWNrOmV9fSgpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtyZXR1 cm4gZT9uLnRlc3QoZSk/ZS5yZXBsYWNlKGksIiIpOmU6ZX1mdW5jdGlvbiB0 KGUpe3ZhciB0PXsiPCI6IiZsdDsiLCI+IjoiJmd0OyIsJyInOiImcXVvdDsi LCInIjoiJiN4Mjc7IiwiYCI6IiYjeDYwOyJ9LHI9ZnVuY3Rpb24oZSl7cmV0 dXJuIHRbZV18fCImYW1wOyJ9LG49ZS50b1N0cmluZygpO3JldHVybiBhLnRl c3Qobik/bi5yZXBsYWNlKG8scik6bn12YXIgcj0oRW1iZXIuZ2V0LEVtYmVy LnNldCxmdW5jdGlvbigpe3RoaXMuc2Vlbj17fSx0aGlzLmxpc3Q9W119KTty LnByb3RvdHlwZT17YWRkOmZ1bmN0aW9uKGUpe2UgaW4gdGhpcy5zZWVufHwo dGhpcy5zZWVuW2VdPSEwLHRoaXMubGlzdC5wdXNoKGUpKX0sdG9ET006ZnVu Y3Rpb24oKXtyZXR1cm4gdGhpcy5saXN0LmpvaW4oIiAiKX19O3ZhciBuPS9b XmEtekEtWjAtOVwtXS8saT0vW15hLXpBLVowLTlcLV0vZyxvPS8mKD8hXHcr Oyl8Wzw+IidgXS9nLGE9L1smPD4iJ2BdLyxzPWZ1bmN0aW9uKCl7dmFyIGU9 ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdD1kb2N1bWVudC5jcmVh dGVFbGVtZW50KCJpbnB1dCIpO3JldHVybiB0LnNldEF0dHJpYnV0ZSgibmFt ZSIsImZvbyIpLGUuYXBwZW5kQ2hpbGQodCksISFlLmlubmVySFRNTC5tYXRj aCgiZm9vIil9KCk7RW1iZXIuUmVuZGVyQnVmZmVyPWZ1bmN0aW9uKGUpe3Jl dHVybiBuZXcgRW1iZXIuX1JlbmRlckJ1ZmZlcihlKX0sRW1iZXIuX1JlbmRl ckJ1ZmZlcj1mdW5jdGlvbihlKXt0aGlzLnRhZ05hbWVzPVtlfHxudWxsXSx0 aGlzLmJ1ZmZlcj0iIn0sRW1iZXIuX1JlbmRlckJ1ZmZlci5wcm90b3R5cGU9 e19lbGVtZW50Om51bGwsX2hhc0VsZW1lbnQ6ITAsZWxlbWVudENsYXNzZXM6 bnVsbCxjbGFzc2VzOm51bGwsZWxlbWVudElkOm51bGwsZWxlbWVudEF0dHJp YnV0ZXM6bnVsbCxlbGVtZW50UHJvcGVydGllczpudWxsLGVsZW1lbnRUYWc6 bnVsbCxlbGVtZW50U3R5bGU6bnVsbCxwYXJlbnRCdWZmZXI6bnVsbCxwdXNo OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmJ1ZmZlcis9ZSx0aGlzfSxhZGRD bGFzczpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lbGVtZW50Q2xhc3Nlcz10 aGlzLmVsZW1lbnRDbGFzc2VzfHxuZXcgcix0aGlzLmVsZW1lbnRDbGFzc2Vz LmFkZChlKSx0aGlzLmNsYXNzZXM9dGhpcy5lbGVtZW50Q2xhc3Nlcy5saXN0 LHRoaXN9LHNldENsYXNzZXM6ZnVuY3Rpb24oZSl7dGhpcy5lbGVtZW50Q2xh c3Nlcz1udWxsO3ZhciB0LHI9ZS5sZW5ndGg7Zm9yKHQ9MDtyPnQ7dCsrKXRo aXMuYWRkQ2xhc3MoZVt0XSl9LGlkOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlz LmVsZW1lbnRJZD1lLHRoaXN9LGF0dHI6ZnVuY3Rpb24oZSx0KXt2YXIgcj10 aGlzLmVsZW1lbnRBdHRyaWJ1dGVzPXRoaXMuZWxlbWVudEF0dHJpYnV0ZXN8 fHt9O3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9yW2VdOihyW2VdPXQs dGhpcyl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5lbGVt ZW50QXR0cmlidXRlcztyZXR1cm4gdCYmZGVsZXRlIHRbZV0sdGhpc30scHJv cDpmdW5jdGlvbihlLHQpe3ZhciByPXRoaXMuZWxlbWVudFByb3BlcnRpZXM9 dGhpcy5lbGVtZW50UHJvcGVydGllc3x8e307cmV0dXJuIDE9PT1hcmd1bWVu dHMubGVuZ3RoP3JbZV06KHJbZV09dCx0aGlzKX0scmVtb3ZlUHJvcDpmdW5j dGlvbihlKXt2YXIgdD10aGlzLmVsZW1lbnRQcm9wZXJ0aWVzO3JldHVybiB0 JiZkZWxldGUgdFtlXSx0aGlzfSxzdHlsZTpmdW5jdGlvbihlLHQpe3JldHVy biB0aGlzLmVsZW1lbnRTdHlsZT10aGlzLmVsZW1lbnRTdHlsZXx8e30sdGhp cy5lbGVtZW50U3R5bGVbZV09dCx0aGlzfSxiZWdpbjpmdW5jdGlvbihlKXty ZXR1cm4gdGhpcy50YWdOYW1lcy5wdXNoKGV8fG51bGwpLHRoaXN9LHB1c2hP cGVuaW5nVGFnOmZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5jdXJyZW50VGFnTmFt ZSgpO2lmKHIpe2lmKHRoaXMuX2hhc0VsZW1lbnQmJiF0aGlzLl9lbGVtZW50 JiYwPT09dGhpcy5idWZmZXIubGVuZ3RoKXJldHVybiB0aGlzLl9lbGVtZW50 PXRoaXMuZ2VuZXJhdGVFbGVtZW50KCksdm9pZCAwO3ZhciBuLGksbz10aGlz LmJ1ZmZlcixhPXRoaXMuZWxlbWVudElkLHM9dGhpcy5jbGFzc2VzLHU9dGhp cy5lbGVtZW50QXR0cmlidXRlcyxsPXRoaXMuZWxlbWVudFByb3BlcnRpZXMs Yz10aGlzLmVsZW1lbnRTdHlsZTtpZihvKz0iPCIrZShyKSxhJiYobys9JyBp ZD0iJyt0KGEpKyciJyx0aGlzLmVsZW1lbnRJZD1udWxsKSxzJiYobys9JyBj bGFzcz0iJyt0KHMuam9pbigiICIpKSsnIicsdGhpcy5jbGFzc2VzPW51bGws dGhpcy5lbGVtZW50Q2xhc3Nlcz1udWxsKSxjKXtvKz0nIHN0eWxlPSInO2Zv cihpIGluIGMpYy5oYXNPd25Qcm9wZXJ0eShpKSYmKG8rPWkrIjoiK3QoY1tp XSkrIjsiKTtvKz0nIicsdGhpcy5lbGVtZW50U3R5bGU9bnVsbH1pZih1KXtm b3IobiBpbiB1KXUuaGFzT3duUHJvcGVydHkobikmJihvKz0iICIrbisnPSIn K3QodVtuXSkrJyInKTt0aGlzLmVsZW1lbnRBdHRyaWJ1dGVzPW51bGx9aWYo bCl7Zm9yKGkgaW4gbClpZihsLmhhc093blByb3BlcnR5KGkpKXt2YXIgaD1s W2ldOyhofHwibnVtYmVyIj09dHlwZW9mIGgpJiYobys9aD09PSEwPyIgIitp Kyc9IicraSsnIic6IiAiK2krJz0iJyt0KGxbaV0pKyciJyl9dGhpcy5lbGVt ZW50UHJvcGVydGllcz1udWxsfW8rPSI+Iix0aGlzLmJ1ZmZlcj1vfX0scHVz aENsb3NpbmdUYWc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnRhZ05hbWVzLnBv cCgpO3QmJih0aGlzLmJ1ZmZlcis9IjwvIitlKHQpKyI+Iil9LGN1cnJlbnRU YWdOYW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGFnTmFtZXNbdGhpcy50 YWdOYW1lcy5sZW5ndGgtMV19LGdlbmVyYXRlRWxlbWVudDpmdW5jdGlvbigp e3ZhciByLG4saSxvPXRoaXMudGFnTmFtZXMucG9wKCksYT10aGlzLmVsZW1l bnRJZCx1PXRoaXMuY2xhc3NlcyxsPXRoaXMuZWxlbWVudEF0dHJpYnV0ZXMs Yz10aGlzLmVsZW1lbnRQcm9wZXJ0aWVzLGg9dGhpcy5lbGVtZW50U3R5bGUs bT0iIjtpPWwmJmwubmFtZSYmIXM/IjwiK2UobykrJyBuYW1lPSInK3QobC5u YW1lKSsnIj4nOm87dmFyIHA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpKSxm PUVtYmVyLiQocCk7aWYoYSYmKGYuYXR0cigiaWQiLGEpLHRoaXMuZWxlbWVu dElkPW51bGwpLHUmJihmLmF0dHIoImNsYXNzIix1LmpvaW4oIiAiKSksdGhp cy5jbGFzc2VzPW51bGwsdGhpcy5lbGVtZW50Q2xhc3Nlcz1udWxsKSxoKXtm b3IobiBpbiBoKWguaGFzT3duUHJvcGVydHkobikmJihtKz1uKyI6IitoW25d KyI7Iik7Zi5hdHRyKCJzdHlsZSIsbSksdGhpcy5lbGVtZW50U3R5bGU9bnVs bH1pZihsKXtmb3IociBpbiBsKWwuaGFzT3duUHJvcGVydHkocikmJmYuYXR0 cihyLGxbcl0pO3RoaXMuZWxlbWVudEF0dHJpYnV0ZXM9bnVsbH1pZihjKXtm b3IobiBpbiBjKWMuaGFzT3duUHJvcGVydHkobikmJmYucHJvcChuLGNbbl0p O3RoaXMuZWxlbWVudFByb3BlcnRpZXM9bnVsbH1yZXR1cm4gcH0sZWxlbWVu dDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuaW5uZXJTdHJpbmcoKTtyZXR1cm4g ZSYmKHRoaXMuX2VsZW1lbnQ9RW1iZXIuVmlld1V0aWxzLnNldElubmVySFRN TCh0aGlzLl9lbGVtZW50LGUpKSx0aGlzLl9lbGVtZW50fSxzdHJpbmc6ZnVu Y3Rpb24oKXtpZih0aGlzLl9oYXNFbGVtZW50JiZ0aGlzLl9lbGVtZW50KXt2 YXIgZT10aGlzLmVsZW1lbnQoKSx0PWUub3V0ZXJIVE1MO3JldHVybiJ1bmRl ZmluZWQiPT10eXBlb2YgdD9FbWJlci4kKCI8ZGl2Lz4iKS5hcHBlbmQoZSku aHRtbCgpOnR9cmV0dXJuIHRoaXMuaW5uZXJTdHJpbmcoKX0saW5uZXJTdHJp bmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5idWZmZXJ9fX0oKSxmdW5jdGlv bigpe3t2YXIgZT1FbWJlci5nZXQsdD1FbWJlci5zZXQ7RW1iZXIuU3RyaW5n LmZtdH1FbWJlci5FdmVudERpc3BhdGNoZXI9RW1iZXIuT2JqZWN0LmV4dGVu ZCh7ZXZlbnRzOnt0b3VjaHN0YXJ0OiJ0b3VjaFN0YXJ0Iix0b3VjaG1vdmU6 InRvdWNoTW92ZSIsdG91Y2hlbmQ6InRvdWNoRW5kIix0b3VjaGNhbmNlbDoi dG91Y2hDYW5jZWwiLGtleWRvd246ImtleURvd24iLGtleXVwOiJrZXlVcCIs a2V5cHJlc3M6ImtleVByZXNzIixtb3VzZWRvd246Im1vdXNlRG93biIsbW91 c2V1cDoibW91c2VVcCIsY29udGV4dG1lbnU6ImNvbnRleHRNZW51IixjbGlj azoiY2xpY2siLGRibGNsaWNrOiJkb3VibGVDbGljayIsbW91c2Vtb3ZlOiJt b3VzZU1vdmUiLGZvY3VzaW46ImZvY3VzSW4iLGZvY3Vzb3V0OiJmb2N1c091 dCIsbW91c2VlbnRlcjoibW91c2VFbnRlciIsbW91c2VsZWF2ZToibW91c2VM ZWF2ZSIsc3VibWl0OiJzdWJtaXQiLGlucHV0OiJpbnB1dCIsY2hhbmdlOiJj aGFuZ2UiLGRyYWdzdGFydDoiZHJhZ1N0YXJ0IixkcmFnOiJkcmFnIixkcmFn ZW50ZXI6ImRyYWdFbnRlciIsZHJhZ2xlYXZlOiJkcmFnTGVhdmUiLGRyYWdv dmVyOiJkcmFnT3ZlciIsZHJvcDoiZHJvcCIsZHJhZ2VuZDoiZHJhZ0VuZCJ9 LHJvb3RFbGVtZW50OiJib2R5IixzZXR1cDpmdW5jdGlvbihyLG4pe3ZhciBp LG89ZSh0aGlzLCJldmVudHMiKTtFbWJlci4kLmV4dGVuZChvLHJ8fHt9KSxF bWJlci5pc05vbmUobil8fHQodGhpcywicm9vdEVsZW1lbnQiLG4pLG49RW1i ZXIuJChlKHRoaXMsInJvb3RFbGVtZW50IikpLG4uYWRkQ2xhc3MoImVtYmVy LWFwcGxpY2F0aW9uIik7Zm9yKGkgaW4gbylvLmhhc093blByb3BlcnR5KGkp JiZ0aGlzLnNldHVwSGFuZGxlcihuLGksb1tpXSl9LHNldHVwSGFuZGxlcjpm dW5jdGlvbihlLHQscil7dmFyIG49dGhpcztlLm9uKHQrIi5lbWJlciIsIi5l bWJlci12aWV3IixmdW5jdGlvbihlLHQpe3ZhciBpPUVtYmVyLlZpZXcudmll d3NbdGhpcy5pZF0sbz0hMCxhPW51bGw7cmV0dXJuIGE9bi5fZmluZE5lYXJl c3RFdmVudE1hbmFnZXIoaSxyKSxhJiZhIT09dD9vPW4uX2Rpc3BhdGNoRXZl bnQoYSxlLHIsaSk6aT9vPW4uX2J1YmJsZUV2ZW50KGksZSxyKTplLnN0b3BQ cm9wYWdhdGlvbigpLG99KSxlLm9uKHQrIi5lbWJlciIsIltkYXRhLWVtYmVy LWFjdGlvbl0iLGZ1bmN0aW9uKGUpe3ZhciB0PUVtYmVyLiQoZS5jdXJyZW50 VGFyZ2V0KS5hdHRyKCJkYXRhLWVtYmVyLWFjdGlvbiIpLG49RW1iZXIuSGFu ZGxlYmFycy5BY3Rpb25IZWxwZXIucmVnaXN0ZXJlZEFjdGlvbnNbdF07cmV0 dXJuIG4mJm4uZXZlbnROYW1lPT09cj9uLmhhbmRsZXIoZSk6dm9pZCAwfSl9 LF9maW5kTmVhcmVzdEV2ZW50TWFuYWdlcjpmdW5jdGlvbih0LHIpe2Zvcih2 YXIgbj1udWxsO3QmJihuPWUodCwiZXZlbnRNYW5hZ2VyIiksIW58fCFuW3Jd KTspdD1lKHQsInBhcmVudFZpZXciKTtyZXR1cm4gbn0sX2Rpc3BhdGNoRXZl bnQ6ZnVuY3Rpb24oZSx0LHIsbil7dmFyIGk9ITAsbz1lW3JdO3JldHVybiJm dW5jdGlvbiI9PT1FbWJlci50eXBlT2Yobyk/KGk9RW1iZXIucnVuKGUsbyx0 LG4pLHQuc3RvcFByb3BhZ2F0aW9uKCkpOmk9dGhpcy5fYnViYmxlRXZlbnQo bix0LHIpLGl9LF9idWJibGVFdmVudDpmdW5jdGlvbihlLHQscil7cmV0dXJu IEVtYmVyLnJ1bihlLGUuaGFuZGxlRXZlbnQscix0KX0sZGVzdHJveTpmdW5j dGlvbigpe3ZhciB0PWUodGhpcywicm9vdEVsZW1lbnQiKTtyZXR1cm4gRW1i ZXIuJCh0KS5vZmYoIi5lbWJlciIsIioqIikucmVtb3ZlQ2xhc3MoImVtYmVy LWFwcGxpY2F0aW9uIiksdGhpcy5fc3VwZXIoKX19KX0oKSxmdW5jdGlvbigp e3ZhciBlPUVtYmVyLnJ1bi5xdWV1ZXMsdD1FbWJlci5BcnJheVBvbHlmaWxs cy5pbmRleE9mO2Uuc3BsaWNlKHQuY2FsbChlLCJhY3Rpb25zIikrMSwwLCJy ZW5kZXIiLCJhZnRlclJlbmRlciIpfSgpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24g ZShlKXtlLmJ1ZmZlcj1udWxsfWZ1bmN0aW9uIHQoKXtFbWJlci5ydW4ub25j ZShFbWJlci5WaWV3LCJub3RpZnlNdXRhdGlvbkxpc3RlbmVycyIpfXZhciBy PXt9LG49RW1iZXIuZ2V0LGk9RW1iZXIuc2V0LG89RW1iZXIuZ3VpZEZvcixh PUVtYmVyLkVudW1lcmFibGVVdGlscy5mb3JFYWNoLHM9RW1iZXIuRW51bWVy YWJsZVV0aWxzLmFkZE9iamVjdCx1PUVtYmVyLm1ldGEsbD1FbWJlci5kZWZp bmVQcm9wZXJ0eSxjPUVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCl7dmFyIGU9 dGhpcy5fY2hpbGRWaWV3cyx0PUVtYmVyLkEoKSxyPXRoaXM7cmV0dXJuIGEo ZSxmdW5jdGlvbihlKXt2YXIgcjtlLmlzVmlydHVhbD8ocj1uKGUsImNoaWxk Vmlld3MiKSkmJnQucHVzaE9iamVjdHMocik6dC5wdXNoKGUpfSksdC5yZXBs YWNlPWZ1bmN0aW9uKGUsdCxuKXtpZihyIGluc3RhbmNlb2YgRW1iZXIuQ29u dGFpbmVyVmlldylyZXR1cm4gci5yZXBsYWNlKGUsdCxuKTt0aHJvdyBuZXcg RW1iZXIuRXJyb3IoImNoaWxkVmlld3MgaXMgaW1tdXRhYmxlIil9LHR9KTtF bWJlci5URU1QTEFURVM9e30sRW1iZXIuQ29yZVZpZXc9RW1iZXIuT2JqZWN0 LmV4dGVuZChFbWJlci5FdmVudGVkLEVtYmVyLkFjdGlvbkhhbmRsZXIse2lz VmlldzohMCxzdGF0ZXM6cixpbml0OmZ1bmN0aW9uKCl7dGhpcy5fc3VwZXIo KSx0aGlzLnRyYW5zaXRpb25UbygicHJlUmVuZGVyIiksdGhpcy5faXNWaXNp YmxlPW4odGhpcywiaXNWaXNpYmxlIil9LHBhcmVudFZpZXc6RW1iZXIuY29t cHV0ZWQoIl9wYXJlbnRWaWV3IixmdW5jdGlvbigpe3ZhciBlPXRoaXMuX3Bh cmVudFZpZXc7cmV0dXJuIGUmJmUuaXNWaXJ0dWFsP24oZSwicGFyZW50Vmll dyIpOmV9KSxzdGF0ZTpudWxsLF9wYXJlbnRWaWV3Om51bGwsY29uY3JldGVW aWV3OkVtYmVyLmNvbXB1dGVkKCJwYXJlbnRWaWV3IixmdW5jdGlvbigpe3Jl dHVybiB0aGlzLmlzVmlydHVhbD9uKHRoaXMsInBhcmVudFZpZXciKTp0aGlz fSksaW5zdHJ1bWVudE5hbWU6ImNvcmVfdmlldyIsaW5zdHJ1bWVudERldGFp bHM6ZnVuY3Rpb24oZSl7ZS5vYmplY3Q9dGhpcy50b1N0cmluZygpfSxyZW5k ZXJUb0J1ZmZlcjpmdW5jdGlvbihlLHQpe3ZhciByPSJyZW5kZXIuIit0aGlz Lmluc3RydW1lbnROYW1lLG49e307cmV0dXJuIHRoaXMuaW5zdHJ1bWVudERl dGFpbHMobiksRW1iZXIuaW5zdHJ1bWVudChyLG4sZnVuY3Rpb24oKXtyZXR1 cm4gdGhpcy5fcmVuZGVyVG9CdWZmZXIoZSx0KX0sdGhpcyl9LF9yZW5kZXJU b0J1ZmZlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLnRhZ05hbWU7KG51bGw9 PT10fHx2b2lkIDA9PT10KSYmKHQ9ImRpdiIpO3ZhciByPXRoaXMuYnVmZmVy PWUmJmUuYmVnaW4odCl8fEVtYmVyLlJlbmRlckJ1ZmZlcih0KTtyZXR1cm4g dGhpcy50cmFuc2l0aW9uVG8oImluQnVmZmVyIiwhMSksdGhpcy5iZWZvcmVS ZW5kZXIociksdGhpcy5yZW5kZXIociksdGhpcy5hZnRlclJlbmRlcihyKSxy fSx0cmlnZ2VyOmZ1bmN0aW9uKGUpe3RoaXMuX3N1cGVyLmFwcGx5KHRoaXMs YXJndW1lbnRzKTt2YXIgdD10aGlzW2VdO2lmKHQpe3ZhciByLG4saT1bXTtm b3Iocj0xLG49YXJndW1lbnRzLmxlbmd0aDtuPnI7cisrKWkucHVzaChhcmd1 bWVudHNbcl0pO3JldHVybiB0LmFwcGx5KHRoaXMsaSl9fSxkZXByZWNhdGVk U2VuZEhhbmRsZXM6ZnVuY3Rpb24oZSl7cmV0dXJuISF0aGlzW2VdfSxkZXBy ZWNhdGVkU2VuZDpmdW5jdGlvbihlKXt2YXIgdD1bXS5zbGljZS5jYWxsKGFy Z3VtZW50cywxKTt0aGlzW2VdLmFwcGx5KHRoaXMsdCl9LGhhczpmdW5jdGlv bihlKXtyZXR1cm4iZnVuY3Rpb24iPT09RW1iZXIudHlwZU9mKHRoaXNbZV0p fHx0aGlzLl9zdXBlcihlKX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBlPXRo aXMuX3BhcmVudFZpZXc7aWYodGhpcy5fc3VwZXIoKSlyZXR1cm4gdGhpcy5y ZW1vdmVkRnJvbURPTXx8dGhpcy5kZXN0cm95RWxlbWVudCgpLGUmJmUucmVt b3ZlQ2hpbGQodGhpcyksdGhpcy50cmFuc2l0aW9uVG8oImRlc3Ryb3lpbmci LCExKSx0aGlzfSxjbGVhclJlbmRlcmVkQ2hpbGRyZW46RW1iZXIuSyx0cmln Z2VyUmVjdXJzaXZlbHk6RW1iZXIuSyxpbnZva2VSZWN1cnNpdmVseTpFbWJl ci5LLHRyYW5zaXRpb25UbzpFbWJlci5LLGRlc3Ryb3lFbGVtZW50OkVtYmVy Lkt9KTt2YXIgaD1FbWJlci5fVmlld0NvbGxlY3Rpb249ZnVuY3Rpb24oZSl7 dmFyIHQ9dGhpcy52aWV3cz1lfHxbXTt0aGlzLmxlbmd0aD10Lmxlbmd0aH07 aC5wcm90b3R5cGU9e2xlbmd0aDowLHRyaWdnZXI6ZnVuY3Rpb24oZSl7Zm9y KHZhciB0LHI9dGhpcy52aWV3cyxuPTAsaT1yLmxlbmd0aDtpPm47bisrKXQ9 cltuXSx0LnRyaWdnZXImJnQudHJpZ2dlcihlKX0sdHJpZ2dlclJlY3Vyc2l2 ZWx5OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLnZpZXdzLHI9MCxuPXQu bGVuZ3RoO24+cjtyKyspdFtyXS50cmlnZ2VyUmVjdXJzaXZlbHkoZSl9LGlu dm9rZVJlY3Vyc2l2ZWx5OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxyPXRoaXMu dmlld3Msbj0wLGk9ci5sZW5ndGg7aT5uO24rKyl0PXJbbl0sZSh0KX0sdHJh bnNpdGlvblRvOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByPXRoaXMudmlld3Ms bj0wLGk9ci5sZW5ndGg7aT5uO24rKylyW25dLnRyYW5zaXRpb25UbyhlLHQp fSxwdXNoOmZ1bmN0aW9uKCl7dGhpcy5sZW5ndGgrPWFyZ3VtZW50cy5sZW5n dGg7dmFyIGU9dGhpcy52aWV3cztyZXR1cm4gZS5wdXNoLmFwcGx5KGUsYXJn dW1lbnRzKX0sb2JqZWN0QXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudmll d3NbZV19LGZvckVhY2g6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy52aWV3czty ZXR1cm4gYSh0LGUpfSxjbGVhcjpmdW5jdGlvbigpe3RoaXMubGVuZ3RoPTAs dGhpcy52aWV3cy5sZW5ndGg9MH19O3ZhciBtPVtdO0VtYmVyLlZpZXc9RW1i ZXIuQ29yZVZpZXcuZXh0ZW5kKHtjb25jYXRlbmF0ZWRQcm9wZXJ0aWVzOlsi Y2xhc3NOYW1lcyIsImNsYXNzTmFtZUJpbmRpbmdzIiwiYXR0cmlidXRlQmlu ZGluZ3MiXSxpc1ZpZXc6ITAsdGVtcGxhdGVOYW1lOm51bGwsbGF5b3V0TmFt ZTpudWxsLHRlbXBsYXRlOkVtYmVyLmNvbXB1dGVkKCJ0ZW1wbGF0ZU5hbWUi LGZ1bmN0aW9uKGUsdCl7aWYodm9pZCAwIT09dClyZXR1cm4gdDt2YXIgcj1u KHRoaXMsInRlbXBsYXRlTmFtZSIpLGk9dGhpcy50ZW1wbGF0ZUZvck5hbWUo ciwidGVtcGxhdGUiKTtyZXR1cm4gaXx8bih0aGlzLCJkZWZhdWx0VGVtcGxh dGUiKX0pLGNvbnRyb2xsZXI6RW1iZXIuY29tcHV0ZWQoIl9wYXJlbnRWaWV3 IixmdW5jdGlvbigpe3ZhciBlPW4odGhpcywiX3BhcmVudFZpZXciKTtyZXR1 cm4gZT9uKGUsImNvbnRyb2xsZXIiKTpudWxsfSksbGF5b3V0OkVtYmVyLmNv bXB1dGVkKGZ1bmN0aW9uKCl7dmFyIGU9bih0aGlzLCJsYXlvdXROYW1lIiks dD10aGlzLnRlbXBsYXRlRm9yTmFtZShlLCJsYXlvdXQiKTtyZXR1cm4gdHx8 bih0aGlzLCJkZWZhdWx0TGF5b3V0Iil9KS5wcm9wZXJ0eSgibGF5b3V0TmFt ZSIpLF95aWVsZDpmdW5jdGlvbihlLHQpe3ZhciByPW4odGhpcywidGVtcGxh dGUiKTtyJiZyKGUsdCl9LHRlbXBsYXRlRm9yTmFtZTpmdW5jdGlvbihlKXtp ZihlKXt2YXIgdD10aGlzLmNvbnRhaW5lcnx8RW1iZXIuQ29udGFpbmVyJiZF bWJlci5Db250YWluZXIuZGVmYXVsdENvbnRhaW5lcjtyZXR1cm4gdCYmdC5s b29rdXAoInRlbXBsYXRlOiIrZSl9fSxjb250ZXh0OkVtYmVyLmNvbXB1dGVk KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIDI9PT1hcmd1bWVudHMubGVuZ3RoPyhp KHRoaXMsIl9jb250ZXh0Iix0KSx0KTpuKHRoaXMsIl9jb250ZXh0Iil9KS52 b2xhdGlsZSgpLF9jb250ZXh0OkVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCl7 dmFyIGUsdDtyZXR1cm4odD1uKHRoaXMsImNvbnRyb2xsZXIiKSk/dDooZT10 aGlzLl9wYXJlbnRWaWV3LGU/bihlLCJfY29udGV4dCIpOm51bGwpfSksX2Nv bnRleHREaWRDaGFuZ2U6RW1iZXIub2JzZXJ2ZXIoImNvbnRleHQiLGZ1bmN0 aW9uKCl7dGhpcy5yZXJlbmRlcigpfSksaXNWaXNpYmxlOiEwLGNoaWxkVmll d3M6YyxfY2hpbGRWaWV3czptLF9jaGlsZFZpZXdzV2lsbENoYW5nZTpFbWJl ci5iZWZvcmVPYnNlcnZlcigiY2hpbGRWaWV3cyIsZnVuY3Rpb24oKXtpZih0 aGlzLmlzVmlydHVhbCl7dmFyIGU9bih0aGlzLCJwYXJlbnRWaWV3Iik7ZSYm RW1iZXIucHJvcGVydHlXaWxsQ2hhbmdlKGUsImNoaWxkVmlld3MiKX19KSxf Y2hpbGRWaWV3c0RpZENoYW5nZTpFbWJlci5vYnNlcnZlcigiY2hpbGRWaWV3 cyIsZnVuY3Rpb24oKXtpZih0aGlzLmlzVmlydHVhbCl7dmFyIGU9bih0aGlz LCJwYXJlbnRWaWV3Iik7ZSYmRW1iZXIucHJvcGVydHlEaWRDaGFuZ2UoZSwi Y2hpbGRWaWV3cyIpfX0pLG5lYXJlc3RJbnN0YW5jZU9mOmZ1bmN0aW9uKGUp e2Zvcih2YXIgdD1uKHRoaXMsInBhcmVudFZpZXciKTt0Oyl7aWYodCBpbnN0 YW5jZW9mIGUpcmV0dXJuIHQ7dD1uKHQsInBhcmVudFZpZXciKX19LG5lYXJl c3RPZlR5cGU6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PW4odGhpcywicGFyZW50 VmlldyIpLHI9ZSBpbnN0YW5jZW9mIEVtYmVyLk1peGluP2Z1bmN0aW9uKHQp e3JldHVybiBlLmRldGVjdCh0KX06ZnVuY3Rpb24odCl7cmV0dXJuIGUuZGV0 ZWN0KHQuY29uc3RydWN0b3IpfTt0Oyl7aWYocih0KSlyZXR1cm4gdDt0PW4o dCwicGFyZW50VmlldyIpfX0sbmVhcmVzdFdpdGhQcm9wZXJ0eTpmdW5jdGlv bihlKXtmb3IodmFyIHQ9bih0aGlzLCJwYXJlbnRWaWV3Iik7dDspe2lmKGUg aW4gdClyZXR1cm4gdDt0PW4odCwicGFyZW50VmlldyIpfX0sbmVhcmVzdENo aWxkT2Y6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PW4odGhpcywicGFyZW50Vmll dyIpO3Q7KXtpZihuKHQsInBhcmVudFZpZXciKWluc3RhbmNlb2YgZSlyZXR1 cm4gdDt0PW4odCwicGFyZW50VmlldyIpfX0sX3BhcmVudFZpZXdEaWRDaGFu Z2U6RW1iZXIub2JzZXJ2ZXIoIl9wYXJlbnRWaWV3IixmdW5jdGlvbigpe3Ro aXMuaXNEZXN0cm95aW5nfHwodGhpcy50cmlnZ2VyKCJwYXJlbnRWaWV3RGlk Q2hhbmdlIiksbih0aGlzLCJwYXJlbnRWaWV3LmNvbnRyb2xsZXIiKSYmIW4o dGhpcywiY29udHJvbGxlciIpJiZ0aGlzLm5vdGlmeVByb3BlcnR5Q2hhbmdl KCJjb250cm9sbGVyIikpfSksX2NvbnRyb2xsZXJEaWRDaGFuZ2U6RW1iZXIu b2JzZXJ2ZXIoImNvbnRyb2xsZXIiLGZ1bmN0aW9uKCl7dGhpcy5pc0Rlc3Ry b3lpbmd8fCh0aGlzLnJlcmVuZGVyKCksdGhpcy5mb3JFYWNoQ2hpbGRWaWV3 KGZ1bmN0aW9uKGUpe2UucHJvcGVydHlEaWRDaGFuZ2UoImNvbnRyb2xsZXIi KX0pKX0pLGNsb25lS2V5d29yZHM6ZnVuY3Rpb24oKXt2YXIgZT1uKHRoaXMs InRlbXBsYXRlRGF0YSIpLHQ9ZT9FbWJlci5jb3B5KGUua2V5d29yZHMpOnt9 O3JldHVybiBpKHQsInZpZXciLG4odGhpcywiY29uY3JldGVWaWV3IikpLGko dCwiX3ZpZXciLHRoaXMpLGkodCwiY29udHJvbGxlciIsbih0aGlzLCJjb250 cm9sbGVyIikpLHR9LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD1uKHRoaXMs ImxheW91dCIpfHxuKHRoaXMsInRlbXBsYXRlIik7aWYodCl7dmFyIHIsaT1u KHRoaXMsImNvbnRleHQiKSxvPXRoaXMuY2xvbmVLZXl3b3JkcygpLGE9e3Zp ZXc6dGhpcyxidWZmZXI6ZSxpc1JlbmRlckRhdGE6ITAsa2V5d29yZHM6byxp bnNpZGVHcm91cDpuKHRoaXMsInRlbXBsYXRlRGF0YS5pbnNpZGVHcm91cCIp fTtyPXQoaSx7ZGF0YTphfSksdm9pZCAwIT09ciYmZS5wdXNoKHIpfX0scmVy ZW5kZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdXJyZW50U3RhdGUucmVy ZW5kZXIodGhpcyl9LGNsZWFyUmVuZGVyZWRDaGlsZHJlbjpmdW5jdGlvbigp e2Zvcih2YXIgZT10aGlzLmxlbmd0aEJlZm9yZVJlbmRlcix0PXRoaXMubGVu Z3RoQWZ0ZXJSZW5kZXIscj10aGlzLl9jaGlsZFZpZXdzLG49dC0xO24+PWU7 bi0tKXJbbl0mJnJbbl0uZGVzdHJveSgpfSxfYXBwbHlDbGFzc05hbWVCaW5k aW5nczpmdW5jdGlvbihlKXt2YXIgdCxyLG4saT10aGlzLmNsYXNzTmFtZXM7 YShlLGZ1bmN0aW9uKGUpe3ZhciBvLGE9RW1iZXIuVmlldy5fcGFyc2VQcm9w ZXJ0eVBhdGgoZSksdT1mdW5jdGlvbigpe3I9dGhpcy5fY2xhc3NTdHJpbmdG b3JQcm9wZXJ0eShlKSx0PXRoaXMuJCgpLG8mJih0LnJlbW92ZUNsYXNzKG8p LGkucmVtb3ZlT2JqZWN0KG8pKSxyPyh0LmFkZENsYXNzKHIpLG89cik6bz1u dWxsfTtuPXRoaXMuX2NsYXNzU3RyaW5nRm9yUHJvcGVydHkoZSksbiYmKHMo aSxuKSxvPW4pLHRoaXMucmVnaXN0ZXJPYnNlcnZlcih0aGlzLGEucGF0aCx1 KSx0aGlzLm9uZSgid2lsbENsZWFyUmVuZGVyIixmdW5jdGlvbigpe28mJihp LnJlbW92ZU9iamVjdChvKSxvPW51bGwpfSl9LHRoaXMpfSxfdW5zcGVjaWZp ZWRBdHRyaWJ1dGVCaW5kaW5nczpudWxsLF9hcHBseUF0dHJpYnV0ZUJpbmRp bmdzOmZ1bmN0aW9uKGUsdCl7dmFyIHIsaT10aGlzLl91bnNwZWNpZmllZEF0 dHJpYnV0ZUJpbmRpbmdzPXRoaXMuX3Vuc3BlY2lmaWVkQXR0cmlidXRlQmlu ZGluZ3N8fHt9O2EodCxmdW5jdGlvbih0KXt2YXIgbz10LnNwbGl0KCI6Iiks YT1vWzBdLHM9b1sxXXx8YTthIGluIHRoaXM/KHRoaXMuX3NldHVwQXR0cmli dXRlQmluZGluZ09ic2VydmF0aW9uKGEscykscj1uKHRoaXMsYSksRW1iZXIu Vmlldy5hcHBseUF0dHJpYnV0ZUJpbmRpbmdzKGUscyxyKSk6aVthXT1zfSx0 aGlzKSx0aGlzLnNldFVua25vd25Qcm9wZXJ0eT10aGlzLl9zZXRVbmtub3du UHJvcGVydHl9LF9zZXR1cEF0dHJpYnV0ZUJpbmRpbmdPYnNlcnZhdGlvbjpm dW5jdGlvbihlLHQpe3ZhciByLGksbz1mdW5jdGlvbigpe2k9dGhpcy4kKCks cj1uKHRoaXMsZSksRW1iZXIuVmlldy5hcHBseUF0dHJpYnV0ZUJpbmRpbmdz KGksdCxyKX07dGhpcy5yZWdpc3Rlck9ic2VydmVyKHRoaXMsZSxvKX0sc2V0 VW5rbm93blByb3BlcnR5Om51bGwsX3NldFVua25vd25Qcm9wZXJ0eTpmdW5j dGlvbihlLHQpe3ZhciByPXRoaXMuX3Vuc3BlY2lmaWVkQXR0cmlidXRlQmlu ZGluZ3MmJnRoaXMuX3Vuc3BlY2lmaWVkQXR0cmlidXRlQmluZGluZ3NbZV07 cmV0dXJuIHImJnRoaXMuX3NldHVwQXR0cmlidXRlQmluZGluZ09ic2VydmF0 aW9uKGUsciksbCh0aGlzLGUpLGkodGhpcyxlLHQpfSxfY2xhc3NTdHJpbmdG b3JQcm9wZXJ0eTpmdW5jdGlvbihlKXt2YXIgdD1FbWJlci5WaWV3Ll9wYXJz ZVByb3BlcnR5UGF0aChlKSxyPXQucGF0aCxpPW4odGhpcyxyKTtyZXR1cm4g dm9pZCAwPT09aSYmRW1iZXIuaXNHbG9iYWxQYXRoKHIpJiYoaT1uKEVtYmVy Lmxvb2t1cCxyKSksRW1iZXIuVmlldy5fY2xhc3NTdHJpbmdGb3JWYWx1ZShy LGksdC5jbGFzc05hbWUsdC5mYWxzeUNsYXNzTmFtZSl9LGVsZW1lbnQ6RW1i ZXIuY29tcHV0ZWQoIl9wYXJlbnRWaWV3IixmdW5jdGlvbihlLHQpe3JldHVy biB2b2lkIDAhPT10P3RoaXMuY3VycmVudFN0YXRlLnNldEVsZW1lbnQodGhp cyx0KTp0aGlzLmN1cnJlbnRTdGF0ZS5nZXRFbGVtZW50KHRoaXMpfSksJDpm dW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jdXJyZW50U3RhdGUuJCh0aGlzLGUp fSxtdXRhdGVDaGlsZFZpZXdzOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxyPXRo aXMuX2NoaWxkVmlld3Msbj1yLmxlbmd0aDstLW4+PTA7KXQ9cltuXSxlKHRo aXMsdCxuKTtyZXR1cm4gdGhpc30sZm9yRWFjaENoaWxkVmlldzpmdW5jdGlv bihlKXt2YXIgdD10aGlzLl9jaGlsZFZpZXdzO2lmKCF0KXJldHVybiB0aGlz O3ZhciByLG4saT10Lmxlbmd0aDtmb3Iobj0wO2k+bjtuKyspcj10W25dLGUo cik7cmV0dXJuIHRoaXN9LGFwcGVuZFRvOmZ1bmN0aW9uKGUpe3JldHVybiB0 aGlzLl9pbnNlcnRFbGVtZW50TGF0ZXIoZnVuY3Rpb24oKXt0aGlzLiQoKS5h cHBlbmRUbyhlKX0pLHRoaXN9LHJlcGxhY2VJbjpmdW5jdGlvbihlKXtyZXR1 cm4gdGhpcy5faW5zZXJ0RWxlbWVudExhdGVyKGZ1bmN0aW9uKCl7RW1iZXIu JChlKS5lbXB0eSgpLHRoaXMuJCgpLmFwcGVuZFRvKGUpfSksdGhpc30sX2lu c2VydEVsZW1lbnRMYXRlcjpmdW5jdGlvbihlKXt0aGlzLl9zY2hlZHVsZWRJ bnNlcnQ9RW1iZXIucnVuLnNjaGVkdWxlT25jZSgicmVuZGVyIix0aGlzLCJf aW5zZXJ0RWxlbWVudCIsZSl9LF9pbnNlcnRFbGVtZW50OmZ1bmN0aW9uKGUp e3RoaXMuX3NjaGVkdWxlZEluc2VydD1udWxsLHRoaXMuY3VycmVudFN0YXRl Lmluc2VydEVsZW1lbnQodGhpcyxlKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0 dXJuIHRoaXMuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSl9LHJlbW92ZTpmdW5j dGlvbigpe3RoaXMucmVtb3ZlZEZyb21ET018fHRoaXMuZGVzdHJveUVsZW1l bnQoKSx0aGlzLmludm9rZVJlY3Vyc2l2ZWx5KGZ1bmN0aW9uKGUpe2UuY2xl YXJSZW5kZXJlZENoaWxkcmVuJiZlLmNsZWFyUmVuZGVyZWRDaGlsZHJlbigp fSl9LGVsZW1lbnRJZDpudWxsLGZpbmRFbGVtZW50SW5QYXJlbnRFbGVtZW50 OmZ1bmN0aW9uKGUpe3ZhciB0PSIjIit0aGlzLmVsZW1lbnRJZDtyZXR1cm4g RW1iZXIuJCh0KVswXXx8RW1iZXIuJCh0LGUpWzBdfSxjcmVhdGVFbGVtZW50 OmZ1bmN0aW9uKCl7aWYobih0aGlzLCJlbGVtZW50IikpcmV0dXJuIHRoaXM7 dmFyIGU9dGhpcy5yZW5kZXJUb0J1ZmZlcigpO3JldHVybiBpKHRoaXMsImVs ZW1lbnQiLGUuZWxlbWVudCgpKSx0aGlzfSx3aWxsSW5zZXJ0RWxlbWVudDpF bWJlci5LLGRpZEluc2VydEVsZW1lbnQ6RW1iZXIuSyx3aWxsQ2xlYXJSZW5k ZXI6RW1iZXIuSyxpbnZva2VSZWN1cnNpdmVseTpmdW5jdGlvbihlLHQpe2Zv cih2YXIgcixuLGksbz10PT09ITE/dGhpcy5fY2hpbGRWaWV3czpbdGhpc107 by5sZW5ndGg7KXtyPW8uc2xpY2UoKSxvPVtdO2Zvcih2YXIgYT0wLHM9ci5s ZW5ndGg7cz5hO2ErKyluPXJbYV0saT1uLl9jaGlsZFZpZXdzP24uX2NoaWxk Vmlld3Muc2xpY2UoMCk6bnVsbCxlKG4pLGkmJm8ucHVzaC5hcHBseShvLGkp fX0sdHJpZ2dlclJlY3Vyc2l2ZWx5OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxy LG4saT1bdGhpc107aS5sZW5ndGg7KXt0PWkuc2xpY2UoKSxpPVtdO2Zvcih2 YXIgbz0wLGE9dC5sZW5ndGg7YT5vO28rKylyPXRbb10sbj1yLl9jaGlsZFZp ZXdzP3IuX2NoaWxkVmlld3Muc2xpY2UoMCk6bnVsbCxyLnRyaWdnZXImJnIu dHJpZ2dlcihlKSxuJiZpLnB1c2guYXBwbHkoaSxuKX19LHZpZXdIaWVyYXJj aHlDb2xsZWN0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9bmV3IGgoW3Ro aXNdKSxyPTA7cjx0Lmxlbmd0aDtyKyspZT10Lm9iamVjdEF0KHIpLGUuX2No aWxkVmlld3MmJnQucHVzaC5hcHBseSh0LGUuX2NoaWxkVmlld3MpO3JldHVy biB0fSxkZXN0cm95RWxlbWVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmN1 cnJlbnRTdGF0ZS5kZXN0cm95RWxlbWVudCh0aGlzKX0sd2lsbERlc3Ryb3lF bGVtZW50OkVtYmVyLkssX25vdGlmeVdpbGxEZXN0cm95RWxlbWVudDpmdW5j dGlvbigpe3ZhciBlPXRoaXMudmlld0hpZXJhcmNoeUNvbGxlY3Rpb24oKTty ZXR1cm4gZS50cmlnZ2VyKCJ3aWxsQ2xlYXJSZW5kZXIiKSxlLnRyaWdnZXIo IndpbGxEZXN0cm95RWxlbWVudCIpLGV9LF9lbGVtZW50RGlkQ2hhbmdlOkVt YmVyLm9ic2VydmVyKCJlbGVtZW50IixmdW5jdGlvbigpe3RoaXMuZm9yRWFj aENoaWxkVmlldyhmdW5jdGlvbihlKXtkZWxldGUgdShlKS5jYWNoZS5lbGVt ZW50fSl9KSxwYXJlbnRWaWV3RGlkQ2hhbmdlOkVtYmVyLkssaW5zdHJ1bWVu dE5hbWU6InZpZXciLGluc3RydW1lbnREZXRhaWxzOmZ1bmN0aW9uKGUpe2Uu dGVtcGxhdGU9bih0aGlzLCJ0ZW1wbGF0ZU5hbWUiKSx0aGlzLl9zdXBlcihl KX0sX3JlbmRlclRvQnVmZmVyOmZ1bmN0aW9uKGUsdCl7dGhpcy5sZW5ndGhC ZWZvcmVSZW5kZXI9dGhpcy5fY2hpbGRWaWV3cy5sZW5ndGg7dmFyIHI9dGhp cy5fc3VwZXIoZSx0KTtyZXR1cm4gdGhpcy5sZW5ndGhBZnRlclJlbmRlcj10 aGlzLl9jaGlsZFZpZXdzLmxlbmd0aCxyfSxyZW5kZXJUb0J1ZmZlcklmTmVl ZGVkOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmN1cnJlbnRTdGF0ZS5yZW5k ZXJUb0J1ZmZlcklmTmVlZGVkKHRoaXMsZSl9LGJlZm9yZVJlbmRlcjpmdW5j dGlvbihlKXt0aGlzLmFwcGx5QXR0cmlidXRlc1RvQnVmZmVyKGUpLGUucHVz aE9wZW5pbmdUYWcoKX0sYWZ0ZXJSZW5kZXI6ZnVuY3Rpb24oZSl7ZS5wdXNo Q2xvc2luZ1RhZygpfSxhcHBseUF0dHJpYnV0ZXNUb0J1ZmZlcjpmdW5jdGlv bihlKXt2YXIgdD1uKHRoaXMsImNsYXNzTmFtZUJpbmRpbmdzIik7dC5sZW5n dGgmJnRoaXMuX2FwcGx5Q2xhc3NOYW1lQmluZGluZ3ModCk7dmFyIHI9bih0 aGlzLCJhdHRyaWJ1dGVCaW5kaW5ncyIpO3IubGVuZ3RoJiZ0aGlzLl9hcHBs eUF0dHJpYnV0ZUJpbmRpbmdzKGUsciksZS5zZXRDbGFzc2VzKHRoaXMuY2xh c3NOYW1lcyksZS5pZCh0aGlzLmVsZW1lbnRJZCk7dmFyIGk9bih0aGlzLCJh cmlhUm9sZSIpO2kmJmUuYXR0cigicm9sZSIsaSksbih0aGlzLCJpc1Zpc2li bGUiKT09PSExJiZlLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpfSx0YWdOYW1l Om51bGwsYXJpYVJvbGU6bnVsbCxjbGFzc05hbWVzOlsiZW1iZXItdmlldyJd LGNsYXNzTmFtZUJpbmRpbmdzOm0sYXR0cmlidXRlQmluZGluZ3M6bSxpbml0 OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50SWQ9dGhpcy5lbGVtZW50SWR8fG8o dGhpcyksdGhpcy5fc3VwZXIoKSx0aGlzLl9jaGlsZFZpZXdzPXRoaXMuX2No aWxkVmlld3Muc2xpY2UoKSx0aGlzLmNsYXNzTmFtZUJpbmRpbmdzPUVtYmVy LkEodGhpcy5jbGFzc05hbWVCaW5kaW5ncy5zbGljZSgpKSx0aGlzLmNsYXNz TmFtZXM9RW1iZXIuQSh0aGlzLmNsYXNzTmFtZXMuc2xpY2UoKSl9LGFwcGVu ZENoaWxkOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuY3VycmVudFN0YXRl LmFwcGVuZENoaWxkKHRoaXMsZSx0KX0scmVtb3ZlQ2hpbGQ6ZnVuY3Rpb24o ZSl7aWYoIXRoaXMuaXNEZXN0cm95aW5nKXtpKGUsIl9wYXJlbnRWaWV3Iixu dWxsKTt2YXIgdD10aGlzLl9jaGlsZFZpZXdzO3JldHVybiBFbWJlci5FbnVt ZXJhYmxlVXRpbHMucmVtb3ZlT2JqZWN0KHQsZSksdGhpcy5wcm9wZXJ0eURp ZENoYW5nZSgiY2hpbGRWaWV3cyIpLHRoaXN9fSxyZW1vdmVBbGxDaGlsZHJl bjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGF0ZUNoaWxkVmlld3MoZnVu Y3Rpb24oZSx0KXtlLnJlbW92ZUNoaWxkKHQpfSl9LGRlc3Ryb3lBbGxDaGls ZHJlbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGF0ZUNoaWxkVmlld3Mo ZnVuY3Rpb24oZSx0KXt0LmRlc3Ryb3koKX0pfSxyZW1vdmVGcm9tUGFyZW50 OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fcGFyZW50VmlldztyZXR1cm4gdGhp cy5yZW1vdmUoKSxlJiZlLnJlbW92ZUNoaWxkKHRoaXMpLHRoaXN9LGRlc3Ry b3k6ZnVuY3Rpb24oKXt2YXIgZSx0LHI9dGhpcy5fY2hpbGRWaWV3cyxpPW4o dGhpcywicGFyZW50VmlldyIpLG89dGhpcy52aWV3TmFtZTtpZih0aGlzLl9z dXBlcigpKXtmb3IoZT1yLmxlbmd0aCx0PWUtMTt0Pj0wO3QtLSlyW3RdLnJl bW92ZWRGcm9tRE9NPSEwO2ZvcihvJiZpJiZpLnNldChvLG51bGwpLGU9ci5s ZW5ndGgsdD1lLTE7dD49MDt0LS0pclt0XS5kZXN0cm95KCk7cmV0dXJuIHRo aXN9fSxjcmVhdGVDaGlsZFZpZXc6ZnVuY3Rpb24oZSx0KXtpZighZSl0aHJv dyBuZXcgVHlwZUVycm9yKCJjcmVhdGVDaGlsZFZpZXdzIGZpcnN0IGFyZ3Vt ZW50IG11c3QgZXhpc3QiKTtpZihlLmlzVmlldyYmZS5fcGFyZW50Vmlldz09 PXRoaXMmJmUuY29udGFpbmVyPT09dGhpcy5jb250YWluZXIpcmV0dXJuIGU7 aWYodD10fHx7fSx0Ll9wYXJlbnRWaWV3PXRoaXMsRW1iZXIuQ29yZVZpZXcu ZGV0ZWN0KGUpKXQudGVtcGxhdGVEYXRhPXQudGVtcGxhdGVEYXRhfHxuKHRo aXMsInRlbXBsYXRlRGF0YSIpLHQuY29udGFpbmVyPXRoaXMuY29udGFpbmVy LGU9ZS5jcmVhdGUodCksZS52aWV3TmFtZSYmaShuKHRoaXMsImNvbmNyZXRl VmlldyIpLGUudmlld05hbWUsZSk7ZWxzZSBpZigic3RyaW5nIj09dHlwZW9m IGUpe3ZhciByPSJ2aWV3OiIrZSxvPXRoaXMuY29udGFpbmVyLmxvb2t1cEZh Y3Rvcnkocik7dC50ZW1wbGF0ZURhdGE9bih0aGlzLCJ0ZW1wbGF0ZURhdGEi KSxlPW8uY3JlYXRlKHQpfWVsc2UgdC5jb250YWluZXI9dGhpcy5jb250YWlu ZXIsbihlLCJ0ZW1wbGF0ZURhdGEiKXx8KHQudGVtcGxhdGVEYXRhPW4odGhp cywidGVtcGxhdGVEYXRhIikpLEVtYmVyLnNldFByb3BlcnRpZXMoZSx0KTty ZXR1cm4gZX0sYmVjYW1lVmlzaWJsZTpFbWJlci5LLGJlY2FtZUhpZGRlbjpF bWJlci5LLF9pc1Zpc2libGVEaWRDaGFuZ2U6RW1iZXIub2JzZXJ2ZXIoImlz VmlzaWJsZSIsZnVuY3Rpb24oKXt0aGlzLl9pc1Zpc2libGUhPT1uKHRoaXMs ImlzVmlzaWJsZSIpJiZFbWJlci5ydW4uc2NoZWR1bGVPbmNlKCJyZW5kZXIi LHRoaXMsdGhpcy5fdG9nZ2xlVmlzaWJpbGl0eSl9KSxfdG9nZ2xlVmlzaWJp bGl0eTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuJCgpO2lmKGUpe3ZhciB0PW4o dGhpcywiaXNWaXNpYmxlIik7dGhpcy5faXNWaXNpYmxlIT09dCYmKGUudG9n Z2xlKHQpLHRoaXMuX2lzVmlzaWJsZT10LHRoaXMuX2lzQW5jZXN0b3JIaWRk ZW4oKXx8KHQ/dGhpcy5fbm90aWZ5QmVjYW1lVmlzaWJsZSgpOnRoaXMuX25v dGlmeUJlY2FtZUhpZGRlbigpKSl9fSxfbm90aWZ5QmVjYW1lVmlzaWJsZTpm dW5jdGlvbigpe3RoaXMudHJpZ2dlcigiYmVjYW1lVmlzaWJsZSIpLHRoaXMu Zm9yRWFjaENoaWxkVmlldyhmdW5jdGlvbihlKXt2YXIgdD1uKGUsImlzVmlz aWJsZSIpOyh0fHxudWxsPT09dCkmJmUuX25vdGlmeUJlY2FtZVZpc2libGUo KX0pfSxfbm90aWZ5QmVjYW1lSGlkZGVuOmZ1bmN0aW9uKCl7dGhpcy50cmln Z2VyKCJiZWNhbWVIaWRkZW4iKSx0aGlzLmZvckVhY2hDaGlsZFZpZXcoZnVu Y3Rpb24oZSl7dmFyIHQ9bihlLCJpc1Zpc2libGUiKTsodHx8bnVsbD09PXQp JiZlLl9ub3RpZnlCZWNhbWVIaWRkZW4oKX0pfSxfaXNBbmNlc3RvckhpZGRl bjpmdW5jdGlvbigpe2Zvcih2YXIgZT1uKHRoaXMsInBhcmVudFZpZXciKTtl Oyl7aWYobihlLCJpc1Zpc2libGUiKT09PSExKXJldHVybiEwO2U9bihlLCJw YXJlbnRWaWV3Iil9cmV0dXJuITF9LGNsZWFyQnVmZmVyOmZ1bmN0aW9uKCl7 dGhpcy5pbnZva2VSZWN1cnNpdmVseShlKX0sdHJhbnNpdGlvblRvOmZ1bmN0 aW9uKGUsdCl7dmFyIHI9dGhpcy5jdXJyZW50U3RhdGUsbj10aGlzLmN1cnJl bnRTdGF0ZT10aGlzLnN0YXRlc1tlXTt0aGlzLnN0YXRlPWUsciYmci5leGl0 JiZyLmV4aXQodGhpcyksbi5lbnRlciYmbi5lbnRlcih0aGlzKSwiaW5ET00i PT09ZSYmZGVsZXRlIEVtYmVyLm1ldGEodGhpcykuY2FjaGUuZWxlbWVudCx0 IT09ITEmJnRoaXMuZm9yRWFjaENoaWxkVmlldyhmdW5jdGlvbih0KXt0LnRy YW5zaXRpb25UbyhlKX0pfSxoYW5kbGVFdmVudDpmdW5jdGlvbihlLHQpe3Jl dHVybiB0aGlzLmN1cnJlbnRTdGF0ZS5oYW5kbGVFdmVudCh0aGlzLGUsdCl9 LHJlZ2lzdGVyT2JzZXJ2ZXI6ZnVuY3Rpb24oZSx0LHIsbil7aWYobnx8ImZ1 bmN0aW9uIiE9dHlwZW9mIHJ8fChuPXIscj1udWxsKSxlJiYib2JqZWN0Ij09 dHlwZW9mIGUpe3ZhciBpPXRoaXMsbz1mdW5jdGlvbigpe2kuY3VycmVudFN0 YXRlLmludm9rZU9ic2VydmVyKHRoaXMsbil9LGE9ZnVuY3Rpb24oKXtFbWJl ci5ydW4uc2NoZWR1bGVPbmNlKCJyZW5kZXIiLHRoaXMsbyl9O0VtYmVyLmFk ZE9ic2VydmVyKGUsdCxyLGEpLHRoaXMub25lKCJ3aWxsQ2xlYXJSZW5kZXIi LGZ1bmN0aW9uKCl7RW1iZXIucmVtb3ZlT2JzZXJ2ZXIoZSx0LHIsYSl9KX19 fSk7dmFyIHA9e3ByZXBlbmQ6ZnVuY3Rpb24oZSxyKXtlLiQoKS5wcmVwZW5k KHIpLHQoKX0sYWZ0ZXI6ZnVuY3Rpb24oZSxyKXtlLiQoKS5hZnRlcihyKSx0 KCl9LGh0bWw6ZnVuY3Rpb24oZSxyKXtlLiQoKS5odG1sKHIpLHQoKX0scmVw bGFjZTpmdW5jdGlvbihlKXt2YXIgcj1uKGUsImVsZW1lbnQiKTtpKGUsImVs ZW1lbnQiLG51bGwpLGUuX2luc2VydEVsZW1lbnRMYXRlcihmdW5jdGlvbigp e0VtYmVyLiQocikucmVwbGFjZVdpdGgobihlLCJlbGVtZW50IikpLHQoKX0p fSxyZW1vdmU6ZnVuY3Rpb24oZSl7ZS4kKCkucmVtb3ZlKCksdCgpfSxlbXB0 eTpmdW5jdGlvbihlKXtlLiQoKS5lbXB0eSgpLHQoKX19O0VtYmVyLlZpZXcu cmVvcGVuKHtkb21NYW5hZ2VyOnB9KSxFbWJlci5WaWV3LnJlb3BlbkNsYXNz KHtfcGFyc2VQcm9wZXJ0eVBhdGg6ZnVuY3Rpb24oZSl7dmFyIHQscixuPWUu c3BsaXQoIjoiKSxpPW5bMF0sbz0iIjtyZXR1cm4gbi5sZW5ndGg+MSYmKHQ9 blsxXSwzPT09bi5sZW5ndGgmJihyPW5bMl0pLG89IjoiK3QsciYmKG8rPSI6 IityKSkse3BhdGg6aSxjbGFzc05hbWVzOm8sY2xhc3NOYW1lOiIiPT09dD92 b2lkIDA6dCxmYWxzeUNsYXNzTmFtZTpyfX0sX2NsYXNzU3RyaW5nRm9yVmFs dWU6ZnVuY3Rpb24oZSx0LHIsbil7aWYocnx8bilyZXR1cm4gciYmdD9yOm4m JiF0P246bnVsbDtpZih0PT09ITApe3ZhciBpPWUuc3BsaXQoIi4iKTtyZXR1 cm4gRW1iZXIuU3RyaW5nLmRhc2hlcml6ZShpW2kubGVuZ3RoLTFdKX1yZXR1 cm4gdCE9PSExJiZudWxsIT10P3Q6bnVsbH19KTt2YXIgZj1FbWJlci5PYmpl Y3QuZXh0ZW5kKEVtYmVyLkV2ZW50ZWQpLmNyZWF0ZSgpO0VtYmVyLlZpZXcu YWRkTXV0YXRpb25MaXN0ZW5lcj1mdW5jdGlvbihlKXtmLm9uKCJjaGFuZ2Ui LGUpfSxFbWJlci5WaWV3LnJlbW92ZU11dGF0aW9uTGlzdGVuZXI9ZnVuY3Rp b24oZSl7Zi5vZmYoImNoYW5nZSIsZSl9LEVtYmVyLlZpZXcubm90aWZ5TXV0 YXRpb25MaXN0ZW5lcnM9ZnVuY3Rpb24oKXtmLnRyaWdnZXIoImNoYW5nZSIp fSxFbWJlci5WaWV3LnZpZXdzPXt9LEVtYmVyLlZpZXcuY2hpbGRWaWV3c1By b3BlcnR5PWMsRW1iZXIuVmlldy5hcHBseUF0dHJpYnV0ZUJpbmRpbmdzPWZ1 bmN0aW9uKGUsdCxyKXt2YXIgbj1FbWJlci50eXBlT2Yocik7InZhbHVlIj09 PXR8fCJzdHJpbmciIT09biYmKCJudW1iZXIiIT09bnx8aXNOYU4ocikpPyJ2 YWx1ZSI9PT10fHwiYm9vbGVhbiI9PT1uP0VtYmVyLmlzTm9uZShyKXx8cj09 PSExPyhlLnJlbW92ZUF0dHIodCksZS5wcm9wKHQsIiIpKTpyIT09ZS5wcm9w KHQpJiZlLnByb3AodCxyKTpyfHxlLnJlbW92ZUF0dHIodCk6ciE9PWUuYXR0 cih0KSYmZS5hdHRyKHQscil9LEVtYmVyLlZpZXcuc3RhdGVzPXJ9KCksZnVu Y3Rpb24oKXt2YXIgZT0oRW1iZXIuZ2V0LEVtYmVyLnNldCk7RW1iZXIuVmll dy5zdGF0ZXMuX2RlZmF1bHQ9e2FwcGVuZENoaWxkOmZ1bmN0aW9uKCl7dGhy b3ciWW91IGNhbid0IHVzZSBhcHBlbmRDaGlsZCBvdXRzaWRlIG9mIHRoZSBy ZW5kZXJpbmcgcHJvY2VzcyJ9LCQ6ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAw fSxnZXRFbGVtZW50OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LGhhbmRsZUV2 ZW50OmZ1bmN0aW9uKCl7cmV0dXJuITB9LGRlc3Ryb3lFbGVtZW50OmZ1bmN0 aW9uKHQpe3JldHVybiBlKHQsImVsZW1lbnQiLG51bGwpLHQuX3NjaGVkdWxl ZEluc2VydCYmKEVtYmVyLnJ1bi5jYW5jZWwodC5fc2NoZWR1bGVkSW5zZXJ0 KSx0Ll9zY2hlZHVsZWRJbnNlcnQ9bnVsbCksdH0scmVuZGVyVG9CdWZmZXJJ Zk5lZWRlZDpmdW5jdGlvbigpe3JldHVybiExfSxyZXJlbmRlcjpFbWJlci5L LGludm9rZU9ic2VydmVyOkVtYmVyLkt9fSgpLGZ1bmN0aW9uKCl7dmFyIGU9 RW1iZXIuVmlldy5zdGF0ZXMucHJlUmVuZGVyPUVtYmVyLmNyZWF0ZShFbWJl ci5WaWV3LnN0YXRlcy5fZGVmYXVsdCk7RW1iZXIubWVyZ2UoZSx7aW5zZXJ0 RWxlbWVudDpmdW5jdGlvbihlLHQpe2UuY3JlYXRlRWxlbWVudCgpO3ZhciBy PWUudmlld0hpZXJhcmNoeUNvbGxlY3Rpb24oKTtyLnRyaWdnZXIoIndpbGxJ bnNlcnRFbGVtZW50IiksdC5jYWxsKGUpO3ZhciBuPWUuZ2V0KCJlbGVtZW50 Iik7ZG9jdW1lbnQuYm9keS5jb250YWlucyhuKSYmKHIudHJhbnNpdGlvblRv KCJpbkRPTSIsITEpLHIudHJpZ2dlcigiZGlkSW5zZXJ0RWxlbWVudCIpKX0s cmVuZGVyVG9CdWZmZXJJZk5lZWRlZDpmdW5jdGlvbihlLHQpe3JldHVybiBl LnJlbmRlclRvQnVmZmVyKHQpLCEwfSxlbXB0eTpFbWJlci5LLHNldEVsZW1l bnQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbnVsbCE9PXQmJmUudHJhbnNpdGlv blRvKCJoYXNFbGVtZW50IiksdH19KX0oKSxmdW5jdGlvbigpe3ZhciBlPShF bWJlci5nZXQsRW1iZXIuc2V0LEVtYmVyLlZpZXcuc3RhdGVzLmluQnVmZmVy PUVtYmVyLmNyZWF0ZShFbWJlci5WaWV3LnN0YXRlcy5fZGVmYXVsdCkpO0Vt YmVyLm1lcmdlKGUseyQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVyZW5kZXIo KSxFbWJlci4kKCl9LHJlcmVuZGVyOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVt YmVyLkVycm9yKCJTb21ldGhpbmcgeW91IGRpZCBjYXVzZWQgYSB2aWV3IHRv IHJlLXJlbmRlciBhZnRlciBpdCByZW5kZXJlZCBidXQgYmVmb3JlIGl0IHdh cyBpbnNlcnRlZCBpbnRvIHRoZSBET00uIil9LGFwcGVuZENoaWxkOmZ1bmN0 aW9uKGUsdCxyKXt2YXIgbj1lLmJ1ZmZlcixpPWUuX2NoaWxkVmlld3M7cmV0 dXJuIHQ9ZS5jcmVhdGVDaGlsZFZpZXcodCxyKSxpLmxlbmd0aHx8KGk9ZS5f Y2hpbGRWaWV3cz1pLnNsaWNlKCkpLGkucHVzaCh0KSx0LnJlbmRlclRvQnVm ZmVyKG4pLGUucHJvcGVydHlEaWRDaGFuZ2UoImNoaWxkVmlld3MiKSx0fSxk ZXN0cm95RWxlbWVudDpmdW5jdGlvbihlKXtlLmNsZWFyQnVmZmVyKCk7dmFy IHQ9ZS5fbm90aWZ5V2lsbERlc3Ryb3lFbGVtZW50KCk7cmV0dXJuIHQudHJh bnNpdGlvblRvKCJwcmVSZW5kZXIiLCExKSxlfSxlbXB0eTpmdW5jdGlvbigp e30scmVuZGVyVG9CdWZmZXJJZk5lZWRlZDpmdW5jdGlvbigpe3JldHVybiEx fSxpbnNlcnRFbGVtZW50OmZ1bmN0aW9uKCl7dGhyb3ciWW91IGNhbid0IGlu c2VydCBhbiBlbGVtZW50IHRoYXQgaGFzIGFscmVhZHkgYmVlbiByZW5kZXJl ZCJ9LHNldEVsZW1lbnQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbnVsbD09PXQ/ ZS50cmFuc2l0aW9uVG8oInByZVJlbmRlciIpOihlLmNsZWFyQnVmZmVyKCks ZS50cmFuc2l0aW9uVG8oImhhc0VsZW1lbnQiKSksdH0saW52b2tlT2JzZXJ2 ZXI6ZnVuY3Rpb24oZSx0KXt0LmNhbGwoZSl9fSl9KCksZnVuY3Rpb24oKXt2 YXIgZT1FbWJlci5nZXQsdD1FbWJlci5zZXQscj1FbWJlci5WaWV3LnN0YXRl cy5oYXNFbGVtZW50PUVtYmVyLmNyZWF0ZShFbWJlci5WaWV3LnN0YXRlcy5f ZGVmYXVsdCk7RW1iZXIubWVyZ2Uocix7JDpmdW5jdGlvbih0LHIpe3ZhciBu PWUodCwiZWxlbWVudCIpO3JldHVybiByP0VtYmVyLiQocixuKTpFbWJlci4k KG4pfSxnZXRFbGVtZW50OmZ1bmN0aW9uKHQpe3ZhciByPWUodCwicGFyZW50 VmlldyIpO3JldHVybiByJiYocj1lKHIsImVsZW1lbnQiKSkscj90LmZpbmRF bGVtZW50SW5QYXJlbnRFbGVtZW50KHIpOkVtYmVyLiQoIiMiK2UodCwiZWxl bWVudElkIikpWzBdfSxzZXRFbGVtZW50OmZ1bmN0aW9uKGUsdCl7aWYobnVs bCE9PXQpdGhyb3ciWW91IGNhbm5vdCBzZXQgYW4gZWxlbWVudCB0byBhIG5v bi1udWxsIHZhbHVlIHdoZW4gdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBpbiB0 aGUgRE9NLiI7cmV0dXJuIGUudHJhbnNpdGlvblRvKCJwcmVSZW5kZXIiKSx0 fSxyZXJlbmRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZS50cmlnZ2VyUmVjdXJz aXZlbHkoIndpbGxDbGVhclJlbmRlciIpLGUuY2xlYXJSZW5kZXJlZENoaWxk cmVuKCksZS5kb21NYW5hZ2VyLnJlcGxhY2UoZSksZX0sZGVzdHJveUVsZW1l bnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuX25vdGlmeVdpbGxEZXN0cm95RWxl bWVudCgpLGUuZG9tTWFuYWdlci5yZW1vdmUoZSksdChlLCJlbGVtZW50Iixu dWxsKSxlLl9zY2hlZHVsZWRJbnNlcnQmJihFbWJlci5ydW4uY2FuY2VsKGUu X3NjaGVkdWxlZEluc2VydCksZS5fc2NoZWR1bGVkSW5zZXJ0PW51bGwpLGV9 LGVtcHR5OmZ1bmN0aW9uKGUpe3ZhciB0LHIsbj1lLl9jaGlsZFZpZXdzO2lm KG4pZm9yKHQ9bi5sZW5ndGgscj0wO3Q+cjtyKyspbltyXS5fbm90aWZ5V2ls bERlc3Ryb3lFbGVtZW50KCk7ZS5kb21NYW5hZ2VyLmVtcHR5KGUpfSxoYW5k bGVFdmVudDpmdW5jdGlvbihlLHQscil7cmV0dXJuIGUuaGFzKHQpP2UudHJp Z2dlcih0LHIpOiEwfSxpbnZva2VPYnNlcnZlcjpmdW5jdGlvbihlLHQpe3Qu Y2FsbChlKX19KX0oKSxmdW5jdGlvbigpe3ZhciBlPUVtYmVyLlZpZXcuc3Rh dGVzLmhhc0VsZW1lbnQsdD1FbWJlci5WaWV3LnN0YXRlcy5pbkRPTT1FbWJl ci5jcmVhdGUoZSk7RW1iZXIubWVyZ2UodCx7ZW50ZXI6ZnVuY3Rpb24oZSl7 ZS5pc1ZpcnR1YWx8fChFbWJlci5WaWV3LnZpZXdzW2UuZWxlbWVudElkXT1l KSxlLmFkZEJlZm9yZU9ic2VydmVyKCJlbGVtZW50SWQiLGZ1bmN0aW9uKCl7 dGhyb3cgbmV3IEVtYmVyLkVycm9yKCJDaGFuZ2luZyBhIHZpZXcncyBlbGVt ZW50SWQgYWZ0ZXIgY3JlYXRpb24gaXMgbm90IGFsbG93ZWQiKX0pfSxleGl0 OmZ1bmN0aW9uKGUpe3RoaXMuaXNWaXJ0dWFsfHxkZWxldGUgRW1iZXIuVmll dy52aWV3c1tlLmVsZW1lbnRJZF19LGluc2VydEVsZW1lbnQ6ZnVuY3Rpb24o KXt0aHJvdyJZb3UgY2FuJ3QgaW5zZXJ0IGFuIGVsZW1lbnQgaW50byB0aGUg RE9NIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbnNlcnRlZCJ9fSl9KCksZnVu Y3Rpb24oKXt2YXIgZT0iWW91IGNhbid0IGNhbGwgJUAgb24gYSB2aWV3IGJl aW5nIGRlc3Ryb3llZCIsdD1FbWJlci5TdHJpbmcuZm10LHI9RW1iZXIuVmll dy5zdGF0ZXMuZGVzdHJveWluZz1FbWJlci5jcmVhdGUoRW1iZXIuVmlldy5z dGF0ZXMuX2RlZmF1bHQpO0VtYmVyLm1lcmdlKHIse2FwcGVuZENoaWxkOmZ1 bmN0aW9uKCl7dGhyb3cgdChlLFsiYXBwZW5kQ2hpbGQiXSl9LHJlcmVuZGVy OmZ1bmN0aW9uKCl7dGhyb3cgdChlLFsicmVyZW5kZXIiXSl9LGRlc3Ryb3lF bGVtZW50OmZ1bmN0aW9uKCl7dGhyb3cgdChlLFsiZGVzdHJveUVsZW1lbnQi XSl9LGVtcHR5OmZ1bmN0aW9uKCl7dGhyb3cgdChlLFsiZW1wdHkiXSl9LHNl dEVsZW1lbnQ6ZnVuY3Rpb24oKXt0aHJvdyB0KGUsWyJzZXQoJ2VsZW1lbnQn LCAuLi4pIl0pfSxyZW5kZXJUb0J1ZmZlcklmTmVlZGVkOmZ1bmN0aW9uKCl7 cmV0dXJuITF9LGluc2VydEVsZW1lbnQ6RW1iZXIuS30pfSgpLGZ1bmN0aW9u KCl7RW1iZXIuVmlldy5jbG9uZVN0YXRlcz1mdW5jdGlvbihlKXt2YXIgdD17 fTt0Ll9kZWZhdWx0PXt9LHQucHJlUmVuZGVyPUVtYmVyLmNyZWF0ZSh0Ll9k ZWZhdWx0KSx0LmRlc3Ryb3lpbmc9RW1iZXIuY3JlYXRlKHQuX2RlZmF1bHQp LHQuaW5CdWZmZXI9RW1iZXIuY3JlYXRlKHQuX2RlZmF1bHQpLHQuaGFzRWxl bWVudD1FbWJlci5jcmVhdGUodC5fZGVmYXVsdCksdC5pbkRPTT1FbWJlci5j cmVhdGUodC5oYXNFbGVtZW50KTtmb3IodmFyIHIgaW4gZSllLmhhc093blBy b3BlcnR5KHIpJiZFbWJlci5tZXJnZSh0W3JdLGVbcl0pO3JldHVybiB0fX0o KSxmdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0LHIsbil7dC50cmlnZ2VyUmVj dXJzaXZlbHkoIndpbGxJbnNlcnRFbGVtZW50Iikscj9yLmRvbU1hbmFnZXIu YWZ0ZXIocixuLnN0cmluZygpKTplLmRvbU1hbmFnZXIucHJlcGVuZChlLG4u c3RyaW5nKCkpLHQuZm9yRWFjaChmdW5jdGlvbihlKXtlLnRyYW5zaXRpb25U bygiaW5ET00iKSxlLnByb3BlcnR5RGlkQ2hhbmdlKCJlbGVtZW50IiksZS50 cmlnZ2VyUmVjdXJzaXZlbHkoImRpZEluc2VydEVsZW1lbnQiKX0pfXZhciB0 PUVtYmVyLlZpZXcuY2xvbmVTdGF0ZXMoRW1iZXIuVmlldy5zdGF0ZXMpLHI9 RW1iZXIuZ2V0LG49RW1iZXIuc2V0LGk9RW1iZXIuRW51bWVyYWJsZVV0aWxz LmZvckVhY2gsbz1FbWJlci5fVmlld0NvbGxlY3Rpb247RW1iZXIuQ29udGFp bmVyVmlldz1FbWJlci5WaWV3LmV4dGVuZChFbWJlci5NdXRhYmxlQXJyYXks e3N0YXRlczp0LGluaXQ6ZnVuY3Rpb24oKXt0aGlzLl9zdXBlcigpO3ZhciBl PXIodGhpcywiY2hpbGRWaWV3cyIpO0VtYmVyLmRlZmluZVByb3BlcnR5KHRo aXMsImNoaWxkVmlld3MiLEVtYmVyLlZpZXcuY2hpbGRWaWV3c1Byb3BlcnR5 KTt2YXIgdD10aGlzLl9jaGlsZFZpZXdzO2koZSxmdW5jdGlvbihlLGkpe3Zh ciBvOyJzdHJpbmciPT10eXBlb2YgZT8obz1yKHRoaXMsZSksbz10aGlzLmNy ZWF0ZUNoaWxkVmlldyhvKSxuKHRoaXMsZSxvKSk6bz10aGlzLmNyZWF0ZUNo aWxkVmlldyhlKSx0W2ldPW99LHRoaXMpO3ZhciBvPXIodGhpcywiY3VycmVu dFZpZXciKTtvJiYodC5sZW5ndGh8fCh0PXRoaXMuX2NoaWxkVmlld3M9dGhp cy5fY2hpbGRWaWV3cy5zbGljZSgpKSx0LnB1c2godGhpcy5jcmVhdGVDaGls ZFZpZXcobykpKX0scmVwbGFjZTpmdW5jdGlvbihlLHQsbil7dmFyIGk9bj9y KG4sImxlbmd0aCIpOjA7aWYodGhpcy5hcnJheUNvbnRlbnRXaWxsQ2hhbmdl KGUsdCxpKSx0aGlzLmNoaWxkVmlld3NXaWxsQ2hhbmdlKHRoaXMuX2NoaWxk Vmlld3MsZSx0KSwwPT09aSl0aGlzLl9jaGlsZFZpZXdzLnNwbGljZShlLHQp O2Vsc2V7dmFyIG89W2UsdF0uY29uY2F0KG4pO24ubGVuZ3RoJiYhdGhpcy5f Y2hpbGRWaWV3cy5sZW5ndGgmJih0aGlzLl9jaGlsZFZpZXdzPXRoaXMuX2No aWxkVmlld3Muc2xpY2UoKSksdGhpcy5fY2hpbGRWaWV3cy5zcGxpY2UuYXBw bHkodGhpcy5fY2hpbGRWaWV3cyxvKX1yZXR1cm4gdGhpcy5hcnJheUNvbnRl bnREaWRDaGFuZ2UoZSx0LGkpLHRoaXMuY2hpbGRWaWV3c0RpZENoYW5nZSh0 aGlzLl9jaGlsZFZpZXdzLGUsdCxpKSx0aGlzfSxvYmplY3RBdDpmdW5jdGlv bihlKXtyZXR1cm4gdGhpcy5fY2hpbGRWaWV3c1tlXX0sbGVuZ3RoOkVtYmVy LmNvbXB1dGVkKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NoaWxkVmlld3Mu bGVuZ3RofSkudm9sYXRpbGUoKSxyZW5kZXI6ZnVuY3Rpb24oZSl7dGhpcy5m b3JFYWNoQ2hpbGRWaWV3KGZ1bmN0aW9uKHQpe3QucmVuZGVyVG9CdWZmZXIo ZSl9KX0saW5zdHJ1bWVudE5hbWU6ImNvbnRhaW5lciIsY2hpbGRWaWV3c1dp bGxDaGFuZ2U6ZnVuY3Rpb24oZSx0LHIpe2lmKHRoaXMucHJvcGVydHlXaWxs Q2hhbmdlKCJjaGlsZFZpZXdzIikscj4wKXt2YXIgbj1lLnNsaWNlKHQsdCty KTt0aGlzLmN1cnJlbnRTdGF0ZS5jaGlsZFZpZXdzV2lsbENoYW5nZSh0aGlz LGUsdCxyKSx0aGlzLmluaXRpYWxpemVWaWV3cyhuLG51bGwsbnVsbCl9fSxy ZW1vdmVDaGlsZDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZW1vdmVPYmpl Y3QoZSksdGhpc30sY2hpbGRWaWV3c0RpZENoYW5nZTpmdW5jdGlvbihlLHQs bixpKXtpZihpPjApe3ZhciBvPWUuc2xpY2UodCx0K2kpO3RoaXMuaW5pdGlh bGl6ZVZpZXdzKG8sdGhpcyxyKHRoaXMsInRlbXBsYXRlRGF0YSIpKSx0aGlz LmN1cnJlbnRTdGF0ZS5jaGlsZFZpZXdzRGlkQ2hhbmdlKHRoaXMsZSx0LGkp fXRoaXMucHJvcGVydHlEaWRDaGFuZ2UoImNoaWxkVmlld3MiKX0saW5pdGlh bGl6ZVZpZXdzOmZ1bmN0aW9uKGUsdCxvKXtpKGUsZnVuY3Rpb24oZSl7bihl LCJfcGFyZW50VmlldyIsdCksIWUuY29udGFpbmVyJiZ0JiZuKGUsImNvbnRh aW5lciIsdC5jb250YWluZXIpLHIoZSwidGVtcGxhdGVEYXRhIil8fG4oZSwi dGVtcGxhdGVEYXRhIixvKX0pfSxjdXJyZW50VmlldzpudWxsLF9jdXJyZW50 Vmlld1dpbGxDaGFuZ2U6RW1iZXIuYmVmb3JlT2JzZXJ2ZXIoImN1cnJlbnRW aWV3IixmdW5jdGlvbigpe3ZhciBlPXIodGhpcywiY3VycmVudFZpZXciKTtl JiZlLmRlc3Ryb3koKX0pLF9jdXJyZW50Vmlld0RpZENoYW5nZTpFbWJlci5v YnNlcnZlcigiY3VycmVudFZpZXciLGZ1bmN0aW9uKCl7dmFyIGU9cih0aGlz LCJjdXJyZW50VmlldyIpO2UmJnRoaXMucHVzaE9iamVjdChlKX0pLF9lbnN1 cmVDaGlsZHJlbkFyZUluRE9NOmZ1bmN0aW9uKCl7dGhpcy5jdXJyZW50U3Rh dGUuZW5zdXJlQ2hpbGRyZW5BcmVJbkRPTSh0aGlzKX19KSxFbWJlci5tZXJn ZSh0Ll9kZWZhdWx0LHtjaGlsZFZpZXdzV2lsbENoYW5nZTpFbWJlci5LLGNo aWxkVmlld3NEaWRDaGFuZ2U6RW1iZXIuSyxlbnN1cmVDaGlsZHJlbkFyZUlu RE9NOkVtYmVyLkt9KSxFbWJlci5tZXJnZSh0LmluQnVmZmVyLHtjaGlsZFZp ZXdzRGlkQ2hhbmdlOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVtYmVyLkVycm9y KCJZb3UgY2Fubm90IG1vZGlmeSBjaGlsZCB2aWV3cyB3aGlsZSBpbiB0aGUg aW5CdWZmZXIgc3RhdGUiKX19KSxFbWJlci5tZXJnZSh0Lmhhc0VsZW1lbnQs e2NoaWxkVmlld3NXaWxsQ2hhbmdlOmZ1bmN0aW9uKGUsdCxyLG4pe2Zvcih2 YXIgaT1yO3Irbj5pO2krKyl0W2ldLnJlbW92ZSgpfSxjaGlsZFZpZXdzRGlk Q2hhbmdlOmZ1bmN0aW9uKGUpe0VtYmVyLnJ1bi5zY2hlZHVsZU9uY2UoInJl bmRlciIsZSwiX2Vuc3VyZUNoaWxkcmVuQXJlSW5ET00iKX0sZW5zdXJlQ2hp bGRyZW5BcmVJbkRPTTpmdW5jdGlvbih0KXt2YXIgcixuLGksYSxzLHU9dC5f Y2hpbGRWaWV3cyxsPW5ldyBvO2ZvcihyPTAsbj11Lmxlbmd0aDtuPnI7cisr KWk9dVtyXSxzfHwocz1FbWJlci5SZW5kZXJCdWZmZXIoKSxzLl9oYXNFbGVt ZW50PSExKSxpLnJlbmRlclRvQnVmZmVySWZOZWVkZWQocyk/bC5wdXNoKGkp OmwubGVuZ3RoPyhlKHQsbCxhLHMpLHM9bnVsbCxhPWksbC5jbGVhcigpKTph PWk7bC5sZW5ndGgmJmUodCxsLGEscyl9fSl9KCksZnVuY3Rpb24oKXt7dmFy IGU9RW1iZXIuZ2V0LHQ9RW1iZXIuc2V0O0VtYmVyLlN0cmluZy5mbXR9RW1i ZXIuQ29sbGVjdGlvblZpZXc9RW1iZXIuQ29udGFpbmVyVmlldy5leHRlbmQo e2NvbnRlbnQ6bnVsbCxlbXB0eVZpZXdDbGFzczpFbWJlci5WaWV3LGVtcHR5 VmlldzpudWxsLGl0ZW1WaWV3Q2xhc3M6RW1iZXIuVmlldyxpbml0OmZ1bmN0 aW9uKCl7dmFyIGU9dGhpcy5fc3VwZXIoKTtyZXR1cm4gdGhpcy5fY29udGVu dERpZENoYW5nZSgpLGV9LF9jb250ZW50V2lsbENoYW5nZTpFbWJlci5iZWZv cmVPYnNlcnZlcigiY29udGVudCIsZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdl dCgiY29udGVudCIpO3QmJnQucmVtb3ZlQXJyYXlPYnNlcnZlcih0aGlzKTt2 YXIgcj10P2UodCwibGVuZ3RoIik6MDt0aGlzLmFycmF5V2lsbENoYW5nZSh0 LDAscil9KSxfY29udGVudERpZENoYW5nZTpFbWJlci5vYnNlcnZlcigiY29u dGVudCIsZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMsImNvbnRlbnQiKTt0JiYo dGhpcy5fYXNzZXJ0QXJyYXlMaWtlKHQpLHQuYWRkQXJyYXlPYnNlcnZlcih0 aGlzKSk7dmFyIHI9dD9lKHQsImxlbmd0aCIpOjA7dGhpcy5hcnJheURpZENo YW5nZSh0LDAsbnVsbCxyKX0pLF9hc3NlcnRBcnJheUxpa2U6ZnVuY3Rpb24o KXt9LGRlc3Ryb3k6ZnVuY3Rpb24oKXtpZih0aGlzLl9zdXBlcigpKXt2YXIg dD1lKHRoaXMsImNvbnRlbnQiKTtyZXR1cm4gdCYmdC5yZW1vdmVBcnJheU9i c2VydmVyKHRoaXMpLHRoaXMuX2NyZWF0ZWRFbXB0eVZpZXcmJnRoaXMuX2Ny ZWF0ZWRFbXB0eVZpZXcuZGVzdHJveSgpLHRoaXN9fSxhcnJheVdpbGxDaGFu Z2U6ZnVuY3Rpb24odCxyLG4pe3ZhciBpPWUodGhpcywiZW1wdHlWaWV3Iik7 aSYmaSBpbnN0YW5jZW9mIEVtYmVyLlZpZXcmJmkucmVtb3ZlRnJvbVBhcmVu dCgpO3ZhciBvLGEscyx1PXRoaXMuX2NoaWxkVmlld3M7cz10aGlzLl9jaGls ZFZpZXdzLmxlbmd0aDt2YXIgbD1uPT09cztmb3IobCYmKHRoaXMuY3VycmVu dFN0YXRlLmVtcHR5KHRoaXMpLHRoaXMuaW52b2tlUmVjdXJzaXZlbHkoZnVu Y3Rpb24oZSl7ZS5yZW1vdmVkRnJvbURPTT0hMH0sITEpKSxhPXIrbi0xO2E+ PXI7YS0tKW89dVthXSxvLmRlc3Ryb3koKX0sYXJyYXlEaWRDaGFuZ2U6ZnVu Y3Rpb24ocixuLGksbyl7dmFyIGEscyx1LGwsYyxoLG09W107aWYobD1yP2Uo ciwibGVuZ3RoIik6MClmb3IoYz1lKHRoaXMsIml0ZW1WaWV3Q2xhc3MiKSwi c3RyaW5nIj09dHlwZW9mIGMmJihjPWUoYyl8fGMpLHU9bjtuK28+dTt1Kysp cz1yLm9iamVjdEF0KHUpLGE9dGhpcy5jcmVhdGVDaGlsZFZpZXcoYyx7Y29u dGVudDpzLGNvbnRlbnRJbmRleDp1fSksbS5wdXNoKGEpO2Vsc2V7aWYoaD1l KHRoaXMsImVtcHR5VmlldyIpLCFoKXJldHVybjsic3RyaW5nIj09dHlwZW9m IGgmJihoPWUoaCl8fGgpLGg9dGhpcy5jcmVhdGVDaGlsZFZpZXcoaCksbS5w dXNoKGgpLHQodGhpcywiZW1wdHlWaWV3IixoKSxFbWJlci5Db3JlVmlldy5k ZXRlY3QoaCkmJih0aGlzLl9jcmVhdGVkRW1wdHlWaWV3PWgpfXRoaXMucmVw bGFjZShuLDAsbSl9LGNyZWF0ZUNoaWxkVmlldzpmdW5jdGlvbihyLG4pe3I9 dGhpcy5fc3VwZXIocixuKTt2YXIgaT1lKHIsInRhZ05hbWUiKTtyZXR1cm4o bnVsbD09PWl8fHZvaWQgMD09PWkpJiYoaT1FbWJlci5Db2xsZWN0aW9uVmll dy5DT05UQUlORVJfTUFQW2UodGhpcywidGFnTmFtZSIpXSx0KHIsInRhZ05h bWUiLGkpKSxyCn19KSxFbWJlci5Db2xsZWN0aW9uVmlldy5DT05UQUlORVJf TUFQPXt1bDoibGkiLG9sOiJsaSIsdGFibGU6InRyIix0aGVhZDoidHIiLHRi b2R5OiJ0ciIsdGZvb3Q6InRyIix0cjoidGQiLHNlbGVjdDoib3B0aW9uIn19 KCksZnVuY3Rpb24oKXtFbWJlci5Db21wb25lbnRUZW1wbGF0ZURlcHJlY2F0 aW9uPUVtYmVyLk1peGluLmNyZWF0ZSh7d2lsbE1lcmdlTWl4aW46ZnVuY3Rp b24oZSl7dGhpcy5fc3VwZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciB0 LHIsbj1lLmxheW91dE5hbWV8fGUubGF5b3V0O2UudGVtcGxhdGVOYW1lJiYh biYmKHQ9InRlbXBsYXRlTmFtZSIscj0ibGF5b3V0TmFtZSIsZS5sYXlvdXRO YW1lPWUudGVtcGxhdGVOYW1lLGRlbGV0ZSBlLnRlbXBsYXRlTmFtZSksZS50 ZW1wbGF0ZSYmIW4mJih0PSJ0ZW1wbGF0ZSIscj0ibGF5b3V0IixlLmxheW91 dD1lLnRlbXBsYXRlLGRlbGV0ZSBlLnRlbXBsYXRlKX19KX0oKSxmdW5jdGlv bigpe3ZhciBlPUVtYmVyLmdldCx0PUVtYmVyLnNldCxyPShFbWJlci5pc05v bmUsQXJyYXkucHJvdG90eXBlLnNsaWNlKTtFbWJlci5Db21wb25lbnQ9RW1i ZXIuVmlldy5leHRlbmQoRW1iZXIuVGFyZ2V0QWN0aW9uU3VwcG9ydCxFbWJl ci5Db21wb25lbnRUZW1wbGF0ZURlcHJlY2F0aW9uLHtpbml0OmZ1bmN0aW9u KCl7dGhpcy5fc3VwZXIoKSx0KHRoaXMsImNvbnRleHQiLHRoaXMpLHQodGhp cywiY29udHJvbGxlciIsdGhpcyl9LGRlZmF1bHRMYXlvdXQ6ZnVuY3Rpb24o ZSx0KXtFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMueWllbGQuY2FsbChlLHQp fSx0ZW1wbGF0ZTpFbWJlci5jb21wdXRlZChmdW5jdGlvbih0LHIpe2lmKHZv aWQgMCE9PXIpcmV0dXJuIHI7dmFyIG49ZSh0aGlzLCJ0ZW1wbGF0ZU5hbWUi KSxpPXRoaXMudGVtcGxhdGVGb3JOYW1lKG4sInRlbXBsYXRlIik7cmV0dXJu IGl8fGUodGhpcywiZGVmYXVsdFRlbXBsYXRlIil9KS5wcm9wZXJ0eSgidGVt cGxhdGVOYW1lIiksdGVtcGxhdGVOYW1lOm51bGwsY2xvbmVLZXl3b3Jkczpm dW5jdGlvbigpe3JldHVybnt2aWV3OnRoaXMsY29udHJvbGxlcjp0aGlzfX0s X3lpZWxkOmZ1bmN0aW9uKHQscil7dmFyIG49ci5kYXRhLnZpZXcsaT10aGlz Ll9wYXJlbnRWaWV3LG89ZSh0aGlzLCJ0ZW1wbGF0ZSIpO28mJm4uYXBwZW5k Q2hpbGQoRW1iZXIuVmlldyx7aXNWaXJ0dWFsOiEwLHRhZ05hbWU6IiIsX2Nv bnRleHRWaWV3OmksdGVtcGxhdGU6byxjb250ZXh0OmUoaSwiY29udGV4dCIp LGNvbnRyb2xsZXI6ZShpLCJjb250cm9sbGVyIiksdGVtcGxhdGVEYXRhOntr ZXl3b3JkczppLmNsb25lS2V5d29yZHMoKX19KX0sdGFyZ2V0T2JqZWN0OkVt YmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzLCJfcGFyZW50 VmlldyIpO3JldHVybiB0P2UodCwiY29udHJvbGxlciIpOm51bGx9KS5wcm9w ZXJ0eSgiX3BhcmVudFZpZXciKSxzZW5kQWN0aW9uOmZ1bmN0aW9uKHQpe3Zh ciBuLGk9ci5jYWxsKGFyZ3VtZW50cywxKTtuPXZvaWQgMD09PXQ/ZSh0aGlz LCJhY3Rpb24iKTplKHRoaXMsdCksdm9pZCAwIT09biYmdGhpcy50cmlnZ2Vy QWN0aW9uKHthY3Rpb246bixhY3Rpb25Db250ZXh0Oml9KX19KX0oKSxmdW5j dGlvbigpe0VtYmVyLlZpZXdUYXJnZXRBY3Rpb25TdXBwb3J0PUVtYmVyLk1p eGluLmNyZWF0ZShFbWJlci5UYXJnZXRBY3Rpb25TdXBwb3J0LHt0YXJnZXQ6 RW1iZXIuY29tcHV0ZWQuYWxpYXMoImNvbnRyb2xsZXIiKSxhY3Rpb25Db250 ZXh0OkVtYmVyLmNvbXB1dGVkLmFsaWFzKCJjb250ZXh0Iil9KX0oKSxmdW5j dGlvbigpe2UoIm1ldGFtb3JwaCIsW10sZnVuY3Rpb24oKXsidXNlIHN0cmlj dCI7Ly8gQ29weXJpZ2h0OiDCqTIwMTQgVGlsZGUsIEluYy4gQWxsIHJpZ2h0 cyByZXNlcnZlZC4KdmFyIGU9ZnVuY3Rpb24oKXt9LHQ9MCxyPWZ1bmN0aW9u KCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBNZXRhbW9ycGhFTlY/TWV0 YW1vcnBoRU5WLkRJU0FCTEVfUkFOR0VfQVBJOiJ1bmRlZmluZWQiIT09RU5W P0VOVi5ESVNBQkxFX1JBTkdFX0FQSTohMX0oKSxuPSFyJiYidW5kZWZpbmVk IiE9dHlwZW9mIGRvY3VtZW50JiYiY3JlYXRlUmFuZ2UiaW4gZG9jdW1lbnQm JiJ1bmRlZmluZWQiIT10eXBlb2YgUmFuZ2UmJlJhbmdlLnByb3RvdHlwZS5j cmVhdGVDb250ZXh0dWFsRnJhZ21lbnQsaT0idW5kZWZpbmVkIiE9dHlwZW9m IGRvY3VtZW50JiZmdW5jdGlvbigpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVs ZW1lbnQoImRpdiIpO3JldHVybiBlLmlubmVySFRNTD0iPGRpdj48L2Rpdj4i LGUuZmlyc3RDaGlsZC5pbm5lckhUTUw9IjxzY3JpcHQ+PC9zY3JpcHQ+Iiwi Ij09PWUuZmlyc3RDaGlsZC5pbm5lckhUTUx9KCksbz1kb2N1bWVudCYmZnVu Y3Rpb24oKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTty ZXR1cm4gZS5pbm5lckhUTUw9IlRlc3Q6IDxzY3JpcHQgdHlwZT0ndGV4dC94 LXBsYWNlaG9sZGVyJz48L3NjcmlwdD5WYWx1ZSIsIlRlc3Q6Ij09PWUuY2hp bGROb2Rlc1swXS5ub2RlVmFsdWUmJiIgVmFsdWUiPT09ZS5jaGlsZE5vZGVz WzJdLm5vZGVWYWx1ZX0oKSxhPWZ1bmN0aW9uKHIpe3ZhciBuO249dGhpcyBp bnN0YW5jZW9mIGE/dGhpczpuZXcgZSxuLmlubmVySFRNTD1yO3ZhciBpPSJt ZXRhbW9ycGgtIit0Kys7cmV0dXJuIG4uc3RhcnQ9aSsiLXN0YXJ0IixuLmVu ZD1pKyItZW5kIixufTtlLnByb3RvdHlwZT1hLnByb3RvdHlwZTt2YXIgcyx1 LGwsYyxoLG0scCxmLGQ7aWYoYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0 YXJ0VGFnKCkrdGhpcy5pbm5lckhUTUwrdGhpcy5lbmRUYWcoKX0sZj1mdW5j dGlvbigpe3JldHVybiI8c2NyaXB0IGlkPSciK3RoaXMuc3RhcnQrIicgdHlw ZT0ndGV4dC94LXBsYWNlaG9sZGVyJz48L3NjcmlwdD4ifSxkPWZ1bmN0aW9u KCl7cmV0dXJuIjxzY3JpcHQgaWQ9JyIrdGhpcy5lbmQrIicgdHlwZT0ndGV4 dC94LXBsYWNlaG9sZGVyJz48L3NjcmlwdD4ifSxuKXM9ZnVuY3Rpb24oZSx0 KXt2YXIgcj1kb2N1bWVudC5jcmVhdGVSYW5nZSgpLG49ZG9jdW1lbnQuZ2V0 RWxlbWVudEJ5SWQoZS5zdGFydCksaT1kb2N1bWVudC5nZXRFbGVtZW50QnlJ ZChlLmVuZCk7cmV0dXJuIHQ/KHIuc2V0U3RhcnRCZWZvcmUobiksci5zZXRF bmRBZnRlcihpKSk6KHIuc2V0U3RhcnRBZnRlcihuKSxyLnNldEVuZEJlZm9y ZShpKSkscn0sdT1mdW5jdGlvbihlLHQpe3ZhciByPXModGhpcyx0KTtyLmRl bGV0ZUNvbnRlbnRzKCk7dmFyIG49ci5jcmVhdGVDb250ZXh0dWFsRnJhZ21l bnQoZSk7ci5pbnNlcnROb2RlKG4pfSxsPWZ1bmN0aW9uKCl7dmFyIGU9cyh0 aGlzLCEwKTtlLmRlbGV0ZUNvbnRlbnRzKCl9LGg9ZnVuY3Rpb24oZSl7dmFy IHQ9ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTt0LnNldFN0YXJ0KGUpLHQuY29s bGFwc2UoITEpO3ZhciByPXQuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHRo aXMub3V0ZXJIVE1MKCkpO2UuYXBwZW5kQ2hpbGQocil9LG09ZnVuY3Rpb24o ZSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKSxyPWRvY3VtZW50Lmdl dEVsZW1lbnRCeUlkKHRoaXMuZW5kKTt0LnNldFN0YXJ0QWZ0ZXIociksdC5z ZXRFbmRBZnRlcihyKTt2YXIgbj10LmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVu dChlKTt0Lmluc2VydE5vZGUobil9LHA9ZnVuY3Rpb24oZSl7dmFyIHQ9ZG9j dW1lbnQuY3JlYXRlUmFuZ2UoKSxyPWRvY3VtZW50LmdldEVsZW1lbnRCeUlk KHRoaXMuc3RhcnQpO3Quc2V0U3RhcnRBZnRlcihyKSx0LnNldEVuZEFmdGVy KHIpO3ZhciBuPXQuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KGUpO3QuaW5z ZXJ0Tm9kZShuKX07ZWxzZXt2YXIgYj17c2VsZWN0OlsxLCI8c2VsZWN0IG11 bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sZmllbGRzZXQ6WzEs IjxmaWVsZHNldD4iLCI8L2ZpZWxkc2V0PiJdLHRhYmxlOlsxLCI8dGFibGU+ IiwiPC90YWJsZT4iXSx0Ym9keTpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Ri b2R5PjwvdGFibGU+Il0sdHI6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwv dHI+PC90Ym9keT48L3RhYmxlPiJdLGNvbGdyb3VwOlsyLCI8dGFibGU+PHRi b2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4i XSxtYXA6WzEsIjxtYXA+IiwiPC9tYXA+Il0sX2RlZmF1bHQ6WzAsIiIsIiJd fSxFPWZ1bmN0aW9uKGUsdCl7aWYoZS5nZXRBdHRyaWJ1dGUoImlkIik9PT10 KXJldHVybiBlO3ZhciByLG4saSxvPWUuY2hpbGROb2Rlcy5sZW5ndGg7Zm9y KHI9MDtvPnI7cisrKWlmKG49ZS5jaGlsZE5vZGVzW3JdLGk9MT09PW4ubm9k ZVR5cGUmJkUobix0KSlyZXR1cm4gaX0sdj1mdW5jdGlvbihlLHQpe3ZhciBy PVtdO2lmKG8mJih0PXQucmVwbGFjZSgvKFxzKykoPHNjcmlwdCBpZD0nKFte J10rKScpL2csZnVuY3Rpb24oZSx0LG4saSl7cmV0dXJuIHIucHVzaChbaSx0 XSksbn0pKSxlLmlubmVySFRNTD10LHIubGVuZ3RoPjApe3ZhciBuLGk9ci5s ZW5ndGg7Zm9yKG49MDtpPm47bisrKXt2YXIgYT1FKGUscltuXVswXSkscz1k b2N1bWVudC5jcmVhdGVUZXh0Tm9kZShyW25dWzFdKTthLnBhcmVudE5vZGUu aW5zZXJ0QmVmb3JlKHMsYSl9fX0sZz1mdW5jdGlvbihlLHQpe3ZhciByPWJb ZS50YWdOYW1lLnRvTG93ZXJDYXNlKCldfHxiLl9kZWZhdWx0LG49clswXSxv PXJbMV0sYT1yWzJdO2kmJih0PSImc2h5OyIrdCk7dmFyIHM9ZG9jdW1lbnQu Y3JlYXRlRWxlbWVudCgiZGl2Iik7dihzLG8rdCthKTtmb3IodmFyIHU9MDtu Pj11O3UrKylzPXMuZmlyc3RDaGlsZDtpZihpKXtmb3IodmFyIGw9czsxPT09 bC5ub2RlVHlwZSYmIWwubm9kZU5hbWU7KWw9bC5maXJzdENoaWxkOzM9PT1s Lm5vZGVUeXBlJiYiwq0iPT09bC5ub2RlVmFsdWUuY2hhckF0KDApJiYobC5u b2RlVmFsdWU9bC5ub2RlVmFsdWUuc2xpY2UoMSkpfXJldHVybiBzfSx5PWZ1 bmN0aW9uKGUpe2Zvcig7IiI9PT1lLnBhcmVudE5vZGUudGFnTmFtZTspZT1l LnBhcmVudE5vZGU7cmV0dXJuIGV9LF89ZnVuY3Rpb24oZSx0KXtlLnBhcmVu dE5vZGUhPT10LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5pbnNlcnRCZWZv cmUoZSx0LnBhcmVudE5vZGUuZmlyc3RDaGlsZCl9O3U9ZnVuY3Rpb24oZSx0 KXt2YXIgcixuLGksbz15KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMu c3RhcnQpKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZW5kKSxz PWEucGFyZW50Tm9kZTtmb3IoXyhvLGEpLHI9by5uZXh0U2libGluZztyOyl7 aWYobj1yLm5leHRTaWJsaW5nLGk9cj09PWEpe2lmKCF0KWJyZWFrO2E9ci5u ZXh0U2libGluZ31pZihyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQociksaSli cmVhaztyPW59Zm9yKHI9ZyhvLnBhcmVudE5vZGUsZSksdCYmby5wYXJlbnRO b2RlLnJlbW92ZUNoaWxkKG8pO3I7KW49ci5uZXh0U2libGluZyxzLmluc2Vy dEJlZm9yZShyLGEpLHI9bn0sbD1mdW5jdGlvbigpe3ZhciBlPXkoZG9jdW1l bnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zdGFydCkpLHQ9ZG9jdW1lbnQuZ2V0 RWxlbWVudEJ5SWQodGhpcy5lbmQpO3RoaXMuaHRtbCgiIiksZS5wYXJlbnRO b2RlLnJlbW92ZUNoaWxkKGUpLHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0 KX0saD1mdW5jdGlvbihlKXtmb3IodmFyIHQscj1nKGUsdGhpcy5vdXRlckhU TUwoKSk7cjspdD1yLm5leHRTaWJsaW5nLGUuYXBwZW5kQ2hpbGQocikscj10 fSxtPWZ1bmN0aW9uKGUpe3ZhciB0LHIsbj1kb2N1bWVudC5nZXRFbGVtZW50 QnlJZCh0aGlzLmVuZCksaT1uLm5leHRTaWJsaW5nLG89bi5wYXJlbnROb2Rl O2ZvcihyPWcobyxlKTtyOyl0PXIubmV4dFNpYmxpbmcsby5pbnNlcnRCZWZv cmUocixpKSxyPXR9LHA9ZnVuY3Rpb24oZSl7dmFyIHQscixuPWRvY3VtZW50 LmdldEVsZW1lbnRCeUlkKHRoaXMuc3RhcnQpLGk9bi5wYXJlbnROb2RlO3I9 ZyhpLGUpO2Zvcih2YXIgbz1uLm5leHRTaWJsaW5nO3I7KXQ9ci5uZXh0U2li bGluZyxpLmluc2VydEJlZm9yZShyLG8pLHI9dH19cmV0dXJuIGEucHJvdG90 eXBlLmh0bWw9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY2hlY2tSZW1vdmVk KCksdm9pZCAwPT09ZT90aGlzLmlubmVySFRNTDoodS5jYWxsKHRoaXMsZSks dGhpcy5pbm5lckhUTUw9ZSx2b2lkIDApfSxhLnByb3RvdHlwZS5yZXBsYWNl V2l0aD1mdW5jdGlvbihlKXt0aGlzLmNoZWNrUmVtb3ZlZCgpLHUuY2FsbCh0 aGlzLGUsITApfSxhLnByb3RvdHlwZS5yZW1vdmU9bCxhLnByb3RvdHlwZS5v dXRlckhUTUw9YyxhLnByb3RvdHlwZS5hcHBlbmRUbz1oLGEucHJvdG90eXBl LmFmdGVyPW0sYS5wcm90b3R5cGUucHJlcGVuZD1wLGEucHJvdG90eXBlLnN0 YXJ0VGFnPWYsYS5wcm90b3R5cGUuZW5kVGFnPWQsYS5wcm90b3R5cGUuaXNS ZW1vdmVkPWZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5 SWQodGhpcy5zdGFydCksdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlz LmVuZCk7cmV0dXJuIWV8fCF0fSxhLnByb3RvdHlwZS5jaGVja1JlbW92ZWQ9 ZnVuY3Rpb24oKXtpZih0aGlzLmlzUmVtb3ZlZCgpKXRocm93IG5ldyBFcnJv cigiQ2Fubm90IHBlcmZvcm0gb3BlcmF0aW9ucyBvbiBhIE1ldGFtb3JwaCB0 aGF0IGlzIG5vdCBpbiB0aGUgRE9NLiIpfSxhfSl9KCksZnVuY3Rpb24oKXt2 YXIgZT1PYmplY3QuY3JlYXRlfHxmdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7 fXJldHVybiB0LnByb3RvdHlwZT1lLG5ldyB0fSx0PUVtYmVyLmltcG9ydHMm JkVtYmVyLmltcG9ydHMuSGFuZGxlYmFyc3x8dGhpcyYmdGhpcy5IYW5kbGVi YXJzO3R8fCJmdW5jdGlvbiIhPXR5cGVvZiByfHwodD1yKCJoYW5kbGViYXJz IikpLEVtYmVyLkhhbmRsZWJhcnM9ZSh0KSxFbWJlci5IYW5kbGViYXJzLmhl bHBlcj1mdW5jdGlvbihlLHQpe0VtYmVyLlZpZXcuZGV0ZWN0KHQpP0VtYmVy LkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoZSxFbWJlci5IYW5kbGViYXJz Lm1ha2VWaWV3SGVscGVyKHQpKTpFbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVy Qm91bmRIZWxwZXIuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxFbWJlci5IYW5k bGViYXJzLm1ha2VWaWV3SGVscGVyPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5j dGlvbih0KXtyZXR1cm4gRW1iZXIuSGFuZGxlYmFycy5oZWxwZXJzLnZpZXcu Y2FsbCh0aGlzLGUsdCl9fSxFbWJlci5IYW5kbGViYXJzLmhlbHBlcnM9ZSh0 LmhlbHBlcnMpLEVtYmVyLkhhbmRsZWJhcnMuQ29tcGlsZXI9ZnVuY3Rpb24o KXt9LHQuQ29tcGlsZXImJihFbWJlci5IYW5kbGViYXJzLkNvbXBpbGVyLnBy b3RvdHlwZT1lKHQuQ29tcGlsZXIucHJvdG90eXBlKSksRW1iZXIuSGFuZGxl YmFycy5Db21waWxlci5wcm90b3R5cGUuY29tcGlsZXI9RW1iZXIuSGFuZGxl YmFycy5Db21waWxlcixFbWJlci5IYW5kbGViYXJzLkphdmFTY3JpcHRDb21w aWxlcj1mdW5jdGlvbigpe30sdC5KYXZhU2NyaXB0Q29tcGlsZXImJihFbWJl ci5IYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlci5wcm90b3R5cGU9ZSh0 LkphdmFTY3JpcHRDb21waWxlci5wcm90b3R5cGUpLEVtYmVyLkhhbmRsZWJh cnMuSmF2YVNjcmlwdENvbXBpbGVyLnByb3RvdHlwZS5jb21waWxlcj1FbWJl ci5IYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlciksRW1iZXIuSGFuZGxl YmFycy5KYXZhU2NyaXB0Q29tcGlsZXIucHJvdG90eXBlLm5hbWVzcGFjZT0i RW1iZXIuSGFuZGxlYmFycyIsRW1iZXIuSGFuZGxlYmFycy5KYXZhU2NyaXB0 Q29tcGlsZXIucHJvdG90eXBlLmluaXRpYWxpemVCdWZmZXI9ZnVuY3Rpb24o KXtyZXR1cm4iJycifSxFbWJlci5IYW5kbGViYXJzLkphdmFTY3JpcHRDb21w aWxlci5wcm90b3R5cGUuYXBwZW5kVG9CdWZmZXI9ZnVuY3Rpb24oZSl7cmV0 dXJuImRhdGEuYnVmZmVyLnB1c2goIitlKyIpOyJ9O3ZhciBuPS9oZWxwZXJz XC4oLio/KVwpLyxpPS9oZWxwZXJzXFsnKC4qPyknLyxvPS8oLipibG9ja0hl bHBlck1pc3NpbmdcLmNhbGxcKC4qKShzdGFja1swLTldKykoLC4qKS87RW1i ZXIuSGFuZGxlYmFycy5KYXZhU2NyaXB0Q29tcGlsZXIuc3RyaW5naWZ5TGFz dEJsb2NrSGVscGVyTWlzc2luZ0ludm9jYXRpb249ZnVuY3Rpb24oZSl7dmFy IHQ9ZVtlLmxlbmd0aC0xXSxyPShuLmV4ZWModCl8fGkuZXhlYyh0KSlbMV0s YT1vLmV4ZWModCk7ZVtlLmxlbmd0aC0xXT1hWzFdKyInIityKyInIithWzNd fTt2YXIgYT1FbWJlci5IYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlci5z dHJpbmdpZnlMYXN0QmxvY2tIZWxwZXJNaXNzaW5nSW52b2NhdGlvbixzPUVt YmVyLkhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyLnByb3RvdHlwZS5i bG9ja1ZhbHVlO0VtYmVyLkhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVy LnByb3RvdHlwZS5ibG9ja1ZhbHVlPWZ1bmN0aW9uKCl7cy5hcHBseSh0aGlz LGFyZ3VtZW50cyksYSh0aGlzLnNvdXJjZSl9O3ZhciB1PUVtYmVyLkhhbmRs ZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyLnByb3RvdHlwZS5hbWJpZ3VvdXNC bG9ja1ZhbHVlO0VtYmVyLkhhbmRsZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVy LnByb3RvdHlwZS5hbWJpZ3VvdXNCbG9ja1ZhbHVlPWZ1bmN0aW9uKCl7dS5h cHBseSh0aGlzLGFyZ3VtZW50cyksYSh0aGlzLnNvdXJjZSl9LEVtYmVyLkhh bmRsZWJhcnMuQ29tcGlsZXIucHJvdG90eXBlLm11c3RhY2hlPWZ1bmN0aW9u KGUpe2lmKCFlLnBhcmFtcy5sZW5ndGgmJiFlLmhhc2gpe3ZhciByPW5ldyB0 LkFTVC5JZE5vZGUoW3twYXJ0OiJfdHJpYWdlTXVzdGFjaGUifV0pO2UuZXNj YXBlZHx8KGUuaGFzaD1lLmhhc2h8fG5ldyB0LkFTVC5IYXNoTm9kZShbXSks ZS5oYXNoLnBhaXJzLnB1c2goWyJ1bmVzY2FwZWQiLG5ldyB0LkFTVC5TdHJp bmdOb2RlKCJ0cnVlIildKSksZT1uZXcgdC5BU1QuTXVzdGFjaGVOb2RlKFty XS5jb25jYXQoW2UuaWRdKSxlLmhhc2gsIWUuZXNjYXBlZCl9cmV0dXJuIHQu Q29tcGlsZXIucHJvdG90eXBlLm11c3RhY2hlLmNhbGwodGhpcyxlKX0sRW1i ZXIuSGFuZGxlYmFycy5wcmVjb21waWxlPWZ1bmN0aW9uKGUpe3ZhciByPXQu cGFyc2UoZSksbj17a25vd25IZWxwZXJzOnthY3Rpb246ITAsdW5ib3VuZDoh MCwiYmluZC1hdHRyIjohMCx0ZW1wbGF0ZTohMCx2aWV3OiEwLF90cmlhZ2VN dXN0YWNoZTohMH0sZGF0YTohMCxzdHJpbmdQYXJhbXM6ITB9LGk9KG5ldyBF bWJlci5IYW5kbGViYXJzLkNvbXBpbGVyKS5jb21waWxlKHIsbik7cmV0dXJu KG5ldyBFbWJlci5IYW5kbGViYXJzLkphdmFTY3JpcHRDb21waWxlcikuY29t cGlsZShpLG4sdm9pZCAwLCEwKX0sdC5jb21waWxlJiYoRW1iZXIuSGFuZGxl YmFycy5jb21waWxlPWZ1bmN0aW9uKGUpe3ZhciByPXQucGFyc2UoZSksbj17 ZGF0YTohMCxzdHJpbmdQYXJhbXM6ITB9LGk9KG5ldyBFbWJlci5IYW5kbGVi YXJzLkNvbXBpbGVyKS5jb21waWxlKHIsbiksbz0obmV3IEVtYmVyLkhhbmRs ZWJhcnMuSmF2YVNjcmlwdENvbXBpbGVyKS5jb21waWxlKGksbix2b2lkIDAs ITApLGE9RW1iZXIuSGFuZGxlYmFycy50ZW1wbGF0ZShvKTtyZXR1cm4gYS5p c01ldGhvZD0hMSxhfSl9KCksZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUscixu LGkpe3ZhciBvLGEscyx1LGwsYz1bXSxoPWkuaGFzaCxtPWguYm91bmRPcHRp b25zLHA9dC5jYWxsKGkudHlwZXMsMSk7Zm9yKGwgaW4gbSltLmhhc093blBy b3BlcnR5KGwpJiYoaFtsXT1FbWJlci5IYW5kbGViYXJzLmdldChlLG1bbF0s aSkpO2ZvcihvPTAsYT1uLmxlbmd0aDthPm87KytvKXM9bltvXSx1PXBbb10s IklEIj09PXU/Yy5wdXNoKEVtYmVyLkhhbmRsZWJhcnMuZ2V0KHMucm9vdCxz LnBhdGgsaSkpOmMucHVzaChzLnBhdGgpO3JldHVybiBjLnB1c2goaSksci5h cHBseShlLGMpfXZhciB0PUFycmF5LnByb3RvdHlwZS5zbGljZSxyPUVtYmVy LkhhbmRsZWJhcnMudGVtcGxhdGUsbj1FbWJlci5IYW5kbGViYXJzLm5vcm1h bGl6ZVBhdGg9ZnVuY3Rpb24oZSx0LHIpe3ZhciBuLGksbz1yJiZyLmtleXdv cmRzfHx7fTtyZXR1cm4gbj10LnNwbGl0KCIuIiwxKVswXSxvLmhhc093blBy b3BlcnR5KG4pJiYoZT1vW25dLGk9ITAsdD10PT09bj8iIjp0LnN1YnN0cihu Lmxlbmd0aCsxKSkse3Jvb3Q6ZSxwYXRoOnQsaXNLZXl3b3JkOml9fSxpPUVt YmVyLkhhbmRsZWJhcnMuZ2V0PWZ1bmN0aW9uKGUsdCxyKXt2YXIgaSxvPXIm JnIuZGF0YSxhPW4oZSx0LG8pO3JldHVybiBFbWJlci5GRUFUVVJFUy5pc0Vu YWJsZWQoImVtYmVyLWhhbmRsZWJhcnMtY2Fwcy1sb29rdXAiKT9pPUVtYmVy LmlzR2xvYmFsUGF0aCh0KT9FbWJlci5nZXQoRW1iZXIubG9va3VwLHQpOkVt YmVyLmdldChhLnJvb3QsYS5wYXRoKTooZT1hLnJvb3QsdD1hLnBhdGgsaT1F bWJlci5nZXQoZSx0KSx2b2lkIDA9PT1pJiZlIT09RW1iZXIubG9va3VwJiZF bWJlci5pc0dsb2JhbFBhdGgodCkmJihpPUVtYmVyLmdldChFbWJlci5sb29r dXAsdCkpKSxpfTtFbWJlci5IYW5kbGViYXJzLmdldEVzY2FwZWQ9ZnVuY3Rp b24oZSx0LHIpe3ZhciBuPWkoZSx0LHIpO3JldHVybiBudWxsPT09bnx8dm9p ZCAwPT09bj9uPSIiOm4gaW5zdGFuY2VvZiBIYW5kbGViYXJzLlNhZmVTdHJp bmd8fChuPVN0cmluZyhuKSksci5oYXNoLnVuZXNjYXBlZHx8KG49SGFuZGxl YmFycy5VdGlscy5lc2NhcGVFeHByZXNzaW9uKG4pKSxufSxFbWJlci5IYW5k bGViYXJzLnJlc29sdmVQYXJhbXM9ZnVuY3Rpb24oZSx0LHIpe2Zvcih2YXIg bixvLGE9W10scz1yLnR5cGVzLHU9MCxsPXQubGVuZ3RoO2w+dTt1Kyspbj10 W3VdLG89c1t1XSwiSUQiPT09bz9hLnB1c2goaShlLG4scikpOmEucHVzaChu KTtyZXR1cm4gYX0sRW1iZXIuSGFuZGxlYmFycy5yZXNvbHZlSGFzaD1mdW5j dGlvbihlLHQscil7dmFyIG4sbz17fSxhPXIuaGFzaFR5cGVzO2Zvcih2YXIg cyBpbiB0KXQuaGFzT3duUHJvcGVydHkocykmJihuPWFbc10sb1tzXT0iSUQi PT09bj9pKGUsdFtzXSxyKTp0W3NdKTtyZXR1cm4gb30sRW1iZXIuSGFuZGxl YmFycy5yZWdpc3RlckhlbHBlcigiaGVscGVyTWlzc2luZyIsZnVuY3Rpb24o ZSl7dmFyIHIsbj0iIixpPWFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoLTFd LG89RW1iZXIuSGFuZGxlYmFycy5yZXNvbHZlSGVscGVyKGkuZGF0YS52aWV3 LmNvbnRhaW5lcixlKTtpZihvKXJldHVybiBvLmFwcGx5KHRoaXMsdC5jYWxs KGFyZ3VtZW50cywxKSk7dGhyb3cgcj0iJUAgSGFuZGxlYmFycyBlcnJvcjog Q291bGQgbm90IGZpbmQgcHJvcGVydHkgJyVAJyBvbiBvYmplY3QgJUAuIixp LmRhdGEmJihuPWkuZGF0YS52aWV3KSxuZXcgRW1iZXIuRXJyb3IoRW1iZXIu U3RyaW5nLmZtdChyLFtuLGUsdGhpc10pKX0pLEVtYmVyLkhhbmRsZWJhcnMu cmVnaXN0ZXJIZWxwZXIoImJsb2NrSGVscGVyTWlzc2luZyIsZnVuY3Rpb24o ZSl7dmFyIHI9YXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGgtMV0sbj1FbWJl ci5IYW5kbGViYXJzLnJlc29sdmVIZWxwZXIoci5kYXRhLnZpZXcuY29udGFp bmVyLGUpO3JldHVybiBuP24uYXBwbHkodGhpcyx0LmNhbGwoYXJndW1lbnRz LDEpKTpIYW5kbGViYXJzLmhlbHBlcnMuaGVscGVyTWlzc2luZy5jYWxsKHRo aXMsZSl9KSxFbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVyQm91bmRIZWxwZXI9 ZnVuY3Rpb24oZSl7dmFyIHI9dC5jYWxsKGFyZ3VtZW50cywxKSxuPUVtYmVy LkhhbmRsZWJhcnMubWFrZUJvdW5kSGVscGVyLmFwcGx5KHRoaXMscik7RW1i ZXIuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcihlLG4pfSxFbWJlci5IYW5k bGViYXJzLm1ha2VCb3VuZEhlbHBlcj1mdW5jdGlvbihyKXtmdW5jdGlvbiBp KCl7dmFyIGksYSxzLHUsbCxjPXQuY2FsbChhcmd1bWVudHMsMCwtMSksaD1j Lmxlbmd0aCxtPWFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoLTFdLHA9W10s Zj1tLmRhdGEsZD1mLmlzVW5ib3VuZD90LmNhbGwobS50eXBlcywxKTptLnR5 cGVzLGI9bS5oYXNoLEU9Zi52aWV3LHY9bS5jb250ZXh0cyxnPXYmJnYubGVu Z3RoP3ZbMF06dGhpcyx5PSIiLF89RW1iZXIuX1NpbXBsZUhhbmRsZWJhcnNW aWV3LnByb3RvdHlwZS5ub3JtYWxpemVkVmFsdWUsdz1iLmJvdW5kT3B0aW9u cz17fTtmb3IocyBpbiBiKUVtYmVyLklTX0JJTkRJTkcudGVzdChzKSYmKHdb cy5zbGljZSgwLC03KV09YltzXSk7dmFyIEM9W107Zm9yKGYucHJvcGVydGll cz1bXSxpPTA7aD5pOysraSlpZihmLnByb3BlcnRpZXMucHVzaChjW2ldKSwi SUQiPT09ZFtpXSl7dmFyIE89bihnLGNbaV0sZik7cC5wdXNoKE8pLEMucHVz aChPKX1lbHNlIGYuaXNVbmJvdW5kP3AucHVzaCh7cGF0aDpjW2ldfSk6cC5w dXNoKG51bGwpO2lmKGYuaXNVbmJvdW5kKXJldHVybiBlKHRoaXMscixwLG0p O3ZhciBQPW5ldyBFbWJlci5fU2ltcGxlSGFuZGxlYmFyc1ZpZXcobnVsbCxu dWxsLCFtLmhhc2gudW5lc2NhcGVkLG0uZGF0YSk7UC5ub3JtYWxpemVkVmFs dWU9ZnVuY3Rpb24oKXt2YXIgZSx0PVtdO2ZvcihlIGluIHcpdy5oYXNPd25Q cm9wZXJ0eShlKSYmKGw9bihnLHdbZV0sZiksUC5wYXRoPWwucGF0aCxQLnBh dGhSb290PWwucm9vdCxiW2VdPV8uY2FsbChQKSk7Zm9yKGk9MDtoPmk7Kytp KWw9cFtpXSxsPyhQLnBhdGg9bC5wYXRoLFAucGF0aFJvb3Q9bC5yb290LHQu cHVzaChfLmNhbGwoUCkpKTp0LnB1c2goY1tpXSk7cmV0dXJuIHQucHVzaCht KSxyLmFwcGx5KGcsdCl9LEUuYXBwZW5kQ2hpbGQoUCk7Zm9yKHUgaW4gdyl3 Lmhhc093blByb3BlcnR5KHUpJiZDLnB1c2gobihnLHdbdV0sZikpO2Zvcihp PTAsYT1DLmxlbmd0aDthPmk7KytpKWw9Q1tpXSxFLnJlZ2lzdGVyT2JzZXJ2 ZXIobC5yb290LGwucGF0aCxQLFAucmVyZW5kZXIpO2lmKCJJRCI9PT1kWzBd JiYwIT09cC5sZW5ndGgpe3ZhciBBPXBbMF0sVD1BLnJvb3QseD1BLnBhdGg7 RW1iZXIuaXNFbXB0eSh4KXx8KHk9eCsiLiIpO2Zvcih2YXIgUz0wLFY9by5s ZW5ndGg7Vj5TO1MrKylFLnJlZ2lzdGVyT2JzZXJ2ZXIoVCx5K29bU10sUCxQ LnJlcmVuZGVyKX19dmFyIG89dC5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4g aS5fcmF3RnVuY3Rpb249cixpfSxFbWJlci5IYW5kbGViYXJzLnRlbXBsYXRl PWZ1bmN0aW9uKGUpe3ZhciB0PXIoZSk7cmV0dXJuIHQuaXNUb3A9ITAsdH19 KCksZnVuY3Rpb24oKXtFbWJlci5TdHJpbmcuaHRtbFNhZmU9ZnVuY3Rpb24o ZSl7cmV0dXJuIG5ldyBIYW5kbGViYXJzLlNhZmVTdHJpbmcoZSl9O3ZhciBl PUVtYmVyLlN0cmluZy5odG1sU2FmZTsoRW1iZXIuRVhURU5EX1BST1RPVFlQ RVM9PT0hMHx8RW1iZXIuRVhURU5EX1BST1RPVFlQRVMuU3RyaW5nKSYmKFN0 cmluZy5wcm90b3R5cGUuaHRtbFNhZmU9ZnVuY3Rpb24oKXtyZXR1cm4gZSh0 aGlzKX0pfSgpLGZ1bmN0aW9uKCl7RW1iZXIuSGFuZGxlYmFycy5yZXNvbHZl UGF0aHM9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLHI9ZS5jb250ZXh0cyxu PWUucm9vdHMsaT1lLmRhdGEsbz0wLGE9ci5sZW5ndGg7YT5vO28rKyl0LnB1 c2goRW1iZXIuSGFuZGxlYmFycy5nZXQobltvXSxyW29dLHtkYXRhOml9KSk7 cmV0dXJuIHR9fSgpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe0VtYmVyLnJ1 bi5vbmNlKEVtYmVyLlZpZXcsIm5vdGlmeU11dGF0aW9uTGlzdGVuZXJzIil9 dmFyIHI9KEVtYmVyLnNldCxFbWJlci5nZXQsdCgibWV0YW1vcnBoIikpLG49 e3JlbW92ZTpmdW5jdGlvbih0KXt0Lm1vcnBoLnJlbW92ZSgpLGUoKX0scHJl cGVuZDpmdW5jdGlvbih0LHIpe3QubW9ycGgucHJlcGVuZChyKSxlKCl9LGFm dGVyOmZ1bmN0aW9uKHQscil7dC5tb3JwaC5hZnRlcihyKSxlKCl9LGh0bWw6 ZnVuY3Rpb24odCxyKXt0Lm1vcnBoLmh0bWwociksZSgpfSxyZXBsYWNlOmZ1 bmN0aW9uKHQpe3ZhciByPXQubW9ycGg7dC50cmFuc2l0aW9uVG8oInByZVJl bmRlciIpLEVtYmVyLnJ1bi5zY2hlZHVsZSgicmVuZGVyIix0aGlzLGZ1bmN0 aW9uKCl7aWYoIXQuaXNEZXN0cm95aW5nKXt0LmNsZWFyUmVuZGVyZWRDaGls ZHJlbigpO3ZhciBuPXQucmVuZGVyVG9CdWZmZXIoKTt0Lmludm9rZVJlY3Vy c2l2ZWx5KGZ1bmN0aW9uKGUpe2UucHJvcGVydHlXaWxsQ2hhbmdlKCJlbGVt ZW50Iil9KSx0LnRyaWdnZXJSZWN1cnNpdmVseSgid2lsbEluc2VydEVsZW1l bnQiKSxyLnJlcGxhY2VXaXRoKG4uc3RyaW5nKCkpLHQudHJhbnNpdGlvblRv KCJpbkRPTSIpLHQuaW52b2tlUmVjdXJzaXZlbHkoZnVuY3Rpb24oZSl7ZS5w cm9wZXJ0eURpZENoYW5nZSgiZWxlbWVudCIpfSksdC50cmlnZ2VyUmVjdXJz aXZlbHkoImRpZEluc2VydEVsZW1lbnQiKSxlKCl9fSl9LGVtcHR5OmZ1bmN0 aW9uKHQpe3QubW9ycGguaHRtbCgiIiksZSgpfX07RW1iZXIuX01ldGFtb3Jw aD1FbWJlci5NaXhpbi5jcmVhdGUoe2lzVmlydHVhbDohMCx0YWdOYW1lOiIi LGluc3RydW1lbnROYW1lOiJtZXRhbW9ycGgiLGluaXQ6ZnVuY3Rpb24oKXt0 aGlzLl9zdXBlcigpLHRoaXMubW9ycGg9cigpfSxiZWZvcmVSZW5kZXI6ZnVu Y3Rpb24oZSl7ZS5wdXNoKHRoaXMubW9ycGguc3RhcnRUYWcoKSksZS5wdXNo T3BlbmluZ1RhZygpfSxhZnRlclJlbmRlcjpmdW5jdGlvbihlKXtlLnB1c2hD bG9zaW5nVGFnKCksZS5wdXNoKHRoaXMubW9ycGguZW5kVGFnKCkpfSxjcmVh dGVFbGVtZW50OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5yZW5kZXJUb0J1ZmZl cigpO3RoaXMub3V0ZXJIVE1MPWUuc3RyaW5nKCksdGhpcy5jbGVhckJ1ZmZl cigpfSxkb21NYW5hZ2VyOm59KSxFbWJlci5fTWV0YW1vcnBoVmlldz1FbWJl ci5WaWV3LmV4dGVuZChFbWJlci5fTWV0YW1vcnBoKSxFbWJlci5fU2ltcGxl TWV0YW1vcnBoVmlldz1FbWJlci5Db3JlVmlldy5leHRlbmQoRW1iZXIuX01l dGFtb3JwaCl9KCksZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCxyLG4pe3Ro aXMucGF0aD1lLHRoaXMucGF0aFJvb3Q9dCx0aGlzLmlzRXNjYXBlZD1yLHRo aXMudGVtcGxhdGVEYXRhPW4sdGhpcy5tb3JwaD1vKCksdGhpcy5zdGF0ZT0i cHJlUmVuZGVyIix0aGlzLnVwZGF0ZUlkPW51bGwsdGhpcy5fcGFyZW50Vmll dz1udWxsLHRoaXMuYnVmZmVyPW51bGx9dmFyIHI9RW1iZXIuZ2V0LG49RW1i ZXIuc2V0LGk9RW1iZXIuSGFuZGxlYmFycy5nZXQsbz10KCJtZXRhbW9ycGgi KTtFbWJlci5fU2ltcGxlSGFuZGxlYmFyc1ZpZXc9ZSxlLnByb3RvdHlwZT17 aXNWaXJ0dWFsOiEwLGlzVmlldzohMCxkZXN0cm95OmZ1bmN0aW9uKCl7dGhp cy51cGRhdGVJZCYmKEVtYmVyLnJ1bi5jYW5jZWwodGhpcy51cGRhdGVJZCks dGhpcy51cGRhdGVJZD1udWxsKSx0aGlzLl9wYXJlbnRWaWV3JiZ0aGlzLl9w YXJlbnRWaWV3LnJlbW92ZUNoaWxkKHRoaXMpLHRoaXMubW9ycGg9bnVsbCx0 aGlzLnN0YXRlPSJkZXN0cm95ZWQifSxwcm9wZXJ0eVdpbGxDaGFuZ2U6RW1i ZXIuSyxwcm9wZXJ0eURpZENoYW5nZTpFbWJlci5LLG5vcm1hbGl6ZWRWYWx1 ZTpmdW5jdGlvbigpe3ZhciBlLHQscj10aGlzLnBhdGgsbj10aGlzLnBhdGhS b290O3JldHVybiIiPT09cj9lPW46KHQ9dGhpcy50ZW1wbGF0ZURhdGEsZT1p KG4scix7ZGF0YTp0fSkpLGV9LHJlbmRlclRvQnVmZmVyOmZ1bmN0aW9uKGUp e3ZhciB0PSIiO3QrPXRoaXMubW9ycGguc3RhcnRUYWcoKSx0Kz10aGlzLnJl bmRlcigpLHQrPXRoaXMubW9ycGguZW5kVGFnKCksZS5wdXNoKHQpfSxyZW5k ZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmlzRXNjYXBlZCx0PXRoaXMubm9y bWFsaXplZFZhbHVlKCk7cmV0dXJuIG51bGw9PT10fHx2b2lkIDA9PT10P3Q9 IiI6dCBpbnN0YW5jZW9mIEhhbmRsZWJhcnMuU2FmZVN0cmluZ3x8KHQ9U3Ry aW5nKHQpKSxlJiYodD1IYW5kbGViYXJzLlV0aWxzLmVzY2FwZUV4cHJlc3Np b24odCkpLHR9LHJlcmVuZGVyOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuc3Rh dGUpe2Nhc2UicHJlUmVuZGVyIjpjYXNlImRlc3Ryb3llZCI6YnJlYWs7Y2Fz ZSJpbkJ1ZmZlciI6dGhyb3cgbmV3IEVtYmVyLkVycm9yKCJTb21ldGhpbmcg eW91IGRpZCB0cmllZCB0byByZXBsYWNlIGFuIHt7ZXhwcmVzc2lvbn19IGJl Zm9yZSBpdCB3YXMgaW5zZXJ0ZWQgaW50byB0aGUgRE9NLiIpO2Nhc2UiaGFz RWxlbWVudCI6Y2FzZSJpbkRPTSI6dGhpcy51cGRhdGVJZD1FbWJlci5ydW4u c2NoZWR1bGVPbmNlKCJyZW5kZXIiLHRoaXMsInVwZGF0ZSIpfXJldHVybiB0 aGlzfSx1cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLnVwZGF0ZUlkPW51bGwsdGhp cy5tb3JwaC5odG1sKHRoaXMucmVuZGVyKCkpfSx0cmFuc2l0aW9uVG86ZnVu Y3Rpb24oZSl7dGhpcy5zdGF0ZT1lfX07dmFyIGE9RW1iZXIuVmlldy5jbG9u ZVN0YXRlcyhFbWJlci5WaWV3LnN0YXRlcykscz1FbWJlci5tZXJnZTtzKGEu X2RlZmF1bHQse3JlcmVuZGVySWZOZWVkZWQ6RW1iZXIuS30pLHMoYS5pbkRP TSx7cmVyZW5kZXJJZk5lZWRlZDpmdW5jdGlvbihlKXtlLm5vcm1hbGl6ZWRW YWx1ZSgpIT09ZS5fbGFzdE5vcm1hbGl6ZWRWYWx1ZSYmZS5yZXJlbmRlcigp fX0pLEVtYmVyLl9IYW5kbGViYXJzQm91bmRWaWV3PUVtYmVyLl9NZXRhbW9y cGhWaWV3LmV4dGVuZCh7aW5zdHJ1bWVudE5hbWU6ImJvdW5kSGFuZGxlYmFy cyIsc3RhdGVzOmEsc2hvdWxkRGlzcGxheUZ1bmM6bnVsbCxwcmVzZXJ2ZUNv bnRleHQ6ITEscHJldmlvdXNDb250ZXh0Om51bGwsZGlzcGxheVRlbXBsYXRl Om51bGwsaW52ZXJzZVRlbXBsYXRlOm51bGwscGF0aDpudWxsLHBhdGhSb290 Om51bGwsbm9ybWFsaXplZFZhbHVlOmZ1bmN0aW9uKCl7dmFyIGUsdCxuPXIo dGhpcywicGF0aCIpLG89cih0aGlzLCJwYXRoUm9vdCIpLGE9cih0aGlzLCJ2 YWx1ZU5vcm1hbGl6ZXJGdW5jIik7cmV0dXJuIiI9PT1uP2U9bzoodD1yKHRo aXMsInRlbXBsYXRlRGF0YSIpLGU9aShvLG4se2RhdGE6dH0pKSxhP2EoZSk6 ZX0scmVyZW5kZXJJZk5lZWRlZDpmdW5jdGlvbigpe3RoaXMuY3VycmVudFN0 YXRlLnJlcmVuZGVySWZOZWVkZWQodGhpcyl9LHJlbmRlcjpmdW5jdGlvbihl KXt2YXIgdD1yKHRoaXMsImlzRXNjYXBlZCIpLGk9cih0aGlzLCJzaG91bGRE aXNwbGF5RnVuYyIpLG89cih0aGlzLCJwcmVzZXJ2ZUNvbnRleHQiKSxhPXIo dGhpcywicHJldmlvdXNDb250ZXh0Iikscz1yKHRoaXMsIl9jb250ZXh0Q29u dHJvbGxlciIpLHU9cih0aGlzLCJpbnZlcnNlVGVtcGxhdGUiKSxsPXIodGhp cywiZGlzcGxheVRlbXBsYXRlIiksYz10aGlzLm5vcm1hbGl6ZWRWYWx1ZSgp O2lmKHRoaXMuX2xhc3ROb3JtYWxpemVkVmFsdWU9YyxpKGMpKWlmKG4odGhp cywidGVtcGxhdGUiLGwpLG8pbih0aGlzLCJfY29udGV4dCIsYSk7ZWxzZXtp ZighbClyZXR1cm4gbnVsbD09PWN8fHZvaWQgMD09PWM/Yz0iIjpjIGluc3Rh bmNlb2YgSGFuZGxlYmFycy5TYWZlU3RyaW5nfHwoYz1TdHJpbmcoYykpLHQm JihjPUhhbmRsZWJhcnMuVXRpbHMuZXNjYXBlRXhwcmVzc2lvbihjKSksZS5w dXNoKGMpLHZvaWQgMDtzJiYobihzLCJjb250ZW50IixjKSxjPXMpLG4odGhp cywiX2NvbnRleHQiLGMpfWVsc2UgdT8obih0aGlzLCJ0ZW1wbGF0ZSIsdSks bz9uKHRoaXMsIl9jb250ZXh0IixhKTpuKHRoaXMsIl9jb250ZXh0IixjKSk6 bih0aGlzLCJ0ZW1wbGF0ZSIsZnVuY3Rpb24oKXtyZXR1cm4iIn0pO3JldHVy biB0aGlzLl9zdXBlcihlKX19KX0oKSxmdW5jdGlvbigpe2Z1bmN0aW9uIGUo ZSl7cmV0dXJuIUVtYmVyLmlzTm9uZShlKX1mdW5jdGlvbiB0KGUsdCxyLG4s aSx1KXt2YXIgbCxjLGgsbT10LmRhdGEscD10LmZuLGY9dC5pbnZlcnNlLGQ9 bS52aWV3LGI9dGhpcztpZihsPWEoYixlLG0pLCJvYmplY3QiPT10eXBlb2Yg dGhpcyl7aWYobS5pbnNpZGVHcm91cCl7Yz1mdW5jdGlvbigpe0VtYmVyLnJ1 bi5vbmNlKGQsInJlcmVuZGVyIil9O3ZhciBFLHYsZz1vKGIsZSx0KTtnPWk/ aShnKTpnLHY9cj9iOmcsbihnKT9FPXA6ZiYmKEU9ZiksRSh2LHtkYXRhOnQu ZGF0YX0pfWVsc2V7dmFyIHk9ZC5jcmVhdGVDaGlsZFZpZXcoRW1iZXIuX0hh bmRsZWJhcnNCb3VuZFZpZXcse3ByZXNlcnZlQ29udGV4dDpyLHNob3VsZERp c3BsYXlGdW5jOm4sdmFsdWVOb3JtYWxpemVyRnVuYzppLGRpc3BsYXlUZW1w bGF0ZTpwLGludmVyc2VUZW1wbGF0ZTpmLHBhdGg6ZSxwYXRoUm9vdDpiLHBy ZXZpb3VzQ29udGV4dDpiLGlzRXNjYXBlZDohdC5oYXNoLnVuZXNjYXBlZCx0 ZW1wbGF0ZURhdGE6dC5kYXRhfSk7dC5oYXNoLmNvbnRyb2xsZXImJnkuc2V0 KCJfY29udGV4dENvbnRyb2xsZXIiLHRoaXMuY29udGFpbmVyLmxvb2t1cEZh Y3RvcnkoImNvbnRyb2xsZXI6Iit0Lmhhc2guY29udHJvbGxlcikuY3JlYXRl KHtjb250YWluZXI6Yi5jb250YWluZXIscGFyZW50Q29udHJvbGxlcjpiLHRh cmdldDpifSkpLGQuYXBwZW5kQ2hpbGQoeSksYz1mdW5jdGlvbigpe0VtYmVy LnJ1bi5zY2hlZHVsZU9uY2UoInJlbmRlciIseSwicmVyZW5kZXJJZk5lZWRl ZCIpfX1pZigiIiE9PWwucGF0aCYmKGQucmVnaXN0ZXJPYnNlcnZlcihsLnJv b3QsbC5wYXRoLGMpLHUpKWZvcihoPTA7aDx1Lmxlbmd0aDtoKyspZC5yZWdp c3Rlck9ic2VydmVyKGwucm9vdCxsLnBhdGgrIi4iK3VbaF0sYyl9ZWxzZSBt LmJ1ZmZlci5wdXNoKHMoYixlLHQpKX1mdW5jdGlvbiByKGUsdCxyKXt2YXIg bixpLG8sdSxsPXIuZGF0YSxjPWwudmlldztpZihuPWEoZSx0LGwpLG89bi5y b290LG8mJiJvYmplY3QiPT10eXBlb2Ygbyl7aWYobC5pbnNpZGVHcm91cClp PWZ1bmN0aW9uKCl7RW1iZXIucnVuLm9uY2UoYywicmVyZW5kZXIiKX0sdT1z KGUsdCxyKSxsLmJ1ZmZlci5wdXNoKHUpO2Vsc2V7dmFyIGg9bmV3IEVtYmVy Ll9TaW1wbGVIYW5kbGViYXJzVmlldyh0LGUsIXIuaGFzaC51bmVzY2FwZWQs ci5kYXRhKTtoLl9wYXJlbnRWaWV3PWMsYy5hcHBlbmRDaGlsZChoKSxpPWZ1 bmN0aW9uKCl7RW1iZXIucnVuLnNjaGVkdWxlT25jZSgicmVuZGVyIixoLCJy ZXJlbmRlciIpfX0iIiE9PW4ucGF0aCYmYy5yZWdpc3Rlck9ic2VydmVyKG4u cm9vdCxuLnBhdGgsaSl9ZWxzZSB1PXMoZSx0LHIpLGwuYnVmZmVyLnB1c2go dSl9ZnVuY3Rpb24gbihlKXt2YXIgdD1lJiZpKGUsImlzVHJ1dGh5Iik7cmV0 dXJuImJvb2xlYW4iPT10eXBlb2YgdD90OkVtYmVyLmlzQXJyYXkoZSk/MCE9 PWkoZSwibGVuZ3RoIik6ISFlfXZhciBpPUVtYmVyLmdldCxvPShFbWJlci5z ZXQsRW1iZXIuU3RyaW5nLmZtdCxFbWJlci5IYW5kbGViYXJzLmdldCksYT1F bWJlci5IYW5kbGViYXJzLm5vcm1hbGl6ZVBhdGgscz1FbWJlci5IYW5kbGVi YXJzLmdldEVzY2FwZWQsdT1FbWJlci5BcnJheVBvbHlmaWxscy5mb3JFYWNo LGw9RW1iZXIuY3JlYXRlLGM9RW1iZXIuSGFuZGxlYmFycyxoPWMuaGVscGVy cztjLmJpbmQ9dCxjLnJlZ2lzdGVySGVscGVyKCJfdHJpYWdlTXVzdGFjaGUi LGZ1bmN0aW9uKGUsdCl7aWYoaFtlXSlyZXR1cm4gaFtlXS5jYWxsKHRoaXMs dCk7dmFyIHI9RW1iZXIuSGFuZGxlYmFycy5yZXNvbHZlSGVscGVyKHQuZGF0 YS52aWV3LmNvbnRhaW5lcixlKTtyZXR1cm4gcj9yLmNhbGwodGhpcyx0KTpo LmJpbmQuY2FsbCh0aGlzLGUsdCl9KSxFbWJlci5IYW5kbGViYXJzLnJlc29s dmVIZWxwZXI9ZnVuY3Rpb24oZSx0KXtpZihlJiYtMSE9PXQuaW5kZXhPZigi LSIpKXt2YXIgcj1lLmxvb2t1cCgiaGVscGVyOiIrdCk7aWYoIXIpe3ZhciBu PWUubG9va3VwKCJjb21wb25lbnQtbG9va3VwOm1haW4iKSxpPW4ubG9va3Vw RmFjdG9yeSh0LGUpO2kmJihyPWMubWFrZVZpZXdIZWxwZXIoaSksZS5yZWdp c3RlcigiaGVscGVyOiIrdCxyKSl9cmV0dXJuIHJ9fSxjLnJlZ2lzdGVySGVs cGVyKCJiaW5kIixmdW5jdGlvbihuLGkpe3ZhciBvPWkuY29udGV4dHMmJmku Y29udGV4dHMubGVuZ3RoP2kuY29udGV4dHNbMF06dGhpcztyZXR1cm4gaS5m bj90LmNhbGwobyxuLGksITEsZSk6cihvLG4saSl9KSxjLnJlZ2lzdGVySGVs cGVyKCJib3VuZElmIixmdW5jdGlvbihlLHIpe3ZhciBpPXIuY29udGV4dHMm JnIuY29udGV4dHMubGVuZ3RoP3IuY29udGV4dHNbMF06dGhpcztyZXR1cm4g dC5jYWxsKGksZSxyLCEwLG4sbixbImlzVHJ1dGh5IiwibGVuZ3RoIl0pfSks Yy5yZWdpc3RlckhlbHBlcigidW5ib3VuZElmIixmdW5jdGlvbihlLHQpe3Zh ciByLGkscz10LmNvbnRleHRzJiZ0LmNvbnRleHRzLmxlbmd0aD90LmNvbnRl eHRzWzBdOnRoaXMsdT10LmRhdGEsbD10LmZuLGM9dC5pbnZlcnNlO3I9YShz LGUsdSksaT1vKHMsZSx0KSxuKGkpfHwobD1jKSxsKHMse2RhdGE6dX0pfSks Yy5yZWdpc3RlckhlbHBlcigid2l0aCIsZnVuY3Rpb24ocixuKXtpZig0PT09 YXJndW1lbnRzLmxlbmd0aCl7dmFyIGksbyxzLHUsYztuPWFyZ3VtZW50c1sz XSxpPWFyZ3VtZW50c1syXSxvPWFyZ3VtZW50c1swXTt2YXIgbT1sKG4pO2lm KG0uZGF0YT1sKG4uZGF0YSksbS5kYXRhLmtleXdvcmRzPWwobi5kYXRhLmtl eXdvcmRzfHx7fSksRW1iZXIuaXNHbG9iYWxQYXRoKG8pKWM9bztlbHNle3U9 YSh0aGlzLG8sbi5kYXRhKSxvPXUucGF0aCxzPXUucm9vdDt2YXIgcD1FbWJl ci4kLmV4cGFuZG8rRW1iZXIuZ3VpZEZvcihzKTttLmRhdGEua2V5d29yZHNb cF09cyxjPW8/cCsiLiIrbzpwfXJldHVybiBFbWJlci5iaW5kKG0uZGF0YS5r ZXl3b3JkcyxpLGMpLHQuY2FsbCh0aGlzLG8sbSwhMCxlKX1yZXR1cm4gaC5i aW5kLmNhbGwobi5jb250ZXh0c1swXSxyLG4pfSksYy5yZWdpc3RlckhlbHBl cigiaWYiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuZGF0YS5pc1VuYm91bmQ/ aC51bmJvdW5kSWYuY2FsbCh0LmNvbnRleHRzWzBdLGUsdCk6aC5ib3VuZElm LmNhbGwodC5jb250ZXh0c1swXSxlLHQpfSksYy5yZWdpc3RlckhlbHBlcigi dW5sZXNzIixmdW5jdGlvbihlLHQpe3ZhciByPXQuZm4sbj10LmludmVyc2U7 cmV0dXJuIHQuZm49bix0LmludmVyc2U9cix0LmRhdGEuaXNVbmJvdW5kP2gu dW5ib3VuZElmLmNhbGwodC5jb250ZXh0c1swXSxlLHQpOmguYm91bmRJZi5j YWxsKHQuY29udGV4dHNbMF0sZSx0KX0pLGMucmVnaXN0ZXJIZWxwZXIoImJp bmQtYXR0ciIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS5oYXNoLHI9ZS5kYXRhLnZp ZXcsbj1bXSxpPXRoaXMscz0rK0VtYmVyLnV1aWQsbD10WyJjbGFzcyJdO2lm KG51bGwhPWwpe3ZhciBoPWMuYmluZENsYXNzZXModGhpcyxsLHIscyxlKTtu LnB1c2goJ2NsYXNzPSInK0hhbmRsZWJhcnMuVXRpbHMuZXNjYXBlRXhwcmVz c2lvbihoLmpvaW4oIiAiKSkrJyInKSxkZWxldGUgdFsiY2xhc3MiXX12YXIg bT1FbWJlci5rZXlzKHQpO3JldHVybiB1LmNhbGwobSxmdW5jdGlvbih1KXt2 YXIgbCxjPXRbdV07bD1hKGksYyxlLmRhdGEpO3ZhciBoLG0scD0idGhpcyI9 PT1jP2wucm9vdDpvKGksYyxlKSxmPUVtYmVyLnR5cGVPZihwKTtoPWZ1bmN0 aW9uKCl7dmFyIHQ9byhpLGMsZSksbj1yLiQoIltkYXRhLWJpbmRhdHRyLSIr cysiPSciK3MrIiddIik7cmV0dXJuIG4mJjAhPT1uLmxlbmd0aD8oRW1iZXIu Vmlldy5hcHBseUF0dHJpYnV0ZUJpbmRpbmdzKG4sdSx0KSx2b2lkIDApOihF bWJlci5yZW1vdmVPYnNlcnZlcihsLnJvb3QsbC5wYXRoLG0pLHZvaWQgMCl9 LCJ0aGlzIj09PWN8fGwuaXNLZXl3b3JkJiYiIj09PWwucGF0aHx8ci5yZWdp c3Rlck9ic2VydmVyKGwucm9vdCxsLnBhdGgsaCksInN0cmluZyI9PT1mfHwi bnVtYmVyIj09PWYmJiFpc05hTihwKT9uLnB1c2godSsnPSInK0hhbmRsZWJh cnMuVXRpbHMuZXNjYXBlRXhwcmVzc2lvbihwKSsnIicpOnAmJiJib29sZWFu Ij09PWYmJm4ucHVzaCh1Kyc9IicrdSsnIicpfSx0aGlzKSxuLnB1c2goImRh dGEtYmluZGF0dHItIitzKyc9IicrcysnIicpLG5ldyBjLlNhZmVTdHJpbmco bi5qb2luKCIgIikpfSksYy5yZWdpc3RlckhlbHBlcigiYmluZEF0dHIiLGZ1 bmN0aW9uKCl7cmV0dXJuIGMuaGVscGVyc1siYmluZC1hdHRyIl0uYXBwbHko dGhpcyxhcmd1bWVudHMpfSksYy5iaW5kQ2xhc3Nlcz1mdW5jdGlvbihlLHQs cixuLGkpe3ZhciBzLGwsYyxoPVtdLG09ZnVuY3Rpb24oZSx0LHIpe3ZhciBu LGk9dC5wYXRoO3JldHVybiBuPSJ0aGlzIj09PWk/ZToiIj09PWk/ITA6byhl LGksciksRW1iZXIuVmlldy5fY2xhc3NTdHJpbmdGb3JWYWx1ZShpLG4sdC5j bGFzc05hbWUsdC5mYWxzeUNsYXNzTmFtZSl9O3JldHVybiB1LmNhbGwodC5z cGxpdCgiICIpLGZ1bmN0aW9uKHQpe3ZhciBvLHUscCxmLGQ9RW1iZXIuVmll dy5fcGFyc2VQcm9wZXJ0eVBhdGgodCksYj1kLnBhdGgsRT1lOyIiIT09YiYm InRoaXMiIT09YiYmKGY9YShlLGIsaS5kYXRhKSxFPWYucm9vdCxiPWYucGF0 aCksdT1mdW5jdGlvbigpe3M9bShlLGQsaSksYz1uP3IuJCgiW2RhdGEtYmlu ZGF0dHItIituKyI9JyIrbisiJ10iKTpyLiQoKSxjJiYwIT09Yy5sZW5ndGg/ KG8mJmMucmVtb3ZlQ2xhc3Mobykscz8oYy5hZGRDbGFzcyhzKSxvPXMpOm89 bnVsbCk6RW1iZXIucmVtb3ZlT2JzZXJ2ZXIoRSxiLHApfSwiIiE9PWImJiJ0 aGlzIiE9PWImJnIucmVnaXN0ZXJPYnNlcnZlcihFLGIsdSksbD1tKGUsZCxp KSxsJiYoaC5wdXNoKGwpLG89bCl9KSxofX0oKSxmdW5jdGlvbigpe2Z1bmN0 aW9uIGUoZSxyKXt2YXIgbj1yLmhhc2gsaT1yLmhhc2hUeXBlcztmb3IodmFy IG8gaW4gbilpZigiSUQiPT09aVtvXSl7dmFyIGE9bltvXTtFbWJlci5JU19C SU5ESU5HLnRlc3Qobyl8fChuW28rIkJpbmRpbmciXT1hLGlbbysiQmluZGlu ZyJdPSJTVFJJTkciLGRlbGV0ZSBuW29dLGRlbGV0ZSBpW29dKX1uLmhhc093 blByb3BlcnR5KCJpZEJpbmRpbmciKSYmKG4uaWQ9dC5nZXQoZSxuLmlkQmlu ZGluZyxyKSxpLmlkPSJTVFJJTkciLGRlbGV0ZSBuLmlkQmluZGluZyxkZWxl dGUgaS5pZEJpbmRpbmcpfXZhciB0PShFbWJlci5nZXQsRW1iZXIuc2V0LEVt YmVyLkhhbmRsZWJhcnMpLHI9L15bYS16XS8sbj0vXnZpZXdcLi87dC5WaWV3 SGVscGVyPUVtYmVyLk9iamVjdC5jcmVhdGUoe3Byb3BlcnRpZXNGcm9tSFRN TE9wdGlvbnM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5oYXNoLHI9ZS5kYXRhLG49 e30saT10WyJjbGFzcyJdLG89ITE7dC5pZCYmKG4uZWxlbWVudElkPXQuaWQs bz0hMCksdC50YWcmJihuLnRhZ05hbWU9dC50YWcsbz0hMCksaSYmKGk9aS5z cGxpdCgiICIpLG4uY2xhc3NOYW1lcz1pLG89ITApLHQuY2xhc3NCaW5kaW5n JiYobi5jbGFzc05hbWVCaW5kaW5ncz10LmNsYXNzQmluZGluZy5zcGxpdCgi ICIpLG89ITApLHQuY2xhc3NOYW1lQmluZGluZ3MmJih2b2lkIDA9PT1uLmNs YXNzTmFtZUJpbmRpbmdzJiYobi5jbGFzc05hbWVCaW5kaW5ncz1bXSksbi5j bGFzc05hbWVCaW5kaW5ncz1uLmNsYXNzTmFtZUJpbmRpbmdzLmNvbmNhdCh0 LmNsYXNzTmFtZUJpbmRpbmdzLnNwbGl0KCIgIikpLG89ITApLHQuYXR0cmli dXRlQmluZGluZ3MmJihuLmF0dHJpYnV0ZUJpbmRpbmdzPW51bGwsbz0hMCks byYmKHQ9RW1iZXIuJC5leHRlbmQoe30sdCksZGVsZXRlIHQuaWQsZGVsZXRl IHQudGFnLGRlbGV0ZSB0WyJjbGFzcyJdLGRlbGV0ZSB0LmNsYXNzQmluZGlu Zyk7dmFyIGE7Zm9yKHZhciBzIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShzKSYm RW1iZXIuSVNfQklORElORy50ZXN0KHMpJiYic3RyaW5nIj09dHlwZW9mIHRb c10mJihhPXRoaXMuY29udGV4dHVhbGl6ZUJpbmRpbmdQYXRoKHRbc10sciks YSYmKHRbc109YSkpO2lmKG4uY2xhc3NOYW1lQmluZGluZ3MpZm9yKHZhciB1 IGluIG4uY2xhc3NOYW1lQmluZGluZ3Mpe3ZhciBsPW4uY2xhc3NOYW1lQmlu ZGluZ3NbdV07aWYoInN0cmluZyI9PXR5cGVvZiBsKXt2YXIgYz1FbWJlci5W aWV3Ll9wYXJzZVByb3BlcnR5UGF0aChsKTthPXRoaXMuY29udGV4dHVhbGl6 ZUJpbmRpbmdQYXRoKGMucGF0aCxyKSxhJiYobi5jbGFzc05hbWVCaW5kaW5n c1t1XT1hK2MuY2xhc3NOYW1lcyl9fXJldHVybiBFbWJlci4kLmV4dGVuZCh0 LG4pfSxjb250ZXh0dWFsaXplQmluZGluZ1BhdGg6ZnVuY3Rpb24oZSx0KXt2 YXIgcj1FbWJlci5IYW5kbGViYXJzLm5vcm1hbGl6ZVBhdGgobnVsbCxlLHQp O3JldHVybiByLmlzS2V5d29yZD8idGVtcGxhdGVEYXRhLmtleXdvcmRzLiIr ZTpFbWJlci5pc0dsb2JhbFBhdGgoZSk/bnVsbDoidGhpcyI9PT1lfHwiIj09 PWU/Il9wYXJlbnRWaWV3LmNvbnRleHQiOiJfcGFyZW50Vmlldy5jb250ZXh0 LiIrZX0saGVscGVyOmZ1bmN0aW9uKGksbyxhKXt2YXIgcyx1PWEuZGF0YSxs PWEuZm47ZShpLGEpLHM9InN0cmluZyI9PXR5cGVvZiBvPyJTVFJJTkciPT09 YS50eXBlc1swXSYmci50ZXN0KG8pJiYhbi50ZXN0KG8pP3Uudmlldy5jb250 YWluZXIubG9va3VwRmFjdG9yeSgidmlldzoiK28pOnQuZ2V0KGksbyxhKTpv O3ZhciBjPXRoaXMucHJvcGVydGllc0Zyb21IVE1MT3B0aW9ucyhhLGkpLGg9 dS52aWV3O2MudGVtcGxhdGVEYXRhPXU7dmFyIG09cy5wcm90bz9zLnByb3Rv KCk6cztsJiYoYy50ZW1wbGF0ZT1sKSxtLmNvbnRyb2xsZXJ8fG0uY29udHJv bGxlckJpbmRpbmd8fGMuY29udHJvbGxlcnx8Yy5jb250cm9sbGVyQmluZGlu Z3x8KGMuX2NvbnRleHQ9aSksaC5hcHBlbmRDaGlsZChzLGMpfX0pLHQucmVn aXN0ZXJIZWxwZXIoInZpZXciLGZ1bmN0aW9uKGUscil7cmV0dXJuIGUmJmUu ZGF0YSYmZS5kYXRhLmlzUmVuZGVyRGF0YSYmKHI9ZSxlPSJFbWJlci5WaWV3 IiksdC5WaWV3SGVscGVyLmhlbHBlcih0aGlzLGUscil9KX0oKSxmdW5jdGlv bigpe3t2YXIgZT1FbWJlci5nZXQsdD1FbWJlci5IYW5kbGViYXJzLmdldDtF bWJlci5TdHJpbmcuZm10fUVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxw ZXIoImNvbGxlY3Rpb24iLGZ1bmN0aW9uKHIsbil7ciYmci5kYXRhJiZyLmRh dGEuaXNSZW5kZXJEYXRhJiYobj1yLHI9dm9pZCAwKTt7dmFyIGksbyxhLHM9 bi5mbix1PW4uZGF0YSxsPW4uaW52ZXJzZTtuLmRhdGEudmlld31yPyhpPXUu a2V5d29yZHMuY29udHJvbGxlcixvPWkmJmkuY29udGFpbmVyLGE9dCh0aGlz LHIsbil8fG8ubG9va3VwRmFjdG9yeSgidmlldzoiK3IpKTphPUVtYmVyLkNv bGxlY3Rpb25WaWV3O3ZhciBjLGgsbT1uLmhhc2gscD17fSxmPWEucHJvdG8o KTttLml0ZW1WaWV3PyhpPXUua2V5d29yZHMuY29udHJvbGxlcixvPWkuY29u dGFpbmVyLGg9by5sb29rdXBGYWN0b3J5KCJ2aWV3OiIrbS5pdGVtVmlldykp Omg9bS5pdGVtVmlld0NsYXNzP3QoZixtLml0ZW1WaWV3Q2xhc3Msbik6Zi5p dGVtVmlld0NsYXNzLGRlbGV0ZSBtLml0ZW1WaWV3Q2xhc3MsZGVsZXRlIG0u aXRlbVZpZXc7Zm9yKHZhciBkIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShkKSYm KGM9ZC5tYXRjaCgvXml0ZW0oLikoLiopJC8pLGMmJiJpdGVtQ29udHJvbGxl ciIhPT1kJiYocFtjWzFdLnRvTG93ZXJDYXNlKCkrY1syXV09bVtkXSxkZWxl dGUgbVtkXSkpO3MmJihwLnRlbXBsYXRlPXMsZGVsZXRlIG4uZm4pO3ZhciBi O2wmJmwhPT1FbWJlci5IYW5kbGViYXJzLlZNLm5vb3A/KGI9ZShmLCJlbXB0 eVZpZXdDbGFzcyIpLGI9Yi5leHRlbmQoe3RlbXBsYXRlOmwsdGFnTmFtZTpw LnRhZ05hbWV9KSk6bS5lbXB0eVZpZXdDbGFzcyYmKGI9dCh0aGlzLG0uZW1w dHlWaWV3Q2xhc3MsbikpLGImJihtLmVtcHR5Vmlldz1iKSxtLmtleXdvcmR8 fChwLl9jb250ZXh0PUVtYmVyLmNvbXB1dGVkLmFsaWFzKCJjb250ZW50Iikp O3ZhciBFPUVtYmVyLkhhbmRsZWJhcnMuVmlld0hlbHBlci5wcm9wZXJ0aWVz RnJvbUhUTUxPcHRpb25zKHtkYXRhOnUsaGFzaDpwfSx0aGlzKTtyZXR1cm4g bS5pdGVtVmlld0NsYXNzPWguZXh0ZW5kKEUpLEVtYmVyLkhhbmRsZWJhcnMu aGVscGVycy52aWV3LmNhbGwodGhpcyxhLG4pfSl9KCksZnVuY3Rpb24oKXt2 YXIgZT1FbWJlci5IYW5kbGViYXJzLmdldDtFbWJlci5IYW5kbGViYXJzLnJl Z2lzdGVySGVscGVyKCJ1bmJvdW5kIixmdW5jdGlvbih0LHIpe3ZhciBuLGks byxhPWFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoLTFdO3JldHVybiBhcmd1 bWVudHMubGVuZ3RoPjI/KGEuZGF0YS5pc1VuYm91bmQ9ITAsbj1FbWJlci5I YW5kbGViYXJzLmhlbHBlcnNbYXJndW1lbnRzWzBdXXx8RW1iZXIuSGFuZGxl YmFycy5oZWxwZXJzLmhlbHBlck1pc3Npbmcsbz1uLmFwcGx5KHRoaXMsQXJy YXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKSxkZWxldGUg YS5kYXRhLmlzVW5ib3VuZCxvKTooaT1yLmNvbnRleHRzJiZyLmNvbnRleHRz Lmxlbmd0aD9yLmNvbnRleHRzWzBdOnRoaXMsZShpLHQscikpfSl9KCksZnVu Y3Rpb24oKXt2YXIgZT0oRW1iZXIuZ2V0LEVtYmVyLkhhbmRsZWJhcnMuZ2V0 KSx0PUVtYmVyLkhhbmRsZWJhcnMubm9ybWFsaXplUGF0aCxyPVtdLnNsaWNl O0VtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImxvZyIsZnVuY3Rp b24oKXt2YXIgbj1yLmNhbGwoYXJndW1lbnRzLDAsLTEpLGk9YXJndW1lbnRz W2FyZ3VtZW50cy5sZW5ndGgtMV0sbz1FbWJlci5Mb2dnZXIubG9nLGE9W10s cz0hMTtzPSEwO2Zvcih2YXIgdT0wO3U8bi5sZW5ndGg7dSsrKXt2YXIgbD1p LnR5cGVzW3VdO2lmKCJJRCIhPT1sJiZzKWEucHVzaChuW3VdKTtlbHNle3Zh ciBjPWkuY29udGV4dHMmJmkuY29udGV4dHNbdV18fHRoaXMsaD10KGMsblt1 XSxpLmRhdGEpOyJ0aGlzIj09PWgucGF0aD9hLnB1c2goaC5yb290KTphLnB1 c2goZShoLnJvb3QsaC5wYXRoLGkpKX19by5hcHBseShvLGEpfSksRW1iZXIu SGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigiZGVidWdnZXIiLGZ1bmN0aW9u KCl7e3ZhciBlPXRoaXM7RW1iZXIuaW5zcGVjdChlKX19KX0oKSxmdW5jdGlv bigpe3t2YXIgZT1FbWJlci5nZXQsdD1FbWJlci5zZXQ7RW1iZXIuU3RyaW5n LmZtdH1FbWJlci5IYW5kbGViYXJzLkVhY2hWaWV3PUVtYmVyLkNvbGxlY3Rp b25WaWV3LmV4dGVuZChFbWJlci5fTWV0YW1vcnBoLHtpbml0OmZ1bmN0aW9u KCl7dmFyIHIsbj1lKHRoaXMsIml0ZW1Db250cm9sbGVyIik7aWYobil7dmFy IGk9ZSh0aGlzLCJjb250cm9sbGVyLmNvbnRhaW5lciIpLmxvb2t1cEZhY3Rv cnkoImNvbnRyb2xsZXI6YXJyYXkiKS5jcmVhdGUoe19pc1ZpcnR1YWw6ITAs cGFyZW50Q29udHJvbGxlcjplKHRoaXMsImNvbnRyb2xsZXIiKSxpdGVtQ29u dHJvbGxlcjpuLHRhcmdldDplKHRoaXMsImNvbnRyb2xsZXIiKSxfZWFjaFZp ZXc6dGhpc30pO3RoaXMuZGlzYWJsZUNvbnRlbnRPYnNlcnZlcnMoZnVuY3Rp b24oKXt0KHRoaXMsImNvbnRlbnQiLGkpLHI9bmV3IEVtYmVyLkJpbmRpbmco ImNvbnRlbnQiLCJfZWFjaFZpZXcuZGF0YVNvdXJjZSIpLm9uZVdheSgpLHIu Y29ubmVjdChpKX0pLHQodGhpcywiX2FycmF5Q29udHJvbGxlciIsaSl9ZWxz ZSB0aGlzLmRpc2FibGVDb250ZW50T2JzZXJ2ZXJzKGZ1bmN0aW9uKCl7cj1u ZXcgRW1iZXIuQmluZGluZygiY29udGVudCIsImRhdGFTb3VyY2UiKS5vbmVX YXkoKSxyLmNvbm5lY3QodGhpcyl9KTtyZXR1cm4gdGhpcy5fc3VwZXIoKX0s X2Fzc2VydEFycmF5TGlrZTpmdW5jdGlvbigpe30sZGlzYWJsZUNvbnRlbnRP YnNlcnZlcnM6ZnVuY3Rpb24oZSl7RW1iZXIucmVtb3ZlQmVmb3JlT2JzZXJ2 ZXIodGhpcywiY29udGVudCIsbnVsbCwiX2NvbnRlbnRXaWxsQ2hhbmdlIiks RW1iZXIucmVtb3ZlT2JzZXJ2ZXIodGhpcywiY29udGVudCIsbnVsbCwiX2Nv bnRlbnREaWRDaGFuZ2UiKSxlLmNhbGwodGhpcyksRW1iZXIuYWRkQmVmb3Jl T2JzZXJ2ZXIodGhpcywiY29udGVudCIsbnVsbCwiX2NvbnRlbnRXaWxsQ2hh bmdlIiksRW1iZXIuYWRkT2JzZXJ2ZXIodGhpcywiY29udGVudCIsbnVsbCwi X2NvbnRlbnREaWRDaGFuZ2UiKX0saXRlbVZpZXdDbGFzczpFbWJlci5fTWV0 YW1vcnBoVmlldyxlbXB0eVZpZXdDbGFzczpFbWJlci5fTWV0YW1vcnBoVmll dyxjcmVhdGVDaGlsZFZpZXc6ZnVuY3Rpb24ocixuKXtyPXRoaXMuX3N1cGVy KHIsbik7dmFyIGk9ZSh0aGlzLCJrZXl3b3JkIiksbz1lKHIsImNvbnRlbnQi KTtpZihpKXt2YXIgYT1lKHIsInRlbXBsYXRlRGF0YSIpO2E9RW1iZXIuY29w eShhKSxhLmtleXdvcmRzPXIuY2xvbmVLZXl3b3JkcygpLHQociwidGVtcGxh dGVEYXRhIixhKSxhLmtleXdvcmRzW2ldPW99cmV0dXJuIG8mJm8uaXNDb250 cm9sbGVyJiZ0KHIsImNvbnRyb2xsZXIiLG8pLHJ9LGRlc3Ryb3k6ZnVuY3Rp b24oKXtpZih0aGlzLl9zdXBlcigpKXt2YXIgdD1lKHRoaXMsIl9hcnJheUNv bnRyb2xsZXIiKTtyZXR1cm4gdCYmdC5kZXN0cm95KCksdGhpc319fSk7dmFy IHI9RW1iZXIuSGFuZGxlYmFycy5Hcm91cGVkRWFjaD1mdW5jdGlvbihlLHQs cil7dmFyIG49dGhpcyxpPUVtYmVyLkhhbmRsZWJhcnMubm9ybWFsaXplUGF0 aChlLHQsci5kYXRhKTt0aGlzLmNvbnRleHQ9ZSx0aGlzLnBhdGg9dCx0aGlz Lm9wdGlvbnM9cix0aGlzLnRlbXBsYXRlPXIuZm4sdGhpcy5jb250YWluaW5n Vmlldz1yLmRhdGEudmlldyx0aGlzLm5vcm1hbGl6ZWRSb290PWkucm9vdCx0 aGlzLm5vcm1hbGl6ZWRQYXRoPWkucGF0aCx0aGlzLmNvbnRlbnQ9dGhpcy5s b29rdXBDb250ZW50KCksdGhpcy5hZGRDb250ZW50T2JzZXJ2ZXJzKCksdGhp cy5hZGRBcnJheU9ic2VydmVycygpLHRoaXMuY29udGFpbmluZ1ZpZXcub24o IndpbGxDbGVhclJlbmRlciIsZnVuY3Rpb24oKXtuLmRlc3Ryb3koKX0pfTty LnByb3RvdHlwZT17Y29udGVudFdpbGxDaGFuZ2U6ZnVuY3Rpb24oKXt0aGlz LnJlbW92ZUFycmF5T2JzZXJ2ZXJzKCl9LGNvbnRlbnREaWRDaGFuZ2U6ZnVu Y3Rpb24oKXt0aGlzLmNvbnRlbnQ9dGhpcy5sb29rdXBDb250ZW50KCksdGhp cy5hZGRBcnJheU9ic2VydmVycygpLHRoaXMucmVyZW5kZXJDb250YWluaW5n VmlldygpfSxjb250ZW50QXJyYXlXaWxsQ2hhbmdlOkVtYmVyLkssY29udGVu dEFycmF5RGlkQ2hhbmdlOmZ1bmN0aW9uKCl7dGhpcy5yZXJlbmRlckNvbnRh aW5pbmdWaWV3KCl9LGxvb2t1cENvbnRlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4g RW1iZXIuSGFuZGxlYmFycy5nZXQodGhpcy5ub3JtYWxpemVkUm9vdCx0aGlz Lm5vcm1hbGl6ZWRQYXRoLHRoaXMub3B0aW9ucyl9LGFkZEFycmF5T2JzZXJ2 ZXJzOmZ1bmN0aW9uKCl7dGhpcy5jb250ZW50JiZ0aGlzLmNvbnRlbnQuYWRk QXJyYXlPYnNlcnZlcih0aGlzLHt3aWxsQ2hhbmdlOiJjb250ZW50QXJyYXlX aWxsQ2hhbmdlIixkaWRDaGFuZ2U6ImNvbnRlbnRBcnJheURpZENoYW5nZSJ9 KX0scmVtb3ZlQXJyYXlPYnNlcnZlcnM6ZnVuY3Rpb24oKXt0aGlzLmNvbnRl bnQmJnRoaXMuY29udGVudC5yZW1vdmVBcnJheU9ic2VydmVyKHRoaXMse3dp bGxDaGFuZ2U6ImNvbnRlbnRBcnJheVdpbGxDaGFuZ2UiLGRpZENoYW5nZToi Y29udGVudEFycmF5RGlkQ2hhbmdlIn0pfSxhZGRDb250ZW50T2JzZXJ2ZXJz OmZ1bmN0aW9uKCl7RW1iZXIuYWRkQmVmb3JlT2JzZXJ2ZXIodGhpcy5ub3Jt YWxpemVkUm9vdCx0aGlzLm5vcm1hbGl6ZWRQYXRoLHRoaXMsdGhpcy5jb250 ZW50V2lsbENoYW5nZSksRW1iZXIuYWRkT2JzZXJ2ZXIodGhpcy5ub3JtYWxp emVkUm9vdCx0aGlzLm5vcm1hbGl6ZWRQYXRoLHRoaXMsdGhpcy5jb250ZW50 RGlkQ2hhbmdlKX0scmVtb3ZlQ29udGVudE9ic2VydmVyczpmdW5jdGlvbigp e0VtYmVyLnJlbW92ZUJlZm9yZU9ic2VydmVyKHRoaXMubm9ybWFsaXplZFJv b3QsdGhpcy5ub3JtYWxpemVkUGF0aCx0aGlzLmNvbnRlbnRXaWxsQ2hhbmdl KSxFbWJlci5yZW1vdmVPYnNlcnZlcih0aGlzLm5vcm1hbGl6ZWRSb290LHRo aXMubm9ybWFsaXplZFBhdGgsdGhpcy5jb250ZW50RGlkQ2hhbmdlKX0scmVu ZGVyOmZ1bmN0aW9uKCl7aWYodGhpcy5jb250ZW50KXt2YXIgdD10aGlzLmNv bnRlbnQscj1lKHQsImxlbmd0aCIpLG49dGhpcy5vcHRpb25zLmRhdGEsaT10 aGlzLnRlbXBsYXRlO24uaW5zaWRlRWFjaD0hMDtmb3IodmFyIG89MDtyPm87 bysrKWkodC5vYmplY3RBdChvKSx7ZGF0YTpufSl9fSxyZXJlbmRlckNvbnRh aW5pbmdWaWV3OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztFbWJlci5ydW4uc2No ZWR1bGVPbmNlKCJyZW5kZXIiLHRoaXMsZnVuY3Rpb24oKXtlLmRlc3Ryb3ll ZHx8ZS5jb250YWluaW5nVmlldy5yZXJlbmRlcigpfSl9LGRlc3Ryb3k6ZnVu Y3Rpb24oKXt0aGlzLnJlbW92ZUNvbnRlbnRPYnNlcnZlcnMoKSx0aGlzLmNv bnRlbnQmJnRoaXMucmVtb3ZlQXJyYXlPYnNlcnZlcnMoKSx0aGlzLmRlc3Ry b3llZD0hMH19LEVtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoImVh Y2giLGZ1bmN0aW9uKGUsdCl7aWYoND09PWFyZ3VtZW50cy5sZW5ndGgpe3Zh ciByPWFyZ3VtZW50c1swXTt0PWFyZ3VtZW50c1szXSxlPWFyZ3VtZW50c1sy XSwiIj09PWUmJihlPSJ0aGlzIiksdC5oYXNoLmtleXdvcmQ9cn1yZXR1cm4g MT09PWFyZ3VtZW50cy5sZW5ndGgmJih0PWUsZT0idGhpcyIpLHQuaGFzaC5k YXRhU291cmNlQmluZGluZz1lLCF0LmRhdGEuaW5zaWRlR3JvdXB8fHQuaGFz aC5ncm91cGVkUm93c3x8dC5oYXNoLml0ZW1WaWV3Q2xhc3M/RW1iZXIuSGFu ZGxlYmFycy5oZWxwZXJzLmNvbGxlY3Rpb24uY2FsbCh0aGlzLCJFbWJlci5I YW5kbGViYXJzLkVhY2hWaWV3Iix0KToobmV3IEVtYmVyLkhhbmRsZWJhcnMu R3JvdXBlZEVhY2godGhpcyxlLHQpLnJlbmRlcigpLHZvaWQgMCl9KX0oKSxm dW5jdGlvbigpe0VtYmVyLkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoInRl bXBsYXRlIixmdW5jdGlvbigpe3JldHVybiBFbWJlci5IYW5kbGViYXJzLmhl bHBlcnMucGFydGlhbC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX0oKSxmdW5j dGlvbigpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIUVtYmVyLmlzTm9uZShlKX1m dW5jdGlvbiB0KGUsdCxyKXt2YXIgbj10LnNwbGl0KCIvIiksaT1uW24ubGVu Z3RoLTFdO25bbi5sZW5ndGgtMV09Il8iK2k7dmFyIG89ci5kYXRhLnZpZXcs YT1uLmpvaW4oIi8iKSxzPW8udGVtcGxhdGVGb3JOYW1lKGEpLHU9IXMmJm8u dGVtcGxhdGVGb3JOYW1lKHQpOyhzPXN8fHUpKGUse2RhdGE6ci5kYXRhfSl9 RW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigicGFydGlhbCIsZnVu Y3Rpb24ocixuKXt2YXIgaT1uLmNvbnRleHRzJiZuLmNvbnRleHRzLmxlbmd0 aD9uLmNvbnRleHRzWzBdOnRoaXM7cmV0dXJuIklEIj09PW4udHlwZXNbMF0/ KG4uZm49ZnVuY3Rpb24oZSxuKXt2YXIgaT1FbWJlci5IYW5kbGViYXJzLmdl dChlLHIsbik7dChlLGksbil9LEVtYmVyLkhhbmRsZWJhcnMuYmluZC5jYWxs KGkscixuLCEwLGUpKToodChpLHIsbiksdm9pZCAwKX0pfSgpLGZ1bmN0aW9u KCl7e3ZhciBlPUVtYmVyLmdldDtFbWJlci5zZXR9RW1iZXIuSGFuZGxlYmFy cy5yZWdpc3RlckhlbHBlcigieWllbGQiLGZ1bmN0aW9uKHQpe2Zvcih2YXIg cj10LmRhdGEudmlldztyJiYhZShyLCJsYXlvdXQiKTspcj1yLl9jb250ZXh0 Vmlldz9yLl9jb250ZXh0VmlldzplKHIsInBhcmVudFZpZXciKTtyLl95aWVs ZCh0aGlzLHQpfSl9KCksZnVuY3Rpb24oKXtFbWJlci5IYW5kbGViYXJzLnJl Z2lzdGVySGVscGVyKCJsb2MiLGZ1bmN0aW9uKGUpe3JldHVybiBFbWJlci5T dHJpbmcubG9jKGUpfSl9KCksZnVuY3Rpb24oKXt7dmFyIGU9RW1iZXIuc2V0 O0VtYmVyLmdldH1FbWJlci5DaGVja2JveD1FbWJlci5WaWV3LmV4dGVuZCh7 Y2xhc3NOYW1lczpbImVtYmVyLWNoZWNrYm94Il0sdGFnTmFtZToiaW5wdXQi LGF0dHJpYnV0ZUJpbmRpbmdzOlsidHlwZSIsImNoZWNrZWQiLCJpbmRldGVy bWluYXRlIiwiZGlzYWJsZWQiLCJ0YWJpbmRleCIsIm5hbWUiLCJhdXRvZm9j dXMiLCJmb3JtIl0sdHlwZToiY2hlY2tib3giLGNoZWNrZWQ6ITEsZGlzYWJs ZWQ6ITEsaW5kZXRlcm1pbmF0ZTohMSxpbml0OmZ1bmN0aW9uKCl7dGhpcy5f c3VwZXIoKSx0aGlzLm9uKCJjaGFuZ2UiLHRoaXMsdGhpcy5fdXBkYXRlRWxl bWVudFZhbHVlKX0sZGlkSW5zZXJ0RWxlbWVudDpmdW5jdGlvbigpe3RoaXMu X3N1cGVyKCksdGhpcy5nZXQoImVsZW1lbnQiKS5pbmRldGVybWluYXRlPSEh dGhpcy5nZXQoImluZGV0ZXJtaW5hdGUiKX0sX3VwZGF0ZUVsZW1lbnRWYWx1 ZTpmdW5jdGlvbigpe2UodGhpcywiY2hlY2tlZCIsdGhpcy4kKCkucHJvcCgi Y2hlY2tlZCIpKX19KX0oKSxmdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSxyLG4p e3ZhciBpPXQocixlKSxvPXQociwib25FdmVudCIpLGE9dChyLCJ2YWx1ZSIp OyhvPT09ZXx8ImtleVByZXNzIj09PW8mJiJrZXktcHJlc3MiPT09ZSkmJnIu c2VuZEFjdGlvbigiYWN0aW9uIixhKSxyLnNlbmRBY3Rpb24oZSxhKSwoaXx8 bz09PWUpJiYodChyLCJidWJibGVzIil8fG4uc3RvcFByb3BhZ2F0aW9uKCkp fXZhciB0PUVtYmVyLmdldCxyPUVtYmVyLnNldDtFbWJlci5UZXh0U3VwcG9y dD1FbWJlci5NaXhpbi5jcmVhdGUoRW1iZXIuVGFyZ2V0QWN0aW9uU3VwcG9y dCx7dmFsdWU6IiIsYXR0cmlidXRlQmluZGluZ3M6WyJwbGFjZWhvbGRlciIs ImRpc2FibGVkIiwibWF4bGVuZ3RoIiwidGFiaW5kZXgiLCJyZWFkb25seSIs ImF1dG9mb2N1cyIsImZvcm0iLCJzZWxlY3Rpb25EaXJlY3Rpb24iLCJzcGVs bGNoZWNrIiwicmVxdWlyZWQiXSxwbGFjZWhvbGRlcjpudWxsLGRpc2FibGVk OiExLG1heGxlbmd0aDpudWxsLGluaXQ6ZnVuY3Rpb24oKXt0aGlzLl9zdXBl cigpLHRoaXMub24oImZvY3VzT3V0Iix0aGlzLHRoaXMuX2VsZW1lbnRWYWx1 ZURpZENoYW5nZSksdGhpcy5vbigiY2hhbmdlIix0aGlzLHRoaXMuX2VsZW1l bnRWYWx1ZURpZENoYW5nZSksdGhpcy5vbigicGFzdGUiLHRoaXMsdGhpcy5f ZWxlbWVudFZhbHVlRGlkQ2hhbmdlKSx0aGlzLm9uKCJjdXQiLHRoaXMsdGhp cy5fZWxlbWVudFZhbHVlRGlkQ2hhbmdlKSx0aGlzLm9uKCJpbnB1dCIsdGhp cyx0aGlzLl9lbGVtZW50VmFsdWVEaWRDaGFuZ2UpLHRoaXMub24oImtleVVw Iix0aGlzLHRoaXMuaW50ZXJwcmV0S2V5RXZlbnRzKX0sYWN0aW9uOm51bGws b25FdmVudDoiZW50ZXIiLGJ1YmJsZXM6ITEsaW50ZXJwcmV0S2V5RXZlbnRz OmZ1bmN0aW9uKGUpe3ZhciB0PUVtYmVyLlRleHRTdXBwb3J0LktFWV9FVkVO VFMscj10W2Uua2V5Q29kZV07cmV0dXJuIHRoaXMuX2VsZW1lbnRWYWx1ZURp ZENoYW5nZSgpLHI/dGhpc1tyXShlKTp2b2lkIDB9LF9lbGVtZW50VmFsdWVE aWRDaGFuZ2U6ZnVuY3Rpb24oKXtyKHRoaXMsInZhbHVlIix0aGlzLiQoKS52 YWwoKSl9LGluc2VydE5ld2xpbmU6ZnVuY3Rpb24odCl7ZSgiZW50ZXIiLHRo aXMsdCksZSgiaW5zZXJ0LW5ld2xpbmUiLHRoaXMsdCl9LGNhbmNlbDpmdW5j dGlvbih0KXtlKCJlc2NhcGUtcHJlc3MiLHRoaXMsdCl9LGZvY3VzSW46ZnVu Y3Rpb24odCl7ZSgiZm9jdXMtaW4iLHRoaXMsdCl9LGZvY3VzT3V0OmZ1bmN0 aW9uKHQpe2UoImZvY3VzLW91dCIsdGhpcyx0KX0sa2V5UHJlc3M6ZnVuY3Rp b24odCl7ZSgia2V5LXByZXNzIix0aGlzLHQpfX0pLEVtYmVyLlRleHRTdXBw b3J0LktFWV9FVkVOVFM9ezEzOiJpbnNlcnROZXdsaW5lIiwyNzoiY2FuY2Vs In19KCksZnVuY3Rpb24oKXtFbWJlci5nZXQsRW1iZXIuc2V0O0VtYmVyLlRl eHRGaWVsZD1FbWJlci5Db21wb25lbnQuZXh0ZW5kKEVtYmVyLlRleHRTdXBw b3J0LHtjbGFzc05hbWVzOlsiZW1iZXItdGV4dC1maWVsZCJdLHRhZ05hbWU6 ImlucHV0IixhdHRyaWJ1dGVCaW5kaW5nczpbInR5cGUiLCJ2YWx1ZSIsInNp emUiLCJwYXR0ZXJuIiwibmFtZSIsIm1pbiIsIm1heCIsImFjY2VwdCIsImF1 dG9jb21wbGV0ZSIsImF1dG9zYXZlIiwiZm9ybWFjdGlvbiIsImZvcm1lbmN0 eXBlIiwiZm9ybW1ldGhvZCIsImZvcm1ub3ZhbGlkYXRlIiwiZm9ybXRhcmdl dCIsImhlaWdodCIsImlucHV0bW9kZSIsImxpc3QiLCJtdWx0aXBsZSIsInBh dHRlcm4iLCJzdGVwIiwid2lkdGgiXSx2YWx1ZToiIix0eXBlOiJ0ZXh0Iixz aXplOm51bGwscGF0dGVybjpudWxsLG1pbjpudWxsLG1heDpudWxsfSl9KCks ZnVuY3Rpb24oKXt7dmFyIGU9RW1iZXIuZ2V0O0VtYmVyLnNldH1FbWJlci5U ZXh0QXJlYT1FbWJlci5Db21wb25lbnQuZXh0ZW5kKEVtYmVyLlRleHRTdXBw b3J0LHtjbGFzc05hbWVzOlsiZW1iZXItdGV4dC1hcmVhIl0sdGFnTmFtZToi dGV4dGFyZWEiLGF0dHJpYnV0ZUJpbmRpbmdzOlsicm93cyIsImNvbHMiLCJu YW1lIiwic2VsZWN0aW9uRW5kIiwic2VsZWN0aW9uU3RhcnQiLCJ3cmFwIl0s cm93czpudWxsLGNvbHM6bnVsbCxfdXBkYXRlRWxlbWVudFZhbHVlOkVtYmVy Lm9ic2VydmVyKCJ2YWx1ZSIsZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMsInZh bHVlIikscj10aGlzLiQoKTtyJiZ0IT09ci52YWwoKSYmci52YWwodCl9KSxp bml0OmZ1bmN0aW9uKCl7dGhpcy5fc3VwZXIoKSx0aGlzLm9uKCJkaWRJbnNl cnRFbGVtZW50Iix0aGlzLHRoaXMuX3VwZGF0ZUVsZW1lbnRWYWx1ZSl9fSl9 KCksZnVuY3Rpb24oKXt7dmFyIGU9RW1iZXIuc2V0LHQ9RW1iZXIuZ2V0LHI9 RW1iZXIuRW51bWVyYWJsZVV0aWxzLmluZGV4T2Ysbj1FbWJlci5FbnVtZXJh YmxlVXRpbHMuaW5kZXhlc09mLGk9RW1iZXIuRW51bWVyYWJsZVV0aWxzLmZv ckVhY2gsbz1FbWJlci5FbnVtZXJhYmxlVXRpbHMucmVwbGFjZSxhPUVtYmVy LmlzQXJyYXk7RW1iZXIuSGFuZGxlYmFycy5jb21waWxlfUVtYmVyLlNlbGVj dE9wdGlvbj1FbWJlci5WaWV3LmV4dGVuZCh7dGFnTmFtZToib3B0aW9uIixh dHRyaWJ1dGVCaW5kaW5nczpbInZhbHVlIiwic2VsZWN0ZWQiXSxkZWZhdWx0 VGVtcGxhdGU6ZnVuY3Rpb24oZSx0KXt0PXtkYXRhOnQuZGF0YSxoYXNoOnt9 fSxFbWJlci5IYW5kbGViYXJzLmhlbHBlcnMuYmluZC5jYWxsKGUsInZpZXcu bGFiZWwiLHQpfSxpbml0OmZ1bmN0aW9uKCl7dGhpcy5sYWJlbFBhdGhEaWRD aGFuZ2UoKSx0aGlzLnZhbHVlUGF0aERpZENoYW5nZSgpLHRoaXMuX3N1cGVy KCkKfSxzZWxlY3RlZDpFbWJlci5jb21wdXRlZChmdW5jdGlvbigpe3ZhciBl PXQodGhpcywiY29udGVudCIpLG49dCh0aGlzLCJwYXJlbnRWaWV3LnNlbGVj dGlvbiIpO3JldHVybiB0KHRoaXMsInBhcmVudFZpZXcubXVsdGlwbGUiKT9u JiZyKG4sZS52YWx1ZU9mKCkpPi0xOmU9PW59KS5wcm9wZXJ0eSgiY29udGVu dCIsInBhcmVudFZpZXcuc2VsZWN0aW9uIiksbGFiZWxQYXRoRGlkQ2hhbmdl OkVtYmVyLm9ic2VydmVyKCJwYXJlbnRWaWV3Lm9wdGlvbkxhYmVsUGF0aCIs ZnVuY3Rpb24oKXt2YXIgZT10KHRoaXMsInBhcmVudFZpZXcub3B0aW9uTGFi ZWxQYXRoIik7ZSYmRW1iZXIuZGVmaW5lUHJvcGVydHkodGhpcywibGFiZWwi LEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCl7cmV0dXJuIHQodGhpcyxlKX0p LnByb3BlcnR5KGUpKX0pLHZhbHVlUGF0aERpZENoYW5nZTpFbWJlci5vYnNl cnZlcigicGFyZW50Vmlldy5vcHRpb25WYWx1ZVBhdGgiLGZ1bmN0aW9uKCl7 dmFyIGU9dCh0aGlzLCJwYXJlbnRWaWV3Lm9wdGlvblZhbHVlUGF0aCIpO2Um JkVtYmVyLmRlZmluZVByb3BlcnR5KHRoaXMsInZhbHVlIixFbWJlci5jb21w dXRlZChmdW5jdGlvbigpe3JldHVybiB0KHRoaXMsZSl9KS5wcm9wZXJ0eShl KSl9KX0pLEVtYmVyLlNlbGVjdE9wdGdyb3VwPUVtYmVyLkNvbGxlY3Rpb25W aWV3LmV4dGVuZCh7dGFnTmFtZToib3B0Z3JvdXAiLGF0dHJpYnV0ZUJpbmRp bmdzOlsibGFiZWwiXSxzZWxlY3Rpb25CaW5kaW5nOiJwYXJlbnRWaWV3LnNl bGVjdGlvbiIsbXVsdGlwbGVCaW5kaW5nOiJwYXJlbnRWaWV3Lm11bHRpcGxl IixvcHRpb25MYWJlbFBhdGhCaW5kaW5nOiJwYXJlbnRWaWV3Lm9wdGlvbkxh YmVsUGF0aCIsb3B0aW9uVmFsdWVQYXRoQmluZGluZzoicGFyZW50Vmlldy5v cHRpb25WYWx1ZVBhdGgiLGl0ZW1WaWV3Q2xhc3NCaW5kaW5nOiJwYXJlbnRW aWV3Lm9wdGlvblZpZXcifSksRW1iZXIuU2VsZWN0PUVtYmVyLlZpZXcuZXh0 ZW5kKHt0YWdOYW1lOiJzZWxlY3QiLGNsYXNzTmFtZXM6WyJlbWJlci1zZWxl Y3QiXSxkZWZhdWx0VGVtcGxhdGU6RW1iZXIuSGFuZGxlYmFycy50ZW1wbGF0 ZShmdW5jdGlvbihlLHQscixuLGkpe2Z1bmN0aW9uIG8oZSx0KXt2YXIgbixp PSIiO3JldHVybiB0LmJ1ZmZlci5wdXNoKCc8b3B0aW9uIHZhbHVlPSIiPicp LG49ci5fdHJpYWdlTXVzdGFjaGUuY2FsbChlLCJ2aWV3LnByb21wdCIse2hh c2g6e30saGFzaFR5cGVzOnt9LGhhc2hDb250ZXh0czp7fSxjb250ZXh0czpb ZV0sdHlwZXM6WyJJRCJdLGRhdGE6dH0pLChufHwwPT09bikmJnQuYnVmZmVy LnB1c2gobiksdC5idWZmZXIucHVzaCgiPC9vcHRpb24+IiksaX1mdW5jdGlv biBhKGUsdCl7dmFyIG47bj1yLmVhY2guY2FsbChlLCJ2aWV3Lmdyb3VwZWRD b250ZW50Iix7aGFzaDp7fSxoYXNoVHlwZXM6e30saGFzaENvbnRleHRzOnt9 LGludmVyc2U6cC5ub29wLGZuOnAucHJvZ3JhbSg0LHMsdCksY29udGV4dHM6 W2VdLHR5cGVzOlsiSUQiXSxkYXRhOnR9KSxufHwwPT09bj90LmJ1ZmZlci5w dXNoKG4pOnQuYnVmZmVyLnB1c2goIiIpfWZ1bmN0aW9uIHMoZSx0KXt0LmJ1 ZmZlci5wdXNoKG0oci52aWV3LmNhbGwoZSwidmlldy5ncm91cFZpZXciLHto YXNoOntjb250ZW50OiJjb250ZW50IixsYWJlbDoibGFiZWwifSxoYXNoVHlw ZXM6e2NvbnRlbnQ6IklEIixsYWJlbDoiSUQifSxoYXNoQ29udGV4dHM6e2Nv bnRlbnQ6ZSxsYWJlbDplfSxjb250ZXh0czpbZV0sdHlwZXM6WyJJRCJdLGRh dGE6dH0pKSl9ZnVuY3Rpb24gdShlLHQpe3ZhciBuO249ci5lYWNoLmNhbGwo ZSwidmlldy5jb250ZW50Iix7aGFzaDp7fSxoYXNoVHlwZXM6e30saGFzaENv bnRleHRzOnt9LGludmVyc2U6cC5ub29wLGZuOnAucHJvZ3JhbSg3LGwsdCks Y29udGV4dHM6W2VdLHR5cGVzOlsiSUQiXSxkYXRhOnR9KSxufHwwPT09bj90 LmJ1ZmZlci5wdXNoKG4pOnQuYnVmZmVyLnB1c2goIiIpfWZ1bmN0aW9uIGwo ZSx0KXt0LmJ1ZmZlci5wdXNoKG0oci52aWV3LmNhbGwoZSwidmlldy5vcHRp b25WaWV3Iix7aGFzaDp7Y29udGVudDoiIn0saGFzaFR5cGVzOntjb250ZW50 OiJJRCJ9LGhhc2hDb250ZXh0czp7Y29udGVudDplfSxjb250ZXh0czpbZV0s dHlwZXM6WyJJRCJdLGRhdGE6dH0pKSl9dGhpcy5jb21waWxlckluZm89WzQs Ij49IDEuMC4wIl0scj10aGlzLm1lcmdlKHIsRW1iZXIuSGFuZGxlYmFycy5o ZWxwZXJzKSxpPWl8fHt9O3ZhciBjLGg9IiIsbT10aGlzLmVzY2FwZUV4cHJl c3Npb24scD10aGlzO3JldHVybiBjPXJbImlmIl0uY2FsbCh0LCJ2aWV3LnBy b21wdCIse2hhc2g6e30saGFzaFR5cGVzOnt9LGhhc2hDb250ZXh0czp7fSxp bnZlcnNlOnAubm9vcCxmbjpwLnByb2dyYW0oMSxvLGkpLGNvbnRleHRzOlt0 XSx0eXBlczpbIklEIl0sZGF0YTppfSksKGN8fDA9PT1jKSYmaS5idWZmZXIu cHVzaChjKSxjPXJbImlmIl0uY2FsbCh0LCJ2aWV3Lm9wdGlvbkdyb3VwUGF0 aCIse2hhc2g6e30saGFzaFR5cGVzOnt9LGhhc2hDb250ZXh0czp7fSxpbnZl cnNlOnAucHJvZ3JhbSg2LHUsaSksZm46cC5wcm9ncmFtKDMsYSxpKSxjb250 ZXh0czpbdF0sdHlwZXM6WyJJRCJdLGRhdGE6aX0pLChjfHwwPT09YykmJmku YnVmZmVyLnB1c2goYyksaH0pLGF0dHJpYnV0ZUJpbmRpbmdzOlsibXVsdGlw bGUiLCJkaXNhYmxlZCIsInRhYmluZGV4IiwibmFtZSIsInJlcXVpcmVkIiwi YXV0b2ZvY3VzIiwiZm9ybSIsInNpemUiXSxtdWx0aXBsZTohMSxkaXNhYmxl ZDohMSxyZXF1aXJlZDohMSxjb250ZW50Om51bGwsc2VsZWN0aW9uOm51bGws dmFsdWU6RW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oZSxyKXtpZigyPT09YXJn dW1lbnRzLmxlbmd0aClyZXR1cm4gcjt2YXIgbj10KHRoaXMsIm9wdGlvblZh bHVlUGF0aCIpLnJlcGxhY2UoL15jb250ZW50XC4/LywiIik7cmV0dXJuIG4/ dCh0aGlzLCJzZWxlY3Rpb24uIituKTp0KHRoaXMsInNlbGVjdGlvbiIpfSku cHJvcGVydHkoInNlbGVjdGlvbiIpLHByb21wdDpudWxsLG9wdGlvbkxhYmVs UGF0aDoiY29udGVudCIsb3B0aW9uVmFsdWVQYXRoOiJjb250ZW50IixvcHRp b25Hcm91cFBhdGg6bnVsbCxncm91cFZpZXc6RW1iZXIuU2VsZWN0T3B0Z3Jv dXAsZ3JvdXBlZENvbnRlbnQ6RW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKXt2 YXIgZT10KHRoaXMsIm9wdGlvbkdyb3VwUGF0aCIpLHI9RW1iZXIuQSgpLG49 dCh0aGlzLCJjb250ZW50Iil8fFtdO3JldHVybiBpKG4sZnVuY3Rpb24obil7 dmFyIGk9dChuLGUpO3QociwibGFzdE9iamVjdC5sYWJlbCIpIT09aSYmci5w dXNoT2JqZWN0KHtsYWJlbDppLGNvbnRlbnQ6RW1iZXIuQSgpfSksdChyLCJs YXN0T2JqZWN0LmNvbnRlbnQiKS5wdXNoKG4pfSkscn0pLnByb3BlcnR5KCJv cHRpb25Hcm91cFBhdGgiLCJjb250ZW50LkBlYWNoIiksb3B0aW9uVmlldzpF bWJlci5TZWxlY3RPcHRpb24sX2NoYW5nZTpmdW5jdGlvbigpe3QodGhpcywi bXVsdGlwbGUiKT90aGlzLl9jaGFuZ2VNdWx0aXBsZSgpOnRoaXMuX2NoYW5n ZVNpbmdsZSgpfSxzZWxlY3Rpb25EaWRDaGFuZ2U6RW1iZXIub2JzZXJ2ZXIo InNlbGVjdGlvbi5AZWFjaCIsZnVuY3Rpb24oKXt2YXIgcj10KHRoaXMsInNl bGVjdGlvbiIpO2lmKHQodGhpcywibXVsdGlwbGUiKSl7aWYoIWEocikpcmV0 dXJuIGUodGhpcywic2VsZWN0aW9uIixFbWJlci5BKFtyXSkpLHZvaWQgMDt0 aGlzLl9zZWxlY3Rpb25EaWRDaGFuZ2VNdWx0aXBsZSgpfWVsc2UgdGhpcy5f c2VsZWN0aW9uRGlkQ2hhbmdlU2luZ2xlKCl9KSx2YWx1ZURpZENoYW5nZTpF bWJlci5vYnNlcnZlcigidmFsdWUiLGZ1bmN0aW9uKCl7dmFyIGUscj10KHRo aXMsImNvbnRlbnQiKSxuPXQodGhpcywidmFsdWUiKSxpPXQodGhpcywib3B0 aW9uVmFsdWVQYXRoIikucmVwbGFjZSgvXmNvbnRlbnRcLj8vLCIiKSxvPWk/ dCh0aGlzLCJzZWxlY3Rpb24uIitpKTp0KHRoaXMsInNlbGVjdGlvbiIpO24h PT1vJiYoZT1yP3IuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gbj09PShpP3Qo ZSxpKTplKX0pOm51bGwsdGhpcy5zZXQoInNlbGVjdGlvbiIsZSkpfSksX3Ry aWdnZXJDaGFuZ2U6ZnVuY3Rpb24oKXt2YXIgZT10KHRoaXMsInNlbGVjdGlv biIpLHI9dCh0aGlzLCJ2YWx1ZSIpO0VtYmVyLmlzTm9uZShlKXx8dGhpcy5z ZWxlY3Rpb25EaWRDaGFuZ2UoKSxFbWJlci5pc05vbmUocil8fHRoaXMudmFs dWVEaWRDaGFuZ2UoKSx0aGlzLl9jaGFuZ2UoKX0sX2NoYW5nZVNpbmdsZTpm dW5jdGlvbigpe3ZhciByPXRoaXMuJCgpWzBdLnNlbGVjdGVkSW5kZXgsbj10 KHRoaXMsImNvbnRlbnQiKSxpPXQodGhpcywicHJvbXB0Iik7aWYobiYmdChu LCJsZW5ndGgiKSl7aWYoaSYmMD09PXIpcmV0dXJuIGUodGhpcywic2VsZWN0 aW9uIixudWxsKSx2b2lkIDA7aSYmKHItPTEpLGUodGhpcywic2VsZWN0aW9u IixuLm9iamVjdEF0KHIpKX19LF9jaGFuZ2VNdWx0aXBsZTpmdW5jdGlvbigp e3ZhciByPXRoaXMuJCgib3B0aW9uOnNlbGVjdGVkIiksbj10KHRoaXMsInBy b21wdCIpLGk9bj8xOjAscz10KHRoaXMsImNvbnRlbnQiKSx1PXQodGhpcywi c2VsZWN0aW9uIik7aWYocyYmcil7dmFyIGw9ci5tYXAoZnVuY3Rpb24oKXty ZXR1cm4gdGhpcy5pbmRleC1pfSkudG9BcnJheSgpLGM9cy5vYmplY3RzQXQo bCk7YSh1KT9vKHUsMCx0KHUsImxlbmd0aCIpLGMpOmUodGhpcywic2VsZWN0 aW9uIixjKX19LF9zZWxlY3Rpb25EaWRDaGFuZ2VTaW5nbGU6ZnVuY3Rpb24o KXt2YXIgZT10aGlzLmdldCgiZWxlbWVudCIpO2lmKGUpe3ZhciBuPXQodGhp cywiY29udGVudCIpLGk9dCh0aGlzLCJzZWxlY3Rpb24iKSxvPW4/cihuLGkp Oi0xLGE9dCh0aGlzLCJwcm9tcHQiKTthJiYobys9MSksZSYmKGUuc2VsZWN0 ZWRJbmRleD1vKX19LF9zZWxlY3Rpb25EaWRDaGFuZ2VNdWx0aXBsZTpmdW5j dGlvbigpe3ZhciBlLGk9dCh0aGlzLCJjb250ZW50Iiksbz10KHRoaXMsInNl bGVjdGlvbiIpLGE9aT9uKGksbyk6Wy0xXSxzPXQodGhpcywicHJvbXB0Iiks dT1zPzE6MCxsPXRoaXMuJCgib3B0aW9uIik7bCYmbC5lYWNoKGZ1bmN0aW9u KCl7ZT10aGlzLmluZGV4Pi0xP3RoaXMuaW5kZXgtdTotMSx0aGlzLnNlbGVj dGVkPXIoYSxlKT4tMX0pfSxpbml0OmZ1bmN0aW9uKCl7dGhpcy5fc3VwZXIo KSx0aGlzLm9uKCJkaWRJbnNlcnRFbGVtZW50Iix0aGlzLHRoaXMuX3RyaWdn ZXJDaGFuZ2UpLHRoaXMub24oImNoYW5nZSIsdGhpcyx0aGlzLl9jaGFuZ2Up fX0pfSgpLGZ1bmN0aW9uKCl7RW1iZXIuSGFuZGxlYmFycy5yZWdpc3Rlckhl bHBlcigiaW5wdXQiLGZ1bmN0aW9uKGUpe3ZhciB0PWUuaGFzaCxyPShlLmhh c2hUeXBlcyx0LnR5cGUpLG49dC5vbjtyZXR1cm4gZGVsZXRlIHQudHlwZSxk ZWxldGUgdC5vbiwiY2hlY2tib3giPT09cj9FbWJlci5IYW5kbGViYXJzLmhl bHBlcnMudmlldy5jYWxsKHRoaXMsRW1iZXIuQ2hlY2tib3gsZSk6KHImJih0 LnR5cGU9ciksdC5vbkV2ZW50PW58fCJlbnRlciIsRW1iZXIuSGFuZGxlYmFy cy5oZWxwZXJzLnZpZXcuY2FsbCh0aGlzLEVtYmVyLlRleHRGaWVsZCxlKSl9 KSxFbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJ0ZXh0YXJlYSIs ZnVuY3Rpb24oZSl7ZS5oYXNoLGUuaGFzaFR5cGVzO3JldHVybiBFbWJlci5I YW5kbGViYXJzLmhlbHBlcnMudmlldy5jYWxsKHRoaXMsRW1iZXIuVGV4dEFy ZWEsZSl9KX0oKSxmdW5jdGlvbigpe0VtYmVyLkNvbXBvbmVudExvb2t1cD1F bWJlci5PYmplY3QuZXh0ZW5kKHtsb29rdXBGYWN0b3J5OmZ1bmN0aW9uKGUs dCl7dD10fHx0aGlzLmNvbnRhaW5lcjt2YXIgcj0iY29tcG9uZW50OiIrZSxu PSJ0ZW1wbGF0ZTpjb21wb25lbnRzLyIrZSxpPXQmJnQuaGFzKG4pO2kmJnQu aW5qZWN0aW9uKHIsImxheW91dCIsbik7dmFyIG89dC5sb29rdXBGYWN0b3J5 KHIpO3JldHVybiBpfHxvPyhvfHwodC5yZWdpc3RlcihyLEVtYmVyLkNvbXBv bmVudCksbz10Lmxvb2t1cEZhY3RvcnkocikpLG8pOnZvaWQgMH19KX0oKSxm dW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtFbWJlci5IYW5kbGViYXJzLmJvb3Rz dHJhcChFbWJlci4kKGRvY3VtZW50KSl9ZnVuY3Rpb24gdChlKXtlLnJlZ2lz dGVyKCJjb21wb25lbnQtbG9va3VwOm1haW4iLEVtYmVyLkNvbXBvbmVudExv b2t1cCl9RW1iZXIuSGFuZGxlYmFycy5ib290c3RyYXA9ZnVuY3Rpb24oZSl7 dmFyIHQ9J3NjcmlwdFt0eXBlPSJ0ZXh0L3gtaGFuZGxlYmFycyJdLCBzY3Jp cHRbdHlwZT0idGV4dC94LXJhdy1oYW5kbGViYXJzIl0nO0VtYmVyLiQodCxl KS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9RW1iZXIuJCh0aGlzKSx0PSJ0ZXh0 L3gtcmF3LWhhbmRsZWJhcnMiPT09ZS5hdHRyKCJ0eXBlIik/RW1iZXIuJC5w cm94eShIYW5kbGViYXJzLmNvbXBpbGUsSGFuZGxlYmFycyk6RW1iZXIuJC5w cm94eShFbWJlci5IYW5kbGViYXJzLmNvbXBpbGUsRW1iZXIuSGFuZGxlYmFy cykscj1lLmF0dHIoImRhdGEtdGVtcGxhdGUtbmFtZSIpfHxlLmF0dHIoImlk Iil8fCJhcHBsaWNhdGlvbiIsbj10KGUuaHRtbCgpKTtpZih2b2lkIDAhPT1F bWJlci5URU1QTEFURVNbcl0pdGhyb3cgbmV3IEVtYmVyLkVycm9yKCdUZW1w bGF0ZSBuYW1lZCAiJytyKyciIGFscmVhZHkgZXhpc3RzLicpO0VtYmVyLlRF TVBMQVRFU1tyXT1uLGUucmVtb3ZlKCl9KX0sRW1iZXIub25Mb2FkKCJFbWJl ci5BcHBsaWNhdGlvbiIsZnVuY3Rpb24ocil7ci5pbml0aWFsaXplcih7bmFt ZToiZG9tVGVtcGxhdGVzIixpbml0aWFsaXplOmV9KSxyLmluaXRpYWxpemVy KHtuYW1lOiJyZWdpc3RlckNvbXBvbmVudExvb2t1cCIsYWZ0ZXI6ImRvbVRl bXBsYXRlcyIsaW5pdGlhbGl6ZTp0fSl9KX0oKSxmdW5jdGlvbigpe0VtYmVy LnJ1bkxvYWRIb29rcygiRW1iZXIuSGFuZGxlYmFycyIsRW1iZXIuSGFuZGxl YmFycyl9KCksZnVuY3Rpb24oKXtlKCJyb3V0ZS1yZWNvZ25pemVyIixbImV4 cG9ydHMiXSxmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdChl KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50 b1N0cmluZy5jYWxsKGUpfWZ1bmN0aW9uIHIoZSl7dGhpcy5zdHJpbmc9ZX1m dW5jdGlvbiBuKGUpe3RoaXMubmFtZT1lfWZ1bmN0aW9uIGkoZSl7dGhpcy5u YW1lPWV9ZnVuY3Rpb24gbygpe31mdW5jdGlvbiBhKGUsdCxhKXsiLyI9PT1l LmNoYXJBdCgwKSYmKGU9ZS5zdWJzdHIoMSkpO2Zvcih2YXIgcz1lLnNwbGl0 KCIvIiksdT1bXSxsPTAsYz1zLmxlbmd0aDtjPmw7bCsrKXt2YXIgaCxtPXNb bF07KGg9bS5tYXRjaCgvXjooW15cL10rKSQvKSk/KHUucHVzaChuZXcgbiho WzFdKSksdC5wdXNoKGhbMV0pLGEuZHluYW1pY3MrKyk6KGg9bS5tYXRjaCgv XlwqKFteXC9dKykkLykpPyh1LnB1c2gobmV3IGkoaFsxXSkpLHQucHVzaCho WzFdKSxhLnN0YXJzKyspOiIiPT09bT91LnB1c2gobmV3IG8pOih1LnB1c2go bmV3IHIobSkpLGEuc3RhdGljcysrKX1yZXR1cm4gdX1mdW5jdGlvbiBzKGUp e3RoaXMuY2hhclNwZWM9ZSx0aGlzLm5leHRTdGF0ZXM9W119ZnVuY3Rpb24g dShlKXtyZXR1cm4gZS5zb3J0KGZ1bmN0aW9uKGUsdCl7aWYoZS50eXBlcy5z dGFycyE9PXQudHlwZXMuc3RhcnMpcmV0dXJuIGUudHlwZXMuc3RhcnMtdC50 eXBlcy5zdGFycztpZihlLnR5cGVzLnN0YXJzKXtpZihlLnR5cGVzLnN0YXRp Y3MhPT10LnR5cGVzLnN0YXRpY3MpcmV0dXJuIHQudHlwZXMuc3RhdGljcy1l LnR5cGVzLnN0YXRpY3M7aWYoZS50eXBlcy5keW5hbWljcyE9PXQudHlwZXMu ZHluYW1pY3MpcmV0dXJuIHQudHlwZXMuZHluYW1pY3MtZS50eXBlcy5keW5h bWljc31yZXR1cm4gZS50eXBlcy5keW5hbWljcyE9PXQudHlwZXMuZHluYW1p Y3M/ZS50eXBlcy5keW5hbWljcy10LnR5cGVzLmR5bmFtaWNzOmUudHlwZXMu c3RhdGljcyE9PXQudHlwZXMuc3RhdGljcz90LnR5cGVzLnN0YXRpY3MtZS50 eXBlcy5zdGF0aWNzOjB9KX1mdW5jdGlvbiBsKGUsdCl7Zm9yKHZhciByPVtd LG49MCxpPWUubGVuZ3RoO2k+bjtuKyspe3ZhciBvPWVbbl07cj1yLmNvbmNh dChvLm1hdGNoKHQpKX1yZXR1cm4gcn1mdW5jdGlvbiBjKGUpe3RoaXMucXVl cnlQYXJhbXM9ZXx8e319ZnVuY3Rpb24gaChlLHQscil7Zm9yKHZhciBuPWUu aGFuZGxlcnMsaT1lLnJlZ2V4LG89dC5tYXRjaChpKSxhPTEscz1uZXcgYyhy KSx1PTAsbD1uLmxlbmd0aDtsPnU7dSsrKXtmb3IodmFyIGg9blt1XSxtPWgu bmFtZXMscD17fSxmPTAsZD1tLmxlbmd0aDtkPmY7ZisrKXBbbVtmXV09b1th KytdO3MucHVzaCh7aGFuZGxlcjpoLmhhbmRsZXIscGFyYW1zOnAsaXNEeW5h bWljOiEhbS5sZW5ndGh9KX1yZXR1cm4gc31mdW5jdGlvbiBtKGUsdCl7cmV0 dXJuIHQuZWFjaENoYXIoZnVuY3Rpb24odCl7ZT1lLnB1dCh0KX0pLGV9ZnVu Y3Rpb24gcChlLHQscil7dGhpcy5wYXRoPWUsdGhpcy5tYXRjaGVyPXQsdGhp cy5kZWxlZ2F0ZT1yfWZ1bmN0aW9uIGYoZSl7dGhpcy5yb3V0ZXM9e30sdGhp cy5jaGlsZHJlbj17fSx0aGlzLnRhcmdldD1lfWZ1bmN0aW9uIGQoZSx0LHIp e3JldHVybiBmdW5jdGlvbihuLGkpe3ZhciBvPWUrbjtyZXR1cm4gaT8oaShk KG8sdCxyKSksdm9pZCAwKTpuZXcgcChlK24sdCxyKX19ZnVuY3Rpb24gYihl LHQscil7Zm9yKHZhciBuPTAsaT0wLG89ZS5sZW5ndGg7bz5pO2krKyluKz1l W2ldLnBhdGgubGVuZ3RoO3Q9dC5zdWJzdHIobik7dmFyIGE9e3BhdGg6dCxo YW5kbGVyOnJ9O2UucHVzaChhKX1mdW5jdGlvbiBFKGUsdCxyLG4pe3ZhciBp PXQucm91dGVzO2Zvcih2YXIgbyBpbiBpKWlmKGkuaGFzT3duUHJvcGVydHko bykpe3ZhciBhPWUuc2xpY2UoKTtiKGEsbyxpW29dKSx0LmNoaWxkcmVuW29d P0UoYSx0LmNoaWxkcmVuW29dLHIsbik6ci5jYWxsKG4sYSl9fXZhciB2PVsi LyIsIi4iLCIqIiwiKyIsIj8iLCJ8IiwiKCIsIikiLCJbIiwiXSIsInsiLCJ9 IiwiXFwiXSxnPW5ldyBSZWdFeHAoIihcXCIrdi5qb2luKCJ8XFwiKSsiKSIs ImciKTtyLnByb3RvdHlwZT17ZWFjaENoYXI6ZnVuY3Rpb24oZSl7Zm9yKHZh ciB0LHI9dGhpcy5zdHJpbmcsbj0wLGk9ci5sZW5ndGg7aT5uO24rKyl0PXIu Y2hhckF0KG4pLGUoe3ZhbGlkQ2hhcnM6dH0pfSxyZWdleDpmdW5jdGlvbigp e3JldHVybiB0aGlzLnN0cmluZy5yZXBsYWNlKGcsIlxcJDEiKX0sZ2VuZXJh dGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdHJpbmd9fSxuLnByb3RvdHlw ZT17ZWFjaENoYXI6ZnVuY3Rpb24oZSl7ZSh7aW52YWxpZENoYXJzOiIvIixy ZXBlYXQ6ITB9KX0scmVnZXg6ZnVuY3Rpb24oKXtyZXR1cm4iKFteL10rKSJ9 LGdlbmVyYXRlOmZ1bmN0aW9uKGUpe3JldHVybiBlW3RoaXMubmFtZV19fSxp LnByb3RvdHlwZT17ZWFjaENoYXI6ZnVuY3Rpb24oZSl7ZSh7aW52YWxpZENo YXJzOiIiLHJlcGVhdDohMH0pfSxyZWdleDpmdW5jdGlvbigpe3JldHVybiIo LispIn0sZ2VuZXJhdGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbdGhpcy5uYW1l XX19LG8ucHJvdG90eXBlPXtlYWNoQ2hhcjpmdW5jdGlvbigpe30scmVnZXg6 ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2VuZXJhdGU6ZnVuY3Rpb24oKXtyZXR1 cm4iIn19LHMucHJvdG90eXBlPXtnZXQ6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0 PXRoaXMubmV4dFN0YXRlcyxyPTAsbj10Lmxlbmd0aDtuPnI7cisrKXt2YXIg aT10W3JdLG89aS5jaGFyU3BlYy52YWxpZENoYXJzPT09ZS52YWxpZENoYXJz O2lmKG89byYmaS5jaGFyU3BlYy5pbnZhbGlkQ2hhcnM9PT1lLmludmFsaWRD aGFycylyZXR1cm4gaX19LHB1dDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4o dD10aGlzLmdldChlKSk/dDoodD1uZXcgcyhlKSx0aGlzLm5leHRTdGF0ZXMu cHVzaCh0KSxlLnJlcGVhdCYmdC5uZXh0U3RhdGVzLnB1c2godCksdCl9LG1h dGNoOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxyLG4saT10aGlzLm5leHRTdGF0 ZXMsbz1bXSxhPTAscz1pLmxlbmd0aDtzPmE7YSsrKXQ9aVthXSxyPXQuY2hh clNwZWMsInVuZGVmaW5lZCIhPXR5cGVvZihuPXIudmFsaWRDaGFycyk/LTEh PT1uLmluZGV4T2YoZSkmJm8ucHVzaCh0KToidW5kZWZpbmVkIiE9dHlwZW9m KG49ci5pbnZhbGlkQ2hhcnMpJiYtMT09PW4uaW5kZXhPZihlKSYmby5wdXNo KHQpO3JldHVybiBvfX07dmFyIHk9T2JqZWN0LmNyZWF0ZXx8ZnVuY3Rpb24o ZSl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5wcm90b3R5cGU9ZSxuZXcgdH07 Yy5wcm90b3R5cGU9eSh7c3BsaWNlOkFycmF5LnByb3RvdHlwZS5zcGxpY2Us c2xpY2U6QXJyYXkucHJvdG90eXBlLnNsaWNlLHB1c2g6QXJyYXkucHJvdG90 eXBlLnB1c2gsbGVuZ3RoOjAscXVlcnlQYXJhbXM6bnVsbH0pO3ZhciBfPWZ1 bmN0aW9uKCl7dGhpcy5yb290U3RhdGU9bmV3IHMsdGhpcy5uYW1lcz17fX07 Xy5wcm90b3R5cGU9e2FkZDpmdW5jdGlvbihlLHQpe2Zvcih2YXIgcixuPXRo aXMucm9vdFN0YXRlLGk9Il4iLHM9e3N0YXRpY3M6MCxkeW5hbWljczowLHN0 YXJzOjB9LHU9W10sbD1bXSxjPSEwLGg9MCxwPWUubGVuZ3RoO3A+aDtoKysp e3ZhciBmPWVbaF0sZD1bXSxiPWEoZi5wYXRoLGQscyk7bD1sLmNvbmNhdChi KTtmb3IodmFyIEU9MCx2PWIubGVuZ3RoO3Y+RTtFKyspe3ZhciBnPWJbRV07 ZyBpbnN0YW5jZW9mIG98fChjPSExLG49bi5wdXQoe3ZhbGlkQ2hhcnM6Ii8i fSksaSs9Ii8iLG49bShuLGcpLGkrPWcucmVnZXgoKSl9dmFyIHk9e2hhbmRs ZXI6Zi5oYW5kbGVyLG5hbWVzOmR9O3UucHVzaCh5KX1jJiYobj1uLnB1dCh7 dmFsaWRDaGFyczoiLyJ9KSxpKz0iLyIpLG4uaGFuZGxlcnM9dSxuLnJlZ2V4 PW5ldyBSZWdFeHAoaSsiJCIpLG4udHlwZXM9cywocj10JiZ0LmFzKSYmKHRo aXMubmFtZXNbcl09e3NlZ21lbnRzOmwsaGFuZGxlcnM6dX0pfSxoYW5kbGVy c0ZvcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLm5hbWVzW2VdLHI9W107aWYo IXQpdGhyb3cgbmV3IEVycm9yKCJUaGVyZSBpcyBubyByb3V0ZSBuYW1lZCAi K2UpO2Zvcih2YXIgbj0wLGk9dC5oYW5kbGVycy5sZW5ndGg7aT5uO24rKyly LnB1c2godC5oYW5kbGVyc1tuXSk7cmV0dXJuIHJ9LGhhc1JvdXRlOmZ1bmN0 aW9uKGUpe3JldHVybiEhdGhpcy5uYW1lc1tlXX0sZ2VuZXJhdGU6ZnVuY3Rp b24oZSx0KXt2YXIgcj10aGlzLm5hbWVzW2VdLG49IiI7aWYoIXIpdGhyb3cg bmV3IEVycm9yKCJUaGVyZSBpcyBubyByb3V0ZSBuYW1lZCAiK2UpO2Zvcih2 YXIgaT1yLnNlZ21lbnRzLGE9MCxzPWkubGVuZ3RoO3M+YTthKyspe3ZhciB1 PWlbYV07dSBpbnN0YW5jZW9mIG98fChuKz0iLyIsbis9dS5nZW5lcmF0ZSh0 KSl9cmV0dXJuIi8iIT09bi5jaGFyQXQoMCkmJihuPSIvIituKSx0JiZ0LnF1 ZXJ5UGFyYW1zJiYobis9dGhpcy5nZW5lcmF0ZVF1ZXJ5U3RyaW5nKHQucXVl cnlQYXJhbXMsci5oYW5kbGVycykpLG59LGdlbmVyYXRlUXVlcnlTdHJpbmc6 ZnVuY3Rpb24oZSl7dmFyIHI9W10sbj1bXTtmb3IodmFyIGkgaW4gZSllLmhh c093blByb3BlcnR5KGkpJiZuLnB1c2goaSk7bi5zb3J0KCk7Zm9yKHZhciBv PTAsYT1uLmxlbmd0aDthPm87bysrKXtpPW5bb107dmFyIHM9ZVtpXTtpZihz IT09ITEmJm51bGwhPXMpe3ZhciB1PWk7aWYodChzKSlmb3IodmFyIGw9MCxj PXMubGVuZ3RoO2M+bDtsKyspe3ZhciBoPWkrIltdPSIrZW5jb2RlVVJJQ29t cG9uZW50KHNbbF0pO3IucHVzaChoKX1lbHNlIHMhPT0hMD8odSs9Ij0iK2Vu Y29kZVVSSUNvbXBvbmVudChzKSxyLnB1c2godSkpOnIucHVzaCh1KX19cmV0 dXJuIDA9PT1yLmxlbmd0aD8iIjoiPyIrci5qb2luKCImIil9LHBhcnNlUXVl cnlTdHJpbmc6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUuc3BsaXQoIiYiKSxy PXt9LG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIGksbz10W25dLnNwbGl0KCI9 IiksYT1kZWNvZGVVUklDb21wb25lbnQob1swXSkscz1hLmxlbmd0aCx1PSEx OzE9PT1vLmxlbmd0aD9pPSEwOihzPjImJiJbXSI9PT1hLnNsaWNlKHMtMikm Jih1PSEwLGE9YS5zbGljZSgwLHMtMiksclthXXx8KHJbYV09W10pKSxpPW9b MV0/ZGVjb2RlVVJJQ29tcG9uZW50KG9bMV0pOiIiKSx1P3JbYV0ucHVzaChp KTpyW2FdPWl9cmV0dXJuIHJ9LHJlY29nbml6ZTpmdW5jdGlvbihlKXt2YXIg dCxyLG4saSxvPVt0aGlzLnJvb3RTdGF0ZV0sYT17fSxzPSExO2lmKGU9ZGVj b2RlVVJJKGUpLGk9ZS5pbmRleE9mKCI/IiksLTEhPT1pKXt2YXIgYz1lLnN1 YnN0cihpKzEsZS5sZW5ndGgpO2U9ZS5zdWJzdHIoMCxpKSxhPXRoaXMucGFy c2VRdWVyeVN0cmluZyhjKX1mb3IoIi8iIT09ZS5jaGFyQXQoMCkmJihlPSIv IitlKSx0PWUubGVuZ3RoLHQ+MSYmIi8iPT09ZS5jaGFyQXQodC0xKSYmKGU9 ZS5zdWJzdHIoMCx0LTEpLHM9ITApLHI9MCxuPWUubGVuZ3RoO24+ciYmKG89 bChvLGUuY2hhckF0KHIpKSxvLmxlbmd0aCk7cisrKTt2YXIgbT1bXTtmb3Io cj0wLG49by5sZW5ndGg7bj5yO3IrKylvW3JdLmhhbmRsZXJzJiZtLnB1c2go b1tyXSk7bz11KG0pO3ZhciBwPW1bMF07cmV0dXJuIHAmJnAuaGFuZGxlcnM/ KHMmJiIoLispJCI9PT1wLnJlZ2V4LnNvdXJjZS5zbGljZSgtNSkmJihlKz0i LyIpLGgocCxlLGEpKTp2b2lkIDB9fSxlWyJkZWZhdWx0Il09XyxwLnByb3Rv dHlwZT17dG86ZnVuY3Rpb24oZSx0KXt2YXIgcj10aGlzLmRlbGVnYXRlO2lm KHImJnIud2lsbEFkZFJvdXRlJiYoZT1yLndpbGxBZGRSb3V0ZSh0aGlzLm1h dGNoZXIudGFyZ2V0LGUpKSx0aGlzLm1hdGNoZXIuYWRkKHRoaXMucGF0aCxl KSx0KXtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJZb3UgbXVz dCBoYXZlIGFuIGFyZ3VtZW50IGluIHRoZSBmdW5jdGlvbiBwYXNzZWQgdG8g YHRvYCIpO3RoaXMubWF0Y2hlci5hZGRDaGlsZCh0aGlzLnBhdGgsZSx0LHRo aXMuZGVsZWdhdGUpfXJldHVybiB0aGlzfX0sZi5wcm90b3R5cGU9e2FkZDpm dW5jdGlvbihlLHQpe3RoaXMucm91dGVzW2VdPXR9LGFkZENoaWxkOmZ1bmN0 aW9uKGUsdCxyLG4pe3ZhciBpPW5ldyBmKHQpO3RoaXMuY2hpbGRyZW5bZV09 aTt2YXIgbz1kKGUsaSxuKTtuJiZuLmNvbnRleHRFbnRlcmVkJiZuLmNvbnRl eHRFbnRlcmVkKHQsbykscihvKX19LF8ucHJvdG90eXBlLm1hcD1mdW5jdGlv bihlLHQpe3ZhciByPW5ldyBmO2UoZCgiIixyLHRoaXMuZGVsZWdhdGUpKSxF KFtdLHIsZnVuY3Rpb24oZSl7dD90KHRoaXMsZSk6dGhpcy5hZGQoZSl9LHRo aXMpfX0pfSgpLGZ1bmN0aW9uKCl7ZSgicm91dGVyL2hhbmRsZXItaW5mbyIs WyIuL3V0aWxzIiwicnN2cCIsImV4cG9ydHMiXSxmdW5jdGlvbihlLHQscil7 InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oZSl7ZSYmbCh0aGlzLGUpfWZ1bmN0 aW9uIGkoZSl7bi5jYWxsKHRoaXMsZSl9ZnVuY3Rpb24gbyhlKXtuLmNhbGwo dGhpcyxlKSx0aGlzLnBhcmFtcz10aGlzLnBhcmFtc3x8e319ZnVuY3Rpb24g YShlKXtuLmNhbGwodGhpcyxlKX1mdW5jdGlvbiBzKGUsdCl7aWYoIWVeIXQp cmV0dXJuITE7aWYoIWUpcmV0dXJuITA7Zm9yKHZhciByIGluIGUpaWYoZS5o YXNPd25Qcm9wZXJ0eShyKSYmZVtyXSE9PXRbcl0pcmV0dXJuITE7cmV0dXJu ITB9dmFyIHU9ZS5iaW5kLGw9ZS5tZXJnZSxjPWUub0NyZWF0ZSxoPWUuc2Vy aWFsaXplLG09ZS5wcm9taXNlTGFiZWwscD10LnJlc29sdmU7bi5wcm90b3R5 cGU9e25hbWU6bnVsbCxoYW5kbGVyOm51bGwscGFyYW1zOm51bGwsY29udGV4 dDpudWxsLGxvZzpmdW5jdGlvbihlLHQpe2UubG9nJiZlLmxvZyh0aGlzLm5h bWUrIjogIit0KX0scHJvbWlzZUxhYmVsOmZ1bmN0aW9uKGUpe3JldHVybiBt KCInIit0aGlzLm5hbWUrIicgIitlKX0scmVzb2x2ZTpmdW5jdGlvbihlLHQs cil7dmFyIG49dSh0aGlzLmNoZWNrRm9yQWJvcnQsdGhpcyx0KSxpPXUodGhp cy5ydW5CZWZvcmVNb2RlbEhvb2ssdGhpcyxlLHIpLG89dSh0aGlzLmdldE1v ZGVsLHRoaXMsZSxyKSxhPXUodGhpcy5ydW5BZnRlck1vZGVsSG9vayx0aGlz LGUscikscz11KHRoaXMuYmVjb21lUmVzb2x2ZWQsdGhpcyxyKTtyZXR1cm4g cCh2b2lkIDAsdGhpcy5wcm9taXNlTGFiZWwoIlN0YXJ0IGhhbmRsZXIiKSku dGhlbihuLG51bGwsdGhpcy5wcm9taXNlTGFiZWwoIkNoZWNrIGZvciBhYm9y dCIpKS50aGVuKGksbnVsbCx0aGlzLnByb21pc2VMYWJlbCgiQmVmb3JlIG1v ZGVsIikpLnRoZW4obixudWxsLHRoaXMucHJvbWlzZUxhYmVsKCJDaGVjayBp ZiBhYm9ydGVkIGR1cmluZyAnYmVmb3JlTW9kZWwnIGhvb2siKSkudGhlbihv LG51bGwsdGhpcy5wcm9taXNlTGFiZWwoIk1vZGVsIikpLnRoZW4obixudWxs LHRoaXMucHJvbWlzZUxhYmVsKCJDaGVjayBpZiBhYm9ydGVkIGluICdtb2Rl bCcgaG9vayIpKS50aGVuKGEsbnVsbCx0aGlzLnByb21pc2VMYWJlbCgiQWZ0 ZXIgbW9kZWwiKSkudGhlbihuLG51bGwsdGhpcy5wcm9taXNlTGFiZWwoIkNo ZWNrIGlmIGFib3J0ZWQgaW4gJ2FmdGVyTW9kZWwnIGhvb2siKSkudGhlbihz LG51bGwsdGhpcy5wcm9taXNlTGFiZWwoIkJlY29tZSByZXNvbHZlZCIpKX0s cnVuQmVmb3JlTW9kZWxIb29rOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQudHJp Z2dlciYmdC50cmlnZ2VyKCEwLCJ3aWxsUmVzb2x2ZU1vZGVsIix0LHRoaXMu aGFuZGxlciksdGhpcy5ydW5TaGFyZWRNb2RlbEhvb2soZSx0LCJiZWZvcmVN b2RlbCIsW10pfSxydW5BZnRlck1vZGVsSG9vazpmdW5jdGlvbihlLHQscil7 dmFyIG49dGhpcy5uYW1lO3JldHVybiB0aGlzLnN0YXNoUmVzb2x2ZWRNb2Rl bCh0LHIpLHRoaXMucnVuU2hhcmVkTW9kZWxIb29rKGUsdCwiYWZ0ZXJNb2Rl bCIsW3JdKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIHQucmVzb2x2ZWRNb2Rl bHNbbl19LG51bGwsdGhpcy5wcm9taXNlTGFiZWwoIklnbm9yZSBmdWxmaWxs bWVudCB2YWx1ZSBhbmQgcmV0dXJuIG1vZGVsIHZhbHVlIikpfSxydW5TaGFy ZWRNb2RlbEhvb2s6ZnVuY3Rpb24oZSx0LHIsbil7dGhpcy5sb2codCwiY2Fs bGluZyAiK3IrIiBob29rIiksdGhpcy5xdWVyeVBhcmFtcyYmbi5wdXNoKHRo aXMucXVlcnlQYXJhbXMpLG4ucHVzaCh0KTt2YXIgaT10aGlzLmhhbmRsZXI7 cmV0dXJuIGUoZnVuY3Rpb24oKXtyZXR1cm4gaVtyXSYmaVtyXS5hcHBseShp LG4pfSx0aGlzLnByb21pc2VMYWJlbCgiSGFuZGxlICIrcikpfSxnZXRNb2Rl bDpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiVGhpcyBzaG91bGQgYmUg b3ZlcnJpZGRlbiBieSBhIHN1YmNsYXNzIG9mIEhhbmRsZXJJbmZvIil9LGNo ZWNrRm9yQWJvcnQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcChlKCksdGhpcy5w cm9taXNlTGFiZWwoIkNoZWNrIGZvciBhYm9ydCIpKS50aGVuKGZ1bmN0aW9u KCl7cmV0dXJuIHR9LG51bGwsdGhpcy5wcm9taXNlTGFiZWwoIklnbm9yZSBm dWxmaWxsbWVudCB2YWx1ZSBhbmQgY29udGludWUiKSl9LHN0YXNoUmVzb2x2 ZWRNb2RlbDpmdW5jdGlvbihlLHQpe2UucmVzb2x2ZWRNb2RlbHM9ZS5yZXNv bHZlZE1vZGVsc3x8e30sZS5yZXNvbHZlZE1vZGVsc1t0aGlzLm5hbWVdPXR9 LGJlY29tZVJlc29sdmVkOmZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcy5wYXJh bXN8fGgodGhpcy5oYW5kbGVyLHQsdGhpcy5uYW1lcyk7cmV0dXJuIGUmJih0 aGlzLnN0YXNoUmVzb2x2ZWRNb2RlbChlLHQpLGUucGFyYW1zPWUucGFyYW1z fHx7fSxlLnBhcmFtc1t0aGlzLm5hbWVdPXIpLG5ldyBpKHtjb250ZXh0OnQs bmFtZTp0aGlzLm5hbWUsaGFuZGxlcjp0aGlzLmhhbmRsZXIscGFyYW1zOnJ9 KX0sc2hvdWxkU3VwZXJjZWRlOmZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybiEw O3ZhciB0PWUuY29udGV4dD09PXRoaXMuY29udGV4dDtyZXR1cm4gZS5uYW1l IT09dGhpcy5uYW1lfHx0aGlzLmhhc093blByb3BlcnR5KCJjb250ZXh0Iikm JiF0fHx0aGlzLmhhc093blByb3BlcnR5KCJwYXJhbXMiKSYmIXModGhpcy5w YXJhbXMsZS5wYXJhbXMpfX0saS5wcm90b3R5cGU9YyhuLnByb3RvdHlwZSks aS5wcm90b3R5cGUucmVzb2x2ZT1mdW5jdGlvbihlLHQscil7cmV0dXJuIHIm JnIucmVzb2x2ZWRNb2RlbHMmJihyLnJlc29sdmVkTW9kZWxzW3RoaXMubmFt ZV09dGhpcy5jb250ZXh0KSxwKHRoaXMsdGhpcy5wcm9taXNlTGFiZWwoIlJl c29sdmUiKSl9LG8ucHJvdG90eXBlPWMobi5wcm90b3R5cGUpLG8ucHJvdG90 eXBlLmdldE1vZGVsPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcy5wYXJhbXM7 dCYmdC5xdWVyeVBhcmFtcyYmKHI9e30sbChyLHRoaXMucGFyYW1zKSxyLnF1 ZXJ5UGFyYW1zPXQucXVlcnlQYXJhbXMpO3ZhciBuPSJmdW5jdGlvbiI9PXR5 cGVvZiB0aGlzLmhhbmRsZXIuZGVzZXJpYWxpemU/ImRlc2VyaWFsaXplIjoi bW9kZWwiO3JldHVybiB0aGlzLnJ1blNoYXJlZE1vZGVsSG9vayhlLHQsbixb cl0pfSxhLnByb3RvdHlwZT1jKG4ucHJvdG90eXBlKSxhLnByb3RvdHlwZS5n ZXRNb2RlbD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmxvZyh0LHRoaXMu bmFtZSsiOiByZXNvbHZpbmcgcHJvdmlkZWQgbW9kZWwiKSxwKHRoaXMuY29u dGV4dCl9LHIuSGFuZGxlckluZm89bixyLlJlc29sdmVkSGFuZGxlckluZm89 aSxyLlVucmVzb2x2ZWRIYW5kbGVySW5mb0J5UGFyYW09byxyLlVucmVzb2x2 ZWRIYW5kbGVySW5mb0J5T2JqZWN0PWF9KSxlKCJyb3V0ZXIvcm91dGVyIixb InJvdXRlLXJlY29nbml6ZXIiLCJyc3ZwIiwiLi91dGlscyIsIi4vdHJhbnNp dGlvbi1zdGF0ZSIsIi4vdHJhbnNpdGlvbiIsIi4vdHJhbnNpdGlvbi1pbnRl bnQvbmFtZWQtdHJhbnNpdGlvbi1pbnRlbnQiLCIuL3RyYW5zaXRpb24taW50 ZW50L3VybC10cmFuc2l0aW9uLWludGVudCIsImV4cG9ydHMiXSxmdW5jdGlv bihlLHQscixuLGksbyxhLHMpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB1KCl7 dGhpcy5yZWNvZ25pemVyPW5ldyBFLHRoaXMucmVzZXQoKX1mdW5jdGlvbiBs KGUsdCxyKXt2YXIgbj1oKGUuc3RhdGUsdCk7QyhuLmV4aXRlZCxmdW5jdGlv bihlKXt2YXIgdD1lLmhhbmRsZXI7ZGVsZXRlIHQuY29udGV4dCx0LmV4aXQm JnQuZXhpdCgpfSk7dmFyIGk9ZS5vbGRTdGF0ZT1lLnN0YXRlO2Uuc3RhdGU9 dDt2YXIgbz1lLmN1cnJlbnRIYW5kbGVySW5mb3M9bi51bmNoYW5nZWQuc2xp Y2UoKTt0cnl7QyhuLnVwZGF0ZWRDb250ZXh0LGZ1bmN0aW9uKGUpe3JldHVy biBjKG8sZSwhMSxyKX0pLEMobi5lbnRlcmVkLGZ1bmN0aW9uKGUpe3JldHVy biBjKG8sZSwhMCxyKX0pfWNhdGNoKGEpe3Rocm93IGUuc3RhdGU9aSxlLmN1 cnJlbnRIYW5kbGVySW5mb3M9aS5oYW5kbGVySW5mb3MsYX1lLnN0YXRlLnF1 ZXJ5UGFyYW1zPWIoZSxvLHQucXVlcnlQYXJhbXMpfWZ1bmN0aW9uIGMoZSx0 LHIsbil7dmFyIGk9dC5oYW5kbGVyLG89dC5jb250ZXh0O2lmKHImJmkuZW50 ZXImJmkuZW50ZXIobiksbiYmbi5pc0Fib3J0ZWQpdGhyb3cgbmV3IFI7aWYo aS5jb250ZXh0PW8saS5jb250ZXh0RGlkQ2hhbmdlJiZpLmNvbnRleHREaWRD aGFuZ2UoKSxpLnNldHVwJiZpLnNldHVwKG8sbiksbiYmbi5pc0Fib3J0ZWQp dGhyb3cgbmV3IFI7cmV0dXJuIGUucHVzaCh0KSwhMH1mdW5jdGlvbiBoKGUs dCl7dmFyIHIsbixpLG8sYSxzPWUuaGFuZGxlckluZm9zLHU9dC5oYW5kbGVy SW5mb3MsbD17dXBkYXRlZENvbnRleHQ6W10sZXhpdGVkOltdLGVudGVyZWQ6 W10sdW5jaGFuZ2VkOltdfTtmb3Iobz0wLGE9dS5sZW5ndGg7YT5vO28rKyl7 dmFyIGM9c1tvXSxoPXVbb107YyYmYy5oYW5kbGVyPT09aC5oYW5kbGVyfHwo cj0hMCkscj8obC5lbnRlcmVkLnB1c2goaCksYyYmbC5leGl0ZWQudW5zaGlm dChjKSk6bnx8Yy5jb250ZXh0IT09aC5jb250ZXh0fHxpPyhuPSEwLGwudXBk YXRlZENvbnRleHQucHVzaChoKSk6bC51bmNoYW5nZWQucHVzaChjKX1mb3Io bz11Lmxlbmd0aCxhPXMubGVuZ3RoO2E+bztvKyspbC5leGl0ZWQudW5zaGlm dChzW29dKTtyZXR1cm4gbH1mdW5jdGlvbiBtKGUsdCxyKXt2YXIgbj1lLnVy bE1ldGhvZDtpZihuKXtmb3IodmFyIGk9ZS5yb3V0ZXIsbz10LmhhbmRsZXJJ bmZvcyxhPW9bby5sZW5ndGgtMV0ubmFtZSxzPXt9LHU9by5sZW5ndGgtMTt1 Pj0wOy0tdSl7dmFyIGw9b1t1XTtPKHMsbC5wYXJhbXMpLGwuaGFuZGxlci5p bmFjY2Vzc2libGVCeVVSTCYmKG49bnVsbCl9aWYobil7cy5xdWVyeVBhcmFt cz10LnF1ZXJ5UGFyYW1zO3ZhciBjPWkucmVjb2duaXplci5nZW5lcmF0ZShh LHMpOyJyZXBsYWNlUXVlcnkiPT09bj9jIT09ciYmaS5yZXBsYWNlVVJMKGMp OiJyZXBsYWNlIj09PW4/aS5yZXBsYWNlVVJMKGMpOmkudXBkYXRlVVJMKGMp fX19ZnVuY3Rpb24gcChlLHQpe3RyeXtfKGUucm91dGVyLGUuc2VxdWVuY2Us IlJlc29sdmVkIGFsbCBtb2RlbHMgb24gZGVzdGluYXRpb24gcm91dGU7IGZp bmFsaXppbmcgdHJhbnNpdGlvbi4iKTt7dmFyIHI9ZS5yb3V0ZXIsbj10Lmhh bmRsZXJJbmZvcztlLnNlcXVlbmNlfXJldHVybiBsKHIsdCxlKSxlLmlzQWJv cnRlZD8oci5zdGF0ZS5oYW5kbGVySW5mb3M9ci5jdXJyZW50SGFuZGxlcklu Zm9zLHYoVihlKSkpOihtKGUsdCxlLmludGVudC51cmwpLGUuaXNBY3RpdmU9 ITEsci5hY3RpdmVUcmFuc2l0aW9uPW51bGwseShyLHIuY3VycmVudEhhbmRs ZXJJbmZvcywhMCxbImRpZFRyYW5zaXRpb24iXSksci5kaWRUcmFuc2l0aW9u JiZyLmRpZFRyYW5zaXRpb24oci5jdXJyZW50SGFuZGxlckluZm9zKSxfKHIs ZS5zZXF1ZW5jZSwiVFJBTlNJVElPTiBDT01QTEVURS4iKSxuW24ubGVuZ3Ro LTFdLmhhbmRsZXIpfWNhdGNoKGkpe2lmKCEoaSBpbnN0YW5jZW9mIFIpKXt2 YXIgbz1lLnN0YXRlLmhhbmRsZXJJbmZvcztlLnRyaWdnZXIoITAsImVycm9y IixpLGUsb1tvLmxlbmd0aC0xXS5oYW5kbGVyKSxlLmFib3J0KCl9dGhyb3cg aX19ZnVuY3Rpb24gZihlLHQscil7dmFyIG49dFswXXx8Ii8iLGk9dFt0Lmxl bmd0aC0xXSxvPXt9O2kmJmkuaGFzT3duUHJvcGVydHkoInF1ZXJ5UGFyYW1z IikmJihvPU0uY2FsbCh0KS5xdWVyeVBhcmFtcyk7dmFyIGE7aWYoMD09PXQu bGVuZ3RoKXtfKGUsIlVwZGF0aW5nIHF1ZXJ5IHBhcmFtcyIpO3ZhciBzPWUu c3RhdGUuaGFuZGxlckluZm9zO2E9bmV3IEkoe25hbWU6c1tzLmxlbmd0aC0x XS5uYW1lLGNvbnRleHRzOltdLHF1ZXJ5UGFyYW1zOm99KX1lbHNlIi8iPT09 bi5jaGFyQXQoMCk/KF8oZSwiQXR0ZW1wdGluZyBVUkwgdHJhbnNpdGlvbiB0 byAiK24pLGE9bmV3IEQoe3VybDpufSkpOihfKGUsIkF0dGVtcHRpbmcgdHJh bnNpdGlvbiB0byAiK24pLGE9bmV3IEkoe25hbWU6dFswXSxjb250ZXh0czp3 LmNhbGwodCwxKSxxdWVyeVBhcmFtczpvfSkpO3JldHVybiBlLnRyYW5zaXRp b25CeUludGVudChhLHIpfWZ1bmN0aW9uIGQoZSx0KXtpZihlLmxlbmd0aCE9 PXQubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgcj0wLG49ZS5sZW5ndGg7bj5y OysrcilpZihlW3JdIT09dFtyXSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlv biBiKGUsdCxyKXt2YXIgbj1bXTt5KGUsdCwhMCxbImZpbmFsaXplUXVlcnlQ YXJhbUNoYW5nZSIscixuXSk7Zm9yKHZhciBpPXt9LG89MCxhPW4ubGVuZ3Ro O2E+bzsrK28pe3ZhciBzPW5bb107aVtzLmtleV09cy52YWx1ZX1yZXR1cm4g aX12YXIgRT1lWyJkZWZhdWx0Il0sdj0odC5yZXNvbHZlLHQucmVqZWN0KSxn PSh0LmFzeW5jLHQuUHJvbWlzZSkseT1yLnRyaWdnZXIsXz1yLmxvZyx3PXIu c2xpY2UsQz1yLmZvckVhY2gsTz1yLm1lcmdlLFA9ci5zZXJpYWxpemUsQT1y LmV4dHJhY3RRdWVyeVBhcmFtcyxUPXIuZ2V0Q2hhbmdlbGlzdCx4PXIucHJv bWlzZUxhYmVsLFM9bi5UcmFuc2l0aW9uU3RhdGUsVj1pLmxvZ0Fib3J0LE49 aS5UcmFuc2l0aW9uLFI9aS5UcmFuc2l0aW9uQWJvcnRlZCxJPW8uTmFtZWRU cmFuc2l0aW9uSW50ZW50LEQ9YS5VUkxUcmFuc2l0aW9uSW50ZW50LE09QXJy YXkucHJvdG90eXBlLnBvcDt1LnByb3RvdHlwZT17bWFwOmZ1bmN0aW9uKGUp e3RoaXMucmVjb2duaXplci5kZWxlZ2F0ZT10aGlzLmRlbGVnYXRlLHRoaXMu cmVjb2duaXplci5tYXAoZSxmdW5jdGlvbihlLHQpe2Zvcih2YXIgcj10Lmxl bmd0aC0xLG49ITA7cj49MCYmbjstLXIpe3ZhciBpPXRbcl07ZS5hZGQodCx7 YXM6aS5oYW5kbGVyfSksbj0iLyI9PT1pLnBhdGh8fCIiPT09aS5wYXRofHwi LmluZGV4Ij09PWkuaGFuZGxlci5zbGljZSgtNil9fSl9LGhhc1JvdXRlOmZ1 bmN0aW9uKGUpe3JldHVybiB0aGlzLnJlY29nbml6ZXIuaGFzUm91dGUoZSl9 LHRyYW5zaXRpb25CeUludGVudDpmdW5jdGlvbihlLHQpe3ZhciByLG49ISF0 aGlzLmFjdGl2ZVRyYW5zaXRpb24saT1uP3RoaXMuYWN0aXZlVHJhbnNpdGlv bi5zdGF0ZTp0aGlzLnN0YXRlLG89dGhpczt0cnl7dmFyIGE9ZS5hcHBseVRv U3RhdGUoaSx0aGlzLnJlY29nbml6ZXIsdGhpcy5nZXRIYW5kbGVyLHQpO2lm KGQoYS5oYW5kbGVySW5mb3MsaS5oYW5kbGVySW5mb3MpKXt2YXIgcz1UKGku cXVlcnlQYXJhbXMsYS5xdWVyeVBhcmFtcyk7cmV0dXJuIHM/KHRoaXMuX2No YW5nZWRRdWVyeVBhcmFtcz1zLmNoYW5nZWQseSh0aGlzLGEuaGFuZGxlcklu Zm9zLCEwLFsicXVlcnlQYXJhbXNEaWRDaGFuZ2UiLHMuY2hhbmdlZCxzLmFs bCxzLnJlbW92ZWRdKSx0aGlzLl9jaGFuZ2VkUXVlcnlQYXJhbXM9bnVsbCwh biYmdGhpcy5hY3RpdmVUcmFuc2l0aW9uP3RoaXMuYWN0aXZlVHJhbnNpdGlv bjooaS5xdWVyeVBhcmFtcz1iKHRoaXMsYS5oYW5kbGVySW5mb3MsYS5xdWVy eVBhcmFtcykscj1uZXcgTih0aGlzKSxyLnVybE1ldGhvZD0icmVwbGFjZSIs ci5wcm9taXNlPXIucHJvbWlzZS50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiBt KHIsaSwhMCksby5kaWRUcmFuc2l0aW9uJiZvLmRpZFRyYW5zaXRpb24oby5j dXJyZW50SGFuZGxlckluZm9zKSxlfSxudWxsLHgoIlRyYW5zaXRpb24gY29t cGxldGUiKSkscikpOm5ldyBOKHRoaXMpfXJldHVybiB0PyhsKHRoaXMsYSks dm9pZCAwKToocj1uZXcgTih0aGlzLGUsYSksdGhpcy5hY3RpdmVUcmFuc2l0 aW9uJiZ0aGlzLmFjdGl2ZVRyYW5zaXRpb24uYWJvcnQoKSx0aGlzLmFjdGl2 ZVRyYW5zaXRpb249cixyLnByb21pc2U9ci5wcm9taXNlLnRoZW4oZnVuY3Rp b24oZSl7cmV0dXJuIG8uYXN5bmMoZnVuY3Rpb24oKXtyZXR1cm4gcChyLGUu c3RhdGUpfSwiRmluYWxpemUgdHJhbnNpdGlvbiIpfSxudWxsLHgoIlNldHRs ZSB0cmFuc2l0aW9uIHByb21pc2Ugd2hlbiB0cmFuc2l0aW9uIGlzIGZpbmFs aXplZCIpKSxufHx5KHRoaXMsdGhpcy5zdGF0ZS5oYW5kbGVySW5mb3MsITAs WyJ3aWxsVHJhbnNpdGlvbiIscl0pLHIpfWNhdGNoKHUpe3JldHVybiBuZXcg Tih0aGlzLGUsbnVsbCx1KX19LHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5zdGF0 ZSYmQyh0aGlzLnN0YXRlLmhhbmRsZXJJbmZvcyxmdW5jdGlvbihlKXt2YXIg dD1lLmhhbmRsZXI7dC5leGl0JiZ0LmV4aXQoKX0pLHRoaXMuc3RhdGU9bmV3 IFMsdGhpcy5jdXJyZW50SGFuZGxlckluZm9zPW51bGx9LGFjdGl2ZVRyYW5z aXRpb246bnVsbCxoYW5kbGVVUkw6ZnVuY3Rpb24oZSl7dmFyIHQ9dy5jYWxs KGFyZ3VtZW50cyk7cmV0dXJuIi8iIT09ZS5jaGFyQXQoMCkmJih0WzBdPSIv IitlKSxmKHRoaXMsdCkubWV0aG9kKCJyZXBsYWNlUXVlcnkiKX0sdXBkYXRl VVJMOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJ1cGRhdGVVUkwgaXMg bm90IGltcGxlbWVudGVkIil9LHJlcGxhY2VVUkw6ZnVuY3Rpb24oZSl7dGhp cy51cGRhdGVVUkwoZSl9LHRyYW5zaXRpb25UbzpmdW5jdGlvbigpe3JldHVy biBmKHRoaXMsYXJndW1lbnRzKX0saW50ZXJtZWRpYXRlVHJhbnNpdGlvblRv OmZ1bmN0aW9uKCl7Zih0aGlzLGFyZ3VtZW50cywhMCl9LHJlZnJlc2g6ZnVu Y3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMuYWN0aXZlVHJhbnNpdGlvbj90aGlz LmFjdGl2ZVRyYW5zaXRpb24uc3RhdGU6dGhpcy5zdGF0ZSxyPXQuaGFuZGxl ckluZm9zLG49e30saT0wLG89ci5sZW5ndGg7bz5pOysraSl7dmFyIGE9cltp XTtuW2EubmFtZV09YS5wYXJhbXN8fHt9fV8odGhpcywiU3RhcnRpbmcgYSBy ZWZyZXNoIHRyYW5zaXRpb24iKTt2YXIgcz1uZXcgSSh7bmFtZTpyW3IubGVu Z3RoLTFdLm5hbWUscGl2b3RIYW5kbGVyOmV8fHJbMF0uaGFuZGxlcixjb250 ZXh0czpbXSxxdWVyeVBhcmFtczp0aGlzLl9jaGFuZ2VkUXVlcnlQYXJhbXN8 fHQucXVlcnlQYXJhbXN8fHt9fSk7cmV0dXJuIHRoaXMudHJhbnNpdGlvbkJ5 SW50ZW50KHMsITEpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3JldHVybiBm KHRoaXMsYXJndW1lbnRzKS5tZXRob2QoInJlcGxhY2UiKX0sZ2VuZXJhdGU6 ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PUEody5jYWxsKGFyZ3VtZW50cywxKSks cj10WzBdLG49dFsxXSxpPW5ldyBJKHtuYW1lOmUsY29udGV4dHM6cn0pLG89 aS5hcHBseVRvU3RhdGUodGhpcy5zdGF0ZSx0aGlzLnJlY29nbml6ZXIsdGhp cy5nZXRIYW5kbGVyKSxhPXt9LHM9MCx1PW8uaGFuZGxlckluZm9zLmxlbmd0 aDt1PnM7KytzKXt2YXIgbD1vLmhhbmRsZXJJbmZvc1tzXSxjPWwucGFyYW1z fHxQKGwuaGFuZGxlcixsLmNvbnRleHQsbC5uYW1lcyk7TyhhLGMpfXJldHVy biBhLnF1ZXJ5UGFyYW1zPW4sdGhpcy5yZWNvZ25pemVyLmdlbmVyYXRlKGUs YSl9LGlzQWN0aXZlOmZ1bmN0aW9uKGUpe3ZhciB0LHIsbj1BKHcuY2FsbChh cmd1bWVudHMsMSkpLGk9blswXSxvPW5bMV0sYT10aGlzLnN0YXRlLnF1ZXJ5 UGFyYW1zLHM9dGhpcy5zdGF0ZS5oYW5kbGVySW5mb3M7aWYoIXMubGVuZ3Ro KXJldHVybiExO3ZhciB1PXNbcy5sZW5ndGgtMV0ubmFtZSxsPXRoaXMucmVj b2duaXplci5oYW5kbGVyc0Zvcih1KSxjPTA7Zm9yKHI9bC5sZW5ndGg7cj5j JiYodD1zW2NdLHQubmFtZSE9PWUpOysrYyk7aWYoYz09PWwubGVuZ3RoKXJl dHVybiExO3ZhciBoPW5ldyBTO2guaGFuZGxlckluZm9zPXMuc2xpY2UoMCxj KzEpLGw9bC5zbGljZSgwLGMrMSk7dmFyIG09bmV3IEkoe25hbWU6dSxjb250 ZXh0czppfSkscD1tLmFwcGx5VG9IYW5kbGVycyhoLGwsdGhpcy5nZXRIYW5k bGVyLHUsITAsITApLGY9e307TyhmLG8pO2Zvcih2YXIgYiBpbiBhKWEuaGFz T3duUHJvcGVydHkoYikmJmYuaGFzT3duUHJvcGVydHkoYikmJihmW2JdPWFb Yl0pO3JldHVybiBkKHAuaGFuZGxlckluZm9zLGguaGFuZGxlckluZm9zKSYm IVQoZixvKX0sdHJpZ2dlcjpmdW5jdGlvbigpe3ZhciBlPXcuY2FsbChhcmd1 bWVudHMpO3kodGhpcyx0aGlzLmN1cnJlbnRIYW5kbGVySW5mb3MsITEsZSl9 LGFzeW5jOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBnKGZ1bmN0aW9uKHQp e3QoZSgpKX0sdCl9LGxvZzpudWxsfSxzLlJvdXRlcj11fSksZSgicm91dGVy L3RyYW5zaXRpb24taW50ZW50IixbIi4vdXRpbHMiLCJleHBvcnRzIl0sZnVu Y3Rpb24oZSx0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtlJiZuKHRo aXMsZSksdGhpcy5kYXRhPXRoaXMuZGF0YXx8e319dmFyIG49ZS5tZXJnZTty LnByb3RvdHlwZS5hcHBseVRvU3RhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9 LHQuVHJhbnNpdGlvbkludGVudD1yfSksZSgicm91dGVyL3RyYW5zaXRpb24t aW50ZW50L25hbWVkLXRyYW5zaXRpb24taW50ZW50IixbIi4uL3RyYW5zaXRp b24taW50ZW50IiwiLi4vdHJhbnNpdGlvbi1zdGF0ZSIsIi4uL2hhbmRsZXIt aW5mbyIsIi4uL3V0aWxzIiwiZXhwb3J0cyJdLGZ1bmN0aW9uKGUsdCxyLG4s aSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSl7YS5jYWxsKHRoaXMsZSl9 dmFyIGE9ZS5UcmFuc2l0aW9uSW50ZW50LHM9dC5UcmFuc2l0aW9uU3RhdGUs dT1yLlVucmVzb2x2ZWRIYW5kbGVySW5mb0J5UGFyYW0sbD1yLlVucmVzb2x2 ZWRIYW5kbGVySW5mb0J5T2JqZWN0LGM9bi5pc1BhcmFtLGg9bi5mb3JFYWNo LG09bi5leHRyYWN0UXVlcnlQYXJhbXMscD1uLm9DcmVhdGUsZj1uLm1lcmdl O28ucHJvdG90eXBlPXAoYS5wcm90b3R5cGUpLG8ucHJvdG90eXBlLmFwcGx5 VG9TdGF0ZT1mdW5jdGlvbihlLHQscixuKXt2YXIgaT1tKFt0aGlzLm5hbWVd LmNvbmNhdCh0aGlzLmNvbnRleHRzKSksbz1pWzBdLGE9KGlbMV0sdC5oYW5k bGVyc0ZvcihvWzBdKSkscz1hW2EubGVuZ3RoLTFdLmhhbmRsZXI7cmV0dXJu IHRoaXMuYXBwbHlUb0hhbmRsZXJzKGUsYSxyLHMsbil9LG8ucHJvdG90eXBl LmFwcGx5VG9IYW5kbGVycz1mdW5jdGlvbihlLHQscixuLGksbyl7dmFyIGEs dT1uZXcgcyxsPXRoaXMuY29udGV4dHMuc2xpY2UoMCksYz10Lmxlbmd0aCxo PVtdO2lmKHRoaXMucGl2b3RIYW5kbGVyKWZvcihhPTA7YTx0Lmxlbmd0aDsr K2EpaWYocih0W2FdLmhhbmRsZXIpPT09dGhpcy5waXZvdEhhbmRsZXIpe2M9 YTticmVha30hdGhpcy5waXZvdEhhbmRsZXI7Zm9yKGE9dC5sZW5ndGgtMTth Pj0wOy0tYSl7dmFyIG09dFthXSxwPW0uaGFuZGxlcixkPXIocCksYj1lLmhh bmRsZXJJbmZvc1thXSxFPW51bGw7aWYobS5uYW1lcy5sZW5ndGg+MD9FPWE+ PWM/dGhpcy5jcmVhdGVQYXJhbUhhbmRsZXJJbmZvKHAsZCxtLm5hbWVzLGws Yik6dGhpcy5nZXRIYW5kbGVySW5mb0ZvckR5bmFtaWNTZWdtZW50KHAsZCxt Lm5hbWVzLGwsYixuKTooRT10aGlzLmNyZWF0ZVBhcmFtSGFuZGxlckluZm8o cCxkLG0ubmFtZXMsbCxiKSxoLnVuc2hpZnQoYSkpLG8pe0U9RS5iZWNvbWVS ZXNvbHZlZChudWxsLEUuY29udGV4dCk7dmFyIHY9YiYmYi5jb250ZXh0O20u bmFtZXMubGVuZ3RoPjAmJkUuY29udGV4dD09PXYmJihFLnBhcmFtcz1iJiZi LnBhcmFtcyksRS5jb250ZXh0PXZ9dmFyIGc9YjsoYT49Y3x8RS5zaG91bGRT dXBlcmNlZGUoYikpJiYoYz1NYXRoLm1pbihhLGMpLGc9RSksaSYmIW8mJihn PWcuYmVjb21lUmVzb2x2ZWQobnVsbCxnLmNvbnRleHQpKSx1LmhhbmRsZXJJ bmZvcy51bnNoaWZ0KGcpfWlmKGwubGVuZ3RoPjApdGhyb3cgbmV3IEVycm9y KCJNb3JlIGNvbnRleHQgb2JqZWN0cyB3ZXJlIHBhc3NlZCB0aGFuIHRoZXJl IGFyZSBkeW5hbWljIHNlZ21lbnRzIGZvciB0aGUgcm91dGU6ICIrbik7cmV0 dXJuIGl8fHRoaXMuaW52YWxpZGF0ZU5vbkR5bmFtaWNIYW5kbGVycyh1Lmhh bmRsZXJJbmZvcyxoLGMpLGYodS5xdWVyeVBhcmFtcyxlLnF1ZXJ5UGFyYW1z KSxmKHUucXVlcnlQYXJhbXMsdGhpcy5xdWVyeVBhcmFtc3x8e30pLHV9LG8u cHJvdG90eXBlLmludmFsaWRhdGVOb25EeW5hbWljSGFuZGxlcnM9ZnVuY3Rp b24oZSx0LHIpe2godCxmdW5jdGlvbih0KXtpZih0Pj1yKXt2YXIgbj1lW3Rd O2VbdF09bmV3IHUoe25hbWU6bi5uYW1lLGhhbmRsZXI6bi5oYW5kbGVyLHBh cmFtczp7fX0pfX0pfSxvLnByb3RvdHlwZS5nZXRIYW5kbGVySW5mb0ZvckR5 bmFtaWNTZWdtZW50PWZ1bmN0aW9uKGUsdCxyLG4saSl7e3ZhciBvO3IubGVu Z3RofXJldHVybiBuLmxlbmd0aD4wPyhvPW5bbi5sZW5ndGgtMV0sYyhvKT90 aGlzLmNyZWF0ZVBhcmFtSGFuZGxlckluZm8oZSx0LHIsbixpKToobi5wb3Ao KSxuZXcgbCh7bmFtZTplLGhhbmRsZXI6dCxjb250ZXh0Om8sbmFtZXM6cn0p KSk6aSYmaS5uYW1lPT09ZT9pOml9LG8ucHJvdG90eXBlLmNyZWF0ZVBhcmFt SGFuZGxlckluZm89ZnVuY3Rpb24oZSx0LHIsbixpKXtmb3IodmFyIG89e30s YT1yLmxlbmd0aDthLS07KXt2YXIgcz1pJiZlPT09aS5uYW1lJiZpLnBhcmFt c3x8e30sbD1uW24ubGVuZ3RoLTFdLGg9clthXTtpZihjKGwpKW9baF09IiIr bi5wb3AoKTtlbHNle2lmKCFzLmhhc093blByb3BlcnR5KGgpKXRocm93IG5l dyBFcnJvcigiWW91IGRpZG4ndCBwcm92aWRlIGVub3VnaCBzdHJpbmcvbnVt ZXJpYyBwYXJhbWV0ZXJzIHRvIHNhdGlzZnkgYWxsIG9mIHRoZSBkeW5hbWlj IHNlZ21lbnRzIGZvciByb3V0ZSAiK2UpO29baF09c1toXX19cmV0dXJuIG5l dyB1KHtuYW1lOmUsaGFuZGxlcjp0LHBhcmFtczpvfSl9LGkuTmFtZWRUcmFu c2l0aW9uSW50ZW50PW99KSxlKCJyb3V0ZXIvdHJhbnNpdGlvbi1pbnRlbnQv dXJsLXRyYW5zaXRpb24taW50ZW50IixbIi4uL3RyYW5zaXRpb24taW50ZW50 IiwiLi4vdHJhbnNpdGlvbi1zdGF0ZSIsIi4uL2hhbmRsZXItaW5mbyIsIi4u L3V0aWxzIiwiZXhwb3J0cyJdLGZ1bmN0aW9uKGUsdCxyLG4saSl7InVzZSBz dHJpY3QiO2Z1bmN0aW9uIG8oZSl7cy5jYWxsKHRoaXMsZSl9ZnVuY3Rpb24g YShlKXt0aGlzLm1lc3NhZ2U9ZXx8IlVucmVjb2duaXplZFVSTEVycm9yIix0 aGlzLm5hbWU9IlVucmVjb2duaXplZFVSTEVycm9yIn12YXIgcz1lLlRyYW5z aXRpb25JbnRlbnQsdT10LlRyYW5zaXRpb25TdGF0ZSxsPXIuVW5yZXNvbHZl ZEhhbmRsZXJJbmZvQnlQYXJhbSxjPW4ub0NyZWF0ZSxoPW4ubWVyZ2U7by5w cm90b3R5cGU9YyhzLnByb3RvdHlwZSksby5wcm90b3R5cGUuYXBwbHlUb1N0 YXRlPWZ1bmN0aW9uKGUsdCxyKXt2YXIgbixpLG89bmV3IHUscz10LnJlY29n bml6ZSh0aGlzLnVybCk7aWYoIXMpdGhyb3cgbmV3IGEodGhpcy51cmwpO3Zh ciBjPSExO2ZvcihuPTAsaT1zLmxlbmd0aDtpPm47KytuKXt2YXIgbT1zW25d LHA9bS5oYW5kbGVyLGY9cihwKTtpZihmLmluYWNjZXNzaWJsZUJ5VVJMKXRo cm93IG5ldyBhKHRoaXMudXJsKTt2YXIgZD1uZXcgbCh7bmFtZTpwLGhhbmRs ZXI6ZixwYXJhbXM6bS5wYXJhbXN9KSxiPWUuaGFuZGxlckluZm9zW25dO2N8 fGQuc2hvdWxkU3VwZXJjZWRlKGIpPyhjPSEwLG8uaGFuZGxlckluZm9zW25d PWQpOm8uaGFuZGxlckluZm9zW25dPWJ9cmV0dXJuIGgoby5xdWVyeVBhcmFt cyxzLnF1ZXJ5UGFyYW1zKSxvfSxpLlVSTFRyYW5zaXRpb25JbnRlbnQ9b30p LGUoInJvdXRlci90cmFuc2l0aW9uLXN0YXRlIixbIi4vaGFuZGxlci1pbmZv IiwiLi91dGlscyIsInJzdnAiLCJleHBvcnRzIl0sZnVuY3Rpb24oZSx0LHIs bil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoKXt0aGlzLmhhbmRsZXJJbmZv cz1bXSx0aGlzLnF1ZXJ5UGFyYW1zPXt9LHRoaXMucGFyYW1zPXt9fXZhciBv PShlLlJlc29sdmVkSGFuZGxlckluZm8sdC5mb3JFYWNoKSxhPXQucHJvbWlz ZUxhYmVsLHM9ci5yZXNvbHZlLHU9ci5yZWplY3Q7aS5wcm90b3R5cGU9e2hh bmRsZXJJbmZvczpudWxsLHF1ZXJ5UGFyYW1zOm51bGwscGFyYW1zOm51bGws cHJvbWlzZUxhYmVsOmZ1bmN0aW9uKGUpe3ZhciB0PSIiO3JldHVybiBvKHRo aXMuaGFuZGxlckluZm9zLGZ1bmN0aW9uKGUpeyIiIT09dCYmKHQrPSIuIiks dCs9ZS5uYW1lfSksYSgiJyIrdCsiJzogIitlKX0scmVzb2x2ZTpmdW5jdGlv bihlLHQscil7ZnVuY3Rpb24gbigpe3JldHVybiBzKHQoKSxhKCJDaGVjayBp ZiBzaG91bGQgY29udGludWUiKSlbImNhdGNoIl0oZnVuY3Rpb24oZSl7cmV0 dXJuIHA9ITAsdShlKX0sYSgiSGFuZGxlIGFib3J0IikpfWZ1bmN0aW9uIGko ZSl7dmFyIHQ9bS5oYW5kbGVySW5mb3Msbj1yLnJlc29sdmVJbmRleD49dC5s ZW5ndGg/dC5sZW5ndGgtMTpyLnJlc29sdmVJbmRleDtyZXR1cm4gdSh7ZXJy b3I6ZSxoYW5kbGVyV2l0aEVycm9yOm0uaGFuZGxlckluZm9zW25dLmhhbmRs ZXIsd2FzQWJvcnRlZDpwLHN0YXRlOm19KX1mdW5jdGlvbiBsKGUpe20uaGFu ZGxlckluZm9zW3IucmVzb2x2ZUluZGV4KytdPWU7dmFyIHQ9ZS5oYW5kbGVy O3JldHVybiB0JiZ0LnJlZGlyZWN0JiZ0LnJlZGlyZWN0KGUuY29udGV4dCxy KSxuKCkudGhlbihjLG51bGwsYSgiUmVzb2x2ZSBoYW5kbGVyIikpfWZ1bmN0 aW9uIGMoKXtpZihyLnJlc29sdmVJbmRleD09PW0uaGFuZGxlckluZm9zLmxl bmd0aClyZXR1cm57ZXJyb3I6bnVsbCxzdGF0ZTptfTt2YXIgdD1tLmhhbmRs ZXJJbmZvc1tyLnJlc29sdmVJbmRleF07cmV0dXJuIHQucmVzb2x2ZShlLG4s cikudGhlbihsLG51bGwsYSgiUHJvY2VlZCIpKX12YXIgaD10aGlzLnBhcmFt cztvKHRoaXMuaGFuZGxlckluZm9zLGZ1bmN0aW9uKGUpe2hbZS5uYW1lXT1l LnBhcmFtc3x8e319KSxyPXJ8fHt9LHIucmVzb2x2ZUluZGV4PTA7dmFyIG09 dGhpcyxwPSExO3JldHVybiBzKG51bGwsdGhpcy5wcm9taXNlTGFiZWwoIlN0 YXJ0IHRyYW5zaXRpb24iKSkudGhlbihjLG51bGwsdGhpcy5wcm9taXNlTGFi ZWwoIlJlc29sdmUgaGFuZGxlciIpKVsiY2F0Y2giXShpLHRoaXMucHJvbWlz ZUxhYmVsKCJIYW5kbGUgZXJyb3IiKSl9fSxuLlRyYW5zaXRpb25TdGF0ZT1p fSksZSgicm91dGVyL3RyYW5zaXRpb24iLFsicnN2cCIsIi4vaGFuZGxlci1p bmZvIiwiLi91dGlscyIsImV4cG9ydHMiXSxmdW5jdGlvbihlLHQscixuKXsi dXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlLHQscixuKXtmdW5jdGlvbiBhKCl7 cmV0dXJuIGMuaXNBYm9ydGVkP3Modm9pZCAwLHAoIlRyYW5zaXRpb24gYWJv cnRlZCAtIHJlamVjdCIpKTp2b2lkIDB9dmFyIGM9dGhpcztpZih0aGlzLnN0 YXRlPXJ8fGUuc3RhdGUsdGhpcy5pbnRlbnQ9dCx0aGlzLnJvdXRlcj1lLHRo aXMuZGF0YT10aGlzLmludGVudCYmdGhpcy5pbnRlbnQuZGF0YXx8e30sdGhp cy5yZXNvbHZlZE1vZGVscz17fSx0aGlzLnF1ZXJ5UGFyYW1zPXt9LG4pcmV0 dXJuIHRoaXMucHJvbWlzZT1zKG4pLHZvaWQgMDtpZihyKXt0aGlzLnBhcmFt cz1yLnBhcmFtcyx0aGlzLnF1ZXJ5UGFyYW1zPXIucXVlcnlQYXJhbXM7dmFy IGg9ci5oYW5kbGVySW5mb3MubGVuZ3RoO2gmJih0aGlzLnRhcmdldE5hbWU9 ci5oYW5kbGVySW5mb3Nbci5oYW5kbGVySW5mb3MubGVuZ3RoLTFdLm5hbWUp O2Zvcih2YXIgbT0wO2g+bTsrK20pe3ZhciBmPXIuaGFuZGxlckluZm9zW21d O2lmKCEoZiBpbnN0YW5jZW9mIGwpKWJyZWFrO3RoaXMucGl2b3RIYW5kbGVy PWYuaGFuZGxlcn10aGlzLnNlcXVlbmNlPWkuY3VycmVudFNlcXVlbmNlKyss dGhpcy5wcm9taXNlPXIucmVzb2x2ZShlLmFzeW5jLGEsdGhpcylbImNhdGNo Il0oZnVuY3Rpb24oZSl7cmV0dXJuIGUud2FzQWJvcnRlZD9zKG8oYykpOihj LnRyaWdnZXIoImVycm9yIixlLmVycm9yLGMsZS5oYW5kbGVyV2l0aEVycm9y KSxjLmFib3J0KCkscyhlLmVycm9yKSl9LHAoIkhhbmRsZSBBYm9ydCIpKX1l bHNlIHRoaXMucHJvbWlzZT11KHRoaXMuc3RhdGUpLHRoaXMucGFyYW1zPXt9 fWZ1bmN0aW9uIG8oZSl7cmV0dXJuIG0oZS5yb3V0ZXIsZS5zZXF1ZW5jZSwi ZGV0ZWN0ZWQgYWJvcnQuIiksbmV3IGF9ZnVuY3Rpb24gYShlKXt0aGlzLm1l c3NhZ2U9ZXx8IlRyYW5zaXRpb25BYm9ydGVkIix0aGlzLm5hbWU9IlRyYW5z aXRpb25BYm9ydGVkIn12YXIgcz1lLnJlamVjdCx1PWUucmVzb2x2ZSxsPXQu UmVzb2x2ZWRIYW5kbGVySW5mbyxjPXIudHJpZ2dlcixoPXIuc2xpY2UsbT1y LmxvZyxwPXIucHJvbWlzZUxhYmVsO2kuY3VycmVudFNlcXVlbmNlPTAsaS5w cm90b3R5cGU9e3RhcmdldE5hbWU6bnVsbCx1cmxNZXRob2Q6InVwZGF0ZSIs aW50ZW50Om51bGwscGFyYW1zOm51bGwscGl2b3RIYW5kbGVyOm51bGwscmVz b2x2ZUluZGV4OjAsaGFuZGxlckluZm9zOm51bGwscmVzb2x2ZWRNb2RlbHM6 bnVsbCxpc0FjdGl2ZTohMCxzdGF0ZTpudWxsLHByb21pc2U6bnVsbCxkYXRh Om51bGwsdGhlbjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnByb21pc2Uu dGhlbihlLHQpfSxhYm9ydDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlzQWJv cnRlZD90aGlzOihtKHRoaXMucm91dGVyLHRoaXMuc2VxdWVuY2UsdGhpcy50 YXJnZXROYW1lKyI6IHRyYW5zaXRpb24gd2FzIGFib3J0ZWQiKSx0aGlzLmlz QWJvcnRlZD0hMCx0aGlzLmlzQWN0aXZlPSExLHRoaXMucm91dGVyLmFjdGl2 ZVRyYW5zaXRpb249bnVsbCx0aGlzKX0scmV0cnk6ZnVuY3Rpb24oKXtyZXR1 cm4gdGhpcy5hYm9ydCgpLHRoaXMucm91dGVyLnRyYW5zaXRpb25CeUludGVu dCh0aGlzLmludGVudCwhMSl9LG1ldGhvZDpmdW5jdGlvbihlKXtyZXR1cm4g dGhpcy51cmxNZXRob2Q9ZSx0aGlzfSx0cmlnZ2VyOmZ1bmN0aW9uKGUpe3Zh ciB0PWguY2FsbChhcmd1bWVudHMpOyJib29sZWFuIj09dHlwZW9mIGU/dC5z aGlmdCgpOmU9ITEsYyh0aGlzLnJvdXRlcix0aGlzLnN0YXRlLmhhbmRsZXJJ bmZvcy5zbGljZSgwLHRoaXMucmVzb2x2ZUluZGV4KzEpLGUsdCl9LGZvbGxv d1JlZGlyZWN0czpmdW5jdGlvbigpe3ZhciBlPXRoaXMucm91dGVyO3JldHVy biB0aGlzLnByb21pc2VbImNhdGNoIl0oZnVuY3Rpb24odCl7cmV0dXJuIGUu YWN0aXZlVHJhbnNpdGlvbj9lLmFjdGl2ZVRyYW5zaXRpb24uZm9sbG93UmVk aXJlY3RzKCk6cyh0KX0pfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiJU cmFuc2l0aW9uIChzZXF1ZW5jZSAiK3RoaXMuc2VxdWVuY2UrIikifSxsb2c6 ZnVuY3Rpb24oZSl7bSh0aGlzLnJvdXRlcix0aGlzLnNlcXVlbmNlLGUpfX0s aS5wcm90b3R5cGUuc2VuZD1pLnByb3RvdHlwZS50cmlnZ2VyLG4uVHJhbnNp dGlvbj1pLG4ubG9nQWJvcnQ9byxuLlRyYW5zaXRpb25BYm9ydGVkPWF9KSxl KCJyb3V0ZXIvdXRpbHMiLFsiZXhwb3J0cyJdLGZ1bmN0aW9uKGUpeyJ1c2Ug c3RyaWN0IjtmdW5jdGlvbiB0KGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9 PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9ZnVuY3Rpb24g cihlLHQpe2Zvcih2YXIgciBpbiB0KXQuaGFzT3duUHJvcGVydHkocikmJihl W3JdPXRbcl0pfWZ1bmN0aW9uIG4oZSl7dmFyIHQscixuPWUmJmUubGVuZ3Ro O3JldHVybiBuJiZuPjAmJmVbbi0xXSYmZVtuLTFdLmhhc093blByb3BlcnR5 KCJxdWVyeVBhcmFtcyIpPyhyPWVbbi0xXS5xdWVyeVBhcmFtcyx0PXAuY2Fs bChlLDAsbi0xKSxbdCxyXSk6W2UsbnVsbF19ZnVuY3Rpb24gaShlKXtmb3Io dmFyIHIgaW4gZSlpZigibnVtYmVyIj09dHlwZW9mIGVbcl0pZVtyXT0iIitl W3JdO2Vsc2UgaWYodChlW3JdKSlmb3IodmFyIG49MCxpPWVbcl0ubGVuZ3Ro O2k+bjtuKyspZVtyXVtuXT0iIitlW3JdW25dfWZ1bmN0aW9uIG8oZSx0LHIp e2UubG9nJiYoMz09PWFyZ3VtZW50cy5sZW5ndGg/ZS5sb2coIlRyYW5zaXRp b24gIyIrdCsiOiAiK3IpOihyPXQsZS5sb2cocikpKX1mdW5jdGlvbiBhKGUs dCl7dmFyIHI9YXJndW1lbnRzO3JldHVybiBmdW5jdGlvbihuKXt2YXIgaT1w LmNhbGwociwyKTtyZXR1cm4gaS5wdXNoKG4pLGUuYXBwbHkodCxpKX19ZnVu Y3Rpb24gcyhlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV8fGUgaW5zdGFu Y2VvZiBTdHJpbmd8fCJudW1iZXIiPT10eXBlb2YgZXx8ZSBpbnN0YW5jZW9m IE51bWJlcn1mdW5jdGlvbiB1KGUsdCl7Zm9yKHZhciByPTAsbj1lLmxlbmd0 aDtuPnImJiExIT09dChlW3JdKTtyKyspO31mdW5jdGlvbiBsKGUsdCxyKXt2 YXIgbj17fTtpZihzKHQpKXJldHVybiBuW3JbMF1dPXQsbjtpZihlLnNlcmlh bGl6ZSlyZXR1cm4gZS5zZXJpYWxpemUodCxyKTtpZigxPT09ci5sZW5ndGgp e3ZhciBpPXJbMF07cmV0dXJuIG5baV09L19pZCQvLnRlc3QoaSk/dC5pZDp0 LG59fWZ1bmN0aW9uIGMoZSx0LHIsbil7aWYoZS50cmlnZ2VyRXZlbnQpcmV0 dXJuIGUudHJpZ2dlckV2ZW50KHQscixuKSx2b2lkIDA7dmFyIGk9bi5zaGlm dCgpO2lmKCF0KXtpZihyKXJldHVybjt0aHJvdyBuZXcgRXJyb3IoIkNvdWxk IG5vdCB0cmlnZ2VyIGV2ZW50ICciK2krIicuIFRoZXJlIGFyZSBubyBhY3Rp dmUgaGFuZGxlcnMiKX1mb3IodmFyIG89ITEsYT10Lmxlbmd0aC0xO2E+PTA7 YS0tKXt2YXIgcz10W2FdLHU9cy5oYW5kbGVyO2lmKHUuZXZlbnRzJiZ1LmV2 ZW50c1tpXSl7aWYodS5ldmVudHNbaV0uYXBwbHkodSxuKSE9PSEwKXJldHVy bjtvPSEwfX1pZighbyYmIXIpdGhyb3cgbmV3IEVycm9yKCJOb3RoaW5nIGhh bmRsZWQgdGhlIGV2ZW50ICciK2krIicuIil9ZnVuY3Rpb24gaChlLG4pe3Zh ciBvLGE9e2FsbDp7fSxjaGFuZ2VkOnt9LHJlbW92ZWQ6e319O3IoYS5hbGws bik7dmFyIHM9ITE7aShlKSxpKG4pO2ZvcihvIGluIGUpZS5oYXNPd25Qcm9w ZXJ0eShvKSYmKG4uaGFzT3duUHJvcGVydHkobyl8fChzPSEwLGEucmVtb3Zl ZFtvXT1lW29dKSk7Zm9yKG8gaW4gbilpZihuLmhhc093blByb3BlcnR5KG8p KWlmKHQoZVtvXSkmJnQobltvXSkpaWYoZVtvXS5sZW5ndGghPT1uW29dLmxl bmd0aClhLmNoYW5nZWRbb109bltvXSxzPSEwO2Vsc2UgZm9yKHZhciB1PTAs bD1lW29dLmxlbmd0aDtsPnU7dSsrKWVbb11bdV0hPT1uW29dW3VdJiYoYS5j aGFuZ2VkW29dPW5bb10scz0hMCk7ZWxzZSBlW29dIT09bltvXSYmKGEuY2hh bmdlZFtvXT1uW29dLHM9ITApO3JldHVybiBzJiZhfWZ1bmN0aW9uIG0oZSl7 cmV0dXJuIlJvdXRlcjogIitlfXZhciBwPUFycmF5LnByb3RvdHlwZS5zbGlj ZSxmPU9iamVjdC5jcmVhdGV8fGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXt9 cmV0dXJuIHQucHJvdG90eXBlPWUsbmV3IHR9O2UudHJpZ2dlcj1jLGUubG9n PW8sZS5vQ3JlYXRlPWYsZS5tZXJnZT1yLGUuZXh0cmFjdFF1ZXJ5UGFyYW1z PW4sZS5iaW5kPWEsZS5pc1BhcmFtPXMsZS5mb3JFYWNoPXUsZS5zbGljZT1w LGUuc2VyaWFsaXplPWwsZS5nZXRDaGFuZ2VsaXN0PWgsZS5jb2VyY2VRdWVy eVBhcmFtc1RvU3RyaW5nPWksZS5wcm9taXNlTGFiZWw9bX0pLGUoInJvdXRl ciIsWyIuL3JvdXRlci9yb3V0ZXIiLCJleHBvcnRzIl0sZnVuY3Rpb24oZSx0 KXsidXNlIHN0cmljdCI7dmFyIHI9ZS5Sb3V0ZXI7dC5Sb3V0ZXI9cn0pfSgp LGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt0aGlzLnBhcmVudD1lLHRoaXMu bWF0Y2hlcz1bXX1mdW5jdGlvbiB0KGUsdCxyKXtyPXJ8fHt9LCJzdHJpbmci IT10eXBlb2Ygci5wYXRoJiYoci5wYXRoPSIvIit0KSxlLnBhcmVudCYmImFw cGxpY2F0aW9uIiE9PWUucGFyZW50JiYodD1lLnBhcmVudCsiLiIrdCksZS5w dXNoKHIucGF0aCx0LG51bGwpfWUucHJvdG90eXBlPXtyZXNvdXJjZTpmdW5j dGlvbihyLG4saSl7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgmJiJmdW5jdGlv biI9PXR5cGVvZiBuJiYoaT1uLG49e30pLDE9PT1hcmd1bWVudHMubGVuZ3Ro JiYobj17fSksInN0cmluZyIhPXR5cGVvZiBuLnBhdGgmJihuLnBhdGg9Ii8i K3IpLGkpe3ZhciBvPW5ldyBlKHIpOwp0KG8sImxvYWRpbmciKSx0KG8sImVy cm9yIix7cGF0aDoiL191bnVzZWRfZHVtbXlfZXJyb3JfcGF0aF9yb3V0ZV8i K3IrIi86ZXJyb3IifSksaS5jYWxsKG8pLHRoaXMucHVzaChuLnBhdGgscixv LmdlbmVyYXRlKCkpfWVsc2UgdGhpcy5wdXNoKG4ucGF0aCxyLG51bGwpO0Vt YmVyLkZFQVRVUkVTLmlzRW5hYmxlZCgiZW1iZXItcm91dGluZy1uYW1lZC1z dWJzdGF0ZXMiKSYmKHI9ci5zcGxpdCgiLiIpLnBvcCgpLHQodGhpcyxyKyJf bG9hZGluZyIpLHQodGhpcyxyKyJfZXJyb3IiLHtwYXRoOiIvX3VudXNlZF9k dW1teV9lcnJvcl9wYXRoX3JvdXRlXyIrcisiLzplcnJvciJ9KSl9LHB1c2g6 ZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXQuc3BsaXQoIi4iKTsoIiI9PT1lfHwi LyI9PT1lfHwiaW5kZXgiPT09bltuLmxlbmd0aC0xXSkmJih0aGlzLmV4cGxp Y2l0SW5kZXg9ITApLHRoaXMubWF0Y2hlcy5wdXNoKFtlLHQscl0pfSxyb3V0 ZTpmdW5jdGlvbihlLHIpe3QodGhpcyxlLHIpLEVtYmVyLkZFQVRVUkVTLmlz RW5hYmxlZCgiZW1iZXItcm91dGluZy1uYW1lZC1zdWJzdGF0ZXMiKSYmKHQo dGhpcyxlKyJfbG9hZGluZyIpLHQodGhpcyxlKyJfZXJyb3IiLHtwYXRoOiIv X3VudXNlZF9kdW1teV9lcnJvcl9wYXRoX3JvdXRlXyIrZSsiLzplcnJvciJ9 KSl9LGdlbmVyYXRlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5tYXRjaGVzO3Jl dHVybiB0aGlzLmV4cGxpY2l0SW5kZXh8fHRoaXMucm91dGUoImluZGV4Iix7 cGF0aDoiLyJ9KSxmdW5jdGlvbih0KXtmb3IodmFyIHI9MCxuPWUubGVuZ3Ro O24+cjtyKyspe3ZhciBpPWVbcl07dChpWzBdKS50byhpWzFdLGlbMl0pfX19 fSxlLm1hcD1mdW5jdGlvbih0KXt2YXIgcj1uZXcgZTtyZXR1cm4gdC5jYWxs KHIpLHJ9LEVtYmVyLlJvdXRlckRTTD1lfSgpLGZ1bmN0aW9uKCl7dmFyIGU9 RW1iZXIuZ2V0O0VtYmVyLmNvbnRyb2xsZXJGb3I9ZnVuY3Rpb24oZSx0LHIp e3JldHVybiBlLmxvb2t1cCgiY29udHJvbGxlcjoiK3Qscil9LEVtYmVyLmdl bmVyYXRlQ29udHJvbGxlckZhY3Rvcnk9ZnVuY3Rpb24oZSx0LHIpe3ZhciBu LGksbyxhO3JldHVybiBhPXImJkVtYmVyLmlzQXJyYXkocik/ImFycmF5Ijpy PyJvYmplY3QiOiJiYXNpYyIsbz0iY29udHJvbGxlcjoiK2Esbj1lLmxvb2t1 cEZhY3RvcnkobykuZXh0ZW5kKHtpc0dlbmVyYXRlZDohMCx0b1N0cmluZzpm dW5jdGlvbigpe3JldHVybiIoZ2VuZXJhdGVkICIrdCsiIGNvbnRyb2xsZXIp In19KSxpPSJjb250cm9sbGVyOiIrdCxlLnJlZ2lzdGVyKGksbiksbn0sRW1i ZXIuZ2VuZXJhdGVDb250cm9sbGVyPWZ1bmN0aW9uKHQscixuKXtFbWJlci5n ZW5lcmF0ZUNvbnRyb2xsZXJGYWN0b3J5KHQscixuKTt2YXIgaT0iY29udHJv bGxlcjoiK3Isbz10Lmxvb2t1cChpKTtyZXR1cm4gZShvLCJuYW1lc3BhY2Uu TE9HX0FDVElWRV9HRU5FUkFUSU9OIiksb319KCksZnVuY3Rpb24oKXtmdW5j dGlvbiBlKGUsdCl7dmFyIG49ZS5jb250cm9sbGVyTmFtZXx8ZS5yb3V0ZU5h bWUsaT1yKG4sZS5jb250YWluZXIpLG89aChpLCJxdWVyeVBhcmFtcyIpO28m JmQobyxmdW5jdGlvbihlKXt2YXIgcixpPWUuc3BsaXQoIjoiKTtyPWkubGVu Z3RoPjE/aVsxXToiYXBwbGljYXRpb24iIT09bj9uKyJbIitlKyJdIjplO3Zh ciBvPW4rIjoiK2U7dC5xdWVyeVBhcmFtc1tvXT1yLHQudHJhbnNsYXRpb25z W2lbMF1dPW99KX1mdW5jdGlvbiByKGUsdCl7dmFyIHI9ImNvbnRyb2xsZXI6 IitlO2lmKHQuY2FjaGUuaGFzKHIpKXJldHVybiB0Lmxvb2t1cChyKTt2YXIg bj10Lmxvb2t1cEZhY3Rvcnkocik7cmV0dXJuIG4mJiJmdW5jdGlvbiI9PXR5 cGVvZiBuLnByb3RvP24ucHJvdG8oKTp7fX1mdW5jdGlvbiBuKGUpe3ZhciB0 LHIsbj17fTtmb3IociBpbiBlKXQ9RW1iZXIuUm91dGVyLl9kZXNjb3BlUXVl cnlQYXJhbShlW3JdKSxuW3RdPW5bdF0/blt0XSsxOjE7Zm9yKHIgaW4gZSl0 PUVtYmVyLlJvdXRlci5fZGVzY29wZVF1ZXJ5UGFyYW0oZVtyXSksMT09PW5b dF0mJihlW3JdPXQpfWZ1bmN0aW9uIGkoZSx0LHIpe2Zvcih2YXIgbj10LnN0 YXRlLmhhbmRsZXJJbmZvcyxpPSExLG89bi5sZW5ndGgtMTtvPj0wOy0tbyl7 dmFyIGE9bltvXSxzPWEuaGFuZGxlcjtpZihpKXtpZihyKHMsbltvKzFdLmhh bmRsZXIpIT09ITApcmV0dXJuITF9ZWxzZSBlPT09cyYmKGk9ITApfXJldHVy biEwfWZ1bmN0aW9uIG8oZSx0LHIpe3ZhciBuLGk9ZS5yb3V0ZXIsbz10LnJv dXRlTmFtZS5zcGxpdCgiLiIpLnBvcCgpLHM9ImFwcGxpY2F0aW9uIj09PWUu cm91dGVOYW1lPyIiOmUucm91dGVOYW1lKyIuIjtyZXR1cm4gRW1iZXIuRkVB VFVSRVMuaXNFbmFibGVkKCJlbWJlci1yb3V0aW5nLW5hbWVkLXN1YnN0YXRl cyIpJiYobj1zK28rIl8iK3IsYShpLG4pKT9uOihuPXMrcixhKGksbik/bjp2 b2lkIDApfWZ1bmN0aW9uIGEoZSx0KXt2YXIgcj1lLmNvbnRhaW5lcjtyZXR1 cm4gZS5oYXNSb3V0ZSh0KSYmKHIuaGFzKCJ0ZW1wbGF0ZToiK3QpfHxyLmhh cygicm91dGU6Iit0KSl9ZnVuY3Rpb24gcyhlLHQscil7dmFyIG49ci5zaGlm dCgpO2lmKCFlKXtpZih0KXJldHVybjt0aHJvdyBuZXcgRW1iZXIuRXJyb3Io IkNhbid0IHRyaWdnZXIgYWN0aW9uICciK24rIicgYmVjYXVzZSB5b3VyIGFw cCBoYXNuJ3QgZmluaXNoZWQgdHJhbnNpdGlvbmluZyBpbnRvIGl0cyBmaXJz dCByb3V0ZS4gVG8gdHJpZ2dlciBhbiBhY3Rpb24gb24gZGVzdGluYXRpb24g cm91dGVzIGR1cmluZyBhIHRyYW5zaXRpb24sIHlvdSBjYW4gY2FsbCBgLnNl bmQoKWAgb24gdGhlIGBUcmFuc2l0aW9uYCBvYmplY3QgcGFzc2VkIHRvIHRo ZSBgbW9kZWwvYmVmb3JlTW9kZWwvYWZ0ZXJNb2RlbGAgaG9va3MuIil9Zm9y KHZhciBpPSExLG89ZS5sZW5ndGgtMTtvPj0wO28tLSl7dmFyIGE9ZVtvXSxz PWEuaGFuZGxlcjtpZihzLl9hY3Rpb25zJiZzLl9hY3Rpb25zW25dKXtpZihz Ll9hY3Rpb25zW25dLmFwcGx5KHMscikhPT0hMClyZXR1cm47aT0hMH19aWYo RVtuXSlyZXR1cm4gRVtuXS5hcHBseShudWxsLHIpLHZvaWQgMDtpZighaSYm IXQpdGhyb3cgbmV3IEVtYmVyLkVycm9yKCJOb3RoaW5nIGhhbmRsZWQgdGhl IGFjdGlvbiAnIituKyInLiBJZiB5b3UgZGlkIGhhbmRsZSB0aGUgYWN0aW9u LCB0aGlzIGVycm9yIGNhbiBiZSBjYXVzZWQgYnkgcmV0dXJuaW5nIHRydWUg ZnJvbSBhbiBhY3Rpb24gaGFuZGxlciBpbiBhIGNvbnRyb2xsZXIsIGNhdXNp bmcgdGhlIGFjdGlvbiB0byBidWJibGUuIil9ZnVuY3Rpb24gdShlKXt2YXIg dD1lLmNvbnRhaW5lci5sb29rdXAoImNvbnRyb2xsZXI6YXBwbGljYXRpb24i KTtpZih0KXt2YXIgcj1lLnJvdXRlci5jdXJyZW50SGFuZGxlckluZm9zLG49 RW1iZXIuUm91dGVyLl9yb3V0ZVBhdGgocik7ImN1cnJlbnRQYXRoImluIHR8 fHAodCwiY3VycmVudFBhdGgiKSxtKHQsImN1cnJlbnRQYXRoIixuKSwiY3Vy cmVudFJvdXRlTmFtZSJpbiB0fHxwKHQsImN1cnJlbnRSb3V0ZU5hbWUiKSxt KHQsImN1cnJlbnRSb3V0ZU5hbWUiLHJbci5sZW5ndGgtMV0ubmFtZSl9fXZh ciBsPXQoInJvdXRlciIpLGM9bC5Sb3V0ZXIsaD0obC5UcmFuc2l0aW9uLEVt YmVyLmdldCksbT1FbWJlci5zZXQscD0oRW1iZXIuU3RyaW5nLmZtdCxFbWJl ci5kZWZpbmVQcm9wZXJ0eSksZj1BcnJheS5wcm90b3R5cGUuc2xpY2UsZD1F bWJlci5FbnVtZXJhYmxlVXRpbHMuZm9yRWFjaCxiPUVtYmVyLl9NZXRhbW9y cGhWaWV3O0VtYmVyLlJvdXRlcj1FbWJlci5PYmplY3QuZXh0ZW5kKEVtYmVy LkV2ZW50ZWQse2xvY2F0aW9uOiJoYXNoIixpbml0OmZ1bmN0aW9uKCl7dGhp cy5yb3V0ZXI9dGhpcy5jb25zdHJ1Y3Rvci5yb3V0ZXJ8fHRoaXMuY29uc3Ry dWN0b3IubWFwKEVtYmVyLkspLHRoaXMuX2FjdGl2ZVZpZXdzPXt9LHRoaXMu X3NldHVwTG9jYXRpb24oKSxoKHRoaXMsIm5hbWVzcGFjZS5MT0dfVFJBTlNJ VElPTlNfSU5URVJOQUwiKSYmKHRoaXMucm91dGVyLmxvZz1FbWJlci5Mb2dn ZXIuZGVidWcpfSx1cmw6RW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKXtyZXR1 cm4gaCh0aGlzLCJsb2NhdGlvbiIpLmdldFVSTCgpfSksc3RhcnRSb3V0aW5n OmZ1bmN0aW9uKCl7dGhpcy5yb3V0ZXI9dGhpcy5yb3V0ZXJ8fHRoaXMuY29u c3RydWN0b3IubWFwKEVtYmVyLkspO3ZhciBlPXRoaXMucm91dGVyLHQ9aCh0 aGlzLCJsb2NhdGlvbiIpLHI9dGhpcy5jb250YWluZXIsbj10aGlzLGk9aCh0 aGlzLCJpbml0aWFsVVJMIik7aCh0LCJjYW5jZWxSb3V0ZXJTZXR1cCIpfHwo dGhpcy5fc2V0dXBSb3V0ZXIoZSx0KSxyLnJlZ2lzdGVyKCJ2aWV3OmRlZmF1 bHQiLGIpLHIucmVnaXN0ZXIoInZpZXc6dG9wbGV2ZWwiLEVtYmVyLlZpZXcu ZXh0ZW5kKCkpLHQub25VcGRhdGVVUkwoZnVuY3Rpb24oZSl7bi5oYW5kbGVV UkwoZSl9KSwidW5kZWZpbmVkIj09dHlwZW9mIGkmJihpPXQuZ2V0VVJMKCkp LHRoaXMuaGFuZGxlVVJMKGkpKX0sZGlkVHJhbnNpdGlvbjpmdW5jdGlvbihl KXt1KHRoaXMpLHRoaXMuX2NhbmNlbExvYWRpbmdFdmVudCgpLHRoaXMubm90 aWZ5UHJvcGVydHlDaGFuZ2UoInVybCIpLEVtYmVyLnJ1bi5vbmNlKHRoaXMs dGhpcy50cmlnZ2VyLCJkaWRUcmFuc2l0aW9uIiksaCh0aGlzLCJuYW1lc3Bh Y2UiKS5MT0dfVFJBTlNJVElPTlMmJkVtYmVyLkxvZ2dlci5sb2coIlRyYW5z aXRpb25lZCBpbnRvICciK0VtYmVyLlJvdXRlci5fcm91dGVQYXRoKGUpKyIn Iil9LGhhbmRsZVVSTDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fZG9UcmFu c2l0aW9uKCJoYW5kbGVVUkwiLFtlXSl9LHRyYW5zaXRpb25UbzpmdW5jdGlv bigpe3JldHVybiB0aGlzLl9kb1RyYW5zaXRpb24oInRyYW5zaXRpb25UbyIs YXJndW1lbnRzKX0saW50ZXJtZWRpYXRlVHJhbnNpdGlvblRvOmZ1bmN0aW9u KCl7dGhpcy5yb3V0ZXIuaW50ZXJtZWRpYXRlVHJhbnNpdGlvblRvLmFwcGx5 KHRoaXMucm91dGVyLGFyZ3VtZW50cyksdSh0aGlzKTt2YXIgZT10aGlzLnJv dXRlci5jdXJyZW50SGFuZGxlckluZm9zO2godGhpcywibmFtZXNwYWNlIiku TE9HX1RSQU5TSVRJT05TJiZFbWJlci5Mb2dnZXIubG9nKCJJbnRlcm1lZGlh dGUtdHJhbnNpdGlvbmVkIGludG8gJyIrRW1iZXIuUm91dGVyLl9yb3V0ZVBh dGgoZSkrIiciKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhp cy5fZG9UcmFuc2l0aW9uKCJyZXBsYWNlV2l0aCIsYXJndW1lbnRzKX0sZ2Vu ZXJhdGU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJvdXRlci5nZW5lcmF0ZS5h cHBseSh0aGlzLnJvdXRlcixhcmd1bWVudHMpO3JldHVybiB0aGlzLmxvY2F0 aW9uLmZvcm1hdFVSTChlKX0saXNBY3RpdmU6ZnVuY3Rpb24oKXt2YXIgZT10 aGlzLnJvdXRlcjtyZXR1cm4gZS5pc0FjdGl2ZS5hcHBseShlLGFyZ3VtZW50 cyl9LHNlbmQ6ZnVuY3Rpb24oKXt0aGlzLnJvdXRlci50cmlnZ2VyLmFwcGx5 KHRoaXMucm91dGVyLGFyZ3VtZW50cyl9LGhhc1JvdXRlOmZ1bmN0aW9uKGUp e3JldHVybiB0aGlzLnJvdXRlci5oYXNSb3V0ZShlKX0scmVzZXQ6ZnVuY3Rp b24oKXt0aGlzLnJvdXRlci5yZXNldCgpfSxfbG9va3VwQWN0aXZlVmlldzpm dW5jdGlvbihlKXt2YXIgdD10aGlzLl9hY3RpdmVWaWV3c1tlXTtyZXR1cm4g dCYmdFswXX0sX2Nvbm5lY3RBY3RpdmVWaWV3OmZ1bmN0aW9uKGUsdCl7dmFy IHI9dGhpcy5fYWN0aXZlVmlld3NbZV07ciYmclswXS5vZmYoIndpbGxEZXN0 cm95RWxlbWVudCIsdGhpcyxyWzFdKTt2YXIgbj1mdW5jdGlvbigpe2RlbGV0 ZSB0aGlzLl9hY3RpdmVWaWV3c1tlXX07dGhpcy5fYWN0aXZlVmlld3NbZV09 W3Qsbl0sdC5vbmUoIndpbGxEZXN0cm95RWxlbWVudCIsdGhpcyxuKX0sX3Nl dHVwTG9jYXRpb246ZnVuY3Rpb24oKXt2YXIgZT1oKHRoaXMsImxvY2F0aW9u IiksdD1oKHRoaXMsInJvb3RVUkwiKTtpZigic3RyaW5nIj09dHlwZW9mIGUm JnRoaXMuY29udGFpbmVyKXt2YXIgcj10aGlzLmNvbnRhaW5lci5sb29rdXAo ImxvY2F0aW9uOiIrZSk7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiByKWU9bSh0 aGlzLCJsb2NhdGlvbiIscik7ZWxzZXt2YXIgbj17aW1wbGVtZW50YXRpb246 ZX07ZT1tKHRoaXMsImxvY2F0aW9uIixFbWJlci5Mb2NhdGlvbi5jcmVhdGUo bikpfX0ic3RyaW5nIj09dHlwZW9mIHQmJihlLnJvb3RVUkw9dCksImZ1bmN0 aW9uIj09dHlwZW9mIGUuaW5pdFN0YXRlJiZlLmluaXRTdGF0ZSgpfSxfZ2V0 SGFuZGxlckZ1bmN0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9e30sdD10aGlzLmNv bnRhaW5lcixyPXQubG9va3VwRmFjdG9yeSgicm91dGU6YmFzaWMiKSxuPXRo aXM7cmV0dXJuIGZ1bmN0aW9uKGkpe3ZhciBvPSJyb3V0ZToiK2ksYT10Lmxv b2t1cChvKTtyZXR1cm4gZVtpXT9hOihlW2ldPSEwLGF8fCh0LnJlZ2lzdGVy KG8sci5leHRlbmQoKSksYT10Lmxvb2t1cChvKSxoKG4sIm5hbWVzcGFjZS5M T0dfQUNUSVZFX0dFTkVSQVRJT04iKSksYS5yb3V0ZU5hbWU9aSxhKX19LF9z ZXR1cFJvdXRlcjpmdW5jdGlvbihlLHQpe3ZhciByLG49dGhpcztlLmdldEhh bmRsZXI9dGhpcy5fZ2V0SGFuZGxlckZ1bmN0aW9uKCk7dmFyIGk9ZnVuY3Rp b24oKXt0LnNldFVSTChyKX07aWYoZS51cGRhdGVVUkw9ZnVuY3Rpb24oZSl7 cj1lLEVtYmVyLnJ1bi5vbmNlKGkpfSx0LnJlcGxhY2VVUkwpe3ZhciBvPWZ1 bmN0aW9uKCl7dC5yZXBsYWNlVVJMKHIpfTtlLnJlcGxhY2VVUkw9ZnVuY3Rp b24oZSl7cj1lLEVtYmVyLnJ1bi5vbmNlKG8pfX1lLmRpZFRyYW5zaXRpb249 ZnVuY3Rpb24oZSl7bi5kaWRUcmFuc2l0aW9uKGUpfX0sX2RvVHJhbnNpdGlv bjpmdW5jdGlvbihlLHQpe3Q9Zi5jYWxsKHQpLHRbMF09dFswXXx8Ii8iO3Zh ciByLG49dFswXSxpPSExO2lmKEVtYmVyLkZFQVRVUkVTLmlzRW5hYmxlZCgi cXVlcnktcGFyYW1zLW5ldyIpKXt2YXIgbz10W3QubGVuZ3RoLTFdO28mJm8u aGFzT3duUHJvcGVydHkoInF1ZXJ5UGFyYW1zIikmJigxPT09dC5sZW5ndGgm JihpPSEwLG49bnVsbCkscj10W3QubGVuZ3RoLTFdLnF1ZXJ5UGFyYW1zKX1p ZighaSYmIi8iIT09bi5jaGFyQXQoMCkscil7aWYoIW4pe3ZhciBhPXRoaXMu cm91dGVyLmFjdGl2ZVRyYW5zaXRpb24/dGhpcy5yb3V0ZXIuYWN0aXZlVHJh bnNpdGlvbi5zdGF0ZS5oYW5kbGVySW5mb3M6dGhpcy5yb3V0ZXIuc3RhdGUu aGFuZGxlckluZm9zO249YVthLmxlbmd0aC0xXS5uYW1lLHQudW5zaGlmdChu KX12YXIgcz10aGlzLl9xdWVyeVBhcmFtTmFtZXNGb3Iobik7RW1iZXIuUm91 dGVyLl90cmFuc2xhdGVRdWVyeVBhcmFtcyhyLHMudHJhbnNsYXRpb25zLG4p O3ZhciB1O2Zvcih2YXIgbCBpbiByKXt2YXIgYz1FbWJlci5Sb3V0ZXIuX2Rl c2NvcGVRdWVyeVBhcmFtKGwpO2wgaW4gcy5xdWVyeVBhcmFtcz8odT1yW2xd LGRlbGV0ZSByW2xdLHJbcy5xdWVyeVBhcmFtc1tsXV09dSk6YyBpbiBzLnZh bGlkUXVlcnlQYXJhbXMmJih1PXJbbF0sZGVsZXRlIHJbbF0scltjXT11KX19 dmFyIGg9dGhpcy5yb3V0ZXJbZV0uYXBwbHkodGhpcy5yb3V0ZXIsdCk7cmV0 dXJuIGgudGhlbihudWxsLGZ1bmN0aW9uKGUpe2UmJiJVbnJlY29nbml6ZWRV UkxFcnJvciI9PT1lLm5hbWV9LCJFbWJlcjogQ2hlY2sgZm9yIFJvdXRlciB1 bnJlY29nbml6ZWQgVVJMIGVycm9yIiksaH0sX3NjaGVkdWxlTG9hZGluZ0V2 ZW50OmZ1bmN0aW9uKGUsdCl7dGhpcy5fY2FuY2VsTG9hZGluZ0V2ZW50KCks dGhpcy5fbG9hZGluZ1N0YXRlVGltZXI9RW1iZXIucnVuLnNjaGVkdWxlT25j ZSgicm91dGVyVHJhbnNpdGlvbnMiLHRoaXMsIl9maXJlTG9hZGluZ0V2ZW50 IixlLHQpfSxfZmlyZUxvYWRpbmdFdmVudDpmdW5jdGlvbihlLHQpe3RoaXMu cm91dGVyLmFjdGl2ZVRyYW5zaXRpb24mJmUudHJpZ2dlcighMCwibG9hZGlu ZyIsZSx0KX0sX2NhbmNlbExvYWRpbmdFdmVudDpmdW5jdGlvbigpe3RoaXMu X2xvYWRpbmdTdGF0ZVRpbWVyJiZFbWJlci5ydW4uY2FuY2VsKHRoaXMuX2xv YWRpbmdTdGF0ZVRpbWVyKSx0aGlzLl9sb2FkaW5nU3RhdGVUaW1lcj1udWxs fSxfcXVlcnlQYXJhbU5hbWVzRm9yOmZ1bmN0aW9uKHQpe3ZhciByPXRoaXMu cm91dGVyLnJlY29nbml6ZXIuaGFuZGxlcnNGb3IodCksaT17cXVlcnlQYXJh bXM6RW1iZXIuY3JlYXRlKG51bGwpLHRyYW5zbGF0aW9uczpFbWJlci5jcmVh dGUobnVsbCksdmFsaWRRdWVyeVBhcmFtczpFbWJlci5jcmVhdGUobnVsbCl9 LG89dGhpcy5yb3V0ZXI7ZChyLGZ1bmN0aW9uKHQpe3ZhciByPW8uZ2V0SGFu ZGxlcih0LmhhbmRsZXIpO2UocixpKX0pLG4oaS5xdWVyeVBhcmFtcyk7Zm9y KHZhciBhIGluIGkucXVlcnlQYXJhbXMpaS52YWxpZFF1ZXJ5UGFyYW1zW2ku cXVlcnlQYXJhbXNbYV1dPSEwO3JldHVybiBpfSxfcXVlcnlQYXJhbU5hbWVz Rm9yU2luZ2xlOmZ1bmN0aW9uKHQpe3ZhciByPXtxdWVyeVBhcmFtczpFbWJl ci5jcmVhdGUobnVsbCksdHJhbnNsYXRpb25zOkVtYmVyLmNyZWF0ZShudWxs KX0sbj10aGlzLnJvdXRlci5nZXRIYW5kbGVyKHQpO2lmKGUobixyKSwiYXBw bGljYXRpb24iIT09dCl7dmFyIGk9dGhpcy5fcXVlcnlQYXJhbU5hbWVzRm9y KHQpO2Zvcih2YXIgbyBpbiByLnF1ZXJ5UGFyYW1zKXIucXVlcnlQYXJhbXNb b109aS5xdWVyeVBhcmFtc1tvXX1yZXR1cm4gcn0sX3F1ZXJ5UGFyYW1PdmVy cmlkZXM6ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgaSBpbiB0KXt2YXIgbz1p LnNwbGl0KCI6IiksYT1yKG9bMF0sdGhpcy5jb250YWluZXIpO2VbdFtpXV09 aChhLG9bMV0pLG4mJm4oaSx0W2ldLGkpfX19KTt2YXIgRT17d2lsbFJlc29s dmVNb2RlbDpmdW5jdGlvbihlLHQpe3Qucm91dGVyLl9zY2hlZHVsZUxvYWRp bmdFdmVudChlLHQpfSxlcnJvcjpmdW5jdGlvbihlLHQscil7dmFyIG49ci5y b3V0ZXIscz1pKHIsdCxmdW5jdGlvbih0LHIpe3ZhciBpPW8odCxyLCJlcnJv ciIpO3JldHVybiBpPyhuLmludGVybWVkaWF0ZVRyYW5zaXRpb25UbyhpLGUp LHZvaWQgMCk6ITB9KTtyZXR1cm4gcz9hKHIucm91dGVyLCJhcHBsaWNhdGlv bl9lcnJvciIpPyhuLmludGVybWVkaWF0ZVRyYW5zaXRpb25UbygiYXBwbGlj YXRpb25fZXJyb3IiLGUpLHZvaWQgMCk6KEVtYmVyLkxvZ2dlci5lcnJvcigi RXJyb3Igd2hpbGUgbG9hZGluZyByb3V0ZTogIisoZSYmZS5zdGFjaykpLHZv aWQgMCk6dm9pZCAwfSxsb2FkaW5nOmZ1bmN0aW9uKGUsdCl7dmFyIHI9dC5y b3V0ZXIsbj1pKHQsZSxmdW5jdGlvbih0LG4pe3ZhciBpPW8odCxuLCJsb2Fk aW5nIik7cmV0dXJuIGk/KHIuaW50ZXJtZWRpYXRlVHJhbnNpdGlvblRvKGkp LHZvaWQgMCk6ZS5waXZvdEhhbmRsZXIhPT10PyEwOnZvaWQgMH0pO3JldHVy biBuJiZhKHQucm91dGVyLCJhcHBsaWNhdGlvbl9sb2FkaW5nIik/KHIuaW50 ZXJtZWRpYXRlVHJhbnNpdGlvblRvKCJhcHBsaWNhdGlvbl9sb2FkaW5nIiks dm9pZCAwKTp2b2lkIDB9fTtFbWJlci5Sb3V0ZXIucmVvcGVuQ2xhc3Moe3Jv dXRlcjpudWxsLG1hcDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLnJvdXRlcjt0 fHwodD1uZXcgYyx0LmNhbGxiYWNrcz1bXSx0LnRyaWdnZXJFdmVudD1zLHRo aXMucmVvcGVuQ2xhc3Moe3JvdXRlcjp0fSkpO3ZhciByPUVtYmVyLlJvdXRl ckRTTC5tYXAoZnVuY3Rpb24oKXt0aGlzLnJlc291cmNlKCJhcHBsaWNhdGlv biIse3BhdGg6Ii8ifSxmdW5jdGlvbigpe2Zvcih2YXIgcj0wO3I8dC5jYWxs YmFja3MubGVuZ3RoO3IrKyl0LmNhbGxiYWNrc1tyXS5jYWxsKHRoaXMpO2Uu Y2FsbCh0aGlzKX0pfSk7cmV0dXJuIHQuY2FsbGJhY2tzLnB1c2goZSksdC5t YXAoci5nZW5lcmF0ZSgpKSx0fSxfcm91dGVQYXRoOmZ1bmN0aW9uKGUpe2Z1 bmN0aW9uIHQoZSx0KXtmb3IodmFyIHI9MCxuPWUubGVuZ3RoO24+cjsrK3Ip aWYoZVtyXSE9PXRbcl0pcmV0dXJuITE7cmV0dXJuITB9Zm9yKHZhciByPVtd LG49MSxpPWUubGVuZ3RoO2k+bjtuKyspe2Zvcih2YXIgbz1lW25dLm5hbWUs YT1vLnNwbGl0KCIuIikscz1mLmNhbGwocik7cy5sZW5ndGgmJiF0KHMsYSk7 KXMuc2hpZnQoKTtyLnB1c2guYXBwbHkocixhLnNsaWNlKHMubGVuZ3RoKSl9 cmV0dXJuIHIuam9pbigiLiIpfSxfdHJhbnNsYXRlUXVlcnlQYXJhbXM6ZnVu Y3Rpb24oZSx0KXtmb3IodmFyIHIgaW4gZSllLmhhc093blByb3BlcnR5KHIp JiZyIGluIHQmJihlW3Rbcl1dPWVbcl0sZGVsZXRlIGVbcl0pfSxfZGVzY29w ZVF1ZXJ5UGFyYW06ZnVuY3Rpb24oZSl7dmFyIHQ9L1xbKC4rKVxdLyxyPWUu bWF0Y2godCk7cmV0dXJuIHI9cj9yWzFdOmV9fSl9KCksZnVuY3Rpb24oKXtm dW5jdGlvbiBlKGUpe3ZhciB0PWUucm91dGVyLnJvdXRlci5zdGF0ZS5oYW5k bGVySW5mb3M7aWYodClmb3IodmFyIHIsbixpPTAsbz10Lmxlbmd0aDtvPmk7 aSsrKXtpZihuPXRbaV0uaGFuZGxlcixuPT09ZSlyZXR1cm4gcjtyPW59fWZ1 bmN0aW9uIHQocil7dmFyIG4saT1lKHIpO2lmKGkpcmV0dXJuKG49aS5sYXN0 UmVuZGVyZWRUZW1wbGF0ZSk/bjp0KGkpfWZ1bmN0aW9uIHIoZSxyLG4saSl7 aT1pfHx7fSxpLmludG89aS5pbnRvP2kuaW50by5yZXBsYWNlKC9cLy9nLCIu Iik6dChlKSxpLm91dGxldD1pLm91dGxldHx8Im1haW4iLGkubmFtZT1yLGku dGVtcGxhdGU9bixpLkxPR19WSUVXX0xPT0tVUFM9cyhlLnJvdXRlciwibmFt ZXNwYWNlLkxPR19WSUVXX0xPT0tVUFMiKTt2YXIgbyxhPWkuY29udHJvbGxl cjtpZihhPWkuY29udHJvbGxlcj9pLmNvbnRyb2xsZXI6KG89ZS5jb250YWlu ZXIubG9va3VwKCJjb250cm9sbGVyOiIrcikpP286ZS5jb250cm9sbGVyTmFt ZXx8ZS5yb3V0ZU5hbWUsInN0cmluZyI9PXR5cGVvZiBhKXt2YXIgdT1hO2lm KGE9ZS5jb250YWluZXIubG9va3VwKCJjb250cm9sbGVyOiIrdSksIWEpdGhy b3cgbmV3IEVtYmVyLkVycm9yKCJZb3UgcGFzc2VkIGBjb250cm9sbGVyOiAn Iit1KyInYCBpbnRvIHRoZSBgcmVuZGVyYCBtZXRob2QsIGJ1dCBubyBzdWNo IGNvbnRyb2xsZXIgY291bGQgYmUgZm91bmQuIil9cmV0dXJuIGkuY29udHJv bGxlcj1hLGl9ZnVuY3Rpb24gbihlLHQscil7aWYoZSlyLkxPR19WSUVXX0xP T0tVUFM7ZWxzZXt2YXIgbj1yLmludG8/InZpZXc6ZGVmYXVsdCI6InZpZXc6 dG9wbGV2ZWwiO2U9dC5sb29rdXAobiksci5MT0dfVklFV19MT09LVVBTfXJl dHVybiBzKGUsInRlbXBsYXRlTmFtZSIpfHwodShlLCJ0ZW1wbGF0ZSIsci50 ZW1wbGF0ZSksdShlLCJfZGVidWdUZW1wbGF0ZU5hbWUiLHIubmFtZSkpLHUo ZSwicmVuZGVyZWROYW1lIixyLm5hbWUpLHUoZSwiY29udHJvbGxlciIsci5j b250cm9sbGVyKSxlfWZ1bmN0aW9uIGkoZSx0LHIpe2lmKHIuaW50byl7dmFy IG49ZS5yb3V0ZXIuX2xvb2t1cEFjdGl2ZVZpZXcoci5pbnRvKSxpPWEobixy Lm91dGxldCk7ZS50ZWFyZG93bk91dGxldFZpZXdzfHwoZS50ZWFyZG93bk91 dGxldFZpZXdzPVtdKSxoKGUudGVhcmRvd25PdXRsZXRWaWV3cywwLDAsW2ld KSxuLmNvbm5lY3RPdXRsZXQoci5vdXRsZXQsdCl9ZWxzZXt2YXIgdT1zKGUs InJvdXRlci5uYW1lc3BhY2Uucm9vdEVsZW1lbnQiKTtlLnRlYXJkb3duVG9w TGV2ZWxWaWV3JiZlLnRlYXJkb3duVG9wTGV2ZWxWaWV3KCksZS5yb3V0ZXIu X2Nvbm5lY3RBY3RpdmVWaWV3KHIubmFtZSx0KSxlLnRlYXJkb3duVG9wTGV2 ZWxWaWV3PW8odCksdC5hcHBlbmRUbyh1KX19ZnVuY3Rpb24gbyhlKXtyZXR1 cm4gZnVuY3Rpb24oKXtlLmRlc3Ryb3koKX19ZnVuY3Rpb24gYShlLHQpe3Jl dHVybiBmdW5jdGlvbigpe2UuZGlzY29ubmVjdE91dGxldCh0KX19dmFyIHM9 RW1iZXIuZ2V0LHU9RW1iZXIuc2V0LGw9RW1iZXIuZ2V0UHJvcGVydGllcyxj PShFbWJlci5TdHJpbmcuY2xhc3NpZnksRW1iZXIuU3RyaW5nLmZtdCxFbWJl ci5FbnVtZXJhYmxlVXRpbHMuZm9yRWFjaCksaD1FbWJlci5FbnVtZXJhYmxl VXRpbHMucmVwbGFjZTtFbWJlci5Sb3V0ZT1FbWJlci5PYmplY3QuZXh0ZW5k KEVtYmVyLkFjdGlvbkhhbmRsZXIse2V4aXQ6ZnVuY3Rpb24oKXtFbWJlci5G RUFUVVJFUy5pc0VuYWJsZWQoInF1ZXJ5LXBhcmFtcy1uZXciKSYmdGhpcy5j b250cm9sbGVyLl9kZWFjdGl2YXRlUXVlcnlQYXJhbU9ic2VydmVycygpLHRo aXMuZGVhY3RpdmF0ZSgpLHRoaXMudGVhcmRvd25WaWV3cygpfSxlbnRlcjpm dW5jdGlvbigpe3RoaXMuYWN0aXZhdGUoKX0sdmlld05hbWU6bnVsbCx0ZW1w bGF0ZU5hbWU6bnVsbCxjb250cm9sbGVyTmFtZTpudWxsLF9hY3Rpb25zOntm aW5hbGl6ZVF1ZXJ5UGFyYW1DaGFuZ2U6ZnVuY3Rpb24oZSx0KXtpZihFbWJl ci5GRUFUVVJFUy5pc0VuYWJsZWQoInF1ZXJ5LXBhcmFtcy1uZXciKSl7dmFy IHI9dGhpcy5jb250cm9sbGVyLG49ci5fcXVlcnlQYXJhbUNoYW5nZXNEdXJp bmdTdXNwZW5zaW9uLGk9cyhyLCJfcXVlcnlQYXJhbUhhc2giKTtmb3IodmFy IG8gaW4gaSlpZihpLmhhc093blByb3BlcnR5KG8pKXt2YXIgYT0hMSxsPUVt YmVyLlJvdXRlci5fZGVzY29wZVF1ZXJ5UGFyYW0obyk7aWYoaVtvXWluIGU/ YT1pW29dOnZvaWQgMCE9PWVbbF0mJihhPWwpLGEpe2lmKHIuX2ZpbmFsaXpp bmdRdWVyeVBhcmFtcz0hMCwhKG4mJm8gaW4gbikpe3ZhciBjPWVbYV07Yz1F bWJlci5pc0FycmF5KGMpP0VtYmVyLkEoYyk6Yyx1KHIsbyxjKX1yLl9maW5h bGl6aW5nUXVlcnlQYXJhbXM9ITEsZGVsZXRlIGVbYV19Zm9yKHZhciBoPXts b25nZm9ybTppW29dLHNob3J0Zm9ybTpsLHZhbHVlOkVtYmVyLmNvcHkocyhy LG8pKX0sbT0hMSxwPTAsZj10Lmxlbmd0aDtmPnA7cCsrKXRbcF0ua2V5PT09 bCYmKG09ITAsdFtwXS5rZXk9dFtwXS5sb25nZm9ybSk7aC5rZXk9bT9pW29d OmwsdC51bnNoaWZ0KGgpfXJldHVybiByLl9xdWVyeVBhcmFtQ2hhbmdlc0R1 cmluZ1N1c3BlbnNpb249bnVsbCwhMH19fSxldmVudHM6bnVsbCxtZXJnZWRQ cm9wZXJ0aWVzOlsiZXZlbnRzIl0sZGVhY3RpdmF0ZTpFbWJlci5LLGFjdGl2 YXRlOkVtYmVyLkssdHJhbnNpdGlvblRvOmZ1bmN0aW9uKCl7dmFyIGU9dGhp cy5yb3V0ZXI7cmV0dXJuIGUudHJhbnNpdGlvblRvLmFwcGx5KGUsYXJndW1l bnRzKX0saW50ZXJtZWRpYXRlVHJhbnNpdGlvblRvOmZ1bmN0aW9uKCl7dmFy IGU9dGhpcy5yb3V0ZXI7ZS5pbnRlcm1lZGlhdGVUcmFuc2l0aW9uVG8uYXBw bHkoZSxhcmd1bWVudHMpfSxyZWZyZXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRo aXMucm91dGVyLnJvdXRlci5yZWZyZXNoKHRoaXMpLm1ldGhvZCgicmVwbGFj ZSIpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciBlPXRoaXMucm91dGVy O3JldHVybiBlLnJlcGxhY2VXaXRoLmFwcGx5KGUsYXJndW1lbnRzKX0sc2Vu ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJvdXRlci5zZW5kLmFwcGx5KHRo aXMucm91dGVyLGFyZ3VtZW50cyl9LHNldHVwOmZ1bmN0aW9uKGUsdCl7dmFy IHI9dGhpcy5jb250cm9sbGVyTmFtZXx8dGhpcy5yb3V0ZU5hbWUsbj10aGlz LmNvbnRyb2xsZXJGb3IociwhMCk7bnx8KG49dGhpcy5nZW5lcmF0ZUNvbnRy b2xsZXIocixlKSksdGhpcy5jb250cm9sbGVyPW4sRW1iZXIuRkVBVFVSRVMu aXNFbmFibGVkKCJxdWVyeS1wYXJhbXMtbmV3IikmJigiYXBwbGljYXRpb24i IT09ciYmKHRoaXMuY29udHJvbGxlci5fcXVlcnlQYXJhbVNjb3BlPXIpLHRo aXMuY29udHJvbGxlci5fYWN0aXZhdGVRdWVyeVBhcmFtT2JzZXJ2ZXJzKCkp LHRoaXMuc2V0dXBDb250cm9sbGVycz90aGlzLnNldHVwQ29udHJvbGxlcnMo bixlKTpFbWJlci5GRUFUVVJFUy5pc0VuYWJsZWQoInF1ZXJ5LXBhcmFtcy1u ZXciKT8obi5fZmluYWxpemluZ1F1ZXJ5UGFyYW1zPSEwLG4uX3F1ZXJ5UGFy YW1DaGFuZ2VzRHVyaW5nU3VzcGVuc2lvbj17fSx0aGlzLnNldHVwQ29udHJv bGxlcihuLGUsdCksbi5fZmluYWxpemluZ1F1ZXJ5UGFyYW1zPSExKTp0aGlz LnNldHVwQ29udHJvbGxlcihuLGUpLHRoaXMucmVuZGVyVGVtcGxhdGVzP3Ro aXMucmVuZGVyVGVtcGxhdGVzKGUpOnRoaXMucmVuZGVyVGVtcGxhdGUobixl KX0sYmVmb3JlTW9kZWw6RW1iZXIuSyxhZnRlck1vZGVsOkVtYmVyLksscmVk aXJlY3Q6RW1iZXIuSyxjb250ZXh0RGlkQ2hhbmdlOmZ1bmN0aW9uKCl7dGhp cy5jdXJyZW50TW9kZWw9dGhpcy5jb250ZXh0fSxtb2RlbDpmdW5jdGlvbihl LHQpe3ZhciByLG4saSxvO2Zvcih2YXIgYSBpbiBlKSJxdWVyeVBhcmFtcyIh PT1hJiYoKHI9YS5tYXRjaCgvXiguKilfaWQkLykpJiYobj1yWzFdLG89ZVth XSksaT0hMCk7aWYoIW4mJmkpcmV0dXJuIEVtYmVyLmNvcHkoZSk7aWYoIW4p e2lmKHQucmVzb2x2ZUluZGV4IT09dC5zdGF0ZS5oYW5kbGVySW5mb3MubGVu Z3RoLTEpcmV0dXJuO3ZhciBzPXQuc3RhdGUuaGFuZGxlckluZm9zW3QucmVz b2x2ZUluZGV4LTFdLmNvbnRleHQ7cmV0dXJuIHN9cmV0dXJuIHRoaXMuZmlu ZE1vZGVsKG4sbyl9LGRlc2VyaWFsaXplOmZ1bmN0aW9uKGUsdCl7cmV0dXJu IEVtYmVyLkZFQVRVUkVTLmlzRW5hYmxlZCgicXVlcnktcGFyYW1zLW5ldyIp P3RoaXMubW9kZWwodGhpcy5wYXJhbXNGb3IodGhpcy5yb3V0ZU5hbWUpLHQp OnRoaXMubW9kZWwoZSx0KX0sZmluZE1vZGVsOmZ1bmN0aW9uKCl7dmFyIGU9 cyh0aGlzLCJzdG9yZSIpO3JldHVybiBlLmZpbmQuYXBwbHkoZSxhcmd1bWVu dHMpfSxzdG9yZTpFbWJlci5jb21wdXRlZChmdW5jdGlvbigpe3t2YXIgZT10 aGlzLmNvbnRhaW5lcjt0aGlzLnJvdXRlTmFtZSxzKHRoaXMsInJvdXRlci5u YW1lc3BhY2UiKX1yZXR1cm57ZmluZDpmdW5jdGlvbih0LHIpe3ZhciBuPWUu bG9va3VwRmFjdG9yeSgibW9kZWw6Iit0KTtpZihuKXJldHVybiBuLmZpbmQo cil9fX0pLHNlcmlhbGl6ZTpmdW5jdGlvbihlLHQpe2lmKCEodC5sZW5ndGg8 MSkmJmUpe3ZhciByPXRbMF0sbj17fTtyZXR1cm4vX2lkJC8udGVzdChyKSYm MT09PXQubGVuZ3RoP25bcl09cyhlLCJpZCIpOm49bChlLHQpLG59fSxzZXR1 cENvbnRyb2xsZXI6ZnVuY3Rpb24oZSx0KXtlJiZ2b2lkIDAhPT10JiZ1KGUs Im1vZGVsIix0KX0sY29udHJvbGxlckZvcjpmdW5jdGlvbihlKXt2YXIgdCxy PXRoaXMuY29udGFpbmVyLG49ci5sb29rdXAoInJvdXRlOiIrZSk7cmV0dXJu IG4mJm4uY29udHJvbGxlck5hbWUmJihlPW4uY29udHJvbGxlck5hbWUpLHQ9 ci5sb29rdXAoImNvbnRyb2xsZXI6IitlKX0sZ2VuZXJhdGVDb250cm9sbGVy OmZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcy5jb250YWluZXI7cmV0dXJuIHQ9 dHx8dGhpcy5tb2RlbEZvcihlKSxFbWJlci5nZW5lcmF0ZUNvbnRyb2xsZXIo cixlLHQpfSxtb2RlbEZvcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmNvbnRh aW5lci5sb29rdXAoInJvdXRlOiIrZSkscj10aGlzLnJvdXRlci5yb3V0ZXIu YWN0aXZlVHJhbnNpdGlvbjtpZihyKXt2YXIgbj10JiZ0LnJvdXRlTmFtZXx8 ZTtpZihyLnJlc29sdmVkTW9kZWxzLmhhc093blByb3BlcnR5KG4pKXJldHVy biByLnJlc29sdmVkTW9kZWxzW25dfXJldHVybiB0JiZ0LmN1cnJlbnRNb2Rl bH0scmVuZGVyVGVtcGxhdGU6ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcigpfSxy ZW5kZXI6ZnVuY3Rpb24oZSx0KXsib2JqZWN0IiE9dHlwZW9mIGV8fHR8fCh0 PWUsZT10aGlzLnJvdXRlTmFtZSksdD10fHx7fTt2YXIgbztlPyhlPWUucmVw bGFjZSgvXC8vZywiLiIpLG89ZSk6KGU9dGhpcy5yb3V0ZU5hbWUsbz10aGlz LnRlbXBsYXRlTmFtZXx8ZSk7dmFyIGE9dC52aWV3fHx0aGlzLnZpZXdOYW1l fHxlLHU9dGhpcy5jb250YWluZXIsbD11Lmxvb2t1cCgidmlldzoiK2EpLGM9 bD9sLmdldCgidGVtcGxhdGUiKTpudWxsO3JldHVybiBjfHwoYz11Lmxvb2t1 cCgidGVtcGxhdGU6IitvKSksbHx8Yz8odD1yKHRoaXMsZSxjLHQpLGw9bihs LHUsdCksIm1haW4iPT09dC5vdXRsZXQmJih0aGlzLmxhc3RSZW5kZXJlZFRl bXBsYXRlPWUpLGkodGhpcyxsLHQpLHZvaWQgMCk6KHModGhpcy5yb3V0ZXIs Im5hbWVzcGFjZS5MT0dfVklFV19MT09LVVBTIiksdm9pZCAwKX0sZGlzY29u bmVjdE91dGxldDpmdW5jdGlvbihlKXtpZighZXx8InN0cmluZyI9PXR5cGVv ZiBlKXt2YXIgcj1lO2U9e30sZS5vdXRsZXQ9cn1lLnBhcmVudFZpZXc9ZS5w YXJlbnRWaWV3P2UucGFyZW50Vmlldy5yZXBsYWNlKC9cLy9nLCIuIik6dCh0 aGlzKSxlLm91dGxldD1lLm91dGxldHx8Im1haW4iO3ZhciBuPXRoaXMucm91 dGVyLl9sb29rdXBBY3RpdmVWaWV3KGUucGFyZW50Vmlldyk7biYmbi5kaXNj b25uZWN0T3V0bGV0KGUub3V0bGV0KX0sd2lsbERlc3Ryb3k6ZnVuY3Rpb24o KXt0aGlzLnRlYXJkb3duVmlld3MoKX0sdGVhcmRvd25WaWV3czpmdW5jdGlv bigpe3RoaXMudGVhcmRvd25Ub3BMZXZlbFZpZXcmJnRoaXMudGVhcmRvd25U b3BMZXZlbFZpZXcoKTt2YXIgZT10aGlzLnRlYXJkb3duT3V0bGV0Vmlld3N8 fFtdO2MoZSxmdW5jdGlvbihlKXtlKCl9KSxkZWxldGUgdGhpcy50ZWFyZG93 blRvcExldmVsVmlldyxkZWxldGUgdGhpcy50ZWFyZG93bk91dGxldFZpZXdz LGRlbGV0ZSB0aGlzLmxhc3RSZW5kZXJlZFRlbXBsYXRlfX0pLEVtYmVyLkZF QVRVUkVTLmlzRW5hYmxlZCgicXVlcnktcGFyYW1zLW5ldyIpJiZFbWJlci5S b3V0ZS5yZW9wZW4oe3BhcmFtc0ZvcjpmdW5jdGlvbihlKXt2YXIgdD10aGlz LmNvbnRhaW5lci5sb29rdXAoInJvdXRlOiIrZSk7aWYoIXQpcmV0dXJue307 dmFyIHIsbixpPXRoaXMucm91dGVyLnJvdXRlci5hY3RpdmVUcmFuc2l0aW9u LG89dGhpcy5yb3V0ZXIuX3F1ZXJ5UGFyYW1OYW1lc0ZvclNpbmdsZSh0LnJv dXRlTmFtZSk7aWYoaSlyPWkucGFyYW1zW2VdfHx7fSxuPWkucXVlcnlQYXJh bXM7ZWxzZXt2YXIgYT10aGlzLnJvdXRlci5yb3V0ZXIuc3RhdGU7cj1hLnBh cmFtc1tlXXx8e30sbj1hLnF1ZXJ5UGFyYW1zfXJldHVybiB0aGlzLnJvdXRl ci5fcXVlcnlQYXJhbU92ZXJyaWRlcyhyLG8ucXVlcnlQYXJhbXMsZnVuY3Rp b24oZSx0LGkpe3ZhciBvPXQgaW4gbj9uW3RdOnJbdF07ZGVsZXRlIHJbdF0s cltpLnNwbGl0KCI6IikucG9wKCldPW99KSxyfX0pfSgpLGZ1bmN0aW9uKCl7 RW1iZXIub25Mb2FkKCJFbWJlci5IYW5kbGViYXJzIixmdW5jdGlvbigpe2Z1 bmN0aW9uIGUoZSxyLGkpe3JldHVybiBuLmNhbGwodChlLHIsaSksZnVuY3Rp b24odCxuKXtyZXR1cm4gbnVsbD09PXQ/cltuXTpvKGUsdCxpKX0pfWZ1bmN0 aW9uIHQoZSx0LG8pe2Z1bmN0aW9uIGEoZSx0KXtyZXR1cm4iY29udHJvbGxl ciI9PT10P3Q6RW1iZXIuQ29udHJvbGxlck1peGluLmRldGVjdChlKT9hKGko ZSwibW9kZWwiKSx0P3QrIi5tb2RlbCI6Im1vZGVsIik6dH12YXIgcz1yKGUs dCxvKSx1PW8udHlwZXM7cmV0dXJuIG4uY2FsbChzLGZ1bmN0aW9uKGUscil7 cmV0dXJuIklEIj09PXVbcl0/YShlLHRbcl0pOm51bGx9KX12YXIgcj1FbWJl ci5IYW5kbGViYXJzLnJlc29sdmVQYXJhbXMsbj1FbWJlci5BcnJheVBvbHlm aWxscy5tYXAsaT1FbWJlci5nZXQsbz1FbWJlci5IYW5kbGViYXJzLmdldDtF bWJlci5Sb3V0ZXIucmVzb2x2ZVBhcmFtcz1lLEVtYmVyLlJvdXRlci5yZXNv bHZlUGF0aHM9dH0pfSgpLGZ1bmN0aW9uKCl7dmFyIGU9RW1iZXIuZ2V0LHQ9 KEVtYmVyLnNldCxFbWJlci5TdHJpbmcuZm10LEFycmF5LnByb3RvdHlwZS5z bGljZSk7RW1iZXIub25Mb2FkKCJFbWJlci5IYW5kbGViYXJzIixmdW5jdGlv bigpe2Z1bmN0aW9uIHIoZSl7dmFyIHQ9ZS5vcHRpb25zLnR5cGVzLHI9ZS5v cHRpb25zLmRhdGE7cmV0dXJuIGEoZS5jb250ZXh0LGUucGFyYW1zLHt0eXBl czp0LGRhdGE6cn0pfXZhciBuPUVtYmVyLk9iamVjdC5leHRlbmQoe3ZhbHVl czpudWxsfSksaT1FbWJlci5Sb3V0ZXIucmVzb2x2ZVBhcmFtcyxvPUVtYmVy LlJvdXRlci5fdHJhbnNsYXRlUXVlcnlQYXJhbXMsYT1FbWJlci5Sb3V0ZXIu cmVzb2x2ZVBhdGhzLHM9RW1iZXIuVmlld1V0aWxzLmlzU2ltcGxlQ2xpY2ss dT1FbWJlci5MaW5rVmlldz1FbWJlci5WaWV3LmV4dGVuZCh7dGFnTmFtZToi YSIsY3VycmVudFdoZW46bnVsbCx0aXRsZTpudWxsLHJlbDpudWxsLGFjdGl2 ZUNsYXNzOiJhY3RpdmUiLGxvYWRpbmdDbGFzczoibG9hZGluZyIsZGlzYWJs ZWRDbGFzczoiZGlzYWJsZWQiLF9pc0Rpc2FibGVkOiExLHJlcGxhY2U6ITEs YXR0cmlidXRlQmluZGluZ3M6WyJocmVmIiwidGl0bGUiLCJyZWwiXSxjbGFz c05hbWVCaW5kaW5nczpbImFjdGl2ZSIsImxvYWRpbmciLCJkaXNhYmxlZCJd LGV2ZW50TmFtZToiY2xpY2siLGluaXQ6ZnVuY3Rpb24oKXt0aGlzLl9zdXBl ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIHQ9ZSh0aGlzLCJldmVudE5h bWUiKTt0aGlzLm9uKHQsdGhpcyx0aGlzLl9pbnZva2UpfSxfcGFyYW1zQ2hh bmdlZDpmdW5jdGlvbigpe3RoaXMubm90aWZ5UHJvcGVydHlDaGFuZ2UoInJl c29sdmVkUGFyYW1zIil9LF9zZXR1cFBhdGhPYnNlcnZlcnM6ZnVuY3Rpb24o KXt2YXIgZSx0LG4saT10aGlzLnBhcmFtZXRlcnMsbz1pLm9wdGlvbnMubGlu a1RleHRQYXRoLGE9cihpKSxzPWEubGVuZ3RoO2ZvcihvJiYobj1FbWJlci5I YW5kbGViYXJzLm5vcm1hbGl6ZVBhdGgoaS5jb250ZXh0LG8saS5vcHRpb25z LmRhdGEpLHRoaXMucmVnaXN0ZXJPYnNlcnZlcihuLnJvb3Qsbi5wYXRoLHRo aXMsdGhpcy5yZXJlbmRlcikpLHQ9MDtzPnQ7dCsrKWU9YVt0XSxudWxsIT09 ZSYmKG49RW1iZXIuSGFuZGxlYmFycy5ub3JtYWxpemVQYXRoKGkuY29udGV4 dCxlLGkub3B0aW9ucy5kYXRhKSx0aGlzLnJlZ2lzdGVyT2JzZXJ2ZXIobi5y b290LG4ucGF0aCx0aGlzLHRoaXMuX3BhcmFtc0NoYW5nZWQpKTt2YXIgdT10 aGlzLnF1ZXJ5UGFyYW1zT2JqZWN0O2lmKHUpe3ZhciBsPXUudmFsdWVzO2Zv cih2YXIgYyBpbiBsKWwuaGFzT3duUHJvcGVydHkoYykmJiJJRCI9PT11LnR5 cGVzW2NdJiYobj1FbWJlci5IYW5kbGViYXJzLm5vcm1hbGl6ZVBhdGgoaS5j b250ZXh0LGxbY10saS5vcHRpb25zLmRhdGEpLHRoaXMucmVnaXN0ZXJPYnNl cnZlcihuLnJvb3Qsbi5wYXRoLHRoaXMsdGhpcy5fcGFyYW1zQ2hhbmdlZCkp fX0sYWZ0ZXJSZW5kZXI6ZnVuY3Rpb24oKXt0aGlzLl9zdXBlci5hcHBseSh0 aGlzLGFyZ3VtZW50cyksdGhpcy5fc2V0dXBQYXRoT2JzZXJ2ZXJzKCl9LGNv bmNyZXRlVmlldzpFbWJlci5jb21wdXRlZChmdW5jdGlvbigpe3JldHVybiBl KHRoaXMsInBhcmVudFZpZXciKX0pLnByb3BlcnR5KCJwYXJlbnRWaWV3Iiks ZGlzYWJsZWQ6RW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24odCxyKXtyZXR1cm4g dm9pZCAwIT09ciYmdGhpcy5zZXQoIl9pc0Rpc2FibGVkIixyKSxyP2UodGhp cywiZGlzYWJsZWRDbGFzcyIpOiExfSksYWN0aXZlOkVtYmVyLmNvbXB1dGVk KGZ1bmN0aW9uKCl7aWYoZSh0aGlzLCJsb2FkaW5nIikpcmV0dXJuITE7dmFy IHQ9ZSh0aGlzLCJyb3V0ZXIiKSxyPWUodGhpcywicm91dGVBcmdzIiksbj1y LnNsaWNlKDEpLGk9KGUodGhpcywicmVzb2x2ZWRQYXJhbXMiKSx0aGlzLmN1 cnJlbnRXaGVufHxyWzBdKTt0aGlzLmN1cnJlbnRXaGVuJiYobj1bXSxFbWJl ci5GRUFUVVJFUy5pc0VuYWJsZWQoInF1ZXJ5LXBhcmFtcy1uZXciKSYmbi5w dXNoKHtxdWVyeVBhcmFtczplKHRoaXMsInF1ZXJ5UGFyYW1zIil9KSk7dmFy IG89dC5pc0FjdGl2ZS5hcHBseSh0LFtpXS5jb25jYXQobikpO3JldHVybiBv P2UodGhpcywiYWN0aXZlQ2xhc3MiKTp2b2lkIDB9KS5wcm9wZXJ0eSgicmVz b2x2ZWRQYXJhbXMiLCJyb3V0ZUFyZ3MiKSxsb2FkaW5nOkVtYmVyLmNvbXB1 dGVkKGZ1bmN0aW9uKCl7cmV0dXJuIGUodGhpcywicm91dGVBcmdzIik/dm9p ZCAwOmUodGhpcywibG9hZGluZ0NsYXNzIil9KS5wcm9wZXJ0eSgicm91dGVB cmdzIikscm91dGVyOkVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCl7cmV0dXJu IGUodGhpcywiY29udHJvbGxlciIpLmNvbnRhaW5lci5sb29rdXAoInJvdXRl cjptYWluIil9KSxfaW52b2tlOmZ1bmN0aW9uKHQpe2lmKCFzKHQpKXJldHVy biEwO2lmKHRoaXMucHJldmVudERlZmF1bHQhPT0hMSYmdC5wcmV2ZW50RGVm YXVsdCgpLHRoaXMuYnViYmxlcz09PSExJiZ0LnN0b3BQcm9wYWdhdGlvbigp LGUodGhpcywiX2lzRGlzYWJsZWQiKSlyZXR1cm4hMTtpZihlKHRoaXMsImxv YWRpbmciKSlyZXR1cm4gRW1iZXIuTG9nZ2VyLndhcm4oIlRoaXMgbGluay10 byBpcyBpbiBhbiBpbmFjdGl2ZSBsb2FkaW5nIHN0YXRlIGJlY2F1c2UgYXQg bGVhc3Qgb25lIG9mIGl0cyBwYXJhbWV0ZXJzIHByZXNlbnRseSBoYXMgYSBu dWxsL3VuZGVmaW5lZCB2YWx1ZSwgb3IgdGhlIHByb3ZpZGVkIHJvdXRlIG5h bWUgaXMgaW52YWxpZC4iKSwhMTt2YXIgcixuPWUodGhpcywicm91dGVyIiks aT1lKHRoaXMsInJvdXRlQXJncyIpO3I9ZSh0aGlzLCJyZXBsYWNlIik/bi5y ZXBsYWNlV2l0aC5hcHBseShuLGkpOm4udHJhbnNpdGlvblRvLmFwcGx5KG4s aSk7dmFyIG89bi5yb3V0ZXIuZ2VuZXJhdGUuYXBwbHkobi5yb3V0ZXIsZSh0 aGlzLCJyb3V0ZUFyZ3MiKSk7RW1iZXIucnVuLnNjaGVkdWxlT25jZSgicm91 dGVyVHJhbnNpdGlvbnMiLHRoaXMsdGhpcy5fZWFnZXJVcGRhdGVVcmwscixv KX0sX2VhZ2VyVXBkYXRlVXJsOmZ1bmN0aW9uKHQscil7aWYodC5pc0FjdGl2 ZSYmdC51cmxNZXRob2QpezA9PT1yLmluZGV4T2YoIiMiKSYmKHI9ci5zbGlj ZSgxKSk7dmFyIG49ZSh0aGlzLCJyb3V0ZXIucm91dGVyIik7InVwZGF0ZSI9 PT10LnVybE1ldGhvZD9uLnVwZGF0ZVVSTChyKToicmVwbGFjZSI9PT10LnVy bE1ldGhvZCYmbi5yZXBsYWNlVVJMKHIpLHQubWV0aG9kKG51bGwpfX0scmVz b2x2ZWRQYXJhbXM6RW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKXt2YXIgdD10 aGlzLnBhcmFtZXRlcnMscj10Lm9wdGlvbnMsbj1yLnR5cGVzLG89ci5kYXRh O2lmKDA9PT10LnBhcmFtcy5sZW5ndGgpe3ZhciBhPXRoaXMuY29udGFpbmVy Lmxvb2t1cCgiY29udHJvbGxlcjphcHBsaWNhdGlvbiIpO3JldHVybltlKGEs ImN1cnJlbnRSb3V0ZU5hbWUiKV19cmV0dXJuIGkodC5jb250ZXh0LHQucGFy YW1zLHt0eXBlczpuLGRhdGE6b30pfSkucHJvcGVydHkoInJvdXRlci51cmwi KSxyb3V0ZUFyZ3M6RW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKXt2YXIgdD1l KHRoaXMsInJlc29sdmVkUGFyYW1zIikuc2xpY2UoMCkscj1lKHRoaXMsInJv dXRlciIpLG49dFswXTtpZihuKXt2YXIgaT1yLnJvdXRlci5yZWNvZ25pemVy LmhhbmRsZXJzRm9yKG4pLG89aVtpLmxlbmd0aC0xXS5oYW5kbGVyO24hPT1v JiYodGhpcy5zZXQoImN1cnJlbnRXaGVuIixuKSxuPWlbaS5sZW5ndGgtMV0u aGFuZGxlcix0WzBdPW4pO2Zvcih2YXIgYT0xLHM9dC5sZW5ndGg7cz5hOysr YSl7dmFyIHU9dFthXTtpZihudWxsPT09dXx8InVuZGVmaW5lZCI9PXR5cGVv ZiB1KXJldHVybn1yZXR1cm4gRW1iZXIuRkVBVFVSRVMuaXNFbmFibGVkKCJx dWVyeS1wYXJhbXMtbmV3IikmJnQucHVzaCh7cXVlcnlQYXJhbXM6ZSh0aGlz LCJxdWVyeVBhcmFtcyIpfSksdH19KS5wcm9wZXJ0eSgicmVzb2x2ZWRQYXJh bXMiLCJxdWVyeVBhcmFtcyIpLHF1ZXJ5UGFyYW1zT2JqZWN0Om51bGwscXVl cnlQYXJhbXM6RW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKXt2YXIgdD1lKHRo aXMsInF1ZXJ5UGFyYW1zT2JqZWN0Iikscj17fTt0JiZFbWJlci5tZXJnZShy LHQudmFsdWVzKTt2YXIgbj1lKHRoaXMsInJlc29sdmVkUGFyYW1zIiksaT1l KHRoaXMsInJvdXRlciIpLGE9blswXSxzPWkuX3F1ZXJ5UGFyYW1OYW1lc0Zv cihhKSx1PXMucXVlcnlQYXJhbXMsbD1zLnRyYW5zbGF0aW9ucyxjPXt9O28o cixsLGEpO3ZhciBoPXRoaXMucGFyYW1ldGVycztyZXR1cm4gaS5fcXVlcnlQ YXJhbU92ZXJyaWRlcyhjLHUsZnVuY3Rpb24oZSxuKXtpZihlIGluIHIpe3Zh ciBpLG89ZS5zcGxpdCgiOiIpLGE9dC50eXBlc1tvWzFdXTtpZigiSUQiPT09 YSl7dmFyIHM9RW1iZXIuSGFuZGxlYmFycy5ub3JtYWxpemVQYXRoKGguY29u dGV4dCxyW2VdLGgub3B0aW9ucy5kYXRhKTtpPUVtYmVyLkhhbmRsZWJhcnMu Z2V0KHMucm9vdCxzLnBhdGgsaC5vcHRpb25zKX1lbHNlIGk9cltlXTtkZWxl dGUgcltlXSxjW25dPWl9fSksY30pLnByb3BlcnR5KCJyZXNvbHZlZFBhcmFt cy5bXSIpLGhyZWY6RW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKXtpZigiYSI9 PT1lKHRoaXMsInRhZ05hbWUiKSl7dmFyIHQ9ZSh0aGlzLCJyb3V0ZXIiKSxy PWUodGhpcywicm91dGVBcmdzIik7cmV0dXJuIHI/dC5nZW5lcmF0ZS5hcHBs eSh0LHIpOmUodGhpcywibG9hZGluZ0hyZWYiKX19KS5wcm9wZXJ0eSgicm91 dGVBcmdzIiksbG9hZGluZ0hyZWY6IiMifSk7dS50b1N0cmluZz1mdW5jdGlv bigpe3JldHVybiJMaW5rVmlldyJ9LEVtYmVyLkhhbmRsZWJhcnMucmVnaXN0 ZXJIZWxwZXIoImxpbmstdG8iLGZ1bmN0aW9uKCl7dmFyIGU9dC5jYWxsKGFy Z3VtZW50cywtMSlbMF0scj10LmNhbGwoYXJndW1lbnRzLDAsLTEpLGk9ZS5o YXNoO2lmKHJbci5sZW5ndGgtMV1pbnN0YW5jZW9mIG4mJihpLnF1ZXJ5UGFy YW1zT2JqZWN0PXIucG9wKCkpLGkuZGlzYWJsZWRCaW5kaW5nPWkuZGlzYWJs ZWRXaGVuLCFlLmZuKXt2YXIgbz1yLnNoaWZ0KCksYT1lLnR5cGVzLnNoaWZ0 KCkscz10aGlzOyJJRCI9PT1hPyhlLmxpbmtUZXh0UGF0aD1vLGUuZm49ZnVu Y3Rpb24oKXtyZXR1cm4gRW1iZXIuSGFuZGxlYmFycy5nZXRFc2NhcGVkKHMs byxlKX0pOmUuZm49ZnVuY3Rpb24oKXtyZXR1cm4gb319cmV0dXJuIGkucGFy YW1ldGVycz17Y29udGV4dDp0aGlzLG9wdGlvbnM6ZSxwYXJhbXM6cn0sRW1i ZXIuSGFuZGxlYmFycy5oZWxwZXJzLnZpZXcuY2FsbCh0aGlzLHUsZSl9KSxF bWJlci5GRUFUVVJFUy5pc0VuYWJsZWQoInF1ZXJ5LXBhcmFtcy1uZXciKSYm RW1iZXIuSGFuZGxlYmFycy5yZWdpc3RlckhlbHBlcigicXVlcnktcGFyYW1z IixmdW5jdGlvbihlKXtyZXR1cm4gbi5jcmVhdGUoe3ZhbHVlczplLmhhc2gs dHlwZXM6ZS5oYXNoVHlwZXN9KX0pLEVtYmVyLkhhbmRsZWJhcnMucmVnaXN0 ZXJIZWxwZXIoImxpbmtUbyIsZnVuY3Rpb24oKXtyZXR1cm4gRW1iZXIuSGFu ZGxlYmFycy5oZWxwZXJzWyJsaW5rLXRvIl0uYXBwbHkodGhpcyxhcmd1bWVu dHMpfSl9KX0oKSxmdW5jdGlvbigpe0VtYmVyLmdldCxFbWJlci5zZXQ7RW1i ZXIub25Mb2FkKCJFbWJlci5IYW5kbGViYXJzIixmdW5jdGlvbihlKXtlLk91 dGxldFZpZXc9RW1iZXIuQ29udGFpbmVyVmlldy5leHRlbmQoRW1iZXIuX01l dGFtb3JwaCksZS5yZWdpc3RlckhlbHBlcigib3V0bGV0IixmdW5jdGlvbih0 LHIpe3ZhciBuLGksbyxhLHM7Zm9yKHQmJnQuZGF0YSYmdC5kYXRhLmlzUmVu ZGVyRGF0YSYmKHI9dCx0PSJtYWluIiksaT1yLmRhdGEudmlldy5jb250YWlu ZXIsbj1yLmRhdGEudmlldzshbi5nZXQoInRlbXBsYXRlLmlzVG9wIik7KW49 bi5nZXQoIl9wYXJlbnRWaWV3Iik7cmV0dXJuIG89ci5oYXNoLnZpZXcsbyYm KHM9InZpZXc6IitvKSxhPW8/aS5sb29rdXBGYWN0b3J5KHMpOnIuaGFzaC52 aWV3Q2xhc3N8fGUuT3V0bGV0VmlldyxyLmRhdGEudmlldy5zZXQoIm91dGxl dFNvdXJjZSIsbiksci5oYXNoLmN1cnJlbnRWaWV3QmluZGluZz0iX3ZpZXcu b3V0bGV0U291cmNlLl9vdXRsZXRzLiIrdCxlLmhlbHBlcnMudmlldy5jYWxs KHRoaXMsYSxyKX0pfSl9KCksZnVuY3Rpb24oKXtFbWJlci5nZXQsRW1iZXIu c2V0O0VtYmVyLm9uTG9hZCgiRW1iZXIuSGFuZGxlYmFycyIsZnVuY3Rpb24o KXtFbWJlci5IYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCJyZW5kZXIiLGZ1 bmN0aW9uKGUsdCxyKXt2YXIgbixpLG8sYSxzLHU9YXJndW1lbnRzLmxlbmd0 aDtpZihuPShyfHx0KS5kYXRhLmtleXdvcmRzLmNvbnRyb2xsZXIuY29udGFp bmVyLGk9bi5sb29rdXAoInJvdXRlcjptYWluIiksMj09PXUpcj10LHQ9dm9p ZCAwO2Vsc2V7aWYoMyE9PXUpdGhyb3cgRW1iZXIuRXJyb3IoIllvdSBtdXN0 IHBhc3MgYSB0ZW1wbGF0ZU5hbWUgdG8gcmVuZGVyIik7cz1FbWJlci5IYW5k bGViYXJzLmdldChyLmNvbnRleHRzWzFdLHQscil9ZT1lLnJlcGxhY2UoL1wv L2csIi4iKSxhPW4ubG9va3VwKCJ2aWV3OiIrZSl8fG4ubG9va3VwKCJ2aWV3 OmRlZmF1bHQiKTt2YXIgbD1yLmhhc2guY29udHJvbGxlcnx8ZSxjPSJjb250 cm9sbGVyOiIrbDtyLmhhc2guY29udHJvbGxlcjt2YXIgaD1yLmRhdGEua2V5 d29yZHMuY29udHJvbGxlcjtpZih1PjIpe3ZhciBtPW4ubG9va3VwRmFjdG9y eShjKXx8RW1iZXIuZ2VuZXJhdGVDb250cm9sbGVyRmFjdG9yeShuLGwscyk7 bz1tLmNyZWF0ZSh7bW9kZWw6cyxwYXJlbnRDb250cm9sbGVyOmgsdGFyZ2V0 Omh9KX1lbHNlIG89bi5sb29rdXAoYyl8fEVtYmVyLmdlbmVyYXRlQ29udHJv bGxlcihuLGwpLG8uc2V0UHJvcGVydGllcyh7dGFyZ2V0OmgscGFyZW50Q29u dHJvbGxlcjpofSk7dmFyIHA9ci5jb250ZXh0c1sxXTtwJiZhLnJlZ2lzdGVy T2JzZXJ2ZXIocCx0LGZ1bmN0aW9uKCl7by5zZXQoIm1vZGVsIixFbWJlci5I YW5kbGViYXJzLmdldChwLHQscikpfSksci5oYXNoLnZpZXdOYW1lPUVtYmVy LlN0cmluZy5jYW1lbGl6ZShlKTt2YXIgZj0idGVtcGxhdGU6IitlO3IuaGFz aC50ZW1wbGF0ZT1uLmxvb2t1cChmKSxyLmhhc2guY29udHJvbGxlcj1vLGkm JiFzJiZpLl9jb25uZWN0QWN0aXZlVmlldyhlLGEpLEVtYmVyLkhhbmRsZWJh cnMuaGVscGVycy52aWV3LmNhbGwodGhpcyxhLHIpfSl9KX0oKSxmdW5jdGlv bigpe0VtYmVyLm9uTG9hZCgiRW1iZXIuSGFuZGxlYmFycyIsZnVuY3Rpb24o KXtmdW5jdGlvbiBlKGUscil7dmFyIG49W107ciYmbi5wdXNoKHIpO3ZhciBp PWUub3B0aW9ucy50eXBlcy5zbGljZSgxKSxvPWUub3B0aW9ucy5kYXRhO3Jl dHVybiBuLmNvbmNhdCh0KGUuY29udGV4dCxlLnBhcmFtcyx7dHlwZXM6aSxk YXRhOm99KSl9dmFyIHQ9RW1iZXIuUm91dGVyLnJlc29sdmVQYXJhbXMscj1F bWJlci5WaWV3VXRpbHMuaXNTaW1wbGVDbGljayxuPUVtYmVyLkhhbmRsZWJh cnMsaT1uLmdldCxvPW4uU2FmZVN0cmluZyxhPUVtYmVyLkFycmF5UG9seWZp bGxzLmZvckVhY2gscz0oRW1iZXIuZ2V0LEFycmF5LnByb3RvdHlwZS5zbGlj ZSksdT1uLkFjdGlvbkhlbHBlcj17cmVnaXN0ZXJlZEFjdGlvbnM6e319LGw9 WyJhbHQiLCJzaGlmdCIsIm1ldGEiLCJjdHJsIl0sYz0vXmNsaWNrfG1vdXNl fHRvdWNoLyxoPWZ1bmN0aW9uKGUsdCl7aWYoInVuZGVmaW5lZCI9PXR5cGVv ZiB0KXtpZihjLnRlc3QoZS50eXBlKSlyZXR1cm4gcihlKTt0PSIifWlmKHQu aW5kZXhPZigiYW55Iik+PTApcmV0dXJuITA7dmFyIG49ITA7cmV0dXJuIGEu Y2FsbChsLGZ1bmN0aW9uKHIpe2VbcisiS2V5Il0mJi0xPT09dC5pbmRleE9m KHIpJiYobj0hMSl9KSxufTt1LnJlZ2lzdGVyQWN0aW9uPWZ1bmN0aW9uKHQs cixuKXt2YXIgbz0rK0VtYmVyLnV1aWQ7cmV0dXJuIHUucmVnaXN0ZXJlZEFj dGlvbnNbb109e2V2ZW50TmFtZTpyLmV2ZW50TmFtZSxoYW5kbGVyOmZ1bmN0 aW9uKG8pe2lmKCFoKG8sbikpcmV0dXJuITA7ci5wcmV2ZW50RGVmYXVsdCE9 PSExJiZvLnByZXZlbnREZWZhdWx0KCksci5idWJibGVzPT09ITEmJm8uc3Rv cFByb3BhZ2F0aW9uKCk7dmFyIGEscz1yLnRhcmdldDtzPXMudGFyZ2V0P2ko cy5yb290LHMudGFyZ2V0LHMub3B0aW9ucyk6cy5yb290LHIuYm91bmRQcm9w ZXJ0eSYmKGE9aShzLHQsci5vcHRpb25zKSwoInVuZGVmaW5lZCI9PXR5cGVv ZiBhfHwiZnVuY3Rpb24iPT10eXBlb2YgYSkmJihhPXQpKSxhfHwoYT10KSxF bWJlci5ydW4oZnVuY3Rpb24oKXtzLnNlbmQ/cy5zZW5kLmFwcGx5KHMsZShy LnBhcmFtZXRlcnMsYSkpOnNbYV0uYXBwbHkocyxlKHIucGFyYW1ldGVycykp fSl9fSxyLnZpZXcub24oIndpbGxDbGVhclJlbmRlciIsZnVuY3Rpb24oKXtk ZWxldGUgdS5yZWdpc3RlcmVkQWN0aW9uc1tvXX0pLG99LG4ucmVnaXN0ZXJI ZWxwZXIoImFjdGlvbiIsZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzW2Fy Z3VtZW50cy5sZW5ndGgtMV0scj1zLmNhbGwoYXJndW1lbnRzLDEsLTEpLG49 dC5oYXNoLGk9dC5kYXRhLmtleXdvcmRzLmNvbnRyb2xsZXIsYT17ZXZlbnRO YW1lOm4ub258fCJjbGljayIscGFyYW1ldGVyczp7Y29udGV4dDp0aGlzLG9w dGlvbnM6dCxwYXJhbXM6cn0sdmlldzp0LmRhdGEudmlldyxidWJibGVzOm4u YnViYmxlcyxwcmV2ZW50RGVmYXVsdDpuLnByZXZlbnREZWZhdWx0LHRhcmdl dDp7b3B0aW9uczp0fSxib3VuZFByb3BlcnR5OiJJRCI9PT10LnR5cGVzWzBd fTtuLnRhcmdldD8oYS50YXJnZXQucm9vdD10aGlzLGEudGFyZ2V0LnRhcmdl dD1uLnRhcmdldCk6aSYmKGEudGFyZ2V0LnJvb3Q9aSk7dmFyIGw9dS5yZWdp c3RlckFjdGlvbihlLGEsbi5hbGxvd2VkS2V5cyk7cmV0dXJuIG5ldyBvKCdk YXRhLWVtYmVyLWFjdGlvbj0iJytsKyciJyl9KX0pfSgpLGZ1bmN0aW9uKCl7 dmFyIGU9RW1iZXIuZ2V0LHQ9KEVtYmVyLnNldCxFbWJlci5FbnVtZXJhYmxl VXRpbHMubWFwLHt9KTtFbWJlci5Db250cm9sbGVyTWl4aW4ucmVvcGVuKHt0 cmFuc2l0aW9uVG9Sb3V0ZTpmdW5jdGlvbigpe3ZhciB0PWUodGhpcywidGFy Z2V0Iikscj10LnRyYW5zaXRpb25Ub1JvdXRlfHx0LnRyYW5zaXRpb25Ubzty ZXR1cm4gci5hcHBseSh0LGFyZ3VtZW50cyl9LHRyYW5zaXRpb25UbzpmdW5j dGlvbigpe3JldHVybiB0aGlzLnRyYW5zaXRpb25Ub1JvdXRlLmFwcGx5KHRo aXMsYXJndW1lbnRzKX0scmVwbGFjZVJvdXRlOmZ1bmN0aW9uKCl7dmFyIHQ9 ZSh0aGlzLCJ0YXJnZXQiKSxyPXQucmVwbGFjZVJvdXRlfHx0LnJlcGxhY2VX aXRoO3JldHVybiByLmFwcGx5KHQsYXJndW1lbnRzKX0scmVwbGFjZVdpdGg6 ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXBsYWNlUm91dGUuYXBwbHkodGhp cyxhcmd1bWVudHMpfX0pLEVtYmVyLkZFQVRVUkVTLmlzRW5hYmxlZCgicXVl cnktcGFyYW1zLW5ldyIpJiZFbWJlci5Db250cm9sbGVyTWl4aW4ucmVvcGVu KHtjb25jYXRlbmF0ZWRQcm9wZXJ0aWVzOlsicXVlcnlQYXJhbXMiXSxxdWVy eVBhcmFtczpudWxsLF9xdWVyeVBhcmFtU2NvcGU6bnVsbCxfZmluYWxpemlu Z1F1ZXJ5UGFyYW1zOiExLF9xdWVyeVBhcmFtSGFzaDpFbWJlci5jb21wdXRl ZChmdW5jdGlvbigpe3ZhciBlPXt9LHQ9dGhpcy5xdWVyeVBhcmFtcztpZigh dClyZXR1cm4gZTtmb3IodmFyIHI9MCxuPXQubGVuZ3RoO24+cjsrK3Ipe3Zh ciBpPXRbcl0sbz1pLnNwbGl0KCI6IiksYT1vWzBdLHM9b1sxXTtzfHwocz10 aGlzLl9xdWVyeVBhcmFtU2NvcGU/dGhpcy5fcXVlcnlQYXJhbVNjb3BlKyJb IithKyJdIjphKSxlW2FdPXN9cmV0dXJuIGV9KSxfYWN0aXZhdGVRdWVyeVBh cmFtT2JzZXJ2ZXJzOmZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzLCJfcXVlcnlQ YXJhbUhhc2giKTtmb3IodmFyIHIgaW4gdCl0Lmhhc093blByb3BlcnR5KHIp JiYodGhpcy5hZGRPYnNlcnZlcihyLHRoaXMsdGhpcy5fcXVlcnlQYXJhbUNo YW5nZWQpLHRoaXMuYWRkT2JzZXJ2ZXIocisiLltdIix0aGlzLHRoaXMuX3F1 ZXJ5UGFyYW1DaGFuZ2VkKSl9LF9kZWFjdGl2YXRlUXVlcnlQYXJhbU9ic2Vy dmVyczpmdW5jdGlvbigpe3ZhciB0PWUodGhpcywiX3F1ZXJ5UGFyYW1IYXNo Iik7Zm9yKHZhciByIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShyKSYmKHRoaXMu cmVtb3ZlT2JzZXJ2ZXIocix0aGlzLHRoaXMuX3F1ZXJ5UGFyYW1DaGFuZ2Vk KSx0aGlzLnJlbW92ZU9ic2VydmVyKHIrIi5bXSIsdGhpcyx0aGlzLl9xdWVy eVBhcmFtQ2hhbmdlZCkpfSxfcXVlcnlQYXJhbUNoYW5nZWQ6ZnVuY3Rpb24o cixuKXtpZigiLltdIj09PW4uc2xpY2Uobi5sZW5ndGgtMykmJihuPW4uc3Vi c3RyKDAsbi5sZW5ndGgtMykpLHRoaXMuX2ZpbmFsaXppbmdRdWVyeVBhcmFt cyl7dmFyIGk9dGhpcy5fcXVlcnlQYXJhbUNoYW5nZXNEdXJpbmdTdXNwZW5z aW9uO3JldHVybiBpJiYoaVtuXT0hMCksdm9pZCAwfXZhciBvPWUodGhpcywi X3F1ZXJ5UGFyYW1IYXNoIik7dFtvW25dXT1FbWJlci5jb3B5KGUodGhpcyxu KSksRW1iZXIucnVuLm9uY2UodGhpcyx0aGlzLl9maXJlUXVlcnlQYXJhbVRy YW5zaXRpb24pfSxfZmlyZVF1ZXJ5UGFyYW1UcmFuc2l0aW9uOmZ1bmN0aW9u KCl7dGhpcy50cmFuc2l0aW9uVG9Sb3V0ZSh7cXVlcnlQYXJhbXM6dH0pLHQ9 e319LF9xdWVyeVBhcmFtQ2hhbmdlc0R1cmluZ1N1c3BlbnNpb246bnVsbH0p fSgpLGZ1bmN0aW9uKCl7dmFyIGU9RW1iZXIuZ2V0LHQ9RW1iZXIuc2V0O0Vt YmVyLlZpZXcucmVvcGVuKHtpbml0OmZ1bmN0aW9uKCl7dCh0aGlzLCJfb3V0 bGV0cyIse30pLHRoaXMuX3N1cGVyKCl9LGNvbm5lY3RPdXRsZXQ6ZnVuY3Rp b24ocixuKXtpZih0aGlzLl9wZW5kaW5nRGlzY29ubmVjdGlvbnMmJmRlbGV0 ZSB0aGlzLl9wZW5kaW5nRGlzY29ubmVjdGlvbnNbcl0sdGhpcy5faGFzRXF1 aXZhbGVudFZpZXcocixuKSlyZXR1cm4gbi5kZXN0cm95KCksdm9pZCAwO3Zh ciBpPWUodGhpcywiX291dGxldHMiKSxvPWUodGhpcywiY29udGFpbmVyIiks YT1vJiZvLmxvb2t1cCgicm91dGVyOm1haW4iKSxzPWUobiwicmVuZGVyZWRO YW1lIik7dChpLHIsbiksYSYmcyYmYS5fY29ubmVjdEFjdGl2ZVZpZXcocyxu KX0sX2hhc0VxdWl2YWxlbnRWaWV3OmZ1bmN0aW9uKHQscil7dmFyIG49ZSh0 aGlzLCJfb3V0bGV0cy4iK3QpO3JldHVybiBuJiZuLmNvbnN0cnVjdG9yPT09 ci5jb25zdHJ1Y3RvciYmbi5nZXQoInRlbXBsYXRlIik9PT1yLmdldCgidGVt cGxhdGUiKSYmbi5nZXQoImNvbnRleHQiKT09PXIuZ2V0KCJjb250ZXh0Iil9 LGRpc2Nvbm5lY3RPdXRsZXQ6ZnVuY3Rpb24oZSl7dGhpcy5fcGVuZGluZ0Rp c2Nvbm5lY3Rpb25zfHwodGhpcy5fcGVuZGluZ0Rpc2Nvbm5lY3Rpb25zPXt9 KSx0aGlzLl9wZW5kaW5nRGlzY29ubmVjdGlvbnNbZV09ITAsRW1iZXIucnVu Lm9uY2UodGhpcywiX2ZpbmlzaERpc2Nvbm5lY3Rpb25zIil9LF9maW5pc2hE aXNjb25uZWN0aW9uczpmdW5jdGlvbigpe2lmKCF0aGlzLmlzRGVzdHJveWVk KXt2YXIgcj1lKHRoaXMsIl9vdXRsZXRzIiksbj10aGlzLl9wZW5kaW5nRGlz Y29ubmVjdGlvbnM7dGhpcy5fcGVuZGluZ0Rpc2Nvbm5lY3Rpb25zPW51bGw7 Zm9yKHZhciBpIGluIG4pdChyLGksbnVsbCl9fX0pfSgpLGZ1bmN0aW9uKCl7 dmFyIGU9RW1iZXIucnVuLnF1ZXVlcyx0PUVtYmVyLkFycmF5UG9seWZpbGxz LmluZGV4T2Y7ZS5zcGxpY2UodC5jYWxsKGUsImFjdGlvbnMiKSsxLDAsInJv dXRlclRyYW5zaXRpb25zIil9KCksZnVuY3Rpb24oKXtFbWJlci5nZXQsRW1i ZXIuc2V0O0VtYmVyLkxvY2F0aW9uPXtjcmVhdGU6ZnVuY3Rpb24oZSl7dmFy IHQ9ZSYmZS5pbXBsZW1lbnRhdGlvbixyPXRoaXMuaW1wbGVtZW50YXRpb25z W3RdO3JldHVybiByLmNyZWF0ZS5hcHBseShyLGFyZ3VtZW50cyl9LHJlZ2lz dGVySW1wbGVtZW50YXRpb246ZnVuY3Rpb24oZSx0KXt0aGlzLmltcGxlbWVu dGF0aW9uc1tlXT10fSxpbXBsZW1lbnRhdGlvbnM6e30sZ2V0SGFzaDpmdW5j dGlvbigpe3ZhciBlPXdpbmRvdy5sb2NhdGlvbi5ocmVmLHQ9ZS5pbmRleE9m KCIjIik7cmV0dXJuLTE9PT10PyIiOmUuc3Vic3RyKHQpfX19KCksZnVuY3Rp b24oKXt2YXIgZT1FbWJlci5nZXQsdD1FbWJlci5zZXQ7RW1iZXIuTm9uZUxv Y2F0aW9uPUVtYmVyLk9iamVjdC5leHRlbmQoe2ltcGxlbWVudGF0aW9uOiJu b25lIixwYXRoOiIiLGdldFVSTDpmdW5jdGlvbigpe3JldHVybiBlKHRoaXMs InBhdGgiKX0sc2V0VVJMOmZ1bmN0aW9uKGUpe3QodGhpcywicGF0aCIsZSl9 LG9uVXBkYXRlVVJMOmZ1bmN0aW9uKGUpe3RoaXMudXBkYXRlQ2FsbGJhY2s9 ZX0saGFuZGxlVVJMOmZ1bmN0aW9uKGUpe3QodGhpcywicGF0aCIsZSksdGhp cy51cGRhdGVDYWxsYmFjayhlKX0sZm9ybWF0VVJMOmZ1bmN0aW9uKGUpe3Jl dHVybiBlfX0pfSgpLGZ1bmN0aW9uKCl7dmFyIGU9RW1iZXIuZ2V0LHQ9RW1i ZXIuc2V0LHI9RW1iZXIuTG9jYXRpb24uZ2V0SGFzaDtFbWJlci5IYXNoTG9j YXRpb249RW1iZXIuT2JqZWN0LmV4dGVuZCh7aW1wbGVtZW50YXRpb246Imhh c2giLGluaXQ6ZnVuY3Rpb24oKXt0KHRoaXMsImxvY2F0aW9uIixlKHRoaXMs ImxvY2F0aW9uIil8fHdpbmRvdy5sb2NhdGlvbil9LGdldFVSTDpmdW5jdGlv bigpe3JldHVybiByKCkuc3Vic3RyKDEpfSxzZXRVUkw6ZnVuY3Rpb24ocil7 ZSh0aGlzLCJsb2NhdGlvbiIpLmhhc2g9cix0KHRoaXMsImxhc3RTZXRVUkwi LHIpfSxyZXBsYWNlVVJMOmZ1bmN0aW9uKHIpe2UodGhpcywibG9jYXRpb24i KS5yZXBsYWNlKCIjIityKSx0KHRoaXMsImxhc3RTZXRVUkwiLHIpfSxvblVw ZGF0ZVVSTDpmdW5jdGlvbihyKXt2YXIgbj10aGlzLGk9RW1iZXIuZ3VpZEZv cih0aGlzKTtFbWJlci4kKHdpbmRvdykub24oImhhc2hjaGFuZ2UuZW1iZXIt bG9jYXRpb24tIitpLGZ1bmN0aW9uKCl7RW1iZXIucnVuKGZ1bmN0aW9uKCl7 dmFyIGk9bi5nZXRVUkwoKTtlKG4sImxhc3RTZXRVUkwiKSE9PWkmJih0KG4s Imxhc3RTZXRVUkwiLG51bGwpLHIoaSkpfSl9KX0sZm9ybWF0VVJMOmZ1bmN0 aW9uKGUpe3JldHVybiIjIitlfSx3aWxsRGVzdHJveTpmdW5jdGlvbigpe3Zh ciBlPUVtYmVyLmd1aWRGb3IodGhpcyk7RW1iZXIuJCh3aW5kb3cpLm9mZigi aGFzaGNoYW5nZS5lbWJlci1sb2NhdGlvbi0iK2UpfX0pfSgpLGZ1bmN0aW9u KCl7dmFyIGU9RW1iZXIuZ2V0LHQ9RW1iZXIuc2V0LHI9ITEsbj13aW5kb3cu aGlzdG9yeSYmInN0YXRlImluIHdpbmRvdy5oaXN0b3J5O0VtYmVyLkhpc3Rv cnlMb2NhdGlvbj1FbWJlci5PYmplY3QuZXh0ZW5kKHtpbXBsZW1lbnRhdGlv bjoiaGlzdG9yeSIsaW5pdDpmdW5jdGlvbigpe3QodGhpcywibG9jYXRpb24i LGUodGhpcywibG9jYXRpb24iKXx8d2luZG93LmxvY2F0aW9uKSx0KHRoaXMs ImJhc2VVUkwiLEVtYmVyLiQoImJhc2UiKS5hdHRyKCJocmVmIil8fCIiKX0s aW5pdFN0YXRlOmZ1bmN0aW9uKCl7dCh0aGlzLCJoaXN0b3J5IixlKHRoaXMs Imhpc3RvcnkiKXx8d2luZG93Lmhpc3RvcnkpLHRoaXMucmVwbGFjZVN0YXRl KHRoaXMuZm9ybWF0VVJMKHRoaXMuZ2V0VVJMKCkpKX0scm9vdFVSTDoiLyIs Z2V0VVJMOmZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzLCJyb290VVJMIikscj1l KHRoaXMsImxvY2F0aW9uIiksbj1yLnBhdGhuYW1lLGk9ZSh0aGlzLCJiYXNl VVJMIik7dD10LnJlcGxhY2UoL1wvJC8sIiIpLGk9aS5yZXBsYWNlKC9cLyQv LCIiKTt2YXIgbz1uLnJlcGxhY2UoaSwiIikucmVwbGFjZSh0LCIiKTtpZihF bWJlci5GRUFUVVJFUy5pc0VuYWJsZWQoInF1ZXJ5LXBhcmFtcy1uZXciKSl7 dmFyIGE9ci5zZWFyY2h8fCIiO28rPWF9cmV0dXJuIG99LHNldFVSTDpmdW5j dGlvbihlKXt2YXIgdD10aGlzLmdldFN0YXRlKCk7ZT10aGlzLmZvcm1hdFVS TChlKSx0JiZ0LnBhdGg9PT1lfHx0aGlzLnB1c2hTdGF0ZShlKX0scmVwbGFj ZVVSTDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmdldFN0YXRlKCk7ZT10aGlz LmZvcm1hdFVSTChlKSx0JiZ0LnBhdGg9PT1lfHx0aGlzLnJlcGxhY2VTdGF0 ZShlKX0sZ2V0U3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gbj9lKHRoaXMsImhp c3RvcnkiKS5zdGF0ZTp0aGlzLl9oaXN0b3J5U3RhdGV9LHB1c2hTdGF0ZTpm dW5jdGlvbih0KXt2YXIgcj17cGF0aDp0fTtlKHRoaXMsImhpc3RvcnkiKS5w dXNoU3RhdGUocixudWxsLHQpLG58fCh0aGlzLl9oaXN0b3J5U3RhdGU9ciks dGhpcy5fcHJldmlvdXNVUkw9dGhpcy5nZXRVUkwoKX0scmVwbGFjZVN0YXRl OmZ1bmN0aW9uKHQpe3ZhciByPXtwYXRoOnR9O2UodGhpcywiaGlzdG9yeSIp LnJlcGxhY2VTdGF0ZShyLG51bGwsdCksbnx8KHRoaXMuX2hpc3RvcnlTdGF0 ZT1yKSx0aGlzLl9wcmV2aW91c1VSTD10aGlzLmdldFVSTCgpfSxvblVwZGF0 ZVVSTDpmdW5jdGlvbihlKXt2YXIgdD1FbWJlci5ndWlkRm9yKHRoaXMpLG49 dGhpcztFbWJlci4kKHdpbmRvdykub24oInBvcHN0YXRlLmVtYmVyLWxvY2F0 aW9uLSIrdCxmdW5jdGlvbigpeyhyfHwocj0hMCxuLmdldFVSTCgpIT09bi5f cHJldmlvdXNVUkwpKSYmZShuLmdldFVSTCgpKX0pfSxmb3JtYXRVUkw6ZnVu Y3Rpb24odCl7dmFyIHI9ZSh0aGlzLCJyb290VVJMIiksbj1lKHRoaXMsImJh c2VVUkwiKTtyZXR1cm4iIiE9PXQ/KHI9ci5yZXBsYWNlKC9cLyQvLCIiKSxu PW4ucmVwbGFjZSgvXC8kLywiIikpOm4ubWF0Y2goL15cLy8pJiZyLm1hdGNo KC9eXC8vKSYmKG49bi5yZXBsYWNlKC9cLyQvLCIiKSksbityK3R9LHdpbGxE ZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGU9RW1iZXIuZ3VpZEZvcih0aGlzKTtF bWJlci4kKHdpbmRvdykub2ZmKCJwb3BzdGF0ZS5lbWJlci1sb2NhdGlvbi0i K2UpfX0pfSgpLGZ1bmN0aW9uKCl7e3ZhciBlPShFbWJlci5nZXQsRW1iZXIu c2V0KSx0PWRvY3VtZW50LmRvY3VtZW50TW9kZSxyPXdpbmRvdy5oaXN0b3J5 LG49d2luZG93LmxvY2F0aW9uLGk9RW1iZXIuTG9jYXRpb24uZ2V0SGFzaDtF bWJlci5BdXRvTG9jYXRpb249e3Jvb3RVUkw6Ii8iLHN1cHBvcnRzSGlzdG9y eTpmdW5jdGlvbigpe3ZhciBlPXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50 O3JldHVybi0xIT09ZS5pbmRleE9mKCJBbmRyb2lkIDIiKSYmLTEhPT1lLmlu ZGV4T2YoIk1vYmlsZSBTYWZhcmkiKSYmLTE9PT1lLmluZGV4T2YoIkNocm9t ZSIpPyExOiEhKHImJiJwdXNoU3RhdGUiaW4gcil9KCksc3VwcG9ydHNIYXNo Q2hhbmdlOiJvbmhhc2hjaGFuZ2UiaW4gd2luZG93JiYodm9pZCAwPT09dHx8 dD43KSxjcmVhdGU6ZnVuY3Rpb24odCl7dCYmdC5yb290VVJMJiYodGhpcy5y b290VVJMPXQucm9vdFVSTCk7dmFyIHIsaSxvLGE9ITEscz10aGlzLmdldEZ1 bGxQYXRoKCk7dGhpcy5zdXBwb3J0c0hpc3Rvcnk/KGk9dGhpcy5nZXRIaXN0 b3J5UGF0aCgpLHM9PT1pP3I9RW1iZXIuSGlzdG9yeUxvY2F0aW9uOihhPSEw LG4ucmVwbGFjZShpKSkpOnRoaXMuc3VwcG9ydHNIYXNoQ2hhbmdlJiYobz10 aGlzLmdldEhhc2hQYXRoKCkscz09PW8/cj1FbWJlci5IYXNoTG9jYXRpb246 KGE9ITAsbi5yZXBsYWNlKG8pKSkscnx8KHI9RW1iZXIuTm9uZUxvY2F0aW9u KTsKdmFyIHU9ci5jcmVhdGUuYXBwbHkocixhcmd1bWVudHMpO3JldHVybiBh JiZlKHUsImNhbmNlbFJvdXRlclNldHVwIiwhMCksdX0sZ2V0UGF0aDpmdW5j dGlvbigpe3ZhciBlPW4ucGF0aG5hbWU7cmV0dXJuIi8iIT09ZS5jaGFyQXQo MCkmJihlPSIvIitlKSxlfSxnZXRGdWxsUGF0aDpmdW5jdGlvbigpe3JldHVy biB0aGlzLmdldFBhdGgoKStpKCkuc3Vic3RyKDEpfSxnZXRIaXN0b3J5UGF0 aDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0UGF0aCgpLHQ9aSgpLnN1YnN0 cigxKSxyPWUrdDtyZXR1cm4gci5yZXBsYWNlKC9cL1wvLywiLyIpfSxnZXRI YXNoUGF0aDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0SGlzdG9yeVBhdGgo KSx0PW5ldyBSZWdFeHAoIigiK3RoaXMucm9vdFVSTCsiKSguKykiKSxyPWUu cmVwbGFjZSh0LCIkMSMvJDIiKTtyZXR1cm4gcj1yLnJlcGxhY2UoL1wvXC8v LCIvIil9fX19KCksZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQscixuLGkpe3Zh ciBvLGE9dC5uYW1lLHM9dC5pbmNvbWluZyx1PXQuaW5jb21pbmdOYW1lcyxs PXUubGVuZ3RoO2lmKG58fChuPXt9KSxpfHwoaT1bXSksIW4uaGFzT3duUHJv cGVydHkoYSkpe2ZvcihpLnB1c2goYSksblthXT0hMCxvPTA7bD5vO28rKyll KHNbdVtvXV0scixuLGkpO3IodCxpKSxpLnBvcCgpfX1mdW5jdGlvbiB0KCl7 dGhpcy5uYW1lcz1bXSx0aGlzLnZlcnRpY2VzPXt9fXQucHJvdG90eXBlLmFk ZD1mdW5jdGlvbihlKXtpZihlKXtpZih0aGlzLnZlcnRpY2VzLmhhc093blBy b3BlcnR5KGUpKXJldHVybiB0aGlzLnZlcnRpY2VzW2VdO3ZhciB0PXtuYW1l OmUsaW5jb21pbmc6e30saW5jb21pbmdOYW1lczpbXSxoYXNPdXRnb2luZzoh MSx2YWx1ZTpudWxsfTtyZXR1cm4gdGhpcy52ZXJ0aWNlc1tlXT10LHRoaXMu bmFtZXMucHVzaChlKSx0fX0sdC5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKGUs dCl7dGhpcy5hZGQoZSkudmFsdWU9dH0sdC5wcm90b3R5cGUuYWRkRWRnZT1m dW5jdGlvbih0LHIpe2Z1bmN0aW9uIG4oZSx0KXtpZihlLm5hbWU9PT1yKXRo cm93IG5ldyBFbWJlci5FcnJvcigiY3ljbGUgZGV0ZWN0ZWQ6ICIrcisiIDwt ICIrdC5qb2luKCIgPC0gIikpfWlmKHQmJnImJnQhPT1yKXt2YXIgaT10aGlz LmFkZCh0KSxvPXRoaXMuYWRkKHIpO28uaW5jb21pbmcuaGFzT3duUHJvcGVy dHkodCl8fChlKGksbiksaS5oYXNPdXRnb2luZz0hMCxvLmluY29taW5nW3Rd PWksby5pbmNvbWluZ05hbWVzLnB1c2godCkpfX0sdC5wcm90b3R5cGUudG9w c29ydD1mdW5jdGlvbih0KXt2YXIgcixuLGk9e30sbz10aGlzLnZlcnRpY2Vz LGE9dGhpcy5uYW1lcyxzPWEubGVuZ3RoO2ZvcihyPTA7cz5yO3IrKyluPW9b YVtyXV0sbi5oYXNPdXRnb2luZ3x8ZShuLHQsaSl9LHQucHJvdG90eXBlLmFk ZEVkZ2VzPWZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBpO2lmKHRoaXMubWFwKGUs dCkscilpZigic3RyaW5nIj09dHlwZW9mIHIpdGhpcy5hZGRFZGdlKGUscik7 ZWxzZSBmb3IoaT0wO2k8ci5sZW5ndGg7aSsrKXRoaXMuYWRkRWRnZShlLHJb aV0pO2lmKG4paWYoInN0cmluZyI9PXR5cGVvZiBuKXRoaXMuYWRkRWRnZShu LGUpO2Vsc2UgZm9yKGk9MDtpPG4ubGVuZ3RoO2krKyl0aGlzLmFkZEVkZ2Uo bltpXSxlKX0sRW1iZXIuREFHPXR9KCksZnVuY3Rpb24oKXt2YXIgZT1FbWJl ci5nZXQsdD1FbWJlci5TdHJpbmcuY2xhc3NpZnkscj1FbWJlci5TdHJpbmcu Y2FwaXRhbGl6ZSxuPUVtYmVyLlN0cmluZy5kZWNhbWVsaXplO0VtYmVyLkRl ZmF1bHRSZXNvbHZlcj1FbWJlci5PYmplY3QuZXh0ZW5kKHtuYW1lc3BhY2U6 bnVsbCxub3JtYWxpemU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zcGxpdCgiOiIs Mikscj10WzBdLG49dFsxXTtpZigidGVtcGxhdGUiIT09cil7dmFyIGk9bjty ZXR1cm4gaS5pbmRleE9mKCIuIik+LTEmJihpPWkucmVwbGFjZSgvXC4oLikv ZyxmdW5jdGlvbihlKXtyZXR1cm4gZS5jaGFyQXQoMSkudG9VcHBlckNhc2Uo KX0pKSxuLmluZGV4T2YoIl8iKT4tMSYmKGk9aS5yZXBsYWNlKC9fKC4pL2cs ZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hhckF0KDEpLnRvVXBwZXJDYXNlKCl9 KSkscisiOiIraX1yZXR1cm4gZX0scmVzb2x2ZTpmdW5jdGlvbihlKXt2YXIg dD10aGlzLnBhcnNlTmFtZShlKSxyPXQucmVzb2x2ZU1ldGhvZE5hbWU7aWYo IXQubmFtZXx8IXQudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlk IGZ1bGxOYW1lOiBgIitlKyJgLCBtdXN0IGJlIG9mIHRoZSBmb3JtIGB0eXBl Om5hbWVgICIpO2lmKHRoaXNbcl0pe3ZhciBuPXRoaXNbcl0odCk7aWYobily ZXR1cm4gbn1yZXR1cm4gdGhpcy5yZXNvbHZlT3RoZXIodCl9LHBhcnNlTmFt ZTpmdW5jdGlvbihuKXt2YXIgaT1uLnNwbGl0KCI6Iiksbz1pWzBdLGE9aVsx XSxzPWEsdT1lKHRoaXMsIm5hbWVzcGFjZSIpLGw9dTtpZigidGVtcGxhdGUi IT09byYmLTEhPT1zLmluZGV4T2YoIi8iKSl7dmFyIGM9cy5zcGxpdCgiLyIp O3M9Y1tjLmxlbmd0aC0xXTt2YXIgaD1yKGMuc2xpY2UoMCwtMSkuam9pbigi LiIpKTtsPUVtYmVyLk5hbWVzcGFjZS5ieU5hbWUoaCl9cmV0dXJue2Z1bGxO YW1lOm4sdHlwZTpvLGZ1bGxOYW1lV2l0aG91dFR5cGU6YSxuYW1lOnMscm9v dDpsLHJlc29sdmVNZXRob2ROYW1lOiJyZXNvbHZlIit0KG8pfX0scmVzb2x2 ZVRlbXBsYXRlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZnVsbE5hbWVXaXRob3V0 VHlwZS5yZXBsYWNlKC9cLi9nLCIvIik7cmV0dXJuIEVtYmVyLlRFTVBMQVRF U1t0XT9FbWJlci5URU1QTEFURVNbdF06KHQ9bih0KSxFbWJlci5URU1QTEFU RVNbdF0/RW1iZXIuVEVNUExBVEVTW3RdOnZvaWQgMCl9LHVzZVJvdXRlck5h bWluZzpmdW5jdGlvbihlKXtlLm5hbWU9ZS5uYW1lLnJlcGxhY2UoL1wuL2cs Il8iKSwiYmFzaWMiPT09ZS5uYW1lJiYoZS5uYW1lPSIiKX0scmVzb2x2ZUNv bnRyb2xsZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudXNlUm91dGVyTmFt aW5nKGUpLHRoaXMucmVzb2x2ZU90aGVyKGUpfSxyZXNvbHZlUm91dGU6ZnVu Y3Rpb24oZSl7cmV0dXJuIHRoaXMudXNlUm91dGVyTmFtaW5nKGUpLHRoaXMu cmVzb2x2ZU90aGVyKGUpfSxyZXNvbHZlVmlldzpmdW5jdGlvbihlKXtyZXR1 cm4gdGhpcy51c2VSb3V0ZXJOYW1pbmcoZSksdGhpcy5yZXNvbHZlT3RoZXIo ZSl9LHJlc29sdmVIZWxwZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVz b2x2ZU90aGVyKGUpfHxFbWJlci5IYW5kbGViYXJzLmhlbHBlcnNbZS5mdWxs TmFtZVdpdGhvdXRUeXBlXX0scmVzb2x2ZU1vZGVsOmZ1bmN0aW9uKHIpe3Zh ciBuPXQoci5uYW1lKSxpPWUoci5yb290LG4pO3JldHVybiBpP2k6dm9pZCAw fSxyZXNvbHZlT3RoZXI6ZnVuY3Rpb24ocil7dmFyIG49dChyLm5hbWUpK3Qo ci50eXBlKSxpPWUoci5yb290LG4pO3JldHVybiBpP2k6dm9pZCAwfSxsb29r dXBEZXNjcmlwdGlvbjpmdW5jdGlvbihlKXt2YXIgcj10aGlzLnBhcnNlTmFt ZShlKTtpZigidGVtcGxhdGUiPT09ci50eXBlKXJldHVybiJ0ZW1wbGF0ZSBh dCAiK3IuZnVsbE5hbWVXaXRob3V0VHlwZS5yZXBsYWNlKC9cLi9nLCIvIik7 dmFyIG49ci5yb290KyIuIit0KHIubmFtZSk7cmV0dXJuIm1vZGVsIiE9PXIu dHlwZSYmKG4rPXQoci50eXBlKSksbn0sbWFrZVRvU3RyaW5nOmZ1bmN0aW9u KGUpe3JldHVybiBlLnRvU3RyaW5nKCl9fSl9KCksZnVuY3Rpb24oKXtmdW5j dGlvbiBlKGUpe3RoaXMuX2NvbnRhaW5lcj1lfWZ1bmN0aW9uIHQoZSl7ZnVu Y3Rpb24gdChlKXtyZXR1cm4gbi5yZXNvbHZlKGUpfWUuZ2V0KCJyZXNvbHZl ciIpO3ZhciByPWUuZ2V0KCJyZXNvbHZlciIpfHxlLmdldCgiUmVzb2x2ZXIi KXx8RW1iZXIuRGVmYXVsdFJlc29sdmVyLG49ci5jcmVhdGUoe25hbWVzcGFj ZTplfSk7cmV0dXJuIHQuZGVzY3JpYmU9ZnVuY3Rpb24oZSl7cmV0dXJuIG4u bG9va3VwRGVzY3JpcHRpb24oZSl9LHQubWFrZVRvU3RyaW5nPWZ1bmN0aW9u KGUsdCl7cmV0dXJuIG4ubWFrZVRvU3RyaW5nKGUsdCl9LHQubm9ybWFsaXpl PWZ1bmN0aW9uKGUpe3JldHVybiBuLm5vcm1hbGl6ZT9uLm5vcm1hbGl6ZShl KTplfSx0fXZhciByPUVtYmVyLmdldCxuPUVtYmVyLnNldDtlLmRlcHJlY2F0 ZT1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9j b250YWluZXI7cmV0dXJuIHRbZV0uYXBwbHkodCxhcmd1bWVudHMpfX0sZS5w cm90b3R5cGU9e19jb250YWluZXI6bnVsbCxsb29rdXA6ZS5kZXByZWNhdGUo Imxvb2t1cCIpLHJlc29sdmU6ZS5kZXByZWNhdGUoInJlc29sdmUiKSxyZWdp c3RlcjplLmRlcHJlY2F0ZSgicmVnaXN0ZXIiKX07dmFyIGk9RW1iZXIuQXBw bGljYXRpb249RW1iZXIuTmFtZXNwYWNlLmV4dGVuZChFbWJlci5EZWZlcnJl ZE1peGluLHtyb290RWxlbWVudDoiYm9keSIsZXZlbnREaXNwYXRjaGVyOm51 bGwsY3VzdG9tRXZlbnRzOm51bGwsX3JlYWRpbmVzc0RlZmVycmFsczoxLGlu aXQ6ZnVuY3Rpb24oKXtpZih0aGlzLiR8fCh0aGlzLiQ9RW1iZXIuJCksdGhp cy5fX2NvbnRhaW5lcl9fPXRoaXMuYnVpbGRDb250YWluZXIoKSx0aGlzLlJv dXRlcj10aGlzLmRlZmF1bHRSb3V0ZXIoKSx0aGlzLl9zdXBlcigpLHRoaXMu c2NoZWR1bGVJbml0aWFsaXplKCksRW1iZXIubGlicmFyaWVzLnJlZ2lzdGVy Q29yZUxpYnJhcnkoIkhhbmRsZWJhcnMiLEVtYmVyLkhhbmRsZWJhcnMuVkVS U0lPTiksRW1iZXIubGlicmFyaWVzLnJlZ2lzdGVyQ29yZUxpYnJhcnkoImpR dWVyeSIsRW1iZXIuJCgpLmpxdWVyeSksRW1iZXIuTE9HX1ZFUlNJT04pe0Vt YmVyLkxPR19WRVJTSU9OPSExO3ZhciBlPU1hdGgubWF4LmFwcGx5KHRoaXMs RW1iZXIuQShFbWJlci5saWJyYXJpZXMpLm1hcEJ5KCJuYW1lLmxlbmd0aCIp KTtFbWJlci5saWJyYXJpZXMuZWFjaChmdW5jdGlvbih0KXtuZXcgQXJyYXko ZS10Lmxlbmd0aCsxKS5qb2luKCIgIil9KX19LGJ1aWxkQ29udGFpbmVyOmZ1 bmN0aW9uKCl7dmFyIGU9dGhpcy5fX2NvbnRhaW5lcl9fPWkuYnVpbGRDb250 YWluZXIodGhpcyk7cmV0dXJuIGV9LGRlZmF1bHRSb3V0ZXI6ZnVuY3Rpb24o KXtpZih0aGlzLlJvdXRlciE9PSExKXt2YXIgZT10aGlzLl9fY29udGFpbmVy X187cmV0dXJuIHRoaXMuUm91dGVyJiYoZS51bnJlZ2lzdGVyKCJyb3V0ZXI6 bWFpbiIpLGUucmVnaXN0ZXIoInJvdXRlcjptYWluIix0aGlzLlJvdXRlcikp LGUubG9va3VwRmFjdG9yeSgicm91dGVyOm1haW4iKX19LHNjaGVkdWxlSW5p dGlhbGl6ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7IXRoaXMuJHx8dGhpcy4k LmlzUmVhZHk/RW1iZXIucnVuLnNjaGVkdWxlKCJhY3Rpb25zIixlLCJfaW5p dGlhbGl6ZSIpOnRoaXMuJCgpLnJlYWR5KGZ1bmN0aW9uKCl7RW1iZXIucnVu KGUsIl9pbml0aWFsaXplIil9KX0sZGVmZXJSZWFkaW5lc3M6ZnVuY3Rpb24o KXt0aGlzLl9yZWFkaW5lc3NEZWZlcnJhbHMrK30sYWR2YW5jZVJlYWRpbmVz czpmdW5jdGlvbigpe3RoaXMuX3JlYWRpbmVzc0RlZmVycmFscy0tLDA9PT10 aGlzLl9yZWFkaW5lc3NEZWZlcnJhbHMmJkVtYmVyLnJ1bi5vbmNlKHRoaXMs dGhpcy5kaWRCZWNvbWVSZWFkeSl9LHJlZ2lzdGVyOmZ1bmN0aW9uKCl7dmFy IGU9dGhpcy5fX2NvbnRhaW5lcl9fO2UucmVnaXN0ZXIuYXBwbHkoZSxhcmd1 bWVudHMpfSxpbmplY3Q6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9fY29udGFp bmVyX187ZS5pbmplY3Rpb24uYXBwbHkoZSxhcmd1bWVudHMpfSxpbml0aWFs aXplOmZ1bmN0aW9uKCl7fSxfaW5pdGlhbGl6ZTpmdW5jdGlvbigpe2lmKCF0 aGlzLmlzRGVzdHJveWVkKXtpZih0aGlzLlJvdXRlcil7dmFyIGU9dGhpcy5f X2NvbnRhaW5lcl9fO2UudW5yZWdpc3Rlcigicm91dGVyOm1haW4iKSxlLnJl Z2lzdGVyKCJyb3V0ZXI6bWFpbiIsdGhpcy5Sb3V0ZXIpfXJldHVybiB0aGlz LnJ1bkluaXRpYWxpemVycygpLEVtYmVyLnJ1bkxvYWRIb29rcygiYXBwbGlj YXRpb24iLHRoaXMpLHRoaXMuYWR2YW5jZVJlYWRpbmVzcygpLHRoaXN9fSxy ZXNldDpmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt2YXIgZT10aGlzLl9fY29u dGFpbmVyX18ubG9va3VwKCJyb3V0ZXI6bWFpbiIpO2UucmVzZXQoKSxFbWJl ci5ydW4odGhpcy5fX2NvbnRhaW5lcl9fLCJkZXN0cm95IiksdGhpcy5idWls ZENvbnRhaW5lcigpLEVtYmVyLnJ1bi5zY2hlZHVsZSgiYWN0aW9ucyIsdGhp cyxmdW5jdGlvbigpe3RoaXMuX2luaXRpYWxpemUoKX0pfXRoaXMuX3JlYWRp bmVzc0RlZmVycmFscz0xLEVtYmVyLnJ1bi5qb2luKHRoaXMsZSl9LHJ1bklu aXRpYWxpemVyczpmdW5jdGlvbigpe3ZhciBlLHQsbj1yKHRoaXMuY29uc3Ry dWN0b3IsImluaXRpYWxpemVycyIpLGk9dGhpcy5fX2NvbnRhaW5lcl9fLG89 bmV3IEVtYmVyLkRBRyxhPXRoaXM7Zm9yKGUgaW4gbil0PW5bZV0sby5hZGRF ZGdlcyh0Lm5hbWUsdC5pbml0aWFsaXplLHQuYmVmb3JlLHQuYWZ0ZXIpO28u dG9wc29ydChmdW5jdGlvbihlKXt2YXIgdD1lLnZhbHVlO3QoaSxhKX0pfSxk aWRCZWNvbWVSZWFkeTpmdW5jdGlvbigpe3RoaXMuc2V0dXBFdmVudERpc3Bh dGNoZXIoKSx0aGlzLnJlYWR5KCksdGhpcy5zdGFydFJvdXRpbmcoKSxFbWJl ci50ZXN0aW5nfHwoRW1iZXIuTmFtZXNwYWNlLnByb2Nlc3NBbGwoKSxFbWJl ci5CT09URUQ9ITApLHRoaXMucmVzb2x2ZSh0aGlzKX0sc2V0dXBFdmVudERp c3BhdGNoZXI6ZnVuY3Rpb24oKXt2YXIgZT1yKHRoaXMsImN1c3RvbUV2ZW50 cyIpLHQ9cih0aGlzLCJyb290RWxlbWVudCIpLGk9dGhpcy5fX2NvbnRhaW5l cl9fLmxvb2t1cCgiZXZlbnRfZGlzcGF0Y2hlcjptYWluIik7bih0aGlzLCJl dmVudERpc3BhdGNoZXIiLGkpLGkuc2V0dXAoZSx0KX0sc3RhcnRSb3V0aW5n OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fX2NvbnRhaW5lcl9fLmxvb2t1cCgi cm91dGVyOm1haW4iKTtlJiZlLnN0YXJ0Um91dGluZygpfSxoYW5kbGVVUkw6 ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fX2NvbnRhaW5lcl9fLmxvb2t1cCgi cm91dGVyOm1haW4iKTt0LmhhbmRsZVVSTChlKX0scmVhZHk6RW1iZXIuSyxy ZXNvbHZlcjpudWxsLFJlc29sdmVyOm51bGwsd2lsbERlc3Ryb3k6ZnVuY3Rp b24oKXtFbWJlci5CT09URUQ9ITEsdGhpcy5fX2NvbnRhaW5lcl9fLmxvb2t1 cCgicm91dGVyOm1haW4iKS5yZXNldCgpLHRoaXMuX19jb250YWluZXJfXy5k ZXN0cm95KCl9LGluaXRpYWxpemVyOmZ1bmN0aW9uKGUpe3RoaXMuY29uc3Ry dWN0b3IuaW5pdGlhbGl6ZXIoZSl9fSk7RW1iZXIuQXBwbGljYXRpb24ucmVv cGVuQ2xhc3Moe2luaXRpYWxpemVyczp7fSxpbml0aWFsaXplcjpmdW5jdGlv bihlKXt2b2lkIDAhPT10aGlzLnN1cGVyY2xhc3MuaW5pdGlhbGl6ZXJzJiZ0 aGlzLnN1cGVyY2xhc3MuaW5pdGlhbGl6ZXJzPT09dGhpcy5pbml0aWFsaXpl cnMmJnRoaXMucmVvcGVuQ2xhc3Moe2luaXRpYWxpemVyczpFbWJlci5jcmVh dGUodGhpcy5pbml0aWFsaXplcnMpfSksdGhpcy5pbml0aWFsaXplcnNbZS5u YW1lXT1lfSxidWlsZENvbnRhaW5lcjpmdW5jdGlvbihyKXt2YXIgbj1uZXcg RW1iZXIuQ29udGFpbmVyO3JldHVybiBFbWJlci5Db250YWluZXIuZGVmYXVs dENvbnRhaW5lcj1uZXcgZShuKSxuLnNldD1FbWJlci5zZXQsbi5yZXNvbHZl cj10KHIpLG4ubm9ybWFsaXplPW4ucmVzb2x2ZXIubm9ybWFsaXplLG4uZGVz Y3JpYmU9bi5yZXNvbHZlci5kZXNjcmliZSxuLm1ha2VUb1N0cmluZz1uLnJl c29sdmVyLm1ha2VUb1N0cmluZyxuLm9wdGlvbnNGb3JUeXBlKCJjb21wb25l bnQiLHtzaW5nbGV0b246ITF9KSxuLm9wdGlvbnNGb3JUeXBlKCJ2aWV3Iix7 c2luZ2xldG9uOiExfSksbi5vcHRpb25zRm9yVHlwZSgidGVtcGxhdGUiLHtp bnN0YW50aWF0ZTohMX0pLG4ub3B0aW9uc0ZvclR5cGUoImhlbHBlciIse2lu c3RhbnRpYXRlOiExfSksbi5yZWdpc3RlcigiYXBwbGljYXRpb246bWFpbiIs cix7aW5zdGFudGlhdGU6ITF9KSxuLnJlZ2lzdGVyKCJjb250cm9sbGVyOmJh c2ljIixFbWJlci5Db250cm9sbGVyLHtpbnN0YW50aWF0ZTohMX0pLG4ucmVn aXN0ZXIoImNvbnRyb2xsZXI6b2JqZWN0IixFbWJlci5PYmplY3RDb250cm9s bGVyLHtpbnN0YW50aWF0ZTohMX0pLG4ucmVnaXN0ZXIoImNvbnRyb2xsZXI6 YXJyYXkiLEVtYmVyLkFycmF5Q29udHJvbGxlcix7aW5zdGFudGlhdGU6ITF9 KSxuLnJlZ2lzdGVyKCJyb3V0ZTpiYXNpYyIsRW1iZXIuUm91dGUse2luc3Rh bnRpYXRlOiExfSksbi5yZWdpc3RlcigiZXZlbnRfZGlzcGF0Y2hlcjptYWlu IixFbWJlci5FdmVudERpc3BhdGNoZXIpLG4ucmVnaXN0ZXIoInJvdXRlcjpt YWluIixFbWJlci5Sb3V0ZXIpLG4uaW5qZWN0aW9uKCJyb3V0ZXI6bWFpbiIs Im5hbWVzcGFjZSIsImFwcGxpY2F0aW9uOm1haW4iKSxuLnJlZ2lzdGVyKCJs b2NhdGlvbjphdXRvIixFbWJlci5BdXRvTG9jYXRpb24pLG4ucmVnaXN0ZXIo ImxvY2F0aW9uOmhhc2giLEVtYmVyLkhhc2hMb2NhdGlvbiksbi5yZWdpc3Rl cigibG9jYXRpb246aGlzdG9yeSIsRW1iZXIuSGlzdG9yeUxvY2F0aW9uKSxu LnJlZ2lzdGVyKCJsb2NhdGlvbjpub25lIixFbWJlci5Ob25lTG9jYXRpb24p LG4uaW5qZWN0aW9uKCJjb250cm9sbGVyIiwidGFyZ2V0Iiwicm91dGVyOm1h aW4iKSxuLmluamVjdGlvbigiY29udHJvbGxlciIsIm5hbWVzcGFjZSIsImFw cGxpY2F0aW9uOm1haW4iKSxuLmluamVjdGlvbigicm91dGUiLCJyb3V0ZXIi LCJyb3V0ZXI6bWFpbiIpLG59fSksRW1iZXIucnVuTG9hZEhvb2tzKCJFbWJl ci5BcHBsaWNhdGlvbiIsRW1iZXIuQXBwbGljYXRpb24pfSgpLGZ1bmN0aW9u KCl7ZnVuY3Rpb24gZShlLHQscil7dmFyIG4saSxvLGE9W107Zm9yKGk9MCxv PXIubGVuZ3RoO28+aTtpKyspbj1yW2ldLC0xPT09bi5pbmRleE9mKCI6Iikm JihuPSJjb250cm9sbGVyOiIrbiksdC5oYXMobil8fGEucHVzaChuKTtpZihh Lmxlbmd0aCl0aHJvdyBuZXcgRW1iZXIuRXJyb3IoRW1iZXIuaW5zcGVjdChl KSsiIG5lZWRzIFsgIithLmpvaW4oIiwgIikrIiBdIGJ1dCAiKyhhLmxlbmd0 aD4xPyJ0aGV5IjoiaXQiKSsiIGNvdWxkIG5vdCBiZSBmb3VuZCIpfXZhciB0 PUVtYmVyLmdldCxyPShFbWJlci5zZXQsRW1iZXIuY29tcHV0ZWQoZnVuY3Rp b24oKXt2YXIgZT10aGlzO3JldHVybntuZWVkczp0KGUsIm5lZWRzIiksY29u dGFpbmVyOnQoZSwiY29udGFpbmVyIiksdW5rbm93blByb3BlcnR5OmZ1bmN0 aW9uKHQpe3ZhciByLG4saSxvPXRoaXMubmVlZHM7Zm9yKG49MCxpPW8ubGVu Z3RoO2k+bjtuKyspaWYocj1vW25dLHI9PT10KXJldHVybiB0aGlzLmNvbnRh aW5lci5sb29rdXAoImNvbnRyb2xsZXI6Iit0KTt2YXIgYT1FbWJlci5pbnNw ZWN0KGUpKyIjbmVlZHMgZG9lcyBub3QgaW5jbHVkZSBgIit0KyJgLiBUbyBh Y2Nlc3MgdGhlICIrdCsiIGNvbnRyb2xsZXIgZnJvbSAiK0VtYmVyLmluc3Bl Y3QoZSkrIiwgIitFbWJlci5pbnNwZWN0KGUpKyIgc2hvdWxkIGhhdmUgYSBg bmVlZHNgIHByb3BlcnR5IHRoYXQgaXMgYW4gYXJyYXkgb2YgdGhlIGNvbnRy b2xsZXJzIGl0IGhhcyBhY2Nlc3MgdG8uIjt0aHJvdyBuZXcgUmVmZXJlbmNl RXJyb3IoYSl9LHNldFVua25vd25Qcm9wZXJ0eTpmdW5jdGlvbih0KXt0aHJv dyBuZXcgRXJyb3IoIllvdSBjYW5ub3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBv ZiBgY29udHJvbGxlcnMuIit0KyJgIG9mICIrRW1iZXIuaW5zcGVjdChlKSl9 fX0pKTtFbWJlci5Db250cm9sbGVyTWl4aW4ucmVvcGVuKHtjb25jYXRlbmF0 ZWRQcm9wZXJ0aWVzOlsibmVlZHMiXSxuZWVkczpbXSxpbml0OmZ1bmN0aW9u KCl7dmFyIHI9dCh0aGlzLCJuZWVkcyIpLG49dChyLCJsZW5ndGgiKTtuPjAm Jih0aGlzLmNvbnRhaW5lciYmZSh0aGlzLHRoaXMuY29udGFpbmVyLHIpLHQo dGhpcywiY29udHJvbGxlcnMiKSksdGhpcy5fc3VwZXIuYXBwbHkodGhpcyxh cmd1bWVudHMpfSxjb250cm9sbGVyRm9yOmZ1bmN0aW9uKGUpe3JldHVybiBF bWJlci5jb250cm9sbGVyRm9yKHQodGhpcywiY29udGFpbmVyIiksZSl9LGNv bnRyb2xsZXJzOnJ9KX0oKSxmdW5jdGlvbigpe0VtYmVyLkRhdGFBZGFwdGVy PUVtYmVyLk9iamVjdC5leHRlbmQoe2luaXQ6ZnVuY3Rpb24oKXt0aGlzLl9z dXBlcigpLHRoaXMucmVsZWFzZU1ldGhvZHM9RW1iZXIuQSgpfSxjb250YWlu ZXI6bnVsbCxhdHRyaWJ1dGVMaW1pdDozLHJlbGVhc2VNZXRob2RzOkVtYmVy LkEoKSxnZXRGaWx0ZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIEVtYmVyLkEoKX0s d2F0Y2hNb2RlbFR5cGVzOmZ1bmN0aW9uKGUsdCl7dmFyIHIsbj10aGlzLmdl dE1vZGVsVHlwZXMoKSxpPXRoaXMsbz1FbWJlci5BKCk7cj1uLm1hcChmdW5j dGlvbihlKXt2YXIgcj1pLndyYXBNb2RlbFR5cGUoZSk7cmV0dXJuIG8ucHVz aChpLm9ic2VydmVNb2RlbFR5cGUoZSx0KSkscn0pLGUocik7dmFyIGE9ZnVu Y3Rpb24oKXtvLmZvckVhY2goZnVuY3Rpb24oZSl7ZSgpfSksaS5yZWxlYXNl TWV0aG9kcy5yZW1vdmVPYmplY3QoYSl9O3JldHVybiB0aGlzLnJlbGVhc2VN ZXRob2RzLnB1c2hPYmplY3QoYSksYX0sd2F0Y2hSZWNvcmRzOmZ1bmN0aW9u KGUsdCxyLG4pe3ZhciBpLG89dGhpcyxhPUVtYmVyLkEoKSxzPXRoaXMuZ2V0 UmVjb3JkcyhlKSx1PWZ1bmN0aW9uKGUpe3IoW2VdKX0sbD1zLm1hcChmdW5j dGlvbihlKXtyZXR1cm4gYS5wdXNoKG8ub2JzZXJ2ZVJlY29yZChlLHUpKSxv LndyYXBSZWNvcmQoZSl9KSxjPWZ1bmN0aW9uKGUscixpLHMpe2Zvcih2YXIg bD1yO3Ircz5sO2wrKyl7dmFyIGM9ZS5vYmplY3RBdChsKSxoPW8ud3JhcFJl Y29yZChjKTthLnB1c2goby5vYnNlcnZlUmVjb3JkKGMsdSkpLHQoW2hdKX1p JiZuKHIsaSl9LGg9e2RpZENoYW5nZTpjLHdpbGxDaGFuZ2U6RW1iZXIuS307 cmV0dXJuIHMuYWRkQXJyYXlPYnNlcnZlcihvLGgpLGk9ZnVuY3Rpb24oKXth LmZvckVhY2goZnVuY3Rpb24oZSl7ZSgpfSkscy5yZW1vdmVBcnJheU9ic2Vy dmVyKG8saCksby5yZWxlYXNlTWV0aG9kcy5yZW1vdmVPYmplY3QoaSl9LHQo bCksdGhpcy5yZWxlYXNlTWV0aG9kcy5wdXNoT2JqZWN0KGkpLGl9LHdpbGxE ZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5fc3VwZXIoKSx0aGlzLnJlbGVhc2VN ZXRob2RzLmZvckVhY2goZnVuY3Rpb24oZSl7ZSgpfSl9LGRldGVjdDpmdW5j dGlvbigpe3JldHVybiExfSxjb2x1bW5zRm9yVHlwZTpmdW5jdGlvbigpe3Jl dHVybiBFbWJlci5BKCl9LG9ic2VydmVNb2RlbFR5cGU6ZnVuY3Rpb24oZSx0 KXt2YXIgcj10aGlzLG49dGhpcy5nZXRSZWNvcmRzKGUpLGk9ZnVuY3Rpb24o KXt0KFtyLndyYXBNb2RlbFR5cGUoZSldKX0sbz17ZGlkQ2hhbmdlOmZ1bmN0 aW9uKCl7RW1iZXIucnVuLnNjaGVkdWxlT25jZSgiYWN0aW9ucyIsdGhpcyxp KX0sd2lsbENoYW5nZTpFbWJlci5LfTtuLmFkZEFycmF5T2JzZXJ2ZXIodGhp cyxvKTt2YXIgYT1mdW5jdGlvbigpe24ucmVtb3ZlQXJyYXlPYnNlcnZlcihy LG8pfTtyZXR1cm4gYX0sd3JhcE1vZGVsVHlwZTpmdW5jdGlvbihlKXt2YXIg dCxyPXRoaXMuZ2V0UmVjb3JkcyhlKTtyZXR1cm4gdD17bmFtZTplLnRvU3Ry aW5nKCksY291bnQ6RW1iZXIuZ2V0KHIsImxlbmd0aCIpLGNvbHVtbnM6dGhp cy5jb2x1bW5zRm9yVHlwZShlKSxvYmplY3Q6ZX19LGdldE1vZGVsVHlwZXM6 ZnVuY3Rpb24oKXt2YXIgZT1FbWJlci5BKEVtYmVyLk5hbWVzcGFjZS5OQU1F U1BBQ0VTKSx0PUVtYmVyLkEoKSxyPXRoaXM7cmV0dXJuIGUuZm9yRWFjaChm dW5jdGlvbihlKXtmb3IodmFyIG4gaW4gZSlpZihlLmhhc093blByb3BlcnR5 KG4pKXt2YXIgaT1lW25dO3IuZGV0ZWN0KGkpJiZ0LnB1c2goaSl9fSksdH0s Z2V0UmVjb3JkczpmdW5jdGlvbigpe3JldHVybiBFbWJlci5BKCl9LHdyYXBS ZWNvcmQ6ZnVuY3Rpb24oZSl7dmFyIHQ9e29iamVjdDplfTtyZXR1cm4gdC5j b2x1bW5WYWx1ZXM9dGhpcy5nZXRSZWNvcmRDb2x1bW5WYWx1ZXMoZSksdC5z ZWFyY2hLZXl3b3Jkcz10aGlzLmdldFJlY29yZEtleXdvcmRzKGUpLHQuZmls dGVyVmFsdWVzPXRoaXMuZ2V0UmVjb3JkRmlsdGVyVmFsdWVzKGUpLHQuY29s b3I9dGhpcy5nZXRSZWNvcmRDb2xvcihlKSx0fSxnZXRSZWNvcmRDb2x1bW5W YWx1ZXM6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZ2V0UmVjb3JkS2V5d29yZHM6 ZnVuY3Rpb24oKXtyZXR1cm4gRW1iZXIuQSgpfSxnZXRSZWNvcmRGaWx0ZXJW YWx1ZXM6ZnVuY3Rpb24oKXtyZXR1cm57fX0sZ2V0UmVjb3JkQ29sb3I6ZnVu Y3Rpb24oKXtyZXR1cm4gbnVsbH0sb2JzZXJ2ZVJlY29yZDpmdW5jdGlvbigp e3JldHVybiBmdW5jdGlvbigpe319fSl9KCl9KCksInVuZGVmaW5lZCI9PXR5 cGVvZiBsb2NhdGlvbnx8ImxvY2FsaG9zdCIhPT1sb2NhdGlvbi5ob3N0bmFt ZSYmIjEyNy4wLjAuMSIhPT1sb2NhdGlvbi5ob3N0bmFtZXx8RW1iZXIuTG9n Z2VyLndhcm4oIllvdSBhcmUgcnVubmluZyBhIHByb2R1Y3Rpb24gYnVpbGQg b2YgRW1iZXIgb24gbG9jYWxob3N0IGFuZCB3b24ndCByZWNlaXZlIGRldGFp bGVkIGVycm9yIG1lc3NhZ2VzLiBJZiB5b3Ugd2FudCBmdWxsIGVycm9yIG1l c3NhZ2VzIHBsZWFzZSB1c2UgdGhlIG5vbi1taW5pZmllZCBidWlsZCBwcm92 aWRlZCBvbiB0aGUgRW1iZXIgd2Vic2l0ZS4iKTs= http_version: recorded_at: Mon, 17 Feb 2014 11:45:42 GMT - request: method: get uri: http://builds.emberjs.com/canary/ember-data.js body: encoding: US-ASCII string: '' headers: Accept-Encoding: - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 Accept: - '*/*' User-Agent: - Ruby Host: - builds.emberjs.com response: status: code: 200 message: OK headers: X-Amz-Id-2: - OC3hQcWDtbFOyZuJ3iagXhJB+ovTLJVGiO/Q1aClxstm/LV3fVnPeqlHyXwXdJtM X-Amz-Request-Id: - 3EDEDF35CF8CB9BC Date: - Mon, 17 Feb 2014 11:45:43 GMT Last-Modified: - Sun, 16 Feb 2014 16:28:11 GMT Etag: - '"d28c5285772ce3a9d39b449ed5620bf4"' Content-Type: - text/javascript Content-Length: - '340262' Server: - AmazonS3 body: encoding: ASCII-8BIT string: !binary |- LyohCiAqIEBvdmVydmlldyAgRW1iZXIgRGF0YQogKiBAY29weXJpZ2h0IENv cHlyaWdodCAyMDExLTIwMTQgVGlsZGUgSW5jLiBhbmQgY29udHJpYnV0b3Jz LgogKiAgICAgICAgICAgIFBvcnRpb25zIENvcHlyaWdodCAyMDExIExpdmlu Z1NvY2lhbCBJbmMuCiAqIEBsaWNlbnNlICAgTGljZW5zZWQgdW5kZXIgTUlU IGxpY2Vuc2UgKHNlZSBsaWNlbnNlLmpzKQogKiBAdmVyc2lvbiAgIDEuMC4w LWJldGEuNytjYW5hcnkuM2NlNWUwZTUKICovCihmdW5jdGlvbihnbG9iYWwp IHsKdmFyIGRlZmluZSwgcmVxdWlyZU1vZHVsZSwgcmVxdWlyZSwgcmVxdWly ZWpzOwoKKGZ1bmN0aW9uKCkgewogIHZhciByZWdpc3RyeSA9IHt9LCBzZWVu ID0ge307CgogIGRlZmluZSA9IGZ1bmN0aW9uKG5hbWUsIGRlcHMsIGNhbGxi YWNrKSB7CiAgICByZWdpc3RyeVtuYW1lXSA9IHsgZGVwczogZGVwcywgY2Fs bGJhY2s6IGNhbGxiYWNrIH07CiAgfTsKCiAgcmVxdWlyZWpzID0gcmVxdWly ZSA9IHJlcXVpcmVNb2R1bGUgPSBmdW5jdGlvbihuYW1lKSB7CiAgcmVxdWly ZWpzLl9lYWtfc2VlbiA9IHJlZ2lzdHJ5OwoKICAgIGlmIChzZWVuW25hbWVd KSB7IHJldHVybiBzZWVuW25hbWVdOyB9CiAgICBzZWVuW25hbWVdID0ge307 CgogICAgaWYgKCFyZWdpc3RyeVtuYW1lXSkgewogICAgICB0aHJvdyBuZXcg RXJyb3IoIkNvdWxkIG5vdCBmaW5kIG1vZHVsZSAiICsgbmFtZSk7CiAgICB9 CgogICAgdmFyIG1vZCA9IHJlZ2lzdHJ5W25hbWVdLAogICAgICAgIGRlcHMg PSBtb2QuZGVwcywKICAgICAgICBjYWxsYmFjayA9IG1vZC5jYWxsYmFjaywK ICAgICAgICByZWlmaWVkID0gW10sCiAgICAgICAgZXhwb3J0czsKCiAgICBm b3IgKHZhciBpPTAsIGw9ZGVwcy5sZW5ndGg7IGk8bDsgaSsrKSB7CiAgICAg IGlmIChkZXBzW2ldID09PSAnZXhwb3J0cycpIHsKICAgICAgICByZWlmaWVk LnB1c2goZXhwb3J0cyA9IHt9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBy ZWlmaWVkLnB1c2gocmVxdWlyZU1vZHVsZShyZXNvbHZlKGRlcHNbaV0pKSk7 CiAgICAgIH0KICAgIH0KCiAgICB2YXIgdmFsdWUgPSBjYWxsYmFjay5hcHBs eSh0aGlzLCByZWlmaWVkKTsKICAgIHJldHVybiBzZWVuW25hbWVdID0gZXhw b3J0cyB8fCB2YWx1ZTsKCiAgICBmdW5jdGlvbiByZXNvbHZlKGNoaWxkKSB7 CiAgICAgIGlmIChjaGlsZC5jaGFyQXQoMCkgIT09ICcuJykgeyByZXR1cm4g Y2hpbGQ7IH0KICAgICAgdmFyIHBhcnRzID0gY2hpbGQuc3BsaXQoIi8iKTsK ICAgICAgdmFyIHBhcmVudEJhc2UgPSBuYW1lLnNwbGl0KCIvIikuc2xpY2Uo MCwgLTEpOwoKICAgICAgZm9yICh2YXIgaT0wLCBsPXBhcnRzLmxlbmd0aDsg aTxsOyBpKyspIHsKICAgICAgICB2YXIgcGFydCA9IHBhcnRzW2ldOwoKICAg ICAgICBpZiAocGFydCA9PT0gJy4uJykgeyBwYXJlbnRCYXNlLnBvcCgpOyB9 CiAgICAgICAgZWxzZSBpZiAocGFydCA9PT0gJy4nKSB7IGNvbnRpbnVlOyB9 CiAgICAgICAgZWxzZSB7IHBhcmVudEJhc2UucHVzaChwYXJ0KTsgfQogICAg ICB9CgogICAgICByZXR1cm4gcGFyZW50QmFzZS5qb2luKCIvIik7CiAgICB9 CiAgfTsKfSkoKTsKCmRlZmluZSgiYWN0aXZlbW9kZWwtYWRhcHRlci9saWIv aW5pdGlhbGl6ZXJzIiwgCiAgWyIuLi8uLi9lbWJlci1kYXRhL2xpYi9zeXN0 ZW0vY29udGFpbmVyX3Byb3h5IiwiLi9zeXN0ZW0vYWN0aXZlX21vZGVsX3Nl cmlhbGl6ZXIiLCIuL3N5c3RlbS9hY3RpdmVfbW9kZWxfYWRhcHRlciJdLAog IGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19kZXBlbmRlbmN5Ml9fLCBf X2RlcGVuZGVuY3kzX18pIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBD b250YWluZXJQcm94eSA9IF9fZGVwZW5kZW5jeTFfX1siZGVmYXVsdCJdOwog ICAgdmFyIEFjdGl2ZU1vZGVsU2VyaWFsaXplciA9IF9fZGVwZW5kZW5jeTJf X1siZGVmYXVsdCJdOwogICAgdmFyIEFjdGl2ZU1vZGVsQWRhcHRlciA9IF9f ZGVwZW5kZW5jeTNfX1siZGVmYXVsdCJdOwoKICAgIEVtYmVyLm9uTG9hZCgn RW1iZXIuQXBwbGljYXRpb24nLCBmdW5jdGlvbihBcHBsaWNhdGlvbikgewog ICAgICBBcHBsaWNhdGlvbi5pbml0aWFsaXplcih7CiAgICAgICAgbmFtZTog ImFjdGl2ZU1vZGVsQWRhcHRlciIsCgogICAgICAgIGluaXRpYWxpemU6IGZ1 bmN0aW9uKGNvbnRhaW5lciwgYXBwbGljYXRpb24pIHsKICAgICAgICAgIHZh ciBwcm94eSA9IG5ldyBDb250YWluZXJQcm94eShjb250YWluZXIpOwogICAg ICAgICAgcHJveHkucmVnaXN0ZXJEZXByZWNhdGlvbnMoWwogICAgICAgICAg ICB7ZGVwcmVjYXRlZDogJ3NlcmlhbGl6ZXI6X2FtcycsICB2YWxpZDogJ3Nl cmlhbGl6ZXI6LWFjdGl2ZS1tb2RlbCd9LAogICAgICAgICAgICB7ZGVwcmVj YXRlZDogJ2FkYXB0ZXI6X2FtcycsICAgICB2YWxpZDogJ2FkYXB0ZXI6LWFj dGl2ZS1tb2RlbCd9CiAgICAgICAgICBdKTsKCiAgICAgICAgICBhcHBsaWNh dGlvbi5yZWdpc3Rlcignc2VyaWFsaXplcjotYWN0aXZlLW1vZGVsJywgQWN0 aXZlTW9kZWxTZXJpYWxpemVyKTsKICAgICAgICAgIGFwcGxpY2F0aW9uLnJl Z2lzdGVyKCdhZGFwdGVyOi1hY3RpdmUtbW9kZWwnLCBBY3RpdmVNb2RlbEFk YXB0ZXIpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICB9KTsKZGVm aW5lKCJhY3RpdmVtb2RlbC1hZGFwdGVyL2xpYi9tYWluIiwgCiAgWyIuL3N5 c3RlbSIsIi4vaW5pdGlhbGl6ZXJzIiwiZXhwb3J0cyJdLAogIGZ1bmN0aW9u KF9fZGVwZW5kZW5jeTFfXywgX19kZXBlbmRlbmN5Ml9fLCBfX2V4cG9ydHNf XykgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIEFjdGl2ZU1vZGVsQWRh cHRlciA9IF9fZGVwZW5kZW5jeTFfXy5BY3RpdmVNb2RlbEFkYXB0ZXI7CiAg ICB2YXIgQWN0aXZlTW9kZWxTZXJpYWxpemVyID0gX19kZXBlbmRlbmN5MV9f LkFjdGl2ZU1vZGVsU2VyaWFsaXplcjsKICAgIHZhciBFbWJlZGRlZFJlY29y ZHNNaXhpbiA9IF9fZGVwZW5kZW5jeTFfXy5FbWJlZGRlZFJlY29yZHNNaXhp bjsKCgogICAgX19leHBvcnRzX18uQWN0aXZlTW9kZWxBZGFwdGVyID0gQWN0 aXZlTW9kZWxBZGFwdGVyOwogICAgX19leHBvcnRzX18uQWN0aXZlTW9kZWxT ZXJpYWxpemVyID0gQWN0aXZlTW9kZWxTZXJpYWxpemVyOwogICAgX19leHBv cnRzX18uRW1iZWRkZWRSZWNvcmRzTWl4aW4gPSBFbWJlZGRlZFJlY29yZHNN aXhpbjsKICB9KTsKZGVmaW5lKCJhY3RpdmVtb2RlbC1hZGFwdGVyL2xpYi9z eXN0ZW0iLCAKICBbIi4vc3lzdGVtL2VtYmVkZGVkX3JlY29yZHNfbWl4aW4i LCIuL3N5c3RlbS9hY3RpdmVfbW9kZWxfYWRhcHRlciIsIi4vc3lzdGVtL2Fj dGl2ZV9tb2RlbF9zZXJpYWxpemVyIiwiZXhwb3J0cyJdLAogIGZ1bmN0aW9u KF9fZGVwZW5kZW5jeTFfXywgX19kZXBlbmRlbmN5Ml9fLCBfX2RlcGVuZGVu Y3kzX18sIF9fZXhwb3J0c19fKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2 YXIgRW1iZWRkZWRSZWNvcmRzTWl4aW4gPSBfX2RlcGVuZGVuY3kxX19bImRl ZmF1bHQiXTsKICAgIHZhciBBY3RpdmVNb2RlbEFkYXB0ZXIgPSBfX2RlcGVu ZGVuY3kyX19bImRlZmF1bHQiXTsKICAgIHZhciBBY3RpdmVNb2RlbFNlcmlh bGl6ZXIgPSBfX2RlcGVuZGVuY3kzX19bImRlZmF1bHQiXTsKCiAgICBfX2V4 cG9ydHNfXy5FbWJlZGRlZFJlY29yZHNNaXhpbiA9IEVtYmVkZGVkUmVjb3Jk c01peGluOwogICAgX19leHBvcnRzX18uQWN0aXZlTW9kZWxBZGFwdGVyID0g QWN0aXZlTW9kZWxBZGFwdGVyOwogICAgX19leHBvcnRzX18uQWN0aXZlTW9k ZWxTZXJpYWxpemVyID0gQWN0aXZlTW9kZWxTZXJpYWxpemVyOwogIH0pOwpk ZWZpbmUoImFjdGl2ZW1vZGVsLWFkYXB0ZXIvbGliL3N5c3RlbS9hY3RpdmVf bW9kZWxfYWRhcHRlciIsIAogIFsiLi4vLi4vLi4vZW1iZXItZGF0YS9saWIv YWRhcHRlcnMiLCIuLi8uLi8uLi9lbWJlci1kYXRhL2xpYi9zeXN0ZW0vYWRh cHRlciIsIi4uLy4uLy4uL2VtYmVyLWluZmxlY3Rvci9saWIvbWFpbiIsIi4v YWN0aXZlX21vZGVsX3NlcmlhbGl6ZXIiLCIuL2VtYmVkZGVkX3JlY29yZHNf bWl4aW4iLCJleHBvcnRzIl0sCiAgZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9f LCBfX2RlcGVuZGVuY3kyX18sIF9fZGVwZW5kZW5jeTNfXywgX19kZXBlbmRl bmN5NF9fLCBfX2RlcGVuZGVuY3k1X18sIF9fZXhwb3J0c19fKSB7CiAgICAi dXNlIHN0cmljdCI7CiAgICB2YXIgUkVTVEFkYXB0ZXIgPSBfX2RlcGVuZGVu Y3kxX18uUkVTVEFkYXB0ZXI7CiAgICB2YXIgSW52YWxpZEVycm9yID0gX19k ZXBlbmRlbmN5Ml9fLkludmFsaWRFcnJvcjsKICAgIHZhciBwbHVyYWxpemUg PSBfX2RlcGVuZGVuY3kzX18ucGx1cmFsaXplOwogICAgdmFyIEFjdGl2ZU1v ZGVsU2VyaWFsaXplciA9IF9fZGVwZW5kZW5jeTRfX1siZGVmYXVsdCJdOwog ICAgdmFyIEVtYmVkZGVkUmVjb3Jkc01peGluID0gX19kZXBlbmRlbmN5NV9f WyJkZWZhdWx0Il07CgogICAgLyoqCiAgICAgIEBtb2R1bGUgZW1iZXItZGF0 YQogICAgKi8KCiAgICB2YXIgZm9yRWFjaCA9IEVtYmVyLkVudW1lcmFibGVV dGlscy5mb3JFYWNoOwogICAgdmFyIGRlY2FtZWxpemUgPSBFbWJlci5TdHJp bmcuZGVjYW1lbGl6ZSwKICAgICAgICB1bmRlcnNjb3JlID0gRW1iZXIuU3Ry aW5nLnVuZGVyc2NvcmU7CgogICAgLyoqCiAgICAgIFRoZSBBY3RpdmVNb2Rl bEFkYXB0ZXIgaXMgYSBzdWJjbGFzcyBvZiB0aGUgUkVTVEFkYXB0ZXIgZGVz aWduZWQgdG8gaW50ZWdyYXRlCiAgICAgIHdpdGggYSBKU09OIEFQSSB0aGF0 IHVzZXMgYW4gdW5kZXJzY29yZWQgbmFtaW5nIGNvbnZlbnRpb24gaW5zdGVh ZCBvZiBjYW1lbGNhc2luZy4KICAgICAgSXQgaGFzIGJlZW4gZGVzaWduZWQg dG8gd29yayBvdXQgb2YgdGhlIGJveCB3aXRoIHRoZQogICAgICBbYWN0aXZl X21vZGVsX3NlcmlhbGl6ZXJzXShodHRwOi8vZ2l0aHViLmNvbS9yYWlscy1h cGkvYWN0aXZlX21vZGVsX3NlcmlhbGl6ZXJzKQogICAgICBSdWJ5IGdlbS4K CiAgICAgIFRoaXMgYWRhcHRlciBleHRlbmRzIHRoZSBEUy5SRVNUQWRhcHRl ciBieSBtYWtpbmcgY29uc2lzdGVudCB1c2Ugb2YgdGhlIGNhbWVsaXphdGlv biwKICAgICAgZGVjYW1lbGl6YXRpb24gYW5kIHBsdXJhbGl6YXRpb24gbWV0 aG9kcyB0byBub3JtYWxpemUgdGhlIHNlcmlhbGl6ZWQgSlNPTiBpbnRvIGEK ICAgICAgZm9ybWF0IHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIGEgY29udmVu dGlvbmFsIFJhaWxzIGJhY2tlbmQgYW5kIEVtYmVyIERhdGEuCgogICAgICAj IyBKU09OIFN0cnVjdHVyZQoKICAgICAgVGhlIEFjdGl2ZU1vZGVsQWRhcHRl ciBleHBlY3RzIHRoZSBKU09OIHJldHVybmVkIGZyb20geW91ciBzZXJ2ZXIg dG8gZm9sbG93CiAgICAgIHRoZSBSRVNUIGFkYXB0ZXIgY29udmVudGlvbnMg c3Vic3RpdHV0aW5nIHVuZGVyc2NvcmVkIGtleXMgZm9yIGNhbWVsY2FzZWQg b25lcy4KCiAgICAgICMjIyBDb252ZW50aW9uYWwgTmFtZXMKCiAgICAgIEF0 dHJpYnV0ZSBuYW1lcyBpbiB5b3VyIEpTT04gcGF5bG9hZCBzaG91bGQgYmUg dGhlIHVuZGVyc2NvcmVkIHZlcnNpb25zIG9mCiAgICAgIHRoZSBhdHRyaWJ1 dGVzIGluIHlvdXIgRW1iZXIuanMgbW9kZWxzLgoKICAgICAgRm9yIGV4YW1w bGUsIGlmIHlvdSBoYXZlIGEgYFBlcnNvbmAgbW9kZWw6CgogICAgICBgYGBq cwogICAgICBBcHAuRmFtb3VzUGVyc29uID0gRFMuTW9kZWwuZXh0ZW5kKHsK ICAgICAgICBmaXJzdE5hbWU6IERTLmF0dHIoJ3N0cmluZycpLAogICAgICAg IGxhc3ROYW1lOiBEUy5hdHRyKCdzdHJpbmcnKSwKICAgICAgICBvY2N1cGF0 aW9uOiBEUy5hdHRyKCdzdHJpbmcnKQogICAgICB9KTsKICAgICAgYGBgCgog ICAgICBUaGUgSlNPTiByZXR1cm5lZCBzaG91bGQgbG9vayBsaWtlIHRoaXM6 CgogICAgICBgYGBqcwogICAgICB7CiAgICAgICAgImZhbW91c19wZXJzb24i OiB7CiAgICAgICAgICAiZmlyc3RfbmFtZSI6ICJCYXJhY2siLAogICAgICAg ICAgImxhc3RfbmFtZSI6ICJPYmFtYSIsCiAgICAgICAgICAib2NjdXBhdGlv biI6ICJQcmVzaWRlbnQiCiAgICAgICAgfQogICAgICB9CiAgICAgIGBgYAoK ICAgICAgQGNsYXNzIEFjdGl2ZU1vZGVsQWRhcHRlcgogICAgICBAY29uc3Ry dWN0b3IKICAgICAgQG5hbWVzcGFjZSBEUwogICAgICBAZXh0ZW5kcyBEUy5B ZGFwdGVyCiAgICAqKi8KCiAgICB2YXIgQWN0aXZlTW9kZWxBZGFwdGVyID0g UkVTVEFkYXB0ZXIuZXh0ZW5kKHsKICAgICAgZGVmYXVsdFNlcmlhbGl6ZXI6 ICctYWN0aXZlLW1vZGVsJywKICAgICAgLyoqCiAgICAgICAgVGhlIEFjdGl2 ZU1vZGVsQWRhcHRlciBvdmVycmlkZXMgdGhlIGBwYXRoRm9yVHlwZWAgbWV0 aG9kIHRvIGJ1aWxkCiAgICAgICAgdW5kZXJzY29yZWQgVVJMcyBieSBkZWNh bWVsaXppbmcgYW5kIHBsdXJhbGl6aW5nIHRoZSBvYmplY3QgdHlwZSBuYW1l LgoKICAgICAgICBgYGBqcwogICAgICAgICAgdGhpcy5wYXRoRm9yVHlwZSgi ZmFtb3VzUGVyc29uIik7CiAgICAgICAgICAvLz0+ICJmYW1vdXNfcGVvcGxl IgogICAgICAgIGBgYAoKICAgICAgICBAbWV0aG9kIHBhdGhGb3JUeXBlCiAg ICAgICAgQHBhcmFtIHtTdHJpbmd9IHR5cGUKICAgICAgICBAcmV0dXJucyBT dHJpbmcKICAgICAgKi8KICAgICAgcGF0aEZvclR5cGU6IGZ1bmN0aW9uKHR5 cGUpIHsKICAgICAgICB2YXIgZGVjYW1lbGl6ZWQgPSBkZWNhbWVsaXplKHR5 cGUpOwogICAgICAgIHZhciB1bmRlcnNjb3JlZCA9IHVuZGVyc2NvcmUoZGVj YW1lbGl6ZWQpOwogICAgICAgIHJldHVybiBwbHVyYWxpemUodW5kZXJzY29y ZWQpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAgVGhlIEFjdGl2ZU1v ZGVsQWRhcHRlciBvdmVycmlkZXMgdGhlIGBhamF4RXJyb3JgIG1ldGhvZAog ICAgICAgIHRvIHJldHVybiBhIERTLkludmFsaWRFcnJvciBmb3IgYWxsIDQy MiBVbnByb2Nlc3NhYmxlIEVudGl0eQogICAgICAgIHJlc3BvbnNlcy4KCiAg ICAgICAgQSA0MjIgSFRUUCByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgZ2Vu ZXJhbGx5IGltcGxpZXMgdGhhdCB0aGUgcmVxdWVzdAogICAgICAgIHdhcyB3 ZWxsIGZvcm1lZCBidXQgdGhlIEFQSSB3YXMgdW5hYmxlIHRvIHByb2Nlc3Mg aXQgYmVjYXVzZSB0aGUKICAgICAgICBjb250ZW50IHdhcyBub3Qgc2VtYW50 aWNhbGx5IGNvcnJlY3Qgb3IgbWVhbmluZ2Z1bCBwZXIgdGhlIEFQSS4KCiAg ICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gNDIyIEhUVFAgRXJyb3Ig Y29kZSBzZWUgMTEuMiBXZWJEQVYgUkZDIDQ5MTgKICAgICAgICBodHRwczov L3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDkxOCNzZWN0aW9uLTExLjIKCiAg ICAgICAgQG1ldGhvZCBhamF4RXJyb3IKICAgICAgICBAcGFyYW0ganFYSFIK ICAgICAgICBAcmV0dXJucyBlcnJvcgogICAgICAqLwogICAgICBhamF4RXJy b3I6IGZ1bmN0aW9uKGpxWEhSKSB7CiAgICAgICAgdmFyIGVycm9yID0gdGhp cy5fc3VwZXIoanFYSFIpOwoKICAgICAgICBpZiAoanFYSFIgJiYganFYSFIu c3RhdHVzID09PSA0MjIpIHsKICAgICAgICAgIHZhciByZXNwb25zZSA9IEVt YmVyLiQucGFyc2VKU09OKGpxWEhSLnJlc3BvbnNlVGV4dCksCiAgICAgICAg ICAgICAgZXJyb3JzID0ge307CgogICAgICAgICAgaWYgKHJlc3BvbnNlLmVy cm9ycyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIHZhciBqc29uRXJy b3JzID0gcmVzcG9uc2UuZXJyb3JzOwoKICAgICAgICAgICAgZm9yRWFjaChF bWJlci5rZXlzKGpzb25FcnJvcnMpLCBmdW5jdGlvbihrZXkpIHsKICAgICAg ICAgICAgICBlcnJvcnNbRW1iZXIuU3RyaW5nLmNhbWVsaXplKGtleSldID0g anNvbkVycm9yc1trZXldOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0K CiAgICAgICAgICByZXR1cm4gbmV3IEludmFsaWRFcnJvcihlcnJvcnMpOwog ICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gZXJyb3I7CiAgICAg ICAgfQogICAgICB9CiAgICB9KTsKCiAgICBfX2V4cG9ydHNfX1siZGVmYXVs dCJdID0gQWN0aXZlTW9kZWxBZGFwdGVyOwogIH0pOwpkZWZpbmUoImFjdGl2 ZW1vZGVsLWFkYXB0ZXIvbGliL3N5c3RlbS9hY3RpdmVfbW9kZWxfc2VyaWFs aXplciIsIAogIFsiLi4vLi4vLi4vZW1iZXItaW5mbGVjdG9yL2xpYi9tYWlu IiwiLi4vLi4vLi4vZW1iZXItZGF0YS9saWIvc2VyaWFsaXplcnMvcmVzdF9z ZXJpYWxpemVyIiwiZXhwb3J0cyJdLAogIGZ1bmN0aW9uKF9fZGVwZW5kZW5j eTFfXywgX19kZXBlbmRlbmN5Ml9fLCBfX2V4cG9ydHNfXykgewogICAgInVz ZSBzdHJpY3QiOwogICAgdmFyIHNpbmd1bGFyaXplID0gX19kZXBlbmRlbmN5 MV9fLnNpbmd1bGFyaXplOwogICAgdmFyIFJFU1RTZXJpYWxpemVyID0gX19k ZXBlbmRlbmN5Ml9fWyJkZWZhdWx0Il07CiAgICAvKioKICAgICAgQG1vZHVs ZSBlbWJlci1kYXRhCiAgICAqLwoKICAgIHZhciBnZXQgPSBFbWJlci5nZXQs CiAgICAgICAgZm9yRWFjaCA9IEVtYmVyLkVudW1lcmFibGVVdGlscy5mb3JF YWNoLAogICAgICAgIGNhbWVsaXplID0gICBFbWJlci5TdHJpbmcuY2FtZWxp emUsCiAgICAgICAgY2FwaXRhbGl6ZSA9IEVtYmVyLlN0cmluZy5jYXBpdGFs aXplLAogICAgICAgIGRlY2FtZWxpemUgPSBFbWJlci5TdHJpbmcuZGVjYW1l bGl6ZSwKICAgICAgICB1bmRlcnNjb3JlID0gRW1iZXIuU3RyaW5nLnVuZGVy c2NvcmU7CgogICAgdmFyIEFjdGl2ZU1vZGVsU2VyaWFsaXplciA9IFJFU1RT ZXJpYWxpemVyLmV4dGVuZCh7CiAgICAgIC8vIFNFUklBTElaRQoKICAgICAg LyoqCiAgICAgICAgQ29udmVydHMgY2FtZWxjYXNlZCBhdHRyaWJ1dGVzIHRv IHVuZGVyc2NvcmVkIHdoZW4gc2VyaWFsaXppbmcuCgogICAgICAgIEBtZXRo b2Qga2V5Rm9yQXR0cmlidXRlCiAgICAgICAgQHBhcmFtIHtTdHJpbmd9IGF0 dHJpYnV0ZQogICAgICAgIEByZXR1cm5zIFN0cmluZwogICAgICAqLwogICAg ICBrZXlGb3JBdHRyaWJ1dGU6IGZ1bmN0aW9uKGF0dHIpIHsKICAgICAgICBy ZXR1cm4gZGVjYW1lbGl6ZShhdHRyKTsKICAgICAgfSwKCiAgICAgIC8qKgog ICAgICAgIFVuZGVyc2NvcmVzIHJlbGF0aW9uc2hpcCBuYW1lcyBhbmQgYXBw ZW5kcyAiX2lkIiBvciAiX2lkcyIgd2hlbiBzZXJpYWxpemluZwogICAgICAg IHJlbGF0aW9uc2hpcCBrZXlzLgoKICAgICAgICBAbWV0aG9kIGtleUZvclJl bGF0aW9uc2hpcAogICAgICAgIEBwYXJhbSB7U3RyaW5nfSBrZXkKICAgICAg ICBAcGFyYW0ge1N0cmluZ30ga2luZAogICAgICAgIEByZXR1cm5zIFN0cmlu ZwogICAgICAqLwogICAgICBrZXlGb3JSZWxhdGlvbnNoaXA6IGZ1bmN0aW9u KGtleSwga2luZCkgewogICAgICAgIGtleSA9IGRlY2FtZWxpemUoa2V5KTsK ICAgICAgICBpZiAoa2luZCA9PT0gImJlbG9uZ3NUbyIpIHsKICAgICAgICAg IHJldHVybiBrZXkgKyAiX2lkIjsKICAgICAgICB9IGVsc2UgaWYgKGtpbmQg PT09ICJoYXNNYW55IikgewogICAgICAgICAgcmV0dXJuIHNpbmd1bGFyaXpl KGtleSkgKyAiX2lkcyI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJl dHVybiBrZXk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAg ICAgRG9lcyBub3Qgc2VyaWFsaXplIGhhc01hbnkgcmVsYXRpb25zaGlwcyBi eSBkZWZhdWx0LgogICAgICAqLwogICAgICBzZXJpYWxpemVIYXNNYW55OiBF bWJlci5LLAoKICAgICAgLyoqCiAgICAgICAgVW5kZXJzY29yZXMgdGhlIEpT T04gcm9vdCBrZXlzIHdoZW4gc2VyaWFsaXppbmcuCgogICAgICAgIEBtZXRo b2Qgc2VyaWFsaXplSW50b0hhc2gKICAgICAgICBAcGFyYW0ge09iamVjdH0g aGFzaAogICAgICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5 cGUKICAgICAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKICAgICAgICBA cGFyYW0ge09iamVjdH0gb3B0aW9ucwogICAgICAqLwogICAgICBzZXJpYWxp emVJbnRvSGFzaDogZnVuY3Rpb24oZGF0YSwgdHlwZSwgcmVjb3JkLCBvcHRp b25zKSB7CiAgICAgICAgdmFyIHJvb3QgPSB1bmRlcnNjb3JlKGRlY2FtZWxp emUodHlwZS50eXBlS2V5KSk7CiAgICAgICAgZGF0YVtyb290XSA9IHRoaXMu c2VyaWFsaXplKHJlY29yZCwgb3B0aW9ucyk7CiAgICAgIH0sCgogICAgICAv KioKICAgICAgICBTZXJpYWxpemVzIGEgcG9seW1vcnBoaWMgdHlwZSBhcyBh IGZ1bGx5IGNhcGl0YWxpemVkIG1vZGVsIG5hbWUuCgogICAgICAgIEBtZXRo b2Qgc2VyaWFsaXplUG9seW1vcnBoaWNUeXBlCiAgICAgICAgQHBhcmFtIHtE Uy5Nb2RlbH0gcmVjb3JkCiAgICAgICAgQHBhcmFtIHtPYmplY3R9IGpzb24K ICAgICAgICBAcGFyYW0gcmVsYXRpb25zaGlwCiAgICAgICovCiAgICAgIHNl cmlhbGl6ZVBvbHltb3JwaGljVHlwZTogZnVuY3Rpb24ocmVjb3JkLCBqc29u LCByZWxhdGlvbnNoaXApIHsKICAgICAgICB2YXIga2V5ID0gcmVsYXRpb25z aGlwLmtleSwKICAgICAgICAgICAgYmVsb25nc1RvID0gZ2V0KHJlY29yZCwg a2V5KTsKICAgICAgICBrZXkgPSB0aGlzLmtleUZvckF0dHJpYnV0ZShrZXkp OwogICAgICAgIGpzb25ba2V5ICsgIl90eXBlIl0gPSBjYXBpdGFsaXplKGNh bWVsaXplKGJlbG9uZ3NUby5jb25zdHJ1Y3Rvci50eXBlS2V5KSk7CiAgICAg IH0sCgogICAgICAvLyBFWFRSQUNUCgogICAgICAvKioKICAgICAgICBFeHRy YWN0cyB0aGUgbW9kZWwgdHlwZUtleSBmcm9tIHVuZGVyc2NvcmVkIHJvb3Qg b2JqZWN0cy4KCiAgICAgICAgQG1ldGhvZCB0eXBlRm9yUm9vdAogICAgICAg IEBwYXJhbSB7U3RyaW5nfSByb290CiAgICAgICAgQHJldHVybnMgU3RyaW5n IHRoZSBtb2RlbCdzIHR5cGVLZXkKICAgICAgKi8KICAgICAgdHlwZUZvclJv b3Q6IGZ1bmN0aW9uKHJvb3QpIHsKICAgICAgICB2YXIgY2FtZWxpemVkID0g Y2FtZWxpemUocm9vdCk7CiAgICAgICAgcmV0dXJuIHNpbmd1bGFyaXplKGNh bWVsaXplZCk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICBBZGQgZXh0 cmEgc3RlcCB0byBgRFMuUkVTVFNlcmlhbGl6ZXIubm9ybWFsaXplYCBzbyBs aW5rcyBhcmUKICAgICAgICBub3JtYWxpemVkLgoKICAgICAgICBJZiB5b3Vy IHBheWxvYWQgbG9va3MgbGlrZSB0aGlzCgogICAgICAgIGBgYGpzCiAgICAg ICAgewogICAgICAgICAgInBvc3QiOiB7CiAgICAgICAgICAgICJpZCI6IDEs CiAgICAgICAgICAgICJ0aXRsZSI6ICJSYWlscyBpcyBvbWFrYXNlIiwKICAg ICAgICAgICAgImxpbmtzIjogeyAiZmxhZ2dlZF9jb21tZW50cyI6ICJhcGkv Y29tbWVudHMvZmxhZ2dlZCIgfQogICAgICAgICAgfQogICAgICAgIH0KICAg ICAgICBgYGAKICAgICAgICBUaGUgbm9ybWFsaXplZCB2ZXJzaW9uIHdvdWxk IGxvb2sgbGlrZSB0aGlzCgogICAgICAgIGBgYGpzCiAgICAgICAgewogICAg ICAgICAgInBvc3QiOiB7CiAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAg ICAgICJ0aXRsZSI6ICJSYWlscyBpcyBvbWFrYXNlIiwKICAgICAgICAgICAg ImxpbmtzIjogeyAiZmxhZ2dlZENvbW1lbnRzIjogImFwaS9jb21tZW50cy9m bGFnZ2VkIiB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGBgYAoK ICAgICAgICBAbWV0aG9kIG5vcm1hbGl6ZQogICAgICAgIEBwYXJhbSB7c3Vi Y2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKICAgICAgICBAcGFyYW0ge09iamVj dH0gaGFzaAogICAgICAgIEBwYXJhbSB7U3RyaW5nfSBwcm9wCiAgICAgICAg QHJldHVybnMgT2JqZWN0CiAgICAgICovCgogICAgICBub3JtYWxpemU6IGZ1 bmN0aW9uKHR5cGUsIGhhc2gsIHByb3ApIHsKICAgICAgICB0aGlzLm5vcm1h bGl6ZUxpbmtzKGhhc2gpOwoKICAgICAgICByZXR1cm4gdGhpcy5fc3VwZXIo dHlwZSwgaGFzaCwgcHJvcCk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAg ICBDb252ZXJ0IGBzbmFrZV9jYXNlZGAgbGlua3MgIHRvIGBjYW1lbENhc2Vg CgogICAgICAgIEBtZXRob2Qgbm9ybWFsaXplTGlua3MKICAgICAgICBAcGFy YW0ge09iamVjdH0gaGFzaAogICAgICAqLwoKICAgICAgbm9ybWFsaXplTGlu a3M6IGZ1bmN0aW9uKGRhdGEpewogICAgICAgIGlmIChkYXRhLmxpbmtzKSB7 CiAgICAgICAgICB2YXIgbGlua3MgPSBkYXRhLmxpbmtzOwoKICAgICAgICAg IGZvciAodmFyIGxpbmsgaW4gbGlua3MpIHsKICAgICAgICAgICAgdmFyIGNh bWVsaXplZExpbmsgPSBjYW1lbGl6ZShsaW5rKTsKCiAgICAgICAgICAgIGlm IChjYW1lbGl6ZWRMaW5rICE9PSBsaW5rKSB7CiAgICAgICAgICAgICAgbGlu a3NbY2FtZWxpemVkTGlua10gPSBsaW5rc1tsaW5rXTsKICAgICAgICAgICAg ICBkZWxldGUgbGlua3NbbGlua107CiAgICAgICAgICAgIH0KICAgICAgICAg IH0KICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICBOb3Jt YWxpemUgdGhlIHBvbHltb3JwaGljIHR5cGUgZnJvbSB0aGUgSlNPTi4KCiAg ICAgICAgTm9ybWFsaXplOgogICAgICAgIGBgYGpzCiAgICAgICAgICB7CiAg ICAgICAgICAgIGlkOiAiMSIKICAgICAgICAgICAgbWluaW9uOiB7IHR5cGU6 ICJldmlsX21pbmlvbiIsIGlkOiAiMTIifQogICAgICAgICAgfQogICAgICAg IGBgYAoKICAgICAgICBUbzoKICAgICAgICBgYGBqcwogICAgICAgICAgewog ICAgICAgICAgICBpZDogIjEiCiAgICAgICAgICAgIG1pbmlvbjogeyB0eXBl OiAiZXZpbE1pbmlvbiIsIGlkOiAiMTIifQogICAgICAgICAgfQogICAgICAg IGBgYAoKICAgICAgICBAbWV0aG9kIG5vcm1hbGl6ZVJlbGF0aW9uc2hpcHMK ICAgICAgICBAcHJpdmF0ZQogICAgICAqLwogICAgICBub3JtYWxpemVSZWxh dGlvbnNoaXBzOiBmdW5jdGlvbih0eXBlLCBoYXNoKSB7CiAgICAgICAgdmFy IHBheWxvYWRLZXksIHBheWxvYWQ7CgogICAgICAgIGlmICh0aGlzLmtleUZv clJlbGF0aW9uc2hpcCkgewogICAgICAgICAgdHlwZS5lYWNoUmVsYXRpb25z aGlwKGZ1bmN0aW9uKGtleSwgcmVsYXRpb25zaGlwKSB7CiAgICAgICAgICAg IGlmIChyZWxhdGlvbnNoaXAub3B0aW9ucy5wb2x5bW9ycGhpYykgewogICAg ICAgICAgICAgIHBheWxvYWRLZXkgPSB0aGlzLmtleUZvckF0dHJpYnV0ZShr ZXkpOwogICAgICAgICAgICAgIHBheWxvYWQgPSBoYXNoW3BheWxvYWRLZXld OwogICAgICAgICAgICAgIGlmIChwYXlsb2FkICYmIHBheWxvYWQudHlwZSkg ewogICAgICAgICAgICAgICAgcGF5bG9hZC50eXBlID0gdGhpcy50eXBlRm9y Um9vdChwYXlsb2FkLnR5cGUpOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAo cGF5bG9hZCAmJiByZWxhdGlvbnNoaXAua2luZCA9PT0gImhhc01hbnkiKSB7 CiAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgICAgICAg ICAgICBmb3JFYWNoKHBheWxvYWQsIGZ1bmN0aW9uKHNpbmdsZSkgewogICAg ICAgICAgICAgICAgICBzaW5nbGUudHlwZSA9IHNlbGYudHlwZUZvclJvb3Qo c2luZ2xlLnR5cGUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAg ICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHBheWxv YWRLZXkgPSB0aGlzLmtleUZvclJlbGF0aW9uc2hpcChrZXksIHJlbGF0aW9u c2hpcC5raW5kKTsKICAgICAgICAgICAgICBwYXlsb2FkID0gaGFzaFtwYXls b2FkS2V5XTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaGFzaFtrZXld ID0gcGF5bG9hZDsKCiAgICAgICAgICAgIGlmIChrZXkgIT09IHBheWxvYWRL ZXkpIHsKICAgICAgICAgICAgICBkZWxldGUgaGFzaFtwYXlsb2FkS2V5XTsK ICAgICAgICAgICAgfQogICAgICAgICAgfSwgdGhpcyk7CiAgICAgICAgfQog ICAgICB9CiAgICB9KTsKCiAgICBfX2V4cG9ydHNfX1siZGVmYXVsdCJdID0g QWN0aXZlTW9kZWxTZXJpYWxpemVyOwogIH0pOwpkZWZpbmUoImFjdGl2ZW1v ZGVsLWFkYXB0ZXIvbGliL3N5c3RlbS9lbWJlZGRlZF9yZWNvcmRzX21peGlu IiwgCiAgWyIuLi8uLi8uLi9lbWJlci1pbmZsZWN0b3IvbGliL21haW4iLCJl eHBvcnRzIl0sCiAgZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2V4cG9y dHNfXykgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIGdldCA9IEVtYmVy LmdldDsKICAgIHZhciBmb3JFYWNoID0gRW1iZXIuRW51bWVyYWJsZVV0aWxz LmZvckVhY2g7CgogICAgdmFyIHBsdXJhbGl6ZSA9IF9fZGVwZW5kZW5jeTFf Xy5wbHVyYWxpemU7CgogICAgLyoqCiAgICAgIFRoZSBFbWJlZGRlZFJlY29y ZHNNaXhpbiBhbGxvd3MgeW91IHRvIGFkZCBlbWJlZGRlZCByZWNvcmQgc3Vw cG9ydCB0byB5b3VyCiAgICAgIHNlcmlhbGl6ZXJzLgogICAgICBUbyBzZXQg dXAgZW1iZWRkZWQgcmVjb3JkcywgeW91IGluY2x1ZGUgdGhlIG1peGluIGlu dG8gdGhlIHNlcmlhbGl6ZXIgYW5kIHRoZW4KICAgICAgZGVmaW5lIHlvdXIg ZW1iZWRkZWQgcmVsYXRpb25zLgoKICAgICAgYGBganMKICAgICAgQXBwLlBv c3RTZXJpYWxpemVyID0gRFMuQWN0aXZlTW9kZWxTZXJpYWxpemVyLmV4dGVu ZChEUy5FbWJlZGRlZFJlY29yZHNNaXhpbiwgewogICAgICAgIGF0dHJzOiB7 CiAgICAgICAgICBjb21tZW50czoge2VtYmVkZGVkOiAnYWx3YXlzJ30KICAg ICAgICB9CiAgICAgIH0pCiAgICAgIGBgYAoKICAgICAgQ3VycmVudGx5IG9u bHkgYHtlbWJlZGRlZDogJ2Fsd2F5cyd9YCByZWNvcmRzIGFyZSBzdXBwb3J0 ZWQuCgogICAgICBAY2xhc3MgRW1iZWRkZWRSZWNvcmRzTWl4aW4KICAgICAg QG5hbWVzcGFjZSBEUwogICAgKi8KICAgIHZhciBFbWJlZGRlZFJlY29yZHNN aXhpbiA9IEVtYmVyLk1peGluLmNyZWF0ZSh7CgogICAgICAvKioKICAgICAg ICBTZXJpYWxpemUgaGFzLW1heSByZWxhdGlvbnNoaXAgd2hlbiBpdCBpcyBj b25maWd1cmVkIGFzIGVtYmVkZGVkIG9iamVjdHMuCgogICAgICAgIEBtZXRo b2Qgc2VyaWFsaXplSGFzTWFueQogICAgICAqLwogICAgICBzZXJpYWxpemVI YXNNYW55OiBmdW5jdGlvbihyZWNvcmQsIGpzb24sIHJlbGF0aW9uc2hpcCkg ewogICAgICAgIHZhciBrZXkgICA9IHJlbGF0aW9uc2hpcC5rZXksCiAgICAg ICAgICAgIGF0dHJzID0gZ2V0KHRoaXMsICdhdHRycycpLAogICAgICAgICAg ICBlbWJlZCA9IGF0dHJzICYmIGF0dHJzW2tleV0gJiYgYXR0cnNba2V5XS5l bWJlZGRlZCA9PT0gJ2Fsd2F5cyc7CgogICAgICAgIGlmIChlbWJlZCkgewog ICAgICAgICAganNvblt0aGlzLmtleUZvckF0dHJpYnV0ZShrZXkpXSA9IGdl dChyZWNvcmQsIGtleSkubWFwKGZ1bmN0aW9uKHJlbGF0aW9uKSB7CiAgICAg ICAgICAgIHZhciBkYXRhID0gcmVsYXRpb24uc2VyaWFsaXplKCksCiAgICAg ICAgICAgICAgICBwcmltYXJ5S2V5ID0gZ2V0KHRoaXMsICdwcmltYXJ5S2V5 Jyk7CgogICAgICAgICAgICBkYXRhW3ByaW1hcnlLZXldID0gZ2V0KHJlbGF0 aW9uLCBwcmltYXJ5S2V5KTsKCiAgICAgICAgICAgIHJldHVybiBkYXRhOwog ICAgICAgICAgfSwgdGhpcyk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAg LyoqCiAgICAgICAgRXh0cmFjdCBlbWJlZGRlZCBvYmplY3RzIG91dCBvZiB0 aGUgcGF5bG9hZCBmb3IgYSBzaW5nbGUgb2JqZWN0CiAgICAgICAgYW5kIGFk ZCB0aGVtIGFzIHNpZGVsb2FkZWQgb2JqZWN0cyBpbnN0ZWFkLgoKICAgICAg ICBAbWV0aG9kIGV4dHJhY3RTaW5nbGUKICAgICAgKi8KICAgICAgZXh0cmFj dFNpbmdsZTogZnVuY3Rpb24oc3RvcmUsIHByaW1hcnlUeXBlLCBwYXlsb2Fk LCByZWNvcmRJZCwgcmVxdWVzdFR5cGUpIHsKICAgICAgICB2YXIgcm9vdCA9 IHRoaXMua2V5Rm9yQXR0cmlidXRlKHByaW1hcnlUeXBlLnR5cGVLZXkpLAog ICAgICAgICAgICBwYXJ0aWFsID0gcGF5bG9hZFtyb290XTsKCiAgICAgICAg dXBkYXRlUGF5bG9hZFdpdGhFbWJlZGRlZChzdG9yZSwgdGhpcywgcHJpbWFy eVR5cGUsIHBhcnRpYWwsIHBheWxvYWQpOwoKICAgICAgICByZXR1cm4gdGhp cy5fc3VwZXIoc3RvcmUsIHByaW1hcnlUeXBlLCBwYXlsb2FkLCByZWNvcmRJ ZCwgcmVxdWVzdFR5cGUpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAg RXh0cmFjdCBlbWJlZGRlZCBvYmplY3RzIG91dCBvZiBhIHN0YW5kYXJkIHBh eWxvYWQKICAgICAgICBhbmQgYWRkIHRoZW0gYXMgc2lkZWxvYWRlZCBvYmpl Y3RzIGluc3RlYWQuCgogICAgICAgIEBtZXRob2QgZXh0cmFjdEFycmF5CiAg ICAgICovCiAgICAgIGV4dHJhY3RBcnJheTogZnVuY3Rpb24oc3RvcmUsIHR5 cGUsIHBheWxvYWQpIHsKICAgICAgICB2YXIgcm9vdCA9IHRoaXMua2V5Rm9y QXR0cmlidXRlKHR5cGUudHlwZUtleSksCiAgICAgICAgICAgIHBhcnRpYWxz ID0gcGF5bG9hZFtwbHVyYWxpemUocm9vdCldOwoKICAgICAgICBmb3JFYWNo KHBhcnRpYWxzLCBmdW5jdGlvbihwYXJ0aWFsKSB7CiAgICAgICAgICB1cGRh dGVQYXlsb2FkV2l0aEVtYmVkZGVkKHN0b3JlLCB0aGlzLCB0eXBlLCBwYXJ0 aWFsLCBwYXlsb2FkKTsKICAgICAgICB9LCB0aGlzKTsKCiAgICAgICAgcmV0 dXJuIHRoaXMuX3N1cGVyKHN0b3JlLCB0eXBlLCBwYXlsb2FkKTsKICAgICAg fQogICAgfSk7CgogICAgZnVuY3Rpb24gdXBkYXRlUGF5bG9hZFdpdGhFbWJl ZGRlZChzdG9yZSwgc2VyaWFsaXplciwgdHlwZSwgcGFydGlhbCwgcGF5bG9h ZCkgewogICAgICB2YXIgYXR0cnMgPSBnZXQoc2VyaWFsaXplciwgJ2F0dHJz Jyk7CgogICAgICBpZiAoIWF0dHJzKSB7CiAgICAgICAgcmV0dXJuOwogICAg ICB9CgogICAgICB0eXBlLmVhY2hSZWxhdGlvbnNoaXAoZnVuY3Rpb24oa2V5 LCByZWxhdGlvbnNoaXApIHsKICAgICAgICB2YXIgZXhwYW5kZWRLZXksIGVt YmVkZGVkVHlwZUtleSwgYXR0cmlidXRlLCBpZHMsCiAgICAgICAgICAgIGNv bmZpZyA9IGF0dHJzW2tleV0sCiAgICAgICAgICAgIHNlcmlhbGl6ZXIgPSBz dG9yZS5zZXJpYWxpemVyRm9yKHJlbGF0aW9uc2hpcC50eXBlLnR5cGVLZXkp LAogICAgICAgICAgICBwcmltYXJ5S2V5ID0gZ2V0KHNlcmlhbGl6ZXIsICJw cmltYXJ5S2V5Iik7CgogICAgICAgIGlmIChyZWxhdGlvbnNoaXAua2luZCAh PT0gImhhc01hbnkiKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoK ICAgICAgICBpZiAoY29uZmlnICYmIChjb25maWcuZW1iZWRkZWQgPT09ICdh bHdheXMnIHx8IGNvbmZpZy5lbWJlZGRlZCA9PT0gJ2xvYWQnKSkgewogICAg ICAgICAgLy8gdW5kZXJzY29yZSBmb3JjZXMgdGhlIGVtYmVkZGVkIHJlY29y ZHMgdG8gYmUgc2lkZSBsb2FkZWQuCiAgICAgICAgICAvLyBpdCBpcyBuZWVk ZWQgd2hlbiBtYWluIHR5cGUgPT09IHJlbGF0aW9uc2hpcC50eXBlCiAgICAg ICAgICBlbWJlZGRlZFR5cGVLZXkgPSAnXycgKyBFbWJlci5TdHJpbmcucGx1 cmFsaXplKHJlbGF0aW9uc2hpcC50eXBlLnR5cGVLZXkpOwogICAgICAgICAg ZXhwYW5kZWRLZXkgPSB0aGlzLmtleUZvclJlbGF0aW9uc2hpcChrZXksIHJl bGF0aW9uc2hpcC5raW5kKTsKICAgICAgICAgIGF0dHJpYnV0ZSAgPSB0aGlz LmtleUZvckF0dHJpYnV0ZShrZXkpOwogICAgICAgICAgaWRzID0gW107Cgog ICAgICAgICAgaWYgKCFwYXJ0aWFsW2F0dHJpYnV0ZV0pIHsKICAgICAgICAg ICAgcmV0dXJuOwogICAgICAgICAgfQoKICAgICAgICAgIHBheWxvYWRbZW1i ZWRkZWRUeXBlS2V5XSA9IHBheWxvYWRbZW1iZWRkZWRUeXBlS2V5XSB8fCBb XTsKCiAgICAgICAgICBmb3JFYWNoKHBhcnRpYWxbYXR0cmlidXRlXSwgZnVu Y3Rpb24oZGF0YSkgewogICAgICAgICAgICB2YXIgZW1iZWRkZWRUeXBlID0g c3RvcmUubW9kZWxGb3IocmVsYXRpb25zaGlwLnR5cGUudHlwZUtleSk7CiAg ICAgICAgICAgIHVwZGF0ZVBheWxvYWRXaXRoRW1iZWRkZWQoc3RvcmUsIHNl cmlhbGl6ZXIsIGVtYmVkZGVkVHlwZSwgZGF0YSwgcGF5bG9hZCk7CiAgICAg ICAgICAgIGlkcy5wdXNoKGRhdGFbcHJpbWFyeUtleV0pOwogICAgICAgICAg ICBwYXlsb2FkW2VtYmVkZGVkVHlwZUtleV0ucHVzaChkYXRhKTsKICAgICAg ICAgIH0pOwoKICAgICAgICAgIHBhcnRpYWxbZXhwYW5kZWRLZXldID0gaWRz OwogICAgICAgICAgZGVsZXRlIHBhcnRpYWxbYXR0cmlidXRlXTsKICAgICAg ICB9CiAgICAgIH0sIHNlcmlhbGl6ZXIpOwogICAgfQoKICAgIF9fZXhwb3J0 c19fWyJkZWZhdWx0Il0gPSBFbWJlZGRlZFJlY29yZHNNaXhpbjsKICB9KTsK ZGVmaW5lKCJlbWJlci1kYXRhL2xpYi9hZGFwdGVycyIsIAogIFsiLi9hZGFw dGVycy9maXh0dXJlX2FkYXB0ZXIiLCIuL2FkYXB0ZXJzL3Jlc3RfYWRhcHRl ciIsImV4cG9ydHMiXSwKICBmdW5jdGlvbihfX2RlcGVuZGVuY3kxX18sIF9f ZGVwZW5kZW5jeTJfXywgX19leHBvcnRzX18pIHsKICAgICJ1c2Ugc3RyaWN0 IjsKICAgIC8qKgogICAgICBAbW9kdWxlIGVtYmVyLWRhdGEKICAgICovCgog ICAgdmFyIEZpeHR1cmVBZGFwdGVyID0gX19kZXBlbmRlbmN5MV9fWyJkZWZh dWx0Il07CiAgICB2YXIgUkVTVEFkYXB0ZXIgPSBfX2RlcGVuZGVuY3kyX19b ImRlZmF1bHQiXTsKCiAgICBfX2V4cG9ydHNfXy5SRVNUQWRhcHRlciA9IFJF U1RBZGFwdGVyOwogICAgX19leHBvcnRzX18uRml4dHVyZUFkYXB0ZXIgPSBG aXh0dXJlQWRhcHRlcjsKICB9KTsKZGVmaW5lKCJlbWJlci1kYXRhL2xpYi9h ZGFwdGVycy9maXh0dXJlX2FkYXB0ZXIiLCAKICBbIi4uL3N5c3RlbS9hZGFw dGVyIiwiZXhwb3J0cyJdLAogIGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywg X19leHBvcnRzX18pIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIC8qKgogICAg ICBAbW9kdWxlIGVtYmVyLWRhdGEKICAgICovCgogICAgdmFyIGdldCA9IEVt YmVyLmdldCwgZm10ID0gRW1iZXIuU3RyaW5nLmZtdCwKICAgICAgICBpbmRl eE9mID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmluZGV4T2Y7CgogICAgdmFy IGNvdW50ZXIgPSAwOwoKICAgIHZhciBBZGFwdGVyID0gX19kZXBlbmRlbmN5 MV9fWyJkZWZhdWx0Il07CgogICAgLyoqCiAgICAgIGBEUy5GaXh0dXJlQWRh cHRlcmAgaXMgYW4gYWRhcHRlciB0aGF0IGxvYWRzIHJlY29yZHMgZnJvbSBt ZW1vcnkuCiAgICAgIEl0cyBwcmltYXJpbHkgdXNlZCBmb3IgZGV2ZWxvcG1l bnQgYW5kIHRlc3RpbmcuIFlvdSBjYW4gYWxzbyB1c2UKICAgICAgYERTLkZp eHR1cmVBZGFwdGVyYCB3aGlsZSB3b3JraW5nIG9uIHRoZSBBUEkgYnV0IGFy ZSBub3QgcmVhZHkgdG8KICAgICAgaW50ZWdyYXRlIHlldC4gSXQgaXMgYSBm dWxseSBmdW5jdGlvbmluZyBhZGFwdGVyLiBBbGwgQ1JVRCBtZXRob2RzCiAg ICAgIGFyZSBpbXBsZW1lbnRlZC4gWW91IGNhbiBhbHNvIGltcGxlbWVudCBx dWVyeSBsb2dpYyB0aGF0IGEgcmVtb3RlCiAgICAgIHN5c3RlbSB3b3VsZCBk by4gSXRzIHBvc3NpYmxlIHRvIGRvIGRldmVsb3AgeW91ciBlbnRpcmUgYXBw bGljYXRpb24KICAgICAgd2l0aCBgRFMuRml4dHVyZUFkYXB0ZXJgLgoKICAg ICAgRm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byB1c2UgdGhlIGBGaXh0dXJl QWRhcHRlcmAgaW4geW91cgogICAgICBhcHBsaWNhdGlvbiBwbGVhc2Ugc2Vl IHRoZSBbRml4dHVyZUFkYXB0ZXIKICAgICAgZ3VpZGVdKC9ndWlkZXMvbW9k ZWxzL3RoZS1maXh0dXJlLWFkYXB0ZXIvKS4KCiAgICAgIEBjbGFzcyBGaXh0 dXJlQWRhcHRlcgogICAgICBAbmFtZXNwYWNlIERTCiAgICAgIEBleHRlbmRz IERTLkFkYXB0ZXIKICAgICovCiAgICB2YXIgRml4dHVyZUFkYXB0ZXIgPSBB ZGFwdGVyLmV4dGVuZCh7CiAgICAgIC8vIGJ5IGRlZmF1bHQsIGZpeHR1cmVz IGFyZSBhbHJlYWR5IGluIG5vcm1hbGl6ZWQgZm9ybQogICAgICBzZXJpYWxp emVyOiBudWxsLAoKICAgICAgLyoqCiAgICAgICAgSWYgYHNpbXVsYXRlUmVt b3RlUmVzcG9uc2VgIGlzIGB0cnVlYCB0aGUgYEZpeHR1cmVBZGFwdGVyYCB3 aWxsCiAgICAgICAgd2FpdCBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmVm b3JlIHJlc29sdmluZyBwcm9taXNlcyB3aXRoIHRoZQogICAgICAgIGZpeHR1 cmUgdmFsdWVzLiBUaGUgd2FpdCB0aW1lIGNhbiBiZSBjb25maWd1cmVkIHZp YSB0aGUgYGxhdGVuY3lgCiAgICAgICAgcHJvcGVydHkuCgogICAgICAgIEBw cm9wZXJ0eSBzaW11bGF0ZVJlbW90ZVJlc3BvbnNlCiAgICAgICAgQHR5cGUg e0Jvb2xlYW59CiAgICAgICAgQGRlZmF1bHQgdHJ1ZQogICAgICAqLwogICAg ICBzaW11bGF0ZVJlbW90ZVJlc3BvbnNlOiB0cnVlLAoKICAgICAgLyoqCiAg ICAgICAgQnkgZGVmYXVsdCB0aGUgYEZpeHR1cmVBZGFwdGVyYCB3aWxsIHNp bXVsYXRlIGEgd2FpdCBvZiB0aGUKICAgICAgICBgbGF0ZW5jeWAgbWlsbGlz ZWNvbmRzIGJlZm9yZSByZXNvbHZpbmcgcHJvbWlzZXMgd2l0aCB0aGUgZml4 dHVyZQogICAgICAgIHZhbHVlcy4gVGhpcyBiZWhhdmlvciBjYW4gYmUgdHVy bmVkIG9mZiB2aWEgdGhlCiAgICAgICAgYHNpbXVsYXRlUmVtb3RlUmVzcG9u c2VgIHByb3BlcnR5LgoKICAgICAgICBAcHJvcGVydHkgbGF0ZW5jeQogICAg ICAgIEB0eXBlIHtOdW1iZXJ9CiAgICAgICAgQGRlZmF1bHQgNTAKICAgICAg Ki8KICAgICAgbGF0ZW5jeTogNTAsCgogICAgICAvKioKICAgICAgICBJbXBs ZW1lbnQgdGhpcyBtZXRob2QgaW4gb3JkZXIgdG8gcHJvdmlkZSBkYXRhIGFz c29jaWF0ZWQgd2l0aCBhIHR5cGUKCiAgICAgICAgQG1ldGhvZCBmaXh0dXJl c0ZvclR5cGUKICAgICAgICBAcGFyYW0ge1N1YmNsYXNzIG9mIERTLk1vZGVs fSB0eXBlCiAgICAgICAgQHJldHVybiB7QXJyYXl9CiAgICAgICovCiAgICAg IGZpeHR1cmVzRm9yVHlwZTogZnVuY3Rpb24odHlwZSkgewogICAgICAgIGlm ICh0eXBlLkZJWFRVUkVTKSB7CiAgICAgICAgICB2YXIgZml4dHVyZXMgPSBF bWJlci5BKHR5cGUuRklYVFVSRVMpOwogICAgICAgICAgcmV0dXJuIGZpeHR1 cmVzLm1hcChmdW5jdGlvbihmaXh0dXJlKXsKICAgICAgICAgICAgdmFyIGZp eHR1cmVJZFR5cGUgPSB0eXBlb2YgZml4dHVyZS5pZDsKICAgICAgICAgICAg aWYoZml4dHVyZUlkVHlwZSAhPT0gIm51bWJlciIgJiYgZml4dHVyZUlkVHlw ZSAhPT0gInN0cmluZyIpewogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJv cihmbXQoJ3RoZSBpZCBwcm9wZXJ0eSBtdXN0IGJlIGRlZmluZWQgYXMgYSBu dW1iZXIgb3Igc3RyaW5nIGZvciBmaXh0dXJlICVAJywgW2ZpeHR1cmVdKSk7 CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZml4dHVyZS5pZCA9IGZpeHR1 cmUuaWQgKyAnJzsKICAgICAgICAgICAgcmV0dXJuIGZpeHR1cmU7CiAgICAg ICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAg IH0sCgogICAgICAvKioKICAgICAgICBJbXBsZW1lbnQgdGhpcyBtZXRob2Qg aW4gb3JkZXIgdG8gcXVlcnkgZml4dHVyZXMgZGF0YQoKICAgICAgICBAbWV0 aG9kIHF1ZXJ5Rml4dHVyZXMKICAgICAgICBAcGFyYW0ge0FycmF5fSBmaXh0 dXJlCiAgICAgICAgQHBhcmFtIHtPYmplY3R9IHF1ZXJ5CiAgICAgICAgQHBh cmFtIHtTdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQogICAgICAgIEByZXR1 cm4ge1Byb21pc2V8QXJyYXl9CiAgICAgICovCiAgICAgIHF1ZXJ5Rml4dHVy ZXM6IGZ1bmN0aW9uKGZpeHR1cmVzLCBxdWVyeSwgdHlwZSkgewogICAgICAg IEVtYmVyLmFzc2VydCgnTm90IGltcGxlbWVudGVkOiBZb3UgbXVzdCBvdmVy cmlkZSB0aGUgRFMuRml4dHVyZUFkYXB0ZXI6OnF1ZXJ5Rml4dHVyZXMgbWV0 aG9kIHRvIHN1cHBvcnQgcXVlcnlpbmcgdGhlIGZpeHR1cmUgc3RvcmUuJyk7 CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICBAbWV0aG9kIHVwZGF0ZUZp eHR1cmVzCiAgICAgICAgQHBhcmFtIHtTdWJjbGFzcyBvZiBEUy5Nb2RlbH0g dHlwZQogICAgICAgIEBwYXJhbSB7QXJyYXl9IGZpeHR1cmUKICAgICAgKi8K ICAgICAgdXBkYXRlRml4dHVyZXM6IGZ1bmN0aW9uKHR5cGUsIGZpeHR1cmUp IHsKICAgICAgICBpZighdHlwZS5GSVhUVVJFUykgewogICAgICAgICAgdHlw ZS5GSVhUVVJFUyA9IFtdOwogICAgICAgIH0KCiAgICAgICAgdmFyIGZpeHR1 cmVzID0gdHlwZS5GSVhUVVJFUzsKCiAgICAgICAgdGhpcy5kZWxldGVMb2Fk ZWRGaXh0dXJlKHR5cGUsIGZpeHR1cmUpOwoKICAgICAgICBmaXh0dXJlcy5w dXNoKGZpeHR1cmUpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAgSW1w bGVtZW50IHRoaXMgbWV0aG9kIGluIG9yZGVyIHRvIHByb3ZpZGUganNvbiBm b3IgQ1JVRCBtZXRob2RzCgogICAgICAgIEBtZXRob2QgbW9ja0pTT04KICAg ICAgICBAcGFyYW0ge1N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCiAgICAg ICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCiAgICAgICovCiAgICAgIG1v Y2tKU09OOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkKSB7CiAgICAg ICAgcmV0dXJuIHN0b3JlLnNlcmlhbGl6ZXJGb3IodHlwZSkuc2VyaWFsaXpl KHJlY29yZCwgeyBpbmNsdWRlSWQ6IHRydWUgfSk7CiAgICAgIH0sCgogICAg ICAvKioKICAgICAgICBAbWV0aG9kIGdlbmVyYXRlSWRGb3JSZWNvcmQKICAg ICAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQogICAgICAgIEBwYXJhbSB7 RFMuTW9kZWx9IHJlY29yZAogICAgICAgIEByZXR1cm4ge1N0cmluZ30gaWQK ICAgICAgKi8KICAgICAgZ2VuZXJhdGVJZEZvclJlY29yZDogZnVuY3Rpb24o c3RvcmUpIHsKICAgICAgICByZXR1cm4gImZpeHR1cmUtIiArIGNvdW50ZXIr KzsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgIEBtZXRob2QgZmluZAog ICAgICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCiAgICAgICAgQHBhcmFt IHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQogICAgICAgIEBwYXJhbSB7 U3RyaW5nfSBpZAogICAgICAgIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UK ICAgICAgKi8KICAgICAgZmluZDogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIGlk KSB7CiAgICAgICAgdmFyIGZpeHR1cmVzID0gdGhpcy5maXh0dXJlc0ZvclR5 cGUodHlwZSksCiAgICAgICAgICAgIGZpeHR1cmU7CgogICAgICAgIEVtYmVy LmFzc2VydCgiVW5hYmxlIHRvIGZpbmQgZml4dHVyZXMgZm9yIG1vZGVsIHR5 cGUgIit0eXBlLnRvU3RyaW5nKCksIGZpeHR1cmVzKTsKCiAgICAgICAgaWYg KGZpeHR1cmVzKSB7CiAgICAgICAgICBmaXh0dXJlID0gRW1iZXIuQShmaXh0 dXJlcykuZmluZFByb3BlcnR5KCdpZCcsIGlkKTsKICAgICAgICB9CgogICAg ICAgIGlmIChmaXh0dXJlKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5zaW11 bGF0ZVJlbW90ZUNhbGwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVy biBmaXh0dXJlOwogICAgICAgICAgfSwgdGhpcyk7CiAgICAgICAgfQogICAg ICB9LAoKICAgICAgLyoqCiAgICAgICAgQG1ldGhvZCBmaW5kTWFueQogICAg ICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCiAgICAgICAgQHBhcmFtIHtz dWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQogICAgICAgIEBwYXJhbSB7QXJy YXl9IGlkcwogICAgICAgIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UKICAg ICAgKi8KICAgICAgZmluZE1hbnk6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBp ZHMpIHsKICAgICAgICB2YXIgZml4dHVyZXMgPSB0aGlzLmZpeHR1cmVzRm9y VHlwZSh0eXBlKTsKCiAgICAgICAgRW1iZXIuYXNzZXJ0KCJVbmFibGUgdG8g ZmluZCBmaXh0dXJlcyBmb3IgbW9kZWwgdHlwZSAiK3R5cGUudG9TdHJpbmco KSwgZml4dHVyZXMpOwoKICAgICAgICBpZiAoZml4dHVyZXMpIHsKICAgICAg ICAgIGZpeHR1cmVzID0gZml4dHVyZXMuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0p IHsKICAgICAgICAgICAgcmV0dXJuIGluZGV4T2YoaWRzLCBpdGVtLmlkKSAh PT0gLTE7CiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIGlmIChm aXh0dXJlcykgewogICAgICAgICAgcmV0dXJuIHRoaXMuc2ltdWxhdGVSZW1v dGVDYWxsKGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gZml4dHVy ZXM7CiAgICAgICAgICB9LCB0aGlzKTsKICAgICAgICB9CiAgICAgIH0sCgog ICAgICAvKioKICAgICAgICBAcHJpdmF0ZQogICAgICAgIEBtZXRob2QgZmlu ZEFsbAogICAgICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCiAgICAgICAg QHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQogICAgICAgIEBw YXJhbSB7U3RyaW5nfSBzaW5jZVRva2VuCiAgICAgICAgQHJldHVybiB7UHJv bWlzZX0gcHJvbWlzZQogICAgICAqLwogICAgICBmaW5kQWxsOiBmdW5jdGlv bihzdG9yZSwgdHlwZSkgewogICAgICAgIHZhciBmaXh0dXJlcyA9IHRoaXMu Zml4dHVyZXNGb3JUeXBlKHR5cGUpOwoKICAgICAgICBFbWJlci5hc3NlcnQo IlVuYWJsZSB0byBmaW5kIGZpeHR1cmVzIGZvciBtb2RlbCB0eXBlICIrdHlw ZS50b1N0cmluZygpLCBmaXh0dXJlcyk7CgogICAgICAgIHJldHVybiB0aGlz LnNpbXVsYXRlUmVtb3RlQ2FsbChmdW5jdGlvbigpIHsKICAgICAgICAgIHJl dHVybiBmaXh0dXJlczsKICAgICAgICB9LCB0aGlzKTsKICAgICAgfSwKCiAg ICAgIC8qKgogICAgICAgIEBwcml2YXRlCiAgICAgICAgQG1ldGhvZCBmaW5k UXVlcnkKICAgICAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQogICAgICAg IEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKICAgICAgICBA cGFyYW0ge09iamVjdH0gcXVlcnkKICAgICAgICBAcGFyYW0ge0RTLkFkYXB0 ZXJQb3B1bGF0ZWRSZWNvcmRBcnJheX0gcmVjb3JkQXJyYXkKICAgICAgICBA cmV0dXJuIHtQcm9taXNlfSBwcm9taXNlCiAgICAgICovCiAgICAgIGZpbmRR dWVyeTogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHF1ZXJ5LCBhcnJheSkgewog ICAgICAgIHZhciBmaXh0dXJlcyA9IHRoaXMuZml4dHVyZXNGb3JUeXBlKHR5 cGUpOwoKICAgICAgICBFbWJlci5hc3NlcnQoIlVuYWJsZSB0byBmaW5kIGZp eHR1cmVzIGZvciBtb2RlbCB0eXBlICIgKyB0eXBlLnRvU3RyaW5nKCksIGZp eHR1cmVzKTsKCiAgICAgICAgZml4dHVyZXMgPSB0aGlzLnF1ZXJ5Rml4dHVy ZXMoZml4dHVyZXMsIHF1ZXJ5LCB0eXBlKTsKCiAgICAgICAgaWYgKGZpeHR1 cmVzKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5zaW11bGF0ZVJlbW90ZUNh bGwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBmaXh0dXJlczsK ICAgICAgICAgIH0sIHRoaXMpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAg IC8qKgogICAgICAgIEBtZXRob2QgY3JlYXRlUmVjb3JkCiAgICAgICAgQHBh cmFtIHtEUy5TdG9yZX0gc3RvcmUKICAgICAgICBAcGFyYW0ge3N1YmNsYXNz IG9mIERTLk1vZGVsfSB0eXBlCiAgICAgICAgQHBhcmFtIHtEUy5Nb2RlbH0g cmVjb3JkCiAgICAgICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZQogICAg ICAqLwogICAgICBjcmVhdGVSZWNvcmQ6IGZ1bmN0aW9uKHN0b3JlLCB0eXBl LCByZWNvcmQpIHsKICAgICAgICB2YXIgZml4dHVyZSA9IHRoaXMubW9ja0pT T04oc3RvcmUsIHR5cGUsIHJlY29yZCk7CgogICAgICAgIHRoaXMudXBkYXRl Rml4dHVyZXModHlwZSwgZml4dHVyZSk7CgogICAgICAgIHJldHVybiB0aGlz LnNpbXVsYXRlUmVtb3RlQ2FsbChmdW5jdGlvbigpIHsKICAgICAgICAgIHJl dHVybiBmaXh0dXJlOwogICAgICAgIH0sIHRoaXMpOwogICAgICB9LAoKICAg ICAgLyoqCiAgICAgICAgQG1ldGhvZCB1cGRhdGVSZWNvcmQKICAgICAgICBA cGFyYW0ge0RTLlN0b3JlfSBzdG9yZQogICAgICAgIEBwYXJhbSB7c3ViY2xh c3Mgb2YgRFMuTW9kZWx9IHR5cGUKICAgICAgICBAcGFyYW0ge0RTLk1vZGVs fSByZWNvcmQKICAgICAgICBAcmV0dXJuIHtQcm9taXNlfSBwcm9taXNlCiAg ICAgICovCiAgICAgIHVwZGF0ZVJlY29yZDogZnVuY3Rpb24oc3RvcmUsIHR5 cGUsIHJlY29yZCkgewogICAgICAgIHZhciBmaXh0dXJlID0gdGhpcy5tb2Nr SlNPTihzdG9yZSwgdHlwZSwgcmVjb3JkKTsKCiAgICAgICAgdGhpcy51cGRh dGVGaXh0dXJlcyh0eXBlLCBmaXh0dXJlKTsKCiAgICAgICAgcmV0dXJuIHRo aXMuc2ltdWxhdGVSZW1vdGVDYWxsKGZ1bmN0aW9uKCkgewogICAgICAgICAg cmV0dXJuIGZpeHR1cmU7CiAgICAgICAgfSwgdGhpcyk7CiAgICAgIH0sCgog ICAgICAvKioKICAgICAgICBAbWV0aG9kIGRlbGV0ZVJlY29yZAogICAgICAg IEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCiAgICAgICAgQHBhcmFtIHtzdWJj bGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQogICAgICAgIEBwYXJhbSB7RFMuTW9k ZWx9IHJlY29yZAogICAgICAgIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UK ICAgICAgKi8KICAgICAgZGVsZXRlUmVjb3JkOiBmdW5jdGlvbihzdG9yZSwg dHlwZSwgcmVjb3JkKSB7CiAgICAgICAgdmFyIGZpeHR1cmUgPSB0aGlzLm1v Y2tKU09OKHN0b3JlLCB0eXBlLCByZWNvcmQpOwoKICAgICAgICB0aGlzLmRl bGV0ZUxvYWRlZEZpeHR1cmUodHlwZSwgZml4dHVyZSk7CgogICAgICAgIHJl dHVybiB0aGlzLnNpbXVsYXRlUmVtb3RlQ2FsbChmdW5jdGlvbigpIHsKICAg ICAgICAgIC8vIG5vIHBheWxvYWQgaW4gYSBkZWxldGlvbgogICAgICAgICAg cmV0dXJuIG51bGw7CiAgICAgICAgfSk7CiAgICAgIH0sCgogICAgICAvKgog ICAgICAgIEBtZXRob2QgZGVsZXRlTG9hZGVkRml4dHVyZQogICAgICAgIEBw cml2YXRlCiAgICAgICAgQHBhcmFtIHR5cGUKICAgICAgICBAcGFyYW0gcmVj b3JkCiAgICAgICovCiAgICAgIGRlbGV0ZUxvYWRlZEZpeHR1cmU6IGZ1bmN0 aW9uKHR5cGUsIHJlY29yZCkgewogICAgICAgIHZhciBleGlzdGluZ0ZpeHR1 cmUgPSB0aGlzLmZpbmRFeGlzdGluZ0ZpeHR1cmUodHlwZSwgcmVjb3JkKTsK CiAgICAgICAgaWYoZXhpc3RpbmdGaXh0dXJlKSB7CiAgICAgICAgICB2YXIg aW5kZXggPSBpbmRleE9mKHR5cGUuRklYVFVSRVMsIGV4aXN0aW5nRml4dHVy ZSk7CiAgICAgICAgICB0eXBlLkZJWFRVUkVTLnNwbGljZShpbmRleCwgMSk7 CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0sCgog ICAgICAvKgogICAgICAgIEBtZXRob2QgZmluZEV4aXN0aW5nRml4dHVyZQog ICAgICAgIEBwcml2YXRlCiAgICAgICAgQHBhcmFtIHR5cGUKICAgICAgICBA cGFyYW0gcmVjb3JkCiAgICAgICovCiAgICAgIGZpbmRFeGlzdGluZ0ZpeHR1 cmU6IGZ1bmN0aW9uKHR5cGUsIHJlY29yZCkgewogICAgICAgIHZhciBmaXh0 dXJlcyA9IHRoaXMuZml4dHVyZXNGb3JUeXBlKHR5cGUpOwogICAgICAgIHZh ciBpZCA9IGdldChyZWNvcmQsICdpZCcpOwoKICAgICAgICByZXR1cm4gdGhp cy5maW5kRml4dHVyZUJ5SWQoZml4dHVyZXMsIGlkKTsKICAgICAgfSwKCiAg ICAgIC8qCiAgICAgICAgQG1ldGhvZCBmaW5kRml4dHVyZUJ5SWQKICAgICAg ICBAcHJpdmF0ZQogICAgICAgIEBwYXJhbSBmaXh0dXJlcwogICAgICAgIEBw YXJhbSBpZAogICAgICAqLwogICAgICBmaW5kRml4dHVyZUJ5SWQ6IGZ1bmN0 aW9uKGZpeHR1cmVzLCBpZCkgewogICAgICAgIHJldHVybiBFbWJlci5BKGZp eHR1cmVzKS5maW5kKGZ1bmN0aW9uKHIpIHsKICAgICAgICAgIGlmKCcnK2dl dChyLCAnaWQnKSA9PT0gJycraWQpIHsKICAgICAgICAgICAgcmV0dXJuIHRy dWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gZmFs c2U7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0sCgogICAgICAv KgogICAgICAgIEBtZXRob2Qgc2ltdWxhdGVSZW1vdGVDYWxsCiAgICAgICAg QHByaXZhdGUKICAgICAgICBAcGFyYW0gY2FsbGJhY2sKICAgICAgICBAcGFy YW0gY29udGV4dAogICAgICAqLwogICAgICBzaW11bGF0ZVJlbW90ZUNhbGw6 IGZ1bmN0aW9uKGNhbGxiYWNrLCBjb250ZXh0KSB7CiAgICAgICAgdmFyIGFk YXB0ZXIgPSB0aGlzOwoKICAgICAgICByZXR1cm4gbmV3IEVtYmVyLlJTVlAu UHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7CiAgICAgICAgICBpZiAoZ2V0 KGFkYXB0ZXIsICdzaW11bGF0ZVJlbW90ZVJlc3BvbnNlJykpIHsKICAgICAg ICAgICAgLy8gU2NoZWR1bGUgd2l0aCBzZXRUaW1lb3V0CiAgICAgICAgICAg IEVtYmVyLnJ1bi5sYXRlcihmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBy ZXNvbHZlKGNhbGxiYWNrLmNhbGwoY29udGV4dCkpOwogICAgICAgICAgICB9 LCBnZXQoYWRhcHRlciwgJ2xhdGVuY3knKSk7CiAgICAgICAgICB9IGVsc2Ug ewogICAgICAgICAgICAvLyBBc3luY2hyb25vdXMsIGJ1dCBhdCB0aGUgb2Yg dGhlIHJ1bmxvb3Agd2l0aCB6ZXJvIGxhdGVuY3kKICAgICAgICAgICAgRW1i ZXIucnVuLnNjaGVkdWxlKCdhY3Rpb25zJywgbnVsbCwgZnVuY3Rpb24oKSB7 CiAgICAgICAgICAgICAgcmVzb2x2ZShjYWxsYmFjay5jYWxsKGNvbnRleHQp KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfSwgIkRT OiBGaXh0dXJlQWRhcHRlciNzaW11bGF0ZVJlbW90ZUNhbGwiKTsKICAgICAg fQogICAgfSk7CgogICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9IEZpeHR1 cmVBZGFwdGVyOwogIH0pOwpkZWZpbmUoImVtYmVyLWRhdGEvbGliL2FkYXB0 ZXJzL3Jlc3RfYWRhcHRlciIsIAogIFsiLi4vc3lzdGVtL2FkYXB0ZXIiLCJl eHBvcnRzIl0sCiAgZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2V4cG9y dHNfXykgewogICAgInVzZSBzdHJpY3QiOwogICAgLyoqCiAgICAgIEBtb2R1 bGUgZW1iZXItZGF0YQogICAgKi8KCiAgICB2YXIgQWRhcHRlciA9IF9fZGVw ZW5kZW5jeTFfX1siZGVmYXVsdCJdOwogICAgdmFyIGdldCA9IEVtYmVyLmdl dCwgc2V0ID0gRW1iZXIuc2V0OwogICAgdmFyIGZvckVhY2ggPSBFbWJlci5B cnJheVBvbHlmaWxscy5mb3JFYWNoOwoKICAgIC8qKgogICAgICBUaGUgUkVT VCBhZGFwdGVyIGFsbG93cyB5b3VyIHN0b3JlIHRvIGNvbW11bmljYXRlIHdp dGggYW4gSFRUUCBzZXJ2ZXIgYnkKICAgICAgdHJhbnNtaXR0aW5nIEpTT04g dmlhIFhIUi4gTW9zdCBFbWJlci5qcyBhcHBzIHRoYXQgY29uc3VtZSBhIEpT T04gQVBJCiAgICAgIHNob3VsZCB1c2UgdGhlIFJFU1QgYWRhcHRlci4KCiAg ICAgIFRoaXMgYWRhcHRlciBpcyBkZXNpZ25lZCBhcm91bmQgdGhlIGlkZWEg dGhhdCB0aGUgSlNPTiBleGNoYW5nZWQgd2l0aAogICAgICB0aGUgc2VydmVy IHNob3VsZCBiZSBjb252ZW50aW9uYWwuCgogICAgICAjIyBKU09OIFN0cnVj dHVyZQoKICAgICAgVGhlIFJFU1QgYWRhcHRlciBleHBlY3RzIHRoZSBKU09O IHJldHVybmVkIGZyb20geW91ciBzZXJ2ZXIgdG8gZm9sbG93CiAgICAgIHRo ZXNlIGNvbnZlbnRpb25zLgoKICAgICAgIyMjIE9iamVjdCBSb290CgogICAg ICBUaGUgSlNPTiBwYXlsb2FkIHNob3VsZCBiZSBhbiBvYmplY3QgdGhhdCBj b250YWlucyB0aGUgcmVjb3JkIGluc2lkZSBhCiAgICAgIHJvb3QgcHJvcGVy dHkuIEZvciBleGFtcGxlLCBpbiByZXNwb25zZSB0byBhIGBHRVRgIHJlcXVl c3QgZm9yCiAgICAgIGAvcG9zdHMvMWAsIHRoZSBKU09OIHNob3VsZCBsb29r IGxpa2UgdGhpczoKCiAgICAgIGBgYGpzCiAgICAgIHsKICAgICAgICAicG9z dCI6IHsKICAgICAgICAgICJ0aXRsZSI6ICJJJ20gUnVubmluZyB0byBSZWZv cm0gdGhlIFczQydzIFRhZyIsCiAgICAgICAgICAiYXV0aG9yIjogIlllaHVk YSBLYXR6IgogICAgICAgIH0KICAgICAgfQogICAgICBgYGAKCiAgICAgICMj IyBDb252ZW50aW9uYWwgTmFtZXMKCiAgICAgIEF0dHJpYnV0ZSBuYW1lcyBp biB5b3VyIEpTT04gcGF5bG9hZCBzaG91bGQgYmUgdGhlIGNhbWVsQ2FzZWQg dmVyc2lvbnMgb2YKICAgICAgdGhlIGF0dHJpYnV0ZXMgaW4geW91ciBFbWJl ci5qcyBtb2RlbHMuCgogICAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUg YSBgUGVyc29uYCBtb2RlbDoKCiAgICAgIGBgYGpzCiAgICAgIEFwcC5QZXJz b24gPSBEUy5Nb2RlbC5leHRlbmQoewogICAgICAgIGZpcnN0TmFtZTogRFMu YXR0cignc3RyaW5nJyksCiAgICAgICAgbGFzdE5hbWU6IERTLmF0dHIoJ3N0 cmluZycpLAogICAgICAgIG9jY3VwYXRpb246IERTLmF0dHIoJ3N0cmluZycp CiAgICAgIH0pOwogICAgICBgYGAKCiAgICAgIFRoZSBKU09OIHJldHVybmVk IHNob3VsZCBsb29rIGxpa2UgdGhpczoKCiAgICAgIGBgYGpzCiAgICAgIHsK ICAgICAgICAicGVyc29uIjogewogICAgICAgICAgImZpcnN0TmFtZSI6ICJC YXJhY2siLAogICAgICAgICAgImxhc3ROYW1lIjogIk9iYW1hIiwKICAgICAg ICAgICJvY2N1cGF0aW9uIjogIlByZXNpZGVudCIKICAgICAgICB9CiAgICAg IH0KICAgICAgYGBgCgogICAgICAjIyBDdXN0b21pemF0aW9uCgogICAgICAj IyMgRW5kcG9pbnQgcGF0aCBjdXN0b21pemF0aW9uCgogICAgICBFbmRwb2lu dCBwYXRocyBjYW4gYmUgcHJlZml4ZWQgd2l0aCBhIGBuYW1lc3BhY2VgIGJ5 IHNldHRpbmcgdGhlIG5hbWVzcGFjZQogICAgICBwcm9wZXJ0eSBvbiB0aGUg YWRhcHRlcjoKCiAgICAgIGBgYGpzCiAgICAgIERTLlJFU1RBZGFwdGVyLnJl b3Blbih7CiAgICAgICAgbmFtZXNwYWNlOiAnYXBpLzEnCiAgICAgIH0pOwog ICAgICBgYGAKICAgICAgUmVxdWVzdHMgZm9yIGBBcHAuUGVyc29uYCB3b3Vs ZCBub3cgdGFyZ2V0IGAvYXBpLzEvcGVvcGxlLzFgLgoKICAgICAgIyMjIEhv c3QgY3VzdG9taXphdGlvbgoKICAgICAgQW4gYWRhcHRlciBjYW4gdGFyZ2V0 IG90aGVyIGhvc3RzIGJ5IHNldHRpbmcgdGhlIGBob3N0YCBwcm9wZXJ0eS4K CiAgICAgIGBgYGpzCiAgICAgIERTLlJFU1RBZGFwdGVyLnJlb3Blbih7CiAg ICAgICAgaG9zdDogJ2h0dHBzOi8vYXBpLmV4YW1wbGUuY29tJwogICAgICB9 KTsKICAgICAgYGBgCgogICAgICAjIyMgSGVhZGVycyBjdXN0b21pemF0aW9u CgogICAgICBTb21lIEFQSXMgcmVxdWlyZSBIVFRQIGhlYWRlcnMsIGUuZy4g dG8gcHJvdmlkZSBhbiBBUEkga2V5LiBBbiBhcnJheSBvZgogICAgICBoZWFk ZXJzIGNhbiBiZSBhZGRlZCB0byB0aGUgYWRhcHRlciB3aGljaCBhcmUgcGFz c2VkIHdpdGggZXZlcnkgcmVxdWVzdDoKCiAgICAgIGBgYGpzCiAgICAgIERT LlJFU1RBZGFwdGVyLnJlb3Blbih7CiAgICAgICAgaGVhZGVyczogewogICAg ICAgICAgIkFQSV9LRVkiOiAic2VjcmV0IGtleSIsCiAgICAgICAgICAiQU5P VEhFUl9IRUFERVIiOiAiU29tZSBoZWFkZXIgdmFsdWUiCiAgICAgICAgfQog ICAgICB9KTsKICAgICAgYGBgCgogICAgICBAY2xhc3MgUkVTVEFkYXB0ZXIK ICAgICAgQGNvbnN0cnVjdG9yCiAgICAgIEBuYW1lc3BhY2UgRFMKICAgICAg QGV4dGVuZHMgRFMuQWRhcHRlcgogICAgKi8KICAgIHZhciBSRVNUQWRhcHRl ciA9IEFkYXB0ZXIuZXh0ZW5kKHsKICAgICAgZGVmYXVsdFNlcmlhbGl6ZXI6 ICctcmVzdCcsCiAgICAgIC8qKgogICAgICAgIEVuZHBvaW50IHBhdGhzIGNh biBiZSBwcmVmaXhlZCB3aXRoIGEgYG5hbWVzcGFjZWAgYnkgc2V0dGluZyB0 aGUgbmFtZXNwYWNlCiAgICAgICAgcHJvcGVydHkgb24gdGhlIGFkYXB0ZXI6 CgogICAgICAgIGBgYGphdmFzY3JpcHQKICAgICAgICBEUy5SRVNUQWRhcHRl ci5yZW9wZW4oewogICAgICAgICAgbmFtZXNwYWNlOiAnYXBpLzEnCiAgICAg ICAgfSk7CiAgICAgICAgYGBgCgogICAgICAgIFJlcXVlc3RzIGZvciBgQXBw LlBvc3RgIHdvdWxkIG5vdyB0YXJnZXQgYC9hcGkvMS9wb3N0L2AuCgogICAg ICAgIEBwcm9wZXJ0eSBuYW1lc3BhY2UKICAgICAgICBAdHlwZSB7U3RyaW5n fQogICAgICAqLwoKICAgICAgLyoqCiAgICAgICAgQW4gYWRhcHRlciBjYW4g dGFyZ2V0IG90aGVyIGhvc3RzIGJ5IHNldHRpbmcgdGhlIGBob3N0YCBwcm9w ZXJ0eS4KCiAgICAgICAgYGBgamF2YXNjcmlwdAogICAgICAgIERTLlJFU1RB ZGFwdGVyLnJlb3Blbih7CiAgICAgICAgICBob3N0OiAnaHR0cHM6Ly9hcGku ZXhhbXBsZS5jb20nCiAgICAgICAgfSk7CiAgICAgICAgYGBgCgogICAgICAg IFJlcXVlc3RzIGZvciBgQXBwLlBvc3RgIHdvdWxkIG5vdyB0YXJnZXQgYGh0 dHBzOi8vYXBpLmV4YW1wbGUuY29tL3Bvc3QvYC4KCiAgICAgICAgQHByb3Bl cnR5IGhvc3QKICAgICAgICBAdHlwZSB7U3RyaW5nfQogICAgICAqLwoKICAg ICAgLyoqCiAgICAgICAgU29tZSBBUElzIHJlcXVpcmUgSFRUUCBoZWFkZXJz LCBlLmcuIHRvIHByb3ZpZGUgYW4gQVBJIGtleS4gQW4gYXJyYXkgb2YKICAg ICAgICBoZWFkZXJzIGNhbiBiZSBhZGRlZCB0byB0aGUgYWRhcHRlciB3aGlj aCBhcmUgcGFzc2VkIHdpdGggZXZlcnkgcmVxdWVzdDoKCiAgICAgICAgYGBg amF2YXNjcmlwdAogICAgICAgIERTLlJFU1RBZGFwdGVyLnJlb3Blbih7CiAg ICAgICAgICBoZWFkZXJzOiB7CiAgICAgICAgICAgICJBUElfS0VZIjogInNl Y3JldCBrZXkiLAogICAgICAgICAgICAiQU5PVEhFUl9IRUFERVIiOiAiU29t ZSBoZWFkZXIgdmFsdWUiCiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAg ICAgYGBgCgogICAgICAgIEBwcm9wZXJ0eSBoZWFkZXJzCiAgICAgICAgQHR5 cGUge09iamVjdH0KICAgICAgKi8KCiAgICAgIC8qKgogICAgICAgIENhbGxl ZCBieSB0aGUgc3RvcmUgaW4gb3JkZXIgdG8gZmV0Y2ggdGhlIEpTT04gZm9y IGEgZ2l2ZW4KICAgICAgICB0eXBlIGFuZCBJRC4KCiAgICAgICAgVGhlIGBm aW5kYCBtZXRob2QgbWFrZXMgYW4gQWpheCByZXF1ZXN0IHRvIGEgVVJMIGNv bXB1dGVkIGJ5IGBidWlsZFVSTGAsIGFuZCByZXR1cm5zIGEKICAgICAgICBw cm9taXNlIGZvciB0aGUgcmVzdWx0aW5nIHBheWxvYWQuCgogICAgICAgIFRo aXMgbWV0aG9kIHBlcmZvcm1zIGFuIEhUVFAgYEdFVGAgcmVxdWVzdCB3aXRo IHRoZSBpZCBwcm92aWRlZCBhcyBwYXJ0IG9mIHRoZSBxdWVyeSBzdHJpbmcu CgogICAgICAgIEBtZXRob2QgZmluZAogICAgICAgIEBwYXJhbSB7RFMuU3Rv cmV9IHN0b3JlCiAgICAgICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2Rl bH0gdHlwZQogICAgICAgIEBwYXJhbSB7U3RyaW5nfSBpZAogICAgICAgIEBy ZXR1cm5zIHtQcm9taXNlfSBwcm9taXNlCiAgICAgICovCiAgICAgIGZpbmQ6 IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBpZCkgewogICAgICAgIHJldHVybiB0 aGlzLmFqYXgodGhpcy5idWlsZFVSTCh0eXBlLnR5cGVLZXksIGlkKSwgJ0dF VCcpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAgQ2FsbGVkIGJ5IHRo ZSBzdG9yZSBpbiBvcmRlciB0byBmZXRjaCBhIEpTT04gYXJyYXkgZm9yIGFs bAogICAgICAgIG9mIHRoZSByZWNvcmRzIGZvciBhIGdpdmVuIHR5cGUuCgog ICAgICAgIFRoZSBgZmluZEFsbGAgbWV0aG9kIG1ha2VzIGFuIEFqYXggKEhU VFAgR0VUKSByZXF1ZXN0IHRvIGEgVVJMIGNvbXB1dGVkIGJ5IGBidWlsZFVS TGAsIGFuZCByZXR1cm5zIGEKICAgICAgICBwcm9taXNlIGZvciB0aGUgcmVz dWx0aW5nIHBheWxvYWQuCgogICAgICAgIEBwcml2YXRlCiAgICAgICAgQG1l dGhvZCBmaW5kQWxsCiAgICAgICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUK ICAgICAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCiAg ICAgICAgQHBhcmFtIHtTdHJpbmd9IHNpbmNlVG9rZW4KICAgICAgICBAcmV0 dXJucyB7UHJvbWlzZX0gcHJvbWlzZQogICAgICAqLwogICAgICBmaW5kQWxs OiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgc2luY2VUb2tlbikgewogICAgICAg IHZhciBxdWVyeTsKCiAgICAgICAgaWYgKHNpbmNlVG9rZW4pIHsKICAgICAg ICAgIHF1ZXJ5ID0geyBzaW5jZTogc2luY2VUb2tlbiB9OwogICAgICAgIH0K CiAgICAgICAgcmV0dXJuIHRoaXMuYWpheCh0aGlzLmJ1aWxkVVJMKHR5cGUu dHlwZUtleSksICdHRVQnLCB7IGRhdGE6IHF1ZXJ5IH0pOwogICAgICB9LAoK ICAgICAgLyoqCiAgICAgICAgQ2FsbGVkIGJ5IHRoZSBzdG9yZSBpbiBvcmRl ciB0byBmZXRjaCBhIEpTT04gYXJyYXkgZm9yCiAgICAgICAgdGhlIHJlY29y ZHMgdGhhdCBtYXRjaCBhIHBhcnRpY3VsYXIgcXVlcnkuCgogICAgICAgIFRo ZSBgZmluZFF1ZXJ5YCBtZXRob2QgbWFrZXMgYW4gQWpheCAoSFRUUCBHRVQp IHJlcXVlc3QgdG8gYSBVUkwgY29tcHV0ZWQgYnkgYGJ1aWxkVVJMYCwgYW5k IHJldHVybnMgYQogICAgICAgIHByb21pc2UgZm9yIHRoZSByZXN1bHRpbmcg cGF5bG9hZC4KCiAgICAgICAgVGhlIGBxdWVyeWAgYXJndW1lbnQgaXMgYSBz aW1wbGUgSmF2YVNjcmlwdCBvYmplY3QgdGhhdCB3aWxsIGJlIHBhc3NlZCBk aXJlY3RseQogICAgICAgIHRvIHRoZSBzZXJ2ZXIgYXMgcGFyYW1ldGVycy4K CiAgICAgICAgQHByaXZhdGUKICAgICAgICBAbWV0aG9kIGZpbmRRdWVyeQog ICAgICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCiAgICAgICAgQHBhcmFt IHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQogICAgICAgIEBwYXJhbSB7 T2JqZWN0fSBxdWVyeQogICAgICAgIEByZXR1cm5zIHtQcm9taXNlfSBwcm9t aXNlCiAgICAgICovCiAgICAgIGZpbmRRdWVyeTogZnVuY3Rpb24oc3RvcmUs IHR5cGUsIHF1ZXJ5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYWpheCh0aGlz LmJ1aWxkVVJMKHR5cGUudHlwZUtleSksICdHRVQnLCB7IGRhdGE6IHF1ZXJ5 IH0pOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAgQ2FsbGVkIGJ5IHRo ZSBzdG9yZSBpbiBvcmRlciB0byBmZXRjaCBhIEpTT04gYXJyYXkgZm9yCiAg ICAgICAgdGhlIHVubG9hZGVkIHJlY29yZHMgaW4gYSBoYXMtbWFueSByZWxh dGlvbnNoaXAgdGhhdCB3ZXJlIG9yaWdpbmFsbHkKICAgICAgICBzcGVjaWZp ZWQgYXMgSURzLgoKICAgICAgICBGb3IgZXhhbXBsZSwgaWYgdGhlIG9yaWdp bmFsIHBheWxvYWQgbG9va3MgbGlrZToKCiAgICAgICAgYGBganMKICAgICAg ICB7CiAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgInRpdGxlIjogIlJh aWxzIGlzIG9tYWthc2UiLAogICAgICAgICAgImNvbW1lbnRzIjogWyAxLCAy LCAzIF0KICAgICAgICB9CiAgICAgICAgYGBgCgogICAgICAgIFRoZSBJRHMg d2lsbCBiZSBwYXNzZWQgYXMgYSBVUkwtZW5jb2RlZCBBcnJheSBvZiBJRHMs IGluIHRoaXMgZm9ybToKCiAgICAgICAgYGBgCiAgICAgICAgaWRzW109MSZp ZHNbXT0yJmlkc1tdPTMKICAgICAgICBgYGAKCiAgICAgICAgTWFueSBzZXJ2 ZXJzLCBzdWNoIGFzIFJhaWxzIGFuZCBQSFAsIHdpbGwgYXV0b21hdGljYWxs eSBjb252ZXJ0IHRoaXMgVVJMLWVuY29kZWQgYXJyYXkKICAgICAgICBpbnRv IGFuIEFycmF5IGZvciB5b3Ugb24gdGhlIHNlcnZlci1zaWRlLiBJZiB5b3Ug d2FudCB0byBlbmNvZGUgdGhlCiAgICAgICAgSURzLCBkaWZmZXJlbnRseSwg anVzdCBvdmVycmlkZSB0aGlzIChvbmUtbGluZSkgbWV0aG9kLgoKICAgICAg ICBUaGUgYGZpbmRNYW55YCBtZXRob2QgbWFrZXMgYW4gQWpheCAoSFRUUCBH RVQpIHJlcXVlc3QgdG8gYSBVUkwgY29tcHV0ZWQgYnkgYGJ1aWxkVVJMYCwg YW5kIHJldHVybnMgYQogICAgICAgIHByb21pc2UgZm9yIHRoZSByZXN1bHRp bmcgcGF5bG9hZC4KCiAgICAgICAgQG1ldGhvZCBmaW5kTWFueQogICAgICAg IEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCiAgICAgICAgQHBhcmFtIHtzdWJj bGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQogICAgICAgIEBwYXJhbSB7QXJyYXl9 IGlkcwogICAgICAgIEByZXR1cm5zIHtQcm9taXNlfSBwcm9taXNlCiAgICAg ICovCiAgICAgIGZpbmRNYW55OiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgaWRz KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYWpheCh0aGlzLmJ1aWxkVVJMKHR5 cGUudHlwZUtleSksICdHRVQnLCB7IGRhdGE6IHsgaWRzOiBpZHMgfSB9KTsK ICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgIENhbGxlZCBieSB0aGUgc3Rv cmUgaW4gb3JkZXIgdG8gZmV0Y2ggYSBKU09OIGFycmF5IGZvcgogICAgICAg IHRoZSB1bmxvYWRlZCByZWNvcmRzIGluIGEgaGFzLW1hbnkgcmVsYXRpb25z aGlwIHRoYXQgd2VyZSBvcmlnaW5hbGx5CiAgICAgICAgc3BlY2lmaWVkIGFz IGEgVVJMIChpbnNpZGUgb2YgYGxpbmtzYCkuCgogICAgICAgIEZvciBleGFt cGxlLCBpZiB5b3VyIG9yaWdpbmFsIHBheWxvYWQgbG9va3MgbGlrZSB0aGlz OgoKICAgICAgICBgYGBqcwogICAgICAgIHsKICAgICAgICAgICJwb3N0Ijog ewogICAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgICAidGl0bGUiOiAi UmFpbHMgaXMgb21ha2FzZSIsCiAgICAgICAgICAgICJsaW5rcyI6IHsgImNv bW1lbnRzIjogIi9wb3N0cy8xL2NvbW1lbnRzIiB9CiAgICAgICAgICB9CiAg ICAgICAgfQogICAgICAgIGBgYAoKICAgICAgICBUaGlzIG1ldGhvZCB3aWxs IGJlIGNhbGxlZCB3aXRoIHRoZSBwYXJlbnQgcmVjb3JkIGFuZCBgL3Bvc3Rz LzEvY29tbWVudHNgLgoKICAgICAgICBUaGUgYGZpbmRIYXNNYW55YCBtZXRo b2Qgd2lsbCBtYWtlIGFuIEFqYXggKEhUVFAgR0VUKSByZXF1ZXN0IHRvIHRo ZSBvcmlnaW5hbGx5IHNwZWNpZmllZCBVUkwuCiAgICAgICAgSWYgdGhlIFVS TCBpcyBob3N0LXJlbGF0aXZlIChzdGFydGluZyB3aXRoIGEgc2luZ2xlIHNs YXNoKSwgdGhlCiAgICAgICAgcmVxdWVzdCB3aWxsIHVzZSB0aGUgaG9zdCBz cGVjaWZpZWQgb24gdGhlIGFkYXB0ZXIgKGlmIGFueSkuCgogICAgICAgIEBt ZXRob2QgZmluZEhhc01hbnkKICAgICAgICBAcGFyYW0ge0RTLlN0b3JlfSBz dG9yZQogICAgICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAogICAgICAg IEBwYXJhbSB7U3RyaW5nfSB1cmwKICAgICAgICBAcmV0dXJucyB7UHJvbWlz ZX0gcHJvbWlzZQogICAgICAqLwogICAgICBmaW5kSGFzTWFueTogZnVuY3Rp b24oc3RvcmUsIHJlY29yZCwgdXJsKSB7CiAgICAgICAgdmFyIGhvc3QgPSBn ZXQodGhpcywgJ2hvc3QnKSwKICAgICAgICAgICAgaWQgICA9IGdldChyZWNv cmQsICdpZCcpLAogICAgICAgICAgICB0eXBlID0gcmVjb3JkLmNvbnN0cnVj dG9yLnR5cGVLZXk7CgogICAgICAgIGlmIChob3N0ICYmIHVybC5jaGFyQXQo MCkgPT09ICcvJyAmJiB1cmwuY2hhckF0KDEpICE9PSAnLycpIHsKICAgICAg ICAgIHVybCA9IGhvc3QgKyB1cmw7CiAgICAgICAgfQoKICAgICAgICByZXR1 cm4gdGhpcy5hamF4KHRoaXMudXJsUHJlZml4KHVybCwgdGhpcy5idWlsZFVS TCh0eXBlLCBpZCkpLCAnR0VUJyk7CiAgICAgIH0sCgogICAgICAvKioKICAg ICAgICBDYWxsZWQgYnkgdGhlIHN0b3JlIGluIG9yZGVyIHRvIGZldGNoIGEg SlNPTiBhcnJheSBmb3IKICAgICAgICB0aGUgdW5sb2FkZWQgcmVjb3JkcyBp biBhIGJlbG9uZ3MtdG8gcmVsYXRpb25zaGlwIHRoYXQgd2VyZSBvcmlnaW5h bGx5CiAgICAgICAgc3BlY2lmaWVkIGFzIGEgVVJMIChpbnNpZGUgb2YgYGxp bmtzYCkuCgogICAgICAgIEZvciBleGFtcGxlLCBpZiB5b3VyIG9yaWdpbmFs IHBheWxvYWQgbG9va3MgbGlrZSB0aGlzOgoKICAgICAgICBgYGBqcwogICAg ICAgIHsKICAgICAgICAgICJwZXJzb24iOiB7CiAgICAgICAgICAgICJpZCI6 IDEsCiAgICAgICAgICAgICJuYW1lIjogIlRvbSBEYWxlIiwKICAgICAgICAg ICAgImxpbmtzIjogeyAiZ3JvdXAiOiAiL3Blb3BsZS8xL2dyb3VwIiB9CiAg ICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGBgYAoKICAgICAgICBUaGlz IG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBwYXJlbnQgcmVjb3Jk IGFuZCBgL3Blb3BsZS8xL2dyb3VwYC4KCiAgICAgICAgVGhlIGBmaW5kQmVs b25nc1RvYCBtZXRob2Qgd2lsbCBtYWtlIGFuIEFqYXggKEhUVFAgR0VUKSBy ZXF1ZXN0IHRvIHRoZSBvcmlnaW5hbGx5IHNwZWNpZmllZCBVUkwuCgogICAg ICAgIEBtZXRob2QgZmluZEJlbG9uZ3NUbwogICAgICAgIEBwYXJhbSB7RFMu U3RvcmV9IHN0b3JlCiAgICAgICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3Jk CiAgICAgICAgQHBhcmFtIHtTdHJpbmd9IHVybAogICAgICAgIEByZXR1cm5z IHtQcm9taXNlfSBwcm9taXNlCiAgICAgICovCiAgICAgIGZpbmRCZWxvbmdz VG86IGZ1bmN0aW9uKHN0b3JlLCByZWNvcmQsIHVybCkgewogICAgICAgIHZh ciBpZCAgID0gZ2V0KHJlY29yZCwgJ2lkJyksCiAgICAgICAgICAgIHR5cGUg PSByZWNvcmQuY29uc3RydWN0b3IudHlwZUtleTsKCiAgICAgICAgcmV0dXJu IHRoaXMuYWpheCh0aGlzLnVybFByZWZpeCh1cmwsIHRoaXMuYnVpbGRVUkwo dHlwZSwgaWQpKSwgJ0dFVCcpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAg ICAgQ2FsbGVkIGJ5IHRoZSBzdG9yZSB3aGVuIGEgbmV3bHkgY3JlYXRlZCBy ZWNvcmQgaXMKICAgICAgICBzYXZlZCB2aWEgdGhlIGBzYXZlYCBtZXRob2Qg b24gYSBtb2RlbCByZWNvcmQgaW5zdGFuY2UuCgogICAgICAgIFRoZSBgY3Jl YXRlUmVjb3JkYCBtZXRob2Qgc2VyaWFsaXplcyB0aGUgcmVjb3JkIGFuZCBt YWtlcyBhbiBBamF4IChIVFRQIFBPU1QpIHJlcXVlc3QKICAgICAgICB0byBh IFVSTCBjb21wdXRlZCBieSBgYnVpbGRVUkxgLgoKICAgICAgICBTZWUgYHNl cmlhbGl6ZWAgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjdXN0b21pemUg dGhlIHNlcmlhbGl6ZWQgZm9ybQogICAgICAgIG9mIGEgcmVjb3JkLgoKICAg ICAgICBAbWV0aG9kIGNyZWF0ZVJlY29yZAogICAgICAgIEBwYXJhbSB7RFMu U3RvcmV9IHN0b3JlCiAgICAgICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5N b2RlbH0gdHlwZQogICAgICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAog ICAgICAgIEByZXR1cm5zIHtQcm9taXNlfSBwcm9taXNlCiAgICAgICovCiAg ICAgIGNyZWF0ZVJlY29yZDogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHJlY29y ZCkgewogICAgICAgIHZhciBkYXRhID0ge307CiAgICAgICAgdmFyIHNlcmlh bGl6ZXIgPSBzdG9yZS5zZXJpYWxpemVyRm9yKHR5cGUudHlwZUtleSk7Cgog ICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplSW50b0hhc2goZGF0YSwgdHlw ZSwgcmVjb3JkLCB7IGluY2x1ZGVJZDogdHJ1ZSB9KTsKCiAgICAgICAgcmV0 dXJuIHRoaXMuYWpheCh0aGlzLmJ1aWxkVVJMKHR5cGUudHlwZUtleSksICJQ T1NUIiwgeyBkYXRhOiBkYXRhIH0pOwogICAgICB9LAoKICAgICAgLyoqCiAg ICAgICAgQ2FsbGVkIGJ5IHRoZSBzdG9yZSB3aGVuIGFuIGV4aXN0aW5nIHJl Y29yZCBpcyBzYXZlZAogICAgICAgIHZpYSB0aGUgYHNhdmVgIG1ldGhvZCBv biBhIG1vZGVsIHJlY29yZCBpbnN0YW5jZS4KCiAgICAgICAgVGhlIGB1cGRh dGVSZWNvcmRgIG1ldGhvZCBzZXJpYWxpemVzIHRoZSByZWNvcmQgYW5kIG1h a2VzIGFuIEFqYXggKEhUVFAgUFVUKSByZXF1ZXN0CiAgICAgICAgdG8gYSBV UkwgY29tcHV0ZWQgYnkgYGJ1aWxkVVJMYC4KCiAgICAgICAgU2VlIGBzZXJp YWxpemVgIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY3VzdG9taXplIHRo ZSBzZXJpYWxpemVkIGZvcm0KICAgICAgICBvZiBhIHJlY29yZC4KCiAgICAg ICAgQG1ldGhvZCB1cGRhdGVSZWNvcmQKICAgICAgICBAcGFyYW0ge0RTLlN0 b3JlfSBzdG9yZQogICAgICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9k ZWx9IHR5cGUKICAgICAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKICAg ICAgICBAcmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZQogICAgICAqLwogICAg ICB1cGRhdGVSZWNvcmQ6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCByZWNvcmQp IHsKICAgICAgICB2YXIgZGF0YSA9IHt9OwogICAgICAgIHZhciBzZXJpYWxp emVyID0gc3RvcmUuc2VyaWFsaXplckZvcih0eXBlLnR5cGVLZXkpOwoKICAg ICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZUludG9IYXNoKGRhdGEsIHR5cGUs IHJlY29yZCk7CgogICAgICAgIHZhciBpZCA9IGdldChyZWNvcmQsICdpZCcp OwoKICAgICAgICByZXR1cm4gdGhpcy5hamF4KHRoaXMuYnVpbGRVUkwodHlw ZS50eXBlS2V5LCBpZCksICJQVVQiLCB7IGRhdGE6IGRhdGEgfSk7CiAgICAg IH0sCgogICAgICAvKioKICAgICAgICBDYWxsZWQgYnkgdGhlIHN0b3JlIHdo ZW4gYSByZWNvcmQgaXMgZGVsZXRlZC4KCiAgICAgICAgVGhlIGBkZWxldGVS ZWNvcmRgIG1ldGhvZCAgbWFrZXMgYW4gQWpheCAoSFRUUCBERUxFVEUpIHJl cXVlc3QgdG8gYSBVUkwgY29tcHV0ZWQgYnkgYGJ1aWxkVVJMYC4KCiAgICAg ICAgQG1ldGhvZCBkZWxldGVSZWNvcmQKICAgICAgICBAcGFyYW0ge0RTLlN0 b3JlfSBzdG9yZQogICAgICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9k ZWx9IHR5cGUKICAgICAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKICAg ICAgICBAcmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZQogICAgICAqLwogICAg ICBkZWxldGVSZWNvcmQ6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCByZWNvcmQp IHsKICAgICAgICB2YXIgaWQgPSBnZXQocmVjb3JkLCAnaWQnKTsKCiAgICAg ICAgcmV0dXJuIHRoaXMuYWpheCh0aGlzLmJ1aWxkVVJMKHR5cGUudHlwZUtl eSwgaWQpLCAiREVMRVRFIik7CiAgICAgIH0sCgogICAgICAvKioKICAgICAg ICBCdWlsZHMgYSBVUkwgZm9yIGEgZ2l2ZW4gdHlwZSBhbmQgb3B0aW9uYWwg SUQuCgogICAgICAgIEJ5IGRlZmF1bHQsIGl0IHBsdXJhbGl6ZXMgdGhlIHR5 cGUncyBuYW1lIChmb3IgZXhhbXBsZSwgJ3Bvc3QnCiAgICAgICAgYmVjb21l cyAncG9zdHMnIGFuZCAncGVyc29uJyBiZWNvbWVzICdwZW9wbGUnKS4gVG8g b3ZlcnJpZGUgdGhlCiAgICAgICAgcGx1cmFsaXphdGlvbiBzZWUgW3BhdGhG b3JUeXBlXSgjbWV0aG9kX3BhdGhGb3JUeXBlKS4KCiAgICAgICAgSWYgYW4g SUQgaXMgc3BlY2lmaWVkLCBpdCBhZGRzIHRoZSBJRCB0byB0aGUgcGF0aCBn ZW5lcmF0ZWQKICAgICAgICBmb3IgdGhlIHR5cGUsIHNlcGFyYXRlZCBieSBh IGAvYC4KCiAgICAgICAgQG1ldGhvZCBidWlsZFVSTAogICAgICAgIEBwYXJh bSB7U3RyaW5nfSB0eXBlCiAgICAgICAgQHBhcmFtIHtTdHJpbmd9IGlkCiAg ICAgICAgQHJldHVybnMge1N0cmluZ30gdXJsCiAgICAgICovCiAgICAgIGJ1 aWxkVVJMOiBmdW5jdGlvbih0eXBlLCBpZCkgewogICAgICAgIHZhciB1cmwg PSBbXSwKICAgICAgICAgICAgaG9zdCA9IGdldCh0aGlzLCAnaG9zdCcpLAog ICAgICAgICAgICBwcmVmaXggPSB0aGlzLnVybFByZWZpeCgpOwoKICAgICAg ICBpZiAodHlwZSkgeyB1cmwucHVzaCh0aGlzLnBhdGhGb3JUeXBlKHR5cGUp KTsgfQogICAgICAgIGlmIChpZCkgeyB1cmwucHVzaChpZCk7IH0KCiAgICAg ICAgaWYgKHByZWZpeCkgeyB1cmwudW5zaGlmdChwcmVmaXgpOyB9CgogICAg ICAgIHVybCA9IHVybC5qb2luKCcvJyk7CiAgICAgICAgaWYgKCFob3N0ICYm IHVybCkgeyB1cmwgPSAnLycgKyB1cmw7IH0KCiAgICAgICAgcmV0dXJuIHVy bDsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgIEBtZXRob2QgdXJsUHJl Zml4CiAgICAgICAgQHByaXZhdGUKICAgICAgICBAcGFyYW0ge1N0cmluZ30g cGF0aAogICAgICAgIEBwYXJhbSB7U3RyaW5nfSBwYXJlbnRVcmwKICAgICAg ICBAcmV0dXJuIHtTdHJpbmd9IHVybFByZWZpeAogICAgICAqLwogICAgICB1 cmxQcmVmaXg6IGZ1bmN0aW9uKHBhdGgsIHBhcmVudFVSTCkgewogICAgICAg IHZhciBob3N0ID0gZ2V0KHRoaXMsICdob3N0JyksCiAgICAgICAgICAgIG5h bWVzcGFjZSA9IGdldCh0aGlzLCAnbmFtZXNwYWNlJyksCiAgICAgICAgICAg IHVybCA9IFtdOwoKICAgICAgICBpZiAocGF0aCkgewogICAgICAgICAgLy8g QWJzb2x1dGUgcGF0aAogICAgICAgICAgaWYgKHBhdGguY2hhckF0KDApID09 PSAnLycpIHsKICAgICAgICAgICAgaWYgKGhvc3QpIHsKICAgICAgICAgICAg ICBwYXRoID0gcGF0aC5zbGljZSgxKTsKICAgICAgICAgICAgICB1cmwucHVz aChob3N0KTsKICAgICAgICAgICAgfQogICAgICAgICAgLy8gUmVsYXRpdmUg cGF0aAogICAgICAgICAgfSBlbHNlIGlmICghL15odHRwKHMpPzpcL1wvLy50 ZXN0KHBhdGgpKSB7CiAgICAgICAgICAgIHVybC5wdXNoKHBhcmVudFVSTCk7 CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICho b3N0KSB7IHVybC5wdXNoKGhvc3QpOyB9CiAgICAgICAgICBpZiAobmFtZXNw YWNlKSB7IHVybC5wdXNoKG5hbWVzcGFjZSk7IH0KICAgICAgICB9CgogICAg ICAgIGlmIChwYXRoKSB7CiAgICAgICAgICB1cmwucHVzaChwYXRoKTsKICAg ICAgICB9CgogICAgICAgIHJldHVybiB1cmwuam9pbignLycpOwogICAgICB9 LAoKICAgICAgLyoqCiAgICAgICAgRGV0ZXJtaW5lcyB0aGUgcGF0aG5hbWUg Zm9yIGEgZ2l2ZW4gdHlwZS4KCiAgICAgICAgQnkgZGVmYXVsdCwgaXQgcGx1 cmFsaXplcyB0aGUgdHlwZSdzIG5hbWUgKGZvciBleGFtcGxlLAogICAgICAg ICdwb3N0JyBiZWNvbWVzICdwb3N0cycgYW5kICdwZXJzb24nIGJlY29tZXMg J3Blb3BsZScpLgoKICAgICAgICAjIyMgUGF0aG5hbWUgY3VzdG9taXphdGlv bgoKICAgICAgICBGb3IgZXhhbXBsZSBpZiB5b3UgaGF2ZSBhbiBvYmplY3Qg TGluZUl0ZW0gd2l0aCBhbgogICAgICAgIGVuZHBvaW50IG9mICIvbGluZV9p dGVtcy8iLgoKICAgICAgICBgYGBqcwogICAgICAgIERTLlJFU1RBZGFwdGVy LnJlb3Blbih7CiAgICAgICAgICBwYXRoRm9yVHlwZTogZnVuY3Rpb24odHlw ZSkgewogICAgICAgICAgICB2YXIgZGVjYW1lbGl6ZWQgPSBFbWJlci5TdHJp bmcuZGVjYW1lbGl6ZSh0eXBlKTsKICAgICAgICAgICAgcmV0dXJuIEVtYmVy LlN0cmluZy5wbHVyYWxpemUoZGVjYW1lbGl6ZWQpOwogICAgICAgICAgfTsK ICAgICAgICB9KTsKICAgICAgICBgYGAKCiAgICAgICAgQG1ldGhvZCBwYXRo Rm9yVHlwZQogICAgICAgIEBwYXJhbSB7U3RyaW5nfSB0eXBlCiAgICAgICAg QHJldHVybnMge1N0cmluZ30gcGF0aAogICAgICAqKi8KICAgICAgcGF0aEZv clR5cGU6IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICB2YXIgY2FtZWxpemVk ID0gRW1iZXIuU3RyaW5nLmNhbWVsaXplKHR5cGUpOwogICAgICAgIHJldHVy biBFbWJlci5TdHJpbmcucGx1cmFsaXplKGNhbWVsaXplZCk7CiAgICAgIH0s CgogICAgICAvKioKICAgICAgICBUYWtlcyBhbiBhamF4IHJlc3BvbnNlLCBh bmQgcmV0dXJucyBhIHJlbGV2YW50IGVycm9yLgoKICAgICAgICBSZXR1cm5p bmcgYSBgRFMuSW52YWxpZEVycm9yYCBmcm9tIHRoaXMgbWV0aG9kIHdpbGwg Y2F1c2UgdGhlCiAgICAgICAgcmVjb3JkIHRvIHRyYW5zaXRpb24gaW50byB0 aGUgYGludmFsaWRgIHN0YXRlIGFuZCBtYWtlIHRoZQogICAgICAgIGBlcnJv cnNgIG9iamVjdCBhdmFpbGFibGUgb24gdGhlIHJlY29yZC4KCiAgICAgICAg YGBgamF2YXNjcmlwdAogICAgICAgIEFwcC5BcHBsaWNhdGlvbkFkYXB0ZXIg PSBEUy5SRVNUQWRhcHRlci5leHRlbmQoewogICAgICAgICAgYWpheEVycm9y OiBmdW5jdGlvbihqcVhIUikgewogICAgICAgICAgICB2YXIgZXJyb3IgPSB0 aGlzLl9zdXBlcihqcVhIUik7CgogICAgICAgICAgICBpZiAoanFYSFIgJiYg anFYSFIuc3RhdHVzID09PSA0MjIpIHsKICAgICAgICAgICAgICB2YXIganNv bkVycm9ycyA9IEVtYmVyLiQucGFyc2VKU09OKGpxWEhSLnJlc3BvbnNlVGV4 dClbImVycm9ycyJdOwoKICAgICAgICAgICAgICByZXR1cm4gbmV3IERTLklu dmFsaWRFcnJvcihqc29uRXJyb3JzKTsKICAgICAgICAgICAgfSBlbHNlIHsK ICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7CiAgICAgICAgICAgIH0KICAg ICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBgYGAKCiAgICAgICAgTm90 ZTogQXMgYSBjb3JyZWN0bmVzcyBvcHRpbWl6YXRpb24sIHRoZSBkZWZhdWx0 IGltcGxlbWVudGF0aW9uIG9mCiAgICAgICAgdGhlIGBhamF4RXJyb3JgIG1l dGhvZCBzdHJpcHMgb3V0IHRoZSBgdGhlbmAgbWV0aG9kIGZyb20ganF1ZXJ5 J3MKICAgICAgICBhamF4IHJlc3BvbnNlIChqcVhIUikuIFRoaXMgaXMgaW1w b3J0YW50IGJlY2F1c2UgdGhlIGpxWEhSJ3MKICAgICAgICBgdGhlbmAgbWV0 aG9kIGZ1bGZpbGxzIHRoZSBwcm9taXNlIHdpdGggaXRzZWxmIHJlc3VsdGlu ZyBpbiBhCiAgICAgICAgY2lyY3VsYXIgInRoZW5hYmxlIiBjaGFpbiB3aGlj aCBtYXkgY2F1c2UgcHJvYmxlbXMgZm9yIHNvbWUKICAgICAgICBwcm9taXNl IGxpYnJhcmllcy4KCiAgICAgICAgQG1ldGhvZCBhamF4RXJyb3IKICAgICAg ICBAcGFyYW0gIHtPYmplY3R9IGpxWEhSCiAgICAgICAgQHJldHVybiB7T2Jq ZWN0fSBqcVhIUgogICAgICAqLwogICAgICBhamF4RXJyb3I6IGZ1bmN0aW9u KGpxWEhSKSB7CiAgICAgICAgaWYgKGpxWEhSKSB7CiAgICAgICAgICBqcVhI Ui50aGVuID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBqcVhI UjsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgIFRha2VzIGEgVVJMLCBh biBIVFRQIG1ldGhvZCBhbmQgYSBoYXNoIG9mIGRhdGEsIGFuZCBtYWtlcyBh bgogICAgICAgIEhUVFAgcmVxdWVzdC4KCiAgICAgICAgV2hlbiB0aGUgc2Vy dmVyIHJlc3BvbmRzIHdpdGggYSBwYXlsb2FkLCBFbWJlciBEYXRhIHdpbGwg Y2FsbCBpbnRvIGBleHRyYWN0U2luZ2xlYAogICAgICAgIG9yIGBleHRyYWN0 QXJyYXlgIChkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgb3JpZ2luYWwgcXVl cnkgd2FzIGZvciBvbmUgcmVjb3JkIG9yCiAgICAgICAgbWFueSByZWNvcmRz KS4KCiAgICAgICAgQnkgZGVmYXVsdCwgYGFqYXhgIG1ldGhvZCBoYXMgdGhl IGZvbGxvd2luZyBiZWhhdmlvcjoKCiAgICAgICAgKiBJdCBzZXRzIHRoZSBy ZXNwb25zZSBgZGF0YVR5cGVgIHRvIGAianNvbiJgCiAgICAgICAgKiBJZiB0 aGUgSFRUUCBtZXRob2QgaXMgbm90IGAiR0VUImAsIGl0IHNldHMgdGhlIGBD b250ZW50LVR5cGVgIHRvIGJlCiAgICAgICAgICBgYXBwbGljYXRpb24vanNv bjsgY2hhcnNldD11dGYtOGAKICAgICAgICAqIElmIHRoZSBIVFRQIG1ldGhv ZCBpcyBub3QgYCJHRVQiYCwgaXQgc3RyaW5naWZpZXMgdGhlIGRhdGEgcGFz c2VkIGluLiBUaGUKICAgICAgICAgIGRhdGEgaXMgdGhlIHNlcmlhbGl6ZWQg cmVjb3JkIGluIHRoZSBjYXNlIG9mIGEgc2F2ZS4KICAgICAgICAqIFJlZ2lz dGVycyBzdWNjZXNzIGFuZCBmYWlsdXJlIGhhbmRsZXJzLgoKICAgICAgICBA bWV0aG9kIGFqYXgKICAgICAgICBAcHJpdmF0ZQogICAgICAgIEBwYXJhbSB7 U3RyaW5nfSB1cmwKICAgICAgICBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUg cmVxdWVzdCB0eXBlIEdFVCwgUE9TVCwgUFVULCBERUxFVEUgZXRjLgogICAg ICAgIEBwYXJhbSB7T2JqZWN0fSBoYXNoCiAgICAgICAgQHJldHVybiB7UHJv bWlzZX0gcHJvbWlzZQogICAgICAqLwogICAgICBhamF4OiBmdW5jdGlvbih1 cmwsIHR5cGUsIGhhc2gpIHsKICAgICAgICB2YXIgYWRhcHRlciA9IHRoaXM7 CgogICAgICAgIHJldHVybiBuZXcgRW1iZXIuUlNWUC5Qcm9taXNlKGZ1bmN0 aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgaGFzaCA9IGFkYXB0 ZXIuYWpheE9wdGlvbnModXJsLCB0eXBlLCBoYXNoKTsKCiAgICAgICAgICBo YXNoLnN1Y2Nlc3MgPSBmdW5jdGlvbihqc29uKSB7CiAgICAgICAgICAgIEVt YmVyLnJ1bihudWxsLCByZXNvbHZlLCBqc29uKTsKICAgICAgICAgIH07Cgog ICAgICAgICAgaGFzaC5lcnJvciA9IGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3Rh dHVzLCBlcnJvclRocm93bikgewogICAgICAgICAgICBFbWJlci5ydW4obnVs bCwgcmVqZWN0LCBhZGFwdGVyLmFqYXhFcnJvcihqcVhIUikpOwogICAgICAg ICAgfTsKCiAgICAgICAgICBFbWJlci4kLmFqYXgoaGFzaCk7CiAgICAgICAg fSwgIkRTOiBSZXN0QWRhcHRlciNhamF4ICIgKyB0eXBlICsgIiB0byAiICsg dXJsKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgIEBtZXRob2QgYWph eE9wdGlvbnMKICAgICAgICBAcHJpdmF0ZQogICAgICAgIEBwYXJhbSB7U3Ry aW5nfSB1cmwKICAgICAgICBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgcmVx dWVzdCB0eXBlIEdFVCwgUE9TVCwgUFVULCBERUxFVEUgZXRjLgogICAgICAg IEBwYXJhbSB7T2JqZWN0fSBoYXNoCiAgICAgICAgQHJldHVybiB7T2JqZWN0 fSBoYXNoCiAgICAgICovCiAgICAgIGFqYXhPcHRpb25zOiBmdW5jdGlvbih1 cmwsIHR5cGUsIGhhc2gpIHsKICAgICAgICBoYXNoID0gaGFzaCB8fCB7fTsK ICAgICAgICBoYXNoLnVybCA9IHVybDsKICAgICAgICBoYXNoLnR5cGUgPSB0 eXBlOwogICAgICAgIGhhc2guZGF0YVR5cGUgPSAnanNvbic7CiAgICAgICAg aGFzaC5jb250ZXh0ID0gdGhpczsKCiAgICAgICAgaWYgKGhhc2guZGF0YSAm JiB0eXBlICE9PSAnR0VUJykgewogICAgICAgICAgaGFzaC5jb250ZW50VHlw ZSA9ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04JzsKICAgICAg ICAgIGhhc2guZGF0YSA9IEpTT04uc3RyaW5naWZ5KGhhc2guZGF0YSk7CiAg ICAgICAgfQoKICAgICAgICBpZiAodGhpcy5oZWFkZXJzICE9PSB1bmRlZmlu ZWQpIHsKICAgICAgICAgIHZhciBoZWFkZXJzID0gdGhpcy5oZWFkZXJzOwog ICAgICAgICAgaGFzaC5iZWZvcmVTZW5kID0gZnVuY3Rpb24gKHhocikgewog ICAgICAgICAgICBmb3JFYWNoLmNhbGwoRW1iZXIua2V5cyhoZWFkZXJzKSwg ZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RI ZWFkZXIoa2V5LCBoZWFkZXJzW2tleV0pOwogICAgICAgICAgICB9KTsKICAg ICAgICAgIH07CiAgICAgICAgfQoKCiAgICAgICAgcmV0dXJuIGhhc2g7CiAg ICAgIH0KCiAgICB9KTsKCiAgICBfX2V4cG9ydHNfX1siZGVmYXVsdCJdID0g UkVTVEFkYXB0ZXI7CiAgfSk7CmRlZmluZSgiZW1iZXItZGF0YS9saWIvY29y ZSIsIAogIFsiZXhwb3J0cyJdLAogIGZ1bmN0aW9uKF9fZXhwb3J0c19fKSB7 CiAgICAidXNlIHN0cmljdCI7CiAgICAvKioKICAgICAgQG1vZHVsZSBlbWJl ci1kYXRhCiAgICAqLwoKICAgIC8qKgogICAgICBBbGwgRW1iZXIgRGF0YSBt ZXRob2RzIGFuZCBmdW5jdGlvbnMgYXJlIGRlZmluZWQgaW5zaWRlIG9mIHRo aXMgbmFtZXNwYWNlLgoKICAgICAgQGNsYXNzIERTCiAgICAgIEBzdGF0aWMK ICAgICovCiAgICB2YXIgRFM7CiAgICBpZiAoJ3VuZGVmaW5lZCcgPT09IHR5 cGVvZiBEUykgewogICAgICAvKioKICAgICAgICBAcHJvcGVydHkgVkVSU0lP TgogICAgICAgIEB0eXBlIFN0cmluZwogICAgICAgIEBkZWZhdWx0ICcxLjAu MC1iZXRhLjcrY2FuYXJ5LjNjZTVlMGU1JwogICAgICAgIEBzdGF0aWMKICAg ICAgKi8KICAgICAgRFMgPSBFbWJlci5OYW1lc3BhY2UuY3JlYXRlKHsKICAg ICAgICBWRVJTSU9OOiAnMS4wLjAtYmV0YS43K2NhbmFyeS4zY2U1ZTBlNScK ICAgICAgfSk7CgogICAgICBpZiAoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiB3 aW5kb3cpIHsKICAgICAgICB3aW5kb3cuRFMgPSBEUzsKICAgICAgfQoKICAg ICAgaWYgKEVtYmVyLmxpYnJhcmllcykgewogICAgICAgIEVtYmVyLmxpYnJh cmllcy5yZWdpc3RlckNvcmVMaWJyYXJ5KCdFbWJlciBEYXRhJywgRFMuVkVS U0lPTik7CiAgICAgIH0KICAgIH0KCiAgICBfX2V4cG9ydHNfX1siZGVmYXVs dCJdID0gRFM7CiAgfSk7CmRlZmluZSgiZW1iZXItZGF0YS9saWIvZXh0L2Rh dGUiLCAKICBbXSwKICBmdW5jdGlvbigpIHsKICAgICJ1c2Ugc3RyaWN0IjsK ICAgIC8qKgogICAgICBAbW9kdWxlIGVtYmVyLWRhdGEKICAgICovCgogICAg LyoqCiAgICAgIERhdGUucGFyc2Ugd2l0aCBwcm9ncmVzc2l2ZSBlbmhhbmNl bWVudCBmb3IgSVNPIDg2MDEgPGh0dHBzOi8vZ2l0aHViLmNvbS9jc25vdmVy L2pzLWlzbzg2MDE+CgogICAgICDCqSAyMDExIENvbGluIFNub3ZlciA8aHR0 cDovL3pldGFmbGVldC5jb20+CgogICAgICBSZWxlYXNlZCB1bmRlciBNSVQg bGljZW5zZS4KCiAgICAgIEBjbGFzcyBEYXRlCiAgICAgIEBuYW1lc3BhY2Ug RW1iZXIKICAgICAgQHN0YXRpYwogICAgKi8KICAgIEVtYmVyLkRhdGUgPSBF bWJlci5EYXRlIHx8IHt9OwoKICAgIHZhciBvcmlnUGFyc2UgPSBEYXRlLnBh cnNlLCBudW1lcmljS2V5cyA9IFsgMSwgNCwgNSwgNiwgNywgMTAsIDExIF07 CgogICAgLyoqCiAgICAgIEBtZXRob2QgcGFyc2UKICAgICAgQHBhcmFtIGRh dGUKICAgICovCiAgICBFbWJlci5EYXRlLnBhcnNlID0gZnVuY3Rpb24gKGRh dGUpIHsKICAgICAgICB2YXIgdGltZXN0YW1wLCBzdHJ1Y3QsIG1pbnV0ZXNP ZmZzZXQgPSAwOwoKICAgICAgICAvLyBFUzUgwqcxNS45LjQuMiBzdGF0ZXMg dGhhdCB0aGUgc3RyaW5nIHNob3VsZCBhdHRlbXB0IHRvIGJlIHBhcnNlZCBh cyBhIERhdGUgVGltZSBTdHJpbmcgRm9ybWF0IHN0cmluZwogICAgICAgIC8v IGJlZm9yZSBmYWxsaW5nIGJhY2sgdG8gYW55IGltcGxlbWVudGF0aW9uLXNw ZWNpZmljIGRhdGUgcGFyc2luZywgc28gdGhhdOKAmXMgd2hhdCB3ZSBkbywg ZXZlbiBpZiBuYXRpdmUKICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbnMgY291 bGQgYmUgZmFzdGVyCiAgICAgICAgLy8gICAgICAgICAgICAgIDEgWVlZWSAg ICAgICAgICAgICAgICAyIE1NICAgICAgIDMgREQgICAgICAgICAgIDQgSEgg ICAgNSBtbSAgICAgICA2IHNzICAgICAgICA3IG1zZWMgICAgICAgIDggWiA5 IMKxICAgIDEwIHR6SEggICAgMTEgdHptbQogICAgICAgIGlmICgoc3RydWN0 ID0gL14oXGR7NH18WytcLV1cZHs2fSkoPzotKFxkezJ9KSg/Oi0oXGR7Mn0p KT8pPyg/OlQoXGR7Mn0pOihcZHsyfSkoPzo6KFxkezJ9KSg/OlwuKFxkezN9 KSk/KT8oPzooWil8KFsrXC1dKShcZHsyfSkoPzo6KFxkezJ9KSk/KT8pPyQv LmV4ZWMoZGF0ZSkpKSB7CiAgICAgICAgICAgIC8vIGF2b2lkIE5hTiB0aW1l c3RhbXBzIGNhdXNlZCBieSDigJx1bmRlZmluZWTigJ0gdmFsdWVzIGJlaW5n IHBhc3NlZCB0byBEYXRlLlVUQwogICAgICAgICAgICBmb3IgKHZhciBpID0g MCwgazsgKGsgPSBudW1lcmljS2V5c1tpXSk7ICsraSkgewogICAgICAgICAg ICAgICAgc3RydWN0W2tdID0gK3N0cnVjdFtrXSB8fCAwOwogICAgICAgICAg ICB9CgogICAgICAgICAgICAvLyBhbGxvdyB1bmRlZmluZWQgZGF5cyBhbmQg bW9udGhzCiAgICAgICAgICAgIHN0cnVjdFsyXSA9ICgrc3RydWN0WzJdIHx8 IDEpIC0gMTsKICAgICAgICAgICAgc3RydWN0WzNdID0gK3N0cnVjdFszXSB8 fCAxOwoKICAgICAgICAgICAgaWYgKHN0cnVjdFs4XSAhPT0gJ1onICYmIHN0 cnVjdFs5XSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBtaW51 dGVzT2Zmc2V0ID0gc3RydWN0WzEwXSAqIDYwICsgc3RydWN0WzExXTsKCiAg ICAgICAgICAgICAgICBpZiAoc3RydWN0WzldID09PSAnKycpIHsKICAgICAg ICAgICAgICAgICAgICBtaW51dGVzT2Zmc2V0ID0gMCAtIG1pbnV0ZXNPZmZz ZXQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAg ICAgIHRpbWVzdGFtcCA9IERhdGUuVVRDKHN0cnVjdFsxXSwgc3RydWN0WzJd LCBzdHJ1Y3RbM10sIHN0cnVjdFs0XSwgc3RydWN0WzVdICsgbWludXRlc09m ZnNldCwgc3RydWN0WzZdLCBzdHJ1Y3RbN10pOwogICAgICAgIH0KICAgICAg ICBlbHNlIHsKICAgICAgICAgICAgdGltZXN0YW1wID0gb3JpZ1BhcnNlID8g b3JpZ1BhcnNlKGRhdGUpIDogTmFOOwogICAgICAgIH0KCiAgICAgICAgcmV0 dXJuIHRpbWVzdGFtcDsKICAgIH07CgogICAgaWYgKEVtYmVyLkVYVEVORF9Q Uk9UT1RZUEVTID09PSB0cnVlIHx8IEVtYmVyLkVYVEVORF9QUk9UT1RZUEVT LkRhdGUpIHsKICAgICAgRGF0ZS5wYXJzZSA9IEVtYmVyLkRhdGUucGFyc2U7 CiAgICB9CiAgfSk7CmRlZmluZSgiZW1iZXItZGF0YS9saWIvaW5pdGlhbGl6 ZXJzIiwgCiAgWyIuL3N5c3RlbS9zdG9yZSIsIi4vc2VyaWFsaXplcnMiLCIu L2FkYXB0ZXJzIiwiLi9zeXN0ZW0vZGVidWcvZGVidWdfYWRhcHRlciIsIi4v c3lzdGVtL2NvbnRhaW5lcl9wcm94eSIsIi4vdHJhbnNmb3JtcyJdLAogIGZ1 bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19kZXBlbmRlbmN5Ml9fLCBfX2Rl cGVuZGVuY3kzX18sIF9fZGVwZW5kZW5jeTRfXywgX19kZXBlbmRlbmN5NV9f LCBfX2RlcGVuZGVuY3k2X18pIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZh ciBTdG9yZSA9IF9fZGVwZW5kZW5jeTFfX1siZGVmYXVsdCJdOwogICAgdmFy IEpTT05TZXJpYWxpemVyID0gX19kZXBlbmRlbmN5Ml9fLkpTT05TZXJpYWxp emVyOwogICAgdmFyIFJFU1RTZXJpYWxpemVyID0gX19kZXBlbmRlbmN5Ml9f LlJFU1RTZXJpYWxpemVyOwogICAgdmFyIFJFU1RBZGFwdGVyID0gX19kZXBl bmRlbmN5M19fLlJFU1RBZGFwdGVyOwogICAgdmFyIERlYnVnQWRhcHRlciA9 IF9fZGVwZW5kZW5jeTRfX1siZGVmYXVsdCJdOwogICAgdmFyIENvbnRhaW5l clByb3h5ID0gX19kZXBlbmRlbmN5NV9fWyJkZWZhdWx0Il07CiAgICB2YXIg Qm9vbGVhblRyYW5zZm9ybSA9IF9fZGVwZW5kZW5jeTZfXy5Cb29sZWFuVHJh bnNmb3JtOwogICAgdmFyIERhdGVUcmFuc2Zvcm0gPSBfX2RlcGVuZGVuY3k2 X18uRGF0ZVRyYW5zZm9ybTsKICAgIHZhciBTdHJpbmdUcmFuc2Zvcm0gPSBf X2RlcGVuZGVuY3k2X18uU3RyaW5nVHJhbnNmb3JtOwogICAgdmFyIE51bWJl clRyYW5zZm9ybSA9IF9fZGVwZW5kZW5jeTZfXy5OdW1iZXJUcmFuc2Zvcm07 CgogICAgLyoqCiAgICAgIEBtb2R1bGUgZW1iZXItZGF0YQogICAgKi8KCiAg ICB2YXIgc2V0ID0gRW1iZXIuc2V0OwoKICAgIC8qCiAgICAgIFRoaXMgY29k ZSByZWdpc3RlcnMgYW4gaW5qZWN0aW9uIGZvciBFbWJlci5BcHBsaWNhdGlv bi4KCiAgICAgIElmIGFuIEVtYmVyLmpzIGRldmVsb3BlciBkZWZpbmVzIGEg c3ViY2xhc3Mgb2YgRFMuU3RvcmUgb24gdGhlaXIgYXBwbGljYXRpb24sCiAg ICAgIHRoaXMgY29kZSB3aWxsIGF1dG9tYXRpY2FsbHkgaW5zdGFudGlhdGUg aXQgYW5kIG1ha2UgaXQgYXZhaWxhYmxlIG9uIHRoZQogICAgICByb3V0ZXIu CgogICAgICBBZGRpdGlvbmFsbHksIGFmdGVyIGFuIGFwcGxpY2F0aW9uJ3Mg Y29udHJvbGxlcnMgaGF2ZSBiZWVuIGluamVjdGVkLCB0aGV5IHdpbGwKICAg ICAgZWFjaCBoYXZlIHRoZSBzdG9yZSBtYWRlIGF2YWlsYWJsZSB0byB0aGVt LgoKICAgICAgRm9yIGV4YW1wbGUsIGltYWdpbmUgYW4gRW1iZXIuanMgYXBw bGljYXRpb24gd2l0aCB0aGUgZm9sbG93aW5nIGNsYXNzZXM6CgogICAgICBB cHAuU3RvcmUgPSBEUy5TdG9yZS5leHRlbmQoewogICAgICAgIGFkYXB0ZXI6 ICdjdXN0b20nCiAgICAgIH0pOwoKICAgICAgQXBwLlBvc3RzQ29udHJvbGxl ciA9IEVtYmVyLkFycmF5Q29udHJvbGxlci5leHRlbmQoewogICAgICAgIC8v IC4uLgogICAgICB9KTsKCiAgICAgIFdoZW4gdGhlIGFwcGxpY2F0aW9uIGlz IGluaXRpYWxpemVkLCBgQXBwLlN0b3JlYCB3aWxsIGF1dG9tYXRpY2FsbHkg YmUKICAgICAgaW5zdGFudGlhdGVkLCBhbmQgdGhlIGluc3RhbmNlIG9mIGBB cHAuUG9zdHNDb250cm9sbGVyYCB3aWxsIGhhdmUgaXRzIGBzdG9yZWAKICAg ICAgcHJvcGVydHkgc2V0IHRvIHRoYXQgaW5zdGFuY2UuCgogICAgICBOb3Rl IHRoYXQgdGhpcyBjb2RlIHdpbGwgb25seSBiZSBydW4gaWYgdGhlIGBlbWJl ci1hcHBsaWNhdGlvbmAgcGFja2FnZSBpcwogICAgICBsb2FkZWQuIElmIEVt YmVyIERhdGEgaXMgYmVpbmcgdXNlZCBpbiBhbiBlbnZpcm9ubWVudCBvdGhl ciB0aGFuIGEKICAgICAgdHlwaWNhbCBhcHBsaWNhdGlvbiAoZS5nLiwgbm9k ZS5qcyB3aGVyZSBvbmx5IGBlbWJlci1ydW50aW1lYCBpcyBhdmFpbGFibGUp LAogICAgICB0aGlzIGNvZGUgd2lsbCBiZSBpZ25vcmVkLgogICAgKi8KCiAg ICBFbWJlci5vbkxvYWQoJ0VtYmVyLkFwcGxpY2F0aW9uJywgZnVuY3Rpb24o QXBwbGljYXRpb24pIHsKICAgICAgQXBwbGljYXRpb24uaW5pdGlhbGl6ZXIo ewogICAgICAgIG5hbWU6ICJzdG9yZSIsCgogICAgICAgIGluaXRpYWxpemU6 IGZ1bmN0aW9uKGNvbnRhaW5lciwgYXBwbGljYXRpb24pIHsKICAgICAgICAg IGFwcGxpY2F0aW9uLnJlZ2lzdGVyKCdzdG9yZTptYWluJywgYXBwbGljYXRp b24uU3RvcmUgfHwgU3RvcmUpOwoKICAgICAgICAgIC8vIGFsbG93IG9sZGVy IG5hbWVzIHRvIGJlIGxvb2tlZCB1cAoKICAgICAgICAgIHZhciBwcm94eSA9 IG5ldyBDb250YWluZXJQcm94eShjb250YWluZXIpOwogICAgICAgICAgcHJv eHkucmVnaXN0ZXJEZXByZWNhdGlvbnMoWwogICAgICAgICAgICB7ZGVwcmVj YXRlZDogJ3NlcmlhbGl6ZXI6X2RlZmF1bHQnLCAgdmFsaWQ6ICdzZXJpYWxp emVyOi1kZWZhdWx0J30sCiAgICAgICAgICAgIHtkZXByZWNhdGVkOiAnc2Vy aWFsaXplcjpfcmVzdCcsICAgICB2YWxpZDogJ3NlcmlhbGl6ZXI6LXJlc3Qn fSwKICAgICAgICAgICAge2RlcHJlY2F0ZWQ6ICdhZGFwdGVyOl9yZXN0Jywg ICAgICAgIHZhbGlkOiAnYWRhcHRlcjotcmVzdCd9CiAgICAgICAgICBdKTsK CiAgICAgICAgICAvLyBuZXcgZ28gZm9yd2FyZCBwYXRocwogICAgICAgICAg YXBwbGljYXRpb24ucmVnaXN0ZXIoJ3NlcmlhbGl6ZXI6LWRlZmF1bHQnLCBK U09OU2VyaWFsaXplcik7CiAgICAgICAgICBhcHBsaWNhdGlvbi5yZWdpc3Rl cignc2VyaWFsaXplcjotcmVzdCcsIFJFU1RTZXJpYWxpemVyKTsKICAgICAg ICAgIGFwcGxpY2F0aW9uLnJlZ2lzdGVyKCdhZGFwdGVyOi1yZXN0JywgUkVT VEFkYXB0ZXIpOwoKICAgICAgICAgIC8vIEVhZ2VybHkgZ2VuZXJhdGUgdGhl IHN0b3JlIHNvIGRlZmF1bHRTdG9yZSBpcyBwb3B1bGF0ZWQuCiAgICAgICAg ICAvLyBUT0RPOiBEbyB0aGlzIGluIGEgZmluaXNoZXIgaG9vawogICAgICAg ICAgY29udGFpbmVyLmxvb2t1cCgnc3RvcmU6bWFpbicpOwogICAgICAgIH0K ICAgICAgfSk7CgogICAgICBBcHBsaWNhdGlvbi5pbml0aWFsaXplcih7CiAg ICAgICAgbmFtZTogInRyYW5zZm9ybXMiLAogICAgICAgIGJlZm9yZTogInN0 b3JlIiwKCiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oY29udGFpbmVy LCBhcHBsaWNhdGlvbikgewogICAgICAgICAgYXBwbGljYXRpb24ucmVnaXN0 ZXIoJ3RyYW5zZm9ybTpib29sZWFuJywgQm9vbGVhblRyYW5zZm9ybSk7CiAg ICAgICAgICBhcHBsaWNhdGlvbi5yZWdpc3RlcigndHJhbnNmb3JtOmRhdGUn LCBEYXRlVHJhbnNmb3JtKTsKICAgICAgICAgIGFwcGxpY2F0aW9uLnJlZ2lz dGVyKCd0cmFuc2Zvcm06bnVtYmVyJywgTnVtYmVyVHJhbnNmb3JtKTsKICAg ICAgICAgIGFwcGxpY2F0aW9uLnJlZ2lzdGVyKCd0cmFuc2Zvcm06c3RyaW5n JywgU3RyaW5nVHJhbnNmb3JtKTsKICAgICAgICB9CiAgICAgIH0pOwoKICAg ICAgQXBwbGljYXRpb24uaW5pdGlhbGl6ZXIoewogICAgICAgIG5hbWU6ICJk YXRhLWFkYXB0ZXIiLAogICAgICAgIGJlZm9yZTogInN0b3JlIiwKCiAgICAg ICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oY29udGFpbmVyLCBhcHBsaWNhdGlv bikgewogICAgICAgICAgYXBwbGljYXRpb24ucmVnaXN0ZXIoJ2RhdGEtYWRh cHRlcjptYWluJywgRGVidWdBZGFwdGVyKTsKICAgICAgICB9CiAgICAgIH0p OwoKICAgICAgQXBwbGljYXRpb24uaW5pdGlhbGl6ZXIoewogICAgICAgIG5h bWU6ICJpbmplY3RTdG9yZSIsCiAgICAgICAgYmVmb3JlOiAic3RvcmUiLAoK ICAgICAgICBpbml0aWFsaXplOiBmdW5jdGlvbihjb250YWluZXIsIGFwcGxp Y2F0aW9uKSB7CiAgICAgICAgICBhcHBsaWNhdGlvbi5pbmplY3QoJ2NvbnRy b2xsZXInLCAnc3RvcmUnLCAnc3RvcmU6bWFpbicpOwogICAgICAgICAgYXBw bGljYXRpb24uaW5qZWN0KCdyb3V0ZScsICdzdG9yZScsICdzdG9yZTptYWlu Jyk7CiAgICAgICAgICBhcHBsaWNhdGlvbi5pbmplY3QoJ3NlcmlhbGl6ZXIn LCAnc3RvcmUnLCAnc3RvcmU6bWFpbicpOwogICAgICAgICAgYXBwbGljYXRp b24uaW5qZWN0KCdkYXRhLWFkYXB0ZXInLCAnc3RvcmUnLCAnc3RvcmU6bWFp bicpOwogICAgICAgIH0KICAgICAgfSk7CgogICAgfSk7CiAgfSk7CmRlZmlu ZSgiZW1iZXItZGF0YS9saWIvbWFpbiIsIAogIFsiLi9jb3JlIiwiLi9leHQv ZGF0ZSIsIi4vc3lzdGVtL3N0b3JlIiwiLi9zeXN0ZW0vbW9kZWwiLCIuL3N5 c3RlbS9jaGFuZ2VzIiwiLi9zeXN0ZW0vYWRhcHRlciIsIi4vc3lzdGVtL2Rl YnVnIiwiLi9zeXN0ZW0vcmVjb3JkX2FycmF5cyIsIi4vc3lzdGVtL3JlY29y ZF9hcnJheV9tYW5hZ2VyIiwiLi9hZGFwdGVycyIsIi4vc2VyaWFsaXplcnMv anNvbl9zZXJpYWxpemVyIiwiLi9zZXJpYWxpemVycy9yZXN0X3NlcmlhbGl6 ZXIiLCIuLi8uLi9lbWJlci1pbmZsZWN0b3IvbGliL21haW4iLCIuLi8uLi9h Y3RpdmVtb2RlbC1hZGFwdGVyL2xpYi9tYWluIiwiLi90cmFuc2Zvcm1zIiwi Li9zeXN0ZW0vcmVsYXRpb25zaGlwcyIsIi4vaW5pdGlhbGl6ZXJzIiwiLi9z eXN0ZW0vY29udGFpbmVyX3Byb3h5IiwiZXhwb3J0cyJdLAogIGZ1bmN0aW9u KF9fZGVwZW5kZW5jeTFfXywgX19kZXBlbmRlbmN5Ml9fLCBfX2RlcGVuZGVu Y3kzX18sIF9fZGVwZW5kZW5jeTRfXywgX19kZXBlbmRlbmN5NV9fLCBfX2Rl cGVuZGVuY3k2X18sIF9fZGVwZW5kZW5jeTdfXywgX19kZXBlbmRlbmN5OF9f LCBfX2RlcGVuZGVuY3k5X18sIF9fZGVwZW5kZW5jeTEwX18sIF9fZGVwZW5k ZW5jeTExX18sIF9fZGVwZW5kZW5jeTEyX18sIF9fZGVwZW5kZW5jeTEzX18s IF9fZGVwZW5kZW5jeTE0X18sIF9fZGVwZW5kZW5jeTE1X18sIF9fZGVwZW5k ZW5jeTE2X18sIF9fZGVwZW5kZW5jeTE3X18sIF9fZGVwZW5kZW5jeTE4X18s IF9fZXhwb3J0c19fKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICAvKioKICAg ICAgRW1iZXIgRGF0YQoKICAgICAgQG1vZHVsZSBlbWJlci1kYXRhCiAgICAg IEBtYWluIGVtYmVyLWRhdGEKICAgICovCgogICAgLy8gc3VwcG9ydCBSU1ZQ IDIueCB2aWEgcmVzb2x2ZSwgIGJ1dCBwcmVmZXIgUlNWUCAzLngncyBQcm9t aXNlLmNhc3QKICAgIEVtYmVyLlJTVlAuUHJvbWlzZS5jYXN0ID0gRW1iZXIu UlNWUC5Qcm9taXNlLmNhc3QgfHwgRW1iZXIuUlNWUC5yZXNvbHZlOwoKICAg IHZhciBEUyA9IF9fZGVwZW5kZW5jeTFfX1siZGVmYXVsdCJdOwoKICAgIHZh ciBTdG9yZSA9IF9fZGVwZW5kZW5jeTNfXy5TdG9yZTsKICAgIHZhciBQcm9t aXNlQXJyYXkgPSBfX2RlcGVuZGVuY3kzX18uUHJvbWlzZUFycmF5OwogICAg dmFyIFByb21pc2VPYmplY3QgPSBfX2RlcGVuZGVuY3kzX18uUHJvbWlzZU9i amVjdDsKICAgIHZhciBNb2RlbCA9IF9fZGVwZW5kZW5jeTRfXy5Nb2RlbDsK ICAgIHZhciBFcnJvcnMgPSBfX2RlcGVuZGVuY3k0X18uRXJyb3JzOwogICAg dmFyIFJvb3RTdGF0ZSA9IF9fZGVwZW5kZW5jeTRfXy5Sb290U3RhdGU7CiAg ICB2YXIgYXR0ciA9IF9fZGVwZW5kZW5jeTRfXy5hdHRyOwogICAgdmFyIEF0 dHJpYnV0ZUNoYW5nZSA9IF9fZGVwZW5kZW5jeTVfXy5BdHRyaWJ1dGVDaGFu Z2U7CiAgICB2YXIgUmVsYXRpb25zaGlwQ2hhbmdlID0gX19kZXBlbmRlbmN5 NV9fLlJlbGF0aW9uc2hpcENoYW5nZTsKICAgIHZhciBSZWxhdGlvbnNoaXBD aGFuZ2VBZGQgPSBfX2RlcGVuZGVuY3k1X18uUmVsYXRpb25zaGlwQ2hhbmdl QWRkOwogICAgdmFyIFJlbGF0aW9uc2hpcENoYW5nZVJlbW92ZSA9IF9fZGVw ZW5kZW5jeTVfXy5SZWxhdGlvbnNoaXBDaGFuZ2VSZW1vdmU7CiAgICB2YXIg T25lVG9NYW55Q2hhbmdlID0gX19kZXBlbmRlbmN5NV9fLk9uZVRvTWFueUNo YW5nZTsKICAgIHZhciBNYW55VG9Ob25lQ2hhbmdlID0gX19kZXBlbmRlbmN5 NV9fLk1hbnlUb05vbmVDaGFuZ2U7CiAgICB2YXIgT25lVG9PbmVDaGFuZ2Ug PSBfX2RlcGVuZGVuY3k1X18uT25lVG9PbmVDaGFuZ2U7CiAgICB2YXIgTWFu eVRvTWFueUNoYW5nZSA9IF9fZGVwZW5kZW5jeTVfXy5NYW55VG9NYW55Q2hh bmdlOwogICAgdmFyIEludmFsaWRFcnJvciA9IF9fZGVwZW5kZW5jeTZfXy5J bnZhbGlkRXJyb3I7CiAgICB2YXIgQWRhcHRlciA9IF9fZGVwZW5kZW5jeTZf Xy5BZGFwdGVyOwogICAgdmFyIERlYnVnQWRhcHRlciA9IF9fZGVwZW5kZW5j eTdfX1siZGVmYXVsdCJdOwogICAgdmFyIFJlY29yZEFycmF5ID0gX19kZXBl bmRlbmN5OF9fLlJlY29yZEFycmF5OwogICAgdmFyIEZpbHRlcmVkUmVjb3Jk QXJyYXkgPSBfX2RlcGVuZGVuY3k4X18uRmlsdGVyZWRSZWNvcmRBcnJheTsK ICAgIHZhciBBZGFwdGVyUG9wdWxhdGVkUmVjb3JkQXJyYXkgPSBfX2RlcGVu ZGVuY3k4X18uQWRhcHRlclBvcHVsYXRlZFJlY29yZEFycmF5OwogICAgdmFy IE1hbnlBcnJheSA9IF9fZGVwZW5kZW5jeThfXy5NYW55QXJyYXk7CiAgICB2 YXIgUmVjb3JkQXJyYXlNYW5hZ2VyID0gX19kZXBlbmRlbmN5OV9fWyJkZWZh dWx0Il07CiAgICB2YXIgUkVTVEFkYXB0ZXIgPSBfX2RlcGVuZGVuY3kxMF9f LlJFU1RBZGFwdGVyOwogICAgdmFyIEZpeHR1cmVBZGFwdGVyID0gX19kZXBl bmRlbmN5MTBfXy5GaXh0dXJlQWRhcHRlcjsKICAgIHZhciBKU09OU2VyaWFs aXplciA9IF9fZGVwZW5kZW5jeTExX19bImRlZmF1bHQiXTsKICAgIHZhciBS RVNUU2VyaWFsaXplciA9IF9fZGVwZW5kZW5jeTEyX19bImRlZmF1bHQiXTsK ICAgIHZhciBBY3RpdmVNb2RlbEFkYXB0ZXIgPSBfX2RlcGVuZGVuY3kxNF9f LkFjdGl2ZU1vZGVsQWRhcHRlcjsKICAgIHZhciBBY3RpdmVNb2RlbFNlcmlh bGl6ZXIgPSBfX2RlcGVuZGVuY3kxNF9fLkFjdGl2ZU1vZGVsU2VyaWFsaXpl cjsKICAgIHZhciBFbWJlZGRlZFJlY29yZHNNaXhpbiA9IF9fZGVwZW5kZW5j eTE0X18uRW1iZWRkZWRSZWNvcmRzTWl4aW47CgogICAgdmFyIFRyYW5zZm9y bSA9IF9fZGVwZW5kZW5jeTE1X18uVHJhbnNmb3JtOwogICAgdmFyIERhdGVU cmFuc2Zvcm0gPSBfX2RlcGVuZGVuY3kxNV9fLkRhdGVUcmFuc2Zvcm07CiAg ICB2YXIgTnVtYmVyVHJhbnNmb3JtID0gX19kZXBlbmRlbmN5MTVfXy5OdW1i ZXJUcmFuc2Zvcm07CiAgICB2YXIgU3RyaW5nVHJhbnNmb3JtID0gX19kZXBl bmRlbmN5MTVfXy5TdHJpbmdUcmFuc2Zvcm07CiAgICB2YXIgQm9vbGVhblRy YW5zZm9ybSA9IF9fZGVwZW5kZW5jeTE1X18uQm9vbGVhblRyYW5zZm9ybTsK CiAgICB2YXIgaGFzTWFueSA9IF9fZGVwZW5kZW5jeTE2X18uaGFzTWFueTsK ICAgIHZhciBiZWxvbmdzVG8gPSBfX2RlcGVuZGVuY3kxNl9fLmJlbG9uZ3NU bzsKCiAgICB2YXIgQ29udGFpbmVyUHJveHkgPSBfX2RlcGVuZGVuY3kxOF9f WyJkZWZhdWx0Il07CgogICAgRFMuU3RvcmUgICAgICAgICA9IFN0b3JlOwog ICAgRFMuUHJvbWlzZUFycmF5ICA9IFByb21pc2VBcnJheTsKICAgIERTLlBy b21pc2VPYmplY3QgPSBQcm9taXNlT2JqZWN0OwoKICAgIERTLk1vZGVsICAg ICA9IE1vZGVsOwogICAgRFMuUm9vdFN0YXRlID0gUm9vdFN0YXRlOwogICAg RFMuYXR0ciAgICAgID0gYXR0cjsKICAgIERTLkVycm9ycyAgICA9IEVycm9y czsKCiAgICBEUy5BdHRyaWJ1dGVDaGFuZ2UgICAgICAgPSBBdHRyaWJ1dGVD aGFuZ2U7CiAgICBEUy5SZWxhdGlvbnNoaXBDaGFuZ2UgICAgPSBSZWxhdGlv bnNoaXBDaGFuZ2U7CiAgICBEUy5SZWxhdGlvbnNoaXBDaGFuZ2VBZGQgPSBS ZWxhdGlvbnNoaXBDaGFuZ2VBZGQ7CiAgICBEUy5PbmVUb01hbnlDaGFuZ2Ug ICAgICAgPSBPbmVUb01hbnlDaGFuZ2U7CiAgICBEUy5NYW55VG9Ob25lQ2hh bmdlICAgICAgPSBPbmVUb01hbnlDaGFuZ2U7CiAgICBEUy5PbmVUb09uZUNo YW5nZSAgICAgICAgPSBPbmVUb09uZUNoYW5nZTsKICAgIERTLk1hbnlUb01h bnlDaGFuZ2UgICAgICA9IE1hbnlUb01hbnlDaGFuZ2U7CgogICAgRFMuQWRh cHRlciAgICAgID0gQWRhcHRlcjsKICAgIERTLkludmFsaWRFcnJvciA9IElu dmFsaWRFcnJvcjsKCiAgICBEUy5EZWJ1Z0FkYXB0ZXIgPSBEZWJ1Z0FkYXB0 ZXI7CgogICAgRFMuUmVjb3JkQXJyYXkgICAgICAgICAgICAgICAgID0gUmVj b3JkQXJyYXk7CiAgICBEUy5GaWx0ZXJlZFJlY29yZEFycmF5ICAgICAgICAg PSBGaWx0ZXJlZFJlY29yZEFycmF5OwogICAgRFMuQWRhcHRlclBvcHVsYXRl ZFJlY29yZEFycmF5ID0gQWRhcHRlclBvcHVsYXRlZFJlY29yZEFycmF5Owog ICAgRFMuTWFueUFycmF5ICAgICAgICAgICAgICAgICAgID0gTWFueUFycmF5 OwoKICAgIERTLlJlY29yZEFycmF5TWFuYWdlciA9IFJlY29yZEFycmF5TWFu YWdlcjsKCiAgICBEUy5SRVNUQWRhcHRlciAgICA9IFJFU1RBZGFwdGVyOwog ICAgRFMuRml4dHVyZUFkYXB0ZXIgPSBGaXh0dXJlQWRhcHRlcjsKCiAgICBE Uy5SRVNUU2VyaWFsaXplciA9IFJFU1RTZXJpYWxpemVyOwogICAgRFMuSlNP TlNlcmlhbGl6ZXIgPSBKU09OU2VyaWFsaXplcjsKCiAgICBEUy5UcmFuc2Zv cm0gICAgICAgPSBUcmFuc2Zvcm07CiAgICBEUy5EYXRlVHJhbnNmb3JtICAg PSBEYXRlVHJhbnNmb3JtOwogICAgRFMuU3RyaW5nVHJhbnNmb3JtID0gU3Ry aW5nVHJhbnNmb3JtOwogICAgRFMuTnVtYmVyVHJhbnNmb3JtID0gTnVtYmVy VHJhbnNmb3JtOwogICAgRFMuQm9vbGVhblRyYW5zZm9ybSA9IEJvb2xlYW5U cmFuc2Zvcm07CgogICAgRFMuQWN0aXZlTW9kZWxBZGFwdGVyICAgID0gQWN0 aXZlTW9kZWxBZGFwdGVyOwogICAgRFMuQWN0aXZlTW9kZWxTZXJpYWxpemVy ID0gQWN0aXZlTW9kZWxTZXJpYWxpemVyOwogICAgRFMuRW1iZWRkZWRSZWNv cmRzTWl4aW4gID0gRW1iZWRkZWRSZWNvcmRzTWl4aW47CgogICAgRFMuYmVs b25nc1RvID0gYmVsb25nc1RvOwogICAgRFMuaGFzTWFueSAgID0gaGFzTWFu eTsKCiAgICBEUy5Db250YWluZXJQcm94eSA9IENvbnRhaW5lclByb3h5OwoK ICAgIF9fZXhwb3J0c19fWyJkZWZhdWx0Il0gPSBEUzsKICB9KTsKZGVmaW5l KCJlbWJlci1kYXRhL2xpYi9zZXJpYWxpemVycyIsIAogIFsiLi9zZXJpYWxp emVycy9qc29uX3NlcmlhbGl6ZXIiLCIuL3NlcmlhbGl6ZXJzL3Jlc3Rfc2Vy aWFsaXplciIsImV4cG9ydHMiXSwKICBmdW5jdGlvbihfX2RlcGVuZGVuY3kx X18sIF9fZGVwZW5kZW5jeTJfXywgX19leHBvcnRzX18pIHsKICAgICJ1c2Ug c3RyaWN0IjsKICAgIHZhciBKU09OU2VyaWFsaXplciA9IF9fZGVwZW5kZW5j eTFfX1siZGVmYXVsdCJdOwogICAgdmFyIFJFU1RTZXJpYWxpemVyID0gX19k ZXBlbmRlbmN5Ml9fWyJkZWZhdWx0Il07CgogICAgX19leHBvcnRzX18uSlNP TlNlcmlhbGl6ZXIgPSBKU09OU2VyaWFsaXplcjsKICAgIF9fZXhwb3J0c19f LlJFU1RTZXJpYWxpemVyID0gUkVTVFNlcmlhbGl6ZXI7CiAgfSk7CmRlZmlu ZSgiZW1iZXItZGF0YS9saWIvc2VyaWFsaXplcnMvanNvbl9zZXJpYWxpemVy IiwgCiAgWyJleHBvcnRzIl0sCiAgZnVuY3Rpb24oX19leHBvcnRzX18pIHsK ICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZhciBnZXQgPSBFbWJlci5nZXQsIHNl dCA9IEVtYmVyLnNldCwgaXNOb25lID0gRW1iZXIuaXNOb25lOwoKICAgIC8q KgogICAgICBJbiBFbWJlciBEYXRhIGEgU2VyaWFsaXplciBpcyB1c2VkIHRv IHNlcmlhbGl6ZSBhbmQgZGVzZXJpYWxpemUKICAgICAgcmVjb3JkcyB3aGVu IHRoZXkgYXJlIHRyYW5zZmVycmVkIGluIGFuZCBvdXQgb2YgYW4gZXh0ZXJu YWwgc291cmNlLgogICAgICBUaGlzIHByb2Nlc3MgaW52b2x2ZXMgbm9ybWFs aXppbmcgcHJvcGVydHkgbmFtZXMsIHRyYW5zZm9ybWluZwogICAgICBhdHRy aWJ1dGUgdmFsdWVzIGFuZCBzZXJpYWxpemluZyByZWxhdGlvbnNoaXBzLgoK ICAgICAgRm9yIG1heGltdW0gcGVyZm9ybWFuY2UgRW1iZXIgRGF0YSByZWNv bW1lbmRzIHlvdSB1c2UgdGhlCiAgICAgIFtSRVNUU2VyaWFsaXplcl0oRFMu UkVTVFNlcmlhbGl6ZXIuaHRtbCkgb3Igb25lIG9mIGl0cyBzdWJjbGFzc2Vz LgoKICAgICAgYEpTT05TZXJpYWxpemVyYCBpcyB1c2VmdWwgZm9yIHNpbXBs ZXIgb3IgbGVnYWN5IGJhY2tlbmRzIHRoYXQgbWF5CiAgICAgIG5vdCBzdXBw b3J0IHRoZSBodHRwOi8vanNvbmFwaS5vcmcvIHNwZWMuCgogICAgICBAY2xh c3MgSlNPTlNlcmlhbGl6ZXIKICAgICAgQG5hbWVzcGFjZSBEUwogICAgKi8K ICAgIHZhciBKU09OU2VyaWFsaXplciA9IEVtYmVyLk9iamVjdC5leHRlbmQo ewogICAgICAvKioKICAgICAgICBUaGUgcHJpbWFyeUtleSBpcyB1c2VkIHdo ZW4gc2VyaWFsaXppbmcgYW5kIGRlc2VyaWFsaXppbmcKICAgICAgICBkYXRh LiBFbWJlciBEYXRhIGFsd2F5cyB1c2VzIHRoZSBgaWRgIHByb3BlcnR5IHRv IHN0b3JlIHRoZSBpZCBvZgogICAgICAgIHRoZSByZWNvcmQuIFRoZSBleHRl cm5hbCBzb3VyY2UgbWF5IG5vdCBhbHdheXMgZm9sbG93IHRoaXMKICAgICAg ICBjb252ZW50aW9uLiBJbiB0aGVzZSBjYXNlcyBpdCBpcyB1c2VmdWwgdG8g b3ZlcnJpZGUgdGhlCiAgICAgICAgcHJpbWFyeUtleSBwcm9wZXJ0eSB0byBt YXRjaCB0aGUgcHJpbWFyeUtleSBvZiB5b3VyIGV4dGVybmFsCiAgICAgICAg c3RvcmUuCgogICAgICAgIEV4YW1wbGUKCiAgICAgICAgYGBgamF2YXNjcmlw dAogICAgICAgIEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6ZXIgPSBEUy5KU09O U2VyaWFsaXplci5leHRlbmQoewogICAgICAgICAgcHJpbWFyeUtleTogJ19p ZCcKICAgICAgICB9KTsKICAgICAgICBgYGAKCiAgICAgICAgQHByb3BlcnR5 IHByaW1hcnlLZXkKICAgICAgICBAdHlwZSB7U3RyaW5nfQogICAgICAgIEBk ZWZhdWx0ICdpZCcKICAgICAgKi8KICAgICAgcHJpbWFyeUtleTogJ2lkJywK CiAgICAgIC8qKgogICAgICAgR2l2ZW4gYSBzdWJjbGFzcyBvZiBgRFMuTW9k ZWxgIGFuZCBhIEpTT04gb2JqZWN0IHRoaXMgbWV0aG9kIHdpbGwKICAgICAg IGl0ZXJhdGUgdGhyb3VnaCBlYWNoIGF0dHJpYnV0ZSBvZiB0aGUgYERTLk1v ZGVsYCBhbmQgaW52b2tlIHRoZQogICAgICAgYERTLlRyYW5zZm9ybSNkZXNl cmlhbGl6ZWAgbWV0aG9kIG9uIHRoZSBtYXRjaGluZyBwcm9wZXJ0eSBvZiB0 aGUKICAgICAgIEpTT04gb2JqZWN0LiAgVGhpcyBtZXRob2QgaXMgdHlwaWNh bGx5IGNhbGxlZCBhZnRlciB0aGUKICAgICAgIHNlcmlhbGl6ZXIncyBgbm9y bWFsaXplYCBtZXRob2QuCgogICAgICAgQG1ldGhvZCBhcHBseVRyYW5zZm9y bXMKICAgICAgIEBwcml2YXRlCiAgICAgICBAcGFyYW0ge3N1YmNsYXNzIG9m IERTLk1vZGVsfSB0eXBlCiAgICAgICBAcGFyYW0ge09iamVjdH0gZGF0YSBU aGUgZGF0YSB0byB0cmFuc2Zvcm0KICAgICAgIEByZXR1cm4ge09iamVjdH0g ZGF0YSBUaGUgdHJhbnNmb3JtZWQgZGF0YSBvYmplY3QKICAgICAgKi8KICAg ICAgYXBwbHlUcmFuc2Zvcm1zOiBmdW5jdGlvbih0eXBlLCBkYXRhKSB7CiAg ICAgICAgdHlwZS5lYWNoVHJhbnNmb3JtZWRBdHRyaWJ1dGUoZnVuY3Rpb24o a2V5LCB0eXBlKSB7CiAgICAgICAgICB2YXIgdHJhbnNmb3JtID0gdGhpcy50 cmFuc2Zvcm1Gb3IodHlwZSk7CiAgICAgICAgICBkYXRhW2tleV0gPSB0cmFu c2Zvcm0uZGVzZXJpYWxpemUoZGF0YVtrZXldKTsKICAgICAgICB9LCB0aGlz KTsKCiAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgIH0sCgogICAgICAvKioK ICAgICAgICBOb3JtYWxpemVzIGEgcGFydCBvZiB0aGUgSlNPTiBwYXlsb2Fk IHJldHVybmVkIGJ5CiAgICAgICAgdGhlIHNlcnZlci4gWW91IHNob3VsZCBv dmVycmlkZSB0aGlzIG1ldGhvZCwgbXVuZ2UgdGhlIGhhc2gKICAgICAgICBh bmQgY2FsbCBzdXBlciBpZiB5b3UgaGF2ZSBnZW5lcmljIG5vcm1hbGl6YXRp b24gdG8gZG8uCgogICAgICAgIEl0IHRha2VzIHRoZSB0eXBlIG9mIHRoZSBy ZWNvcmQgdGhhdCBpcyBiZWluZyBub3JtYWxpemVkCiAgICAgICAgKGFzIGEg RFMuTW9kZWwgY2xhc3MpLCB0aGUgcHJvcGVydHkgd2hlcmUgdGhlIGhhc2gg d2FzCiAgICAgICAgb3JpZ2luYWxseSBmb3VuZCwgYW5kIHRoZSBoYXNoIHRv IG5vcm1hbGl6ZS4KCiAgICAgICAgWW91IGNhbiB1c2UgdGhpcyBtZXRob2Qs IGZvciBleGFtcGxlLCB0byBub3JtYWxpemUgdW5kZXJzY29yZWQga2V5cyB0 byBjYW1lbGl6ZWQKICAgICAgICBvciBvdGhlciBnZW5lcmFsLXB1cnBvc2Ug bm9ybWFsaXphdGlvbnMuCgogICAgICAgIEV4YW1wbGUKCiAgICAgICAgYGBg amF2YXNjcmlwdAogICAgICAgIEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6ZXIg PSBEUy5KU09OU2VyaWFsaXplci5leHRlbmQoewogICAgICAgICAgbm9ybWFs aXplOiBmdW5jdGlvbih0eXBlLCBoYXNoKSB7CiAgICAgICAgICAgIHZhciBm aWVsZHMgPSBFbWJlci5nZXQodHlwZSwgJ2ZpZWxkcycpOwogICAgICAgICAg ICBmaWVsZHMuZm9yRWFjaChmdW5jdGlvbihmaWVsZCkgewogICAgICAgICAg ICAgIHZhciBwYXlsb2FkRmllbGQgPSBFbWJlci5TdHJpbmcudW5kZXJzY29y ZShmaWVsZCk7CiAgICAgICAgICAgICAgaWYgKGZpZWxkID09PSBwYXlsb2Fk RmllbGQpIHsgcmV0dXJuOyB9CgogICAgICAgICAgICAgIGhhc2hbZmllbGRd ID0gaGFzaFtwYXlsb2FkRmllbGRdOwogICAgICAgICAgICAgIGRlbGV0ZSBo YXNoW3BheWxvYWRGaWVsZF07CiAgICAgICAgICAgIH0pOwogICAgICAgICAg ICByZXR1cm4gdGhpcy5fc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsK ICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBgYGAKCiAgICAgICAg QG1ldGhvZCBub3JtYWxpemUKICAgICAgICBAcGFyYW0ge3N1YmNsYXNzIG9m IERTLk1vZGVsfSB0eXBlCiAgICAgICAgQHBhcmFtIHtPYmplY3R9IGhhc2gK ICAgICAgICBAcmV0dXJuIHtPYmplY3R9CiAgICAgICovCiAgICAgIG5vcm1h bGl6ZTogZnVuY3Rpb24odHlwZSwgaGFzaCkgewogICAgICAgIGlmICghaGFz aCkgeyByZXR1cm4gaGFzaDsgfQoKICAgICAgICB0aGlzLmFwcGx5VHJhbnNm b3Jtcyh0eXBlLCBoYXNoKTsKICAgICAgICByZXR1cm4gaGFzaDsKICAgICAg fSwKCiAgICAgIC8vIFNFUklBTElaRQogICAgICAvKioKICAgICAgICBDYWxs ZWQgd2hlbiBhIHJlY29yZCBpcyBzYXZlZCBpbiBvcmRlciB0byBjb252ZXJ0 IHRoZQogICAgICAgIHJlY29yZCBpbnRvIEpTT04uCgogICAgICAgIEJ5IGRl ZmF1bHQsIGl0IGNyZWF0ZXMgYSBKU09OIG9iamVjdCB3aXRoIGEga2V5IGZv cgogICAgICAgIGVhY2ggYXR0cmlidXRlIGFuZCBiZWxvbmdzVG8gcmVsYXRp b25zaGlwLgoKICAgICAgICBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhpcyBt b2RlbDoKCiAgICAgICAgYGBgamF2YXNjcmlwdAogICAgICAgIEFwcC5Db21t ZW50ID0gRFMuTW9kZWwuZXh0ZW5kKHsKICAgICAgICAgIHRpdGxlOiBEUy5h dHRyKCksCiAgICAgICAgICBib2R5OiBEUy5hdHRyKCksCgogICAgICAgICAg YXV0aG9yOiBEUy5iZWxvbmdzVG8oJ3VzZXInKQogICAgICAgIH0pOwogICAg ICAgIGBgYAoKICAgICAgICBUaGUgZGVmYXVsdCBzZXJpYWxpemF0aW9uIHdv dWxkIGNyZWF0ZSBhIEpTT04gb2JqZWN0IGxpa2U6CgogICAgICAgIGBgYGph dmFzY3JpcHQKICAgICAgICB7CiAgICAgICAgICAidGl0bGUiOiAiUmFpbHMg aXMgdW5hZ2kiLAogICAgICAgICAgImJvZHkiOiAiUmFpbHM/IE9tYWthc2U/ IE9fTyIsCiAgICAgICAgICAiYXV0aG9yIjogMTIKICAgICAgICB9CiAgICAg ICAgYGBgCgogICAgICAgIEJ5IGRlZmF1bHQsIGF0dHJpYnV0ZXMgYXJlIHBh c3NlZCB0aHJvdWdoIGFzLWlzLCB1bmxlc3MKICAgICAgICB5b3Ugc3BlY2lm aWVkIGFuIGF0dHJpYnV0ZSB0eXBlIChgRFMuYXR0cignZGF0ZScpYCkuIElm CiAgICAgICAgeW91IHNwZWNpZnkgYSB0cmFuc2Zvcm0sIHRoZSBKYXZhU2Ny aXB0IHZhbHVlIHdpbGwgYmUKICAgICAgICBzZXJpYWxpemVkIHdoZW4gaW5z ZXJ0ZWQgaW50byB0aGUgSlNPTiBoYXNoLgoKICAgICAgICBCeSBkZWZhdWx0 LCBiZWxvbmdzLXRvIHJlbGF0aW9uc2hpcHMgYXJlIGNvbnZlcnRlZCBpbnRv CiAgICAgICAgSURzIHdoZW4gaW5zZXJ0ZWQgaW50byB0aGUgSlNPTiBoYXNo LgoKICAgICAgICAjIyBJRHMKCiAgICAgICAgYHNlcmlhbGl6ZWAgdGFrZXMg YW4gb3B0aW9ucyBoYXNoIHdpdGggYSBzaW5nbGUgb3B0aW9uOgogICAgICAg IGBpbmNsdWRlSWRgLiBJZiB0aGlzIG9wdGlvbiBpcyBgdHJ1ZWAsIGBzZXJp YWxpemVgIHdpbGwsCiAgICAgICAgYnkgZGVmYXVsdCBpbmNsdWRlIHRoZSBJ RCBpbiB0aGUgSlNPTiBvYmplY3QgaXQgYnVpbGRzLgoKICAgICAgICBUaGUg YWRhcHRlciBwYXNzZXMgaW4gYGluY2x1ZGVJZDogdHJ1ZWAgd2hlbiBzZXJp YWxpemluZwogICAgICAgIGEgcmVjb3JkIGZvciBgY3JlYXRlUmVjb3JkYCwg YnV0IG5vdCBmb3IgYHVwZGF0ZVJlY29yZGAuCgogICAgICAgICMjIEN1c3Rv bWl6YXRpb24KCiAgICAgICAgWW91ciBzZXJ2ZXIgbWF5IGV4cGVjdCBhIGRp ZmZlcmVudCBKU09OIGZvcm1hdCB0aGFuIHRoZQogICAgICAgIGJ1aWx0LWlu IHNlcmlhbGl6YXRpb24gZm9ybWF0LgoKICAgICAgICBJbiB0aGF0IGNhc2Us IHlvdSBjYW4gaW1wbGVtZW50IGBzZXJpYWxpemVgIHlvdXJzZWxmIGFuZAog ICAgICAgIHJldHVybiBhIEpTT04gaGFzaCBvZiB5b3VyIGNob29zaW5nLgoK ICAgICAgICBgYGBqYXZhc2NyaXB0CiAgICAgICAgQXBwLlBvc3RTZXJpYWxp emVyID0gRFMuSlNPTlNlcmlhbGl6ZXIuZXh0ZW5kKHsKICAgICAgICAgIHNl cmlhbGl6ZTogZnVuY3Rpb24ocG9zdCwgb3B0aW9ucykgewogICAgICAgICAg ICB2YXIganNvbiA9IHsKICAgICAgICAgICAgICBQT1NUX1RUTDogcG9zdC5n ZXQoJ3RpdGxlJyksCiAgICAgICAgICAgICAgUE9TVF9CRFk6IHBvc3QuZ2V0 KCdib2R5JyksCiAgICAgICAgICAgICAgUE9TVF9DTVM6IHBvc3QuZ2V0KCdj b21tZW50cycpLm1hcFByb3BlcnR5KCdpZCcpCiAgICAgICAgICAgIH0KCiAg ICAgICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVJZCkgewogICAgICAgICAg ICAgIGpzb24uUE9TVF9JRF8gPSBwb3N0LmdldCgnaWQnKTsKICAgICAgICAg ICAgfQoKICAgICAgICAgICAgcmV0dXJuIGpzb247CiAgICAgICAgICB9CiAg ICAgICAgfSk7CiAgICAgICAgYGBgCgogICAgICAgICMjIEN1c3RvbWl6aW5n IGFuIEFwcC1XaWRlIFNlcmlhbGl6ZXIKCiAgICAgICAgSWYgeW91IHdhbnQg dG8gZGVmaW5lIGEgc2VyaWFsaXplciBmb3IgeW91ciBlbnRpcmUKICAgICAg ICBhcHBsaWNhdGlvbiwgeW91J2xsIHByb2JhYmx5IHdhbnQgdG8gdXNlIGBl YWNoQXR0cmlidXRlYAogICAgICAgIGFuZCBgZWFjaFJlbGF0aW9uc2hpcGAg b24gdGhlIHJlY29yZC4KCiAgICAgICAgYGBgamF2YXNjcmlwdAogICAgICAg IEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6ZXIgPSBEUy5KU09OU2VyaWFsaXpl ci5leHRlbmQoewogICAgICAgICAgc2VyaWFsaXplOiBmdW5jdGlvbihyZWNv cmQsIG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGpzb24gPSB7fTsKCiAg ICAgICAgICAgIHJlY29yZC5lYWNoQXR0cmlidXRlKGZ1bmN0aW9uKG5hbWUp IHsKICAgICAgICAgICAgICBqc29uW3NlcnZlckF0dHJpYnV0ZU5hbWUobmFt ZSldID0gcmVjb3JkLmdldChuYW1lKTsKICAgICAgICAgICAgfSkKCiAgICAg ICAgICAgIHJlY29yZC5lYWNoUmVsYXRpb25zaGlwKGZ1bmN0aW9uKG5hbWUs IHJlbGF0aW9uc2hpcCkgewogICAgICAgICAgICAgIGlmIChyZWxhdGlvbnNo aXAua2luZCA9PT0gJ2hhc01hbnknKSB7CiAgICAgICAgICAgICAgICBqc29u W3NlcnZlckhhc01hbnlOYW1lKG5hbWUpXSA9IHJlY29yZC5nZXQobmFtZSku bWFwQnkoJ2lkJyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsK CiAgICAgICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVJZCkgewogICAgICAg ICAgICAgIGpzb24uSURfID0gcmVjb3JkLmdldCgnaWQnKTsKICAgICAgICAg ICAgfQoKICAgICAgICAgICAgcmV0dXJuIGpzb247CiAgICAgICAgICB9CiAg ICAgICAgfSk7CgogICAgICAgIGZ1bmN0aW9uIHNlcnZlckF0dHJpYnV0ZU5h bWUoYXR0cmlidXRlKSB7CiAgICAgICAgICByZXR1cm4gYXR0cmlidXRlLnVu ZGVyc2NvcmUoKS50b1VwcGVyQ2FzZSgpOwogICAgICAgIH0KCiAgICAgICAg ZnVuY3Rpb24gc2VydmVySGFzTWFueU5hbWUobmFtZSkgewogICAgICAgICAg cmV0dXJuIHNlcnZlckF0dHJpYnV0ZU5hbWUobmFtZS5zaW5ndWxhcml6ZSgp KSArICJfSURTIjsKICAgICAgICB9CiAgICAgICAgYGBgCgogICAgICAgIFRo aXMgc2VyaWFsaXplciB3aWxsIGdlbmVyYXRlIEpTT04gdGhhdCBsb29rcyBs aWtlIHRoaXM6CgogICAgICAgIGBgYGphdmFzY3JpcHQKICAgICAgICB7CiAg ICAgICAgICAiVElUTEUiOiAiUmFpbHMgaXMgb21ha2FzZSIsCiAgICAgICAg ICAiQk9EWSI6ICJZZXAuIE9tYWthc2UuIiwKICAgICAgICAgICJDT01NRU5U X0lEUyI6IFsgMSwgMiwgMyBdCiAgICAgICAgfQogICAgICAgIGBgYAoKICAg ICAgICAjIyBUd2Vha2luZyB0aGUgRGVmYXVsdCBKU09OCgogICAgICAgIElm IHlvdSBqdXN0IHdhbnQgdG8gZG8gc29tZSBzbWFsbCB0d2Vha3Mgb24gdGhl IGRlZmF1bHQgSlNPTiwKICAgICAgICB5b3UgY2FuIGNhbGwgc3VwZXIgZmly c3QgYW5kIG1ha2UgdGhlIHR3ZWFrcyBvbiB0aGUgcmV0dXJuZWQKICAgICAg ICBKU09OLgoKICAgICAgICBgYGBqYXZhc2NyaXB0CiAgICAgICAgQXBwLlBv c3RTZXJpYWxpemVyID0gRFMuSlNPTlNlcmlhbGl6ZXIuZXh0ZW5kKHsKICAg ICAgICAgIHNlcmlhbGl6ZTogZnVuY3Rpb24ocmVjb3JkLCBvcHRpb25zKSB7 CiAgICAgICAgICAgIHZhciBqc29uID0gdGhpcy5fc3VwZXIuYXBwbHkodGhp cywgYXJndW1lbnRzKTsKCiAgICAgICAgICAgIGpzb24uc3ViamVjdCA9IGpz b24udGl0bGU7CiAgICAgICAgICAgIGRlbGV0ZSBqc29uLnRpdGxlOwoKICAg ICAgICAgICAgcmV0dXJuIGpzb247CiAgICAgICAgICB9CiAgICAgICAgfSk7 CiAgICAgICAgYGBgCgogICAgICAgIEBtZXRob2Qgc2VyaWFsaXplCiAgICAg ICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gcmVjb3JkCiAgICAg ICAgQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKICAgICAgICBAcmV0dXJuIHtP YmplY3R9IGpzb24KICAgICAgKi8KICAgICAgc2VyaWFsaXplOiBmdW5jdGlv bihyZWNvcmQsIG9wdGlvbnMpIHsKICAgICAgICB2YXIganNvbiA9IHt9OwoK ICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmluY2x1ZGVJZCkgewog ICAgICAgICAgdmFyIGlkID0gZ2V0KHJlY29yZCwgJ2lkJyk7CgogICAgICAg ICAgaWYgKGlkKSB7CiAgICAgICAgICAgIGpzb25bZ2V0KHRoaXMsICdwcmlt YXJ5S2V5JyldID0gaWQ7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAg ICByZWNvcmQuZWFjaEF0dHJpYnV0ZShmdW5jdGlvbihrZXksIGF0dHJpYnV0 ZSkgewogICAgICAgICAgdGhpcy5zZXJpYWxpemVBdHRyaWJ1dGUocmVjb3Jk LCBqc29uLCBrZXksIGF0dHJpYnV0ZSk7CiAgICAgICAgfSwgdGhpcyk7Cgog ICAgICAgIHJlY29yZC5lYWNoUmVsYXRpb25zaGlwKGZ1bmN0aW9uKGtleSwg cmVsYXRpb25zaGlwKSB7CiAgICAgICAgICBpZiAocmVsYXRpb25zaGlwLmtp bmQgPT09ICdiZWxvbmdzVG8nKSB7CiAgICAgICAgICAgIHRoaXMuc2VyaWFs aXplQmVsb25nc1RvKHJlY29yZCwganNvbiwgcmVsYXRpb25zaGlwKTsKICAg ICAgICAgIH0gZWxzZSBpZiAocmVsYXRpb25zaGlwLmtpbmQgPT09ICdoYXNN YW55JykgewogICAgICAgICAgICB0aGlzLnNlcmlhbGl6ZUhhc01hbnkocmVj b3JkLCBqc29uLCByZWxhdGlvbnNoaXApOwogICAgICAgICAgfQogICAgICAg IH0sIHRoaXMpOwoKICAgICAgICByZXR1cm4ganNvbjsKICAgICAgfSwKCiAg ICAgIC8qKgogICAgICAgYHNlcmlhbGl6ZUF0dHJpYnV0ZWAgY2FuIGJlIHVz ZWQgdG8gY3VzdG9taXplIGhvdyBgRFMuYXR0cmAKICAgICAgIHByb3BlcnRp ZXMgYXJlIHNlcmlhbGl6ZWQKCiAgICAgICBGb3IgZXhhbXBsZSBpZiB5b3Ug d2FudGVkIHRvIGVuc3VyZSBhbGwgeW91IGF0dHJpYnV0ZXMgd2VyZSBhbHdh eXMKICAgICAgIHNlcmlhbGl6ZWQgYXMgcHJvcGVydGllcyBvbiBhbiBgYXR0 cmlidXRlc2Agb2JqZWN0IHlvdSBjb3VsZAogICAgICAgd3JpdGU6CgogICAg ICAgYGBgamF2YXNjcmlwdAogICAgICAgQXBwLkFwcGxpY2F0aW9uU2VyaWFs aXplciA9IERTLkpTT05TZXJpYWxpemVyLmV4dGVuZCh7CiAgICAgICAgIHNl cmlhbGl6ZUF0dHJpYnV0ZTogZnVuY3Rpb24ocmVjb3JkLCBqc29uLCBrZXks IGF0dHJpYnV0ZXMpIHsKICAgICAgICAgICBqc29uLmF0dHJpYnV0ZXMgPSBq c29uLmF0dHJpYnV0ZXMgfHwge307CiAgICAgICAgICAgdGhpcy5fc3VwZXIo cmVjb3JkLCBqc29uLmF0dHJpYnV0ZXMsIGtleSwgYXR0cmlidXRlcyk7CiAg ICAgICAgIH0KICAgICAgIH0pOwogICAgICAgYGBgCgogICAgICAgQG1ldGhv ZCBzZXJpYWxpemVBdHRyaWJ1dGUKICAgICAgIEBwYXJhbSB7RFMuTW9kZWx9 IHJlY29yZAogICAgICAgQHBhcmFtIHtPYmplY3R9IGpzb24KICAgICAgIEBw YXJhbSB7U3RyaW5nfSBrZXkKICAgICAgIEBwYXJhbSB7T2JqZWN0fSBhdHRy aWJ1dGUKICAgICAgKi8KICAgICAgc2VyaWFsaXplQXR0cmlidXRlOiBmdW5j dGlvbihyZWNvcmQsIGpzb24sIGtleSwgYXR0cmlidXRlKSB7CiAgICAgICAg dmFyIGF0dHJzID0gZ2V0KHRoaXMsICdhdHRycycpOwogICAgICAgIHZhciB2 YWx1ZSA9IGdldChyZWNvcmQsIGtleSksIHR5cGUgPSBhdHRyaWJ1dGUudHlw ZTsKCiAgICAgICAgaWYgKHR5cGUpIHsKICAgICAgICAgIHZhciB0cmFuc2Zv cm0gPSB0aGlzLnRyYW5zZm9ybUZvcih0eXBlKTsKICAgICAgICAgIHZhbHVl ID0gdHJhbnNmb3JtLnNlcmlhbGl6ZSh2YWx1ZSk7CiAgICAgICAgfQoKICAg ICAgICAvLyBpZiBwcm92aWRlZCwgdXNlIHRoZSBtYXBwaW5nIHByb3ZpZGVk IGJ5IGBhdHRyc2AgaW4KICAgICAgICAvLyB0aGUgc2VyaWFsaXplcgogICAg ICAgIGtleSA9IGF0dHJzICYmIGF0dHJzW2tleV0gfHwgKHRoaXMua2V5Rm9y QXR0cmlidXRlID8gdGhpcy5rZXlGb3JBdHRyaWJ1dGUoa2V5KSA6IGtleSk7 CgogICAgICAgIGpzb25ba2V5XSA9IHZhbHVlOwogICAgICB9LAoKICAgICAg LyoqCiAgICAgICBgc2VyaWFsaXplQmVsb25nc1RvYCBjYW4gYmUgdXNlZCB0 byBjdXN0b21pemUgaG93IGBEUy5iZWxvbmdzVG9gCiAgICAgICBwcm9wZXJ0 aWVzIGFyZSBzZXJpYWxpemVkLgoKICAgICAgIEV4YW1wbGUKCiAgICAgICBg YGBqYXZhc2NyaXB0CiAgICAgICBBcHAuUG9zdFNlcmlhbGl6ZXIgPSBEUy5K U09OU2VyaWFsaXplci5leHRlbmQoewogICAgICAgICBzZXJpYWxpemVCZWxv bmdzVG86IGZ1bmN0aW9uKHJlY29yZCwganNvbiwgcmVsYXRpb25zaGlwKSB7 CiAgICAgICAgICAgdmFyIGtleSA9IHJlbGF0aW9uc2hpcC5rZXk7CgogICAg ICAgICAgIHZhciBiZWxvbmdzVG8gPSBnZXQocmVjb3JkLCBrZXkpOwoKICAg ICAgICAgICBrZXkgPSB0aGlzLmtleUZvclJlbGF0aW9uc2hpcCA/IHRoaXMu a2V5Rm9yUmVsYXRpb25zaGlwKGtleSwgImJlbG9uZ3NUbyIpIDoga2V5OwoK ICAgICAgICAgICBqc29uW2tleV0gPSBFbWJlci5pc05vbmUoYmVsb25nc1Rv KSA/IGJlbG9uZ3NUbyA6IGJlbG9uZ3NUby50b0pTT04oKTsKICAgICAgICAg fQogICAgICAgfSk7CiAgICAgICBgYGAKCiAgICAgICBAbWV0aG9kIHNlcmlh bGl6ZUJlbG9uZ3NUbwogICAgICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3Jk CiAgICAgICBAcGFyYW0ge09iamVjdH0ganNvbgogICAgICAgQHBhcmFtIHtP YmplY3R9IHJlbGF0aW9uc2hpcAogICAgICAqLwogICAgICBzZXJpYWxpemVC ZWxvbmdzVG86IGZ1bmN0aW9uKHJlY29yZCwganNvbiwgcmVsYXRpb25zaGlw KSB7CiAgICAgICAgdmFyIGtleSA9IHJlbGF0aW9uc2hpcC5rZXk7CgogICAg ICAgIHZhciBiZWxvbmdzVG8gPSBnZXQocmVjb3JkLCBrZXkpOwoKICAgICAg ICBrZXkgPSB0aGlzLmtleUZvclJlbGF0aW9uc2hpcCA/IHRoaXMua2V5Rm9y UmVsYXRpb25zaGlwKGtleSwgImJlbG9uZ3NUbyIpIDoga2V5OwoKICAgICAg ICBpZiAoaXNOb25lKGJlbG9uZ3NUbykpIHsKICAgICAgICAgIGpzb25ba2V5 XSA9IGJlbG9uZ3NUbzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAganNv bltrZXldID0gZ2V0KGJlbG9uZ3NUbywgJ2lkJyk7CiAgICAgICAgfQoKICAg ICAgICBpZiAocmVsYXRpb25zaGlwLm9wdGlvbnMucG9seW1vcnBoaWMpIHsK ICAgICAgICAgIHRoaXMuc2VyaWFsaXplUG9seW1vcnBoaWNUeXBlKHJlY29y ZCwganNvbiwgcmVsYXRpb25zaGlwKTsKICAgICAgICB9CiAgICAgIH0sCgog ICAgICAvKioKICAgICAgIGBzZXJpYWxpemVIYXNNYW55YCBjYW4gYmUgdXNl ZCB0byBjdXN0b21pemUgaG93IGBEUy5oYXNNYW55YAogICAgICAgcHJvcGVy dGllcyBhcmUgc2VyaWFsaXplZC4KCiAgICAgICBFeGFtcGxlCgogICAgICAg YGBgamF2YXNjcmlwdAogICAgICAgQXBwLlBvc3RTZXJpYWxpemVyID0gRFMu SlNPTlNlcmlhbGl6ZXIuZXh0ZW5kKHsKICAgICAgICAgc2VyaWFsaXplSGFz TWFueTogZnVuY3Rpb24ocmVjb3JkLCBqc29uLCByZWxhdGlvbnNoaXApIHsK ICAgICAgICAgICB2YXIga2V5ID0gcmVsYXRpb25zaGlwLmtleTsKICAgICAg ICAgICBpZiAoa2V5ID09PSAnY29tbWVudHMnKSB7CiAgICAgICAgICAgICBy ZXR1cm47CiAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRoaXMu X3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgfQog ICAgICAgICB9CiAgICAgICB9KTsKICAgICAgIGBgYAoKICAgICAgIEBtZXRo b2Qgc2VyaWFsaXplSGFzTWFueQogICAgICAgQHBhcmFtIHtEUy5Nb2RlbH0g cmVjb3JkCiAgICAgICBAcGFyYW0ge09iamVjdH0ganNvbgogICAgICAgQHBh cmFtIHtPYmplY3R9IHJlbGF0aW9uc2hpcAogICAgICAqLwogICAgICBzZXJp YWxpemVIYXNNYW55OiBmdW5jdGlvbihyZWNvcmQsIGpzb24sIHJlbGF0aW9u c2hpcCkgewogICAgICAgIHZhciBrZXkgPSByZWxhdGlvbnNoaXAua2V5OwoK ICAgICAgICB2YXIgcmVsYXRpb25zaGlwVHlwZSA9IERTLlJlbGF0aW9uc2hp cENoYW5nZS5kZXRlcm1pbmVSZWxhdGlvbnNoaXBUeXBlKHJlY29yZC5jb25z dHJ1Y3RvciwgcmVsYXRpb25zaGlwKTsKCiAgICAgICAgaWYgKHJlbGF0aW9u c2hpcFR5cGUgPT09ICdtYW55VG9Ob25lJyB8fCByZWxhdGlvbnNoaXBUeXBl ID09PSAnbWFueVRvTWFueScpIHsKICAgICAgICAgIGpzb25ba2V5XSA9IGdl dChyZWNvcmQsIGtleSkubWFwQnkoJ2lkJyk7CiAgICAgICAgICAvLyBUT0RP IHN1cHBvcnQgZm9yIHBvbHltb3JwaGljIG1hbnlUb05vbmUgYW5kIG1hbnlU b01hbnkgcmVsYXRpb25zaGlwcwogICAgICAgIH0KICAgICAgfSwKCiAgICAg IC8qKgogICAgICAgIFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIGN1c3Rv bWl6ZSBob3cgcG9seW1vcnBoaWMgb2JqZWN0cyBhcmUKICAgICAgICBzZXJp YWxpemVkLiBPYmplY3RzIGFyZSBjb25zaWRlcmVkIHRvIGJlIHBvbHltb3Jw aGljIGlmCiAgICAgICAgYHtwb2x5bW9ycGhpYzogdHJ1ZX1gIGlzIHBhc3Mg YXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byB0aGUKICAgICAgICBgRFMuYmVs b25nc1RvYCBmdW5jdGlvbi4KCiAgICAgICAgRXhhbXBsZQoKICAgICAgICBg YGBqYXZhc2NyaXB0CiAgICAgICAgQXBwLkNvbW1lbnRTZXJpYWxpemVyID0g RFMuSlNPTlNlcmlhbGl6ZXIuZXh0ZW5kKHsKICAgICAgICAgIHNlcmlhbGl6 ZVBvbHltb3JwaGljVHlwZTogZnVuY3Rpb24ocmVjb3JkLCBqc29uLCByZWxh dGlvbnNoaXApIHsKICAgICAgICAgICAgdmFyIGtleSA9IHJlbGF0aW9uc2hp cC5rZXksCiAgICAgICAgICAgICAgICBiZWxvbmdzVG8gPSBnZXQocmVjb3Jk LCBrZXkpOwogICAgICAgICAgICBrZXkgPSB0aGlzLmtleUZvckF0dHJpYnV0 ZSA/IHRoaXMua2V5Rm9yQXR0cmlidXRlKGtleSkgOiBrZXk7CiAgICAgICAg ICAgIGpzb25ba2V5ICsgIl90eXBlIl0gPSBiZWxvbmdzVG8uY29uc3RydWN0 b3IudHlwZUtleTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgIGBg YAoKICAgICAgICBAbWV0aG9kIHNlcmlhbGl6ZVBvbHltb3JwaGljVHlwZQog ICAgICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAogICAgICAgIEBwYXJh bSB7T2JqZWN0fSBqc29uCiAgICAgICAgQHBhcmFtIHtPYmplY3R9IHJlbGF0 aW9uc2hpcAogICAgICAqLwogICAgICBzZXJpYWxpemVQb2x5bW9ycGhpY1R5 cGU6IEVtYmVyLkssCgogICAgICAvLyBFWFRSQUNUCgogICAgICAvKioKICAg ICAgICBUaGUgYGV4dHJhY3RgIG1ldGhvZCBpcyB1c2VkIHRvIGRlc2VyaWFs aXplIHBheWxvYWQgZGF0YSBmcm9tIHRoZQogICAgICAgIHNlcnZlci4gQnkg ZGVmYXVsdCB0aGUgYEpTT05TZXJpYWxpemVyYCBkb2VzIG5vdCBwdXNoIHRo ZSByZWNvcmRzCiAgICAgICAgaW50byB0aGUgc3RvcmUuIEhvd2V2ZXIgcmVj b3JkcyB0aGF0IHN1YmNsYXNzIGBKU09OU2VyaWFsaXplcmAKICAgICAgICBz dWNoIGFzIHRoZSBgUkVTVFNlcmlhbGl6ZXJgIG1heSBwdXNoIHJlY29yZHMg aW50byB0aGUgc3RvcmUgYXMKICAgICAgICBwYXJ0IG9mIHRoZSBleHRyYWN0 IGNhbGwuCgogICAgICAgIFRoaXMgbWV0aG9kIGRlbGVnYXRlcyB0byBhIG1v cmUgc3BlY2lmaWMgZXh0cmFjdCBtZXRob2QgYmFzZWQgb24KICAgICAgICB0 aGUgYHJlcXVlc3RUeXBlYC4KCiAgICAgICAgRXhhbXBsZQoKICAgICAgICBg YGBqYXZhc2NyaXB0CiAgICAgICAgdmFyIGdldCA9IEVtYmVyLmdldDsKICAg ICAgICBzb2NrZXQub24oJ21lc3NhZ2UnLCBmdW5jdGlvbihtZXNzYWdlKSB7 CiAgICAgICAgICB2YXIgbW9kZWxOYW1lID0gbWVzc2FnZS5tb2RlbDsKICAg ICAgICAgIHZhciBkYXRhID0gbWVzc2FnZS5kYXRhOwogICAgICAgICAgdmFy IHR5cGUgPSBzdG9yZS5tb2RlbEZvcihtb2RlbE5hbWUpOwogICAgICAgICAg dmFyIHNlcmlhbGl6ZXIgPSBzdG9yZS5zZXJpYWxpemVyRm9yKHR5cGUudHlw ZUtleSk7CiAgICAgICAgICB2YXIgcmVjb3JkID0gc2VyaWFsaXplci5leHRy YWN0KHN0b3JlLCB0eXBlLCBkYXRhLCBnZXQoZGF0YSwgJ2lkJyksICdzaW5n bGUnKTsKICAgICAgICAgIHN0b3JlLnB1c2gobW9kZWxOYW1lLCByZWNvcmQp OwogICAgICAgIH0pOwogICAgICAgIGBgYAoKICAgICAgICBAbWV0aG9kIGV4 dHJhY3QKICAgICAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQogICAgICAg IEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKICAgICAgICBA cGFyYW0ge09iamVjdH0gcGF5bG9hZAogICAgICAgIEBwYXJhbSB7U3RyaW5n IG9yIE51bWJlcn0gaWQKICAgICAgICBAcGFyYW0ge1N0cmluZ30gcmVxdWVz dFR5cGUKICAgICAgICBAcmV0dXJuIHtPYmplY3R9IGpzb24gVGhlIGRlc2Vy aWFsaXplZCBwYXlsb2FkCiAgICAgICovCiAgICAgIGV4dHJhY3Q6IGZ1bmN0 aW9uKHN0b3JlLCB0eXBlLCBwYXlsb2FkLCBpZCwgcmVxdWVzdFR5cGUpIHsK ICAgICAgICB0aGlzLmV4dHJhY3RNZXRhKHN0b3JlLCB0eXBlLCBwYXlsb2Fk KTsKCiAgICAgICAgdmFyIHNwZWNpZmljRXh0cmFjdCA9ICJleHRyYWN0IiAr IHJlcXVlc3RUeXBlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcmVxdWVz dFR5cGUuc3Vic3RyKDEpOwogICAgICAgIHJldHVybiB0aGlzW3NwZWNpZmlj RXh0cmFjdF0oc3RvcmUsIHR5cGUsIHBheWxvYWQsIGlkLCByZXF1ZXN0VHlw ZSk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICBgZXh0cmFjdEZpbmRB bGxgIGlzIGEgaG9vayBpbnRvIHRoZSBleHRyYWN0IG1ldGhvZCB1c2VkIHdo ZW4gYQogICAgICAgIGNhbGwgaXMgbWFkZSB0byBgRFMuU3RvcmUjZmluZEFs bGAuIEJ5IGRlZmF1bHQgdGhpcyBtZXRob2QgaXMgYW4KICAgICAgICBhbGlh cyBmb3IgW2V4dHJhY3RBcnJheV0oI21ldGhvZF9leHRyYWN0QXJyYXkpLgoK ICAgICAgICBAbWV0aG9kIGV4dHJhY3RGaW5kQWxsCiAgICAgICAgQHBhcmFt IHtEUy5TdG9yZX0gc3RvcmUKICAgICAgICBAcGFyYW0ge3N1YmNsYXNzIG9m IERTLk1vZGVsfSB0eXBlCiAgICAgICAgQHBhcmFtIHtPYmplY3R9IHBheWxv YWQKICAgICAgICBAcmV0dXJuIHtBcnJheX0gYXJyYXkgQW4gYXJyYXkgb2Yg ZGVzZXJpYWxpemVkIG9iamVjdHMKICAgICAgKi8KICAgICAgZXh0cmFjdEZp bmRBbGw6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBwYXlsb2FkKXsKICAgICAg ICByZXR1cm4gdGhpcy5leHRyYWN0QXJyYXkoc3RvcmUsIHR5cGUsIHBheWxv YWQpOwogICAgICB9LAogICAgICAvKioKICAgICAgICBgZXh0cmFjdEZpbmRR dWVyeWAgaXMgYSBob29rIGludG8gdGhlIGV4dHJhY3QgbWV0aG9kIHVzZWQg d2hlbiBhCiAgICAgICAgY2FsbCBpcyBtYWRlIHRvIGBEUy5TdG9yZSNmaW5k UXVlcnlgLiBCeSBkZWZhdWx0IHRoaXMgbWV0aG9kIGlzIGFuCiAgICAgICAg YWxpYXMgZm9yIFtleHRyYWN0QXJyYXldKCNtZXRob2RfZXh0cmFjdEFycmF5 KS4KCiAgICAgICAgQG1ldGhvZCBleHRyYWN0RmluZFF1ZXJ5CiAgICAgICAg QHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKICAgICAgICBAcGFyYW0ge3N1YmNs YXNzIG9mIERTLk1vZGVsfSB0eXBlCiAgICAgICAgQHBhcmFtIHtPYmplY3R9 IHBheWxvYWQKICAgICAgICBAcmV0dXJuIHtBcnJheX0gYXJyYXkgQW4gYXJy YXkgb2YgZGVzZXJpYWxpemVkIG9iamVjdHMKICAgICAgKi8KICAgICAgZXh0 cmFjdEZpbmRRdWVyeTogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHBheWxvYWQp ewogICAgICAgIHJldHVybiB0aGlzLmV4dHJhY3RBcnJheShzdG9yZSwgdHlw ZSwgcGF5bG9hZCk7CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgIGBleHRy YWN0RmluZE1hbnlgIGlzIGEgaG9vayBpbnRvIHRoZSBleHRyYWN0IG1ldGhv ZCB1c2VkIHdoZW4gYQogICAgICAgIGNhbGwgaXMgbWFkZSB0byBgRFMuU3Rv cmUjZmluZE1hbnlgLiBCeSBkZWZhdWx0IHRoaXMgbWV0aG9kIGlzCiAgICAg ICAgYWxpYXMgZm9yIFtleHRyYWN0QXJyYXldKCNtZXRob2RfZXh0cmFjdEFy cmF5KS4KCiAgICAgICAgQG1ldGhvZCBleHRyYWN0RmluZE1hbnkKICAgICAg ICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQogICAgICAgIEBwYXJhbSB7c3Vi Y2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKICAgICAgICBAcGFyYW0ge09iamVj dH0gcGF5bG9hZAogICAgICAgIEByZXR1cm4ge0FycmF5fSBhcnJheSBBbiBh cnJheSBvZiBkZXNlcmlhbGl6ZWQgb2JqZWN0cwogICAgICAqLwogICAgICBl eHRyYWN0RmluZE1hbnk6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBwYXlsb2Fk KXsKICAgICAgICByZXR1cm4gdGhpcy5leHRyYWN0QXJyYXkoc3RvcmUsIHR5 cGUsIHBheWxvYWQpOwogICAgICB9LAogICAgICAvKioKICAgICAgICBgZXh0 cmFjdEZpbmRIYXNNYW55YCBpcyBhIGhvb2sgaW50byB0aGUgZXh0cmFjdCBt ZXRob2QgdXNlZCB3aGVuIGEKICAgICAgICBjYWxsIGlzIG1hZGUgdG8gYERT LlN0b3JlI2ZpbmRIYXNNYW55YC4gQnkgZGVmYXVsdCB0aGlzIG1ldGhvZCBp cwogICAgICAgIGFsaWFzIGZvciBbZXh0cmFjdEFycmF5XSgjbWV0aG9kX2V4 dHJhY3RBcnJheSkuCgogICAgICAgIEBtZXRob2QgZXh0cmFjdEZpbmRIYXNN YW55CiAgICAgICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKICAgICAgICBA cGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCiAgICAgICAgQHBh cmFtIHtPYmplY3R9IHBheWxvYWQKICAgICAgICBAcmV0dXJuIHtBcnJheX0g YXJyYXkgQW4gYXJyYXkgb2YgZGVzZXJpYWxpemVkIG9iamVjdHMKICAgICAg Ki8KICAgICAgZXh0cmFjdEZpbmRIYXNNYW55OiBmdW5jdGlvbihzdG9yZSwg dHlwZSwgcGF5bG9hZCl7CiAgICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdEFy cmF5KHN0b3JlLCB0eXBlLCBwYXlsb2FkKTsKICAgICAgfSwKCiAgICAgIC8q KgogICAgICAgIGBleHRyYWN0Q3JlYXRlUmVjb3JkYCBpcyBhIGhvb2sgaW50 byB0aGUgZXh0cmFjdCBtZXRob2QgdXNlZCB3aGVuIGEKICAgICAgICBjYWxs IGlzIG1hZGUgdG8gYERTLlN0b3JlI2NyZWF0ZVJlY29yZGAuIEJ5IGRlZmF1 bHQgdGhpcyBtZXRob2QgaXMKICAgICAgICBhbGlhcyBmb3IgW2V4dHJhY3RT YXZlXSgjbWV0aG9kX2V4dHJhY3RTYXZlKS4KCiAgICAgICAgQG1ldGhvZCBl eHRyYWN0Q3JlYXRlUmVjb3JkCiAgICAgICAgQHBhcmFtIHtEUy5TdG9yZX0g c3RvcmUKICAgICAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0 eXBlCiAgICAgICAgQHBhcmFtIHtPYmplY3R9IHBheWxvYWQKICAgICAgICBA cmV0dXJuIHtPYmplY3R9IGpzb24gVGhlIGRlc2VyaWFsaXplZCBwYXlsb2Fk CiAgICAgICovCiAgICAgIGV4dHJhY3RDcmVhdGVSZWNvcmQ6IGZ1bmN0aW9u KHN0b3JlLCB0eXBlLCBwYXlsb2FkKSB7CiAgICAgICAgcmV0dXJuIHRoaXMu ZXh0cmFjdFNhdmUoc3RvcmUsIHR5cGUsIHBheWxvYWQpOwogICAgICB9LAog ICAgICAvKioKICAgICAgICBgZXh0cmFjdFVwZGF0ZVJlY29yZGAgaXMgYSBo b29rIGludG8gdGhlIGV4dHJhY3QgbWV0aG9kIHVzZWQgd2hlbgogICAgICAg IGEgY2FsbCBpcyBtYWRlIHRvIGBEUy5TdG9yZSN1cGRhdGVgLiBCeSBkZWZh dWx0IHRoaXMgbWV0aG9kIGlzIGFsaWFzCiAgICAgICAgZm9yIFtleHRyYWN0 U2F2ZV0oI21ldGhvZF9leHRyYWN0U2F2ZSkuCgogICAgICAgIEBtZXRob2Qg ZXh0cmFjdFVwZGF0ZVJlY29yZAogICAgICAgIEBwYXJhbSB7RFMuU3RvcmV9 IHN0b3JlCiAgICAgICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0g dHlwZQogICAgICAgIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkCiAgICAgICAg QHJldHVybiB7T2JqZWN0fSBqc29uIFRoZSBkZXNlcmlhbGl6ZWQgcGF5bG9h ZAogICAgICAqLwogICAgICBleHRyYWN0VXBkYXRlUmVjb3JkOiBmdW5jdGlv bihzdG9yZSwgdHlwZSwgcGF5bG9hZCkgewogICAgICAgIHJldHVybiB0aGlz LmV4dHJhY3RTYXZlKHN0b3JlLCB0eXBlLCBwYXlsb2FkKTsKICAgICAgfSwK ICAgICAgLyoqCiAgICAgICAgYGV4dHJhY3REZWxldGVSZWNvcmRgIGlzIGEg aG9vayBpbnRvIHRoZSBleHRyYWN0IG1ldGhvZCB1c2VkIHdoZW4KICAgICAg ICBhIGNhbGwgaXMgbWFkZSB0byBgRFMuU3RvcmUjZGVsZXRlUmVjb3JkYC4g QnkgZGVmYXVsdCB0aGlzIG1ldGhvZCBpcwogICAgICAgIGFsaWFzIGZvciBb ZXh0cmFjdFNhdmVdKCNtZXRob2RfZXh0cmFjdFNhdmUpLgoKICAgICAgICBA bWV0aG9kIGV4dHJhY3REZWxldGVSZWNvcmQKICAgICAgICBAcGFyYW0ge0RT LlN0b3JlfSBzdG9yZQogICAgICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMu TW9kZWx9IHR5cGUKICAgICAgICBAcGFyYW0ge09iamVjdH0gcGF5bG9hZAog ICAgICAgIEByZXR1cm4ge09iamVjdH0ganNvbiBUaGUgZGVzZXJpYWxpemVk IHBheWxvYWQKICAgICAgKi8KICAgICAgZXh0cmFjdERlbGV0ZVJlY29yZDog ZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHBheWxvYWQpIHsKICAgICAgICByZXR1 cm4gdGhpcy5leHRyYWN0U2F2ZShzdG9yZSwgdHlwZSwgcGF5bG9hZCk7CiAg ICAgIH0sCgogICAgICAvKioKICAgICAgICBgZXh0cmFjdEZpbmRgIGlzIGEg aG9vayBpbnRvIHRoZSBleHRyYWN0IG1ldGhvZCB1c2VkIHdoZW4KICAgICAg ICBhIGNhbGwgaXMgbWFkZSB0byBgRFMuU3RvcmUjZmluZGAuIEJ5IGRlZmF1 bHQgdGhpcyBtZXRob2QgaXMKICAgICAgICBhbGlhcyBmb3IgW2V4dHJhY3RT aW5nbGVdKCNtZXRob2RfZXh0cmFjdFNpbmdsZSkuCgogICAgICAgIEBtZXRo b2QgZXh0cmFjdEZpbmQKICAgICAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9y ZQogICAgICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUK ICAgICAgICBAcGFyYW0ge09iamVjdH0gcGF5bG9hZAogICAgICAgIEByZXR1 cm4ge09iamVjdH0ganNvbiBUaGUgZGVzZXJpYWxpemVkIHBheWxvYWQKICAg ICAgKi8KICAgICAgZXh0cmFjdEZpbmQ6IGZ1bmN0aW9uKHN0b3JlLCB0eXBl LCBwYXlsb2FkKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdFNpbmds ZShzdG9yZSwgdHlwZSwgcGF5bG9hZCk7CiAgICAgIH0sCiAgICAgIC8qKgog ICAgICAgIGBleHRyYWN0RmluZEJlbG9uZ3NUb2AgaXMgYSBob29rIGludG8g dGhlIGV4dHJhY3QgbWV0aG9kIHVzZWQgd2hlbgogICAgICAgIGEgY2FsbCBp cyBtYWRlIHRvIGBEUy5TdG9yZSNmaW5kQmVsb25nc1RvYC4gQnkgZGVmYXVs dCB0aGlzIG1ldGhvZCBpcwogICAgICAgIGFsaWFzIGZvciBbZXh0cmFjdFNp bmdsZV0oI21ldGhvZF9leHRyYWN0U2luZ2xlKS4KCiAgICAgICAgQG1ldGhv ZCBleHRyYWN0RmluZEJlbG9uZ3NUbwogICAgICAgIEBwYXJhbSB7RFMuU3Rv cmV9IHN0b3JlCiAgICAgICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2Rl bH0gdHlwZQogICAgICAgIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkCiAgICAg ICAgQHJldHVybiB7T2JqZWN0fSBqc29uIFRoZSBkZXNlcmlhbGl6ZWQgcGF5 bG9hZAogICAgICAqLwogICAgICBleHRyYWN0RmluZEJlbG9uZ3NUbzogZnVu Y3Rpb24oc3RvcmUsIHR5cGUsIHBheWxvYWQpIHsKICAgICAgICByZXR1cm4g dGhpcy5leHRyYWN0U2luZ2xlKHN0b3JlLCB0eXBlLCBwYXlsb2FkKTsKICAg ICAgfSwKICAgICAgLyoqCiAgICAgICAgYGV4dHJhY3RTYXZlYCBpcyBhIGhv b2sgaW50byB0aGUgZXh0cmFjdCBtZXRob2QgdXNlZCB3aGVuIGEgY2FsbAog ICAgICAgIGlzIG1hZGUgdG8gYERTLk1vZGVsI3NhdmVgLiBCeSBkZWZhdWx0 IHRoaXMgbWV0aG9kIGlzIGFsaWFzCiAgICAgICAgZm9yIFtleHRyYWN0U2lu Z2xlXSgjbWV0aG9kX2V4dHJhY3RTaW5nbGUpLgoKICAgICAgICBAbWV0aG9k IGV4dHJhY3RTYXZlCiAgICAgICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUK ICAgICAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCiAg ICAgICAgQHBhcmFtIHtPYmplY3R9IHBheWxvYWQKICAgICAgICBAcmV0dXJu IHtPYmplY3R9IGpzb24gVGhlIGRlc2VyaWFsaXplZCBwYXlsb2FkCiAgICAg ICovCiAgICAgIGV4dHJhY3RTYXZlOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwg cGF5bG9hZCkgewogICAgICAgIHJldHVybiB0aGlzLmV4dHJhY3RTaW5nbGUo c3RvcmUsIHR5cGUsIHBheWxvYWQpOwogICAgICB9LAoKICAgICAgLyoqCiAg ICAgICAgYGV4dHJhY3RTaW5nbGVgIGlzIHVzZWQgdG8gZGVzZXJpYWxpemUg YSBzaW5nbGUgcmVjb3JkIHJldHVybmVkCiAgICAgICAgZnJvbSB0aGUgYWRh cHRlci4KCiAgICAgICAgRXhhbXBsZQoKICAgICAgICBgYGBqYXZhc2NyaXB0 CiAgICAgICAgQXBwLlBvc3RTZXJpYWxpemVyID0gRFMuSlNPTlNlcmlhbGl6 ZXIuZXh0ZW5kKHsKICAgICAgICAgIGV4dHJhY3RTaW5nbGU6IGZ1bmN0aW9u KHN0b3JlLCB0eXBlLCBwYXlsb2FkKSB7CiAgICAgICAgICAgIHBheWxvYWQu Y29tbWVudHMgPSBwYXlsb2FkLl9lbWJlZGRlZC5jb21tZW50OwogICAgICAg ICAgICBkZWxldGUgcGF5bG9hZC5fZW1iZWRkZWQ7CgogICAgICAgICAgICBy ZXR1cm4gdGhpcy5fc3VwZXIoc3RvcmUsIHR5cGUsIHBheWxvYWQpOwogICAg ICAgICAgfSwKICAgICAgICB9KTsKICAgICAgICBgYGAKCiAgICAgICAgQG1l dGhvZCBleHRyYWN0U2luZ2xlCiAgICAgICAgQHBhcmFtIHtEUy5TdG9yZX0g c3RvcmUKICAgICAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0 eXBlCiAgICAgICAgQHBhcmFtIHtPYmplY3R9IHBheWxvYWQKICAgICAgICBA cmV0dXJuIHtPYmplY3R9IGpzb24gVGhlIGRlc2VyaWFsaXplZCBwYXlsb2Fk CiAgICAgICovCiAgICAgIGV4dHJhY3RTaW5nbGU6IGZ1bmN0aW9uKHN0b3Jl LCB0eXBlLCBwYXlsb2FkKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFs aXplKHR5cGUsIHBheWxvYWQpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAg ICAgYGV4dHJhY3RBcnJheWAgaXMgdXNlZCB0byBkZXNlcmlhbGl6ZSBhbiBh cnJheSBvZiByZWNvcmRzCiAgICAgICAgcmV0dXJuZWQgZnJvbSB0aGUgYWRh cHRlci4KCiAgICAgICAgRXhhbXBsZQoKICAgICAgICBgYGBqYXZhc2NyaXB0 CiAgICAgICAgQXBwLlBvc3RTZXJpYWxpemVyID0gRFMuSlNPTlNlcmlhbGl6 ZXIuZXh0ZW5kKHsKICAgICAgICAgIGV4dHJhY3RBcnJheTogZnVuY3Rpb24o c3RvcmUsIHR5cGUsIHBheWxvYWQpIHsKICAgICAgICAgICAgcmV0dXJuIHBh eWxvYWQubWFwKGZ1bmN0aW9uKGpzb24pIHsKICAgICAgICAgICAgICByZXR1 cm4gdGhpcy5leHRyYWN0U2luZ2xlKHN0b3JlLCB0eXBlLCBqc29uKTsKICAg ICAgICAgICAgfSwgdGhpcyk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAg ICAgICAgYGBgCgogICAgICAgIEBtZXRob2QgZXh0cmFjdEFycmF5CiAgICAg ICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKICAgICAgICBAcGFyYW0ge3N1 YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCiAgICAgICAgQHBhcmFtIHtPYmpl Y3R9IHBheWxvYWQKICAgICAgICBAcmV0dXJuIHtBcnJheX0gYXJyYXkgQW4g YXJyYXkgb2YgZGVzZXJpYWxpemVkIG9iamVjdHMKICAgICAgKi8KICAgICAg ZXh0cmFjdEFycmF5OiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcGF5bG9hZCkg ewogICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZSh0eXBlLCBwYXlsb2Fk KTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgIGBleHRyYWN0TWV0YWAg aXMgdXNlZCB0byBkZXNlcmlhbGl6ZSBhbnkgbWV0YSBpbmZvcm1hdGlvbiBp biB0aGUKICAgICAgICBhZGFwdGVyIHBheWxvYWQuIEJ5IGRlZmF1bHQgRW1i ZXIgRGF0YSBleHBlY3RzIG1ldGEgaW5mb3JtYXRpb24gdG8KICAgICAgICBi ZSBsb2NhdGVkIG9uIHRoZSBgbWV0YWAgcHJvcGVydHkgb2YgdGhlIHBheWxv YWQgb2JqZWN0LgoKICAgICAgICBFeGFtcGxlCgogICAgICAgIGBgYGphdmFz Y3JpcHQKICAgICAgICBBcHAuUG9zdFNlcmlhbGl6ZXIgPSBEUy5KU09OU2Vy aWFsaXplci5leHRlbmQoewogICAgICAgICAgZXh0cmFjdE1ldGE6IGZ1bmN0 aW9uKHN0b3JlLCB0eXBlLCBwYXlsb2FkKSB7CiAgICAgICAgICAgIGlmIChw YXlsb2FkICYmIHBheWxvYWQuX3BhZ2luYXRpb24pIHsKICAgICAgICAgICAg ICBzdG9yZS5tZXRhRm9yVHlwZSh0eXBlLCBwYXlsb2FkLl9wYWdpbmF0aW9u KTsKICAgICAgICAgICAgICBkZWxldGUgcGF5bG9hZC5fcGFnaW5hdGlvbjsK ICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAg IGBgYAoKICAgICAgICBAbWV0aG9kIGV4dHJhY3RNZXRhCiAgICAgICAgQHBh cmFtIHtEUy5TdG9yZX0gc3RvcmUKICAgICAgICBAcGFyYW0ge3N1YmNsYXNz IG9mIERTLk1vZGVsfSB0eXBlCiAgICAgICAgQHBhcmFtIHtPYmplY3R9IHBh eWxvYWQKICAgICAgKi8KICAgICAgZXh0cmFjdE1ldGE6IGZ1bmN0aW9uKHN0 b3JlLCB0eXBlLCBwYXlsb2FkKSB7CiAgICAgICAgaWYgKHBheWxvYWQgJiYg cGF5bG9hZC5tZXRhKSB7CiAgICAgICAgICBzdG9yZS5tZXRhRm9yVHlwZSh0 eXBlLCBwYXlsb2FkLm1ldGEpOwogICAgICAgICAgZGVsZXRlIHBheWxvYWQu bWV0YTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgIGBr ZXlGb3JBdHRyaWJ1dGVgIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBydWxlcyBm b3IgaG93IHRvIGNvbnZlcnQgYW4KICAgICAgIGF0dHJpYnV0ZSBuYW1lIGlu IHlvdXIgbW9kZWwgdG8gYSBrZXkgaW4geW91ciBKU09OLgoKICAgICAgIEV4 YW1wbGUKCiAgICAgICBgYGBqYXZhc2NyaXB0CiAgICAgICBBcHAuQXBwbGlj YXRpb25TZXJpYWxpemVyID0gRFMuUkVTVFNlcmlhbGl6ZXIuZXh0ZW5kKHsK ICAgICAgICAga2V5Rm9yQXR0cmlidXRlOiBmdW5jdGlvbihhdHRyKSB7CiAg ICAgICAgICAgcmV0dXJuIEVtYmVyLlN0cmluZy51bmRlcnNjb3JlKGF0dHIp LnRvVXBwZXJDYXNlKCk7CiAgICAgICAgIH0KICAgICAgIH0pOwogICAgICAg YGBgCgogICAgICAgQG1ldGhvZCBrZXlGb3JBdHRyaWJ1dGUKICAgICAgIEBw YXJhbSB7U3RyaW5nfSBrZXkKICAgICAgIEByZXR1cm4ge1N0cmluZ30gbm9y bWFsaXplZCBrZXkKICAgICAgKi8KCgogICAgICAvKioKICAgICAgIGBrZXlG b3JSZWxhdGlvbnNoaXBgIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhIGN1c3Rv bSBrZXkgd2hlbgogICAgICAgc2VyaWFsaXppbmcgcmVsYXRpb25zaGlwIHBy b3BlcnRpZXMuIEJ5IGRlZmF1bHQgYEpTT05TZXJpYWxpemVyYAogICAgICAg ZG9lcyBub3QgcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1l dGhvZC4KCiAgICAgICBFeGFtcGxlCgogICAgICAgIGBgYGphdmFzY3JpcHQK ICAgICAgICBBcHAuUG9zdFNlcmlhbGl6ZXIgPSBEUy5KU09OU2VyaWFsaXpl ci5leHRlbmQoewogICAgICAgICAga2V5Rm9yUmVsYXRpb25zaGlwOiBmdW5j dGlvbihrZXksIHJlbGF0aW9uc2hpcCkgewogICAgICAgICAgICAgcmV0dXJu ICdyZWxfJyArIEVtYmVyLlN0cmluZy51bmRlcnNjb3JlKGtleSk7CiAgICAg ICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgYGBgCgogICAgICAgQG1ldGhv ZCBrZXlGb3JSZWxhdGlvbnNoaXAKICAgICAgIEBwYXJhbSB7U3RyaW5nfSBr ZXkKICAgICAgIEBwYXJhbSB7U3RyaW5nfSByZWxhdGlvbnNoaXAgdHlwZQog ICAgICAgQHJldHVybiB7U3RyaW5nfSBub3JtYWxpemVkIGtleQogICAgICAq LwoKICAgICAgLy8gSEVMUEVSUwoKICAgICAgLyoqCiAgICAgICBAbWV0aG9k IHRyYW5zZm9ybUZvcgogICAgICAgQHByaXZhdGUKICAgICAgIEBwYXJhbSB7 U3RyaW5nfSBhdHRyaWJ1dGVUeXBlCiAgICAgICBAcGFyYW0ge0Jvb2xlYW59 IHNraXBBc3NlcnRpb24KICAgICAgIEByZXR1cm4ge0RTLlRyYW5zZm9ybX0g dHJhbnNmb3JtCiAgICAgICovCiAgICAgIHRyYW5zZm9ybUZvcjogZnVuY3Rp b24oYXR0cmlidXRlVHlwZSwgc2tpcEFzc2VydGlvbikgewogICAgICAgIHZh ciB0cmFuc2Zvcm0gPSB0aGlzLmNvbnRhaW5lci5sb29rdXAoJ3RyYW5zZm9y bTonICsgYXR0cmlidXRlVHlwZSk7CiAgICAgICAgRW1iZXIuYXNzZXJ0KCJV bmFibGUgdG8gZmluZCB0cmFuc2Zvcm0gZm9yICciICsgYXR0cmlidXRlVHlw ZSArICInIiwgc2tpcEFzc2VydGlvbiB8fCAhIXRyYW5zZm9ybSk7CiAgICAg ICAgcmV0dXJuIHRyYW5zZm9ybTsKICAgICAgfQogICAgfSk7CgogICAgX19l eHBvcnRzX19bImRlZmF1bHQiXSA9IEpTT05TZXJpYWxpemVyOwogIH0pOwpk ZWZpbmUoImVtYmVyLWRhdGEvbGliL3NlcmlhbGl6ZXJzL3Jlc3Rfc2VyaWFs aXplciIsIAogIFsiLi9qc29uX3NlcmlhbGl6ZXIiLCJleHBvcnRzIl0sCiAg ZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2V4cG9ydHNfXykgewogICAg InVzZSBzdHJpY3QiOwogICAgLyoqCiAgICAgIEBtb2R1bGUgZW1iZXItZGF0 YQogICAgKi8KCiAgICB2YXIgSlNPTlNlcmlhbGl6ZXIgPSBfX2RlcGVuZGVu Y3kxX19bImRlZmF1bHQiXTsKICAgIHZhciBnZXQgPSBFbWJlci5nZXQsIHNl dCA9IEVtYmVyLnNldDsKICAgIHZhciBmb3JFYWNoID0gRW1iZXIuQXJyYXlQ b2x5ZmlsbHMuZm9yRWFjaDsKICAgIHZhciBtYXAgPSBFbWJlci5BcnJheVBv bHlmaWxscy5tYXA7CgogICAgZnVuY3Rpb24gY29lcmNlSWQoaWQpIHsKICAg ICAgcmV0dXJuIGlkID09IG51bGwgPyBudWxsIDogaWQrJyc7CiAgICB9Cgog ICAgLyoqCiAgICAgIE5vcm1hbGx5LCBhcHBsaWNhdGlvbnMgd2lsbCB1c2Ug dGhlIGBSRVNUU2VyaWFsaXplcmAgYnkgaW1wbGVtZW50aW5nCiAgICAgIHRo ZSBgbm9ybWFsaXplYCBtZXRob2QgYW5kIGluZGl2aWR1YWwgbm9ybWFsaXph dGlvbnMgdW5kZXIKICAgICAgYG5vcm1hbGl6ZUhhc2hgLgoKICAgICAgVGhp cyBhbGxvd3MgeW91IHRvIGRvIHdoYXRldmVyIGtpbmQgb2YgbXVuZ2luZyB5 b3UgbmVlZCwgYW5kIGlzCiAgICAgIGVzcGVjaWFsbHkgdXNlZnVsIGlmIHlv dXIgc2VydmVyIGlzIGluY29uc2lzdGVudCBhbmQgeW91IG5lZWQgdG8KICAg ICAgZG8gbXVuZ2luZyBkaWZmZXJlbnRseSBmb3IgbWFueSBkaWZmZXJlbnQg a2luZHMgb2YgcmVzcG9uc2VzLgoKICAgICAgU2VlIHRoZSBgbm9ybWFsaXpl YCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKICAgICAg IyMgQWNyb3NzIHRoZSBCb2FyZCBOb3JtYWxpemF0aW9uCgogICAgICBUaGVy ZSBhcmUgYWxzbyBhIG51bWJlciBvZiBob29rcyB0aGF0IHlvdSBtaWdodCBm aW5kIHVzZWZ1bCB0byBkZWZpbmVkCiAgICAgIGFjcm9zcy10aGUtYm9hcmQg cnVsZXMgZm9yIHlvdXIgcGF5bG9hZC4gVGhlc2UgcnVsZXMgd2lsbCBiZSB1 c2VmdWwKICAgICAgaWYgeW91ciBzZXJ2ZXIgaXMgY29uc2lzdGVudCwgb3Ig aWYgeW91J3JlIGJ1aWxkaW5nIGFuIGFkYXB0ZXIgZm9yCiAgICAgIGFuIGlu ZnJhc3RydWN0dXJlIHNlcnZpY2UsIGxpa2UgUGFyc2UsIGFuZCB3YW50IHRv IGVuY29kZSBzZXJ2aWNlCiAgICAgIGNvbnZlbnRpb25zLgoKICAgICAgRm9y IGV4YW1wbGUsIGlmIGFsbCBvZiB5b3VyIGtleXMgYXJlIHVuZGVyc2NvcmVk IGFuZCBhbGwtY2FwcywgYnV0CiAgICAgIG90aGVyd2lzZSBjb25zaXN0ZW50 IHdpdGggdGhlIG5hbWVzIHlvdSB1c2UgaW4geW91ciBtb2RlbHMsIHlvdQog ICAgICBjYW4gaW1wbGVtZW50IGFjcm9zcy10aGUtYm9hcmQgcnVsZXMgZm9y IGhvdyB0byBjb252ZXJ0IGFuIGF0dHJpYnV0ZQogICAgICBuYW1lIGluIHlv dXIgbW9kZWwgdG8gYSBrZXkgaW4geW91ciBKU09OLgoKICAgICAgYGBganMK ICAgICAgQXBwLkFwcGxpY2F0aW9uU2VyaWFsaXplciA9IERTLlJFU1RTZXJp YWxpemVyLmV4dGVuZCh7CiAgICAgICAga2V5Rm9yQXR0cmlidXRlOiBmdW5j dGlvbihhdHRyKSB7CiAgICAgICAgICByZXR1cm4gRW1iZXIuU3RyaW5nLnVu ZGVyc2NvcmUoYXR0cikudG9VcHBlckNhc2UoKTsKICAgICAgICB9CiAgICAg IH0pOwogICAgICBgYGAKCiAgICAgIFlvdSBjYW4gYWxzbyBpbXBsZW1lbnQg YGtleUZvclJlbGF0aW9uc2hpcGAsIHdoaWNoIHRha2VzIHRoZSBuYW1lCiAg ICAgIG9mIHRoZSByZWxhdGlvbnNoaXAgYXMgdGhlIGZpcnN0IHBhcmFtZXRl ciwgYW5kIHRoZSBraW5kIG9mCiAgICAgIHJlbGF0aW9uc2hpcCAoYGhhc01h bnlgIG9yIGBiZWxvbmdzVG9gKSBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlci4K CiAgICAgIEBjbGFzcyBSRVNUU2VyaWFsaXplcgogICAgICBAbmFtZXNwYWNl IERTCiAgICAgIEBleHRlbmRzIERTLkpTT05TZXJpYWxpemVyCiAgICAqLwog ICAgdmFyIFJFU1RTZXJpYWxpemVyID0gSlNPTlNlcmlhbGl6ZXIuZXh0ZW5k KHsKICAgICAgLyoqCiAgICAgICAgSWYgeW91IHdhbnQgdG8gZG8gbm9ybWFs aXphdGlvbnMgc3BlY2lmaWMgdG8gc29tZSBwYXJ0IG9mIHRoZSBwYXlsb2Fk LCB5b3UKICAgICAgICBjYW4gc3BlY2lmeSB0aG9zZSB1bmRlciBgbm9ybWFs aXplSGFzaGAuCgogICAgICAgIEZvciBleGFtcGxlLCBnaXZlbiB0aGUgZm9s bG93aW5nIGpzb24gd2hlcmUgdGhlIHRoZSBgSURzYCB1bmRlcgogICAgICAg IGAiY29tbWVudHMiYCBhcmUgcHJvdmlkZWQgYXMgYF9pZGAgaW5zdGVhZCBv ZiBgaWRgLgoKICAgICAgICBgYGBqYXZhc2NyaXB0CiAgICAgICAgewogICAg ICAgICAgInBvc3QiOiB7CiAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAg ICAgICJ0aXRsZSI6ICJSYWlscyBpcyBvbWFrYXNlIiwKICAgICAgICAgICAg ImNvbW1lbnRzIjogWyAxLCAyIF0KICAgICAgICAgIH0sCiAgICAgICAgICAi Y29tbWVudHMiOiBbewogICAgICAgICAgICAiX2lkIjogMSwKICAgICAgICAg ICAgImJvZHkiOiAiRklSU1QiCiAgICAgICAgICB9LCB7CiAgICAgICAgICAg ICJfaWQiOiAyLAogICAgICAgICAgICAiYm9keSI6ICJSYWlscyBpcyB1bmFn aSIKICAgICAgICAgIH1dCiAgICAgICAgfQogICAgICAgIGBgYAoKICAgICAg ICBZb3UgdXNlIGBub3JtYWxpemVIYXNoYCB0byBub3JtYWxpemUganVzdCB0 aGUgY29tbWVudHM6CgogICAgICAgIGBgYGphdmFzY3JpcHQKICAgICAgICBB cHAuUG9zdFNlcmlhbGl6ZXIgPSBEUy5SRVNUU2VyaWFsaXplci5leHRlbmQo ewogICAgICAgICAgbm9ybWFsaXplSGFzaDogewogICAgICAgICAgICBjb21t ZW50czogZnVuY3Rpb24oaGFzaCkgewogICAgICAgICAgICAgIGhhc2guaWQg PSBoYXNoLl9pZDsKICAgICAgICAgICAgICBkZWxldGUgaGFzaC5faWQ7CiAg ICAgICAgICAgICAgcmV0dXJuIGhhc2g7CiAgICAgICAgICAgIH0KICAgICAg ICAgIH0KICAgICAgICB9KTsKICAgICAgICBgYGAKCiAgICAgICAgVGhlIGtl eSB1bmRlciBgbm9ybWFsaXplSGFzaGAgaXMgdXN1YWxseSBqdXN0IHRoZSBv cmlnaW5hbCBrZXkKICAgICAgICB0aGF0IHdhcyBpbiB0aGUgb3JpZ2luYWwg cGF5bG9hZC4gSG93ZXZlciwga2V5IG5hbWVzIHdpbGwgYmUKICAgICAgICBp bXBhY3RlZCBieSBhbnkgbW9kaWZpY2F0aW9ucyBkb25lIGluIHRoZSBgbm9y bWFsaXplUGF5bG9hZGAKICAgICAgICBtZXRob2QuIFRoZSBgRFMuUkVTVFNl cmlhbGl6ZXJgJ3MgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBtYWtlcyBubwog ICAgICAgIGNoYW5nZXMgdG8gdGhlIHBheWxvYWQga2V5cy4KCiAgICAgICAg QHByb3BlcnR5IG5vcm1hbGl6ZUhhc2gKICAgICAgICBAdHlwZSB7T2JqZWN0 fQogICAgICAgIEBkZWZhdWx0IHVuZGVmaW5lZAogICAgICAqLwoKICAgICAg LyoqCiAgICAgICAgTm9ybWFsaXplcyBhIHBhcnQgb2YgdGhlIEpTT04gcGF5 bG9hZCByZXR1cm5lZCBieQogICAgICAgIHRoZSBzZXJ2ZXIuIFlvdSBzaG91 bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QsIG11bmdlIHRoZSBoYXNoCiAgICAg ICAgYW5kIGNhbGwgc3VwZXIgaWYgeW91IGhhdmUgZ2VuZXJpYyBub3JtYWxp emF0aW9uIHRvIGRvLgoKICAgICAgICBJdCB0YWtlcyB0aGUgdHlwZSBvZiB0 aGUgcmVjb3JkIHRoYXQgaXMgYmVpbmcgbm9ybWFsaXplZAogICAgICAgIChh cyBhIERTLk1vZGVsIGNsYXNzKSwgdGhlIHByb3BlcnR5IHdoZXJlIHRoZSBo YXNoIHdhcwogICAgICAgIG9yaWdpbmFsbHkgZm91bmQsIGFuZCB0aGUgaGFz aCB0byBub3JtYWxpemUuCgogICAgICAgIEZvciBleGFtcGxlLCBpZiB5b3Ug aGF2ZSBhIHBheWxvYWQgdGhhdCBsb29rcyBsaWtlIHRoaXM6CgogICAgICAg IGBgYGpzCiAgICAgICAgewogICAgICAgICAgInBvc3QiOiB7CiAgICAgICAg ICAgICJpZCI6IDEsCiAgICAgICAgICAgICJ0aXRsZSI6ICJSYWlscyBpcyBv bWFrYXNlIiwKICAgICAgICAgICAgImNvbW1lbnRzIjogWyAxLCAyIF0KICAg ICAgICAgIH0sCiAgICAgICAgICAiY29tbWVudHMiOiBbewogICAgICAgICAg ICAiaWQiOiAxLAogICAgICAgICAgICAiYm9keSI6ICJGSVJTVCIKICAgICAg ICAgIH0sIHsKICAgICAgICAgICAgImlkIjogMiwKICAgICAgICAgICAgImJv ZHkiOiAiUmFpbHMgaXMgdW5hZ2kiCiAgICAgICAgICB9XQogICAgICAgIH0K ICAgICAgICBgYGAKCiAgICAgICAgVGhlIGBub3JtYWxpemVgIG1ldGhvZCB3 aWxsIGJlIGNhbGxlZCB0aHJlZSB0aW1lczoKCiAgICAgICAgKiBXaXRoIGBB cHAuUG9zdGAsIGAicG9zdHMiYCBhbmQgYHsgaWQ6IDEsIHRpdGxlOiAiUmFp bHMgaXMgb21ha2FzZSIsIC4uLiB9YAogICAgICAgICogV2l0aCBgQXBwLkNv bW1lbnRgLCBgImNvbW1lbnRzImAgYW5kIGB7IGlkOiAxLCBib2R5OiAiRklS U1QiIH1gCiAgICAgICAgKiBXaXRoIGBBcHAuQ29tbWVudGAsIGAiY29tbWVu dHMiYCBhbmQgYHsgaWQ6IDIsIGJvZHk6ICJSYWlscyBpcyB1bmFnaSIgfWAK CiAgICAgICAgWW91IGNhbiB1c2UgdGhpcyBtZXRob2QsIGZvciBleGFtcGxl LCB0byBub3JtYWxpemUgdW5kZXJzY29yZWQga2V5cyB0byBjYW1lbGl6ZWQK ICAgICAgICBvciBvdGhlciBnZW5lcmFsLXB1cnBvc2Ugbm9ybWFsaXphdGlv bnMuCgogICAgICAgIElmIHlvdSB3YW50IHRvIGRvIG5vcm1hbGl6YXRpb25z IHNwZWNpZmljIHRvIHNvbWUgcGFydCBvZiB0aGUgcGF5bG9hZCwgeW91CiAg ICAgICAgY2FuIHNwZWNpZnkgdGhvc2UgdW5kZXIgYG5vcm1hbGl6ZUhhc2hg LgoKICAgICAgICBGb3IgZXhhbXBsZSwgaWYgdGhlIGBJRHNgIHVuZGVyIGAi Y29tbWVudHMiYCBhcmUgcHJvdmlkZWQgYXMgYF9pZGAgaW5zdGVhZCBvZgog ICAgICAgIGBpZGAsIHlvdSBjYW4gc3BlY2lmeSBob3cgdG8gbm9ybWFsaXpl IGp1c3QgdGhlIGNvbW1lbnRzOgoKICAgICAgICBgYGBqcwogICAgICAgIEFw cC5Qb3N0U2VyaWFsaXplciA9IERTLlJFU1RTZXJpYWxpemVyLmV4dGVuZCh7 CiAgICAgICAgICBub3JtYWxpemVIYXNoOiB7CiAgICAgICAgICAgIGNvbW1l bnRzOiBmdW5jdGlvbihoYXNoKSB7CiAgICAgICAgICAgICAgaGFzaC5pZCA9 IGhhc2guX2lkOwogICAgICAgICAgICAgIGRlbGV0ZSBoYXNoLl9pZDsKICAg ICAgICAgICAgICByZXR1cm4gaGFzaDsKICAgICAgICAgICAgfQogICAgICAg ICAgfQogICAgICAgIH0pOwogICAgICAgIGBgYAoKICAgICAgICBUaGUga2V5 IHVuZGVyIGBub3JtYWxpemVIYXNoYCBpcyBqdXN0IHRoZSBvcmlnaW5hbCBr ZXkgdGhhdCB3YXMgaW4gdGhlIG9yaWdpbmFsCiAgICAgICAgcGF5bG9hZC4K CiAgICAgICAgQG1ldGhvZCBub3JtYWxpemUKICAgICAgICBAcGFyYW0ge3N1 YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCiAgICAgICAgQHBhcmFtIHtPYmpl Y3R9IGhhc2gKICAgICAgICBAcGFyYW0ge1N0cmluZ30gcHJvcAogICAgICAg IEByZXR1cm5zIHtPYmplY3R9CiAgICAgICovCiAgICAgIG5vcm1hbGl6ZTog ZnVuY3Rpb24odHlwZSwgaGFzaCwgcHJvcCkgewogICAgICAgIHRoaXMubm9y bWFsaXplSWQoaGFzaCk7CiAgICAgICAgdGhpcy5ub3JtYWxpemVBdHRyaWJ1 dGVzKHR5cGUsIGhhc2gpOwogICAgICAgIHRoaXMubm9ybWFsaXplUmVsYXRp b25zaGlwcyh0eXBlLCBoYXNoKTsKCiAgICAgICAgdGhpcy5ub3JtYWxpemVV c2luZ0RlY2xhcmVkTWFwcGluZyh0eXBlLCBoYXNoKTsKCiAgICAgICAgaWYg KHRoaXMubm9ybWFsaXplSGFzaCAmJiB0aGlzLm5vcm1hbGl6ZUhhc2hbcHJv cF0pIHsKICAgICAgICAgIHRoaXMubm9ybWFsaXplSGFzaFtwcm9wXShoYXNo KTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0aGlzLl9zdXBlcih0eXBl LCBoYXNoLCBwcm9wKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgIFlv dSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvIG5vcm1hbGl6ZSBhbGwgcGF5bG9h ZHMsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5CiAgICAgICAgcmVwcmVz ZW50IHNpbmdsZSByZWNvcmRzIG9yIGFuIGFycmF5LgoKICAgICAgICBGb3Ig ZXhhbXBsZSwgeW91IG1pZ2h0IHdhbnQgdG8gcmVtb3ZlIHNvbWUgZXh0cmFu ZW91cyBkYXRhIGZyb20gdGhlIHBheWxvYWQ6CgogICAgICAgIGBgYGpzCiAg ICAgICAgQXBwLkFwcGxpY2F0aW9uU2VyaWFsaXplciA9IERTLlJFU1RTZXJp YWxpemVyLmV4dGVuZCh7CiAgICAgICAgICBub3JtYWxpemVQYXlsb2FkOiBm dW5jdGlvbih0eXBlLCBwYXlsb2FkKSB7CiAgICAgICAgICAgIGRlbGV0ZSBw YXlsb2FkLnZlcnNpb247CiAgICAgICAgICAgIGRlbGV0ZSBwYXlsb2FkLnN0 YXR1czsKICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7CiAgICAgICAgICB9 CiAgICAgICAgfSk7CiAgICAgICAgYGBgCgogICAgICAgIEBtZXRob2Qgbm9y bWFsaXplUGF5bG9hZAogICAgICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMu TW9kZWx9IHR5cGUKICAgICAgICBAcGFyYW0ge09iamVjdH0gaGFzaAogICAg ICAgIEByZXR1cm5zIHtPYmplY3R9IHRoZSBub3JtYWxpemVkIHBheWxvYWQK ICAgICAgKi8KICAgICAgbm9ybWFsaXplUGF5bG9hZDogZnVuY3Rpb24odHlw ZSwgcGF5bG9hZCkgewogICAgICAgIHJldHVybiBwYXlsb2FkOwogICAgICB9 LAoKICAgICAgLyoqCiAgICAgICAgQG1ldGhvZCBub3JtYWxpemVJZAogICAg ICAgIEBwcml2YXRlCiAgICAgICovCiAgICAgIG5vcm1hbGl6ZUlkOiBmdW5j dGlvbihoYXNoKSB7CiAgICAgICAgdmFyIHByaW1hcnlLZXkgPSBnZXQodGhp cywgJ3ByaW1hcnlLZXknKTsKCiAgICAgICAgaWYgKHByaW1hcnlLZXkgPT09 ICdpZCcpIHsgcmV0dXJuOyB9CgogICAgICAgIGhhc2guaWQgPSBoYXNoW3By aW1hcnlLZXldOwogICAgICAgIGRlbGV0ZSBoYXNoW3ByaW1hcnlLZXldOwog ICAgICB9LAoKICAgICAgLyoqCiAgICAgICAgQG1ldGhvZCBub3JtYWxpemVV c2luZ0RlY2xhcmVkTWFwcGluZwogICAgICAgIEBwcml2YXRlCiAgICAgICov CiAgICAgIG5vcm1hbGl6ZVVzaW5nRGVjbGFyZWRNYXBwaW5nOiBmdW5jdGlv bih0eXBlLCBoYXNoKSB7CiAgICAgICAgdmFyIGF0dHJzID0gZ2V0KHRoaXMs ICdhdHRycycpLCBwYXlsb2FkS2V5LCBrZXk7CgogICAgICAgIGlmIChhdHRy cykgewogICAgICAgICAgZm9yIChrZXkgaW4gYXR0cnMpIHsKICAgICAgICAg ICAgcGF5bG9hZEtleSA9IGF0dHJzW2tleV07CiAgICAgICAgICAgIGlmIChw YXlsb2FkS2V5ICYmIHBheWxvYWRLZXkua2V5KSB7CiAgICAgICAgICAgICAg cGF5bG9hZEtleSA9IHBheWxvYWRLZXkua2V5OwogICAgICAgICAgICB9CiAg ICAgICAgICAgIGlmICh0eXBlb2YgcGF5bG9hZEtleSA9PT0gJ3N0cmluZycp IHsKICAgICAgICAgICAgICBoYXNoW2tleV0gPSBoYXNoW3BheWxvYWRLZXld OwogICAgICAgICAgICAgIGRlbGV0ZSBoYXNoW3BheWxvYWRLZXldOwogICAg ICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAoKICAg ICAgLyoqCiAgICAgICAgQG1ldGhvZCBub3JtYWxpemVBdHRyaWJ1dGVzCiAg ICAgICAgQHByaXZhdGUKICAgICAgKi8KICAgICAgbm9ybWFsaXplQXR0cmli dXRlczogZnVuY3Rpb24odHlwZSwgaGFzaCkgewogICAgICAgIHZhciBwYXls b2FkS2V5LCBrZXk7CgogICAgICAgIGlmICh0aGlzLmtleUZvckF0dHJpYnV0 ZSkgewogICAgICAgICAgdHlwZS5lYWNoQXR0cmlidXRlKGZ1bmN0aW9uKGtl eSkgewogICAgICAgICAgICBwYXlsb2FkS2V5ID0gdGhpcy5rZXlGb3JBdHRy aWJ1dGUoa2V5KTsKICAgICAgICAgICAgaWYgKGtleSA9PT0gcGF5bG9hZEtl eSkgeyByZXR1cm47IH0KCiAgICAgICAgICAgIGhhc2hba2V5XSA9IGhhc2hb cGF5bG9hZEtleV07CiAgICAgICAgICAgIGRlbGV0ZSBoYXNoW3BheWxvYWRL ZXldOwogICAgICAgICAgfSwgdGhpcyk7CiAgICAgICAgfQogICAgICB9LAoK ICAgICAgLyoqCiAgICAgICAgQG1ldGhvZCBub3JtYWxpemVSZWxhdGlvbnNo aXBzCiAgICAgICAgQHByaXZhdGUKICAgICAgKi8KICAgICAgbm9ybWFsaXpl UmVsYXRpb25zaGlwczogZnVuY3Rpb24odHlwZSwgaGFzaCkgewogICAgICAg IHZhciBwYXlsb2FkS2V5LCBrZXk7CgogICAgICAgIGlmICh0aGlzLmtleUZv clJlbGF0aW9uc2hpcCkgewogICAgICAgICAgdHlwZS5lYWNoUmVsYXRpb25z aGlwKGZ1bmN0aW9uKGtleSwgcmVsYXRpb25zaGlwKSB7CiAgICAgICAgICAg IHBheWxvYWRLZXkgPSB0aGlzLmtleUZvclJlbGF0aW9uc2hpcChrZXksIHJl bGF0aW9uc2hpcC5raW5kKTsKICAgICAgICAgICAgaWYgKGtleSA9PT0gcGF5 bG9hZEtleSkgeyByZXR1cm47IH0KCiAgICAgICAgICAgIGhhc2hba2V5XSA9 IGhhc2hbcGF5bG9hZEtleV07CiAgICAgICAgICAgIGRlbGV0ZSBoYXNoW3Bh eWxvYWRLZXldOwogICAgICAgICAgfSwgdGhpcyk7CiAgICAgICAgfQogICAg ICB9LAoKICAgICAgLyoqCiAgICAgICAgQ2FsbGVkIHdoZW4gdGhlIHNlcnZl ciBoYXMgcmV0dXJuZWQgYSBwYXlsb2FkIHJlcHJlc2VudGluZwogICAgICAg IGEgc2luZ2xlIHJlY29yZCwgc3VjaCBhcyBpbiByZXNwb25zZSB0byBhIGBm aW5kYCBvciBgc2F2ZWAuCgogICAgICAgIEl0IGlzIHlvdXIgb3Bwb3J0dW5p dHkgdG8gY2xlYW4gdXAgdGhlIHNlcnZlcidzIHJlc3BvbnNlIGludG8gdGhl IG5vcm1hbGl6ZWQKICAgICAgICBmb3JtIGV4cGVjdGVkIGJ5IEVtYmVyIERh dGEuCgogICAgICAgIElmIHlvdSB3YW50LCB5b3UgY2FuIGp1c3QgcmVzdHJ1 Y3R1cmUgdGhlIHRvcC1sZXZlbCBvZiB5b3VyIHBheWxvYWQsIGFuZAogICAg ICAgIGRvIG1vcmUgZmluZS1ncmFpbmVkIG5vcm1hbGl6YXRpb24gaW4gdGhl IGBub3JtYWxpemVgIG1ldGhvZC4KCiAgICAgICAgRm9yIGV4YW1wbGUsIGlm IHlvdSBoYXZlIGEgcGF5bG9hZCBsaWtlIHRoaXMgaW4gcmVzcG9uc2UgdG8g YSByZXF1ZXN0IGZvcgogICAgICAgIHBvc3QgMToKCiAgICAgICAgYGBganMK ICAgICAgICB7CiAgICAgICAgICAiaWQiOiAxLAogICAgICAgICAgInRpdGxl IjogIlJhaWxzIGlzIG9tYWthc2UiLAoKICAgICAgICAgICJfZW1iZWRkZWQi OiB7CiAgICAgICAgICAgICJjb21tZW50IjogW3sKICAgICAgICAgICAgICAi X2lkIjogMSwKICAgICAgICAgICAgICAiY29tbWVudF90aXRsZSI6ICJGSVJT VCIKICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICJfaWQiOiAyLAog ICAgICAgICAgICAgICJjb21tZW50X3RpdGxlIjogIlJhaWxzIGlzIHVuYWdp IgogICAgICAgICAgICB9XQogICAgICAgICAgfQogICAgICAgIH0KICAgICAg ICBgYGAKCiAgICAgICAgWW91IGNvdWxkIGltcGxlbWVudCBhIHNlcmlhbGl6 ZXIgdGhhdCBsb29rcyBsaWtlIHRoaXMgdG8gZ2V0IHlvdXIgcGF5bG9hZAog ICAgICAgIGludG8gc2hhcGU6CgogICAgICAgIGBgYGpzCiAgICAgICAgQXBw LlBvc3RTZXJpYWxpemVyID0gRFMuUkVTVFNlcmlhbGl6ZXIuZXh0ZW5kKHsK ICAgICAgICAgIC8vIEZpcnN0LCByZXN0cnVjdHVyZSB0aGUgdG9wLWxldmVs IHNvIGl0J3Mgb3JnYW5pemVkIGJ5IHR5cGUKICAgICAgICAgIGV4dHJhY3RT aW5nbGU6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBwYXlsb2FkLCBpZCwgcmVx dWVzdFR5cGUpIHsKICAgICAgICAgICAgdmFyIGNvbW1lbnRzID0gcGF5bG9h ZC5fZW1iZWRkZWQuY29tbWVudDsKICAgICAgICAgICAgZGVsZXRlIHBheWxv YWQuX2VtYmVkZGVkOwoKICAgICAgICAgICAgcGF5bG9hZCA9IHsgY29tbWVu dHM6IGNvbW1lbnRzLCBwb3N0OiBwYXlsb2FkIH07CiAgICAgICAgICAgIHJl dHVybiB0aGlzLl9zdXBlcihzdG9yZSwgdHlwZSwgcGF5bG9hZCwgaWQsIHJl cXVlc3RUeXBlKTsKICAgICAgICAgIH0sCgogICAgICAgICAgbm9ybWFsaXpl SGFzaDogewogICAgICAgICAgICAvLyBOZXh0LCBub3JtYWxpemUgaW5kaXZp ZHVhbCBjb21tZW50cywgd2hpY2ggKGFmdGVyIGBleHRyYWN0YCkKICAgICAg ICAgICAgLy8gYXJlIG5vdyBsb2NhdGVkIHVuZGVyIGBjb21tZW50c2AKICAg ICAgICAgICAgY29tbWVudHM6IGZ1bmN0aW9uKGhhc2gpIHsKICAgICAgICAg ICAgICBoYXNoLmlkID0gaGFzaC5faWQ7CiAgICAgICAgICAgICAgaGFzaC50 aXRsZSA9IGhhc2guY29tbWVudF90aXRsZTsKICAgICAgICAgICAgICBkZWxl dGUgaGFzaC5faWQ7CiAgICAgICAgICAgICAgZGVsZXRlIGhhc2guY29tbWVu dF90aXRsZTsKICAgICAgICAgICAgICByZXR1cm4gaGFzaDsKICAgICAgICAg ICAgfQogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgICAgYGBgCgogICAg ICAgIFdoZW4geW91IGNhbGwgc3VwZXIgZnJvbSB5b3VyIG93biBpbXBsZW1l bnRhdGlvbiBvZiBgZXh0cmFjdFNpbmdsZWAsIHRoZQogICAgICAgIGJ1aWx0 LWluIGltcGxlbWVudGF0aW9uIHdpbGwgZmluZCB0aGUgcHJpbWFyeSByZWNv cmQgaW4geW91ciBub3JtYWxpemVkCiAgICAgICAgcGF5bG9hZCBhbmQgcHVz aCB0aGUgcmVtYWluaW5nIHJlY29yZHMgaW50byB0aGUgc3RvcmUuCgogICAg ICAgIFRoZSBwcmltYXJ5IHJlY29yZCBpcyB0aGUgc2luZ2xlIGhhc2ggZm91 bmQgdW5kZXIgYHBvc3RgIG9yIHRoZSBmaXJzdAogICAgICAgIGVsZW1lbnQg b2YgdGhlIGBwb3N0c2AgYXJyYXkuCgogICAgICAgIFRoZSBwcmltYXJ5IHJl Y29yZCBoYXMgc3BlY2lhbCBtZWFuaW5nIHdoZW4gdGhlIHJlY29yZCBpcyBi ZWluZyBjcmVhdGVkCiAgICAgICAgZm9yIHRoZSBmaXJzdCB0aW1lIG9yIHVw ZGF0ZWQgKGBjcmVhdGVSZWNvcmRgIG9yIGB1cGRhdGVSZWNvcmRgKS4gSW4K ICAgICAgICBwYXJ0aWN1bGFyLCBpdCB3aWxsIHVwZGF0ZSB0aGUgcHJvcGVy dGllcyBvZiB0aGUgcmVjb3JkIHRoYXQgd2FzIHNhdmVkLgoKICAgICAgICBA bWV0aG9kIGV4dHJhY3RTaW5nbGUKICAgICAgICBAcGFyYW0ge0RTLlN0b3Jl fSBzdG9yZQogICAgICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9kZWx9 IHR5cGUKICAgICAgICBAcGFyYW0ge09iamVjdH0gcGF5bG9hZAogICAgICAg IEBwYXJhbSB7U3RyaW5nfSBpZAogICAgICAgIEBwYXJhbSB7J2ZpbmQnfCdj cmVhdGVSZWNvcmQnfCd1cGRhdGVSZWNvcmQnfCdkZWxldGVSZWNvcmQnfSBy ZXF1ZXN0VHlwZQogICAgICAgIEByZXR1cm5zIHtPYmplY3R9IHRoZSBwcmlt YXJ5IHJlc3BvbnNlIHRvIHRoZSBvcmlnaW5hbCByZXF1ZXN0CiAgICAgICov CiAgICAgIGV4dHJhY3RTaW5nbGU6IGZ1bmN0aW9uKHN0b3JlLCBwcmltYXJ5 VHlwZSwgcGF5bG9hZCwgcmVjb3JkSWQsIHJlcXVlc3RUeXBlKSB7CiAgICAg ICAgcGF5bG9hZCA9IHRoaXMubm9ybWFsaXplUGF5bG9hZChwcmltYXJ5VHlw ZSwgcGF5bG9hZCk7CgogICAgICAgIHZhciBwcmltYXJ5VHlwZU5hbWUgPSBw cmltYXJ5VHlwZS50eXBlS2V5LAogICAgICAgICAgICBwcmltYXJ5UmVjb3Jk OwoKICAgICAgICBmb3IgKHZhciBwcm9wIGluIHBheWxvYWQpIHsKICAgICAg ICAgIHZhciB0eXBlTmFtZSAgPSB0aGlzLnR5cGVGb3JSb290KHByb3ApLAog ICAgICAgICAgICAgIHR5cGUgPSBzdG9yZS5tb2RlbEZvcih0eXBlTmFtZSks CiAgICAgICAgICAgICAgaXNQcmltYXJ5ID0gdHlwZS50eXBlS2V5ID09PSBw cmltYXJ5VHlwZU5hbWU7CgogICAgICAgICAgLy8gbGVnYWN5IHN1cHBvcnQg Zm9yIHNpbmd1bGFyIHJlc291cmNlcwogICAgICAgICAgaWYgKGlzUHJpbWFy eSAmJiBFbWJlci50eXBlT2YocGF5bG9hZFtwcm9wXSkgIT09ICJhcnJheSIg KSB7CiAgICAgICAgICAgIHByaW1hcnlSZWNvcmQgPSB0aGlzLm5vcm1hbGl6 ZShwcmltYXJ5VHlwZSwgcGF5bG9hZFtwcm9wXSwgcHJvcCk7CiAgICAgICAg ICAgIGNvbnRpbnVlOwogICAgICAgICAgfQoKICAgICAgICAgIC8qanNoaW50 IGxvb3BmdW5jOnRydWUqLwogICAgICAgICAgZm9yRWFjaC5jYWxsKHBheWxv YWRbcHJvcF0sIGZ1bmN0aW9uKGhhc2gpIHsKICAgICAgICAgICAgdmFyIHR5 cGVOYW1lID0gdGhpcy50eXBlRm9yUm9vdChwcm9wKSwKICAgICAgICAgICAg ICAgIHR5cGUgPSBzdG9yZS5tb2RlbEZvcih0eXBlTmFtZSksCiAgICAgICAg ICAgICAgICB0eXBlU2VyaWFsaXplciA9IHN0b3JlLnNlcmlhbGl6ZXJGb3Io dHlwZSk7CgogICAgICAgICAgICBoYXNoID0gdHlwZVNlcmlhbGl6ZXIubm9y bWFsaXplKHR5cGUsIGhhc2gsIHByb3ApOwoKICAgICAgICAgICAgdmFyIGlz Rmlyc3RDcmVhdGVkUmVjb3JkID0gaXNQcmltYXJ5ICYmICFyZWNvcmRJZCAm JiAhcHJpbWFyeVJlY29yZCwKICAgICAgICAgICAgICAgIGlzVXBkYXRlZFJl Y29yZCA9IGlzUHJpbWFyeSAmJiBjb2VyY2VJZChoYXNoLmlkKSA9PT0gcmVj b3JkSWQ7CgogICAgICAgICAgICAvLyBmaW5kIHRoZSBwcmltYXJ5IHJlY29y ZC4KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gSXQncyBlaXRoZXI6 CiAgICAgICAgICAgIC8vICogdGhlIHJlY29yZCB3aXRoIHRoZSBzYW1lIElE IGFzIHRoZSBvcmlnaW5hbCByZXF1ZXN0CiAgICAgICAgICAgIC8vICogaW4g dGhlIGNhc2Ugb2YgYSBuZXdseSBjcmVhdGVkIHJlY29yZCB0aGF0IGRpZG4n dCBoYXZlIGFuIElELCB0aGUgZmlyc3QKICAgICAgICAgICAgLy8gICByZWNv cmQgaW4gdGhlIEFycmF5CiAgICAgICAgICAgIGlmIChpc0ZpcnN0Q3JlYXRl ZFJlY29yZCB8fCBpc1VwZGF0ZWRSZWNvcmQpIHsKICAgICAgICAgICAgICBw cmltYXJ5UmVjb3JkID0gaGFzaDsKICAgICAgICAgICAgfSBlbHNlIHsKICAg ICAgICAgICAgICBzdG9yZS5wdXNoKHR5cGVOYW1lLCBoYXNoKTsKICAgICAg ICAgICAgfQogICAgICAgICAgfSwgdGhpcyk7CiAgICAgICAgfQoKICAgICAg ICByZXR1cm4gcHJpbWFyeVJlY29yZDsKICAgICAgfSwKCiAgICAgIC8qKgog ICAgICAgIENhbGxlZCB3aGVuIHRoZSBzZXJ2ZXIgaGFzIHJldHVybmVkIGEg cGF5bG9hZCByZXByZXNlbnRpbmcKICAgICAgICBtdWx0aXBsZSByZWNvcmRz LCBzdWNoIGFzIGluIHJlc3BvbnNlIHRvIGEgYGZpbmRBbGxgIG9yIGBmaW5k UXVlcnlgLgoKICAgICAgICBJdCBpcyB5b3VyIG9wcG9ydHVuaXR5IHRvIGNs ZWFuIHVwIHRoZSBzZXJ2ZXIncyByZXNwb25zZSBpbnRvIHRoZSBub3JtYWxp emVkCiAgICAgICAgZm9ybSBleHBlY3RlZCBieSBFbWJlciBEYXRhLgoKICAg ICAgICBJZiB5b3Ugd2FudCwgeW91IGNhbiBqdXN0IHJlc3RydWN0dXJlIHRo ZSB0b3AtbGV2ZWwgb2YgeW91ciBwYXlsb2FkLCBhbmQKICAgICAgICBkbyBt b3JlIGZpbmUtZ3JhaW5lZCBub3JtYWxpemF0aW9uIGluIHRoZSBgbm9ybWFs aXplYCBtZXRob2QuCgogICAgICAgIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2 ZSBhIHBheWxvYWQgbGlrZSB0aGlzIGluIHJlc3BvbnNlIHRvIGEgcmVxdWVz dCBmb3IKICAgICAgICBhbGwgcG9zdHM6CgogICAgICAgIGBgYGpzCiAgICAg ICAgewogICAgICAgICAgIl9lbWJlZGRlZCI6IHsKICAgICAgICAgICAgInBv c3QiOiBbewogICAgICAgICAgICAgICJpZCI6IDEsCiAgICAgICAgICAgICAg InRpdGxlIjogIlJhaWxzIGlzIG9tYWthc2UiCiAgICAgICAgICAgIH0sIHsK ICAgICAgICAgICAgICAiaWQiOiAyLAogICAgICAgICAgICAgICJ0aXRsZSI6 ICJUaGUgUGFybGV5IExldHRlciIKICAgICAgICAgICAgfV0sCiAgICAgICAg ICAgICJjb21tZW50IjogW3sKICAgICAgICAgICAgICAiX2lkIjogMSwKICAg ICAgICAgICAgICAiY29tbWVudF90aXRsZSI6ICJSYWlscyBpcyB1bmFnaSIK ICAgICAgICAgICAgICAicG9zdF9pZCI6IDEKICAgICAgICAgICAgfSwgewog ICAgICAgICAgICAgICJfaWQiOiAyLAogICAgICAgICAgICAgICJjb21tZW50 X3RpdGxlIjogIkRvbid0IHRyZWFkIG9uIG1lIiwKICAgICAgICAgICAgICAi cG9zdF9pZCI6IDIKICAgICAgICAgICAgfV0KICAgICAgICAgIH0KICAgICAg ICB9CiAgICAgICAgYGBgCgogICAgICAgIFlvdSBjb3VsZCBpbXBsZW1lbnQg YSBzZXJpYWxpemVyIHRoYXQgbG9va3MgbGlrZSB0aGlzIHRvIGdldCB5b3Vy IHBheWxvYWQKICAgICAgICBpbnRvIHNoYXBlOgoKICAgICAgICBgYGBqcwog ICAgICAgIEFwcC5Qb3N0U2VyaWFsaXplciA9IERTLlJFU1RTZXJpYWxpemVy LmV4dGVuZCh7CiAgICAgICAgICAvLyBGaXJzdCwgcmVzdHJ1Y3R1cmUgdGhl IHRvcC1sZXZlbCBzbyBpdCdzIG9yZ2FuaXplZCBieSB0eXBlCiAgICAgICAg ICAvLyBhbmQgdGhlIGNvbW1lbnRzIGFyZSBsaXN0ZWQgdW5kZXIgYSBwb3N0 J3MgYGNvbW1lbnRzYCBrZXkuCiAgICAgICAgICBleHRyYWN0QXJyYXk6IGZ1 bmN0aW9uKHN0b3JlLCB0eXBlLCBwYXlsb2FkLCBpZCwgcmVxdWVzdFR5cGUp IHsKICAgICAgICAgICAgdmFyIHBvc3RzID0gcGF5bG9hZC5fZW1iZWRkZWQu cG9zdDsKICAgICAgICAgICAgdmFyIGNvbW1lbnRzID0gW107CiAgICAgICAg ICAgIHZhciBwb3N0Q2FjaGUgPSB7fTsKCiAgICAgICAgICAgIHBvc3RzLmZv ckVhY2goZnVuY3Rpb24ocG9zdCkgewogICAgICAgICAgICAgIHBvc3QuY29t bWVudHMgPSBbXTsKICAgICAgICAgICAgICBwb3N0Q2FjaGVbcG9zdC5pZF0g PSBwb3N0OwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHBheWxvYWQu X2VtYmVkZGVkLmNvbW1lbnQuZm9yRWFjaChmdW5jdGlvbihjb21tZW50KSB7 CiAgICAgICAgICAgICAgY29tbWVudHMucHVzaChjb21tZW50KTsKICAgICAg ICAgICAgICBwb3N0Q2FjaGVbY29tbWVudC5wb3N0X2lkXS5jb21tZW50cy5w dXNoKGNvbW1lbnQpOwogICAgICAgICAgICAgIGRlbGV0ZSBjb21tZW50LnBv c3RfaWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHBheWxvYWQgPSB7 IGNvbW1lbnRzOiBjb21tZW50cywgcG9zdHM6IHBheWxvYWQgfTsKCiAgICAg ICAgICAgIHJldHVybiB0aGlzLl9zdXBlcihzdG9yZSwgdHlwZSwgcGF5bG9h ZCwgaWQsIHJlcXVlc3RUeXBlKTsKICAgICAgICAgIH0sCgogICAgICAgICAg bm9ybWFsaXplSGFzaDogewogICAgICAgICAgICAvLyBOZXh0LCBub3JtYWxp emUgaW5kaXZpZHVhbCBjb21tZW50cywgd2hpY2ggKGFmdGVyIGBleHRyYWN0 YCkKICAgICAgICAgICAgLy8gYXJlIG5vdyBsb2NhdGVkIHVuZGVyIGBjb21t ZW50c2AKICAgICAgICAgICAgY29tbWVudHM6IGZ1bmN0aW9uKGhhc2gpIHsK ICAgICAgICAgICAgICBoYXNoLmlkID0gaGFzaC5faWQ7CiAgICAgICAgICAg ICAgaGFzaC50aXRsZSA9IGhhc2guY29tbWVudF90aXRsZTsKICAgICAgICAg ICAgICBkZWxldGUgaGFzaC5faWQ7CiAgICAgICAgICAgICAgZGVsZXRlIGhh c2guY29tbWVudF90aXRsZTsKICAgICAgICAgICAgICByZXR1cm4gaGFzaDsK ICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgICAg YGBgCgogICAgICAgIFdoZW4geW91IGNhbGwgc3VwZXIgZnJvbSB5b3VyIG93 biBpbXBsZW1lbnRhdGlvbiBvZiBgZXh0cmFjdEFycmF5YCwgdGhlCiAgICAg ICAgYnVpbHQtaW4gaW1wbGVtZW50YXRpb24gd2lsbCBmaW5kIHRoZSBwcmlt YXJ5IGFycmF5IGluIHlvdXIgbm9ybWFsaXplZAogICAgICAgIHBheWxvYWQg YW5kIHB1c2ggdGhlIHJlbWFpbmluZyByZWNvcmRzIGludG8gdGhlIHN0b3Jl LgoKICAgICAgICBUaGUgcHJpbWFyeSBhcnJheSBpcyB0aGUgYXJyYXkgZm91 bmQgdW5kZXIgYHBvc3RzYC4KCiAgICAgICAgVGhlIHByaW1hcnkgcmVjb3Jk IGhhcyBzcGVjaWFsIG1lYW5pbmcgd2hlbiByZXNwb25kaW5nIHRvIGBmaW5k UXVlcnlgCiAgICAgICAgb3IgYGZpbmRIYXNNYW55YC4gSW4gcGFydGljdWxh ciwgdGhlIHByaW1hcnkgYXJyYXkgd2lsbCBiZWNvbWUgdGhlCiAgICAgICAg bGlzdCBvZiByZWNvcmRzIGluIHRoZSByZWNvcmQgYXJyYXkgdGhhdCBraWNr ZWQgb2ZmIHRoZSByZXF1ZXN0LgoKICAgICAgICBJZiB5b3VyIHByaW1hcnkg YXJyYXkgY29udGFpbnMgc2Vjb25kYXJ5IChlbWJlZGRlZCkgcmVjb3JkcyBv ZiB0aGUgc2FtZSB0eXBlLAogICAgICAgIHlvdSBjYW5ub3QgcGxhY2UgdGhl c2UgaW50byB0aGUgcHJpbWFyeSBhcnJheSBgcG9zdHNgLiBJbnN0ZWFkLCBw bGFjZSB0aGUKICAgICAgICBzZWNvbmRhcnkgaXRlbXMgaW50byBhbiB1bmRl cnNjb3JlIHByZWZpeGVkIHByb3BlcnR5IGBfcG9zdHNgLCB3aGljaCB3aWxs CiAgICAgICAgcHVzaCB0aGVzZSBpdGVtcyBpbnRvIHRoZSBzdG9yZSBhbmQg d2lsbCBub3QgYWZmZWN0IHRoZSByZXN1bHRpbmcgcXVlcnkuCgogICAgICAg IEBtZXRob2QgZXh0cmFjdEFycmF5CiAgICAgICAgQHBhcmFtIHtEUy5TdG9y ZX0gc3RvcmUKICAgICAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVs fSB0eXBlCiAgICAgICAgQHBhcmFtIHtPYmplY3R9IHBheWxvYWQKICAgICAg ICBAcGFyYW0geydmaW5kQWxsJ3wnZmluZE1hbnknfCdmaW5kSGFzTWFueSd8 J2ZpbmRRdWVyeSd9IHJlcXVlc3RUeXBlCiAgICAgICAgQHJldHVybnMge0Fy cmF5fSBUaGUgcHJpbWFyeSBhcnJheSB0aGF0IHdhcyByZXR1cm5lZCBpbiBy ZXNwb25zZQogICAgICAgICAgdG8gdGhlIG9yaWdpbmFsIHF1ZXJ5LgogICAg ICAqLwogICAgICBleHRyYWN0QXJyYXk6IGZ1bmN0aW9uKHN0b3JlLCBwcmlt YXJ5VHlwZSwgcGF5bG9hZCkgewogICAgICAgIHBheWxvYWQgPSB0aGlzLm5v cm1hbGl6ZVBheWxvYWQocHJpbWFyeVR5cGUsIHBheWxvYWQpOwoKICAgICAg ICB2YXIgcHJpbWFyeVR5cGVOYW1lID0gcHJpbWFyeVR5cGUudHlwZUtleSwK ICAgICAgICAgICAgcHJpbWFyeUFycmF5OwoKICAgICAgICBmb3IgKHZhciBw cm9wIGluIHBheWxvYWQpIHsKICAgICAgICAgIHZhciB0eXBlS2V5ID0gcHJv cCwKICAgICAgICAgICAgICBmb3JjZWRTZWNvbmRhcnkgPSBmYWxzZTsKCiAg ICAgICAgICBpZiAocHJvcC5jaGFyQXQoMCkgPT09ICdfJykgewogICAgICAg ICAgICBmb3JjZWRTZWNvbmRhcnkgPSB0cnVlOwogICAgICAgICAgICB0eXBl S2V5ID0gcHJvcC5zdWJzdHIoMSk7CiAgICAgICAgICB9CgogICAgICAgICAg dmFyIHR5cGVOYW1lID0gdGhpcy50eXBlRm9yUm9vdCh0eXBlS2V5KSwKICAg ICAgICAgICAgICB0eXBlID0gc3RvcmUubW9kZWxGb3IodHlwZU5hbWUpLAog ICAgICAgICAgICAgIHR5cGVTZXJpYWxpemVyID0gc3RvcmUuc2VyaWFsaXpl ckZvcih0eXBlKSwKICAgICAgICAgICAgICBpc1ByaW1hcnkgPSAoIWZvcmNl ZFNlY29uZGFyeSAmJiAodHlwZS50eXBlS2V5ID09PSBwcmltYXJ5VHlwZU5h bWUpKTsKCiAgICAgICAgICAvKmpzaGludCBsb29wZnVuYzp0cnVlKi8KICAg ICAgICAgIHZhciBub3JtYWxpemVkQXJyYXkgPSBtYXAuY2FsbChwYXlsb2Fk W3Byb3BdLCBmdW5jdGlvbihoYXNoKSB7CiAgICAgICAgICAgIHJldHVybiB0 eXBlU2VyaWFsaXplci5ub3JtYWxpemUodHlwZSwgaGFzaCwgcHJvcCk7CiAg ICAgICAgICB9LCB0aGlzKTsKCiAgICAgICAgICBpZiAoaXNQcmltYXJ5KSB7 CiAgICAgICAgICAgIHByaW1hcnlBcnJheSA9IG5vcm1hbGl6ZWRBcnJheTsK ICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0b3JlLnB1c2hNYW55 KHR5cGVOYW1lLCBub3JtYWxpemVkQXJyYXkpOwogICAgICAgICAgfQogICAg ICAgIH0KCiAgICAgICAgcmV0dXJuIHByaW1hcnlBcnJheTsKICAgICAgfSwK CiAgICAgIC8qKgogICAgICAgIFRoaXMgbWV0aG9kIGFsbG93cyB5b3UgdG8g cHVzaCBhIHBheWxvYWQgY29udGFpbmluZyB0b3AtbGV2ZWwKICAgICAgICBj b2xsZWN0aW9ucyBvZiByZWNvcmRzIG9yZ2FuaXplZCBwZXIgdHlwZS4KCiAg ICAgICAgYGBganMKICAgICAgICB7CiAgICAgICAgICAicG9zdHMiOiBbewog ICAgICAgICAgICAiaWQiOiAiMSIsCiAgICAgICAgICAgICJ0aXRsZSI6ICJS YWlscyBpcyBvbWFrYXNlIiwKICAgICAgICAgICAgImF1dGhvciIsICIxIiwK ICAgICAgICAgICAgImNvbW1lbnRzIjogWyAiMSIgXQogICAgICAgICAgfV0s CiAgICAgICAgICAiY29tbWVudHMiOiBbewogICAgICAgICAgICAiaWQiOiAi MSIsCiAgICAgICAgICAgICJib2R5IjogIkZJUlNUIgogICAgICAgICAgfV0s CiAgICAgICAgICAidXNlcnMiOiBbewogICAgICAgICAgICAiaWQiOiAiMSIs CiAgICAgICAgICAgICJuYW1lIjogIkBkMmgiCiAgICAgICAgICB9XQogICAg ICAgIH0KICAgICAgICBgYGAKCiAgICAgICAgSXQgd2lsbCBmaXJzdCBub3Jt YWxpemUgdGhlIHBheWxvYWQsIHNvIHlvdSBjYW4gdXNlIHRoaXMgdG8gcHVz aAogICAgICAgIGluIGRhdGEgc3RyZWFtaW5nIGluIGZyb20geW91ciBzZXJ2 ZXIgc3RydWN0dXJlZCB0aGUgc2FtZSB3YXkKICAgICAgICB0aGF0IGZldGNo ZXMgYW5kIHNhdmVzIGFyZSBzdHJ1Y3R1cmVkLgoKICAgICAgICBAbWV0aG9k IHB1c2hQYXlsb2FkCiAgICAgICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUK ICAgICAgICBAcGFyYW0ge09iamVjdH0gcGF5bG9hZAogICAgICAqLwogICAg ICBwdXNoUGF5bG9hZDogZnVuY3Rpb24oc3RvcmUsIHBheWxvYWQpIHsKICAg ICAgICBwYXlsb2FkID0gdGhpcy5ub3JtYWxpemVQYXlsb2FkKG51bGwsIHBh eWxvYWQpOwoKICAgICAgICBmb3IgKHZhciBwcm9wIGluIHBheWxvYWQpIHsK ICAgICAgICAgIHZhciB0eXBlTmFtZSA9IHRoaXMudHlwZUZvclJvb3QocHJv cCksCiAgICAgICAgICAgICAgdHlwZSA9IHN0b3JlLm1vZGVsRm9yKHR5cGVO YW1lKTsKCiAgICAgICAgICAvKmpzaGludCBsb29wZnVuYzp0cnVlKi8KICAg ICAgICAgIHZhciBub3JtYWxpemVkQXJyYXkgPSBtYXAuY2FsbChFbWJlci5t YWtlQXJyYXkocGF5bG9hZFtwcm9wXSksIGZ1bmN0aW9uKGhhc2gpIHsKICAg ICAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplKHR5cGUsIGhhc2gsIHBy b3ApOwogICAgICAgICAgfSwgdGhpcyk7CgogICAgICAgICAgc3RvcmUucHVz aE1hbnkodHlwZU5hbWUsIG5vcm1hbGl6ZWRBcnJheSk7CiAgICAgICAgfQog ICAgICB9LAoKICAgICAgLyoqCiAgICAgICAgWW91IGNhbiB1c2UgdGhpcyBt ZXRob2QgdG8gbm9ybWFsaXplIHRoZSBKU09OIHJvb3Qga2V5cyByZXR1cm5l ZAogICAgICAgIGludG8gdGhlIG1vZGVsIHR5cGUgZXhwZWN0ZWQgYnkgeW91 ciBzdG9yZS4KCiAgICAgICAgRm9yIGV4YW1wbGUsIHlvdXIgc2VydmVyIG1h eSByZXR1cm4gdW5kZXJzY29yZWQgcm9vdCBrZXlzIHJhdGhlciB0aGFuCiAg ICAgICAgdGhlIGV4cGVjdGVkIGNhbWVsY2FzZWQgdmVyc2lvbnMuCgogICAg ICAgIGBgYGpzCiAgICAgICAgQXBwLkFwcGxpY2F0aW9uU2VyaWFsaXplciA9 IERTLlJFU1RTZXJpYWxpemVyLmV4dGVuZCh7CiAgICAgICAgICB0eXBlRm9y Um9vdDogZnVuY3Rpb24ocm9vdCkgewogICAgICAgICAgICB2YXIgY2FtZWxp emVkID0gRW1iZXIuU3RyaW5nLmNhbWVsaXplKHJvb3QpOwogICAgICAgICAg ICByZXR1cm4gRW1iZXIuU3RyaW5nLnNpbmd1bGFyaXplKGNhbWVsaXplZCk7 CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgYGBgCgogICAgICAg IEBtZXRob2QgdHlwZUZvclJvb3QKICAgICAgICBAcGFyYW0ge1N0cmluZ30g cm9vdAogICAgICAgIEByZXR1cm5zIHtTdHJpbmd9IHRoZSBtb2RlbCdzIHR5 cGVLZXkKICAgICAgKi8KICAgICAgdHlwZUZvclJvb3Q6IGZ1bmN0aW9uKHJv b3QpIHsKICAgICAgICByZXR1cm4gRW1iZXIuU3RyaW5nLnNpbmd1bGFyaXpl KHJvb3QpOwogICAgICB9LAoKICAgICAgLy8gU0VSSUFMSVpFCgogICAgICAv KioKICAgICAgICBDYWxsZWQgd2hlbiBhIHJlY29yZCBpcyBzYXZlZCBpbiBv cmRlciB0byBjb252ZXJ0IHRoZQogICAgICAgIHJlY29yZCBpbnRvIEpTT04u CgogICAgICAgIEJ5IGRlZmF1bHQsIGl0IGNyZWF0ZXMgYSBKU09OIG9iamVj dCB3aXRoIGEga2V5IGZvcgogICAgICAgIGVhY2ggYXR0cmlidXRlIGFuZCBi ZWxvbmdzVG8gcmVsYXRpb25zaGlwLgoKICAgICAgICBGb3IgZXhhbXBsZSwg Y29uc2lkZXIgdGhpcyBtb2RlbDoKCiAgICAgICAgYGBganMKICAgICAgICBB cHAuQ29tbWVudCA9IERTLk1vZGVsLmV4dGVuZCh7CiAgICAgICAgICB0aXRs ZTogRFMuYXR0cigpLAogICAgICAgICAgYm9keTogRFMuYXR0cigpLAoKICAg ICAgICAgIGF1dGhvcjogRFMuYmVsb25nc1RvKCd1c2VyJykKICAgICAgICB9 KTsKICAgICAgICBgYGAKCiAgICAgICAgVGhlIGRlZmF1bHQgc2VyaWFsaXph dGlvbiB3b3VsZCBjcmVhdGUgYSBKU09OIG9iamVjdCBsaWtlOgoKICAgICAg ICBgYGBqcwogICAgICAgIHsKICAgICAgICAgICJ0aXRsZSI6ICJSYWlscyBp cyB1bmFnaSIsCiAgICAgICAgICAiYm9keSI6ICJSYWlscz8gT21ha2FzZT8g T19PIiwKICAgICAgICAgICJhdXRob3IiOiAxMgogICAgICAgIH0KICAgICAg ICBgYGAKCiAgICAgICAgQnkgZGVmYXVsdCwgYXR0cmlidXRlcyBhcmUgcGFz c2VkIHRocm91Z2ggYXMtaXMsIHVubGVzcwogICAgICAgIHlvdSBzcGVjaWZp ZWQgYW4gYXR0cmlidXRlIHR5cGUgKGBEUy5hdHRyKCdkYXRlJylgKS4gSWYK ICAgICAgICB5b3Ugc3BlY2lmeSBhIHRyYW5zZm9ybSwgdGhlIEphdmFTY3Jp cHQgdmFsdWUgd2lsbCBiZQogICAgICAgIHNlcmlhbGl6ZWQgd2hlbiBpbnNl cnRlZCBpbnRvIHRoZSBKU09OIGhhc2guCgogICAgICAgIEJ5IGRlZmF1bHQs IGJlbG9uZ3MtdG8gcmVsYXRpb25zaGlwcyBhcmUgY29udmVydGVkIGludG8K ICAgICAgICBJRHMgd2hlbiBpbnNlcnRlZCBpbnRvIHRoZSBKU09OIGhhc2gu CgogICAgICAgICMjIElEcwoKICAgICAgICBgc2VyaWFsaXplYCB0YWtlcyBh biBvcHRpb25zIGhhc2ggd2l0aCBhIHNpbmdsZSBvcHRpb246CiAgICAgICAg YGluY2x1ZGVJZGAuIElmIHRoaXMgb3B0aW9uIGlzIGB0cnVlYCwgYHNlcmlh bGl6ZWAgd2lsbCwKICAgICAgICBieSBkZWZhdWx0IGluY2x1ZGUgdGhlIElE IGluIHRoZSBKU09OIG9iamVjdCBpdCBidWlsZHMuCgogICAgICAgIFRoZSBh ZGFwdGVyIHBhc3NlcyBpbiBgaW5jbHVkZUlkOiB0cnVlYCB3aGVuIHNlcmlh bGl6aW5nCiAgICAgICAgYSByZWNvcmQgZm9yIGBjcmVhdGVSZWNvcmRgLCBi dXQgbm90IGZvciBgdXBkYXRlUmVjb3JkYC4KCiAgICAgICAgIyMgQ3VzdG9t aXphdGlvbgoKICAgICAgICBZb3VyIHNlcnZlciBtYXkgZXhwZWN0IGEgZGlm ZmVyZW50IEpTT04gZm9ybWF0IHRoYW4gdGhlCiAgICAgICAgYnVpbHQtaW4g c2VyaWFsaXphdGlvbiBmb3JtYXQuCgogICAgICAgIEluIHRoYXQgY2FzZSwg eW91IGNhbiBpbXBsZW1lbnQgYHNlcmlhbGl6ZWAgeW91cnNlbGYgYW5kCiAg ICAgICAgcmV0dXJuIGEgSlNPTiBoYXNoIG9mIHlvdXIgY2hvb3NpbmcuCgog ICAgICAgIGBgYGpzCiAgICAgICAgQXBwLlBvc3RTZXJpYWxpemVyID0gRFMu UkVTVFNlcmlhbGl6ZXIuZXh0ZW5kKHsKICAgICAgICAgIHNlcmlhbGl6ZTog ZnVuY3Rpb24ocG9zdCwgb3B0aW9ucykgewogICAgICAgICAgICB2YXIganNv biA9IHsKICAgICAgICAgICAgICBQT1NUX1RUTDogcG9zdC5nZXQoJ3RpdGxl JyksCiAgICAgICAgICAgICAgUE9TVF9CRFk6IHBvc3QuZ2V0KCdib2R5Jyks CiAgICAgICAgICAgICAgUE9TVF9DTVM6IHBvc3QuZ2V0KCdjb21tZW50cycp Lm1hcFByb3BlcnR5KCdpZCcpCiAgICAgICAgICAgIH0KCiAgICAgICAgICAg IGlmIChvcHRpb25zLmluY2x1ZGVJZCkgewogICAgICAgICAgICAgIGpzb24u UE9TVF9JRF8gPSBwb3N0LmdldCgnaWQnKTsKICAgICAgICAgICAgfQoKICAg ICAgICAgICAgcmV0dXJuIGpzb247CiAgICAgICAgICB9CiAgICAgICAgfSk7 CiAgICAgICAgYGBgCgogICAgICAgICMjIEN1c3RvbWl6aW5nIGFuIEFwcC1X aWRlIFNlcmlhbGl6ZXIKCiAgICAgICAgSWYgeW91IHdhbnQgdG8gZGVmaW5l IGEgc2VyaWFsaXplciBmb3IgeW91ciBlbnRpcmUKICAgICAgICBhcHBsaWNh dGlvbiwgeW91J2xsIHByb2JhYmx5IHdhbnQgdG8gdXNlIGBlYWNoQXR0cmli dXRlYAogICAgICAgIGFuZCBgZWFjaFJlbGF0aW9uc2hpcGAgb24gdGhlIHJl Y29yZC4KCiAgICAgICAgYGBganMKICAgICAgICBBcHAuQXBwbGljYXRpb25T ZXJpYWxpemVyID0gRFMuUkVTVFNlcmlhbGl6ZXIuZXh0ZW5kKHsKICAgICAg ICAgIHNlcmlhbGl6ZTogZnVuY3Rpb24ocmVjb3JkLCBvcHRpb25zKSB7CiAg ICAgICAgICAgIHZhciBqc29uID0ge307CgogICAgICAgICAgICByZWNvcmQu ZWFjaEF0dHJpYnV0ZShmdW5jdGlvbihuYW1lKSB7CiAgICAgICAgICAgICAg anNvbltzZXJ2ZXJBdHRyaWJ1dGVOYW1lKG5hbWUpXSA9IHJlY29yZC5nZXQo bmFtZSk7CiAgICAgICAgICAgIH0pCgogICAgICAgICAgICByZWNvcmQuZWFj aFJlbGF0aW9uc2hpcChmdW5jdGlvbihuYW1lLCByZWxhdGlvbnNoaXApIHsK ICAgICAgICAgICAgICBpZiAocmVsYXRpb25zaGlwLmtpbmQgPT09ICdoYXNN YW55JykgewogICAgICAgICAgICAgICAganNvbltzZXJ2ZXJIYXNNYW55TmFt ZShuYW1lKV0gPSByZWNvcmQuZ2V0KG5hbWUpLm1hcEJ5KCdpZCcpOwogICAg ICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAo b3B0aW9ucy5pbmNsdWRlSWQpIHsKICAgICAgICAgICAgICBqc29uLklEXyA9 IHJlY29yZC5nZXQoJ2lkJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAg IHJldHVybiBqc29uOwogICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAg ICBmdW5jdGlvbiBzZXJ2ZXJBdHRyaWJ1dGVOYW1lKGF0dHJpYnV0ZSkgewog ICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZS51bmRlcnNjb3JlKCkudG9VcHBl ckNhc2UoKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHNlcnZlckhh c01hbnlOYW1lKG5hbWUpIHsKICAgICAgICAgIHJldHVybiBzZXJ2ZXJBdHRy aWJ1dGVOYW1lKG5hbWUuc2luZ3VsYXJpemUoKSkgKyAiX0lEUyI7CiAgICAg ICAgfQogICAgICAgIGBgYAoKICAgICAgICBUaGlzIHNlcmlhbGl6ZXIgd2ls bCBnZW5lcmF0ZSBKU09OIHRoYXQgbG9va3MgbGlrZSB0aGlzOgoKICAgICAg ICBgYGBqcwogICAgICAgIHsKICAgICAgICAgICJUSVRMRSI6ICJSYWlscyBp cyBvbWFrYXNlIiwKICAgICAgICAgICJCT0RZIjogIlllcC4gT21ha2FzZS4i LAogICAgICAgICAgIkNPTU1FTlRfSURTIjogWyAxLCAyLCAzIF0KICAgICAg ICB9CiAgICAgICAgYGBgCgogICAgICAgICMjIFR3ZWFraW5nIHRoZSBEZWZh dWx0IEpTT04KCiAgICAgICAgSWYgeW91IGp1c3Qgd2FudCB0byBkbyBzb21l IHNtYWxsIHR3ZWFrcyBvbiB0aGUgZGVmYXVsdCBKU09OLAogICAgICAgIHlv dSBjYW4gY2FsbCBzdXBlciBmaXJzdCBhbmQgbWFrZSB0aGUgdHdlYWtzIG9u IHRoZSByZXR1cm5lZAogICAgICAgIEpTT04uCgogICAgICAgIGBgYGpzCiAg ICAgICAgQXBwLlBvc3RTZXJpYWxpemVyID0gRFMuUkVTVFNlcmlhbGl6ZXIu ZXh0ZW5kKHsKICAgICAgICAgIHNlcmlhbGl6ZTogZnVuY3Rpb24ocmVjb3Jk LCBvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciBqc29uID0gdGhpcy5fc3Vw ZXIocmVjb3JkLCBvcHRpb25zKTsKCiAgICAgICAgICAgIGpzb24uc3ViamVj dCA9IGpzb24udGl0bGU7CiAgICAgICAgICAgIGRlbGV0ZSBqc29uLnRpdGxl OwoKICAgICAgICAgICAgcmV0dXJuIGpzb247CiAgICAgICAgICB9CiAgICAg ICAgfSk7CiAgICAgICAgYGBgCgogICAgICAgIEBtZXRob2Qgc2VyaWFsaXpl CiAgICAgICAgQHBhcmFtIHJlY29yZAogICAgICAgIEBwYXJhbSBvcHRpb25z CiAgICAgICovCiAgICAgIHNlcmlhbGl6ZTogZnVuY3Rpb24ocmVjb3JkLCBv cHRpb25zKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3N1cGVyLmFwcGx5KHRo aXMsIGFyZ3VtZW50cyk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICBZ b3UgY2FuIHVzZSB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgdGhlIHJvb3Qg a2V5cyBzZXJpYWxpemVkIGludG8gdGhlIEpTT04uCiAgICAgICAgQnkgZGVm YXVsdCB0aGUgUkVTVCBTZXJpYWxpemVyIHNlbmRzIGNhbWVsaXplZCByb290 IGtleXMuCiAgICAgICAgRm9yIGV4YW1wbGUsIHlvdXIgc2VydmVyIG1heSBl eHBlY3QgdW5kZXJzY29yZWQgcm9vdCBvYmplY3RzLgoKICAgICAgICBgYGBq cwogICAgICAgIEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6ZXIgPSBEUy5SRVNU U2VyaWFsaXplci5leHRlbmQoewogICAgICAgICAgc2VyaWFsaXplSW50b0hh c2g6IGZ1bmN0aW9uKGRhdGEsIHR5cGUsIHJlY29yZCwgb3B0aW9ucykgewog ICAgICAgICAgICB2YXIgcm9vdCA9IEVtYmVyLlN0cmluZy5kZWNhbWVsaXpl KHR5cGUudHlwZUtleSk7CiAgICAgICAgICAgIGRhdGFbcm9vdF0gPSB0aGlz LnNlcmlhbGl6ZShyZWNvcmQsIG9wdGlvbnMpOwogICAgICAgICAgfQogICAg ICAgIH0pOwogICAgICAgIGBgYAoKICAgICAgICBAbWV0aG9kIHNlcmlhbGl6 ZUludG9IYXNoCiAgICAgICAgQHBhcmFtIHtPYmplY3R9IGhhc2gKICAgICAg ICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCiAgICAgICAg QHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCiAgICAgICAgQHBhcmFtIHtPYmpl Y3R9IG9wdGlvbnMKICAgICAgKi8KICAgICAgc2VyaWFsaXplSW50b0hhc2g6 IGZ1bmN0aW9uKGhhc2gsIHR5cGUsIHJlY29yZCwgb3B0aW9ucykgewogICAg ICAgIHZhciByb290ID0gRW1iZXIuU3RyaW5nLmNhbWVsaXplKHR5cGUudHlw ZUtleSk7CiAgICAgICAgaGFzaFtyb290XSA9IHRoaXMuc2VyaWFsaXplKHJl Y29yZCwgb3B0aW9ucyk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICBZ b3UgY2FuIHVzZSB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgaG93IHBvbHlt b3JwaGljIG9iamVjdHMgYXJlIHNlcmlhbGl6ZWQuCiAgICAgICAgQnkgZGVm YXVsdCB0aGUgSlNPTiBTZXJpYWxpemVyIGNyZWF0ZXMgdGhlIGtleSBieSBh cHBlbmRpbmcgYFR5cGVgIHRvCiAgICAgICAgdGhlIGF0dHJpYnV0ZSBhbmQg dmFsdWUgZnJvbSB0aGUgbW9kZWwncyBjYW1lbGNhc2VkIG1vZGVsIG5hbWUu CgogICAgICAgIEBtZXRob2Qgc2VyaWFsaXplUG9seW1vcnBoaWNUeXBlCiAg ICAgICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCiAgICAgICAgQHBhcmFt IHtPYmplY3R9IGpzb24KICAgICAgICBAcGFyYW0ge09iamVjdH0gcmVsYXRp b25zaGlwCiAgICAgICovCiAgICAgIHNlcmlhbGl6ZVBvbHltb3JwaGljVHlw ZTogZnVuY3Rpb24ocmVjb3JkLCBqc29uLCByZWxhdGlvbnNoaXApIHsKICAg ICAgICB2YXIga2V5ID0gcmVsYXRpb25zaGlwLmtleSwKICAgICAgICAgICAg YmVsb25nc1RvID0gZ2V0KHJlY29yZCwga2V5KTsKICAgICAgICBrZXkgPSB0 aGlzLmtleUZvckF0dHJpYnV0ZSA/IHRoaXMua2V5Rm9yQXR0cmlidXRlKGtl eSkgOiBrZXk7CiAgICAgICAganNvbltrZXkgKyAiVHlwZSJdID0gRW1iZXIu U3RyaW5nLmNhbWVsaXplKGJlbG9uZ3NUby5jb25zdHJ1Y3Rvci50eXBlS2V5 KTsKICAgICAgfQogICAgfSk7CgogICAgX19leHBvcnRzX19bImRlZmF1bHQi XSA9IFJFU1RTZXJpYWxpemVyOwogIH0pOwpkZWZpbmUoImVtYmVyLWRhdGEv bGliL3N5c3RlbS9hZGFwdGVyIiwgCiAgWyJleHBvcnRzIl0sCiAgZnVuY3Rp b24oX19leHBvcnRzX18pIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIC8qKgog ICAgICBAbW9kdWxlIGVtYmVyLWRhdGEKICAgICovCgogICAgdmFyIGdldCA9 IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwogICAgdmFyIG1hcCA9IEVt YmVyLkFycmF5UG9seWZpbGxzLm1hcDsKCiAgICB2YXIgZXJyb3JQcm9wcyA9 IFsnZGVzY3JpcHRpb24nLCAnZmlsZU5hbWUnLCAnbGluZU51bWJlcicsICdt ZXNzYWdlJywgJ25hbWUnLCAnbnVtYmVyJywgJ3N0YWNrJ107CgogICAgLyoq CiAgICAgIEEgYERTLkludmFsaWRFcnJvcmAgaXMgdXNlZCBieSBhbiBhZGFw dGVyIHRvIHNpZ25hbCB0aGUgZXh0ZXJuYWwgQVBJCiAgICAgIHdhcyB1bmFi bGUgdG8gcHJvY2VzcyBhIHJlcXVlc3QgYmVjYXVzZSB0aGUgY29udGVudCB3 YXMgbm90CiAgICAgIHNlbWFudGljYWxseSBjb3JyZWN0IG9yIG1lYW5pbmdm dWwgcGVyIHRoZSBBUEkuIFVzdWFsbHkgdGhpcyBtZWFucyBhCiAgICAgIHJl Y29yZCBmYWlsZWQgc29tZSBmb3JtIG9mIHNlcnZlciBzaWRlIHZhbGlkYXRp b24uIFdoZW4gYSBwcm9taXNlCiAgICAgIGZyb20gYW4gYWRhcHRlciBpcyBy ZWplY3RlZCB3aXRoIGEgYERTLkludmFsaWRFcnJvcmAgdGhlIHJlY29yZCB3 aWxsCiAgICAgIHRyYW5zaXRpb24gdG8gdGhlIGBpbnZhbGlkYCBzdGF0ZSBh bmQgdGhlIGVycm9ycyB3aWxsIGJlIHNldCB0byB0aGUKICAgICAgYGVycm9y c2AgcHJvcGVydHkgb24gdGhlIHJlY29yZC4KCiAgICAgIEV4YW1wbGUKCiAg ICAgIGBgYGphdmFzY3JpcHQKICAgICAgQXBwLkFwcGxpY2F0aW9uQWRhcHRl ciA9IERTLlJFU1RBZGFwdGVyLmV4dGVuZCh7CiAgICAgICAgYWpheEVycm9y OiBmdW5jdGlvbihqcVhIUikgewogICAgICAgICAgdmFyIGVycm9yID0gdGhp cy5fc3VwZXIoanFYSFIpOwoKICAgICAgICAgIGlmIChqcVhIUiAmJiBqcVhI Ui5zdGF0dXMgPT09IDQyMikgewogICAgICAgICAgICB2YXIganNvbkVycm9y cyA9IEVtYmVyLiQucGFyc2VKU09OKGpxWEhSLnJlc3BvbnNlVGV4dClbImVy cm9ycyJdOwogICAgICAgICAgICByZXR1cm4gbmV3IERTLkludmFsaWRFcnJv cihqc29uRXJyb3JzKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAg IHJldHVybiBlcnJvcjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0p OwogICAgICBgYGAKCiAgICAgIEBjbGFzcyBJbnZhbGlkRXJyb3IKICAgICAg QG5hbWVzcGFjZSBEUwogICAgKi8KICAgIHZhciBJbnZhbGlkRXJyb3IgPSBm dW5jdGlvbihlcnJvcnMpIHsKICAgICAgdmFyIHRtcCA9IEVycm9yLnByb3Rv dHlwZS5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsICJUaGUgYmFja2VuZCByZWpl Y3RlZCB0aGUgY29tbWl0IGJlY2F1c2UgaXQgd2FzIGludmFsaWQ6ICIgKyBF bWJlci5pbnNwZWN0KGVycm9ycykpOwogICAgICB0aGlzLmVycm9ycyA9IGVy cm9yczsKCiAgICAgIGZvciAodmFyIGk9MCwgbD1lcnJvclByb3BzLmxlbmd0 aDsgaTxsOyBpKyspIHsKICAgICAgICB0aGlzW2Vycm9yUHJvcHNbaV1dID0g dG1wW2Vycm9yUHJvcHNbaV1dOwogICAgICB9CiAgICB9OwogICAgSW52YWxp ZEVycm9yLnByb3RvdHlwZSA9IEVtYmVyLmNyZWF0ZShFcnJvci5wcm90b3R5 cGUpOwoKICAgIC8qKgogICAgICBBbiBhZGFwdGVyIGlzIGFuIG9iamVjdCB0 aGF0IHJlY2VpdmVzIHJlcXVlc3RzIGZyb20gYSBzdG9yZSBhbmQKICAgICAg dHJhbnNsYXRlcyB0aGVtIGludG8gdGhlIGFwcHJvcHJpYXRlIGFjdGlvbiB0 byB0YWtlIGFnYWluc3QgeW91cgogICAgICBwZXJzaXN0ZW5jZSBsYXllci4g VGhlIHBlcnNpc3RlbmNlIGxheWVyIGlzIHVzdWFsbHkgYW4gSFRUUCBBUEks IGJ1dAogICAgICBtYXkgYmUgYW55dGhpbmcsIHN1Y2ggYXMgdGhlIGJyb3dz ZXIncyBsb2NhbCBzdG9yYWdlLiBUeXBpY2FsbHkgdGhlCiAgICAgIGFkYXB0 ZXIgaXMgbm90IGludm9rZWQgZGlyZWN0bHkgaW5zdGVhZCBpdHMgZnVuY3Rp b25hbGl0eSBpcyBhY2Nlc3NlZAogICAgICB0aHJvdWdoIHRoZSBgc3RvcmVg LgoKICAgICAgIyMjIENyZWF0aW5nIGFuIEFkYXB0ZXIKCiAgICAgIEZpcnN0 LCBjcmVhdGUgYSBuZXcgc3ViY2xhc3Mgb2YgYERTLkFkYXB0ZXJgOgoKICAg ICAgYGBgamF2YXNjcmlwdAogICAgICBBcHAuTXlBZGFwdGVyID0gRFMuQWRh cHRlci5leHRlbmQoewogICAgICAgIC8vIC4uLnlvdXIgY29kZSBoZXJlCiAg ICAgIH0pOwogICAgICBgYGAKCiAgICAgIFRvIHRlbGwgeW91ciBzdG9yZSB3 aGljaCBhZGFwdGVyIHRvIHVzZSwgc2V0IGl0cyBgYWRhcHRlcmAgcHJvcGVy dHk6CgogICAgICBgYGBqYXZhc2NyaXB0CiAgICAgIEFwcC5zdG9yZSA9IERT LlN0b3JlLmNyZWF0ZSh7CiAgICAgICAgYWRhcHRlcjogJ015QWRhcHRlcicK ICAgICAgfSk7CiAgICAgIGBgYAoKICAgICAgYERTLkFkYXB0ZXJgIGlzIGFu IGFic3RyYWN0IGJhc2UgY2xhc3MgdGhhdCB5b3Ugc2hvdWxkIG92ZXJyaWRl IGluIHlvdXIKICAgICAgYXBwbGljYXRpb24gdG8gY3VzdG9taXplIGl0IGZv ciB5b3VyIGJhY2tlbmQuIFRoZSBtaW5pbXVtIHNldCBvZiBtZXRob2RzCiAg ICAgIHRoYXQgeW91IHNob3VsZCBpbXBsZW1lbnQgaXM6CgogICAgICAgICog YGZpbmQoKWAKICAgICAgICAqIGBjcmVhdGVSZWNvcmQoKWAKICAgICAgICAq IGB1cGRhdGVSZWNvcmQoKWAKICAgICAgICAqIGBkZWxldGVSZWNvcmQoKWAK ICAgICAgICAqIGBmaW5kQWxsKClgCiAgICAgICAgKiBgZmluZFF1ZXJ5KClg CgogICAgICBUbyBpbXByb3ZlIHRoZSBuZXR3b3JrIHBlcmZvcm1hbmNlIG9m IHlvdXIgYXBwbGljYXRpb24sIHlvdSBjYW4gb3B0aW1pemUKICAgICAgeW91 ciBhZGFwdGVyIGJ5IG92ZXJyaWRpbmcgdGhlc2UgbG93ZXItbGV2ZWwgbWV0 aG9kczoKCiAgICAgICAgKiBgZmluZE1hbnkoKWAKCgogICAgICBGb3IgYW4g ZXhhbXBsZSBpbXBsZW1lbnRhdGlvbiwgc2VlIGBEUy5SRVNUQWRhcHRlcmAs IHRoZQogICAgICBpbmNsdWRlZCBSRVNUIGFkYXB0ZXIuCgogICAgICBAY2xh c3MgQWRhcHRlcgogICAgICBAbmFtZXNwYWNlIERTCiAgICAgIEBleHRlbmRz IEVtYmVyLk9iamVjdAogICAgKi8KCiAgICB2YXIgQWRhcHRlciA9IEVtYmVy Lk9iamVjdC5leHRlbmQoewoKICAgICAgLyoqCiAgICAgICAgSWYgeW91IHdv dWxkIGxpa2UgeW91ciBhZGFwdGVyIHRvIHVzZSBhIGN1c3RvbSBzZXJpYWxp emVyIHlvdSBjYW4KICAgICAgICBzZXQgdGhlIGBkZWZhdWx0U2VyaWFsaXpl cmAgcHJvcGVydHkgdG8gYmUgdGhlIG5hbWUgb2YgdGhlIGN1c3RvbQogICAg ICAgIHNlcmlhbGl6ZXIuCgogICAgICAgIE5vdGUgdGhlIGBkZWZhdWx0U2Vy aWFsaXplcmAgc2VyaWFsaXplciBoYXMgYSBsb3dlciBwcmlvcml0eSB0aGVu CiAgICAgICAgYSBtb2RlbCBzcGVjaWZpYyBzZXJpYWxpemVyIChpLmUuIGBQ b3N0U2VyaWFsaXplcmApIG9yIHRoZQogICAgICAgIGBhcHBsaWNhdGlvbmAg c2VyaWFsaXplci4KCiAgICAgICAgYGBgamF2YXNjcmlwdAogICAgICAgIHZh ciBEamFuZ29BZGFwdGVyID0gRFMuQWRhcHRlci5leHRlbmQoewogICAgICAg ICAgZGVmYXVsdFNlcmlhbGl6ZXI6ICdkamFuZ28nCiAgICAgICAgfSk7CiAg ICAgICAgYGBgCgogICAgICAgIEBwcm9wZXJ0eSBkZWZhdWx0U2VyaWFsaXpl cgogICAgICAgIEB0eXBlIHtTdHJpbmd9CiAgICAgICovCgogICAgICAvKioK ICAgICAgICBUaGUgYGZpbmQoKWAgbWV0aG9kIGlzIGludm9rZWQgd2hlbiB0 aGUgc3RvcmUgaXMgYXNrZWQgZm9yIGEgcmVjb3JkIHRoYXQKICAgICAgICBo YXMgbm90IHByZXZpb3VzbHkgYmVlbiBsb2FkZWQuIEluIHJlc3BvbnNlIHRv IGBmaW5kKClgIGJlaW5nIGNhbGxlZCwgeW91CiAgICAgICAgc2hvdWxkIHF1 ZXJ5IHlvdXIgcGVyc2lzdGVuY2UgbGF5ZXIgZm9yIGEgcmVjb3JkIHdpdGgg dGhlIGdpdmVuIElELiBPbmNlCiAgICAgICAgZm91bmQsIHlvdSBjYW4gYXN5 bmNocm9ub3VzbHkgY2FsbCB0aGUgc3RvcmUncyBgcHVzaCgpYCBtZXRob2Qg dG8gcHVzaAogICAgICAgIHRoZSByZWNvcmQgaW50byB0aGUgc3RvcmUuCgog ICAgICAgIEhlcmUgaXMgYW4gZXhhbXBsZSBgZmluZGAgaW1wbGVtZW50YXRp b246CgogICAgICAgIGBgYGphdmFzY3JpcHQKICAgICAgICBBcHAuQXBwbGlj YXRpb25BZGFwdGVyID0gRFMuQWRhcHRlci5leHRlbmQoewogICAgICAgICAg ZmluZDogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIGlkKSB7CiAgICAgICAgICAg IHZhciB1cmwgPSBbdHlwZSwgaWRdLmpvaW4oJy8nKTsKCiAgICAgICAgICAg IHJldHVybiBuZXcgRW1iZXIuUlNWUC5Qcm9taXNlKGZ1bmN0aW9uKHJlc29s dmUsIHJlamVjdCkgewogICAgICAgICAgICAgIGpRdWVyeS5nZXRKU09OKHVy bCkudGhlbihmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICAgICAgICBFbWJl ci5ydW4obnVsbCwgcmVzb2x2ZSwgZGF0YSk7CiAgICAgICAgICAgICAgfSwg ZnVuY3Rpb24oanFYSFIpIHsKICAgICAgICAgICAgICAgIGpxWEhSLnRoZW4g PSBudWxsOyAvLyB0YW1lIGpRdWVyeSdzIGlsbCBtYW5uZXJlZCBwcm9taXNl cwogICAgICAgICAgICAgICAgRW1iZXIucnVuKG51bGwsIHJlamVjdCwganFY SFIpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAg ICAgIH0KICAgICAgICB9KTsKICAgICAgICBgYGAKCiAgICAgICAgQG1ldGhv ZCBmaW5kCiAgICAgICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKICAgICAg ICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCiAgICAgICAg QHBhcmFtIHtTdHJpbmd9IGlkCiAgICAgICAgQHJldHVybiB7UHJvbWlzZX0g cHJvbWlzZQogICAgICAqLwogICAgICBmaW5kOiBFbWJlci5yZXF1aXJlZChG dW5jdGlvbiksCgogICAgICAvKioKICAgICAgICBUaGUgYGZpbmRBbGwoKWAg bWV0aG9kIGlzIGNhbGxlZCB3aGVuIHlvdSBjYWxsIGBmaW5kYCBvbiB0aGUg c3RvcmUKICAgICAgICB3aXRob3V0IGFuIElEIChpLmUuIGBzdG9yZS5maW5k KCdwb3N0JylgKS4KCiAgICAgICAgRXhhbXBsZQoKICAgICAgICBgYGBqYXZh c2NyaXB0CiAgICAgICAgQXBwLkFwcGxpY2F0aW9uQWRhcHRlciA9IERTLkFk YXB0ZXIuZXh0ZW5kKHsKICAgICAgICAgIGZpbmRBbGw6IGZ1bmN0aW9uKHN0 b3JlLCB0eXBlLCBzaW5jZVRva2VuKSB7CiAgICAgICAgICAgIHZhciB1cmwg PSB0eXBlOwogICAgICAgICAgICB2YXIgcXVlcnkgPSB7IHNpbmNlOiBzaW5j ZVRva2VuIH07CiAgICAgICAgICAgIHJldHVybiBuZXcgRW1iZXIuUlNWUC5Q cm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAg ICAgIGpRdWVyeS5nZXRKU09OKHVybCwgcXVlcnkpLnRoZW4oZnVuY3Rpb24o ZGF0YSkgewogICAgICAgICAgICAgICAgRW1iZXIucnVuKG51bGwsIHJlc29s dmUsIGRhdGEpOwogICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKGpxWEhSKSB7 CiAgICAgICAgICAgICAgICBqcVhIUi50aGVuID0gbnVsbDsgLy8gdGFtZSBq UXVlcnkncyBpbGwgbWFubmVyZWQgcHJvbWlzZXMKICAgICAgICAgICAgICAg IEVtYmVyLnJ1bihudWxsLCByZWplY3QsIGpxWEhSKTsKICAgICAgICAgICAg ICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7 CiAgICAgICAgYGBgCgogICAgICAgIEBwcml2YXRlCiAgICAgICAgQG1ldGhv ZCBmaW5kQWxsCiAgICAgICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKICAg ICAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCiAgICAg ICAgQHBhcmFtIHtTdHJpbmd9IHNpbmNlVG9rZW4KICAgICAgICBAcmV0dXJu IHtQcm9taXNlfSBwcm9taXNlCiAgICAgICovCiAgICAgIGZpbmRBbGw6IG51 bGwsCgogICAgICAvKioKICAgICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQg d2hlbiB5b3UgY2FsbCBgZmluZGAgb24gdGhlIHN0b3JlIHdpdGggYQogICAg ICAgIHF1ZXJ5IG9iamVjdCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlciAoaS5l LiBgc3RvcmUuZmluZCgncGVyc29uJywgewogICAgICAgIHBhZ2U6IDEgfSlg KS4KCiAgICAgICAgRXhhbXBsZQoKICAgICAgICBgYGBqYXZhc2NyaXB0CiAg ICAgICAgQXBwLkFwcGxpY2F0aW9uQWRhcHRlciA9IERTLkFkYXB0ZXIuZXh0 ZW5kKHsKICAgICAgICAgIGZpbmRRdWVyeTogZnVuY3Rpb24oc3RvcmUsIHR5 cGUsIHF1ZXJ5KSB7CiAgICAgICAgICAgIHZhciB1cmwgPSB0eXBlOwogICAg ICAgICAgICByZXR1cm4gbmV3IEVtYmVyLlJTVlAuUHJvbWlzZShmdW5jdGlv bihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICBqUXVlcnkuZ2V0 SlNPTih1cmwsIHF1ZXJ5KS50aGVuKGZ1bmN0aW9uKGRhdGEpIHsKICAgICAg ICAgICAgICAgIEVtYmVyLnJ1bihudWxsLCByZXNvbHZlLCBkYXRhKTsKICAg ICAgICAgICAgICB9LCBmdW5jdGlvbihqcVhIUikgewogICAgICAgICAgICAg ICAganFYSFIudGhlbiA9IG51bGw7IC8vIHRhbWUgalF1ZXJ5J3MgaWxsIG1h bm5lcmVkIHByb21pc2VzCiAgICAgICAgICAgICAgICBFbWJlci5ydW4obnVs bCwgcmVqZWN0LCBqcVhIUik7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAg ICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGBgYAoK ICAgICAgICBAcHJpdmF0ZQogICAgICAgIEBtZXRob2QgZmluZFF1ZXJ5CiAg ICAgICAgQHBhcmFtIHtEUy5TdG9yZX0gc3RvcmUKICAgICAgICBAcGFyYW0g e3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCiAgICAgICAgQHBhcmFtIHtP YmplY3R9IHF1ZXJ5CiAgICAgICAgQHBhcmFtIHtEUy5BZGFwdGVyUG9wdWxh dGVkUmVjb3JkQXJyYXl9IHJlY29yZEFycmF5CiAgICAgICAgQHJldHVybiB7 UHJvbWlzZX0gcHJvbWlzZQogICAgICAqLwogICAgICBmaW5kUXVlcnk6IG51 bGwsCgogICAgICAvKioKICAgICAgICBJZiB0aGUgZ2xvYmFsbHkgdW5pcXVl IElEcyBmb3IgeW91ciByZWNvcmRzIHNob3VsZCBiZSBnZW5lcmF0ZWQgb24g dGhlIGNsaWVudCwKICAgICAgICBpbXBsZW1lbnQgdGhlIGBnZW5lcmF0ZUlk Rm9yUmVjb3JkKClgIG1ldGhvZC4gVGhpcyBtZXRob2Qgd2lsbCBiZSBpbnZv a2VkCiAgICAgICAgZWFjaCB0aW1lIHlvdSBjcmVhdGUgYSBuZXcgcmVjb3Jk LCBhbmQgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gaXQgd2lsbCBiZQogICAg ICAgIGFzc2lnbmVkIHRvIHRoZSByZWNvcmQncyBgcHJpbWFyeUtleWAuCgog ICAgICAgIE1vc3QgdHJhZGl0aW9uYWwgUkVTVC1saWtlIEhUVFAgQVBJcyB3 aWxsIG5vdCB1c2UgdGhpcyBtZXRob2QuIEluc3RlYWQsIHRoZSBJRAogICAg ICAgIG9mIHRoZSByZWNvcmQgd2lsbCBiZSBzZXQgYnkgdGhlIHNlcnZlciwg YW5kIHlvdXIgYWRhcHRlciB3aWxsIHVwZGF0ZSB0aGUgc3RvcmUKICAgICAg ICB3aXRoIHRoZSBuZXcgSUQgd2hlbiBpdCBjYWxscyBgZGlkQ3JlYXRlUmVj b3JkKClgLiBPbmx5IGltcGxlbWVudCB0aGlzIG1ldGhvZCBpZgogICAgICAg IHlvdSBpbnRlbmQgdG8gZ2VuZXJhdGUgcmVjb3JkIElEcyBvbiB0aGUgY2xp ZW50LXNpZGUuCgogICAgICAgIFRoZSBgZ2VuZXJhdGVJZEZvclJlY29yZCgp YCBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIHdpdGggdGhlIHJlcXVlc3Rpbmcg c3RvcmUgYXMKICAgICAgICB0aGUgZmlyc3QgcGFyYW1ldGVyIGFuZCB0aGUg bmV3bHkgY3JlYXRlZCByZWNvcmQgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXI6 CgogICAgICAgIGBgYGphdmFzY3JpcHQKICAgICAgICBnZW5lcmF0ZUlkRm9y UmVjb3JkOiBmdW5jdGlvbihzdG9yZSwgcmVjb3JkKSB7CiAgICAgICAgICB2 YXIgdXVpZCA9IEFwcC5nZW5lcmF0ZVVVSURXaXRoU3RhdGlzdGljYWxseUxv d09kZHNPZkNvbGxpc2lvbigpOwogICAgICAgICAgcmV0dXJuIHV1aWQ7CiAg ICAgICAgfQogICAgICAgIGBgYAoKICAgICAgICBAbWV0aG9kIGdlbmVyYXRl SWRGb3JSZWNvcmQKICAgICAgICBAcGFyYW0ge0RTLlN0b3JlfSBzdG9yZQog ICAgICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAogICAgICAgIEByZXR1 cm4ge1N0cmluZ3xOdW1iZXJ9IGlkCiAgICAgICovCiAgICAgIGdlbmVyYXRl SWRGb3JSZWNvcmQ6IG51bGwsCgogICAgICAvKioKICAgICAgICBQcm94aWVz IHRvIHRoZSBzZXJpYWxpemVyJ3MgYHNlcmlhbGl6ZWAgbWV0aG9kLgoKICAg ICAgICBFeGFtcGxlCgogICAgICAgIGBgYGphdmFzY3JpcHQKICAgICAgICBB cHAuQXBwbGljYXRpb25BZGFwdGVyID0gRFMuQWRhcHRlci5leHRlbmQoewog ICAgICAgICAgY3JlYXRlUmVjb3JkOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwg cmVjb3JkKSB7CiAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5zZXJpYWxp emUocmVjb3JkLCB7IGluY2x1ZGVJZDogdHJ1ZSB9KTsKICAgICAgICAgICAg dmFyIHVybCA9IHR5cGU7CgogICAgICAgICAgICAvLyAuLi4KICAgICAgICAg IH0KICAgICAgICB9KTsKICAgICAgICBgYGAKCiAgICAgICAgQG1ldGhvZCBz ZXJpYWxpemUKICAgICAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKICAg ICAgICBAcGFyYW0ge09iamVjdH0gICBvcHRpb25zCiAgICAgICAgQHJldHVy biB7T2JqZWN0fSBzZXJpYWxpemVkIHJlY29yZAogICAgICAqLwogICAgICBz ZXJpYWxpemU6IGZ1bmN0aW9uKHJlY29yZCwgb3B0aW9ucykgewogICAgICAg IHJldHVybiBnZXQocmVjb3JkLCAnc3RvcmUnKS5zZXJpYWxpemVyRm9yKHJl Y29yZC5jb25zdHJ1Y3Rvci50eXBlS2V5KS5zZXJpYWxpemUocmVjb3JkLCBv cHRpb25zKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgIEltcGxlbWVu dCB0aGlzIG1ldGhvZCBpbiBhIHN1YmNsYXNzIHRvIGhhbmRsZSB0aGUgY3Jl YXRpb24gb2YKICAgICAgICBuZXcgcmVjb3Jkcy4KCiAgICAgICAgU2VyaWFs aXplcyB0aGUgcmVjb3JkIGFuZCBzZW5kIGl0IHRvIHRoZSBzZXJ2ZXIuCgog ICAgICAgIEV4YW1wbGUKCiAgICAgICAgYGBgamF2YXNjcmlwdAogICAgICAg IEFwcC5BcHBsaWNhdGlvbkFkYXB0ZXIgPSBEUy5BZGFwdGVyLmV4dGVuZCh7 CiAgICAgICAgICBjcmVhdGVSZWNvcmQ6IGZ1bmN0aW9uKHN0b3JlLCB0eXBl LCByZWNvcmQpIHsKICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLnNlcmlh bGl6ZShyZWNvcmQsIHsgaW5jbHVkZUlkOiB0cnVlIH0pOwogICAgICAgICAg ICB2YXIgdXJsID0gdHlwZTsKCiAgICAgICAgICAgIHJldHVybiBuZXcgRW1i ZXIuUlNWUC5Qcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewog ICAgICAgICAgICAgIGpRdWVyeS5hamF4KHsKICAgICAgICAgICAgICAgIHR5 cGU6ICdQT1NUJywKICAgICAgICAgICAgICAgIHVybDogdXJsLAogICAgICAg ICAgICAgICAgZGF0YVR5cGU6ICdqc29uJywKICAgICAgICAgICAgICAgIGRh dGE6IGRhdGEKICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uKGRhdGEp IHsKICAgICAgICAgICAgICAgIEVtYmVyLnJ1bihudWxsLCByZXNvbHZlLCBk YXRhKTsKICAgICAgICAgICAgICB9LCBmdW5jdGlvbihqcVhIUikgewogICAg ICAgICAgICAgICAganFYSFIudGhlbiA9IG51bGw7IC8vIHRhbWUgalF1ZXJ5 J3MgaWxsIG1hbm5lcmVkIHByb21pc2VzCiAgICAgICAgICAgICAgICBFbWJl ci5ydW4obnVsbCwgcmVqZWN0LCBqcVhIUik7CiAgICAgICAgICAgICAgfSk7 CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAg ICAgIGBgYAoKICAgICAgICBAbWV0aG9kIGNyZWF0ZVJlY29yZAogICAgICAg IEBwYXJhbSB7RFMuU3RvcmV9IHN0b3JlCiAgICAgICAgQHBhcmFtIHtzdWJj bGFzcyBvZiBEUy5Nb2RlbH0gdHlwZSAgIHRoZSBEUy5Nb2RlbCBjbGFzcyBv ZiB0aGUgcmVjb3JkCiAgICAgICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3Jk CiAgICAgICAgQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZQogICAgICAqLwog ICAgICBjcmVhdGVSZWNvcmQ6IEVtYmVyLnJlcXVpcmVkKEZ1bmN0aW9uKSwK CiAgICAgIC8qKgogICAgICAgIEltcGxlbWVudCB0aGlzIG1ldGhvZCBpbiBh IHN1YmNsYXNzIHRvIGhhbmRsZSB0aGUgdXBkYXRpbmcgb2YKICAgICAgICBh IHJlY29yZC4KCiAgICAgICAgU2VyaWFsaXplcyB0aGUgcmVjb3JkIHVwZGF0 ZSBhbmQgc2VuZCBpdCB0byB0aGUgc2VydmVyLgoKICAgICAgICBFeGFtcGxl CgogICAgICAgIGBgYGphdmFzY3JpcHQKICAgICAgICBBcHAuQXBwbGljYXRp b25BZGFwdGVyID0gRFMuQWRhcHRlci5leHRlbmQoewogICAgICAgICAgdXBk YXRlUmVjb3JkOiBmdW5jdGlvbihzdG9yZSwgdHlwZSwgcmVjb3JkKSB7CiAg ICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5zZXJpYWxpemUocmVjb3JkLCB7 IGluY2x1ZGVJZDogdHJ1ZSB9KTsKICAgICAgICAgICAgdmFyIGlkID0gcmVj b3JkLmdldCgnaWQnKTsKICAgICAgICAgICAgdmFyIHVybCA9IFt0eXBlLCBp ZF0uam9pbignLycpOwoKICAgICAgICAgICAgcmV0dXJuIG5ldyBFbWJlci5S U1ZQLlByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAg ICAgICAgICAgalF1ZXJ5LmFqYXgoewogICAgICAgICAgICAgICAgdHlwZTog J1BVVCcsCiAgICAgICAgICAgICAgICB1cmw6IHVybCwKICAgICAgICAgICAg ICAgIGRhdGFUeXBlOiAnanNvbicsCiAgICAgICAgICAgICAgICBkYXRhOiBk YXRhCiAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbihkYXRhKSB7CiAg ICAgICAgICAgICAgICBFbWJlci5ydW4obnVsbCwgcmVzb2x2ZSwgZGF0YSk7 CiAgICAgICAgICAgICAgfSwgZnVuY3Rpb24oanFYSFIpIHsKICAgICAgICAg ICAgICAgIGpxWEhSLnRoZW4gPSBudWxsOyAvLyB0YW1lIGpRdWVyeSdzIGls bCBtYW5uZXJlZCBwcm9taXNlcwogICAgICAgICAgICAgICAgRW1iZXIucnVu KG51bGwsIHJlamVjdCwganFYSFIpOwogICAgICAgICAgICAgIH0pOwogICAg ICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBg YGAKCiAgICAgICAgQG1ldGhvZCB1cGRhdGVSZWNvcmQKICAgICAgICBAcGFy YW0ge0RTLlN0b3JlfSBzdG9yZQogICAgICAgIEBwYXJhbSB7c3ViY2xhc3Mg b2YgRFMuTW9kZWx9IHR5cGUgICB0aGUgRFMuTW9kZWwgY2xhc3Mgb2YgdGhl IHJlY29yZAogICAgICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAogICAg ICAgIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2UKICAgICAgKi8KICAgICAg dXBkYXRlUmVjb3JkOiBFbWJlci5yZXF1aXJlZChGdW5jdGlvbiksCgogICAg ICAvKioKICAgICAgICBJbXBsZW1lbnQgdGhpcyBtZXRob2QgaW4gYSBzdWJj bGFzcyB0byBoYW5kbGUgdGhlIGRlbGV0aW9uIG9mCiAgICAgICAgYSByZWNv cmQuCgogICAgICAgIFNlbmRzIGEgZGVsZXRlIHJlcXVlc3QgZm9yIHRoZSBy ZWNvcmQgdG8gdGhlIHNlcnZlci4KCiAgICAgICAgRXhhbXBsZQoKICAgICAg ICBgYGBqYXZhc2NyaXB0CiAgICAgICAgQXBwLkFwcGxpY2F0aW9uQWRhcHRl ciA9IERTLkFkYXB0ZXIuZXh0ZW5kKHsKICAgICAgICAgIGRlbGV0ZVJlY29y ZDogZnVuY3Rpb24oc3RvcmUsIHR5cGUsIHJlY29yZCkgewogICAgICAgICAg ICB2YXIgZGF0YSA9IHRoaXMuc2VyaWFsaXplKHJlY29yZCwgeyBpbmNsdWRl SWQ6IHRydWUgfSk7CiAgICAgICAgICAgIHZhciBpZCA9IHJlY29yZC5nZXQo J2lkJyk7CiAgICAgICAgICAgIHZhciB1cmwgPSBbdHlwZSwgaWRdLmpvaW4o Jy8nKTsKCiAgICAgICAgICAgIHJldHVybiBuZXcgRW1iZXIuUlNWUC5Qcm9t aXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAg IGpRdWVyeS5hamF4KHsKICAgICAgICAgICAgICAgIHR5cGU6ICdERUxFVEUn LAogICAgICAgICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICAgICAgICBk YXRhVHlwZTogJ2pzb24nLAogICAgICAgICAgICAgICAgZGF0YTogZGF0YQog ICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24oZGF0YSkgewogICAgICAg ICAgICAgICAgRW1iZXIucnVuKG51bGwsIHJlc29sdmUsIGRhdGEpOwogICAg ICAgICAgICAgIH0sIGZ1bmN0aW9uKGpxWEhSKSB7CiAgICAgICAgICAgICAg ICBqcVhIUi50aGVuID0gbnVsbDsgLy8gdGFtZSBqUXVlcnkncyBpbGwgbWFu bmVyZWQgcHJvbWlzZXMKICAgICAgICAgICAgICAgIEVtYmVyLnJ1bihudWxs LCByZWplY3QsIGpxWEhSKTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAg ICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgYGBgCgog ICAgICAgIEBtZXRob2QgZGVsZXRlUmVjb3JkCiAgICAgICAgQHBhcmFtIHtE Uy5TdG9yZX0gc3RvcmUKICAgICAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERT Lk1vZGVsfSB0eXBlICAgdGhlIERTLk1vZGVsIGNsYXNzIG9mIHRoZSByZWNv cmQKICAgICAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKICAgICAgICBA cmV0dXJuIHtQcm9taXNlfSBwcm9taXNlCiAgICAgICovCiAgICAgIGRlbGV0 ZVJlY29yZDogRW1iZXIucmVxdWlyZWQoRnVuY3Rpb24pLAoKICAgICAgLyoq CiAgICAgICAgRmluZCBtdWx0aXBsZSByZWNvcmRzIGF0IG9uY2UuCgogICAg ICAgIEJ5IGRlZmF1bHQsIGl0IGxvb3BzIG92ZXIgdGhlIHByb3ZpZGVkIGlk cyBhbmQgY2FsbHMgYGZpbmRgIG9uIGVhY2guCiAgICAgICAgTWF5IGJlIG92 ZXJ3cml0dGVuIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgYW5kIHJlZHVjZSB0 aGUgbnVtYmVyIG9mCiAgICAgICAgc2VydmVyIHJlcXVlc3RzLgoKICAgICAg ICBFeGFtcGxlCgogICAgICAgIGBgYGphdmFzY3JpcHQKICAgICAgICBBcHAu QXBwbGljYXRpb25BZGFwdGVyID0gRFMuQWRhcHRlci5leHRlbmQoewogICAg ICAgICAgZmluZE1hbnk6IGZ1bmN0aW9uKHN0b3JlLCB0eXBlLCBpZHMpIHsK ICAgICAgICAgICAgdmFyIHVybCA9IHR5cGU7CiAgICAgICAgICAgIHJldHVy biBuZXcgRW1iZXIuUlNWUC5Qcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJl amVjdCkgewogICAgICAgICAgICAgIGpRdWVyeS5nZXRKU09OKHVybCwge2lk czogaWRzfSkudGhlbihmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICAgICAg ICBFbWJlci5ydW4obnVsbCwgcmVzb2x2ZSwgZGF0YSk7CiAgICAgICAgICAg ICAgfSwgZnVuY3Rpb24oanFYSFIpIHsKICAgICAgICAgICAgICAgIGpxWEhS LnRoZW4gPSBudWxsOyAvLyB0YW1lIGpRdWVyeSdzIGlsbCBtYW5uZXJlZCBw cm9taXNlcwogICAgICAgICAgICAgICAgRW1iZXIucnVuKG51bGwsIHJlamVj dCwganFYSFIpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsK ICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBgYGAKCiAgICAgICAg QG1ldGhvZCBmaW5kTWFueQogICAgICAgIEBwYXJhbSB7RFMuU3RvcmV9IHN0 b3JlCiAgICAgICAgQHBhcmFtIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlw ZSAgIHRoZSBEUy5Nb2RlbCBjbGFzcyBvZiB0aGUgcmVjb3JkcwogICAgICAg IEBwYXJhbSB7QXJyYXl9ICAgIGlkcwogICAgICAgIEByZXR1cm4ge1Byb21p c2V9IHByb21pc2UKICAgICAgKi8KICAgICAgZmluZE1hbnk6IGZ1bmN0aW9u KHN0b3JlLCB0eXBlLCBpZHMpIHsKICAgICAgICB2YXIgcHJvbWlzZXMgPSBt YXAuY2FsbChpZHMsIGZ1bmN0aW9uKGlkKSB7CiAgICAgICAgICByZXR1cm4g dGhpcy5maW5kKHN0b3JlLCB0eXBlLCBpZCk7CiAgICAgICAgfSwgdGhpcyk7 CgogICAgICAgIHJldHVybiBFbWJlci5SU1ZQLmFsbChwcm9taXNlcyk7CiAg ICAgIH0KICAgIH0pOwoKICAgIF9fZXhwb3J0c19fLkludmFsaWRFcnJvciA9 IEludmFsaWRFcnJvcjsKICAgIF9fZXhwb3J0c19fLkFkYXB0ZXIgPSBBZGFw dGVyOwogICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9IEFkYXB0ZXI7CiAg fSk7CmRlZmluZSgiZW1iZXItZGF0YS9saWIvc3lzdGVtL2NoYW5nZXMiLCAK ICBbIi4vY2hhbmdlcy9hdHRyaWJ1dGVfY2hhbmdlIiwiLi9jaGFuZ2VzL3Jl bGF0aW9uc2hpcF9jaGFuZ2UiLCJleHBvcnRzIl0sCiAgZnVuY3Rpb24oX19k ZXBlbmRlbmN5MV9fLCBfX2RlcGVuZGVuY3kyX18sIF9fZXhwb3J0c19fKSB7 CiAgICAidXNlIHN0cmljdCI7CiAgICAvKioKICAgICAgQG1vZHVsZSBlbWJl ci1kYXRhCiAgICAqLwoKICAgIHZhciBBdHRyaWJ1dGVDaGFuZ2UgPSBfX2Rl cGVuZGVuY3kxX19bImRlZmF1bHQiXTsKCiAgICB2YXIgUmVsYXRpb25zaGlw Q2hhbmdlID0gX19kZXBlbmRlbmN5Ml9fLlJlbGF0aW9uc2hpcENoYW5nZTsK ICAgIHZhciBSZWxhdGlvbnNoaXBDaGFuZ2VBZGQgPSBfX2RlcGVuZGVuY3ky X18uUmVsYXRpb25zaGlwQ2hhbmdlQWRkOwogICAgdmFyIFJlbGF0aW9uc2hp cENoYW5nZVJlbW92ZSA9IF9fZGVwZW5kZW5jeTJfXy5SZWxhdGlvbnNoaXBD aGFuZ2VSZW1vdmU7CiAgICB2YXIgT25lVG9NYW55Q2hhbmdlID0gX19kZXBl bmRlbmN5Ml9fLk9uZVRvTWFueUNoYW5nZTsKICAgIHZhciBNYW55VG9Ob25l Q2hhbmdlID0gX19kZXBlbmRlbmN5Ml9fLk1hbnlUb05vbmVDaGFuZ2U7CiAg ICB2YXIgT25lVG9PbmVDaGFuZ2UgPSBfX2RlcGVuZGVuY3kyX18uT25lVG9P bmVDaGFuZ2U7CiAgICB2YXIgTWFueVRvTWFueUNoYW5nZSA9IF9fZGVwZW5k ZW5jeTJfXy5NYW55VG9NYW55Q2hhbmdlOwoKICAgIF9fZXhwb3J0c19fLkF0 dHJpYnV0ZUNoYW5nZSA9IEF0dHJpYnV0ZUNoYW5nZTsKICAgIF9fZXhwb3J0 c19fLlJlbGF0aW9uc2hpcENoYW5nZSA9IFJlbGF0aW9uc2hpcENoYW5nZTsK ICAgIF9fZXhwb3J0c19fLlJlbGF0aW9uc2hpcENoYW5nZUFkZCA9IFJlbGF0 aW9uc2hpcENoYW5nZUFkZDsKICAgIF9fZXhwb3J0c19fLlJlbGF0aW9uc2hp cENoYW5nZVJlbW92ZSA9IFJlbGF0aW9uc2hpcENoYW5nZVJlbW92ZTsKICAg IF9fZXhwb3J0c19fLk9uZVRvTWFueUNoYW5nZSA9IE9uZVRvTWFueUNoYW5n ZTsKICAgIF9fZXhwb3J0c19fLk1hbnlUb05vbmVDaGFuZ2UgPSBNYW55VG9O b25lQ2hhbmdlOwogICAgX19leHBvcnRzX18uT25lVG9PbmVDaGFuZ2UgPSBP bmVUb09uZUNoYW5nZTsKICAgIF9fZXhwb3J0c19fLk1hbnlUb01hbnlDaGFu Z2UgPSBNYW55VG9NYW55Q2hhbmdlOwogIH0pOwpkZWZpbmUoImVtYmVyLWRh dGEvbGliL3N5c3RlbS9jaGFuZ2VzL2F0dHJpYnV0ZV9jaGFuZ2UiLCAKICBb ImV4cG9ydHMiXSwKICBmdW5jdGlvbihfX2V4cG9ydHNfXykgewogICAgInVz ZSBzdHJpY3QiOwogICAgLyoqCiAgICAgIEBtb2R1bGUgZW1iZXItZGF0YQog ICAgKi8KCiAgICAvKioKICAgICAgQW4gQXR0cmlidXRlQ2hhbmdlIG9iamVj dCBpcyBjcmVhdGVkIHdoZW5ldmVyIGEgcmVjb3JkJ3MKICAgICAgYXR0cmli dXRlIGNoYW5nZXMgdmFsdWUuIEl0IGlzIHVzZWQgdG8gdHJhY2sgY2hhbmdl cyB0byBhCiAgICAgIHJlY29yZCBiZXR3ZWVuIHRyYW5zYWN0aW9uIGNvbW1p dHMuCgogICAgICBAY2xhc3MgQXR0cmlidXRlQ2hhbmdlCiAgICAgIEBuYW1l c3BhY2UgRFMKICAgICAgQHByaXZhdGUKICAgICAgQGNvbnN0cnVjdG9yCiAg ICAqLwogICAgZnVuY3Rpb24gQXR0cmlidXRlQ2hhbmdlKG9wdGlvbnMpIHsK ICAgICAgdGhpcy5yZWNvcmQgPSBvcHRpb25zLnJlY29yZDsKICAgICAgdGhp cy5zdG9yZSA9IG9wdGlvbnMuc3RvcmU7CiAgICAgIHRoaXMubmFtZSA9IG9w dGlvbnMubmFtZTsKICAgICAgdGhpcy52YWx1ZSA9IG9wdGlvbnMudmFsdWU7 CiAgICAgIHRoaXMub2xkVmFsdWUgPSBvcHRpb25zLm9sZFZhbHVlOwogICAg fQoKICAgIEF0dHJpYnV0ZUNoYW5nZS5jcmVhdGVDaGFuZ2UgPSBmdW5jdGlv bihvcHRpb25zKSB7CiAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlQ2hhbmdl KG9wdGlvbnMpOwogICAgfTsKCiAgICBBdHRyaWJ1dGVDaGFuZ2UucHJvdG90 eXBlID0gewogICAgICBzeW5jOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAo dGhpcy52YWx1ZSAhPT0gdGhpcy5vbGRWYWx1ZSkgewogICAgICAgICAgdGhp cy5yZWNvcmQuc2VuZCgnYmVjb21lRGlydHknKTsKICAgICAgICAgIHRoaXMu cmVjb3JkLnVwZGF0ZVJlY29yZEFycmF5c0xhdGVyKCk7CiAgICAgICAgfQoK ICAgICAgICAvLyBUT0RPOiBVc2UgdGhpcyBvYmplY3QgaW4gdGhlIGNvbW1p dCBwcm9jZXNzCiAgICAgICAgdGhpcy5kZXN0cm95KCk7CiAgICAgIH0sCgog ICAgICAvKioKICAgICAgICBJZiB0aGUgQXR0cmlidXRlQ2hhbmdlIGlzIGRl c3Ryb3llZCAoZWl0aGVyIGJ5IGJlaW5nIHJvbGxlZCBiYWNrCiAgICAgICAg b3IgYmVpbmcgY29tbWl0dGVkKSwgcmVtb3ZlIGl0IGZyb20gdGhlIGxpc3Qg b2YgcGVuZGluZyBjaGFuZ2VzCiAgICAgICAgb24gdGhlIHJlY29yZC4KCiAg ICAgICAgQG1ldGhvZCBkZXN0cm95CiAgICAgICovCiAgICAgIGRlc3Ryb3k6 IGZ1bmN0aW9uKCkgewogICAgICAgIGRlbGV0ZSB0aGlzLnJlY29yZC5fY2hh bmdlc1RvU3luY1t0aGlzLm5hbWVdOwogICAgICB9CiAgICB9OwoKICAgIF9f ZXhwb3J0c19fWyJkZWZhdWx0Il0gPSBBdHRyaWJ1dGVDaGFuZ2U7CiAgfSk7 CmRlZmluZSgiZW1iZXItZGF0YS9saWIvc3lzdGVtL2NoYW5nZXMvcmVsYXRp b25zaGlwX2NoYW5nZSIsIAogIFsiLi4vbW9kZWwiLCJleHBvcnRzIl0sCiAg ZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2V4cG9ydHNfXykgewogICAg InVzZSBzdHJpY3QiOwogICAgLyoqCiAgICAgIEBtb2R1bGUgZW1iZXItZGF0 YQogICAgKi8KCiAgICB2YXIgTW9kZWwgPSBfX2RlcGVuZGVuY3kxX18uTW9k ZWw7CgogICAgdmFyIGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0 OwogICAgdmFyIGZvckVhY2ggPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMuZm9y RWFjaDsKCiAgICAvKioKICAgICAgQGNsYXNzIFJlbGF0aW9uc2hpcENoYW5n ZQogICAgICBAbmFtZXNwYWNlIERTCiAgICAgIEBwcml2YXRlCiAgICAgIEBj b25zdHJ1Y3RvcgogICAgKi8KICAgIHZhciBSZWxhdGlvbnNoaXBDaGFuZ2Ug PSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgIHRoaXMucGFyZW50UmVjb3Jk ID0gb3B0aW9ucy5wYXJlbnRSZWNvcmQ7CiAgICAgIHRoaXMuY2hpbGRSZWNv cmQgPSBvcHRpb25zLmNoaWxkUmVjb3JkOwogICAgICB0aGlzLmZpcnN0UmVj b3JkID0gb3B0aW9ucy5maXJzdFJlY29yZDsKICAgICAgdGhpcy5maXJzdFJl Y29yZEtpbmQgPSBvcHRpb25zLmZpcnN0UmVjb3JkS2luZDsKICAgICAgdGhp cy5maXJzdFJlY29yZE5hbWUgPSBvcHRpb25zLmZpcnN0UmVjb3JkTmFtZTsK ICAgICAgdGhpcy5zZWNvbmRSZWNvcmQgPSBvcHRpb25zLnNlY29uZFJlY29y ZDsKICAgICAgdGhpcy5zZWNvbmRSZWNvcmRLaW5kID0gb3B0aW9ucy5zZWNv bmRSZWNvcmRLaW5kOwogICAgICB0aGlzLnNlY29uZFJlY29yZE5hbWUgPSBv cHRpb25zLnNlY29uZFJlY29yZE5hbWU7CiAgICAgIHRoaXMuY2hhbmdlVHlw ZSA9IG9wdGlvbnMuY2hhbmdlVHlwZTsKICAgICAgdGhpcy5zdG9yZSA9IG9w dGlvbnMuc3RvcmU7CgogICAgICB0aGlzLmNvbW1pdHRlZCA9IHt9OwogICAg fTsKCiAgICAvKioKICAgICAgQGNsYXNzIFJlbGF0aW9uc2hpcENoYW5nZUFk ZAogICAgICBAbmFtZXNwYWNlIERTCiAgICAgIEBwcml2YXRlCiAgICAgIEBj b25zdHJ1Y3RvcgogICAgKi8KICAgIHZhciBSZWxhdGlvbnNoaXBDaGFuZ2VB ZGQgPSBmdW5jdGlvbihvcHRpb25zKXsKICAgICAgUmVsYXRpb25zaGlwQ2hh bmdlLmNhbGwodGhpcywgb3B0aW9ucyk7CiAgICB9OwoKICAgIC8qKgogICAg ICBAY2xhc3MgUmVsYXRpb25zaGlwQ2hhbmdlUmVtb3ZlCiAgICAgIEBuYW1l c3BhY2UgRFMKICAgICAgQHByaXZhdGUKICAgICAgQGNvbnN0cnVjdG9yCiAg ICAqLwogICAgdmFyIFJlbGF0aW9uc2hpcENoYW5nZVJlbW92ZSA9IGZ1bmN0 aW9uKG9wdGlvbnMpewogICAgICBSZWxhdGlvbnNoaXBDaGFuZ2UuY2FsbCh0 aGlzLCBvcHRpb25zKTsKICAgIH07CgogICAgUmVsYXRpb25zaGlwQ2hhbmdl LmNyZWF0ZSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgcmV0dXJuIG5l dyBSZWxhdGlvbnNoaXBDaGFuZ2Uob3B0aW9ucyk7CiAgICB9OwoKICAgIFJl bGF0aW9uc2hpcENoYW5nZUFkZC5jcmVhdGUgPSBmdW5jdGlvbihvcHRpb25z KSB7CiAgICAgIHJldHVybiBuZXcgUmVsYXRpb25zaGlwQ2hhbmdlQWRkKG9w dGlvbnMpOwogICAgfTsKCiAgICBSZWxhdGlvbnNoaXBDaGFuZ2VSZW1vdmUu Y3JlYXRlID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICByZXR1cm4gbmV3 IFJlbGF0aW9uc2hpcENoYW5nZVJlbW92ZShvcHRpb25zKTsKICAgIH07Cgog ICAgdmFyIE9uZVRvTWFueUNoYW5nZSA9IHt9OwogICAgdmFyIE9uZVRvTm9u ZUNoYW5nZSA9IHt9OwogICAgdmFyIE1hbnlUb05vbmVDaGFuZ2UgPSB7fTsK ICAgIHZhciBPbmVUb09uZUNoYW5nZSA9IHt9OwogICAgdmFyIE1hbnlUb01h bnlDaGFuZ2UgPSB7fTsKCiAgICBSZWxhdGlvbnNoaXBDaGFuZ2UuX2NyZWF0 ZUNoYW5nZSA9IGZ1bmN0aW9uKG9wdGlvbnMpewogICAgICBpZihvcHRpb25z LmNoYW5nZVR5cGUgPT09ICJhZGQiKXsKICAgICAgICByZXR1cm4gUmVsYXRp b25zaGlwQ2hhbmdlQWRkLmNyZWF0ZShvcHRpb25zKTsKICAgICAgfQogICAg ICBpZihvcHRpb25zLmNoYW5nZVR5cGUgPT09ICJyZW1vdmUiKXsKICAgICAg ICByZXR1cm4gUmVsYXRpb25zaGlwQ2hhbmdlUmVtb3ZlLmNyZWF0ZShvcHRp b25zKTsKICAgICAgfQogICAgfTsKCgogICAgUmVsYXRpb25zaGlwQ2hhbmdl LmRldGVybWluZVJlbGF0aW9uc2hpcFR5cGUgPSBmdW5jdGlvbihyZWNvcmRU eXBlLCBrbm93blNpZGUpewogICAgICB2YXIga25vd25LZXkgPSBrbm93blNp ZGUua2V5LCBrZXksIG90aGVyS2luZDsKICAgICAgdmFyIGtub3duS2luZCA9 IGtub3duU2lkZS5raW5kOwoKICAgICAgdmFyIGludmVyc2UgPSByZWNvcmRU eXBlLmludmVyc2VGb3Ioa25vd25LZXkpOwoKICAgICAgaWYgKGludmVyc2Up ewogICAgICAgIGtleSA9IGludmVyc2UubmFtZTsKICAgICAgICBvdGhlcktp bmQgPSBpbnZlcnNlLmtpbmQ7CiAgICAgIH0KCiAgICAgIGlmICghaW52ZXJz ZSl7CiAgICAgICAgcmV0dXJuIGtub3duS2luZCA9PT0gImJlbG9uZ3NUbyIg PyAib25lVG9Ob25lIiA6ICJtYW55VG9Ob25lIjsKICAgICAgfQogICAgICBl bHNlewogICAgICAgIGlmKG90aGVyS2luZCA9PT0gImJlbG9uZ3NUbyIpewog ICAgICAgICAgcmV0dXJuIGtub3duS2luZCA9PT0gImJlbG9uZ3NUbyIgPyAi b25lVG9PbmUiIDogIm1hbnlUb09uZSI7CiAgICAgICAgfQogICAgICAgIGVs c2V7CiAgICAgICAgICByZXR1cm4ga25vd25LaW5kID09PSAiYmVsb25nc1Rv IiA/ICJvbmVUb01hbnkiIDogIm1hbnlUb01hbnkiOwogICAgICAgIH0KICAg ICAgfQoKICAgIH07CgogICAgUmVsYXRpb25zaGlwQ2hhbmdlLmNyZWF0ZUNo YW5nZSA9IGZ1bmN0aW9uKGZpcnN0UmVjb3JkLCBzZWNvbmRSZWNvcmQsIHN0 b3JlLCBvcHRpb25zKXsKICAgICAgLy8gR2V0IHRoZSB0eXBlIG9mIHRoZSBj aGlsZCBiYXNlZCBvbiB0aGUgY2hpbGQncyBjbGllbnQgSUQKICAgICAgdmFy IGZpcnN0UmVjb3JkVHlwZSA9IGZpcnN0UmVjb3JkLmNvbnN0cnVjdG9yLCBj aGFuZ2VUeXBlOwogICAgICBjaGFuZ2VUeXBlID0gUmVsYXRpb25zaGlwQ2hh bmdlLmRldGVybWluZVJlbGF0aW9uc2hpcFR5cGUoZmlyc3RSZWNvcmRUeXBl LCBvcHRpb25zKTsKICAgICAgaWYgKGNoYW5nZVR5cGUgPT09ICJvbmVUb01h bnkiKXsKICAgICAgICByZXR1cm4gT25lVG9NYW55Q2hhbmdlLmNyZWF0ZUNo YW5nZShmaXJzdFJlY29yZCwgc2Vjb25kUmVjb3JkLCBzdG9yZSwgb3B0aW9u cyk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY2hhbmdlVHlwZSA9PT0gIm1h bnlUb09uZSIpewogICAgICAgIHJldHVybiBPbmVUb01hbnlDaGFuZ2UuY3Jl YXRlQ2hhbmdlKHNlY29uZFJlY29yZCwgZmlyc3RSZWNvcmQsIHN0b3JlLCBv cHRpb25zKTsKICAgICAgfQogICAgICBlbHNlIGlmIChjaGFuZ2VUeXBlID09 PSAib25lVG9Ob25lIil7CiAgICAgICAgcmV0dXJuIE9uZVRvTm9uZUNoYW5n ZS5jcmVhdGVDaGFuZ2UoZmlyc3RSZWNvcmQsIHNlY29uZFJlY29yZCwgc3Rv cmUsIG9wdGlvbnMpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoYW5nZVR5 cGUgPT09ICJtYW55VG9Ob25lIil7CiAgICAgICAgcmV0dXJuIE1hbnlUb05v bmVDaGFuZ2UuY3JlYXRlQ2hhbmdlKGZpcnN0UmVjb3JkLCBzZWNvbmRSZWNv cmQsIHN0b3JlLCBvcHRpb25zKTsKICAgICAgfQogICAgICBlbHNlIGlmIChj aGFuZ2VUeXBlID09PSAib25lVG9PbmUiKXsKICAgICAgICByZXR1cm4gT25l VG9PbmVDaGFuZ2UuY3JlYXRlQ2hhbmdlKGZpcnN0UmVjb3JkLCBzZWNvbmRS ZWNvcmQsIHN0b3JlLCBvcHRpb25zKTsKICAgICAgfQogICAgICBlbHNlIGlm IChjaGFuZ2VUeXBlID09PSAibWFueVRvTWFueSIpewogICAgICAgIHJldHVy biBNYW55VG9NYW55Q2hhbmdlLmNyZWF0ZUNoYW5nZShmaXJzdFJlY29yZCwg c2Vjb25kUmVjb3JkLCBzdG9yZSwgb3B0aW9ucyk7CiAgICAgIH0KICAgIH07 CgogICAgT25lVG9Ob25lQ2hhbmdlLmNyZWF0ZUNoYW5nZSA9IGZ1bmN0aW9u KGNoaWxkUmVjb3JkLCBwYXJlbnRSZWNvcmQsIHN0b3JlLCBvcHRpb25zKSB7 CiAgICAgIHZhciBrZXkgPSBvcHRpb25zLmtleTsKICAgICAgdmFyIGNoYW5n ZSA9IFJlbGF0aW9uc2hpcENoYW5nZS5fY3JlYXRlQ2hhbmdlKHsKICAgICAg ICAgIHBhcmVudFJlY29yZDogcGFyZW50UmVjb3JkLAogICAgICAgICAgY2hp bGRSZWNvcmQ6IGNoaWxkUmVjb3JkLAogICAgICAgICAgZmlyc3RSZWNvcmQ6 IGNoaWxkUmVjb3JkLAogICAgICAgICAgc3RvcmU6IHN0b3JlLAogICAgICAg ICAgY2hhbmdlVHlwZTogb3B0aW9ucy5jaGFuZ2VUeXBlLAogICAgICAgICAg Zmlyc3RSZWNvcmROYW1lOiBrZXksCiAgICAgICAgICBmaXJzdFJlY29yZEtp bmQ6ICJiZWxvbmdzVG8iCiAgICAgIH0pOwoKICAgICAgc3RvcmUuYWRkUmVs YXRpb25zaGlwQ2hhbmdlRm9yKGNoaWxkUmVjb3JkLCBrZXksIHBhcmVudFJl Y29yZCwgbnVsbCwgY2hhbmdlKTsKCiAgICAgIHJldHVybiBjaGFuZ2U7CiAg ICB9OwoKICAgIE1hbnlUb05vbmVDaGFuZ2UuY3JlYXRlQ2hhbmdlID0gZnVu Y3Rpb24oY2hpbGRSZWNvcmQsIHBhcmVudFJlY29yZCwgc3RvcmUsIG9wdGlv bnMpIHsKICAgICAgdmFyIGtleSA9IG9wdGlvbnMua2V5OwogICAgICB2YXIg Y2hhbmdlID0gUmVsYXRpb25zaGlwQ2hhbmdlLl9jcmVhdGVDaGFuZ2Uoewog ICAgICAgICAgcGFyZW50UmVjb3JkOiBjaGlsZFJlY29yZCwKICAgICAgICAg IGNoaWxkUmVjb3JkOiBwYXJlbnRSZWNvcmQsCiAgICAgICAgICBzZWNvbmRS ZWNvcmQ6IGNoaWxkUmVjb3JkLAogICAgICAgICAgc3RvcmU6IHN0b3JlLAog ICAgICAgICAgY2hhbmdlVHlwZTogb3B0aW9ucy5jaGFuZ2VUeXBlLAogICAg ICAgICAgc2Vjb25kUmVjb3JkTmFtZTogb3B0aW9ucy5rZXksCiAgICAgICAg ICBzZWNvbmRSZWNvcmRLaW5kOiAiaGFzTWFueSIKICAgICAgfSk7CgogICAg ICBzdG9yZS5hZGRSZWxhdGlvbnNoaXBDaGFuZ2VGb3IoY2hpbGRSZWNvcmQs IGtleSwgcGFyZW50UmVjb3JkLCBudWxsLCBjaGFuZ2UpOwogICAgICByZXR1 cm4gY2hhbmdlOwogICAgfTsKCgogICAgTWFueVRvTWFueUNoYW5nZS5jcmVh dGVDaGFuZ2UgPSBmdW5jdGlvbihjaGlsZFJlY29yZCwgcGFyZW50UmVjb3Jk LCBzdG9yZSwgb3B0aW9ucykgewogICAgICAvLyBJZiB0aGUgbmFtZSBvZiB0 aGUgYmVsb25nc1RvIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBpcyBzcGVj aWZpZWQsCiAgICAgIC8vIHVzZSB0aGF0CiAgICAgIC8vIElmIHRoZSB0eXBl IG9mIHRoZSBwYXJlbnQgaXMgc3BlY2lmaWVkLCBsb29rIGl0IHVwIG9uIHRo ZSBjaGlsZCdzIHR5cGUKICAgICAgLy8gZGVmaW5pdGlvbi4KICAgICAgdmFy IGtleSA9IG9wdGlvbnMua2V5OwoKICAgICAgdmFyIGNoYW5nZSA9IFJlbGF0 aW9uc2hpcENoYW5nZS5fY3JlYXRlQ2hhbmdlKHsKICAgICAgICAgIHBhcmVu dFJlY29yZDogcGFyZW50UmVjb3JkLAogICAgICAgICAgY2hpbGRSZWNvcmQ6 IGNoaWxkUmVjb3JkLAogICAgICAgICAgZmlyc3RSZWNvcmQ6IGNoaWxkUmVj b3JkLAogICAgICAgICAgc2Vjb25kUmVjb3JkOiBwYXJlbnRSZWNvcmQsCiAg ICAgICAgICBmaXJzdFJlY29yZEtpbmQ6ICJoYXNNYW55IiwKICAgICAgICAg IHNlY29uZFJlY29yZEtpbmQ6ICJoYXNNYW55IiwKICAgICAgICAgIHN0b3Jl OiBzdG9yZSwKICAgICAgICAgIGNoYW5nZVR5cGU6IG9wdGlvbnMuY2hhbmdl VHlwZSwKICAgICAgICAgIGZpcnN0UmVjb3JkTmFtZTogIGtleQogICAgICB9 KTsKCiAgICAgIHN0b3JlLmFkZFJlbGF0aW9uc2hpcENoYW5nZUZvcihjaGls ZFJlY29yZCwga2V5LCBwYXJlbnRSZWNvcmQsIG51bGwsIGNoYW5nZSk7CgoK ICAgICAgcmV0dXJuIGNoYW5nZTsKICAgIH07CgogICAgT25lVG9PbmVDaGFu Z2UuY3JlYXRlQ2hhbmdlID0gZnVuY3Rpb24oY2hpbGRSZWNvcmQsIHBhcmVu dFJlY29yZCwgc3RvcmUsIG9wdGlvbnMpIHsKICAgICAgdmFyIGtleTsKCiAg ICAgIC8vIElmIHRoZSBuYW1lIG9mIHRoZSBiZWxvbmdzVG8gc2lkZSBvZiB0 aGUgcmVsYXRpb25zaGlwIGlzIHNwZWNpZmllZCwKICAgICAgLy8gdXNlIHRo YXQKICAgICAgLy8gSWYgdGhlIHR5cGUgb2YgdGhlIHBhcmVudCBpcyBzcGVj aWZpZWQsIGxvb2sgaXQgdXAgb24gdGhlIGNoaWxkJ3MgdHlwZQogICAgICAv LyBkZWZpbml0aW9uLgogICAgICBpZiAob3B0aW9ucy5wYXJlbnRUeXBlKSB7 CiAgICAgICAga2V5ID0gb3B0aW9ucy5wYXJlbnRUeXBlLmludmVyc2VGb3Io b3B0aW9ucy5rZXkpLm5hbWU7CiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5r ZXkpIHsKICAgICAgICBrZXkgPSBvcHRpb25zLmtleTsKICAgICAgfSBlbHNl IHsKICAgICAgICBFbWJlci5hc3NlcnQoIllvdSBtdXN0IHBhc3MgZWl0aGVy IGEgcGFyZW50VHlwZSBvciBiZWxvbmdzVG9OYW1lIG9wdGlvbiB0byBPbmVU b01hbnlDaGFuZ2UuZm9yQ2hpbGRBbmRQYXJlbnQiLCBmYWxzZSk7CiAgICAg IH0KCiAgICAgIHZhciBjaGFuZ2UgPSBSZWxhdGlvbnNoaXBDaGFuZ2UuX2Ny ZWF0ZUNoYW5nZSh7CiAgICAgICAgICBwYXJlbnRSZWNvcmQ6IHBhcmVudFJl Y29yZCwKICAgICAgICAgIGNoaWxkUmVjb3JkOiBjaGlsZFJlY29yZCwKICAg ICAgICAgIGZpcnN0UmVjb3JkOiBjaGlsZFJlY29yZCwKICAgICAgICAgIHNl Y29uZFJlY29yZDogcGFyZW50UmVjb3JkLAogICAgICAgICAgZmlyc3RSZWNv cmRLaW5kOiAiYmVsb25nc1RvIiwKICAgICAgICAgIHNlY29uZFJlY29yZEtp bmQ6ICJiZWxvbmdzVG8iLAogICAgICAgICAgc3RvcmU6IHN0b3JlLAogICAg ICAgICAgY2hhbmdlVHlwZTogb3B0aW9ucy5jaGFuZ2VUeXBlLAogICAgICAg ICAgZmlyc3RSZWNvcmROYW1lOiAga2V5CiAgICAgIH0pOwoKICAgICAgc3Rv cmUuYWRkUmVsYXRpb25zaGlwQ2hhbmdlRm9yKGNoaWxkUmVjb3JkLCBrZXks IHBhcmVudFJlY29yZCwgbnVsbCwgY2hhbmdlKTsKCgogICAgICByZXR1cm4g Y2hhbmdlOwogICAgfTsKCiAgICBPbmVUb09uZUNoYW5nZS5tYWludGFpbklu dmFyaWFudCA9IGZ1bmN0aW9uKG9wdGlvbnMsIHN0b3JlLCBjaGlsZFJlY29y ZCwga2V5KXsKICAgICAgaWYgKG9wdGlvbnMuY2hhbmdlVHlwZSA9PT0gImFk ZCIgJiYgc3RvcmUucmVjb3JkSXNNYXRlcmlhbGl6ZWQoY2hpbGRSZWNvcmQp KSB7CiAgICAgICAgdmFyIG9sZFBhcmVudCA9IGdldChjaGlsZFJlY29yZCwg a2V5KTsKICAgICAgICBpZiAob2xkUGFyZW50KXsKICAgICAgICAgIHZhciBj b3JyZXNwb25kaW5nQ2hhbmdlID0gT25lVG9PbmVDaGFuZ2UuY3JlYXRlQ2hh bmdlKGNoaWxkUmVjb3JkLCBvbGRQYXJlbnQsIHN0b3JlLCB7CiAgICAgICAg ICAgICAgcGFyZW50VHlwZTogb3B0aW9ucy5wYXJlbnRUeXBlLAogICAgICAg ICAgICAgIGhhc01hbnlOYW1lOiBvcHRpb25zLmhhc01hbnlOYW1lLAogICAg ICAgICAgICAgIGNoYW5nZVR5cGU6ICJyZW1vdmUiLAogICAgICAgICAgICAg IGtleTogb3B0aW9ucy5rZXkKICAgICAgICAgICAgfSk7CiAgICAgICAgICBz dG9yZS5hZGRSZWxhdGlvbnNoaXBDaGFuZ2VGb3IoY2hpbGRSZWNvcmQsIGtl eSwgb3B0aW9ucy5wYXJlbnRSZWNvcmQgLCBudWxsLCBjb3JyZXNwb25kaW5n Q2hhbmdlKTsKICAgICAgICAgY29ycmVzcG9uZGluZ0NoYW5nZS5zeW5jKCk7 CiAgICAgICAgfQogICAgICB9CiAgICB9OwoKICAgIE9uZVRvTWFueUNoYW5n ZS5jcmVhdGVDaGFuZ2UgPSBmdW5jdGlvbihjaGlsZFJlY29yZCwgcGFyZW50 UmVjb3JkLCBzdG9yZSwgb3B0aW9ucykgewogICAgICB2YXIga2V5OwoKICAg ICAgLy8gSWYgdGhlIG5hbWUgb2YgdGhlIGJlbG9uZ3NUbyBzaWRlIG9mIHRo ZSByZWxhdGlvbnNoaXAgaXMgc3BlY2lmaWVkLAogICAgICAvLyB1c2UgdGhh dAogICAgICAvLyBJZiB0aGUgdHlwZSBvZiB0aGUgcGFyZW50IGlzIHNwZWNp ZmllZCwgbG9vayBpdCB1cCBvbiB0aGUgY2hpbGQncyB0eXBlCiAgICAgIC8v IGRlZmluaXRpb24uCiAgICAgIGlmIChvcHRpb25zLnBhcmVudFR5cGUpIHsK ICAgICAgICBrZXkgPSBvcHRpb25zLnBhcmVudFR5cGUuaW52ZXJzZUZvcihv cHRpb25zLmtleSkubmFtZTsKICAgICAgICBPbmVUb01hbnlDaGFuZ2UubWFp bnRhaW5JbnZhcmlhbnQoIG9wdGlvbnMsIHN0b3JlLCBjaGlsZFJlY29yZCwg a2V5ICk7CiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5rZXkpIHsKICAgICAg ICBrZXkgPSBvcHRpb25zLmtleTsKICAgICAgfSBlbHNlIHsKICAgICAgICBF bWJlci5hc3NlcnQoIllvdSBtdXN0IHBhc3MgZWl0aGVyIGEgcGFyZW50VHlw ZSBvciBiZWxvbmdzVG9OYW1lIG9wdGlvbiB0byBPbmVUb01hbnlDaGFuZ2Uu Zm9yQ2hpbGRBbmRQYXJlbnQiLCBmYWxzZSk7CiAgICAgIH0KCiAgICAgIHZh ciBjaGFuZ2UgPSBSZWxhdGlvbnNoaXBDaGFuZ2UuX2NyZWF0ZUNoYW5nZSh7 CiAgICAgICAgICBwYXJlbnRSZWNvcmQ6IHBhcmVudFJlY29yZCwKICAgICAg ICAgIGNoaWxkUmVjb3JkOiBjaGlsZFJlY29yZCwKICAgICAgICAgIGZpcnN0 UmVjb3JkOiBjaGlsZFJlY29yZCwKICAgICAgICAgIHNlY29uZFJlY29yZDog cGFyZW50UmVjb3JkLAogICAgICAgICAgZmlyc3RSZWNvcmRLaW5kOiAiYmVs b25nc1RvIiwKICAgICAgICAgIHNlY29uZFJlY29yZEtpbmQ6ICJoYXNNYW55 IiwKICAgICAgICAgIHN0b3JlOiBzdG9yZSwKICAgICAgICAgIGNoYW5nZVR5 cGU6IG9wdGlvbnMuY2hhbmdlVHlwZSwKICAgICAgICAgIGZpcnN0UmVjb3Jk TmFtZTogIGtleQogICAgICB9KTsKCiAgICAgIHN0b3JlLmFkZFJlbGF0aW9u c2hpcENoYW5nZUZvcihjaGlsZFJlY29yZCwga2V5LCBwYXJlbnRSZWNvcmQs IGNoYW5nZS5nZXRTZWNvbmRSZWNvcmROYW1lKCksIGNoYW5nZSk7CgoKICAg ICAgcmV0dXJuIGNoYW5nZTsKICAgIH07CgoKICAgIE9uZVRvTWFueUNoYW5n ZS5tYWludGFpbkludmFyaWFudCA9IGZ1bmN0aW9uKG9wdGlvbnMsIHN0b3Jl LCBjaGlsZFJlY29yZCwga2V5KXsKICAgICAgaWYgKG9wdGlvbnMuY2hhbmdl VHlwZSA9PT0gImFkZCIgJiYgY2hpbGRSZWNvcmQpIHsKICAgICAgICB2YXIg b2xkUGFyZW50ID0gZ2V0KGNoaWxkUmVjb3JkLCBrZXkpOwogICAgICAgIGlm IChvbGRQYXJlbnQpewogICAgICAgICAgdmFyIGNvcnJlc3BvbmRpbmdDaGFu Z2UgPSBPbmVUb01hbnlDaGFuZ2UuY3JlYXRlQ2hhbmdlKGNoaWxkUmVjb3Jk LCBvbGRQYXJlbnQsIHN0b3JlLCB7CiAgICAgICAgICAgICAgcGFyZW50VHlw ZTogb3B0aW9ucy5wYXJlbnRUeXBlLAogICAgICAgICAgICAgIGhhc01hbnlO YW1lOiBvcHRpb25zLmhhc01hbnlOYW1lLAogICAgICAgICAgICAgIGNoYW5n ZVR5cGU6ICJyZW1vdmUiLAogICAgICAgICAgICAgIGtleTogb3B0aW9ucy5r ZXkKICAgICAgICAgICAgfSk7CiAgICAgICAgICBzdG9yZS5hZGRSZWxhdGlv bnNoaXBDaGFuZ2VGb3IoY2hpbGRSZWNvcmQsIGtleSwgb3B0aW9ucy5wYXJl bnRSZWNvcmQsIGNvcnJlc3BvbmRpbmdDaGFuZ2UuZ2V0U2Vjb25kUmVjb3Jk TmFtZSgpLCBjb3JyZXNwb25kaW5nQ2hhbmdlKTsKICAgICAgICAgIGNvcnJl c3BvbmRpbmdDaGFuZ2Uuc3luYygpOwogICAgICAgIH0KICAgICAgfQogICAg fTsKCiAgICAvKioKICAgICAgQGNsYXNzIFJlbGF0aW9uc2hpcENoYW5nZQog ICAgICBAbmFtZXNwYWNlIERTCiAgICAqLwogICAgUmVsYXRpb25zaGlwQ2hh bmdlLnByb3RvdHlwZSA9IHsKCiAgICAgIGdldFNlY29uZFJlY29yZE5hbWU6 IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBuYW1lID0gdGhpcy5zZWNvbmRS ZWNvcmROYW1lLCBwYXJlbnQ7CgogICAgICAgIGlmICghbmFtZSkgewogICAg ICAgICAgcGFyZW50ID0gdGhpcy5zZWNvbmRSZWNvcmQ7CiAgICAgICAgICBp ZiAoIXBhcmVudCkgeyByZXR1cm47IH0KCiAgICAgICAgICB2YXIgY2hpbGRU eXBlID0gdGhpcy5maXJzdFJlY29yZC5jb25zdHJ1Y3RvcjsKICAgICAgICAg IHZhciBpbnZlcnNlID0gY2hpbGRUeXBlLmludmVyc2VGb3IodGhpcy5maXJz dFJlY29yZE5hbWUpOwogICAgICAgICAgdGhpcy5zZWNvbmRSZWNvcmROYW1l ID0gaW52ZXJzZS5uYW1lOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRo aXMuc2Vjb25kUmVjb3JkTmFtZTsKICAgICAgfSwKCiAgICAgIC8qKgogICAg ICAgIEdldCB0aGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwIG9uIHRoZSBi ZWxvbmdzVG8gc2lkZS4KCiAgICAgICAgQG1ldGhvZCBnZXRGaXJzdFJlY29y ZE5hbWUKICAgICAgICBAcmV0dXJuIHtTdHJpbmd9CiAgICAgICovCiAgICAg IGdldEZpcnN0UmVjb3JkTmFtZTogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFy IG5hbWUgPSB0aGlzLmZpcnN0UmVjb3JkTmFtZTsKICAgICAgICByZXR1cm4g bmFtZTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgIEBtZXRob2QgZGVz dHJveQogICAgICAgIEBwcml2YXRlCiAgICAgICovCiAgICAgIGRlc3Ryb3k6 IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBjaGlsZFJlY29yZCA9IHRoaXMu Y2hpbGRSZWNvcmQsCiAgICAgICAgICAgIGJlbG9uZ3NUb05hbWUgPSB0aGlz LmdldEZpcnN0UmVjb3JkTmFtZSgpLAogICAgICAgICAgICBoYXNNYW55TmFt ZSA9IHRoaXMuZ2V0U2Vjb25kUmVjb3JkTmFtZSgpLAogICAgICAgICAgICBz dG9yZSA9IHRoaXMuc3RvcmU7CgogICAgICAgIHN0b3JlLnJlbW92ZVJlbGF0 aW9uc2hpcENoYW5nZUZvcihjaGlsZFJlY29yZCwgYmVsb25nc1RvTmFtZSwg dGhpcy5wYXJlbnRSZWNvcmQsIGhhc01hbnlOYW1lLCB0aGlzLmNoYW5nZVR5 cGUpOwogICAgICB9LAoKICAgICAgZ2V0U2Vjb25kUmVjb3JkOiBmdW5jdGlv bigpewogICAgICAgIHJldHVybiB0aGlzLnNlY29uZFJlY29yZDsKICAgICAg fSwKCiAgICAgIC8qKgogICAgICAgIEBtZXRob2QgZ2V0Rmlyc3RSZWNvcmQK ICAgICAgICBAcHJpdmF0ZQogICAgICAqLwogICAgICBnZXRGaXJzdFJlY29y ZDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZmlyc3RSZWNv cmQ7CiAgICAgIH0sCgogICAgICBjb2FsZXNjZTogZnVuY3Rpb24oKXsKICAg ICAgICB2YXIgcmVsYXRpb25zaGlwUGFpcnMgPSB0aGlzLnN0b3JlLnJlbGF0 aW9uc2hpcENoYW5nZVBhaXJzRm9yKHRoaXMuZmlyc3RSZWNvcmQpOwogICAg ICAgIGZvckVhY2gocmVsYXRpb25zaGlwUGFpcnMsIGZ1bmN0aW9uKHBhaXIp ewogICAgICAgICAgdmFyIGFkZGVkQ2hhbmdlID0gcGFpclsiYWRkIl07CiAg ICAgICAgICB2YXIgcmVtb3ZlZENoYW5nZSA9IHBhaXJbInJlbW92ZSJdOwog ICAgICAgICAgaWYoYWRkZWRDaGFuZ2UgJiYgcmVtb3ZlZENoYW5nZSkgewog ICAgICAgICAgICBhZGRlZENoYW5nZS5kZXN0cm95KCk7CiAgICAgICAgICAg IHJlbW92ZWRDaGFuZ2UuZGVzdHJveSgpOwogICAgICAgICAgfQogICAgICAg IH0pOwogICAgICB9CiAgICB9OwoKICAgIFJlbGF0aW9uc2hpcENoYW5nZUFk ZC5wcm90b3R5cGUgPSBFbWJlci5jcmVhdGUoUmVsYXRpb25zaGlwQ2hhbmdl LmNyZWF0ZSh7fSkpOwogICAgUmVsYXRpb25zaGlwQ2hhbmdlUmVtb3ZlLnBy b3RvdHlwZSA9IEVtYmVyLmNyZWF0ZShSZWxhdGlvbnNoaXBDaGFuZ2UuY3Jl YXRlKHt9KSk7CgogICAgLy8gdGhlIG9iamVjdCBpcyBhIHZhbHVlLCBhbmQg bm90IGEgcHJvbWlzZQogICAgZnVuY3Rpb24gaXNWYWx1ZShvYmplY3QpIHsK ICAgICAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmICgh b2JqZWN0LnRoZW4gfHwgdHlwZW9mIG9iamVjdC50aGVuICE9PSAnZnVuY3Rp b24nKTsKICAgIH0KCiAgICBSZWxhdGlvbnNoaXBDaGFuZ2VBZGQucHJvdG90 eXBlLmNoYW5nZVR5cGUgPSAiYWRkIjsKICAgIFJlbGF0aW9uc2hpcENoYW5n ZUFkZC5wcm90b3R5cGUuc3luYyA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIg c2Vjb25kUmVjb3JkTmFtZSA9IHRoaXMuZ2V0U2Vjb25kUmVjb3JkTmFtZSgp LAogICAgICAgICAgZmlyc3RSZWNvcmROYW1lID0gdGhpcy5nZXRGaXJzdFJl Y29yZE5hbWUoKSwKICAgICAgICAgIGZpcnN0UmVjb3JkID0gdGhpcy5nZXRG aXJzdFJlY29yZCgpLAogICAgICAgICAgc2Vjb25kUmVjb3JkID0gdGhpcy5n ZXRTZWNvbmRSZWNvcmQoKTsKCiAgICAgIC8vRW1iZXIuYXNzZXJ0KCJZb3Ug c3BlY2lmaWVkIGEgaGFzTWFueSAoIiArIGhhc01hbnlOYW1lICsgIikgb24g IiArICghYmVsb25nc1RvTmFtZSAmJiAobmV3UGFyZW50IHx8IG9sZFBhcmVu dCB8fCB0aGlzLmxhc3RQYXJlbnQpLmNvbnN0cnVjdG9yKSArICIgYnV0IGRp ZCBub3Qgc3BlY2lmeSBhbiBpbnZlcnNlIGJlbG9uZ3NUbyBvbiAiICsgY2hp bGQuY29uc3RydWN0b3IsIGJlbG9uZ3NUb05hbWUpOwogICAgICAvL0VtYmVy LmFzc2VydCgiWW91IHNwZWNpZmllZCBhIGJlbG9uZ3NUbyAoIiArIGJlbG9u Z3NUb05hbWUgKyAiKSBvbiAiICsgY2hpbGQuY29uc3RydWN0b3IgKyAiIGJ1 dCBkaWQgbm90IHNwZWNpZnkgYW4gaW52ZXJzZSBoYXNNYW55IG9uICIgKyAo IWhhc01hbnlOYW1lICYmIChuZXdQYXJlbnQgfHwgb2xkUGFyZW50IHx8IHRo aXMubGFzdFBhcmVudFJlY29yZCkuY29uc3RydWN0b3IpLCBoYXNNYW55TmFt ZSk7CgogICAgICBpZiAoc2Vjb25kUmVjb3JkIGluc3RhbmNlb2YgTW9kZWwg JiYgZmlyc3RSZWNvcmQgaW5zdGFuY2VvZiBNb2RlbCkgewogICAgICAgIGlm KHRoaXMuc2Vjb25kUmVjb3JkS2luZCA9PT0gImJlbG9uZ3NUbyIpewogICAg ICAgICAgc2Vjb25kUmVjb3JkLnN1c3BlbmRSZWxhdGlvbnNoaXBPYnNlcnZl cnMoZnVuY3Rpb24oKXsKICAgICAgICAgICAgc2V0KHNlY29uZFJlY29yZCwg c2Vjb25kUmVjb3JkTmFtZSwgZmlyc3RSZWNvcmQpOwogICAgICAgICAgfSk7 CgogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYodGhpcy5zZWNvbmRSZWNv cmRLaW5kID09PSAiaGFzTWFueSIpewogICAgICAgICAgc2Vjb25kUmVjb3Jk LnN1c3BlbmRSZWxhdGlvbnNoaXBPYnNlcnZlcnMoZnVuY3Rpb24oKXsKICAg ICAgICAgICAgdmFyIHJlbGF0aW9uc2hpcCA9IGdldChzZWNvbmRSZWNvcmQs IHNlY29uZFJlY29yZE5hbWUpOwogICAgICAgICAgICBpZiAoaXNWYWx1ZShy ZWxhdGlvbnNoaXApKSB7IHJlbGF0aW9uc2hpcC5hZGRPYmplY3QoZmlyc3RS ZWNvcmQpOyB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KCiAg ICAgIGlmIChmaXJzdFJlY29yZCBpbnN0YW5jZW9mIE1vZGVsICYmIHNlY29u ZFJlY29yZCBpbnN0YW5jZW9mIE1vZGVsICYmIGdldChmaXJzdFJlY29yZCwg Zmlyc3RSZWNvcmROYW1lKSAhPT0gc2Vjb25kUmVjb3JkKSB7CiAgICAgICAg aWYodGhpcy5maXJzdFJlY29yZEtpbmQgPT09ICJiZWxvbmdzVG8iKXsKICAg ICAgICAgIGZpcnN0UmVjb3JkLnN1c3BlbmRSZWxhdGlvbnNoaXBPYnNlcnZl cnMoZnVuY3Rpb24oKXsKICAgICAgICAgICAgc2V0KGZpcnN0UmVjb3JkLCBm aXJzdFJlY29yZE5hbWUsIHNlY29uZFJlY29yZCk7CiAgICAgICAgICB9KTsK ICAgICAgICB9CiAgICAgICAgZWxzZSBpZih0aGlzLmZpcnN0UmVjb3JkS2lu ZCA9PT0gImhhc01hbnkiKXsKICAgICAgICAgIGZpcnN0UmVjb3JkLnN1c3Bl bmRSZWxhdGlvbnNoaXBPYnNlcnZlcnMoZnVuY3Rpb24oKXsKICAgICAgICAg ICAgdmFyIHJlbGF0aW9uc2hpcCA9IGdldChmaXJzdFJlY29yZCwgZmlyc3RS ZWNvcmROYW1lKTsKICAgICAgICAgICAgaWYgKGlzVmFsdWUocmVsYXRpb25z aGlwKSkgeyByZWxhdGlvbnNoaXAuYWRkT2JqZWN0KHNlY29uZFJlY29yZCk7 IH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdGhp cy5jb2FsZXNjZSgpOwogICAgfTsKCiAgICBSZWxhdGlvbnNoaXBDaGFuZ2VS ZW1vdmUucHJvdG90eXBlLmNoYW5nZVR5cGUgPSAicmVtb3ZlIjsKICAgIFJl bGF0aW9uc2hpcENoYW5nZVJlbW92ZS5wcm90b3R5cGUuc3luYyA9IGZ1bmN0 aW9uKCkgewogICAgICB2YXIgc2Vjb25kUmVjb3JkTmFtZSA9IHRoaXMuZ2V0 U2Vjb25kUmVjb3JkTmFtZSgpLAogICAgICAgICAgZmlyc3RSZWNvcmROYW1l ID0gdGhpcy5nZXRGaXJzdFJlY29yZE5hbWUoKSwKICAgICAgICAgIGZpcnN0 UmVjb3JkID0gdGhpcy5nZXRGaXJzdFJlY29yZCgpLAogICAgICAgICAgc2Vj b25kUmVjb3JkID0gdGhpcy5nZXRTZWNvbmRSZWNvcmQoKTsKCiAgICAgIC8v RW1iZXIuYXNzZXJ0KCJZb3Ugc3BlY2lmaWVkIGEgaGFzTWFueSAoIiArIGhh c01hbnlOYW1lICsgIikgb24gIiArICghYmVsb25nc1RvTmFtZSAmJiAobmV3 UGFyZW50IHx8IG9sZFBhcmVudCB8fCB0aGlzLmxhc3RQYXJlbnQpLmNvbnN0 cnVjdG9yKSArICIgYnV0IGRpZCBub3Qgc3BlY2lmeSBhbiBpbnZlcnNlIGJl bG9uZ3NUbyBvbiAiICsgY2hpbGQuY29uc3RydWN0b3IsIGJlbG9uZ3NUb05h bWUpOwogICAgICAvL0VtYmVyLmFzc2VydCgiWW91IHNwZWNpZmllZCBhIGJl bG9uZ3NUbyAoIiArIGJlbG9uZ3NUb05hbWUgKyAiKSBvbiAiICsgY2hpbGQu Y29uc3RydWN0b3IgKyAiIGJ1dCBkaWQgbm90IHNwZWNpZnkgYW4gaW52ZXJz ZSBoYXNNYW55IG9uICIgKyAoIWhhc01hbnlOYW1lICYmIChuZXdQYXJlbnQg fHwgb2xkUGFyZW50IHx8IHRoaXMubGFzdFBhcmVudFJlY29yZCkuY29uc3Ry dWN0b3IpLCBoYXNNYW55TmFtZSk7CgogICAgICBpZiAoc2Vjb25kUmVjb3Jk IGluc3RhbmNlb2YgTW9kZWwgJiYgZmlyc3RSZWNvcmQgaW5zdGFuY2VvZiBN b2RlbCkgewogICAgICAgIGlmKHRoaXMuc2Vjb25kUmVjb3JkS2luZCA9PT0g ImJlbG9uZ3NUbyIpewogICAgICAgICAgc2Vjb25kUmVjb3JkLnN1c3BlbmRS ZWxhdGlvbnNoaXBPYnNlcnZlcnMoZnVuY3Rpb24oKXsKICAgICAgICAgICAg c2V0KHNlY29uZFJlY29yZCwgc2Vjb25kUmVjb3JkTmFtZSwgbnVsbCk7CiAg ICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZih0aGlzLnNl Y29uZFJlY29yZEtpbmQgPT09ICJoYXNNYW55Iil7CiAgICAgICAgICBzZWNv bmRSZWNvcmQuc3VzcGVuZFJlbGF0aW9uc2hpcE9ic2VydmVycyhmdW5jdGlv bigpewogICAgICAgICAgICB2YXIgcmVsYXRpb25zaGlwID0gZ2V0KHNlY29u ZFJlY29yZCwgc2Vjb25kUmVjb3JkTmFtZSk7CiAgICAgICAgICAgIGlmIChp c1ZhbHVlKHJlbGF0aW9uc2hpcCkpIHsgcmVsYXRpb25zaGlwLnJlbW92ZU9i amVjdChmaXJzdFJlY29yZCk7IH0KICAgICAgICAgIH0pOwogICAgICAgIH0K ICAgICAgfQoKICAgICAgaWYgKGZpcnN0UmVjb3JkIGluc3RhbmNlb2YgTW9k ZWwgJiYgZ2V0KGZpcnN0UmVjb3JkLCBmaXJzdFJlY29yZE5hbWUpKSB7CiAg ICAgICAgaWYodGhpcy5maXJzdFJlY29yZEtpbmQgPT09ICJiZWxvbmdzVG8i KXsKICAgICAgICAgIGZpcnN0UmVjb3JkLnN1c3BlbmRSZWxhdGlvbnNoaXBP YnNlcnZlcnMoZnVuY3Rpb24oKXsKICAgICAgICAgICAgc2V0KGZpcnN0UmVj b3JkLCBmaXJzdFJlY29yZE5hbWUsIG51bGwpOwogICAgICAgICAgfSk7CiAg ICAgICAgIH0KICAgICAgICAgZWxzZSBpZih0aGlzLmZpcnN0UmVjb3JkS2lu ZCA9PT0gImhhc01hbnkiKXsKICAgICAgICAgICBmaXJzdFJlY29yZC5zdXNw ZW5kUmVsYXRpb25zaGlwT2JzZXJ2ZXJzKGZ1bmN0aW9uKCl7CiAgICAgICAg ICAgICB2YXIgcmVsYXRpb25zaGlwID0gZ2V0KGZpcnN0UmVjb3JkLCBmaXJz dFJlY29yZE5hbWUpOwogICAgICAgICAgICAgaWYgKGlzVmFsdWUocmVsYXRp b25zaGlwKSkgeyByZWxhdGlvbnNoaXAucmVtb3ZlT2JqZWN0KHNlY29uZFJl Y29yZCk7IH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQoKICAg ICAgdGhpcy5jb2FsZXNjZSgpOwogICAgfTsKCiAgICBfX2V4cG9ydHNfXy5S ZWxhdGlvbnNoaXBDaGFuZ2UgPSBSZWxhdGlvbnNoaXBDaGFuZ2U7CiAgICBf X2V4cG9ydHNfXy5SZWxhdGlvbnNoaXBDaGFuZ2VBZGQgPSBSZWxhdGlvbnNo aXBDaGFuZ2VBZGQ7CiAgICBfX2V4cG9ydHNfXy5SZWxhdGlvbnNoaXBDaGFu Z2VSZW1vdmUgPSBSZWxhdGlvbnNoaXBDaGFuZ2VSZW1vdmU7CiAgICBfX2V4 cG9ydHNfXy5PbmVUb01hbnlDaGFuZ2UgPSBPbmVUb01hbnlDaGFuZ2U7CiAg ICBfX2V4cG9ydHNfXy5NYW55VG9Ob25lQ2hhbmdlID0gTWFueVRvTm9uZUNo YW5nZTsKICAgIF9fZXhwb3J0c19fLk9uZVRvT25lQ2hhbmdlID0gT25lVG9P bmVDaGFuZ2U7CiAgICBfX2V4cG9ydHNfXy5NYW55VG9NYW55Q2hhbmdlID0g TWFueVRvTWFueUNoYW5nZTsKICB9KTsKZGVmaW5lKCJlbWJlci1kYXRhL2xp Yi9zeXN0ZW0vY29udGFpbmVyX3Byb3h5IiwgCiAgWyJleHBvcnRzIl0sCiAg ZnVuY3Rpb24oX19leHBvcnRzX18pIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAg IC8qKgogICAgICBUaGlzIGlzIHVzZWQgaW50ZXJuYWxseSB0byBlbmFibGUg ZGVwcmVjYXRpb24gb2YgY29udGFpbmVyIHBhdGhzIGFuZCBwcm92aWRlCiAg ICAgIGEgZGVjZW50IG1lc3NhZ2UgdG8gdGhlIHVzZXIgaW5kaWNhdGluZyBo b3cgdG8gZml4IHRoZSBpc3N1ZS4KCiAgICAgIEBjbGFzcyBDb250YWluZXJQ cm94eQogICAgICBAbmFtZXNwYWNlIERTCiAgICAgIEBwcml2YXRlCiAgICAq LwogICAgdmFyIENvbnRhaW5lclByb3h5ID0gZnVuY3Rpb24gKGNvbnRhaW5l cil7CiAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOwogICAgfTsK CiAgICBDb250YWluZXJQcm94eS5wcm90b3R5cGUuYWxpYXNlZEZhY3Rvcnkg PSBmdW5jdGlvbihwYXRoLCBwcmVMb29rdXApIHsKICAgICAgdmFyIF90aGlz ID0gdGhpczsKCiAgICAgIHJldHVybiB7Y3JlYXRlOiBmdW5jdGlvbigpeyAK ICAgICAgICBpZiAocHJlTG9va3VwKSB7IHByZUxvb2t1cCgpOyB9CgogICAg ICAgIHJldHVybiBfdGhpcy5jb250YWluZXIubG9va3VwKHBhdGgpOyAKICAg ICAgfX07CiAgICB9OwoKICAgIENvbnRhaW5lclByb3h5LnByb3RvdHlwZS5y ZWdpc3RlckFsaWFzID0gZnVuY3Rpb24oc291cmNlLCBkZXN0LCBwcmVMb29r dXApIHsKICAgICAgdmFyIGZhY3RvcnkgPSB0aGlzLmFsaWFzZWRGYWN0b3J5 KGRlc3QsIHByZUxvb2t1cCk7CgogICAgICByZXR1cm4gdGhpcy5jb250YWlu ZXIucmVnaXN0ZXIoc291cmNlLCBmYWN0b3J5KTsKICAgIH07CgogICAgQ29u dGFpbmVyUHJveHkucHJvdG90eXBlLnJlZ2lzdGVyRGVwcmVjYXRpb24gPSBm dW5jdGlvbihkZXByZWNhdGVkLCB2YWxpZCkgewogICAgICB2YXIgcHJlTG9v a3VwQ2FsbGJhY2sgPSBmdW5jdGlvbigpewogICAgICAgIEVtYmVyLmRlcHJl Y2F0ZSgiWW91IHRyaWVkIHRvIGxvb2sgdXAgJyIgKyBkZXByZWNhdGVkICsg IicsICIgKwogICAgICAgICAgICAgICAgICAgICAgICAiYnV0IHRoaXMgaGFz IGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvciBvZiAnIiArIHZhbGlkICsgIicu IiwgZmFsc2UpOwogICAgICB9OwoKICAgICAgcmV0dXJuIHRoaXMucmVnaXN0 ZXJBbGlhcyhkZXByZWNhdGVkLCB2YWxpZCwgcHJlTG9va3VwQ2FsbGJhY2sp OwogICAgfTsKCiAgICBDb250YWluZXJQcm94eS5wcm90b3R5cGUucmVnaXN0 ZXJEZXByZWNhdGlvbnMgPSBmdW5jdGlvbihwcm94eVBhaXJzKSB7CiAgICAg IGZvciAodmFyIGkgPSBwcm94eVBhaXJzLmxlbmd0aDsgaSA+IDA7IGktLSkg ewogICAgICAgIHZhciBwcm94eVBhaXIgPSBwcm94eVBhaXJzW2kgLSAxXSwK ICAgICAgICAgICAgZGVwcmVjYXRlZCA9IHByb3h5UGFpclsnZGVwcmVjYXRl ZCddLAogICAgICAgICAgICB2YWxpZCA9IHByb3h5UGFpclsndmFsaWQnXTsK CiAgICAgICAgdGhpcy5yZWdpc3RlckRlcHJlY2F0aW9uKGRlcHJlY2F0ZWQs IHZhbGlkKTsKICAgICAgfQogICAgfTsKCiAgICBfX2V4cG9ydHNfX1siZGVm YXVsdCJdID0gQ29udGFpbmVyUHJveHk7CiAgfSk7CmRlZmluZSgiZW1iZXIt ZGF0YS9saWIvc3lzdGVtL2RlYnVnIiwgCiAgWyIuL2RlYnVnL2RlYnVnX2lu Zm8iLCIuL2RlYnVnL2RlYnVnX2FkYXB0ZXIiLCJleHBvcnRzIl0sCiAgZnVu Y3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2RlcGVuZGVuY3kyX18sIF9fZXhw b3J0c19fKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICAvKioKICAgICAgQG1v ZHVsZSBlbWJlci1kYXRhCiAgICAqLwoKICAgIHZhciBEZWJ1Z0FkYXB0ZXIg PSBfX2RlcGVuZGVuY3kyX19bImRlZmF1bHQiXTsKCiAgICBfX2V4cG9ydHNf X1siZGVmYXVsdCJdID0gRGVidWdBZGFwdGVyOwogIH0pOwpkZWZpbmUoImVt YmVyLWRhdGEvbGliL3N5c3RlbS9kZWJ1Zy9kZWJ1Z19hZGFwdGVyIiwgCiAg WyIuLi9tb2RlbCIsImV4cG9ydHMiXSwKICBmdW5jdGlvbihfX2RlcGVuZGVu Y3kxX18sIF9fZXhwb3J0c19fKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICAv KioKICAgICAgQG1vZHVsZSBlbWJlci1kYXRhCiAgICAqLwogICAgdmFyIE1v ZGVsID0gX19kZXBlbmRlbmN5MV9fLk1vZGVsOwogICAgdmFyIGdldCA9IEVt YmVyLmdldCwgY2FwaXRhbGl6ZSA9IEVtYmVyLlN0cmluZy5jYXBpdGFsaXpl LCB1bmRlcnNjb3JlID0gRW1iZXIuU3RyaW5nLnVuZGVyc2NvcmU7CgogICAg LyoqCiAgICAgIEV4dGVuZCBgRW1iZXIuRGF0YUFkYXB0ZXJgIHdpdGggRUQg c3BlY2lmaWMgY29kZS4KCiAgICAgIEBjbGFzcyBEZWJ1Z0FkYXB0ZXIKICAg ICAgQG5hbWVzcGFjZSBEUwogICAgICBAZXh0ZW5kcyBFbWJlci5EYXRhQWRh cHRlcgogICAgICBAcHJpdmF0ZQogICAgKi8KICAgIHZhciBEZWJ1Z0FkYXB0 ZXIgPSBFbWJlci5EYXRhQWRhcHRlci5leHRlbmQoewogICAgICBnZXRGaWx0 ZXJzOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gWwogICAgICAgICAg eyBuYW1lOiAnaXNOZXcnLCBkZXNjOiAnTmV3JyB9LAogICAgICAgICAgeyBu YW1lOiAnaXNNb2RpZmllZCcsIGRlc2M6ICdNb2RpZmllZCcgfSwKICAgICAg ICAgIHsgbmFtZTogJ2lzQ2xlYW4nLCBkZXNjOiAnQ2xlYW4nIH0KICAgICAg ICBdOwogICAgICB9LAoKICAgICAgZGV0ZWN0OiBmdW5jdGlvbihrbGFzcykg ewogICAgICAgIHJldHVybiBrbGFzcyAhPT0gTW9kZWwgJiYgTW9kZWwuZGV0 ZWN0KGtsYXNzKTsKICAgICAgfSwKCiAgICAgIGNvbHVtbnNGb3JUeXBlOiBm dW5jdGlvbih0eXBlKSB7CiAgICAgICAgdmFyIGNvbHVtbnMgPSBbeyBuYW1l OiAnaWQnLCBkZXNjOiAnSWQnIH1dLCBjb3VudCA9IDAsIHNlbGYgPSB0aGlz OwogICAgICAgIGdldCh0eXBlLCAnYXR0cmlidXRlcycpLmZvckVhY2goZnVu Y3Rpb24obmFtZSwgbWV0YSkgewogICAgICAgICAgICBpZiAoY291bnQrKyA+ IHNlbGYuYXR0cmlidXRlTGltaXQpIHsgcmV0dXJuIGZhbHNlOyB9CiAgICAg ICAgICAgIHZhciBkZXNjID0gY2FwaXRhbGl6ZSh1bmRlcnNjb3JlKG5hbWUp LnJlcGxhY2UoJ18nLCAnICcpKTsKICAgICAgICAgICAgY29sdW1ucy5wdXNo KHsgbmFtZTogbmFtZSwgZGVzYzogZGVzYyB9KTsKICAgICAgICB9KTsKICAg ICAgICByZXR1cm4gY29sdW1uczsKICAgICAgfSwKCiAgICAgIGdldFJlY29y ZHM6IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXQo J3N0b3JlJykuYWxsKHR5cGUpOwogICAgICB9LAoKICAgICAgZ2V0UmVjb3Jk Q29sdW1uVmFsdWVzOiBmdW5jdGlvbihyZWNvcmQpIHsKICAgICAgICB2YXIg c2VsZiA9IHRoaXMsIGNvdW50ID0gMCwKICAgICAgICAgICAgY29sdW1uVmFs dWVzID0geyBpZDogZ2V0KHJlY29yZCwgJ2lkJykgfTsKCiAgICAgICAgcmVj b3JkLmVhY2hBdHRyaWJ1dGUoZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICBp ZiAoY291bnQrKyA+IHNlbGYuYXR0cmlidXRlTGltaXQpIHsKICAgICAgICAg ICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHZh bHVlID0gZ2V0KHJlY29yZCwga2V5KTsKICAgICAgICAgIGNvbHVtblZhbHVl c1trZXldID0gdmFsdWU7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGNv bHVtblZhbHVlczsKICAgICAgfSwKCiAgICAgIGdldFJlY29yZEtleXdvcmRz OiBmdW5jdGlvbihyZWNvcmQpIHsKICAgICAgICB2YXIga2V5d29yZHMgPSBb XSwga2V5cyA9IEVtYmVyLkEoWydpZCddKTsKICAgICAgICByZWNvcmQuZWFj aEF0dHJpYnV0ZShmdW5jdGlvbihrZXkpIHsKICAgICAgICAgIGtleXMucHVz aChrZXkpOwogICAgICAgIH0pOwogICAgICAgIGtleXMuZm9yRWFjaChmdW5j dGlvbihrZXkpIHsKICAgICAgICAgIGtleXdvcmRzLnB1c2goZ2V0KHJlY29y ZCwga2V5KSk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGtleXdvcmRz OwogICAgICB9LAoKICAgICAgZ2V0UmVjb3JkRmlsdGVyVmFsdWVzOiBmdW5j dGlvbihyZWNvcmQpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgaXNO ZXc6IHJlY29yZC5nZXQoJ2lzTmV3JyksCiAgICAgICAgICBpc01vZGlmaWVk OiByZWNvcmQuZ2V0KCdpc0RpcnR5JykgJiYgIXJlY29yZC5nZXQoJ2lzTmV3 JyksCiAgICAgICAgICBpc0NsZWFuOiAhcmVjb3JkLmdldCgnaXNEaXJ0eScp CiAgICAgICAgfTsKICAgICAgfSwKCiAgICAgIGdldFJlY29yZENvbG9yOiBm dW5jdGlvbihyZWNvcmQpIHsKICAgICAgICB2YXIgY29sb3IgPSAnYmxhY2sn OwogICAgICAgIGlmIChyZWNvcmQuZ2V0KCdpc05ldycpKSB7CiAgICAgICAg ICBjb2xvciA9ICdncmVlbic7CiAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQu Z2V0KCdpc0RpcnR5JykpIHsKICAgICAgICAgIGNvbG9yID0gJ2JsdWUnOwog ICAgICAgIH0KICAgICAgICByZXR1cm4gY29sb3I7CiAgICAgIH0sCgogICAg ICBvYnNlcnZlUmVjb3JkOiBmdW5jdGlvbihyZWNvcmQsIHJlY29yZFVwZGF0 ZWQpIHsKICAgICAgICB2YXIgcmVsZWFzZU1ldGhvZHMgPSBFbWJlci5BKCks IHNlbGYgPSB0aGlzLAogICAgICAgICAgICBrZXlzVG9PYnNlcnZlID0gRW1i ZXIuQShbJ2lkJywgJ2lzTmV3JywgJ2lzRGlydHknXSk7CgogICAgICAgIHJl Y29yZC5lYWNoQXR0cmlidXRlKGZ1bmN0aW9uKGtleSkgewogICAgICAgICAg a2V5c1RvT2JzZXJ2ZS5wdXNoKGtleSk7CiAgICAgICAgfSk7CgogICAgICAg IGtleXNUb09ic2VydmUuZm9yRWFjaChmdW5jdGlvbihrZXkpIHsKICAgICAg ICAgIHZhciBoYW5kbGVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJl Y29yZFVwZGF0ZWQoc2VsZi53cmFwUmVjb3JkKHJlY29yZCkpOwogICAgICAg ICAgfTsKICAgICAgICAgIEVtYmVyLmFkZE9ic2VydmVyKHJlY29yZCwga2V5 LCBoYW5kbGVyKTsKICAgICAgICAgIHJlbGVhc2VNZXRob2RzLnB1c2goZnVu Y3Rpb24oKSB7CiAgICAgICAgICAgIEVtYmVyLnJlbW92ZU9ic2VydmVyKHJl Y29yZCwga2V5LCBoYW5kbGVyKTsKICAgICAgICAgIH0pOwogICAgICAgIH0p OwoKICAgICAgICB2YXIgcmVsZWFzZSA9IGZ1bmN0aW9uKCkgewogICAgICAg ICAgcmVsZWFzZU1ldGhvZHMuZm9yRWFjaChmdW5jdGlvbihmbikgeyBmbigp OyB9ICk7CiAgICAgICAgfTsKCiAgICAgICAgcmV0dXJuIHJlbGVhc2U7CiAg ICAgIH0KCiAgICB9KTsKCiAgICBfX2V4cG9ydHNfX1siZGVmYXVsdCJdID0g RGVidWdBZGFwdGVyOwogIH0pOwpkZWZpbmUoImVtYmVyLWRhdGEvbGliL3N5 c3RlbS9kZWJ1Zy9kZWJ1Z19pbmZvIiwgCiAgWyIuLi9tb2RlbCIsImV4cG9y dHMiXSwKICBmdW5jdGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZXhwb3J0c19f KSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgTW9kZWwgPSBfX2RlcGVu ZGVuY3kxX18uTW9kZWw7CgogICAgTW9kZWwucmVvcGVuKHsKCiAgICAgIC8q KgogICAgICAgIFByb3ZpZGVzIGluZm8gYWJvdXQgdGhlIG1vZGVsIGZvciBk ZWJ1Z2dpbmcgcHVycG9zZXMKICAgICAgICBieSBncm91cGluZyB0aGUgcHJv cGVydGllcyBpbnRvIG1vcmUgc2VtYW50aWMgZ3JvdXBzLgoKICAgICAgICBN ZWFudCB0byBiZSB1c2VkIGJ5IGRlYnVnZ2luZyB0b29scyBzdWNoIGFzIHRo ZSBDaHJvbWUgRW1iZXIgRXh0ZW5zaW9uLgoKICAgICAgICAtIEdyb3VwcyBh bGwgYXR0cmlidXRlcyBpbiAiQXR0cmlidXRlcyIgZ3JvdXAuCiAgICAgICAg LSBHcm91cHMgYWxsIGJlbG9uZ3NUbyByZWxhdGlvbnNoaXBzIGluICJCZWxv bmdzIFRvIiBncm91cC4KICAgICAgICAtIEdyb3VwcyBhbGwgaGFzTWFueSBy ZWxhdGlvbnNoaXBzIGluICJIYXMgTWFueSIgZ3JvdXAuCiAgICAgICAgLSBH cm91cHMgYWxsIGZsYWdzIGluICJGbGFncyIgZ3JvdXAuCiAgICAgICAgLSBG bGFncyByZWxhdGlvbnNoaXAgQ1BzIGFzIGV4cGVuc2l2ZSBwcm9wZXJ0aWVz LgoKICAgICAgICBAbWV0aG9kIF9kZWJ1Z0luZm8KICAgICAgICBAZm9yIERT Lk1vZGVsCiAgICAgICAgQHByaXZhdGUKICAgICAgKi8KICAgICAgX2RlYnVn SW5mbzogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBb J2lkJ10sCiAgICAgICAgICAgIHJlbGF0aW9uc2hpcHMgPSB7IGJlbG9uZ3NU bzogW10sIGhhc01hbnk6IFtdIH0sCiAgICAgICAgICAgIGV4cGVuc2l2ZVBy b3BlcnRpZXMgPSBbXTsKCiAgICAgICAgdGhpcy5lYWNoQXR0cmlidXRlKGZ1 bmN0aW9uKG5hbWUsIG1ldGEpIHsKICAgICAgICAgIGF0dHJpYnV0ZXMucHVz aChuYW1lKTsKICAgICAgICB9LCB0aGlzKTsKCiAgICAgICAgdGhpcy5lYWNo UmVsYXRpb25zaGlwKGZ1bmN0aW9uKG5hbWUsIHJlbGF0aW9uc2hpcCkgewog ICAgICAgICAgcmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXAua2luZF0ucHVz aChuYW1lKTsKICAgICAgICAgIGV4cGVuc2l2ZVByb3BlcnRpZXMucHVzaChu YW1lKTsKICAgICAgICB9KTsKCiAgICAgICAgdmFyIGdyb3VwcyA9IFsKICAg ICAgICAgIHsKICAgICAgICAgICAgbmFtZTogJ0F0dHJpYnV0ZXMnLAogICAg ICAgICAgICBwcm9wZXJ0aWVzOiBhdHRyaWJ1dGVzLAogICAgICAgICAgICBl eHBhbmQ6IHRydWUKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAg ICAgIG5hbWU6ICdCZWxvbmdzIFRvJywKICAgICAgICAgICAgcHJvcGVydGll czogcmVsYXRpb25zaGlwcy5iZWxvbmdzVG8sCiAgICAgICAgICAgIGV4cGFu ZDogdHJ1ZQogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAg bmFtZTogJ0hhcyBNYW55JywKICAgICAgICAgICAgcHJvcGVydGllczogcmVs YXRpb25zaGlwcy5oYXNNYW55LAogICAgICAgICAgICBleHBhbmQ6IHRydWUK ICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIG5hbWU6ICdG bGFncycsCiAgICAgICAgICAgIHByb3BlcnRpZXM6IFsnaXNMb2FkZWQnLCAn aXNEaXJ0eScsICdpc1NhdmluZycsICdpc0RlbGV0ZWQnLCAnaXNFcnJvcics ICdpc05ldycsICdpc1ZhbGlkJ10KICAgICAgICAgIH0KICAgICAgICBdOwoK ICAgICAgICByZXR1cm4gewogICAgICAgICAgcHJvcGVydHlJbmZvOiB7CiAg ICAgICAgICAgIC8vIGluY2x1ZGUgYWxsIG90aGVyIG1peGlucyAvIHByb3Bl cnRpZXMgKG5vdCBqdXN0IHRoZSBncm91cGVkIG9uZXMpCiAgICAgICAgICAg IGluY2x1ZGVPdGhlclByb3BlcnRpZXM6IHRydWUsCiAgICAgICAgICAgIGdy b3VwczogZ3JvdXBzLAogICAgICAgICAgICAvLyBkb24ndCBwcmUtY2FsY3Vs YXRlIHVubGVzcyBjYWNoZWQKICAgICAgICAgICAgZXhwZW5zaXZlUHJvcGVy dGllczogZXhwZW5zaXZlUHJvcGVydGllcwogICAgICAgICAgfQogICAgICAg IH07CiAgICAgIH0KICAgIH0pOwoKICAgIF9fZXhwb3J0c19fWyJkZWZhdWx0 Il0gPSBNb2RlbDsKICB9KTsKZGVmaW5lKCJlbWJlci1kYXRhL2xpYi9zeXN0 ZW0vbW9kZWwiLCAKICBbIi4vbW9kZWwvbW9kZWwiLCIuL21vZGVsL2F0dHJp YnV0ZXMiLCIuL21vZGVsL3N0YXRlcyIsIi4vbW9kZWwvZXJyb3JzIiwiZXhw b3J0cyJdLAogIGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19kZXBlbmRl bmN5Ml9fLCBfX2RlcGVuZGVuY3kzX18sIF9fZGVwZW5kZW5jeTRfXywgX19l eHBvcnRzX18pIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIC8qKgogICAgICBA bW9kdWxlIGVtYmVyLWRhdGEKICAgICovCgogICAgdmFyIE1vZGVsID0gX19k ZXBlbmRlbmN5MV9fWyJkZWZhdWx0Il07CiAgICB2YXIgYXR0ciA9IF9fZGVw ZW5kZW5jeTJfX1siZGVmYXVsdCJdOwogICAgdmFyIFJvb3RTdGF0ZSA9IF9f ZGVwZW5kZW5jeTNfX1siZGVmYXVsdCJdOwogICAgdmFyIEVycm9ycyA9IF9f ZGVwZW5kZW5jeTRfX1siZGVmYXVsdCJdOwoKICAgIF9fZXhwb3J0c19fLk1v ZGVsID0gTW9kZWw7CiAgICBfX2V4cG9ydHNfXy5Sb290U3RhdGUgPSBSb290 U3RhdGU7CiAgICBfX2V4cG9ydHNfXy5hdHRyID0gYXR0cjsKICAgIF9fZXhw b3J0c19fLkVycm9ycyA9IEVycm9yczsKICB9KTsKZGVmaW5lKCJlbWJlci1k YXRhL2xpYi9zeXN0ZW0vbW9kZWwvYXR0cmlidXRlcyIsIAogIFsiLi9tb2Rl bCIsImV4cG9ydHMiXSwKICBmdW5jdGlvbihfX2RlcGVuZGVuY3kxX18sIF9f ZXhwb3J0c19fKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgTW9kZWwg PSBfX2RlcGVuZGVuY3kxX19bImRlZmF1bHQiXTsKCiAgICAvKioKICAgICAg QG1vZHVsZSBlbWJlci1kYXRhCiAgICAqLwoKICAgIHZhciBnZXQgPSBFbWJl ci5nZXQ7CgogICAgLyoqCiAgICAgIEBjbGFzcyBNb2RlbAogICAgICBAbmFt ZXNwYWNlIERTCiAgICAqLwogICAgTW9kZWwucmVvcGVuQ2xhc3MoewogICAg ICAvKioKICAgICAgICBBIG1hcCB3aG9zZSBrZXlzIGFyZSB0aGUgYXR0cmli dXRlcyBvZiB0aGUgbW9kZWwgKHByb3BlcnRpZXMKICAgICAgICBkZXNjcmli ZWQgYnkgRFMuYXR0cikgYW5kIHdob3NlIHZhbHVlcyBhcmUgdGhlIG1ldGEg b2JqZWN0IGZvciB0aGUKICAgICAgICBwcm9wZXJ0eS4KCiAgICAgICAgRXhh bXBsZQoKICAgICAgICBgYGBqYXZhc2NyaXB0CgogICAgICAgIEFwcC5QZXJz b24gPSBEUy5Nb2RlbC5leHRlbmQoewogICAgICAgICAgZmlyc3ROYW1lOiBh dHRyKCdzdHJpbmcnKSwKICAgICAgICAgIGxhc3ROYW1lOiBhdHRyKCdzdHJp bmcnKSwKICAgICAgICAgIGJpcnRoZGF5OiBhdHRyKCdkYXRlJykKICAgICAg ICB9KTsKCiAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBFbWJlci5nZXQoQXBw LlBlcnNvbiwgJ2F0dHJpYnV0ZXMnKQoKICAgICAgICBhdHRyaWJ1dGVzLmZv ckVhY2goZnVuY3Rpb24obmFtZSwgbWV0YSkgewogICAgICAgICAgY29uc29s ZS5sb2cobmFtZSwgbWV0YSk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIHBy aW50czoKICAgICAgICAvLyBmaXJzdE5hbWUge3R5cGU6ICJzdHJpbmciLCBp c0F0dHJpYnV0ZTogdHJ1ZSwgb3B0aW9uczogT2JqZWN0LCBwYXJlbnRUeXBl OiBmdW5jdGlvbiwgbmFtZTogImZpcnN0TmFtZSJ9CiAgICAgICAgLy8gbGFz dE5hbWUge3R5cGU6ICJzdHJpbmciLCBpc0F0dHJpYnV0ZTogdHJ1ZSwgb3B0 aW9uczogT2JqZWN0LCBwYXJlbnRUeXBlOiBmdW5jdGlvbiwgbmFtZTogImxh c3ROYW1lIn0KICAgICAgICAvLyBiaXJ0aGRheSB7dHlwZTogImRhdGUiLCBp c0F0dHJpYnV0ZTogdHJ1ZSwgb3B0aW9uczogT2JqZWN0LCBwYXJlbnRUeXBl OiBmdW5jdGlvbiwgbmFtZTogImJpcnRoZGF5In0KICAgICAgICBgYGAKCiAg ICAgICAgQHByb3BlcnR5IGF0dHJpYnV0ZXMKICAgICAgICBAc3RhdGljCiAg ICAgICAgQHR5cGUge0VtYmVyLk1hcH0KICAgICAgICBAcmVhZE9ubHkKICAg ICAgKi8KICAgICAgYXR0cmlidXRlczogRW1iZXIuY29tcHV0ZWQoZnVuY3Rp b24oKSB7CiAgICAgICAgdmFyIG1hcCA9IEVtYmVyLk1hcC5jcmVhdGUoKTsK CiAgICAgICAgdGhpcy5lYWNoQ29tcHV0ZWRQcm9wZXJ0eShmdW5jdGlvbihu YW1lLCBtZXRhKSB7CiAgICAgICAgICBpZiAobWV0YS5pc0F0dHJpYnV0ZSkg ewogICAgICAgICAgICBFbWJlci5hc3NlcnQoIllvdSBtYXkgbm90IHNldCBg aWRgIGFzIGFuIGF0dHJpYnV0ZSBvbiB5b3VyIG1vZGVsLiBQbGVhc2UgcmVt b3ZlIGFueSBsaW5lcyB0aGF0IGxvb2sgbGlrZTogYGlkOiBEUy5hdHRyKCc8 dHlwZT4nKWAgZnJvbSAiICsgdGhpcy50b1N0cmluZygpLCBuYW1lICE9PSAn aWQnKTsKCiAgICAgICAgICAgIG1ldGEubmFtZSA9IG5hbWU7CiAgICAgICAg ICAgIG1hcC5zZXQobmFtZSwgbWV0YSk7CiAgICAgICAgICB9CiAgICAgICAg fSk7CgogICAgICAgIHJldHVybiBtYXA7CiAgICAgIH0pLAoKICAgICAgLyoq CiAgICAgICAgQSBtYXAgd2hvc2Uga2V5cyBhcmUgdGhlIGF0dHJpYnV0ZXMg b2YgdGhlIG1vZGVsIChwcm9wZXJ0aWVzCiAgICAgICAgZGVzY3JpYmVkIGJ5 IERTLmF0dHIpIGFuZCB3aG9zZSB2YWx1ZXMgYXJlIHR5cGUgb2YgdHJhbnNm b3JtYXRpb24KICAgICAgICBhcHBsaWVkIHRvIGVhY2ggYXR0cmlidXRlLiBU aGlzIG1hcCBkb2VzIG5vdCBpbmNsdWRlIGFueQogICAgICAgIGF0dHJpYnV0 ZXMgdGhhdCBkbyBub3QgaGF2ZSBhbiB0cmFuc2Zvcm1hdGlvbiB0eXBlLgoK ICAgICAgICBFeGFtcGxlCgogICAgICAgIGBgYGphdmFzY3JpcHQKICAgICAg ICBBcHAuUGVyc29uID0gRFMuTW9kZWwuZXh0ZW5kKHsKICAgICAgICAgIGZp cnN0TmFtZTogYXR0cigpLAogICAgICAgICAgbGFzdE5hbWU6IGF0dHIoJ3N0 cmluZycpLAogICAgICAgICAgYmlydGhkYXk6IGF0dHIoJ2RhdGUnKQogICAg ICAgIH0pOwoKICAgICAgICB2YXIgdHJhbnNmb3JtZWRBdHRyaWJ1dGVzID0g RW1iZXIuZ2V0KEFwcC5QZXJzb24sICd0cmFuc2Zvcm1lZEF0dHJpYnV0ZXMn KQoKICAgICAgICB0cmFuc2Zvcm1lZEF0dHJpYnV0ZXMuZm9yRWFjaChmdW5j dGlvbihmaWVsZCwgdHlwZSkgewogICAgICAgICAgY29uc29sZS5sb2coZmll bGQsIHR5cGUpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBwcmludHM6CiAg ICAgICAgLy8gbGFzdE5hbWUgc3RyaW5nCiAgICAgICAgLy8gYmlydGhkYXkg ZGF0ZQogICAgICAgIGBgYAoKICAgICAgICBAcHJvcGVydHkgdHJhbnNmb3Jt ZWRBdHRyaWJ1dGVzCiAgICAgICAgQHN0YXRpYwogICAgICAgIEB0eXBlIHtF bWJlci5NYXB9CiAgICAgICAgQHJlYWRPbmx5CiAgICAgICovCiAgICAgIHRy YW5zZm9ybWVkQXR0cmlidXRlczogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24o KSB7CiAgICAgICAgdmFyIG1hcCA9IEVtYmVyLk1hcC5jcmVhdGUoKTsKCiAg ICAgICAgdGhpcy5lYWNoQXR0cmlidXRlKGZ1bmN0aW9uKGtleSwgbWV0YSkg ewogICAgICAgICAgaWYgKG1ldGEudHlwZSkgewogICAgICAgICAgICBtYXAu c2V0KGtleSwgbWV0YS50eXBlKTsKICAgICAgICAgIH0KICAgICAgICB9KTsK CiAgICAgICAgcmV0dXJuIG1hcDsKICAgICAgfSksCgogICAgICAvKioKICAg ICAgICBJdGVyYXRlcyB0aHJvdWdoIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBt b2RlbCwgY2FsbGluZyB0aGUgcGFzc2VkIGZ1bmN0aW9uIG9uIGVhY2gKICAg ICAgICBhdHRyaWJ1dGUuCgogICAgICAgIFRoZSBjYWxsYmFjayBtZXRob2Qg eW91IHByb3ZpZGUgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1 cmUgKGFsbAogICAgICAgIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsKToKCiAg ICAgICAgYGBgamF2YXNjcmlwdAogICAgICAgIGZ1bmN0aW9uKG5hbWUsIG1l dGEpOwogICAgICAgIGBgYAoKICAgICAgICAtIGBuYW1lYCB0aGUgbmFtZSBv ZiB0aGUgY3VycmVudCBwcm9wZXJ0eSBpbiB0aGUgaXRlcmF0aW9uCiAgICAg ICAgLSBgbWV0YWAgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRl IHByb3BlcnR5IGluIHRoZSBpdGVyYXRpb24KCiAgICAgICAgTm90ZSB0aGF0 IGluIGFkZGl0aW9uIHRvIGEgY2FsbGJhY2ssIHlvdSBjYW4gYWxzbyBwYXNz IGFuIG9wdGlvbmFsIHRhcmdldAogICAgICAgIG9iamVjdCB0aGF0IHdpbGwg YmUgc2V0IGFzIGB0aGlzYCBvbiB0aGUgY29udGV4dC4KCiAgICAgICAgRXhh bXBsZQoKICAgICAgICBgYGBqYXZhc2NyaXB0CiAgICAgICAgQXBwLlBlcnNv biA9IERTLk1vZGVsLmV4dGVuZCh7CiAgICAgICAgICBmaXJzdE5hbWU6IGF0 dHIoJ3N0cmluZycpLAogICAgICAgICAgbGFzdE5hbWU6IGF0dHIoJ3N0cmlu ZycpLAogICAgICAgICAgYmlydGhkYXk6IGF0dHIoJ2RhdGUnKQogICAgICAg IH0pOwoKICAgICAgICBBcHAuUGVyc29uLmVhY2hBdHRyaWJ1dGUoZnVuY3Rp b24obmFtZSwgbWV0YSkgewogICAgICAgICAgY29uc29sZS5sb2cobmFtZSwg bWV0YSk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIHByaW50czoKICAgICAg ICAvLyBmaXJzdE5hbWUge3R5cGU6ICJzdHJpbmciLCBpc0F0dHJpYnV0ZTog dHJ1ZSwgb3B0aW9uczogT2JqZWN0LCBwYXJlbnRUeXBlOiBmdW5jdGlvbiwg bmFtZTogImZpcnN0TmFtZSJ9CiAgICAgICAgLy8gbGFzdE5hbWUge3R5cGU6 ICJzdHJpbmciLCBpc0F0dHJpYnV0ZTogdHJ1ZSwgb3B0aW9uczogT2JqZWN0 LCBwYXJlbnRUeXBlOiBmdW5jdGlvbiwgbmFtZTogImxhc3ROYW1lIn0KICAg ICAgICAvLyBiaXJ0aGRheSB7dHlwZTogImRhdGUiLCBpc0F0dHJpYnV0ZTog dHJ1ZSwgb3B0aW9uczogT2JqZWN0LCBwYXJlbnRUeXBlOiBmdW5jdGlvbiwg bmFtZTogImJpcnRoZGF5In0KICAgICAgIGBgYAoKICAgICAgICBAbWV0aG9k IGVhY2hBdHRyaWJ1dGUKICAgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxs YmFjayBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZQogICAgICAgIEBwYXJhbSB7 T2JqZWN0fSBbdGFyZ2V0XSBUaGUgdGFyZ2V0IG9iamVjdCB0byB1c2UKICAg ICAgICBAc3RhdGljCiAgICAgICovCiAgICAgIGVhY2hBdHRyaWJ1dGU6IGZ1 bmN0aW9uKGNhbGxiYWNrLCBiaW5kaW5nKSB7CiAgICAgICAgZ2V0KHRoaXMs ICdhdHRyaWJ1dGVzJykuZm9yRWFjaChmdW5jdGlvbihuYW1lLCBtZXRhKSB7 CiAgICAgICAgICBjYWxsYmFjay5jYWxsKGJpbmRpbmcsIG5hbWUsIG1ldGEp OwogICAgICAgIH0sIGJpbmRpbmcpOwogICAgICB9LAoKICAgICAgLyoqCiAg ICAgICAgSXRlcmF0ZXMgdGhyb3VnaCB0aGUgdHJhbnNmb3JtZWRBdHRyaWJ1 dGVzIG9mIHRoZSBtb2RlbCwgY2FsbGluZwogICAgICAgIHRoZSBwYXNzZWQg ZnVuY3Rpb24gb24gZWFjaCBhdHRyaWJ1dGUuIE5vdGUgdGhlIGNhbGxiYWNr IHdpbGwgbm90IGJlCiAgICAgICAgY2FsbGVkIGZvciBhbnkgYXR0cmlidXRl cyB0aGF0IGRvIG5vdCBoYXZlIGFuIHRyYW5zZm9ybWF0aW9uIHR5cGUuCgog ICAgICAgIFRoZSBjYWxsYmFjayBtZXRob2QgeW91IHByb3ZpZGUgc2hvdWxk IGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmUgKGFsbAogICAgICAgIHBh cmFtZXRlcnMgYXJlIG9wdGlvbmFsKToKCiAgICAgICAgYGBgamF2YXNjcmlw dAogICAgICAgIGZ1bmN0aW9uKG5hbWUsIHR5cGUpOwogICAgICAgIGBgYAoK ICAgICAgICAtIGBuYW1lYCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBwcm9w ZXJ0eSBpbiB0aGUgaXRlcmF0aW9uCiAgICAgICAgLSBgdHlwZWAgYSBzdHJp bmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBvZiB0cmFuc2Zv cm1lZAogICAgICAgICAgYXBwbGllZCB0byB0aGUgYXR0cmlidXRlCgogICAg ICAgIE5vdGUgdGhhdCBpbiBhZGRpdGlvbiB0byBhIGNhbGxiYWNrLCB5b3Ug Y2FuIGFsc28gcGFzcyBhbiBvcHRpb25hbCB0YXJnZXQKICAgICAgICBvYmpl Y3QgdGhhdCB3aWxsIGJlIHNldCBhcyBgdGhpc2Agb24gdGhlIGNvbnRleHQu CgogICAgICAgIEV4YW1wbGUKCiAgICAgICAgYGBgamF2YXNjcmlwdAogICAg ICAgIEFwcC5QZXJzb24gPSBEUy5Nb2RlbC5leHRlbmQoewogICAgICAgICAg Zmlyc3ROYW1lOiBhdHRyKCksCiAgICAgICAgICBsYXN0TmFtZTogYXR0cign c3RyaW5nJyksCiAgICAgICAgICBiaXJ0aGRheTogYXR0cignZGF0ZScpCiAg ICAgICAgfSk7CgogICAgICAgIEFwcC5QZXJzb24uZWFjaFRyYW5zZm9ybWVk QXR0cmlidXRlKGZ1bmN0aW9uKG5hbWUsIHR5cGUpIHsKICAgICAgICAgIGNv bnNvbGUubG9nKG5hbWUsIHR5cGUpOwogICAgICAgIH0pOwoKICAgICAgICAv LyBwcmludHM6CiAgICAgICAgLy8gbGFzdE5hbWUgc3RyaW5nCiAgICAgICAg Ly8gYmlydGhkYXkgZGF0ZQogICAgICAgYGBgCgogICAgICAgIEBtZXRob2Qg ZWFjaFRyYW5zZm9ybWVkQXR0cmlidXRlCiAgICAgICAgQHBhcmFtIHtGdW5j dGlvbn0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUKICAgICAg ICBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0gVGhlIHRhcmdldCBvYmplY3Qg dG8gdXNlCiAgICAgICAgQHN0YXRpYwogICAgICAqLwogICAgICBlYWNoVHJh bnNmb3JtZWRBdHRyaWJ1dGU6IGZ1bmN0aW9uKGNhbGxiYWNrLCBiaW5kaW5n KSB7CiAgICAgICAgZ2V0KHRoaXMsICd0cmFuc2Zvcm1lZEF0dHJpYnV0ZXMn KS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUsIHR5cGUpIHsKICAgICAgICAgIGNh bGxiYWNrLmNhbGwoYmluZGluZywgbmFtZSwgdHlwZSk7CiAgICAgICAgfSk7 CiAgICAgIH0KICAgIH0pOwoKCiAgICBNb2RlbC5yZW9wZW4oewogICAgICBl YWNoQXR0cmlidXRlOiBmdW5jdGlvbihjYWxsYmFjaywgYmluZGluZykgewog ICAgICAgIHRoaXMuY29uc3RydWN0b3IuZWFjaEF0dHJpYnV0ZShjYWxsYmFj aywgYmluZGluZyk7CiAgICAgIH0KICAgIH0pOwoKICAgIGZ1bmN0aW9uIGdl dERlZmF1bHRWYWx1ZShyZWNvcmQsIG9wdGlvbnMsIGtleSkgewogICAgICBp ZiAodHlwZW9mIG9wdGlvbnMuZGVmYXVsdFZhbHVlID09PSAiZnVuY3Rpb24i KSB7CiAgICAgICAgcmV0dXJuIG9wdGlvbnMuZGVmYXVsdFZhbHVlLmFwcGx5 KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0 dXJuIG9wdGlvbnMuZGVmYXVsdFZhbHVlOwogICAgICB9CiAgICB9CgogICAg ZnVuY3Rpb24gaGFzVmFsdWUocmVjb3JkLCBrZXkpIHsKICAgICAgcmV0dXJu IHJlY29yZC5fYXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eShrZXkpIHx8CiAg ICAgICAgICAgICByZWNvcmQuX2luRmxpZ2h0QXR0cmlidXRlcy5oYXNPd25Q cm9wZXJ0eShrZXkpIHx8CiAgICAgICAgICAgICByZWNvcmQuX2RhdGEuaGFz T3duUHJvcGVydHkoa2V5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRWYWx1 ZShyZWNvcmQsIGtleSkgewogICAgICBpZiAocmVjb3JkLl9hdHRyaWJ1dGVz Lmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICByZXR1cm4gcmVjb3Jk Ll9hdHRyaWJ1dGVzW2tleV07CiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLl9p bkZsaWdodEF0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAg ICAgIHJldHVybiByZWNvcmQuX2luRmxpZ2h0QXR0cmlidXRlc1trZXldOwog ICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiByZWNvcmQuX2RhdGFba2V5 XTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICBgRFMuYXR0cmAgZGVm aW5lcyBhbiBhdHRyaWJ1dGUgb24gYSBbRFMuTW9kZWxdKC9hcGkvZGF0YS9j bGFzc2VzL0RTLk1vZGVsLmh0bWwpLgogICAgICBCeSBkZWZhdWx0LCBhdHRy aWJ1dGVzIGFyZSBwYXNzZWQgdGhyb3VnaCBhcy1pcywgaG93ZXZlciB5b3Ug Y2FuIHNwZWNpZnkgYW4KICAgICAgb3B0aW9uYWwgdHlwZSB0byBoYXZlIHRo ZSB2YWx1ZSBhdXRvbWF0aWNhbGx5IHRyYW5zZm9ybWVkLgogICAgICBFbWJl ciBEYXRhIHNoaXBzIHdpdGggZm91ciBiYXNpYyB0cmFuc2Zvcm0gdHlwZXM6 IGBzdHJpbmdgLCBgbnVtYmVyYCwKICAgICAgYGJvb2xlYW5gIGFuZCBgZGF0 ZWAuIFlvdSBjYW4gZGVmaW5lIHlvdXIgb3duIHRyYW5zZm9ybXMgYnkgc3Vi Y2xhc3NpbmcKICAgICAgW0RTLlRyYW5zZm9ybV0oL2FwaS9kYXRhL2NsYXNz ZXMvRFMuVHJhbnNmb3JtLmh0bWwpLgoKICAgICAgYERTLmF0dHJgIHRha2Vz IGFuIG9wdGlvbmFsIGhhc2ggYXMgYSBzZWNvbmQgcGFyYW1ldGVyLCBjdXJy ZW50bHkKICAgICAgc3VwcG9ydGVkIG9wdGlvbnMgYXJlOgoKICAgICAgLSBg ZGVmYXVsdFZhbHVlYDogUGFzcyBhIHN0cmluZyBvciBhIGZ1bmN0aW9uIHRv IGJlIGNhbGxlZCB0byBzZXQgdGhlIGF0dHJpYnV0ZQogICAgICAgICAgICAg ICAgICAgICAgICB0byBhIGRlZmF1bHQgdmFsdWUgaWYgbm9uZSBpcyBzdXBw bGllZC4KCiAgICAgIEV4YW1wbGUKCiAgICAgIGBgYGphdmFzY3JpcHQKICAg ICAgdmFyIGF0dHIgPSBEUy5hdHRyOwoKICAgICAgQXBwLlVzZXIgPSBEUy5N b2RlbC5leHRlbmQoewogICAgICAgIHVzZXJuYW1lOiBhdHRyKCdzdHJpbmcn KSwKICAgICAgICBlbWFpbDogYXR0cignc3RyaW5nJyksCiAgICAgICAgdmVy aWZpZWQ6IGF0dHIoJ2Jvb2xlYW4nLCB7ZGVmYXVsdFZhbHVlOiBmYWxzZX0p CiAgICAgIH0pOwogICAgICBgYGAKCiAgICAgIEBuYW1lc3BhY2UKICAgICAg QG1ldGhvZCBhdHRyCiAgICAgIEBmb3IgRFMKICAgICAgQHBhcmFtIHtTdHJp bmd9IHR5cGUgdGhlIGF0dHJpYnV0ZSB0eXBlCiAgICAgIEBwYXJhbSB7T2Jq ZWN0fSBvcHRpb25zIGEgaGFzaCBvZiBvcHRpb25zCiAgICAgIEByZXR1cm4g e0F0dHJpYnV0ZX0KICAgICovCgogICAgZnVuY3Rpb24gYXR0cih0eXBlLCBv cHRpb25zKSB7CiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoKICAg ICAgdmFyIG1ldGEgPSB7CiAgICAgICAgdHlwZTogdHlwZSwKICAgICAgICBp c0F0dHJpYnV0ZTogdHJ1ZSwKICAgICAgICBvcHRpb25zOiBvcHRpb25zCiAg ICAgIH07CgogICAgICByZXR1cm4gRW1iZXIuY29tcHV0ZWQoJ2RhdGEnLCBm dW5jdGlvbihrZXksIHZhbHVlKSB7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5s ZW5ndGggPiAxKSB7CiAgICAgICAgICBFbWJlci5hc3NlcnQoIllvdSBtYXkg bm90IHNldCBgaWRgIGFzIGFuIGF0dHJpYnV0ZSBvbiB5b3VyIG1vZGVsLiBQ bGVhc2UgcmVtb3ZlIGFueSBsaW5lcyB0aGF0IGxvb2sgbGlrZTogYGlkOiBE Uy5hdHRyKCc8dHlwZT4nKWAgZnJvbSAiICsgdGhpcy5jb25zdHJ1Y3Rvci50 b1N0cmluZygpLCBrZXkgIT09ICdpZCcpOwogICAgICAgICAgdmFyIG9sZFZh bHVlID0gZ2V0VmFsdWUodGhpcywga2V5KTsKCiAgICAgICAgICBpZiAodmFs dWUgIT09IG9sZFZhbHVlKSB7CiAgICAgICAgICAgIC8vIEFkZCB0aGUgbmV3 IHZhbHVlIHRvIHRoZSBjaGFuZ2VkIGF0dHJpYnV0ZXMgaGFzaDsgaXQgd2ls bCBnZXQgZGVsZXRlZCBieQogICAgICAgICAgICAvLyB0aGUgJ2RpZFNldFBy b3BlcnR5JyBoYW5kbGVyIGlmIGl0IGlzIG5vIGRpZmZlcmVudCBmcm9tIHRo ZSBvcmlnaW5hbCB2YWx1ZQogICAgICAgICAgICB0aGlzLl9hdHRyaWJ1dGVz W2tleV0gPSB2YWx1ZTsKCiAgICAgICAgICAgIHRoaXMuc2VuZCgnZGlkU2V0 UHJvcGVydHknLCB7CiAgICAgICAgICAgICAgbmFtZToga2V5LAogICAgICAg ICAgICAgIG9sZFZhbHVlOiBvbGRWYWx1ZSwKICAgICAgICAgICAgICBvcmln aW5hbFZhbHVlOiB0aGlzLl9kYXRhW2tleV0sCiAgICAgICAgICAgICAgdmFs dWU6IHZhbHVlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQoKICAgICAg ICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9IGVsc2UgaWYgKGhhc1ZhbHVl KHRoaXMsIGtleSkpIHsKICAgICAgICAgIHJldHVybiBnZXRWYWx1ZSh0aGlz LCBrZXkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gZ2V0 RGVmYXVsdFZhbHVlKHRoaXMsIG9wdGlvbnMsIGtleSk7CiAgICAgICAgfQoK ICAgICAgLy8gYGRhdGFgIGlzIG5ldmVyIHNldCBkaXJlY3RseS4gSG93ZXZl ciwgaXQgbWF5IGJlCiAgICAgIC8vIGludmFsaWRhdGVkIGZyb20gdGhlIHN0 YXRlIG1hbmFnZXIncyBzZXREYXRhCiAgICAgIC8vIGV2ZW50LgogICAgICB9 KS5tZXRhKG1ldGEpOwogICAgfQoKICAgIF9fZXhwb3J0c19fWyJkZWZhdWx0 Il0gPSBhdHRyOwogIH0pOwpkZWZpbmUoImVtYmVyLWRhdGEvbGliL3N5c3Rl bS9tb2RlbC9lcnJvcnMiLCAKICBbImV4cG9ydHMiXSwKICBmdW5jdGlvbihf X2V4cG9ydHNfXykgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIGdldCA9 IEVtYmVyLmdldCwgaXNFbXB0eSA9IEVtYmVyLmlzRW1wdHk7CgogICAgLyoq CiAgICBAbW9kdWxlIGVtYmVyLWRhdGEKICAgICovCgogICAgLyoqCiAgICAg IEhvbGRzIHZhbGlkYXRpb24gZXJyb3JzIGZvciBhIGdpdmVuIHJlY29yZCBv cmdhbml6ZWQgYnkgYXR0cmlidXRlIG5hbWVzLgoKICAgICAgQGNsYXNzIEVy cm9ycwogICAgICBAbmFtZXNwYWNlIERTCiAgICAgIEBleHRlbmRzIEVtYmVy Lk9iamVjdAogICAgICBAdXNlcyBFbWJlci5FbnVtZXJhYmxlCiAgICAgIEB1 c2VzIEVtYmVyLkV2ZW50ZWQKICAgICAqLwogICAgdmFyIEVycm9ycyA9IEVt YmVyLk9iamVjdC5leHRlbmQoRW1iZXIuRW51bWVyYWJsZSwgRW1iZXIuRXZl bnRlZCwgewogICAgICAvKioKICAgICAgICBSZWdpc3RlciB3aXRoIHRhcmdl dCBoYW5kbGVyCgogICAgICAgIEBtZXRob2QgcmVnaXN0ZXJIYW5kbGVycwog ICAgICAgIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXQKICAgICAgICBAcGFyYW0g e0Z1bmN0aW9ufSBiZWNhbWVJbnZhbGlkCiAgICAgICAgQHBhcmFtIHtGdW5j dGlvbn0gYmVjYW1lVmFsaWQKICAgICAgKi8KICAgICAgcmVnaXN0ZXJIYW5k bGVyczogZnVuY3Rpb24odGFyZ2V0LCBiZWNhbWVJbnZhbGlkLCBiZWNhbWVW YWxpZCkgewogICAgICAgIHRoaXMub24oJ2JlY2FtZUludmFsaWQnLCB0YXJn ZXQsIGJlY2FtZUludmFsaWQpOwogICAgICAgIHRoaXMub24oJ2JlY2FtZVZh bGlkJywgdGFyZ2V0LCBiZWNhbWVWYWxpZCk7CiAgICAgIH0sCgogICAgICAv KioKICAgICAgICBAcHJvcGVydHkgZXJyb3JzQnlBdHRyaWJ1dGVOYW1lCiAg ICAgICAgQHR5cGUge0VtYmVyLk1hcFdpdGhEZWZhdWx0fQogICAgICAgIEBw cml2YXRlCiAgICAgICovCiAgICAgIGVycm9yc0J5QXR0cmlidXRlTmFtZTog RW1iZXIucmVkdWNlQ29tcHV0ZWQoImNvbnRlbnQiLCB7CiAgICAgICAgaW5p dGlhbFZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBFbWJl ci5NYXBXaXRoRGVmYXVsdC5jcmVhdGUoewogICAgICAgICAgICBkZWZhdWx0 VmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHJldHVybiBFbWJl ci5BKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0s CgogICAgICAgIGFkZGVkSXRlbTogZnVuY3Rpb24oZXJyb3JzLCBlcnJvcikg ewogICAgICAgICAgZXJyb3JzLmdldChlcnJvci5hdHRyaWJ1dGUpLnB1c2hP YmplY3QoZXJyb3IpOwoKICAgICAgICAgIHJldHVybiBlcnJvcnM7CiAgICAg ICAgfSwKCiAgICAgICAgcmVtb3ZlZEl0ZW06IGZ1bmN0aW9uKGVycm9ycywg ZXJyb3IpIHsKICAgICAgICAgIGVycm9ycy5nZXQoZXJyb3IuYXR0cmlidXRl KS5yZW1vdmVPYmplY3QoZXJyb3IpOwoKICAgICAgICAgIHJldHVybiBlcnJv cnM7CiAgICAgICAgfQogICAgICB9KSwKCiAgICAgIC8qKgogICAgICAgIFJl dHVybnMgZXJyb3JzIGZvciBhIGdpdmVuIGF0dHJpYnV0ZQoKICAgICAgICBA bWV0aG9kIGVycm9yc0ZvcgogICAgICAgIEBwYXJhbSB7U3RyaW5nfSBhdHRy aWJ1dGUKICAgICAgICBAcmV0dXJucyB7QXJyYXl9CiAgICAgICovCiAgICAg IGVycm9yc0ZvcjogZnVuY3Rpb24oYXR0cmlidXRlKSB7CiAgICAgICAgcmV0 dXJuIGdldCh0aGlzLCAnZXJyb3JzQnlBdHRyaWJ1dGVOYW1lJykuZ2V0KGF0 dHJpYnV0ZSk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgKi8KICAgICAg bWVzc2FnZXM6IEVtYmVyLmNvbXB1dGVkLm1hcEJ5KCdjb250ZW50JywgJ21l c3NhZ2UnKSwKCiAgICAgIC8qKgogICAgICAgIEBwcm9wZXJ0eSBjb250ZW50 CiAgICAgICAgQHR5cGUge0FycmF5fQogICAgICAgIEBwcml2YXRlCiAgICAg ICovCiAgICAgIGNvbnRlbnQ6IEVtYmVyLmNvbXB1dGVkKGZ1bmN0aW9uKCkg ewogICAgICAgIHJldHVybiBFbWJlci5BKCk7CiAgICAgIH0pLAoKICAgICAg LyoqCiAgICAgICAgQG1ldGhvZCB1bmtub3duUHJvcGVydHkKICAgICAgICBA cHJpdmF0ZQogICAgICAqLwogICAgICB1bmtub3duUHJvcGVydHk6IGZ1bmN0 aW9uKGF0dHJpYnV0ZSkgewogICAgICAgIHZhciBlcnJvcnMgPSB0aGlzLmVy cm9yc0ZvcihhdHRyaWJ1dGUpOwogICAgICAgIGlmIChpc0VtcHR5KGVycm9y cykpIHsgcmV0dXJuIG51bGw7IH0KICAgICAgICByZXR1cm4gZXJyb3JzOwog ICAgICB9LAoKICAgICAgLyoqCiAgICAgICAgQG1ldGhvZCBuZXh0T2JqZWN0 CiAgICAgICAgQHByaXZhdGUKICAgICAgKi8KICAgICAgbmV4dE9iamVjdDog ZnVuY3Rpb24oaW5kZXgsIHByZXZpb3VzT2JqZWN0LCBjb250ZXh0KSB7CiAg ICAgICAgcmV0dXJuIGdldCh0aGlzLCAnY29udGVudCcpLm9iamVjdEF0KGlu ZGV4KTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgIFRvdGFsIG51bWJl ciBvZiBlcnJvcnMuCgogICAgICAgIEBwcm9wZXJ0eSBsZW5ndGgKICAgICAg ICBAdHlwZSB7TnVtYmVyfQogICAgICAgIEByZWFkT25seQogICAgICAqLwog ICAgICBsZW5ndGg6IEVtYmVyLmNvbXB1dGVkLm9uZVdheSgnY29udGVudC5s ZW5ndGgnKS5yZWFkT25seSgpLAoKICAgICAgLyoqCiAgICAgICAgQHByb3Bl cnR5IGlzRW1wdHkKICAgICAgICBAdHlwZSB7Qm9vbGVhbn0KICAgICAgICBA cmVhZE9ubHkKICAgICAgKi8KICAgICAgaXNFbXB0eTogRW1iZXIuY29tcHV0 ZWQubm90KCdsZW5ndGgnKS5yZWFkT25seSgpLAoKICAgICAgLyoqCiAgICAg ICAgQWRkcyBlcnJvciBtZXNzYWdlcyB0byBhIGdpdmVuIGF0dHJpYnV0ZSBh bmQgc2VuZHMKICAgICAgICBgYmVjYW1lSW52YWxpZGAgZXZlbnQgdG8gdGhl IHJlY29yZC4KCiAgICAgICAgQG1ldGhvZCBhZGQKICAgICAgICBAcGFyYW0g e1N0cmluZ30gYXR0cmlidXRlCiAgICAgICAgQHBhcmFtIHtBcnJheXxTdHJp bmd9IG1lc3NhZ2VzCiAgICAgICovCiAgICAgIGFkZDogZnVuY3Rpb24oYXR0 cmlidXRlLCBtZXNzYWdlcykgewogICAgICAgIHZhciB3YXNFbXB0eSA9IGdl dCh0aGlzLCAnaXNFbXB0eScpOwoKICAgICAgICBtZXNzYWdlcyA9IHRoaXMu X2ZpbmRPckNyZWF0ZU1lc3NhZ2VzKGF0dHJpYnV0ZSwgbWVzc2FnZXMpOwog ICAgICAgIGdldCh0aGlzLCAnY29udGVudCcpLmFkZE9iamVjdHMobWVzc2Fn ZXMpOwoKICAgICAgICB0aGlzLm5vdGlmeVByb3BlcnR5Q2hhbmdlKGF0dHJp YnV0ZSk7CiAgICAgICAgdGhpcy5lbnVtZXJhYmxlQ29udGVudERpZENoYW5n ZSgpOwoKICAgICAgICBpZiAod2FzRW1wdHkgJiYgIWdldCh0aGlzLCAnaXNF bXB0eScpKSB7CiAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2JlY2FtZUludmFs aWQnKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICBA bWV0aG9kIF9maW5kT3JDcmVhdGVNZXNzYWdlcwogICAgICAgIEBwcml2YXRl CiAgICAgICovCiAgICAgIF9maW5kT3JDcmVhdGVNZXNzYWdlczogZnVuY3Rp b24oYXR0cmlidXRlLCBtZXNzYWdlcykgewogICAgICAgIHZhciBlcnJvcnMg PSB0aGlzLmVycm9yc0ZvcihhdHRyaWJ1dGUpOwoKICAgICAgICByZXR1cm4g RW1iZXIubWFrZUFycmF5KG1lc3NhZ2VzKS5tYXAoZnVuY3Rpb24obWVzc2Fn ZSkgewogICAgICAgICAgcmV0dXJuIGVycm9ycy5maW5kQnkoJ21lc3NhZ2Un LCBtZXNzYWdlKSB8fCB7CiAgICAgICAgICAgIGF0dHJpYnV0ZTogYXR0cmli dXRlLAogICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlCiAgICAgICAgICB9 OwogICAgICAgIH0pOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAgUmVt b3ZlcyBhbGwgZXJyb3IgbWVzc2FnZXMgZnJvbSB0aGUgZ2l2ZW4gYXR0cmli dXRlIGFuZCBzZW5kcwogICAgICAgIGBiZWNhbWVWYWxpZGAgZXZlbnQgdG8g dGhlIHJlY29yZCBpZiB0aGVyZSBubyBtb3JlIGVycm9ycyBsZWZ0LgoKICAg ICAgICBAbWV0aG9kIHJlbW92ZQogICAgICAgIEBwYXJhbSB7U3RyaW5nfSBh dHRyaWJ1dGUKICAgICAgKi8KICAgICAgcmVtb3ZlOiBmdW5jdGlvbihhdHRy aWJ1dGUpIHsKICAgICAgICBpZiAoZ2V0KHRoaXMsICdpc0VtcHR5JykpIHsg cmV0dXJuOyB9CgogICAgICAgIHZhciBjb250ZW50ID0gZ2V0KHRoaXMsICdj b250ZW50JykucmVqZWN0QnkoJ2F0dHJpYnV0ZScsIGF0dHJpYnV0ZSk7CiAg ICAgICAgZ2V0KHRoaXMsICdjb250ZW50Jykuc2V0T2JqZWN0cyhjb250ZW50 KTsKCiAgICAgICAgdGhpcy5ub3RpZnlQcm9wZXJ0eUNoYW5nZShhdHRyaWJ1 dGUpOwogICAgICAgIHRoaXMuZW51bWVyYWJsZUNvbnRlbnREaWRDaGFuZ2Uo KTsKCiAgICAgICAgaWYgKGdldCh0aGlzLCAnaXNFbXB0eScpKSB7CiAgICAg ICAgICB0aGlzLnRyaWdnZXIoJ2JlY2FtZVZhbGlkJyk7CiAgICAgICAgfQog ICAgICB9LAoKICAgICAgLyoqCiAgICAgICAgUmVtb3ZlcyBhbGwgZXJyb3Ig bWVzc2FnZXMgYW5kIHNlbmRzIGBiZWNhbWVWYWxpZGAgZXZlbnQKICAgICAg ICB0byB0aGUgcmVjb3JkLgoKICAgICAgICBAbWV0aG9kIGNsZWFyCiAgICAg ICovCiAgICAgIGNsZWFyOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoZ2V0 KHRoaXMsICdpc0VtcHR5JykpIHsgcmV0dXJuOyB9CgogICAgICAgIGdldCh0 aGlzLCAnY29udGVudCcpLmNsZWFyKCk7CiAgICAgICAgdGhpcy5lbnVtZXJh YmxlQ29udGVudERpZENoYW5nZSgpOwoKICAgICAgICB0aGlzLnRyaWdnZXIo J2JlY2FtZVZhbGlkJyk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICBD aGVja3MgaWYgdGhlcmUgaXMgZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBnaXZl biBhdHRyaWJ1dGUuCgogICAgICAgIEBtZXRob2QgaGFzCiAgICAgICAgQHBh cmFtIHtTdHJpbmd9IGF0dHJpYnV0ZQogICAgICAgIEByZXR1cm5zIHtCb29s ZWFufSB0cnVlIGlmIHRoZXJlIHNvbWUgZXJyb3JzIG9uIGdpdmVuIGF0dHJp YnV0ZQogICAgICAqLwogICAgICBoYXM6IGZ1bmN0aW9uKGF0dHJpYnV0ZSkg ewogICAgICAgIHJldHVybiAhaXNFbXB0eSh0aGlzLmVycm9yc0ZvcihhdHRy aWJ1dGUpKTsKICAgICAgfQogICAgfSk7CgogICAgX19leHBvcnRzX19bImRl ZmF1bHQiXSA9IEVycm9yczsKICB9KTsKZGVmaW5lKCJlbWJlci1kYXRhL2xp Yi9zeXN0ZW0vbW9kZWwvbW9kZWwiLCAKICBbIi4vc3RhdGVzIiwiLi9lcnJv cnMiLCJleHBvcnRzIl0sCiAgZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBf X2RlcGVuZGVuY3kyX18sIF9fZXhwb3J0c19fKSB7CiAgICAidXNlIHN0cmlj dCI7CiAgICB2YXIgUm9vdFN0YXRlID0gX19kZXBlbmRlbmN5MV9fWyJkZWZh dWx0Il07CiAgICB2YXIgRXJyb3JzID0gX19kZXBlbmRlbmN5Ml9fWyJkZWZh dWx0Il07CiAgICAvKioKICAgICAgQG1vZHVsZSBlbWJlci1kYXRhCiAgICAq LwoKICAgIHZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldCwK ICAgICAgICBtZXJnZSA9IEVtYmVyLm1lcmdlLAogICAgICAgIFByb21pc2Ug PSBFbWJlci5SU1ZQLlByb21pc2U7CgogICAgdmFyIHJldHJpZXZlRnJvbUN1 cnJlbnRTdGF0ZSA9IEVtYmVyLmNvbXB1dGVkKCdjdXJyZW50U3RhdGUnLCBm dW5jdGlvbihrZXksIHZhbHVlKSB7CiAgICAgIHJldHVybiBnZXQoZ2V0KHRo aXMsICdjdXJyZW50U3RhdGUnKSwga2V5KTsKICAgIH0pLnJlYWRPbmx5KCk7 CgogICAgLyoqCgogICAgICBUaGUgbW9kZWwgY2xhc3MgdGhhdCBhbGwgRW1i ZXIgRGF0YSByZWNvcmRzIGRlc2NlbmQgZnJvbS4KCiAgICAgIEBjbGFzcyBN b2RlbAogICAgICBAbmFtZXNwYWNlIERTCiAgICAgIEBleHRlbmRzIEVtYmVy Lk9iamVjdAogICAgICBAdXNlcyBFbWJlci5FdmVudGVkCiAgICAqLwogICAg dmFyIE1vZGVsID0gRW1iZXIuT2JqZWN0LmV4dGVuZChFbWJlci5FdmVudGVk LCB7CiAgICAgIF9yZWNvcmRBcnJheXM6IHVuZGVmaW5lZCwKICAgICAgX3Jl bGF0aW9uc2hpcHM6IHVuZGVmaW5lZCwKICAgICAgX2xvYWRpbmdSZWNvcmRB cnJheXM6IHVuZGVmaW5lZCwKICAgICAgLyoqCiAgICAgICAgSWYgdGhpcyBw cm9wZXJ0eSBpcyBgdHJ1ZWAgdGhlIHJlY29yZCBpcyBpbiB0aGUgYGVtcHR5 YAogICAgICAgIHN0YXRlLiBFbXB0eSBpcyB0aGUgZmlyc3Qgc3RhdGUgYWxs IHJlY29yZHMgZW50ZXIgYWZ0ZXIgdGhleSBoYXZlCiAgICAgICAgYmVlbiBj cmVhdGVkLiBNb3N0IHJlY29yZHMgY3JlYXRlZCBieSB0aGUgc3RvcmUgd2ls bCBxdWlja2x5CiAgICAgICAgdHJhbnNpdGlvbiB0byB0aGUgYGxvYWRpbmdg IHN0YXRlIGlmIGRhdGEgbmVlZHMgdG8gYmUgZmV0Y2hlZCBmcm9tCiAgICAg ICAgdGhlIHNlcnZlciBvciB0aGUgYGNyZWF0ZWRgIHN0YXRlIGlmIHRoZSBy ZWNvcmQgaXMgY3JlYXRlZCBvbiB0aGUKICAgICAgICBjbGllbnQuIEEgcmVj b3JkIGNhbiBhbHNvIGVudGVyIHRoZSBlbXB0eSBzdGF0ZSBpZiB0aGUgYWRh cHRlciBpcwogICAgICAgIHVuYWJsZSB0byBsb2NhdGUgdGhlIHJlY29yZC4K CiAgICAgICAgQHByb3BlcnR5IGlzRW1wdHkKICAgICAgICBAdHlwZSB7Qm9v bGVhbn0KICAgICAgICBAcmVhZE9ubHkKICAgICAgKi8KICAgICAgaXNFbXB0 eTogcmV0cmlldmVGcm9tQ3VycmVudFN0YXRlLAogICAgICAvKioKICAgICAg ICBJZiB0aGlzIHByb3BlcnR5IGlzIGB0cnVlYCB0aGUgcmVjb3JkIGlzIGlu IHRoZSBgbG9hZGluZ2Agc3RhdGUuIEEKICAgICAgICByZWNvcmQgZW50ZXJz IHRoaXMgc3RhdGUgd2hlbiB0aGUgc3RvcmUgYXNrcyB0aGUgYWRhcHRlciBm b3IgaXRzCiAgICAgICAgZGF0YS4gSXQgcmVtYWlucyBpbiB0aGlzIHN0YXRl IHVudGlsIHRoZSBhZGFwdGVyIHByb3ZpZGVzIHRoZQogICAgICAgIHJlcXVl c3RlZCBkYXRhLgoKICAgICAgICBAcHJvcGVydHkgaXNMb2FkaW5nCiAgICAg ICAgQHR5cGUge0Jvb2xlYW59CiAgICAgICAgQHJlYWRPbmx5CiAgICAgICov CiAgICAgIGlzTG9hZGluZzogcmV0cmlldmVGcm9tQ3VycmVudFN0YXRlLAog ICAgICAvKioKICAgICAgICBJZiB0aGlzIHByb3BlcnR5IGlzIGB0cnVlYCB0 aGUgcmVjb3JkIGlzIGluIHRoZSBgbG9hZGVkYCBzdGF0ZS4gQQogICAgICAg IHJlY29yZCBlbnRlcnMgdGhpcyBzdGF0ZSB3aGVuIGl0cyBkYXRhIGlzIHBv cHVsYXRlZC4gTW9zdCBvZiBhCiAgICAgICAgcmVjb3JkJ3MgbGlmZWN5Y2xl IGlzIHNwZW50IGluc2lkZSBzdWJzdGF0ZXMgb2YgdGhlIGBsb2FkZWRgCiAg ICAgICAgc3RhdGUuCgogICAgICAgIEV4YW1wbGUKCiAgICAgICAgYGBgamF2 YXNjcmlwdAogICAgICAgIHZhciByZWNvcmQgPSBzdG9yZS5jcmVhdGVSZWNv cmQoQXBwLk1vZGVsKTsKICAgICAgICByZWNvcmQuZ2V0KCdpc0xvYWRlZCcp OyAvLyB0cnVlCgogICAgICAgIHN0b3JlLmZpbmQoJ21vZGVsJywgMSkudGhl bihmdW5jdGlvbihtb2RlbCkgewogICAgICAgICAgbW9kZWwuZ2V0KCdpc0xv YWRlZCcpOyAvLyB0cnVlCiAgICAgICAgfSk7CiAgICAgICAgYGBgCgogICAg ICAgIEBwcm9wZXJ0eSBpc0xvYWRlZAogICAgICAgIEB0eXBlIHtCb29sZWFu fQogICAgICAgIEByZWFkT25seQogICAgICAqLwogICAgICBpc0xvYWRlZDog cmV0cmlldmVGcm9tQ3VycmVudFN0YXRlLAogICAgICAvKioKICAgICAgICBJ ZiB0aGlzIHByb3BlcnR5IGlzIGB0cnVlYCB0aGUgcmVjb3JkIGlzIGluIHRo ZSBgZGlydHlgIHN0YXRlLiBUaGUKICAgICAgICByZWNvcmQgaGFzIGxvY2Fs IGNoYW5nZXMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBzYXZlZCBieSB0aGUK ICAgICAgICBhZGFwdGVyLiBUaGlzIGluY2x1ZGVzIHJlY29yZHMgdGhhdCBo YXZlIGJlZW4gY3JlYXRlZCAoYnV0IG5vdCB5ZXQKICAgICAgICBzYXZlZCkg b3IgZGVsZXRlZC4KCiAgICAgICAgRXhhbXBsZQoKICAgICAgICBgYGBqYXZh c2NyaXB0CiAgICAgICAgdmFyIHJlY29yZCA9IHN0b3JlLmNyZWF0ZVJlY29y ZChBcHAuTW9kZWwpOwogICAgICAgIHJlY29yZC5nZXQoJ2lzRGlydHknKTsg Ly8gdHJ1ZQoKICAgICAgICBzdG9yZS5maW5kKCdtb2RlbCcsIDEpLnRoZW4o ZnVuY3Rpb24obW9kZWwpIHsKICAgICAgICAgIG1vZGVsLmdldCgnaXNEaXJ0 eScpOyAvLyBmYWxzZQogICAgICAgICAgbW9kZWwuc2V0KCdmb28nLCAnc29t ZSB2YWx1ZScpOwogICAgICAgICAgbW9kZWwuc2V0KCdpc0RpcnR5Jyk7IC8v IHRydWUKICAgICAgICB9KTsKICAgICAgICBgYGAKCiAgICAgICAgQHByb3Bl cnR5IGlzRGlydHkKICAgICAgICBAdHlwZSB7Qm9vbGVhbn0KICAgICAgICBA cmVhZE9ubHkKICAgICAgKi8KICAgICAgaXNEaXJ0eTogcmV0cmlldmVGcm9t Q3VycmVudFN0YXRlLAogICAgICAvKioKICAgICAgICBJZiB0aGlzIHByb3Bl cnR5IGlzIGB0cnVlYCB0aGUgcmVjb3JkIGlzIGluIHRoZSBgc2F2aW5nYCBz dGF0ZS4gQQogICAgICAgIHJlY29yZCBlbnRlcnMgdGhlIHNhdmluZyBzdGF0 ZSB3aGVuIGBzYXZlYCBpcyBjYWxsZWQsIGJ1dCB0aGUKICAgICAgICBhZGFw dGVyIGhhcyBub3QgeWV0IGFja25vd2xlZGdlZCB0aGF0IHRoZSBjaGFuZ2Vz IGhhdmUgYmVlbgogICAgICAgIHBlcnNpc3RlZCB0byB0aGUgYmFja2VuZC4K CiAgICAgICAgRXhhbXBsZQoKICAgICAgICBgYGBqYXZhc2NyaXB0CiAgICAg ICAgdmFyIHJlY29yZCA9IHN0b3JlLmNyZWF0ZVJlY29yZChBcHAuTW9kZWwp OwogICAgICAgIHJlY29yZC5nZXQoJ2lzU2F2aW5nJyk7IC8vIGZhbHNlCiAg ICAgICAgdmFyIHByb21pc2UgPSByZWNvcmQuc2F2ZSgpOwogICAgICAgIHJl Y29yZC5nZXQoJ2lzU2F2aW5nJyk7IC8vIHRydWUKICAgICAgICBwcm9taXNl LnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgICByZWNvcmQuZ2V0KCdpc1Nh dmluZycpOyAvLyBmYWxzZQogICAgICAgIH0pOwogICAgICAgIGBgYAoKICAg ICAgICBAcHJvcGVydHkgaXNTYXZpbmcKICAgICAgICBAdHlwZSB7Qm9vbGVh bn0KICAgICAgICBAcmVhZE9ubHkKICAgICAgKi8KICAgICAgaXNTYXZpbmc6 IHJldHJpZXZlRnJvbUN1cnJlbnRTdGF0ZSwKICAgICAgLyoqCiAgICAgICAg SWYgdGhpcyBwcm9wZXJ0eSBpcyBgdHJ1ZWAgdGhlIHJlY29yZCBpcyBpbiB0 aGUgYGRlbGV0ZWRgIHN0YXRlCiAgICAgICAgYW5kIGhhcyBiZWVuIG1hcmtl ZCBmb3IgZGVsZXRpb24uIFdoZW4gYGlzRGVsZXRlZGAgaXMgdHJ1ZSBhbmQK ICAgICAgICBgaXNEaXJ0eWAgaXMgdHJ1ZSwgdGhlIHJlY29yZCBpcyBkZWxl dGVkIGxvY2FsbHkgYnV0IHRoZSBkZWxldGlvbgogICAgICAgIHdhcyBub3Qg eWV0IHBlcnNpc3RlZC4gV2hlbiBgaXNTYXZpbmdgIGlzIHRydWUsIHRoZSBj aGFuZ2UgaXMKICAgICAgICBpbi1mbGlnaHQuIFdoZW4gYm90aCBgaXNEaXJ0 eWAgYW5kIGBpc1NhdmluZ2AgYXJlIGZhbHNlLCB0aGUKICAgICAgICBjaGFu Z2UgaGFzIHBlcnNpc3RlZC4KCiAgICAgICAgRXhhbXBsZQoKICAgICAgICBg YGBqYXZhc2NyaXB0CiAgICAgICAgdmFyIHJlY29yZCA9IHN0b3JlLmNyZWF0 ZVJlY29yZChBcHAuTW9kZWwpOwogICAgICAgIHJlY29yZC5nZXQoJ2lzRGVs ZXRlZCcpOyAvLyBmYWxzZQogICAgICAgIHJlY29yZC5kZWxldGVSZWNvcmQo KTsKICAgICAgICByZWNvcmQuZ2V0KCdpc0RlbGV0ZWQnKTsgLy8gdHJ1ZQog ICAgICAgIGBgYAoKICAgICAgICBAcHJvcGVydHkgaXNEZWxldGVkCiAgICAg ICAgQHR5cGUge0Jvb2xlYW59CiAgICAgICAgQHJlYWRPbmx5CiAgICAgICov CiAgICAgIGlzRGVsZXRlZDogcmV0cmlldmVGcm9tQ3VycmVudFN0YXRlLAog ICAgICAvKioKICAgICAgICBJZiB0aGlzIHByb3BlcnR5IGlzIGB0cnVlYCB0 aGUgcmVjb3JkIGlzIGluIHRoZSBgbmV3YCBzdGF0ZS4gQQogICAgICAgIHJl Y29yZCB3aWxsIGJlIGluIHRoZSBgbmV3YCBzdGF0ZSB3aGVuIGl0IGhhcyBi ZWVuIGNyZWF0ZWQgb24gdGhlCiAgICAgICAgY2xpZW50IGFuZCB0aGUgYWRh cHRlciBoYXMgbm90IHlldCByZXBvcnQgdGhhdCBpdCB3YXMgc3VjY2Vzc2Z1 bGx5CiAgICAgICAgc2F2ZWQuCgogICAgICAgIEV4YW1wbGUKCiAgICAgICAg YGBgamF2YXNjcmlwdAogICAgICAgIHZhciByZWNvcmQgPSBzdG9yZS5jcmVh dGVSZWNvcmQoQXBwLk1vZGVsKTsKICAgICAgICByZWNvcmQuZ2V0KCdpc05l dycpOyAvLyB0cnVlCgogICAgICAgIHJlY29yZC5zYXZlKCkudGhlbihmdW5j dGlvbihtb2RlbCkgewogICAgICAgICAgbW9kZWwuZ2V0KCdpc05ldycpOyAv LyBmYWxzZQogICAgICAgIH0pOwogICAgICAgIGBgYAoKICAgICAgICBAcHJv cGVydHkgaXNOZXcKICAgICAgICBAdHlwZSB7Qm9vbGVhbn0KICAgICAgICBA cmVhZE9ubHkKICAgICAgKi8KICAgICAgaXNOZXc6IHJldHJpZXZlRnJvbUN1 cnJlbnRTdGF0ZSwKICAgICAgLyoqCiAgICAgICAgSWYgdGhpcyBwcm9wZXJ0 eSBpcyBgdHJ1ZWAgdGhlIHJlY29yZCBpcyBpbiB0aGUgYHZhbGlkYCBzdGF0 ZS4gQQogICAgICAgIHJlY29yZCB3aWxsIGJlIGluIHRoZSBgdmFsaWRgIHN0 YXRlIHdoZW4gbm8gY2xpZW50LXNpZGUKICAgICAgICB2YWxpZGF0aW9ucyBo YXZlIGZhaWxlZCBhbmQgdGhlIGFkYXB0ZXIgZGlkIG5vdCByZXBvcnQgYW55 CiAgICAgICAgc2VydmVyLXNpZGUgdmFsaWRhdGlvbiBmYWlsdXJlcy4KCiAg ICAgICAgQHByb3BlcnR5IGlzVmFsaWQKICAgICAgICBAdHlwZSB7Qm9vbGVh bn0KICAgICAgICBAcmVhZE9ubHkKICAgICAgKi8KICAgICAgaXNWYWxpZDog cmV0cmlldmVGcm9tQ3VycmVudFN0YXRlLAogICAgICAvKioKICAgICAgICBJ ZiB0aGUgcmVjb3JkIGlzIGluIHRoZSBkaXJ0eSBzdGF0ZSB0aGlzIHByb3Bl cnR5IHdpbGwgcmVwb3J0IHdoYXQKICAgICAgICBraW5kIG9mIGNoYW5nZSBo YXMgY2F1c2VkIGl0IHRvIG1vdmUgaW50byB0aGUgZGlydHkKICAgICAgICBz dGF0ZS4gUG9zc2libGUgdmFsdWVzIGFyZToKCiAgICAgICAgLSBgY3JlYXRl ZGAgVGhlIHJlY29yZCBoYXMgYmVlbiBjcmVhdGVkIGJ5IHRoZSBjbGllbnQg YW5kIG5vdCB5ZXQgc2F2ZWQgdG8gdGhlIGFkYXB0ZXIuCiAgICAgICAgLSBg dXBkYXRlZGAgVGhlIHJlY29yZCBoYXMgYmVlbiB1cGRhdGVkIGJ5IHRoZSBj bGllbnQgYW5kIG5vdCB5ZXQgc2F2ZWQgdG8gdGhlIGFkYXB0ZXIuCiAgICAg ICAgLSBgZGVsZXRlZGAgVGhlIHJlY29yZCBoYXMgYmVlbiBkZWxldGVkIGJ5 IHRoZSBjbGllbnQgYW5kIG5vdCB5ZXQgc2F2ZWQgdG8gdGhlIGFkYXB0ZXIu CgogICAgICAgIEV4YW1wbGUKCiAgICAgICAgYGBgamF2YXNjcmlwdAogICAg ICAgIHZhciByZWNvcmQgPSBzdG9yZS5jcmVhdGVSZWNvcmQoQXBwLk1vZGVs KTsKICAgICAgICByZWNvcmQuZ2V0KCdkaXJ0eVR5cGUnKTsgLy8gJ2NyZWF0 ZWQnCiAgICAgICAgYGBgCgogICAgICAgIEBwcm9wZXJ0eSBkaXJ0eVR5cGUK ICAgICAgICBAdHlwZSB7U3RyaW5nfQogICAgICAgIEByZWFkT25seQogICAg ICAqLwogICAgICBkaXJ0eVR5cGU6IHJldHJpZXZlRnJvbUN1cnJlbnRTdGF0 ZSwKCiAgICAgIC8qKgogICAgICAgIElmIGB0cnVlYCB0aGUgYWRhcHRlciBy ZXBvcnRlZCB0aGF0IGl0IHdhcyB1bmFibGUgdG8gc2F2ZSBsb2NhbAogICAg ICAgIGNoYW5nZXMgdG8gdGhlIGJhY2tlbmQuIFRoaXMgbWF5IGFsc28gcmVz dWx0IGluIHRoZSByZWNvcmQgaGF2aW5nCiAgICAgICAgaXRzIGBpc1ZhbGlk YCBwcm9wZXJ0eSBiZWNvbWUgZmFsc2UgaWYgdGhlIGFkYXB0ZXIgcmVwb3J0 ZWQgdGhhdAogICAgICAgIHNlcnZlci1zaWRlIHZhbGlkYXRpb25zIGZhaWxl ZC4KCiAgICAgICAgRXhhbXBsZQoKICAgICAgICBgYGBqYXZhc2NyaXB0CiAg ICAgICAgcmVjb3JkLmdldCgnaXNFcnJvcicpOyAvLyBmYWxzZQogICAgICAg IHJlY29yZC5zZXQoJ2ZvbycsICdpbnZhbGlkIHZhbHVlJyk7CiAgICAgICAg cmVjb3JkLnNhdmUoKS50aGVuKG51bGwsIGZ1bmN0aW9uKCkgewogICAgICAg ICAgcmVjb3JkLmdldCgnaXNFcnJvcicpOyAvLyB0cnVlCiAgICAgICAgfSk7 CiAgICAgICAgYGBgCgogICAgICAgIEBwcm9wZXJ0eSBpc0Vycm9yCiAgICAg ICAgQHR5cGUge0Jvb2xlYW59CiAgICAgICAgQHJlYWRPbmx5CiAgICAgICov CiAgICAgIGlzRXJyb3I6IGZhbHNlLAogICAgICAvKioKICAgICAgICBJZiBg dHJ1ZWAgdGhlIHN0b3JlIGlzIGF0dGVtcHRpbmcgdG8gcmVsb2FkIHRoZSBy ZWNvcmQgZm9ybSB0aGUgYWRhcHRlci4KCiAgICAgICAgRXhhbXBsZQoKICAg ICAgICBgYGBqYXZhc2NyaXB0CiAgICAgICAgcmVjb3JkLmdldCgnaXNSZWxv YWRpbmcnKTsgLy8gZmFsc2UKICAgICAgICByZWNvcmQucmVsb2FkKCk7CiAg ICAgICAgcmVjb3JkLmdldCgnaXNSZWxvYWRpbmcnKTsgLy8gdHJ1ZQogICAg ICAgIGBgYAoKICAgICAgICBAcHJvcGVydHkgaXNSZWxvYWRpbmcKICAgICAg ICBAdHlwZSB7Qm9vbGVhbn0KICAgICAgICBAcmVhZE9ubHkKICAgICAgKi8K ICAgICAgaXNSZWxvYWRpbmc6IGZhbHNlLAoKICAgICAgLyoqCiAgICAgICAg VGhlIGBjbGllbnRJZGAgcHJvcGVydHkgaXMgYSB0cmFuc2llbnQgbnVtZXJp Y2FsIGlkZW50aWZpZXIKICAgICAgICBnZW5lcmF0ZWQgYXQgcnVudGltZSBi eSB0aGUgZGF0YSBzdG9yZS4gSXQgaXMgaW1wb3J0YW50CiAgICAgICAgcHJp bWFyaWx5IGJlY2F1c2UgbmV3bHkgY3JlYXRlZCBvYmplY3RzIG1heSBub3Qg eWV0IGhhdmUgYW4KICAgICAgICBleHRlcm5hbGx5IGdlbmVyYXRlZCBpZC4K CiAgICAgICAgQHByb3BlcnR5IGNsaWVudElkCiAgICAgICAgQHByaXZhdGUK ICAgICAgICBAdHlwZSB7TnVtYmVyfFN0cmluZ30KICAgICAgKi8KICAgICAg Y2xpZW50SWQ6IG51bGwsCiAgICAgIC8qKgogICAgICAgIEFsbCBlbWJlciBt b2RlbHMgaGF2ZSBhbiBpZCBwcm9wZXJ0eS4gVGhpcyBpcyBhbiBpZGVudGlm aWVyCiAgICAgICAgbWFuYWdlZCBieSBhbiBleHRlcm5hbCBzb3VyY2UuIFRo ZXNlIGFyZSBhbHdheXMgY29lcmNlZCB0byBiZQogICAgICAgIHN0cmluZ3Mg YmVmb3JlIGJlaW5nIHVzZWQgaW50ZXJuYWxseS4gTm90ZSB3aGVuIGRlY2xh cmluZyB0aGUKICAgICAgICBhdHRyaWJ1dGVzIGZvciBhIG1vZGVsIGl0IGlz IGFuIGVycm9yIHRvIGRlY2xhcmUgYW4gaWQKICAgICAgICBhdHRyaWJ1dGUu CgogICAgICAgIGBgYGphdmFzY3JpcHQKICAgICAgICB2YXIgcmVjb3JkID0g c3RvcmUuY3JlYXRlUmVjb3JkKEFwcC5Nb2RlbCk7CiAgICAgICAgcmVjb3Jk LmdldCgnaWQnKTsgLy8gbnVsbAoKICAgICAgICBzdG9yZS5maW5kKCdtb2Rl bCcsIDEpLnRoZW4oZnVuY3Rpb24obW9kZWwpIHsKICAgICAgICAgIG1vZGVs LmdldCgnaWQnKTsgLy8gJzEnCiAgICAgICAgfSk7CiAgICAgICAgYGBgCgog ICAgICAgIEBwcm9wZXJ0eSBpZAogICAgICAgIEB0eXBlIHtTdHJpbmd9CiAg ICAgICovCiAgICAgIGlkOiBudWxsLAoKICAgICAgLyoqCiAgICAgICAgQHBy b3BlcnR5IGN1cnJlbnRTdGF0ZQogICAgICAgIEBwcml2YXRlCiAgICAgICAg QHR5cGUge09iamVjdH0KICAgICAgKi8KICAgICAgY3VycmVudFN0YXRlOiBS b290U3RhdGUuZW1wdHksCgogICAgICAvKioKICAgICAgICBXaGVuIHRoZSBy ZWNvcmQgaXMgaW4gdGhlIGBpbnZhbGlkYCBzdGF0ZSB0aGlzIG9iamVjdCB3 aWxsIGNvbnRhaW4KICAgICAgICBhbnkgZXJyb3JzIHJldHVybmVkIGJ5IHRo ZSBhZGFwdGVyLiBXaGVuIHByZXNlbnQgdGhlIGVycm9ycyBoYXNoCiAgICAg ICAgdHlwaWNhbGx5IGNvbnRhaW5zIGtleXMgY29ycmVzcG9uZGluZyB0byB0 aGUgaW52YWxpZCBwcm9wZXJ0eSBuYW1lcwogICAgICAgIGFuZCB2YWx1ZXMg d2hpY2ggYXJlIGFuIGFycmF5IG9mIGVycm9yIG1lc3NhZ2VzLgoKICAgICAg ICBgYGBqYXZhc2NyaXB0CiAgICAgICAgcmVjb3JkLmdldCgnZXJyb3JzLmxl bmd0aCcpOyAvLyAwCiAgICAgICAgcmVjb3JkLnNldCgnZm9vJywgJ2ludmFs aWQgdmFsdWUnKTsKICAgICAgICByZWNvcmQuc2F2ZSgpLnRoZW4obnVsbCwg ZnVuY3Rpb24oKSB7CiAgICAgICAgICByZWNvcmQuZ2V0KCdlcnJvcnMnKS5n ZXQoJ2ZvbycpOyAvLyBbJ2ZvbyBzaG91bGQgYmUgYSBudW1iZXIuJ10KICAg ICAgICB9KTsKICAgICAgICBgYGAKCiAgICAgICAgQHByb3BlcnR5IGVycm9y cwogICAgICAgIEB0eXBlIHtPYmplY3R9CiAgICAgICovCiAgICAgIGVycm9y czogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGVy cm9ycyA9IEVycm9ycy5jcmVhdGUoKTsKCiAgICAgICAgZXJyb3JzLnJlZ2lz dGVySGFuZGxlcnModGhpcywgZnVuY3Rpb24oKSB7CiAgICAgICAgICB0aGlz LnNlbmQoJ2JlY2FtZUludmFsaWQnKTsKICAgICAgICB9LCBmdW5jdGlvbigp IHsKICAgICAgICAgIHRoaXMuc2VuZCgnYmVjYW1lVmFsaWQnKTsKICAgICAg ICB9KTsKCiAgICAgICAgcmV0dXJuIGVycm9yczsKICAgICAgfSkucmVhZE9u bHkoKSwKCiAgICAgIC8qKgogICAgICAgIENyZWF0ZSBhIEpTT04gcmVwcmVz ZW50YXRpb24gb2YgdGhlIHJlY29yZCwgdXNpbmcgdGhlIHNlcmlhbGl6YXRp b24KICAgICAgICBzdHJhdGVneSBvZiB0aGUgc3RvcmUncyBhZGFwdGVyLgoK ICAgICAgIGBzZXJpYWxpemVgIHRha2VzIGFuIG9wdGlvbmFsIGhhc2ggYXMg YSBwYXJhbWV0ZXIsIGN1cnJlbnRseQogICAgICAgIHN1cHBvcnRlZCBvcHRp b25zIGFyZToKCiAgICAgICAtIGBpbmNsdWRlSWRgOiBgdHJ1ZWAgaWYgdGhl IHJlY29yZCdzIElEIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUKICAgICAg ICAgIEpTT04gcmVwcmVzZW50YXRpb24uCgogICAgICAgIEBtZXRob2Qgc2Vy aWFsaXplCiAgICAgICAgQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKICAgICAg ICBAcmV0dXJucyB7T2JqZWN0fSBhbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGFy ZSBwcmltaXRpdmUgSlNPTiB2YWx1ZXMgb25seQogICAgICAqLwogICAgICBz ZXJpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgICB2YXIgc3Rv cmUgPSBnZXQodGhpcywgJ3N0b3JlJyk7CiAgICAgICAgcmV0dXJuIHN0b3Jl LnNlcmlhbGl6ZSh0aGlzLCBvcHRpb25zKTsKICAgICAgfSwKCiAgICAgIC8q KgogICAgICAgIFVzZSBbRFMuSlNPTlNlcmlhbGl6ZXJdKERTLkpTT05TZXJp YWxpemVyLmh0bWwpIHRvCiAgICAgICAgZ2V0IHRoZSBKU09OIHJlcHJlc2Vu dGF0aW9uIG9mIGEgcmVjb3JkLgoKICAgICAgICBgdG9KU09OYCB0YWtlcyBh biBvcHRpb25hbCBoYXNoIGFzIGEgcGFyYW1ldGVyLCBjdXJyZW50bHkKICAg ICAgICBzdXBwb3J0ZWQgb3B0aW9ucyBhcmU6CgogICAgICAgIC0gYGluY2x1 ZGVJZGA6IGB0cnVlYCBpZiB0aGUgcmVjb3JkJ3MgSUQgc2hvdWxkIGJlIGlu Y2x1ZGVkIGluIHRoZQogICAgICAgICAgSlNPTiByZXByZXNlbnRhdGlvbi4K CiAgICAgICAgQG1ldGhvZCB0b0pTT04KICAgICAgICBAcGFyYW0ge09iamVj dH0gb3B0aW9ucwogICAgICAgIEByZXR1cm5zIHtPYmplY3R9IEEgSlNPTiBy ZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LgogICAgICAqLwogICAgICB0 b0pTT046IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgICAvLyBjb250YWlu ZXIgaXMgZm9yIGxhenkgdHJhbnNmb3JtIGxvb2t1cHMKICAgICAgICB2YXIg c2VyaWFsaXplciA9IERTLkpTT05TZXJpYWxpemVyLmNyZWF0ZSh7IGNvbnRh aW5lcjogdGhpcy5jb250YWluZXIgfSk7CiAgICAgICAgcmV0dXJuIHNlcmlh bGl6ZXIuc2VyaWFsaXplKHRoaXMsIG9wdGlvbnMpOwogICAgICB9LAoKICAg ICAgLyoqCiAgICAgICAgRmlyZWQgd2hlbiB0aGUgcmVjb3JkIGlzIGxvYWRl ZCBmcm9tIHRoZSBzZXJ2ZXIuCgogICAgICAgIEBldmVudCBkaWRMb2FkCiAg ICAgICovCiAgICAgIGRpZExvYWQ6IEVtYmVyLkssCgogICAgICAvKioKICAg ICAgICBGaXJlZCB3aGVuIHRoZSByZWNvcmQgaXMgdXBkYXRlZC4KCiAgICAg ICAgQGV2ZW50IGRpZFVwZGF0ZQogICAgICAqLwogICAgICBkaWRVcGRhdGU6 IEVtYmVyLkssCgogICAgICAvKioKICAgICAgICBGaXJlZCB3aGVuIHRoZSBy ZWNvcmQgaXMgY3JlYXRlZC4KCiAgICAgICAgQGV2ZW50IGRpZENyZWF0ZQog ICAgICAqLwogICAgICBkaWRDcmVhdGU6IEVtYmVyLkssCgogICAgICAvKioK ICAgICAgICBGaXJlZCB3aGVuIHRoZSByZWNvcmQgaXMgZGVsZXRlZC4KCiAg ICAgICAgQGV2ZW50IGRpZERlbGV0ZQogICAgICAqLwogICAgICBkaWREZWxl dGU6IEVtYmVyLkssCgogICAgICAvKioKICAgICAgICBGaXJlZCB3aGVuIHRo ZSByZWNvcmQgYmVjb21lcyBpbnZhbGlkLgoKICAgICAgICBAZXZlbnQgYmVj YW1lSW52YWxpZAogICAgICAqLwogICAgICBiZWNhbWVJbnZhbGlkOiBFbWJl ci5LLAoKICAgICAgLyoqCiAgICAgICAgRmlyZWQgd2hlbiB0aGUgcmVjb3Jk IGVudGVycyB0aGUgZXJyb3Igc3RhdGUuCgogICAgICAgIEBldmVudCBiZWNh bWVFcnJvcgogICAgICAqLwogICAgICBiZWNhbWVFcnJvcjogRW1iZXIuSywK CiAgICAgIC8qKgogICAgICAgIEBwcm9wZXJ0eSBkYXRhCiAgICAgICAgQHBy aXZhdGUKICAgICAgICBAdHlwZSB7T2JqZWN0fQogICAgICAqLwogICAgICBk YXRhOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKICAgICAgICB0aGlz Ll9kYXRhID0gdGhpcy5fZGF0YSB8fCB7fTsKICAgICAgICByZXR1cm4gdGhp cy5fZGF0YTsKICAgICAgfSkucmVhZE9ubHkoKSwKCiAgICAgIF9kYXRhOiBu dWxsLAoKICAgICAgaW5pdDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5f c3VwZXIoKTsKICAgICAgICB0aGlzLl9zZXR1cCgpOwogICAgICB9LAoKICAg ICAgX3NldHVwOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9jaGFuZ2Vz VG9TeW5jID0ge307CiAgICAgICAgdGhpcy5fZGVmZXJyZWRUcmlnZ2VycyA9 IFtdOwogICAgICAgIHRoaXMuX2RhdGEgPSB7fTsKICAgICAgICB0aGlzLl9h dHRyaWJ1dGVzID0ge307CiAgICAgICAgdGhpcy5faW5GbGlnaHRBdHRyaWJ1 dGVzID0ge307CiAgICAgICAgdGhpcy5fcmVsYXRpb25zaGlwcyA9IHt9Owog ICAgICB9LAoKICAgICAgLyoqCiAgICAgICAgQG1ldGhvZCBzZW5kCiAgICAg ICAgQHByaXZhdGUKICAgICAgICBAcGFyYW0ge1N0cmluZ30gbmFtZQogICAg ICAgIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0CiAgICAgICovCiAgICAgIHNl bmQ6IGZ1bmN0aW9uKG5hbWUsIGNvbnRleHQpIHsKICAgICAgICB2YXIgY3Vy cmVudFN0YXRlID0gZ2V0KHRoaXMsICdjdXJyZW50U3RhdGUnKTsKCiAgICAg ICAgaWYgKCFjdXJyZW50U3RhdGVbbmFtZV0pIHsKICAgICAgICAgIHRoaXMu X3VuaGFuZGxlZEV2ZW50KGN1cnJlbnRTdGF0ZSwgbmFtZSwgY29udGV4dCk7 CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gY3VycmVudFN0YXRlW25hbWVd KHRoaXMsIGNvbnRleHQpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAg QG1ldGhvZCB0cmFuc2l0aW9uVG8KICAgICAgICBAcHJpdmF0ZQogICAgICAg IEBwYXJhbSB7U3RyaW5nfSBuYW1lCiAgICAgICovCiAgICAgIHRyYW5zaXRp b25UbzogZnVuY3Rpb24obmFtZSkgewogICAgICAgIC8vIFBPU1NJQkxFIFRP RE86IFJlbW92ZSB0aGlzIGNvZGUgYW5kIHJlcGxhY2Ugd2l0aAogICAgICAg IC8vIGFsd2F5cyBoYXZpbmcgZGlyZWN0IHJlZmVyZW5jZXMgdG8gc3RhdGUg b2JqZWN0cwoKICAgICAgICB2YXIgcGl2b3ROYW1lID0gbmFtZS5zcGxpdCgi LiIsIDEpLAogICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBnZXQodGhpcywg J2N1cnJlbnRTdGF0ZScpLAogICAgICAgICAgICBzdGF0ZSA9IGN1cnJlbnRT dGF0ZTsKCiAgICAgICAgZG8gewogICAgICAgICAgaWYgKHN0YXRlLmV4aXQp IHsgc3RhdGUuZXhpdCh0aGlzKTsgfQogICAgICAgICAgc3RhdGUgPSBzdGF0 ZS5wYXJlbnRTdGF0ZTsKICAgICAgICB9IHdoaWxlICghc3RhdGUuaGFzT3du UHJvcGVydHkocGl2b3ROYW1lKSk7CgogICAgICAgIHZhciBwYXRoID0gbmFt ZS5zcGxpdCgiLiIpOwoKICAgICAgICB2YXIgc2V0dXBzID0gW10sIGVudGVy cyA9IFtdLCBpLCBsOwoKICAgICAgICBmb3IgKGk9MCwgbD1wYXRoLmxlbmd0 aDsgaTxsOyBpKyspIHsKICAgICAgICAgIHN0YXRlID0gc3RhdGVbcGF0aFtp XV07CgogICAgICAgICAgaWYgKHN0YXRlLmVudGVyKSB7IGVudGVycy5wdXNo KHN0YXRlKTsgfQogICAgICAgICAgaWYgKHN0YXRlLnNldHVwKSB7IHNldHVw cy5wdXNoKHN0YXRlKTsgfQogICAgICAgIH0KCiAgICAgICAgZm9yIChpPTAs IGw9ZW50ZXJzLmxlbmd0aDsgaTxsOyBpKyspIHsKICAgICAgICAgIGVudGVy c1tpXS5lbnRlcih0aGlzKTsKICAgICAgICB9CgogICAgICAgIHNldCh0aGlz LCAnY3VycmVudFN0YXRlJywgc3RhdGUpOwoKICAgICAgICBmb3IgKGk9MCwg bD1zZXR1cHMubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAgICAgc2V0dXBz W2ldLnNldHVwKHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgdGhpcy51cGRh dGVSZWNvcmRBcnJheXNMYXRlcigpOwogICAgICB9LAoKICAgICAgX3VuaGFu ZGxlZEV2ZW50OiBmdW5jdGlvbihzdGF0ZSwgbmFtZSwgY29udGV4dCkgewog ICAgICAgIHZhciBlcnJvck1lc3NhZ2UgPSAiQXR0ZW1wdGVkIHRvIGhhbmRs ZSBldmVudCBgIiArIG5hbWUgKyAiYCAiOwogICAgICAgIGVycm9yTWVzc2Fn ZSAgICArPSAib24gIiArIFN0cmluZyh0aGlzKSArICIgd2hpbGUgaW4gc3Rh dGUgIjsKICAgICAgICBlcnJvck1lc3NhZ2UgICAgKz0gc3RhdGUuc3RhdGVO YW1lICsgIi4gIjsKCiAgICAgICAgaWYgKGNvbnRleHQgIT09IHVuZGVmaW5l ZCkgewogICAgICAgICAgZXJyb3JNZXNzYWdlICArPSAiQ2FsbGVkIHdpdGgg IiArIEVtYmVyLmluc3BlY3QoY29udGV4dCkgKyAiLiI7CiAgICAgICAgfQoK ICAgICAgICB0aHJvdyBuZXcgRW1iZXIuRXJyb3IoZXJyb3JNZXNzYWdlKTsK ICAgICAgfSwKCiAgICAgIHdpdGhUcmFuc2FjdGlvbjogZnVuY3Rpb24oZm4p IHsKICAgICAgICB2YXIgdHJhbnNhY3Rpb24gPSBnZXQodGhpcywgJ3RyYW5z YWN0aW9uJyk7CiAgICAgICAgaWYgKHRyYW5zYWN0aW9uKSB7IGZuKHRyYW5z YWN0aW9uKTsgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAgQG1ldGhv ZCBsb2FkaW5nRGF0YQogICAgICAgIEBwcml2YXRlCiAgICAgICAgQHBhcmFt IHtQcm9taXNlfSBwcm9taXNlCiAgICAgICovCiAgICAgIGxvYWRpbmdEYXRh OiBmdW5jdGlvbihwcm9taXNlKSB7CiAgICAgICAgdGhpcy5zZW5kKCdsb2Fk aW5nRGF0YScsIHByb21pc2UpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAg ICAgQG1ldGhvZCBsb2FkZWREYXRhCiAgICAgICAgQHByaXZhdGUKICAgICAg Ki8KICAgICAgbG9hZGVkRGF0YTogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhp cy5zZW5kKCdsb2FkZWREYXRhJyk7CiAgICAgIH0sCgogICAgICAvKioKICAg ICAgICBAbWV0aG9kIG5vdEZvdW5kCiAgICAgICAgQHByaXZhdGUKICAgICAg Ki8KICAgICAgbm90Rm91bmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMu c2VuZCgnbm90Rm91bmQnKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAg IEBtZXRob2QgcHVzaGVkRGF0YQogICAgICAgIEBwcml2YXRlCiAgICAgICov CiAgICAgIHB1c2hlZERhdGE6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMu c2VuZCgncHVzaGVkRGF0YScpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAg ICAgTWFya3MgdGhlIHJlY29yZCBhcyBkZWxldGVkIGJ1dCBkb2VzIG5vdCBz YXZlIGl0LiBZb3UgbXVzdCBjYWxsCiAgICAgICAgYHNhdmVgIGFmdGVyd2Fy ZHMgaWYgeW91IHdhbnQgdG8gcGVyc2lzdCBpdC4gWW91IG1pZ2h0IHVzZSB0 aGlzCiAgICAgICAgbWV0aG9kIGlmIHlvdSB3YW50IHRvIGFsbG93IHRoZSB1 c2VyIHRvIHN0aWxsIGByb2xsYmFjaygpYCBhCiAgICAgICAgZGVsZXRlIGFm dGVyIGl0IHdhcyBtYWRlLgoKICAgICAgICBFeGFtcGxlCgogICAgICAgIGBg YGphdmFzY3JpcHQKICAgICAgICBBcHAuTW9kZWxEZWxldGVSb3V0ZSA9IEVt YmVyLlJvdXRlLmV4dGVuZCh7CiAgICAgICAgICBhY3Rpb25zOiB7CiAgICAg ICAgICAgIHNvZnREZWxldGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAg IHRoaXMuZ2V0KCdtb2RlbCcpLmRlbGV0ZVJlY29yZCgpOwogICAgICAgICAg ICB9LAogICAgICAgICAgICBjb25maXJtOiBmdW5jdGlvbigpIHsKICAgICAg ICAgICAgICB0aGlzLmdldCgnbW9kZWwnKS5zYXZlKCk7CiAgICAgICAgICAg IH0sCiAgICAgICAgICAgIHVuZG86IGZ1bmN0aW9uKCkgewogICAgICAgICAg ICAgIHRoaXMuZ2V0KCdtb2RlbCcpLnJvbGxiYWNrKCk7CiAgICAgICAgICAg IH0KICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBgYGAKCiAgICAg ICAgQG1ldGhvZCBkZWxldGVSZWNvcmQKICAgICAgKi8KICAgICAgZGVsZXRl UmVjb3JkOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnNlbmQoJ2RlbGV0 ZVJlY29yZCcpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAgU2FtZSBh cyBgZGVsZXRlUmVjb3JkYCwgYnV0IHNhdmVzIHRoZSByZWNvcmQgaW1tZWRp YXRlbHkuCgogICAgICAgIEV4YW1wbGUKCiAgICAgICAgYGBgamF2YXNjcmlw dAogICAgICAgIEFwcC5Nb2RlbERlbGV0ZVJvdXRlID0gRW1iZXIuUm91dGUu ZXh0ZW5kKHsKICAgICAgICAgIGFjdGlvbnM6IHsKICAgICAgICAgICAgZGVs ZXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICB2YXIgY29udHJvbGxl ciA9IHRoaXMuY29udHJvbGxlcjsKICAgICAgICAgICAgICB0aGlzLmdldCgn bW9kZWwnKS5kZXN0cm95UmVjb3JkKCkudGhlbihmdW5jdGlvbigpIHsKICAg ICAgICAgICAgICAgIGNvbnRyb2xsZXIudHJhbnNpdGlvblRvUm91dGUoJ21v ZGVsLmluZGV4Jyk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0K ICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBgYGAKCiAgICAgICAg QG1ldGhvZCBkZXN0cm95UmVjb3JkCiAgICAgICAgQHJldHVybiB7UHJvbWlz ZX0gYSBwcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCB3aGVuIHRoZSBh ZGFwdGVyIHJldHVybnMKICAgICAgICBzdWNjZXNzZnVsbHkgb3IgcmVqZWN0 ZWQgaWYgdGhlIGFkYXB0ZXIgcmV0dXJucyB3aXRoIGFuIGVycm9yLgogICAg ICAqLwogICAgICBkZXN0cm95UmVjb3JkOiBmdW5jdGlvbigpIHsKICAgICAg ICB0aGlzLmRlbGV0ZVJlY29yZCgpOwogICAgICAgIHJldHVybiB0aGlzLnNh dmUoKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgIEBtZXRob2QgdW5s b2FkUmVjb3JkCiAgICAgICAgQHByaXZhdGUKICAgICAgKi8KICAgICAgdW5s b2FkUmVjb3JkOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5pc0Rl c3Ryb3llZCkgeyByZXR1cm47IH0KCiAgICAgICAgdGhpcy5zZW5kKCd1bmxv YWRSZWNvcmQnKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgIEBtZXRo b2QgY2xlYXJSZWxhdGlvbnNoaXBzCiAgICAgICAgQHByaXZhdGUKICAgICAg Ki8KICAgICAgY2xlYXJSZWxhdGlvbnNoaXBzOiBmdW5jdGlvbigpIHsKICAg ICAgICB0aGlzLmVhY2hSZWxhdGlvbnNoaXAoZnVuY3Rpb24obmFtZSwgcmVs YXRpb25zaGlwKSB7CiAgICAgICAgICBpZiAocmVsYXRpb25zaGlwLmtpbmQg PT09ICdiZWxvbmdzVG8nKSB7CiAgICAgICAgICAgIHNldCh0aGlzLCBuYW1l LCBudWxsKTsKICAgICAgICAgIH0gZWxzZSBpZiAocmVsYXRpb25zaGlwLmtp bmQgPT09ICdoYXNNYW55JykgewogICAgICAgICAgICB2YXIgaGFzTWFueSA9 IHRoaXMuX3JlbGF0aW9uc2hpcHNbbmFtZV07CiAgICAgICAgICAgIGlmICho YXNNYW55KSB7IC8vIHJlbGF0aW9uc2hpcHMgYXJlIGNyZWF0ZWQgbGF6aWx5 CiAgICAgICAgICAgICAgaGFzTWFueS5kZXN0cm95KCk7CiAgICAgICAgICAg IH0KICAgICAgICAgIH0KICAgICAgICB9LCB0aGlzKTsKICAgICAgfSwKCiAg ICAgIC8qKgogICAgICAgIEBtZXRob2QgdXBkYXRlUmVjb3JkQXJyYXlzCiAg ICAgICAgQHByaXZhdGUKICAgICAgKi8KICAgICAgdXBkYXRlUmVjb3JkQXJy YXlzOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl91cGRhdGluZ1JlY29y ZEFycmF5c0xhdGVyID0gZmFsc2U7CiAgICAgICAgZ2V0KHRoaXMsICdzdG9y ZScpLmRhdGFXYXNVcGRhdGVkKHRoaXMuY29uc3RydWN0b3IsIHRoaXMpOwog ICAgICB9LAoKICAgICAgLyoqCiAgICAgICAgUmV0dXJucyBhbiBvYmplY3Qs IHdob3NlIGtleXMgYXJlIGNoYW5nZWQgcHJvcGVydGllcywgYW5kIHZhbHVl IGlzCiAgICAgICAgYW4gW29sZFByb3AsIG5ld1Byb3BdIGFycmF5LgoKICAg ICAgICBFeGFtcGxlCgogICAgICAgIGBgYGphdmFzY3JpcHQKICAgICAgICBB cHAuTWFzY290ID0gRFMuTW9kZWwuZXh0ZW5kKHsKICAgICAgICAgIG5hbWU6 IGF0dHIoJ3N0cmluZycpCiAgICAgICAgfSk7CgogICAgICAgIHZhciBwZXJz b24gPSBzdG9yZS5jcmVhdGVSZWNvcmQoJ3BlcnNvbicpOwogICAgICAgIHBl cnNvbi5jaGFuZ2VkQXR0cmlidXRlcygpOyAvLyB7fQogICAgICAgIHBlcnNv bi5zZXQoJ25hbWUnLCAnVG9tc3RlcicpOwogICAgICAgIHBlcnNvbi5jaGFu Z2VkQXR0cmlidXRlcygpOyAvLyB7bmFtZTogW3VuZGVmaW5lZCwgJ1RvbXN0 ZXInXX0KICAgICAgICBgYGAKCiAgICAgICAgQG1ldGhvZCBjaGFuZ2VkQXR0 cmlidXRlcwogICAgICAgIEByZXR1cm4ge09iamVjdH0gYW4gb2JqZWN0LCB3 aG9zZSBrZXlzIGFyZSBjaGFuZ2VkIHByb3BlcnRpZXMsCiAgICAgICAgICBh bmQgdmFsdWUgaXMgYW4gW29sZFByb3AsIG5ld1Byb3BdIGFycmF5LgogICAg ICAqLwogICAgICBjaGFuZ2VkQXR0cmlidXRlczogZnVuY3Rpb24oKSB7CiAg ICAgICAgdmFyIG9sZERhdGEgPSBnZXQodGhpcywgJ19kYXRhJyksCiAgICAg ICAgICAgIG5ld0RhdGEgPSBnZXQodGhpcywgJ19hdHRyaWJ1dGVzJyksCiAg ICAgICAgICAgIGRpZmZEYXRhID0ge30sCiAgICAgICAgICAgIHByb3A7Cgog ICAgICAgIGZvciAocHJvcCBpbiBuZXdEYXRhKSB7CiAgICAgICAgICBkaWZm RGF0YVtwcm9wXSA9IFtvbGREYXRhW3Byb3BdLCBuZXdEYXRhW3Byb3BdXTsK ICAgICAgICB9CgogICAgICAgIHJldHVybiBkaWZmRGF0YTsKICAgICAgfSwK CiAgICAgIC8qKgogICAgICAgIEBtZXRob2QgYWRhcHRlcldpbGxDb21taXQK ICAgICAgICBAcHJpdmF0ZQogICAgICAqLwogICAgICBhZGFwdGVyV2lsbENv bW1pdDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zZW5kKCd3aWxsQ29t bWl0Jyk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICBJZiB0aGUgYWRh cHRlciBkaWQgbm90IHJldHVybiBhIGhhc2ggaW4gcmVzcG9uc2UgdG8gYSBj b21taXQsCiAgICAgICAgbWVyZ2UgdGhlIGNoYW5nZWQgYXR0cmlidXRlcyBh bmQgcmVsYXRpb25zaGlwcyBpbnRvIHRoZSBleGlzdGluZwogICAgICAgIHNh dmVkIGRhdGEuCgogICAgICAgIEBtZXRob2QgYWRhcHRlckRpZENvbW1pdAog ICAgICAqLwogICAgICBhZGFwdGVyRGlkQ29tbWl0OiBmdW5jdGlvbihkYXRh KSB7CiAgICAgICAgc2V0KHRoaXMsICdpc0Vycm9yJywgZmFsc2UpOwoKICAg ICAgICBpZiAoZGF0YSkgewogICAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7 CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIEVtYmVyLm1peGluKHRoaXMu X2RhdGEsIHRoaXMuX2luRmxpZ2h0QXR0cmlidXRlcyk7CiAgICAgICAgfQoK ICAgICAgICB0aGlzLl9pbkZsaWdodEF0dHJpYnV0ZXMgPSB7fTsKCiAgICAg ICAgdGhpcy5zZW5kKCdkaWRDb21taXQnKTsKICAgICAgICB0aGlzLnVwZGF0 ZVJlY29yZEFycmF5c0xhdGVyKCk7CgogICAgICAgIGlmICghZGF0YSkgeyBy ZXR1cm47IH0KCiAgICAgICAgdGhpcy5zdXNwZW5kUmVsYXRpb25zaGlwT2Jz ZXJ2ZXJzKGZ1bmN0aW9uKCkgewogICAgICAgICAgdGhpcy5ub3RpZnlQcm9w ZXJ0eUNoYW5nZSgnZGF0YScpOwogICAgICAgIH0pOwogICAgICB9LAoKICAg ICAgLyoqCiAgICAgICAgQG1ldGhvZCBhZGFwdGVyRGlkRGlydHkKICAgICAg ICBAcHJpdmF0ZQogICAgICAqLwogICAgICBhZGFwdGVyRGlkRGlydHk6IGZ1 bmN0aW9uKCkgewogICAgICAgIHRoaXMuc2VuZCgnYmVjb21lRGlydHknKTsK ICAgICAgICB0aGlzLnVwZGF0ZVJlY29yZEFycmF5c0xhdGVyKCk7CiAgICAg IH0sCgogICAgICBkYXRhRGlkQ2hhbmdlOiBFbWJlci5vYnNlcnZlcihmdW5j dGlvbigpIHsKICAgICAgICB0aGlzLnJlbG9hZEhhc01hbnlzKCk7CiAgICAg IH0sICdkYXRhJyksCgogICAgICByZWxvYWRIYXNNYW55czogZnVuY3Rpb24o KSB7CiAgICAgICAgdmFyIHJlbGF0aW9uc2hpcHMgPSBnZXQodGhpcy5jb25z dHJ1Y3RvciwgJ3JlbGF0aW9uc2hpcHNCeU5hbWUnKTsKICAgICAgICB0aGlz LnVwZGF0ZVJlY29yZEFycmF5c0xhdGVyKCk7CiAgICAgICAgcmVsYXRpb25z aGlwcy5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUsIHJlbGF0aW9uc2hpcCkgewog ICAgICAgICAgaWYgKHRoaXMuX2RhdGEubGlua3MgJiYgdGhpcy5fZGF0YS5s aW5rc1tuYW1lXSkgeyByZXR1cm47IH0KICAgICAgICAgIGlmIChyZWxhdGlv bnNoaXAua2luZCA9PT0gJ2hhc01hbnknKSB7CiAgICAgICAgICAgIHRoaXMu aGFzTWFueURpZENoYW5nZShyZWxhdGlvbnNoaXAua2V5KTsKICAgICAgICAg IH0KICAgICAgICB9LCB0aGlzKTsKICAgICAgfSwKCiAgICAgIGhhc01hbnlE aWRDaGFuZ2U6IGZ1bmN0aW9uKGtleSkgewogICAgICAgIHZhciBoYXNNYW55 ID0gdGhpcy5fcmVsYXRpb25zaGlwc1trZXldOwoKICAgICAgICBpZiAoaGFz TWFueSkgewogICAgICAgICAgdmFyIHJlY29yZHMgPSB0aGlzLl9kYXRhW2tl eV0gfHwgW107CgogICAgICAgICAgc2V0KGhhc01hbnksICdjb250ZW50Jywg RW1iZXIuQShyZWNvcmRzKSk7CiAgICAgICAgICBzZXQoaGFzTWFueSwgJ2lz TG9hZGVkJywgdHJ1ZSk7CiAgICAgICAgICBoYXNNYW55LnRyaWdnZXIoJ2Rp ZExvYWQnKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAg ICBAbWV0aG9kIHVwZGF0ZVJlY29yZEFycmF5c0xhdGVyCiAgICAgICAgQHBy aXZhdGUKICAgICAgKi8KICAgICAgdXBkYXRlUmVjb3JkQXJyYXlzTGF0ZXI6 IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIHF1aWNrIGhhY2sgKHNvbWV0aGlu ZyBsaWtlIHRoaXMgY291bGQgYmUgcHVzaGVkIGludG8gcnVuLm9uY2UKICAg ICAgICBpZiAodGhpcy5fdXBkYXRpbmdSZWNvcmRBcnJheXNMYXRlcikgeyBy ZXR1cm47IH0KICAgICAgICB0aGlzLl91cGRhdGluZ1JlY29yZEFycmF5c0xh dGVyID0gdHJ1ZTsKCiAgICAgICAgRW1iZXIucnVuLnNjaGVkdWxlKCdhY3Rp b25zJywgdGhpcywgdGhpcy51cGRhdGVSZWNvcmRBcnJheXMpOwogICAgICB9 LAoKICAgICAgLyoqCiAgICAgICAgQG1ldGhvZCBzZXR1cERhdGEKICAgICAg ICBAcHJpdmF0ZQogICAgICAgIEBwYXJhbSB7T2JqZWN0fSBkYXRhCiAgICAg ICAgQHBhcmFtIHtCb29sZWFufSBwYXJ0aWFsIHRoZSBkYXRhIHNob3VsZCBi ZSBtZXJnZWQgaW50bwogICAgICAgICAgdGhlIGV4aXN0aW5nIGRhdGEsIG5v dCByZXBsYWNlIGl0LgogICAgICAqLwogICAgICBzZXR1cERhdGE6IGZ1bmN0 aW9uKGRhdGEsIHBhcnRpYWwpIHsKICAgICAgICBpZiAocGFydGlhbCkgewog ICAgICAgICAgRW1iZXIubWVyZ2UodGhpcy5fZGF0YSwgZGF0YSk7CiAgICAg ICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX2RhdGEgPSBkYXRhOwogICAg ICAgIH0KCiAgICAgICAgdmFyIHJlbGF0aW9uc2hpcHMgPSB0aGlzLl9yZWxh dGlvbnNoaXBzOwoKICAgICAgICB0aGlzLmVhY2hSZWxhdGlvbnNoaXAoZnVu Y3Rpb24obmFtZSwgcmVsKSB7CiAgICAgICAgICBpZiAoZGF0YS5saW5rcyAm JiBkYXRhLmxpbmtzW25hbWVdKSB7IHJldHVybjsgfQogICAgICAgICAgaWYg KHJlbC5vcHRpb25zLmFzeW5jKSB7IHJlbGF0aW9uc2hpcHNbbmFtZV0gPSBu dWxsOyB9CiAgICAgICAgfSk7CgogICAgICAgIGlmIChkYXRhKSB7IHRoaXMu cHVzaGVkRGF0YSgpOyB9CgogICAgICAgIHRoaXMuc3VzcGVuZFJlbGF0aW9u c2hpcE9ic2VydmVycyhmdW5jdGlvbigpIHsKICAgICAgICAgIHRoaXMubm90 aWZ5UHJvcGVydHlDaGFuZ2UoJ2RhdGEnKTsKICAgICAgICB9KTsKICAgICAg fSwKCiAgICAgIG1hdGVyaWFsaXplSWQ6IGZ1bmN0aW9uKGlkKSB7CiAgICAg ICAgc2V0KHRoaXMsICdpZCcsIGlkKTsKICAgICAgfSwKCiAgICAgIG1hdGVy aWFsaXplQXR0cmlidXRlczogZnVuY3Rpb24oYXR0cmlidXRlcykgewogICAg ICAgIEVtYmVyLmFzc2VydCgiTXVzdCBwYXNzIGEgaGFzaCBvZiBhdHRyaWJ1 dGVzIHRvIG1hdGVyaWFsaXplQXR0cmlidXRlcyIsICEhYXR0cmlidXRlcyk7 CiAgICAgICAgbWVyZ2UodGhpcy5fZGF0YSwgYXR0cmlidXRlcyk7CiAgICAg IH0sCgogICAgICBtYXRlcmlhbGl6ZUF0dHJpYnV0ZTogZnVuY3Rpb24obmFt ZSwgdmFsdWUpIHsKICAgICAgICB0aGlzLl9kYXRhW25hbWVdID0gdmFsdWU7 CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICBAbWV0aG9kIHVwZGF0ZUhh c01hbnkKICAgICAgICBAcHJpdmF0ZQogICAgICAgIEBwYXJhbSB7U3RyaW5n fSBuYW1lCiAgICAgICAgQHBhcmFtIHtBcnJheX0gcmVjb3JkcwogICAgICAq LwogICAgICB1cGRhdGVIYXNNYW55OiBmdW5jdGlvbihuYW1lLCByZWNvcmRz KSB7CiAgICAgICAgdGhpcy5fZGF0YVtuYW1lXSA9IHJlY29yZHM7CiAgICAg ICAgdGhpcy5oYXNNYW55RGlkQ2hhbmdlKG5hbWUpOwogICAgICB9LAoKICAg ICAgLyoqCiAgICAgICAgQG1ldGhvZCB1cGRhdGVCZWxvbmdzVG8KICAgICAg ICBAcHJpdmF0ZQogICAgICAgIEBwYXJhbSB7U3RyaW5nfSBuYW1lCiAgICAg ICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCiAgICAgICovCiAgICAgIHVw ZGF0ZUJlbG9uZ3NUbzogZnVuY3Rpb24obmFtZSwgcmVjb3JkKSB7CiAgICAg ICAgdGhpcy5fZGF0YVtuYW1lXSA9IHJlY29yZDsKICAgICAgfSwKCiAgICAg IC8qKgogICAgICAgIElmIHRoZSBtb2RlbCBgaXNEaXJ0eWAgdGhpcyBmdW5j dGlvbiB3aWxsIGRpc2NhcmQgYW55IHVuc2F2ZWQKICAgICAgICBjaGFuZ2Vz CgogICAgICAgIEV4YW1wbGUKCiAgICAgICAgYGBgamF2YXNjcmlwdAogICAg ICAgIHJlY29yZC5nZXQoJ25hbWUnKTsgLy8gJ1VudGl0bGVkIERvY3VtZW50 JwogICAgICAgIHJlY29yZC5zZXQoJ25hbWUnLCAnRG9jIDEnKTsKICAgICAg ICByZWNvcmQuZ2V0KCduYW1lJyk7IC8vICdEb2MgMScKICAgICAgICByZWNv cmQucm9sbGJhY2soKTsKICAgICAgICByZWNvcmQuZ2V0KCduYW1lJyk7IC8v ICdVbnRpdGxlZCBEb2N1bWVudCcKICAgICAgICBgYGAKCiAgICAgICAgQG1l dGhvZCByb2xsYmFjawogICAgICAqLwogICAgICByb2xsYmFjazogZnVuY3Rp b24oKSB7CiAgICAgICAgdGhpcy5fYXR0cmlidXRlcyA9IHt9OwoKICAgICAg ICBpZiAoZ2V0KHRoaXMsICdpc0Vycm9yJykpIHsKICAgICAgICAgIHRoaXMu X2luRmxpZ2h0QXR0cmlidXRlcyA9IHt9OwogICAgICAgICAgc2V0KHRoaXMs ICdpc0Vycm9yJywgZmFsc2UpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFn ZXQodGhpcywgJ2lzVmFsaWQnKSkgewogICAgICAgICAgdGhpcy5faW5GbGln aHRBdHRyaWJ1dGVzID0ge307CiAgICAgICAgfQoKICAgICAgICB0aGlzLnNl bmQoJ3JvbGxlZEJhY2snKTsKCiAgICAgICAgdGhpcy5zdXNwZW5kUmVsYXRp b25zaGlwT2JzZXJ2ZXJzKGZ1bmN0aW9uKCkgewogICAgICAgICAgdGhpcy5u b3RpZnlQcm9wZXJ0eUNoYW5nZSgnZGF0YScpOwogICAgICAgIH0pOwogICAg ICB9LAoKICAgICAgdG9TdHJpbmdFeHRlbnNpb246IGZ1bmN0aW9uKCkgewog ICAgICAgIHJldHVybiBnZXQodGhpcywgJ2lkJyk7CiAgICAgIH0sCgogICAg ICAvKioKICAgICAgICBUaGUgZ29hbCBvZiB0aGlzIG1ldGhvZCBpcyB0byB0 ZW1wb3JhcmlseSBkaXNhYmxlIHNwZWNpZmljIG9ic2VydmVycwogICAgICAg IHRoYXQgdGFrZSBhY3Rpb24gaW4gcmVzcG9uc2UgdG8gYXBwbGljYXRpb24g Y2hhbmdlcy4KCiAgICAgICAgVGhpcyBhbGxvd3MgdGhlIHN5c3RlbSB0byBt YWtlIGNoYW5nZXMgKHN1Y2ggYXMgbWF0ZXJpYWxpemF0aW9uIGFuZAogICAg ICAgIHJvbGxiYWNrKSB0aGF0IHNob3VsZCBub3QgdHJpZ2dlciBzZWNvbmRh cnkgYmVoYXZpb3IgKHN1Y2ggYXMgc2V0dGluZyBhbgogICAgICAgIGludmVy c2UgcmVsYXRpb25zaGlwIG9yIG1hcmtpbmcgcmVjb3JkcyBhcyBkaXJ0eSku CgogICAgICAgIFRoZSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiB3aWxsIGxp a2VseSBjaGFuZ2UgYXMgRW1iZXIgcHJvcGVyIHByb3ZpZGVzCiAgICAgICAg YmV0dGVyIGluZnJhc3RydWN0dXJlIGZvciBzdXNwZW5kaW5nIGdyb3VwcyBv ZiBvYnNlcnZlcnMsIGFuZCBpZiBBcnJheQogICAgICAgIG9ic2VydmF0aW9u IGJlY29tZXMgbW9yZSB1bmlmaWVkIHdpdGggcmVndWxhciBvYnNlcnZlcnMu CgogICAgICAgIEBtZXRob2Qgc3VzcGVuZFJlbGF0aW9uc2hpcE9ic2VydmVy cwogICAgICAgIEBwcml2YXRlCiAgICAgICAgQHBhcmFtIGNhbGxiYWNrCiAg ICAgICAgQHBhcmFtIGJpbmRpbmcKICAgICAgKi8KICAgICAgc3VzcGVuZFJl bGF0aW9uc2hpcE9ic2VydmVyczogZnVuY3Rpb24oY2FsbGJhY2ssIGJpbmRp bmcpIHsKICAgICAgICB2YXIgb2JzZXJ2ZXJzID0gZ2V0KHRoaXMuY29uc3Ry dWN0b3IsICdyZWxhdGlvbnNoaXBOYW1lcycpLmJlbG9uZ3NUbzsKICAgICAg ICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIHRyeSB7CiAgICAgICAgICB0 aGlzLl9zdXNwZW5kZWRSZWxhdGlvbnNoaXBzID0gdHJ1ZTsKICAgICAgICAg IEVtYmVyLl9zdXNwZW5kT2JzZXJ2ZXJzKHNlbGYsIG9ic2VydmVycywgbnVs bCwgJ2JlbG9uZ3NUb0RpZENoYW5nZScsIGZ1bmN0aW9uKCkgewogICAgICAg ICAgICBFbWJlci5fc3VzcGVuZEJlZm9yZU9ic2VydmVycyhzZWxmLCBvYnNl cnZlcnMsIG51bGwsICdiZWxvbmdzVG9XaWxsQ2hhbmdlJywgZnVuY3Rpb24o KSB7CiAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbChiaW5kaW5nIHx8IHNl bGYpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pOwogICAgICAgIH0g ZmluYWxseSB7CiAgICAgICAgICB0aGlzLl9zdXNwZW5kZWRSZWxhdGlvbnNo aXBzID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAg ICAgICAgU2F2ZSB0aGUgcmVjb3JkIGFuZCBwZXJzaXN0IGFueSBjaGFuZ2Vz IHRvIHRoZSByZWNvcmQgdG8gYW4KICAgICAgICBleHRlbmFsIHNvdXJjZSB2 aWEgdGhlIGFkYXB0ZXIuCgogICAgICAgIEV4YW1wbGUKCiAgICAgICAgYGBg amF2YXNjcmlwdAogICAgICAgIHJlY29yZC5zZXQoJ25hbWUnLCAnVG9tc3Rl cicpOwogICAgICAgIHJlY29yZC5zYXZlKCkudGhlbihmdW5jdGlvbigpewog ICAgICAgICAgLy8gU3VjY2VzcyBjYWxsYmFjawogICAgICAgIH0sIGZ1bmN0 aW9uKCkgewogICAgICAgICAgLy8gRXJyb3IgY2FsbGJhY2sKICAgICAgICB9 KTsKICAgICAgICBgYGAKICAgICAgICBAbWV0aG9kIHNhdmUKICAgICAgICBA cmV0dXJuIHtQcm9taXNlfSBhIHByb21pc2UgdGhhdCB3aWxsIGJlIHJlc29s dmVkIHdoZW4gdGhlIGFkYXB0ZXIgcmV0dXJucwogICAgICAgIHN1Y2Nlc3Nm dWxseSBvciByZWplY3RlZCBpZiB0aGUgYWRhcHRlciByZXR1cm5zIHdpdGgg YW4gZXJyb3IuCiAgICAgICovCiAgICAgIHNhdmU6IGZ1bmN0aW9uKCkgewog ICAgICAgIHZhciBwcm9taXNlTGFiZWwgPSAiRFM6IE1vZGVsI3NhdmUgIiAr IHRoaXM7CiAgICAgICAgdmFyIHJlc29sdmVyID0gRW1iZXIuUlNWUC5kZWZl cihwcm9taXNlTGFiZWwpOwoKICAgICAgICB0aGlzLmdldCgnc3RvcmUnKS5z Y2hlZHVsZVNhdmUodGhpcywgcmVzb2x2ZXIpOwogICAgICAgIHRoaXMuX2lu RmxpZ2h0QXR0cmlidXRlcyA9IHRoaXMuX2F0dHJpYnV0ZXM7CiAgICAgICAg dGhpcy5fYXR0cmlidXRlcyA9IHt9OwoKICAgICAgICByZXR1cm4gRFMuUHJv bWlzZU9iamVjdC5jcmVhdGUoeyBwcm9taXNlOiByZXNvbHZlci5wcm9taXNl IH0pOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAgUmVsb2FkIHRoZSBy ZWNvcmQgZnJvbSB0aGUgYWRhcHRlci4KCiAgICAgICAgVGhpcyB3aWxsIG9u bHkgd29yayBpZiB0aGUgcmVjb3JkIGhhcyBhbHJlYWR5IGZpbmlzaGVkIGxv YWRpbmcKICAgICAgICBhbmQgaGFzIG5vdCB5ZXQgYmVlbiBtb2RpZmllZCAo YGlzTG9hZGVkYCBidXQgbm90IGBpc0RpcnR5YCwKICAgICAgICBvciBgaXNT YXZpbmdgKS4KCiAgICAgICAgRXhhbXBsZQoKICAgICAgICBgYGBqYXZhc2Ny aXB0CiAgICAgICAgQXBwLk1vZGVsVmlld1JvdXRlID0gRW1iZXIuUm91dGUu ZXh0ZW5kKHsKICAgICAgICAgIGFjdGlvbnM6IHsKICAgICAgICAgICAgcmVs b2FkOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICB0aGlzLmdldCgnbW9k ZWwnKS5yZWxvYWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAg ICAgIH0pOwogICAgICAgIGBgYAoKICAgICAgICBAbWV0aG9kIHJlbG9hZAog ICAgICAgIEByZXR1cm4ge1Byb21pc2V9IGEgcHJvbWlzZSB0aGF0IHdpbGwg YmUgcmVzb2x2ZWQgd2l0aCB0aGUgcmVjb3JkIHdoZW4gdGhlCiAgICAgICAg YWRhcHRlciByZXR1cm5zIHN1Y2Nlc3NmdWxseSBvciByZWplY3RlZCBpZiB0 aGUgYWRhcHRlciByZXR1cm5zCiAgICAgICAgd2l0aCBhbiBlcnJvci4KICAg ICAgKi8KICAgICAgcmVsb2FkOiBmdW5jdGlvbigpIHsKICAgICAgICBzZXQo dGhpcywgJ2lzUmVsb2FkaW5nJywgdHJ1ZSk7CgogICAgICAgIHZhciAgcmVj b3JkID0gdGhpczsKCiAgICAgICAgdmFyIHByb21pc2VMYWJlbCA9ICJEUzog TW9kZWwjcmVsb2FkIG9mICIgKyB0aGlzOwogICAgICAgIHZhciBwcm9taXNl ID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSl7CiAgICAgICAgICAg cmVjb3JkLnNlbmQoJ3JlbG9hZFJlY29yZCcsIHJlc29sdmUpOwogICAgICAg IH0sIHByb21pc2VMYWJlbCkudGhlbihmdW5jdGlvbigpIHsKICAgICAgICAg IHJlY29yZC5zZXQoJ2lzUmVsb2FkaW5nJywgZmFsc2UpOwogICAgICAgICAg cmVjb3JkLnNldCgnaXNFcnJvcicsIGZhbHNlKTsKICAgICAgICAgIHJldHVy biByZWNvcmQ7CiAgICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7CiAgICAg ICAgICByZWNvcmQuc2V0KCdpc0Vycm9yJywgdHJ1ZSk7CiAgICAgICAgICB0 aHJvdyByZWFzb247CiAgICAgICAgfSwgIkRTOiBNb2RlbCNyZWxvYWQgY29t cGxldGUsIHVwZGF0ZSBmbGFncyIpOwoKICAgICAgICByZXR1cm4gRFMuUHJv bWlzZU9iamVjdC5jcmVhdGUoeyBwcm9taXNlOiBwcm9taXNlIH0pOwogICAg ICB9LAoKICAgICAgLy8gRk9SIFVTRSBEVVJJTkcgQ09NTUlUIFBST0NFU1MK CiAgICAgIGFkYXB0ZXJEaWRVcGRhdGVBdHRyaWJ1dGU6IGZ1bmN0aW9uKGF0 dHJpYnV0ZU5hbWUsIHZhbHVlKSB7CgogICAgICAgIC8vIElmIGEgdmFsdWUg aXMgcGFzc2VkIGluLCB1cGRhdGUgdGhlIGludGVybmFsIGF0dHJpYnV0ZXMg YW5kIGNsZWFyCiAgICAgICAgLy8gdGhlIGF0dHJpYnV0ZSBjYWNoZSBzbyBp dCBwaWNrcyB1cCB0aGUgbmV3IHZhbHVlLiBPdGhlcndpc2UsCiAgICAgICAg Ly8gY29sbGFwc2UgdGhlIGN1cnJlbnQgdmFsdWUgaW50byB0aGUgaW50ZXJu YWwgYXR0cmlidXRlcyBiZWNhdXNlCiAgICAgICAgLy8gdGhlIGFkYXB0ZXIg aGFzIGFja25vd2xlZGdlZCBpdC4KICAgICAgICBpZiAodmFsdWUgIT09IHVu ZGVmaW5lZCkgewogICAgICAgICAgdGhpcy5fZGF0YVthdHRyaWJ1dGVOYW1l XSA9IHZhbHVlOwogICAgICAgICAgdGhpcy5ub3RpZnlQcm9wZXJ0eUNoYW5n ZShhdHRyaWJ1dGVOYW1lKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAg dGhpcy5fZGF0YVthdHRyaWJ1dGVOYW1lXSA9IHRoaXMuX2luRmxpZ2h0QXR0 cmlidXRlc1thdHRyaWJ1dGVOYW1lXTsKICAgICAgICB9CgogICAgICAgIHRo aXMudXBkYXRlUmVjb3JkQXJyYXlzTGF0ZXIoKTsKICAgICAgfSwKCiAgICAg IC8qKgogICAgICAgIEBtZXRob2QgYWRhcHRlckRpZEludmFsaWRhdGUKICAg ICAgICBAcHJpdmF0ZQogICAgICAqLwogICAgICBhZGFwdGVyRGlkSW52YWxp ZGF0ZTogZnVuY3Rpb24oZXJyb3JzKSB7CiAgICAgICAgdmFyIHJlY29yZEVy cm9ycyA9IGdldCh0aGlzLCAnZXJyb3JzJyk7CiAgICAgICAgZnVuY3Rpb24g YWRkRXJyb3IobmFtZSkgewogICAgICAgICAgaWYgKGVycm9yc1tuYW1lXSkg ewogICAgICAgICAgICByZWNvcmRFcnJvcnMuYWRkKG5hbWUsIGVycm9yc1tu YW1lXSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB0aGlzLmVh Y2hBdHRyaWJ1dGUoYWRkRXJyb3IpOwogICAgICAgIHRoaXMuZWFjaFJlbGF0 aW9uc2hpcChhZGRFcnJvcik7CiAgICAgIH0sCgogICAgICAvKioKICAgICAg ICBAbWV0aG9kIGFkYXB0ZXJEaWRFcnJvcgogICAgICAgIEBwcml2YXRlCiAg ICAgICovCiAgICAgIGFkYXB0ZXJEaWRFcnJvcjogZnVuY3Rpb24oKSB7CiAg ICAgICAgdGhpcy5zZW5kKCdiZWNhbWVFcnJvcicpOwogICAgICAgIHNldCh0 aGlzLCAnaXNFcnJvcicsIHRydWUpOwogICAgICB9LAoKICAgICAgLyoqCiAg ICAgICAgT3ZlcnJpZGUgdGhlIGRlZmF1bHQgZXZlbnQgZmlyaW5nIGZyb20g RW1iZXIuRXZlbnRlZCB0bwogICAgICAgIGFsc28gY2FsbCBtZXRob2RzIHdp dGggdGhlIGdpdmVuIG5hbWUuCgogICAgICAgIEBtZXRob2QgdHJpZ2dlcgog ICAgICAgIEBwcml2YXRlCiAgICAgICAgQHBhcmFtIG5hbWUKICAgICAgKi8K ICAgICAgdHJpZ2dlcjogZnVuY3Rpb24obmFtZSkgewogICAgICAgIEVtYmVy LnRyeUludm9rZSh0aGlzLCBuYW1lLCBbXS5zbGljZS5jYWxsKGFyZ3VtZW50 cywgMSkpOwogICAgICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3Vt ZW50cyk7CiAgICAgIH0sCgogICAgICB0cmlnZ2VyTGF0ZXI6IGZ1bmN0aW9u KCkgewogICAgICAgIGlmICh0aGlzLl9kZWZlcnJlZFRyaWdnZXJzLnB1c2go YXJndW1lbnRzKSAhPT0gMSkgeyByZXR1cm47IH0KICAgICAgICBFbWJlci5y dW4uc2NoZWR1bGUoJ2FjdGlvbnMnLCB0aGlzLCAnX3RyaWdnZXJEZWZlcnJl ZFRyaWdnZXJzJyk7CiAgICAgIH0sCgogICAgICBfdHJpZ2dlckRlZmVycmVk VHJpZ2dlcnM6IGZ1bmN0aW9uKCkgewogICAgICAgIGZvciAodmFyIGk9MCwg bD10aGlzLl9kZWZlcnJlZFRyaWdnZXJzLmxlbmd0aDsgaTxsOyBpKyspIHsK ICAgICAgICAgIHRoaXMudHJpZ2dlci5hcHBseSh0aGlzLCB0aGlzLl9kZWZl cnJlZFRyaWdnZXJzW2ldKTsKICAgICAgICB9CgogICAgICAgIHRoaXMuX2Rl ZmVycmVkVHJpZ2dlcnMubGVuZ3RoID0gMDsKICAgICAgfSwKCiAgICAgIHdp bGxEZXN0cm95OiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9zdXBlcigp OwogICAgICAgIHRoaXMuY2xlYXJSZWxhdGlvbnNoaXBzKCk7CiAgICAgIH0K ICAgIH0pOwoKICAgIE1vZGVsLnJlb3BlbkNsYXNzKHsKCiAgICAgIC8qKgog ICAgICAgIEFsaWFzIERTLk1vZGVsJ3MgYGNyZWF0ZWAgbWV0aG9kIHRvIGBf Y3JlYXRlYC4gVGhpcyBhbGxvd3MgdXMgdG8gY3JlYXRlIERTLk1vZGVsCiAg ICAgICAgaW5zdGFuY2VzIGZyb20gd2l0aGluIHRoZSBzdG9yZSwgYnV0IGlm IGVuZCB1c2VycyBhY2NpZGVudGFsbHkgY2FsbCBgY3JlYXRlKClgCiAgICAg ICAgKGluc3RlYWQgb2YgYGNyZWF0ZVJlY29yZCgpYCksIHdlIGNhbiByYWlz ZSBhbiBlcnJvci4KCiAgICAgICAgQG1ldGhvZCBfY3JlYXRlCiAgICAgICAg QHByaXZhdGUKICAgICAgICBAc3RhdGljCiAgICAgICovCiAgICAgIF9jcmVh dGU6IE1vZGVsLmNyZWF0ZSwKCiAgICAgIC8qKgogICAgICAgIE92ZXJyaWRl IHRoZSBjbGFzcycgYGNyZWF0ZSgpYCBtZXRob2QgdG8gcmFpc2UgYW4gZXJy b3IuIFRoaXMKICAgICAgICBwcmV2ZW50cyBlbmQgdXNlcnMgZnJvbSBpbmFk dmVydGVudGx5IGNhbGxpbmcgYGNyZWF0ZSgpYCBpbnN0ZWFkCiAgICAgICAg b2YgYGNyZWF0ZVJlY29yZCgpYC4gVGhlIHN0b3JlIGlzIHN0aWxsIGFibGUg dG8gY3JlYXRlIGluc3RhbmNlcwogICAgICAgIGJ5IGNhbGxpbmcgdGhlIGBf Y3JlYXRlKClgIG1ldGhvZC4gVG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIGEK ICAgICAgICBgRFMuTW9kZWxgIHVzZSBbc3RvcmUuY3JlYXRlUmVjb3JkXShE Uy5TdG9yZS5odG1sI21ldGhvZF9jcmVhdGVSZWNvcmQpLgoKICAgICAgICBA bWV0aG9kIGNyZWF0ZQogICAgICAgIEBwcml2YXRlCiAgICAgICAgQHN0YXRp YwogICAgICAqLwogICAgICBjcmVhdGU6IGZ1bmN0aW9uKCkgewogICAgICAg IHRocm93IG5ldyBFbWJlci5FcnJvcigiWW91IHNob3VsZCBub3QgY2FsbCBg Y3JlYXRlYCBvbiBhIG1vZGVsLiBJbnN0ZWFkLCBjYWxsIGBzdG9yZS5jcmVh dGVSZWNvcmRgIHdpdGggdGhlIGF0dHJpYnV0ZXMgeW91IHdvdWxkIGxpa2Ug dG8gc2V0LiIpOwogICAgICB9CiAgICB9KTsKCiAgICBfX2V4cG9ydHNfX1si ZGVmYXVsdCJdID0gTW9kZWw7CiAgfSk7CmRlZmluZSgiZW1iZXItZGF0YS9s aWIvc3lzdGVtL21vZGVsL3N0YXRlcyIsIAogIFsiZXhwb3J0cyJdLAogIGZ1 bmN0aW9uKF9fZXhwb3J0c19fKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICAv KioKICAgICAgQG1vZHVsZSBlbWJlci1kYXRhCiAgICAqLwoKICAgIHZhciBn ZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKICAgIC8qCiAgICAg IFRoaXMgZmlsZSBlbmNhcHN1bGF0ZXMgdGhlIHZhcmlvdXMgc3RhdGVzIHRo YXQgYSByZWNvcmQgY2FuIHRyYW5zaXRpb24KICAgICAgdGhyb3VnaCBkdXJp bmcgaXRzIGxpZmVjeWNsZS4KICAgICovCiAgICAvKioKICAgICAgIyMjIFN0 YXRlCgogICAgICBFYWNoIHJlY29yZCBoYXMgYSBgY3VycmVudFN0YXRlYCBw cm9wZXJ0eSB0aGF0IGV4cGxpY2l0bHkgdHJhY2tzIHdoYXQKICAgICAgc3Rh dGUgYSByZWNvcmQgaXMgaW4gYXQgYW55IGdpdmVuIHRpbWUuIEZvciBpbnN0 YW5jZSwgaWYgYSByZWNvcmQgaXMKICAgICAgbmV3bHkgY3JlYXRlZCBhbmQg aGFzIG5vdCB5ZXQgYmVlbiBzZW50IHRvIHRoZSBhZGFwdGVyIHRvIGJlIHNh dmVkLAogICAgICBpdCB3b3VsZCBiZSBpbiB0aGUgYHJvb3QubG9hZGVkLmNy ZWF0ZWQudW5jb21taXR0ZWRgIHN0YXRlLiAgSWYgYQogICAgICByZWNvcmQg aGFzIGhhZCBsb2NhbCBtb2RpZmljYXRpb25zIG1hZGUgdG8gaXQgdGhhdCBh cmUgaW4gdGhlCiAgICAgIHByb2Nlc3Mgb2YgYmVpbmcgc2F2ZWQsIHRoZSBy ZWNvcmQgd291bGQgYmUgaW4gdGhlCiAgICAgIGByb290LmxvYWRlZC51cGRh dGVkLmluRmxpZ2h0YCBzdGF0ZS4gKFRoZXNlIHN0YXRlIHBhdGhzIHdpbGwg YmUKICAgICAgZXhwbGFpbmVkIGluIG1vcmUgZGV0YWlsIGJlbG93LikKCiAg ICAgIEV2ZW50cyBhcmUgc2VudCBieSB0aGUgcmVjb3JkIG9yIGl0cyBzdG9y ZSB0byB0aGUgcmVjb3JkJ3MKICAgICAgYGN1cnJlbnRTdGF0ZWAgcHJvcGVy dHkuIEhvdyB0aGUgc3RhdGUgcmVhY3RzIHRvIHRoZXNlIGV2ZW50cyBpcwog ICAgICBkZXBlbmRlbnQgb24gd2hpY2ggc3RhdGUgaXQgaXMgaW4uIEluIHNv bWUgc3RhdGVzLCBjZXJ0YWluIGV2ZW50cwogICAgICB3aWxsIGJlIGludmFs aWQgYW5kIHdpbGwgY2F1c2UgYW4gZXhjZXB0aW9uIHRvIGJlIHJhaXNlZC4K CiAgICAgIFN0YXRlcyBhcmUgaGllcmFyY2hpY2FsIGFuZCBldmVyeSBzdGF0 ZSBpcyBhIHN1YnN0YXRlIG9mIHRoZQogICAgICBgUm9vdFN0YXRlYC4gRm9y IGV4YW1wbGUsIGEgcmVjb3JkIGNhbiBiZSBpbiB0aGUKICAgICAgYHJvb3Qu ZGVsZXRlZC51bmNvbW1pdHRlZGAgc3RhdGUsIHRoZW4gdHJhbnNpdGlvbiBp bnRvIHRoZQogICAgICBgcm9vdC5kZWxldGVkLmluRmxpZ2h0YCBzdGF0ZS4g SWYgYSBjaGlsZCBzdGF0ZSBkb2VzIG5vdCBpbXBsZW1lbnQKICAgICAgYW4g ZXZlbnQgaGFuZGxlciwgdGhlIHN0YXRlIG1hbmFnZXIgd2lsbCBhdHRlbXB0 IHRvIGludm9rZSB0aGUgZXZlbnQKICAgICAgb24gYWxsIHBhcmVudCBzdGF0 ZXMgdW50aWwgdGhlIHJvb3Qgc3RhdGUgaXMgcmVhY2hlZC4gVGhlIHN0YXRl CiAgICAgIGhpZXJhcmNoeSBvZiBhIHJlY29yZCBpcyBkZXNjcmliZWQgaW4g dGVybXMgb2YgYSBwYXRoIHN0cmluZy4gWW91CiAgICAgIGNhbiBkZXRlcm1p bmUgYSByZWNvcmQncyBjdXJyZW50IHN0YXRlIGJ5IGdldHRpbmcgdGhlIHN0 YXRlJ3MKICAgICAgYHN0YXRlTmFtZWAgcHJvcGVydHk6CgogICAgICBgYGBq YXZhc2NyaXB0CiAgICAgIHJlY29yZC5nZXQoJ2N1cnJlbnRTdGF0ZS5zdGF0 ZU5hbWUnKTsKICAgICAgLy89PiAicm9vdC5jcmVhdGVkLnVuY29tbWl0dGVk IgogICAgICAgYGBgCgogICAgICBUaGUgaGllcmFyY2h5IG9mIHZhbGlkIHN0 YXRlcyB0aGF0IHNoaXAgd2l0aCBlbWJlciBkYXRhIGxvb2tzIGxpa2UKICAg ICAgdGhpczoKCiAgICAgIGBgYHRleHQKICAgICAgKiByb290CiAgICAgICAg KiBkZWxldGVkCiAgICAgICAgICAqIHNhdmVkCiAgICAgICAgICAqIHVuY29t bWl0dGVkCiAgICAgICAgICAqIGluRmxpZ2h0CiAgICAgICAgKiBlbXB0eQog ICAgICAgICogbG9hZGVkCiAgICAgICAgICAqIGNyZWF0ZWQKICAgICAgICAg ICAgKiB1bmNvbW1pdHRlZAogICAgICAgICAgICAqIGluRmxpZ2h0CiAgICAg ICAgICAqIHNhdmVkCiAgICAgICAgICAqIHVwZGF0ZWQKICAgICAgICAgICAg KiB1bmNvbW1pdHRlZAogICAgICAgICAgICAqIGluRmxpZ2h0CiAgICAgICAg KiBsb2FkaW5nCiAgICAgIGBgYAoKICAgICAgVGhlIGBEUy5Nb2RlbGAgc3Rh dGVzIGFyZSB0aGVtc2VsdmVzIHN0YXRlbGVzcy4gV2hhdCB3ZSBtZWFuIGlz CiAgICAgIHRoYXQsIHRoZSBoaWVyYXJjaGljYWwgc3RhdGVzIHRoYXQgZWFj aCBvZiAqdGhvc2UqIHBvaW50cyB0byBpcyBhCiAgICAgIHNoYXJlZCBkYXRh IHN0cnVjdHVyZS4gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGluc3RlYWQg b2YgZWFjaAogICAgICByZWNvcmQgZ2V0dGluZyBpdHMgb3duIGNvcHkgb2Yg dGhlIGhpZXJhcmNoeSBvZiBzdGF0ZXMsIGVhY2ggcmVjb3JkCiAgICAgIHBv aW50cyB0byB0aGlzIGdsb2JhbCwgaW1tdXRhYmxlIHNoYXJlZCBpbnN0YW5j ZS4gSG93IGRvZXMgYSBzdGF0ZQogICAgICBrbm93IHdoaWNoIHJlY29yZCBp dCBzaG91bGQgYmUgYWN0aW5nIG9uPyBXZSBwYXNzIHRoZSByZWNvcmQKICAg ICAgaW5zdGFuY2UgaW50byB0aGUgc3RhdGUncyBldmVudCBoYW5kbGVycyBh cyB0aGUgZmlyc3QgYXJndW1lbnQuCgogICAgICBUaGUgcmVjb3JkIHBhc3Nl ZCBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIHdoZXJlIHlvdSBzaG91bGQg c3Rhc2gKICAgICAgc3RhdGUgYWJvdXQgdGhlIHJlY29yZCBpZiBuZWVkZWQ7 IHlvdSBzaG91bGQgbmV2ZXIgc3RvcmUgZGF0YSBvbiB0aGUgc3RhdGUKICAg ICAgb2JqZWN0IGl0c2VsZi4KCiAgICAgICMjIyBFdmVudHMgYW5kIEZsYWdz CgogICAgICBBIHN0YXRlIG1heSBpbXBsZW1lbnQgemVybyBvciBtb3JlIGV2 ZW50cyBhbmQgZmxhZ3MuCgogICAgICAjIyMjIEV2ZW50cwoKICAgICAgRXZl bnRzIGFyZSBuYW1lZCBmdW5jdGlvbnMgdGhhdCBhcmUgaW52b2tlZCB3aGVu IHNlbnQgdG8gYSByZWNvcmQuIFRoZQogICAgICByZWNvcmQgd2lsbCBmaXJz dCBsb29rIGZvciBhIG1ldGhvZCB3aXRoIHRoZSBnaXZlbiBuYW1lIG9uIHRo ZQogICAgICBjdXJyZW50IHN0YXRlLiBJZiBubyBtZXRob2QgaXMgZm91bmQs IGl0IHdpbGwgc2VhcmNoIHRoZSBjdXJyZW50CiAgICAgIHN0YXRlJ3MgcGFy ZW50LCBhbmQgdGhlbiBpdHMgZ3JhbmRwYXJlbnQsIGFuZCBzbyBvbiB1bnRp bCByZWFjaGluZwogICAgICB0aGUgdG9wIG9mIHRoZSBoaWVyYXJjaHkuIElm IHRoZSByb290IGlzIHJlYWNoZWQgd2l0aG91dCBhbiBldmVudAogICAgICBo YW5kbGVyIGJlaW5nIGZvdW5kLCBhbiBleGNlcHRpb24gd2lsbCBiZSByYWlz ZWQuIFRoaXMgY2FuIGJlIHZlcnkKICAgICAgaGVscGZ1bCB3aGVuIGRlYnVn Z2luZyBuZXcgZmVhdHVyZXMuCgogICAgICBIZXJlJ3MgYW4gZXhhbXBsZSBp bXBsZW1lbnRhdGlvbiBvZiBhIHN0YXRlIHdpdGggYSBgbXlFdmVudGAgZXZl bnQgaGFuZGxlcjoKCiAgICAgIGBgYGphdmFzY3JpcHQKICAgICAgYVN0YXRl OiBEUy5TdGF0ZS5jcmVhdGUoewogICAgICAgIG15RXZlbnQ6IGZ1bmN0aW9u KG1hbmFnZXIsIHBhcmFtKSB7CiAgICAgICAgICBjb25zb2xlLmxvZygiUmVj ZWl2ZWQgbXlFdmVudCB3aXRoIiwgcGFyYW0pOwogICAgICAgIH0KICAgICAg fSkKICAgICAgYGBgCgogICAgICBUbyB0cmlnZ2VyIHRoaXMgZXZlbnQ6Cgog ICAgICBgYGBqYXZhc2NyaXB0CiAgICAgIHJlY29yZC5zZW5kKCdteUV2ZW50 JywgJ2ZvbycpOwogICAgICAvLz0+ICJSZWNlaXZlZCBteUV2ZW50IHdpdGgg Zm9vIgogICAgICBgYGAKCiAgICAgIE5vdGUgdGhhdCBhbiBvcHRpb25hbCBw YXJhbWV0ZXIgY2FuIGJlIHNlbnQgdG8gYSByZWNvcmQncyBgc2VuZCgpYCBt ZXRob2QsCiAgICAgIHdoaWNoIHdpbGwgYmUgcGFzc2VkIGFzIHRoZSBzZWNv bmQgcGFyYW1ldGVyIHRvIHRoZSBldmVudCBoYW5kbGVyLgoKICAgICAgRXZl bnRzIHNob3VsZCB0cmFuc2l0aW9uIHRvIGEgZGlmZmVyZW50IHN0YXRlIGlm IGFwcHJvcHJpYXRlLiBUaGlzIGNhbiBiZQogICAgICBkb25lIGJ5IGNhbGxp bmcgdGhlIHJlY29yZCdzIGB0cmFuc2l0aW9uVG8oKWAgbWV0aG9kIHdpdGgg YSBwYXRoIHRvIHRoZQogICAgICBkZXNpcmVkIHN0YXRlLiBUaGUgc3RhdGUg bWFuYWdlciB3aWxsIGF0dGVtcHQgdG8gcmVzb2x2ZSB0aGUgc3RhdGUgcGF0 aAogICAgICByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBzdGF0ZS4gSWYgbm8g c3RhdGUgaXMgZm91bmQgYXQgdGhhdCBwYXRoLCBpdCB3aWxsCiAgICAgIGF0 dGVtcHQgdG8gcmVzb2x2ZSBpdCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBz dGF0ZSdzIHBhcmVudCwgYW5kIHRoZW4gaXRzCiAgICAgIHBhcmVudCwgYW5k IHNvIG9uIHVudGlsIHRoZSByb290IGlzIHJlYWNoZWQuIEZvciBleGFtcGxl LCBpbWFnaW5lIGEgaGllcmFyY2h5CiAgICAgIGxpa2UgdGhpczoKCiAgICAg ICAgICAqIGNyZWF0ZWQKICAgICAgICAgICAgKiB1bmNvbW1pdHRlZCA8LS0g Y3VycmVudFN0YXRlCiAgICAgICAgICAgICogaW5GbGlnaHQKICAgICAgICAg ICogdXBkYXRlZAogICAgICAgICAgICAqIGluRmxpZ2h0CgogICAgICBJZiB3 ZSBhcmUgY3VycmVudGx5IGluIHRoZSBgdW5jb21taXR0ZWRgIHN0YXRlLCBj YWxsaW5nCiAgICAgIGB0cmFuc2l0aW9uVG8oJ2luRmxpZ2h0JylgIHdvdWxk IHRyYW5zaXRpb24gdG8gdGhlIGBjcmVhdGVkLmluRmxpZ2h0YCBzdGF0ZSwK ICAgICAgd2hpbGUgY2FsbGluZyBgdHJhbnNpdGlvblRvKCd1cGRhdGVkLmlu RmxpZ2h0JylgIHdvdWxkIHRyYW5zaXRpb24gdG8KICAgICAgdGhlIGB1cGRh dGVkLmluRmxpZ2h0YCBzdGF0ZS4KCiAgICAgIFJlbWVtYmVyIHRoYXQgKm9u bHkgZXZlbnRzKiBzaG91bGQgZXZlciBjYXVzZSBhIHN0YXRlIHRyYW5zaXRp b24uIFlvdSBzaG91bGQKICAgICAgbmV2ZXIgY2FsbCBgdHJhbnNpdGlvblRv KClgIGZyb20gb3V0c2lkZSBhIHN0YXRlJ3MgZXZlbnQgaGFuZGxlci4gSWYg eW91IGFyZQogICAgICB0ZW1wdGVkIHRvIGRvIHNvLCBjcmVhdGUgYSBuZXcg ZXZlbnQgYW5kIHNlbmQgdGhhdCB0byB0aGUgc3RhdGUgbWFuYWdlci4KCiAg ICAgICMjIyMgRmxhZ3MKCiAgICAgIEZsYWdzIGFyZSBCb29sZWFuIHZhbHVl cyB0aGF0IGNhbiBiZSB1c2VkIHRvIGludHJvc3BlY3QgYSByZWNvcmQncyBj dXJyZW50CiAgICAgIHN0YXRlIGluIGEgbW9yZSB1c2VyLWZyaWVuZGx5IHdh eSB0aGFuIGV4YW1pbmluZyBpdHMgc3RhdGUgcGF0aC4gRm9yIGV4YW1wbGUs CiAgICAgIGluc3RlYWQgb2YgZG9pbmcgdGhpczoKCiAgICAgIGBgYGphdmFz Y3JpcHQKICAgICAgdmFyIHN0YXRlUGF0aCA9IHJlY29yZC5nZXQoJ3N0YXRl TWFuYWdlci5jdXJyZW50UGF0aCcpOwogICAgICBpZiAoc3RhdGVQYXRoID09 PSAnY3JlYXRlZC5pbkZsaWdodCcpIHsKICAgICAgICBkb1NvbWV0aGluZygp OwogICAgICB9CiAgICAgIGBgYAoKICAgICAgWW91IGNhbiBzYXk6CgogICAg ICBgYGBqYXZhc2NyaXB0CiAgICAgIGlmIChyZWNvcmQuZ2V0KCdpc05ldycp ICYmIHJlY29yZC5nZXQoJ2lzU2F2aW5nJykpIHsKICAgICAgICBkb1NvbWV0 aGluZygpOwogICAgICB9CiAgICAgIGBgYAoKICAgICAgSWYgeW91ciBzdGF0 ZSBkb2VzIG5vdCBzZXQgYSB2YWx1ZSBmb3IgYSBnaXZlbiBmbGFnLCB0aGUg dmFsdWUgd2lsbAogICAgICBiZSBpbmhlcml0ZWQgZnJvbSBpdHMgcGFyZW50 IChvciB0aGUgZmlyc3QgcGxhY2UgaW4gdGhlIHN0YXRlIGhpZXJhcmNoeQog ICAgICB3aGVyZSBpdCBpcyBkZWZpbmVkKS4KCiAgICAgIFRoZSBjdXJyZW50 IHNldCBvZiBmbGFncyBhcmUgZGVmaW5lZCBiZWxvdy4gSWYgeW91IHdhbnQg dG8gYWRkIGEgbmV3IGZsYWcsCiAgICAgIGluIGFkZGl0aW9uIHRvIHRoZSBh cmVhIGJlbG93LCB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gZGVjbGFyZSBpdCBp biB0aGUKICAgICAgYERTLk1vZGVsYCBjbGFzcy4KCgogICAgICAgKiBbaXNF bXB0eV0oRFMuTW9kZWwuaHRtbCNwcm9wZXJ0eV9pc0VtcHR5KQogICAgICAg KiBbaXNMb2FkaW5nXShEUy5Nb2RlbC5odG1sI3Byb3BlcnR5X2lzTG9hZGlu ZykKICAgICAgICogW2lzTG9hZGVkXShEUy5Nb2RlbC5odG1sI3Byb3BlcnR5 X2lzTG9hZGVkKQogICAgICAgKiBbaXNEaXJ0eV0oRFMuTW9kZWwuaHRtbCNw cm9wZXJ0eV9pc0RpcnR5KQogICAgICAgKiBbaXNTYXZpbmddKERTLk1vZGVs Lmh0bWwjcHJvcGVydHlfaXNTYXZpbmcpCiAgICAgICAqIFtpc0RlbGV0ZWRd KERTLk1vZGVsLmh0bWwjcHJvcGVydHlfaXNEZWxldGVkKQogICAgICAgKiBb aXNOZXddKERTLk1vZGVsLmh0bWwjcHJvcGVydHlfaXNOZXcpCiAgICAgICAq IFtpc1ZhbGlkXShEUy5Nb2RlbC5odG1sI3Byb3BlcnR5X2lzVmFsaWQpCgog ICAgICBAbmFtZXNwYWNlIERTCiAgICAgIEBjbGFzcyBSb290U3RhdGUKICAg ICovCgogICAgZnVuY3Rpb24gaGFzRGVmaW5lZFByb3BlcnRpZXMob2JqZWN0 KSB7CiAgICAgIC8vIElnbm9yZSBpbnRlcm5hbCBwcm9wZXJ0eSBkZWZpbmVk IGJ5IHNpbXVsYXRlZCBgRW1iZXIuY3JlYXRlYC4KICAgICAgdmFyIG5hbWVz ID0gRW1iZXIua2V5cyhvYmplY3QpOwogICAgICB2YXIgaSwgbCwgbmFtZTsK ICAgICAgZm9yIChpID0gMCwgbCA9IG5hbWVzLmxlbmd0aDsgaSA8IGw7IGkr KyApIHsKICAgICAgICBuYW1lID0gbmFtZXNbaV07CiAgICAgICAgaWYgKG9i amVjdC5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiBvYmplY3RbbmFtZV0pIHsg cmV0dXJuIHRydWU7IH0KICAgICAgfQoKICAgICAgcmV0dXJuIGZhbHNlOwog ICAgfQoKICAgIGZ1bmN0aW9uIGRpZFNldFByb3BlcnR5KHJlY29yZCwgY29u dGV4dCkgewogICAgICBpZiAoY29udGV4dC52YWx1ZSA9PT0gY29udGV4dC5v cmlnaW5hbFZhbHVlKSB7CiAgICAgICAgZGVsZXRlIHJlY29yZC5fYXR0cmli dXRlc1tjb250ZXh0Lm5hbWVdOwogICAgICAgIHJlY29yZC5zZW5kKCdwcm9w ZXJ0eVdhc1Jlc2V0JywgY29udGV4dC5uYW1lKTsKICAgICAgfSBlbHNlIGlm IChjb250ZXh0LnZhbHVlICE9PSBjb250ZXh0Lm9sZFZhbHVlKSB7CiAgICAg ICAgcmVjb3JkLnNlbmQoJ2JlY29tZURpcnR5Jyk7CiAgICAgIH0KCiAgICAg IHJlY29yZC51cGRhdGVSZWNvcmRBcnJheXNMYXRlcigpOwogICAgfQoKICAg IC8vIEltcGxlbWVudGF0aW9uIG5vdGVzOgogICAgLy8KICAgIC8vIEVhY2gg c3RhdGUgaGFzIGEgYm9vbGVhbiB2YWx1ZSBmb3IgYWxsIG9mIHRoZSBmb2xs b3dpbmcgZmxhZ3M6CiAgICAvLwogICAgLy8gKiBpc0xvYWRlZDogVGhlIHJl Y29yZCBoYXMgYSBwb3B1bGF0ZWQgYGRhdGFgIHByb3BlcnR5LiBXaGVuIGEK ICAgIC8vICAgcmVjb3JkIGlzIGxvYWRlZCB2aWEgYHN0b3JlLmZpbmRgLCBg aXNMb2FkZWRgIGlzIGZhbHNlCiAgICAvLyAgIHVudGlsIHRoZSBhZGFwdGVy IHNldHMgaXQuIFdoZW4gYSByZWNvcmQgaXMgY3JlYXRlZCBsb2NhbGx5LAog ICAgLy8gICBpdHMgYGlzTG9hZGVkYCBwcm9wZXJ0eSBpcyBhbHdheXMgdHJ1 ZS4KICAgIC8vICogaXNEaXJ0eTogVGhlIHJlY29yZCBoYXMgbG9jYWwgY2hh bmdlcyB0aGF0IGhhdmUgbm90IHlldCBiZWVuCiAgICAvLyAgIHNhdmVkIGJ5 IHRoZSBhZGFwdGVyLiBUaGlzIGluY2x1ZGVzIHJlY29yZHMgdGhhdCBoYXZl IGJlZW4KICAgIC8vICAgY3JlYXRlZCAoYnV0IG5vdCB5ZXQgc2F2ZWQpIG9y IGRlbGV0ZWQuCiAgICAvLyAqIGlzU2F2aW5nOiBUaGUgcmVjb3JkIGhhcyBi ZWVuIGNvbW1pdHRlZCwgYnV0CiAgICAvLyAgIHRoZSBhZGFwdGVyIGhhcyBu b3QgeWV0IGFja25vd2xlZGdlZCB0aGF0IHRoZSBjaGFuZ2VzIGhhdmUKICAg IC8vICAgYmVlbiBwZXJzaXN0ZWQgdG8gdGhlIGJhY2tlbmQuCiAgICAvLyAq IGlzRGVsZXRlZDogVGhlIHJlY29yZCB3YXMgbWFya2VkIGZvciBkZWxldGlv bi4gV2hlbiBgaXNEZWxldGVkYAogICAgLy8gICBpcyB0cnVlIGFuZCBgaXNE aXJ0eWAgaXMgdHJ1ZSwgdGhlIHJlY29yZCBpcyBkZWxldGVkIGxvY2FsbHkK ICAgIC8vICAgYnV0IHRoZSBkZWxldGlvbiB3YXMgbm90IHlldCBwZXJzaXN0 ZWQuIFdoZW4gYGlzU2F2aW5nYCBpcwogICAgLy8gICB0cnVlLCB0aGUgY2hh bmdlIGlzIGluLWZsaWdodC4gV2hlbiBib3RoIGBpc0RpcnR5YCBhbmQKICAg IC8vICAgYGlzU2F2aW5nYCBhcmUgZmFsc2UsIHRoZSBjaGFuZ2UgaGFzIHBl cnNpc3RlZC4KICAgIC8vICogaXNFcnJvcjogVGhlIGFkYXB0ZXIgcmVwb3J0 ZWQgdGhhdCBpdCB3YXMgdW5hYmxlIHRvIHNhdmUKICAgIC8vICAgbG9jYWwg Y2hhbmdlcyB0byB0aGUgYmFja2VuZC4gVGhpcyBtYXkgYWxzbyByZXN1bHQg aW4gdGhlCiAgICAvLyAgIHJlY29yZCBoYXZpbmcgaXRzIGBpc1ZhbGlkYCBw cm9wZXJ0eSBiZWNvbWUgZmFsc2UgaWYgdGhlCiAgICAvLyAgIGFkYXB0ZXIg cmVwb3J0ZWQgdGhhdCBzZXJ2ZXItc2lkZSB2YWxpZGF0aW9ucyBmYWlsZWQu CiAgICAvLyAqIGlzTmV3OiBUaGUgcmVjb3JkIHdhcyBjcmVhdGVkIG9uIHRo ZSBjbGllbnQgYW5kIHRoZSBhZGFwdGVyCiAgICAvLyAgIGRpZCBub3QgeWV0 IHJlcG9ydCB0aGF0IGl0IHdhcyBzdWNjZXNzZnVsbHkgc2F2ZWQuCiAgICAv LyAqIGlzVmFsaWQ6IE5vIGNsaWVudC1zaWRlIHZhbGlkYXRpb25zIGhhdmUg ZmFpbGVkIGFuZCB0aGUKICAgIC8vICAgYWRhcHRlciBkaWQgbm90IHJlcG9y dCBhbnkgc2VydmVyLXNpZGUgdmFsaWRhdGlvbiBmYWlsdXJlcy4KCiAgICAv LyBUaGUgZGlydHkgc3RhdGUgaXMgYSBhYnN0cmFjdCBzdGF0ZSB3aG9zZSBm dW5jdGlvbmFsaXR5IGlzCiAgICAvLyBzaGFyZWQgYmV0d2VlbiB0aGUgYGNy ZWF0ZWRgIGFuZCBgdXBkYXRlZGAgc3RhdGVzLgogICAgLy8KICAgIC8vIFRo ZSBkZWxldGVkIHN0YXRlIHNoYXJlcyB0aGUgYGlzRGlydHlgIGZsYWcgd2l0 aCB0aGUKICAgIC8vIHN1YmNsYXNzZXMgb2YgYERpcnR5U3RhdGVgLCBidXQg d2l0aCBhIHZlcnkgZGlmZmVyZW50CiAgICAvLyBpbXBsZW1lbnRhdGlvbi4K ICAgIC8vCiAgICAvLyBEaXJ0eSBzdGF0ZXMgaGF2ZSB0aHJlZSBjaGlsZCBz dGF0ZXM6CiAgICAvLwogICAgLy8gYHVuY29tbWl0dGVkYDogdGhlIHN0b3Jl IGhhcyBub3QgeWV0IGhhbmRlZCBvZmYgdGhlIHJlY29yZAogICAgLy8gICB0 byBiZSBzYXZlZC4KICAgIC8vIGBpbkZsaWdodGA6IHRoZSBzdG9yZSBoYXMg aGFuZGVkIG9mZiB0aGUgcmVjb3JkIHRvIGJlIHNhdmVkLAogICAgLy8gICBi dXQgdGhlIGFkYXB0ZXIgaGFzIG5vdCB5ZXQgYWNrbm93bGVkZ2VkIHN1Y2Nl c3MuCiAgICAvLyBgaW52YWxpZGA6IHRoZSByZWNvcmQgaGFzIGludmFsaWQg aW5mb3JtYXRpb24gYW5kIGNhbm5vdCBiZQogICAgLy8gICBzZW5kIHRvIHRo ZSBhZGFwdGVyIHlldC4KICAgIHZhciBEaXJ0eVN0YXRlID0gewogICAgICBp bml0aWFsU3RhdGU6ICd1bmNvbW1pdHRlZCcsCgogICAgICAvLyBGTEFHUwog ICAgICBpc0RpcnR5OiB0cnVlLAoKICAgICAgLy8gU1VCU1RBVEVTCgogICAg ICAvLyBXaGVuIGEgcmVjb3JkIGZpcnN0IGJlY29tZXMgZGlydHksIGl0IGlz IGB1bmNvbW1pdHRlZGAuCiAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB0aGVy ZSBhcmUgbG9jYWwgcGVuZGluZyBjaGFuZ2VzLCBidXQgdGhleQogICAgICAv LyBoYXZlIG5vdCB5ZXQgYmVndW4gdG8gYmUgc2F2ZWQsIGFuZCBhcmUgbm90 IGludmFsaWQuCiAgICAgIHVuY29tbWl0dGVkOiB7CiAgICAgICAgLy8gRVZF TlRTCiAgICAgICAgZGlkU2V0UHJvcGVydHk6IGRpZFNldFByb3BlcnR5LAoK ICAgICAgICBwcm9wZXJ0eVdhc1Jlc2V0OiBmdW5jdGlvbihyZWNvcmQsIG5h bWUpIHsKICAgICAgICAgIHZhciBzdGlsbERpcnR5ID0gZmFsc2U7CgogICAg ICAgICAgZm9yICh2YXIgcHJvcCBpbiByZWNvcmQuX2F0dHJpYnV0ZXMpIHsK ICAgICAgICAgICAgc3RpbGxEaXJ0eSA9IHRydWU7CiAgICAgICAgICAgIGJy ZWFrOwogICAgICAgICAgfQoKICAgICAgICAgIGlmICghc3RpbGxEaXJ0eSkg eyByZWNvcmQuc2VuZCgncm9sbGVkQmFjaycpOyB9CiAgICAgICAgfSwKCiAg ICAgICAgcHVzaGVkRGF0YTogRW1iZXIuSywKCiAgICAgICAgYmVjb21lRGly dHk6IEVtYmVyLkssCgogICAgICAgIHdpbGxDb21taXQ6IGZ1bmN0aW9uKHJl Y29yZCkgewogICAgICAgICAgcmVjb3JkLnRyYW5zaXRpb25UbygnaW5GbGln aHQnKTsKICAgICAgICB9LAoKICAgICAgICByZWxvYWRSZWNvcmQ6IGZ1bmN0 aW9uKHJlY29yZCwgcmVzb2x2ZSkgewogICAgICAgICAgcmVzb2x2ZShnZXQo cmVjb3JkLCAnc3RvcmUnKS5yZWxvYWRSZWNvcmQocmVjb3JkKSk7CiAgICAg ICAgfSwKCiAgICAgICAgcm9sbGVkQmFjazogZnVuY3Rpb24ocmVjb3JkKSB7 CiAgICAgICAgICByZWNvcmQudHJhbnNpdGlvblRvKCdsb2FkZWQuc2F2ZWQn KTsKICAgICAgICB9LAoKICAgICAgICBiZWNhbWVJbnZhbGlkOiBmdW5jdGlv bihyZWNvcmQpIHsKICAgICAgICAgIHJlY29yZC50cmFuc2l0aW9uVG8oJ2lu dmFsaWQnKTsKICAgICAgICB9LAoKICAgICAgICByb2xsYmFjazogZnVuY3Rp b24ocmVjb3JkKSB7CiAgICAgICAgICByZWNvcmQucm9sbGJhY2soKTsKICAg ICAgICB9CiAgICAgIH0sCgogICAgICAvLyBPbmNlIGEgcmVjb3JkIGhhcyBi ZWVuIGhhbmRlZCBvZmYgdG8gdGhlIGFkYXB0ZXIgdG8gYmUKICAgICAgLy8g c2F2ZWQsIGl0IGlzIGluIHRoZSAnaW4gZmxpZ2h0JyBzdGF0ZS4gQ2hhbmdl cyB0byB0aGUKICAgICAgLy8gcmVjb3JkIGNhbm5vdCBiZSBtYWRlIGR1cmlu ZyB0aGlzIHdpbmRvdy4KICAgICAgaW5GbGlnaHQ6IHsKICAgICAgICAvLyBG TEFHUwogICAgICAgIGlzU2F2aW5nOiB0cnVlLAoKICAgICAgICAvLyBFVkVO VFMKICAgICAgICBkaWRTZXRQcm9wZXJ0eTogZGlkU2V0UHJvcGVydHksCiAg ICAgICAgYmVjb21lRGlydHk6IEVtYmVyLkssCiAgICAgICAgcHVzaGVkRGF0 YTogRW1iZXIuSywKCiAgICAgICAgdW5sb2FkUmVjb3JkOiBmdW5jdGlvbihy ZWNvcmQpIHsKICAgICAgICAgIEVtYmVyLmFzc2VydCgiWW91IGNhbiBvbmx5 IHVubG9hZCBhIHJlY29yZCB3aGljaCBpcyBub3QgaW5GbGlnaHQuIGAiICsg RW1iZXIuaW5zcGVjdChyZWNvcmQpICsgIiBgIiwgZmFsc2UpOwogICAgICAg IH0sCgogICAgICAgIC8vIFRPRE86IE1vcmUgcm9idXN0IHNlbWFudGljcyBh cm91bmQgc2F2ZS13aGlsZS1pbi1mbGlnaHQKICAgICAgICB3aWxsQ29tbWl0 OiBFbWJlci5LLAoKICAgICAgICBkaWRDb21taXQ6IGZ1bmN0aW9uKHJlY29y ZCkgewogICAgICAgICAgdmFyIGRpcnR5VHlwZSA9IGdldCh0aGlzLCAnZGly dHlUeXBlJyk7CgogICAgICAgICAgcmVjb3JkLnRyYW5zaXRpb25Ubygnc2F2 ZWQnKTsKICAgICAgICAgIHJlY29yZC5zZW5kKCdpbnZva2VMaWZlY3ljbGVD YWxsYmFja3MnLCBkaXJ0eVR5cGUpOwogICAgICAgIH0sCgogICAgICAgIGJl Y2FtZUludmFsaWQ6IGZ1bmN0aW9uKHJlY29yZCkgewogICAgICAgICAgcmVj b3JkLnRyYW5zaXRpb25UbygnaW52YWxpZCcpOwogICAgICAgICAgcmVjb3Jk LnNlbmQoJ2ludm9rZUxpZmVjeWNsZUNhbGxiYWNrcycpOwogICAgICAgIH0s CgogICAgICAgIGJlY2FtZUVycm9yOiBmdW5jdGlvbihyZWNvcmQpIHsKICAg ICAgICAgIHJlY29yZC50cmFuc2l0aW9uVG8oJ3VuY29tbWl0dGVkJyk7CiAg ICAgICAgICByZWNvcmQudHJpZ2dlckxhdGVyKCdiZWNhbWVFcnJvcicsIHJl Y29yZCk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLy8gQSByZWNvcmQg aXMgaW4gdGhlIGBpbnZhbGlkYCBzdGF0ZSB3aGVuIGl0cyBjbGllbnQtc2lk ZQogICAgICAvLyBpbnZhbGlkYXRpb25zIGhhdmUgZmFpbGVkLCBvciBpZiB0 aGUgYWRhcHRlciBoYXMgaW5kaWNhdGVkCiAgICAgIC8vIHRoZSB0aGUgcmVj b3JkIGZhaWxlZCBzZXJ2ZXItc2lkZSBpbnZhbGlkYXRpb25zLgogICAgICBp bnZhbGlkOiB7CiAgICAgICAgLy8gRkxBR1MKICAgICAgICBpc1ZhbGlkOiBm YWxzZSwKCiAgICAgICAgLy8gRVZFTlRTCiAgICAgICAgZGVsZXRlUmVjb3Jk OiBmdW5jdGlvbihyZWNvcmQpIHsKICAgICAgICAgIHJlY29yZC50cmFuc2l0 aW9uVG8oJ2RlbGV0ZWQudW5jb21taXR0ZWQnKTsKICAgICAgICAgIHJlY29y ZC5jbGVhclJlbGF0aW9uc2hpcHMoKTsKICAgICAgICB9LAoKICAgICAgICBk aWRTZXRQcm9wZXJ0eTogZnVuY3Rpb24ocmVjb3JkLCBjb250ZXh0KSB7CiAg ICAgICAgICBnZXQocmVjb3JkLCAnZXJyb3JzJykucmVtb3ZlKGNvbnRleHQu bmFtZSk7CgogICAgICAgICAgZGlkU2V0UHJvcGVydHkocmVjb3JkLCBjb250 ZXh0KTsKICAgICAgICB9LAoKICAgICAgICBiZWNvbWVEaXJ0eTogRW1iZXIu SywKCiAgICAgICAgcm9sbGVkQmFjazogZnVuY3Rpb24ocmVjb3JkKSB7CiAg ICAgICAgICBnZXQocmVjb3JkLCAnZXJyb3JzJykuY2xlYXIoKTsKICAgICAg ICB9LAoKICAgICAgICBiZWNhbWVWYWxpZDogZnVuY3Rpb24ocmVjb3JkKSB7 CiAgICAgICAgICByZWNvcmQudHJhbnNpdGlvblRvKCd1bmNvbW1pdHRlZCcp OwogICAgICAgIH0sCgogICAgICAgIGludm9rZUxpZmVjeWNsZUNhbGxiYWNr czogZnVuY3Rpb24ocmVjb3JkKSB7CiAgICAgICAgICByZWNvcmQudHJpZ2dl ckxhdGVyKCdiZWNhbWVJbnZhbGlkJywgcmVjb3JkKTsKICAgICAgICB9CiAg ICAgIH0KICAgIH07CgogICAgLy8gVGhlIGNyZWF0ZWQgYW5kIHVwZGF0ZWQg c3RhdGVzIGFyZSBjcmVhdGVkIG91dHNpZGUgdGhlIHN0YXRlCiAgICAvLyBj aGFydCBzbyB3ZSBjYW4gcmVvcGVuIHRoZWlyIHN1YnN0YXRlcyBhbmQgYWRk IG1peGlucyBhcwogICAgLy8gbmVjZXNzYXJ5LgoKICAgIGZ1bmN0aW9uIGRl ZXBDbG9uZShvYmplY3QpIHsKICAgICAgdmFyIGNsb25lID0ge30sIHZhbHVl OwoKICAgICAgZm9yICh2YXIgcHJvcCBpbiBvYmplY3QpIHsKICAgICAgICB2 YWx1ZSA9IG9iamVjdFtwcm9wXTsKICAgICAgICBpZiAodmFsdWUgJiYgdHlw ZW9mIHZhbHVlID09PSAnb2JqZWN0JykgewogICAgICAgICAgY2xvbmVbcHJv cF0gPSBkZWVwQ2xvbmUodmFsdWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAg ICAgICBjbG9uZVtwcm9wXSA9IHZhbHVlOwogICAgICAgIH0KICAgICAgfQoK ICAgICAgcmV0dXJuIGNsb25lOwogICAgfQoKICAgIGZ1bmN0aW9uIG1peGlu KG9yaWdpbmFsLCBoYXNoKSB7CiAgICAgIGZvciAodmFyIHByb3AgaW4gaGFz aCkgewogICAgICAgIG9yaWdpbmFsW3Byb3BdID0gaGFzaFtwcm9wXTsKICAg ICAgfQoKICAgICAgcmV0dXJuIG9yaWdpbmFsOwogICAgfQoKICAgIGZ1bmN0 aW9uIGRpcnR5U3RhdGUob3B0aW9ucykgewogICAgICB2YXIgbmV3U3RhdGUg PSBkZWVwQ2xvbmUoRGlydHlTdGF0ZSk7CiAgICAgIHJldHVybiBtaXhpbihu ZXdTdGF0ZSwgb3B0aW9ucyk7CiAgICB9CgogICAgdmFyIGNyZWF0ZWRTdGF0 ZSA9IGRpcnR5U3RhdGUoewogICAgICBkaXJ0eVR5cGU6ICdjcmVhdGVkJywK ICAgICAgLy8gRkxBR1MKICAgICAgaXNOZXc6IHRydWUKICAgIH0pOwoKICAg IGNyZWF0ZWRTdGF0ZS51bmNvbW1pdHRlZC5yb2xsZWRCYWNrID0gZnVuY3Rp b24ocmVjb3JkKSB7CiAgICAgIHJlY29yZC50cmFuc2l0aW9uVG8oJ2RlbGV0 ZWQuc2F2ZWQnKTsKICAgIH07CgogICAgdmFyIHVwZGF0ZWRTdGF0ZSA9IGRp cnR5U3RhdGUoewogICAgICBkaXJ0eVR5cGU6ICd1cGRhdGVkJwogICAgfSk7 CgogICAgY3JlYXRlZFN0YXRlLnVuY29tbWl0dGVkLmRlbGV0ZVJlY29yZCA9 IGZ1bmN0aW9uKHJlY29yZCkgewogICAgICByZWNvcmQuY2xlYXJSZWxhdGlv bnNoaXBzKCk7CiAgICAgIHJlY29yZC50cmFuc2l0aW9uVG8oJ2RlbGV0ZWQu c2F2ZWQnKTsKICAgIH07CgogICAgY3JlYXRlZFN0YXRlLnVuY29tbWl0dGVk LnJvbGxiYWNrID0gZnVuY3Rpb24ocmVjb3JkKSB7CiAgICAgIERpcnR5U3Rh dGUudW5jb21taXR0ZWQucm9sbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRz KTsKICAgICAgcmVjb3JkLnRyYW5zaXRpb25UbygnZGVsZXRlZC5zYXZlZCcp OwogICAgfTsKCiAgICBjcmVhdGVkU3RhdGUudW5jb21taXR0ZWQucHJvcGVy dHlXYXNSZXNldCA9IEVtYmVyLks7CgogICAgZnVuY3Rpb24gYXNzZXJ0QWdh aW5zdFVubG9hZFJlY29yZChyZWNvcmQpIHsKICAgICAgRW1iZXIuYXNzZXJ0 KCJZb3UgY2FuIG9ubHkgdW5sb2FkIGEgcmVjb3JkIHdoaWNoIGlzIG5vdCBp bkZsaWdodC4gYCIgKyBFbWJlci5pbnNwZWN0KHJlY29yZCkgKyAiYCIsIGZh bHNlKTsKICAgIH0KCiAgICB1cGRhdGVkU3RhdGUuaW5GbGlnaHQudW5sb2Fk UmVjb3JkID0gYXNzZXJ0QWdhaW5zdFVubG9hZFJlY29yZDsKCiAgICB1cGRh dGVkU3RhdGUudW5jb21taXR0ZWQuZGVsZXRlUmVjb3JkID0gZnVuY3Rpb24o cmVjb3JkKSB7CiAgICAgIHJlY29yZC50cmFuc2l0aW9uVG8oJ2RlbGV0ZWQu dW5jb21taXR0ZWQnKTsKICAgICAgcmVjb3JkLmNsZWFyUmVsYXRpb25zaGlw cygpOwogICAgfTsKCiAgICB2YXIgUm9vdFN0YXRlID0gewogICAgICAvLyBG TEFHUwogICAgICBpc0VtcHR5OiBmYWxzZSwKICAgICAgaXNMb2FkaW5nOiBm YWxzZSwKICAgICAgaXNMb2FkZWQ6IGZhbHNlLAogICAgICBpc0RpcnR5OiBm YWxzZSwKICAgICAgaXNTYXZpbmc6IGZhbHNlLAogICAgICBpc0RlbGV0ZWQ6 IGZhbHNlLAogICAgICBpc05ldzogZmFsc2UsCiAgICAgIGlzVmFsaWQ6IHRy dWUsCgogICAgICAvLyBERUZBVUxUIEVWRU5UUwoKICAgICAgLy8gVHJ5aW5n IHRvIHJvbGwgYmFjayBpZiB5b3UncmUgbm90IGluIHRoZSBkaXJ0eSBzdGF0 ZQogICAgICAvLyBkb2Vzbid0IGNoYW5nZSB5b3VyIHN0YXRlLiBGb3IgZXhh bXBsZSwgaWYgeW91J3JlIGluIHRoZQogICAgICAvLyBpbi1mbGlnaHQgc3Rh dGUsIHJvbGxpbmcgYmFjayB0aGUgcmVjb3JkIGRvZXNuJ3QgbW92ZQogICAg ICAvLyB5b3Ugb3V0IG9mIHRoZSBpbi1mbGlnaHQgc3RhdGUuCiAgICAgIHJv bGxlZEJhY2s6IEVtYmVyLkssCiAgICAgIHVubG9hZFJlY29yZDogZnVuY3Rp b24ocmVjb3JkKSB7CiAgICAgICAgLy8gY2xlYXIgcmVsYXRpb25zaGlwcyBi ZWZvcmUgbW92aW5nIHRvIGRlbGV0ZWQgc3RhdGUKICAgICAgICAvLyBvdGhl cndpc2UgaXQgZmFpbHMKICAgICAgICByZWNvcmQuY2xlYXJSZWxhdGlvbnNo aXBzKCk7CiAgICAgICAgcmVjb3JkLnRyYW5zaXRpb25UbygnZGVsZXRlZC5z YXZlZCcpOwogICAgICB9LAoKCiAgICAgIHByb3BlcnR5V2FzUmVzZXQ6IEVt YmVyLkssCgogICAgICAvLyBTVUJTVEFURVMKCiAgICAgIC8vIEEgcmVjb3Jk IGJlZ2lucyBpdHMgbGlmZWN5Y2xlIGluIHRoZSBgZW1wdHlgIHN0YXRlLgog ICAgICAvLyBJZiBpdHMgZGF0YSB3aWxsIGNvbWUgZnJvbSB0aGUgYWRhcHRl ciwgaXQgd2lsbAogICAgICAvLyB0cmFuc2l0aW9uIGludG8gdGhlIGBsb2Fk aW5nYCBzdGF0ZS4gT3RoZXJ3aXNlLCBpZgogICAgICAvLyB0aGUgcmVjb3Jk IGlzIGJlaW5nIGNyZWF0ZWQgb24gdGhlIGNsaWVudCwgaXQgd2lsbAogICAg ICAvLyB0cmFuc2l0aW9uIGludG8gdGhlIGBjcmVhdGVkYCBzdGF0ZS4KICAg ICAgZW1wdHk6IHsKICAgICAgICBpc0VtcHR5OiB0cnVlLAoKICAgICAgICAv LyBFVkVOVFMKICAgICAgICBsb2FkaW5nRGF0YTogZnVuY3Rpb24ocmVjb3Jk LCBwcm9taXNlKSB7CiAgICAgICAgICByZWNvcmQuX2xvYWRpbmdQcm9taXNl ID0gcHJvbWlzZTsKICAgICAgICAgIHJlY29yZC50cmFuc2l0aW9uVG8oJ2xv YWRpbmcnKTsKICAgICAgICB9LAoKICAgICAgICBsb2FkZWREYXRhOiBmdW5j dGlvbihyZWNvcmQpIHsKICAgICAgICAgIHJlY29yZC50cmFuc2l0aW9uVG8o J2xvYWRlZC5jcmVhdGVkLnVuY29tbWl0dGVkJyk7CgogICAgICAgICAgcmVj b3JkLnN1c3BlbmRSZWxhdGlvbnNoaXBPYnNlcnZlcnMoZnVuY3Rpb24oKSB7 CiAgICAgICAgICAgIHJlY29yZC5ub3RpZnlQcm9wZXJ0eUNoYW5nZSgnZGF0 YScpOwogICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgcHVzaGVk RGF0YTogZnVuY3Rpb24ocmVjb3JkKSB7CiAgICAgICAgICByZWNvcmQudHJh bnNpdGlvblRvKCdsb2FkZWQuc2F2ZWQnKTsKICAgICAgICAgIHJlY29yZC50 cmlnZ2VyTGF0ZXIoJ2RpZExvYWQnKTsKICAgICAgICB9CiAgICAgIH0sCgog ICAgICAvLyBBIHJlY29yZCBlbnRlcnMgdGhpcyBzdGF0ZSB3aGVuIHRoZSBz dG9yZSBhc2tzCiAgICAgIC8vIHRoZSBhZGFwdGVyIGZvciBpdHMgZGF0YS4g SXQgcmVtYWlucyBpbiB0aGlzIHN0YXRlCiAgICAgIC8vIHVudGlsIHRoZSBh ZGFwdGVyIHByb3ZpZGVzIHRoZSByZXF1ZXN0ZWQgZGF0YS4KICAgICAgLy8K ICAgICAgLy8gVXN1YWxseSwgdGhpcyBwcm9jZXNzIGlzIGFzeW5jaHJvbm91 cywgdXNpbmcgYW4KICAgICAgLy8gWEhSIHRvIHJldHJpZXZlIHRoZSBkYXRh LgogICAgICBsb2FkaW5nOiB7CiAgICAgICAgLy8gRkxBR1MKICAgICAgICBp c0xvYWRpbmc6IHRydWUsCgogICAgICAgIGV4aXQ6IGZ1bmN0aW9uKHJlY29y ZCkgewogICAgICAgICAgcmVjb3JkLl9sb2FkaW5nUHJvbWlzZSA9IG51bGw7 CiAgICAgICAgfSwKCiAgICAgICAgLy8gRVZFTlRTCiAgICAgICAgcHVzaGVk RGF0YTogZnVuY3Rpb24ocmVjb3JkKSB7CiAgICAgICAgICByZWNvcmQudHJh bnNpdGlvblRvKCdsb2FkZWQuc2F2ZWQnKTsKICAgICAgICAgIHJlY29yZC50 cmlnZ2VyTGF0ZXIoJ2RpZExvYWQnKTsKICAgICAgICAgIHNldChyZWNvcmQs ICdpc0Vycm9yJywgZmFsc2UpOwogICAgICAgIH0sCgogICAgICAgIGJlY2Ft ZUVycm9yOiBmdW5jdGlvbihyZWNvcmQpIHsKICAgICAgICAgIHJlY29yZC50 cmlnZ2VyTGF0ZXIoJ2JlY2FtZUVycm9yJywgcmVjb3JkKTsKICAgICAgICB9 LAoKICAgICAgICBub3RGb3VuZDogZnVuY3Rpb24ocmVjb3JkKSB7CiAgICAg ICAgICByZWNvcmQudHJhbnNpdGlvblRvKCdlbXB0eScpOwogICAgICAgIH0K ICAgICAgfSwKCiAgICAgIC8vIEEgcmVjb3JkIGVudGVycyB0aGlzIHN0YXRl IHdoZW4gaXRzIGRhdGEgaXMgcG9wdWxhdGVkLgogICAgICAvLyBNb3N0IG9m IGEgcmVjb3JkJ3MgbGlmZWN5Y2xlIGlzIHNwZW50IGluc2lkZSBzdWJzdGF0 ZXMKICAgICAgLy8gb2YgdGhlIGBsb2FkZWRgIHN0YXRlLgogICAgICBsb2Fk ZWQ6IHsKICAgICAgICBpbml0aWFsU3RhdGU6ICdzYXZlZCcsCgogICAgICAg IC8vIEZMQUdTCiAgICAgICAgaXNMb2FkZWQ6IHRydWUsCgogICAgICAgIC8v IFNVQlNUQVRFUwoKICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gbG9jYWwg Y2hhbmdlcyB0byBhIHJlY29yZCwgaXQgcmVtYWlucwogICAgICAgIC8vIGlu IHRoZSBgc2F2ZWRgIHN0YXRlLgogICAgICAgIHNhdmVkOiB7CiAgICAgICAg ICBzZXR1cDogZnVuY3Rpb24ocmVjb3JkKSB7CiAgICAgICAgICAgIHZhciBh dHRycyA9IHJlY29yZC5fYXR0cmlidXRlcywKICAgICAgICAgICAgICAgIGlz RGlydHkgPSBmYWxzZTsKCiAgICAgICAgICAgIGZvciAodmFyIHByb3AgaW4g YXR0cnMpIHsKICAgICAgICAgICAgICBpZiAoYXR0cnMuaGFzT3duUHJvcGVy dHkocHJvcCkpIHsKICAgICAgICAgICAgICAgIGlzRGlydHkgPSB0cnVlOwog ICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAg ICAgICB9CgogICAgICAgICAgICBpZiAoaXNEaXJ0eSkgewogICAgICAgICAg ICAgIHJlY29yZC5hZGFwdGVyRGlkRGlydHkoKTsKICAgICAgICAgICAgfQog ICAgICAgICAgfSwKCiAgICAgICAgICAvLyBFVkVOVFMKICAgICAgICAgIGRp ZFNldFByb3BlcnR5OiBkaWRTZXRQcm9wZXJ0eSwKCiAgICAgICAgICBwdXNo ZWREYXRhOiBFbWJlci5LLAoKICAgICAgICAgIGJlY29tZURpcnR5OiBmdW5j dGlvbihyZWNvcmQpIHsKICAgICAgICAgICAgcmVjb3JkLnRyYW5zaXRpb25U bygndXBkYXRlZC51bmNvbW1pdHRlZCcpOwogICAgICAgICAgfSwKCiAgICAg ICAgICB3aWxsQ29tbWl0OiBmdW5jdGlvbihyZWNvcmQpIHsKICAgICAgICAg ICAgcmVjb3JkLnRyYW5zaXRpb25UbygndXBkYXRlZC5pbkZsaWdodCcpOwog ICAgICAgICAgfSwKCiAgICAgICAgICByZWxvYWRSZWNvcmQ6IGZ1bmN0aW9u KHJlY29yZCwgcmVzb2x2ZSkgewogICAgICAgICAgICByZXNvbHZlKGdldChy ZWNvcmQsICdzdG9yZScpLnJlbG9hZFJlY29yZChyZWNvcmQpKTsKICAgICAg ICAgIH0sCgogICAgICAgICAgZGVsZXRlUmVjb3JkOiBmdW5jdGlvbihyZWNv cmQpIHsKICAgICAgICAgICAgcmVjb3JkLnRyYW5zaXRpb25UbygnZGVsZXRl ZC51bmNvbW1pdHRlZCcpOwogICAgICAgICAgICByZWNvcmQuY2xlYXJSZWxh dGlvbnNoaXBzKCk7CiAgICAgICAgICB9LAoKICAgICAgICAgIHVubG9hZFJl Y29yZDogZnVuY3Rpb24ocmVjb3JkKSB7CiAgICAgICAgICAgIC8vIGNsZWFy IHJlbGF0aW9uc2hpcHMgYmVmb3JlIG1vdmluZyB0byBkZWxldGVkIHN0YXRl CiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBpdCBmYWlscwogICAgICAgICAg ICByZWNvcmQuY2xlYXJSZWxhdGlvbnNoaXBzKCk7CiAgICAgICAgICAgIHJl Y29yZC50cmFuc2l0aW9uVG8oJ2RlbGV0ZWQuc2F2ZWQnKTsKICAgICAgICAg IH0sCgogICAgICAgICAgZGlkQ29tbWl0OiBmdW5jdGlvbihyZWNvcmQpIHsK ICAgICAgICAgICAgcmVjb3JkLnNlbmQoJ2ludm9rZUxpZmVjeWNsZUNhbGxi YWNrcycsIGdldChyZWNvcmQsICdsYXN0RGlydHlUeXBlJykpOwogICAgICAg ICAgfSwKCiAgICAgICAgICAvLyBsb2FkZWQuc2F2ZWQubm90Rm91bmQgd291 bGQgYmUgdHJpZ2dlcmVkIGJ5IGEgZmFpbGVkCiAgICAgICAgICAvLyBgcmVs b2FkKClgIG9uIGFuIHVuY2hhbmdlZCByZWNvcmQKICAgICAgICAgIG5vdEZv dW5kOiBFbWJlci5LCgogICAgICAgIH0sCgogICAgICAgIC8vIEEgcmVjb3Jk IGlzIGluIHRoaXMgc3RhdGUgYWZ0ZXIgaXQgaGFzIGJlZW4gbG9jYWxseQog ICAgICAgIC8vIGNyZWF0ZWQgYnV0IGJlZm9yZSB0aGUgYWRhcHRlciBoYXMg aW5kaWNhdGVkIHRoYXQKICAgICAgICAvLyBpdCBoYXMgYmVlbiBzYXZlZC4K ICAgICAgICBjcmVhdGVkOiBjcmVhdGVkU3RhdGUsCgogICAgICAgIC8vIEEg cmVjb3JkIGlzIGluIHRoaXMgc3RhdGUgaWYgaXQgaGFzIGFscmVhZHkgYmVl bgogICAgICAgIC8vIHNhdmVkIHRvIHRoZSBzZXJ2ZXIsIGJ1dCB0aGVyZSBh cmUgbmV3IGxvY2FsIGNoYW5nZXMKICAgICAgICAvLyB0aGF0IGhhdmUgbm90 IHlldCBiZWVuIHNhdmVkLgogICAgICAgIHVwZGF0ZWQ6IHVwZGF0ZWRTdGF0 ZQogICAgICB9LAoKICAgICAgLy8gQSByZWNvcmQgaXMgaW4gdGhpcyBzdGF0 ZSBpZiBpdCB3YXMgZGVsZXRlZCBmcm9tIHRoZSBzdG9yZS4KICAgICAgZGVs ZXRlZDogewogICAgICAgIGluaXRpYWxTdGF0ZTogJ3VuY29tbWl0dGVkJywK ICAgICAgICBkaXJ0eVR5cGU6ICdkZWxldGVkJywKCiAgICAgICAgLy8gRkxB R1MKICAgICAgICBpc0RlbGV0ZWQ6IHRydWUsCiAgICAgICAgaXNMb2FkZWQ6 IHRydWUsCiAgICAgICAgaXNEaXJ0eTogdHJ1ZSwKCiAgICAgICAgLy8gVFJB TlNJVElPTlMKICAgICAgICBzZXR1cDogZnVuY3Rpb24ocmVjb3JkKSB7CiAg ICAgICAgICByZWNvcmQudXBkYXRlUmVjb3JkQXJyYXlzKCk7CiAgICAgICAg fSwKCiAgICAgICAgLy8gU1VCU1RBVEVTCgogICAgICAgIC8vIFdoZW4gYSBy ZWNvcmQgaXMgZGVsZXRlZCwgaXQgZW50ZXJzIHRoZSBgc3RhcnRgCiAgICAg ICAgLy8gc3RhdGUuIEl0IHdpbGwgZXhpdCB0aGlzIHN0YXRlIHdoZW4gdGhl IHJlY29yZAogICAgICAgIC8vIHN0YXJ0cyB0byBjb21taXQuCiAgICAgICAg dW5jb21taXR0ZWQ6IHsKCiAgICAgICAgICAvLyBFVkVOVFMKCiAgICAgICAg ICB3aWxsQ29tbWl0OiBmdW5jdGlvbihyZWNvcmQpIHsKICAgICAgICAgICAg cmVjb3JkLnRyYW5zaXRpb25UbygnaW5GbGlnaHQnKTsKICAgICAgICAgIH0s CgogICAgICAgICAgcm9sbGJhY2s6IGZ1bmN0aW9uKHJlY29yZCkgewogICAg ICAgICAgICByZWNvcmQucm9sbGJhY2soKTsKICAgICAgICAgIH0sCgogICAg ICAgICAgYmVjb21lRGlydHk6IEVtYmVyLkssCiAgICAgICAgICBkZWxldGVS ZWNvcmQ6IEVtYmVyLkssCgogICAgICAgICAgcm9sbGVkQmFjazogZnVuY3Rp b24ocmVjb3JkKSB7CiAgICAgICAgICAgIHJlY29yZC50cmFuc2l0aW9uVG8o J2xvYWRlZC5zYXZlZCcpOwogICAgICAgICAgfQogICAgICAgIH0sCgogICAg ICAgIC8vIEFmdGVyIGEgcmVjb3JkIHN0YXJ0cyBjb21taXR0aW5nLCBidXQK ICAgICAgICAvLyBiZWZvcmUgdGhlIGFkYXB0ZXIgaW5kaWNhdGVzIHRoYXQg dGhlIGRlbGV0aW9uCiAgICAgICAgLy8gaGFzIHNhdmVkIHRvIHRoZSBzZXJ2 ZXIsIGEgcmVjb3JkIGlzIGluIHRoZQogICAgICAgIC8vIGBpbkZsaWdodGAg c3Vic3RhdGUgb2YgYGRlbGV0ZWRgLgogICAgICAgIGluRmxpZ2h0OiB7CiAg ICAgICAgICAvLyBGTEFHUwogICAgICAgICAgaXNTYXZpbmc6IHRydWUsCgog ICAgICAgICAgLy8gRVZFTlRTCgogICAgICAgICAgdW5sb2FkUmVjb3JkOiBh c3NlcnRBZ2FpbnN0VW5sb2FkUmVjb3JkLAoKICAgICAgICAgIC8vIFRPRE86 IE1vcmUgcm9idXN0IHNlbWFudGljcyBhcm91bmQgc2F2ZS13aGlsZS1pbi1m bGlnaHQKICAgICAgICAgIHdpbGxDb21taXQ6IEVtYmVyLkssCiAgICAgICAg ICBkaWRDb21taXQ6IGZ1bmN0aW9uKHJlY29yZCkgewogICAgICAgICAgICBy ZWNvcmQudHJhbnNpdGlvblRvKCdzYXZlZCcpOwoKICAgICAgICAgICAgcmVj b3JkLnNlbmQoJ2ludm9rZUxpZmVjeWNsZUNhbGxiYWNrcycpOwogICAgICAg ICAgfSwKCiAgICAgICAgICBiZWNhbWVFcnJvcjogZnVuY3Rpb24ocmVjb3Jk KSB7CiAgICAgICAgICAgIHJlY29yZC50cmFuc2l0aW9uVG8oJ3VuY29tbWl0 dGVkJyk7CiAgICAgICAgICAgIHJlY29yZC50cmlnZ2VyTGF0ZXIoJ2JlY2Ft ZUVycm9yJywgcmVjb3JkKTsKICAgICAgICAgIH0KICAgICAgICB9LAoKICAg ICAgICAvLyBPbmNlIHRoZSBhZGFwdGVyIGluZGljYXRlcyB0aGF0IHRoZSBk ZWxldGlvbiBoYXMKICAgICAgICAvLyBiZWVuIHNhdmVkLCB0aGUgcmVjb3Jk IGVudGVycyB0aGUgYHNhdmVkYCBzdWJzdGF0ZQogICAgICAgIC8vIG9mIGBk ZWxldGVkYC4KICAgICAgICBzYXZlZDogewogICAgICAgICAgLy8gRkxBR1MK ICAgICAgICAgIGlzRGlydHk6IGZhbHNlLAoKICAgICAgICAgIHNldHVwOiBm dW5jdGlvbihyZWNvcmQpIHsKICAgICAgICAgICAgdmFyIHN0b3JlID0gZ2V0 KHJlY29yZCwgJ3N0b3JlJyk7CiAgICAgICAgICAgIHN0b3JlLmRlbWF0ZXJp YWxpemVSZWNvcmQocmVjb3JkKTsKICAgICAgICAgIH0sCgogICAgICAgICAg aW52b2tlTGlmZWN5Y2xlQ2FsbGJhY2tzOiBmdW5jdGlvbihyZWNvcmQpIHsK ICAgICAgICAgICAgcmVjb3JkLnRyaWdnZXJMYXRlcignZGlkRGVsZXRlJywg cmVjb3JkKTsKICAgICAgICAgICAgcmVjb3JkLnRyaWdnZXJMYXRlcignZGlk Q29tbWl0JywgcmVjb3JkKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAg IH0sCgogICAgICBpbnZva2VMaWZlY3ljbGVDYWxsYmFja3M6IGZ1bmN0aW9u KHJlY29yZCwgZGlydHlUeXBlKSB7CiAgICAgICAgaWYgKGRpcnR5VHlwZSA9 PT0gJ2NyZWF0ZWQnKSB7CiAgICAgICAgICByZWNvcmQudHJpZ2dlckxhdGVy KCdkaWRDcmVhdGUnLCByZWNvcmQpOwogICAgICAgIH0gZWxzZSB7CiAgICAg ICAgICByZWNvcmQudHJpZ2dlckxhdGVyKCdkaWRVcGRhdGUnLCByZWNvcmQp OwogICAgICAgIH0KCiAgICAgICAgcmVjb3JkLnRyaWdnZXJMYXRlcignZGlk Q29tbWl0JywgcmVjb3JkKTsKICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlv biB3aXJlU3RhdGUob2JqZWN0LCBwYXJlbnQsIG5hbWUpIHsKICAgICAgLypq c2hpbnQgcHJvdG86dHJ1ZSovCiAgICAgIC8vIFRPRE86IFVzZSBPYmplY3Qu Y3JlYXRlIGFuZCBjb3B5IGluc3RlYWQKICAgICAgb2JqZWN0ID0gbWl4aW4o cGFyZW50ID8gRW1iZXIuY3JlYXRlKHBhcmVudCkgOiB7fSwgb2JqZWN0KTsK ICAgICAgb2JqZWN0LnBhcmVudFN0YXRlID0gcGFyZW50OwogICAgICBvYmpl Y3Quc3RhdGVOYW1lID0gbmFtZTsKCiAgICAgIGZvciAodmFyIHByb3AgaW4g b2JqZWN0KSB7CiAgICAgICAgaWYgKCFvYmplY3QuaGFzT3duUHJvcGVydHko cHJvcCkgfHwgcHJvcCA9PT0gJ3BhcmVudFN0YXRlJyB8fCBwcm9wID09PSAn c3RhdGVOYW1lJykgeyBjb250aW51ZTsgfQogICAgICAgIGlmICh0eXBlb2Yg b2JqZWN0W3Byb3BdID09PSAnb2JqZWN0JykgewogICAgICAgICAgb2JqZWN0 W3Byb3BdID0gd2lyZVN0YXRlKG9iamVjdFtwcm9wXSwgb2JqZWN0LCBuYW1l ICsgIi4iICsgcHJvcCk7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1 cm4gb2JqZWN0OwogICAgfQoKICAgIFJvb3RTdGF0ZSA9IHdpcmVTdGF0ZShS b290U3RhdGUsIG51bGwsICJyb290Iik7CgogICAgX19leHBvcnRzX19bImRl ZmF1bHQiXSA9IFJvb3RTdGF0ZTsKICB9KTsKZGVmaW5lKCJlbWJlci1kYXRh L2xpYi9zeXN0ZW0vcmVjb3JkX2FycmF5X21hbmFnZXIiLCAKICBbIi4vcmVj b3JkX2FycmF5cyIsImV4cG9ydHMiXSwKICBmdW5jdGlvbihfX2RlcGVuZGVu Y3kxX18sIF9fZXhwb3J0c19fKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICAv KioKICAgICAgQG1vZHVsZSBlbWJlci1kYXRhCiAgICAqLwoKICAgIHZhciBN YW55QXJyYXkgPSBfX2RlcGVuZGVuY3kxX18uTWFueUFycmF5OwogICAgdmFy IGdldCA9IEVtYmVyLmdldCwgc2V0ID0gRW1iZXIuc2V0OwogICAgdmFyIGZv ckVhY2ggPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMuZm9yRWFjaDsKCiAgICAv KioKICAgICAgQGNsYXNzIFJlY29yZEFycmF5TWFuYWdlcgogICAgICBAbmFt ZXNwYWNlIERTCiAgICAgIEBwcml2YXRlCiAgICAgIEBleHRlbmRzIEVtYmVy Lk9iamVjdAogICAgKi8KICAgIHZhciBSZWNvcmRBcnJheU1hbmFnZXIgPSBF bWJlci5PYmplY3QuZXh0ZW5kKHsKICAgICAgaW5pdDogZnVuY3Rpb24oKSB7 CiAgICAgICAgdGhpcy5maWx0ZXJlZFJlY29yZEFycmF5cyA9IEVtYmVyLk1h cFdpdGhEZWZhdWx0LmNyZWF0ZSh7CiAgICAgICAgICBkZWZhdWx0VmFsdWU6 IGZ1bmN0aW9uKCkgeyByZXR1cm4gW107IH0KICAgICAgICB9KTsKCiAgICAg ICAgdGhpcy5jaGFuZ2VkUmVjb3JkcyA9IFtdOwogICAgICAgIHRoaXMuX2Fk YXB0ZXJQb3B1bGF0ZWRSZWNvcmRBcnJheXMgPSBbXTsKICAgICAgfSwKCiAg ICAgIHJlY29yZERpZENoYW5nZTogZnVuY3Rpb24ocmVjb3JkKSB7CiAgICAg ICAgaWYgKHRoaXMuY2hhbmdlZFJlY29yZHMucHVzaChyZWNvcmQpICE9PSAx KSB7IHJldHVybjsgfQoKICAgICAgICBFbWJlci5ydW4uc2NoZWR1bGUoJ2Fj dGlvbnMnLCB0aGlzLCB0aGlzLnVwZGF0ZVJlY29yZEFycmF5cyk7CiAgICAg IH0sCgogICAgICByZWNvcmRBcnJheXNGb3JSZWNvcmQ6IGZ1bmN0aW9uKHJl Y29yZCkgewogICAgICAgIHJlY29yZC5fcmVjb3JkQXJyYXlzID0gcmVjb3Jk Ll9yZWNvcmRBcnJheXMgfHwgRW1iZXIuT3JkZXJlZFNldC5jcmVhdGUoKTsK ICAgICAgICByZXR1cm4gcmVjb3JkLl9yZWNvcmRBcnJheXM7CiAgICAgIH0s CgogICAgICAvKioKICAgICAgICBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIHdo ZW5ldmVyIGRhdGEgaXMgbG9hZGVkIGludG8gdGhlIHN0b3JlIGJ5IHRoZQog ICAgICAgIGFkYXB0ZXIgb3IgdXBkYXRlZCBieSB0aGUgYWRhcHRlciwgb3Ig d2hlbiBhIHJlY29yZCBoYXMgY2hhbmdlZC4KCiAgICAgICAgSXQgdXBkYXRl cyBhbGwgcmVjb3JkIGFycmF5cyB0aGF0IGEgcmVjb3JkIGJlbG9uZ3MgdG8u CgogICAgICAgIFRvIGF2b2lkIHRocmFzaGluZywgaXQgb25seSBydW5zIGF0 IG1vc3Qgb25jZSBwZXIgcnVuIGxvb3AuCgogICAgICAgIEBtZXRob2QgdXBk YXRlUmVjb3JkQXJyYXlzCiAgICAgICAgQHBhcmFtIHtDbGFzc30gdHlwZQog ICAgICAgIEBwYXJhbSB7TnVtYmVyfFN0cmluZ30gY2xpZW50SWQKICAgICAg Ki8KICAgICAgdXBkYXRlUmVjb3JkQXJyYXlzOiBmdW5jdGlvbigpIHsKICAg ICAgICBmb3JFYWNoKHRoaXMuY2hhbmdlZFJlY29yZHMsIGZ1bmN0aW9uKHJl Y29yZCkgewogICAgICAgICAgaWYgKGdldChyZWNvcmQsICdpc0RlbGV0ZWQn KSkgewogICAgICAgICAgICB0aGlzLl9yZWNvcmRXYXNEZWxldGVkKHJlY29y ZCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLl9yZWNv cmRXYXNDaGFuZ2VkKHJlY29yZCk7CiAgICAgICAgICB9CiAgICAgICAgfSwg dGhpcyk7CgogICAgICAgIHRoaXMuY2hhbmdlZFJlY29yZHMubGVuZ3RoID0g MDsKICAgICAgfSwKCiAgICAgIF9yZWNvcmRXYXNEZWxldGVkOiBmdW5jdGlv biAocmVjb3JkKSB7CiAgICAgICAgdmFyIHJlY29yZEFycmF5cyA9IHJlY29y ZC5fcmVjb3JkQXJyYXlzOwoKICAgICAgICBpZiAoIXJlY29yZEFycmF5cykg eyByZXR1cm47IH0KCiAgICAgICAgZm9yRWFjaChyZWNvcmRBcnJheXMsIGZ1 bmN0aW9uKGFycmF5KSB7CiAgICAgICAgICBhcnJheS5yZW1vdmVSZWNvcmQo cmVjb3JkKTsKICAgICAgICB9KTsKICAgICAgfSwKCiAgICAgIF9yZWNvcmRX YXNDaGFuZ2VkOiBmdW5jdGlvbiAocmVjb3JkKSB7CiAgICAgICAgdmFyIHR5 cGUgPSByZWNvcmQuY29uc3RydWN0b3IsCiAgICAgICAgICAgIHJlY29yZEFy cmF5cyA9IHRoaXMuZmlsdGVyZWRSZWNvcmRBcnJheXMuZ2V0KHR5cGUpLAog ICAgICAgICAgICBmaWx0ZXI7CgogICAgICAgIGZvckVhY2gocmVjb3JkQXJy YXlzLCBmdW5jdGlvbihhcnJheSkgewogICAgICAgICAgZmlsdGVyID0gZ2V0 KGFycmF5LCAnZmlsdGVyRnVuY3Rpb24nKTsKICAgICAgICAgIHRoaXMudXBk YXRlUmVjb3JkQXJyYXkoYXJyYXksIGZpbHRlciwgdHlwZSwgcmVjb3JkKTsK ICAgICAgICB9LCB0aGlzKTsKCiAgICAgICAgLy8gbG9vcCB0aHJvdWdoIGFs bCBtYW55QXJyYXlzIGNvbnRhaW5pbmcgYW4gdW5sb2FkZWQgY29weSBvZiB0 aGlzCiAgICAgICAgLy8gY2xpZW50SWQgYW5kIG5vdGlmeSB0aGVtIHRoYXQg dGhlIHJlY29yZCB3YXMgbG9hZGVkLgogICAgICAgIHZhciBtYW55QXJyYXlz ID0gcmVjb3JkLl9sb2FkaW5nUmVjb3JkQXJyYXlzOwoKICAgICAgICBpZiAo bWFueUFycmF5cykgewogICAgICAgICAgZm9yICh2YXIgaT0wLCBsPW1hbnlB cnJheXMubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAgICAgICBtYW55QXJy YXlzW2ldLmxvYWRlZFJlY29yZCgpOwogICAgICAgICAgfQoKICAgICAgICAg IHJlY29yZC5fbG9hZGluZ1JlY29yZEFycmF5cyA9IFtdOwogICAgICAgIH0K ICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgIFVwZGF0ZSBhbiBpbmRpdmlk dWFsIGZpbHRlci4KCiAgICAgICAgQG1ldGhvZCB1cGRhdGVSZWNvcmRBcnJh eQogICAgICAgIEBwYXJhbSB7RFMuRmlsdGVyZWRSZWNvcmRBcnJheX0gYXJy YXkKICAgICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBmaWx0ZXIKICAgICAgICBA cGFyYW0ge0NsYXNzfSB0eXBlCiAgICAgICAgQHBhcmFtIHtOdW1iZXJ8U3Ry aW5nfSBjbGllbnRJZAogICAgICAqLwogICAgICB1cGRhdGVSZWNvcmRBcnJh eTogZnVuY3Rpb24oYXJyYXksIGZpbHRlciwgdHlwZSwgcmVjb3JkKSB7CiAg ICAgICAgdmFyIHNob3VsZEJlSW5BcnJheTsKCiAgICAgICAgaWYgKCFmaWx0 ZXIpIHsKICAgICAgICAgIHNob3VsZEJlSW5BcnJheSA9IHRydWU7CiAgICAg ICAgfSBlbHNlIHsKICAgICAgICAgIHNob3VsZEJlSW5BcnJheSA9IGZpbHRl cihyZWNvcmQpOwogICAgICAgIH0KCiAgICAgICAgdmFyIHJlY29yZEFycmF5 cyA9IHRoaXMucmVjb3JkQXJyYXlzRm9yUmVjb3JkKHJlY29yZCk7CgogICAg ICAgIGlmIChzaG91bGRCZUluQXJyYXkpIHsKICAgICAgICAgIHJlY29yZEFy cmF5cy5hZGQoYXJyYXkpOwogICAgICAgICAgYXJyYXkuYWRkUmVjb3JkKHJl Y29yZCk7CiAgICAgICAgfSBlbHNlIGlmICghc2hvdWxkQmVJbkFycmF5KSB7 CiAgICAgICAgICByZWNvcmRBcnJheXMucmVtb3ZlKGFycmF5KTsKICAgICAg ICAgIGFycmF5LnJlbW92ZVJlY29yZChyZWNvcmQpOwogICAgICAgIH0KICAg ICAgfSwKCiAgICAgIC8qKgogICAgICAgIFRoaXMgbWV0aG9kIGlzIGludm9r ZWQgaWYgdGhlIGBmaWx0ZXJGdW5jdGlvbmAgcHJvcGVydHkgaXMKICAgICAg ICBjaGFuZ2VkIG9uIGEgYERTLkZpbHRlcmVkUmVjb3JkQXJyYXlgLgoKICAg ICAgICBJdCBlc3NlbnRpYWxseSByZS1ydW5zIHRoZSBmaWx0ZXIgZnJvbSBz Y3JhdGNoLiBUaGlzIHNhbWUKICAgICAgICBtZXRob2QgaXMgaW52b2tlZCB3 aGVuIHRoZSBmaWx0ZXIgaXMgY3JlYXRlZCBpbiB0aCBmaXJzdCBwbGFjZS4K CiAgICAgICAgQG1ldGhvZCB1cGRhdGVGaWx0ZXIKICAgICAgICBAcGFyYW0g YXJyYXkKICAgICAgICBAcGFyYW0gdHlwZQogICAgICAgIEBwYXJhbSBmaWx0 ZXIKICAgICAgKi8KICAgICAgdXBkYXRlRmlsdGVyOiBmdW5jdGlvbihhcnJh eSwgdHlwZSwgZmlsdGVyKSB7CiAgICAgICAgdmFyIHR5cGVNYXAgPSB0aGlz LnN0b3JlLnR5cGVNYXBGb3IodHlwZSksCiAgICAgICAgICAgIHJlY29yZHMg PSB0eXBlTWFwLnJlY29yZHMsIHJlY29yZDsKCiAgICAgICAgZm9yICh2YXIg aT0wLCBsPXJlY29yZHMubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAgICAg cmVjb3JkID0gcmVjb3Jkc1tpXTsKCiAgICAgICAgICBpZiAoIWdldChyZWNv cmQsICdpc0RlbGV0ZWQnKSAmJiAhZ2V0KHJlY29yZCwgJ2lzRW1wdHknKSkg ewogICAgICAgICAgICB0aGlzLnVwZGF0ZVJlY29yZEFycmF5KGFycmF5LCBm aWx0ZXIsIHR5cGUsIHJlY29yZCk7CiAgICAgICAgICB9CiAgICAgICAgfQog ICAgICB9LAoKICAgICAgLyoqCiAgICAgICAgQ3JlYXRlIGEgYERTLk1hbnlB cnJheWAgZm9yIGEgdHlwZSBhbmQgbGlzdCBvZiByZWNvcmQgcmVmZXJlbmNl cywgYW5kIGluZGV4CiAgICAgICAgdGhlIGBNYW55QXJyYXlgIHVuZGVyIGVh Y2ggcmVmZXJlbmNlLiBUaGlzIGFsbG93cyB1cyB0byBlZmZpY2llbnRseSBy ZW1vdmUKICAgICAgICByZWNvcmRzIGZyb20gYE1hbnlBcnJheWBzIHdoZW4g dGhleSBhcmUgZGVsZXRlZC4KCiAgICAgICAgQG1ldGhvZCBjcmVhdGVNYW55 QXJyYXkKICAgICAgICBAcGFyYW0ge0NsYXNzfSB0eXBlCiAgICAgICAgQHBh cmFtIHtBcnJheX0gcmVmZXJlbmNlcwogICAgICAgIEByZXR1cm4ge0RTLk1h bnlBcnJheX0KICAgICAgKi8KICAgICAgY3JlYXRlTWFueUFycmF5OiBmdW5j dGlvbih0eXBlLCByZWNvcmRzKSB7CiAgICAgICAgdmFyIG1hbnlBcnJheSA9 IE1hbnlBcnJheS5jcmVhdGUoewogICAgICAgICAgdHlwZTogdHlwZSwKICAg ICAgICAgIGNvbnRlbnQ6IHJlY29yZHMsCiAgICAgICAgICBzdG9yZTogdGhp cy5zdG9yZQogICAgICAgIH0pOwoKICAgICAgICBmb3JFYWNoKHJlY29yZHMs IGZ1bmN0aW9uKHJlY29yZCkgewogICAgICAgICAgdmFyIGFycmF5cyA9IHRo aXMucmVjb3JkQXJyYXlzRm9yUmVjb3JkKHJlY29yZCk7CiAgICAgICAgICBh cnJheXMuYWRkKG1hbnlBcnJheSk7CiAgICAgICAgfSwgdGhpcyk7CgogICAg ICAgIHJldHVybiBtYW55QXJyYXk7CiAgICAgIH0sCgogICAgICAvKioKICAg ICAgICBDcmVhdGUgYSBgRFMuUmVjb3JkQXJyYXlgIGZvciBhIHR5cGUgYW5k IHJlZ2lzdGVyIGl0IGZvciB1cGRhdGVzLgoKICAgICAgICBAbWV0aG9kIGNy ZWF0ZVJlY29yZEFycmF5CiAgICAgICAgQHBhcmFtIHtDbGFzc30gdHlwZQog ICAgICAgIEByZXR1cm4ge0RTLlJlY29yZEFycmF5fQogICAgICAqLwogICAg ICBjcmVhdGVSZWNvcmRBcnJheTogZnVuY3Rpb24odHlwZSkgewogICAgICAg IHZhciBhcnJheSA9IERTLlJlY29yZEFycmF5LmNyZWF0ZSh7CiAgICAgICAg ICB0eXBlOiB0eXBlLAogICAgICAgICAgY29udGVudDogRW1iZXIuQSgpLAog ICAgICAgICAgc3RvcmU6IHRoaXMuc3RvcmUsCiAgICAgICAgICBpc0xvYWRl ZDogdHJ1ZQogICAgICAgIH0pOwoKICAgICAgICB0aGlzLnJlZ2lzdGVyRmls dGVyZWRSZWNvcmRBcnJheShhcnJheSwgdHlwZSk7CgogICAgICAgIHJldHVy biBhcnJheTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgIENyZWF0ZSBh IGBEUy5GaWx0ZXJlZFJlY29yZEFycmF5YCBmb3IgYSB0eXBlIGFuZCByZWdp c3RlciBpdCBmb3IgdXBkYXRlcy4KCiAgICAgICAgQG1ldGhvZCBjcmVhdGVG aWx0ZXJlZFJlY29yZEFycmF5CiAgICAgICAgQHBhcmFtIHtDbGFzc30gdHlw ZQogICAgICAgIEBwYXJhbSB7RnVuY3Rpb259IGZpbHRlcgogICAgICAgIEBy ZXR1cm4ge0RTLkZpbHRlcmVkUmVjb3JkQXJyYXl9CiAgICAgICovCiAgICAg IGNyZWF0ZUZpbHRlcmVkUmVjb3JkQXJyYXk6IGZ1bmN0aW9uKHR5cGUsIGZp bHRlcikgewogICAgICAgIHZhciBhcnJheSA9IERTLkZpbHRlcmVkUmVjb3Jk QXJyYXkuY3JlYXRlKHsKICAgICAgICAgIHR5cGU6IHR5cGUsCiAgICAgICAg ICBjb250ZW50OiBFbWJlci5BKCksCiAgICAgICAgICBzdG9yZTogdGhpcy5z dG9yZSwKICAgICAgICAgIG1hbmFnZXI6IHRoaXMsCiAgICAgICAgICBmaWx0 ZXJGdW5jdGlvbjogZmlsdGVyCiAgICAgICAgfSk7CgogICAgICAgIHRoaXMu cmVnaXN0ZXJGaWx0ZXJlZFJlY29yZEFycmF5KGFycmF5LCB0eXBlLCBmaWx0 ZXIpOwoKICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgIH0sCgogICAgICAv KioKICAgICAgICBDcmVhdGUgYSBgRFMuQWRhcHRlclBvcHVsYXRlZFJlY29y ZEFycmF5YCBmb3IgYSB0eXBlIHdpdGggZ2l2ZW4gcXVlcnkuCgogICAgICAg IEBtZXRob2QgY3JlYXRlQWRhcHRlclBvcHVsYXRlZFJlY29yZEFycmF5CiAg ICAgICAgQHBhcmFtIHtDbGFzc30gdHlwZQogICAgICAgIEBwYXJhbSB7T2Jq ZWN0fSBxdWVyeQogICAgICAgIEByZXR1cm4ge0RTLkFkYXB0ZXJQb3B1bGF0 ZWRSZWNvcmRBcnJheX0KICAgICAgKi8KICAgICAgY3JlYXRlQWRhcHRlclBv cHVsYXRlZFJlY29yZEFycmF5OiBmdW5jdGlvbih0eXBlLCBxdWVyeSkgewog ICAgICAgIHZhciBhcnJheSA9IERTLkFkYXB0ZXJQb3B1bGF0ZWRSZWNvcmRB cnJheS5jcmVhdGUoewogICAgICAgICAgdHlwZTogdHlwZSwKICAgICAgICAg IHF1ZXJ5OiBxdWVyeSwKICAgICAgICAgIGNvbnRlbnQ6IEVtYmVyLkEoKSwK ICAgICAgICAgIHN0b3JlOiB0aGlzLnN0b3JlCiAgICAgICAgfSk7CgogICAg ICAgIHRoaXMuX2FkYXB0ZXJQb3B1bGF0ZWRSZWNvcmRBcnJheXMucHVzaChh cnJheSk7CgogICAgICAgIHJldHVybiBhcnJheTsKICAgICAgfSwKCiAgICAg IC8qKgogICAgICAgIFJlZ2lzdGVyIGEgUmVjb3JkQXJyYXkgZm9yIGEgZ2l2 ZW4gdHlwZSB0byBiZSBiYWNrZWQgYnkKICAgICAgICBhIGZpbHRlciBmdW5j dGlvbi4gVGhpcyB3aWxsIGNhdXNlIHRoZSBhcnJheSB0byB1cGRhdGUKICAg ICAgICBhdXRvbWF0aWNhbGx5IHdoZW4gcmVjb3JkcyBvZiB0aGF0IHR5cGUg Y2hhbmdlIGF0dHJpYnV0ZQogICAgICAgIHZhbHVlcyBvciBzdGF0ZXMuCgog ICAgICAgIEBtZXRob2QgcmVnaXN0ZXJGaWx0ZXJlZFJlY29yZEFycmF5CiAg ICAgICAgQHBhcmFtIHtEUy5SZWNvcmRBcnJheX0gYXJyYXkKICAgICAgICBA cGFyYW0ge0NsYXNzfSB0eXBlCiAgICAgICAgQHBhcmFtIHtGdW5jdGlvbn0g ZmlsdGVyCiAgICAgICovCiAgICAgIHJlZ2lzdGVyRmlsdGVyZWRSZWNvcmRB cnJheTogZnVuY3Rpb24oYXJyYXksIHR5cGUsIGZpbHRlcikgewogICAgICAg IHZhciByZWNvcmRBcnJheXMgPSB0aGlzLmZpbHRlcmVkUmVjb3JkQXJyYXlz LmdldCh0eXBlKTsKICAgICAgICByZWNvcmRBcnJheXMucHVzaChhcnJheSk7 CgogICAgICAgIHRoaXMudXBkYXRlRmlsdGVyKGFycmF5LCB0eXBlLCBmaWx0 ZXIpOwogICAgICB9LAoKICAgICAgLy8gSW50ZXJuYWxseSwgd2UgbWFpbnRh aW4gYSBtYXAgb2YgYWxsIHVubG9hZGVkIElEcyByZXF1ZXN0ZWQgYnkKICAg ICAgLy8gYSBNYW55QXJyYXkuIEFzIHRoZSBhZGFwdGVyIGxvYWRzIGRhdGEg aW50byB0aGUgc3RvcmUsIHRoZQogICAgICAvLyBzdG9yZSBub3RpZmllcyBh bnkgaW50ZXJlc3RlZCBNYW55QXJyYXlzLiBXaGVuIHRoZSBNYW55QXJyYXkn cwogICAgICAvLyB0b3RhbCBudW1iZXIgb2YgbG9hZGluZyByZWNvcmRzIGRy b3BzIHRvIHplcm8sIGl0IGJlY29tZXMKICAgICAgLy8gYGlzTG9hZGVkYCBh bmQgZmlyZXMgYSBgZGlkTG9hZGAgZXZlbnQuCiAgICAgIHJlZ2lzdGVyV2Fp dGluZ1JlY29yZEFycmF5OiBmdW5jdGlvbihyZWNvcmQsIGFycmF5KSB7CiAg ICAgICAgdmFyIGxvYWRpbmdSZWNvcmRBcnJheXMgPSByZWNvcmQuX2xvYWRp bmdSZWNvcmRBcnJheXMgfHwgW107CiAgICAgICAgbG9hZGluZ1JlY29yZEFy cmF5cy5wdXNoKGFycmF5KTsKICAgICAgICByZWNvcmQuX2xvYWRpbmdSZWNv cmRBcnJheXMgPSBsb2FkaW5nUmVjb3JkQXJyYXlzOwogICAgICB9LAoKICAg ICAgd2lsbERlc3Ryb3k6IGZ1bmN0aW9uKCl7CiAgICAgICAgdGhpcy5fc3Vw ZXIoKTsKCiAgICAgICAgZmxhdHRlbih2YWx1ZXModGhpcy5maWx0ZXJlZFJl Y29yZEFycmF5cy52YWx1ZXMpKS5mb3JFYWNoKGRlc3Ryb3kpOwogICAgICAg IHRoaXMuX2FkYXB0ZXJQb3B1bGF0ZWRSZWNvcmRBcnJheXMuZm9yRWFjaChk ZXN0cm95KTsKICAgICAgfQogICAgfSk7CgogICAgZnVuY3Rpb24gdmFsdWVz KG9iaikgewogICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgIHZhciBrZXlz ID0gRW1iZXIua2V5cyhvYmopOwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkg PCBrZXlzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgcmVzdWx0LnB1c2gob2Jq W2tleXNbaV1dKTsKICAgICAgfQoKICAgICAgcmV0dXJuIHJlc3VsdDsKICAg IH0KCiAgICBmdW5jdGlvbiBkZXN0cm95KGVudHJ5KSB7CiAgICAgIGVudHJ5 LmRlc3Ryb3koKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmbGF0dGVuKGxpc3Qp IHsKICAgICAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoOwogICAgICB2YXIg cmVzdWx0ID0gRW1iZXIuQSgpOwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkg PCBsZW5ndGg7IGkrKykgewogICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25j YXQobGlzdFtpXSk7CiAgICAgIH0KCiAgICAgIHJldHVybiByZXN1bHQ7CiAg ICB9CgogICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9IFJlY29yZEFycmF5 TWFuYWdlcjsKICB9KTsKZGVmaW5lKCJlbWJlci1kYXRhL2xpYi9zeXN0ZW0v cmVjb3JkX2FycmF5cyIsIAogIFsiLi9yZWNvcmRfYXJyYXlzL3JlY29yZF9h cnJheSIsIi4vcmVjb3JkX2FycmF5cy9maWx0ZXJlZF9yZWNvcmRfYXJyYXki LCIuL3JlY29yZF9hcnJheXMvYWRhcHRlcl9wb3B1bGF0ZWRfcmVjb3JkX2Fy cmF5IiwiLi9yZWNvcmRfYXJyYXlzL21hbnlfYXJyYXkiLCJleHBvcnRzIl0s CiAgZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2RlcGVuZGVuY3kyX18s IF9fZGVwZW5kZW5jeTNfXywgX19kZXBlbmRlbmN5NF9fLCBfX2V4cG9ydHNf XykgewogICAgInVzZSBzdHJpY3QiOwogICAgLyoqCiAgICAgIEBtb2R1bGUg ZW1iZXItZGF0YQogICAgKi8KCiAgICB2YXIgUmVjb3JkQXJyYXkgPSBfX2Rl cGVuZGVuY3kxX19bImRlZmF1bHQiXTsKICAgIHZhciBGaWx0ZXJlZFJlY29y ZEFycmF5ID0gX19kZXBlbmRlbmN5Ml9fWyJkZWZhdWx0Il07CiAgICB2YXIg QWRhcHRlclBvcHVsYXRlZFJlY29yZEFycmF5ID0gX19kZXBlbmRlbmN5M19f WyJkZWZhdWx0Il07CiAgICB2YXIgTWFueUFycmF5ID0gX19kZXBlbmRlbmN5 NF9fWyJkZWZhdWx0Il07CgogICAgX19leHBvcnRzX18uUmVjb3JkQXJyYXkg PSBSZWNvcmRBcnJheTsKICAgIF9fZXhwb3J0c19fLkZpbHRlcmVkUmVjb3Jk QXJyYXkgPSBGaWx0ZXJlZFJlY29yZEFycmF5OwogICAgX19leHBvcnRzX18u QWRhcHRlclBvcHVsYXRlZFJlY29yZEFycmF5ID0gQWRhcHRlclBvcHVsYXRl ZFJlY29yZEFycmF5OwogICAgX19leHBvcnRzX18uTWFueUFycmF5ID0gTWFu eUFycmF5OwogIH0pOwpkZWZpbmUoImVtYmVyLWRhdGEvbGliL3N5c3RlbS9y ZWNvcmRfYXJyYXlzL2FkYXB0ZXJfcG9wdWxhdGVkX3JlY29yZF9hcnJheSIs IAogIFsiLi9yZWNvcmRfYXJyYXkiLCJleHBvcnRzIl0sCiAgZnVuY3Rpb24o X19kZXBlbmRlbmN5MV9fLCBfX2V4cG9ydHNfXykgewogICAgInVzZSBzdHJp Y3QiOwogICAgdmFyIFJlY29yZEFycmF5ID0gX19kZXBlbmRlbmN5MV9fWyJk ZWZhdWx0Il07CiAgICAvKioKICAgICAgQG1vZHVsZSBlbWJlci1kYXRhCiAg ICAqLwoKICAgIHZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNl dDsKCiAgICAvKioKICAgICAgUmVwcmVzZW50cyBhbiBvcmRlcmVkIGxpc3Qg b2YgcmVjb3JkcyB3aG9zZSBvcmRlciBhbmQgbWVtYmVyc2hpcCBpcwogICAg ICBkZXRlcm1pbmVkIGJ5IHRoZSBhZGFwdGVyLiBGb3IgZXhhbXBsZSwgYSBx dWVyeSBzZW50IHRvIHRoZSBhZGFwdGVyCiAgICAgIG1heSB0cmlnZ2VyIGEg c2VhcmNoIG9uIHRoZSBzZXJ2ZXIsIHdob3NlIHJlc3VsdHMgd291bGQgYmUg bG9hZGVkCiAgICAgIGludG8gYW4gaW5zdGFuY2Ugb2YgdGhlIGBBZGFwdGVy UG9wdWxhdGVkUmVjb3JkQXJyYXlgLgoKICAgICAgQGNsYXNzIEFkYXB0ZXJQ b3B1bGF0ZWRSZWNvcmRBcnJheQogICAgICBAbmFtZXNwYWNlIERTCiAgICAg IEBleHRlbmRzIERTLlJlY29yZEFycmF5CiAgICAqLwogICAgdmFyIEFkYXB0 ZXJQb3B1bGF0ZWRSZWNvcmRBcnJheSA9IFJlY29yZEFycmF5LmV4dGVuZCh7 CiAgICAgIHF1ZXJ5OiBudWxsLAoKICAgICAgcmVwbGFjZTogZnVuY3Rpb24o KSB7CiAgICAgICAgdmFyIHR5cGUgPSBnZXQodGhpcywgJ3R5cGUnKS50b1N0 cmluZygpOwogICAgICAgIHRocm93IG5ldyBFcnJvcigiVGhlIHJlc3VsdCBv ZiBhIHNlcnZlciBxdWVyeSAob24gIiArIHR5cGUgKyAiKSBpcyBpbW11dGFi bGUuIik7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICBAbWV0aG9kIGxv YWQKICAgICAgICBAcHJpdmF0ZQogICAgICAgIEBwYXJhbSB7QXJyYXl9IGRh dGEKICAgICAgKi8KICAgICAgbG9hZDogZnVuY3Rpb24oZGF0YSkgewogICAg ICAgIHZhciBzdG9yZSA9IGdldCh0aGlzLCAnc3RvcmUnKSwKICAgICAgICAg ICAgdHlwZSA9IGdldCh0aGlzLCAndHlwZScpLAogICAgICAgICAgICByZWNv cmRzID0gc3RvcmUucHVzaE1hbnkodHlwZSwgZGF0YSksCiAgICAgICAgICAg IG1ldGEgPSBzdG9yZS5tZXRhZGF0YUZvcih0eXBlKTsKCiAgICAgICAgdGhp cy5zZXRQcm9wZXJ0aWVzKHsKICAgICAgICAgIGNvbnRlbnQ6IEVtYmVyLkEo cmVjb3JkcyksCiAgICAgICAgICBpc0xvYWRlZDogdHJ1ZSwKICAgICAgICAg IG1ldGE6IG1ldGEKICAgICAgICB9KTsKCiAgICAgICAgLy8gVE9ETzogc2hv dWxkIHRyaWdnZXJpbmcgZGlkTG9hZCBldmVudCBiZSB0aGUgbGFzdCBhY3Rp b24gb2YgdGhlIHJ1bkxvb3A/CiAgICAgICAgRW1iZXIucnVuLm9uY2UodGhp cywgJ3RyaWdnZXInLCAnZGlkTG9hZCcpOwogICAgICB9CiAgICB9KTsKCiAg ICBfX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gQWRhcHRlclBvcHVsYXRlZFJl Y29yZEFycmF5OwogIH0pOwpkZWZpbmUoImVtYmVyLWRhdGEvbGliL3N5c3Rl bS9yZWNvcmRfYXJyYXlzL2ZpbHRlcmVkX3JlY29yZF9hcnJheSIsIAogIFsi Li9yZWNvcmRfYXJyYXkiLCJleHBvcnRzIl0sCiAgZnVuY3Rpb24oX19kZXBl bmRlbmN5MV9fLCBfX2V4cG9ydHNfXykgewogICAgInVzZSBzdHJpY3QiOwog ICAgdmFyIFJlY29yZEFycmF5ID0gX19kZXBlbmRlbmN5MV9fWyJkZWZhdWx0 Il07CgogICAgLyoqCiAgICAgIEBtb2R1bGUgZW1iZXItZGF0YQogICAgKi8K CiAgICB2YXIgZ2V0ID0gRW1iZXIuZ2V0OwoKICAgIC8qKgogICAgICBSZXBy ZXNlbnRzIGEgbGlzdCBvZiByZWNvcmRzIHdob3NlIG1lbWJlcnNoaXAgaXMg ZGV0ZXJtaW5lZCBieSB0aGUKICAgICAgc3RvcmUuIEFzIHJlY29yZHMgYXJl IGNyZWF0ZWQsIGxvYWRlZCwgb3IgbW9kaWZpZWQsIHRoZSBzdG9yZQogICAg ICBldmFsdWF0ZXMgdGhlbSB0byBkZXRlcm1pbmUgaWYgdGhleSBzaG91bGQg YmUgcGFydCBvZiB0aGUgcmVjb3JkCiAgICAgIGFycmF5LgoKICAgICAgQGNs YXNzIEZpbHRlcmVkUmVjb3JkQXJyYXkKICAgICAgQG5hbWVzcGFjZSBEUwog ICAgICBAZXh0ZW5kcyBEUy5SZWNvcmRBcnJheQogICAgKi8KICAgIHZhciBG aWx0ZXJlZFJlY29yZEFycmF5ID0gUmVjb3JkQXJyYXkuZXh0ZW5kKHsKICAg ICAgLyoqCiAgICAgICAgVGhlIGZpbHRlckZ1bmN0aW9uIGlzIGEgZnVuY3Rp b24gdXNlZCB0byB0ZXN0IHJlY29yZHMgZnJvbSB0aGUgc3RvcmUgdG8KICAg ICAgICBkZXRlcm1pbmUgaWYgdGhleSBzaG91bGQgYmUgcGFydCBvZiB0aGUg cmVjb3JkIGFycmF5LgoKICAgICAgICBFeGFtcGxlCgogICAgICAgIGBgYGph dmFzY3JpcHQKICAgICAgICB2YXIgYWxsUGVvcGxlID0gc3RvcmUuYWxsKCdw ZXJzb24nKTsKICAgICAgICBhbGxQZW9wbGUubWFwQnkoJ25hbWUnKTsgLy8g WyJUb20gRGFsZSIsICJZZWh1ZGEgS2F0eiIsICJUcmVrIEdsb3dhY2tpIl0K CiAgICAgICAgdmFyIHBlb3BsZSA9IHN0b3JlLmZpbHRlcigncGVyc29uJywg ZnVuY3Rpb24ocGVyc29uKSB7CiAgICAgICAgICBpZiAocGVyc29uLmdldCgn bmFtZScpLm1hdGNoKC9LYXR6JC8pKSB7IHJldHVybiB0cnVlOyB9CiAgICAg ICAgfSk7CiAgICAgICAgcGVvcGxlLm1hcEJ5KCduYW1lJyk7IC8vIFsiWWVo dWRhIEthdHoiXQoKICAgICAgICB2YXIgbm90S2F0ekZpbHRlciA9IGZ1bmN0 aW9uKHBlcnNvbikgewogICAgICAgICAgcmV0dXJuICFwZXJzb24uZ2V0KCdu YW1lJykubWF0Y2goL0thdHokLyk7CiAgICAgICAgfTsKICAgICAgICBwZW9w bGUuc2V0KCdmaWx0ZXJGdW5jdGlvbicsIG5vdEthdHpGaWx0ZXIpOwogICAg ICAgIHBlb3BsZS5tYXBCeSgnbmFtZScpOyAvLyBbIlRvbSBEYWxlIiwgIlRy ZWsgR2xvd2Fja2kiXQogICAgICAgIGBgYAoKICAgICAgICBAbWV0aG9kIGZp bHRlckZ1bmN0aW9uCiAgICAgICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3Jk CiAgICAgICAgQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSByZWNv cmQgc2hvdWxkIGJlIGluIHRoZSBhcnJheQogICAgICAqLwogICAgICBmaWx0 ZXJGdW5jdGlvbjogbnVsbCwKICAgICAgaXNMb2FkZWQ6IHRydWUsCgogICAg ICByZXBsYWNlOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdHlwZSA9IGdl dCh0aGlzLCAndHlwZScpLnRvU3RyaW5nKCk7CiAgICAgICAgdGhyb3cgbmV3 IEVycm9yKCJUaGUgcmVzdWx0IG9mIGEgY2xpZW50LXNpZGUgZmlsdGVyIChv biAiICsgdHlwZSArICIpIGlzIGltbXV0YWJsZS4iKTsKICAgICAgfSwKCiAg ICAgIC8qKgogICAgICAgIEBtZXRob2QgdXBkYXRlRmlsdGVyCiAgICAgICAg QHByaXZhdGUKICAgICAgKi8KICAgICAgdXBkYXRlRmlsdGVyOiBFbWJlci5v YnNlcnZlcihmdW5jdGlvbigpIHsKICAgICAgICB2YXIgbWFuYWdlciA9IGdl dCh0aGlzLCAnbWFuYWdlcicpOwogICAgICAgIG1hbmFnZXIudXBkYXRlRmls dGVyKHRoaXMsIGdldCh0aGlzLCAndHlwZScpLCBnZXQodGhpcywgJ2ZpbHRl ckZ1bmN0aW9uJykpOwogICAgICB9LCAnZmlsdGVyRnVuY3Rpb24nKQogICAg fSk7CgogICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9IEZpbHRlcmVkUmVj b3JkQXJyYXk7CiAgfSk7CmRlZmluZSgiZW1iZXItZGF0YS9saWIvc3lzdGVt L3JlY29yZF9hcnJheXMvbWFueV9hcnJheSIsIAogIFsiLi9yZWNvcmRfYXJy YXkiLCIuLi9jaGFuZ2VzIiwiZXhwb3J0cyJdLAogIGZ1bmN0aW9uKF9fZGVw ZW5kZW5jeTFfXywgX19kZXBlbmRlbmN5Ml9fLCBfX2V4cG9ydHNfXykgewog ICAgInVzZSBzdHJpY3QiOwogICAgdmFyIFJlY29yZEFycmF5ID0gX19kZXBl bmRlbmN5MV9fWyJkZWZhdWx0Il07CiAgICB2YXIgUmVsYXRpb25zaGlwQ2hh bmdlID0gX19kZXBlbmRlbmN5Ml9fLlJlbGF0aW9uc2hpcENoYW5nZTsKCiAg ICAvKioKICAgICAgQG1vZHVsZSBlbWJlci1kYXRhCiAgICAqLwoKICAgIHZh ciBnZXQgPSBFbWJlci5nZXQsIHNldCA9IEVtYmVyLnNldDsKICAgIHZhciBt YXAgPSBFbWJlci5FbnVtZXJhYmxlVXRpbHMubWFwOwoKICAgIGZ1bmN0aW9u IHN5bmMoY2hhbmdlKSB7CiAgICAgIGNoYW5nZS5zeW5jKCk7CiAgICB9Cgog ICAgLyoqCiAgICAgIEEgYE1hbnlBcnJheWAgaXMgYSBgUmVjb3JkQXJyYXlg IHRoYXQgcmVwcmVzZW50cyB0aGUgY29udGVudHMgb2YgYSBoYXMtbWFueQog ICAgICByZWxhdGlvbnNoaXAuCgogICAgICBUaGUgYE1hbnlBcnJheWAgaXMg aW5zdGFudGlhdGVkIGxhemlseSB0aGUgZmlyc3QgdGltZSB0aGUgcmVsYXRp b25zaGlwIGlzCiAgICAgIHJlcXVlc3RlZC4KCiAgICAgICMjIyBJbnZlcnNl cwoKICAgICAgT2Z0ZW4sIHRoZSByZWxhdGlvbnNoaXBzIGluIEVtYmVyIERh dGEgYXBwbGljYXRpb25zIHdpbGwgaGF2ZQogICAgICBhbiBpbnZlcnNlLiBG b3IgZXhhbXBsZSwgaW1hZ2luZSB0aGUgZm9sbG93aW5nIG1vZGVscyBhcmUK ICAgICAgZGVmaW5lZDoKCiAgICAgIGBgYGphdmFzY3JpcHQKICAgICAgQXBw LlBvc3QgPSBEUy5Nb2RlbC5leHRlbmQoewogICAgICAgIGNvbW1lbnRzOiBE Uy5oYXNNYW55KCdjb21tZW50JykKICAgICAgfSk7CgogICAgICBBcHAuQ29t bWVudCA9IERTLk1vZGVsLmV4dGVuZCh7CiAgICAgICAgcG9zdDogRFMuYmVs b25nc1RvKCdwb3N0JykKICAgICAgfSk7CiAgICAgIGBgYAoKICAgICAgSWYg eW91IGNyZWF0ZWQgYSBuZXcgaW5zdGFuY2Ugb2YgYEFwcC5Qb3N0YCBhbmQg YWRkZWQKICAgICAgYSBgQXBwLkNvbW1lbnRgIHJlY29yZCB0byBpdHMgYGNv bW1lbnRzYCBoYXMtbWFueQogICAgICByZWxhdGlvbnNoaXAsIHlvdSB3b3Vs ZCBleHBlY3QgdGhlIGNvbW1lbnQncyBgcG9zdGAKICAgICAgcHJvcGVydHkg dG8gYmUgc2V0IHRvIHRoZSBwb3N0IHRoYXQgY29udGFpbmVkCiAgICAgIHRo ZSBoYXMtbWFueS4KCiAgICAgIFdlIGNhbGwgdGhlIHJlY29yZCB0byB3aGlj aCBhIHJlbGF0aW9uc2hpcCBiZWxvbmdzIHRoZQogICAgICByZWxhdGlvbnNo aXAncyBfb3duZXJfLgoKICAgICAgQGNsYXNzIE1hbnlBcnJheQogICAgICBA bmFtZXNwYWNlIERTCiAgICAgIEBleHRlbmRzIERTLlJlY29yZEFycmF5CiAg ICAqLwogICAgdmFyIE1hbnlBcnJheSA9IFJlY29yZEFycmF5LmV4dGVuZCh7 CiAgICAgIGluaXQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX3N1cGVy LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgdGhpcy5fY2hhbmdl c1RvU3luYyA9IEVtYmVyLk9yZGVyZWRTZXQuY3JlYXRlKCk7CiAgICAgIH0s CgogICAgICAvKioKICAgICAgICBUaGUgcHJvcGVydHkgbmFtZSBvZiB0aGUg cmVsYXRpb25zaGlwCgogICAgICAgIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1l CiAgICAgICAgQHByaXZhdGUKICAgICAgKi8KICAgICAgbmFtZTogbnVsbCwK CiAgICAgIC8qKgogICAgICAgIFRoZSByZWNvcmQgdG8gd2hpY2ggdGhpcyBy ZWxhdGlvbnNoaXAgYmVsb25ncy4KCiAgICAgICAgQHByb3BlcnR5IHtEUy5N b2RlbH0gb3duZXIKICAgICAgICBAcHJpdmF0ZQogICAgICAqLwogICAgICBv d25lcjogbnVsbCwKCiAgICAgIC8qKgogICAgICAgIGB0cnVlYCBpZiB0aGUg cmVsYXRpb25zaGlwIGlzIHBvbHltb3JwaGljLCBgZmFsc2VgIG90aGVyd2lz ZS4KCiAgICAgICAgQHByb3BlcnR5IHtCb29sZWFufSBpc1BvbHltb3JwaGlj CiAgICAgICAgQHByaXZhdGUKICAgICAgKi8KICAgICAgaXNQb2x5bW9ycGhp YzogZmFsc2UsCgogICAgICAvLyBMT0FESU5HIFNUQVRFCgogICAgICBpc0xv YWRlZDogZmFsc2UsCgogICAgICAvKioKICAgICAgICBVc2VkIGZvciBhc3lu YyBgaGFzTWFueWAgYXJyYXlzCiAgICAgICAgdG8ga2VlcCB0cmFjayBvZiB3 aGVuIHRoZXkgd2lsbCByZXNvbHZlLgoKICAgICAgICBAcHJvcGVydHkge0Vt YmVyLlJTVlAuUHJvbWlzZX0gcHJvbWlzZQogICAgICAgIEBwcml2YXRlCiAg ICAgICovCiAgICAgIHByb21pc2U6IG51bGwsCgogICAgICAvKioKICAgICAg ICBAbWV0aG9kIGxvYWRpbmdSZWNvcmRzQ291bnQKICAgICAgICBAcGFyYW0g e051bWJlcn0gY291bnQKICAgICAgICBAcHJpdmF0ZQogICAgICAqLwogICAg ICBsb2FkaW5nUmVjb3Jkc0NvdW50OiBmdW5jdGlvbihjb3VudCkgewogICAg ICAgIHRoaXMubG9hZGluZ1JlY29yZHNDb3VudCA9IGNvdW50OwogICAgICB9 LAoKICAgICAgLyoqCiAgICAgICAgQG1ldGhvZCBsb2FkZWRSZWNvcmQKICAg ICAgICBAcHJpdmF0ZQogICAgICAqLwogICAgICBsb2FkZWRSZWNvcmQ6IGZ1 bmN0aW9uKCkgewogICAgICAgIHRoaXMubG9hZGluZ1JlY29yZHNDb3VudC0t OwogICAgICAgIGlmICh0aGlzLmxvYWRpbmdSZWNvcmRzQ291bnQgPT09IDAp IHsKICAgICAgICAgIHNldCh0aGlzLCAnaXNMb2FkZWQnLCB0cnVlKTsKICAg ICAgICAgIHRoaXMudHJpZ2dlcignZGlkTG9hZCcpOwogICAgICAgIH0KICAg ICAgfSwKCiAgICAgIC8qKgogICAgICAgIEBtZXRob2QgZmV0Y2gKICAgICAg ICBAcHJpdmF0ZQogICAgICAqLwogICAgICBmZXRjaDogZnVuY3Rpb24oKSB7 CiAgICAgICAgdmFyIHJlY29yZHMgPSBnZXQodGhpcywgJ2NvbnRlbnQnKSwK ICAgICAgICAgICAgc3RvcmUgPSBnZXQodGhpcywgJ3N0b3JlJyksCiAgICAg ICAgICAgIG93bmVyID0gZ2V0KHRoaXMsICdvd25lcicpLAogICAgICAgICAg ICByZXNvbHZlciA9IEVtYmVyLlJTVlAuZGVmZXIoIkRTOiBNYW55QXJyYXkj ZmV0Y2ggIiArIGdldCh0aGlzLCAndHlwZScpKTsKCiAgICAgICAgdmFyIHVu bG9hZGVkUmVjb3JkcyA9IHJlY29yZHMuZmlsdGVyUHJvcGVydHkoJ2lzRW1w dHknLCB0cnVlKTsKICAgICAgICBzdG9yZS5mZXRjaE1hbnkodW5sb2FkZWRS ZWNvcmRzLCBvd25lciwgcmVzb2x2ZXIpOwogICAgICB9LAoKICAgICAgLy8g T3ZlcnJpZGVzIEVtYmVyLkFycmF5J3MgcmVwbGFjZSBtZXRob2QgdG8gaW1w bGVtZW50CiAgICAgIHJlcGxhY2VDb250ZW50OiBmdW5jdGlvbihpbmRleCwg cmVtb3ZlZCwgYWRkZWQpIHsKICAgICAgICAvLyBNYXAgdGhlIGFycmF5IG9m IHJlY29yZCBvYmplY3RzIGludG8gYW4gYXJyYXkgb2YgIGNsaWVudCBpZHMu CiAgICAgICAgYWRkZWQgPSBtYXAoYWRkZWQsIGZ1bmN0aW9uKHJlY29yZCkg ewogICAgICAgICAgRW1iZXIuYXNzZXJ0KCJZb3UgY2Fubm90IGFkZCAnIiAr IHJlY29yZC5jb25zdHJ1Y3Rvci50eXBlS2V5ICsgIicgcmVjb3JkcyB0byB0 aGlzIHJlbGF0aW9uc2hpcCAob25seSAnIiArIHRoaXMudHlwZS50eXBlS2V5 ICsgIicgYWxsb3dlZCkiLCAhdGhpcy50eXBlIHx8IHJlY29yZCBpbnN0YW5j ZW9mIHRoaXMudHlwZSk7CiAgICAgICAgICByZXR1cm4gcmVjb3JkOwogICAg ICAgIH0sIHRoaXMpOwoKICAgICAgICB0aGlzLl9zdXBlcihpbmRleCwgcmVt b3ZlZCwgYWRkZWQpOwogICAgICB9LAoKICAgICAgYXJyYW5nZWRDb250ZW50 RGlkQ2hhbmdlOiBmdW5jdGlvbigpIHsKICAgICAgICBFbWJlci5ydW4ub25j ZSh0aGlzLCAnZmV0Y2gnKTsKICAgICAgfSwKCiAgICAgIGFycmF5Q29udGVu dFdpbGxDaGFuZ2U6IGZ1bmN0aW9uKGluZGV4LCByZW1vdmVkLCBhZGRlZCkg ewogICAgICAgIHZhciBvd25lciA9IGdldCh0aGlzLCAnb3duZXInKSwKICAg ICAgICAgICAgbmFtZSA9IGdldCh0aGlzLCAnbmFtZScpOwoKICAgICAgICBp ZiAoIW93bmVyLl9zdXNwZW5kZWRSZWxhdGlvbnNoaXBzKSB7CiAgICAgICAg ICAvLyBUaGlzIGNvZGUgaXMgdGhlIGZpcnN0IGhhbGYgb2YgY29kZSB0aGF0 IGNvbnRpbnVlcyBpbnNpZGUKICAgICAgICAgIC8vIG9mIGFycmF5Q29udGVu dERpZENoYW5nZS4gSXQgZ2V0cyBvciBjcmVhdGVzIGEgY2hhbmdlIGZyb20K ICAgICAgICAgIC8vIHRoZSBjaGlsZCBvYmplY3QsIGFkZHMgdGhlIGN1cnJl bnQgb3duZXIgYXMgdGhlIG9sZAogICAgICAgICAgLy8gcGFyZW50IGlmIHRo aXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhlIG9iamVjdCB3YXMgcmVtb3ZlZAog ICAgICAgICAgLy8gZnJvbSBhIE1hbnlBcnJheSwgYW5kIHNldHMgYG5ld1Bh cmVudGAgdG8gbnVsbC4KICAgICAgICAgIC8vCiAgICAgICAgICAvLyBMYXRl ciwgaWYgdGhlIG9iamVjdCBpcyBhZGRlZCB0byBhbm90aGVyIE1hbnlBcnJh eSwKICAgICAgICAgIC8vIHRoZSBgYXJyYXlDb250ZW50RGlkQ2hhbmdlYCB3 aWxsIHNldCBgbmV3UGFyZW50YCBvbgogICAgICAgICAgLy8gdGhlIGNoYW5n ZS4KICAgICAgICAgIGZvciAodmFyIGk9aW5kZXg7IGk8aW5kZXgrcmVtb3Zl ZDsgaSsrKSB7CiAgICAgICAgICAgIHZhciByZWNvcmQgPSBnZXQodGhpcywg J2NvbnRlbnQnKS5vYmplY3RBdChpKTsKCiAgICAgICAgICAgIHZhciBjaGFu Z2UgPSBSZWxhdGlvbnNoaXBDaGFuZ2UuY3JlYXRlQ2hhbmdlKG93bmVyLCBy ZWNvcmQsIGdldCh0aGlzLCAnc3RvcmUnKSwgewogICAgICAgICAgICAgIHBh cmVudFR5cGU6IG93bmVyLmNvbnN0cnVjdG9yLAogICAgICAgICAgICAgIGNo YW5nZVR5cGU6ICJyZW1vdmUiLAogICAgICAgICAgICAgIGtpbmQ6ICJoYXNN YW55IiwKICAgICAgICAgICAgICBrZXk6IG5hbWUKICAgICAgICAgICAgfSk7 CgogICAgICAgICAgICB0aGlzLl9jaGFuZ2VzVG9TeW5jLmFkZChjaGFuZ2Up OwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRoaXMu X3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIH0sCgogICAg ICBhcnJheUNvbnRlbnREaWRDaGFuZ2U6IGZ1bmN0aW9uKGluZGV4LCByZW1v dmVkLCBhZGRlZCkgewogICAgICAgIHRoaXMuX3N1cGVyLmFwcGx5KHRoaXMs IGFyZ3VtZW50cyk7CgogICAgICAgIHZhciBvd25lciA9IGdldCh0aGlzLCAn b3duZXInKSwKICAgICAgICAgICAgbmFtZSA9IGdldCh0aGlzLCAnbmFtZScp LAogICAgICAgICAgICBzdG9yZSA9IGdldCh0aGlzLCAnc3RvcmUnKTsKCiAg ICAgICAgaWYgKCFvd25lci5fc3VzcGVuZGVkUmVsYXRpb25zaGlwcykgewog ICAgICAgICAgLy8gVGhpcyBjb2RlIGlzIHRoZSBzZWNvbmQgaGFsZiBvZiBj b2RlIHRoYXQgc3RhcnRlZCBpbgogICAgICAgICAgLy8gYGFycmF5Q29udGVu dFdpbGxDaGFuZ2VgLiBJdCBnZXRzIG9yIGNyZWF0ZXMgYSBjaGFuZ2UKICAg ICAgICAgIC8vIGZyb20gdGhlIGNoaWxkIG9iamVjdCwgYW5kIGFkZHMgdGhl IGN1cnJlbnQgb3duZXIgYXMKICAgICAgICAgIC8vIHRoZSBuZXcgcGFyZW50 LgogICAgICAgICAgZm9yICh2YXIgaT1pbmRleDsgaTxpbmRleCthZGRlZDsg aSsrKSB7CiAgICAgICAgICAgIHZhciByZWNvcmQgPSBnZXQodGhpcywgJ2Nv bnRlbnQnKS5vYmplY3RBdChpKTsKCiAgICAgICAgICAgIHZhciBjaGFuZ2Ug PSBSZWxhdGlvbnNoaXBDaGFuZ2UuY3JlYXRlQ2hhbmdlKG93bmVyLCByZWNv cmQsIHN0b3JlLCB7CiAgICAgICAgICAgICAgcGFyZW50VHlwZTogb3duZXIu Y29uc3RydWN0b3IsCiAgICAgICAgICAgICAgY2hhbmdlVHlwZTogImFkZCIs CiAgICAgICAgICAgICAga2luZDoiaGFzTWFueSIsCiAgICAgICAgICAgICAg a2V5OiBuYW1lCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjaGFuZ2Uu aGFzTWFueU5hbWUgPSBuYW1lOwoKICAgICAgICAgICAgdGhpcy5fY2hhbmdl c1RvU3luYy5hZGQoY2hhbmdlKTsKICAgICAgICAgIH0KCiAgICAgICAgICAv LyBXZSB3YWl0IHVudGlsIHRoZSBhcnJheSBoYXMgZmluaXNoZWQgYmVpbmcK ICAgICAgICAgIC8vIG11dGF0ZWQgYmVmb3JlIHN5bmNpbmcgdGhlIE9uZVRv TWFueUNoYW5nZXMgY3JlYXRlZAogICAgICAgICAgLy8gaW4gYXJyYXlDb250 ZW50V2lsbENoYW5nZSwgc28gdGhhdCB0aGUgYXJyYXkKICAgICAgICAgIC8v IG1lbWJlcnNoaXAgdGVzdCBpbiB0aGUgc3luYygpIGxvZ2ljIG9wZXJhdGVz CiAgICAgICAgICAvLyBvbiB0aGUgZmluYWwgcmVzdWx0cy4KICAgICAgICAg IHRoaXMuX2NoYW5nZXNUb1N5bmMuZm9yRWFjaChzeW5jKTsKCiAgICAgICAg ICB0aGlzLl9jaGFuZ2VzVG9TeW5jLmNsZWFyKCk7CiAgICAgICAgfQogICAg ICB9LAoKICAgICAgLyoqCiAgICAgICAgQ3JlYXRlIGEgY2hpbGQgcmVjb3Jk IHdpdGhpbiB0aGUgb3duZXIKCiAgICAgICAgQG1ldGhvZCBjcmVhdGVSZWNv cmQKICAgICAgICBAcHJpdmF0ZQogICAgICAgIEBwYXJhbSB7T2JqZWN0fSBo YXNoCiAgICAgICAgQHJldHVybiB7RFMuTW9kZWx9IHJlY29yZAogICAgICAq LwogICAgICBjcmVhdGVSZWNvcmQ6IGZ1bmN0aW9uKGhhc2gpIHsKICAgICAg ICB2YXIgb3duZXIgPSBnZXQodGhpcywgJ293bmVyJyksCiAgICAgICAgICAg IHN0b3JlID0gZ2V0KG93bmVyLCAnc3RvcmUnKSwKICAgICAgICAgICAgdHlw ZSA9IGdldCh0aGlzLCAndHlwZScpLAogICAgICAgICAgICByZWNvcmQ7Cgog ICAgICAgIEVtYmVyLmFzc2VydCgiWW91IGNhbm5vdCBhZGQgJyIgKyB0eXBl LnR5cGVLZXkgKyAiJyByZWNvcmRzIHRvIHRoaXMgcG9seW1vcnBoaWMgcmVs YXRpb25zaGlwLiIsICFnZXQodGhpcywgJ2lzUG9seW1vcnBoaWMnKSk7Cgog ICAgICAgIHJlY29yZCA9IHN0b3JlLmNyZWF0ZVJlY29yZC5jYWxsKHN0b3Jl LCB0eXBlLCBoYXNoKTsKICAgICAgICB0aGlzLnB1c2hPYmplY3QocmVjb3Jk KTsKCiAgICAgICAgcmV0dXJuIHJlY29yZDsKICAgICAgfQogICAgfSk7Cgog ICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9IE1hbnlBcnJheTsKICB9KTsK ZGVmaW5lKCJlbWJlci1kYXRhL2xpYi9zeXN0ZW0vcmVjb3JkX2FycmF5cy9y ZWNvcmRfYXJyYXkiLCAKICBbIi4uL3N0b3JlIiwiZXhwb3J0cyJdLAogIGZ1 bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19leHBvcnRzX18pIHsKICAgICJ1 c2Ugc3RyaWN0IjsKICAgIC8qKgogICAgICBAbW9kdWxlIGVtYmVyLWRhdGEK ICAgICovCgogICAgdmFyIFByb21pc2VBcnJheSA9IF9fZGVwZW5kZW5jeTFf Xy5Qcm9taXNlQXJyYXk7CiAgICB2YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQg PSBFbWJlci5zZXQ7CgogICAgLyoqCiAgICAgIEEgcmVjb3JkIGFycmF5IGlz IGFuIGFycmF5IHRoYXQgY29udGFpbnMgcmVjb3JkcyBvZiBhIGNlcnRhaW4g dHlwZS4gVGhlIHJlY29yZAogICAgICBhcnJheSBtYXRlcmlhbGl6ZXMgcmVj b3JkcyBhcyBuZWVkZWQgd2hlbiB0aGV5IGFyZSByZXRyaWV2ZWQgZm9yIHRo ZSBmaXJzdAogICAgICB0aW1lLiBZb3Ugc2hvdWxkIG5vdCBjcmVhdGUgcmVj b3JkIGFycmF5cyB5b3Vyc2VsZi4gSW5zdGVhZCwgYW4gaW5zdGFuY2Ugb2YK ICAgICAgYERTLlJlY29yZEFycmF5YCBvciBpdHMgc3ViY2xhc3NlcyB3aWxs IGJlIHJldHVybmVkIGJ5IHlvdXIgYXBwbGljYXRpb24ncyBzdG9yZQogICAg ICBpbiByZXNwb25zZSB0byBxdWVyaWVzLgoKICAgICAgQGNsYXNzIFJlY29y ZEFycmF5CiAgICAgIEBuYW1lc3BhY2UgRFMKICAgICAgQGV4dGVuZHMgRW1i ZXIuQXJyYXlQcm94eQogICAgICBAdXNlcyBFbWJlci5FdmVudGVkCiAgICAq LwoKICAgIHZhciBSZWNvcmRBcnJheSA9IEVtYmVyLkFycmF5UHJveHkuZXh0 ZW5kKEVtYmVyLkV2ZW50ZWQsIHsKICAgICAgLyoqCiAgICAgICAgVGhlIG1v ZGVsIHR5cGUgY29udGFpbmVkIGJ5IHRoaXMgcmVjb3JkIGFycmF5LgoKICAg ICAgICBAcHJvcGVydHkgdHlwZQogICAgICAgIEB0eXBlIERTLk1vZGVsCiAg ICAgICovCiAgICAgIHR5cGU6IG51bGwsCgogICAgICAvKioKICAgICAgICBU aGUgYXJyYXkgb2YgY2xpZW50IGlkcyBiYWNraW5nIHRoZSByZWNvcmQgYXJy YXkuIFdoZW4gYQogICAgICAgIHJlY29yZCBpcyByZXF1ZXN0ZWQgZnJvbSB0 aGUgcmVjb3JkIGFycmF5LCB0aGUgcmVjb3JkCiAgICAgICAgZm9yIHRoZSBj bGllbnQgaWQgYXQgdGhlIHNhbWUgaW5kZXggaXMgbWF0ZXJpYWxpemVkLCBp ZgogICAgICAgIG5lY2Vzc2FyeSwgYnkgdGhlIHN0b3JlLgoKICAgICAgICBA cHJvcGVydHkgY29udGVudAogICAgICAgIEBwcml2YXRlCiAgICAgICAgQHR5 cGUgRW1iZXIuQXJyYXkKICAgICAgKi8KICAgICAgY29udGVudDogbnVsbCwK CiAgICAgIC8qKgogICAgICAgIFRoZSBmbGFnIHRvIHNpZ25hbCBhIGBSZWNv cmRBcnJheWAgaXMgY3VycmVudGx5IGxvYWRpbmcgZGF0YS4KCiAgICAgICAg RXhhbXBsZQoKICAgICAgICBgYGBqYXZhc2NyaXB0CiAgICAgICAgdmFyIHBl b3BsZSA9IHN0b3JlLmFsbChBcHAuUGVyc29uKTsKICAgICAgICBwZW9wbGUu Z2V0KCdpc0xvYWRlZCcpOyAvLyB0cnVlCiAgICAgICAgYGBgCgogICAgICAg IEBwcm9wZXJ0eSBpc0xvYWRlZAogICAgICAgIEB0eXBlIEJvb2xlYW4KICAg ICAgKi8KICAgICAgaXNMb2FkZWQ6IGZhbHNlLAogICAgICAvKioKICAgICAg ICBUaGUgZmxhZyB0byBzaWduYWwgYSBgUmVjb3JkQXJyYXlgIGlzIGN1cnJl bnRseSBsb2FkaW5nIGRhdGEuCgogICAgICAgIEV4YW1wbGUKCiAgICAgICAg YGBgamF2YXNjcmlwdAogICAgICAgIHZhciBwZW9wbGUgPSBzdG9yZS5hbGwo QXBwLlBlcnNvbik7CiAgICAgICAgcGVvcGxlLmdldCgnaXNVcGRhdGluZycp OyAvLyBmYWxzZQogICAgICAgIHBlb3BsZS51cGRhdGUoKTsKICAgICAgICBw ZW9wbGUuZ2V0KCdpc1VwZGF0aW5nJyk7IC8vIHRydWUKICAgICAgICBgYGAK CiAgICAgICAgQHByb3BlcnR5IGlzVXBkYXRpbmcKICAgICAgICBAdHlwZSBC b29sZWFuCiAgICAgICovCiAgICAgIGlzVXBkYXRpbmc6IGZhbHNlLAoKICAg ICAgLyoqCiAgICAgICAgVGhlIHN0b3JlIHRoYXQgY3JlYXRlZCB0aGlzIHJl Y29yZCBhcnJheS4KCiAgICAgICAgQHByb3BlcnR5IHN0b3JlCiAgICAgICAg QHByaXZhdGUKICAgICAgICBAdHlwZSBEUy5TdG9yZQogICAgICAqLwogICAg ICBzdG9yZTogbnVsbCwKCiAgICAgIC8qKgogICAgICAgIFJldHJpZXZlcyBh biBvYmplY3QgZnJvbSB0aGUgY29udGVudCBieSBpbmRleC4KCiAgICAgICAg QG1ldGhvZCBvYmplY3RBdENvbnRlbnQKICAgICAgICBAcHJpdmF0ZQogICAg ICAgIEBwYXJhbSB7TnVtYmVyfSBpbmRleAogICAgICAgIEByZXR1cm4ge0RT Lk1vZGVsfSByZWNvcmQKICAgICAgKi8KICAgICAgb2JqZWN0QXRDb250ZW50 OiBmdW5jdGlvbihpbmRleCkgewogICAgICAgIHZhciBjb250ZW50ID0gZ2V0 KHRoaXMsICdjb250ZW50Jyk7CgogICAgICAgIHJldHVybiBjb250ZW50Lm9i amVjdEF0KGluZGV4KTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgIFVz ZWQgdG8gZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBhbGwgb2YgdGhlIHJl Y29yZHMgaW4gdGhpcyBhcnJheQogICAgICAgIGZyb20gdGhlIGFkYXB0ZXIu CgogICAgICAgIEV4YW1wbGUKCiAgICAgICAgYGBgamF2YXNjcmlwdAogICAg ICAgIHZhciBwZW9wbGUgPSBzdG9yZS5hbGwoQXBwLlBlcnNvbik7CiAgICAg ICAgcGVvcGxlLmdldCgnaXNVcGRhdGluZycpOyAvLyBmYWxzZQogICAgICAg IHBlb3BsZS51cGRhdGUoKTsKICAgICAgICBwZW9wbGUuZ2V0KCdpc1VwZGF0 aW5nJyk7IC8vIHRydWUKICAgICAgICBgYGAKCiAgICAgICAgQG1ldGhvZCB1 cGRhdGUKICAgICAgKi8KICAgICAgdXBkYXRlOiBmdW5jdGlvbigpIHsKICAg ICAgICBpZiAoZ2V0KHRoaXMsICdpc1VwZGF0aW5nJykpIHsgcmV0dXJuOyB9 CgogICAgICAgIHZhciBzdG9yZSA9IGdldCh0aGlzLCAnc3RvcmUnKSwKICAg ICAgICAgICAgdHlwZSA9IGdldCh0aGlzLCAndHlwZScpOwoKICAgICAgICBy ZXR1cm4gc3RvcmUuZmV0Y2hBbGwodHlwZSwgdGhpcyk7CiAgICAgIH0sCgog ICAgICAvKioKICAgICAgICBBZGRzIGEgcmVjb3JkIHRvIHRoZSBgUmVjb3Jk QXJyYXlgLgoKICAgICAgICBAbWV0aG9kIGFkZFJlY29yZAogICAgICAgIEBw cml2YXRlCiAgICAgICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCiAgICAg ICovCiAgICAgIGFkZFJlY29yZDogZnVuY3Rpb24ocmVjb3JkKSB7CiAgICAg ICAgZ2V0KHRoaXMsICdjb250ZW50JykuYWRkT2JqZWN0KHJlY29yZCk7CiAg ICAgIH0sCgogICAgICAvKioKICAgICAgICBSZW1vdmVzIGEgcmVjb3JkIHRv IHRoZSBgUmVjb3JkQXJyYXlgLgoKICAgICAgICBAbWV0aG9kIHJlbW92ZVJl Y29yZAogICAgICAgIEBwcml2YXRlCiAgICAgICAgQHBhcmFtIHtEUy5Nb2Rl bH0gcmVjb3JkCiAgICAgICovCiAgICAgIHJlbW92ZVJlY29yZDogZnVuY3Rp b24ocmVjb3JkKSB7CiAgICAgICAgZ2V0KHRoaXMsICdjb250ZW50JykucmVt b3ZlT2JqZWN0KHJlY29yZCk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAg ICBTYXZlcyBhbGwgb2YgdGhlIHJlY29yZHMgaW4gdGhlIGBSZWNvcmRBcnJh eWAuCgogICAgICAgIEV4YW1wbGUKCiAgICAgICAgYGBgamF2YXNjcmlwdAog ICAgICAgIHZhciBtZXNzYWdlcyA9IHN0b3JlLmFsbChBcHAuTWVzc2FnZSk7 CiAgICAgICAgbWVzc2FnZXMuZm9yRWFjaChmdW5jdGlvbihtZXNzYWdlKSB7 CiAgICAgICAgICBtZXNzYWdlLnNldCgnaGFzQmVlblNlZW4nLCB0cnVlKTsK ICAgICAgICB9KTsKICAgICAgICBtZXNzYWdlcy5zYXZlKCk7CiAgICAgICAg YGBgCgogICAgICAgIEBtZXRob2Qgc2F2ZQogICAgICAgIEByZXR1cm4ge0RT LlByb21pc2VBcnJheX0gcHJvbWlzZQogICAgICAqLwogICAgICBzYXZlOiBm dW5jdGlvbigpIHsKICAgICAgICB2YXIgcHJvbWlzZUxhYmVsID0gIkRTOiBS ZWNvcmRBcnJheSNzYXZlICIgKyBnZXQodGhpcywgJ3R5cGUnKTsKICAgICAg ICB2YXIgcHJvbWlzZSA9IEVtYmVyLlJTVlAuYWxsKHRoaXMuaW52b2tlKCJz YXZlIiksIHByb21pc2VMYWJlbCkudGhlbihmdW5jdGlvbihhcnJheSkgewog ICAgICAgICAgcmV0dXJuIEVtYmVyLkEoYXJyYXkpOwogICAgICAgIH0sIG51 bGwsICJEUzogUmVjb3JkQXJyYXkjc2F2ZSBhcHBseSBFbWJlci5OYXRpdmVB cnJheSIpOwoKICAgICAgICByZXR1cm4gUHJvbWlzZUFycmF5LmNyZWF0ZSh7 IHByb21pc2U6IHByb21pc2UgfSk7CiAgICAgIH0sCgogICAgICBfZGlzc29j aWF0ZUZyb21Pd25SZWNvcmRzOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIg YXJyYXkgPSB0aGlzOwoKICAgICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24o cmVjb3JkKXsKICAgICAgICAgIHZhciByZWNvcmRBcnJheXMgPSByZWNvcmQu X3JlY29yZEFycmF5czsKCiAgICAgICAgICBpZiAocmVjb3JkQXJyYXlzKSB7 CiAgICAgICAgICAgIHJlY29yZEFycmF5cy5yZW1vdmUoYXJyYXkpOwogICAg ICAgICAgfQogICAgICAgIH0pOwogICAgICB9LAoKICAgICAgd2lsbERlc3Ry b3k6IGZ1bmN0aW9uKCl7CiAgICAgICAgdGhpcy5fZGlzc29jaWF0ZUZyb21P d25SZWNvcmRzKCk7CiAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgfQog ICAgfSk7CgogICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9IFJlY29yZEFy cmF5OwogIH0pOwpkZWZpbmUoImVtYmVyLWRhdGEvbGliL3N5c3RlbS9yZWxh dGlvbnNoaXBzIiwgCiAgWyIuL3JlbGF0aW9uc2hpcHMvYmVsb25nc190byIs Ii4vcmVsYXRpb25zaGlwcy9oYXNfbWFueSIsIi4uL3N5c3RlbS9yZWxhdGlv bnNoaXBzL2V4dCIsImV4cG9ydHMiXSwKICBmdW5jdGlvbihfX2RlcGVuZGVu Y3kxX18sIF9fZGVwZW5kZW5jeTJfXywgX19kZXBlbmRlbmN5M19fLCBfX2V4 cG9ydHNfXykgewogICAgInVzZSBzdHJpY3QiOwogICAgLyoqCiAgICAgIEBt b2R1bGUgZW1iZXItZGF0YQogICAgKi8KCiAgICB2YXIgYmVsb25nc1RvID0g X19kZXBlbmRlbmN5MV9fWyJkZWZhdWx0Il07CiAgICB2YXIgaGFzTWFueSA9 IF9fZGVwZW5kZW5jeTJfX1siZGVmYXVsdCJdOwoKCiAgICBfX2V4cG9ydHNf Xy5iZWxvbmdzVG8gPSBiZWxvbmdzVG87CiAgICBfX2V4cG9ydHNfXy5oYXNN YW55ID0gaGFzTWFueTsKICB9KTsKZGVmaW5lKCJlbWJlci1kYXRhL2xpYi9z eXN0ZW0vcmVsYXRpb25zaGlwcy9iZWxvbmdzX3RvIiwgCiAgWyIuLi9tb2Rl bCIsImV4cG9ydHMiXSwKICBmdW5jdGlvbihfX2RlcGVuZGVuY3kxX18sIF9f ZXhwb3J0c19fKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgZ2V0ID0g RW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQsCiAgICAgICAgaXNOb25lID0g RW1iZXIuaXNOb25lOwoKICAgIHZhciBQcm9taXNlID0gRW1iZXIuUlNWUC5Q cm9taXNlOwoKICAgIHZhciBNb2RlbCA9IF9fZGVwZW5kZW5jeTFfXy5Nb2Rl bDsKCiAgICAvKioKICAgICAgQG1vZHVsZSBlbWJlci1kYXRhCiAgICAqLwoK ICAgIGZ1bmN0aW9uIGFzeW5jQmVsb25nc1RvKHR5cGUsIG9wdGlvbnMsIG1l dGEpIHsKICAgICAgcmV0dXJuIEVtYmVyLmNvbXB1dGVkKCdkYXRhJywgZnVu Y3Rpb24oa2V5LCB2YWx1ZSkgewogICAgICAgIHZhciBkYXRhID0gZ2V0KHRo aXMsICdkYXRhJyksCiAgICAgICAgICAgIHN0b3JlID0gZ2V0KHRoaXMsICdz dG9yZScpLAogICAgICAgICAgICBwcm9taXNlTGFiZWwgPSAiRFM6IEFzeW5j IGJlbG9uZ3NUbyAiICsgdGhpcyArICIgOiAiICsga2V5LAogICAgICAgICAg ICBwcm9taXNlOwoKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0g MikgewogICAgICAgICAgRW1iZXIuYXNzZXJ0KCJZb3UgY2FuIG9ubHkgYWRk IGEgJyIgKyB0eXBlICsgIicgcmVjb3JkIHRvIHRoaXMgcmVsYXRpb25zaGlw IiwgIXZhbHVlIHx8IHZhbHVlIGluc3RhbmNlb2Ygc3RvcmUubW9kZWxGb3Io dHlwZSkpOwogICAgICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQg PyBudWxsIDogRFMuUHJvbWlzZU9iamVjdC5jcmVhdGUoewogICAgICAgICAg ICBwcm9taXNlOiBQcm9taXNlLmNhc3QodmFsdWUsIHByb21pc2VMYWJlbCkK ICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgdmFyIGxpbmsgPSBk YXRhLmxpbmtzICYmIGRhdGEubGlua3Nba2V5XSwKICAgICAgICAgICAgYmVs b25nc1RvID0gZGF0YVtrZXldOwoKICAgICAgICBpZighaXNOb25lKGJlbG9u Z3NUbykpIHsKICAgICAgICAgIHByb21pc2UgPSBzdG9yZS5mZXRjaFJlY29y ZChiZWxvbmdzVG8pIHx8IFByb21pc2UuY2FzdChiZWxvbmdzVG8sIHByb21p c2VMYWJlbCk7CiAgICAgICAgICByZXR1cm4gRFMuUHJvbWlzZU9iamVjdC5j cmVhdGUoewogICAgICAgICAgICBwcm9taXNlOiBwcm9taXNlCiAgICAgICAg ICB9KTsKICAgICAgICB9IGVsc2UgaWYgKGxpbmspIHsKICAgICAgICAgIHBy b21pc2UgPSBzdG9yZS5maW5kQmVsb25nc1RvKHRoaXMsIGxpbmssIG1ldGEp OwogICAgICAgICAgcmV0dXJuIERTLlByb21pc2VPYmplY3QuY3JlYXRlKHsK ICAgICAgICAgICAgcHJvbWlzZTogcHJvbWlzZQogICAgICAgICAgfSk7CiAg ICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAg IH0KICAgICAgfSkubWV0YShtZXRhKTsKICAgIH0KCiAgICAvKioKICAgICAg YERTLmJlbG9uZ3NUb2AgaXMgdXNlZCB0byBkZWZpbmUgT25lLVRvLU9uZSBh bmQgT25lLVRvLU1hbnkKICAgICAgcmVsYXRpb25zaGlwcyBvbiBhIFtEUy5N b2RlbF0oL2FwaS9kYXRhL2NsYXNzZXMvRFMuTW9kZWwuaHRtbCkuCgoKICAg ICAgYERTLmJlbG9uZ3NUb2AgdGFrZXMgYW4gb3B0aW9uYWwgaGFzaCBhcyBh IHNlY29uZCBwYXJhbWV0ZXIsIGN1cnJlbnRseQogICAgICBzdXBwb3J0ZWQg b3B0aW9ucyBhcmU6CgogICAgICAtIGBhc3luY2A6IEEgYm9vbGVhbiB2YWx1 ZSB1c2VkIHRvIGV4cGxpY2l0bHkgZGVjbGFyZSB0aGlzIHRvIGJlIGFuIGFz eW5jIHJlbGF0aW9uc2hpcC4KICAgICAgLSBgaW52ZXJzZWA6IEEgc3RyaW5n IHVzZWQgdG8gaWRlbnRpZnkgdGhlIGludmVyc2UgcHJvcGVydHkgb24gYQog ICAgICAgIHJlbGF0ZWQgbW9kZWwgaW4gYSBPbmUtVG8tTWFueSByZWxhdGlv bnNoaXAuIFNlZSBbRXhwbGljaXQgSW52ZXJzZXNdKCN0b2NfZXhwbGljaXQt aW52ZXJzZXMpCgogICAgICAjIyMjIE9uZS1Uby1PbmUKICAgICAgVG8gZGVj bGFyZSBhIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIG1v ZGVscywgdXNlCiAgICAgIGBEUy5iZWxvbmdzVG9gOgoKICAgICAgYGBgamF2 YXNjcmlwdAogICAgICBBcHAuVXNlciA9IERTLk1vZGVsLmV4dGVuZCh7CiAg ICAgICAgcHJvZmlsZTogRFMuYmVsb25nc1RvKCdwcm9maWxlJykKICAgICAg fSk7CgogICAgICBBcHAuUHJvZmlsZSA9IERTLk1vZGVsLmV4dGVuZCh7CiAg ICAgICAgdXNlcjogRFMuYmVsb25nc1RvKCd1c2VyJykKICAgICAgfSk7CiAg ICAgIGBgYAoKICAgICAgIyMjIyBPbmUtVG8tTWFueQogICAgICBUbyBkZWNs YXJlIGEgb25lLXRvLW1hbnkgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIG1v ZGVscywgdXNlCiAgICAgIGBEUy5iZWxvbmdzVG9gIGluIGNvbWJpbmF0aW9u IHdpdGggYERTLmhhc01hbnlgLCBsaWtlIHRoaXM6CgogICAgICBgYGBqYXZh c2NyaXB0CiAgICAgIEFwcC5Qb3N0ID0gRFMuTW9kZWwuZXh0ZW5kKHsKICAg ICAgICBjb21tZW50czogRFMuaGFzTWFueSgnY29tbWVudCcpCiAgICAgIH0p OwoKICAgICAgQXBwLkNvbW1lbnQgPSBEUy5Nb2RlbC5leHRlbmQoewogICAg ICAgIHBvc3Q6IERTLmJlbG9uZ3NUbygncG9zdCcpCiAgICAgIH0pOwogICAg ICBgYGAKCiAgICAgIEBuYW1lc3BhY2UKICAgICAgQG1ldGhvZCBiZWxvbmdz VG8KICAgICAgQGZvciBEUwogICAgICBAcGFyYW0ge1N0cmluZyBvciBEUy5N b2RlbH0gdHlwZSB0aGUgbW9kZWwgdHlwZSBvZiB0aGUgcmVsYXRpb25zaGlw CiAgICAgIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIGEgaGFzaCBvZiBvcHRp b25zCiAgICAgIEByZXR1cm4ge0VtYmVyLmNvbXB1dGVkfSByZWxhdGlvbnNo aXAKICAgICovCiAgICBmdW5jdGlvbiBiZWxvbmdzVG8odHlwZSwgb3B0aW9u cykgewogICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7CiAg ICAgICAgb3B0aW9ucyA9IHR5cGU7CiAgICAgICAgdHlwZSA9IHVuZGVmaW5l ZDsKICAgICAgfSBlbHNlIHsKICAgICAgICBFbWJlci5hc3NlcnQoIlRoZSBm aXJzdCBhcmd1bWVudCBEUy5iZWxvbmdzVG8gbXVzdCBiZSBhIG1vZGVsIHR5 cGUgb3Igc3RyaW5nLCBsaWtlIERTLmJlbG9uZ3NUbyhBcHAuUGVyc29uKSIs ICEhdHlwZSAmJiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IERTLk1v ZGVsLmRldGVjdCh0eXBlKSkpOwogICAgICB9CgogICAgICBvcHRpb25zID0g b3B0aW9ucyB8fCB7fTsKCiAgICAgIHZhciBtZXRhID0gewogICAgICAgIHR5 cGU6IHR5cGUsCiAgICAgICAgaXNSZWxhdGlvbnNoaXA6IHRydWUsCiAgICAg ICAgb3B0aW9uczogb3B0aW9ucywKICAgICAgICBraW5kOiAnYmVsb25nc1Rv JwogICAgICB9OwoKICAgICAgaWYgKG9wdGlvbnMuYXN5bmMpIHsKICAgICAg ICByZXR1cm4gYXN5bmNCZWxvbmdzVG8odHlwZSwgb3B0aW9ucywgbWV0YSk7 CiAgICAgIH0KCiAgICAgIHJldHVybiBFbWJlci5jb21wdXRlZCgnZGF0YScs IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICB2YXIgZGF0YSA9IGdl dCh0aGlzLCAnZGF0YScpLAogICAgICAgICAgICBzdG9yZSA9IGdldCh0aGlz LCAnc3RvcmUnKSwgYmVsb25nc1RvLCB0eXBlQ2xhc3M7CgogICAgICAgIGlm ICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgIHR5cGVD bGFzcyA9IHN0b3JlLm1vZGVsRm9yKHR5cGUpOwogICAgICAgIH0gZWxzZSB7 CiAgICAgICAgICB0eXBlQ2xhc3MgPSB0eXBlOwogICAgICAgIH0KCiAgICAg ICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKICAgICAgICAgIEVt YmVyLmFzc2VydCgiWW91IGNhbiBvbmx5IGFkZCBhICciICsgdHlwZSArICIn IHJlY29yZCB0byB0aGlzIHJlbGF0aW9uc2hpcCIsICF2YWx1ZSB8fCB2YWx1 ZSBpbnN0YW5jZW9mIHR5cGVDbGFzcyk7CiAgICAgICAgICByZXR1cm4gdmFs dWUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiB2YWx1ZTsKICAgICAgICB9Cgog ICAgICAgIGJlbG9uZ3NUbyA9IGRhdGFba2V5XTsKCiAgICAgICAgaWYgKGlz Tm9uZShiZWxvbmdzVG8pKSB7IHJldHVybiBudWxsOyB9CgogICAgICAgIHN0 b3JlLmZldGNoUmVjb3JkKGJlbG9uZ3NUbyk7CgogICAgICAgIHJldHVybiBi ZWxvbmdzVG87CiAgICAgIH0pLm1ldGEobWV0YSk7CiAgICB9CgogICAgLyoq CiAgICAgIFRoZXNlIG9ic2VydmVycyBvYnNlcnZlIGFsbCBgYmVsb25nc1Rv YCByZWxhdGlvbnNoaXBzIG9uIHRoZSByZWNvcmQuIFNlZQogICAgICBgcmVs YXRpb25zaGlwcy9leHRgIHRvIHNlZSBob3cgdGhlc2Ugb2JzZXJ2ZXJzIGdl dCB0aGVpciBkZXBlbmRlbmNpZXMuCgogICAgICBAY2xhc3MgTW9kZWwKICAg ICAgQG5hbWVzcGFjZSBEUwogICAgKi8KICAgIE1vZGVsLnJlb3Blbih7Cgog ICAgICAvKioKICAgICAgICBAbWV0aG9kIGJlbG9uZ3NUb1dpbGxDaGFuZ2UK ICAgICAgICBAcHJpdmF0ZQogICAgICAgIEBzdGF0aWMKICAgICAgICBAcGFy YW0gcmVjb3JkCiAgICAgICAgQHBhcmFtIGtleQogICAgICAqLwogICAgICBi ZWxvbmdzVG9XaWxsQ2hhbmdlOiBFbWJlci5iZWZvcmVPYnNlcnZlcihmdW5j dGlvbihyZWNvcmQsIGtleSkgewogICAgICAgIGlmIChnZXQocmVjb3JkLCAn aXNMb2FkZWQnKSkgewogICAgICAgICAgdmFyIG9sZFBhcmVudCA9IGdldChy ZWNvcmQsIGtleSk7CgogICAgICAgICAgaWYgKG9sZFBhcmVudCkgewogICAg ICAgICAgICB2YXIgc3RvcmUgPSBnZXQocmVjb3JkLCAnc3RvcmUnKSwKICAg ICAgICAgICAgICAgIGNoYW5nZSA9IERTLlJlbGF0aW9uc2hpcENoYW5nZS5j cmVhdGVDaGFuZ2UocmVjb3JkLCBvbGRQYXJlbnQsIHN0b3JlLCB7IGtleTog a2V5LCBraW5kOiAiYmVsb25nc1RvIiwgY2hhbmdlVHlwZTogInJlbW92ZSIg fSk7CgogICAgICAgICAgICBjaGFuZ2Uuc3luYygpOwogICAgICAgICAgICB0 aGlzLl9jaGFuZ2VzVG9TeW5jW2tleV0gPSBjaGFuZ2U7CiAgICAgICAgICB9 CiAgICAgICAgfQogICAgICB9KSwKCiAgICAgIC8qKgogICAgICAgIEBtZXRo b2QgYmVsb25nc1RvRGlkQ2hhbmdlCiAgICAgICAgQHByaXZhdGUKICAgICAg ICBAc3RhdGljCiAgICAgICAgQHBhcmFtIHJlY29yZAogICAgICAgIEBwYXJh bSBrZXkKICAgICAgKi8KICAgICAgYmVsb25nc1RvRGlkQ2hhbmdlOiBFbWJl ci5pbW1lZGlhdGVPYnNlcnZlcihmdW5jdGlvbihyZWNvcmQsIGtleSkgewog ICAgICAgIGlmIChnZXQocmVjb3JkLCAnaXNMb2FkZWQnKSkgewogICAgICAg ICAgdmFyIG5ld1BhcmVudCA9IGdldChyZWNvcmQsIGtleSk7CgogICAgICAg ICAgaWYgKG5ld1BhcmVudCkgewogICAgICAgICAgICB2YXIgc3RvcmUgPSBn ZXQocmVjb3JkLCAnc3RvcmUnKSwKICAgICAgICAgICAgICAgIGNoYW5nZSA9 IERTLlJlbGF0aW9uc2hpcENoYW5nZS5jcmVhdGVDaGFuZ2UocmVjb3JkLCBu ZXdQYXJlbnQsIHN0b3JlLCB7IGtleToga2V5LCBraW5kOiAiYmVsb25nc1Rv IiwgY2hhbmdlVHlwZTogImFkZCIgfSk7CgogICAgICAgICAgICBjaGFuZ2Uu c3luYygpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZGVsZXRl IHRoaXMuX2NoYW5nZXNUb1N5bmNba2V5XTsKICAgICAgfSkKICAgIH0pOwoK ICAgIF9fZXhwb3J0c19fWyJkZWZhdWx0Il0gPSBiZWxvbmdzVG87CiAgfSk7 CmRlZmluZSgiZW1iZXItZGF0YS9saWIvc3lzdGVtL3JlbGF0aW9uc2hpcHMv ZXh0IiwgCiAgWyIuLi8uLi8uLi8uLi9lbWJlci1pbmZsZWN0b3IvbGliL3N5 c3RlbSIsIi4uL21vZGVsIl0sCiAgZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9f LCBfX2RlcGVuZGVuY3kyX18pIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIHZh ciBzaW5ndWxhcml6ZSA9IF9fZGVwZW5kZW5jeTFfXy5zaW5ndWxhcml6ZTsK ICAgIHZhciBNb2RlbCA9IF9fZGVwZW5kZW5jeTJfXy5Nb2RlbDsKCiAgICB2 YXIgZ2V0ID0gRW1iZXIuZ2V0LCBzZXQgPSBFbWJlci5zZXQ7CgogICAgLyoq CiAgICAgIEBtb2R1bGUgZW1iZXItZGF0YQogICAgKi8KCiAgICAvKgogICAg ICBUaGlzIGZpbGUgZGVmaW5lcyBzZXZlcmFsIGV4dGVuc2lvbnMgdG8gdGhl IGJhc2UgYERTLk1vZGVsYCBjbGFzcyB0aGF0CiAgICAgIGFkZCBzdXBwb3J0 IGZvciBvbmUtdG8tbWFueSByZWxhdGlvbnNoaXBzLgogICAgKi8KCiAgICAv KioKICAgICAgQGNsYXNzIE1vZGVsCiAgICAgIEBuYW1lc3BhY2UgRFMKICAg ICovCiAgICBNb2RlbC5yZW9wZW4oewoKICAgICAgLyoqCiAgICAgICAgVGhp cyBFbWJlci5qcyBob29rIGFsbG93cyBhbiBvYmplY3QgdG8gYmUgbm90aWZp ZWQgd2hlbiBhIHByb3BlcnR5CiAgICAgICAgaXMgZGVmaW5lZC4KCiAgICAg ICAgSW4gdGhpcyBjYXNlLCB3ZSB1c2UgaXQgdG8gYmUgbm90aWZpZWQgd2hl biBhbiBFbWJlciBEYXRhIHVzZXIgZGVmaW5lcyBhCiAgICAgICAgYmVsb25n cy10byByZWxhdGlvbnNoaXAuIEluIHRoYXQgY2FzZSwgd2UgbmVlZCB0byBz ZXQgdXAgb2JzZXJ2ZXJzIGZvcgogICAgICAgIGVhY2ggb25lLCBhbGxvd2lu ZyB1cyB0byB0cmFjayByZWxhdGlvbnNoaXAgY2hhbmdlcyBhbmQgYXV0b21h dGljYWxseQogICAgICAgIHJlZmxlY3QgY2hhbmdlcyBpbiB0aGUgaW52ZXJz ZSBoYXMtbWFueSBhcnJheS4KCiAgICAgICAgVGhpcyBob29rIHBhc3NlcyB0 aGUgY2xhc3MgYmVpbmcgc2V0IHVwLCBhcyB3ZWxsIGFzIHRoZSBrZXkgYW5k IHZhbHVlCiAgICAgICAgYmVpbmcgZGVmaW5lZC4gU28sIGZvciBleGFtcGxl LCB3aGVuIHRoZSB1c2VyIGRvZXMgdGhpczoKCiAgICAgICAgYGBgamF2YXNj cmlwdAogICAgICAgIERTLk1vZGVsLmV4dGVuZCh7CiAgICAgICAgICBwYXJl bnQ6IERTLmJlbG9uZ3NUbygndXNlcicpCiAgICAgICAgfSk7CiAgICAgICAg YGBgCgogICAgICAgIFRoaXMgaG9vayB3b3VsZCBiZSBjYWxsZWQgd2l0aCAi cGFyZW50IiBhcyB0aGUga2V5IGFuZCB0aGUgY29tcHV0ZWQKICAgICAgICBw cm9wZXJ0eSByZXR1cm5lZCBieSBgRFMuYmVsb25nc1RvYCBhcyB0aGUgdmFs dWUuCgogICAgICAgIEBtZXRob2QgZGlkRGVmaW5lUHJvcGVydHkKICAgICAg ICBAcGFyYW0gcHJvdG8KICAgICAgICBAcGFyYW0ga2V5CiAgICAgICAgQHBh cmFtIHZhbHVlCiAgICAgICovCiAgICAgIGRpZERlZmluZVByb3BlcnR5OiBm dW5jdGlvbihwcm90bywga2V5LCB2YWx1ZSkgewogICAgICAgIC8vIENoZWNr IGlmIHRoZSB2YWx1ZSBiZWluZyBzZXQgaXMgYSBjb21wdXRlZCBwcm9wZXJ0 eS4KICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFbWJlci5EZXNjcmlw dG9yKSB7CgogICAgICAgICAgLy8gSWYgaXQgaXMsIGdldCB0aGUgbWV0YWRh dGEgZm9yIHRoZSByZWxhdGlvbnNoaXAuIFRoaXMgaXMKICAgICAgICAgIC8v IHBvcHVsYXRlZCBieSB0aGUgYERTLmJlbG9uZ3NUb2AgaGVscGVyIHdoZW4g aXQgaXMgY3JlYXRpbmcKICAgICAgICAgIC8vIHRoZSBjb21wdXRlZCBwcm9w ZXJ0eS4KICAgICAgICAgIHZhciBtZXRhID0gdmFsdWUubWV0YSgpOwoKICAg ICAgICAgIGlmIChtZXRhLmlzUmVsYXRpb25zaGlwICYmIG1ldGEua2luZCA9 PT0gJ2JlbG9uZ3NUbycpIHsKICAgICAgICAgICAgRW1iZXIuYWRkT2JzZXJ2 ZXIocHJvdG8sIGtleSwgbnVsbCwgJ2JlbG9uZ3NUb0RpZENoYW5nZScpOwog ICAgICAgICAgICBFbWJlci5hZGRCZWZvcmVPYnNlcnZlcihwcm90bywga2V5 LCBudWxsLCAnYmVsb25nc1RvV2lsbENoYW5nZScpOwogICAgICAgICAgfQoK ICAgICAgICAgIG1ldGEucGFyZW50VHlwZSA9IHByb3RvLmNvbnN0cnVjdG9y OwogICAgICAgIH0KICAgICAgfQogICAgfSk7CgogICAgLyoKICAgICAgVGhl c2UgRFMuTW9kZWwgZXh0ZW5zaW9ucyBhZGQgY2xhc3MgbWV0aG9kcyB0aGF0 IHByb3ZpZGUgcmVsYXRpb25zaGlwCiAgICAgIGludHJvc3BlY3Rpb24gYWJp bGl0aWVzIGFib3V0IHJlbGF0aW9uc2hpcHMuCgogICAgICBBIG5vdGUgYWJv dXQgdGhlIGNvbXB1dGVkIHByb3BlcnRpZXMgY29udGFpbmVkIGhlcmU6Cgog ICAgICAqKlRoZXNlIHByb3BlcnRpZXMgYXJlIGVmZmVjdGl2ZWx5IHNlYWxl ZCBvbmNlIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUuKioKICAgICAgVG8g YXZvaWQgcmVwZWF0ZWRseSBkb2luZyBleHBlbnNpdmUgaXRlcmF0aW9uIG92 ZXIgYSBtb2RlbCdzIGZpZWxkcywgdGhlc2UKICAgICAgdmFsdWVzIGFyZSBj b21wdXRlZCBvbmNlIGFuZCB0aGVuIGNhY2hlZCBmb3IgdGhlIHJlbWFpbmRl ciBvZiB0aGUgcnVudGltZSBvZgogICAgICB5b3VyIGFwcGxpY2F0aW9uLgoK ICAgICAgSWYgeW91ciBhcHBsaWNhdGlvbiBuZWVkcyB0byBtb2RpZnkgYSBj bGFzcyBhZnRlciBpdHMgaW5pdGlhbCBkZWZpbml0aW9uCiAgICAgIChmb3Ig ZXhhbXBsZSwgdXNpbmcgYHJlb3BlbigpYCB0byBhZGQgYWRkaXRpb25hbCBh dHRyaWJ1dGVzKSwgbWFrZSBzdXJlIHlvdQogICAgICBkbyBpdCBiZWZvcmUg dXNpbmcgeW91ciBtb2RlbCB3aXRoIHRoZSBzdG9yZSwgd2hpY2ggdXNlcyB0 aGVzZSBwcm9wZXJ0aWVzCiAgICAgIGV4dGVuc2l2ZWx5LgogICAgKi8KCiAg ICBNb2RlbC5yZW9wZW5DbGFzcyh7CiAgICAgIC8qKgogICAgICAgIEZvciBh IGdpdmVuIHJlbGF0aW9uc2hpcCBuYW1lLCByZXR1cm5zIHRoZSBtb2RlbCB0 eXBlIG9mIHRoZSByZWxhdGlvbnNoaXAuCgogICAgICAgIEZvciBleGFtcGxl LCBpZiB5b3UgZGVmaW5lIGEgbW9kZWwgbGlrZSB0aGlzOgoKICAgICAgIGBg YGphdmFzY3JpcHQKICAgICAgICBBcHAuUG9zdCA9IERTLk1vZGVsLmV4dGVu ZCh7CiAgICAgICAgICBjb21tZW50czogRFMuaGFzTWFueSgnY29tbWVudCcp CiAgICAgICAgfSk7CiAgICAgICBgYGAKCiAgICAgICAgQ2FsbGluZyBgQXBw LlBvc3QudHlwZUZvclJlbGF0aW9uc2hpcCgnY29tbWVudHMnKWAgd2lsbCBy ZXR1cm4gYEFwcC5Db21tZW50YC4KCiAgICAgICAgQG1ldGhvZCB0eXBlRm9y UmVsYXRpb25zaGlwCiAgICAgICAgQHN0YXRpYwogICAgICAgIEBwYXJhbSB7 U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAKICAg ICAgICBAcmV0dXJuIHtzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdGhlIHR5cGUg b2YgdGhlIHJlbGF0aW9uc2hpcCwgb3IgdW5kZWZpbmVkCiAgICAgICovCiAg ICAgIHR5cGVGb3JSZWxhdGlvbnNoaXA6IGZ1bmN0aW9uKG5hbWUpIHsKICAg ICAgICB2YXIgcmVsYXRpb25zaGlwID0gZ2V0KHRoaXMsICdyZWxhdGlvbnNo aXBzQnlOYW1lJykuZ2V0KG5hbWUpOwogICAgICAgIHJldHVybiByZWxhdGlv bnNoaXAgJiYgcmVsYXRpb25zaGlwLnR5cGU7CiAgICAgIH0sCgogICAgICBp bnZlcnNlRm9yOiBmdW5jdGlvbihuYW1lKSB7CiAgICAgICAgdmFyIGludmVy c2VUeXBlID0gdGhpcy50eXBlRm9yUmVsYXRpb25zaGlwKG5hbWUpOwoKICAg ICAgICBpZiAoIWludmVyc2VUeXBlKSB7IHJldHVybiBudWxsOyB9CgogICAg ICAgIHZhciBvcHRpb25zID0gdGhpcy5tZXRhRm9yUHJvcGVydHkobmFtZSku b3B0aW9uczsKCiAgICAgICAgaWYgKG9wdGlvbnMuaW52ZXJzZSA9PT0gbnVs bCkgeyByZXR1cm4gbnVsbDsgfQoKICAgICAgICB2YXIgaW52ZXJzZU5hbWUs IGludmVyc2VLaW5kOwoKICAgICAgICBpZiAob3B0aW9ucy5pbnZlcnNlKSB7 CiAgICAgICAgICBpbnZlcnNlTmFtZSA9IG9wdGlvbnMuaW52ZXJzZTsKICAg ICAgICAgIGludmVyc2VLaW5kID0gRW1iZXIuZ2V0KGludmVyc2VUeXBlLCAn cmVsYXRpb25zaGlwc0J5TmFtZScpLmdldChpbnZlcnNlTmFtZSkua2luZDsK ICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIHBvc3NpYmxlUmVsYXRp b25zaGlwcyA9IGZpbmRQb3NzaWJsZUludmVyc2VzKHRoaXMsIGludmVyc2VU eXBlKTsKCiAgICAgICAgICBpZiAocG9zc2libGVSZWxhdGlvbnNoaXBzLmxl bmd0aCA9PT0gMCkgeyByZXR1cm4gbnVsbDsgfQoKICAgICAgICAgIEVtYmVy LmFzc2VydCgiWW91IGRlZmluZWQgdGhlICciICsgbmFtZSArICInIHJlbGF0 aW9uc2hpcCBvbiAiICsgdGhpcyArICIsIGJ1dCBtdWx0aXBsZSBwb3NzaWJs ZSBpbnZlcnNlIHJlbGF0aW9uc2hpcHMgb2YgdHlwZSAiICsgdGhpcyArICIg d2VyZSBmb3VuZCBvbiAiICsgaW52ZXJzZVR5cGUgKyAiLiBMb29rIGF0IGh0 dHA6Ly9lbWJlcmpzLmNvbS9ndWlkZXMvbW9kZWxzL2RlZmluaW5nLW1vZGVs cy8jdG9jX2V4cGxpY2l0LWludmVyc2VzIGZvciBob3cgdG8gZXhwbGljaXRs eSBzcGVjaWZ5IGludmVyc2VzIiwgcG9zc2libGVSZWxhdGlvbnNoaXBzLmxl bmd0aCA9PT0gMSk7CgogICAgICAgICAgaW52ZXJzZU5hbWUgPSBwb3NzaWJs ZVJlbGF0aW9uc2hpcHNbMF0ubmFtZTsKICAgICAgICAgIGludmVyc2VLaW5k ID0gcG9zc2libGVSZWxhdGlvbnNoaXBzWzBdLmtpbmQ7CiAgICAgICAgfQoK ICAgICAgICBmdW5jdGlvbiBmaW5kUG9zc2libGVJbnZlcnNlcyh0eXBlLCBp bnZlcnNlVHlwZSwgcG9zc2libGVSZWxhdGlvbnNoaXBzKSB7CiAgICAgICAg ICBwb3NzaWJsZVJlbGF0aW9uc2hpcHMgPSBwb3NzaWJsZVJlbGF0aW9uc2hp cHMgfHwgW107CgogICAgICAgICAgdmFyIHJlbGF0aW9uc2hpcE1hcCA9IGdl dChpbnZlcnNlVHlwZSwgJ3JlbGF0aW9uc2hpcHMnKTsKICAgICAgICAgIGlm ICghcmVsYXRpb25zaGlwTWFwKSB7IHJldHVybjsgfQoKICAgICAgICAgIHZh ciByZWxhdGlvbnNoaXBzID0gcmVsYXRpb25zaGlwTWFwLmdldCh0eXBlKTsK ICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXBzKSB7CiAgICAgICAgICAgIHBv c3NpYmxlUmVsYXRpb25zaGlwcy5wdXNoLmFwcGx5KHBvc3NpYmxlUmVsYXRp b25zaGlwcywgcmVsYXRpb25zaGlwTWFwLmdldCh0eXBlKSk7CiAgICAgICAg ICB9CgogICAgICAgICAgaWYgKHR5cGUuc3VwZXJjbGFzcykgewogICAgICAg ICAgICBmaW5kUG9zc2libGVJbnZlcnNlcyh0eXBlLnN1cGVyY2xhc3MsIGlu dmVyc2VUeXBlLCBwb3NzaWJsZVJlbGF0aW9uc2hpcHMpOwogICAgICAgICAg fQoKICAgICAgICAgIHJldHVybiBwb3NzaWJsZVJlbGF0aW9uc2hpcHM7CiAg ICAgICAgfQoKICAgICAgICByZXR1cm4gewogICAgICAgICAgdHlwZTogaW52 ZXJzZVR5cGUsCiAgICAgICAgICBuYW1lOiBpbnZlcnNlTmFtZSwKICAgICAg ICAgIGtpbmQ6IGludmVyc2VLaW5kCiAgICAgICAgfTsKICAgICAgfSwKCiAg ICAgIC8qKgogICAgICAgIFRoZSBtb2RlbCdzIHJlbGF0aW9uc2hpcHMgYXMg YSBtYXAsIGtleWVkIG9uIHRoZSB0eXBlIG9mIHRoZQogICAgICAgIHJlbGF0 aW9uc2hpcC4gVGhlIHZhbHVlIG9mIGVhY2ggZW50cnkgaXMgYW4gYXJyYXkg Y29udGFpbmluZyBhIGRlc2NyaXB0b3IKICAgICAgICBmb3IgZWFjaCByZWxh dGlvbnNoaXAgd2l0aCB0aGF0IHR5cGUsIGRlc2NyaWJpbmcgdGhlIG5hbWUg b2YgdGhlIHJlbGF0aW9uc2hpcAogICAgICAgIGFzIHdlbGwgYXMgdGhlIHR5 cGUuCgogICAgICAgIEZvciBleGFtcGxlLCBnaXZlbiB0aGUgZm9sbG93aW5n IG1vZGVsIGRlZmluaXRpb246CgogICAgICAgIGBgYGphdmFzY3JpcHQKICAg ICAgICBBcHAuQmxvZyA9IERTLk1vZGVsLmV4dGVuZCh7CiAgICAgICAgICB1 c2VyczogRFMuaGFzTWFueSgndXNlcicpLAogICAgICAgICAgb3duZXI6IERT LmJlbG9uZ3NUbygndXNlcicpLAogICAgICAgICAgcG9zdHM6IERTLmhhc01h bnkoJ3Bvc3QnKQogICAgICAgIH0pOwogICAgICAgIGBgYAoKICAgICAgICBU aGlzIGNvbXB1dGVkIHByb3BlcnR5IHdvdWxkIHJldHVybiBhIG1hcCBkZXNj cmliaW5nIHRoZXNlCiAgICAgICAgcmVsYXRpb25zaGlwcywgbGlrZSB0aGlz OgoKICAgICAgICBgYGBqYXZhc2NyaXB0CiAgICAgICAgdmFyIHJlbGF0aW9u c2hpcHMgPSBFbWJlci5nZXQoQXBwLkJsb2csICdyZWxhdGlvbnNoaXBzJyk7 CiAgICAgICAgcmVsYXRpb25zaGlwcy5nZXQoQXBwLlVzZXIpOwogICAgICAg IC8vPT4gWyB7IG5hbWU6ICd1c2VycycsIGtpbmQ6ICdoYXNNYW55JyB9LAog ICAgICAgIC8vICAgICB7IG5hbWU6ICdvd25lcicsIGtpbmQ6ICdiZWxvbmdz VG8nIH0gXQogICAgICAgIHJlbGF0aW9uc2hpcHMuZ2V0KEFwcC5Qb3N0KTsK ICAgICAgICAvLz0+IFsgeyBuYW1lOiAncG9zdHMnLCBraW5kOiAnaGFzTWFu eScgfSBdCiAgICAgICAgYGBgCgogICAgICAgIEBwcm9wZXJ0eSByZWxhdGlv bnNoaXBzCiAgICAgICAgQHN0YXRpYwogICAgICAgIEB0eXBlIEVtYmVyLk1h cAogICAgICAgIEByZWFkT25seQogICAgICAqLwogICAgICByZWxhdGlvbnNo aXBzOiBFbWJlci5jb21wdXRlZChmdW5jdGlvbigpIHsKICAgICAgICB2YXIg bWFwID0gbmV3IEVtYmVyLk1hcFdpdGhEZWZhdWx0KHsKICAgICAgICAgIGRl ZmF1bHRWYWx1ZTogZnVuY3Rpb24oKSB7IHJldHVybiBbXTsgfQogICAgICAg IH0pOwoKICAgICAgICAvLyBMb29wIHRocm91Z2ggZWFjaCBjb21wdXRlZCBw cm9wZXJ0eSBvbiB0aGUgY2xhc3MKICAgICAgICB0aGlzLmVhY2hDb21wdXRl ZFByb3BlcnR5KGZ1bmN0aW9uKG5hbWUsIG1ldGEpIHsKCiAgICAgICAgICAv LyBJZiB0aGUgY29tcHV0ZWQgcHJvcGVydHkgaXMgYSByZWxhdGlvbnNoaXAs IGFkZAogICAgICAgICAgLy8gaXQgdG8gdGhlIG1hcC4KICAgICAgICAgIGlm IChtZXRhLmlzUmVsYXRpb25zaGlwKSB7CiAgICAgICAgICAgIGlmICh0eXBl b2YgbWV0YS50eXBlID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgIG1l dGEudHlwZSA9IHRoaXMuc3RvcmUubW9kZWxGb3IobWV0YS50eXBlKTsKICAg ICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHJlbGF0aW9uc2hpcHNGb3JU eXBlID0gbWFwLmdldChtZXRhLnR5cGUpOwoKICAgICAgICAgICAgcmVsYXRp b25zaGlwc0ZvclR5cGUucHVzaCh7IG5hbWU6IG5hbWUsIGtpbmQ6IG1ldGEu a2luZCB9KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgcmV0 dXJuIG1hcDsKICAgICAgfSksCgogICAgICAvKioKICAgICAgICBBIGhhc2gg Y29udGFpbmluZyBsaXN0cyBvZiB0aGUgbW9kZWwncyByZWxhdGlvbnNoaXBz LCBncm91cGVkCiAgICAgICAgYnkgdGhlIHJlbGF0aW9uc2hpcCBraW5kLiBG b3IgZXhhbXBsZSwgZ2l2ZW4gYSBtb2RlbCB3aXRoIHRoaXMKICAgICAgICBk ZWZpbml0aW9uOgoKICAgICAgICBgYGBqYXZhc2NyaXB0CiAgICAgICAgQXBw LkJsb2cgPSBEUy5Nb2RlbC5leHRlbmQoewogICAgICAgICAgdXNlcnM6IERT Lmhhc01hbnkoJ3VzZXInKSwKICAgICAgICAgIG93bmVyOiBEUy5iZWxvbmdz VG8oJ3VzZXInKSwKCiAgICAgICAgICBwb3N0czogRFMuaGFzTWFueSgncG9z dCcpCiAgICAgICAgfSk7CiAgICAgICAgYGBgCgogICAgICAgIFRoaXMgcHJv cGVydHkgd291bGQgY29udGFpbiB0aGUgZm9sbG93aW5nOgoKICAgICAgICBg YGBqYXZhc2NyaXB0CiAgICAgICAgdmFyIHJlbGF0aW9uc2hpcE5hbWVzID0g RW1iZXIuZ2V0KEFwcC5CbG9nLCAncmVsYXRpb25zaGlwTmFtZXMnKTsKICAg ICAgICByZWxhdGlvbnNoaXBOYW1lcy5oYXNNYW55OwogICAgICAgIC8vPT4g Wyd1c2VycycsICdwb3N0cyddCiAgICAgICAgcmVsYXRpb25zaGlwTmFtZXMu YmVsb25nc1RvOwogICAgICAgIC8vPT4gWydvd25lciddCiAgICAgICAgYGBg CgogICAgICAgIEBwcm9wZXJ0eSByZWxhdGlvbnNoaXBOYW1lcwogICAgICAg IEBzdGF0aWMKICAgICAgICBAdHlwZSBPYmplY3QKICAgICAgICBAcmVhZE9u bHkKICAgICAgKi8KICAgICAgcmVsYXRpb25zaGlwTmFtZXM6IEVtYmVyLmNv bXB1dGVkKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBuYW1lcyA9IHsgaGFz TWFueTogW10sIGJlbG9uZ3NUbzogW10gfTsKCiAgICAgICAgdGhpcy5lYWNo Q29tcHV0ZWRQcm9wZXJ0eShmdW5jdGlvbihuYW1lLCBtZXRhKSB7CiAgICAg ICAgICBpZiAobWV0YS5pc1JlbGF0aW9uc2hpcCkgewogICAgICAgICAgICBu YW1lc1ttZXRhLmtpbmRdLnB1c2gobmFtZSk7CiAgICAgICAgICB9CiAgICAg ICAgfSk7CgogICAgICAgIHJldHVybiBuYW1lczsKICAgICAgfSksCgogICAg ICAvKioKICAgICAgICBBbiBhcnJheSBvZiB0eXBlcyBkaXJlY3RseSByZWxh dGVkIHRvIGEgbW9kZWwuIEVhY2ggdHlwZSB3aWxsIGJlCiAgICAgICAgaW5j bHVkZWQgb25jZSwgcmVnYXJkbGVzcyBvZiB0aGUgbnVtYmVyIG9mIHJlbGF0 aW9uc2hpcHMgaXQgaGFzIHdpdGgKICAgICAgICB0aGUgbW9kZWwuCgogICAg ICAgIEZvciBleGFtcGxlLCBnaXZlbiBhIG1vZGVsIHdpdGggdGhpcyBkZWZp bml0aW9uOgoKICAgICAgICBgYGBqYXZhc2NyaXB0CiAgICAgICAgQXBwLkJs b2cgPSBEUy5Nb2RlbC5leHRlbmQoewogICAgICAgICAgdXNlcnM6IERTLmhh c01hbnkoJ3VzZXInKSwKICAgICAgICAgIG93bmVyOiBEUy5iZWxvbmdzVG8o J3VzZXInKSwKCiAgICAgICAgICBwb3N0czogRFMuaGFzTWFueSgncG9zdCcp CiAgICAgICAgfSk7CiAgICAgICAgYGBgCgogICAgICAgIFRoaXMgcHJvcGVy dHkgd291bGQgY29udGFpbiB0aGUgZm9sbG93aW5nOgoKICAgICAgICBgYGBq YXZhc2NyaXB0CiAgICAgICAgdmFyIHJlbGF0ZWRUeXBlcyA9IEVtYmVyLmdl dChBcHAuQmxvZywgJ3JlbGF0ZWRUeXBlcycpOwogICAgICAgIC8vPT4gWyBB cHAuVXNlciwgQXBwLlBvc3QgXQogICAgICAgIGBgYAoKICAgICAgICBAcHJv cGVydHkgcmVsYXRlZFR5cGVzCiAgICAgICAgQHN0YXRpYwogICAgICAgIEB0 eXBlIEVtYmVyLkFycmF5CiAgICAgICAgQHJlYWRPbmx5CiAgICAgICovCiAg ICAgIHJlbGF0ZWRUeXBlczogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7 CiAgICAgICAgdmFyIHR5cGUsCiAgICAgICAgICAgIHR5cGVzID0gRW1iZXIu QSgpOwoKICAgICAgICAvLyBMb29wIHRocm91Z2ggZWFjaCBjb21wdXRlZCBw cm9wZXJ0eSBvbiB0aGUgY2xhc3MsCiAgICAgICAgLy8gYW5kIGNyZWF0ZSBh biBhcnJheSBvZiB0aGUgdW5pcXVlIHR5cGVzIGludm9sdmVkCiAgICAgICAg Ly8gaW4gcmVsYXRpb25zaGlwcwogICAgICAgIHRoaXMuZWFjaENvbXB1dGVk UHJvcGVydHkoZnVuY3Rpb24obmFtZSwgbWV0YSkgewogICAgICAgICAgaWYg KG1ldGEuaXNSZWxhdGlvbnNoaXApIHsKICAgICAgICAgICAgdHlwZSA9IG1l dGEudHlwZTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0 cmluZycpIHsKICAgICAgICAgICAgICB0eXBlID0gZ2V0KHRoaXMsIHR5cGUs IGZhbHNlKSB8fCB0aGlzLnN0b3JlLm1vZGVsRm9yKHR5cGUpOwogICAgICAg ICAgICB9CgogICAgICAgICAgICBFbWJlci5hc3NlcnQoIllvdSBzcGVjaWZp ZWQgYSBoYXNNYW55ICgiICsgbWV0YS50eXBlICsgIikgb24gIiArIG1ldGEu cGFyZW50VHlwZSArICIgYnV0ICIgKyBtZXRhLnR5cGUgKyAiIHdhcyBub3Qg Zm91bmQuIiwgIHR5cGUpOwoKICAgICAgICAgICAgaWYgKCF0eXBlcy5jb250 YWlucyh0eXBlKSkgewogICAgICAgICAgICAgIEVtYmVyLmFzc2VydCgiVHJ5 aW5nIHRvIHNpZGVsb2FkICIgKyBuYW1lICsgIiBvbiAiICsgdGhpcy50b1N0 cmluZygpICsgIiBidXQgdGhlIHR5cGUgZG9lc24ndCBleGlzdC4iLCAhIXR5 cGUpOwogICAgICAgICAgICAgIHR5cGVzLnB1c2godHlwZSk7CiAgICAgICAg ICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgcmV0dXJu IHR5cGVzOwogICAgICB9KSwKCiAgICAgIC8qKgogICAgICAgIEEgbWFwIHdo b3NlIGtleXMgYXJlIHRoZSByZWxhdGlvbnNoaXBzIG9mIGEgbW9kZWwgYW5k IHdob3NlIHZhbHVlcyBhcmUKICAgICAgICByZWxhdGlvbnNoaXAgZGVzY3Jp cHRvcnMuCgogICAgICAgIEZvciBleGFtcGxlLCBnaXZlbiBhIG1vZGVsIHdp dGggdGhpcwogICAgICAgIGRlZmluaXRpb246CgogICAgICAgIGBgYGphdmFz Y3JpcHQKICAgICAgICBBcHAuQmxvZyA9IERTLk1vZGVsLmV4dGVuZCh7CiAg ICAgICAgICB1c2VyczogRFMuaGFzTWFueSgndXNlcicpLAogICAgICAgICAg b3duZXI6IERTLmJlbG9uZ3NUbygndXNlcicpLAoKICAgICAgICAgIHBvc3Rz OiBEUy5oYXNNYW55KCdwb3N0JykKICAgICAgICB9KTsKICAgICAgICBgYGAK CiAgICAgICAgVGhpcyBwcm9wZXJ0eSB3b3VsZCBjb250YWluIHRoZSBmb2xs b3dpbmc6CgogICAgICAgIGBgYGphdmFzY3JpcHQKICAgICAgICB2YXIgcmVs YXRpb25zaGlwc0J5TmFtZSA9IEVtYmVyLmdldChBcHAuQmxvZywgJ3JlbGF0 aW9uc2hpcHNCeU5hbWUnKTsKICAgICAgICByZWxhdGlvbnNoaXBzQnlOYW1l LmdldCgndXNlcnMnKTsKICAgICAgICAvLz0+IHsga2V5OiAndXNlcnMnLCBr aW5kOiAnaGFzTWFueScsIHR5cGU6IEFwcC5Vc2VyIH0KICAgICAgICByZWxh dGlvbnNoaXBzQnlOYW1lLmdldCgnb3duZXInKTsKICAgICAgICAvLz0+IHsg a2V5OiAnb3duZXInLCBraW5kOiAnYmVsb25nc1RvJywgdHlwZTogQXBwLlVz ZXIgfQogICAgICAgIGBgYAoKICAgICAgICBAcHJvcGVydHkgcmVsYXRpb25z aGlwc0J5TmFtZQogICAgICAgIEBzdGF0aWMKICAgICAgICBAdHlwZSBFbWJl ci5NYXAKICAgICAgICBAcmVhZE9ubHkKICAgICAgKi8KICAgICAgcmVsYXRp b25zaGlwc0J5TmFtZTogRW1iZXIuY29tcHV0ZWQoZnVuY3Rpb24oKSB7CiAg ICAgICAgdmFyIG1hcCA9IEVtYmVyLk1hcC5jcmVhdGUoKSwgdHlwZTsKCiAg ICAgICAgdGhpcy5lYWNoQ29tcHV0ZWRQcm9wZXJ0eShmdW5jdGlvbihuYW1l LCBtZXRhKSB7CiAgICAgICAgICBpZiAobWV0YS5pc1JlbGF0aW9uc2hpcCkg ewogICAgICAgICAgICBtZXRhLmtleSA9IG5hbWU7CiAgICAgICAgICAgIHR5 cGUgPSBtZXRhLnR5cGU7CgogICAgICAgICAgICBpZiAoIXR5cGUgJiYgbWV0 YS5raW5kID09PSAnaGFzTWFueScpIHsKICAgICAgICAgICAgICB0eXBlID0g c2luZ3VsYXJpemUobmFtZSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXR5 cGUpIHsKICAgICAgICAgICAgICB0eXBlID0gbmFtZTsKICAgICAgICAgICAg fQoKICAgICAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykg ewogICAgICAgICAgICAgIG1ldGEudHlwZSA9IHRoaXMuc3RvcmUubW9kZWxG b3IodHlwZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG1hcC5zZXQo bmFtZSwgbWV0YSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAg IHJldHVybiBtYXA7CiAgICAgIH0pLAoKICAgICAgLyoqCiAgICAgICAgQSBt YXAgd2hvc2Uga2V5cyBhcmUgdGhlIGZpZWxkcyBvZiB0aGUgbW9kZWwgYW5k IHdob3NlIHZhbHVlcyBhcmUgc3RyaW5ncwogICAgICAgIGRlc2NyaWJpbmcg dGhlIGtpbmQgb2YgdGhlIGZpZWxkLiBBIG1vZGVsJ3MgZmllbGRzIGFyZSB0 aGUgdW5pb24gb2YgYWxsIG9mIGl0cwogICAgICAgIGF0dHJpYnV0ZXMgYW5k IHJlbGF0aW9uc2hpcHMuCgogICAgICAgIEZvciBleGFtcGxlOgoKICAgICAg ICBgYGBqYXZhc2NyaXB0CgogICAgICAgIEFwcC5CbG9nID0gRFMuTW9kZWwu ZXh0ZW5kKHsKICAgICAgICAgIHVzZXJzOiBEUy5oYXNNYW55KCd1c2VyJyks CiAgICAgICAgICBvd25lcjogRFMuYmVsb25nc1RvKCd1c2VyJyksCgogICAg ICAgICAgcG9zdHM6IERTLmhhc01hbnkoJ3Bvc3QnKSwKCiAgICAgICAgICB0 aXRsZTogRFMuYXR0cignc3RyaW5nJykKICAgICAgICB9KTsKCiAgICAgICAg dmFyIGZpZWxkcyA9IEVtYmVyLmdldChBcHAuQmxvZywgJ2ZpZWxkcycpOwog ICAgICAgIGZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uKGZpZWxkLCBraW5kKSB7 CiAgICAgICAgICBjb25zb2xlLmxvZyhmaWVsZCwga2luZCk7CiAgICAgICAg fSk7CgogICAgICAgIC8vIHByaW50czoKICAgICAgICAvLyB1c2VycywgaGFz TWFueQogICAgICAgIC8vIG93bmVyLCBiZWxvbmdzVG8KICAgICAgICAvLyBw b3N0cywgaGFzTWFueQogICAgICAgIC8vIHRpdGxlLCBhdHRyaWJ1dGUKICAg ICAgICBgYGAKCiAgICAgICAgQHByb3BlcnR5IGZpZWxkcwogICAgICAgIEBz dGF0aWMKICAgICAgICBAdHlwZSBFbWJlci5NYXAKICAgICAgICBAcmVhZE9u bHkKICAgICAgKi8KICAgICAgZmllbGRzOiBFbWJlci5jb21wdXRlZChmdW5j dGlvbigpIHsKICAgICAgICB2YXIgbWFwID0gRW1iZXIuTWFwLmNyZWF0ZSgp OwoKICAgICAgICB0aGlzLmVhY2hDb21wdXRlZFByb3BlcnR5KGZ1bmN0aW9u KG5hbWUsIG1ldGEpIHsKICAgICAgICAgIGlmIChtZXRhLmlzUmVsYXRpb25z aGlwKSB7CiAgICAgICAgICAgIG1hcC5zZXQobmFtZSwgbWV0YS5raW5kKTsK ICAgICAgICAgIH0gZWxzZSBpZiAobWV0YS5pc0F0dHJpYnV0ZSkgewogICAg ICAgICAgICBtYXAuc2V0KG5hbWUsICdhdHRyaWJ1dGUnKTsKICAgICAgICAg IH0KICAgICAgICB9KTsKCiAgICAgICAgcmV0dXJuIG1hcDsKICAgICAgfSks CgogICAgICAvKioKICAgICAgICBHaXZlbiBhIGNhbGxiYWNrLCBpdGVyYXRl cyBvdmVyIGVhY2ggb2YgdGhlIHJlbGF0aW9uc2hpcHMgaW4gdGhlIG1vZGVs LAogICAgICAgIGludm9raW5nIHRoZSBjYWxsYmFjayB3aXRoIHRoZSBuYW1l IG9mIGVhY2ggcmVsYXRpb25zaGlwIGFuZCBpdHMgcmVsYXRpb25zaGlwCiAg ICAgICAgZGVzY3JpcHRvci4KCiAgICAgICAgQG1ldGhvZCBlYWNoUmVsYXRp b25zaGlwCiAgICAgICAgQHN0YXRpYwogICAgICAgIEBwYXJhbSB7RnVuY3Rp b259IGNhbGxiYWNrIHRoZSBjYWxsYmFjayB0byBpbnZva2UKICAgICAgICBA cGFyYW0ge2FueX0gYmluZGluZyB0aGUgdmFsdWUgdG8gd2hpY2ggdGhlIGNh bGxiYWNrJ3MgYHRoaXNgIHNob3VsZCBiZSBib3VuZAogICAgICAqLwogICAg ICBlYWNoUmVsYXRpb25zaGlwOiBmdW5jdGlvbihjYWxsYmFjaywgYmluZGlu ZykgewogICAgICAgIGdldCh0aGlzLCAncmVsYXRpb25zaGlwc0J5TmFtZScp LmZvckVhY2goZnVuY3Rpb24obmFtZSwgcmVsYXRpb25zaGlwKSB7CiAgICAg ICAgICBjYWxsYmFjay5jYWxsKGJpbmRpbmcsIG5hbWUsIHJlbGF0aW9uc2hp cCk7CiAgICAgICAgfSk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICBH aXZlbiBhIGNhbGxiYWNrLCBpdGVyYXRlcyBvdmVyIGVhY2ggb2YgdGhlIHR5 cGVzIHJlbGF0ZWQgdG8gYSBtb2RlbCwKICAgICAgICBpbnZva2luZyB0aGUg Y2FsbGJhY2sgd2l0aCB0aGUgcmVsYXRlZCB0eXBlJ3MgY2xhc3MuIEVhY2gg dHlwZSB3aWxsIGJlCiAgICAgICAgcmV0dXJuZWQganVzdCBvbmNlLCByZWdh cmRsZXNzIG9mIGhvdyBtYW55IGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIGl0 IGhhcwogICAgICAgIHdpdGggYSBtb2RlbC4KCiAgICAgICAgQG1ldGhvZCBl YWNoUmVsYXRlZFR5cGUKICAgICAgICBAc3RhdGljCiAgICAgICAgQHBhcmFt IHtGdW5jdGlvbn0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRvIGludm9rZQog ICAgICAgIEBwYXJhbSB7YW55fSBiaW5kaW5nIHRoZSB2YWx1ZSB0byB3aGlj aCB0aGUgY2FsbGJhY2sncyBgdGhpc2Agc2hvdWxkIGJlIGJvdW5kCiAgICAg ICovCiAgICAgIGVhY2hSZWxhdGVkVHlwZTogZnVuY3Rpb24oY2FsbGJhY2ss IGJpbmRpbmcpIHsKICAgICAgICBnZXQodGhpcywgJ3JlbGF0ZWRUeXBlcycp LmZvckVhY2goZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgY2FsbGJhY2su Y2FsbChiaW5kaW5nLCB0eXBlKTsKICAgICAgICB9KTsKICAgICAgfQogICAg fSk7CgogICAgTW9kZWwucmVvcGVuKHsKICAgICAgLyoqCiAgICAgICAgR2l2 ZW4gYSBjYWxsYmFjaywgaXRlcmF0ZXMgb3ZlciBlYWNoIG9mIHRoZSByZWxh dGlvbnNoaXBzIGluIHRoZSBtb2RlbCwKICAgICAgICBpbnZva2luZyB0aGUg Y2FsbGJhY2sgd2l0aCB0aGUgbmFtZSBvZiBlYWNoIHJlbGF0aW9uc2hpcCBh bmQgaXRzIHJlbGF0aW9uc2hpcAogICAgICAgIGRlc2NyaXB0b3IuCgogICAg ICAgIEBtZXRob2QgZWFjaFJlbGF0aW9uc2hpcAogICAgICAgIEBwYXJhbSB7 RnVuY3Rpb259IGNhbGxiYWNrIHRoZSBjYWxsYmFjayB0byBpbnZva2UKICAg ICAgICBAcGFyYW0ge2FueX0gYmluZGluZyB0aGUgdmFsdWUgdG8gd2hpY2gg dGhlIGNhbGxiYWNrJ3MgYHRoaXNgIHNob3VsZCBiZSBib3VuZAogICAgICAq LwogICAgICBlYWNoUmVsYXRpb25zaGlwOiBmdW5jdGlvbihjYWxsYmFjaywg YmluZGluZykgewogICAgICAgIHRoaXMuY29uc3RydWN0b3IuZWFjaFJlbGF0 aW9uc2hpcChjYWxsYmFjaywgYmluZGluZyk7CiAgICAgIH0KICAgIH0pOwog IH0pOwpkZWZpbmUoImVtYmVyLWRhdGEvbGliL3N5c3RlbS9yZWxhdGlvbnNo aXBzL2hhc19tYW55IiwgCiAgWyJleHBvcnRzIl0sCiAgZnVuY3Rpb24oX19l eHBvcnRzX18pIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAgIC8qKgogICAgICBA bW9kdWxlIGVtYmVyLWRhdGEKICAgICovCgogICAgdmFyIGdldCA9IEVtYmVy LmdldCwgc2V0ID0gRW1iZXIuc2V0LCBzZXRQcm9wZXJ0aWVzID0gRW1iZXIu c2V0UHJvcGVydGllczsKCiAgICBmdW5jdGlvbiBhc3luY0hhc01hbnkodHlw ZSwgb3B0aW9ucywgbWV0YSkgewogICAgICByZXR1cm4gRW1iZXIuY29tcHV0 ZWQoJ2RhdGEnLCBmdW5jdGlvbihrZXkpIHsKICAgICAgICB2YXIgcmVsYXRp b25zaGlwID0gdGhpcy5fcmVsYXRpb25zaGlwc1trZXldLAogICAgICAgICAg ICBwcm9taXNlTGFiZWwgPSAiRFM6IEFzeW5jIGhhc01hbnkgIiArIHRoaXMg KyAiIDogIiArIGtleTsKCiAgICAgICAgaWYgKCFyZWxhdGlvbnNoaXApIHsK ICAgICAgICAgIHZhciByZXNvbHZlciA9IEVtYmVyLlJTVlAuZGVmZXIocHJv bWlzZUxhYmVsKTsKICAgICAgICAgIHJlbGF0aW9uc2hpcCA9IGJ1aWxkUmVs YXRpb25zaGlwKHRoaXMsIGtleSwgb3B0aW9ucywgZnVuY3Rpb24oc3RvcmUs IGRhdGEpIHsKICAgICAgICAgICAgdmFyIGxpbmsgPSBkYXRhLmxpbmtzICYm IGRhdGEubGlua3Nba2V5XTsKICAgICAgICAgICAgdmFyIHJlbDsKICAgICAg ICAgICAgaWYgKGxpbmspIHsKICAgICAgICAgICAgICByZWwgPSBzdG9yZS5m aW5kSGFzTWFueSh0aGlzLCBsaW5rLCBtZXRhLCByZXNvbHZlcik7CiAgICAg ICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcmVsID0gc3RvcmUuZmlu ZE1hbnkodGhpcywgZGF0YVtrZXldLCBtZXRhLnR5cGUsIHJlc29sdmVyKTsK ICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBjYWNoZSB0aGUgcHJvbWlz ZSBzbyB3ZSBjYW4gdXNlIGl0CiAgICAgICAgICAgIC8vIHdoZW4gd2UgY29t ZSBiYWNrIGFuZCBkb24ndCBuZWVkIHRvIHJlYnVpbGQKICAgICAgICAgICAg Ly8gdGhlIHJlbGF0aW9uc2hpcC4KICAgICAgICAgICAgc2V0KHJlbCwgJ3By b21pc2UnLCByZXNvbHZlci5wcm9taXNlKTsKICAgICAgICAgICAgcmV0dXJu IHJlbDsKICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgdmFyIHBy b21pc2UgPSByZWxhdGlvbnNoaXAuZ2V0KCdwcm9taXNlJykudGhlbihmdW5j dGlvbigpIHsKICAgICAgICAgIHJldHVybiByZWxhdGlvbnNoaXA7CiAgICAg ICAgfSwgbnVsbCwgIkRTOiBBc3luYyBoYXNNYW55IHJlY29yZHMgcmVjZWl2 ZWQiKTsKCiAgICAgICAgcmV0dXJuIERTLlByb21pc2VBcnJheS5jcmVhdGUo ewogICAgICAgICAgcHJvbWlzZTogcHJvbWlzZQogICAgICAgIH0pOwogICAg ICB9KS5tZXRhKG1ldGEpLnJlYWRPbmx5KCk7CiAgICB9CgogICAgZnVuY3Rp b24gYnVpbGRSZWxhdGlvbnNoaXAocmVjb3JkLCBrZXksIG9wdGlvbnMsIGNh bGxiYWNrKSB7CiAgICAgIHZhciByZWxzID0gcmVjb3JkLl9yZWxhdGlvbnNo aXBzOwoKICAgICAgaWYgKHJlbHNba2V5XSkgeyByZXR1cm4gcmVsc1trZXld OyB9CgogICAgICB2YXIgZGF0YSA9IGdldChyZWNvcmQsICdkYXRhJyksCiAg ICAgICAgICBzdG9yZSA9IGdldChyZWNvcmQsICdzdG9yZScpOwoKICAgICAg dmFyIHJlbGF0aW9uc2hpcCA9IHJlbHNba2V5XSA9IGNhbGxiYWNrLmNhbGwo cmVjb3JkLCBzdG9yZSwgZGF0YSk7CgogICAgICByZXR1cm4gc2V0UHJvcGVy dGllcyhyZWxhdGlvbnNoaXAsIHsKICAgICAgICBvd25lcjogcmVjb3JkLAog ICAgICAgIG5hbWU6IGtleSwKICAgICAgICBpc1BvbHltb3JwaGljOiBvcHRp b25zLnBvbHltb3JwaGljCiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9u IGhhc1JlbGF0aW9uc2hpcCh0eXBlLCBvcHRpb25zKSB7CiAgICAgIG9wdGlv bnMgPSBvcHRpb25zIHx8IHt9OwoKICAgICAgdmFyIG1ldGEgPSB7CiAgICAg ICAgdHlwZTogdHlwZSwKICAgICAgICBpc1JlbGF0aW9uc2hpcDogdHJ1ZSwK ICAgICAgICBvcHRpb25zOiBvcHRpb25zLAogICAgICAgIGtpbmQ6ICdoYXNN YW55JwogICAgICB9OwoKICAgICAgaWYgKG9wdGlvbnMuYXN5bmMpIHsKICAg ICAgICByZXR1cm4gYXN5bmNIYXNNYW55KHR5cGUsIG9wdGlvbnMsIG1ldGEp OwogICAgICB9CgogICAgICByZXR1cm4gRW1iZXIuY29tcHV0ZWQoJ2RhdGEn LCBmdW5jdGlvbihrZXkpIHsKICAgICAgICByZXR1cm4gYnVpbGRSZWxhdGlv bnNoaXAodGhpcywga2V5LCBvcHRpb25zLCBmdW5jdGlvbihzdG9yZSwgZGF0 YSkgewogICAgICAgICAgdmFyIHJlY29yZHMgPSBkYXRhW2tleV07CiAgICAg ICAgICBFbWJlci5hc3NlcnQoIllvdSBsb29rZWQgdXAgdGhlICciICsga2V5 ICsgIicgcmVsYXRpb25zaGlwIG9uICciICsgdGhpcyArICInIGJ1dCBzb21l IG9mIHRoZSBhc3NvY2lhdGVkIHJlY29yZHMgd2VyZSBub3QgbG9hZGVkLiBF aXRoZXIgbWFrZSBzdXJlIHRoZXkgYXJlIGFsbCBsb2FkZWQgdG9nZXRoZXIg d2l0aCB0aGUgcGFyZW50IHJlY29yZCwgb3Igc3BlY2lmeSB0aGF0IHRoZSBy ZWxhdGlvbnNoaXAgaXMgYXN5bmMgKGBEUy5oYXNNYW55KHsgYXN5bmM6IHRy dWUgfSlgKSIsIEVtYmVyLkEocmVjb3JkcykuZXZlcnlQcm9wZXJ0eSgnaXNF bXB0eScsIGZhbHNlKSk7CiAgICAgICAgICByZXR1cm4gc3RvcmUuZmluZE1h bnkodGhpcywgZGF0YVtrZXldLCBtZXRhLnR5cGUpOwogICAgICAgIH0pOwog ICAgICB9KS5tZXRhKG1ldGEpLnJlYWRPbmx5KCk7CiAgICB9CgogICAgLyoq CiAgICAgIGBEUy5oYXNNYW55YCBpcyB1c2VkIHRvIGRlZmluZSBPbmUtVG8t TWFueSBhbmQgTWFueS1Uby1NYW55CiAgICAgIHJlbGF0aW9uc2hpcHMgb24g YSBbRFMuTW9kZWxdKC9hcGkvZGF0YS9jbGFzc2VzL0RTLk1vZGVsLmh0bWwp LgoKICAgICAgYERTLmhhc01hbnlgIHRha2VzIGFuIG9wdGlvbmFsIGhhc2gg YXMgYSBzZWNvbmQgcGFyYW1ldGVyLCBjdXJyZW50bHkKICAgICAgc3VwcG9y dGVkIG9wdGlvbnMgYXJlOgoKICAgICAgLSBgYXN5bmNgOiBBIGJvb2xlYW4g dmFsdWUgdXNlZCB0byBleHBsaWNpdGx5IGRlY2xhcmUgdGhpcyB0byBiZSBh biBhc3luYyByZWxhdGlvbnNoaXAuCiAgICAgIC0gYGludmVyc2VgOiBBIHN0 cmluZyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBpbnZlcnNlIHByb3BlcnR5IG9u IGEgcmVsYXRlZCBtb2RlbC4KCiAgICAgICMjIyMgT25lLVRvLU1hbnkKICAg ICAgVG8gZGVjbGFyZSBhIG9uZS10by1tYW55IHJlbGF0aW9uc2hpcCBiZXR3 ZWVuIHR3byBtb2RlbHMsIHVzZQogICAgICBgRFMuYmVsb25nc1RvYCBpbiBj b21iaW5hdGlvbiB3aXRoIGBEUy5oYXNNYW55YCwgbGlrZSB0aGlzOgoKICAg ICAgYGBgamF2YXNjcmlwdAogICAgICBBcHAuUG9zdCA9IERTLk1vZGVsLmV4 dGVuZCh7CiAgICAgICAgY29tbWVudHM6IERTLmhhc01hbnkoJ2NvbW1lbnQn KQogICAgICB9KTsKCiAgICAgIEFwcC5Db21tZW50ID0gRFMuTW9kZWwuZXh0 ZW5kKHsKICAgICAgICBwb3N0OiBEUy5iZWxvbmdzVG8oJ3Bvc3QnKQogICAg ICB9KTsKICAgICAgYGBgCgogICAgICAjIyMjIE1hbnktVG8tTWFueQogICAg ICBUbyBkZWNsYXJlIGEgbWFueS10by1tYW55IHJlbGF0aW9uc2hpcCBiZXR3 ZWVuIHR3byBtb2RlbHMsIHVzZQogICAgICBgRFMuaGFzTWFueWA6CgogICAg ICBgYGBqYXZhc2NyaXB0CiAgICAgIEFwcC5Qb3N0ID0gRFMuTW9kZWwuZXh0 ZW5kKHsKICAgICAgICB0YWdzOiBEUy5oYXNNYW55KCd0YWcnKQogICAgICB9 KTsKCiAgICAgIEFwcC5UYWcgPSBEUy5Nb2RlbC5leHRlbmQoewogICAgICAg IHBvc3RzOiBEUy5oYXNNYW55KCdwb3N0JykKICAgICAgfSk7CiAgICAgIGBg YAoKICAgICAgIyMjIyBFeHBsaWNpdCBJbnZlcnNlcwoKICAgICAgRW1iZXIg RGF0YSB3aWxsIGRvIGl0cyBiZXN0IHRvIGRpc2NvdmVyIHdoaWNoIHJlbGF0 aW9uc2hpcHMgbWFwIHRvCiAgICAgIG9uZSBhbm90aGVyLiBJbiB0aGUgb25l LXRvLW1hbnkgY29kZSBhYm92ZSwgZm9yIGV4YW1wbGUsIEVtYmVyIERhdGEK ICAgICAgY2FuIGZpZ3VyZSBvdXQgdGhhdCBjaGFuZ2luZyB0aGUgYGNvbW1l bnRzYCByZWxhdGlvbnNoaXAgc2hvdWxkIHVwZGF0ZQogICAgICB0aGUgYHBv c3RgIHJlbGF0aW9uc2hpcCBvbiB0aGUgaW52ZXJzZSBiZWNhdXNlIHBvc3Qg aXMgdGhlIG9ubHkKICAgICAgcmVsYXRpb25zaGlwIHRvIHRoYXQgbW9kZWwu CgogICAgICBIb3dldmVyLCBzb21ldGltZXMgeW91IG1heSBoYXZlIG11bHRp cGxlIGBiZWxvbmdzVG9gL2BoYXNNYW55c2AgZm9yIHRoZQogICAgICBzYW1l IHR5cGUuIFlvdSBjYW4gc3BlY2lmeSB3aGljaCBwcm9wZXJ0eSBvbiB0aGUg cmVsYXRlZCBtb2RlbCBpcwogICAgICB0aGUgaW52ZXJzZSB1c2luZyBgRFMu aGFzTWFueWAncyBgaW52ZXJzZWAgb3B0aW9uOgoKICAgICAgYGBgamF2YXNj cmlwdAogICAgICB2YXIgYmVsb25nc1RvID0gRFMuYmVsb25nc1RvLAogICAg ICAgICAgaGFzTWFueSA9IERTLmhhc01hbnk7CgogICAgICBBcHAuQ29tbWVu dCA9IERTLk1vZGVsLmV4dGVuZCh7CiAgICAgICAgb25lUG9zdDogYmVsb25n c1RvKCdwb3N0JyksCiAgICAgICAgdHdvUG9zdDogYmVsb25nc1RvKCdwb3N0 JyksCiAgICAgICAgcmVkUG9zdDogYmVsb25nc1RvKCdwb3N0JyksCiAgICAg ICAgYmx1ZVBvc3Q6IGJlbG9uZ3NUbygncG9zdCcpCiAgICAgIH0pOwoKICAg ICAgQXBwLlBvc3QgPSBEUy5Nb2RlbC5leHRlbmQoewogICAgICAgIGNvbW1l bnRzOiBoYXNNYW55KCdjb21tZW50JywgewogICAgICAgICAgaW52ZXJzZTog J3JlZFBvc3QnCiAgICAgICAgfSkKICAgICAgfSk7CiAgICAgIGBgYAoKICAg ICAgWW91IGNhbiBhbHNvIHNwZWNpZnkgYW4gaW52ZXJzZSBvbiBhIGBiZWxv bmdzVG9gLCB3aGljaCB3b3JrcyBob3cKICAgICAgeW91J2QgZXhwZWN0LgoK ICAgICAgQG5hbWVzcGFjZQogICAgICBAbWV0aG9kIGhhc01hbnkKICAgICAg QGZvciBEUwogICAgICBAcGFyYW0ge1N0cmluZyBvciBEUy5Nb2RlbH0gdHlw ZSB0aGUgbW9kZWwgdHlwZSBvZiB0aGUgcmVsYXRpb25zaGlwCiAgICAgIEBw YXJhbSB7T2JqZWN0fSBvcHRpb25zIGEgaGFzaCBvZiBvcHRpb25zCiAgICAg IEByZXR1cm4ge0VtYmVyLmNvbXB1dGVkfSByZWxhdGlvbnNoaXAKICAgICov CiAgICBmdW5jdGlvbiBoYXNNYW55KHR5cGUsIG9wdGlvbnMpIHsKICAgICAg aWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JykgewogICAgICAgIG9wdGlv bnMgPSB0eXBlOwogICAgICAgIHR5cGUgPSB1bmRlZmluZWQ7CiAgICAgIH0K ICAgICAgcmV0dXJuIGhhc1JlbGF0aW9uc2hpcCh0eXBlLCBvcHRpb25zKTsK ICAgIH0KCiAgICBfX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gaGFzTWFueTsK ICB9KTsKZGVmaW5lKCJlbWJlci1kYXRhL2xpYi9zeXN0ZW0vc3RvcmUiLCAK ICBbImV4cG9ydHMiXSwKICBmdW5jdGlvbihfX2V4cG9ydHNfXykgewogICAg InVzZSBzdHJpY3QiOwogICAgLypnbG9iYWxzIEVtYmVyKi8KICAgIC8qanNo aW50IGVxbnVsbDp0cnVlKi8KCiAgICAvKioKICAgICAgQG1vZHVsZSBlbWJl ci1kYXRhCiAgICAqLwoKICAgIHZhciBnZXQgPSBFbWJlci5nZXQsIHNldCA9 IEVtYmVyLnNldDsKICAgIHZhciBvbmNlID0gRW1iZXIucnVuLm9uY2U7CiAg ICB2YXIgaXNOb25lID0gRW1iZXIuaXNOb25lOwogICAgdmFyIGZvckVhY2gg PSBFbWJlci5FbnVtZXJhYmxlVXRpbHMuZm9yRWFjaDsKICAgIHZhciBpbmRl eE9mID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLmluZGV4T2Y7CiAgICB2YXIg bWFwID0gRW1iZXIuRW51bWVyYWJsZVV0aWxzLm1hcDsKICAgIHZhciBQcm9t aXNlID0gRW1iZXIuUlNWUC5Qcm9taXNlOwogICAgdmFyIGNvcHkgPSBFbWJl ci5jb3B5OwogICAgdmFyIFN0b3JlLCBQcm9taXNlT2JqZWN0LCBQcm9taXNl QXJyYXk7CgogICAgLy8gSW1wbGVtZW50b3JzIE5vdGU6CiAgICAvLwogICAg Ly8gICBUaGUgdmFyaWFibGVzIGluIHRoaXMgZmlsZSBhcmUgY29uc2lzdGVu dGx5IG5hbWVkIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nCiAgICAvLyAg IHNjaGVtZToKICAgIC8vCiAgICAvLyAgICogK2lkKyBtZWFucyBhbiBpZGVu dGlmaWVyIG1hbmFnZWQgYnkgYW4gZXh0ZXJuYWwgc291cmNlLCBwcm92aWRl ZCBpbnNpZGUKICAgIC8vICAgICB0aGUgZGF0YSBwcm92aWRlZCBieSB0aGF0 IHNvdXJjZS4gVGhlc2UgYXJlIGFsd2F5cyBjb2VyY2VkIHRvIGJlIHN0cmlu Z3MKICAgIC8vICAgICBiZWZvcmUgYmVpbmcgdXNlZCBpbnRlcm5hbGx5Lgog ICAgLy8gICAqICtjbGllbnRJZCsgbWVhbnMgYSB0cmFuc2llbnQgbnVtZXJp Y2FsIGlkZW50aWZpZXIgZ2VuZXJhdGVkIGF0IHJ1bnRpbWUgYnkKICAgIC8v ICAgICB0aGUgZGF0YSBzdG9yZS4gSXQgaXMgaW1wb3J0YW50IHByaW1hcmls eSBiZWNhdXNlIG5ld2x5IGNyZWF0ZWQgb2JqZWN0cyBtYXkKICAgIC8vICAg ICBub3QgeWV0IGhhdmUgYW4gZXh0ZXJuYWxseSBnZW5lcmF0ZWQgaWQuCiAg ICAvLyAgICogK3JlZmVyZW5jZSsgbWVhbnMgYSByZWNvcmQgcmVmZXJlbmNl IG9iamVjdCwgd2hpY2ggaG9sZHMgbWV0YWRhdGEgYWJvdXQgYQogICAgLy8g ICAgIHJlY29yZCwgZXZlbiBpZiBpdCBoYXMgbm90IHlldCBiZWVuIGZ1bGx5 IG1hdGVyaWFsaXplZC4KICAgIC8vICAgKiArdHlwZSsgbWVhbnMgYSBzdWJj bGFzcyBvZiBEUy5Nb2RlbC4KCiAgICAvLyBVc2VkIGJ5IHRoZSBzdG9yZSB0 byBub3JtYWxpemUgSURzIGVudGVyaW5nIHRoZSBzdG9yZS4gIERlc3BpdGUg dGhlIGZhY3QKICAgIC8vIHRoYXQgZGV2ZWxvcGVycyBtYXkgcHJvdmlkZSBJ RHMgYXMgbnVtYmVycyAoZS5nLiwgYHN0b3JlLmZpbmQoUGVyc29uLCAxKWAp LAogICAgLy8gaXQgaXMgaW1wb3J0YW50IHRoYXQgaW50ZXJuYWxseSB3ZSB1 c2Ugc3RyaW5ncywgc2luY2UgSURzIG1heSBiZSBzZXJpYWxpemVkCiAgICAv LyBhbmQgbG9zZSB0eXBlIGluZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsIEVt YmVyJ3Mgcm91dGVyIG1heSBwdXQgYSByZWNvcmQncwogICAgLy8gSUQgaW50 byB0aGUgVVJMLCBhbmQgaWYgd2UgbGF0ZXIgdHJ5IHRvIGRlc2VyaWFsaXpl IHRoYXQgVVJMIGFuZCBmaW5kIHRoZQogICAgLy8gY29ycmVzcG9uZGluZyBy ZWNvcmQsIHdlIHdpbGwgbm90IGtub3cgaWYgaXQgaXMgYSBzdHJpbmcgb3Ig YSBudW1iZXIuCiAgICBmdW5jdGlvbiBjb2VyY2VJZChpZCkgewogICAgICBy ZXR1cm4gaWQgPT0gbnVsbCA/IG51bGwgOiBpZCsnJzsKICAgIH0KCiAgICAv KioKICAgICAgVGhlIHN0b3JlIGNvbnRhaW5zIGFsbCBvZiB0aGUgZGF0YSBm b3IgcmVjb3JkcyBsb2FkZWQgZnJvbSB0aGUgc2VydmVyLgogICAgICBJdCBp cyBhbHNvIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2Yg YERTLk1vZGVsYCB0aGF0IHdyYXAKICAgICAgdGhlIGluZGl2aWR1YWwgZGF0 YSBmb3IgYSByZWNvcmQsIHNvIHRoYXQgdGhleSBjYW4gYmUgYm91bmQgdG8g aW4geW91cgogICAgICBIYW5kbGViYXJzIHRlbXBsYXRlcy4KCiAgICAgIERl ZmluZSB5b3VyIGFwcGxpY2F0aW9uJ3Mgc3RvcmUgbGlrZSB0aGlzOgoKICAg ICAgYGBgamF2YXNjcmlwdAogICAgICBNeUFwcC5TdG9yZSA9IERTLlN0b3Jl LmV4dGVuZCgpOwogICAgICBgYGAKCiAgICAgIE1vc3QgRW1iZXIuanMgYXBw bGljYXRpb25zIHdpbGwgb25seSBoYXZlIGEgc2luZ2xlIGBEUy5TdG9yZWAg dGhhdCBpcwogICAgICBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgdGhlaXIg YEVtYmVyLkFwcGxpY2F0aW9uYC4KCiAgICAgIFlvdSBjYW4gcmV0cmlldmUg bW9kZWxzIGZyb20gdGhlIHN0b3JlIGluIHNldmVyYWwgd2F5cy4gVG8gcmV0 cmlldmUgYSByZWNvcmQKICAgICAgZm9yIGEgc3BlY2lmaWMgaWQsIHVzZSBg RFMuU3RvcmVgJ3MgYGZpbmQoKWAgbWV0aG9kOgoKICAgICAgYGBgamF2YXNj cmlwdAogICAgICB2YXIgcGVyc29uID0gc3RvcmUuZmluZCgncGVyc29uJywg MTIzKTsKICAgICAgYGBgCgogICAgICBJZiB5b3VyIGFwcGxpY2F0aW9uIGhh cyBtdWx0aXBsZSBgRFMuU3RvcmVgIGluc3RhbmNlcyAoYW4gdW51c3VhbCBj YXNlKSwgeW91IGNhbgogICAgICBzcGVjaWZ5IHdoaWNoIHN0b3JlIHNob3Vs ZCBiZSB1c2VkOgoKICAgICAgYGBgamF2YXNjcmlwdAogICAgICB2YXIgcGVy c29uID0gc3RvcmUuZmluZChBcHAuUGVyc29uLCAxMjMpOwogICAgICBgYGAK CiAgICAgIEJ5IGRlZmF1bHQsIHRoZSBzdG9yZSB3aWxsIHRhbGsgdG8geW91 ciBiYWNrZW5kIHVzaW5nIGEgc3RhbmRhcmQKICAgICAgUkVTVCBtZWNoYW5p c20uIFlvdSBjYW4gY3VzdG9taXplIGhvdyB0aGUgc3RvcmUgdGFsa3MgdG8g eW91cgogICAgICBiYWNrZW5kIGJ5IHNwZWNpZnlpbmcgYSBjdXN0b20gYWRh cHRlcjoKCiAgICAgIGBgYGphdmFzY3JpcHQKICAgICAgIE15QXBwLnN0b3Jl ID0gRFMuU3RvcmUuY3JlYXRlKHsKICAgICAgICAgYWRhcHRlcjogJ015QXBw LkN1c3RvbUFkYXB0ZXInCiAgICAgICB9KTsKICAgICAgIGBgYAoKICAgICAg WW91IGNhbiBsZWFybiBtb3JlIGFib3V0IHdyaXRpbmcgYSBjdXN0b20gYWRh cHRlciBieSByZWFkaW5nIHRoZSBgRFMuQWRhcHRlcmAKICAgICAgZG9jdW1l bnRhdGlvbi4KCiAgICAgIEBjbGFzcyBTdG9yZQogICAgICBAbmFtZXNwYWNl IERTCiAgICAgIEBleHRlbmRzIEVtYmVyLk9iamVjdAogICAgKi8KICAgIFN0 b3JlID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7CgogICAgICAvKioKICAgICAg ICBAbWV0aG9kIGluaXQKICAgICAgICBAcHJpdmF0ZQogICAgICAqLwogICAg ICBpbml0OiBmdW5jdGlvbigpIHsKICAgICAgICAvLyBpbnRlcm5hbCBib29r a2VlcGluZzsgbm90IG9ic2VydmFibGUKICAgICAgICB0aGlzLnR5cGVNYXBz ID0ge307CiAgICAgICAgdGhpcy5yZWNvcmRBcnJheU1hbmFnZXIgPSBEUy5S ZWNvcmRBcnJheU1hbmFnZXIuY3JlYXRlKHsKICAgICAgICAgIHN0b3JlOiB0 aGlzCiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5fcmVsYXRpb25zaGlwQ2hh bmdlcyA9IHt9OwogICAgICAgIHRoaXMuX3BlbmRpbmdTYXZlID0gW107CiAg ICAgIH0sCgogICAgICAvKioKICAgICAgICBUaGUgYWRhcHRlciB0byB1c2Ug dG8gY29tbXVuaWNhdGUgdG8gYSBiYWNrZW5kIHNlcnZlciBvciBvdGhlciBw ZXJzaXN0ZW5jZSBsYXllci4KCiAgICAgICAgVGhpcyBjYW4gYmUgc3BlY2lm aWVkIGFzIGFuIGluc3RhbmNlLCBjbGFzcywgb3Igc3RyaW5nLgoKICAgICAg ICBJZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGBBcHAuQ3VzdG9tQWRhcHRlcmAg YXMgYSBzdHJpbmcsIGRvOgoKICAgICAgICBgYGBqcwogICAgICAgIGFkYXB0 ZXI6ICdjdXN0b20nCiAgICAgICAgYGBgCgogICAgICAgIEBwcm9wZXJ0eSBh ZGFwdGVyCiAgICAgICAgQGRlZmF1bHQgRFMuUkVTVEFkYXB0ZXIKICAgICAg ICBAdHlwZSB7RFMuQWRhcHRlcnxTdHJpbmd9CiAgICAgICovCiAgICAgIGFk YXB0ZXI6ICctcmVzdCcsCgogICAgICAvKioKICAgICAgICBSZXR1cm5zIGEg SlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVjb3JkIHVzaW5nIGEgY3Vz dG9tCiAgICAgICAgdHlwZS1zcGVjaWZpYyBzZXJpYWxpemVyLCBpZiBvbmUg ZXhpc3RzLgoKICAgICAgICBUaGUgYXZhaWxhYmxlIG9wdGlvbnMgYXJlOgoK ICAgICAgICAqIGBpbmNsdWRlSWRgOiBgdHJ1ZWAgaWYgdGhlIHJlY29yZCdz IElEIHNob3VsZCBiZSBpbmNsdWRlZCBpbgogICAgICAgICAgdGhlIEpTT04g cmVwcmVzZW50YXRpb24KCiAgICAgICAgQG1ldGhvZCBzZXJpYWxpemUKICAg ICAgICBAcHJpdmF0ZQogICAgICAgIEBwYXJhbSB7RFMuTW9kZWx9IHJlY29y ZCB0aGUgcmVjb3JkIHRvIHNlcmlhbGl6ZQogICAgICAgIEBwYXJhbSB7T2Jq ZWN0fSBvcHRpb25zIGFuIG9wdGlvbnMgaGFzaAogICAgICAqLwogICAgICBz ZXJpYWxpemU6IGZ1bmN0aW9uKHJlY29yZCwgb3B0aW9ucykgewogICAgICAg IHJldHVybiB0aGlzLnNlcmlhbGl6ZXJGb3IocmVjb3JkLmNvbnN0cnVjdG9y LnR5cGVLZXkpLnNlcmlhbGl6ZShyZWNvcmQsIG9wdGlvbnMpOwogICAgICB9 LAoKICAgICAgLyoqCiAgICAgICAgVGhpcyBwcm9wZXJ0eSByZXR1cm5zIHRo ZSBhZGFwdGVyLCBhZnRlciByZXNvbHZpbmcgYSBwb3NzaWJsZQogICAgICAg IHN0cmluZyBrZXkuCgogICAgICAgIElmIHRoZSBzdXBwbGllZCBgYWRhcHRl cmAgd2FzIGEgY2xhc3MsIG9yIGEgU3RyaW5nIHByb3BlcnR5CiAgICAgICAg cGF0aCByZXNvbHZlZCB0byBhIGNsYXNzLCB0aGlzIHByb3BlcnR5IHdpbGwg aW5zdGFudGlhdGUgdGhlCiAgICAgICAgY2xhc3MuCgogICAgICAgIFRoaXMg cHJvcGVydHkgaXMgY2FjaGVhYmxlLCBzbyB0aGUgc2FtZSBpbnN0YW5jZSBv ZiBhIHNwZWNpZmllZAogICAgICAgIGFkYXB0ZXIgY2xhc3Mgc2hvdWxkIGJl IHVzZWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgc3RvcmUuCgogICAgICAg IEBwcm9wZXJ0eSBkZWZhdWx0QWRhcHRlcgogICAgICAgIEBwcml2YXRlCiAg ICAgICAgQHJldHVybnMgRFMuQWRhcHRlcgogICAgICAqLwogICAgICBkZWZh dWx0QWRhcHRlcjogRW1iZXIuY29tcHV0ZWQoJ2FkYXB0ZXInLCBmdW5jdGlv bigpIHsKICAgICAgICB2YXIgYWRhcHRlciA9IGdldCh0aGlzLCAnYWRhcHRl cicpOwoKICAgICAgICBFbWJlci5hc3NlcnQoJ1lvdSB0cmllZCB0byBzZXQg YGFkYXB0ZXJgIHByb3BlcnR5IHRvIGFuIGluc3RhbmNlIG9mIGBEUy5BZGFw dGVyYCwgd2hlcmUgaXQgc2hvdWxkIGJlIGEgbmFtZSBvciBhIGZhY3Rvcnkn LCAhKGFkYXB0ZXIgaW5zdGFuY2VvZiBEUy5BZGFwdGVyKSk7CgogICAgICAg IGlmICh0eXBlb2YgYWRhcHRlciA9PT0gJ3N0cmluZycpIHsKICAgICAgICAg IGFkYXB0ZXIgPSB0aGlzLmNvbnRhaW5lci5sb29rdXAoJ2FkYXB0ZXI6JyAr IGFkYXB0ZXIpIHx8IHRoaXMuY29udGFpbmVyLmxvb2t1cCgnYWRhcHRlcjph cHBsaWNhdGlvbicpIHx8IHRoaXMuY29udGFpbmVyLmxvb2t1cCgnYWRhcHRl cjotcmVzdCcpOwogICAgICAgIH0KCiAgICAgICAgaWYgKERTLkFkYXB0ZXIu ZGV0ZWN0KGFkYXB0ZXIpKSB7CiAgICAgICAgICBhZGFwdGVyID0gYWRhcHRl ci5jcmVhdGUoewogICAgICAgICAgICBjb250YWluZXI6IHRoaXMuY29udGFp bmVyCiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBh ZGFwdGVyOwogICAgICB9KSwKCiAgICAgIC8vIC4uLi4uLi4uLi4uLi4uLi4u Li4uLgogICAgICAvLyAuIENSRUFURSBORVcgUkVDT1JEIC4KICAgICAgLy8g Li4uLi4uLi4uLi4uLi4uLi4uLi4uCgogICAgICAvKioKICAgICAgICBDcmVh dGUgYSBuZXcgcmVjb3JkIGluIHRoZSBjdXJyZW50IHN0b3JlLiBUaGUgcHJv cGVydGllcyBwYXNzZWQKICAgICAgICB0byB0aGlzIG1ldGhvZCBhcmUgc2V0 IG9uIHRoZSBuZXdseSBjcmVhdGVkIHJlY29yZC4KCiAgICAgICAgVG8gY3Jl YXRlIGEgbmV3IGluc3RhbmNlIG9mIGBBcHAuUG9zdGA6CgogICAgICAgIGBg YGpzCiAgICAgICAgc3RvcmUuY3JlYXRlUmVjb3JkKCdwb3N0JywgewogICAg ICAgICAgdGl0bGU6ICJSYWlscyBpcyBvbWFrYXNlIgogICAgICAgIH0pOwog ICAgICAgIGBgYAoKICAgICAgICBAbWV0aG9kIGNyZWF0ZVJlY29yZAogICAg ICAgIEBwYXJhbSB7U3RyaW5nfSB0eXBlCiAgICAgICAgQHBhcmFtIHtPYmpl Y3R9IHByb3BlcnRpZXMgYSBoYXNoIG9mIHByb3BlcnRpZXMgdG8gc2V0IG9u IHRoZQogICAgICAgICAgbmV3bHkgY3JlYXRlZCByZWNvcmQuCiAgICAgICAg QHJldHVybnMge0RTLk1vZGVsfSByZWNvcmQKICAgICAgKi8KICAgICAgY3Jl YXRlUmVjb3JkOiBmdW5jdGlvbih0eXBlLCBwcm9wZXJ0aWVzKSB7CiAgICAg ICAgdHlwZSA9IHRoaXMubW9kZWxGb3IodHlwZSk7CgogICAgICAgIHByb3Bl cnRpZXMgPSBjb3B5KHByb3BlcnRpZXMpIHx8IHt9OwoKICAgICAgICAvLyBJ ZiB0aGUgcGFzc2VkIHByb3BlcnRpZXMgZG8gbm90IGluY2x1ZGUgYSBwcmlt YXJ5IGtleSwKICAgICAgICAvLyBnaXZlIHRoZSBhZGFwdGVyIGFuIG9wcG9y dHVuaXR5IHRvIGdlbmVyYXRlIG9uZS4gVHlwaWNhbGx5LAogICAgICAgIC8v IGNsaWVudC1zaWRlIElEIGdlbmVyYXRvcnMgd2lsbCB1c2Ugc29tZXRoaW5n IGxpa2UgdXVpZC5qcwogICAgICAgIC8vIHRvIGF2b2lkIGNvbmZsaWN0cy4K CiAgICAgICAgaWYgKGlzTm9uZShwcm9wZXJ0aWVzLmlkKSkgewogICAgICAg ICAgcHJvcGVydGllcy5pZCA9IHRoaXMuX2dlbmVyYXRlSWQodHlwZSk7CiAg ICAgICAgfQoKICAgICAgICAvLyBDb2VyY2UgSUQgdG8gYSBzdHJpbmcKICAg ICAgICBwcm9wZXJ0aWVzLmlkID0gY29lcmNlSWQocHJvcGVydGllcy5pZCk7 CgogICAgICAgIHZhciByZWNvcmQgPSB0aGlzLmJ1aWxkUmVjb3JkKHR5cGUs IHByb3BlcnRpZXMuaWQpOwoKICAgICAgICAvLyBNb3ZlIHRoZSByZWNvcmQg b3V0IG9mIGl0cyBpbml0aWFsIGBlbXB0eWAgc3RhdGUgaW50bwogICAgICAg IC8vIHRoZSBgbG9hZGVkYCBzdGF0ZS4KICAgICAgICByZWNvcmQubG9hZGVk RGF0YSgpOwoKICAgICAgICAvLyBTZXQgdGhlIHByb3BlcnRpZXMgc3BlY2lm aWVkIG9uIHRoZSByZWNvcmQuCiAgICAgICAgcmVjb3JkLnNldFByb3BlcnRp ZXMocHJvcGVydGllcyk7CgogICAgICAgIHJldHVybiByZWNvcmQ7CiAgICAg IH0sCgogICAgICAvKioKICAgICAgICBJZiBwb3NzaWJsZSwgdGhpcyBtZXRo b2QgYXNrcyB0aGUgYWRhcHRlciB0byBnZW5lcmF0ZSBhbiBJRCBmb3IKICAg ICAgICBhIG5ld2x5IGNyZWF0ZWQgcmVjb3JkLgoKICAgICAgICBAbWV0aG9k IF9nZW5lcmF0ZUlkCiAgICAgICAgQHByaXZhdGUKICAgICAgICBAcGFyYW0g e1N0cmluZ30gdHlwZQogICAgICAgIEByZXR1cm5zIHtTdHJpbmd9IGlmIHRo ZSBhZGFwdGVyIGNhbiBnZW5lcmF0ZSBvbmUsIGFuIElECiAgICAgICovCiAg ICAgIF9nZW5lcmF0ZUlkOiBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgdmFy IGFkYXB0ZXIgPSB0aGlzLmFkYXB0ZXJGb3IodHlwZSk7CgogICAgICAgIGlm IChhZGFwdGVyICYmIGFkYXB0ZXIuZ2VuZXJhdGVJZEZvclJlY29yZCkgewog ICAgICAgICAgcmV0dXJuIGFkYXB0ZXIuZ2VuZXJhdGVJZEZvclJlY29yZCh0 aGlzKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgICB9 LAoKICAgICAgLy8gLi4uLi4uLi4uLi4uLi4uLi4KICAgICAgLy8gLiBERUxF VEUgUkVDT1JEIC4KICAgICAgLy8gLi4uLi4uLi4uLi4uLi4uLi4KCiAgICAg IC8qKgogICAgICAgIEZvciBzeW1tZXRyeSwgYSByZWNvcmQgY2FuIGJlIGRl bGV0ZWQgdmlhIHRoZSBzdG9yZS4KCiAgICAgICAgRXhhbXBsZQoKICAgICAg ICBgYGBqYXZhc2NyaXB0CiAgICAgICAgdmFyIHBvc3QgPSBzdG9yZS5jcmVh dGVSZWNvcmQoJ3Bvc3QnLCB7CiAgICAgICAgICB0aXRsZTogIlJhaWxzIGlz IG9tYWthc2UiCiAgICAgICAgfSk7CgogICAgICAgIHN0b3JlLmRlbGV0ZVJl Y29yZChwb3N0KTsKICAgICAgICBgYGAKCiAgICAgICAgQG1ldGhvZCBkZWxl dGVSZWNvcmQKICAgICAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKICAg ICAgKi8KICAgICAgZGVsZXRlUmVjb3JkOiBmdW5jdGlvbihyZWNvcmQpIHsK ICAgICAgICByZWNvcmQuZGVsZXRlUmVjb3JkKCk7CiAgICAgIH0sCgogICAg ICAvKioKICAgICAgICBGb3Igc3ltbWV0cnksIGEgcmVjb3JkIGNhbiBiZSB1 bmxvYWRlZCB2aWEgdGhlIHN0b3JlLiBPbmx5CiAgICAgICAgbm9uLWRpcnR5 IHJlY29yZHMgY2FuIGJlIHVubG9hZGVkLgoKICAgICAgICBFeGFtcGxlCgog ICAgICAgIGBgYGphdmFzY3JpcHQKICAgICAgICBzdG9yZS5maW5kKCdwb3N0 JywgMSkudGhlbihmdW5jdGlvbihwb3N0KSB7CiAgICAgICAgICBzdG9yZS51 bmxvYWRSZWNvcmQocG9zdCk7CiAgICAgICAgfSk7CiAgICAgICAgYGBgCgog ICAgICAgIEBtZXRob2QgdW5sb2FkUmVjb3JkCiAgICAgICAgQHBhcmFtIHtE Uy5Nb2RlbH0gcmVjb3JkCiAgICAgICovCiAgICAgIHVubG9hZFJlY29yZDog ZnVuY3Rpb24ocmVjb3JkKSB7CiAgICAgICAgcmVjb3JkLnVubG9hZFJlY29y ZCgpOwogICAgICB9LAoKICAgICAgLy8gLi4uLi4uLi4uLi4uLi4uLgogICAg ICAvLyAuIEZJTkQgUkVDT1JEUyAuCiAgICAgIC8vIC4uLi4uLi4uLi4uLi4u Li4KCiAgICAgIC8qKgogICAgICAgIFRoaXMgaXMgdGhlIG1haW4gZW50cnkg cG9pbnQgaW50byBmaW5kaW5nIHJlY29yZHMuIFRoZSBmaXJzdCBwYXJhbWV0 ZXIgdG8KICAgICAgICB0aGlzIG1ldGhvZCBpcyB0aGUgbW9kZWwncyBuYW1l IGFzIGEgc3RyaW5nLgoKICAgICAgICAtLS0KCiAgICAgICAgVG8gZmluZCBh IHJlY29yZCBieSBJRCwgcGFzcyB0aGUgYGlkYCBhcyB0aGUgc2Vjb25kIHBh cmFtZXRlcjoKCiAgICAgICAgYGBgamF2YXNjcmlwdAogICAgICAgIHN0b3Jl LmZpbmQoJ3BlcnNvbicsIDEpOwogICAgICAgIGBgYAoKICAgICAgICBUaGUg YGZpbmRgIG1ldGhvZCB3aWxsIGFsd2F5cyByZXR1cm4gYSAqKnByb21pc2Uq KiB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQKICAgICAgICB3aXRoIHRoZSByZWNv cmQuIElmIHRoZSByZWNvcmQgd2FzIGFscmVhZHkgaW4gdGhlIHN0b3JlLCB0 aGUgcHJvbWlzZSB3aWxsCiAgICAgICAgYmUgcmVzb2x2ZWQgaW1tZWRpYXRl bHkuIE90aGVyd2lzZSwgdGhlIHN0b3JlIHdpbGwgYXNrIHRoZSBhZGFwdGVy J3MgYGZpbmRgCiAgICAgICAgbWV0aG9kIHRvIGZpbmQgdGhlIG5lY2Vzc2Fy eSBkYXRhLgoKICAgICAgICBUaGUgYGZpbmRgIG1ldGhvZCB3aWxsIGFsd2F5 cyByZXNvbHZlIGl0cyBwcm9taXNlIHdpdGggdGhlIHNhbWUgb2JqZWN0IGZv cgogICAgICAgIGEgZ2l2ZW4gdHlwZSBhbmQgYGlkYC4KCiAgICAgICAgLS0t CgogICAgICAgIFRvIGZpbmQgYWxsIHJlY29yZHMgZm9yIGEgdHlwZSwgY2Fs bCBgZmluZGAgd2l0aCBubyBhZGRpdGlvbmFsIHBhcmFtZXRlcnM6CgogICAg ICAgIGBgYGphdmFzY3JpcHQKICAgICAgICBzdG9yZS5maW5kKCdwZXJzb24n KTsKICAgICAgICBgYGAKCiAgICAgICAgVGhpcyB3aWxsIGFzayB0aGUgYWRh cHRlcidzIGBmaW5kQWxsYCBtZXRob2QgdG8gZmluZCB0aGUgcmVjb3JkcyBm b3IgdGhlCiAgICAgICAgZ2l2ZW4gdHlwZSwgYW5kIHJldHVybiBhIHByb21p c2UgdGhhdCB3aWxsIGJlIHJlc29sdmVkIG9uY2UgdGhlIHNlcnZlcgogICAg ICAgIHJldHVybnMgdGhlIHZhbHVlcy4KCiAgICAgICAgLS0tCgogICAgICAg IFRvIGZpbmQgYSByZWNvcmQgYnkgYSBxdWVyeSwgY2FsbCBgZmluZGAgd2l0 aCBhIGhhc2ggYXMgdGhlIHNlY29uZAogICAgICAgIHBhcmFtZXRlcjoKCiAg ICAgICAgYGBgamF2YXNjcmlwdAogICAgICAgIHN0b3JlLmZpbmQoQXBwLlBl cnNvbiwgeyBwYWdlOiAxIH0pOwogICAgICAgIGBgYAoKICAgICAgICBUaGlz IHdpbGwgYXNrIHRoZSBhZGFwdGVyJ3MgYGZpbmRRdWVyeWAgbWV0aG9kIHRv IGZpbmQgdGhlIHJlY29yZHMgZm9yCiAgICAgICAgdGhlIHF1ZXJ5LCBhbmQg cmV0dXJuIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgb25jZSB0 aGUgc2VydmVyCiAgICAgICAgcmVzcG9uZHMuCgogICAgICAgIEBtZXRob2Qg ZmluZAogICAgICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERT Lk1vZGVsfSB0eXBlCiAgICAgICAgQHBhcmFtIHtPYmplY3R8U3RyaW5nfElu dGVnZXJ8bnVsbH0gaWQKICAgICAgICBAcmV0dXJuIHtQcm9taXNlfSBwcm9t aXNlCiAgICAgICovCiAgICAgIGZpbmQ6IGZ1bmN0aW9uKHR5cGUsIGlkKSB7 CiAgICAgICAgRW1iZXIuYXNzZXJ0KCJZb3UgbmVlZCB0byBwYXNzIGEgdHlw ZSB0byB0aGUgc3RvcmUncyBmaW5kIG1ldGhvZCIsIGFyZ3VtZW50cy5sZW5n dGggPj0gMSk7CiAgICAgICAgRW1iZXIuYXNzZXJ0KCJZb3UgbWF5IG5vdCBw YXNzIGAiICsgaWQgKyAiYCBhcyBpZCB0byB0aGUgc3RvcmUncyBmaW5kIG1l dGhvZCIsIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgfHwgIUVtYmVyLmlzTm9u ZShpZCkpOwoKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkg ewogICAgICAgICAgcmV0dXJuIHRoaXMuZmluZEFsbCh0eXBlKTsKICAgICAg ICB9CgogICAgICAgIC8vIFdlIGFyZSBwYXNzZWQgYSBxdWVyeSBpbnN0ZWFk IG9mIGFuIGlkLgogICAgICAgIGlmIChFbWJlci50eXBlT2YoaWQpID09PSAn b2JqZWN0JykgewogICAgICAgICAgcmV0dXJuIHRoaXMuZmluZFF1ZXJ5KHR5 cGUsIGlkKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0aGlzLmZpbmRC eUlkKHR5cGUsIGNvZXJjZUlkKGlkKSk7CiAgICAgIH0sCgogICAgICAvKioK ICAgICAgICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgcmVjb3JkIGZvciBhIGdp dmVuIHR5cGUgYW5kIGlkIGNvbWJpbmF0aW9uLgoKICAgICAgICBAbWV0aG9k IGZpbmRCeUlkCiAgICAgICAgQHByaXZhdGUKICAgICAgICBAcGFyYW0ge1N0 cmluZyBvciBzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQogICAgICAgIEBw YXJhbSB7U3RyaW5nfEludGVnZXJ9IGlkCiAgICAgICAgQHJldHVybiB7UHJv bWlzZX0gcHJvbWlzZQogICAgICAqLwogICAgICBmaW5kQnlJZDogZnVuY3Rp b24odHlwZSwgaWQpIHsKICAgICAgICB0eXBlID0gdGhpcy5tb2RlbEZvcih0 eXBlKTsKCiAgICAgICAgdmFyIHJlY29yZCA9IHRoaXMucmVjb3JkRm9ySWQo dHlwZSwgaWQpOwogICAgICAgIHZhciBmZXRjaGVkUmVjb3JkID0gdGhpcy5m ZXRjaFJlY29yZChyZWNvcmQpOwoKICAgICAgICByZXR1cm4gcHJvbWlzZU9i amVjdChmZXRjaGVkUmVjb3JkIHx8IHJlY29yZCwgIkRTOiBTdG9yZSNmaW5k QnlJZCAiICsgdHlwZSArICIgd2l0aCBpZDogIiArIGlkKTsKICAgICAgfSwK CiAgICAgIC8qKgogICAgICAgIFRoaXMgbWV0aG9kIG1ha2VzIGEgc2VyaWVz IG9mIHJlcXVlc3RzIHRvIHRoZSBhZGFwdGVyJ3MgYGZpbmRgIG1ldGhvZAog ICAgICAgIGFuZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIG9u Y2UgdGhleSBhcmUgYWxsIGxvYWRlZC4KCiAgICAgICAgQHByaXZhdGUKICAg ICAgICBAbWV0aG9kIGZpbmRCeUlkcwogICAgICAgIEBwYXJhbSB7U3RyaW5n fSB0eXBlCiAgICAgICAgQHBhcmFtIHtBcnJheX0gaWRzCiAgICAgICAgQHJl dHVybnMge1Byb21pc2V9IHByb21pc2UKICAgICAgKi8KICAgICAgZmluZEJ5 SWRzOiBmdW5jdGlvbih0eXBlLCBpZHMpIHsKICAgICAgICB2YXIgc3RvcmUg PSB0aGlzOwogICAgICAgIHZhciBwcm9taXNlTGFiZWwgPSAiRFM6IFN0b3Jl I2ZpbmRCeUlkcyAiICsgdHlwZTsKICAgICAgICByZXR1cm4gcHJvbWlzZUFy cmF5KEVtYmVyLlJTVlAuYWxsKG1hcChpZHMsIGZ1bmN0aW9uKGlkKSB7CiAg ICAgICAgICByZXR1cm4gc3RvcmUuZmluZEJ5SWQodHlwZSwgaWQpOwogICAg ICAgIH0pKS50aGVuKEVtYmVyLkEsIG51bGwsICJEUzogU3RvcmUjZmluZEJ5 SWRzIG9mICIgKyB0eXBlICsgIiBjb21wbGV0ZSIpKTsKICAgICAgfSwKCiAg ICAgIC8qKgogICAgICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBgZmlu ZEJ5SWRgIGlmIGl0IGRpc2NvdmVycyB0aGF0IGEgcGFydGljdWxhcgogICAg ICAgIHR5cGUvaWQgcGFpciBoYXNuJ3QgYmVlbiBsb2FkZWQgeWV0IHRvIGtp Y2sgb2ZmIGEgcmVxdWVzdCB0byB0aGUKICAgICAgICBhZGFwdGVyLgoKICAg ICAgICBAbWV0aG9kIGZldGNoUmVjb3JkCiAgICAgICAgQHByaXZhdGUKICAg ICAgICBAcGFyYW0ge0RTLk1vZGVsfSByZWNvcmQKICAgICAgICBAcmV0dXJu cyB7UHJvbWlzZX0gcHJvbWlzZQogICAgICAqLwogICAgICBmZXRjaFJlY29y ZDogZnVuY3Rpb24ocmVjb3JkKSB7CiAgICAgICAgaWYgKGlzTm9uZShyZWNv cmQpKSB7IHJldHVybiBudWxsOyB9CiAgICAgICAgaWYgKHJlY29yZC5fbG9h ZGluZ1Byb21pc2UpIHsgcmV0dXJuIHJlY29yZC5fbG9hZGluZ1Byb21pc2U7 IH0KICAgICAgICBpZiAoIWdldChyZWNvcmQsICdpc0VtcHR5JykpIHsgcmV0 dXJuIG51bGw7IH0KCiAgICAgICAgdmFyIHR5cGUgPSByZWNvcmQuY29uc3Ry dWN0b3IsCiAgICAgICAgICAgIGlkID0gZ2V0KHJlY29yZCwgJ2lkJyk7Cgog ICAgICAgIHZhciBhZGFwdGVyID0gdGhpcy5hZGFwdGVyRm9yKHR5cGUpOwoK ICAgICAgICBFbWJlci5hc3NlcnQoIllvdSB0cmllZCB0byBmaW5kIGEgcmVj b3JkIGJ1dCB5b3UgaGF2ZSBubyBhZGFwdGVyIChmb3IgIiArIHR5cGUgKyAi KSIsIGFkYXB0ZXIpOwogICAgICAgIEVtYmVyLmFzc2VydCgiWW91IHRyaWVk IHRvIGZpbmQgYSByZWNvcmQgYnV0IHlvdXIgYWRhcHRlciAoZm9yICIgKyB0 eXBlICsgIikgZG9lcyBub3QgaW1wbGVtZW50ICdmaW5kJyIsIGFkYXB0ZXIu ZmluZCk7CgogICAgICAgIHZhciBwcm9taXNlID0gX2ZpbmQoYWRhcHRlciwg dGhpcywgdHlwZSwgaWQpOwogICAgICAgIHJlY29yZC5sb2FkaW5nRGF0YShw cm9taXNlKTsKICAgICAgICByZXR1cm4gcHJvbWlzZTsKICAgICAgfSwKCiAg ICAgIC8qKgogICAgICAgIEdldCBhIHJlY29yZCBieSBhIGdpdmVuIHR5cGUg YW5kIElEIHdpdGhvdXQgdHJpZ2dlcmluZyBhIGZldGNoLgoKICAgICAgICBU aGlzIG1ldGhvZCB3aWxsIHN5bmNocm9ub3VzbHkgcmV0dXJuIHRoZSByZWNv cmQgaWYgaXQncyBhdmFpbGFibGUuCiAgICAgICAgT3RoZXJ3aXNlLCBpdCB3 aWxsIHJldHVybiBudWxsLgoKICAgICAgICBgYGBqcwogICAgICAgIHZhciBw b3N0ID0gc3RvcmUuZ2V0QnlJZCgncG9zdCcsIDEpOwogICAgICAgIGBgYAoK ICAgICAgICBAbWV0aG9kIGdldEJ5SWQKICAgICAgICBAcGFyYW0ge1N0cmlu ZyBvciBzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQogICAgICAgIEBwYXJh bSB7U3RyaW5nfEludGVnZXJ9IGlkCiAgICAgICAgQHBhcmFtIHtEUy5Nb2Rl bH0gcmVjb3JkCiAgICAgICovCiAgICAgIGdldEJ5SWQ6IGZ1bmN0aW9uKHR5 cGUsIGlkKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzUmVjb3JkRm9ySWQodHlw ZSwgaWQpKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5yZWNvcmRGb3JJZCh0 eXBlLCBpZCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBu dWxsOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgIFRo aXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgcmVjb3JkJ3MgYHJlbG9hZGAg bWV0aG9kLgoKICAgICAgICBUaGlzIG1ldGhvZCBjYWxscyB0aGUgYWRhcHRl cidzIGBmaW5kYCBtZXRob2QsIHdoaWNoIHJldHVybnMgYSBwcm9taXNlLiBX aGVuCiAgICAgICAgKip0aGF0KiogcHJvbWlzZSByZXNvbHZlcywgYHJlbG9h ZFJlY29yZGAgd2lsbCByZXNvbHZlIHRoZSBwcm9taXNlIHJldHVybmVkCiAg ICAgICAgYnkgdGhlIHJlY29yZCdzIGByZWxvYWRgLgoKICAgICAgICBAbWV0 aG9kIHJlbG9hZFJlY29yZAogICAgICAgIEBwcml2YXRlCiAgICAgICAgQHBh cmFtIHtEUy5Nb2RlbH0gcmVjb3JkCiAgICAgICAgQHJldHVybiB7UHJvbWlz ZX0gcHJvbWlzZQogICAgICAqLwogICAgICByZWxvYWRSZWNvcmQ6IGZ1bmN0 aW9uKHJlY29yZCkgewogICAgICAgIHZhciB0eXBlID0gcmVjb3JkLmNvbnN0 cnVjdG9yLAogICAgICAgICAgICBhZGFwdGVyID0gdGhpcy5hZGFwdGVyRm9y KHR5cGUpLAogICAgICAgICAgICBpZCA9IGdldChyZWNvcmQsICdpZCcpOwoK ICAgICAgICBFbWJlci5hc3NlcnQoIllvdSBjYW5ub3QgcmVsb2FkIGEgcmVj b3JkIHdpdGhvdXQgYW4gSUQiLCBpZCk7CiAgICAgICAgRW1iZXIuYXNzZXJ0 KCJZb3UgdHJpZWQgdG8gcmVsb2FkIGEgcmVjb3JkIGJ1dCB5b3UgaGF2ZSBu byBhZGFwdGVyIChmb3IgIiArIHR5cGUgKyAiKSIsIGFkYXB0ZXIpOwogICAg ICAgIEVtYmVyLmFzc2VydCgiWW91IHRyaWVkIHRvIHJlbG9hZCBhIHJlY29y ZCBidXQgeW91ciBhZGFwdGVyIGRvZXMgbm90IGltcGxlbWVudCBgZmluZGAi LCBhZGFwdGVyLmZpbmQpOwoKICAgICAgICByZXR1cm4gX2ZpbmQoYWRhcHRl ciwgdGhpcywgdHlwZSwgaWQpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAg ICAgVGhpcyBtZXRob2QgdGFrZXMgYSBsaXN0IG9mIHJlY29yZHMsIGdyb3Vw cyB0aGUgcmVjb3JkcyBieSB0eXBlLAogICAgICAgIGNvbnZlcnRzIHRoZSBy ZWNvcmRzIGludG8gSURzLCBhbmQgdGhlbiBpbnZva2VzIHRoZSBhZGFwdGVy J3MgYGZpbmRNYW55YAogICAgICAgIG1ldGhvZC4KCiAgICAgICAgVGhlIHJl Y29yZHMgYXJlIGdyb3VwZWQgYnkgdHlwZSB0byBpbnZva2UgYGZpbmRNYW55 YCBvbiBhZGFwdGVycwogICAgICAgIGZvciBlYWNoIHVuaXF1ZSB0eXBlIGlu IHJlY29yZHMuCgogICAgICAgIEl0IGlzIHVzZWQgYm90aCBieSBhIGJyYW5k IG5ldyByZWxhdGlvbnNoaXAgKHZpYSB0aGUgYGZpbmRNYW55YAogICAgICAg IG1ldGhvZCkgb3Igd2hlbiB0aGUgZGF0YSB1bmRlcmx5aW5nIGFuIGV4aXN0 aW5nIHJlbGF0aW9uc2hpcAogICAgICAgIGNoYW5nZXMuCgogICAgICAgIEBt ZXRob2QgZmV0Y2hNYW55CiAgICAgICAgQHByaXZhdGUKICAgICAgICBAcGFy YW0ge0FycmF5fSByZWNvcmRzCiAgICAgICAgQHBhcmFtIHtEUy5Nb2RlbH0g b3duZXIKICAgICAgICBAcmV0dXJuIHtQcm9taXNlfSBwcm9taXNlCiAgICAg ICovCiAgICAgIGZldGNoTWFueTogZnVuY3Rpb24ocmVjb3Jkcywgb3duZXIp IHsKICAgICAgICBpZiAoIXJlY29yZHMubGVuZ3RoKSB7IHJldHVybjsgfQoK ICAgICAgICAvLyBHcm91cCBCeSBUeXBlCiAgICAgICAgdmFyIHJlY29yZHNC eVR5cGVNYXAgPSBFbWJlci5NYXBXaXRoRGVmYXVsdC5jcmVhdGUoewogICAg ICAgICAgZGVmYXVsdFZhbHVlOiBmdW5jdGlvbigpIHsgcmV0dXJuIEVtYmVy LkEoKTsgfQogICAgICAgIH0pOwoKICAgICAgICBmb3JFYWNoKHJlY29yZHMs IGZ1bmN0aW9uKHJlY29yZCkgewogICAgICAgICAgcmVjb3Jkc0J5VHlwZU1h cC5nZXQocmVjb3JkLmNvbnN0cnVjdG9yKS5wdXNoKHJlY29yZCk7CiAgICAg ICAgfSk7CgogICAgICAgIHZhciBwcm9taXNlcyA9IFtdOwoKICAgICAgICBm b3JFYWNoKHJlY29yZHNCeVR5cGVNYXAsIGZ1bmN0aW9uKHR5cGUsIHJlY29y ZHMpIHsKICAgICAgICAgIHZhciBpZHMgPSByZWNvcmRzLm1hcFByb3BlcnR5 KCdpZCcpLAogICAgICAgICAgICAgIGFkYXB0ZXIgPSB0aGlzLmFkYXB0ZXJG b3IodHlwZSk7CgogICAgICAgICAgRW1iZXIuYXNzZXJ0KCJZb3UgdHJpZWQg dG8gbG9hZCBtYW55IHJlY29yZHMgYnV0IHlvdSBoYXZlIG5vIGFkYXB0ZXIg KGZvciAiICsgdHlwZSArICIpIiwgYWRhcHRlcik7CiAgICAgICAgICBFbWJl ci5hc3NlcnQoIllvdSB0cmllZCB0byBsb2FkIG1hbnkgcmVjb3JkcyBidXQg eW91ciBhZGFwdGVyIGRvZXMgbm90IGltcGxlbWVudCBgZmluZE1hbnlgIiwg YWRhcHRlci5maW5kTWFueSk7CgogICAgICAgICAgcHJvbWlzZXMucHVzaChf ZmluZE1hbnkoYWRhcHRlciwgdGhpcywgdHlwZSwgaWRzLCBvd25lcikpOwog ICAgICAgIH0sIHRoaXMpOwoKICAgICAgICByZXR1cm4gRW1iZXIuUlNWUC5h bGwocHJvbWlzZXMpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAgUmV0 dXJucyB0cnVlIGlmIGEgcmVjb3JkIGZvciBhIGdpdmVuIHR5cGUgYW5kIElE IGlzIGFscmVhZHkgbG9hZGVkLgoKICAgICAgICBAbWV0aG9kIGhhc1JlY29y ZEZvcklkCiAgICAgICAgQHBhcmFtIHtTdHJpbmcgb3Igc3ViY2xhc3Mgb2Yg RFMuTW9kZWx9IHR5cGUKICAgICAgICBAcGFyYW0ge1N0cmluZ3xJbnRlZ2Vy fSBpZAogICAgICAgIEByZXR1cm5zIHtCb29sZWFufQogICAgICAqLwogICAg ICBoYXNSZWNvcmRGb3JJZDogZnVuY3Rpb24odHlwZSwgaWQpIHsKICAgICAg ICBpZCA9IGNvZXJjZUlkKGlkKTsKICAgICAgICB0eXBlID0gdGhpcy5tb2Rl bEZvcih0eXBlKTsKICAgICAgICByZXR1cm4gISF0aGlzLnR5cGVNYXBGb3Io dHlwZSkuaWRUb1JlY29yZFtpZF07CiAgICAgIH0sCgogICAgICAvKioKICAg ICAgICBSZXR1cm5zIGlkIHJlY29yZCBmb3IgYSBnaXZlbiB0eXBlIGFuZCBJ RC4gSWYgb25lIGlzbid0IGFscmVhZHkgbG9hZGVkLAogICAgICAgIGl0IGJ1 aWxkcyBhIG5ldyByZWNvcmQgYW5kIGxlYXZlcyBpdCBpbiB0aGUgYGVtcHR5 YCBzdGF0ZS4KCiAgICAgICAgQG1ldGhvZCByZWNvcmRGb3JJZAogICAgICAg IEBwcml2YXRlCiAgICAgICAgQHBhcmFtIHtTdHJpbmcgb3Igc3ViY2xhc3Mg b2YgRFMuTW9kZWx9IHR5cGUKICAgICAgICBAcGFyYW0ge1N0cmluZ3xJbnRl Z2VyfSBpZAogICAgICAgIEByZXR1cm5zIHtEUy5Nb2RlbH0gcmVjb3JkCiAg ICAgICovCiAgICAgIHJlY29yZEZvcklkOiBmdW5jdGlvbih0eXBlLCBpZCkg ewogICAgICAgIHR5cGUgPSB0aGlzLm1vZGVsRm9yKHR5cGUpOwoKICAgICAg ICBpZCA9IGNvZXJjZUlkKGlkKTsKCiAgICAgICAgdmFyIHJlY29yZCA9IHRo aXMudHlwZU1hcEZvcih0eXBlKS5pZFRvUmVjb3JkW2lkXTsKCiAgICAgICAg aWYgKCFyZWNvcmQpIHsKICAgICAgICAgIHJlY29yZCA9IHRoaXMuYnVpbGRS ZWNvcmQodHlwZSwgaWQpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJl Y29yZDsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgIEBtZXRob2QgZmlu ZE1hbnkKICAgICAgICBAcHJpdmF0ZQogICAgICAgIEBwYXJhbSB7RFMuTW9k ZWx9IG93bmVyCiAgICAgICAgQHBhcmFtIHtBcnJheX0gcmVjb3JkcwogICAg ICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERTLk1vZGVsfSB0 eXBlCiAgICAgICAgQHBhcmFtIHtSZXNvbHZlcn0gcmVzb2x2ZXIKICAgICAg ICBAcmV0dXJuIHtEUy5NYW55QXJyYXl9IHJlY29yZHMKICAgICAgKi8KICAg ICAgZmluZE1hbnk6IGZ1bmN0aW9uKG93bmVyLCByZWNvcmRzLCB0eXBlLCBy ZXNvbHZlcikgewogICAgICAgIHR5cGUgPSB0aGlzLm1vZGVsRm9yKHR5cGUp OwoKICAgICAgICByZWNvcmRzID0gRW1iZXIuQShyZWNvcmRzKTsKCiAgICAg ICAgdmFyIHVubG9hZGVkUmVjb3JkcyA9IHJlY29yZHMuZmlsdGVyUHJvcGVy dHkoJ2lzRW1wdHknLCB0cnVlKSwKICAgICAgICAgICAgbWFueUFycmF5ID0g dGhpcy5yZWNvcmRBcnJheU1hbmFnZXIuY3JlYXRlTWFueUFycmF5KHR5cGUs IHJlY29yZHMpOwoKICAgICAgICBmb3JFYWNoKHVubG9hZGVkUmVjb3Jkcywg ZnVuY3Rpb24ocmVjb3JkKSB7CiAgICAgICAgICByZWNvcmQubG9hZGluZ0Rh dGEoKTsKICAgICAgICB9KTsKCiAgICAgICAgbWFueUFycmF5LmxvYWRpbmdS ZWNvcmRzQ291bnQgPSB1bmxvYWRlZFJlY29yZHMubGVuZ3RoOwoKICAgICAg ICBpZiAodW5sb2FkZWRSZWNvcmRzLmxlbmd0aCkgewogICAgICAgICAgZm9y RWFjaCh1bmxvYWRlZFJlY29yZHMsIGZ1bmN0aW9uKHJlY29yZCkgewogICAg ICAgICAgICB0aGlzLnJlY29yZEFycmF5TWFuYWdlci5yZWdpc3RlcldhaXRp bmdSZWNvcmRBcnJheShyZWNvcmQsIG1hbnlBcnJheSk7CiAgICAgICAgICB9 LCB0aGlzKTsKCiAgICAgICAgICByZXNvbHZlci5yZXNvbHZlKHRoaXMuZmV0 Y2hNYW55KHVubG9hZGVkUmVjb3Jkcywgb3duZXIpKTsKICAgICAgICB9IGVs c2UgewogICAgICAgICAgaWYgKHJlc29sdmVyKSB7IHJlc29sdmVyLnJlc29s dmUoKTsgfQogICAgICAgICAgbWFueUFycmF5LnNldCgnaXNMb2FkZWQnLCB0 cnVlKTsKICAgICAgICAgIG9uY2UobWFueUFycmF5LCAndHJpZ2dlcicsICdk aWRMb2FkJyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbWFueUFycmF5 OwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAgSWYgYSByZWxhdGlvbnNo aXAgd2FzIG9yaWdpbmFsbHkgcG9wdWxhdGVkIGJ5IHRoZSBhZGFwdGVyIGFz IGEgbGluawogICAgICAgIChhcyBvcHBvc2VkIHRvIGEgbGlzdCBvZiBJRHMp LCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUKICAgICAgICByZWxh dGlvbnNoaXAgaXMgZmV0Y2hlZC4KCiAgICAgICAgVGhlIGxpbmsgKHdoaWNo IGlzIHVzdWFsbHkgYSBVUkwpIGlzIHBhc3NlZCB0aHJvdWdoIHVuY2hhbmdl ZCwgc28gdGhlCiAgICAgICAgYWRhcHRlciBjYW4gbWFrZSB3aGF0ZXZlciBy ZXF1ZXN0IGl0IHdhbnRzLgoKICAgICAgICBUaGUgdXN1YWwgdXNlLWNhc2Ug aXMgZm9yIHRoZSBzZXJ2ZXIgdG8gcmVnaXN0ZXIgYSBVUkwgYXMgYSBsaW5r LCBhbmQKICAgICAgICB0aGVuIHVzZSB0aGF0IFVSTCBpbiB0aGUgZnV0dXJl IHRvIG1ha2UgYSByZXF1ZXN0IGZvciB0aGUgcmVsYXRpb25zaGlwLgoKICAg ICAgICBAbWV0aG9kIGZpbmRIYXNNYW55CiAgICAgICAgQHByaXZhdGUKICAg ICAgICBAcGFyYW0ge0RTLk1vZGVsfSBvd25lcgogICAgICAgIEBwYXJhbSB7 YW55fSBsaW5rCiAgICAgICAgQHBhcmFtIHtTdHJpbmcgb3Igc3ViY2xhc3Mg b2YgRFMuTW9kZWx9IHR5cGUKICAgICAgICBAcmV0dXJuIHtQcm9taXNlfSBw cm9taXNlCiAgICAgICovCiAgICAgIGZpbmRIYXNNYW55OiBmdW5jdGlvbihv d25lciwgbGluaywgcmVsYXRpb25zaGlwLCByZXNvbHZlcikgewogICAgICAg IHZhciBhZGFwdGVyID0gdGhpcy5hZGFwdGVyRm9yKG93bmVyLmNvbnN0cnVj dG9yKTsKCiAgICAgICAgRW1iZXIuYXNzZXJ0KCJZb3UgdHJpZWQgdG8gbG9h ZCBhIGhhc01hbnkgcmVsYXRpb25zaGlwIGJ1dCB5b3UgaGF2ZSBubyBhZGFw dGVyIChmb3IgIiArIG93bmVyLmNvbnN0cnVjdG9yICsgIikiLCBhZGFwdGVy KTsKICAgICAgICBFbWJlci5hc3NlcnQoIllvdSB0cmllZCB0byBsb2FkIGEg aGFzTWFueSByZWxhdGlvbnNoaXAgZnJvbSBhIHNwZWNpZmllZCBgbGlua2Ag aW4gdGhlIG9yaWdpbmFsIHBheWxvYWQgYnV0IHlvdXIgYWRhcHRlciBkb2Vz IG5vdCBpbXBsZW1lbnQgYGZpbmRIYXNNYW55YCIsIGFkYXB0ZXIuZmluZEhh c01hbnkpOwoKICAgICAgICB2YXIgcmVjb3JkcyA9IHRoaXMucmVjb3JkQXJy YXlNYW5hZ2VyLmNyZWF0ZU1hbnlBcnJheShyZWxhdGlvbnNoaXAudHlwZSwg RW1iZXIuQShbXSkpOwogICAgICAgIHJlc29sdmVyLnJlc29sdmUoX2ZpbmRI YXNNYW55KGFkYXB0ZXIsIHRoaXMsIG93bmVyLCBsaW5rLCByZWxhdGlvbnNo aXApKTsKICAgICAgICByZXR1cm4gcmVjb3JkczsKICAgICAgfSwKCiAgICAg IC8qKgogICAgICAgIEBtZXRob2QgZmluZEJlbG9uZ3NUbwogICAgICAgIEBw cml2YXRlCiAgICAgICAgQHBhcmFtIHtEUy5Nb2RlbH0gb3duZXIKICAgICAg ICBAcGFyYW0ge2FueX0gbGluawogICAgICAgIEBwYXJhbSB7UmVsYXRpb25z aGlwfSByZWxhdGlvbnNoaXAKICAgICAgICBAcmV0dXJuIHtQcm9taXNlfSBw cm9taXNlCiAgICAgICovCiAgICAgIGZpbmRCZWxvbmdzVG86IGZ1bmN0aW9u KG93bmVyLCBsaW5rLCByZWxhdGlvbnNoaXApIHsKICAgICAgICB2YXIgYWRh cHRlciA9IHRoaXMuYWRhcHRlckZvcihvd25lci5jb25zdHJ1Y3Rvcik7Cgog ICAgICAgIEVtYmVyLmFzc2VydCgiWW91IHRyaWVkIHRvIGxvYWQgYSBiZWxv bmdzVG8gcmVsYXRpb25zaGlwIGJ1dCB5b3UgaGF2ZSBubyBhZGFwdGVyIChm b3IgIiArIG93bmVyLmNvbnN0cnVjdG9yICsgIikiLCBhZGFwdGVyKTsKICAg ICAgICBFbWJlci5hc3NlcnQoIllvdSB0cmllZCB0byBsb2FkIGEgYmVsb25n c1RvIHJlbGF0aW9uc2hpcCBmcm9tIGEgc3BlY2lmaWVkIGBsaW5rYCBpbiB0 aGUgb3JpZ2luYWwgcGF5bG9hZCBidXQgeW91ciBhZGFwdGVyIGRvZXMgbm90 IGltcGxlbWVudCBgZmluZEJlbG9uZ3NUb2AiLCBhZGFwdGVyLmZpbmRCZWxv bmdzVG8pOwoKICAgICAgICByZXR1cm4gX2ZpbmRCZWxvbmdzVG8oYWRhcHRl ciwgdGhpcywgb3duZXIsIGxpbmssIHJlbGF0aW9uc2hpcCk7CiAgICAgIH0s CgogICAgICAvKioKICAgICAgICBUaGlzIG1ldGhvZCBkZWxlZ2F0ZXMgYSBx dWVyeSB0byB0aGUgYWRhcHRlci4gVGhpcyBpcyB0aGUgb25lIHBsYWNlIHdo ZXJlCiAgICAgICAgYWRhcHRlci1sZXZlbCBzZW1hbnRpY3MgYXJlIGV4cG9z ZWQgdG8gdGhlIGFwcGxpY2F0aW9uLgoKICAgICAgICBFeHBvc2luZyBxdWVy aWVzIHRoaXMgd2F5IHNlZW1zIHByZWZlcmFibGUgdG8gY3JlYXRpbmcgYW4g YWJzdHJhY3QgcXVlcnkKICAgICAgICBsYW5ndWFnZSBmb3IgYWxsIHNlcnZl ci1zaWRlIHF1ZXJpZXMsIGFuZCB0aGVuIHJlcXVpcmUgYWxsIGFkYXB0ZXJz IHRvCiAgICAgICAgaW1wbGVtZW50IHRoZW0uCgogICAgICAgIFRoaXMgbWV0 aG9kIHJldHVybnMgYSBwcm9taXNlLCB3aGljaCBpcyByZXNvbHZlZCB3aXRo IGEgYFJlY29yZEFycmF5YAogICAgICAgIG9uY2UgdGhlIHNlcnZlciByZXR1 cm5zLgoKICAgICAgICBAbWV0aG9kIGZpbmRRdWVyeQogICAgICAgIEBwcml2 YXRlCiAgICAgICAgQHBhcmFtIHtTdHJpbmcgb3Igc3ViY2xhc3Mgb2YgRFMu TW9kZWx9IHR5cGUKICAgICAgICBAcGFyYW0ge2FueX0gcXVlcnkgYW4gb3Bh cXVlIHF1ZXJ5IHRvIGJlIHVzZWQgYnkgdGhlIGFkYXB0ZXIKICAgICAgICBA cmV0dXJuIHtQcm9taXNlfSBwcm9taXNlCiAgICAgICovCiAgICAgIGZpbmRR dWVyeTogZnVuY3Rpb24odHlwZSwgcXVlcnkpIHsKICAgICAgICB0eXBlID0g dGhpcy5tb2RlbEZvcih0eXBlKTsKCiAgICAgICAgdmFyIGFycmF5ID0gdGhp cy5yZWNvcmRBcnJheU1hbmFnZXIKICAgICAgICAgIC5jcmVhdGVBZGFwdGVy UG9wdWxhdGVkUmVjb3JkQXJyYXkodHlwZSwgcXVlcnkpOwoKICAgICAgICB2 YXIgYWRhcHRlciA9IHRoaXMuYWRhcHRlckZvcih0eXBlKTsKCiAgICAgICAg RW1iZXIuYXNzZXJ0KCJZb3UgdHJpZWQgdG8gbG9hZCBhIHF1ZXJ5IGJ1dCB5 b3UgaGF2ZSBubyBhZGFwdGVyIChmb3IgIiArIHR5cGUgKyAiKSIsIGFkYXB0 ZXIpOwogICAgICAgIEVtYmVyLmFzc2VydCgiWW91IHRyaWVkIHRvIGxvYWQg YSBxdWVyeSBidXQgeW91ciBhZGFwdGVyIGRvZXMgbm90IGltcGxlbWVudCBg ZmluZFF1ZXJ5YCIsIGFkYXB0ZXIuZmluZFF1ZXJ5KTsKCiAgICAgICAgcmV0 dXJuIHByb21pc2VBcnJheShfZmluZFF1ZXJ5KGFkYXB0ZXIsIHRoaXMsIHR5 cGUsIHF1ZXJ5LCBhcnJheSkpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAg ICAgVGhpcyBtZXRob2QgcmV0dXJucyBhbiBhcnJheSBvZiBhbGwgcmVjb3Jk cyBhZGFwdGVyIGNhbiBmaW5kLgogICAgICAgIEl0IHRyaWdnZXJzIHRoZSBh ZGFwdGVyJ3MgYGZpbmRBbGxgIG1ldGhvZCB0byBnaXZlIGl0IGFuIG9wcG9y dHVuaXR5IHRvIHBvcHVsYXRlCiAgICAgICAgdGhlIGFycmF5IHdpdGggcmVj b3JkcyBvZiB0aGF0IHR5cGUuCgogICAgICAgIEBtZXRob2QgZmluZEFsbAog ICAgICAgIEBwcml2YXRlCiAgICAgICAgQHBhcmFtIHtTdHJpbmcgb3Igc3Vi Y2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKICAgICAgICBAcmV0dXJuIHtEUy5B ZGFwdGVyUG9wdWxhdGVkUmVjb3JkQXJyYXl9CiAgICAgICovCiAgICAgIGZp bmRBbGw6IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICB0eXBlID0gdGhpcy5t b2RlbEZvcih0eXBlKTsKCiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hBbGwo dHlwZSwgdGhpcy5hbGwodHlwZSkpOwogICAgICB9LAoKICAgICAgLyoqCiAg ICAgICAgQG1ldGhvZCBmZXRjaEFsbAogICAgICAgIEBwcml2YXRlCiAgICAg ICAgQHBhcmFtIHtEUy5Nb2RlbH0gdHlwZQogICAgICAgIEBwYXJhbSB7RFMu UmVjb3JkQXJyYXl9IGFycmF5CiAgICAgICAgQHJldHVybnMge1Byb21pc2V9 IHByb21pc2UKICAgICAgKi8KICAgICAgZmV0Y2hBbGw6IGZ1bmN0aW9uKHR5 cGUsIGFycmF5KSB7CiAgICAgICAgdmFyIGFkYXB0ZXIgPSB0aGlzLmFkYXB0 ZXJGb3IodHlwZSksCiAgICAgICAgICAgIHNpbmNlVG9rZW4gPSB0aGlzLnR5 cGVNYXBGb3IodHlwZSkubWV0YWRhdGEuc2luY2U7CgogICAgICAgIHNldChh cnJheSwgJ2lzVXBkYXRpbmcnLCB0cnVlKTsKCiAgICAgICAgRW1iZXIuYXNz ZXJ0KCJZb3UgdHJpZWQgdG8gbG9hZCBhbGwgcmVjb3JkcyBidXQgeW91IGhh dmUgbm8gYWRhcHRlciAoZm9yICIgKyB0eXBlICsgIikiLCBhZGFwdGVyKTsK ICAgICAgICBFbWJlci5hc3NlcnQoIllvdSB0cmllZCB0byBsb2FkIGFsbCBy ZWNvcmRzIGJ1dCB5b3VyIGFkYXB0ZXIgZG9lcyBub3QgaW1wbGVtZW50IGBm aW5kQWxsYCIsIGFkYXB0ZXIuZmluZEFsbCk7CgogICAgICAgIHJldHVybiBw cm9taXNlQXJyYXkoX2ZpbmRBbGwoYWRhcHRlciwgdGhpcywgdHlwZSwgc2lu Y2VUb2tlbikpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAgQG1ldGhv ZCBkaWRVcGRhdGVBbGwKICAgICAgICBAcGFyYW0ge0RTLk1vZGVsfSB0eXBl CiAgICAgICovCiAgICAgIGRpZFVwZGF0ZUFsbDogZnVuY3Rpb24odHlwZSkg ewogICAgICAgIHZhciBmaW5kQWxsQ2FjaGUgPSB0aGlzLnR5cGVNYXBGb3Io dHlwZSkuZmluZEFsbENhY2hlOwogICAgICAgIHNldChmaW5kQWxsQ2FjaGUs ICdpc1VwZGF0aW5nJywgZmFsc2UpOwogICAgICB9LAoKICAgICAgLyoqCiAg ICAgICAgVGhpcyBtZXRob2QgcmV0dXJucyBhIGZpbHRlcmVkIGFycmF5IHRo YXQgY29udGFpbnMgYWxsIG9mIHRoZSBrbm93biByZWNvcmRzCiAgICAgICAg Zm9yIGEgZ2l2ZW4gdHlwZS4KCiAgICAgICAgTm90ZSB0aGF0IGJlY2F1c2Ug aXQncyBqdXN0IGEgZmlsdGVyLCBpdCB3aWxsIGhhdmUgYW55IGxvY2FsbHkK ICAgICAgICBjcmVhdGVkIHJlY29yZHMgb2YgdGhlIHR5cGUuCgogICAgICAg IEFsc28gbm90ZSB0aGF0IG11bHRpcGxlIGNhbGxzIHRvIGBhbGxgIGZvciBh IGdpdmVuIHR5cGUgd2lsbCBhbHdheXMKICAgICAgICByZXR1cm4gdGhlIHNh bWUgUmVjb3JkQXJyYXkuCgogICAgICAgIEV4YW1wbGUKCiAgICAgICAgYGBg amF2YXNjcmlwdAogICAgICAgIHZhciBsb2NhbF9wb3N0cyA9IHN0b3JlLmFs bChBcHAuUG9zdCk7CiAgICAgICAgYGBgCgogICAgICAgIEBtZXRob2QgYWxs CiAgICAgICAgQHBhcmFtIHtTdHJpbmcgb3Igc3ViY2xhc3Mgb2YgRFMuTW9k ZWx9IHR5cGUKICAgICAgICBAcmV0dXJuIHtEUy5SZWNvcmRBcnJheX0KICAg ICAgKi8KICAgICAgYWxsOiBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgdHlw ZSA9IHRoaXMubW9kZWxGb3IodHlwZSk7CgogICAgICAgIHZhciB0eXBlTWFw ID0gdGhpcy50eXBlTWFwRm9yKHR5cGUpLAogICAgICAgICAgICBmaW5kQWxs Q2FjaGUgPSB0eXBlTWFwLmZpbmRBbGxDYWNoZTsKCiAgICAgICAgaWYgKGZp bmRBbGxDYWNoZSkgeyByZXR1cm4gZmluZEFsbENhY2hlOyB9CgogICAgICAg IHZhciBhcnJheSA9IHRoaXMucmVjb3JkQXJyYXlNYW5hZ2VyLmNyZWF0ZVJl Y29yZEFycmF5KHR5cGUpOwoKICAgICAgICB0eXBlTWFwLmZpbmRBbGxDYWNo ZSA9IGFycmF5OwogICAgICAgIHJldHVybiBhcnJheTsKICAgICAgfSwKCgog ICAgICAvKioKICAgICAgICBUaGlzIG1ldGhvZCB1bmxvYWRzIGFsbCBvZiB0 aGUga25vd24gcmVjb3JkcyBmb3IgYSBnaXZlbiB0eXBlLgoKICAgICAgICBg YGBqYXZhc2NyaXB0CiAgICAgICAgc3RvcmUudW5sb2FkQWxsKEFwcC5Qb3N0 KTsKICAgICAgICBgYGAKCiAgICAgICAgQG1ldGhvZCB1bmxvYWRBbGwKICAg ICAgICBAcGFyYW0ge1N0cmluZyBvciBzdWJjbGFzcyBvZiBEUy5Nb2RlbH0g dHlwZQogICAgICAqLwogICAgICB1bmxvYWRBbGw6IGZ1bmN0aW9uKHR5cGUp IHsKICAgICAgICB2YXIgbW9kZWxUeXBlID0gdGhpcy5tb2RlbEZvcih0eXBl KTsKICAgICAgICB2YXIgdHlwZU1hcCA9IHRoaXMudHlwZU1hcEZvcihtb2Rl bFR5cGUpOwogICAgICAgIHZhciByZWNvcmRzID0gdHlwZU1hcC5yZWNvcmRz LnNsaWNlKCk7CiAgICAgICAgdmFyIHJlY29yZDsKCiAgICAgICAgZm9yICh2 YXIgaSA9IDA7IGkgPCByZWNvcmRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAg ICByZWNvcmQgPSByZWNvcmRzW2ldOwogICAgICAgICAgcmVjb3JkLnVubG9h ZFJlY29yZCgpOwogICAgICAgICAgcmVjb3JkLmRlc3Ryb3koKTsgLy8gbWF5 YmUgd2l0aGluIHVubG9hZFJlY29yZAogICAgICAgIH0KCiAgICAgICAgdHlw ZU1hcC5maW5kQWxsQ2FjaGUgPSBudWxsOwogICAgICB9LAoKICAgICAgLyoq CiAgICAgICAgVGFrZXMgYSB0eXBlIGFuZCBmaWx0ZXIgZnVuY3Rpb24sIGFu ZCByZXR1cm5zIGEgbGl2ZSBSZWNvcmRBcnJheSB0aGF0CiAgICAgICAgcmVt YWlucyB1cCB0byBkYXRlIGFzIG5ldyByZWNvcmRzIGFyZSBsb2FkZWQgaW50 byB0aGUgc3RvcmUgb3IgY3JlYXRlZAogICAgICAgIGxvY2FsbHkuCgogICAg ICAgIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0YWtlcyBhIG1hdGVyaWFsaXpl ZCByZWNvcmQsIGFuZCByZXR1cm5zIHRydWUKICAgICAgICBpZiB0aGUgcmVj b3JkIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgZmlsdGVyIGFuZCBmYWxz ZSBpZiBpdCBzaG91bGQKICAgICAgICBub3QuCgogICAgICAgIFRoZSBmaWx0 ZXIgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2Ugb24gYWxsIHJlY29yZHMgZm9y IHRoZSB0eXBlIHdoZW4KICAgICAgICBpdCBpcyBjcmVhdGVkLCBhbmQgdGhl biBvbmNlIG9uIGVhY2ggbmV3bHkgbG9hZGVkIG9yIGNyZWF0ZWQgcmVjb3Jk LgoKICAgICAgICBJZiBhbnkgb2YgYSByZWNvcmQncyBwcm9wZXJ0aWVzIGNo YW5nZSwgb3IgaWYgaXQgY2hhbmdlcyBzdGF0ZSwgdGhlCiAgICAgICAgZmls dGVyIGZ1bmN0aW9uIHdpbGwgYmUgaW52b2tlZCBhZ2FpbiB0byBkZXRlcm1p bmUgd2hldGhlciBpdCBzaG91bGQKICAgICAgICBzdGlsbCBiZSBpbiB0aGUg YXJyYXkuCgogICAgICAgIE9wdGlvbmFsbHkgeW91IGNhbiBwYXNzIGEgcXVl cnkgd2hpY2ggd2lsbCBiZSB0cmlnZ2VyZWQgYXQgZmlyc3QuIFRoZQogICAg ICAgIHJlc3VsdHMgcmV0dXJuZWQgYnkgdGhlIHNlcnZlciBjb3VsZCB0aGVu IGFwcGVhciBpbiB0aGUgZmlsdGVyIGlmIHRoZXkKICAgICAgICBtYXRjaCB0 aGUgZmlsdGVyIGZ1bmN0aW9uLgoKICAgICAgICBFeGFtcGxlCgogICAgICAg IGBgYGphdmFzY3JpcHQKICAgICAgICBzdG9yZS5maWx0ZXIoQXBwLlBvc3Qs IHt1bnJlYWQ6IHRydWV9LCBmdW5jdGlvbihwb3N0KSB7CiAgICAgICAgICBy ZXR1cm4gcG9zdC5nZXQoJ3VucmVhZCcpOwogICAgICAgIH0pLnRoZW4oZnVu Y3Rpb24odW5yZWFkUG9zdHMpIHsKICAgICAgICAgIHVucmVhZFBvc3RzLmdl dCgnbGVuZ3RoJyk7IC8vIDUKICAgICAgICAgIHZhciB1bnJlYWRQb3N0ID0g dW5yZWFkUG9zdHMub2JqZWN0QXQoMCk7CiAgICAgICAgICB1bnJlYWRQb3N0 LnNldCgndW5yZWFkJywgZmFsc2UpOwogICAgICAgICAgdW5yZWFkUG9zdHMu Z2V0KCdsZW5ndGgnKTsgLy8gNAogICAgICAgIH0pOwogICAgICAgIGBgYAoK ICAgICAgICBAbWV0aG9kIGZpbHRlcgogICAgICAgIEBwYXJhbSB7U3RyaW5n IG9yIHN1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCiAgICAgICAgQHBhcmFt IHtPYmplY3R9IHF1ZXJ5IG9wdGlvbmFsIHF1ZXJ5CiAgICAgICAgQHBhcmFt IHtGdW5jdGlvbn0gZmlsdGVyCiAgICAgICAgQHJldHVybiB7RFMuUHJvbWlz ZUFycmF5fQogICAgICAqLwogICAgICBmaWx0ZXI6IGZ1bmN0aW9uKHR5cGUs IHF1ZXJ5LCBmaWx0ZXIpIHsKICAgICAgICB2YXIgcHJvbWlzZTsKCiAgICAg ICAgLy8gYWxsb3cgYW4gb3B0aW9uYWwgc2VydmVyIHF1ZXJ5CiAgICAgICAg aWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHsKICAgICAgICAgIHByb21p c2UgPSB0aGlzLmZpbmRRdWVyeSh0eXBlLCBxdWVyeSk7CiAgICAgICAgfSBl bHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7CiAgICAgICAgICBm aWx0ZXIgPSBxdWVyeTsKICAgICAgICB9CgogICAgICAgIHR5cGUgPSB0aGlz Lm1vZGVsRm9yKHR5cGUpOwoKICAgICAgICB2YXIgYXJyYXkgPSB0aGlzLnJl Y29yZEFycmF5TWFuYWdlcgogICAgICAgICAgLmNyZWF0ZUZpbHRlcmVkUmVj b3JkQXJyYXkodHlwZSwgZmlsdGVyKTsKICAgICAgICBwcm9taXNlID0gcHJv bWlzZSB8fCBQcm9taXNlLmNhc3QoYXJyYXkpOwoKICAgICAgICByZXR1cm4g cHJvbWlzZUFycmF5KHByb21pc2UudGhlbihmdW5jdGlvbigpIHsKICAgICAg ICAgIHJldHVybiBhcnJheTsKICAgICAgICB9LCBudWxsLCAiRFM6IFN0b3Jl I2ZpbHRlciBvZiAiICsgdHlwZSkpOwogICAgICB9LAoKICAgICAgLyoqCiAg ICAgICAgVGhpcyBtZXRob2QgcmV0dXJucyBpZiBhIGNlcnRhaW4gcmVjb3Jk IGlzIGFscmVhZHkgbG9hZGVkCiAgICAgICAgaW4gdGhlIHN0b3JlLiBVc2Ug dGhpcyBmdW5jdGlvbiB0byBrbm93IGJlZm9yZWhhbmQgaWYgYSBmaW5kKCkK ICAgICAgICB3aWxsIHJlc3VsdCBpbiBhIHJlcXVlc3Qgb3IgdGhhdCBpdCB3 aWxsIGJlIGEgY2FjaGUgaGl0LgoKICAgICAgICAgRXhhbXBsZQoKICAgICAg ICBgYGBqYXZhc2NyaXB0CiAgICAgICAgc3RvcmUucmVjb3JkSXNMb2FkZWQo QXBwLlBvc3QsIDEpOyAvLyBmYWxzZQogICAgICAgIHN0b3JlLmZpbmQoQXBw LlBvc3QsIDEpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgICBzdG9yZS5y ZWNvcmRJc0xvYWRlZChBcHAuUG9zdCwgMSk7IC8vIHRydWUKICAgICAgICB9 KTsKICAgICAgICBgYGAKCiAgICAgICAgQG1ldGhvZCByZWNvcmRJc0xvYWRl ZAogICAgICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERTLk1v ZGVsfSB0eXBlCiAgICAgICAgQHBhcmFtIHtzdHJpbmd9IGlkCiAgICAgICAg QHJldHVybiB7Ym9vbGVhbn0KICAgICAgKi8KICAgICAgcmVjb3JkSXNMb2Fk ZWQ6IGZ1bmN0aW9uKHR5cGUsIGlkKSB7CiAgICAgICAgaWYgKCF0aGlzLmhh c1JlY29yZEZvcklkKHR5cGUsIGlkKSkgeyByZXR1cm4gZmFsc2U7IH0KICAg ICAgICByZXR1cm4gIWdldCh0aGlzLnJlY29yZEZvcklkKHR5cGUsIGlkKSwg J2lzRW1wdHknKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgIFRoaXMg bWV0aG9kIHJldHVybnMgdGhlIG1ldGFkYXRhIGZvciBhIHNwZWNpZmljIHR5 cGUuCgogICAgICAgIEBtZXRob2QgbWV0YWRhdGFGb3IKICAgICAgICBAcGFy YW0ge1N0cmluZyBvciBzdWJjbGFzcyBvZiBEUy5Nb2RlbH0gdHlwZQogICAg ICAgIEByZXR1cm4ge29iamVjdH0KICAgICAgKi8KICAgICAgbWV0YWRhdGFG b3I6IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICB0eXBlID0gdGhpcy5tb2Rl bEZvcih0eXBlKTsKICAgICAgICByZXR1cm4gdGhpcy50eXBlTWFwRm9yKHR5 cGUpLm1ldGFkYXRhOwogICAgICB9LAoKICAgICAgLy8gLi4uLi4uLi4uLi4u CiAgICAgIC8vIC4gVVBEQVRJTkcgLgogICAgICAvLyAuLi4uLi4uLi4uLi4K CiAgICAgIC8qKgogICAgICAgIElmIHRoZSBhZGFwdGVyIHVwZGF0ZXMgYXR0 cmlidXRlcyBvciBhY2tub3dsZWRnZXMgY3JlYXRpb24KICAgICAgICBvciBk ZWxldGlvbiwgdGhlIHJlY29yZCB3aWxsIG5vdGlmeSB0aGUgc3RvcmUgdG8g dXBkYXRlIGl0cwogICAgICAgIG1lbWJlcnNoaXAgaW4gYW55IGZpbHRlcnMu CiAgICAgICAgVG8gYXZvaWQgdGhyYXNoaW5nLCB0aGlzIG1ldGhvZCBpcyBp bnZva2VkIG9ubHkgb25jZSBwZXIKCiAgICAgICAgcnVuIGxvb3AgcGVyIHJl Y29yZC4KCiAgICAgICAgQG1ldGhvZCBkYXRhV2FzVXBkYXRlZAogICAgICAg IEBwcml2YXRlCiAgICAgICAgQHBhcmFtIHtDbGFzc30gdHlwZQogICAgICAg IEBwYXJhbSB7RFMuTW9kZWx9IHJlY29yZAogICAgICAqLwogICAgICBkYXRh V2FzVXBkYXRlZDogZnVuY3Rpb24odHlwZSwgcmVjb3JkKSB7CiAgICAgICAg dGhpcy5yZWNvcmRBcnJheU1hbmFnZXIucmVjb3JkRGlkQ2hhbmdlKHJlY29y ZCk7CiAgICAgIH0sCgogICAgICAvLyAuLi4uLi4uLi4uLi4uLgogICAgICAv LyAuIFBFUlNJU1RJTkcgLgogICAgICAvLyAuLi4uLi4uLi4uLi4uLgoKICAg ICAgLyoqCiAgICAgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IGByZWNv cmQuc2F2ZWAsIGFuZCBnZXRzIHBhc3NlZCBhCiAgICAgICAgcmVzb2x2ZXIg Zm9yIHRoZSBwcm9taXNlIHRoYXQgYHJlY29yZC5zYXZlYCByZXR1cm5zLgoK ICAgICAgICBJdCBzY2hlZHVsZXMgc2F2aW5nIHRvIGhhcHBlbiBhdCB0aGUg ZW5kIG9mIHRoZSBydW4gbG9vcC4KCiAgICAgICAgQG1ldGhvZCBzY2hlZHVs ZVNhdmUKICAgICAgICBAcHJpdmF0ZQogICAgICAgIEBwYXJhbSB7RFMuTW9k ZWx9IHJlY29yZAogICAgICAgIEBwYXJhbSB7UmVzb2x2ZXJ9IHJlc29sdmVy CiAgICAgICovCiAgICAgIHNjaGVkdWxlU2F2ZTogZnVuY3Rpb24ocmVjb3Jk LCByZXNvbHZlcikgewogICAgICAgIHJlY29yZC5hZGFwdGVyV2lsbENvbW1p dCgpOwogICAgICAgIHRoaXMuX3BlbmRpbmdTYXZlLnB1c2goW3JlY29yZCwg cmVzb2x2ZXJdKTsKICAgICAgICBvbmNlKHRoaXMsICdmbHVzaFBlbmRpbmdT YXZlJyk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICBUaGlzIG1ldGhv ZCBpcyBjYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgcnVuIGxvb3AsIGFuZAog ICAgICAgIGZsdXNoZXMgYW55IHJlY29yZHMgcGFzc2VkIGludG8gYHNjaGVk dWxlU2F2ZWAKCiAgICAgICAgQG1ldGhvZCBmbHVzaFBlbmRpbmdTYXZlCiAg ICAgICAgQHByaXZhdGUKICAgICAgKi8KICAgICAgZmx1c2hQZW5kaW5nU2F2 ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHBlbmRpbmcgPSB0aGlzLl9w ZW5kaW5nU2F2ZS5zbGljZSgpOwogICAgICAgIHRoaXMuX3BlbmRpbmdTYXZl ID0gW107CgogICAgICAgIGZvckVhY2gocGVuZGluZywgZnVuY3Rpb24odHVw bGUpIHsKICAgICAgICAgIHZhciByZWNvcmQgPSB0dXBsZVswXSwgcmVzb2x2 ZXIgPSB0dXBsZVsxXSwKICAgICAgICAgICAgICBhZGFwdGVyID0gdGhpcy5h ZGFwdGVyRm9yKHJlY29yZC5jb25zdHJ1Y3RvciksCiAgICAgICAgICAgICAg b3BlcmF0aW9uOwoKICAgICAgICAgIGlmIChnZXQocmVjb3JkLCAnaXNOZXcn KSkgewogICAgICAgICAgICBvcGVyYXRpb24gPSAnY3JlYXRlUmVjb3JkJzsK ICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0KHJlY29yZCwgJ2lzRGVsZXRlZCcp KSB7CiAgICAgICAgICAgIG9wZXJhdGlvbiA9ICdkZWxldGVSZWNvcmQnOwog ICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgb3BlcmF0aW9uID0gJ3Vw ZGF0ZVJlY29yZCc7CiAgICAgICAgICB9CgogICAgICAgICAgcmVzb2x2ZXIu cmVzb2x2ZShfY29tbWl0KGFkYXB0ZXIsIHRoaXMsIG9wZXJhdGlvbiwgcmVj b3JkKSk7CiAgICAgICAgfSwgdGhpcyk7CiAgICAgIH0sCgogICAgICAvKioK ICAgICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25jZSB0aGUgcHJvbWlz ZSByZXR1cm5lZCBieSBhbgogICAgICAgIGFkYXB0ZXIncyBgY3JlYXRlUmVj b3JkYCwgYHVwZGF0ZVJlY29yZGAgb3IgYGRlbGV0ZVJlY29yZGAKICAgICAg ICBpcyByZXNvbHZlZC4KCiAgICAgICAgSWYgdGhlIGRhdGEgcHJvdmlkZXMg YSBzZXJ2ZXItZ2VuZXJhdGVkIElELCBpdCB3aWxsCiAgICAgICAgdXBkYXRl IHRoZSByZWNvcmQgYW5kIHRoZSBzdG9yZSdzIGluZGV4ZXMuCgogICAgICAg IEBtZXRob2QgZGlkU2F2ZVJlY29yZAogICAgICAgIEBwcml2YXRlCiAgICAg ICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkIHRoZSBpbi1mbGlnaHQgcmVj b3JkCiAgICAgICAgQHBhcmFtIHtPYmplY3R9IGRhdGEgb3B0aW9uYWwgZGF0 YSAoc2VlIGFib3ZlKQogICAgICAqLwogICAgICBkaWRTYXZlUmVjb3JkOiBm dW5jdGlvbihyZWNvcmQsIGRhdGEpIHsKICAgICAgICBpZiAoZGF0YSkgewog ICAgICAgICAgLy8gbm9ybWFsaXplIHJlbGF0aW9uc2hpcCBJRHMgaW50byBy ZWNvcmRzCiAgICAgICAgICBkYXRhID0gbm9ybWFsaXplUmVsYXRpb25zaGlw cyh0aGlzLCByZWNvcmQuY29uc3RydWN0b3IsIGRhdGEsIHJlY29yZCk7Cgog ICAgICAgICAgdGhpcy51cGRhdGVJZChyZWNvcmQsIGRhdGEpOwogICAgICAg IH0KCiAgICAgICAgcmVjb3JkLmFkYXB0ZXJEaWRDb21taXQoZGF0YSk7CiAg ICAgIH0sCgogICAgICAvKioKICAgICAgICBUaGlzIG1ldGhvZCBpcyBjYWxs ZWQgb25jZSB0aGUgcHJvbWlzZSByZXR1cm5lZCBieSBhbgogICAgICAgIGFk YXB0ZXIncyBgY3JlYXRlUmVjb3JkYCwgYHVwZGF0ZVJlY29yZGAgb3IgYGRl bGV0ZVJlY29yZGAKICAgICAgICBpcyByZWplY3RlZCB3aXRoIGEgYERTLklu dmFsaWRFcnJvcmAuCgogICAgICAgIEBtZXRob2QgcmVjb3JkV2FzSW52YWxp ZAogICAgICAgIEBwcml2YXRlCiAgICAgICAgQHBhcmFtIHtEUy5Nb2RlbH0g cmVjb3JkCiAgICAgICAgQHBhcmFtIHtPYmplY3R9IGVycm9ycwogICAgICAq LwogICAgICByZWNvcmRXYXNJbnZhbGlkOiBmdW5jdGlvbihyZWNvcmQsIGVy cm9ycykgewogICAgICAgIHJlY29yZC5hZGFwdGVyRGlkSW52YWxpZGF0ZShl cnJvcnMpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAgVGhpcyBtZXRo b2QgaXMgY2FsbGVkIG9uY2UgdGhlIHByb21pc2UgcmV0dXJuZWQgYnkgYW4K ICAgICAgICBhZGFwdGVyJ3MgYGNyZWF0ZVJlY29yZGAsIGB1cGRhdGVSZWNv cmRgIG9yIGBkZWxldGVSZWNvcmRgCiAgICAgICAgaXMgcmVqZWN0ZWQgKHdp dGggYW55dGhpbmcgb3RoZXIgdGhhbiBhIGBEUy5JbnZhbGlkRXJyb3JgKS4K CiAgICAgICAgQG1ldGhvZCByZWNvcmRXYXNFcnJvcgogICAgICAgIEBwcml2 YXRlCiAgICAgICAgQHBhcmFtIHtEUy5Nb2RlbH0gcmVjb3JkCiAgICAgICov CiAgICAgIHJlY29yZFdhc0Vycm9yOiBmdW5jdGlvbihyZWNvcmQpIHsKICAg ICAgICByZWNvcmQuYWRhcHRlckRpZEVycm9yKCk7CiAgICAgIH0sCgogICAg ICAvKioKICAgICAgICBXaGVuIGFuIGFkYXB0ZXIncyBgY3JlYXRlUmVjb3Jk YCwgYHVwZGF0ZVJlY29yZGAgb3IgYGRlbGV0ZVJlY29yZGAKICAgICAgICBy ZXNvbHZlcyB3aXRoIGRhdGEsIHRoaXMgbWV0aG9kIGV4dHJhY3RzIHRoZSBJ RCBmcm9tIHRoZSBzdXBwbGllZAogICAgICAgIGRhdGEuCgogICAgICAgIEBt ZXRob2QgdXBkYXRlSWQKICAgICAgICBAcHJpdmF0ZQogICAgICAgIEBwYXJh bSB7RFMuTW9kZWx9IHJlY29yZAogICAgICAgIEBwYXJhbSB7T2JqZWN0fSBk YXRhCiAgICAgICovCiAgICAgIHVwZGF0ZUlkOiBmdW5jdGlvbihyZWNvcmQs IGRhdGEpIHsKICAgICAgICB2YXIgb2xkSWQgPSBnZXQocmVjb3JkLCAnaWQn KSwKICAgICAgICAgICAgaWQgPSBjb2VyY2VJZChkYXRhLmlkKTsKCiAgICAg ICAgRW1iZXIuYXNzZXJ0KCJBbiBhZGFwdGVyIGNhbm5vdCBhc3NpZ24gYSBu ZXcgaWQgdG8gYSByZWNvcmQgdGhhdCBhbHJlYWR5IGhhcyBhbiBpZC4gIiAr IHJlY29yZCArICIgaGFkIGlkOiAiICsgb2xkSWQgKyAiIGFuZCB5b3UgdHJp ZWQgdG8gdXBkYXRlIGl0IHdpdGggIiArIGlkICsgIi4gVGhpcyBsaWtlbHkg aGFwcGVuZWQgYmVjYXVzZSB5b3VyIHNlcnZlciByZXR1cm5lZCBkYXRhIGlu IHJlc3BvbnNlIHRvIGEgZmluZCBvciB1cGRhdGUgdGhhdCBoYWQgYSBkaWZm ZXJlbnQgaWQgdGhhbiB0aGUgb25lIHlvdSBzZW50LiIsIG9sZElkID09PSBu dWxsIHx8IGlkID09PSBvbGRJZCk7CgogICAgICAgIHRoaXMudHlwZU1hcEZv cihyZWNvcmQuY29uc3RydWN0b3IpLmlkVG9SZWNvcmRbaWRdID0gcmVjb3Jk OwoKICAgICAgICBzZXQocmVjb3JkLCAnaWQnLCBpZCk7CiAgICAgIH0sCgog ICAgICAvKioKICAgICAgICBSZXR1cm5zIGEgbWFwIG9mIElEcyB0byBjbGll bnQgSURzIGZvciBhIGdpdmVuIHR5cGUuCgogICAgICAgIEBtZXRob2QgdHlw ZU1hcEZvcgogICAgICAgIEBwcml2YXRlCiAgICAgICAgQHBhcmFtIHR5cGUK ICAgICAgICBAcmV0dXJuIHtPYmplY3R9IHR5cGVNYXAKICAgICAgKi8KICAg ICAgdHlwZU1hcEZvcjogZnVuY3Rpb24odHlwZSkgewogICAgICAgIHZhciB0 eXBlTWFwcyA9IGdldCh0aGlzLCAndHlwZU1hcHMnKSwKICAgICAgICAgICAg Z3VpZCA9IEVtYmVyLmd1aWRGb3IodHlwZSksCiAgICAgICAgICAgIHR5cGVN YXA7CgogICAgICAgIHR5cGVNYXAgPSB0eXBlTWFwc1tndWlkXTsKCiAgICAg ICAgaWYgKHR5cGVNYXApIHsgcmV0dXJuIHR5cGVNYXA7IH0KCiAgICAgICAg dHlwZU1hcCA9IHsKICAgICAgICAgIGlkVG9SZWNvcmQ6IHt9LAogICAgICAg ICAgcmVjb3JkczogW10sCiAgICAgICAgICBtZXRhZGF0YToge30sCiAgICAg ICAgICB0eXBlOiB0eXBlCiAgICAgICAgfTsKCiAgICAgICAgdHlwZU1hcHNb Z3VpZF0gPSB0eXBlTWFwOwoKICAgICAgICByZXR1cm4gdHlwZU1hcDsKICAg ICAgfSwKCiAgICAgIC8vIC4uLi4uLi4uLi4uLi4uLi4KICAgICAgLy8gLiBM T0FESU5HIERBVEEgLgogICAgICAvLyAuLi4uLi4uLi4uLi4uLi4uCgogICAg ICAvKioKICAgICAgICBUaGlzIGludGVybmFsIG1ldGhvZCBpcyB1c2VkIGJ5 IGBwdXNoYC4KCiAgICAgICAgQG1ldGhvZCBfbG9hZAogICAgICAgIEBwcml2 YXRlCiAgICAgICAgQHBhcmFtIHtTdHJpbmcgb3Igc3ViY2xhc3Mgb2YgRFMu TW9kZWx9IHR5cGUKICAgICAgICBAcGFyYW0ge09iamVjdH0gZGF0YQogICAg ICAgIEBwYXJhbSB7Qm9vbGVhbn0gcGFydGlhbCB0aGUgZGF0YSBzaG91bGQg YmUgbWVyZ2VkIGludG8KICAgICAgICAgIHRoZSBleGlzdGluZyBkYXRhLCBu b3QgcmVwbGFjZSBpdC4KICAgICAgKi8KICAgICAgX2xvYWQ6IGZ1bmN0aW9u KHR5cGUsIGRhdGEsIHBhcnRpYWwpIHsKICAgICAgICB2YXIgaWQgPSBjb2Vy Y2VJZChkYXRhLmlkKSwKICAgICAgICAgICAgcmVjb3JkID0gdGhpcy5yZWNv cmRGb3JJZCh0eXBlLCBpZCk7CgogICAgICAgIHJlY29yZC5zZXR1cERhdGEo ZGF0YSwgcGFydGlhbCk7CiAgICAgICAgdGhpcy5yZWNvcmRBcnJheU1hbmFn ZXIucmVjb3JkRGlkQ2hhbmdlKHJlY29yZCk7CgogICAgICAgIHJldHVybiBy ZWNvcmQ7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICBSZXR1cm5zIGEg bW9kZWwgY2xhc3MgZm9yIGEgcGFydGljdWxhciBrZXkuIFVzZWQgYnkKICAg ICAgICBtZXRob2RzIHRoYXQgdGFrZSBhIHR5cGUga2V5IChsaWtlIGBmaW5k YCwgYGNyZWF0ZVJlY29yZGAsCiAgICAgICAgZXRjLikKCiAgICAgICAgQG1l dGhvZCBtb2RlbEZvcgogICAgICAgIEBwYXJhbSB7U3RyaW5nIG9yIHN1YmNs YXNzIG9mIERTLk1vZGVsfSBrZXkKICAgICAgICBAcmV0dXJucyB7c3ViY2xh c3Mgb2YgRFMuTW9kZWx9CiAgICAgICovCiAgICAgIG1vZGVsRm9yOiBmdW5j dGlvbihrZXkpIHsKICAgICAgICB2YXIgZmFjdG9yeTsKCgogICAgICAgIGlm ICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykgewogICAgICAgICAgdmFyIG5v cm1hbGl6ZWRLZXkgPSB0aGlzLmNvbnRhaW5lci5ub3JtYWxpemUoJ21vZGVs OicgKyBrZXkpOwoKICAgICAgICAgIGZhY3RvcnkgPSB0aGlzLmNvbnRhaW5l ci5sb29rdXBGYWN0b3J5KG5vcm1hbGl6ZWRLZXkpOwogICAgICAgICAgaWYg KCFmYWN0b3J5KSB7IHRocm93IG5ldyBFbWJlci5FcnJvcigiTm8gbW9kZWwg d2FzIGZvdW5kIGZvciAnIiArIGtleSArICInIik7IH0KICAgICAgICAgIGZh Y3RvcnkudHlwZUtleSA9IG5vcm1hbGl6ZWRLZXkuc3BsaXQoJzonLCAyKVsx XTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gQSBmYWN0b3J5IGFs cmVhZHkgc3VwcGxpZWQuCiAgICAgICAgICBmYWN0b3J5ID0ga2V5OwogICAg ICAgIH0KCiAgICAgICAgZmFjdG9yeS5zdG9yZSA9IHRoaXM7CiAgICAgICAg cmV0dXJuIGZhY3Rvcnk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICBQ dXNoIHNvbWUgZGF0YSBmb3IgYSBnaXZlbiB0eXBlIGludG8gdGhlIHN0b3Jl LgoKICAgICAgICBUaGlzIG1ldGhvZCBleHBlY3RzIG5vcm1hbGl6ZWQgZGF0 YToKCiAgICAgICAgKiBUaGUgSUQgaXMgYSBrZXkgbmFtZWQgYGlkYCAoYW4g SUQgaXMgbWFuZGF0b3J5KQogICAgICAgICogVGhlIG5hbWVzIG9mIGF0dHJp YnV0ZXMgYXJlIHRoZSBvbmVzIHlvdSB1c2VkIGluCiAgICAgICAgICB5b3Vy IG1vZGVsJ3MgYERTLmF0dHJgcy4KICAgICAgICAqIFlvdXIgcmVsYXRpb25z aGlwcyBtdXN0IGJlOgogICAgICAgICAgKiByZXByZXNlbnRlZCBhcyBJRHMg b3IgQXJyYXlzIG9mIElEcwogICAgICAgICAgKiByZXByZXNlbnRlZCBhcyBt b2RlbCBpbnN0YW5jZXMKICAgICAgICAgICogcmVwcmVzZW50ZWQgYXMgVVJM cywgdW5kZXIgdGhlIGBsaW5rc2Aga2V5CgogICAgICAgIEZvciB0aGlzIG1v ZGVsOgoKICAgICAgICBgYGBqcwogICAgICAgIEFwcC5QZXJzb24gPSBEUy5N b2RlbC5leHRlbmQoewogICAgICAgICAgZmlyc3ROYW1lOiBEUy5hdHRyKCks CiAgICAgICAgICBsYXN0TmFtZTogRFMuYXR0cigpLAoKICAgICAgICAgIGNo aWxkcmVuOiBEUy5oYXNNYW55KCdwZXJzb24nKQogICAgICAgIH0pOwogICAg ICAgIGBgYAoKICAgICAgICBUbyByZXByZXNlbnQgdGhlIGNoaWxkcmVuIGFz IElEczoKCiAgICAgICAgYGBganMKICAgICAgICB7CiAgICAgICAgICBpZDog MSwKICAgICAgICAgIGZpcnN0TmFtZTogIlRvbSIsCiAgICAgICAgICBsYXN0 TmFtZTogIkRhbGUiLAogICAgICAgICAgY2hpbGRyZW46IFsxLCAyLCAzXQog ICAgICAgIH0KICAgICAgICBgYGAKCiAgICAgICAgVG8gcmVwcmVzZW50IHRo ZSBjaGlsZHJlbiByZWxhdGlvbnNoaXAgYXMgYSBVUkw6CgogICAgICAgIGBg YGpzCiAgICAgICAgewogICAgICAgICAgaWQ6IDEsCiAgICAgICAgICBmaXJz dE5hbWU6ICJUb20iLAogICAgICAgICAgbGFzdE5hbWU6ICJEYWxlIiwKICAg ICAgICAgIGxpbmtzOiB7CiAgICAgICAgICAgIGNoaWxkcmVuOiAiL3Blb3Bs ZS8xL2NoaWxkcmVuIgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBg YGAKCiAgICAgICAgSWYgeW91J3JlIHN0cmVhbWluZyBkYXRhIG9yIGltcGxl bWVudGluZyBhbiBhZGFwdGVyLAogICAgICAgIG1ha2Ugc3VyZSB0aGF0IHlv dSBoYXZlIGNvbnZlcnRlZCB0aGUgaW5jb21pbmcgZGF0YQogICAgICAgIGlu dG8gdGhpcyBmb3JtLgoKICAgICAgICBUaGlzIG1ldGhvZCBjYW4gYmUgdXNl ZCBib3RoIHRvIHB1c2ggaW4gYnJhbmQgbmV3CiAgICAgICAgcmVjb3Jkcywg YXMgd2VsbCBhcyB0byB1cGRhdGUgZXhpc3RpbmcgcmVjb3Jkcy4KCiAgICAg ICAgQG1ldGhvZCBwdXNoCiAgICAgICAgQHBhcmFtIHtTdHJpbmcgb3Igc3Vi Y2xhc3Mgb2YgRFMuTW9kZWx9IHR5cGUKICAgICAgICBAcGFyYW0ge09iamVj dH0gZGF0YQogICAgICAgIEByZXR1cm5zIHtEUy5Nb2RlbH0gdGhlIHJlY29y ZCB0aGF0IHdhcyBjcmVhdGVkIG9yCiAgICAgICAgICB1cGRhdGVkLgogICAg ICAqLwogICAgICBwdXNoOiBmdW5jdGlvbih0eXBlLCBkYXRhLCBfcGFydGlh bCkgewogICAgICAgIC8vIF9wYXJ0aWFsIGlzIGFuIGludGVybmFsIHBhcmFt IHVzZWQgYnkgYHVwZGF0ZWAuCiAgICAgICAgLy8gSWYgcGFzc2VkLCBpdCBt ZWFucyB0aGF0IHRoZSBkYXRhIHNob3VsZCBiZQogICAgICAgIC8vIG1lcmdl ZCBpbnRvIHRoZSBleGlzdGluZyBkYXRhLCBub3QgcmVwbGFjZSBpdC4KCiAg ICAgICAgRW1iZXIuYXNzZXJ0KCJZb3UgbXVzdCBpbmNsdWRlIGFuIGBpZGAg aW4gYSBoYXNoIHBhc3NlZCB0byBgcHVzaGAiLCBkYXRhLmlkICE9IG51bGwp OwoKICAgICAgICB0eXBlID0gdGhpcy5tb2RlbEZvcih0eXBlKTsKCiAgICAg ICAgLy8gbm9ybWFsaXplIHJlbGF0aW9uc2hpcCBJRHMgaW50byByZWNvcmRz CiAgICAgICAgZGF0YSA9IG5vcm1hbGl6ZVJlbGF0aW9uc2hpcHModGhpcywg dHlwZSwgZGF0YSk7CgogICAgICAgIHRoaXMuX2xvYWQodHlwZSwgZGF0YSwg X3BhcnRpYWwpOwoKICAgICAgICByZXR1cm4gdGhpcy5yZWNvcmRGb3JJZCh0 eXBlLCBkYXRhLmlkKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgIFB1 c2ggc29tZSByYXcgZGF0YSBpbnRvIHRoZSBzdG9yZS4KCiAgICAgICAgVGhl IGRhdGEgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGRlc2VyaWFsaXplZCB1c2lu ZyB0aGUKICAgICAgICBzZXJpYWxpemVyIGZvciB0aGUgYHR5cGVgIHBhcmFt LgoKICAgICAgICBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCBib3RoIHRvIHB1 c2ggaW4gYnJhbmQgbmV3CiAgICAgICAgcmVjb3JkcywgYXMgd2VsbCBhcyB0 byB1cGRhdGUgZXhpc3RpbmcgcmVjb3Jkcy4KCiAgICAgICAgWW91IGNhbiBw dXNoIGluIG1vcmUgdGhhbiBvbmUgdHlwZSBvZiBvYmplY3QgYXQgb25jZS4K ICAgICAgICBBbGwgb2JqZWN0cyBzaG91bGQgYmUgaW4gdGhlIGZvcm1hdCBl eHBlY3RlZCBieSB0aGUKICAgICAgICBzZXJpYWxpemVyLgoKICAgICAgICBg YGBqcwogICAgICAgIEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6ZXIgPSBEUy5B Y3RpdmVNb2RlbFNlcmlhbGl6ZXI7CgogICAgICAgIHZhciBwdXNoRGF0YSA9 IHsKICAgICAgICAgIHBvc3RzOiBbCiAgICAgICAgICAgIHtpZDogMSwgcG9z dF90aXRsZTogIkdyZWF0IHBvc3QiLCBjb21tZW50X2lkczogWzJdfQogICAg ICAgICAgXSwKICAgICAgICAgIGNvbW1lbnRzOiBbCiAgICAgICAgICAgIHtp ZDogMiwgY29tbWVudF9ib2R5OiAiSW5zaWdodGZ1bCBjb21tZW50In0KICAg ICAgICAgIF0KICAgICAgICB9CgogICAgICAgIHN0b3JlLnB1c2hQYXlsb2Fk KCdwb3N0JywgcHVzaERhdGEpOwogICAgICAgIGBgYAoKICAgICAgICBAbWV0 aG9kIHB1c2hQYXlsb2FkCiAgICAgICAgQHBhcmFtIHtTdHJpbmd9IHR5cGUK ICAgICAgICBAcGFyYW0ge09iamVjdH0gcGF5bG9hZAogICAgICAqLwogICAg ICBwdXNoUGF5bG9hZDogZnVuY3Rpb24gKHR5cGUsIHBheWxvYWQpIHsKICAg ICAgICB2YXIgc2VyaWFsaXplcjsKICAgICAgICBpZiAoIXBheWxvYWQpIHsK ICAgICAgICAgIHBheWxvYWQgPSB0eXBlOwogICAgICAgICAgc2VyaWFsaXpl ciA9IGRlZmF1bHRTZXJpYWxpemVyKHRoaXMuY29udGFpbmVyKTsKICAgICAg ICAgIEVtYmVyLmFzc2VydCgiWW91IGNhbm5vdCB1c2UgYHN0b3JlI3B1c2hQ YXlsb2FkYCB3aXRob3V0IGEgdHlwZSB1bmxlc3MgeW91ciBkZWZhdWx0IHNl cmlhbGl6ZXIgZGVmaW5lcyBgcHVzaFBheWxvYWRgIiwgc2VyaWFsaXplci5w dXNoUGF5bG9hZCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNlcmlh bGl6ZXIgPSB0aGlzLnNlcmlhbGl6ZXJGb3IodHlwZSk7CiAgICAgICAgfQog ICAgICAgIHNlcmlhbGl6ZXIucHVzaFBheWxvYWQodGhpcywgcGF5bG9hZCk7 CiAgICAgIH0sCgogICAgICB1cGRhdGU6IGZ1bmN0aW9uKHR5cGUsIGRhdGEp IHsKICAgICAgICBFbWJlci5hc3NlcnQoIllvdSBtdXN0IGluY2x1ZGUgYW4g YGlkYCBpbiBhIGhhc2ggcGFzc2VkIHRvIGB1cGRhdGVgIiwgZGF0YS5pZCAh PSBudWxsKTsKCiAgICAgICAgcmV0dXJuIHRoaXMucHVzaCh0eXBlLCBkYXRh LCB0cnVlKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgIElmIHlvdSBo YXZlIGFuIEFycmF5IG9mIG5vcm1hbGl6ZWQgZGF0YSB0byBwdXNoLAogICAg ICAgIHlvdSBjYW4gY2FsbCBgcHVzaE1hbnlgIHdpdGggdGhlIEFycmF5LCBh bmQgaXQgd2lsbAogICAgICAgIGNhbGwgYHB1c2hgIHJlcGVhdGVkbHkgZm9y IHlvdS4KCiAgICAgICAgQG1ldGhvZCBwdXNoTWFueQogICAgICAgIEBwYXJh bSB7U3RyaW5nIG9yIHN1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCiAgICAg ICAgQHBhcmFtIHtBcnJheX0gZGF0YXMKICAgICAgICBAcmV0dXJuIHtBcnJh eX0KICAgICAgKi8KICAgICAgcHVzaE1hbnk6IGZ1bmN0aW9uKHR5cGUsIGRh dGFzKSB7CiAgICAgICAgcmV0dXJuIG1hcChkYXRhcywgZnVuY3Rpb24oZGF0 YSkgewogICAgICAgICAgcmV0dXJuIHRoaXMucHVzaCh0eXBlLCBkYXRhKTsK ICAgICAgICB9LCB0aGlzKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAg IElmIHlvdSBoYXZlIHNvbWUgbWV0YWRhdGEgdG8gc2V0IGZvciBhIHR5cGUK ICAgICAgICB5b3UgY2FuIGNhbGwgYG1ldGFGb3JUeXBlYC4KCiAgICAgICAg QG1ldGhvZCBtZXRhRm9yVHlwZQogICAgICAgIEBwYXJhbSB7U3RyaW5nIG9y IHN1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBlCiAgICAgICAgQHBhcmFtIHtP YmplY3R9IG1ldGFkYXRhCiAgICAgICovCiAgICAgIG1ldGFGb3JUeXBlOiBm dW5jdGlvbih0eXBlLCBtZXRhZGF0YSkgewogICAgICAgIHR5cGUgPSB0aGlz Lm1vZGVsRm9yKHR5cGUpOwoKICAgICAgICBFbWJlci5tZXJnZSh0aGlzLnR5 cGVNYXBGb3IodHlwZSkubWV0YWRhdGEsIG1ldGFkYXRhKTsKICAgICAgfSwK CiAgICAgIC8qKgogICAgICAgIEJ1aWxkIGEgYnJhbmQgbmV3IHJlY29yZCBm b3IgYSBnaXZlbiB0eXBlLCBJRCwgYW5kCiAgICAgICAgaW5pdGlhbCBkYXRh LgoKICAgICAgICBAbWV0aG9kIGJ1aWxkUmVjb3JkCiAgICAgICAgQHByaXZh dGUKICAgICAgICBAcGFyYW0ge3N1YmNsYXNzIG9mIERTLk1vZGVsfSB0eXBl CiAgICAgICAgQHBhcmFtIHtTdHJpbmd9IGlkCiAgICAgICAgQHBhcmFtIHtP YmplY3R9IGRhdGEKICAgICAgICBAcmV0dXJucyB7RFMuTW9kZWx9IHJlY29y ZAogICAgICAqLwogICAgICBidWlsZFJlY29yZDogZnVuY3Rpb24odHlwZSwg aWQsIGRhdGEpIHsKICAgICAgICB2YXIgdHlwZU1hcCA9IHRoaXMudHlwZU1h cEZvcih0eXBlKSwKICAgICAgICAgICAgaWRUb1JlY29yZCA9IHR5cGVNYXAu aWRUb1JlY29yZDsKCiAgICAgICAgRW1iZXIuYXNzZXJ0KCdUaGUgaWQgJyAr IGlkICsgJyBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgd2l0aCBhbm90aGVyIHJl Y29yZCBvZiB0eXBlICcgKyB0eXBlLnRvU3RyaW5nKCkgKyAnLicsICFpZCB8 fCAhaWRUb1JlY29yZFtpZF0pOwogICAgICAgIEVtYmVyLmFzc2VydCgiYCIg KyBFbWJlci5pbnNwZWN0KHR5cGUpKyAiYCBkb2VzIG5vdCBhcHBlYXIgdG8g YmUgYW4gZW1iZXItZGF0YSBtb2RlbCIsICh0eXBlb2YgdHlwZS5fY3JlYXRl ID09PSAnZnVuY3Rpb24nKSApOwoKICAgICAgICAvLyBsb29rdXBGYWN0b3J5 IHNob3VsZCByZWFsbHkgcmV0dXJuIGFuIG9iamVjdCB0aGF0IGNyZWF0ZXMK ICAgICAgICAvLyBpbnN0YW5jZXMgd2l0aCB0aGUgaW5qZWN0aW9ucyBhcHBs aWVkCiAgICAgICAgdmFyIHJlY29yZCA9IHR5cGUuX2NyZWF0ZSh7CiAgICAg ICAgICBpZDogaWQsCiAgICAgICAgICBzdG9yZTogdGhpcywKICAgICAgICAg IGNvbnRhaW5lcjogdGhpcy5jb250YWluZXIKICAgICAgICB9KTsKCiAgICAg ICAgaWYgKGRhdGEpIHsKICAgICAgICAgIHJlY29yZC5zZXR1cERhdGEoZGF0 YSk7CiAgICAgICAgfQoKICAgICAgICAvLyBpZiB3ZSdyZSBjcmVhdGluZyBh biBpdGVtLCB0aGlzIHByb2Nlc3Mgd2lsbCBiZSBkb25lCiAgICAgICAgLy8g bGF0ZXIsIG9uY2UgdGhlIG9iamVjdCBoYXMgYmVlbiBwZXJzaXN0ZWQuCiAg ICAgICAgaWYgKGlkKSB7CiAgICAgICAgICBpZFRvUmVjb3JkW2lkXSA9IHJl Y29yZDsKICAgICAgICB9CgogICAgICAgIHR5cGVNYXAucmVjb3Jkcy5wdXNo KHJlY29yZCk7CgogICAgICAgIHJldHVybiByZWNvcmQ7CiAgICAgIH0sCgog ICAgICAvLyAuLi4uLi4uLi4uLi4uLi4KICAgICAgLy8gLiBERVNUUlVDVElP TiAuCiAgICAgIC8vIC4uLi4uLi4uLi4uLi4uLgoKICAgICAgLyoqCiAgICAg ICAgV2hlbiBhIHJlY29yZCBpcyBkZXN0cm95ZWQsIHRoaXMgdW4taW5kZXhl cyBpdCBhbmQKICAgICAgICByZW1vdmVzIGl0IGZyb20gYW55IHJlY29yZCBh cnJheXMgc28gaXQgY2FuIGJlIEdDZWQuCgogICAgICAgIEBtZXRob2QgZGVt YXRlcmlhbGl6ZVJlY29yZAogICAgICAgIEBwcml2YXRlCiAgICAgICAgQHBh cmFtIHtEUy5Nb2RlbH0gcmVjb3JkCiAgICAgICovCiAgICAgIGRlbWF0ZXJp YWxpemVSZWNvcmQ6IGZ1bmN0aW9uKHJlY29yZCkgewogICAgICAgIHZhciB0 eXBlID0gcmVjb3JkLmNvbnN0cnVjdG9yLAogICAgICAgICAgICB0eXBlTWFw ID0gdGhpcy50eXBlTWFwRm9yKHR5cGUpLAogICAgICAgICAgICBpZCA9IGdl dChyZWNvcmQsICdpZCcpOwoKICAgICAgICByZWNvcmQudXBkYXRlUmVjb3Jk QXJyYXlzKCk7CgogICAgICAgIGlmIChpZCkgewogICAgICAgICAgZGVsZXRl IHR5cGVNYXAuaWRUb1JlY29yZFtpZF07CiAgICAgICAgfQoKICAgICAgICB2 YXIgbG9jID0gaW5kZXhPZih0eXBlTWFwLnJlY29yZHMsIHJlY29yZCk7CiAg ICAgICAgdHlwZU1hcC5yZWNvcmRzLnNwbGljZShsb2MsIDEpOwogICAgICB9 LAoKICAgICAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCiAgICAgIC8v IC4gUkVMQVRJT05TSElQIENIQU5HRVMgLgogICAgICAvLyAuLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4KCiAgICAgIGFkZFJlbGF0aW9uc2hpcENoYW5nZUZv cjogZnVuY3Rpb24oY2hpbGRSZWNvcmQsIGNoaWxkS2V5LCBwYXJlbnRSZWNv cmQsIHBhcmVudEtleSwgY2hhbmdlKSB7CiAgICAgICAgdmFyIGNsaWVudElk ID0gY2hpbGRSZWNvcmQuY2xpZW50SWQsCiAgICAgICAgICAgIHBhcmVudENs aWVudElkID0gcGFyZW50UmVjb3JkID8gcGFyZW50UmVjb3JkIDogcGFyZW50 UmVjb3JkOwogICAgICAgIHZhciBrZXkgPSBjaGlsZEtleSArIHBhcmVudEtl eTsKICAgICAgICB2YXIgY2hhbmdlcyA9IHRoaXMuX3JlbGF0aW9uc2hpcENo YW5nZXM7CiAgICAgICAgaWYgKCEoY2xpZW50SWQgaW4gY2hhbmdlcykpIHsK ICAgICAgICAgIGNoYW5nZXNbY2xpZW50SWRdID0ge307CiAgICAgICAgfQog ICAgICAgIGlmICghKHBhcmVudENsaWVudElkIGluIGNoYW5nZXNbY2xpZW50 SWRdKSkgewogICAgICAgICAgY2hhbmdlc1tjbGllbnRJZF1bcGFyZW50Q2xp ZW50SWRdID0ge307CiAgICAgICAgfQogICAgICAgIGlmICghKGtleSBpbiBj aGFuZ2VzW2NsaWVudElkXVtwYXJlbnRDbGllbnRJZF0pKSB7CiAgICAgICAg ICBjaGFuZ2VzW2NsaWVudElkXVtwYXJlbnRDbGllbnRJZF1ba2V5XSA9IHt9 OwogICAgICAgIH0KICAgICAgICBjaGFuZ2VzW2NsaWVudElkXVtwYXJlbnRD bGllbnRJZF1ba2V5XVtjaGFuZ2UuY2hhbmdlVHlwZV0gPSBjaGFuZ2U7CiAg ICAgIH0sCgogICAgICByZW1vdmVSZWxhdGlvbnNoaXBDaGFuZ2VGb3I6IGZ1 bmN0aW9uKGNsaWVudFJlY29yZCwgY2hpbGRLZXksIHBhcmVudFJlY29yZCwg cGFyZW50S2V5LCB0eXBlKSB7CiAgICAgICAgdmFyIGNsaWVudElkID0gY2xp ZW50UmVjb3JkLmNsaWVudElkLAogICAgICAgICAgICBwYXJlbnRDbGllbnRJ ZCA9IHBhcmVudFJlY29yZCA/IHBhcmVudFJlY29yZC5jbGllbnRJZCA6IHBh cmVudFJlY29yZDsKICAgICAgICB2YXIgY2hhbmdlcyA9IHRoaXMuX3JlbGF0 aW9uc2hpcENoYW5nZXM7CiAgICAgICAgdmFyIGtleSA9IGNoaWxkS2V5ICsg cGFyZW50S2V5OwogICAgICAgIGlmICghKGNsaWVudElkIGluIGNoYW5nZXMp IHx8ICEocGFyZW50Q2xpZW50SWQgaW4gY2hhbmdlc1tjbGllbnRJZF0pIHx8 ICEoa2V5IGluIGNoYW5nZXNbY2xpZW50SWRdW3BhcmVudENsaWVudElkXSkp ewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBkZWxldGUg Y2hhbmdlc1tjbGllbnRJZF1bcGFyZW50Q2xpZW50SWRdW2tleV1bdHlwZV07 CiAgICAgIH0sCgogICAgICByZWxhdGlvbnNoaXBDaGFuZ2VQYWlyc0Zvcjog ZnVuY3Rpb24ocmVjb3JkKXsKICAgICAgICB2YXIgdG9SZXR1cm4gPSBbXTsK CiAgICAgICAgaWYoICFyZWNvcmQgKSB7IHJldHVybiB0b1JldHVybjsgfQoK ICAgICAgICAvL1RPRE8oSWdvcikgV2hhdCBhYm91dCB0aGUgb3RoZXIgc2lk ZQogICAgICAgIHZhciBjaGFuZ2VzT2JqZWN0ID0gdGhpcy5fcmVsYXRpb25z aGlwQ2hhbmdlc1tyZWNvcmQuY2xpZW50SWRdOwogICAgICAgIGZvciAodmFy IG9iaktleSBpbiBjaGFuZ2VzT2JqZWN0KXsKICAgICAgICAgIGlmKGNoYW5n ZXNPYmplY3QuaGFzT3duUHJvcGVydHkob2JqS2V5KSl7CiAgICAgICAgICAg IGZvciAodmFyIGNoYW5nZUtleSBpbiBjaGFuZ2VzT2JqZWN0W29iaktleV0p ewogICAgICAgICAgICAgIGlmKGNoYW5nZXNPYmplY3Rbb2JqS2V5XS5oYXNP d25Qcm9wZXJ0eShjaGFuZ2VLZXkpKXsKICAgICAgICAgICAgICAgIHRvUmV0 dXJuLnB1c2goY2hhbmdlc09iamVjdFtvYmpLZXldW2NoYW5nZUtleV0pOwog ICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAg ICAgIH0KICAgICAgICByZXR1cm4gdG9SZXR1cm47CiAgICAgIH0sCgogICAg ICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uCiAgICAgIC8vIC4gUEVSLVRZ UEUgQURBUFRFUlMKICAgICAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoK ICAgICAgLyoqCiAgICAgICAgUmV0dXJucyB0aGUgYWRhcHRlciBmb3IgYSBn aXZlbiB0eXBlLgoKICAgICAgICBAbWV0aG9kIGFkYXB0ZXJGb3IKICAgICAg ICBAcHJpdmF0ZQogICAgICAgIEBwYXJhbSB7c3ViY2xhc3Mgb2YgRFMuTW9k ZWx9IHR5cGUKICAgICAgICBAcmV0dXJucyBEUy5BZGFwdGVyCiAgICAgICov CiAgICAgIGFkYXB0ZXJGb3I6IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICB2 YXIgY29udGFpbmVyID0gdGhpcy5jb250YWluZXIsIGFkYXB0ZXI7CgogICAg ICAgIGlmIChjb250YWluZXIpIHsKICAgICAgICAgIGFkYXB0ZXIgPSBjb250 YWluZXIubG9va3VwKCdhZGFwdGVyOicgKyB0eXBlLnR5cGVLZXkpIHx8IGNv bnRhaW5lci5sb29rdXAoJ2FkYXB0ZXI6YXBwbGljYXRpb24nKTsKICAgICAg ICB9CgogICAgICAgIHJldHVybiBhZGFwdGVyIHx8IGdldCh0aGlzLCAnZGVm YXVsdEFkYXB0ZXInKTsKICAgICAgfSwKCiAgICAgIC8vIC4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLgogICAgICAvLyAuIFJFQ09SRCBDSEFOR0Ug Tk9USUZJQ0FUSU9OIC4KICAgICAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uCgogICAgICAvKioKICAgICAgICBSZXR1cm5zIGFuIGluc3Rh bmNlIG9mIHRoZSBzZXJpYWxpemVyIGZvciBhIGdpdmVuIHR5cGUuIEZvcgog ICAgICAgIGV4YW1wbGUsIGBzZXJpYWxpemVyRm9yKCdwZXJzb24nKWAgd2ls bCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YKICAgICAgICBgQXBwLlBlcnNvblNl cmlhbGl6ZXJgLgoKICAgICAgICBJZiBubyBgQXBwLlBlcnNvblNlcmlhbGl6 ZXJgIGlzIGZvdW5kLCB0aGlzIG1ldGhvZCB3aWxsIGxvb2sKICAgICAgICBm b3IgYW4gYEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6ZXJgICh0aGUgZGVmYXVs dCBzZXJpYWxpemVyIGZvcgogICAgICAgIHlvdXIgZW50aXJlIGFwcGxpY2F0 aW9uKS4KCiAgICAgICAgSWYgbm8gYEFwcC5BcHBsaWNhdGlvblNlcmlhbGl6 ZXJgIGlzIGZvdW5kLCBpdCB3aWxsIGZhbGwgYmFjawogICAgICAgIHRvIGFu IGluc3RhbmNlIG9mIGBEUy5KU09OU2VyaWFsaXplcmAuCgogICAgICAgIEBt ZXRob2Qgc2VyaWFsaXplckZvcgogICAgICAgIEBwcml2YXRlCiAgICAgICAg QHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHJlY29yZCB0byBzZXJpYWxpemUK ICAgICAgICBAcmV0dXJuIHtEUy5TZXJpYWxpemVyfQogICAgICAqLwogICAg ICBzZXJpYWxpemVyRm9yOiBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgdHlw ZSA9IHRoaXMubW9kZWxGb3IodHlwZSk7CiAgICAgICAgdmFyIGFkYXB0ZXIg PSB0aGlzLmFkYXB0ZXJGb3IodHlwZSk7CgogICAgICAgIHJldHVybiBzZXJp YWxpemVyRm9yKHRoaXMuY29udGFpbmVyLCB0eXBlLnR5cGVLZXksIGFkYXB0 ZXIgJiYgYWRhcHRlci5kZWZhdWx0U2VyaWFsaXplcik7CiAgICAgIH0sCgog ICAgICB3aWxsRGVzdHJveTogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIG1h cCA9IHRoaXMudHlwZU1hcHM7CiAgICAgICAgdmFyIGtleXMgPSBFbWJlci5r ZXlzKG1hcCk7CiAgICAgICAgdmFyIHN0b3JlID0gdGhpczsKICAgICAgICB2 YXIgdHlwZXMgPSBrZXlzLm1hcChieVR5cGUpOwoKICAgICAgICB0aGlzLnJl Y29yZEFycmF5TWFuYWdlci5kZXN0cm95KCk7CgogICAgICAgIHR5cGVzLmZv ckVhY2godGhpcy51bmxvYWRBbGwsIHRoaXMpOwoKICAgICAgICBmdW5jdGlv biBieVR5cGUoZW50cnkpIHsKICAgICAgICAgIHJldHVybiBtYXBbZW50cnld LnR5cGU7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKCiAgICBmdW5jdGlv biBub3JtYWxpemVSZWxhdGlvbnNoaXBzKHN0b3JlLCB0eXBlLCBkYXRhLCBy ZWNvcmQpIHsKICAgICAgdHlwZS5lYWNoUmVsYXRpb25zaGlwKGZ1bmN0aW9u KGtleSwgcmVsYXRpb25zaGlwKSB7CiAgICAgICAgLy8gQSBsaW5rICh1c3Vh bGx5IGEgVVJMKSB3YXMgYWxyZWFkeSBwcm92aWRlZCBpbgogICAgICAgIC8v IG5vcm1hbGl6ZWQgZm9ybQogICAgICAgIGlmIChkYXRhLmxpbmtzICYmIGRh dGEubGlua3Nba2V5XSkgewogICAgICAgICAgaWYgKHJlY29yZCAmJiByZWxh dGlvbnNoaXAub3B0aW9ucy5hc3luYykgeyByZWNvcmQuX3JlbGF0aW9uc2hp cHNba2V5XSA9IG51bGw7IH0KICAgICAgICAgIHJldHVybjsKICAgICAgICB9 CgogICAgICAgIHZhciBraW5kID0gcmVsYXRpb25zaGlwLmtpbmQsCiAgICAg ICAgICAgIHZhbHVlID0gZGF0YVtrZXldOwoKICAgICAgICBpZiAodmFsdWUg PT0gbnVsbCkgeyByZXR1cm47IH0KCiAgICAgICAgaWYgKGtpbmQgPT09ICdi ZWxvbmdzVG8nKSB7CiAgICAgICAgICBkZXNlcmlhbGl6ZVJlY29yZElkKHN0 b3JlLCBkYXRhLCBrZXksIHJlbGF0aW9uc2hpcCwgdmFsdWUpOwogICAgICAg IH0gZWxzZSBpZiAoa2luZCA9PT0gJ2hhc01hbnknKSB7CiAgICAgICAgICBk ZXNlcmlhbGl6ZVJlY29yZElkcyhzdG9yZSwgZGF0YSwga2V5LCByZWxhdGlv bnNoaXAsIHZhbHVlKTsKICAgICAgICAgIGFkZFVuc2F2ZWRSZWNvcmRzKHJl Y29yZCwga2V5LCB2YWx1ZSk7CiAgICAgICAgfQogICAgICB9KTsKCiAgICAg IHJldHVybiBkYXRhOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlc2VyaWFsaXpl UmVjb3JkSWQoc3RvcmUsIGRhdGEsIGtleSwgcmVsYXRpb25zaGlwLCBpZCkg ewogICAgICBpZiAoaXNOb25lKGlkKSB8fCBpZCBpbnN0YW5jZW9mIERTLk1v ZGVsKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICB2YXIgdHlw ZTsKCiAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdudW1iZXInIHx8IHR5cGVv ZiBpZCA9PT0gJ3N0cmluZycpIHsKICAgICAgICB0eXBlID0gdHlwZUZvcihy ZWxhdGlvbnNoaXAsIGtleSwgZGF0YSk7CiAgICAgICAgZGF0YVtrZXldID0g c3RvcmUucmVjb3JkRm9ySWQodHlwZSwgaWQpOwogICAgICB9IGVsc2UgaWYg KHR5cGVvZiBpZCA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBwb2x5bW9y cGhpYwogICAgICAgIGRhdGFba2V5XSA9IHN0b3JlLnJlY29yZEZvcklkKGlk LnR5cGUsIGlkLmlkKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHR5 cGVGb3IocmVsYXRpb25zaGlwLCBrZXksIGRhdGEpIHsKICAgICAgaWYgKHJl bGF0aW9uc2hpcC5vcHRpb25zLnBvbHltb3JwaGljKSB7CiAgICAgICAgcmV0 dXJuIGRhdGFba2V5ICsgIlR5cGUiXTsKICAgICAgfSBlbHNlIHsKICAgICAg ICByZXR1cm4gcmVsYXRpb25zaGlwLnR5cGU7CiAgICAgIH0KICAgIH0KCiAg ICBmdW5jdGlvbiBkZXNlcmlhbGl6ZVJlY29yZElkcyhzdG9yZSwgZGF0YSwg a2V5LCByZWxhdGlvbnNoaXAsIGlkcykgewogICAgICBmb3IgKHZhciBpPTAs IGw9aWRzLmxlbmd0aDsgaTxsOyBpKyspIHsKICAgICAgICBkZXNlcmlhbGl6 ZVJlY29yZElkKHN0b3JlLCBpZHMsIGksIHJlbGF0aW9uc2hpcCwgaWRzW2ld KTsKICAgICAgfQogICAgfQoKICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgdW5z YXZlZCByZWNvcmRzIHRoYXQgYXJlIGluIGEgaGFzTWFueSB0aGV5IHdvbid0 IGJlCiAgICAvLyBpbiB0aGUgcGF5bG9hZCwgc28gYWRkIHRoZW0gYmFjayBp biBtYW51YWxseS4KICAgIGZ1bmN0aW9uIGFkZFVuc2F2ZWRSZWNvcmRzKHJl Y29yZCwga2V5LCBkYXRhKSB7CiAgICAgIGlmKHJlY29yZCkgewogICAgICAg IGRhdGEucHVzaE9iamVjdHMocmVjb3JkLmdldChrZXkpLmZpbHRlckJ5KCdp c05ldycpKTsKICAgICAgfQogICAgfQoKICAgIC8vIERlbGVnYXRpb24gdG8g dGhlIGFkYXB0ZXIgYW5kIHByb21pc2UgbWFuYWdlbWVudAogICAgLyoqCiAg ICAgIEEgYFByb21pc2VBcnJheWAgaXMgYW4gb2JqZWN0IHRoYXQgYWN0cyBs aWtlIGJvdGggYW4gYEVtYmVyLkFycmF5YAogICAgICBhbmQgYSBwcm9taXNl LiBXaGVuIHRoZSBwcm9taXNlIGlzIHJlc29sdmVkIHRoZSB0aGUgcmVzdWx0 aW5nIHZhbHVlCiAgICAgIHdpbGwgYmUgc2V0IHRvIHRoZSBgUHJvbWlzZUFy cmF5YCdzIGBjb250ZW50YCBwcm9wZXJ0eS4gVGhpcyBtYWtlcwogICAgICBp dCBlYXN5IHRvIGNyZWF0ZSBkYXRhIGJpbmRpbmdzIHdpdGggdGhlIGBQcm9t aXNlQXJyYXlgIHRoYXQgd2lsbCBiZQogICAgICB1cGRhdGVkIHdoZW4gdGhl IHByb21pc2UgcmVzb2x2ZXMuCgogICAgICBGb3IgbW9yZSBpbmZvcm1hdGlv biBzZWUgdGhlIFtFbWJlci5Qcm9taXNlUHJveHlNaXhpbgogICAgICBkb2N1 bWVudGF0aW9uXSgvYXBpL2NsYXNzZXMvRW1iZXIuUHJvbWlzZVByb3h5TWl4 aW4uaHRtbCkuCgogICAgICBFeGFtcGxlCgogICAgICBgYGBqYXZhc2NyaXB0 CiAgICAgIHZhciBwcm9taXNlQXJyYXkgPSBEUy5Qcm9taXNlQXJyYXkuY3Jl YXRlKHsKICAgICAgICBwcm9taXNlOiAkLmdldEpTT04oJy9zb21lL3JlbW90 ZS9kYXRhLmpzb24nKQogICAgICB9KTsKCiAgICAgIHByb21pc2VBcnJheS5n ZXQoJ2xlbmd0aCcpOyAvLyAwCgogICAgICBwcm9taXNlQXJyYXkudGhlbihm dW5jdGlvbigpIHsKICAgICAgICBwcm9taXNlQXJyYXkuZ2V0KCdsZW5ndGgn KTsgLy8gMTAwCiAgICAgIH0pOwogICAgICBgYGAKCiAgICAgIEBjbGFzcyBQ cm9taXNlQXJyYXkKICAgICAgQG5hbWVzcGFjZSBEUwogICAgICBAZXh0ZW5k cyBFbWJlci5BcnJheVByb3h5CiAgICAgIEB1c2VzIEVtYmVyLlByb21pc2VQ cm94eU1peGluCiAgICAqLwogICAgUHJvbWlzZUFycmF5ID0gRW1iZXIuQXJy YXlQcm94eS5leHRlbmQoRW1iZXIuUHJvbWlzZVByb3h5TWl4aW4pOwogICAg LyoqCiAgICAgIEEgYFByb21pc2VPYmplY3RgIGlzIGFuIG9iamVjdCB0aGF0 IGFjdHMgbGlrZSBib3RoIGFuIGBFbWJlci5PYmplY3RgCiAgICAgIGFuZCBh IHByb21pc2UuIFdoZW4gdGhlIHByb21pc2UgaXMgcmVzb2x2ZWQgdGhlIHRo ZSByZXN1bHRpbmcgdmFsdWUKICAgICAgd2lsbCBiZSBzZXQgdG8gdGhlIGBQ cm9taXNlT2JqZWN0YCdzIGBjb250ZW50YCBwcm9wZXJ0eS4gVGhpcyBtYWtl cwogICAgICBpdCBlYXN5IHRvIGNyZWF0ZSBkYXRhIGJpbmRpbmdzIHdpdGgg dGhlIGBQcm9taXNlT2JqZWN0YCB0aGF0IHdpbGwKICAgICAgYmUgdXBkYXRl ZCB3aGVuIHRoZSBwcm9taXNlIHJlc29sdmVzLgoKICAgICAgRm9yIG1vcmUg aW5mb3JtYXRpb24gc2VlIHRoZSBbRW1iZXIuUHJvbWlzZVByb3h5TWl4aW4K ICAgICAgZG9jdW1lbnRhdGlvbl0oL2FwaS9jbGFzc2VzL0VtYmVyLlByb21p c2VQcm94eU1peGluLmh0bWwpLgoKICAgICAgRXhhbXBsZQoKICAgICAgYGBg amF2YXNjcmlwdAogICAgICB2YXIgcHJvbWlzZU9iamVjdCA9IERTLlByb21p c2VPYmplY3QuY3JlYXRlKHsKICAgICAgICBwcm9taXNlOiAkLmdldEpTT04o Jy9zb21lL3JlbW90ZS9kYXRhLmpzb24nKQogICAgICB9KTsKCiAgICAgIHBy b21pc2VPYmplY3QuZ2V0KCduYW1lJyk7IC8vIG51bGwKCiAgICAgIHByb21p c2VPYmplY3QudGhlbihmdW5jdGlvbigpIHsKICAgICAgICBwcm9taXNlT2Jq ZWN0LmdldCgnbmFtZScpOyAvLyAnVG9tc3RlcicKICAgICAgfSk7CiAgICAg IGBgYAoKICAgICAgQGNsYXNzIFByb21pc2VPYmplY3QKICAgICAgQG5hbWVz cGFjZSBEUwogICAgICBAZXh0ZW5kcyBFbWJlci5PYmplY3RQcm94eQogICAg ICBAdXNlcyBFbWJlci5Qcm9taXNlUHJveHlNaXhpbgogICAgKi8KICAgIFBy b21pc2VPYmplY3QgPSBFbWJlci5PYmplY3RQcm94eS5leHRlbmQoRW1iZXIu UHJvbWlzZVByb3h5TWl4aW4pOwoKICAgIGZ1bmN0aW9uIHByb21pc2VPYmpl Y3QocHJvbWlzZSwgbGFiZWwpIHsKICAgICAgcmV0dXJuIFByb21pc2VPYmpl Y3QuY3JlYXRlKHsKICAgICAgICBwcm9taXNlOiBQcm9taXNlLmNhc3QocHJv bWlzZSwgbGFiZWwpCiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHBy b21pc2VBcnJheShwcm9taXNlLCBsYWJlbCkgewogICAgICByZXR1cm4gUHJv bWlzZUFycmF5LmNyZWF0ZSh7CiAgICAgICAgcHJvbWlzZTogUHJvbWlzZS5j YXN0KHByb21pc2UsIGxhYmVsKQogICAgICB9KTsKICAgIH0KCiAgICBmdW5j dGlvbiBpc1RoZW5hYmxlKG9iamVjdCkgewogICAgICByZXR1cm4gb2JqZWN0 ICYmIHR5cGVvZiBvYmplY3QudGhlbiA9PT0gJ2Z1bmN0aW9uJzsKICAgIH0K CiAgICBmdW5jdGlvbiBzZXJpYWxpemVyRm9yKGNvbnRhaW5lciwgdHlwZSwg ZGVmYXVsdFNlcmlhbGl6ZXIpIHsKICAgICAgcmV0dXJuIGNvbnRhaW5lci5s b29rdXAoJ3NlcmlhbGl6ZXI6Jyt0eXBlKSB8fAogICAgICAgICAgICAgICAg ICAgICBjb250YWluZXIubG9va3VwKCdzZXJpYWxpemVyOmFwcGxpY2F0aW9u JykgfHwKICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmxvb2t1cCgn c2VyaWFsaXplcjonICsgZGVmYXVsdFNlcmlhbGl6ZXIpIHx8CiAgICAgICAg ICAgICAgICAgICAgIGNvbnRhaW5lci5sb29rdXAoJ3NlcmlhbGl6ZXI6LWRl ZmF1bHQnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWZhdWx0U2VyaWFsaXpl cihjb250YWluZXIpIHsKICAgICAgcmV0dXJuIGNvbnRhaW5lci5sb29rdXAo J3NlcmlhbGl6ZXI6YXBwbGljYXRpb24nKSB8fAogICAgICAgICAgICAgY29u dGFpbmVyLmxvb2t1cCgnc2VyaWFsaXplcjotZGVmYXVsdCcpOwogICAgfQoK ICAgIGZ1bmN0aW9uIHNlcmlhbGl6ZXJGb3JBZGFwdGVyKGFkYXB0ZXIsIHR5 cGUpIHsKICAgICAgdmFyIHNlcmlhbGl6ZXIgPSBhZGFwdGVyLnNlcmlhbGl6 ZXIsCiAgICAgICAgICBkZWZhdWx0U2VyaWFsaXplciA9IGFkYXB0ZXIuZGVm YXVsdFNlcmlhbGl6ZXIsCiAgICAgICAgICBjb250YWluZXIgPSBhZGFwdGVy LmNvbnRhaW5lcjsKCiAgICAgIGlmIChjb250YWluZXIgJiYgc2VyaWFsaXpl ciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgc2VyaWFsaXplciA9IHNlcmlh bGl6ZXJGb3IoY29udGFpbmVyLCB0eXBlLnR5cGVLZXksIGRlZmF1bHRTZXJp YWxpemVyKTsKICAgICAgfQoKICAgICAgaWYgKHNlcmlhbGl6ZXIgPT09IG51 bGwgfHwgc2VyaWFsaXplciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgc2Vy aWFsaXplciA9IHsKICAgICAgICAgIGV4dHJhY3Q6IGZ1bmN0aW9uKHN0b3Jl LCB0eXBlLCBwYXlsb2FkKSB7IHJldHVybiBwYXlsb2FkOyB9CiAgICAgICAg fTsKICAgICAgfQoKICAgICAgcmV0dXJuIHNlcmlhbGl6ZXI7CiAgICB9Cgog ICAgZnVuY3Rpb24gX2ZpbmQoYWRhcHRlciwgc3RvcmUsIHR5cGUsIGlkKSB7 CiAgICAgIHZhciBwcm9taXNlID0gYWRhcHRlci5maW5kKHN0b3JlLCB0eXBl LCBpZCksCiAgICAgICAgICBzZXJpYWxpemVyID0gc2VyaWFsaXplckZvckFk YXB0ZXIoYWRhcHRlciwgdHlwZSksCiAgICAgICAgICBsYWJlbCA9ICJEUzog SGFuZGxlIEFkYXB0ZXIjZmluZCBvZiAiICsgdHlwZSArICIgd2l0aCBpZDog IiArIGlkOwoKICAgICAgcmV0dXJuIFByb21pc2UuY2FzdChwcm9taXNlLCBs YWJlbCkudGhlbihmdW5jdGlvbihhZGFwdGVyUGF5bG9hZCkgewogICAgICAg IEVtYmVyLmFzc2VydCgiWW91IG1hZGUgYSByZXF1ZXN0IGZvciBhICIgKyB0 eXBlLnR5cGVLZXkgKyAiIHdpdGggaWQgIiArIGlkICsgIiwgYnV0IHRoZSBh ZGFwdGVyJ3MgcmVzcG9uc2UgZGlkIG5vdCBoYXZlIGFueSBkYXRhIiwgYWRh cHRlclBheWxvYWQpOwogICAgICAgIHZhciBwYXlsb2FkID0gc2VyaWFsaXpl ci5leHRyYWN0KHN0b3JlLCB0eXBlLCBhZGFwdGVyUGF5bG9hZCwgaWQsICdm aW5kJyk7CgogICAgICAgIHJldHVybiBzdG9yZS5wdXNoKHR5cGUsIHBheWxv YWQpOwogICAgICB9LCBmdW5jdGlvbihlcnJvcikgewogICAgICAgIHZhciBy ZWNvcmQgPSBzdG9yZS5nZXRCeUlkKHR5cGUsIGlkKTsKICAgICAgICByZWNv cmQubm90Rm91bmQoKTsKICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgfSwg IkRTOiBFeHRyYWN0IHBheWxvYWQgb2YgJyIgKyB0eXBlICsgIiciKTsKICAg IH0KCiAgICBmdW5jdGlvbiBfZmluZE1hbnkoYWRhcHRlciwgc3RvcmUsIHR5 cGUsIGlkcywgb3duZXIpIHsKICAgICAgdmFyIHByb21pc2UgPSBhZGFwdGVy LmZpbmRNYW55KHN0b3JlLCB0eXBlLCBpZHMsIG93bmVyKSwKICAgICAgICAg IHNlcmlhbGl6ZXIgPSBzZXJpYWxpemVyRm9yQWRhcHRlcihhZGFwdGVyLCB0 eXBlKSwKICAgICAgICAgIGxhYmVsID0gIkRTOiBIYW5kbGUgQWRhcHRlciNm aW5kTWFueSBvZiAiICsgdHlwZTsKCiAgICAgIHJldHVybiBQcm9taXNlLmNh c3QocHJvbWlzZSwgbGFiZWwpLnRoZW4oZnVuY3Rpb24oYWRhcHRlclBheWxv YWQpIHsKICAgICAgICB2YXIgcGF5bG9hZCA9IHNlcmlhbGl6ZXIuZXh0cmFj dChzdG9yZSwgdHlwZSwgYWRhcHRlclBheWxvYWQsIG51bGwsICdmaW5kTWFu eScpOwoKICAgICAgICBFbWJlci5hc3NlcnQoIlRoZSByZXNwb25zZSBmcm9t IGEgZmluZE1hbnkgbXVzdCBiZSBhbiBBcnJheSwgbm90ICIgKyBFbWJlci5p bnNwZWN0KHBheWxvYWQpLCBFbWJlci50eXBlT2YocGF5bG9hZCkgPT09ICdh cnJheScpOwoKICAgICAgICBzdG9yZS5wdXNoTWFueSh0eXBlLCBwYXlsb2Fk KTsKICAgICAgfSwgbnVsbCwgIkRTOiBFeHRyYWN0IHBheWxvYWQgb2YgIiAr IHR5cGUpOwogICAgfQoKICAgIGZ1bmN0aW9uIF9maW5kSGFzTWFueShhZGFw dGVyLCBzdG9yZSwgcmVjb3JkLCBsaW5rLCByZWxhdGlvbnNoaXApIHsKICAg ICAgdmFyIHByb21pc2UgPSBhZGFwdGVyLmZpbmRIYXNNYW55KHN0b3JlLCBy ZWNvcmQsIGxpbmssIHJlbGF0aW9uc2hpcCksCiAgICAgICAgICBzZXJpYWxp emVyID0gc2VyaWFsaXplckZvckFkYXB0ZXIoYWRhcHRlciwgcmVsYXRpb25z aGlwLnR5cGUpLAogICAgICAgICAgbGFiZWwgPSAiRFM6IEhhbmRsZSBBZGFw dGVyI2ZpbmRIYXNNYW55IG9mICIgKyByZWNvcmQgKyAiIDogIiArIHJlbGF0 aW9uc2hpcC50eXBlOwoKICAgICAgcmV0dXJuIFByb21pc2UuY2FzdChwcm9t aXNlLCBsYWJlbCkudGhlbihmdW5jdGlvbihhZGFwdGVyUGF5bG9hZCkgewog ICAgICAgIHZhciBwYXlsb2FkID0gc2VyaWFsaXplci5leHRyYWN0KHN0b3Jl LCByZWxhdGlvbnNoaXAudHlwZSwgYWRhcHRlclBheWxvYWQsIG51bGwsICdm aW5kSGFzTWFueScpOwoKICAgICAgICBFbWJlci5hc3NlcnQoIlRoZSByZXNw b25zZSBmcm9tIGEgZmluZEhhc01hbnkgbXVzdCBiZSBhbiBBcnJheSwgbm90 ICIgKyBFbWJlci5pbnNwZWN0KHBheWxvYWQpLCBFbWJlci50eXBlT2YocGF5 bG9hZCkgPT09ICdhcnJheScpOwoKICAgICAgICB2YXIgcmVjb3JkcyA9IHN0 b3JlLnB1c2hNYW55KHJlbGF0aW9uc2hpcC50eXBlLCBwYXlsb2FkKTsKICAg ICAgICByZWNvcmQudXBkYXRlSGFzTWFueShyZWxhdGlvbnNoaXAua2V5LCBy ZWNvcmRzKTsKICAgICAgfSwgbnVsbCwgIkRTOiBFeHRyYWN0IHBheWxvYWQg b2YgIiArIHJlY29yZCArICIgOiBoYXNNYW55ICIgKyByZWxhdGlvbnNoaXAu dHlwZSk7CiAgICB9CgogICAgZnVuY3Rpb24gX2ZpbmRCZWxvbmdzVG8oYWRh cHRlciwgc3RvcmUsIHJlY29yZCwgbGluaywgcmVsYXRpb25zaGlwKSB7CiAg ICAgIHZhciBwcm9taXNlID0gYWRhcHRlci5maW5kQmVsb25nc1RvKHN0b3Jl LCByZWNvcmQsIGxpbmssIHJlbGF0aW9uc2hpcCksCiAgICAgICAgICBzZXJp YWxpemVyID0gc2VyaWFsaXplckZvckFkYXB0ZXIoYWRhcHRlciwgcmVsYXRp b25zaGlwLnR5cGUpLAogICAgICAgICAgbGFiZWwgPSAiRFM6IEhhbmRsZSBB ZGFwdGVyI2ZpbmRCZWxvbmdzVG8gb2YgIiArIHJlY29yZCArICIgOiAiICsg cmVsYXRpb25zaGlwLnR5cGU7CgogICAgICByZXR1cm4gUHJvbWlzZS5jYXN0 KHByb21pc2UsIGxhYmVsKS50aGVuKGZ1bmN0aW9uKGFkYXB0ZXJQYXlsb2Fk KSB7CiAgICAgICAgdmFyIHBheWxvYWQgPSBzZXJpYWxpemVyLmV4dHJhY3Qo c3RvcmUsIHJlbGF0aW9uc2hpcC50eXBlLCBhZGFwdGVyUGF5bG9hZCwgbnVs bCwgJ2ZpbmRCZWxvbmdzVG8nKTsKICAgICAgICB2YXIgcmVjb3JkID0gc3Rv cmUucHVzaChyZWxhdGlvbnNoaXAudHlwZSwgcGF5bG9hZCk7CgogICAgICAg IHJlY29yZC51cGRhdGVCZWxvbmdzVG8ocmVsYXRpb25zaGlwLmtleSwgcmVj b3JkKTsKICAgICAgICByZXR1cm4gcmVjb3JkOwogICAgICB9LCBudWxsLCAi RFM6IEV4dHJhY3QgcGF5bG9hZCBvZiAiICsgcmVjb3JkICsgIiA6ICIgKyBy ZWxhdGlvbnNoaXAudHlwZSk7CiAgICB9CgogICAgZnVuY3Rpb24gX2ZpbmRB bGwoYWRhcHRlciwgc3RvcmUsIHR5cGUsIHNpbmNlVG9rZW4pIHsKICAgICAg dmFyIHByb21pc2UgPSBhZGFwdGVyLmZpbmRBbGwoc3RvcmUsIHR5cGUsIHNp bmNlVG9rZW4pLAogICAgICAgICAgc2VyaWFsaXplciA9IHNlcmlhbGl6ZXJG b3JBZGFwdGVyKGFkYXB0ZXIsIHR5cGUpLAogICAgICAgICAgbGFiZWwgPSAi RFM6IEhhbmRsZSBBZGFwdGVyI2ZpbmRBbGwgb2YgIiArIHR5cGU7CgogICAg ICByZXR1cm4gUHJvbWlzZS5jYXN0KHByb21pc2UsIGxhYmVsKS50aGVuKGZ1 bmN0aW9uKGFkYXB0ZXJQYXlsb2FkKSB7CiAgICAgICAgdmFyIHBheWxvYWQg PSBzZXJpYWxpemVyLmV4dHJhY3Qoc3RvcmUsIHR5cGUsIGFkYXB0ZXJQYXls b2FkLCBudWxsLCAnZmluZEFsbCcpOwoKICAgICAgICBFbWJlci5hc3NlcnQo IlRoZSByZXNwb25zZSBmcm9tIGEgZmluZEFsbCBtdXN0IGJlIGFuIEFycmF5 LCBub3QgIiArIEVtYmVyLmluc3BlY3QocGF5bG9hZCksIEVtYmVyLnR5cGVP ZihwYXlsb2FkKSA9PT0gJ2FycmF5Jyk7CgogICAgICAgIHN0b3JlLnB1c2hN YW55KHR5cGUsIHBheWxvYWQpOwogICAgICAgIHN0b3JlLmRpZFVwZGF0ZUFs bCh0eXBlKTsKICAgICAgICByZXR1cm4gc3RvcmUuYWxsKHR5cGUpOwogICAg ICB9LCBudWxsLCAiRFM6IEV4dHJhY3QgcGF5bG9hZCBvZiBmaW5kQWxsICIg KyB0eXBlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBfZmluZFF1ZXJ5KGFkYXB0 ZXIsIHN0b3JlLCB0eXBlLCBxdWVyeSwgcmVjb3JkQXJyYXkpIHsKICAgICAg dmFyIHByb21pc2UgPSBhZGFwdGVyLmZpbmRRdWVyeShzdG9yZSwgdHlwZSwg cXVlcnksIHJlY29yZEFycmF5KSwKICAgICAgICAgIHNlcmlhbGl6ZXIgPSBz ZXJpYWxpemVyRm9yQWRhcHRlcihhZGFwdGVyLCB0eXBlKSwKICAgICAgICAg IGxhYmVsID0gIkRTOiBIYW5kbGUgQWRhcHRlciNmaW5kUXVlcnkgb2YgIiAr IHR5cGU7CgogICAgICByZXR1cm4gUHJvbWlzZS5jYXN0KHByb21pc2UsIGxh YmVsKS50aGVuKGZ1bmN0aW9uKGFkYXB0ZXJQYXlsb2FkKSB7CiAgICAgICAg dmFyIHBheWxvYWQgPSBzZXJpYWxpemVyLmV4dHJhY3Qoc3RvcmUsIHR5cGUs IGFkYXB0ZXJQYXlsb2FkLCBudWxsLCAnZmluZFF1ZXJ5Jyk7CgogICAgICAg IEVtYmVyLmFzc2VydCgiVGhlIHJlc3BvbnNlIGZyb20gYSBmaW5kUXVlcnkg bXVzdCBiZSBhbiBBcnJheSwgbm90ICIgKyBFbWJlci5pbnNwZWN0KHBheWxv YWQpLCBFbWJlci50eXBlT2YocGF5bG9hZCkgPT09ICdhcnJheScpOwoKICAg ICAgICByZWNvcmRBcnJheS5sb2FkKHBheWxvYWQpOwogICAgICAgIHJldHVy biByZWNvcmRBcnJheTsKICAgICAgfSwgbnVsbCwgIkRTOiBFeHRyYWN0IHBh eWxvYWQgb2YgZmluZFF1ZXJ5ICIgKyB0eXBlKTsKICAgIH0KCiAgICBmdW5j dGlvbiBfY29tbWl0KGFkYXB0ZXIsIHN0b3JlLCBvcGVyYXRpb24sIHJlY29y ZCkgewogICAgICB2YXIgdHlwZSA9IHJlY29yZC5jb25zdHJ1Y3RvciwKICAg ICAgICAgIHByb21pc2UgPSBhZGFwdGVyW29wZXJhdGlvbl0oc3RvcmUsIHR5 cGUsIHJlY29yZCksCiAgICAgICAgICBzZXJpYWxpemVyID0gc2VyaWFsaXpl ckZvckFkYXB0ZXIoYWRhcHRlciwgdHlwZSksCiAgICAgICAgICBsYWJlbCA9 ICJEUzogRXh0cmFjdCBhbmQgbm90aWZ5IGFib3V0ICIgKyBvcGVyYXRpb24g KyAiIGNvbXBsZXRpb24gb2YgIiArIHJlY29yZDsKCiAgICAgIEVtYmVyLmFz c2VydCgiWW91ciBhZGFwdGVyJ3MgJyIgKyBvcGVyYXRpb24gKyAiJyBtZXRo b2QgbXVzdCByZXR1cm4gYSBwcm9taXNlLCBidXQgaXQgcmV0dXJuZWQgIiAr IHByb21pc2UsIGlzVGhlbmFibGUocHJvbWlzZSkpOwoKICAgICAgcmV0dXJu IHByb21pc2UudGhlbihmdW5jdGlvbihhZGFwdGVyUGF5bG9hZCkgewogICAg ICAgIHZhciBwYXlsb2FkOwoKICAgICAgICBpZiAoYWRhcHRlclBheWxvYWQp IHsKICAgICAgICAgIHBheWxvYWQgPSBzZXJpYWxpemVyLmV4dHJhY3Qoc3Rv cmUsIHR5cGUsIGFkYXB0ZXJQYXlsb2FkLCBnZXQocmVjb3JkLCAnaWQnKSwg b3BlcmF0aW9uKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcGF5bG9h ZCA9IGFkYXB0ZXJQYXlsb2FkOwogICAgICAgIH0KCiAgICAgICAgc3RvcmUu ZGlkU2F2ZVJlY29yZChyZWNvcmQsIHBheWxvYWQpOwogICAgICAgIHJldHVy biByZWNvcmQ7CiAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikgewogICAgICAg IGlmIChyZWFzb24gaW5zdGFuY2VvZiBEUy5JbnZhbGlkRXJyb3IpIHsKICAg ICAgICAgIHN0b3JlLnJlY29yZFdhc0ludmFsaWQocmVjb3JkLCByZWFzb24u ZXJyb3JzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RvcmUucmVj b3JkV2FzRXJyb3IocmVjb3JkLCByZWFzb24pOwogICAgICAgIH0KCiAgICAg ICAgdGhyb3cgcmVhc29uOwogICAgICB9LCBsYWJlbCk7CiAgICB9CgogICAg X19leHBvcnRzX18uU3RvcmUgPSBTdG9yZTsKICAgIF9fZXhwb3J0c19fLlBy b21pc2VBcnJheSA9IFByb21pc2VBcnJheTsKICAgIF9fZXhwb3J0c19fLlBy b21pc2VPYmplY3QgPSBQcm9taXNlT2JqZWN0OwogICAgX19leHBvcnRzX19b ImRlZmF1bHQiXSA9IFN0b3JlOwogIH0pOwpkZWZpbmUoImVtYmVyLWRhdGEv bGliL3RyYW5zZm9ybXMiLCAKICBbIi4vdHJhbnNmb3Jtcy9iYXNlIiwiLi90 cmFuc2Zvcm1zL251bWJlciIsIi4vdHJhbnNmb3Jtcy9kYXRlIiwiLi90cmFu c2Zvcm1zL3N0cmluZyIsIi4vdHJhbnNmb3Jtcy9ib29sZWFuIiwiZXhwb3J0 cyJdLAogIGZ1bmN0aW9uKF9fZGVwZW5kZW5jeTFfXywgX19kZXBlbmRlbmN5 Ml9fLCBfX2RlcGVuZGVuY3kzX18sIF9fZGVwZW5kZW5jeTRfXywgX19kZXBl bmRlbmN5NV9fLCBfX2V4cG9ydHNfXykgewogICAgInVzZSBzdHJpY3QiOwog ICAgdmFyIFRyYW5zZm9ybSA9IF9fZGVwZW5kZW5jeTFfX1siZGVmYXVsdCJd OwogICAgdmFyIE51bWJlclRyYW5zZm9ybSA9IF9fZGVwZW5kZW5jeTJfX1si ZGVmYXVsdCJdOwogICAgdmFyIERhdGVUcmFuc2Zvcm0gPSBfX2RlcGVuZGVu Y3kzX19bImRlZmF1bHQiXTsKICAgIHZhciBTdHJpbmdUcmFuc2Zvcm0gPSBf X2RlcGVuZGVuY3k0X19bImRlZmF1bHQiXTsKICAgIHZhciBCb29sZWFuVHJh bnNmb3JtID0gX19kZXBlbmRlbmN5NV9fWyJkZWZhdWx0Il07CgogICAgX19l eHBvcnRzX18uVHJhbnNmb3JtID0gVHJhbnNmb3JtOwogICAgX19leHBvcnRz X18uTnVtYmVyVHJhbnNmb3JtID0gTnVtYmVyVHJhbnNmb3JtOwogICAgX19l eHBvcnRzX18uRGF0ZVRyYW5zZm9ybSA9IERhdGVUcmFuc2Zvcm07CiAgICBf X2V4cG9ydHNfXy5TdHJpbmdUcmFuc2Zvcm0gPSBTdHJpbmdUcmFuc2Zvcm07 CiAgICBfX2V4cG9ydHNfXy5Cb29sZWFuVHJhbnNmb3JtID0gQm9vbGVhblRy YW5zZm9ybTsKICB9KTsKZGVmaW5lKCJlbWJlci1kYXRhL2xpYi90cmFuc2Zv cm1zL2Jhc2UiLCAKICBbImV4cG9ydHMiXSwKICBmdW5jdGlvbihfX2V4cG9y dHNfXykgewogICAgInVzZSBzdHJpY3QiOwogICAgLyoqCiAgICAgIFRoZSBg RFMuVHJhbnNmb3JtYCBjbGFzcyBpcyB1c2VkIHRvIHNlcmlhbGl6ZSBhbmQg ZGVzZXJpYWxpemUgbW9kZWwKICAgICAgYXR0cmlidXRlcyB3aGVuIHRoZXkg YXJlIHNhdmVkIG9yIGxvYWRlZCBmcm9tIGFuCiAgICAgIGFkYXB0ZXIuIFN1 YmNsYXNzaW5nIGBEUy5UcmFuc2Zvcm1gIGlzIHVzZWZ1bCBmb3IgY3JlYXRp bmcgY3VzdG9tCiAgICAgIGF0dHJpYnV0ZXMuIEFsbCBzdWJjbGFzc2VzIG9m IGBEUy5UcmFuc2Zvcm1gIG11c3QgaW1wbGVtZW50IGEKICAgICAgYHNlcmlh bGl6ZWAgYW5kIGEgYGRlc2VyaWFsaXplYCBtZXRob2QuCgogICAgICBFeGFt cGxlCgogICAgICBgYGBqYXZhc2NyaXB0CiAgICAgIEFwcC5SYXdUcmFuc2Zv cm0gPSBEUy5UcmFuc2Zvcm0uZXh0ZW5kKHsKICAgICAgICBkZXNlcmlhbGl6 ZTogZnVuY3Rpb24oc2VyaWFsaXplZCkgewogICAgICAgICAgcmV0dXJuIHNl cmlhbGl6ZWQ7CiAgICAgICAgfSwKICAgICAgICBzZXJpYWxpemU6IGZ1bmN0 aW9uKGRlc2VyaWFsaXplZCkgewogICAgICAgICAgcmV0dXJuIGRlc2VyaWFs aXplZDsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBgYGAKCiAgICAgIFVz YWdlCgogICAgICBgYGBqYXZhc2NyaXB0CiAgICAgIHZhciBhdHRyID0gRFMu YXR0cjsKICAgICAgQXBwLlJlcXVpcmVtZW50ID0gRFMuTW9kZWwuZXh0ZW5k KHsKICAgICAgICBuYW1lOiBhdHRyKCdzdHJpbmcnKSwKICAgICAgICBvcHRp b25zQXJyYXk6IGF0dHIoJ3JhdycpCiAgICAgIH0pOwogICAgICBgYGAKCiAg ICAgIEBjbGFzcyBUcmFuc2Zvcm0KICAgICAgQG5hbWVzcGFjZSBEUwogICAg ICovCiAgICB2YXIgVHJhbnNmb3JtID0gRW1iZXIuT2JqZWN0LmV4dGVuZCh7 CiAgICAgIC8qKgogICAgICAgIFdoZW4gZ2l2ZW4gYSBkZXNlcmlhbGl6ZWQg dmFsdWUgZnJvbSBhIHJlY29yZCBhdHRyaWJ1dGUgdGhpcwogICAgICAgIG1l dGhvZCBtdXN0IHJldHVybiB0aGUgc2VyaWFsaXplZCB2YWx1ZS4KCiAgICAg ICAgRXhhbXBsZQoKICAgICAgICBgYGBqYXZhc2NyaXB0CiAgICAgICAgc2Vy aWFsaXplOiBmdW5jdGlvbihkZXNlcmlhbGl6ZWQpIHsKICAgICAgICAgIHJl dHVybiBFbWJlci5pc0VtcHR5KGRlc2VyaWFsaXplZCkgPyBudWxsIDogTnVt YmVyKGRlc2VyaWFsaXplZCk7CiAgICAgICAgfQogICAgICAgIGBgYAoKICAg ICAgICBAbWV0aG9kIHNlcmlhbGl6ZQogICAgICAgIEBwYXJhbSBkZXNlcmlh bGl6ZWQgVGhlIGRlc2VyaWFsaXplZCB2YWx1ZQogICAgICAgIEByZXR1cm4g VGhlIHNlcmlhbGl6ZWQgdmFsdWUKICAgICAgKi8KICAgICAgc2VyaWFsaXpl OiBFbWJlci5yZXF1aXJlZCgpLAoKICAgICAgLyoqCiAgICAgICAgV2hlbiBn aXZlbiBhIHNlcmlhbGl6ZSB2YWx1ZSBmcm9tIGEgSlNPTiBvYmplY3QgdGhp cyBtZXRob2QgbXVzdAogICAgICAgIHJldHVybiB0aGUgZGVzZXJpYWxpemVk IHZhbHVlIGZvciB0aGUgcmVjb3JkIGF0dHJpYnV0ZS4KCiAgICAgICAgRXhh bXBsZQoKICAgICAgICBgYGBqYXZhc2NyaXB0CiAgICAgICAgZGVzZXJpYWxp emU6IGZ1bmN0aW9uKHNlcmlhbGl6ZWQpIHsKICAgICAgICAgIHJldHVybiBl bXB0eShzZXJpYWxpemVkKSA/IG51bGwgOiBOdW1iZXIoc2VyaWFsaXplZCk7 CiAgICAgICAgfQogICAgICAgIGBgYAoKICAgICAgICBAbWV0aG9kIGRlc2Vy aWFsaXplCiAgICAgICAgQHBhcmFtIHNlcmlhbGl6ZWQgVGhlIHNlcmlhbGl6 ZWQgdmFsdWUKICAgICAgICBAcmV0dXJuIFRoZSBkZXNlcmlhbGl6ZWQgdmFs dWUKICAgICAgKi8KICAgICAgZGVzZXJpYWxpemU6IEVtYmVyLnJlcXVpcmVk KCkKCiAgICB9KTsKCiAgICBfX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gVHJh bnNmb3JtOwogIH0pOwpkZWZpbmUoImVtYmVyLWRhdGEvbGliL3RyYW5zZm9y bXMvYm9vbGVhbiIsIAogIFsiLi9iYXNlIiwiZXhwb3J0cyJdLAogIGZ1bmN0 aW9uKF9fZGVwZW5kZW5jeTFfXywgX19leHBvcnRzX18pIHsKICAgICJ1c2Ug c3RyaWN0IjsKICAgIHZhciBUcmFuc2Zvcm0gPSBfX2RlcGVuZGVuY3kxX19b ImRlZmF1bHQiXTsKCiAgICAvKioKICAgICAgVGhlIGBEUy5Cb29sZWFuVHJh bnNmb3JtYCBjbGFzcyBpcyB1c2VkIHRvIHNlcmlhbGl6ZSBhbmQgZGVzZXJp YWxpemUKICAgICAgYm9vbGVhbiBhdHRyaWJ1dGVzIG9uIEVtYmVyIERhdGEg cmVjb3JkIG9iamVjdHMuIFRoaXMgdHJhbnNmb3JtIGlzCiAgICAgIHVzZWQg d2hlbiBgYm9vbGVhbmAgaXMgcGFzc2VkIGFzIHRoZSB0eXBlIHBhcmFtZXRl ciB0byB0aGUKICAgICAgW0RTLmF0dHJdKC4uLy4uL2RhdGEjbWV0aG9kX2F0 dHIpIGZ1bmN0aW9uLgoKICAgICAgVXNhZ2UKCiAgICAgIGBgYGphdmFzY3Jp cHQKICAgICAgdmFyIGF0dHIgPSBEUy5hdHRyOwogICAgICBBcHAuVXNlciA9 IERTLk1vZGVsLmV4dGVuZCh7CiAgICAgICAgaXNBZG1pbjogYXR0cignYm9v bGVhbicpLAogICAgICAgIG5hbWU6IGF0dHIoJ3N0cmluZycpLAogICAgICAg IGVtYWlsOiBhdHRyKCdzdHJpbmcnKQogICAgICB9KTsKICAgICAgYGBgCgog ICAgICBAY2xhc3MgQm9vbGVhblRyYW5zZm9ybQogICAgICBAZXh0ZW5kcyBE Uy5UcmFuc2Zvcm0KICAgICAgQG5hbWVzcGFjZSBEUwogICAgICovCiAgICB2 YXIgQm9vbGVhblRyYW5zZm9ybSA9IFRyYW5zZm9ybS5leHRlbmQoewogICAg ICBkZXNlcmlhbGl6ZTogZnVuY3Rpb24oc2VyaWFsaXplZCkgewogICAgICAg IHZhciB0eXBlID0gdHlwZW9mIHNlcmlhbGl6ZWQ7CgogICAgICAgIGlmICh0 eXBlID09PSAiYm9vbGVhbiIpIHsKICAgICAgICAgIHJldHVybiBzZXJpYWxp emVkOwogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gInN0cmluZyIpIHsK ICAgICAgICAgIHJldHVybiBzZXJpYWxpemVkLm1hdGNoKC9edHJ1ZSR8XnQk fF4xJC9pKSAhPT0gbnVsbDsKICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09 ICJudW1iZXIiKSB7CiAgICAgICAgICByZXR1cm4gc2VyaWFsaXplZCA9PT0g MTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwog ICAgICAgIH0KICAgICAgfSwKCiAgICAgIHNlcmlhbGl6ZTogZnVuY3Rpb24o ZGVzZXJpYWxpemVkKSB7CiAgICAgICAgcmV0dXJuIEJvb2xlYW4oZGVzZXJp YWxpemVkKTsKICAgICAgfQogICAgfSk7CiAgICBfX2V4cG9ydHNfX1siZGVm YXVsdCJdID0gQm9vbGVhblRyYW5zZm9ybTsKICB9KTsKZGVmaW5lKCJlbWJl ci1kYXRhL2xpYi90cmFuc2Zvcm1zL2RhdGUiLCAKICBbIi4vYmFzZSIsImV4 cG9ydHMiXSwKICBmdW5jdGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZXhwb3J0 c19fKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICAvKioKICAgICAgVGhlIGBE Uy5EYXRlVHJhbnNmb3JtYCBjbGFzcyBpcyB1c2VkIHRvIHNlcmlhbGl6ZSBh bmQgZGVzZXJpYWxpemUKICAgICAgZGF0ZSBhdHRyaWJ1dGVzIG9uIEVtYmVy IERhdGEgcmVjb3JkIG9iamVjdHMuIFRoaXMgdHJhbnNmb3JtIGlzIHVzZWQK ICAgICAgd2hlbiBgZGF0ZWAgaXMgcGFzc2VkIGFzIHRoZSB0eXBlIHBhcmFt ZXRlciB0byB0aGUKICAgICAgW0RTLmF0dHJdKC4uLy4uL2RhdGEjbWV0aG9k X2F0dHIpIGZ1bmN0aW9uLgoKICAgICAgYGBgamF2YXNjcmlwdAogICAgICB2 YXIgYXR0ciA9IERTLmF0dHI7CiAgICAgIEFwcC5TY29yZSA9IERTLk1vZGVs LmV4dGVuZCh7CiAgICAgICAgdmFsdWU6IGF0dHIoJ251bWJlcicpLAogICAg ICAgIHBsYXllcjogRFMuYmVsb25nc1RvKCdwbGF5ZXInKSwKICAgICAgICBk YXRlOiBhdHRyKCdkYXRlJykKICAgICAgfSk7CiAgICAgIGBgYAoKICAgICAg QGNsYXNzIERhdGVUcmFuc2Zvcm0KICAgICAgQGV4dGVuZHMgRFMuVHJhbnNm b3JtCiAgICAgIEBuYW1lc3BhY2UgRFMKICAgICAqLwogICAgdmFyIFRyYW5z Zm9ybSA9IF9fZGVwZW5kZW5jeTFfX1siZGVmYXVsdCJdOwogICAgdmFyIERh dGVUcmFuc2Zvcm0gPSBUcmFuc2Zvcm0uZXh0ZW5kKHsKCiAgICAgIGRlc2Vy aWFsaXplOiBmdW5jdGlvbihzZXJpYWxpemVkKSB7CiAgICAgICAgdmFyIHR5 cGUgPSB0eXBlb2Ygc2VyaWFsaXplZDsKCiAgICAgICAgaWYgKHR5cGUgPT09 ICJzdHJpbmciKSB7CiAgICAgICAgICByZXR1cm4gbmV3IERhdGUoRW1iZXIu RGF0ZS5wYXJzZShzZXJpYWxpemVkKSk7CiAgICAgICAgfSBlbHNlIGlmICh0 eXBlID09PSAibnVtYmVyIikgewogICAgICAgICAgcmV0dXJuIG5ldyBEYXRl KHNlcmlhbGl6ZWQpOwogICAgICAgIH0gZWxzZSBpZiAoc2VyaWFsaXplZCA9 PT0gbnVsbCB8fCBzZXJpYWxpemVkID09PSB1bmRlZmluZWQpIHsKICAgICAg ICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBub3QgcHJlc2VudCBpbiB0aGUgZGF0 YSwKICAgICAgICAgIC8vIHJldHVybiB1bmRlZmluZWQsIG5vdCBudWxsLgog ICAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7CiAgICAgICAgfSBlbHNlIHsK ICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgfSwKCiAg ICAgIHNlcmlhbGl6ZTogZnVuY3Rpb24oZGF0ZSkgewogICAgICAgIGlmIChk YXRlIGluc3RhbmNlb2YgRGF0ZSkgewogICAgICAgICAgdmFyIGRheXMgPSBb IlN1biIsICJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNh dCJdOwogICAgICAgICAgdmFyIG1vbnRocyA9IFsiSmFuIiwgIkZlYiIsICJN YXIiLCAiQXByIiwgIk1heSIsICJKdW4iLCAiSnVsIiwgIkF1ZyIsICJTZXAi LCAiT2N0IiwgIk5vdiIsICJEZWMiXTsKCiAgICAgICAgICB2YXIgcGFkID0g ZnVuY3Rpb24obnVtKSB7CiAgICAgICAgICAgIHJldHVybiBudW0gPCAxMCA/ ICIwIitudW0gOiAiIitudW07CiAgICAgICAgICB9OwoKICAgICAgICAgIHZh ciB1dGNZZWFyID0gZGF0ZS5nZXRVVENGdWxsWWVhcigpLAogICAgICAgICAg ICAgIHV0Y01vbnRoID0gZGF0ZS5nZXRVVENNb250aCgpLAogICAgICAgICAg ICAgIHV0Y0RheU9mTW9udGggPSBkYXRlLmdldFVUQ0RhdGUoKSwKICAgICAg ICAgICAgICB1dGNEYXkgPSBkYXRlLmdldFVUQ0RheSgpLAogICAgICAgICAg ICAgIHV0Y0hvdXJzID0gZGF0ZS5nZXRVVENIb3VycygpLAogICAgICAgICAg ICAgIHV0Y01pbnV0ZXMgPSBkYXRlLmdldFVUQ01pbnV0ZXMoKSwKICAgICAg ICAgICAgICB1dGNTZWNvbmRzID0gZGF0ZS5nZXRVVENTZWNvbmRzKCk7CgoK ICAgICAgICAgIHZhciBkYXlPZldlZWsgPSBkYXlzW3V0Y0RheV07CiAgICAg ICAgICB2YXIgZGF5T2ZNb250aCA9IHBhZCh1dGNEYXlPZk1vbnRoKTsKICAg ICAgICAgIHZhciBtb250aCA9IG1vbnRoc1t1dGNNb250aF07CgogICAgICAg ICAgcmV0dXJuIGRheU9mV2VlayArICIsICIgKyBkYXlPZk1vbnRoICsgIiAi ICsgbW9udGggKyAiICIgKyB1dGNZZWFyICsgIiAiICsKICAgICAgICAgICAg ICAgICBwYWQodXRjSG91cnMpICsgIjoiICsgcGFkKHV0Y01pbnV0ZXMpICsg IjoiICsgcGFkKHV0Y1NlY29uZHMpICsgIiBHTVQiOwogICAgICAgIH0gZWxz ZSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgIH0g CgogICAgfSk7CgogICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9IERhdGVU cmFuc2Zvcm07CiAgfSk7CmRlZmluZSgiZW1iZXItZGF0YS9saWIvdHJhbnNm b3Jtcy9udW1iZXIiLCAKICBbIi4vYmFzZSIsImV4cG9ydHMiXSwKICBmdW5j dGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZXhwb3J0c19fKSB7CiAgICAidXNl IHN0cmljdCI7CiAgICB2YXIgVHJhbnNmb3JtID0gX19kZXBlbmRlbmN5MV9f WyJkZWZhdWx0Il07CgogICAgdmFyIGVtcHR5ID0gRW1iZXIuaXNFbXB0eTsK CiAgICAvKioKICAgICAgVGhlIGBEUy5OdW1iZXJUcmFuc2Zvcm1gIGNsYXNz IGlzIHVzZWQgdG8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZQogICAgICBu dW1lcmljIGF0dHJpYnV0ZXMgb24gRW1iZXIgRGF0YSByZWNvcmQgb2JqZWN0 cy4gVGhpcyB0cmFuc2Zvcm0gaXMKICAgICAgdXNlZCB3aGVuIGBudW1iZXJg IGlzIHBhc3NlZCBhcyB0aGUgdHlwZSBwYXJhbWV0ZXIgdG8gdGhlCiAgICAg IFtEUy5hdHRyXSguLi8uLi9kYXRhI21ldGhvZF9hdHRyKSBmdW5jdGlvbi4K CiAgICAgIFVzYWdlCgogICAgICBgYGBqYXZhc2NyaXB0CiAgICAgIHZhciBh dHRyID0gRFMuYXR0cjsKICAgICAgQXBwLlNjb3JlID0gRFMuTW9kZWwuZXh0 ZW5kKHsKICAgICAgICB2YWx1ZTogYXR0cignbnVtYmVyJyksCiAgICAgICAg cGxheWVyOiBEUy5iZWxvbmdzVG8oJ3BsYXllcicpLAogICAgICAgIGRhdGU6 IGF0dHIoJ2RhdGUnKQogICAgICB9KTsKICAgICAgYGBgCgogICAgICBAY2xh c3MgTnVtYmVyVHJhbnNmb3JtCiAgICAgIEBleHRlbmRzIERTLlRyYW5zZm9y bQogICAgICBAbmFtZXNwYWNlIERTCiAgICAgKi8KICAgIHZhciBOdW1iZXJU cmFuc2Zvcm0gPSBUcmFuc2Zvcm0uZXh0ZW5kKHsKCiAgICAgIGRlc2VyaWFs aXplOiBmdW5jdGlvbihzZXJpYWxpemVkKSB7CiAgICAgICAgcmV0dXJuIGVt cHR5KHNlcmlhbGl6ZWQpID8gbnVsbCA6IE51bWJlcihzZXJpYWxpemVkKTsK ICAgICAgfSwKCiAgICAgIHNlcmlhbGl6ZTogZnVuY3Rpb24oZGVzZXJpYWxp emVkKSB7CiAgICAgICAgcmV0dXJuIGVtcHR5KGRlc2VyaWFsaXplZCkgPyBu dWxsIDogTnVtYmVyKGRlc2VyaWFsaXplZCk7CiAgICAgIH0KICAgIH0pOwoK ICAgIF9fZXhwb3J0c19fWyJkZWZhdWx0Il0gPSBOdW1iZXJUcmFuc2Zvcm07 CiAgfSk7CmRlZmluZSgiZW1iZXItZGF0YS9saWIvdHJhbnNmb3Jtcy9zdHJp bmciLCAKICBbIi4vYmFzZSIsImV4cG9ydHMiXSwKICBmdW5jdGlvbihfX2Rl cGVuZGVuY3kxX18sIF9fZXhwb3J0c19fKSB7CiAgICAidXNlIHN0cmljdCI7 CiAgICB2YXIgVHJhbnNmb3JtID0gX19kZXBlbmRlbmN5MV9fWyJkZWZhdWx0 Il07CiAgICB2YXIgbm9uZSA9IEVtYmVyLmlzTm9uZTsKCiAgICAvKioKICAg ICAgVGhlIGBEUy5TdHJpbmdUcmFuc2Zvcm1gIGNsYXNzIGlzIHVzZWQgdG8g c2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZQogICAgICBzdHJpbmcgYXR0cmli dXRlcyBvbiBFbWJlciBEYXRhIHJlY29yZCBvYmplY3RzLiBUaGlzIHRyYW5z Zm9ybSBpcwogICAgICB1c2VkIHdoZW4gYHN0cmluZ2AgaXMgcGFzc2VkIGFz IHRoZSB0eXBlIHBhcmFtZXRlciB0byB0aGUKICAgICAgW0RTLmF0dHJdKC4u Ly4uL2RhdGEjbWV0aG9kX2F0dHIpIGZ1bmN0aW9uLgoKICAgICAgVXNhZ2UK CiAgICAgIGBgYGphdmFzY3JpcHQKICAgICAgdmFyIGF0dHIgPSBEUy5hdHRy OwogICAgICBBcHAuVXNlciA9IERTLk1vZGVsLmV4dGVuZCh7CiAgICAgICAg aXNBZG1pbjogYXR0cignYm9vbGVhbicpLAogICAgICAgIG5hbWU6IGF0dHIo J3N0cmluZycpLAogICAgICAgIGVtYWlsOiBhdHRyKCdzdHJpbmcnKQogICAg ICB9KTsKICAgICAgYGBgCgogICAgICBAY2xhc3MgU3RyaW5nVHJhbnNmb3Jt CiAgICAgIEBleHRlbmRzIERTLlRyYW5zZm9ybQogICAgICBAbmFtZXNwYWNl IERTCiAgICAgKi8KICAgIHZhciBTdHJpbmdUcmFuc2Zvcm0gPSBUcmFuc2Zv cm0uZXh0ZW5kKHsKCiAgICAgIGRlc2VyaWFsaXplOiBmdW5jdGlvbihzZXJp YWxpemVkKSB7CiAgICAgICAgcmV0dXJuIG5vbmUoc2VyaWFsaXplZCkgPyBu dWxsIDogU3RyaW5nKHNlcmlhbGl6ZWQpOwogICAgICB9LAoKICAgICAgc2Vy aWFsaXplOiBmdW5jdGlvbihkZXNlcmlhbGl6ZWQpIHsKICAgICAgICByZXR1 cm4gbm9uZShkZXNlcmlhbGl6ZWQpID8gbnVsbCA6IFN0cmluZyhkZXNlcmlh bGl6ZWQpOwogICAgICB9CgogICAgfSk7CgogICAgX19leHBvcnRzX19bImRl ZmF1bHQiXSA9IFN0cmluZ1RyYW5zZm9ybTsKICB9KTsKZGVmaW5lKCJlbWJl ci1pbmZsZWN0b3IvbGliL2V4dC9zdHJpbmciLCAKICBbIi4uL3N5c3RlbS9z dHJpbmciXSwKICBmdW5jdGlvbihfX2RlcGVuZGVuY3kxX18pIHsKICAgICJ1 c2Ugc3RyaWN0IjsKICAgIHZhciBwbHVyYWxpemUgPSBfX2RlcGVuZGVuY3kx X18ucGx1cmFsaXplOwogICAgdmFyIHNpbmd1bGFyaXplID0gX19kZXBlbmRl bmN5MV9fLnNpbmd1bGFyaXplOwoKICAgIGlmIChFbWJlci5FWFRFTkRfUFJP VE9UWVBFUyA9PT0gdHJ1ZSB8fCBFbWJlci5FWFRFTkRfUFJPVE9UWVBFUy5T dHJpbmcpIHsKICAgICAgLyoqCiAgICAgICAgU2VlIHt7I2Nyb3NzTGluayAi RW1iZXIuU3RyaW5nL3BsdXJhbGl6ZSJ9fXt7L2Nyb3NzTGlua319CgogICAg ICAgIEBtZXRob2QgcGx1cmFsaXplCiAgICAgICAgQGZvciBTdHJpbmcKICAg ICAgKi8KICAgICAgU3RyaW5nLnByb3RvdHlwZS5wbHVyYWxpemUgPSBmdW5j dGlvbigpIHsKICAgICAgICByZXR1cm4gcGx1cmFsaXplKHRoaXMpOwogICAg ICB9OwoKICAgICAgLyoqCiAgICAgICAgU2VlIHt7I2Nyb3NzTGluayAiRW1i ZXIuU3RyaW5nL3Npbmd1bGFyaXplIn19e3svY3Jvc3NMaW5rfX0KCiAgICAg ICAgQG1ldGhvZCBzaW5ndWxhcml6ZQogICAgICAgIEBmb3IgU3RyaW5nCiAg ICAgICovCiAgICAgIFN0cmluZy5wcm90b3R5cGUuc2luZ3VsYXJpemUgPSBm dW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gc2luZ3VsYXJpemUodGhpcyk7 CiAgICAgIH07CiAgICB9CiAgfSk7CmRlZmluZSgiZW1iZXItaW5mbGVjdG9y L2xpYi9tYWluIiwgCiAgWyIuL3N5c3RlbSIsIi4vZXh0L3N0cmluZyIsImV4 cG9ydHMiXSwKICBmdW5jdGlvbihfX2RlcGVuZGVuY3kxX18sIF9fZGVwZW5k ZW5jeTJfXywgX19leHBvcnRzX18pIHsKICAgICJ1c2Ugc3RyaWN0IjsKICAg IHZhciBJbmZsZWN0b3IgPSBfX2RlcGVuZGVuY3kxX18uSW5mbGVjdG9yOwog ICAgdmFyIGluZmxlY3Rpb25zID0gX19kZXBlbmRlbmN5MV9fLmluZmxlY3Rp b25zOwogICAgdmFyIHBsdXJhbGl6ZSA9IF9fZGVwZW5kZW5jeTFfXy5wbHVy YWxpemU7CiAgICB2YXIgc2luZ3VsYXJpemUgPSBfX2RlcGVuZGVuY3kxX18u c2luZ3VsYXJpemU7CgogICAgSW5mbGVjdG9yLmRlZmF1bHRSdWxlcyA9IGlu ZmxlY3Rpb25zOwogICAgRW1iZXIuSW5mbGVjdG9yICAgICAgICA9IEluZmxl Y3RvcjsKCiAgICBFbWJlci5TdHJpbmcucGx1cmFsaXplICAgPSBwbHVyYWxp emU7CiAgICBFbWJlci5TdHJpbmcuc2luZ3VsYXJpemUgPSBzaW5ndWxhcml6 ZTsKCgogICAgX19leHBvcnRzX19bImRlZmF1bHQiXSA9IEluZmxlY3RvcjsK CiAgICBfX2V4cG9ydHNfXy5wbHVyYWxpemUgPSBwbHVyYWxpemU7CiAgICBf X2V4cG9ydHNfXy5zaW5ndWxhcml6ZSA9IHNpbmd1bGFyaXplOwogIH0pOwpk ZWZpbmUoImVtYmVyLWluZmxlY3Rvci9saWIvc3lzdGVtIiwgCiAgWyIuL3N5 c3RlbS9pbmZsZWN0b3IiLCIuL3N5c3RlbS9zdHJpbmciLCIuL3N5c3RlbS9p bmZsZWN0aW9ucyIsImV4cG9ydHMiXSwKICBmdW5jdGlvbihfX2RlcGVuZGVu Y3kxX18sIF9fZGVwZW5kZW5jeTJfXywgX19kZXBlbmRlbmN5M19fLCBfX2V4 cG9ydHNfXykgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIEluZmxlY3Rv ciA9IF9fZGVwZW5kZW5jeTFfX1siZGVmYXVsdCJdOwoKICAgIHZhciBwbHVy YWxpemUgPSBfX2RlcGVuZGVuY3kyX18ucGx1cmFsaXplOwogICAgdmFyIHNp bmd1bGFyaXplID0gX19kZXBlbmRlbmN5Ml9fLnNpbmd1bGFyaXplOwoKICAg IHZhciBkZWZhdWx0UnVsZXMgPSBfX2RlcGVuZGVuY3kzX19bImRlZmF1bHQi XTsKCiAgICAKICAgIEluZmxlY3Rvci5pbmZsZWN0b3IgPSBuZXcgSW5mbGVj dG9yKGRlZmF1bHRSdWxlcyk7CiAgICAKICAgIF9fZXhwb3J0c19fLkluZmxl Y3RvciA9IEluZmxlY3RvcjsKICAgIF9fZXhwb3J0c19fLnNpbmd1bGFyaXpl ID0gc2luZ3VsYXJpemU7CiAgICBfX2V4cG9ydHNfXy5wbHVyYWxpemUgPSBw bHVyYWxpemU7CiAgICBfX2V4cG9ydHNfXy5kZWZhdWx0UnVsZXMgPSBkZWZh dWx0UnVsZXM7CiAgfSk7CmRlZmluZSgiZW1iZXItaW5mbGVjdG9yL2xpYi9z eXN0ZW0vaW5mbGVjdGlvbnMiLCAKICBbImV4cG9ydHMiXSwKICBmdW5jdGlv bihfX2V4cG9ydHNfXykgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIGRl ZmF1bHRSdWxlcyA9IHsKICAgICAgcGx1cmFsczogWwogICAgICAgIFsvJC8s ICdzJ10sCiAgICAgICAgWy9zJC9pLCAncyddLAogICAgICAgIFsvXihheHx0 ZXN0KWlzJC9pLCAnJDFlcyddLAogICAgICAgIFsvKG9jdG9wfHZpcil1cyQv aSwgJyQxaSddLAogICAgICAgIFsvKG9jdG9wfHZpcilpJC9pLCAnJDFpJ10s CiAgICAgICAgWy8oYWxpYXN8c3RhdHVzKSQvaSwgJyQxZXMnXSwKICAgICAg ICBbLyhidSlzJC9pLCAnJDFzZXMnXSwKICAgICAgICBbLyhidWZmYWx8dG9t YXQpbyQvaSwgJyQxb2VzJ10sCiAgICAgICAgWy8oW3RpXSl1bSQvaSwgJyQx YSddLAogICAgICAgIFsvKFt0aV0pYSQvaSwgJyQxYSddLAogICAgICAgIFsv c2lzJC9pLCAnc2VzJ10sCiAgICAgICAgWy8oPzooW15mXSlmZXwoW2xyXSlm KSQvaSwgJyQxJDJ2ZXMnXSwKICAgICAgICBbLyhoaXZlKSQvaSwgJyQxcydd LAogICAgICAgIFsvKFteYWVpb3V5XXxxdSl5JC9pLCAnJDFpZXMnXSwKICAg ICAgICBbLyh4fGNofHNzfHNoKSQvaSwgJyQxZXMnXSwKICAgICAgICBbLyht YXRyfHZlcnR8aW5kKSg/Oml4fGV4KSQvaSwgJyQxaWNlcyddLAogICAgICAg IFsvXihtfGwpb3VzZSQvaSwgJyQxaWNlJ10sCiAgICAgICAgWy9eKG18bClp Y2UkL2ksICckMWljZSddLAogICAgICAgIFsvXihveCkkL2ksICckMWVuJ10s CiAgICAgICAgWy9eKG94ZW4pJC9pLCAnJDEnXSwKICAgICAgICBbLyhxdWl6 KSQvaSwgJyQxemVzJ10KICAgICAgXSwKCiAgICAgIHNpbmd1bGFyOiBbCiAg ICAgICAgWy9zJC9pLCAnJ10sCiAgICAgICAgWy8oc3MpJC9pLCAnJDEnXSwK ICAgICAgICBbLyhuKWV3cyQvaSwgJyQxZXdzJ10sCiAgICAgICAgWy8oW3Rp XSlhJC9pLCAnJDF1bSddLAogICAgICAgIFsvKChhKW5hbHl8KGIpYXwoZClp YWdub3wocClhcmVudGhlfChwKXJvZ25vfChzKXlub3B8KHQpaGUpKHNpc3xz ZXMpJC9pLCAnJDFzaXMnXSwKICAgICAgICBbLyheYW5hbHkpKHNpc3xzZXMp JC9pLCAnJDFzaXMnXSwKICAgICAgICBbLyhbXmZdKXZlcyQvaSwgJyQxZmUn XSwKICAgICAgICBbLyhoaXZlKXMkL2ksICckMSddLAogICAgICAgIFsvKHRp dmUpcyQvaSwgJyQxJ10sCiAgICAgICAgWy8oW2xyXSl2ZXMkL2ksICckMWYn XSwKICAgICAgICBbLyhbXmFlaW91eV18cXUpaWVzJC9pLCAnJDF5J10sCiAg ICAgICAgWy8ocyllcmllcyQvaSwgJyQxZXJpZXMnXSwKICAgICAgICBbLyht KW92aWVzJC9pLCAnJDFvdmllJ10sCiAgICAgICAgWy8oeHxjaHxzc3xzaCll cyQvaSwgJyQxJ10sCiAgICAgICAgWy9eKG18bClpY2UkL2ksICckMW91c2Un XSwKICAgICAgICBbLyhidXMpKGVzKT8kL2ksICckMSddLAogICAgICAgIFsv KG8pZXMkL2ksICckMSddLAogICAgICAgIFsvKHNob2UpcyQvaSwgJyQxJ10s CiAgICAgICAgWy8oY3Jpc3x0ZXN0KShpc3xlcykkL2ksICckMWlzJ10sCiAg ICAgICAgWy9eKGEpeFtpZV1zJC9pLCAnJDF4aXMnXSwKICAgICAgICBbLyhv Y3RvcHx2aXIpKHVzfGkpJC9pLCAnJDF1cyddLAogICAgICAgIFsvKGFsaWFz fHN0YXR1cykoZXMpPyQvaSwgJyQxJ10sCiAgICAgICAgWy9eKG94KWVuL2ks ICckMSddLAogICAgICAgIFsvKHZlcnR8aW5kKWljZXMkL2ksICckMWV4J10s CiAgICAgICAgWy8obWF0cilpY2VzJC9pLCAnJDFpeCddLAogICAgICAgIFsv KHF1aXopemVzJC9pLCAnJDEnXSwKICAgICAgICBbLyhkYXRhYmFzZSlzJC9p LCAnJDEnXQogICAgICBdLAoKICAgICAgaXJyZWd1bGFyUGFpcnM6IFsKICAg ICAgICBbJ3BlcnNvbicsICdwZW9wbGUnXSwKICAgICAgICBbJ21hbicsICdt ZW4nXSwKICAgICAgICBbJ2NoaWxkJywgJ2NoaWxkcmVuJ10sCiAgICAgICAg WydzZXgnLCAnc2V4ZXMnXSwKICAgICAgICBbJ21vdmUnLCAnbW92ZXMnXSwK ICAgICAgICBbJ2NvdycsICdraW5lJ10sCiAgICAgICAgWyd6b21iaWUnLCAn em9tYmllcyddCiAgICAgIF0sCgogICAgICB1bmNvdW50YWJsZTogWwogICAg ICAgICdlcXVpcG1lbnQnLAogICAgICAgICdpbmZvcm1hdGlvbicsCiAgICAg ICAgJ3JpY2UnLAogICAgICAgICdtb25leScsCiAgICAgICAgJ3NwZWNpZXMn LAogICAgICAgICdzZXJpZXMnLAogICAgICAgICdmaXNoJywKICAgICAgICAn c2hlZXAnLAogICAgICAgICdqZWFucycsCiAgICAgICAgJ3BvbGljZScKICAg ICAgXQogICAgfTsKCiAgICBfX2V4cG9ydHNfX1siZGVmYXVsdCJdID0gZGVm YXVsdFJ1bGVzOwogIH0pOwpkZWZpbmUoImVtYmVyLWluZmxlY3Rvci9saWIv c3lzdGVtL2luZmxlY3RvciIsIAogIFsiZXhwb3J0cyJdLAogIGZ1bmN0aW9u KF9fZXhwb3J0c19fKSB7CiAgICAidXNlIHN0cmljdCI7CiAgICB2YXIgQkxB TktfUkVHRVggPSAvXlxzKiQvOwoKICAgIGZ1bmN0aW9uIGxvYWRVbmNvdW50 YWJsZShydWxlcywgdW5jb3VudGFibGUpIHsKICAgICAgZm9yICh2YXIgaSA9 IDAsIGxlbmd0aCA9IHVuY291bnRhYmxlLmxlbmd0aDsgaSA8IGxlbmd0aDsg aSsrKSB7CiAgICAgICAgcnVsZXMudW5jb3VudGFibGVbdW5jb3VudGFibGVb aV0udG9Mb3dlckNhc2UoKV0gPSB0cnVlOwogICAgICB9CiAgICB9CgogICAg ZnVuY3Rpb24gbG9hZElycmVndWxhcihydWxlcywgaXJyZWd1bGFyUGFpcnMp IHsKICAgICAgdmFyIHBhaXI7CgogICAgICBmb3IgKHZhciBpID0gMCwgbGVu Z3RoID0gaXJyZWd1bGFyUGFpcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysp IHsKICAgICAgICBwYWlyID0gaXJyZWd1bGFyUGFpcnNbaV07CgogICAgICAg IHJ1bGVzLmlycmVndWxhcltwYWlyWzBdLnRvTG93ZXJDYXNlKCldID0gcGFp clsxXTsKICAgICAgICBydWxlcy5pcnJlZ3VsYXJJbnZlcnNlW3BhaXJbMV0u dG9Mb3dlckNhc2UoKV0gPSBwYWlyWzBdOwogICAgICB9CiAgICB9CgogICAg LyoqCiAgICAgIEluZmxlY3Rvci5FbWJlciBwcm92aWRlcyBhIG1lY2hhbmlz bSBmb3Igc3VwcGx5aW5nIGluZmxlY3Rpb24gcnVsZXMgZm9yIHlvdXIKICAg ICAgYXBwbGljYXRpb24uIEVtYmVyIGluY2x1ZGVzIGEgZGVmYXVsdCBzZXQg b2YgaW5mbGVjdGlvbiBydWxlcywgYW5kIHByb3ZpZGVzIGFuCiAgICAgIEFQ SSBmb3IgcHJvdmlkaW5nIGFkZGl0aW9uYWwgcnVsZXMuCgogICAgICBFeGFt cGxlczoKCiAgICAgIENyZWF0aW5nIGFuIGluZmxlY3RvciB3aXRoIG5vIHJ1 bGVzLgoKICAgICAgYGBganMKICAgICAgdmFyIGluZmxlY3RvciA9IG5ldyBF bWJlci5JbmZsZWN0b3IoKTsKICAgICAgYGBgCgogICAgICBDcmVhdGluZyBh biBpbmZsZWN0b3Igd2l0aCB0aGUgZGVmYXVsdCBlbWJlciBydWxlc2V0LgoK ICAgICAgYGBganMKICAgICAgdmFyIGluZmxlY3RvciA9IG5ldyBFbWJlci5J bmZsZWN0b3IoRW1iZXIuSW5mbGVjdG9yLmRlZmF1bHRSdWxlcyk7CgogICAg ICBpbmZsZWN0b3IucGx1cmFsaXplKCdjb3cnKSAvLz0+ICdraW5lJwogICAg ICBpbmZsZWN0b3Iuc2luZ3VsYXJpemUoJ2tpbmUnKSAvLz0+ICdjb3cnCiAg ICAgIGBgYAoKICAgICAgQ3JlYXRpbmcgYW4gaW5mbGVjdG9yIGFuZCBhZGRp bmcgcnVsZXMgbGF0ZXIuCgogICAgICBgYGBqYXZhc2NyaXB0CiAgICAgIHZh ciBpbmZsZWN0b3IgPSBFbWJlci5JbmZsZWN0b3IuaW5mbGVjdG9yOwoKICAg ICAgaW5mbGVjdG9yLnBsdXJhbGl6ZSgnYWR2aWNlJykgLy8gPT4gJ2Fkdmlj ZXMnCiAgICAgIGluZmxlY3Rvci51bmNvdW50YWJsZSgnYWR2aWNlJyk7CiAg ICAgIGluZmxlY3Rvci5wbHVyYWxpemUoJ2FkdmljZScpIC8vID0+ICdhZHZp Y2UnCgogICAgICBpbmZsZWN0b3IucGx1cmFsaXplKCdmb3JtdWxhJykgLy8g PT4gJ2Zvcm11bGFzJwogICAgICBpbmZsZWN0b3IuaXJyZWd1bGFyKCdmb3Jt dWxhJywgJ2Zvcm11bGFlJyk7CiAgICAgIGluZmxlY3Rvci5wbHVyYWxpemUo J2Zvcm11bGEnKSAvLyA9PiAnZm9ybXVsYWUnCgogICAgICAvLyB5b3Ugd291 bGQgbm90IG5lZWQgdG8gYWRkIHRoZXNlIGFzIHRoZXkgYXJlIHRoZSBkZWZh dWx0IHJ1bGVzCiAgICAgIGluZmxlY3Rvci5wbHVyYWwoLyQvLCAncycpOwog ICAgICBpbmZsZWN0b3Iuc2luZ3VsYXIoL3MkL2ksICcnKTsKICAgICAgYGBg CgogICAgICBDcmVhdGluZyBhbiBpbmZsZWN0b3Igd2l0aCBhIG5vbmRlZmF1 bHQgcnVsZXNldC4KCiAgICAgIGBgYGphdmFzY3JpcHQKICAgICAgdmFyIHJ1 bGVzID0gewogICAgICAgIHBsdXJhbHM6ICBbIC8kLywgJ3MnIF0sCiAgICAg ICAgc2luZ3VsYXI6IFsgL1xzJC8sICcnIF0sCiAgICAgICAgaXJyZWd1bGFy UGFpcnM6IFsKICAgICAgICAgIFsgJ2NvdycsICdraW5lJyBdCiAgICAgICAg XSwKICAgICAgICB1bmNvdW50YWJsZTogWyAnZmlzaCcgXQogICAgICB9OwoK ICAgICAgdmFyIGluZmxlY3RvciA9IG5ldyBFbWJlci5JbmZsZWN0b3IocnVs ZXMpOwogICAgICBgYGAKCiAgICAgIEBjbGFzcyBJbmZsZWN0b3IKICAgICAg QG5hbWVzcGFjZSBFbWJlcgogICAgKi8KICAgIGZ1bmN0aW9uIEluZmxlY3Rv cihydWxlU2V0KSB7CiAgICAgIHJ1bGVTZXQgPSBydWxlU2V0IHx8IHt9Owog ICAgICBydWxlU2V0LnVuY291bnRhYmxlID0gcnVsZVNldC51bmNvdW50YWJs ZSB8fCB7fTsKICAgICAgcnVsZVNldC5pcnJlZ3VsYXJQYWlycyA9IHJ1bGVT ZXQuaXJyZWd1bGFyUGFpcnMgfHwge307CgogICAgICB2YXIgcnVsZXMgPSB0 aGlzLnJ1bGVzID0gewogICAgICAgIHBsdXJhbHM6ICBydWxlU2V0LnBsdXJh bHMgfHwgW10sCiAgICAgICAgc2luZ3VsYXI6IHJ1bGVTZXQuc2luZ3VsYXIg fHwgW10sCiAgICAgICAgaXJyZWd1bGFyOiB7fSwKICAgICAgICBpcnJlZ3Vs YXJJbnZlcnNlOiB7fSwKICAgICAgICB1bmNvdW50YWJsZToge30KICAgICAg fTsKCiAgICAgIGxvYWRVbmNvdW50YWJsZShydWxlcywgcnVsZVNldC51bmNv dW50YWJsZSk7CiAgICAgIGxvYWRJcnJlZ3VsYXIocnVsZXMsIHJ1bGVTZXQu aXJyZWd1bGFyUGFpcnMpOwogICAgfQoKICAgIEluZmxlY3Rvci5wcm90b3R5 cGUgPSB7CiAgICAgIC8qKgogICAgICAgIEBtZXRob2QgcGx1cmFsCiAgICAg ICAgQHBhcmFtIHtSZWdFeHB9IHJlZ2V4CiAgICAgICAgQHBhcmFtIHtTdHJp bmd9IHN0cmluZwogICAgICAqLwogICAgICBwbHVyYWw6IGZ1bmN0aW9uKHJl Z2V4LCBzdHJpbmcpIHsKICAgICAgICB0aGlzLnJ1bGVzLnBsdXJhbHMucHVz aChbcmVnZXgsIHN0cmluZy50b0xvd2VyQ2FzZSgpXSk7CiAgICAgIH0sCgog ICAgICAvKioKICAgICAgICBAbWV0aG9kIHNpbmd1bGFyCiAgICAgICAgQHBh cmFtIHtSZWdFeHB9IHJlZ2V4CiAgICAgICAgQHBhcmFtIHtTdHJpbmd9IHN0 cmluZwogICAgICAqLwogICAgICBzaW5ndWxhcjogZnVuY3Rpb24ocmVnZXgs IHN0cmluZykgewogICAgICAgIHRoaXMucnVsZXMuc2luZ3VsYXIucHVzaChb cmVnZXgsIHN0cmluZy50b0xvd2VyQ2FzZSgpXSk7CiAgICAgIH0sCgogICAg ICAvKioKICAgICAgICBAbWV0aG9kIHVuY291bnRhYmxlCiAgICAgICAgQHBh cmFtIHtTdHJpbmd9IHJlZ2V4CiAgICAgICovCiAgICAgIHVuY291bnRhYmxl OiBmdW5jdGlvbihzdHJpbmcpIHsKICAgICAgICBsb2FkVW5jb3VudGFibGUo dGhpcy5ydWxlcywgW3N0cmluZy50b0xvd2VyQ2FzZSgpXSk7CiAgICAgIH0s CgogICAgICAvKioKICAgICAgICBAbWV0aG9kIGlycmVndWxhcgogICAgICAg IEBwYXJhbSB7U3RyaW5nfSBzaW5ndWxhcgogICAgICAgIEBwYXJhbSB7U3Ry aW5nfSBwbHVyYWwKICAgICAgKi8KICAgICAgaXJyZWd1bGFyOiBmdW5jdGlv biAoc2luZ3VsYXIsIHBsdXJhbCkgewogICAgICAgIGxvYWRJcnJlZ3VsYXIo dGhpcy5ydWxlcywgW1tzaW5ndWxhciwgcGx1cmFsXV0pOwogICAgICB9LAoK ICAgICAgLyoqCiAgICAgICAgQG1ldGhvZCBwbHVyYWxpemUKICAgICAgICBA cGFyYW0ge1N0cmluZ30gd29yZAogICAgICAqLwogICAgICBwbHVyYWxpemU6 IGZ1bmN0aW9uKHdvcmQpIHsKICAgICAgICByZXR1cm4gdGhpcy5pbmZsZWN0 KHdvcmQsIHRoaXMucnVsZXMucGx1cmFscywgdGhpcy5ydWxlcy5pcnJlZ3Vs YXIpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAgQG1ldGhvZCBzaW5n dWxhcml6ZQogICAgICAgIEBwYXJhbSB7U3RyaW5nfSB3b3JkCiAgICAgICov CiAgICAgIHNpbmd1bGFyaXplOiBmdW5jdGlvbih3b3JkKSB7CiAgICAgICAg cmV0dXJuIHRoaXMuaW5mbGVjdCh3b3JkLCB0aGlzLnJ1bGVzLnNpbmd1bGFy LCAgdGhpcy5ydWxlcy5pcnJlZ3VsYXJJbnZlcnNlKTsKICAgICAgfSwKCiAg ICAgIC8qKgogICAgICAgIEBwcm90ZWN0ZWQKCiAgICAgICAgQG1ldGhvZCBp bmZsZWN0CiAgICAgICAgQHBhcmFtIHtTdHJpbmd9IHdvcmQKICAgICAgICBA cGFyYW0ge09iamVjdH0gdHlwZVJ1bGVzCiAgICAgICAgQHBhcmFtIHtPYmpl Y3R9IGlycmVndWxhcgogICAgICAqLwogICAgICBpbmZsZWN0OiBmdW5jdGlv bih3b3JkLCB0eXBlUnVsZXMsIGlycmVndWxhcikgewogICAgICAgIHZhciBp bmZsZWN0aW9uLCBzdWJzdGl0dXRpb24sIHJlc3VsdCwgbG93ZXJjYXNlLCBp c0JsYW5rLAogICAgICAgIGlzVW5jb3VudGFibGUsIGlzSXJyZWd1bGFyLCBp c0lycmVndWxhckludmVyc2UsIHJ1bGU7CgogICAgICAgIGlzQmxhbmsgPSBC TEFOS19SRUdFWC50ZXN0KHdvcmQpOwoKICAgICAgICBpZiAoaXNCbGFuaykg ewogICAgICAgICAgcmV0dXJuIHdvcmQ7CiAgICAgICAgfQoKICAgICAgICBs b3dlcmNhc2UgPSB3b3JkLnRvTG93ZXJDYXNlKCk7CgogICAgICAgIGlzVW5j b3VudGFibGUgPSB0aGlzLnJ1bGVzLnVuY291bnRhYmxlW2xvd2VyY2FzZV07 CgogICAgICAgIGlmIChpc1VuY291bnRhYmxlKSB7CiAgICAgICAgICByZXR1 cm4gd29yZDsKICAgICAgICB9CgogICAgICAgIGlzSXJyZWd1bGFyID0gaXJy ZWd1bGFyICYmIGlycmVndWxhcltsb3dlcmNhc2VdOwoKICAgICAgICBpZiAo aXNJcnJlZ3VsYXIpIHsKICAgICAgICAgIHJldHVybiBpc0lycmVndWxhcjsK ICAgICAgICB9CgogICAgICAgIGZvciAodmFyIGkgPSB0eXBlUnVsZXMubGVu Z3RoLCBtaW4gPSAwOyBpID4gbWluOyBpLS0pIHsKICAgICAgICAgICBpbmZs ZWN0aW9uID0gdHlwZVJ1bGVzW2ktMV07CiAgICAgICAgICAgcnVsZSA9IGlu ZmxlY3Rpb25bMF07CgogICAgICAgICAgaWYgKHJ1bGUudGVzdCh3b3JkKSkg ewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9Cgog ICAgICAgIGluZmxlY3Rpb24gPSBpbmZsZWN0aW9uIHx8IFtdOwoKICAgICAg ICBydWxlID0gaW5mbGVjdGlvblswXTsKICAgICAgICBzdWJzdGl0dXRpb24g PSBpbmZsZWN0aW9uWzFdOwoKICAgICAgICByZXN1bHQgPSB3b3JkLnJlcGxh Y2UocnVsZSwgc3Vic3RpdHV0aW9uKTsKCiAgICAgICAgcmV0dXJuIHJlc3Vs dDsKICAgICAgfQogICAgfTsKCiAgICBfX2V4cG9ydHNfX1siZGVmYXVsdCJd ID0gSW5mbGVjdG9yOwogIH0pOwpkZWZpbmUoImVtYmVyLWluZmxlY3Rvci9s aWIvc3lzdGVtL3N0cmluZyIsIAogIFsiLi9pbmZsZWN0b3IiLCJleHBvcnRz Il0sCiAgZnVuY3Rpb24oX19kZXBlbmRlbmN5MV9fLCBfX2V4cG9ydHNfXykg ewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyIEluZmxlY3RvciA9IF9fZGVw ZW5kZW5jeTFfX1siZGVmYXVsdCJdOwogICAgdmFyIHBsdXJhbGl6ZSA9IGZ1 bmN0aW9uKHdvcmQpIHsKICAgICAgcmV0dXJuIEluZmxlY3Rvci5pbmZsZWN0 b3IucGx1cmFsaXplKHdvcmQpOwogICAgfTsKCiAgICB2YXIgc2luZ3VsYXJp emUgPSBmdW5jdGlvbih3b3JkKSB7CiAgICAgIHJldHVybiBJbmZsZWN0b3Iu aW5mbGVjdG9yLnNpbmd1bGFyaXplKHdvcmQpOwogICAgfTsKCiAgICBfX2V4 cG9ydHNfXy5wbHVyYWxpemUgPSBwbHVyYWxpemU7CiAgICBfX2V4cG9ydHNf Xy5zaW5ndWxhcml6ZSA9IHNpbmd1bGFyaXplOwogIH0pOwpnbG9iYWwuRFMg PSByZXF1aXJlTW9kdWxlKCdlbWJlci1kYXRhL2xpYi9tYWluJylbJ2RlZmF1 bHQnXTsKfSh3aW5kb3cpKTs= http_version: recorded_at: Mon, 17 Feb 2014 11:45:44 GMT - request: method: get uri: http://builds.emberjs.com/canary/ember-data.min.js body: encoding: US-ASCII string: '' headers: Accept-Encoding: - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 Accept: - '*/*' User-Agent: - Ruby Host: - builds.emberjs.com response: status: code: 200 message: OK headers: X-Amz-Id-2: - 83FbaUI6nAzNqWrSV6XqdLWVi90Qd6MBxuKu9bNAL7h2YTfd/ZeZ8CriiRCZsWSS X-Amz-Request-Id: - 569026FE3739F03A Date: - Mon, 17 Feb 2014 11:45:45 GMT Last-Modified: - Sun, 16 Feb 2014 16:28:11 GMT Etag: - '"eff8fe234419dce301768c27e3155fa1"' Content-Type: - text/javascript Content-Length: - '74771' Server: - AmazonS3 body: encoding: UTF-8 string: |- /*! * @overview Ember Data * @copyright Copyright 2011-2014 Tilde Inc. and contributors. * Portions Copyright 2011 LivingSocial Inc. * @license Licensed under MIT license (see license.js) * @version 1.0.0-beta.7+canary.3ce5e0e5 */ !function(a){var b,c,d,e;!function(){var a={},f={};b=function(b,c,d){a[b]={deps:c,callback:d}},e=d=c=function(b){function d(a){if("."!==a.charAt(0))return a;for(var c=a.split("/"),d=b.split("/").slice(0,-1),e=0,f=c.length;f>e;e++){var g=c[e];if(".."===g)d.pop();else{if("."===g)continue;d.push(g)}}return d.join("/")}if(e._eak_seen=a,f[b])return f[b];if(f[b]={},!a[b])throw new Error("Could not find module "+b);for(var g,h=a[b],i=h.deps,j=h.callback,k=[],l=0,m=i.length;m>l;l++)k.push("exports"===i[l]?g={}:c(d(i[l])));var n=j.apply(this,k);return f[b]=g||n}}(),b("activemodel-adapter/lib/initializers",["../../ember-data/lib/system/container_proxy","./system/active_model_serializer","./system/active_model_adapter"],function(a,b,c){"use strict";var d=a["default"],e=b["default"],f=c["default"];Ember.onLoad("Ember.Application",function(a){a.initializer({name:"activeModelAdapter",initialize:function(a,b){var c=new d(a);c.registerDeprecations([{deprecated:"serializer:_ams",valid:"serializer:-active-model"},{deprecated:"adapter:_ams",valid:"adapter:-active-model"}]),b.register("serializer:-active-model",e),b.register("adapter:-active-model",f)}})})}),b("activemodel-adapter/lib/main",["./system","./initializers","exports"],function(a,b,c){"use strict";var d=a.ActiveModelAdapter,e=a.ActiveModelSerializer,f=a.EmbeddedRecordsMixin;c.ActiveModelAdapter=d,c.ActiveModelSerializer=e,c.EmbeddedRecordsMixin=f}),b("activemodel-adapter/lib/system",["./system/embedded_records_mixin","./system/active_model_adapter","./system/active_model_serializer","exports"],function(a,b,c,d){"use strict";var e=a["default"],f=b["default"],g=c["default"];d.EmbeddedRecordsMixin=e,d.ActiveModelAdapter=f,d.ActiveModelSerializer=g}),b("activemodel-adapter/lib/system/active_model_adapter",["../../../ember-data/lib/adapters","../../../ember-data/lib/system/adapter","../../../ember-inflector/lib/main","./active_model_serializer","./embedded_records_mixin","exports"],function(a,b,c,d,e,f){"use strict";var g=a.RESTAdapter,h=b.InvalidError,i=c.pluralize,j=(d["default"],e["default"],Ember.EnumerableUtils.forEach),k=Ember.String.decamelize,l=Ember.String.underscore,m=g.extend({defaultSerializer:"-active-model",pathForType:function(a){var b=k(a),c=l(b);return i(c)},ajaxError:function(a){var b=this._super(a);if(a&&422===a.status){var c=Ember.$.parseJSON(a.responseText),d={};if(void 0!==c.errors){var e=c.errors;j(Ember.keys(e),function(a){d[Ember.String.camelize(a)]=e[a]})}return new h(d)}return b}});f["default"]=m}),b("activemodel-adapter/lib/system/active_model_serializer",["../../../ember-inflector/lib/main","../../../ember-data/lib/serializers/rest_serializer","exports"],function(a,b,c){"use strict";var d=a.singularize,e=b["default"],f=Ember.get,g=Ember.EnumerableUtils.forEach,h=Ember.String.camelize,i=Ember.String.capitalize,j=Ember.String.decamelize,k=Ember.String.underscore,l=e.extend({keyForAttribute:function(a){return j(a)},keyForRelationship:function(a,b){return a=j(a),"belongsTo"===b?a+"_id":"hasMany"===b?d(a)+"_ids":a},serializeHasMany:Ember.K,serializeIntoHash:function(a,b,c,d){var e=k(j(b.typeKey));a[e]=this.serialize(c,d)},serializePolymorphicType:function(a,b,c){var d=c.key,e=f(a,d);d=this.keyForAttribute(d),b[d+"_type"]=i(h(e.constructor.typeKey))},typeForRoot:function(a){var b=h(a);return d(b)},normalize:function(a,b,c){return this.normalizeLinks(b),this._super(a,b,c)},normalizeLinks:function(a){if(a.links){var b=a.links;for(var c in b){var d=h(c);d!==c&&(b[d]=b[c],delete b[c])}}},normalizeRelationships:function(a,b){var c,d;this.keyForRelationship&&a.eachRelationship(function(a,e){if(e.options.polymorphic){if(c=this.keyForAttribute(a),d=b[c],d&&d.type)d.type=this.typeForRoot(d.type);else if(d&&"hasMany"===e.kind){var f=this;g(d,function(a){a.type=f.typeForRoot(a.type)})}}else c=this.keyForRelationship(a,e.kind),d=b[c];b[a]=d,a!==c&&delete b[c]},this)}});c["default"]=l}),b("activemodel-adapter/lib/system/embedded_records_mixin",["../../../ember-inflector/lib/main","exports"],function(a,b){"use strict";function c(a,b,f,g,h){var i=d(b,"attrs");i&&f.eachRelationship(function(b,f){var j,k,l,m,n=i[b],o=a.serializerFor(f.type.typeKey),p=d(o,"primaryKey");if("hasMany"===f.kind&&n&&("always"===n.embedded||"load"===n.embedded)){if(k="_"+Ember.String.pluralize(f.type.typeKey),j=this.keyForRelationship(b,f.kind),l=this.keyForAttribute(b),m=[],!g[l])return;h[k]=h[k]||[],e(g[l],function(b){var d=a.modelFor(f.type.typeKey);c(a,o,d,b,h),m.push(b[p]),h[k].push(b)}),g[j]=m,delete g[l]}},b)}var d=Ember.get,e=Ember.EnumerableUtils.forEach,f=a.pluralize,g=Ember.Mixin.create({serializeHasMany:function(a,b,c){var e=c.key,f=d(this,"attrs"),g=f&&f[e]&&"always"===f[e].embedded;g&&(b[this.keyForAttribute(e)]=d(a,e).map(function(a){var b=a.serialize(),c=d(this,"primaryKey");return b[c]=d(a,c),b},this))},extractSingle:function(a,b,d,e,f){var g=this.keyForAttribute(b.typeKey),h=d[g];return c(a,this,b,h,d),this._super(a,b,d,e,f)},extractArray:function(a,b,d){var g=this.keyForAttribute(b.typeKey),h=d[f(g)];return e(h,function(e){c(a,this,b,e,d)},this),this._super(a,b,d)}});b["default"]=g}),b("ember-data/lib/adapters",["./adapters/fixture_adapter","./adapters/rest_adapter","exports"],function(a,b,c){"use strict";var d=a["default"],e=b["default"];c.RESTAdapter=e,c.FixtureAdapter=d}),b("ember-data/lib/adapters/fixture_adapter",["../system/adapter","exports"],function(a,b){"use strict";var c=Ember.get,d=Ember.String.fmt,e=Ember.EnumerableUtils.indexOf,f=0,g=a["default"],h=g.extend({serializer:null,simulateRemoteResponse:!0,latency:50,fixturesForType:function(a){if(a.FIXTURES){var b=Ember.A(a.FIXTURES);return b.map(function(a){var b=typeof a.id;if("number"!==b&&"string"!==b)throw new Error(d("the id property must be defined as a number or string for fixture %@",[a]));return a.id=a.id+"",a})}return null},queryFixtures:function(){},updateFixtures:function(a,b){a.FIXTURES||(a.FIXTURES=[]);var c=a.FIXTURES;this.deleteLoadedFixture(a,b),c.push(b)},mockJSON:function(a,b,c){return a.serializerFor(b).serialize(c,{includeId:!0})},generateIdForRecord:function(){return"fixture-"+f++},find:function(a,b,c){var d,e=this.fixturesForType(b);return e&&(d=Ember.A(e).findProperty("id",c)),d?this.simulateRemoteCall(function(){return d},this):void 0},findMany:function(a,b,c){var d=this.fixturesForType(b);return d&&(d=d.filter(function(a){return-1!==e(c,a.id)})),d?this.simulateRemoteCall(function(){return d},this):void 0},findAll:function(a,b){var c=this.fixturesForType(b);return this.simulateRemoteCall(function(){return c},this)},findQuery:function(a,b,c){var d=this.fixturesForType(b);return d=this.queryFixtures(d,c,b),d?this.simulateRemoteCall(function(){return d},this):void 0},createRecord:function(a,b,c){var d=this.mockJSON(a,b,c);return this.updateFixtures(b,d),this.simulateRemoteCall(function(){return d},this)},updateRecord:function(a,b,c){var d=this.mockJSON(a,b,c);return this.updateFixtures(b,d),this.simulateRemoteCall(function(){return d},this)},deleteRecord:function(a,b,c){var d=this.mockJSON(a,b,c);return this.deleteLoadedFixture(b,d),this.simulateRemoteCall(function(){return null})},deleteLoadedFixture:function(a,b){var c=this.findExistingFixture(a,b);if(c){var d=e(a.FIXTURES,c);return a.FIXTURES.splice(d,1),!0}},findExistingFixture:function(a,b){var d=this.fixturesForType(a),e=c(b,"id");return this.findFixtureById(d,e)},findFixtureById:function(a,b){return Ember.A(a).find(function(a){return""+c(a,"id")==""+b?!0:!1})},simulateRemoteCall:function(a,b){var d=this;return new Ember.RSVP.Promise(function(e){c(d,"simulateRemoteResponse")?Ember.run.later(function(){e(a.call(b))},c(d,"latency")):Ember.run.schedule("actions",null,function(){e(a.call(b))})},"DS: FixtureAdapter#simulateRemoteCall")}});b["default"]=h}),b("ember-data/lib/adapters/rest_adapter",["../system/adapter","exports"],function(a,b){"use strict";var c=a["default"],d=Ember.get,e=(Ember.set,Ember.ArrayPolyfills.forEach),f=c.extend({defaultSerializer:"-rest",find:function(a,b,c){return this.ajax(this.buildURL(b.typeKey,c),"GET")},findAll:function(a,b,c){var d;return c&&(d={since:c}),this.ajax(this.buildURL(b.typeKey),"GET",{data:d})},findQuery:function(a,b,c){return this.ajax(this.buildURL(b.typeKey),"GET",{data:c})},findMany:function(a,b,c){return this.ajax(this.buildURL(b.typeKey),"GET",{data:{ids:c}})},findHasMany:function(a,b,c){var e=d(this,"host"),f=d(b,"id"),g=b.constructor.typeKey;return e&&"/"===c.charAt(0)&&"/"!==c.charAt(1)&&(c=e+c),this.ajax(this.urlPrefix(c,this.buildURL(g,f)),"GET")},findBelongsTo:function(a,b,c){var e=d(b,"id"),f=b.constructor.typeKey;return this.ajax(this.urlPrefix(c,this.buildURL(f,e)),"GET")},createRecord:function(a,b,c){var d={},e=a.serializerFor(b.typeKey);return e.serializeIntoHash(d,b,c,{includeId:!0}),this.ajax(this.buildURL(b.typeKey),"POST",{data:d})},updateRecord:function(a,b,c){var e={},f=a.serializerFor(b.typeKey);f.serializeIntoHash(e,b,c);var g=d(c,"id");return this.ajax(this.buildURL(b.typeKey,g),"PUT",{data:e})},deleteRecord:function(a,b,c){var e=d(c,"id");return this.ajax(this.buildURL(b.typeKey,e),"DELETE")},buildURL:function(a,b){var c=[],e=d(this,"host"),f=this.urlPrefix();return a&&c.push(this.pathForType(a)),b&&c.push(b),f&&c.unshift(f),c=c.join("/"),!e&&c&&(c="/"+c),c},urlPrefix:function(a,b){var c=d(this,"host"),e=d(this,"namespace"),f=[];return a?"/"===a.charAt(0)?c&&(a=a.slice(1),f.push(c)):/^http(s)?:\/\//.test(a)||f.push(b):(c&&f.push(c),e&&f.push(e)),a&&f.push(a),f.join("/")},pathForType:function(a){var b=Ember.String.camelize(a);return Ember.String.pluralize(b)},ajaxError:function(a){return a&&(a.then=null),a},ajax:function(a,b,c){var d=this;return new Ember.RSVP.Promise(function(e,f){c=d.ajaxOptions(a,b,c),c.success=function(a){Ember.run(null,e,a)},c.error=function(a){Ember.run(null,f,d.ajaxError(a))},Ember.$.ajax(c)},"DS: RestAdapter#ajax "+b+" to "+a)},ajaxOptions:function(a,b,c){if(c=c||{},c.url=a,c.type=b,c.dataType="json",c.context=this,c.data&&"GET"!==b&&(c.contentType="application/json; charset=utf-8",c.data=JSON.stringify(c.data)),void 0!==this.headers){var d=this.headers;c.beforeSend=function(a){e.call(Ember.keys(d),function(b){a.setRequestHeader(b,d[b])})}}return c}});b["default"]=f}),b("ember-data/lib/core",["exports"],function(a){"use strict";var b;"undefined"==typeof b&&(b=Ember.Namespace.create({VERSION:"1.0.0-beta.7+canary.3ce5e0e5"}),"undefined"!=typeof window&&(window.DS=b),Ember.libraries&&Ember.libraries.registerCoreLibrary("Ember Data",b.VERSION)),a["default"]=b}),b("ember-data/lib/ext/date",[],function(){"use strict";Ember.Date=Ember.Date||{};var a=Date.parse,b=[1,4,5,6,7,10,11];Ember.Date.parse=function(c){var d,e,f=0;if(e=/^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/.exec(c)){for(var g,h=0;g=b[h];++h)e[g]=+e[g]||0;e[2]=(+e[2]||1)-1,e[3]=+e[3]||1,"Z"!==e[8]&&void 0!==e[9]&&(f=60*e[10]+e[11],"+"===e[9]&&(f=0-f)),d=Date.UTC(e[1],e[2],e[3],e[4],e[5]+f,e[6],e[7])}else d=a?a(c):0/0;return d},(Ember.EXTEND_PROTOTYPES===!0||Ember.EXTEND_PROTOTYPES.Date)&&(Date.parse=Ember.Date.parse)}),b("ember-data/lib/initializers",["./system/store","./serializers","./adapters","./system/debug/debug_adapter","./system/container_proxy","./transforms"],function(a,b,c,d,e,f){"use strict";{var g=a["default"],h=b.JSONSerializer,i=b.RESTSerializer,j=c.RESTAdapter,k=d["default"],l=e["default"],m=f.BooleanTransform,n=f.DateTransform,o=f.StringTransform,p=f.NumberTransform;Ember.set}Ember.onLoad("Ember.Application",function(a){a.initializer({name:"store",initialize:function(a,b){b.register("store:main",b.Store||g);var c=new l(a);c.registerDeprecations([{deprecated:"serializer:_default",valid:"serializer:-default"},{deprecated:"serializer:_rest",valid:"serializer:-rest"},{deprecated:"adapter:_rest",valid:"adapter:-rest"}]),b.register("serializer:-default",h),b.register("serializer:-rest",i),b.register("adapter:-rest",j),a.lookup("store:main")}}),a.initializer({name:"transforms",before:"store",initialize:function(a,b){b.register("transform:boolean",m),b.register("transform:date",n),b.register("transform:number",p),b.register("transform:string",o)}}),a.initializer({name:"data-adapter",before:"store",initialize:function(a,b){b.register("data-adapter:main",k)}}),a.initializer({name:"injectStore",before:"store",initialize:function(a,b){b.inject("controller","store","store:main"),b.inject("route","store","store:main"),b.inject("serializer","store","store:main"),b.inject("data-adapter","store","store:main")}})})}),b("ember-data/lib/main",["./core","./ext/date","./system/store","./system/model","./system/changes","./system/adapter","./system/debug","./system/record_arrays","./system/record_array_manager","./adapters","./serializers/json_serializer","./serializers/rest_serializer","../../ember-inflector/lib/main","../../activemodel-adapter/lib/main","./transforms","./system/relationships","./initializers","./system/container_proxy","exports"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s){"use strict";Ember.RSVP.Promise.cast=Ember.RSVP.Promise.cast||Ember.RSVP.resolve;var t=a["default"],u=c.Store,v=c.PromiseArray,w=c.PromiseObject,x=d.Model,y=d.Errors,z=d.RootState,A=d.attr,B=e.AttributeChange,C=e.RelationshipChange,D=e.RelationshipChangeAdd,E=(e.RelationshipChangeRemove,e.OneToManyChange),F=(e.ManyToNoneChange,e.OneToOneChange),G=e.ManyToManyChange,H=f.InvalidError,I=f.Adapter,J=g["default"],K=h.RecordArray,L=h.FilteredRecordArray,M=h.AdapterPopulatedRecordArray,N=h.ManyArray,O=i["default"],P=j.RESTAdapter,Q=j.FixtureAdapter,R=k["default"],S=l["default"],T=n.ActiveModelAdapter,U=n.ActiveModelSerializer,V=n.EmbeddedRecordsMixin,W=o.Transform,X=o.DateTransform,Y=o.NumberTransform,Z=o.StringTransform,$=o.BooleanTransform,_=p.hasMany,ab=p.belongsTo,bb=r["default"];t.Store=u,t.PromiseArray=v,t.PromiseObject=w,t.Model=x,t.RootState=z,t.attr=A,t.Errors=y,t.AttributeChange=B,t.RelationshipChange=C,t.RelationshipChangeAdd=D,t.OneToManyChange=E,t.ManyToNoneChange=E,t.OneToOneChange=F,t.ManyToManyChange=G,t.Adapter=I,t.InvalidError=H,t.DebugAdapter=J,t.RecordArray=K,t.FilteredRecordArray=L,t.AdapterPopulatedRecordArray=M,t.ManyArray=N,t.RecordArrayManager=O,t.RESTAdapter=P,t.FixtureAdapter=Q,t.RESTSerializer=S,t.JSONSerializer=R,t.Transform=W,t.DateTransform=X,t.StringTransform=Z,t.NumberTransform=Y,t.BooleanTransform=$,t.ActiveModelAdapter=T,t.ActiveModelSerializer=U,t.EmbeddedRecordsMixin=V,t.belongsTo=ab,t.hasMany=_,t.ContainerProxy=bb,s["default"]=t}),b("ember-data/lib/serializers",["./serializers/json_serializer","./serializers/rest_serializer","exports"],function(a,b,c){"use strict";var d=a["default"],e=b["default"];c.JSONSerializer=d,c.RESTSerializer=e}),b("ember-data/lib/serializers/json_serializer",["exports"],function(a){"use strict";var b=Ember.get,c=(Ember.set,Ember.isNone),d=Ember.Object.extend({primaryKey:"id",applyTransforms:function(a,b){return a.eachTransformedAttribute(function(a,c){var d=this.transformFor(c);b[a]=d.deserialize(b[a])},this),b},normalize:function(a,b){return b?(this.applyTransforms(a,b),b):b},serialize:function(a,c){var d={};if(c&&c.includeId){var e=b(a,"id");e&&(d[b(this,"primaryKey")]=e)}return a.eachAttribute(function(b,c){this.serializeAttribute(a,d,b,c)},this),a.eachRelationship(function(b,c){"belongsTo"===c.kind?this.serializeBelongsTo(a,d,c):"hasMany"===c.kind&&this.serializeHasMany(a,d,c)},this),d},serializeAttribute:function(a,c,d,e){var f=b(this,"attrs"),g=b(a,d),h=e.type;if(h){var i=this.transformFor(h);g=i.serialize(g)}d=f&&f[d]||(this.keyForAttribute?this.keyForAttribute(d):d),c[d]=g},serializeBelongsTo:function(a,d,e){var f=e.key,g=b(a,f);f=this.keyForRelationship?this.keyForRelationship(f,"belongsTo"):f,d[f]=c(g)?g:b(g,"id"),e.options.polymorphic&&this.serializePolymorphicType(a,d,e)},serializeHasMany:function(a,c,d){var e=d.key,f=DS.RelationshipChange.determineRelationshipType(a.constructor,d);("manyToNone"===f||"manyToMany"===f)&&(c[e]=b(a,e).mapBy("id"))},serializePolymorphicType:Ember.K,extract:function(a,b,c,d,e){this.extractMeta(a,b,c);var f="extract"+e.charAt(0).toUpperCase()+e.substr(1);return this[f](a,b,c,d,e)},extractFindAll:function(a,b,c){return this.extractArray(a,b,c)},extractFindQuery:function(a,b,c){return this.extractArray(a,b,c)},extractFindMany:function(a,b,c){return this.extractArray(a,b,c)},extractFindHasMany:function(a,b,c){return this.extractArray(a,b,c)},extractCreateRecord:function(a,b,c){return this.extractSave(a,b,c)},extractUpdateRecord:function(a,b,c){return this.extractSave(a,b,c)},extractDeleteRecord:function(a,b,c){return this.extractSave(a,b,c)},extractFind:function(a,b,c){return this.extractSingle(a,b,c)},extractFindBelongsTo:function(a,b,c){return this.extractSingle(a,b,c)},extractSave:function(a,b,c){return this.extractSingle(a,b,c)},extractSingle:function(a,b,c){return this.normalize(b,c)},extractArray:function(a,b,c){return this.normalize(b,c)},extractMeta:function(a,b,c){c&&c.meta&&(a.metaForType(b,c.meta),delete c.meta)},transformFor:function(a){var b=this.container.lookup("transform:"+a);return b}});a["default"]=d}),b("ember-data/lib/serializers/rest_serializer",["./json_serializer","exports"],function(a,b){"use strict";function c(a){return null==a?null:a+""}var d=a["default"],e=Ember.get,f=(Ember.set,Ember.ArrayPolyfills.forEach),g=Ember.ArrayPolyfills.map,h=d.extend({normalize:function(a,b,c){return this.normalizeId(b),this.normalizeAttributes(a,b),this.normalizeRelationships(a,b),this.normalizeUsingDeclaredMapping(a,b),this.normalizeHash&&this.normalizeHash[c]&&this.normalizeHash[c](b),this._super(a,b,c)},normalizePayload:function(a,b){return b},normalizeId:function(a){var b=e(this,"primaryKey");"id"!==b&&(a.id=a[b],delete a[b])},normalizeUsingDeclaredMapping:function(a,b){var c,d,f=e(this,"attrs");if(f)for(d in f)c=f[d],c&&c.key&&(c=c.key),"string"==typeof c&&(b[d]=b[c],delete b[c])},normalizeAttributes:function(a,b){var c;this.keyForAttribute&&a.eachAttribute(function(a){c=this.keyForAttribute(a),a!==c&&(b[a]=b[c],delete b[c])},this)},normalizeRelationships:function(a,b){var c;this.keyForRelationship&&a.eachRelationship(function(a,d){c=this.keyForRelationship(a,d.kind),a!==c&&(b[a]=b[c],delete b[c])},this)},extractSingle:function(a,b,d,e){d=this.normalizePayload(b,d);var g,h=b.typeKey;for(var i in d){var j=this.typeForRoot(i),k=a.modelFor(j),l=k.typeKey===h;l&&"array"!==Ember.typeOf(d[i])?g=this.normalize(b,d[i],i):f.call(d[i],function(b){var d=this.typeForRoot(i),f=a.modelFor(d),h=a.serializerFor(f);b=h.normalize(f,b,i);var j=l&&!e&&!g,k=l&&c(b.id)===e;j||k?g=b:a.push(d,b)},this)}return g},extractArray:function(a,b,c){c=this.normalizePayload(b,c);var d,e=b.typeKey;for(var f in c){var h=f,i=!1;"_"===f.charAt(0)&&(i=!0,h=f.substr(1));var j=this.typeForRoot(h),k=a.modelFor(j),l=a.serializerFor(k),m=!i&&k.typeKey===e,n=g.call(c[f],function(a){return l.normalize(k,a,f)},this);m?d=n:a.pushMany(j,n)}return d},pushPayload:function(a,b){b=this.normalizePayload(null,b);for(var c in b){var d=this.typeForRoot(c),e=a.modelFor(d),f=g.call(Ember.makeArray(b[c]),function(a){return this.normalize(e,a,c)},this);a.pushMany(d,f)}},typeForRoot:function(a){return Ember.String.singularize(a)},serialize:function(){return this._super.apply(this,arguments)},serializeIntoHash:function(a,b,c,d){var e=Ember.String.camelize(b.typeKey);a[e]=this.serialize(c,d)},serializePolymorphicType:function(a,b,c){var d=c.key,f=e(a,d);d=this.keyForAttribute?this.keyForAttribute(d):d,b[d+"Type"]=Ember.String.camelize(f.constructor.typeKey)}});b["default"]=h}),b("ember-data/lib/system/adapter",["exports"],function(a){"use strict";var b=Ember.get,c=(Ember.set,Ember.ArrayPolyfills.map),d=["description","fileName","lineNumber","message","name","number","stack"],e=function(a){var b=Error.prototype.constructor.call(this,"The backend rejected the commit because it was invalid: "+Ember.inspect(a));this.errors=a;for(var c=0,e=d.length;e>c;c++)this[d[c]]=b[d[c]]};e.prototype=Ember.create(Error.prototype);var f=Ember.Object.extend({find:Ember.required(Function),findAll:null,findQuery:null,generateIdForRecord:null,serialize:function(a,c){return b(a,"store").serializerFor(a.constructor.typeKey).serialize(a,c)},createRecord:Ember.required(Function),updateRecord:Ember.required(Function),deleteRecord:Ember.required(Function),findMany:function(a,b,d){var e=c.call(d,function(c){return this.find(a,b,c)},this);return Ember.RSVP.all(e)}});a.InvalidError=e,a.Adapter=f,a["default"]=f}),b("ember-data/lib/system/changes",["./changes/attribute_change","./changes/relationship_change","exports"],function(a,b,c){"use strict";var d=a["default"],e=b.RelationshipChange,f=b.RelationshipChangeAdd,g=b.RelationshipChangeRemove,h=b.OneToManyChange,i=b.ManyToNoneChange,j=b.OneToOneChange,k=b.ManyToManyChange;c.AttributeChange=d,c.RelationshipChange=e,c.RelationshipChangeAdd=f,c.RelationshipChangeRemove=g,c.OneToManyChange=h,c.ManyToNoneChange=i,c.OneToOneChange=j,c.ManyToManyChange=k}),b("ember-data/lib/system/changes/attribute_change",["exports"],function(a){"use strict";function b(a){this.record=a.record,this.store=a.store,this.name=a.name,this.value=a.value,this.oldValue=a.oldValue}b.createChange=function(a){return new b(a)},b.prototype={sync:function(){this.value!==this.oldValue&&(this.record.send("becomeDirty"),this.record.updateRecordArraysLater()),this.destroy()},destroy:function(){delete this.record._changesToSync[this.name]}},a["default"]=b}),b("ember-data/lib/system/changes/relationship_change",["../model","exports"],function(a,b){"use strict";function c(a){return"object"==typeof a&&(!a.then||"function"!=typeof a.then)}var d=a.Model,e=Ember.get,f=Ember.set,g=Ember.EnumerableUtils.forEach,h=function(a){this.parentRecord=a.parentRecord,this.childRecord=a.childRecord,this.firstRecord=a.firstRecord,this.firstRecordKind=a.firstRecordKind,this.firstRecordName=a.firstRecordName,this.secondRecord=a.secondRecord,this.secondRecordKind=a.secondRecordKind,this.secondRecordName=a.secondRecordName,this.changeType=a.changeType,this.store=a.store,this.committed={}},i=function(a){h.call(this,a)},j=function(a){h.call(this,a)};h.create=function(a){return new h(a)},i.create=function(a){return new i(a)},j.create=function(a){return new j(a)};var k={},l={},m={},n={},o={};h._createChange=function(a){return"add"===a.changeType?i.create(a):"remove"===a.changeType?j.create(a):void 0},h.determineRelationshipType=function(a,b){var c,d,e=b.key,f=b.kind,g=a.inverseFor(e);return g&&(c=g.name,d=g.kind),g?"belongsTo"===d?"belongsTo"===f?"oneToOne":"manyToOne":"belongsTo"===f?"oneToMany":"manyToMany":"belongsTo"===f?"oneToNone":"manyToNone"},h.createChange=function(a,b,c,d){var e,f=a.constructor;return e=h.determineRelationshipType(f,d),"oneToMany"===e?k.createChange(a,b,c,d):"manyToOne"===e?k.createChange(b,a,c,d):"oneToNone"===e?l.createChange(a,b,c,d):"manyToNone"===e?m.createChange(a,b,c,d):"oneToOne"===e?n.createChange(a,b,c,d):"manyToMany"===e?o.createChange(a,b,c,d):void 0},l.createChange=function(a,b,c,d){var e=d.key,f=h._createChange({parentRecord:b,childRecord:a,firstRecord:a,store:c,changeType:d.changeType,firstRecordName:e,firstRecordKind:"belongsTo"});return c.addRelationshipChangeFor(a,e,b,null,f),f},m.createChange=function(a,b,c,d){var e=d.key,f=h._createChange({parentRecord:a,childRecord:b,secondRecord:a,store:c,changeType:d.changeType,secondRecordName:d.key,secondRecordKind:"hasMany"});return c.addRelationshipChangeFor(a,e,b,null,f),f},o.createChange=function(a,b,c,d){var e=d.key,f=h._createChange({parentRecord:b,childRecord:a,firstRecord:a,secondRecord:b,firstRecordKind:"hasMany",secondRecordKind:"hasMany",store:c,changeType:d.changeType,firstRecordName:e});return c.addRelationshipChangeFor(a,e,b,null,f),f},n.createChange=function(a,b,c,d){var e;d.parentType?e=d.parentType.inverseFor(d.key).name:d.key&&(e=d.key);var f=h._createChange({parentRecord:b,childRecord:a,firstRecord:a,secondRecord:b,firstRecordKind:"belongsTo",secondRecordKind:"belongsTo",store:c,changeType:d.changeType,firstRecordName:e});return c.addRelationshipChangeFor(a,e,b,null,f),f},n.maintainInvariant=function(a,b,c,d){if("add"===a.changeType&&b.recordIsMaterialized(c)){var f=e(c,d);if(f){var g=n.createChange(c,f,b,{parentType:a.parentType,hasManyName:a.hasManyName,changeType:"remove",key:a.key});b.addRelationshipChangeFor(c,d,a.parentRecord,null,g),g.sync()}}},k.createChange=function(a,b,c,d){var e;d.parentType?(e=d.parentType.inverseFor(d.key).name,k.maintainInvariant(d,c,a,e)):d.key&&(e=d.key);var f=h._createChange({parentRecord:b,childRecord:a,firstRecord:a,secondRecord:b,firstRecordKind:"belongsTo",secondRecordKind:"hasMany",store:c,changeType:d.changeType,firstRecordName:e});return c.addRelationshipChangeFor(a,e,b,f.getSecondRecordName(),f),f},k.maintainInvariant=function(a,b,c,d){if("add"===a.changeType&&c){var f=e(c,d);if(f){var g=k.createChange(c,f,b,{parentType:a.parentType,hasManyName:a.hasManyName,changeType:"remove",key:a.key});b.addRelationshipChangeFor(c,d,a.parentRecord,g.getSecondRecordName(),g),g.sync()}}},h.prototype={getSecondRecordName:function(){var a,b=this.secondRecordName;if(!b){if(a=this.secondRecord,!a)return;var c=this.firstRecord.constructor,d=c.inverseFor(this.firstRecordName);this.secondRecordName=d.name}return this.secondRecordName},getFirstRecordName:function(){var a=this.firstRecordName;return a},destroy:function(){var a=this.childRecord,b=this.getFirstRecordName(),c=this.getSecondRecordName(),d=this.store;d.removeRelationshipChangeFor(a,b,this.parentRecord,c,this.changeType)},getSecondRecord:function(){return this.secondRecord},getFirstRecord:function(){return this.firstRecord},coalesce:function(){var a=this.store.relationshipChangePairsFor(this.firstRecord);g(a,function(a){var b=a.add,c=a.remove;b&&c&&(b.destroy(),c.destroy())})}},i.prototype=Ember.create(h.create({})),j.prototype=Ember.create(h.create({})),i.prototype.changeType="add",i.prototype.sync=function(){var a=this.getSecondRecordName(),b=this.getFirstRecordName(),g=this.getFirstRecord(),h=this.getSecondRecord();h instanceof d&&g instanceof d&&("belongsTo"===this.secondRecordKind?h.suspendRelationshipObservers(function(){f(h,a,g)}):"hasMany"===this.secondRecordKind&&h.suspendRelationshipObservers(function(){var b=e(h,a);c(b)&&b.addObject(g)})),g instanceof d&&h instanceof d&&e(g,b)!==h&&("belongsTo"===this.firstRecordKind?g.suspendRelationshipObservers(function(){f(g,b,h)}):"hasMany"===this.firstRecordKind&&g.suspendRelationshipObservers(function(){var a=e(g,b);c(a)&&a.addObject(h)})),this.coalesce()},j.prototype.changeType="remove",j.prototype.sync=function(){var a=this.getSecondRecordName(),b=this.getFirstRecordName(),g=this.getFirstRecord(),h=this.getSecondRecord();h instanceof d&&g instanceof d&&("belongsTo"===this.secondRecordKind?h.suspendRelationshipObservers(function(){f(h,a,null)}):"hasMany"===this.secondRecordKind&&h.suspendRelationshipObservers(function(){var b=e(h,a);c(b)&&b.removeObject(g)})),g instanceof d&&e(g,b)&&("belongsTo"===this.firstRecordKind?g.suspendRelationshipObservers(function(){f(g,b,null)}):"hasMany"===this.firstRecordKind&&g.suspendRelationshipObservers(function(){var a=e(g,b);c(a)&&a.removeObject(h)})),this.coalesce()},b.RelationshipChange=h,b.RelationshipChangeAdd=i,b.RelationshipChangeRemove=j,b.OneToManyChange=k,b.ManyToNoneChange=m,b.OneToOneChange=n,b.ManyToManyChange=o}),b("ember-data/lib/system/container_proxy",["exports"],function(a){"use strict";var b=function(a){this.container=a};b.prototype.aliasedFactory=function(a,b){var c=this;return{create:function(){return b&&b(),c.container.lookup(a)}}},b.prototype.registerAlias=function(a,b,c){var d=this.aliasedFactory(b,c);return this.container.register(a,d)},b.prototype.registerDeprecation=function(a,b){var c=function(){};return this.registerAlias(a,b,c)},b.prototype.registerDeprecations=function(a){for(var b=a.length;b>0;b--){var c=a[b-1],d=c.deprecated,e=c.valid;this.registerDeprecation(d,e)}},a["default"]=b}),b("ember-data/lib/system/debug",["./debug/debug_info","./debug/debug_adapter","exports"],function(a,b,c){"use strict";var d=b["default"];c["default"]=d}),b("ember-data/lib/system/debug/debug_adapter",["../model","exports"],function(a,b){"use strict";var c=a.Model,d=Ember.get,e=Ember.String.capitalize,f=Ember.String.underscore,g=Ember.DataAdapter.extend({getFilters:function(){return[{name:"isNew",desc:"New"},{name:"isModified",desc:"Modified"},{name:"isClean",desc:"Clean"}]},detect:function(a){return a!==c&&c.detect(a)},columnsForType:function(a){var b=[{name:"id",desc:"Id"}],c=0,g=this;return d(a,"attributes").forEach(function(a){if(c++>g.attributeLimit)return!1;var d=e(f(a).replace("_"," "));b.push({name:a,desc:d})}),b},getRecords:function(a){return this.get("store").all(a)},getRecordColumnValues:function(a){var b=this,c=0,e={id:d(a,"id")};return a.eachAttribute(function(f){if(c++>b.attributeLimit)return!1;var g=d(a,f);e[f]=g}),e},getRecordKeywords:function(a){var b=[],c=Ember.A(["id"]);return a.eachAttribute(function(a){c.push(a)}),c.forEach(function(c){b.push(d(a,c))}),b},getRecordFilterValues:function(a){return{isNew:a.get("isNew"),isModified:a.get("isDirty")&&!a.get("isNew"),isClean:!a.get("isDirty")}},getRecordColor:function(a){var b="black";return a.get("isNew")?b="green":a.get("isDirty")&&(b="blue"),b},observeRecord:function(a,b){var c=Ember.A(),d=this,e=Ember.A(["id","isNew","isDirty"]);a.eachAttribute(function(a){e.push(a)}),e.forEach(function(e){var f=function(){b(d.wrapRecord(a))};Ember.addObserver(a,e,f),c.push(function(){Ember.removeObserver(a,e,f)})});var f=function(){c.forEach(function(a){a()})};return f}});b["default"]=g}),b("ember-data/lib/system/debug/debug_info",["../model","exports"],function(a,b){"use strict";var c=a.Model;c.reopen({_debugInfo:function(){var a=["id"],b={belongsTo:[],hasMany:[]},c=[];this.eachAttribute(function(b){a.push(b)},this),this.eachRelationship(function(a,d){b[d.kind].push(a),c.push(a)});var d=[{name:"Attributes",properties:a,expand:!0},{name:"Belongs To",properties:b.belongsTo,expand:!0},{name:"Has Many",properties:b.hasMany,expand:!0},{name:"Flags",properties:["isLoaded","isDirty","isSaving","isDeleted","isError","isNew","isValid"]}];return{propertyInfo:{includeOtherProperties:!0,groups:d,expensiveProperties:c}}}}),b["default"]=c}),b("ember-data/lib/system/model",["./model/model","./model/attributes","./model/states","./model/errors","exports"],function(a,b,c,d,e){"use strict";var f=a["default"],g=b["default"],h=c["default"],i=d["default"];e.Model=f,e.RootState=h,e.attr=g,e.Errors=i}),b("ember-data/lib/system/model/attributes",["./model","exports"],function(a,b){"use strict";function c(a,b){return"function"==typeof b.defaultValue?b.defaultValue.apply(null,arguments):b.defaultValue}function d(a,b){return a._attributes.hasOwnProperty(b)||a._inFlightAttributes.hasOwnProperty(b)||a._data.hasOwnProperty(b)}function e(a,b){return a._attributes.hasOwnProperty(b)?a._attributes[b]:a._inFlightAttributes.hasOwnProperty(b)?a._inFlightAttributes[b]:a._data[b]}function f(a,b){b=b||{};var f={type:a,isAttribute:!0,options:b};return Ember.computed("data",function(a,f){if(arguments.length>1){var g=e(this,a);return f!==g&&(this._attributes[a]=f,this.send("didSetProperty",{name:a,oldValue:g,originalValue:this._data[a],value:f})),f}return d(this,a)?e(this,a):c(this,b,a)}).meta(f)}var g=a["default"],h=Ember.get;g.reopenClass({attributes:Ember.computed(function(){var a=Ember.Map.create();return this.eachComputedProperty(function(b,c){c.isAttribute&&(c.name=b,a.set(b,c))}),a}),transformedAttributes:Ember.computed(function(){var a=Ember.Map.create();return this.eachAttribute(function(b,c){c.type&&a.set(b,c.type)}),a}),eachAttribute:function(a,b){h(this,"attributes").forEach(function(c,d){a.call(b,c,d)},b)},eachTransformedAttribute:function(a,b){h(this,"transformedAttributes").forEach(function(c,d){a.call(b,c,d)})}}),g.reopen({eachAttribute:function(a,b){this.constructor.eachAttribute(a,b)}}),b["default"]=f }),b("ember-data/lib/system/model/errors",["exports"],function(a){"use strict";var b=Ember.get,c=Ember.isEmpty,d=Ember.Object.extend(Ember.Enumerable,Ember.Evented,{registerHandlers:function(a,b,c){this.on("becameInvalid",a,b),this.on("becameValid",a,c)},errorsByAttributeName:Ember.reduceComputed("content",{initialValue:function(){return Ember.MapWithDefault.create({defaultValue:function(){return Ember.A()}})},addedItem:function(a,b){return a.get(b.attribute).pushObject(b),a},removedItem:function(a,b){return a.get(b.attribute).removeObject(b),a}}),errorsFor:function(a){return b(this,"errorsByAttributeName").get(a)},messages:Ember.computed.mapBy("content","message"),content:Ember.computed(function(){return Ember.A()}),unknownProperty:function(a){var b=this.errorsFor(a);return c(b)?null:b},nextObject:function(a){return b(this,"content").objectAt(a)},length:Ember.computed.oneWay("content.length").readOnly(),isEmpty:Ember.computed.not("length").readOnly(),add:function(a,c){var d=b(this,"isEmpty");c=this._findOrCreateMessages(a,c),b(this,"content").addObjects(c),this.notifyPropertyChange(a),this.enumerableContentDidChange(),d&&!b(this,"isEmpty")&&this.trigger("becameInvalid")},_findOrCreateMessages:function(a,b){var c=this.errorsFor(a);return Ember.makeArray(b).map(function(b){return c.findBy("message",b)||{attribute:a,message:b}})},remove:function(a){if(!b(this,"isEmpty")){var c=b(this,"content").rejectBy("attribute",a);b(this,"content").setObjects(c),this.notifyPropertyChange(a),this.enumerableContentDidChange(),b(this,"isEmpty")&&this.trigger("becameValid")}},clear:function(){b(this,"isEmpty")||(b(this,"content").clear(),this.enumerableContentDidChange(),this.trigger("becameValid"))},has:function(a){return!c(this.errorsFor(a))}});a["default"]=d}),b("ember-data/lib/system/model/model",["./states","./errors","exports"],function(a,b,c){"use strict";var d=a["default"],e=b["default"],f=Ember.get,g=Ember.set,h=Ember.merge,i=Ember.RSVP.Promise,j=Ember.computed("currentState",function(a){return f(f(this,"currentState"),a)}).readOnly(),k=Ember.Object.extend(Ember.Evented,{_recordArrays:void 0,_relationships:void 0,_loadingRecordArrays:void 0,isEmpty:j,isLoading:j,isLoaded:j,isDirty:j,isSaving:j,isDeleted:j,isNew:j,isValid:j,dirtyType:j,isError:!1,isReloading:!1,clientId:null,id:null,currentState:d.empty,errors:Ember.computed(function(){var a=e.create();return a.registerHandlers(this,function(){this.send("becameInvalid")},function(){this.send("becameValid")}),a}).readOnly(),serialize:function(a){var b=f(this,"store");return b.serialize(this,a)},toJSON:function(a){var b=DS.JSONSerializer.create({container:this.container});return b.serialize(this,a)},didLoad:Ember.K,didUpdate:Ember.K,didCreate:Ember.K,didDelete:Ember.K,becameInvalid:Ember.K,becameError:Ember.K,data:Ember.computed(function(){return this._data=this._data||{},this._data}).readOnly(),_data:null,init:function(){this._super(),this._setup()},_setup:function(){this._changesToSync={},this._deferredTriggers=[],this._data={},this._attributes={},this._inFlightAttributes={},this._relationships={}},send:function(a,b){var c=f(this,"currentState");return c[a]||this._unhandledEvent(c,a,b),c[a](this,b)},transitionTo:function(a){var b=a.split(".",1),c=f(this,"currentState"),d=c;do d.exit&&d.exit(this),d=d.parentState;while(!d.hasOwnProperty(b));var e,h,i=a.split("."),j=[],k=[];for(e=0,h=i.length;h>e;e++)d=d[i[e]],d.enter&&k.push(d),d.setup&&j.push(d);for(e=0,h=k.length;h>e;e++)k[e].enter(this);for(g(this,"currentState",d),e=0,h=j.length;h>e;e++)j[e].setup(this);this.updateRecordArraysLater()},_unhandledEvent:function(a,b,c){var d="Attempted to handle event `"+b+"` ";throw d+="on "+String(this)+" while in state ",d+=a.stateName+". ",void 0!==c&&(d+="Called with "+Ember.inspect(c)+"."),new Ember.Error(d)},withTransaction:function(a){var b=f(this,"transaction");b&&a(b)},loadingData:function(a){this.send("loadingData",a)},loadedData:function(){this.send("loadedData")},notFound:function(){this.send("notFound")},pushedData:function(){this.send("pushedData")},deleteRecord:function(){this.send("deleteRecord")},destroyRecord:function(){return this.deleteRecord(),this.save()},unloadRecord:function(){this.isDestroyed||this.send("unloadRecord")},clearRelationships:function(){this.eachRelationship(function(a,b){if("belongsTo"===b.kind)g(this,a,null);else if("hasMany"===b.kind){var c=this._relationships[a];c&&c.destroy()}},this)},updateRecordArrays:function(){this._updatingRecordArraysLater=!1,f(this,"store").dataWasUpdated(this.constructor,this)},changedAttributes:function(){var a,b=f(this,"_data"),c=f(this,"_attributes"),d={};for(a in c)d[a]=[b[a],c[a]];return d},adapterWillCommit:function(){this.send("willCommit")},adapterDidCommit:function(a){g(this,"isError",!1),a?this._data=a:Ember.mixin(this._data,this._inFlightAttributes),this._inFlightAttributes={},this.send("didCommit"),this.updateRecordArraysLater(),a&&this.suspendRelationshipObservers(function(){this.notifyPropertyChange("data")})},adapterDidDirty:function(){this.send("becomeDirty"),this.updateRecordArraysLater()},dataDidChange:Ember.observer(function(){this.reloadHasManys()},"data"),reloadHasManys:function(){var a=f(this.constructor,"relationshipsByName");this.updateRecordArraysLater(),a.forEach(function(a,b){this._data.links&&this._data.links[a]||"hasMany"===b.kind&&this.hasManyDidChange(b.key)},this)},hasManyDidChange:function(a){var b=this._relationships[a];if(b){var c=this._data[a]||[];g(b,"content",Ember.A(c)),g(b,"isLoaded",!0),b.trigger("didLoad")}},updateRecordArraysLater:function(){this._updatingRecordArraysLater||(this._updatingRecordArraysLater=!0,Ember.run.schedule("actions",this,this.updateRecordArrays))},setupData:function(a,b){b?Ember.merge(this._data,a):this._data=a;var c=this._relationships;this.eachRelationship(function(b,d){a.links&&a.links[b]||d.options.async&&(c[b]=null)}),a&&this.pushedData(),this.suspendRelationshipObservers(function(){this.notifyPropertyChange("data")})},materializeId:function(a){g(this,"id",a)},materializeAttributes:function(a){h(this._data,a)},materializeAttribute:function(a,b){this._data[a]=b},updateHasMany:function(a,b){this._data[a]=b,this.hasManyDidChange(a)},updateBelongsTo:function(a,b){this._data[a]=b},rollback:function(){this._attributes={},f(this,"isError")&&(this._inFlightAttributes={},g(this,"isError",!1)),f(this,"isValid")||(this._inFlightAttributes={}),this.send("rolledBack"),this.suspendRelationshipObservers(function(){this.notifyPropertyChange("data")})},toStringExtension:function(){return f(this,"id")},suspendRelationshipObservers:function(a,b){var c=f(this.constructor,"relationshipNames").belongsTo,d=this;try{this._suspendedRelationships=!0,Ember._suspendObservers(d,c,null,"belongsToDidChange",function(){Ember._suspendBeforeObservers(d,c,null,"belongsToWillChange",function(){a.call(b||d)})})}finally{this._suspendedRelationships=!1}},save:function(){var a="DS: Model#save "+this,b=Ember.RSVP.defer(a);return this.get("store").scheduleSave(this,b),this._inFlightAttributes=this._attributes,this._attributes={},DS.PromiseObject.create({promise:b.promise})},reload:function(){g(this,"isReloading",!0);var a=this,b="DS: Model#reload of "+this,c=new i(function(b){a.send("reloadRecord",b)},b).then(function(){return a.set("isReloading",!1),a.set("isError",!1),a},function(b){throw a.set("isError",!0),b},"DS: Model#reload complete, update flags");return DS.PromiseObject.create({promise:c})},adapterDidUpdateAttribute:function(a,b){void 0!==b?(this._data[a]=b,this.notifyPropertyChange(a)):this._data[a]=this._inFlightAttributes[a],this.updateRecordArraysLater()},adapterDidInvalidate:function(a){function b(b){a[b]&&c.add(b,a[b])}var c=f(this,"errors");this.eachAttribute(b),this.eachRelationship(b)},adapterDidError:function(){this.send("becameError"),g(this,"isError",!0)},trigger:function(a){Ember.tryInvoke(this,a,[].slice.call(arguments,1)),this._super.apply(this,arguments)},triggerLater:function(){1===this._deferredTriggers.push(arguments)&&Ember.run.schedule("actions",this,"_triggerDeferredTriggers")},_triggerDeferredTriggers:function(){for(var a=0,b=this._deferredTriggers.length;b>a;a++)this.trigger.apply(this,this._deferredTriggers[a]);this._deferredTriggers.length=0},willDestroy:function(){this._super(),this.clearRelationships()}});k.reopenClass({_create:k.create,create:function(){throw new Ember.Error("You should not call `create` on a model. Instead, call `store.createRecord` with the attributes you would like to set.")}}),c["default"]=k}),b("ember-data/lib/system/model/states",["exports"],function(a){"use strict";function b(a,b){b.value===b.originalValue?(delete a._attributes[b.name],a.send("propertyWasReset",b.name)):b.value!==b.oldValue&&a.send("becomeDirty"),a.updateRecordArraysLater()}function c(a){var b,d={};for(var e in a)b=a[e],d[e]=b&&"object"==typeof b?c(b):b;return d}function d(a,b){for(var c in b)a[c]=b[c];return a}function e(a){var b=c(j);return d(b,a)}function f(){}function g(a,b,c){a=d(b?Ember.create(b):{},a),a.parentState=b,a.stateName=c;for(var e in a)a.hasOwnProperty(e)&&"parentState"!==e&&"stateName"!==e&&"object"==typeof a[e]&&(a[e]=g(a[e],a,c+"."+e));return a}var h=Ember.get,i=Ember.set,j={initialState:"uncommitted",isDirty:!0,uncommitted:{didSetProperty:b,propertyWasReset:function(a){var b=!1;for(var c in a._attributes){b=!0;break}b||a.send("rolledBack")},pushedData:Ember.K,becomeDirty:Ember.K,willCommit:function(a){a.transitionTo("inFlight")},reloadRecord:function(a,b){b(h(a,"store").reloadRecord(a))},rolledBack:function(a){a.transitionTo("loaded.saved")},becameInvalid:function(a){a.transitionTo("invalid")},rollback:function(a){a.rollback()}},inFlight:{isSaving:!0,didSetProperty:b,becomeDirty:Ember.K,pushedData:Ember.K,unloadRecord:function(){},willCommit:Ember.K,didCommit:function(a){var b=h(this,"dirtyType");a.transitionTo("saved"),a.send("invokeLifecycleCallbacks",b)},becameInvalid:function(a){a.transitionTo("invalid"),a.send("invokeLifecycleCallbacks")},becameError:function(a){a.transitionTo("uncommitted"),a.triggerLater("becameError",a)}},invalid:{isValid:!1,deleteRecord:function(a){a.transitionTo("deleted.uncommitted"),a.clearRelationships()},didSetProperty:function(a,c){h(a,"errors").remove(c.name),b(a,c)},becomeDirty:Ember.K,rolledBack:function(a){h(a,"errors").clear()},becameValid:function(a){a.transitionTo("uncommitted")},invokeLifecycleCallbacks:function(a){a.triggerLater("becameInvalid",a)}}},k=e({dirtyType:"created",isNew:!0});k.uncommitted.rolledBack=function(a){a.transitionTo("deleted.saved")};var l=e({dirtyType:"updated"});k.uncommitted.deleteRecord=function(a){a.clearRelationships(),a.transitionTo("deleted.saved")},k.uncommitted.rollback=function(a){j.uncommitted.rollback.apply(this,arguments),a.transitionTo("deleted.saved")},k.uncommitted.propertyWasReset=Ember.K,l.inFlight.unloadRecord=f,l.uncommitted.deleteRecord=function(a){a.transitionTo("deleted.uncommitted"),a.clearRelationships()};var m={isEmpty:!1,isLoading:!1,isLoaded:!1,isDirty:!1,isSaving:!1,isDeleted:!1,isNew:!1,isValid:!0,rolledBack:Ember.K,unloadRecord:function(a){a.clearRelationships(),a.transitionTo("deleted.saved")},propertyWasReset:Ember.K,empty:{isEmpty:!0,loadingData:function(a,b){a._loadingPromise=b,a.transitionTo("loading")},loadedData:function(a){a.transitionTo("loaded.created.uncommitted"),a.suspendRelationshipObservers(function(){a.notifyPropertyChange("data")})},pushedData:function(a){a.transitionTo("loaded.saved"),a.triggerLater("didLoad")}},loading:{isLoading:!0,exit:function(a){a._loadingPromise=null},pushedData:function(a){a.transitionTo("loaded.saved"),a.triggerLater("didLoad"),i(a,"isError",!1)},becameError:function(a){a.triggerLater("becameError",a)},notFound:function(a){a.transitionTo("empty")}},loaded:{initialState:"saved",isLoaded:!0,saved:{setup:function(a){var b=a._attributes,c=!1;for(var d in b)if(b.hasOwnProperty(d)){c=!0;break}c&&a.adapterDidDirty()},didSetProperty:b,pushedData:Ember.K,becomeDirty:function(a){a.transitionTo("updated.uncommitted")},willCommit:function(a){a.transitionTo("updated.inFlight")},reloadRecord:function(a,b){b(h(a,"store").reloadRecord(a))},deleteRecord:function(a){a.transitionTo("deleted.uncommitted"),a.clearRelationships()},unloadRecord:function(a){a.clearRelationships(),a.transitionTo("deleted.saved")},didCommit:function(a){a.send("invokeLifecycleCallbacks",h(a,"lastDirtyType"))},notFound:Ember.K},created:k,updated:l},deleted:{initialState:"uncommitted",dirtyType:"deleted",isDeleted:!0,isLoaded:!0,isDirty:!0,setup:function(a){a.updateRecordArrays()},uncommitted:{willCommit:function(a){a.transitionTo("inFlight")},rollback:function(a){a.rollback()},becomeDirty:Ember.K,deleteRecord:Ember.K,rolledBack:function(a){a.transitionTo("loaded.saved")}},inFlight:{isSaving:!0,unloadRecord:f,willCommit:Ember.K,didCommit:function(a){a.transitionTo("saved"),a.send("invokeLifecycleCallbacks")},becameError:function(a){a.transitionTo("uncommitted"),a.triggerLater("becameError",a)}},saved:{isDirty:!1,setup:function(a){var b=h(a,"store");b.dematerializeRecord(a)},invokeLifecycleCallbacks:function(a){a.triggerLater("didDelete",a),a.triggerLater("didCommit",a)}}},invokeLifecycleCallbacks:function(a,b){"created"===b?a.triggerLater("didCreate",a):a.triggerLater("didUpdate",a),a.triggerLater("didCommit",a)}};m=g(m,null,"root"),a["default"]=m}),b("ember-data/lib/system/record_array_manager",["./record_arrays","exports"],function(a,b){"use strict";function c(a){for(var b=[],c=Ember.keys(a),d=0;dd;d++)c=c.concat(a[d]);return c}var f=a.ManyArray,g=Ember.get,h=(Ember.set,Ember.EnumerableUtils.forEach),i=Ember.Object.extend({init:function(){this.filteredRecordArrays=Ember.MapWithDefault.create({defaultValue:function(){return[]}}),this.changedRecords=[],this._adapterPopulatedRecordArrays=[]},recordDidChange:function(a){1===this.changedRecords.push(a)&&Ember.run.schedule("actions",this,this.updateRecordArrays)},recordArraysForRecord:function(a){return a._recordArrays=a._recordArrays||Ember.OrderedSet.create(),a._recordArrays},updateRecordArrays:function(){h(this.changedRecords,function(a){g(a,"isDeleted")?this._recordWasDeleted(a):this._recordWasChanged(a)},this),this.changedRecords.length=0},_recordWasDeleted:function(a){var b=a._recordArrays;b&&h(b,function(b){b.removeRecord(a)})},_recordWasChanged:function(a){var b,c=a.constructor,d=this.filteredRecordArrays.get(c);h(d,function(d){b=g(d,"filterFunction"),this.updateRecordArray(d,b,c,a)},this);var e=a._loadingRecordArrays;if(e){for(var f=0,i=e.length;i>f;f++)e[f].loadedRecord();a._loadingRecordArrays=[]}},updateRecordArray:function(a,b,c,d){var e;e=b?b(d):!0;var f=this.recordArraysForRecord(d);e?(f.add(a),a.addRecord(d)):e||(f.remove(a),a.removeRecord(d))},updateFilter:function(a,b,c){for(var d,e=this.store.typeMapFor(b),f=e.records,h=0,i=f.length;i>h;h++)d=f[h],g(d,"isDeleted")||g(d,"isEmpty")||this.updateRecordArray(a,c,b,d)},createManyArray:function(a,b){var c=f.create({type:a,content:b,store:this.store});return h(b,function(a){var b=this.recordArraysForRecord(a);b.add(c)},this),c},createRecordArray:function(a){var b=DS.RecordArray.create({type:a,content:Ember.A(),store:this.store,isLoaded:!0});return this.registerFilteredRecordArray(b,a),b},createFilteredRecordArray:function(a,b){var c=DS.FilteredRecordArray.create({type:a,content:Ember.A(),store:this.store,manager:this,filterFunction:b});return this.registerFilteredRecordArray(c,a,b),c},createAdapterPopulatedRecordArray:function(a,b){var c=DS.AdapterPopulatedRecordArray.create({type:a,query:b,content:Ember.A(),store:this.store});return this._adapterPopulatedRecordArrays.push(c),c},registerFilteredRecordArray:function(a,b,c){var d=this.filteredRecordArrays.get(b);d.push(a),this.updateFilter(a,b,c)},registerWaitingRecordArray:function(a,b){var c=a._loadingRecordArrays||[];c.push(b),a._loadingRecordArrays=c},willDestroy:function(){this._super(),e(c(this.filteredRecordArrays.values)).forEach(d),this._adapterPopulatedRecordArrays.forEach(d)}});b["default"]=i}),b("ember-data/lib/system/record_arrays",["./record_arrays/record_array","./record_arrays/filtered_record_array","./record_arrays/adapter_populated_record_array","./record_arrays/many_array","exports"],function(a,b,c,d,e){"use strict";var f=a["default"],g=b["default"],h=c["default"],i=d["default"];e.RecordArray=f,e.FilteredRecordArray=g,e.AdapterPopulatedRecordArray=h,e.ManyArray=i}),b("ember-data/lib/system/record_arrays/adapter_populated_record_array",["./record_array","exports"],function(a,b){"use strict";var c=a["default"],d=Ember.get,e=(Ember.set,c.extend({query:null,replace:function(){var a=d(this,"type").toString();throw new Error("The result of a server query (on "+a+") is immutable.")},load:function(a){var b=d(this,"store"),c=d(this,"type"),e=b.pushMany(c,a),f=b.metadataFor(c);this.setProperties({content:Ember.A(e),isLoaded:!0,meta:f}),Ember.run.once(this,"trigger","didLoad")}}));b["default"]=e}),b("ember-data/lib/system/record_arrays/filtered_record_array",["./record_array","exports"],function(a,b){"use strict";var c=a["default"],d=Ember.get,e=c.extend({filterFunction:null,isLoaded:!0,replace:function(){var a=d(this,"type").toString();throw new Error("The result of a client-side filter (on "+a+") is immutable.")},updateFilter:Ember.observer(function(){var a=d(this,"manager");a.updateFilter(this,d(this,"type"),d(this,"filterFunction"))},"filterFunction")});b["default"]=e}),b("ember-data/lib/system/record_arrays/many_array",["./record_array","../changes","exports"],function(a,b,c){"use strict";function d(a){a.sync()}var e=a["default"],f=b.RelationshipChange,g=Ember.get,h=Ember.set,i=Ember.EnumerableUtils.map,j=e.extend({init:function(){this._super.apply(this,arguments),this._changesToSync=Ember.OrderedSet.create()},name:null,owner:null,isPolymorphic:!1,isLoaded:!1,promise:null,loadingRecordsCount:function(a){this.loadingRecordsCount=a},loadedRecord:function(){this.loadingRecordsCount--,0===this.loadingRecordsCount&&(h(this,"isLoaded",!0),this.trigger("didLoad"))},fetch:function(){var a=g(this,"content"),b=g(this,"store"),c=g(this,"owner"),d=Ember.RSVP.defer("DS: ManyArray#fetch "+g(this,"type")),e=a.filterProperty("isEmpty",!0);b.fetchMany(e,c,d)},replaceContent:function(a,b,c){c=i(c,function(a){return a},this),this._super(a,b,c)},arrangedContentDidChange:function(){Ember.run.once(this,"fetch")},arrayContentWillChange:function(a,b){var c=g(this,"owner"),d=g(this,"name");if(!c._suspendedRelationships)for(var e=a;a+b>e;e++){var h=g(this,"content").objectAt(e),i=f.createChange(c,h,g(this,"store"),{parentType:c.constructor,changeType:"remove",kind:"hasMany",key:d});this._changesToSync.add(i)}return this._super.apply(this,arguments)},arrayContentDidChange:function(a,b,c){this._super.apply(this,arguments);var e=g(this,"owner"),h=g(this,"name"),i=g(this,"store");if(!e._suspendedRelationships){for(var j=a;a+c>j;j++){var k=g(this,"content").objectAt(j),l=f.createChange(e,k,i,{parentType:e.constructor,changeType:"add",kind:"hasMany",key:h});l.hasManyName=h,this._changesToSync.add(l)}this._changesToSync.forEach(d),this._changesToSync.clear()}},createRecord:function(a){var b,c=g(this,"owner"),d=g(c,"store"),e=g(this,"type");return b=d.createRecord.call(d,e,a),this.pushObject(b),b}});c["default"]=j}),b("ember-data/lib/system/record_arrays/record_array",["../store","exports"],function(a,b){"use strict";var c=a.PromiseArray,d=Ember.get,e=(Ember.set,Ember.ArrayProxy.extend(Ember.Evented,{type:null,content:null,isLoaded:!1,isUpdating:!1,store:null,objectAtContent:function(a){var b=d(this,"content");return b.objectAt(a)},update:function(){if(!d(this,"isUpdating")){var a=d(this,"store"),b=d(this,"type");return a.fetchAll(b,this)}},addRecord:function(a){d(this,"content").addObject(a)},removeRecord:function(a){d(this,"content").removeObject(a)},save:function(){var a="DS: RecordArray#save "+d(this,"type"),b=Ember.RSVP.all(this.invoke("save"),a).then(function(a){return Ember.A(a)},null,"DS: RecordArray#save apply Ember.NativeArray");return c.create({promise:b})},_dissociateFromOwnRecords:function(){var a=this;this.forEach(function(b){var c=b._recordArrays;c&&c.remove(a)})},willDestroy:function(){this._dissociateFromOwnRecords(),this._super()}}));b["default"]=e}),b("ember-data/lib/system/relationships",["./relationships/belongs_to","./relationships/has_many","../system/relationships/ext","exports"],function(a,b,c,d){"use strict";var e=a["default"],f=b["default"];d.belongsTo=e,d.hasMany=f}),b("ember-data/lib/system/relationships/belongs_to",["../model","exports"],function(a,b){"use strict";function c(a,b,c){return Ember.computed("data",function(a,b){var d,h=e(this,"data"),i=e(this,"store"),j="DS: Async belongsTo "+this+" : "+a;if(2===arguments.length)return void 0===b?null:DS.PromiseObject.create({promise:g.cast(b,j)});var k=h.links&&h.links[a],l=h[a];return f(l)?k?(d=i.findBelongsTo(this,k,c),DS.PromiseObject.create({promise:d})):null:(d=i.fetchRecord(l)||g.cast(l,j),DS.PromiseObject.create({promise:d}))}).meta(c)}function d(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var d={type:a,isRelationship:!0,options:b,kind:"belongsTo"};return b.async?c(a,b,d):Ember.computed("data",function(b,c){var d,g,h=e(this,"data"),i=e(this,"store");return g="string"==typeof a?i.modelFor(a):a,2===arguments.length?void 0===c?null:c:(d=h[b],f(d)?null:(i.fetchRecord(d),d))}).meta(d)}var e=Ember.get,f=(Ember.set,Ember.isNone),g=Ember.RSVP.Promise,h=a.Model;h.reopen({belongsToWillChange:Ember.beforeObserver(function(a,b){if(e(a,"isLoaded")){var c=e(a,b);if(c){var d=e(a,"store"),f=DS.RelationshipChange.createChange(a,c,d,{key:b,kind:"belongsTo",changeType:"remove"});f.sync(),this._changesToSync[b]=f}}}),belongsToDidChange:Ember.immediateObserver(function(a,b){if(e(a,"isLoaded")){var c=e(a,b);if(c){var d=e(a,"store"),f=DS.RelationshipChange.createChange(a,c,d,{key:b,kind:"belongsTo",changeType:"add"});f.sync()}}delete this._changesToSync[b]})}),b["default"]=d}),b("ember-data/lib/system/relationships/ext",["../../../../ember-inflector/lib/system","../model"],function(a,b){"use strict";{var c=a.singularize,d=b.Model,e=Ember.get;Ember.set}d.reopen({didDefineProperty:function(a,b,c){if(c instanceof Ember.Descriptor){var d=c.meta();d.isRelationship&&"belongsTo"===d.kind&&(Ember.addObserver(a,b,null,"belongsToDidChange"),Ember.addBeforeObserver(a,b,null,"belongsToWillChange")),d.parentType=a.constructor}}}),d.reopenClass({typeForRelationship:function(a){var b=e(this,"relationshipsByName").get(a);return b&&b.type},inverseFor:function(a){function b(a,c,d){d=d||[];var f=e(c,"relationships");if(f){var g=f.get(a);return g&&d.push.apply(d,f.get(a)),a.superclass&&b(a.superclass,c,d),d}}var c=this.typeForRelationship(a);if(!c)return null;var d=this.metaForProperty(a).options;if(null===d.inverse)return null;var f,g;if(d.inverse)f=d.inverse,g=Ember.get(c,"relationshipsByName").get(f).kind;else{var h=b(this,c);if(0===h.length)return null;f=h[0].name,g=h[0].kind}return{type:c,name:f,kind:g}},relationships:Ember.computed(function(){var a=new Ember.MapWithDefault({defaultValue:function(){return[]}});return this.eachComputedProperty(function(b,c){if(c.isRelationship){"string"==typeof c.type&&(c.type=this.store.modelFor(c.type));var d=a.get(c.type);d.push({name:b,kind:c.kind})}}),a}),relationshipNames:Ember.computed(function(){var a={hasMany:[],belongsTo:[]};return this.eachComputedProperty(function(b,c){c.isRelationship&&a[c.kind].push(b)}),a}),relatedTypes:Ember.computed(function(){var a,b=Ember.A();return this.eachComputedProperty(function(c,d){d.isRelationship&&(a=d.type,"string"==typeof a&&(a=e(this,a,!1)||this.store.modelFor(a)),b.contains(a)||b.push(a))}),b}),relationshipsByName:Ember.computed(function(){var a,b=Ember.Map.create();return this.eachComputedProperty(function(d,e){e.isRelationship&&(e.key=d,a=e.type,a||"hasMany"!==e.kind?a||(a=d):a=c(d),"string"==typeof a&&(e.type=this.store.modelFor(a)),b.set(d,e))}),b}),fields:Ember.computed(function(){var a=Ember.Map.create();return this.eachComputedProperty(function(b,c){c.isRelationship?a.set(b,c.kind):c.isAttribute&&a.set(b,"attribute")}),a}),eachRelationship:function(a,b){e(this,"relationshipsByName").forEach(function(c,d){a.call(b,c,d)})},eachRelatedType:function(a,b){e(this,"relatedTypes").forEach(function(c){a.call(b,c)})}}),d.reopen({eachRelationship:function(a,b){this.constructor.eachRelationship(a,b)}})}),b("ember-data/lib/system/relationships/has_many",["exports"],function(a){"use strict";function b(a,b,d){return Ember.computed("data",function(a){var e=this._relationships[a],f="DS: Async hasMany "+this+" : "+a;if(!e){var h=Ember.RSVP.defer(f);e=c(this,a,b,function(b,c){var e,f=c.links&&c.links[a];return e=f?b.findHasMany(this,f,d,h):b.findMany(this,c[a],d.type,h),g(e,"promise",h.promise),e})}var i=e.get("promise").then(function(){return e},null,"DS: Async hasMany records received");return DS.PromiseArray.create({promise:i})}).meta(d).readOnly()}function c(a,b,c,d){var e=a._relationships;if(e[b])return e[b];var g=f(a,"data"),i=f(a,"store"),j=e[b]=d.call(a,i,g);return h(j,{owner:a,name:b,isPolymorphic:c.polymorphic})}function d(a,d){d=d||{};var e={type:a,isRelationship:!0,options:d,kind:"hasMany"};return d.async?b(a,d,e):Ember.computed("data",function(a){return c(this,a,d,function(b,c){c[a];return b.findMany(this,c[a],e.type)})}).meta(e).readOnly()}function e(a,b){return"object"==typeof a&&(b=a,a=void 0),d(a,b)}var f=Ember.get,g=Ember.set,h=Ember.setProperties;a["default"]=e}),b("ember-data/lib/system/store",["exports"],function(a){"use strict";function b(a){return null==a?null:a+""}function c(a,b,c,e){return b.eachRelationship(function(b,h){if(c.links&&c.links[b])return void(e&&h.options.async&&(e._relationships[b]=null));var i=h.kind,j=c[b];null!=j&&("belongsTo"===i?d(a,c,b,h,j):"hasMany"===i&&(f(a,c,b,h,j),g(e,b,j)))}),c}function d(a,b,c,d,f){if(!(z(f)||f instanceof DS.Model)){var g;"number"==typeof f||"string"==typeof f?(g=e(d,c,b),b[c]=a.recordForId(g,f)):"object"==typeof f&&(b[c]=a.recordForId(f.type,f.id))}}function e(a,b,c){return a.options.polymorphic?c[b+"Type"]:a.type}function f(a,b,c,e,f){for(var g=0,h=f.length;h>g;g++)d(a,f,g,e,f[g])}function g(a,b,c){a&&c.pushObjects(a.get(b).filterBy("isNew"))}function h(a,b){return u.create({promise:D.cast(a,b)})}function i(a,b){return v.create({promise:D.cast(a,b)})}function j(a,b,c){return a.lookup("serializer:"+b)||a.lookup("serializer:application")||a.lookup("serializer:"+c)||a.lookup("serializer:-default")}function k(a){return a.lookup("serializer:application")||a.lookup("serializer:-default")}function l(a,b){var c=a.serializer,d=a.defaultSerializer,e=a.container;return e&&void 0===c&&(c=j(e,b.typeKey,d)),(null===c||void 0===c)&&(c={extract:function(a,b,c){return c}}),c}function m(a,b,c,d){var e=a.find(b,c,d),f=l(a,c),g="DS: Handle Adapter#find of "+c+" with id: "+d;return D.cast(e,g).then(function(a){var e=f.extract(b,c,a,d,"find");return b.push(c,e)},function(a){var e=b.getById(c,d);throw e.notFound(),a},"DS: Extract payload of '"+c+"'")}function n(a,b,c,d,e){var f=a.findMany(b,c,d,e),g=l(a,c),h="DS: Handle Adapter#findMany of "+c;return D.cast(f,h).then(function(a){var d=g.extract(b,c,a,null,"findMany");b.pushMany(c,d)},null,"DS: Extract payload of "+c)}function o(a,b,c,d,e){var f=a.findHasMany(b,c,d,e),g=l(a,e.type),h="DS: Handle Adapter#findHasMany of "+c+" : "+e.type;return D.cast(f,h).then(function(a){var d=g.extract(b,e.type,a,null,"findHasMany"),f=b.pushMany(e.type,d);c.updateHasMany(e.key,f)},null,"DS: Extract payload of "+c+" : hasMany "+e.type)}function p(a,b,c,d,e){var f=a.findBelongsTo(b,c,d,e),g=l(a,e.type),h="DS: Handle Adapter#findBelongsTo of "+c+" : "+e.type;return D.cast(f,h).then(function(a){var c=g.extract(b,e.type,a,null,"findBelongsTo"),d=b.push(e.type,c);return d.updateBelongsTo(e.key,d),d},null,"DS: Extract payload of "+c+" : "+e.type)}function q(a,b,c,d){var e=a.findAll(b,c,d),f=l(a,c),g="DS: Handle Adapter#findAll of "+c;return D.cast(e,g).then(function(a){var d=f.extract(b,c,a,null,"findAll");return b.pushMany(c,d),b.didUpdateAll(c),b.all(c)},null,"DS: Extract payload of findAll "+c)}function r(a,b,c,d,e){var f=a.findQuery(b,c,d,e),g=l(a,c),h="DS: Handle Adapter#findQuery of "+c;return D.cast(f,h).then(function(a){var d=g.extract(b,c,a,null,"findQuery");return e.load(d),e},null,"DS: Extract payload of findQuery "+c)}function s(a,b,c,d){var e=d.constructor,f=a[c](b,e,d),g=l(a,e),h="DS: Extract and notify about "+c+" completion of "+d;return f.then(function(a){var f;return f=a?g.extract(b,e,a,w(d,"id"),c):a,b.didSaveRecord(d,f),d},function(a){throw a instanceof DS.InvalidError?b.recordWasInvalid(d,a.errors):b.recordWasError(d,a),a},h)}var t,u,v,w=Ember.get,x=Ember.set,y=Ember.run.once,z=Ember.isNone,A=Ember.EnumerableUtils.forEach,B=Ember.EnumerableUtils.indexOf,C=Ember.EnumerableUtils.map,D=Ember.RSVP.Promise,E=Ember.copy;t=Ember.Object.extend({init:function(){this.typeMaps={},this.recordArrayManager=DS.RecordArrayManager.create({store:this}),this._relationshipChanges={},this._pendingSave=[]},adapter:"-rest",serialize:function(a,b){return this.serializerFor(a.constructor.typeKey).serialize(a,b)},defaultAdapter:Ember.computed("adapter",function(){var a=w(this,"adapter");return"string"==typeof a&&(a=this.container.lookup("adapter:"+a)||this.container.lookup("adapter:application")||this.container.lookup("adapter:-rest")),DS.Adapter.detect(a)&&(a=a.create({container:this.container})),a}),createRecord:function(a,c){a=this.modelFor(a),c=E(c)||{},z(c.id)&&(c.id=this._generateId(a)),c.id=b(c.id);var d=this.buildRecord(a,c.id);return d.loadedData(),d.setProperties(c),d},_generateId:function(a){var b=this.adapterFor(a);return b&&b.generateIdForRecord?b.generateIdForRecord(this):null},deleteRecord:function(a){a.deleteRecord()},unloadRecord:function(a){a.unloadRecord()},find:function(a,c){return 1===arguments.length?this.findAll(a):"object"===Ember.typeOf(c)?this.findQuery(a,c):this.findById(a,b(c))},findById:function(a,b){a=this.modelFor(a);var c=this.recordForId(a,b),d=this.fetchRecord(c);return h(d||c,"DS: Store#findById "+a+" with id: "+b)},findByIds:function(a,b){var c=this;return i(Ember.RSVP.all(C(b,function(b){return c.findById(a,b)})).then(Ember.A,null,"DS: Store#findByIds of "+a+" complete"))},fetchRecord:function(a){if(z(a))return null;if(a._loadingPromise)return a._loadingPromise;if(!w(a,"isEmpty"))return null;var b=a.constructor,c=w(a,"id"),d=this.adapterFor(b),e=m(d,this,b,c);return a.loadingData(e),e},getById:function(a,b){return this.hasRecordForId(a,b)?this.recordForId(a,b):null},reloadRecord:function(a){var b=a.constructor,c=this.adapterFor(b),d=w(a,"id");return m(c,this,b,d)},fetchMany:function(a,b){if(a.length){var c=Ember.MapWithDefault.create({defaultValue:function(){return Ember.A()}});A(a,function(a){c.get(a.constructor).push(a)});var d=[];return A(c,function(a,c){var e=c.mapProperty("id"),f=this.adapterFor(a);d.push(n(f,this,a,e,b))},this),Ember.RSVP.all(d)}},hasRecordForId:function(a,c){return c=b(c),a=this.modelFor(a),!!this.typeMapFor(a).idToRecord[c]},recordForId:function(a,c){a=this.modelFor(a),c=b(c);var d=this.typeMapFor(a).idToRecord[c];return d||(d=this.buildRecord(a,c)),d},findMany:function(a,b,c,d){c=this.modelFor(c),b=Ember.A(b);var e=b.filterProperty("isEmpty",!0),f=this.recordArrayManager.createManyArray(c,b);return A(e,function(a){a.loadingData()}),f.loadingRecordsCount=e.length,e.length?(A(e,function(a){this.recordArrayManager.registerWaitingRecordArray(a,f)},this),d.resolve(this.fetchMany(e,a))):(d&&d.resolve(),f.set("isLoaded",!0),y(f,"trigger","didLoad")),f},findHasMany:function(a,b,c,d){var e=this.adapterFor(a.constructor),f=this.recordArrayManager.createManyArray(c.type,Ember.A([]));return d.resolve(o(e,this,a,b,c)),f},findBelongsTo:function(a,b,c){var d=this.adapterFor(a.constructor);return p(d,this,a,b,c)},findQuery:function(a,b){a=this.modelFor(a); var c=this.recordArrayManager.createAdapterPopulatedRecordArray(a,b),d=this.adapterFor(a);return i(r(d,this,a,b,c))},findAll:function(a){return a=this.modelFor(a),this.fetchAll(a,this.all(a))},fetchAll:function(a,b){var c=this.adapterFor(a),d=this.typeMapFor(a).metadata.since;return x(b,"isUpdating",!0),i(q(c,this,a,d))},didUpdateAll:function(a){var b=this.typeMapFor(a).findAllCache;x(b,"isUpdating",!1)},all:function(a){a=this.modelFor(a);var b=this.typeMapFor(a),c=b.findAllCache;if(c)return c;var d=this.recordArrayManager.createRecordArray(a);return b.findAllCache=d,d},unloadAll:function(a){for(var b,c=this.modelFor(a),d=this.typeMapFor(c),e=d.records.slice(),f=0;fa?"0"+a:""+a},e=a.getUTCFullYear(),f=a.getUTCMonth(),g=a.getUTCDate(),h=a.getUTCDay(),i=a.getUTCHours(),j=a.getUTCMinutes(),k=a.getUTCSeconds(),l=b[h],m=d(g),n=c[f];return l+", "+m+" "+n+" "+e+" "+d(i)+":"+d(j)+":"+d(k)+" GMT"}return null}});b["default"]=d}),b("ember-data/lib/transforms/number",["./base","exports"],function(a,b){"use strict";var c=a["default"],d=Ember.isEmpty,e=c.extend({deserialize:function(a){return d(a)?null:Number(a)},serialize:function(a){return d(a)?null:Number(a)}});b["default"]=e}),b("ember-data/lib/transforms/string",["./base","exports"],function(a,b){"use strict";var c=a["default"],d=Ember.isNone,e=c.extend({deserialize:function(a){return d(a)?null:String(a)},serialize:function(a){return d(a)?null:String(a)}});b["default"]=e}),b("ember-inflector/lib/ext/string",["../system/string"],function(a){"use strict";var b=a.pluralize,c=a.singularize;(Ember.EXTEND_PROTOTYPES===!0||Ember.EXTEND_PROTOTYPES.String)&&(String.prototype.pluralize=function(){return b(this)},String.prototype.singularize=function(){return c(this)})}),b("ember-inflector/lib/main",["./system","./ext/string","exports"],function(a,b,c){"use strict";var d=a.Inflector,e=a.inflections,f=a.pluralize,g=a.singularize;d.defaultRules=e,Ember.Inflector=d,Ember.String.pluralize=f,Ember.String.singularize=g,c["default"]=d,c.pluralize=f,c.singularize=g}),b("ember-inflector/lib/system",["./system/inflector","./system/string","./system/inflections","exports"],function(a,b,c,d){"use strict";var e=a["default"],f=b.pluralize,g=b.singularize,h=c["default"];e.inflector=new e(h),d.Inflector=e,d.singularize=g,d.pluralize=f,d.defaultRules=h}),b("ember-inflector/lib/system/inflections",["exports"],function(a){"use strict";var b={plurals:[[/$/,"s"],[/s$/i,"s"],[/^(ax|test)is$/i,"$1es"],[/(octop|vir)us$/i,"$1i"],[/(octop|vir)i$/i,"$1i"],[/(alias|status)$/i,"$1es"],[/(bu)s$/i,"$1ses"],[/(buffal|tomat)o$/i,"$1oes"],[/([ti])um$/i,"$1a"],[/([ti])a$/i,"$1a"],[/sis$/i,"ses"],[/(?:([^f])fe|([lr])f)$/i,"$1$2ves"],[/(hive)$/i,"$1s"],[/([^aeiouy]|qu)y$/i,"$1ies"],[/(x|ch|ss|sh)$/i,"$1es"],[/(matr|vert|ind)(?:ix|ex)$/i,"$1ices"],[/^(m|l)ouse$/i,"$1ice"],[/^(m|l)ice$/i,"$1ice"],[/^(ox)$/i,"$1en"],[/^(oxen)$/i,"$1"],[/(quiz)$/i,"$1zes"]],singular:[[/s$/i,""],[/(ss)$/i,"$1"],[/(n)ews$/i,"$1ews"],[/([ti])a$/i,"$1um"],[/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)(sis|ses)$/i,"$1sis"],[/(^analy)(sis|ses)$/i,"$1sis"],[/([^f])ves$/i,"$1fe"],[/(hive)s$/i,"$1"],[/(tive)s$/i,"$1"],[/([lr])ves$/i,"$1f"],[/([^aeiouy]|qu)ies$/i,"$1y"],[/(s)eries$/i,"$1eries"],[/(m)ovies$/i,"$1ovie"],[/(x|ch|ss|sh)es$/i,"$1"],[/^(m|l)ice$/i,"$1ouse"],[/(bus)(es)?$/i,"$1"],[/(o)es$/i,"$1"],[/(shoe)s$/i,"$1"],[/(cris|test)(is|es)$/i,"$1is"],[/^(a)x[ie]s$/i,"$1xis"],[/(octop|vir)(us|i)$/i,"$1us"],[/(alias|status)(es)?$/i,"$1"],[/^(ox)en/i,"$1"],[/(vert|ind)ices$/i,"$1ex"],[/(matr)ices$/i,"$1ix"],[/(quiz)zes$/i,"$1"],[/(database)s$/i,"$1"]],irregularPairs:[["person","people"],["man","men"],["child","children"],["sex","sexes"],["move","moves"],["cow","kine"],["zombie","zombies"]],uncountable:["equipment","information","rice","money","species","series","fish","sheep","jeans","police"]};a["default"]=b}),b("ember-inflector/lib/system/inflector",["exports"],function(a){"use strict";function b(a,b){for(var c=0,d=b.length;d>c;c++)a.uncountable[b[c].toLowerCase()]=!0}function c(a,b){for(var c,d=0,e=b.length;e>d;d++)c=b[d],a.irregular[c[0].toLowerCase()]=c[1],a.irregularInverse[c[1].toLowerCase()]=c[0]}function d(a){a=a||{},a.uncountable=a.uncountable||{},a.irregularPairs=a.irregularPairs||{};var d=this.rules={plurals:a.plurals||[],singular:a.singular||[],irregular:{},irregularInverse:{},uncountable:{}};b(d,a.uncountable),c(d,a.irregularPairs)}var e=/^\s*$/;d.prototype={plural:function(a,b){this.rules.plurals.push([a,b.toLowerCase()])},singular:function(a,b){this.rules.singular.push([a,b.toLowerCase()])},uncountable:function(a){b(this.rules,[a.toLowerCase()])},irregular:function(a,b){c(this.rules,[[a,b]])},pluralize:function(a){return this.inflect(a,this.rules.plurals,this.rules.irregular)},singularize:function(a){return this.inflect(a,this.rules.singular,this.rules.irregularInverse)},inflect:function(a,b,c){var d,f,g,h,i,j,k,l;if(i=e.test(a))return a;if(h=a.toLowerCase(),j=this.rules.uncountable[h])return a;if(k=c&&c[h])return k;for(var m=b.length,n=0;m>n&&(d=b[m-1],l=d[0],!l.test(a));m--);return d=d||[],l=d[0],f=d[1],g=a.replace(l,f)}},a["default"]=d}),b("ember-inflector/lib/system/string",["./inflector","exports"],function(a,b){"use strict";var c=a["default"],d=function(a){return c.inflector.pluralize(a)},e=function(a){return c.inflector.singularize(a)};b.pluralize=d,b.singularize=e}),a.DS=c("ember-data/lib/main")["default"]}(window); http_version: recorded_at: Mon, 17 Feb 2014 11:45:46 GMT recorded_with: VCR 2.8.0