J1wiIHQKLlwiIENvcHlyaWdodCAyMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi5cIiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi5cIgouXCIgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLlwiIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi5cIiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLlwiCi5cIiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLlwiIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgouXCIgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi5cIiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAouXCIgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLlwiCi5cIiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi5cIiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi5cIiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi5cIgouXCIgUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCi5cIiBDQSA5NTA1NCBVU0Egb3IgdmlzaXQgd3d3LnN1bi5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvcgouXCIgaGF2ZSBhbnkgcXVlc3Rpb25zLgouXCIgYCAKJ1wibWFjcm8gc3RkbWFjcm8KLlRIIGphdmFwIDEgIjIwMDYgx68gOSC37iA0IMb8IiAiSmF2YSBTRSA2IiAipeahvKW2obyls6XepfOlySIKLlNIICLMvsGwIgpqYXZhcCBcLSBKYXZhIKWvpemluaXVpaGlpKXrtdWloqW7pfOl1qXpCi5MUAoKLkxQCi5MUAqlr6Xppbml1aWhpaSl66TytdWloqW7pfOl1qXrpLek3qS5oaMKLkxQCi5cIiAKLlwiICBUaGlzIGRvY3VtZW50IHdhcyBjcmVhdGVkIGJ5IHNhdmluZyBhbiBIVE1MIGZpbGUgYXMgdGV4dAouXCIgIGZyb20gdGhlIEphdmFTb2Z0IHdlYiBzaXRlOgouXCIgCi5cIiBodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pkay8xLjIvZG9jcy90b29sZG9jcy90b29scy5odG1sCi5cIiAKLlwiICBhbmQgYWRkaW5nIGFwcHJvcHJpYXRlIHRyb2ZmIG1hY3Jvcy4gIEJlY2F1c2UgdGhlIEphdmFTb2Z0IHdlYiBzaXRlIAouXCIgIG1hbiBwYWdlcyBjYW4gY2hhbmdlIHdpdGhvdXQgbm90aWNlLCBpdCBtYXkgYmUgaGVscGZ1bCB0byBkaWZmCi5cIiAgZmlsZXMgdG8gaWRlbnRpZnkgY2hhbmdlcyBvdGhlciB0aGFuIG5ldyBmdW5jdGlvbmFsaXR5LiAKLlwiIAouU0ggIrfBvLAiCi5CICBqYXZhcApbCi5CIG9wdGlvbnMKXSAKLklSIGNsYXNzIC5cfC5cfC4KLlNIICK1oce9wOLMwCIKLklYICJKYXZhIGNsYXNzIGZpbGUgZGlzYXNzZW1ibGVyIiAiIiAiSmF2YSBjbGFzcyBmaWxlIGRpc2Fzc2VtYmxlciBcKGVtIFxmTGphdmFwXGZQIgouSVggImphdmFwIiAiIiAiXGZMamF2YXBcZlAgXChlbSBKYXZhIGNsYXNzIGZpbGUgZGlzYXNzZW1ibGVyIgouQiBqYXZhcAqls6XepfOlyaTPoaIKSmF2YSClr6Xppbml1aWhpaSl66TytdWloqW7pfOl1qXrpLek3qS5oaMKvdDOz8bizcakz6Wqpdelt6XnpfOkx7vYxOqkt6TepLmhowqlqqXXpbel56XzpPIKMQqkxKTiu9jE6qS3pMqkpKTIoaIKLkIgamF2YXAKpM/Fz6S1pOykv6WvpemluaTOCi5CUiBwYWNrYWdloaIKLkJSIHByb3RlY3RlZKGiCqSqpOik0yAKLkIgcHVibGljCqXVpaOhvKXrpcmkyKXhpb2lw6XJpPK90M7PpLek3qS5oaMKLkIgamF2YXAKpbOl3qXzpcmkzr3Qzs/A6KTPCi5CIHN0ZG91dAqkx6S5oaOkv6TIpKik0KGisMqyvKTOpa+l6aW5wOu4wKTypbOl86XRpaSl66S3pN6kuaGjCi5SUwoubmYKXGYzCmltcG9ydCBqYXZhLmF3dC4qOwppbXBvcnQgamF2YS5hcHBsZXQuKjsKCnB1YmxpYyBjbGFzcyBEb2NGb290ZXIgZXh0ZW5kcyBBcHBsZXQgewoJCVN0cmluZyBkYXRlOwoJCVN0cmluZyBlbWFpbDsKCgkJcHVibGljIHZvaWQgaW5pdCgpIHsKCQkJcmVzaXplKDUwMCwxMDApOwoJCQlkYXRlID0gZ2V0UGFyYW1ldGVyKCJMQVNUX1VQREFURUQiKTsKCQkJZW1haWwgPSBnZXRQYXJhbWV0ZXIoIkVNQUlMIik7CgkJfQoKCQlwdWJsaWMgdm9pZCBwYWludChHcmFwaGljcyBnKSB7CgkJCWcuZHJhd1N0cmluZyhkYXRlICsgIiBieSAiLDEwMCwgMTUpOwoJCQlnLmRyYXdTdHJpbmcoZW1haWwsMjkwLDE1KTsKCQl9Cn0KXGYxCi5maQouUkUKLkxQCqSzpM6+7LnnoaIKLkIgamF2YXAgRG9jRm9vdGVyCqTyvMK51KS5pOukyLDKsrykzr3Qzs+krMbApOmk7KTepLmhowouUlMKXGYzCi5uZgpDb21waWxlZCBmcm9tIERvY0Zvb3Rlci5qYXZhCnB1YmxpYyBjbGFzcyBEb2NGb290ZXIgZXh0ZW5kcyBqYXZhLmFwcGxldC5BcHBsZXQgewoJamF2YS5sYW5nLlN0cmluZyBkYXRlOwoJamF2YS5sYW5nLlN0cmluZyBlbWFpbDsKCXB1YmxpYyB2b2lkIGluaXQoKTsKCXB1YmxpYyB2b2lkIHBhaW50KGphdmEuYXd0LkdyYXBoaWNzKTsKCXB1YmxpYyBEb2NGb290ZXIoKTsKfQpcZjEKLmZpCi5MUApcZjNqYXZhcCBcLWMgRG9jRm9vdGVyXGZQIKTyvMK51KS5pOukyLDKsrykzr3Qzs+krMbApOmk7KTepLmhowouTFAKLlJTIDMKCi5MUAoubmYKXGYzCi5mbApDb21waWxlZCBmcm9tIERvY0Zvb3Rlci5qYXZhCi5mbApwdWJsaWMgY2xhc3MgRG9jRm9vdGVyIGV4dGVuZHMgamF2YS5hcHBsZXQuQXBwbGV0IHsKLmZsCiAgICBqYXZhLmxhbmcuU3RyaW5nIGRhdGU7Ci5mbAogICAgamF2YS5sYW5nLlN0cmluZyBlbWFpbDsKLmZsCiAgICBwdWJsaWMgRG9jRm9vdGVyKCk7Ci5mbAogICAgcHVibGljIHZvaWQgaW5pdCgpOwouZmwKICAgIHB1YmxpYyB2b2lkIHBhaW50KGphdmEuYXd0LkdyYXBoaWNzKTsKLmZsCn0KLmZsCgouZmwKTWV0aG9kIERvY0Zvb3RlcigpCi5mbAogICAwIGFsb2FkXzAKLmZsCiAgIDEgaW52b2tlc3BlY2lhbCAjMSA8TWV0aG9kIGphdmEuYXBwbGV0LkFwcGxldCgpPgouZmwKICAgNCByZXR1cm4KLmZsCgouZmwKTWV0aG9kIHZvaWQgaW5pdCgpCi5mbAogICAwIGFsb2FkXzAKLmZsCiAgIDEgc2lwdXNoIDUwMAouZmwKICAgNCBiaXB1c2ggMTAwCi5mbAogICA2IGludm9rZXZpcnR1YWwgIzIgPE1ldGhvZCB2b2lkIHJlc2l6ZShpbnQsIGludCk+Ci5mbAogICA5IGFsb2FkXzAKLmZsCiAgMTAgYWxvYWRfMAouZmwKICAxMSBsZGMgIzMgPFN0cmluZyAiTEFTVF9VUERBVEVEIj4KLmZsCiAgMTMgaW52b2tldmlydHVhbCAjNCA8TWV0aG9kIGphdmEubGFuZy5TdHJpbmcgZ2V0UGFyYW1ldGVyKGphdmEubGFuZy5TdHJpbmcpPgouZmwKICAxNiBwdXRmaWVsZCAjNSA8RmllbGQgamF2YS5sYW5nLlN0cmluZyBkYXRlPgouZmwKICAxOSBhbG9hZF8wCi5mbAogIDIwIGFsb2FkXzAKLmZsCiAgMjEgbGRjICM2IDxTdHJpbmcgIkVNQUlMIj4KLmZsCiAgMjMgaW52b2tldmlydHVhbCAjNCA8TWV0aG9kIGphdmEubGFuZy5TdHJpbmcgZ2V0UGFyYW1ldGVyKGphdmEubGFuZy5TdHJpbmcpPgouZmwKICAyNiBwdXRmaWVsZCAjNyA8RmllbGQgamF2YS5sYW5nLlN0cmluZyBlbWFpbD4KLmZsCiAgMjkgcmV0dXJuCi5mbAoKLmZsCk1ldGhvZCB2b2lkIHBhaW50KGphdmEuYXd0LkdyYXBoaWNzKQouZmwKICAgMCBhbG9hZF8xCi5mbAogICAxIG5ldyAjOCA8Q2xhc3MgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcj4KLmZsCiAgIDQgZHVwCi5mbAogICA1IGludm9rZXNwZWNpYWwgIzkgPE1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk+Ci5mbAogICA4IGFsb2FkXzAKLmZsCiAgIDkgZ2V0ZmllbGQgIzUgPEZpZWxkIGphdmEubGFuZy5TdHJpbmcgZGF0ZT4KLmZsCiAgMTIgaW52b2tldmlydHVhbCAjMTAgPE1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIGFwcGVuZChqYXZhLmxhbmcuU3RyaW5nKT4KLmZsCiAgMTUgbGRjICMxMSA8U3RyaW5nICIgYnkgIj4KLmZsCiAgMTcgaW52b2tldmlydHVhbCAjMTAgPE1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIGFwcGVuZChqYXZhLmxhbmcuU3RyaW5nKT4KLmZsCiAgMjAgaW52b2tldmlydHVhbCAjMTIgPE1ldGhvZCBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCk+Ci5mbAogIDIzIGJpcHVzaCAxMDAKLmZsCiAgMjUgYmlwdXNoIDE1Ci5mbAogIDI3IGludm9rZXZpcnR1YWwgIzEzIDxNZXRob2Qgdm9pZCBkcmF3U3RyaW5nKGphdmEubGFuZy5TdHJpbmcsIGludCwgaW50KT4KLmZsCiAgMzAgYWxvYWRfMQouZmwKICAzMSBhbG9hZF8wCi5mbAogIDMyIGdldGZpZWxkICM3IDxGaWVsZCBqYXZhLmxhbmcuU3RyaW5nIGVtYWlsPgouZmwKICAzNSBzaXB1c2ggMjkwCi5mbAogIDM4IGJpcHVzaCAxNQouZmwKICA0MCBpbnZva2V2aXJ0dWFsICMxMyA8TWV0aG9kIHZvaWQgZHJhd1N0cmluZyhqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGludCk+Ci5mbAogIDQzIHJldHVybgouZmwKXGZQCi5maQouUkUKCi5MUAouU0ggIqWqpdelt6XnpfMiCi5MUAoKLkxQCi5UUCAzClwtaGVscCAKXGYzamF2YXBcZlAgpM6l2KXrpdel4aXDpbuhvKW4pPK90M7PpLek3qS5oaMKLlRQIDMKXC1sIAq51MjWueakyLbJverK0b/0pcahvKXWpeuk8sm9vKikt6TepLmhowouVFAgMwpcLWIgCkpESyAxLjEgpM4gXGYzamF2YXBcZlAgpMikzrK8sMy437S5wK2k8srdvtqkt6TepLmhowouVFAgMwpcLXB1YmxpYyAKcHVibGljIKWvpemluaSqpOik06XhpfOl0KTApLGk8sm9vKikt6TepLmhowouVFAgMwpcLXByb3RlY3RlZCAKcHJvdGVjdGVkIKSqpOik0yBwdWJsaWMgpM6lr6XppbmkyKXhpfOl0KTApLGk8sm9vKikt6TepLmhowouVFAgMwpcLXBhY2thZ2UgCnBhY2thZ2WhonByb3RlY3RlZKGipKqk6KTTIHB1YmxpYyCkzqWvpemluaTIpeGl86XQpMCksaTyyb28qKS3pN6kuaGjpLOk7KTPpcel1aWppeulyKTOwN/E6qTHpLmhowouVFAgMwpcLXByaXZhdGUgCqS5pNmkxqTOpa+l6aW5pMil4aXzpdCk8sm9vKikt6TepLmhowouVFAgMwpcLUpmbGFnIAql6aXzpb+lpKXgpbeluaXGpeCky8S+wNwgXGYyZmxhZ1xmUCCk8sXPpLek3qS5oaO7yM3RzuOk8ryhpMu8qKS3pN6kuaGjCi5SUyAzCgouTFAKLm5mClxmMwouZmwKamF2YXAgXC1KXC12ZXJzaW9uCi5mbApqYXZhcCBcLUpcLURqYXZhLnNlY3VyaXR5Lm1hbmFnZXIgXC1KXC1EamF2YS5zZWN1cml0eS5wb2xpY3k9TXlQb2xpY3kgTXlDbGFzc05hbWUKLmZsClxmUAouZmkKLlJFCi5UUCAzClwtcyAKxuLJ9KTOt7+lt6WwpculwaXjobyk8r3Qzs+kt6TepLmhowouVFAgMwpcLWMgCqWvpemluaTOs8al4aW9pcOlyaTOpL+k4aTLtdWloqW7pfOl1qXrpLWk7KTrpbOhvKXJoaKkuaTKpO+kwSBKYXZhIKXQpaSlyKWzobylyaSrpOnArqTrzL/O4aTyyb28qKS3pN6kuaGjpLOk7KTppM8KLmZpCmh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy92bXNwZWMvCqTOCi5uYQqh1lxmMkphdmEgVmlydHVhbCBNYWNoaW5lIFNwZWNpZmljYXRpb25cZlCh16TLpcmlraXlpeGl86XIsr2ktaTspMakpKTepLmhowouVFAgMwpcLXZlcmJvc2UgCqXhpb2lw6XJpM6luaW/pcOlr6W1paSluqGipKqk6KTTIFxmMmxvY2Fsc1xmUCCkyCBcZjJhcmdzXGZQIKTOv/Sk8r3Qzs+kt6TepLmhowouVFAgMwpcLWNsYXNzcGF0aCBwYXRoIApcZjNqYXZhcFxmUCCkrKWvpemluaTyw7WkuaS/pOGky7vIzdGkuaTrpdGluaTyu9jE6qS3pN6kuaGjpcel1aWppeulyKTepL+kzyBDTEFTU1BBVEggtMS2rcrRv/TA38TqpPK+5b3xpK2kt6TepLmho6XHpaOl7KWvpcil6qTPpbOl7aXzpMfKrLPkpLek3qS5oaOkt6S/pKykw6TGoaJcZjJwYXRoXGZQIKTOsOzIzLfBvLCkz7yhpM6k6KSmpMukyqTqpN6kuaGjCi5uZgpcZjMKLmZsCiAgIC46PHlvdXJfcGF0aD4KLmZsClxmUAouZmkKvKGky87jpPK8qKS3pN6kuaGjCi5uZgpcZjMKLmZsCi46L2hvbWUvYXZoL2NsYXNzZXM6L3Vzci9sb2NhbC9qYXZhL2NsYXNzZXMKLmZsClxmUAouZmkKLlRQIDMKXC1ib290Y2xhc3NwYXRoIHBhdGggCqXWobylyKW5pcil6aXDpdelr6Xppbmk8qXtobylyaS5pOul0aW5pPK72MTqpLek3qS5oaOl1qG8pciluaXIpemlw6XXpa+l6aW5pM+hoqXHpdWlqaXrpcikx6TPIFxmMmpyZS9saWIvcnQuamFyXGZQIKSqpOik08K+pM6kpKSvpMSkq6TOIEpBUiCl1aWhpaSl6yCky6SipOuhoqWzpaIgSmF2YSCl16XppcOlyKXVpamhvKXgpPK8wsH1pLmk66WvpemluaTHpLmhowouVFAgMwpcLWV4dGRpcnMgZGlycyAKpaSl86W5pcihvKXrpLWk7KS/s8jEpbWhx72k8rihuvekuaTrvuy96qTypaqhvKXQobyl6aWkpcmkt6TepLmho7PIxKW1oce9pM+hoqXHpdWlqaXrpcikx6TPIFxmMmphdmEuZXh0LmRpcnNcZlAgpMukoqTqpN6kuaGjCi5MUAouU0ggIrTEtq3K0b/0IgouVFAgMTUKLkIgQ0xBU1NQQVRICqXmobyltsTqtcGlr6Xppbmk2KTOpdGluaTypbeluaXGpeCky8TMw86kuaTrpL+k4aTLu8jN0aS3pN6kuaGjCsqjv/SkzqXHpaOl7KWvpcil6qTyu9jE6qS5pOu+7LnnpM+ls6XtpfOkx7bowNqk6qTepLmhowqwyrK8pMvO46TyvKikt6TepLmhowouc3AgMW4KLlJTIDEwCi5CIC46L2hvbWUvYXZoL2NsYXNzZXM6L3Vzci9sb2NhbC9qYXZhL2NsYXNzZXMKLlJFCi5TSCAitNjPorngzNwiCi5MUAoKLkxQCi5MUApqYXZhY6GiamF2YaGiamRioaJqYXZhaKGiamF2YWRvYwouTFAKCi5MUAogCg==