PD9waHAKLyoqCiAqIFNjaGVtYSBKU09OLUxEOiBNdXNpY0V2ZW50LCBSZXZpZXcsIFBlcnNvbiwgTmV3c0FydGljbGUKICogR29vZ2xlIE5ld3MgU2l0ZW1hcCBlbmRwb2ludDogL25ld3Mtc2l0ZW1hcC54bWwKICogU2hvcnRjb2RlIFtkaXN0cmlidXRpZV0gKyBbYXJ0aXN0IG51bWU9IlgiIHJvbD0iWSIgdm9jZT0iWiJdCiAqIG1hZGFsaW5nZW9yZ2Vncm96YS5ybyAtIG11LXBsdWdpbgogKi8KCi8vIOKUgOKUgOKUgCDDjm5yZWdpc3RyYXJlIG1ldGEgc3BlY3RhY29sX2RhdGVfc29ydCAobmVjZXNhcsSDIHBlbnRydSBSRVNUIHdyaXRlICsgV1BfUXVlcnkpIOKUgOKUgAoKYWRkX2FjdGlvbignaW5pdCcsICdtZ2dfcmVnaXN0ZXJfc3BlY3RhY29sX21ldGEnKTsKZnVuY3Rpb24gbWdnX3JlZ2lzdGVyX3NwZWN0YWNvbF9tZXRhKCkgewogICAgcmVnaXN0ZXJfcG9zdF9tZXRhKCdzcGVjdGFjb2wnLCAnc3BlY3RhY29sX2RhdGVfc29ydCcsIFsKICAgICAgICAndHlwZScgICAgICAgICA9PiAnc3RyaW5nJywKICAgICAgICAnc2luZ2xlJyAgICAgICA9PiB0cnVlLAogICAgICAgICdzaG93X2luX3Jlc3QnID0+IHRydWUsCiAgICAgICAgJ2F1dGhfY2FsbGJhY2snPT4gJ19fcmV0dXJuX3RydWUnLAogICAgICAgICdkZWZhdWx0JyAgICAgID0+ICcnLAogICAgXSk7Cn0KCi8vIOKUgOKUgOKUgCBBcmhpdsSDIHNwZWN0YWNvbGUg4oCUIHNvcnRhcmUgY3Jvbm9sb2dpY8SDIEFTQywgZG9hciB2aWl0b2FyZSArIGF6aSDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmFkZF9hY3Rpb24oJ3ByZV9nZXRfcG9zdHMnLCAnbWdnX3NwZWN0YWNvbF9hcmNoaXZlX3F1ZXJ5Jyk7CmZ1bmN0aW9uIG1nZ19zcGVjdGFjb2xfYXJjaGl2ZV9xdWVyeSgkcXVlcnkpIHsKICAgIGlmIChpc19hZG1pbigpIHx8ICEkcXVlcnktPmlzX21haW5fcXVlcnkoKSkgcmV0dXJuOwogICAgJHB0ID0gJHF1ZXJ5LT5nZXQoJ3Bvc3RfdHlwZScpOwogICAgJGlzX3NwZWN0YWNvbF9hcmNoaXZlID0gJHF1ZXJ5LT5pc19wb3N0X3R5cGVfYXJjaGl2ZSgnc3BlY3RhY29sJykKICAgICAgICB8fCAoJHB0ID09PSAnc3BlY3RhY29sJyAmJiAkcXVlcnktPmlzX2FyY2hpdmUoKSk7CiAgICBpZiAoISRpc19zcGVjdGFjb2xfYXJjaGl2ZSkgcmV0dXJuOwoKICAgIC8vIFRFU1QgSVpPTEFUOiBET0FSIHBvc3RzX3Blcl9wYWdlCiAgICAkcXVlcnktPnNldCgncG9zdHNfcGVyX3BhZ2UnLCAyMCk7Cn0KCi8vIOKUgOKUgOKUgCBHb29nbGUgTmV3cyBTaXRlbWFwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovLyBGxINyxIMgcmV3cml0ZSBydWxlcyDigJQgdmVyaWZpY8SDIFJFUVVFU1RfVVJJIGRpcmVjdCDDrm4gJ3BhcnNlX3JlcXVlc3QnCgphZGRfYWN0aW9uKCdwYXJzZV9yZXF1ZXN0JywgJ21nZ19uZXdzX3NpdGVtYXBfaW50ZXJjZXB0Jyk7CmZ1bmN0aW9uIG1nZ19uZXdzX3NpdGVtYXBfaW50ZXJjZXB0KCkgewogICAgJHVyaSA9IHRyaW0ocGFyc2VfdXJsKCRfU0VSVkVSWydSRVFVRVNUX1VSSSddID8/ICcnLCBQSFBfVVJMX1BBVEgpLCAnLycpOwogICAgaWYgKCR1cmkgIT09ICduZXdzLXNpdGVtYXAueG1sJykgcmV0dXJuOwogICAgbWdnX25ld3Nfc2l0ZW1hcF9vdXRwdXQoKTsKfQoKZnVuY3Rpb24gbWdnX25ld3Nfc2l0ZW1hcF9vdXRwdXQoKSB7CgogICAgJHBvc3RzID0gZ2V0X3Bvc3RzKFsKICAgICAgICAncG9zdF90eXBlJyAgICAgID0+ICdzdGlyZScsCiAgICAgICAgJ3Bvc3Rfc3RhdHVzJyAgICA9PiAncHVibGlzaCcsCiAgICAgICAgJ3Bvc3RzX3Blcl9wYWdlJyA9PiAxMDAwLAogICAgICAgICdkYXRlX3F1ZXJ5JyAgICAgPT4gW1snYWZ0ZXInID0+ICcyIGRheXMgYWdvJ11dLAogICAgICAgICdvcmRlcmJ5JyAgICAgICAgPT4gJ2RhdGUnLAogICAgICAgICdvcmRlcicgICAgICAgICAgPT4gJ0RFU0MnLAogICAgXSk7CgogICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3htbDsgY2hhcnNldD1VVEYtOCcpOwogICAgaGVhZGVyKCdYLVJvYm90cy1UYWc6IG5vaW5kZXgnKTsKCiAgICBlY2hvICc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PicgLiAiXG4iOwogICAgZWNobyAnPHVybHNldCB4bWxucz0iaHR0cDovL3d3dy5zaXRlbWFwcy5vcmcvc2NoZW1hcy9zaXRlbWFwLzAuOSInIC4gIlxuIjsKICAgIGVjaG8gJyAgICAgICAgeG1sbnM6bmV3cz0iaHR0cDovL3d3dy5nb29nbGUuY29tL3NjaGVtYXMvc2l0ZW1hcC1uZXdzLzAuOSI+JyAuICJcbiI7CgogICAgZm9yZWFjaCAoJHBvc3RzIGFzICRwb3N0KSB7CiAgICAgICAgJHRpdGxlID0gZXNjX3htbChnZXRfdGhlX3RpdGxlKCRwb3N0KSk7CiAgICAgICAgJHVybCAgID0gZXNjX3VybChnZXRfcGVybWFsaW5rKCRwb3N0KSk7CiAgICAgICAgJGRhdGUgID0gZ2V0X3RoZV9kYXRlKCdjJywgJHBvc3QpOwoKICAgICAgICBlY2hvICIgIDx1cmw+XG4iOwogICAgICAgIGVjaG8gIiAgICA8bG9jPnskdXJsfTwvbG9jPlxuIjsKICAgICAgICBlY2hvICIgICAgPG5ld3M6bmV3cz5cbiI7CiAgICAgICAgZWNobyAiICAgICAgPG5ld3M6cHVibGljYXRpb24+XG4iOwogICAgICAgIGVjaG8gIiAgICAgICAgPG5ld3M6bmFtZT5tYWRhbGluZ2VvcmdlZ3JvemEucm88L25ld3M6bmFtZT5cbiI7CiAgICAgICAgZWNobyAiICAgICAgICA8bmV3czpsYW5ndWFnZT5ybzwvbmV3czpsYW5ndWFnZT5cbiI7CiAgICAgICAgZWNobyAiICAgICAgPC9uZXdzOnB1YmxpY2F0aW9uPlxuIjsKICAgICAgICBlY2hvICIgICAgICA8bmV3czpwdWJsaWNhdGlvbl9kYXRlPnskZGF0ZX08L25ld3M6cHVibGljYXRpb25fZGF0ZT5cbiI7CiAgICAgICAgZWNobyAiICAgICAgPG5ld3M6dGl0bGU+eyR0aXRsZX08L25ld3M6dGl0bGU+XG4iOwogICAgICAgIGVjaG8gIiAgICA8L25ld3M6bmV3cz5cbiI7CiAgICAgICAgZWNobyAiICA8L3VybD5cbiI7CiAgICB9CgogICAgZWNobyAnPC91cmxzZXQ+JzsKICAgIGV4aXQ7Cn0KCmFkZF9hY3Rpb24oJ3dwX2hlYWQnLCAnbWdnX291dHB1dF9zY2hlbWEnLCAyMCk7CgpmdW5jdGlvbiBtZ2dfb3V0cHV0X3NjaGVtYSgpIHsKICAgIGlmICghaXNfc2luZ3VsYXIoKSkgcmV0dXJuOwogICAgJHBvc3QgPSBnZXRfcG9zdCgpOwogICAgaWYgKCEkcG9zdCkgcmV0dXJuOwoKICAgICRzY2hlbWEgPSBudWxsOwoKICAgIGlmICgkcG9zdC0+cG9zdF90eXBlID09PSAnc3BlY3RhY29sJykgewogICAgICAgICRzY2hlbWEgPSBtZ2dfbXVzaWNfZXZlbnRfc2NoZW1hKCRwb3N0KTsKICAgIH0gZWxzZWlmICgkcG9zdC0+cG9zdF90eXBlID09PSAncG9zdCcgJiYgaGFzX2NhdGVnb3J5KCdyZWNlbnppaScsICRwb3N0KSkgewogICAgICAgICRzY2hlbWEgPSBtZ2dfcmV2aWV3X3NjaGVtYSgkcG9zdCk7CiAgICB9IGVsc2VpZiAoJHBvc3QtPnBvc3RfdHlwZSA9PT0gJ3Bvc3QnICYmIGhhc19jYXRlZ29yeSgnY2F0ZWdvcmllLWFydGlzdGknLCAkcG9zdCkpIHsKICAgICAgICAkc2NoZW1hID0gbWdnX3BlcnNvbl9zY2hlbWEoJHBvc3QpOwogICAgfSBlbHNlaWYgKCRwb3N0LT5wb3N0X3R5cGUgPT09ICdhcnRpc3RpJykgewogICAgICAgICRzY2hlbWEgPSBtZ2dfcGVyc29uX3NjaGVtYSgkcG9zdCk7CiAgICB9IGVsc2VpZiAoJHBvc3QtPnBvc3RfdHlwZSA9PT0gJ3N0aXJlJykgewogICAgICAgICRzY2hlbWEgPSBtZ2dfbmV3c19hcnRpY2xlX3NjaGVtYSgkcG9zdCk7CiAgICB9CgogICAgaWYgKCEkc2NoZW1hKSByZXR1cm47CgogICAgZWNobyAnPHNjcmlwdCB0eXBlPSJhcHBsaWNhdGlvbi9sZCtqc29uIiBjbGFzcz0ibWdnLXNjaGVtYSI+JyAuICJcbiI7CiAgICBlY2hvIHdwX2pzb25fZW5jb2RlKCRzY2hlbWEsIEpTT05fVU5FU0NBUEVEX1NMQVNIRVMgfCBKU09OX1VORVNDQVBFRF9VTklDT0RFIHwgSlNPTl9QUkVUVFlfUFJJTlQpOwogICAgZWNobyAiXG48L3NjcmlwdD5cbiI7Cn0KCmZ1bmN0aW9uIG1nZ19tdXNpY19ldmVudF9zY2hlbWEoJHBvc3QpIHsKICAgICR2ZW51ZSA9IGdldF9wb3N0X21ldGEoJHBvc3QtPklELCAnc3BlY3RhY29sX3ZlbnVlJywgdHJ1ZSk7CiAgICAkZGF0ZSAgPSBnZXRfcG9zdF9tZXRhKCRwb3N0LT5JRCwgJ3NwZWN0YWNvbF9kYXRlJywgIHRydWUpOwogICAgJHRpbWUgID0gZ2V0X3Bvc3RfbWV0YSgkcG9zdC0+SUQsICdzcGVjdGFjb2xfdGltZScsICB0cnVlKTsKICAgICR0eXBlICA9IGdldF9wb3N0X21ldGEoJHBvc3QtPklELCAnc3BlY3RhY29sX3R5cGUnLCAgdHJ1ZSk7CgogICAgJHN0YXJ0X2RhdGUgPSBtZ2dfcm9fZGF0ZV90b19pc28oJGRhdGUsICR0aW1lKTsKCiAgICAkc2NoZW1hID0gWwogICAgICAgICdAY29udGV4dCcgICAgICAgICAgICA9PiAnaHR0cHM6Ly9zY2hlbWEub3JnJywKICAgICAgICAnQHR5cGUnICAgICAgICAgICAgICAgPT4gJ011c2ljRXZlbnQnLAogICAgICAgICduYW1lJyAgICAgICAgICAgICAgICA9PiBnZXRfdGhlX3RpdGxlKCRwb3N0KSwKICAgICAgICAndXJsJyAgICAgICAgICAgICAgICAgPT4gZ2V0X3Blcm1hbGluaygkcG9zdCksCiAgICAgICAgJ2V2ZW50U3RhdHVzJyAgICAgICAgID0+ICdodHRwczovL3NjaGVtYS5vcmcvRXZlbnRTY2hlZHVsZWQnLAogICAgICAgICdldmVudEF0dGVuZGFuY2VNb2RlJyA9PiAnaHR0cHM6Ly9zY2hlbWEub3JnL09mZmxpbmVFdmVudEF0dGVuZGFuY2VNb2RlJywKICAgIF07CgogICAgaWYgKCRzdGFydF9kYXRlKSB7CiAgICAgICAgJHNjaGVtYVsnc3RhcnREYXRlJ10gPSAkc3RhcnRfZGF0ZTsKICAgIH0KCiAgICBpZiAoJHZlbnVlKSB7CiAgICAgICAgJHNjaGVtYVsnbG9jYXRpb24nXSA9IFsKICAgICAgICAgICAgJ0B0eXBlJyAgID0+ICdQZXJmb3JtaW5nQXJ0c1RoZWF0ZXInLAogICAgICAgICAgICAnbmFtZScgICAgPT4gJHZlbnVlLAogICAgICAgICAgICAnYWRkcmVzcycgPT4gWydAdHlwZScgPT4gJ1Bvc3RhbEFkZHJlc3MnLCAnYWRkcmVzc0NvdW50cnknID0+ICdSTyddLAogICAgICAgIF07CiAgICAgICAgJHNjaGVtYVsnb3JnYW5pemVyJ10gPSBbJ0B0eXBlJyA9PiAnT3JnYW5pemF0aW9uJywgJ25hbWUnID0+ICR2ZW51ZV07CiAgICB9CgogICAgJHRodW1iX2lkID0gZ2V0X3Bvc3RfdGh1bWJuYWlsX2lkKCRwb3N0LT5JRCk7CiAgICBpZiAoJHRodW1iX2lkKSB7CiAgICAgICAgJGltZyA9IHdwX2dldF9hdHRhY2htZW50X2ltYWdlX3NyYygkdGh1bWJfaWQsICdmdWxsJyk7CiAgICAgICAgaWYgKCRpbWcpIHsKICAgICAgICAgICAgJHNjaGVtYVsnaW1hZ2UnXSA9ICRpbWdbMF07CiAgICAgICAgfQogICAgfQoKICAgIGlmICgkdHlwZSkgewogICAgICAgICRzY2hlbWFbJ2Rlc2NyaXB0aW9uJ10gPSB1Y2ZpcnN0KCR0eXBlKTsKICAgIH0KCiAgICByZXR1cm4gJHNjaGVtYTsKfQoKZnVuY3Rpb24gbWdnX3Jldmlld19zY2hlbWEoJHBvc3QpIHsKICAgICRvdmVyYWxsX3JhdGluZyA9IGdldF9wb3N0X21ldGEoJHBvc3QtPklELCAneWFzcl9vdmVyYWxsX3JhdGluZycsIHRydWUpOwoKICAgICRzY2hlbWEgPSBbCiAgICAgICAgJ0Bjb250ZXh0JyAgICAgID0+ICdodHRwczovL3NjaGVtYS5vcmcnLAogICAgICAgICdAdHlwZScgICAgICAgICA9PiAnUmV2aWV3JywKICAgICAgICAndXJsJyAgICAgICAgICAgPT4gZ2V0X3Blcm1hbGluaygkcG9zdCksCiAgICAgICAgJ25hbWUnICAgICAgICAgID0+IGdldF90aGVfdGl0bGUoJHBvc3QpLAogICAgICAgICdkYXRlUHVibGlzaGVkJyA9PiBnZXRfdGhlX2RhdGUoJ2MnLCAkcG9zdCksCiAgICAgICAgJ2F1dGhvcicgICAgICAgID0+IG1nZ19hdXRob3Jfc2NoZW1hKCksCiAgICAgICAgJ2l0ZW1SZXZpZXdlZCcgID0+IFsKICAgICAgICAgICAgJ0B0eXBlJyA9PiAnRXZlbnQnLAogICAgICAgICAgICAnbmFtZScgID0+IGdldF90aGVfdGl0bGUoJHBvc3QpLAogICAgICAgIF0sCiAgICAgICAgJ3B1Ymxpc2hlcicgICAgID0+IFsKICAgICAgICAgICAgJ0B0eXBlJyA9PiAnT3JnYW5pemF0aW9uJywKICAgICAgICAgICAgJ25hbWUnICA9PiAnbWFkYWxpbmdlb3JnZWdyb3phLnJvJywKICAgICAgICAgICAgJ3VybCcgICA9PiBob21lX3VybCgpLAogICAgICAgIF0sCiAgICBdOwoKICAgIGlmICgkb3ZlcmFsbF9yYXRpbmcgIT09ICcnICYmICRvdmVyYWxsX3JhdGluZyAhPT0gZmFsc2UpIHsKICAgICAgICAkc2NoZW1hWydyZXZpZXdSYXRpbmcnXSA9IFsKICAgICAgICAgICAgJ0B0eXBlJyAgICAgICA9PiAnUmF0aW5nJywKICAgICAgICAgICAgJ3JhdGluZ1ZhbHVlJyA9PiAoZmxvYXQpICRvdmVyYWxsX3JhdGluZywKICAgICAgICAgICAgJ2Jlc3RSYXRpbmcnICA9PiA1LAogICAgICAgICAgICAnd29yc3RSYXRpbmcnID0+IDEsCiAgICAgICAgXTsKICAgIH0KCiAgICByZXR1cm4gJHNjaGVtYTsKfQoKZnVuY3Rpb24gbWdnX3BlcnNvbl9zY2hlbWEoJHBvc3QpIHsKICAgICRzY2hlbWEgPSBbCiAgICAgICAgJ0Bjb250ZXh0JyA9PiAnaHR0cHM6Ly9zY2hlbWEub3JnJywKICAgICAgICAnQHR5cGUnICAgID0+ICdQZXJzb24nLAogICAgICAgICduYW1lJyAgICAgPT4gZ2V0X3RoZV90aXRsZSgkcG9zdCksCiAgICAgICAgJ3VybCcgICAgICA9PiBnZXRfcGVybWFsaW5rKCRwb3N0KSwKICAgIF07CgogICAgJHRodW1iX2lkID0gZ2V0X3Bvc3RfdGh1bWJuYWlsX2lkKCRwb3N0LT5JRCk7CiAgICBpZiAoJHRodW1iX2lkKSB7CiAgICAgICAgJGltZyA9IHdwX2dldF9hdHRhY2htZW50X2ltYWdlX3NyYygkdGh1bWJfaWQsICdmdWxsJyk7CiAgICAgICAgaWYgKCRpbWcpIHsKICAgICAgICAgICAgJHNjaGVtYVsnaW1hZ2UnXSA9IFsKICAgICAgICAgICAgICAgICdAdHlwZScgID0+ICdJbWFnZU9iamVjdCcsCiAgICAgICAgICAgICAgICAndXJsJyAgICA9PiAkaW1nWzBdLAogICAgICAgICAgICAgICAgJ3dpZHRoJyAgPT4gKGludCkgJGltZ1sxXSwKICAgICAgICAgICAgICAgICdoZWlnaHQnID0+IChpbnQpICRpbWdbMl0sCiAgICAgICAgICAgIF07CiAgICAgICAgfQogICAgfQoKICAgIC8vIFRheG9ub21pYSBwcmltYXJhIGEgcGFnaW5paSBkZSBhcnRpc3QgKGRpcmlqb3IsIHNvcHJhbmEgZXRjKSDihpIgam9iVGl0bGUKICAgICR0ZXJtcyA9IGdldF90aGVfdGVybXMoJHBvc3QtPklELCAnY2F0ZWdvcnknKTsKICAgIGlmICgkdGVybXMgJiYgIWlzX3dwX2Vycm9yKCR0ZXJtcykpIHsKICAgICAgICAkc2NoZW1hWydqb2JUaXRsZSddID0gJHRlcm1zWzBdLT5uYW1lOwogICAgfQoKICAgIHJldHVybiAkc2NoZW1hOwp9CgpmdW5jdGlvbiBtZ2dfYXV0aG9yX3NjaGVtYSgpIHsKICAgIHJldHVybiBbCiAgICAgICAgJ0B0eXBlJyAgPT4gJ1BlcnNvbicsCiAgICAgICAgJ25hbWUnICAgPT4gJ03Eg2TEg2xpbiBHZW9yZ2UgR3JvemEnLAogICAgICAgICd1cmwnICAgID0+ICdodHRwczovL21hZGFsaW5nZW9yZ2Vncm96YS5yby9tYWRhbGluLWdlb3JnZS1ncm96YS10ZW5vci1jcml0aWMtbXV6aWNhbC8nLAogICAgICAgICdzYW1lQXMnID0+IFsKICAgICAgICAgICAgJ2h0dHBzOi8vd3d3LnRpa3Rvay5jb20vQG1hZGFsaW4uZ3JvemEub3BlcmEnLAogICAgICAgICAgICAnaHR0cHM6Ly93d3cuZmFjZWJvb2suY29tL21hZGFsaW5nZW9yZ2Vncm96YScsCiAgICAgICAgICAgICdodHRwczovL3d3dy5pbnN0YWdyYW0uY29tL21hZGFsaW4uZ3JvemEub3BlcmEvJywKICAgICAgICAgICAgJ2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL0BtYWRhbGluZ2VvcmdlZ3JvemEnLAogICAgICAgIF0sCiAgICBdOwp9CgpmdW5jdGlvbiBtZ2dfbmV3c19hcnRpY2xlX3NjaGVtYSgkcG9zdCkgewogICAgJHNjaGVtYSA9IFsKICAgICAgICAnQGNvbnRleHQnICAgICAgPT4gJ2h0dHBzOi8vc2NoZW1hLm9yZycsCiAgICAgICAgJ0B0eXBlJyAgICAgICAgID0+ICdOZXdzQXJ0aWNsZScsCiAgICAgICAgJ2hlYWRsaW5lJyAgICAgID0+IG1iX3N1YnN0cihnZXRfdGhlX3RpdGxlKCRwb3N0KSwgMCwgMTEwKSwKICAgICAgICAndXJsJyAgICAgICAgICAgPT4gZ2V0X3Blcm1hbGluaygkcG9zdCksCiAgICAgICAgJ2RhdGVQdWJsaXNoZWQnID0+IGdldF90aGVfZGF0ZSgnYycsICRwb3N0KSwKICAgICAgICAnZGF0ZU1vZGlmaWVkJyAgPT4gZ2V0X3RoZV9tb2RpZmllZF9kYXRlKCdjJywgJHBvc3QpLAogICAgICAgICdhdXRob3InICAgICAgICA9PiBtZ2dfYXV0aG9yX3NjaGVtYSgpLAogICAgICAgICdwdWJsaXNoZXInICAgICA9PiBbCiAgICAgICAgICAgICdAdHlwZScgPT4gJ09yZ2FuaXphdGlvbicsCiAgICAgICAgICAgICduYW1lJyAgPT4gJ21hZGFsaW5nZW9yZ2Vncm96YS5ybycsCiAgICAgICAgICAgICd1cmwnICAgPT4gaG9tZV91cmwoKSwKICAgICAgICAgICAgJ2xvZ28nICA9PiBbCiAgICAgICAgICAgICAgICAnQHR5cGUnICA9PiAnSW1hZ2VPYmplY3QnLAogICAgICAgICAgICAgICAgJ3VybCcgICAgPT4gJ2h0dHBzOi8vbWFkYWxpbmdlb3JnZWdyb3phLnJvL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzAyL0lNR18wNjMxLmpwZycsCiAgICAgICAgICAgICAgICAnd2lkdGgnICA9PiAxMzIwLAogICAgICAgICAgICAgICAgJ2hlaWdodCcgPT4gNTYwLAogICAgICAgICAgICBdLAogICAgICAgIF0sCiAgICAgICAgJ2luTGFuZ3VhZ2UnICAgID0+ICdyby1STycsCiAgICBdOwoKICAgICR0aHVtYl9pZCA9IGdldF9wb3N0X3RodW1ibmFpbF9pZCgkcG9zdC0+SUQpOwogICAgaWYgKCR0aHVtYl9pZCkgewogICAgICAgICRpbWcgPSB3cF9nZXRfYXR0YWNobWVudF9pbWFnZV9zcmMoJHRodW1iX2lkLCAnZnVsbCcpOwogICAgICAgIGlmICgkaW1nKSB7CiAgICAgICAgICAgICRzY2hlbWFbJ2ltYWdlJ10gPSBbCiAgICAgICAgICAgICAgICAnQHR5cGUnICA9PiAnSW1hZ2VPYmplY3QnLAogICAgICAgICAgICAgICAgJ3VybCcgICAgPT4gJGltZ1swXSwKICAgICAgICAgICAgICAgICd3aWR0aCcgID0+IChpbnQpICRpbWdbMV0sCiAgICAgICAgICAgICAgICAnaGVpZ2h0JyA9PiAoaW50KSAkaW1nWzJdLAogICAgICAgICAgICBdOwogICAgICAgIH0KICAgIH0KCiAgICAkZXhjZXJwdCA9IGdldF90aGVfZXhjZXJwdCgkcG9zdCk7CiAgICBpZiAoJGV4Y2VycHQpIHsKICAgICAgICAkc2NoZW1hWydkZXNjcmlwdGlvbiddID0gd3Bfc3RyaXBfYWxsX3RhZ3MoJGV4Y2VycHQpOwogICAgfQoKICAgIHJldHVybiAkc2NoZW1hOwp9CgpmdW5jdGlvbiBtZ2dfcm9fZGF0ZV90b19pc28oJGRhdGVfcm8sICR0aW1lID0gJycpIHsKICAgIGlmICghJGRhdGVfcm8pIHJldHVybiAnJzsKICAgICRsdW5pID0gWwogICAgICAgICdpYW51YXJpZScgPT4gJzAxJywgJ2ZlYnJ1YXJpZScgPT4gJzAyJywgJ21hcnRpZScgICAgID0+ICcwMycsCiAgICAgICAgJ2FwcmlsaWUnICA9PiAnMDQnLCAnbWFpJyAgICAgICAgPT4gJzA1JywgJ2l1bmllJyAgICAgID0+ICcwNicsCiAgICAgICAgJ2l1bGllJyAgICA9PiAnMDcnLCAnYXVndXN0JyAgICAgPT4gJzA4JywgJ3NlcHRlbWJyaWUnID0+ICcwOScsCiAgICAgICAgJ29jdG9tYnJpZSc9PiAnMTAnLCAnbm9pZW1icmllJyAgPT4gJzExJywgJ2RlY2VtYnJpZScgID0+ICcxMicsCiAgICBdOwogICAgJHBhcnRzID0gcHJlZ19zcGxpdCgnL1xzKy8nLCB0cmltKCRkYXRlX3JvKSk7CiAgICBpZiAoY291bnQoJHBhcnRzKSA8IDMpIHJldHVybiAnJzsKICAgICR6aSAgID0gc3RyX3BhZCgoaW50KSRwYXJ0c1swXSwgMiwgJzAnLCBTVFJfUEFEX0xFRlQpOwogICAgJGx1bmEgPSAkbHVuaVtzdHJ0b2xvd2VyKCRwYXJ0c1sxXSldID8/ICcnOwogICAgJGFuICAgPSAkcGFydHNbMl07CiAgICBpZiAoISRsdW5hIHx8ICEkYW4pIHJldHVybiAnJzsKICAgICRpc28gPSAieyRhbn0teyRsdW5hfS17JHppfSI7CiAgICBpZiAoJHRpbWUpIHsKICAgICAgICAkdCA9IHByZWdfcmVwbGFjZSgnL1teMC05Ol0vJywgJycsICR0aW1lKTsKICAgICAgICBpZiAoc3RybGVuKCR0KSA+PSA0KSAkaXNvIC49ICdUJyAuICR0IC4gJzowMCc7CiAgICB9CiAgICByZXR1cm4gJGlzbzsKfQoKLy8g4pSA4pSA4pSAIFNob3J0Y29kZSBkaXN0cmlidcibaWUgYXJ0aciZdGkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgphZGRfc2hvcnRjb2RlKCdtZ2dfZGlzdHJpYnV0aWUnLCAnbWdnX3NjX2Rpc3RyaWJ1dGllJyk7CmFkZF9zaG9ydGNvZGUoJ21nZ19hcnRpc3QnLCAgICAgJ21nZ19zY19hcnRpc3QnKTsKLy8gQWxpYXN1cmkgc2N1cnRlIChkb2FyIGRhY2EgbnUgc3VudCBkZWphIGlucmVnaXN0cmF0ZSBkZSBhbHQgcGx1Z2luKQphZGRfYWN0aW9uKCdpbml0JywgZnVuY3Rpb24oKSB7CiAgICBpZiAoIXNob3J0Y29kZV9leGlzdHMoJ2Rpc3RyaWJ1dGllJykpIGFkZF9zaG9ydGNvZGUoJ2Rpc3RyaWJ1dGllJywgJ21nZ19zY19kaXN0cmlidXRpZScpOwogICAgaWYgKCFzaG9ydGNvZGVfZXhpc3RzKCdhcnRpc3QnKSkgICAgICBhZGRfc2hvcnRjb2RlKCdhcnRpc3QnLCAgICAgICdtZ2dfc2NfYXJ0aXN0Jyk7Cn0sIDIwKTsKCmZ1bmN0aW9uIG1nZ19zY19kaXN0cmlidXRpZSgkYXR0cywgJGNvbnRlbnQgPSAnJykgewogICAgaWYgKCEkY29udGVudCkgcmV0dXJuICcnOwogICAgJGlubmVyID0gZG9fc2hvcnRjb2RlKCRjb250ZW50KTsKICAgIHJldHVybiAnPGRpdiBjbGFzcz0ibWdnLWRpc3RyaWJ1dGllIj4nIC4gJGlubmVyIC4gJzwvZGl2Pic7Cn0KCmZ1bmN0aW9uIG1nZ19zY19hcnRpc3QoJGF0dHMpIHsKICAgICRhdHRzID0gc2hvcnRjb2RlX2F0dHMoWwogICAgICAgICdudW1lJyA9PiAnJywKICAgICAgICAncm9sJyAgPT4gJycsCiAgICAgICAgJ3ZvY2UnID0+ICcnLAogICAgXSwgJGF0dHMsICdhcnRpc3QnKTsKCiAgICAkbnVtZSA9IHNhbml0aXplX3RleHRfZmllbGQoJGF0dHNbJ251bWUnXSk7CiAgICAkcm9sICA9IHNhbml0aXplX3RleHRfZmllbGQoJGF0dHNbJ3JvbCddKTsKICAgICR2b2NlID0gc2FuaXRpemVfdGV4dF9maWVsZCgkYXR0c1sndm9jZSddKTsKCiAgICBpZiAoISRudW1lKSByZXR1cm4gJyc7CgogICAgJHBvc3QgPSBtZ2dfZmluZF9hcnRpc3QoJG51bWUpOwoKICAgIGlmICghJHBvc3QpIHsKICAgICAgICAvLyBGYWlsLXNhZmU6IGFmaciZZWF6xIMgbnVtZWxlIHNpbXBsdSBmxINyxIMgbGluawogICAgICAgICRsYWJlbCAgPSAkdm9jZSA/ICI8c21hbGw+eyR2b2NlfTwvc21hbGw+IiA6ICcnOwogICAgICAgICRyb2xfZWwgPSAkcm9sICA/ICI8c3BhbiBjbGFzcz1cIm1nZy1hcnRpc3Qtcm9sXCI+eyRyb2x9PC9zcGFuPiIgOiAnJzsKICAgICAgICByZXR1cm4gJzxkaXYgY2xhc3M9Im1nZy1hcnRpc3QtY2FyZCBtZ2ctYXJ0aXN0LW5vZm91bmQiPicKICAgICAgICAgICAgIC4gIjxzcGFuIGNsYXNzPVwibWdnLWFydGlzdC1uYW1lXCI+eyRudW1lfTwvc3Bhbj57JGxhYmVsfXskcm9sX2VsfTwvZGl2PiI7CiAgICB9CgogICAgJGxpbmsgICAgPSBnZXRfcGVybWFsaW5rKCRwb3N0KTsKICAgICR0aHVtYiAgID0gJyc7CiAgICAkdGh1bWJfaWQgPSBnZXRfcG9zdF90aHVtYm5haWxfaWQoJHBvc3QtPklEKTsKICAgIGlmICgkdGh1bWJfaWQpIHsKICAgICAgICAkaW1nID0gd3BfZ2V0X2F0dGFjaG1lbnRfaW1hZ2Vfc3JjKCR0aHVtYl9pZCwgJ3RodW1ibmFpbCcpOwogICAgICAgIGlmICgkaW1nKSB7CiAgICAgICAgICAgICR0aHVtYiA9ICI8aW1nIHNyYz1cInskaW1nWzBdfVwiIGFsdD1cIiIgLiBlc2NfYXR0cigkbnVtZSkgLiAiXCIgIgogICAgICAgICAgICAgICAgICAgLiAid2lkdGg9XCJ7JGltZ1sxXX1cIiBoZWlnaHQ9XCJ7JGltZ1syXX1cIiBsb2FkaW5nPVwibGF6eVwiPiI7CiAgICAgICAgfQogICAgfQoKICAgICR2b2NlX2VsID0gJHZvY2UgPyAiPHNtYWxsIGNsYXNzPVwibWdnLWFydGlzdC12b2NlXCI+eyR2b2NlfTwvc21hbGw+IiA6ICcnOwogICAgJHJvbF9lbCAgPSAkcm9sICA/ICI8c3BhbiBjbGFzcz1cIm1nZy1hcnRpc3Qtcm9sXCI+eyRyb2x9PC9zcGFuPiIgOiAnJzsKCiAgICByZXR1cm4gJzxkaXYgY2xhc3M9Im1nZy1hcnRpc3QtY2FyZCI+JwogICAgICAgICAuICI8YSBocmVmPVwieyRsaW5rfVwiIGNsYXNzPVwibWdnLWFydGlzdC1saW5rXCI+IgogICAgICAgICAuICR0aHVtYgogICAgICAgICAuICI8c3BhbiBjbGFzcz1cIm1nZy1hcnRpc3QtbmFtZVwiPnskbnVtZX08L3NwYW4+IgogICAgICAgICAuICR2b2NlX2VsCiAgICAgICAgIC4gIjwvYT4iCiAgICAgICAgIC4gJHJvbF9lbAogICAgICAgICAuICc8L2Rpdj4nOwp9CgpmdW5jdGlvbiBtZ2dfZmluZF9hcnRpc3QoJG5hbWUpIHsKICAgIHN0YXRpYyAkY2FjaGUgPSBbXTsKICAgIGlmIChpc3NldCgkY2FjaGVbJG5hbWVdKSkgcmV0dXJuICRjYWNoZVskbmFtZV07CgogICAgLy8gQ2F1dGEgZGlyZWN0IGluIERCIGR1cGEgcG9zdF9uYW1lIChzbHVnKSDigJQgYnlwYXNzZXMgcmVzdHJpY3RpaSBDUFQgcHVibGljbHlfcXVlcnlhYmxlCiAgICBnbG9iYWwgJHdwZGI7CiAgICAkc2x1ZyAgICA9IHNhbml0aXplX3RpdGxlKCRuYW1lKTsKICAgICRwb3N0X2lkID0gJHdwZGItPmdldF92YXIoJHdwZGItPnByZXBhcmUoCiAgICAgICAgIlNFTEVDVCBJRCBGUk9NIHskd3BkYi0+cG9zdHN9CiAgICAgICAgIFdIRVJFIHBvc3RfbmFtZSA9ICVzIEFORCBwb3N0X3N0YXR1cyA9ICdwdWJsaXNoJyBBTkQgcG9zdF90eXBlID0gJ2FydGlzdGknCiAgICAgICAgIExJTUlUIDEiLAogICAgICAgICRzbHVnCiAgICApKTsKCiAgICAkcmVzdWx0ID0gJHBvc3RfaWQgPyBnZXRfcG9zdCgoaW50KSAkcG9zdF9pZCkgOiBudWxsOwogICAgJGNhY2hlWyRuYW1lXSA9ICRyZXN1bHQ7CiAgICByZXR1cm4gJHJlc3VsdDsKfQoKZnVuY3Rpb24gbWdnX2Rpc3RyaWJ1dGllX3N0eWxlcygpIHsKICAgIGlmICghaXNfc2luZ3VsYXIoKSkgcmV0dXJuOwogICAgZWNobyAnPHN0eWxlPgoubWdnLWRpc3RyaWJ1dGlle2Rpc3BsYXk6ZmxleDtmbGV4LXdyYXA6d3JhcDtnYXA6MTJweDttYXJnaW46MjBweCAwO30KLm1nZy1hcnRpc3QtY2FyZHtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2FsaWduLWl0ZW1zOmNlbnRlcjt0ZXh0LWFsaWduOmNlbnRlcjsKICB3aWR0aDoxMjBweDtmb250LXNpemU6MTNweDtsaW5lLWhlaWdodDoxLjQ7fQoubWdnLWFydGlzdC1saW5re2NvbG9yOmluaGVyaXQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7fQoubWdnLWFydGlzdC1saW5rOmhvdmVyIC5tZ2ctYXJ0aXN0LW5hbWV7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9Ci5tZ2ctYXJ0aXN0LWNhcmQgaW1ne3dpZHRoOjkwcHg7aGVpZ2h0OjkwcHg7b2JqZWN0LWZpdDpjb3Zlcjtib3JkZXItcmFkaXVzOjUwJTsKICBkaXNwbGF5OmJsb2NrO21hcmdpbjowIGF1dG8gNnB4O30KLm1nZy1hcnRpc3QtbmFtZXtkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojMWExYTFhO30KLm1nZy1hcnRpc3Qtdm9jZXtkaXNwbGF5OmJsb2NrO2NvbG9yOiM4ODg7Zm9udC1zaXplOjExcHg7bWFyZ2luLXRvcDoycHg7fQoubWdnLWFydGlzdC1yb2x7ZGlzcGxheTpibG9jaztjb2xvcjojOEIwMDAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtc3R5bGU6aXRhbGljO21hcmdpbi10b3A6NHB4O30KLm1nZy1hcnRpc3Qtbm9mb3VuZCAubWdnLWFydGlzdC1uYW1le2NvbG9yOiM1NTU7fQpAbWVkaWEobWF4LXdpZHRoOjQ4MHB4KXsubWdnLWRpc3RyaWJ1dGlle2dhcDo4cHg7fS5tZ2ctYXJ0aXN0LWNhcmR7d2lkdGg6OTBweDt9fQo8L3N0eWxlPicgLiAiXG4iOwp9CmFkZF9hY3Rpb24oJ3dwX2hlYWQnLCAnbWdnX2Rpc3RyaWJ1dGllX3N0eWxlcycsIDUpOwoKLy8g4pSA4pSA4pSAIEF1dGhvciBib3ggcGUgcmVjZW56aWkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgphZGRfZmlsdGVyKCd0aGVfY29udGVudCcsICdtZ2dfYXV0aG9yX2JveF9hcHBlbmQnLCAzMCk7CgpmdW5jdGlvbiBtZ2dfYXV0aG9yX2JveF9hcHBlbmQoJGNvbnRlbnQpIHsKICAgIGlmICghaXNfc2luZ3VsYXIoJ3Bvc3QnKSkgcmV0dXJuICRjb250ZW50OwogICAgJHBvc3QgPSBnZXRfcG9zdCgpOwogICAgaWYgKCEkcG9zdCB8fCAhaGFzX2NhdGVnb3J5KCdyZWNlbnppaScsICRwb3N0KSkgcmV0dXJuICRjb250ZW50OwoKICAgICRhdXRob3JfdXJsICAgPSAnaHR0cHM6Ly9tYWRhbGluZ2VvcmdlZ3JvemEucm8vbWFkYWxpbi1nZW9yZ2UtZ3JvemEtdGVub3ItY3JpdGljLW11emljYWwvJzsKICAgICRhdXRob3JfaW1nICAgPSAnaHR0cHM6Ly9tYWRhbGluZ2VvcmdlZ3JvemEucm8vd3AtY29udGVudC91cGxvYWRzLzIwMjYvMDIvSU1HXzA2MzEuanBnJzsKICAgICRzb2NpYWwgPSBbCiAgICAgICAgWydUaWtUb2snLCAgICAnaHR0cHM6Ly93d3cudGlrdG9rLmNvbS9AbWFkYWxpbi5ncm96YS5vcGVyYSddLAogICAgICAgIFsnRmFjZWJvb2snLCAgJ2h0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9tYWRhbGluZ2VvcmdlZ3JvemEnXSwKICAgICAgICBbJ0luc3RhZ3JhbScsICdodHRwczovL3d3dy5pbnN0YWdyYW0uY29tL21hZGFsaW4uZ3JvemEub3BlcmEvJ10sCiAgICAgICAgWydZb3VUdWJlJywgICAnaHR0cHM6Ly93d3cueW91dHViZS5jb20vQG1hZGFsaW5nZW9yZ2Vncm96YSddLAogICAgXTsKICAgICRzb2NpYWxfaHRtbCA9ICcnOwogICAgZm9yZWFjaCAoJHNvY2lhbCBhcyBbJGxhYmVsLCAkdXJsXSkgewogICAgICAgICRzb2NpYWxfaHRtbCAuPSAnPGEgaHJlZj0iJyAuIGVzY191cmwoJHVybCkgLiAnIiBjbGFzcz0ibWdnLWFiLXNvY2lhbCIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIiPicgLiAkbGFiZWwgLiAnPC9hPiAnOwogICAgfQoKICAgICRib3ggPSAnPGRpdiBjbGFzcz0ibWdnLWF1dGhvci1ib3giPicKICAgICAgICAgLiAnPGltZyBzcmM9IicgLiBlc2NfdXJsKCRhdXRob3JfaW1nKSAuICciIGFsdD0iTcSDZMSDbGluIEdlb3JnZSBHcm96YSIgY2xhc3M9Im1nZy1hYi1pbWciIHdpZHRoPSI4MCIgaGVpZ2h0PSI4MCIgbG9hZGluZz0ibGF6eSI+JwogICAgICAgICAuICc8ZGl2IGNsYXNzPSJtZ2ctYWItY29udGVudCI+JwogICAgICAgICAuICc8c3Ryb25nIGNsYXNzPSJtZ2ctYWItbmFtZSI+PGEgaHJlZj0iJyAuIGVzY191cmwoJGF1dGhvcl91cmwpIC4gJyI+TcSDZMSDbGluIEdlb3JnZSBHcm96YTwvYT48L3N0cm9uZz4nCiAgICAgICAgIC4gJzxwIGNsYXNzPSJtZ2ctYWItYmlvIj5UZW5vciwgY3JpdGljIG11emljYWwgyJlpIGJsb2dnZXIuIFNjcmllIGRlc3ByZSBvcGVyxIMsIG11emljxIMgY2xhc2ljxIMgyJlpIHNwZWN0YWNvbGUgZGluIFJvbcOibmlhIMiZaSBFdXJvcGEuPC9wPicKICAgICAgICAgLiAnPGRpdiBjbGFzcz0ibWdnLWFiLXNvY2lhbHMiPicgLiB0cmltKCRzb2NpYWxfaHRtbCkgLiAnPC9kaXY+JwogICAgICAgICAuICc8L2Rpdj4nCiAgICAgICAgIC4gJzwvZGl2Pic7CgogICAgcmV0dXJuICRjb250ZW50IC4gJGJveDsKfQoKYWRkX2FjdGlvbignd3BfaGVhZCcsICdtZ2dfYXV0aG9yX2JveF9zdHlsZXMnLCA1KTsKZnVuY3Rpb24gbWdnX2F1dGhvcl9ib3hfc3R5bGVzKCkgewogICAgaWYgKCFpc19zaW5ndWxhcigncG9zdCcpKSByZXR1cm47CiAgICAkcG9zdCA9IGdldF9wb3N0KCk7CiAgICBpZiAoISRwb3N0IHx8ICFoYXNfY2F0ZWdvcnkoJ3JlY2VuemlpJywgJHBvc3QpKSByZXR1cm47CiAgICBlY2hvICc8c3R5bGU+Ci5tZ2ctYXV0aG9yLWJveHtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6ZmxleC1zdGFydDtnYXA6MTZweDttYXJnaW46MzJweCAwIDE2cHg7cGFkZGluZzoyMHB4OwogIGJhY2tncm91bmQ6I2Y5ZjlmOTtib3JkZXItbGVmdDozcHggc29saWQgIzhCMDAwMDtib3JkZXItcmFkaXVzOjJweDt9Ci5tZ2ctYWItaW1ne3dpZHRoOjgwcHg7aGVpZ2h0OjgwcHg7Ym9yZGVyLXJhZGl1czo1MCU7b2JqZWN0LWZpdDpjb3ZlcjtmbGV4LXNocmluazowO30KLm1nZy1hYi1jb250ZW50e2ZsZXg6MTttaW4td2lkdGg6MDt9Ci5tZ2ctYWItbmFtZXtkaXNwbGF5OmJsb2NrO2ZvbnQtc2l6ZToxNXB4O21hcmdpbi1ib3R0b206NnB4O30KLm1nZy1hYi1uYW1lIGF7Y29sb3I6IzFhMWExYTt0ZXh0LWRlY29yYXRpb246bm9uZTt9Ci5tZ2ctYWItbmFtZSBhOmhvdmVye2NvbG9yOiM4QjAwMDA7fQoubWdnLWFiLWJpb3ttYXJnaW46MCAwIDhweDtmb250LXNpemU6MTNweDtjb2xvcjojNTU1O2xpbmUtaGVpZ2h0OjEuNTt9Ci5tZ2ctYWItc29jaWFse2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1yaWdodDo4cHg7Zm9udC1zaXplOjEycHg7Y29sb3I6IzhCMDAwMDsKICB0ZXh0LWRlY29yYXRpb246bm9uZTtib3JkZXItYm90dG9tOjFweCBkb3R0ZWQgIzhCMDAwMDt9Ci5tZ2ctYWItc29jaWFsOmhvdmVye2NvbG9yOiM1YTAwMDA7fQpAbWVkaWEobWF4LXdpZHRoOjQ4MHB4KXsubWdnLWF1dGhvci1ib3h7ZmxleC1kaXJlY3Rpb246Y29sdW1uO30ubWdnLWFiLWltZ3t3aWR0aDo2MHB4O2hlaWdodDo2MHB4O319Cjwvc3R5bGU+JyAuICJcbiI7Cn0K Gabriella Ingram | madalingeorgegroza.ro

Gabriella Ingram

# Gabriella Ingram

Gabriella Ingram este o artistă și muziciană care și-a construit o carieră remarcabilă în domeniul artelor interpretative și designului scen

Dă click pentru a evalua acest articol!
[Total: 0 Media: 0]

# Gabriella Ingram

Gabriella Ingram este o artistă și muziciană care și-a construit o carieră remarcabilă în domeniul artelor interpretative și designului scenic. Cu o dedicație profundă față de arta sa și o abordare inovatoare, Gabriella Ingram s-a impus ca o personalitate respectată în comunitatea artistică internațională, contribuind semnificativ la evoluția teatrului contemporan și a producțiilor muzicale de înaltă calitate.

Formare și debut

Gabriella Ingram a urmat o formare artistică riguroasă, dezvoltând abilitățile sale în domenii multiple care îi permit să se exprime atât ca muziciană, cât și ca vizionară în ceea ce privește designul și conceptualizarea spectacolelor. Studiile sale au cuprins discipline variate, oferindu-i o fundație solidă în înțelegerea teoriei muzicale și a principiilor esteticii scenice.

Debutul său în cariera profesională a marcat începutul unui parcurs plin de experimentare și evoluție continuă. De la început, Gabriella Ingram a demonstrat o capacitate remarcabilă de a integra diverse elemente artistice, creând experiențe imersive pentru publicul spectator. Abordarea sa holistică asupra artei a permis-o să nu rămână limitată la un singur domeniu, ci să exploreze intersecțiile dintre muzică, teatru și design vizual.

