internal/templates/PSFTests-1.0.0.0.xml
<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
<Obj RefId="0"> <TN RefId="0"> <T>PSModuleDevelopment.Template.Template</T> <T>System.Object</T> </TN> <ToString>PSModuleDevelopment.Template.Template</ToString> <Props> <S N="Name">PSFTests</S> <Obj N="Type" RefId="1"> <TN RefId="1"> <T>PSModuleDevelopment.Template.TemplateType</T> <T>System.Enum</T> <T>System.ValueType</T> <T>System.Object</T> </TN> <ToString>Project</ToString> <I32>1</I32> </Obj> <Version N="Version">1.0.0.0</Version> <S N="Description">The PSFramework-based standard test suite for a PowerShell Module</S> <S N="Author">Friedrich Weinmann</S> <DT N="CreatedOn">2018-10-20T00:00:00+00:00</DT> <Obj N="Tags" RefId="2"> <TN RefId="2"> <T>System.Collections.Generic.List`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]</T> <T>System.Object</T> </TN> <LST> <S>Tests</S> <S>PSFramework</S> </LST> </Obj> <Obj N="Parameters" RefId="3"> <TNRef RefId="2" /> <LST> <S>name</S> </LST> </Obj> <Obj N="Scripts" RefId="4"> <TN RefId="3"> <T>System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[PSModuleDevelopment.Template.ParameterScript, PSModuleDevelopment, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null]]</T> <T>System.Object</T> </TN> <DCT> <En> <S N="Key">testfolder</S> <Obj N="Value" RefId="5"> <TN RefId="4"> <T>PSModuleDevelopment.Template.ParameterScript</T> <T>System.Object</T> </TN> <ToString>PSModuleDevelopment.Template.ParameterScript</ToString> <Props> <S N="StringScript">_x000D__x000A__x0009__x0009__x0009__x000D__x000A__x0009__x0009_</S> <S N="Name">testfolder</S> <SBK N="ScriptBlock">_x000D__x000A__x0009__x0009__x0009__x000D__x000A__x0009__x0009_</SBK> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAwDAAAAX1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24sIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1BQEAAAAsUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQCAAAABE5hbWULU2NyaXB0QmxvY2sBBDtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlNjcmlwdEJsb2NrU2VyaWFsaXphdGlvbkhlbHBlcgMAAAACAAAABgQAAAAKdGVzdGZvbGRlcgkFAAAABQUAAAA7U3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5TY3JpcHRCbG9ja1NlcmlhbGl6YXRpb25IZWxwZXIBAAAAClNjcmlwdFRleHQBAwAAAAYGAAAACQ0KCQkJDQoJCQs=</BA> </MS> </Obj> </En> <En> <S N="Key">guid</S> <Obj N="Value" RefId="6"> <TNRef RefId="4" /> <ToString>PSModuleDevelopment.Template.ParameterScript</ToString> <Props> <S N="StringScript">_x000D__x000A__x0009__x0009__x0009_[System.Guid]::NewGuid().ToString()_x000D__x000A__x0009__x0009_</S> <S N="Name">guid</S> <SBK N="ScriptBlock">_x000D__x000A__x0009__x0009__x0009_[System.Guid]::NewGuid().ToString()_x000D__x000A__x0009__x0009_</SBK> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAwDAAAAX1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24sIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1BQEAAAAsUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQCAAAABE5hbWULU2NyaXB0QmxvY2sBBDtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlNjcmlwdEJsb2NrU2VyaWFsaXphdGlvbkhlbHBlcgMAAAACAAAABgQAAAAEZ3VpZAkFAAAABQUAAAA7U3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5TY3JpcHRCbG9ja1NlcmlhbGl6YXRpb25IZWxwZXIBAAAAClNjcmlwdFRleHQBAwAAAAYGAAAALA0KCQkJW1N5c3RlbS5HdWlkXTo6TmV3R3VpZCgpLlRvU3RyaW5nKCkNCgkJCw==</BA> </MS> </Obj> </En> <En> <S N="Key">testresults</S> <Obj N="Value" RefId="7"> <TNRef RefId="4" /> <ToString>PSModuleDevelopment.Template.ParameterScript</ToString> <Props> <S N="StringScript">_x000D__x000A__x0009__x0009__x0009_@'_x000D__x000A_$results = Invoke-Pester -Script $file.FullName -Show $Show -PassThru_x000D__x000A_'@_x000D__x000A__x0009__x0009_</S> <S N="Name">testresults</S> <SBK N="ScriptBlock">_x000D__x000A__x0009__x0009__x0009_@'_x000D__x000A_$results = Invoke-Pester -Script $file.FullName -Show $Show -PassThru_x000D__x000A_'@_x000D__x000A__x0009__x0009_</SBK> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAwDAAAAX1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24sIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1BQEAAAAsUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQCAAAABE5hbWULU2NyaXB0QmxvY2sBBDtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlNjcmlwdEJsb2NrU2VyaWFsaXphdGlvbkhlbHBlcgMAAAACAAAABgQAAAALdGVzdHJlc3VsdHMJBQAAAAUFAAAAO1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uU2NyaXB0QmxvY2tTZXJpYWxpemF0aW9uSGVscGVyAQAAAApTY3JpcHRUZXh0AQMAAAAGBgAAAFYNCgkJCUAnDQokcmVzdWx0cyA9IEludm9rZS1QZXN0ZXIgLVNjcmlwdCAkZmlsZS5GdWxsTmFtZSAtU2hvdyAkU2hvdyAtUGFzc1RocnUNCidADQoJCQs=</BA> </MS> </Obj> </En> </DCT> </Obj> <Obj N="Children" RefId="8"> <TN RefId="5"> <T>System.Collections.Generic.List`1[[PSModuleDevelopment.Template.TemplateItemBase, PSModuleDevelopment, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null]]</T> <T>System.Object</T> </TN> <LST> <Obj RefId="9"> <TN RefId="6"> <T>PSModuleDevelopment.Template.TemplateItemFolder</T> <T>PSModuleDevelopment.Template.TemplateItemBase</T> <T>System.Object</T> </TN> <ToString>PSModuleDevelopment.Template.TemplateItemFolder</ToString> <Props> <Obj N="Children" RefId="10"> <TNRef RefId="5" /> <LST> <S>PSModuleDevelopment.Template.TemplateItemFile</S> </LST> </Obj> <S N="Name">functions</S> <S N="RelativePath">functions</S> <S N="Identifier">þ</S> <Obj N="FileSystemParameterFlat" RefId="11"> <TNRef RefId="2" /> <LST /> </Obj> <Obj N="FileSystemParameterScript" RefId="12"> <TNRef RefId="2" /> <LST /> </Obj> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAL1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRm9sZGVyBgAAAAhDaGlsZHJlbgROYW1lDFJlbGF0aXZlUGF0aApJZGVudGlmaWVyF0ZpbGVTeXN0ZW1QYXJhbWV0ZXJGbGF0GUZpbGVTeXN0ZW1QYXJhbWV0ZXJTY3JpcHQDAQEBAwOeAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAJAwAAAAYEAAAACWZ1bmN0aW9ucwYFAAAACWZ1bmN0aW9ucwYGAAAAAsO+CQcAAAAJCAAAAAQDAAAAngFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZSwgUFNNb2R1bGVEZXZlbG9wbWVudCwgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxdXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBAAAL1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZVtdAgAAAAgICQkAAAABAAAAAQAAAAQHAAAAf1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgYAAAgICQoAAAAAAAAAAAAAAAEIAAAABwAAAAkKAAAAAAAAAAAAAAAHCQAAAAABAAAABAAAAAQtUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlAgAAAAkLAAAADQMRCgAAAAAAAAAFCwAAAC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUZpbGUJAAAABVZhbHVlCVBsYWluVGV4dBRDb250ZW50UGFyYW1ldGVyRmxhdBZDb250ZW50UGFyYW1ldGVyU2NyaXB0BE5hbWUMUmVsYXRpdmVQYXRoCklkZW50aWZpZXIXRmlsZVN5c3RlbVBhcmFtZXRlckZsYXQZRmlsZVN5c3RlbVBhcmFtZXRlclNjcmlwdAEAAwMBAQEDAwF/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAGDAAAANUBIyBEZXNjcmlwdGlvbg0KDQpUaGlzIGlzIHdoZXJlIHRoZSBmdW5jdGlvbiB0ZXN0cyBnby4NCg0KTWFrZSBzdXJlIHRvIHB1dCB0aGVtIGluIGZvbGRlcnMgcmVmbGVjdGluZyB0aGUgYWN0dWFsIG1vZHVsZSBzdHJ1Y3R1cmUuDQoNCkl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGludGVybmFsIGFuZCBwdWJsaWMgZnVuY3Rpb25zIGhlcmUuAQkNAAAACQ4AAAAGDwAAAAlyZWFkbWUubWQGEAAAABNmdW5jdGlvbnNccmVhZG1lLm1kCQYAAAAJEgAAAAkTAAAAAQ0AAAAHAAAACQoAAAAAAAAAAAAAAAEOAAAABwAAAAkKAAAAAAAAAAAAAAABEgAAAAcAAAAJCgAAAAAAAAAAAAAAARMAAAAHAAAACQoAAAAAAAAAAAAAAAs=</BA> </MS> </Obj> <Obj RefId="13"> <TNRef RefId="6" /> <ToString>PSModuleDevelopment.Template.TemplateItemFolder</ToString> <Props> <Obj N="Children" RefId="14"> <TNRef RefId="5" /> <LST> <S>PSModuleDevelopment.Template.TemplateItemFile</S> <S>PSModuleDevelopment.Template.TemplateItemFile</S> <S>PSModuleDevelopment.Template.TemplateItemFile</S> <S>PSModuleDevelopment.Template.TemplateItemFile</S> <S>PSModuleDevelopment.Template.TemplateItemFile</S> <S>PSModuleDevelopment.Template.TemplateItemFile</S> </LST> </Obj> <S N="Name">general</S> <S N="RelativePath">general</S> <S N="Identifier">þ</S> <Obj N="FileSystemParameterFlat" RefId="15"> <TNRef RefId="2" /> <LST /> </Obj> <Obj N="FileSystemParameterScript" RefId="16"> <TNRef RefId="2" /> <LST /> </Obj> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAL1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRm9sZGVyBgAAAAhDaGlsZHJlbgROYW1lDFJlbGF0aXZlUGF0aApJZGVudGlmaWVyF0ZpbGVTeXN0ZW1QYXJhbWV0ZXJGbGF0GUZpbGVTeXN0ZW1QYXJhbWV0ZXJTY3JpcHQDAQEBAwOeAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAJAwAAAAYEAAAAB2dlbmVyYWwGBQAAAAdnZW5lcmFsBgYAAAACw74JBwAAAAkIAAAABAMAAACeAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24EAAAvUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlW10CAAAACAgJCQAAAAYAAAAGAAAABAcAAAB/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBgAACAgJCgAAAAAAAAAAAAAAAQgAAAAHAAAACQoAAAAAAAAAAAAAAAcJAAAAAAEAAAAIAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACQsAAAAJDAAAAAkNAAAACQ4AAAAJDwAAAAkQAAAADQIRCgAAAAAAAAAFCwAAAC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUZpbGUJAAAABVZhbHVlCVBsYWluVGV4dBRDb250ZW50UGFyYW1ldGVyRmxhdBZDb250ZW50UGFyYW1ldGVyU2NyaXB0BE5hbWUMUmVsYXRpdmVQYXRoCklkZW50aWZpZXIXRmlsZVN5c3RlbVBhcmFtZXRlckZsYXQZRmlsZVN5c3RlbVBhcmFtZXRlclNjcmlwdAEAAwMBAQEDAwF/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAGEQAAAMwEIyBMaXN0IG9mIGZvcmJpZGRlbiBjb21tYW5kcw0KJGdsb2JhbDpCYW5uZWRDb21tYW5kcyA9IEAoDQoJJ1dyaXRlLUhvc3QnLA0KCSdXcml0ZS1WZXJib3NlJywNCgknV3JpdGUtV2FybmluZycsDQoJJ1dyaXRlLUVycm9yJywNCgknV3JpdGUtT3V0cHV0JywNCgknV3JpdGUtSW5mb3JtYXRpb24nLA0KCSdXcml0ZS1EZWJ1ZycNCikNCg0KPCMNCglDb250YWlucyBsaXN0IG9mIGV4Y2VwdGlvbnMgZm9yIGJhbm5lZCBjbWRsZXRzLg0KCUluc2VydCB0aGUgZmlsZSBuYW1lcyBvZiBmaWxlcyB0aGF0IG1heSBjb250YWluIHRoZW0uDQoJDQoJRXhhbXBsZToNCgkiV3JpdGUtSG9zdCIgID0gQCgnV3JpdGUtUFNGSG9zdENvbG9yLnBzMScsJ1dyaXRlLVBTRk1lc3NhZ2UucHMxJykNCiM+DQokZ2xvYmFsOk1heUNvbnRhaW5Db21tYW5kID0gQHsNCgkiV3JpdGUtSG9zdCIgID0gQCgpDQoJIldyaXRlLVZlcmJvc2UiID0gQCgpDQoJIldyaXRlLVdhcm5pbmciID0gQCgpDQoJIldyaXRlLUVycm9yIiAgPSBAKCkNCgkiV3JpdGUtT3V0cHV0IiA9IEAoKQ0KCSJXcml0ZS1JbmZvcm1hdGlvbiIgPSBAKCkNCgkiV3JpdGUtRGVidWciID0gQCgpDQp9AQkSAAAACRMAAAAGFAAAABxGaWxlSW50ZWdyaXR5LkV4Y2VwdGlvbnMucHMxBhUAAAAkZ2VuZXJhbFxGaWxlSW50ZWdyaXR5LkV4Y2VwdGlvbnMucHMxCQYAAAAJFwAAAAkYAAAAAQwAAAALAAAABhkAAACsFiRtb2R1bGVSb290ID0gKFJlc29sdmUtUGF0aCAiJFBTU2NyaXB0Um9vdFwuLlwuLiIpLlBhdGgNCg0KLiAiJFBTU2NyaXB0Um9vdFxGaWxlSW50ZWdyaXR5LkV4Y2VwdGlvbnMucHMxIg0KDQpmdW5jdGlvbiBHZXQtRmlsZUVuY29kaW5nDQp7DQo8Iw0KCS5TWU5PUFNJUw0KCQlUZXN0cyBhIGZpbGUgZm9yIGVuY29kaW5nLg0KCQ0KCS5ERVNDUklQVElPTg0KCQlUZXN0cyBhIGZpbGUgZm9yIGVuY29kaW5nLg0KCQ0KCS5QQVJBTUVURVIgUGF0aA0KCQlUaGUgZmlsZSB0byB0ZXN0DQojPg0KCVtDbWRsZXRCaW5kaW5nKCldDQoJUGFyYW0gKA0KCQlbUGFyYW1ldGVyKE1hbmRhdG9yeSA9ICRUcnVlLCBWYWx1ZUZyb21QaXBlbGluZUJ5UHJvcGVydHlOYW1lID0gJFRydWUpXQ0KCQlbQWxpYXMoJ0Z1bGxOYW1lJyldDQoJCVtzdHJpbmddDQoJCSRQYXRoDQoJKQ0KCQ0KCVtieXRlW11dJGJ5dGUgPSBnZXQtY29udGVudCAtRW5jb2RpbmcgYnl0ZSAtUmVhZENvdW50IDQgLVRvdGFsQ291bnQgNCAtUGF0aCAkUGF0aA0KCQ0KCWlmICgkYnl0ZVswXSAtZXEgMHhlZiAtYW5kICRieXRlWzFdIC1lcSAweGJiIC1hbmQgJGJ5dGVbMl0gLWVxIDB4YmYpIHsgJ1VURjgnIH0NCgllbHNlaWYgKCRieXRlWzBdIC1lcSAweGZlIC1hbmQgJGJ5dGVbMV0gLWVxIDB4ZmYpIHsgJ1VuaWNvZGUnIH0NCgllbHNlaWYgKCRieXRlWzBdIC1lcSAwIC1hbmQgJGJ5dGVbMV0gLWVxIDAgLWFuZCAkYnl0ZVsyXSAtZXEgMHhmZSAtYW5kICRieXRlWzNdIC1lcSAweGZmKSB7ICdVVEYzMicgfQ0KCWVsc2VpZiAoJGJ5dGVbMF0gLWVxIDB4MmIgLWFuZCAkYnl0ZVsxXSAtZXEgMHgyZiAtYW5kICRieXRlWzJdIC1lcSAweDc2KSB7ICdVVEY3JyB9DQoJZWxzZSB7ICdVbmtub3duJyB9DQp9DQoNCkRlc2NyaWJlICJWZXJpZnlpbmcgaW50ZWdyaXR5IG9mIG1vZHVsZSBmaWxlcyIgew0KCUNvbnRleHQgIlZhbGlkYXRpbmcgUFMxIFNjcmlwdCBmaWxlcyIgew0KCQkkYWxsRmlsZXMgPSBHZXQtQ2hpbGRJdGVtIC1QYXRoICRtb2R1bGVSb290IC1SZWN1cnNlIC1GaWx0ZXIgIioucHMxIiB8IFdoZXJlLU9iamVjdCBGdWxsTmFtZSAtTm90TGlrZSAiJG1vZHVsZVJvb3RcdGVzdHNcKiINCgkJDQoJCWZvcmVhY2ggKCRmaWxlIGluICRhbGxGaWxlcykNCgkJew0KCQkJJG5hbWUgPSAkZmlsZS5GdWxsTmFtZS5SZXBsYWNlKCIkbW9kdWxlUm9vdFwiLCAnJykNCgkJCQ0KCQkJSXQgIlskbmFtZV0gU2hvdWxkIGhhdmUgVVRGOCBlbmNvZGluZyIgew0KCQkJCUdldC1GaWxlRW5jb2RpbmcgLVBhdGggJGZpbGUuRnVsbE5hbWUgfCBTaG91bGQgLUJlICdVVEY4Jw0KCQkJfQ0KCQkJDQoJCQlJdCAiWyRuYW1lXSBTaG91bGQgaGF2ZSBubyB0cmFpbGluZyBzcGFjZSIgew0KCQkJCSgkZmlsZSB8IFNlbGVjdC1TdHJpbmcgIlxzJCIgfCBXaGVyZS1PYmplY3QgeyAkXy5MaW5lLlRyaW0oKS5MZW5ndGggLWd0IDB9KS5MaW5lTnVtYmVyIHwgU2hvdWxkIC1CZU51bGxPckVtcHR5DQoJCQl9DQoJCQkNCgkJCSR0b2tlbnMgPSAkbnVsbA0KCQkJJHBhcnNlRXJyb3JzID0gJG51bGwNCgkJCSRhc3QgPSBbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5MYW5ndWFnZS5QYXJzZXJdOjpQYXJzZUZpbGUoJGZpbGUuRnVsbE5hbWUsIFtyZWZdJHRva2VucywgW3JlZl0kcGFyc2VFcnJvcnMpDQoJCQkNCgkJCUl0ICJbJG5hbWVdIFNob3VsZCBoYXZlIG5vIHN5bnRheCBlcnJvcnMiIHsNCgkJCQkkcGFyc2VFcnJvcnMgfCBTaG91bGQgQmUgJE51bGwNCgkJCX0NCgkJCQ0KCQkJZm9yZWFjaCAoJGNvbW1hbmQgaW4gJGdsb2JhbDpCYW5uZWRDb21tYW5kcykNCgkJCXsNCgkJCQlpZiAoJGdsb2JhbDpNYXlDb250YWluQ29tbWFuZFsiJGNvbW1hbmQiXSAtbm90Y29udGFpbnMgJGZpbGUuTmFtZSkNCgkJCQl7DQoJCQkJCUl0ICJbJG5hbWVdIFNob3VsZCBub3QgdXNlICRjb21tYW5kIiB7DQoJCQkJCQkkdG9rZW5zIHwgV2hlcmUtT2JqZWN0IFRleHQgLUVRICRjb21tYW5kIHwgU2hvdWxkIC1CZU51bGxPckVtcHR5DQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCQkNCgkJCUl0ICJbJG5hbWVdIFNob3VsZCBub3QgY29udGFpbiBhbGlhc2VzIiB7DQoJCQkJJHRva2VucyB8IFdoZXJlLU9iamVjdCBUb2tlbkZsYWdzIC1lcSBDb21tYW5kTmFtZSB8IFdoZXJlLU9iamVjdCB7IFRlc3QtUGF0aCAiYWxpYXM6XCQoJF8uVGV4dCkiIH0gfCBNZWFzdXJlLU9iamVjdCB8IFNlbGVjdC1PYmplY3QgLUV4cGFuZFByb3BlcnR5IENvdW50IHwgU2hvdWxkIC1CZSAwDQoJCQl9DQoJCX0NCgl9DQoJDQoJQ29udGV4dCAiVmFsaWRhdGluZyBoZWxwLnR4dCBoZWxwIGZpbGVzIiB7DQoJCSRhbGxGaWxlcyA9IEdldC1DaGlsZEl0ZW0gLVBhdGggJG1vZHVsZVJvb3QgLVJlY3Vyc2UgLUZpbHRlciAiKi5oZWxwLnR4dCIgfCBXaGVyZS1PYmplY3QgRnVsbE5hbWUgLU5vdExpa2UgIiRtb2R1bGVSb290XHRlc3RzXCoiDQoJCQ0KCQlmb3JlYWNoICgkZmlsZSBpbiAkYWxsRmlsZXMpDQoJCXsNCgkJCSRuYW1lID0gJGZpbGUuRnVsbE5hbWUuUmVwbGFjZSgiJG1vZHVsZVJvb3RcIiwgJycpDQoJCQkNCgkJCUl0ICJbJG5hbWVdIFNob3VsZCBoYXZlIFVURjggZW5jb2RpbmciIHsNCgkJCQlHZXQtRmlsZUVuY29kaW5nIC1QYXRoICRmaWxlLkZ1bGxOYW1lIHwgU2hvdWxkIC1CZSAnVVRGOCcNCgkJCX0NCgkJCQ0KCQkJSXQgIlskbmFtZV0gU2hvdWxkIGhhdmUgbm8gdHJhaWxpbmcgc3BhY2UiIHsNCgkJCQkoJGZpbGUgfCBTZWxlY3QtU3RyaW5nICJccyQiIHwgV2hlcmUtT2JqZWN0IHsgJF8uTGluZS5UcmltKCkuTGVuZ3RoIC1ndCAwIH0gfCBNZWFzdXJlLU9iamVjdCkuQ291bnQgfCBTaG91bGQgLUJlIDANCgkJCX0NCgkJfQ0KCX0NCn0BCRoAAAAJGwAAAAYcAAAAF0ZpbGVJbnRlZ3JpdHkuVGVzdHMucHMxBh0AAAAfZ2VuZXJhbFxGaWxlSW50ZWdyaXR5LlRlc3RzLnBzMQkGAAAACR8AAAAJIAAAAAENAAAACwAAAAYhAAAAnQUjIExpc3Qgb2YgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQNCiRnbG9iYWw6RnVuY3Rpb25IZWxwVGVzdEV4Y2VwdGlvbnMgPSBAKA0KICAgIA0KKQ0KDQo8Iw0KICBMaXN0IG9mIGFycmF5ZWQgZW51bWVyYXRpb25zLiBUaGVzZSBuZWVkIHRvIGJlIHRyZWF0ZWQgZGlmZmVyZW50bHkuIEFkZCBmdWxsIG5hbWUuDQogIEV4YW1wbGU6DQoNCiAgIlNxbGNvbGxhYm9yYXRpdmUuRGJhdG9vbHMuQ29ubmVjdGlvbi5NYW5hZ2VtZW50Q29ubmVjdGlvblR5cGVbXSINCiM+DQokZ2xvYmFsOkhlbHBUZXN0RW51bWVyYXRlZEFycmF5cyA9IEAoDQoJDQopDQoNCjwjDQogIFNvbWUgdHlwZXMgb24gcGFyYW1ldGVycyBqdXN0IGZhaWwgdGhlaXIgdmFsaWRhdGlvbiBubyBtYXR0ZXIgd2hhdC4NCiAgRm9yIHRob3NlIGl0IGJlY29tZXMgcG9zc2libGUgdG8gc2tpcCB0aGVtLCBieSBhZGRpbmcgdGhlbSB0byB0aGlzIGhhc2h0YWJsZS4NCiAgQWRkIGJ5IGZvbGxvd2luZyB0aGlzIGNvbnZlbnRpb246IDxjb21tYW5kIG5hbWU+ID0gQCg8bGlzdCBvZiBwYXJhbWV0ZXIgbmFtZXM+KQ0KICBFeGFtcGxlOg0KDQogICJHZXQtRGJhQ21PYmplY3QiICAgICAgID0gQCgiRG9Ob3RVc2UiKQ0KIz4NCiRnbG9iYWw6SGVscFRlc3RTa2lwUGFyYW1ldGVyVHlwZSA9IEB7DQogICAgDQp9DQoBCSIAAAAJIwAAAAYkAAAAE0hlbHAuRXhjZXB0aW9ucy5wczEGJQAAABtnZW5lcmFsXEhlbHAuRXhjZXB0aW9ucy5wczEJBgAAAAknAAAACSgAAAABDgAAAAsAAAAGKQAAAP9FPCMNCiAgICAuTk9URVMNCiAgICAgICAgVGhlIG9yaWdpbmFsIHRlc3QgdGhpcyBpcyBiYXNlZCB1cG9uIHdhcyB3cml0dGVuIGJ5IEp1bmUgQmxlbmRlci4NCgkJQWZ0ZXIgc2V2ZXJhbCByb3VuZHMgb2YgbW9kaWZpY2F0aW9ucyBpdCBzdGFuZHMgbm93IGFzIGl0IGlzLCBidXQgdGhlIGhvbm9yIHJlbWFpbnMgaGVycy4NCg0KCQlUaGFuayB5b3UgSnVuZSwgZm9yIGFsbCB5b3UgaGF2ZSBkb25lIQ0KDQogICAgLkRFU0NSSVBUSU9ODQoJCVRoaXMgdGVzdCBldmFsdWF0ZXMgdGhlIGhlbHAgZm9yIGFsbCBjb21tYW5kcyBpbiBhIG1vZHVsZS4NCg0KCS5QQVJBTUVURVIgU2tpcFRlc3QNCgkJRGlzYWJsZXMgdGhpcyB0ZXN0Lg0KCQ0KCS5QQVJBTUVURVIgQ29tbWFuZFBhdGgNCgkJTGlzdCBvZiBwYXRocyB1bmRlciB3aGljaCB0aGUgc2NyaXB0IGZpbGVzIGFyZSBzdG9yZWQuDQoJCVRoaXMgdGVzdCBhc3N1bWVzIHRoYXQgYWxsIGZ1bmN0aW9ucyBoYXZlIHRoZWlyIG93biBmaWxlIHRoYXQgaXMgbmFtZWQgYWZ0ZXIgdGhlbXNlbHZlcy4NCgkJVGhlc2UgcGF0aHMgYXJlIHVzZWQgdG8gc2VhcmNoIGZvciBjb21tYW5kcyB0aGF0IHNob3VsZCBleGlzdCBhbmQgYmUgdGVzdGVkLg0KCQlXaWxsIHNlYXJjaCByZWN1cnNpdmVseSBhbmQgYWNjZXB0cyB3aWxkY2FyZHMsIG1ha2Ugc3VyZSBvbmx5IGZ1bmN0aW9ucyBhcmUgZm91bmQNCg0KCS5QQVJBTUVURVIgTW9kdWxlTmFtZQ0KCQlOYW1lIG9mIHRoZSBtb2R1bGUgdG8gYmUgdGVzdGVkLg0KCQlUaGUgbW9kdWxlIG11c3QgYWxyZWFkeSBiZSBpbXBvcnRlZA0KDQoJLlBBUkFNRVRFUiBFeGNlcHRpb25zRmlsZQ0KCQlGaWxlIGluIHdoaWNoIGV4Y2VwdGlvbnMgYW5kIGFkanVzdG1lbnRzIGFyZSBjb25maWd1cmVkLg0KCQlJbiBpdCB0aGVyZSBzaG91bGQgYmUgdHdvIGFycmF5cyBhbmQgYSBoYXNodGFibGUgZGVmaW5lZDoNCgkJCSRnbG9iYWw6RnVuY3Rpb25IZWxwVGVzdEV4Y2VwdGlvbnMNCgkJCSRnbG9iYWw6SGVscFRlc3RFbnVtZXJhdGVkQXJyYXlzDQoJCQkkZ2xvYmFsOkhlbHBUZXN0U2tpcFBhcmFtZXRlclR5cGUNCgkJVGhlc2UgY2FuIGJlIHVzZWQgdG8gdHdlYWsgdGhlIHRlc3RzIHNsaWdodGx5IGluIGNhc2VzIG9mIG5lZWQuDQoJCVNlZSB0aGUgZXhhbXBsZSBmaWxlIGZvciBleHBsYW5hdGlvbnMgb24gZWFjaCBvZiB0aGVzZSB1c2FnZSBhbmQgZWZmZWN0Lg0KIz4NCltDbWRsZXRCaW5kaW5nKCldDQpQYXJhbSAoDQoJW3N3aXRjaF0NCgkkU2tpcFRlc3QsDQoJDQoJW3N0cmluZ1tdXQ0KCSRDb21tYW5kUGF0aCA9IEAoIiRQU1NjcmlwdFJvb3RcLi5cLi5cZnVuY3Rpb25zIiwgIiRQU1NjcmlwdFJvb3RcLi5cLi5caW50ZXJuYWxcZnVuY3Rpb25zIiksDQoJDQoJW3N0cmluZ10NCgkkTW9kdWxlTmFtZSA9ICLDvm5hbWXDviIsDQoJDQoJW3N0cmluZ10NCgkkRXhjZXB0aW9uc0ZpbGUgPSAiJFBTU2NyaXB0Um9vdFxIZWxwLkV4Y2VwdGlvbnMucHMxIg0KKQ0KaWYgKCRTa2lwVGVzdCkgeyByZXR1cm4gfQ0KLiAkRXhjZXB0aW9uc0ZpbGUNCg0KJGluY2x1ZGVkTmFtZXMgPSAoR2V0LUNoaWxkSXRlbSAkQ29tbWFuZFBhdGggLVJlY3Vyc2UgLUZpbGUgfCBXaGVyZS1PYmplY3QgTmFtZSAtbGlrZSAiKi5wczEiKS5CYXNlTmFtZQ0KJGNvbW1hbmRzID0gR2V0LUNvbW1hbmQgLU1vZHVsZSAoR2V0LU1vZHVsZSAkTW9kdWxlTmFtZSkgLUNvbW1hbmRUeXBlIENtZGxldCwgRnVuY3Rpb24sIFdvcmtmbG93IHwgV2hlcmUtT2JqZWN0IE5hbWUgLWluICRpbmNsdWRlZE5hbWVzDQoNCiMjIFdoZW4gdGVzdGluZyBoZWxwLCByZW1lbWJlciB0aGF0IGhlbHAgaXMgY2FjaGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBzZXNzaW9uLg0KIyMgVG8gdGVzdCwgcmVzdGFydCBzZXNzaW9uLg0KDQoNCmZvcmVhY2ggKCRjb21tYW5kIGluICRjb21tYW5kcykgew0KICAgICRjb21tYW5kTmFtZSA9ICRjb21tYW5kLk5hbWUNCiAgICANCiAgICAjIFNraXAgYWxsIGZ1bmN0aW9ucyB0aGF0IGFyZSBvbiB0aGUgZXhjbHVzaW9ucyBsaXN0DQogICAgaWYgKCRnbG9iYWw6RnVuY3Rpb25IZWxwVGVzdEV4Y2VwdGlvbnMgLWNvbnRhaW5zICRjb21tYW5kTmFtZSkgeyBjb250aW51ZSB9DQogICAgDQogICAgIyBUaGUgbW9kdWxlLXF1YWxpZmllZCBjb21tYW5kIGZhaWxzIG9uIE1pY3Jvc29mdC5Qb3dlclNoZWxsLkFyY2hpdmUgY21kbGV0cw0KICAgICRIZWxwID0gR2V0LUhlbHAgJGNvbW1hbmROYW1lIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlDQogICAgJHRlc3RoZWxwZXJyb3JzID0gMA0KICAgICR0ZXN0aGVscGFsbCA9IDANCiAgICBEZXNjcmliZSAiVGVzdCBoZWxwIGZvciAkY29tbWFuZE5hbWUiIHsNCiAgICAgICAgDQogICAgICAgICR0ZXN0aGVscGFsbCArPSAxDQogICAgICAgIGlmICgkSGVscC5TeW5vcHNpcyAtbGlrZSAnKmBbYDxDb21tb25QYXJhbWV0ZXJzYD5gXSonKSB7DQogICAgICAgICAgICAjIElmIGhlbHAgaXMgbm90IGZvdW5kLCBzeW5vcHNpcyBpbiBhdXRvLWdlbmVyYXRlZCBoZWxwIGlzIHRoZSBzeW50YXggZGlhZ3JhbQ0KICAgICAgICAgICAgSXQgInNob3VsZCBub3QgYmUgYXV0by1nZW5lcmF0ZWQiIHsNCiAgICAgICAgICAgICAgICAkSGVscC5TeW5vcHNpcyB8IFNob3VsZCAtTm90IC1CZUxpa2UgJypgW2A8Q29tbW9uUGFyYW1ldGVyc2A+YF0qJw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHRlc3RoZWxwZXJyb3JzICs9IDENCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgJHRlc3RoZWxwYWxsICs9IDENCiAgICAgICAgaWYgKFtTdHJpbmddOjpJc051bGxPckVtcHR5KCRIZWxwLkRlc2NyaXB0aW9uLlRleHQpKSB7DQogICAgICAgICAgICAjIFNob3VsZCBiZSBhIGRlc2NyaXB0aW9uIGZvciBldmVyeSBmdW5jdGlvbg0KICAgICAgICAgICAgSXQgImdldHMgZGVzY3JpcHRpb24gZm9yICRjb21tYW5kTmFtZSIgew0KICAgICAgICAgICAgICAgICRIZWxwLkRlc2NyaXB0aW9uIHwgU2hvdWxkIC1Ob3QgLUJlTnVsbE9yRW1wdHkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICR0ZXN0aGVscGVycm9ycyArPSAxDQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgICR0ZXN0aGVscGFsbCArPSAxDQogICAgICAgIGlmIChbU3RyaW5nXTo6SXNOdWxsT3JFbXB0eSgoJEhlbHAuRXhhbXBsZXMuRXhhbXBsZSB8IFNlbGVjdC1PYmplY3QgLUZpcnN0IDEpLkNvZGUpKSB7DQogICAgICAgICAgICAjIFNob3VsZCBiZSBhdCBsZWFzdCBvbmUgZXhhbXBsZQ0KICAgICAgICAgICAgSXQgImdldHMgZXhhbXBsZSBjb2RlIGZyb20gJGNvbW1hbmROYW1lIiB7DQogICAgICAgICAgICAgICAgKCRIZWxwLkV4YW1wbGVzLkV4YW1wbGUgfCBTZWxlY3QtT2JqZWN0IC1GaXJzdCAxKS5Db2RlIHwgU2hvdWxkIC1Ob3QgLUJlTnVsbE9yRW1wdHkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICR0ZXN0aGVscGVycm9ycyArPSAxDQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgICR0ZXN0aGVscGFsbCArPSAxDQogICAgICAgIGlmIChbU3RyaW5nXTo6SXNOdWxsT3JFbXB0eSgoJEhlbHAuRXhhbXBsZXMuRXhhbXBsZS5SZW1hcmtzIHwgU2VsZWN0LU9iamVjdCAtRmlyc3QgMSkuVGV4dCkpIHsNCiAgICAgICAgICAgICMgU2hvdWxkIGJlIGF0IGxlYXN0IG9uZSBleGFtcGxlIGRlc2NyaXB0aW9uDQogICAgICAgICAgICBJdCAiZ2V0cyBleGFtcGxlIGhlbHAgZnJvbSAkY29tbWFuZE5hbWUiIHsNCiAgICAgICAgICAgICAgICAoJEhlbHAuRXhhbXBsZXMuRXhhbXBsZS5SZW1hcmtzIHwgU2VsZWN0LU9iamVjdCAtRmlyc3QgMSkuVGV4dCB8IFNob3VsZCAtTm90IC1CZU51bGxPckVtcHR5DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkdGVzdGhlbHBlcnJvcnMgKz0gMQ0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBpZiAoJHRlc3RoZWxwZXJyb3JzIC1lcSAwKSB7DQogICAgICAgICAgICBJdCAiUmFuIHNpbGVudGx5ICR0ZXN0aGVscGFsbCB0ZXN0cyIgew0KICAgICAgICAgICAgICAgICR0ZXN0aGVscGVycm9ycyB8IFNob3VsZCAtYmUgMA0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAkdGVzdHBhcmFtc2FsbCA9IDANCiAgICAgICAgJHRlc3RwYXJhbXNlcnJvcnMgPSAwDQogICAgICAgIENvbnRleHQgIlRlc3QgcGFyYW1ldGVyIGhlbHAgZm9yICRjb21tYW5kTmFtZSIgew0KICAgICAgICAgICAgDQogICAgICAgICAgICAkQ29tbW9uID0gJ0RlYnVnJywgJ0Vycm9yQWN0aW9uJywgJ0Vycm9yVmFyaWFibGUnLCAnSW5mb3JtYXRpb25BY3Rpb24nLCAnSW5mb3JtYXRpb25WYXJpYWJsZScsICdPdXRCdWZmZXInLCAnT3V0VmFyaWFibGUnLA0KICAgICAgICAgICAgJ1BpcGVsaW5lVmFyaWFibGUnLCAnVmVyYm9zZScsICdXYXJuaW5nQWN0aW9uJywgJ1dhcm5pbmdWYXJpYWJsZScNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgJHBhcmFtZXRlcnMgPSAkY29tbWFuZC5QYXJhbWV0ZXJTZXRzLlBhcmFtZXRlcnMgfCBTb3J0LU9iamVjdCAtUHJvcGVydHkgTmFtZSAtVW5pcXVlIHwgV2hlcmUtT2JqZWN0IE5hbWUgLW5vdGluICRjb21tb24NCiAgICAgICAgICAgICRwYXJhbWV0ZXJOYW1lcyA9ICRwYXJhbWV0ZXJzLk5hbWUNCiAgICAgICAgICAgICRIZWxwUGFyYW1ldGVyTmFtZXMgPSAkSGVscC5QYXJhbWV0ZXJzLlBhcmFtZXRlci5OYW1lIHwgU29ydC1PYmplY3QgLVVuaXF1ZQ0KICAgICAgICAgICAgZm9yZWFjaCAoJHBhcmFtZXRlciBpbiAkcGFyYW1ldGVycykgew0KICAgICAgICAgICAgICAgICRwYXJhbWV0ZXJOYW1lID0gJHBhcmFtZXRlci5OYW1lDQogICAgICAgICAgICAgICAgJHBhcmFtZXRlckhlbHAgPSAkSGVscC5wYXJhbWV0ZXJzLnBhcmFtZXRlciB8IFdoZXJlLU9iamVjdCBOYW1lIC1FUSAkcGFyYW1ldGVyTmFtZQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICR0ZXN0cGFyYW1zYWxsICs9IDENCiAgICAgICAgICAgICAgICBpZiAoW1N0cmluZ106OklzTnVsbE9yRW1wdHkoJHBhcmFtZXRlckhlbHAuRGVzY3JpcHRpb24uVGV4dCkpIHsNCiAgICAgICAgICAgICAgICAgICAgIyBTaG91bGQgYmUgYSBkZXNjcmlwdGlvbiBmb3IgZXZlcnkgcGFyYW1ldGVyDQogICAgICAgICAgICAgICAgICAgIEl0ICJnZXRzIGhlbHAgZm9yIHBhcmFtZXRlcjogJHBhcmFtZXRlck5hbWUgOiBpbiAkY29tbWFuZE5hbWUiIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbWV0ZXJIZWxwLkRlc2NyaXB0aW9uLlRleHQgfCBTaG91bGQgLU5vdCAtQmVOdWxsT3JFbXB0eQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICR0ZXN0cGFyYW1zZXJyb3JzICs9IDENCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgJHRlc3RwYXJhbXNhbGwgKz0gMQ0KICAgICAgICAgICAgICAgICRjb2RlTWFuZGF0b3J5ID0gJHBhcmFtZXRlci5Jc01hbmRhdG9yeS50b1N0cmluZygpDQogICAgICAgICAgICAgICAgaWYgKCRwYXJhbWV0ZXJIZWxwLlJlcXVpcmVkIC1uZSAkY29kZU1hbmRhdG9yeSkgew0KICAgICAgICAgICAgICAgICAgICAjIFJlcXVpcmVkIHZhbHVlIGluIEhlbHAgc2hvdWxkIG1hdGNoIElzTWFuZGF0b3J5IHByb3BlcnR5IG9mIHBhcmFtZXRlcg0KICAgICAgICAgICAgICAgICAgICBJdCAiaGVscCBmb3IgJHBhcmFtZXRlck5hbWUgcGFyYW1ldGVyIGluICRjb21tYW5kTmFtZSBoYXMgY29ycmVjdCBNYW5kYXRvcnkgdmFsdWUiIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbWV0ZXJIZWxwLlJlcXVpcmVkIHwgU2hvdWxkIC1CZSAkY29kZU1hbmRhdG9yeQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICR0ZXN0cGFyYW1zZXJyb3JzICs9IDENCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKCRIZWxwVGVzdFNraXBQYXJhbWV0ZXJUeXBlWyRjb21tYW5kTmFtZV0gLWNvbnRhaW5zICRwYXJhbWV0ZXJOYW1lKSB7IGNvbnRpbnVlIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAkY29kZVR5cGUgPSAkcGFyYW1ldGVyLlBhcmFtZXRlclR5cGUuTmFtZQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICR0ZXN0cGFyYW1zYWxsICs9IDENCiAgICAgICAgICAgICAgICBpZiAoJHBhcmFtZXRlci5QYXJhbWV0ZXJUeXBlLklzRW51bSkgew0KICAgICAgICAgICAgICAgICAgICAjIEVudW1lcmF0aW9ucyBvZnRlbiBoYXZlIGlzc3VlcyB3aXRoIHRoZSB0eXBlbmFtZSBub3QgYmVpbmcgcmVsaWFibHkgYXZhaWxhYmxlDQogICAgICAgICAgICAgICAgICAgICRuYW1lcyA9ICRwYXJhbWV0ZXIuUGFyYW1ldGVyVHlwZTo6R2V0TmFtZXMoJHBhcmFtZXRlci5QYXJhbWV0ZXJUeXBlKQ0KICAgICAgICAgICAgICAgICAgICBpZiAoJHBhcmFtZXRlckhlbHAucGFyYW1ldGVyVmFsdWVHcm91cC5wYXJhbWV0ZXJWYWx1ZSAtbmUgJG5hbWVzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAjIFBhcmFtZXRlciB0eXBlIGluIEhlbHAgc2hvdWxkIG1hdGNoIGNvZGUNCiAgICAgICAgICAgICAgICAgICAgICAgIEl0ICJoZWxwIGZvciAkY29tbWFuZE5hbWUgaGFzIGNvcnJlY3QgcGFyYW1ldGVyIHR5cGUgZm9yICRwYXJhbWV0ZXJOYW1lIiB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtZXRlckhlbHAucGFyYW1ldGVyVmFsdWVHcm91cC5wYXJhbWV0ZXJWYWx1ZSB8IFNob3VsZCAtYmUgJG5hbWVzDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAkdGVzdHBhcmFtc2Vycm9ycyArPSAxDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZWlmICgkcGFyYW1ldGVyLlBhcmFtZXRlclR5cGUuRnVsbE5hbWUgLWluICRIZWxwVGVzdEVudW1lcmF0ZWRBcnJheXMpIHsNCiAgICAgICAgICAgICAgICAgICAgIyBFbnVtZXJhdGlvbnMgb2Z0ZW4gaGF2ZSBpc3N1ZXMgd2l0aCB0aGUgdHlwZW5hbWUgbm90IGJlaW5nIHJlbGlhYmx5IGF2YWlsYWJsZQ0KICAgICAgICAgICAgICAgICAgICAkbmFtZXMgPSBbRW51bV06OkdldE5hbWVzKCRwYXJhbWV0ZXIuUGFyYW1ldGVyVHlwZS5EZWNsYXJlZE1lbWJlcnNbMF0uUmV0dXJuVHlwZSkNCiAgICAgICAgICAgICAgICAgICAgaWYgKCRwYXJhbWV0ZXJIZWxwLnBhcmFtZXRlclZhbHVlR3JvdXAucGFyYW1ldGVyVmFsdWUgLW5lICRuYW1lcykgew0KICAgICAgICAgICAgICAgICAgICAgICAgIyBQYXJhbWV0ZXIgdHlwZSBpbiBIZWxwIHNob3VsZCBtYXRjaCBjb2RlDQogICAgICAgICAgICAgICAgICAgICAgICBJdCAiaGVscCBmb3IgJGNvbW1hbmROYW1lIGhhcyBjb3JyZWN0IHBhcmFtZXRlciB0eXBlIGZvciAkcGFyYW1ldGVyTmFtZSIgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbWV0ZXJIZWxwLnBhcmFtZXRlclZhbHVlR3JvdXAucGFyYW1ldGVyVmFsdWUgfCBTaG91bGQgLWJlICRuYW1lcw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgJHRlc3RwYXJhbXNlcnJvcnMgKz0gMQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAjIFRvIGF2b2lkIGNhbGxpbmcgVHJpbSBtZXRob2Qgb24gYSBudWxsIG9iamVjdC4NCiAgICAgICAgICAgICAgICAgICAgJGhlbHBUeXBlID0gaWYgKCRwYXJhbWV0ZXJIZWxwLnBhcmFtZXRlclZhbHVlKSB7ICRwYXJhbWV0ZXJIZWxwLnBhcmFtZXRlclZhbHVlLlRyaW0oKSB9DQogICAgICAgICAgICAgICAgICAgIGlmICgkaGVscFR5cGUgLW5lICRjb2RlVHlwZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgIyBQYXJhbWV0ZXIgdHlwZSBpbiBIZWxwIHNob3VsZCBtYXRjaCBjb2RlDQogICAgICAgICAgICAgICAgICAgICAgICBJdCAiaGVscCBmb3IgJGNvbW1hbmROYW1lIGhhcyBjb3JyZWN0IHBhcmFtZXRlciB0eXBlIGZvciAkcGFyYW1ldGVyTmFtZSIgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRoZWxwVHlwZSB8IFNob3VsZCAtYmUgJGNvZGVUeXBlDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAkdGVzdHBhcmFtc2Vycm9ycyArPSAxDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3JlYWNoICgkaGVscFBhcm0gaW4gJEhlbHBQYXJhbWV0ZXJOYW1lcykgew0KICAgICAgICAgICAgICAgICR0ZXN0cGFyYW1zYWxsICs9IDENCiAgICAgICAgICAgICAgICBpZiAoJGhlbHBQYXJtIC1ub3RpbiAkcGFyYW1ldGVyTmFtZXMpIHsNCiAgICAgICAgICAgICAgICAgICAgIyBTaG91bGRuJ3QgZmluZCBleHRyYSBwYXJhbWV0ZXJzIGluIGhlbHAuDQogICAgICAgICAgICAgICAgICAgIEl0ICJmaW5kcyBoZWxwIHBhcmFtZXRlciBpbiBjb2RlOiAkaGVscFBhcm0iIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRoZWxwUGFybSAtaW4gJHBhcmFtZXRlck5hbWVzIHwgU2hvdWxkIC1CZSAkdHJ1ZQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICR0ZXN0cGFyYW1zZXJyb3JzICs9IDENCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoJHRlc3RwYXJhbXNlcnJvcnMgLWVxIDApIHsNCiAgICAgICAgICAgICAgICBJdCAiUmFuIHNpbGVudGx5ICR0ZXN0cGFyYW1zYWxsIHRlc3RzIiB7DQogICAgICAgICAgICAgICAgICAgICR0ZXN0cGFyYW1zZXJyb3JzIHwgU2hvdWxkIC1iZSAwDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQEJKgAAAAkrAAAABiwAAAAOSGVscC5UZXN0cy5wczEGLQAAABZnZW5lcmFsXEhlbHAuVGVzdHMucHMxCQYAAAAJLwAAAAkwAAAAAQ8AAAALAAAABjEAAADwDURlc2NyaWJlICJWYWxpZGF0aW5nIHRoZSBtb2R1bGUgbWFuaWZlc3QiIHsNCgkkbW9kdWxlUm9vdCA9IChSZXNvbHZlLVBhdGggIiRQU1NjcmlwdFJvb3RcLi5cLi4iKS5QYXRoDQoJJG1hbmlmZXN0ID0gKChHZXQtQ29udGVudCAiJG1vZHVsZVJvb3Rcw75uYW1lw74ucHNkMSIpIC1qb2luICJgbiIpIHwgSW52b2tlLUV4cHJlc3Npb24NCglDb250ZXh0ICJCYXNpYyByZXNvdXJjZXMgdmFsaWRhdGlvbiIgew0KCQkkZmlsZXMgPSBHZXQtQ2hpbGRJdGVtICIkbW9kdWxlUm9vdFxmdW5jdGlvbnMiIC1SZWN1cnNlIC1GaWxlIC1GaWx0ZXIgIioucHMxIg0KCQlJdCAiRXhwb3J0cyBhbGwgZnVuY3Rpb25zIGluIHRoZSBwdWJsaWMgZm9sZGVyIiB7DQoJCQkNCgkJCSRmdW5jdGlvbnMgPSAoQ29tcGFyZS1PYmplY3QgLVJlZmVyZW5jZU9iamVjdCAkZmlsZXMuQmFzZU5hbWUgLURpZmZlcmVuY2VPYmplY3QgJG1hbmlmZXN0LkZ1bmN0aW9uc1RvRXhwb3J0IHwgV2hlcmUtT2JqZWN0IFNpZGVJbmRpY2F0b3IgLUxpa2UgJzw9JykuSW5wdXRPYmplY3QNCgkJCSRmdW5jdGlvbnMgfCBTaG91bGQgLUJlTnVsbE9yRW1wdHkNCgkJfQ0KCQlJdCAiRXhwb3J0cyBubyBmdW5jdGlvbiB0aGF0IGlzbid0IGFsc28gcHJlc2VudCBpbiB0aGUgcHVibGljIGZvbGRlciIgew0KCQkJJGZ1bmN0aW9ucyA9IChDb21wYXJlLU9iamVjdCAtUmVmZXJlbmNlT2JqZWN0ICRmaWxlcy5CYXNlTmFtZSAtRGlmZmVyZW5jZU9iamVjdCAkbWFuaWZlc3QuRnVuY3Rpb25zVG9FeHBvcnQgfCBXaGVyZS1PYmplY3QgU2lkZUluZGljYXRvciAtTGlrZSAnPT4nKS5JbnB1dE9iamVjdA0KCQkJJGZ1bmN0aW9ucyB8IFNob3VsZCAtQmVOdWxsT3JFbXB0eQ0KCQl9DQoJCQ0KCQlJdCAiRXhwb3J0cyBub25lIG9mIGl0cyBpbnRlcm5hbCBmdW5jdGlvbnMiIHsNCgkJCSRmaWxlcyA9IEdldC1DaGlsZEl0ZW0gIiRtb2R1bGVSb290XGludGVybmFsXGZ1bmN0aW9ucyIgLVJlY3Vyc2UgLUZpbGUgLUZpbHRlciAiKi5wczEiDQoJCQkkZmlsZXMgfCBXaGVyZS1PYmplY3QgQmFzZU5hbWUgLUluICRtYW5pZmVzdC5GdW5jdGlvbnNUb0V4cG9ydCB8IFNob3VsZCAtQmVOdWxsT3JFbXB0eQ0KCQl9DQoJfQ0KCQ0KCUNvbnRleHQgIkluZGl2aWR1YWwgZmlsZSB2YWxpZGF0aW9uIiB7DQoJCUl0ICJUaGUgcm9vdCBtb2R1bGUgZmlsZSBleGlzdHMiIHsNCgkJCVRlc3QtUGF0aCAiJG1vZHVsZVJvb3RcJCgkbWFuaWZlc3QuUm9vdE1vZHVsZSkiIHwgU2hvdWxkIC1CZSAkdHJ1ZQ0KCQl9DQoJCQ0KCQlmb3JlYWNoICgkZm9ybWF0IGluICRtYW5pZmVzdC5Gb3JtYXRzVG9Qcm9jZXNzKQ0KCQl7DQoJCQlJdCAiVGhlIGZpbGUgJGZvcm1hdCBzaG91bGQgZXhpc3QiIHsNCgkJCQlUZXN0LVBhdGggIiRtb2R1bGVSb290XCRmb3JtYXQiIHwgU2hvdWxkIC1CZSAkdHJ1ZQ0KCQkJfQ0KCQl9DQoJCQ0KCQlmb3JlYWNoICgkdHlwZSBpbiAkbWFuaWZlc3QuVHlwZXNUb1Byb2Nlc3MpDQoJCXsNCgkJCUl0ICJUaGUgZmlsZSAkdHlwZSBzaG91bGQgZXhpc3QiIHsNCgkJCQlUZXN0LVBhdGggIiRtb2R1bGVSb290XCR0eXBlIiB8IFNob3VsZCAtQmUgJHRydWUNCgkJCX0NCgkJfQ0KCQkNCgkJZm9yZWFjaCAoJGFzc2VtYmx5IGluICRtYW5pZmVzdC5SZXF1aXJlZEFzc2VtYmxpZXMpDQoJCXsNCgkJCUl0ICJUaGUgZmlsZSAkYXNzZW1ibHkgc2hvdWxkIGV4aXN0IiB7DQoJCQkJVGVzdC1QYXRoICIkbW9kdWxlUm9vdFwkYXNzZW1ibHkiIHwgU2hvdWxkIC1CZSAkdHJ1ZQ0KCQkJfQ0KCQl9DQoJfQ0KfQEJMgAAAAkzAAAABjQAAAASTWFuaWZlc3QuVGVzdHMucHMxBjUAAAAaZ2VuZXJhbFxNYW5pZmVzdC5UZXN0cy5wczEJBgAAAAk3AAAACTgAAAABEAAAAAsAAAAGOQAAAPUHW0NtZGxldEJpbmRpbmcoKV0NClBhcmFtICgNCglbc3dpdGNoXQ0KCSRTa2lwVGVzdCwNCgkNCglbc3RyaW5nW11dDQoJJENvbW1hbmRQYXRoID0gQCgiJFBTU2NyaXB0Um9vdFwuLlwuLlxmdW5jdGlvbnMiLCAiJFBTU2NyaXB0Um9vdFwuLlwuLlxpbnRlcm5hbFxmdW5jdGlvbnMiKQ0KKQ0KDQppZiAoJFNraXBUZXN0KSB7IHJldHVybiB9DQoNCiRsaXN0ID0gTmV3LU9iamVjdCBTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0DQoNCkRlc2NyaWJlICdJbnZva2luZyBQU1NjcmlwdEFuYWx5emVyIGFnYWluc3QgY29tbWFuZGJhc2UnIHsNCgkkY29tbWFuZEZpbGVzID0gR2V0LUNoaWxkSXRlbSAtUGF0aCAkQ29tbWFuZFBhdGggLVJlY3Vyc2UgLUZpbHRlciAiKi5wczEiDQoJJHNjcmlwdEFuYWx5emVyUnVsZXMgPSBHZXQtU2NyaXB0QW5hbHl6ZXJSdWxlDQoJDQoJZm9yZWFjaCAoJGZpbGUgaW4gJGNvbW1hbmRGaWxlcykNCgl7DQoJCUNvbnRleHQgIkFuYWx5emluZyAkKCRmaWxlLkJhc2VOYW1lKSIgew0KCQkJJGFuYWx5c2lzID0gSW52b2tlLVNjcmlwdEFuYWx5emVyIC1QYXRoICRmaWxlLkZ1bGxOYW1lIC1FeGNsdWRlUnVsZSBQU0F2b2lkVHJhaWxpbmdXaGl0ZXNwYWNlLCBQU1Nob3VsZFByb2Nlc3MNCgkJCQ0KCQkJZm9yRWFjaCAoJHJ1bGUgaW4gJHNjcmlwdEFuYWx5emVyUnVsZXMpDQoJCQl7DQoJCQkJSXQgIlNob3VsZCBwYXNzICRydWxlIiB7DQoJCQkJCUlmICgkYW5hbHlzaXMuUnVsZU5hbWUgLWNvbnRhaW5zICRydWxlKQ0KCQkJCQl7DQoJCQkJCQkkYW5hbHlzaXMgfCBXaGVyZS1PYmplY3QgUnVsZU5hbWUgLUVRICRydWxlIC1vdXR2YXJpYWJsZSBmYWlsdXJlcyB8IEZvckVhY2gtT2JqZWN0IHsgJGxpc3QuQWRkKCRfKSB9DQoJCQkJCQkNCgkJCQkJCTEgfCBTaG91bGQgQmUgMA0KCQkJCQl9DQoJCQkJCWVsc2UNCgkJCQkJew0KCQkJCQkJMCB8IFNob3VsZCBCZSAwDQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQp9DQoNCiRsaXN0IHwgT3V0LURlZmF1bHQBCToAAAAJOwAAAAY8AAAAGlBTU2NyaXB0QW5hbHl6ZXIuVGVzdHMucHMxBj0AAAAiZ2VuZXJhbFxQU1NjcmlwdEFuYWx5emVyLlRlc3RzLnBzMQkGAAAACT8AAAAJQAAAAAESAAAABwAAAAkKAAAAAAAAAAAAAAABEwAAAAcAAAAJCgAAAAAAAAAAAAAAARcAAAAHAAAACQoAAAAAAAAAAAAAAAEYAAAABwAAAAkKAAAAAAAAAAAAAAABGgAAAAcAAAAJCgAAAAAAAAAAAAAAARsAAAAHAAAACQoAAAAAAAAAAAAAAAEfAAAABwAAAAkKAAAAAAAAAAAAAAABIAAAAAcAAAAJCgAAAAAAAAAAAAAAASIAAAAHAAAACQoAAAAAAAAAAAAAAAEjAAAABwAAAAkKAAAAAAAAAAAAAAABJwAAAAcAAAAJCgAAAAAAAAAAAAAAASgAAAAHAAAACQoAAAAAAAAAAAAAAAEqAAAABwAAAAlCAAAAAQAAAAEAAAABKwAAAAcAAAAJCgAAAAAAAAAAAAAAAS8AAAAHAAAACQoAAAAAAAAAAAAAAAEwAAAABwAAAAkKAAAAAAAAAAAAAAABMgAAAAcAAAAJRAAAAAEAAAABAAAAATMAAAAHAAAACQoAAAAAAAAAAAAAAAE3AAAABwAAAAkKAAAAAAAAAAAAAAABOAAAAAcAAAAJCgAAAAAAAAAAAAAAAToAAAAHAAAACQoAAAAAAAAAAAAAAAE7AAAABwAAAAkKAAAAAAAAAAAAAAABPwAAAAcAAAAJCgAAAAAAAAAAAAAAAUAAAAAHAAAACQoAAAAAAAAAAAAAABFCAAAABAAAAAZGAAAABG5hbWUNAxFEAAAABAAAAAZHAAAABG5hbWUNAws=</BA> </MS> </Obj> <Obj RefId="17"> <TN RefId="7"> <T>PSModuleDevelopment.Template.TemplateItemFile</T> <T>PSModuleDevelopment.Template.TemplateItemBase</T> <T>System.Object</T> </TN> <ToString>PSModuleDevelopment.Template.TemplateItemFile</ToString> <Props> <S N="Value">param (_x000D__x000A__x0009_$TestGeneral = $true,_x000D__x000A__x0009__x000D__x000A__x0009_$TestFunctions = $true,_x000D__x000A__x0009__x000D__x000A__x0009_[ValidateSet('None', 'Default', 'Passed', 'Failed', 'Pending', 'Skipped', 'Inconclusive', 'Describe', 'Context', 'Summary', 'Header', 'Fails', 'All')]_x000D__x000A__x0009_$Show = "None",_x000D__x000A__x0009__x000D__x000A__x0009_$Include = "*",_x000D__x000A__x0009__x000D__x000A__x0009_$Exclude = ""_x000D__x000A_)_x000D__x000A__x000D__x000A_Write-PSFMessage -Level Important -Message "Starting Tests"_x000D__x000A__x000D__x000A_Write-PSFMessage -Level Important -Message "Importing Module"_x000D__x000A__x000D__x000A_Remove-Module þnameþ -ErrorAction Ignore_x000D__x000A_Import-Module "$PSScriptRoot\..\þnameþ.psd1"_x000D__x000A_Import-Module "$PSScriptRoot\..\þnameþ.psm1" -Force_x000D__x000A__x000D__x000A_þ!testfolder!þ_x000D__x000A__x000D__x000A_$totalFailed = 0_x000D__x000A_$totalRun = 0_x000D__x000A__x000D__x000A_$testresults = @()_x000D__x000A__x000D__x000A_#region Run General Tests_x000D__x000A_if ($TestGeneral)_x000D__x000A_{_x000D__x000A__x0009_Write-PSFMessage -Level Important -Message "Modules imported, proceeding with general tests"_x000D__x000A__x0009_foreach ($file in (Get-ChildItem "$PSScriptRoot\general" -Filter "*.Tests.ps1"))_x000D__x000A__x0009_{_x000D__x000A__x0009__x0009_Write-PSFMessage -Level Significant -Message " Executing <c='em'>$($file.Name)</c>"_x000D__x000A__x0009__x0009_þ!testresults!þ_x000D__x000A__x0009__x0009_foreach ($result in $results)_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$totalRun += $result.TotalCount_x000D__x000A__x0009__x0009__x0009_$totalFailed += $result.FailedCount_x000D__x000A__x0009__x0009__x0009_$result.TestResult | Where-Object { -not $_.Passed } | ForEach-Object {_x000D__x000A__x0009__x0009__x0009__x0009_$name = $_.Name_x000D__x000A__x0009__x0009__x0009__x0009_$testresults += [pscustomobject]@{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Describe = $_.Describe_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Context = $_.Context_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Name_x0009_ = "It $name"_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Result = $_.Result_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Message = $_.FailureMessage_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x0009_}_x000D__x000A_}_x000D__x000A_#endregion Run General Tests_x000D__x000A__x000D__x000A_#region Test Commands_x000D__x000A_if ($TestFunctions)_x000D__x000A_{_x000D__x000A_Write-PSFMessage -Level Important -Message "Proceeding with individual tests"_x000D__x000A__x0009_foreach ($file in (Get-ChildItem "$PSScriptRoot\functions" -Recurse -File -Filter "*Tests.ps1"))_x000D__x000A__x0009_{_x000D__x000A__x0009__x0009_if ($file.Name -notlike $Include) { continue }_x000D__x000A__x0009__x0009_if ($file.Name -like $Exclude) { continue }_x000D__x000A__x0009__x0009__x000D__x000A__x0009__x0009_Write-PSFMessage -Level Significant -Message " Executing $($file.Name)"_x000D__x000A__x0009__x0009_þ!testresults!þ_x000D__x000A__x0009__x0009_foreach ($result in $results)_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$totalRun += $result.TotalCount_x000D__x000A__x0009__x0009__x0009_$totalFailed += $result.FailedCount_x000D__x000A__x0009__x0009__x0009_$result.TestResult | Where-Object { -not $_.Passed } | ForEach-Object {_x000D__x000A__x0009__x0009__x0009__x0009_$name = $_.Name_x000D__x000A__x0009__x0009__x0009__x0009_$testresults += [pscustomobject]@{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Describe = $_.Describe_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Context = $_.Context_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Name_x0009_ = "It $name"_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Result = $_.Result_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Message = $_.FailureMessage_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x0009_}_x000D__x000A_}_x000D__x000A_#endregion Test Commands_x000D__x000A__x000D__x000A_$testresults | Sort-Object Describe, Context, Name, Result, Message | Format-List_x000D__x000A__x000D__x000A_if ($totalFailed -eq 0) { Write-PSFMessage -Level Critical -Message "All <c='em'>$totalRun</c> tests executed without a single failure!" }_x000D__x000A_else { Write-PSFMessage -Level Critical -Message "<c='em'>$totalFailed tests</c> out of <c='sub'>$totalRun</c> tests failed!" }_x000D__x000A__x000D__x000A_if ($totalFailed -gt 0)_x000D__x000A_{_x000D__x000A__x0009_throw "$totalFailed / $totalRun tests failed!"_x000D__x000A_}</S> <B N="PlainText">true</B> <Obj N="ContentParameterFlat" RefId="18"> <TNRef RefId="2" /> <LST> <S>name</S> </LST> </Obj> <Obj N="ContentParameterScript" RefId="19"> <TNRef RefId="2" /> <LST> <S>testfolder</S> <S>testresults</S> <S>testresults</S> </LST> </Obj> <S N="Name">pester.ps1</S> <S N="RelativePath">pester.ps1</S> <S N="Identifier">þ</S> <Obj N="FileSystemParameterFlat" RefId="20"> <TNRef RefId="2" /> <LST /> </Obj> <Obj N="FileSystemParameterScript" RefId="21"> <TNRef RefId="2" /> <LST /> </Obj> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAALVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRmlsZQkAAAAFVmFsdWUJUGxhaW5UZXh0FENvbnRlbnRQYXJhbWV0ZXJGbGF0FkNvbnRlbnRQYXJhbWV0ZXJTY3JpcHQETmFtZQxSZWxhdGl2ZVBhdGgKSWRlbnRpZmllchdGaWxlU3lzdGVtUGFyYW1ldGVyRmxhdBlGaWxlU3lzdGVtUGFyYW1ldGVyU2NyaXB0AQADAwEBAQMDAX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAYDAAAAsBVwYXJhbSAoDQoJJFRlc3RHZW5lcmFsID0gJHRydWUsDQoJDQoJJFRlc3RGdW5jdGlvbnMgPSAkdHJ1ZSwNCgkNCglbVmFsaWRhdGVTZXQoJ05vbmUnLCAnRGVmYXVsdCcsICdQYXNzZWQnLCAnRmFpbGVkJywgJ1BlbmRpbmcnLCAnU2tpcHBlZCcsICdJbmNvbmNsdXNpdmUnLCAnRGVzY3JpYmUnLCAnQ29udGV4dCcsICdTdW1tYXJ5JywgJ0hlYWRlcicsICdGYWlscycsICdBbGwnKV0NCgkkU2hvdyA9ICJOb25lIiwNCgkNCgkkSW5jbHVkZSA9ICIqIiwNCgkNCgkkRXhjbHVkZSA9ICIiDQopDQoNCldyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEltcG9ydGFudCAtTWVzc2FnZSAiU3RhcnRpbmcgVGVzdHMiDQoNCldyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEltcG9ydGFudCAtTWVzc2FnZSAiSW1wb3J0aW5nIE1vZHVsZSINCg0KUmVtb3ZlLU1vZHVsZSDDvm5hbWXDviAtRXJyb3JBY3Rpb24gSWdub3JlDQpJbXBvcnQtTW9kdWxlICIkUFNTY3JpcHRSb290XC4uXMO+bmFtZcO+LnBzZDEiDQpJbXBvcnQtTW9kdWxlICIkUFNTY3JpcHRSb290XC4uXMO+bmFtZcO+LnBzbTEiIC1Gb3JjZQ0KDQrDviF0ZXN0Zm9sZGVyIcO+DQoNCiR0b3RhbEZhaWxlZCA9IDANCiR0b3RhbFJ1biA9IDANCg0KJHRlc3RyZXN1bHRzID0gQCgpDQoNCiNyZWdpb24gUnVuIEdlbmVyYWwgVGVzdHMNCmlmICgkVGVzdEdlbmVyYWwpDQp7DQoJV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSW1wb3J0YW50IC1NZXNzYWdlICJNb2R1bGVzIGltcG9ydGVkLCBwcm9jZWVkaW5nIHdpdGggZ2VuZXJhbCB0ZXN0cyINCglmb3JlYWNoICgkZmlsZSBpbiAoR2V0LUNoaWxkSXRlbSAiJFBTU2NyaXB0Um9vdFxnZW5lcmFsIiAtRmlsdGVyICIqLlRlc3RzLnBzMSIpKQ0KCXsNCgkJV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgU2lnbmlmaWNhbnQgLU1lc3NhZ2UgIiAgRXhlY3V0aW5nIDxjPSdlbSc+JCgkZmlsZS5OYW1lKTwvYz4iDQoJCcO+IXRlc3RyZXN1bHRzIcO+DQoJCWZvcmVhY2ggKCRyZXN1bHQgaW4gJHJlc3VsdHMpDQoJCXsNCgkJCSR0b3RhbFJ1biArPSAkcmVzdWx0LlRvdGFsQ291bnQNCgkJCSR0b3RhbEZhaWxlZCArPSAkcmVzdWx0LkZhaWxlZENvdW50DQoJCQkkcmVzdWx0LlRlc3RSZXN1bHQgfCBXaGVyZS1PYmplY3QgeyAtbm90ICRfLlBhc3NlZCB9IHwgRm9yRWFjaC1PYmplY3Qgew0KCQkJCSRuYW1lID0gJF8uTmFtZQ0KCQkJCSR0ZXN0cmVzdWx0cyArPSBbcHNjdXN0b21vYmplY3RdQHsNCgkJCQkJRGVzY3JpYmUgPSAkXy5EZXNjcmliZQ0KCQkJCQlDb250ZXh0ICA9ICRfLkNvbnRleHQNCgkJCQkJTmFtZQkgPSAiSXQgJG5hbWUiDQoJCQkJCVJlc3VsdCAgID0gJF8uUmVzdWx0DQoJCQkJCU1lc3NhZ2UgID0gJF8uRmFpbHVyZU1lc3NhZ2UNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQp9DQojZW5kcmVnaW9uIFJ1biBHZW5lcmFsIFRlc3RzDQoNCiNyZWdpb24gVGVzdCBDb21tYW5kcw0KaWYgKCRUZXN0RnVuY3Rpb25zKQ0Kew0KV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSW1wb3J0YW50IC1NZXNzYWdlICJQcm9jZWVkaW5nIHdpdGggaW5kaXZpZHVhbCB0ZXN0cyINCglmb3JlYWNoICgkZmlsZSBpbiAoR2V0LUNoaWxkSXRlbSAiJFBTU2NyaXB0Um9vdFxmdW5jdGlvbnMiIC1SZWN1cnNlIC1GaWxlIC1GaWx0ZXIgIipUZXN0cy5wczEiKSkNCgl7DQoJCWlmICgkZmlsZS5OYW1lIC1ub3RsaWtlICRJbmNsdWRlKSB7IGNvbnRpbnVlIH0NCgkJaWYgKCRmaWxlLk5hbWUgLWxpa2UgJEV4Y2x1ZGUpIHsgY29udGludWUgfQ0KCQkNCgkJV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgU2lnbmlmaWNhbnQgLU1lc3NhZ2UgIiAgRXhlY3V0aW5nICQoJGZpbGUuTmFtZSkiDQoJCcO+IXRlc3RyZXN1bHRzIcO+DQoJCWZvcmVhY2ggKCRyZXN1bHQgaW4gJHJlc3VsdHMpDQoJCXsNCgkJCSR0b3RhbFJ1biArPSAkcmVzdWx0LlRvdGFsQ291bnQNCgkJCSR0b3RhbEZhaWxlZCArPSAkcmVzdWx0LkZhaWxlZENvdW50DQoJCQkkcmVzdWx0LlRlc3RSZXN1bHQgfCBXaGVyZS1PYmplY3QgeyAtbm90ICRfLlBhc3NlZCB9IHwgRm9yRWFjaC1PYmplY3Qgew0KCQkJCSRuYW1lID0gJF8uTmFtZQ0KCQkJCSR0ZXN0cmVzdWx0cyArPSBbcHNjdXN0b21vYmplY3RdQHsNCgkJCQkJRGVzY3JpYmUgPSAkXy5EZXNjcmliZQ0KCQkJCQlDb250ZXh0ICA9ICRfLkNvbnRleHQNCgkJCQkJTmFtZQkgPSAiSXQgJG5hbWUiDQoJCQkJCVJlc3VsdCAgID0gJF8uUmVzdWx0DQoJCQkJCU1lc3NhZ2UgID0gJF8uRmFpbHVyZU1lc3NhZ2UNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQp9DQojZW5kcmVnaW9uIFRlc3QgQ29tbWFuZHMNCg0KJHRlc3RyZXN1bHRzIHwgU29ydC1PYmplY3QgRGVzY3JpYmUsIENvbnRleHQsIE5hbWUsIFJlc3VsdCwgTWVzc2FnZSB8IEZvcm1hdC1MaXN0DQoNCmlmICgkdG90YWxGYWlsZWQgLWVxIDApIHsgV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgQ3JpdGljYWwgLU1lc3NhZ2UgIkFsbCA8Yz0nZW0nPiR0b3RhbFJ1bjwvYz4gdGVzdHMgZXhlY3V0ZWQgd2l0aG91dCBhIHNpbmdsZSBmYWlsdXJlISIgfQ0KZWxzZSB7IFdyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIENyaXRpY2FsIC1NZXNzYWdlICI8Yz0nZW0nPiR0b3RhbEZhaWxlZCB0ZXN0czwvYz4gb3V0IG9mIDxjPSdzdWInPiR0b3RhbFJ1bjwvYz4gdGVzdHMgZmFpbGVkISIgfQ0KDQppZiAoJHRvdGFsRmFpbGVkIC1ndCAwKQ0Kew0KCXRocm93ICIkdG90YWxGYWlsZWQgLyAkdG90YWxSdW4gdGVzdHMgZmFpbGVkISINCn0BCQQAAAAJBQAAAAYGAAAACnBlc3Rlci5wczEGBwAAAApwZXN0ZXIucHMxBggAAAACw74JCQAAAAkKAAAABAQAAAB/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBgAACAgJCwAAAAEAAAABAAAAAQUAAAAEAAAACQwAAAADAAAAAwAAAAEJAAAABAAAAAkNAAAAAAAAAAAAAAABCgAAAAQAAAAJDQAAAAAAAAAAAAAAEQsAAAAEAAAABg4AAAAEbmFtZQ0DEQwAAAAEAAAABg8AAAAKdGVzdGZvbGRlcgYQAAAAC3Rlc3RyZXN1bHRzBhEAAAALdGVzdHJlc3VsdHMKEQ0AAAAAAAAACw==</BA> </MS> </Obj> <Obj RefId="22"> <TNRef RefId="7" /> <ToString>PSModuleDevelopment.Template.TemplateItemFile</ToString> <Props> <S N="Value"># Description_x000D__x000A__x000D__x000A_This is the folder, where all the tests go._x000D__x000A__x000D__x000A_Those are subdivided in two categories:_x000D__x000A__x000D__x000A_ - General_x000D__x000A_ - Function_x000D__x000A__x000D__x000A_## General Tests_x000D__x000A__x000D__x000A_General tests are function generic and test for general policies._x000D__x000A__x000D__x000A_These test scan answer questions such as:_x000D__x000A__x000D__x000A_ - Is my module following my style guides?_x000D__x000A_ - Does any of my scripts have a syntax error?_x000D__x000A_ - Do my scripts use commands I do not want them to use?_x000D__x000A_ - Do my commands follow best practices?_x000D__x000A_ - Do my commands have proper help?_x000D__x000A__x000D__x000A_Basically, these allow a general module health check._x000D__x000A__x000D__x000A_These tests are already provided as part of the template._x000D__x000A__x000D__x000A_## Function Tests_x000D__x000A__x000D__x000A_A healthy module should provide unit and integration tests for the commands & components it ships._x000D__x000A_Only then can be guaranteed, that they will actually perform as promised._x000D__x000A__x000D__x000A_However, as each such test must be specific to the function it tests, there cannot be much in the way of templates.</S> <B N="PlainText">true</B> <Obj N="ContentParameterFlat" RefId="23"> <TNRef RefId="2" /> <LST /> </Obj> <Obj N="ContentParameterScript" RefId="24"> <TNRef RefId="2" /> <LST /> </Obj> <S N="Name">readme.md</S> <S N="RelativePath">readme.md</S> <S N="Identifier">þ</S> <Obj N="FileSystemParameterFlat" RefId="25"> <TNRef RefId="2" /> <LST /> </Obj> <Obj N="FileSystemParameterScript" RefId="26"> <TNRef RefId="2" /> <LST /> </Obj> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAALVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRmlsZQkAAAAFVmFsdWUJUGxhaW5UZXh0FENvbnRlbnRQYXJhbWV0ZXJGbGF0FkNvbnRlbnRQYXJhbWV0ZXJTY3JpcHQETmFtZQxSZWxhdGl2ZVBhdGgKSWRlbnRpZmllchdGaWxlU3lzdGVtUGFyYW1ldGVyRmxhdBlGaWxlU3lzdGVtUGFyYW1ldGVyU2NyaXB0AQADAwEBAQMDAX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAYDAAAAogcjIERlc2NyaXB0aW9uDQoNClRoaXMgaXMgdGhlIGZvbGRlciwgd2hlcmUgYWxsIHRoZSB0ZXN0cyBnby4NCg0KVGhvc2UgYXJlIHN1YmRpdmlkZWQgaW4gdHdvIGNhdGVnb3JpZXM6DQoNCiAtIEdlbmVyYWwNCiAtIEZ1bmN0aW9uDQoNCiMjIEdlbmVyYWwgVGVzdHMNCg0KR2VuZXJhbCB0ZXN0cyBhcmUgZnVuY3Rpb24gZ2VuZXJpYyBhbmQgdGVzdCBmb3IgZ2VuZXJhbCBwb2xpY2llcy4NCg0KVGhlc2UgdGVzdCBzY2FuIGFuc3dlciBxdWVzdGlvbnMgc3VjaCBhczoNCg0KIC0gSXMgbXkgbW9kdWxlIGZvbGxvd2luZyBteSBzdHlsZSBndWlkZXM/DQogLSBEb2VzIGFueSBvZiBteSBzY3JpcHRzIGhhdmUgYSBzeW50YXggZXJyb3I/DQogLSBEbyBteSBzY3JpcHRzIHVzZSBjb21tYW5kcyBJIGRvIG5vdCB3YW50IHRoZW0gdG8gdXNlPw0KIC0gRG8gbXkgY29tbWFuZHMgZm9sbG93IGJlc3QgcHJhY3RpY2VzPw0KIC0gRG8gbXkgY29tbWFuZHMgaGF2ZSBwcm9wZXIgaGVscD8NCg0KQmFzaWNhbGx5LCB0aGVzZSBhbGxvdyBhIGdlbmVyYWwgbW9kdWxlIGhlYWx0aCBjaGVjay4NCg0KVGhlc2UgdGVzdHMgYXJlIGFscmVhZHkgcHJvdmlkZWQgYXMgcGFydCBvZiB0aGUgdGVtcGxhdGUuDQoNCiMjIEZ1bmN0aW9uIFRlc3RzDQoNCkEgaGVhbHRoeSBtb2R1bGUgc2hvdWxkIHByb3ZpZGUgdW5pdCBhbmQgaW50ZWdyYXRpb24gdGVzdHMgZm9yIHRoZSBjb21tYW5kcyAmIGNvbXBvbmVudHMgaXQgc2hpcHMuDQpPbmx5IHRoZW4gY2FuIGJlIGd1YXJhbnRlZWQsIHRoYXQgdGhleSB3aWxsIGFjdHVhbGx5IHBlcmZvcm0gYXMgcHJvbWlzZWQuDQoNCkhvd2V2ZXIsIGFzIGVhY2ggc3VjaCB0ZXN0IG11c3QgYmUgc3BlY2lmaWMgdG8gdGhlIGZ1bmN0aW9uIGl0IHRlc3RzLCB0aGVyZSBjYW5ub3QgYmUgbXVjaCBpbiB0aGUgd2F5IG9mIHRlbXBsYXRlcy4BCQQAAAAJBQAAAAYGAAAACXJlYWRtZS5tZAYHAAAACXJlYWRtZS5tZAYIAAAAAsO+CQkAAAAJCgAAAAQEAAAAf1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgYAAAgICQsAAAAAAAAAAAAAAAEFAAAABAAAAAkLAAAAAAAAAAAAAAABCQAAAAQAAAAJCwAAAAAAAAAAAAAAAQoAAAAEAAAACQsAAAAAAAAAAAAAABELAAAAAAAAAAs=</BA> </MS> </Obj> </LST> </Obj> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGUKAAAABE5hbWUEVHlwZQdWZXJzaW9uC0Rlc2NyaXB0aW9uBkF1dGhvcglDcmVhdGVkT24EVGFncwpQYXJhbWV0ZXJzB1NjcmlwdHMIQ2hpbGRyZW4BBAMBAQADAwMDKVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVUeXBlAgAAAA5TeXN0ZW0uVmVyc2lvbg1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dgAJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5EaWN0aW9uYXJ5YDJbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuUGFyYW1ldGVyU2NyaXB0LCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1dngFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZSwgUFNNb2R1bGVEZXZlbG9wbWVudCwgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxdXQIAAAAGAwAAAAhQU0ZUZXN0cwX8////KVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVUeXBlAQAAAAd2YWx1ZV9fAAgCAAAAAQAAAAkFAAAABgYAAABBVGhlIFBTRnJhbWV3b3JrLWJhc2VkIHN0YW5kYXJkIHRlc3Qgc3VpdGUgZm9yIGEgUG93ZXJTaGVsbCBNb2R1bGUGBwAAABJGcmllZHJpY2ggV2Vpbm1hbm4AgI36HjbWiAkIAAAACQkAAAAJCgAAAAkLAAAABAUAAAAOU3lzdGVtLlZlcnNpb24EAAAABl9NYWpvcgZfTWlub3IGX0J1aWxkCV9SZXZpc2lvbgAAAAAICAgIAQAAAAAAAAAAAAAAAAAAAAQIAAAAf1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgYAAAgICQwAAAACAAAAAAAAAAEJAAAACAAAAAkNAAAAAQAAAAEAAAAECgAAAIACU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeWAyW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlBhcmFtZXRlclNjcmlwdCwgUFNNb2R1bGVEZXZlbG9wbWVudCwgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxdXQQAAAAHVmVyc2lvbghDb21wYXJlcghIYXNoU2l6ZQ1LZXlWYWx1ZVBhaXJzAAMAAwgWU3lzdGVtLk9yZGluYWxDb21wYXJlcgiEAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlBhcmFtZXRlclNjcmlwdCwgUFNNb2R1bGVEZXZlbG9wbWVudCwgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxdXVtdAwAAAAkOAAAAAwAAAAkPAAAABAsAAACeAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24EAAAvUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlW10CAAAACAgJEAAAAAQAAAAEAAAAEQwAAAACAAAABhEAAAAFVGVzdHMGEgAAAAtQU0ZyYW1ld29yaxENAAAABAAAAAYTAAAABG5hbWUNAwQOAAAAFlN5c3RlbS5PcmRpbmFsQ29tcGFyZXIBAAAAC19pZ25vcmVDYXNlAAEBBw8AAAAAAQAAAAMAAAADggJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5LZXlWYWx1ZVBhaXJgMltbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQsIFBTTW9kdWxlRGV2ZWxvcG1lbnQsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV0E7P///4ICU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuUGFyYW1ldGVyU2NyaXB0LCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1dAgAAAANrZXkFdmFsdWUBBCxQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlBhcmFtZXRlclNjcmlwdAIAAAAGFQAAAAp0ZXN0Zm9sZGVyCRYAAAAB6f///+z///8GGAAAAARndWlkCRkAAAAB5v///+z///8GGwAAAAt0ZXN0cmVzdWx0cwkcAAAABxAAAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJHQAAAAkeAAAACR8AAAAJIAAAAAwhAAAAX1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24sIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1BRYAAAAsUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQCAAAABE5hbWULU2NyaXB0QmxvY2sBBDtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlNjcmlwdEJsb2NrU2VyaWFsaXphdGlvbkhlbHBlciEAAAACAAAACRUAAAAJIwAAAAEZAAAAFgAAAAkYAAAACSUAAAABHAAAABYAAAAJGwAAAAknAAAABR0AAAAvUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1Gb2xkZXIGAAAACENoaWxkcmVuBE5hbWUMUmVsYXRpdmVQYXRoCklkZW50aWZpZXIXRmlsZVN5c3RlbVBhcmFtZXRlckZsYXQZRmlsZVN5c3RlbVBhcmFtZXRlclNjcmlwdAMBAQEDA54BU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UsIFBTTW9kdWxlRGV2ZWxvcG1lbnQsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAkoAAAABikAAAAJZnVuY3Rpb25zBioAAAAJZnVuY3Rpb25zBisAAAACw74JLAAAAAktAAAAAR4AAAAdAAAACS4AAAAGLwAAAAdnZW5lcmFsBjAAAAAHZ2VuZXJhbAkrAAAACTIAAAAJMwAAAAUfAAAALVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRmlsZQkAAAAFVmFsdWUJUGxhaW5UZXh0FENvbnRlbnRQYXJhbWV0ZXJGbGF0FkNvbnRlbnRQYXJhbWV0ZXJTY3JpcHQETmFtZQxSZWxhdGl2ZVBhdGgKSWRlbnRpZmllchdGaWxlU3lzdGVtUGFyYW1ldGVyRmxhdBlGaWxlU3lzdGVtUGFyYW1ldGVyU2NyaXB0AQADAwEBAQMDAX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAY0AAAAsBVwYXJhbSAoDQoJJFRlc3RHZW5lcmFsID0gJHRydWUsDQoJDQoJJFRlc3RGdW5jdGlvbnMgPSAkdHJ1ZSwNCgkNCglbVmFsaWRhdGVTZXQoJ05vbmUnLCAnRGVmYXVsdCcsICdQYXNzZWQnLCAnRmFpbGVkJywgJ1BlbmRpbmcnLCAnU2tpcHBlZCcsICdJbmNvbmNsdXNpdmUnLCAnRGVzY3JpYmUnLCAnQ29udGV4dCcsICdTdW1tYXJ5JywgJ0hlYWRlcicsICdGYWlscycsICdBbGwnKV0NCgkkU2hvdyA9ICJOb25lIiwNCgkNCgkkSW5jbHVkZSA9ICIqIiwNCgkNCgkkRXhjbHVkZSA9ICIiDQopDQoNCldyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEltcG9ydGFudCAtTWVzc2FnZSAiU3RhcnRpbmcgVGVzdHMiDQoNCldyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEltcG9ydGFudCAtTWVzc2FnZSAiSW1wb3J0aW5nIE1vZHVsZSINCg0KUmVtb3ZlLU1vZHVsZSDDvm5hbWXDviAtRXJyb3JBY3Rpb24gSWdub3JlDQpJbXBvcnQtTW9kdWxlICIkUFNTY3JpcHRSb290XC4uXMO+bmFtZcO+LnBzZDEiDQpJbXBvcnQtTW9kdWxlICIkUFNTY3JpcHRSb290XC4uXMO+bmFtZcO+LnBzbTEiIC1Gb3JjZQ0KDQrDviF0ZXN0Zm9sZGVyIcO+DQoNCiR0b3RhbEZhaWxlZCA9IDANCiR0b3RhbFJ1biA9IDANCg0KJHRlc3RyZXN1bHRzID0gQCgpDQoNCiNyZWdpb24gUnVuIEdlbmVyYWwgVGVzdHMNCmlmICgkVGVzdEdlbmVyYWwpDQp7DQoJV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSW1wb3J0YW50IC1NZXNzYWdlICJNb2R1bGVzIGltcG9ydGVkLCBwcm9jZWVkaW5nIHdpdGggZ2VuZXJhbCB0ZXN0cyINCglmb3JlYWNoICgkZmlsZSBpbiAoR2V0LUNoaWxkSXRlbSAiJFBTU2NyaXB0Um9vdFxnZW5lcmFsIiAtRmlsdGVyICIqLlRlc3RzLnBzMSIpKQ0KCXsNCgkJV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgU2lnbmlmaWNhbnQgLU1lc3NhZ2UgIiAgRXhlY3V0aW5nIDxjPSdlbSc+JCgkZmlsZS5OYW1lKTwvYz4iDQoJCcO+IXRlc3RyZXN1bHRzIcO+DQoJCWZvcmVhY2ggKCRyZXN1bHQgaW4gJHJlc3VsdHMpDQoJCXsNCgkJCSR0b3RhbFJ1biArPSAkcmVzdWx0LlRvdGFsQ291bnQNCgkJCSR0b3RhbEZhaWxlZCArPSAkcmVzdWx0LkZhaWxlZENvdW50DQoJCQkkcmVzdWx0LlRlc3RSZXN1bHQgfCBXaGVyZS1PYmplY3QgeyAtbm90ICRfLlBhc3NlZCB9IHwgRm9yRWFjaC1PYmplY3Qgew0KCQkJCSRuYW1lID0gJF8uTmFtZQ0KCQkJCSR0ZXN0cmVzdWx0cyArPSBbcHNjdXN0b21vYmplY3RdQHsNCgkJCQkJRGVzY3JpYmUgPSAkXy5EZXNjcmliZQ0KCQkJCQlDb250ZXh0ICA9ICRfLkNvbnRleHQNCgkJCQkJTmFtZQkgPSAiSXQgJG5hbWUiDQoJCQkJCVJlc3VsdCAgID0gJF8uUmVzdWx0DQoJCQkJCU1lc3NhZ2UgID0gJF8uRmFpbHVyZU1lc3NhZ2UNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQp9DQojZW5kcmVnaW9uIFJ1biBHZW5lcmFsIFRlc3RzDQoNCiNyZWdpb24gVGVzdCBDb21tYW5kcw0KaWYgKCRUZXN0RnVuY3Rpb25zKQ0Kew0KV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSW1wb3J0YW50IC1NZXNzYWdlICJQcm9jZWVkaW5nIHdpdGggaW5kaXZpZHVhbCB0ZXN0cyINCglmb3JlYWNoICgkZmlsZSBpbiAoR2V0LUNoaWxkSXRlbSAiJFBTU2NyaXB0Um9vdFxmdW5jdGlvbnMiIC1SZWN1cnNlIC1GaWxlIC1GaWx0ZXIgIipUZXN0cy5wczEiKSkNCgl7DQoJCWlmICgkZmlsZS5OYW1lIC1ub3RsaWtlICRJbmNsdWRlKSB7IGNvbnRpbnVlIH0NCgkJaWYgKCRmaWxlLk5hbWUgLWxpa2UgJEV4Y2x1ZGUpIHsgY29udGludWUgfQ0KCQkNCgkJV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgU2lnbmlmaWNhbnQgLU1lc3NhZ2UgIiAgRXhlY3V0aW5nICQoJGZpbGUuTmFtZSkiDQoJCcO+IXRlc3RyZXN1bHRzIcO+DQoJCWZvcmVhY2ggKCRyZXN1bHQgaW4gJHJlc3VsdHMpDQoJCXsNCgkJCSR0b3RhbFJ1biArPSAkcmVzdWx0LlRvdGFsQ291bnQNCgkJCSR0b3RhbEZhaWxlZCArPSAkcmVzdWx0LkZhaWxlZENvdW50DQoJCQkkcmVzdWx0LlRlc3RSZXN1bHQgfCBXaGVyZS1PYmplY3QgeyAtbm90ICRfLlBhc3NlZCB9IHwgRm9yRWFjaC1PYmplY3Qgew0KCQkJCSRuYW1lID0gJF8uTmFtZQ0KCQkJCSR0ZXN0cmVzdWx0cyArPSBbcHNjdXN0b21vYmplY3RdQHsNCgkJCQkJRGVzY3JpYmUgPSAkXy5EZXNjcmliZQ0KCQkJCQlDb250ZXh0ICA9ICRfLkNvbnRleHQNCgkJCQkJTmFtZQkgPSAiSXQgJG5hbWUiDQoJCQkJCVJlc3VsdCAgID0gJF8uUmVzdWx0DQoJCQkJCU1lc3NhZ2UgID0gJF8uRmFpbHVyZU1lc3NhZ2UNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQp9DQojZW5kcmVnaW9uIFRlc3QgQ29tbWFuZHMNCg0KJHRlc3RyZXN1bHRzIHwgU29ydC1PYmplY3QgRGVzY3JpYmUsIENvbnRleHQsIE5hbWUsIFJlc3VsdCwgTWVzc2FnZSB8IEZvcm1hdC1MaXN0DQoNCmlmICgkdG90YWxGYWlsZWQgLWVxIDApIHsgV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgQ3JpdGljYWwgLU1lc3NhZ2UgIkFsbCA8Yz0nZW0nPiR0b3RhbFJ1bjwvYz4gdGVzdHMgZXhlY3V0ZWQgd2l0aG91dCBhIHNpbmdsZSBmYWlsdXJlISIgfQ0KZWxzZSB7IFdyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIENyaXRpY2FsIC1NZXNzYWdlICI8Yz0nZW0nPiR0b3RhbEZhaWxlZCB0ZXN0czwvYz4gb3V0IG9mIDxjPSdzdWInPiR0b3RhbFJ1bjwvYz4gdGVzdHMgZmFpbGVkISIgfQ0KDQppZiAoJHRvdGFsRmFpbGVkIC1ndCAwKQ0Kew0KCXRocm93ICIkdG90YWxGYWlsZWQgLyAkdG90YWxSdW4gdGVzdHMgZmFpbGVkISINCn0BCTUAAAAJNgAAAAY3AAAACnBlc3Rlci5wczEGOAAAAApwZXN0ZXIucHMxCSsAAAAJOgAAAAk7AAAAASAAAAAfAAAABjwAAACiByMgRGVzY3JpcHRpb24NCg0KVGhpcyBpcyB0aGUgZm9sZGVyLCB3aGVyZSBhbGwgdGhlIHRlc3RzIGdvLg0KDQpUaG9zZSBhcmUgc3ViZGl2aWRlZCBpbiB0d28gY2F0ZWdvcmllczoNCg0KIC0gR2VuZXJhbA0KIC0gRnVuY3Rpb24NCg0KIyMgR2VuZXJhbCBUZXN0cw0KDQpHZW5lcmFsIHRlc3RzIGFyZSBmdW5jdGlvbiBnZW5lcmljIGFuZCB0ZXN0IGZvciBnZW5lcmFsIHBvbGljaWVzLg0KDQpUaGVzZSB0ZXN0IHNjYW4gYW5zd2VyIHF1ZXN0aW9ucyBzdWNoIGFzOg0KDQogLSBJcyBteSBtb2R1bGUgZm9sbG93aW5nIG15IHN0eWxlIGd1aWRlcz8NCiAtIERvZXMgYW55IG9mIG15IHNjcmlwdHMgaGF2ZSBhIHN5bnRheCBlcnJvcj8NCiAtIERvIG15IHNjcmlwdHMgdXNlIGNvbW1hbmRzIEkgZG8gbm90IHdhbnQgdGhlbSB0byB1c2U/DQogLSBEbyBteSBjb21tYW5kcyBmb2xsb3cgYmVzdCBwcmFjdGljZXM/DQogLSBEbyBteSBjb21tYW5kcyBoYXZlIHByb3BlciBoZWxwPw0KDQpCYXNpY2FsbHksIHRoZXNlIGFsbG93IGEgZ2VuZXJhbCBtb2R1bGUgaGVhbHRoIGNoZWNrLg0KDQpUaGVzZSB0ZXN0cyBhcmUgYWxyZWFkeSBwcm92aWRlZCBhcyBwYXJ0IG9mIHRoZSB0ZW1wbGF0ZS4NCg0KIyMgRnVuY3Rpb24gVGVzdHMNCg0KQSBoZWFsdGh5IG1vZHVsZSBzaG91bGQgcHJvdmlkZSB1bml0IGFuZCBpbnRlZ3JhdGlvbiB0ZXN0cyBmb3IgdGhlIGNvbW1hbmRzICYgY29tcG9uZW50cyBpdCBzaGlwcy4NCk9ubHkgdGhlbiBjYW4gYmUgZ3VhcmFudGVlZCwgdGhhdCB0aGV5IHdpbGwgYWN0dWFsbHkgcGVyZm9ybSBhcyBwcm9taXNlZC4NCg0KSG93ZXZlciwgYXMgZWFjaCBzdWNoIHRlc3QgbXVzdCBiZSBzcGVjaWZpYyB0byB0aGUgZnVuY3Rpb24gaXQgdGVzdHMsIHRoZXJlIGNhbm5vdCBiZSBtdWNoIGluIHRoZSB3YXkgb2YgdGVtcGxhdGVzLgEJPQAAAAk+AAAABj8AAAAJcmVhZG1lLm1kBkAAAAAJcmVhZG1lLm1kCSsAAAAJQgAAAAlDAAAABSMAAAA7U3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5TY3JpcHRCbG9ja1NlcmlhbGl6YXRpb25IZWxwZXIBAAAAClNjcmlwdFRleHQBIQAAAAZEAAAACQ0KCQkJDQoJCQElAAAAIwAAAAZFAAAALA0KCQkJW1N5c3RlbS5HdWlkXTo6TmV3R3VpZCgpLlRvU3RyaW5nKCkNCgkJAScAAAAjAAAABkYAAABWDQoJCQlAJw0KJHJlc3VsdHMgPSBJbnZva2UtUGVzdGVyIC1TY3JpcHQgJGZpbGUuRnVsbE5hbWUgLVNob3cgJFNob3cgLVBhc3NUaHJ1DQonQA0KCQkBKAAAAAsAAAAJRwAAAAEAAAABAAAAASwAAAAIAAAACUgAAAAAAAAAAAAAAAEtAAAACAAAAAlIAAAAAAAAAAAAAAABLgAAAAsAAAAJSQAAAAYAAAAGAAAAATIAAAAIAAAACUgAAAAAAAAAAAAAAAEzAAAACAAAAAlIAAAAAAAAAAAAAAABNQAAAAgAAAAJSwAAAAEAAAABAAAAATYAAAAIAAAACUwAAAADAAAAAwAAAAE6AAAACAAAAAlIAAAAAAAAAAAAAAABOwAAAAgAAAAJSAAAAAAAAAAAAAAAAT0AAAAIAAAACUgAAAAAAAAAAAAAAAE+AAAACAAAAAlIAAAAAAAAAAAAAAABQgAAAAgAAAAJSAAAAAAAAAAAAAAAAUMAAAAIAAAACUgAAAAAAAAAAAAAAAdHAAAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACU4AAAANAxFIAAAAAAAAAAdJAAAAAAEAAAAIAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACU8AAAAJUAAAAAlRAAAACVIAAAAJUwAAAAlUAAAADQIRSwAAAAQAAAAGVQAAAARuYW1lDQMRTAAAAAQAAAAGVgAAAAp0ZXN0Zm9sZGVyBlcAAAALdGVzdHJlc3VsdHMGWAAAAAt0ZXN0cmVzdWx0cwoBTgAAAB8AAAAGWQAAANUBIyBEZXNjcmlwdGlvbg0KDQpUaGlzIGlzIHdoZXJlIHRoZSBmdW5jdGlvbiB0ZXN0cyBnby4NCg0KTWFrZSBzdXJlIHRvIHB1dCB0aGVtIGluIGZvbGRlcnMgcmVmbGVjdGluZyB0aGUgYWN0dWFsIG1vZHVsZSBzdHJ1Y3R1cmUuDQoNCkl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGludGVybmFsIGFuZCBwdWJsaWMgZnVuY3Rpb25zIGhlcmUuAQlaAAAACVsAAAAGXAAAAAlyZWFkbWUubWQGXQAAABNmdW5jdGlvbnNccmVhZG1lLm1kCSsAAAAJXwAAAAlgAAAAAU8AAAAfAAAABmEAAADMBCMgTGlzdCBvZiBmb3JiaWRkZW4gY29tbWFuZHMNCiRnbG9iYWw6QmFubmVkQ29tbWFuZHMgPSBAKA0KCSdXcml0ZS1Ib3N0JywNCgknV3JpdGUtVmVyYm9zZScsDQoJJ1dyaXRlLVdhcm5pbmcnLA0KCSdXcml0ZS1FcnJvcicsDQoJJ1dyaXRlLU91dHB1dCcsDQoJJ1dyaXRlLUluZm9ybWF0aW9uJywNCgknV3JpdGUtRGVidWcnDQopDQoNCjwjDQoJQ29udGFpbnMgbGlzdCBvZiBleGNlcHRpb25zIGZvciBiYW5uZWQgY21kbGV0cy4NCglJbnNlcnQgdGhlIGZpbGUgbmFtZXMgb2YgZmlsZXMgdGhhdCBtYXkgY29udGFpbiB0aGVtLg0KCQ0KCUV4YW1wbGU6DQoJIldyaXRlLUhvc3QiICA9IEAoJ1dyaXRlLVBTRkhvc3RDb2xvci5wczEnLCdXcml0ZS1QU0ZNZXNzYWdlLnBzMScpDQojPg0KJGdsb2JhbDpNYXlDb250YWluQ29tbWFuZCA9IEB7DQoJIldyaXRlLUhvc3QiICA9IEAoKQ0KCSJXcml0ZS1WZXJib3NlIiA9IEAoKQ0KCSJXcml0ZS1XYXJuaW5nIiA9IEAoKQ0KCSJXcml0ZS1FcnJvciIgID0gQCgpDQoJIldyaXRlLU91dHB1dCIgPSBAKCkNCgkiV3JpdGUtSW5mb3JtYXRpb24iID0gQCgpDQoJIldyaXRlLURlYnVnIiA9IEAoKQ0KfQEJYgAAAAljAAAABmQAAAAcRmlsZUludGVncml0eS5FeGNlcHRpb25zLnBzMQZlAAAAJGdlbmVyYWxcRmlsZUludGVncml0eS5FeGNlcHRpb25zLnBzMQkrAAAACWcAAAAJaAAAAAFQAAAAHwAAAAZpAAAArBYkbW9kdWxlUm9vdCA9IChSZXNvbHZlLVBhdGggIiRQU1NjcmlwdFJvb3RcLi5cLi4iKS5QYXRoDQoNCi4gIiRQU1NjcmlwdFJvb3RcRmlsZUludGVncml0eS5FeGNlcHRpb25zLnBzMSINCg0KZnVuY3Rpb24gR2V0LUZpbGVFbmNvZGluZw0Kew0KPCMNCgkuU1lOT1BTSVMNCgkJVGVzdHMgYSBmaWxlIGZvciBlbmNvZGluZy4NCgkNCgkuREVTQ1JJUFRJT04NCgkJVGVzdHMgYSBmaWxlIGZvciBlbmNvZGluZy4NCgkNCgkuUEFSQU1FVEVSIFBhdGgNCgkJVGhlIGZpbGUgdG8gdGVzdA0KIz4NCglbQ21kbGV0QmluZGluZygpXQ0KCVBhcmFtICgNCgkJW1BhcmFtZXRlcihNYW5kYXRvcnkgPSAkVHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmVCeVByb3BlcnR5TmFtZSA9ICRUcnVlKV0NCgkJW0FsaWFzKCdGdWxsTmFtZScpXQ0KCQlbc3RyaW5nXQ0KCQkkUGF0aA0KCSkNCgkNCglbYnl0ZVtdXSRieXRlID0gZ2V0LWNvbnRlbnQgLUVuY29kaW5nIGJ5dGUgLVJlYWRDb3VudCA0IC1Ub3RhbENvdW50IDQgLVBhdGggJFBhdGgNCgkNCglpZiAoJGJ5dGVbMF0gLWVxIDB4ZWYgLWFuZCAkYnl0ZVsxXSAtZXEgMHhiYiAtYW5kICRieXRlWzJdIC1lcSAweGJmKSB7ICdVVEY4JyB9DQoJZWxzZWlmICgkYnl0ZVswXSAtZXEgMHhmZSAtYW5kICRieXRlWzFdIC1lcSAweGZmKSB7ICdVbmljb2RlJyB9DQoJZWxzZWlmICgkYnl0ZVswXSAtZXEgMCAtYW5kICRieXRlWzFdIC1lcSAwIC1hbmQgJGJ5dGVbMl0gLWVxIDB4ZmUgLWFuZCAkYnl0ZVszXSAtZXEgMHhmZikgeyAnVVRGMzInIH0NCgllbHNlaWYgKCRieXRlWzBdIC1lcSAweDJiIC1hbmQgJGJ5dGVbMV0gLWVxIDB4MmYgLWFuZCAkYnl0ZVsyXSAtZXEgMHg3NikgeyAnVVRGNycgfQ0KCWVsc2UgeyAnVW5rbm93bicgfQ0KfQ0KDQpEZXNjcmliZSAiVmVyaWZ5aW5nIGludGVncml0eSBvZiBtb2R1bGUgZmlsZXMiIHsNCglDb250ZXh0ICJWYWxpZGF0aW5nIFBTMSBTY3JpcHQgZmlsZXMiIHsNCgkJJGFsbEZpbGVzID0gR2V0LUNoaWxkSXRlbSAtUGF0aCAkbW9kdWxlUm9vdCAtUmVjdXJzZSAtRmlsdGVyICIqLnBzMSIgfCBXaGVyZS1PYmplY3QgRnVsbE5hbWUgLU5vdExpa2UgIiRtb2R1bGVSb290XHRlc3RzXCoiDQoJCQ0KCQlmb3JlYWNoICgkZmlsZSBpbiAkYWxsRmlsZXMpDQoJCXsNCgkJCSRuYW1lID0gJGZpbGUuRnVsbE5hbWUuUmVwbGFjZSgiJG1vZHVsZVJvb3RcIiwgJycpDQoJCQkNCgkJCUl0ICJbJG5hbWVdIFNob3VsZCBoYXZlIFVURjggZW5jb2RpbmciIHsNCgkJCQlHZXQtRmlsZUVuY29kaW5nIC1QYXRoICRmaWxlLkZ1bGxOYW1lIHwgU2hvdWxkIC1CZSAnVVRGOCcNCgkJCX0NCgkJCQ0KCQkJSXQgIlskbmFtZV0gU2hvdWxkIGhhdmUgbm8gdHJhaWxpbmcgc3BhY2UiIHsNCgkJCQkoJGZpbGUgfCBTZWxlY3QtU3RyaW5nICJccyQiIHwgV2hlcmUtT2JqZWN0IHsgJF8uTGluZS5UcmltKCkuTGVuZ3RoIC1ndCAwfSkuTGluZU51bWJlciB8IFNob3VsZCAtQmVOdWxsT3JFbXB0eQ0KCQkJfQ0KCQkJDQoJCQkkdG9rZW5zID0gJG51bGwNCgkJCSRwYXJzZUVycm9ycyA9ICRudWxsDQoJCQkkYXN0ID0gW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uTGFuZ3VhZ2UuUGFyc2VyXTo6UGFyc2VGaWxlKCRmaWxlLkZ1bGxOYW1lLCBbcmVmXSR0b2tlbnMsIFtyZWZdJHBhcnNlRXJyb3JzKQ0KCQkJDQoJCQlJdCAiWyRuYW1lXSBTaG91bGQgaGF2ZSBubyBzeW50YXggZXJyb3JzIiB7DQoJCQkJJHBhcnNlRXJyb3JzIHwgU2hvdWxkIEJlICROdWxsDQoJCQl9DQoJCQkNCgkJCWZvcmVhY2ggKCRjb21tYW5kIGluICRnbG9iYWw6QmFubmVkQ29tbWFuZHMpDQoJCQl7DQoJCQkJaWYgKCRnbG9iYWw6TWF5Q29udGFpbkNvbW1hbmRbIiRjb21tYW5kIl0gLW5vdGNvbnRhaW5zICRmaWxlLk5hbWUpDQoJCQkJew0KCQkJCQlJdCAiWyRuYW1lXSBTaG91bGQgbm90IHVzZSAkY29tbWFuZCIgew0KCQkJCQkJJHRva2VucyB8IFdoZXJlLU9iamVjdCBUZXh0IC1FUSAkY29tbWFuZCB8IFNob3VsZCAtQmVOdWxsT3JFbXB0eQ0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQkJDQoJCQlJdCAiWyRuYW1lXSBTaG91bGQgbm90IGNvbnRhaW4gYWxpYXNlcyIgew0KCQkJCSR0b2tlbnMgfCBXaGVyZS1PYmplY3QgVG9rZW5GbGFncyAtZXEgQ29tbWFuZE5hbWUgfCBXaGVyZS1PYmplY3QgeyBUZXN0LVBhdGggImFsaWFzOlwkKCRfLlRleHQpIiB9IHwgTWVhc3VyZS1PYmplY3QgfCBTZWxlY3QtT2JqZWN0IC1FeHBhbmRQcm9wZXJ0eSBDb3VudCB8IFNob3VsZCAtQmUgMA0KCQkJfQ0KCQl9DQoJfQ0KCQ0KCUNvbnRleHQgIlZhbGlkYXRpbmcgaGVscC50eHQgaGVscCBmaWxlcyIgew0KCQkkYWxsRmlsZXMgPSBHZXQtQ2hpbGRJdGVtIC1QYXRoICRtb2R1bGVSb290IC1SZWN1cnNlIC1GaWx0ZXIgIiouaGVscC50eHQiIHwgV2hlcmUtT2JqZWN0IEZ1bGxOYW1lIC1Ob3RMaWtlICIkbW9kdWxlUm9vdFx0ZXN0c1wqIg0KCQkNCgkJZm9yZWFjaCAoJGZpbGUgaW4gJGFsbEZpbGVzKQ0KCQl7DQoJCQkkbmFtZSA9ICRmaWxlLkZ1bGxOYW1lLlJlcGxhY2UoIiRtb2R1bGVSb290XCIsICcnKQ0KCQkJDQoJCQlJdCAiWyRuYW1lXSBTaG91bGQgaGF2ZSBVVEY4IGVuY29kaW5nIiB7DQoJCQkJR2V0LUZpbGVFbmNvZGluZyAtUGF0aCAkZmlsZS5GdWxsTmFtZSB8IFNob3VsZCAtQmUgJ1VURjgnDQoJCQl9DQoJCQkNCgkJCUl0ICJbJG5hbWVdIFNob3VsZCBoYXZlIG5vIHRyYWlsaW5nIHNwYWNlIiB7DQoJCQkJKCRmaWxlIHwgU2VsZWN0LVN0cmluZyAiXHMkIiB8IFdoZXJlLU9iamVjdCB7ICRfLkxpbmUuVHJpbSgpLkxlbmd0aCAtZ3QgMCB9IHwgTWVhc3VyZS1PYmplY3QpLkNvdW50IHwgU2hvdWxkIC1CZSAwDQoJCQl9DQoJCX0NCgl9DQp9AQlqAAAACWsAAAAGbAAAABdGaWxlSW50ZWdyaXR5LlRlc3RzLnBzMQZtAAAAH2dlbmVyYWxcRmlsZUludGVncml0eS5UZXN0cy5wczEJKwAAAAlvAAAACXAAAAABUQAAAB8AAAAGcQAAAJ0FIyBMaXN0IG9mIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBpZ25vcmVkDQokZ2xvYmFsOkZ1bmN0aW9uSGVscFRlc3RFeGNlcHRpb25zID0gQCgNCiAgICANCikNCg0KPCMNCiAgTGlzdCBvZiBhcnJheWVkIGVudW1lcmF0aW9ucy4gVGhlc2UgbmVlZCB0byBiZSB0cmVhdGVkIGRpZmZlcmVudGx5LiBBZGQgZnVsbCBuYW1lLg0KICBFeGFtcGxlOg0KDQogICJTcWxjb2xsYWJvcmF0aXZlLkRiYXRvb2xzLkNvbm5lY3Rpb24uTWFuYWdlbWVudENvbm5lY3Rpb25UeXBlW10iDQojPg0KJGdsb2JhbDpIZWxwVGVzdEVudW1lcmF0ZWRBcnJheXMgPSBAKA0KCQ0KKQ0KDQo8Iw0KICBTb21lIHR5cGVzIG9uIHBhcmFtZXRlcnMganVzdCBmYWlsIHRoZWlyIHZhbGlkYXRpb24gbm8gbWF0dGVyIHdoYXQuDQogIEZvciB0aG9zZSBpdCBiZWNvbWVzIHBvc3NpYmxlIHRvIHNraXAgdGhlbSwgYnkgYWRkaW5nIHRoZW0gdG8gdGhpcyBoYXNodGFibGUuDQogIEFkZCBieSBmb2xsb3dpbmcgdGhpcyBjb252ZW50aW9uOiA8Y29tbWFuZCBuYW1lPiA9IEAoPGxpc3Qgb2YgcGFyYW1ldGVyIG5hbWVzPikNCiAgRXhhbXBsZToNCg0KICAiR2V0LURiYUNtT2JqZWN0IiAgICAgICA9IEAoIkRvTm90VXNlIikNCiM+DQokZ2xvYmFsOkhlbHBUZXN0U2tpcFBhcmFtZXRlclR5cGUgPSBAew0KICAgIA0KfQ0KAQlyAAAACXMAAAAGdAAAABNIZWxwLkV4Y2VwdGlvbnMucHMxBnUAAAAbZ2VuZXJhbFxIZWxwLkV4Y2VwdGlvbnMucHMxCSsAAAAJdwAAAAl4AAAAAVIAAAAfAAAABnkAAAD/RTwjDQogICAgLk5PVEVTDQogICAgICAgIFRoZSBvcmlnaW5hbCB0ZXN0IHRoaXMgaXMgYmFzZWQgdXBvbiB3YXMgd3JpdHRlbiBieSBKdW5lIEJsZW5kZXIuDQoJCUFmdGVyIHNldmVyYWwgcm91bmRzIG9mIG1vZGlmaWNhdGlvbnMgaXQgc3RhbmRzIG5vdyBhcyBpdCBpcywgYnV0IHRoZSBob25vciByZW1haW5zIGhlcnMuDQoNCgkJVGhhbmsgeW91IEp1bmUsIGZvciBhbGwgeW91IGhhdmUgZG9uZSENCg0KICAgIC5ERVNDUklQVElPTg0KCQlUaGlzIHRlc3QgZXZhbHVhdGVzIHRoZSBoZWxwIGZvciBhbGwgY29tbWFuZHMgaW4gYSBtb2R1bGUuDQoNCgkuUEFSQU1FVEVSIFNraXBUZXN0DQoJCURpc2FibGVzIHRoaXMgdGVzdC4NCgkNCgkuUEFSQU1FVEVSIENvbW1hbmRQYXRoDQoJCUxpc3Qgb2YgcGF0aHMgdW5kZXIgd2hpY2ggdGhlIHNjcmlwdCBmaWxlcyBhcmUgc3RvcmVkLg0KCQlUaGlzIHRlc3QgYXNzdW1lcyB0aGF0IGFsbCBmdW5jdGlvbnMgaGF2ZSB0aGVpciBvd24gZmlsZSB0aGF0IGlzIG5hbWVkIGFmdGVyIHRoZW1zZWx2ZXMuDQoJCVRoZXNlIHBhdGhzIGFyZSB1c2VkIHRvIHNlYXJjaCBmb3IgY29tbWFuZHMgdGhhdCBzaG91bGQgZXhpc3QgYW5kIGJlIHRlc3RlZC4NCgkJV2lsbCBzZWFyY2ggcmVjdXJzaXZlbHkgYW5kIGFjY2VwdHMgd2lsZGNhcmRzLCBtYWtlIHN1cmUgb25seSBmdW5jdGlvbnMgYXJlIGZvdW5kDQoNCgkuUEFSQU1FVEVSIE1vZHVsZU5hbWUNCgkJTmFtZSBvZiB0aGUgbW9kdWxlIHRvIGJlIHRlc3RlZC4NCgkJVGhlIG1vZHVsZSBtdXN0IGFscmVhZHkgYmUgaW1wb3J0ZWQNCg0KCS5QQVJBTUVURVIgRXhjZXB0aW9uc0ZpbGUNCgkJRmlsZSBpbiB3aGljaCBleGNlcHRpb25zIGFuZCBhZGp1c3RtZW50cyBhcmUgY29uZmlndXJlZC4NCgkJSW4gaXQgdGhlcmUgc2hvdWxkIGJlIHR3byBhcnJheXMgYW5kIGEgaGFzaHRhYmxlIGRlZmluZWQ6DQoJCQkkZ2xvYmFsOkZ1bmN0aW9uSGVscFRlc3RFeGNlcHRpb25zDQoJCQkkZ2xvYmFsOkhlbHBUZXN0RW51bWVyYXRlZEFycmF5cw0KCQkJJGdsb2JhbDpIZWxwVGVzdFNraXBQYXJhbWV0ZXJUeXBlDQoJCVRoZXNlIGNhbiBiZSB1c2VkIHRvIHR3ZWFrIHRoZSB0ZXN0cyBzbGlnaHRseSBpbiBjYXNlcyBvZiBuZWVkLg0KCQlTZWUgdGhlIGV4YW1wbGUgZmlsZSBmb3IgZXhwbGFuYXRpb25zIG9uIGVhY2ggb2YgdGhlc2UgdXNhZ2UgYW5kIGVmZmVjdC4NCiM+DQpbQ21kbGV0QmluZGluZygpXQ0KUGFyYW0gKA0KCVtzd2l0Y2hdDQoJJFNraXBUZXN0LA0KCQ0KCVtzdHJpbmdbXV0NCgkkQ29tbWFuZFBhdGggPSBAKCIkUFNTY3JpcHRSb290XC4uXC4uXGZ1bmN0aW9ucyIsICIkUFNTY3JpcHRSb290XC4uXC4uXGludGVybmFsXGZ1bmN0aW9ucyIpLA0KCQ0KCVtzdHJpbmddDQoJJE1vZHVsZU5hbWUgPSAiw75uYW1lw74iLA0KCQ0KCVtzdHJpbmddDQoJJEV4Y2VwdGlvbnNGaWxlID0gIiRQU1NjcmlwdFJvb3RcSGVscC5FeGNlcHRpb25zLnBzMSINCikNCmlmICgkU2tpcFRlc3QpIHsgcmV0dXJuIH0NCi4gJEV4Y2VwdGlvbnNGaWxlDQoNCiRpbmNsdWRlZE5hbWVzID0gKEdldC1DaGlsZEl0ZW0gJENvbW1hbmRQYXRoIC1SZWN1cnNlIC1GaWxlIHwgV2hlcmUtT2JqZWN0IE5hbWUgLWxpa2UgIioucHMxIikuQmFzZU5hbWUNCiRjb21tYW5kcyA9IEdldC1Db21tYW5kIC1Nb2R1bGUgKEdldC1Nb2R1bGUgJE1vZHVsZU5hbWUpIC1Db21tYW5kVHlwZSBDbWRsZXQsIEZ1bmN0aW9uLCBXb3JrZmxvdyB8IFdoZXJlLU9iamVjdCBOYW1lIC1pbiAkaW5jbHVkZWROYW1lcw0KDQojIyBXaGVuIHRlc3RpbmcgaGVscCwgcmVtZW1iZXIgdGhhdCBoZWxwIGlzIGNhY2hlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggc2Vzc2lvbi4NCiMjIFRvIHRlc3QsIHJlc3RhcnQgc2Vzc2lvbi4NCg0KDQpmb3JlYWNoICgkY29tbWFuZCBpbiAkY29tbWFuZHMpIHsNCiAgICAkY29tbWFuZE5hbWUgPSAkY29tbWFuZC5OYW1lDQogICAgDQogICAgIyBTa2lwIGFsbCBmdW5jdGlvbnMgdGhhdCBhcmUgb24gdGhlIGV4Y2x1c2lvbnMgbGlzdA0KICAgIGlmICgkZ2xvYmFsOkZ1bmN0aW9uSGVscFRlc3RFeGNlcHRpb25zIC1jb250YWlucyAkY29tbWFuZE5hbWUpIHsgY29udGludWUgfQ0KICAgIA0KICAgICMgVGhlIG1vZHVsZS1xdWFsaWZpZWQgY29tbWFuZCBmYWlscyBvbiBNaWNyb3NvZnQuUG93ZXJTaGVsbC5BcmNoaXZlIGNtZGxldHMNCiAgICAkSGVscCA9IEdldC1IZWxwICRjb21tYW5kTmFtZSAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZQ0KICAgICR0ZXN0aGVscGVycm9ycyA9IDANCiAgICAkdGVzdGhlbHBhbGwgPSAwDQogICAgRGVzY3JpYmUgIlRlc3QgaGVscCBmb3IgJGNvbW1hbmROYW1lIiB7DQogICAgICAgIA0KICAgICAgICAkdGVzdGhlbHBhbGwgKz0gMQ0KICAgICAgICBpZiAoJEhlbHAuU3lub3BzaXMgLWxpa2UgJypgW2A8Q29tbW9uUGFyYW1ldGVyc2A+YF0qJykgew0KICAgICAgICAgICAgIyBJZiBoZWxwIGlzIG5vdCBmb3VuZCwgc3lub3BzaXMgaW4gYXV0by1nZW5lcmF0ZWQgaGVscCBpcyB0aGUgc3ludGF4IGRpYWdyYW0NCiAgICAgICAgICAgIEl0ICJzaG91bGQgbm90IGJlIGF1dG8tZ2VuZXJhdGVkIiB7DQogICAgICAgICAgICAgICAgJEhlbHAuU3lub3BzaXMgfCBTaG91bGQgLU5vdCAtQmVMaWtlICcqYFtgPENvbW1vblBhcmFtZXRlcnNgPmBdKicNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICR0ZXN0aGVscGVycm9ycyArPSAxDQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgICR0ZXN0aGVscGFsbCArPSAxDQogICAgICAgIGlmIChbU3RyaW5nXTo6SXNOdWxsT3JFbXB0eSgkSGVscC5EZXNjcmlwdGlvbi5UZXh0KSkgew0KICAgICAgICAgICAgIyBTaG91bGQgYmUgYSBkZXNjcmlwdGlvbiBmb3IgZXZlcnkgZnVuY3Rpb24NCiAgICAgICAgICAgIEl0ICJnZXRzIGRlc2NyaXB0aW9uIGZvciAkY29tbWFuZE5hbWUiIHsNCiAgICAgICAgICAgICAgICAkSGVscC5EZXNjcmlwdGlvbiB8IFNob3VsZCAtTm90IC1CZU51bGxPckVtcHR5DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkdGVzdGhlbHBlcnJvcnMgKz0gMQ0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAkdGVzdGhlbHBhbGwgKz0gMQ0KICAgICAgICBpZiAoW1N0cmluZ106OklzTnVsbE9yRW1wdHkoKCRIZWxwLkV4YW1wbGVzLkV4YW1wbGUgfCBTZWxlY3QtT2JqZWN0IC1GaXJzdCAxKS5Db2RlKSkgew0KICAgICAgICAgICAgIyBTaG91bGQgYmUgYXQgbGVhc3Qgb25lIGV4YW1wbGUNCiAgICAgICAgICAgIEl0ICJnZXRzIGV4YW1wbGUgY29kZSBmcm9tICRjb21tYW5kTmFtZSIgew0KICAgICAgICAgICAgICAgICgkSGVscC5FeGFtcGxlcy5FeGFtcGxlIHwgU2VsZWN0LU9iamVjdCAtRmlyc3QgMSkuQ29kZSB8IFNob3VsZCAtTm90IC1CZU51bGxPckVtcHR5DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkdGVzdGhlbHBlcnJvcnMgKz0gMQ0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAkdGVzdGhlbHBhbGwgKz0gMQ0KICAgICAgICBpZiAoW1N0cmluZ106OklzTnVsbE9yRW1wdHkoKCRIZWxwLkV4YW1wbGVzLkV4YW1wbGUuUmVtYXJrcyB8IFNlbGVjdC1PYmplY3QgLUZpcnN0IDEpLlRleHQpKSB7DQogICAgICAgICAgICAjIFNob3VsZCBiZSBhdCBsZWFzdCBvbmUgZXhhbXBsZSBkZXNjcmlwdGlvbg0KICAgICAgICAgICAgSXQgImdldHMgZXhhbXBsZSBoZWxwIGZyb20gJGNvbW1hbmROYW1lIiB7DQogICAgICAgICAgICAgICAgKCRIZWxwLkV4YW1wbGVzLkV4YW1wbGUuUmVtYXJrcyB8IFNlbGVjdC1PYmplY3QgLUZpcnN0IDEpLlRleHQgfCBTaG91bGQgLU5vdCAtQmVOdWxsT3JFbXB0eQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJHRlc3RoZWxwZXJyb3JzICs9IDENCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgaWYgKCR0ZXN0aGVscGVycm9ycyAtZXEgMCkgew0KICAgICAgICAgICAgSXQgIlJhbiBzaWxlbnRseSAkdGVzdGhlbHBhbGwgdGVzdHMiIHsNCiAgICAgICAgICAgICAgICAkdGVzdGhlbHBlcnJvcnMgfCBTaG91bGQgLWJlIDANCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgJHRlc3RwYXJhbXNhbGwgPSAwDQogICAgICAgICR0ZXN0cGFyYW1zZXJyb3JzID0gMA0KICAgICAgICBDb250ZXh0ICJUZXN0IHBhcmFtZXRlciBoZWxwIGZvciAkY29tbWFuZE5hbWUiIHsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgJENvbW1vbiA9ICdEZWJ1ZycsICdFcnJvckFjdGlvbicsICdFcnJvclZhcmlhYmxlJywgJ0luZm9ybWF0aW9uQWN0aW9uJywgJ0luZm9ybWF0aW9uVmFyaWFibGUnLCAnT3V0QnVmZmVyJywgJ091dFZhcmlhYmxlJywNCiAgICAgICAgICAgICdQaXBlbGluZVZhcmlhYmxlJywgJ1ZlcmJvc2UnLCAnV2FybmluZ0FjdGlvbicsICdXYXJuaW5nVmFyaWFibGUnDQogICAgICAgICAgICANCiAgICAgICAgICAgICRwYXJhbWV0ZXJzID0gJGNvbW1hbmQuUGFyYW1ldGVyU2V0cy5QYXJhbWV0ZXJzIHwgU29ydC1PYmplY3QgLVByb3BlcnR5IE5hbWUgLVVuaXF1ZSB8IFdoZXJlLU9iamVjdCBOYW1lIC1ub3RpbiAkY29tbW9uDQogICAgICAgICAgICAkcGFyYW1ldGVyTmFtZXMgPSAkcGFyYW1ldGVycy5OYW1lDQogICAgICAgICAgICAkSGVscFBhcmFtZXRlck5hbWVzID0gJEhlbHAuUGFyYW1ldGVycy5QYXJhbWV0ZXIuTmFtZSB8IFNvcnQtT2JqZWN0IC1VbmlxdWUNCiAgICAgICAgICAgIGZvcmVhY2ggKCRwYXJhbWV0ZXIgaW4gJHBhcmFtZXRlcnMpIHsNCiAgICAgICAgICAgICAgICAkcGFyYW1ldGVyTmFtZSA9ICRwYXJhbWV0ZXIuTmFtZQ0KICAgICAgICAgICAgICAgICRwYXJhbWV0ZXJIZWxwID0gJEhlbHAucGFyYW1ldGVycy5wYXJhbWV0ZXIgfCBXaGVyZS1PYmplY3QgTmFtZSAtRVEgJHBhcmFtZXRlck5hbWUNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAkdGVzdHBhcmFtc2FsbCArPSAxDQogICAgICAgICAgICAgICAgaWYgKFtTdHJpbmddOjpJc051bGxPckVtcHR5KCRwYXJhbWV0ZXJIZWxwLkRlc2NyaXB0aW9uLlRleHQpKSB7DQogICAgICAgICAgICAgICAgICAgICMgU2hvdWxkIGJlIGEgZGVzY3JpcHRpb24gZm9yIGV2ZXJ5IHBhcmFtZXRlcg0KICAgICAgICAgICAgICAgICAgICBJdCAiZ2V0cyBoZWxwIGZvciBwYXJhbWV0ZXI6ICRwYXJhbWV0ZXJOYW1lIDogaW4gJGNvbW1hbmROYW1lIiB7DQogICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW1ldGVySGVscC5EZXNjcmlwdGlvbi5UZXh0IHwgU2hvdWxkIC1Ob3QgLUJlTnVsbE9yRW1wdHkNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAkdGVzdHBhcmFtc2Vycm9ycyArPSAxDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICR0ZXN0cGFyYW1zYWxsICs9IDENCiAgICAgICAgICAgICAgICAkY29kZU1hbmRhdG9yeSA9ICRwYXJhbWV0ZXIuSXNNYW5kYXRvcnkudG9TdHJpbmcoKQ0KICAgICAgICAgICAgICAgIGlmICgkcGFyYW1ldGVySGVscC5SZXF1aXJlZCAtbmUgJGNvZGVNYW5kYXRvcnkpIHsNCiAgICAgICAgICAgICAgICAgICAgIyBSZXF1aXJlZCB2YWx1ZSBpbiBIZWxwIHNob3VsZCBtYXRjaCBJc01hbmRhdG9yeSBwcm9wZXJ0eSBvZiBwYXJhbWV0ZXINCiAgICAgICAgICAgICAgICAgICAgSXQgImhlbHAgZm9yICRwYXJhbWV0ZXJOYW1lIHBhcmFtZXRlciBpbiAkY29tbWFuZE5hbWUgaGFzIGNvcnJlY3QgTWFuZGF0b3J5IHZhbHVlIiB7DQogICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW1ldGVySGVscC5SZXF1aXJlZCB8IFNob3VsZCAtQmUgJGNvZGVNYW5kYXRvcnkNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAkdGVzdHBhcmFtc2Vycm9ycyArPSAxDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmICgkSGVscFRlc3RTa2lwUGFyYW1ldGVyVHlwZVskY29tbWFuZE5hbWVdIC1jb250YWlucyAkcGFyYW1ldGVyTmFtZSkgeyBjb250aW51ZSB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgJGNvZGVUeXBlID0gJHBhcmFtZXRlci5QYXJhbWV0ZXJUeXBlLk5hbWUNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAkdGVzdHBhcmFtc2FsbCArPSAxDQogICAgICAgICAgICAgICAgaWYgKCRwYXJhbWV0ZXIuUGFyYW1ldGVyVHlwZS5Jc0VudW0pIHsNCiAgICAgICAgICAgICAgICAgICAgIyBFbnVtZXJhdGlvbnMgb2Z0ZW4gaGF2ZSBpc3N1ZXMgd2l0aCB0aGUgdHlwZW5hbWUgbm90IGJlaW5nIHJlbGlhYmx5IGF2YWlsYWJsZQ0KICAgICAgICAgICAgICAgICAgICAkbmFtZXMgPSAkcGFyYW1ldGVyLlBhcmFtZXRlclR5cGU6OkdldE5hbWVzKCRwYXJhbWV0ZXIuUGFyYW1ldGVyVHlwZSkNCiAgICAgICAgICAgICAgICAgICAgaWYgKCRwYXJhbWV0ZXJIZWxwLnBhcmFtZXRlclZhbHVlR3JvdXAucGFyYW1ldGVyVmFsdWUgLW5lICRuYW1lcykgew0KICAgICAgICAgICAgICAgICAgICAgICAgIyBQYXJhbWV0ZXIgdHlwZSBpbiBIZWxwIHNob3VsZCBtYXRjaCBjb2RlDQogICAgICAgICAgICAgICAgICAgICAgICBJdCAiaGVscCBmb3IgJGNvbW1hbmROYW1lIGhhcyBjb3JyZWN0IHBhcmFtZXRlciB0eXBlIGZvciAkcGFyYW1ldGVyTmFtZSIgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbWV0ZXJIZWxwLnBhcmFtZXRlclZhbHVlR3JvdXAucGFyYW1ldGVyVmFsdWUgfCBTaG91bGQgLWJlICRuYW1lcw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgJHRlc3RwYXJhbXNlcnJvcnMgKz0gMQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2VpZiAoJHBhcmFtZXRlci5QYXJhbWV0ZXJUeXBlLkZ1bGxOYW1lIC1pbiAkSGVscFRlc3RFbnVtZXJhdGVkQXJyYXlzKSB7DQogICAgICAgICAgICAgICAgICAgICMgRW51bWVyYXRpb25zIG9mdGVuIGhhdmUgaXNzdWVzIHdpdGggdGhlIHR5cGVuYW1lIG5vdCBiZWluZyByZWxpYWJseSBhdmFpbGFibGUNCiAgICAgICAgICAgICAgICAgICAgJG5hbWVzID0gW0VudW1dOjpHZXROYW1lcygkcGFyYW1ldGVyLlBhcmFtZXRlclR5cGUuRGVjbGFyZWRNZW1iZXJzWzBdLlJldHVyblR5cGUpDQogICAgICAgICAgICAgICAgICAgIGlmICgkcGFyYW1ldGVySGVscC5wYXJhbWV0ZXJWYWx1ZUdyb3VwLnBhcmFtZXRlclZhbHVlIC1uZSAkbmFtZXMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICMgUGFyYW1ldGVyIHR5cGUgaW4gSGVscCBzaG91bGQgbWF0Y2ggY29kZQ0KICAgICAgICAgICAgICAgICAgICAgICAgSXQgImhlbHAgZm9yICRjb21tYW5kTmFtZSBoYXMgY29ycmVjdCBwYXJhbWV0ZXIgdHlwZSBmb3IgJHBhcmFtZXRlck5hbWUiIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW1ldGVySGVscC5wYXJhbWV0ZXJWYWx1ZUdyb3VwLnBhcmFtZXRlclZhbHVlIHwgU2hvdWxkIC1iZSAkbmFtZXMNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICR0ZXN0cGFyYW1zZXJyb3JzICs9IDENCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgIyBUbyBhdm9pZCBjYWxsaW5nIFRyaW0gbWV0aG9kIG9uIGEgbnVsbCBvYmplY3QuDQogICAgICAgICAgICAgICAgICAgICRoZWxwVHlwZSA9IGlmICgkcGFyYW1ldGVySGVscC5wYXJhbWV0ZXJWYWx1ZSkgeyAkcGFyYW1ldGVySGVscC5wYXJhbWV0ZXJWYWx1ZS5UcmltKCkgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoJGhlbHBUeXBlIC1uZSAkY29kZVR5cGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICMgUGFyYW1ldGVyIHR5cGUgaW4gSGVscCBzaG91bGQgbWF0Y2ggY29kZQ0KICAgICAgICAgICAgICAgICAgICAgICAgSXQgImhlbHAgZm9yICRjb21tYW5kTmFtZSBoYXMgY29ycmVjdCBwYXJhbWV0ZXIgdHlwZSBmb3IgJHBhcmFtZXRlck5hbWUiIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaGVscFR5cGUgfCBTaG91bGQgLWJlICRjb2RlVHlwZQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgJHRlc3RwYXJhbXNlcnJvcnMgKz0gMQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yZWFjaCAoJGhlbHBQYXJtIGluICRIZWxwUGFyYW1ldGVyTmFtZXMpIHsNCiAgICAgICAgICAgICAgICAkdGVzdHBhcmFtc2FsbCArPSAxDQogICAgICAgICAgICAgICAgaWYgKCRoZWxwUGFybSAtbm90aW4gJHBhcmFtZXRlck5hbWVzKSB7DQogICAgICAgICAgICAgICAgICAgICMgU2hvdWxkbid0IGZpbmQgZXh0cmEgcGFyYW1ldGVycyBpbiBoZWxwLg0KICAgICAgICAgICAgICAgICAgICBJdCAiZmluZHMgaGVscCBwYXJhbWV0ZXIgaW4gY29kZTogJGhlbHBQYXJtIiB7DQogICAgICAgICAgICAgICAgICAgICAgICAkaGVscFBhcm0gLWluICRwYXJhbWV0ZXJOYW1lcyB8IFNob3VsZCAtQmUgJHRydWUNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAkdGVzdHBhcmFtc2Vycm9ycyArPSAxDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKCR0ZXN0cGFyYW1zZXJyb3JzIC1lcSAwKSB7DQogICAgICAgICAgICAgICAgSXQgIlJhbiBzaWxlbnRseSAkdGVzdHBhcmFtc2FsbCB0ZXN0cyIgew0KICAgICAgICAgICAgICAgICAgICAkdGVzdHBhcmFtc2Vycm9ycyB8IFNob3VsZCAtYmUgMA0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0BCXoAAAAJewAAAAZ8AAAADkhlbHAuVGVzdHMucHMxBn0AAAAWZ2VuZXJhbFxIZWxwLlRlc3RzLnBzMQkrAAAACX8AAAAJgAAAAAFTAAAAHwAAAAaBAAAA8A1EZXNjcmliZSAiVmFsaWRhdGluZyB0aGUgbW9kdWxlIG1hbmlmZXN0IiB7DQoJJG1vZHVsZVJvb3QgPSAoUmVzb2x2ZS1QYXRoICIkUFNTY3JpcHRSb290XC4uXC4uIikuUGF0aA0KCSRtYW5pZmVzdCA9ICgoR2V0LUNvbnRlbnQgIiRtb2R1bGVSb290XMO+bmFtZcO+LnBzZDEiKSAtam9pbiAiYG4iKSB8IEludm9rZS1FeHByZXNzaW9uDQoJQ29udGV4dCAiQmFzaWMgcmVzb3VyY2VzIHZhbGlkYXRpb24iIHsNCgkJJGZpbGVzID0gR2V0LUNoaWxkSXRlbSAiJG1vZHVsZVJvb3RcZnVuY3Rpb25zIiAtUmVjdXJzZSAtRmlsZSAtRmlsdGVyICIqLnBzMSINCgkJSXQgIkV4cG9ydHMgYWxsIGZ1bmN0aW9ucyBpbiB0aGUgcHVibGljIGZvbGRlciIgew0KCQkJDQoJCQkkZnVuY3Rpb25zID0gKENvbXBhcmUtT2JqZWN0IC1SZWZlcmVuY2VPYmplY3QgJGZpbGVzLkJhc2VOYW1lIC1EaWZmZXJlbmNlT2JqZWN0ICRtYW5pZmVzdC5GdW5jdGlvbnNUb0V4cG9ydCB8IFdoZXJlLU9iamVjdCBTaWRlSW5kaWNhdG9yIC1MaWtlICc8PScpLklucHV0T2JqZWN0DQoJCQkkZnVuY3Rpb25zIHwgU2hvdWxkIC1CZU51bGxPckVtcHR5DQoJCX0NCgkJSXQgIkV4cG9ydHMgbm8gZnVuY3Rpb24gdGhhdCBpc24ndCBhbHNvIHByZXNlbnQgaW4gdGhlIHB1YmxpYyBmb2xkZXIiIHsNCgkJCSRmdW5jdGlvbnMgPSAoQ29tcGFyZS1PYmplY3QgLVJlZmVyZW5jZU9iamVjdCAkZmlsZXMuQmFzZU5hbWUgLURpZmZlcmVuY2VPYmplY3QgJG1hbmlmZXN0LkZ1bmN0aW9uc1RvRXhwb3J0IHwgV2hlcmUtT2JqZWN0IFNpZGVJbmRpY2F0b3IgLUxpa2UgJz0+JykuSW5wdXRPYmplY3QNCgkJCSRmdW5jdGlvbnMgfCBTaG91bGQgLUJlTnVsbE9yRW1wdHkNCgkJfQ0KCQkNCgkJSXQgIkV4cG9ydHMgbm9uZSBvZiBpdHMgaW50ZXJuYWwgZnVuY3Rpb25zIiB7DQoJCQkkZmlsZXMgPSBHZXQtQ2hpbGRJdGVtICIkbW9kdWxlUm9vdFxpbnRlcm5hbFxmdW5jdGlvbnMiIC1SZWN1cnNlIC1GaWxlIC1GaWx0ZXIgIioucHMxIg0KCQkJJGZpbGVzIHwgV2hlcmUtT2JqZWN0IEJhc2VOYW1lIC1JbiAkbWFuaWZlc3QuRnVuY3Rpb25zVG9FeHBvcnQgfCBTaG91bGQgLUJlTnVsbE9yRW1wdHkNCgkJfQ0KCX0NCgkNCglDb250ZXh0ICJJbmRpdmlkdWFsIGZpbGUgdmFsaWRhdGlvbiIgew0KCQlJdCAiVGhlIHJvb3QgbW9kdWxlIGZpbGUgZXhpc3RzIiB7DQoJCQlUZXN0LVBhdGggIiRtb2R1bGVSb290XCQoJG1hbmlmZXN0LlJvb3RNb2R1bGUpIiB8IFNob3VsZCAtQmUgJHRydWUNCgkJfQ0KCQkNCgkJZm9yZWFjaCAoJGZvcm1hdCBpbiAkbWFuaWZlc3QuRm9ybWF0c1RvUHJvY2VzcykNCgkJew0KCQkJSXQgIlRoZSBmaWxlICRmb3JtYXQgc2hvdWxkIGV4aXN0IiB7DQoJCQkJVGVzdC1QYXRoICIkbW9kdWxlUm9vdFwkZm9ybWF0IiB8IFNob3VsZCAtQmUgJHRydWUNCgkJCX0NCgkJfQ0KCQkNCgkJZm9yZWFjaCAoJHR5cGUgaW4gJG1hbmlmZXN0LlR5cGVzVG9Qcm9jZXNzKQ0KCQl7DQoJCQlJdCAiVGhlIGZpbGUgJHR5cGUgc2hvdWxkIGV4aXN0IiB7DQoJCQkJVGVzdC1QYXRoICIkbW9kdWxlUm9vdFwkdHlwZSIgfCBTaG91bGQgLUJlICR0cnVlDQoJCQl9DQoJCX0NCgkJDQoJCWZvcmVhY2ggKCRhc3NlbWJseSBpbiAkbWFuaWZlc3QuUmVxdWlyZWRBc3NlbWJsaWVzKQ0KCQl7DQoJCQlJdCAiVGhlIGZpbGUgJGFzc2VtYmx5IHNob3VsZCBleGlzdCIgew0KCQkJCVRlc3QtUGF0aCAiJG1vZHVsZVJvb3RcJGFzc2VtYmx5IiB8IFNob3VsZCAtQmUgJHRydWUNCgkJCX0NCgkJfQ0KCX0NCn0BCYIAAAAJgwAAAAaEAAAAEk1hbmlmZXN0LlRlc3RzLnBzMQaFAAAAGmdlbmVyYWxcTWFuaWZlc3QuVGVzdHMucHMxCSsAAAAJhwAAAAmIAAAAAVQAAAAfAAAABokAAAD1B1tDbWRsZXRCaW5kaW5nKCldDQpQYXJhbSAoDQoJW3N3aXRjaF0NCgkkU2tpcFRlc3QsDQoJDQoJW3N0cmluZ1tdXQ0KCSRDb21tYW5kUGF0aCA9IEAoIiRQU1NjcmlwdFJvb3RcLi5cLi5cZnVuY3Rpb25zIiwgIiRQU1NjcmlwdFJvb3RcLi5cLi5caW50ZXJuYWxcZnVuY3Rpb25zIikNCikNCg0KaWYgKCRTa2lwVGVzdCkgeyByZXR1cm4gfQ0KDQokbGlzdCA9IE5ldy1PYmplY3QgU3lzdGVtLkNvbGxlY3Rpb25zLkFycmF5TGlzdA0KDQpEZXNjcmliZSAnSW52b2tpbmcgUFNTY3JpcHRBbmFseXplciBhZ2FpbnN0IGNvbW1hbmRiYXNlJyB7DQoJJGNvbW1hbmRGaWxlcyA9IEdldC1DaGlsZEl0ZW0gLVBhdGggJENvbW1hbmRQYXRoIC1SZWN1cnNlIC1GaWx0ZXIgIioucHMxIg0KCSRzY3JpcHRBbmFseXplclJ1bGVzID0gR2V0LVNjcmlwdEFuYWx5emVyUnVsZQ0KCQ0KCWZvcmVhY2ggKCRmaWxlIGluICRjb21tYW5kRmlsZXMpDQoJew0KCQlDb250ZXh0ICJBbmFseXppbmcgJCgkZmlsZS5CYXNlTmFtZSkiIHsNCgkJCSRhbmFseXNpcyA9IEludm9rZS1TY3JpcHRBbmFseXplciAtUGF0aCAkZmlsZS5GdWxsTmFtZSAtRXhjbHVkZVJ1bGUgUFNBdm9pZFRyYWlsaW5nV2hpdGVzcGFjZSwgUFNTaG91bGRQcm9jZXNzDQoJCQkNCgkJCWZvckVhY2ggKCRydWxlIGluICRzY3JpcHRBbmFseXplclJ1bGVzKQ0KCQkJew0KCQkJCUl0ICJTaG91bGQgcGFzcyAkcnVsZSIgew0KCQkJCQlJZiAoJGFuYWx5c2lzLlJ1bGVOYW1lIC1jb250YWlucyAkcnVsZSkNCgkJCQkJew0KCQkJCQkJJGFuYWx5c2lzIHwgV2hlcmUtT2JqZWN0IFJ1bGVOYW1lIC1FUSAkcnVsZSAtb3V0dmFyaWFibGUgZmFpbHVyZXMgfCBGb3JFYWNoLU9iamVjdCB7ICRsaXN0LkFkZCgkXykgfQ0KCQkJCQkJDQoJCQkJCQkxIHwgU2hvdWxkIEJlIDANCgkJCQkJfQ0KCQkJCQllbHNlDQoJCQkJCXsNCgkJCQkJCTAgfCBTaG91bGQgQmUgMA0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KfQ0KDQokbGlzdCB8IE91dC1EZWZhdWx0AQmKAAAACYsAAAAGjAAAABpQU1NjcmlwdEFuYWx5emVyLlRlc3RzLnBzMQaNAAAAImdlbmVyYWxcUFNTY3JpcHRBbmFseXplci5UZXN0cy5wczEJKwAAAAmPAAAACZAAAAABWgAAAAgAAAAJSAAAAAAAAAAAAAAAAVsAAAAIAAAACUgAAAAAAAAAAAAAAAFfAAAACAAAAAlIAAAAAAAAAAAAAAABYAAAAAgAAAAJSAAAAAAAAAAAAAAAAWIAAAAIAAAACUgAAAAAAAAAAAAAAAFjAAAACAAAAAlIAAAAAAAAAAAAAAABZwAAAAgAAAAJSAAAAAAAAAAAAAAAAWgAAAAIAAAACUgAAAAAAAAAAAAAAAFqAAAACAAAAAlIAAAAAAAAAAAAAAABawAAAAgAAAAJSAAAAAAAAAAAAAAAAW8AAAAIAAAACUgAAAAAAAAAAAAAAAFwAAAACAAAAAlIAAAAAAAAAAAAAAABcgAAAAgAAAAJSAAAAAAAAAAAAAAAAXMAAAAIAAAACUgAAAAAAAAAAAAAAAF3AAAACAAAAAlIAAAAAAAAAAAAAAABeAAAAAgAAAAJSAAAAAAAAAAAAAAAAXoAAAAIAAAACZIAAAABAAAAAQAAAAF7AAAACAAAAAlIAAAAAAAAAAAAAAABfwAAAAgAAAAJSAAAAAAAAAAAAAAAAYAAAAAIAAAACUgAAAAAAAAAAAAAAAGCAAAACAAAAAmUAAAAAQAAAAEAAAABgwAAAAgAAAAJSAAAAAAAAAAAAAAAAYcAAAAIAAAACUgAAAAAAAAAAAAAAAGIAAAACAAAAAlIAAAAAAAAAAAAAAABigAAAAgAAAAJSAAAAAAAAAAAAAAAAYsAAAAIAAAACUgAAAAAAAAAAAAAAAGPAAAACAAAAAlIAAAAAAAAAAAAAAABkAAAAAgAAAAJSAAAAAAAAAAAAAAAEZIAAAAEAAAABpYAAAAEbmFtZQ0DEZQAAAAEAAAABpcAAAAEbmFtZQ0DCw==</BA> </MS> </Obj> </Objs> |