From a4e8d27da283e5025e28dd7802761a4d0b741374 Mon Sep 17 00:00:00 2001 From: Stan Lagun Date: Thu, 18 Jul 2013 00:49:51 +0400 Subject: [PATCH] MS SQL Server workflow Change-Id: I64d24e1ca4724c10b77f32767b9c140113de7f94 --- .../agent/InstallMsSqlServer.template | 19 ++++ data/workflows/MsSqlServer.xml | 100 ++++++++++++++++++ 2 files changed, 119 insertions(+) create mode 100644 data/templates/agent/InstallMsSqlServer.template create mode 100644 data/workflows/MsSqlServer.xml diff --git a/data/templates/agent/InstallMsSqlServer.template b/data/templates/agent/InstallMsSqlServer.template new file mode 100644 index 0000000..b1c5513 --- /dev/null +++ b/data/templates/agent/InstallMsSqlServer.template @@ -0,0 +1,19 @@ +{ + "Commands": [ + { + "Name": "Install-SQLServer", + "Arguments": { + "SAPassword": "$saPassword", + "MixedModeAuth": "$mixedModeAuth" + } + } + ], + "RebootOnCompletion": 0, + "Scripts": [ + "SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQ==", + "IyRFcnJvckFjdGlvblByZWZlcmVuY2UgPSAnU3RvcCcKCmZ1bmN0aW9uIE5ldy1PcHRpb24gKFtzdHJpbmddJE5hbWUsIFtzd2l0Y2hdJFN3aXRjaCwgW3N3aXRjaF0kQm9vbGVhbiwgW3N3aXRjaF0kU3RyaW5nLCBbc3dpdGNoXSRMaXN0LCAkQ29uc3RyYWludHM9JG51bGwpIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgT3B0aW9uIG9iamVjdAoKICAgIC5ERVNDUklQVElPTgogICAgT3B0aW9uIG9iamVjdCBpcyBhIHZpcnR1YWwgb2JqZWN0IHJlcHJlc3RudGluZyB0eXBlZCBjb21tYW5kIGxpbmUgb3B0aW9uLiBUaGVzZSBvYmplY3RzIGVuY2Fwc3VsYXRlIGVzY2FwaW5nIGFuZAogICAgdmFsaWRhdGlvbiBtYXR0ZXJzLgoKICAgIE9uZSBhbmQgb25seSBvbmUgb2YgdGhlIHN3aXRjaGVzICdTd2l0Y2gnLCAnQm9vbGVhbicsICdTdHJpbmcnIG9yICdMaXN0JyBzaG91bGQgYmUgcHJvdmlkZWQuCgogICAgLlBBUkFNRVRFUiBOYW1lCiAgICBPcHRpb24gbmFtZSBhcyBpdCBhcHBlYXJzIGluIHRoZSBjb21tYW5kIGxpbmUuCgogICAgLlBBUkFNRVRFUiBTd2l0Y2gKICAgIFVzZSB0aGlzIHN3aXRjaCB0byBjcmVhdGUgdmFsdWVsZXNzIG9wdGlvbiAoYSBzd2l0Y2gpLgoKICAgIC5QQVJBTUVURVIgQm9vbGVhbgogICAgVXNlIHRoaXMgc3dpdGNoIHRvIGNyZWF0ZSBib29sZWFuIG9wdGlvbi4gSXRzIHZhbHVlIGlzIGFsd2F5cyBjb252ZXJ0ZWQgdG8gIjEiIG9yICIwIgoKICAgIC5QQVJBTUVURVIgU3RyaW5nCiAgICBVc2UgdGhpcyBzd2l0Y2ggdG8gY3JlYXRlIHN0cmluZyBvcHRpb24uIEl0cyB2YWx1ZSB3aWxsIGJlIHByb3Blcmx5IHF1b3RlZCBpZiBuZWNlc3NhcnkuCgogICAgLlBBUkFNRVRFUiBMaXN0CiAgICBVc2UgdGhpcyBzd2l0Y2ggdG8gY3JlYXRlIG9wdGlvbiB3aXRoIGxpc3QgdmFsdWUuIFZhbHVlcyB3aWxsIGJlIHB1dCBpbnRvIGNvbW1hbmQgbGluZSB1c2luZyB2YWxpZCB2YWx1ZSBkZWxlbWl0ZXIgKGEgY29tbWEpCgogICAgLlBBUkFNRVRFUiBDb25zdHJhaW50cwogICAgV2hlbiB0aGlzIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQsIG9wdGlvbiB2YWx1ZXMgYXJlIGxpbWl0ZWQgdG8gb3B0aW9ucyBmcm9tIHRoYXQgbGlzdC4KCiAgICAjPgoKICAgICRPcHRpb24gPSBOZXctT2JqZWN0IC1UeXBlTmFtZSBQU09iamVjdAoKICAgICMgRmllbGRzCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgVHlwZSAtdmFsdWUgJG51bGwKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIE5vdGVQcm9wZXJ0eSBOYW1lIC12YWx1ZSAkbnVsbAogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IEFsbG93ZWRWYWx1ZXMgLXZhbHVlICRudWxsCgogICAgIyBJbml0CgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIF9faW5pdF9fIHsKICAgICAgICBwYXJhbShbc3RyaW5nXSROYW1lLCAkU3dpdGNoLCAkQm9vbGVhbiwgJFN0cmluZywgJExpc3QpCgogICAgICAgICR0aGlzLk5hbWUgPSAkTmFtZQogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICMgV2l0aCByZXNwZWN0IGZvciBvdXIgZGV2ZWxvcGVycyB3ZSBkbyBub3QgY2hlY2sgZm9yIGRvdWJsZSB0eXBlIHNlbGVjdGVkCiAgICAgICAgaWYgKCRTd2l0Y2gpIHsKICAgICAgICAgICAgQXVnbWVudE9wdGlvblN3aXRjaCgkdGhpcykKICAgICAgICB9IGVsc2VpZiAoJEJvb2xlYW4pIHsKICAgICAgICAgICAgQXVnbWVudE9wdGlvbkJvb2xlYW4oJHRoaXMpCiAgICAgICAgfSBlbHNlaWYgKCRTdHJpbmcpIHsKICAgICAgICAgICAgQXVnbWVudE9wdGlvblN0cmluZygkdGhpcykKICAgICAgICB9IGVsc2VpZiAoJExpc3QpIHsKICAgICAgICAgICAgQXVnbWVudE9wdGlvbkxpc3QoJHRoaXMpCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhyb3cgIlN3aXRjaCwgQm9vbGVhbiwgU3RyaW5nIG9yIExpc3Qgb3B0aW9uIHR5cGUgbXVzdCBiZSBwcm92aWRlZCBmb3Igb3B0aW9uICckTmFtZSciCiAgICAgICAgfQogICAgfQoKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIFNjcmlwdE1ldGhvZCBfX3Bvc3RfaW5pdF9fIHsKICAgICAgICBwYXJhbSgkQ29uc3RyYWludHM9JG51bGwpCiAgICAgICAgaWYgKCRDb25zdHJhaW50cyAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJHRoaXMuQWxsb3dlZFZhbHVlcyA9IEAoKQogICAgICAgICAgICAkdGhpcy5BbGxvd2VkVmFsdWVzID0gJHRoaXMuQWxsb3dlZFZhbHVlcyArICRDb25zdHJhaW50cwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRDb25zdHJhaW50cyA9ICRudWxsCiAgICAgICAgfQogICAgfQoKICAgICMgTWV0aG9kcwoKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIC1Gb3JjZSBTY3JpcHRNZXRob2QgVmFsaWRhdGUgewogICAgICAgIGlmICgkdGhpcy5BbGxvd2VkVmFsdWVzIC1uZSAkbnVsbCkgewogICAgICAgICAgICBpZiAoLW5vdCgkdGhpcy5BbGxvd2VkVmFsdWVzIC1jb250YWlucyAkdGhpcy5WYWx1ZSkpIHsKICAgICAgICAgICAgICAgICRDdHMgPSAkdGhpcy5BbGxvd2VkVmFsdWVzIC1qb2luICcsJwogICAgICAgICAgICAgICAgdGhyb3cgIk9wdGlvbiAnJCgkdGhpcy5OYW1lKScgbWF5IGhhdmUgdmFsdWVzICgkQ3RzKSBidXQgbm90ICckKCR0aGlzLlZhbHVlKSciCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBUb1N0cmluZyB7CiAgICAgICAgcmV0dXJuICIvJCgkdGhpcy5OYW1lKSIKICAgIH0KCiAgICAjIGludm9rZSBjb25zdHJ1Y3RvcgoKICAgICRPcHRpb24uX19pbml0X18oJE5hbWUsICRTd2l0Y2gsICRCb29sZWFuLCAkU3RyaW5nLCAkTGlzdCkKICAgICRPcHRpb24uX19wb3N0X2luaXRfXygkQ29uc3RyYWludHMpCgogICAgcmV0dXJuICRPcHRpb24KfQoKZnVuY3Rpb24gQXVnbWVudE9wdGlvblN3aXRjaCgkT3B0aW9uKSB7Cn0KCmZ1bmN0aW9uIEF1Z21lbnRPcHRpb25Cb29sZWFuKCRPcHRpb24pIHsKICAgICMgRmllbGRzCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgVmFsdWUgLXZhbHVlICRmYWxzZQoKICAgICMgTWV0aG9kcwoKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIC1Gb3JjZSBTY3JpcHRNZXRob2QgVG9TdHJpbmcgewogICAgICAgIGlmICgkdGhpcy5WYWx1ZSkgewogICAgICAgICAgICByZXR1cm4gIi8kKCR0aGlzLk5hbWUpPTEiCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICIvJCgkdGhpcy5OYW1lKT0wIgogICAgICAgIH0KICAgIH0KfQoKZnVuY3Rpb24gQXVnbWVudE9wdGlvblN0cmluZygkT3B0aW9uKSB7CiAgICAjIEZpZWxkcwogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IFZhbHVlIC12YWx1ZSAiIgoKICAgICMgTWV0aG9kcwoKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIC1Gb3JjZSBTY3JpcHRNZXRob2QgVG9TdHJpbmcgewogICAgICAgICR2ID0gIiQoJHRoaXMuVmFsdWUpIgogICAgICAgIGlmICgkdiAtbWF0Y2ggJy4qIC4qJykgewogICAgICAgICAgICAjIFRPRE86IEVzY2FwZSBkb3VibGUgcXVvdGUgY2hhcmFjdGVycyBpZiBwb3NzaWJsZQogICAgICAgICAgICByZXR1cm4gIi8kKCR0aGlzLk5hbWUpPWAiJHZgIiIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gIi8kKCR0aGlzLk5hbWUpPSR2IgogICAgICAgIH0KICAgIH0KfQoKZnVuY3Rpb24gQXVnbWVudE9wdGlvbkxpc3QoJE9wdGlvbikgewogICAgIyBGaWVsZHMKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIE5vdGVQcm9wZXJ0eSBWYWx1ZSAtdmFsdWUgQCgpCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBWYWxpZGF0ZSB7CiAgICAgICAgaWYgKCR0aGlzLkFsbG93ZWRWYWx1ZXMgLW5lICRudWxsKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRWIGluICR0aGlzLlZhbHVlKSB7CiAgICAgICAgICAgICAgICBpZiAoLW5vdCgkdGhpcy5BbGxvd2VkVmFsdWVzIC1jb250YWlucyAkVikpIHsKICAgICAgICAgICAgICAgICAgICAkQ3RzID0gJHRoaXMuQWxsb3dlZFZhbHVlcyAtam9pbiAnLCcKICAgICAgICAgICAgICAgICAgICB0aHJvdyAiT3B0aW9uICckKCR0aGlzLk5hbWUpJyBtYXkgaGF2ZSB2YWx1ZXMgKCRDdHMpIGJ1dCBub3QgJyRWJyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciAtRm9yY2UgU2NyaXB0TWV0aG9kIFRvU3RyaW5nIHsKICAgICAgICByZXR1cm4gIi8kKCR0aGlzLk5hbWUpPSQoJHRoaXMuVmFsdWUgLWpvaW4gJywnKSIKICAgIH0KfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlcigpIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgT3B0aW9uUGFyc2VyIG9iamVjdC4KCiAgICAuREVTQ1JJUFRJT04KICAgIE9wdGlvblBhcnNlciBvYmplY3QgbGV2ZXJhZ2VzIE9wdGlvbiBvYmplY3RzIGNhcGFiaWxpdGllcyBhbmQgYnVpbGRzIHZhbGlkIGNvbW1hbmQgbGluZSB1c2luZyBzcGVjaWZpZWQgb3B0aW9ucy4KICAgIEFuIGFwcGxpY2F0aW9uIG1heSBhbHNvIGJlIGludm9rZWQgd2l0aCBPcHRpb25QYXJzZXIuCgogICAgIz4KCiAgICAkT3B0aW9uUGFyc2VyID0gTmV3LU9iamVjdCAtVHlwZU5hbWUgUFNPYmplY3QKCiAgICAjIEZpZWxkcwogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IE9wdGlvbnMgLXZhbHVlIEB7fQogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IERlZmF1bHRzIC12YWx1ZSBAe30KICAgICRPcHRpb25QYXJzZXIgfCBBZGQtTWVtYmVyIE5vdGVQcm9wZXJ0eSBSZXF1aXJlZE9wdGlvbnMgLXZhbHVlIEAoKQoKICAgICMgTWV0aG9kcwoKICAgICRPcHRpb25QYXJzZXIgfCBBZGQtTWVtYmVyIFNjcmlwdE1ldGhvZCBBZGRPcHRpb24gewogICAgICAgIDwjCiAgICAgICAgLlNZTk9QU0lTCiAgICAgICAgQWRkcyBzdXBwb3J0ZWQgb3B0aW9uIGludG8gT3B0aW9uUGFyc2VyLgogICAgICAgIAogICAgICAgIC5ERVNDUklQVElPTgogICAgICAgIE9wdGlvblBhcnNlciBkb2VzIG5vdCBhbGxvdyB1c2luZyB1bnJlY29nbml6ZWQgb3B0aW9ucy4gVXNlIHRoaXMgbWV0aG9kIHRvIGZpbGwgT3B0aW9uUGFyc2VyIHdpdGggcmVjb2duaXplZCBvcHRpb25zCgogICAgICAgIC5QQVJBTUVURVIgT3B0aW9uCiAgICAgICAgT3B0aW9uIG9iamVjdAoKICAgICAgICAuUEFSQU1FVEVSIFJlcXVpcmVkCiAgICAgICAgUmVxdWlyZWQgb3B0aW9uIHN3aXRjaAoKICAgICAgICAuUEFSQU1FVEVSIERlZmF1bHQKICAgICAgICBPcHRpb24gZGVmYXVsdCB2YWx1ZQogICAgICAgICM+CiAgICAgICAgcGFyYW0oJE9wdGlvbiwgW2Jvb2xdJFJlcXVpcmVkPSRmYWxzZSwgJERlZmF1bHQ9JG51bGwpCiAgICAgICAgJHRoaXMuT3B0aW9ucy5BZGQoJE9wdGlvbi5OYW1lLCAkT3B0aW9uKQogICAgICAgIGlmICgkUmVxdWlyZWQpIHsKICAgICAgICAgICAgJHRoaXMuUmVxdWlyZWRPcHRpb25zID0gJHRoaXMuUmVxdWlyZWRPcHRpb25zICsgJE9wdGlvbi5OYW1lCiAgICAgICAgICAgIGlmICgkT3B0aW9uIHwgR2V0LU1lbWJlciAiVmFsdWUiKSB7CiAgICAgICAgICAgICAgICBpZiAoJERlZmF1bHQpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy5EZWZhdWx0cy5BZGQoJE9wdGlvbi5OYW1lLCAkRGVmYXVsdCkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICR0aGlzLkRlZmF1bHRzLkFkZCgkT3B0aW9uLk5hbWUsICRudWxsKQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRPcHRpb25QYXJzZXIgfCBBZGQtTWVtYmVyIFNjcmlwdE1ldGhvZCBQYXJzZSB7CiAgICAgICAgPCMKICAgICAgICAuU1lOT1BTSVMKICAgICAgICBQYXJzZXMgc3VwcGxpZWQgb3B0aW9ucyBhbmQgcmV0dXJucyBjb21tYW5kIGxpbmUgcGFyYW1ldGVycyBhcnJheS4KICAgICAgICAKICAgICAgICAuREVTQ1JJUFRJT04KICAgICAgICBUaGlzIG1ldGhvZCB2ZXJpZmllcyB0aGF0IG9ubHkgc3VwcG9ydGVkIG9wdGlvbnMgYXJlIHByb3ZpZGVkLCBhbGwgbWFuZGF0b3J5IG9wdGlvbnMgYXJlIGluIHBsYWNlLCAKICAgICAgICBhbGwgb3B0aW9uIG1lZXQgY29uc3RyYWludHMgaWYgYW55LiBVbnNwZWNpZmllZCBvcHRpb25zIHdpdGggZGVmYXVsdCB2YWx1ZXMgYXJlIGFkZGVkIHRvIGNvbW1hbmQgbGluZS4KICAgICAgICBTbywgbWFuZGF0b3J5IG9wdGlvbiB3aXRoIGRlZmF1bHQgdmFsdWUgbmV2ZXIgY2F1c2VzIGV4Y2VwdGlvbi4KCiAgICAgICAgLlBBUkFNRVRFUiBPcHRpb25zCiAgICAgICAgQSBoYXNoIG1hcCBvZiBvcHRpb25zIHRvIHBhcnNlLiBPcHRpb24gbmFtZXMgc2hvdWxkIGJlIG1hcHBlZCB0byBjb3JyZXNwb25kaW5nIHZhbHVlcy4KICAgICAgICAjPgogICAgICAgIHBhcmFtKFtoYXNodGFibGVdJE9wdGlvbnMpCgogICAgICAgICRDb21tYW5kTGluZSA9IEAoKQogICAgICAgIGZvcmVhY2ggKCRSZXF1aXJlZE9wdGlvbk5hbWUgaW4gJHRoaXMuUmVxdWlyZWRPcHRpb25zKSB7CiAgICAgICAgICAgIGlmICgtbm90ICRPcHRpb25zLkNvbnRhaW5zS2V5KCRSZXF1aXJlZE9wdGlvbk5hbWUpKSB7CiAgICAgICAgICAgICAgICAkRGVmYXVsdCA9ICR0aGlzLkRlZmF1bHRzLkdldF9JdGVtKCRSZXF1aXJlZE9wdGlvbk5hbWUpCiAgICAgICAgICAgICAgICBpZiAoJHRoaXMuRGVmYXVsdHMuQ29udGFpbnNLZXkoJFJlcXVpcmVkT3B0aW9uTmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAkT3B0aW9ucy5BZGQoJFJlcXVpcmVkT3B0aW9uTmFtZSwgJHRoaXMuRGVmYXVsdHMuR2V0X0l0ZW0oJFJlcXVpcmVkT3B0aW9uTmFtZSkpCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRocm93ICJSZXF1aXJlZCBvcHRpb24gJyRSZXF1aXJlZE9wdGlvbk5hbWUnIGlzIG1pc3NpbmciCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggKCRPcHRpb25OYW1lIGluICQoJE9wdGlvbnMua2V5cykpIHsKICAgICAgICAgICAgJE9wdGlvbiA9ICR0aGlzLk9wdGlvbnMuR2V0X0l0ZW0oJE9wdGlvbk5hbWUpCiAgICAgICAgICAgIGlmICgkT3B0aW9uIC1lcSAkbnVsbCkgewogICAgICAgICAgICAgICAgdGhyb3cgIk9wdGlvbiAnJE9wdGlvbk5hbWUnIGlzIG5vdCBhbGxvd2VkIgogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkT3B0aW9uIHwgR2V0LU1lbWJlciAiVmFsdWUiKSB7CiAgICAgICAgICAgICAgICAkT3B0aW9uLlZhbHVlID0gJE9wdGlvbnMuR2V0X0l0ZW0oJE9wdGlvbk5hbWUpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgJE9wdGlvbi5WYWxpZGF0ZSgpCiAgICAgICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICRPcHRpb24uVG9TdHJpbmcoKQogICAgICAgIH0KICAgICAgICByZXR1cm4gJENvbW1hbmRMaW5lCiAgICB9CgogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIEV4ZWN1dGVCaW5hcnkgewogICAgICAgIHBhcmFtKCRCaW5hcnksIFtoYXNodGFibGVdJE9wdGlvbnMgPSBAe30sICRDb21tYW5kTGluZVN1ZmZpeCA9IEAoKSkKICAgICAgICA8IwogICAgICAgIC5TWU5PUFNJUwogICAgICAgIEV4ZWN1dGVzIGJpbmFyeSB3aXRoIGEgY29tbWFuZCBsaW5lIGNvbnN0cnVjdGVkIGZyb20gcHJvdmlkZWQgb3B0aW9ucy4gQW4gYXJiaXRyYXJ5IHN1ZmZpeCBtYXkgYmUgCiAgICAgICAgYXBwZW5kZWQgdG8gdGhlIGNvbW1hbmQgbGluZS4KICAgICAgICAKICAgICAgICAuREVTQ1JJUFRJT04KICAgICAgICBUaGlzIG1ldGhvZCB1c2VzIE9wdGlvblBhcnNlci5QYXJzZSBtZXRob2QgdG8gY29uc3RydWN0IGNvbW1hbmQgbGluZS4gSWYgdGhlcmUgYSBjb21tYW5kIGxpbmUgc3VmZml4IAogICAgICAgIHdhcyBzdXBwbGllZCwgaXQgaXMgYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiBjb21tYW5kIGxpbmUuIE5vcm1hbGx5IGNvbW1hbmQgbGluZSBzdWZmaXggc2hvdWxkIGNvbnRhaW4KICAgICAgICBsZWFkaW5nIHNwYWNlIGNoYXJhY3Rlci4KCiAgICAgICAgTWV0aG9kIHdhaXRzIGZvciBleGVjdXRhYmxlIHByb2Nlc3MgdG8gY29tcGxldGUgYW5kIHJldHVybnMgaXRzIGV4aXQgY29kZS4KCiAgICAgICAgLlBBUkFNRVRFUiBCaW5hcnkKICAgICAgICBGdWxsIG9yIHJlbGF0aXZlIHBhdGggdG8gdGhlIGV4ZWN1dGFibGUgdG8gcnVuLgoKICAgICAgICAuUEFSQU1FVEVSIE9wdGlvbnMKICAgICAgICBBIGhhc2ggbWFwIG9mIG9wdGlvbnMgdG8gcGFzcyB0byB0aGUgZXhlY3V0YWJsZS4KCiAgICAgICAgLlBBUkFNRVRFUiBDb21tYW5kTGluZVN1ZmZpeAogICAgICAgIEFyYml0cmFyeSBjb21tYW5kIGxpbmUgc3VmZml4LiBOb3JtYWxseSBpdCBzaG91ZCBoYXZlIGxlYWRpbmcgc3BhY2UgY2hhcmFjdGVyLgogICAgICAgICM+CgogICAgICAgICRCaW5hcnkgPSBHZXQtSXRlbSAkQmluYXJ5CiAgICAgICAgJENvbW1hbmRMaW5lID0gJHRoaXMuUGFyc2UoJE9wdGlvbnMpCiAgICAgICAgaWYgKCRDb21tYW5kTGluZVN1ZmZpeCkgewogICAgICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAkQ29tbWFuZExpbmVTdWZmaXgKICAgICAgICB9CgogICAgICAgIFdyaXRlLUhvc3QgIkV4ZWN1dGluZzogJCgkQmluYXJ5LkZ1bGxOYW1lKSAkKCRDb21tYW5kTGluZSAtam9pbiAnICcpIgogICAgICAgICRwcm9jZXNzID0gW1N5c3RlbS5EaWFnbm9zdGljcy5Qcm9jZXNzXTo6U3RhcnQoJEJpbmFyeSwgJENvbW1hbmRMaW5lKQogICAgICAgICRwcm9jZXNzLldhaXRGb3JFeGl0KCkKICAgICAgICAkcHJvY2Vzcy5SZWZyZXNoKCkKICAgICAgICByZXR1cm4gJHByb2Nlc3MuRXhpdENvZGUKICAgIH0KCiAgICByZXR1cm4gJE9wdGlvblBhcnNlcgp9CgojRXhwb3J0LU1vZHVsZU1lbWJlciAtRnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlcgojRXhwb3J0LU1vZHVsZU1lbWJlciAtRnVuY3Rpb24gTmV3LU9wdGlvbg==", + "I0ltcG9ydC1Nb2R1bGUgT3B0aW9uUGFyc2VyCgojJEVycm9yQWN0aW9uUHJlZmVyZW5jZSA9ICdTdG9wJwoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckluc3RhbGwgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBhbiBvcHRpb24gcGFyc2VyIGZvciBNUyBTUUwgU2VydmVyIDIwMTIgc2V0dXAgIklOU1RBTEwiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJJTlNUQUxMIiBhY3Rpb24uCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUNUSU9OIiAtU3RyaW5nIC1Db25zdHJhaW50cyAiSU5TVEFMTCIpLCAkdHJ1ZSwgIklOU1RBTEwiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklBQ0NFUFRTUUxTRVJWRVJMSUNFTlNFVEVSTVMiIC1Td2l0Y2gpLCAkdHJ1ZSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFTlUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVwZGF0ZUVuYWJsZWQiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVwZGF0ZVNvdXJjZSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVSUk9SUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTCIsIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJEUSIsIkFTIiwiUlMiLCJEUUMiLCJJUyIsIk1EUyIsIlRvb2xzIiwiQkMiLCJCT0wiLCJCSURTIiwiQ29ubiIsIlNTTVMiLCJBRFZfU1NNUyIsIkRSRVBMQVlfQ1RMUiIsIkRSRVBMQVlfQ0xUIiwiU05BQ19TREsiLCJTREsiLCJMb2NhbERCIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJPTEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiU1BJX0FTX0V4aXN0aW5nRmFybSIsICJTUElfQVNfTmV3RmFybSIsICJBbGxGZWF0dXJlc19XaXRoRGVmYXVsdHMiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRFdPV0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlBJRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVJTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJOb3JtYWwiLCAiQXV0b0FkdmFuY2UiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FNUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTQkFDS1VQRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU0NPTExBVElPTiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQVNDT05GSUdESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTREFUQURJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQVNMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU0VSVkVSTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNVUxUSURJTUVOU0lPTkFMIiwgIlBPV0VSUElWT1QiLCAiVEFCVUxBUiIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6VVNFUkRPTUFJTlwkRU5WOlVTRVJOQU1FIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1RFTVBESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTUFJPVklERVJNU09MQVAiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGQVJNQUNDT1VOVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkFSTVBBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJQQVNTUEhSQVNFIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGQVJNQURNSU5JUE9SVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQlJPV1NFUlNWQ1NUQVJUVVBUWVBFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5BQkxFUkFOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNRTERBVEFESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNBUFdEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTRUNVUklUWU1PREUiIC1TdHJpbmcgLUNvbnN0cmFpbnJzICgiU1FMIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTEJBQ0tVUERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMQ09MTEFUSU9OIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBRERDVVJSRU5UVVNFUkFTU1FMQURNSU4iIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6VVNFUkRPTUFJTlwkRU5WOlVTRVJOQU1FIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxURU1QREJESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFRFTVBEQkxPR0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVVNFUkRCRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxVU0VSREJMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZJTEVTVFJFQU1MRVZFTCIgLVN0cmluZyAtQ29uc3RyYWludHMgKCIwIiwgIjEiLCAiMiIsICIzIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZJTEVTVFJFQU1TSEFSRU5BTUUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZUU1ZDQUNDT1VOVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRlRTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSVNTVkNBQ0NPVU5UIiAtU3RyaW5nKSwgJHRydWUsICJOVCBBVVRIT1JJVFlcTmV0d29yayBTZXJ2aWNlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJU1NWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJU1NWQ1N0YXJ0dXBUeXBlIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiTlBFTkFCTEVEIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVENQRU5BQkxFRCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTSU5TVEFMTE1PREUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiU2hhcmVQb2ludEZpbGVzT25seU1vZGUiLCAiRGVmYXVsdE5hdGl2ZU1vZGUiLCAiRmlsZXNPbmx5TW9kZSIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDU3RhcnR1cFR5cGUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKCiAgICByZXR1cm4gJE9wdGlvblBhcnNlcgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyUHJlcGFyZUltYWdlIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJQcmVwYXJlSW1hZ2UiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJQcmVwYXJlSW1hZ2UiIGFjdGlvbi4KCiAgICBOb3RlIHRoYXQgZm9yIGluc3RhbGxlciB2ZXJzaW9uIG9mIE1TIFNRTCBTZXJ2ZXIgcHJpb3IgdG8gMjAxMiBTUDEgQ3VtdWxhdGl2ZSBVcGRhdGUgMiBvbmx5IHRoZQogICAgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6IFNRTEVuZ2luZSwgUmVwbGljYXRpb24sIEZ1bGxUZXh0LCBSUwoKICAgIEFsbCBkb2N1bWVudGVkIG9wdGlvbiBhcmUgc3VwcG9ydGVkLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvciBkZXRhaWxzOgogICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKICAgICM+CiAgICAkT3B0aW9uUGFyc2VyID0gTmV3LU9wdGlvblBhcnNlcgoKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBQ1RJT04iIC1TdHJpbmcgLUNvbnN0cmFpbnRzICJQcmVwYXJlSW1hZ2UiKSwgJHRydWUsICJQcmVwYXJlSW1hZ2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklBQ0NFUFRTUUxTRVJWRVJMSUNFTlNFVEVSTVMiIC1Td2l0Y2gpLCAkdHJ1ZSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFTlUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVwZGF0ZUVuYWJsZWQiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVwZGF0ZVNvdXJjZSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQojICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGRUFUVVJFUyIgLUxpc3QgLUNvbnN0cmFpbnRzICgiU1FMRW5naW5lIiwiUmVwbGljYXRpb24iLCJGdWxsVGV4dCIsIlJTIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZFQVRVUkVTIiAtTGlzdCAtQ29uc3RyYWludHMgKCJTUUwiLCJTUUxFbmdpbmUiLCJSZXBsaWNhdGlvbiIsIkZ1bGxUZXh0IiwiRFEiLCJBUyIsIlJTIiwiRFFDIiwiSVMiLCJNRFMiLCJUb29scyIsIkJDIiwiQk9MIiwiQklEUyIsIkNvbm4iLCJTU01TIiwiQURWX1NTTVMiLCJEUkVQTEFZX0NUTFIiLCJEUkVQTEFZX0NMVCIsIlNOQUNfU0RLIiwiU0RLIiwiTG9jYWxEQiIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJISURFQ09OU09MRSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk1TU1FMU0VSVkVSIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRUyIgLVN3aXRjaCkpCgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclByZXBhcmVJbWFnZVNQMVUyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJQcmVwYXJlSW1hZ2UiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJQcmVwYXJlSW1hZ2UiIGFjdGlvbi4KCiAgICBUaGlzIGNtZGxldCBzaG91bGQgYmUgdXNlZCBvbmx5IGZvciBNUyBTUUwgU2VydmVyIDIwMTIgU1AxIENpbWlsYXRpdmUgVXBkYXRlIDIgb3IgbGF0ZXIuCgogICAgTm90ZSB0aGF0IGZvciBpbnN0YWxsZXIgdmVyc2lvbiBvZiBNUyBTUUwgU2VydmVyIHByaW9yIHRvIDIwMTIgU1AxIENpbWlsYXRpdmUgVXBkYXRlIDIgb25seSB0aGUKICAgIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOiBTUUxFbmdpbmUsIFJlcGxpY2F0aW9uLCBGdWxsVGV4dCwgUlMKCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUNUSU9OIiAtU3RyaW5nIC1Db25zdHJhaW50cyAiUHJlcGFyZUltYWdlIiksICR0cnVlLCAiUHJlcGFyZUltYWdlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJQUNDRVBUU1FMU0VSVkVSTElDRU5TRVRFUk1TIiAtU3dpdGNoKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5VIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJVcGRhdGVFbmFibGVkIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJVcGRhdGVTb3VyY2UiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkNPTkZJR1VSQVRJT05GSUxFIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGRUFUVVJFUyIgLUxpc3QgLUNvbnN0cmFpbnRzICgiU1FMIiwiU1FMRW5naW5lIiwiUmVwbGljYXRpb24iLCJGdWxsVGV4dCIsIkRRIiwiQVMiLCJSUyIsIkRRQyIsIklTIiwiTURTIiwiVG9vbHMiLCJCQyIsIkJPTCIsIkJJRFMiLCJDb25uIiwiU1NNUyIsIkFEVl9TU01TIiwiU05BQ19TREsiLCJTREsiLCJMb2NhbERCIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkhJREVDT05TT0xFIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTkRJQ0FURVBST0dSRVNTIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTlNUQUxMU0hBUkVERElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTlNUQU5DRURJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VJRCIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlEiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlFTIiAtU3dpdGNoKSkKCiAgICByZXR1cm4gJE9wdGlvblBhcnNlcgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyQ29tcGxldGVJbWFnZSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiQ29tcGxldGVJbWFnZSIgYWN0aW9uLgoKICAgIC5ERVNDUklQVElPTgogICAgVXNlIHRoaXMgY21kbGV0IHRvIGNyZWF0ZSBhbiBvcHRpb24gcGFyc2VyIGZvciBNUyBTUUwgU2VydmVyIDIwMTIgc2V0dXAgIkNvbXBsZXRlSW1hZ2UiIGFjdGlvbi4KCiAgICBOb3RlIHRoYXQgSU5TVEFOQ0VJRCBwYXJhbWV0ZXIgdmFsdWUgTVVTVCBiZSB0aGUgc2FtZSBhcyBzcGVjaWZpZWQgb24gIlByZXBhcmVJbWFnZSIgcGhhc2UuCgogICAgQWxsIGRvY3VtZW50ZWQgb3B0aW9uIGFyZSBzdXBwb3J0ZWQuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIGRldGFpbHM6CiAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAogICAgIz4KICAgICRPcHRpb25QYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIkNvbXBsZXRlSW1hZ2UiKSwgJHRydWUsICJDb21wbGV0ZUltYWdlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJQUNDRVBUU1FMU0VSVkVSTElDRU5TRVRFUk1TIiAtU3dpdGNoKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5VIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJDT05GSUdVUkFUSU9ORklMRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRVJST1JSRVBPUlRJTkciIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTkRJQ0FURVBST0dSRVNTIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTlNUQU5DRUlEIiAtU3RyaW5nKSwgJHRydWUsICJNU1NRTFNFUlZFUiIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VOQU1FIiAtU3RyaW5nKSwgJHRydWUsICJNU1NRTFNFUlZFUiIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUElEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FNUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkJST1dTRVJTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOQUJMRVJBTlUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTExTUUxEQVRBRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTQVBXRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU0VDVVJJVFlNT0RFIiAtU3RyaW5nIC1Db25zdHJhaW5ycyAoIlNRTCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxCQUNLVVBESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTENPTExBVElPTiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1NUQVJUVVBUWVBFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXCRFTlY6VVNFUk5BTUUiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFRFTVBEQkRJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVEVNUERCTE9HRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxVU0VSREJESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFVTRVJEQkxPR0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRklMRVNUUkVBTUxFVkVMIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIjAiLCAiMSIsICIyIiwgIjMiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRklMRVNUUkVBTVNIQVJFTkFNRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRlRTVkNBQ0NPVU5UIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJOUEVOQUJMRUQiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJUQ1BFTkFCTEVEIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNJTlNUQUxMTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJTaGFyZVBvaW50RmlsZXNPbmx5TW9kZSIsICJEZWZhdWx0TmF0aXZlTW9kZSIsICJGaWxlc09ubHlNb2RlIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNTdGFydHVwVHlwZSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJDb21wbGV0ZUltYWdlU1AxVTIgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBhbiBvcHRpb24gcGFyc2VyIGZvciBNUyBTUUwgU2VydmVyIDIwMTIgc2V0dXAgIkNvbXBsZXRlSW1hZ2UiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJDb21wbGV0ZUltYWdlIiBhY3Rpb24uCgogICAgVGhpcyBjbWRsZXQgc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIFNQMSBDaW1pbGF0aXZlIFVwZGF0ZSAyIG9yIGxhdGVyLgoKICAgIEFsbCBkb2N1bWVudGVkIG9wdGlvbiBhcmUgc3VwcG9ydGVkLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvciBkZXRhaWxzOgogICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKICAgICM+CiAgICAkT3B0aW9uUGFyc2VyID0gTmV3LU9wdGlvblBhcnNlcgoKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBQ1RJT04iIC1TdHJpbmcgLUNvbnN0cmFpbnRzICJDb21wbGV0ZUltYWdlIiksICR0cnVlLCAiQ29tcGxldGVJbWFnZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSUFDQ0VQVFNRTFNFUlZFUkxJQ0VOU0VURVJNUyIgLVN3aXRjaCksICR0cnVlKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVSUk9SUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VJRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VOQU1FIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJQSUQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlEiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlFTIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUU1SRVBPUlRJTkciIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJISURFQ09OU09MRSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUdUU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUdUU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ1NUQVJUVVBUWVBFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQlJPV1NFUlNWQ1NUQVJUVVBUWVBFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5BQkxFUkFOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNRTERBVEFESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNBUFdEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTRUNVUklUWU1PREUiIC1TdHJpbmcgLUNvbnN0cmFpbnJzICgiU1FMIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTEJBQ0tVUERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMQ09MTEFUSU9OIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxTVkNBQ0NPVU5UIiAtU3RyaW5nKSwgJHRydWUsICJOVCBBVVRIT1JJVFlcTmV0d29yayBTZXJ2aWNlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxTWVNBRE1JTkFDQ09VTlRTIiAtU3RyaW5nKSwgJHRydWUsICIkRU5WOlVTRVJET01BSU5cJEVOVjpVU0VSTkFNRSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVEVNUERCRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxURU1QREJMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFVTRVJEQkRJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVVNFUkRCTE9HRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGSUxFU1RSRUFNTEVWRUwiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiMCIsICIxIiwgIjIiLCAiMyIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGSUxFU1RSRUFNU0hBUkVOQU1FIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGVFNWQ0FDQ09VTlQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZUU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIk5QRU5BQkxFRCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlRDUEVOQUJMRUQiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU0lOU1RBTExNT0RFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIlNoYXJlUG9pbnRGaWxlc09ubHlNb2RlIiwgIkRlZmF1bHROYXRpdmVNb2RlIiwgIkZpbGVzT25seU1vZGUiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNBQ0NPVU5UIiAtU3RyaW5nKSwgJHRydWUsICJOVCBBVVRIT1JJVFlcTmV0d29yayBTZXJ2aWNlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ1N0YXJ0dXBUeXBlIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclVwZ3JhZGUgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyRWRpdGlvblVwZ3JhZGUgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyUmVwYWlyIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclJlYnVpbGRkYXRhYmFzZSB7CiAgICAjIFRvRG86IEltcGxlbWVudAogICAgdGhyb3cgIk5vdCB5ZXQgaW1wbGVtZW50ZWQiCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJVbmluc3RhbGwgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBhbiBvcHRpb24gcGFyc2VyIGZvciBNUyBTUUwgU2VydmVyIDIwMTIgc2V0dXAgIklOU1RBTEwiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJJTlNUQUxMIiBhY3Rpb24uCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUNUSU9OIiAtU3RyaW5nIC1Db25zdHJhaW50cyAiVU5JTlNUQUxMIiksICR0cnVlLCAiVU5JTlNUQUxMIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJDT05GSUdVUkFUSU9ORklMRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTCIsIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJEUSIsIkFTIiwiUlMiLCJEUUMiLCJJUyIsIk1EUyIsIlRvb2xzIiwiQkMiLCJCT0wiLCJCSURTIiwiQ29ubiIsIlNTTVMiLCJBRFZfU1NNUyIsIkRSRVBMQVlfQ1RMUiIsIkRSRVBMQVlfQ0xUIiwiU05BQ19TREsiLCJTREsiLCJMb2NhbERCIikpLCAkdHJ1ZSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTkRJQ0FURVBST0dSRVNTIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTlNUQU5DRU5BTUUiIC1TdHJpbmcpLCAkdHJ1ZSwgIk1TU1FMU0VSVkVSIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJISURFQ09OU09MRSIgLVN3aXRjaCkpCgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckluc3RhbGxGYWlsb3ZlckNsdXN0ZXIgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyUHJlcGFyZUZhaWxvdmVyQ2x1c3RlciB7CiAgICAjIFRvRG86IEltcGxlbWVudAogICAgdGhyb3cgIk5vdCB5ZXQgaW1wbGVtZW50ZWQiCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJDb21wbGV0ZUZhaWxvdmVyQ2x1c3RlciB7CiAgICAjIFRvRG86IEltcGxlbWVudAogICAgdGhyb3cgIk5vdCB5ZXQgaW1wbGVtZW50ZWQiCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJVcGdyYWRlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckFkZE5vZGUgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyUmVtb3ZlTm9kZSB7CiAgICAjIFRvRG86IEltcGxlbWVudAogICAgdGhyb3cgIk5vdCB5ZXQgaW1wbGVtZW50ZWQiCn0KCiNFeHBvcnQtTW9kdWxlTWVtYmVyIC1GdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VySW5zdGFsbAojRXhwb3J0LU1vZHVsZU1lbWJlciAtRnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclByZXBhcmVJbWFnZQojRXhwb3J0LU1vZHVsZU1lbWJlciAtRnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclByZXBhcmVJbWFnZVNQMVUyCiNFeHBvcnQtTW9kdWxlTWVtYmVyIC1GdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyQ29tcGxldGVJbWFnZQojRXhwb3J0LU1vZHVsZU1lbWJlciAtRnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckNvbXBsZXRlSW1hZ2VTUDFVMgojRXhwb3J0LU1vZHVsZU1lbWJlciAtRnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclVwZ3JhZGUKI0V4cG9ydC1Nb2R1bGVNZW1iZXIgLUZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJFZGl0aW9uVXBncmFkZQojRXhwb3J0LU1vZHVsZU1lbWJlciAtRnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclJlcGFpcgojRXhwb3J0LU1vZHVsZU1lbWJlciAtRnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclJlYnVpbGRkYXRhYmFzZQojRXhwb3J0LU1vZHVsZU1lbWJlciAtRnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclVuaW5zdGFsbAojRXhwb3J0LU1vZHVsZU1lbWJlciAtRnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckluc3RhbGxGYWlsb3ZlckNsdXN0ZXIKI0V4cG9ydC1Nb2R1bGVNZW1iZXIgLUZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJQcmVwYXJlRmFpbG92ZXJDbHVzdGVyCiNFeHBvcnQtTW9kdWxlTWVtYmVyIC1GdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyQ29tcGxldGVGYWlsb3ZlckNsdXN0ZXIKI0V4cG9ydC1Nb2R1bGVNZW1iZXIgLUZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJVcGdyYWRlCiNFeHBvcnQtTW9kdWxlTWVtYmVyIC1GdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyQWRkTm9kZQojRXhwb3J0LU1vZHVsZU1lbWJlciAtRnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclJlbW92ZU5vZGUK", + "SW1wb3J0LU1vZHVsZSBOZXRTZWN1cml0eQoKI0ltcG9ydC1Nb2R1bGUgT3B0aW9uUGFyc2VyCiNJbXBvcnQtTW9kdWxlIFNRTFNlcnZlck9wdGlvblBhcnNlcnMKCiMkRXJyb3JBY3Rpb25QcmVmZXJlbmNlID0gJ1N0b3AnCgpmdW5jdGlvbiBUZXN0LUtleShbc3RyaW5nXSRwYXRoLCBbc3RyaW5nXSRrZXkpCnsKICAgIGlmKCEoVGVzdC1QYXRoICRwYXRoKSkgeyByZXR1cm4gJGZhbHNlIH0KICAgIGlmICgoR2V0LUl0ZW1Qcm9wZXJ0eSAkcGF0aCkuJGtleSAtZXEgJG51bGwpIHsgcmV0dXJuICRmYWxzZSB9CiAgICByZXR1cm4gJHRydWUKfQoKZnVuY3Rpb24gUmVzb2x2ZS1TUUxTZXJ2ZXJQcmVyZXF1aXNpdGVzIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgcHJlcmVxdWlzaXRlcyAoLk5ldCBGcmFtZXdvcmsgMy41KQoKICAgIC5ERVNDUklQVElPTgogICAgSW5zdGFsbHMgTVMgU1FMIFNlcnZlciBwcmVyZXF1aXNpdGVzICguTmV0IEZyYW1ld29yayAzLjUpCgogICAgIz4KICAgIGlmICgtbm90IChUZXN0LUtleSAiSEtMTTpcU29mdHdhcmVcTWljcm9zb2Z0XE5FVCBGcmFtZXdvcmsgU2V0dXBcTkRQXHYzLjUiICJJbnN0YWxsIikpIHsKICAgICAgICBJbXBvcnQtTW9kdWxlIFNlcnZlck1hbmFnZXIKICAgICAgICBXcml0ZS1Ib3N0ICIuTmV0IEZyYW1ld29yayAzLjUgbm90IGZvdW5kLiBJbnN0YWxsaW5nIGl0IHVzaW5nIFNlcnZlciBNYW5hZ2VyLi4uIgogICAgICAgICRGZWF0dXJlID0gR2V0LVdpbmRvd3NGZWF0dXJlIE5FVC1GcmFtZXdvcmsKICAgICAgICBpZiAoJEZlYXR1cmUgLWVxICRudWxsKSB7CiAgICAgICAgICAgICMgV2UgYXJlIHByb2JhYmx5IG9uIFdpbmRvd3MgU2VydmVyIDIwMTIKICAgICAgICAgICAgJEZlYXR1cmUgPSBHZXQtV2luZG93c0ZlYXR1cmUgTkVULUZyYW1ld29yay1Db3JlCiAgICAgICAgfQogICAgICAgIGlmICgtbm90ICRGZWF0dXJlKSB7CiAgICAgICAgICAgIHRocm93ICIuTmV0IGZyYW1ld29yayAzLjUgZmVhdHVyZSB3YXMgbm90IGZvdW5kLiIKICAgICAgICB9CiAgICAgICAgaWYgKC1ub3QgJEZlYXR1cmUuRGlzcGxheU5hbWUgLW1hdGNoICIzLjUiKSB7CiAgICAgICAgICAgIExvZy1XYXJuaW5nICIuTmV0IGZyYW1ld29yayAzLjUgaXMgcmVxdWlyZWQsIGJ1dCAkKCRGZWF0dXJlLkRpc3BsYXlOYW1lKSBpcyBhdmFpbGFibGUgYXMgV2luZG93cyBmZWF0dXJlLiBQcm9jZWVkaW5nIHdpdGggaW5zdGFsbGF0aW9uIgogICAgICAgIH0KICAgICAgICBbdm9pZF0oQWRkLVdpbmRvd3NGZWF0dXJlICRGZWF0dXJlKQogICAgfQp9CgpmdW5jdGlvbiBOZXctU1FMU2VydmVyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluc3RhbmNlLiBSZXR1cm5zICR0cnVlIGlmIGEgcmVib290IGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBpbnN0YWxsYXRpb24sIAogICAgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpbiBjYXNlIGlmIGluc3RhbGxhdGlvbiBmYWlscy4KCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluc3RhbmNlIGluIHVuYXR0ZW5kZWQgbW9kZS4KCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBFeHRyYUZlYXR1cmVzCiAgICBMaXN0IG9mIGZlYXR1cmVzIHRvIGJlIGluc3RhbGxlZCBpbiBhZGRpdGlvbiB0byBkZWZhdWx0ICJTUUxFbmdpbmUiLCAiQ29ubiIsICJTU01TIiwgIkFEVl9TU01TIi4KICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kU2V0dXBSb290LAogICAgICAgIFthcnJheV0kRXh0cmFGZWF0dXJlcyA9IEAoKSwKICAgICAgICBbSGFzaHRhYmxlXSRFeHRyYU9wdGlvbnMgPSBAe30KICAgICkKCiAgICAkU2V0dXBEaXIgPSBHZXQtSXRlbSAkU2V0dXBSb290CiAgICAkU2V0dXBFeGUgPSAkU2V0dXBEaXIuR2V0RmlsZXMoInNldHVwLmV4ZSIpWzBdCgogICAgUmVzb2x2ZS1TUUxTZXJ2ZXJQcmVyZXF1aXNpdGVzCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRIiA9ICRudWxsOyAiRkVBVFVSRVMiID0gQCgiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIpICsgJEV4dHJhRmVhdHVyZXN9ICsgJEV4dHJhT3B0aW9ucykKCiAgICBpZiAoJEV4aXRDb2RlIC1lcSAzMDEwKSB7CiAgICAgICAgcmV0dXJuICR0cnVlCiAgICB9CgogICAgaWYgKCRFeGl0Q29kZSAtbmUgMCkgewogICAgICAgIHRocm93ICJJbnN0YWxsYXRpb24gZXhlY3V0YWJsZSBleGl0ZWQgd2l0aCBjb2RlICQoInswOlg4fSIgLWYgJEV4aXRDb2RlKSAoRGVjaW1hbDogJEV4aXRDb2RlKSIKICAgIH0KCiAgICByZXR1cm4gJGZhbHNlCn0KCmZ1bmN0aW9uIE5ldy1TUUxTZXJ2ZXJGb3JBT0FHIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluc3RhbmNlIHdpdGggYWxsIG5lZWRlZCBmZWF0dXJlcyB0byBzZXQgdXAgQWx3YXlzT24gQXZhaWxhYmlsaXR5IEdyb3VwLgogICAgUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAkZmFsc2UgaWYgYSByZWJvb3QgaXMgbm90IHJlcXVpcmVkIAogICAgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSBpbiB1bmF0dGVuZGVkIG1vZGUuIEFsbCBmZWF0dXJlcyBmb3IgQWx3YXlzT24gQXZhaWxhYmlsaXR5IEdyb3VwcyBhcmUKICAgIGluc3RhbGxlZC4KCiAgICBBbGwgYXZhaWxhYmlsaXR5IGdyb3VwIG1lbWJlcnMgbXVzdCBiZSBpbnN0YWxsZWQgd2l0aCB0aGUgc2FtZSBTUUxTdmNVc3JEb21hbiwgU1FMU3ZjVXNyTmFtZSBhbmQgU1FMU3ZjVXNyUGFzc3dvcmQgcGFyYW1ldGVycy4KICAgIFVzZXIgbXVzdCBiZSBhIGRvbWFpbiB1c2VyIHNpbmNlIGl0IHdpbGwgYmUgdXNlZCBmb3Igbm9kZXMgaW50ZXJjb25uZWN0aW9uLgoKICAgIC5QQVJBTUVURVIgU2V0dXBSb290CiAgICBNUyBTUUwgU2VydmVyIGluc3RhbGxhdGlvbiBmaWxlcyByb290IGRpcmVjdG9yeS4gTm9ybWFsbHkgaXQgaXMganVzdCBEVkQgZHJpdmUgbmFtZS4KCiAgICAuUEFSQU1FVEVSIFNRTFN2Y1VzckRvbWFpbgogICAgTVMgU1FMIFNlcnZlciB1c2VyIGFjY291bnQgZG9tYWluIG5hbWUuCgogICAgLlBBUkFNRVRFUiBTUUxTdmNVc3JOYW1lCiAgICBNUyBTUUwgU2VydmVyIHVzZXIgYWNjb3VudCBuYW1lLgoKICAgIC5QQVJBTUVURVIgU1FMU3ZjVXNyUGFzc3dvcmQKICAgIE1TIFNRTCBTZXJ2ZXIgdXNlciBhY2NvdW50IHBhc3N3b3JkLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSByZW1vdmVkIGJlc2lkZXMgIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiLCAiRFJFUExBWV9DVExSIiwgIkRSRVBMQVlfQ0xUIi4KICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kU2V0dXBSb290LAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNRTFN2Y1VzckRvbWFpbiwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JOYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNRTFN2Y1VzclBhc3N3b3JkLAogICAgICAgIFthcnJheV0kRXh0cmFGZWF0dXJlcyA9IEAoKQogICAgKQoKICAgICRTZXR1cERpciA9IEdldC1JdGVtICRTZXR1cFJvb3QKICAgICRTZXR1cEV4ZSA9ICRTZXR1cERpci5HZXRGaWxlcygic2V0dXAuZXhlIilbMF0KCiAgICAkU1FMVXNlciA9ICIkU1FMU3ZjVXNyRG9tYWluXCRTUUxTdmNVc3JOYW1lIgogICAgJGRvbWFpbiA9IE5ldy1PYmplY3QgU3lzdGVtLkRpcmVjdG9yeVNlcnZpY2VzLkRpcmVjdG9yeUVudHJ5KCJMREFQOi8vJFNRTFN2Y1VzckRvbWFpbiIsICRTUUxTdmNVc3JOYW1lLCAkU1FMU3ZjVXNyUGFzc3dvcmQpCgogICAgaWYgKCRkb21haW4ubmFtZSAtZXEgJG51bGwpIHsKICAgICAgICB0aHJvdyAiQ3JlZGVudGlhbHMgdmFsaWRhdGlvbiBmYWlsZWQgZm9yIHVzZXIgJFNRTFVzZXIuIENoZWNrIGRvbWFpbiwgbG9naW4gbmFtZSBhbmQgcGFzc3dvcmQuIgogICAgfQoKICAgIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcwoKICAgICRwYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VySW5zdGFsbAogICAgJEV4aXRDb2RlID0gJHBhcnNlci5FeGVjdXRlQmluYXJ5KCRTZXR1cEV4ZS5GdWxsTmFtZSwgQHsiUVMiID0gJG51bGw7ICJGRUFUVVJFUyIgPSBAKCJTUUxFbmdpbmUiLCAiQ29ubiIsICJTU01TIiwgIkFEVl9TU01TIiwgIkRSRVBMQVlfQ1RMUiIsICJEUkVQTEFZX0NMVCIpICsgJEV4dHJhRmVhdHVyZXM7CiAgICAgICAgIkFHVFNWQ0FDQ09VTlQiID0gJFNRTFVzZXI7ICJBR1RTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmQ7ICJBU1NWQ0FDQ09VTlQiID0gJFNRTFVzZXI7ICJBU1NWQ1BBU1NXT1JEIiA9ICRTUUxTdmNVc3JQYXNzd29yZDsgIkFTU1lTQURNSU5BQ0NPVU5UUyIgPSAkU1FMVVNlcjsKICAgICAgICAiU1FMU1ZDQUNDT1VOVCIgPSAkU1FMVXNlcjsgIlNRTFNWQ1BBU1NXT1JEIiA9ICRTUUxTdmNVc3JQYXNzd29yZDsgIlNRTFNZU0FETUlOQUNDT1VOVFMiID0gJFNRTFVzZXI7ICJJU1NWQ0FDQ09VTlQiID0gJFNRTFVzZXI7ICJJU1NWQ1BBU1NXT1JEIiA9ICRTUUxTdmNVc3JQYXNzd29yZDsgCiAgICAgICAgIlJTU1ZDQUNDT1VOVCIgPSAkU1FMVXNlcjsgIlJTU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkfSkKCiAgICBpZiAoJEV4aXRDb2RlIC1lcSAzMDEwKSB7CiAgICAgICAgcmV0dXJuICR0cnVlCiAgICB9CgogICAgaWYgKCRFeGl0Q29kZSAtbmUgMCkgewogICAgICAgIHRocm93ICJJbnN0YWxsYXRpb24gZXhlY3V0YWJsZSBleGl0ZWQgd2l0aCBjb2RlICQoInswOlg4fSIgLWYgJEV4aXRDb2RlKSAoRGVjaW1hbDogJEV4aXRDb2RlKSIKICAgIH0KCiAgICByZXR1cm4gJGZhbHNlCn0KCmZ1bmN0aW9uIFJlbW92ZS1TUUxTZXJ2ZXIgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgVW5pbnN0YWxscyBNUyBTUUwgU2VydmVyIGluc3RhbmNlIGluc3RhbGxlZCB3aXRoIE5ldy1TUUxTZXJ2ZXIgY21kbGV0CgogICAgLkRFU0NSSVBUSU9OCiAgICBVbmluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW5zdGFsbGVkIHdpdGggTmV3LVNRTFNlcnZlciBjbWRsZXQgaW4gdW5hdHRlbmRlZCBtb2RlCgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSByZW1vdmVkIGJlc2lkZXMgIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTZXR1cFJvb3QsCiAgICAgICAgW2FycmF5XSRFeHRyYUZlYXR1cmVzID0gQCgpCiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgICRwYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyVW5pbnN0YWxsCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRIiA9ICRudWxsOyAiRkVBVFVSRVMiID0gQCgiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIpICsgJEV4dHJhRmVhdHVyZXN9KQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkiCiAgICB9Cn0KCmZ1bmN0aW9uIEluc3RhbGwtU1FMU2VydmVyRm9yU3lzUHJlcCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbiBzeXNwcmVwIG1vZGUuCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbiBzeXNwcmVwIG1vZGUuIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgCiAgICAkZmFsc2UgaWYgYSByZWJvb3QgaXMgbm90IHJlcXVpcmVkIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIFNldHVwIG11c3QgYmUgY29tcGxldGVkIGFmdGVyIGJvb3RpbmcgcmVhcm1lZCBtYWNoaW5lIGJ5IHVzaW5nIENvbXBsZXRlLVNRTFNlcnZlciBjbWRsZXQKCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBFeHRyYUZlYXR1cmVzCiAgICBMaXN0IG9mIGZlYXR1cmVzIHRvIGJlIGluc3RhbGxlZCBpbiBhZGRpdGlvbiB0byBkZWZhdWx0ICJTUUxFbmdpbmUiLiBOb3RlIHRoYXQgcHJpb3IgdG8KICAgIFNRTCBTZXJ2ZXIgdmVyc2lvbiAyMDEyIFNlcnZpY2UgUGFjayAxIEN1bXVsYXRpdmUgVXBkYXRlIDIgKEphbnVhcnkgMjAxMykgb25seSAiUmVwbGljYXRpb24iLCAKICAgICJGdWxsVGV4dCIgYW5kICJSUyIgbWF5IGJlIGluc3RhbGxlZCBpbiBhZGRpdGlvbiB0byAiU1FMRW5naW5lIi4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IKICAgIGRldGlhbHM6IGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CgogICAgIz4KfQoKZnVuY3Rpb24gSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4KCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgU2V0dXAgbXVzdCBiZSBjb21wbGV0ZWQgYWZ0ZXIgYm9vdGluZyByZWFybWVkIG1hY2hpbmUgYnkgdXNpbmcgQ29tcGxldGUtU1FMU2VydmVyIGNtZGxldAoKICAgIC5QQVJBTUVURVIgU2V0dXBSb290CiAgICBNUyBTUUwgU2VydmVyIGluc3RhbGxhdGlvbiBmaWxlcyByb290IGRpcmVjdG9yeS4gTm9ybWFsbHkgaXQgaXMganVzdCBEVkQgZHJpdmUgbmFtZS4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvIGRlZmF1bHQgIlNRTEVuZ2luZSIuIE5vdGUgdGhhdCBwcmlvciB0bwogICAgU1FMIFNlcnZlciB2ZXJzaW9uIDIwMTIgU2VydmljZSBQYWNrIDEgQ3VtdWxhdGl2ZSBVcGRhdGUgMiAoSmFudWFyeSAyMDEzKSBvbmx5ICJSZXBsaWNhdGlvbiIsIAogICAgIkZ1bGxUZXh0IiBhbmQgIlJTIiBtYXkgYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvICJTUUxFbmdpbmUiLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvcgogICAgZGV0aWFsczogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCkKICAgICkKCiAgICAkU2V0dXBEaXIgPSBHZXQtSXRlbSAkU2V0dXBSb290CiAgICAkU2V0dXBFeGUgPSAkU2V0dXBEaXIuR2V0RmlsZXMoInNldHVwLmV4ZSIpWzBdCgogICAgUmVzb2x2ZS1TUUxTZXJ2ZXJQcmVyZXF1aXNpdGVzCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJQcmVwYXJlSW1hZ2UKICAgICRFeGl0Q29kZSA9ICRwYXJzZXIuRXhlY3V0ZUJpbmFyeSgkU2V0dXBFeGUuRnVsbE5hbWUsIEB7IlFTIiA9ICRudWxsOyAiRkVBVFVSRVMiID0gQCgiU1FMRW5naW5lIikgKyAkRXh0cmFGZWF0dXJlcyB9KQoKICAgIGlmICgkRXhpdENvZGUgLWVxIDMwMTApIHsKICAgICAgICByZXR1cm4gJHRydWUKICAgIH0KCiAgICBpZiAoJEV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgdGhyb3cgIkluc3RhbGxhdGlvbiBleGVjdXRhYmxlIGV4aXRlZCB3aXRoIGNvZGUgJCgiezA6WDh9IiAtZiAkRXhpdENvZGUpIChEZWNpbWFsOiAkRXhpdENvZGUpIgogICAgfQoKICAgIHJldHVybiAkZmFsc2UKfQoKZnVuY3Rpb24gQ29tcGxldGUtU1FMU2VydmVyQWZ0ZXJTeXNQcmVwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbXBsZXRlcyBwcmV2aW91c2x5IHByZXBhcmVkIHdpdGggIkluc3RhbGwtU1FMU2VydmVyRm9yU3lzUHJlcCIgTVMgU1FMIFNlcnZlciBhZnRlciB0aGUgc3lzdGVtIHdhcyByZWFybWVkLgoKICAgIC5ERVNDUklQVElPTgogICAgQ29tcGxldGVzIHByZXZpb3VzbHkgcHJlcGFyZWQgd2l0aCAiSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIiBNUyBTUUwgU2VydmVyIGFmdGVyIHRoZSBzeXN0ZW0gd2FzIHJlYXJtZWQuCiAgICBSZXR1cm5zICR0cnVlIGlmIGEgcmVib290IGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBpbnN0YWxsYXRpb24sICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyAKICAgIGFuIGV4Y2VwdGlvbiBpbiBjYXNlIGlmIGluc3RhbGxhdGlvbiBmYWlscy4KCiAgICBTZXR1cCBtdXN0IGJlIGNvbXBsZXRlZCBhZnRlciBib290aW5nIHJlYXJtZWQgbWFjaGluZSBieSB1c2luZyBDb21wbGV0ZS1TUUxTZXJ2ZXIgY21kbGV0CgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTZXR1cFJvb3QKICAgICkKCiAgICAkU2V0dXBEaXIgPSBHZXQtSXRlbSAkU2V0dXBSb290CiAgICAkU2V0dXBFeGUgPSAkU2V0dXBEaXIuR2V0RmlsZXMoInNldHVwLmV4ZSIpWzBdCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJDb21wbGV0ZUltYWdlCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRUyIgPSAkbnVsbH0pCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBDb252ZXJ0VG8tU1FMU3RyaW5nIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIHN0cmluZyBpbiBxdW90ZXMKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIHN0cmluZyBpbiBxdW90ZXMuIFRoZSBzdHJpbmcgbWF5IGNvbnRhaW4gYW55IGNoYXJhY3RlcnMuCiAgICBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTc5ODk5LmFzcHgKCiAgICAuUEFSQU1FVEVSIFMKICAgIFN0cmluZyB0byBjb252ZXJ0CiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kUwogICAgKQogICAgCiAgICByZXR1cm4gIickKCRTIC1yZXBsYWNlICInIiwgIicnIiknIgp9CgpmdW5jdGlvbiBDb252ZXJ0VG8tU1FMTmFtZSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDb252ZXJ0cyBhcmd1bWVudCB0byBhIHZhbGlkIFNRTCBuYW1lIGluIGJyYWNrZXRzCgogICAgLkRFU0NSSVBUSU9OCiAgICBDb252ZXJ0cyBhcmd1bWVudCB0byBhIHZhbGlkIFNRTCBuYW1lIGluIGJyYWNrZXRzLiBUaGUgc3RyaW5nIG1heSBjb250YWluIGFueSBjaGFyYWN0ZXJzLgogICAgU2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE3NTg3NC5hc3B4CgogICAgLlBBUkFNRVRFUiBTCiAgICBTdHJpbmcgdG8gY29udmVydAogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUsIFZhbHVlRnJvbVBpcGVsaW5lID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFMKICAgICkKICAgIHJldHVybiAiWyQoJFMgLXJlcGxhY2UgIl0iLCAiXV0iKV0iCn0KCmZ1bmN0aW9uIEludm9rZS1TUUxUZXh0IHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEludm9rZXMgU1FMIHRleHQKCiAgICAuREVTQ1JJUFRJT04KICAgIEludm9rZXMgU1FMIHRleHQuIFJldHVybnMgcmF3IFNRTCBzZXJ2ZXIgb3V0cHV0LgoKICAgIC5QQVJBTUVURVIgU1FMCiAgICBTUUwgVGV4dAoKICAgIC5QQVJBTUVURVIgVXNlcgogICAgU1FMIFNlcnZlciB1c2VyIG5hbWUKCiAgICAuUEFSQU1FVEVSIFBhc3N3b3JkCiAgICBTUUwgU2VydmVyIHVzZXIgcGFzc3dvcmQKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUwsCiAgICAgICAgW3N0cmluZ10kVXNlciA9ICRudWxsLAogICAgICAgIFtzdHJpbmddJFBhc3N3b3JkID0gJG51bGwKICAgICkKCiAgICAjV3JpdGUtV2FybmluZyAiJFNRTGBuIgogICAgI3JldHVybgoKICAgICRCaW5hcnkgPSBHZXQtQ29tbWFuZCAic3FsY21kLmV4ZSIKCiAgICAkdGVtcEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCiAgICAkdGVtcEZpbGUgPSBHZXQtSXRlbSAkdGVtcEZpbGUKICAgIFNldC1Db250ZW50IC1QYXRoICR0ZW1wRmlsZSAtVmFsdWUgJFNRTAoKICAgICRDb21tYW5kTGluZSA9IEAoJy1oJywgJy0xJywgJy1iJywgJy1pJywgImAiJCgkdGVtcEZpbGUuRnVsbE5hbWUpYCIiKQogICAgaWYgKCgkVXNlciAtbmUgJG51bGwpIC1hbmQgKCRVc2VyIC1uZSAnJykpIHsKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAnLVUnCiAgICAgICAgJENvbW1hbmRMaW5lID0gJENvbW1hbmRMaW5lICsgJFVzZXIKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAnLVAnCiAgICAgICAgJENvbW1hbmRMaW5lID0gJENvbW1hbmRMaW5lICsgJFBhc3N3b3JkCiAgICB9CgogICAgV3JpdGUtRGVidWcgIkV4ZWN1dGluZzogYG4kU1FMYG4iCiAgICBbc3RyaW5nXSRvdXRwdXQgPSAmJEJpbmFyeSAkQ29tbWFuZExpbmUKCiAgICAkRXhpdENvZGUgPSAkTGFzdEV4aXRDb2RlCiAgICBpZiAoJEV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgV3JpdGUtV2FybmluZyAkb3V0cHV0CiAgICAgICAgdGhyb3cgIlNRTENNRC5FWEUgcmV0dXJuZWQgd2l0aCBleGl0IGNvZGUgJEV4aXRDb2RlIHdoaWxlIHJ1bm5pbmcgJEJpbmFyeSAkQ29tbWFuZExpbmUiCiAgICB9CiAgIAogICAgUmVtb3ZlLUl0ZW0gJHRlbXBGaWxlCgogICAgcmV0dXJuICRvdXRwdXQKfQoKZnVuY3Rpb24gTmV3LVNRTFVzZXIgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgSW52b2tlcyBTUUwgdGV4dAoKICAgIC5ERVNDUklQVElPTgogICAgSW52b2tlcyBTUUwgdGV4dAoKICAgIC5QQVJBTUVURVIgU1FMCiAgICBTUUwgVGV4dAoKICAgIC5QQVJBTUVURVIgVXNlcgogICAgU1FMIFNlcnZlciB1c2VyIG5hbWUKCiAgICAuUEFSQU1FVEVSIFBhc3N3b3JkCiAgICBTUUwgU2VydmVyIHVzZXIgcGFzc3dvcmQKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUwsCiAgICAgICAgW3N0cmluZ10kVXNlciA9ICRudWxsLAogICAgICAgIFtzdHJpbmddJFBhc3N3b3JkID0gJG51bGwKICAgICkKfQoKZnVuY3Rpb24gTmV3LVBhc3N3b3JkIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgcmFuZG9tIHBhc3N3b3JkIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoCgogICAgLkRFU0NSSVBUSU9OCiAgICBQYXNzd29yZCBjb250YWlucyByYW5kb20gY2hhcmFjdGVycyBhLXosIEEtWiwgbnVtYmVycyBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzLgogICAgVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYWxsIHRoZSB0eXBlcyBvZiBzeW1ib2xzIHdpbGwgYmUgcHJlc2VudCBpbiB0aGUgcGFzc3dvcmQuCgogICAgLlBBUkFNRVRFUiBMZW5ndGgKICAgIERlc2lyZWQgbGVuZ3RoIG9mIHRoZSBwYXNzd29yZC4KCiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW2ludF0kTGVuZ3RoPTYKICAgICkKCiAgICAkUmVzdWx0ID0gIiIKICAgICRhbHBoYSA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSFAIyQlXiYqKCknYCJgYF8rW11ce318OzosLi88Pj9+IgogICAgd2hpbGUgKCRMZW5ndGggLWd0IDApIHsKICAgICAgICAkeCA9IEdldC1SYW5kb20gJGFscGhhLkxlbmd0aAogICAgICAgICRjID0gJGFscGhhWyR4XQogICAgICAgICRSZXN1bHQgPSAiJFJlc3VsdCRjIgogICAgICAgICRMZW5ndGggPSAkTGVuZ3RoIC0gMQogICAgfQogICAgcmV0dXJuICRSZXN1bHQKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1NaXJyb3JpbmdFbmRwb2ludCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIG1pcnJvcmluZyBlbmRwb2ludC4KCiAgICAuREVTQ1JJUFRJT04KICAgIE1hc3RlciBrZXkgaXMgY3JlYXRlZCBpZiBuZWNlc3NhcnkuIEhvc3QgY2VydGlmaWNhdGUgaXMgY3JlYXRlZCB3aGVuIG5lY2Vzc2FyeSBlaXRoZXIgKG5vcm1hbGx5IG9uIGZpcnN0IGVuZHBvaW50IGNyZWF0aW9uKS4KCiAgICBFbmRwb2ludCBhbmQgY2VydGlmaWNhdGUgYXJlIHJlY3JlYXRlZCBpbiBjYXNlIGlmIG1hc3RlciBrZXkgZGlkIG5vdCBleGlzdGVkIChzaG91bGQgbm90IG5vcm1hbGx5IGhhcHBlbikuCgogICAgRW5kcG9pbnQgaXMgcmVjcmVhdGVkIGluIGNhc2UgaWYgY2VydGlmaWNhdGUgZGlkIG5vdCBleGlzdGVkIChzaG91bGQgbm90IGhhcHBlbiB1bmxlc3MgdGhlIGVuZHBvaW50IHdhcyBjcmVhdGVkIG1hbnVhbGx5KS4KCiAgICBNaXJyb3JpbmcgZW5kcG9pbnQgaXMgY3JlYXRlZCB1bmxlc3Mgb25lIGFscmVhZHkgZXhpc3RzLiBUaGUgZW5kcG9pbnQgaXMgY3JlYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gV2hlbiB0aGUgZW5kcG9pbnQKICAgIGFscmVhZHkgZXhpc3RzIGlzIGlzIHVuY2hhbmdlZC4KCiAgICBFbmRwb2ludCBwb3J0IGlzIHNlbGVjdGVkIGF1dG9tYXRpY2FsbHkgYXMgNDAyMiBvciBhcyBmaXJzdCBhdmFpbGFibGUgcG9ydCBhZnRlciA0MDIyIGluIGNhc2UgaWYgNDAyMiBpcyBhbHJlYWR5IGxpc3RlbmluZy4KICAgIElmIHRoZXJlIGlzIG5vIGZpcmV3YWxsIHJ1bGUgd2l0aCBuYW1lICdEYXRhYmFzZU1pcnJvcmluZy1UQ1Ate3BvcnRudW1iZXJ9JywgYWxsb3dpbmcgcnVsZSBpcyBjcmVhdGVkLgoKICAgIENlcnRpZmljYXRlIGlzIHN0b3JlZCBpbiB0aGUgc3BlY2lmaWVkIGZpbGUuCgogICAgUmV0dXJucyBlbmRwb2ludCBsaXN0ZW5pbmcgcG9ydC4KCiAgICAuUEFSQU1FVEVSIEVuY3J5cHRpb25QYXNzd29yZAogICAgRW5jcnlwdGlvbiBwYXNzd29yZCB1c2VkIHRvIGNyZWF0ZSBjZXJ0aWZpY2F0ZS4KCiAgICAuUEFSQU1FVEVSIENlcnRpZmljYXRlRmlsZU5hbWUKICAgIENlcnRpZmljYXRlIHRhcmdldCBmaWxlIG5hbWUuIEZpbGUgTVVTVCBOT1QgZXhpc3QuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRFbmNyeXB0aW9uUGFzc3dvcmQsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kQ2VydGlmaWNhdGVGaWxlTmFtZQogICAgKQoKICAgICRFbmRwb2ludE5hbWUgPSAnTWlycm9yaW5nRW5kcG9pbnQnCgogICAgJEZvbGRlciA9IEdldC1JdGVtICRXb3JrRGlyCgogICAgJEggPSAkRW52OkNPTVBVVEVSTkFNRSAtcmVwbGFjZSAnW15BLVphLXowLTlfXScsICdfJwoKICAgICRQb3J0ID0gR2V0LU5leHRGcmVlUG9ydCA0MDIyCgogICAgJENyZWF0ZU1hc3RlcktleSA9ICJVU0UgbWFzdGVyOwoKICAgICAgICAgICAgICAgICAgICAgICAgSUYgTk9UIEVYSVNUUyhzZWxlY3QgKiBmcm9tIHN5cy5zeW1tZXRyaWNfa2V5cyB3aGVyZSBuYW1lID0gJyMjTVNfRGF0YWJhc2VNYXN0ZXJLZXkjIycpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgTUFTVEVSIEtFWSBFTkNSWVBUSU9OIEJZIFBBU1NXT1JEID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICRFbmNyeXB0aW9uUGFzc3dvcmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLmNlcnRpZmljYXRlcyB3aGVyZSBuYW1lID0gJyR7SH1fY2VydCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERST1AgQ0VSVElGSUNBVEUgJHtIfV9jZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGIEVYSVNUUyhTRUxFQ1QgKiBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAbmFtZSBWQVJDSEFSKDI1NSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgVE9QIDEgYEBuYW1lID0gbmFtZSBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhFQyAoJ0RST1AgRU5EUE9JTlQgWycgKyBgQG5hbWUgKyAnXScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLmNlcnRpZmljYXRlcyB3aGVyZSBuYW1lID0gJyR7SH1fY2VydCcpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgQ0VSVElGSUNBVEUgJHtIfV9jZXJ0IFdJVEggU1VCSkVDVCA9ICcke0h9IGVuZHBvaW50IGNlcnRpZmljYXRlJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGIEVYSVNUUyhTRUxFQ1QgKiBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAbmFtZSBWQVJDSEFSKDI1NSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgVE9QIDEgYEBuYW1lID0gbmFtZSBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhFQyAoJ0RST1AgRU5EUE9JTlQgWycgKyBgQG5hbWUgKyAnXScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBCQUNLVVAgQ0VSVElGSUNBVEUgJHtIfV9jZXJ0IFRPIEZJTEUgPSAkKENvbnZlcnRUby1TUUxTdHJpbmcgIiRDZXJ0aWZpY2F0ZUZpbGVOYW1lIik7CiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAcG9ydCBpbnQKICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKFNFTEVDVCAqIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgYEBwb3J0ID0gcG9ydCBGUk9NIHN5cy50Y3BfZW5kcG9pbnRzIFdIRVJFIHR5cGVfZGVzYz0nREFUQUJBU0VfTUlSUk9SSU5HJwogICAgICAgICAgICAgICAgICAgICAgICBFTkQgRUxTRQogICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFIEVORFBPSU5UICQoQ29udmVydFRvLVNRTE5hbWUgJEVuZHBvaW50TmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFURSA9IFNUQVJURUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUyBUQ1AgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSVNURU5FUl9QT1JUID0gJFBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBMSVNURU5FUl9JUCA9IEFMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9SIERBVEFCQVNFX01JUlJPUklORyAoIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVVRIRU5USUNBVElPTiA9IENFUlRJRklDQVRFICR7SH1fY2VydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIEVOQ1JZUFRJT04gPSBSRVFVSVJFRCBBTEdPUklUSE0gQUVTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgUk9MRSA9IEFMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgYEBwb3J0ID0gJFBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECgogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgJ3BvcnQ6KCcgKyBDT05WRVJUKFZBUkNIQVIsIGBAcG9ydCkgKyAnKScgYXMgcG9ydAogICAgICAgICAgICAgICAgICAgICAgICBHTwoKICAgICAgICAgICAgICAgICAgICAgICAgIgoKICAgICRyYXdkYXRhID0gSW52b2tlLVNRTFRleHQgLVNRTCAkQ3JlYXRlTWFzdGVyS2V5CiAgICBbaW50XSRQb3J0ID0gJHJhd2RhdGEgLXJlcGxhY2UgJy4qcG9ydDpcKChbXildKilcKS4qJywgJyQxJwoKICAgICMgT3BlbiBwb3J0IGluIFdpbmRvd3MgRmlyZXdhbGwKCiAgICAkUG9ydE9wZW4gPSAkZmFsc2UKICAgICRSdWxlTmFtZSA9ICJEYXRhYmFzZU1pcnJvcmluZy1UQ1AtJFBvcnQiCiAgICBHZXQtTmV0RmlyZXdhbGxSdWxlIHwgRm9yZWFjaC1PYmplY3QgewogICAgICAgIGlmICgkXy5OYW1lIC1lcSAkUnVsZU5hbWUpIHsKICAgICAgICAgICAgJFBvcnRPcGVuID0gJHRydWUKICAgICAgICB9CiAgICB9CiAgICBpZiAoLW5vdCAkUG9ydE9wZW4pIHsKICAgICAgICAkRGlzcGxheU5hbWUgPSAiTVMgU1FMIERhdGFiYXNlIE1pcnJvcmluZyBFbmRwb2ludCBhdCBUQ1AgcG9ydCAkUG9ydCIKICAgICAgICBOZXctTmV0RmlyZXdhbGxSdWxlIC1OYW1lICRSdWxlTmFtZSAtRGlzcGxheU5hbWUgJERpc3BsYXlOYW1lIC1EZXNjcmlwdGlvbiAkRGlzcGxheU5hbWUgLVByb3RvY29sIFRDUCAtTG9jYWxQb3J0ICRQb3J0IC1FbmFibGVkIFRydWUgLVByb2ZpbGUgQW55IC1BY3Rpb24gQWxsb3cKICAgIH0KICAgICAKICAgIHJldHVybiAkUG9ydAp9CgpmdW5jdGlvbiBDb21wbGV0ZS1NaXJyb3JpbmdFbmRwb2ludCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDb21wbGV0ZXMgbWlycm9yaW5nIGVuZHBvaW50CgogICAgLkRFU0NSSVBUSU9OCiAgICBBbGxvd3MgaW5ib3VuZCBjb25uZWN0aW9ucyBmcm9tIHJlbW90ZSBob3N0CiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIsCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdExvZ2luLAogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3RVc2VyLAogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3RQYXNzd29yZAogICAgKQoKICAgICRGb2xkZXIgPSBHZXQtSXRlbSAkUmVtb3RlV29ya0RpcgogICAgJFJlbW90ZVdvcmtEaXIgPSAkRm9sZGVyLkZ1bGxOYW1lCgogICAgJEggPSAkUmVtb3RlSG9zdE5hbWUgLXJlcGxhY2UgJ1teQS1aYS16MC05X10nLCAnXycKCiAgICBpZiAoLW5vdCAkUmVtb3RlSG9zdExvZ2luKSB7CiAgICAgICAgJFJlbW90ZUhvc3RMb2dpbiA9ICIke0h9X2xvZ2luIgogICAgfQogICAgaWYgKC1ub3QgJFJlbW90ZUhvc3RVc2VyKSB7CiAgICAgICAgJFJlbW90ZUhvc3RVc2VyID0gIiR7SH1fdXNlciIKICAgIH0KICAgIGlmICgtbm90ICRSZW1vdGVIb3N0UGFzc3dvcmQpIHsKICAgICAgICAkUmVtb3RlSG9zdFBhc3N3b3JkID0gIiQoTmV3LVBhc3N3b3JkIDEwKWFBIzMiCiAgICB9CgogICAgJFNRTCA9ICAgICAgICAgICAgICJVU0UgbWFzdGVyOwoKICAgICAgICAgICAgICAgICAgICAgICAgSUYgTk9UIEVYSVNUUyhzZWxlY3QgKiBmcm9tIHN5cy5zcWxfbG9naW5zIHdoZXJlIG5hbWU9JChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZW1vdGVIb3N0TG9naW4pKQogICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFIExPR0lOICQoQ29udmVydFRvLVNRTE5hbWUgJFJlbW90ZUhvc3RMb2dpbikgV0lUSCBQQVNTV09SRCA9ICQoQ29udmVydFRvLVNRTFN0cmluZyAkUmVtb3RlSG9zdFBhc3N3b3JkKTsKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLnN5c3VzZXJzIHdoZXJlIG5hbWU9JChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZW1vdGVIb3N0VXNlcikpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgVVNFUiAkKENvbnZlcnRUby1TUUxOYW1lICRSZW1vdGVIb3N0VXNlcikgRk9SIExPR0lOICQoQ29udmVydFRvLVNRTE5hbWUgJFJlbW90ZUhvc3RMb2dpbik7CiAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBHTwoKICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLmNlcnRpZmljYXRlcyB3aGVyZSBuYW1lPScke0h9X3JlbW90ZV9jZXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIERST1AgQ0VSVElGSUNBVEUgJHtIfV9yZW1vdGVfY2VydAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBDRVJUSUZJQ0FURSAke0h9X3JlbW90ZV9jZXJ0IEFVVEhPUklaQVRJT04gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdFVzZXIpIEZST00gRklMRSA9ICQoQ29udmVydFRvLVNRTFN0cmluZyAiJFJlbW90ZVdvcmtEaXJcY2VydGlmaWNhdGUuY2VyIik7CiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBERUNMQVJFIGBAbmFtZSBWQVJDSEFSKDI1NSkKICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUIFRPUCAxIGBAbmFtZSA9IG5hbWUgRlJPTSBzeXMuZW5kcG9pbnRzIFdIRVJFIHR5cGVfZGVzYz0nREFUQUJBU0VfTUlSUk9SSU5HJwogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgJ25hbWU6KCcgKyBgQG5hbWUgKyAnKScgYXMgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAiCgogICAgJHJhd2RhdGEgPSBJbnZva2UtU1FMVGV4dCAtU1FMICRTUUwKICAgICRFbmRwb2ludE5hbWUgPSAkcmF3ZGF0YSAtcmVwbGFjZSAnLipuYW1lOlwoKFteKV0qKVwpLionLCAnJDEnCiAgICAkU1FMID0gICAgICAgICAgICAgIkdSQU5UIENPTk5FQ1QgT04gRU5EUE9JTlQ6OiQoQ29udmVydFRvLVNRTE5hbWUgJEVuZHBvaW50TmFtZSkgVE8gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdExvZ2luKSIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRTUUwpCn0KCmZ1bmN0aW9uIENvbXBsZXRlLVNRTE1pcnJvciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDb21wbGV0ZXMgY3JlYXRpb24gb2YgbWlycm9yZWQgU1FMIGRhdGFiYXNlCgogICAgLkRFU0NSSVBUSU9OCiAgICBUaGlzIGNtZGxldCBzaG91bGQgYmUgZmlyc3QgZXhlY3V0ZWQgb24gbWlycm9yIHNlcnZlciBhbmQgdGhlbiBvbiBwcmluY2lwYWwgc2VydmVyLgogICAgT3RoZXJ3aXNlIGl0IHdpbGwgZmFpbCAoaG93ZXZlciBpdCBtYXkgYmUgZXhlY3V0ZWQgYWdhaW4gd2l0aCBubyBoYXJtKS4KICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW0ludF0kUmVtb3RlUG9ydCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhYmFzZU5hbWUKICAgICkKCiAgICAkVXJsID0gIlRDUDovLyR7UmVtb3RlSG9zdE5hbWV9OiR7UmVtb3RlUG9ydH0iCiAgICAkQWx0ZXJEYiA9ICJBTFRFUiBEQVRBQkFTRSAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIFNFVCBQQVJUTkVSID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICRVcmwpOwogICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQWx0ZXJEYikKfQoKZnVuY3Rpb24gTmV3LVNRTERhdGFiYXNlIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgZW1wdHkgU1FMIGRhdGFiYXNlCgogICAgLkRFU0NSSVBUSU9OCiAgICBDcmVhdGVzIGVtcHR5IFNRTCBkYXRhYmFzZSB3aXRoIGRlZmF1bHQgc2V0dGluZ3MuIEZhaWxzIGluIGNhc2UgaXMgdGhlIGRhdGFiYXNlIGFscmVhZHkgZXhpc3RzLgoKICAgIC5QQVJBTUVURVIgRGF0YUJhc2VOYW1lCiAgICBEYXRhYmFzZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgbWRmRmlsZQogICAgTmFtZSBvZiB0aGUgTURGIChkYXRhKSBmaWxlLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZm9sbG93aW5nIHZhbHVlIGlzIHVzZWQ6CiAgICAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFce0RhdGFCYXNlUGF0aE5hbWV9Lm1kZiIKICAgIFdoZXJlIHtEYXRhQmFzZVBhdGhOYW1lfSBpcyBkYXRhYmFzZSBuYW1lIHdpdGggYWxsIGJ1dCBBLVosIGEteiwgMC05IGNoYXJhY3RlcnMKICAgIHJlcGxhY2VkIGJ5IHVuZGVyc2NvcmUuCgogICAgLlBBUkFNRVRFUiBEYXRhQmFzZU5hbWUKICAgIE5hbWUgb2YgdGhlIExERiAodHJhbnNhY3Rpb24gbG9nKSBmaWxlLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZm9sbG93aW5nIHZhbHVlIGlzIHVzZWQ6CiAgICAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFce0RhdGFCYXNlUGF0aE5hbWV9X2xvZy5tZGYiCiAgICBXaGVyZSB7RGF0YUJhc2VQYXRoTmFtZX0gaXMgZGF0YWJhc2UgbmFtZSB3aXRoIGFsbCBidXQgQS1aLCBhLXosIDAtOSBjaGFyYWN0ZXJzCiAgICByZXBsYWNlZCBieSB1bmRlcnNjb3JlLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhQmFzZU5hbWUsCiAgICAgICAgW1N0cmluZ10kbWRmRmlsZT0kbnVsbCwKICAgICAgICBbU3RyaW5nXSRsZGZGaWxlPSRudWxsCiAgICApCgogICAgJERhdGFCYXNlUGF0aE5hbWUgPSAkRGF0YUJhc2VOYW1lIC1yZXBsYWNlICdbXjAtOWEtekEtWl0nLCAnXycKICAgIGlmICgtbm90ICRtZGZGaWxlKSB7CiAgICAgICAgJG1kZkZpbGUgPSAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFcJHtEYXRhQmFzZVBhdGhOYW1lfS5tZGYiCiAgICB9CiAgICBpZiAoLW5vdCAkbGRmRmlsZSkgewogICAgICAgICRsZGZGaWxlID0gIkM6XFByb2dyYW0gRmlsZXNcTWljcm9zb2Z0IFNRTCBTZXJ2ZXJcTVNTUUwxMS5NU1NRTFNFUlZFUlxNU1NRTFxEQVRBXCR7RGF0YUJhc2VQYXRoTmFtZX1fbG9nLmxkZiIKICAgIH0KCiAgICAkTmV3RGF0YWJhc2UgPSAiCiAgICAgICAgQ1JFQVRFIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkKICAgICAgICAgICAgICAgIENPTlRBSU5NRU5UID0gTk9ORQogICAgICAgICAgICAgICAgT04gIFBSSU1BUlkgCiAgICAgICAgICAgICggTkFNRSA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgJERhdGFCYXNlTmFtZSksIEZJTEVOQU1FID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAkbWRmRmlsZSkgLCBTSVpFID0gNDA5NktCICwgRklMRUdST1dUSCA9IDEwMjRLQiApCiAgICAgICAgICAgICAgICBMT0cgT04gCiAgICAgICAgICAgICggTkFNRSA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiR7RGF0YUJhc2VOYW1lfV9sb2ciKSwgRklMRU5BTUUgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICRsZGZGaWxlKSAsIFNJWkUgPSAxMDI0S0IgLCBGSUxFR1JPV1RIID0gMTAlKQogICAgICAgIEdPCiAgICAgICAgVVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkKICAgICAgICBHTwogICAgICAgIElGIE5PVCBFWElTVFMgKFNFTEVDVCBuYW1lIEZST00gc3lzLmZpbGVncm91cHMgV0hFUkUgaXNfZGVmYXVsdD0xIEFORCBuYW1lID0gTidQUklNQVJZJykgQUxURVIgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBNT0RJRlkgRklMRUdST1VQIFtQUklNQVJZXSBERUZBVUxUCiAgICAgICAgR08iCgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJE5ld0RhdGFiYXNlKQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ1ByaW5jaXBhbFN0ZXAxIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIHByaW5jaXBhbCBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDEpCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbml0aWFsaXplcyBtaXJyb3JpbmcgZW5kcG9pbnQgKHRoaXMgaXMgYWJzb2x1dGVseSBzeW1tZXRyaWMgc3RlcCB0byB0aGUgbWlycm9yIGluaXQpLiBJbiBhZGRpdGlvbiB0byB0aGF0IGl0IGNyZWF0ZXMKICAgIGEgZGF0YWJhc2UgYW5kIHN0b3JlcyBiYWNrdXBzIG9mIGl0IGFuZCBpdHMgdHJhbnNhY3Rpb24gbG9nIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgZW5kcG9pbnQgY2VydGlmaWNhdGUuCgogICAgQSBmaXJld2FsbCBydWxlIGlzIGNyZWF0ZWQgZm9yIGVuZHBvaW50IGlmIG5lY2Vzc2FyeS4KCiAgICAuUEFSQU1FVEVSIFdvcmtEaXIKICAgIFdvcmtpbmQgZGlyZWN0b3J5LiBUaGlzIGRpcmVjdG9yeSBzaG91bGQgYmUgdHJhbmZlcnJlZCB0byB0aGUgbWlycm9yIHNlcnZlciBhZnRlciB0aGlzCiAgICBzdGVwIGlzIGV4ZWN1dGVkLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lCiAgICBNaXJyb3JlZCBkYXRhYmFzZSBuYW1lLiBUaGlzIG5hbWUgTVVTVCBiZSB1c2UgYXQgbWlycm9yIHNlcnZlciBlaXRoZXIuCiAgICAKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhQmFzZU5hbWUKICAgICkKCiAgICBbU3RyaW5nXSRFbmNyeXB0aW9uUGFzc3dvcmQgPSAiJChOZXctUGFzc3dvcmQgMTApYUEjMyIKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIFt2b2lkXShOZXctSXRlbSAtVHlwZSBEaXJlY3RvcnkgJFdvcmtEaXIpCiAgICB9CiAgICAkV29ya0RpciA9IChHZXQtSXRlbSAkV29ya0RpcikuRnVsbE5hbWUKICAgIGlmICgoR2V0LUNoaWxkSXRlbSAtUGF0aCAkV29ya0RpcikuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgdGhyb3cgIldvcmtpbmcgZGlyZWN0b3J5ICRXb3JrRGlyIGlzIG5vdCBlbXB0eSIKICAgIH0KCiAgICAkRW5kcG9pbnRQb3J0ID0gSW5pdGlhbGl6ZS1NaXJyb3JpbmdFbmRwb2ludCAkRW5jcnlwdGlvblBhc3N3b3JkICIkV29ya0RpclxjZXJ0aWZpY2F0ZS5jZXIiCiAgICAkRW5kcG9pbnRQb3J0IHwgU2V0LUNvbnRlbnQgIiRXb3JrRGlyXGVuZHBvaW50LXBvcnQudHh0IgogICAgTmV3LVNRTERhdGFiYXNlICREYXRhQmFzZU5hbWUKCiAgICAkQmFja3VwRGIgPSAiQkFDS1VQIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXFNvdXJjZS5iYWsiKSBXSVRIIE5PRk9STUFULCBJTklULCBOQU1FID0gTidGdWxsIERhdGFiYXNlIEJhY2t1cCcsIFNLSVAsIE5PUkVXSU5ELCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cERiKQogICAgJEJhY2t1cExvZyA9ICJCQUNLVVAgTE9HICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXFNvdXJjZV9sb2cuYmFrIikgV0lUSCBOT0ZPUk1BVCwgSU5JVCwgIE5BTUUgPSBOJ1RyYW5zYWN0aW9uIExvZyAgQmFja3VwJywgU0tJUCwgTk9SRVdJTkQsIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cExvZykKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1TUUxNaXJyb3JpbmdQcmluY2lwYWxTdGVwMiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBQcmVwYXJlcyBwcmluY2lwYWwgU1FMIFNlcnZlciBmb3IgZGF0YWJhc2UgbWlycm9yaW5nIChTdGFnZSAyKQoKICAgIC5ERVNDUklQVElPTgogICAgSW1wb3J0cyByZW1vdGUgc2VydmVyIGNlcnRpZmljYXRlIGFuZCBncmFudHMgaXQgd2l0aCBhY2Nlc3MgdG8gdGhlIG1pcnJvcmluZyBlbmRwb2ludC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZUhvc3ROYW1lCiAgICBSZW1vdGUgKG1pcnJvcikgaG9zdCBuYW1lLiBGUUROIGlzIHByZWZlcnJlZCwgYnV0IE5ldEJJT1MgbmFtZXMgYW5kIElQIGFkZHJlc3NlcyBhcmUgYWxzbyBhY2NlcHRlZC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZVdvcmtEaXIKICAgIFBhdGggdG8gYSBjb3B5IG9mIHdvcmtkaXIgb2J0YWluZWQgZnJvbSBtaXJyb3IgbWFjaGluZSBjcmVhdGVkIG9uIFN0YWdlIDEuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIKICAgICkKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRSZW1vdGVXb3JrRGlyKSkgewogICAgICAgIHRocm93ICJSZW1vdGUgd29yayBkaXIgJyRSZW1vdGVXb3JrRGlyJyB3YXMgbm90IGZvdW5kIgogICAgfQogICAgJFJlbW90ZVdvcmtEaXIgPSAoR2V0LUl0ZW0gJFJlbW90ZVdvcmtEaXIpLkZ1bGxOYW1lCgogICAgQ29tcGxldGUtTWlycm9yaW5nRW5kcG9pbnQgJFJlbW90ZUhvc3ROYW1lICRSZW1vdGVXb3JrRGlyCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nUHJpbmNpcGFsU3RlcDMgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgcHJpbmNpcGFsIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMykKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbXBsZXRlcyBtaXJyb3IgY3JlYXRpb24uIFRoaXMgc3RlcCBtdXN0IGJlIGdsb2JhbGx5IHRoZSBsYXN0IG9uZSBpbiBtaXJyb3IgY3JlYXRpb24gc2VxdWVuY2UuCgogICAgTm90ZSB0aGF0IHRoZSByZW1vdGUgaG9zdCBjZXJ0aWZpY2F0ZSBpcyB2YWxpZCBmcm9tIHRoZSB0aW1lIGl0IGlzIGNyZWF0ZWQgdGhlcmUuIFNvCiAgICB0aGlzIHN0ZXAgd2lsbCBmYWlsIGlmIHRoZXJlIGlzIG5vdGljYWJsZSBkaWZmZXJlbnQgaW4gdGltZSBsb2NhbCBhbmQgcmVtb3RlIG1hY2hpbmVzLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlSG9zdE5hbWUKICAgIFJlbW90ZSAocHJpbmNpcGFsKSBob3N0IG5hbWUuIEZRRE4gaXMgcHJlZmVycmVkLCBidXQgTmV0QklPUyBuYW1lcyBhbmQgSVAgYWRkcmVzc2VzIGFyZSBhbHNvIGFjY2VwdGVkLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlV29ya0RpcgogICAgUGF0aCB0byBhIGNvcHkgb2Ygd29ya2RpciBvYnRhaW5lZCBmcm9tIHByaW5jaXBhbCBtYWNoaW5lIGNyZWF0ZWQgb24gU3RhZ2UgMS4KCiAgICAuUEFSQU1FVEVSIERhdGFiYXNlTmFtZQogICAgTWlycm9yZWQgZGF0YWJhc2UgbmFtZS4gVGhpcyBuYW1lIE1VU1QgbWF0Y2ggcHJpbmNpcGFsIGRhdGFiYXNlIG5hbWUgYW5kIG5hbWUgcHJvdmlkZWQgb24gc3RlcCAxLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFiYXNlTmFtZQogICAgKQoKICAgIFtpbnRdJHBvcnQgPSBHZXQtQ29udGVudCAiJHtSZW1vdGVXb3JrRGlyfVxlbmRwb2ludC1wb3J0LnR4dCIKICAgIENvbXBsZXRlLVNRTE1pcnJvciAkUmVtb3RlSG9zdE5hbWUgJHBvcnQgJERhdGFiYXNlTmFtZQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ01pcnJvclN0ZXAxIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIG1pcnJvciBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlMSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluaXRpYWxpemVzIG1pcnJvcmluZyBlbmRwb2ludCBmb3IgbWlycm9yIHNlcnZlci4gU3RvcmVzIG1pcnJvcmluZyBlbmRwb2ludCBjZXJ0aWZpY2F0ZSBpbiBXb3JrZGlyLgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZCBkaXJlY3RvcnkuIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZSB0cmFuZmVycmVkIHRvIHRoZSBwcmluY2lwYWwgc2VydmVyIGFmdGVyIHRoaXMKICAgIHN0ZXAgaXMgZXhlY3V0ZWQuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIG1hdGNoIHByaW5jaXBhbCBkYXRhYmFzZSBuYW1lLgoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhYmFzZU5hbWUKICAgICkKCiAgICBbU3RyaW5nXSRFbmNyeXB0aW9uUGFzc3dvcmQgPSAiJChOZXctUGFzc3dvcmQgMTApYUEjMyIKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIFt2b2lkXShOZXctSXRlbSAtVHlwZSBEaXJlY3RvcnkgJFdvcmtEaXIpCiAgICB9CiAgICAkV29ya0RpciA9IChHZXQtSXRlbSAkV29ya0RpcikuRnVsbE5hbWUKCiAgICAkRW5kcG9pbnRQb3J0ID0gSW5pdGlhbGl6ZS1NaXJyb3JpbmdFbmRwb2ludCAkRW5jcnlwdGlvblBhc3N3b3JkICIkV29ya0RpclxjZXJ0aWZpY2F0ZS5jZXIiCiAgICAkRW5kcG9pbnRQb3J0IHwgU2V0LUNvbnRlbnQgIiRXb3JrRGlyXGVuZHBvaW50LXBvcnQudHh0Igp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ01pcnJvclN0ZXAyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIG1pcnJvciBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDIpCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbXBvcnRzIHJlbW90ZSBzZXJ2ZXIgY2VydGlmaWNhdGUgYW5kIGdyYW50cyBpdCB3aXRoIGFjY2VzcyB0byB0aGUgbWlycm9yaW5nIGVuZHBvaW50LgogICAgUmVzdG9yZXMgZGF0YWJhc2Ugb2J0YWluZWQgZnJvbSBwcmluY2lwYWwgYW5kIGxlYXZlcyBpdCBpbiAnUmVzdG9yaW5nJyBzdGF0ZS4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZUhvc3ROYW1lCiAgICBSZW1vdGUgKHByaW5jaXBhbCkgaG9zdCBuYW1lLiBGUUROIGlzIHByZWZlcnJlZCwgYnV0IE5ldEJJT1MgbmFtZXMgYW5kIElQIGFkZHJlc3NlcyBhcmUgYWxzbyBhY2NlcHRlZC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZVdvcmtEaXIKICAgIFBhdGggdG8gYSBjb3B5IG9mIHdvcmtkaXIgb2J0YWluZWQgZnJvbSBwcmluY2lwYWwgbWFjaGluZSBjcmVhdGVkIG9uIFN0YWdlIDEuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIG1hdGNoIHByaW5jaXBhbCBkYXRhYmFzZSBuYW1lLgoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhQmFzZU5hbWUKICAgICkKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRSZW1vdGVXb3JrRGlyKSkgewogICAgICAgIHRocm93ICJSZW1vdGUgd29yayBkaXIgJyRSZW1vdGVXb3JrRGlyJyB3YXMgbm90IGZvdW5kIgogICAgfQogICAgJFJlbW90ZVdvcmtEaXIgPSAoR2V0LUl0ZW0gJFJlbW90ZVdvcmtEaXIpLkZ1bGxOYW1lCgogICAgQ29tcGxldGUtTWlycm9yaW5nRW5kcG9pbnQgJFJlbW90ZUhvc3ROYW1lICRSZW1vdGVXb3JrRGlyCgogICAgJFJlc3RvcmVEYiA9ICJSRVNUT1JFIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgRlJPTSBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFJlbW90ZVdvcmtEaXJcU291cmNlLmJhayIpIFdJVEggRklMRSA9IDEsIE5PUkVDT1ZFUlksIE5PVU5MT0FELCBSRVBMQUNFLCBTVEFUUyA9IDUKICAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkUmVzdG9yZURiKQogICAgJFJlc3RvcmVMb2cgPSAiUkVTVE9SRSBMT0cgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBGUk9NIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkUmVtb3RlV29ya0RpclxTb3VyY2VfbG9nLmJhayIpIFdJVEggRklMRSA9IDEsIE5PUkVDT1ZFUlksIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgICBHTyIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlTG9nKQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ01pcnJvclN0ZXAzIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIG1pcnJvciBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDMpCgogICAgLkRFU0NSSVBUSU9OCiAgICBDb21wbGV0ZXMgbWlycm9yIGNyZWF0aW9uLiBUaGlzIHN0ZXAgbXVzdCBiZSBleGVjdXRlZCBzdHJpY3RseSBiZWZvcmUgc3ltbWV0cmljIHN0ZXAgb24gdGhlIHByaW5jaXBhbC4KCiAgICBOb3RlIHRoYXQgdGhlIHJlbW90ZSBob3N0IGNlcnRpZmljYXRlIGlzIHZhbGlkIGZyb20gdGhlIHRpbWUgaXQgaXMgY3JlYXRlZCB0aGVyZS4gU28KICAgIHRoaXMgc3RlcCB3aWxsIGZhaWwgaWYgdGhlcmUgaXMgbm90aWNhYmxlIGRpZmZlcmVudCBpbiB0aW1lIGxvY2FsIGFuZCByZW1vdGUgbWFjaGluZXMuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVIb3N0TmFtZQogICAgUmVtb3RlIChwcmluY2lwYWwpIGhvc3QgbmFtZS4gRlFETiBpcyBwcmVmZXJyZWQsIGJ1dCBOZXRCSU9TIG5hbWVzIGFuZCBJUCBhZGRyZXNzZXMgYXJlIGFsc28gYWNjZXB0ZWQuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVXb3JrRGlyCiAgICBQYXRoIHRvIGEgY29weSBvZiB3b3JrZGlyIG9idGFpbmVkIGZyb20gcHJpbmNpcGFsIG1hY2hpbmUgY3JlYXRlZCBvbiBTdGFnZSAxLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lCiAgICBNaXJyb3JlZCBkYXRhYmFzZSBuYW1lLiBUaGlzIG5hbWUgTVVTVCBtYXRjaCBwcmluY2lwYWwgZGF0YWJhc2UgbmFtZS4KCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kRGF0YWJhc2VOYW1lCiAgICApCgogICAgW2ludF0kcG9ydCA9IEdldC1Db250ZW50ICIke1JlbW90ZVdvcmtEaXJ9XGVuZHBvaW50LXBvcnQudHh0IgogICAgQ29tcGxldGUtU1FMTWlycm9yICRSZW1vdGVIb3N0TmFtZSAkcG9ydCAkRGF0YWJhc2VOYW1lCn0KCmZ1bmN0aW9uIEdldC1OZXh0RnJlZVBvcnQgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUmV0dXJucyBzcGVjaWZpZWQgZGVzaXJlZCBwb3J0IG9yIGNsb3Nlc3QgbmV4dCBvbmUgdW5vY2N1cGllZC4KCiAgICAuUEFSQU1FVEVSIFBvcnQKICAgIERlc2lyZWQgcG9ydCBudW1iZXIuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbaW50XSRQb3J0CiAgICApCiAgICAkT3BlblBvcnRzID0gbmV0c3RhdCAtYW9uIHwgc2VsZWN0LXN0cmluZyAnTElTVEVOSU5HJyB8IEZvcmVhY2gtT2JqZWN0IHsgKCgkXyAtcmVwbGFjZSAnXlxzKicsICcnIC1zcGxpdCAnXHMrJylbMV0gLXNwbGl0ICcuKjonKVsxXSB9IHwgU29ydC1PYmplY3QgfCBHZXQtVW5pcXVlCiAgICB3aGlsZSAoJE9wZW5Qb3J0cy5Db250YWlucygke1BvcnR9KSkgewogICAgICAgICRQb3J0ID0gJFBvcnQgKyAxCiAgICB9CiAgICByZXR1cm4gJFBvcnQKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1BbHdheXNPbiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbml0aWFsaXplcyBBbHdheXNPbiBjbHVzdGVyaW5nIG9uIGxvY2FsIFNRTCBzZXJ2ZXIgYW5kIGNyZWF0ZXMgQWx3YXlzT24gZW5kcG9pbnQgbGlzdGVuZXIuIFJldHVybnMgQWx3YXlzT24gZW5kcG9pbnQgcG9ydCBudW1iZXIuCgogICAgLkRFU0NSSVBUSU9OCiAgICBFbmFibGVzIEFsd2F5c09uIGNsdXN0ZXJpbmcgb24gbG9jYWwgU1FMIHNlcnZlci4gQ3JlYXRlcyBBbHdheXNPbiBUQ1AgZW5kcG9pbnQgb24gcG9ydCA1MDIyIG9yIGdyZWF0ZXIgaWYgdGhlIG9uZSBpcyBvY2N1cGllZC4gICAKICAgICM+CgogICAgaWYgKCEoVGVzdC1QYXRoIFNRTFNFUlZFUjpcKSkgewogICAgICAgIEltcG9ydC1Nb2R1bGUgc3FscHMKICAgIH0KICAgICRNYWNoaW5lTmFtZSA9IChHZXQtQ2hpbGRJdGVtIFNRTFNFUlZFUjpcU1FMKVswXS5QU0NoaWxkTmFtZQogICAgJEluc3RhbmNlTmFtZSA9IChHZXQtQ2hpbGRJdGVtIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZSkuUFNDaGlsZE5hbWUKICAgICRBbHdheXNPbkVuYWJsZWQgPSAoKEdldC1JdGVtIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lKSB8IHNlbGVjdCBJc0hhZHJFbmFibGVkKS5Jc0hhZHJFbmFibGVkCiAgICBpZiAoLW5vdCAkQWx3YXlzT25FbmFibGVkKSB7CiAgICAgICAgRW5hYmxlLVNxbEFsd2F5c09uIC1QYXRoICJTUUxTRVJWRVI6XFNRTFwkTWFjaGluZU5hbWVcJEluc3RhbmNlTmFtZSIgLUZvcmNlCiAgICB9CiAgICAkSW5zdGFuY2UgPSBHZXQtSXRlbSBTUUxTRVJWRVI6XFNRTFwkTWFjaGluZU5hbWVcJEluc3RhbmNlTmFtZQogICAgJGVuZHBvaW50ID0gJEluc3RhbmNlLkVuZHBvaW50c1siQWx3YXlzT25FbmRwb2ludCJdCiAgICBpZiAoLW5vdCAkZW5kcG9pbnQpIHsKICAgICAgICAkUG9ydCA9IEdldC1OZXh0RnJlZVBvcnQgNTAyMgogICAgICAgICRlbmRwb2ludCA9IE5ldy1TcWxIYWRyRW5kcG9pbnQgQWx3YXlzT25FbmRwb2ludCAtUG9ydCAkUG9ydCAtUGF0aCBTUUxTRVJWRVI6XFNRTFwkTWFjaGluZU5hbWVcJEluc3RhbmNlTmFtZQogICAgfSBlbHNlIHsKICAgICAgICAkUG9ydCA9ICRlbmRwb2ludC5Qcm90b2NvbC5UY3AuTGlzdGVuZXJQb3J0CiAgICB9IAogICAgaWYgKCRlbmRwb2ludC5FbmRwb2ludFN0YXRlIC1uZSAiU3RhcnRlZCIpIHsKICAgICAgICAkZW5kcG9pbnQuU3RhcnQoKQogICAgfSAgICAKICAgIHJldHVybiAkUG9ydAp9CgpmdW5jdGlvbiBOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIG5ldyBBbHdheXNPbiBhdmFpbGFiaWxpdHkgZ3JvdXAgb24gcHJpbWFyeSByZXBsaWNhLgoKICAgIC5ERVNDUklQVElPTgogICAgQ3JlYXRlcyBuZXcgQWx3YXlzT24gYXZhaWxhYmlsaXR5IGdyb3VwIG9uIHByaW1hcnkgcmVwbGljYS4KCiAgICAuUEFSQU1FVEVSIFdvcmtEaXIKICAgIFdvcmtpbmQgZGlyZWN0b3J5LiBUaGlzIGRpcmVjdG9yeSBzaG91bGQgYmUgdHJhbmZlcnJlZCB0byB0aGUgcmVwbGljYSBzZXJ2ZXIocykgYWZ0ZXIgdGhpcwogICAgc3RlcCBpcyBleGVjdXRlZC4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIEF2YWlsYWJpbGl0eSBncm91cCBuYW1lLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lcwogICAgUmVwbGljYSBkYXRhYmFzZShzKSBuYW1lcy4KCiAgICAuUEFSQU1FVEVSIFJlcGxpY2FEZWZzCiAgICBBcnJheSBvZiByZXBsaWNhIGRlZmluaXRpb24uIEVhY2ggZGVmaW5pdGlvbiBpcyBhIGhhc2ggdGFibGUgd2l0aCByZXBsaWNhLXNwZWNpZmljIHZhbHVlcy4KICAgIAogICAgTWFuZGF0b3J5IHJlcGxpY2EgZGVmaW5pdGlvbiB2YWx1ZXMgYXJlOgoKICAgICAgICAqIFtTdHJpbmddIFNFUlZFUl9JTlNUQU5DRSAgIC0gUmVwbGljYSBzZXJ2ZXIgaW5zdGFuY2UgbmFtZQogICAgICAgICogW1N0cmluZ10gRU5EUE9JTlRfVVJMICAgICAgLSBSZXBsaWNhIHNlcnZlciBlbmRwb2ludCBVUkwuIE5vcm1hbGx5IGl0IGlzIFRDUDovL2Z1bGx5LnF1YWxpZmllZC5kb21haW4ubmFtZTo1MDIyIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0IG51bWJlciBzaG91bGQgYmUgb2J0YWluZWQgd2l0aCBJbml0aWFsaXplLUFsd2F5c09uIGF0IHRoZSByZXBsaWNhIHNlcnZlcgogICAgICAgICogW1N0cmluZ10gQVZBSUxBQklMSVRZX01PREUgLSBSZXBsaWNhIGF2YWlsYWJpbGl0eSBtb2RlLiBDYW4gYmUgIlNZTkNIUk9OT1VTX0NPTU1JVCIgb3IgIkFTWU5DSFJPTk9VU19DT01NSVQiIG9ubHkuCiAgICAgICAgKiBbU3RyaW5nXSBGQUlMT1ZFUl9NT0RFICAgICAtIFJlcGxpY2EgYXZhaWxhYmlsaXR5IG1vZGUuIENhbiBiZSAiTUFOVUFMIiBvciAiQVVUT01BVElDIiBvbmx5LgoKICAgIE9wdGlvbmFsIHJlcGxpY2EgZGVmaW5pdGlvbiB2YWx1ZXMgYXJlOgoKICAgICAgICAqIFtJbnRlZ2VyXSBCQUNLVVBfUFJJT1JJVFkgICAgICAgICAgLSBCYWNrdXAgcHJpb3JpdHkKICAgICAgICAqIFtJbnRlZ2VyXSBTRVNTSU9OX1RJTUVPVVQgICAgICAgICAgLSBTZXNzaW9uIHRpbWVvdXQKICAgICAgICAqIFtTdHJpbmddICBQX0FMTE9XX0NPTk5FQ1RJT05TICAgICAgLSBBbGxvd2VkIGNvbm5lY3Rpb24gdHlwZXMgZm9yICJQcmltYXJ5IiByZXBsaWNhIG1vZGUuIENhbiBiZSAiUkVBRF9XUklURSIgb3IgIkFMTCIgb25seS4KICAgICAgICAqIFtBcnJheV0gICBQX1JFQURfT05MWV9ST1VUSU5HX0xJU1QgLSBMaXN0IG9mIHJlcGxpY2FzIHByb3ZpcmluZyByZWFkb25seSBhY2Nlc3Mgd2hlbiB0aGlzIG9uZSBpcyBwcmltYXJ5LgogICAgICAgICogW1N0cmluZ10gIFNfQUxMT1dfQ09OTkVDVElPTlMgICAgICAtIEFsbG93ZWQgY29ubmVjdGlvbiB0eXBlcyBmb3IgIlNlY29uZGFyeSIgcmVwbGljYSBtb2RlLiBDYW4gYmUgb25lIG9mICJOTyIsICJSRUFEX09OTFkiLCAiQUxMIi4KICAgICAgICAqIFtTdHJpbmddICBTX1JFQURfT05MWV9ST1VUSU5HX1VSTCAgLSBSZXBsaWNhIHJlYWQtb25seSByZXF1ZXN0cyBsaXN0ZW5lciBVUkwuIE5vcm1hbGx5IGRlZmF1bHQgc2VydmVyIGxpc3RlbmVyIGF0IHBvcnQgMTQzMyBpcyB1c2VkLgoKICAgIC5QQVJBTUVURVIgUHJlZmVyZW5jZXMKICAgIEhhc2ggdGFibGUgb2YgZ2VuZXJhbCBhdmFpbGFiaWxpdHkgZ3JvdXAgcHJlZmVyZW5jZXMuIEFsbCB0aGUga2V5cyBhcmUgb3B0aW9uYWwuIFN1cHBvcnRlZCBlbnRyeSBrZXlzIGFyZToKCiAgICAgICAgKiBbU3RyaW5nXSAgQVVUT01BVEVEX0JBQ0tVUF9QUkVGRVJFTkNFIC0gQXV0b21hdGVkIGJhY2t1cCBwcmVmZXJlbmNlLiBDYW4gYmUgIlBSSU1BUlkiLCAiU0VDT05EQVJZX09OTFkiLCAiU0VDT05EQVJZIiBvciAiTk9ORSIuCiAgICAgICAgKiBbU3RyaW5nXSAgRkFJTFVSRV9DT05ESVRJT05fTEVWRUwgICAgIC0gRmFpbHVyZSBjb25kaXRpb24gbGV2ZWwuIENhbiBiZSAiMSIsICIyIiwgIjMiLCAiNCIgb3IgIjUiLgogICAgICAgICogW0ludGVnZXJdIEhFQUxUSF9DSEVDS19USU1FT1VUICAgICAgICAtIFJlcGxpY2EgaGVhbHRoIGNoZWNrIHRpbWVvdXQuCgogICAgLlBBUkFNRVRFUiBMaXN0ZW5lckRlZgogICAgSGFzaCB0YWJsZSBjb250YWluaW5nIGF2YWlsYWJpbGl0eSBncm91cCBsaXN0ZW5lciBjb25maWd1cmF0aW9uLgoKICAgIE1hbmRhdG9yeSBsaXN0ZW5lciBjb25maWd1cmF0aW9uIHZhbHVlcyBhcmU6CgogICAgICAgIFtTdHJpbmddIE5BTUUgLSBMaXN0ZW5lciBuYW1lLgoKICAgIE9wdGlvbmFsIGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGFyZToKICAgIAogICAgICAgIFtTdHJpbmddIFBPUlQgLSBMaXN0ZW5lciBwb3J0IG51bWJlci4gSW50ZWdlciB2YWx1ZSBtYXkgYmUgc3VmZml4ZWQgYnkgYSAiKyIgc3ltb2wgKHN1Y2ggYXMgIjUwMjIrIikgd2hpY2ggYWxsb3dzIHRoZSByb3V0aW5lIHRvCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCBuZXh0IGZyZWUgcG9ydCB3aXRoIG51bWJlciBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCiAgICAgICAgW1N0cmluZ10gREhDUCAtIERIQ1AgbGlzdGVuZXIgYWRkcmVzcyBjb25maWd1cmF0aW9uIGZsYWcuIFdoZW4gYW55IHZhbHVlIHNwZWNpZmllZCwgREhDUCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSBsaXN0ZW5lcgogICAgICAgICAgICAgICAgICAgICAgICAodGhpcyBpcyBhbHNvIHRoZSBkZWZhdWx0IGJlaGF2aW9yKS4gQWxzbywgYSBzcGVjaWZpYyBpbnRlcmZhY2UgZm9yIERIQ1AgbWF5IGJlIHNwZWNpZmllZCBhcyBJUF9BRERSRVNTL01BU0sKICAgICAgICAgICAgICAgICAgICAgICAgKGxpa2UgIjE5Mi4xNjguMS4wLzI1NS4yNTUuMjU1LjAiKSBhcyBhIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIuCiAgICAgICAgW0FycmF5XSBTVEFUSUMgLSBTdGF0aWMgSVAgYWRkcmVzc2VzIHRvIGxpc3Rlbi4gSVAgYWRkcmVzc2VzIG1heSBiZSBJUHY0IGFkZHJlc3NlcyBpbiB0aGUgIklQX0FERFJFU1MvTUFTSyIgZm9ybSBvciBJUHY2CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NlcyBpbiBzdGFuZGFyZCBJUHY2IG5vdGF0aW9uLgoKICAgIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZmY4NzgzOTkuYXNweCBwYWdlIGZvciBtb3JlIGRldGFpbHMgcmVnYXJkaW5nIGFsbCB0aGUgc3VwcG9ydGVkIG9wdGlvbnMuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFdvcmtEaXIsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbQXJyYXldJERhdGFiYXNlTmFtZXMsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW0FycmF5XSRSZXBsaWNhRGVmcywKICAgICAgICBbcGFyYW1ldGVyXQogICAgICAgIFtIYXNodGFibGVdJFByZWZlcmVuY2VzLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtIYXNodGFibGVdJExpc3RlbmVyRGVmCiAgICApCgogICAgaWYgKC1ub3QgKFRlc3QtUGF0aCAkV29ya0RpcikpIHsKICAgICAgICBbdm9pZF0oTmV3LUl0ZW0gLVR5cGUgRGlyZWN0b3J5ICRXb3JrRGlyKQogICAgfQogICAgJFdvcmtEaXIgPSAoR2V0LUl0ZW0gJFdvcmtEaXIpLkZ1bGxOYW1lCiAgICBpZiAoKEdldC1DaGlsZEl0ZW0gLVBhdGggJFdvcmtEaXIpLkxlbmd0aCAtZ3QgMCkgewogICAgICAgIHRocm93ICJXb3JraW5nIGRpcmVjdG9yeSAkV29ya0RpciBpcyBub3QgZW1wdHkiCiAgICB9CgogICAgJFF1b3RlZERCTmFtZXMgPSAoJERhdGFiYXNlTmFtZXMgfCBGb3JFYWNoLU9iamVjdCB7IENvbnZlcnRUby1TUUxOYW1lICRfIH0pIC1qb2luICIsICIKCiAgICBpZiAoJFByZWZlcmVuY2VzIC1lcSAkbnVsbCkgewogICAgICAgICRQcmVmZXJlbmNlcyA9IEAoKQogICAgfQogICAgJFByZWZzID0gQCgpCiAgICBmb3JlYWNoKCRQcmVmIGluICRQcmVmZXJlbmNlcykgewogICAgICAgIGlmICgkUHJlZi5LZXkgLWVxICRudWxsKSB7CiAgICAgICAgICAgIENvbnRpbnVlCiAgICAgICAgfQogICAgICAgIGlmICgkUHJlZi5LZXkgLWVxICJBVVRPTUFURURfQkFDS1VQX1BSRUZFUkVOQ0UiKSB7CiAgICAgICAgICAgICRQcmVmcyA9ICRQcmVmcyArIChWYWxpZGF0ZS1PcHRpb24gJFByZWYuS2V5LCAkUHJlZi5WYWx1ZSwgQCgiUFJJTUFSWSIsICJTRUNPTkRBUllfT05MWSIsICJTRUNPTkRBUlkiLCAiTk9ORSIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgJFByZWYuS2V5KQogICAgICAgIH0gZWxzZWlmICgkUHJlZi5LZXkgLWVxICJGQUlMVVJFX0NPTkRJVElPTl9MRVZFTCIpIHsKICAgICAgICAgICAgJFByZWZzID0gJFByZWZzICsgKFZhbGlkYXRlLU9wdGlvbiAkUHJlZi5LZXksICRQcmVmLlZhbHVlLCBAKCIxIiwgIjIiLCAiMyIsICI0IiwgIjUiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICRQcmVmLktleSkKICAgICAgICB9IGVsc2VpZiAoJFByZWYuS2V5IC1lcSAiSEVBTFRIX0NIRUNLX1RJTUVPVVQiKSB7CiAgICAgICAgICAgICRQcmVmcyA9ICRQcmVmcyArIChWYWxpZGF0ZS1JbnRPcHRpb24gJFByZWYuS2V5LCAkUHJlZi5WYWx1ZSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICRQcmVmLktleSkKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyAiVW5leHBlY3RlZCBwZWZlcmVuY2VzIG9wdGlvbjogJyQoJFByZWYuS2V5KSciCiAgICAgICAgfQogICAgfQoKICAgICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSA9IEAoKQogICAgZm9yICgkaSA9IDA7ICRpIC1sdCAkUmVwbGljYURlZnMuTGVuZ3RoOyAkaSsrKSB7CiAgICAgICAgJFJEZWYgPSAkUmVwbGljYURlZnNbJGldCiAgICAgICAgaWYgKCRSRGVmLkdldFR5cGUoKS5OYW1lIC1uZSAiSGFzaHRhYmxlIikgewogICAgICAgICAgICB0aHJvdyAiQWxsIGVsZW1lbnRzIG9mIFJlcGxpY2FEZWZzIGFycmF5IHNob3VsZCBiZSBIYXNodGFibGVzIgogICAgICAgIH0KCiAgICAgICAgJFJlcGxpY2FPcHRzID0gQCgpCgogICAgICAgICMgTWFuZGF0b3J5IG9wdGlvbnMKICAgICAgICAkUmVwbGljYU5hbWUgPSBWYWxpZGF0ZS1EZWZpbmVkT3B0aW9uICJTRVJWRVJfSU5TVEFOQ0UiICRSRGVmWyJTRVJWRVJfSU5TVEFOQ0UiXQogICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1EZWZpbmVkT3B0aW9uICJFTkRQT0lOVF9VUkwiICRSRGVmWyJFTkRQT0lOVF9VUkwiXSB8IENvbnZlcnRUby1TUUxTdHJpbmcgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiRU5EUE9JTlRfVVJMIikKICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoVmFsaWRhdGUtT3B0aW9uICJBVkFJTEFCSUxJVFlfTU9ERSIgJFJEZWZbIkFWQUlMQUJJTElUWV9NT0RFIl0gQCgiU1lOQ0hST05PVVNfQ09NTUlUIiwgIkFTWU5DSFJPTk9VU19DT01NSVQiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJBVkFJTEFCSUxJVFlfTU9ERSIpCiAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLU9wdGlvbiAiRkFJTE9WRVJfTU9ERSIgJFJEZWZbIkZBSUxPVkVSX01PREUiXSBAKCJBVVRPTUFUSUMiLCAiTUFOVUFMIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiRkFJTE9WRVJfTU9ERSIpCgogICAgICAgICMgT3B0aW9uYWwgb3B0aW9ucwogICAgICAgIGlmICgkUkRlZlsiQkFDS1VQX1BSSU9SSVRZIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1JbnRPcHRpb24gIkJBQ0tVUF9QUklPUklUWSIgJFJEZWZbIkJBQ0tVUF9QUklPUklUWSJdIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkJBQ0tVUF9QUklPUklUWSIpCiAgICAgICAgfQogICAgICAgIGlmICgkUkRlZlsiU0VTU0lPTl9USU1FT1VUIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1JbnRPcHRpb24gIlNFU1NJT05fVElNRU9VVCIgJFJEZWZbIlNFU1NJT05fVElNRU9VVCJdIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIlNFU1NJT05fVElNRU9VVCIpCiAgICAgICAgfQoKICAgICAgICAkU2Vjb25kYXJ5Um9sZSA9IEAoKQogICAgICAgIGlmICgkUkRlZlsiU19BTExPV19DT05ORUNUSU9OUyJdIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkU2Vjb25kYXJ5Um9sZSA9ICRTZWNvbmRhcnlSb2xlICsgKFZhbGlkYXRlLU9wdGlvbiAiU19BTExPV19DT05ORUNUSU9OUyIgJFJEZWZbIlNfQUxMT1dfQ09OTkVDVElPTlMiXSBAKCJOTyIsICJSRUFEX09OTFkiLCAiQUxMIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFJEZWZbIlNfUkVBRF9PTkxZX1JPVVRJTkdfVVJMIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRTZWNvbmRhcnlSb2xlID0gJFNlY29uZGFyeVJvbGUgKyAoJFJEZWZbIlNfUkVBRF9PTkxZX1JPVVRJTkdfVVJMIl0gfCBDb252ZXJ0VG8tU1FMU3RyaW5nIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFMTE9XX0NPTk5FQ1RJT05TIikKICAgICAgICB9CiAgICAgICAgaWYgKCRTZWNvbmRhcnlSb2xlLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoIiggJCgkU2Vjb25kYXJ5Um9sZSAtam9pbiAnLCAnKSApIiB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJTRUNPTkRBUllfUk9MRSIpCiAgICAgICAgfQoKICAgICAgICAkUHJpbWFyeVJvbGUgPSBAKCkKICAgICAgICBpZiAoJFJEZWZbIlBfQUxMT1dfQ09OTkVDVElPTlMiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFByaW1hcnlSb2xlID0gJFByaW1hcnlSb2xlICsgKFZhbGlkYXRlLU9wdGlvbiAiUF9BTExPV19DT05ORUNUSU9OUyIgJFJEZWZbIlBfQUxMT1dfQ09OTkVDVElPTlMiXSBAKCJSRUFEX1dSSVRFIiwgIkFMTCIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFMTE9XX0NPTk5FQ1RJT05TIikKICAgICAgICB9CiAgICAgICAgaWYgKCRSRGVmWyJQX1JFQURfT05MWV9ST1VUSU5HX0xJU1QiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFByaW1hcnlSb2xlID0gJFByaW1hcnlSb2xlICsgKCgoJFJEZWZbIlBfUkVBRF9PTkxZX1JPVVRJTkdfTElTVCJdIHwgRm9yRWFjaC1PYmplY3QgeyBDb252ZXJ0VG8tU1FMU3RyaW5nICRfIH0pIC1qb2luICcsICcpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFMTE9XX0NPTk5FQ1RJT05TIikKICAgICAgICB9CiAgICAgICAgaWYgKCRQcmltYXJ5Um9sZS5MZW5ndGggLWd0IDApIHsKICAgICAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKCIoICQoJFByaW1hcnlSb2xlIC1qb2luICcsICcpICkiIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIlBSSU1BUllfUk9MRSIpCiAgICAgICAgfQoKICAgICAgICAkUmVwbGljYURlZmluaXRpb25zQXJyYXkgPSAkUmVwbGljYURlZmluaXRpb25zQXJyYXkgKwogICAgICAgICAgICAjICBUQ1A6Ly9icmF2by5tdXJhbm8ubG9jYWw6NTAyMgogICAgICAgICAgICAiTiQoQ29udmVydFRvLVNRTFN0cmluZyAkUmVwbGljYU5hbWUpIFdJVEggKCQoJFJlcGxpY2FPcHRzIC1qb2luICcsICcpKSIKICAgIH0KICAgICRSZXBsaWNhRGVmaW5pdGlvbnMgPSAkUmVwbGljYURlZmluaXRpb25zQXJyYXkgLWpvaW4gIixgcmBuICAgICAgICAiOwoKICAgIGlmICgkTGlzdGVuZXJEZWZbIkRIQ1AiXSAtbmUgJG51bGwpIHsKICAgICAgICBpZiAoJExpc3RlbmVyRGVmWyJESENQIl0ubWF0Y2hlcygiXGQrXGQrXGQrXGQrL1xkK1xkK1xkK1xkKyIpKSB7CiAgICAgICAgICAgICgkSXBBZGRyLCAkTWFzaykgPSAkTGlzdGVuZXJEZWZbIkRIQ1AiXSAtc3BsaXQgIi8iCiAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAiREhDUCBPTiAoICRJcEFkZHIsICRNYXNrICkiCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICJESENQIgogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgW2FycmF5XSRJUEFkZHJlc3NlcyA9ICRMaXN0ZW5lckRlZlsiU1RBVElDIl0KICAgICAgICBpZiAoKCRJUEFkZHJlc3NlcyAtZXEgJG51bGwpIC1vciAoJElQQWRkcmVzc2VzLkNvdW50IC1lcSAwKSkgewogICAgICAgICAgICAkTGlzdGVuZXJBZGRyID0gIkRIQ1AiCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJENvbnZlcnRlZE9wdHMgPSBAKCkKICAgICAgICAgICAgZm9yZWFjaCAoJElwT3B0aW9uIGluICRJUEFkZHJlc3NlcykgewogICAgICAgICAgICAgICAgIyBJUHY0CiAgICAgICAgICAgICAgICBpZiAoJElwT3B0aW9uIC1tYXRjaCAiXGQrXGQrXGQrXGQrL1xkK1xkK1xkK1xkKyIpIHsKICAgICAgICAgICAgICAgICAgICAoJElwQWRkciwgJE1hc2spID0gJElwT3B0aW9uIC1zcGxpdCAiLyIKICAgICAgICAgICAgICAgICAgICAkQ29udmVydGVkT3B0cyA9ICRDb252ZXJ0ZWRPcHRzICsgIiggJChDb252ZXJ0VG8tU1FMU3RyaW5nICRJcEFkZHIpLCAkKENvbnZlcnRUby1TUUxTdHJpbmcgJE1hc2spICkiCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICMgSVB2NgogICAgICAgICAgICAgICAgaWYgKCRJcE9wdGlvbiAtbWF0Y2ggIl4oKCg/PSg/Pi4qPzo6KSg/IS4qOjopKSkoOjopPyhbMC05QS1GXXsxLDR9Ojo/KXswLDV9fChbMC05QS1GXXsxLDR9Oil7Nn0pKFwyKFswLTlBLUZdezEsNH0oOjo/fCQpKXswLDJ9fCgoMjVbMC01XXwoMlswLTRdfDFcZHxbMS05XSk/XGQpKFwufCQpKXs0fXxbMC05QS1GXXsxLDR9OlswLTlBLUZdezEsNH0pKD88IVteOl06fFwuKVx6IikgewogICAgICAgICAgICAgICAgICAgICRDb252ZXJ0ZWRPcHRzID0gJENvbnZlcnRlZE9wdHMgKyAiKCAkKENvbnZlcnRUby1TUUxTdHJpbmcgJElwT3B0aW9uKSApIgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyAiTWFsZm9ybWVkIElQdjQvSVB2NiBhZGRyZXNzOiAkSXBPcHRpb24iCiAgICAgICAgICAgIH0KICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICJJUCAoICQoJENvbnZlcnRlZE9wdHMgLWpvaW4gJywgJykgKSIKICAgICAgICB9CiAgICB9CiAgICBpZiAoKCRMaXN0ZW5lckRlZlsiTkFNRSJdIC1lcSAkbnVsbCkgLW9yICgkTGlzdGVuZXJEZWZbIk5BTUUiXSAtbWF0Y2ggIl5ccyokIikpIHsKICAgICAgICB0aHJvdyAiTGlzdGVuZXIgbmFtZSBpcyByZXF1aXJlZCIKICAgIH0KICAgIGlmICgtbm90ICgkTGlzdGVuZXJEZWZbIk5BTUUiXSAtbWF0Y2ggIl5bQS1aYS16MC05XC5fXC1dKyQiKSkgewogICAgICAgIHRocm93ICJJbGxlZ2FsIGxpc3RlbmVyIG5hbWUuIEl0IGNhbiBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIGRhc2hlcyAoLSksIGFuZCBoeXBoZW5zIChfKSwgaW4gYW55IG9yZGVyLiIKICAgIH0KICAgICRQb3J0ID0gJG51bGwKICAgIGlmICgkTGlzdGVuZXJEZWZbIlBPUlQiXSAtbmUgJG51bGwpIHsKICAgICAgICBpZiAoJExpc3RlbmVyRGVmWyJQT1JUIl0gLW1hdGNoICJcZCtcKyIpIHsKICAgICAgICAgICAgJFN0YXJ0aW5nUG9ydCA9ICRMaXN0ZW5lckRlZlsiUE9SVCJdIC1yZXBsYWNlICJcKyIsICIiCiAgICAgICAgICAgICRQb3J0ID0gR2V0LU5leHRGcmVlUG9ydCAkU3RhcnRpbmdQb3J0CiAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAkTGlzdGVuZXJBZGRyICsgIiwgUE9SVCA9ICRQb3J0IgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkTGlzdGVuZXJEZWZbIlBPUlQiXSAtbWF0Y2ggIlxkKyIpIHsKICAgICAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAkTGlzdGVuZXJBZGRyICsgIiwgUE9SVCA9ICQoJExpc3RlbmVyRGVmWyJQT1JUIl0pIgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgIkludmFsaWQgcG9ydCB2YWx1ZTogJCgkTGlzdGVuZXJEZWZbIlBPUlQiXSkiCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAkTGlzdGVuZXIgPSAiTElTVEVORVIgJyQoJExpc3RlbmVyRGVmWyJOQU1FIl0pJyAoIFdJVEggJExpc3RlbmVyQWRkciApIgoKICAgICROYW1lIHwgT3V0LUZpbGUgIiRXb3JrRGlyXGF2Z3JvdXAubmFtZSIKICAgIAogICAgZm9yICgkaSA9IDA7ICRpIC1sdCAkRGF0YWJhc2VOYW1lcy5MZW5ndGg7ICRpKyspIHsKICAgICAgICAkRGF0YUJhc2VOYW1lID0gJERhdGFiYXNlTmFtZXNbJGldCiAgICAgICAgJERhdGFCYXNlTmFtZSB8IE91dC1GaWxlICIkV29ya0RpclxkYiRpLm5hbWUiCiAgICAgICAgTmV3LVNRTERhdGFiYXNlICREYXRhQmFzZU5hbWUKICAgICAgICAkQmFja3VwRGIgPSAiQkFDS1VQIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJGkuYmFrIikgV0lUSCBOT0ZPUk1BVCwgSU5JVCwgTkFNRSA9IE4nRnVsbCBEYXRhYmFzZSBCYWNrdXAnLCBTS0lQLCBOT1JFV0lORCwgTk9VTkxPQUQsIFNUQVRTID0gMTAKICAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cERiKQogICAgICAgICRCYWNrdXBMb2cgPSAiQkFDS1VQIExPRyAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIFRPIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkV29ya0RpclxkYiR7aX0ubG9nLmJhayIpIFdJVEggTk9GT1JNQVQsIElOSVQsICBOQU1FID0gTidUcmFuc2FjdGlvbiBMb2cgIEJhY2t1cCcsIFNLSVAsIE5PUkVXSU5ELCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEJhY2t1cExvZykKICAgIH0KICAgICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSA9IEAoKQogICAgaWYgKCRQcmVmcy5MZW5ndGggLWd0IDApIHsKICAgICAgICAkUHJlZnNMaW5lID0gIldJVEggKCAkKCRQcmVmcyAtam9pbiAnLCAnKSApIgogICAgfSBlbHNlIHsKICAgICAgICAkUHJlZnNMaW5lID0gIiIKICAgIH0KICAgICRTUUwgPSAiQ1JFQVRFIEFWQUlMQUJJTElUWSBHUk9VUCAkKENvbnZlcnRUby1TUUxOYW1lICROYW1lKSAkUHJlZnNMaW5lCiAgICAgICAgICAgICAgICBGT1IgREFUQUJBU0UgJFF1b3RlZERCTmFtZXMKICAgICAgICAgICAgICAgIFJFUExJQ0EgT05gcmBuICAgICAgICAkUmVwbGljYURlZmluaXRpb25zCiAgICAgICAgICAgICAgICAkTGlzdGVuZXI7CiAgICAiCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkU1FMKQogICAgcmV0dXJuICRQb3J0Cn0KCmZ1bmN0aW9uIE5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIEFsd2F5c09uIGF2YWlsYWJpbGl0eSBncm91cCBzZWNvbmRhcnkgcmVwbGljYQoKICAgIC5ERVNDUklQVElPTgogICAgQ3JlYXRlcyBBbHdheXNPbiBhdmFpbGFiaWxpdHkgZ3JvdXAgc2Vjb25kYXJ5IHJlcGxpY2EgYmFzZWQgb24gaW5mb3JtYXRpb24gcHJvdmlkZWQgdG8gYW5kIGJ5IE5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwLgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZyBkaXJlY3Rvcnkgd2hpY2ggd2FzIHRyYW5zZmVycmVkIGZyb20gdGhlIHByaW1hcnkgcmVwbGljYS4KICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRXb3JrRGlyCiAgICApCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIHRocm93ICJXb3JrIGRpciAnJFdvcmtEaXInIG5vdCBmb3VuZCIKICAgIH0KICAgICRXb3JrRGlyT2JqID0gR2V0LUl0ZW0gLVBhdGggJFdvcmtEaXIKICAgICRXb3JrRGlyID0gJFdvcmtEaXJPYmouRnVsbE5hbWUKICAgICRHcm91cE5hbWUgPSBHZXQtQ29udGVudCAkV29ya0Rpck9iai5HZXRGaWxlcygiYXZncm91cC5uYW1lIikuRnVsbE5hbWUKCiAgICAkSm9pbkdyb3VwID0gIkFMVEVSIEFWQUlMQUJJTElUWSBHUk9VUCAkKENvbnZlcnRUby1TUUxOYW1lICRHcm91cE5hbWUpIEpPSU4KICAgICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEpvaW5Hcm91cCkKCiAgICBmb3IgKCRpID0gMDsgOyAkaSsrKSB7CiAgICAgICAgJEZpbGUgPSAkV29ya0Rpck9iai5HZXRGaWxlcygiZGIkaS5uYW1lIikKICAgICAgICBpZiAoLW5vdCAkRmlsZSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgJERhdGFCYXNlTmFtZSA9IEdldC1Db250ZW50ICRXb3JrRGlyT2JqLkdldEZpbGVzKCJkYiRpLm5hbWUiKS5GdWxsTmFtZQogICAgICAgICRSZXN0b3JlRGIgPSAiUkVTVE9SRSBEQVRBQkFTRSAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIEZST00gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJGkuYmFrIikgV0lUSCBGSUxFID0gMSwgTk9SRUNPVkVSWSwgTk9VTkxPQUQsIFJFUExBQ0UsIFNUQVRTID0gNQogICAgICAgICAgICAgICAgICAgIEdPIgogICAgICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlRGIpCiAgICAgICAgJFJlc3RvcmVMb2cgPSAiUkVTVE9SRSBMT0cgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBGUk9NIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkV29ya0RpclxkYiRpLmxvZy5iYWsiKSBXSVRIIEZJTEUgPSAxLCBOT1JFQ09WRVJZLCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgICAgIEdPIgogICAgICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlTG9nKQogICAgICAgICRBbHRlckRCID0gIkFMVEVSIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgU0VUIEhBRFIgQVZBSUxBQklMSVRZIEdST1VQID0gJChDb252ZXJ0VG8tU1FMTmFtZSAkR3JvdXBOYW1lKQogICAgICAgICAgICAgICAgICAgIEdPIgogICAgICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRBbHRlckRCKQogICAgfQp9CgpmdW5jdGlvbiBOZXctUmVwbGljYU9wdGlvbiB7CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUsIFZhbHVlRnJvbVBpcGVsaW5lID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFZhbHVlCiAgICApCiAgICByZXR1cm4gIiROYW1lID0gJFZhbHVlIgp9CgpmdW5jdGlvbiBWYWxpZGF0ZS1PcHRpb24gewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIG9uZSBvZiBhbGxvd2VkIHZhbHVlcwoKICAgIC5ERVNDUklQVElPTgogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIG9uZSBvZiBhbGxvd2VkIHZhbHVlcyBvciB0aHJvd3MgZXhjZXB0aW9uIG90aGVyd2lzZS4gUmV0dXJucyBwcm92aWRlZCB2YWx1ZS4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lLiBVc2VkIG9ubHkgZm9yIGVycm9yIG1lc3NhZ2UuCgogICAgLlBBUkFNRVRFUiBWYWx1ZQogICAgT3B0aW9uIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgQWxsb3dlZAogICAgTGlzdCBvZiBhbGxvd2VkIG9wdGlvbiB2YWx1cy4KICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSROYW1lLAogICAgICAgIFtTdHJpbmddJFZhbHVlLAogICAgICAgIFtBcnJheV0kQWxsb3dlZAogICAgKQogICAgaWYgKCgkVmFsdWUgLWVxICRudWxsKSAtb3IgKCRWYWx1ZSAtZXEgIiIpKSB7CiAgICAgICAgdGhyb3cgIk5vIHZhbHVlIHdhcyBwcm92aWRlZCBmb3IgJE5hbWUiCiAgICB9CiAgICBmb3JlYWNoICgkViBpbiAkQWxsb3dlZCkgewogICAgICAgIGlmICgkViAtZXEgJFZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiAkVmFsdWUKICAgICAgICB9CiAgICB9CiAgICB0aHJvdyAiUHJvdmlkZWQgdmFsdWUgJyRWYWx1ZScgZm9yICROYW1lIGlzIG5vdCBvbmUgb2YgJCgkQWxsb3dlZCAtam9pbiAnLCAnKSIKfQoKZnVuY3Rpb24gVmFsaWRhdGUtSW50T3B0aW9uIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBpbnRlZ2VyCgogICAgLkRFU0NSSVBUSU9OCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgaW50ZWdlci4gUmV0dXJucyBwcm92aWRlZCB2YWx1ZS4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lLiBVc2VkIG9ubHkgZm9yIGVycm9yIG1lc3NhZ2UuCgogICAgLlBBUkFNRVRFUiBWYWx1ZQogICAgT3B0aW9uIHZhbHVlLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcl0KICAgICAgICBbU3RyaW5nXSRWYWx1ZQogICAgKQogICAgaWYgKCgkVmFsdWUgLWVxICRudWxsKSAtb3IgKCRWYWx1ZSAtZXEgIiIpKSB7CiAgICAgICAgdGhyb3cgIk5vIHZhbHVlIHdhcyBwcm92aWRlZCBmb3IgJE5hbWUiCiAgICB9CiAgICBpZiAoLW5vdCAoIiRWYWx1ZSIgLW1hdGNoICJeWystXT9cZCskIikpIHsKICAgICAgICB0aHJvdyAiUHJvdmlkZWQgdmFsdWUgJyRWYWx1ZScgZm9yICROYW1lIGlzIG5vdCBhIG51bWJlciIKICAgIH0KICAgIHJldHVybiAkVmFsdWUKfQoKZnVuY3Rpb24gVmFsaWRhdGUtRGVmaW5lZE9wdGlvbiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgbm90IG51bGwKCiAgICAuREVTQ1JJUFRJT04KICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBub3QgbnVsbC4gUmV0dXJucyBwcm92aWRlZCB2YWx1ZS4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lLiBVc2VkIG9ubHkgZm9yIGVycm9yIG1lc3NhZ2UuCgogICAgLlBBUkFNRVRFUiBWYWx1ZQogICAgT3B0aW9uIHZhbHVlLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkZmFsc2UpXQogICAgICAgIFtTdHJpbmddJFZhbHVlCiAgICApCiAgICBpZiAoKCRWYWx1ZSAtZXEgJG51bGwpIC1vciAoJFZhbHVlIC1lcSAiIikpIHsKICAgICAgICB0aHJvdyAiTm8gdmFsdWUgd2FzIHByb3ZpZGVkIGZvciAkTmFtZSIKICAgIH0KICAgIHJldHVybiAkVmFsdWUKfQoKCiNFeHBvcnQtTW9kdWxlTWVtYmVyIC1GdW5jdGlvbiBOZXctU1FMU2VydmVyCiNFeHBvcnQtTW9kdWxlTWVtYmVyIC1GdW5jdGlvbiBOZXctU1FMU2VydmVyRm9yQU9BRwojRXhwb3J0LU1vZHVsZU1lbWJlciAtRnVuY3Rpb24gUmVtb3ZlLVNRTFNlcnZlcgojRXhwb3J0LU1vZHVsZU1lbWJlciAtRnVuY3Rpb24gSW52b2tlLVNRTFRleHQKI0V4cG9ydC1Nb2R1bGVNZW1iZXIgLUZ1bmN0aW9uIEluaXRpYWxpemUtTWlycm9yaW5nRW5kcG9pbnQKI0V4cG9ydC1Nb2R1bGVNZW1iZXIgLUZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nUHJpbmNpcGFsU3RlcDEKI0V4cG9ydC1Nb2R1bGVNZW1iZXIgLUZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDEKI0V4cG9ydC1Nb2R1bGVNZW1iZXIgLUZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nUHJpbmNpcGFsU3RlcDIKI0V4cG9ydC1Nb2R1bGVNZW1iZXIgLUZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDIKI0V4cG9ydC1Nb2R1bGVNZW1iZXIgLUZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nUHJpbmNpcGFsU3RlcDMKI0V4cG9ydC1Nb2R1bGVNZW1iZXIgLUZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDMKI0V4cG9ydC1Nb2R1bGVNZW1iZXIgLUZ1bmN0aW9uIEluc3RhbGwtU1FMU2VydmVyRm9yU3lzUHJlcAojRXhwb3J0LU1vZHVsZU1lbWJlciAtRnVuY3Rpb24gQ29tcGxldGUtU1FMU2VydmVyQWZ0ZXJTeXNQcmVwCiNFeHBvcnQtTW9kdWxlTWVtYmVyIC1GdW5jdGlvbiBJbml0aWFsaXplLUFsd2F5c09uCiNFeHBvcnQtTW9kdWxlTWVtYmVyIC1GdW5jdGlvbiBOZXctQWx3YXlzT25BdmFpbGFiaWxpdHlHcm91cAojRXhwb3J0LU1vZHVsZU1lbWJlciAtRnVuY3Rpb24gTmV3LUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXBSZXBsaWNhCg==", + "RnVuY3Rpb24gSW5zdGFsbC1TcWxTZXJ2ZXIgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICRTZXR1cFJvb3QgPSAnJywKICAgICAgICBbU3RyaW5nXSAkU0FQYXNzd29yZCA9ICcnLAogICAgICAgIFtTdHJpbmddICRNdXJhbm9GaWxlU2hhcmUgPSAnJywKICAgICAgICBbQm9vbGVhbl0gJE1peGVkTW9kZUF1dGggPSAkZmFsc2UKICAgICkKICAgIAogICAgaWYgKCRTZXR1cFJvb3QgLWVxICcnKSB7CiAgICAgICAgaWYgKCRNdXJhbm9GaWxlU2hhcmUgLWVxICcnKSB7CiAgICAgICAgICAgICRNdXJhbm9GaWxlU2hhcmUgPSBbRW52aXJvbm1lbnRdOjpHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCdNdXJhbm9GaWxlU2hhcmUnKQogICAgICAgICAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAgICAgICAgIHRocm93KCJVbmFibGUgdG8gZmluZCBNdXJhbm9GaWxlU2hhcmUgcGF0aC4iKQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgICRTZXR1cFJvb3QgPSBbSU8uUGF0aF06OkNvbWJpbmUoJE11cmFub0ZpbGVTaGFyZSwgJ1ByZXJlcXVpc2l0ZXNcU1FMIFNlcnZlclwyMDEyJykKICAgIH0KICAgIAoKICAgICRFeHRyYU9wdGlvbnMgPSBAe30KICAgIAogICAgaWYgKCRNaXhlZE1vZGVBdXRoKSB7CiAgICAgICAgJEV4dHJhT3B0aW9ucyArPSBAeydTRUNVUklUWU1PREUnID0gJ1NRTCd9CiAgICB9CiAgICAKICAgIGlmICgkU0FQYXNzd29yZCAtbmUgJycpIHsKICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1NBUFdEJyA9ICRTQVBhc3N3b3JkfQogICAgfQogICAgCiAgICBOZXctU3FsU2VydmVyIC1TZXR1cFJvb3QgJFNldHVwUm9vdCAtRXh0cmFPcHRpb25zICRFeHRyYU9wdGlvbnMKfQo=" + ] +} \ No newline at end of file diff --git a/data/workflows/MsSqlServer.xml b/data/workflows/MsSqlServer.xml new file mode 100644 index 0000000..bd1bb88 --- /dev/null +++ b/data/workflows/MsSqlServer.xml @@ -0,0 +1,100 @@ + + + + + Creating instance ) + + + + + + + + + + + + + m1.medium + ws-2012-full + + + + + + Instance ) created + + + + + + + + + + + + + + + + + + + + + + + ( + + + + + + + MS SQL Server ) has started + + + + + + \ No newline at end of file