Cariera

De-a lungul carierei sale, Gabriella Ingram a lucrat cu diverse producții și instituții culturale prestigioase. Implicarea ei în proiecte importante a demonstrat versatilitatea și capacitatea sa de adaptare la diferite contexte artistice și stiluri de producție. Ca muziciană și consultant artistic, ea a contribuit la realizarea unor spectacole care au atras atenția criticilor și a publicului larg.

Gabriella Ingram a fost implicată în numeroase colaborări cu alți profesioniști din domeniu, ceea ce i-a permis să-și extinză rețeaua și să influențeze pozitiv direcția unor proiecte culturale semnificative. Experiența ei în lucrul cu echipe multidisciplinare a consolidat reputația sa ca o profesioniță de mare valoare, capabilă să aducă o perspectivă nouă asupra provocărilor artistice tradiționale.

Cariera sa s-a caracterizat printr-o căutare constantă a inovației și printr-o angajare față de excellence. Gabriella Ingram nu s-a mulțumit niciodată cu status quo, ci a continuat să-și dezvolte abilitățile și să exploreze noi teritorii artistice. Această atitudine proactivă a rezultat în realizări notabile și în o influență crescândă în cercurile artistice.

Repertoriu și roluri (scenograf)

În calitatea sa de scenograf și designer artistic, Gabriella Ingram a dezvoltat un portofoliu impresionant de lucrări care demonstrează o înțelegere profundă a limbajului vizual și a modului în care spațiul scenic poate amplifica impactul unei producții. Abordarea sa la design scenografic reflectă o curiozitate intelectuală și o sensibilitate estetică deosebită.

