Skip to content

Instantly share code, notes, and snippets.

@aziascreations
Created November 18, 2018 11:33
Show Gist options
  • Save aziascreations/5716abc839218908eef6410fc1d4fe1b to your computer and use it in GitHub Desktop.
Save aziascreations/5716abc839218908eef6410fc1d4fe1b to your computer and use it in GitHub Desktop.
An Include that help you analyse ".umod" files and read it's content.
W1NldHVwXQ0KUHJvZHVjdD1EZWNhbCBTdGF5DQpWZXJzaW9uPTIwMA0KQXJjaGl2ZT1EZWNhbFN0YXkudW1vZA0KU3JjUGF0aD0uDQpNYXN0ZXJQYXRoPS4uDQpSZXF1aXJlcz1VbnJlYWxUb3VybmFtZW50NDAwUmVxdWlyZW1lbnQNCkdyb3VwPVNldHVwR3JvdXANCkdyb3VwPURlY2FsU3RheUdyb3VwDQpHcm91cD11bW9kSW5jbHVkZUZpbGVzR3JvdXANCg0KW1VucmVhbFRvdXJuYW1lbnQ0MDBSZXF1aXJlbWVudF0NClByb2R1Y3Q9VW5yZWFsVG91cm5hbWVudA0KVmVyc2lvbj00MDANCg0KW1NldHVwR3JvdXBdDQpDb3B5PShTcmM9U3lzdGVtXE1hbmlmZXN0LmluaSxNYXN0ZXI9U3lzdGVtXE1hbmlmZXN0LmluaSxTaXplPTQ3OSxGbGFncz0zKQ0KQ29weT0oU3JjPVN5c3RlbVxNYW5pZmVzdC5pbnQsTWFzdGVyPVN5c3RlbVxNYW5pZmVzdC5pbnQsU2l6ZT00NzgsRmxhZ3M9MykNCg0KW0RlY2FsU3RheUdyb3VwXQ0KRmlsZT0oU3JjPVN5c3RlbVxEZWNhbFN0YXkudSxTaXplPTMyMDQwKQ0KRmlsZT0oU3JjPVN5c3RlbVxEZWNhbFN0YXkuaW50LFNpemU9ODkpDQoNClt1bW9kSW5jbHVkZUZpbGVzR3JvdXBdDQpGaWxlPShTcmM9SGVscFxEZWNhbFN0YXkuaHRtLFNpemU9MjQ5OCkNCg0KW1NldHVwXQ0KTG9jYWxQcm9kdWN0PURlY2FsIFN0YXkNClJlYWRNZT1IZWxwXERlY2FsU3RheS5odG0NClNldHVwV2luZG93VGl0bGU9RGVjYWwgU3RheQ0KQXV0b3BsYXlXaW5kb3dUaXRsZT1EZWNhbCBTdGF5IE9wdGlvbnMNClByb2R1Y3RVUkw9aHR0cDovL3d3dy5wbGFuZXR1bnJlYWwuY29tL3BpcGVsaW5lL21pc2Ntb2RzL2RlY2Fsc3RheS5odG0NClZlcnNpb25VUkw9aHR0cDovL3d3dy5wbGFuZXR1bnJlYWwuY29tL3BpcGVsaW5lL21pc2Ntb2RzL2RlY2Fsc3RheS5odG0NCkRldmVsb3Blcj1Nb25nbyAoTWlrZSBMYW1iZXJ0KQ0KRGV2ZWxvcGVyVVJMPWh0dHA6Ly93d3cucGxhbmV0dW5yZWFsLmNvbS9waXBlbGluZS8NCg0KW1VucmVhbFRvdXJuYW1lbnQ0MDBSZXF1aXJlbWVudF0NCkxvY2FsUHJvZHVjdD1VbnJlYWxUb3VybmFtZW50DQpQcm9kdWN0VVJMPQ0KVmVyc2lvblVSTD0NCkRldmVsb3Blcj0NCkRldmVsb3BlclVSTD0NCsGDKp5EAAAAAQAAAPYAAABIAAAAjgAAAHl0AACmAAAA1m4AACBUKoXGpNMRgDAAEEueaeUCAAAAiQAAAPEAAACOAAAA9gAAAAVOb25lABAEBwQFQ29yZQAQAAcECkRlY2FsU3RheQAQAAcAB1N5c3RlbQAQAAcEB1NwbGF0cwAQAAcAB0VuZ2luZQAQAAcECFRleHR1cmUAEAAHBApEcmF3U2NhbGUAEAAHAAlTZXRWYWx1ZQAQAAcAEE11bHRpRGVjYWxMZXZlbAAQAAcACFNldFRleHQAEAAHAAZUaW1lcgAQAAcEDEF0dGFjaERlY2FsABAABwAKQmVnaW5QbGF5ABAABwQLYkltcG9ydGFudAAQAAcACFVXaW5kb3cAEAAHAApTZXR1cFRleHQAEAAHAA1SZXN0YXJ0RGVjYWwAEAAHAAVUaWNrABAABwQIU2V0Rm9udAAQAAcACFBvY2tUZXgAEAAHAAtTYXZlVmFsdWVzABAABwAHTm90aWZ5ABAABwAIQ3JlYXRlZAAQAAcADkNyZWF0ZUNvbnRyb2wAEAAHAAZVTWVudQAQAAcAB0NEUG9jawAQAAcACUdldFZhbHVlABAABwANQ2FwdHVyZU1vdXNlABAABwAPVGltZU11bHRpcGxpZXIAEAAHAAlNdXRhdG9ycwAQAAcAE0NERGlyZWN0aW9uYWxCbGFzdAAQAAcADUNEUmlwcGVyTWFyawAQAAcADkNETnVjbGVhck1hcmsAEAAHABJEZWNhbExlbmd0aFNsaWRlcgAQAAcACkNEQmlvbWFyawAQAAcAEkNEQmlnRW5lcmd5SW1wYWN0ABAABwAYRGVjYWxDb25maWdDbGllbnRXaW5kb3cAEAAHAAxDREJsYXN0TWFyawAQAAcACUNERGVjYWxzABAABwAMRGVjYWxUaWNrZXIAEAAHAA5DRFVUQmxvb2RQb29sABAABwAPQ0RVVEJsb29kUG9vbDIAEAAHAA1DREltcGFjdEhvbGUAEAAHAAZDbG9zZQAQAAcADUNEQm9sdFNjb3JjaAAQAAcADUNEQmxvb2RTcGxhdAAQAAcAEkRlY2FsQ29uZmlnV2luZG93ABAABwAJQ0RTY29yY2gAEAAHAAlNZW51SGVscAAQAAcACEV4ZWN1dGUAEAAHAAxNZW51Q2FwdGlvbgAQAAcACU1heFZhbHVlABAABwAJTWluVmFsdWUAEAAHAAxDbGllbnRDbGFzcwAQAAcADENEV2FsbENyYWNrABAABwALQ2hlY2tWYWx1ZQAQAAcACUhlbHBUZXh0ABAABwAMV2luZG93VGl0bGUAEAAHAAZTZXR1cAAQAAcACk1vdXNlTW92ZQAQAAcACmJBdHRhY2hlZAAQAAcAEkRpcmVjdGlvbmFsQXR0YWNoABAABwALTE1vdXNlRG93bgAQAAcABVRleHQAEAAHABZHZXRMb29rQW5kRmVlbFRleHR1cmUAEAAHAAZQYWludAAQAAcACUxNb3VzZVVwABAABwAPQ0RFbmVyZ3lJbXBhY3QAEAAHAAxCZWZvcmVQYWludAAQAAcACEtleURvd24AEAAHAAZEZWNhbAAQAAcAB0NhbnZhcwAQAAcAE1VXaW5kb3dMb29rQW5kRmVlbAAQAAcACWJDaGVja2VkABAABwAMU3RyUHJvcGVydHkAEAAHBBFMYXN0UmVuZGVyZWRUaW1lABAABwAJUm90YXRpb24AEAAHAA9TdHJ1Y3RQcm9wZXJ0eQAQAAcEAkgAEAAHAARLZXkAEAAHAAZWYWx1ZQAQAAcABkxldmVsABAABwAGQWN0b3IAEAAHAAZPd25lcgAQAAcADGJEcm9wRGV0YWlsABAABwAJTmV3VmFsdWUAEAAHAAdSZWdpb24AEAAHAAliTG93R29yZQAQAAcAFlVXaW5kb3dIU2xpZGVyQ29udHJvbAAQAAcAGFVXaW5kb3dQdWxsZG93bk1lbnVJdGVtABAABwAYVVdpbmRvd1NtYWxsQ2xvc2VCdXR0b24AEAAHABNVV2luZG93U21hbGxCdXR0b24AEAAHAAREaXIAEAAHAApEZWx0YVRpbWUAEAAHAA5HZXRFbnRyeUxldmVsABAABwASVVdpbmRvd1Jvb3RXaW5kb3cAEAAHABBVV2luZG93Q2hlY2tib3gAEAAHABVVV2luZG93RGlhbG9nQ29udHJvbAAQAAcADkNsYXNzUHJvcGVydHkAEAAHBA5VV2luZG93V2luZG93ABAABwAMVGltZVNlY29uZHMAEAAHAAxVV2luZG93QmFzZQAQAAcAD0dldFBsYXllck93bmVyABAABwAJR2V0TGV2ZWwAEAAHAAhTZXRTaXplABAABwAGSExpbmUAEAAHAA1DcmVhdGVXaW5kb3cAEAAHABxEcmF3U3RyZXRjaGVkVGV4dHVyZVNlZ21lbnQAEAAHAAlDbGlwVGV4dAAQAAcADERyYXdVcEJldmVsABAABwALUGxheWVyUGF3bgAQAAcAAlAAEAAHAAZUZXh0WAAQAAcABlRleHRZABAABwAKYkRpc2FibGVkABAABwAGQWxpZ24AEAAHAA1QYXJlbnRXaW5kb3cAEAAHAApUZXh0Q29sb3IAEAAHAAtiTW91c2VEb3duABAABwANQnl0ZVByb3BlcnR5ABAABwQIQ2FwdGlvbgAQAAcACUxvY2F0aW9uABAABwAJVGV4dFNpemUAEAAHAAdWZWN0b3IAEAQHBAVSb290ABAABwAHT2JqZWN0ABAABwQMU2xpZGVyRHJhd1gAEAAHAAxTbGlkZXJEcmF3WQAQAAcACFBhY2thZ2UAEAQHBAtUcmFja1dpZHRoABAABwAJYlNsaWRpbmcAEAAHABFiTm9TbGlkaW5nTm90aWZ5ABAABwANQ2FuY2VsQnV0dG9uABAABwAaVVdpbmRvd0RpYWxvZ0NsaWVudFdpbmRvdwAQAAcAB1N0cnVjdAAQBAcEDExvb2tBbmRGZWVsABAABwAMQ2xvc2VCdXR0b24AEAAHAAtUZXh0QnVmZmVyABAABwQMVVdpbmRvd0xpc3QAEAAHABRVV2luZG93RnJhbWVkV2luZG93ABAABwAOVVdpbmRvd0J1dHRvbgAQAAcAElVNZW51TGFiZWxDb250cm9sABAABwASVU1lbnVGcmFtZWRXaW5kb3cAEAAHABFVTWVudU1vZE1lbnVJdGVtABAABwAJTWVudUl0ZW0AEAAHAAhCb3RwYWNrABAABwAPT2JqZWN0UHJvcGVydHkAEAAHBA5GbG9hdFByb3BlcnR5ABAABwQLUmVtb3RlUm9sZQAQAAcEFFVXaW5kb3dQdWxsZG93bk1lbnUAEAAHAAVwb2NrABAABwAMVVRCbG9vZFBvb2wAEAAHAA1VVEJsb29kUG9vbDIAEAAHAApEcmF3Q29sb3IAEAAHAApCbGFzdE1hcmsAEAAHAApXYWxsQ3JhY2sAEAAHAAhiaW9tYXJrABAABwAHU2NvcmNoABAABwAQQmlnRW5lcmd5SW1wYWN0ABAABwALUmlwcGVyTWFyawAQAAcADE51Y2xlYXJNYXJrABAABwALSW1wYWN0SG9sZQAQAAcADUVuZXJneUltcGFjdAAQAAcAC0JvbHRTY29yY2gAEAAHAAtCbG9vZFNwbGF0ABAABwARRGlyZWN0aW9uYWxCbGFzdAAQAAcADWJTdGFydGVkTGlmZQAQAAcADWJpZ3Nob2NrbWFyawAQAAcACWJpb3NwbGF0ABAABwAKYmlvc3BsYXQyABAABwAMcm9ja2V0Ymxhc3QAEAAHAAxCbG9vZFNwbGF0MQAQAAcADEJsb29kU3BsYXQyABAABwAMQmxvb2RTcGxhdDQAEAAHAAxCbG9vZFNwbGF0NQAQAAcADEJsb29kU3BsYXQ2ABAABwAMQmxvb2RTcGxhdDcAEAAHAAxCbG9vZFNwbGF0OAAQAAcADEJsb29kU3BsYXQ5ABAABwANQmxvb2RTcGxhdDEwABAABwAKc2hvY2ttYXJrABAABwALZW5lcmd5bWFyawAQAAcABU5vcm0AEAAHAAxpbXBhY3RjcmFjawAQAAcACWJpZ2JsYXN0ABAABwAIcG9jazBfdAAQAAcACHBvY2syX3QAEAAHAAhwb2NrNF90ABAABwAMcmlwcGVyYmxhc3QAEAAHAAtCbG9vZFBvb2w2ABAABwALQmxvb2RQb29sNwAQAAcAC0Jsb29kUG9vbDgAEAAHAAtCbG9vZFBvb2w5ABAABwALV2FsbENyYWNrMQAQAAcAC1dhbGxDcmFjazIAEAAHAAxCbG9vZFNwbGF0MwAQAAcADUJvb2xQcm9wZXJ0eQAQAAcEBkNsYXNzABAEBwQGQ29sb3IAEAQHBAVUZXN0ABAABwACWAAQAAcAB1dpblRvcAAQAAcAAkMAEAAHAAJFABAABwACWQAQAAcAAlcAEAAHAAtTY3JpcHRUZXh0ABAABwACdAAQAAcAAkIAEAAHAAJSABAABwACRwAQAAcADFJldHVyblZhbHVlABAABwAJRnVuY3Rpb24AEAQHBApMZXZlbEluZm8AEAAHAAlHYW1lSW5mbwAQAAcACVdpbldpZHRoABAABwANTm90aWZ5V2luZG93ABAABwAKV2luSGVpZ2h0ABAABwANRGVjYWxIYW5kbGVyABAABwAURGVjYWxNdWx0aXBsaWVyVGV4dAAQAAcAFERlY2FsTXVsdGlwbGllckhlbHAAEAAHABhEaXNhYmxlZENvbG9yTXVsdGlwbGllcgAQAAcADEludFByb3BlcnR5ABAABwQHU3RlcFVwABAABwAJU3RlcERvd24AEAAHAAxTbGlkZXJXaWR0aAAQAAcAEGJFeHRlbmRlZERlY2FscwAQAAcAEWJQZXJtYW5lbnREZWNhbHMAEAAHABBFbmFibGVkQ2hlY2tib3gAEAAHABJQZXJtYW5lbnRDaGVja2JveAAQAAcADERlY2FsTGVuZ3RoABAABwAQTXVsdGlwbGllckxhYmVsABAABwALVHJhY2tTdGFydAAQAAcAB3RpY2tlcgAQAAcACm5ld1Njb3JjaAAQAAcAD25ld1Njb3JjaENsYXNzABAABwAJbmV3RGVjYWwAEAAHABJOZXdUaW1lTXVsdGlwbGllcgAQAAcAFGJOZXdQZXJtYW5lbnREZWNhbHMAEAAHAAhXaW5MZWZ0ABAABwAFTm9uZQAQBAcEDlJlc3RhcnREZWNhbHMAEAAHAAtiVGltZXJMb29wABAABwATYk5ld0V4dGVuZGVkRGVjYWxzABAABwAKVGltZXJSYXRlABAABwCtAHsBLDD
W1NldHVwXQ0KUHJvZHVjdD1FeGNlc3NpdmUgZm9yIFVucmVhbCBUb3VybmFtZW50DQpWZXJzaW9uPTEwMA0KQXJjaGl2ZT1FeGNlc3NpdmUxMDAudW1vZA0KU3JjUGF0aD0uDQpNYXN0ZXJQYXRoPS4uDQpSZXF1aXJlcz1VbnJlYWxUb3VybmFtZW50UmVxdWlyZW1lbnQNCkdyb3VwPVNldHVwR3JvdXANCkdyb3VwPXVtb2RJTklHcm91cA0KR3JvdXA9RXhjZXNzaXZlR3JvdXANCg0KW1VucmVhbFRvdXJuYW1lbnRSZXF1aXJlbWVudF0NClByb2R1Y3Q9VW5yZWFsVG91cm5hbWVudA0KVmVyc2lvbj0NCg0KW1NldHVwR3JvdXBdDQpDb3B5PShTcmM9U3lzdGVtXE1hbmlmZXN0LmluaSxNYXN0ZXI9U3lzdGVtXE1hbmlmZXN0LmluaSxTaXplPTE1ODEsRmxhZ3M9MykNCkNvcHk9KFNyYz1TeXN0ZW1cTWFuaWZlc3QuaW50LE1hc3Rlcj1TeXN0ZW1cTWFuaWZlc3QuaW50LFNpemU9NjAzLEZsYWdzPTMpDQoNClt1bW9kSU5JR3JvdXBdDQpBZGRJbmk9VW5yZWFsVG91cm5hbWVudC5pbmksRW5naW5lLkdhbWVFbmdpbmUuU2VydmVyUGFja2FnZXM9RXhjZXNzaXZlDQpBZGRJbmk9VW5yZWFsVG91cm5hbWVudC5pbmksRXhjQnJvd3NlckRlYXRobWF0Y2guTGlzdEZhY3Rvcmllc1swXT1VQnJvd3Nlci5VQnJvd3NlclN1YnNldEZhY3QsU3VwZXJzZXRUYWc9VUJyb3dzZXJBbGwsR2FtZVR5cGU9RXhjZXNzaXZlRGVhdGhNYXRjaFBsdXMsYkNvbXBhdGlibGVTZXJ2ZXJzT25seT1UcnVlDQpBZGRJbmk9VW5yZWFsVG91cm5hbWVudC5pbmksRXhjQnJvd3NlclRlYW1HYW1lcy5MaXN0RmFjdG9yaWVzWzBdPVVCcm93c2VyLlVCcm93c2VyU3Vic2V0RmFjdCxTdXBlcnNldFRhZz1VQnJvd3NlckFsbCxHYW1lVHlwZT1FeGNlc3NpdmVUZWFtR2FtZVBsdXMsYkNvbXBhdGlibGVTZXJ2ZXJzT25seT1UcnVlDQpBZGRJbmk9VW5yZWFsVG91cm5hbWVudC5pbmksRXhjQnJvd3NlckNURi5MaXN0RmFjdG9yaWVzWzBdPVVCcm93c2VyLlVCcm93c2VyU3Vic2V0RmFjdCxTdXBlcnNldFRhZz1VQnJvd3NlckFsbCxHYW1lVHlwZT1FeGNlc3NpdmVDVEZHYW1lLGJDb21wYXRpYmxlU2VydmVyc09ubHk9VHJ1ZQ0KQWRkSW5pPVVucmVhbFRvdXJuYW1lbnQuaW5pLEV4Y0Jyb3dzZXJET00uTGlzdEZhY3Rvcmllc1swXT1VQnJvd3Nlci5VQnJvd3NlclN1YnNldEZhY3QsU3VwZXJzZXRUYWc9VUJyb3dzZXJBbGwsR2FtZVR5cGU9RXhjZXNzaXZlRG9taW5hdGlvbixiQ29tcGF0aWJsZVNlcnZlcnNPbmx5PVRydWUNCkFkZEluaT1VbnJlYWxUb3VybmFtZW50LmluaSxFeGNCcm93c2VyQVMuTGlzdEZhY3Rvcmllc1swXT1VQnJvd3Nlci5VQnJvd3NlclN1YnNldEZhY3QsU3VwZXJzZXRUYWc9VUJyb3dzZXJBbGwsR2FtZVR5cGU9RXhjZXNzaXZlQXNzYXVsdCxiQ29tcGF0aWJsZVNlcnZlcnNPbmx5PVRydWUNCkFkZEluaT1VbnJlYWxUb3VybmFtZW50LmluaSxFeGNCcm93c2VyTE1TLkxpc3RGYWN0b3JpZXNbMF09VUJyb3dzZXIuVUJyb3dzZXJTdWJzZXRGYWN0LFN1cGVyc2V0VGFnPVVCcm93c2VyQWxsLEdhbWVUeXBlPUV4Y2Vzc2l2ZUxhc3RNYW5TdGFuZGluZyxiQ29tcGF0aWJsZVNlcnZlcnNPbmx5PVRydWUNCg0KW0V4Y2Vzc2l2ZUdyb3VwXQ0KRmlsZT0oU3JjPVN5c3RlbVxFeGNlc3NpdmUudSxTaXplPTIyMzY2MSkNCkZpbGU9KFNyYz1TeXN0ZW1cRXhjZXNzaXZlLnR4dCxTaXplPTQ3NzcpDQpGaWxlPShTcmM9U3lzdGVtXEV4Y2Vzc2l2ZS5pbnQsU2l6ZT0zNjU0KQ0KDQpbU2V0dXBdDQpMb2NhbFByb2R1Y3Q9RXhjZXNzaXZlIGZvciBVbnJlYWwgVG91cm5hbWVudA0KUmVhZE1lPVN5c3RlbVxFeGNlc3NpdmUudHh0DQpTZXR1cFdpbmRvd1RpdGxlPU1yLiBQYW50cyBFWENFU1NJVkUgT3ZlcmtpbGwgZm9yIFVucmVhbCBUb3VybmFtZW50DQpBdXRvcGxheVdpbmRvd1RpdGxlPUV4Y2Vzc2l2ZSBmb3IgVW5yZWFsIFRvdXJuYW1lbnQgT3B0aW9ucw0KUHJvZHVjdFVSTD13d3cucGxhbmV0dW5yZWFsLmNvbS9leGNlc3NpdmUNClZlcnNpb25VUkw9d3d3LnBsYW5ldHVucmVhbC5jb20vZXhjZXNzaXZlDQpEZXZlbG9wZXI9Q2ljZXJvIChjaWNlcm9AbmV0aG9yc2UuY29tKQ0KRGV2ZWxvcGVyVVJMPXd3dy5wbGFuZXR1bnJlYWwuY29tL2V4Y2Vzc2l2ZQ0KDQpbVW5yZWFsVG91cm5hbWVudFJlcXVpcmVtZW50XQ0KTG9jYWxQcm9kdWN0PVVucmVhbFRvdXJuYW1lbnQNClByb2R1Y3RVUkw9aHR0cDovL3d3dy51bnJlYWx0b3VybmFtZW50LmNvbS8NClZlcnNpb25VUkw9aHR0cDovL3VucmVhbC5lcGljZ2FtZXMuY29tLw0KRGV2ZWxvcGVyPUVwaWMgR2FtZXMsIEluYy4NCkRldmVsb3BlclVSTD1odHRwOi8vd3d3LmVwaWNnYW1lcy5jb20vDQrBgyqeRQAAAAEAAABjAwAAQAAAAA0EAAAdJwMAgwIAABYRAwDAdLWKKhfUEbW9ABBaKEr9AQAAAA0EAABjAwAABU5vbmUAEAQHBAVDb3JlABAABwQKRXhjZXNzaXZlABAABwAJTXV0YXRvcnMAEAAHAAdFbmdpbmUAEAAHBAdTeXN0ZW0AEAAHBAhCb3RwYWNrABAABwAFVGljawAQAAcECEFuaW1FbmQAEAAHBAdEYW1hZ2UAEAAHAAtUYWtlRGFtYWdlABAABwQGc3BlZWQAEAAHAAZCZWdpbgAQAAcEBUZpcmUAEAAHAAhBbHRGaXJlABAABwAQU2VuZFF1ZXJ5UGFja2V0ABAABwAIVXNlQW1tbwAQAAcACUVuZFN0YXRlABAABwQLQWRkTXV0YXRvcgAQAAcADFBhcnNlT3B0aW9uABAABwALQXRDYXBhY2l0eQAQAAcAC0JlZ2luU3RhdGUAEAAHBA5XZWFwb25OZXdUeXBlABAABwAKQWx0RmlyaW5nABAABwAQV2VhcG9uTmV3U3RyaW5nABAABwAPV2VhcG9uQmFzZVR5cGUAEAAHAAdGaW5pc2gAEAAHABJTZXRTd2l0Y2hQcmlvcml0eQAQAAcABlRpbWVyABAABwQLQW1wTWVzc2FnZQAQAAcADFBsYXlMb2FkaW5nABAABwAEQm90ABAABwALQ2xpZW50RmlyZQAQAAcACkFkanVzdEFpbQAQAAcACURyb3BGcm9tABAABwAOQ2xpZW50QWx0RmlyZQAQAAcACU1heFNwZWVkABAABwAJQW1tb05hbWUAEAAHAAVVc2VyABAABwQLQW1tb0Ftb3VudAAQAAcACkdldFdlYXBvbgAQAAcAC1NldENhcHRpb24AEAAHAA5GaXJpbmdSb2NrZXRzABAABwANUGxheUlkbGVBbmltABAABwAJVUJyb3dzZXIAEAAHAAtQbGF5RmlyaW5nABAABwAIVVdpbmRvdwAQAAcACVJhdGVTZWxmABAABwAFSWRsZQAQAAcAEU1vbWVudHVtVHJhbnNmZXIAEAAHAAlHaXZlQW1tbwAQAAcACE1heEFtbW8AEAAHAA5Qb3N0QmVnaW5QbGF5ABAABwQLRG93bldlYXBvbgAQAAcADlNwZWNpYWxEYW1hZ2UAEAAHAAhIaXRXYWxsABAABwQNTW9kaWZ5UGxheWVyABAABwANYlVzZUhpdFNvdW5kABAABwAQUHJvY2Vzc1RyYWNlSGl0ABAABwALTm9ybWFsRmlyZQAQAAcADlBsYXlBbHRGaXJpbmcAEAAHAAlHYW1lTmFtZQAQAAcADkNoZWNrSVBQb2xpY3kAEAAHAAlMaWZlU3BhbgAQAAcACVJlcGVhdGVyABAABwANUmVkdWNlRGFtYWdlABAABwAMTnVtTXV0YXRvcnMAEAAHAAZMb2dpbgAQAAcEDVByb2Nlc3NUb3VjaAAQAAcAEklSQ0NoYW5uZWxIaXN0b3J5ABAABwAJSW5pdEdhbWUAEAAHBAlQcmVMb2dpbgAQAAcED1Byb2plY3RpbGVGaXJlABAABwAKVHJhY2VGaXJlABAABwALRmlyZUVmZmVjdAAQAAcADVBsYXlSb3RhdGluZwAQAAcADFNwYXduU3BsYXNoABAABwATQ2xpZW50SW5zdGFudEZsYXNoABAABwAHRmx5aW5nABAABwALUGxheWVyUGF3bgAQAAcACEFkZFBhZ2UAEAAHAAtTcHJpdGVBbmltABAABwAQRXhjZXNzaXZlQmlvR2VsABAABwALQWRqdXN0VG9zcwAQAAcADEZpcmVSb2NrZXRzABAABwAHQmxvd1VwABAABwANQ2xpZW50RmlyaW5nABAABwAKU2hha2VWaWV3ABAABwATQWx0UHJvamVjdGlsZUNsYXNzABAABwAQUHJvamVjdGlsZUNsYXNzABAABwAHUGlja3VwABAABwANQ2xpZW50UmVsb2FkABAABwAIR2V0SW5mbwAQAAcAClNob290TG9hZAAQAAcACk9uU3VyZmFjZQAQAAcAEVRvdXJuYW1lbnRQbGF5ZXIAEAAHABBDbGllbnRBbHRGaXJpbmcAEAAHAA1FeHBsb2RlQ2h1bmsAEAAHAApGYXN0U2hvb3QAEAAHAA1Sb3RhdGVSb2NrZXQAEAAHAAhDYXJjYXNzABAABwARUGxheVJlcGVhdEZpcmluZwAQAAcABlNob290ABAABwALR2l2ZVdlYXBvbgAQAAcACk11bHRpTWVzaAAQAAcACkNoZWNrQmVhbQAQAAcAD1N1cGVyRXhwbG9zaW9uABAABwAIQ3JlYXRlZAAQAAcACkZvcmNlRmlyZQAQAAcACUdldFJ1bGVzABAABwAHR2l2ZVRvABAABwAIRXhwbG9kZQAQAAcADUZvcmNlQWx0RmlyZQAQAAcAC2JSYXBpZEZpcmUAEAAHAANUMgAQAAcAC0JlY29tZUl0ZW0AEAAHAA1NeURhbWFnZVR5cGUAEAAHAAxNb2RpZnlMb2dpbgAQAAcACFB1dERvd24AEAAHAApMb2dQaWNrdXAAEAAHAAhHaXZlQW1wABAABwASTXV0YXRvclRha2VEYW1hZ2UAEAAHAA1JbXBhY3RIYW1tZXIAEAAHAAtXYXJuVGFyZ2V0ABAABwAQTG9nU3BlY2lhbEV2ZW50ABAABwANU2V0TXVsdGlMaW5lABAABwAMU2VuZFBsYXllcnMAEAAHAAZJcERydgAQAAcAGEV4Y2Vzc2l2ZVVkcFNlcnZlclF1ZXJ5ABAABwAEV0FWABAABwAURXhjZXNzaXZlSGVhbHRoUGFjawAQAAcACUNoYXJnaW5nABAABwAKRXhwbG9kaW5nABAABwAHRmlyaW5nABAABwAKVHJhY2VTaG90ABAABwAJR2V0QmFzaWMAEAAHAAxQbGF5UkZpcmluZwAQAAcADExpZ2h0UmFkaXVzABAABwAGc2hha2UAEAAHAARIaXQAEAAHAAxDaGVja1RhcmdldAAQAAcADExpZ2h0RWZmZWN0ABAABwALVXBkYXRlQmVhbQAQAAcACExvYWRpbmcAEAAHABBMaWdodEJyaWdodG5lc3MAEAAHABFDaGVja1JlcGxhY2VtZW50ABAABwAIU2V0V2FsbAAQAAcACmhpdGRhbWFnZQAQAAcAFVBsYXlOb3JtUmVwZWF0RmlyaW5nABAABwASRmluZEludmVudG9yeVR5cGUAEAAHAApQbGFzbWFIaXQAEAAHAA9HZW5lcmF0ZUJ1bGxldAAQAAcADFNwYXduRG91YmxlABAABwAMU2V0VHdvSGFuZHMAEAAHAApMaWdodFR5cGUAEAAHAApEcmF3U2NhbGUAEAAHABpCcm9hZGNhc3RMb2NhbGl6ZWRNZXNzYWdlABAABwQVU2V0RGlzcGxheVByb3BlcnRpZXMAEAAHAAlMb2NhbGl6ZQAQAAcACkJlZ2luUGxheQAQAAcECkFjdGl2YXRlZAAQAAcACkdldFN0cmluZwAQAAcADkNsaWVudFJlY2VpdmUAEAAHAAVEaWVkABAABwAFUGF3bgAQAAcABkNsb3NlABAABwANQWRkSW52ZW50b3J5ABAABwAITWVzc2FnZQAQAAcEC1JlbW90ZVJvbGUAEAAHBA5HZXRTZXJ2ZXJQb3J0ABAABwAFRmVsbAAQAAcABlRvdWNoABAABwQLWm9uZUNoYW5nZQAQAAcEDEFtYmllbnRHbG93ABAABwATU3dpdGNoVG9CZXN0V2VhcG9uABAABwAKRGVzdHJveWVkABAABwQGTW92ZXIAEAAHABBMaWdodFNhdHVyYXRpb24AEAAHAAhTZXRIYW5kABAABwASQWRqdXN0SGl0TG9jYXRpb24AEAAHAAhQaHlzaWNzABAABwAKV2VhcG9uU2V0ABAABwAMR2V0SXRlbU5hbWUAEAAHAAtTZXRSZXNwYXduABAABwAJQWN0aXZhdGUAEAAHABBDbGllbnRQbGF5U291bmQAEAAHAAlab25lSW5mbwAQAAcADFVucmVhbFNoYXJlABAABwQLVmFsaWRUb3VjaAAQAAcADEFkZFZlbG9jaXR5ABAABwAIU3VjY2VzcwAQAAcAB2ltcGFjdAAQAAcADUV4Y0Jyb3dzZXJBUwAQAAcADkV4Y0Jyb3dzZXJET00AEAAHAA5FeGNCcm93c2VyTE1TABAABwAURXhjQnJvd3NlclRlYW1HYW1lcwAQAAcADFNwZWNpYWxGaXJlABAABwAORXhjQnJvd3NlckNURgAQAAcAF1NlY29uZGFyeVNlcnZlckFkZHJlc3MAEAAHABJNYWluU2VydmVyQWRkcmVzcwAQAAcAHkV4Y2Vzc2l2ZUJyb3dzZXJJUkNTeXN0ZW1QYWdlABAABwAaRXhjZXNzaXZlQnJvd3NlcklSQ1dpbmRvdwAQAAcAH0V4Y2Vzc2l2ZUJyb3dzZXJJUkNTZXR1cENsaWVudAAQAAcADkV4Y2Vzc2l2ZU5hbGkAEAAHABBFeGNlc3NpdmVTa2FhcmoAEAAHAA1FeGNlc3NpdmVDb3cAEAAHABFFeGNlc3NpdmVGZW1hbGUxABAABwAORXhjZXNzaXZlQm9zcwAQAAcAEUV4Y2Vzc2l2ZUZlbWFsZTIAEAAHAA9FeGNlc3NpdmVNYWxlMgAQAAcAFFRyYW5zbG9jYXRvclVwZ3JhZGUAEAAHAA9FeGNlc3NpdmVNYWxlMQAQAAcAElNob2NrUmlmbGVVcGdyYWRlABAABwAOUm9ja2V0VXBncmFkZQAQAAcADlNuaXBlclVwZ3JhZGUAEAAHAA1QdWxzZVVwZ3JhZGUAEAAHAAtTcGxhc2hKdW1wABAABwAOUmlwcGVyVXBncmFkZQAQAAcAD01pbmlndW5VcGdyYWRlABAABwAOSGFtbWVyVXBncmFkZQAQAAcADEZsYWtVcGdyYWRlABAABwAMUmVwbGFjZVdpdGgAEAAHABxFeGNlc3NpdmVUcmFuc2xvY2F0b3JUYXJnZXQAEAAHABZSZWdpc3RlckRhbWFnZU11dGF0b3IAEAAHABZFeGNlc3NpdmVUcmFuc2xvY2F0b3IAEAAHAA5FeGNlc3NpdmVUaW1lABAABwAWRXhjZXNzaXZlVGVhbUdhbWVQbHVzABAABwAVRXhjZXNzaXZlU3RhcnRlckJvbHQAEAAHABBFeGNlc3NpdmVTbmlwZXIAEAAHABNFeGNlc3NpdmVTaG9ja3Byb2oAEAAHABNFeGNlc3NpdmVTaG9ja0V4cGwAEAAHABNFeGNlc3NpdmVTaG9ja0NvcmUAEAAHABdFeGNlc3NpdmVTZWVraW5nUm9ja2V0ABAABwAURXhjZXNzaXZlUm9ja2V0UGFjawAQAAcAGEV4Y2Vzc2l2ZVJvY2tldExhdW5jaGVyABAABwAQRXhjZXNzaXZlUm9ja2V0ABAABwAQRXhjZXNzaXZlUmlwcGVyABAABwASRXhjZXNzaXZlUmF6b3JBbHQAEAAHAA9FeGNlc3NpdmVSYXpvcgAQAAcAEkV4Y2Vzc2l2ZVB1bHNlR3VuABAABwASRXhjZXNzaXZlUG93ZXJ1cHMAEAAHABZFeGNlc3NpdmVQbGFzbWFTcGhlcmUAEAAHAA9FeGNlc3NpdmVQQm9sdAAQAAcAD0V4Y2Vzc2l2ZVBBbW1vABAABwARRXhjZXNzaXZlTWluaWd1bgAQAAcAEkV4Y2Vzc2l2ZU1pbmlhbW1vABAABwAZRXhjZXNzaXZlTGFzdE1hblN0YW5kaW5nABAABwAQRXhjZXNzaXZlVHJhY2VyABAABwAWRXhjZXNzaXZlSW52aXNpYmlsaXR5ABAABwAZRXhjZXNzaXZlSGFtbWVyU2hvY2tXYXZlABAABwAQRXhjZXNzaXZlSGFtbWVyABAABwARRXhjZXNzaXZlR3JlbmFkZQAQAAcAEkV4Y2Vzc2l2ZUZsYWtTbHVnABAABwAURXhjZXNzaXZlRmxha0Nhbm5vbgAQAAcAEkV4Y2Vzc2l2ZUZsYWtBbW1vABAABwAYRXhjZXNzaXZlRXhwbG9kaW5nQ2h1bmsAEAAHABJFeGNlc3NpdmVFbmZvcmNlcgAQAAcAFEV4Y2Vzc2l2ZURvbWluYXRpb24AEAAHABhFeGNlc3NpdmVEZWF0aE1hdGNoUGx1cwAQAAcAEUV4Y2Vzc2l2ZUNURkdhbWUAEAAHABBFeGNlc3NpdmVDaHVuazQAEAAHABBFeGNlc3NpdmVDaHVuazMAEAAHABBFeGNlc3NpdmVDaHVuazIAEAAHABBFeGNlc3NpdmVDaHVuazEAEAAHABNFeGNlc3NpdmVCdWxsZXRCb3gAEAAHACNFeGNlc3NpdmVCcm93c2VyVXBkYXRlU2VydmVyV2luZG93ABAABwAhRXhjZXNzaXZlQnJvd3NlclVwZGF0ZVNlcnZlckxpbmsAEAAHABlFeGNlc3NpdmVCcm93c2VyTWVudUl0ZW0AEAAHABtFeGNlc3NpdmVCcm93c2VyTWFpbldpbmRvdwAQAAcAIUV4Y2Vzc2l2ZUJyb3dzZXJNYWluQ2xpZW50V2luZG93ABAABwAVRXhjZXNzaXZlQmxhZGVIb3BwZXIAEAAHABNFeGNlc3NpdmVCaW9TcGxhc2gAEAAHABFFeGNlc3NpdmVCaW9BbW1vABAABwARRXhjZXNzaXZlQmlvR2xvYgAQAAcAEEV4Y2Vzc2l2ZUFtcE1zZwAQAAcAEEVuZm9yY2VyVXBncmFkZQAQAAcAEUV4Y2Vzc2l2ZUFzc2F1bHQAEAAHABJQbGF5UGlja3VwTWVzc2FnZQAQAAcAClVUQnJvd3NlcgAQAAcAC0hlYWx0aFBhY2sAEAAHAAVQdWxsABAABwAHTWVkQm94ABAABwASVXBkYXRlU2VydmVyQ2xhc3MAEAAHAA1UZWFtR2FtZVBsdXMAEAAHABBHZXRHYW1lUHJvcGVydHkAEAAHABFHZXRMZXZlbFByb3BlcnR5ABAABwARSFRUUFJlY2VpdmVkRGF0YQAQAAcAEUJyb3dzZUN1cnJlbnRVUkkAEAAHAA9QYXJzZU5leHRRdWVyeQAQAAcAC1BhcnNlUXVlcnkAEAAHAAlJcFNlcnZlcgAQAAcADE1lbnVDYXB0aW9uABAABwADVDEAEAAHAAlMaWdodEh1ZQAQAAcACU1lbnVIZWxwABAABwAGVU1lbnUAEAAHAAhFeGVjdXRlABAABwAGc2hvdDIAEAAHAAxUaHJvd1RhcmdldAAQAAcACXNocmVkZGVkABAABwAIU2V0Um9sbAAQAAcAFUV4Y0Jyb3dzZXJEZWF0aG1hdGNoABAABwAIVGVhbUhpdAAQAAcAC0RlbGV0ZVBhZ2UAEAAHAAZFamVjdAAQAAcABXNwaW4AEAAHAAZGaXJlMQAQAAcAB1Nob290MQAQAAcACkV4cGxvc2lvbgAQAAcACk1ha2VTb3VuZAAQAAcAC1VCcm93c2VyQVMAEAAHAAxVQnJvd3NlckRPTQAQAAcADFVCcm93c2VyTE1TABAABwASVUJyb3dzZXJUZWFtR2FtZXMAEAAHABNVQnJvd3NlckRlYXRobWF0Y2gAEAAHAAlIaXRTb3VuZAAQAAcADFVCcm93c2VyQ1RGABAABwANVGFjdGljYWxNb3ZlABAABwANTWF4VG9zc0ZvcmNlABAABwALU3RhcnRFcnJvcgAQAAcAClNldFBhcmVudAAQAAcACkZsYWtEZWF0aAAQAAcAC1NldFVwU2xhdmUAEAAHAA9Ub3VybmFtZW50QW1tbwAQAAcAClVUX0Jpb0dlbAAQAAcAD0RvdWJsZUVuZm9yY2VyABAABwATUHJvY2Vzc0FsdFRyYWNlSGl0ABAABwAJVmFsaWRhdGUAEAAHAA1QbGF5QWx0QnVyc3QAEAAHAAtIZWFsdGhWaWFsABAABwAKU2hvb3Rsb29wABAABwAGU2V0dXAAEAAHABJXaW5kb3dUaXRsZVN0cmluZwAQAAcACkxpbmtDbGFzcwAQAAcACWJvbHRsb29wABAABwARVG91cm5hbWVudFdlYXBvbgAQAAcADFByb2Nlc3NEYXRhABAABwAKU2V0dXBVUklzABAABwASUXVlcnlVcGRhdGVTZXJ2ZXIAEAAHABJHZXRQbGF5ZXJQcm9wZXJ0eQAQAAcABlRocm93ABAABwAKSFRUUEVycm9yABAABwAOVVRfRmxha0Nhbm5vbgAQAAcADVVUX0VpZ2h0YmFsbAAQAAcADFNuaXBlclJpZmxlABAABwAKRmlyZVNvdW5kABAABwAJUHVsc2VHdW4AEAAHAAhBbXBUaW1lABAABwAIYmxhc3RlZAAQAAcABkZpcmUyABAABwAOV2VhcG9uVXBncmFkZQAQAAcAC0Jpb1VwZ3JhZGUAEAAHAAxTcGF3bkVmZmVjdAAQAAcAB3JpcHBlcgAQAAcAB1Nob290MgAQAAcAC1Nob2NrUmlmbGUAEAAHAA1UcmFuc2xvY2F0b3IAEAAHAA1QbGF5U3BpbkRvd24AEAAHABJFeGNlc3NpdmVCaW9SaWZsZQAQAAcACEhlYWxNYXgAEAAHAAltaW5pZ3VuMgAQAAcADHV0X2Jpb3JpZmxlABAABwAURXhjZXNzaXZlU2hvY2tSaWZsZQAQAAcACk1pbk5ldFZlcgAQAAcAB1dpbmdJbgAQAAcAC0hpZGVXaW5kb3cAEAAHAAliQWx0RmlyZQAQAAcACk1pc2NTb3VuZAAQAAcABVdhbGwAEAAHAAZiRmlyZQAQAAcADEltcGFjdFNvdW5kABAABwAKRXllSGVpZ2h0ABAABwAPRXhwbG9zaW9uRGVjYWwAEAAHAAxTb3VuZFZvbHVtZQAQAAcACGJIaWRkZW4AEAAHAAZTa2lsbAAQAAcAC2JXYXRlclpvbmUAEAAHAAtTcGF3blNvdW5kABAABwACRgAQAAcAEENvbGxpc2lvbkhlaWdodAAQAAcAClByb2pDbGFzcwAQAAcADWJOZXV0cmFsWm9uZQAQAAcAEENvbGxpc2lvblJhZGl1cwAQAAcADVZpZXdSb3RhdGlvbgAQAAcAC0RhbWFnZVR5cGUAEAAHAA5iQmxvY2tQbGF5ZXJzABAABwAGUEFtbW8AEAAHAAdTb3VuZHMAEAAHAAtGaXJlT2Zmc2V0ABAABwAPYkFsdFdhcm5UYXJnZXQAEAAHAAllbmZvcmNlcgAQAAcABmJXYXJuABAABwAOU3RhcnRMb2NhdGlvbgAQAAcADGJVc2VBbHRNb2RlABAABwAKYkhlbGRJdGVtABAABwAYVVdpbmRvd1B1bGxkb3duTWVudUl0ZW0AEAAHABNVV2luZG93UGFnZUNvbnRyb2wAEAAHAAVTa2luABAABwAJUm90YXRpb24AEAAHAAlBY2N1cmFjeQAQAAcAB1ZpY3RpbQAQAAcADEFkanVzdGVkQWltABAABwAOVVdpbmRvd1dpbmRvdwAQAAcAB1BvcnRhbAAQAAcACGluanVyZWQAEAAHAA1DcmVhdGVXaW5kb3cAEAAHAA1iTXV6emxlRmxhc2gAEAAHAAtJblBhc3N3b3JkABAABwALTWlzYzFTb3VuZAAQAAcAC01pc2MzU291bmQAEAAHAAtNaXNjMlNvdW5kABAABwANQ29ja2luZ1NvdW5kABAABwAJU3BsaXRQb3MAEAAHAA1BbHRGaXJlU291bmQAEAAHAA1iQmxvY2tBY3RvcnMAEAAHAAlGYWlsQ29kZQAQAAcAB2JSaWdodAAQAAcADE1heFNwbGl0UG9zABAABwAQVG9wQ2xpZW50V2luZG93ABAABwATQm90dG9tQ2xpZW50V2luZG93ABAABwAMYkJvdHRvbUdyb3cAEAAHAAVQYWdlABAABwAKYkJ5UGFyZW50ABAABwACQQAQAAcADUludGVybmV0TGluawAQAAcAB0lwQWRkcgAQAAcABUFkZHIAEAAHABFWYWxpZGF0aW9uU3RyaW5nABAABwAFdGVtcAAQAAcACmJMb2NrZWRPbgAQAAcAD2JTdXBlclJlbGV2YW50ABAABwAGVmFsdWUAEAAHAAlMb2NhbExvZwAQAAcAClJlc3VsdFNldAAQAAcACUhpdEFjdG9yABAABwANQW5pbVNlcXVlbmNlABAABwAOYkNoYW5nZVdlYXBvbgAQAAcACmJQb2ludGluZwAQAAcAAlgAEAAHAAlBbW1vVHlwZQAQAAcADGJXYXJuVGFyZ2V0ABAABwAIVmljdGltcwAQAAcADGJQcm9qVGFyZ2V0ABAABwAJTU9URE5hbWUAEAAHAA5QZW5kaW5nV2VhcG9uABAABwAMQ2xpZW50Q2xhc3MAEAAHAAliU2l6YWJsZQAQAAcACElSQ05hbWUAEAAHAAtMQU5UYWJOYW1lABAABwAFQ29weQAQAAcAGFVCcm93c2VyRmF2b3JpdGVTZXJ2ZXJzABAABwAKUGF3bk93bmVyABAABwATVUJyb3dzZXJJbmZvV2luZG93ABAABwALRHJhd09mZnNldAAQAAcAD09wdGlvbmFsT2JqZWN0ABAABwAMYkRyb3BEZXRhaWwAEAAHAAxSZXNwYXduVGltZQAQAAcACVBsYXllcklEABAABwATVUJyb3dzZXJNYWluV2luZG93ABAABwAMUGlja3VwU291bmQAEAAHABtVQnJvd3NlclVwZGF0ZVNlcnZlcldpbmRvdwAQAAcADk9sZEZsYXNoQ291bnQAEAAHAAtGbGFzaENvdW50ABAABwAQYlN0ZWFkeUZsYXNoM3JkABAABwALSW5mb1dpbmRvdwAQAAcABEludgAQAAcAEVVXaW5kb3dWU3BsaXR0ZXIAEAAHAAxTZXR1cENsaWVudAAQAAcAAkMAEAAHAA1pbnN0aWdhdGVkQnkAEAAHAAVNT1REABAABwALQ3VycmVudFVSSQAQAAcAB01heFVSSQAQAAcAEFNlcnZlckxpc3ROYW1lcwAQAAcABElSQwAQAAcAC1N5c3RlbVBhZ2UAEAAHAAhMQU5QYWdlABAABwAPRmFjdG9yeVdpbmRvd3MAEAAHAANNQwAQAAcACUdhbWVUeXBlABAABwAJUG9zaXRpb24AEAAHAAhiQ2VudGVyABAABwAJYlNuaXBpbmcAEAAHAAxQbGF5ZXJPd25lcgAQAAcAF1VXaW5kb3dQYWdlQ29udHJvbFBhZ2UAEAAHABdVV2luZG93RHluYW1pY1RleHRBcmVhABAABwAJRW5kVHJhY2UAEAAHAAJqABAABwASTmV4dERhbWFnZU11dGF0b3IAEAAHAAJpABAABwALU2NyaXB0VGV4dAAQAAcAFFVXaW5kb3dGcmFtZWRXaW5kb3cAEAAHABRVV2luZG93Q2xpZW50V2luZG93ABAABwACUwAQAAcAElVXaW5kb3dSb290V2luZG93ABAABwAKTmV3UGxheWVyABAABwACVgAQAAcAAkIAEAAHAARZYXcAEAAHAAJSABAABwACRwAQAAcADFJldHVyblZhbHVlABAABwAUVVdpbmRvd1B1bGxkb3duTWVudQAQAAcAElVXaW5kb3dUYWJDb250cm9sABAABwACWgAQAAcAEVN0YXRpY1NhdmVDb25maWcAEAAHABFBbmltU3ByaXRlRWZmZWN0ABAABwASRHluYW1pY0xvYWRPYmplY3QAEAAHAA5IZWFsaW5nQW1vdW50ABAABwAGU2NhbGUAEAAHABpiU2VsZWN0TmVhcmVzdFRhYk9uUmVtb3ZlABAABwAGT3duZXIAEAAHAA1SZWxhdGVkUFJJXzEAEAAHAAVBU01EABAABwAKV2luSGVpZ2h0ABAABwAJV2luV2lkdGgAEAAHAAtCZXN0VGFyZ2V0ABAABwAFUm9vdAAQAAcACUdhbWVJbmZvABAABwAJVGV4dEFyZWEAEAAHABFQbGF5ZXJWaWV3T2Zmc2V0ABAABwAKV2F0ZXJSaW5nABAABwALYlN1cGVySGVhbAAQAAcACEFkZHJlc3MAEAAHAA1MYXN0UGFpblRpbWUAEAAHAAdZYXdFcnIAEAAHAANGQwAQAAcADU1pbldpbkhlaWdodAAQAAcAAlkAEAAHAAtSZWZpcmVSYXRlABAABwAITkRhbWFnZQAQAAcABlNraW5zABAABwAFZmxhawAQAAcADEFsdEFjY3VyYWN5ABAABwAIcmVhbExvYwAQAAcAC0NoYXJnZVNpemUAEAAHAA5Sb2NrZXRzTG9hZGVkABAABwAKUm9ja2V0UmFkABAABwAKYkZpcmVMb2FkABAABwAKYlRpZ2h0V2FkABAABwANTG9ja2VkVGFyZ2V0ABAABwANRmlyZUxvY2F0aW9uABAABwAJU3RhcnRMb2MAEAAHAAhGaXJlUm90ABAABwALRHVwUm9ja2V0cwAQAAcABlF1ZXJ5ABAABwAIUmFuZFJvdAAQAAcACUJpb1JpZmxlABAABwAKYk9uR3JvdW5kABAABwAER2VsABAABwAJQW5pbVRpbWUAEAAHAA1iQ2FuSGl0T3duZXIAEAAHAApiSGl0V2F0ZXIAEAAHABFOdW1FeHRyYUdyZW5hZGVzABAABwAIU2Vla2luZwAQAAcABmJSaW5nABAABwAQTnVtRXh0cmFSb2NrZXRzABAABwAJRXhwQ291bnQAEAAHAApiRGVsZXRlTWUAEAAHAAtQcm9qZWN0aWxlABAABwAWUGxheWVyUmVwbGljYXRpb25JbmZvABAABwAMTmV4dE11dGF0b3IAEAAHAAJXABAABwAFRGF0YQAQAAcACVdvcmxkTG9nABAABwANU2hvdEFjY3VyYWN5ABAABwAHcm5kRGFtABAABwAJQ2h1bmtIaXQAEAAHAAxOdW1XYWxsSGl0cwAQAAcAEmJDYW5IaXRJbnN0aWdhdG9yABAABwAMQmFzZU11dGF0b3IAEAAHAAhTdGF0TG9nABAABwAFUm9sbAAQAAcABlBpdGNoABAABwAFZGlzdAAQAAcAEVVNZW51TW9kTWVudUl0ZW0AEAAHAAxJbml0aWFsaXplZAAQAAcADFdlYXBvbkNsYXNzABAABwAJTWVudUl0ZW0AEAAHAAlQYXduTGlzdAAQAAcAFEdhbWVSZXBsaWNhdGlvbkluZm8AEAAHAAhOZXRNb2RlABAABwAOTWluTmV0VmVyc2lvbgAQAAcABUFtbW8AEAAHAApJbnZlbnRvcnkAEAAHAA5FbmdpbmVWZXJzaW9uABAABwAORmF2b3JpdGVzTmFtZQAQAAcAFUZhdm9yaXRlU2VydmVyc0NsYXNzABAABwAPVWRwU2VydmVyUXVlcnkAEAAHAAlRdWVyeU51bQAQAAcAClBhY2tldE51bQAQAAcAClF1ZXJ5VHlwZQAQAAcAC1F1ZXJ5VmFsdWUAEAAHAApRdWVyeVJlc3QAEAAHAA1iRmluYWxQYWNrZXQAEAAHAAZMZXZlbAAQAAcAD0RlYXRoTWF0Y2hQbHVzABAABwAGQWN0b3IAEAAHABZTZXJ2ZXJMaXN0V2luZG93Q2xhc3MAEAAHAAVNZXNoABAABwAITG9kTWVzaAAQAAcAB1BsYXllcgAQAAcACEluc3RGb2cAEAAHABRVcGRhdGVTZXJ2ZXJBZGRyZXNzABAABwAGQ291bnQAEAAHAAhPcHRpb25zABAABwAKSW5zdEZsYXNoABAABwALU3lzdGVtTmFtZQAQAAcACUxvYWRBbmltABAABwALUm90YXRlQW5pbQAQAAcACUZpcmVBbmltABAABwAGU291bmQAEAAHBAhUZXh0dXJlABAABwQGRXJyb3IAEAAHBAhDVEZHYW1lABAABwAGVGl0bGUAEAAHBA1QbGFzbWFTcGhlcmUAEAAHABlVQnJvd3NlclNlcnZlckxpc3RXaW5kb3cAEAAHAApGaXJlQW5pbXMAEAAHAAhBc3NhdWx0ABAABwARVG91cm5hbWVudEhlYWx0aAAQAAcAFFVCcm93c2VySVJDUGFnZUJhc2UAEAAHAAtEb21pbmF0aW9uABAABwAFUm9sZQAQAAcEBkNsYXNzABAEBwQMVGltZVNlY29uZHMAEAAHAAhVRGFtYWdlABAABwATVVRfU3ByaXRlU21va2VQdWZmABAABwAQVVRfaW52aXNpYmlsaXR5ABAABwAXVUJyb3dzZXJJUkNTZXR1cENsaWVudAAQAAcAFlVCcm93c2VySVJDU3lzdGVtUGFnZQAQAAcAElVCcm93c2VySVJDV2luZG93ABAABwAIUGFja2FnZQAQBAcEB1N3aXRjaAAQBAcEGVVCcm93c2VyTWFpbkNsaWVudFdpbmRvdwAQAAcAC1RleHRCdWZmZXIAEAAHBBlVQnJvd3NlclVwZGF0ZVNlcnZlckxpbmsAEAAHABNUcmFuc2xvY2F0b3JUYXJnZXQAEAAHAApTaG9ja1Byb2oAEAAHAApFcnJvckNvZGUAEAAHAAZQQm9sdAAQAAcAEExhc3RNYW5TdGFuZGluZwAQAAcACUZsYWtBbW1vABAABwAJTWluaWFtbW8AEAAHAApGYXZvcml0ZXMAEAAHAApCdWxsZXRCb3gAEAAHABBTZXJ2ZXJMaXN0VGl0bGUAEAAHAAlTcGxpdHRlcgAQAAcAEVRvdXJuYW1lbnRQaWNrdXAAEAAHAApTaG9ja0NvcmUAEAAHAAdPYmplY3QAEAAHBAtSb2NrZXRQYWNrABAABwALUGFnZVBhcmVudAAQAAcADFBhZ2VDb250cm9sABAABwAJVVRDaHVuazIAEAAHAAlVVENodW5rMwAQAAcAClJhem9yMkFsdAAQAAcAB1Jhem9yMgAQAAcABVVSSXMAEAAHAAhNdXRhdG9yABAABwAVRG91YmxlU3dpdGNoUHJpb3JpdHkAEAAHAAtVVF9XYWxsSGl0ABAABwAMQmxhZGVIb3BwZXIAEAAHAA5XYXJFeHBsb3Npb24yABAABwAKV2FsbENyYWNrABAABwATVVRfU3ByaXRlQmFsbENoaWxkABAABwARVVRfU2Vla2luZ1JvY2tldAAQAAcAElVUX1JpbmdFeHBsb3Npb241ABAABwAWVVRfSGVhdnlXYWxsSGl0RWZmZWN0ABAABwAWVVRfTGlnaHRXYWxsSGl0RWZmZWN0ABAABwALVVRfR3JlbmFkZQAQAAcAElVUX0ZsYW1lRXhwbG9zaW9uABAABwANVVRfQ29tYm9SaW5nABAABwAIQmlvQW1tbwAQAAcACVVUQ2h1bms0ABAABwAJVVRDaHVuazEAEAAHAAhVVENodW5rABAABwAHVE1hbGUyABAABwAJVEZlbWFsZTIAEAAHAAlURmVtYWxlMQAQAAcABlRCb3NzABAABwAXVVRfU3ByaXRlQmFsbEV4cGxvc2lvbgAQAAcAClNob2NrV2F2ZQAQAAcAClJvY2tldE1rMgAQAAcACUJlYW1TaXplABAABwAKUGxhc21hQ2FwABAABwAMTnVjbGVhck1hcmsAEAAHAAhNVHJhY2VyABAABwANVGVuc2lvblNvdW5kABAABwAJZmxha3NsdWcAEAAHABJDcml0aWNhbEV2ZW50UGx1cwAQAAcAB1RNYWxlMQAQAAcAC0RvdWJsZU5hbWUAEAAHAAtGaXJlQWRqdXN0ABAABwANVVRfU2hlbGxDYXNlABAABwAPYkluc3RhbnRSb2NrZXQAEAAHAAhiTm92aWNlABAABwAJQWZmZWN0b3IAEAAHAA9iQ2FuQ2xpZW50RmlyZQAQAAcADlNsYXZlRW5mb3JjZXIAEAAHAAliSXNTbGF2ZQAQAAcAC2JGaXJzdEZpcmUAEAAHABVJbXBhY3RBbHRGaXJlUmVsZWFzZQAQAAcAB0FpbURpcgAQAAcAClB1bHNlR3VuUgAQAAcAC1BsYXNtYUJlYW0AEAAHAA5Pd25lckxvY2F0aW9uABAABwAKU3RpbGxUaW1lABAABwAIVFRhcmdldAAQAAcAClRvc3NGb3JjZQAQAAcADWJCb3RNb3ZlRmlyZQAQAAcADGJUVGFyZ2V0T3V0ABAABwAKQmlvQWx0UmVwABAABwAUQ2xpZW50Um9ja2V0c0xvYWRlZAAQAAcADGJDbGllbnREb25lABAABwAJYlJvdGF0ZWQAEAAHAA1iUGVuZGluZ0xvY2sAEAAHAA5iTXVsdGlSb2NrZXRzABAABwAKQW1wUGlja3VwABAABwAKTnVtU3BsYXNoABAABwAMU3ByaXRlRnJhbWUAEAAHAAtXYWxsRWZmZWN0ABAABwASQWNjdW11bGF0ZWREYW1hZ2UAEAAHAAxMYXN0SGl0VGltZQAQAAcADURhbWFnZWRBY3RvcgAQAAcAC1BhcmVudEJvbHQAEAAHAAdzYm9sdDAAEAAHAAdzYm9sdDEAEAAHAAdzYm9sdDIAEAAHAAdzYm9sdDMAEAAHAAdzYm9sdDQAEAAHAAlPbGRFcnJvcgAQAAcACU5ld0Vycm9yABAABwAMQWltUm90YXRpb24AEAAHAAlBaW1TdGFydAAQAAcACGRBZGp1c3QAEAAHAAZNeUJvdAAQAAcAB05vcm0yRAAQAAcAB01hc3RlcgAQAAcADGJBbHJlYWR5SGl0ABAABwAKTWlzc0NvdW50ABAABwAKU2hvY2tTaXplABAABwART2xkU2hvY2tEaXN0YW5jZQAQAAcAB0lDb3VudAAQAAcACE1vU2NhbGUAEAAHAAluZXh0UGF3bgAQAAcAGlVUQnJvd3Nlck1haW5DbGllbnRXaW5kb3cAEAAHAAlGdW5jdGlvbgAQBAcECFRTa2FhcmoAEAAHAAZ0bmFsaQAQAAcABXRjb3cAEAAHAAZTdGF0ZQAQBAcEBlNwcmVlABAABwAGU3RhcnQAEAAHAAVab25lABAABwAKTmV3VGFyZ2V0ABAABwAFVGVhbQAQAAcAB1RhcmdldAAQAAcACFJvdGF0b3IAEAQHBAtJbnN0aWdhdG9yABAABwAHUmVnaW9uABAABwAFR2FtZQAQAAcADUxhc3RTZWVuVGltZQAQAAcABkVuZW15ABAABwALTnVtUGxheWVycwAQAAcAC0hlYWRSZWdpb24AEAAHAAJNABAABwAJVmVsb2NpdHkAEAAHAA9OZXdXZWFwb25DbGFzcwAQAAcAD2JNZXNoRW52aXJvTWFwABAABwAPV2VhcG9uUHJpb3JpdHkAEAAHABFiRGFtYWdlVHJpZ2dlcmVkABAABwAFUmF0ZQAQAAcAC1N0YXJ0VHJhY2UAEAAHAApIaXROb3JtYWwAEAAHAAhOZXdab25lABAABwAGU3R5bGUAEAAHAAxIaXRMb2NhdGlvbgAQAAcACk5ld1dlYXBvbgAQAAcACU1vbWVudHVtABAABwAKcHJvalNwZWVkABAABwAMZGFtYWdlU2NhbGUAEAAHAAhBaW1TcG90ABAABwAHVmVjdG9yABAEBwQNYWN0dWFsRGFtYWdlABAABwALU3Bhd25DbGFzcwAQAAcAAlAAEAAHAA1SZWxhdGVkUFJJXzIAEAAHAAhiQm91bmNlABAABwAHUmVzdWx0ABAABwAETnVtABAABwALYkZvcmNlRmlyZQAQAAcABk90aGVyABAABwAKRGVsdGFUaW1lABAABwAOYkZvcmNlQWx0RmlyZQAQAAcACENhcnJpZWQAEAAHAAREaXIAEAAHAA9DYWxjRHJhd09mZnNldAAQAAcABlRyYWNlABAABwAJUmFuZFNwaW4AEAAHAA9QbGF5T3duZWRTb3VuZAAQAAcACGJJc1Bhd24AEAAHAA1Mb2NhbE1lc3NhZ2UAEAAHAAlJdGVtTmFtZQAQAAcADFpvbmVHcmF2aXR5ABAABwAQYkhpZ2hEZXRhaWxNb2RlABAABwALRXhwbG9Tb3VuZAAQAAcAClRlbXBTY2FsZQAQAAcAC0h1cnRSYWRpdXMAEAAHABNBbHRQcm9qZWN0aWxlU3BlZWQAEAAHAAdTdHJ1Y3QAEAQHBBBQcm9qZWN0aWxlU3BlZWQAEAAHAAtIYW5kZWRuZXNzABAABwALRGVmYXVsdEZPVgAQAAcACnNoYWtldmVydAAQAAcACXNoYWtlbWFnABAABwAHYlVubGl0ABAABwALRGVzaXJlZEZPVgAQAAcACmJJc1BsYXllcgAQAAcACnNoYWtldGltZQAQAAcACUxvY2F0aW9uABAABwAJYWltZXJyb3IAEAAHAAlJUEJhbm5lZAAQAAcADU5lZWRQYXNzd29yZAAQAAcAEE1heGVkT3V0TWVzc2FnZQAQAAcAE0F1dG9Td2l0Y2hQcmlvcml0eQAQAAcAC01heFBsYXllcnMAEAAHAA1NdXRhdG9yQ2xhc3MAEAAHAAdXZWFwb24AEAAHAApMZXZlbEluZm8AEAAHAAtTZXJ2ZXJOYW1lABAABwAFTmFtZQAQBAcECFVucmVhbEkAEAAHBAdMU3RhcnQAEAAHAAdSU3RhcnQAEAAHAAxTcGF3bm9mZnNldAAQAAcAA0ExABAABwADQTIAEAAHAAtTcGF3bnBvaW50ABAABwAOYlNob3dTdGFuZGFyZAAQAAcADFdlYXBvbkxpZ2h0ABAABwAGVmVsMkQAEAAHAAxTdHJQcm9wZXJ0eQAQAAcED1N0cnVjdFByb3BlcnR5ABAABwQPUmVzZXJ2ZU1lc3NhZ2UAEAAHAA5DbGFzc1Byb3BlcnR5ABAABwQRUmVzZXJ2ZWRQYXNzd29yZAAQAAcAEU51bVJlc2VydmVkU3BvdHMAEAAHABNOdW1SZXNlcnZlZFBsYXllcnMAEAAHAA1OYW1lUHJvcGVydHkAEAAHBA9PYmplY3RQcm9wZXJ0eQAQAAcEEldlYXBvblJlcGxhY2VUeXBlABAABwAORmxvYXRQcm9wZXJ0eQAQAAcECUFtcENvdW50ABAABwAGQW5nbGUAEAAHAA1Cb29sUHJvcGVydHkAEAAHBAlBSVJhdGluZwAQAAcADEludFByb3BlcnR5ABAABwQMRXhwbG9kZVRpbWUAEAAHAA1CeXRlUHJvcGVydHkAEAAHBAZpRXhwbAAQAAcAD1NvdW5kRGFtcGVuaW5nABAABwAOQWx0UmVmaXJlUmF0ZQAQAAcADUFtYmllbnRTb3VuZAAQAAcACFBpY2t1cHMAEAAHAAdIZWFsdGgAEAAHAAxQb2ludFJlZ2lvbgAQAAcAAAAAAQAAAIAAAAAAjocAAAABAAAAgAAAAACOhwAAAAEAAACAAAAAAI6HAAAAAQAAAIAAAAAAjocAAAABAAAAgAAAAACOhwAAAAEAAACAAAAAAI6HAAAAAQAAAIAAAAAAjocAAAABAAAAgAAAAACOh5MAawp8DF4F
; UMOD file format info: http://www.unrealtexture.com/Unreal/Downloads/3DEditing/UnrealEd/Tutorials/unrealwiki-offline/umod-file-format.html
#UMOD_MAGIC_NBR = $9FE3C5A3
Enumeration UmodFileBits
#UMOD_FILE_REGULAR = $00
#UMOD_FILE_MANIFEST = $03
EndEnumeration
Enumeration UmodError 1
#ERROR_UMOD_IO_SIZE
#ERROR_UMOD_IO_READ
#ERROR_UMOD_MALLOC
#ERROR_UMOD_INVALID_HEADER
#ERROR_UMOD_INVALID_DIR_ENTRY
#ERROR_UMOD_INVALID_CRC
#ERROR_UMOD_MALFORMED_DIRECTORY
#ERROR_UMOD_MISSING_MANIFEST
#ERROR_UMOD_OVERLAPPING_FILES ; Between each other and/or the directory/header
EndEnumeration
; All variables using the .l type are technically unsigned in the format...
; And it is located at the end of the file, because header==footer...
Structure UmodHeader
DirectoryOffset.l
UmodSize.l
UmodFileVersion.l
CRC32.l ; Not sure.
EndStructure
Structure UmodDirectoryEntry
FilenameLength.a ; A trailling 0x00 is counted in ! (So Len(Filename$) == this - 1)
Filename$
FileByteOffset.l
FileLength.l
FileBitFields.l
FileCRC32$
FileMD5$
FileSHA1$
; And other hashes if required
EndStructure
Structure Umod
Header.UmodHeader
Array DirectoryEntries.UmodDirectoryEntry(0)
Array *FileData(0)
Filename$
EndStructure
; FIXME: Handle the .l as unsigned long instead of signed one, this WILL cause errors down the line !
Procedure LoadUmodMetadata(Path$, CompleteVerification.b = #True)
Protected *Umod.Umod, i.i, Filename$, FileId, ErrorCode = 0, CurrentArrayIndex
If FileSize(Path$) < 0
ProcedureReturn #ERROR_UMOD_IO_SIZE * -1
EndIf
FileId = ReadFile(#PB_Any, Path$, #PB_File_SharedRead | #PB_Ascii)
If Not FileId
ProcedureReturn #ERROR_UMOD_IO_READ * -1
EndIf
*Umod = AllocateStructure(Umod)
If Not *Umod
ProcedureReturn #ERROR_UMOD_MALLOC * -1
EndIf
; Reading the header...
FileSeek(FileId, Lof(FileId)-SizeOf(UmodHeader)-4, #PB_Absolute)
; Fuck this, I'm using GOTOs, I don't want to deal whit a bunch of nested IFs and spaghetti.
If Not UCase(Hex(ReadLong(FileId), #PB_Long)) = UCase("9FE3C5A3")
ErrorCode = #ERROR_UMOD_INVALID_HEADER
Goto LUM_END
EndIf
*Umod\Header\DirectoryOffset = ReadLong(FileId)
*Umod\Header\UmodSize = ReadLong(FileId)
*Umod\Header\UmodFileVersion = ReadLong(FileId)
*Umod\Header\CRC32 = ReadLong(FileId)
; TODO: Add some directory position checks before reading it
; Reading the directory...
FileSeek(FileId, *Umod\Header\DirectoryOffset + 1, #PB_Absolute)
Repeat
CurrentArrayIndex = ArraySize(*Umod\DirectoryEntries())
Filename$ = ""
ReDim *Umod\DirectoryEntries(CurrentArrayIndex+1)
ReDim *Umod\FileData(CurrentArrayIndex+1)
*Umod\DirectoryEntries(CurrentArrayIndex)\FilenameLength = ReadAsciiCharacter(FileId)
For i=0 To *Umod\DirectoryEntries(CurrentArrayIndex)\FilenameLength -2
Filename$ = Filename$ + Chr(ReadAsciiCharacter(FileId))
Next
If Not ReadAsciiCharacter(FileId) = #Null
DebuggerWarning("0x00 wasn't found at the end of the filename !")
ErrorCode = #ERROR_UMOD_INVALID_DIR_ENTRY
Goto LUM_END
EndIf
*Umod\DirectoryEntries(CurrentArrayIndex)\Filename$ = Filename$
*Umod\DirectoryEntries(CurrentArrayIndex)\FileByteOffset = ReadLong(FileId)
*Umod\DirectoryEntries(CurrentArrayIndex)\FileLength = ReadLong(FileId)
*Umod\DirectoryEntries(CurrentArrayIndex)\FileBitFields = ReadLong(FileId)
; TODO: Add file position against header and directory check here
Until Loc(FileId) >= Lof(FileId)-SizeOf(UmodHeader)-4
; TODO: Add a file position check here between files., And a manifest one too
*Umod\Filename$ = GetFilePart(Path$)
LUM_END:
If ErrorCode
FreeStructure(*Umod)
*Umod = ErrorCode * -1
EndIf
CloseFile(FileId)
ProcedureReturn *Umod
EndProcedure
; This procedure assumes that you didn't change the file between operations or renamed it.
Procedure LoadUmod(Path$, *Umod.Umod = #Null, CompleteVerification.b = #True, FreeOnError.b = #False)
Protected i.i, ErrorCode = 0, FileId
If Not *Umod
*Umod = LoadUmodMetadata(Path$, CompleteVerification)
If *Umod <= 0
ProcedureReturn *Umod
EndIf
; If not freed when only accessible within this scope memory leaks will occur if an error occurs
FreeOnError = #True
EndIf
If FileSize(Path$) < 0 Or *Umod\Filename$ <> GetFilePart(Path$)
ErrorCode = #ERROR_UMOD_IO_SIZE
Goto LU_END
EndIf
FileId = ReadFile(#PB_Any, Path$, #PB_File_SharedRead | #PB_Ascii)
If Not FileId
ErrorCode = #ERROR_UMOD_IO_READ
Goto LU_END
EndIf
For i=0 To ArraySize(*Umod\DirectoryEntries())-1
*Umod\FileData(i) = AllocateMemory(*Umod\DirectoryEntries(i)\FileLength, #PB_Memory_NoClear)
If Not *Umod\FileData(i)
ErrorCode = #ERROR_UMOD_MALLOC
Goto LU_END
EndIf
FileSeek(FileId, *Umod\DirectoryEntries(i)\FileByteOffset, #PB_Absolute)
ReadData(FileId, *Umod\FileData(i), MemorySize(*Umod\FileData(i)))
Next
LU_END:
If ErrorCode
For i=0 To ArraySize(*Umod\DirectoryEntries()) - 1
If *Umod\FileData(i)
FreeMemory(*Umod\FileData(i))
EndIf
Next
If FreeOnError
FreeStructure(*Umod)
EndIf
*Umod = ErrorCode * -1
EndIf
CloseFile(FileId)
ProcedureReturn*Umod
EndProcedure
Procedure DebugUmodStructure(*Umod.Umod)
Protected i.i
If *Umod <= 0
ProcedureReturn
EndIf
Debug "Header:"
Debug #TAB$+"Dir. Offset: 0x" + Hex(*Umod\Header\DirectoryOffset)
Debug #TAB$+"Size (B): " + Str(*Umod\Header\UmodSize)
Debug #TAB$+"UMOD Ver.: 0x" + Hex(*Umod\Header\UmodFileVersion) + " ("+Str(*Umod\Header\UmodFileVersion)+")"
Debug #TAB$+"CRC?: 0x" + Hex(*Umod\Header\CRC32)
Debug ""
Debug "File directory:"
For i=0 To ArraySize(*Umod\DirectoryEntries())-1
Debug #TAB$+"Filename len.: "+*Umod\DirectoryEntries(i)\FilenameLength
Debug #TAB$+"Filename: "+*Umod\DirectoryEntries(i)\Filename$
Debug #TAB$+"Data offset: 0x"+Hex(*Umod\DirectoryEntries(i)\FileByteOffset) + " ("+Str(*Umod\DirectoryEntries(i)\FileByteOffset)+")"
Debug #TAB$+"Data length: "+*Umod\DirectoryEntries(i)\FileLength+" (bytes)"
Debug #TAB$+"Bit fields: 0x"+Hex(*Umod\DirectoryEntries(i)\FileBitFields)+" | 0b"+Bin(*Umod\DirectoryEntries(i)\FileBitFields)
Debug ""
Next
Debug "File content: (Base64)"
For i=0 To ArraySize(*Umod\DirectoryEntries())-1
Debug #TAB$+*Umod\DirectoryEntries(i)\Filename$+":"
If *Umod\FileData(i)
Debug #TAB$+Base64Encoder(*Umod\FileData(i), MemorySize(*Umod\FileData(i)))
Else
Debug #TAB$+"> File not loaded into memory !"
EndIf
Debug ""
Next
Debug "END"
EndProcedure
CompilerIf #PB_Compiler_IsMainFile
#UMOD_DECALSTAY$ = "Test-Umod\DecalStay.umod"
#UMOD_EXCESSIVE$ = "Test-Umod\Excessive100.umod"
DebugUmodStructure(LoadUmod(#UMOD_DECALSTAY$, #Null))
Debug #CRLF$+#CRLF$+"###############################"+#CRLF$+#CRLF$
DebugUmodStructure(LoadUmod(#UMOD_EXCESSIVE$))
; Powershell speedtest:
; Command: Measure-Command {.\speed-test01.exe}
; 1st run: ~50ms (Files were read by another program recently so they might have been sitting somewhere in memory ?)
; subsequent runs: <10ms
CompilerEndIf
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment