ZGlmZiAtLWdpdCBhL0VQUGx1cy9Db21wYXRpYmlsaXR5L0ltYWdlQ29tcGF0LmNzIGIvRVBQbHVzL0NvbXBhdGliaWxpdHkvSW1hZ2VDb21wYXQuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YWVmZGUuLjAwMDAwMDAKLS0tIGEvRVBQbHVzL0NvbXBhdGliaWxpdHkvSW1hZ2VDb21wYXQuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi11c2luZyBTeXN0ZW0uSU87Ci11c2luZyBJcm9uU29mdHdhcmUuRHJhd2luZzsKLQotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29tcGF0aWJpbGl0eQotewotICAgIGludGVybmFsIGNsYXNzIEltYWdlQ29tcGF0Ci0gICAgewotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgYnl0ZVtdIEdldEltYWdlQXNCeXRlQXJyYXkoQW55Qml0bWFwIGltYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCk7Ci0gICAgICAgICAgICBpZiAoaW1hZ2UuR2V0SW1hZ2VGb3JtYXQoKSA9PSBBbnlCaXRtYXAuSW1hZ2VGb3JtYXQuR2lmIHx8Ci0gICAgICAgICAgICAgICAgaW1hZ2UuR2V0SW1hZ2VGb3JtYXQoKSA9PSBBbnlCaXRtYXAuSW1hZ2VGb3JtYXQuQm1wIHx8Ci0gICAgICAgICAgICAgICAgaW1hZ2UuR2V0SW1hZ2VGb3JtYXQoKSA9PSBBbnlCaXRtYXAuSW1hZ2VGb3JtYXQuUG5nIHx8Ci0gICAgICAgICAgICAgICAgaW1hZ2UuR2V0SW1hZ2VGb3JtYXQoKSA9PSBBbnlCaXRtYXAuSW1hZ2VGb3JtYXQuVGlmZikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbWFnZS5FeHBvcnRTdHJlYW0obXMsIGltYWdlLkdldEltYWdlRm9ybWF0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGltYWdlLkV4cG9ydFN0cmVhbShtcywgQW55Qml0bWFwLkltYWdlRm9ybWF0LkpwZWcpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbXMuVG9BcnJheSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxCYXJDaGFydC5jcyBiL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQmFyQ2hhcnQuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YTIzYzYuLjAwMDAwMDAKLS0tIGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxCYXJDaGFydC5jcworKysgL2Rldi9udWxsCkBAIC0xLDQ5MyArMCwwIEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKLSAqCi0gKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgotICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAotICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCi0gKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCi0gKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgotICoKLSAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCi0gKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTIwMDktMTAtMDEKLSAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlhtbDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuVGFibGUuUGl2b3RUYWJsZTsKLQotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZy5DaGFydAotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQmFyIGNoYXJ0Ci0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsQmFyQ2hhcnQgOiBFeGNlbENoYXJ0Ci0gICAgewotICAgICAgICAjcmVnaW9uICJDb25zdHJ1Y3RvcnMiCi0gICAgICAgIC8vaW50ZXJuYWwgRXhjZWxCYXJDaGFydChFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBYbWxOb2RlIG5vZGUpIDoKLSAgICAgICAgLy8gICAgYmFzZShkcmF3aW5ncywgbm9kZS8qLCAxKi8pCi0gICAgICAgIC8vewotICAgICAgICAvLyAgICBTZXRDaGFydE5vZGVUZXh0KCIiKTsKLSAgICAgICAgLy99Ci0gICAgICAgIC8vaW50ZXJuYWwgRXhjZWxCYXJDaGFydChFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBYbWxOb2RlIG5vZGUsIGVDaGFydFR5cGUgdHlwZSkgOgotICAgICAgICAvLyAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCB0eXBlKQotICAgICAgICAvL3sKLSAgICAgICAgLy8gICAgU2V0Q2hhcnROb2RlVGV4dCgiIik7Ci0KLSAgICAgICAgLy8gICAgU2V0VHlwZVByb3BlcnRpZXMoZHJhd2luZ3MsIHR5cGUpOwotICAgICAgICAvL30KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxCYXJDaGFydChFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBYbWxOb2RlIG5vZGUsIGVDaGFydFR5cGUgdHlwZSwgRXhjZWxDaGFydCB0b3BDaGFydCwgRXhjZWxQaXZvdFRhYmxlIFBpdm90VGFibGVTb3VyY2UpIDoKLSAgICAgICAgICAgIGJhc2UoZHJhd2luZ3MsIG5vZGUsIHR5cGUsIHRvcENoYXJ0LCBQaXZvdFRhYmxlU291cmNlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZXRDaGFydE5vZGVUZXh0KCIiKTsKLQotICAgICAgICAgICAgU2V0VHlwZVByb3BlcnRpZXMoZHJhd2luZ3MsIHR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxCYXJDaGFydChFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBYbWxOb2RlIG5vZGUsIFVyaSB1cmlDaGFydCwgUGFja2FnaW5nLlppcFBhY2thZ2VQYXJ0IHBhcnQsIFhtbERvY3VtZW50IGNoYXJ0WG1sLCBYbWxOb2RlIGNoYXJ0Tm9kZSkgOgotICAgICAgICAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCB1cmlDaGFydCwgcGFydCwgY2hhcnRYbWwsIGNoYXJ0Tm9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgU2V0Q2hhcnROb2RlVGV4dChjaGFydE5vZGUuTmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCBFeGNlbEJhckNoYXJ0KEV4Y2VsQ2hhcnQgdG9wQ2hhcnQsIFhtbE5vZGUgY2hhcnROb2RlKSA6IAotICAgICAgICAgICAgYmFzZSh0b3BDaGFydCwgY2hhcnROb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZXRDaGFydE5vZGVUZXh0KGNoYXJ0Tm9kZS5OYW1lKTsKLSAgICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uCi0gICAgICAgICNyZWdpb24gIlByaXZhdGUgZnVuY3Rpb25zIgotICAgICAgICAvL3N0cmluZyBfY2hhcnRUb3BQYXRoPSJjOmNoYXJ0U3BhY2UvYzpjaGFydC9jOnBsb3RBcmVhL3swfSI7Ci0gICAgICAgIHByaXZhdGUgdm9pZCBTZXRDaGFydE5vZGVUZXh0KHN0cmluZyBjaGFydE5vZGVUZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihzdHJpbmcuSXNOdWxsT3JFbXB0eShjaGFydE5vZGVUZXh0KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaGFydE5vZGVUZXh0ID0gR2V0Q2hhcnROb2RlVGV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9fY2hhcnRUb3BQYXRoID0gc3RyaW5nLkZvcm1hdChfY2hhcnRUb3BQYXRoLCBjaGFydE5vZGVUZXh0KTsKLSAgICAgICAgICAgIC8vX2RpcmVjdGlvblBhdGggPSBzdHJpbmcuRm9ybWF0KF9kaXJlY3Rpb25QYXRoLCBfY2hhcnRUb3BQYXRoKTsKLSAgICAgICAgICAgIC8vX3NoYXBlUGF0aCA9IHN0cmluZy5Gb3JtYXQoX3NoYXBlUGF0aCwgX2NoYXJ0VG9wUGF0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFNldFR5cGVQcm9wZXJ0aWVzKEV4Y2VsRHJhd2luZ3MgZHJhd2luZ3MsIGVDaGFydFR5cGUgdHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqKioqKiogQmFyIGRpcmVjdGlvbiAqKioqKioqLwotICAgICAgICAgICAgaWYgKHR5cGUgPT0gZUNoYXJ0VHlwZS5CYXJDbHVzdGVyZWQgfHwKLSAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQmFyU3RhY2tlZCB8fAotICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5CYXJTdGFja2VkMTAwIHx8Ci0gICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLkJhckNsdXN0ZXJlZDNEIHx8Ci0gICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLkJhclN0YWNrZWQzRCB8fAotICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5CYXJTdGFja2VkMTAwM0QgfHwKLSAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQ29uZUJhckNsdXN0ZXJlZCB8fAotICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5Db25lQmFyU3RhY2tlZCB8fAotICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5Db25lQmFyU3RhY2tlZDEwMCB8fAotICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckJhckNsdXN0ZXJlZCB8fAotICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckJhclN0YWNrZWQgfHwKLSAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQ3lsaW5kZXJCYXJTdGFja2VkMTAwIHx8Ci0gICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLlB5cmFtaWRCYXJDbHVzdGVyZWQgfHwKLSAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuUHlyYW1pZEJhclN0YWNrZWQgfHwKLSAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuUHlyYW1pZEJhclN0YWNrZWQxMDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRGlyZWN0aW9uID0gZURpcmVjdGlvbi5CYXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICgKLSAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQ29sdW1uQ2x1c3RlcmVkIHx8Ci0gICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQgfHwKLSAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQ29sdW1uU3RhY2tlZDEwMCB8fAotICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5Db2x1bW4zRCB8fAotICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5Db2x1bW5DbHVzdGVyZWQzRCB8fAotICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5Db2x1bW5TdGFja2VkM0QgfHwKLSAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQ29sdW1uU3RhY2tlZDEwMDNEIHx8Ci0gICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLkNvbmVDb2wgfHwKLSAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQ29uZUNvbENsdXN0ZXJlZCB8fAotICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5Db25lQ29sU3RhY2tlZCB8fAotICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5Db25lQ29sU3RhY2tlZDEwMCB8fAotICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckNvbCB8fAotICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckNvbENsdXN0ZXJlZCB8fAotICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckNvbFN0YWNrZWQgfHwKLSAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQ3lsaW5kZXJDb2xTdGFja2VkMTAwIHx8Ci0gICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLlB5cmFtaWRDb2wgfHwKLSAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuUHlyYW1pZENvbENsdXN0ZXJlZCB8fAotICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5QeXJhbWlkQ29sU3RhY2tlZCB8fAotICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5QeXJhbWlkQ29sU3RhY2tlZDEwMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEaXJlY3Rpb24gPSBlRGlyZWN0aW9uLkNvbHVtbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqKioqKiBTaGFwZSAqKioqKiovCi0gICAgICAgICAgICBpZiAoLyp0eXBlID09IGVDaGFydFR5cGUuQ29sdW1uQ2x1c3RlcmVkIHx8Ci0gICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQgfHwKLSAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQ29sdW1uU3RhY2tlZDEwMCB8fCovCi0gICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLkNvbHVtbjNEIHx8Ci0gICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLkNvbHVtbkNsdXN0ZXJlZDNEIHx8Ci0gICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQzRCB8fAotICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5Db2x1bW5TdGFja2VkMTAwM0QgfHwKLSAgICAgICAgICAgICAgICAvKnR5cGUgPT0gZUNoYXJ0VHlwZS5CYXJDbHVzdGVyZWQgfHwKLSAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQmFyU3RhY2tlZCB8fAotICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5CYXJTdGFja2VkMTAwIHx8Ki8KLSAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQmFyQ2x1c3RlcmVkM0QgfHwKLSAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQmFyU3RhY2tlZDNEIHx8Ci0gICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLkJhclN0YWNrZWQxMDAzRCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTaGFwZSA9IGVTaGFwZS5Cb3g7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICgKLSAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQ3lsaW5kZXJCYXJDbHVzdGVyZWQgfHwKLSAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQ3lsaW5kZXJCYXJTdGFja2VkIHx8Ci0gICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLkN5bGluZGVyQmFyU3RhY2tlZDEwMCB8fAotICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckNvbCB8fAotICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckNvbENsdXN0ZXJlZCB8fAotICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckNvbFN0YWNrZWQgfHwKLSAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQ3lsaW5kZXJDb2xTdGFja2VkMTAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNoYXBlID0gZVNoYXBlLkN5bGluZGVyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoCi0gICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLkNvbmVCYXJDbHVzdGVyZWQgfHwKLSAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQ29uZUJhclN0YWNrZWQgfHwKLSAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQ29uZUJhclN0YWNrZWQxMDAgfHwKLSAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuQ29uZUNvbCB8fAotICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5Db25lQ29sQ2x1c3RlcmVkIHx8Ci0gICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLkNvbmVDb2xTdGFja2VkIHx8Ci0gICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLkNvbmVDb2xTdGFja2VkMTAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNoYXBlID0gZVNoYXBlLkNvbmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICgKLSAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuUHlyYW1pZEJhckNsdXN0ZXJlZCB8fAotICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5QeXJhbWlkQmFyU3RhY2tlZCB8fAotICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5QeXJhbWlkQmFyU3RhY2tlZDEwMCB8fAotICAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5QeXJhbWlkQ29sIHx8Ci0gICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLlB5cmFtaWRDb2xDbHVzdGVyZWQgfHwKLSAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuUHlyYW1pZENvbFN0YWNrZWQgfHwKLSAgICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuUHlyYW1pZENvbFN0YWNrZWQxMDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2hhcGUgPSBlU2hhcGUuUHlyYW1pZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uCi0gICAgICAgICNyZWdpb24gIlByb3BlcnRpZXMiCi0gICAgICAgIHN0cmluZyBfZGlyZWN0aW9uUGF0aCA9ICJjOmJhckRpci9AdmFsIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGlyZWN0aW9uLCBCYXIgb3IgY29sdW1ucwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZURpcmVjdGlvbiBEaXJlY3Rpb24KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldERpcmVjdGlvbkVudW0oX2NoYXJ0WG1sSGVscGVyLkdldFhtbE5vZGVTdHJpbmcoX2RpcmVjdGlvblBhdGgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludGVybmFsIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jaGFydFhtbEhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKF9kaXJlY3Rpb25QYXRoLCBHZXREaXJlY3Rpb25UZXh0KHZhbHVlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3RyaW5nIF9zaGFwZVBhdGggPSAiYzpzaGFwZS9AdmFsIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIHNoYXBlIG9mIHRoZSBiYXIvY29sdW1ucwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZVNoYXBlIFNoYXBlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRTaGFwZUVudW0oX2NoYXJ0WG1sSGVscGVyLkdldFhtbE5vZGVTdHJpbmcoX3NoYXBlUGF0aCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50ZXJuYWwgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2NoYXJ0WG1sSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoX3NoYXBlUGF0aCwgR2V0U2hhcGVUZXh0KHZhbHVlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRXhjZWxDaGFydERhdGFMYWJlbCBfRGF0YUxhYmVsID0gbnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWNjZXNzIHRvIGRhdGFsYWJlbCBwcm9wZXJ0aWVzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbENoYXJ0RGF0YUxhYmVsIERhdGFMYWJlbAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX0RhdGFMYWJlbCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX0RhdGFMYWJlbCA9IG5ldyBFeGNlbENoYXJ0RGF0YUxhYmVsKE5hbWVTcGFjZU1hbmFnZXIsIENoYXJ0Tm9kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfRGF0YUxhYmVsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLSAgICAgICAgI3JlZ2lvbiAiRGlyZWN0aW9uIEVudW0gVHJhc2xhdGlvbiIKLSAgICAgICAgcHJpdmF0ZSBzdHJpbmcgR2V0RGlyZWN0aW9uVGV4dChlRGlyZWN0aW9uIGRpcmVjdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoIChkaXJlY3Rpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBlRGlyZWN0aW9uLkJhcjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJiYXIiOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29sIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZURpcmVjdGlvbiBHZXREaXJlY3Rpb25FbnVtKHN0cmluZyBkaXJlY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoZGlyZWN0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgImJhciI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlRGlyZWN0aW9uLkJhcjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZURpcmVjdGlvbi5Db2x1bW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotICAgICAgICAjcmVnaW9uICJTaGFwZSBFbnVtIFRyYW5zbGF0aW9uIgotICAgICAgICBwcml2YXRlIHN0cmluZyBHZXRTaGFwZVRleHQoZVNoYXBlIFNoYXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKFNoYXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgZVNoYXBlLkJveDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJib3giOwotICAgICAgICAgICAgICAgIGNhc2UgZVNoYXBlLkNvbmU6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29uZSI7Ci0gICAgICAgICAgICAgICAgY2FzZSBlU2hhcGUuQ29uZVRvTWF4OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gImNvbmVUb01heCI7Ci0gICAgICAgICAgICAgICAgY2FzZSBlU2hhcGUuQ3lsaW5kZXI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiY3lsaW5kZXIiOwotICAgICAgICAgICAgICAgIGNhc2UgZVNoYXBlLlB5cmFtaWQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAicHlyYW1pZCI7Ci0gICAgICAgICAgICAgICAgY2FzZSBlU2hhcGUuUHlyYW1pZFRvTWF4OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gInB5cmFtaWRUb01heCI7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJib3giOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBlU2hhcGUgR2V0U2hhcGVFbnVtKHN0cmluZyB0ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHRleHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAiYm94IjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVTaGFwZS5Cb3g7Ci0gICAgICAgICAgICAgICAgY2FzZSAiY29uZSI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlU2hhcGUuQ29uZTsKLSAgICAgICAgICAgICAgICBjYXNlICJjb25lVG9NYXgiOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVNoYXBlLkNvbmVUb01heDsKLSAgICAgICAgICAgICAgICBjYXNlICJjeWxpbmRlciI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlU2hhcGUuQ3lsaW5kZXI7Ci0gICAgICAgICAgICAgICAgY2FzZSAicHlyYW1pZCI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlU2hhcGUuUHlyYW1pZDsKLSAgICAgICAgICAgICAgICBjYXNlICJweXJhbWlkVG9NYXgiOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVNoYXBlLlB5cmFtaWRUb01heDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVNoYXBlLkJveDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uCi0gICAgICAgIGludGVybmFsIG92ZXJyaWRlIGVDaGFydFR5cGUgR2V0Q2hhcnRUeXBlKHN0cmluZyBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobmFtZSA9PSAiYmFyQ2hhcnQiKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh0aGlzLkRpcmVjdGlvbiA9PSBlRGlyZWN0aW9uLkJhcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChHcm91cGluZyA9PSBlR3JvdXBpbmcuU3RhY2tlZCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQmFyU3RhY2tlZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChHcm91cGluZyA9PSBlR3JvdXBpbmcuUGVyY2VudFN0YWNrZWQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkJhclN0YWNrZWQxMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5CYXJDbHVzdGVyZWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKEdyb3VwaW5nID09IGVHcm91cGluZy5TdGFja2VkKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5Db2x1bW5TdGFja2VkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEdyb3VwaW5nID09IGVHcm91cGluZy5QZXJjZW50U3RhY2tlZCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQ29sdW1uU3RhY2tlZDEwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkNvbHVtbkNsdXN0ZXJlZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuYW1lID09ICJiYXIzRENoYXJ0IikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAjcmVnaW9uICJCYXIgU2hhcGUiCi0gICAgICAgICAgICAgICAgaWYgKHRoaXMuU2hhcGU9PWVTaGFwZS5Cb3gpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5EaXJlY3Rpb24gPT0gZURpcmVjdGlvbi5CYXIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChHcm91cGluZyA9PSBlR3JvdXBpbmcuU3RhY2tlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5CYXJTdGFja2VkM0Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChHcm91cGluZyA9PSBlR3JvdXBpbmcuUGVyY2VudFN0YWNrZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQmFyU3RhY2tlZDEwMDNEOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkJhckNsdXN0ZXJlZDNEOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEdyb3VwaW5nID09IGVHcm91cGluZy5TdGFja2VkKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQzRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEdyb3VwaW5nID09IGVHcm91cGluZy5QZXJjZW50U3RhY2tlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5Db2x1bW5TdGFja2VkMTAwM0Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQ29sdW1uQ2x1c3RlcmVkM0Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgI2VuZHJlZ2lvbgotICAgICAgICAgICAgICAgICNyZWdpb24gIkNvbmUgU2hhcGUiCi0gICAgICAgICAgICAgICAgaWYgKHRoaXMuU2hhcGUgPT0gZVNoYXBlLkNvbmUgfHwgdGhpcy5TaGFwZSA9PSBlU2hhcGUuQ29uZVRvTWF4KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuRGlyZWN0aW9uID09IGVEaXJlY3Rpb24uQmFyKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoR3JvdXBpbmcgPT0gZUdyb3VwaW5nLlN0YWNrZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQ29uZUJhclN0YWNrZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChHcm91cGluZyA9PSBlR3JvdXBpbmcuUGVyY2VudFN0YWNrZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQ29uZUJhclN0YWNrZWQxMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChHcm91cGluZyA9PSBlR3JvdXBpbmcuQ2x1c3RlcmVkKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkNvbmVCYXJDbHVzdGVyZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoR3JvdXBpbmcgPT0gZUdyb3VwaW5nLlN0YWNrZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQ29uZUNvbFN0YWNrZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChHcm91cGluZyA9PSBlR3JvdXBpbmcuUGVyY2VudFN0YWNrZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQ29uZUNvbFN0YWNrZWQxMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChHcm91cGluZyA9PSBlR3JvdXBpbmcuQ2x1c3RlcmVkKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkNvbmVDb2xDbHVzdGVyZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQ29uZUNvbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAjZW5kcmVnaW9uCi0gICAgICAgICAgICAgICAgI3JlZ2lvbiAiQ3lsaW5kZXIgU2hhcGUiCi0gICAgICAgICAgICAgICAgaWYgKHRoaXMuU2hhcGUgPT0gZVNoYXBlLkN5bGluZGVyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuRGlyZWN0aW9uID09IGVEaXJlY3Rpb24uQmFyKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoR3JvdXBpbmcgPT0gZUdyb3VwaW5nLlN0YWNrZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQ3lsaW5kZXJCYXJTdGFja2VkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoR3JvdXBpbmcgPT0gZUdyb3VwaW5nLlBlcmNlbnRTdGFja2VkKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkN5bGluZGVyQmFyU3RhY2tlZDEwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEdyb3VwaW5nID09IGVHcm91cGluZy5DbHVzdGVyZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQ3lsaW5kZXJCYXJDbHVzdGVyZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoR3JvdXBpbmcgPT0gZUdyb3VwaW5nLlN0YWNrZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQ3lsaW5kZXJDb2xTdGFja2VkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoR3JvdXBpbmcgPT0gZUdyb3VwaW5nLlBlcmNlbnRTdGFja2VkKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkN5bGluZGVyQ29sU3RhY2tlZDEwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEdyb3VwaW5nID09IGVHcm91cGluZy5DbHVzdGVyZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQ3lsaW5kZXJDb2xDbHVzdGVyZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQ3lsaW5kZXJDb2w7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgI2VuZHJlZ2lvbgotICAgICAgICAgICAgICAgICNyZWdpb24gIlB5cmFtaWRlIFNoYXBlIgotICAgICAgICAgICAgICAgIGlmICh0aGlzLlNoYXBlID09IGVTaGFwZS5QeXJhbWlkIHx8IHRoaXMuU2hhcGUgPT0gZVNoYXBlLlB5cmFtaWRUb01heCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLkRpcmVjdGlvbiA9PSBlRGlyZWN0aW9uLkJhcikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEdyb3VwaW5nID09IGVHcm91cGluZy5TdGFja2VkKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlB5cmFtaWRCYXJTdGFja2VkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoR3JvdXBpbmcgPT0gZUdyb3VwaW5nLlBlcmNlbnRTdGFja2VkKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlB5cmFtaWRCYXJTdGFja2VkMTAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoR3JvdXBpbmcgPT0gZUdyb3VwaW5nLkNsdXN0ZXJlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5QeXJhbWlkQmFyQ2x1c3RlcmVkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEdyb3VwaW5nID09IGVHcm91cGluZy5TdGFja2VkKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlB5cmFtaWRDb2xTdGFja2VkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoR3JvdXBpbmcgPT0gZUdyb3VwaW5nLlBlcmNlbnRTdGFja2VkKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlB5cmFtaWRDb2xTdGFja2VkMTAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoR3JvdXBpbmcgPT0gZUdyb3VwaW5nLkNsdXN0ZXJlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5QeXJhbWlkQ29sQ2x1c3RlcmVkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlB5cmFtaWRDb2w7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgI2VuZHJlZ2lvbgotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJhc2UuR2V0Q2hhcnRUeXBlKG5hbWUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxCYXJDaGFydFNlcmllLmNzIGIvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxCYXJDaGFydFNlcmllLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGU1ODllLi4wMDAwMDAwCi0tLSBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQmFyQ2hhcnRTZXJpZS5jcworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQotICoKLSAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCi0gKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCi0gKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKLSAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKLSAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCi0gKgotICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKLSAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEphbiBLw6RsbG1hbgkJSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKLSAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlhtbDsKLQotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZy5DaGFydAotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQSBzZXJpZSBmb3IgYSBzY2F0dGVyIGNoYXJ0Ci0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsQmFyQ2hhcnRTZXJpZSA6IEV4Y2VsQ2hhcnRTZXJpZQotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNoYXJ0U2VyaWVzIj5QYXJlbnQgY29sbGVjdGlvbjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibnMiPk5hbWVzcGFjZW1hbmFnZXI8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5vZGUiPlRvcG5vZGU8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImlzUGl2b3QiPklzIHBpdm90Y2hhcnQ8L3BhcmFtPgotICAgICAgICBpbnRlcm5hbCBFeGNlbEJhckNoYXJ0U2VyaWUoRXhjZWxDaGFydFNlcmllcyBjaGFydFNlcmllcywgWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSBub2RlLCBib29sIGlzUGl2b3QpIDoKLSAgICAgICAgICAgIGJhc2UoY2hhcnRTZXJpZXMsIG5zLCBub2RlLCBpc1Bpdm90KQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgRXhjZWxDaGFydFNlcmllRGF0YUxhYmVsIF9EYXRhTGFiZWwgPSBudWxsOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBEYXRhbGFiZWwKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsQ2hhcnRTZXJpZURhdGFMYWJlbCBEYXRhTGFiZWwKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9EYXRhTGFiZWwgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9EYXRhTGFiZWwgPSBuZXcgRXhjZWxDaGFydFNlcmllRGF0YUxhYmVsKF9ucywgX25vZGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX0RhdGFMYWJlbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgSU5WRVJUSUZORUdBVElWRV9QQVRIID0gImM6aW52ZXJ0SWZOZWdhdGl2ZS9AdmFsIjsKLSAgICAgICAgaW50ZXJuYWwgYm9vbCBJbnZlcnRJZk5lZ2F0aXZlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChJTlZFUlRJRk5FR0FUSVZFX1BBVEgsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woSU5WRVJUSUZORUdBVElWRV9QQVRILCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbEJ1YmJsZUNoYXJ0LmNzIGIvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxCdWJibGVDaGFydC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQxY2QwYS4uMDAwMDAwMAotLS0gYS9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbEJ1YmJsZUNoYXJ0LmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLe+7v3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlRhYmxlLlBpdm90VGFibGU7Ci11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uWG1sOwotCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0Ci17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gYnViYmxlIGNoYXJ0IHNwZWNpZmljIHByb3BlcnRpZXMKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxCdWJibGVDaGFydCA6IEV4Y2VsQ2hhcnQKLSAgICB7Ci0gICAgICAgIGludGVybmFsIEV4Y2VsQnViYmxlQ2hhcnQoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlLCBlQ2hhcnRUeXBlIHR5cGUsIEV4Y2VsQ2hhcnQgdG9wQ2hhcnQsIEV4Y2VsUGl2b3RUYWJsZSBQaXZvdFRhYmxlU291cmNlKSA6Ci0gICAgICAgICAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCB0eXBlLCB0b3BDaGFydCwgUGl2b3RUYWJsZVNvdXJjZSkKLSAgICAgICAgewotICAgICAgICAgICAgU2hvd05lZ2F0aXZlQnViYmxlcyA9IGZhbHNlOwotICAgICAgICAgICAgQnViYmxlU2NhbGUgPSAxMDA7Ci0gICAgICAgICAgICBfY2hhcnRTZXJpZXMgPSBuZXcgRXhjZWxCdWJibGVDaGFydFNlcmllcyh0aGlzLCBkcmF3aW5ncy5OYW1lU3BhY2VNYW5hZ2VyLCBfY2hhcnROb2RlLCBQaXZvdFRhYmxlU291cmNlIT1udWxsKTsKLSAgICAgICAgICAgIC8vU2V0VHlwZVByb3BlcnRpZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludGVybmFsIEV4Y2VsQnViYmxlQ2hhcnQoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlLCBlQ2hhcnRUeXBlIHR5cGUsIGJvb2wgaXNQaXZvdCkgOgotICAgICAgICAgICAgYmFzZShkcmF3aW5ncywgbm9kZSwgdHlwZSwgaXNQaXZvdCkKLSAgICAgICAgewotICAgICAgICAgICAgX2NoYXJ0U2VyaWVzID0gbmV3IEV4Y2VsQnViYmxlQ2hhcnRTZXJpZXModGhpcywgZHJhd2luZ3MuTmFtZVNwYWNlTWFuYWdlciwgX2NoYXJ0Tm9kZSwgaXNQaXZvdCk7Ci0gICAgICAgICAgICAvL1NldFR5cGVQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxCdWJibGVDaGFydChFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBYbWxOb2RlIG5vZGUsIFVyaSB1cmlDaGFydCwgWmlwUGFja2FnZVBhcnQgcGFydCwgWG1sRG9jdW1lbnQgY2hhcnRYbWwsIFhtbE5vZGUgY2hhcnROb2RlKSA6Ci0gICAgICAgICAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCB1cmlDaGFydCwgcGFydCwgY2hhcnRYbWwsIGNoYXJ0Tm9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgX2NoYXJ0U2VyaWVzID0gbmV3IEV4Y2VsQnViYmxlQ2hhcnRTZXJpZXModGhpcywgX2RyYXdpbmdzLk5hbWVTcGFjZU1hbmFnZXIsIF9jaGFydE5vZGUsIGZhbHNlKTsKLSAgICAgICAgICAgIC8vU2V0VHlwZVByb3BlcnRpZXMoKTsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBFeGNlbEJ1YmJsZUNoYXJ0KEV4Y2VsQ2hhcnQgdG9wQ2hhcnQsIFhtbE5vZGUgY2hhcnROb2RlKSA6Ci0gICAgICAgICAgICBiYXNlKHRvcENoYXJ0LCBjaGFydE5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jaGFydFNlcmllcyA9IG5ldyBFeGNlbEJ1YmJsZUNoYXJ0U2VyaWVzKHRoaXMsIF9kcmF3aW5ncy5OYW1lU3BhY2VNYW5hZ2VyLCBfY2hhcnROb2RlLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc3RyaW5nIEJVQkJMRVNDQUxFX1BBVEggPSAiYzpidWJibGVTY2FsZS9AdmFsIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU3BlY2lmaWVzIHRoZSBzY2FsZSBmYWN0b3IgZm9yIHRoZSBidWJibGUgY2hhcnQuIENhbiByYW5nZSBmcm9tIDAgdG8gMzAwLCBjb3JyZXNwb25kaW5nIHRvIGEgcGVyY2VudGFnZSBvZiB0aGUgZGVmYXVsdCBzaXplLAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50IEJ1YmJsZVNjYWxlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfY2hhcnRYbWxIZWxwZXIuR2V0WG1sTm9kZUludChCVUJCTEVTQ0FMRV9QQVRIKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHZhbHVlIDwgMCAmJiB2YWx1ZSA+IDMwMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93KG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIkJ1YmJsZXNjYWxlIG91dCBvZiByYW5nZS4gMC0zMDAgYWxsb3dlZCIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgX2NoYXJ0WG1sSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoQlVCQkxFU0NBTEVfUEFUSCwgdmFsdWUuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3RyaW5nIFNIT1dORUdCVUJCTEVTX1BBVEggPSAiYzpzaG93TmVnQnViYmxlcy9AdmFsIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU3BlY2lmaWVzIHRoZSBzY2FsZSBmYWN0b3IgZm9yIHRoZSBidWJibGUgY2hhcnQuIENhbiByYW5nZSBmcm9tIDAgdG8gMzAwLCBjb3JyZXNwb25kaW5nIHRvIGEgcGVyY2VudGFnZSBvZiB0aGUgZGVmYXVsdCBzaXplLAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBTaG93TmVnYXRpdmVCdWJibGVzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfY2hhcnRYbWxIZWxwZXIuR2V0WG1sTm9kZUJvb2woU0hPV05FR0JVQkJMRVNfUEFUSCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY2hhcnRYbWxIZWxwZXIuU2V0WG1sTm9kZUJvb2woQlVCQkxFU0NBTEVfUEFUSCwgdmFsdWUsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHN0cmluZyBCVUJCTEUzRF9QQVRIID0gImM6YnViYmxlM0QvQHZhbCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNwZWNpZmllcyBpZiB0aGUgYnViYmxlY2hhcnQgaXMgdGhyZWUgZGltZW5zaW9uYWwKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgQnViYmxlM0QKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9jaGFydFhtbEhlbHBlci5HZXRYbWxOb2RlQm9vbChCVUJCTEUzRF9QQVRIKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jaGFydFhtbEhlbHBlci5TZXRYbWxOb2RlQm9vbChCVUJCTEUzRF9QQVRILCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgQ2hhcnRUeXBlID0gdmFsdWUgPyBlQ2hhcnRUeXBlLkJ1YmJsZTNERWZmZWN0IDogZUNoYXJ0VHlwZS5CdWJibGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3RyaW5nIFNJWkVSRVBSRVNFTlRTX1BBVEggPSAiYzpzaXplUmVwcmVzZW50cy9AdmFsIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU3BlY2lmaWVzIHRoZSBzY2FsZSBmYWN0b3IgZm9yIHRoZSBidWJibGUgY2hhcnQuIENhbiByYW5nZSBmcm9tIDAgdG8gMzAwLCBjb3JyZXNwb25kaW5nIHRvIGEgcGVyY2VudGFnZSBvZiB0aGUgZGVmYXVsdCBzaXplLAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZVNpemVSZXByZXNlbnRzIFNpemVSZXByZXNlbnRzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB2ID0gX2NoYXJ0WG1sSGVscGVyLkdldFhtbE5vZGVTdHJpbmcoU0laRVJFUFJFU0VOVFNfUEFUSCkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKLSAgICAgICAgICAgICAgICBpZiAodiA9PSAidyIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVNpemVSZXByZXNlbnRzLldpZHRoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVNpemVSZXByZXNlbnRzLkFyZWE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2NoYXJ0WG1sSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoU0laRVJFUFJFU0VOVFNfUEFUSCwgdmFsdWUgPT0gZVNpemVSZXByZXNlbnRzLldpZHRoID8gInciIDogImFyZWEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgbmV3IEV4Y2VsQnViYmxlQ2hhcnRTZXJpZXMgU2VyaWVzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgcmV0dXJuIChFeGNlbEJ1YmJsZUNoYXJ0U2VyaWVzKV9jaGFydFNlcmllczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBlQ2hhcnRUeXBlIEdldENoYXJ0VHlwZShzdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKEJ1YmJsZTNEKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkJ1YmJsZTNERWZmZWN0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkJ1YmJsZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQnViYmxlQ2hhcnRTZXJpZS5jcyBiL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQnViYmxlQ2hhcnRTZXJpZS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI0OTFkNy4uMDAwMDAwMAotLS0gYS9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbEJ1YmJsZUNoYXJ0U2VyaWUuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCi0gKgotICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KLSAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKLSAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAotICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAotICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KLSAqCi0gKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAotICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSmFuIEvDpGxsbWFuCQlJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQotICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uWG1sOwotCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0Ci17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBIHNlcmllIGZvciBhIHNjYXR0ZXIgY2hhcnQKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxCdWJibGVDaGFydFNlcmllIDogRXhjZWxDaGFydFNlcmllCi0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2hhcnRTZXJpZXMiPlBhcmVudCBjb2xsZWN0aW9uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJucyI+TmFtZXNwYWNlbWFuYWdlcjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibm9kZSI+VG9wbm9kZTwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXNQaXZvdCI+SXMgcGl2b3RjaGFydDwvcGFyYW0+Ci0gICAgICAgIGludGVybmFsIEV4Y2VsQnViYmxlQ2hhcnRTZXJpZShFeGNlbENoYXJ0U2VyaWVzIGNoYXJ0U2VyaWVzLCBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIG5vZGUsIGJvb2wgaXNQaXZvdCkgOgotICAgICAgICAgICAgYmFzZShjaGFydFNlcmllcywgbnMsIG5vZGUsIGlzUGl2b3QpCi0gICAgICAgIHsKLQotICAgICAgICB9Ci0gICAgICAgIEV4Y2VsQ2hhcnRTZXJpZURhdGFMYWJlbCBfRGF0YUxhYmVsID0gbnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGF0YWxhYmVsCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbENoYXJ0U2VyaWVEYXRhTGFiZWwgRGF0YUxhYmVsCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfRGF0YUxhYmVsID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfRGF0YUxhYmVsID0gbmV3IEV4Y2VsQ2hhcnRTZXJpZURhdGFMYWJlbChfbnMsIF9ub2RlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9EYXRhTGFiZWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIEJVQkJMRTNEX1BBVEggPSAiYzpidWJibGUzRC9AdmFsIjsKLSAgICAgICAgaW50ZXJuYWwgYm9vbCBCdWJibGUzRAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woQlVCQkxFM0RfUEFUSCwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChCVUJCTEUzRF9QQVRILCB2YWx1ZSk7ICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBJTlZFUlRJRk5FR0FUSVZFX1BBVEggPSAiYzppbnZlcnRJZk5lZ2F0aXZlL0B2YWwiOwotICAgICAgICBpbnRlcm5hbCBib29sIEludmVydElmTmVnYXRpdmUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKElOVkVSVElGTkVHQVRJVkVfUEFUSCwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChJTlZFUlRJRk5FR0FUSVZFX1BBVEgsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFNlcmllcwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5TZXJpZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiYXNlLlNlcmllcyA9IHZhbHVlOwotICAgICAgICAgICAgICAgIGlmKHN0cmluZy5Jc051bGxPckVtcHR5KEJ1YmJsZVNpemUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGVMaXQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIEJVQkJMRVNJWkVfVE9QUEFUSCA9ICJjOmJ1YmJsZVNpemUiOwotICAgICAgICBjb25zdCBzdHJpbmcgQlVCQkxFU0laRV9QQVRIID0gQlVCQkxFU0laRV9UT1BQQVRIICsgIi9jOm51bVJlZi9jOmYiOwotICAgICAgICBwdWJsaWMgc3RyaW5nIEJ1YmJsZVNpemUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoQlVCQkxFU0laRV9QQVRIKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHN0cmluZy5Jc051bGxPckVtcHR5KHZhbHVlKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlTGl0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoQlVCQkxFU0laRV9QQVRILCBFeGNlbENlbGxCYXNlLkdldEZ1bGxBZGRyZXNzKF9jaGFydFNlcmllcy5DaGFydC5Xb3JrU2hlZXQuTmFtZSwgdmFsdWUpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgWG1sTm9kZSBjYWNoZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShzdHJpbmcuRm9ybWF0KCJ7MH0vYzpudW1DYWNoZSIsIEJVQkJMRVNJWkVfUEFUSCksIF9ucyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKGNhY2hlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIERlbGV0ZU5vZGUoc3RyaW5nLkZvcm1hdCgiezB9L2M6bnVtTGl0IiwgQlVCQkxFU0laRV9UT1BQQVRIKSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vWG1sTm9kZSBsaXQgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoc3RyaW5nLkZvcm1hdCgiezB9L2M6bnVtTGl0IiwgX3hTZXJpZXNUb3BQYXRoKSwgX25zKTsKLSAgICAgICAgICAgICAgICAgICAgLy9pZiAobGl0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIC8vewotICAgICAgICAgICAgICAgICAgICAvLyAgICBsaXQuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChsaXQpOwotICAgICAgICAgICAgICAgICAgICAvL30KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCB2b2lkIEdlbmVyYXRlTGl0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHMgPSBuZXcgRXhjZWxBZGRyZXNzKFNlcmllcyk7Ci0gICAgICAgICAgICB2YXIgaXggPSAwOwotICAgICAgICAgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IHMuX2Zyb21Sb3c7IHJvdyA8PSBzLl90b1Jvdzsgcm93KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgYyA9IHMuX2Zyb21Db2w7IGMgPD0gcy5fdG9Db2w7IGMrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiPGM6cHQgaWR4PVwiezB9XCI+PGM6dj4xPC9jOnY+PC9jOnB0PiIsIGl4KyspOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENyZWF0ZU5vZGUoQlVCQkxFU0laRV9UT1BQQVRIICsgIi9jOm51bUxpdCIsIHRydWUpOwotICAgICAgICAgICAgWG1sTm9kZSBsaXQgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoc3RyaW5nLkZvcm1hdCgiezB9L2M6bnVtTGl0IiwgQlVCQkxFU0laRV9UT1BQQVRIKSwgX25zKTsKLSAgICAgICAgICAgIGxpdC5Jbm5lclhtbCA9IHN0cmluZy5Gb3JtYXQoIjxjOmZvcm1hdENvZGU+R2VuZXJhbDwvYzpmb3JtYXRDb2RlPjxjOnB0Q291bnQgdmFsPVwiezB9XCIvPnsxfSIsIGl4LCBzYi5Ub1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQ2hhcnQuY3MgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0LmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTk5MDVmLi4wMDAwMDAwCi0tLSBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQ2hhcnQuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMyICswLDAgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQotICoKLSAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCi0gKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCi0gKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKLSAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKLSAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCi0gKgotICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKLSAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMjAwOS0xMC0wMQotICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5YbWw7Ci11c2luZyBTeXN0ZW0uSU87Ci11c2luZyBPZmZpY2VPcGVuWG1sLlRhYmxlLlBpdm90VGFibGU7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmc7Ci0KLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuQ2hhcnQKLXsKLSAgICAjcmVnaW9uICJDaGFydCBFbnVtcyIKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIENoYXJ0IHR5cGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBlbnVtIGVDaGFydFR5cGUKLSAgICB7Ci0gICAgICAgIEFyZWEzRD0tNDA5OCwKLSAgICAgICAgQXJlYVN0YWNrZWQzRD03OCwKLSAgICAgICAgQXJlYVN0YWNrZWQxMDAzRD03OSwKLSAgICAgICAgQmFyQ2x1c3RlcmVkM0Q9IDYwLAotICAgICAgICBCYXJTdGFja2VkM0Q9NjEsCi0gICAgICAgIEJhclN0YWNrZWQxMDAzRD02MiwKLSAgICAgICAgQ29sdW1uM0Q9LTQxMDAsCi0gICAgICAgIENvbHVtbkNsdXN0ZXJlZDNEPTU0LAotICAgICAgICBDb2x1bW5TdGFja2VkM0Q9NTUsCi0gICAgICAgIENvbHVtblN0YWNrZWQxMDAzRD01NiwKLSAgICAgICAgTGluZTNEPS00MTAxLAotICAgICAgICBQaWUzRD0tNDEwMiwKLSAgICAgICAgUGllRXhwbG9kZWQzRD03MCwKLSAgICAgICAgQXJlYT0xLAotICAgICAgICBBcmVhU3RhY2tlZD03NiwKLSAgICAgICAgQXJlYVN0YWNrZWQxMDA9NzcsCi0gICAgICAgIEJhckNsdXN0ZXJlZD01NywKLSAgICAgICAgQmFyT2ZQaWU9NzEsCi0gICAgICAgIEJhclN0YWNrZWQ9NTgsCi0gICAgICAgIEJhclN0YWNrZWQxMDA9NTksCi0gICAgICAgIEJ1YmJsZT0xNSwKLSAgICAgICAgQnViYmxlM0RFZmZlY3Q9ODcsCi0gICAgICAgIENvbHVtbkNsdXN0ZXJlZD01MSwKLSAgICAgICAgQ29sdW1uU3RhY2tlZD01MiwKLSAgICAgICAgQ29sdW1uU3RhY2tlZDEwMD01MywKLSAgICAgICAgQ29uZUJhckNsdXN0ZXJlZD0xMDIsCi0gICAgICAgIENvbmVCYXJTdGFja2VkPTEwMywKLSAgICAgICAgQ29uZUJhclN0YWNrZWQxMDA9MTA0LAotICAgICAgICBDb25lQ29sPTEwNSwKLSAgICAgICAgQ29uZUNvbENsdXN0ZXJlZD05OSwKLSAgICAgICAgQ29uZUNvbFN0YWNrZWQ9MTAwLAotICAgICAgICBDb25lQ29sU3RhY2tlZDEwMD0xMDEsCi0gICAgICAgIEN5bGluZGVyQmFyQ2x1c3RlcmVkPTk1LAotICAgICAgICBDeWxpbmRlckJhclN0YWNrZWQ9OTYsCi0gICAgICAgIEN5bGluZGVyQmFyU3RhY2tlZDEwMD05NywKLSAgICAgICAgQ3lsaW5kZXJDb2w9OTgsCi0gICAgICAgIEN5bGluZGVyQ29sQ2x1c3RlcmVkPTkyLAotICAgICAgICBDeWxpbmRlckNvbFN0YWNrZWQ9OTMsCi0gICAgICAgIEN5bGluZGVyQ29sU3RhY2tlZDEwMD05NCwKLSAgICAgICAgRG91Z2hudXQ9LTQxMjAsCi0gICAgICAgIERvdWdobnV0RXhwbG9kZWQ9ODAsCi0gICAgICAgIExpbmU9NCwKLSAgICAgICAgTGluZU1hcmtlcnM9NjUsCi0gICAgICAgIExpbmVNYXJrZXJzU3RhY2tlZD02NiwKLSAgICAgICAgTGluZU1hcmtlcnNTdGFja2VkMTAwPTY3LAotICAgICAgICBMaW5lU3RhY2tlZD02MywKLSAgICAgICAgTGluZVN0YWNrZWQxMDA9NjQsCi0gICAgICAgIFBpZT01LAotICAgICAgICBQaWVFeHBsb2RlZD02OSwKLSAgICAgICAgUGllT2ZQaWU9NjgsCi0gICAgICAgIFB5cmFtaWRCYXJDbHVzdGVyZWQ9MTA5LAotICAgICAgICBQeXJhbWlkQmFyU3RhY2tlZD0xMTAsCi0gICAgICAgIFB5cmFtaWRCYXJTdGFja2VkMTAwPTExMSwKLSAgICAgICAgUHlyYW1pZENvbD0xMTIsCi0gICAgICAgIFB5cmFtaWRDb2xDbHVzdGVyZWQ9MTA2LAotICAgICAgICBQeXJhbWlkQ29sU3RhY2tlZD0xMDcsCi0gICAgICAgIFB5cmFtaWRDb2xTdGFja2VkMTAwPTEwOCwKLSAgICAgICAgUmFkYXI9LTQxNTEsCi0gICAgICAgIFJhZGFyRmlsbGVkPTgyLAotICAgICAgICBSYWRhck1hcmtlcnM9ODEsCi0gICAgICAgIFN0b2NrSExDPTg4LAotICAgICAgICBTdG9ja09ITEM9ODksCi0gICAgICAgIFN0b2NrVkhMQz05MCwKLSAgICAgICAgU3RvY2tWT0hMQz05MSwKLSAgICAgICAgU3VyZmFjZT04MywKLSAgICAgICAgU3VyZmFjZVRvcFZpZXc9ODUsCi0gICAgICAgIFN1cmZhY2VUb3BWaWV3V2lyZWZyYW1lPTg2LAotICAgICAgICBTdXJmYWNlV2lyZWZyYW1lPTg0LAotICAgICAgICBYWVNjYXR0ZXI9LTQxNjksCi0gICAgICAgIFhZU2NhdHRlckxpbmVzPTc0LAotICAgICAgICBYWVNjYXR0ZXJMaW5lc05vTWFya2Vycz03NSwKLSAgICAgICAgWFlTY2F0dGVyU21vb3RoPTcyLAotICAgICAgICBYWVNjYXR0ZXJTbW9vdGhOb01hcmtlcnM9NzMKLX0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEJhciBvciBjb2x1bW4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBlbnVtIGVEaXJlY3Rpb24KLSAgICB7Ci0gICAgICAgIENvbHVtbiwKLSAgICAgICAgQmFyCi0gICAgfQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gSG93IHRoZSBzZXJpZXMgYXJlIGdyb3VwZWQKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBlbnVtIGVHcm91cGluZwotICAgIHsKLSAgICAgICAgU3RhbmRhcmQsCi0gICAgICAgIENsdXN0ZXJlZCwKLSAgICAgICAgU3RhY2tlZCwKLSAgICAgICAgUGVyY2VudFN0YWNrZWQKLSAgICB9Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBTaGFwZSBmb3IgYmFyIGNoYXJ0cwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGVudW0gZVNoYXBlCi0gICAgewotICAgICAgICBCb3gsCi0gICAgICAgIENvbmUsCi0gICAgICAgIENvbmVUb01heCwKLSAgICAgICAgQ3lsaW5kZXIsCi0gICAgICAgIFB5cmFtaWQsCi0gICAgICAgIFB5cmFtaWRUb01heAotICAgIH0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFNtb290aCBvciBsaW5lcyBtYXJrZXJzCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZW51bSBlU2NhdHRlclN0eWxlCi0gICAgewotICAgICAgICBMaW5lTWFya2VyLAotICAgICAgICBTbW9vdGhNYXJrZXIsCi0gICAgIH0KLSAgICBwdWJsaWMgZW51bSBlUmFkYXJTdHlsZQotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU3BlY2lmaWVzIHRoYXQgdGhlIHJhZGFyIGNoYXJ0IHNoYWxsIGJlIGZpbGxlZCBhbmQgaGF2ZSBsaW5lcyBidXQgbm8gbWFya2Vycy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgRmlsbGVkLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTcGVjaWZpZXMgdGhhdCB0aGUgcmFkYXIgY2hhcnQgc2hhbGwgaGF2ZSBsaW5lcyBhbmQgbWFya2VycyBidXQgbm8gZmlsbC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgTWFya2VyLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTcGVjaWZpZXMgdGhhdCB0aGUgcmFkYXIgY2hhcnQgc2hhbGwgaGF2ZSBsaW5lcyBidXQgbm8gbWFya2VycyBhbmQgbm8gZmlsbC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgU3RhbmRhcmQgCi0gICAgfQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQmFyIG9yIHBpZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGVudW0gZVBpZVR5cGUKLSAgICB7Ci0gICAgICAgIEJhciwKLSAgICAgICAgUGllCi0gICAgfQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gUG9zaXRpb24gb2YgdGhlIGxhYmVscwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGVudW0gZUxhYmVsUG9zaXRpb24KLSAgICB7Ci0gICAgICAgIEJlc3RGaXQsCi0gICAgICAgIExlZnQsCi0gICAgICAgIFJpZ2h0LAotICAgICAgICBDZW50ZXIsCi0gICAgICAgIFRvcCwKLSAgICAgICAgQm90dG9tLAotICAgICAgICBJbkJhc2UsCi0gICAgICAgIEluRW5kLAotICAgICAgICBPdXRFbmQKLSAgICB9Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBeGlzIGxhYmVsIHBvc2l0aW9uCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZW51bSBlVGlja0xhYmVsUG9zaXRpb24KLSAgICB7Ci0gICAgICAgIEhpZ2gsCi0gICAgICAgIExvdywKLSAgICAgICAgTmV4dFRvLAotICAgICAgICBOb25lCi0gICAgfQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gTWFya2Vyc3R5bGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBlbnVtIGVNYXJrZXJTdHlsZQotICAgIHsgICAgICAgIAotICAgICAgICBDaXJjbGUsCi0gICAgICAgIERhc2gsCi0gICAgICAgIERpYW1vbmQsCi0gICAgICAgIERvdCwKLSAgICAgICAgTm9uZSwKLSAgICAgICAgUGljdHVyZSwKLSAgICAgICAgUGx1cywKLSAgICAgICAgU3F1YXJlLAotICAgICAgICBTdGFyLAotICAgICAgICBUcmlhbmdsZSwKLSAgICAgICAgWCwKLSAgICB9Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGUgYnVpbGQgaW4gc3R5bGUgb2YgdGhlIGNoYXJ0LgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGVudW0gZUNoYXJ0U3R5bGUKLSAgICB7Ci0gICAgICAgIE5vbmUsCi0gICAgICAgIFN0eWxlMSwKLSAgICAgICAgU3R5bGUyLAotICAgICAgICBTdHlsZTMsCi0gICAgICAgIFN0eWxlNCwKLSAgICAgICAgU3R5bGU1LAotICAgICAgICBTdHlsZTYsCi0gICAgICAgIFN0eWxlNywKLSAgICAgICAgU3R5bGU4LAotICAgICAgICBTdHlsZTksCi0gICAgICAgIFN0eWxlMTAsCi0gICAgICAgIFN0eWxlMTEsCi0gICAgICAgIFN0eWxlMTIsCi0gICAgICAgIFN0eWxlMTMsCi0gICAgICAgIFN0eWxlMTQsCi0gICAgICAgIFN0eWxlMTUsCi0gICAgICAgIFN0eWxlMTYsCi0gICAgICAgIFN0eWxlMTcsCi0gICAgICAgIFN0eWxlMTgsCi0gICAgICAgIFN0eWxlMTksCi0gICAgICAgIFN0eWxlMjAsCi0gICAgICAgIFN0eWxlMjEsCi0gICAgICAgIFN0eWxlMjIsCi0gICAgICAgIFN0eWxlMjMsCi0gICAgICAgIFN0eWxlMjQsCi0gICAgICAgIFN0eWxlMjUsCi0gICAgICAgIFN0eWxlMjYsCi0gICAgICAgIFN0eWxlMjcsCi0gICAgICAgIFN0eWxlMjgsCi0gICAgICAgIFN0eWxlMjksCi0gICAgICAgIFN0eWxlMzAsCi0gICAgICAgIFN0eWxlMzEsCi0gICAgICAgIFN0eWxlMzIsCi0gICAgICAgIFN0eWxlMzMsCi0gICAgICAgIFN0eWxlMzQsCi0gICAgICAgIFN0eWxlMzUsCi0gICAgICAgIFN0eWxlMzYsCi0gICAgICAgIFN0eWxlMzcsCi0gICAgICAgIFN0eWxlMzgsCi0gICAgICAgIFN0eWxlMzksCi0gICAgICAgIFN0eWxlNDAsCi0gICAgICAgIFN0eWxlNDEsCi0gICAgICAgIFN0eWxlNDIsCi0gICAgICAgIFN0eWxlNDMsCi0gICAgICAgIFN0eWxlNDQsCi0gICAgICAgIFN0eWxlNDUsCi0gICAgICAgIFN0eWxlNDYsCi0gICAgICAgIFN0eWxlNDcsCi0gICAgICAgIFN0eWxlNDgKLSAgICB9Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUeXBlIG9mIFRyZW5kbGluZSBmb3IgYSBjaGFydAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGVudW0gZVRyZW5kTGluZQotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU3BlY2lmaWVzIHRoZSB0cmVuZGxpbmUgc2hhbGwgYmUgYW4gZXhwb25lbnRpYWwgY3VydmUgaW4gdGhlIGZvcm0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgRXhwb25lbnRpYWwsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNwZWNpZmllcyB0aGUgdHJlbmRsaW5lIHNoYWxsIGJlIGEgbG9nYXJpdGhtaWMgY3VydmUgaW4gdGhlIGZvcm0gLCB3aGVyZSBsb2cgaXMgdGhlIG5hdHVyYWwKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgTGluZWFyLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTcGVjaWZpZXMgdGhlIHRyZW5kbGluZSBzaGFsbCBiZSBhIGxvZ2FyaXRobWljIGN1cnZlIGluIHRoZSBmb3JtICwgd2hlcmUgbG9nIGlzIHRoZSBuYXR1cmFsCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIExvZ2FyaXRobWljLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTcGVjaWZpZXMgdGhlIHRyZW5kbGluZSBzaGFsbCBiZSBhIG1vdmluZyBhdmVyYWdlIG9mIHBlcmlvZCBQZXJpb2QKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgTW92aW5nQXZnZXJhZ2UsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNwZWNpZmllcyB0aGUgdHJlbmRsaW5lIHNoYWxsIGJlIGEgcG9seW5vbWlhbCBjdXJ2ZSBvZiBvcmRlciBPcmRlciBpbiB0aGUgZm9ybSAKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgUG9seW5vbWlhbCwKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU3BlY2lmaWVzIHRoZSB0cmVuZGxpbmUgc2hhbGwgYmUgYSBwb3dlciBjdXJ2ZSBpbiB0aGUgZm9ybQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBQb3dlcgotICAgIH0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFNwZWNpZmllcyB0aGUgcG9zc2libGUgd2F5cyB0byBkaXNwbGF5IGJsYW5rcwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGVudW0gZURpc3BsYXlCbGFua3NBcwotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQmxhbmsgdmFsdWVzIHNoYWxsIGJlIGxlZnQgYXMgYSBnYXAKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgR2FwLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBCbGFuayB2YWx1ZXMgc2hhbGwgYmUgc3Bhbm5lZCB3aXRoIGEgbGluZSAoTGluZSBjaGFydHMpCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFNwYW4sCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEJsYW5rIHZhbHVlcyBzaGFsbCBiZSB0cmVhdGVkIGFzIHplcm8KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgWmVybwotICAgIH0KLSAgICBwdWJsaWMgZW51bSBlU2l6ZVJlcHJlc2VudHMKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNwZWNpZmllcyB0aGUgYXJlYSBvZiB0aGUgYnViYmxlcyBzaGFsbCBiZSBwcm9wb3J0aW9uYWwgdG8gdGhlIGJ1YmJsZSBzaXplIHZhbHVlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBBcmVhLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTcGVjaWZpZXMgdGhlIHJhZGl1cyBvZiB0aGUgYnViYmxlcyBzaGFsbCBiZSBwcm9wb3J0aW9uYWwgdG8gdGhlIGJ1YmJsZSBzaXplIHZhbHVlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBXaWR0aAotICAgIH0KLSAgICAjZW5kcmVnaW9uCi0gICAgCi0gICAgCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgLy8vIEJhc2UgY2xhc3MgZm9yIENoYXJ0IG9iamVjdC4KLSAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsQ2hhcnQgOiBFeGNlbERyYXdpbmcKLSAgICB7Ci0gICAgICAgY29uc3Qgc3RyaW5nIHJvb3RQYXRoID0gImM6Y2hhcnRTcGFjZS9jOmNoYXJ0L2M6cGxvdEFyZWEiOwotICAgICAgIC8vc3RyaW5nIF9jaGFydFBhdGg7Ci0gICAgICAgcHJvdGVjdGVkIGludGVybmFsIEV4Y2VsQ2hhcnRTZXJpZXMgX2NoYXJ0U2VyaWVzOwotICAgICAgIGludGVybmFsIEV4Y2VsQ2hhcnRBeGlzW10gX2F4aXM7Ci0gICAgICAgcHJvdGVjdGVkIFhtbEhlbHBlciBfY2hhcnRYbWxIZWxwZXI7Ci0gICAgICAgI3JlZ2lvbiAiQ29uc3RydWN0b3JzIgotICAgICAgIGludGVybmFsIEV4Y2VsQ2hhcnQoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlLCBlQ2hhcnRUeXBlIHR5cGUsIGJvb2wgaXNQaXZvdCkgOgotICAgICAgICAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCAieGRyOmdyYXBoaWNGcmFtZS94ZHI6bnZHcmFwaGljRnJhbWVQci94ZHI6Y052UHIvQG5hbWUiKQotICAgICAgIHsKLSAgICAgICAgICAgQ2hhcnRUeXBlID0gdHlwZTsKLSAgICAgICAgICAgQ3JlYXRlTmV3Q2hhcnQoZHJhd2luZ3MsIHR5cGUsIG51bGwpOwotCi0gICAgICAgICAgIEluaXQoZHJhd2luZ3MsIF9jaGFydE5vZGUpOwotCi0gICAgICAgICAgIF9jaGFydFNlcmllcyA9IG5ldyBFeGNlbENoYXJ0U2VyaWVzKHRoaXMsIGRyYXdpbmdzLk5hbWVTcGFjZU1hbmFnZXIsIF9jaGFydE5vZGUsIGlzUGl2b3QpOwotCi0gICAgICAgICAgIFNldFR5cGVQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgIExvYWRBeGlzKCk7Ci0gICAgICAgfQotICAgICAgIGludGVybmFsIEV4Y2VsQ2hhcnQoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlLCBlQ2hhcnRUeXBlIHR5cGUsIEV4Y2VsQ2hhcnQgdG9wQ2hhcnQsIEV4Y2VsUGl2b3RUYWJsZSBQaXZvdFRhYmxlU291cmNlKSA6Ci0gICAgICAgICAgIGJhc2UoZHJhd2luZ3MsIG5vZGUsICJ4ZHI6Z3JhcGhpY0ZyYW1lL3hkcjpudkdyYXBoaWNGcmFtZVByL3hkcjpjTnZQci9AbmFtZSIpCi0gICAgICAgewotICAgICAgICAgICBDaGFydFR5cGUgPSB0eXBlOwotICAgICAgICAgICBDcmVhdGVOZXdDaGFydChkcmF3aW5ncywgdHlwZSwgdG9wQ2hhcnQpOwotCi0gICAgICAgICAgIEluaXQoZHJhd2luZ3MsIF9jaGFydE5vZGUpOwotCi0gICAgICAgICAgIF9jaGFydFNlcmllcyA9IG5ldyBFeGNlbENoYXJ0U2VyaWVzKHRoaXMsIGRyYXdpbmdzLk5hbWVTcGFjZU1hbmFnZXIsIF9jaGFydE5vZGUsIFBpdm90VGFibGVTb3VyY2UhPW51bGwpOwotICAgICAgICAgICBpZiAoUGl2b3RUYWJsZVNvdXJjZSAhPSBudWxsKSBTZXRQaXZvdFNvdXJjZShQaXZvdFRhYmxlU291cmNlKTsKLQotICAgICAgICAgICBTZXRUeXBlUHJvcGVydGllcygpOwotICAgICAgICAgICBpZiAodG9wQ2hhcnQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgIExvYWRBeGlzKCk7Ci0gICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgX2F4aXMgPSB0b3BDaGFydC5BeGlzOwotICAgICAgICAgICAgICAgaWYgKF9heGlzLkxlbmd0aCA+IDApCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgWEF4aXMgPSBfYXhpc1swXTsKLSAgICAgICAgICAgICAgICAgICBZQXhpcyA9IF9heGlzWzFdOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIGludGVybmFsIEV4Y2VsQ2hhcnQoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlLCBVcmkgdXJpQ2hhcnQsIFppcFBhY2thZ2VQYXJ0IHBhcnQsIFhtbERvY3VtZW50IGNoYXJ0WG1sLCBYbWxOb2RlIGNoYXJ0Tm9kZSkgOgotICAgICAgICAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCAieGRyOmdyYXBoaWNGcmFtZS94ZHI6bnZHcmFwaGljRnJhbWVQci94ZHI6Y052UHIvQG5hbWUiKQotICAgICAgIHsKLSAgICAgICAgICAgVXJpQ2hhcnQgPSB1cmlDaGFydDsKLSAgICAgICAgICAgUGFydCA9IHBhcnQ7Ci0gICAgICAgICAgIENoYXJ0WG1sID0gY2hhcnRYbWw7Ci0gICAgICAgICAgIF9jaGFydE5vZGUgPSBjaGFydE5vZGU7Ci0gICAgICAgICAgIEluaXRDaGFydExvYWQoZHJhd2luZ3MsIGNoYXJ0Tm9kZSk7Ci0gICAgICAgICAgIENoYXJ0VHlwZSA9IEdldENoYXJ0VHlwZShjaGFydE5vZGUuTG9jYWxOYW1lKTsKLSAgICAgICB9Ci0gICAgICAgaW50ZXJuYWwgRXhjZWxDaGFydChFeGNlbENoYXJ0IHRvcENoYXJ0LCBYbWxOb2RlIGNoYXJ0Tm9kZSkgOgotICAgICAgICAgICBiYXNlKHRvcENoYXJ0Ll9kcmF3aW5ncywgdG9wQ2hhcnQuVG9wTm9kZSwgInhkcjpncmFwaGljRnJhbWUveGRyOm52R3JhcGhpY0ZyYW1lUHIveGRyOmNOdlByL0BuYW1lIikKLSAgICAgICB7Ci0gICAgICAgICAgIFVyaUNoYXJ0ID0gdG9wQ2hhcnQuVXJpQ2hhcnQ7Ci0gICAgICAgICAgIFBhcnQgPSB0b3BDaGFydC5QYXJ0OwotICAgICAgICAgICBDaGFydFhtbCA9IHRvcENoYXJ0LkNoYXJ0WG1sOwotICAgICAgICAgICBfcGxvdEFyZWEgPSB0b3BDaGFydC5QbG90QXJlYTsKLSAgICAgICAgICAgX2NoYXJ0Tm9kZSA9IGNoYXJ0Tm9kZTsKLQotICAgICAgICAgICBJbml0Q2hhcnRMb2FkKHRvcENoYXJ0Ll9kcmF3aW5ncywgY2hhcnROb2RlKTsKLSAgICAgICB9Ci0gICAgICAgcHJpdmF0ZSB2b2lkIEluaXRDaGFydExvYWQoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBjaGFydE5vZGUpCi0gICAgICAgewotICAgICAgICAgICAvL1NldENoYXJ0VHlwZSgpOwotICAgICAgICAgICBib29sIGlzUGl2b3QgPSBmYWxzZTsKLSAgICAgICAgICAgSW5pdChkcmF3aW5ncywgY2hhcnROb2RlKTsKLSAgICAgICAgICAgX2NoYXJ0U2VyaWVzID0gbmV3IEV4Y2VsQ2hhcnRTZXJpZXModGhpcywgZHJhd2luZ3MuTmFtZVNwYWNlTWFuYWdlciwgX2NoYXJ0Tm9kZSwgaXNQaXZvdCAvKkNoYXJ0WG1sLlNlbGVjdFNpbmdsZU5vZGUoX2NoYXJ0UGF0aCwgZHJhd2luZ3MuTmFtZVNwYWNlTWFuYWdlcikqLyk7Ci0gICAgICAgICAgIExvYWRBeGlzKCk7Ci0gICAgICAgfQotCi0gICAgICAgcHJpdmF0ZSB2b2lkIEluaXQoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBjaGFydE5vZGUpCi0gICAgICAgewotICAgICAgICAgICAvL19jaGFydFhtbEhlbHBlciA9IG5ldyBYbWxIZWxwZXIoZHJhd2luZ3MuTmFtZVNwYWNlTWFuYWdlciwgY2hhcnROb2RlKTsKLSAgICAgICAgICAgX2NoYXJ0WG1sSGVscGVyID0gWG1sSGVscGVyRmFjdG9yeS5DcmVhdGUoZHJhd2luZ3MuTmFtZVNwYWNlTWFuYWdlciwgY2hhcnROb2RlKTsKLSAgICAgICAgICAgX2NoYXJ0WG1sSGVscGVyLlNjaGVtYU5vZGVPcmRlciA9IG5ldyBzdHJpbmdbXSB7ICJ0aXRsZSIsICJwaXZvdEZtdCIsICJhdXRvVGl0bGVEZWxldGVkIiwgInZpZXczRCIsICJmbG9vciIsICJzaWRlV2FsbCIsICJiYWNrV2FsbCIsICJwbG90QXJlYSIsICJ3aXJlZnJhbWUiLCAiYmFyRGlyIiwgImdyb3VwaW5nIiwgInNjYXR0ZXJTdHlsZSIsICJyYWRhclN0eWxlIiwgInZhcnlDb2xvcnMiLCAic2VyIiwgImRMYmxzIiwgImJ1YmJsZVNjYWxlIiwgInNob3dOZWdCdWJibGVzIiwgImRyb3BMaW5lcyIsICJ1cERvd25CYXJzIiwgIm1hcmtlciIsICJzbW9vdGgiLCAic2hhcGUiLCAibGVnZW5kIiwgInBsb3RWaXNPbmx5IiwgImRpc3BCbGFua3NBcyIsICJzaG93RExibHNPdmVyTWF4IiwgIm92ZXJsYXAiLCAiYmFuZEZtdHMiLCAiYXhJZCIsICJzcFByIiwgInByaW50U2V0dGluZ3MiIH07Ci0gICAgICAgICAgIFdvcmtTaGVldCA9IGRyYXdpbmdzLldvcmtzaGVldDsKLSAgICAgICB9Ci0gICAgICAgI2VuZHJlZ2lvbgotICAgICAgICNyZWdpb24gIlByaXZhdGUgZnVuY3Rpb25zIgotICAgICAgIHByaXZhdGUgdm9pZCBTZXRUeXBlUHJvcGVydGllcygpCi0gICAgICAgewotICAgICAgICAgICAvKioqKioqKiBHcm91cGluZyAqKioqKioqLwotICAgICAgICAgICBpZiAoSXNUeXBlQ2x1c3RlcmVkKCkpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIEdyb3VwaW5nID0gZUdyb3VwaW5nLkNsdXN0ZXJlZDsKLSAgICAgICAgICAgfQotICAgICAgICAgICBlbHNlIGlmICgKLSAgICAgICAgICAgICAgIElzVHlwZVN0YWNrZWQoKSkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgR3JvdXBpbmcgPSBlR3JvdXBpbmcuU3RhY2tlZDsKLSAgICAgICAgICAgfQotICAgICAgICAgICBlbHNlIGlmICgKLSAgICAgICAgICAgSXNUeXBlUGVyY2VudFN0YWNrZWQoKSkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgR3JvdXBpbmcgPSBlR3JvdXBpbmcuUGVyY2VudFN0YWNrZWQ7Ci0gICAgICAgICAgIH0KLQotICAgICAgICAgICAvKioqKiogM0QgUGVyc3BlY3RpdmUgKioqKiovCi0gICAgICAgICAgIGlmIChJc1R5cGUzRCgpKSAgICAgICAgICAgICAKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgVmlldzNELlJvdFkgPSAyMDsKLSAgICAgICAgICAgICAgIFZpZXczRC5QZXJzcGVjdGl2ZSA9IDMwOyAgICAvL0RlZmF1bHQgdG8gMzAKLSAgICAgICAgICAgICAgIGlmIChJc1R5cGVQaWVEb3VnaG51dCgpKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIFZpZXczRC5Sb3RYID0gMzA7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgVmlldzNELlJvdFggPSAxNTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICBwcml2YXRlIHZvaWQgQ3JlYXRlTmV3Q2hhcnQoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgZUNoYXJ0VHlwZSB0eXBlLCBFeGNlbENoYXJ0IHRvcENoYXJ0KQotICAgICAgIHsKLSAgICAgICAgICAgaWYgKHRvcENoYXJ0ID09IG51bGwpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgZ3JhcGhGcmFtZSA9IFRvcE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KCJncmFwaGljRnJhbWUiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hU2hlZXREcmF3aW5ncyk7Ci0gICAgICAgICAgICAgICBncmFwaEZyYW1lLlNldEF0dHJpYnV0ZSgibWFjcm8iLCAiIik7Ci0gICAgICAgICAgICAgICBUb3BOb2RlLkFwcGVuZENoaWxkKGdyYXBoRnJhbWUpOyAKLSAgICAgICAgICAgICAgIGdyYXBoRnJhbWUuSW5uZXJYbWwgPSBzdHJpbmcuRm9ybWF0KCI8eGRyOm52R3JhcGhpY0ZyYW1lUHI+PHhkcjpjTnZQciBpZD1cInswfVwiIG5hbWU9XCJDaGFydCAxXCIgLz48eGRyOmNOdkdyYXBoaWNGcmFtZVByIC8+PC94ZHI6bnZHcmFwaGljRnJhbWVQcj48eGRyOnhmcm0+PGE6b2ZmIHg9XCIwXCIgeT1cIjBcIiAvPiA8YTpleHQgY3g9XCIwXCIgY3k9XCIwXCIgLz48L3hkcjp4ZnJtPjxhOmdyYXBoaWM+PGE6Z3JhcGhpY0RhdGEgdXJpPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL2RyYXdpbmdtbC8yMDA2L2NoYXJ0XCI+PGM6Y2hhcnQgeG1sbnM6Yz1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9kcmF3aW5nbWwvMjAwNi9jaGFydFwiIHhtbG5zOnI9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzXCIgcjppZD1cInJJZDFcIiAvPiAgIDwvYTpncmFwaGljRGF0YT4gIDwvYTpncmFwaGljPiIsX2lkKTsKLSAgICAgICAgICAgICAgIFRvcE5vZGUuQXBwZW5kQ2hpbGQoVG9wTm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoImNsaWVudERhdGEiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hU2hlZXREcmF3aW5ncykpOwotCi0gICAgICAgICAgICAgICB2YXIgcGFja2FnZSA9IGRyYXdpbmdzLldvcmtzaGVldC5fcGFja2FnZS5QYWNrYWdlOwotICAgICAgICAgICAgICAgVXJpQ2hhcnQgPSBHZXROZXdVcmkocGFja2FnZSwgIi94bC9jaGFydHMvY2hhcnR7MH0ueG1sIik7Ci0KLSAgICAgICAgICAgICAgIENoYXJ0WG1sID0gbmV3IFhtbERvY3VtZW50KCk7Ci0gICAgICAgICAgICAgICBDaGFydFhtbC5QcmVzZXJ2ZVdoaXRlc3BhY2UgPSBFeGNlbFBhY2thZ2UucHJlc2VydmVXaGl0ZXNwYWNlOwotICAgICAgICAgICAgICAgTG9hZFhtbFNhZmUoQ2hhcnRYbWwsIENoYXJ0U3RhcnRYbWwodHlwZSksIEVuY29kaW5nLlVURjgpOwotCi0gICAgICAgICAgICAgICAvLyBzYXZlIGl0IHRvIHRoZSBwYWNrYWdlCi0gICAgICAgICAgICAgICBQYXJ0ID0gcGFja2FnZS5DcmVhdGVQYXJ0KFVyaUNoYXJ0LCAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LmRyYXdpbmdtbC5jaGFydCt4bWwiLCBfZHJhd2luZ3MuX3BhY2thZ2UuQ29tcHJlc3Npb24pOwotCi0gICAgICAgICAgICAgICBTdHJlYW1Xcml0ZXIgc3RyZWFtQ2hhcnQgPSBuZXcgU3RyZWFtV3JpdGVyKFBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5Xcml0ZSkpOwotICAgICAgICAgICAgICAgQ2hhcnRYbWwuU2F2ZShzdHJlYW1DaGFydCk7Ci0gICAgICAgICAgICAgICBzdHJlYW1DaGFydC5DbG9zZSgpOwotICAgICAgICAgICAgICAgcGFja2FnZS5GbHVzaCgpOwotCi0gICAgICAgICAgICAgICB2YXIgY2hhcnRSZWxhdGlvbiA9IGRyYXdpbmdzLlBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKFVyaUhlbHBlci5HZXRSZWxhdGl2ZVVyaShkcmF3aW5ncy5VcmlEcmF3aW5nLCBVcmlDaGFydCksIFBhY2thZ2luZy5UYXJnZXRNb2RlLkludGVybmFsLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcyArICIvY2hhcnQiKTsKLSAgICAgICAgICAgICAgIGdyYXBoRnJhbWUuU2VsZWN0U2luZ2xlTm9kZSgiYTpncmFwaGljL2E6Z3JhcGhpY0RhdGEvYzpjaGFydCIsIE5hbWVTcGFjZU1hbmFnZXIpLkF0dHJpYnV0ZXNbInI6aWQiXS5WYWx1ZSA9IGNoYXJ0UmVsYXRpb24uSWQ7Ci0gICAgICAgICAgICAgICBwYWNrYWdlLkZsdXNoKCk7Ci0gICAgICAgICAgICAgICBfY2hhcnROb2RlID0gQ2hhcnRYbWwuU2VsZWN0U2luZ2xlTm9kZShzdHJpbmcuRm9ybWF0KCJjOmNoYXJ0U3BhY2UvYzpjaGFydC9jOnBsb3RBcmVhL3swfSIsIEdldENoYXJ0Tm9kZVRleHQoKSksIE5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgQ2hhcnRYbWwgPSB0b3BDaGFydC5DaGFydFhtbDsKLSAgICAgICAgICAgICAgIFBhcnQgPSB0b3BDaGFydC5QYXJ0OwotICAgICAgICAgICAgICAgX3Bsb3RBcmVhID0gdG9wQ2hhcnQuUGxvdEFyZWE7Ci0gICAgICAgICAgICAgICBVcmlDaGFydCA9IHRvcENoYXJ0LlVyaUNoYXJ0OwotICAgICAgICAgICAgICAgX2F4aXMgPSB0b3BDaGFydC5fYXhpczsKLQotICAgICAgICAgICAgICAgWG1sTm9kZSBwcmVOb2RlID0gX3Bsb3RBcmVhLkNoYXJ0VHlwZXNbX3Bsb3RBcmVhLkNoYXJ0VHlwZXMuQ291bnQgLSAxXS5DaGFydE5vZGU7Ci0gICAgICAgICAgICAgICBfY2hhcnROb2RlID0gKChYbWxEb2N1bWVudClDaGFydFhtbCkuQ3JlYXRlRWxlbWVudChHZXRDaGFydE5vZGVUZXh0KCksIEV4Y2VsUGFja2FnZS5zY2hlbWFDaGFydCk7Ci0gICAgICAgICAgICAgICBwcmVOb2RlLlBhcmVudE5vZGUuSW5zZXJ0QWZ0ZXIoX2NoYXJ0Tm9kZSwgcHJlTm9kZSk7Ci0gICAgICAgICAgICAgICBpZiAodG9wQ2hhcnQuQXhpcy5MZW5ndGggPT0gMCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBBZGRBeGlzKCk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBzdHJpbmcgc2VyaWVYTUwgPSBHZXRDaGFydFNlcmllU3RhcnRYbWwodHlwZSwgaW50LlBhcnNlKHRvcENoYXJ0LkF4aXNbMF0uSWQpLCBpbnQuUGFyc2UodG9wQ2hhcnQuQXhpc1sxXS5JZCksIHRvcENoYXJ0LkF4aXMuTGVuZ3RoPjI/aW50LlBhcnNlKHRvcENoYXJ0LkF4aXNbMl0uSWQpIDogLTEpOwotICAgICAgICAgICAgICAgX2NoYXJ0Tm9kZS5Jbm5lclhtbCA9IHNlcmllWE1MOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIHByaXZhdGUgdm9pZCBMb2FkQXhpcygpCi0gICAgICAgewotICAgICAgICAgICBYbWxOb2RlTGlzdCBubCA9IF9jaGFydE5vZGUuU2VsZWN0Tm9kZXMoImM6YXhJZCIsIE5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICBMaXN0PEV4Y2VsQ2hhcnRBeGlzPiBsID0gbmV3IExpc3Q8RXhjZWxDaGFydEF4aXM+KCk7Ci0gICAgICAgICAgIGZvcmVhY2ggKFhtbE5vZGUgbm9kZSBpbiBubCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgc3RyaW5nIGlkID0gbm9kZS5BdHRyaWJ1dGVzWyJ2YWwiXS5WYWx1ZTsKLSAgICAgICAgICAgICAgIHZhciBheE5vZGUgPSBDaGFydFhtbC5TZWxlY3ROb2Rlcyhyb290UGF0aCArIHN0cmluZy5Gb3JtYXQoIi8qL2M6YXhJZFtAdmFsPVwiezB9XCJdIiwgaWQpLCBOYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgIGlmIChheE5vZGUgIT0gbnVsbCAmJiBheE5vZGUuQ291bnQ+MSkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChYbWxOb2RlIGF4biBpbiBheE5vZGUpCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXhuLlBhcmVudE5vZGUuTG9jYWxOYW1lLkVuZHNXaXRoKCJBeCIpKQotICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxOb2RlIGF4aXNOb2RlID0gYXhOb2RlWzFdLlBhcmVudE5vZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlbENoYXJ0QXhpcyBheCA9IG5ldyBFeGNlbENoYXJ0QXhpcyhOYW1lU3BhY2VNYW5hZ2VyLCBheGlzTm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBsLkFkZChheCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgX2F4aXMgPSBsLlRvQXJyYXkoKTsKLQotICAgICAgICAgICBpZihfYXhpcy5MZW5ndGggPiAwKSBYQXhpcyA9IF9heGlzWzBdOwotICAgICAgICAgICBpZiAoX2F4aXMuTGVuZ3RoID4gMSkgWUF4aXMgPSBfYXhpc1sxXTsKLSAgICAgICB9Ci0gICAgICAgLy9wcml2YXRlIHZvaWQgU2V0Q2hhcnRUeXBlKCkKLSAgICAgICAvL3sKLSAgICAgICAvLyAgICBDaGFydFR5cGUgPSAwOwotICAgICAgIC8vICAgIC8vX3Bsb3RBcmVhID0gbmV3IEV4Y2VsQ2hhcnRQbG90QXJlYShOYW1lU3BhY2VNYW5hZ2VyLCBDaGFydFhtbC5TZWxlY3RTaW5nbGVOb2RlKCJjOmNoYXJ0U3BhY2UvYzpjaGFydC9jOnBsb3RBcmVhIiwgTmFtZVNwYWNlTWFuYWdlcikpOwotICAgICAgIC8vICAgIGludCBwb3M9MDsKLSAgICAgICAvLyAgICBmb3JlYWNoIChYbWxFbGVtZW50IG4gaW4gQ2hhcnRYbWwuU2VsZWN0U2luZ2xlTm9kZShyb290UGF0aCwgX2RyYXdpbmdzLk5hbWVTcGFjZU1hbmFnZXIpLkNoaWxkTm9kZXMpCi0gICAgICAgLy8gICAgewotICAgICAgIC8vICAgICAgICBpZiAocG9zID09IDApCi0gICAgICAgLy8gICAgICAgIHsKLSAgICAgICAvLyAgICAgICAgICAgIENoYXJ0VHlwZSA9IEdldENoYXJ0VHlwZShuLk5hbWUpOwotICAgICAgIC8vICAgICAgICAgICAgaWYgKENoYXJ0VHlwZSAhPSAwKQotICAgICAgIC8vICAgICAgICAgICAgewotICAgICAgIC8vICAgICAgICAgICAgICAgIC8vX2NoYXJ0UGF0aCA9IHJvb3RQYXRoICsgIi8iICsgbi5OYW1lOwotICAgICAgIC8vICAgICAgICAgICAgICAgIFBsb3RBcmVhLkNoYXJ0VHlwZXMuQWRkKHRoaXMpOwotICAgICAgIC8vICAgICAgICAgICAgfQotICAgICAgIC8vICAgICAgICB9Ci0gICAgICAgLy8gICAgICAgIGVsc2UKLSAgICAgICAvLyAgICAgICAgewotICAgICAgIC8vICAgICAgICAgICAgdmFyIGNoYXJ0U2VyaWVUeXBlID0gR2V0Q2hhcnQoX2RyYXdpbmdzLCBUb3BOb2RlLyosIG4qLyk7Ci0gICAgICAgLy8gICAgICAgICAgICBjaGFydFNlcmllVHlwZSA9IEdldENoYXJ0KG4sIF9kcmF3aW5ncywgVG9wTm9kZSwgVXJpQ2hhcnQsIFBhcnQsIENoYXJ0WG1sLCBudWxsLCBpc1Bpdm90KTsKLSAgICAgICAvLyAgICAgICAgICAgIFBsb3RBcmVhLkNoYXJ0VHlwZXMuQWRkKGNoYXJ0U2VyaWVUeXBlKTsKLSAgICAgICAvLyAgICAgICAgICAgIC8vdmFyIGNoYXJ0VHlwZSA9IEdldENoYXJ0VHlwZShuLk5hbWUpOwotICAgICAgIC8vICAgICAgICB9Ci0gICAgICAgLy8gICAgICAgIGlmIChDaGFydFR5cGUgIT0gMCkKLSAgICAgICAvLyAgICAgICAgewotICAgICAgIC8vICAgICAgICAgICAgcG9zKys7Ci0gICAgICAgLy8gICAgICAgIH0KLSAgICAgICAvLyAgICB9Ci0gICAgICAgLy99Ci0gICAgICAgaW50ZXJuYWwgdmlydHVhbCBlQ2hhcnRUeXBlIEdldENoYXJ0VHlwZShzdHJpbmcgbmFtZSkKLSAgICAgICB7Ci0gICAgICAgICAgIAotICAgICAgICAgICBzd2l0Y2ggKG5hbWUpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGNhc2UgImFyZWEzRENoYXJ0IjoKLSAgICAgICAgICAgICAgICAgICBpZihHcm91cGluZz09ZUdyb3VwaW5nLlN0YWNrZWQpCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5BcmVhU3RhY2tlZDNEOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChHcm91cGluZyA9PSBlR3JvdXBpbmcuUGVyY2VudFN0YWNrZWQpCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5BcmVhU3RhY2tlZDEwMDNEOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5BcmVhM0Q7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgY2FzZSAiYXJlYUNoYXJ0IjoKLSAgICAgICAgICAgICAgICAgICBpZiAoR3JvdXBpbmcgPT0gZUdyb3VwaW5nLlN0YWNrZWQpCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5BcmVhU3RhY2tlZDsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoR3JvdXBpbmcgPT0gZUdyb3VwaW5nLlBlcmNlbnRTdGFja2VkKQotICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuQXJlYVN0YWNrZWQxMDA7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkFyZWE7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgY2FzZSAiZG91Z2hudXRDaGFydCI6Ci0gICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuRG91Z2hudXQ7Ci0gICAgICAgICAgICAgICBjYXNlICJwaWUzRENoYXJ0IjoKLSAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5QaWUzRDsKLSAgICAgICAgICAgICAgIGNhc2UgInBpZUNoYXJ0IjoKLSAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5QaWU7Ci0gICAgICAgICAgICAgICBjYXNlICJyYWRhckNoYXJ0IjoKLSAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5SYWRhcjsKLSAgICAgICAgICAgICAgIGNhc2UgInNjYXR0ZXJDaGFydCI6Ci0gICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuWFlTY2F0dGVyOwotICAgICAgICAgICAgICAgY2FzZSAic3VyZmFjZTNEQ2hhcnQiOgotICAgICAgICAgICAgICAgY2FzZSAic3VyZmFjZUNoYXJ0IjoKLSAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5TdXJmYWNlOwotICAgICAgICAgICAgICAgY2FzZSAic3RvY2tDaGFydCI6Ci0gICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuU3RvY2tITEM7Ci0gICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICB9ICAgICAgICAgICAKLSAgICAgICB9Ci0gICAgICAgI3JlZ2lvbiAiWG1sIGluaXQgRnVuY3Rpb25zIgotICAgICAgIHByaXZhdGUgc3RyaW5nIENoYXJ0U3RhcnRYbWwoZUNoYXJ0VHlwZSB0eXBlKQotICAgICAgIHsKLSAgICAgICAgICAgU3RyaW5nQnVpbGRlciB4bWw9bmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgaW50IGF4SUQ9MTsKLSAgICAgICAgICAgaW50IHhBeElEPTI7Ci0gICAgICAgICAgIGludCBzZXJBeElEID0gSXNUeXBlU3VyZmFjZSgpID8gMyA6IC0xOwotCi0gICAgICAgICAgIHhtbC5BcHBlbmQoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cInllc1wiPz4iKTsKLSAgICAgICAgICAgeG1sLkFwcGVuZEZvcm1hdCgiPGM6Y2hhcnRTcGFjZSB4bWxuczpjPVwiezB9XCIgeG1sbnM6YT1cInsxfVwiIHhtbG5zOnI9XCJ7Mn1cIj4iLCBFeGNlbFBhY2thZ2Uuc2NoZW1hQ2hhcnQsIEV4Y2VsUGFja2FnZS5zY2hlbWFEcmF3aW5ncywgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMpOyAgICAgICAKLSAgICAgICAgICAgeG1sLkFwcGVuZCgiPGM6Y2hhcnQ+Iik7Ci0gICAgICAgICAgIHhtbC5BcHBlbmRGb3JtYXQoInswfXsxfTxjOnBsb3RBcmVhPjxjOmxheW91dC8+IixBZGRQZXJzcGVjdGl2ZVhtbCh0eXBlKSwgQWRkU3VyZmFjZVhtbCh0eXBlKSk7Ci0KLSAgICAgICAgICAgc3RyaW5nIGNoYXJ0Tm9kZVRleHQgPSBHZXRDaGFydE5vZGVUZXh0KCk7Ci0gICAgICAgICAgIHhtbC5BcHBlbmRGb3JtYXQoIjx7MH0+IiwgY2hhcnROb2RlVGV4dCk7Ci0gICAgICAgICAgIHhtbC5BcHBlbmQoR2V0Q2hhcnRTZXJpZVN0YXJ0WG1sKHR5cGUsIGF4SUQsIHhBeElELCBzZXJBeElEKSk7Ci0gICAgICAgICAgIHhtbC5BcHBlbmRGb3JtYXQoIjwvezB9PiIsIGNoYXJ0Tm9kZVRleHQpOwotCi0gICAgICAgICAgIC8vQXhpcwotICAgICAgICAgICBpZiAoIUlzVHlwZVBpZURvdWdobnV0KCkpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGlmIChJc1R5cGVTY2F0dGVyQnViYmxlKCkpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgeG1sLkFwcGVuZEZvcm1hdCgiPGM6dmFsQXg+PGM6YXhJZCB2YWw9XCJ7MH1cIi8+PGM6c2NhbGluZz48YzpvcmllbnRhdGlvbiB2YWw9XCJtaW5NYXhcIi8+PC9jOnNjYWxpbmc+PGM6ZGVsZXRlIHZhbD1cIjBcIi8+PGM6YXhQb3MgdmFsPVwiYlwiLz48Yzp0aWNrTGJsUG9zIHZhbD1cIm5leHRUb1wiLz48Yzpjcm9zc0F4IHZhbD1cInsxfVwiLz48Yzpjcm9zc2VzIHZhbD1cImF1dG9aZXJvXCIvPjwvYzp2YWxBeD4iLCBheElELCB4QXhJRCk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgeG1sLkFwcGVuZEZvcm1hdCgiPGM6Y2F0QXg+PGM6YXhJZCB2YWw9XCJ7MH1cIi8+PGM6c2NhbGluZz48YzpvcmllbnRhdGlvbiB2YWw9XCJtaW5NYXhcIi8+PC9jOnNjYWxpbmc+PGM6ZGVsZXRlIHZhbD1cIjBcIi8+PGM6YXhQb3MgdmFsPVwiYlwiLz48Yzp0aWNrTGJsUG9zIHZhbD1cIm5leHRUb1wiLz48Yzpjcm9zc0F4IHZhbD1cInsxfVwiLz48Yzpjcm9zc2VzIHZhbD1cImF1dG9aZXJvXCIvPjxjOmF1dG8gdmFsPVwiMVwiLz48YzpsYmxBbGduIHZhbD1cImN0clwiLz48YzpsYmxPZmZzZXQgdmFsPVwiMTAwXCIvPjwvYzpjYXRBeD4iLCBheElELCB4QXhJRCk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB4bWwuQXBwZW5kRm9ybWF0KCI8Yzp2YWxBeD48YzpheElkIHZhbD1cInsxfVwiLz48YzpzY2FsaW5nPjxjOm9yaWVudGF0aW9uIHZhbD1cIm1pbk1heFwiLz48L2M6c2NhbGluZz48YzpkZWxldGUgdmFsPVwiMFwiLz48YzpheFBvcyB2YWw9XCJsXCIvPjxjOm1ham9yR3JpZGxpbmVzLz48Yzp0aWNrTGJsUG9zIHZhbD1cIm5leHRUb1wiLz48Yzpjcm9zc0F4IHZhbD1cInswfVwiLz48Yzpjcm9zc2VzIHZhbD1cImF1dG9aZXJvXCIvPjxjOmNyb3NzQmV0d2VlbiB2YWw9XCJiZXR3ZWVuXCIvPjwvYzp2YWxBeD4iLCBheElELCB4QXhJRCk7Ci0gICAgICAgICAgICAgICBpZiAoc2VyQXhJRD09MykgLy9TdXJlZmFjZSBDaGFydAotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIHhtbC5BcHBlbmRGb3JtYXQoIjxjOnNlckF4PjxjOmF4SWQgdmFsPVwiezB9XCIvPjxjOnNjYWxpbmc+PGM6b3JpZW50YXRpb24gdmFsPVwibWluTWF4XCIvPjwvYzpzY2FsaW5nPjxjOmRlbGV0ZSB2YWw9XCIwXCIvPjxjOmF4UG9zIHZhbD1cImJcIi8+PGM6dGlja0xibFBvcyB2YWw9XCJuZXh0VG9cIi8+PGM6Y3Jvc3NBeCB2YWw9XCJ7MX1cIi8+PGM6Y3Jvc3NlcyB2YWw9XCJhdXRvWmVyb1wiLz48L2M6c2VyQXg+Iiwgc2VyQXhJRCwgeEF4SUQpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgeG1sLkFwcGVuZEZvcm1hdCgiPC9jOnBsb3RBcmVhPjxjOmxlZ2VuZD48YzpsZWdlbmRQb3MgdmFsPVwiclwiLz48YzpsYXlvdXQvPjxjOm92ZXJsYXkgdmFsPVwiMFwiIC8+PC9jOmxlZ2VuZD48YzpwbG90VmlzT25seSB2YWw9XCIxXCIvPjwvYzpjaGFydD4iLCBheElELCB4QXhJRCk7Ci0KLSAgICAgICAgICAgeG1sLkFwcGVuZCgiPGM6cHJpbnRTZXR0aW5ncz48YzpoZWFkZXJGb290ZXIvPjxjOnBhZ2VNYXJnaW5zIGI9XCIwLjc1XCIgbD1cIjAuN1wiIHI9XCIwLjdcIiB0PVwiMC43NVwiIGhlYWRlcj1cIjAuM1wiIGZvb3Rlcj1cIjAuM1wiLz48YzpwYWdlU2V0dXAvPjwvYzpwcmludFNldHRpbmdzPjwvYzpjaGFydFNwYWNlPiIpOyAgICAgICAgICAKLSAgICAgICAgICAgcmV0dXJuIHhtbC5Ub1N0cmluZygpOwotICAgICAgIH0KLQotICAgICAgIHByaXZhdGUgc3RyaW5nIEdldENoYXJ0U2VyaWVTdGFydFhtbChlQ2hhcnRUeXBlIHR5cGUsIGludCBheElELCBpbnQgeEF4SUQsIGludCBzZXJBeElEKQotICAgICAgIHsKLSAgICAgICAgICAgU3RyaW5nQnVpbGRlciB4bWwgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgICAgICAgIHhtbC5BcHBlbmQoQWRkU2NhdHRlclR5cGUodHlwZSkpOwotICAgICAgICAgICB4bWwuQXBwZW5kKEFkZFJhZGFyVHlwZSh0eXBlKSk7Ci0gICAgICAgICAgIHhtbC5BcHBlbmQoQWRkQmFyRGlyKHR5cGUpKTsKLSAgICAgICAgICAgeG1sLkFwcGVuZChBZGRHcm91cGluZygpKTsKLSAgICAgICAgICAgeG1sLkFwcGVuZChBZGRWYXJ5Q29sb3JzKCkpOwotICAgICAgICAgICB4bWwuQXBwZW5kKEFkZEhhc01hcmtlcih0eXBlKSk7Ci0gICAgICAgICAgIHhtbC5BcHBlbmQoQWRkU2hhcGUodHlwZSkpOwotICAgICAgICAgICB4bWwuQXBwZW5kKEFkZEZpcnN0U2xpY2VBbmcodHlwZSkpOwotICAgICAgICAgICB4bWwuQXBwZW5kKEFkZEhvbGVTaXplKHR5cGUpKTsKLSAgICAgICAgICAgaWYgKENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkJhclN0YWNrZWQxMDAgfHwgCi0gICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5CYXJTdGFja2VkIHx8Ci0gICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5Db2x1bW5TdGFja2VkIHx8Ci0gICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5Db2x1bW5TdGFja2VkMTAwKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICB4bWwuQXBwZW5kKCI8YzpvdmVybGFwIHZhbD1cIjEwMFwiLz4iKTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBpZiAoSXNUeXBlU3VyZmFjZSgpKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICB4bWwuQXBwZW5kKCI8YzpiYW5kRm10cy8+Iik7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgeG1sLkFwcGVuZChBZGRBeGlzSWQoYXhJRCwgeEF4SUQsIHNlckF4SUQpKTsKLQotICAgICAgICAgICByZXR1cm4geG1sLlRvU3RyaW5nKCk7Ci0gICAgICAgfQotICAgICAgIHByaXZhdGUgc3RyaW5nIEFkZEF4aXNJZChpbnQgYXhJRCxpbnQgeEF4SUQsIGludCBzZXJBeElEKQotICAgICAgIHsKLSAgICAgICAgICAgaWYgKCFJc1R5cGVQaWVEb3VnaG51dCgpKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAoSXNUeXBlU3VyZmFjZSgpKQotICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5Gb3JtYXQoIjxjOmF4SWQgdmFsPVwiezB9XCIvPjxjOmF4SWQgdmFsPVwiezF9XCIvPjxjOmF4SWQgdmFsPVwiezJ9XCIvPiIsIGF4SUQsIHhBeElELCBzZXJBeElEKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nLkZvcm1hdCgiPGM6YXhJZCB2YWw9XCJ7MH1cIi8+PGM6YXhJZCB2YWw9XCJ7MX1cIi8+IiwgYXhJRCwgeEF4SUQpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIHByaXZhdGUgc3RyaW5nIEFkZEF4VHlwZSgpCi0gICAgICAgewotICAgICAgICAgICBzd2l0Y2goQ2hhcnRUeXBlKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuWFlTY2F0dGVyOgotICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlhZU2NhdHRlckxpbmVzOgotICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlhZU2NhdHRlckxpbmVzTm9NYXJrZXJzOgotICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlhZU2NhdHRlclNtb290aDoKLSAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5YWVNjYXR0ZXJTbW9vdGhOb01hcmtlcnM6Ci0gICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQnViYmxlOgotICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkJ1YmJsZTNERWZmZWN0OgotICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFsQXgiOwotICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICByZXR1cm4gImNhdEF4IjsKLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICBwcml2YXRlIHN0cmluZyBBZGRTY2F0dGVyVHlwZShlQ2hhcnRUeXBlIHR5cGUpCi0gICAgICAgewotICAgICAgICAgICBpZiAodHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlciB8fAotICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlckxpbmVzIHx8Ci0gICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuWFlTY2F0dGVyTGluZXNOb01hcmtlcnMgfHwKLSAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXJTbW9vdGggfHwKLSAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXJTbW9vdGhOb01hcmtlcnMpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiAiPGM6c2NhdHRlclN0eWxlIHZhbD1cIlwiIC8+IjsKLSAgICAgICAgICAgfQotICAgICAgICAgICBlbHNlCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICBwcml2YXRlIHN0cmluZyBBZGRSYWRhclR5cGUoZUNoYXJ0VHlwZSB0eXBlKQotICAgICAgIHsKLSAgICAgICAgICAgaWYgKHR5cGUgPT0gZUNoYXJ0VHlwZS5SYWRhciB8fAotICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLlJhZGFyRmlsbGVkfHwKLSAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5SYWRhck1hcmtlcnMpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiAiPGM6cmFkYXJTdHlsZSB2YWw9XCJcIiAvPiI7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgZWxzZQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgcHJpdmF0ZSBzdHJpbmcgQWRkR3JvdXBpbmcoKQotICAgICAgIHsKLSAgICAgICAgICAgLy9Jc1R5cGVDbHVzdGVyZWQoKSB8fCBJc1R5cGVQZXJjZW50U3RhY2tlZCgpIHx8IElzVHlwZVN0YWNrZWQoKSB8fCAKLSAgICAgICAgICAgaWYoSXNUeXBlU2hhcGUoKSB8fCBJc1R5cGVMaW5lKCkpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiAiPGM6Z3JvdXBpbmcgdmFsPVwic3RhbmRhcmRcIi8+IjsKLSAgICAgICAgICAgfQotICAgICAgICAgICBlbHNlCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICBwcml2YXRlIHN0cmluZyBBZGRIb2xlU2l6ZShlQ2hhcnRUeXBlIHR5cGUpCi0gICAgICAgewotICAgICAgICAgICBpZiAodHlwZSA9PSBlQ2hhcnRUeXBlLkRvdWdobnV0IHx8Ci0gICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuRG91Z2hudXRFeHBsb2RlZCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuICI8Yzpob2xlU2l6ZSB2YWw9XCI1MFwiIC8+IjsKLSAgICAgICAgICAgfQotICAgICAgICAgICBlbHNlCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICBwcml2YXRlIHN0cmluZyBBZGRGaXJzdFNsaWNlQW5nKGVDaGFydFR5cGUgdHlwZSkKLSAgICAgICB7Ci0gICAgICAgICAgIGlmICh0eXBlID09IGVDaGFydFR5cGUuRG91Z2hudXQgfHwKLSAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5Eb3VnaG51dEV4cGxvZGVkKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICByZXR1cm4gIjxjOmZpcnN0U2xpY2VBbmcgdmFsPVwiMFwiIC8+IjsKLSAgICAgICAgICAgfQotICAgICAgICAgICBlbHNlCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICBwcml2YXRlIHN0cmluZyBBZGRWYXJ5Q29sb3JzKCkKLSAgICAgICB7Ci0gICAgICAgICAgIGlmIChJc1R5cGVQaWVEb3VnaG51dCgpKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICByZXR1cm4gIjxjOnZhcnlDb2xvcnMgdmFsPVwiMVwiIC8+IjsKLSAgICAgICAgICAgfQotICAgICAgICAgICBlbHNlCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiAiPGM6dmFyeUNvbG9ycyB2YWw9XCIwXCIgLz4iOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIHByaXZhdGUgc3RyaW5nIEFkZEhhc01hcmtlcihlQ2hhcnRUeXBlIHR5cGUpCi0gICAgICAgewotICAgICAgICAgICBpZiAodHlwZSA9PSBlQ2hhcnRUeXBlLkxpbmVNYXJrZXJzIHx8Ci0gICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuTGluZU1hcmtlcnNTdGFja2VkIHx8Ci0gICAgICAgICAgICAgICB0eXBlID09IGVDaGFydFR5cGUuTGluZU1hcmtlcnNTdGFja2VkMTAwIC8qfHwKLSAgICAgICAgICAgICAgIHR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXJMaW5lcyB8fAotICAgICAgICAgICAgICAgdHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlclNtb290aCovKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICByZXR1cm4gIjxjOm1hcmtlciB2YWw9XCIxXCIvPiI7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgZWxzZQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgcHJpdmF0ZSBzdHJpbmcgQWRkU2hhcGUoZUNoYXJ0VHlwZSB0eXBlKQotICAgICAgIHsKLSAgICAgICAgICAgaWYgKElzVHlwZVNoYXBlKCkpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiAiPGM6c2hhcGUgdmFsPVwiYm94XCIgLz4iOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIHByaXZhdGUgc3RyaW5nIEFkZEJhckRpcihlQ2hhcnRUeXBlIHR5cGUpCi0gICAgICAgewotICAgICAgICAgICBpZiAoSXNUeXBlU2hhcGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIjxjOmJhckRpciB2YWw9XCJjb2xcIiAvPiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICBwcml2YXRlIHN0cmluZyBBZGRQZXJzcGVjdGl2ZVhtbChlQ2hhcnRUeXBlIHR5cGUpCi0gICAgICAgIHsKLSAJICAgICAgICAvL0FkZCBmb3IgM0Qgc2hhcnRzCi0gICAgICAgICAgICBpZiAoSXNUeXBlM0QoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIjxjOnZpZXczRD48YzpwZXJzcGVjdGl2ZSB2YWw9XCIzMFwiIC8+PC9jOnZpZXczRD4iOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgIHByaXZhdGUgc3RyaW5nIEFkZFN1cmZhY2VYbWwoZUNoYXJ0VHlwZSB0eXBlKQotICAgICAgIHsKLSAgICAgICAgICAgaWYgKElzVHlwZVN1cmZhY2UoKSkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuIEFkZFN1cmZhY2VQYXJ0KCJmbG9vciIpICsgQWRkU3VyZmFjZVBhcnQoInNpZGVXYWxsIikgKyBBZGRTdXJmYWNlUGFydCgiYmFja1dhbGwiKTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBlbHNlCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgfQotICAgICAgIH0KLQotICAgICAgIHByaXZhdGUgc3RyaW5nIEFkZFN1cmZhY2VQYXJ0KHN0cmluZyBuYW1lKQotICAgICAgIHsKLSAgICAgICAgICAgcmV0dXJuIHN0cmluZy5Gb3JtYXQoIjxjOnswfT48Yzp0aGlja25lc3MgdmFsPVwiMFwiLz48YzpzcFByPjxhOm5vRmlsbC8+PGE6bG4+PGE6bm9GaWxsLz48L2E6bG4+PGE6ZWZmZWN0THN0Lz48YTpzcDNkLz48L2M6c3BQcj48L2M6ezB9PiIsIG5hbWUpOwotICAgICAgIH0KLSAgICAgICAjZW5kcmVnaW9uCi0gICAgICAgI2VuZHJlZ2lvbgotICAgICAgICNyZWdpb24gIkNoYXJ0IHR5cGUgZnVuY3Rpb25zCi0gICAgICAgaW50ZXJuYWwgc3RhdGljIGJvb2wgSXNUeXBlM0QoZUNoYXJ0VHlwZSBjaGFydFR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5BcmVhM0QgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5BcmVhU3RhY2tlZDNEIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuQXJlYVN0YWNrZWQxMDAzRCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkJhckNsdXN0ZXJlZDNEIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuQmFyU3RhY2tlZDNEIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuQmFyU3RhY2tlZDEwMDNEIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ29sdW1uM0QgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5Db2x1bW5DbHVzdGVyZWQzRCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQzRCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQxMDAzRCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkxpbmUzRCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlBpZTNEIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuUGllRXhwbG9kZWQzRCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkNvbmVCYXJDbHVzdGVyZWQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5Db25lQmFyU3RhY2tlZCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkNvbmVCYXJTdGFja2VkMTAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ29uZUNvbCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkNvbmVDb2xDbHVzdGVyZWQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5Db25lQ29sU3RhY2tlZCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkNvbmVDb2xTdGFja2VkMTAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ3lsaW5kZXJCYXJDbHVzdGVyZWQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckJhclN0YWNrZWQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckJhclN0YWNrZWQxMDAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckNvbCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkN5bGluZGVyQ29sQ2x1c3RlcmVkIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ3lsaW5kZXJDb2xTdGFja2VkIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ3lsaW5kZXJDb2xTdGFja2VkMTAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuUHlyYW1pZEJhckNsdXN0ZXJlZCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlB5cmFtaWRCYXJTdGFja2VkIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuUHlyYW1pZEJhclN0YWNrZWQxMDAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5QeXJhbWlkQ29sIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuUHlyYW1pZENvbENsdXN0ZXJlZCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlB5cmFtaWRDb2xTdGFja2VkIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuUHlyYW1pZENvbFN0YWNrZWQxMDAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5TdXJmYWNlIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuU3VyZmFjZVRvcFZpZXcgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5TdXJmYWNlVG9wVmlld1dpcmVmcmFtZSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlN1cmZhY2VXaXJlZnJhbWU7Ci0gICAgICAgIH0KLSAgICAgICBpbnRlcm5hbCBwcm90ZWN0ZWQgYm9vbCBJc1R5cGUzRCgpCi0gICAgICAgewotICAgICAgICAgICAgcmV0dXJuIElzVHlwZTNEKENoYXJ0VHlwZSk7Ci0gICAgICAgfQotICAgICAgICBwcm90ZWN0ZWQgYm9vbCBJc1R5cGVMaW5lKCkKLSAgICAgICB7Ci0gICAgICAgICAgIHJldHVybiBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5MaW5lIHx8Ci0gICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuTGluZU1hcmtlcnMgfHwKLSAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5MaW5lTWFya2Vyc1N0YWNrZWQxMDAgfHwKLSAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5MaW5lU3RhY2tlZCB8fAotICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkxpbmVTdGFja2VkMTAwIHx8Ci0gICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuTGluZTNEOwotICAgICAgIH0KLSAgICAgICBwcm90ZWN0ZWQgYm9vbCBJc1R5cGVTY2F0dGVyQnViYmxlKCkKLSAgICAgICB7Ci0gICAgICAgICAgIHJldHVybiBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXIgfHwKLSAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXJMaW5lcyB8fAotICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlckxpbmVzTm9NYXJrZXJzIHx8Ci0gICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuWFlTY2F0dGVyU21vb3RoIHx8Ci0gICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuWFlTY2F0dGVyU21vb3RoTm9NYXJrZXJzIHx8Ci0gICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQnViYmxlIHx8Ci0gICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQnViYmxlM0RFZmZlY3Q7Ci0gICAgICAgfQotICAgICAgICBwcm90ZWN0ZWQgYm9vbCBJc1R5cGVTdXJmYWNlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlN1cmZhY2UgfHwKLSAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5TdXJmYWNlVG9wVmlldyB8fAotICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlN1cmZhY2VUb3BWaWV3V2lyZWZyYW1lIHx8Ci0gICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuU3VyZmFjZVdpcmVmcmFtZTsKLSAgICAgICAgfQotICAgICAgIHByb3RlY3RlZCBib29sIElzVHlwZVNoYXBlKCkKLSAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQmFyQ2x1c3RlcmVkM0QgfHwKLSAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQmFyU3RhY2tlZDNEIHx8Ci0gICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkJhclN0YWNrZWQxMDAzRCB8fAotICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5CYXJDbHVzdGVyZWQzRCB8fAotICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5CYXJTdGFja2VkM0QgfHwKLSAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQmFyU3RhY2tlZDEwMDNEIHx8Ci0gICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkNvbHVtbjNEIHx8Ci0gICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkNvbHVtbkNsdXN0ZXJlZDNEIHx8Ci0gICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQzRCB8fAotICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5Db2x1bW5TdGFja2VkMTAwM0QgfHwKLSAgICAgICAgICAgICAgICAvL0NoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLjNEUGllIHx8Ci0gICAgICAgICAgICAgICAgLy9DaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS4zRFBpZUV4cGxvZGVkIHx8Ci0gICAgICAgICAgICAgICAgICAgIC8vQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQnViYmxlM0RFZmZlY3QgfHwKLSAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ29uZUJhckNsdXN0ZXJlZCB8fAotICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5Db25lQmFyU3RhY2tlZCB8fAotICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5Db25lQmFyU3RhY2tlZDEwMCB8fAotICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5Db25lQ29sIHx8Ci0gICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkNvbmVDb2xDbHVzdGVyZWQgfHwKLSAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ29uZUNvbFN0YWNrZWQgfHwKLSAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ29uZUNvbFN0YWNrZWQxMDAgfHwKLSAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ3lsaW5kZXJCYXJDbHVzdGVyZWQgfHwKLSAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ3lsaW5kZXJCYXJTdGFja2VkIHx8Ci0gICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkN5bGluZGVyQmFyU3RhY2tlZDEwMCB8fAotICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckNvbCB8fAotICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckNvbENsdXN0ZXJlZCB8fAotICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckNvbFN0YWNrZWQgfHwKLSAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ3lsaW5kZXJDb2xTdGFja2VkMTAwIHx8Ci0gICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlB5cmFtaWRCYXJDbHVzdGVyZWQgfHwKLSAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuUHlyYW1pZEJhclN0YWNrZWQgfHwKLSAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuUHlyYW1pZEJhclN0YWNrZWQxMDAgfHwKLSAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuUHlyYW1pZENvbCB8fAotICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5QeXJhbWlkQ29sQ2x1c3RlcmVkIHx8Ci0gICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlB5cmFtaWRDb2xTdGFja2VkIHx8Ci0gICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlB5cmFtaWRDb2xTdGFja2VkMTAwOyAvL3x8Ci0gICAgICAgICAgICAgICAgICAgIC8vQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuRG91Z2hudXQgfHwKLSAgICAgICAgICAgICAgICAgICAgLy9DaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5Eb3VnaG51dEV4cGxvZGVkOwotICAgICAgICB9Ci0gICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBib29sIElzVHlwZVBlcmNlbnRTdGFja2VkKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkFyZWFTdGFja2VkMTAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5CYXJTdGFja2VkMTAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5CYXJTdGFja2VkMTAwM0QgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQxMDAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQxMDAzRCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ29uZUJhclN0YWNrZWQxMDAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkNvbmVDb2xTdGFja2VkMTAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckJhclN0YWNrZWQxMDAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkN5bGluZGVyQ29sU3RhY2tlZCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuTGluZU1hcmtlcnNTdGFja2VkMTAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5MaW5lU3RhY2tlZDEwMCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuUHlyYW1pZEJhclN0YWNrZWQxMDAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlB5cmFtaWRDb2xTdGFja2VkMTAwOwotICAgICAgICB9Ci0gICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBib29sIElzVHlwZVN0YWNrZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQXJlYVN0YWNrZWQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkFyZWFTdGFja2VkM0QgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkJhclN0YWNrZWQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkJhclN0YWNrZWQzRCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ29sdW1uU3RhY2tlZDNEIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5Db2x1bW5TdGFja2VkIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5Db25lQmFyU3RhY2tlZCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ29uZUNvbFN0YWNrZWQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkN5bGluZGVyQmFyU3RhY2tlZCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQ3lsaW5kZXJDb2xTdGFja2VkIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5MaW5lTWFya2Vyc1N0YWNrZWQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkxpbmVTdGFja2VkIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5QeXJhbWlkQmFyU3RhY2tlZCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuUHlyYW1pZENvbFN0YWNrZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvdGVjdGVkIGJvb2wgSXNUeXBlQ2x1c3RlcmVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkJhckNsdXN0ZXJlZCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQmFyQ2x1c3RlcmVkM0QgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkNvbHVtbkNsdXN0ZXJlZDNEIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5Db2x1bW5DbHVzdGVyZWQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkNvbmVCYXJDbHVzdGVyZWQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkNvbmVDb2xDbHVzdGVyZWQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkN5bGluZGVyQmFyQ2x1c3RlcmVkIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5DeWxpbmRlckNvbENsdXN0ZXJlZCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuUHlyYW1pZEJhckNsdXN0ZXJlZCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuUHlyYW1pZENvbENsdXN0ZXJlZDsKLSAgICAgICAgfQotICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgYm9vbCBJc1R5cGVQaWVEb3VnaG51dCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5QaWUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlBpZUV4cGxvZGVkIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5QaWVPZlBpZSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuUGllM0QgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlBpZUV4cGxvZGVkM0QgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkJhck9mUGllIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5Eb3VnaG51dCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuRG91Z2hudXRFeHBsb2RlZDsKLSAgICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uCi0gICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgIC8vLyBHZXQgdGhlIG5hbWUgb2YgdGhlIGNoYXJ0IG5vZGUKLSAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgIC8vLyA8cmV0dXJucz5UaGUgbmFtZTwvcmV0dXJucz4KLSAgICAgICAgcHJvdGVjdGVkIHN0cmluZyBHZXRDaGFydE5vZGVUZXh0KCkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoIChDaGFydFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkFyZWEzRDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQXJlYVN0YWNrZWQzRDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQXJlYVN0YWNrZWQxMDAzRDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjOmFyZWEzRENoYXJ0IjsKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQXJlYToKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQXJlYVN0YWNrZWQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkFyZWFTdGFja2VkMTAwOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gImM6YXJlYUNoYXJ0IjsKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQmFyQ2x1c3RlcmVkOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5CYXJTdGFja2VkOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5CYXJTdGFja2VkMTAwOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5Db2x1bW5DbHVzdGVyZWQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQxMDA6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiYzpiYXJDaGFydCI7Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkJhckNsdXN0ZXJlZDNEOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5CYXJTdGFja2VkM0Q6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkJhclN0YWNrZWQxMDAzRDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ29sdW1uQ2x1c3RlcmVkM0Q6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQzRDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ29sdW1uU3RhY2tlZDEwMDNEOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5Db25lQmFyQ2x1c3RlcmVkOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5Db25lQmFyU3RhY2tlZDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ29uZUJhclN0YWNrZWQxMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbmVDb2w6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbmVDb2xDbHVzdGVyZWQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbmVDb2xTdGFja2VkOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5Db25lQ29sU3RhY2tlZDEwMDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ3lsaW5kZXJCYXJDbHVzdGVyZWQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkN5bGluZGVyQmFyU3RhY2tlZDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ3lsaW5kZXJCYXJTdGFja2VkMTAwOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5DeWxpbmRlckNvbDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ3lsaW5kZXJDb2xDbHVzdGVyZWQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkN5bGluZGVyQ29sU3RhY2tlZDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ3lsaW5kZXJDb2xTdGFja2VkMTAwOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5QeXJhbWlkQmFyQ2x1c3RlcmVkOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5QeXJhbWlkQmFyU3RhY2tlZDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuUHlyYW1pZEJhclN0YWNrZWQxMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlB5cmFtaWRDb2w6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlB5cmFtaWRDb2xDbHVzdGVyZWQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlB5cmFtaWRDb2xTdGFja2VkOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5QeXJhbWlkQ29sU3RhY2tlZDEwMDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjOmJhcjNEQ2hhcnQiOwotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5CdWJibGU6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkJ1YmJsZTNERWZmZWN0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gImM6YnViYmxlQ2hhcnQiOwotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5Eb3VnaG51dDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuRG91Z2hudXRFeHBsb2RlZDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjOmRvdWdobnV0Q2hhcnQiOwotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5MaW5lOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5MaW5lTWFya2VyczoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuTGluZU1hcmtlcnNTdGFja2VkOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5MaW5lTWFya2Vyc1N0YWNrZWQxMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkxpbmVTdGFja2VkOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5MaW5lU3RhY2tlZDEwMDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjOmxpbmVDaGFydCI7Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkxpbmUzRDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjOmxpbmUzRENoYXJ0IjsKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuUGllOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5QaWVFeHBsb2RlZDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjOnBpZUNoYXJ0IjsKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQmFyT2ZQaWU6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlBpZU9mUGllOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gImM6b2ZQaWVDaGFydCI7Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlBpZTNEOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5QaWVFeHBsb2RlZDNEOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gImM6cGllM0RDaGFydCI7Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlJhZGFyOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5SYWRhckZpbGxlZDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuUmFkYXJNYXJrZXJzOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gImM6cmFkYXJDaGFydCI7Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlhZU2NhdHRlcjoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuWFlTY2F0dGVyTGluZXM6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlhZU2NhdHRlckxpbmVzTm9NYXJrZXJzOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5YWVNjYXR0ZXJTbW9vdGg6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlhZU2NhdHRlclNtb290aE5vTWFya2VyczoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjOnNjYXR0ZXJDaGFydCI7Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlN1cmZhY2U6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlN1cmZhY2VXaXJlZnJhbWU6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiYzpzdXJmYWNlM0RDaGFydCI7Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlN1cmZhY2VUb3BWaWV3OgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5TdXJmYWNlVG9wVmlld1dpcmVmcmFtZToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjOnN1cmZhY2VDaGFydCI7Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlN0b2NrSExDOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gImM6c3RvY2tDaGFydCI7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cobmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJDaGFydCB0eXBlIG5vdCBpbXBsZW1lbnRlZCIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBZGQgYSBzZWNvbmRhcnkgYXhpcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBpbnRlcm5hbCB2b2lkIEFkZEF4aXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxFbGVtZW50IGNhdEF4ID0gQ2hhcnRYbWwuQ3JlYXRlRWxlbWVudChzdHJpbmcuRm9ybWF0KCJjOnswfSIsQWRkQXhUeXBlKCkpLCBFeGNlbFBhY2thZ2Uuc2NoZW1hQ2hhcnQpOwotICAgICAgICAgICAgaW50IGF4SUQ7Ci0gICAgICAgICAgICBpZiAoX2F4aXMuTGVuZ3RoID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3Bsb3RBcmVhLlRvcE5vZGUuQXBwZW5kQ2hpbGQoY2F0QXgpOwotICAgICAgICAgICAgICAgIGF4SUQgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9heGlzWzBdLlRvcE5vZGUuUGFyZW50Tm9kZS5JbnNlcnRBZnRlcihjYXRBeCwgX2F4aXNbX2F4aXMuTGVuZ3RoLTFdLlRvcE5vZGUpOwotICAgICAgICAgICAgICAgIGF4SUQgPSBpbnQuUGFyc2UoX2F4aXNbMF0uSWQpIDwgaW50LlBhcnNlKF9heGlzWzFdLklkKSA/IGludC5QYXJzZShfYXhpc1sxXS5JZCkgKyAxIDogaW50LlBhcnNlKF9heGlzWzBdLklkKSArIDE7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgWG1sRWxlbWVudCB2YWxBeCA9IENoYXJ0WG1sLkNyZWF0ZUVsZW1lbnQoImM6dmFsQXgiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hQ2hhcnQpOwotICAgICAgICAgICAgY2F0QXguUGFyZW50Tm9kZS5JbnNlcnRBZnRlcih2YWxBeCwgY2F0QXgpOwotCi0gICAgICAgICAgICBpZiAoX2F4aXMuTGVuZ3RoID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2F0QXguSW5uZXJYbWwgPSBzdHJpbmcuRm9ybWF0KCI8YzpheElkIHZhbD1cInswfVwiLz48YzpzY2FsaW5nPjxjOm9yaWVudGF0aW9uIHZhbD1cIm1pbk1heFwiLz48L2M6c2NhbGluZz48YzpkZWxldGUgdmFsPVwiMFwiIC8+PGM6YXhQb3MgdmFsPVwiYlwiLz48Yzp0aWNrTGJsUG9zIHZhbD1cIm5leHRUb1wiLz48Yzpjcm9zc0F4IHZhbD1cInsxfVwiLz48Yzpjcm9zc2VzIHZhbD1cImF1dG9aZXJvXCIvPjxjOmF1dG8gdmFsPVwiMVwiLz48YzpsYmxBbGduIHZhbD1cImN0clwiLz48YzpsYmxPZmZzZXQgdmFsPVwiMTAwXCIvPiIsIGF4SUQsIGF4SUQgKyAxKTsKLSAgICAgICAgICAgICAgICB2YWxBeC5Jbm5lclhtbCA9IHN0cmluZy5Gb3JtYXQoIjxjOmF4SWQgdmFsPVwiezF9XCIvPjxjOnNjYWxpbmc+PGM6b3JpZW50YXRpb24gdmFsPVwibWluTWF4XCIvPjwvYzpzY2FsaW5nPjxjOmRlbGV0ZSB2YWw9XCIwXCIgLz48YzpheFBvcyB2YWw9XCJsXCIvPjxjOm1ham9yR3JpZGxpbmVzLz48Yzp0aWNrTGJsUG9zIHZhbD1cIm5leHRUb1wiLz48Yzpjcm9zc0F4IHZhbD1cInswfVwiLz48Yzpjcm9zc2VzIHZhbD1cImF1dG9aZXJvXCIvPjxjOmNyb3NzQmV0d2VlbiB2YWw9XCJiZXR3ZWVuXCIvPiIsIGF4SUQsIGF4SUQgKyAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXRBeC5Jbm5lclhtbCA9IHN0cmluZy5Gb3JtYXQoIjxjOmF4SWQgdmFsPVwiezB9XCIvPjxjOnNjYWxpbmc+PGM6b3JpZW50YXRpb24gdmFsPVwibWluTWF4XCIvPjwvYzpzY2FsaW5nPjxjOmRlbGV0ZSB2YWw9XCIxXCIgLz48YzpheFBvcyB2YWw9XCJiXCIvPjxjOnRpY2tMYmxQb3MgdmFsPVwibm9uZVwiLz48Yzpjcm9zc0F4IHZhbD1cInsxfVwiLz48Yzpjcm9zc2VzIHZhbD1cImF1dG9aZXJvXCIvPiIsIGF4SUQsIGF4SUQgKyAxKTsKLSAgICAgICAgICAgICAgICB2YWxBeC5Jbm5lclhtbCA9IHN0cmluZy5Gb3JtYXQoIjxjOmF4SWQgdmFsPVwiezB9XCIvPjxjOnNjYWxpbmc+PGM6b3JpZW50YXRpb24gdmFsPVwibWluTWF4XCIvPjwvYzpzY2FsaW5nPjxjOmRlbGV0ZSB2YWw9XCIwXCIgLz48YzpheFBvcyB2YWw9XCJyXCIvPjxjOnRpY2tMYmxQb3MgdmFsPVwibmV4dFRvXCIvPjxjOmNyb3NzQXggdmFsPVwiezF9XCIvPjxjOmNyb3NzZXMgdmFsPVwibWF4XCIvPjxjOmNyb3NzQmV0d2VlbiB2YWw9XCJiZXR3ZWVuXCIvPiIsIGF4SUQgKyAxLCBheElEKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKF9heGlzLkxlbmd0aCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9heGlzID0gbmV3IEV4Y2VsQ2hhcnRBeGlzWzJdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEV4Y2VsQ2hhcnRBeGlzW10gbmV3QXhpcyA9IG5ldyBFeGNlbENoYXJ0QXhpc1tfYXhpcy5MZW5ndGggKyAyXTsKLSAgICAgICAgICAgICAgICBBcnJheS5Db3B5KF9heGlzLCBuZXdBeGlzLCBfYXhpcy5MZW5ndGgpOwotICAgICAgICAgICAgICAgIF9heGlzID0gbmV3QXhpczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgX2F4aXNbX2F4aXMuTGVuZ3RoIC0gMl0gPSBuZXcgRXhjZWxDaGFydEF4aXMoTmFtZVNwYWNlTWFuYWdlciwgY2F0QXgpOwotICAgICAgICAgICAgX2F4aXNbX2F4aXMuTGVuZ3RoIC0gMV0gPSBuZXcgRXhjZWxDaGFydEF4aXMoTmFtZVNwYWNlTWFuYWdlciwgdmFsQXgpOwotICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNoYXJ0IGluIF9wbG90QXJlYS5DaGFydFR5cGVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoYXJ0Ll9heGlzID0gX2F4aXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgdm9pZCBSZW1vdmVTZWNvbmRhcnlBeGlzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgKG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiTm90IHlldCBpbXBsZW1lbnRlZCIpKTsKLSAgICAgICAgfQotICAgICAgICAjcmVnaW9uICJQcm9wZXJ0aWVzIgotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZWZlcmVuY2UgdG8gdGhlIHdvcmtzaGVldAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxXb3Jrc2hlZXQgV29ya1NoZWV0IHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGNoYXJ0IHhtbCBkb2N1bWVudAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgWG1sRG9jdW1lbnQgQ2hhcnRYbWwgeyBnZXQ7IGludGVybmFsIHNldDsgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUeXBlIG9mIGNoYXJ0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBlQ2hhcnRUeXBlIENoYXJ0VHlwZSB7IGdldDsgaW50ZXJuYWwgc2V0OyB9Ci0gICAgICAgIGludGVybmFsIHByb3RlY3RlZCBYbWxOb2RlIF9jaGFydE5vZGUgPSBudWxsOwotICAgICAgICBpbnRlcm5hbCBYbWxOb2RlIENoYXJ0Tm9kZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2NoYXJ0Tm9kZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaXRlbCBvZiB0aGUgY2hhcnQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsQ2hhcnRUaXRsZSBUaXRsZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX3RpdGxlID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfdGl0bGUgPSBuZXcgRXhjZWxDaGFydFRpdGxlKE5hbWVTcGFjZU1hbmFnZXIsIENoYXJ0WG1sLlNlbGVjdFNpbmdsZU5vZGUoImM6Y2hhcnRTcGFjZS9jOmNoYXJ0IiwgTmFtZVNwYWNlTWFuYWdlcikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX3RpdGxlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENoYXJ0IHNlcmllcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgdmlydHVhbCBFeGNlbENoYXJ0U2VyaWVzIFNlcmllcwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2NoYXJ0U2VyaWVzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFuIGFycmF5IGNvbnRhaW5nIGFsbCBheGlzIG9mIGFsbCBDaGFydHR5cGVzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbENoYXJ0QXhpc1tdIEF4aXMKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9heGlzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBYQXhpcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxDaGFydEF4aXMgWEF4aXMKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgcHJpdmF0ZSBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIFlBeGlzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbENoYXJ0QXhpcyBZQXhpcwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBwcml2YXRlIHNldDsKLSAgICAgICAgfQotICAgICAgICBib29sIF9zZWNvbmRhcnlBeGlzPWZhbHNlOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJZiB0cnVlIHRoZSBjaGFydHR5cGUgd2lsbCB1c2UgdGhlIHNlY29uZGFyeSBheGlzLgotICAgICAgICAvLy8gVGhlIGNoYXJ0IG11c3QgY29udGFpbiBhIGxlYXN0IG9uZSBvdGhlciBjaGFydHR5cGUgdGhhdCB1c2VzIHRoZSBwcmltYXJ5IGF4aXMuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIFVzZVNlY29uZGFyeUF4aXMKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9zZWNvbmRhcnlBeGlzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgIGlmIChfc2Vjb25kYXJ5QXhpcyAhPSB2YWx1ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElzVHlwZVBpZURvdWdobnV0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oIlBpZSBjaGFydHMgZG8gbm90IHN1cHBvcnQgYXhpcyIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEhhc1ByaW1hcnlBeGlzKCkgPT0gZmFsc2UpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oIkNhbid0IHNldCB0byBzZWNvbmRhcnkgYXhpcyB3aGVuIG5vIHNlcmllIHVzZXMgdGhlIHByaW1hcnkgYXhpcyIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBeGlzLkxlbmd0aCA9PSAyKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZEF4aXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBubCA9IENoYXJ0Tm9kZS5TZWxlY3ROb2RlcygiYzpheElkIiwgTmFtZVNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBubFswXS5BdHRyaWJ1dGVzWyJ2YWwiXS5WYWx1ZSA9IEF4aXNbMl0uSWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBubFsxXS5BdHRyaWJ1dGVzWyJ2YWwiXS5WYWx1ZSA9IEF4aXNbM10uSWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYQXhpcyA9IEF4aXNbMl07Ci0gICAgICAgICAgICAgICAgICAgICAgICBZQXhpcyA9IEF4aXNbM107Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmwgPSBDaGFydE5vZGUuU2VsZWN0Tm9kZXMoImM6YXhJZCIsIE5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmxbMF0uQXR0cmlidXRlc1sidmFsIl0uVmFsdWUgPSBBeGlzWzBdLklkOwotICAgICAgICAgICAgICAgICAgICAgICAgbmxbMV0uQXR0cmlidXRlc1sidmFsIl0uVmFsdWUgPSBBeGlzWzFdLklkOwotICAgICAgICAgICAgICAgICAgICAgICAgWEF4aXMgPSBBeGlzWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgWUF4aXMgPSBBeGlzWzFdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIF9zZWNvbmRhcnlBeGlzID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBidWlsZC1pbiBjaGFydCBzdHlsZXMuIAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZUNoYXJ0U3R5bGUgU3R5bGUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWG1sTm9kZSBub2RlID0gQ2hhcnRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiYzpjaGFydFNwYWNlL2M6c3R5bGUvQHZhbCIsIE5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgICAgIGlmIChub2RlID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0U3R5bGUuTm9uZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHY7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbnQuVHJ5UGFyc2Uobm9kZS5WYWx1ZSwgb3V0IHYpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVDaGFydFN0eWxlKXY7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0U3R5bGUuTm9uZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IGVDaGFydFN0eWxlLk5vbmUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBYbWxFbGVtZW50IGVsZW1lbnQgPSBDaGFydFhtbC5TZWxlY3RTaW5nbGVOb2RlKCJjOmNoYXJ0U3BhY2UvYzpzdHlsZSIsIE5hbWVTcGFjZU1hbmFnZXIpIGFzIFhtbEVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChlbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBYbWxFbGVtZW50IGVsZW1lbnQgPSBDaGFydFhtbC5DcmVhdGVFbGVtZW50KCJjOnN0eWxlIiwgRXhjZWxQYWNrYWdlLnNjaGVtYUNoYXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5TZXRBdHRyaWJ1dGUoInZhbCIsICgoaW50KXZhbHVlKS5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgWG1sRWxlbWVudCBwYXJlbnQgPSBDaGFydFhtbC5TZWxlY3RTaW5nbGVOb2RlKCJjOmNoYXJ0U3BhY2UiLCBOYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OwotICAgICAgICAgICAgICAgICAgICBwYXJlbnQuSW5zZXJ0QmVmb3JlKGVsZW1lbnQsIHBhcmVudC5TZWxlY3RTaW5nbGVOb2RlKCJjOmNoYXJ0IiwgTmFtZVNwYWNlTWFuYWdlcikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgX3Bsb3RWaXNpYmxlT25seVBhdGg9Ii4uLy4uL2M6cGxvdFZpc09ubHkvQHZhbCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNob3cgZGF0YSBpbiBoaWRkZW4gcm93cyBhbmQgY29sdW1ucwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBTaG93SGlkZGVuRGF0YQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyEhSW52ZXJ0ZWQgdmFsdWUhIQotICAgICAgICAgICAgICAgIHJldHVybiAhX2NoYXJ0WG1sSGVscGVyLkdldFhtbE5vZGVCb29sKF9wbG90VmlzaWJsZU9ubHlQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vISFJbnZlcnRlZCB2YWx1ZSEhCi0gICAgICAgICAgICAgICAgX2NoYXJ0WG1sSGVscGVyLlNldFhtbE5vZGVCb29sKF9wbG90VmlzaWJsZU9ubHlQYXRoLCAhdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBfZGlzcGxheUJsYW5rc0FzUGF0aCA9ICIuLi8uLi9jOmRpc3BCbGFua3NBcy9AdmFsIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU3BlY2lmaWVzIHRoZSBwb3NzaWJsZSB3YXlzIHRvIGRpc3BsYXkgYmxhbmtzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBlRGlzcGxheUJsYW5rc0FzIERpc3BsYXlCbGFua3NBcwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcgdj1fY2hhcnRYbWxIZWxwZXIuR2V0WG1sTm9kZVN0cmluZyhfZGlzcGxheUJsYW5rc0FzUGF0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHYpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVEaXNwbGF5QmxhbmtzQXMuWmVybzsgLy9Jc3N1ZSAxNDcxNSBDaGFuZ2VkIGluIE9mZmljZSAyMDEwLT8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlRGlzcGxheUJsYW5rc0FzKUVudW0uUGFyc2UodHlwZW9mKGVEaXNwbGF5QmxhbmtzQXMpLCB2LCB0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY2hhcnRTZXJpZXMuU2V0WG1sTm9kZVN0cmluZyhfZGlzcGxheUJsYW5rc0FzUGF0aCwgdmFsdWUuVG9TdHJpbmcoKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgX3Nob3dETGJsc092ZXJNYXggPSAiLi4vLi4vYzpzaG93RExibHNPdmVyTWF4L0B2YWwiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTcGVjaWZpZXMgZGF0YSBsYWJlbHMgb3ZlciB0aGUgbWF4aW11bSBvZiB0aGUgY2hhcnQgc2hhbGwgYmUgc2hvd24KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgU2hvd0RhdGFMYWJlbHNPdmVyTWF4aW11bQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2NoYXJ0WG1sSGVscGVyLkdldFhtbE5vZGVCb29sKF9zaG93RExibHNPdmVyTWF4LCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jaGFydFhtbEhlbHBlci5TZXRYbWxOb2RlQm9vbChfc2hvd0RMYmxzT3Zlck1heCx2YWx1ZSwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBib29sIEhhc1ByaW1hcnlBeGlzKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9wbG90QXJlYS5DaGFydFR5cGVzLkNvdW50ID09IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNoYXJ0IGluIF9wbG90QXJlYS5DaGFydFR5cGVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChjaGFydCAhPSB0aGlzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXJ0LlVzZVNlY29uZGFyeUF4aXMgPT0gZmFsc2UgJiYgY2hhcnQuSXNUeXBlUGllRG91Z2hudXQoKT09ZmFsc2UpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIC8vLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8vLyBTZXRzIHBvc2l0aW9uIG9mIHRoZSBheGlzIG9mIGEgY2hhcnQtc2VyaWUKLSAgICAgICAgLy8vLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8vLyA8cGFyYW0gbmFtZT0iWEF4aXMiPkxlZnQgb3IgUmlnaHQ8L3BhcmFtPgotICAgICAgICAvLy8vLyA8cGFyYW0gbmFtZT0iWUF4aXMiPlRvcCBvciBCb3R0b208L3BhcmFtPgotICAgICAgICAvL2ludGVybmFsIHZvaWQgU2V0QXhpcyhlWEF4aXNQb3NpdGlvbiBYQXhpcywgZVlBeGlzUG9zaXRpb24gWUF4aXMpCi0gICAgICAgIC8vewotICAgICAgICAvLyAgICBib29sIHhBeGlzRXhpc3RzID0gZmFsc2UsIHlBeGlzRXhpc3RzID0gZmFsc2U7Ci0gICAgICAgIC8vICAgIGZvcmVhY2ggKHZhciBheGlzIGluIF9heGlzKQotICAgICAgICAvLyAgICB7Ci0gICAgICAgIC8vICAgICAgICBpZiAoYXhpcy5BeGlzUG9zaXRpb24gPT0gKGVBeGlzUG9zaXRpb24pWEF4aXMpCi0gICAgICAgIC8vICAgICAgICB7Ci0gICAgICAgIC8vICAgICAgICAgICAgLy9Gb3VuZAotICAgICAgICAvLyAgICAgICAgICAgIHhBeGlzRXhpc3RzPXRydWU7Ci0gICAgICAgIC8vICAgICAgICAgICAgaWYgKGF4aXMgIT0gdGhpcy5YQXhpcykKLSAgICAgICAgLy8gICAgICAgICAgICB7Ci0gICAgICAgIC8vICAgICAgICAgICAgICAgIENoZWNrUmVtb3ZlQXhpcyh0aGlzLlhBeGlzKTsKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgdGhpcy5YQXhpcyA9IGF4aXM7Ci0gICAgICAgIC8vICAgICAgICAgICAgfQotICAgICAgICAvLyAgICAgICAgfQotICAgICAgICAvLyAgICAgICAgZWxzZSBpZiAoYXhpcy5BeGlzUG9zaXRpb24gPT0gKGVBeGlzUG9zaXRpb24pWUF4aXMpCi0gICAgICAgIC8vICAgICAgICB7Ci0gICAgICAgIC8vICAgICAgICAgICAgeUF4aXNFeGlzdHMgPSB0cnVlOwotICAgICAgICAvLyAgICAgICAgICAgIGlmIChheGlzICE9IHRoaXMuWUF4aXMpCi0gICAgICAgIC8vICAgICAgICAgICAgewotICAgICAgICAvLyAgICAgICAgICAgICAgICBDaGVja1JlbW92ZUF4aXModGhpcy5ZQXhpcyk7Ci0gICAgICAgIC8vICAgICAgICAgICAgICAgIHRoaXMuWUF4aXMgPSBheGlzOwotICAgICAgICAvLyAgICAgICAgICAgIH0KLSAgICAgICAgLy8gICAgICAgIH0KLSAgICAgICAgLy8gICAgfQotCi0gICAgICAgIC8vICAgIGlmICgheEF4aXNFeGlzdHMpCi0gICAgICAgIC8vICAgIHsKLSAgICAgICAgLy8gICAgICAgIGlmIChFeGlzdHNBeGlzKHRoaXMuWEF4aXMpKQotICAgICAgICAvLyAgICAgICAgewotICAgICAgICAvLyAgICAgICAgICAgIEFkZEF4aXMoKGVBeGlzUG9zaXRpb24pWEF4aXMpOwotICAgICAgICAvLyAgICAgICAgICAgIHRoaXMuWEF4aXMgPSBBeGlzW0F4aXMuTGVuZ3RoIC0gMV07Ci0gICAgICAgIC8vICAgICAgICB9Ci0gICAgICAgIC8vICAgICAgICBlbHNlCi0gICAgICAgIC8vICAgICAgICB7Ci0gICAgICAgIC8vICAgICAgICAgICAgdGhpcy5YQXhpcy5BeGlzUG9zaXRpb24gPSAoZUF4aXNQb3NpdGlvbilYQXhpczsKLSAgICAgICAgLy8gICAgICAgIH0KLSAgICAgICAgLy8gICAgfQotICAgICAgICAvLyAgICBpZiAoIXlBeGlzRXhpc3RzKQotICAgICAgICAvLyAgICB7Ci0gICAgICAgIC8vICAgICAgICBpZiAoRXhpc3RzQXhpcyh0aGlzLlhBeGlzKSkKLSAgICAgICAgLy8gICAgICAgIHsKLSAgICAgICAgLy8gICAgICAgICAgICBBZGRBeGlzKChlQXhpc1Bvc2l0aW9uKVlBeGlzKTsKLSAgICAgICAgLy8gICAgICAgICAgICB0aGlzLllBeGlzID0gQXhpc1tBeGlzLkxlbmd0aCAtIDFdOwotICAgICAgICAvLyAgICAgICAgfQotICAgICAgICAvLyAgICAgICAgZWxzZQotICAgICAgICAvLyAgICAgICAgewotICAgICAgICAvLyAgICAgICAgICAgIHRoaXMuWUF4aXMuQXhpc1Bvc2l0aW9uID0gKGVBeGlzUG9zaXRpb24pWUF4aXM7Ci0gICAgICAgIC8vICAgICAgICB9Ci0gICAgICAgIC8vICAgIH0KLSAgICAgICAgLy99Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmVtb3ZlIGFsbCBheGlzIHRoYXQgYXJlIG5vdCB1c2VkIGFueSBtb3JlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZXhjZWxDaGFydEF4aXMiPjwvcGFyYW0+Ci0gICAgICAgIHByaXZhdGUgdm9pZCBDaGVja1JlbW92ZUF4aXMoRXhjZWxDaGFydEF4aXMgZXhjZWxDaGFydEF4aXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChFeGlzdHNBeGlzKGV4Y2VsQ2hhcnRBeGlzKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL1JlbW92ZSB0aGUgYXhpcwotICAgICAgICAgICAgICAgIEV4Y2VsQ2hhcnRBeGlzW10gbmV3QXhpcyA9IG5ldyBFeGNlbENoYXJ0QXhpc1tBeGlzLkxlbmd0aCAtIDFdOwotICAgICAgICAgICAgICAgIGludCBwb3MgPSAwOwotICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBheCBpbiBBeGlzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF4ICE9IGV4Y2VsQ2hhcnRBeGlzKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdBeGlzW3Bvc10gPSBheDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vVXBkYXRlIGFsbCBjaGFydHR5cGVzLgotICAgICAgICAgICAgICAgIGZvcmVhY2ggKEV4Y2VsQ2hhcnQgY2hhcnRUeXBlIGluIF9wbG90QXJlYS5DaGFydFR5cGVzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhcnRUeXBlLl9heGlzID0gbmV3QXhpczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2wgRXhpc3RzQXhpcyhFeGNlbENoYXJ0QXhpcyBleGNlbENoYXJ0QXhpcykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yZWFjaCAoRXhjZWxDaGFydCBjaGFydFR5cGUgaW4gX3Bsb3RBcmVhLkNoYXJ0VHlwZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoYXJ0VHlwZSAhPSB0aGlzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXJ0VHlwZS5YQXhpcy5BeGlzUG9zaXRpb24gPT0gZXhjZWxDaGFydEF4aXMuQXhpc1Bvc2l0aW9uIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0VHlwZS5ZQXhpcy5BeGlzUG9zaXRpb24gPT0gZXhjZWxDaGFydEF4aXMuQXhpc1Bvc2l0aW9uKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL1RoZSBheGlzIGV4aXN0cwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgRXhjZWxDaGFydFBsb3RBcmVhIF9wbG90QXJlYSA9IG51bGw7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFBsb3RhcmVhCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbENoYXJ0UGxvdEFyZWEgUGxvdEFyZWEKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9wbG90QXJlYSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX3Bsb3RBcmVhID0gbmV3IEV4Y2VsQ2hhcnRQbG90QXJlYShOYW1lU3BhY2VNYW5hZ2VyLCBDaGFydFhtbC5TZWxlY3RTaW5nbGVOb2RlKCJjOmNoYXJ0U3BhY2UvYzpjaGFydC9jOnBsb3RBcmVhIiwgTmFtZVNwYWNlTWFuYWdlciksIHRoaXMpOyAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9wbG90QXJlYTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBFeGNlbENoYXJ0TGVnZW5kIF9sZWdlbmQgPSBudWxsOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBMZWdlbmQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsQ2hhcnRMZWdlbmQgTGVnZW5kCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfbGVnZW5kID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfbGVnZW5kID0gbmV3IEV4Y2VsQ2hhcnRMZWdlbmQoTmFtZVNwYWNlTWFuYWdlciwgQ2hhcnRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiYzpjaGFydFNwYWNlL2M6Y2hhcnQvYzpsZWdlbmQiLCBOYW1lU3BhY2VNYW5hZ2VyKSwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfbGVnZW5kOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgRXhjZWxEcmF3aW5nQm9yZGVyIF9ib3JkZXIgPSBudWxsOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBCb3JkZXIKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsRHJhd2luZ0JvcmRlciBCb3JkZXIKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9ib3JkZXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9ib3JkZXIgPSBuZXcgRXhjZWxEcmF3aW5nQm9yZGVyKE5hbWVTcGFjZU1hbmFnZXIsIENoYXJ0WG1sLlNlbGVjdFNpbmdsZU5vZGUoImM6Y2hhcnRTcGFjZSIsTmFtZVNwYWNlTWFuYWdlciksICJjOnNwUHIvYTpsbiIpOyAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9ib3JkZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRXhjZWxEcmF3aW5nRmlsbCBfZmlsbCA9IG51bGw7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZpbGwKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsRHJhd2luZ0ZpbGwgRmlsbAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX2ZpbGwgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9maWxsID0gbmV3IEV4Y2VsRHJhd2luZ0ZpbGwoTmFtZVNwYWNlTWFuYWdlciwgQ2hhcnRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiYzpjaGFydFNwYWNlIiwgTmFtZVNwYWNlTWFuYWdlciksICJjOnNwUHIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9maWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIDNELXNldHRpbmdzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFZpZXczRCBWaWV3M0QKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKElzVHlwZTNEKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsVmlldzNEKE5hbWVTcGFjZU1hbmFnZXIsIENoYXJ0WG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vYzp2aWV3M0QiLCBOYW1lU3BhY2VNYW5hZ2VyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKCJDaGFydHR5cGUgZG9lcyBub3Qgc3VwcG9ydCAzRCIpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL3N0cmluZyBfZ3JvdXBpbmdQYXRoID0gImM6Y2hhcnRTcGFjZS9jOmNoYXJ0L2M6cGxvdEFyZWEvezB9L2M6Z3JvdXBpbmcvQHZhbCI7Ci0gICAgICAgIHN0cmluZyBfZ3JvdXBpbmdQYXRoID0gImM6Z3JvdXBpbmcvQHZhbCI7Ci0gICAgICAgIHB1YmxpYyBlR3JvdXBpbmcgR3JvdXBpbmcKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldEdyb3VwaW5nRW51bShfY2hhcnRYbWxIZWxwZXIuR2V0WG1sTm9kZVN0cmluZyhfZ3JvdXBpbmdQYXRoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnRlcm5hbCBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY2hhcnRYbWxIZWxwZXIuU2V0WG1sTm9kZVN0cmluZyhfZ3JvdXBpbmdQYXRoLCBHZXRHcm91cGluZ1RleHQodmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL3N0cmluZyBfdmFyeUNvbG9yc1BhdGggPSAiYzpjaGFydFNwYWNlL2M6Y2hhcnQvYzpwbG90QXJlYS97MH0vYzp2YXJ5Q29sb3JzL0B2YWwiOwotICAgICAgICBzdHJpbmcgX3ZhcnlDb2xvcnNQYXRoID0gImM6dmFyeUNvbG9ycy9AdmFsIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSWYgdGhlIGNoYXJ0IGhhcyBvbmx5IG9uZSBzZXJpZSB0aGlzIHZhcmllcyB0aGUgY29sb3JzIGZvciBlYWNoIHBvaW50LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBWYXJ5Q29sb3JzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfY2hhcnRYbWxIZWxwZXIuR2V0WG1sTm9kZUJvb2woX3ZhcnlDb2xvcnNQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9jaGFydFhtbEhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKF92YXJ5Q29sb3JzUGF0aCwgIjEiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2NoYXJ0WG1sSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoX3ZhcnlDb2xvcnNQYXRoLCAiMCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBQYWNrYWdpbmcuWmlwUGFja2FnZVBhcnQgUGFydCB7IGdldDsgc2V0OyB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFBhY2thZ2UgaW50ZXJuYWwgVVJJCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIGludGVybmFsIFVyaSBVcmlDaGFydCB7IGdldDsgc2V0OyB9Ci0gICAgICAgIGludGVybmFsIG5ldyBzdHJpbmcgSWQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuICIiOyB9Ci0gICAgICAgIH0KLSAgICAgICAgRXhjZWxDaGFydFRpdGxlIF90aXRsZSA9IG51bGw7Ci0gICAgICAgICNlbmRyZWdpb24KLSAgICAgICAjcmVnaW9uICJHcm91cGluZyBFbnVtIFRyYW5zbGF0aW9uIgotICAgICAgICBwcml2YXRlIHN0cmluZyBHZXRHcm91cGluZ1RleHQoZUdyb3VwaW5nIGdyb3VwaW5nKQotICAgICAgIHsKLSAgICAgICAgICAgc3dpdGNoIChncm91cGluZykKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgY2FzZSBlR3JvdXBpbmcuQ2x1c3RlcmVkOgotICAgICAgICAgICAgICAgICAgIHJldHVybiAiY2x1c3RlcmVkIjsKLSAgICAgICAgICAgICAgIGNhc2UgZUdyb3VwaW5nLlN0YWNrZWQ6Ci0gICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdGFja2VkIjsKLSAgICAgICAgICAgICAgIGNhc2UgZUdyb3VwaW5nLlBlcmNlbnRTdGFja2VkOgotICAgICAgICAgICAgICAgICAgIHJldHVybiAicGVyY2VudFN0YWNrZWQiOwotICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICByZXR1cm4gInN0YW5kYXJkIjsKLQotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIHByaXZhdGUgZUdyb3VwaW5nIEdldEdyb3VwaW5nRW51bShzdHJpbmcgZ3JvdXBpbmcpCi0gICAgICAgewotICAgICAgICAgICBzd2l0Y2ggKGdyb3VwaW5nKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBjYXNlICJzdGFja2VkIjoKLSAgICAgICAgICAgICAgICAgICByZXR1cm4gZUdyb3VwaW5nLlN0YWNrZWQ7Ci0gICAgICAgICAgICAgICBjYXNlICJwZXJjZW50U3RhY2tlZCI6Ci0gICAgICAgICAgICAgICAgICAgcmV0dXJuIGVHcm91cGluZy5QZXJjZW50U3RhY2tlZDsKLSAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8vImNsdXN0ZXJlZCI6ICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgcmV0dXJuIGVHcm91cGluZy5DbHVzdGVyZWQ7Ci0gICAgICAgICAgIH0gICAgICAgICAKLSAgICAgICB9Ci0gICAgICAgI2VuZHJlZ2lvbgotICAgICAgIGludGVybmFsIHN0YXRpYyBFeGNlbENoYXJ0IEdldENoYXJ0KEV4Y2VsRHJhd2luZ3MgZHJhd2luZ3MsIFhtbE5vZGUgbm9kZS8qLCBYbWxOb2RlIGNoYXJ0VHlwZU5vZGUqLykKLSAgICAgICB7Ci0gICAgICAgICAgIFhtbE5vZGUgY2hhcnROb2RlID0gbm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJ4ZHI6Z3JhcGhpY0ZyYW1lL2E6Z3JhcGhpYy9hOmdyYXBoaWNEYXRhL2M6Y2hhcnQiLCBkcmF3aW5ncy5OYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgaWYgKGNoYXJ0Tm9kZSAhPSBudWxsKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICB2YXIgZHJhd2luZ1JlbGF0aW9uID0gZHJhd2luZ3MuUGFydC5HZXRSZWxhdGlvbnNoaXAoY2hhcnROb2RlLkF0dHJpYnV0ZXNbInI6aWQiXS5WYWx1ZSk7Ci0gICAgICAgICAgICAgICB2YXIgdXJpQ2hhcnQgPSBVcmlIZWxwZXIuUmVzb2x2ZVBhcnRVcmkoZHJhd2luZ3MuVXJpRHJhd2luZywgZHJhd2luZ1JlbGF0aW9uLlRhcmdldFVyaSk7Ci0KLSAgICAgICAgICAgICAgIHZhciBwYXJ0ID0gZHJhd2luZ3MuUGFydC5QYWNrYWdlLkdldFBhcnQodXJpQ2hhcnQpOwotICAgICAgICAgICAgICAgdmFyIGNoYXJ0WG1sID0gbmV3IFhtbERvY3VtZW50KCk7Ci0gICAgICAgICAgICAgICBMb2FkWG1sU2FmZShjaGFydFhtbCwgcGFydC5HZXRTdHJlYW0oKSk7IAotCi0gICAgICAgICAgICAgICBFeGNlbENoYXJ0IHRvcENoYXJ0ID0gbnVsbDsKLSAgICAgICAgICAgICAgIGZvcmVhY2ggKFhtbEVsZW1lbnQgbiBpbiBjaGFydFhtbC5TZWxlY3RTaW5nbGVOb2RlKHJvb3RQYXRoLCBkcmF3aW5ncy5OYW1lU3BhY2VNYW5hZ2VyKS5DaGlsZE5vZGVzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRvcENoYXJ0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvcENoYXJ0ID0gR2V0Q2hhcnQobiwgZHJhd2luZ3MsIG5vZGUsIHVyaUNoYXJ0LCBwYXJ0LCBjaGFydFhtbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZih0b3BDaGFydCE9bnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BDaGFydC5QbG90QXJlYS5DaGFydFR5cGVzLkFkZCh0b3BDaGFydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ViQ2hhcnQgPSBHZXRDaGFydChuLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCB0b3BDaGFydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViQ2hhcnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BDaGFydC5QbG90QXJlYS5DaGFydFR5cGVzLkFkZChzdWJDaGFydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRvcENoYXJ0OwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgIH0gICAgICAgICAgIAotICAgICAgIH0KLSAgICAgICBpbnRlcm5hbCBzdGF0aWMgRXhjZWxDaGFydCBHZXRDaGFydChYbWxFbGVtZW50IGNoYXJ0Tm9kZSwgRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlLCAgVXJpIHVyaUNoYXJ0LCBQYWNrYWdpbmcuWmlwUGFja2FnZVBhcnQgcGFydCwgWG1sRG9jdW1lbnQgY2hhcnRYbWwsIEV4Y2VsQ2hhcnQgdG9wQ2hhcnQpCi0gICAgICAgewotICAgICAgICAgICBzd2l0Y2ggKGNoYXJ0Tm9kZS5Mb2NhbE5hbWUpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGNhc2UgImFyZWEzRENoYXJ0IjoKLSAgICAgICAgICAgICAgIGNhc2UgImFyZWFDaGFydCI6Ci0gICAgICAgICAgICAgICBjYXNlICJzdG9ja0NoYXJ0IjoKLSAgICAgICAgICAgICAgICAgICBpZiAodG9wQ2hhcnQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDaGFydChkcmF3aW5ncywgbm9kZSwgdXJpQ2hhcnQsIHBhcnQsIGNoYXJ0WG1sLCBjaGFydE5vZGUpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ2hhcnQodG9wQ2hhcnQsIGNoYXJ0Tm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgY2FzZSAic3VyZmFjZTNEQ2hhcnQiOgotICAgICAgICAgICAgICAgY2FzZSAic3VyZmFjZUNoYXJ0IjoKLSAgICAgICAgICAgICAgICAgICBpZiAodG9wQ2hhcnQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxTdXJmYWNlQ2hhcnQoZHJhd2luZ3MsIG5vZGUsIHVyaUNoYXJ0LCBwYXJ0LCBjaGFydFhtbCwgY2hhcnROb2RlKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbFN1cmZhY2VDaGFydCh0b3BDaGFydCwgY2hhcnROb2RlKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBjYXNlICJyYWRhckNoYXJ0IjoKLSAgICAgICAgICAgICAgICAgICBpZiAodG9wQ2hhcnQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxSYWRhckNoYXJ0KGRyYXdpbmdzLCBub2RlLCB1cmlDaGFydCwgcGFydCwgY2hhcnRYbWwsIGNoYXJ0Tm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxSYWRhckNoYXJ0KHRvcENoYXJ0LCBjaGFydE5vZGUpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGNhc2UgImJ1YmJsZUNoYXJ0IjoKLSAgICAgICAgICAgICAgICAgICBpZiAodG9wQ2hhcnQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxCdWJibGVDaGFydChkcmF3aW5ncywgbm9kZSwgdXJpQ2hhcnQsIHBhcnQsIGNoYXJ0WG1sLCBjaGFydE5vZGUpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQnViYmxlQ2hhcnQodG9wQ2hhcnQsIGNoYXJ0Tm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgY2FzZSAiYmFyQ2hhcnQiOgotICAgICAgICAgICAgICAgY2FzZSAiYmFyM0RDaGFydCI6Ci0gICAgICAgICAgICAgICAgICAgaWYgKHRvcENoYXJ0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQmFyQ2hhcnQoZHJhd2luZ3MsIG5vZGUsIHVyaUNoYXJ0LCBwYXJ0LCBjaGFydFhtbCwgY2hhcnROb2RlKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEJhckNoYXJ0KHRvcENoYXJ0LCBjaGFydE5vZGUpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGNhc2UgImRvdWdobnV0Q2hhcnQiOgotICAgICAgICAgICAgICAgICAgIGlmICh0b3BDaGFydCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbERvdWdobnV0Q2hhcnQoZHJhd2luZ3MsIG5vZGUsIHVyaUNoYXJ0LCBwYXJ0LCBjaGFydFhtbCwgY2hhcnROb2RlKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbERvdWdobnV0Q2hhcnQodG9wQ2hhcnQsIGNoYXJ0Tm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgY2FzZSAicGllM0RDaGFydCI6Ci0gICAgICAgICAgICAgICBjYXNlICJwaWVDaGFydCI6Ci0gICAgICAgICAgICAgICAgICAgaWYgKHRvcENoYXJ0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsUGllQ2hhcnQoZHJhd2luZ3MsIG5vZGUsIHVyaUNoYXJ0LCBwYXJ0LCBjaGFydFhtbCwgY2hhcnROb2RlKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbFBpZUNoYXJ0KHRvcENoYXJ0LCBjaGFydE5vZGUpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgY2FzZSAib2ZQaWVDaGFydCI6Ci0gICAgICAgICAgICAgICAgICAgaWYgKHRvcENoYXJ0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsT2ZQaWVDaGFydChkcmF3aW5ncywgbm9kZSwgdXJpQ2hhcnQsIHBhcnQsIGNoYXJ0WG1sLCBjaGFydE5vZGUpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQmFyQ2hhcnQodG9wQ2hhcnQsIGNoYXJ0Tm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgY2FzZSAibGluZUNoYXJ0IjoKLSAgICAgICAgICAgICAgIGNhc2UgImxpbmUzRENoYXJ0IjoKLSAgICAgICAgICAgICAgICAgICBpZiAodG9wQ2hhcnQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxMaW5lQ2hhcnQoZHJhd2luZ3MsIG5vZGUsIHVyaUNoYXJ0LCBwYXJ0LCBjaGFydFhtbCwgY2hhcnROb2RlKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbExpbmVDaGFydCh0b3BDaGFydCwgY2hhcnROb2RlKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBjYXNlICJzY2F0dGVyQ2hhcnQiOgotICAgICAgICAgICAgICAgICAgIGlmICh0b3BDaGFydCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbFNjYXR0ZXJDaGFydChkcmF3aW5ncywgbm9kZSwgdXJpQ2hhcnQsIHBhcnQsIGNoYXJ0WG1sLCBjaGFydE5vZGUpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsU2NhdHRlckNoYXJ0KHRvcENoYXJ0LCBjaGFydE5vZGUpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgIH0gICAgICAgCi0gICAgICAgfQotICAgICAgIGludGVybmFsIHN0YXRpYyBFeGNlbENoYXJ0IEdldE5ld0NoYXJ0KEV4Y2VsRHJhd2luZ3MgZHJhd2luZ3MsIFhtbE5vZGUgZHJhd05vZGUsIGVDaGFydFR5cGUgY2hhcnRUeXBlLCBFeGNlbENoYXJ0IHRvcENoYXJ0LCBFeGNlbFBpdm90VGFibGUgUGl2b3RUYWJsZVNvdXJjZSkKLSAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goY2hhcnRUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5QaWU6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlBpZUV4cGxvZGVkOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5QaWUzRDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuUGllRXhwbG9kZWQzRDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbFBpZUNoYXJ0KGRyYXdpbmdzLCBkcmF3Tm9kZSwgY2hhcnRUeXBlLCB0b3BDaGFydCwgUGl2b3RUYWJsZVNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkJhck9mUGllOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5QaWVPZlBpZToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbE9mUGllQ2hhcnQoZHJhd2luZ3MsIGRyYXdOb2RlLCBjaGFydFR5cGUsIHRvcENoYXJ0LCBQaXZvdFRhYmxlU291cmNlKTsKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuRG91Z2hudXQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkRvdWdobnV0RXhwbG9kZWQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxEb3VnaG51dENoYXJ0KGRyYXdpbmdzLCBkcmF3Tm9kZSwgY2hhcnRUeXBlLCB0b3BDaGFydCwgUGl2b3RUYWJsZVNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkJhckNsdXN0ZXJlZDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQmFyU3RhY2tlZDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQmFyU3RhY2tlZDEwMDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQmFyQ2x1c3RlcmVkM0Q6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkJhclN0YWNrZWQzRDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQmFyU3RhY2tlZDEwMDNEOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5Db25lQmFyQ2x1c3RlcmVkOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5Db25lQmFyU3RhY2tlZDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ29uZUJhclN0YWNrZWQxMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkN5bGluZGVyQmFyQ2x1c3RlcmVkOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5DeWxpbmRlckJhclN0YWNrZWQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkN5bGluZGVyQmFyU3RhY2tlZDEwMDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuUHlyYW1pZEJhckNsdXN0ZXJlZDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuUHlyYW1pZEJhclN0YWNrZWQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlB5cmFtaWRCYXJTdGFja2VkMTAwOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5Db2x1bW5DbHVzdGVyZWQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQxMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbHVtbjNEOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5Db2x1bW5DbHVzdGVyZWQzRDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ29sdW1uU3RhY2tlZDNEOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5Db2x1bW5TdGFja2VkMTAwM0Q6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbmVDb2w6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbmVDb2xDbHVzdGVyZWQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbmVDb2xTdGFja2VkOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5Db25lQ29sU3RhY2tlZDEwMDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ3lsaW5kZXJDb2w6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkN5bGluZGVyQ29sQ2x1c3RlcmVkOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5DeWxpbmRlckNvbFN0YWNrZWQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkN5bGluZGVyQ29sU3RhY2tlZDEwMDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuUHlyYW1pZENvbDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuUHlyYW1pZENvbENsdXN0ZXJlZDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuUHlyYW1pZENvbFN0YWNrZWQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlB5cmFtaWRDb2xTdGFja2VkMTAwOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQmFyQ2hhcnQoZHJhd2luZ3MsIGRyYXdOb2RlLCBjaGFydFR5cGUsIHRvcENoYXJ0LCBQaXZvdFRhYmxlU291cmNlKTsKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuWFlTY2F0dGVyOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5YWVNjYXR0ZXJMaW5lczoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuWFlTY2F0dGVyTGluZXNOb01hcmtlcnM6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlhZU2NhdHRlclNtb290aDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuWFlTY2F0dGVyU21vb3RoTm9NYXJrZXJzOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsU2NhdHRlckNoYXJ0KGRyYXdpbmdzLCBkcmF3Tm9kZSwgY2hhcnRUeXBlLCB0b3BDaGFydCwgUGl2b3RUYWJsZVNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkxpbmU6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkxpbmUzRDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuTGluZU1hcmtlcnM6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkxpbmVNYXJrZXJzU3RhY2tlZDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuTGluZU1hcmtlcnNTdGFja2VkMTAwOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5MaW5lU3RhY2tlZDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuTGluZVN0YWNrZWQxMDA6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxMaW5lQ2hhcnQoZHJhd2luZ3MsIGRyYXdOb2RlLCBjaGFydFR5cGUsIHRvcENoYXJ0LCBQaXZvdFRhYmxlU291cmNlKTsKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQnViYmxlOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5CdWJibGUzREVmZmVjdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEJ1YmJsZUNoYXJ0KGRyYXdpbmdzLCBkcmF3Tm9kZSwgY2hhcnRUeXBlLCB0b3BDaGFydCwgUGl2b3RUYWJsZVNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlJhZGFyOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5SYWRhckZpbGxlZDoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuUmFkYXJNYXJrZXJzOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsUmFkYXJDaGFydChkcmF3aW5ncywgZHJhd05vZGUsIGNoYXJ0VHlwZSwgdG9wQ2hhcnQsIFBpdm90VGFibGVTb3VyY2UpOwotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5TdXJmYWNlOgotICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5TdXJmYWNlVG9wVmlldzoKLSAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuU3VyZmFjZVRvcFZpZXdXaXJlZnJhbWU6Ci0gICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlN1cmZhY2VXaXJlZnJhbWU6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxTdXJmYWNlQ2hhcnQoZHJhd2luZ3MsIGRyYXdOb2RlLCBjaGFydFR5cGUsIHRvcENoYXJ0LCBQaXZvdFRhYmxlU291cmNlKTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ2hhcnQoZHJhd2luZ3MsIGRyYXdOb2RlLCBjaGFydFR5cGUsIHRvcENoYXJ0LCBQaXZvdFRhYmxlU291cmNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgRXhjZWxQaXZvdFRhYmxlIFBpdm90VGFibGVTb3VyY2UKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgcHJpdmF0ZSBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICBpbnRlcm5hbCB2b2lkIFNldFBpdm90U291cmNlKEV4Y2VsUGl2b3RUYWJsZSBwaXZvdFRhYmxlU291cmNlKQotICAgICAgIHsKLSAgICAgICAgICAgUGl2b3RUYWJsZVNvdXJjZSA9IHBpdm90VGFibGVTb3VyY2U7Ci0gICAgICAgICAgIFhtbEVsZW1lbnQgY2hhcnQgPSBDaGFydFhtbC5TZWxlY3RTaW5nbGVOb2RlKCJjOmNoYXJ0U3BhY2UvYzpjaGFydCIsIE5hbWVTcGFjZU1hbmFnZXIpIGFzIFhtbEVsZW1lbnQ7Ci0KLSAgICAgICAgICAgdmFyIHBpdm90U291cmNlID0gQ2hhcnRYbWwuQ3JlYXRlRWxlbWVudCgicGl2b3RTb3VyY2UiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hQ2hhcnQpOwotICAgICAgICAgICBjaGFydC5QYXJlbnROb2RlLkluc2VydEJlZm9yZShwaXZvdFNvdXJjZSwgY2hhcnQpOwotICAgICAgICAgICBwaXZvdFNvdXJjZS5Jbm5lclhtbCA9IHN0cmluZy5Gb3JtYXQoIjxjOm5hbWU+W117MH0hezF9PC9jOm5hbWU+PGM6Zm10SWQgdmFsPVwiMFwiLz4iLCBQaXZvdFRhYmxlU291cmNlLldvcmtTaGVldC5OYW1lLCBwaXZvdFRhYmxlU291cmNlLk5hbWUpOwotCi0gICAgICAgICAgIHZhciBmbXRzID0gQ2hhcnRYbWwuQ3JlYXRlRWxlbWVudCgicGl2b3RGbXRzIiwgRXhjZWxQYWNrYWdlLnNjaGVtYUNoYXJ0KTsKLSAgICAgICAgICAgY2hhcnQuUHJlcGVuZENoaWxkKGZtdHMpOwotICAgICAgICAgICBmbXRzLklubmVyWG1sID0gIjxjOnBpdm90Rm10PjxjOmlkeCB2YWw9XCIwXCIvPjxjOm1hcmtlcj48YzpzeW1ib2wgdmFsPVwibm9uZVwiLz48L2M6bWFya2VyPjwvYzpwaXZvdEZtdD4iOwotCi0gICAgICAgICAgIFNlcmllcy5BZGRQaXZvdFNlcmllKHBpdm90VGFibGVTb3VyY2UpOwotICAgICAgIH0KLSAgICAgICBpbnRlcm5hbCBvdmVycmlkZSB2b2lkIERlbGV0ZU1lKCkKLSAgICAgICB7Ci0gICAgICAgICAgIHRyeQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBQYXJ0LlBhY2thZ2UuRGVsZXRlUGFydChVcmlDaGFydCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBJbnZhbGlkRGF0YUV4Y2VwdGlvbigiRVBQbHVzIGludGVybmFsIGVycm9yIHdoZW4gZGVsZXRlaW5nIGNoYXJ0LiIsIGV4KSk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgYmFzZS5EZWxldGVNZSgpOwotICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0QXhpcy5jcyBiL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQ2hhcnRBeGlzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTk3YmFmLi4wMDAwMDAwCi0tLSBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQ2hhcnRBeGlzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNzYyICswLDAgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQotICoKLSAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCi0gKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCi0gKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKLSAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKLSAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCi0gKgotICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKLSAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMjAwOS0xMC0wMQotICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uWG1sOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZTsKLXVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZy5DaGFydAotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gUG9zaXRpb24gb2YgdGhlIGF4aXMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZW51bSBlQXhpc1Bvc2l0aW9uCi0gICAgewotICAgICAgICBMZWZ0ID0gMCwKLSAgICAgICAgQm90dG9tID0gMSwKLSAgICAgICAgUmlnaHQgPSAyLAotICAgICAgICBUb3AgPSAzCi0gICAgfQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gUG9zaXRpb24gb2YgdGhlIFktQXhpcwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGVudW0gZVlBeGlzUG9zaXRpb24KLSAgICB7Ci0gICAgICAgIExlZnQgPSAwLAotICAgICAgICBSaWdodCA9IDIsCi0gICAgfQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gUG9zaXRpb24gb2YgdGhlIFgtQXhpcwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGVudW0gZVhBeGlzUG9zaXRpb24KLSAgICB7Ci0gICAgICAgIEJvdHRvbSA9IDEsCi0gICAgICAgIFRvcCA9IDMKLSAgICB9Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBeGlzIG9yaWVudGFpb24KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBlbnVtIGVBeGlzT3JpZW50YXRpb24KLSAgICB7Ci0gICAgICAgIE1heE1pbiwKLSAgICAgICAgTWluTWF4Ci0gICAgfQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gSG93IHRoZSBheGlzIGFyZSBjcm9zc2VkCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZW51bSBlQ3Jvc3NCZXR3ZWVuCi0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTcGVjaWZpZXMgdGhlIHZhbHVlIGF4aXMgc2hhbGwgY3Jvc3MgdGhlIGNhdGVnb3J5IGF4aXMgYmV0d2VlbiBkYXRhIG1hcmtlcnMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgQmV0d2VlbiwKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU3BlY2lmaWVzIHRoZSB2YWx1ZSBheGlzIHNoYWxsIGNyb3NzIHRoZSBjYXRlZ29yeSBheGlzIGF0IHRoZSBtaWRwb2ludCBvZiBhIGNhdGVnb3J5LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBNaWRDYXQKLSAgICB9Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBXaGVyZSB0aGUgYXhpcyBjcm9zcy4gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZW51bSBlQ3Jvc3NlcwotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gKEF4aXMgQ3Jvc3NlcyBhdCBaZXJvKSBUaGUgY2F0ZWdvcnkgYXhpcyBjcm9zc2VzIGF0IHRoZSB6ZXJvIHBvaW50IG9mIHRoZSB2YWx1ZWF4aXMgKGlmIHBvc3NpYmxlKSwgb3IgdGhlIG1pbmltdW0gdmFsdWUgKGlmIHRoZW1pbmltdW0gaXMgZ3JlYXRlciB0aGFuIHplcm8pIG9yIHRoZSBtYXhpbXVtIChpZiB0aGUgbWF4aW11bSBpcyBsZXNzIHRoYW4gemVybykuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIEF1dG9aZXJvLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgYXhpcyBjcm9zc2VzIGF0IHRoZSBtYXhpbXVtIHZhbHVlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIE1heCwKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gKEF4aXMgY3Jvc3NlcyBhdCB0aGUgbWluaW11bSB2YWx1ZSBvZiB0aGUgY2hhcnQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIE1pbgotICAgIH0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFRpY2ttYXJrcwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGVudW0gZUF4aXNUaWNrTWFyawotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU3BlY2lmaWVzIHRoZSB0aWNrIG1hcmtzIHNoYWxsIGNyb3NzIHRoZSBheGlzLiAKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgQ3Jvc3MsICAgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNwZWNpZmllcyB0aGUgdGljayBtYXJrcyBzaGFsbCBiZSBpbnNpZGUgdGhlIHBsb3QgYXJlYS4gCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIEluLCAgICAgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNwZWNpZmllcyB0aGVyZSBzaGFsbCBiZSBubyB0aWNrIG1hcmtzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBOb25lLCAgICAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU3BlY2lmaWVzIHRoZSB0aWNrIG1hcmtzIHNoYWxsIGJlIG91dHNpZGUgdGhlIHBsb3QgYXJlYS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgT3V0Ci0gICAgfQotICAgIHB1YmxpYyBlbnVtIGVCdWlsZEluVW5pdHMgOiBsb25nCi0gICAgewotICAgICAgICBodW5kcmVkcyA9IDEwMCwKLSAgICAgICAgdGhvdXNhbmRzID0gMTAwMCwKLSAgICAgICAgdGVuVGhvdXNhbmRzID0gMTAwMDAsCi0gICAgICAgIGh1bmRyZWRUaG91c2FuZHMgPSAxMDAwMDAsCi0gICAgICAgIG1pbGxpb25zID0gMTAwMDAwMCwKLSAgICAgICAgdGVuTWlsbGlvbnMgPSAxMDAwMDAwMCwKLSAgICAgICAgaHVuZHJlZE1pbGxpb25zID0gMTAwMDAwMDAwLAotICAgICAgICBiaWxsaW9ucyA9IDEwMDAwMDAwMDAsCi0gICAgICAgIHRyaWxsaW9ucyA9IDEwMDAwMDAwMDAwMDAKLSAgICB9Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBbiBheGlzIGZvciBhIGNoYXJ0Ci0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsQ2hhcnRBeGlzIDogWG1sSGVscGVyCi0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUeXBlIG9mIGF4aXMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgaW50ZXJuYWwgZW51bSBlQXhpc1R5cGUKLSAgICAgICAgewotICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAgICAgLy8vIFZhbHVlIGF4aXMKLSAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgICAgICBWYWwsCi0gICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAvLy8gQ2F0ZWdvcnkgYXhpcwotICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgICAgIENhdCwKLSAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgICAgIC8vLyBEYXRlIGF4aXMKLSAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgICAgICBEYXRlLAotICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAgICAgLy8vIFNlcmllcyBheGlzCi0gICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAgICAgU2VyaWUKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBFeGNlbENoYXJ0QXhpcyhYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVTcGFjZU1hbmFnZXIsIFhtbE5vZGUgdG9wTm9kZSkgOgotICAgICAgICAgICAgYmFzZShuYW1lU3BhY2VNYW5hZ2VyLCB0b3BOb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFOb2RlT3JkZXIgPSBuZXcgc3RyaW5nW10geyAiYXhJZCIsICJzY2FsaW5nIiwgImxvZ0Jhc2UiLCAib3JpZW50YXRpb24iLCAibWF4IiwgIm1pbiIsICJkZWxldGUiLCAiYXhQb3MiLCAibWFqb3JHcmlkbGluZXMiLCAidGl0bGUiLCAibnVtRm10IiwgIm1ham9yVGlja01hcmsiLCAibWlub3JUaWNrTWFyayIsICJ0aWNrTGJsUG9zIiwgInNwUHIiLCAidHhQciIsICJjcm9zc0F4IiwgImNyb3NzZXNBdCIsICJjcm9zc2VzIiwgImNyb3NzQmV0d2VlbiIsICJhdXRvIiwgImxibE9mZnNldCIsICJtYWpvclVuaXQiLCAibWlub3JVbml0IiwgImRpc3BVbml0cyIsICJzcFByIiwgInR4UHIiIH07Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgc3RyaW5nIElkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKCJjOmF4SWQvQHZhbCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBfbWFqb3JUaWNrTWFyayA9ICJjOm1ham9yVGlja01hcmsvQHZhbCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIG1ham9yVGlja01hcmsgCi0gICAgICAgIC8vLyBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBtYWpvciB0aWNrIG1hcmtzIGZvciB0aGUgYXhpcy4gCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBlQXhpc1RpY2tNYXJrIE1ham9yVGlja01hcmsKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHY9R2V0WG1sTm9kZVN0cmluZyhfbWFqb3JUaWNrTWFyayk7Ci0gICAgICAgICAgICAgICAgaWYoc3RyaW5nLklzTnVsbE9yRW1wdHkodikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUF4aXNUaWNrTWFyay5Dcm9zczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZUF4aXNUaWNrTWFyaylFbnVtLlBhcnNlKCB0eXBlb2YoIGVBeGlzVGlja01hcmsgKSwgdiApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQXhpc1RpY2tNYXJrLkNyb3NzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyggX21ham9yVGlja01hcmssIHZhbHVlLlRvU3RyaW5nKCkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3Qgc3RyaW5nIF9taW5vclRpY2tNYXJrID0gImM6bWlub3JUaWNrTWFyay9AdmFsIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gbWlub3JUaWNrTWFyayAKLSAgICAgICAgLy8vIFRoaXMgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG1pbm9yIHRpY2sgbWFya3MgZm9yIHRoZSBheGlzLiAKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGVBeGlzVGlja01hcmsgTWlub3JUaWNrTWFyawotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgdj1HZXRYbWxOb2RlU3RyaW5nKF9taW5vclRpY2tNYXJrKTsKLSAgICAgICAgICAgICAgICBpZihzdHJpbmcuSXNOdWxsT3JFbXB0eSh2KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlQXhpc1RpY2tNYXJrLkNyb3NzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlQXhpc1RpY2tNYXJrKUVudW0uUGFyc2UodHlwZW9mKGVBeGlzVGlja01hcmspLCB2ICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2gKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVBeGlzVGlja01hcmsuQ3Jvc3M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9taW5vclRpY2tNYXJrLCB2YWx1ZS5Ub1N0cmluZygpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUeXBlIG9mIGF4aXMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgaW50ZXJuYWwgZUF4aXNUeXBlIEF4aXNUeXBlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlQXhpc1R5cGUpRW51bS5QYXJzZSh0eXBlb2YoZUF4aXNUeXBlKSwgVG9wTm9kZS5Mb2NhbE5hbWUuU3Vic3RyaW5nKDAsMyksIHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVBeGlzVHlwZS5WYWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgc3RyaW5nIEFYSVNfUE9TSVRJT05fUEFUSCA9ICJjOmF4UG9zL0B2YWwiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBXaGVyZSB0aGUgYXhpcyBpcyBsb2NhdGVkCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBlQXhpc1Bvc2l0aW9uIEF4aXNQb3NpdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgc3dpdGNoKEdldFhtbE5vZGVTdHJpbmcoQVhJU19QT1NJVElPTl9QQVRIKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgImIiOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVBeGlzUG9zaXRpb24uQm90dG9tOwotICAgICAgICAgICAgICAgICAgICBjYXNlICJyIjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQXhpc1Bvc2l0aW9uLlJpZ2h0OwotICAgICAgICAgICAgICAgICAgICBjYXNlICJ0IjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQXhpc1Bvc2l0aW9uLlRvcDsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUF4aXNQb3NpdGlvbi5MZWZ0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludGVybmFsIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoQVhJU19QT1NJVElPTl9QQVRILCB2YWx1ZS5Ub1N0cmluZygpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkuU3Vic3RyaW5nKDAsMSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBfY3Jvc3Nlc1BhdGggPSAiYzpjcm9zc2VzL0B2YWwiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBXaGVyZSB0aGUgYXhpcyBjcm9zcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZUNyb3NzZXMgQ3Jvc3NlcwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgdj1HZXRYbWxOb2RlU3RyaW5nKF9jcm9zc2VzUGF0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHYpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDcm9zc2VzLkF1dG9aZXJvOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlQ3Jvc3NlcylFbnVtLlBhcnNlKHR5cGVvZihlQ3Jvc3NlcyksIHYsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ3Jvc3Nlcy5BdXRvWmVybzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB2ID0gdmFsdWUuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB2ID0gdi5TdWJzdHJpbmcoMCwgMSkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSArIHYuU3Vic3RyaW5nKDEsIHYuTGVuZ3RoIC0gMSk7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfY3Jvc3Nlc1BhdGgsIHYpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIF9jcm9zc0JldHdlZW5QYXRoID0gImM6Y3Jvc3NCZXR3ZWVuL0B2YWwiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBIb3cgdGhlIGF4aXMgYXJlIGNyb3NzZWQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGVDcm9zc0JldHdlZW4gQ3Jvc3NCZXR3ZWVuCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB2PUdldFhtbE5vZGVTdHJpbmcoX2Nyb3NzQmV0d2VlblBhdGgpOwotICAgICAgICAgICAgICAgIGlmKHN0cmluZy5Jc051bGxPckVtcHR5KHYpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDcm9zc0JldHdlZW4uQmV0d2VlbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZUNyb3NzQmV0d2VlbilFbnVtLlBhcnNlKHR5cGVvZihlQ3Jvc3NCZXR3ZWVuKSwgdiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2gKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDcm9zc0JldHdlZW4uQmV0d2VlbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB2ID0gdmFsdWUuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB2ID0gdi5TdWJzdHJpbmcoMCwgMSkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSArIHYuU3Vic3RyaW5nKDEpOwotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2Nyb3NzQmV0d2VlblBhdGgsIHYpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBfY3Jvc3Nlc0F0UGF0aCA9ICJjOmNyb3NzZXNBdC9AdmFsIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIHZhbHVlIHdoZXJlIHRoZSBheGlzIGNyb3NzLiAKLSAgICAgICAgLy8vIE51bGwgaXMgYXV0b21hdGljCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBkb3VibGU/IENyb3NzZXNBdAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZURvdWJsZU51bGwoX2Nyb3NzZXNBdFBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEZWxldGVOb2RlKF9jcm9zc2VzQXRQYXRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfY3Jvc3Nlc0F0UGF0aCwgKChkb3VibGUpdmFsdWUpLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIF9mb3JtYXRQYXRoID0gImM6bnVtRm10L0Bmb3JtYXRDb2RlIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTnVtYmVyZm9ybWF0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgRm9ybWF0IAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZyhfZm9ybWF0UGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9mb3JtYXRQYXRoLHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IHN0cmluZyBfbGJsUG9zID0gImM6dGlja0xibFBvcy9AdmFsIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUG9zaXRpb24gb2YgdGhlIGxhYmVscwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZVRpY2tMYWJlbFBvc2l0aW9uIExhYmVsUG9zaXRpb24KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHY9R2V0WG1sTm9kZVN0cmluZyhfbGJsUG9zKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkodikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVRpY2tMYWJlbFBvc2l0aW9uLk5leHRUbzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZVRpY2tMYWJlbFBvc2l0aW9uKUVudW0uUGFyc2UodHlwZW9mKGVUaWNrTGFiZWxQb3NpdGlvbiksIHYsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlVGlja0xhYmVsUG9zaXRpb24uTmV4dFRvOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIGxwID0gdmFsdWUuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9sYmxQb3MsIGxwLlN1YnN0cmluZygwLCAxKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpICsgbHAuU3Vic3RyaW5nKDEsIGxwLkxlbmd0aCAtIDEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBFeGNlbERyYXdpbmdGaWxsIF9maWxsID0gbnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWNjZXNzIHRvIGZpbGwgcHJvcGVydGllcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxEcmF3aW5nRmlsbCBGaWxsCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfZmlsbCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2ZpbGwgPSBuZXcgRXhjZWxEcmF3aW5nRmlsbChOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCAiYzpzcFByIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfZmlsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBFeGNlbERyYXdpbmdCb3JkZXIgX2JvcmRlciA9IG51bGw7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFjY2VzcyB0byBib3JkZXIgcHJvcGVydGllcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxEcmF3aW5nQm9yZGVyIEJvcmRlcgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX2JvcmRlciA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2JvcmRlciA9IG5ldyBFeGNlbERyYXdpbmdCb3JkZXIoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgImM6c3BQci9hOmxuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfYm9yZGVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEV4Y2VsVGV4dEZvbnQgX2ZvbnQgPSBudWxsOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBY2Nlc3MgdG8gZm9udCBwcm9wZXJ0aWVzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFRleHRGb250IEZvbnQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9mb250ID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJjOnR4UHIiLCBOYW1lU3BhY2VNYW5hZ2VyKSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKCJjOnR4UHIvYTpib2R5UHIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZU5vZGUoImM6dHhQci9hOmxzdFN0eWxlIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgX2ZvbnQgPSBuZXcgRXhjZWxUZXh0Rm9udChOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCAiYzp0eFByL2E6cC9hOnBQci9hOmRlZlJQciIsIG5ldyBzdHJpbmdbXSB7ICJwUHIiLCAiZGVmUlByIiwgInNvbGlkRmlsbCIsICJ1RmlsbCIsICJsYXRpbiIsICJjcyIsICJyIiwgInJQciIsICJ0IiB9KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9mb250OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIElmIHRoZSBheGlzIGlzIGRlbGV0ZWQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgRGVsZXRlZCAKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJjOmRlbGV0ZS9AdmFsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiYzpkZWxldGUvQHZhbCIsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgX3RpY0xibFBvc19QYXRoID0gImM6dGlja0xibFBvcy9AdmFsIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUG9zaXRpb24gb2YgdGhlIExhYmxlcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZVRpY2tMYWJlbFBvc2l0aW9uIFRpY2tMYWJlbFBvc2l0aW9uIAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcgdiA9IEdldFhtbE5vZGVTdHJpbmcoX3RpY0xibFBvc19QYXRoKTsKLSAgICAgICAgICAgICAgICBpZiAodiA9PSAiIikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlVGlja0xhYmVsUG9zaXRpb24uTm9uZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlVGlja0xhYmVsUG9zaXRpb24pRW51bS5QYXJzZSh0eXBlb2YoZVRpY2tMYWJlbFBvc2l0aW9uKSwgdiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIHYgPSB2YWx1ZS5Ub1N0cmluZygpOwotICAgICAgICAgICAgICAgIHY9di5TdWJzdHJpbmcoMCwgMSkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSArIHYuU3Vic3RyaW5nKDEsIHYuTGVuZ3RoIC0gMSk7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfdGljTGJsUG9zX1BhdGgsdik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIF9kaXNwbGF5VW5pdFBhdGggPSAiYzpkaXNwVW5pdHMvYzpidWlsdEluVW5pdC9AdmFsIjsKLSAgICAgICAgY29uc3Qgc3RyaW5nIF9jdXN0VW5pdFBhdGggPSAiYzpkaXNwVW5pdHMvYzpjdXN0VW5pdC9AdmFsIjsKLSAgICAgICAgcHVibGljIGRvdWJsZSBEaXNwbGF5VW5pdAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcgdiA9IEdldFhtbE5vZGVTdHJpbmcoX2Rpc3BsYXlVbml0UGF0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHYpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBHZXRYbWxOb2RlRG91YmxlTnVsbChfY3VzdFVuaXRQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5WYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkb3VibGUpKGxvbmcpRW51bS5QYXJzZSh0eXBlb2YoZUJ1aWxkSW5Vbml0cyksIHYsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKEF4aXNUeXBlID09IGVBeGlzVHlwZS5WYWwgJiYgdmFsdWU+PTApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKHZhciB2IGluIEVudW0uR2V0VmFsdWVzKHR5cGVvZihlQnVpbGRJblVuaXRzKSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKChkb3VibGUpKGxvbmcpdj09dmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlTm9kZShfY3VzdFVuaXRQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9kaXNwbGF5VW5pdFBhdGgsICgoZUJ1aWxkSW5Vbml0cyl2YWx1ZSkuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIERlbGV0ZU5vZGUoX2Rpc3BsYXlVbml0UGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHZhbHVlIT0wKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9jdXN0VW5pdFBhdGgsIHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIEV4Y2VsQ2hhcnRUaXRsZSBfdGl0bGUgPSBudWxsOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDaGFydCBheGlzIHRpdGxlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbENoYXJ0VGl0bGUgVGl0bGUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF90aXRsZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIG5vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImM6dGl0bGUiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlTm9kZSgiYzp0aXRsZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiYzp0aXRsZSIsIE5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5Jbm5lclhtbCA9ICI8Yzp0eD48YzpyaWNoPjxhOmJvZHlQciAvPjxhOmxzdFN0eWxlIC8+PGE6cD48YTpyPjxhOnQgLz48L2E6cj48L2E6cD48L2M6cmljaD48L2M6dHg+PGM6bGF5b3V0IC8+PGM6b3ZlcmxheSB2YWw9XCIwXCIgLz4iOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIF90aXRsZSA9IG5ldyBFeGNlbENoYXJ0VGl0bGUoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfdGl0bGU7Ci0gICAgICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgI3JlZ2lvbiAiU2NhbGluZyIKLSAgICAgICAgY29uc3Qgc3RyaW5nIF9taW5WYWx1ZVBhdGggPSAiYzpzY2FsaW5nL2M6bWluL0B2YWwiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBNaW5pbXVtIHZhbHVlIGZvciB0aGUgYXhpcy4KLSAgICAgICAgLy8vIE51bGwgaXMgYXV0b21hdGljCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBkb3VibGU/IE1pblZhbHVlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlRG91YmxlTnVsbChfbWluVmFsdWVQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRGVsZXRlTm9kZShfbWluVmFsdWVQYXRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfbWluVmFsdWVQYXRoLCAoKGRvdWJsZSl2YWx1ZSkuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgX21heFZhbHVlUGF0aCA9ICJjOnNjYWxpbmcvYzptYXgvQHZhbCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE1heCB2YWx1ZSBmb3IgdGhlIGF4aXMuCi0gICAgICAgIC8vLyBOdWxsIGlzIGF1dG9tYXRpYwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZG91YmxlPyBNYXhWYWx1ZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZURvdWJsZU51bGwoX21heFZhbHVlUGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERlbGV0ZU5vZGUoX21heFZhbHVlUGF0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX21heFZhbHVlUGF0aCwgKChkb3VibGUpdmFsdWUpLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIF9tYWpvclVuaXRQYXRoID0gImM6bWFqb3JVbml0L0B2YWwiOwotICAgICAgICBjb25zdCBzdHJpbmcgX21ham9yVW5pdENhdFBhdGggPSAiYzp0aWNrTGJsU2tpcC9AdmFsIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTWFqb3IgdW5pdCBmb3IgdGhlIGF4aXMuCi0gICAgICAgIC8vLyBOdWxsIGlzIGF1dG9tYXRpYwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZG91YmxlPyBNYWpvclVuaXQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKEF4aXNUeXBlID09IGVBeGlzVHlwZS5DYXQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZURvdWJsZU51bGwoX21ham9yVW5pdENhdFBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZURvdWJsZU51bGwoX21ham9yVW5pdFBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRGVsZXRlTm9kZShfbWFqb3JVbml0UGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgIERlbGV0ZU5vZGUoX21ham9yVW5pdENhdFBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoQXhpc1R5cGUgPT0gZUF4aXNUeXBlLkNhdCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfbWFqb3JVbml0Q2F0UGF0aCwgKChkb3VibGUpdmFsdWUpLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX21ham9yVW5pdFBhdGgsICgoZG91YmxlKXZhbHVlKS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIF9taW5vclVuaXRQYXRoID0gImM6bWlub3JVbml0L0B2YWwiOwotICAgICAgICBjb25zdCBzdHJpbmcgX21pbm9yVW5pdENhdFBhdGggPSAiYzp0aWNrTWFya1NraXAvQHZhbCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE1pbm9yIHVuaXQgZm9yIHRoZSBheGlzLgotICAgICAgICAvLy8gTnVsbCBpcyBhdXRvbWF0aWMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGRvdWJsZT8gTWlub3JVbml0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChBeGlzVHlwZSA9PSBlQXhpc1R5cGUuQ2F0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVEb3VibGVOdWxsKF9taW5vclVuaXRDYXRQYXRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVEb3VibGVOdWxsKF9taW5vclVuaXRQYXRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERlbGV0ZU5vZGUoX21pbm9yVW5pdFBhdGgpOwotICAgICAgICAgICAgICAgICAgICBEZWxldGVOb2RlKF9taW5vclVuaXRDYXRQYXRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKEF4aXNUeXBlID09IGVBeGlzVHlwZS5DYXQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX21pbm9yVW5pdENhdFBhdGgsICgoZG91YmxlKXZhbHVlKS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9taW5vclVuaXRQYXRoLCAoKGRvdWJsZSl2YWx1ZSkuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBfbG9nYmFzZVBhdGggPSAiYzpzY2FsaW5nL2M6bG9nQmFzZS9AdmFsIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGJhc2UgZm9yIGEgbG9nYXJpdG1pYyBzY2FsZQotICAgICAgICAvLy8gTnVsbCBmb3IgYSBub3JtYWwgc2NhbGUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGRvdWJsZT8gTG9nQmFzZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZURvdWJsZU51bGwoX2xvZ2Jhc2VQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRGVsZXRlTm9kZShfbG9nYmFzZVBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkb3VibGUgdiA9ICgoZG91YmxlKXZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHYgPCAyIHx8IHYgPiAxMDAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyhuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJWYWx1ZSBtdXN0IGJlIGJldHdlZW4gMiBhbmQgMTAwMCIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9sb2diYXNlUGF0aCwgdi5Ub1N0cmluZygiMC4wIiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgX29yaWVudGF0aW9uUGF0aCA9ICJjOnNjYWxpbmcvYzpvcmllbnRhdGlvbi9AdmFsIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBlQXhpc09yaWVudGF0aW9uIE9yaWVudGF0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmluZyB2ID0gR2V0WG1sTm9kZVN0cmluZyhfb3JpZW50YXRpb25QYXRoKTsKLSAgICAgICAgICAgICAgICBpZiAodiA9PSAiIikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlQXhpc09yaWVudGF0aW9uLk1pbk1heDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlQXhpc09yaWVudGF0aW9uKUVudW0uUGFyc2UodHlwZW9mKGVBeGlzT3JpZW50YXRpb24pLCB2LCB0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcgcz12YWx1ZS5Ub1N0cmluZygpOwotICAgICAgICAgICAgICAgIHM9cy5TdWJzdHJpbmcoMCwxKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpICsgcy5TdWJzdHJpbmcoMSxzLkxlbmd0aC0xKTsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9vcmllbnRhdGlvblBhdGgsIHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0Q29sbGVjdGlvbi5jcyBiL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQ2hhcnRDb2xsZWN0aW9uLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmZmMjJmLi4wMDAwMDAwCi0tLSBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQ2hhcnRDb2xsZWN0aW9uLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQotICoKLSAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCi0gKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCi0gKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKLSAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKLSAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCi0gKgotICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKLSAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMjAwOS0xMC0wMQotICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uWG1sOwotCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0Ci17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBFbnVtZXJhdGVzIGNoYXJ0dHlwZXMgCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxDaGFydENvbGxlY3Rpb24gOiBJRW51bWVyYWJsZTxFeGNlbENoYXJ0PgotICAgIHsKLSAgICAgICAgTGlzdDxFeGNlbENoYXJ0PiBfbGlzdCA9IG5ldyBMaXN0PEV4Y2VsQ2hhcnQ+KCk7Ci0gICAgICAgIEV4Y2VsQ2hhcnQgX3RvcENoYXJ0OwotICAgICAgICBpbnRlcm5hbCBFeGNlbENoYXJ0Q29sbGVjdGlvbihFeGNlbENoYXJ0IGNoYXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgICBfdG9wQ2hhcnQgPSBjaGFydDsKLSAgICAgICAgICAgIF9saXN0LkFkZChjaGFydCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgdm9pZCBBZGQoRXhjZWxDaGFydCBjaGFydCkKLSAgICAgICAgewotICAgICAgICAgICAgX2xpc3QuQWRkKGNoYXJ0KTsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBZGQgYSBuZXcgY2hhcnR0eXBlIHRvIHRoZSBjaGFydAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNoYXJ0VHlwZSI+VGhlIHR5cGUgb2YgdGhlIG5ldyBjaGFydDwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBFeGNlbENoYXJ0IEFkZChlQ2hhcnRUeXBlIGNoYXJ0VHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF90b3BDaGFydC5QaXZvdFRhYmxlU291cmNlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW4gbm90IGFkZCBvdGhlciBjaGFydHR5cGVzIHRvIGEgcGl2b3QgY2hhcnQiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChFeGNlbENoYXJ0LklzVHlwZTNEKGNoYXJ0VHlwZSkgfHwgX2xpc3RbMF0uSXNUeXBlM0QoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyhuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiM0QgY2hhcnRzIGNhbiBub3QgYmUgY29tYmluZWQgd2l0aCBvdGhlciBjaGFydHR5cGVzIikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2YXIgcHJlcGVuZGluZ0NoYXJ0Tm9kZSA9IF9saXN0W19saXN0LkNvdW50IC0gMV0uVG9wTm9kZTsKLSAgICAgICAgICAgIEV4Y2VsQ2hhcnQgY2hhcnQgPSBFeGNlbENoYXJ0LkdldE5ld0NoYXJ0KF90b3BDaGFydC5Xb3JrU2hlZXQuRHJhd2luZ3MsIF90b3BDaGFydC5Ub3BOb2RlLCBjaGFydFR5cGUsIF90b3BDaGFydCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIF9saXN0LkFkZChjaGFydCk7Ci0gICAgICAgICAgICByZXR1cm4gY2hhcnQ7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIGludCBDb3VudAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2xpc3QuQ291bnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgSUVudW1lcmF0b3I8RXhjZWxDaGFydD4gSUVudW1lcmFibGU8RXhjZWxDaGFydD4uR2V0RW51bWVyYXRvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfbGlzdC5HZXRFbnVtZXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmF0b3IgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2xpc3QuR2V0RW51bWVyYXRvcigpOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgYSBjaGFydCBhdCB0aGUgc3BlY2lmaWMgcG9zaXRpb24uICAKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJQb3NpdGlvbklEIj5UaGUgcG9zaXRpb24gb2YgdGhlIGNoYXJ0LiAwLWJhc2U8L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgRXhjZWxDaGFydCB0aGlzW2ludCBQb3NpdGlvbklEXQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKF9saXN0W1Bvc2l0aW9uSURdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLX0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQ2hhcnREYXRhTGFiZWwuY3MgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0RGF0YUxhYmVsLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjM5OTc4Li4wMDAwMDAwCi0tLSBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQ2hhcnREYXRhTGFiZWwuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCi0gKgotICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KLSAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKLSAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAotICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAotICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KLSAqCi0gKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAotICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkyMDA5LTEyLTMwCi0gKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5YbWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlOwotCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0Ci17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBEYXRhbGFiZWwgb24gY2hhcnQgbGV2ZWwuIAotICAgIC8vLyBUaGlzIGNsYXNzIGlzIGluaGVyaXRlZCBieSBFeGNlbENoYXJ0U2VyaWVEYXRhTGFiZWwKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbENoYXJ0RGF0YUxhYmVsIDogWG1sSGVscGVyCi0gICAgewotICAgICAgIGludGVybmFsIEV4Y2VsQ2hhcnREYXRhTGFiZWwoWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSBub2RlKQotICAgICAgICAgICA6IGJhc2UobnMsbm9kZSkKLSAgICAgICB7Ci0gICAgICAgICAgIFhtbE5vZGUgdG9wTm9kZSA9IG5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiYzpkTGJscyIsIE5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICBpZiAodG9wTm9kZSA9PSBudWxsKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICB0b3BOb2RlID0gbm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoImMiLCAiZExibHMiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hQ2hhcnQpOwotICAgICAgICAgICAgICAgLy9ub2RlLkluc2VydEFmdGVyKF90b3BOb2RlLCBub2RlLlNlbGVjdFNpbmdsZU5vZGUoImM6b3JkZXIiLCBOYW1lU3BhY2VNYW5hZ2VyKSk7Ci0gICAgICAgICAgICAgICBJbnNlckFmdGVyKG5vZGUsICJjOm1hcmtlcixjOnR4LGM6b3JkZXIsYzpzZXIiLCB0b3BOb2RlKTsKLSAgICAgICAgICAgICAgIFNjaGVtYU5vZGVPcmRlciA9IG5ldyBzdHJpbmdbXSB7ICJzcFByIiwgInR4UHIiLCAiZExibFBvcyIsICJzaG93TGVnZW5kS2V5IiwgInNob3dWYWwiLCAic2hvd0NhdE5hbWUiLCAic2hvd1Nlck5hbWUiLCAic2hvd1BlcmNlbnQiLCAic2hvd0J1YmJsZVNpemUiLCAic2VwYXJhdG9yIiwgInNob3dMZWFkZXJMaW5lcyIgfTsKLSAgICAgICAgICAgICAgIHRvcE5vZGUuSW5uZXJYbWwgPSAiPGM6c2hvd0xlZ2VuZEtleSB2YWw9XCIwXCIgLz48YzpzaG93VmFsIHZhbD1cIjBcIiAvPjxjOnNob3dDYXROYW1lIHZhbD1cIjBcIiAvPjxjOnNob3dTZXJOYW1lIHZhbD1cIjBcIiAvPjxjOnNob3dQZXJjZW50IHZhbD1cIjBcIiAvPjxjOnNob3dCdWJibGVTaXplIHZhbD1cIjBcIiAvPiA8YzpzZXBhcmF0b3I+XHJcbjwvYzpzZXBhcmF0b3I+PGM6c2hvd0xlYWRlckxpbmVzIHZhbD1cIjBcIiAvPiI7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICB9Ci0gICAgICAgICAgIFRvcE5vZGUgPSB0b3BOb2RlOwotICAgICAgIH0KLSAgICAgICAjcmVnaW9uICJQdWJsaWMgcHJvcGVydGllcyIKLSAgICAgICBjb25zdCBzdHJpbmcgc2hvd1ZhbFBhdGggPSAiYzpzaG93VmFsL0B2YWwiOwotICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAvLy8gU2hvdyB0aGUgdmFsdWVzIAotICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIFNob3dWYWx1ZQotICAgICAgIHsKLSAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChzaG93VmFsUGF0aCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgc2V0Ci0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoc2hvd1ZhbFBhdGgsIHZhbHVlID8gIjEiIDogIjAiKTsKLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICBjb25zdCBzdHJpbmcgc2hvd0NhdFBhdGggPSAiYzpzaG93Q2F0TmFtZS9AdmFsIjsKLSAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgLy8vIFNob3cgY2F0ZWdvcnkgbmFtZXMKLSAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBTaG93Q2F0ZWdvcnkKLSAgICAgICB7Ci0gICAgICAgICAgIGdldAotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woc2hvd0NhdFBhdGgpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIHNldAotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKHNob3dDYXRQYXRoLCB2YWx1ZSA/ICIxIiA6ICIwIik7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgY29uc3Qgc3RyaW5nIHNob3dTZXJQYXRoID0gImM6c2hvd1Nlck5hbWUvQHZhbCI7Ci0gICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgIC8vLyBTaG93IHNlcmllcyBuYW1lcwotICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIFNob3dTZXJpZXNOYW1lCi0gICAgICAgewotICAgICAgICAgICBnZXQKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKHNob3dTZXJQYXRoKTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBzZXQKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhzaG93U2VyUGF0aCwgdmFsdWUgPyAiMSIgOiAiMCIpOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIGNvbnN0IHN0cmluZyBzaG93UGVyZW50UGF0aCA9ICJjOnNob3dQZXJjZW50L0B2YWwiOwotICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAvLy8gU2hvdyBwZXJjZW50IHZhbHVlcwotICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIFNob3dQZXJjZW50Ci0gICAgICAgewotICAgICAgICAgICBnZXQKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKHNob3dQZXJlbnRQYXRoKTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBzZXQKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhzaG93UGVyZW50UGF0aCwgdmFsdWUgPyAiMSIgOiAiMCIpOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIGNvbnN0IHN0cmluZyBzaG93TGVhZGVyTGluZXNQYXRoID0gImM6c2hvd0xlYWRlckxpbmVzL0B2YWwiOwotICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAvLy8gU2hvdyB0aGUgbGVhZGVyIGxpbmVzCi0gICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgU2hvd0xlYWRlckxpbmVzCi0gICAgICAgewotICAgICAgICAgICBnZXQKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKHNob3dMZWFkZXJMaW5lc1BhdGgpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIHNldAotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKHNob3dMZWFkZXJMaW5lc1BhdGgsIHZhbHVlID8gIjEiIDogIjAiKTsKLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICBjb25zdCBzdHJpbmcgc2hvd0J1YmJsZVNpemVQYXRoID0gImM6c2hvd0J1YmJsZVNpemUvQHZhbCI7Ci0gICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgIC8vLyBCdWJibGUgU2l6ZS4KLSAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBTaG93QnViYmxlU2l6ZQotICAgICAgIHsKLSAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChzaG93QnViYmxlU2l6ZVBhdGgpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIHNldAotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKHNob3dCdWJibGVTaXplUGF0aCwgdmFsdWUgPyAiMSIgOiAiMCIpOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIGNvbnN0IHN0cmluZyBzaG93TGVnZW5kS2V5UGF0aCA9ICJjOnNob3dMZWdlbmRLZXkvQHZhbCI7Ci0gICAgICAgcHVibGljIGJvb2wgU2hvd0xlZ2VuZEtleQotICAgICAgIHsKLSAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChzaG93TGVnZW5kS2V5UGF0aCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgc2V0Ci0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoc2hvd0xlZ2VuZEtleVBhdGgsIHZhbHVlID8gIjEiIDogIjAiKTsKLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICBjb25zdCBzdHJpbmcgc2VwYXJhdG9yUGF0aCA9ICJjOnNlcGFyYXRvciI7Ci0gICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgIC8vLyBTZXBhcmF0b3Igc3RyaW5nIAotICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgU2VwYXJhdG9yCi0gICAgICAgewotICAgICAgICAgICBnZXQKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoc2VwYXJhdG9yUGF0aCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgc2V0Ci0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eSh2YWx1ZSkpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgRGVsZXRlTm9kZShzZXBhcmF0b3JQYXRoKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKHNlcGFyYXRvclBhdGgsIHZhbHVlKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgIH0KLQotICAgICAgIEV4Y2VsRHJhd2luZ0ZpbGwgX2ZpbGwgPSBudWxsOwotICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAvLy8gQWNjZXNzIGZpbGwgcHJvcGVydGllcwotICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgcHVibGljIEV4Y2VsRHJhd2luZ0ZpbGwgRmlsbAotICAgICAgIHsKLSAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGlmIChfZmlsbCA9PSBudWxsKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIF9maWxsID0gbmV3IEV4Y2VsRHJhd2luZ0ZpbGwoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgImM6c3BQciIpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgcmV0dXJuIF9maWxsOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIEV4Y2VsRHJhd2luZ0JvcmRlciBfYm9yZGVyID0gbnVsbDsKLSAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgLy8vIEFjY2VzcyBib3JkZXIgcHJvcGVydGllcwotICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgcHVibGljIEV4Y2VsRHJhd2luZ0JvcmRlciBCb3JkZXIKLSAgICAgICB7Ci0gICAgICAgICAgIGdldAotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAoX2JvcmRlciA9PSBudWxsKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIF9ib3JkZXIgPSBuZXcgRXhjZWxEcmF3aW5nQm9yZGVyKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsICJjOnNwUHIvYTpsbiIpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgcmV0dXJuIF9ib3JkZXI7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgc3RyaW5nW10gX3BhcmFncmFwaFNjaGVtYU9yZGVyID0gbmV3IHN0cmluZ1tdIHsgInNwUHIiLCAidHhQciIsICJkTGJsUG9zIiwgInNob3dWYWwiLCAic2hvd0NhdE5hbWUiLCAic2hvd1Nlck5hbWUiLCAic2hvd1BlcmNlbnQiLCAic2VwYXJhdG9yIiwgInNob3dMZWFkZXJMaW5lcyIsICJwUHIiLCAiZGVmUlByIiwgInNvbGlkRmlsbCIsICJ1RmlsbCIsICJsYXRpbiIsICJjcyIsICJyIiwgInJQciIsICJ0IiB9OwotICAgICAgIEV4Y2VsVGV4dEZvbnQgX2ZvbnQgPSBudWxsOwotICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAvLy8gQWNjZXNzIGZvbnQgcHJvcGVydGllcwotICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgcHVibGljIEV4Y2VsVGV4dEZvbnQgRm9udAotICAgICAgIHsKLSAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGlmIChfZm9udCA9PSBudWxsKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIGlmIChUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImM6dHhQciIsIE5hbWVTcGFjZU1hbmFnZXIpID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKCJjOnR4UHIvYTpib2R5UHIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlTm9kZSgiYzp0eFByL2E6bHN0U3R5bGUiKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgX2ZvbnQgPSBuZXcgRXhjZWxUZXh0Rm9udChOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCAiYzp0eFByL2E6cC9hOnBQci9hOmRlZlJQciIsIF9wYXJhZ3JhcGhTY2hlbWFPcmRlcik7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICByZXR1cm4gX2ZvbnQ7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgI2VuZHJlZ2lvbgotICAgICAgICNyZWdpb24gIlBvc2l0aW9uIEVudW0gVHJhbnNsYXRpb24iCi0gICAgICAgcHJvdGVjdGVkIHN0cmluZyBHZXRQb3NUZXh0KGVMYWJlbFBvc2l0aW9uIHBvcykKLSAgICAgICB7Ci0gICAgICAgICAgIHN3aXRjaCAocG9zKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBjYXNlIGVMYWJlbFBvc2l0aW9uLkJvdHRvbToKLSAgICAgICAgICAgICAgICAgICByZXR1cm4gImIiOwotICAgICAgICAgICAgICAgY2FzZSBlTGFiZWxQb3NpdGlvbi5DZW50ZXI6Ci0gICAgICAgICAgICAgICAgICAgcmV0dXJuICJjdHIiOwotICAgICAgICAgICAgICAgY2FzZSBlTGFiZWxQb3NpdGlvbi5JbkJhc2U6Ci0gICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbkJhc2UiOwotICAgICAgICAgICAgICAgY2FzZSBlTGFiZWxQb3NpdGlvbi5JbkVuZDoKLSAgICAgICAgICAgICAgICAgICByZXR1cm4gImluRW5kIjsKLSAgICAgICAgICAgICAgIGNhc2UgZUxhYmVsUG9zaXRpb24uTGVmdDoKLSAgICAgICAgICAgICAgICAgICByZXR1cm4gImwiOwotICAgICAgICAgICAgICAgY2FzZSBlTGFiZWxQb3NpdGlvbi5SaWdodDoKLSAgICAgICAgICAgICAgICAgICByZXR1cm4gInIiOwotICAgICAgICAgICAgICAgY2FzZSBlTGFiZWxQb3NpdGlvbi5Ub3A6Ci0gICAgICAgICAgICAgICAgICAgcmV0dXJuICJ0IjsKLSAgICAgICAgICAgICAgIGNhc2UgZUxhYmVsUG9zaXRpb24uT3V0RW5kOgotICAgICAgICAgICAgICAgICAgIHJldHVybiAib3V0RW5kIjsKLSAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgcmV0dXJuICJiZXN0Rml0IjsKLSAgICAgICAgICAgfQotICAgICAgIH0KLQotICAgICAgIHByb3RlY3RlZCBlTGFiZWxQb3NpdGlvbiBHZXRQb3NFbnVtKHN0cmluZyBwb3MpCi0gICAgICAgewotICAgICAgICAgICBzd2l0Y2ggKHBvcykKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgY2FzZSAiYiI6Ci0gICAgICAgICAgICAgICAgICAgcmV0dXJuIGVMYWJlbFBvc2l0aW9uLkJvdHRvbTsKLSAgICAgICAgICAgICAgIGNhc2UgImN0ciI6Ci0gICAgICAgICAgICAgICAgICAgcmV0dXJuIGVMYWJlbFBvc2l0aW9uLkNlbnRlcjsKLSAgICAgICAgICAgICAgIGNhc2UgImluQmFzZSI6Ci0gICAgICAgICAgICAgICAgICAgcmV0dXJuIGVMYWJlbFBvc2l0aW9uLkluQmFzZTsKLSAgICAgICAgICAgICAgIGNhc2UgImluRW5kIjoKLSAgICAgICAgICAgICAgICAgICByZXR1cm4gZUxhYmVsUG9zaXRpb24uSW5FbmQ7Ci0gICAgICAgICAgICAgICBjYXNlICJsIjoKLSAgICAgICAgICAgICAgICAgICByZXR1cm4gZUxhYmVsUG9zaXRpb24uTGVmdDsKLSAgICAgICAgICAgICAgIGNhc2UgInIiOgotICAgICAgICAgICAgICAgICAgIHJldHVybiBlTGFiZWxQb3NpdGlvbi5SaWdodDsKLSAgICAgICAgICAgICAgIGNhc2UgInQiOgotICAgICAgICAgICAgICAgICAgIHJldHVybiBlTGFiZWxQb3NpdGlvbi5Ub3A7Ci0gICAgICAgICAgICAgICBjYXNlICJvdXRFbmQiOgotICAgICAgICAgICAgICAgICAgIHJldHVybiBlTGFiZWxQb3NpdGlvbi5PdXRFbmQ7Ci0gICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgIHJldHVybiBlTGFiZWxQb3NpdGlvbi5CZXN0Rml0OwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICNlbmRyZWdpb24KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0TGVnZW5kLmNzIGIvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxDaGFydExlZ2VuZC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjViMTdiMi4uMDAwMDAwMAotLS0gYS9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0TGVnZW5kLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQotICoKLSAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCi0gKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCi0gKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKLSAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKLSAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCi0gKgotICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKLSAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMjAwOS0xMC0wMQotICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5YbWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlOwotCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0Ci17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBQb3NpdGlvbiBvZiB0aGUgbGVnZW5kCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZW51bSBlTGVnZW5kUG9zaXRpb24KLSAgICB7Ci0gICAgICAgIFRvcCwKLSAgICAgICAgTGVmdCwKLSAgICAgICAgUmlnaHQsCi0gICAgICAgIEJvdHRvbSwKLSAgICAgICAgVG9wUmlnaHQKLSAgICB9Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBDaGFydCBsZWRnZXIKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbENoYXJ0TGVnZW5kIDogWG1sSGVscGVyCi0gICAgewotICAgICAgICBFeGNlbENoYXJ0IF9jaGFydDsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxDaGFydExlZ2VuZChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIG5vZGUsIEV4Y2VsQ2hhcnQgY2hhcnQpCi0gICAgICAgICAgIDogYmFzZShucyxub2RlKQotICAgICAgIHsKLSAgICAgICAgICAgX2NoYXJ0PWNoYXJ0OwotICAgICAgICAgICBTY2hlbWFOb2RlT3JkZXIgPSBuZXcgc3RyaW5nW10geyAibGVnZW5kUG9zIiwgImxheW91dCIsIm92ZXJsYXkiLCAidHhQciIsICJib2R5UHIiLCAibHN0U3R5bGUiLCAic3BQciIgfTsKLSAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBQT1NJVElPTl9QQVRIID0gImM6bGVnZW5kUG9zL0B2YWwiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBQb3NpdGlvbiBvZiB0aGUgTGVnZW5kCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBlTGVnZW5kUG9zaXRpb24gUG9zaXRpb24gCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaChHZXRYbWxOb2RlU3RyaW5nKFBPU0lUSU9OX1BBVEgpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlICJ0IjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlTGVnZW5kUG9zaXRpb24uVG9wOwotICAgICAgICAgICAgICAgICAgICBjYXNlICJiIjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlTGVnZW5kUG9zaXRpb24uQm90dG9tOwotICAgICAgICAgICAgICAgICAgICBjYXNlICJsIjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlTGVnZW5kUG9zaXRpb24uTGVmdDsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAidHIiOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVMZWdlbmRQb3NpdGlvbi5Ub3BSaWdodDsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlTGVnZW5kUG9zaXRpb24uUmlnaHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKFRvcE5vZGUgPT0gbnVsbCkgdGhyb3cobmV3IEV4Y2VwdGlvbigiQ2FuJ3Qgc2V0IHBvc2l0aW9uLiBDaGFydCBoYXMgbm8gbGVnZW5kIikpOwotICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIGVMZWdlbmRQb3NpdGlvbi5Ub3A6Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFBPU0lUSU9OX1BBVEgsICJ0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBlTGVnZW5kUG9zaXRpb24uQm90dG9tOgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhQT1NJVElPTl9QQVRILCAiYiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgZUxlZ2VuZFBvc2l0aW9uLkxlZnQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFBPU0lUSU9OX1BBVEgsICJsIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBlTGVnZW5kUG9zaXRpb24uVG9wUmlnaHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFBPU0lUSU9OX1BBVEgsICJ0ciIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFBPU0lUSU9OX1BBVEgsICJyIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIE9WRVJMQVlfUEFUSCA9ICJjOm92ZXJsYXkvQHZhbCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIElmIHRoZSBsZWdlbmQgb3ZlcmxheXMgb3RoZXIgb2JqZWN0cwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBPdmVybGF5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChPVkVSTEFZX1BBVEgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKFRvcE5vZGUgPT0gbnVsbCkgdGhyb3cgKG5ldyBFeGNlcHRpb24oIkNhbid0IHNldCBvdmVybGF5LiBDaGFydCBoYXMgbm8gbGVnZW5kIikpOwotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKE9WRVJMQVlfUEFUSCwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEV4Y2VsRHJhd2luZ0ZpbGwgX2ZpbGwgPSBudWxsOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBGaWxsIHN0eWxlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbERyYXdpbmdGaWxsIEZpbGwKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9maWxsID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfZmlsbCA9IG5ldyBFeGNlbERyYXdpbmdGaWxsKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsICJjOnNwUHIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9maWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEV4Y2VsRHJhd2luZ0JvcmRlciBfYm9yZGVyID0gbnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQm9yZGVyIHN0eWxlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbERyYXdpbmdCb3JkZXIgQm9yZGVyCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfYm9yZGVyID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfYm9yZGVyID0gbmV3IEV4Y2VsRHJhd2luZ0JvcmRlcihOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCAiYzpzcFByL2E6bG4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9ib3JkZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRXhjZWxUZXh0Rm9udCBfZm9udCA9IG51bGw7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZvbnQgcHJvcGVydGllcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxUZXh0Rm9udCBGb250Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfZm9udCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiYzp0eFByIixOYW1lU3BhY2VNYW5hZ2VyKSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKCJjOnR4UHIvYTpib2R5UHIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZU5vZGUoImM6dHhQci9hOmxzdFN0eWxlIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgX2ZvbnQgPSBuZXcgRXhjZWxUZXh0Rm9udChOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCAiYzp0eFByL2E6cC9hOnBQci9hOmRlZlJQciIsIG5ldyBzdHJpbmdbXSB7ICJsZWdlbmRQb3MiLCAibGF5b3V0IiwgInBQciIsICJkZWZSUHIiLCAic29saWRGaWxsIiwgInVGaWxsIiwgImxhdGluIiwgImNzIiwgInIiLCAiclByIiwgInQiIH0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX2ZvbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmVtb3ZlIHRoZSBsZWdlbmQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHZvaWQgUmVtb3ZlKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKFRvcE5vZGUgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICAgICAgVG9wTm9kZS5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKFRvcE5vZGUpOwotICAgICAgICAgICAgVG9wTm9kZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkIGEgbGVnZW5kIHRvIHRoZSBjaGFydAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgdm9pZCBBZGQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihUb3BOb2RlIT1udWxsKSByZXR1cm47Ci0KLSAgICAgICAgICAgIC8vWG1sSGVscGVyIHhtbCA9IG5ldyBYbWxIZWxwZXIoTmFtZVNwYWNlTWFuYWdlciwgX2NoYXJ0LkNoYXJ0WG1sKTsKLSAgICAgICAgICAgIFhtbEhlbHBlciB4bWwgPSBYbWxIZWxwZXJGYWN0b3J5LkNyZWF0ZShOYW1lU3BhY2VNYW5hZ2VyLCBfY2hhcnQuQ2hhcnRYbWwpOwotICAgICAgICAgICAgeG1sLlNjaGVtYU5vZGVPcmRlcj1fY2hhcnQuU2NoZW1hTm9kZU9yZGVyOwotCi0gICAgICAgICAgICB4bWwuQ3JlYXRlTm9kZSgiYzpjaGFydFNwYWNlL2M6Y2hhcnQvYzpsZWdlbmQiKTsKLSAgICAgICAgICAgIFRvcE5vZGUgPSBfY2hhcnQuQ2hhcnRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiYzpjaGFydFNwYWNlL2M6Y2hhcnQvYzpsZWdlbmQiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIFRvcE5vZGUuSW5uZXJYbWw9IjxjOmxlZ2VuZFBvcyB2YWw9XCJyXCIgLz48YzpsYXlvdXQgLz4iOyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxDaGFydFBsb3RBcmVhLmNzIGIvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxDaGFydFBsb3RBcmVhLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmJiYWJlLi4wMDAwMDAwCi0tLSBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQ2hhcnRQbG90QXJlYS5jcworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQotICoKLSAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCi0gKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCi0gKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKLSAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKLSAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCi0gKgotICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKLSAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMjAwOS0xMi0zMAotICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uWG1sOwotCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0Ci17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBIGNoYXJ0cyBwbG90IGFyZWEKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxDaGFydFBsb3RBcmVhIDogIFhtbEhlbHBlcgotICAgIHsKLSAgICAgICAgRXhjZWxDaGFydCBfZmlyc3RDaGFydDsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxDaGFydFBsb3RBcmVhKFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsIFhtbE5vZGUgbm9kZSwgRXhjZWxDaGFydCBmaXJzdENoYXJ0KQotICAgICAgICAgICA6IGJhc2UobnMsbm9kZSkKLSAgICAgICB7Ci0gICAgICAgICAgIF9maXJzdENoYXJ0ID0gZmlyc3RDaGFydDsKLSAgICAgICB9Ci0KLSAgICAgICAgRXhjZWxDaGFydENvbGxlY3Rpb24gX2NoYXJ0VHlwZXM7Ci0gICAgICAgIHB1YmxpYyBFeGNlbENoYXJ0Q29sbGVjdGlvbiBDaGFydFR5cGVzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfY2hhcnRUeXBlcyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2NoYXJ0VHlwZXMgPSBuZXcgRXhjZWxDaGFydENvbGxlY3Rpb24oX2ZpcnN0Q2hhcnQpOyAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9jaGFydFR5cGVzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEV4Y2VsRHJhd2luZ0ZpbGwgX2ZpbGwgPSBudWxsOwotICAgICAgICBwdWJsaWMgRXhjZWxEcmF3aW5nRmlsbCBGaWxsCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfZmlsbCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2ZpbGwgPSBuZXcgRXhjZWxEcmF3aW5nRmlsbChOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCAiYzpzcFByIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfZmlsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBFeGNlbERyYXdpbmdCb3JkZXIgX2JvcmRlciA9IG51bGw7Ci0gICAgICAgIHB1YmxpYyBFeGNlbERyYXdpbmdCb3JkZXIgQm9yZGVyCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfYm9yZGVyID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfYm9yZGVyID0gbmV3IEV4Y2VsRHJhd2luZ0JvcmRlcihOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCAiYzpzcFByL2E6bG4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9ib3JkZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0U2VyaWUuY3MgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0U2VyaWUuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOTY3YjQuLjAwMDAwMDAKLS0tIGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxDaGFydFNlcmllLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQotICoKLSAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCi0gKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCi0gKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKLSAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKLSAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCi0gKgotICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKLSAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMjAwOS0xMi0zMAotICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uWG1sOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwotCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0Ci17Ci0gICAvLy8gPHN1bW1hcnk+Ci0gICAvLy8gQSBjaGFydCBzZXJpZQotICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxDaGFydFNlcmllIDogWG1sSGVscGVyCi0gICB7Ci0gICAgICAgaW50ZXJuYWwgRXhjZWxDaGFydFNlcmllcyBfY2hhcnRTZXJpZXM7Ci0gICAgICAgcHJvdGVjdGVkIFhtbE5vZGUgX25vZGU7Ci0gICAgICAgcHJvdGVjdGVkIFhtbE5hbWVzcGFjZU1hbmFnZXIgX25zOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2hhcnRTZXJpZXMiPlBhcmVudCBjb2xsZWN0aW9uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJucyI+TmFtZXNwYWNlbWFuYWdlcjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibm9kZSI+VG9wbm9kZTwvcGFyYW0+Ci0gICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpc1Bpdm90Ij5JcyBwaXZvdGNoYXJ0PC9wYXJhbT4KLSAgICAgICBpbnRlcm5hbCBFeGNlbENoYXJ0U2VyaWUoRXhjZWxDaGFydFNlcmllcyBjaGFydFNlcmllcywgWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSBub2RlLCBib29sIGlzUGl2b3QpCi0gICAgICAgICAgIDogYmFzZShucyxub2RlKQotICAgICAgIHsKLSAgICAgICAgICAgX2NoYXJ0U2VyaWVzID0gY2hhcnRTZXJpZXM7Ci0gICAgICAgICAgIF9ub2RlPW5vZGU7Ci0gICAgICAgICAgIF9ucz1uczsKLSAgICAgICAgICAgU2NoZW1hTm9kZU9yZGVyID0gbmV3IHN0cmluZ1tdIHsgImlkeCIsICJvcmRlciIsInNwUHIiLCAidHgiLCAibWFya2VyIiwgInRyZW5kbGluZSIsICJleHBsb3Npb24iLCJpbnZlcnRJZk5lZ2F0aXZlIiwgImRMYmxzIiwgImNhdCIsICJ2YWwiLCAieFZhbCIsICJ5VmFsIiwgImJ1YmJsZVNpemUiLCAiYnViYmxlM0QiLCAic21vb3RoIiB9OwotCi0gICAgICAgICAgIGlmIChjaGFydFNlcmllcy5DaGFydC5DaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXIgfHwKLSAgICAgICAgICAgICAgIGNoYXJ0U2VyaWVzLkNoYXJ0LkNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlckxpbmVzIHx8Ci0gICAgICAgICAgICAgICBjaGFydFNlcmllcy5DaGFydC5DaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXJMaW5lc05vTWFya2VycyB8fAotICAgICAgICAgICAgICAgY2hhcnRTZXJpZXMuQ2hhcnQuQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuWFlTY2F0dGVyU21vb3RoIHx8Ci0gICAgICAgICAgICAgICBjaGFydFNlcmllcy5DaGFydC5DaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXJTbW9vdGhOb01hcmtlcnMgfHwKLSAgICAgICAgICAgICAgIGNoYXJ0U2VyaWVzLkNoYXJ0LkNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkJ1YmJsZSB8fAotICAgICAgICAgICAgICAgY2hhcnRTZXJpZXMuQ2hhcnQuQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQnViYmxlM0RFZmZlY3QpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIF9zZXJpZXNUb3BQYXRoID0gImM6eVZhbCI7Ci0gICAgICAgICAgICAgICBfeFNlcmllc1RvcFBhdGggPSAiYzp4VmFsIjsKLSAgICAgICAgICAgfQotICAgICAgICAgICBlbHNlCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIF9zZXJpZXNUb3BQYXRoID0gImM6dmFsIjsKLSAgICAgICAgICAgICAgIF94U2VyaWVzVG9wUGF0aCA9ICJjOmNhdCI7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgX3Nlcmllc1BhdGggPSBzdHJpbmcuRm9ybWF0KF9zZXJpZXNQYXRoLCBfc2VyaWVzVG9wUGF0aCk7Ci0gICAgICAgICAgIF94U2VyaWVzUGF0aCA9IHN0cmluZy5Gb3JtYXQoX3hTZXJpZXNQYXRoLCBfeFNlcmllc1RvcFBhdGgsIGlzUGl2b3QgPyAiYzptdWx0aUx2bFN0clJlZiIgOiAiYzpudW1SZWYiKTsKLSAgICAgICB9Ci0gICAgICAgaW50ZXJuYWwgdm9pZCBTZXRJRChzdHJpbmcgaWQpCi0gICAgICAgewotICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJjOmlkeC9AdmFsIixpZCk7Ci0gICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoImM6b3JkZXIvQHZhbCIsIGlkKTsKLSAgICAgICB9Ci0gICAgICAgY29uc3Qgc3RyaW5nIGhlYWRlclBhdGg9ImM6dHgvYzp2IjsKLSAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgLy8vIEhlYWRlciBmb3IgdGhlIHNlcmllLgotICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgcHVibGljIHN0cmluZyBIZWFkZXIgCi0gICAgICAgewotICAgICAgICAgICBnZXQKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKGhlYWRlclBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2xlYXJ0eCgpOwotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoaGVhZGVyUGF0aCwgdmFsdWUpOyAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICBwcml2YXRlIHZvaWQgQ2xlYXJ0eCgpCi0gICAgICAgewotICAgICAgICAgICB2YXIgbiA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiYzp0eCIsIE5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICBpZiAobiAhPSBudWxsKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBuLklubmVyWG1sID0gIiI7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgY29uc3Qgc3RyaW5nIGhlYWRlckFkZHJlc3NQYXRoID0gImM6dHgvYzpzdHJSZWYvYzpmIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgIC8vLyBIZWFkZXIgYWRkcmVzcyBmb3IgdGhlIHNlcmllLgotICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgcHVibGljIEV4Y2VsQWRkcmVzc0Jhc2UgSGVhZGVyQWRkcmVzcwotICAgICAgIHsKLSAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHN0cmluZyBhZGRyZXNzID0gR2V0WG1sTm9kZVN0cmluZyhoZWFkZXJBZGRyZXNzUGF0aCk7Ci0gICAgICAgICAgICAgICBpZiAoYWRkcmVzcyA9PSAiIikKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQWRkcmVzc0Jhc2UoYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKHZhbHVlLl9mcm9tQ29sICE9IHZhbHVlLl90b0NvbCAmJiB2YWx1ZS5fZnJvbVJvdyAhPSB2YWx1ZS5fdG9Sb3cpIHx8IHZhbHVlLkFkZHJlc3NlcyAhPSBudWxsKSAvL1NpbmdsZSBjZWxsIHJlbW92ZWQsIGFsbG93IHJvdyAmIGNvbHVtbiAtLT4gaXNzdWUgMTUxMDIuIAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiQWRkcmVzcyBtdXN0IGJlIGEgcm93LCBjb2x1bW4gb3Igc2luZ2xlIGNlbGwiKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQ2xlYXJ0eCgpOwotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoaGVhZGVyQWRkcmVzc1BhdGgsIEV4Y2VsQ2VsbEJhc2UuR2V0RnVsbEFkZHJlc3ModmFsdWUuV29ya1NoZWV0LCB2YWx1ZS5BZGRyZXNzKSk7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiYzp0eC9jOnN0clJlZi9jOnN0ckNhY2hlL2M6cHRDb3VudC9AdmFsIiwgIjAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIHN0cmluZyBfc2VyaWVzVG9wUGF0aDsKLSAgICAgICAgc3RyaW5nIF9zZXJpZXNQYXRoID0gInswfS9jOm51bVJlZi9jOmYiOyAgICAgICAKLSAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgLy8vIFNldCB0aGlzIHRvIGEgdmFsaWQgYWRkcmVzcyBvciB0aGUgZHJhd2luZyB3aWxsIGJlIGludmFsaWQuCi0gICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgU2VyaWVzCi0gICAgICAgewotICAgICAgICAgICBnZXQKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoX3Nlcmllc1BhdGgpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIHNldAotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBDcmVhdGVOb2RlKF9zZXJpZXNQYXRoLHRydWUpOwotICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfc2VyaWVzUGF0aCwgRXhjZWxDZWxsQmFzZS5HZXRGdWxsQWRkcmVzcyhfY2hhcnRTZXJpZXMuQ2hhcnQuV29ya1NoZWV0Lk5hbWUsIHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIFhtbE5vZGUgY2FjaGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoc3RyaW5nLkZvcm1hdCgiezB9L2M6bnVtUmVmL2M6bnVtQ2FjaGUiLF9zZXJpZXNUb3BQYXRoKSwgX25zKTsKLSAgICAgICAgICAgICAgIGlmIChjYWNoZSAhPSBudWxsKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIGNhY2hlLlBhcmVudE5vZGUuUmVtb3ZlQ2hpbGQoY2FjaGUpOwotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICBpZiAoX2NoYXJ0U2VyaWVzLkNoYXJ0LlBpdm90VGFibGVTb3VyY2UgIT0gbnVsbCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKHN0cmluZy5Gb3JtYXQoInswfS9jOm51bVJlZi9jOm51bUNhY2hlIiwgX3Nlcmllc1RvcFBhdGgpLCAiR2VuZXJhbCIpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICBYbWxOb2RlIGxpdCA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShzdHJpbmcuRm9ybWF0KCJ7MH0vYzpudW1MaXQiLF9zZXJpZXNUb3BQYXRoKSwgX25zKTsKLSAgICAgICAgICAgICAgIGlmIChsaXQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBsaXQuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChsaXQpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0KLSAgICAgICB9Ci0gICAgICAgc3RyaW5nIF94U2VyaWVzVG9wUGF0aDsKLSAgICAgICBzdHJpbmcgX3hTZXJpZXNQYXRoID0gInswfS97MX0vYzpmIjsKLSAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgLy8vIFNldCBhbiBhZGRyZXNzIGZvciB0aGUgaG9yaXNvbnRhbCBsYWJlbHMKLSAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBYU2VyaWVzCi0gICAgICAgewotICAgICAgICAgICBnZXQKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoX3hTZXJpZXNQYXRoKTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBzZXQKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgQ3JlYXRlTm9kZShfeFNlcmllc1BhdGgsIHRydWUpOwotICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfeFNlcmllc1BhdGgsIEV4Y2VsQ2VsbEJhc2UuR2V0RnVsbEFkZHJlc3MoX2NoYXJ0U2VyaWVzLkNoYXJ0LldvcmtTaGVldC5OYW1lLCB2YWx1ZSkpOwotCi0gICAgICAgICAgICAgICBYbWxOb2RlIGNhY2hlID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKHN0cmluZy5Gb3JtYXQoInswfS9jOm51bVJlZi9jOm51bUNhY2hlIixfeFNlcmllc1RvcFBhdGgpLCBfbnMpOwotICAgICAgICAgICAgICAgaWYgKGNhY2hlICE9IG51bGwpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgY2FjaGUuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChjYWNoZSk7Ci0gICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIFhtbE5vZGUgbGl0ID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKHN0cmluZy5Gb3JtYXQoInswfS9jOm51bUxpdCIsX3hTZXJpZXNUb3BQYXRoKSwgX25zKTsKLSAgICAgICAgICAgICAgIGlmIChsaXQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBsaXQuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChsaXQpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIEV4Y2VsQ2hhcnRUcmVuZGxpbmVDb2xsZWN0aW9uIF90cmVuZExpbmVzID0gbnVsbDsKLSAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgLy8vIEFjY2VzcyB0byB0aGUgdHJlbmRsaW5lIGNvbGxlY3Rpb24KLSAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxDaGFydFRyZW5kbGluZUNvbGxlY3Rpb24gVHJlbmRMaW5lcwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX3RyZW5kTGluZXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF90cmVuZExpbmVzID0gbmV3IEV4Y2VsQ2hhcnRUcmVuZGxpbmVDb2xsZWN0aW9uKHRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX3RyZW5kTGluZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQ2hhcnRTZXJpZURhdGFMYWJlbC5jcyBiL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQ2hhcnRTZXJpZURhdGFMYWJlbC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzczODRmNy4uMDAwMDAwMAotLS0gYS9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0U2VyaWVEYXRhTGFiZWwuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCi0gKgotICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KLSAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKLSAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAotICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAotICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KLSAqCi0gKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAotICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkyMDA5LTEwLTAxCi0gKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5YbWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlOwotCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0Ci17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBEYXRhbGFiZWwgcHJvcGVydGllcwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHNlYWxlZCBjbGFzcyBFeGNlbENoYXJ0U2VyaWVEYXRhTGFiZWwgOiBFeGNlbENoYXJ0RGF0YUxhYmVsCi0gICAgewotICAgICAgIGludGVybmFsIEV4Y2VsQ2hhcnRTZXJpZURhdGFMYWJlbChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIG5vZGUpCi0gICAgICAgICAgIDogYmFzZShucyxub2RlKQotICAgICAgIHsKLSAgICAgICAgICAgQ3JlYXRlTm9kZShwb3NpdGlvblBhdGgpOwotICAgICAgICAgICBQb3NpdGlvbiA9IGVMYWJlbFBvc2l0aW9uLkNlbnRlcjsKLSAgICAgICB9Ci0KLSAgICAgICBjb25zdCBzdHJpbmcgcG9zaXRpb25QYXRoPSJjOmRMYmxQb3MvQHZhbCI7Ci0gICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgIC8vLyBQb3NpdGlvbiBvZiB0aGUgbGFiZWxzCi0gICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICBwdWJsaWMgZUxhYmVsUG9zaXRpb24gUG9zaXRpb24KLSAgICAgICB7Ci0gICAgICAgICAgIGdldAotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICByZXR1cm4gR2V0UG9zRW51bShHZXRYbWxOb2RlU3RyaW5nKHBvc2l0aW9uUGF0aCkpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIHNldAotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKHBvc2l0aW9uUGF0aCxHZXRQb3NUZXh0KHZhbHVlKSk7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgRXhjZWxEcmF3aW5nRmlsbCBfZmlsbCA9IG51bGw7Ci0gICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgIC8vLyBBY2Nlc3MgZmlsbCBwcm9wZXJ0aWVzCi0gICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIG5ldyBFeGNlbERyYXdpbmdGaWxsIEZpbGwKLSAgICAgICB7Ci0gICAgICAgICAgIGdldAotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAoX2ZpbGwgPT0gbnVsbCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBfZmlsbCA9IG5ldyBFeGNlbERyYXdpbmdGaWxsKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsICJjOnNwUHIiKTsKLSAgICAgICAgICAgICAgIH0gICAgCi0gICAgICAgICAgICAgICByZXR1cm4gX2ZpbGw7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgRXhjZWxEcmF3aW5nQm9yZGVyIF9ib3JkZXIgPSBudWxsOwotICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAvLy8gQWNjZXNzIGJvcmRlciBwcm9wZXJ0aWVzCi0gICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIG5ldyBFeGNlbERyYXdpbmdCb3JkZXIgQm9yZGVyCi0gICAgICAgewotICAgICAgICAgICBnZXQKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKF9ib3JkZXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBfYm9yZGVyID0gbmV3IEV4Y2VsRHJhd2luZ0JvcmRlcihOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCAiYzpzcFByL2E6bG4iKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIHJldHVybiBfYm9yZGVyOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIEV4Y2VsVGV4dEZvbnQgX2ZvbnQgPSBudWxsOwotICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAvLy8gQWNjZXNzIGZvbnQgcHJvcGVydGllcwotICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBuZXcgRXhjZWxUZXh0Rm9udCBGb250Ci0gICAgICAgewotICAgICAgICAgICBnZXQKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKF9mb250ID09IG51bGwpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgaWYgKFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiYzp0eFByIiwgTmFtZVNwYWNlTWFuYWdlcikgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZU5vZGUoImM6dHhQci9hOmJvZHlQciIpOwotICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKCJjOnR4UHIvYTpsc3RTdHlsZSIpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBfZm9udCA9IG5ldyBFeGNlbFRleHRGb250KE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsICJjOnR4UHIvYTpwL2E6cFByL2E6ZGVmUlByIiwgbmV3IHN0cmluZ1tdIHsgInNwUHIiLCAidHhQciIsICJkTGJsUG9zIiwgInNob3dWYWwiLCAic2hvd0NhdE5hbWUgIiwgInBQciIsICJkZWZSUHIiLCAic29saWRGaWxsIiwgInVGaWxsIiwgImxhdGluIiwgImNzIiwgInIiLCAiclByIiwgInQiIH0pOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgcmV0dXJuIF9mb250OwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQ2hhcnRTZXJpZXMuY3MgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0U2VyaWVzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWJiMDI4Li4wMDAwMDAwCi0tLSBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQ2hhcnRTZXJpZXMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw0MDYgKzAsMCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCi0gKgotICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KLSAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKLSAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAotICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAotICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KLSAqCi0gKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAotICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkyMDA5LTEwLTAxCi0gKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5YbWw7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlRhYmxlLlBpdm90VGFibGU7Ci1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0Ci17Ci0gICAgcHVibGljIHNlYWxlZCBjbGFzcyBFeGNlbEJ1YmJsZUNoYXJ0U2VyaWVzIDogRXhjZWxDaGFydFNlcmllcwotICAgIHsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxCdWJibGVDaGFydFNlcmllcyhFeGNlbENoYXJ0IGNoYXJ0LCBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIG5vZGUsIGJvb2wgaXNQaXZvdCkKLSAgICAgICAgICAgOiBiYXNlKGNoYXJ0LG5zLG5vZGUsIGlzUGl2b3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vX2NoYXJ0U2VyaWVzID0gbmV3IEV4Y2VsQ2hhcnRTZXJpZXModGhpcywgX2RyYXdpbmdzLk5hbWVTcGFjZU1hbmFnZXIsIF9jaGFydE5vZGUsIGlzUGl2b3QpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBFeGNlbENoYXJ0U2VyaWUgQWRkKEV4Y2VsUmFuZ2VCYXNlIFNlcmllLCBFeGNlbFJhbmdlQmFzZSBYU2VyaWUsIEV4Y2VsUmFuZ2VCYXNlIEJ1YmJsZVNpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBiYXNlLkFkZFNlcmllcyhTZXJpZS5GdWxsQWRkcmVzc0Fic29sdXRlLCBYU2VyaWUuRnVsbEFkZHJlc3NBYnNvbHV0ZSwgQnViYmxlU2l6ZS5GdWxsQWRkcmVzc0Fic29sdXRlKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgRXhjZWxDaGFydFNlcmllIEFkZChzdHJpbmcgU2VyaWVBZGRyZXNzLCBzdHJpbmcgWFNlcmllQWRkcmVzcywgc3RyaW5nIEJ1YmJsZVNpemVBZGRyZXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gYmFzZS5BZGRTZXJpZXMoU2VyaWVBZGRyZXNzLCBYU2VyaWVBZGRyZXNzLCBCdWJibGVTaXplQWRkcmVzcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgLy8vIENvbGxlY3Rpb24gY2xhc3MgZm9yIGNoYXJ0IHNlcmllcwotICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxDaGFydFNlcmllcyA6IFhtbEhlbHBlciwgSUVudW1lcmFibGUKLSAgICB7Ci0gICAgICAgTGlzdDxFeGNlbENoYXJ0U2VyaWU+IF9saXN0PW5ldyBMaXN0PEV4Y2VsQ2hhcnRTZXJpZT4oKTsKLSAgICAgICBpbnRlcm5hbCBFeGNlbENoYXJ0IF9jaGFydDsKLSAgICAgICBYbWxOb2RlIF9ub2RlOwotICAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgX25zOwotICAgICAgIGludGVybmFsIEV4Y2VsQ2hhcnRTZXJpZXMoRXhjZWxDaGFydCBjaGFydCwgWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSBub2RlLCBib29sIGlzUGl2b3QpCi0gICAgICAgICAgIDogYmFzZShucyxub2RlKQotICAgICAgIHsKLSAgICAgICAgICAgX25zID0gbnM7Ci0gICAgICAgICAgIF9jaGFydD1jaGFydDsKLSAgICAgICAgICAgX25vZGU9bm9kZTsKLSAgICAgICAgICAgX2lzUGl2b3QgPSBpc1Bpdm90OwotICAgICAgICAgICBTY2hlbWFOb2RlT3JkZXIgPSBuZXcgc3RyaW5nW10geyAidmlldzNEIiwgInBsb3RBcmVhIiwgImJhckRpciIsICJncm91cGluZyIsICJzY2F0dGVyU3R5bGUiLCAidmFyeUNvbG9ycyIsICJzZXIiLCAiZXhwbG9zaW9uIiwgImRMYmxzIiwgImZpcnN0U2xpY2VBbmciLCAiaG9sZVNpemUiLCAic2hhcGUiLCAibGVnZW5kIiwgImF4SWQiIH07Ci0gICAgICAgICAgIGZvcmVhY2goWG1sTm9kZSBuIGluIG5vZGUuU2VsZWN0Tm9kZXMoImM6c2VyIixucykpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIEV4Y2VsQ2hhcnRTZXJpZSBzOwotICAgICAgICAgICAgICAgaWYgKGNoYXJ0LkNoYXJ0Tm9kZS5Mb2NhbE5hbWUgPT0gInNjYXR0ZXJDaGFydCIpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgcyA9IG5ldyBFeGNlbFNjYXR0ZXJDaGFydFNlcmllKHRoaXMsIG5zLCBuLCBpc1Bpdm90KTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoYXJ0LkNoYXJ0Tm9kZS5Mb2NhbE5hbWUgPT0gImxpbmVDaGFydCIpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgcyA9IG5ldyBFeGNlbExpbmVDaGFydFNlcmllKHRoaXMsIG5zLCBuLCBpc1Bpdm90KTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoYXJ0LkNoYXJ0Tm9kZS5Mb2NhbE5hbWUgPT0gInBpZUNoYXJ0IiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnQuQ2hhcnROb2RlLkxvY2FsTmFtZSA9PSAib2ZQaWVDaGFydCIgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0LkNoYXJ0Tm9kZS5Mb2NhbE5hbWUgPT0gInBpZTNEQ2hhcnQiIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFydC5DaGFydE5vZGUuTG9jYWxOYW1lID09ICJkb3VnaG51dENoYXJ0IikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIHMgPSBuZXcgRXhjZWxQaWVDaGFydFNlcmllKHRoaXMsIG5zLCBuLCBpc1Bpdm90KTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBzID0gbmV3IEV4Y2VsQ2hhcnRTZXJpZSh0aGlzLCBucywgbiwgaXNQaXZvdCk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBfbGlzdC5BZGQocyk7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0KLSAgICAgICAjcmVnaW9uIElFbnVtZXJhYmxlIE1lbWJlcnMKLQotICAgICAgIHB1YmxpYyBJRW51bWVyYXRvciBHZXRFbnVtZXJhdG9yKCkKLSAgICAgICB7Ci0gICAgICAgICAgIHJldHVybiAoX2xpc3QuR2V0RW51bWVyYXRvcigpKTsKLSAgICAgICB9Ci0gICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgIC8vLyBSZXR1cm5zIHRoZSBzZXJpZSBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiAgCi0gICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlBvc2l0aW9uSUQiPlRoZSBwb3NpdGlvbiBvZiB0aGUgc2VyaWVzLjwvcGFyYW0+Ci0gICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICBwdWJsaWMgRXhjZWxDaGFydFNlcmllIHRoaXNbaW50IFBvc2l0aW9uSURdCi0gICAgICAgewotICAgICAgICAgICBnZXQKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuIChfbGlzdFtQb3NpdGlvbklEXSk7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgcHVibGljIGludCBDb3VudAotICAgICAgIHsKLSAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiBfbGlzdC5Db3VudDsKLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgLy8vIERlbGV0ZSB0aGUgY2hhcnQgYXQgdGhlIHNwZWNpZmljIHBvc2l0aW9uCi0gICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlBvc2l0aW9uSUQiPlplcm8gYmFzZWQ8L3BhcmFtPgotICAgICAgIHB1YmxpYyB2b2lkIERlbGV0ZShpbnQgUG9zaXRpb25JRCkKLSAgICAgICB7Ci0gICAgICAgICAgIEV4Y2VsQ2hhcnRTZXJpZSBzZXIgPSBfbGlzdFtQb3NpdGlvbklEXTsKLSAgICAgICAgICAgc2VyLlRvcE5vZGUuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChzZXIuVG9wTm9kZSk7Ci0gICAgICAgICAgIF9saXN0LlJlbW92ZUF0KFBvc2l0aW9uSUQpOwotICAgICAgIH0KLSAgICAgICAjZW5kcmVnaW9uCi0gICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgIC8vLyBBIHJlZmVyZW5jZSB0byB0aGUgY2hhcnQgb2JqZWN0Ci0gICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICBwdWJsaWMgRXhjZWxDaGFydCBDaGFydAotICAgICAgIHsKLSAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiBfY2hhcnQ7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgI3JlZ2lvbiAiQWRkIFNlcmllcyIKLQotICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAvLy8gQWRkIGEgbmV3IHNlcmllIHRvIHRoZSBjaGFydC4gRG8gbm90IGFwcGx5IHRvIHBpdm90Y2hhcnRzLgotICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgLy8vIDxwYXJhbSBuYW1lPSJTZXJpZSI+VGhlIFktQXhpcyByYW5nZTwvcGFyYW0+Ci0gICAgICAgLy8vIDxwYXJhbSBuYW1lPSJYU2VyaWUiPlRoZSBYLUF4aXMgcmFuZ2U8L3BhcmFtPgotICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgcHVibGljIHZpcnR1YWwgRXhjZWxDaGFydFNlcmllIEFkZChFeGNlbFJhbmdlQmFzZSBTZXJpZSwgRXhjZWxSYW5nZUJhc2UgWFNlcmllKQotICAgICAgIHsKLSAgICAgICAgICAgaWYgKF9jaGFydC5QaXZvdFRhYmxlU291cmNlICE9IG51bGwpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHRocm93IChuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2FuJ3QgYWRkIGEgc2VyaWUgdG8gYSBwaXZvdGNoYXJ0IikpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIHJldHVybiBBZGRTZXJpZXMoU2VyaWUuRnVsbEFkZHJlc3NBYnNvbHV0ZSwgWFNlcmllLkZ1bGxBZGRyZXNzQWJzb2x1dGUsIiIpOwotICAgICAgIH0KLSAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgLy8vIEFkZCBhIG5ldyBzZXJpZSB0byB0aGUgY2hhcnQuRG8gbm90IGFwcGx5IHRvIHBpdm90Y2hhcnRzLgotICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgLy8vIDxwYXJhbSBuYW1lPSJTZXJpZUFkZHJlc3MiPlRoZSBZLUF4aXMgcmFuZ2U8L3BhcmFtPgotICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iWFNlcmllQWRkcmVzcyI+VGhlIFgtQXhpcyByYW5nZTwvcGFyYW0+Ci0gICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICBwdWJsaWMgdmlydHVhbCBFeGNlbENoYXJ0U2VyaWUgQWRkKHN0cmluZyBTZXJpZUFkZHJlc3MsIHN0cmluZyBYU2VyaWVBZGRyZXNzKQotICAgICAgIHsKLSAgICAgICAgICAgaWYgKF9jaGFydC5QaXZvdFRhYmxlU291cmNlICE9IG51bGwpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHRocm93IChuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2FuJ3QgYWRkIGEgc2VyaWUgdG8gYSBwaXZvdGNoYXJ0IikpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIHJldHVybiBBZGRTZXJpZXMoU2VyaWVBZGRyZXNzLCBYU2VyaWVBZGRyZXNzLCAiIik7Ci0gICAgICAgfQotICAgICAgIGludGVybmFsIHByb3RlY3RlZCBFeGNlbENoYXJ0U2VyaWUgQWRkU2VyaWVzKHN0cmluZyBTZXJpZXNBZGRyZXNzLCBzdHJpbmcgWFNlcmllc0FkZHJlc3MsIHN0cmluZyBidWJibGVTaXplQWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgICAgWG1sRWxlbWVudCBzZXIgPSBfbm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoInNlciIsIEV4Y2VsUGFja2FnZS5zY2hlbWFDaGFydCk7Ci0gICAgICAgICAgICAgICBYbWxOb2RlTGlzdCBub2RlID0gX25vZGUuU2VsZWN0Tm9kZXMoImM6c2VyIiwgX25zKTsKLSAgICAgICAgICAgICAgIGlmIChub2RlLkNvdW50ID4gMCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBfbm9kZS5JbnNlcnRBZnRlcihzZXIsIG5vZGVbbm9kZS5Db3VudC0xXSk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgSW5zZXJBZnRlcihfbm9kZSwgImM6dmFyeUNvbG9ycyxjOmdyb3VwaW5nLGM6YmFyRGlyLGM6c2NhdHRlclN0eWxlIiwgc2VyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBpbnQgaWR4ID0gRmluZEluZGV4KCk7Ci0gICAgICAgICAgICAgICBzZXIuSW5uZXJYbWwgPSBzdHJpbmcuRm9ybWF0KCI8YzppZHggdmFsPVwiezF9XCIgLz48YzpvcmRlciB2YWw9XCJ7MX1cIiAvPjxjOnR4PjxjOnN0clJlZj48YzpmPjwvYzpmPjxjOnN0ckNhY2hlPjxjOnB0Q291bnQgdmFsPVwiMVwiIC8+PC9jOnN0ckNhY2hlPjwvYzpzdHJSZWY+PC9jOnR4Pns1fXswfXsyfXszfXs0fSIsIEFkZEV4cGxvc2lvbihDaGFydC5DaGFydFR5cGUpLCBpZHgsIEFkZFNjYXR0ZXJQb2ludChDaGFydC5DaGFydFR5cGUpLCBBZGRBeGlzTm9kZXMoQ2hhcnQuQ2hhcnRUeXBlKSwgQWRkU21vb3RoKENoYXJ0LkNoYXJ0VHlwZSksIEFkZE1hcmtlcihDaGFydC5DaGFydFR5cGUpKTsKLSAgICAgICAgICAgICAgIEV4Y2VsQ2hhcnRTZXJpZSBzZXJpZTsKLSAgICAgICAgICAgICAgIHN3aXRjaCAoQ2hhcnQuQ2hhcnRUeXBlKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5CdWJibGU6Ci0gICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkJ1YmJsZTNERWZmZWN0OgotICAgICAgICAgICAgICAgICAgICAgICBzZXJpZSA9IG5ldyBFeGNlbEJ1YmJsZUNoYXJ0U2VyaWUodGhpcywgTmFtZVNwYWNlTWFuYWdlciwgc2VyLCBfaXNQaXZvdCkKLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgQnViYmxlM0Q9Q2hhcnQuQ2hhcnRUeXBlPT1lQ2hhcnRUeXBlLkJ1YmJsZTNERWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VyaWVzID0gU2VyaWVzQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTZXJpZXMgPSBYU2VyaWVzQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1YmJsZVNpemUgPSBidWJibGVTaXplQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlhZU2NhdHRlcjoKLSAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuWFlTY2F0dGVyTGluZXM6Ci0gICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlhZU2NhdHRlckxpbmVzTm9NYXJrZXJzOgotICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5YWVNjYXR0ZXJTbW9vdGg6Ci0gICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlhZU2NhdHRlclNtb290aE5vTWFya2VyczoKLSAgICAgICAgICAgICAgICAgICAgICAgc2VyaWUgPSBuZXcgRXhjZWxTY2F0dGVyQ2hhcnRTZXJpZSh0aGlzLCBOYW1lU3BhY2VNYW5hZ2VyLCBzZXIsIF9pc1Bpdm90KTsKLSAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlJhZGFyOgotICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5SYWRhckZpbGxlZDoKLSAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuUmFkYXJNYXJrZXJzOgotICAgICAgICAgICAgICAgICAgICAgICBzZXJpZSA9IG5ldyBFeGNlbFJhZGFyQ2hhcnRTZXJpZSh0aGlzLCBOYW1lU3BhY2VNYW5hZ2VyLCBzZXIsIF9pc1Bpdm90KTsKLSAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlN1cmZhY2U6Ci0gICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlN1cmZhY2VUb3BWaWV3OgotICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5TdXJmYWNlVG9wVmlld1dpcmVmcmFtZToKLSAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuU3VyZmFjZVdpcmVmcmFtZToKLSAgICAgICAgICAgICAgICAgICAgICAgc2VyaWUgPSBuZXcgRXhjZWxTdXJmYWNlQ2hhcnRTZXJpZSh0aGlzLCBOYW1lU3BhY2VNYW5hZ2VyLCBzZXIsIF9pc1Bpdm90KTsKLSAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlBpZToKLSAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuUGllM0Q6Ci0gICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlBpZUV4cGxvZGVkOgotICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5QaWVFeHBsb2RlZDNEOgotICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5QaWVPZlBpZToKLSAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuRG91Z2hudXQ6Ci0gICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkRvdWdobnV0RXhwbG9kZWQ6Ci0gICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkJhck9mUGllOgotICAgICAgICAgICAgICAgICAgICAgICBzZXJpZSA9IG5ldyBFeGNlbFBpZUNoYXJ0U2VyaWUodGhpcywgTmFtZVNwYWNlTWFuYWdlciwgc2VyLCBfaXNQaXZvdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5MaW5lOgotICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5MaW5lTWFya2VyczoKLSAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuTGluZU1hcmtlcnNTdGFja2VkOgotICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5MaW5lTWFya2Vyc1N0YWNrZWQxMDA6Ci0gICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkxpbmVTdGFja2VkOgotICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5MaW5lU3RhY2tlZDEwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgc2VyaWUgPSBuZXcgRXhjZWxMaW5lQ2hhcnRTZXJpZSh0aGlzLCBOYW1lU3BhY2VNYW5hZ2VyLCBzZXIsIF9pc1Bpdm90KTsKLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKENoYXJ0LkNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkxpbmVNYXJrZXJzIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFydC5DaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5MaW5lTWFya2Vyc1N0YWNrZWQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJ0LkNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLkxpbmVNYXJrZXJzU3RhY2tlZDEwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFeGNlbExpbmVDaGFydFNlcmllKXNlcmllKS5NYXJrZXIgPSBlTWFya2VyU3R5bGUuU3F1YXJlOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICgoRXhjZWxMaW5lQ2hhcnRTZXJpZSlzZXJpZSkuU21vb3RoID0gKChFeGNlbExpbmVDaGFydClDaGFydCkuU21vb3RoOwotICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQmFyQ2x1c3RlcmVkOgotICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5CYXJTdGFja2VkOgotICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5CYXJTdGFja2VkMTAwOgotICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5Db2x1bW5DbHVzdGVyZWQ6Ci0gICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQ6Ci0gICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQxMDA6Ci0gICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkJhckNsdXN0ZXJlZDNEOgotICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5CYXJTdGFja2VkM0Q6Ci0gICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkJhclN0YWNrZWQxMDAzRDoKLSAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ29sdW1uQ2x1c3RlcmVkM0Q6Ci0gICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbHVtblN0YWNrZWQzRDoKLSAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ29sdW1uU3RhY2tlZDEwMDNEOgotICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5Db25lQmFyQ2x1c3RlcmVkOgotICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5Db25lQmFyU3RhY2tlZDoKLSAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ29uZUJhclN0YWNrZWQxMDA6Ci0gICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbmVDb2w6Ci0gICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbmVDb2xDbHVzdGVyZWQ6Ci0gICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkNvbmVDb2xTdGFja2VkOgotICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5Db25lQ29sU3RhY2tlZDEwMDoKLSAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ3lsaW5kZXJCYXJDbHVzdGVyZWQ6Ci0gICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkN5bGluZGVyQmFyU3RhY2tlZDoKLSAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ3lsaW5kZXJCYXJTdGFja2VkMTAwOgotICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5DeWxpbmRlckNvbDoKLSAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ3lsaW5kZXJDb2xDbHVzdGVyZWQ6Ci0gICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLkN5bGluZGVyQ29sU3RhY2tlZDoKLSAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuQ3lsaW5kZXJDb2xTdGFja2VkMTAwOgotICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5QeXJhbWlkQmFyQ2x1c3RlcmVkOgotICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5QeXJhbWlkQmFyU3RhY2tlZDoKLSAgICAgICAgICAgICAgICAgICBjYXNlIGVDaGFydFR5cGUuUHlyYW1pZEJhclN0YWNrZWQxMDA6Ci0gICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlB5cmFtaWRDb2w6Ci0gICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlB5cmFtaWRDb2xDbHVzdGVyZWQ6Ci0gICAgICAgICAgICAgICAgICAgY2FzZSBlQ2hhcnRUeXBlLlB5cmFtaWRDb2xTdGFja2VkOgotICAgICAgICAgICAgICAgICAgIGNhc2UgZUNoYXJ0VHlwZS5QeXJhbWlkQ29sU3RhY2tlZDEwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgc2VyaWUgPSBuZXcgRXhjZWxCYXJDaGFydFNlcmllKHRoaXMsIE5hbWVTcGFjZU1hbmFnZXIsIHNlciwgX2lzUGl2b3QpOwotICAgICAgICAgICAgICAgICAgICAgICAoKEV4Y2VsQmFyQ2hhcnRTZXJpZSlzZXJpZSkuSW52ZXJ0SWZOZWdhdGl2ZT1mYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgc2VyaWUgPSBuZXcgRXhjZWxDaGFydFNlcmllKHRoaXMsIE5hbWVTcGFjZU1hbmFnZXIsIHNlciwgX2lzUGl2b3QpOwotICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIHNlcmllLlNlcmllcyA9IFNlcmllc0FkZHJlc3M7Ci0gICAgICAgICAgICAgICBzZXJpZS5YU2VyaWVzID0gWFNlcmllc0FkZHJlc3M7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgIF9saXN0LkFkZChzZXJpZSk7Ci0gICAgICAgICAgICAgICByZXR1cm4gc2VyaWU7Ci0gICAgICAgIH0KLSAgICAgICBib29sIF9pc1Bpdm90OwotICAgICAgIGludGVybmFsIHZvaWQgQWRkUGl2b3RTZXJpZShFeGNlbFBpdm90VGFibGUgcGl2b3RUYWJsZVNvdXJjZSkKLSAgICAgICB7Ci0gICAgICAgICAgIHZhciByPXBpdm90VGFibGVTb3VyY2UuV29ya1NoZWV0LkNlbGxzW3Bpdm90VGFibGVTb3VyY2UuQWRkcmVzcy5BZGRyZXNzXTsKLSAgICAgICAgICAgX2lzUGl2b3QgPSB0cnVlOwotICAgICAgICAgICBBZGRTZXJpZXMoci5PZmZzZXQoMCwgMSwgci5fdG9Sb3cgLSByLl9mcm9tUm93ICsgMSwgMSkuRnVsbEFkZHJlc3NBYnNvbHV0ZSwgci5PZmZzZXQoMCwgMCwgci5fdG9Sb3cgLSByLl9mcm9tUm93ICsgMSwgMSkuRnVsbEFkZHJlc3NBYnNvbHV0ZSwiIik7Ci0gICAgICAgfQotICAgICAgIHByaXZhdGUgaW50IEZpbmRJbmRleCgpCi0gICAgICAgeyAgICAKLSAgICAgICAgICAgaW50IHJldCA9IDAsIG5ld0lEPTA7Ci0gICAgICAgICAgIGlmIChfY2hhcnQuUGxvdEFyZWEuQ2hhcnRUeXBlcy5Db3VudCA+IDEpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjaGFydCBpbiBfY2hhcnQuUGxvdEFyZWEuQ2hhcnRUeXBlcykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBpZiAobmV3SUQ+MCkKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKEV4Y2VsQ2hhcnRTZXJpZSBzZXJpZSBpbiBjaGFydC5TZXJpZXMpCi0gICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmllLlNldElEKCgrK25ld0lEKS5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hhcnQgPT0gX2NoYXJ0KQotICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgKz0gX2xpc3QuQ291bnQgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SUQ9cmV0OwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ICs9IGNoYXJ0LlNlcmllcy5Db3VudDsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIHJldHVybiByZXQtMTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBlbHNlCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiBfbGlzdC5Db3VudDsKLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICAjZW5kcmVnaW9uCi0gICAgICAgI3JlZ2lvbiAiWG1sIGluaXQgRnVuY3Rpb25zIgotICAgICAgIHByaXZhdGUgc3RyaW5nIEFkZE1hcmtlcihlQ2hhcnRUeXBlIGNoYXJ0VHlwZSkKLSAgICAgICB7Ci0gICAgICAgICAgIGlmIChjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5MaW5lIHx8Ci0gICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5MaW5lU3RhY2tlZCB8fAotICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuTGluZVN0YWNrZWQxMDAgfHwKLSAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlckxpbmVzIHx8Ci0gICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXJTbW9vdGggfHwKLSAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlckxpbmVzTm9NYXJrZXJzIHx8Ci0gICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXJTbW9vdGhOb01hcmtlcnMpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiAiPGM6bWFya2VyPjxjOnN5bWJvbCB2YWw9XCJub25lXCIgLz48L2M6bWFya2VyPiI7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgZWxzZQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgcHJpdmF0ZSBzdHJpbmcgQWRkU2NhdHRlclBvaW50KGVDaGFydFR5cGUgY2hhcnRUeXBlKQotICAgICAgIHsKLSAgICAgICAgICAgaWYgKGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlcikKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuICI8YzpzcFByPjxhOmxuIHc9XCIyODU3NVwiPjxhOm5vRmlsbCAvPjwvYTpsbj48L2M6c3BQcj4iOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIHByaXZhdGUgc3RyaW5nIEFkZEF4aXNOb2RlcyhlQ2hhcnRUeXBlIGNoYXJ0VHlwZSkKLSAgICAgICB7Ci0gICAgICAgICAgIGlmICggY2hhcnRUeXBlID09IGVDaGFydFR5cGUuWFlTY2F0dGVyIHx8Ci0gICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuWFlTY2F0dGVyTGluZXMgfHwKLSAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXJMaW5lc05vTWFya2VycyB8fAotICAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlclNtb290aCB8fAotICAgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlclNtb290aE5vTWFya2VycyB8fCAKLSAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5CdWJibGUgfHwKLSAgICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5CdWJibGUzREVmZmVjdCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuICI8Yzp4VmFsIC8+PGM6eVZhbCAvPiI7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgZWxzZQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICByZXR1cm4gIjxjOnZhbCAvPiI7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0KLSAgICAgICBwcml2YXRlIHN0cmluZyBBZGRFeHBsb3Npb24oZUNoYXJ0VHlwZSBjaGFydFR5cGUpCi0gICAgICAgewotICAgICAgICAgICBpZiAoY2hhcnRUeXBlID09IGVDaGFydFR5cGUuUGllRXhwbG9kZWQzRCB8fAotICAgICAgICAgICAgICBjaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5QaWVFeHBsb2RlZCB8fAotICAgICAgICAgICAgICAgY2hhcnRUeXBlID09IGVDaGFydFR5cGUuRG91Z2hudXRFeHBsb2RlZCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuICI8YzpleHBsb3Npb24gdmFsPVwiMjVcIiAvPiI7IC8vRGVmYXVsdCAyNTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBlbHNlCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICBwcml2YXRlIHN0cmluZyBBZGRTbW9vdGgoZUNoYXJ0VHlwZSBjaGFydFR5cGUpCi0gICAgICAgewotICAgICAgICAgICBpZiAoY2hhcnRUeXBlID09IGVDaGFydFR5cGUuWFlTY2F0dGVyU21vb3RoIHx8Ci0gICAgICAgICAgICAgIGNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlclNtb290aE5vTWFya2VycykKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuICI8YzpzbW9vdGggdmFsPVwiMVwiIC8+IjsgLy9EZWZhdWx0IDI1OwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxDaGFydFN1cmZhY2UuY3MgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0U3VyZmFjZS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y3MjkwYi4uMDAwMDAwMAotLS0gYS9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0U3VyZmFjZS5jcworKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKLSAqCi0gKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgotICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAotICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCi0gKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCi0gKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgotICoKLSAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCi0gKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTIwMDktMTItMzAKLSAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlhtbDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7Ci0KLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuQ2hhcnQKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIENoYXJ0IHN1cmZhY2Ugc2V0dGluZ3MKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbENoYXJ0U3VyZmFjZSA6IFhtbEhlbHBlcgotICAgIHsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxDaGFydFN1cmZhY2UoWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSBub2RlKQotICAgICAgICAgICA6IGJhc2UobnMsbm9kZSkKLSAgICAgICB7Ci0gICAgICAgICAgIFNjaGVtYU5vZGVPcmRlciA9IG5ldyBzdHJpbmdbXSB7ICJ0aGlja25lc3MiLCAic3BQciIsICJwaWN0dXJlT3B0aW9ucyIgfTsKLSAgICAgICB9Ci0gICAgICAgI3JlZ2lvbiAiUHVibGljIHByb3BlcnRpZXMiCi0gICAgICAgIGNvbnN0IHN0cmluZyBUSElDS05FU1NfUEFUSCA9ICJjOnRoaWNrbmVzcy9AdmFsIjsKLSAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgLy8vIFNob3cgdGhlIHZhbHVlcyAKLSAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50IFRoaWNrbmVzcwotICAgICAgIHsKLSAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KFRISUNLTkVTU19QQVRIKTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBzZXQKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYodmFsdWUgPCAwICYmIHZhbHVlID4gOSkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiVGhpY2tuZXNzIG91dCBvZiByYW5nZS4gKDAtOSkiKSk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFRISUNLTkVTU19QQVRILCB2YWx1ZS5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICBFeGNlbERyYXdpbmdGaWxsIF9maWxsID0gbnVsbDsKLSAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgLy8vIEFjY2VzcyBmaWxsIHByb3BlcnRpZXMKLSAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgIHB1YmxpYyBFeGNlbERyYXdpbmdGaWxsIEZpbGwKLSAgICAgICB7Ci0gICAgICAgICAgIGdldAotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAoX2ZpbGwgPT0gbnVsbCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBfZmlsbCA9IG5ldyBFeGNlbERyYXdpbmdGaWxsKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsICJjOnNwUHIiKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIHJldHVybiBfZmlsbDsKLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICBFeGNlbERyYXdpbmdCb3JkZXIgX2JvcmRlciA9IG51bGw7Ci0gICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgIC8vLyBBY2Nlc3MgYm9yZGVyIHByb3BlcnRpZXMKLSAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgIHB1YmxpYyBFeGNlbERyYXdpbmdCb3JkZXIgQm9yZGVyCi0gICAgICAgewotICAgICAgICAgICBnZXQKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKF9ib3JkZXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBfYm9yZGVyID0gbmV3IEV4Y2VsRHJhd2luZ0JvcmRlcihOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCAiYzpzcFByL2E6bG4iKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIHJldHVybiBfYm9yZGVyOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgICNlbmRyZWdpb24KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0VGl0bGUuY3MgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbENoYXJ0VGl0bGUuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YTc5ZjYuLjAwMDAwMDAKLS0tIGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxDaGFydFRpdGxlLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLe+7vy8qKioqKioqKioqKioqKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKLSAqCi0gKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgotICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAotICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCi0gKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCi0gKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgotICoKLSAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCi0gKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTIwMDktMTAtMDEKLSAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlhtbDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7Ci0KLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuQ2hhcnQKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFRoZSB0aXRsZSBvZiBhIGNoYXJ0Ci0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxDaGFydFRpdGxlIDogWG1sSGVscGVyCi0gICAgewotICAgICAgICBpbnRlcm5hbCBFeGNlbENoYXJ0VGl0bGUoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyLCBYbWxOb2RlIG5vZGUpIDoKLSAgICAgICAgICAgIGJhc2UobmFtZVNwYWNlTWFuYWdlciwgbm9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sTm9kZSB0b3BOb2RlID0gbm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJjOnRpdGxlIiwgTmFtZVNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICBpZiAodG9wTm9kZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRvcE5vZGUgPSBub2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgiYyIsICJ0aXRsZSIsIEV4Y2VsUGFja2FnZS5zY2hlbWFDaGFydCk7Ci0gICAgICAgICAgICAgICAgbm9kZS5JbnNlcnRCZWZvcmUodG9wTm9kZSwgbm9kZS5DaGlsZE5vZGVzWzBdKTsKLSAgICAgICAgICAgICAgICB0b3BOb2RlLklubmVyWG1sID0gIjxjOnR4PjxjOnJpY2g+PGE6Ym9keVByIC8+PGE6bHN0U3R5bGUgLz48YTpwPjxhOnBQcj48YTpkZWZSUHIgc3o9XCIxODAwXCIgYj1cIjBcIiAvPjwvYTpwUHI+PGE6cj48YTp0IC8+PC9hOnI+PC9hOnA+PC9jOnJpY2g+PC9jOnR4PjxjOmxheW91dCAvPjxjOm92ZXJsYXkgdmFsPVwiMFwiIC8+IjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRvcE5vZGUgPSB0b3BOb2RlOwotICAgICAgICAgICAgU2NoZW1hTm9kZU9yZGVyID0gbmV3IHN0cmluZ1tdIHsgInR4IiwiYm9keVByIiwgImxzdFN0eWxlIiwgImxheW91dCIsICJvdmVybGF5IiB9OwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyB0aXRsZVBhdGggPSAiYzp0eC9jOnJpY2gvYTpwL2E6ci9hOnQiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgdGV4dAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIFRleHQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9yZXR1cm4gR2V0WG1sTm9kZSh0aXRsZVBhdGgpOwotICAgICAgICAgICAgICAgIHJldHVybiBSaWNoVGV4dC5UZXh0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9TZXRYbWxOb2RlKHRpdGxlUGF0aCwgdmFsdWUpOwotICAgICAgICAgICAgICAgIFJpY2hUZXh0LlRleHQgPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBFeGNlbERyYXdpbmdCb3JkZXIgX2JvcmRlciA9IG51bGw7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEEgcmVmZXJlbmNlIHRvIHRoZSBib3JkZXIgcHJvcGVydGllcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxEcmF3aW5nQm9yZGVyIEJvcmRlcgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX2JvcmRlciA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2JvcmRlciA9IG5ldyBFeGNlbERyYXdpbmdCb3JkZXIoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgImM6c3BQci9hOmxuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfYm9yZGVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEV4Y2VsRHJhd2luZ0ZpbGwgX2ZpbGwgPSBudWxsOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBIHJlZmVyZW5jZSB0byB0aGUgZmlsbCBwcm9wZXJ0aWVzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbERyYXdpbmdGaWxsIEZpbGwKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9maWxsID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfZmlsbCA9IG5ldyBFeGNlbERyYXdpbmdGaWxsKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsICJjOnNwUHIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9maWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vRXhjZWxUZXh0Rm9udCBfZm9udCA9IG51bGw7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEEgcmVmZXJlbmNlIHRvIHRoZSBmb250IHByb3BlcnRpZXMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsVGV4dEZvbnQgRm9udAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL2lmIChfZm9udCA9PSBudWxsKQotICAgICAgICAgICAgICAgIC8vewotICAgICAgICAgICAgICAgIC8vICAgIF9mb250ID0gbmV3IEV4Y2VsVGV4dEZvbnQoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgImM6dHgvYzpyaWNoL2E6cC9hOnIvYTpyUHIiLCBuZXcgc3RyaW5nW10geyAiclByIiwgInNvbGlkRmlsbCIsICJ1RmlsbCIsICJsYXRpbiIsICJjcyIsICJyIiwgInJQciIsICJ0IiB9KTsKLSAgICAgICAgICAgICAgICAvL30KLSAgICAgICAgICAgICAgICAvL3JldHVybiBfZm9udDsKLSAgICAgICAgICAgICAgICBpZiAoX3JpY2hUZXh0PT1udWxsIHx8IF9yaWNoVGV4dC5Db3VudCA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUmljaFRleHQuQWRkKCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9yaWNoVGV4dFswXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzdHJpbmdbXSBwYXJhZ3JhcGhOb2RlT3JkZXIgPSBuZXcgc3RyaW5nW10geyAicFByIiwgImRlZlJQciIsICJzb2xpZEZpbGwiLCAidUZpbGwiLCAibGF0aW4iLCAiY3MiLCAiciIsICJyUHIiLCAidCIgfTsKLSAgICAgICAgRXhjZWxQYXJhZ3JhcGhDb2xsZWN0aW9uIF9yaWNoVGV4dCA9IG51bGw7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJpY2h0ZXh0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFBhcmFncmFwaENvbGxlY3Rpb24gUmljaFRleHQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9yaWNoVGV4dCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX3JpY2hUZXh0ID0gbmV3IEV4Y2VsUGFyYWdyYXBoQ29sbGVjdGlvbihOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCAiYzp0eC9jOnJpY2gvYTpwIiwgcGFyYWdyYXBoTm9kZU9yZGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9yaWNoVGV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTaG93IHdpdGhvdXQgb3ZlcmxhcGluZyB0aGUgY2hhcnQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIE92ZXJsYXkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJjOm92ZXJsYXkvQHZhbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woImM6b3ZlcmxheS9AdmFsIiwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNwZWNpZmllcyB0aGUgY2VudGVyaW5nIG9mIHRoZSB0ZXh0IGJveC4gCi0gICAgICAgIC8vLyBUaGUgd2F5IGl0IHdvcmtzIGZ1bmRhbWVudGFsbHkgaXMgdG8gZGV0ZXJtaW5lIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSAiYm91bmRzIGJveCIgZm9yIHRoZSB0ZXh0IGFuZCB0aGVuIHRvIGNlbnRlciB0aGF0ICJib3VuZHMgYm94IiBhY2NvcmRpbmdseS4gCi0gICAgICAgIC8vLyBUaGlzIGlzIGRpZmZlcmVudCB0aGFuIHBhcmFncmFwaCBhbGlnbm1lbnQsIHdoaWNoIGFsaWducyB0aGUgdGV4dCB3aXRoaW4gdGhlICJib3VuZHMgYm94IiBmb3IgdGhlIHRleHQuIAotICAgICAgICAvLy8gVGhpcyBmbGFnIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgb2YgdGhlIGRpZmZlcmVudCBraW5kcyBvZiBhbmNob3JpbmcuIAotICAgICAgICAvLy8gSWYgdGhpcyBhdHRyaWJ1dGUgaXMgb21pdHRlZCwgdGhlbiBhIHZhbHVlIG9mIDAgb3IgZmFsc2UgaXMgaW1wbGllZC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgQW5jaG9yQ3RyCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbCgiYzp0eC9jOnJpY2gvYTpib2R5UHIvQGFuY2hvckN0ciIsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKCJjOnR4L2M6cmljaC9hOmJvZHlQci9AYW5jaG9yQ3RyIiwgdmFsdWUsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgZVRleHRBbmNob3JpbmdUeXBlIEFuY2hvcgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxEcmF3aW5nLkdldFRleHRBY2hvcmluZ0VudW0oR2V0WG1sTm9kZVN0cmluZygiYzp0eC9jOnJpY2gvYTpib2R5UHIvQGFuY2hvciIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoImM6dHgvYzpyaWNoL2E6Ym9keVByL0BhbmNob3JDdHIiLCBFeGNlbERyYXdpbmcuR2V0VGV4dEFjaG9yaW5nVGV4dCh2YWx1ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBUZXh0VmVydGljYWxQYXRoID0gInhkcjpzcC94ZHI6dHhCb2R5L2E6Ym9keVByL0B2ZXJ0IjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVmVydGljYWwgdGV4dAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZVRleHRWZXJ0aWNhbFR5cGUgVGV4dFZlcnRpY2FsCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbERyYXdpbmcuR2V0VGV4dFZlcnRpY2FsRW51bShHZXRYbWxOb2RlU3RyaW5nKCJjOnR4L2M6cmljaC9hOmJvZHlQci9AdmVydCIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoImM6dHgvYzpyaWNoL2E6Ym9keVByL0B2ZXJ0IiwgRXhjZWxEcmF3aW5nLkdldFRleHRWZXJ0aWNhbFRleHQodmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSb3RhdGlvbiBpbiBkZWdyZWVzICgwLTM2MCkKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGRvdWJsZSBSb3RhdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgaT1HZXRYbWxOb2RlSW50KCJjOnR4L2M6cmljaC9hOmJvZHlQci9Acm90Iik7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPCAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDM2MCAtIChpIC8gNjAwMDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGkgLyA2MDAwMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHY7Ci0gICAgICAgICAgICAgICAgaWYodmFsdWUgPDAgfHwgdmFsdWUgPiAzNjApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyhuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJSb3RhdGlvbiBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMzYwIikpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA+IDE4MCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHYgPSAoaW50KSgodmFsdWUgLSAzNjApICogNjAwMDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2ID0gKGludCkodmFsdWUgKiA2MDAwMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoImM6dHgvYzpyaWNoL2E6Ym9keVByL0Byb3QiLCB2LlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxDaGFydFRyZW5kbGluZS5jcyBiL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsQ2hhcnRUcmVuZGxpbmUuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZjhkYTMuLjAwMDAwMDAKLS0tIGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxDaGFydFRyZW5kbGluZS5jcworKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKLSAqCi0gKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgotICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAotICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCi0gKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCi0gKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgotICoKLSAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCi0gKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBKYW4gS8OkbGxtYW4JCUluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDExLTA1LTI1Ci0gKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlhtbDsKLXVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0Ci17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBIGNvbGxlY3Rpb24gb2YgdHJlbmRsaW5lcy4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbENoYXJ0VHJlbmRsaW5lQ29sbGVjdGlvbiA6IElFbnVtZXJhYmxlPEV4Y2VsQ2hhcnRUcmVuZGxpbmU+Ci0gICAgewotICAgICAgICBMaXN0PEV4Y2VsQ2hhcnRUcmVuZGxpbmU+IF9saXN0ID0gbmV3IExpc3Q8RXhjZWxDaGFydFRyZW5kbGluZT4oKTsKLSAgICAgICAgRXhjZWxDaGFydFNlcmllIF9zZXJpZTsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxDaGFydFRyZW5kbGluZUNvbGxlY3Rpb24oRXhjZWxDaGFydFNlcmllIHNlcmllKQotICAgICAgICB7Ci0gICAgICAgICAgICBfc2VyaWUgPSBzZXJpZTsKLSAgICAgICAgICAgIGZvcmVhY2ggKFhtbE5vZGUgbm9kZSBpbiBfc2VyaWUuVG9wTm9kZS5TZWxlY3ROb2RlcygiYzp0cmVuZGxpbmUiLCBfc2VyaWUuTmFtZVNwYWNlTWFuYWdlcikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2xpc3QuQWRkKG5ldyBFeGNlbENoYXJ0VHJlbmRsaW5lKF9zZXJpZS5OYW1lU3BhY2VNYW5hZ2VyLCBub2RlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkIGEgbmV3IHRyZW5kbGluZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlR5cGUiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgdHJlbmRsaW5lPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgRXhjZWxDaGFydFRyZW5kbGluZSBBZGQoZVRyZW5kTGluZSBUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3NlcmllLl9jaGFydFNlcmllcy5fY2hhcnQuSXNUeXBlM0QoKSB8fAotICAgICAgICAgICAgICAgIF9zZXJpZS5fY2hhcnRTZXJpZXMuX2NoYXJ0LklzVHlwZVBlcmNlbnRTdGFja2VkKCkgfHwKLSAgICAgICAgICAgICAgICBfc2VyaWUuX2NoYXJ0U2VyaWVzLl9jaGFydC5Jc1R5cGVTdGFja2VkKCkgfHwKLSAgICAgICAgICAgICAgICBfc2VyaWUuX2NoYXJ0U2VyaWVzLl9jaGFydC5Jc1R5cGVQaWVEb3VnaG51dCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93KG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiVHJlbmRsaW5lcyBkb24ndCBhcHBseSB0byAzZC1jaGFydHMsIHN0YWNrZWQgY2hhcnRzLCBwaWUgY2hhcnRzIG9yIGRvdWdobnV0IGNoYXJ0cyIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEV4Y2VsQ2hhcnRUcmVuZGxpbmUgdGw7Ci0gICAgICAgICAgICBYbWxOb2RlIGluc2VydEFmdGVyOwotICAgICAgICAgICAgaWYgKF9saXN0LkNvdW50ID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnNlcnRBZnRlciA9IF9saXN0W19saXN0LkNvdW50IC0gMV0uVG9wTm9kZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnNlcnRBZnRlciA9IF9zZXJpZS5Ub3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImM6bWFya2VyIiwgX3NlcmllLk5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgICAgIGlmIChpbnNlcnRBZnRlciA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QWZ0ZXIgPSBfc2VyaWUuVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJjOnR4IiwgX3NlcmllLk5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0QWZ0ZXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QWZ0ZXIgPSBfc2VyaWUuVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJjOm9yZGVyIiwgX3NlcmllLk5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIG5vZGU9X3NlcmllLlRvcE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KCJjIiwidHJlbmRsaW5lIiwgRXhjZWxQYWNrYWdlLnNjaGVtYUNoYXJ0KTsKLSAgICAgICAgICAgIF9zZXJpZS5Ub3BOb2RlLkluc2VydEFmdGVyKG5vZGUsIGluc2VydEFmdGVyKTsKLQotICAgICAgICAgICAgdGwgPSBuZXcgRXhjZWxDaGFydFRyZW5kbGluZShfc2VyaWUuTmFtZVNwYWNlTWFuYWdlciwgbm9kZSk7Ci0gICAgICAgICAgICB0bC5UeXBlID0gVHlwZTsKLSAgICAgICAgICAgIHJldHVybiB0bDsKLSAgICAgICAgfQotICAgICAgICBJRW51bWVyYXRvcjxFeGNlbENoYXJ0VHJlbmRsaW5lPiBJRW51bWVyYWJsZTxFeGNlbENoYXJ0VHJlbmRsaW5lPi5HZXRFbnVtZXJhdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9saXN0LkdldEVudW1lcmF0b3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYXRvciBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUuR2V0RW51bWVyYXRvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfbGlzdC5HZXRFbnVtZXJhdG9yKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBIHRyZW5kbGluZSBvYmplY3QKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbENoYXJ0VHJlbmRsaW5lIDogWG1sSGVscGVyCi0gICAgewotICAgICAgICBpbnRlcm5hbCBFeGNlbENoYXJ0VHJlbmRsaW5lKFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlciwgWG1sTm9kZSB0b3BOb2RlKSA6Ci0gICAgICAgICAgICBiYXNlKG5hbWVzcGFjZU1hbmFnZXIsdG9wTm9kZSkKLQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFOb2RlT3JkZXIgPSBuZXcgc3RyaW5nW10geyAibmFtZSIsICJ0cmVuZGxpbmVUeXBlIiwib3JkZXIiLCJwZXJpb2QiLCAiZm9yd2FyZCIsImJhY2t3YXJkIiwiaW50ZXJjZXB0IiwgImRpc3BSU3FyIiwgImRpc3BFcSIsICJ0cmVuZGxpbmVMYmwiIH07Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIFRSRU5ETElORVBBVEggPSAiYzp0cmVuZGxpbmVUeXBlL0B2YWwiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUeXBlIG9mIFRyZW5kbGluZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZVRyZW5kTGluZSBUeXBlCi0gICAgICAgIHsKLSAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHN3aXRjaCAoR2V0WG1sTm9kZVN0cmluZyhUUkVORExJTkVQQVRIKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIGNhc2UgImV4cCI6Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlVHJlbmRMaW5lLkV4cG9uZW50aWFsOwotICAgICAgICAgICAgICAgICAgIGNhc2UgImxvZyI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVRyZW5kTGluZS5Mb2dhcml0aG1pYzsKLSAgICAgICAgICAgICAgICAgICBjYXNlICJwb2x5IjoKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVUcmVuZExpbmUuUG9seW5vbWlhbDsKLSAgICAgICAgICAgICAgICAgICBjYXNlICJtb3ZpbmdhdmciOgotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVRyZW5kTGluZS5Nb3ZpbmdBdmdlcmFnZTsKLSAgICAgICAgICAgICAgICAgICBjYXNlICJwb3dlciI6Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlVHJlbmRMaW5lLlBvd2VyOwotICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlVHJlbmRMaW5lLkxpbmVhcjsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgICAgICBzZXQKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIGVUcmVuZExpbmUuRXhwb25lbnRpYWw6Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFRSRU5ETElORVBBVEgsICJleHAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIGVUcmVuZExpbmUuTG9nYXJpdGhtaWM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFRSRU5ETElORVBBVEgsICJsb2ciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIGVUcmVuZExpbmUuUG9seW5vbWlhbDoKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoVFJFTkRMSU5FUEFUSCwgInBvbHkiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9yZGVyID0gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIGVUcmVuZExpbmUuTW92aW5nQXZnZXJhZ2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFRSRU5ETElORVBBVEgsICJtb3ZpbmdBdmciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBlcmlvZCA9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBlVHJlbmRMaW5lLlBvd2VyOgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhUUkVORExJTkVQQVRILCAicG93ZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoVFJFTkRMSU5FUEFUSCwgImxpbmVhciIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIE5BTUVQQVRIID0gImM6bmFtZSI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE5hbWUgaW4gdGhlIGxlZ2VuZAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoTkFNRVBBVEgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhOQU1FUEFUSCwgdmFsdWUsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBPUkRFUlBBVEggPSAiYzpvcmRlci9AdmFsIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gT3JkZXIgZm9yIHBvbHlub21pbmFsIHRyZW5kbGluZXMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGRlY2ltYWwgT3JkZXIKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVEZWNpbWFsKE9SREVSUEFUSCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoVHlwZSA9PSBlVHJlbmRMaW5lLk1vdmluZ0F2Z2VyYWdlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3Qgc2V0IHBlcmlvZCBmb3IgdHJlbmRsaW5lIHR5cGUgTW92aW5nQXZnZXJhZ2UiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIERlbGV0ZUFsbE5vZGUoUEVSSU9EUEFUSCk7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhPUkRFUlBBVEgsIHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgUEVSSU9EUEFUSCA9ICJjOnBlcmlvZC9AdmFsIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUGVyaW9kIGZvciBtb250aGx5IGF2ZXJhZ2UgdHJlbmRsaW5lcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZGVjaW1hbCBQZXJpb2QKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVEZWNpbWFsKFBFUklPRFBBVEgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKFR5cGUgPT0gZVRyZW5kTGluZS5Qb2x5bm9taWFsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3Qgc2V0IHBlcmlvZCBmb3IgdHJlbmRsaW5lIHR5cGUgUG9seW5vbWlhbCIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRGVsZXRlQWxsTm9kZShPUkRFUlBBVEgpOwotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoUEVSSU9EUEFUSCwgdmFsdWUuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBGT1JXQVJEUEFUSCA9ICJjOmZvcndhcmQvQHZhbCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZvcmNhc3QgZm9yd2FyZCBwZXJpb2RzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBkZWNpbWFsIEZvcndhcmQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVEZWNpbWFsKEZPUldBUkRQQVRIKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoRk9SV0FSRFBBVEgsIHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgQkFDS1dBUkRQQVRIID0gImM6YmFja3dhcmQvQHZhbCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZvcmNhc3QgYmFja3dhcmRzIHBlcmlvZHMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGRlY2ltYWwgQmFja3dhcmQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVEZWNpbWFsKEJBQ0tXQVJEUEFUSCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKEJBQ0tXQVJEUEFUSCwgdmFsdWUuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBJTlRFUkNFUFRQQVRIID0gImM6aW50ZXJjZXB0L0B2YWwiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTcGVjaWZ5IHRoZSBwb2ludCB3aGVyZSB0aGUgdHJlbmRsaW5lIGNyb3NzZXMgdGhlIHZlcnRpY2FsIGF4aXMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGRlY2ltYWwgSW50ZXJjZXB0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlRGVjaW1hbChJTlRFUkNFUFRQQVRIKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoSU5URVJDRVBUUEFUSCwgdmFsdWUuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBESVNQTEFZUlNRVUFSRURWQUxVRVBBVEggPSAiYzpkaXNwUlNxci9AdmFsIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGlzcGxheSB0aGUgUi1zcXVhcmVkIHZhbHVlIGZvciBhIHRyZW5kbGluZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBEaXNwbGF5UlNxdWFyZWRWYWx1ZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woRElTUExBWVJTUVVBUkVEVkFMVUVQQVRILCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKERJU1BMQVlSU1FVQVJFRFZBTFVFUEFUSCwgdmFsdWUsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBESVNQTEFZRVFVQVRJT05QQVRIID0gImM6ZGlzcEVxL0B2YWwiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBEaXNwbGF5IHRoZSB0cmVuZGxpbmUgZXF1YXRpb24gb24gdGhlIGNoYXJ0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIERpc3BsYXlFcXVhdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woRElTUExBWUVRVUFUSU9OUEFUSCwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChESVNQTEFZRVFVQVRJT05QQVRILCB2YWx1ZSwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbERvdWdobnV0Q2hhcnQuY3MgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbERvdWdobnV0Q2hhcnQuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNWRmMmQuLjAwMDAwMDAKLS0tIGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxEb3VnaG51dENoYXJ0LmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQotICoKLSAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCi0gKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCi0gKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKLSAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKLSAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCi0gKgotICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKLSAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEphbiBLw6RsbG1hbgkJSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKLSAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlhtbDsKLXVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5UYWJsZS5QaXZvdFRhYmxlOwotCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0Ci17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gZG91Z2hudXQgY2hhcnQgc3BlY2lmaWMgcHJvcGVydGllcwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsRG91Z2hudXRDaGFydCA6IEV4Y2VsUGllQ2hhcnQKLSAgICB7Ci0gICAgICAgIC8vaW50ZXJuYWwgRXhjZWxEb3VnaG51dENoYXJ0KEV4Y2VsRHJhd2luZ3MgZHJhd2luZ3MsIFhtbE5vZGUgbm9kZSkgOgotICAgICAgICAvLyAgICBiYXNlKGRyYXdpbmdzLCBub2RlKQotICAgICAgICAvL3sKLSAgICAgICAgLy8gICAgU2V0UGF0aHMoKTsKLSAgICAgICAgLy99Ci0gICAgICAgIGludGVybmFsIEV4Y2VsRG91Z2hudXRDaGFydChFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBYbWxOb2RlIG5vZGUsIGVDaGFydFR5cGUgdHlwZSwgYm9vbCBpc1Bpdm90KSA6Ci0gICAgICAgICAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCB0eXBlLCBpc1Bpdm90KQotICAgICAgICB7Ci0gICAgICAgICAgICAvL1NldFBhdGhzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxEb3VnaG51dENoYXJ0KEV4Y2VsRHJhd2luZ3MgZHJhd2luZ3MsIFhtbE5vZGUgbm9kZSwgZUNoYXJ0VHlwZSB0eXBlLCBFeGNlbENoYXJ0IHRvcENoYXJ0LCBFeGNlbFBpdm90VGFibGUgUGl2b3RUYWJsZVNvdXJjZSkgOgotICAgICAgICAgICAgYmFzZShkcmF3aW5ncywgbm9kZSwgdHlwZSwgdG9wQ2hhcnQsIFBpdm90VGFibGVTb3VyY2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vU2V0UGF0aHMoKTsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBFeGNlbERvdWdobnV0Q2hhcnQoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlLCBVcmkgdXJpQ2hhcnQsIFBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCBwYXJ0LCBYbWxEb2N1bWVudCBjaGFydFhtbCwgWG1sTm9kZSBjaGFydE5vZGUpIDoKLSAgICAgICAgICAgYmFzZShkcmF3aW5ncywgbm9kZSwgdXJpQ2hhcnQsIHBhcnQsIGNoYXJ0WG1sLCBjaGFydE5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vU2V0UGF0aHMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludGVybmFsIEV4Y2VsRG91Z2hudXRDaGFydChFeGNlbENoYXJ0IHRvcENoYXJ0LCBYbWxOb2RlIGNoYXJ0Tm9kZSkgOgotICAgICAgICAgICAgYmFzZSh0b3BDaGFydCwgY2hhcnROb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL1NldFBhdGhzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3ByaXZhdGUgdm9pZCBTZXRQYXRocygpCi0gICAgICAgIC8vewotICAgICAgICAvLyAgICBzdHJpbmcgY2hhcnROb2RlVGV4dCA9IEdldENoYXJ0Tm9kZVRleHQoKTsKLSAgICAgICAgLy8gICAgX2ZpcnN0U2xpY2VBbmdQYXRoID0gc3RyaW5nLkZvcm1hdChfZmlyc3RTbGljZUFuZ1BhdGgsIGNoYXJ0Tm9kZVRleHQpOwotICAgICAgICAvLyAgICBfaG9sZVNpemVQYXRoID0gc3RyaW5nLkZvcm1hdChfaG9sZVNpemVQYXRoLCBjaGFydE5vZGVUZXh0KTsKLSAgICAgICAgLy99Ci0gICAgICAgIC8vc3RyaW5nIF9maXJzdFNsaWNlQW5nUGF0aCA9ICJjOmNoYXJ0U3BhY2UvYzpjaGFydC9jOnBsb3RBcmVhL3swfS9jOmZpcnN0U2xpY2VBbmcvQHZhbCI7Ci0gICAgICAgIHN0cmluZyBfZmlyc3RTbGljZUFuZ1BhdGggPSAiYzpmaXJzdFNsaWNlQW5nL0B2YWwiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBbmdsZSBvZiB0aGUgZmlyc3Qgc2xpemUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGRlY2ltYWwgRmlyc3RTbGljZUFuZ2xlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfY2hhcnRYbWxIZWxwZXIuR2V0WG1sTm9kZURlY2ltYWwoX2ZpcnN0U2xpY2VBbmdQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludGVybmFsIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jaGFydFhtbEhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKF9maXJzdFNsaWNlQW5nUGF0aCwgdmFsdWUuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vc3RyaW5nIF9ob2xlU2l6ZVBhdGggPSAiYzpjaGFydFNwYWNlL2M6Y2hhcnQvYzpwbG90QXJlYS97MH0vYzpob2xlU2l6ZS9AdmFsIjsKLSAgICAgICAgc3RyaW5nIF9ob2xlU2l6ZVBhdGggPSAiYzpob2xlU2l6ZS9AdmFsIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU2l6ZSBvZiB0aGUgZG91Ym51dCBob2xlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBkZWNpbWFsIEhvbGVTaXplCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfY2hhcnRYbWxIZWxwZXIuR2V0WG1sTm9kZURlY2ltYWwoX2hvbGVTaXplUGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnRlcm5hbCBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY2hhcnRYbWxIZWxwZXIuU2V0WG1sTm9kZVN0cmluZyhfaG9sZVNpemVQYXRoLCB2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgZUNoYXJ0VHlwZSBHZXRDaGFydFR5cGUoc3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChuYW1lID09ICJkb3VnaG51dENoYXJ0IikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKChFeGNlbFBpZUNoYXJ0U2VyaWUpU2VyaWVzWzBdKS5FeHBsb3Npb24gPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuRG91Z2hudXRFeHBsb2RlZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuRG91Z2hudXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJhc2UuR2V0Q2hhcnRUeXBlKG5hbWUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxMaW5lQ2hhcnQuY3MgYi9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbExpbmVDaGFydC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZlZTk0OS4uMDAwMDAwMAotLS0gYS9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbExpbmVDaGFydC5jcworKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKLSAqCi0gKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgotICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAotICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCi0gKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCi0gKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgotICoKLSAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCi0gKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBKYW4gS8OkbGxtYW4JCUluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCi0gKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5YbWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlRhYmxlLlBpdm90VGFibGU7Ci0KLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuQ2hhcnQKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFByb3ZpZGVzIGFjY2VzcyB0byBsaW5lIGNoYXJ0IHNwZWNpZmljIHByb3BlcnRpZXMKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbExpbmVDaGFydCA6IEV4Y2VsQ2hhcnQKLSAgICB7Ci0gICAgICAgICNyZWdpb24gIkNvbnN0cnVjdG9ycyIKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxMaW5lQ2hhcnQoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlLCBVcmkgdXJpQ2hhcnQsIFBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCBwYXJ0LCBYbWxEb2N1bWVudCBjaGFydFhtbCwgWG1sTm9kZSBjaGFydE5vZGUpIDoKLSAgICAgICAgICAgIGJhc2UoZHJhd2luZ3MsIG5vZGUsIHVyaUNoYXJ0LCBwYXJ0LCBjaGFydFhtbCwgY2hhcnROb2RlKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCBFeGNlbExpbmVDaGFydCAoRXhjZWxDaGFydCB0b3BDaGFydCwgWG1sTm9kZSBjaGFydE5vZGUpIDoKLSAgICAgICAgICAgIGJhc2UodG9wQ2hhcnQsIGNoYXJ0Tm9kZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIEV4Y2VsTGluZUNoYXJ0KEV4Y2VsRHJhd2luZ3MgZHJhd2luZ3MsIFhtbE5vZGUgbm9kZSwgZUNoYXJ0VHlwZSB0eXBlLCBFeGNlbENoYXJ0IHRvcENoYXJ0LCBFeGNlbFBpdm90VGFibGUgUGl2b3RUYWJsZVNvdXJjZSkgOgotICAgICAgICAgICAgYmFzZShkcmF3aW5ncywgbm9kZSwgdHlwZSwgdG9wQ2hhcnQsIFBpdm90VGFibGVTb3VyY2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNtb290aCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLSAgICAgICAgc3RyaW5nIE1BUktFUl9QQVRIPSJjOm1hcmtlci9AdmFsIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSWYgdGhlIHNlcmllcyBoYXMgbWFya2VycwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBNYXJrZXIKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9jaGFydFhtbEhlbHBlci5HZXRYbWxOb2RlQm9vbChNQVJLRVJfUEFUSCwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2NoYXJ0WG1sSGVscGVyLlNldFhtbE5vZGVCb29sKE1BUktFUl9QQVRILCB2YWx1ZSwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc3RyaW5nIFNNT09USF9QQVRIID0gImM6c21vb3RoL0B2YWwiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJZiB0aGUgc2VyaWVzIGhhcyBzbW9vdGggbGluZXMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgU21vb3RoCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfY2hhcnRYbWxIZWxwZXIuR2V0WG1sTm9kZUJvb2woU01PT1RIX1BBVEgsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jaGFydFhtbEhlbHBlci5TZXRYbWxOb2RlQm9vbChTTU9PVEhfUEFUSCwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vc3RyaW5nIF9jaGFydFRvcFBhdGggPSAiYzpjaGFydFNwYWNlL2M6Y2hhcnQvYzpwbG90QXJlYS97MH0iOwotICAgICAgICBFeGNlbENoYXJ0RGF0YUxhYmVsIF9EYXRhTGFiZWwgPSBudWxsOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBY2Nlc3MgdG8gZGF0YWxhYmVsIHByb3BlcnRpZXMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsQ2hhcnREYXRhTGFiZWwgRGF0YUxhYmVsCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfRGF0YUxhYmVsID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfRGF0YUxhYmVsID0gbmV3IEV4Y2VsQ2hhcnREYXRhTGFiZWwoTmFtZVNwYWNlTWFuYWdlciwgQ2hhcnROb2RlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9EYXRhTGFiZWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgZUNoYXJ0VHlwZSBHZXRDaGFydFR5cGUoc3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgIGlmKG5hbWU9PSJsaW5lQ2hhcnQiKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIGlmKE1hcmtlcikKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmKEdyb3VwaW5nPT1lR3JvdXBpbmcuU3RhY2tlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuTGluZU1hcmtlcnNTdGFja2VkOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEdyb3VwaW5nID09IGVHcm91cGluZy5QZXJjZW50U3RhY2tlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuTGluZU1hcmtlcnNTdGFja2VkMTAwOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuTGluZU1hcmtlcnM7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgaWYoR3JvdXBpbmc9PWVHcm91cGluZy5TdGFja2VkKQotICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5MaW5lU3RhY2tlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChHcm91cGluZyA9PSBlR3JvdXBpbmcuUGVyY2VudFN0YWNrZWQpCi0gICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLkxpbmVTdGFja2VkMTAwOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuTGluZTsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hbWU9PSJsaW5lM0RDaGFydCIpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuTGluZTNEOyAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuR2V0Q2hhcnRUeXBlKG5hbWUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxMaW5lQ2hhcnRTZXJpZS5jcyBiL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsTGluZUNoYXJ0U2VyaWUuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNGNkZWIuLjAwMDAwMDAKLS0tIGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxMaW5lQ2hhcnRTZXJpZS5jcworKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKLSAqCi0gKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgotICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAotICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCi0gKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCi0gKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgotICoKLSAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCi0gKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBKYW4gS8OkbGxtYW4JCUluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCi0gKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlhtbDsKLQotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZy5DaGFydAotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQSBzZXJpZSBmb3IgYSBsaW5lIGNoYXJ0Ci0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsTGluZUNoYXJ0U2VyaWUgOiBFeGNlbENoYXJ0U2VyaWUKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjaGFydFNlcmllcyI+UGFyZW50IGNvbGxlY3Rpb248L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5zIj5OYW1lc3BhY2VtYW5hZ2VyPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJub2RlIj5Ub3Bub2RlPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpc1Bpdm90Ij5JcyBwaXZvdGNoYXJ0PC9wYXJhbT4KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxMaW5lQ2hhcnRTZXJpZShFeGNlbENoYXJ0U2VyaWVzIGNoYXJ0U2VyaWVzLCBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIG5vZGUsIGJvb2wgaXNQaXZvdCkgOgotICAgICAgICAgICAgYmFzZShjaGFydFNlcmllcywgbnMsIG5vZGUsIGlzUGl2b3QpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBFeGNlbENoYXJ0U2VyaWVEYXRhTGFiZWwgX0RhdGFMYWJlbCA9IG51bGw7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIERhdGFsYWJlbHMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsQ2hhcnRTZXJpZURhdGFMYWJlbCBEYXRhTGFiZWwKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9EYXRhTGFiZWwgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9EYXRhTGFiZWwgPSBuZXcgRXhjZWxDaGFydFNlcmllRGF0YUxhYmVsKF9ucywgX25vZGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX0RhdGFMYWJlbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgbWFya2VyUGF0aCA9ICJjOm1hcmtlci9jOnN5bWJvbC9AdmFsIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTWFya2VyIHN5bWJvbCAKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGVNYXJrZXJTdHlsZSBNYXJrZXIKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIG1hcmtlciA9IEdldFhtbE5vZGVTdHJpbmcobWFya2VyUGF0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hcmtlciA9PSAiIikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlTWFya2VyU3R5bGUuTm9uZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlTWFya2VyU3R5bGUpRW51bS5QYXJzZSh0eXBlb2YoZU1hcmtlclN0eWxlKSwgbWFya2VyLCB0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKG1hcmtlclBhdGgsIHZhbHVlLlRvU3RyaW5nKCkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIHNtb290aFBhdGggPSAiYzpzbW9vdGgvQHZhbCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNtb3RoIGxpbmVzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIFNtb290aAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woc21vb3RoUGF0aCwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woc21vb3RoUGF0aCwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxPZlBpZUNoYXJ0LmNzIGIvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxPZlBpZUNoYXJ0LmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmFiYTYwLi4wMDAwMDAwCi0tLSBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsT2ZQaWVDaGFydC5jcworKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKLSAqCi0gKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgotICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAotICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCi0gKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCi0gKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgotICoKLSAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCi0gKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBKYW4gS8OkbGxtYW4JCUluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCi0gKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5YbWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlRhYmxlLlBpdm90VGFibGU7Ci0KLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuQ2hhcnQKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFByb3ZpZGVzIGFjY2VzcyB0byBvZnBpZS1jaGFydCBzcGVjaWZpYyBwcm9wZXJ0aWVzCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxPZlBpZUNoYXJ0IDogRXhjZWxQaWVDaGFydAotICAgIHsKLSAgICAgICAgLy9pbnRlcm5hbCBFeGNlbE9mUGllQ2hhcnQoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlKSA6Ci0gICAgICAgIC8vICAgIGJhc2UoZHJhd2luZ3MsIG5vZGUpCi0gICAgICAgIC8vewotCi0gICAgICAgIC8vfQotICAgICAgICBpbnRlcm5hbCBFeGNlbE9mUGllQ2hhcnQoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlLCBlQ2hhcnRUeXBlIHR5cGUsIGJvb2wgaXNQaXZvdCkgOgotICAgICAgICAgICAgYmFzZShkcmF3aW5ncywgbm9kZSwgdHlwZSwgaXNQaXZvdCkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFR5cGVQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxPZlBpZUNoYXJ0KEV4Y2VsRHJhd2luZ3MgZHJhd2luZ3MsIFhtbE5vZGUgbm9kZSwgZUNoYXJ0VHlwZSB0eXBlLCBFeGNlbENoYXJ0IHRvcENoYXJ0LCBFeGNlbFBpdm90VGFibGUgUGl2b3RUYWJsZVNvdXJjZSkgOgotICAgICAgICAgICAgYmFzZShkcmF3aW5ncywgbm9kZSwgdHlwZSwgdG9wQ2hhcnQsIFBpdm90VGFibGVTb3VyY2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNldFR5cGVQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCBFeGNlbE9mUGllQ2hhcnQoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlLCBVcmkgdXJpQ2hhcnQsIFBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCBwYXJ0LCBYbWxEb2N1bWVudCBjaGFydFhtbCwgWG1sTm9kZSBjaGFydE5vZGUpIDoKLSAgICAgICAgICAgYmFzZShkcmF3aW5ncywgbm9kZSwgdXJpQ2hhcnQsIHBhcnQsIGNoYXJ0WG1sLCBjaGFydE5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNldFR5cGVQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgU2V0VHlwZVByb3BlcnRpZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuQmFyT2ZQaWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT2ZQaWVUeXBlID0gZVBpZVR5cGUuQmFyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9mUGllVHlwZSA9IGVQaWVUeXBlLlBpZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IHN0cmluZyBwaWVUeXBlUGF0aCA9ICJjOmNoYXJ0U3BhY2UvYzpjaGFydC9jOnBsb3RBcmVhL2M6b2ZQaWVDaGFydC9jOm9mUGllVHlwZS9AdmFsIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVHlwZSwgcGllIG9yIGJhcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZVBpZVR5cGUgT2ZQaWVUeXBlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfY2hhcnRYbWxIZWxwZXIuR2V0WG1sTm9kZVN0cmluZyhwaWVUeXBlUGF0aCkgPT0gImJhciIpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlUGllVHlwZS5CYXI7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVQaWVUeXBlLlBpZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnRlcm5hbCBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY2hhcnRYbWxIZWxwZXIuQ3JlYXRlTm9kZShwaWVUeXBlUGF0aCx0cnVlKTsKLSAgICAgICAgICAgICAgICBfY2hhcnRYbWxIZWxwZXIuU2V0WG1sTm9kZVN0cmluZyhwaWVUeXBlUGF0aCwgdmFsdWUgPT0gZVBpZVR5cGUuQmFyID8gImJhciIgOiAicGllIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgZUNoYXJ0VHlwZSBHZXRDaGFydFR5cGUoc3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChuYW1lID09ICJvZlBpZUNoYXJ0IikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoT2ZQaWVUeXBlPT1lUGllVHlwZS5CYXIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5CYXJPZlBpZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuUGllT2ZQaWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJhc2UuR2V0Q2hhcnRUeXBlKG5hbWUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxQaWVDaGFydC5jcyBiL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsUGllQ2hhcnQuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MDljMWYuLjAwMDAwMDAKLS0tIGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxQaWVDaGFydC5jcworKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKLSAqCi0gKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgotICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAotICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCi0gKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCi0gKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgotICoKLSAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCi0gKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBKYW4gS8OkbGxtYW4JCUluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCi0gKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5YbWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlRhYmxlLlBpdm90VGFibGU7Ci0KLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuQ2hhcnQKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFByb3ZpZGVzIGFjY2VzcyB0byBwaWUgY2hhcnQgc3BlY2lmaWMgcHJvcGVydGllcwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsUGllQ2hhcnQgOiBFeGNlbENoYXJ0Ci0gICAgewotICAgICAgICBpbnRlcm5hbCBFeGNlbFBpZUNoYXJ0KEV4Y2VsRHJhd2luZ3MgZHJhd2luZ3MsIFhtbE5vZGUgbm9kZSwgZUNoYXJ0VHlwZSB0eXBlLCBib29sIGlzUGl2b3QpIDoKLSAgICAgICAgICAgIGJhc2UoZHJhd2luZ3MsIG5vZGUsIHR5cGUsIGlzUGl2b3QpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBFeGNlbFBpZUNoYXJ0KEV4Y2VsRHJhd2luZ3MgZHJhd2luZ3MsIFhtbE5vZGUgbm9kZSwgZUNoYXJ0VHlwZSB0eXBlLCBFeGNlbENoYXJ0IHRvcENoYXJ0LCBFeGNlbFBpdm90VGFibGUgUGl2b3RUYWJsZVNvdXJjZSkgOgotICAgICAgICAgICAgYmFzZShkcmF3aW5ncywgbm9kZSwgdHlwZSwgdG9wQ2hhcnQsIFBpdm90VGFibGVTb3VyY2UpCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIGludGVybmFsIEV4Y2VsUGllQ2hhcnQoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlLCBVcmkgdXJpQ2hhcnQsIFBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCBwYXJ0LCBYbWxEb2N1bWVudCBjaGFydFhtbCwgWG1sTm9kZSBjaGFydE5vZGUpIDoKLSAgICAgICAgICAgYmFzZShkcmF3aW5ncywgbm9kZSwgdXJpQ2hhcnQsIHBhcnQsIGNoYXJ0WG1sLCBjaGFydE5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIGludGVybmFsIEV4Y2VsUGllQ2hhcnQoRXhjZWxDaGFydCB0b3BDaGFydCwgWG1sTm9kZSBjaGFydE5vZGUpIDoKLSAgICAgICAgICAgIGJhc2UodG9wQ2hhcnQsIGNoYXJ0Tm9kZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIEV4Y2VsQ2hhcnREYXRhTGFiZWwgX0RhdGFMYWJlbCA9IG51bGw7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFjY2VzcyB0byBkYXRhbGFiZWwgcHJvcGVydGllcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxDaGFydERhdGFMYWJlbCBEYXRhTGFiZWwKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9EYXRhTGFiZWwgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9EYXRhTGFiZWwgPSBuZXcgRXhjZWxDaGFydERhdGFMYWJlbChOYW1lU3BhY2VNYW5hZ2VyLCBDaGFydE5vZGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX0RhdGFMYWJlbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGludGVybmFsIG92ZXJyaWRlIGVDaGFydFR5cGUgR2V0Q2hhcnRUeXBlKHN0cmluZyBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobmFtZSA9PSAicGllQ2hhcnQiKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChTZXJpZXMuQ291bnQgPiAwICYmICgoRXhjZWxQaWVDaGFydFNlcmllKVNlcmllc1swXSkuRXhwbG9zaW9uPjApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5QaWVFeHBsb2RlZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuUGllOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG5hbWUgPT0gInBpZTNEQ2hhcnQiKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChTZXJpZXMuQ291bnQgPiAwICYmICgoRXhjZWxQaWVDaGFydFNlcmllKVNlcmllc1swXSkuRXhwbG9zaW9uID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlBpZUV4cGxvZGVkM0Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlBpZTNEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBiYXNlLkdldENoYXJ0VHlwZShuYW1lKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsUGllQ2hhcnRTZXJpZS5jcyBiL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsUGllQ2hhcnRTZXJpZS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQwZjk2MC4uMDAwMDAwMAotLS0gYS9FUFBsdXMvRHJhd2luZy9DaGFydC9FeGNlbFBpZUNoYXJ0U2VyaWUuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKLSAqCi0gKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgotICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAotICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCi0gKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCi0gKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgotICoKLSAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCi0gKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBKYW4gS8OkbGxtYW4JCUluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCi0gKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5YbWw7Ci0KLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuQ2hhcnQKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEEgc2VyaWUgZm9yIGEgcGllIGNoYXJ0Ci0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsUGllQ2hhcnRTZXJpZSA6IEV4Y2VsQ2hhcnRTZXJpZQotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNoYXJ0U2VyaWVzIj5QYXJlbnQgY29sbGVjdGlvbjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibnMiPk5hbWVzcGFjZW1hbmFnZXI8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5vZGUiPlRvcG5vZGU8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImlzUGl2b3QiPklzIHBpdm90Y2hhcnQ8L3BhcmFtPgotICAgICAgICBpbnRlcm5hbCBFeGNlbFBpZUNoYXJ0U2VyaWUoRXhjZWxDaGFydFNlcmllcyBjaGFydFNlcmllcywgWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSBub2RlLCBib29sIGlzUGl2b3QpIDoKLSAgICAgICAgICAgIGJhc2UoY2hhcnRTZXJpZXMsIG5zLCBub2RlLCBpc1Bpdm90KQotICAgICAgICB7Ci0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgZXhwbG9zaW9uUGF0aCA9ICJjOmV4cGxvc2lvbi9AdmFsIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRXhwbG9zaW9uIGZvciBQaWVjaGFydHMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBFeHBsb3Npb24KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVJbnQoZXhwbG9zaW9uUGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gNDAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cobmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiRXhwbG9zaW9uIHJhbmdlIGlzIDAtNDAwIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKGV4cGxvc2lvblBhdGgsIHZhbHVlLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEV4Y2VsQ2hhcnRTZXJpZURhdGFMYWJlbCBfRGF0YUxhYmVsID0gbnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGF0YUxhYmVscwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxDaGFydFNlcmllRGF0YUxhYmVsIERhdGFMYWJlbAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX0RhdGFMYWJlbCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX0RhdGFMYWJlbCA9IG5ldyBFeGNlbENoYXJ0U2VyaWVEYXRhTGFiZWwoX25zLCBfbm9kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfRGF0YUxhYmVsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxSYWRhckNoYXJ0LmNzIGIvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxSYWRhckNoYXJ0LmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmNmZDdjLi4wMDAwMDAwCi0tLSBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsUmFkYXJDaGFydC5jcworKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKLSAqCi0gKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgotICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAotICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCi0gKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCi0gKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgotICoKLSAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCi0gKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBKYW4gS8OkbGxtYW4JCUluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCi0gKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlhtbDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuVGFibGUuUGl2b3RUYWJsZTsKLQotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZy5DaGFydAotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIGxpbmUgY2hhcnQgc3BlY2lmaWMgcHJvcGVydGllcwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsUmFkYXJDaGFydCA6IEV4Y2VsQ2hhcnQKLSAgICB7Ci0gICAgICAgICNyZWdpb24gIkNvbnN0cnVjdG9ycyIKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxSYWRhckNoYXJ0KEV4Y2VsRHJhd2luZ3MgZHJhd2luZ3MsIFhtbE5vZGUgbm9kZSwgVXJpIHVyaUNoYXJ0LCBQYWNrYWdpbmcuWmlwUGFja2FnZVBhcnQgcGFydCwgWG1sRG9jdW1lbnQgY2hhcnRYbWwsIFhtbE5vZGUgY2hhcnROb2RlKSA6Ci0gICAgICAgICAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCB1cmlDaGFydCwgcGFydCwgY2hhcnRYbWwsIGNoYXJ0Tm9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgU2V0VHlwZVByb3BlcnRpZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludGVybmFsIEV4Y2VsUmFkYXJDaGFydChFeGNlbENoYXJ0IHRvcENoYXJ0LCBYbWxOb2RlIGNoYXJ0Tm9kZSkgOgotICAgICAgICAgICAgYmFzZSh0b3BDaGFydCwgY2hhcnROb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZXRUeXBlUHJvcGVydGllcygpOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIEV4Y2VsUmFkYXJDaGFydChFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBYbWxOb2RlIG5vZGUsIGVDaGFydFR5cGUgdHlwZSwgRXhjZWxDaGFydCB0b3BDaGFydCwgRXhjZWxQaXZvdFRhYmxlIFBpdm90VGFibGVTb3VyY2UpIDoKLSAgICAgICAgICAgIGJhc2UoZHJhd2luZ3MsIG5vZGUsIHR5cGUsIHRvcENoYXJ0LCBQaXZvdFRhYmxlU291cmNlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZXRUeXBlUHJvcGVydGllcygpOwotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFNldFR5cGVQcm9wZXJ0aWVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlJhZGFyRmlsbGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJhZGFyU3R5bGUgPSBlUmFkYXJTdHlsZS5GaWxsZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICAoQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuUmFkYXJNYXJrZXJzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJhZGFyU3R5bGUgPSAgZVJhZGFyU3R5bGUuTWFya2VyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJhZGFyU3R5bGUgPSBlUmFkYXJTdHlsZS5TdGFuZGFyZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHN0cmluZyBTVFlMRV9QQVRIID0gImM6cmFkYXJTdHlsZS9AdmFsIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIHR5cGUgb2YgcmFkYXJjaGFydAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZVJhZGFyU3R5bGUgUmFkYXJTdHlsZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgdj1fY2hhcnRYbWxIZWxwZXIuR2V0WG1sTm9kZVN0cmluZyhTVFlMRV9QQVRIKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkodikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVJhZGFyU3R5bGUuU3RhbmRhcmQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoZVJhZGFyU3R5bGUpRW51bS5QYXJzZSh0eXBlb2YoZVJhZGFyU3R5bGUpLCB2LCB0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY2hhcnRYbWxIZWxwZXIuU2V0WG1sTm9kZVN0cmluZyhTVFlMRV9QQVRILCB2YWx1ZS5Ub1N0cmluZygpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9zdHJpbmcgU01PT1RIX1BBVEggPSAiYzpzbW9vdGgvQHZhbCI7Ci0gICAgICAgIC8vLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8vLyBJZiB0aGUgc2VyaWVzIGhhcyBzbW9vdGggbGluZXMKLSAgICAgICAgLy8vLy8gPC9zdW1tYXJ5PgotICAgICAgICAvL3B1YmxpYyBib29sIFNtb290aAotICAgICAgICAvL3sKLSAgICAgICAgLy8gICAgZ2V0Ci0gICAgICAgIC8vICAgIHsKLSAgICAgICAgLy8gICAgICAgIHJldHVybiBfY2hhcnRYbWxIZWxwZXIuR2V0WG1sTm9kZUJvb2woU01PT1RIX1BBVEgsIGZhbHNlKTsKLSAgICAgICAgLy8gICAgfQotICAgICAgICAvLyAgICBzZXQKLSAgICAgICAgLy8gICAgewotICAgICAgICAvLyAgICAgICAgX2NoYXJ0WG1sSGVscGVyLlNldFhtbE5vZGVCb29sKFNNT09USF9QQVRILCB2YWx1ZSk7Ci0gICAgICAgIC8vICAgIH0KLSAgICAgICAgLy99Ci0gICAgICAgIC8vc3RyaW5nIF9jaGFydFRvcFBhdGggPSAiYzpjaGFydFNwYWNlL2M6Y2hhcnQvYzpwbG90QXJlYS97MH0iOwotICAgICAgICBFeGNlbENoYXJ0RGF0YUxhYmVsIF9EYXRhTGFiZWwgPSBudWxsOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBY2Nlc3MgdG8gZGF0YWxhYmVsIHByb3BlcnRpZXMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsQ2hhcnREYXRhTGFiZWwgRGF0YUxhYmVsCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfRGF0YUxhYmVsID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfRGF0YUxhYmVsID0gbmV3IEV4Y2VsQ2hhcnREYXRhTGFiZWwoTmFtZVNwYWNlTWFuYWdlciwgQ2hhcnROb2RlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9EYXRhTGFiZWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgZUNoYXJ0VHlwZSBHZXRDaGFydFR5cGUoc3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChSYWRhclN0eWxlID09IGVSYWRhclN0eWxlLkZpbGxlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5SYWRhckZpbGxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKFJhZGFyU3R5bGUgPT0gZVJhZGFyU3R5bGUuTWFya2VyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlJhZGFyTWFya2VyczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5SYWRhcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsUmFkYXJDaGFydFNlcmllLmNzIGIvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxSYWRhckNoYXJ0U2VyaWUuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZTIwNTUuLjAwMDAwMDAKLS0tIGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxSYWRhckNoYXJ0U2VyaWUuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCi0gKgotICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KLSAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKLSAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAotICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAotICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KLSAqCi0gKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAotICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSmFuIEvDpGxsbWFuCQlJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQotICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5YbWw7Ci0KLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuQ2hhcnQKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEEgc2VyaWUgZm9yIGEgc2NhdHRlciBjaGFydAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHNlYWxlZCBjbGFzcyBFeGNlbFJhZGFyQ2hhcnRTZXJpZSA6IEV4Y2VsQ2hhcnRTZXJpZQotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNoYXJ0U2VyaWVzIj5QYXJlbnQgY29sbGVjdGlvbjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibnMiPk5hbWVzcGFjZW1hbmFnZXI8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5vZGUiPlRvcG5vZGU8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImlzUGl2b3QiPklzIHBpdm90Y2hhcnQ8L3BhcmFtPgotICAgICAgICBpbnRlcm5hbCBFeGNlbFJhZGFyQ2hhcnRTZXJpZShFeGNlbENoYXJ0U2VyaWVzIGNoYXJ0U2VyaWVzLCBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIG5vZGUsIGJvb2wgaXNQaXZvdCkgOgotICAgICAgICAgICAgYmFzZShjaGFydFNlcmllcywgbnMsIG5vZGUsIGlzUGl2b3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjaGFydFNlcmllcy5DaGFydC5DaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5SYWRhcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNYXJrZXIgPSBlTWFya2VyU3R5bGUuTm9uZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBFeGNlbENoYXJ0U2VyaWVEYXRhTGFiZWwgX0RhdGFMYWJlbCA9IG51bGw7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIERhdGFsYWJlbAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxDaGFydFNlcmllRGF0YUxhYmVsIERhdGFMYWJlbAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX0RhdGFMYWJlbCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX0RhdGFMYWJlbCA9IG5ldyBFeGNlbENoYXJ0U2VyaWVEYXRhTGFiZWwoX25zLCBfbm9kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfRGF0YUxhYmVsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBtYXJrZXJQYXRoID0gImM6bWFya2VyL2M6c3ltYm9sL0B2YWwiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBNYXJrZXIgc3ltYm9sIAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZU1hcmtlclN0eWxlIE1hcmtlcgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcgbWFya2VyID0gR2V0WG1sTm9kZVN0cmluZyhtYXJrZXJQYXRoKTsKLSAgICAgICAgICAgICAgICBpZiAobWFya2VyID09ICIiIHx8IG1hcmtlcj09Im5vbmUiKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVNYXJrZXJTdHlsZS5Ob25lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVNYXJrZXJTdHlsZSlFbnVtLlBhcnNlKHR5cGVvZihlTWFya2VyU3R5bGUpLCBtYXJrZXIsIHRydWUpOwotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnRlcm5hbCBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKG1hcmtlclBhdGgsIHZhbHVlLlRvU3RyaW5nKCkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIE1BUktFUlNJWkVfUEFUSCA9ICJjOm1hcmtlci9jOnNpemUvQHZhbCI7Ci0gICAgICAgIHB1YmxpYyBpbnQgTWFya2VyU2l6ZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludChNQVJLRVJTSVpFX1BBVEgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgMiAmJiB2YWx1ZSA+IDcyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIk1hcmtlclNpemUgb3V0IG9mIHJhbmdlLiBSYW5nZSBmcm9tIDItNzIgYWxsb3dlZC4iKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoTUFSS0VSU0laRV9QQVRILCB2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsU2NhdHRlckNoYXJ0LmNzIGIvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxTY2F0dGVyQ2hhcnQuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxN2EzMDguLjAwMDAwMDAKLS0tIGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxTY2F0dGVyQ2hhcnQuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCi0gKgotICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KLSAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKLSAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAotICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAotICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KLSAqCi0gKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAotICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSmFuIEvDpGxsbWFuCQlJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQotICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uWG1sOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5UYWJsZS5QaXZvdFRhYmxlOwotCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0Ci17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gc2NhdHRlciBjaGFydCBzcGVjaWZpYyBwcm9wZXJ0aWVzCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsU2NhdHRlckNoYXJ0IDogRXhjZWxDaGFydAotICAgIHsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxTY2F0dGVyQ2hhcnQoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlLCBlQ2hhcnRUeXBlIHR5cGUsIEV4Y2VsQ2hhcnQgdG9wQ2hhcnQsIEV4Y2VsUGl2b3RUYWJsZSBQaXZvdFRhYmxlU291cmNlKSA6Ci0gICAgICAgICAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCB0eXBlLCB0b3BDaGFydCwgUGl2b3RUYWJsZVNvdXJjZSkKLSAgICAgICAgewotICAgICAgICAgICAgU2V0VHlwZVByb3BlcnRpZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludGVybmFsIEV4Y2VsU2NhdHRlckNoYXJ0KEV4Y2VsRHJhd2luZ3MgZHJhd2luZ3MsIFhtbE5vZGUgbm9kZSwgVXJpIHVyaUNoYXJ0LCBQYWNrYWdpbmcuWmlwUGFja2FnZVBhcnQgcGFydCwgWG1sRG9jdW1lbnQgY2hhcnRYbWwsIFhtbE5vZGUgY2hhcnROb2RlKSA6Ci0gICAgICAgICAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCB1cmlDaGFydCwgcGFydCwgY2hhcnRYbWwsIGNoYXJ0Tm9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgU2V0VHlwZVByb3BlcnRpZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludGVybmFsIEV4Y2VsU2NhdHRlckNoYXJ0KEV4Y2VsQ2hhcnQgdG9wQ2hhcnQsIFhtbE5vZGUgY2hhcnROb2RlKSA6Ci0gICAgICAgICAgICBiYXNlKHRvcENoYXJ0LCBjaGFydE5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNldFR5cGVQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFNldFR5cGVQcm9wZXJ0aWVzKCkKLSAgICAgICAgewotICAgICAgICAgICAvKioqKiogU2NhdHRlclN0eWxlICoqKioqLwotICAgICAgICAgICBpZihDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXIgfHwKLSAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuWFlTY2F0dGVyTGluZXMgfHwKLSAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuWFlTY2F0dGVyTGluZXNOb01hcmtlcnMpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIFNjYXR0ZXJTdHlsZSA9IGVTY2F0dGVyU3R5bGUuTGluZU1hcmtlcjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UgaWYgKAotICAgICAgICAgICAgICBDaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXJTbW9vdGggfHwKLSAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuWFlTY2F0dGVyU21vb3RoTm9NYXJrZXJzKSAKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgU2NhdHRlclN0eWxlID0gZVNjYXR0ZXJTdHlsZS5TbW9vdGhNYXJrZXI7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAjcmVnaW9uICJHcm91cGluZyBFbnVtIFRyYW5zbGF0aW9uIgotICAgICAgICBzdHJpbmcgX3NjYXR0ZXJUeXBlUGF0aCA9ICJjOnNjYXR0ZXJTdHlsZS9AdmFsIjsKLSAgICAgICAgcHJpdmF0ZSBlU2NhdHRlclN0eWxlIEdldFNjYXR0ZXJFbnVtKHN0cmluZyB0ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHRleHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAic21vb3RoTWFya2VyIjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVTY2F0dGVyU3R5bGUuU21vb3RoTWFya2VyOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlU2NhdHRlclN0eWxlLkxpbmVNYXJrZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0cmluZyBHZXRTY2F0dGVyVGV4dChlU2NhdHRlclN0eWxlIHNoYXR0ZXJTdHlsZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoIChzaGF0dGVyU3R5bGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBlU2NhdHRlclN0eWxlLlNtb290aE1hcmtlcjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzbW9vdGhNYXJrZXIiOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAibGluZU1hcmtlciI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJZiB0aGUgc2NhdHRlciBoYXMgTGluZU1hcmtlcnMgb3IgU21vb3RoTWFya2VycwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZVNjYXR0ZXJTdHlsZSBTY2F0dGVyU3R5bGUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFNjYXR0ZXJFbnVtKF9jaGFydFhtbEhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKF9zY2F0dGVyVHlwZVBhdGgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludGVybmFsIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jaGFydFhtbEhlbHBlci5DcmVhdGVOb2RlKF9zY2F0dGVyVHlwZVBhdGgsIHRydWUpOwotICAgICAgICAgICAgICAgIF9jaGFydFhtbEhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKF9zY2F0dGVyVHlwZVBhdGgsIEdldFNjYXR0ZXJUZXh0KHZhbHVlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3RyaW5nIE1BUktFUl9QQVRIID0gImM6bWFya2VyL0B2YWwiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJZiB0aGUgc2VyaWVzIGhhcyBtYXJrZXJzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIE1hcmtlcgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woTUFSS0VSX1BBVEgsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKE1BUktFUl9QQVRILCB2YWx1ZSwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIG92ZXJyaWRlIGVDaGFydFR5cGUgR2V0Q2hhcnRUeXBlKHN0cmluZyBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobmFtZSA9PSAic2NhdHRlckNoYXJ0IikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoU2NhdHRlclN0eWxlPT1lU2NhdHRlclN0eWxlLkxpbmVNYXJrZXIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoKChFeGNlbFNjYXR0ZXJDaGFydFNlcmllKVNlcmllc1swXSkuTWFya2VyID09IGVNYXJrZXJTdHlsZS5Ob25lKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUNoYXJ0VHlwZS5YWVNjYXR0ZXJMaW5lc05vTWFya2VyczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKEV4aXN0Tm9kZSgiYzpzZXIvYzpzcFByL2E6bG4vbm9GaWxsIikpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuWFlTY2F0dGVyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlhZU2NhdHRlckxpbmVzOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKFNjYXR0ZXJTdHlsZSA9PSBlU2NhdHRlclN0eWxlLlNtb290aE1hcmtlcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoKEV4Y2VsU2NhdHRlckNoYXJ0U2VyaWUpU2VyaWVzWzBdKS5NYXJrZXIgPT0gZU1hcmtlclN0eWxlLk5vbmUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlhZU2NhdHRlclNtb290aE5vTWFya2VyczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlhZU2NhdHRlclNtb290aDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBiYXNlLkdldENoYXJ0VHlwZShuYW1lKTsKLSAgICAgICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxTY2F0dGVyQ2hhcnRTZXJpZS5jcyBiL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsU2NhdHRlckNoYXJ0U2VyaWUuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MDZjMmMuLjAwMDAwMDAKLS0tIGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxTY2F0dGVyQ2hhcnRTZXJpZS5jcworKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKLSAqCi0gKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgotICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAotICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCi0gKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCi0gKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgotICoKLSAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCi0gKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBKYW4gS8OkbGxtYW4JCUluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCi0gKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlhtbDsKLQotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZy5DaGFydAotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQSBzZXJpZSBmb3IgYSBzY2F0dGVyIGNoYXJ0Ci0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsU2NhdHRlckNoYXJ0U2VyaWUgOiBFeGNlbENoYXJ0U2VyaWUKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjaGFydFNlcmllcyI+UGFyZW50IGNvbGxlY3Rpb248L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5zIj5OYW1lc3BhY2VtYW5hZ2VyPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJub2RlIj5Ub3Bub2RlPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpc1Bpdm90Ij5JcyBwaXZvdGNoYXJ0PC9wYXJhbT4KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxTY2F0dGVyQ2hhcnRTZXJpZShFeGNlbENoYXJ0U2VyaWVzIGNoYXJ0U2VyaWVzLCBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIG5vZGUsIGJvb2wgaXNQaXZvdCkgOgotICAgICAgICAgICAgYmFzZShjaGFydFNlcmllcywgbnMsIG5vZGUsIGlzUGl2b3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjaGFydFNlcmllcy5DaGFydC5DaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXJMaW5lcyB8fAotICAgICAgICAgICAgICAgIGNoYXJ0U2VyaWVzLkNoYXJ0LkNoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlhZU2NhdHRlclNtb290aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNYXJrZXIgPSBlTWFya2VyU3R5bGUuU3F1YXJlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2hhcnRTZXJpZXMuQ2hhcnQuQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuWFlTY2F0dGVyU21vb3RoIHx8Ci0gICAgICAgICAgICAgICAgY2hhcnRTZXJpZXMuQ2hhcnQuQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuWFlTY2F0dGVyU21vb3RoTm9NYXJrZXJzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNtb290aCA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjaGFydFNlcmllcy5DaGFydC5DaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXJMaW5lcyB8fCBjaGFydFNlcmllcy5DaGFydC5DaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXJMaW5lc05vTWFya2VycyB8fCBjaGFydFNlcmllcy5DaGFydC5DaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXIpCi0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTbW9vdGggPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEV4Y2VsQ2hhcnRTZXJpZURhdGFMYWJlbCBfRGF0YUxhYmVsID0gbnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGF0YWxhYmVsCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbENoYXJ0U2VyaWVEYXRhTGFiZWwgRGF0YUxhYmVsCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfRGF0YUxhYmVsID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfRGF0YUxhYmVsID0gbmV3IEV4Y2VsQ2hhcnRTZXJpZURhdGFMYWJlbChfbnMsIF9ub2RlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9EYXRhTGFiZWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIHNtb290aFBhdGggPSAiYzpzbW9vdGgvQHZhbCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNtb290aCBmb3Igc2NhdHRlcmNoYXJ0cwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50IFNtb290aAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludChzbW9vdGhQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludGVybmFsIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoc21vb3RoUGF0aCwgdmFsdWUuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIG1hcmtlclBhdGggPSAiYzptYXJrZXIvYzpzeW1ib2wvQHZhbCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE1hcmtlciBzeW1ib2wgCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBlTWFya2VyU3R5bGUgTWFya2VyCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmluZyBtYXJrZXIgPSBHZXRYbWxOb2RlU3RyaW5nKG1hcmtlclBhdGgpOwotICAgICAgICAgICAgICAgIGlmIChtYXJrZXIgPT0gIiIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZU1hcmtlclN0eWxlLk5vbmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoZU1hcmtlclN0eWxlKUVudW0uUGFyc2UodHlwZW9mKGVNYXJrZXJTdHlsZSksIG1hcmtlciwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9jaGFydFNlcmllcy5DaGFydC5DaGFydFR5cGUgPT0gZUNoYXJ0VHlwZS5YWVNjYXR0ZXJMaW5lc05vTWFya2VycyB8fAotICAgICAgICAgICAgICAgICAgICBfY2hhcnRTZXJpZXMuQ2hhcnQuQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuWFlTY2F0dGVyU21vb3RoTm9NYXJrZXJzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW4ndCBzZXQgbWFya2VyIHN0eWxlIGZvciB0aGlzIGNoYXJ0dHlwZS4iKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcobWFya2VyUGF0aCwgdmFsdWUuVG9TdHJpbmcoKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsU3VyZmFjZUNoYXJ0LmNzIGIvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxTdXJmYWNlQ2hhcnQuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NjgxNTAuLjAwMDAwMDAKLS0tIGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxTdXJmYWNlQ2hhcnQuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCi0gKgotICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KLSAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKLSAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAotICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAotICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KLSAqCi0gKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAotICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkyMDA5LTEwLTAxCi0gKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5YbWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlRhYmxlLlBpdm90VGFibGU7Ci0KLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuQ2hhcnQKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEEgU3VyZmFjZSBjaGFydAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHNlYWxlZCBjbGFzcyBFeGNlbFN1cmZhY2VDaGFydCA6IEV4Y2VsQ2hhcnQKLSAgICB7Ci0gICAgICAgICNyZWdpb24gIkNvbnN0cnVjdG9ycyIKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxTdXJmYWNlQ2hhcnQoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlLCBlQ2hhcnRUeXBlIHR5cGUsIEV4Y2VsQ2hhcnQgdG9wQ2hhcnQsIEV4Y2VsUGl2b3RUYWJsZSBQaXZvdFRhYmxlU291cmNlKSA6Ci0gICAgICAgICAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCB0eXBlLCB0b3BDaGFydCwgUGl2b3RUYWJsZVNvdXJjZSkKLSAgICAgICAgewotICAgICAgICAgICAgSW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIEV4Y2VsU3VyZmFjZUNoYXJ0KEV4Y2VsRHJhd2luZ3MgZHJhd2luZ3MsIFhtbE5vZGUgbm9kZSwgVXJpIHVyaUNoYXJ0LCBQYWNrYWdpbmcuWmlwUGFja2FnZVBhcnQgcGFydCwgWG1sRG9jdW1lbnQgY2hhcnRYbWwsIFhtbE5vZGUgY2hhcnROb2RlKSA6Ci0gICAgICAgICAgIGJhc2UoZHJhd2luZ3MsIG5vZGUsIHVyaUNoYXJ0LCBwYXJ0LCBjaGFydFhtbCwgY2hhcnROb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBJbml0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCBFeGNlbFN1cmZhY2VDaGFydChFeGNlbENoYXJ0IHRvcENoYXJ0LCBYbWxOb2RlIGNoYXJ0Tm9kZSkgOiAKLSAgICAgICAgICAgIGJhc2UodG9wQ2hhcnQsIGNoYXJ0Tm9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgSW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgdm9pZCBJbml0KCkKLSAgICAgICAgewotIAkgICAgICAgIF9mbG9vcj1uZXcgRXhjZWxDaGFydFN1cmZhY2UoTmFtZVNwYWNlTWFuYWdlciwgX2NoYXJ0WG1sSGVscGVyLlRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiYzpmbG9vciIsIE5hbWVTcGFjZU1hbmFnZXIpKTsKLSAgICAgICAgICAgIF9iYWNrV2FsbCA9IG5ldyBFeGNlbENoYXJ0U3VyZmFjZShOYW1lU3BhY2VNYW5hZ2VyLCBfY2hhcnRYbWxIZWxwZXIuVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJjOnNpZGVXYWxsIiwgTmFtZVNwYWNlTWFuYWdlcikpOwotICAgICAgICAgICAgX3NpZGVXYWxsID0gbmV3IEV4Y2VsQ2hhcnRTdXJmYWNlKE5hbWVTcGFjZU1hbmFnZXIsIF9jaGFydFhtbEhlbHBlci5Ub3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImM6YmFja1dhbGwiLCBOYW1lU3BhY2VNYW5hZ2VyKSk7Ci0gICAgICAgICAgICBTZXRUeXBlUHJvcGVydGllcygpOwotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLQotCi0gICAgICAgIEV4Y2VsQ2hhcnRTdXJmYWNlIF9mbG9vcjsKLSAgICAgICAgcHVibGljIEV4Y2VsQ2hhcnRTdXJmYWNlIEZsb29yCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfZmxvb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRXhjZWxDaGFydFN1cmZhY2UgX3NpZGVXYWxsOwotICAgICAgICBwdWJsaWMgRXhjZWxDaGFydFN1cmZhY2UgU2lkZVdhbGwKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9zaWRlV2FsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBFeGNlbENoYXJ0U3VyZmFjZSBfYmFja1dhbGw7Ci0gICAgICAgIHB1YmxpYyBFeGNlbENoYXJ0U3VyZmFjZSBCYWNrV2FsbAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2JhY2tXYWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBXSVJFRlJBTUVfUEFUSCA9ICJjOndpcmVmcmFtZS9AdmFsIjsKLSAgICAgICAgcHVibGljIGJvb2wgV2lyZWZyYW1lCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfY2hhcnRYbWxIZWxwZXIuR2V0WG1sTm9kZUJvb2woV0lSRUZSQU1FX1BBVEgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2NoYXJ0WG1sSGVscGVyLlNldFhtbE5vZGVCb29sKFdJUkVGUkFNRV9QQVRILCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgICBpbnRlcm5hbCB2b2lkIFNldFR5cGVQcm9wZXJ0aWVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgICAgaWYoQ2hhcnRUeXBlPT1lQ2hhcnRUeXBlLlN1cmZhY2VXaXJlZnJhbWUgfHwgQ2hhcnRUeXBlPT1lQ2hhcnRUeXBlLlN1cmZhY2VUb3BWaWV3V2lyZWZyYW1lKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIFdpcmVmcmFtZT10cnVlOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBXaXJlZnJhbWU9ZmFsc2U7Ci0gICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihDaGFydFR5cGU9PWVDaGFydFR5cGUuU3VyZmFjZVRvcFZpZXcgfHwgQ2hhcnRUeXBlPT1lQ2hhcnRUeXBlLlN1cmZhY2VUb3BWaWV3V2lyZWZyYW1lKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBWaWV3M0QuUm90WSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgVmlldzNELlJvdFggPSA5MDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBWaWV3M0QuUm90WSA9IDIwOwotICAgICAgICAgICAgICAgICAgIFZpZXczRC5Sb3RYID0gMTU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFZpZXczRC5SaWdodEFuZ2xlQXhlcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIFZpZXczRC5QZXJzcGVjdGl2ZSA9IDA7Ci0gICAgICAgICAgICAgICAgQXhpc1sxXS5Dcm9zc0JldHdlZW4gPSBlQ3Jvc3NCZXR3ZWVuLk1pZENhdDsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBlQ2hhcnRUeXBlIEdldENoYXJ0VHlwZShzdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoV2lyZWZyYW1lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChuYW1lID09ICJzdXJmYWNlQ2hhcnQiKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuU3VyZmFjZVRvcFZpZXdXaXJlZnJhbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlN1cmZhY2VXaXJlZnJhbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChuYW1lID09ICJzdXJmYWNlQ2hhcnQiKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVDaGFydFR5cGUuU3VyZmFjZVRvcFZpZXc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlQ2hhcnRUeXBlLlN1cmZhY2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxTdXJmYWNlQ2hhcnRTZXJpZS5jcyBiL0VQUGx1cy9EcmF3aW5nL0NoYXJ0L0V4Y2VsU3VyZmFjZUNoYXJ0U2VyaWUuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3Zjg2YzYuLjAwMDAwMDAKLS0tIGEvRVBQbHVzL0RyYXdpbmcvQ2hhcnQvRXhjZWxTdXJmYWNlQ2hhcnRTZXJpZS5jcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQotICoKLSAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCi0gKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCi0gKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKLSAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKLSAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCi0gKgotICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKLSAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEphbiBLw6RsbG1hbgkJSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKLSAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uWG1sOwotCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0Ci17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBIHNlcmllIGZvciBhIHN1cmZhY2UgY2hhcnQKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxTdXJmYWNlQ2hhcnRTZXJpZSA6IEV4Y2VsQ2hhcnRTZXJpZQotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNoYXJ0U2VyaWVzIj5QYXJlbnQgY29sbGVjdGlvbjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibnMiPk5hbWVzcGFjZW1hbmFnZXI8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5vZGUiPlRvcG5vZGU8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImlzUGl2b3QiPklzIHBpdm90Y2hhcnQ8L3BhcmFtPgotICAgICAgICBpbnRlcm5hbCBFeGNlbFN1cmZhY2VDaGFydFNlcmllKEV4Y2VsQ2hhcnRTZXJpZXMgY2hhcnRTZXJpZXMsIFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsIFhtbE5vZGUgbm9kZSwgYm9vbCBpc1Bpdm90KSA6Ci0gICAgICAgICAgICBiYXNlKGNoYXJ0U2VyaWVzLCBucywgbm9kZSwgaXNQaXZvdCkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvRXhjZWxEcmF3aW5nQmFzZS5jcyBiL0VQUGx1cy9EcmF3aW5nL0V4Y2VsRHJhd2luZ0Jhc2UuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExY2M0YTcuLjAwMDAwMDAKLS0tIGEvRVBQbHVzL0RyYXdpbmcvRXhjZWxEcmF3aW5nQmFzZS5jcworKysgL2Rldi9udWxsCkBAIC0xLDY2MiArMCwwIEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKLSAqCi0gKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgotICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAotICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCi0gKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCi0gKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgotICoKLSAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCi0gKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBKYW4gS8OkbGxtYW4JCUluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDEwLTA2LTAxCi0gKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlhtbDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRHJhd2luZy5DaGFydDsKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRyYXdpbmcKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFRleHQgYW5jaG9yaW5nCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZW51bSBlVGV4dEFuY2hvcmluZ1R5cGUKLSAgICB7Ci0gICAgICAgIEJvdHRvbSwKLSAgICAgICAgQ2VudGVyLAotICAgICAgICBEaXN0cmlidXRlZCwKLSAgICAgICAgSnVzdGlmeSwKLSAgICAgICAgVG9wCi0gICAgfQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVmVydGljYWwgdGV4dCB0eXBlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZW51bSBlVGV4dFZlcnRpY2FsVHlwZQotICAgIHsKLSAgICAgICAgRWFzdEFzaWFuVmVydGljYWwsCi0gICAgICAgIEhvcml6b250YWwsCi0gICAgICAgIE1vbmdvbGlhblZlcnRpY2FsLAotICAgICAgICBWZXJ0aWNhbCwKLSAgICAgICAgVmVydGljYWwyNzAsCi0gICAgICAgIFdvcmRBcnRWZXJ0aWNhbCwKLSAgICAgICAgV29yZEFydFZlcnRpY2FsUmlnaHRUb0xlZnQKLQotICAgIH0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEhvdyB0aGUgZHJhd2luZyB3aWxsIGJlIHJlc2l6ZWQuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZW51bSBlRWRpdEFzCi0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTcGVjaWZpZXMgdGhhdCB0aGUgY3VycmVudCBzdGFydCBhbmQgZW5kIHBvc2l0aW9ucyBzaGFsbAotICAgICAgICAvLy8gYmUgbWFpbnRhaW5lZCB3aXRoIHJlc3BlY3QgdG8gdGhlIGRpc3RhbmNlcyBmcm9tIHRoZQotICAgICAgICAvLy8gYWJzb2x1dGUgc3RhcnQgcG9pbnQgb2YgdGhlIHdvcmtzaGVldC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgQWJzb2x1dGUsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNwZWNpZmllcyB0aGF0IHRoZSBjdXJyZW50IGRyYXdpbmcgc2hhbGwgbW92ZSB3aXRoIGl0cwotICAgICAgICAvLy9yb3cgYW5kIGNvbHVtbiAoaS5lLiB0aGUgb2JqZWN0IGlzIGFuY2hvcmVkIHRvIHRoZQotICAgICAgICAvLy8gYWN0dWFsIGZyb20gcm93IGFuZCBjb2x1bW4pLCBidXQgdGhhdCB0aGUgc2l6ZSBzaGFsbAotICAgICAgICAvLy9yZW1haW4gYWJzb2x1dGUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIE9uZUNlbGwsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNwZWNpZmllcyB0aGF0IHRoZSBjdXJyZW50IGRyYXdpbmcgc2hhbGwgbW92ZSBhbmQKLSAgICAgICAgLy8vIHJlc2l6ZSB0byBtYWludGFpbiBpdHMgcm93IGFuZCBjb2x1bW4gYW5jaG9ycyAoaS5lLiB0aGUKLSAgICAgICAgLy8vIG9iamVjdCBpcyBhbmNob3JlZCB0byB0aGUgYWN0dWFsIGZyb20gYW5kIHRvIHJvdyBhbmQgY29sdW1uKS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgVHdvQ2VsbAotICAgIH0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEJhc2UgY2xhc3MgZm9yIHR3b2FuY2hvcmVkIGRyYXdpbmdzLiAKLSAgICAvLy8gRHJhd2luZ3MgYXJlIENoYXJ0cywgc2hhcGVzIGFuZCBQaWN0dXJlcy4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbERyYXdpbmcgOiBYbWxIZWxwZXIsIElEaXNwb3NhYmxlIAotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUG9zaXRpb24gb2YgdGhlIGEgZHJhd2luZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGNsYXNzIEV4Y2VsUG9zaXRpb24gOiBYbWxIZWxwZXIKLSAgICAgICAgewotICAgICAgICAgICAgWG1sTm9kZSBfbm9kZTsKLSAgICAgICAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgX25zOyAgICAgICAgICAgIAotICAgICAgICAgICAgaW50ZXJuYWwgRXhjZWxQb3NpdGlvbihYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIG5vZGUpIDoKLSAgICAgICAgICAgICAgICBiYXNlIChucyxub2RlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9ub2RlID0gbm9kZTsKLSAgICAgICAgICAgICAgICBfbnMgPSBuczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnN0IHN0cmluZyBjb2xQYXRoPSJ4ZHI6Y29sIjsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgQ29sdW1uCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludChjb2xQYXRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKGNvbFBhdGgsIHZhbHVlLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnN0IHN0cmluZyByb3dQYXRoPSJ4ZHI6cm93IjsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgUm93Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludChyb3dQYXRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKHJvd1BhdGgsIHZhbHVlLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnN0IHN0cmluZyBjb2xPZmZQYXRoID0gInhkcjpjb2xPZmYiOwotICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAgICAgLy8vIENvbHVtbiBPZmZzZXQKLSAgICAgICAgICAgIC8vLyAKLSAgICAgICAgICAgIC8vLyBFTVUgdW5pdHMgICAxY20gICAgICAgICA9ICAgMS8zNjAwMDAgCi0gICAgICAgICAgICAvLy8gICAgICAgICAgICAgMVVTIGluY2ggICAgPSAgIDEvOTE0NDAwCi0gICAgICAgICAgICAvLy8gICAgICAgICAgICAgMXBpeGVsICAgICAgPSAgIDEvOTUyNQotICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgQ29sdW1uT2ZmCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludChjb2xPZmZQYXRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKGNvbE9mZlBhdGgsIHZhbHVlLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnN0IHN0cmluZyByb3dPZmZQYXRoID0gInhkcjpyb3dPZmYiOwotICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAgICAgLy8vIFJvdyBPZmZzZXQKLSAgICAgICAgICAgIC8vLyAKLSAgICAgICAgICAgIC8vLyBFTVUgdW5pdHMgICAxY20gICAgICAgICA9ICAgMS8zNjAwMDAgCi0gICAgICAgICAgICAvLy8gICAgICAgICAgICAgMVVTIGluY2ggICAgPSAgIDEvOTE0NDAwCi0gICAgICAgICAgICAvLy8gICAgICAgICAgICAgMXBpeGVsICAgICAgPSAgIDEvOTUyNQotICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgUm93T2ZmCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludChyb3dPZmZQYXRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKHJvd09mZlBhdGgsIHZhbHVlLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcm90ZWN0ZWQgRXhjZWxEcmF3aW5ncyBfZHJhd2luZ3M7Ci0gICAgICAgIHByb3RlY3RlZCBYbWxOb2RlIF90b3BOb2RlOwotICAgICAgICBzdHJpbmcgX25hbWVYUGF0aDsKLSAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIGludCBfaWQ7Ci0gICAgICAgIGNvbnN0IGZsb2F0IFNUQU5EQVJEX0RQSSA9IDk2OwotICAgICAgICBwdWJsaWMgY29uc3QgaW50IEVNVV9QRVJfUElYRUwgPSA5NTI1OwotCi0gICAgICAgIGludGVybmFsIEV4Y2VsRHJhd2luZyhFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBYbWxOb2RlIG5vZGUsIHN0cmluZyBuYW1lWFBhdGgpIDoKLSAgICAgICAgICAgIGJhc2UoZHJhd2luZ3MuTmFtZVNwYWNlTWFuYWdlciwgbm9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgX2RyYXdpbmdzID0gZHJhd2luZ3M7Ci0gICAgICAgICAgICBfdG9wTm9kZSA9IG5vZGU7Ci0gICAgICAgICAgICBfaWQgPSBkcmF3aW5ncy5Xb3Jrc2hlZXQuV29ya2Jvb2suX25leHREcmF3aW5nSUQrKzsKLSAgICAgICAgICAgIFhtbE5vZGUgcG9zTm9kZSA9IG5vZGUuU2VsZWN0U2luZ2xlTm9kZSgieGRyOmZyb20iLCBkcmF3aW5ncy5OYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIGlmIChub2RlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRnJvbSA9IG5ldyBFeGNlbFBvc2l0aW9uKGRyYXdpbmdzLk5hbWVTcGFjZU1hbmFnZXIsIHBvc05vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcG9zTm9kZSA9IG5vZGUuU2VsZWN0U2luZ2xlTm9kZSgieGRyOnRvIiwgZHJhd2luZ3MuTmFtZVNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICBpZiAobm9kZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFRvID0gbmV3IEV4Y2VsUG9zaXRpb24oZHJhd2luZ3MuTmFtZVNwYWNlTWFuYWdlciwgcG9zTm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVG8gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX25hbWVYUGF0aCA9IG5hbWVYUGF0aDsKLSAgICAgICAgICAgIFNjaGVtYU5vZGVPcmRlciA9IG5ldyBzdHJpbmdbXSB7ICJmcm9tIiwgInRvIiwgImdyYXBoaWNGcmFtZSIsICJzcCIsICJjbGllbnREYXRhIiAgfTsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgbmFtZSBvZiB0aGUgZHJhd2luZyBvYmplY3QKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBOYW1lIAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfbmFtZVhQYXRoID09ICIiKSByZXR1cm4gIiI7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKF9uYW1lWFBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiOyAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfbmFtZVhQYXRoID09ICIiKSB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfbmFtZVhQYXRoLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSG93IEV4Y2VsIHJlc2l6ZSBkcmF3aW5ncyB3aGVuIHRoZSBjb2x1bW4gd2lkdGggaXMgY2hhbmdlZCB3aXRoaW4gRXhjZWwuCi0gICAgICAgIC8vLyBUaGUgd2lkdGggb2YgZHJhd2luZ3MgYXJlIGN1cnJlbnRseSBOT1QgcmVzaXplZCBpbiBFUFBMdXMgd2hlbiB0aGUgY29sdW1uIHdpZHRoIGNoYW5nZXMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGVFZGl0QXMgRWRpdEFzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHMgPSBHZXRYbWxOb2RlU3RyaW5nKCJAZWRpdEFzIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzID09ICIiKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUVkaXRBcy5Ud29DZWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlRWRpdEFzKUVudW0uUGFyc2UodHlwZW9mKGVFZGl0QXMpLCBzLHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUVkaXRBcy5Ud29DZWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmluZyBzPXZhbHVlLlRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGVkaXRBcyIsIHMuU3Vic3RyaW5nKDAsMSkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKStzLlN1YnN0cmluZygxLHMuTGVuZ3RoLTEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgbG9ja2VkUGF0aD0ieGRyOmNsaWVudERhdGEvQGZMb2Nrc1dpdGhTaGVldCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIExvY2sgZHJhd2luZwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBMb2NrZWQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKGxvY2tlZFBhdGgsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2wobG9ja2VkUGF0aCwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBwcmludFBhdGggPSAieGRyOmNsaWVudERhdGEvQGZQcmludHNXaXRoU2hlZXQiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBQcmludCBkcmF3aW5nIHdpdGggc2hlZXQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgUHJpbnQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKHByaW50UGF0aCwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChwcmludFBhdGgsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVG9wIExlZnQgcG9zaXRpb24KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsUG9zaXRpb24gRnJvbSB7IGdldDsgc2V0OyB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEJvdHRvbSByaWdodCBwb3NpdGlvbgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxQb3NpdGlvbiBUbwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkIG5ldyBEcmF3aW5nIHR5cGVzIGhlcmUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkcmF3aW5ncyI+VGhlIGRyYXdpbmcgY29sbGVjdGlvbjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibm9kZSI+WG1sIHRvcCBub2RlPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBEcmF3aW5nIG9iamVjdDwvcmV0dXJucz4KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIEV4Y2VsRHJhd2luZyBHZXREcmF3aW5nKEV4Y2VsRHJhd2luZ3MgZHJhd2luZ3MsIFhtbE5vZGUgbm9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG5vZGUuU2VsZWN0U2luZ2xlTm9kZSgieGRyOnNwIiwgZHJhd2luZ3MuTmFtZVNwYWNlTWFuYWdlcikgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsU2hhcGUoZHJhd2luZ3MsIG5vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJ4ZHI6cGljIiwgZHJhd2luZ3MuTmFtZVNwYWNlTWFuYWdlcikgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsUGljdHVyZShkcmF3aW5ncywgbm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChub2RlLlNlbGVjdFNpbmdsZU5vZGUoInhkcjpncmFwaGljRnJhbWUiLCBkcmF3aW5ncy5OYW1lU3BhY2VNYW5hZ2VyKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbENoYXJ0LkdldENoYXJ0KGRyYXdpbmdzLCBub2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRHJhd2luZyhkcmF3aW5ncywgbm9kZSwgIiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIHN0cmluZyBJZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gX2lkLlRvU3RyaW5nKCk7IH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIEdldFRleHRBY2hvcmluZ1RleHQoZVRleHRBbmNob3JpbmdUeXBlIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgZVRleHRBbmNob3JpbmdUeXBlLkJvdHRvbToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJiIjsKLSAgICAgICAgICAgICAgICBjYXNlIGVUZXh0QW5jaG9yaW5nVHlwZS5DZW50ZXI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiY3RyIjsKLSAgICAgICAgICAgICAgICBjYXNlIGVUZXh0QW5jaG9yaW5nVHlwZS5EaXN0cmlidXRlZDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJkaXN0IjsKLSAgICAgICAgICAgICAgICBjYXNlIGVUZXh0QW5jaG9yaW5nVHlwZS5KdXN0aWZ5OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gImp1c3QiOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAidCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIGVUZXh0QW5jaG9yaW5nVHlwZSBHZXRUZXh0QWNob3JpbmdFbnVtKHN0cmluZyB0ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHRleHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAiYiI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlVGV4dEFuY2hvcmluZ1R5cGUuQm90dG9tOwotICAgICAgICAgICAgICAgIGNhc2UgImN0ciI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlVGV4dEFuY2hvcmluZ1R5cGUuQ2VudGVyOwotICAgICAgICAgICAgICAgIGNhc2UgImRpc3QiOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVRleHRBbmNob3JpbmdUeXBlLkRpc3RyaWJ1dGVkOwotICAgICAgICAgICAgICAgIGNhc2UgImp1c3QiOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVRleHRBbmNob3JpbmdUeXBlLkp1c3RpZnk7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVUZXh0QW5jaG9yaW5nVHlwZS5Ub3A7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIHN0cmluZyBHZXRUZXh0VmVydGljYWxUZXh0KGVUZXh0VmVydGljYWxUeXBlIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgZVRleHRWZXJ0aWNhbFR5cGUuRWFzdEFzaWFuVmVydGljYWw6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiZWFWZXJ0IjsKLSAgICAgICAgICAgICAgICBjYXNlIGVUZXh0VmVydGljYWxUeXBlLk1vbmdvbGlhblZlcnRpY2FsOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm1vbmdvbGlhblZlcnQiOwotICAgICAgICAgICAgICAgIGNhc2UgZVRleHRWZXJ0aWNhbFR5cGUuVmVydGljYWw6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAidmVydCI7Ci0gICAgICAgICAgICAgICAgY2FzZSBlVGV4dFZlcnRpY2FsVHlwZS5WZXJ0aWNhbDI3MDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2ZXJ0MjcwIjsKLSAgICAgICAgICAgICAgICBjYXNlIGVUZXh0VmVydGljYWxUeXBlLldvcmRBcnRWZXJ0aWNhbDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ3b3JkQXJ0VmVydCI7Ci0gICAgICAgICAgICAgICAgY2FzZSBlVGV4dFZlcnRpY2FsVHlwZS5Xb3JkQXJ0VmVydGljYWxSaWdodFRvTGVmdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ3b3JkQXJ0VmVydFJ0bCI7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJob3J6IjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgZVRleHRWZXJ0aWNhbFR5cGUgR2V0VGV4dFZlcnRpY2FsRW51bShzdHJpbmcgdGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoICh0ZXh0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgImVhVmVydCI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlVGV4dFZlcnRpY2FsVHlwZS5FYXN0QXNpYW5WZXJ0aWNhbDsKLSAgICAgICAgICAgICAgICBjYXNlICJtb25nb2xpYW5WZXJ0IjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVUZXh0VmVydGljYWxUeXBlLk1vbmdvbGlhblZlcnRpY2FsOwotICAgICAgICAgICAgICAgIGNhc2UgInZlcnQiOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVRleHRWZXJ0aWNhbFR5cGUuVmVydGljYWw7Ci0gICAgICAgICAgICAgICAgY2FzZSAidmVydDI3MCI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlVGV4dFZlcnRpY2FsVHlwZS5WZXJ0aWNhbDI3MDsKLSAgICAgICAgICAgICAgICBjYXNlICJ3b3JkQXJ0VmVydCI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlVGV4dFZlcnRpY2FsVHlwZS5Xb3JkQXJ0VmVydGljYWw7Ci0gICAgICAgICAgICAgICAgY2FzZSAid29yZEFydFZlcnRSdGwiOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVRleHRWZXJ0aWNhbFR5cGUuV29yZEFydFZlcnRpY2FsUmlnaHRUb0xlZnQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVUZXh0VmVydGljYWxUeXBlLkhvcml6b250YWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgI3JlZ2lvbiAiSW50ZXJuYWwgc2l6aW5nIGZ1bmN0aW9ucyIKLSAgICAgICAgaW50ZXJuYWwgaW50IEdldFBpeGVsTGVmdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdzID0gX2RyYXdpbmdzLldvcmtzaGVldDsKLSAgICAgICAgICAgIGRlY2ltYWwgbWR3ID0gd3MuV29ya2Jvb2suTWF4Rm9udFdpZHRoOwotCi0gICAgICAgICAgICBpbnQgcGl4ID0gMDsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IEZyb20uQ29sdW1uOyBjb2wrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwaXggKz0gKGludClkZWNpbWFsLlRydW5jYXRlKCgoMjU2ICogR2V0Q29sdW1uV2lkdGgoY29sICsgMSkgKyBkZWNpbWFsLlRydW5jYXRlKDEyOCAvIChkZWNpbWFsKW1kdykpIC8gMjU2KSAqIG1kdyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwaXggKz0gRnJvbS5Db2x1bW5PZmYgLyBFTVVfUEVSX1BJWEVMOwotICAgICAgICAgICAgcmV0dXJuIHBpeDsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBpbnQgR2V0UGl4ZWxUb3AoKQotICAgICAgICB7Ci0gICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3cyA9IF9kcmF3aW5ncy5Xb3Jrc2hlZXQ7Ci0gICAgICAgICAgICBpbnQgcGl4ID0gMDsKLSAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IEZyb20uUm93OyByb3crKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwaXggKz0gKGludCkoR2V0Um93V2lkdGgocm93ICsgMSkgLyAwLjc1KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBpeCArPSBGcm9tLlJvd09mZiAvIEVNVV9QRVJfUElYRUw7Ci0gICAgICAgICAgICByZXR1cm4gcGl4OwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIGludCBHZXRQaXhlbFdpZHRoKCkKLSAgICAgICAgewotICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd3MgPSBfZHJhd2luZ3MuV29ya3NoZWV0OwotICAgICAgICAgICAgZGVjaW1hbCBtZHcgPSB3cy5Xb3JrYm9vay5NYXhGb250V2lkdGg7Ci0KLSAgICAgICAgICAgIGludCBwaXggPSAtRnJvbS5Db2x1bW5PZmYgLyBFTVVfUEVSX1BJWEVMOwotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gRnJvbS5Db2x1bW4gKyAxOyBjb2wgPD0gVG8uQ29sdW1uOyBjb2wrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwaXggKz0gKGludClkZWNpbWFsLlRydW5jYXRlKCgoMjU2ICogR2V0Q29sdW1uV2lkdGgoY29sKSArIGRlY2ltYWwuVHJ1bmNhdGUoMTI4IC8gKGRlY2ltYWwpbWR3KSkgLyAyNTYpICogbWR3KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBpeCArPSBUby5Db2x1bW5PZmYgLyBFTVVfUEVSX1BJWEVMOwotICAgICAgICAgICAgcmV0dXJuIHBpeDsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBpbnQgR2V0UGl4ZWxIZWlnaHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3cyA9IF9kcmF3aW5ncy5Xb3Jrc2hlZXQ7Ci0KLSAgICAgICAgICAgIGludCBwaXggPSAtKEZyb20uUm93T2ZmIC8gRU1VX1BFUl9QSVhFTCk7Ci0gICAgICAgICAgICBmb3IgKGludCByb3cgPSBGcm9tLlJvdyArIDE7IHJvdyA8PSBUby5Sb3c7IHJvdysrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBpeCArPSAoaW50KShHZXRSb3dXaWR0aChyb3cpIC8gMC43NSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwaXggKz0gVG8uUm93T2ZmIC8gRU1VX1BFUl9QSVhFTDsKLSAgICAgICAgICAgIHJldHVybiBwaXg7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGRlY2ltYWwgR2V0Q29sdW1uV2lkdGgoaW50IGNvbCkKLSAgICAgICAgewotICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd3MgPSBfZHJhd2luZ3MuV29ya3NoZWV0OwotICAgICAgICAgICAgdmFyIGNvbHVtbiA9IHdzLl92YWx1ZXMuR2V0VmFsdWUoMCwgY29sKSBhcyBFeGNlbENvbHVtbjsKLSAgICAgICAgICAgIGlmIChjb2x1bW4gPT0gbnVsbCkgICAvL0NoZWNrIHRoYXQgdGhlIGNvbHVtbiBleGlzdHMKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGRlY2ltYWwpd3MuRGVmYXVsdENvbFdpZHRoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAoZGVjaW1hbCl3cy5Db2x1bW4oY29sKS5WaXN1YWxXaWR0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIGRvdWJsZSBHZXRSb3dXaWR0aChpbnQgcm93KQotICAgICAgICB7Ci0gICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3cyA9IF9kcmF3aW5ncy5Xb3Jrc2hlZXQ7Ci0gICAgICAgICAgICBvYmplY3QgbyA9IG51bGw7Ci0gICAgICAgICAgICBpZiAod3MuX3ZhbHVlcy5FeGlzdHMocm93LCAwLCByZWYgbykgJiYgbyAhPSBudWxsKSAgIC8vQ2hlY2sgdGhhdCB0aGUgcm93IGV4aXN0cwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBpbnRlcm5hbFJvdyA9IChSb3dJbnRlcm5hbClvOwotICAgICAgICAgICAgICAgIGlmIChpbnRlcm5hbFJvdy5IZWlnaHQgPj0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbFJvdy5IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIChkb3VibGUpd3MuRGVmYXVsdFJvd0hlaWdodDsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCB2b2lkIFNldFBpeGVsVG9wKGludCBwaXhlbHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdzID0gX2RyYXdpbmdzLldvcmtzaGVldDsKLSAgICAgICAgICAgIGRlY2ltYWwgbWR3ID0gd3MuV29ya2Jvb2suTWF4Rm9udFdpZHRoOwotICAgICAgICAgICAgaW50IHByZXZQaXggPSAwOwotICAgICAgICAgICAgaW50IHBpeCA9IChpbnQpKEdldFJvd1dpZHRoKDEpIC8gMC43NSk7Ci0gICAgICAgICAgICBpbnQgcm93ID0gMjsKLQotICAgICAgICAgICAgd2hpbGUgKHBpeCA8IHBpeGVscykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmV2UGl4ID0gcGl4OwotICAgICAgICAgICAgICAgIHBpeCArPSAoaW50KShHZXRSb3dXaWR0aChyb3crKykgLyAwLjc1KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBpeCA9PSBwaXhlbHMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRnJvbS5Sb3cgPSByb3cgLSAxOwotICAgICAgICAgICAgICAgIEZyb20uUm93T2ZmID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGcm9tLlJvdyA9IHJvdyAtIDI7Ci0gICAgICAgICAgICAgICAgRnJvbS5Sb3dPZmYgPSAocGl4ZWxzIC0gcHJldlBpeCkgKiBFTVVfUEVSX1BJWEVMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIHZvaWQgU2V0UGl4ZWxMZWZ0KGludCBwaXhlbHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdzID0gX2RyYXdpbmdzLldvcmtzaGVldDsKLSAgICAgICAgICAgIGRlY2ltYWwgbWR3ID0gd3MuV29ya2Jvb2suTWF4Rm9udFdpZHRoOwotICAgICAgICAgICAgaW50IHByZXZQaXggPSAwOwotICAgICAgICAgICAgaW50IHBpeCA9IChpbnQpZGVjaW1hbC5UcnVuY2F0ZSgoKDI1NiAqIEdldENvbHVtbldpZHRoKDEpICsgZGVjaW1hbC5UcnVuY2F0ZSgxMjggLyAoZGVjaW1hbCltZHcpKSAvIDI1NikgKiBtZHcpOwotICAgICAgICAgICAgaW50IGNvbCA9IDI7Ci0KLSAgICAgICAgICAgIHdoaWxlIChwaXggPCBwaXhlbHMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJldlBpeCA9IHBpeDsKLSAgICAgICAgICAgICAgICBwaXggKz0gKGludClkZWNpbWFsLlRydW5jYXRlKCgoMjU2ICogR2V0Q29sdW1uV2lkdGgoY29sKyspICsgZGVjaW1hbC5UcnVuY2F0ZSgxMjggLyAoZGVjaW1hbCltZHcpKSAvIDI1NikgKiBtZHcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBpeCA9PSBwaXhlbHMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRnJvbS5Db2x1bW4gPSBjb2wgLSAxOwotICAgICAgICAgICAgICAgIEZyb20uQ29sdW1uT2ZmID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGcm9tLkNvbHVtbiA9IGNvbCAtIDI7Ci0gICAgICAgICAgICAgICAgRnJvbS5Db2x1bW5PZmYgPSAocGl4ZWxzIC0gcHJldlBpeCkgKiBFTVVfUEVSX1BJWEVMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIHZvaWQgU2V0UGl4ZWxIZWlnaHQoaW50IHBpeGVscykKLSAgICAgICAgewotICAgICAgICAgICAgU2V0UGl4ZWxIZWlnaHQocGl4ZWxzLCBTVEFOREFSRF9EUEkpOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIHZvaWQgU2V0UGl4ZWxIZWlnaHQoaW50IHBpeGVscywgZmxvYXQgZHBpKQotICAgICAgICB7Ci0gICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3cyA9IF9kcmF3aW5ncy5Xb3Jrc2hlZXQ7Ci0gICAgICAgICAgICAvL2RlY2ltYWwgbWR3ID0gd3MuV29ya2Jvb2suTWF4Rm9udFdpZHRoOwotICAgICAgICAgICAgcGl4ZWxzID0gKGludCkocGl4ZWxzIC8gKGRwaSAvIFNUQU5EQVJEX0RQSSkgKyAuNSk7Ci0gICAgICAgICAgICBpbnQgcGl4T2ZmID0gcGl4ZWxzIC0gKChpbnQpKHdzLlJvdyhGcm9tLlJvdyArIDEpLkhlaWdodCAvIDAuNzUpIC0gKGludCkoRnJvbS5Sb3dPZmYgLyBFTVVfUEVSX1BJWEVMKSk7Ci0gICAgICAgICAgICBpbnQgcHJldlBpeE9mZiA9IHBpeGVsczsKLSAgICAgICAgICAgIGludCByb3cgPSBGcm9tLlJvdyArIDE7Ci0KLSAgICAgICAgICAgIHdoaWxlIChwaXhPZmYgPj0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmV2UGl4T2ZmID0gcGl4T2ZmOwotICAgICAgICAgICAgICAgIHBpeE9mZiAtPSAoaW50KShHZXRSb3dXaWR0aCgrK3JvdykgLyAwLjc1KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRvLlJvdyA9IHJvdyAtIDE7Ci0gICAgICAgICAgICBpZiAoRnJvbS5Sb3cgPT0gVG8uUm93KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFRvLlJvd09mZiA9IEZyb20uUm93T2ZmICsgKHBpeGVscykgKiBFTVVfUEVSX1BJWEVMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFRvLlJvd09mZiA9IHByZXZQaXhPZmYgKiBFTVVfUEVSX1BJWEVMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIHZvaWQgU2V0UGl4ZWxXaWR0aChpbnQgcGl4ZWxzKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZXRQaXhlbFdpZHRoKHBpeGVscywgU1RBTkRBUkRfRFBJKTsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCB2b2lkIFNldFBpeGVsV2lkdGgoaW50IHBpeGVscywgZmxvYXQgZHBpKQotICAgICAgICB7Ci0gICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3cyA9IF9kcmF3aW5ncy5Xb3Jrc2hlZXQ7Ci0gICAgICAgICAgICBkZWNpbWFsIG1kdyA9IHdzLldvcmtib29rLk1heEZvbnRXaWR0aDsKLQotICAgICAgICAgICAgcGl4ZWxzID0gKGludCkocGl4ZWxzIC8gKGRwaSAvIFNUQU5EQVJEX0RQSSkgKyAuNSk7Ci0gICAgICAgICAgICBpbnQgcGl4T2ZmID0gKGludClwaXhlbHMgLSAoKGludClkZWNpbWFsLlRydW5jYXRlKCgoMjU2ICogR2V0Q29sdW1uV2lkdGgoRnJvbS5Db2x1bW4gKyAxKSArIGRlY2ltYWwuVHJ1bmNhdGUoMTI4IC8gKGRlY2ltYWwpbWR3KSkgLyAyNTYpICogbWR3KSAtIEZyb20uQ29sdW1uT2ZmIC8gRU1VX1BFUl9QSVhFTCk7Ci0gICAgICAgICAgICBpbnQgcHJldlBpeE9mZiA9IEZyb20uQ29sdW1uT2ZmIC8gRU1VX1BFUl9QSVhFTCArIChpbnQpcGl4ZWxzOwotICAgICAgICAgICAgaW50IGNvbCA9IEZyb20uQ29sdW1uICsgMjsKLQotICAgICAgICAgICAgd2hpbGUgKHBpeE9mZiA+PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByZXZQaXhPZmYgPSBwaXhPZmY7Ci0gICAgICAgICAgICAgICAgcGl4T2ZmIC09IChpbnQpZGVjaW1hbC5UcnVuY2F0ZSgoKDI1NiAqIEdldENvbHVtbldpZHRoKGNvbCsrKSArIGRlY2ltYWwuVHJ1bmNhdGUoMTI4IC8gKGRlY2ltYWwpbWR3KSkgLyAyNTYpICogbWR3KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVG8uQ29sdW1uID0gY29sIC0gMjsKLSAgICAgICAgICAgIFRvLkNvbHVtbk9mZiA9IHByZXZQaXhPZmYgKiBFTVVfUEVSX1BJWEVMOwotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLSAgICAgICAgI3JlZ2lvbiAiUHVibGljIHNpemluZyBmdW5jdGlvbnMiCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNldCB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIGEgZHJhd2luZy4gCi0gICAgICAgIC8vLyBOb3RlIHRoYXQgcmVzaXppbmcgY29sdW1ucyAvIHJvd3MgYWZ0ZXIgdXNpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIGVmZmVjdCB0aGUgcG9zaXRpb24gb2YgdGhlIGRyYXdpbmcKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJQaXhlbFRvcCI+VG9wIHBpeGVsPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJQaXhlbExlZnQiPkxlZnQgcGl4ZWw8L3BhcmFtPgotICAgICAgICBwdWJsaWMgdm9pZCBTZXRQb3NpdGlvbihpbnQgUGl4ZWxUb3AsIGludCBQaXhlbExlZnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCB3aWR0aCA9IEdldFBpeGVsV2lkdGgoKTsKLSAgICAgICAgICAgIGludCBoZWlnaHQgPSBHZXRQaXhlbEhlaWdodCgpOwotCi0gICAgICAgICAgICBTZXRQaXhlbFRvcChQaXhlbFRvcCk7Ci0gICAgICAgICAgICBTZXRQaXhlbExlZnQoUGl4ZWxMZWZ0KTsKLQotICAgICAgICAgICAgU2V0UGl4ZWxXaWR0aCh3aWR0aCk7Ci0gICAgICAgICAgICBTZXRQaXhlbEhlaWdodChoZWlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNldCB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIGEgZHJhd2luZy4gCi0gICAgICAgIC8vLyBOb3RlIHRoYXQgcmVzaXppbmcgY29sdW1ucyAvIHJvd3MgYWZ0ZXIgdXNpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIGVmZmVjdCB0aGUgcG9zaXRpb24gb2YgdGhlIGRyYXdpbmcKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJSb3ciPlN0YXJ0IHJvdzwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iUm93T2Zmc2V0UGl4ZWxzIj5PZmZzZXQgaW4gcGl4ZWxzPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJDb2x1bW4iPlN0YXJ0IENvbHVtbjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iQ29sdW1uT2Zmc2V0UGl4ZWxzIj5PZmZzZXQgaW4gcGl4ZWxzPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgU2V0UG9zaXRpb24oaW50IFJvdywgaW50IFJvd09mZnNldFBpeGVscywgaW50IENvbHVtbiwgaW50IENvbHVtbk9mZnNldFBpeGVscykKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHdpZHRoID0gR2V0UGl4ZWxXaWR0aCgpOwotICAgICAgICAgICAgaW50IGhlaWdodCA9IEdldFBpeGVsSGVpZ2h0KCk7Ci0KLSAgICAgICAgICAgIEZyb20uUm93ID0gUm93OwotICAgICAgICAgICAgRnJvbS5Sb3dPZmYgPSBSb3dPZmZzZXRQaXhlbHMgKiBFTVVfUEVSX1BJWEVMOwotICAgICAgICAgICAgRnJvbS5Db2x1bW4gPSBDb2x1bW47Ci0gICAgICAgICAgICBGcm9tLkNvbHVtbk9mZiA9IENvbHVtbk9mZnNldFBpeGVscyAqIEVNVV9QRVJfUElYRUw7Ci0KLSAgICAgICAgICAgIFNldFBpeGVsV2lkdGgod2lkdGgpOwotICAgICAgICAgICAgU2V0UGl4ZWxIZWlnaHQoaGVpZ2h0KTsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTZXQgc2l6ZSBpbiBQZXJjZW50Ci0gICAgICAgIC8vLyBOb3RlIHRoYXQgcmVzaXppbmcgY29sdW1ucyAvIHJvd3MgYWZ0ZXIgdXNpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIGVmZmVjdCB0aGUgc2l6ZSBvZiB0aGUgZHJhd2luZwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlBlcmNlbnQiPjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgU2V0U2l6ZShpbnQgUGVyY2VudCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHdpZHRoID0gR2V0UGl4ZWxXaWR0aCgpOwotICAgICAgICAgICAgaW50IGhlaWdodCA9IEdldFBpeGVsSGVpZ2h0KCk7Ci0KLSAgICAgICAgICAgIHdpZHRoID0gKGludCkod2lkdGggKiAoKGRlY2ltYWwpUGVyY2VudCAvIDEwMCkpOwotICAgICAgICAgICAgaGVpZ2h0ID0gKGludCkoaGVpZ2h0ICogKChkZWNpbWFsKVBlcmNlbnQgLyAxMDApKTsKLQotICAgICAgICAgICAgU2V0UGl4ZWxXaWR0aCh3aWR0aCwgOTYpOwotICAgICAgICAgICAgU2V0UGl4ZWxIZWlnaHQoaGVpZ2h0LCA5Nik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU2V0IHNpemUgaW4gcGl4ZWxzCi0gICAgICAgIC8vLyBOb3RlIHRoYXQgcmVzaXppbmcgY29sdW1ucyAvIHJvd3MgYWZ0ZXIgdXNpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIGVmZmVjdCB0aGUgc2l6ZSBvZiB0aGUgZHJhd2luZwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlBpeGVsV2lkdGgiPldpZHRoIGluIHBpeGVsczwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iUGl4ZWxIZWlnaHQiPkhlaWdodCBpbiBwaXhlbHM8L3BhcmFtPgotICAgICAgICBwdWJsaWMgdm9pZCBTZXRTaXplKGludCBQaXhlbFdpZHRoLCBpbnQgUGl4ZWxIZWlnaHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNldFBpeGVsV2lkdGgoUGl4ZWxXaWR0aCk7Ci0gICAgICAgICAgICBTZXRQaXhlbEhlaWdodChQaXhlbEhlaWdodCk7Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotICAgICAgICBpbnRlcm5hbCB2aXJ0dWFsIHZvaWQgRGVsZXRlTWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBUb3BOb2RlLlBhcmVudE5vZGUuUmVtb3ZlQ2hpbGQoVG9wTm9kZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIERpc3Bvc2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfdG9wTm9kZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9FeGNlbERyYXdpbmdCb3JkZXIuY3MgYi9FUFBsdXMvRHJhd2luZy9FeGNlbERyYXdpbmdCb3JkZXIuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZDgwNGIuLjAwMDAwMDAKLS0tIGEvRVBQbHVzL0RyYXdpbmcvRXhjZWxEcmF3aW5nQm9yZGVyLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQotICoKLSAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCi0gKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCi0gKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKLSAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKLSAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCi0gKgotICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKLSAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEyLTIyCi0gKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlhtbDsKLXVzaW5nIFN5c3RlbS5EcmF3aW5nOwotCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUeXBlIG9mIExpbmUgY2FwCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZW51bSBlTGluZUNhcAotICAgIHsKLSAgICAgICAgRmxhdCwgICAvL2ZsYXQKLSAgICAgICAgUm91bmQsICAvL3JuZAotICAgICAgICBTcXVhcmUgIC8vU3EKLSAgICB9Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBMaW5lIHN0eWxlLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGVudW0gZUxpbmVTdHlsZQotICAgIHsKLSAgICAgICAgRGFzaCwKLSAgICAgICAgRGFzaERvdCwKLSAgICAgICAgRG90LAotICAgICAgICBMb25nRGFzaCwKLSAgICAgICAgTG9uZ0Rhc2hEb3QsCi0gICAgICAgIExvbmdEYXNoRG90RG90LAotICAgICAgICBTb2xpZCwKLSAgICAgICAgU3lzdGVtRGFzaCwKLSAgICAgICAgU3lzdGVtRGFzaERvdCwKLSAgICAgICAgU3lzdGVtRGFzaERvdERvdCwKLSAgICAgICAgU3lzdGVtRG90Ci0gICAgfQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQm9yZGVyIGZvciBkcmF3aW5ncwotICAgIC8vLyA8L3N1bW1hcnk+ICAgIAotICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxEcmF3aW5nQm9yZGVyIDogWG1sSGVscGVyCi0gICAgewotICAgICAgICBzdHJpbmcgX2xpbmVQYXRoOwotICAgICAgICBpbnRlcm5hbCBFeGNlbERyYXdpbmdCb3JkZXIoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyLCBYbWxOb2RlIHRvcE5vZGUsIHN0cmluZyBsaW5lUGF0aCkgOiAKLSAgICAgICAgICAgIGJhc2UobmFtZVNwYWNlTWFuYWdlciwgdG9wTm9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hTm9kZU9yZGVyID0gbmV3IHN0cmluZ1tdIHsgImNoYXJ0IiwidGlja0xibFBvcyIsICJzcFByIiwgInR4UHIiLCJjcm9zc0F4IiwgInByaW50U2V0dGluZ3MiLCAic2hvd1ZhbCIsICJzaG93Q2F0TmFtZSIsICJzaG93U2VyTmFtZSIsICJzaG93UGVyY2VudCIsICJzZXBhcmF0b3IiLCAic2hvd0xlYWRlckxpbmVzIiwgIm5vRmlsbCIsICJzb2xpZEZpbGwiLCAiYmxpcEZpbGwiLCAiZ3JhZEZpbGwiLCAibm9GaWxsIiwgInBhdHRGaWxsIiwgInByc3REYXNoIiB9OwotICAgICAgICAgICAgX2xpbmVQYXRoID0gbGluZVBhdGg7ICAgCi0gICAgICAgICAgICBfbGluZVN0eWxlUGF0aCA9IHN0cmluZy5Gb3JtYXQoX2xpbmVTdHlsZVBhdGgsIGxpbmVQYXRoKTsKLSAgICAgICAgICAgIF9saW5lQ2FwUGF0aCA9IHN0cmluZy5Gb3JtYXQoX2xpbmVDYXBQYXRoLCBsaW5lUGF0aCk7Ci0gICAgICAgICAgICBfbGluZVdpZHRoID0gc3RyaW5nLkZvcm1hdChfbGluZVdpZHRoLCBsaW5lUGF0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgI3JlZ2lvbiAiUHVibGljIHByb3BlcnRpZXMiCi0gICAgICAgIEV4Y2VsRHJhd2luZ0ZpbGwgX2ZpbGwgPSBudWxsOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBGaWxsCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbERyYXdpbmdGaWxsIEZpbGwKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9maWxsID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfZmlsbCA9IG5ldyBFeGNlbERyYXdpbmdGaWxsKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIF9saW5lUGF0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfZmlsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzdHJpbmcgX2xpbmVTdHlsZVBhdGggPSAiezB9L2E6cHJzdERhc2gvQHZhbCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIExpbmVzdHlsZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZUxpbmVTdHlsZSBMaW5lU3R5bGUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRyYW5zbGF0ZUxpbmVTdHlsZShHZXRYbWxOb2RlU3RyaW5nKF9saW5lU3R5bGVQYXRoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKF9saW5lUGF0aCwgZmFsc2UpOwotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2xpbmVTdHlsZVBhdGgsIFRyYW5zbGF0ZUxpbmVTdHlsZVRleHQodmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzdHJpbmcgX2xpbmVDYXBQYXRoID0gInswfS9AY2FwIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTGluZWNhcAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZUxpbmVDYXAgTGluZUNhcAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVHJhbnNsYXRlTGluZUNhcChHZXRYbWxOb2RlU3RyaW5nKF9saW5lQ2FwUGF0aCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ3JlYXRlTm9kZShfbGluZVBhdGgsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9saW5lQ2FwUGF0aCwgVHJhbnNsYXRlTGluZUNhcFRleHQodmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzdHJpbmcgX2xpbmVXaWR0aCA9ICJ7MH0vQHciOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBXaWR0aCBpbiBwaXhlbHMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBXaWR0aAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludChfbGluZVdpZHRoKSAvIDEyNzAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfbGluZVdpZHRoLCAodmFsdWUgKiAxMjcwMCkuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotICAgICAgICAjcmVnaW9uICJUcmFuc2xhdGUgRW51bSBmdW5jdGlvbnMiCi0gICAgICAgIHByaXZhdGUgc3RyaW5nIFRyYW5zbGF0ZUxpbmVTdHlsZVRleHQoZUxpbmVTdHlsZSB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nIHRleHQ9dmFsdWUuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBlTGluZVN0eWxlLkRhc2g6Ci0gICAgICAgICAgICAgICAgY2FzZSBlTGluZVN0eWxlLkRvdDoKLSAgICAgICAgICAgICAgICBjYXNlIGVMaW5lU3R5bGUuRGFzaERvdDoKLSAgICAgICAgICAgICAgICBjYXNlIGVMaW5lU3R5bGUuU29saWQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0LlN1YnN0cmluZygwLDEpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkgKyB0ZXh0LlN1YnN0cmluZygxLHRleHQuTGVuZ3RoLTEpOyAvL0ZpcnN0IHRvIExvd2VyIGNhc2UuCi0gICAgICAgICAgICAgICAgY2FzZSBlTGluZVN0eWxlLkxvbmdEYXNoOgotICAgICAgICAgICAgICAgIGNhc2UgZUxpbmVTdHlsZS5Mb25nRGFzaERvdDoKLSAgICAgICAgICAgICAgICBjYXNlIGVMaW5lU3R5bGUuTG9uZ0Rhc2hEb3REb3Q6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAibGciICsgdGV4dC5TdWJzdHJpbmcoNCwgdGV4dC5MZW5ndGggLSA0KTsKLSAgICAgICAgICAgICAgICBjYXNlIGVMaW5lU3R5bGUuU3lzdGVtRGFzaDoKLSAgICAgICAgICAgICAgICBjYXNlIGVMaW5lU3R5bGUuU3lzdGVtRGFzaERvdDoKLSAgICAgICAgICAgICAgICBjYXNlIGVMaW5lU3R5bGUuU3lzdGVtRGFzaERvdERvdDoKLSAgICAgICAgICAgICAgICBjYXNlIGVMaW5lU3R5bGUuU3lzdGVtRG90OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN5cyIgKyB0ZXh0LlN1YnN0cmluZyg2LCB0ZXh0Lkxlbmd0aCAtIDYpOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHRocm93KG5ldyBFeGNlcHRpb24oIkludmFsaWQgTGluZXN0eWxlIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgZUxpbmVTdHlsZSBUcmFuc2xhdGVMaW5lU3R5bGUoc3RyaW5nIHRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAodGV4dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlICJkYXNoIjoKLSAgICAgICAgICAgICAgICBjYXNlICJkb3QiOgotICAgICAgICAgICAgICAgIGNhc2UgImRhc2hEb3QiOgotICAgICAgICAgICAgICAgIGNhc2UgInNvbGlkIjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlTGluZVN0eWxlKUVudW0uUGFyc2UodHlwZW9mKGVMaW5lU3R5bGUpLCB0ZXh0LCB0cnVlKTsKLSAgICAgICAgICAgICAgICBjYXNlICJsZ0Rhc2giOgotICAgICAgICAgICAgICAgIGNhc2UgImxnRGFzaERvdCI6Ci0gICAgICAgICAgICAgICAgY2FzZSAibGdEYXNoRG90RG90IjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlTGluZVN0eWxlKUVudW0uUGFyc2UodHlwZW9mKGVMaW5lU3R5bGUpLCAiTG9uZyIgKyB0ZXh0LlN1YnN0cmluZygyLCB0ZXh0Lkxlbmd0aCAtIDIpKTsKLSAgICAgICAgICAgICAgICBjYXNlICJzeXNEYXNoIjoKLSAgICAgICAgICAgICAgICBjYXNlICJzeXNEYXNoRG90IjoKLSAgICAgICAgICAgICAgICBjYXNlICJzeXNEYXNoRG90RG90IjoKLSAgICAgICAgICAgICAgICBjYXNlICJzeXNEb3QiOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVMaW5lU3R5bGUpRW51bS5QYXJzZSh0eXBlb2YoZUxpbmVTdHlsZSksICJTeXN0ZW0iICsgdGV4dC5TdWJzdHJpbmcoMywgdGV4dC5MZW5ndGggLSAzKSk7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oIkludmFsaWQgTGluZXN0eWxlIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgc3RyaW5nIFRyYW5zbGF0ZUxpbmVDYXBUZXh0KGVMaW5lQ2FwIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgZUxpbmVDYXAuUm91bmQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAicm5kIjsKLSAgICAgICAgICAgICAgICBjYXNlIGVMaW5lQ2FwLlNxdWFyZToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzcSI7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJmbGF0IjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIGVMaW5lQ2FwIFRyYW5zbGF0ZUxpbmVDYXAoc3RyaW5nIHRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAodGV4dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlICJybmQiOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUxpbmVDYXAuUm91bmQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAic3EiOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUxpbmVDYXAuU3F1YXJlOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlTGluZUNhcC5GbGF0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLQotICAgICAgICAKLSAgICAgICAgLy9wdWJsaWMgRXhjZWxEcmF3aW5nRm9udCBGb250Ci0gICAgICAgIC8vewotICAgICAgICAvLyAgICBnZXQKLSAgICAgICAgLy8gICAgeyAKLSAgICAgICAgICAgIAotICAgICAgICAvLyAgICB9Ci0gICAgICAgIC8vfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL0V4Y2VsRHJhd2luZ0ZpbGwuY3MgYi9FUFBsdXMvRHJhd2luZy9FeGNlbERyYXdpbmdGaWxsLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2NiYjIwLi4wMDAwMDAwCi0tLSBhL0VQUGx1cy9EcmF3aW5nL0V4Y2VsRHJhd2luZ0ZpbGwuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCi0gKgotICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KLSAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKLSAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAotICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAotICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KLSAqCi0gKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAotICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTItMjIKLSAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlhtbDsKLXVzaW5nIFN5c3RlbS5EcmF3aW5nOwotCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBGaWxsIHByb3BlcnRpZXMgZm9yIGRyYXdpbmcgb2JqZWN0cwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHNlYWxlZCBjbGFzcyBFeGNlbERyYXdpbmdGaWxsIDogWG1sSGVscGVyCi0gICAgewotICAgICAgICAvL0V4Y2VsU2hhcGUgX3NocDsgICAgICAgICAgICAgICAgCi0gICAgICAgIHN0cmluZyBfZmlsbFBhdGg7Ci0gICAgICAgIFhtbE5vZGUgX2ZpbGxOb2RlOwotICAgICAgICBpbnRlcm5hbCBFeGNlbERyYXdpbmdGaWxsKFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZVNwYWNlTWFuYWdlciwgWG1sTm9kZSB0b3BOb2RlLCBzdHJpbmcgZmlsbFBhdGgpIDogCi0gICAgICAgICAgICBiYXNlKG5hbWVTcGFjZU1hbmFnZXIsIHRvcE5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyAgX3NocD1zaHA7Ci0gICAgICAgICAgICBfZmlsbFBhdGggPSBmaWxsUGF0aDsKLSAgICAgICAgICAgIF9maWxsTm9kZSA9IHRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfZmlsbFBhdGgsIE5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgU2NoZW1hTm9kZU9yZGVyID0gbmV3IHN0cmluZ1tdIHsgInRpY2tMYmxQb3MiLCAic3BQciIsICJ0eFByIiwiZExibFBvcyIsICJjcm9zc0F4IiwgInByaW50U2V0dGluZ3MiLCAic2hvd1ZhbCIsICJwcnN0R2VvbSIsICJub0ZpbGwiLCAic29saWRGaWxsIiwgImJsaXBGaWxsIiwgImdyYWRGaWxsIiwgIm5vRmlsbCIsICJwYXR0RmlsbCIsICJsbiIsICJwcnN0RGFzaCIgfTsKLSAgICAgICAgICAgIC8vU2V0ZmlsbCBub2RlCi0gICAgICAgICAgICBpZiAoX2ZpbGxOb2RlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2ZpbGxUeXBlTm9kZSA9IHRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgic29saWRGaWxsIik7Ci0gICAgICAgICAgICAgICAgaWYgKF9maWxsVHlwZU5vZGUgPT0gbnVsbCkgX2ZpbGxUeXBlTm9kZSA9IHRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgibm9GaWxsIik7Ci0gICAgICAgICAgICAgICAgaWYgKF9maWxsVHlwZU5vZGUgPT0gbnVsbCkgX2ZpbGxUeXBlTm9kZSA9IHRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiYmxpcEZpbGwiKTsKLSAgICAgICAgICAgICAgICBpZiAoX2ZpbGxUeXBlTm9kZSA9PSBudWxsKSBfZmlsbFR5cGVOb2RlID0gdG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJncmFkRmlsbCIpOwotICAgICAgICAgICAgICAgIGlmIChfZmlsbFR5cGVOb2RlID09IG51bGwpIF9maWxsVHlwZU5vZGUgPSB0b3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoInBhdHRGaWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZUZpbGxTdHlsZSBfc3R5bGU7Ci0gICAgICAgIFhtbE5vZGUgX2ZpbGxUeXBlTm9kZSA9IG51bGw7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZpbGwgc3R5bGUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGVGaWxsU3R5bGUgU3R5bGUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9maWxsVHlwZU5vZGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlRmlsbFN0eWxlLlNvbGlkRmlsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX3N0eWxlPUdldFN0eWxlRW51bShfZmlsbFR5cGVOb2RlLk5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IGVGaWxsU3R5bGUuTm9GaWxsIHx8IHZhbHVlID09IGVGaWxsU3R5bGUuU29saWRGaWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX3N0eWxlID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIENyZWF0ZUZpbGxUb3BOb2RlKHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJGaWxsc3R5bGUgbm90IGltcGxlbWVudGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIENyZWF0ZUZpbGxUb3BOb2RlKGVGaWxsU3R5bGUgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfZmlsbFR5cGVOb2RlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVG9wTm9kZS5SZW1vdmVDaGlsZChfZmlsbFR5cGVOb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENyZWF0ZU5vZGUoX2ZpbGxQYXRoICsgIi9hOiIgKyBHZXRTdHlsZVRleHQodmFsdWUpLCBmYWxzZSk7Ci0gICAgICAgICAgICBfZmlsbE5vZGU9VG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKF9maWxsUGF0aCArICIvYToiICsgR2V0U3R5bGVUZXh0KHZhbHVlKSwgTmFtZVNwYWNlTWFuYWdlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGVGaWxsU3R5bGUgR2V0U3R5bGVFbnVtKHN0cmluZyBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2gobmFtZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlICJub0ZpbGwiOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUZpbGxTdHlsZS5Ob0ZpbGw7Ci0gICAgICAgICAgICAgICAgY2FzZSAiYmxpcEZpbGwiOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZUZpbGxTdHlsZS5CbGlwRmlsbDsKLSAgICAgICAgICAgICAgICBjYXNlICJncmFkRmlsbCI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlRmlsbFN0eWxlLkdyYWRpZW50RmlsbDsKLSAgICAgICAgICAgICAgICBjYXNlICJncnBGaWxsIjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVGaWxsU3R5bGUuR3JvdXBGaWxsOwotICAgICAgICAgICAgICAgIGNhc2UgInBhdHRGaWxsIjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVGaWxsU3R5bGUuUGF0dGVybkZpbGw7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVGaWxsU3R5bGUuU29saWRGaWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdHJpbmcgR2V0U3R5bGVUZXh0KGVGaWxsU3R5bGUgc3R5bGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoc3R5bGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBlRmlsbFN0eWxlLkJsaXBGaWxsOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gImJsaXBGaWxsIjsKLSAgICAgICAgICAgICAgICBjYXNlIGVGaWxsU3R5bGUuR3JhZGllbnRGaWxsOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gImdyYWRGaWxsIjsKLSAgICAgICAgICAgICAgICBjYXNlIGVGaWxsU3R5bGUuR3JvdXBGaWxsOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gImdycEZpbGwiOwotICAgICAgICAgICAgICAgIGNhc2UgZUZpbGxTdHlsZS5Ob0ZpbGw6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAibm9GaWxsIjsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgY2FzZSBlRmlsbFN0eWxlLlBhdHRlcm5GaWxsOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gInBhdHRGaWxsIjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gInNvbGlkRmlsbCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBzdHJpbmcgQ29sb3JQYXRoID0gIi9hOnNvbGlkRmlsbC9hOnNyZ2JDbHIvQHZhbCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZpbGwgY29sb3IgZm9yIHNvbGlkIGZpbGxzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBDb2xvciBDb2xvcgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcgY29sID0gR2V0WG1sTm9kZVN0cmluZyhfZmlsbFBhdGggKyBDb2xvclBhdGgpOwotICAgICAgICAgICAgICAgIGlmIChjb2wgPT0gIiIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29sb3IuRnJvbUFyZ2IoNzksIDEyOSwgMTg5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbG9yLkZyb21BcmdiKGludC5QYXJzZShjb2wsU3lzdGVtLkdsb2JhbGl6YXRpb24uTnVtYmVyU3R5bGVzLkFsbG93SGV4U3BlY2lmaWVyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9maWxsVHlwZU5vZGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9zdHlsZSA9IGVGaWxsU3R5bGUuU29saWRGaWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChfc3R5bGUgIT0gZUZpbGxTdHlsZS5Tb2xpZEZpbGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJGaWxsU3R5bGUgbXVzdCBiZSBzZXQgdG8gU29saWRGaWxsIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENyZWF0ZU5vZGUoX2ZpbGxQYXRoLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfZmlsbFBhdGggKyBDb2xvclBhdGgsIHZhbHVlLlRvQXJnYigpLlRvU3RyaW5nKCJYIikuU3Vic3RyaW5nKDIsIDYpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgYWxwaGFQYXRoID0gIi9hOnNvbGlkRmlsbC9hOnNyZ2JDbHIvYTphbHBoYS9AdmFsIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVHJhbnNwYXJhbmN5IGluIHBlcmNlbnQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBUcmFuc3BhcmFuY3kKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDEwMCAtIChHZXRYbWxOb2RlSW50KF9maWxsUGF0aCArIGFscGhhUGF0aCkgLyAxMDAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfZmlsbFR5cGVOb2RlID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfc3R5bGUgPSBlRmlsbFN0eWxlLlNvbGlkRmlsbDsKLSAgICAgICAgICAgICAgICAgICAgQ29sb3IgPSBDb2xvci5Gcm9tQXJnYig3OSwgMTI5LCAxODkpOyAgIC8vU2V0IGEgRGVmYXVsdCBjb2xvcgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChfc3R5bGUgIT0gZUZpbGxTdHlsZS5Tb2xpZEZpbGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJGaWxsU3R5bGUgbXVzdCBiZSBzZXQgdG8gU29saWRGaWxsIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vQ3JlYXRlTm9kZShfZmlsbFBhdGgsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9maWxsUGF0aCArIGFscGhhUGF0aCwgKCgxMDAgLSB2YWx1ZSkgKiAxMDAwKS5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL0V4Y2VsRHJhd2luZ0xpbmVFbmQuY3MgYi9FUFBsdXMvRHJhd2luZy9FeGNlbERyYXdpbmdMaW5lRW5kLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTE3MzE5Li4wMDAwMDAwCi0tLSBhL0VQUGx1cy9EcmF3aW5nL0V4Y2VsRHJhd2luZ0xpbmVFbmQuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlhtbDsKLQotCi0vLy8gPHN1bW1hcnk+Ci0vLy8gTGluZSBlbmQgc3R5bGUuCi0vLy8gPC9zdW1tYXJ5PgotcHVibGljIGVudW0gZUVuZFN0eWxlICAgLy9TVF9MaW5lRW5kVHlwZQotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gTm8gZW5kCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBOb25lLAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVHJpYW5nbGUgYXJyb3cgaGVhZAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgVHJpYW5nbGUsCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBTdGVhbHRoIGFycm93IGhlYWQKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIFN0ZWFsdGgsCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBEaWFtb25kCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBEaWFtb25kLAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gT3ZhbAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgT3ZhbCwKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIExpbmUgYXJyb3cgaGVhZAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgQXJyb3cKLX0KLQotLy8vIDxzdW1tYXJ5PgotLy8vIExlbmQgZW5kIHNpemUuCi0vLy8gPC9zdW1tYXJ5PgotcHVibGljIGVudW0gZUVuZFNpemUKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFNtYWwKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIFNtYWxsLAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gTWVkaXVtCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBNZWRpdW0sCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBMYXJnZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgTGFyZ2UKLX0KLQotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZwotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gUHJvcGVydGllcyBmb3IgZHJhd2luZyBsaW5lIGVuZHMKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxEcmF3aW5nTGluZUVuZDpYbWxIZWxwZXIKLSAgICB7Ci0gICAgICAgICBzdHJpbmcgX2xpbmVQYXRoOwotICAgICAgICBpbnRlcm5hbCBFeGNlbERyYXdpbmdMaW5lRW5kKFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZVNwYWNlTWFuYWdlciwgWG1sTm9kZSB0b3BOb2RlLCBzdHJpbmcgbGluZVBhdGgpIDogCi0gICAgICAgICAgICBiYXNlKG5hbWVTcGFjZU1hbmFnZXIsIHRvcE5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYU5vZGVPcmRlciA9IG5ldyBzdHJpbmdbXSB7ICJoZWFkRW5kIiwgInRhaWxFbmQiIH07Ci0gICAgICAgICAgICBfbGluZVBhdGggPSBsaW5lUGF0aDsgICAKLSAgICAgICAgfQotICAgICAgICBzdHJpbmcgX2hlYWRFbmRTdHlsZVBhdGggPSAieGRyOnNwL3hkcjpzcFByL2E6bG4vYTpoZWFkRW5kL0B0eXBlIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSGVhZGVyRW5kCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBlRW5kU3R5bGUgSGVhZEVuZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVHJhbnNsYXRlRW5kU3R5bGUoR2V0WG1sTm9kZVN0cmluZyhfaGVhZEVuZFN0eWxlUGF0aCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ3JlYXRlTm9kZShfbGluZVBhdGgsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9oZWFkRW5kU3R5bGVQYXRoLCBUcmFuc2xhdGVFbmRTdHlsZVRleHQodmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzdHJpbmcgX3RhaWxFbmRTdHlsZVBhdGggPSAieGRyOnNwL3hkcjpzcFByL2E6bG4vYTp0YWlsRW5kL0B0eXBlIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSGVhZGVyRW5kCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBlRW5kU3R5bGUgVGFpbEVuZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVHJhbnNsYXRlRW5kU3R5bGUoR2V0WG1sTm9kZVN0cmluZyhfdGFpbEVuZFN0eWxlUGF0aCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ3JlYXRlTm9kZShfbGluZVBhdGgsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF90YWlsRW5kU3R5bGVQYXRoLCBUcmFuc2xhdGVFbmRTdHlsZVRleHQodmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHN0cmluZyBfdGFpbEVuZFNpemVXaWR0aFBhdGggPSAieGRyOnNwL3hkcjpzcFByL2E6bG4vYTp0YWlsRW5kL0B3IjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGFpbEVuZFNpemVXaWR0aAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZUVuZFNpemUgVGFpbEVuZFNpemVXaWR0aAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVHJhbnNsYXRlRW5kU2l6ZShHZXRYbWxOb2RlU3RyaW5nKF90YWlsRW5kU2l6ZVdpZHRoUGF0aCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ3JlYXRlTm9kZShfbGluZVBhdGgsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF90YWlsRW5kU2l6ZVdpZHRoUGF0aCwgVHJhbnNsYXRlRW5kU2l6ZVRleHQodmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHN0cmluZyBfdGFpbEVuZFNpemVIZWlnaHRQYXRoID0gInhkcjpzcC94ZHI6c3BQci9hOmxuL2E6dGFpbEVuZC9AbGVuIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGFpbEVuZFNpemVIZWlnaHQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGVFbmRTaXplIFRhaWxFbmRTaXplSGVpZ2h0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBUcmFuc2xhdGVFbmRTaXplKEdldFhtbE5vZGVTdHJpbmcoX3RhaWxFbmRTaXplSGVpZ2h0UGF0aCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ3JlYXRlTm9kZShfbGluZVBhdGgsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF90YWlsRW5kU2l6ZUhlaWdodFBhdGgsIFRyYW5zbGF0ZUVuZFNpemVUZXh0KHZhbHVlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzdHJpbmcgX2hlYWRFbmRTaXplV2lkdGhQYXRoID0gInhkcjpzcC94ZHI6c3BQci9hOmxuL2E6aGVhZEVuZC9AdyI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRhaWxFbmRTaXplV2lkdGgKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGVFbmRTaXplIEhlYWRFbmRTaXplV2lkdGgKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRyYW5zbGF0ZUVuZFNpemUoR2V0WG1sTm9kZVN0cmluZyhfaGVhZEVuZFNpemVXaWR0aFBhdGgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENyZWF0ZU5vZGUoX2xpbmVQYXRoLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfaGVhZEVuZFNpemVXaWR0aFBhdGgsIFRyYW5zbGF0ZUVuZFNpemVUZXh0KHZhbHVlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzdHJpbmcgX2hlYWRFbmRTaXplSGVpZ2h0UGF0aCA9ICJ4ZHI6c3AveGRyOnNwUHIvYTpsbi9hOmhlYWRFbmQvQGxlbiI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRhaWxFbmRTaXplSGVpZ2h0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBlRW5kU2l6ZSBIZWFkRW5kU2l6ZUhlaWdodAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVHJhbnNsYXRlRW5kU2l6ZShHZXRYbWxOb2RlU3RyaW5nKF9oZWFkRW5kU2l6ZUhlaWdodFBhdGgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENyZWF0ZU5vZGUoX2xpbmVQYXRoLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfaGVhZEVuZFNpemVIZWlnaHRQYXRoLCBUcmFuc2xhdGVFbmRTaXplVGV4dCh2YWx1ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgI3JlZ2lvbiAiVHJhbnNsYXRlIEVudW0gZnVuY3Rpb25zIgotICAgICAgICBwcml2YXRlIHN0cmluZyBUcmFuc2xhdGVFbmRTdHlsZVRleHQoZUVuZFN0eWxlIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWUuVG9TdHJpbmcoKS5Ub0xvd2VyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBlRW5kU3R5bGUgVHJhbnNsYXRlRW5kU3R5bGUoc3RyaW5nIHRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAodGV4dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlICJub25lIjoKLSAgICAgICAgICAgICAgICBjYXNlICJhcnJvdyI6Ci0gICAgICAgICAgICAgICAgY2FzZSAiZGlhbW9uZCI6Ci0gICAgICAgICAgICAgICAgY2FzZSAib3ZhbCI6Ci0gICAgICAgICAgICAgICAgY2FzZSAic3RlYWx0aCI6Ci0gICAgICAgICAgICAgICAgY2FzZSAidHJpYW5nbGUiOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVFbmRTdHlsZSlFbnVtLlBhcnNlKHR5cGVvZihlRW5kU3R5bGUpLCB0ZXh0LCB0cnVlKTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VwdGlvbigiSW52YWxpZCBFbmRzdHlsZSIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RyaW5nIFRyYW5zbGF0ZUVuZFNpemVUZXh0KGVFbmRTaXplIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcgdGV4dCA9IHZhbHVlLlRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgZUVuZFNpemUuU21hbGw6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAic20iOwotICAgICAgICAgICAgICAgIGNhc2UgZUVuZFNpemUuTWVkaXVtOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm1lZCI7Ci0gICAgICAgICAgICAgICAgY2FzZSBlRW5kU2l6ZS5MYXJnZToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJsZyI7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oIkludmFsaWQgRW5kc2l6ZSIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIGVFbmRTaXplIFRyYW5zbGF0ZUVuZFNpemUoc3RyaW5nIHRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAodGV4dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlICJzbSI6Ci0gICAgICAgICAgICAgICAgY2FzZSAibWVkIjoKLSAgICAgICAgICAgICAgICBjYXNlICJsZyI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoZUVuZFNpemUpRW51bS5QYXJzZSh0eXBlb2YoZUVuZFNpemUpLCB0ZXh0LCB0cnVlKTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VwdGlvbigiSW52YWxpZCBFbmRzaXplIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvRXhjZWxEcmF3aW5ncy5jcyBiL0VQUGx1cy9EcmF3aW5nL0V4Y2VsRHJhd2luZ3MuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YTE0ODMuLjAwMDAwMDAKLS0tIGEvRVBQbHVzL0RyYXdpbmcvRXhjZWxEcmF3aW5ncy5jcworKysgL2Rldi9udWxsCkBAIC0xLDYyMiArMCwwIEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKLSAqCi0gKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgotICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAotICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCi0gKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCi0gKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgotICoKLSAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCi0gKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMi0yMgotICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uWG1sOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBJcm9uU29mdHdhcmUuRHJhd2luZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRHJhd2luZy5DaGFydDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuVGFibGUuUGl2b3RUYWJsZTsKLXVzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7Ci1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBDb2xsZWN0aW9uIGZvciBEcmF3aW5nIG9iamVjdHMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxEcmF3aW5ncyA6IElFbnVtZXJhYmxlPEV4Y2VsRHJhd2luZz4sIElEaXNwb3NhYmxlCi0gICAgewotICAgICAgICBwcml2YXRlIFhtbERvY3VtZW50IF9kcmF3aW5nc1htbD1uZXcgWG1sRG9jdW1lbnQoKTsKLSAgICAgICAgcHJpdmF0ZSBEaWN0aW9uYXJ5PHN0cmluZywgaW50PiBfZHJhd2luZ05hbWVzOwotICAgICAgICBwcml2YXRlIExpc3Q8RXhjZWxEcmF3aW5nPiBfZHJhd2luZ3M7Ci0gICAgICAgIGludGVybmFsIGNsYXNzIEltYWdlQ29tcGFyZQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnRlcm5hbCBieXRlW10gaW1hZ2UgeyBnZXQ7IHNldDsgfQotICAgICAgICAgICAgaW50ZXJuYWwgc3RyaW5nIHJlbElEIHsgZ2V0OyBzZXQ7IH0KLQotICAgICAgICAgICAgaW50ZXJuYWwgYm9vbCBDb21wYXJlcihieXRlW10gY29tcGFyZUltZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoY29tcGFyZUltZy5MZW5ndGggIT0gaW1hZ2UuTGVuZ3RoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2UuTGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoaW1hZ2VbaV0gIT0gY29tcGFyZUltZ1tpXSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvL0VxdWFsCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy9pbnRlcm5hbCBMaXN0PEltYWdlQ29tcGFyZT4gX3BpY3MgPSBuZXcgTGlzdDxJbWFnZUNvbXBhcmU+KCk7Ci0gICAgICAgIGludGVybmFsIERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IF9oYXNoZXMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4oKTsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxQYWNrYWdlIF9wYWNrYWdlOwotICAgICAgICBpbnRlcm5hbCBQYWNrYWdpbmcuWmlwUGFja2FnZVJlbGF0aW9uc2hpcCBfZHJhd2luZ1JlbGF0aW9uID0gbnVsbDsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxEcmF3aW5ncyhFeGNlbFBhY2thZ2UgeGxQYWNrYWdlLCBFeGNlbFdvcmtzaGVldCBzaGVldCkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIF9kcmF3aW5nc1htbCA9IG5ldyBYbWxEb2N1bWVudCgpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBfZHJhd2luZ3NYbWwuUHJlc2VydmVXaGl0ZXNwYWNlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgX2RyYXdpbmdzID0gbmV3IExpc3Q8RXhjZWxEcmF3aW5nPigpOwotICAgICAgICAgICAgICAgIF9kcmF3aW5nTmFtZXMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsaW50PihTdHJpbmdDb21wYXJlci5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSk7Ci0gICAgICAgICAgICAgICAgX3BhY2thZ2UgPSB4bFBhY2thZ2U7Ci0gICAgICAgICAgICAgICAgV29ya3NoZWV0ID0gc2hlZXQ7Ci0gICAgICAgICAgICAgICAgWG1sTm9kZSBub2RlID0gc2hlZXQuV29ya3NoZWV0WG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpkcmF3aW5nIiwgc2hlZXQuTmFtZVNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgQ3JlYXRlTlNNKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9kcmF3aW5nUmVsYXRpb24gPSBzaGVldC5QYXJ0LkdldFJlbGF0aW9uc2hpcChub2RlLkF0dHJpYnV0ZXNbInI6aWQiXS5WYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIF91cmlEcmF3aW5nID0gVXJpSGVscGVyLlJlc29sdmVQYXJ0VXJpKHNoZWV0LldvcmtzaGVldFVyaSwgX2RyYXdpbmdSZWxhdGlvbi5UYXJnZXRVcmkpOwotCi0gICAgICAgICAgICAgICAgICAgIF9wYXJ0ID0geGxQYWNrYWdlLlBhY2thZ2UuR2V0UGFydChfdXJpRHJhd2luZyk7Ci0gICAgICAgICAgICAgICAgICAgIFhtbEhlbHBlci5Mb2FkWG1sU2FmZShfZHJhd2luZ3NYbWwsIF9wYXJ0LkdldFN0cmVhbSgpKTsgCi0KLSAgICAgICAgICAgICAgICAgICAgQWRkRHJhd2luZ3MoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIEV4Y2VsV29ya3NoZWV0IFdvcmtzaGVldCB7IGdldDsgc2V0OyB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEEgcmVmZXJlbmNlIHRvIHRoZSBkcmF3aW5nIHhtbCBkb2N1bWVudAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgWG1sRG9jdW1lbnQgRHJhd2luZ1htbAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2RyYXdpbmdzWG1sOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgdm9pZCBBZGREcmF3aW5ncygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIExvb2sgaW5zaWRlIGFsbCBjaGlsZHJlbiBmb3IgdGhlIGRyYXdpbmdzIGJlY2F1c2UgdGhleSBjb3VsZCBiZSBpbnNpZGUKLSAgICAgICAgICAgIC8vIE1hcmt1cCBDb21wYXRpYmlsaXR5IEFsdGVybmF0aXZlQ29udGVudC9DaG9pY2Ugb3IgQWx0ZXJuYXRpdmVDb250ZW50L0ZhbGxiYWNrIG5vZGVzLgotICAgICAgICAgICAgLy8gVGhlIGNvZGUgYmVsb3cgY3VycmVudGx5IHByZXRlbmRzIHRoYXQgbG9hZGluZyBhbGwgQ2hvaWNlIGFsdGVybmF0aXZlIGRyYXdpbmdzIGRvZXNuJ3QgY2F1c2UgYSBwcm9ibGVtCi0gICAgICAgICAgICAvLyBlbHNld2hlcmUuIFRoaXMgc2VlbXMgdG8gYmUgb2sgZm9yIHRoZSB0aW1lIGJlaW5nIGFzIGVuY291bnRlcmVkIGRyYXdpbmcgZmlsZXMgc28gZmFyIG9ubHkgc2VlbSB0byBoYXZlCi0gICAgICAgICAgICAvLyBvbmUgQ2hvaWNlIG5vZGUgKGFuZCBubyBGYWxsYmFjaykgdW5kZXJuZWF0aCB0aGUgQWx0ZXJuYXRpdmVDb250ZW50IG5vZGUuIChFeGNlbCAyMDEzIHRoYXQgaXMuKQotICAgICAgICAgICAgLy8gVGhpcyBjaGFuZ2UgcHJldmVudHMgQ29kZVBsZXggaXNzdWUgIzE1MDI4IGZyb20gb2NjdXJyaW5nLiAKLSAgICAgICAgICAgIC8vICh0aGUgZHJhd2luZyB4bWwgcGFydCAodGhhdCBPTkxZIGNvbnRhaW5lZCBBbHRlcm5hdGl2ZUNvbnRlbnQgbm9kZXMpIHdhcyBpbmNvcnJlY3RseSBiZWluZyBnYXJiYWdlIGNvbGxlY3RlZCB3aGVuIHRoZSBwYWNrYWdlIHdhcyBzYXZlZCkKLSAgICAgICAgICAgIFhtbE5vZGVMaXN0IGxpc3QgPSBfZHJhd2luZ3NYbWwuU2VsZWN0Tm9kZXMoIi8vKltzZWxmOjp4ZHI6dHdvQ2VsbEFuY2hvciBvciBzZWxmOjp4ZHI6b25lQ2VsbEFuY2hvciBvciBzZWxmOjp4ZHI6YWJzb2x1dGVBbmNob3JdIiwgTmFtZVNwYWNlTWFuYWdlcik7Ci0KLSAgICAgICAgICAgIGZvcmVhY2ggKFhtbE5vZGUgbm9kZSBpbiBsaXN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEV4Y2VsRHJhd2luZyBkcjsKLSAgICAgICAgICAgICAgICBzd2l0Y2gobm9kZS5Mb2NhbE5hbWUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlICJvbmVDZWxsQW5jaG9yIjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGRyID0gbmV3IEV4Y2VsRHJhd2luZyh0aGlzLCBub2RlLCAieGRyOnNwL3hkcjpudlNwUHIveGRyOmNOdlByL0BuYW1lIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAidHdvQ2VsbEFuY2hvciI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBkciA9IEV4Y2VsRHJhd2luZy5HZXREcmF3aW5nKHRoaXMsIG5vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgImFic29sdXRlQW5jaG9yIjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGRyID0gRXhjZWxEcmF3aW5nLkdldERyYXdpbmcodGhpcywgbm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogLy8iYWJzb2x1dGVDZWxsQW5jaG9yIjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGRyID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZHIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9kcmF3aW5ncy5BZGQoZHIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIV9kcmF3aW5nTmFtZXMuQ29udGFpbnNLZXkoZHIuTmFtZSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9kcmF3aW5nTmFtZXMuQWRkKGRyLk5hbWUsIF9kcmF3aW5ncy5Db3VudCAtIDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICAjcmVnaW9uIE5hbWVzcGFjZU1hbmFnZXIKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ3JlYXRlcyB0aGUgTmFtZXNwYWNlTWFuYWdlci4gCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgdm9pZCBDcmVhdGVOU00oKQotICAgICAgICB7Ci0gICAgICAgICAgICBOYW1lVGFibGUgbnQgPSBuZXcgTmFtZVRhYmxlKCk7Ci0gICAgICAgICAgICBfbnNNYW5hZ2VyID0gbmV3IFhtbE5hbWVzcGFjZU1hbmFnZXIobnQpOwotICAgICAgICAgICAgX25zTWFuYWdlci5BZGROYW1lc3BhY2UoImEiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hRHJhd2luZ3MpOwotICAgICAgICAgICAgX25zTWFuYWdlci5BZGROYW1lc3BhY2UoInhkciIsIEV4Y2VsUGFja2FnZS5zY2hlbWFTaGVldERyYXdpbmdzKTsKLSAgICAgICAgICAgIF9uc01hbmFnZXIuQWRkTmFtZXNwYWNlKCJjIiwgRXhjZWxQYWNrYWdlLnNjaGVtYUNoYXJ0KTsKLSAgICAgICAgICAgIF9uc01hbmFnZXIuQWRkTmFtZXNwYWNlKCJyIiwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMpOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFByb3ZpZGVzIGFjY2VzcyB0byBhIG5hbWVzcGFjZSBtYW5hZ2VyIGluc3RhbmNlIHRvIGFsbG93IFhQYXRoIHNlYXJjaGluZwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIF9uc01hbmFnZXI9bnVsbDsKLSAgICAgICAgcHVibGljIFhtbE5hbWVzcGFjZU1hbmFnZXIgTmFtZVNwYWNlTWFuYWdlcgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX25zTWFuYWdlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uCi0gICAgICAgICNyZWdpb24gSUVudW1lcmFibGUgTWVtYmVycwotCi0gICAgICAgIHB1YmxpYyBJRW51bWVyYXRvciBHZXRFbnVtZXJhdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChfZHJhd2luZ3MuR2V0RW51bWVyYXRvcigpKTsKLSAgICAgICAgfQotICAgICAgICAjcmVnaW9uIElFbnVtZXJhYmxlPEV4Y2VsRHJhd2luZz4gTWVtYmVycwotCi0gICAgICAgIElFbnVtZXJhdG9yPEV4Y2VsRHJhd2luZz4gSUVudW1lcmFibGU8RXhjZWxEcmF3aW5nPi5HZXRFbnVtZXJhdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChfZHJhd2luZ3MuR2V0RW51bWVyYXRvcigpKTsKLSAgICAgICAgfQotCi0gICAgICAgICNlbmRyZWdpb24KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXR1cm5zIHRoZSBkcmF3aW5nIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uICAKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJQb3NpdGlvbklEIj5UaGUgcG9zaXRpb24gb2YgdGhlIGRyYXdpbmcuIDAtYmFzZTwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBFeGNlbERyYXdpbmcgdGhpc1tpbnQgUG9zaXRpb25JRF0KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChfZHJhd2luZ3NbUG9zaXRpb25JRF0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB0aGUgZHJhd2luZyBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIG5hbWUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJOYW1lIj5UaGUgbmFtZSBvZiB0aGUgd29ya3NoZWV0PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIEV4Y2VsRHJhd2luZyB0aGlzW3N0cmluZyBOYW1lXQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX2RyYXdpbmdOYW1lcy5Db250YWluc0tleShOYW1lKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfZHJhd2luZ3NbX2RyYXdpbmdOYW1lc1tOYW1lXV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgaW50IENvdW50Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfZHJhd2luZ3MgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2RyYXdpbmdzLkNvdW50OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBQYWNrYWdpbmcuWmlwUGFja2FnZVBhcnQgX3BhcnQ9bnVsbDsKLSAgICAgICAgaW50ZXJuYWwgUGFja2FnaW5nLlppcFBhY2thZ2VQYXJ0IFBhcnQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9wYXJ0OwotICAgICAgICAgICAgfSAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgVXJpIF91cmlEcmF3aW5nPW51bGw7Ci0gICAgICAgIHB1YmxpYyBVcmkgVXJpRHJhd2luZwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3VyaURyYXdpbmc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotICAgICAgICAjcmVnaW9uIEFkZCBmdW5jdGlvbnMKLSAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgICAgIC8vLyBBZGQgYSBuZXcgY2hhcnQgdG8gdGhlIHdvcmtzaGVldC4KLSAgICAgICAgICAgIC8vLyBEbyBub3Qgc3VwcG9ydCBCdWJibGUtLCBSYWRhci0sIFN0b2NrLSBvciBTdXJmYWNlIGNoYXJ0cy4gCi0gICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJOYW1lIj48L3BhcmFtPgotICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJDaGFydFR5cGUiPlR5cGUgb2YgY2hhcnQ8L3BhcmFtPgotICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJQaXZvdFRhYmxlU291cmNlIj5UaGUgcGl2b3R0YWJsZSBzb3VyY2UgZm9yIGEgcGl2b3RjaGFydDwvcGFyYW0+ICAgIAotICAgICAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBjaGFydDwvcmV0dXJucz4KLSAgICAgICAgICAgIHB1YmxpYyBFeGNlbENoYXJ0IEFkZENoYXJ0KHN0cmluZyBOYW1lLCBlQ2hhcnRUeXBlIENoYXJ0VHlwZSwgRXhjZWxQaXZvdFRhYmxlIFBpdm90VGFibGVTb3VyY2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoX2RyYXdpbmdOYW1lcy5Db250YWluc0tleShOYW1lKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIk5hbWUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGRyYXdpbmdzIGNvbGxlY3Rpb24iKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuU3RvY2tITEMgfHwKLSAgICAgICAgICAgICAgICAgICAgQ2hhcnRUeXBlID09IGVDaGFydFR5cGUuU3RvY2tPSExDIHx8Ci0gICAgICAgICAgICAgICAgICAgIENoYXJ0VHlwZSA9PSBlQ2hhcnRUeXBlLlN0b2NrVk9ITEMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyhuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oIkNoYXJ0IHR5cGUgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgY3VycmVudCB2ZXJzaW9uIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoV29ya3NoZWV0IGlzIEV4Y2VsQ2hhcnRzaGVldCAmJiBfZHJhd2luZ3MuQ291bnQgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkNoYXJ0IFdvcmtzaGVldHMgY2FuJ3QgaGF2ZSBtb3JlIHRoYW4gb25lIGNoYXJ0Iik7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBYbWxFbGVtZW50IGRyYXdOb2RlID0gQ3JlYXRlRHJhd2luZ1htbCgpOwotCi0gICAgICAgICAgICAgICAgRXhjZWxDaGFydCBjaGFydCA9IEV4Y2VsQ2hhcnQuR2V0TmV3Q2hhcnQodGhpcywgZHJhd05vZGUsIENoYXJ0VHlwZSwgbnVsbCwgUGl2b3RUYWJsZVNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgY2hhcnQuTmFtZSA9IE5hbWU7Ci0gICAgICAgICAgICAgICAgX2RyYXdpbmdzLkFkZChjaGFydCk7Ci0gICAgICAgICAgICAgICAgX2RyYXdpbmdOYW1lcy5BZGQoTmFtZSwgX2RyYXdpbmdzLkNvdW50IC0gMSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNoYXJ0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAgICAgLy8vIEFkZCBhIG5ldyBjaGFydCB0byB0aGUgd29ya3NoZWV0LgotICAgICAgICAgICAgLy8vIERvIG5vdCBzdXBwb3J0IEJ1YmJsZS0sIFJhZGFyLSwgU3RvY2stIG9yIFN1cmZhY2UgY2hhcnRzLiAKLSAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Ik5hbWUiPjwvcGFyYW0+Ci0gICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkNoYXJ0VHlwZSI+VHlwZSBvZiBjaGFydDwvcGFyYW0+Ci0gICAgICAgICAgICAvLy8gPHJldHVybnM+VGhlIGNoYXJ0PC9yZXR1cm5zPgotICAgICAgICAgICAgcHVibGljIEV4Y2VsQ2hhcnQgQWRkQ2hhcnQoc3RyaW5nIE5hbWUsIGVDaGFydFR5cGUgQ2hhcnRUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBBZGRDaGFydChOYW1lLCBDaGFydFR5cGUsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAgICAgLy8vIEFkZCBhIHBpY3VyZSB0byB0aGUgd29ya3NoZWV0Ci0gICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJOYW1lIj48L3BhcmFtPgotICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbWFnZSI+QW4gaW1hZ2UuIEFsbHdheXMgc2F2ZWQgaW4gdGhlbiBKUGVnIGZvcm1hdDwvcGFyYW0+Ci0gICAgICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICAgICAgcHVibGljIEV4Y2VsUGljdHVyZSBBZGRQaWN0dXJlKHN0cmluZyBOYW1lLCBBbnlCaXRtYXAgaW1hZ2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICByZXR1cm4gQWRkUGljdHVyZShOYW1lLCBpbWFnZSwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAvLy8gQWRkIGEgcGljdXJlIHRvIHRoZSB3b3Jrc2hlZXQKLSAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Ik5hbWUiPjwvcGFyYW0+Ci0gICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImltYWdlIj5BbiBpbWFnZS4gQWxsd2F5cyBzYXZlZCBpbiB0aGVuIEpQZWcgZm9ybWF0PC9wYXJhbT4KLSAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iSHlwZXJsaW5rIj5QaWN0dXJlIEh5cGVybGluazwvcGFyYW0+Ci0gICAgICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICAgICAgcHVibGljIEV4Y2VsUGljdHVyZSBBZGRQaWN0dXJlKHN0cmluZyBOYW1lLCBBbnlCaXRtYXAgaW1hZ2UsIFVyaSBIeXBlcmxpbmspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGltYWdlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoX2RyYXdpbmdOYW1lcy5Db250YWluc0tleShOYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiTmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZHJhd2luZ3MgY29sbGVjdGlvbiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgZHJhd05vZGUgPSBDcmVhdGVEcmF3aW5nWG1sKCk7Ci0gICAgICAgICAgICAgICAgICAgIGRyYXdOb2RlLlNldEF0dHJpYnV0ZSgiZWRpdEFzIiwgIm9uZUNlbGwiKTsKLSAgICAgICAgICAgICAgICAgICAgRXhjZWxQaWN0dXJlIHBpYyA9IG5ldyBFeGNlbFBpY3R1cmUodGhpcywgZHJhd05vZGUsIGltYWdlLCBIeXBlcmxpbmspOwotICAgICAgICAgICAgICAgICAgICBwaWMuTmFtZSA9IE5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIF9kcmF3aW5ncy5BZGQocGljKTsKLSAgICAgICAgICAgICAgICAgICAgX2RyYXdpbmdOYW1lcy5BZGQoTmFtZSwgX2RyYXdpbmdzLkNvdW50IC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwaWM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKCJBZGRQaWN0dXJlOiBJbWFnZSBjYW4ndCBiZSBudWxsIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAgICAgLy8vIEFkZCBhIHBpY3VyZSB0byB0aGUgd29ya3NoZWV0Ci0gICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJOYW1lIj48L3BhcmFtPgotICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJJbWFnZUZpbGUiPlRoZSBpbWFnZSBmaWxlPC9wYXJhbT4KLSAgICAgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgICAgICBwdWJsaWMgRXhjZWxQaWN0dXJlIEFkZFBpY3R1cmUoc3RyaW5nIE5hbWUsIEZpbGVJbmZvIEltYWdlRmlsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiBBZGRQaWN0dXJlKE5hbWUsIEltYWdlRmlsZSwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAvLy8gQWRkIGEgcGljdXJlIHRvIHRoZSB3b3Jrc2hlZXQKLSAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Ik5hbWUiPjwvcGFyYW0+Ci0gICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkltYWdlRmlsZSI+VGhlIGltYWdlIGZpbGU8L3BhcmFtPgotICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJIeXBlcmxpbmsiPlBpY3R1cmUgSHlwZXJsaW5rPC9wYXJhbT4KLSAgICAgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgICAgICBwdWJsaWMgRXhjZWxQaWN0dXJlIEFkZFBpY3R1cmUoc3RyaW5nIE5hbWUsIEZpbGVJbmZvIEltYWdlRmlsZSwgVXJpIEh5cGVybGluaykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoV29ya3NoZWV0IGlzIEV4Y2VsQ2hhcnRzaGVldCAmJiBfZHJhd2luZ3MuQ291bnQgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkNoYXJ0IHdvcmtzaGVldHMgY2FuJ3QgaGF2ZSBtb3JlIHRoYW4gb25lIGRyYXdpbmciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKEltYWdlRmlsZSAhPSBudWxsKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKF9kcmF3aW5nTmFtZXMuQ29udGFpbnNLZXkoTmFtZSkpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJOYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoZSBkcmF3aW5ncyBjb2xsZWN0aW9uIik7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBYbWxFbGVtZW50IGRyYXdOb2RlID0gQ3JlYXRlRHJhd2luZ1htbCgpOwotICAgICAgICAgICAgICAgICAgZHJhd05vZGUuU2V0QXR0cmlidXRlKCJlZGl0QXMiLCAib25lQ2VsbCIpOwotICAgICAgICAgICAgICAgICAgRXhjZWxQaWN0dXJlIHBpYyA9IG5ldyBFeGNlbFBpY3R1cmUodGhpcywgZHJhd05vZGUsIEltYWdlRmlsZSwgSHlwZXJsaW5rKTsKLSAgICAgICAgICAgICAgICAgIHBpYy5OYW1lID0gTmFtZTsKLSAgICAgICAgICAgICAgICAgIF9kcmF3aW5ncy5BZGQocGljKTsKLSAgICAgICAgICAgICAgICAgIF9kcmF3aW5nTmFtZXMuQWRkKE5hbWUsIF9kcmF3aW5ncy5Db3VudCAtIDEpOwotICAgICAgICAgICAgICAgICAgcmV0dXJuIHBpYzsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKCJBZGRQaWN0dXJlOiBJbWFnZUZpbGUgY2FuJ3QgYmUgbnVsbCIpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBZGQgYSBuZXcgc2hhcGUgdG8gdGhlIHdvcmtzaGVldAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Ik5hbWUiPk5hbWU8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlN0eWxlIj5TaGFwZSBzdHlsZTwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgc2hhcGUgb2JqZWN0PC9yZXR1cm5zPgotICAgIAotICAgICAgICBwdWJsaWMgRXhjZWxTaGFwZSBBZGRTaGFwZShzdHJpbmcgTmFtZSwgZVNoYXBlU3R5bGUgU3R5bGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKFdvcmtzaGVldCBpcyBFeGNlbENoYXJ0c2hlZXQgJiYgX2RyYXdpbmdzLkNvdW50ID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJDaGFydCB3b3Jrc2hlZXRzIGNhbid0IGhhdmUgbW9yZSB0aGFuIG9uZSBkcmF3aW5nIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChfZHJhd2luZ05hbWVzLkNvbnRhaW5zS2V5KE5hbWUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiTmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZHJhd2luZ3MgY29sbGVjdGlvbiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBYbWxFbGVtZW50IGRyYXdOb2RlID0gQ3JlYXRlRHJhd2luZ1htbCgpOwotCi0gICAgICAgICAgICAgICAgRXhjZWxTaGFwZSBzaGFwZSA9IG5ldyBFeGNlbFNoYXBlKHRoaXMsIGRyYXdOb2RlLCBTdHlsZSk7Ci0gICAgICAgICAgICAgICAgc2hhcGUuTmFtZSA9IE5hbWU7Ci0gICAgICAgICAgICAgICAgc2hhcGUuU3R5bGUgPSBTdHlsZTsKLSAgICAgICAgICAgICAgICBfZHJhd2luZ3MuQWRkKHNoYXBlKTsKLSAgICAgICAgICAgICAgICBfZHJhd2luZ05hbWVzLkFkZChOYW1lLCBfZHJhd2luZ3MuQ291bnQgLSAxKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc2hhcGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFkZCBhIG5ldyBzaGFwZSB0byB0aGUgd29ya3NoZWV0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iTmFtZSI+TmFtZTwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iU291cmNlIj5Tb3VyY2Ugc2hhcGU8L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIHNoYXBlIG9iamVjdDwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIEV4Y2VsU2hhcGUgQWRkU2hhcGUoc3RyaW5nIE5hbWUsIEV4Y2VsU2hhcGUgU291cmNlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoV29ya3NoZWV0IGlzIEV4Y2VsQ2hhcnRzaGVldCAmJiBfZHJhd2luZ3MuQ291bnQgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJDaGFydCB3b3Jrc2hlZXRzIGNhbid0IGhhdmUgbW9yZSB0aGFuIG9uZSBkcmF3aW5nIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoX2RyYXdpbmdOYW1lcy5Db250YWluc0tleShOYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJOYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoZSBkcmF3aW5ncyBjb2xsZWN0aW9uIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBYbWxFbGVtZW50IGRyYXdOb2RlID0gQ3JlYXRlRHJhd2luZ1htbCgpOwotICAgICAgICAgICAgZHJhd05vZGUuSW5uZXJYbWwgPSBTb3VyY2UuVG9wTm9kZS5Jbm5lclhtbDsKLQotICAgICAgICAgICAgRXhjZWxTaGFwZSBzaGFwZSA9IG5ldyBFeGNlbFNoYXBlKHRoaXMsIGRyYXdOb2RlKTsKLSAgICAgICAgICAgIHNoYXBlLk5hbWUgPSBOYW1lOwotICAgICAgICAgICAgc2hhcGUuU3R5bGUgPSBTb3VyY2UuU3R5bGU7Ci0gICAgICAgICAgICBfZHJhd2luZ3MuQWRkKHNoYXBlKTsKLSAgICAgICAgICAgIF9kcmF3aW5nTmFtZXMuQWRkKE5hbWUsIF9kcmF3aW5ncy5Db3VudCAtIDEpOwotICAgICAgICAgICAgcmV0dXJuIHNoYXBlOwotICAgICAgICB9Ci0gICAgICAgICAgICBwcml2YXRlIFhtbEVsZW1lbnQgQ3JlYXRlRHJhd2luZ1htbCgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKERyYXdpbmdYbWwuT3V0ZXJYbWwgPT0gIiIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEcmF3aW5nWG1sLkxvYWRYbWwoc3RyaW5nLkZvcm1hdCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiBzdGFuZGFsb25lPVwieWVzXCI/Pjx4ZHI6d3NEciB4bWxuczp4ZHI9XCJ7MH1cIiB4bWxuczphPVwiezF9XCIgLz4iLCBFeGNlbFBhY2thZ2Uuc2NoZW1hU2hlZXREcmF3aW5ncywgRXhjZWxQYWNrYWdlLnNjaGVtYURyYXdpbmdzKSk7Ci0gICAgICAgICAgICAgICAgICAgIF91cmlEcmF3aW5nID0gbmV3IFVyaShzdHJpbmcuRm9ybWF0KCIveGwvZHJhd2luZ3MvZHJhd2luZ3swfS54bWwiLCBXb3Jrc2hlZXQuU2hlZXRJRCksVXJpS2luZC5SZWxhdGl2ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgUGFja2FnaW5nLlppcFBhY2thZ2UgcGFja2FnZSA9IFdvcmtzaGVldC5fcGFja2FnZS5QYWNrYWdlOwotICAgICAgICAgICAgICAgICAgICBfcGFydCA9IHBhY2thZ2UuQ3JlYXRlUGFydChfdXJpRHJhd2luZywgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5kcmF3aW5nK3htbCIsIF9wYWNrYWdlLkNvbXByZXNzaW9uKTsKLQotICAgICAgICAgICAgICAgICAgICBTdHJlYW1Xcml0ZXIgc3RyZWFtQ2hhcnQgPSBuZXcgU3RyZWFtV3JpdGVyKF9wYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuV3JpdGUpKTsKLSAgICAgICAgICAgICAgICAgICAgRHJhd2luZ1htbC5TYXZlKHN0cmVhbUNoYXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtQ2hhcnQuQ2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcGFja2FnZS5GbHVzaCgpOwotCi0gICAgICAgICAgICAgICAgICAgIF9kcmF3aW5nUmVsYXRpb24gPSBXb3Jrc2hlZXQuUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoVXJpSGVscGVyLkdldFJlbGF0aXZlVXJpKFdvcmtzaGVldC5Xb3Jrc2hlZXRVcmksIF91cmlEcmF3aW5nKSwgUGFja2FnaW5nLlRhcmdldE1vZGUuSW50ZXJuYWwsIEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxhdGlvbnNoaXBzICsgIi9kcmF3aW5nIik7Ci0gICAgICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgZSA9IFdvcmtzaGVldC5Xb3Jrc2hlZXRYbWwuQ3JlYXRlRWxlbWVudCgiZHJhd2luZyIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKLSAgICAgICAgICAgICAgICAgICAgZS5TZXRBdHRyaWJ1dGUoImlkIixFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcywgX2RyYXdpbmdSZWxhdGlvbi5JZCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgV29ya3NoZWV0LldvcmtzaGVldFhtbC5Eb2N1bWVudEVsZW1lbnQuQXBwZW5kQ2hpbGQoZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBhY2thZ2UuRmx1c2goKTsgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBYbWxOb2RlIGNvbE5vZGUgPSBfZHJhd2luZ3NYbWwuU2VsZWN0U2luZ2xlTm9kZSgiLy94ZHI6d3NEciIsIE5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgZHJhd05vZGU7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMuV29ya3NoZWV0IGlzIEV4Y2VsQ2hhcnRzaGVldCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRyYXdOb2RlID0gX2RyYXdpbmdzWG1sLkNyZWF0ZUVsZW1lbnQoInhkciIsICJhYnNvbHV0ZUFuY2hvciIsIEV4Y2VsUGFja2FnZS5zY2hlbWFTaGVldERyYXdpbmdzKTsKLSAgICAgICAgICAgICAgICAgICAgWG1sRWxlbWVudCBwb3NOb2RlID0gX2RyYXdpbmdzWG1sLkNyZWF0ZUVsZW1lbnQoInhkciIsICJwb3MiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hU2hlZXREcmF3aW5ncyk7Ci0gICAgICAgICAgICAgICAgICAgIHBvc05vZGUuU2V0QXR0cmlidXRlKCJ5IiwgIjAiKTsKLSAgICAgICAgICAgICAgICAgICAgcG9zTm9kZS5TZXRBdHRyaWJ1dGUoIngiLCAiMCIpOwotICAgICAgICAgICAgICAgICAgICBkcmF3Tm9kZS5BcHBlbmRDaGlsZChwb3NOb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgWG1sRWxlbWVudCBleHROb2RlID0gX2RyYXdpbmdzWG1sLkNyZWF0ZUVsZW1lbnQoInhkciIsICJleHQiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hU2hlZXREcmF3aW5ncyk7Ci0gICAgICAgICAgICAgICAgICAgIGV4dE5vZGUuU2V0QXR0cmlidXRlKCJjeSIsICI2MDcyODc2Iik7Ci0gICAgICAgICAgICAgICAgICAgIGV4dE5vZGUuU2V0QXR0cmlidXRlKCJjeCIsICI5Mjk5MjYzIik7Ci0gICAgICAgICAgICAgICAgICAgIGRyYXdOb2RlLkFwcGVuZENoaWxkKGV4dE5vZGUpOwotICAgICAgICAgICAgICAgICAgICBjb2xOb2RlLkFwcGVuZENoaWxkKGRyYXdOb2RlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZHJhd05vZGUgPSBfZHJhd2luZ3NYbWwuQ3JlYXRlRWxlbWVudCgieGRyIiwgInR3b0NlbGxBbmNob3IiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hU2hlZXREcmF3aW5ncyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbE5vZGUuQXBwZW5kQ2hpbGQoZHJhd05vZGUpOwotICAgICAgICAgICAgICAgICAgICAvL0FkZCBmcm9tIHBvc2l0aW9uIEVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgZnJvbU5vZGUgPSBfZHJhd2luZ3NYbWwuQ3JlYXRlRWxlbWVudCgieGRyIiwgImZyb20iLCBFeGNlbFBhY2thZ2Uuc2NoZW1hU2hlZXREcmF3aW5ncyk7Ci0gICAgICAgICAgICAgICAgICAgIGRyYXdOb2RlLkFwcGVuZENoaWxkKGZyb21Ob2RlKTsKLSAgICAgICAgICAgICAgICAgICAgZnJvbU5vZGUuSW5uZXJYbWwgPSAiPHhkcjpjb2w+MDwveGRyOmNvbD48eGRyOmNvbE9mZj4wPC94ZHI6Y29sT2ZmPjx4ZHI6cm93PjA8L3hkcjpyb3c+PHhkcjpyb3dPZmY+MDwveGRyOnJvd09mZj4iOwotCi0gICAgICAgICAgICAgICAgICAgIC8vQWRkIHRvIHBvc2l0aW9uIEVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgdG9Ob2RlID0gX2RyYXdpbmdzWG1sLkNyZWF0ZUVsZW1lbnQoInhkciIsICJ0byIsIEV4Y2VsUGFja2FnZS5zY2hlbWFTaGVldERyYXdpbmdzKTsKLSAgICAgICAgICAgICAgICAgICAgZHJhd05vZGUuQXBwZW5kQ2hpbGQodG9Ob2RlKTsKLSAgICAgICAgICAgICAgICAgICAgdG9Ob2RlLklubmVyWG1sID0gIjx4ZHI6Y29sPjEwPC94ZHI6Y29sPjx4ZHI6Y29sT2ZmPjA8L3hkcjpjb2xPZmY+PHhkcjpyb3c+MTA8L3hkcjpyb3c+PHhkcjpyb3dPZmY+MDwveGRyOnJvd09mZj4iOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBkcmF3Tm9kZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotICAgICAgICAjcmVnaW9uIFJlbW92ZSBtZXRob2RzCi0gICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAvLy8gUmVtb3ZlcyBhIGRyYXdpbmcuCi0gICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJJbmRleCI+VGhlIGluZGV4IG9mIHRoZSBkcmF3aW5nPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgUmVtb3ZlKGludCBJbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKFdvcmtzaGVldCBpcyBFeGNlbENoYXJ0c2hlZXQgJiYgX2RyYXdpbmdzLkNvdW50ID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2FuJyByZW1vdmUgY2hhcnRzIGZyb20gY2hhcnQgd29ya3NoZWV0cyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUmVtb3ZlRHJhd2luZyhJbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCB2b2lkIFJlbW92ZURyYXdpbmcoaW50IEluZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZHJhdyA9IF9kcmF3aW5nc1tJbmRleF07Ci0gICAgICAgICAgICBkcmF3LkRlbGV0ZU1lKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gSW5kZXggKyAxOyBpIDwgX2RyYXdpbmdzLkNvdW50OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2RyYXdpbmdOYW1lc1tfZHJhd2luZ3NbaV0uTmFtZV0tLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9kcmF3aW5nTmFtZXMuUmVtb3ZlKGRyYXcuTmFtZSk7Ci0gICAgICAgICAgICBfZHJhd2luZ3MuUmVtb3ZlKGRyYXcpOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlbW92ZXMgYSBkcmF3aW5nLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkRyYXdpbmciPlRoZSBkcmF3aW5nPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgUmVtb3ZlKEV4Y2VsRHJhd2luZyBEcmF3aW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZW1vdmUoX2RyYXdpbmdOYW1lc1tEcmF3aW5nLk5hbWVdKTsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZW1vdmVzIGEgZHJhd2luZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJOYW1lIj5UaGUgbmFtZSBvZiB0aGUgZHJhd2luZzwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFJlbW92ZShzdHJpbmcgTmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgUmVtb3ZlKF9kcmF3aW5nTmFtZXNbTmFtZV0pOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlbW92ZXMgYWxsIGRyYXdpbmdzIGZyb20gdGhlIGNvbGxlY3Rpb24KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHZvaWQgQ2xlYXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoV29ya3NoZWV0IGlzIEV4Y2VsQ2hhcnRzaGVldCAmJiBfZHJhd2luZ3MuQ291bnQgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW4nIHJlbW92ZSBjaGFydHMgZnJvbSBjaGFydCB3b3Jrc2hlZXRzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDbGVhckRyYXdpbmdzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCB2b2lkIENsZWFyRHJhd2luZ3MoKQotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSAoQ291bnQgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJlbW92ZURyYXdpbmcoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotICAgICAgICAgICAgaW50ZXJuYWwgdm9pZCBBZGp1c3RXaWR0aChpbnRbLF0gcG9zKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBpeCA9IDA7Ci0gICAgICAgICAgICAgICAgLy9Ob3cgc2V0IHRoZSBzaXplIGZvciBhbGwgZHJhd2luZ3MgZGVwZW5kaW5nIG9uIHRoZSBlZGl0QXMgcHJvcGVydHkuCi0gICAgICAgICAgICAgICAgZm9yZWFjaCAoT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkV4Y2VsRHJhd2luZyBkIGluIHRoaXMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoZC5FZGl0QXMgIT0gRHJhd2luZy5lRWRpdEFzLlR3b0NlbGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLkVkaXRBcyA9PSBEcmF3aW5nLmVFZGl0QXMuQWJzb2x1dGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5TZXRQaXhlbExlZnQocG9zW2l4LCAwXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkLlNldFBpeGVsV2lkdGgocG9zW2l4LCAxXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpeCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludGVybmFsIHZvaWQgQWRqdXN0SGVpZ2h0KGludFssXSBwb3MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGl4ID0gMDsKLSAgICAgICAgICAgICAgICAvL05vdyBzZXQgdGhlIHNpemUgZm9yIGFsbCBkcmF3aW5ncyBkZXBlbmRpbmcgb24gdGhlIGVkaXRBcyBwcm9wZXJ0eS4KLSAgICAgICAgICAgICAgICBmb3JlYWNoIChPZmZpY2VPcGVuWG1sLkRyYXdpbmcuRXhjZWxEcmF3aW5nIGQgaW4gdGhpcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkLkVkaXRBcyAhPSBEcmF3aW5nLmVFZGl0QXMuVHdvQ2VsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQuRWRpdEFzID09IERyYXdpbmcuZUVkaXRBcy5BYnNvbHV0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLlNldFBpeGVsVG9wKHBvc1tpeCwgMF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZC5TZXRQaXhlbEhlaWdodChwb3NbaXgsIDFdKTsKLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGl4Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50ZXJuYWwgaW50WyxdIEdldERyYXdpbmdXaWR0aHMoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludFssXSBwb3MgPSBuZXcgaW50W0NvdW50LCAyXTsKLSAgICAgICAgICAgICAgICBpbnQgaXggPSAwOwotICAgICAgICAgICAgICAgIC8vU2F2ZSB0aGUgc2l6ZSBmb3IgYWxsIGRyYXdpbmdzCi0gICAgICAgICAgICAgICAgZm9yZWFjaCAoRXhjZWxEcmF3aW5nIGQgaW4gdGhpcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBvc1tpeCwgMF0gPSBkLkdldFBpeGVsTGVmdCgpOwotICAgICAgICAgICAgICAgICAgICBwb3NbaXgrKywgMV0gPSBkLkdldFBpeGVsV2lkdGgoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBvczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludGVybmFsIGludFssXSBHZXREcmF3aW5nSGVpZ2h0KCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnRbLF0gcG9zID0gbmV3IGludFtDb3VudCwgMl07Ci0gICAgICAgICAgICAgICAgaW50IGl4ID0gMDsKLSAgICAgICAgICAgICAgICAvL1NhdmUgdGhlIHNpemUgZm9yIGFsbCBkcmF3aW5ncwotICAgICAgICAgICAgICAgIGZvcmVhY2ggKEV4Y2VsRHJhd2luZyBkIGluIHRoaXMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwb3NbaXgsIDBdID0gZC5HZXRQaXhlbFRvcCgpOwotICAgICAgICAgICAgICAgICAgICBwb3NbaXgrKywgMV0gPSBkLkdldFBpeGVsSGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBwb3M7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9kcmF3aW5nc1htbCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgX2hhc2hlcy5DbGVhcigpOwotICAgICAgICAgICAgICAgIF9oYXNoZXMgPSBudWxsOwotICAgICAgICAgICAgICAgIF9wYXJ0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBfZHJhd2luZ05hbWVzLkNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgX2RyYXdpbmdOYW1lcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgX2RyYXdpbmdSZWxhdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGQgaW4gX2RyYXdpbmdzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZC5EaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIF9kcmF3aW5ncy5DbGVhcigpOwotICAgICAgICAgICAgICAgIF9kcmF3aW5ncyA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvRXhjZWxQaWN0dXJlLmNzIGIvRVBQbHVzL0RyYXdpbmcvRXhjZWxQaWN0dXJlLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTNkZDI0Li4wMDAwMDAwCi0tLSBhL0VQUGx1cy9EcmF3aW5nL0V4Y2VsUGljdHVyZS5jcworKysgL2Rldi9udWxsCkBAIC0xLDQyMCArMCwwIEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKLSAqCi0gKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgotICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAotICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAotICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgotICoKLSAqIENvZGUgY2hhbmdlIG5vdGVzOgotICoKLSAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCi0gKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlhtbDsKLXVzaW5nIFN5c3RlbS5JTzsKLXVzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKLXVzaW5nIElyb25Tb2Z0d2FyZS5EcmF3aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Db21wYXRpYmlsaXR5OwotdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKLQotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZwotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQW4gaW1hZ2Ugb2JqZWN0Ci0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsUGljdHVyZSA6IEV4Y2VsRHJhd2luZwotICAgIHsKLSAgICAgICAgI3JlZ2lvbiAiQ29uc3RydWN0b3JzIgotICAgICAgICBpbnRlcm5hbCBFeGNlbFBpY3R1cmUoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlKSA6Ci0gICAgICAgICAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCAieGRyOnBpYy94ZHI6bnZQaWNQci94ZHI6Y052UHIvQG5hbWUiKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxOb2RlIHBpY05vZGUgPSBub2RlLlNlbGVjdFNpbmdsZU5vZGUoInhkcjpwaWMveGRyOmJsaXBGaWxsL2E6YmxpcCIsIGRyYXdpbmdzLk5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgaWYgKHBpY05vZGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSZWxQaWMgPSBkcmF3aW5ncy5QYXJ0LkdldFJlbGF0aW9uc2hpcChwaWNOb2RlLkF0dHJpYnV0ZXNbInI6ZW1iZWQiXS5WYWx1ZSk7Ci0gICAgICAgICAgICAgICAgVXJpUGljID0gVXJpSGVscGVyLlJlc29sdmVQYXJ0VXJpKGRyYXdpbmdzLlVyaURyYXdpbmcsIFJlbFBpYy5UYXJnZXRVcmkpOwotCi0gICAgICAgICAgICAgICAgUGFydCA9IGRyYXdpbmdzLlBhcnQuUGFja2FnZS5HZXRQYXJ0KFVyaVBpYyk7Ci0gICAgICAgICAgICAgICAgRmlsZUluZm8gZiA9IG5ldyBGaWxlSW5mbyhVcmlQaWMuT3JpZ2luYWxTdHJpbmcpOwotICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0gR2V0Q29udGVudFR5cGUoZi5FeHRlbnNpb24pOwotICAgICAgICAgICAgICAgIF9pbWFnZSA9IEFueUJpdG1hcC5Gcm9tU3RyZWFtKFBhcnQuR2V0U3RyZWFtKCkpOwotI2lmIChDb3JlKQotICAgICAgICAgICAgICAgIGJ5dGVbXSBpYnkgPSBJbWFnZUNvbXBhdC5HZXRJbWFnZUFzQnl0ZUFycmF5KF9pbWFnZSk7Ci0jZWxzZQotICAgICAgICAgICAgICAgIEltYWdlQ29udmVydGVyIGljPW5ldyBJbWFnZUNvbnZlcnRlcigpOwotICAgICAgICAgICAgICAgIHZhciBpYnk9KGJ5dGVbXSlpYy5Db252ZXJ0VG8oX2ltYWdlLCB0eXBlb2YoYnl0ZVtdKSk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB2YXIgaWkgPSBfZHJhd2luZ3MuX3BhY2thZ2UuTG9hZEltYWdlKGlieSwgVXJpUGljLCBQYXJ0KTsKLSAgICAgICAgICAgICAgICBJbWFnZUhhc2ggPSBpaS5IYXNoOwotCi0gICAgICAgICAgICAgICAgc3RyaW5nIHJlbElEID0gR2V0WG1sTm9kZVN0cmluZygieGRyOnBpYy94ZHI6bnZQaWNQci94ZHI6Y052UHIvYTpobGlua0NsaWNrL0ByOmlkIik7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShyZWxJRCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBIeXBSZWwgPSBkcmF3aW5ncy5QYXJ0LkdldFJlbGF0aW9uc2hpcChyZWxJRCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChIeXBSZWwuVGFyZ2V0VXJpLklzQWJzb2x1dGVVcmkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9oeXBlcmxpbmsgPSBuZXcgRXhjZWxIeXBlckxpbmsoSHlwUmVsLlRhcmdldFVyaS5BYnNvbHV0ZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfaHlwZXJsaW5rID0gbmV3IEV4Y2VsSHlwZXJMaW5rKEh5cFJlbC5UYXJnZXRVcmkuT3JpZ2luYWxTdHJpbmcsIFVyaUtpbmQuUmVsYXRpdmUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICgoRXhjZWxIeXBlckxpbmspX2h5cGVybGluaykuVG9vbFRpcCA9IEdldFhtbE5vZGVTdHJpbmcoInhkcjpwaWMveGRyOm52UGljUHIveGRyOmNOdlByL2E6aGxpbmtDbGljay9AdG9vbHRpcCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBFeGNlbFBpY3R1cmUoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlLCBBbnlCaXRtYXAgaW1hZ2UpIDoKLSAgICAgICAgICAgdGhpcyhkcmF3aW5ncywgbm9kZSwgaW1hZ2UsIG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBFeGNlbFBpY3R1cmUoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlLCBBbnlCaXRtYXAgaW1hZ2UsIFVyaSBoeXBlcmxpbmspIDoKLSAgICAgICAgICAgIGJhc2UoZHJhd2luZ3MsIG5vZGUsICJ4ZHI6cGljL3hkcjpudlBpY1ByL3hkcjpjTnZQci9AbmFtZSIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbEVsZW1lbnQgcGljTm9kZSA9IG5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KCJ4ZHIiLCAicGljIiwgRXhjZWxQYWNrYWdlLnNjaGVtYVNoZWV0RHJhd2luZ3MpOwotICAgICAgICAgICAgbm9kZS5JbnNlcnRBZnRlcihwaWNOb2RlLG5vZGUuU2VsZWN0U2luZ2xlTm9kZSgieGRyOnRvIixOYW1lU3BhY2VNYW5hZ2VyKSk7Ci0gICAgICAgICAgICBfaHlwZXJsaW5rID0gaHlwZXJsaW5rOwotICAgICAgICAgICAgcGljTm9kZS5Jbm5lclhtbCA9IFBpY1N0YXJ0WG1sKCk7Ci0KLSAgICAgICAgICAgIG5vZGUuSW5zZXJ0QWZ0ZXIobm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoInhkciIsICJjbGllbnREYXRhIiwgRXhjZWxQYWNrYWdlLnNjaGVtYVNoZWV0RHJhd2luZ3MpLCBwaWNOb2RlKTsKLQotICAgICAgICAgICAgdmFyIHBhY2thZ2UgPSBkcmF3aW5ncy5Xb3Jrc2hlZXQuX3BhY2thZ2UuUGFja2FnZTsKLSAgICAgICAgICAgIC8vR2V0IHRoZSBwaWN0dXJlIGlmIGl0IGV4aXN0cyBvciBzYXZlIGl0IGlmIG5vdC4KLSAgICAgICAgICAgIF9pbWFnZSA9IGltYWdlOwotICAgICAgICAgICAgc3RyaW5nIHJlbElEID0gU2F2ZVBpY3R1cmUoaW1hZ2UpOwotCi0gICAgICAgICAgICAvL0NyZWF0ZSByZWxhdGlvbnNoaXAKLSAgICAgICAgICAgIG5vZGUuU2VsZWN0U2luZ2xlTm9kZSgieGRyOnBpYy94ZHI6YmxpcEZpbGwvYTpibGlwL0ByOmVtYmVkIiwgTmFtZVNwYWNlTWFuYWdlcikuVmFsdWUgPSByZWxJRDsKLQotICAgICAgICAgICAgU2V0UG9zRGVmYXVsdHMoaW1hZ2UpOwotICAgICAgICAgICAgcGFja2FnZS5GbHVzaCgpOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIEV4Y2VsUGljdHVyZShFeGNlbERyYXdpbmdzIGRyYXdpbmdzLCBYbWxOb2RlIG5vZGUsIEZpbGVJbmZvIGltYWdlRmlsZSkgOgotICAgICAgICAgICB0aGlzKGRyYXdpbmdzLG5vZGUsaW1hZ2VGaWxlLG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBFeGNlbFBpY3R1cmUoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlLCBGaWxlSW5mbyBpbWFnZUZpbGUsIFVyaSBoeXBlcmxpbmspIDoKLSAgICAgICAgICAgIGJhc2UoZHJhd2luZ3MsIG5vZGUsICJ4ZHI6cGljL3hkcjpudlBpY1ByL3hkcjpjTnZQci9AbmFtZSIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbEVsZW1lbnQgcGljTm9kZSA9IG5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KCJ4ZHIiLCAicGljIiwgRXhjZWxQYWNrYWdlLnNjaGVtYVNoZWV0RHJhd2luZ3MpOwotICAgICAgICAgICAgbm9kZS5JbnNlcnRBZnRlcihwaWNOb2RlLCBub2RlLlNlbGVjdFNpbmdsZU5vZGUoInhkcjp0byIsIE5hbWVTcGFjZU1hbmFnZXIpKTsKLSAgICAgICAgICAgIF9oeXBlcmxpbmsgPSBoeXBlcmxpbms7Ci0gICAgICAgICAgICBwaWNOb2RlLklubmVyWG1sID0gUGljU3RhcnRYbWwoKTsKLQotICAgICAgICAgICAgbm9kZS5JbnNlcnRBZnRlcihub2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgieGRyIiwgImNsaWVudERhdGEiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hU2hlZXREcmF3aW5ncyksIHBpY05vZGUpOwotCi0gICAgICAgICAgICAvL0NoYW5nZWQgdG8gc3RyZWFtIDIvNC0xMyAoaXNzdWUgMTQ4MzQpLiBUaG54IFNDbGF1c2UKLSAgICAgICAgICAgIHZhciBwYWNrYWdlID0gZHJhd2luZ3MuV29ya3NoZWV0Ll9wYWNrYWdlLlBhY2thZ2U7Ci0gICAgICAgICAgICBDb250ZW50VHlwZSA9IEdldENvbnRlbnRUeXBlKGltYWdlRmlsZS5FeHRlbnNpb24pOwotICAgICAgICAgICAgdmFyIGltYWdlc3RyZWFtID0gbmV3IEZpbGVTdHJlYW0oaW1hZ2VGaWxlLkZ1bGxOYW1lLCBGaWxlTW9kZS5PcGVuLCBGaWxlQWNjZXNzLlJlYWQpOwotICAgICAgICAgICAgX2ltYWdlID0gQW55Qml0bWFwLkZyb21TdHJlYW0oaW1hZ2VzdHJlYW0pOwotI2lmIChDb3JlKQotICAgICAgICAgICAgdmFyIGltZz1JbWFnZUNvbXBhdC5HZXRJbWFnZUFzQnl0ZUFycmF5KF9pbWFnZSk7Ci0jZWxzZQotICAgICAgICAgICAgSW1hZ2VDb252ZXJ0ZXIgaWMgPSBuZXcgSW1hZ2VDb252ZXJ0ZXIoKTsKLSAgICAgICAgICAgIHZhciBpbWcgPSAoYnl0ZVtdKWljLkNvbnZlcnRUbyhfaW1hZ2UsIHR5cGVvZihieXRlW10pKTsKLSNlbmRpZgotICAgICAgICAgICAgaW1hZ2VzdHJlYW0uQ2xvc2UoKTsKLQotICAgICAgICAgICAgVXJpUGljID0gR2V0TmV3VXJpKHBhY2thZ2UsICIveGwvbWVkaWEvezB9IiArIGltYWdlRmlsZS5OYW1lKTsKLSAgICAgICAgICAgIHZhciBpaSA9IF9kcmF3aW5ncy5fcGFja2FnZS5BZGRJbWFnZShpbWcsIFVyaVBpYywgQ29udGVudFR5cGUpOwotICAgICAgICAgICAgc3RyaW5nIHJlbElEOwotICAgICAgICAgICAgaWYoIWRyYXdpbmdzLl9oYXNoZXMuQ29udGFpbnNLZXkoaWkuSGFzaCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUGFydCA9IGlpLlBhcnQ7Ci0gICAgICAgICAgICAgICAgUmVsUGljID0gZHJhd2luZ3MuUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoVXJpSGVscGVyLkdldFJlbGF0aXZlVXJpKGRyYXdpbmdzLlVyaURyYXdpbmcsIGlpLlVyaSksIFBhY2thZ2luZy5UYXJnZXRNb2RlLkludGVybmFsLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcyArICIvaW1hZ2UiKTsKLSAgICAgICAgICAgICAgICByZWxJRCA9IFJlbFBpYy5JZDsKLSAgICAgICAgICAgICAgICBfZHJhd2luZ3MuX2hhc2hlcy5BZGQoaWkuSGFzaCwgcmVsSUQpOwotICAgICAgICAgICAgICAgIEFkZE5ld1BpY3R1cmUoaW1nLCByZWxJRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVsSUQgPSBkcmF3aW5ncy5faGFzaGVzW2lpLkhhc2hdOwotICAgICAgICAgICAgICAgIHZhciByZWwgPSBfZHJhd2luZ3MuUGFydC5HZXRSZWxhdGlvbnNoaXAocmVsSUQpOwotICAgICAgICAgICAgICAgIFVyaVBpYyA9IFVyaUhlbHBlci5SZXNvbHZlUGFydFVyaShyZWwuU291cmNlVXJpLCByZWwuVGFyZ2V0VXJpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEltYWdlSGFzaCA9IGlpLkhhc2g7Ci0gICAgICAgICAgICBTZXRQb3NEZWZhdWx0cyhJbWFnZSk7Ci0gICAgICAgICAgICAvL0NyZWF0ZSByZWxhdGlvbnNoaXAKLSAgICAgICAgICAgIG5vZGUuU2VsZWN0U2luZ2xlTm9kZSgieGRyOnBpYy94ZHI6YmxpcEZpbGwvYTpibGlwL0ByOmVtYmVkIiwgTmFtZVNwYWNlTWFuYWdlcikuVmFsdWUgPSByZWxJRDsKLSAgICAgICAgICAgIHBhY2thZ2UuRmx1c2goKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludGVybmFsIHN0YXRpYyBzdHJpbmcgR2V0Q29udGVudFR5cGUoc3RyaW5nIGV4dGVuc2lvbikKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoIChleHRlbnNpb24uVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlICIuYm1wIjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICAiaW1hZ2UvYm1wIjsKLSAgICAgICAgICAgICAgICBjYXNlICIuanBnIjoKLSAgICAgICAgICAgICAgICBjYXNlICIuanBlZyI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW1hZ2UvanBlZyI7Ci0gICAgICAgICAgICAgICAgY2FzZSAiLmdpZiI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW1hZ2UvZ2lmIjsKLSAgICAgICAgICAgICAgICBjYXNlICIucG5nIjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbWFnZS9wbmciOwotICAgICAgICAgICAgICAgIGNhc2UgIi5jZ20iOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gImltYWdlL2NnbSI7Ci0gICAgICAgICAgICAgICAgY2FzZSAiLmVtZiI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW1hZ2UveC1lbWYiOwotICAgICAgICAgICAgICAgIGNhc2UgIi5lcHMiOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gImltYWdlL3gtZXBzIjsKLSAgICAgICAgICAgICAgICBjYXNlICIucGN4IjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbWFnZS94LXBjeCI7Ci0gICAgICAgICAgICAgICAgY2FzZSAiLnRnYSI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW1hZ2UveC10Z2EiOwotICAgICAgICAgICAgICAgIGNhc2UgIi50aWYiOgotICAgICAgICAgICAgICAgIGNhc2UgIi50aWZmIjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJpbWFnZS94LXRpZmYiOwotICAgICAgICAgICAgICAgIGNhc2UgIi53bWYiOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gImltYWdlL3gtd21mIjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gImltYWdlL2pwZWciOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy9BZGQgYSBuZXcgaW1hZ2UgdG8gdGhlIGNvbXBhcmUgY29sbGVjdGlvbgotICAgICAgICBwcml2YXRlIHZvaWQgQWRkTmV3UGljdHVyZShieXRlW10gaW1nLCBzdHJpbmcgcmVsSUQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBuZXdQaWMgPSBuZXcgRXhjZWxEcmF3aW5ncy5JbWFnZUNvbXBhcmUoKTsKLSAgICAgICAgICAgIG5ld1BpYy5pbWFnZSA9IGltZzsKLSAgICAgICAgICAgIG5ld1BpYy5yZWxJRCA9IHJlbElEOwotICAgICAgICAgICAgLy9fZHJhd2luZ3MuX3BpY3MuQWRkKG5ld1BpYyk7Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotICAgICAgICBwcml2YXRlIHN0cmluZyBTYXZlUGljdHVyZShBbnlCaXRtYXAgaW1hZ2UpCi0gICAgICAgIHsKLSNpZiAoQ29yZSkKLSAgICAgICAgICAgIGJ5dGVbXSBpbWcgPSBJbWFnZUNvbXBhdC5HZXRJbWFnZUFzQnl0ZUFycmF5KGltYWdlKTsKLSNlbHNlCi0gICAgICAgICAgICBJbWFnZUNvbnZlcnRlciBpYyA9IG5ldyBJbWFnZUNvbnZlcnRlcigpOwotICAgICAgICAgICAgYnl0ZVtdIGltZyA9IChieXRlW10paWMuQ29udmVydFRvKGltYWdlLCB0eXBlb2YoYnl0ZVtdKSk7Ci0jZW5kaWYKLSAgICAgICAgICAgIHZhciBpaSA9IF9kcmF3aW5ncy5fcGFja2FnZS5BZGRJbWFnZShpbWcpOwotCi0gICAgICAgICAgICBJbWFnZUhhc2ggPSBpaS5IYXNoOwotICAgICAgICAgICAgaWYgKF9kcmF3aW5ncy5faGFzaGVzLkNvbnRhaW5zS2V5KGlpLkhhc2gpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciByZWxJRCA9IF9kcmF3aW5ncy5faGFzaGVzW2lpLkhhc2hdOwotICAgICAgICAgICAgICAgIHZhciByZWwgPSBfZHJhd2luZ3MuUGFydC5HZXRSZWxhdGlvbnNoaXAocmVsSUQpOwotICAgICAgICAgICAgICAgIFVyaVBpYyA9IFVyaUhlbHBlci5SZXNvbHZlUGFydFVyaShyZWwuU291cmNlVXJpLCByZWwuVGFyZ2V0VXJpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVsSUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVXJpUGljID0gaWkuVXJpOwotICAgICAgICAgICAgICAgIEltYWdlSGFzaCA9IGlpLkhhc2g7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vU2V0IHRoZSBJbWFnZSBhbmQgc2F2ZSBpdCB0byB0aGUgcGFja2FnZS4KLSAgICAgICAgICAgIFJlbFBpYyA9IF9kcmF3aW5ncy5QYXJ0LkNyZWF0ZVJlbGF0aW9uc2hpcChVcmlIZWxwZXIuR2V0UmVsYXRpdmVVcmkoX2RyYXdpbmdzLlVyaURyYXdpbmcsIFVyaVBpYyksIFBhY2thZ2luZy5UYXJnZXRNb2RlLkludGVybmFsLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcyArICIvaW1hZ2UiKTsKLQotICAgICAgICAgICAgLy9BZGROZXdQaWN0dXJlKGltZywgcGljUmVsYXRpb24uSWQpOwotICAgICAgICAgICAgX2RyYXdpbmdzLl9oYXNoZXMuQWRkKGlpLkhhc2gsIFJlbFBpYy5JZCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBSZWxQaWMuSWQ7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFNldFBvc0RlZmF1bHRzKEFueUJpdG1hcCBpbWFnZSkKLSAgICAgICAgewotICAgICAgICAgICAgRWRpdEFzID0gZUVkaXRBcy5PbmVDZWxsOwotICAgICAgICAgICAgU2V0UGl4ZWxXaWR0aChpbWFnZS5XaWR0aCwgKGZsb2F0KWltYWdlLkhvcml6b250YWxSZXNvbHV0aW9uLlZhbHVlKTsKLSAgICAgICAgICAgIFNldFBpeGVsSGVpZ2h0KGltYWdlLkhlaWdodCwgKGZsb2F0KWltYWdlLlZlcnRpY2FsUmVzb2x1dGlvbi5WYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0cmluZyBQaWNTdGFydFhtbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgeG1sID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICAgICAgeG1sLkFwcGVuZCgiPHhkcjpudlBpY1ByPiIpOwotCi0gICAgICAgICAgICBpZiAoX2h5cGVybGluayA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhtbC5BcHBlbmRGb3JtYXQoIjx4ZHI6Y052UHIgaWQ9XCJ7MH1cIiBkZXNjcj1cIlwiIC8+IiwgX2lkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIEh5cFJlbCA9IF9kcmF3aW5ncy5QYXJ0LkNyZWF0ZVJlbGF0aW9uc2hpcChfaHlwZXJsaW5rLCBQYWNrYWdpbmcuVGFyZ2V0TW9kZS5FeHRlcm5hbCwgRXhjZWxQYWNrYWdlLnNjaGVtYUh5cGVybGluayk7Ci0gICAgICAgICAgICAgICB4bWwuQXBwZW5kRm9ybWF0KCI8eGRyOmNOdlByIGlkPVwiezB9XCIgZGVzY3I9XCJcIj4iLCBfaWQpOwotICAgICAgICAgICAgICAgaWYgKEh5cFJlbCAhPSBudWxsKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIGlmIChfaHlwZXJsaW5rIGlzIEV4Y2VsSHlwZXJMaW5rKQotICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sLkFwcGVuZEZvcm1hdCgiPGE6aGxpbmtDbGljayB4bWxuczpyPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwc1wiIHI6aWQ9XCJ7MH1cIiB0b29sdGlwPVwiezF9XCIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSHlwUmVsLklkLCAoKEV4Y2VsSHlwZXJMaW5rKV9oeXBlcmxpbmspLlRvb2xUaXApOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICB4bWwuQXBwZW5kRm9ybWF0KCI8YTpobGlua0NsaWNrIHhtbG5zOnI9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzXCIgcjppZD1cInswfVwiIC8+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBIeXBSZWwuSWQpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIHhtbC5BcHBlbmQoIjwveGRyOmNOdlByPiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB4bWwuQXBwZW5kKCI8eGRyOmNOdlBpY1ByPjxhOnBpY0xvY2tzIG5vQ2hhbmdlQXNwZWN0PVwiMVwiIC8+PC94ZHI6Y052UGljUHI+PC94ZHI6bnZQaWNQcj48eGRyOmJsaXBGaWxsPjxhOmJsaXAgeG1sbnM6cj1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHNcIiByOmVtYmVkPVwiXCIgY3N0YXRlPVwicHJpbnRcIiAvPjxhOnN0cmV0Y2g+PGE6ZmlsbFJlY3QgLz4gPC9hOnN0cmV0Y2g+IDwveGRyOmJsaXBGaWxsPiA8eGRyOnNwUHI+IDxhOnhmcm0+IDxhOm9mZiB4PVwiMFwiIHk9XCIwXCIgLz4gIDxhOmV4dCBjeD1cIjBcIiBjeT1cIjBcIiAvPiA8L2E6eGZybT4gPGE6cHJzdEdlb20gcHJzdD1cInJlY3RcIj4gPGE6YXZMc3QgLz4gPC9hOnByc3RHZW9tPiA8L3hkcjpzcFByPiIpOwotCi0gICAgICAgICAgICByZXR1cm4geG1sLlRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCBzdHJpbmcgSW1hZ2VIYXNoIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgQW55Qml0bWFwIF9pbWFnZSA9IG51bGw7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBJbWFnZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgQW55Qml0bWFwIEltYWdlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfaW1hZ2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9pbWFnZSA9IHZhbHVlOwotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHJlbElEID0gU2F2ZVBpY3R1cmUodmFsdWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvL0NyZWF0ZSByZWxhdGlvbnNoaXAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgieGRyOnBpYy94ZHI6YmxpcEZpbGwvYTpibGlwL0ByOmVtYmVkIiwgTmFtZVNwYWNlTWFuYWdlcikuVmFsdWUgPSByZWxJRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vX2ltYWdlLlNhdmUoUGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLldyaXRlKSwgX2ltYWdlRm9ybWF0KTsgICAvL0Fsd2F5cyBKUEVHIGhlcmUgYXQgdGhpcyBwb2ludC4KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaChFeGNlcHRpb24gZXgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93KG5ldyBFeGNlcHRpb24oIkNhbid0IHNhdmUgaW1hZ2UgLSAiICsgZXguTWVzc2FnZSwgZXgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBBbnlCaXRtYXAuSW1hZ2VGb3JtYXQgX2ltYWdlRm9ybWF0PUFueUJpdG1hcC5JbWFnZUZvcm1hdC5KcGVnOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJbWFnZSBmb3JtYXQKLSAgICAgICAgLy8vIElmIHRoZSBwaWN0dXJlIGlzIGNyZWF0ZWQgZnJvbSBhbiBJbWFnZSB0aGlzIHR5cGUgaXMgYWx3YXlzIEpwZWcKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEFueUJpdG1hcC5JbWFnZUZvcm1hdCBJbWFnZUZvcm1hdAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2ltYWdlRm9ybWF0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50ZXJuYWwgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2ltYWdlRm9ybWF0ID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgc3RyaW5nIENvbnRlbnRUeXBlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIHNldDsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTZXQgdGhlIHNpemUgb2YgdGhlIGltYWdlIGluIHBlcmNlbnQgZnJvbSB0aGUgb3JnaW5hbCBzaXplCi0gICAgICAgIC8vLyBOb3RlIHRoYXQgcmVzaXppbmcgY29sdW1ucyAvIHJvd3MgYWZ0ZXIgdXNpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIGVmZmVjdCB0aGUgc2l6ZSBvZiB0aGUgcGljdHVyZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlBlcmNlbnQiPlBlcmNlbnQ8L3BhcmFtPgotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXRTaXplKGludCBQZXJjZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihJbWFnZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJhc2UuU2V0U2l6ZShQZXJjZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgd2lkdGggPSBJbWFnZS5XaWR0aDsKLSAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gSW1hZ2UuSGVpZ2h0OwotCi0gICAgICAgICAgICAgICAgd2lkdGggPSAoaW50KSh3aWR0aCAqICgoZGVjaW1hbClQZXJjZW50IC8gMTAwKSk7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0ID0gKGludCkoaGVpZ2h0ICogKChkZWNpbWFsKVBlcmNlbnQgLyAxMDApKTsKLQotICAgICAgICAgICAgICAgIFNldFBpeGVsV2lkdGgod2lkdGgsIChmbG9hdClJbWFnZS5Ib3Jpem9udGFsUmVzb2x1dGlvbi5WYWx1ZSk7Ci0gICAgICAgICAgICAgICAgU2V0UGl4ZWxIZWlnaHQoaGVpZ2h0LCAoZmxvYXQpSW1hZ2UuVmVydGljYWxSZXNvbHV0aW9uLlZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBVcmkgVXJpUGljIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgaW50ZXJuYWwgUGFja2FnaW5nLlppcFBhY2thZ2VSZWxhdGlvbnNoaXAgUmVsUGljIHtnZXQ7IHNldDt9Ci0gICAgICAgIGludGVybmFsIFBhY2thZ2luZy5aaXBQYWNrYWdlUmVsYXRpb25zaGlwIEh5cFJlbCB7IGdldDsgc2V0OyB9Ci0gICAgICAgIGludGVybmFsIFBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCBQYXJ0OwotCi0gICAgICAgIGludGVybmFsIG5ldyBzdHJpbmcgSWQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIE5hbWU7IH0KLSAgICAgICAgfQotICAgICAgICBFeGNlbERyYXdpbmdGaWxsIF9maWxsID0gbnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRmlsbAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxEcmF3aW5nRmlsbCBGaWxsCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfZmlsbCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2ZpbGwgPSBuZXcgRXhjZWxEcmF3aW5nRmlsbChOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCAieGRyOnBpYy94ZHI6c3BQciIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX2ZpbGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRXhjZWxEcmF3aW5nQm9yZGVyIF9ib3JkZXIgPSBudWxsOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBCb3JkZXIKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsRHJhd2luZ0JvcmRlciBCb3JkZXIKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9ib3JkZXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9ib3JkZXIgPSBuZXcgRXhjZWxEcmF3aW5nQm9yZGVyKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsICJ4ZHI6cGljL3hkcjpzcFByL2E6bG4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9ib3JkZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFVyaSBfaHlwZXJsaW5rID0gbnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSHlwZXJsaW5rCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBVcmkgSHlwZXJsaW5rCi0gICAgICAgIHsKLSAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmV0dXJuIF9oeXBlcmxpbms7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSB2b2lkIERlbGV0ZU1lKCkKLSAgICAgICAgewotICAgICAgICAgICAgX2RyYXdpbmdzLl9wYWNrYWdlLlJlbW92ZUltYWdlKEltYWdlSGFzaCk7Ci0gICAgICAgICAgICBiYXNlLkRlbGV0ZU1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRGlzcG9zZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJhc2UuRGlzcG9zZSgpOwotICAgICAgICAgICAgX2h5cGVybGluayA9IG51bGw7Ci0gICAgICAgICAgICBfaW1hZ2UuRGlzcG9zZSgpOwotICAgICAgICAgICAgX2ltYWdlID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL0V4Y2VsU2hhcGUuY3MgYi9FUFBsdXMvRHJhd2luZy9FeGNlbFNoYXBlLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGM4MzY5Li4wMDAwMDAwCi0tLSBhL0VQUGx1cy9EcmF3aW5nL0V4Y2VsU2hhcGUuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw1NTMgKzAsMCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCi0gKgotICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KLSAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKLSAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAotICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAotICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KLSAqCi0gKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAotICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKLSAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uWG1sOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZS5YbWxBY2Nlc3M7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRyYXdpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlOwotLy8vIDxzdW1tYXJ5PgotLy8vIFNoYXBlIHN0eWxlCi0vLy8gPC9zdW1tYXJ5PgotcHVibGljIGVudW0gZVNoYXBlU3R5bGUKLXsKLSAgICBBY2NlbnRCb3JkZXJDYWxsb3V0MSwKLSAgICBBY2NlbnRCb3JkZXJDYWxsb3V0MiwKLSAgICBBY2NlbnRCb3JkZXJDYWxsb3V0MywKLSAgICBBY2NlbnRDYWxsb3V0MSwKLSAgICBBY2NlbnRDYWxsb3V0MiwKLSAgICBBY2NlbnRDYWxsb3V0MywKLSAgICBBY3Rpb25CdXR0b25CYWNrUHJldmlvdXMsCi0gICAgQWN0aW9uQnV0dG9uQmVnaW5uaW5nLAotICAgIEFjdGlvbkJ1dHRvbkJsYW5rLAotICAgIEFjdGlvbkJ1dHRvbkRvY3VtZW50LAotICAgIEFjdGlvbkJ1dHRvbkVuZCwKLSAgICBBY3Rpb25CdXR0b25Gb3J3YXJkTmV4dCwKLSAgICBBY3Rpb25CdXR0b25IZWxwLAotICAgIEFjdGlvbkJ1dHRvbkhvbWUsCi0gICAgQWN0aW9uQnV0dG9uSW5mb3JtYXRpb24sCi0gICAgQWN0aW9uQnV0dG9uTW92aWUsCi0gICAgQWN0aW9uQnV0dG9uUmV0dXJuLAotICAgIEFjdGlvbkJ1dHRvblNvdW5kLAotICAgIEFyYywKLSAgICBCZW50QXJyb3csCi0gICAgQmVudENvbm5lY3RvcjIsCi0gICAgQmVudENvbm5lY3RvcjMsCi0gICAgQmVudENvbm5lY3RvcjQsCi0gICAgQmVudENvbm5lY3RvcjUsCi0gICAgQmVudFVwQXJyb3csCi0gICAgQmV2ZWwsCi0gICAgQmxvY2tBcmMsCi0gICAgQm9yZGVyQ2FsbG91dDEsCi0gICAgQm9yZGVyQ2FsbG91dDIsCi0gICAgQm9yZGVyQ2FsbG91dDMsCi0gICAgQnJhY2VQYWlyLAotICAgIEJyYWNrZXRQYWlyLAotICAgIENhbGxvdXQxLAotICAgIENhbGxvdXQyLAotICAgIENhbGxvdXQzLAotICAgIENhbiwKLSAgICBDaGFydFBsdXMsCi0gICAgQ2hhcnRTdGFyLAotICAgIENoYXJ0WCwKLSAgICBDaGV2cm9uLAotICAgIENob3JkLAotICAgIENpcmN1bGFyQXJyb3csCi0gICAgQ2xvdWQsCi0gICAgQ2xvdWRDYWxsb3V0LAotICAgIENvcm5lciwKLSAgICBDb3JuZXJUYWJzLAotICAgIEN1YmUsCi0gICAgQ3VydmVkQ29ubmVjdG9yMiwKLSAgICBDdXJ2ZWRDb25uZWN0b3IzLAotICAgIEN1cnZlZENvbm5lY3RvcjQsCi0gICAgQ3VydmVkQ29ubmVjdG9yNSwKLSAgICBDdXJ2ZWREb3duQXJyb3csCi0gICAgQ3VydmVkTGVmdEFycm93LAotICAgIEN1cnZlZFJpZ2h0QXJyb3csCi0gICAgQ3VydmVkVXBBcnJvdywKLSAgICBEZWNhZ29uLAotICAgIERpYWdTdHJpcGUsCi0gICAgRGlhbW9uZCwKLSAgICBEb2RlY2Fnb24sCi0gICAgRG9udXQsCi0gICAgRG91YmxlV2F2ZSwKLSAgICBEb3duQXJyb3csCi0gICAgRG93bkFycm93Q2FsbG91dCwKLSAgICBFbGxpcHNlLAotICAgIEVsbGlwc2VSaWJib24sCi0gICAgRWxsaXBzZVJpYmJvbjIsCi0gICAgRmxvd0NoYXJ0QWx0ZXJuYXRlUHJvY2VzcywKLSAgICBGbG93Q2hhcnRDb2xsYXRlLAotICAgIEZsb3dDaGFydENvbm5lY3RvciwKLSAgICBGbG93Q2hhcnREZWNpc2lvbiwKLSAgICBGbG93Q2hhcnREZWxheSwKLSAgICBGbG93Q2hhcnREaXNwbGF5LAotICAgIEZsb3dDaGFydERvY3VtZW50LAotICAgIEZsb3dDaGFydEV4dHJhY3QsCi0gICAgRmxvd0NoYXJ0SW5wdXRPdXRwdXQsCi0gICAgRmxvd0NoYXJ0SW50ZXJuYWxTdG9yYWdlLAotICAgIEZsb3dDaGFydE1hZ25ldGljRGlzaywKLSAgICBGbG93Q2hhcnRNYWduZXRpY0RydW0sCi0gICAgRmxvd0NoYXJ0TWFnbmV0aWNUYXBlLAotICAgIEZsb3dDaGFydE1hbnVhbElucHV0LAotICAgIEZsb3dDaGFydE1hbnVhbE9wZXJhdGlvbiwKLSAgICBGbG93Q2hhcnRNZXJnZSwKLSAgICBGbG93Q2hhcnRNdWx0aWRvY3VtZW50LAotICAgIEZsb3dDaGFydE9mZmxpbmVTdG9yYWdlLAotICAgIEZsb3dDaGFydE9mZnBhZ2VDb25uZWN0b3IsCi0gICAgRmxvd0NoYXJ0T25saW5lU3RvcmFnZSwKLSAgICBGbG93Q2hhcnRPciwKLSAgICBGbG93Q2hhcnRQcmVkZWZpbmVkUHJvY2VzcywKLSAgICBGbG93Q2hhcnRQcmVwYXJhdGlvbiwKLSAgICBGbG93Q2hhcnRQcm9jZXNzLAotICAgIEZsb3dDaGFydFB1bmNoZWRDYXJkLAotICAgIEZsb3dDaGFydFB1bmNoZWRUYXBlLAotICAgIEZsb3dDaGFydFNvcnQsCi0gICAgRmxvd0NoYXJ0U3VtbWluZ0p1bmN0aW9uLAotICAgIEZsb3dDaGFydFRlcm1pbmF0b3IsCi0gICAgRm9sZGVkQ29ybmVyLAotICAgIEZyYW1lLAotICAgIEZ1bm5lbCwKLSAgICBHZWFyNiwKLSAgICBHZWFyOSwKLSAgICBIYWxmRnJhbWUsCi0gICAgSGVhcnQsCi0gICAgSGVwdGFnb24sCi0gICAgSGV4YWdvbiwKLSAgICBIb21lUGxhdGUsCi0gICAgSG9yaXpvbnRhbFNjcm9sbCwKLSAgICBJcnJlZ3VsYXJTZWFsMSwKLSAgICBJcnJlZ3VsYXJTZWFsMiwKLSAgICBMZWZ0QXJyb3csCi0gICAgTGVmdEFycm93Q2FsbG91dCwKLSAgICBMZWZ0QnJhY2UsCi0gICAgTGVmdEJyYWNrZXQsCi0gICAgTGVmdENpcmN1bGFyQXJyb3csCi0gICAgTGVmdFJpZ2h0QXJyb3csCi0gICAgTGVmdFJpZ2h0QXJyb3dDYWxsb3V0LAotICAgIExlZnRSaWdodENpcmN1bGFyQXJyb3csCi0gICAgTGVmdFJpZ2h0UmliYm9uLAotICAgIExlZnRSaWdodFVwQXJyb3csCi0gICAgTGVmdFVwQXJyb3csCi0gICAgTGlnaHRuaW5nQm9sdCwKLSAgICBMaW5lLAotICAgIExpbmVJbnYsCi0gICAgTWF0aERpdmlkZSwKLSAgICBNYXRoRXF1YWwsCi0gICAgTWF0aE1pbnVzLAotICAgIE1hdGhNdWx0aXBseSwKLSAgICBNYXRoTm90RXF1YWwsCi0gICAgTWF0aFBsdXMsCi0gICAgTW9vbiwKLSAgICBOb25Jc29zY2VsZXNUcmFwZXpvaWQsCi0gICAgTm9TbW9raW5nLAotICAgIE5vdGNoZWRSaWdodEFycm93LAotICAgIE9jdGFnb24sCi0gICAgUGFyYWxsZWxvZ3JhbSwKLSAgICBQZW50YWdvbiwKLSAgICBQaWUsCi0gICAgUGllV2VkZ2UsCi0gICAgUGxhcXVlLAotICAgIFBsYXF1ZVRhYnMsCi0gICAgUGx1cywKLSAgICBRdWFkQXJyb3csCi0gICAgUXVhZEFycm93Q2FsbG91dCwKLSAgICBSZWN0LAotICAgIFJpYmJvbiwKLSAgICBSaWJib24yLAotICAgIFJpZ2h0QXJyb3csCi0gICAgUmlnaHRBcnJvd0NhbGxvdXQsCi0gICAgUmlnaHRCcmFjZSwKLSAgICBSaWdodEJyYWNrZXQsCi0gICAgUm91bmQxUmVjdCwKLSAgICBSb3VuZDJEaWFnUmVjdCwKLSAgICBSb3VuZDJTYW1lUmVjdCwKLSAgICBSb3VuZFJlY3QsCi0gICAgUnRUcmlhbmdsZSwKLSAgICBTbWlsZXlGYWNlLAotICAgIFNuaXAxUmVjdCwKLSAgICBTbmlwMkRpYWdSZWN0LAotICAgIFNuaXAyU2FtZVJlY3QsCi0gICAgU25pcFJvdW5kUmVjdCwKLSAgICBTcXVhcmVUYWJzLAotICAgIFN0YXIxMCwKLSAgICBTdGFyMTIsCi0gICAgU3RhcjE2LAotICAgIFN0YXIyNCwKLSAgICBTdGFyMzIsCi0gICAgU3RhcjQsCi0gICAgU3RhcjUsCi0gICAgU3RhcjYsCi0gICAgU3RhcjcsCi0gICAgU3RhcjgsCi0gICAgU3RyYWlnaHRDb25uZWN0b3IxLAotICAgIFN0cmlwZWRSaWdodEFycm93LAotICAgIFN1biwKLSAgICBTd29vc2hBcnJvdywKLSAgICBUZWFyZHJvcCwKLSAgICBUcmFwZXpvaWQsCi0gICAgVHJpYW5nbGUsCi0gICAgVXBBcnJvdywKLSAgICBVcEFycm93Q2FsbG91dCwKLSAgICBVcERvd25BcnJvdywKLSAgICBVcERvd25BcnJvd0NhbGxvdXQsCi0gICAgVXR1cm5BcnJvdywKLSAgICBXYXZlLAotICAgIFdlZGdlRWxsaXBzZUNhbGxvdXQsCi0gICAgV2VkZ2VSZWN0Q2FsbG91dCwKLSAgICBXZWRnZVJvdW5kUmVjdENhbGxvdXQsCi0gICAgVmVydGljYWxTY3JvbGwKLX0KLS8vLyA8c3VtbWFyeT4KLS8vLyBUZXh0IGFsaWdubWVudAotLy8vIDwvc3VtbWFyeT4KLXB1YmxpYyBlbnVtIGVUZXh0QWxpZ25tZW50Ci17Ci0gICAgTGVmdCwKLSAgICBDZW50ZXIsCi0gICAgUmlnaHQsCi0gICAgRGlzdHJpYnV0ZWQsCi0gICAgSnVzdGlmaWVkLAotICAgIEp1c3RpZmllZExvdywKLSAgICBUaGFpRGlzdHJpYnV0ZWQKLX0KLS8vLyA8c3VtbWFyeT4KLS8vLyBGaWxsc3R5bGUuCi0vLy8gPC9zdW1tYXJ5PgotcHVibGljIGVudW0gZUZpbGxTdHlsZQotewotICAgIE5vRmlsbCwKLSAgICBTb2xpZEZpbGwsCi0gICAgR3JhZGllbnRGaWxsLAotICAgIFBhdHRlcm5GaWxsLAotICAgIEJsaXBGaWxsLAotICAgIEdyb3VwRmlsbAotfQotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZwotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQW4gRXhjZWwgc2hhcGUuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsU2hhcGUgOiBFeGNlbERyYXdpbmcKLSAgICB7Ci0gICAgICAgIGludGVybmFsIEV4Y2VsU2hhcGUoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlKSA6Ci0gICAgICAgICAgICBiYXNlKGRyYXdpbmdzLCBub2RlLCAieGRyOnNwL3hkcjpudlNwUHIveGRyOmNOdlByL0BuYW1lIikKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIEV4Y2VsU2hhcGUoRXhjZWxEcmF3aW5ncyBkcmF3aW5ncywgWG1sTm9kZSBub2RlLCBlU2hhcGVTdHlsZSBzdHlsZSkgOgotICAgICAgICAgICAgYmFzZShkcmF3aW5ncywgbm9kZSwgInhkcjpzcC94ZHI6bnZTcFByL3hkcjpjTnZQci9AbmFtZSIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgICAgIFhtbEVsZW1lbnQgc2hhcGVOb2RlID0gbm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoInhkciIsICJzcCIsIEV4Y2VsUGFja2FnZS5zY2hlbWFTaGVldERyYXdpbmdzKTsKLSAgICAgICAgICAgIHNoYXBlTm9kZS5TZXRBdHRyaWJ1dGUoIm1hY3JvIiwgIiIpOwotICAgICAgICAgICAgc2hhcGVOb2RlLlNldEF0dHJpYnV0ZSgidGV4dGxpbmsiLCAiIik7Ci0gICAgICAgICAgICBub2RlLkFwcGVuZENoaWxkKHNoYXBlTm9kZSk7Ci0KLSAgICAgICAgICAgIHNoYXBlTm9kZS5Jbm5lclhtbCA9IFNoYXBlU3RhcnRYbWwoKTsKLSAgICAgICAgICAgIG5vZGUuQXBwZW5kQ2hpbGQoc2hhcGVOb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgieGRyIiwgImNsaWVudERhdGEiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hU2hlZXREcmF3aW5ncykpOwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgdm9pZCBpbml0KCkKLSAgICAgICAgewotICAgICAgICAgICAgU2NoZW1hTm9kZU9yZGVyID0gbmV3IHN0cmluZ1tdIHsgInByc3RHZW9tIiwgImxuIiwgInBQciIsICJkZWZSUHIiLCAic29saWRGaWxsIiwgInVGaWxsIiwgImxhdGluIiwgImNzIiwgInIiLCAiclByIiwgInQiIH07Ci0gICAgICAgIH0KLSAgICAgICAgI3JlZ2lvbiAicHVibGljIG1ldGhvZHMiCi0gICAgICAgIGNvbnN0IHN0cmluZyBTaGFwZVN0eWxlUGF0aCA9ICJ4ZHI6c3AveGRyOnNwUHIvYTpwcnN0R2VvbS9AcHJzdCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNoYXBlIHN0eWxlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBlU2hhcGVTdHlsZSBTdHlsZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcgdiA9IEdldFhtbE5vZGVTdHJpbmcoU2hhcGVTdHlsZVBhdGgpOwotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlU2hhcGVTdHlsZSlFbnVtLlBhcnNlKHR5cGVvZihlU2hhcGVTdHlsZSksIHYsIHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiSW52YWxpZCBzaGFwZXR5cGUgezB9IiwgdikpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcgdiA9IHZhbHVlLlRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgdiA9IHYuU3Vic3RyaW5nKDAsIDEpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkgKyB2LlN1YnN0cmluZygxLCB2Lkxlbmd0aCAtIDEpOwotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoU2hhcGVTdHlsZVBhdGgsIHYpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEV4Y2VsRHJhd2luZ0ZpbGwgX2ZpbGwgPSBudWxsOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBGaWxsCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbERyYXdpbmdGaWxsIEZpbGwKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9maWxsID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfZmlsbCA9IG5ldyBFeGNlbERyYXdpbmdGaWxsKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsICJ4ZHI6c3AveGRyOnNwUHIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9maWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEV4Y2VsRHJhd2luZ0JvcmRlciBfYm9yZGVyID0gbnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQm9yZGVyCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbERyYXdpbmdCb3JkZXIgQm9yZGVyICAgICAgICAKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9ib3JkZXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9ib3JkZXIgPSBuZXcgRXhjZWxEcmF3aW5nQm9yZGVyKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsICJ4ZHI6c3AveGRyOnNwUHIvYTpsbiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX2JvcmRlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzdHJpbmdbXSBwYXJhZ3JhcGhOb2RlT3JkZXIgPSBuZXcgc3RyaW5nW10geyAicFByIiwgImRlZlJQciIsICJzb2xpZEZpbGwiLCAidUZpbGwiLCAibGF0aW4iLCAiY3MiLCAiciIsICJyUHIiLCAidCIgfTsKLSAgICAgICAgY29uc3Qgc3RyaW5nIFBBUkFHUkFQSF9QQVRIID0gInhkcjpzcC94ZHI6dHhCb2R5L2E6cCI7Ci0gICAgICAgIEV4Y2VsVGV4dEZvbnQgX2ZvbnQ9bnVsbDsKLSAgICAgICAgcHVibGljIEV4Y2VsVGV4dEZvbnQgRm9udAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX2ZvbnQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbE5vZGUgbm9kZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShQQVJBR1JBUEhfUEFUSCwgTmFtZVNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmKG5vZGU9PW51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRleHQ9IiI7ICAgIC8vQ3JlYXRlcyB0aGUgbm9kZSBwIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoUEFSQUdSQVBIX1BBVEgsIE5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIF9mb250ID0gbmV3IEV4Y2VsVGV4dEZvbnQoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgInhkcjpzcC94ZHI6dHhCb2R5L2E6cC9hOnBQci9hOmRlZlJQciIsIHBhcmFncmFwaE5vZGVPcmRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfZm9udDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgVGV4dFBhdGggPSAieGRyOnNwL3hkcjp0eEJvZHkvYTpwL2E6ci9hOnQiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUZXh0IGluc2lkZSB0aGUgc2hhcGUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBUZXh0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKFRleHRQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoVGV4dFBhdGgsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIHN0cmluZyBsb2NrVGV4dFBhdGggPSAieGRyOnNwL0BmTG9ja3NUZXh0IjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTG9jayBkcmF3aW5nCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIExvY2tUZXh0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChsb2NrVGV4dFBhdGgsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2wobG9ja1RleHRQYXRoLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRXhjZWxQYXJhZ3JhcGhDb2xsZWN0aW9uIF9yaWNoVGV4dCA9IG51bGw7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJpY2h0ZXh0IGNvbGxlY3Rpb24uIFVzZWQgdG8gZm9ybWF0IHNwZWNpZmljIHBhcnRzIG9mIHRoZSB0ZXh0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFBhcmFncmFwaENvbGxlY3Rpb24gUmljaFRleHQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9yaWNoVGV4dCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy9YbWxOb2RlIG5vZGU9VG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKFBBUkFHUkFQSF9QQVRILCBOYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICAgICAgLy9pZiAobm9kZSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAvL3sKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgQ3JlYXRlTm9kZShQQVJBR1JBUEhfUEFUSCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vfQotICAgICAgICAgICAgICAgICAgICAgICAgX3JpY2hUZXh0ID0gbmV3IEV4Y2VsUGFyYWdyYXBoQ29sbGVjdGlvbihOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBQQVJBR1JBUEhfUEFUSCwgcGFyYWdyYXBoTm9kZU9yZGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9yaWNoVGV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgVGV4dEFuY2hvcmluZ1BhdGggPSAieGRyOnNwL3hkcjp0eEJvZHkvYTpib2R5UHIvQGFuY2hvciI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRleHQgQW5jaG9yaW5nCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBlVGV4dEFuY2hvcmluZ1R5cGUgVGV4dEFuY2hvcmluZwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0VGV4dEFjaG9yaW5nRW51bShHZXRYbWxOb2RlU3RyaW5nKFRleHRBbmNob3JpbmdQYXRoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFRleHRBbmNob3JpbmdQYXRoLCBHZXRUZXh0QWNob3JpbmdUZXh0KHZhbHVlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIFRleHRBbmNob3JpbmdDdGxQYXRoID0gInhkcjpzcC94ZHI6dHhCb2R5L2E6Ym9keVByL0BhbmNob3JDdHIiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTcGVjaWZpZXMgdGhlIGNlbnRlcmluZyBvZiB0aGUgdGV4dCBib3guCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIFRleHRBbmNob3JpbmdDb250cm9sCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChUZXh0QW5jaG9yaW5nQ3RsUGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFRleHRBbmNob3JpbmdDdGxQYXRoLCAiMSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFRleHRBbmNob3JpbmdDdGxQYXRoLCAiMCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgVEVYVF9BTElHTl9QQVRIID0gInhkcjpzcC94ZHI6dHhCb2R5L2E6cC9hOnBQci9AYWxnbiI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEhvdyB0aGUgdGV4dCBpcyBhbGlnbmVkCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBlVGV4dEFsaWdubWVudCBUZXh0QWxpZ25tZW50Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgc3dpdGNoKEdldFhtbE5vZGVTdHJpbmcoVEVYVF9BTElHTl9QQVRIKSkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBjYXNlICJjdHIiOgotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVRleHRBbGlnbm1lbnQuQ2VudGVyOwotICAgICAgICAgICAgICAgICAgIGNhc2UgInIiOgotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVRleHRBbGlnbm1lbnQuUmlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgY2FzZSAiZGlzdCI6Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlVGV4dEFsaWdubWVudC5EaXN0cmlidXRlZDsKLSAgICAgICAgICAgICAgICAgICBjYXNlICJqdXN0IjoKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVUZXh0QWxpZ25tZW50Lkp1c3RpZmllZDsKLSAgICAgICAgICAgICAgICAgICBjYXNlICJqdXN0TG93IjoKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVUZXh0QWxpZ25tZW50Lkp1c3RpZmllZExvdzsKLSAgICAgICAgICAgICAgICAgICBjYXNlICJ0aGFpRGlzdCI6Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlVGV4dEFsaWdubWVudC5UaGFpRGlzdHJpYnV0ZWQ7Ci0gICAgICAgICAgICAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlVGV4dEFsaWdubWVudC5MZWZ0OwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoICh2YWx1ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgZVRleHRBbGlnbm1lbnQuUmlnaHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFRFWFRfQUxJR05fUEFUSCwgInIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIGVUZXh0QWxpZ25tZW50LkNlbnRlcjoKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoVEVYVF9BTElHTl9QQVRILCAiY3RyIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBlVGV4dEFsaWdubWVudC5EaXN0cmlidXRlZDoKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoVEVYVF9BTElHTl9QQVRILCAiZGlzdCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgZVRleHRBbGlnbm1lbnQuSnVzdGlmaWVkOgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhURVhUX0FMSUdOX1BBVEgsICJqdXN0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBlVGV4dEFsaWdubWVudC5KdXN0aWZpZWRMb3c6Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFRFWFRfQUxJR05fUEFUSCwgImp1c3RMb3ciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIGVUZXh0QWxpZ25tZW50LlRoYWlEaXN0cmlidXRlZDoKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoVEVYVF9BTElHTl9QQVRILCAidGhhaURpc3QiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlTm9kZShURVhUX0FMSUdOX1BBVEgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgSU5ERU5UX0FMSUdOX1BBVEggPSAieGRyOnNwL3hkcjp0eEJvZHkvYTpwL2E6cFByL0BsdmwiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJbmRlbnRhdGlvbgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50IEluZGVudAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludChJTkRFTlRfQUxJR05fUEFUSCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gOCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93KG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIkluZGVudCBsZXZlbCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgOCIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhJTkRFTlRfQUxJR05fUEFUSCwgdmFsdWUuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIFRleHRWZXJ0aWNhbFBhdGggPSAieGRyOnNwL3hkcjp0eEJvZHkvYTpib2R5UHIvQHZlcnQiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBWZXJ0aWNhbCB0ZXh0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBlVGV4dFZlcnRpY2FsVHlwZSBUZXh0VmVydGljYWwKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFRleHRWZXJ0aWNhbEVudW0oR2V0WG1sTm9kZVN0cmluZyhUZXh0VmVydGljYWxQYXRoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFRleHRWZXJ0aWNhbFBhdGgsIEdldFRleHRWZXJ0aWNhbFRleHQodmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgICNlbmRyZWdpb24KLSAgICAgICAgI3JlZ2lvbiAiUHJpdmF0ZSBNZXRob2RzIgotICAgICAgICBwcml2YXRlIHN0cmluZyBTaGFwZVN0YXJ0WG1sKCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciB4bWwgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgeG1sLkFwcGVuZEZvcm1hdCgiPHhkcjpudlNwUHI+PHhkcjpjTnZQciBpZD1cInswfVwiIG5hbWU9XCJ7MX1cIiAvPjx4ZHI6Y052U3BQciAvPjwveGRyOm52U3BQcj48eGRyOnNwUHI+PGE6cHJzdEdlb20gcHJzdD1cInJlY3RcIj48YTphdkxzdCAvPjwvYTpwcnN0R2VvbT48L3hkcjpzcFByPjx4ZHI6c3R5bGU+PGE6bG5SZWYgaWR4PVwiMlwiPjxhOnNjaGVtZUNsciB2YWw9XCJhY2NlbnQxXCI+PGE6c2hhZGUgdmFsPVwiNTAwMDBcIiAvPjwvYTpzY2hlbWVDbHI+PC9hOmxuUmVmPjxhOmZpbGxSZWYgaWR4PVwiMVwiPjxhOnNjaGVtZUNsciB2YWw9XCJhY2NlbnQxXCIgLz48L2E6ZmlsbFJlZj48YTplZmZlY3RSZWYgaWR4PVwiMFwiPjxhOnNjaGVtZUNsciB2YWw9XCJhY2NlbnQxXCIgLz48L2E6ZWZmZWN0UmVmPjxhOmZvbnRSZWYgaWR4PVwibWlub3JcIj48YTpzY2hlbWVDbHIgdmFsPVwibHQxXCIgLz48L2E6Zm9udFJlZj48L3hkcjpzdHlsZT48eGRyOnR4Qm9keT48YTpib2R5UHIgdmVydE92ZXJmbG93PVwiY2xpcFwiIHJ0bENvbD1cIjBcIiBhbmNob3I9XCJjdHJcIiAvPjxhOmxzdFN0eWxlIC8+PGE6cD48L2E6cD48L3hkcjp0eEJvZHk+IiwgX2lkLCBOYW1lKTsKLSAgICAgICAgICAgIHJldHVybiB4bWwuVG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uCi0gICAgICAgIGludGVybmFsIG5ldyBzdHJpbmcgSWQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIE5hbWUgKyBUZXh0OyB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9FeGNlbFZpZXczRC5jcyBiL0VQUGx1cy9EcmF3aW5nL0V4Y2VsVmlldzNELmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTQ3ZjlmLi4wMDAwMDAwCi0tLSBhL0VQUGx1cy9EcmF3aW5nL0V4Y2VsVmlldzNELmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQotICoKLSAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCi0gKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCi0gKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKLSAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKLSAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCi0gKgotICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKLSAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCi0gKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5YbWw7Ci11c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKLQotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZwotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gM0Qgc2V0dGluZ3MKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxWaWV3M0QgOiBYbWxIZWxwZXIKLSAgICB7Ci0gICAgICAgaW50ZXJuYWwgRXhjZWxWaWV3M0QoWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSBub2RlKQotICAgICAgICAgICA6IGJhc2UobnMsbm9kZSkKLSAgICAgICB7Ci0gICAgICAgICAgIFNjaGVtYU5vZGVPcmRlciA9IG5ldyBzdHJpbmdbXSB7ICJyb3RYIiwgImhQZXJjZW50IiwgInJvdFkiLCAiZGVwdGhQZXJjZW50IiwickFuZ0F4IiwgInBlcnNwZWN0aXZlIn07Ci0gICAgICAgfQotICAgICAgIGNvbnN0IHN0cmluZyBwZXJzcGVjdGl2ZVBhdGggPSAiYzpwZXJzcGVjdGl2ZS9AdmFsIjsKLSAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgLy8vIERlZ3JlZSBvZiBwZXJzcGVjdGl2ZSAKLSAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgIHB1YmxpYyBkZWNpbWFsIFBlcnNwZWN0aXZlCi0gICAgICAgewotICAgICAgICAgICBnZXQKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVJbnQocGVyc3BlY3RpdmVQYXRoKTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBzZXQKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhwZXJzcGVjdGl2ZVBhdGgsIHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICBjb25zdCBzdHJpbmcgcm90WFBhdGggPSAiYzpyb3RYL0B2YWwiOwotICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAvLy8gUm90YXRpb24gWC1heGlzCi0gICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICBwdWJsaWMgZGVjaW1hbCBSb3RYCi0gICAgICAgewotICAgICAgICAgICBnZXQKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVEZWNpbWFsKHJvdFhQYXRoKTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBzZXQKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgQ3JlYXRlTm9kZShyb3RYUGF0aCk7Ci0gICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKHJvdFhQYXRoLCB2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgY29uc3Qgc3RyaW5nIHJvdFlQYXRoID0gImM6cm90WS9AdmFsIjsKLSAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgLy8vIFJvdGF0aW9uIFktYXhpcwotICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgcHVibGljIGRlY2ltYWwgUm90WQotICAgICAgIHsKLSAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlRGVjaW1hbChyb3RZUGF0aCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgc2V0Ci0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIENyZWF0ZU5vZGUocm90WVBhdGgpOwotICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhyb3RZUGF0aCwgdmFsdWUuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIGNvbnN0IHN0cmluZyByQW5nQXhQYXRoID0gImM6ckFuZ0F4L0B2YWwiOwotICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAvLy8gUmlnaHQgQW5nbGUgQXhlcwotICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgcHVibGljIGJvb2wgUmlnaHRBbmdsZUF4ZXMKLSAgICAgICB7Ci0gICAgICAgICAgIGdldAotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2wockFuZ0F4UGF0aCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgc2V0Ci0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKHJBbmdBeFBhdGgsIHZhbHVlKTsKLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICBjb25zdCBzdHJpbmcgZGVwdGhQZXJjZW50UGF0aCA9ICJjOmRlcHRoUGVyY2VudC9AdmFsIjsKLSAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgLy8vIERlcHRoICUgb2YgYmFzZQotICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgcHVibGljIGludCBEZXB0aFBlcmNlbnQKLSAgICAgICB7Ci0gICAgICAgICAgIGdldAotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludChkZXB0aFBlcmNlbnRQYXRoKTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBzZXQKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDIwMDApCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgdGhyb3cobmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiVmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDIwMDAiKSk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKGRlcHRoUGVyY2VudFBhdGgsIHZhbHVlLlRvU3RyaW5nKCkpOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIGNvbnN0IHN0cmluZyBoZWlnaHRQZXJjZW50UGF0aCA9ICJjOmhQZXJjZW50L0B2YWwiOwotICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAvLy8gSGVpZ2h0ICUgb2YgYmFzZQotICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgcHVibGljIGludCBIZWlnaHRQZXJjZW50Ci0gICAgICAgewotICAgICAgICAgICBnZXQKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVJbnQoaGVpZ2h0UGVyY2VudFBhdGgpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIHNldAotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAodmFsdWUgPCA1IHx8IHZhbHVlID4gNTAwKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJWYWx1ZSBtdXN0IGJlIGJldHdlZW4gNSBhbmQgNTAwIikpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhoZWlnaHRQZXJjZW50UGF0aCwgdmFsdWUuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvVm1sL0V4Y2VsVm1sRHJhd2luZ0Jhc2UuY3MgYi9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nQmFzZS5jcwppbmRleCA3YmE2ZWQyLi5jZWY0MWRjIDEwMDY0NAotLS0gYS9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nQmFzZS5jcworKysgYi9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nQmFzZS5jcwpAQCAtMjksMTIgKzI5LDggQEAKICAqIEphbiBLw6RsbG1hbgkJSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMTAtMDYtMDEKICAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5UZXh0OworCiB1c2luZyBTeXN0ZW0uWG1sOwotdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Ci11c2luZyBTeXN0ZW0uRHJhd2luZzsKIAogbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZy5WbWwKIHsKZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL1ZtbC9FeGNlbFZtbERyYXdpbmdCYXNlQ29sbGVjdGlvbi5jcyBiL0VQUGx1cy9EcmF3aW5nL1ZtbC9FeGNlbFZtbERyYXdpbmdCYXNlQ29sbGVjdGlvbi5jcwppbmRleCAzMjA3ZTM0Li41ZmEwZTgyIDEwMDY0NAotLS0gYS9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nQmFzZUNvbGxlY3Rpb24uY3MKKysrIGIvRVBQbHVzL0RyYXdpbmcvVm1sL0V4Y2VsVm1sRHJhd2luZ0Jhc2VDb2xsZWN0aW9uLmNzCkBAIC0zMCwxMCArMzAsNyBAQAogICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uWG1sOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwogCiBuYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLlZtbAogewpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvVm1sL0V4Y2VsVm1sRHJhd2luZ0NvbW1lbnQuY3MgYi9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nQ29tbWVudC5jcwppbmRleCAzNjZkMjZiLi4yNzBlYjI0IDEwMDY0NAotLS0gYS9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nQ29tbWVudC5jcworKysgYi9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nQ29tbWVudC5jcwpAQCAtMzAsOCArMzAsNiBAQAogICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uWG1sOwogdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247CiB1c2luZyBTeXN0ZW0uRHJhd2luZzsKZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL1ZtbC9FeGNlbFZtbERyYXdpbmdDb21tZW50Q29sbGVjdGlvbi5jcyBiL0VQUGx1cy9EcmF3aW5nL1ZtbC9FeGNlbFZtbERyYXdpbmdDb21tZW50Q29sbGVjdGlvbi5jcwppbmRleCA1ODkxZmYzLi4yN2FkZDk1IDEwMDY0NAotLS0gYS9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nQ29tbWVudENvbGxlY3Rpb24uY3MKKysrIGIvRVBQbHVzL0RyYXdpbmcvVm1sL0V4Y2VsVm1sRHJhd2luZ0NvbW1lbnRDb2xsZWN0aW9uLmNzCkBAIC0zMSw3ICszMSw2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uWG1sOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwogCmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nUGljdHVyZS5jcyBiL0VQUGx1cy9EcmF3aW5nL1ZtbC9FeGNlbFZtbERyYXdpbmdQaWN0dXJlLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDZhYjZiLi4wMDAwMDAwCi0tLSBhL0VQUGx1cy9EcmF3aW5nL1ZtbC9FeGNlbFZtbERyYXdpbmdQaWN0dXJlLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQotICoKLSAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCi0gKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCi0gKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKLSAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKLSAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCi0gKgotICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKLSAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEphbiBLw6RsbG1hbgkJSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMTAtMDYtMDEKLSAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlhtbDsKLXVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7Ci11c2luZyBJcm9uU29mdHdhcmUuRHJhd2luZzsKLQotCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLlZtbAotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gRHJhd2luZyBvYmplY3QgdXNlZCBmb3IgaGVhZGVyIGFuZCBmb290ZXIgcGljdHVyZXMKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbFZtbERyYXdpbmdQaWN0dXJlIDogRXhjZWxWbWxEcmF3aW5nQmFzZQotICAgIHsKLSAgICAgICAgRXhjZWxXb3Jrc2hlZXQgX3dvcmtzaGVldDsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxWbWxEcmF3aW5nUGljdHVyZShYbWxOb2RlIHRvcE5vZGUsIFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsIEV4Y2VsV29ya3NoZWV0IHdzKSA6Ci0gICAgICAgICAgICBiYXNlKHRvcE5vZGUsIG5zKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0ID0gd3M7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUG9zaXRpb24gSUQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBQb3NpdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZygiQGlkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIHdpZHRoIGluIHBvaW50cwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZG91YmxlIFdpZHRoCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRTdHlsZVByb3AoIndpZHRoIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRTdHlsZVByb3AoIndpZHRoIix2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSArICJwdCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBoZWlnaHQgaW4gcG9pbnRzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBkb3VibGUgSGVpZ2h0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRTdHlsZVByb3AoImhlaWdodCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0U3R5bGVQcm9wKCJoZWlnaHQiLCB2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSArICJwdCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE1hcmdpbiBMZWZ0IGluIHBvaW50cwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZG91YmxlIExlZnQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFN0eWxlUHJvcCgibGVmdCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0U3R5bGVQcm9wKCJsZWZ0IiwgdmFsdWUuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE1hcmdpbiB0b3AgaW4gcG9pbnRzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBkb3VibGUgVG9wCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRTdHlsZVByb3AoInRvcCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0U3R5bGVQcm9wKCJ0b3AiLCB2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIFRpdGxlIG9mIHRoZSBpbWFnZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIFRpdGxlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKCJ2OmltYWdlZGF0YS9Abzp0aXRsZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygidjppbWFnZWRhdGEvQG86dGl0bGUiLHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgaW1hZ2UKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEFueUJpdG1hcCBJbWFnZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgcGNrID0gX3dvcmtzaGVldC5fcGFja2FnZS5QYWNrYWdlOwotICAgICAgICAgICAgICAgIGlmIChwY2suUGFydEV4aXN0cyhJbWFnZVVyaSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgcGFydCA9IHBjay5HZXRQYXJ0KEltYWdlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFueUJpdG1hcC5Gcm9tU3RyZWFtKHBhcnQuR2V0U3RyZWFtKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgVXJpIEltYWdlVXJpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIHNldDsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBzdHJpbmcgUmVsSWQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoInY6aW1hZ2VkYXRhL0BvOnJlbGlkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJ2OmltYWdlZGF0YS9AbzpyZWxpZCIsdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGltYWdlIHdpbGwgYmUgZGlzcGxheWVkIGluIGJsYWNrIGFuZCB3aGl0ZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBCaUxldmVsCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKCJ2OmltYWdlZGF0YS9AYmlsZXZlbCIpPT0idCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJ2OmltYWdlZGF0YS9AYmlsZXZlbCIsICJ0Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERlbGV0ZU5vZGUoInY6aW1hZ2VkYXRhL0BiaWxldmVsIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIERldGVybWluZXMgd2hldGhlciBhIHBpY3R1cmUgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gZ3JheXNjYWxlIG1vZGUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgR3JheVNjYWxlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKCJ2OmltYWdlZGF0YS9AZ3JheXNjYWxlIik9PSJ0IjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoInY6aW1hZ2VkYXRhL0BncmF5c2NhbGUiLCAidCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEZWxldGVOb2RlKCJ2OmltYWdlZGF0YS9AZ3JheXNjYWxlIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIERlZmluZXMgdGhlIGludGVuc2l0eSBvZiBhbGwgY29sb3JzIGluIGFuIGltYWdlCi0gICAgICAgIC8vLyBEZWZhdWx0IHZhbHVlIGlzIDEKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGRvdWJsZSBHYWluCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmluZyB2ID0gR2V0WG1sTm9kZVN0cmluZygidjppbWFnZWRhdGEvQGdhaW4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0RnJhY0RUKHYsMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIlZhbHVlIG11c3QgYmUgcG9zaXRpdmUiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRGVsZXRlTm9kZSgidjppbWFnZWRhdGEvQGdhbW1hIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoInY6aW1hZ2VkYXRhL0BnYWluIiwgdmFsdWUuVG9TdHJpbmcoIiMuMCMiLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIERlZmluZXMgdGhlIGFtb3VudCBvZiBjb250cmFzdCBmb3IgYW4gaW1hZ2UKLSAgICAgICAgLy8vIERlZmF1bHQgdmFsdWUgaXMgMDsKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGRvdWJsZSBHYW1tYQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcgdiA9IEdldFhtbE5vZGVTdHJpbmcoInY6aW1hZ2VkYXRhL0BnYW1tYSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBHZXRGcmFjRFQodiwwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAwKSAvL0RlZmF1bHQKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERlbGV0ZU5vZGUoInY6aW1hZ2VkYXRhL0BnYW1tYSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJ2OmltYWdlZGF0YS9AZ2FtbWEiLCB2YWx1ZS5Ub1N0cmluZygiIy4wIyIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGVmaW5lcyB0aGUgaW50ZW5zaXR5IG9mIGJsYWNrIGluIGFuIGltYWdlCi0gICAgICAgIC8vLyBEZWZhdWx0IHZhbHVlIGlzIDAKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGRvdWJsZSBCbGFja0xldmVsCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmluZyB2ID0gR2V0WG1sTm9kZVN0cmluZygidjppbWFnZWRhdGEvQGJsYWNrbGV2ZWwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0RnJhY0RUKHYsIDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEZWxldGVOb2RlKCJ2OmltYWdlZGF0YS9AYmxhY2tsZXZlbCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJ2OmltYWdlZGF0YS9AYmxhY2tsZXZlbCIsIHZhbHVlLlRvU3RyaW5nKCIjLjAjIiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgICNyZWdpb24gUHJpdmF0ZSBNZXRob2RzCi0gICAgICAgIHByaXZhdGUgZG91YmxlIEdldEZyYWNEVChzdHJpbmcgdiwgZG91YmxlIGRlZikKLSAgICAgICAgewotICAgICAgICAgICAgZG91YmxlIGQ7Ci0gICAgICAgICAgICBpZiAodi5FbmRzV2l0aCgiZiIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHYgPSB2LlN1YnN0cmluZygwLCB2Lkxlbmd0aCAtIDEpOwotICAgICAgICAgICAgICAgIGlmIChkb3VibGUuVHJ5UGFyc2Uodiwgb3V0IGQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZCAvPSA2NTUzNTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZCA9IGRlZjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFkb3VibGUuVHJ5UGFyc2Uodiwgb3V0IGQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZCA9IGRlZjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZDsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHZvaWQgU2V0U3R5bGVQcm9wKHN0cmluZyBwcm9wZXJ0eU5hbWUsIHN0cmluZyB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nIHN0eWxlID0gR2V0WG1sTm9kZVN0cmluZygiQHN0eWxlIik7Ci0gICAgICAgICAgICBzdHJpbmcgbmV3U3R5bGUgPSAiIjsKLSAgICAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBwcm9wIGluIHN0eWxlLlNwbGl0KCc7JykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nW10gc3BsaXQgPSBwcm9wLlNwbGl0KCc6Jyk7Ci0gICAgICAgICAgICAgICAgaWYgKHNwbGl0WzBdID09IHByb3BlcnR5TmFtZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1N0eWxlICs9IHByb3BlcnR5TmFtZSArICI6IiArIHZhbHVlICsgIjsiOwotICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1N0eWxlICs9IHByb3AgKyAiOyI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFmb3VuZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZXdTdHlsZSArPSBwcm9wZXJ0eU5hbWUgKyAiOiIgKyB2YWx1ZSArICI7IjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBzdHlsZSIsIG5ld1N0eWxlLlN1YnN0cmluZygwLCBuZXdTdHlsZS5MZW5ndGggLSAxKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBkb3VibGUgR2V0U3R5bGVQcm9wKHN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBzdHlsZSA9IEdldFhtbE5vZGVTdHJpbmcoIkBzdHlsZSIpOwotICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIHByb3AgaW4gc3R5bGUuU3BsaXQoJzsnKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJpbmdbXSBzcGxpdCA9IHByb3AuU3BsaXQoJzonKTsKLSAgICAgICAgICAgICAgICBpZiAoc3BsaXRbMF0gPT0gcHJvcGVydHlOYW1lICYmIHNwbGl0Lkxlbmd0aCA+IDEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdmFsdWUgPSBzcGxpdFsxXS5FbmRzV2l0aCgicHQiKSA/IHNwbGl0WzFdLlN1YnN0cmluZygwLCBzcGxpdFsxXS5MZW5ndGggLSAyKSA6IHNwbGl0WzFdOwotICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmV0OwotICAgICAgICAgICAgICAgICAgICBpZiAoZG91YmxlLlRyeVBhcnNlKHZhbHVlLCBOdW1iZXJTdHlsZXMuTnVtYmVyLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLCBvdXQgcmV0KSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1cy9EcmF3aW5nL1ZtbC9FeGNlbFZtbERyYXdpbmdQaWN0dXJlQ29sbGVjdGlvbi5jcyBiL0VQUGx1cy9EcmF3aW5nL1ZtbC9FeGNlbFZtbERyYXdpbmdQaWN0dXJlQ29sbGVjdGlvbi5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIyMmZiMC4uMDAwMDAwMAotLS0gYS9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nUGljdHVyZUNvbGxlY3Rpb24uY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCi0gKgotICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KLSAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKLSAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAotICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAotICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KLSAqCi0gKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAotICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSmFuIEvDpGxsbWFuCQlJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAxMC0wNi0wMQotICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uWG1sOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwotdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Ci11c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwotCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLlZtbAotewotICAgIHB1YmxpYyBjbGFzcyBFeGNlbFZtbERyYXdpbmdQaWN0dXJlQ29sbGVjdGlvbiA6IEV4Y2VsVm1sRHJhd2luZ0Jhc2VDb2xsZWN0aW9uLCBJRW51bWVyYWJsZQotICAgIHsKLSAgICAgICAgaW50ZXJuYWwgTGlzdDxFeGNlbFZtbERyYXdpbmdQaWN0dXJlPiBfaW1hZ2VzOwotICAgICAgICBFeGNlbFBhY2thZ2UgX3BjazsKLSAgICAgICAgRXhjZWxXb3Jrc2hlZXQgX3dzOwotICAgICAgICBpbnRlcm5hbCBFeGNlbFZtbERyYXdpbmdQaWN0dXJlQ29sbGVjdGlvbihFeGNlbFBhY2thZ2UgcGNrLCBFeGNlbFdvcmtzaGVldCB3cywgVXJpIHVyaSkgOgotICAgICAgICAgICAgYmFzZShwY2ssIHdzLCB1cmkpCi0gICAgICAgIHsgICAgICAgICAgICAKLSAgICAgICAgICAgIF9wY2sgPSBwY2s7Ci0gICAgICAgICAgICBfd3MgPSB3czsKLSAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWbWxEcmF3aW5nWG1sLkxvYWRYbWwoQ3JlYXRlVm1sRHJhd2luZ3MoKSk7Ci0gICAgICAgICAgICAgICAgX2ltYWdlcyA9IG5ldyBMaXN0PEV4Y2VsVm1sRHJhd2luZ1BpY3R1cmU+KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQWRkRHJhd2luZ3NGcm9tWG1sKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgQWRkRHJhd2luZ3NGcm9tWG1sKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG5vZGVzID0gVm1sRHJhd2luZ1htbC5TZWxlY3ROb2RlcygiLy92OnNoYXBlIiwgTmFtZVNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICBfaW1hZ2VzID0gbmV3IExpc3Q8RXhjZWxWbWxEcmF3aW5nUGljdHVyZT4oKTsKLSAgICAgICAgICAgIGZvcmVhY2ggKFhtbE5vZGUgbm9kZSBpbiBub2RlcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgaW1nID0gbmV3IEV4Y2VsVm1sRHJhd2luZ1BpY3R1cmUobm9kZSwgTmFtZVNwYWNlTWFuYWdlciwgX3dzKTsKLSAgICAgICAgICAgICAgICB2YXIgcmVsID0gUGFydC5HZXRSZWxhdGlvbnNoaXAoaW1nLlJlbElkKTsKLSAgICAgICAgICAgICAgICBpbWcuSW1hZ2VVcmkgPSBVcmlIZWxwZXIuUmVzb2x2ZVBhcnRVcmkocmVsLlNvdXJjZVVyaSwgcmVsLlRhcmdldFVyaSk7Ci0gICAgICAgICAgICAgICAgX2ltYWdlcy5BZGQoaW1nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RyaW5nIENyZWF0ZVZtbERyYXdpbmdzKCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nIHZtbD1zdHJpbmcuRm9ybWF0KCI8eG1sIHhtbG5zOnY9XCJ7MH1cIiB4bWxuczpvPVwiezF9XCIgeG1sbnM6eD1cInsyfVwiPiIsIAotICAgICAgICAgICAgICAgIEV4Y2VsUGFja2FnZS5zY2hlbWFNaWNyb3NvZnRWbWwsIAotICAgICAgICAgICAgICAgIEV4Y2VsUGFja2FnZS5zY2hlbWFNaWNyb3NvZnRPZmZpY2UsIAotICAgICAgICAgICAgICAgIEV4Y2VsUGFja2FnZS5zY2hlbWFNaWNyb3NvZnRFeGNlbCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICB2bWwrPSI8bzpzaGFwZWxheW91dCB2OmV4dD1cImVkaXRcIj4iOwotICAgICAgICAgICAgIHZtbCs9IjxvOmlkbWFwIHY6ZXh0PVwiZWRpdFwiIGRhdGE9XCIxXCIvPiI7Ci0gICAgICAgICAgICAgdm1sKz0iPC9vOnNoYXBlbGF5b3V0PiI7Ci0KLSAgICAgICAgICAgICB2bWwrPSI8djpzaGFwZXR5cGUgaWQ9XCJfeDAwMDBfdDIwMlwiIGNvb3Jkc2l6ZT1cIjIxNjAwLDIxNjAwXCIgbzpzcHQ9XCIyMDJcIiBwYXRoPVwibSxsLDIxNjAwcjIxNjAwLGwyMTYwMCx4ZVwiPiI7Ci0gICAgICAgICAgICAgdm1sKz0iPHY6c3Ryb2tlIGpvaW5zdHlsZT1cIm1pdGVyXCIgLz4iOwotICAgICAgICAgICAgIHZtbCs9Ijx2OnBhdGggZ3JhZGllbnRzaGFwZW9rPVwidFwiIG86Y29ubmVjdHR5cGU9XCJyZWN0XCIgLz4iOwotICAgICAgICAgICAgIHZtbCs9IjwvdjpzaGFwZXR5cGU+IjsKLSAgICAgICAgICAgICB2bWwrPSAiPC94bWw+IjsKLQotICAgICAgICAgICAgcmV0dXJuIHZtbDsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBFeGNlbFZtbERyYXdpbmdQaWN0dXJlIEFkZChzdHJpbmcgaWQsIFVyaSB1cmksIHN0cmluZyBuYW1lLCBkb3VibGUgd2lkdGgsIGRvdWJsZSBoZWlnaHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbE5vZGUgbm9kZSA9IEFkZEltYWdlKGlkLCB1cmksIG5hbWUsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgdmFyIGRyYXcgPSBuZXcgRXhjZWxWbWxEcmF3aW5nUGljdHVyZShub2RlLCBOYW1lU3BhY2VNYW5hZ2VyLCBfd3MpOwotICAgICAgICAgICAgZHJhdy5JbWFnZVVyaSA9IHVyaTsKLSAgICAgICAgICAgIF9pbWFnZXMuQWRkKGRyYXcpOwotICAgICAgICAgICAgcmV0dXJuIGRyYXc7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBYbWxOb2RlIEFkZEltYWdlKHN0cmluZyBpZCwgVXJpIHRhcmdlVXJpLCBzdHJpbmcgTmFtZSwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbm9kZSA9IFZtbERyYXdpbmdYbWwuQ3JlYXRlRWxlbWVudCgidiIsICJzaGFwZSIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNaWNyb3NvZnRWbWwpOwotICAgICAgICAgICAgVm1sRHJhd2luZ1htbC5Eb2N1bWVudEVsZW1lbnQuQXBwZW5kQ2hpbGQobm9kZSk7Ci0gICAgICAgICAgICBub2RlLlNldEF0dHJpYnV0ZSgiaWQiLCBpZCk7Ci0gICAgICAgICAgICBub2RlLlNldEF0dHJpYnV0ZSgibzp0eXBlIiwgIiNfeDAwMDBfdDc1Iik7Ci0gICAgICAgICAgICBub2RlLlNldEF0dHJpYnV0ZSgic3R5bGUiLCBzdHJpbmcuRm9ybWF0KCJwb3NpdGlvbjphYnNvbHV0ZTttYXJnaW4tbGVmdDowO21hcmdpbi10b3A6MDt3aWR0aDp7MH1wdDtoZWlnaHQ6ezF9cHQ7ei1pbmRleDoxIiwgd2lkdGguVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSksIGhlaWdodC5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSkpOwotICAgICAgICAgICAgLy9ub2RlLlNldEF0dHJpYnV0ZSgiZmlsbGNvbG9yIiwgIiNmZmZmZTEiKTsKLSAgICAgICAgICAgIC8vbm9kZS5TZXRBdHRyaWJ1dGUoImluc2V0bW9kZSIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNaWNyb3NvZnRPZmZpY2UsICJhdXRvIik7Ci0KLSAgICAgICAgICAgIG5vZGUuSW5uZXJYbWwgPSBzdHJpbmcuRm9ybWF0KCI8djppbWFnZWRhdGEgbzpyZWxpZD1cIlwiIG86dGl0bGU9XCJ7MH1cIi8+PG86bG9jayB2OmV4dD1cImVkaXRcIiByb3RhdGlvbj1cInRcIi8+IiwgIE5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIG5vZGU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSW5kZXhlcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkluZGV4Ij5JbmRleDwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgVk1MIERyYXdpbmcgUGljdHVyZSBvYmplY3Q8L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFZtbERyYXdpbmdQaWN0dXJlIHRoaXNbaW50IEluZGV4XQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2ltYWdlc1tJbmRleF0gYXMgRXhjZWxWbWxEcmF3aW5nUGljdHVyZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgaW50IENvdW50Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfaW1hZ2VzLkNvdW50OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50IF9uZXh0SUQgPSAwOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyByZXR1cm5zIHRoZSBuZXh0IGRyYXdpbmcgaWQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIGludGVybmFsIHN0cmluZyBHZXROZXdJZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfbmV4dElEID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAoRXhjZWxWbWxEcmF3aW5nQ29tbWVudCBkcmF3IGluIHRoaXMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoZHJhdy5JZC5MZW5ndGggPiAzICYmIGRyYXcuSWQuU3RhcnRzV2l0aCgidm1sIikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnQuVHJ5UGFyc2UoZHJhdy5JZC5TdWJzdHJpbmcoMywgZHJhdy5JZC5MZW5ndGggLSAzKSwgb3V0IGlkKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWQgPiBfbmV4dElEKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX25leHRJRCA9IGlkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9uZXh0SUQrKzsKLSAgICAgICAgICAgIHJldHVybiAidm1sIiArIF9uZXh0SUQuVG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICAjcmVnaW9uIElFbnVtZXJhYmxlIE1lbWJlcnMKLQotICAgICAgICBJRW51bWVyYXRvciBJRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfaW1hZ2VzLkdldEVudW1lcmF0b3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgICNlbmRyZWdpb24KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nUG9zaXRpb24uY3MgYi9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nUG9zaXRpb24uY3MKaW5kZXggMmYzMzA1NC4uYmQzZDFiNCAxMDA2NDQKLS0tIGEvRVBQbHVzL0RyYXdpbmcvVm1sL0V4Y2VsVm1sRHJhd2luZ1Bvc2l0aW9uLmNzCisrKyBiL0VQUGx1cy9EcmF3aW5nL1ZtbC9FeGNlbFZtbERyYXdpbmdQb3NpdGlvbi5jcwpAQCAtMzAsOCArMzAsNiBAQAogICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uWG1sOwogbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZy5WbWwKIHsKZGlmZiAtLWdpdCBhL0VQUGx1cy9FUFBsdXNTREsuY3Nwcm9qIGIvRVBQbHVzL0VQUGx1c1NESy5jc3Byb2oKaW5kZXggNTNhYjA3NC4uOWI1ZjIxYiAxMDA2NDQKLS0tIGEvRVBQbHVzL0VQUGx1c1NESy5jc3Byb2oKKysrIGIvRVBQbHVzL0VQUGx1c1NESy5jc3Byb2oKQEAgLTcsMTEgKzcsMTAgQEAKICAgICA8VmVyc2lvbj4xLjAuMzwvVmVyc2lvbj4KICAgICA8RGVmYXVsdEl0ZW1FeGNsdWRlcz4kKERlZmF1bHRJdGVtRXhjbHVkZXMpO1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzO0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlblNlcGFyYXRvckhhbmRsZXJzLyoqO0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlbkhhbmRsZXIuY3M7Rm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvUmFuay5jczwvRGVmYXVsdEl0ZW1FeGNsdWRlcz4KICAgICA8RGVmaW5lQ29uc3RhbnRzPkNvcmU7U1RBTkRBUkQyMDwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxJbXBsaWNpdFVzaW5ncz5kaXNhYmxlPC9JbXBsaWNpdFVzaW5ncz4KICAgPC9Qcm9wZXJ0eUdyb3VwPgogICA8SXRlbUdyb3VwPgotICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Iklyb25Tb2Z0d2FyZS5TeXN0ZW0uRHJhd2luZyIgVmVyc2lvbj0iMjAyNC4zLjQiIC8+CiAgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkNTaGFycCIgVmVyc2lvbj0iNC43LjAiIC8+Ci0gICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU2l4TGFib3JzLkltYWdlU2hhcnAiIFZlcnNpb249IjMuMS40IiAvPiAgPCEtLURvIG5vdCByZW1vdmUgLSBiLzMzNTM3MjEyMyBhbmQgb3RoZXJzLS0+CiAgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvZGVEb20iIFZlcnNpb249IjUuMC4wIiAvPgogICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EcmF3aW5nLkNvbW1vbiIgVmVyc2lvbj0iNi4wLjAiIC8+CiAgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5Qa2NzIiBWZXJzaW9uPSI1LjAuMSIgLz4KZGlmZiAtLWdpdCBhL0VQUGx1cy9FeGNlbEJhY2tncm91bmRJbWFnZS5jcyBiL0VQUGx1cy9FeGNlbEJhY2tncm91bmRJbWFnZS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAxY2YwOS4uMDAwMDAwMAotLS0gYS9FUFBsdXMvRXhjZWxCYWNrZ3JvdW5kSW1hZ2UuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCi0gKgotICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KLSAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKLSAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKLSAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KLSAqCi0gKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqCi0gKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTEwLVNFUC0yMDA5Ci0gKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlhtbDsKLXVzaW5nIFN5c3RlbS5EcmF3aW5nOwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Db21wYXRpYmlsaXR5OwotdXNpbmcgT2ZmaWNlT3BlblhtbC5EcmF3aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFuIGltYWdlIHRoYXQgZmlsbHMgdGhlIGJhY2tncm91bmQgb2YgdGhlIHdvcmtzaGVldC4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbEJhY2tncm91bmRJbWFnZSA6IFhtbEhlbHBlcgotICAgIHsKLSAgICAgICAgRXhjZWxXb3Jrc2hlZXQgX3dvcmtTaGVldDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuc20iPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idG9wTm9kZSI+VGhlIHRvcG5vZGUgb2YgdGhlIHdvcmtzaGVldDwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya1NoZWV0Ij5Xb3Jrc2hlZXQgcmVmZXJlbmNlPC9wYXJhbT4KLSAgICAgICAgaW50ZXJuYWwgIEV4Y2VsQmFja2dyb3VuZEltYWdlKFhtbE5hbWVzcGFjZU1hbmFnZXIgbnNtLCBYbWxOb2RlIHRvcE5vZGUsIEV4Y2VsV29ya3NoZWV0IHdvcmtTaGVldCkgOgotICAgICAgICAgICAgYmFzZShuc20sIHRvcE5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3JrU2hlZXQgPSB3b3JrU2hlZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBzdHJpbmcgQkFDS0dST1VORFBJQ19QQVRIID0gImQ6cGljdHVyZS9AcjppZCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBiYWNrZ3JvdW5kIGltYWdlIG9mIHRoZSB3b3Jrc2hlZXQuCi0gICAgICAgIC8vLyBUaGUgaW1hZ2Ugd2lsbCBiZSBzYXZlZCBpbnRlcm5hbGx5IGFzIGEganBnLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgSW1hZ2UgSW1hZ2UKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIHJlbElEID0gR2V0WG1sTm9kZVN0cmluZyhCQUNLR1JPVU5EUElDX1BBVEgpOwotICAgICAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkocmVsSUQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIHJlbCA9IF93b3JrU2hlZXQuUGFydC5HZXRSZWxhdGlvbnNoaXAocmVsSUQpOwotICAgICAgICAgICAgICAgICAgICB2YXIgaW1hZ2VQYXJ0ID0gX3dvcmtTaGVldC5QYXJ0LlBhY2thZ2UuR2V0UGFydChVcmlIZWxwZXIuUmVzb2x2ZVBhcnRVcmkocmVsLlNvdXJjZVVyaSwgcmVsLlRhcmdldFVyaSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW1hZ2UuRnJvbVN0cmVhbShpbWFnZVBhcnQuR2V0U3RyZWFtKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERlbGV0ZVByZXZJbWFnZSgpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRGVsZXRlQWxsTm9kZShCQUNLR1JPVU5EUElDX1BBVEgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotI2lmIChDb3JlKQotICAgICAgICAgICAgICAgICAgICB2YXIgaW1nPUltYWdlQ29tcGF0LkdldEltYWdlQXNCeXRlQXJyYXkodmFsdWUpOwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgSW1hZ2VDb252ZXJ0ZXIgaWMgPSBuZXcgSW1hZ2VDb252ZXJ0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGltZyA9IChieXRlW10paWMuQ29udmVydFRvKHZhbHVlLCB0eXBlb2YoYnl0ZVtdKSk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgdmFyIGlpID0gX3dvcmtTaGVldC5Xb3JrYm9vay5fcGFja2FnZS5BZGRJbWFnZShpbWcpOwotICAgICAgICAgICAgICAgICAgICB2YXIgcmVsID0gX3dvcmtTaGVldC5QYXJ0LkNyZWF0ZVJlbGF0aW9uc2hpcChpaS5VcmksIFBhY2thZ2luZy5UYXJnZXRNb2RlLkludGVybmFsLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcyArICIvaW1hZ2UiKTsKLSAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhCQUNLR1JPVU5EUElDX1BBVEgsIHJlbC5JZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNldCB0aGUgcGljdHVyZSBmcm9tIGFuIGltYWdlIGZpbGUuCi0gICAgICAgIC8vLyBUaGUgaW1hZ2UgZmlsZSB3aWxsIGJlIHNhdmVkIGFzIGEgYmxvYiwgc28gbWFrZSBzdXJlIEV4Y2VsIHN1cHBvcnRzIHRoZSBpbWFnZSBmb3JtYXQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iUGljdHVyZUZpbGUiPlRoZSBpbWFnZSBmaWxlLjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFNldEZyb21GaWxlKEZpbGVJbmZvIFBpY3R1cmVGaWxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBEZWxldGVQcmV2SW1hZ2UoKTsKLQotICAgICAgICAgICAgSW1hZ2UgaW1nOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW1nID0gSW1hZ2UuRnJvbUZpbGUoUGljdHVyZUZpbGUuRnVsbE5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEludmFsaWREYXRhRXhjZXB0aW9uKCJGaWxlIGlzIG5vdCBhIHN1cHBvcnRlZCBpbWFnZS1maWxlIG9yIGlzIGNvcnJ1cHQiLCBleCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdHJpbmcgY29udGVudFR5cGUgPSBFeGNlbFBpY3R1cmUuR2V0Q29udGVudFR5cGUoUGljdHVyZUZpbGUuRXh0ZW5zaW9uKTsKLSAgICAgICAgICAgIHZhciBpbWFnZVVSSSA9IFhtbEhlbHBlci5HZXROZXdVcmkoX3dvcmtTaGVldC5fcGFja2FnZS5QYWNrYWdlLCAiL3hsL21lZGlhLyIgKyBQaWN0dXJlRmlsZS5OYW1lLlN1YnN0cmluZygwLCBQaWN0dXJlRmlsZS5OYW1lLkxlbmd0aCAtIFBpY3R1cmVGaWxlLkV4dGVuc2lvbi5MZW5ndGgpICsgInswfSIgKyBQaWN0dXJlRmlsZS5FeHRlbnNpb24pOwotI2lmIChDb3JlKQotICAgICAgICAgICAgdmFyIGZpbGVCeXRlcz1JbWFnZUNvbXBhdC5HZXRJbWFnZUFzQnl0ZUFycmF5KGltZyk7Ci0jZWxzZQotICAgICAgICAgICAgdmFyIGljID0gbmV3IEltYWdlQ29udmVydGVyKCk7Ci0gICAgICAgICAgICBieXRlW10gZmlsZUJ5dGVzID0gKGJ5dGVbXSlpYy5Db252ZXJ0VG8oaW1nLCB0eXBlb2YoYnl0ZVtdKSk7Ci0jZW5kaWYKLSAgICAgICAgICAgIHZhciBpaSA9IF93b3JrU2hlZXQuV29ya2Jvb2suX3BhY2thZ2UuQWRkSW1hZ2UoZmlsZUJ5dGVzLCBpbWFnZVVSSSwgY29udGVudFR5cGUpOwotCi0gICAgICAgICAgICBpZiAoX3dvcmtTaGVldC5QYXJ0LlBhY2thZ2UuUGFydEV4aXN0cyhpbWFnZVVSSSkgJiYgaWkuUmVmQ291bnQ9PTEpIC8vVGhlIGZpbGUgZXhpc3RzIHdpdGggYW5vdGhlciBjb250ZW50LCBvdmVyd3JpdGUgaXQuCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9SZW1vdmUgdGhlIHBhcnQgaWYgaXQgZXhpc3RzCi0gICAgICAgICAgICAgICAgX3dvcmtTaGVldC5QYXJ0LlBhY2thZ2UuRGVsZXRlUGFydChpbWFnZVVSSSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHZhciBpbWFnZVBhcnQgPSBfd29ya1NoZWV0LlBhcnQuUGFja2FnZS5DcmVhdGVQYXJ0KGltYWdlVVJJLCBjb250ZW50VHlwZSwgQ29tcHJlc3Npb25MZXZlbC5Ob25lKTsKLSAgICAgICAgICAgIC8vU2F2ZSB0aGUgcGljdHVyZSB0byBwYWNrYWdlLgotCi0gICAgICAgICAgICB2YXIgc3RybSA9IGltYWdlUGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLldyaXRlKTsKLSAgICAgICAgICAgIHN0cm0uV3JpdGUoZmlsZUJ5dGVzLCAwLCBmaWxlQnl0ZXMuTGVuZ3RoKTsKLQotICAgICAgICAgICAgdmFyIHJlbCA9IF93b3JrU2hlZXQuUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoaW1hZ2VVUkksIFBhY2thZ2luZy5UYXJnZXRNb2RlLkludGVybmFsLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcyArICIvaW1hZ2UiKTsKLSAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoQkFDS0dST1VORFBJQ19QQVRILCByZWwuSWQpOwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgdm9pZCBEZWxldGVQcmV2SW1hZ2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVsSUQgPSBHZXRYbWxOb2RlU3RyaW5nKEJBQ0tHUk9VTkRQSUNfUEFUSCk7Ci0gICAgICAgICAgICBpZiAocmVsSUQgIT0gIiIpCi0gICAgICAgICAgICB7Ci0jaWYgKENvcmUpCi0gICAgICAgICAgICAgICAgdmFyIGltZz1JbWFnZUNvbXBhdC5HZXRJbWFnZUFzQnl0ZUFycmF5KEltYWdlKTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgdmFyIGljID0gbmV3IEltYWdlQ29udmVydGVyKCk7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGltZyA9IChieXRlW10paWMuQ29udmVydFRvKEltYWdlLCB0eXBlb2YoYnl0ZVtdKSk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB2YXIgaWkgPSBfd29ya1NoZWV0Lldvcmtib29rLl9wYWNrYWdlLkdldEltYWdlSW5mbyhpbWcpOwotCi0gICAgICAgICAgICAgICAgLy9EZWxldGUgdGhlIHJlbGF0aW9uCi0gICAgICAgICAgICAgICAgX3dvcmtTaGVldC5QYXJ0LkRlbGV0ZVJlbGF0aW9uc2hpcChyZWxJRCk7Ci0KLSAgICAgICAgICAgICAgICAvL0RlbGV0ZSB0aGUgaW1hZ2UgaWYgdGhlcmUgYXJlIG5vIG90aGVyIHJlZmVyZW5jZXMuCi0gICAgICAgICAgICAgICAgaWYgKGlpICE9IG51bGwgJiYgaWkuUmVmQ291bnQgPT0gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfd29ya1NoZWV0LlBhcnQuUGFja2FnZS5QYXJ0RXhpc3RzKGlpLlVyaSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF93b3JrU2hlZXQuUGFydC5QYWNrYWdlLkRlbGV0ZVBhcnQoaWkuVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0V4Y2VsQ29sdW1uLmNzIGIvRVBQbHVzL0V4Y2VsQ29sdW1uLmNzCmluZGV4IDllMjZjZWQuLjU2ZWE5OTQgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9FeGNlbENvbHVtbi5jcworKysgYi9FUFBsdXMvRXhjZWxDb2x1bW4uY3MKQEAgLTQsNyArNCw3IEBACiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgogICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBL5GxsbWFuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBL77+9bGxtYW4KICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkBAIC0yNiw4ICsyNiw4IEBACiAgKiAKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSmFuIEvkbGxtYW4JCUluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCi0gKiBKYW4gS+RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0yNworICogSmFuIEvvv71sbG1hbgkJSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKKyAqIEphbiBL77+9bGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMjcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLlhtbDsKQEAgLTExNiwxNiArMTE2LDcgQEAKIAkJCX0KIAkJCXNldAogCQkJewotICAgICAgICAgICAgICAgIGlmIChfd29ya3NoZWV0Ll9wYWNrYWdlLkRvQWRqdXN0RHJhd2luZ3MpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgcG9zID0gX3dvcmtzaGVldC5EcmF3aW5ncy5HZXREcmF3aW5nV2lkdGhzKCk7Ci0gICAgICAgICAgICAgICAgICAgIF9oaWRkZW4gPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5EcmF3aW5ncy5BZGp1c3RXaWR0aChwb3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfaGlkZGVuID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9oaWRkZW4gPSB2YWx1ZTsKIAkJCX0KIAkJfQogCQkjZW5kcmVnaW9uCkBAIC0xNTcsMTYgKzE0OCw3IEBACiAJCQl9CiAJCQlzZXQJCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF93b3Jrc2hlZXQuX3BhY2thZ2UuRG9BZGp1c3REcmF3aW5ncykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciBwb3MgPSBfd29ya3NoZWV0LkRyYXdpbmdzLkdldERyYXdpbmdXaWR0aHMoKTsKLSAgICAgICAgICAgICAgICAgICAgX3dpZHRoID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIF93b3Jrc2hlZXQuRHJhd2luZ3MuQWRqdXN0V2lkdGgocG9zKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX3dpZHRoID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF93aWR0aCA9IHZhbHVlOwogCiAgICAgICAgICAgICAgICAgaWYgKF9oaWRkZW4gJiYgdmFsdWUhPTApCiAgICAgICAgICAgICAgICAgewpAQCAtMjcwLDM5ICsyNTIsNyBAQAogCQl7CiAJCQlyZXR1cm4gc3RyaW5nLkZvcm1hdCgiQ29sdW1uIFJhbmdlOiB7MH0gdG8gezF9IiwgX2NvbEVsZW1lbnQuR2V0QXR0cmlidXRlKCJtaW4iKSwgX2NvbEVsZW1lbnQuR2V0QXR0cmlidXRlKCJtaW4iKSk7CiAJCX0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU2V0IHRoZSBjb2x1bW4gd2lkdGggZnJvbSB0aGUgY29udGVudCBvZiB0aGUgcmFuZ2UuIFRoZSBtaW5pbXVtIHdpZHRoIGlzIHRoZSB2YWx1ZSBvZiB0aGUgRXhjZWxXb3Jrc2hlZXQuZGVmYXVsdENvbHVtbldpZHRoIHByb3BlcnR5LgotICAgICAgICAvLy8gTm90ZTogQ2VsbHMgY29udGFpbmluZyBmb3JtdWxhcyBhcmUgaWdub3JlZCBzaW5jZSBFUFBsdXMgZG9uJ3QgaGF2ZSBhIGNhbGN1bGF0aW9uIGVuZ2luZS4KLSAgICAgICAgLy8vICAgICAgIFdyYXBwZWQgYW5kIG1lcmdlZCBjZWxscyBhcmUgYWxzbyBpZ25vcmVkLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgdm9pZCBBdXRvRml0KCkKLSAgICAgICAgewotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1sxLCBfY29sdW1uTWluLCBFeGNlbFBhY2thZ2UuTWF4Um93cywgX2NvbHVtbk1heF0uQXV0b0ZpdENvbHVtbnMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNldCB0aGUgY29sdW1uIHdpZHRoIGZyb20gdGhlIGNvbnRlbnQuCi0gICAgICAgIC8vLyBOb3RlOiBDZWxscyBjb250YWluaW5nIGZvcm11bGFzIGFyZSBpZ25vcmVkIHNpbmNlIEVQUGx1cyBkb24ndCBoYXZlIGEgY2FsY3VsYXRpb24gZW5naW5lLgotICAgICAgICAvLy8gICAgICAgV3JhcHBlZCBhbmQgbWVyZ2VkIGNlbGxzIGFyZSBhbHNvIGlnbm9yZWQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iTWluaW11bVdpZHRoIj5NaW5pbXVtIGNvbHVtbiB3aWR0aDwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIEF1dG9GaXQoZG91YmxlIE1pbmltdW1XaWR0aCkKLSAgICAgICAgewotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1sxLCBfY29sdW1uTWluLCBFeGNlbFBhY2thZ2UuTWF4Um93cywgX2NvbHVtbk1heF0uQXV0b0ZpdENvbHVtbnMoTWluaW11bVdpZHRoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNldCB0aGUgY29sdW1uIHdpZHRoIGZyb20gdGhlIGNvbnRlbnQuCi0gICAgICAgIC8vLyBOb3RlOiBDZWxscyBjb250YWluaW5nIGZvcm11bGFzIGFyZSBpZ25vcmVkIHNpbmNlIEVQUGx1cyBkb24ndCBoYXZlIGEgY2FsY3VsYXRpb24gZW5naW5lLgotICAgICAgICAvLy8gICAgICAgV3JhcHBlZCBhbmQgbWVyZ2VkIGNlbGxzIGFyZSBhbHNvIGlnbm9yZWQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iTWluaW11bVdpZHRoIj5NaW5pbXVtIGNvbHVtbiB3aWR0aDwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iTWF4aW11bVdpZHRoIj5NYXhpbXVtIGNvbHVtbiB3aWR0aDwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIEF1dG9GaXQoZG91YmxlIE1pbmltdW1XaWR0aCwgZG91YmxlIE1heGltdW1XaWR0aCkKLSAgICAgICAgewotICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1sxLCBfY29sdW1uTWluLCBFeGNlbFBhY2thZ2UuTWF4Um93cywgX2NvbHVtbk1heF0uQXV0b0ZpdENvbHVtbnMoTWluaW11bVdpZHRoLCBNYXhpbXVtV2lkdGgpOwotICAgICAgICB9Ci0KKyAgICAgICAgCiAgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIEdldCB0aGUgaW50ZXJuYWwgUmFuZ2VJRAogICAgICAgICAvLy8gPC9zdW1tYXJ5PgpkaWZmIC0tZ2l0IGEvRVBQbHVzL0V4Y2VsSGVhZGVyRm9vdGVyLmNzIGIvRVBQbHVzL0V4Y2VsSGVhZGVyRm9vdGVyLmNzCmluZGV4IDNmOTc4YzQuLmNlNzJkZDggMTAwNjQ0Ci0tLSBhL0VQUGx1cy9FeGNlbEhlYWRlckZvb3Rlci5jcworKysgYi9FUFBsdXMvRXhjZWxIZWFkZXJGb290ZXIuY3MKQEAgLTMwLDM2ICszMCw5IEBACiAgKiBKYW4gS8OkbGxtYW4gICAgICAgICAgICAgICAgICAgICAgVG90YWwgcmV3cml0ZSAgICAgICAgICAgICAgIDIwMTAtMDMtMDEKICAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0yNwogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5YbWw7Ci11c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Ci11c2luZyBTeXN0ZW0uRHJhd2luZzsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLlZtbDsKLXVzaW5nIFN5c3RlbS5JTzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuQ29tcGF0aWJpbGl0eTsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRHJhd2luZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CiBuYW1lc3BhY2UgT2ZmaWNlT3BlblhtbAogeyAgICAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEhvdyBhIHBpY3R1cmUgd2lsbCBiZSBhbGlnbmVkIGluIHRoZSBoZWFkZXIvZm9vdGVyCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZW51bSBQaWN0dXJlQWxpZ25tZW50Ci0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgcGljdHVyZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsZWZ0IGFsaWduZWQgdGV4dAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBMZWZ0LAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgcGljdHVyZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjZW50ZXJlZCB0ZXh0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIENlbnRlcmVkLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgcGljdHVyZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSByaWdodCBhbGlnbmVkIHRleHQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgUmlnaHQKLSAgICB9CiAgICAgI3JlZ2lvbiBjbGFzcyBFeGNlbEhlYWRlckZvb3RlclRleHQKIAkvLy8gPHN1bW1hcnk+CiAgICAgLy8vIFByaW50IGhlYWRlciBhbmQgZm9vdGVyIApAQCAtMTE2LDk0ICs4OSw2IEBACiAgICAgICAgIC8vLyBHZXQvc2V0IHRoZSB0ZXh0IHRvIGFwcGVhciBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSBoZWFkZXIgKG9yIGZvb3Rlcikgb24gdGhlIHdvcmtzaGVldC4KIAkJLy8vIDwvc3VtbWFyeT4KIAkJcHVibGljIHN0cmluZyBSaWdodEFsaWduZWRUZXh0ID0gbnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSW5zZXJ0cyBhIHBpY3R1cmUgYXQgdGhlIGVuZCBvZiB0aGUgdGV4dCBpbiB0aGUgaGVhZGVyIG9yIGZvb3RlcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlBpY3R1cmUiPlRoZSBpbWFnZSBvYmplY3QgY29udGFpbmluZyB0aGUgUGljdHVyZTwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iQWxpZ25tZW50Ij5BbGlnbm1lbnQuIFRoZSBpbWFnZSBvYmplY3Qgd2lsbCBiZSBpbnNlcnRlZCBhdCB0aGUgZW5kIG9mIHRoZSBUZXh0LjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFZtbERyYXdpbmdQaWN0dXJlIEluc2VydFBpY3R1cmUoSW1hZ2UgUGljdHVyZSwgUGljdHVyZUFsaWdubWVudCBBbGlnbm1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBpZCA9IFZhbGlkYXRlSW1hZ2UoQWxpZ25tZW50KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy9BZGQgdGhlIGltYWdlCi0jaWYgKENvcmUpCi0gICAgICAgICAgICB2YXIgaW1nPUltYWdlQ29tcGF0LkdldEltYWdlQXNCeXRlQXJyYXkoUGljdHVyZSk7Ci0jZWxzZQotICAgICAgICAgICAgSW1hZ2VDb252ZXJ0ZXIgaWMgPSBuZXcgSW1hZ2VDb252ZXJ0ZXIoKTsKLSAgICAgICAgICAgIGJ5dGVbXSBpbWcgPSAoYnl0ZVtdKWljLkNvbnZlcnRUbyhQaWN0dXJlLCB0eXBlb2YoYnl0ZVtdKSk7Ci0jZW5kaWYKLSAgICAgICAgICAgIHZhciBpaSA9IF93cy5Xb3JrYm9vay5fcGFja2FnZS5BZGRJbWFnZShpbWcpOwotCi0gICAgICAgICAgICByZXR1cm4gQWRkSW1hZ2UoUGljdHVyZSwgaWQsIGlpKTsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJbnNlcnRzIGEgcGljdHVyZSBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0IGluIHRoZSBoZWFkZXIgb3IgZm9vdGVyCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iUGljdHVyZUZpbGUiPlRoZSBpbWFnZSBvYmplY3QgY29udGFpbmluZyB0aGUgUGljdHVyZTwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iQWxpZ25tZW50Ij5BbGlnbm1lbnQuIFRoZSBpbWFnZSBvYmplY3Qgd2lsbCBiZSBpbnNlcnRlZCBhdCB0aGUgZW5kIG9mIHRoZSBUZXh0LjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFZtbERyYXdpbmdQaWN0dXJlIEluc2VydFBpY3R1cmUoRmlsZUluZm8gUGljdHVyZUZpbGUsIFBpY3R1cmVBbGlnbm1lbnQgQWxpZ25tZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcgaWQgPSBWYWxpZGF0ZUltYWdlKEFsaWdubWVudCk7Ci0KLSAgICAgICAgICAgIEltYWdlIFBpY3R1cmU7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIVBpY3R1cmVGaWxlLkV4aXN0cykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoInswfSBpcyBtaXNzaW5nIiwgUGljdHVyZUZpbGUuRnVsbE5hbWUpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFBpY3R1cmUgPSBJbWFnZS5Gcm9tRmlsZShQaWN0dXJlRmlsZS5GdWxsTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IChuZXcgSW52YWxpZERhdGFFeGNlcHRpb24oIkZpbGUgaXMgbm90IGEgc3VwcG9ydGVkIGltYWdlLWZpbGUgb3IgaXMgY29ycnVwdCIsIGV4KSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0cmluZyBjb250ZW50VHlwZSA9IEV4Y2VsUGljdHVyZS5HZXRDb250ZW50VHlwZShQaWN0dXJlRmlsZS5FeHRlbnNpb24pOwotICAgICAgICAgICAgdmFyIHVyaVBpYyA9IFhtbEhlbHBlci5HZXROZXdVcmkoX3dzLl9wYWNrYWdlLlBhY2thZ2UsICIveGwvbWVkaWEvIitQaWN0dXJlRmlsZS5OYW1lLlN1YnN0cmluZygwLCBQaWN0dXJlRmlsZS5OYW1lLkxlbmd0aC1QaWN0dXJlRmlsZS5FeHRlbnNpb24uTGVuZ3RoKSArICJ7MH0iICsgUGljdHVyZUZpbGUuRXh0ZW5zaW9uKTsKLSNpZiAoQ29yZSkKLSAgICAgICAgICAgIHZhciBpbWdCeXRlcz1JbWFnZUNvbXBhdC5HZXRJbWFnZUFzQnl0ZUFycmF5KFBpY3R1cmUpOwotI2Vsc2UKLSAgICAgICAgICAgIHZhciBpYyA9IG5ldyBJbWFnZUNvbnZlcnRlcigpOwotICAgICAgICAgICAgYnl0ZVtdIGltZ0J5dGVzID0gKGJ5dGVbXSlpYy5Db252ZXJ0VG8oUGljdHVyZSwgdHlwZW9mKGJ5dGVbXSkpOwotI2VuZGlmCi0gICAgICAgICAgICB2YXIgaWkgPSBfd3MuV29ya2Jvb2suX3BhY2thZ2UuQWRkSW1hZ2UoaW1nQnl0ZXMsIHVyaVBpYywgY29udGVudFR5cGUpOwotCi0gICAgICAgICAgICByZXR1cm4gQWRkSW1hZ2UoUGljdHVyZSwgaWQsIGlpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgRXhjZWxWbWxEcmF3aW5nUGljdHVyZSBBZGRJbWFnZShJbWFnZSBQaWN0dXJlLCBzdHJpbmcgaWQsIEV4Y2VsUGFja2FnZS5JbWFnZUluZm8gaWkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRvdWJsZSB3aWR0aCA9IFBpY3R1cmUuV2lkdGggKiA3MiAvIFBpY3R1cmUuSG9yaXpvbnRhbFJlc29sdXRpb24sICAgICAgLy9QaXhlbCAtLT4gUG9pbnRzCi0gICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gUGljdHVyZS5IZWlnaHQgKiA3MiAvIFBpY3R1cmUuVmVydGljYWxSZXNvbHV0aW9uOyAgICAgIC8vUGl4ZWwgLS0+IFBvaW50cwotICAgICAgICAgICAgLy9BZGQgVk1MLWRyYXdpbmcgICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBfd3MuSGVhZGVyRm9vdGVyLlBpY3R1cmVzLkFkZChpZCwgaWkuVXJpLCAiIiwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBzdHJpbmcgVmFsaWRhdGVJbWFnZShQaWN0dXJlQWxpZ25tZW50IEFsaWdubWVudCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nIGlkID0gc3RyaW5nLkNvbmNhdChBbGlnbm1lbnQuVG9TdHJpbmcoKVswXSwgX2hmKTsKLSAgICAgICAgICAgIGZvcmVhY2ggKEV4Y2VsVm1sRHJhd2luZ1BpY3R1cmUgaW1hZ2UgaW4gX3dzLkhlYWRlckZvb3Rlci5QaWN0dXJlcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaW1hZ2UuSWQgPT0gaWQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkEgcGljdHVyZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIHNlY3Rpb24iKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9BZGQgdGhlIGltYWdlIHBsYWNlaG9sZGVyIHRvIHRoZSBlbmQgb2YgdGhlIHRleHQKLSAgICAgICAgICAgIHN3aXRjaCAoQWxpZ25tZW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgUGljdHVyZUFsaWdubWVudC5MZWZ0OgotICAgICAgICAgICAgICAgICAgICBMZWZ0QWxpZ25lZFRleHQgKz0gRXhjZWxIZWFkZXJGb290ZXIuSW1hZ2U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUGljdHVyZUFsaWdubWVudC5DZW50ZXJlZDoKLSAgICAgICAgICAgICAgICAgICAgQ2VudGVyZWRUZXh0ICs9IEV4Y2VsSGVhZGVyRm9vdGVyLkltYWdlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBSaWdodEFsaWduZWRUZXh0ICs9IEV4Y2VsSGVhZGVyRm9vdGVyLkltYWdlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBpZDsKLSAgICAgICAgfQogCX0KIAkjZW5kcmVnaW9uCiAKQEAgLTQzMywzNiArMzE4LDYgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gX2ZpcnN0Rm9vdGVyOyAKICAgICAgICAgICAgIH0gCiAgICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBFeGNlbFZtbERyYXdpbmdQaWN0dXJlQ29sbGVjdGlvbiBfdm1sRHJhd2luZ3NIRiA9IG51bGw7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFZtbCBkcmF3aW5ncy4gVW5kZXJsYXlpbmcgb2JqZWN0IGZvciBIZWFkZXIgZm9vdGVyIGltYWdlcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxWbWxEcmF3aW5nUGljdHVyZUNvbGxlY3Rpb24gUGljdHVyZXMKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF92bWxEcmF3aW5nc0hGID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgdm1sTm9kZSA9IF93cy5Xb3Jrc2hlZXRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiZDp3b3Jrc2hlZXQvZDpsZWdhY3lEcmF3aW5nSEYvQHI6aWQiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZtbE5vZGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgX3ZtbERyYXdpbmdzSEYgPSBuZXcgRXhjZWxWbWxEcmF3aW5nUGljdHVyZUNvbGxlY3Rpb24oX3dzLl9wYWNrYWdlLCBfd3MsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF93cy5QYXJ0LlJlbGF0aW9uc2hpcEV4aXN0cyh2bWxOb2RlLlZhbHVlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVsID0gX3dzLlBhcnQuR2V0UmVsYXRpb25zaGlwKHZtbE5vZGUuVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2bWxVcmkgPSBVcmlIZWxwZXIuUmVzb2x2ZVBhcnRVcmkocmVsLlNvdXJjZVVyaSwgcmVsLlRhcmdldFVyaSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm1sRHJhd2luZ3NIRiA9IG5ldyBFeGNlbFZtbERyYXdpbmdQaWN0dXJlQ29sbGVjdGlvbihfd3MuX3BhY2thZ2UsIF93cywgdm1sVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdm1sRHJhd2luZ3NIRi5SZWxJZCA9IHJlbC5JZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX3ZtbERyYXdpbmdzSEY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KIAkJI2VuZHJlZ2lvbgogCQkjcmVnaW9uIFNhdmUgIC8vICBFeGNlbEhlYWRlckZvb3RlcgogCQkvLy8gPHN1bW1hcnk+CkBAIC01MDUsNDAgKzM2MCw2IEBACiAJCQkJfQogCQkJfQogCQl9Ci0gICAgICAgIGludGVybmFsIHZvaWQgU2F2ZUhlYWRlckZvb3RlckltYWdlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfdm1sRHJhd2luZ3NIRiAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfdm1sRHJhd2luZ3NIRi5Db3VudCA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF92bWxEcmF3aW5nc0hGLlVyaSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfd3MuUGFydC5EZWxldGVSZWxhdGlvbnNoaXAoX3ZtbERyYXdpbmdzSEYuUmVsSWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgX3dzLl9wYWNrYWdlLlBhY2thZ2UuRGVsZXRlUGFydChfdm1sRHJhd2luZ3NIRi5VcmkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfdm1sRHJhd2luZ3NIRi5VcmkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgX3ZtbERyYXdpbmdzSEYuVXJpID0gWG1sSGVscGVyLkdldE5ld1VyaShfd3MuX3BhY2thZ2UuUGFja2FnZSwgQCIveGwvZHJhd2luZ3Mvdm1sRHJhd2luZ3swfS52bWwiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoX3ZtbERyYXdpbmdzSEYuUGFydCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfdm1sRHJhd2luZ3NIRi5QYXJ0ID0gX3dzLl9wYWNrYWdlLlBhY2thZ2UuQ3JlYXRlUGFydChfdm1sRHJhd2luZ3NIRi5VcmksICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQudm1sRHJhd2luZyIsIF93cy5fcGFja2FnZS5Db21wcmVzc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVsID0gX3dzLlBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKFVyaUhlbHBlci5HZXRSZWxhdGl2ZVVyaShfd3MuV29ya3NoZWV0VXJpLCBfdm1sRHJhd2luZ3NIRi5VcmkpLCBQYWNrYWdpbmcuVGFyZ2V0TW9kZS5JbnRlcm5hbCwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMgKyAiL3ZtbERyYXdpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIF93cy5TZXRIRkxlZ2FjeURyYXdpbmdSZWwocmVsLklkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIF92bWxEcmF3aW5nc0hGLlJlbElkID0gcmVsLklkOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoRXhjZWxWbWxEcmF3aW5nUGljdHVyZSBkcmF3IGluIF92bWxEcmF3aW5nc0hGKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbCA9IF92bWxEcmF3aW5nc0hGLlBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKFVyaUhlbHBlci5HZXRSZWxhdGl2ZVVyaShfdm1sRHJhd2luZ3NIRi5VcmksIGRyYXcuSW1hZ2VVcmkpLCBQYWNrYWdpbmcuVGFyZ2V0TW9kZS5JbnRlcm5hbCwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMgKyAiL2ltYWdlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhdy5SZWxJZCA9IHJlbC5JZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBfdm1sRHJhd2luZ3NIRi5WbWxEcmF3aW5nWG1sLlNhdmUoX3ZtbERyYXdpbmdzSEYuUGFydC5HZXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CiAJCXByaXZhdGUgc3RyaW5nIEdldFRleHQoRXhjZWxIZWFkZXJGb290ZXJUZXh0IGhlYWRlckZvb3RlcikKIAkJewogCQkJc3RyaW5nIHJldCA9ICIiOwpkaWZmIC0tZ2l0IGEvRVBQbHVzL0V4Y2VsUGFja2FnZS5jcyBiL0VQUGx1cy9FeGNlbFBhY2thZ2UuY3MKaW5kZXggNTU1MzliMC4uYmIyYjk4MyAxMDA2NDQKLS0tIGEvRVBQbHVzL0V4Y2VsUGFja2FnZS5jcworKysgYi9FUFBsdXMvRXhjZWxQYWNrYWdlLmNzCkBAIC00LDcgKzQsNyBAQAogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KICAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS+RsbG1hbgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkBAIC0yNiwyMSArMjYsMTggQEAKICAqIAogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSmFuIEvkbGxtYW4JCSAgICAgICAgICAgICAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQotICogU3Rhcm51dG8gRGkgVG9wbyAmIEphbiBL5GxsbWFuICAgQWRkZWQgc3RyZWFtIGNvbnN0cnVjdG9ycyAKKyAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCisgKiBTdGFybnV0byBEaSBUb3BvICYgSmFuIEvDpGxsbWFuICAgQWRkZWQgc3RyZWFtIGNvbnN0cnVjdG9ycyAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBMb2FkIG1ldGhvZCBTYXZlIGFzIAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtICAgICAgICAgICAgICAgICAgICAgIDIwMTAtMDMtMTQKLSAqIEphbiBL5GxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTI3CisgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMjcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLlhtbDsKIHVzaW5nIFN5c3RlbS5JTzsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeTsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRHJhd2luZzsKIHVzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZy5Jb25pYy5abGliOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRW5jcnlwdGlvbjsKIG5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sCiB7CkBAIC0xNDMsMTQgKzE0MCwxNCBAQAogICAgIC8vLwogICAgIC8vLyAgICAgICAgIC8vIHNldCBzb21lIGRvY3VtZW50IHByb3BlcnRpZXMKICAgICAvLy8gICAgICAgICBwYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuVGl0bGUgPSAiSW52ZXJ0b3J5IjsKLSAgICAvLy8gICAgICAgICBwYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuQXV0aG9yID0gIkphbiBL5GxsbWFuIjsKKyAgICAvLy8gICAgICAgICBwYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuQXV0aG9yID0gIkphbiBL77+9bGxtYW4iOwogICAgIC8vLyAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suUHJvcGVydGllcy5Db21tZW50cyA9ICJUaGlzIHNhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGNyZWF0ZSBhbiBFeGNlbCAyMDA3IHdvcmtib29rIHVzaW5nIEVQUGx1cyI7CiAgICAgLy8vCiAgICAgLy8vICAgICAgICAgLy8gc2V0IHNvbWUgZXh0ZW5kZWQgcHJvcGVydHkgdmFsdWVzCiAgICAgLy8vICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLkNvbXBhbnkgPSAiQWR2ZW50dXJlV29ya3MgSW5jLiI7CiAgICAgLy8vCiAgICAgLy8vICAgICAgICAgLy8gc2V0IHNvbWUgY3VzdG9tIHByb3BlcnR5IHZhbHVlcwotICAgIC8vLyAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suUHJvcGVydGllcy5TZXRDdXN0b21Qcm9wZXJ0eVZhbHVlKCJDaGVja2VkIGJ5IiwgIkphbiBL5GxsbWFuIik7CisgICAgLy8vICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLlNldEN1c3RvbVByb3BlcnR5VmFsdWUoIkNoZWNrZWQgYnkiLCAiSmFuIEvvv71sbG1hbiIpOwogICAgIC8vLyAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suUHJvcGVydGllcy5TZXRDdXN0b21Qcm9wZXJ0eVZhbHVlKCJBc3NlbWJseU5hbWUiLCAiRVBQbHVzIik7CiAgICAgLy8vCiAgICAgLy8vICAgICAgICAgLy8gc2F2ZSBvdXIgbmV3IHdvcmtib29rIGFuZCB3ZSBhcmUgZG9uZSEKQEAgLTI0Myw3ICsyNDAsNiBAQAogICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgRXhjZWxQYWNrYWdlKCkKICAgICAgICAgewotICAgICAgICAgICAgSW5pdCgpOwogICAgICAgICAgICAgQ29uc3RydWN0TmV3RmlsZShudWxsKTsKICAgICAgICAgfQogICAgICAgICAvLy8gPHN1bW1hcnk+CkBAIC0yNTIsNyArMjQ4LDYgQEAKIAkJLy8vIDxwYXJhbSBuYW1lPSJuZXdGaWxlIj5JZiBuZXdGaWxlIGV4aXN0cywgaXQgaXMgb3BlbmVkLiAgT3RoZXJ3aXNlIGl0IGlzIGNyZWF0ZWQgZnJvbSBzY3JhdGNoLjwvcGFyYW0+CiAgICAgICAgIHB1YmxpYyBFeGNlbFBhY2thZ2UoRmlsZUluZm8gbmV3RmlsZSkKIAkJewotICAgICAgICAgICAgSW5pdCgpOwogICAgICAgICAgICAgRmlsZSA9IG5ld0ZpbGU7CiAgICAgICAgICAgICBDb25zdHJ1Y3ROZXdGaWxlKG51bGwpOwogICAgICAgICB9CkBAIC0yNjMsNyArMjU4LDYgQEAKICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwYXNzd29yZCI+UGFzc3dvcmQgZm9yIGFuIGVuY3J5cHRlZCBwYWNrYWdlPC9wYXJhbT4KICAgICAgICAgcHVibGljIEV4Y2VsUGFja2FnZShGaWxlSW5mbyBuZXdGaWxlLCBzdHJpbmcgcGFzc3dvcmQpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEluaXQoKTsKICAgICAgICAgICAgIEZpbGUgPSBuZXdGaWxlOwogICAgICAgICAgICAgQ29uc3RydWN0TmV3RmlsZShwYXNzd29yZCk7CiAgICAgICAgIH0KQEAgLTI3NSw3ICsyNjksNiBAQAogCQkvLy8gPHBhcmFtIG5hbWU9InRlbXBsYXRlIj5UaGUgbmFtZSBvZiB0aGUgRXhjZWwgdGVtcGxhdGUgdG8gdXNlIGFzIHRoZSBiYXNpcyBvZiB0aGUgbmV3IEV4Y2VsIGZpbGU8L3BhcmFtPgogCQlwdWJsaWMgRXhjZWxQYWNrYWdlKEZpbGVJbmZvIG5ld0ZpbGUsIEZpbGVJbmZvIHRlbXBsYXRlKQogCQl7Ci0gICAgICAgICAgICBJbml0KCk7CiAgICAgICAgICAgICBGaWxlID0gbmV3RmlsZTsKICAgICAgICAgICAgIENyZWF0ZUZyb21UZW1wbGF0ZSh0ZW1wbGF0ZSwgbnVsbCk7CiAJCX0KQEAgLTI4OCw3ICsyODEsNiBAQAogICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBhc3N3b3JkIj5QYXNzd29yZCB0byBkZWNyeXB0ZWQgdGhlIHRlbXBsYXRlPC9wYXJhbT4KICAgICAgICAgcHVibGljIEV4Y2VsUGFja2FnZShGaWxlSW5mbyBuZXdGaWxlLCBGaWxlSW5mbyB0ZW1wbGF0ZSwgc3RyaW5nIHBhc3N3b3JkKQogICAgICAgICB7Ci0gICAgICAgICAgICBJbml0KCk7CiAgICAgICAgICAgICBGaWxlID0gbmV3RmlsZTsKICAgICAgICAgICAgIENyZWF0ZUZyb21UZW1wbGF0ZSh0ZW1wbGF0ZSwgcGFzc3dvcmQpOwogICAgICAgICB9CkBAIC0yOTksNyArMjkxLDYgQEAKICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ1c2VTdHJlYW0iPmlmIHRydWUgdXNlIGEgc3RyZWFtLiBJZiBmYWxzZSBjcmVhdGUgYSBmaWxlIGluIHRoZSB0ZW1wIGRpciB3aXRoIGEgcmFuZG9tIG5hbWU8L3BhcmFtPgogICAgICAgICBwdWJsaWMgRXhjZWxQYWNrYWdlKEZpbGVJbmZvIHRlbXBsYXRlLCBib29sIHVzZVN0cmVhbSkKICAgICAgICAgewotICAgICAgICAgICAgSW5pdCgpOwogICAgICAgICAgICAgQ3JlYXRlRnJvbVRlbXBsYXRlKHRlbXBsYXRlLCBudWxsKTsKICAgICAgICAgICAgIGlmICh1c2VTdHJlYW0gPT0gZmFsc2UpCiAgICAgICAgICAgICB7CkBAIC0zMTQsNyArMzA1LDYgQEAKICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwYXNzd29yZCI+UGFzc3dvcmQgdG8gZGVjcnlwdGVkIHRoZSB0ZW1wbGF0ZTwvcGFyYW0+CiAgICAgICAgIHB1YmxpYyBFeGNlbFBhY2thZ2UoRmlsZUluZm8gdGVtcGxhdGUsIGJvb2wgdXNlU3RyZWFtLCBzdHJpbmcgcGFzc3dvcmQpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEluaXQoKTsKICAgICAgICAgICAgIENyZWF0ZUZyb21UZW1wbGF0ZSh0ZW1wbGF0ZSwgcGFzc3dvcmQpOwogICAgICAgICAgICAgaWYgKHVzZVN0cmVhbSA9PSBmYWxzZSkKICAgICAgICAgICAgIHsKQEAgLTMyNyw3ICszMTcsNiBAQAogICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5ld1N0cmVhbSI+VGhlIHN0cmVhbSBvYmplY3QgY2FuIGJlIGVtcHR5IG9yIGNvbnRhaW4gYSBwYWNrYWdlLiBUaGUgc3RyZWFtIG11c3QgYmUgUmVhZC9Xcml0ZTwvcGFyYW0+CiAgICAgICAgIHB1YmxpYyBFeGNlbFBhY2thZ2UoU3RyZWFtIG5ld1N0cmVhbSkgCiAgICAgICAgIHsKLSAgICAgICAgICAgIEluaXQoKTsKICAgICAgICAgICAgIGlmIChuZXdTdHJlYW0uTGVuZ3RoID09IDApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgX3N0cmVhbSA9IG5ld1N0cmVhbTsKQEAgLTM1MCw4ICszMzksNiBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBzdHJlYW0gbXVzdCBiZSByZWFkL3dyaXRlIik7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEluaXQoKTsKICAgICAgICAgICAgIGlmIChuZXdTdHJlYW0uTGVuZ3RoID4gMCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBMb2FkKG5ld1N0cmVhbSxQYXNzd29yZCk7CkBAIC0zODAsNyArMzY3LDYgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgc3RyZWFtIG11c3QgYmUgcmVhZC93cml0ZSIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgSW5pdCgpOwogICAgICAgICAgICAgTG9hZCh0ZW1wbGF0ZVN0cmVhbSwgbmV3U3RyZWFtLCBudWxsKTsKICAgICAgICAgfQogICAgICAgICAvLy8gPHN1bW1hcnk+CkBAIC0zOTksNyArMzg1LDYgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgc3RyZWFtIG11c3QgYmUgcmVhZC93cml0ZSIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgSW5pdCgpOwogICAgICAgICAgICAgTG9hZCh0ZW1wbGF0ZVN0cmVhbSwgbmV3U3RyZWFtLCBQYXNzd29yZCk7CiAgICAgICAgIH0KICAgICAgICAgI2VuZHJlZ2lvbgpAQCAtNDkzLDEzICs0NzgsNiBAQAogICAgICAgICAgICAgcmV0dXJuIHVyaTsKICAgICAgICAgfQogICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJbml0IHZhbHVlcyBoZXJlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgdm9pZCBJbml0KCkKLSAgICAgICAgewotICAgICAgICAgICAgRG9BZGp1c3REcmF3aW5ncyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gQ3JlYXRlIGEgbmV3IGZpbGUgZnJvbSBhIHRlbXBsYXRlCiAgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idGVtcGxhdGUiPkFuIGV4aXN0aW5nIHhsc3ggZmlsZSB0byB1c2UgYXMgYSB0ZW1wbGF0ZTwvcGFyYW0+CkBAIC02NTksMTUgKzYzNyw2IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIChfd29ya2Jvb2spOwogCQkJfQogCQl9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEF1dG9tYXRpY2xseSBhZGp1c3QgZHJhd2luZyBzaXplIHdoZW4gY29sdW1uIHdpZHRoL3JvdyBoZWlnaHQgYXJlIGFkanVzdGVkLCBkZXBlbmRpbmcgb24gdGhlIGRyYXdpbmdzIGVkaXRCeSBwcm9wZXJ0eS4KLSAgICAgICAgLy8vIERlZmF1bHQgVHJ1ZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBEb0FkanVzdERyYXdpbmdzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIHNldDsKLSAgICAgICAgfQogICAgICAgICBwcml2YXRlIFhtbE5hbWVzcGFjZU1hbmFnZXIgQ3JlYXRlRGVmYXVsdE5TTSgpCiAgICAgICAgIHsKICAgICAgICAgICAgIC8vICBDcmVhdGUgYSBOYW1lc3BhY2VNYW5hZ2VyIHRvIGhhbmRsZSB0aGUgZGVmYXVsdCBuYW1lc3BhY2UsIApAQCAtNzA0LDM3ICs2NzMsNiBAQAogICAgICAgICAgICAgUGFja2FnaW5nLlppcFBhY2thZ2VQYXJ0IHBhcnQgPSBfcGFja2FnZS5HZXRQYXJ0KHVyaSk7CiAJCQl4bWxEb2MuU2F2ZShwYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuV3JpdGUpKTsKIAkJfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0JCS8vLyBTYXZlcyB0aGUgWG1sRG9jdW1lbnQgaW50byB0aGUgcGFja2FnZSBhdCB0aGUgc3BlY2lmaWVkIFVyaS4KLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJ1cmkiPlRoZSBVcmkgb2YgdGhlIGNvbXBvbmVudDwvcGFyYW0+Ci0JCS8vLyA8cGFyYW0gbmFtZT0ieG1sRG9jIj5UaGUgWG1sRG9jdW1lbnQgdG8gc2F2ZTwvcGFyYW0+Ci0gICAgICAgIGludGVybmFsIHZvaWQgU2F2ZVdvcmtib29rKFVyaSB1cmksIFhtbERvY3VtZW50IHhtbERvYykKLQkJewotICAgICAgICAgICAgUGFja2FnaW5nLlppcFBhY2thZ2VQYXJ0IHBhcnQgPSBfcGFja2FnZS5HZXRQYXJ0KHVyaSk7Ci0gICAgICAgICAgICBpZihXb3JrYm9vay5WYmFQcm9qZWN0PT1udWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwYXJ0LkNvbnRlbnRUeXBlICE9IGNvbnRlbnRUeXBlV29ya2Jvb2tEZWZhdWx0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGFydCA9IF9wYWNrYWdlLkNyZWF0ZVBhcnQodXJpLCBjb250ZW50VHlwZVdvcmtib29rRGVmYXVsdCwgQ29tcHJlc3Npb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocGFydC5Db250ZW50VHlwZSAhPSBjb250ZW50VHlwZVdvcmtib29rTWFjcm9FbmFibGVkKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIHJlbHMgPSBwYXJ0LkdldFJlbGF0aW9uc2hpcHMoKTsKLSAgICAgICAgICAgICAgICAgICAgX3BhY2thZ2UuRGVsZXRlUGFydCh1cmkpOwotICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gUGFja2FnZS5DcmVhdGVQYXJ0KHVyaSwgY29udGVudFR5cGVXb3JrYm9va01hY3JvRW5hYmxlZCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciByZWwgaW4gcmVscykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgUGFja2FnZS5EZWxldGVSZWxhdGlvbnNoaXAocmVsLklkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKHJlbC5UYXJnZXRVcmksIHJlbC5UYXJnZXRNb2RlLCByZWwuUmVsYXRpb25zaGlwVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0JCQl4bWxEb2MuU2F2ZShwYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuV3JpdGUpKTsKLQkJfQogCiAgICAgICAgICNlbmRyZWdpb24KIApkaWZmIC0tZ2l0IGEvRVBQbHVzL0V4Y2VsUmFuZ2VCYXNlLmNzIGIvRVBQbHVzL0V4Y2VsUmFuZ2VCYXNlLmNzCmluZGV4IDEyM2ZhYTIuLmQzYzNjMjAgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9FeGNlbFJhbmdlQmFzZS5jcworKysgYi9FUFBsdXMvRXhjZWxSYW5nZUJhc2UuY3MKQEAgLTc3NCwxNTkgKzc3NCw2IEBACiAJCQkJcmV0dXJuIEdldEZvcm1hdHRlZFRleHQoZmFsc2UpOwogCQkJfQogCQl9Ci0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFNldCB0aGUgY29sdW1uIHdpZHRoIGZyb20gdGhlIGNvbnRlbnQgb2YgdGhlIHJhbmdlLiBUaGUgbWluaW11bSB3aWR0aCBpcyB0aGUgdmFsdWUgb2YgdGhlIEV4Y2VsV29ya3NoZWV0LmRlZmF1bHRDb2x1bW5XaWR0aCBwcm9wZXJ0eS4KLQkJLy8vIE5vdGU6IENlbGxzIGNvbnRhaW5pbmcgZm9ybXVsYXMgYXJlIGlnbm9yZWQgc2luY2UgRVBQbHVzIGRvbid0IGhhdmUgYSBjYWxjdWxhdGlvbiBlbmdpbmUuCi0JCS8vLyBXcmFwcGVkIGFuZCBtZXJnZWQgY2VsbHMgYXJlIGFsc28gaWdub3JlZC4KLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIHZvaWQgQXV0b0ZpdENvbHVtbnMoKQotCQl7Ci0JCQlBdXRvRml0Q29sdW1ucyhfd29ya3NoZWV0LkRlZmF1bHRDb2xXaWR0aCk7Ci0JCX0KLQotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBTZXQgdGhlIGNvbHVtbiB3aWR0aCBmcm9tIHRoZSBjb250ZW50IG9mIHRoZSByYW5nZS4KLQkJLy8vIE5vdGU6IENlbGxzIGNvbnRhaW5pbmcgZm9ybXVsYXMgYXJlIGlnbm9yZWQgaWYgbm8gY2FsY3VsYXRpb24gaXMgbWFkZS4KLQkJLy8vICAgICAgIFdyYXBwZWQgYW5kIG1lcmdlZCBjZWxscyBhcmUgYWxzbyBpZ25vcmVkLgotCQkvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJlbWFya3M+VGhpcyBtZXRob2Qgd2lsbCBub3Qgd29yayBpZiB5b3UgcnVuIGluIGFuIGVudmlyb25tZW50IHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBHREk8L3JlbWFya3M+Ci0JCS8vLyA8cGFyYW0gbmFtZT0iTWluaW11bVdpZHRoIj5NaW5pbXVtIGNvbHVtbiB3aWR0aDwvcGFyYW0+Ci0JCXB1YmxpYyB2b2lkIEF1dG9GaXRDb2x1bW5zKGRvdWJsZSBNaW5pbXVtV2lkdGgpCi0JCXsKLQkJICAgIEF1dG9GaXRDb2x1bW5zKE1pbmltdW1XaWR0aCwgZG91YmxlLk1heFZhbHVlKTsKLQkJfQotCi0JICAgIC8vLyA8c3VtbWFyeT4KLQkgICAgLy8vIFNldCB0aGUgY29sdW1uIHdpZHRoIGZyb20gdGhlIGNvbnRlbnQgb2YgdGhlIHJhbmdlLgotICAgICAgICAvLy8gTm90ZTogQ2VsbHMgY29udGFpbmluZyBmb3JtdWxhcyBhcmUgaWdub3JlZCBpZiBubyBjYWxjdWxhdGlvbiBpcyBtYWRlLgotICAgICAgICAvLy8gICAgICAgV3JhcHBlZCBhbmQgbWVyZ2VkIGNlbGxzIGFyZSBhbHNvIGlnbm9yZWQuCi0JICAgIC8vLyA8L3N1bW1hcnk+Ci0JICAgIC8vLyA8cGFyYW0gbmFtZT0iTWluaW11bVdpZHRoIj5NaW5pbXVtIGNvbHVtbiB3aWR0aDwvcGFyYW0+Ci0JICAgIC8vLyA8cGFyYW0gbmFtZT0iTWF4aW11bVdpZHRoIj5NYXhpbXVtIGNvbHVtbiB3aWR0aDwvcGFyYW0+Ci0JICAgIHB1YmxpYyB2b2lkIEF1dG9GaXRDb2x1bW5zKGRvdWJsZSBNaW5pbXVtV2lkdGgsIGRvdWJsZSBNYXhpbXVtV2lkdGgpCi0JCXsKLSAgICAgICAgICAgIGlmIChfd29ya3NoZWV0LkRpbWVuc2lvbiA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChfZnJvbUNvbCA8IDEgfHwgX2Zyb21Sb3cgPCAxKQotCQkJewotCQkJCVNldFRvU2VsZWN0ZWRSYW5nZSgpOwotCQkJfQotICAgICAgICAgICAgdmFyIGZvbnRDYWNoZSA9IG5ldyBEaWN0aW9uYXJ5PGludCwgRm9udD4oKTsKLQotCSAgICAgICAgYm9vbCBkb0FkanVzdCA9IF93b3Jrc2hlZXQuX3BhY2thZ2UuRG9BZGp1c3REcmF3aW5nczsKLQkJCV93b3Jrc2hlZXQuX3BhY2thZ2UuRG9BZGp1c3REcmF3aW5ncyA9IGZhbHNlOwotCQkJdmFyIGRyYXdXaWR0aHMgPSBfd29ya3NoZWV0LkRyYXdpbmdzLkdldERyYXdpbmdXaWR0aHMoKTsKLQotCQkJdmFyIGZyb21Db2wgPSBfZnJvbUNvbCA+IF93b3Jrc2hlZXQuRGltZW5zaW9uLl9mcm9tQ29sID8gX2Zyb21Db2wgOiBfd29ya3NoZWV0LkRpbWVuc2lvbi5fZnJvbUNvbDsKLQkJCXZhciB0b0NvbCA9IF90b0NvbCA8IF93b3Jrc2hlZXQuRGltZW5zaW9uLl90b0NvbCA/IF90b0NvbCA6IF93b3Jrc2hlZXQuRGltZW5zaW9uLl90b0NvbDsKLQkJCWlmIChBZGRyZXNzZXMgPT0gbnVsbCkKLQkJCXsKLQkJCQlTZXRNaW5XaWR0aChNaW5pbXVtV2lkdGgsIGZyb21Db2wsIHRvQ29sKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlmb3JlYWNoICh2YXIgYWRkciBpbiBBZGRyZXNzZXMpCi0JCQkJewotCQkJCQlmcm9tQ29sID0gYWRkci5fZnJvbUNvbCA+IF93b3Jrc2hlZXQuRGltZW5zaW9uLl9mcm9tQ29sID8gYWRkci5fZnJvbUNvbCA6IF93b3Jrc2hlZXQuRGltZW5zaW9uLl9mcm9tQ29sOwotCQkJCQl0b0NvbCA9IGFkZHIuX3RvQ29sIDwgX3dvcmtzaGVldC5EaW1lbnNpb24uX3RvQ29sID8gYWRkci5fdG9Db2wgOiBfd29ya3NoZWV0LkRpbWVuc2lvbi5fdG9Db2w7Ci0gICAgICAgICAgICAgICAgICAgIFNldE1pbldpZHRoKE1pbmltdW1XaWR0aCwgZnJvbUNvbCwgdG9Db2wpOwotICAgICAgICAgICAgICAgIH0KLQkJCX0KLQotCQkJLy9HZXQgYW55IGF1dG9maWx0ZXIgdG8gd2lkZW4gdGhlc2UgY29sdW1ucwotCQkJdmFyIGFmQWRkciA9IG5ldyBMaXN0PEV4Y2VsQWRkcmVzc0Jhc2U+KCk7Ci0JCQlpZiAoX3dvcmtzaGVldC5BdXRvRmlsdGVyQWRkcmVzcyAhPSBudWxsKQotCQkJewotCQkJCWFmQWRkci5BZGQobmV3IEV4Y2VsQWRkcmVzc0Jhc2UoICAgIF93b3Jrc2hlZXQuQXV0b0ZpbHRlckFkZHJlc3MuX2Zyb21Sb3csCi0JCQkJCQkJCQkJCQkJX3dvcmtzaGVldC5BdXRvRmlsdGVyQWRkcmVzcy5fZnJvbUNvbCwKLQkJCQkJCQkJCQkJCQlfd29ya3NoZWV0LkF1dG9GaWx0ZXJBZGRyZXNzLl9mcm9tUm93LAotCQkJCQkJCQkJCQkJCV93b3Jrc2hlZXQuQXV0b0ZpbHRlckFkZHJlc3MuX3RvQ29sKSk7Ci0JCQkJYWZBZGRyW2FmQWRkci5Db3VudCAtIDFdLl93cyA9IFdvcmtTaGVldDsKLQkJCX0KLQkJCWZvcmVhY2ggKHZhciB0YmwgaW4gX3dvcmtzaGVldC5UYWJsZXMpCi0JCQl7Ci0JCQkJaWYgKHRibC5BdXRvRmlsdGVyQWRkcmVzcyAhPSBudWxsKQotCQkJCXsKLQkJCQkJYWZBZGRyLkFkZChuZXcgRXhjZWxBZGRyZXNzQmFzZSh0YmwuQXV0b0ZpbHRlckFkZHJlc3MuX2Zyb21Sb3csCi0JCQkJCQkJCQkJCQkJCQkJCQkJdGJsLkF1dG9GaWx0ZXJBZGRyZXNzLl9mcm9tQ29sLAotCQkJCQkJCQkJCQkJCQkJCQkJCXRibC5BdXRvRmlsdGVyQWRkcmVzcy5fZnJvbVJvdywKLQkJCQkJCQkJCQkJCQkJCQkJCQl0YmwuQXV0b0ZpbHRlckFkZHJlc3MuX3RvQ29sKSk7Ci0JCQkJCWFmQWRkclthZkFkZHIuQ291bnQgLSAxXS5fd3MgPSBXb3JrU2hlZXQ7Ci0JCQkJfQotCQkJfQotCi0JCQl2YXIgc3R5bGVzID0gX3dvcmtzaGVldC5Xb3JrYm9vay5TdHlsZXM7Ci0JCQl2YXIgbmYgPSBzdHlsZXMuRm9udHNbc3R5bGVzLkNlbGxYZnNbMF0uRm9udElkXTsKLQkJCXZhciBmcyA9IEZvbnRTdHlsZS5SZWd1bGFyOwotCQkJaWYgKG5mLkJvbGQpIGZzIHw9IEZvbnRTdHlsZS5Cb2xkOwotCQkJaWYgKG5mLlVuZGVyTGluZSkgZnMgfD0gRm9udFN0eWxlLlVuZGVybGluZTsKLQkJCWlmIChuZi5JdGFsaWMpIGZzIHw9IEZvbnRTdHlsZS5JdGFsaWM7Ci0JCQlpZiAobmYuU3RyaWtlKSBmcyB8PSBGb250U3R5bGUuU3RyaWtlb3V0OwotCQkJdmFyIG5mb250ID0gbmV3IEZvbnQobmYuTmFtZSwgbmYuU2l6ZSwgZnMpOwotICAgICAgICAgICAgCi0JCQl1c2luZyAodmFyIGIgPSBuZXcgQml0bWFwKDEsIDEpKQotCQkJewotCQkJCXVzaW5nICh2YXIgZyA9IEdyYXBoaWNzLkZyb21JbWFnZShiKSkKLQkJCQl7Ci0gICAgICAgICAgICAgICAgICAgIGcuUGFnZVVuaXQgPSBHcmFwaGljc1VuaXQuUGl4ZWw7Ci0gICAgICAgICAgICAgICAgICAgIHZhciBub3JtYWxTaXplID0gKGZsb2F0KU1hdGguVHJ1bmNhdGUoZy5NZWFzdXJlU3RyaW5nKCIwMCIsIG5mb250LCAxMDAwMCwgU3RyaW5nRm9ybWF0LkdlbmVyaWNUeXBvZ3JhcGhpYykuV2lkdGggLSBnLk1lYXN1cmVTdHJpbmcoIjAiLCBuZm9udCwgMTAwMDAsIFN0cmluZ0Zvcm1hdC5HZW5lcmljVHlwb2dyYXBoaWMpLldpZHRoKTsKLQkJCQkJZm9yZWFjaCAodmFyIGNlbGwgaW4gdGhpcykKLQkJCQkJewotCQkJCQkJaWYgKGNlbGwuTWVyZ2UgPT0gdHJ1ZSB8fCBjZWxsLlN0eWxlLldyYXBUZXh0KSBjb250aW51ZTsKLQkJCQkJCXZhciBmbnRJRCA9IHN0eWxlcy5DZWxsWGZzW2NlbGwuU3R5bGVJRF0uRm9udElkOwotCQkJCQkgICAgRm9udCBmOwotCQkJCQkgICAgaWYgKGZvbnRDYWNoZS5Db250YWluc0tleShmbnRJRCkpCi0JCQkJCQl7Ci0JCQkJCQkJZiA9IGZvbnRDYWNoZVtmbnRJRF07Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJdmFyIGZudCA9IHN0eWxlcy5Gb250c1tmbnRJRF07Ci0JCQkJCQkJZnMgPSBGb250U3R5bGUuUmVndWxhcjsKLQkJCQkJCQlpZiAoZm50LkJvbGQpIGZzIHw9IEZvbnRTdHlsZS5Cb2xkOwotCQkJCQkJCWlmIChmbnQuVW5kZXJMaW5lKSBmcyB8PSBGb250U3R5bGUuVW5kZXJsaW5lOwotCQkJCQkJCWlmIChmbnQuSXRhbGljKSBmcyB8PSBGb250U3R5bGUuSXRhbGljOwotCQkJCQkJCWlmIChmbnQuU3RyaWtlKSBmcyB8PSBGb250U3R5bGUuU3RyaWtlb3V0OwotCQkJCQkJCWYgPSBuZXcgRm9udChmbnQuTmFtZSwgZm50LlNpemUsIGZzKTsKLQkJCQkJCQlmb250Q2FjaGUuQWRkKGZudElELCBmKTsKLQkJCQkJCX0KLQotCQkJCQkJLy9UcnVuY2F0ZSgoe3BpeGVsc30tNSkve01heGltdW0gRGlnaXQgV2lkdGh9ICogMTAwKzAuNSkvMTAwCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaXplID0gZy5NZWFzdXJlU3RyaW5nKGNlbGwuVGV4dEZvcldpZHRoLCBmLCAxMDAwMCwgU3RyaW5nRm9ybWF0LkdlbmVyaWNUeXBvZ3JhcGhpYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgciA9IHN0eWxlcy5DZWxsWGZzW2NlbGwuU3R5bGVJRF0uVGV4dFJvdGF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPD0gMCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAoc2l6ZS5XaWR0aCArIDUpIC8gbm9ybWFsU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gKHIgPD0gOTAgPyByIDogciAtIDkwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9ICgoKHNpemUuV2lkdGggLSBzaXplLkhlaWdodCkgKiBNYXRoLkFicyhTeXN0ZW0uTWF0aC5Db3MoU3lzdGVtLk1hdGguUEkgKiByIC8gMTgwLjApKSArIHNpemUuSGVpZ2h0KSArIDUpIC8gbm9ybWFsU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotCQkJCQkJZm9yZWFjaCAodmFyIGEgaW4gYWZBZGRyKQotCQkJCQkJewotCQkJCQkJCWlmIChhLkNvbGxpZGUoY2VsbCkgIT0gZUFkZHJlc3NDb2xsaXRpb24uTm8pCi0JCQkJCQkJewotCQkJCQkJCQl3aWR0aCArPSAyLjI1OwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmICh3aWR0aCA+IF93b3Jrc2hlZXQuQ29sdW1uKGNlbGwuX2Zyb21Db2wpLldpZHRoKQotCQkJCQkJewotCQkJCQkJCV93b3Jrc2hlZXQuQ29sdW1uKGNlbGwuX2Zyb21Db2wpLldpZHRoID0gd2lkdGggPiBNYXhpbXVtV2lkdGggPyBNYXhpbXVtV2lkdGggOiB3aWR0aDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCV93b3Jrc2hlZXQuRHJhd2luZ3MuQWRqdXN0V2lkdGgoZHJhd1dpZHRocyk7Ci0JCQlfd29ya3NoZWV0Ll9wYWNrYWdlLkRvQWRqdXN0RHJhd2luZ3MgPSBkb0FkanVzdDsKLQkJfQogCiAgICAgICAgIHByaXZhdGUgdm9pZCBTZXRNaW5XaWR0aChkb3VibGUgbWluaW11bVdpZHRoLCBpbnQgZnJvbUNvbCwgaW50IHRvQ29sKQogICAgICAgICB7CmRpZmYgLS1naXQgYS9FUFBsdXMvRXhjZWxSb3cuY3MgYi9FUFBsdXMvRXhjZWxSb3cuY3MKaW5kZXggMGNjMmQxZi4uMThlYWYzNCAxMDA2NDQKLS0tIGEvRVBQbHVzL0V4Y2VsUm93LmNzCisrKyBiL0VQUGx1cy9FeGNlbFJvdy5jcwpAQCAtNCw3ICs0LDcgQEAKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCiAgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgogICoKLSAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvkbGxtYW4KKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvvv71sbG1hbgogICoKICAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKQEAgLTI2LDggKzI2LDggQEAKICAqIAogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSmFuIEvkbGxtYW4JCSAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQotICogSmFuIEvkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTI3CisgKiBKYW4gS++/vWxsbWFuCQkgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKKyAqIEphbiBL77+9bGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdXNpbmcgU3lzdGVtOwpAQCAtMTQ0LDE2ICsxNDQsNyBAQAogICAgICAgICAgICAgc2V0CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdmFyIHIgPSBHZXRSb3dJbnRlcm5hbCgpOwotICAgICAgICAgICAgICAgIGlmIChfd29ya3NoZWV0Ll9wYWNrYWdlLkRvQWRqdXN0RHJhd2luZ3MpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgcG9zID0gX3dvcmtzaGVldC5EcmF3aW5ncy5HZXREcmF3aW5nV2lkdGhzKCk7Ci0gICAgICAgICAgICAgICAgICAgIHIuSGVpZ2h0ID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIF93b3Jrc2hlZXQuRHJhd2luZ3MuQWRqdXN0SGVpZ2h0KHBvcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHIuSGVpZ2h0ID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHIuSGVpZ2h0ID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgaWYgKHIuSGlkZGVuICYmIHZhbHVlICE9IDApCiAgICAgICAgICAgICAgICAgewpkaWZmIC0tZ2l0IGEvRVBQbHVzL0V4Y2VsV29ya2Jvb2suY3MgYi9FUFBsdXMvRXhjZWxXb3JrYm9vay5jcwppbmRleCAwZTFhMDIyLi5lNDdiNzkxIDEwMDY0NAotLS0gYS9FUFBsdXMvRXhjZWxXb3JrYm9vay5jcworKysgYi9FUFBsdXMvRXhjZWxXb3JrYm9vay5jcwpAQCAtNCw3ICs0LDcgQEAKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCiAgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgogICoKLSAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvkbGxtYW4KKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwpAQCAtMjYsOCArMjYsOCBAQAogICogCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBKYW4gS+RsbG1hbgkJICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgIDIwMTEtMDEtMDEKLSAqIEphbiBL5GxsbWFuCQkgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0yNworICogSmFuIEvDpGxsbWFuCQkgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgMjAxMS0wMS0wMQorICogSmFuIEvDpGxsbWFuCQkgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0yNwogICogUmljaGFyZCBUYWxsZW50CQlGaXggZXNjYXBpbmcgb2YgcXVvdGVzCQkJCQkyMDEyLTEwLTMxCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHVzaW5nIFN5c3RlbTsKQEAgLTM3LDcgKzM3LDYgQEAKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKLXVzaW5nIE9mZmljZU9wZW5YbWwuVkJBOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKQEAgLTQzMyw0NSArNDMyLDcgQEAKIAkJCQlyZXR1cm4gX3ZpZXc7CiAJCQl9CiAJCX0KLSAgICAgICAgRXhjZWxWYmFQcm9qZWN0IF92YmEgPSBudWxsOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBIHJlZmVyZW5jZSB0byB0aGUgVkJBIHByb2plY3QuCi0gICAgICAgIC8vLyBOdWxsIGlmIG5vIHByb2plY3QgZXhpc3RzLgotICAgICAgICAvLy8gVXNlIFdvcmtib29rLkNyZWF0ZVZCQVByb2plY3QgdG8gY3JlYXRlIGEgbmV3IFZCQS1Qcm9qZWN0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFZiYVByb2plY3QgVmJhUHJvamVjdAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX3ZiYSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoX3BhY2thZ2UuUGFja2FnZS5QYXJ0RXhpc3RzKG5ldyBVcmkoRXhjZWxWYmFQcm9qZWN0LlBhcnRVcmksIFVyaUtpbmQuUmVsYXRpdmUpKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgX3ZiYSA9IG5ldyBFeGNlbFZiYVByb2plY3QodGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF92YmE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDcmVhdGUgYW4gZW1wdHkgVkJBIHByb2plY3QuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyB2b2lkIENyZWF0ZVZCQVByb2plY3QoKQotICAgICAgICB7Ci0jaWYgIU1PTk8KLSAgICAgICAgICAgIGlmIChfdmJhICE9IG51bGwgfHwgX3BhY2thZ2UuUGFja2FnZS5QYXJ0RXhpc3RzKG5ldyBVcmkoRXhjZWxWYmFQcm9qZWN0LlBhcnRVcmksIFVyaUtpbmQuUmVsYXRpdmUpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlZCQSBwcm9qZWN0IGFscmVhZHkgZXhpc3RzLiIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgX3ZiYSA9IG5ldyBFeGNlbFZiYVByb2plY3QodGhpcyk7Ci0gICAgICAgICAgICBfdmJhLkNyZWF0ZSgpOwotI2VuZGlmCi0jaWYgTU9OTwotICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiQ3JlYXRpbmcgYSBWQkEgcHJvamVjdCBpcyBub3Qgc3VwcG9ydGVkIHVuZGVyIE1vbm8uIik7Ci0jZW5kaWYKLQkJCQl9CisgICAgICAgIAogCQkvLy8gPHN1bW1hcnk+CiAJCS8vLyBVUkkgdG8gdGhlIHdvcmtib29rIGluc2lkZSB0aGUgcGFja2FnZQogCQkvLy8gPC9zdW1tYXJ5PgpAQCAtNTIxLDIwICs0ODIsNiBAQAogICAgICAgICB7CiAgICAgICAgICAgICBDb2RlTW9kdWxlTmFtZSA9IHZhbHVlOwogICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBWQkEuRXhjZWxWQkFNb2R1bGUgQ29kZU1vZHVsZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoVmJhUHJvamVjdCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZiYVByb2plY3QuTW9kdWxlc1tDb2RlTW9kdWxlTmFtZV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQogCiAgICAgICAgIGNvbnN0IHN0cmluZyBkYXRlMTkwNFBhdGggPSAiZDp3b3JrYm9va1ByL0BkYXRlMTkwNCI7CiAgICAgICAgIGludGVybmFsIGNvbnN0IGRvdWJsZSBkYXRlMTkwNE9mZnNldCA9IDM2NS41ICogNDsgIC8vIG9mZnNldCB0byBmaXggMTkwMCBhbmQgMTkwNCBkaWZmZXJlbmNlcywgNCBPTEUgeWVhcnMKQEAgLTc2Miw3ICs3MDksOCBAQAogCiAJCQlEZWxldGVDYWxjQ2hhaW4oKTsKIAotICAgICAgICAgICAgaWYgKF92YmEgPT0gbnVsbCAmJiAhX3BhY2thZ2UuUGFja2FnZS5QYXJ0RXhpc3RzKG5ldyBVcmkoRXhjZWxWYmFQcm9qZWN0LlBhcnRVcmksIFVyaUtpbmQuUmVsYXRpdmUpKSkKKwkJCWNvbnN0IHN0cmluZyB2YmFQYXJ0VXJpID0gIi94bC92YmFQcm9qZWN0LmJpbiI7CisgICAgICAgICAgICBpZiAoIV9wYWNrYWdlLlBhY2thZ2UuUGFydEV4aXN0cyhuZXcgVXJpKHZiYVBhcnRVcmksIFVyaUtpbmQuUmVsYXRpdmUpKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAoUGFydC5Db250ZW50VHlwZSAhPSBFeGNlbFBhY2thZ2UuY29udGVudFR5cGVXb3JrYm9va0RlZmF1bHQpCiAgICAgICAgICAgICAgICAgewpAQCAtODE0LDE1ICs3NjIsNiBAQAogCQkJCiAJCQkvLyBEYXRhIHZhbGlkYXRpb24KIAkJCVZhbGlkYXRlRGF0YVZhbGlkYXRpb25zKCk7Ci0KLSAgICAgICAgICAgIC8vVkJBCi0gICAgICAgICAgICBpZiAoX3ZiYSE9bnVsbCkKLSAgICAgICAgICAgIHsKLSNpZiAhTU9OTwotICAgICAgICAgICAgICAgIFZiYVByb2plY3QuU2F2ZSgpOwotI2VuZGlmCi0gICAgICAgICAgICB9Ci0KIAkJfQogCQlwcml2YXRlIHZvaWQgRGVsZXRlQ2FsY0NoYWluKCkKIAkJewpAQCAtMTA5Niw3ICsxMDM1LDYgQEAKICAgICAgICAgICAgICAgICBfc2hhcmVkU3RyaW5nc0xpc3QuQ2xlYXIoKTsKICAgICAgICAgICAgICAgICBfc2hhcmVkU3RyaW5nc0xpc3QgPSBudWxsOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgX3ZiYSA9IG51bGw7CiAgICAgICAgICAgICBpZiAoX3dvcmtzaGVldHMgIT0gbnVsbCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBfd29ya3NoZWV0cy5EaXNwb3NlKCk7CmRpZmYgLS1naXQgYS9FUFBsdXMvRXhjZWxXb3Jrc2hlZXQuY3MgYi9FUFBsdXMvRXhjZWxXb3Jrc2hlZXQuY3MKaW5kZXggNjc5OTRkZC4uNmVlM2RkMSAxMDA2NDQKLS0tIGEvRVBQbHVzL0V4Y2VsV29ya3NoZWV0LmNzCisrKyBiL0VQUGx1cy9FeGNlbFdvcmtzaGVldC5jcwpAQCAtMzQsMTUgKzM0LDkgQEAKIHVzaW5nIFN5c3RlbS5YbWw7CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5JTzsKLXVzaW5nIFN5c3RlbS5Db25maWd1cmF0aW9uOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5EcmF3aW5nOwotdXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTG9naWNhbDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7CiB1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKIHVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgU3lzdGVtLlNlY3VyaXR5OwotdXNpbmcgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZS5YbWxBY2Nlc3M7CiB1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuVm1sOwpAQCAtNTIsMTEgKzQ2LDkgQEAKIHVzaW5nIFN5c3RlbS5Db21wb25lbnRNb2RlbDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKLXVzaW5nIElvbmljLlppcDsKLXVzaW5nIElyb25Tb2Z0d2FyZS5EcmF3aW5nOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcuSW9uaWMuWmlwOworICAKIG5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sCiB7CiAgICAgLy8vIDxzdW1tYXJ5PgpAQCAtOTAsMjMgKzgyLDEwIEBACiAgICAgLy8vIDwvc3VtbWFyeT4KICAgICBwdWJsaWMgY2xhc3MgRXhjZWxDaGFydHNoZWV0IDogRXhjZWxXb3Jrc2hlZXQKICAgICB7Ci0gICAgICAgIC8vRXhjZWxEcmF3aW5ncyBkcmF3czsKLSAgICAgICAgcHVibGljIEV4Y2VsQ2hhcnRzaGVldChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBFeGNlbFBhY2thZ2UgcGNrLCBzdHJpbmcgcmVsSUQsIFVyaSB1cmlXb3Jrc2hlZXQsIHN0cmluZyBzaGVldE5hbWUsIGludCBzaGVldElELCBpbnQgcG9zaXRpb25JRCwgZVdvcmtTaGVldEhpZGRlbiBoaWRkZW4sIGVDaGFydFR5cGUgY2hhcnRUeXBlKSA6Ci0gICAgICAgICAgICBiYXNlKG5zLCBwY2ssIHJlbElELCB1cmlXb3Jrc2hlZXQsIHNoZWV0TmFtZSwgc2hlZXRJRCwgcG9zaXRpb25JRCwgaGlkZGVuKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLkRyYXdpbmdzLkFkZENoYXJ0KCJDaGFydCAxIiwgY2hhcnRUeXBlKTsKLSAgICAgICAgfQogICAgICAgICBwdWJsaWMgRXhjZWxDaGFydHNoZWV0KFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsIEV4Y2VsUGFja2FnZSBwY2ssIHN0cmluZyByZWxJRCwgVXJpIHVyaVdvcmtzaGVldCwgc3RyaW5nIHNoZWV0TmFtZSwgaW50IHNoZWV0SUQsIGludCBwb3NpdGlvbklELCBlV29ya1NoZWV0SGlkZGVuIGhpZGRlbikgOgogICAgICAgICAgICAgYmFzZShucywgcGNrLCByZWxJRCwgdXJpV29ya3NoZWV0LCBzaGVldE5hbWUsIHNoZWV0SUQsIHBvc2l0aW9uSUQsIGhpZGRlbikKICAgICAgICAgewogICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBFeGNlbENoYXJ0IENoYXJ0IAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEV4Y2VsQ2hhcnQpRHJhd2luZ3NbMF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICB9CiAgICAgLy8vIDxzdW1tYXJ5PgogCS8vLyBSZXByZXNlbnRzIGFuIEV4Y2VsIHdvcmtzaGVldCBhbmQgcHJvdmlkZXMgYWNjZXNzIHRvIGl0cyBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzCkBAIC03MTQsMjggKzY5Myw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgY29uc3Qgc3RyaW5nIHRhYkNvbG9yUGF0aCA9ICJkOnNoZWV0UHIvZDp0YWJDb2xvci9AcmdiIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29sb3Igb2YgdGhlIHNoZWV0IHRhYgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgQ29sb3IgVGFiQ29sb3IKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIGNvbCA9IEdldFhtbE5vZGVTdHJpbmcodGFiQ29sb3JQYXRoKTsKLSAgICAgICAgICAgICAgICBpZiAoY29sID09ICIiKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbG9yLkVtcHR5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29sb3IuRnJvbUFyZ2IoaW50LlBhcnNlKGNvbCwgU3lzdGVtLkdsb2JhbGl6YXRpb24uTnVtYmVyU3R5bGVzLkFsbG93SGV4U3BlY2lmaWVyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyh0YWJDb2xvclBhdGgsIHZhbHVlLlRvQXJnYigpLlRvU3RyaW5nKCJYIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9CiAgICAgICAgIGNvbnN0IHN0cmluZyBjb2RlTW9kdWxlTmFtZVBhdGggPSAiZDpzaGVldFByL0Bjb2RlTmFtZSI7CiAgICAgICAgIGludGVybmFsIHN0cmluZyBDb2RlTW9kdWxlTmFtZQogICAgICAgICB7CkBAIC03NTIsMjAgKzcwOSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIENvZGVNb2R1bGVOYW1lID0gdmFsdWU7CiAgICAgICAgIH0KLSAgICAgICAgcHVibGljIFZCQS5FeGNlbFZCQU1vZHVsZSBDb2RlTW9kdWxlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfcGFja2FnZS5Xb3JrYm9vay5WYmFQcm9qZWN0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3BhY2thZ2UuV29ya2Jvb2suVmJhUHJvamVjdC5Nb2R1bGVzW0NvZGVNb2R1bGVOYW1lXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisKICAgICAgICAgI3JlZ2lvbiBXb3Jrc2hlZXRYbWwKIAkJLy8vIDxzdW1tYXJ5PgogCQkvLy8gVGhlIFhNTCBkb2N1bWVudCBob2xkaW5nIHRoZSB3b3Jrc2hlZXQgZGF0YS4KQEAgLTgzOCw4ICs3ODIsNiBAQAogICAgICAgICAgICAgc3RyaW5nIHhtbCA9ICIiOwogCiAgICAgICAgICAgICAvLyBGaXJzdCBDb2x1bW5zLCByb3dzLCBjZWxscywgbWVyZ2VjZWxscywgaHlwZXJsaW5rcyBhbmQgcGFnZWJyZWFrZXMgYXJlIGxvYWRlZCBmcm9tIGEgeG1sc3RyZWFtIHRvIG9wdGltaXplIHNwZWVkLi4uCi0gICAgICAgICAgICBib29sIGRvQWRqdXN0ID0gX3BhY2thZ2UuRG9BZGp1c3REcmF3aW5nczsKLSAgICAgICAgICAgIF9wYWNrYWdlLkRvQWRqdXN0RHJhd2luZ3MgPSBmYWxzZTsKICAgICAgICAgICAgIFN0cmVhbSBzdHJlYW0gPSBwYWNrUGFydC5HZXRTdHJlYW0oKTsKIAogICAgICAgICAgICAgWG1sVGV4dFJlYWRlciB4ciA9IG5ldyBYbWxUZXh0UmVhZGVyKHN0cmVhbSk7CkBAIC04NjUsNyArODA3LDYgQEAKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBMb2FkWG1sU2FmZShfd29ya3NoZWV0WG1sLCB4bWwsIGVuY29kaW5nKTsKIAotICAgICAgICAgICAgX3BhY2thZ2UuRG9BZGp1c3REcmF3aW5ncyA9IGRvQWRqdXN0OwogICAgICAgICAgICAgQ2xlYXJOb2RlcygpOwogICAgICAgICB9CiAgICAgICAgIC8vLyA8c3VtbWFyeT4KQEAgLTI5MzAsNDIgKzI4NzEsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlNldFhtbE5vZGVTdHJpbmcoImQ6ZGltZW5zaW9uL0ByZWYiLCBkLkFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSGFzRHJhd2luZ3MoKSB8fCBEcmF3aW5ncy5Db3VudCA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVtb3ZlIG5vZGUgaWYgbm8gZHJhd2luZ3MgZXhpc3RzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZU5vZGUoImQ6ZHJhd2luZyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCisgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmVDb21tZW50cygpOwotICAgICAgICAgICAgICAgICAgICAgICAgSGVhZGVyRm9vdGVyLlNhdmVIZWFkZXJGb290ZXJJbWFnZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmVUYWJsZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmVQaXZvdFRhYmxlcygpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKERyYXdpbmdzLlVyaURyYXdpbmchPW51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoRHJhd2luZ3MuQ291bnQgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJ0LkRlbGV0ZVJlbGF0aW9uc2hpcChEcmF3aW5ncy5fZHJhd2luZ1JlbGF0aW9uLklkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9wYWNrYWdlLlBhY2thZ2UuRGVsZXRlUGFydChEcmF3aW5ncy5VcmlEcmF3aW5nKTsgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgUGFja2FnaW5nLlppcFBhY2thZ2VQYXJ0IHBhcnRQYWNrID0gRHJhd2luZ3MuUGFydDsKLSAgICAgICAgICAgICAgICAgICAgICAgIERyYXdpbmdzLkRyYXdpbmdYbWwuU2F2ZShwYXJ0UGFjay5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLldyaXRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChFeGNlbERyYXdpbmcgZCBpbiBEcmF3aW5ncykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCBpcyBFeGNlbENoYXJ0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZWxDaGFydCBjID0gKEV4Y2VsQ2hhcnQpZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5DaGFydFhtbC5TYXZlKGMuUGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLldyaXRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGludGVybmFsIHZvaWQgU2F2ZUhhbmRsZXIoWmlwT3V0cHV0U3RyZWFtIHN0cmVhbSwgQ29tcHJlc3Npb25MZXZlbCBjb21wcmVzc2lvbkxldmVsLCBzdHJpbmcgZmlsZU5hbWUpCiAgICAgICAgIHsKQEAgLTQwNDMsMzAgKzM5NTQsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBfcHJvdGVjdGVkUmFuZ2VzOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgI3JlZ2lvbiBEcmF3aW5nCi0gICAgICAgIEV4Y2VsRHJhd2luZ3MgX2RyYXdpbmdzID0gbnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29sbGVjdGlvbiBvZiBkcmF3aW5nLW9iamVjdHMgbGlrZSBzaGFwZXMsIGltYWdlcyBhbmQgY2hhcnRzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbERyYXdpbmdzIERyYXdpbmdzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfZHJhd2luZ3MgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9kcmF3aW5ncyA9IG5ldyBFeGNlbERyYXdpbmdzKF9wYWNrYWdlLCB0aGlzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9kcmF3aW5nczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sIEhhc0RyYXdpbmdzKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChfZHJhd2luZ3MgIT0gbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICAjZW5kcmVnaW9uCisgICAgICAgIAogICAgICAgICBFeGNlbFRhYmxlQ29sbGVjdGlvbiBfdGFibGVzID0gbnVsbDsKICAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gVGFibGVzIGRlZmluZWQgaW4gdGhlIHdvcmtzaGVldC4KQEAgLTQxMzcsMjEgKzQwMjUsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBfZGF0YVZhbGlkYXRpb247CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgRXhjZWxCYWNrZ3JvdW5kSW1hZ2UgX2JhY2tncm91bmRJbWFnZSA9IG51bGw7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFuIGltYWdlIGRpc3BsYXllZCBhcyB0aGUgYmFja2dyb3VuZCBvZiB0aGUgd29ya3NoZWV0LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxCYWNrZ3JvdW5kSW1hZ2UgQmFja2dyb3VuZEltYWdlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfYmFja2dyb3VuZEltYWdlID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfYmFja2dyb3VuZEltYWdlID0gbmV3IEV4Y2VsQmFja2dyb3VuZEltYWdlKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIHRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX2JhY2tncm91bmRJbWFnZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorCiAgICAgICAgIC8vLyA8c3VtbWFyeT4KIAkJLy8vIFJldHVybnMgdGhlIHN0eWxlIElEIGdpdmVuIGEgc3R5bGUgbmFtZS4gIAogCQkvLy8gVGhlIHN0eWxlIElEIHdpbGwgYmUgY3JlYXRlZCBpZiBub3QgZm91bmQsIGJ1dCBvbmx5IGlmIHRoZSBzdHlsZSBuYW1lIGV4aXN0cyEKQEAgLTQzNDcsNyArNDIyMSw2IEBACiAgICAgICAgICAgICBfdm1sRHJhd2luZ3MgPSBudWxsOwogICAgICAgICAgICAgX2NvbmRpdGlvbmFsRm9ybWF0dGluZyA9IG51bGw7CiAgICAgICAgICAgICBfZGF0YVZhbGlkYXRpb24gPSBudWxsOwotICAgICAgICAgICAgX2RyYXdpbmdzID0gbnVsbDsKICAgICAgICAgfQogCiAgICAgICAgIC8vLyA8c3VtbWFyeT4KZGlmZiAtLWdpdCBhL0VQUGx1cy9FeGNlbFdvcmtzaGVldHMuY3MgYi9FUFBsdXMvRXhjZWxXb3Jrc2hlZXRzLmNzCmluZGV4IGVmMTNlYWEuLjQ3NWFmNTggMTAwNjQ0Ci0tLSBhL0VQUGx1cy9FeGNlbFdvcmtzaGVldHMuY3MKKysrIGIvRVBQbHVzL0V4Y2VsV29ya3NoZWV0cy5jcwpAQCAtNCw3ICs0LDcgQEAKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCiAgKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgogICoKLSAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvvv71sbG1hbgorICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkBAIC0yNiwyNiArMjYsMTYgQEAKICAqIAogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSmFuIEvvv71sbG1hbgkJICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgIDIwMDktMTAtMDEKLSAqIEphbiBL77+9bGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTI3CisgKiBKYW4gS8OkbGxtYW4JCSAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAyMDA5LTEwLTAxCisgKiBKYW4gS8OkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YbWw7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIFN5c3RlbS5YbWw7CiB1c2luZyBTeXN0ZW0uSU87CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkxvZ2ljYWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5EcmF3aW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLkNoYXJ0OwotdXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZS5YbWxBY2Nlc3M7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuVm1sOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcuSW9uaWMuWmxpYjsKIHVzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlZCQTsKIG5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sCiB7CiAJLy8vIDxzdW1tYXJ5PgpAQCAtMTQ4LDExICsxMzgsNiBAQAogCQkvLy8gPHBhcmFtIG5hbWU9Ik5hbWUiPlRoZSBuYW1lIG9mIHRoZSB3b3JrYm9vazwvcGFyYW0+CiAJCXB1YmxpYyBFeGNlbFdvcmtzaGVldCBBZGQoc3RyaW5nIE5hbWUpCiAJCXsKLSAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCA9IEFkZFNoZWV0KE5hbWUsZmFsc2UsIG51bGwpOwotCQkJcmV0dXJuIHdvcmtzaGVldDsKLQkJfQotICAgICAgICBwcml2YXRlIEV4Y2VsV29ya3NoZWV0IEFkZFNoZWV0KHN0cmluZyBOYW1lLCBib29sIGlzQ2hhcnQsIGVDaGFydFR5cGU/IGNoYXJ0VHlwZSkKLSAgICAgICAgewogICAgICAgICAgICAgaW50IHNoZWV0SUQ7CiAgICAgICAgICAgICBVcmkgdXJpV29ya3NoZWV0OwogICAgICAgICAgICAgbG9jayAoX3dvcmtzaGVldHMpCkBAIC0xNjIsNTg5ICsxNDcsMjggQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbihFUlJfRFVQX1dPUktTSEVFVCArICIgOiAiICsgTmFtZSkpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBHZXRTaGVldFVSSShyZWYgTmFtZSwgb3V0IHNoZWV0SUQsIG91dCB1cmlXb3Jrc2hlZXQsIGlzQ2hhcnQpOwotICAgICAgICAgICAgICAgIFBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCB3b3Jrc2hlZXRQYXJ0ID0gX3Bjay5QYWNrYWdlLkNyZWF0ZVBhcnQodXJpV29ya3NoZWV0LCBpc0NoYXJ0ID8gQ0hBUlRTSEVFVF9DT05URU5UVFlQRSA6IFdPUktTSEVFVF9DT05URU5UVFlQRSwgX3Bjay5Db21wcmVzc2lvbik7CisgICAgICAgICAgICAgICAgR2V0U2hlZXRVUkkocmVmIE5hbWUsIG91dCBzaGVldElELCBvdXQgdXJpV29ya3NoZWV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgUGFja2FnaW5nLlppcFBhY2thZ2VQYXJ0IHdvcmtzaGVldFBhcnQgPSBfcGNrLlBhY2thZ2UuQ3JlYXRlUGFydCh1cmlXb3Jrc2hlZXQsIFdPUktTSEVFVF9DT05URU5UVFlQRSwgX3Bjay5Db21wcmVzc2lvbik7CiAKICAgICAgICAgICAgICAgICAvL0NyZWF0ZSB0aGUgbmV3LCBlbXB0eSB3b3Jrc2hlZXQgYW5kIHNhdmUgaXQgdG8gdGhlIHBhY2thZ2UKICAgICAgICAgICAgICAgICBTdHJlYW1Xcml0ZXIgc3RyZWFtV29ya3NoZWV0ID0gbmV3IFN0cmVhbVdyaXRlcih3b3Jrc2hlZXRQYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuV3JpdGUpKTsKLSAgICAgICAgICAgICAgICBYbWxEb2N1bWVudCB3b3Jrc2hlZXRYbWwgPSBDcmVhdGVOZXdXb3Jrc2hlZXQoaXNDaGFydCk7CisgICAgICAgICAgICAgICAgWG1sRG9jdW1lbnQgd29ya3NoZWV0WG1sID0gQ3JlYXRlTmV3V29ya3NoZWV0KGZhbHNlKTsKICAgICAgICAgICAgICAgICB3b3Jrc2hlZXRYbWwuU2F2ZShzdHJlYW1Xb3Jrc2hlZXQpOwogICAgICAgICAgICAgICAgIF9wY2suUGFja2FnZS5GbHVzaCgpOwogCi0gICAgICAgICAgICAgICAgc3RyaW5nIHJlbCA9IENyZWF0ZVdvcmtib29rUmVsKE5hbWUsIHNoZWV0SUQsIHVyaVdvcmtzaGVldCwgaXNDaGFydCk7CisgICAgICAgICAgICAgICAgc3RyaW5nIHJlbCA9IENyZWF0ZVdvcmtib29rUmVsKE5hbWUsIHNoZWV0SUQsIHVyaVdvcmtzaGVldCwgZmFsc2UpOwogCiAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uSUQgPSBfd29ya3NoZWV0cy5Db3VudCArIDE7CiAgICAgICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0OwotICAgICAgICAgICAgICAgIGlmIChpc0NoYXJ0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0ID0gbmV3IEV4Y2VsQ2hhcnRzaGVldChfbmFtZXNwYWNlTWFuYWdlciwgX3BjaywgcmVsLCB1cmlXb3Jrc2hlZXQsIE5hbWUsIHNoZWV0SUQsIHBvc2l0aW9uSUQsIGVXb3JrU2hlZXRIaWRkZW4uVmlzaWJsZSwgKGVDaGFydFR5cGUpY2hhcnRUeXBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQorCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQgPSBuZXcgRXhjZWxXb3Jrc2hlZXQoX25hbWVzcGFjZU1hbmFnZXIsIF9wY2ssIHJlbCwgdXJpV29ya3NoZWV0LCBOYW1lLCBzaGVldElELCBwb3NpdGlvbklELCBlV29ya1NoZWV0SGlkZGVuLlZpc2libGUpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIF93b3Jrc2hlZXRzLkFkZChwb3NpdGlvbklELCB3b3Jrc2hlZXQpOwotI2lmICFNT05PCi0gICAgICAgICAgICAgICAgaWYgKF9wY2suV29ya2Jvb2suVmJhUHJvamVjdCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBfcGNrLldvcmtib29rLlZiYVByb2plY3QuR2V0TW9kdWxlTmFtZUZyb21Xb3Jrc2hlZXQod29ya3NoZWV0KTsKLSAgICAgICAgICAgICAgICAgICAgX3Bjay5Xb3JrYm9vay5WYmFQcm9qZWN0Lk1vZHVsZXMuQWRkKG5ldyBFeGNlbFZCQU1vZHVsZSh3b3Jrc2hlZXQuQ29kZU5hbWVDaGFuZ2UpIHsgTmFtZSA9IG5hbWUsIENvZGUgPSAiIiwgQXR0cmlidXRlcyA9IF9wY2suV29ya2Jvb2suVmJhUHJvamVjdC5HZXREb2N1bWVudEF0dHJpYnV0ZXMoTmFtZSwgIjB7MDAwMjA4MjAtMDAwMC0wMDAwLUMwMDAtMDAwMDAwMDAwMDQ2fSIpLCBUeXBlID0gZU1vZHVsZVR5cGUuRG9jdW1lbnQsIEhlbHBDb250ZXh0ID0gMCB9KTsKLSAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LkNvZGVNb2R1bGVOYW1lID0gbmFtZTsKLQotICAgICAgICAgICAgICAgIH0KLSNlbmRpZgogICAgICAgICAgICAgICAgIHJldHVybiB3b3Jrc2hlZXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkcyBhIGNvcHkgb2YgYSB3b3Jrc2hlZXQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJOYW1lIj5UaGUgbmFtZSBvZiB0aGUgd29ya2Jvb2s8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkNvcHkiPlRoZSB3b3Jrc2hlZXQgdG8gYmUgY29waWVkPC9wYXJhbT4KLSAgICAgICAgcHVibGljIEV4Y2VsV29ya3NoZWV0IEFkZChzdHJpbmcgTmFtZSwgRXhjZWxXb3Jrc2hlZXQgQ29weSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9jayAoX3dvcmtzaGVldHMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHNoZWV0SUQ7Ci0gICAgICAgICAgICAgICAgVXJpIHVyaVdvcmtzaGVldDsKLSAgICAgICAgICAgICAgICBpZiAoQ29weSBpcyBFeGNlbENoYXJ0c2hlZXQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4gbm90IGNvcHkgYSBjaGFydHNoZWV0IikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoR2V0QnlOYW1lKE5hbWUpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oRVJSX0RVUF9XT1JLU0hFRVQpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBHZXRTaGVldFVSSShyZWYgTmFtZSwgb3V0IHNoZWV0SUQsIG91dCB1cmlXb3Jrc2hlZXQsIGZhbHNlKTsKLQotICAgICAgICAgICAgICAgIC8vQ3JlYXRlIGEgY29weSBvZiB0aGUgd29ya3NoZWV0IFhNTAotICAgICAgICAgICAgICAgIFBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCB3b3Jrc2hlZXRQYXJ0ID0gX3Bjay5QYWNrYWdlLkNyZWF0ZVBhcnQodXJpV29ya3NoZWV0LCBXT1JLU0hFRVRfQ09OVEVOVFRZUEUsIF9wY2suQ29tcHJlc3Npb24pOwotICAgICAgICAgICAgICAgIFN0cmVhbVdyaXRlciBzdHJlYW1Xb3Jrc2hlZXQgPSBuZXcgU3RyZWFtV3JpdGVyKHdvcmtzaGVldFBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5Xcml0ZSkpOwotICAgICAgICAgICAgICAgIFhtbERvY3VtZW50IHdvcmtzaGVldFhtbCA9IG5ldyBYbWxEb2N1bWVudCgpOwotICAgICAgICAgICAgICAgIHdvcmtzaGVldFhtbC5Mb2FkWG1sKENvcHkuV29ya3NoZWV0WG1sLk91dGVyWG1sKTsKLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXRYbWwuU2F2ZShzdHJlYW1Xb3Jrc2hlZXQpOwotICAgICAgICAgICAgICAgIC8vc3RyZWFtV29ya3NoZWV0LkNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgX3Bjay5QYWNrYWdlLkZsdXNoKCk7Ci0KLQotICAgICAgICAgICAgICAgIC8vQ3JlYXRlIGEgcmVsYXRpb24gdG8gdGhlIHdvcmtib29rCi0gICAgICAgICAgICAgICAgc3RyaW5nIHJlbElEID0gQ3JlYXRlV29ya2Jvb2tSZWwoTmFtZSwgc2hlZXRJRCwgdXJpV29ya3NoZWV0LCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgYWRkZWQgPSBuZXcgRXhjZWxXb3Jrc2hlZXQoX25hbWVzcGFjZU1hbmFnZXIsIF9wY2ssIHJlbElELCB1cmlXb3Jrc2hlZXQsIE5hbWUsIHNoZWV0SUQsIF93b3Jrc2hlZXRzLkNvdW50ICsgMSwgZVdvcmtTaGVldEhpZGRlbi5WaXNpYmxlKTsKLQotICAgICAgICAgICAgICAgIC8vQ29weSBjb21tZW50cwotICAgICAgICAgICAgICAgIGlmIChDb3B5LkNvbW1lbnRzLkNvdW50ID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENvcHlDb21tZW50KENvcHksIGFkZGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoQ29weS5WbWxEcmF3aW5nc0NvbW1lbnRzLkNvdW50ID4gMCkgICAgLy9WbWwgZHJhd2luZ3MgYXJlIGNvcGllZCBhcyBwYXJ0IG9mIHRoZSBjb21tZW50cy4gCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDb3B5Vm1sRHJhd2luZyhDb3B5LCBhZGRlZCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9Db3B5IEhlYWRlckZvb3RlcgotICAgICAgICAgICAgICAgIENvcHlIZWFkZXJGb290ZXJQaWN0dXJlcyhDb3B5LCBhZGRlZCk7Ci0KLSAgICAgICAgICAgICAgICAvL0NvcHkgYWxsIHJlbGF0aW9uc2hpcHMgCi0gICAgICAgICAgICAgICAgLy9Db3B5UmVsYXRpb25TaGlwcyhDb3B5LCBhZGRlZCk7Ci0gICAgICAgICAgICAgICAgaWYgKENvcHkuRHJhd2luZ3MuQ291bnQgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ29weURyYXdpbmcoQ29weSwgYWRkZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoQ29weS5UYWJsZXMuQ291bnQgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ29weVRhYmxlKENvcHksIGFkZGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKENvcHkuUGl2b3RUYWJsZXMuQ291bnQgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ29weVBpdm90VGFibGUoQ29weSwgYWRkZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoQ29weS5OYW1lcy5Db3VudCA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDb3B5U2hlZXROYW1lcyhDb3B5LCBhZGRlZCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9Db3B5IGFsbCBjZWxscwotICAgICAgICAgICAgICAgIENsb25lQ2VsbHMoQ29weSwgYWRkZWQpOwotCi0gICAgICAgICAgICAgICAgLy9Db3B5IHRoZSBWQkEgY29kZQotI2lmICFNT05PCi0gICAgICAgICAgICAgICAgaWYgKF9wY2suV29ya2Jvb2suVmJhUHJvamVjdCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBfcGNrLldvcmtib29rLlZiYVByb2plY3QuR2V0TW9kdWxlTmFtZUZyb21Xb3Jrc2hlZXQoYWRkZWQpOwotICAgICAgICAgICAgICAgICAgICBfcGNrLldvcmtib29rLlZiYVByb2plY3QuTW9kdWxlcy5BZGQobmV3IEV4Y2VsVkJBTW9kdWxlKGFkZGVkLkNvZGVOYW1lQ2hhbmdlKSB7IE5hbWUgPSBuYW1lLCBDb2RlID0gQ29weS5Db2RlTW9kdWxlLkNvZGUsIEF0dHJpYnV0ZXMgPSBfcGNrLldvcmtib29rLlZiYVByb2plY3QuR2V0RG9jdW1lbnRBdHRyaWJ1dGVzKE5hbWUsICIwezAwMDIwODIwLTAwMDAtMDAwMC1DMDAwLTAwMDAwMDAwMDA0Nn0iKSwgVHlwZSA9IGVNb2R1bGVUeXBlLkRvY3VtZW50LCBIZWxwQ29udGV4dCA9IDAgfSk7Ci0gICAgICAgICAgICAgICAgICAgIENvcHkuQ29kZU1vZHVsZU5hbWUgPSBuYW1lOwotICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgX3dvcmtzaGVldHMuQWRkKF93b3Jrc2hlZXRzLkNvdW50ICsgMSwgYWRkZWQpOwotCi0gICAgICAgICAgICAgICAgLy9SZW1vdmUgYW55IHJlbGF0aW9uIHRvIHByaW50ZXJzZXR0aW5ncy4KLSAgICAgICAgICAgICAgICBYbWxOb2RlIHBhZ2VTZXR1cCA9IGFkZGVkLldvcmtzaGVldFhtbC5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6cGFnZVNldHVwIiwgX25hbWVzcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgICAgIGlmIChwYWdlU2V0dXAgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbEF0dHJpYnV0ZSBhdHRyID0gKFhtbEF0dHJpYnV0ZSlwYWdlU2V0dXAuQXR0cmlidXRlcy5HZXROYW1lZEl0ZW0oImlkIiwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWxJRCA9IGF0dHIuVmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBkZWxldGUgdGhlIGF0dHJpYnV0ZSBmcm9tIHRoZSBYTUwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VTZXR1cC5BdHRyaWJ1dGVzLlJlbW92ZShhdHRyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gYWRkZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIEV4Y2VsQ2hhcnRzaGVldCBBZGRDaGFydChzdHJpbmcgTmFtZSwgZUNoYXJ0VHlwZSBjaGFydFR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoRXhjZWxDaGFydHNoZWV0KUFkZFNoZWV0KE5hbWUsIHRydWUsIGNoYXJ0VHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIENvcHlTaGVldE5hbWVzKEV4Y2VsV29ya3NoZWV0IENvcHksIEV4Y2VsV29ya3NoZWV0IGFkZGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgbmFtZSBpbiBDb3B5Lk5hbWVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEV4Y2VsTmFtZWRSYW5nZSBuZXdOYW1lOwotICAgICAgICAgICAgICAgIGlmICghbmFtZS5Jc05hbWUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5Xb3JrU2hlZXQgPT0gQ29weS5OYW1lKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdOYW1lID0gYWRkZWQuTmFtZXMuQWRkKG5hbWUuTmFtZSwgYWRkZWQuQ2VsbHNbbmFtZS5GaXJzdEFkZHJlc3NdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld05hbWUgPSBhZGRlZC5OYW1lcy5BZGQobmFtZS5OYW1lLCBhZGRlZC5Xb3JrYm9vay5Xb3Jrc2hlZXRzW25hbWUuV29ya1NoZWV0XS5DZWxsc1tuYW1lLkZpcnN0QWRkcmVzc10pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShuYW1lLk5hbWVGb3JtdWxhKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld05hbWU9YWRkZWQuTmFtZXMuQWRkRm9ybXVsYShuYW1lLk5hbWUsIG5hbWUuRm9ybXVsYSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld05hbWU9YWRkZWQuTmFtZXMuQWRkVmFsdWUobmFtZS5OYW1lLCBuYW1lLlZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBuZXdOYW1lLk5hbWVDb21tZW50ID0gbmFtZS5OYW1lQ29tbWVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBDb3B5VGFibGUoRXhjZWxXb3Jrc2hlZXQgQ29weSwgRXhjZWxXb3Jrc2hlZXQgYWRkZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBwcmV2TmFtZSA9ICIiOwotICAgICAgICAgICAgLy9GaXJzdCBjb3B5IHRoZSB0YWJsZSBYTUwKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0YmwgaW4gQ29weS5UYWJsZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIHhtbD10YmwuVGFibGVYbWwuT3V0ZXJYbWw7Ci0gICAgICAgICAgICAgICAgaW50IElkID0gX3Bjay5Xb3JrYm9vay5fbmV4dFRhYmxlSUQrKzsKLSAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZTsKLSAgICAgICAgICAgICAgICBpZiAocHJldk5hbWUgPT0gIiIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBuYW1lID0gQ29weS5UYWJsZXMuR2V0TmV3VGFibGVOYW1lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpeCA9IGludC5QYXJzZShwcmV2TmFtZS5TdWJzdHJpbmcoNSkpICsgMTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHN0cmluZy5Gb3JtYXQoIlRhYmxlezB9IiwgaXgpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoX3Bjay5Xb3JrYm9vay5FeGlzdHNQaXZvdFRhYmxlTmFtZShuYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHN0cmluZy5Gb3JtYXQoIlRhYmxlezB9IiwgKytpeCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJldk5hbWUgPSBuYW1lOwotICAgICAgICAgICAgICAgIFhtbERvY3VtZW50IHhtbERvYyA9IG5ldyBYbWxEb2N1bWVudCgpOwotICAgICAgICAgICAgICAgIHhtbERvYy5Mb2FkWG1sKHhtbCk7Ci0gICAgICAgICAgICAgICAgeG1sRG9jLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDp0YWJsZS9AaWQiLCB0YmwuTmFtZVNwYWNlTWFuYWdlcikuVmFsdWUgPSBJZC5Ub1N0cmluZygpOwotICAgICAgICAgICAgICAgIHhtbERvYy5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6dGFibGUvQG5hbWUiLCB0YmwuTmFtZVNwYWNlTWFuYWdlcikuVmFsdWUgPSBuYW1lOwotICAgICAgICAgICAgICAgIHhtbERvYy5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6dGFibGUvQGRpc3BsYXlOYW1lIiwgdGJsLk5hbWVTcGFjZU1hbmFnZXIpLlZhbHVlID0gbmFtZTsKLSAgICAgICAgICAgICAgICB4bWwgPSB4bWxEb2MuT3V0ZXJYbWw7Ci0KLSAgICAgICAgICAgICAgICB2YXIgdXJpVGJsID0gbmV3IFVyaShzdHJpbmcuRm9ybWF0KCIveGwvdGFibGVzL3RhYmxlezB9LnhtbCIsIElkKSwgVXJpS2luZC5SZWxhdGl2ZSk7Ci0gICAgICAgICAgICAgICAgdmFyIHBhcnQgPSBfcGNrLlBhY2thZ2UuQ3JlYXRlUGFydCh1cmlUYmwsICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC50YWJsZSt4bWwiLCBfcGNrLkNvbXByZXNzaW9uKTsKLSAgICAgICAgICAgICAgICBTdHJlYW1Xcml0ZXIgc3RyZWFtVGJsID0gbmV3IFN0cmVhbVdyaXRlcihwYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuV3JpdGUpKTsKLSAgICAgICAgICAgICAgICBzdHJlYW1UYmwuV3JpdGUoeG1sKTsKLSAgICAgICAgICAgICAgICAvL3N0cmVhbVRibC5DbG9zZSgpOwotICAgICAgICAgICAgICAgIHN0cmVhbVRibC5GbHVzaCgpOwotCi0gICAgICAgICAgICAgICAgLy9jcmVhdGUgdGhlIHJlbGF0aW9uc2hpcCBhbmQgYWRkIHRoZSBJRCB0byB0aGUgd29ya3NoZWV0IHhtbC4KLSAgICAgICAgICAgICAgICB2YXIgcmVsID0gYWRkZWQuUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoVXJpSGVscGVyLkdldFJlbGF0aXZlVXJpKGFkZGVkLldvcmtzaGVldFVyaSx1cmlUYmwpLCBQYWNrYWdpbmcuVGFyZ2V0TW9kZS5JbnRlcm5hbCwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMgKyAiL3RhYmxlIik7Ci0KLSAgICAgICAgICAgICAgICBpZiAodGJsLlJlbGF0aW9uc2hpcElEID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgdG9wTm9kZSA9IGFkZGVkLldvcmtzaGVldFhtbC5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6dGFibGVQYXJ0cyIsIHRibC5OYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRvcE5vZGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQuQ3JlYXRlTm9kZSgiZDp0YWJsZVBhcnRzIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b3BOb2RlID0gYWRkZWQuV29ya3NoZWV0WG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDp0YWJsZVBhcnRzIiwgdGJsLk5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgZWxlbSA9IGFkZGVkLldvcmtzaGVldFhtbC5DcmVhdGVFbGVtZW50KCJ0YWJsZVBhcnQiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7Ci0gICAgICAgICAgICAgICAgICAgIHRvcE5vZGUuQXBwZW5kQ2hpbGQoZWxlbSk7Ci0gICAgICAgICAgICAgICAgICAgIGVsZW0uU2V0QXR0cmlidXRlKCJpZCIsRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMsIHJlbC5JZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbEF0dHJpYnV0ZSByZWxBdHQ7Ci0gICAgICAgICAgICAgICAgICAgIHJlbEF0dCA9IGFkZGVkLldvcmtzaGVldFhtbC5TZWxlY3RTaW5nbGVOb2RlKHN0cmluZy5Gb3JtYXQoIi8vZDp0YWJsZVBhcnRzL2Q6dGFibGVQYXJ0L0ByOmlkWy49J3swfSddIiwgdGJsLlJlbGF0aW9uc2hpcElEKSwgdGJsLk5hbWVTcGFjZU1hbmFnZXIpIGFzIFhtbEF0dHJpYnV0ZTsKLSAgICAgICAgICAgICAgICAgICAgcmVsQXR0LlZhbHVlID0gcmVsLklkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHZvaWQgQ29weVBpdm90VGFibGUoRXhjZWxXb3Jrc2hlZXQgQ29weSwgRXhjZWxXb3Jrc2hlZXQgYWRkZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBwcmV2TmFtZSA9ICIiOwotICAgICAgICAgICAgZm9yZWFjaCAodmFyIHRibCBpbiBDb3B5LlBpdm90VGFibGVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmluZyB4bWwgPSB0YmwuUGl2b3RUYWJsZVhtbC5PdXRlclhtbDsKLSAgICAgICAgICAgICAgICBpbnQgSWQgPSBfcGNrLldvcmtib29rLl9uZXh0UGl2b3RUYWJsZUlEKys7Ci0KLSAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZTsKLSAgICAgICAgICAgICAgICBpZiAocHJldk5hbWUgPT0gIiIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBuYW1lID0gQ29weS5QaXZvdFRhYmxlcy5HZXROZXdUYWJsZU5hbWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGl4PWludC5QYXJzZShwcmV2TmFtZS5TdWJzdHJpbmcoMTApKSsxOwotICAgICAgICAgICAgICAgICAgICBuYW1lID0gc3RyaW5nLkZvcm1hdCgiUGl2b3RUYWJsZXswfSIsIGl4KTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKF9wY2suV29ya2Jvb2suRXhpc3RzUGl2b3RUYWJsZU5hbWUobmFtZSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBzdHJpbmcuRm9ybWF0KCJQaXZvdFRhYmxlezB9IiwgKytpeCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJldk5hbWU9bmFtZTsKLSAgICAgICAgICAgICAgICBYbWxEb2N1bWVudCB4bWxEb2MgPSBuZXcgWG1sRG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICAvL1RPRE86IEZpeCBzYXZlIHBpdm90dGFibGUgaGVyZQotICAgICAgICAgICAgICAgIC8vQ29weS5TYXZlKCk7ICAgIC8vU2F2ZSB0aGUgd29ya3NoZWV0IGZpcnN0Ci0gICAgICAgICAgICAgICAgeG1sRG9jLkxvYWRYbWwoeG1sKTsKLSAgICAgICAgICAgICAgICAvL3htbERvYy5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6dGFibGUvQGlkIiwgdGJsLk5hbWVTcGFjZU1hbmFnZXIpLlZhbHVlID0gSWQuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB4bWxEb2MuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOnBpdm90VGFibGVEZWZpbml0aW9uL0BuYW1lIiwgdGJsLk5hbWVTcGFjZU1hbmFnZXIpLlZhbHVlID0gbmFtZTsKLSAgICAgICAgICAgICAgICB4bWwgPSB4bWxEb2MuT3V0ZXJYbWw7Ci0KLSAgICAgICAgICAgICAgICB2YXIgdXJpVGJsID0gbmV3IFVyaShzdHJpbmcuRm9ybWF0KCIveGwvcGl2b3RUYWJsZXMvcGl2b3RUYWJsZXswfS54bWwiLCBJZCksIFVyaUtpbmQuUmVsYXRpdmUpOwotICAgICAgICAgICAgICAgIHZhciBwYXJ0VGJsID0gX3Bjay5QYWNrYWdlLkNyZWF0ZVBhcnQodXJpVGJsLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUGl2b3RUYWJsZSAsIF9wY2suQ29tcHJlc3Npb24pOwotICAgICAgICAgICAgICAgIFN0cmVhbVdyaXRlciBzdHJlYW1UYmwgPSBuZXcgU3RyZWFtV3JpdGVyKHBhcnRUYmwuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5Xcml0ZSkpOwotICAgICAgICAgICAgICAgIHN0cmVhbVRibC5Xcml0ZSh4bWwpOwotICAgICAgICAgICAgICAgIC8vc3RyZWFtVGJsLkNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgc3RyZWFtVGJsLkZsdXNoKCk7Ci0KLSAgICAgICAgICAgICAgICB4bWwgPSB0YmwuQ2FjaGVEZWZpbml0aW9uLkNhY2hlRGVmaW5pdGlvblhtbC5PdXRlclhtbDsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdmFyIHVyaUNkID0gbmV3IFVyaShzdHJpbmcuRm9ybWF0KCIveGwvcGl2b3RDYWNoZS9waXZvdGNhY2hlZGVmaW5pdGlvbnswfS54bWwiLCBJZCksIFVyaUtpbmQuUmVsYXRpdmUpOwotICAgICAgICAgICAgICAgIHdoaWxlIChfcGNrLlBhY2thZ2UuUGFydEV4aXN0cyh1cmlDZCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB1cmlDZCA9IG5ldyBVcmkoc3RyaW5nLkZvcm1hdCgiL3hsL3Bpdm90Q2FjaGUvcGl2b3RjYWNoZWRlZmluaXRpb257MH0ueG1sIiwgKytJZCksIFVyaUtpbmQuUmVsYXRpdmUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHZhciBwYXJ0Q2QgPSBfcGNrLlBhY2thZ2UuQ3JlYXRlUGFydCh1cmlDZCwgRXhjZWxQYWNrYWdlLnNjaGVtYVBpdm90Q2FjaGVEZWZpbml0aW9uLCBfcGNrLkNvbXByZXNzaW9uKTsKLSAgICAgICAgICAgICAgICBTdHJlYW1Xcml0ZXIgc3RyZWFtQ2QgPSBuZXcgU3RyZWFtV3JpdGVyKHBhcnRDZC5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLldyaXRlKSk7Ci0gICAgICAgICAgICAgICAgc3RyZWFtQ2QuV3JpdGUoeG1sKTsKLSAgICAgICAgICAgICAgICBzdHJlYW1DZC5GbHVzaCgpOwotCi0gICAgICAgICAgICAgICAgeG1sID0gIjxwaXZvdENhY2hlUmVjb3JkcyB4bWxucz1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpblwiIHhtbG5zOnI9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzXCIgY291bnQ9XCIwXCIgLz4iOwotICAgICAgICAgICAgICAgIHZhciB1cmlSZWMgPSBuZXcgVXJpKHN0cmluZy5Gb3JtYXQoIi94bC9waXZvdENhY2hlL3Bpdm90cmVjb3Jkc3swfS54bWwiLCBJZCksIFVyaUtpbmQuUmVsYXRpdmUpOwotICAgICAgICAgICAgICAgIHdoaWxlIChfcGNrLlBhY2thZ2UuUGFydEV4aXN0cyh1cmlSZWMpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdXJpUmVjID0gbmV3IFVyaShzdHJpbmcuRm9ybWF0KCIveGwvcGl2b3RDYWNoZS9waXZvdHJlY29yZHN7MH0ueG1sIiwgKytJZCksIFVyaUtpbmQuUmVsYXRpdmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2YXIgcGFydFJlYyA9IF9wY2suUGFja2FnZS5DcmVhdGVQYXJ0KHVyaVJlYywgRXhjZWxQYWNrYWdlLnNjaGVtYVBpdm90Q2FjaGVSZWNvcmRzLCBfcGNrLkNvbXByZXNzaW9uKTsKLSAgICAgICAgICAgICAgICBTdHJlYW1Xcml0ZXIgc3RyZWFtUmVjID0gbmV3IFN0cmVhbVdyaXRlcihwYXJ0UmVjLkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuV3JpdGUpKTsKLSAgICAgICAgICAgICAgICBzdHJlYW1SZWMuV3JpdGUoeG1sKTsKLSAgICAgICAgICAgICAgICBzdHJlYW1SZWMuRmx1c2goKTsKLQotICAgICAgICAgICAgICAgIC8vY3JlYXRlIHRoZSByZWxhdGlvbnNoaXAgYW5kIGFkZCB0aGUgSUQgdG8gdGhlIHdvcmtzaGVldCB4bWwuCi0gICAgICAgICAgICAgICAgYWRkZWQuUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoVXJpSGVscGVyLlJlc29sdmVQYXJ0VXJpKGFkZGVkLldvcmtzaGVldFVyaSwgdXJpVGJsKSwgUGFja2FnaW5nLlRhcmdldE1vZGUuSW50ZXJuYWwsIEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxhdGlvbnNoaXBzICsgIi9waXZvdFRhYmxlIik7Ci0gICAgICAgICAgICAgICAgcGFydFRibC5DcmVhdGVSZWxhdGlvbnNoaXAoVXJpSGVscGVyLlJlc29sdmVQYXJ0VXJpKHRibC5SZWxhdGlvbnNoaXAuU291cmNlVXJpLCB1cmlDZCksIHRibC5DYWNoZURlZmluaXRpb24uUmVsYXRpb25zaGlwLlRhcmdldE1vZGUsIHRibC5DYWNoZURlZmluaXRpb24uUmVsYXRpb25zaGlwLlJlbGF0aW9uc2hpcFR5cGUpOwotICAgICAgICAgICAgICAgIHBhcnRDZC5DcmVhdGVSZWxhdGlvbnNoaXAoVXJpSGVscGVyLlJlc29sdmVQYXJ0VXJpKHVyaUNkLCB1cmlSZWMpLCBQYWNrYWdpbmcuVGFyZ2V0TW9kZS5JbnRlcm5hbCwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMgKyAiL3Bpdm90Q2FjaGVSZWNvcmRzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIENvcHlIZWFkZXJGb290ZXJQaWN0dXJlcyhFeGNlbFdvcmtzaGVldCBDb3B5LCBFeGNlbFdvcmtzaGVldCBhZGRlZCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKENvcHkuVG9wTm9kZSAhPSBudWxsICYmIENvcHkuVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJkOmhlYWRlckZvb3RlciIsIE5hbWVTcGFjZU1hbmFnZXIpPT1udWxsKSByZXR1cm47Ci0gICAgICAgICAgICAvL0NvcHkgdGhlIHRleHRzCi0gICAgICAgICAgICBDb3B5VGV4dChDb3B5LkhlYWRlckZvb3Rlci5fb2RkSGVhZGVyLCBhZGRlZC5IZWFkZXJGb290ZXIuT2RkSGVhZGVyKTsKLSAgICAgICAgICAgIENvcHlUZXh0KENvcHkuSGVhZGVyRm9vdGVyLl9vZGRGb290ZXIsIGFkZGVkLkhlYWRlckZvb3Rlci5PZGRGb290ZXIpOwotICAgICAgICAgICAgQ29weVRleHQoQ29weS5IZWFkZXJGb290ZXIuX2V2ZW5IZWFkZXIsIGFkZGVkLkhlYWRlckZvb3Rlci5FdmVuSGVhZGVyKTsKLSAgICAgICAgICAgIENvcHlUZXh0KENvcHkuSGVhZGVyRm9vdGVyLl9ldmVuRm9vdGVyLCBhZGRlZC5IZWFkZXJGb290ZXIuRXZlbkZvb3Rlcik7Ci0gICAgICAgICAgICBDb3B5VGV4dChDb3B5LkhlYWRlckZvb3Rlci5fZmlyc3RIZWFkZXIsIGFkZGVkLkhlYWRlckZvb3Rlci5GaXJzdEhlYWRlcik7Ci0gICAgICAgICAgICBDb3B5VGV4dChDb3B5LkhlYWRlckZvb3Rlci5fZmlyc3RGb290ZXIsIGFkZGVkLkhlYWRlckZvb3Rlci5GaXJzdEZvb3Rlcik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vQ29weSBhbnkgaW1hZ2VzOwotICAgICAgICAgICAgaWYgKENvcHkuSGVhZGVyRm9vdGVyLlBpY3R1cmVzLkNvdW50ID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBVcmkgc291cmNlID0gQ29weS5IZWFkZXJGb290ZXIuUGljdHVyZXMuVXJpOwotICAgICAgICAgICAgICAgIFVyaSBkZXN0ID0gWG1sSGVscGVyLkdldE5ld1VyaShfcGNrLlBhY2thZ2UsIEAiL3hsL2RyYXdpbmdzL3ZtbERyYXdpbmd7MH0udm1sIik7Ci0gICAgICAgICAgICAgICAgYWRkZWQuRGVsZXRlTm9kZSgiZDpsZWdhY3lEcmF3aW5nSEYiKTsKLQotICAgICAgICAgICAgICAgIC8vdmFyIHBhcnQgPSBfcGNrLlBhY2thZ2UuQ3JlYXRlUGFydChkZXN0LCAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnZtbERyYXdpbmciLCBfcGNrLkNvbXByZXNzaW9uKTsKLSAgICAgICAgICAgICAgICBmb3JlYWNoIChFeGNlbFZtbERyYXdpbmdQaWN0dXJlIHBpYyBpbiBDb3B5LkhlYWRlckZvb3Rlci5QaWN0dXJlcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gYWRkZWQuSGVhZGVyRm9vdGVyLlBpY3R1cmVzLkFkZChwaWMuSWQsIHBpYy5JbWFnZVVyaSwgcGljLlRpdGxlLCBwaWMuV2lkdGgsIHBpYy5IZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChYbWxBdHRyaWJ1dGUgYXR0IGluIHBpYy5Ub3BOb2RlLkF0dHJpYnV0ZXMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtLlRvcE5vZGUgYXMgWG1sRWxlbWVudCkuU2V0QXR0cmlidXRlKGF0dC5OYW1lLCBhdHQuVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGl0ZW0uVG9wTm9kZS5Jbm5lclhtbCA9IHBpYy5Ub3BOb2RlLklubmVyWG1sOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBDb3B5VGV4dChFeGNlbEhlYWRlckZvb3RlclRleHQgZnJvbSwgRXhjZWxIZWFkZXJGb290ZXJUZXh0IHRvKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZnJvbSA9PSBudWxsKSByZXR1cm47Ci0gICAgICAgICAgICB0by5MZWZ0QWxpZ25lZFRleHQ9ZnJvbS5MZWZ0QWxpZ25lZFRleHQ7Ci0gICAgICAgICAgICB0by5DZW50ZXJlZFRleHQgPSBmcm9tLkNlbnRlcmVkVGV4dDsKLSAgICAgICAgICAgIHRvLlJpZ2h0QWxpZ25lZFRleHQgPSBmcm9tLlJpZ2h0QWxpZ25lZFRleHQ7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIENsb25lQ2VsbHMoRXhjZWxXb3Jrc2hlZXQgQ29weSwgRXhjZWxXb3Jrc2hlZXQgYWRkZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2wgc2FtZVdvcmtib29rPShDb3B5Lldvcmtib29rID09IF9wY2suV29ya2Jvb2spOwotCi0gICAgICAgICAgICBib29sIGRvQWRqdXN0ID0gX3Bjay5Eb0FkanVzdERyYXdpbmdzOwotICAgICAgICAgICAgX3Bjay5Eb0FkanVzdERyYXdpbmdzID0gZmFsc2U7Ci0gICAgICAgICAgICBhZGRlZC5NZXJnZWRDZWxscy5MaXN0LkFkZFJhbmdlKENvcHkuTWVyZ2VkQ2VsbHMuTGlzdCk7Ci0gICAgICAgICAgICAvL0Zvcm11bGFzCi0gICAgICAgICAgICAvL2ZvcmVhY2ggKElSYW5nZUlEIGYgaW4gQ29weS5fZm9ybXVsYUNlbGxzKQotICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAvLyAgICBhZGRlZC5fZm9ybXVsYUNlbGxzLkFkZChmKTsKLSAgICAgICAgICAgIC8vfQotICAgICAgICAgICAgLy9TaGFyZWQgRm9ybXVsYXMKLSAgICAgICAgICAgIGZvcmVhY2ggKGludCBrZXkgaW4gQ29weS5fc2hhcmVkRm9ybXVsYXMuS2V5cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGRlZC5fc2hhcmVkRm9ybXVsYXMuQWRkKGtleSwgQ29weS5fc2hhcmVkRm9ybXVsYXNba2V5XSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIERpY3Rpb25hcnk8aW50LCBpbnQ+IHN0eWxlQ2FzaGUgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKLSAgICAgICAgICAgIC8vQ2VsbHMKLSAgICAgICAgICAgIGludCByb3csY29sOwotICAgICAgICAgICAgdmFyIHZhbCA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KENvcHkuX3ZhbHVlcyk7Ci0gICAgICAgICAgICAvL29iamVjdCBmPW51bGw7Ci0gICAgICAgICAgICAvL2ZvcmVhY2ggKHZhciBhZGRyIGluIHZhbCkKLSAgICAgICAgICAgIHdoaWxlKHZhbC5OZXh0KCkpCi0gICAgICAgICAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vcm93PShpbnQpYWRkcj4+MzI7Ci0gICAgICAgICAgICAgICAgLy9jb2w9KGludClhZGRyJjMyOwotICAgICAgICAgICAgICAgIHJvdyA9IHZhbC5Sb3c7Ci0gICAgICAgICAgICAgICAgY29sID0gdmFsLkNvbHVtbjsKLSAgICAgICAgICAgICAgICAvL2FkZGVkLl9jZWxscy5BZGQoY2VsbC5DbG9uZShhZGRlZCkpOwotICAgICAgICAgICAgICAgIGludCBzdHlsZUlEPTA7Ci0gICAgICAgICAgICAgICAgaWYgKHJvdyA9PSAwKSAvL0NvbHVtbgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBDb3B5Ll92YWx1ZXMuR2V0VmFsdWUocm93LCBjb2wpIGFzIEV4Y2VsQ29sdW1uOwotICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2xvbmUgPSBjLkNsb25lKGFkZGVkLCBjLkNvbHVtbk1pbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbG9uZS5TdHlsZUlEID0gYy5TdHlsZUlEOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQuX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCwgY2xvbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVJRCA9IGMuU3R5bGVJRDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2wgPT0gMCkgLy9Sb3cKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciByPUNvcHkuUm93KHJvdyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIuQ2xvbmUoYWRkZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVJRCA9IHIuU3R5bGVJRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vYWRkZWQuX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCwgci5DbG9uZShhZGRlZCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIHN0eWxlSUQgPSBDb3B5VmFsdWVzKENvcHksIGFkZGVkLCByb3csIGNvbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghc2FtZVdvcmtib29rKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlQ2FzaGUuQ29udGFpbnNLZXkoc3R5bGVJRCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkLl9zdHlsZXMuU2V0VmFsdWUocm93LCBjb2wsIHN0eWxlQ2FzaGVbc3R5bGVJRF0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBhZGRlZC5Xb3JrYm9vay5TdHlsZXMuQ2xvbmVTdHlsZShDb3B5Lldvcmtib29rLlN0eWxlcywgc3R5bGVJRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUNhc2hlLkFkZChzdHlsZUlELCBzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkLl9zdHlsZXMuU2V0VmFsdWUocm93LCBjb2wsIHMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRkZWQuX3BhY2thZ2UuRG9BZGp1c3REcmF3aW5ncyA9IGRvQWRqdXN0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgQ29weVZhbHVlcyhFeGNlbFdvcmtzaGVldCBDb3B5LCBFeGNlbFdvcmtzaGVldCBhZGRlZCwgaW50IHJvdywgaW50IGNvbCkKLSAgICAgICAgewotICAgICAgICAgICAgYWRkZWQuX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCwgQ29weS5fdmFsdWVzLkdldFZhbHVlKHJvdywgY29sKSk7Ci0gICAgICAgICAgICB2YXIgdCA9IENvcHkuX3R5cGVzLkdldFZhbHVlKHJvdywgY29sKTsKLSAgICAgICAgICAgIGlmICh0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWRkZWQuX3R5cGVzLlNldFZhbHVlKHJvdywgY29sLCB0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ5dGUgZmw9MDsKLSAgICAgICAgICAgIGlmIChDb3B5Ll9mbGFncy5FeGlzdHMocm93LGNvbCxyZWYgZmwpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZGVkLl9mbGFncy5TZXRWYWx1ZShyb3csIGNvbCwgZmwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2YXIgdiA9IENvcHkuX2Zvcm11bGFzLkdldFZhbHVlKHJvdywgY29sKTsKLSAgICAgICAgICAgIGlmICh2ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWRkZWQuU2V0Rm9ybXVsYShyb3csIGNvbCwgdik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgcyA9IENvcHkuX3N0eWxlcy5HZXRWYWx1ZShyb3csIGNvbCk7Ci0gICAgICAgICAgICBpZiAocyAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZGVkLl9zdHlsZXMuU2V0VmFsdWUocm93LCBjb2wsIHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIGYgPSBDb3B5Ll9mb3JtdWxhcy5HZXRWYWx1ZShyb3csIGNvbCk7Ci0gICAgICAgICAgICBpZiAoZiAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZGVkLl9mb3JtdWxhcy5TZXRWYWx1ZShyb3csIGNvbCwgZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gczsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBDb3B5Q29tbWVudChFeGNlbFdvcmtzaGVldCBDb3B5LCBFeGNlbFdvcmtzaGVldCB3b3JrU2hlZXQpCi0gICAgICAgIHsgICAgICAgICAgICAKLSAgICAgICAgICAgIC8vRmlyc3QgY29weSB0aGUgZHJhd2luZyBYTUwKLSAgICAgICAgICAgIHN0cmluZyB4bWwgPSBDb3B5LkNvbW1lbnRzLkNvbW1lbnRYbWwuSW5uZXJYbWw7Ci0gICAgICAgICAgICB2YXIgdXJpQ29tbWVudCA9IG5ldyBVcmkoc3RyaW5nLkZvcm1hdCgiL3hsL2NvbW1lbnRzezB9LnhtbCIsIHdvcmtTaGVldC5TaGVldElEKSwgVXJpS2luZC5SZWxhdGl2ZSk7Ci0gICAgICAgICAgICBpZiAoX3Bjay5QYWNrYWdlLlBhcnRFeGlzdHModXJpQ29tbWVudCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdXJpQ29tbWVudCA9IFhtbEhlbHBlci5HZXROZXdVcmkoX3Bjay5QYWNrYWdlLCAiL3hsL2RyYXdpbmdzL3ZtbGRyYXdpbmd7MH0udm1sIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHZhciBwYXJ0ID0gX3Bjay5QYWNrYWdlLkNyZWF0ZVBhcnQodXJpQ29tbWVudCwgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLmNvbW1lbnRzK3htbCIsIF9wY2suQ29tcHJlc3Npb24pOwotCi0gICAgICAgICAgICBTdHJlYW1Xcml0ZXIgc3RyZWFtRHJhd2luZyA9IG5ldyBTdHJlYW1Xcml0ZXIocGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLldyaXRlKSk7Ci0gICAgICAgICAgICBzdHJlYW1EcmF3aW5nLldyaXRlKHhtbCk7Ci0gICAgICAgICAgICAvL3N0cmVhbURyYXdpbmcuQ2xvc2UoKTsKLSAgICAgICAgICAgIHN0cmVhbURyYXdpbmcuRmx1c2goKTsKLQotICAgICAgICAgICAgLy9BZGQgdGhlIHJlbGF0aW9uc2hpcCBJRCB0byB0aGUgd29ya3NoZWV0IHhtbC4KLSAgICAgICAgICAgIHZhciBjb21tZW50UmVsYXRpb24gPSB3b3JrU2hlZXQuUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoVXJpSGVscGVyLkdldFJlbGF0aXZlVXJpKHdvcmtTaGVldC5Xb3Jrc2hlZXRVcmksdXJpQ29tbWVudCksIFBhY2thZ2luZy5UYXJnZXRNb2RlLkludGVybmFsLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcyArICIvY29tbWVudHMiKTsKLQotICAgICAgICAgICAgeG1sID0gQ29weS5WbWxEcmF3aW5nc0NvbW1lbnRzLlZtbERyYXdpbmdYbWwuSW5uZXJYbWw7Ci0KLSAgICAgICAgICAgIHZhciB1cmlWbWwgPSBuZXcgVXJpKHN0cmluZy5Gb3JtYXQoIi94bC9kcmF3aW5ncy92bWxkcmF3aW5nezB9LnZtbCIsIHdvcmtTaGVldC5TaGVldElEKSwgVXJpS2luZC5SZWxhdGl2ZSk7Ci0gICAgICAgICAgICBpZiAoX3Bjay5QYWNrYWdlLlBhcnRFeGlzdHModXJpVm1sKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1cmlWbWwgPSBYbWxIZWxwZXIuR2V0TmV3VXJpKF9wY2suUGFja2FnZSwgIi94bC9kcmF3aW5ncy92bWxkcmF3aW5nezB9LnZtbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2YXIgdm1sUGFydCA9IF9wY2suUGFja2FnZS5DcmVhdGVQYXJ0KHVyaVZtbCwgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC52bWxEcmF3aW5nIiwgX3Bjay5Db21wcmVzc2lvbik7Ci0gICAgICAgICAgICBTdHJlYW1Xcml0ZXIgc3RyZWFtVm1sID0gbmV3IFN0cmVhbVdyaXRlcih2bWxQYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuV3JpdGUpKTsKLSAgICAgICAgICAgIHN0cmVhbVZtbC5Xcml0ZSh4bWwpOwotICAgICAgICAgICAgLy9zdHJlYW1WbWwuQ2xvc2UoKTsKLSAgICAgICAgICAgIHN0cmVhbVZtbC5GbHVzaCgpOwotCi0gICAgICAgICAgICB2YXIgbmV3Vm1sUmVsID0gd29ya1NoZWV0LlBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKFVyaUhlbHBlci5HZXRSZWxhdGl2ZVVyaSh3b3JrU2hlZXQuV29ya3NoZWV0VXJpLHVyaVZtbCksIFBhY2thZ2luZy5UYXJnZXRNb2RlLkludGVybmFsLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcyArICIvdm1sRHJhd2luZyIpOwotCi0gICAgICAgICAgICAvL0FkZCB0aGUgcmVsYXRpb25zaGlwIElEIHRvIHRoZSB3b3Jrc2hlZXQgeG1sLgotICAgICAgICAgICAgWG1sRWxlbWVudCBlID0gd29ya1NoZWV0LldvcmtzaGVldFhtbC5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6bGVnYWN5RHJhd2luZyIsIF9uYW1lc3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OwotICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3b3JrU2hlZXQuQ3JlYXRlTm9kZSgiZDpsZWdhY3lEcmF3aW5nIik7Ci0gICAgICAgICAgICAgICAgZSA9IHdvcmtTaGVldC5Xb3Jrc2hlZXRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOmxlZ2FjeURyYXdpbmciLCBfbmFtZXNwYWNlTWFuYWdlcikgYXMgWG1sRWxlbWVudDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZS5TZXRBdHRyaWJ1dGUoImlkIiwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMsIG5ld1ZtbFJlbC5JZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIENvcHlEcmF3aW5nKEV4Y2VsV29ya3NoZWV0IENvcHksIEV4Y2VsV29ya3NoZWV0IHdvcmtTaGVldC8qLCBQYWNrYWdlUmVsYXRpb25zaGlwIHIqLykKLSAgICAgICAgewotICAgICAgICAgICAgCi0gICAgICAgICAgICAvL0NoZWNrIGlmIHRoZSB3b3Jrc2hlZXQgaGFzIGRyYXdpbmdzCi0gICAgICAgICAgICAvL2lmKF94bFBhY2thZ2UuUGFja2FnZS5QYXJ0RXhpc3RzKHIuVGFyZ2V0VXJpKSkKLSAgICAgICAgICAgIC8vewotICAgICAgICAgICAgICAgIC8vRmlyc3QgY29weSB0aGUgZHJhd2luZyBYTUwgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgc3RyaW5nIHhtbCA9IENvcHkuRHJhd2luZ3MuRHJhd2luZ1htbC5PdXRlclhtbDsgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB2YXIgdXJpRHJhdz1uZXcgVXJpKHN0cmluZy5Gb3JtYXQoIi94bC9kcmF3aW5ncy9kcmF3aW5nezB9LnhtbCIsIHdvcmtTaGVldC5TaGVldElEKSwgIFVyaUtpbmQuUmVsYXRpdmUpOwotICAgICAgICAgICAgICAgIHZhciBwYXJ0PSBfcGNrLlBhY2thZ2UuQ3JlYXRlUGFydCh1cmlEcmF3LCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuZHJhd2luZyt4bWwiLCBfcGNrLkNvbXByZXNzaW9uKTsKLSAgICAgICAgICAgICAgICBTdHJlYW1Xcml0ZXIgc3RyZWFtRHJhd2luZyA9IG5ldyBTdHJlYW1Xcml0ZXIocGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLldyaXRlKSk7Ci0gICAgICAgICAgICAgICAgc3RyZWFtRHJhd2luZy5Xcml0ZSh4bWwpOwotICAgICAgICAgICAgICAgIC8vc3RyZWFtRHJhd2luZy5DbG9zZSgpOwotICAgICAgICAgICAgICAgIHN0cmVhbURyYXdpbmcuRmx1c2goKTsKLQotICAgICAgICAgICAgICAgIFhtbERvY3VtZW50IGRyYXdYbWwgPSBuZXcgWG1sRG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICBkcmF3WG1sLkxvYWRYbWwoeG1sKTsKLSAgICAgICAgICAgICAgICAvL0FkZCB0aGUgcmVsYXRpb25zaGlwIElEIHRvIHRoZSB3b3Jrc2hlZXQgeG1sLgotICAgICAgICAgICAgICAgIHZhciBkcmF3UmVsYXRpb24gPSB3b3JrU2hlZXQuUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoVXJpSGVscGVyLkdldFJlbGF0aXZlVXJpKHdvcmtTaGVldC5Xb3Jrc2hlZXRVcmksdXJpRHJhdyksIFBhY2thZ2luZy5UYXJnZXRNb2RlLkludGVybmFsLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcyArICIvZHJhd2luZyIpOwotICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgZSA9IHdvcmtTaGVldC5Xb3Jrc2hlZXRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOmRyYXdpbmciLCBfbmFtZXNwYWNlTWFuYWdlcikgYXMgWG1sRWxlbWVudDsKLSAgICAgICAgICAgICAgICBlLlNldEF0dHJpYnV0ZSgiaWQiLEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxhdGlvbnNoaXBzLCBkcmF3UmVsYXRpb24uSWQpOwotCi0gICAgICAgICAgICAgICAgZm9yZWFjaCAoRXhjZWxEcmF3aW5nIGRyYXcgaW4gQ29weS5EcmF3aW5ncykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkcmF3IGlzIEV4Y2VsQ2hhcnQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VsQ2hhcnQgY2hhcnQgPSBkcmF3IGFzIEV4Y2VsQ2hhcnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWwgPSBjaGFydC5DaGFydFhtbC5Jbm5lclhtbDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFVyaUNoYXJ0ID0gWG1sSGVscGVyLkdldE5ld1VyaShfcGNrLlBhY2thZ2UsICIveGwvY2hhcnRzL2NoYXJ0ezB9LnhtbCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoYXJ0UGFydCA9IF9wY2suUGFja2FnZS5DcmVhdGVQYXJ0KFVyaUNoYXJ0LCAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LmRyYXdpbmdtbC5jaGFydCt4bWwiLCBfcGNrLkNvbXByZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbVdyaXRlciBzdHJlYW1DaGFydCA9IG5ldyBTdHJlYW1Xcml0ZXIoY2hhcnRQYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuV3JpdGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUNoYXJ0LldyaXRlKHhtbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL3N0cmVhbUNoYXJ0LkNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1DaGFydC5GbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9Ob3cgY3JlYXRlIHRoZSBuZXcgcmVsYXRpb25zaGlwIHRvIHRoZSBjb3BpZWQgY2hhcnQgeG1sCi0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJldlJlbElEPWRyYXcuVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJ4ZHI6Z3JhcGhpY0ZyYW1lL2E6Z3JhcGhpYy9hOmdyYXBoaWNEYXRhL2M6Y2hhcnQvQHI6aWQiLCBDb3B5LkRyYXdpbmdzLk5hbWVTcGFjZU1hbmFnZXIpLlZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbCA9IHBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKFVyaUhlbHBlci5HZXRSZWxhdGl2ZVVyaSh1cmlEcmF3LFVyaUNoYXJ0KSwgUGFja2FnaW5nLlRhcmdldE1vZGUuSW50ZXJuYWwsIEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxhdGlvbnNoaXBzICsgIi9jaGFydCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgWG1sQXR0cmlidXRlIHJlbEF0dCA9IGRyYXdYbWwuU2VsZWN0U2luZ2xlTm9kZShzdHJpbmcuRm9ybWF0KCIvL2M6Y2hhcnQvQHI6aWRbLj0nezB9J10iLCBwcmV2UmVsSUQpLCBDb3B5LkRyYXdpbmdzLk5hbWVTcGFjZU1hbmFnZXIpIGFzIFhtbEF0dHJpYnV0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbEF0dC5WYWx1ZT1yZWwuSWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZHJhdyBpcyBFeGNlbFBpY3R1cmUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VsUGljdHVyZSBwaWMgPSBkcmF3IGFzIEV4Y2VsUGljdHVyZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmkgPSBwaWMuVXJpUGljOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXdvcmtTaGVldC5Xb3JrYm9vay5fcGFja2FnZS5QYWNrYWdlLlBhcnRFeGlzdHModXJpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGljUGFydCA9IHdvcmtTaGVldC5Xb3JrYm9vay5fcGFja2FnZS5QYWNrYWdlLkNyZWF0ZVBhcnQodXJpLCBwaWMuQ29udGVudFR5cGUsIENvbXByZXNzaW9uTGV2ZWwuTm9uZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljLkltYWdlLkV4cG9ydFN0cmVhbShwaWNQYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuV3JpdGUpLCBwaWMuSW1hZ2VGb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVsID0gcGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoVXJpSGVscGVyLkdldFJlbGF0aXZlVXJpKHdvcmtTaGVldC5Xb3Jrc2hlZXRVcmksIHVyaSksIFBhY2thZ2luZy5UYXJnZXRNb2RlLkludGVybmFsLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcyArICIvaW1hZ2UiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vRml4ZXMgcHJvYmxlbSB3aXRoIGludmFsaWQgaW1hZ2Ugd2hlbiB0aGUgc2FtZSBpbWFnZSBpcyB1c2VkIG1vcmUgdGhhbiBvbmNlLgotICAgICAgICAgICAgICAgICAgICAgICAgWG1sTm9kZSByZWxBdHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdYbWwuU2VsZWN0U2luZ2xlTm9kZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLkZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvL3hkcjpwaWMveGRyOm52UGljUHIveGRyOmNOdlByL0BuYW1lWy49J3swfSddLy4uLy4uLy4uL3hkcjpibGlwRmlsbC9hOmJsaXAvQHI6ZW1iZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljLk5hbWUpLCBDb3B5LkRyYXdpbmdzLk5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVsQXR0IT1udWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbEF0dC5WYWx1ZSA9IHJlbC5JZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfcGNrLl9pbWFnZXMuQ29udGFpbnNLZXkocGljLkltYWdlSGFzaCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Bjay5faW1hZ2VzW3BpYy5JbWFnZUhhc2hdLlJlZkNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy9yZXdyaXRlIHRoZSBkcmF3aW5nIHhtbCB3aXRoIHRoZSBuZXcgcmVsSUQncwotICAgICAgICAgICAgICAgIHN0cmVhbURyYXdpbmcgPSBuZXcgU3RyZWFtV3JpdGVyKHBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5Xcml0ZSkpOwotICAgICAgICAgICAgICAgIHN0cmVhbURyYXdpbmcuV3JpdGUoZHJhd1htbC5PdXRlclhtbCk7Ci0gICAgICAgICAgICAgICAvLyBzdHJlYW1EcmF3aW5nLkNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgc3RyZWFtRHJhd2luZy5GbHVzaCgpOwotCi0gICAgICAgICAgICAvL30KLSAgICAgICAgfQotCi0JCXByaXZhdGUgdm9pZCBDb3B5Vm1sRHJhd2luZyhFeGNlbFdvcmtzaGVldCBvcmlnU2hlZXQsIEV4Y2VsV29ya3NoZWV0IG5ld1NoZWV0KQotCQl7Ci0JCQl2YXIgeG1sID0gb3JpZ1NoZWV0LlZtbERyYXdpbmdzQ29tbWVudHMuVm1sRHJhd2luZ1htbC5PdXRlclhtbDsKLQkJCXZhciB2bWxVcmkgPSBuZXcgVXJpKHN0cmluZy5Gb3JtYXQoIi94bC9kcmF3aW5ncy92bWxEcmF3aW5nezB9LnZtbCIsIG5ld1NoZWV0LlNoZWV0SUQpLCBVcmlLaW5kLlJlbGF0aXZlKTsKLQkJCXZhciBwYXJ0ID0gX3Bjay5QYWNrYWdlLkNyZWF0ZVBhcnQodm1sVXJpLCAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnZtbERyYXdpbmciLCBfcGNrLkNvbXByZXNzaW9uKTsKLQkJCXVzaW5nICh2YXIgc3RyZWFtRHJhd2luZyA9IG5ldyBTdHJlYW1Xcml0ZXIocGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLldyaXRlKSkpCi0JCQl7Ci0JCQkJc3RyZWFtRHJhd2luZy5Xcml0ZSh4bWwpOwotICAgICAgICAgICAgICAgIHN0cmVhbURyYXdpbmcuRmx1c2goKTsKLSAgICAgICAgICAgIH0KLQkJCQotICAgICAgICAgICAgLy9BZGQgdGhlIHJlbGF0aW9uc2hpcCBJRCB0byB0aGUgd29ya3NoZWV0IHhtbC4KLQkJCXZhciB2bWxSZWxhdGlvbiA9IG5ld1NoZWV0LlBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKFVyaUhlbHBlci5HZXRSZWxhdGl2ZVVyaShuZXdTaGVldC5Xb3Jrc2hlZXRVcmksdm1sVXJpKSwgUGFja2FnaW5nLlRhcmdldE1vZGUuSW50ZXJuYWwsIEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxhdGlvbnNoaXBzICsgIi92bWxEcmF3aW5nIik7Ci0JCQl2YXIgZSA9IG5ld1NoZWV0LldvcmtzaGVldFhtbC5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6bGVnYWN5RHJhd2luZyIsIF9uYW1lc3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OwotCQkJaWYgKGUgPT0gbnVsbCkKLQkJCXsKLQkJCQllID0gbmV3U2hlZXQuV29ya3NoZWV0WG1sLkNyZWF0ZU5vZGUoWG1sTm9kZVR5cGUuRW50aXR5LCAiLy9kOmxlZ2FjeURyYXdpbmciLCBfbmFtZXNwYWNlTWFuYWdlci5Mb29rdXBOYW1lc3BhY2UoImQiKSkgYXMgWG1sRWxlbWVudDsKLQkJCX0KLQkJCWlmIChlICE9IG51bGwpCi0JCQl7Ci0JCQkJZS5TZXRBdHRyaWJ1dGUoImlkIiwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMsIHZtbFJlbGF0aW9uLklkKTsKLQkJCX0KLQkJfQogCiAJCXN0cmluZyBDcmVhdGVXb3JrYm9va1JlbChzdHJpbmcgTmFtZSwgaW50IHNoZWV0SUQsIFVyaSB1cmlXb3Jrc2hlZXQsIGJvb2wgaXNDaGFydCkKICAgICAgICAgewpAQCAtODYzLDEyNyArMjg3LDcgQEAKICAgICAgICAgICAgIHJldHVybiB4bWxEb2M7CiAJCX0KIAkJI2VuZHJlZ2lvbgotCQkjcmVnaW9uIERlbGV0ZSBXb3Jrc2hlZXQKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gRGVsZXRlcyBhIHdvcmtzaGVldCBmcm9tIHRoZSBjb2xsZWN0aW9uCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCS8vLyA8cGFyYW0gbmFtZT0iSW5kZXgiPlRoZSBwb3NpdGlvbiBvZiB0aGUgd29ya3NoZWV0IGluIHRoZSB3b3JrYm9vazwvcGFyYW0+Ci0JCXB1YmxpYyB2b2lkIERlbGV0ZShpbnQgSW5kZXgpCi0JCXsKLQkJCS8qCi0gICAgICAgICAgICAqIEhhY2sgdG8gcHJlZmV0Y2ggYWxsIHRoZSBkcmF3aW5ncywKLSAgICAgICAgICAgICogc28gdGhhdCBhbGwgdGhlIGltYWdlcyBhcmUgcmVmZXJlbmNlZCwgCi0gICAgICAgICAgICAqIHRvIHByZXZlbnQgdGhlIGRlbGV0aW9uIG9mIHRoZSBpbWFnZSBmaWxlLCAKLSAgICAgICAgICAgICogd2hlbiByZWZlcmVuY2VkIG1vcmUgdGhhbiBvbmNlCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgZm9yZWFjaCAodmFyIHdzIGluIF93b3Jrc2hlZXRzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBkcmF3aW5ncyA9IHdzLlZhbHVlLkRyYXdpbmdzOyAKLSAgICAgICAgICAgIH0JCQkKLSAgICAgICAgICAgIAotICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0ID0gX3dvcmtzaGVldHNbSW5kZXhdOwotICAgICAgICAgICAgaWYgKHdvcmtzaGVldC5EcmF3aW5ncy5Db3VudCA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd29ya3NoZWV0LkRyYXdpbmdzLkNsZWFyRHJhd2luZ3MoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9SZW1vdmUgYWxsIGNvbW1lbnRzCi0gICAgICAgICAgICBpZiAoISh3b3Jrc2hlZXQgaXMgRXhjZWxDaGFydHNoZWV0KSAmJiB3b3Jrc2hlZXQuQ29tbWVudHMuQ291bnQgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdvcmtzaGVldC5Db21tZW50cy5DbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0JCSAgICAvL0RlbGV0ZSBhbnkgcGFydHMgc3RpbGwgd2l0aCByZWxhdGlvbnMgdG8gdGhlIFdvcmtzaGVldC4KLSAgICAgICAgICAgIERlbGV0ZVJlbGF0aW9uc0FuZFBhcnRzKHdvcmtzaGVldC5QYXJ0KTsKLQotCi0gICAgICAgICAgICAvL0RlbGV0ZSB0aGUgd29ya3NoZWV0IHBhcnQgYW5kIHJlbGF0aW9uIGZyb20gdGhlIHBhY2thZ2UgCi0JCQlfcGNrLldvcmtib29rLlBhcnQuRGVsZXRlUmVsYXRpb25zaGlwKHdvcmtzaGVldC5SZWxhdGlvbnNoaXBJRCk7Ci0KLSAgICAgICAgICAgIC8vRGVsZXRlIHdvcmtzaGVldCBmcm9tIHRoZSB3b3JrYm9vayBYTUwKLQkJCVhtbE5vZGUgc2hlZXRzTm9kZSA9IF9wY2suV29ya2Jvb2suV29ya2Jvb2tYbWwuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOndvcmtib29rL2Q6c2hlZXRzIiwgX25hbWVzcGFjZU1hbmFnZXIpOwotCQkJaWYgKHNoZWV0c05vZGUgIT0gbnVsbCkKLQkJCXsKLQkJCQlYbWxOb2RlIHNoZWV0Tm9kZSA9IHNoZWV0c05vZGUuU2VsZWN0U2luZ2xlTm9kZShzdHJpbmcuRm9ybWF0KCIuL2Q6c2hlZXRbQHNoZWV0SWQ9ezB9XSIsIHdvcmtzaGVldC5TaGVldElEKSwgX25hbWVzcGFjZU1hbmFnZXIpOwotCQkJCWlmIChzaGVldE5vZGUgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCXNoZWV0c05vZGUuUmVtb3ZlQ2hpbGQoc2hlZXROb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlfd29ya3NoZWV0cy5SZW1vdmUoSW5kZXgpOwotICAgICAgICAgICAgaWYgKF9wY2suV29ya2Jvb2suVmJhUHJvamVjdCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9wY2suV29ya2Jvb2suVmJhUHJvamVjdC5Nb2R1bGVzLlJlbW92ZSh3b3Jrc2hlZXQuQ29kZU1vZHVsZSk7Ci0gICAgICAgICAgICB9Ci0JCQlSZWluZGV4V29ya3NoZWV0RGljdGlvbmFyeSgpOwotICAgICAgICAgICAgLy9JZiB0aGUgYWN0aXZlIHNoZWV0IGlzIGRlbGV0ZWQsIHNldCB0aGUgZmlyc3QgdGFiIGFzIGFjdGl2ZS4KLSAgICAgICAgICAgIGlmIChfcGNrLldvcmtib29rLlZpZXcuQWN0aXZlVGFiID49IF9wY2suV29ya2Jvb2suV29ya3NoZWV0cy5Db3VudCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfcGNrLldvcmtib29rLlZpZXcuQWN0aXZlVGFiID0gX3Bjay5Xb3JrYm9vay5WaWV3LkFjdGl2ZVRhYi0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKF9wY2suV29ya2Jvb2suVmlldy5BY3RpdmVUYWIgPT0gd29ya3NoZWV0LlNoZWV0SUQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3Bjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzWzFdLlZpZXcuVGFiU2VsZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd29ya3NoZWV0ID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBEZWxldGVSZWxhdGlvbnNBbmRQYXJ0cyhQYWNrYWdpbmcuWmlwUGFja2FnZVBhcnQgcGFydCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlbHMgPSBwYXJ0LkdldFJlbGF0aW9uc2hpcHMoKS5Ub0xpc3QoKTsKLSAgICAgICAgICAgIGZvcihpbnQgaT0wO2k8cmVscy5Db3VudDtpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHJlbCA9IHJlbHNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKHJlbC5SZWxhdGlvbnNoaXBUeXBlICE9IEV4Y2VsUGFja2FnZS5zY2hlbWFJbWFnZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERlbGV0ZVJlbGF0aW9uc0FuZFBhcnRzKF9wY2suUGFja2FnZS5HZXRQYXJ0KFVyaUhlbHBlci5SZXNvbHZlUGFydFVyaShyZWwuU291cmNlVXJpLCByZWwuVGFyZ2V0VXJpKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYXJ0LkRlbGV0ZVJlbGF0aW9uc2hpcChyZWwuSWQpOwotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICAgICAgX3Bjay5QYWNrYWdlLkRlbGV0ZVBhcnQocGFydC5VcmkpOwotICAgICAgICB9Ci0KLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gRGVsZXRlcyBhIHdvcmtzaGVldCBmcm9tIHRoZSBjb2xsZWN0aW9uCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCS8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+VGhlIG5hbWUgb2YgdGhlIHdvcmtzaGVldCBpbiB0aGUgd29ya2Jvb2s8L3BhcmFtPgotCQlwdWJsaWMgdm9pZCBEZWxldGUoc3RyaW5nIG5hbWUpCi0JCXsKLQkJCXZhciBzaGVldCA9IHRoaXNbbmFtZV07Ci0JCQlpZiAoc2hlZXQgPT0gbnVsbCkKLQkJCXsKLQkJCQl0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiQ291bGQgbm90IGZpbmQgd29ya3NoZWV0IHRvIGRlbGV0ZSAnezB9JyIsIG5hbWUpKTsKLQkJCX0KLQkJCURlbGV0ZShzaGVldC5Qb3NpdGlvbklEKTsKLQkJfQotCQkvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBEZWxldGUgYSB3b3Jrc2hlZXQgZnJvbSB0aGUgY29sbGVjdGlvbgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IldvcmtzaGVldCI+VGhlIHdvcmtzaGVldCB0byBkZWxldGU8L3BhcmFtPgotICAgICAgICBwdWJsaWMgdm9pZCBEZWxldGUoRXhjZWxXb3Jrc2hlZXQgV29ya3NoZWV0KQotCQl7Ci0gICAgICAgICAgICBpZiAoV29ya3NoZWV0LlBvc2l0aW9uSUQgPD0gX3dvcmtzaGVldHMuQ291bnQgJiYgV29ya3NoZWV0ID09IF93b3Jrc2hlZXRzW1dvcmtzaGVldC5Qb3NpdGlvbklEXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEZWxldGUoV29ya3NoZWV0LlBvc2l0aW9uSUQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oIldvcmtzaGVldCBpcyBub3QgaW4gdGhlIGNvbGxlY3Rpb24uIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLQkJcHJpdmF0ZSB2b2lkIFJlaW5kZXhXb3Jrc2hlZXREaWN0aW9uYXJ5KCkKLQkJewotCQkJdmFyIGluZGV4ID0gMTsKLQkJCXZhciB3b3Jrc2hlZXRzID0gbmV3IERpY3Rpb25hcnk8aW50LCBFeGNlbFdvcmtzaGVldD4oKTsKLQkJCWZvcmVhY2ggKHZhciBlbnRyeSBpbiBfd29ya3NoZWV0cykKLQkJCXsKLQkJCQllbnRyeS5WYWx1ZS5Qb3NpdGlvbklEID0gaW5kZXg7Ci0JCQkJd29ya3NoZWV0cy5BZGQoaW5kZXgrKywgZW50cnkuVmFsdWUpOwotCQkJfQotCQkJX3dvcmtzaGVldHMgPSB3b3Jrc2hlZXRzOwotCQl9Ci0KKwkKIAkJLy8vIDxzdW1tYXJ5PgogCQkvLy8gUmV0dXJucyB0aGUgd29ya3NoZWV0IGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uICAKIAkJLy8vIDwvc3VtbWFyeT4KQEAgLTEwMTYsMjEgKzMyMCw2IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEdldEJ5TmFtZShOYW1lKTsKIAkJCX0KIAkJfQotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBDb3BpZXMgdGhlIG5hbWVkIHdvcmtzaGVldCBhbmQgY3JlYXRlcyBhIG5ldyB3b3Jrc2hlZXQgaW4gdGhlIHNhbWUgd29ya2Jvb2sKLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJOYW1lIj5UaGUgbmFtZSBvZiB0aGUgZXhpc3Rpbmcgd29ya3NoZWV0PC9wYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJOZXdOYW1lIj5UaGUgbmFtZSBvZiB0aGUgbmV3IHdvcmtzaGVldCB0byBjcmVhdGU8L3BhcmFtPgotCQkvLy8gPHJldHVybnM+VGhlIG5ldyBjb3B5IGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIHdvcmtzaGVldHMgY29sbGVjdGlvbjwvcmV0dXJucz4KLQkJcHVibGljIEV4Y2VsV29ya3NoZWV0IENvcHkoc3RyaW5nIE5hbWUsIHN0cmluZyBOZXdOYW1lKQotCQl7Ci0gICAgICAgICAgICBFeGNlbFdvcmtzaGVldCBDb3B5ID0gdGhpc1tOYW1lXTsKLSAgICAgICAgICAgIGlmIChDb3B5ID09IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIkNvcHkgd29ya3NoZWV0IGVycm9yOiBDb3VsZCBub3QgZmluZCB3b3Jrc2hlZXQgdG8gY29weSAnezB9JyIsIE5hbWUpKTsKLQotICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgYWRkZWQgPSBBZGQoTmV3TmFtZSwgQ29weSk7Ci0gICAgICAgICAgICByZXR1cm4gYWRkZWQ7Ci0gICAgICAgIH0KIAkJI2VuZHJlZ2lvbgogICAgICAgICBpbnRlcm5hbCBFeGNlbFdvcmtzaGVldCBHZXRCeVNoZWV0SUQoaW50IGxvY2FsU2hlZXRJRCkKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvRVBQbHVzL0ZvbnRTaXplLmNzIGIvRVBQbHVzL0ZvbnRTaXplLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjVhNzI2Li4wMDAwMDAwCi0tLSBhL0VQUGx1cy9Gb250U2l6ZS5jcworKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci0KLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sCi17Ci0gICAgcHVibGljIGNsYXNzIEZvbnRTaXplSW5mbwotICAgIHsKLSAgICAgICAgcHVibGljIEZvbnRTaXplSW5mbyhmbG9hdCBoZWlnaHQsIGZsb2F0IHdpZHRoKQotICAgICAgICB7Ci0gICAgICAgICAgICBXaWR0aCA9IHdpZHRoOwotICAgICAgICAgICAgSGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBmbG9hdCBIZWlnaHQgeyBnZXQ7IHNldDsgfQotICAgICAgICBwdWJsaWMgZmxvYXQgV2lkdGggeyBnZXQ7IHNldDsgfQotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvbnRTaXplCi0gICAgewotICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdGljIERpY3Rpb25hcnk8c3RyaW5nLCBEaWN0aW9uYXJ5PGZsb2F0LCBGb250U2l6ZUluZm8+PiBGb250SGVpZ2h0cyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgRGljdGlvbmFyeTxmbG9hdCwgRm9udFNpemVJbmZvPj4oU3RyaW5nQ29tcGFyZXIuSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHsiVGltZXMgTmV3IFJvbWFuIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw4KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsOSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMTIpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNSwxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM3LDE0KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDEsMTYpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NCwxOCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ3LDE5KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjEsMjQpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MiwzMil9LHs3MixuZXcgRm9udFNpemVJbmZvKDEyMiw0OCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2NCw2NCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTYsODYpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDI4LDE3MSl9fX0sCi0gICAgICAgICAgICB7IkFyaWFsIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNiwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwyMSl9LHszNixuZXcgRm9udFNpemVJbmZvKDU5LDI3KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oNzksMzYpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMjAsNTMpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTksNzEpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjEzLDk1KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQyNCwxOTApfX19LAotICAgICAgICAgICAgeyJDb3VyaWVyIE5ldyIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsMTApfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSwxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI4LDEzKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzIsMTQpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNSwxNil9LHsyMixuZXcgRm9udFNpemVJbmZvKDM4LDE3KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDIsMTkpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NiwyMSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ4LDIyKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjIsMjkpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MywzOCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDEyMyw1OCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2NCw3Nyl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTksMTAzKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ0NCwyMDUpfX19LAotICAgICAgICAgICAgeyJTeW1ib2wiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDQpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI5LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMTIpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNSwxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM4LDE1KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDAsMTYpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NCwxOCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ4LDE5KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjAsMjQpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg3OSwzMil9LHs3MixuZXcgRm9udFNpemVJbmZvKDEyMCw0OCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1OSw2NCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTIsODYpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDIxLDE3MSl9fX0sCi0gICAgICAgICAgICB7IldpbmdkaW5ncyIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsMTEpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDE1KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsMTcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCwyMCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDIyKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsMjYpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNiwyOCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMwLDMyKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMzYpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNiwzOSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDQzKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDMsNDcpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0Niw1MCl9LHszNixuZXcgRm9udFNpemVJbmZvKDU5LDY0KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oNzksODYpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMTcsMTI5KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU2LDE3Mil9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMDgsMjMwKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQxNCw0NTcpfX19LAotICAgICAgICAgICAgeyJTaW1TdW4iLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMTIpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM2LDE1KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDIsMTYpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NSwxOCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ3LDE5KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjIsMjQpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MiwzMil9LHs3MixuZXcgRm9udFNpemVJbmZvKDEyMyw0OCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2Myw2NCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTgsODYpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDM2LDE3MSl9fX0sCi0gICAgICAgICAgICB7IkNlbnR1cnkiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM2LDE2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDAsMTgpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NCwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ2LDIxKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNTksMjcpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg3OSwzNil9LHs3MixuZXcgRm9udFNpemVJbmZvKDExOCw1Myl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1Nyw3MSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMDksOTUpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDE2LDE5MCl9fX0sCi0gICAgICAgICAgICB7IlN5bGZhZW4iLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMSw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDI0LDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNiwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI4LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzIsMTIpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNiwxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQxLDE1KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDQsMTYpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0OCwxOCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ5LDE5KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjMsMjQpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4NiwzMil9LHs3MixuZXcgRm9udFNpemVJbmZvKDEyOSw0OCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2Nyw2NCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMjQsODYpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDUyLDE3MSl9fX0sCi0gICAgICAgICAgICB7IkNhbWJyaWEgTWF0aCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oODUsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDEwMiw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMTE3LDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygxMjQsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDE0NywxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDE2MiwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDE4NiwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDIwOSwxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDIyMywxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDI0OCwxOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDI3MCwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDI4NSwyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDM3MSwyNyl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDQ5MywzNSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDczOSw1Myl9LHs5NixuZXcgRm9udFNpemVJbmZvKDk4Niw3MSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygxMzE3LDk1KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDIwNDcsMTg5KX19fSwKLSAgICAgICAgICAgIHsiWXUgR290aGljIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjIsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDI1LDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyNiw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMzIsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzNCwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDQwLDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDQsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0NywxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDUzLDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTcsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1OSwyMSl9LHszNixuZXcgRm9udFNpemVJbmZvKDc4LDI3KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oMTAyLDM2KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMTU0LDUzKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMjA2LDcxKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI3Niw5NSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg1NTEsMTkwKX19fSwKLSAgICAgICAgICAgIHsiRGVuZ1hpYW4iLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSwxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMTQpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNSwxNil9LHsyMixuZXcgRm9udFNpemVJbmZvKDM3LDE3KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDEsMTkpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NSwyMCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ3LDIxKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjEsMjgpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MSwzNyl9LHs3MixuZXcgRm9udFNpemVJbmZvKDEyMSw1Nil9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2MSw3NCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTUsOTkpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDI4LDE5Nyl9fX0sCi0gICAgICAgICAgICB7IkFyaWFsIFVuaWNvZGUgTVMiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMSw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNywxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDMwLDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzYsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzOSwxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQyLDE2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDYsMTgpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0OSwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDU0LDIxKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjgsMjcpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MCwzNil9LHs3MixuZXcgRm9udFNpemVJbmZvKDEzNyw1Myl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE4Miw3MSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNDIsOTUpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDgwLDE5MCl9fX0sCi0gICAgICAgICAgICB7IkNhbGlicmkgTGlnaHQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI4LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMTIpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNSwxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM4LDE1KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDIsMTYpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NSwxOCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ4LDE5KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjIsMjQpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MiwzMil9LHs3MixuZXcgRm9udFNpemVJbmZvKDEyMyw0OSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2Myw2NSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTgsODcpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDM0LDE3Myl9fX0sCi0gICAgICAgICAgICB7IkNhbGlicmkiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI4LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMTIpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNSwxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM4LDE1KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDIsMTYpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NSwxOCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ4LDE5KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjIsMjQpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MiwzMil9LHs3MixuZXcgRm9udFNpemVJbmZvKDEyMyw0OSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2Myw2NSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTgsODcpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDM0LDE3Myl9fX0sCi0gICAgICAgICAgICB7Ikdlb3JnaWEiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDEwKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsMTIpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxMyl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDE1KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTcpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNiwxOCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDIwKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMjEpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwyMyl9LHszNixuZXcgRm9udFNpemVJbmZvKDYwLDI5KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oNzksMzkpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMTgsNTkpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTcsNzkpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjA5LDEwNSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MTcsMjA5KX19fSwKLSAgICAgICAgICAgIHsiQ2FtYnJpYSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMCwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzYsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCwxOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ0LDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDYsMjApfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MCwyNyl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDc5LDM1KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMTE4LDUzKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU3LDcxKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxMCw5NSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MTgsMTg5KX19fSwKLSAgICAgICAgICAgIHsiTWFybGV0dCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsMTEpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCwxMyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDE1KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsMTYpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNiwxOSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI4LDIxKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMjQpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwyNyl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM2LDI5KX0sezI0LG5ldyBGb250U2l6ZUluZm8oMzksMzIpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0MiwzNSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ0LDM3KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNTUsNDgpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg3MSw2NCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDEwMyw5Nil9LHs5NixuZXcgRm9udFNpemVJbmZvKDEzNSwxMjgpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMTc4LDE3MSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbygzNDgsMzQxKX19fSwKLSAgICAgICAgICAgIHsiQXJpYWwgQmxhY2siLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMSw5KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjUsMTApfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyNiwxMSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDMwLDEzKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzMsMTQpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNiwxNil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQyLDE4KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDUsMTkpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0OSwyMSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDU1LDIzKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTcsMjUpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3NCwzMil9LHs0OCxuZXcgRm9udFNpemVJbmZvKDk3LDQzKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMTQ3LDY0KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTk1LDg1KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI1OSwxMTQpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNTE2LDIyNyl9fX0sCi0gICAgICAgICAgICB7IkNhbmRhcmEiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI4LDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNSwxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM4LDE2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDIsMTgpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NSwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ4LDIwKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjIsMjYpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MiwzNSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDEyMyw1Myl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2Myw3MSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTgsOTQpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDM0LDE4OCl9fX0sCi0gICAgICAgICAgICB7IkNvbWljIFNhbnMgTVMiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMSw4KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsOSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDI2LDEwKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjgsMTIpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzMiwxMyl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM2LDE1KX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDIsMTYpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0NCwxOCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDUwLDIwKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTQsMjEpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1NywyMyl9LHszNixuZXcgRm9udFNpemVJbmZvKDczLDI5KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTgsMzkpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxNDcsNTkpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxOTAsNzgpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjU4LDEwNCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg1MTEsMjA4KX19fSwKLSAgICAgICAgICAgIHsiQ29uc29sYXMiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNSwxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM3LDE2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDEsMTgpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NSwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ3LDIwKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjEsMjYpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MSwzNSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDEyMSw1Myl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2MSw3MCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTUsOTQpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDI4LDE4Nyl9fX0sCi0gICAgICAgICAgICB7IkNvbnN0YW50aWEiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI4LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNSwxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM4LDE2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDIsMTcpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NSwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ4LDIwKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjIsMjYpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MiwzNSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDEyMyw1Mil9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2Myw3MCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTgsOTMpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDM0LDE4Nil9fX0sCi0gICAgICAgICAgICB7IkNvcmJlbCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjgsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM1LDE0KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzgsMTUpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MiwxNyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ1LDE4KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDgsMTkpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MiwyNSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgyLDM0KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMTIzLDUwKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTYzLDY3KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxOCw5MCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MzQsMTc5KX19fSwKLSAgICAgICAgICAgIHsiRWJyaW1hIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzNCwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM1LDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDEsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0NCwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDUwLDE3KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTEsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1NCwyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDcwLDI2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTQsMzUpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMzgsNTIpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxODQsNjkpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQ1LDkyKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ5MCwxODQpfX19LAotICAgICAgICAgICAgeyJGcmFua2xpbiBHb3RoaWMgTWVkaXVtIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIxLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMiw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjYsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMyLDE0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzYsMTYpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOSwxNyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDE5KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMjEpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwyMil9LHszNixuZXcgRm9udFNpemVJbmZvKDY0LDI4KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODUsMzgpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMjYsNTYpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjgsNzUpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjI0LDEwMCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MTYsMjAwKX19fSwKLSAgICAgICAgICAgIHsiR2FicmlvbGEiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDI1LDQpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyNiw1KX0sezExLG5ldyBGb250U2l6ZUluZm8oMzIsNil9LHsxMixuZXcgRm9udFNpemVJbmZvKDMzLDYpfSx7MTQsbmV3IEZvbnRTaXplSW5mbyg0MCw4KX0sezE2LG5ldyBGb250U2l6ZUluZm8oNDQsOCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDUxLDEwKX0sezIwLG5ldyBGb250U2l6ZUluZm8oNTYsMTEpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg2MSwxMil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDY2LDEzKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNzMsMTQpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg3NiwxNSl9LHszNixuZXcgRm9udFNpemVJbmZvKDk4LDE5KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oMTMxLDI2KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMTk1LDM4KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMjYyLDUxKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDM0OSw2OSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg2OTMsMTM3KX19fSwKLSAgICAgICAgICAgIHsiR2FkdWdpIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNywxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDE3KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NywyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDYwLDI2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODEsMzUpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMjAsNTIpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTksNjkpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjEzLDkyKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ4MiwxODQpfX19LAotICAgICAgICAgICAgeyJJbXBhY3QiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjEsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIyLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI4LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNiwxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM4LDE2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDAsMTcpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NSwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ2LDIwKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjMsMjYpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MywzNSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDExOSw1Mil9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1OCw2OSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTIsOTMpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDIwLDE4NSl9fX0sCi0gICAgICAgICAgICB7IkphdmFuZXNlIFRleHQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDMwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygzMyw4KX0sezExLG5ldyBGb250U2l6ZUluZm8oMzksOSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDQxLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbyg0OSwxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDUzLDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oNjEsMTQpfSx7MjAsbmV3IEZvbnRTaXplSW5mbyg3MCwxNil9LHsyMixuZXcgRm9udFNpemVJbmZvKDc0LDE3KX0sezI0LG5ldyBGb250U2l6ZUluZm8oODIsMTkpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg5MCwyMSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDk0LDIyKX0sezM2LG5ldyBGb250U2l6ZUluZm8oMTIyLDI4KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oMTYyLDM4KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMjQzLDU3KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMzI0LDc2KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDQzMywxMDEpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oODYwLDIwMCl9fX0sCi0gICAgICAgICAgICB7IkxlZWxhd2FkZWUgVUkiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNywxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDM0LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzUsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbyg0MSwxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQ0LDE2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNTAsMTcpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1MSwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDU0LDIwKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNzAsMjYpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MiwzNSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDEzNiw1Mil9LHs5NixuZXcgRm9udFNpemVJbmZvKDE4MCw2OSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNDEsOTIpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDgyLDE4NCl9fX0sCi0gICAgICAgICAgICB7IkxlZWxhd2FkZWUgVUkgU2VtaWxpZ2h0IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzNCwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM1LDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDEsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0NCwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDUwLDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTEsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1NCwyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDcwLDI2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTIsMzUpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMzYsNTMpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxODAsNzApfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQxLDk0KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ4MiwxODcpfX19LAotICAgICAgICAgICAgeyJMdWNpZGEgQ29uc29sZSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsMTApfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI2LDEzKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMTQpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxNil9LHsyMixuZXcgRm9udFNpemVJbmZvKDM2LDE3KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDAsMTkpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0MywyMSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ2LDIyKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNTksMjkpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg3OSwzOSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDExNyw1OCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1Niw3Nyl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMDgsMTAzKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQxNCwyMDUpfX19LAotICAgICAgICAgICAgeyJMdWNpZGEgU2FucyBVbmljb2RlIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMiwxMCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDEyKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjYsMTMpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMCwxNSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM2LDE3KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzYsMTgpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCwyMCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQzLDIyKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDYsMjMpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MSwzMCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDc5LDQwKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMTE3LDYxKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU4LDgxKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxMCwxMDgpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNTU4LDIxNil9fX0sCi0gICAgICAgICAgICB7Ik1hbGd1biBHb3RoaWMiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNywxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDM1LDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzUsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbyg0MiwxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQ1LDE2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNTEsMTgpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1MiwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDU1LDIwKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNzIsMjYpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MywzNSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDEzNyw1Myl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE4MSw3MSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNDIsOTQpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDg0LDE4OCl9fX0sCi0gICAgICAgICAgICB7Ik1hbGd1biBHb3RoaWMgU2VtaWxpZ2h0IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzNSwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM1LDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDIsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0NSwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDUxLDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTIsMjApfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1NSwyMSl9LHszNixuZXcgRm9udFNpemVJbmZvKDcyLDI3KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTMsMzYpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMzcsNTQpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxODEsNzIpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQyLDk2KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ4NCwxOTApfX19LAotICAgICAgICAgICAgeyJNaWNyb3NvZnQgSGltYWxheWEiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDQpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMSw0KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsNSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDI0LDUpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyOCw2KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzEsNyl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM1LDgpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzOSw5KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDIsMTApfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0NiwxMSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDUwLDEyKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTMsMTIpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2OSwxNil9LHs0OCxuZXcgRm9udFNpemVJbmZvKDkxLDIxKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMTM2LDMyKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTgxLDQzKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0Miw1Nyl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0ODEsMTE0KX19fSwKLSAgICAgICAgICAgIHsiTWljcm9zb2Z0IEpoZW5nSGVpIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDE0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsMTYpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNywxNyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQxLDE5KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMjApfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OCwyMSl9LHszNixuZXcgRm9udFNpemVJbmZvKDYyLDI4KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODIsMzcpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMjIsNTYpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjIsNzQpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE3LDk5KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ4MSwxOTgpfX19LAotICAgICAgICAgICAgeyJNaWNyb3NvZnQgSmhlbmdIZWkgVUkiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSwxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMTQpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNywxNil9LHsyMixuZXcgRm9udFNpemVJbmZvKDM4LDE3KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDIsMTkpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NSwyMCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ4LDIxKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjIsMjgpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MiwzNyl9LHs3MixuZXcgRm9udFNpemVJbmZvKDEyMyw1Nil9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2NCw3NCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTgsOTkpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDM5LDE5OCl9fX0sCi0gICAgICAgICAgICB7Ik1pY3Jvc29mdCBKaGVuZ0hlaSBMaWdodCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjgsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxNCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM1LDE2KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzcsMTcpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MSwxOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ1LDIwKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDgsMjEpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MiwyOCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgyLDM3KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMTIyLDU1KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTYyLDc0KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxNyw5OCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0ODEsMTk2KX19fSwKLSAgICAgICAgICAgIHsiTWljcm9zb2Z0IEpoZW5nSGVpIFVJIExpZ2h0IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDE0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsMTYpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNywxNyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQxLDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMjApfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OCwyMSl9LHszNixuZXcgRm9udFNpemVJbmZvKDYyLDI4KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODIsMzcpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMjIsNTUpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjIsNzQpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE3LDk4KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQzOSwxOTYpfX19LAotICAgICAgICAgICAgeyJNaWNyb3NvZnQgTmV3IFRhaSBMdWUiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMSw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNywxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDMwLDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzUsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzOCwxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQxLDE2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDUsMTcpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0OSwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUyLDIwKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjcsMjYpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4OSwzNSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDEzNCw1Mil9LHs5NixuZXcgRm9udFNpemVJbmZvKDE3OCw2OSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMzcsOTIpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDcyLDE4NCl9fX0sCi0gICAgICAgICAgICB7Ik1pY3Jvc29mdCBQaGFnc1BhIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjYsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOSwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMzLDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzYsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOSwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQzLDE3KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDgsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MSwyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDY0LDI2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODYsMzUpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMjgsNTIpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNzEsNjkpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjI4LDkyKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ1MiwxODQpfX19LAotICAgICAgICAgICAgeyJNaWNyb3NvZnQgU2FucyBTZXJpZiIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDMzLDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzYsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MSwxOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQzLDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDUsMjEpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MCwyNyl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDc5LDM2KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMTE3LDUzKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU3LDcxKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIwOCw5NSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MTQsMTkwKX19fSwKLSAgICAgICAgICAgIHsiTWljcm9zb2Z0IFRhaSBMZSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMSw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI2LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjksMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMywxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM3LDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDAsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0NCwxNyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ4LDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTEsMjApfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2NiwyNil9LHs0OCxuZXcgRm9udFNpemVJbmZvKDg3LDM1KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMTMwLDUyKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTczLDY5KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIzMSw5Mil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0NTksMTg0KX19fSwKLSAgICAgICAgICAgIHsiTWljcm9zb2Z0IFlhSGVpIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMSw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzMCwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMzLDE0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzcsMTYpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0MCwxNyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQzLDE5KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDksMjEpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MSwyMil9LHszNixuZXcgRm9udFNpemVJbmZvKDY1LDI4KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODYsMzgpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMjgsNTYpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNzAsNzUpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjI4LDEwMCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0NzEsMjAwKX19fSwKLSAgICAgICAgICAgIHsiTWljcm9zb2Z0IFlhSGVpIFVJIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMSw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzMCwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMzLDE0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzcsMTYpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0MCwxNyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQzLDE5KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDksMjEpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MSwyMil9LHszNixuZXcgRm9udFNpemVJbmZvKDY1LDI4KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODYsMzgpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMjgsNTYpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNzAsNzUpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjI4LDEwMCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MzksMjAwKX19fSwKLSAgICAgICAgICAgIHsiTWljcm9zb2Z0IFlhSGVpIExpZ2h0IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMSw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjIsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzMCwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMzLDE0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzcsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0MiwxNyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQ1LDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTEsMjApfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MywyMSl9LHszNixuZXcgRm9udFNpemVJbmZvKDY3LDI4KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODgsMzcpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygxMzIsNTUpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNzYsNzMpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjM2LDk4KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ1OSwxOTUpfX19LAotICAgICAgICAgICAgeyJNaWNyb3NvZnQgWWFIZWkgVUkgTGlnaHQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIxLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMiw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsOSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNywxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDMwLDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzMsMTQpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNywxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQwLDE3KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDMsMTgpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0OSwyMCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUxLDIxKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjUsMjgpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4NiwzNyl9LHs3MixuZXcgRm9udFNpemVJbmZvKDEyOCw1NSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE3MCw3Myl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMjgsOTgpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDY5LDE5NSl9fX0sCi0gICAgICAgICAgICB7Ik1pY3Jvc29mdCBZaSBCYWl0aSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjYsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygyOSwxMil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDMyLDE0KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzQsMTUpfSx7MjQsbmV3IEZvbnRTaXplSW5mbygzOCwxNil9LHsyNixuZXcgRm9udFNpemVJbmZvKDQxLDE4KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDMsMTkpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg1NiwyNSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDc0LDMzKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw0OSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE0OSw2Nil9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygxOTgsODgpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oMzk4LDE3NSl9fX0sCi0gICAgICAgICAgICB7Ik1pbmdMaVUtRXh0QiIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMSw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI2LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjgsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNCwxMil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM3LDE0KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDAsMTUpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MywxNil9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ5LDE4KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTEsMTkpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2NywyNCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDkwLDMyKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw0OCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE3OSw2NCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMzgsODYpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDc2LDE3MSl9fX0sCi0gICAgICAgICAgICB7IlBNaW5nTGlVLUV4dEIiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjEsNyl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNiw5KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjgsMTApfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNCwxMSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM3LDEzKX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDAsMTQpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MywxNSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ5LDE2KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTEsMTcpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2NywyMyl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDkwLDMwKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw0NSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE3OSw2MCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMzgsODApfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDc2LDE2MCl9fX0sCi0gICAgICAgICAgICB7Ik1pbmdMaVVfSEtTQ1MtRXh0QiIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMSw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI2LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjgsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNCwxMil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM3LDE0KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDAsMTUpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MywxNil9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ5LDE4KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTEsMTkpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2NywyNCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDkwLDMyKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw0OCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE3OSw2NCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMzgsODYpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDc2LDE3MSl9fX0sCi0gICAgICAgICAgICB7Ik1vbmdvbGlhbiBCYWl0aSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMCwxMil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDE0KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzgsMTUpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MiwxNil9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ2LDE4KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDgsMTkpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MSwyNCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgzLDMyKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw0OCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2Nyw2NCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMjMsODYpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDQ3LDE3MSl9fX0sCi0gICAgICAgICAgICB7Ik1WIEJvbGkiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIxLDgpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsMTEpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMywxMSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI3LDEzKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzAsMTUpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMywxNyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM1LDE5KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDIsMjApfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MywyMil9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ5LDI1KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTEsMjYpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2NSwzNCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDg5LDQ1KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw2Nyl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE3MSw5MCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMzEsMTIwKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDU5NywyMzkpfX19LAotICAgICAgICAgICAgeyJNeWFubWFyIFRleHQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDI1LDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyNiw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjksOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDMxLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygzNiwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDM5LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oNDUsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbyg1MCwxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDUzLDE2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNTgsMTcpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg2NCwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDY3LDIwKX0sezM2LG5ldyBGb250U2l6ZUluZm8oODgsMjYpfSx7NDgsbmV3IEZvbnRTaXplSW5mbygxMTYsMzUpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDUyKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMjMzLDY5KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDMwOSw5Mil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg2NDcsMTg0KX19fSwKLSAgICAgICAgICAgIHsiTmlybWFsYSBVSSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI3LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzQsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNSwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQxLDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDQsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1MCwxNyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDUxLDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTQsMjApfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3MCwyNil9LHs0OCxuZXcgRm9udFNpemVJbmZvKDkyLDM1KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1Mil9LHs5NixuZXcgRm9udFNpemVJbmZvKDE4MCw2OSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNDEsOTIpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDgyLDE4NCl9fX0sCi0gICAgICAgICAgICB7Ik5pcm1hbGEgVUkgU2VtaWxpZ2h0IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzNCwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM1LDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDEsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0NCwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDUwLDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTEsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1NCwyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDcwLDI2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTIsMzUpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDUzKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTgwLDcwKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0MSw5NCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0ODIsMTg3KX19fSwKLSAgICAgICAgICAgIHsiUGFsYXRpbm8gTGlub3R5cGUiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIxLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMSw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDI0LDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyOCwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDMwLDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzQsMTIpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzOCwxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQwLDE1KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDcsMTYpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1MCwxOCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUzLDE5KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjcsMjQpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MCwzMil9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNDgpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNzgsNjQpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQwLDg2KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ3OCwxNzEpfX19LAotICAgICAgICAgICAgeyJTZWdvZSBNREwyIEFzc2V0cyIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiwxMCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDEwKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjYsMTIpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwxNCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDE1KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTcpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNiwxOSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDM5LDIxKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDIsMjMpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NCwyNCl9LHszNixuZXcgRm9udFNpemVJbmZvKDU1LDMxKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oNzEsNDEpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDYyKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTM1LDgzKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDE3OCwxMTApfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oMzQ4LDIxOSl9fX0sCi0gICAgICAgICAgICB7IlNlZ29lIFByaW50IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyNCw4KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjgsMTApfSx7MTEsbmV3IEZvbnRTaXplSW5mbygzMSwxMSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDMzLDEyKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMzksMTQpfSx7MTYsbmV3IEZvbnRTaXplSW5mbyg0MiwxNSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDQ5LDE4KX0sezIwLG5ldyBGb250U2l6ZUluZm8oNTUsMjApfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg1OCwyMSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDY1LDIzKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNzEsMjYpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg3NCwyNyl9LHszNixuZXcgRm9udFNpemVJbmZvKDk3LDM1KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oMTI5LDQ3KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw3MCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDI1OSw5NCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygzNDcsMTI1KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDY4NywyNDgpfX19LAotICAgICAgICAgICAgeyJTZWdvZSBTY3JpcHQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMywxMCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDI1LDExKX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjcsMTIpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygzMywxNCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDM2LDE1KX0sezE4LG5ldyBGb250U2l6ZUluZm8oNDEsMTgpfSx7MjAsbmV3IEZvbnRTaXplSW5mbyg0NSwyMCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDUwLDIxKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNTUsMjMpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1OSwyNil9LHsyOCxuZXcgRm9udFNpemVJbmZvKDYyLDI3KX0sezM2LG5ldyBGb250U2l6ZUluZm8oODEsMzUpfSx7NDgsbmV3IEZvbnRTaXplSW5mbygxMDksNDcpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDcwKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMjE0LDk0KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI4NywxMjUpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNTcxLDI0OCl9fX0sCi0gICAgICAgICAgICB7IlNlZ29lIFVJIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzNCwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM1LDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDEsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0NCwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDUwLDE3KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTEsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1NCwyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDcwLDI2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTIsMzUpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDUyKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTgwLDY5KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0MSw5Mil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0ODIsMTg0KX19fSwKLSAgICAgICAgICAgIHsiU2Vnb2UgVUkgQmxhY2siLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsOSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDEwKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTIpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzNCwxMyl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM1LDE1KX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDEsMTcpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0NCwxOCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDUwLDIwKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTEsMjIpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1NCwyMyl9LHszNixuZXcgRm9udFNpemVJbmZvKDcwLDMwKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTIsNDApfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDYwKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTgyLDc5KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0NSwxMDYpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDg4LDIxMil9fX0sCi0gICAgICAgICAgICB7IlNlZ29lIFVJIEVtb2ppIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzNCwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM1LDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDEsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0NCwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDUwLDE3KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTEsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1NCwyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDcwLDI2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTIsMzUpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDUyKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTgwLDY5KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0MSw5Mil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0ODIsMTg0KX19fSwKLSAgICAgICAgICAgIHsiU2Vnb2UgVUkgSGlzdG9yaWMiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNywxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDM0LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzUsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbyg0MSwxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQ0LDE2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNTAsMTcpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1MSwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDU0LDIwKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNzAsMjYpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MiwzNSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTIpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxODAsNjkpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQxLDkyKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ4MiwxODQpfX19LAotICAgICAgICAgICAgeyJTZWdvZSBVSSBMaWdodCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI3LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzQsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNSwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQxLDE0KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDQsMTUpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1MCwxNyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDUxLDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTQsMjApfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3MCwyNSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDkyLDM0KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1MSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE4MCw2OCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNDEsOTEpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDgyLDE4MSl9fX0sCi0gICAgICAgICAgICB7IlNlZ29lIFVJIFNlbWlib2xkIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzNCwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM1LDE0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDEsMTYpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0NCwxNyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDUwLDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTEsMjApfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1NCwyMSl9LHszNixuZXcgRm9udFNpemVJbmZvKDcwLDI4KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTIsMzcpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDU1KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTgwLDc0KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0MSw5OSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0ODIsMTk2KX19fSwKLSAgICAgICAgICAgIHsiU2Vnb2UgVUkgU2VtaWxpZ2h0IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzNCwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM1LDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDEsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0NCwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDUwLDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTEsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1NCwyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDcwLDI2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTIsMzUpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDUzKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTgwLDcwKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0MSw5NCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0ODIsMTg3KX19fSwKLSAgICAgICAgICAgIHsiU2Vnb2UgVUkgU3ltYm9sIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzNCwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM1LDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDEsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0NCwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDUwLDE3KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTEsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1NCwyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDcwLDI2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTIsMzUpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDUyKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTgwLDY5KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0MSw5Mil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0ODIsMTg0KX19fSwKLSAgICAgICAgICAgIHsiTlNpbVN1biIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMCwxMil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDE0KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzYsMTUpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MiwxNil9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ1LDE4KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDcsMTkpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MiwyNCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgyLDMyKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw0OCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2Myw2NCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTgsODYpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDM2LDE3MSl9fX0sCi0gICAgICAgICAgICB7IlNpbVN1bi1FeHRCIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw4KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNiwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDI5LDEyKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzIsMTQpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNCwxNSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDM4LDE2KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDEsMTgpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0MywxOSl9LHszNixuZXcgRm9udFNpemVJbmZvKDU2LDI0KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oNzQsMzIpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDQ4KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTQ3LDY0KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDE5Niw4Nil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbygzOTAsMTcxKX19fSwKLSAgICAgICAgICAgIHsiU2l0a2EgU21hbGwiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIxLDgpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMiw5KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjcsMTApfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyOCwxMSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDMyLDEzKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzYsMTUpfSx7MTgsbmV3IEZvbnRTaXplSW5mbyg0MCwxNyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQ2LDE5KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDksMjApfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1NSwyMil9LHsyNixuZXcgRm9udFNpemVJbmZvKDU5LDI0KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNjEsMjYpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg4MCwzMyl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDEwNiw0NCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNjYpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygyMTIsODgpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjg0LDExOCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg1NjQsMjM1KX19fSwKLSAgICAgICAgICAgIHsiU2l0a2EgVGV4dCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjEsNyl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyNCwxMCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDI2LDEwKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMzIsMTIpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzNCwxMyl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDQwLDE1KX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDQsMTcpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0NywxOCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDUzLDIwKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTYsMjIpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1OSwyNCl9LHszNixuZXcgRm9udFNpemVJbmZvKDc3LDMxKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oMTAyLDQxKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw2MSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDIwNSw4MSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNzMsMTA5KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDU0NCwyMTYpfX19LAotICAgICAgICAgICAgeyJTaXRrYSBTdWJoZWFkaW5nIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMSw3KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDI0LDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyNiw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMzIsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzNCwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDQwLDE0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDQsMTYpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0NywxNyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDUzLDE5KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTYsMjEpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1OSwyMil9LHszNixuZXcgRm9udFNpemVJbmZvKDc3LDI4KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oMTAyLDM4KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1Nyl9LHs5NixuZXcgRm9udFNpemVJbmZvKDIwNSw3Nil9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNzMsMTAxKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDU0NCwyMDEpfX19LAotICAgICAgICAgICAgeyJTaXRrYSBIZWFkaW5nIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMSw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjIsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDI0LDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyNiw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMzIsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzNCwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDQwLDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDQsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0NywxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDUzLDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTYsMjApfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1OSwyMSl9LHszNixuZXcgRm9udFNpemVJbmZvKDc3LDI3KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oMTAyLDM2KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1NCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDIwNSw3MSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNzMsOTUpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNTQ0LDE5MCl9fX0sCi0gICAgICAgICAgICB7IlNpdGthIERpc3BsYXkiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIxLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMiw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjQsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDI2LDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygzMiwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDM0LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oNDAsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbyg0NCwxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQ3LDE1KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNTMsMTcpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1NiwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDU5LDIwKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNzcsMjUpfSx7NDgsbmV3IEZvbnRTaXplSW5mbygxMDIsMzQpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDUxKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMjA1LDY4KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI3Myw5MSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg1NDQsMTgxKX19fSwKLSAgICAgICAgICAgIHsiU2l0a2EgQmFubmVyIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMSw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjIsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDI0LDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyNiw4KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMzIsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzNCwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDQwLDEyKX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDQsMTQpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0NywxNSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDUzLDE2KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTYsMTgpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1OSwxOSl9LHszNixuZXcgRm9udFNpemVJbmZvKDc3LDI0KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oMTAyLDMyKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw0OSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDIwNSw2NSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNzMsODcpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNTQ0LDE3Myl9fX0sCi0gICAgICAgICAgICB7IlRhaG9tYSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjYsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMCwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzYsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCwxNyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQzLDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDYsMjApfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg1OSwyNil9LHs0OCxuZXcgRm9udFNpemVJbmZvKDc4LDM1KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1Mil9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1NSw3MCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMDcsOTMpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDEyLDE4Nil9fX0sCi0gICAgICAgICAgICB7IlRyZWJ1Y2hldCBNUyIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjEsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIxLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjQsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjgsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM3LDE0KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzgsMTUpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MSwxNyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ1LDE4KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDgsMTkpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MiwyNSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgyLDM0KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1MCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2NCw2Nyl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTksOTApfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDE4LDE3OSl9fX0sCi0gICAgICAgICAgICB7IlZlcmRhbmEiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsMTApfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSwxMCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDEyKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjYsMTMpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMCwxNSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDMzLDE3KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzYsMTgpfSx7MjQsbmV3IEZvbnRTaXplSW5mbygzOSwyMCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQzLDIyKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDcsMjQpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MSwzMSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgwLDQxKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw2MSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1Niw4MSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMDcsMTA5KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQxOCwyMTYpfX19LAotICAgICAgICAgICAgeyJXZWJkaW5ncyIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjQsOCl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjIsMTEpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMSwxMyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIxLDE1KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsMTYpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNiwxOSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDIxKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMjQpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNSwyNyl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM2LDI5KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDAsMzIpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0MywzNSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ2LDM3KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNTksNDgpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg3OCw2NCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsOTYpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTUsMTI4KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIwNiwxNzEpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDEwLDM0MSl9fX0sCi0gICAgICAgICAgICB7Ill1IEdvdGhpYyBVSSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI3LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzQsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNSwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQxLDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDQsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1MCwxNyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDUxLDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTQsMjApfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3MCwyNil9LHs0OCxuZXcgRm9udFNpemVJbmZvKDkyLDM1KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1Mil9LHs5NixuZXcgRm9udFNpemVJbmZvKDE4MCw2OSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNDEsOTIpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDgyLDE4NCl9fX0sCi0gICAgICAgICAgICB7Ill1IEdvdGhpYyBVSSBTZW1pYm9sZCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI3LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzQsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNSwxNCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQxLDE2KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDQsMTcpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1MCwxOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDUxLDIwKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTQsMjEpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3MCwyOCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDkyLDM3KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1NSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE4MCw3NCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNDEsOTkpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDgyLDE5Nil9fX0sCi0gICAgICAgICAgICB7Ill1IEdvdGhpYyBMaWdodCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIyLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyNCw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjYsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDMyLDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzQsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbyg0MCwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQ0LDE0KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDcsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1MywxNyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDU2LDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNjEsMjApfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3NywyNil9LHs0OCxuZXcgRm9udFNpemVJbmZvKDEwMiwzNCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTEpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygyMDUsNjkpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjc1LDkyKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDU1MCwxODMpfX19LAotICAgICAgICAgICAgeyJZdSBHb3RoaWMgVUkgTGlnaHQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNywxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDM0LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzUsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbyg0MSwxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQ0LDE1KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNTAsMTcpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1MSwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDU0LDIwKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNzAsMjUpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MiwzNCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTEpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxODAsNjgpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQxLDkxKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ4MiwxODEpfX19LAotICAgICAgICAgICAgeyJZdSBHb3RoaWMgTWVkaXVtIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjIsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDI0LDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyNiw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMzIsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzNCwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDQwLDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDQsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0NywxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDUzLDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTYsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg2MSwyMSl9LHszNixuZXcgRm9udFNpemVJbmZvKDc3LDI3KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oMTAyLDM2KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1Myl9LHs5NixuZXcgRm9udFNpemVJbmZvKDIwNSw3MSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNzUsOTUpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNTQ5LDE4OSl9fX0sCi0gICAgICAgICAgICB7Ill1IEdvdGhpYyBVSSBTZW1pbGlnaHQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNywxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDM0LDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzUsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbyg0MSwxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQ0LDE2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNTAsMTgpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1MSwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDU0LDIwKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNzAsMjYpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MiwzNSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTMpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxODAsNzApfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQxLDk0KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ4MiwxODcpfX19LAotICAgICAgICAgICAgeyJNVCBFeHRyYSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsMTEpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCwxMyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIxLDE1KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjQsMTYpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyOCwxOSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDMwLDIxKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzYsMjQpfSx7MjAsbmV3IEZvbnRTaXplSW5mbyg0MCwyOCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQyLDMwKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDgsMzMpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1MSwzNil9LHsyOCxuZXcgRm9udFNpemVJbmZvKDU2LDM4KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNzEsNDkpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5NSw2NSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsOTgpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxOTIsMTMxKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI1NywxNzQpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNTExLDM0Nyl9fX0sCi0gICAgICAgICAgICB7IkFnZW5jeSBGQiIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsNil9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI2LDgpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNiw5KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMTApfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxMSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM2LDExKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDQsMTQpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NSwxNSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ4LDE2KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjIsMjEpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MSwyOCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNDIpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjEsNTYpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE2LDc0KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQzMCwxNDgpfX19LAotICAgICAgICAgICAgeyJBbGdlcmlhbiIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMSw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsMTApfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNiwxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI5LDEzKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzQsMTQpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzOCwxNil9LHsyMixuZXcgRm9udFNpemVJbmZvKDQwLDE3KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDYsMTkpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1MCwyMSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUyLDIyKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjgsMjkpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MSwzOCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTgpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxODQsNzcpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQ0LDEwMyl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0ODgsMjA1KX19fSwKLSAgICAgICAgICAgIHsiQm9vayBBbnRpcXVhIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw4KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDEyKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsMTQpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOCwxNSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQyLDE2KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMTgpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OCwxOSl9LHszNixuZXcgRm9udFNpemVJbmZvKDYyLDI0KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODMsMzIpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDQ4KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTY0LDY0KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIyMCw4Nil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MzgsMTcxKX19fSwKLSAgICAgICAgICAgIHsiQXJpYWwgTmFycm93IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDcpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw3KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsOSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDEwKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMTEpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxMil9LHsyMixuZXcgRm9udFNpemVJbmZvKDM2LDEzKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDAsMTUpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NSwxNil9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ3LDE3KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjEsMjIpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MCwyOSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNDQpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTcsNTgpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjEwLDc4KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQxOCwxNTYpfX19LAotICAgICAgICAgICAgeyJBcmlhbCBSb3VuZGVkIE1UIEJvbGQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDEwKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNiwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMwLDE0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTYpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNiwxNyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDE5KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDMsMjEpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwyMil9LHszNixuZXcgRm9udFNpemVJbmZvKDU5LDI5KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oNzksMzgpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDU3KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU2LDc2KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIwOCwxMDIpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDE0LDIwMil9fX0sCi0gICAgICAgICAgICB7IkJhc2tlcnZpbGxlIE9sZCBGYWNlIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw4KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsOSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDEwKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMTIpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNSwxMyl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM4LDE0KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDEsMTYpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NSwxNyl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ4LDE4KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjEsMjQpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MiwzMSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNDcpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjIsNjMpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE2LDg0KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQzMCwxNjgpfX19LAotICAgICAgICAgICAgeyJCYXVoYXVzIDkzIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIzLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyNSw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjgsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzMywxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM3LDE0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDIsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0NSwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDUwLDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTQsMjApfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1NywyMSl9LHszNixuZXcgRm9udFNpemVJbmZvKDc0LDI3KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oMTAwLDM2KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1NSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE5OSw3Myl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNjYsOTcpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNTMxLDE5NCl9fX0sCi0gICAgICAgICAgICB7IkJlbGwgTVQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjEsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI4LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMTIpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNSwxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM4LDE1KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDIsMTYpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NSwxOCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ4LDE5KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjIsMjQpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MiwzMil9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNDgpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjMsNjQpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE4LDg2KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQzMywxNzEpfX19LAotICAgICAgICAgICAgeyJCZXJuYXJkIE1UIENvbmRlbnNlZCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDkpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNiwxMCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMwLDEyKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzMsMTMpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNiwxNCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDM5LDE2KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDMsMTcpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NSwxOCl9LHszNixuZXcgRm9udFNpemVJbmZvKDU5LDI0KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oNzksMzEpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDQ3KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU2LDYzKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIwOCw4NCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MTYsMTY3KX19fSwKLSAgICAgICAgICAgIHsiQm9kb25pIE1UIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMSw1KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw4KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjYsOSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDEwKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzIsMTIpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNSwxMyl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM5LDE0KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDIsMTYpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NSwxNyl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ4LDE4KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjEsMjQpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MywzMSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNDcpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjQsNjMpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjIwLDg0KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQzOCwxNjcpfX19LAotICAgICAgICAgICAgeyJCb2RvbmkgTVQgQmxhY2siLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsMTApfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSwxMSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDEyKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMTQpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxNil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM1LDE4KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzcsMTkpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MSwyMSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ1LDIzKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDcsMjQpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MSwzMSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgxLDQyKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw2Myl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2MSw4NCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTUsMTEyKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQyOCwyMjQpfX19LAotICAgICAgICAgICAgeyJCb2RvbmkgTVQgQ29uZGVuc2VkIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw0KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw1KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsNil9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDcpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSw4KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsOSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM4LDEwKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDEsMTEpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NSwxMil9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ4LDEzKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjEsMTYpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MiwyMil9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsMzIpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjIsNDMpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE2LDU4KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQzMSwxMTUpfX19LAotICAgICAgICAgICAgeyJCb2RvbmkgTVQgUG9zdGVyIENvbXByZXNzZWQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDQpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDYpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCw2KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsNyl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMwLDgpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCw4KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzYsOSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDkpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NCwxMCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ2LDEwKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNTksMTQpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg3OSwxOCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsMjgpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTcsMzgpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjA5LDQ5KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQxNiw5Nil9fX0sCi0gICAgICAgICAgICB7IkJvb2ttYW4gT2xkIFN0eWxlIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjEsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSwxMCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDEyKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMTMpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxNSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDE3KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzcsMTgpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MiwyMCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ0LDIyKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDcsMjMpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MSwzMCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgyLDQwKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw2MCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2Myw3OSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTgsMTA2KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQzNywyMTEpfX19LAotICAgICAgICAgICAgeyJCcmFkbGV5IEhhbmQgSVRDIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjEsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDEwKX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsMTApfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyOCwxMil9LHsxNixuZXcgRm9udFNpemVJbmZvKDMwLDE0KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzUsMTUpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzOSwxNyl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQyLDE5KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDYsMjEpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1MCwyMyl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUzLDI0KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjgsMzEpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MCw0MSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNjIpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxODAsODIpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQwLDExMCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0NzgsMjE5KX19fSwKLSAgICAgICAgICAgIHsiQnJpdGFubmljIEJvbGQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDEwKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsMTIpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNiwxMyl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMwLDE1KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTcpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNiwxOCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDIwKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDMsMjEpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwyMyl9LHszNixuZXcgRm9udFNpemVJbmZvKDU5LDI5KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oNzksMzkpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDU5KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU2LDc4KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIwOCwxMDUpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDE0LDIwOSl9fX0sCi0gICAgICAgICAgICB7IkJlcmxpbiBTYW5zIEZCIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSwxMCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjYsMTMpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMCwxNCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDMzLDE2KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzYsMTcpfSx7MjQsbmV3IEZvbnRTaXplSW5mbygzOSwxOSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQzLDIxKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDUsMjIpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg1OSwyOSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDc4LDM4KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1Nyl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1NSw3Nil9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMDcsMTAyKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQxMSwyMDMpfX19LAotICAgICAgICAgICAgeyJCZXJsaW4gU2FucyBGQiBEZW1pIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSwxMCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDEyKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjYsMTMpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMCwxNSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDE3KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzYsMTgpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCwyMCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQzLDIyKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDYsMjMpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg1OSwzMCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDc4LDQwKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw2MCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1NSw4MSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMDcsMTA4KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQxMiwyMTUpfX19LAotICAgICAgICAgICAgeyJCcm9hZHdheSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCwxMCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDEwKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsMTIpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxNCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMwLDE2KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTcpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNiwxOSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDIxKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMjMpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwyNCl9LHszNixuZXcgRm9udFNpemVJbmZvKDYwLDMxKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oNzksNDEpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDYyKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU3LDgzKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxMCwxMTEpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDE3LDIxOSl9fX0sCi0gICAgICAgICAgICB7IkJydXNoIFNjcmlwdCBNVCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMSw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI2LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjksMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMywxMil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM3LDE0KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDAsMTUpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0NCwxNil9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ4LDE4KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTEsMTkpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2NSwyNCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDg3LDMzKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw0OSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE3Miw2NSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMzAsODcpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDU3LDE3NCl9fX0sCi0gICAgICAgICAgICB7IkJvb2tzaGVsZiBTeW1ib2wgNyIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDEwKX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsMTEpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSwxMil9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDE0KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjYsMTYpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygyOSwxOCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDMyLDIwKX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzQsMjEpfSx7MjQsbmV3IEZvbnRTaXplSW5mbygzOCwyNCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQxLDI2KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDMsMjcpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg1NiwzNSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDc0LDQ3KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw3MSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE0Nyw5NSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygxOTYsMTI2KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDM5MCwyNTEpfX19LAotICAgICAgICAgICAgeyJDYWxpZm9ybmlhbiBGQiIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjEsNSl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM1LDE0KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzcsMTUpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MSwxNyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ1LDE4KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDcsMTkpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MSwyNil9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgxLDM0KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1MSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2Miw2OCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTYsOTEpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDI5LDE4MSl9fX0sCi0gICAgICAgICAgICB7IkNhbGlzdG8gTVQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMTIpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM3LDE1KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDAsMTYpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NCwxOCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ2LDE5KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjAsMjQpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MCwzMyl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNDkpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTgsNjUpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjExLDg3KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQyMCwxNzQpfX19LAotICAgICAgICAgICAgeyJDYXN0ZWxsYXIiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsMTEpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSwxMil9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDE0KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjgsMTUpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMiwxNyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM2LDE5KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzgsMjEpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MiwyMyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ2LDI1KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDgsMjcpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MiwzNSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgzLDQ2KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw2OSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2NSw5Mil9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMjAsMTIzKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQzNywyNDUpfX19LAotICAgICAgICAgICAgeyJDZW50dXJ5IFNjaG9vbGJvb2siLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM2LDE2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDAsMTgpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NCwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ2LDIxKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNTksMjcpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg3OSwzNil9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTMpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTcsNzEpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjA5LDk1KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQxNiwxOTApfX19LAotICAgICAgICAgICAgeyJDZW50YXVyIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw4KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsOSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI4LDEwKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzIsMTIpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNiwxMyl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM4LDE0KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDIsMTYpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NiwxNyl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ4LDE4KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjIsMjQpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MywzMSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNDcpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjUsNjMpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjIwLDg0KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ0MCwxNjcpfX19LAotICAgICAgICAgICAgeyJDaGlsbGVyIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIxLDcpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMiw4KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjYsOSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI4LDEwKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzIsMTEpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNiwxMyl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM5LDE0KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDMsMTUpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NywxNil9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ5LDE3KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjQsMjMpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4NSwzMCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNDUpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjgsNjApfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjI0LDgwKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ0NiwxNjApfX19LAotICAgICAgICAgICAgeyJDb2xvbm5hIE1UIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIxLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw4KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOSwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMzLDEyKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzcsMTQpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0MCwxNSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQ0LDE2KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDgsMTgpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MSwxOSl9LHszNixuZXcgRm9udFNpemVJbmZvKDY2LDI0KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODcsMzIpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDQ4KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTczLDY0KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIzMSw4Nil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0NTksMTcxKX19fSwKLSAgICAgICAgICAgIHsiQ29vcGVyIEJsYWNrIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSwxMCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMTMpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMCwxNCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDE2KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzcsMTcpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCwxOSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ0LDIxKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDYsMjIpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MCwyOSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgwLDM4KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1OCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1OCw3Nyl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTEsMTAzKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQyMCwyMDUpfX19LAotICAgICAgICAgICAgeyJDb3BwZXJwbGF0ZSBHb3RoaWMgQm9sZCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDkpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCwxMSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDExKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsMTQpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxNSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMwLDE3KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTkpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNywyMSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDIzKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMjUpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwyNil9LHszNixuZXcgRm9udFNpemVJbmZvKDYwLDM0KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODAsNDYpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDY4KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU4LDkxKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxMSwxMjIpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDIwLDI0Myl9fX0sCi0gICAgICAgICAgICB7IkNvcHBlcnBsYXRlIEdvdGhpYyBMaWdodCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDkpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCwxMSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDEyKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsMTQpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNiwxNSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMwLDE3KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTkpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNiwyMSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDIzKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDMsMjUpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwyNyl9LHszNixuZXcgRm9udFNpemVJbmZvKDU5LDM1KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oNzgsNDYpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDY5KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU3LDkyKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIwOSwxMjMpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDE4LDI0Nil9fX0sCi0gICAgICAgICAgICB7IkN1cmx6IE1UIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMiw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjgsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzMCwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM0LDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzgsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0MSwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQ1LDE3KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDgsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MSwyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDY1LDI2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODgsMzQpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDUyKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTczLDY5KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIzMyw5Mil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0NjIsMTgzKX19fSwKLSAgICAgICAgICAgIHsiRWxlcGhhbnQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCwxMCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIxLDExKX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjIsMTIpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNiwxNCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI4LDE2KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzIsMTgpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNiwyMCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM5LDIyKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDMsMjQpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NywyNyl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ5LDI4KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjQsMzYpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4NSw0OSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNzMpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjgsOTcpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjI0LDEzMCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0NDYsMjU4KX19fSwKLSAgICAgICAgICAgIHsiRW5ncmF2ZXJzIE1UIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDEwKX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsMTApfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMil9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDE0KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMTYpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxNyl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM3LDE5KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDAsMjEpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NCwyMyl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ2LDI0KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjAsMzEpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MCw0MSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNjIpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTgsODMpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjExLDExMCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MTksMjE5KX19fSwKLSAgICAgICAgICAgIHsiRXJhcyBCb2xkIElUQyIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCwxMCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDEwKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsMTIpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxNCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDE2KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsMTgpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNywxOSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQxLDIxKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMjMpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NywyNCl9LHszNixuZXcgRm9udFNpemVJbmZvKDYxLDMxKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODEsNDIpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDYzKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTYxLDgzKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxNSwxMTEpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDI1LDIyMil9fX0sCi0gICAgICAgICAgICB7IkVyYXMgRGVtaSBJVEMiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDEwKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsMTIpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxMyl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDE1KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsMTYpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNywxOCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQxLDIwKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMjEpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NywyMyl9LHszNixuZXcgRm9udFNpemVJbmZvKDYxLDI5KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODEsMzkpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDU5KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTYxLDc4KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxNSwxMDQpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDI1LDIwOCl9fX0sCi0gICAgICAgICAgICB7IkVyYXMgTGlnaHQgSVRDIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMiw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsMTQpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNywxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQxLDE3KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NywyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDYxLDI2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODEsMzQpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDUxKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTYxLDY5KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxNSw5Mil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MjcsMTgzKX19fSwKLSAgICAgICAgICAgIHsiRXJhcyBNZWRpdW0gSVRDIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDE0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNywxNyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQxLDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMjApfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NywyMSl9LHszNixuZXcgRm9udFNpemVJbmZvKDYxLDI3KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODEsMzcpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDU1KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTYxLDczKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxNSw5OCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MjYsMTk1KX19fSwKLSAgICAgICAgICAgIHsiRmVsaXggVGl0bGluZyIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxNCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM1LDE2KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzcsMTcpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MSwxOSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ0LDIwKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDcsMjIpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MSwyOCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgwLDM3KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1Nil9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2MCw3NSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTMsMTAwKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQyNCwxOTgpfX19LAotICAgICAgICAgICAgeyJGb3J0ZSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMSw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI4LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzAsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNCwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQwLDE0KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDIsMTUpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0NiwxNyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDUxLDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTQsMjApfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3MSwyNSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDk1LDM0KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1MSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE4OCw2OCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNTMsOTEpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNTAzLDE4MSl9fX0sCi0gICAgICAgICAgICB7IkZyYW5rbGluIEdvdGhpYyBCb29rIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIxLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMiw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjYsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMyLDE0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzYsMTYpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOSwxNyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDE5KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMjEpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwyMil9LHszNixuZXcgRm9udFNpemVJbmZvKDY0LDI4KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODUsMzgpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDU2KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTY4LDc1KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIyNCwxMDApfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDE2LDIwMCl9fX0sCi0gICAgICAgICAgICB7IkZyYW5rbGluIEdvdGhpYyBEZW1pIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIxLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMiw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjYsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMyLDE0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzYsMTYpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOSwxNyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDE5KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMjEpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwyMil9LHszNixuZXcgRm9udFNpemVJbmZvKDY0LDI4KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODUsMzgpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDU2KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTY4LDc1KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIyNCwxMDApfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDE2LDIwMCl9fX0sCi0gICAgICAgICAgICB7IkZyYW5rbGluIEdvdGhpYyBEZW1pIENvbmQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjEsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNiwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI4LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzIsMTIpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNiwxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM5LDE1KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDAsMTYpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NCwxOCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ2LDE5KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjQsMjUpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4NSwzMyl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNDkpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjgsNjUpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjI0LDg3KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQxNiwxNzQpfX19LAotICAgICAgICAgICAgeyJGcmFua2xpbiBHb3RoaWMgSGVhdnkiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjEsOSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIyLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNiwxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI4LDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzIsMTQpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNiwxNil9LHsyMixuZXcgRm9udFNpemVJbmZvKDM5LDE3KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDAsMTkpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NCwyMSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ2LDIyKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjQsMjgpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4NSwzOCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTYpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjgsNzUpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjI0LDEwMCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MTYsMjAwKX19fSwKLSAgICAgICAgICAgIHsiRnJhbmtsaW4gR290aGljIE1lZGl1bSBDb25kIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIxLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMiw4KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjYsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMyLDEyKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzYsMTQpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOSwxNSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDE2KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMTgpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwxOSl9LHszNixuZXcgRm9udFNpemVJbmZvKDY0LDI1KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODUsMzMpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDQ5KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTY4LDY1KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIyNCw4Nyl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MTYsMTc0KX19fSwKLSAgICAgICAgICAgIHsiRnJlZXN0eWxlIFNjcmlwdCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNCl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMSw2KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsNil9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI2LDcpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOSw4KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzMsOSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM3LDEwKX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDAsMTApfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MywxMil9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ4LDEzKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTAsMTMpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2NSwxNyl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDg2LDIzKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCwzMyl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE3Miw0NCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMjgsNTgpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDU0LDExNyl9fX0sCi0gICAgICAgICAgICB7IkZyZW5jaCBTY3JpcHQgTVQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDQpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjEsNSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIyLDYpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNiw3KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjgsOCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMyLDkpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNiwxMCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM5LDExKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDMsMTIpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NywxMyl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ5LDE0KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjQsMTgpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4NSwyMyl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsMzUpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjgsNDcpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjI0LDYyKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ0NiwxMjUpfX19LAotICAgICAgICAgICAgeyJGb290bGlnaHQgTVQgTGlnaHQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM3LDE2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDAsMTgpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NCwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ2LDIwKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjAsMjcpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg3OSwzNSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTMpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTgsNzEpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjEwLDk0KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQxOSwxODgpfX19LAotICAgICAgICAgICAgeyJHYXJhbW9uZCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDkpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwxMCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDExKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsMTMpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOCwxNCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQxLDE1KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMTYpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OCwxNyl9LHszNixuZXcgRm9udFNpemVJbmZvKDYyLDIzKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODIsMzApfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDQ1KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTYzLDYwKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxNyw4MCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MzIsMTYwKX19fSwKLSAgICAgICAgICAgIHsiR2lnaSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjEsNSl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIyLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw3KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjQsNyl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI4LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzEsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNSwxMil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM5LDE0KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDIsMTQpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0NiwxNyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDUwLDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTMsMTkpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2OSwyNCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDkxLDMzKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1MCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE4Miw2Nil9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNDIsODgpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDgyLDE3NSl9fX0sCi0gICAgICAgICAgICB7IkdpbGwgU2FucyBNVCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjEsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIxLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMyw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjYsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI5LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzMsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNywxMil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQxLDE0KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDMsMTUpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0OCwxNil9LHsyNixuZXcgRm9udFNpemVJbmZvKDUxLDE4KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTYsMTkpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3MSwyNCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDkxLDMyKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw0OCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE4NCw2NCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNDMsODYpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDIxLDE3MSl9fX0sCi0gICAgICAgICAgICB7IkdpbGwgU2FucyBNVCBDb25kZW5zZWQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDQpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMSw1KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjEsNSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIyLDYpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNyw3KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjksOCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMyLDkpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNywxMCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM5LDExKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDMsMTIpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NywxMyl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUwLDE0KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjQsMTgpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4NiwyMyl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsMzUpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjksNDcpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjI2LDYyKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQzNCwxMjUpfX19LAotICAgICAgICAgICAgeyJHaWxsIFNhbnMgVWx0cmEgQm9sZCBDb25kZW5zZWQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMiw4KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjEsOSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNywxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDMwLDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzMsMTQpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzOCwxNil9LHsyMixuZXcgRm9udFNpemVJbmZvKDQxLDE3KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDUsMTkpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0OSwyMCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUxLDIyKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjksMjgpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4OSwzNyl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTYpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNzYsNzQpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjM1LDk5KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQyOCwxOTgpfX19LAotICAgICAgICAgICAgeyJHaWxsIFNhbnMgVWx0cmEgQm9sZCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjMsOSl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIyLDExKX0sezExLG5ldyBGb250U2l6ZUluZm8oMjEsMTMpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyNCwxNCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI3LDE2KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzEsMTgpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNSwyMSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQxLDIzKX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDQsMjUpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0NSwyNyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDUwLDMwKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTMsMzIpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3MSw0MSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDkzLDU1KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw4Mil9LHs5NixuZXcgRm9udFNpemVJbmZvKDE4MSwxMDkpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQxLDE0Nil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MjgsMjkxKX19fSwKLSAgICAgICAgICAgIHsiR2xvdWNlc3RlciBNVCBFeHRyYSBDb25kZW5zZWQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDQpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDYpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCw3KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsOCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMwLDkpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxMCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM2LDExKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDAsMTIpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NCwxNCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ2LDE0KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNTksMTkpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg3OSwyNSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsMzcpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTcsNDkpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjA5LDY2KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQxNiwxMzIpfX19LAotICAgICAgICAgICAgeyJHaWxsIFNhbnMgTVQgRXh0IENvbmRlbnNlZCBCb2xkIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw0KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw2KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsNyl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDcpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMyw4KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsOSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM3LDEwKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDEsMTEpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NSwxMil9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ3LDEzKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjEsMTcpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MSwyMil9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsMzMpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjEsNDQpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE0LDU5KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQxMCwxMTcpfX19LAotICAgICAgICAgICAgeyJDZW50dXJ5IEdvdGhpYyIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjEsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjYsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMiwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM1LDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzgsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MSwxOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ0LDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDYsMjEpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MSwyNyl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgyLDM1KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1Myl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1OCw3MSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTQsOTUpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDI3LDE4OSl9fX0sCi0gICAgICAgICAgICB7IkdvdWR5IE9sZCBTdHlsZSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMSw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjgsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxMil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM1LDE0KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDAsMTUpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MywxNil9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ3LDE4KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTAsMTkpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MywyNCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDg2LDMyKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw0OCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE3Myw2NCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMzEsODYpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDUxLDE3MSl9fX0sCi0gICAgICAgICAgICB7IkdvdWR5IFN0b3V0IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjEsMTEpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMSwxMil9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDEzKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTYpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOSwxNyl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMzLDIwKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzksMjIpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0MiwyNCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQ2LDI2KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTAsMjkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MywzMSl9LHszNixuZXcgRm9udFNpemVJbmZvKDY4LDQwKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODksNTMpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDc5KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTc4LDEwNil9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMzgsMTQxKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ3MywyODApfX19LAotICAgICAgICAgICAgeyJIYXJsb3cgU29saWQgSXRhbGljIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjEsNil9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDcpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw3KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsOSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDMwLDEwKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzQsMTEpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzOCwxMyl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQxLDE0KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDUsMTUpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1MCwxNil9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUyLDE3KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjgsMjIpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MCwzMCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNDUpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNzksNjApfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjM4LDgwKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ3NCwxNTkpfX19LAotICAgICAgICAgICAgeyJIYXJyaW5ndG9uIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNywxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NywyMSl9LHszNixuZXcgRm9udFNpemVJbmZvKDYwLDI3KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODAsMzYpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDUzKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU5LDcxKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxMSw5NSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MjEsMTg5KX19fSwKLSAgICAgICAgICAgIHsiSGFldHRlbnNjaHdlaWxlciIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsNyl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDgpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNiw5KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMjksMTEpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzMiwxMil9LHsyMixuZXcgRm9udFNpemVJbmZvKDM0LDEzKX0sezI0LG5ldyBGb250U2l6ZUluZm8oMzcsMTQpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0MCwxNSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQzLDE2KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNTUsMjEpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg3MywyOCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNDIpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNDgsNTYpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMTk4LDc1KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDM5MSwxNTApfX19LAotICAgICAgICAgICAgeyJIaWdoIFRvd2VyIFRleHQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSw5KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMTApfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxMil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM1LDEzKX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzcsMTQpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MSwxNSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ1LDE3KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDgsMTgpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MiwyMyl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgyLDMxKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw0Nil9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2Myw2Mil9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTcsODIpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDMyLDE2NCl9fX0sCi0gICAgICAgICAgICB7IkltcHJpbnQgTVQgU2hhZG93IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw4KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDEyKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsMTQpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNywxNSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQxLDE2KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMTgpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NywxOSl9LHszNixuZXcgRm9udFNpemVJbmZvKDYxLDI0KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODEsMzMpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDQ5KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTYxLDY1KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxNSw4Nyl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MjcsMTc0KX19fSwKLSAgICAgICAgICAgIHsiSW5mb3JtYWwgUm9tYW4iLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIxLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNywxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI5LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzMsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzOSwxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQyLDE2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDUsMTcpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0OSwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUzLDIwKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjksMjUpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MSwzNCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTEpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxODMsNjgpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQ1LDkxKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ3OSwxODEpfX19LAotICAgICAgICAgICAgeyJCbGFja2FkZGVyIElUQyIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjEsNCl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIxLDUpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw2KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsNil9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI4LDgpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzMCw4KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzQsOSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM4LDExKX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDEsMTEpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0NSwxMyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDUwLDE0KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTIsMTUpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2OCwxOSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDkwLDI1KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCwzOCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE3OSw1MSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMzgsNjcpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDc0LDEzNSl9fX0sCi0gICAgICAgICAgICB7IkVkd2FyZGlhbiBTY3JpcHQgSVRDIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIxLDcpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMiw4KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjYsOSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI5LDEwKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzMsMTEpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNywxMyl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQwLDE0KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDQsMTUpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NywxNyl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUwLDE4KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjUsMjMpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4NiwzMSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNDYpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNzEsNjEpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjI4LDgyKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ1NCwxNjMpfX19LAotICAgICAgICAgICAgeyJLcmlzdGVuIElUQyIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjEsNyl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIxLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyNCw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjUsMTApfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyOSwxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDMxLDEzKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzUsMTQpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNywxNil9LHsyMixuZXcgRm9udFNpemVJbmZvKDQyLDE3KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDYsMTkpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0OSwyMSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUzLDIyKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjgsMjkpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MSwzOCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTgpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNzgsNzcpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQwLDEwMyl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0NzMsMjA1KX19fSwKLSAgICAgICAgICAgIHsiSm9rZXJtYW4iLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjUsMTEpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyNywxMSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDMxLDE0KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzUsMTUpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzOSwxNyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQzLDE5KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDgsMjEpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1MiwyMyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDU2LDI1KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNjEsMjYpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3NiwzNCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDEwMSw0Nil9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNjkpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygyMDIsOTEpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjcwLDEyMil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg1NjksMjQ0KX19fSwKLSAgICAgICAgICAgIHsiSnVpY2UgSVRDIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw0KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw2KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsNyl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDgpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMCw4KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTApfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNiwxMSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDExKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMTMpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwxNCl9LHszNixuZXcgRm9udFNpemVJbmZvKDYyLDE4KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODEsMjQpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDM2KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTY0LDQ4KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxOCw2NCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MzYsMTI4KX19fSwKLSAgICAgICAgICAgIHsiS3Vuc3RsZXIgU2NyaXB0IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw0KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw2KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsNyl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI4LDcpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSw4KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsMTApfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOCwxMCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQyLDExKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMTIpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OCwxMyl9LHszNixuZXcgRm9udFNpemVJbmZvKDYyLDE3KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODIsMjMpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDM0KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTYzLDQ1KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxOCw2MCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MzcsMTIwKX19fSwKLSAgICAgICAgICAgIHsiV2lkZSBMYXRpbiIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsMTQpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCwxNil9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDE5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsMjApfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSwyNCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI4LDI2KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMzApfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNSwzMyl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM4LDM2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDIsNDApfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NSw0Myl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ4LDQ2KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjIsNTkpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4Miw3OSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsMTE5KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTYzLDE1OCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTgsMjEyKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQzMyw0MjIpfX19LAotICAgICAgICAgICAgeyJMdWNpZGEgQnJpZ2h0IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSwxMCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDEyKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjYsMTMpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMCwxNSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDE2KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzYsMTgpfSx7MjQsbmV3IEZvbnRTaXplSW5mbygzOSwxOSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQzLDIxKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDUsMjMpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg1OSwyOSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgwLDM5KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1OCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1OSw3OCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTMsMTA0KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQyNiwyMDcpfX19LAotICAgICAgICAgICAgeyJMdWNpZGEgQ2FsbGlncmFwaHkiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCwxMCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIzLDExKX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjQsMTIpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNiwxNCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI5LDE1KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzUsMTcpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzOSwxOSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQxLDIwKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDUsMjIpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0OSwyNCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUyLDI2KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjksMzMpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5Miw0NCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNjUpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxODMsODYpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQ2LDExNSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0ODksMjI3KX19fSwKLSAgICAgICAgICAgIHsiTGVlbGF3YWRlZSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxNCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDE2KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzcsMTcpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MSwxOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ0LDIwKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDcsMjEpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MCwyOCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgwLDM3KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1NSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2MCw3NCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTMsOTgpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDIzLDE5Nil9fX0sCi0gICAgICAgICAgICB7Ikx1Y2lkYSBGYXgiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsMTApfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSwxMSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDEzKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMTQpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMCwxNil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDE4KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzYsMTkpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCwyMSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ0LDIzKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDYsMjUpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg1OSwzMil9LHs0OCxuZXcgRm9udFNpemVJbmZvKDc4LDQyKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw2NCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1Nyw4NSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTEsMTEzKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQyMiwyMjYpfX19LAotICAgICAgICAgICAgeyJMdWNpZGEgSGFuZHdyaXRpbmciLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCwxMCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIxLDExKX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjQsMTIpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNiwxNCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI5LDE1KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzMsMTcpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzOSwxOSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQxLDIxKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDUsMjMpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0OSwyNSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUyLDI2KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjksMzMpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MCw0NCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNjYpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxODEsODcpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQyLDExNil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0ODMsMjMxKX19fSwKLSAgICAgICAgICAgIHsiTHVjaWRhIFNhbnMiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsMTApfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSwxMSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDEzKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMTQpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMCwxNil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDE4KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzYsMTkpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCwyMSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQzLDIzKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDYsMjQpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg1OSwzMil9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgwLDQyKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw2Myl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1OSw4NCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTMsMTEzKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQyNiwyMjUpfX19LAotICAgICAgICAgICAgeyJMdWNpZGEgU2FucyBUeXBld3JpdGVyIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSwxMCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjYsMTMpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMCwxNCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDE2KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzYsMTcpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCwxOSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQzLDIxKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDYsMjIpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg1OSwyOSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgwLDM5KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1OCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1OSw3Nyl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTMsMTAzKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQyNCwyMDUpfX19LAotICAgICAgICAgICAgeyJNYWduZXRvIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsMTApfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMSwxMil9LHsxMixuZXcgRm9udFNpemVJbmZvKDIyLDEyKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjYsMTUpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwxNil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMyLDE5KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzYsMjEpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOSwyMil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQzLDI1KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDcsMjcpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OSwyOSl9LHszNixuZXcgRm9udFNpemVJbmZvKDY0LDM3KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODQsNDkpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDc0KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTY4LDk5KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIyNCwxMzIpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDQ1LDI2Myl9fX0sCi0gICAgICAgICAgICB7Ik1haWFuZHJhIEdEIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOSl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDEwKX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsMTApfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMil9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDEzKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMTUpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxNyl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM3LDE4KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDEsMjApfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NCwyMil9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ3LDIzKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjAsMjkpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MCwzOSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTcpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTksNzYpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjEyLDEwMil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MjIsMjAwKX19fSwKLSAgICAgICAgICAgIHsiTWF0dXJhIE1UIFNjcmlwdCBDYXBpdGFscyIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHs4LG5ldyBGb250U2l6ZUluZm8oMjEsOCl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIyLDEwKX0sezExLG5ldyBGb250U2l6ZUluZm8oMjMsMTEpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyNSwxMil9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI5LDEzKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzIsMTUpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNiwxNyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQxLDE5KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDQsMjApfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0OCwyMil9LHsyNixuZXcgRm9udFNpemVJbmZvKDUzLDI0KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTYsMjUpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3MiwzMyl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDk1LDQyKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw2Myl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE5MCw4NCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNTMsMTExKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDUwNCwyMjEpfX19LAotICAgICAgICAgICAgeyJNaXN0cmFsIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIxLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMiw4KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjYsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOSwxMCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMzLDEyKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzcsMTMpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOSwxNCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQzLDE1KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDcsMTcpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MCwxOCl9LHszNixuZXcgRm9udFNpemVJbmZvKDY0LDIzKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODUsMzApfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDQ0KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTY5LDU5KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIyNiw3OCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0NTAsMTU0KX19fSwKLSAgICAgICAgICAgIHsiTW9kZXJuIE5vLiAyMCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMTEpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMCwxMil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDEzKX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzYsMTQpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCwxNil9LHsyNixuZXcgRm9udFNpemVJbmZvKDQzLDE3KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDYsMTgpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg1OSwyMyl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgwLDMwKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw0NSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2MCw1OSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTQsNzkpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDI3LDE1Nil9fX0sCi0gICAgICAgICAgICB7Ik1pY3Jvc29mdCBVaWdodXIiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIzLDQpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMyw1KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjQsNil9LHsxMixuZXcgRm9udFNpemVJbmZvKDI1LDYpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygzMCw3KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzMsOCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM3LDkpfSx7MjAsbmV3IEZvbnRTaXplSW5mbyg0MiwxMCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQ1LDExKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNTIsMTIpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1NiwxMyl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDU5LDE0KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNzYsMTgpfSx7NDgsbmV3IEZvbnRTaXplSW5mbygxMDIsMjQpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDM2KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMjAyLDQ4KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI3Miw2NCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0NzYsMTI4KX19fSwKLSAgICAgICAgICAgIHsiTW9ub3R5cGUgQ29yc2l2YSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDkpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwxMCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDEyKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzYsMTMpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOSwxNCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQyLDE1KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDcsMTYpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OSwxNyl9LHszNixuZXcgRm9udFNpemVJbmZvKDYyLDIyKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODUsMjkpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDQzKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTcwLDU3KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIyNSw3Nil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0NTMsMTUxKX19fSwKLSAgICAgICAgICAgIHsiTmlhZ2FyYSBFbmdyYXZlZCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHs4LG5ldyBGb250U2l6ZUluZm8oMjEsNSl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsNil9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDcpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNiw4KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMjksOSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDMzLDkpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNSwxMCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDM5LDExKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDMsMTEpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NSwxMil9LHszNixuZXcgRm9udFNpemVJbmZvKDU4LDE1KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oNzcsMjApfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDMwKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU0LDM5KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIwNyw1Mil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MDcsMTAzKX19fSwKLSAgICAgICAgICAgIHsiTmlhZ2FyYSBTb2xpZCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHs4LG5ldyBGb250U2l6ZUluZm8oMjEsNSl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsNil9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDcpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNiw4KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMjksOSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDMzLDkpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNSwxMCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDM5LDExKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDMsMTEpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NSwxMil9LHszNixuZXcgRm9udFNpemVJbmZvKDU4LDE1KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oNzcsMjApfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDMwKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU0LDM5KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIwNyw1Mil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MDcsMTAzKX19fSwKLSAgICAgICAgICAgIHsiT0NSIEEgRXh0ZW5kZWQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsMTApfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSwxMSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDEyKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjYsMTQpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygyOSwxNSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDMzLDE3KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzUsMTkpfSx7MjQsbmV3IEZvbnRTaXplSW5mbygzOSwyMCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQyLDIyKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDUsMjMpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg1NywzMCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDc2LDQwKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1OSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1Miw3OCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMDIsMTA0KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQwMiwyMDcpfX19LAotICAgICAgICAgICAgeyJPbGQgRW5nbGlzaCBUZXh0IE1UIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIxLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMwLDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNiwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDE3KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDU5LDI1KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oNzksMzQpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDUwKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU3LDY2KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIwOSw4OCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MTgsMTc1KX19fSwKLSAgICAgICAgICAgIHsiT255eCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsNyl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDcpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNiw4KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMjksOSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDMzLDkpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNSwxMCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDM5LDEwKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDIsMTEpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NSwxMSl9LHszNixuZXcgRm9udFNpemVJbmZvKDU4LDE1KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oNzcsMTkpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDI5KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTUyLDM5KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIwMyw1MCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MTYsOTcpfX19LAotICAgICAgICAgICAgeyJNUyBPdXRsb29rIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNiwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDI5LDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNiwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDE3KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDMsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NiwyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDU5LDI1KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oNzgsMzMpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDQ5KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU0LDY1KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIwNiw4Nyl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MTAsMTcyKX19fSwKLSAgICAgICAgICAgIHsiUGFsYWNlIFNjcmlwdCBNVCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNCl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsNil9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDcpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNyw4KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsOSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM1LDkpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNywxMCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQxLDExKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMTIpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NywxMyl9LHszNixuZXcgRm9udFNpemVJbmZvKDYxLDE2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODEsMjEpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDMxKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTYwLDQxKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxMyw1NSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MjUsMTA4KX19fSwKLSAgICAgICAgICAgIHsiUGFweXJ1cyIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHs4LG5ldyBGb250U2l6ZUluZm8oMjMsNyl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDI0LDkpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyNiwxMCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDI3LDEwKX0sezE0LG5ldyBGb250U2l6ZUluZm8oMzIsMTIpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzNSwxNCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDQwLDE1KX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDQsMTYpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0OSwxOCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDU0LDIwKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTgsMjIpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg2MSwyMil9LHszNixuZXcgRm9udFNpemVJbmZvKDgwLDI5KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oMTA0LDM4KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1Nil9LHs5NixuZXcgRm9udFNpemVJbmZvKDIxMCw3NCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNzksOTkpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNTU2LDE5Nyl9fX0sCi0gICAgICAgICAgICB7IlBhcmNobWVudCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNCl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIxLDQpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw0KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsNCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI3LDUpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOSw1KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzMsNil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM2LDcpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOSw3KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDMsOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ2LDgpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OSw5KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjQsMTEpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4NSwxNCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsMjEpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjksMjgpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjI2LDM3KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ1MCw3Myl9fX0sCi0gICAgICAgICAgICB7IlBlcnBldHVhIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIxLDcpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMiw3KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjYsOSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI5LDEwKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzMsMTEpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNywxMil9LHsyMixuZXcgRm9udFNpemVJbmZvKDM5LDEzKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDMsMTUpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NywxNil9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUwLDE3KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjUsMjIpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4NiwyOSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNDQpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNzEsNTkpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjI4LDc4KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ1MywxNTYpfX19LAotICAgICAgICAgICAgeyJQZXJwZXR1YSBUaXRsaW5nIE1UIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOSl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDEwKX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsMTEpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMyl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDE0KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMTYpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxOCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM2LDE5KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDAsMjEpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NCwyMyl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ2LDI1KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjAsMzIpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg3OSw0Myl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNjQpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTgsODUpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjEwLDExNCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MTgsMjI3KX19fSwKLSAgICAgICAgICAgIHsiUGxheWJpbGwiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDQpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDYpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCw3KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjYsNyl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDI5LDkpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzMywxMCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM1LDEwKX0sezI0LG5ldyBGb250U2l6ZUluZm8oMzksMTEpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0MiwxMil9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ1LDEzKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNTgsMTcpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg3NywyMyl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsMzQpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTMsNDYpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjAzLDYxKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQwNSwxMjIpfX19LAotICAgICAgICAgICAgeyJQb29yIFJpY2hhcmQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM3LDE2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDAsMTgpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NSwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ4LDIwKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjAsMjYpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg3OSwzNSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTMpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTcsNzApfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjA5LDk0KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQxNiwxODcpfX19LAotICAgICAgICAgICAgeyJQcmlzdGluYSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjEsNSl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIyLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMyw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjQsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI5LDkpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzMiwxMCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM2LDEyKX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDAsMTMpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0MywxNCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQ3LDE1KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTIsMTYpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1NSwxNyl9LHszNixuZXcgRm9udFNpemVJbmZvKDcxLDIzKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTQsMzApfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDQ1KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTg3LDYxKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0OCw4MSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0OTQsMTYyKX19fSwKLSAgICAgICAgICAgIHsiUmFnZSBJdGFsaWMiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIxLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMSw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDI0LDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyOCwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDMxLDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzUsMTIpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzOSwxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQyLDE1KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDYsMTcpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1MCwxOCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUzLDE5KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjksMjUpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MSwzMyl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTApfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxODIsNjYpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQyLDg5KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ4MiwxNzcpfX19LAotICAgICAgICAgICAgeyJSYXZpZSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjIsMTApfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMiwxMil9LHsxMSxuZXcgRm9udFNpemVJbmZvKDI0LDE0KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjUsMTUpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyOSwxOCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDM0LDIwKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzcsMjMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzOCwyNil9LHsyMixuZXcgRm9udFNpemVJbmZvKDQyLDI4KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDYsMzApfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1MiwzMyl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUzLDM1KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjcsNDYpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MSw2MSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsOTEpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNzksMTIyKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIzOCwxNjIpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDcyLDMyNCl9fX0sCi0gICAgICAgICAgICB7Ik1TIFJlZmVyZW5jZSBTYW5zIFNlcmlmIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDEwKX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsMTApfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNiwxMil9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDEzKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMTUpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNiwxNyl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM2LDE4KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDIsMjApfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NiwyMil9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ4LDI0KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjIsMzEpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MSw0MSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNjEpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTksODEpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjExLDEwOSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MTgsMjE2KX19fSwKLSAgICAgICAgICAgIHsiTVMgUmVmZXJlbmNlIFNwZWNpYWx0eSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsMTApfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDEzKX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsMTYpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCwxOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDE5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsMjMpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywyNSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMyLDI5KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMzIpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNiwzNSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQyLDM4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsNDIpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OCw0NCl9LHszNixuZXcgRm9udFNpemVJbmZvKDU5LDU4KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODEsNzcpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDExNSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1OSwxNTMpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjEzLDIwNSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MjMsNDA4KX19fSwKLSAgICAgICAgICAgIHsiUm9ja3dlbGwgQ29uZGVuc2VkIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw0KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw2KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjQsNyl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDgpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSw5KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTApfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNywxMSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQxLDEyKX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMTMpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NywxNCl9LHszNixuZXcgRm9udFNpemVJbmZvKDYwLDE4KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODAsMjMpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDM1KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU5LDQ3KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxMiw2Mil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MjIsMTI1KX19fSwKLSAgICAgICAgICAgIHsiUm9ja3dlbGwiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM2LDE2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDAsMTcpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NCwxOSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ2LDIwKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjAsMjYpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MCwzNSl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTIpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTgsNjkpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjEwLDkzKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQyMCwxODUpfX19LAotICAgICAgICAgICAgeyJSb2Nrd2VsbCBFeHRyYSBCb2xkIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOSl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDEwKX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsMTEpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMyl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDE0KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzAsMTcpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNCwxOSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM3LDIwKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDAsMjIpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NCwyNCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ2LDI1KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjAsMzMpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MCw0NCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNjYpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTgsODgpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjExLDExOCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MjAsMjM0KX19fSwKLSAgICAgICAgICAgIHsiU2NyaXB0IE1UIEJvbGQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDgpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNSwxMCl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI3LDExKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNSwxNCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDM3LDE1KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDEsMTcpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NSwxOCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ3LDIwKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjEsMjUpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MSwzNCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTEpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjEsNjgpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE1LDkwKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQyOCwxODApfX19LAotICAgICAgICAgICAgeyJTaG93Y2FyZCBHb3RoaWMiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw4KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsOSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIyLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCwxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDMwLDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzIsMTQpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNSwxNil9LHsyMixuZXcgRm9udFNpemVJbmZvKDM4LDE3KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDIsMTkpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NywyMSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ4LDIyKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjMsMjgpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MiwzOCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTcpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjUsNzYpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjE5LDEwMSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MzUsMjAwKX19fSwKLSAgICAgICAgICAgIHsiU25hcCBJVEMiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDEwKX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsMTEpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCwxMyl9LHsxMixuZXcgRm9udFNpemVJbmZvKDI0LDE0KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjYsMTYpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwxOCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMyLDIxKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzcsMjMpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOCwyNSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQ0LDI4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDYsMzApfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1MCwzMil9LHszNixuZXcgRm9udFNpemVJbmZvKDY1LDQyKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODQsNTUpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDgzKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTY3LDExMSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMjUsMTQ4KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ0MywyOTUpfX19LAotICAgICAgICAgICAgeyJTdGVuY2lsIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDkpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsMTEpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMyLDE0KX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsMTYpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOCwxNyl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQyLDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDYsMjApfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OCwyMSl9LHszNixuZXcgRm9udFNpemVJbmZvKDYyLDI4KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODMsMzcpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDU1KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTY0LDc0KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxOSw5OCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MzYsMTk2KX19fSwKLSAgICAgICAgICAgIHsiVHcgQ2VuIE1UIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjUsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNywxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQwLDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NywyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDYwLDI2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODAsMzUpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDUzKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU5LDcxKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxMiw5NCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MjEsMTg4KX19fSwKLSAgICAgICAgICAgIHsiVHcgQ2VuIE1UIENvbmRlbnNlZCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNCl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjEsNil9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDcpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNyw4KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzEsOSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDEwKX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzcsMTEpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MSwxMil9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ1LDEzKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDgsMTQpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MSwxOCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgwLDIzKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCwzNSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2MCw0Nyl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTQsNjIpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDI0LDEyNSl9fX0sCi0gICAgICAgICAgICB7IlR3IENlbiBNVCBDb25kZW5zZWQgRXh0cmEgQm9sZCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDkpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyNywxMCl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDEyKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzUsMTMpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzOCwxNCl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQyLDE2KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDUsMTcpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0OCwxOCl9LHszNixuZXcgRm9udFNpemVJbmZvKDYyLDI0KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODEsMzEpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDQ3KX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTY1LDYzKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxOCw4NCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MTQsMTY3KX19fSwKLSAgICAgICAgICAgIHsiVGVtcHVzIFNhbnMgSVRDIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsOSl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIxLDEwKX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjIsMTEpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNiwxMyl9LHsxNixuZXcgRm9udFNpemVJbmZvKDI5LDE0KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzMsMTYpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNywxOCl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQwLDE5KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDQsMjEpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0OCwyMyl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUxLDI1KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjUsMzIpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4Nyw0Myl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNjQpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNzMsODUpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjMwLDExNCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0NTgsMjI2KX19fSwKLSAgICAgICAgICAgIHsiVmluZXIgSGFuZCBJVEMiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIzLDcpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyNCw5KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjUsMTApfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyNywxMSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDMyLDEzKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzUsMTQpfSx7MTgsbmV3IEZvbnRTaXplSW5mbyg0MCwxNil9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQ1LDE4KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDgsMjApfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1MywyMil9LHsyNixuZXcgRm9udFNpemVJbmZvKDU4LDI0KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNjEsMjUpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3OSwzMyl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDEwNCw0Myl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNjUpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygyMDgsODcpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjc3LDExNil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg1NTIsMjMyKX19fSwKLSAgICAgICAgICAgIHsiVml2YWxkaSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjIsNyl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDgpfSx7MTYsbmV3IEZvbnRTaXplSW5mbygyOCw5KX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzIsMTApfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzNiwxMil9LHsyMixuZXcgRm9udFNpemVJbmZvKDM4LDEyKX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDIsMTQpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0NiwxNSl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDQ5LDE2KX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjMsMjApfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg4MywyNyl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNDEpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNjgsNTUpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjI1LDczKX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ0OCwxNDYpfX19LAotICAgICAgICAgICAgeyJWbGFkaW1pciBTY3JpcHQiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjEsNyl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIyLDcpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNiw5KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjksMTApfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMiwxMSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM2LDEzKX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzksMTMpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MywxNSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ3LDE2KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTAsMTcpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2NCwyMil9LHs0OCxuZXcgRm9udFNpemVJbmZvKDg1LDMwKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw0NCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2OSw1OSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMjUsNzkpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDQ4LDE1OCl9fX0sCi0gICAgICAgICAgICB7IldpbmdkaW5ncyAyIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw5KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCwxMil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDE1KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsMTcpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSwxOCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI0LDIyKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjYsMjQpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMCwyNyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDMxKX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzYsMzMpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCwzNil9LHsyNixuZXcgRm9udFNpemVJbmZvKDQzLDQwKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDYsNDIpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg1OSw1NCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDc5LDczKX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCwxMDkpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNTYsMTQ1KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIwOCwxOTQpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDE0LDM4Nil9fX0sCi0gICAgICAgICAgICB7IldpbmdkaW5ncyAzIixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw0KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCwxMCl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDEyKX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsMTMpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSwxNCl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDE3KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsMTkpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMCwyMSl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM0LDI0KX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzUsMjYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MCwyOSl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQzLDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDYsMzMpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg1OSwyNyl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDc5LDM1KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1Myl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE1Niw3MSl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMDgsOTUpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDE0LDE4OSl9fX0sCi0gICAgICAgICAgICB7IkJ1eHRvbiBTa2V0Y2giLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMSw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsOSl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNywxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDMwLDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzQsMTQpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzOCwxNil9LHsyMixuZXcgRm9udFNpemVJbmZvKDQxLDE3KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDUsMTgpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg0OSwyMCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUyLDIxKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjcsMjgpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MCwzNyl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTUpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxNzgsNzQpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjM4LDk5KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ3MywxOTYpfX19LAotICAgICAgICAgICAgeyJTZWdvZSBNYXJrZXIiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMixuZXcgRm9udFNpemVJbmZvKDIxLDcpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNCw4KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjcsOSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDMxLDEwKX0sezIwLG5ldyBGb250U2l6ZUluZm8oMzQsMTIpfSx7MjIsbmV3IEZvbnRTaXplSW5mbygzNywxMil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDQxLDE0KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNDQsMTUpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg0NywxNil9LHszNixuZXcgRm9udFNpemVJbmZvKDYwLDIwKX0sezQ4LG5ldyBGb250U2l6ZUluZm8oODAsMjcpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDQxKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTU5LDU1KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDIxMiw3Myl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0MjIsMTQ2KX19fSwKLSAgICAgICAgICAgIHsiU2tldGNoRmxvdyBQcmludCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsOCl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDEwKX0sezExLG5ldyBGb250U2l6ZUluZm8oMjAsMTEpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMSwxMil9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI1LDE0KX0sezE2LG5ldyBGb250U2l6ZUluZm8oMjgsMTUpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzMSwxNyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM1LDIwKX0sezIyLG5ldyBGb250U2l6ZUluZm8oMzgsMjEpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0MSwyMyl9LHsyNixuZXcgRm9udFNpemVJbmZvKDQ1LDI1KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNDgsMjcpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2MSwzNSl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDgxLDQ3KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw3MCl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE2MSw5Myl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyMTUsMTI0KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQyNywyNDgpfX19LAotICAgICAgICAgICAgeyJNaWNyb3NvZnQgTUhlaSIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw4KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI5LDEwKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzEsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNSwxMyl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDM5LDE1KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDEsMTYpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg0NywxOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDUxLDE5KX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTMsMjApfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg2OSwyNil9LHs0OCxuZXcgRm9udFNpemVJbmZvKDkxLDM1KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1Myl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE4MSw3MCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNDMsOTQpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDgyLDE4Nyl9fX0sCi0gICAgICAgICAgICB7Ik1pY3Jvc29mdCBOZW9Hb3RoaWMiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyOSwxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDMxLDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzUsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzOSwxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQxLDE2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDcsMTgpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1MSwyMCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUzLDIxKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjksMjcpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MSwzNil9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTQpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxODEsNzIpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQzLDk2KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ4MiwxOTEpfX19LAotICAgICAgICAgICAgeyJTZWdvZSBXUCBCbGFjayIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDgpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsMTApfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyOSwxMil9LHsxNixuZXcgRm9udFNpemVJbmZvKDMxLDEzKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzUsMTUpfSx7MjAsbmV3IEZvbnRTaXplSW5mbygzOSwxNyl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQxLDE4KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNDcsMjApfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1MSwyMil9LHsyOCxuZXcgRm9udFNpemVJbmZvKDUzLDIzKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNjksMzApfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MSw0MCl9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNjApfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxODEsNzkpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQzLDEwNil9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0ODIsMjEyKX19fSwKLSAgICAgICAgICAgIHsiU2Vnb2UgV1AiLG5ldyBEaWN0aW9uYXJ5PGZsb2F0LEZvbnRTaXplSW5mbz4oKXt7NixuZXcgRm9udFNpemVJbmZvKDIwLDUpfSx7OCxuZXcgRm9udFNpemVJbmZvKDIwLDYpfSx7MTAsbmV3IEZvbnRTaXplSW5mbygyMCw3KX0sezExLG5ldyBGb250U2l6ZUluZm8oMjIsOCl9LHsxMixuZXcgRm9udFNpemVJbmZvKDIzLDkpfSx7MTQsbmV3IEZvbnRTaXplSW5mbygyNywxMSl9LHsxNixuZXcgRm9udFNpemVJbmZvKDM0LDEyKX0sezE4LG5ldyBGb250U2l6ZUluZm8oMzUsMTMpfSx7MjAsbmV3IEZvbnRTaXplSW5mbyg0MSwxNSl9LHsyMixuZXcgRm9udFNpemVJbmZvKDQ0LDE2KX0sezI0LG5ldyBGb250U2l6ZUluZm8oNTAsMTgpfSx7MjYsbmV3IEZvbnRTaXplSW5mbyg1MSwyMCl9LHsyOCxuZXcgRm9udFNpemVJbmZvKDU0LDIxKX0sezM2LG5ldyBGb250U2l6ZUluZm8oNzAsMjcpfSx7NDgsbmV3IEZvbnRTaXplSW5mbyg5MiwzNil9LHs3MixuZXcgRm9udFNpemVJbmZvKDAsNTQpfSx7OTYsbmV3IEZvbnRTaXplSW5mbygxODAsNzIpfSx7MTI4LG5ldyBGb250U2l6ZUluZm8oMjQxLDk2KX0sezI1NixuZXcgRm9udFNpemVJbmZvKDQ4MiwxOTEpfX19LAotICAgICAgICAgICAgeyJTZWdvZSBXUCBTZW1pYm9sZCIsbmV3IERpY3Rpb25hcnk8ZmxvYXQsRm9udFNpemVJbmZvPigpe3s2LG5ldyBGb250U2l6ZUluZm8oMjAsNSl9LHs4LG5ldyBGb250U2l6ZUluZm8oMjAsNil9LHsxMCxuZXcgRm9udFNpemVJbmZvKDIwLDcpfSx7MTEsbmV3IEZvbnRTaXplSW5mbygyMiw5KX0sezEyLG5ldyBGb250U2l6ZUluZm8oMjMsOSl9LHsxNCxuZXcgRm9udFNpemVJbmZvKDI3LDExKX0sezE2LG5ldyBGb250U2l6ZUluZm8oMzQsMTIpfSx7MTgsbmV3IEZvbnRTaXplSW5mbygzNSwxNCl9LHsyMCxuZXcgRm9udFNpemVJbmZvKDQxLDE2KX0sezIyLG5ldyBGb250U2l6ZUluZm8oNDQsMTcpfSx7MjQsbmV3IEZvbnRTaXplSW5mbyg1MCwxOCl9LHsyNixuZXcgRm9udFNpemVJbmZvKDUxLDIwKX0sezI4LG5ldyBGb250U2l6ZUluZm8oNTQsMjEpfSx7MzYsbmV3IEZvbnRTaXplSW5mbyg3MCwyOCl9LHs0OCxuZXcgRm9udFNpemVJbmZvKDkyLDM3KX0sezcyLG5ldyBGb250U2l6ZUluZm8oMCw1NSl9LHs5NixuZXcgRm9udFNpemVJbmZvKDE4MCw3NCl9LHsxMjgsbmV3IEZvbnRTaXplSW5mbygyNDEsOTkpfSx7MjU2LG5ldyBGb250U2l6ZUluZm8oNDgyLDE5Nil9fX0sCi0gICAgICAgICAgICB7IlNlZ29lIFdQIExpZ2h0IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw4KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzNCwxMSl9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM1LDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDEsMTQpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0NCwxNSl9LHsyNCxuZXcgRm9udFNpemVJbmZvKDUwLDE3KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTEsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1NCwyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDcwLDI1KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTIsMzQpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDUxKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTgwLDY4KX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0MSw5MSl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0ODIsMTgxKX19fSwKLSAgICAgICAgICAgIHsiU2Vnb2UgV1AgU2VtaUxpZ2h0IixuZXcgRGljdGlvbmFyeTxmbG9hdCxGb250U2l6ZUluZm8+KCl7ezYsbmV3IEZvbnRTaXplSW5mbygyMCw1KX0sezgsbmV3IEZvbnRTaXplSW5mbygyMCw2KX0sezEwLG5ldyBGb250U2l6ZUluZm8oMjAsNyl9LHsxMSxuZXcgRm9udFNpemVJbmZvKDIyLDgpfSx7MTIsbmV3IEZvbnRTaXplSW5mbygyMyw5KX0sezE0LG5ldyBGb250U2l6ZUluZm8oMjcsMTApfSx7MTYsbmV3IEZvbnRTaXplSW5mbygzNCwxMil9LHsxOCxuZXcgRm9udFNpemVJbmZvKDM1LDEzKX0sezIwLG5ldyBGb250U2l6ZUluZm8oNDEsMTUpfSx7MjIsbmV3IEZvbnRTaXplSW5mbyg0NCwxNil9LHsyNCxuZXcgRm9udFNpemVJbmZvKDUwLDE4KX0sezI2LG5ldyBGb250U2l6ZUluZm8oNTEsMTkpfSx7MjgsbmV3IEZvbnRTaXplSW5mbyg1NCwyMCl9LHszNixuZXcgRm9udFNpemVJbmZvKDcwLDI2KX0sezQ4LG5ldyBGb250U2l6ZUluZm8oOTIsMzUpfSx7NzIsbmV3IEZvbnRTaXplSW5mbygwLDUzKX0sezk2LG5ldyBGb250U2l6ZUluZm8oMTgwLDcwKX0sezEyOCxuZXcgRm9udFNpemVJbmZvKDI0MSw5NCl9LHsyNTYsbmV3IEZvbnRTaXplSW5mbyg0ODIsMTg3KX19fQotICAgICAgICB9OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1cy9WQkEvRXhjZWxWQkFNb2R1bGVDb2xsZWN0aW9uLmNzIGIvRVBQbHVzL1ZCQS9FeGNlbFZCQU1vZHVsZUNvbGxlY3Rpb24uY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZjU1ZWYuLjAwMDAwMDAKLS0tIGEvRVBQbHVzL1ZCQS9FeGNlbFZCQU1vZHVsZUNvbGxlY3Rpb24uY3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCi0gKgotICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KLSAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKLSAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAotICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAotICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KLSAqCi0gKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAotICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkxMi1BUFItMjAxMgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci0KLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlZCQQotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQmFzZSBjbGFzcyBmb3IgVkJBIGNvbGxlY3Rpb25zCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHR5cGVwYXJhbSBuYW1lPSJUIj48L3R5cGVwYXJhbT4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxWQkFDb2xsZWN0aW9uQmFzZTxUPiA6IElFbnVtZXJhYmxlPFQ+Ci0gICAgewotICAgICAgICBpbnRlcm5hbCBwcm90ZWN0ZWQgTGlzdDxUPiBfbGlzdD1uZXcgTGlzdDxUPigpOyAgICAgICAgCi0gICAgICAgIHB1YmxpYyBJRW51bWVyYXRvcjxUPiBHZXRFbnVtZXJhdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9saXN0LkdldEVudW1lcmF0b3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYXRvciBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUuR2V0RW51bWVyYXRvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfbGlzdC5HZXRFbnVtZXJhdG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSW5kZXhlcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Ik5hbWUiPk5hbWU8L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgVCB0aGlzIFtzdHJpbmcgTmFtZV0KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9saXN0LkZpbmQoKGYpID0+IGYuR2V0VHlwZSgpLkdldFByb3BlcnR5KCJOYW1lIikuR2V0VmFsdWUoZiwgbnVsbCkuVG9TdHJpbmcoKS5FcXVhbHMoTmFtZSxTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSW5kZXhlcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkluZGV4Ij5Qb3NpdGlvbjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBUIHRoaXNbaW50IEluZGV4XQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2xpc3RbSW5kZXhdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE51bWJlciBvZiBpdGVtcyBpbiB0aGUgY29sbGVjdGlvbgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50IENvdW50Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiBfbGlzdC5Db3VudDsgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIElmIGEgc3BlY2lmaWMgbmFtZSBleGlzdHMgaW4gdGhlIGNvbGxlY3Rpb24KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJOYW1lIj5UaGUgbmFtZTwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UcnVlIGlmIHRoZSBuYW1lIGV4aXN0czwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIGJvb2wgRXhpc3RzKHN0cmluZyBOYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2xpc3QuRXhpc3RzKChmKSA9PiBmLkdldFR5cGUoKS5HZXRQcm9wZXJ0eSgiTmFtZSIpLkdldFZhbHVlKGYsIG51bGwpLlRvU3RyaW5nKCkuRXF1YWxzKE5hbWUsU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlbW92ZXMgdGhlIGl0ZW0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJJdGVtIj48L3BhcmFtPgotICAgICAgICBwdWJsaWMgdm9pZCBSZW1vdmUoVCBJdGVtKQotICAgICAgICB7Ci0gICAgICAgICAgICBfbGlzdC5SZW1vdmUoSXRlbSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmVtb3ZlcyB0aGUgaXRlbSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5kZXgiPlRIZSBpbmRleDwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFJlbW92ZUF0KGludCBpbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgX2xpc3QuUmVtb3ZlQXQoaW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpbnRlcm5hbCB2b2lkIENsZWFyKCkKLSAgICAgICAgewotICAgICAgICAgICAgX2xpc3QuQ2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIENvbGxlY3Rpb24gY2xhc3MgZm9yIFZCQSBtb2R1bGVzCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxWYmFNb2R1bGVDb2xsZWN0aW9uIDogRXhjZWxWQkFDb2xsZWN0aW9uQmFzZTxFeGNlbFZCQU1vZHVsZT4KLSAgICB7Ci0gICAgICAgIEV4Y2VsVmJhUHJvamVjdCBfcHJvamVjdDsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxWYmFNb2R1bGVDb2xsZWN0aW9uIChFeGNlbFZiYVByb2plY3QgcHJvamVjdCkKLQkgICAgewotICAgICAgICAgICAgX3Byb2plY3Q9cHJvamVjdDsKLQkgICAgfQotICAgICAgICBpbnRlcm5hbCB2b2lkIEFkZChFeGNlbFZCQU1vZHVsZSBJdGVtKQotICAgICAgICB7Ci0gICAgICAgICAgICBfbGlzdC5BZGQoSXRlbSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkcyBhIG5ldyBWQkEgTW9kdWxlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iTmFtZSI+VGhlIG5hbWUgb2YgdGhlIG1vZHVsZTwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgbW9kdWxlIG9iamVjdDwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIEV4Y2VsVkJBTW9kdWxlIEFkZE1vZHVsZShzdHJpbmcgTmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRoaXNbTmFtZV0gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyhuZXcgQXJndW1lbnRFeGNlcHRpb24oIlZiYSBtb2R1bGVuYW1lIGFscmVhZHkgZXhpc3QuIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIG0gPSBuZXcgRXhjZWxWQkFNb2R1bGUoKTsKLSAgICAgICAgICAgIG0uTmFtZSA9IE5hbWU7Ci0gICAgICAgICAgICBtLlR5cGUgPSBlTW9kdWxlVHlwZS5Nb2R1bGU7Ci0gICAgICAgICAgICBtLkF0dHJpYnV0ZXMuX2xpc3QuQWRkKG5ldyBFeGNlbFZiYU1vZHVsZUF0dHJpYnV0ZSgpIHsgTmFtZSA9ICJWQl9OYW1lIiwgVmFsdWUgPSBOYW1lLCBEYXRhVHlwZSA9IGVBdHRyaWJ1dGVEYXRhVHlwZS5TdHJpbmcgfSk7Ci0gICAgICAgICAgICBtLlR5cGUgPSBlTW9kdWxlVHlwZS5Nb2R1bGU7Ci0gICAgICAgICAgICBfbGlzdC5BZGQobSk7Ci0gICAgICAgICAgICByZXR1cm4gbTsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBZGRzIGEgbmV3IFZCQSBjbGFzcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Ik5hbWUiPlRoZSBuYW1lIG9mIHRoZSBjbGFzczwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iRXhwb3NlZCI+UHJpdmF0ZSBvciBQdWJsaWMgbm90IGNyZWF0ZWJsZTwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgY2xhc3Mgb2JqZWN0PC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgRXhjZWxWQkFNb2R1bGUgQWRkQ2xhc3Moc3RyaW5nIE5hbWUsIGJvb2wgRXhwb3NlZCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG0gPSBuZXcgRXhjZWxWQkFNb2R1bGUoKTsKLSAgICAgICAgICAgIG0uTmFtZSA9IE5hbWU7ICAgICAgICAgICAgCi0gICAgICAgICAgICBtLlR5cGUgPSBlTW9kdWxlVHlwZS5DbGFzczsKLSAgICAgICAgICAgIG0uQXR0cmlidXRlcy5fbGlzdC5BZGQobmV3IEV4Y2VsVmJhTW9kdWxlQXR0cmlidXRlKCkgeyBOYW1lID0gIlZCX05hbWUiLCBWYWx1ZSA9IE5hbWUsIERhdGFUeXBlID0gZUF0dHJpYnV0ZURhdGFUeXBlLlN0cmluZyB9KTsKLSAgICAgICAgICAgIG0uQXR0cmlidXRlcy5fbGlzdC5BZGQobmV3IEV4Y2VsVmJhTW9kdWxlQXR0cmlidXRlKCkgeyBOYW1lID0gIlZCX0Jhc2UiLCBWYWx1ZSA9ICIwe0ZDRkIzRDJBLUEwRkEtMTA2OC1BNzM4LTA4MDAyQjMzNzFCNX0iLCBEYXRhVHlwZSA9IGVBdHRyaWJ1dGVEYXRhVHlwZS5TdHJpbmcgfSk7Ci0gICAgICAgICAgICBtLkF0dHJpYnV0ZXMuX2xpc3QuQWRkKG5ldyBFeGNlbFZiYU1vZHVsZUF0dHJpYnV0ZSgpIHsgTmFtZSA9ICJWQl9HbG9iYWxOYW1lU3BhY2UiLCBWYWx1ZSA9ICJGYWxzZSIsIERhdGFUeXBlID0gZUF0dHJpYnV0ZURhdGFUeXBlLk5vblN0cmluZyB9KTsKLSAgICAgICAgICAgIG0uQXR0cmlidXRlcy5fbGlzdC5BZGQobmV3IEV4Y2VsVmJhTW9kdWxlQXR0cmlidXRlKCkgeyBOYW1lID0gIlZCX0NyZWF0YWJsZSIsIFZhbHVlID0gIkZhbHNlIiwgRGF0YVR5cGUgPSBlQXR0cmlidXRlRGF0YVR5cGUuTm9uU3RyaW5nIH0pOwotICAgICAgICAgICAgbS5BdHRyaWJ1dGVzLl9saXN0LkFkZChuZXcgRXhjZWxWYmFNb2R1bGVBdHRyaWJ1dGUoKSB7IE5hbWUgPSAiVkJfUHJlZGVjbGFyZWRJZCIsIFZhbHVlID0gIkZhbHNlIiwgRGF0YVR5cGUgPSBlQXR0cmlidXRlRGF0YVR5cGUuTm9uU3RyaW5nIH0pOwotICAgICAgICAgICAgbS5BdHRyaWJ1dGVzLl9saXN0LkFkZChuZXcgRXhjZWxWYmFNb2R1bGVBdHRyaWJ1dGUoKSB7IE5hbWUgPSAiVkJfRXhwb3NlZCIsIFZhbHVlID0gRXhwb3NlZCA/ICJUcnVlIiA6ICJGYWxzZSIsIERhdGFUeXBlID0gZUF0dHJpYnV0ZURhdGFUeXBlLk5vblN0cmluZyB9KTsKLSAgICAgICAgICAgIG0uQXR0cmlidXRlcy5fbGlzdC5BZGQobmV3IEV4Y2VsVmJhTW9kdWxlQXR0cmlidXRlKCkgeyBOYW1lID0gIlZCX1RlbXBsYXRlRGVyaXZlZCIsIFZhbHVlID0gIkZhbHNlIiwgRGF0YVR5cGUgPSBlQXR0cmlidXRlRGF0YVR5cGUuTm9uU3RyaW5nIH0pOwotICAgICAgICAgICAgbS5BdHRyaWJ1dGVzLl9saXN0LkFkZChuZXcgRXhjZWxWYmFNb2R1bGVBdHRyaWJ1dGUoKSB7IE5hbWUgPSAiVkJfQ3VzdG9taXphYmxlIiwgVmFsdWUgPSAiRmFsc2UiLCBEYXRhVHlwZSA9IGVBdHRyaWJ1dGVEYXRhVHlwZS5Ob25TdHJpbmcgfSk7Ci0KLSAgICAgICAgICAgIC8vbS5Db2RlID0gX3Byb2plY3QuR2V0QmxhbmtDbGFzc01vZHVsZShOYW1lLCBFeHBvc2VkKTsKLSAgICAgICAgICAgIG0uUHJpdmF0ZSA9ICFFeHBvc2VkOwotICAgICAgICAgICAgLy9tLkNsYXNzSUQ9Ci0gICAgICAgICAgICBfbGlzdC5BZGQobSk7Ci0gICAgICAgICAgICByZXR1cm4gbTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEEgY29sbGVjdGlvbiBvZiB0aGUgdmJhIHByb2plY3RzIHJlZmVyZW5jZXMKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbFZiYVJlZmVyZW5jZUNvbGxlY3Rpb24gOiBFeGNlbFZCQUNvbGxlY3Rpb25CYXNlPEV4Y2VsVmJhUmVmZXJlbmNlPgotICAgIHsgICAgICAgIAotICAgICAgICBpbnRlcm5hbCBFeGNlbFZiYVJlZmVyZW5jZUNvbGxlY3Rpb24oKQotICAgICAgICB7Ci0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBZGRzIGEgbmV3IHJlZmVyZW5jZSAKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJJdGVtIj5UaGUgcmVmZXJlbmNlIG9iamVjdDwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIEFkZChFeGNlbFZiYVJlZmVyZW5jZSBJdGVtKQotICAgICAgICB7Ci0gICAgICAgICAgICBfbGlzdC5BZGQoSXRlbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBIGNvbGxlY3Rpb24gb2YgdGhlIG1vZHVsZSBsZXZlbCBhdHRyaWJ1dGVzCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxWYmFNb2R1bGVBdHRyaWJ1dGVzQ29sbGVjdGlvbiA6IEV4Y2VsVkJBQ29sbGVjdGlvbkJhc2U8RXhjZWxWYmFNb2R1bGVBdHRyaWJ1dGU+Ci0gICAgewotICAgICAgICBpbnRlcm5hbCBzdHJpbmcgR2V0QXR0cmlidXRlVGV4dCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2I9bmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICAgICAgZm9yZWFjaCAodmFyIGF0dHIgaW4gdGhpcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoIkF0dHJpYnV0ZSB7MH0gPSB7MX1cclxuIiwgYXR0ci5OYW1lLCBhdHRyLkRhdGFUeXBlPT1lQXR0cmlidXRlRGF0YVR5cGUuU3RyaW5nID8gIlwiIiArIGF0dHIuVmFsdWUgKyAiXCIiIDogYXR0ci5WYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2IuVG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1cy9WQkEvRXhjZWxWQkFQcm9qZWN0LmNzIGIvRVBQbHVzL1ZCQS9FeGNlbFZCQVByb2plY3QuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZGI0NzIuLjAwMDAwMDAKLS0tIGEvRVBQbHVzL1ZCQS9FeGNlbFZCQVByb2plY3QuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQ0ICswLDAgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQotICoKLSAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCi0gKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCi0gKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgotICoKLSAqIElmIHlvdSB3YW50IHRvIHVuZGVyc3RhbmQgdGhpcyBjb2RlIGhhdmUgYSBsb29rIGF0IHRoZSBPZmZpY2UgVkJBIEZpbGUgRm9ybWF0IFN0cnVjdHVyZSBTcGVjaWZpY2F0aW9uIChNUy1PVkJBLlBERikgb3IKLSAqIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9jYzMxMzA5NCh2PW9mZmljZS4xMikuYXNweAotICogCi0gKiAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCi0gKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTI2LU1BUi0yMDEyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKLXVzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuUGtjczsKLXVzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKLXVzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHk7Ci11c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Ci0KLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlZCQQotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gUmVwcmVzZW50cyB0aGUgVkJBIHByb2plY3QgcGFydCBvZiB0aGUgcGFja2FnZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsVmJhUHJvamVjdAotICAgIHsKLSAgICAgICAgY29uc3Qgc3RyaW5nIHNjaGVtYVJlbFZiYSA9ICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA2L3JlbGF0aW9uc2hpcHMvdmJhUHJvamVjdCI7Ci0gICAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBQYXJ0VXJpID0gQCIveGwvdmJhUHJvamVjdC5iaW4iOwotICAgICAgICAjcmVnaW9uIENsYXNzZXMgJiBFbnVtcwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUeXBlIG9mIHN5c3RlbSB3aGVyZSB0aGUgVkJBIHByb2plY3Qgd2FzIGNyZWF0ZWQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBlbnVtIGVTeXNraW5kCi0gICAgICAgIHsKLSAgICAgICAgICAgIFdpbjE2ID0gMCwKLSAgICAgICAgICAgIFdpbjMyID0gMSwKLSAgICAgICAgICAgIE1hY2ludG9zaCA9IDIsCi0gICAgICAgICAgICBXaW42NCA9IDMKLSAgICAgICAgfQotCi0gICAgICAgICNlbmRyZWdpb24KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxWYmFQcm9qZWN0KEV4Y2VsV29ya2Jvb2sgd2IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93YiA9IHdiOwotICAgICAgICAgICAgX3BjayA9IF93Yi5fcGFja2FnZS5QYWNrYWdlOwotICAgICAgICAgICAgUmVmZXJlbmNlcyA9IG5ldyBFeGNlbFZiYVJlZmVyZW5jZUNvbGxlY3Rpb24oKTsKLSAgICAgICAgICAgIE1vZHVsZXMgPSBuZXcgRXhjZWxWYmFNb2R1bGVDb2xsZWN0aW9uKHRoaXMpOwotICAgICAgICAgICAgdmFyIHJlbCA9IF93Yi5QYXJ0LkdldFJlbGF0aW9uc2hpcHNCeVR5cGUoc2NoZW1hUmVsVmJhKS5GaXJzdE9yRGVmYXVsdCgpOwotICAgICAgICAgICAgaWYgKHJlbCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFVyaSA9IFVyaUhlbHBlci5SZXNvbHZlUGFydFVyaShyZWwuU291cmNlVXJpLCByZWwuVGFyZ2V0VXJpKTsKLSAgICAgICAgICAgICAgICBQYXJ0ID0gX3Bjay5HZXRQYXJ0KFVyaSk7Ci0jaWYgIU1PTk8KLSAgICAgICAgICAgICAgICBHZXRQcm9qZWN0KCk7ICAgICAgICAgICAgICAgIAotI2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTGNpZCA9IDA7Ci0gICAgICAgICAgICAgICAgUGFydCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxXb3JrYm9vayBfd2I7Ci0gICAgICAgIGludGVybmFsIFBhY2thZ2luZy5aaXBQYWNrYWdlIF9wY2s7Ci0gICAgICAgICNyZWdpb24gRGlyIFN0cmVhbSBQcm9wZXJ0aWVzCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFN5c3RlbSBraW5kLiBEZWZhdWx0IFdpbjMyLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZVN5c2tpbmQgU3lzdGVtS2luZCB7IGdldDsgc2V0OyB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE5hbWUgb2YgdGhlIHByb2plY3QKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBOYW1lIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvamVjdAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIERlc2NyaXB0aW9uIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQSBoZWxwZmlsZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIEhlbHBGaWxlMSB7IGdldDsgc2V0OyB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNlY29uZGFyeSBoZWxwZmlsZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIEhlbHBGaWxlMiB7IGdldDsgc2V0OyB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbnRleHQgaWYgcmVmZXJpbmcgdGhlIGhlbHBmaWxlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBpbnQgSGVscENvbnRleHRJRCB7IGdldDsgc2V0OyB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGNvbnN0YW50cwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIENvbnN0YW50cyB7IGdldDsgc2V0OyB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvZGVwYWdlIGZvciBlbmNvZGluZy4gRGVmYXVsdCBpcyBjdXJyZW50IHJlZ2lvbmFsIHNldHRpbmcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBpbnQgQ29kZVBhZ2UgeyBnZXQ7IGludGVybmFsIHNldDsgfQotICAgICAgICBpbnRlcm5hbCBpbnQgTGliRmxhZ3MgeyBnZXQ7IHNldDsgfQotICAgICAgICBpbnRlcm5hbCBpbnQgTWFqb3JWZXJzaW9uIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgaW50ZXJuYWwgaW50IE1pbm9yVmVyc2lvbiB7IGdldDsgc2V0OyB9Ci0gICAgICAgIGludGVybmFsIGludCBMY2lkIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgaW50ZXJuYWwgaW50IExjaWRJbnZva2UgeyBnZXQ7IHNldDsgfQotICAgICAgICBpbnRlcm5hbCBzdHJpbmcgUHJvamVjdElEIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgaW50ZXJuYWwgc3RyaW5nIFByb2plY3RTdHJlYW1UZXh0IHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUHJvamVjdCByZWZlcmVuY2VzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+ICAgICAgICAKLSAgICAgICAgcHVibGljIEV4Y2VsVmJhUmVmZXJlbmNlQ29sbGVjdGlvbiBSZWZlcmVuY2VzIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29kZSBNb2R1bGVzIChNb2R1bGVzLCBjbGFzc2VzLCBkZXNpZ25lciBjb2RlKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxWYmFNb2R1bGVDb2xsZWN0aW9uIE1vZHVsZXMgeyBnZXQ7IHNldDsgfQotICAgICAgICBFeGNlbFZiYVNpZ25hdHVyZSBfc2lnbmF0dXJlID0gbnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGRpZ2l0YWwgc2lnbmF0dXJlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFZiYVNpZ25hdHVyZSBTaWduYXR1cmUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9zaWduYXR1cmUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9zaWduYXR1cmU9bmV3IEV4Y2VsVmJhU2lnbmF0dXJlKFBhcnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX3NpZ25hdHVyZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBFeGNlbFZiYVByb3RlY3Rpb24gX3Byb3RlY3Rpb249bnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVkJBIHByb3RlY3Rpb24gCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFZiYVByb3RlY3Rpb24gUHJvdGVjdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX3Byb3RlY3Rpb24gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9wcm90ZWN0aW9uID0gbmV3IEV4Y2VsVmJhUHJvdGVjdGlvbih0aGlzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9wcm90ZWN0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLSNpZiAhTU9OTwotICAgICAgICAjcmVnaW9uIFJlYWQgUHJvamVjdAotICAgICAgICBwcml2YXRlIHZvaWQgR2V0UHJvamVjdCgpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFBhcnQuR2V0U3RyZWFtKCk7Ci0gICAgICAgICAgICBieXRlW10gdmJhOwotICAgICAgICAgICAgdmJhID0gbmV3IGJ5dGVbc3RyZWFtLkxlbmd0aF07Ci0gICAgICAgICAgICBzdHJlYW0uUmVhZCh2YmEsIDAsIChpbnQpc3RyZWFtLkxlbmd0aCk7Ci0gICAgICAgICAgICBEb2N1bWVudCA9IG5ldyBDb21wb3VuZERvY3VtZW50KHZiYSk7Ci0KLSAgICAgICAgICAgIFJlYWREaXJTdHJlYW0oKTsKLSAgICAgICAgICAgIFByb2plY3RTdHJlYW1UZXh0ID0gRW5jb2RpbmcuR2V0RW5jb2RpbmcoQ29kZVBhZ2UpLkdldFN0cmluZyhEb2N1bWVudC5TdG9yYWdlLkRhdGFTdHJlYW1zWyJQUk9KRUNUIl0pOwotICAgICAgICAgICAgUmVhZE1vZHVsZXMoKTsKLSAgICAgICAgICAgIFJlYWRQcm9qZWN0UHJvcGVydGllcygpOwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgdm9pZCBSZWFkTW9kdWxlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciBtb2R1bCBpbiBNb2R1bGVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBEb2N1bWVudC5TdG9yYWdlLlN1YlN0b3JhZ2VbIlZCQSJdLkRhdGFTdHJlYW1zW21vZHVsLnN0cmVhbU5hbWVdOwotICAgICAgICAgICAgICAgIHZhciBieUNvZGUgPSBDb21wb3VuZERvY3VtZW50LkRlY29tcHJlc3NQYXJ0KHN0cmVhbSwgKGludCltb2R1bC5Nb2R1bGVPZmZzZXQpOwotICAgICAgICAgICAgICAgIHN0cmluZyBjb2RlID0gRW5jb2RpbmcuR2V0RW5jb2RpbmcoQ29kZVBhZ2UpLkdldFN0cmluZyhieUNvZGUpOwotICAgICAgICAgICAgICAgIGludCBwb3M9MDsKLSAgICAgICAgICAgICAgICB3aGlsZShwb3MrOTxjb2RlLkxlbmd0aCAmJiBjb2RlLlN1YnN0cmluZyhwb3MsOSk9PSJBdHRyaWJ1dGUiKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVQb3M9Y29kZS5JbmRleE9mKCJcclxuIixwb3MpOwotICAgICAgICAgICAgICAgICAgICBzdHJpbmdbXSBsaW5lU3BsaXQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxpbmVQb3M+MCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZVNwbGl0ID0gY29kZS5TdWJzdHJpbmcocG9zICsgOSwgbGluZVBvcyAtIHBvcyAtIDkpLlNwbGl0KCc9Jyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3BsaXQ9Y29kZS5TdWJzdHJpbmcocG9zKzkpLlNwbGl0KG5ldyBjaGFyW117Jz0nfSwxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobGluZVNwbGl0Lkxlbmd0aCA+IDEpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTcGxpdFsxXSA9IGxpbmVTcGxpdFsxXS5UcmltKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXR0ciA9IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFeGNlbFZiYU1vZHVsZUF0dHJpYnV0ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9IGxpbmVTcGxpdFswXS5UcmltKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVR5cGUgPSBsaW5lU3BsaXRbMV0uU3RhcnRzV2l0aCgiXCIiKSA/IGVBdHRyaWJ1dGVEYXRhVHlwZS5TdHJpbmcgOiBlQXR0cmlidXRlRGF0YVR5cGUuTm9uU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gbGluZVNwbGl0WzFdLlN0YXJ0c1dpdGgoIlwiIikgPyBsaW5lU3BsaXRbMV0uU3Vic3RyaW5nKDEsIGxpbmVTcGxpdFsxXS5MZW5ndGggLSAyKSA6IGxpbmVTcGxpdFsxXQotICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsLkF0dHJpYnV0ZXMuX2xpc3QuQWRkKGF0dHIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBvcyA9IGxpbmVQb3MgKyAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtb2R1bC5Db2RlPWNvZGUuU3Vic3RyaW5nKHBvcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgUmVhZFByb2plY3RQcm9wZXJ0aWVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3Byb3RlY3Rpb24gPSBuZXcgRXhjZWxWYmFQcm90ZWN0aW9uKHRoaXMpOwotICAgICAgICAgICAgc3RyaW5nIHByZXZQYWNrYWdlID0gIiI7Ci0gICAgICAgICAgICB2YXIgbGluZXMgPSBSZWdleC5TcGxpdChQcm9qZWN0U3RyZWFtVGV4dCwgIlxyXG4iKTsKLSAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBsaW5lIGluIGxpbmVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChsaW5lLlN0YXJ0c1dpdGgoIlsiKSkKLSAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIHNwbGl0ID0gbGluZS5TcGxpdCgnPScpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3BsaXQuTGVuZ3RoID4gMSAmJiBzcGxpdFsxXS5MZW5ndGggPiAxICYmIHNwbGl0WzFdLlN0YXJ0c1dpdGgoIlwiIikpIC8vUmVtb3ZlIGFueSBkb3VibGUgcW91YXRlcwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcGxpdFsxXSA9IHNwbGl0WzFdLlN1YnN0cmluZygxLCBzcGxpdFsxXS5MZW5ndGggLSAyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNwbGl0WzBdKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJJRCI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdElEID0gc3BsaXRbMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJEb2N1bWVudCI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1uID0gc3BsaXRbMV0uU3Vic3RyaW5nKDAsIHNwbGl0WzFdLkluZGV4T2YoIi8mSCIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVzW21uXS5UeXBlID0gZU1vZHVsZVR5cGUuRG9jdW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJQYWNrYWdlIjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2UGFja2FnZSA9IHNwbGl0WzFdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiQmFzZUNsYXNzIjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVzW3NwbGl0WzFdXS5UeXBlID0gZU1vZHVsZVR5cGUuRGVzaWduZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlc1tzcGxpdFsxXV0uQ2xhc3NJRCA9IHByZXZQYWNrYWdlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiTW9kdWxlIjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVzW3NwbGl0WzFdXS5UeXBlID0gZU1vZHVsZVR5cGUuTW9kdWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiQ2xhc3MiOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZXNbc3BsaXRbMV1dLlR5cGUgPSBlTW9kdWxlVHlwZS5DbGFzczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIkhlbHBGaWxlIjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIk5hbWUiOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiSGVscENvbnRleHRJRCI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJEZXNjcmlwdGlvbiI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJWZXJzaW9uQ29tcGF0aWJsZTMyIjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vMzkzMjIyMDAwIgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiQ01HIjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gY21nID0gRGVjcnlwdChzcGxpdFsxXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Byb3RlY3Rpb24uVXNlclByb3RlY3RlZCA9IChjbWdbMF0gJiAxKSAhPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wcm90ZWN0aW9uLkhvc3RQcm90ZWN0ZWQgPSAoY21nWzBdICYgMikgIT0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcHJvdGVjdGlvbi5WYmVQcm90ZWN0ZWQgPSAoY21nWzBdICYgNCkgIT0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIkRQQiI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGRwYiA9IERlY3J5cHQoc3BsaXRbMV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcGIuTGVuZ3RoID49IDI4KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSByZXNlcnZlZCA9IGRwYlswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZsYWdzID0gbmV3IGJ5dGVbM107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoZHBiLCAxLCBmbGFncywgMCwgMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrZXlOb051bGxzID0gbmV3IGJ5dGVbNF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wcm90ZWN0aW9uLlBhc3N3b3JkS2V5ID0gbmV3IGJ5dGVbNF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoZHBiLCA0LCBrZXlOb051bGxzLCAwLCA0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhhc2hOb051bGxzID0gbmV3IGJ5dGVbMjBdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcHJvdGVjdGlvbi5QYXNzd29yZEhhc2ggPSBuZXcgYnl0ZVsyMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoZHBiLCA4LCBoYXNoTm9OdWxscywgMCwgMjApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0hhbmRsZSAweDAwIGJpdHdpc2UgMi40LjQuMyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNDsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0ID0gMTI4ID4+IChpbnQpKChpICUgOCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCA0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaW50KShmbGFnc1swXSAmIGJpdCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wcm90ZWN0aW9uLlBhc3N3b3JkS2V5W2ldID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Byb3RlY3Rpb24uUGFzc3dvcmRLZXlbaV0gPSBrZXlOb051bGxzW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ0luZGV4ID0gKGkgLSBpICUgOCkgLyA4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaW50KShmbGFnc1tmbGFnSW5kZXhdICYgYml0KSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Byb3RlY3Rpb24uUGFzc3dvcmRIYXNoW2kgLSA0XSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wcm90ZWN0aW9uLlBhc3N3b3JkSGFzaFtpIC0gNF0gPSBoYXNoTm9OdWxsc1tpIC0gNF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiR0MiOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wcm90ZWN0aW9uLlZpc2liaWxpdHlTdGF0ZSA9IERlY3J5cHQoc3BsaXRbMV0pWzBdID09IDB4RkY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIDIuNC4zLjMgRGVjcnlwdGlvbgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj5CeXRlIGhleCBzdHJpbmc8L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIGRlY3J5cHRlZCB2YWx1ZTwvcmV0dXJucz4KLSAgICAgICAgcHJpdmF0ZSBieXRlW10gRGVjcnlwdChzdHJpbmcgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVbXSBlbmMgPSBHZXRCeXRlKHZhbHVlKTsKLSAgICAgICAgICAgIGJ5dGVbXSBkZWMgPSBuZXcgYnl0ZVsodmFsdWUuTGVuZ3RoIC0gMSldOwotICAgICAgICAgICAgYnl0ZSBzZWVkLCB2ZXJzaW9uLCBwcm9qS2V5LCBpZ25vcmVkTGVuZ3RoOwotICAgICAgICAgICAgc2VlZCA9IGVuY1swXTsKLSAgICAgICAgICAgIGRlY1swXSA9IChieXRlKShlbmNbMV0gXiBzZWVkKTsKLSAgICAgICAgICAgIGRlY1sxXSA9IChieXRlKShlbmNbMl0gXiBzZWVkKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAyOyBpIDwgZW5jLkxlbmd0aCAtIDE7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWNbaV0gPSAoYnl0ZSkoZW5jW2kgKyAxXSBeIChlbmNbaSAtIDFdICsgZGVjW2kgLSAxXSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmVyc2lvbiA9IGRlY1swXTsKLSAgICAgICAgICAgIHByb2pLZXkgPSBkZWNbMV07Ci0gICAgICAgICAgICBpZ25vcmVkTGVuZ3RoID0gKGJ5dGUpKChzZWVkICYgNikgLyAyKTsKLSAgICAgICAgICAgIGludCBkYXRhbGVuZ3RoID0gQml0Q29udmVydGVyLlRvSW50MzIoZGVjLCBpZ25vcmVkTGVuZ3RoICsgMik7Ci0gICAgICAgICAgICB2YXIgZGF0YSA9IG5ldyBieXRlW2RhdGFsZW5ndGhdOwotICAgICAgICAgICAgQXJyYXkuQ29weShkZWMsIDYgKyBpZ25vcmVkTGVuZ3RoLCBkYXRhLCAwLCBkYXRhbGVuZ3RoKTsKLSAgICAgICAgICAgIHJldHVybiBkYXRhOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIDIuNC4zLjIgRW5jcnlwdGlvbgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+Qnl0ZSBoZXggc3RyaW5nPC9yZXR1cm5zPgotICAgICAgICBwcml2YXRlIHN0cmluZyBFbmNyeXB0KGJ5dGVbXSB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgYnl0ZVtdIHNlZWQgPSBuZXcgYnl0ZVsxXTsKLSAgICAgICAgICAgIHZhciBybiA9IFJhbmRvbU51bWJlckdlbmVyYXRvci5DcmVhdGUoKTsKLSAgICAgICAgICAgIHJuLkdldEJ5dGVzKHNlZWQpOwotICAgICAgICAgICAgQmluYXJ5V3JpdGVyIGJyID0gbmV3IEJpbmFyeVdyaXRlcihuZXcgTWVtb3J5U3RyZWFtKCkpOwotICAgICAgICAgICAgYnl0ZVtdIGVuYyA9IG5ldyBieXRlW3ZhbHVlLkxlbmd0aCArIDEwXTsKLSAgICAgICAgICAgIGVuY1swXSA9IHNlZWRbMF07Ci0gICAgICAgICAgICBlbmNbMV0gPSAoYnl0ZSkoMiBeIHNlZWRbMF0pOwotCi0gICAgICAgICAgICBieXRlIHByb2pLZXkgPSAwOwotCi0gICAgICAgICAgICBmb3JlYWNoICh2YXIgYyBpbiBQcm9qZWN0SUQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJvaktleSArPSAoYnl0ZSljOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZW5jWzJdID0gKGJ5dGUpKHByb2pLZXkgXiBzZWVkWzBdKTsKLSAgICAgICAgICAgIHZhciBpZ25vcmVkTGVuZ3RoID0gKHNlZWRbMF0gJiA2KSAvIDI7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlnbm9yZWRMZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBici5Xcml0ZShzZWVkWzBdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyLldyaXRlKHZhbHVlLkxlbmd0aCk7Ci0gICAgICAgICAgICBici5Xcml0ZSh2YWx1ZSk7Ci0KLSAgICAgICAgICAgIGludCBwb3MgPSAzOwotICAgICAgICAgICAgYnl0ZSBwYiA9IHByb2pLZXk7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgYiBpbiAoKE1lbW9yeVN0cmVhbSlici5CYXNlU3RyZWFtKS5Ub0FycmF5KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW5jW3Bvc10gPSAoYnl0ZSkoYiBeIChlbmNbcG9zIC0gMl0gKyBwYikpOwotICAgICAgICAgICAgICAgIHBvcysrOwotICAgICAgICAgICAgICAgIHBiID0gYjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIEdldFN0cmluZyhlbmMsIHBvcyAtIDEpOwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgc3RyaW5nIEdldFN0cmluZyhieXRlW10gdmFsdWUsIGludCBtYXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyByZXQgPSAiIjsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IG1heDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh2YWx1ZVtpXSA8IDE2KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ICs9ICIwIiArIHZhbHVlW2ldLlRvU3RyaW5nKCJ4Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldCArPSB2YWx1ZVtpXS5Ub1N0cmluZygieCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXQuVG9VcHBlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIGJ5dGVbXSBHZXRCeXRlKHN0cmluZyB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgYnl0ZVtdIHJldCA9IG5ldyBieXRlW3ZhbHVlLkxlbmd0aCAvIDJdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXQuTGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0W2ldID0gYnl0ZS5QYXJzZSh2YWx1ZS5TdWJzdHJpbmcoaSAqIDIsIDIpLCBTeXN0ZW0uR2xvYmFsaXphdGlvbi5OdW1iZXJTdHlsZXMuQWxsb3dIZXhTcGVjaWZpZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHZvaWQgUmVhZERpclN0cmVhbSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVbXSBkaXIgPSBDb21wb3VuZERvY3VtZW50LkRlY29tcHJlc3NQYXJ0KERvY3VtZW50LlN0b3JhZ2UuU3ViU3RvcmFnZVsiVkJBIl0uRGF0YVN0cmVhbXNbImRpciJdKTsKLSAgICAgICAgICAgIE1lbW9yeVN0cmVhbSBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oZGlyKTsKLSAgICAgICAgICAgIEJpbmFyeVJlYWRlciBiciA9IG5ldyBCaW5hcnlSZWFkZXIobXMpOwotICAgICAgICAgICAgRXhjZWxWYmFSZWZlcmVuY2UgY3VycmVudFJlZiA9IG51bGw7Ci0gICAgICAgICAgICBzdHJpbmcgcmVmZXJlbmNlTmFtZSA9ICIiOwotICAgICAgICAgICAgRXhjZWxWQkFNb2R1bGUgY3VycmVudE1vZHVsZSA9IG51bGw7Ci0gICAgICAgICAgICBib29sIHRlcm1pbmF0ZSA9IGZhbHNlOwotICAgICAgICAgICAgd2hpbGUgKGJyLkJhc2VTdHJlYW0uUG9zaXRpb24gPCBici5CYXNlU3RyZWFtLkxlbmd0aCAmJiB0ZXJtaW5hdGUgPT0gZmFsc2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdXNob3J0IGlkID0gYnIuUmVhZFVJbnQxNigpOwotICAgICAgICAgICAgICAgIHVpbnQgc2l6ZSA9IGJyLlJlYWRVSW50MzIoKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGlkKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweDAxOgotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtS2luZCA9IChlU3lza2luZClici5SZWFkVUludDMyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweDAyOgotICAgICAgICAgICAgICAgICAgICAgICAgTGNpZCA9IChpbnQpYnIuUmVhZFVJbnQzMigpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwMzoKLSAgICAgICAgICAgICAgICAgICAgICAgIENvZGVQYWdlID0gKGludClici5SZWFkVUludDE2KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweDA0OgotICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9IEdldFN0cmluZyhiciwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweDA1OgotICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPSBHZXRVbmljb2RlU3RyaW5nKGJyLCBzaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDY6Ci0gICAgICAgICAgICAgICAgICAgICAgICBIZWxwRmlsZTEgPSBHZXRTdHJpbmcoYnIsIHNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHgzRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIEhlbHBGaWxlMiA9IEdldFN0cmluZyhiciwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweDA3OgotICAgICAgICAgICAgICAgICAgICAgICAgSGVscENvbnRleHRJRCA9IChpbnQpYnIuUmVhZFVJbnQzMigpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwODoKLSAgICAgICAgICAgICAgICAgICAgICAgIExpYkZsYWdzID0gKGludClici5SZWFkVUludDMyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweDA5OgotICAgICAgICAgICAgICAgICAgICAgICAgTWFqb3JWZXJzaW9uID0gKGludClici5SZWFkVUludDMyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNaW5vclZlcnNpb24gPSAoaW50KWJyLlJlYWRVSW50MTYoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MEM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMgPSBHZXRVbmljb2RlU3RyaW5nKGJyLCBzaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MEQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aW50IHNpemVMaWJJRCA9IGJyLlJlYWRVSW50MzIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWdSZWYgPSBuZXcgRXhjZWxWYmFSZWZlcmVuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZ1JlZi5OYW1lID0gcmVmZXJlbmNlTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZ1JlZi5SZWZlcmVuY2VSZWNvcmRJRCA9IGlkOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVnUmVmLkxpYmlkID0gR2V0U3RyaW5nKGJyLCBzaXplTGliSUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgdWludCByZXNlcnZlZDEgPSBici5SZWFkVUludDMyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgcmVzZXJ2ZWQyID0gYnIuUmVhZFVJbnQxNigpOwotICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlcy5BZGQocmVnUmVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvalJlZiA9IG5ldyBFeGNlbFZiYVJlZmVyZW5jZVByb2plY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2pSZWYuUmVmZXJlbmNlUmVjb3JkSUQgPSBpZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2pSZWYuTmFtZSA9IHJlZmVyZW5jZU5hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaXplTGliSUQgPSBici5SZWFkVUludDMyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9qUmVmLkxpYmlkID0gR2V0U3RyaW5nKGJyLCBzaXplTGliSUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZUxpYklEID0gYnIuUmVhZFVJbnQzMigpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJvalJlZi5MaWJJZFJlbGF0aXZlID0gR2V0U3RyaW5nKGJyLCBzaXplTGliSUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJvalJlZi5NYWpvclZlcnNpb24gPSBici5SZWFkVUludDMyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9qUmVmLk1pbm9yVmVyc2lvbiA9IGJyLlJlYWRVSW50MTYoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZXMuQWRkKHByb2pSZWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwRjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzaG9ydCBtb2R1YWxDb3VudCA9IGJyLlJlYWRVSW50MTYoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MTM6Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgY29va2llID0gYnIuUmVhZFVJbnQxNigpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHgxNDoKLSAgICAgICAgICAgICAgICAgICAgICAgIExjaWRJbnZva2UgPSAoaW50KWJyLlJlYWRVSW50MzIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MTY6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VOYW1lID0gR2V0VW5pY29kZVN0cmluZyhiciwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweDE5OgotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE1vZHVsZSA9IG5ldyBFeGNlbFZCQU1vZHVsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE1vZHVsZS5OYW1lID0gR2V0VW5pY29kZVN0cmluZyhiciwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVzLkFkZChjdXJyZW50TW9kdWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MUE6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TW9kdWxlLnN0cmVhbU5hbWUgPSBHZXRVbmljb2RlU3RyaW5nKGJyLCBzaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MUM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TW9kdWxlLkRlc2NyaXB0aW9uID0gR2V0VW5pY29kZVN0cmluZyhiciwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweDFFOgotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE1vZHVsZS5IZWxwQ29udGV4dCA9IChpbnQpYnIuUmVhZFVJbnQzMigpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHgyMToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweDIyOgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHgyQjogICAgICAvL01vZHVsIFRlcm1pbmF0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MkM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TW9kdWxlLkNvb2tpZSA9IGJyLlJlYWRVSW50MTYoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MzE6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TW9kdWxlLk1vZHVsZU9mZnNldCA9IGJyLlJlYWRVSW50MzIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MTA6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHgzMDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBleHRSZWYgPSAoRXhjZWxWYmFSZWZlcmVuY2VDb250cm9sKWN1cnJlbnRSZWY7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2l6ZUV4dCA9IGJyLlJlYWRVSW50MzIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dFJlZi5MaWJJZEV4dGVybmFsID0gR2V0U3RyaW5nKGJyLCBzaXplRXh0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgdWludCByZXNlcnZlZDQgPSBici5SZWFkVUludDMyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQgcmVzZXJ2ZWQ1ID0gYnIuUmVhZFVJbnQxNigpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXh0UmVmLk9yaWdpbmFsVHlwZUxpYiA9IG5ldyBHdWlkKGJyLlJlYWRCeXRlcygxNikpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXh0UmVmLkNvb2tpZSA9IGJyLlJlYWRVSW50MzIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MzM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmVmID0gbmV3IEV4Y2VsVmJhUmVmZXJlbmNlQ29udHJvbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFJlZi5SZWZlcmVuY2VSZWNvcmRJRCA9IGlkOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFJlZi5OYW1lID0gcmVmZXJlbmNlTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSZWYuTGliaWQgPSBHZXRTdHJpbmcoYnIsIHNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlcy5BZGQoY3VycmVudFJlZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweDJGOgotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRyUmVmID0gKEV4Y2VsVmJhUmVmZXJlbmNlQ29udHJvbCljdXJyZW50UmVmOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udHJSZWYuUmVmZXJlbmNlUmVjb3JkSUQgPSBpZDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNpemVUd2lkZGxlZCA9IGJyLlJlYWRVSW50MzIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyUmVmLkxpYklkVHdpZGRsZWQgPSBHZXRTdHJpbmcoYnIsIHNpemVUd2lkZGxlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcjEgPSBici5SZWFkVUludDMyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcjIgPSBici5SZWFkVUludDE2KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MjU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TW9kdWxlLlJlYWRPbmx5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4Mjg6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TW9kdWxlLlByaXZhdGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotCi0gICAgICAgICNyZWdpb24gU2F2ZSBQcm9qZWN0Ci0gICAgICAgIGludGVybmFsIHZvaWQgU2F2ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChWYWxpZGF0ZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbXBvdW5kRG9jdW1lbnQgZG9jID0gbmV3IENvbXBvdW5kRG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICBkb2MuU3RvcmFnZSA9IG5ldyBDb21wb3VuZERvY3VtZW50LlN0b3JhZ2VQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgdmFyIHN0b3JlID0gbmV3IENvbXBvdW5kRG9jdW1lbnQuU3RvcmFnZVBhcnQoKTsKLSAgICAgICAgICAgICAgICBkb2MuU3RvcmFnZS5TdWJTdG9yYWdlLkFkZCgiVkJBIiwgc3RvcmUpOwotCi0gICAgICAgICAgICAgICAgc3RvcmUuRGF0YVN0cmVhbXMuQWRkKCJfVkJBX1BST0pFQ1QiLCBDcmVhdGVWQkFQcm9qZWN0U3RyZWFtKCkpOwotICAgICAgICAgICAgICAgIHN0b3JlLkRhdGFTdHJlYW1zLkFkZCgiZGlyIiwgQ3JlYXRlRGlyU3RyZWFtKCkpOwotICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBtb2R1bGUgaW4gTW9kdWxlcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0b3JlLkRhdGFTdHJlYW1zLkFkZChtb2R1bGUuTmFtZSwgQ29tcG91bmREb2N1bWVudC5Db21wcmVzc1BhcnQoRW5jb2RpbmcuR2V0RW5jb2RpbmcoQ29kZVBhZ2UpLkdldEJ5dGVzKG1vZHVsZS5BdHRyaWJ1dGVzLkdldEF0dHJpYnV0ZVRleHQoKSArIG1vZHVsZS5Db2RlKSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vQ29weSBzdHJlYW1zIGZyb20gdGhlIHRlbXBsYXRlLCBpZiB1c2VkLgotICAgICAgICAgICAgICAgIGlmIChEb2N1bWVudCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHNzIGluIERvY3VtZW50LlN0b3JhZ2UuU3ViU3RvcmFnZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNzLktleSAhPSAiVkJBIikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2MuU3RvcmFnZS5TdWJTdG9yYWdlLkFkZChzcy5LZXksIHNzLlZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgcyBpbiBEb2N1bWVudC5TdG9yYWdlLkRhdGFTdHJlYW1zKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5LZXkgIT0gImRpciIgJiYgcy5LZXkgIT0gIlBST0pFQ1QiICYmIHMuS2V5ICE9ICJQUk9KRUNUd20iKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvYy5TdG9yYWdlLkRhdGFTdHJlYW1zLkFkZChzLktleSwgcy5WYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkb2MuU3RvcmFnZS5EYXRhU3RyZWFtcy5BZGQoIlBST0pFQ1QiLCBDcmVhdGVQcm9qZWN0U3RyZWFtKCkpOwotICAgICAgICAgICAgICAgIGRvYy5TdG9yYWdlLkRhdGFTdHJlYW1zLkFkZCgiUFJPSkVDVHdtIiwgQ3JlYXRlUHJvamVjdHdtU3RyZWFtKCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKFBhcnQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFVyaSA9IG5ldyBVcmkoUGFydFVyaSwgVXJpS2luZC5SZWxhdGl2ZSk7Ci0gICAgICAgICAgICAgICAgICAgIFBhcnQgPSBfcGNrLkNyZWF0ZVBhcnQoVXJpLCBFeGNlbFBhY2thZ2Uuc2NoZW1hVkJBKTsKLSAgICAgICAgICAgICAgICAgICAgdmFyIHJlbCA9IF93Yi5QYXJ0LkNyZWF0ZVJlbGF0aW9uc2hpcChVcmksIFBhY2thZ2luZy5UYXJnZXRNb2RlLkludGVybmFsLCBzY2hlbWFSZWxWYmEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2YXIgdmJhQnVmZmVyPWRvYy5TYXZlKCk7Ci0gICAgICAgICAgICAgICAgdmFyIHN0ID0gUGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlKTsKLSAgICAgICAgICAgICAgICBzdC5Xcml0ZSh2YmFCdWZmZXIsIDAsIHZiYUJ1ZmZlci5MZW5ndGgpOwotICAgICAgICAgICAgICAgIHN0LkZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgLy9TYXZlIHRoZSBkaWdpdGFsIHNpZ250dXJlCi0gICAgICAgICAgICAgICAgU2lnbmF0dXJlLlNhdmUodGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2wgVmFsaWRhdGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBEZXNjcmlwdGlvbiA9IERlc2NyaXB0aW9uID8/ICIiOwotICAgICAgICAgICAgSGVscEZpbGUxID0gSGVscEZpbGUxID8/ICIiOwotICAgICAgICAgICAgSGVscEZpbGUyID0gSGVscEZpbGUyID8/ICIiOwotICAgICAgICAgICAgQ29uc3RhbnRzID0gQ29uc3RhbnRzID8/ICIiOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBNUy1PVkJBIDIuMy40LjEKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHJpdmF0ZSBieXRlW10gQ3JlYXRlVkJBUHJvamVjdFN0cmVhbSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJpbmFyeVdyaXRlciBidyA9IG5ldyBCaW5hcnlXcml0ZXIobmV3IE1lbW9yeVN0cmVhbSgpKTsKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpMHg2MUNDKTsgLy9SZXNlcnZlZDEKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpMHhGRkZGKTsgLy9WZXJzaW9uCi0gICAgICAgICAgICBidy5Xcml0ZSgoYnl0ZSkweDApOyAvL1Jlc2VydmVkMwotICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCkweDApOyAvL1Jlc2VydmVkNAotICAgICAgICAgICAgcmV0dXJuICgoTWVtb3J5U3RyZWFtKWJ3LkJhc2VTdHJlYW0pLlRvQXJyYXkoKTsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBNUy1PVkJBIDIuMy40LjEKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHJpdmF0ZSBieXRlW10gQ3JlYXRlRGlyU3RyZWFtKCkKLSAgICAgICAgewotICAgICAgICAgICAgQmluYXJ5V3JpdGVyIGJ3ID0gbmV3IEJpbmFyeVdyaXRlcihuZXcgTWVtb3J5U3RyZWFtKCkpOwotCi0gICAgICAgICAgICAvKioqKioqIFBST0pFQ1RJTkZPUk1BVElPTiBSZWNvcmQgKioqKioqLwotICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCkxKTsgICAgICAgIC8vSUQKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KTQpOyAgICAgICAgICAvL1NpemUKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KVN5c3RlbUtpbmQpOyAvL1N5c0tpbmQKLQotICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCkyKTsgICAgICAgIC8vSUQKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KTQpOyAgICAgICAgICAvL1NpemUKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KUxjaWQpOyAgICAgICAvL0xjaWQKLQotICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCkweDE0KTsgICAgIC8vSUQKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KTQpOyAgICAgICAgICAvL1NpemUKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KUxjaWRJbnZva2UpOyAvL0xjaWQgSW52b2tlCi0KLSAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpMyk7ICAgICAgICAvL0lECi0gICAgICAgICAgICBidy5Xcml0ZSgodWludCkyKTsgICAgICAgICAgLy9TaXplCi0gICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KUNvZGVQYWdlKTsgICAvL0NvZGVwYWdlCi0KLSAgICAgICAgICAgIC8vUHJvamVjdE5hbWUKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lECi0gICAgICAgICAgICBidy5Xcml0ZSgodWludClOYW1lLkxlbmd0aCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1NpemUKLSAgICAgICAgICAgIGJ3LldyaXRlKEVuY29kaW5nLkdldEVuY29kaW5nKENvZGVQYWdlKS5HZXRCeXRlcyhOYW1lKSk7IC8vUHJvamVjdCBOYW1lCi0KLSAgICAgICAgICAgIC8vRGVzY3JpcHRpb24KLSAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpNSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lECi0gICAgICAgICAgICBidy5Xcml0ZSgodWludClEZXNjcmlwdGlvbi5MZW5ndGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9TaXplCi0gICAgICAgICAgICBidy5Xcml0ZShFbmNvZGluZy5HZXRFbmNvZGluZyhDb2RlUGFnZSkuR2V0Qnl0ZXMoRGVzY3JpcHRpb24pKTsgLy9Qcm9qZWN0IE5hbWUKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpMHg0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSUQKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KURlc2NyaXB0aW9uLkxlbmd0aCoyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1NpemUKLSAgICAgICAgICAgIGJ3LldyaXRlKEVuY29kaW5nLlVuaWNvZGUuR2V0Qnl0ZXMoRGVzY3JpcHRpb24pKTsgICAgICAgICAgICAgICAvL1Byb2plY3QgRGVzY3JpcHRpb24KLQotICAgICAgICAgICAgLy9IZWxwZmlsZXMKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSUQKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KUhlbHBGaWxlMS5MZW5ndGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU2l6ZQotICAgICAgICAgICAgYncuV3JpdGUoRW5jb2RpbmcuR2V0RW5jb2RpbmcoQ29kZVBhZ2UpLkdldEJ5dGVzKEhlbHBGaWxlMSkpOyAgLy9IZWxwRmlsZTEgICAgICAgICAgICAKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpMHgzRCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSUQKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KUhlbHBGaWxlMi5MZW5ndGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU2l6ZQotICAgICAgICAgICAgYncuV3JpdGUoRW5jb2RpbmcuR2V0RW5jb2RpbmcoQ29kZVBhZ2UpLkdldEJ5dGVzKEhlbHBGaWxlMikpOyAgLy9IZWxwRmlsZTIKLQotICAgICAgICAgICAgLy9IZWxwIGNvbnRleHQgaWQKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpNyk7ICAgICAgICAgICAgLy9JRAotICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpNCk7ICAgICAgICAgICAgICAvL1NpemUKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KUhlbHBDb250ZXh0SUQpOyAgLy9IZWxwIGNvbnRleHQgaWQKLQotICAgICAgICAgICAgLy9MaWJmbGFncwotICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCk4KTsgICAgICAgICAgICAvL0lECi0gICAgICAgICAgICBidy5Xcml0ZSgodWludCk0KTsgICAgICAgICAgICAgIC8vU2l6ZQotICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpMCk7ICAvL0hlbHAgY29udGV4dCBpZAotCi0gICAgICAgICAgICAvL1ZiYSBWZXJzaW9uCi0gICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTkpOyAgICAgICAgICAgIC8vSUQKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KTQpOyAgICAgICAgICAgICAgLy9SZXNlcnZlZAotICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpTWFqb3JWZXJzaW9uKTsgICAvL1Jlc2VydmVkCi0gICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KU1pbm9yVmVyc2lvbik7IC8vSGVscCBjb250ZXh0IGlkCi0KLSAgICAgICAgICAgIC8vQ29uc3RhbnRzCi0gICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTB4MEMpOyAgICAgICAgICAgLy9JRAotICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpQ29uc3RhbnRzLkxlbmd0aCk7ICAgICAgICAgICAgICAvL1NpemUKLSAgICAgICAgICAgIGJ3LldyaXRlKEVuY29kaW5nLkdldEVuY29kaW5nKENvZGVQYWdlKS5HZXRCeXRlcyhDb25zdGFudHMpKTsgICAgICAgICAgICAgIC8vSGVscCBjb250ZXh0IGlkCi0gICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTB4M0MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lECi0gICAgICAgICAgICBidy5Xcml0ZSgodWludClDb25zdGFudHMuTGVuZ3RoLzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU2l6ZQotICAgICAgICAgICAgYncuV3JpdGUoRW5jb2RpbmcuVW5pY29kZS5HZXRCeXRlcyhDb25zdGFudHMpKTsgIC8vSGVscEZpbGUyCi0KLSAgICAgICAgICAgIC8qKioqKiogUFJPSkVDVFJFRkVSRU5DRVMgUmVjb3JkICoqKioqKi8KLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciByZWZlcmVuY2UgaW4gUmVmZXJlbmNlcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBXcml0ZU5hbWVSZWZlcmVuY2UoYncsIHJlZmVyZW5jZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlLlJlZmVyZW5jZVJlY29yZElEID09IDB4MkYpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBXcml0ZUNvbnRyb2xSZWZlcmVuY2UoYncsIHJlZmVyZW5jZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlZmVyZW5jZS5SZWZlcmVuY2VSZWNvcmRJRCA9PSAweDMzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgV3JpdGVPcmdpbmFsUmVmZXJlbmNlKGJ3LCByZWZlcmVuY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWZlcmVuY2UuUmVmZXJlbmNlUmVjb3JkSUQgPT0gMHgwRCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFdyaXRlUmVnaXN0ZXJlZFJlZmVyZW5jZShidywgcmVmZXJlbmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVmZXJlbmNlLlJlZmVyZW5jZVJlY29yZElEID09IDB4MEUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBXcml0ZVByb2plY3RSZWZlcmVuY2UoYncsIHJlZmVyZW5jZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTB4MEYpOwotICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpMHgwMik7Ci0gICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KU1vZHVsZXMuQ291bnQpOwotICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCkweDEzKTsKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KTB4MDIpOwotICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCkweEZGRkYpOwotCi0gICAgICAgICAgICBmb3JlYWNoICh2YXIgbW9kdWxlIGluIE1vZHVsZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgV3JpdGVNb2R1bGVSZWNvcmQoYncsIG1vZHVsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTB4MTApOyAgICAgICAgICAgICAvL1Rlcm1pbmF0b3IKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KTApOyAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIHJldHVybiBDb21wb3VuZERvY3VtZW50LkNvbXByZXNzUGFydCgoKE1lbW9yeVN0cmVhbSlidy5CYXNlU3RyZWFtKS5Ub0FycmF5KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlTW9kdWxlUmVjb3JkKEJpbmFyeVdyaXRlciBidywgRXhjZWxWQkFNb2R1bGUgbW9kdWxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTB4MTkpOwotICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpbW9kdWxlLk5hbWUuTGVuZ3RoKTsKLSAgICAgICAgICAgIGJ3LldyaXRlKEVuY29kaW5nLkdldEVuY29kaW5nKENvZGVQYWdlKS5HZXRCeXRlcyhtb2R1bGUuTmFtZSkpOyAgICAgLy9OYW1lCi0KLSAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpMHg0Nyk7Ci0gICAgICAgICAgICBidy5Xcml0ZSgodWludCltb2R1bGUuTmFtZS5MZW5ndGgqMik7Ci0gICAgICAgICAgICBidy5Xcml0ZShFbmNvZGluZy5Vbmljb2RlLkdldEJ5dGVzKG1vZHVsZS5OYW1lKSk7ICAgICAgICAgICAgICAgICAgIC8vTmFtZQotCi0gICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTB4MUEpOwotICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpbW9kdWxlLk5hbWUuTGVuZ3RoKTsKLSAgICAgICAgICAgIGJ3LldyaXRlKEVuY29kaW5nLkdldEVuY29kaW5nKENvZGVQYWdlKS5HZXRCeXRlcyhtb2R1bGUuTmFtZSkpOyAgICAgLy9TdHJlYW0gTmFtZSAgCi0KLSAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpMHgzMik7Ci0gICAgICAgICAgICBidy5Xcml0ZSgodWludCltb2R1bGUuTmFtZS5MZW5ndGgqMik7Ci0gICAgICAgICAgICBidy5Xcml0ZShFbmNvZGluZy5Vbmljb2RlLkdldEJ5dGVzKG1vZHVsZS5OYW1lKSk7ICAgICAgICAgICAgICAgICAgIC8vU3RyZWFtIE5hbWUKLQotICAgICAgICAgICAgbW9kdWxlLkRlc2NyaXB0aW9uID0gbW9kdWxlLkRlc2NyaXB0aW9uID8/ICIiOwotICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCkweDFDKTsKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KW1vZHVsZS5EZXNjcmlwdGlvbi5MZW5ndGgpOwotICAgICAgICAgICAgYncuV3JpdGUoRW5jb2RpbmcuR2V0RW5jb2RpbmcoQ29kZVBhZ2UpLkdldEJ5dGVzKG1vZHVsZS5EZXNjcmlwdGlvbikpOyAgICAgLy9EZXNjcmlwdGlvbgotCi0gICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTB4NDgpOwotICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpbW9kdWxlLkRlc2NyaXB0aW9uLkxlbmd0aCoyKTsKLSAgICAgICAgICAgIGJ3LldyaXRlKEVuY29kaW5nLlVuaWNvZGUuR2V0Qnl0ZXMobW9kdWxlLkRlc2NyaXB0aW9uKSk7ICAgICAgICAgICAgICAgICAgIC8vRGVzY3JpcHRpb24KLQotICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCkweDMxKTsKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KTQpOwotICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Nb2R1bGUgU3RyZWFtIE9mZnNldCAoTm8gUGVyZm9ybWFuY2VDYWNoZSkKLQotICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCkweDFFKTsKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KTQpOwotICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpbW9kdWxlLkhlbHBDb250ZXh0KTsgICAgICAgICAgICAvL0hlbHAgY29udGV4dCBJRAotCi0gICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTB4MkMpOwotICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpMik7Ci0gICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTB4RkZGRik7ICAgICAgICAgICAgLy9IZWxwIGNvbnRleHQgSUQKLQotICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCkobW9kdWxlLlR5cGUgPT0gZU1vZHVsZVR5cGUuTW9kdWxlID8gMHgyMSA6IDB4MjIpKTsKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KTApOwotCi0gICAgICAgICAgICBpZiAobW9kdWxlLlJlYWRPbmx5KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpMHgyNSk7Ci0gICAgICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpMCk7ICAgICAgICAgICAgICAvL1JlYWRvbmx5Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtb2R1bGUuUHJpdmF0ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTB4MjgpOwotICAgICAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KTApOyAgICAgICAgICAgICAgLy9Qcml2YXRlCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpMHgyQik7ICAgICAgICAgICAgIC8vVGVybWluYXRvcgotICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpMCk7ICAgICAgICAgICAgICAKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZU5hbWVSZWZlcmVuY2UoQmluYXJ5V3JpdGVyIGJ3LCBFeGNlbFZiYVJlZmVyZW5jZSByZWZlcmVuY2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vTmFtZSByZWNvcmQKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpMHgxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JRAotICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpcmVmZXJlbmNlLk5hbWUuTGVuZ3RoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1NpemUKLSAgICAgICAgICAgIGJ3LldyaXRlKEVuY29kaW5nLkdldEVuY29kaW5nKENvZGVQYWdlKS5HZXRCeXRlcyhyZWZlcmVuY2UuTmFtZSkpOyAgLy9IZWxwRmlsZTEKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpMHgzRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JRAotICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpcmVmZXJlbmNlLk5hbWUuTGVuZ3RoICogMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU2l6ZQotICAgICAgICAgICAgYncuV3JpdGUoRW5jb2RpbmcuVW5pY29kZS5HZXRCeXRlcyhyZWZlcmVuY2UuTmFtZSkpOyAgICAgICAgICAgICAgICAvL0hlbHBGaWxlMgotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUNvbnRyb2xSZWZlcmVuY2UoQmluYXJ5V3JpdGVyIGJ3LCBFeGNlbFZiYVJlZmVyZW5jZSByZWZlcmVuY2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFdyaXRlT3JnaW5hbFJlZmVyZW5jZShidywgcmVmZXJlbmNlKTsKLQotICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCkweDJGKTsKLSAgICAgICAgICAgIHZhciBjb250cm9sUmVmPShFeGNlbFZiYVJlZmVyZW5jZUNvbnRyb2wpcmVmZXJlbmNlOwotICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpKDQgKyBjb250cm9sUmVmLkxpYklkVHdpZGRsZWQuTGVuZ3RoICsgNCArIDIpKTsgICAgLy8gU2l6ZSBvZiBTaXplT2ZMaWJpZFR3aWRkbGVkLCBMaWJpZFR3aWRkbGVkLCBSZXNlcnZlZDEsIGFuZCBSZXNlcnZlZDIuCi0gICAgICAgICAgICBidy5Xcml0ZSgodWludCljb250cm9sUmVmLkxpYklkVHdpZGRsZWQuTGVuZ3RoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1NpemUgICAgICAgICAgICAKLSAgICAgICAgICAgIGJ3LldyaXRlKEVuY29kaW5nLkdldEVuY29kaW5nKENvZGVQYWdlKS5HZXRCeXRlcyhjb250cm9sUmVmLkxpYklkVHdpZGRsZWQpKTsgIC8vTGliSUQKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KTApOyAgICAgIC8vUmVzZXJ2ZWQxCi0gICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTApOyAgICAvL1Jlc2VydmVkMgotICAgICAgICAgICAgV3JpdGVOYW1lUmVmZXJlbmNlKGJ3LCByZWZlcmVuY2UpOyAgLy9OYW1lIHJlY29yZCBhZ2FpbgotICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCkweDMwKTsgLy9SZXNlcnZlZDMKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KSg0ICsgY29udHJvbFJlZi5MaWJJZEV4dGVybmFsLkxlbmd0aCArIDQgKyAyICsgMTYgKyA0KSk7ICAgIC8vU2l6ZSBvZiBTaXplT2ZMaWJpZEV4dGVuZGVkLCBMaWJpZEV4dGVuZGVkLCBSZXNlcnZlZDQsIFJlc2VydmVkNSwgT3JpZ2luYWxUeXBlTGliLCBhbmQgQ29va2llCi0gICAgICAgICAgICBidy5Xcml0ZSgodWludCljb250cm9sUmVmLkxpYklkRXh0ZXJuYWwuTGVuZ3RoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1NpemUgICAgICAgICAgICAKLSAgICAgICAgICAgIGJ3LldyaXRlKEVuY29kaW5nLkdldEVuY29kaW5nKENvZGVQYWdlKS5HZXRCeXRlcyhjb250cm9sUmVmLkxpYklkRXh0ZXJuYWwpKTsgIC8vTGliSUQKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KTApOyAgICAgIC8vUmVzZXJ2ZWQ0Ci0gICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTApOyAgICAvL1Jlc2VydmVkNQotICAgICAgICAgICAgYncuV3JpdGUoY29udHJvbFJlZi5PcmlnaW5hbFR5cGVMaWIuVG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgICAgICBidy5Xcml0ZSgodWludCljb250cm9sUmVmLkNvb2tpZSk7ICAgICAgLy9Db29raWUKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZU9yZ2luYWxSZWZlcmVuY2UoQmluYXJ5V3JpdGVyIGJ3LCBFeGNlbFZiYVJlZmVyZW5jZSByZWZlcmVuY2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpMHgzMyk7Ci0gICAgICAgICAgICBidy5Xcml0ZSgodWludClyZWZlcmVuY2UuTGliaWQuTGVuZ3RoKTsKLSAgICAgICAgICAgIGJ3LldyaXRlKEVuY29kaW5nLkdldEVuY29kaW5nKENvZGVQYWdlKS5HZXRCeXRlcyhyZWZlcmVuY2UuTGliaWQpKTsgIC8vTGliSUQKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVQcm9qZWN0UmVmZXJlbmNlKEJpbmFyeVdyaXRlciBidywgRXhjZWxWYmFSZWZlcmVuY2UgcmVmZXJlbmNlKQotICAgICAgICB7Ci0gICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTB4MEUpOwotICAgICAgICAgICAgdmFyIHByb2pSZWYgPSAoRXhjZWxWYmFSZWZlcmVuY2VQcm9qZWN0KXJlZmVyZW5jZTsKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KSg0ICsgcHJvalJlZi5MaWJpZC5MZW5ndGggKyA0ICsgcHJvalJlZi5MaWJJZFJlbGF0aXZlLkxlbmd0aCs0KzIpKTsKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KXByb2pSZWYuTGliaWQuTGVuZ3RoKTsKLSAgICAgICAgICAgIGJ3LldyaXRlKEVuY29kaW5nLkdldEVuY29kaW5nKENvZGVQYWdlKS5HZXRCeXRlcyhwcm9qUmVmLkxpYmlkKSk7ICAvL0xpYkFic29sdXRlCi0gICAgICAgICAgICBidy5Xcml0ZSgodWludClwcm9qUmVmLkxpYklkUmVsYXRpdmUuTGVuZ3RoKTsKLSAgICAgICAgICAgIGJ3LldyaXRlKEVuY29kaW5nLkdldEVuY29kaW5nKENvZGVQYWdlKS5HZXRCeXRlcyhwcm9qUmVmLkxpYklkUmVsYXRpdmUpKTsgIC8vTGliSWRSZWxhdGl2ZQotICAgICAgICAgICAgYncuV3JpdGUocHJvalJlZi5NYWpvclZlcnNpb24pOwotICAgICAgICAgICAgYncuV3JpdGUocHJvalJlZi5NaW5vclZlcnNpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlUmVnaXN0ZXJlZFJlZmVyZW5jZShCaW5hcnlXcml0ZXIgYncsIEV4Y2VsVmJhUmVmZXJlbmNlIHJlZmVyZW5jZSkKLSAgICAgICAgewotICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCkweDBEKTsKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KSg0K3JlZmVyZW5jZS5MaWJpZC5MZW5ndGgrNCsyKSk7Ci0gICAgICAgICAgICBidy5Xcml0ZSgodWludClyZWZlcmVuY2UuTGliaWQuTGVuZ3RoKTsKLSAgICAgICAgICAgIGJ3LldyaXRlKEVuY29kaW5nLkdldEVuY29kaW5nKENvZGVQYWdlKS5HZXRCeXRlcyhyZWZlcmVuY2UuTGliaWQpKTsgIC8vTGliSUQgICAgICAgICAgICAKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KTApOyAgICAgIC8vUmVzZXJ2ZWQxCi0gICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTApOyAgICAvL1Jlc2VydmVkMgotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBieXRlW10gQ3JlYXRlUHJvamVjdHdtU3RyZWFtKCkKLSAgICAgICAgewotICAgICAgICAgICAgQmluYXJ5V3JpdGVyIGJ3ID0gbmV3IEJpbmFyeVdyaXRlcihuZXcgTWVtb3J5U3RyZWFtKCkpOwotCi0gICAgICAgICAgICBmb3JlYWNoICh2YXIgbW9kdWxlIGluIE1vZHVsZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYncuV3JpdGUoRW5jb2RpbmcuR2V0RW5jb2RpbmcoQ29kZVBhZ2UpLkdldEJ5dGVzKG1vZHVsZS5OYW1lKSk7ICAgICAvL05hbWUKLSAgICAgICAgICAgICAgICBidy5Xcml0ZSgoYnl0ZSkwKTsgLy9OdWxsCi0gICAgICAgICAgICAgICAgYncuV3JpdGUoRW5jb2RpbmcuVW5pY29kZS5HZXRCeXRlcyhtb2R1bGUuTmFtZSkpOyAgICAgICAgICAgICAgICAgICAvL05hbWUKLSAgICAgICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTApOyAvL051bGwKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ3LldyaXRlKCh1c2hvcnQpMCk7IC8vTnVsbAotICAgICAgICAgICAgcmV0dXJuIENvbXBvdW5kRG9jdW1lbnQuQ29tcHJlc3NQYXJ0KCgoTWVtb3J5U3RyZWFtKWJ3LkJhc2VTdHJlYW0pLlRvQXJyYXkoKSk7Ci0gICAgICAgIH0gICAgICAgCi0gICAgICAgIHByaXZhdGUgYnl0ZVtdIENyZWF0ZVByb2plY3RTdHJlYW0oKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiSUQ9XCJ7MH1cIlxyXG4iLCBQcm9qZWN0SUQpOwotICAgICAgICAgICAgZm9yZWFjaCh2YXIgbW9kdWxlIGluIE1vZHVsZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG1vZHVsZS5UeXBlID09IGVNb2R1bGVUeXBlLkRvY3VtZW50KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJEb2N1bWVudD17MH0vJkgwMDAwMDAwMFxyXG4iLCBtb2R1bGUuTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1vZHVsZS5UeXBlID09IGVNb2R1bGVUeXBlLk1vZHVsZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiTW9kdWxlPXswfVxyXG4iLCBtb2R1bGUuTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1vZHVsZS5UeXBlID09IGVNb2R1bGVUeXBlLkNsYXNzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJDbGFzcz17MH1cclxuIiwgbW9kdWxlLk5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvL0Rlc2lnbmVyCi0gICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiUGFja2FnZT17MH1cclxuIiwgbW9kdWxlLkNsYXNzSUQpOwotICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoIkJhc2VDbGFzcz17MH1cclxuIiwgbW9kdWxlLk5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChIZWxwRmlsZTEgIT0gIiIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJIZWxwRmlsZT17MH1cclxuIiwgSGVscEZpbGUxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiTmFtZT1cInswfVwiXHJcbiIsIE5hbWUpOwotICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJIZWxwQ29udGV4dElEPXswfVxyXG4iLCBIZWxwQ29udGV4dElEKTsKLQotICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShEZXNjcmlwdGlvbikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJEZXNjcmlwdGlvbj1cInswfVwiXHJcbiIsIERlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiVmVyc2lvbkNvbXBhdGlibGUzMj1cIjM5MzIyMjAwMFwiXHJcbiIpOwotCi0gICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoIkNNRz1cInswfVwiXHJcbiIsIFdyaXRlUHJvdGVjdGlvblN0YXQoKSk7Ci0gICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoIkRQQj1cInswfVwiXHJcbiIsIFdyaXRlUGFzc3dvcmQoKSk7Ci0gICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoIkdDPVwiezB9XCJcclxuXHJcbiIsIFdyaXRlVmlzaWJpbGl0eVN0YXRlKCkpOwotCi0gICAgICAgICAgICBzYi5BcHBlbmQoIltIb3N0IEV4dGVuZGVyIEluZm9dXHJcbiIpOwotICAgICAgICAgICAgc2IuQXBwZW5kKCImSDAwMDAwMDAxPXszODMyRDY0MC1DRjkwLTExQ0YtOEU0My0wMEEwQzkxMTAwNUF9O1ZCRTsmSDAwMDAwMDAwXHJcbiIpOwotICAgICAgICAgICAgc2IuQXBwZW5kKCJcclxuIik7Ci0gICAgICAgICAgICBzYi5BcHBlbmQoIltXb3Jrc3BhY2VdXHJcbiIpOwotICAgICAgICAgICAgZm9yZWFjaCh2YXIgbW9kdWxlIGluIE1vZHVsZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJ7MH09MCwgMCwgMCwgMCwgQyBcclxuIixtb2R1bGUuTmFtZSk7ICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0cmluZyBzID0gc2IuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgIHJldHVybiBFbmNvZGluZy5HZXRFbmNvZGluZyhDb2RlUGFnZSkuR2V0Qnl0ZXMocyk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBzdHJpbmcgV3JpdGVQcm90ZWN0aW9uU3RhdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBzdGF0PShfcHJvdGVjdGlvbi5Vc2VyUHJvdGVjdGVkID8gMTowKSB8ICAKLSAgICAgICAgICAgICAgICAgICAgIChfcHJvdGVjdGlvbi5Ib3N0UHJvdGVjdGVkID8gMjowKSB8Ci0gICAgICAgICAgICAgICAgICAgICAoX3Byb3RlY3Rpb24uVmJlUHJvdGVjdGVkID8gNDowKTsKLQotICAgICAgICAgICAgcmV0dXJuIEVuY3J5cHQoQml0Q29udmVydGVyLkdldEJ5dGVzKHN0YXQpKTsgICAgCi0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBzdHJpbmcgV3JpdGVQYXNzd29yZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVbXSBudWxsQml0cz1uZXcgYnl0ZVszXTsKLSAgICAgICAgICAgIGJ5dGVbXSBudWxsS2V5ID0gbmV3IGJ5dGVbNF07Ci0gICAgICAgICAgICBieXRlW10gbnVsbEhhc2ggPSBuZXcgYnl0ZVsyMF07Ci0gICAgICAgICAgICBpZiAoUHJvdGVjdGlvbi5QYXNzd29yZEtleSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBFbmNyeXB0KG5ldyBieXRlW10geyAwIH0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoUHJvdGVjdGlvbi5QYXNzd29yZEtleSwgbnVsbEtleSwgNCk7Ci0gICAgICAgICAgICAgICAgQXJyYXkuQ29weShQcm90ZWN0aW9uLlBhc3N3b3JkSGFzaCwgbnVsbEhhc2gsIDIwKTsKLQotICAgICAgICAgICAgICAgIC8vU2V0IE51bGwgYml0cwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjQ7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGUgYml0ID0gKGJ5dGUpKDEyOCA+PiAoaW50KSgoaSAlIDgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpIDwgNCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGxLZXlbaV0gPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsS2V5W2ldID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsQml0c1swXSB8PSBiaXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbEhhc2hbaSAtIDRdID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbEhhc2hbaSAtIDRdID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZUluZGV4ID0gKGkgLSBpICUgOCkgLyA4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxCaXRzW2J5dGVJbmRleF0gfD0gYml0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vV3JpdGUgdGhlIFBhc3N3b3JkIEhhc2ggRGF0YSBTdHJ1Y3R1cmUgKDIuNC40LjEpCi0gICAgICAgICAgICAgICAgQmluYXJ5V3JpdGVyIGJ3ID0gbmV3IEJpbmFyeVdyaXRlcihuZXcgTWVtb3J5U3RyZWFtKCkpOwotICAgICAgICAgICAgICAgIGJ3LldyaXRlKChieXRlKTB4RkYpOwotICAgICAgICAgICAgICAgIGJ3LldyaXRlKG51bGxCaXRzKTsKLSAgICAgICAgICAgICAgICBidy5Xcml0ZShudWxsS2V5KTsKLSAgICAgICAgICAgICAgICBidy5Xcml0ZShudWxsSGFzaCk7Ci0gICAgICAgICAgICAgICAgYncuV3JpdGUoKGJ5dGUpMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVuY3J5cHQoKChNZW1vcnlTdHJlYW0pYncuQmFzZVN0cmVhbSkuVG9BcnJheSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHN0cmluZyBXcml0ZVZpc2liaWxpdHlTdGF0ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBFbmNyeXB0KG5ldyBieXRlW10geyAoYnl0ZSkoUHJvdGVjdGlvbi5WaXNpYmlsaXR5U3RhdGUgPyAweEZGIDogMCkgfSk7IAotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLSAgICAgICAgcHJpdmF0ZSBzdHJpbmcgR2V0U3RyaW5nKEJpbmFyeVJlYWRlciBiciwgdWludCBzaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gR2V0U3RyaW5nKGJyLCBzaXplLCBTeXN0ZW0uVGV4dC5FbmNvZGluZy5HZXRFbmNvZGluZyhDb2RlUGFnZSkpOwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgc3RyaW5nIEdldFN0cmluZyhCaW5hcnlSZWFkZXIgYnIsIHVpbnQgc2l6ZSwgRW5jb2RpbmcgZW5jKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVUZW1wID0gbmV3IGJ5dGVbc2l6ZV07Ci0gICAgICAgICAgICAgICAgYnl0ZVRlbXAgPSBici5SZWFkQnl0ZXMoKGludClzaXplKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZW5jLkdldFN0cmluZyhieXRlVGVtcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgc3RyaW5nIEdldFVuaWNvZGVTdHJpbmcoQmluYXJ5UmVhZGVyIGJyLCB1aW50IHNpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBzID0gR2V0U3RyaW5nKGJyLCBzaXplKTsKLSAgICAgICAgICAgIGludCByZXNlcnZlZCA9IGJyLlJlYWRVSW50MTYoKTsKLSAgICAgICAgICAgIHVpbnQgc2l6ZVVDID0gYnIuUmVhZFVJbnQzMigpOwotICAgICAgICAgICAgc3RyaW5nIHNVQyA9IEdldFN0cmluZyhiciwgc2l6ZVVDLCBTeXN0ZW0uVGV4dC5FbmNvZGluZy5Vbmljb2RlKTsKLSAgICAgICAgICAgIHJldHVybiBzVUMuTGVuZ3RoID09IDAgPyBzIDogc1VDOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIENvbXBvdW5kRG9jdW1lbnQgRG9jdW1lbnQgeyBnZXQ7IHNldDsgfQotI2VuZGlmCi0gICAgICAgIGludGVybmFsIFBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCBQYXJ0IHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgaW50ZXJuYWwgVXJpIFVyaSB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KLSNpZiAhTU9OTwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDcmVhdGUgYSBuZXcgVkJBIFByb2plY3QKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgaW50ZXJuYWwgdm9pZCBDcmVhdGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihMY2lkPjApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJQYWNrYWdlIGFscmVhZHkgY29udGFpbnMgYSBWQkFQcm9qZWN0IikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUHJvamVjdElEID0gIns1REQ5MEQ3Ni00OTA0LTQ3QTItQUYwRC1ENjlCNDY3MzYwNEV9IjsKLSAgICAgICAgICAgIE5hbWUgPSAiVkJBUHJvamVjdCI7Ci0gICAgICAgICAgICBTeXN0ZW1LaW5kID0gZVN5c2tpbmQuV2luMzI7ICAgICAgICAgICAgLy9EZWZhdWx0Ci0gICAgICAgICAgICBMY2lkID0gMTAzMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9FbmdsaXNoIC0gVW5pdGVkIFN0YXRlcwotICAgICAgICAgICAgTGNpZEludm9rZSA9IDEwMzM7ICAgICAgICAgICAgICAgICAgICAgIC8vRW5nbGlzaCAtIFVuaXRlZCBTdGF0ZXMKLSAgICAgICAgICAgIENvZGVQYWdlID0gRW5jb2RpbmcuRGVmYXVsdC5Db2RlUGFnZTsKLSAgICAgICAgICAgIE1ham9yVmVyc2lvbiA9IDEzNjEwMjQ0MjE7Ci0gICAgICAgICAgICBNaW5vclZlcnNpb24gPSA2OwotICAgICAgICAgICAgSGVscENvbnRleHRJRCA9IDA7Ci0gICAgICAgICAgICBNb2R1bGVzLkFkZChuZXcgRXhjZWxWQkFNb2R1bGUoX3diLkNvZGVOYW1lQ2hhbmdlKSB7IE5hbWUgPSAiVGhpc1dvcmtib29rIiwgQ29kZSA9ICIiLCBBdHRyaWJ1dGVzPUdldERvY3VtZW50QXR0cmlidXRlcygiVGhpc1dvcmtib29rIiwgIjB7MDAwMjA4MTktMDAwMC0wMDAwLUMwMDAtMDAwMDAwMDAwMDQ2fSIpLCBUeXBlID0gZU1vZHVsZVR5cGUuRG9jdW1lbnQsIEhlbHBDb250ZXh0ID0gMCB9KTsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciBzaGVldCBpbiBfd2IuV29ya3NoZWV0cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IEdldE1vZHVsZU5hbWVGcm9tV29ya3NoZWV0KHNoZWV0KTsKLSAgICAgICAgICAgICAgICBpZiAoIU1vZHVsZXMuRXhpc3RzKG5hbWUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTW9kdWxlcy5BZGQobmV3IEV4Y2VsVkJBTW9kdWxlKHNoZWV0LkNvZGVOYW1lQ2hhbmdlKSB7IE5hbWUgPSBuYW1lLCBDb2RlID0gIiIsIEF0dHJpYnV0ZXMgPSBHZXREb2N1bWVudEF0dHJpYnV0ZXMoc2hlZXQuTmFtZSwgIjB7MDAwMjA4MjAtMDAwMC0wMDAwLUMwMDAtMDAwMDAwMDAwMDQ2fSIpLCBUeXBlID0gZU1vZHVsZVR5cGUuRG9jdW1lbnQsIEhlbHBDb250ZXh0ID0gMCB9KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfcHJvdGVjdGlvbiA9IG5ldyBFeGNlbFZiYVByb3RlY3Rpb24odGhpcykgeyBVc2VyUHJvdGVjdGVkID0gZmFsc2UsIEhvc3RQcm90ZWN0ZWQgPSBmYWxzZSwgVmJlUHJvdGVjdGVkID0gZmFsc2UsIFZpc2liaWxpdHlTdGF0ZSA9IHRydWUgfTsKLSAgICAgICAgfQotCi0gICAgICAgIGludGVybmFsIHN0cmluZyBHZXRNb2R1bGVOYW1lRnJvbVdvcmtzaGVldChFeGNlbFdvcmtzaGVldCBzaGVldCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG5hbWUgPSBzaGVldC5OYW1lOwotICAgICAgICAgICAgaWYgKG5hbWUuQW55KGMgPT4gYyA+IDI1NSkgfHwgdGhpcy5Nb2R1bGVzW25hbWVdICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGkgPSBzaGVldC5Qb3NpdGlvbklEOwotICAgICAgICAgICAgICAgIG5hbWUgPSAiU2hlZXQiICsgaS5Ub1N0cmluZygpOwotICAgICAgICAgICAgICAgIHdoaWxlICh0aGlzLk1vZHVsZXNbbmFtZV0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiU2hlZXQiICsgKCsraSkuVG9TdHJpbmcoKTsgOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBuYW1lOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIEV4Y2VsVmJhTW9kdWxlQXR0cmlidXRlc0NvbGxlY3Rpb24gR2V0RG9jdW1lbnRBdHRyaWJ1dGVzKHN0cmluZyBuYW1lLCBzdHJpbmcgY2xzaWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBhdHRyID0gbmV3IEV4Y2VsVmJhTW9kdWxlQXR0cmlidXRlc0NvbGxlY3Rpb24oKTsKLSAgICAgICAgICAgIGF0dHIuX2xpc3QuQWRkKG5ldyBFeGNlbFZiYU1vZHVsZUF0dHJpYnV0ZSgpIHsgTmFtZSA9ICJWQl9OYW1lIiwgVmFsdWUgPSBuYW1lLCBEYXRhVHlwZSA9IGVBdHRyaWJ1dGVEYXRhVHlwZS5TdHJpbmcgfSk7Ci0gICAgICAgICAgICBhdHRyLl9saXN0LkFkZChuZXcgRXhjZWxWYmFNb2R1bGVBdHRyaWJ1dGUoKSB7IE5hbWUgPSAiVkJfQmFzZSIsIFZhbHVlID0gY2xzaWQsIERhdGFUeXBlID0gZUF0dHJpYnV0ZURhdGFUeXBlLlN0cmluZyB9KTsKLSAgICAgICAgICAgIGF0dHIuX2xpc3QuQWRkKG5ldyBFeGNlbFZiYU1vZHVsZUF0dHJpYnV0ZSgpIHsgTmFtZSA9ICJWQl9HbG9iYWxOYW1lU3BhY2UiLCBWYWx1ZSA9ICJGYWxzZSIsIERhdGFUeXBlID0gZUF0dHJpYnV0ZURhdGFUeXBlLk5vblN0cmluZyB9KTsKLSAgICAgICAgICAgIGF0dHIuX2xpc3QuQWRkKG5ldyBFeGNlbFZiYU1vZHVsZUF0dHJpYnV0ZSgpIHsgTmFtZSA9ICJWQl9DcmVhdGFibGUiLCBWYWx1ZSA9ICJGYWxzZSIsIERhdGFUeXBlID0gZUF0dHJpYnV0ZURhdGFUeXBlLk5vblN0cmluZyB9KTsKLSAgICAgICAgICAgIGF0dHIuX2xpc3QuQWRkKG5ldyBFeGNlbFZiYU1vZHVsZUF0dHJpYnV0ZSgpIHsgTmFtZSA9ICJWQl9QcmVkZWNsYXJlZElkIiwgVmFsdWUgPSAiVHJ1ZSIsIERhdGFUeXBlID0gZUF0dHJpYnV0ZURhdGFUeXBlLk5vblN0cmluZyB9KTsKLSAgICAgICAgICAgIGF0dHIuX2xpc3QuQWRkKG5ldyBFeGNlbFZiYU1vZHVsZUF0dHJpYnV0ZSgpIHsgTmFtZSA9ICJWQl9FeHBvc2VkIiwgVmFsdWUgPSAiRmFsc2UiLCBEYXRhVHlwZSA9IGVBdHRyaWJ1dGVEYXRhVHlwZS5Ob25TdHJpbmcgfSk7Ci0gICAgICAgICAgICBhdHRyLl9saXN0LkFkZChuZXcgRXhjZWxWYmFNb2R1bGVBdHRyaWJ1dGUoKSB7IE5hbWUgPSAiVkJfVGVtcGxhdGVEZXJpdmVkIiwgVmFsdWUgPSAiRmFsc2UiLCBEYXRhVHlwZSA9IGVBdHRyaWJ1dGVEYXRhVHlwZS5Ob25TdHJpbmcgfSk7Ci0gICAgICAgICAgICBhdHRyLl9saXN0LkFkZChuZXcgRXhjZWxWYmFNb2R1bGVBdHRyaWJ1dGUoKSB7IE5hbWUgPSAiVkJfQ3VzdG9taXphYmxlIiwgVmFsdWUgPSAiVHJ1ZSIsIERhdGFUeXBlID0gZUF0dHJpYnV0ZURhdGFUeXBlLk5vblN0cmluZyB9KTsKLQotICAgICAgICAgICAgcmV0dXJuIGF0dHI7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8vaW50ZXJuYWwgc3RyaW5nIEdldEJsYW5rRG9jdW1lbnRNb2R1bGUoc3RyaW5nIG5hbWUsIHN0cmluZyBjbHNpZCkKLSAgICAgICAgLy97Ci0gICAgICAgIC8vICAgIHN0cmluZyByZXQ9c3RyaW5nLkZvcm1hdCgiQXR0cmlidXRlIFZCX05hbWUgPSBcInswfVwiXHJcbiIsbmFtZSk7Ci0gICAgICAgIC8vICAgIHJldCArPSBzdHJpbmcuRm9ybWF0KCJBdHRyaWJ1dGUgVkJfQmFzZSA9IFwiezB9XCJcclxuIiwgY2xzaWQpOyAgLy9NaWNyb3NvZnQuT2ZmaWNlLkludGVyb3AuRXhjZWwuV29ya3NoZWV0Q2xhc3MKLSAgICAgICAgLy8gICAgcmV0ICs9ICJBdHRyaWJ1dGUgVkJfR2xvYmFsTmFtZVNwYWNlID0gRmFsc2VcclxuIjsKLSAgICAgICAgLy8gICAgcmV0ICs9ICJBdHRyaWJ1dGUgVkJfQ3JlYXRhYmxlID0gRmFsc2VcclxuIjsKLSAgICAgICAgLy8gICAgcmV0ICs9ICJBdHRyaWJ1dGUgVkJfUHJlZGVjbGFyZWRJZCA9IFRydWVcclxuIjsKLSAgICAgICAgLy8gICAgcmV0ICs9ICJBdHRyaWJ1dGUgVkJfRXhwb3NlZCA9IFRydWVcclxuIjsKLSAgICAgICAgLy8gICAgcmV0ICs9ICJBdHRyaWJ1dGUgVkJfVGVtcGxhdGVEZXJpdmVkID0gRmFsc2VcclxuIjsKLSAgICAgICAgLy8gICAgcmV0ICs9ICJBdHRyaWJ1dGUgVkJfQ3VzdG9taXphYmxlID0gVHJ1ZSI7Ci0gICAgICAgIC8vICAgIHJldHVybiByZXQ7Ci0gICAgICAgIC8vfQotICAgICAgICAvL2ludGVybmFsIHN0cmluZyBHZXRCbGFua01vZHVsZShzdHJpbmcgbmFtZSkKLSAgICAgICAgLy97Ci0gICAgICAgIC8vICAgIHJldHVybiBzdHJpbmcuRm9ybWF0KCJBdHRyaWJ1dGUgVkJfTmFtZSA9IFwiezB9XCJcclxuIiwgbmFtZSk7Ci0gICAgICAgIC8vfQotICAgICAgICAvL2ludGVybmFsIHN0cmluZyBHZXRCbGFua0NsYXNzTW9kdWxlKHN0cmluZyBuYW1lLCBib29sIGV4cG9zZWQpCi0gICAgICAgIC8vewotICAgICAgICAvLyAgICBzdHJpbmcgcmV0PXN0cmluZy5Gb3JtYXQoIkF0dHJpYnV0ZSBWQl9OYW1lID0gXCJ7MH1cIlxyXG4iLG5hbWUpOwotICAgICAgICAvLyAgICByZXQgKz0gc3RyaW5nLkZvcm1hdCgiQXR0cmlidXRlIFZCX0Jhc2UgPSBcInswfVwiXHJcbiIsICIwe0ZDRkIzRDJBLUEwRkEtMTA2OC1BNzM4LTA4MDAyQjMzNzFCNX0iKTsgIAotICAgICAgICAvLyAgICByZXQgKz0gIkF0dHJpYnV0ZSBWQl9HbG9iYWxOYW1lU3BhY2UgPSBGYWxzZVxyXG4iOwotICAgICAgICAvLyAgICByZXQgKz0gIkF0dHJpYnV0ZSBWQl9DcmVhdGFibGUgPSBGYWxzZVxyXG4iOwotICAgICAgICAvLyAgICByZXQgKz0gIkF0dHJpYnV0ZSBWQl9QcmVkZWNsYXJlZElkID0gRmFsc2VcclxuIjsKLSAgICAgICAgLy8gICAgcmV0ICs9IHN0cmluZy5Gb3JtYXQoIkF0dHJpYnV0ZSBWQl9FeHBvc2VkID0gezB9XHJcbiIsIGV4cG9zZWQgPyAiVHJ1ZSIgOiAiRmFsc2UiKTsKLSAgICAgICAgLy8gICAgcmV0ICs9ICJBdHRyaWJ1dGUgVkJfVGVtcGxhdGVEZXJpdmVkID0gRmFsc2VcclxuIjsKLSAgICAgICAgLy8gICAgcmV0ICs9ICJBdHRyaWJ1dGUgVkJfQ3VzdG9taXphYmxlID0gRmFsc2VcclxuIjsKLSAgICAgICAgLy8gICAgcmV0dXJuIHJldDsKLSAgICAgICAgLy99Ci0jZW5kaWYKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmVtb3ZlIHRoZSBwcm9qZWN0IGZyb20gdGhlIHBhY2thZ2UKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHZvaWQgUmVtb3ZlKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKFBhcnQgPT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgICAgICBmb3JlYWNoICh2YXIgcmVsIGluIFBhcnQuR2V0UmVsYXRpb25zaGlwcygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9wY2suRGVsZXRlUmVsYXRpb25zaGlwKHJlbC5JZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoX3Bjay5QYXJ0RXhpc3RzKFVyaSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3Bjay5EZWxldGVQYXJ0KFVyaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQYXJ0ID0gbnVsbDsKLSAgICAgICAgICAgIE1vZHVsZXMuQ2xlYXIoKTsKLSAgICAgICAgICAgIFJlZmVyZW5jZXMuQ2xlYXIoKTsKLSAgICAgICAgICAgIExjaWQgPSAwOwotICAgICAgICAgICAgTGNpZEludm9rZSA9IDA7Ci0gICAgICAgICAgICBDb2RlUGFnZSA9IDA7Ci0gICAgICAgICAgICBNYWpvclZlcnNpb24gPSAwOwotICAgICAgICAgICAgTWlub3JWZXJzaW9uID0gMDsKLSAgICAgICAgICAgIEhlbHBDb250ZXh0SUQgPSAwOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTmFtZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1cy9WQkEvRXhjZWxWQkFSZWZlcmVuY2UuY3MgYi9FUFBsdXMvVkJBL0V4Y2VsVkJBUmVmZXJlbmNlLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmUxZGQ5Li4wMDAwMDAwCi0tLSBhL0VQUGx1cy9WQkEvRXhjZWxWQkFSZWZlcmVuY2UuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCi0gKgotICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KLSAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKLSAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAotICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAotICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KLSAqCi0gKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAotICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkyNi1NQVItMjAxMgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci0KLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlZCQQotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQSBWQkEgcmVmZXJlbmNlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxWYmFSZWZlcmVuY2UKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbnN0cnVjdG9yLgotICAgICAgICAvLy8gRGVmYXVsdHMgUmVmZXJlbmNlUmVjb3JkSUQgdG8gMHhECi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFZiYVJlZmVyZW5jZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJlZmVyZW5jZVJlY29yZElEID0gMHhEOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSByZWZlcmVuY2UgcmVjb3JkIElELiBTZWUgTVMtT1ZCQSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm8uIAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50IFJlZmVyZW5jZVJlY29yZElEIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIG5hbWUgb2YgdGhlIHJlZmVyZW5jZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgeyBnZXQ7IHNldDsgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBMaWJJRAotICAgICAgICAvLy8gRm9yIG1vcmUgaW5mbyBjaGVjayBNUy1PVkJBIDIuMS4xLjggTGliaWRSZWZlcmVuY2UgYW5kIDIuMy40LjIuMiBQUk9KRUNUUkVGRVJFTkNFUwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIExpYmlkIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdCAodGhlIE5hbWUpCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTmFtZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEEgcmVmZXJlbmNlIHRvIGEgdHdpZGRsZWQgdHlwZSBsaWJyYXJ5Ci0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxWYmFSZWZlcmVuY2VDb250cm9sIDogRXhjZWxWYmFSZWZlcmVuY2UKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbnN0cnVjdG9yLgotICAgICAgICAvLy8gU2V0cyBSZWZlcmVuY2VSZWNvcmRJRCB0byAweDJGCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFZiYVJlZmVyZW5jZUNvbnRyb2woKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZWZlcmVuY2VSZWNvcmRJRCA9IDB4MkY7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTGliSWRFeHRlcm5hbCAKLSAgICAgICAgLy8vIEZvciBtb3JlIGluZm8gY2hlY2sgTVMtT1ZCQSAyLjEuMS44IExpYmlkUmVmZXJlbmNlIGFuZCAyLjMuNC4yLjIgUFJPSkVDVFJFRkVSRU5DRVMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBMaWJJZEV4dGVybmFsIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTGliSWRUd2lkZGxlZAotICAgICAgICAvLy8gRm9yIG1vcmUgaW5mbyBjaGVjayBNUy1PVkJBIDIuMS4xLjggTGliaWRSZWZlcmVuY2UgYW5kIDIuMy40LjIuMiBQUk9KRUNUUkVGRVJFTkNFUwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIExpYklkVHdpZGRsZWQgeyBnZXQ7IHNldDsgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBIEdVSUQgdGhhdCBzcGVjaWZpZXMgdGhlIEF1dG9tYXRpb24gdHlwZSBsaWJyYXJ5IHRoZSBleHRlbmRlZCB0eXBlIGxpYnJhcnkgd2FzIGdlbmVyYXRlZCBmcm9tLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgR3VpZCBPcmlnaW5hbFR5cGVMaWIgeyBnZXQ7IHNldDsgfQotICAgICAgICBpbnRlcm5hbCB1aW50IENvb2tpZSB7IGdldDsgc2V0OyB9Ci0gICAgfQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQSByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgVkJBIHByb2plY3QKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbFZiYVJlZmVyZW5jZVByb2plY3QgOiBFeGNlbFZiYVJlZmVyZW5jZQotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29uc3RydWN0b3IuCi0gICAgICAgIC8vLyBTZXRzIFJlZmVyZW5jZVJlY29yZElEIHRvIDB4MEUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsVmJhUmVmZXJlbmNlUHJvamVjdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJlZmVyZW5jZVJlY29yZElEID0gMHgwRTsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBMaWJJZFJlbGF0aXZlCi0gICAgICAgIC8vLyBGb3IgbW9yZSBpbmZvIGNoZWNrIE1TLU9WQkEgMi4xLjEuOCBMaWJpZFJlZmVyZW5jZSBhbmQgMi4zLjQuMi4yIFBST0pFQ1RSRUZFUkVOQ0VTCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgTGliSWRSZWxhdGl2ZSB7IGdldDsgc2V0OyB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE1ham9yIHZlcnNpb24gb2YgdGhlIHJlZmVyZW5jZWQgVkJBIHByb2plY3QKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHVpbnQgTWFqb3JWZXJzaW9uIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTWlub3IgdmVyc2lvbiBvZiB0aGUgcmVmZXJlbmNlZCBWQkEgcHJvamVjdAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgdXNob3J0IE1pbm9yVmVyc2lvbiB7IGdldDsgc2V0OyB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1ZCQS9FeGNlbFZCQVNpZ25hdHVyZS5jcyBiL0VQUGx1cy9WQkEvRXhjZWxWQkFTaWduYXR1cmUuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZTI4OGQuLjAwMDAwMDAKLS0tIGEvRVBQbHVzL1ZCQS9FeGNlbFZCQVNpZ25hdHVyZS5jcworKysgL2Rldi9udWxsCkBAIC0xLDM4NCArMCwwIEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKLSAqCi0gKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgotICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAotICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCi0gKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCi0gKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgotICoKLSAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCi0gKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTI2LU1BUi0yMDEyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKLXVzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuUGtjczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7Ci11c2luZyBTeXN0ZW0uSU87Ci0KLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlZCQQotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVGhlIGNvZGUgc2lnbmF0dXJlIHByb3BlcnRpZXMgb2YgdGhlIHByb2plY3QKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbFZiYVNpZ25hdHVyZQotICAgIHsKLSAgICAgICAgY29uc3Qgc3RyaW5nIHNjaGVtYVJlbFZiYVNpZ25hdHVyZSA9ICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA2L3JlbGF0aW9uc2hpcHMvdmJhUHJvamVjdFNpZ25hdHVyZSI7Ci0gICAgICAgIFBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCBfdmJhUGFydCA9IG51bGw7Ci0gICAgICAgIGludGVybmFsIEV4Y2VsVmJhU2lnbmF0dXJlKFBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCB2YmFQYXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgICBfdmJhUGFydCA9IHZiYVBhcnQ7Ci0gICAgICAgICAgICBHZXRTaWduYXR1cmUoKTsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHZvaWQgR2V0U2lnbmF0dXJlKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF92YmFQYXJ0ID09IG51bGwpIHJldHVybjsKLSAgICAgICAgICAgIHZhciByZWwgPSBfdmJhUGFydC5HZXRSZWxhdGlvbnNoaXBzQnlUeXBlKHNjaGVtYVJlbFZiYVNpZ25hdHVyZSkuRmlyc3RPckRlZmF1bHQoKTsKLSAgICAgICAgICAgIGlmIChyZWwgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBVcmkgPSBVcmlIZWxwZXIuUmVzb2x2ZVBhcnRVcmkocmVsLlNvdXJjZVVyaSwgcmVsLlRhcmdldFVyaSk7Ci0gICAgICAgICAgICAgICAgUGFydCA9IF92YmFQYXJ0LlBhY2thZ2UuR2V0UGFydChVcmkpOwotCi0gICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFBhcnQuR2V0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgQmluYXJ5UmVhZGVyIGJyID0gbmV3IEJpbmFyeVJlYWRlcihzdHJlYW0pOwotICAgICAgICAgICAgICAgIHVpbnQgY2JTaWduYXR1cmUgPSBici5SZWFkVUludDMyKCk7ICAgICAgICAKLSAgICAgICAgICAgICAgICB1aW50IHNpZ25hdHVyZU9mZnNldCA9IGJyLlJlYWRVSW50MzIoKTsgICAgIC8vNDQgPz8KLSAgICAgICAgICAgICAgICB1aW50IGNiU2lnbmluZ0NlcnRTdG9yZSA9IGJyLlJlYWRVSW50MzIoKTsgIAotICAgICAgICAgICAgICAgIHVpbnQgY2VydFN0b3JlT2Zmc2V0ID0gYnIuUmVhZFVJbnQzMigpOyAgICAgCi0gICAgICAgICAgICAgICAgdWludCBjYlByb2plY3ROYW1lID0gYnIuUmVhZFVJbnQzMigpOyAgICAgICAKLSAgICAgICAgICAgICAgICB1aW50IHByb2plY3ROYW1lT2Zmc2V0ID0gYnIuUmVhZFVJbnQzMigpOyAgIAotICAgICAgICAgICAgICAgIHVpbnQgZlRpbWVzdGFtcCA9IGJyLlJlYWRVSW50MzIoKTsKLSAgICAgICAgICAgICAgICB1aW50IGNiVGltZXN0YW1wVXJsID0gYnIuUmVhZFVJbnQzMigpOwotICAgICAgICAgICAgICAgIHVpbnQgdGltZXN0YW1wVXJsT2Zmc2V0ID0gYnIuUmVhZFVJbnQzMigpOyAgCi0gICAgICAgICAgICAgICAgYnl0ZVtdIHNpZ25hdHVyZSA9IGJyLlJlYWRCeXRlcygoaW50KWNiU2lnbmF0dXJlKTsKLSAgICAgICAgICAgICAgICB1aW50IHZlcnNpb24gPSBici5SZWFkVUludDMyKCk7Ci0gICAgICAgICAgICAgICAgdWludCBmaWxlVHlwZSA9IGJyLlJlYWRVSW50MzIoKTsKLQotICAgICAgICAgICAgICAgIHVpbnQgaWQgPSBici5SZWFkVUludDMyKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGlkICE9IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB1aW50IGVuY29kaW5nVHlwZSA9IGJyLlJlYWRVSW50MzIoKTsKLSAgICAgICAgICAgICAgICAgICAgdWludCBsZW5ndGggPSBici5SZWFkVUludDMyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPiAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gdmFsdWUgPSBici5SZWFkQnl0ZXMoKGludClsZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0FkZCBwcm9wZXJ0eSB2YWx1ZXMgaGVyZS4uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgyMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgPSBuZXcgWDUwOUNlcnRpZmljYXRlMih2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlkID0gYnIuUmVhZFVJbnQzMigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1aW50IGVuZGVsMSA9IGJyLlJlYWRVSW50MzIoKTsgIC8vMAotICAgICAgICAgICAgICAgIHVpbnQgZW5kZWwyID0gYnIuUmVhZFVJbnQzMigpOyAgLy8wCi0gICAgICAgICAgICAgICAgdXNob3J0IHJnY2hQcm9qZWN0TmFtZUJ1ZmZlciA9IGJyLlJlYWRVSW50MTYoKTsKLSAgICAgICAgICAgICAgICB1c2hvcnQgcmdjaFRpbWVzdGFtcEJ1ZmZlciA9IGJyLlJlYWRVSW50MTYoKTsKLSAgICAgICAgICAgICAgICBWZXJpZmllciA9IG5ldyBTaWduZWRDbXMoKTsKLSAgICAgICAgICAgICAgICBWZXJpZmllci5EZWNvZGUoc2lnbmF0dXJlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgVmVyaWZpZXIgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vQ3JlYXRlIE9pZCBmcm9tIGEgYnl0ZWFycmF5Ci0gICAgICAgIC8vcHJpdmF0ZSBzdHJpbmcgUmVhZEhhc2goYnl0ZVtdIGNvbnRlbnQpCi0gICAgICAgIC8vewotICAgICAgICAvLyAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAvLyAgICBpbnQgb2Zmc2V0ID0gMHg2OwotICAgICAgICAvLyAgICBpZiAoMCA8IChjb250ZW50Lkxlbmd0aCkpCi0gICAgICAgIC8vICAgIHsKLSAgICAgICAgLy8gICAgICAgIGJ5dGUgbnVtID0gY29udGVudFtvZmZzZXRdOwotICAgICAgICAvLyAgICAgICAgYnl0ZSBudW0yID0gKGJ5dGUpKG51bSAvIDQwKTsKLSAgICAgICAgLy8gICAgICAgIGJ1aWxkZXIuQXBwZW5kKG51bTIuVG9TdHJpbmcobnVsbCwgbnVsbCkpOwotICAgICAgICAvLyAgICAgICAgYnVpbGRlci5BcHBlbmQoIi4iKTsKLSAgICAgICAgLy8gICAgICAgIG51bTIgPSAoYnl0ZSkobnVtICUgNDApOwotICAgICAgICAvLyAgICAgICAgYnVpbGRlci5BcHBlbmQobnVtMi5Ub1N0cmluZyhudWxsLCBudWxsKSk7Ci0gICAgICAgIC8vICAgICAgICB1bG9uZyBudW0zID0gMEw7Ci0gICAgICAgIC8vICAgICAgICBmb3IgKGludCBpID0gb2Zmc2V0ICsgMTsgaSA8IGNvbnRlbnQuTGVuZ3RoOyBpKyspCi0gICAgICAgIC8vICAgICAgICB7Ci0gICAgICAgIC8vICAgICAgICAgICAgbnVtMiA9IGNvbnRlbnRbaV07Ci0gICAgICAgIC8vICAgICAgICAgICAgbnVtMyA9ICh1bG9uZykodWxvbmcpKG51bTMgPDwgNykgKyAoKGJ5dGUpKG51bTIgJiAweDdmKSk7Ci0gICAgICAgIC8vICAgICAgICAgICAgaWYgKChudW0yICYgMHg4MCkgPT0gMCkKLSAgICAgICAgLy8gICAgICAgICAgICB7Ci0gICAgICAgIC8vICAgICAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kKCIuIik7Ci0gICAgICAgIC8vICAgICAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kKG51bTMuVG9TdHJpbmcobnVsbCwgbnVsbCkpOwotICAgICAgICAvLyAgICAgICAgICAgICAgICBudW0zID0gMEw7Ci0gICAgICAgIC8vICAgICAgICAgICAgfQotICAgICAgICAvLyAgICAgICAgICAgIC8vMS4yLjg0MC4xMTM1NDkuMi41Ci0gICAgICAgIC8vICAgICAgICB9Ci0gICAgICAgIC8vICAgIH0KLQotCi0gICAgICAgIC8vICAgIHN0cmluZyBvSWQgPSBidWlsZGVyLlRvU3RyaW5nKCk7Ci0KLSAgICAgICAgLy8gICAgcmV0dXJuIG9JZDsKLSAgICAgICAgLy99Ci0gICAgICAgIGludGVybmFsIHZvaWQgU2F2ZShFeGNlbFZiYVByb2plY3QgcHJvaikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKENlcnRpZmljYXRlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoQ2VydGlmaWNhdGUuSGFzUHJpdmF0ZUtleT09ZmFsc2UpICAgIC8vTm8gc2lnbmF0dXJlLiBSZW1vdmUgYW55IFNpZ25hdHVyZSBwYXJ0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHN0b3JlQ2VydCA9IEdldENlcnRGcm9tU3RvcmUoU3RvcmVMb2NhdGlvbi5DdXJyZW50VXNlcik7Ci0gICAgICAgICAgICAgICAgaWYgKHN0b3JlQ2VydCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RvcmVDZXJ0ID0gR2V0Q2VydEZyb21TdG9yZShTdG9yZUxvY2F0aW9uLkxvY2FsTWFjaGluZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzdG9yZUNlcnQgIT0gbnVsbCAmJiBzdG9yZUNlcnQuSGFzUHJpdmF0ZUtleSA9PSB0cnVlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgPSBzdG9yZUNlcnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciByIGluIFBhcnQuR2V0UmVsYXRpb25zaGlwcygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJ0LkRlbGV0ZVJlbGF0aW9uc2hpcChyLklkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBQYXJ0LlBhY2thZ2UuRGVsZXRlUGFydChQYXJ0LlVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCk7Ci0gICAgICAgICAgICB2YXIgYncgPSBuZXcgQmluYXJ5V3JpdGVyKG1zKTsKLQotICAgICAgICAgICAgYnl0ZVtdIGNlcnRTdG9yZSA9IEdldENlcnRTdG9yZSgpOwotCi0gICAgICAgICAgICBieXRlW10gY2VydCA9IFNpZ25Qcm9qZWN0KHByb2opOwotICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpY2VydC5MZW5ndGgpOwotICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpNDQpOyAgICAgICAgICAgICAgICAgIC8vPz8gMzYgcmVmIGluc2lkZSBjZXJ0ID8/Ci0gICAgICAgICAgICBidy5Xcml0ZSgodWludCljZXJ0U3RvcmUuTGVuZ3RoKTsgICAgLy9jYlNpZ25pbmdDZXJ0U3RvcmUKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KShjZXJ0Lkxlbmd0aCArIDQ0KSk7ICAvL2NlcnRTdG9yZU9mZnNldAotICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpMCk7ICAgICAgICAgICAgICAgICAgIC8vY2JQcm9qZWN0TmFtZQotICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpKGNlcnQuTGVuZ3RoICsgY2VydFN0b3JlLkxlbmd0aCArIDQ0KSk7ICAgIC8vcHJvamVjdE5hbWVPZmZzZXQKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KTApOyAgICAvL2ZUaW1lc3RhbXAKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KTApOyAgICAvL2NiVGltZXN0YW1wVXJsCi0gICAgICAgICAgICBidy5Xcml0ZSgodWludCkoY2VydC5MZW5ndGggKyBjZXJ0U3RvcmUuTGVuZ3RoICsgNDQgKyAyKSk7ICAgIC8vdGltZXN0YW1wVXJsT2Zmc2V0Ci0gICAgICAgICAgICBidy5Xcml0ZShjZXJ0KTsKLSAgICAgICAgICAgIGJ3LldyaXRlKGNlcnRTdG9yZSk7Ci0gICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTApOy8vcmdjaFByb2plY3ROYW1lQnVmZmVyCi0gICAgICAgICAgICBidy5Xcml0ZSgodXNob3J0KTApOy8vcmdjaFRpbWVzdGFtcEJ1ZmZlcgotICAgICAgICAgICAgYncuV3JpdGUoKHVzaG9ydCkwKTsKLSAgICAgICAgICAgIGJ3LkZsdXNoKCk7Ci0KLSAgICAgICAgICAgIHZhciByZWwgPSBwcm9qLlBhcnQuR2V0UmVsYXRpb25zaGlwc0J5VHlwZShzY2hlbWFSZWxWYmFTaWduYXR1cmUpLkZpcnN0T3JEZWZhdWx0KCk7Ci0gICAgICAgICAgICBpZiAoUGFydCA9PSBudWxsKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgaWYgKHJlbCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgVXJpID0gcmVsLlRhcmdldFVyaTsKLSAgICAgICAgICAgICAgICAgICAgUGFydCA9IHByb2ouX3Bjay5HZXRQYXJ0KHJlbC5UYXJnZXRVcmkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBVcmkgPSBuZXcgVXJpKCIveGwvdmJhUHJvamVjdFNpZ25hdHVyZS5iaW4iLCBVcmlLaW5kLlJlbGF0aXZlKTsKLSAgICAgICAgICAgICAgICAgICAgUGFydCA9IHByb2ouX3Bjay5DcmVhdGVQYXJ0KFVyaSwgRXhjZWxQYWNrYWdlLnNjaGVtYVZCQVNpZ25hdHVyZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlbCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByb2ouUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoVXJpSGVscGVyLlJlc29sdmVQYXJ0VXJpKHByb2ouVXJpLCBVcmkpLCBQYWNrYWdpbmcuVGFyZ2V0TW9kZS5JbnRlcm5hbCwgc2NoZW1hUmVsVmJhU2lnbmF0dXJlKTsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgYiA9IG1zLlRvQXJyYXkoKTsKLSAgICAgICAgICAgIFBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSkuV3JpdGUoYiwgMCwgYi5MZW5ndGgpOyAgICAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBYNTA5Q2VydGlmaWNhdGUyIEdldENlcnRGcm9tU3RvcmUoU3RvcmVMb2NhdGlvbiBsb2MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFg1MDlTdG9yZSBzdG9yZSA9IG5ldyBYNTA5U3RvcmUobG9jKTsKLSAgICAgICAgICAgICAgICBzdG9yZS5PcGVuKE9wZW5GbGFncy5SZWFkT25seSk7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgc3RvcmVDZXJ0ID0gc3RvcmUuQ2VydGlmaWNhdGVzLkZpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYNTA5RmluZFR5cGUuRmluZEJ5VGh1bWJwcmludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlcnRpZmljYXRlLlRodW1icHJpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLk9mVHlwZTxYNTA5Q2VydGlmaWNhdGUyPigpLkZpcnN0T3JEZWZhdWx0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZUNlcnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0b3JlLkNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2gKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYnl0ZVtdIEdldENlcnRTdG9yZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKLSAgICAgICAgICAgIHZhciBidyA9IG5ldyBCaW5hcnlXcml0ZXIobXMpOwotCi0gICAgICAgICAgICBidy5Xcml0ZSgodWludCkwKTsgLy9WZXJzaW9uCi0gICAgICAgICAgICBidy5Xcml0ZSgodWludCkweDU0NTI0NTQzKTsgLy9maWxlVHlwZQotCi0gICAgICAgICAgICAvL1NlcmlhbGl6ZWRDZXJ0aWZpY2F0ZUVudHJ5Ci0gICAgICAgICAgICB2YXIgY2VydERhdGEgPSBDZXJ0aWZpY2F0ZS5SYXdEYXRhOwotICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpMHgyMCk7Ci0gICAgICAgICAgICBidy5Xcml0ZSgodWludCkxKTsKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1aW50KWNlcnREYXRhLkxlbmd0aCk7Ci0gICAgICAgICAgICBidy5Xcml0ZShjZXJ0RGF0YSk7Ci0KLSAgICAgICAgICAgIC8vRW5kRWxlbWVudE1hcmtlckVudHJ5Ci0gICAgICAgICAgICBidy5Xcml0ZSgodWludCkwKTsKLSAgICAgICAgICAgIGJ3LldyaXRlKCh1bG9uZykwKTsKLQotICAgICAgICAgICAgYncuRmx1c2goKTsKLSAgICAgICAgICAgIHJldHVybiBtcy5Ub0FycmF5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVQcm9wKEJpbmFyeVdyaXRlciBidywgaW50IGlkLCBieXRlW10gZGF0YSkKLSAgICAgICAgewotICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpaWQpOwotICAgICAgICAgICAgYncuV3JpdGUoKHVpbnQpMSk7Ci0gICAgICAgICAgICBidy5Xcml0ZSgodWludClkYXRhLkxlbmd0aCk7Ci0gICAgICAgICAgICBidy5Xcml0ZShkYXRhKTsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBieXRlW10gU2lnblByb2plY3QoRXhjZWxWYmFQcm9qZWN0IHByb2opCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghQ2VydGlmaWNhdGUuSGFzUHJpdmF0ZUtleSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3Rocm93IChuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIGNlcnRpZmljYXRlIGRvZXNuJ3QgaGF2ZSBhIHByaXZhdGUga2V5IikpOwotICAgICAgICAgICAgICAgIENlcnRpZmljYXRlID0gbnVsbDsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciBoYXNoID0gR2V0Q29udGVudEhhc2gocHJvaik7Ci0KLSAgICAgICAgICAgIEJpbmFyeVdyaXRlciBidyA9IG5ldyBCaW5hcnlXcml0ZXIobmV3IE1lbW9yeVN0cmVhbSgpKTsKLSAgICAgICAgICAgIGJ3LldyaXRlKChieXRlKTB4MzApOyAvL0NvbnN0cnVjdGVkIFR5cGUgCi0gICAgICAgICAgICBidy5Xcml0ZSgoYnl0ZSkweDMyKTsgLy9Ub3RhbCBsZW5ndGgKLSAgICAgICAgICAgIGJ3LldyaXRlKChieXRlKTB4MzApOyAvL0NvbnN0cnVjdGVkIFR5cGUgCi0gICAgICAgICAgICBidy5Xcml0ZSgoYnl0ZSkweDBFKTsgLy9MZW5ndGggU3BjSW5kaXJlY3REYXRhQ29udGVudAotICAgICAgICAgICAgYncuV3JpdGUoKGJ5dGUpMHgwNik7IC8vT2lkIFRhZyBJbmRlbnRpZmllciAKLSAgICAgICAgICAgIGJ3LldyaXRlKChieXRlKTB4MEEpOyAvL0xlbmdodCBPSWQKLSAgICAgICAgICAgIGJ3LldyaXRlKG5ldyBieXRlW10geyAweDJCLCAweDA2LCAweDAxLCAweDA0LCAweDAxLCAweDgyLCAweDM3LCAweDAyLCAweDAxLCAweDFEIH0pOyAvL0VuY29kZWQgT2lkIDEuMy42LjEuNC4xLjMxMS4yLjEuMjkKLSAgICAgICAgICAgIGJ3LldyaXRlKChieXRlKTB4MDQpOyAgIC8vT2N0ZXQgU3RyaW5nIFRhZyBJZGVudGlmaWVyCi0gICAgICAgICAgICBidy5Xcml0ZSgoYnl0ZSkweDAwKTsgICAvL1plcm8gbGVuZ3RoCi0KLSAgICAgICAgICAgIGJ3LldyaXRlKChieXRlKTB4MzApOyAvL0NvbnN0cnVjdGVkIFR5cGUgKERpZ2VzdEluZm8pCi0gICAgICAgICAgICBidy5Xcml0ZSgoYnl0ZSkweDIwKTsgLy9MZW5ndGggRGlnZXN0SW5mbwotICAgICAgICAgICAgYncuV3JpdGUoKGJ5dGUpMHgzMCk7IC8vQ29uc3RydWN0ZWQgVHlwZSAoQWxnb3JpdGhtKQotICAgICAgICAgICAgYncuV3JpdGUoKGJ5dGUpMHgwQyk7IC8vbGVuZ3RoIEFsZ29yaXRobUlkZW50aWZpZXIKLSAgICAgICAgICAgIGJ3LldyaXRlKChieXRlKTB4MDYpOyAvL09pZCBUYWcgSW5kZW50aWZpZXIgCi0gICAgICAgICAgICBidy5Xcml0ZSgoYnl0ZSkweDA4KTsgLy9MZW5naHQgT0lkCi0gICAgICAgICAgICBidy5Xcml0ZShuZXcgYnl0ZVtdIHsgMHgyQSwgMHg4NiwgMHg0OCwgMHg4NiwgMHhGNywgMHgwRCwgMHgwMiwgMHgwNSB9KTsgLy9FbmNvZGVkIE9pZCBmb3IgMS4yLjg0MC4xMTM1NDkuMi41IChBbGdvcml0aG1JZGVudGlmaWVyIE1ENSkKLSAgICAgICAgICAgIGJ3LldyaXRlKChieXRlKTB4MDUpOyAgIC8vTnVsbCB0eXBlIGlkZW50aWZpZXIKLSAgICAgICAgICAgIGJ3LldyaXRlKChieXRlKTB4MDApOyAgIC8vTnVsbCBsZW5ndGgKLSAgICAgICAgICAgIGJ3LldyaXRlKChieXRlKTB4MDQpOyAgIC8vT2N0ZXQgU3RyaW5nIElkZW50aWZpZXIKLSAgICAgICAgICAgIGJ3LldyaXRlKChieXRlKWhhc2guTGVuZ3RoKTsgICAvL0hhc2ggbGVuZ3RoCi0gICAgICAgICAgICBidy5Xcml0ZShoYXNoKTsgICAgICAgICAgICAgICAgLy9Db250ZW50IGhhc2gKLQotICAgICAgICAgICAgQ29udGVudEluZm8gY29udGVudEluZm8gPSBuZXcgQ29udGVudEluZm8oKChNZW1vcnlTdHJlYW0pYncuQmFzZVN0cmVhbSkuVG9BcnJheSgpKTsKLSAgICAgICAgICAgIGNvbnRlbnRJbmZvLkNvbnRlbnRUeXBlLlZhbHVlID0gIjEuMy42LjEuNC4xLjMxMS4yLjEuNCI7Ci0gICAgICAgICAgICBWZXJpZmllciA9IG5ldyBTaWduZWRDbXMoY29udGVudEluZm8pOwotICAgICAgICAgICAgdmFyIHNpZ25lciA9IG5ldyBDbXNTaWduZXIoQ2VydGlmaWNhdGUpOwotICAgICAgICAgICAgVmVyaWZpZXIuQ29tcHV0ZVNpZ25hdHVyZShzaWduZXIsIGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybiBWZXJpZmllci5FbmNvZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYnl0ZVtdIEdldENvbnRlbnRIYXNoKEV4Y2VsVmJhUHJvamVjdCBwcm9qKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL01TLU9WQkEgMi40LjIKLSAgICAgICAgICAgIHZhciBlbmMgPSBTeXN0ZW0uVGV4dC5FbmNvZGluZy5HZXRFbmNvZGluZyhwcm9qLkNvZGVQYWdlKTsKLSAgICAgICAgICAgIEJpbmFyeVdyaXRlciBidyA9IG5ldyBCaW5hcnlXcml0ZXIobmV3IE1lbW9yeVN0cmVhbSgpKTsKLSAgICAgICAgICAgIGJ3LldyaXRlKGVuYy5HZXRCeXRlcyhwcm9qLk5hbWUpKTsKLSAgICAgICAgICAgIGJ3LldyaXRlKGVuYy5HZXRCeXRlcyhwcm9qLkNvbnN0YW50cykpOwotICAgICAgICAgICAgZm9yZWFjaCAodmFyIHJlZmVyZW5jZSBpbiBwcm9qLlJlZmVyZW5jZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlZmVyZW5jZS5SZWZlcmVuY2VSZWNvcmRJRCA9PSAweDBEKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYncuV3JpdGUoKGJ5dGUpMHg3Qik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2UuUmVmZXJlbmNlUmVjb3JkSUQgPT0gMHgwRSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vdmFyIHIgPSAoRXhjZWxWYmFSZWZlcmVuY2VQcm9qZWN0KXJlZmVyZW5jZTsKLSAgICAgICAgICAgICAgICAgICAgLy9CaW5hcnlXcml0ZXIgYndUZW1wID0gbmV3IEJpbmFyeVdyaXRlcihuZXcgTWVtb3J5U3RyZWFtKCkpOwotICAgICAgICAgICAgICAgICAgICAvL2J3VGVtcC5Xcml0ZSgodWludClyLkxpYmlkLkxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vYndUZW1wLldyaXRlKGVuYy5HZXRCeXRlcyhyLkxpYmlkKSk7ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy9id1RlbXAuV3JpdGUoKHVpbnQpci5MaWJJZFJlbGF0aXZlLkxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vYndUZW1wLldyaXRlKGVuYy5HZXRCeXRlcyhyLkxpYklkUmVsYXRpdmUpKTsKLSAgICAgICAgICAgICAgICAgICAgLy9id1RlbXAuV3JpdGUoci5NYWpvclZlcnNpb24pOwotICAgICAgICAgICAgICAgICAgICAvL2J3VGVtcC5Xcml0ZShyLk1pbm9yVmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKGJ5dGUgYiBpbiBCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMoKHVpbnQpcmVmZXJlbmNlLkxpYmlkLkxlbmd0aCkpICAvL0xlbmd0aCB3aWxsIG5ldmVyIGJlIGFuIFVJbnQgd2l0aCA0IGJ5dGVzIHRoYXQgYXJlbid0IDAgKD4gMHgwMEZGRkZGRiksIHNvIG5vIG5lZWQgZm9yIHRoZSByZXN0IG9mIHRoZSBwcm9wZXJ0aWVzLgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYiAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ3LldyaXRlKGIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yZWFjaCAodmFyIG1vZHVsZSBpbiBwcm9qLk1vZHVsZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGxpbmVzID0gbW9kdWxlLkNvZGUuU3BsaXQobmV3IGNoYXJbXSB7ICdccicsICdcbicgfSwgU3RyaW5nU3BsaXRPcHRpb25zLlJlbW92ZUVtcHR5RW50cmllcyk7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGxpbmUgaW4gbGluZXMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWxpbmUuU3RhcnRzV2l0aCgiYXR0cmlidXRlIiwgdHJ1ZSwgbnVsbCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ3LldyaXRlKGVuYy5HZXRCeXRlcyhsaW5lKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgYnVmZmVyID0gKGJ3LkJhc2VTdHJlYW0gYXMgTWVtb3J5U3RyZWFtKS5Ub0FycmF5KCk7Ci0gICAgICAgICAgICB2YXIgaHAgPSBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Lk1ENUNyeXB0b1NlcnZpY2VQcm92aWRlci5DcmVhdGUoKTsKLSAgICAgICAgICAgIHJldHVybiBocC5Db21wdXRlSGFzaChidWZmZXIpOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBjZXJ0aWZpY2F0ZSB0byBzaWduIHRoZSBWQkEgcHJvamVjdC4KLSAgICAgICAgLy8vIDxyZW1hcmtzPgotICAgICAgICAvLy8gVGhpcyBjZXJ0aWZpY2F0ZSBtdXN0IGhhdmUgYSBwcml2YXRlIGtleS4KLSAgICAgICAgLy8vIFRoZXJlIGlzIG5vIHZhbGlkYXRpb24gdGhhdCB0aGUgY2VydGlmaWNhdGUgaXMgdmFsaWQgZm9yIGNvZGVzaWduaW5nLCBzbyBtYWtlIHN1cmUgaXQncyB2YWxpZCB0byBzaWduIEV4Y2VsIGZpbGVzIChFeGNlbCAyMDEwIGlzIG1vcmUgc3RyaWN0IHRoYXQgcHJpb3IgdmVyc2lvbnMpLgotICAgICAgICAvLy8gPC9yZW1hcmtzPgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgWDUwOUNlcnRpZmljYXRlMiBDZXJ0aWZpY2F0ZSB7IGdldDsgc2V0OyB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSB2ZXJpZmllcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgU2lnbmVkQ21zIFZlcmlmaWVyIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KLSNpZiAhTU9OTwotICAgICAgICBpbnRlcm5hbCBDb21wb3VuZERvY3VtZW50IFNpZ25hdHVyZSB7IGdldDsgc2V0OyB9Ci0jZW5kaWYKLSAgICAgICAgaW50ZXJuYWwgUGFja2FnaW5nLlppcFBhY2thZ2VQYXJ0IFBhcnQgeyBnZXQ7IHNldDsgfQotICAgICAgICBpbnRlcm5hbCBVcmkgVXJpIHsgZ2V0OyBwcml2YXRlIHNldDsgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL0VQUGx1cy9WQkEvRXhjZWxWYmFNb2R1bGUuY3MgYi9FUFBsdXMvVkJBL0V4Y2VsVmJhTW9kdWxlLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDk3ZDgzLi4wMDAwMDAwCi0tLSBhL0VQUGx1cy9WQkEvRXhjZWxWYmFNb2R1bGUuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCi0gKgotICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KLSAqIFNlZSBodHRwOi8vd3d3LmNvZGVwbGV4LmNvbS9FUFBsdXMgZm9yIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKLSAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAotICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAotICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KLSAqCi0gKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAotICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkyNi1NQVItMjAxMgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci0KLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlZCQQotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVHlwZSBvZiBWQkEgbW9kdWxlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZW51bSBlTW9kdWxlVHlwZQotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQSBXb3JrYm9vayBvciBXb3Jrc2hlZXQgb2JqZWN0cwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBEb2N1bWVudD0wLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBIE1vZHVsZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBNb2R1bGU9MSwKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQSBDbGFzcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBDbGFzcz0yLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBEZXNpZ25lciwgdHlwaWNhbGx5IGEgdXNlciBmb3JtCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIERlc2lnbmVyPTMKLSAgICB9Ci0gICAgaW50ZXJuYWwgZGVsZWdhdGUgdm9pZCBNb2R1bGVOYW1lQ2hhbmdlKHN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEEgVkJBIGNvZGUgbW9kdWxlLiAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbFZCQU1vZHVsZQotICAgIHsKLSAgICAgICAgc3RyaW5nIF9uYW1lID0gIiI7Ci0gICAgICAgIE1vZHVsZU5hbWVDaGFuZ2UgX25hbWVDaGFuZ2VDYWxsYmFjayA9IG51bGw7Ci0gICAgICAgIGludGVybmFsIEV4Y2VsVkJBTW9kdWxlKCkKLSAgICAgICAgewotICAgICAgICAgICAgQXR0cmlidXRlcyA9IG5ldyBFeGNlbFZiYU1vZHVsZUF0dHJpYnV0ZXNDb2xsZWN0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxWQkFNb2R1bGUoTW9kdWxlTmFtZUNoYW5nZSBuYW1lQ2hhbmdlQ2FsbGJhY2spIDoKLSAgICAgICAgICAgIHRoaXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfbmFtZUNoYW5nZUNhbGxiYWNrID0gbmFtZUNoYW5nZUNhbGxiYWNrOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBOYW1lIAotICAgICAgICB7ICAgCi0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX25hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUuQW55KGMgPT4gYyA+IDI1NSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlZiYSBtb2R1bGUgbmFtZXMgY2FuJ3QgY29udGFpbiB1bmljb2RlIGNoYXJhY3RlcnMiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBfbmFtZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9uYW1lID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbU5hbWUgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF9uYW1lQ2hhbmdlQ2FsbGJhY2sgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgX25hbWVDaGFuZ2VDYWxsYmFjayh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQSBkZXNjcmlwdGlvbiBvZiB0aGUgbW9kdWxlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgRGVzY3JpcHRpb24geyBnZXQ7IHNldDsgfQotICAgICAgICBwcml2YXRlIHN0cmluZyBfY29kZT0iIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGNvZGUgd2l0aG91dCBhbnkgbW9kdWxlIGxldmVsIGF0dHJpYnV0ZXMuCi0gICAgICAgIC8vLyA8cmVtYXJrcz5DYW4gY29udGFpbiBmdW5jdGlvbiBsZXZlbCBhdHRyaWJ1dGVzLjwvcmVtYXJrcz4gCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgQ29kZSB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2NvZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZih2YWx1ZS5TdGFydHNXaXRoKCJBdHRyaWJ1dGUiLFN0cmluZ0NvbXBhcmlzb24uSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpIHx8IHZhbHVlLlN0YXJ0c1dpdGgoIlZFUlNJT04iLFN0cmluZ0NvbXBhcmlzb24uSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cobmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkNvZGUgY2FuJ3Qgc3RhcnQgd2l0aCBhbiBBdHRyaWJ1dGUgb3IgVkVSU0lPTiBrZXl3b3JkLiBBdHRyaWJ1dGVzIGNhbiBiZSBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBBdHRyaWJ1dGVzIGNvbGxlY3Rpb24uIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBfY29kZSA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEEgcmVmZXJlbmNlIHRvIHRoZSBoZWxwZmlsZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50IEhlbHBDb250ZXh0IHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTW9kdWxlIGxldmVsIGF0dHJpYnV0ZXMuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFZiYU1vZHVsZUF0dHJpYnV0ZXNDb2xsZWN0aW9uIEF0dHJpYnV0ZXMgeyBnZXQ7IGludGVybmFsIHNldDsgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUeXBlIG9mIG1vZHVsZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZU1vZHVsZVR5cGUgVHlwZSB7IGdldDsgaW50ZXJuYWwgc2V0OyB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIElmIHRoZSBtb2R1bGUgaXMgcmVhZG9ubHkKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgUmVhZE9ubHkgeyBnZXQ7IHNldDsgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJZiB0aGUgbW9kdWxlIGlzIHByaXZhdGUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgUHJpdmF0ZSB7IGdldDsgc2V0OyB9Ci0gICAgICAgIGludGVybmFsIHN0cmluZyBzdHJlYW1OYW1lIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgaW50ZXJuYWwgdXNob3J0IENvb2tpZSB7IGdldDsgc2V0OyB9Ci0gICAgICAgIGludGVybmFsIHVpbnQgTW9kdWxlT2Zmc2V0IHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgaW50ZXJuYWwgc3RyaW5nIENsYXNzSUQgeyBnZXQ7IHNldDsgfQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE5hbWU7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXMvVkJBL0V4Y2VsVmJhTW9kdWxlQXR0cmlidXRlLmNzIGIvRVBQbHVzL1ZCQS9FeGNlbFZiYU1vZHVsZUF0dHJpYnV0ZS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMyNTcwYy4uMDAwMDAwMAotLS0gYS9FUFBsdXMvVkJBL0V4Y2VsVmJhTW9kdWxlQXR0cmlidXRlLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5WQkEKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFRvIGRldGVybWluZSBpZiB0aGUgYXR0cmlidXRlIHVzZXMgZG91YmxlIHF1b3RlcyBhcm91bmQgdGhlIHZhbHVlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZW51bSBlQXR0cmlidXRlRGF0YVR5cGUKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEEgc3RyaW5nCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFN0cmluZz0wLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBOb3QgYSBzdHJpbmcKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgTm9uU3RyaW5nPTEKLSAgICB9Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsVmJhTW9kdWxlQXR0cmlidXRlCi0gICAgewotICAgICAgICBpbnRlcm5hbCBFeGNlbFZiYU1vZHVsZUF0dHJpYnV0ZSgpCi0gICAgICAgIHsKLQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBOYW1lIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGRhdGF0eXBlLiBEZXRlcm1pbmUgaWYgdGhlIGF0dHJpYnV0ZSB1c2VzIGRvdWJsZSBxdW90ZXMgYXJvdW5kIHRoZSB2YWx1ZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGVBdHRyaWJ1dGVEYXRhVHlwZSBEYXRhVHlwZSB7IGdldDsgaW50ZXJuYWwgc2V0OyB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIHdpdGhvdXQgYW55IGRvdWJsZSBxdW90ZXMuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgVmFsdWUgeyBnZXQ7IHNldDsgfQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE5hbWU7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9FUFBsdXMvVkJBL0V4Y2VsVmJhUHJvdGVjdGlvbi5jcyBiL0VQUGx1cy9WQkEvRXhjZWxWYmFQcm90ZWN0aW9uLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGZmZWM3Li4wMDAwMDAwCi0tLSBhL0VQUGx1cy9WQkEvRXhjZWxWYmFQcm90ZWN0aW9uLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQotICoKLSAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCi0gKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCi0gKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKLSAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKLSAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCi0gKgotICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKLSAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMTItQVBSLTIwMTIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeTsKLQotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVkJBCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBWYmEgc2VjdXJpdHkgcHJvcGVydGllcwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsVmJhUHJvdGVjdGlvbgotICAgIHsKLSAgICAgICAgRXhjZWxWYmFQcm9qZWN0IF9wcm9qZWN0OwotICAgICAgICBpbnRlcm5hbCBFeGNlbFZiYVByb3RlY3Rpb24oRXhjZWxWYmFQcm9qZWN0IHByb2plY3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wcm9qZWN0ID0gcHJvamVjdDsKLSAgICAgICAgICAgIFZpc2liaWxpdHlTdGF0ZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU3BlY2lmaWVzIHdoZXRoZXIgYWNjZXNzIHRvIHRoZSBWQkEgcHJvamVjdCB3YXMgcmVzdHJpY3RlZCBieSB0aGUgdXNlcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBVc2VyUHJvdGVjdGVkIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU3BlY2lmaWVzIHdoZXRoZXIgYWNjZXNzIHRvIHRoZSBWQkEgcHJvamVjdCB3YXMgcmVzdHJpY3RlZCBieSB0aGUgVkJBIGhvc3QgYXBwbGljYXRpb24KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgSG9zdFByb3RlY3RlZCB7IGdldDsgaW50ZXJuYWwgc2V0OyB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNwZWNpZmllcyB3aGV0aGVyIGFjY2VzcyB0byB0aGUgVkJBIHByb2plY3Qgd2FzIHJlc3RyaWN0ZWQgYnkgdGhlIFZCQSBwcm9qZWN0IGVkaXRvcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBWYmVQcm90ZWN0ZWQgeyBnZXQ7IGludGVybmFsIHNldDsgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTcGVjaWZpZXMgd2hldGhlciB0aGUgVkJBIHByb2plY3QgaXMgdmlzaWJsZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgVmlzaWJpbGl0eVN0YXRlIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KLSAgICAgICAgaW50ZXJuYWwgYnl0ZVtdIFBhc3N3b3JkSGFzaCB7IGdldDsgc2V0OyB9Ci0gICAgICAgIGludGVybmFsIGJ5dGVbXSBQYXNzd29yZEtleSB7IGdldDsgc2V0OyB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFBhc3N3b3JkIHByb3RlY3QgdGhlIFZCQSBwcm9qZWN0LgotICAgICAgICAvLy8gQW4gZW1wdHkgc3RyaW5nIG9yIG51bGwgd2lsbCByZW1vdmUgdGhlIHBhc3N3b3JkIHByb3RlY3Rpb24KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJQYXNzd29yZCI+VGhlIHBhc3N3b3JkPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgU2V0UGFzc3dvcmQoc3RyaW5nIFBhc3N3b3JkKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShQYXNzd29yZCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUGFzc3dvcmRIYXNoID0gbnVsbDsKLSAgICAgICAgICAgICAgICBQYXNzd29yZEtleSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgVmJlUHJvdGVjdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgSG9zdFByb3RlY3RlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIFVzZXJQcm90ZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBWaXNpYmlsaXR5U3RhdGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIF9wcm9qZWN0LlByb2plY3RJRCA9ICJ7NUREOTBENzYtNDkwNC00N0EyLUFGMEQtRDY5QjQ2NzM2MDRFfSI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9Kb2luIFBhc3N3b3JkIGFuZCBLZXkKLSAgICAgICAgICAgICAgICBieXRlW10gZGF0YTsKLSAgICAgICAgICAgICAgICAvL1NldCB0aGUga2V5Ci0gICAgICAgICAgICAgICAgUGFzc3dvcmRLZXkgPSBuZXcgYnl0ZVs0XTsKLSAgICAgICAgICAgICAgICBSYW5kb21OdW1iZXJHZW5lcmF0b3IgciA9IFJhbmRvbU51bWJlckdlbmVyYXRvci5DcmVhdGUoKTsKLSAgICAgICAgICAgICAgICByLkdldEJ5dGVzKFBhc3N3b3JkS2V5KTsKLQotICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgYnl0ZVtQYXNzd29yZC5MZW5ndGggKyA0XTsKLSAgICAgICAgICAgICAgICBBcnJheS5Db3B5KEVuY29kaW5nLkdldEVuY29kaW5nKF9wcm9qZWN0LkNvZGVQYWdlKS5HZXRCeXRlcyhQYXNzd29yZCksIGRhdGEsIFBhc3N3b3JkLkxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgVmJlUHJvdGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBWaXNpYmlsaXR5U3RhdGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBBcnJheS5Db3B5KFBhc3N3b3JkS2V5LCAwLCBkYXRhLCBkYXRhLkxlbmd0aCAtIDQsIDQpOwotCi0gICAgICAgICAgICAgICAgLy9DYWxjdWxhdGUgSGFzaAotICAgICAgICAgICAgICAgIHZhciBwcm92aWRlciA9IFNIQTEuQ3JlYXRlKCk7Ci0gICAgICAgICAgICAgICAgUGFzc3dvcmRIYXNoID0gcHJvdmlkZXIuQ29tcHV0ZUhhc2goZGF0YSk7Ci0gICAgICAgICAgICAgICAgX3Byb2plY3QuUHJvamVjdElEID0gInswMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDB9IjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL3B1YmxpYyB2b2lkIFZhbGlkYXRlUGFzc3dvcmQoc3RyaW5nIFBhc3N3b3JkKSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAvL3sKLQotICAgICAgICAvL30gICAgICAgIAotICAgIH0KLX0K