PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvRFREIEhUTUwgNC4wMS8vRU4iCiAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+CjxodG1sIGxhbmc9ImVzIiB4bWw6bGFuZz0iZXMiPgoKPGhlYWQ+CjxtZXRhIEhUVFAtRVFVSVY9InJlZnJlc2giIENPTlRFTlQ9IjE7IHVybD1jb250ZW50cy5odG0iPgo8dGl0bGU+PC90aXRsZT4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgo8L2hlYWQ+Cgo8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIiB0ZXh0PSIjMDAwMDAwIiBsaW5rPSIjMDA0MDgwIiB2bGluaz0iIzY2NjY2NiIgYWxpbms9IiMwMDAwRkYiPgoKCjx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPjx0cj48dGQgdmFsaWduPSJ0b3AiPgoKCgoKCgo8aDMgYWxpZ249ImNlbnRlciI+zW5kaWNlPC9oMz4KCjxwPjxicj4KPC9wPgoKPGg0IGFsaWduPSJjZW50ZXIiPkVzcGVyZSBtaWVudHJhcyBzZSBjYXJnYSBlbCDtbmRpY2UgZGUgbGEgcOFnaW5hLi4uPC9oND4KPHByZSBtc25hdmlnYXRpb24+IDwvcHJlPjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQiPgoKCiAgICAgIDxwPiA8c21hbGw+PHNtYWxsPkNvcHlyaWdodCZuYnNwOwogICAgICAgICZjb3B5OyAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiB5IG90cm9zPC9zbWFsbD48L3NtYWxsPjwvcD4KCjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQiPjwvdGQ+PHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMSUiPgo8cD4KPGEgaHJlZj0iLi4vaW5kZXguaHRtIj48L2E+CjwvcD4KCjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgp2YXIgYWxyZWFkeV91c2luZ19mcmFtZXNfTVNHPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIHlhIHNlIG11ZXN0cmEgY29uIG1hcmNvcyI7Ci8vIDwhLS0KZnVuY3Rpb24gbG9hZFRvcCgpCnsKICBpZihwYXJlbnQuZnJhbWVzLmxlbmd0aCE9MCAmJiBwYXJlbnQuZnJhbWVzWzFdLm5hbWU9PSJvcnlfdG9jIikKICB7CiAgICAgYWxlcnQoYWxyZWFkeV91c2luZ19mcmFtZXNfTVNHKTsKICB9CiAgZWxzZQogIHsKICAgIHZhciBleHBpcmVzID0gbmV3IERhdGUoKTsKICAgIGV4cGlyZXMuc2V0VGltZSAoZXhwaXJlcy5nZXRUaW1lKCkgKyAoMTAwMCAqIDIwKSk7CiAgICBkb2N1bWVudC5jb29raWUgPSAicnVwX29yeV9kb2M9IiArIGVzY2FwZSAoZG9jdW1lbnQuVVJMKSArCiAgICAiOyBleHBpcmVzPSIgKyBleHBpcmVzLnRvVVRDU3RyaW5nKCkgKyAgIjsgcGF0aD0vIjsKCiAgICB2YXIgbmV3X29yeV9kb2NfbG9jID0gbnVsbDsKCiAgICBmb3IoaT1kb2N1bWVudC5saW5rcy5sZW5ndGgtMTtpPj0wO2ktLSkKICAgIHsKICAgICAgIGlmKGRvY3VtZW50LmxpbmtzW2ldLmhyZWYuaW5kZXhPZigiaW5kZXguaHRtIikhPS0xKQogICAgICAgewogICAgICAgICBuZXdfb3J5X2RvY19sb2MgPSBkb2N1bWVudC5saW5rc1tpXS5ocmVmOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgIH0KCiAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpCiAgICB7CglpZiggc2VsZi5uYW1lID09ICJvcnlfZG9jIiApCgl7CgkJd2luZG93LmNsb3NlKCk7CgkJd2luZG93Lm9wZW4oIG5ld19vcnlfZG9jX2xvYyApOwoJfQoJZWxzZQoJewoJICAgICAgIAl0b3AubG9jYXRpb24gPSBuZXdfb3J5X2RvY19sb2M7Cgl9CiAgICB9CiAgIH0KfQovLyAtLT4KPC9zY3JpcHQ+CjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgovLyA8IS0tCiAgZnVuY3Rpb24gZ2V0SW1hZ2VVcmwoaW1hZ2UpCiAgewogICAgdmFyIG5ld19vcnlfZG9jX2xvYz1udWxsOwogICAgZm9yKGk9ZG9jdW1lbnQubGlua3MubGVuZ3RoLTE7aT49MDtpLS0pCiAgICB7CiAgICAgICBpZihkb2N1bWVudC5saW5rc1tpXS5ocmVmLmluZGV4T2YoImluZGV4Lmh0bSIpIT0tMSkKICAgICAgIHsKICAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gZG9jdW1lbnQubGlua3NbaV0uaHJlZi5zdWJzdHJpbmcoMCxkb2N1bWVudC5saW5rc1tpXS5ocmVmLmxhc3RJbmRleE9mKCIvIikpOwogICAgICAgICBuZXdfb3J5X2RvY19sb2MgPSBuZXdfb3J5X2RvY19sb2MgKyAiIiArIGltYWdlOwogICAgICAgICByZXR1cm4gbmV3X29yeV9kb2NfbG9jOwogICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQovLyAtLT4KPC9zY3JpcHQ+CjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgovLyA8IS0tCk1TRlBob3ZlciA9CigoKG5hdmlnYXRvci5hcHBOYW1lID09ICJOZXRzY2FwZSIpICYmCiAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSAzICkpIHx8CiAgKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIikgJiYKICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDQgKSkpOwoKICBmdW5jdGlvbiBNU0ZQcHJlbG9hZChpbWcpCiAgewogICAgIHZhciBhPW5ldyBJbWFnZSgpOwogICAgIGEuc3JjPWltZzsKICAgICByZXR1cm4gYTsKICB9Ci8vIC0tPgo8L3NjcmlwdD4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci8vIDwhLS0KICAgIGlmKE1TRlBob3ZlcikKICAgIHsKICAgICAgICBSdXBHcmF5PU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmJykpOwogICAgICAgIFJ1cEJsdWU9TVNGUHByZWxvYWQoZ2V0SW1hZ2VVcmwoJy9pbWFnZXMvZGlzcGxheV92aWV3c19hLmdpZicpKTsKICAgIH0KLy8gLS0+Cjwvc2NyaXB0PgoKPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+CiAgIHZhciBkaXNwbGF5RnJhbWVzTXNnPSJWaXN1YWxpemFyIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgY29uIG1hcmNvcyI7Ci8vIDwhLS0KICAgZnVuY3Rpb24gbW91c2VPdmVyKCkKICAgewogICAJCWlmKE1TRlBob3ZlcikgCiAgIAkJCWRvY3VtZW50WydIb21lJ10uc3JjPVJ1cEJsdWUuc3JjOyAKICAgCQlzZWxmLnN0YXR1cz1kaXNwbGF5RnJhbWVzTXNnOyAKICAgCQlyZXR1cm4gdHJ1ZTsKICAgfQovLyAtLT4KPC9zY3JpcHQ+Cgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KdmFyIGNsZWFyU3RhdHVzTXNnPSIgIjsKLy8gPCEtLQpmdW5jdGlvbiBtb3VzZU91dCgpCnsKaWYoTVNGUGhvdmVyKSAKZG9jdW1lbnRbJ0hvbWUnXS5zcmM9UnVwR3JheS5zcmM7IApzZWxmLnN0YXR1cz1jbGVhclN0YXR1c01zZzsKcmV0dXJuIHRydWU7Cn0KLy8gLS0+Cjwvc2NyaXB0PgoKPGEgaHJlZj0iSmF2YVNjcmlwdDpsb2FkVG9wKCk7IiBvbm1vdXNlb3Zlcj0iSmF2YVNjcmlwdDptb3VzZU92ZXIoKTsiIG9ubW91c2VvdXQ9IkphdmFTY3JpcHQ6bW91c2VPdXQoKTsiPgoKPHA+CjxpbWcgc3JjPSIuLi9pbWFnZXMvcnVwMS5naWYiIGJvcmRlcj0iMCIgYWx0PSJWaXN1YWxpemFyIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgY29uIG1hcmNvcyIgbmFtZT0iSG9tZSIgd2lkdGg9IjIwIiBoZWlnaHQ9IjExMCI+PC9wPjwvYT4KPC90ZD48L3RyPjwvdGFibGU+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+PHRyPjx0ZD4KPHAgYWxpZ249InJpZ2h0Ij48c21hbGw+PHNtYWxsPkVjbGlwc2UgUHJvY2VzcwpGcmFtZXdvcmsmbmJzcDsmbmJzcDs8L3NtYWxsPjwvc21hbGw+CjwvdGQ+PC90cj48L3RhYmxlPgoKCjwvYm9keT4KPC9odG1sPgo=