PD9waHAKZGVjbGFyZShlbmNvZGluZz0ibGF0aW4xIik7Ci8qKgogKiBAY29weXJpZ2h0IENvcHlyaWdodCAoQykgMjAwNS0yMDEwIGVaIFN5c3RlbXMgQVMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIEBsaWNlbnNlIGh0dHA6Ly9lei5uby9saWNlbnNlcy9uZXdfYnNkIE5ldyBCU0QgTGljZW5zZQogKiBAdmVyc2lvbiAvL2F1dG9nZW50YWcvLwogKiBAZmlsZXNvdXJjZQogKiBAcGFja2FnZSBNYWlsCiAqIEBzdWJwYWNrYWdlIFRlc3RzCiAqLwpjbGFzcyBSRkM4MjJEaWdlc3QgZXh0ZW5kcyBlemNNYWlsUGFydAp7CiAgICBwcml2YXRlICRtYWlsID0gbnVsbDsKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCggZXpjTWFpbCAkbWFpbCApCiAgICB7CiAgICAgICAgJHRoaXMtPm1haWwgPSAkbWFpbDsKICAgICAgICAkdGhpcy0+c2V0SGVhZGVyKCAnQ29udGVudC1UeXBlJywgJ21lc3NhZ2UvcmZjODIyJyApOwogICAgICAgICR0aGlzLT5zZXRIZWFkZXIoICdDb250ZW50LURpc3Bvc2l0aW9uJywgJ2lubGluZScgKTsKICAgIH0KCiAgICAgICAgcHVibGljIGZ1bmN0aW9uIGdlbmVyYXRlQm9keSgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5tYWlsLT5nZW5lcmF0ZSgpOwogICAgfQp9CgoKCi8qKgogKiBAcGFja2FnZSBNYWlsCiAqIEBzdWJwYWNrYWdlIFRlc3RzCiAqCiAqIElmIHlvdSBjaGFuZ2UgYW55IG9mIHRoZXNlLCByZW1lbWJlciB0byB1cGRhdGUgdGhlIHR1dG9yaWFsIGFzIHdlbGwuCiAqLwpjbGFzcyBlemNNYWlsVHV0b3JpYWxFeGFtcGxlcyBleHRlbmRzIGV6Y1Rlc3RDYXNlCnsKCiAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdENvbXBvc2VyKCkKICAgIHsKICAgICAgICAkbWFpbCA9IG5ldyBlemNNYWlsQ29tcG9zZXIoKTsKICAgICAgICAkbWFpbC0+ZnJvbSA9IG5ldyBlemNNYWlsQWRkcmVzcyggJ3NlbmRlckBleGFtcGxlLmNvbScsICdBZHJpYW4gUmlwYnVyZ2VyJyApOwogICAgICAgICRtYWlsLT5hZGRUbyggbmV3IGV6Y01haWxBZGRyZXNzKCAncmVjZWl2ZXJAZXhhbXBsZS5jb20nLCAnTWF1cmVlbiBDb3JsZXknICkgKTsKICAgICAgICAkbWFpbC0+c3ViamVjdCA9ICJUaGlzIGlzIHRoZSBzdWJqZWN0IG9mIHRoZSBleGFtcGxlIG1haWwiOwogICAgICAgICRtYWlsLT5wbGFpblRleHQgPSAiVGhpcyBpcyB0aGUgYm9keSBvZiB0aGUgZXhhbXBsZSBtYWlsLiI7CiAgICAgICAgJG1haWwtPmJ1aWxkKCk7CiAgICAgICAgJHRyYW5zcG9ydCA9IG5ldyBlemNNYWlsTXRhVHJhbnNwb3J0KCk7Ci8vICAgICAgICAkdHJhbnNwb3J0LT5zZW5kKCAkbWFpbCApOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TWFpbDEoKQogICAgewogICAgICAgICRtYWlsID0gbmV3IGV6Y01haWwoKTsKICAgICAgICAkbWFpbC0+ZnJvbSA9IG5ldyBlemNNYWlsQWRkcmVzcyggJ3NlbmRlckBleGFtcGxlLmNvbScsICdCb3N0b24gTG93JyApOwogICAgICAgICRtYWlsLT5hZGRUbyggbmV3IGV6Y01haWxBZGRyZXNzKCAncmVjZWl2ZXJAZXhhbXBsZS5jb20nLCAnTWFnZ2llIFJvYmJpbnMnICkgKTsKICAgICAgICAkbWFpbC0+c3ViamVjdCA9ICJUaGlzIGlzIHRoZSBzdWJqZWN0IG9mIHRoZSBleGFtcGxlIG1haWwiOwogICAgICAgICRtYWlsLT5ib2R5ID0gbmV3IGV6Y01haWxUZXh0KCAiVGhpcyBpcyB0aGUgYm9keSBvZiB0aGUgZXhhbXBsZSBtYWlsLiIgKTsKICAgICAgICAkdHJhbnNwb3J0ID0gbmV3IGV6Y01haWxNdGFUcmFuc3BvcnQoKTsKLy8gICAgICAgICR0cmFuc3BvcnQtPnNlbmQoICRtYWlsICk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHRlc3RNYWlsMigpCiAgICB7CiAgICAgICAgJG1haWwgPSBuZXcgZXpjTWFpbCgpOwogICAgICAgICRtYWlsLT5mcm9tID0gbmV3IGV6Y01haWxBZGRyZXNzKCAnc2VuZGVyQGV4YW1wbGUuY29tJywgJ0Jlcm5hcmQgQmVybm91bGxpJyApOwogICAgICAgICRtYWlsLT5hZGRUbyggbmV3IGV6Y01haWxBZGRyZXNzKCAncmVjZWl2ZXJAZXhhbXBsZS5jb20nLCAnV2VuZHknICkgKTsKICAgICAgICAkbWFpbC0+c3ViamVjdCA9ICJUaGlzIGlzIHRoZSBzdWJqZWN0IG9mIHRoZSBleGFtcGxlIG1haWwiOwogICAgICAgICR0ZXh0UGFydCA9IG5ldyBlemNNYWlsVGV4dCggIlRoaXMgaXMgdGhlIGJvZHkgb2YgdGhlIGV4YW1wbGUgbWFpbC4iICk7Ci8vICAgICAgICAkZmlsZUF0dGFjaG1lbnQgPSBuZXcgZXpjTWFpbEZpbGUoICJ+L215ZmlsZS5qcGciICk7CiAgICAgICAgJGZpbGVBdHRhY2htZW50ID0gbmV3IGV6Y01haWxGaWxlKCBkaXJuYW1lKCBfX0ZJTEVfXykgLiAiL3BhcnRzL2RhdGEvZmx5LmpwZyIgKTsKCiAgICAgICAgJG1haWwtPmJvZHkgPSBuZXcgZXpjTWFpbE11bHRpcGFydE1peGVkKCAkdGV4dFBhcnQsICRmaWxlQXR0YWNobWVudCApOwogICAgICAgICR0cmFuc3BvcnQgPSBuZXcgZXpjTWFpbE10YVRyYW5zcG9ydCgpOwovLyAgICAgICAgJHRyYW5zcG9ydC0+c2VuZCggJG1haWwgKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE1haWwzKCkKICAgIHsKICAgICAgICAkZGlnZXN0ID0gbmV3IGV6Y01haWwoKTsKICAgICAgICAkZGlnZXN0LT5mcm9tID0gbmV3IGV6Y01haWxBZGRyZXNzKCAnc2VuZGVyQGV4YW1wbGUuY29tJywgJ0FkcmlhbiBSaXBidXJnZXInICk7CiAgICAgICAgJGRpZ2VzdC0+YWRkVG8oIG5ldyBlemNNYWlsQWRkcmVzcyggJ2ZoQGV6Lm5vJywgJ01hdXJlZW4gQ29ybGV5JyApICk7CiAgICAgICAgJGRpZ2VzdC0+c3ViamVjdCA9ICJUaGlzIGlzIHRoZSBzdWJqZWN0IG9mIHRoZSBleGFtcGxlIG1haWwiOwogICAgICAgICRkaWdlc3RUZXh0UGFydCA9IG5ldyBlemNNYWlsVGV4dCggIlRoaXMgaXMgdGhlIGJvZHkgb2YgdGhlIGV4YW1wbGUgbWFpbC4iICk7Ci8vICAgICAgICAkZmlsZUF0dGFjaG1lbnQgPSBuZXcgZXpjTWFpbEZpbGUoICJ+L215ZmlsZS5qcGciICk7CiAgICAgICAgJGZpbGVBdHRhY2htZW50ID0gbmV3IGV6Y01haWxGaWxlKCBkaXJuYW1lKCBfX0ZJTEVfXykgLiAiL3BhcnRzL2RhdGEvZmx5LmpwZyIgKTsKCiAgICAgICAgJGRpZ2VzdC0+Ym9keSA9IG5ldyBlemNNYWlsTXVsdGlwYXJ0TWl4ZWQoICRkaWdlc3RUZXh0UGFydCwgJGZpbGVBdHRhY2htZW50ICk7CgogICAgICAgICRtYWlsID0gbmV3IGV6Y01haWwoKTsKICAgICAgICAkbWFpbC0+ZnJvbSA9IG5ldyBlemNNYWlsQWRkcmVzcyggJ3NlbmRlckBleGFtcGxlLmNvbScsICdMYXJnbyBMYUdyYW5kZScgKTsKICAgICAgICAkbWFpbC0+YWRkVG8oIG5ldyBlemNNYWlsQWRkcmVzcyggJ3JlY2VpdmVyQGV4YW1wbGUuY29tJywgJ1dhbGx5IEIuIEZlZWQnICkgKTsKICAgICAgICAkbWFpbC0+c3ViamVjdCA9ICJUaGlzIGlzIHRoZSBzdWJqZWN0IG9mIHRoZSBtYWlsIHdpdGggYSBtYWlsIGRpZ2VzdC4iOwogICAgICAgICR0ZXh0UGFydCA9IG5ldyBlemNNYWlsVGV4dCggIlRoaXMgaXMgdGhlIGJvZHkgb2YgdGhlIG1haWwgd2l0aCBhIG1haWwgZGlnZXN0LiIgKTsKCiAgICAgICAgJG1haWwtPmJvZHkgPSBuZXcgZXpjTWFpbE11bHRpcGFydE1peGVkKCAkdGV4dFBhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJGQzgyMkRpZ2VzdCggJGRpZ2VzdCApICk7CiAgICAgICAgJHRyYW5zcG9ydCA9IG5ldyBlemNNYWlsTXRhVHJhbnNwb3J0KCk7Ci8vICAgICAgICAkdHJhbnNwb3J0LT5zZW5kKCAkbWFpbCApOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TWFpbDQoKQogICAgewogICAgICAgICRtYWlsID0gbmV3IGV6Y01haWwoKTsKICAgICAgICAkbWFpbC0+ZnJvbSA9IG5ldyBlemNNYWlsQWRkcmVzcyggJ3NlbmRlckBleGFtcGxlLmNvbScsICdOb3J3ZWdpYW4gY2hhcmFjdGVyczog5vjlJywgJ2lzby04ODU5LTEnICk7CiAgICAgICAgJG1haWwtPmFkZFRvKCBuZXcgZXpjTWFpbEFkZHJlc3MoICdyZWNpZXZlckBleGFtcGxlLmNvbScsICdNb3JlIG5vcndlZ2lhbiBjaGFyYWN0ZXJzOiDm+OUnLCAnaXNvLTg4NTktMScgKSApOwogICAgICAgICRtYWlsLT5zdWJqZWN0ID0gJ09zbG8gbGlnZ2VyIHP4ciBpIE5vcmdlIG9nIGhhciB25nJ0IGxhbmRldHMgaG92ZWRzdGFkIGkgb3ZlciA2MDAg5XIuJzsKICAgICAgICAkbWFpbC0+c3ViamVjdENoYXJzZXQgPSAnaXNvLTg4NTktMSc7CiAgICAgICAgJG1haWwtPmJvZHkgPSBuZXcgZXpjTWFpbFRleHQoICdPc2xvIGJlIGdydW5ubGFndCBydW5kdCAxMDQ4IGF2IEhhcmFsZCBIYXJkcuVkZS4nLCAnaXNvLTg4NTktMScgKTsKICAgICAgICAkdHJhbnNwb3J0ID0gbmV3IGV6Y01haWxNdGFUcmFuc3BvcnQoKTsKLy8gICAgICAgICR0cmFuc3BvcnQtPnNlbmQoICRtYWlsICk7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdWl0ZSgpCiAgICB7CiAgICAgICAgIHJldHVybiBuZXcgUEhQVW5pdF9GcmFtZXdvcmtfVGVzdFN1aXRlKCAiZXpjTWFpbFR1dG9yaWFsRXhhbXBsZXMiICk7CiAgICB9Cn0KPz4K