Lucrările sale scenografice se caracterizează printr-o atenție minuțioasă la detalii și printr-o capacitate de a crea medii care susțin și îmbogățesc narațiunea dramatică. Gabriella Ingram a experimentat cu diverse materiale, forme și concepte, demonstrând o înțelegere sofisticată a modului în care designul scenic poate transforma perceția spectatorului asupra unui spectacol.

Rolurile sale în diferite producții au fost caracterizate printr-un grad ridicat de responsabilitate și creație. Ca scenograf, Gabriella Ingram a lucrat la realizarea viziunii artistice a regizorilor și a altor membri ai echipei creative, aducând o perspectivă personală și inovatoare. Implicarea ei în aspectele conceptuale și executorii ale designului scenic a demonstrat o competență tehnică solidă și o imaginație artistică fecundă.

Recunoaștere

Munca dedicată a Gabriella Ingram a fost recunoscută de colegi și de critici din domeniu. Contribuțiile sale la arta teatrului și a producțiilor muzicale au fost apreciate pentru originalitate și pentru calitatea execuției. Respectul pe care l-a câștigat în comunitatea artistică reflectă angajamentul ei constant față de excellence și inovație.

Gabriella Ingram a dobândit o reputație solidă ca o profesioniță care aduce valoare semnificativă oricărui proiect în care este implicată. Recunoașterea acestei valori s-a manifestat prin invitațiile la colaborări cu instituții și producători de prestigiu, ceea ce a permis-o să continue să evolueze și să influențeze pozitiv landscape-ul cultural.

Dă click pentru a evalua acest articol!
[Total: 0 Media: 0]
Partajează

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *