<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>OneTimeAuthentificationLink</Name>
    <Version>10.1.4</Version>
    <Vendor>Rother OSS GmbH</Vendor>
    <URL>https://otobo.io/</URL>
    <License>GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007</License>
    <ChangeLog Date="2026-07-22 08:52:30" Version="10.1.4">Update to OTOBO 10.1.18.</ChangeLog>
    <ChangeLog Date="2025-02-26 14:05:52" Version="10.1.3">Update to OTOBO 10.1.12.</ChangeLog>
    <ChangeLog Date="2022-09-22 08:44:36" Version="10.1.2">Update Framework.</ChangeLog>
    <ChangeLog Date="2022-09-22 06:25:18" Version="10.1.1">Update to OTOBO 10.1.</ChangeLog>
    <Description Lang="en">Automatically creates customer users and gives them access via one time authentification tokens.</Description>
    <Framework>10.1.x</Framework>
    <BuildCommitID>f3d5f5a4ff8fc5f40dc8c3fefca449d042889746</BuildCommitID>
    <BuildDate>2026-07-22 08:52:34</BuildDate>
    <BuildHost>opms.rother-oss.com</BuildHost>
    <Filelist>
        <File Location="Custom/Kernel/System/CustomerAuth.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBmZjllMjk3YmFmMjg3ZTE2MDcxZDNhYzZhZDdmNmMxM2YxMWFjN2ZhIC0gS2VybmVsL1N5c3RlbS9DdXN0b21lckF1dGgucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJBdXRoOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtTWFpbnRlbmFuY2UnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpDdXN0b21lckF1dGggLSBjdXN0b21lciBhdXRoZW50aWNhdGlvbiBtb2R1bGUuCgo9aGVhZDEgREVTQ1JJUFRJT04KClRoZSBhdXRoZW50aWNhdGlvbiBtb2R1bGUgZm9yIHRoZSBjdXN0b21lciBpbnRlcmZhY2UuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWhlYWQyIG5ldygpCgpEb24ndCB1c2UgdGhlIGNvbnN0cnVjdG9yIGRpcmVjdGx5LCB1c2UgdGhlIE9iamVjdE1hbmFnZXIgaW5zdGVhZDoKCiAgICBteSAkQ3VzdG9tZXJBdXRoT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQXV0aCcpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJE1haW5PYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGxvYWQgYXV0aCBtb2R1bGVzCiAgICBDT1VOVDoKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyOjpBdXRoTW9kdWxlJENvdW50Iik7CgogICAgICAgIG5leHQgQ09VTlQgaWYgISRHZW5lcmljTW9kdWxlOwoKICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkgKSB7CiAgICAgICAgICAgICRNYWluT2JqZWN0LT5EaWUoIkNhbid0IGxvYWQgYmFja2VuZCBtb2R1bGUgJEdlbmVyaWNNb2R1bGUhICRAIik7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+eyJBdXRoQmFja2VuZCRDb3VudCJ9ID0gJEdlbmVyaWNNb2R1bGUtPm5ldyggJXskU2VsZn0sIENvdW50ID0+ICRDb3VudCApOwogICAgfQoKICAgICMgbG9hZCAyZmFjdG9yIGF1dGggbW9kdWxlcwogICAgQ09VTlQ6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CgogICAgICAgIG15ICRHZW5lcmljTW9kdWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lcjo6QXV0aFR3b0ZhY3Rvck1vZHVsZSRDb3VudCIpOwoKICAgICAgICBuZXh0IENPVU5UIGlmICEkR2VuZXJpY01vZHVsZTsKCiAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpICkgewogICAgICAgICAgICAkTWFpbk9iamVjdC0+RGllKCJDYW4ndCBsb2FkIGJhY2tlbmQgbW9kdWxlICRHZW5lcmljTW9kdWxlISAkQCIpOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPnsiQXV0aFR3b0ZhY3RvckJhY2tlbmQkQ291bnQifSA9ICRHZW5lcmljTW9kdWxlLT5uZXcoICV7JFNlbGZ9LCBDb3VudCA9PiAkQ291bnQgKTsKICAgIH0KCiAgICAjIEluaXRpYWxpemUgbGFzdCBlcnJvciBtZXNzYWdlCiAgICAkU2VsZi0+e0xhc3RFcnJvck1lc3NhZ2V9ID0gJyc7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgR2V0T3B0aW9uKCkKCkdldCBtb2R1bGUgb3B0aW9ucy4gQ3VycmVudGx5IHRoZXJlIGlzIGp1c3Qgb25lIG9wdGlvbiwgIlByZUF1dGgiLgoKICAgIGlmICggJEF1dGhPYmplY3QtPkdldE9wdGlvbiggV2hhdCA9PiAnUHJlQXV0aCcgKSApIHsKICAgICAgICBwcmludCAiTm8gbG9naW4gc2NyZWVuIGlzIG5lZWRlZC4gQXV0aGVudGljYXRpb24gaXMgYmFzZWQgb24gc29tZSBvdGhlciBvcHRpb25zLiBFLiBnLiAkRU5We1JFTU9URV9VU0VSfVxuIjsKICAgIH0KCj1jdXQKCnN1YiBHZXRPcHRpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJFNlbGYtPntBdXRoQmFja2VuZH0tPkdldE9wdGlvbiglUGFyYW0pOwp9CgojIFJvdGhlciBPU1MgLyBPbmVUaW1lQXV0aGVudGljYXRpb25MaW5rCj1oZWFkMiBFeHRlbmRlZFBhcmFtTmFtZXMoKQoKR2V0IG5hbWVzIG9mIGV4dGVuZGVkIHBhcmFtcyB3aGljaCBwcm92aWRlIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uCgogICAgbXkgQFBhcmFtTmFtZXMgPSAkQXV0aE9iamVjdC0+RXh0ZW5kZWRQYXJhbU5hbWVzKCk7Cgo9Y3V0CgpzdWIgRXh0ZW5kZWRQYXJhbU5hbWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJU5hbWVzOwogICAgQ09VTlQ6CiAgICBmb3IgKCAnJywgMSAuLiAxMCApIHsKICAgICAgICBuZXh0IENPVU5UIGlmICEkU2VsZi0+eyJBdXRoQmFja2VuZCRfIn07CiAgICAgICAgbmV4dCBDT1VOVCBpZiAhJFNlbGYtPnsiQXV0aEJhY2tlbmQkXyJ9LT5jYW4oJ0V4dGVuZGVkUGFyYW1OYW1lcycpOwoKICAgICAgICBmb3IgbXkgJEV4dE5hbWUgKCAkU2VsZi0+eyJBdXRoQmFja2VuZCRfIn0tPkV4dGVuZGVkUGFyYW1OYW1lcygpICkgewogICAgICAgICAgICAkTmFtZXN7JEV4dE5hbWV9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICgga2V5cyAlTmFtZXMgKTsKfQojIEVPIE9uZVRpbWVBdXRoZW50aWNhdGlvbkxpbmsKCj1oZWFkMiBBdXRoKCkKClRoZSBhdXRoZW50aWNhdGlvbiBmdW5jdGlvbi4KCiAgICBpZiAoICRBdXRoT2JqZWN0LT5BdXRoKCBVc2VyID0+ICRVc2VyLCBQdyA9PiAkUHcgKSApIHsKICAgICAgICBwcmludCAiQXV0aCBvayFcbiI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBwcmludCAiQXV0aCBpbnZhbGlkIVxuIjsKICAgIH0KCj1jdXQKCnN1YiBBdXRoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY3VzdG9tZXIgdXNlciBvYmplY3QKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIHVzZSBhbGwgMTEgYXV0aCBiYWNrZW5kcyBhbmQgcmV0dXJuIG9uIGZpcnN0IHRydWUKICAgIG15ICRVc2VyOwogICAgQ09VTlQ6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CgogICAgICAgICMgbmV4dCBvbiBubyBjb25maWcgc2V0dGluZwogICAgICAgIG5leHQgQ09VTlQgaWYgISRTZWxmLT57IkF1dGhCYWNrZW5kJENvdW50In07CgogICAgICAgICMgY2hlY2sgYXV0aCBiYWNrZW5kCiAgICAgICAgJFVzZXIgPSAkU2VsZi0+eyJBdXRoQmFja2VuZCRDb3VudCJ9LT5BdXRoKCVQYXJhbSk7CgojIFJvdGhlciBPU1MgLyBPbmVUaW1lQXV0aGVudGljYXRpb25MaW5rCiAgICAgICAgaWYgKCByZWYgJFVzZXIgJiYgcmVmICRVc2VyIGVxICdIQVNIJyAmJiAkVXNlci0+e0Vycm9yfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXN0RXJyb3JNZXNzYWdlfSA9ICRVc2VyLT57RXJyb3J9OwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQojIEVPIE9uZVRpbWVBdXRoZW50aWNhdGlvbkxpbmsKCiAgICAgICAgIyBuZXh0IG9uIG5vIHN1Y2Nlc3MKICAgICAgICBpZiAoICEkVXNlciApIHsKCiAgICAgICAgICAgICMgZ2V0IGVycm9yIG1lc3NhZ2Ugb2YgYXV0aCBiYWNrZW5kIGlmIHByZXNlbnQKICAgICAgICAgICAgaWYgKCAkU2VsZi0+eyJBdXRoQmFja2VuZCRDb3VudCJ9LT57QXV0aEVycm9yfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGFzdEVycm9yTWVzc2FnZX0gPSAkU2VsZi0+eyJBdXRoQmFja2VuZCRDb3VudCJ9LT57QXV0aEVycm9yfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBDT1VOVDsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgMmZhY3RvciBhdXRoIGJhY2tlbmRzCiAgICAgICAgbXkgJFR3b0ZhY3RvckF1dGg7CiAgICAgICAgVFdPRkFDVE9SU09VUkNFOgogICAgICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgICAgICMgcmV0dXJuIG9uIG5vIGNvbmZpZyBzZXR0aW5nCiAgICAgICAgICAgIG5leHQgVFdPRkFDVE9SU09VUkNFIGlmICEkU2VsZi0+eyJBdXRoVHdvRmFjdG9yQmFja2VuZCRDb3VudCJ9OwoKICAgICAgICAgICAgIyAyZmFjdG9yIGJhY2tlbmQKICAgICAgICAgICAgbXkgJEF1dGhPayA9ICRTZWxmLT57IkF1dGhUd29GYWN0b3JCYWNrZW5kJENvdW50In0tPkF1dGgoCiAgICAgICAgICAgICAgICBUd29GYWN0b3JUb2tlbiA9PiAkUGFyYW17VHdvRmFjdG9yVG9rZW59LAogICAgICAgICAgICAgICAgVXNlciAgICAgICAgICAgPT4gJFVzZXIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRUd29GYWN0b3JBdXRoID0gJEF1dGhPayA/ICdwYXNzZWQnIDogJ2ZhaWxlZCc7CgogICAgICAgICAgICBsYXN0IFRXT0ZBQ1RPUlNPVVJDRSBpZiAkQXV0aE9rOwogICAgICAgIH0KCiAgICAgICAgIyBpZiBhdCBsZWFzdCBvbmUgMmZhY3RvciBhdXRoIGJhY2tlbmQgd2FzIGNoZWNrZWQgYnV0IG5vbmUgd2FzIHN1Y2Nlc3NmdWwsCiAgICAgICAgIyBpdCBjb3VudHMgYXMgYSBmYWlsZWQgbG9naW4KICAgICAgICBpZiAoICRUd29GYWN0b3JBdXRoICYmICRUd29GYWN0b3JBdXRoIG5lICdwYXNzZWQnICkgewogICAgICAgICAgICAkVXNlciA9IHVuZGVmOwogICAgICAgICAgICBsYXN0IENPVU5UOwogICAgICAgIH0KCiAgICAgICAgIyByZW1lbWJlciBhdXRoIGJhY2tlbmQKICAgICAgICBpZiAoJFVzZXIpIHsKICAgICAgICAgICAgJEN1c3RvbWVyVXNlck9iamVjdC0+U2V0UHJlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICBLZXkgICAgPT4gJ1VzZXJBdXRoQmFja2VuZCcsCiAgICAgICAgICAgICAgICBWYWx1ZSAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VyLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbGFzdCBDT1VOVDsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiByZWNvcmQgZXhpc3RzCiAgICBpZiAoICEkVXNlciApIHsKICAgICAgICBteSAlQ3VzdG9tZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCggVXNlciA9PiAkUGFyYW17VXNlcn0gKTsKICAgICAgICBpZiAoJUN1c3RvbWVyRGF0YSkgewogICAgICAgICAgICBteSAkQ291bnQgPSAkQ3VzdG9tZXJEYXRhe1VzZXJMb2dpbkZhaWxlZH0gfHwgMDsKICAgICAgICAgICAgJENvdW50Kys7CiAgICAgICAgICAgICRDdXN0b21lclVzZXJPYmplY3QtPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgS2V5ICAgID0+ICdVc2VyTG9naW5GYWlsZWQnLAogICAgICAgICAgICAgICAgVmFsdWUgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkQ3VzdG9tZXJEYXRhe1VzZXJMb2dpbn0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHVzZXIgaXMgdmFsaWQKICAgIG15ICVDdXN0b21lckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KCBVc2VyID0+ICRVc2VyICk7CiAgICBpZiAoIGRlZmluZWQgJEN1c3RvbWVyRGF0YXtWYWxpZElEfSAmJiAkQ3VzdG9tZXJEYXRhe1ZhbGlkSUR9IG5lIDEgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ3VzdG9tZXJVc2VyOiAnJFVzZXInIGlzIHNldCB0byBpbnZhbGlkLCBjYW4ndCBsb2dpbiEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkVXNlciBpZiAhJUN1c3RvbWVyRGF0YTsKCiAgICAjIHJlc2V0IGZhaWxlZCBsb2dpbnMKICAgICRDdXN0b21lclVzZXJPYmplY3QtPlNldFByZWZlcmVuY2VzKAogICAgICAgIEtleSAgICA9PiAnVXNlckxvZ2luRmFpbGVkJywKICAgICAgICBWYWx1ZSAgPT4gMCwKICAgICAgICBVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtVc2VyTG9naW59LAogICAgKTsKCiAgICAjIG9uIHN5c3RlbSBtYWludGVuYW5jZSBjdXN0b21lcnMKICAgICMgc2hvdWxkbid0IGJlIGFsbG93ZWQgZ2V0IGludG8gdGhlIHN5c3RlbQogICAgbXkgJEFjdGl2ZU1haW50ZW5hbmNlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbU1haW50ZW5hbmNlJyktPlN5c3RlbU1haW50ZW5hbmNlSXNBY3RpdmUoKTsKCiAgICAjIGNoZWNrIGlmIHN5c3RlbSBtYWludGVuYW5jZSBpcyBhY3RpdmUKICAgIGlmICgkQWN0aXZlTWFpbnRlbmFuY2UpIHsKCiAgICAgICAgJFNlbGYtPntMYXN0RXJyb3JNZXNzYWdlfSA9CiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnU3lzdGVtTWFpbnRlbmFuY2U6OklzQWN0aXZlRGVmYXVsdExvZ2luRXJyb3JNZXNzYWdlJykKICAgICAgICAgICAgfHwgVHJhbnNsYXRhYmxlKCJJdCBpcyBjdXJyZW50bHkgbm90IHBvc3NpYmxlIHRvIGxvZ2luIGR1ZSB0byBhIHNjaGVkdWxlZCBzeXN0ZW0gbWFpbnRlbmFuY2UuIik7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxhc3QgbG9naW4gcHJlZmVyZW5jZXMgdXBkYXRlCiAgICBteSAkRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKCiAgICAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5TZXRQcmVmZXJlbmNlcygKICAgICAgICBLZXkgICAgPT4gJ1VzZXJMYXN0TG9naW4nLAogICAgICAgIFZhbHVlICA9PiAkRGF0ZVRpbWVPYmplY3QtPlRvRXBvY2goKSwKICAgICAgICBVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtVc2VyTG9naW59LAogICAgKTsKCiAgICByZXR1cm4gJFVzZXI7Cn0KCj1oZWFkMiBQcmVBdXRoKCkKCkNhbGwgdGhlIFByZUF1dGggbWV0aG9kIG9mIHRoZSBBdXRoQmFja2VuZAoKICAgIG15ICRQcmVBdXRoSW5mbyA9ICRBdXRoT2JqZWN0LT5QcmVBdXRoKAogICAgICAgIFJlcXVlc3RlZFVSTCA9PiAkUmVxdWVzdGVkVVJMLAogICAgKTsKCj1jdXQKCnN1YiBQcmVBdXRoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0F1dGhCYWNrZW5kfS0+Y2FuKCdQcmVBdXRoJyk7CgogICAgcmV0dXJuICRTZWxmLT57QXV0aEJhY2tlbmR9LT5QcmVBdXRoKCVQYXJhbSk7Cn0KCj1oZWFkMiBQb3N0QXV0aCgpCgpDYWxsIHRoZSBQb3N0QXV0aCBtZXRob2Qgb2YgdGhlIEF1dGhCYWNrZW5kCgogICAgbXkgJFBvc3RBdXRoSW5mbyA9ICRBdXRoT2JqZWN0LT5Qb3N0QXV0aCgpOwoKPWN1dAoKc3ViIFBvc3RBdXRoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0F1dGhCYWNrZW5kfS0+Y2FuKCdQb3N0QXV0aCcpOwoKICAgIHJldHVybiAkU2VsZi0+e0F1dGhCYWNrZW5kfS0+UG9zdEF1dGgoJVBhcmFtKTsKfQoKPWhlYWQyIExvZ291dCgpCgpDYWxsIHRoZSBMb2dvdXQgbWV0aG9kIG9mIHRoZSBBdXRoQmFja2VuZAoKICAgIG15ICRMb2dvdXRJbmZvID0gJEF1dGhPYmplY3QtPkxvZ291dCgpOwoKPWN1dAoKc3ViIExvZ291dCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhJFNlbGYtPntBdXRoQmFja2VuZH0tPmNhbignTG9nb3V0Jyk7CgogICAgcmV0dXJuICRTZWxmLT57QXV0aEJhY2tlbmR9LT5Mb2dvdXQoJVBhcmFtKTsKfQoKPWhlYWQyIEdldExhc3RFcnJvck1lc3NhZ2UoKQoKUmV0cmlldmUgJFNlbGYtPntMYXN0RXJyb3JNZXNzYWdlfSBjb250ZW50LgoKICAgIG15ICRBdXRoRXJyb3JNZXNzYWdlID0gJEF1dGhPYmplY3QtPkdldExhc3RFcnJvck1lc3NhZ2UoKTsKCiAgICBSZXN1bHQ6CgogICAgICAgICRBdXRoRXJyb3JNZXNzYWdlID0gIkFuIGVycm9yIHN0cmluZyBtZXNzYWdlLiI7Cgo9Y3V0CgpzdWIgR2V0TGFzdEVycm9yTWVzc2FnZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkU2VsZi0+e0xhc3RFcnJvck1lc3NhZ2V9Owp9CgoxOwo=</File>
        <File Location="Custom/Kernel/System/TemplateGenerator.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBhZGM3ZjNhMTFmMjllYjg5YWI4ZmNmNTM4NjQ0M2I2YTU3ZjEzOTEwIC0gS2VybmVsL1N5c3RlbS9UZW1wbGF0ZUdlbmVyYXRvci5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcjsKCiMjIG5vZmlsdGVyKFRpZHlBbGw6OlBsdWdpbjo6T1RPQk86OlBlcmw6OkxheW91dE9iamVjdCkKCnVzZSB2NS4yNDsKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKIyBjb3JlIG1vZHVsZXMKCiMgQ1BBTiBtb2R1bGVzCnVzZSBVUkk6OkVzY2FwZSBxdyh1cmlfZXNjYXBlX3V0ZjggdXJpX3VuZXNjYXBlKTsgICAgIyMgbm8gcGVybGltcG9ydHMsIG1ldGhvZHMgYXJlIHVzZWQgaW4gYSBzdWJzdGl0dXRpb24KCiMgT1RPQk8gbW9kdWxlcwp1c2UgS2VybmVsOjpMYW5ndWFnZSAgICAgICAgICAgICAgKCk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6QXV0b1Jlc3BvbnNlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q29tbXVuaWNhdGlvbkNoYW5uZWwnLAojIFJvdGhlciBPU1MgLyBPbmVUaW1lQXV0aGVudGlmaWNhdGlvbkxpbmsKICAgICdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJBdXRoOjpPbmVUaW1lQXV0aExpbmsnLAojIEVPIE9uZVRpbWVBdXRoZW50aWZpY2F0aW9uTGluawogICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlNhbHV0YXRpb24nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTaWduYXR1cmUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTdGFuZGFyZFRlbXBsYXRlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlVzZXInLAogICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yIC0gdGVtcGxhdGUgZ2VuZXJhdG9yIGxpYgoKPWhlYWQxIERFU0NSSVBUSU9OCgpBbGwgdGVtcGxhdGUgZ2VuZXJhdG9yIGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgbmV3KCkKCkRvbid0IHVzZSB0aGUgY29uc3RydWN0b3IgZGlyZWN0bHksIHVzZSB0aGUgT2JqZWN0TWFuYWdlciBpbnN0ZWFkOgoKICAgIG15ICRUZW1wbGF0ZUdlbmVyYXRvck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSBibGVzcyB7fSwgJFR5cGU7CgogICAgJFNlbGYtPntSaWNoVGV4dH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIFNhbHV0YXRpb24oKQoKZ2VuZXJhdGUgc2FsdXRhdGlvbgoKICAgIG15ICRTYWx1dGF0aW9uID0gJFRlbXBsYXRlR2VuZXJhdG9yT2JqZWN0LT5TYWx1dGF0aW9uKAogICAgICAgIFRpY2tldElEID0+IDEyMywKICAgICAgICBVc2VySUQgICA9PiAxMjMsCiAgICAgICAgRGF0YSAgICAgPT4gJEFydGljbGVIYXNoUmVmLAogICAgKTsKCnJldHVybnMKICAgIFRleHQKICAgIENvbnRlbnRUeXBlCgo9Y3V0CgpzdWIgU2FsdXRhdGlvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVGlja2V0SUQgRGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIEdldCB0aWNrZXQuCiAgICBteSAlVGlja2V0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICk7CgogICAgIyBHZXQgcXVldWUuCiAgICBteSAlUXVldWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+UXVldWVHZXQoCiAgICAgICAgSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSwKICAgICk7CgogICAgIyBHZXQgc2FsdXRhdGlvbi4KICAgIG15ICVTYWx1dGF0aW9uID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNhbHV0YXRpb24nKS0+U2FsdXRhdGlvbkdldCgKICAgICAgICBJRCA9PiAkUXVldWV7U2FsdXRhdGlvbklEfSwKICAgICk7CgogICAgIyBkbyB0ZXh0L3BsYWluIHRvIHRleHQvaHRtbCBjb252ZXJ0CiAgICBpZiAoICRTZWxmLT57UmljaFRleHR9ICYmICRTYWx1dGF0aW9ue0NvbnRlbnRUeXBlfSA9fiAvdGV4dFwvcGxhaW4vaSApIHsKICAgICAgICAkU2FsdXRhdGlvbntDb250ZW50VHlwZX0gPSAndGV4dC9odG1sJzsKICAgICAgICAkU2FsdXRhdGlvbntUZXh0fSAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvSFRNTCgKICAgICAgICAgICAgU3RyaW5nID0+ICRTYWx1dGF0aW9ue1RleHR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBkbyB0ZXh0L2h0bWwgdG8gdGV4dC9wbGFpbiBjb252ZXJ0CiAgICBpZiAoICEkU2VsZi0+e1JpY2hUZXh0fSAmJiAkU2FsdXRhdGlvbntDb250ZW50VHlwZX0gPX4gL3RleHRcL2h0bWwvaSApIHsKICAgICAgICAkU2FsdXRhdGlvbntDb250ZW50VHlwZX0gPSAndGV4dC9wbGFpbic7CiAgICAgICAgJFNhbHV0YXRpb257VGV4dH0gICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0FzY2lpKAogICAgICAgICAgICBTdHJpbmcgPT4gJFNhbHV0YXRpb257VGV4dH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBsaXN0IHVuc3VwcG9ydGVkIHRhZ3MgZm9yIHN0YW5kYXJkIHRlbXBsYXRlCiAgICBteSBATGlzdE9mVW5TdXBwb3J0ZWRUYWcgPSBxdyhPVE9CT19BR0VOVF9TVUJKRUNUIE9UT0JPX0FHRU5UX0JPRFkgT1RPQk9fQ1VTVE9NRVJfQk9EWSBPVE9CT19DVVNUT01FUl9TVUJKRUNUKTsKCiAgICBteSAkU2FsdXRhdGlvblRleHQgPSAkU2VsZi0+X1JlbW92ZVVuU3VwcG9ydGVkVGFnKAogICAgICAgIFRleHQgICAgICAgICAgICAgICAgID0+ICRTYWx1dGF0aW9ue1RleHR9IHx8ICcnLAogICAgICAgIExpc3RPZlVuU3VwcG9ydGVkVGFnID0+IFxATGlzdE9mVW5TdXBwb3J0ZWRUYWcsCiAgICApOwoKICAgICMgcmVwbGFjZSBwbGFjZSBob2xkZXIgc3R1ZmYKICAgICRTYWx1dGF0aW9uVGV4dCA9ICRTZWxmLT5fUmVwbGFjZSgKICAgICAgICBSaWNoVGV4dCAgID0+ICRTZWxmLT57UmljaFRleHR9LAogICAgICAgIFRleHQgICAgICAgPT4gJFNhbHV0YXRpb25UZXh0LAogICAgICAgIFRpY2tldERhdGEgPT4gXCVUaWNrZXQsCiAgICAgICAgRGF0YSAgICAgICA9PiAkUGFyYW17RGF0YX0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBhZGQgdXJscwogICAgaWYgKCAkU2VsZi0+e1JpY2hUZXh0fSApIHsKICAgICAgICAkU2FsdXRhdGlvblRleHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPkxpbmtRdW90ZSgKICAgICAgICAgICAgU3RyaW5nID0+ICRTYWx1dGF0aW9uVGV4dCwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkU2FsdXRhdGlvblRleHQ7Cn0KCj1oZWFkMiBTaWduYXR1cmUoKQoKZ2VuZXJhdGUgc2FsdXRhdGlvbgoKICAgIG15ICRTaWduYXR1cmUgPSAkVGVtcGxhdGVHZW5lcmF0b3JPYmplY3QtPlNpZ25hdHVyZSgKICAgICAgICBUaWNrZXRJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgPT4gMTIzLAogICAgICAgIERhdGEgICAgID0+ICRBcnRpY2xlSGFzaFJlZiwKICAgICk7CgpvcgoKICAgIG15ICRTaWduYXR1cmUgPSAkVGVtcGxhdGVHZW5lcmF0b3JPYmplY3QtPlNpZ25hdHVyZSgKICAgICAgICBRdWV1ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgID0+IDEyMywKICAgICAgICBEYXRhICAgID0+ICRBcnRpY2xlSGFzaFJlZiwKICAgICk7CgpyZXR1cm5zCiAgICBUZXh0CiAgICBDb250ZW50VHlwZQoKPWN1dAoKc3ViIFNpZ25hdHVyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBuZWVkIHRpY2tldCBpZCBvciBxdWV1ZSBpZAogICAgaWYgKCAhJFBhcmFte1RpY2tldElEfSAmJiAhJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUaWNrZXRJRCBvciBRdWV1ZUlEIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIEdldCB0aWNrZXQgZGF0YS4KICAgIG15ICVUaWNrZXQ7CiAgICBpZiAoICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJVRpY2tldCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0R2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgR2V0IHF1ZXVlLgogICAgbXkgJVF1ZXVlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlR2V0KAogICAgICAgIElEID0+ICRUaWNrZXR7UXVldWVJRH0gfHwgJFBhcmFte1F1ZXVlSUR9LAogICAgKTsKCiAgICAjIEdldCBzaWduYXR1cmUuCiAgICBteSAlU2lnbmF0dXJlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNpZ25hdHVyZScpLT5TaWduYXR1cmVHZXQoCiAgICAgICAgSUQgPT4gJFF1ZXVle1NpZ25hdHVyZUlEfSwKICAgICk7CgogICAgIyBkbyB0ZXh0L3BsYWluIHRvIHRleHQvaHRtbCBjb252ZXJ0CiAgICBpZiAoICRTZWxmLT57UmljaFRleHR9ICYmICRTaWduYXR1cmV7Q29udGVudFR5cGV9ID1+IC90ZXh0XC9wbGFpbi9pICkgewogICAgICAgICRTaWduYXR1cmV7Q29udGVudFR5cGV9ID0gJ3RleHQvaHRtbCc7CiAgICAgICAgJFNpZ25hdHVyZXtUZXh0fSAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvSFRNTCgKICAgICAgICAgICAgU3RyaW5nID0+ICRTaWduYXR1cmV7VGV4dH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRvIHRleHQvaHRtbCB0byB0ZXh0L3BsYWluIGNvbnZlcnQKICAgIGlmICggISRTZWxmLT57UmljaFRleHR9ICYmICRTaWduYXR1cmV7Q29udGVudFR5cGV9ID1+IC90ZXh0XC9odG1sL2kgKSB7CiAgICAgICAgJFNpZ25hdHVyZXtDb250ZW50VHlwZX0gPSAndGV4dC9wbGFpbic7CiAgICAgICAgJFNpZ25hdHVyZXtUZXh0fSAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvQXNjaWkoCiAgICAgICAgICAgIFN0cmluZyA9PiAkU2lnbmF0dXJle1RleHR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbGlzdCB1bnN1cHBvcnRlZCB0YWdzIGZvciBzdGFuZGFyZCB0ZW1wbGF0ZQogICAgbXkgQExpc3RPZlVuU3VwcG9ydGVkVGFnID0gcXcoT1RPQk9fQUdFTlRfU1VCSkVDVCBPVE9CT19BR0VOVF9CT0RZIE9UT0JPX0NVU1RPTUVSX0JPRFkgT1RPQk9fQ1VTVE9NRVJfU1VCSkVDVCk7CgogICAgbXkgJFNpZ25hdHVyZVRleHQgPSAkU2VsZi0+X1JlbW92ZVVuU3VwcG9ydGVkVGFnKAogICAgICAgIFRleHQgICAgICAgICAgICAgICAgID0+ICRTaWduYXR1cmV7VGV4dH0gfHwgJycsCiAgICAgICAgTGlzdE9mVW5TdXBwb3J0ZWRUYWcgPT4gXEBMaXN0T2ZVblN1cHBvcnRlZFRhZywKICAgICk7CgogICAgIyByZXBsYWNlIHBsYWNlIGhvbGRlciBzdHVmZgogICAgJFNpZ25hdHVyZVRleHQgPSAkU2VsZi0+X1JlcGxhY2UoCiAgICAgICAgUmljaFRleHQgICA9PiAkU2VsZi0+e1JpY2hUZXh0fSwKICAgICAgICBUZXh0ICAgICAgID0+ICRTaWduYXR1cmVUZXh0LAogICAgICAgIFRpY2tldERhdGEgPT4gXCVUaWNrZXQsCiAgICAgICAgRGF0YSAgICAgICA9PiAkUGFyYW17RGF0YX0sCiAgICAgICAgUXVldWVJRCAgICA9PiAkUGFyYW17UXVldWVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBhZGQgdXJscwogICAgaWYgKCAkU2VsZi0+e1JpY2hUZXh0fSApIHsKICAgICAgICAkU2lnbmF0dXJlVGV4dCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+TGlua1F1b3RlKAogICAgICAgICAgICBTdHJpbmcgPT4gJFNpZ25hdHVyZVRleHQsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJFNpZ25hdHVyZVRleHQ7Cn0KCj1oZWFkMiBTZW5kZXIoKQoKZ2VuZXJhdGUgc2VuZGVyIGFkZHJlc3MgKEZST00gc3RyaW5nKSBmb3IgZW1haWxzCgogICAgbXkgJFNlbmRlciA9ICRUZW1wbGF0ZUdlbmVyYXRvck9iamVjdC0+U2VuZGVyKAogICAgICAgIFF1ZXVlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgPT4gMTIzLAogICAgKTsKCnJldHVybnM6CgogICAgSm9obiBEb2UgYXQgU3VwZXIgU3VwcG9ydCA8c2VydmljZUBleGFtcGxlLmNvbT4KCmFuZCBpdCByZXR1cm5zIHRoZSBxdW90ZWQgcmVhbCBuYW1lIGlmIG5lY2Vzc2FyeQoKICAgICJKb2huIERvZSwgU3VwcG9ydCIgPHNlcnZpY2VAZXhhbXBsZS50bGQ+Cgo9Y3V0CgpzdWIgU2VuZGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyggVXNlcklEIFF1ZXVlSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgc2VuZGVyIGF0dHJpYnV0ZXMKICAgIG15ICVBZGRyZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPkdldFN5c3RlbUFkZHJlc3MoCiAgICAgICAgUXVldWVJRCA9PiAkUGFyYW17UXVldWVJRH0sCiAgICApOwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgY2hlY2sgY29uZmlnIGZvciBhZ2VudCByZWFsIG5hbWUKICAgIG15ICRVc2VBZ2VudFJlYWxOYW1lID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkRlZmluZUVtYWlsRnJvbScpOwogICAgaWYgKCAkVXNlQWdlbnRSZWFsTmFtZSAmJiAkVXNlQWdlbnRSZWFsTmFtZSA9fiAvXihBZ2VudE5hbWV8QWdlbnROYW1lU3lzdGVtQWRkcmVzc05hbWUpJC8gKSB7CgogICAgICAgICMgZ2V0IGRhdGEgZnJvbSBjdXJyZW50IGFnZW50CiAgICAgICAgbXkgJVVzZXJEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIE5vT3V0T2ZPZmZpY2UgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIHNldCByZWFsIG5hbWUgd2l0aCB1c2VyIG5hbWUKICAgICAgICBpZiAoICRVc2VBZ2VudFJlYWxOYW1lIGVxICdBZ2VudE5hbWUnICkgewoKICAgICAgICAgICAgIyBjaGVjayBmb3IgdXNlciBkYXRhCiAgICAgICAgICAgIGlmICggJFVzZXJEYXRhe1VzZXJGdWxsbmFtZX0gKSB7CgogICAgICAgICAgICAgICAgIyByZXdyaXRlIFJlYWxOYW1lCiAgICAgICAgICAgICAgICAkQWRkcmVzc3tSZWFsTmFtZX0gPSAiJFVzZXJEYXRhe1VzZXJGdWxsbmFtZX0iOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCByZWFsIG5hbWUgd2l0aCB1c2VyIG5hbWUKICAgICAgICBpZiAoICRVc2VBZ2VudFJlYWxOYW1lIGVxICdBZ2VudE5hbWVTeXN0ZW1BZGRyZXNzTmFtZScgKSB7CgogICAgICAgICAgICAjIGNoZWNrIGZvciB1c2VyIGRhdGEKICAgICAgICAgICAgaWYgKCAkVXNlckRhdGF7VXNlckZ1bGxuYW1lfSApIHsKCiAgICAgICAgICAgICAgICAjIHJld3JpdGUgUmVhbE5hbWUKICAgICAgICAgICAgICAgIG15ICRTZXBhcmF0b3IgPSAnICcgLiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RGVmaW5lRW1haWxGcm9tU2VwYXJhdG9yJykKICAgICAgICAgICAgICAgICAgICB8fCAnJzsKICAgICAgICAgICAgICAgICRBZGRyZXNze1JlYWxOYW1lfSA9ICRVc2VyRGF0YXtVc2VyRnVsbG5hbWV9IC4gJFNlcGFyYXRvciAuICcgJyAuICRBZGRyZXNze1JlYWxOYW1lfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIEZvcm1hdCBzZW5kZXIgcmVhbCBuYW1lIGFuZCBhZGRyZXNzIGNvbXBsaWFudCB0byBSRkMgNTMyMi4gVGhpcyBpcyByZWxldmFudCB3aGVuIHRoZSByZWFsIG5hbWUgY29udGFpbiBjb21tYXMKICAgICMgb3Igb3RoZXIgc3BlY2lhbCBzeW1ib2xzLgogICAgcmV0dXJuIE1haWw6OkFkZHJlc3MtPm5ldyggJEFkZHJlc3N7UmVhbE5hbWV9LCAkQWRkcmVzc3tFbWFpbH0gKS0+Zm9ybWF0KCk7Cn0KCj1oZWFkMiBUZW1wbGF0ZSgpCgpnZW5lcmF0ZSB0ZW1wbGF0ZQoKICAgIG15ICRUZW1wbGF0ZSA9ICRUZW1wbGF0ZUdlbmVyYXRvck9iamVjdC0+VGVtcGxhdGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVGlja2V0SUQgICA9PiAxMjMsICAgICAgICAgICAgICAgICAgIyBPcHRpb25hbAogICAgICAgIERhdGEgICAgICAgPT4gJEFydGljbGVIYXNoUmVmLCAgICAgICMgT3B0aW9uYWwKICAgICAgICBVc2VySUQgICAgID0+IDEyMywKICAgICk7CgpSZXR1cm5zOgoKICAgICRUZW1wbGF0ZSA9ICdTb21lIHRleHQnOwoKPWN1dAoKc3ViIFRlbXBsYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIgogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkU3RhbmRhcmRUZW1wbGF0ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGFuZGFyZFRlbXBsYXRlJyk7CgogICAgbXkgJVRlbXBsYXRlID0gJFN0YW5kYXJkVGVtcGxhdGVPYmplY3QtPlN0YW5kYXJkVGVtcGxhdGVHZXQoCiAgICAgICAgSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgKTsKCiAgICAjIGRvIHRleHQvcGxhaW4gdG8gdGV4dC9odG1sIGNvbnZlcnQKICAgIGlmICgKICAgICAgICAkU2VsZi0+e1JpY2hUZXh0fQogICAgICAgICYmICRUZW1wbGF0ZXtDb250ZW50VHlwZX0gPX4gL3RleHRcL3BsYWluL2kKICAgICAgICAmJiAkVGVtcGxhdGV7VGVtcGxhdGV9CiAgICAgICAgKQogICAgewogICAgICAgICRUZW1wbGF0ZXtDb250ZW50VHlwZX0gPSAndGV4dC9odG1sJzsKICAgICAgICAkVGVtcGxhdGV7VGVtcGxhdGV9ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0hUTUwoCiAgICAgICAgICAgIFN0cmluZyA9PiAkVGVtcGxhdGV7VGVtcGxhdGV9LAogICAgICAgICk7CiAgICB9CgogICAgIyBkbyB0ZXh0L2h0bWwgdG8gdGV4dC9wbGFpbiBjb252ZXJ0CiAgICBpZiAoCiAgICAgICAgISRTZWxmLT57UmljaFRleHR9CiAgICAgICAgJiYgJFRlbXBsYXRle0NvbnRlbnRUeXBlfSA9fiAvdGV4dFwvaHRtbC9pCiAgICAgICAgJiYgJFRlbXBsYXRle1RlbXBsYXRlfQogICAgICAgICkKICAgIHsKICAgICAgICAkVGVtcGxhdGV7Q29udGVudFR5cGV9ID0gJ3RleHQvcGxhaW4nOwogICAgICAgICRUZW1wbGF0ZXtUZW1wbGF0ZX0gICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvQXNjaWkoCiAgICAgICAgICAgIFN0cmluZyA9PiAkVGVtcGxhdGV7VGVtcGxhdGV9LAogICAgICAgICk7CiAgICB9CgogICAgIyBHZXQgdXNlciBsYW5ndWFnZS4KICAgIG15ICRMYW5ndWFnZTsKICAgIG15ICVUaWNrZXQ7CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte1RpY2tldElEfSApIHsKCiAgICAgICAgIyBHZXQgdGlja2V0IGRhdGEuCiAgICAgICAgJVRpY2tldCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0R2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIEdldCByZWNpcGllbnQuCiAgICAgICAgbXkgJVVzZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgIFVzZXIgPT4gJFRpY2tldHtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkTGFuZ3VhZ2UgPSAkVXNlcntVc2VyTGFuZ3VhZ2V9OwogICAgfQoKICAgICMgSWYgdGVtcGxhdGUgdHlwZSBpcyAnQ3JlYXRlJyBhbmQgdGhlcmUgaXMgY3VzdG9tZXIgdXNlciBpbmZvcm1hdGlvbiwgdHJlYXQgaXQgYXMgYSB0aWNrZXQgcGFyYW0gaW4gb3JkZXIgdG8KICAgICMgY29ycmVjdGx5IHJlcGxhY2UgY3VzdG9tZXIgdXNlciB0YWdzLiBTZWUgYnVnIzE0NDU1LgogICAgaWYgKCAkVGVtcGxhdGV7VGVtcGxhdGVUeXBlfSBlcSAnQ3JlYXRlJyAmJiAkUGFyYW17Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9ID0gJFBhcmFte0N1c3RvbWVyVXNlcklEfTsKICAgIH0KCiAgICAjIGlmIGN1c3RvbWVyIGxhbmd1YWdlIGlzIG5vdCBkZWZpbmVkLCBzZXQgZGVmYXVsdCBsYW5ndWFnZQogICAgJExhbmd1YWdlIC8vPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0RlZmF1bHRMYW5ndWFnZScpIHx8ICdlbic7CgogICAgIyBnZXQgbGlzdCB1bnN1cHBvcnRlZCB0YWdzIGZvciBzdGFuZGFyZCB0ZW1wbGF0ZQogICAgbXkgQExpc3RPZlVuU3VwcG9ydGVkVGFnID0gcXcoT1RPQk9fQUdFTlRfU1VCSkVDVCBPVE9CT19BR0VOVF9CT0RZIE9UT0JPX0NVU1RPTUVSX0JPRFkgT1RPQk9fQ1VTVE9NRVJfU1VCSkVDVCk7CgogICAgbXkgJVN1cHBvcnRlZFR5cGVzID0gKAogICAgICAgIEFuc3dlciAgPT4gMSwKICAgICAgICBGb3J3YXJkID0+IDEsCiAgICAgICAgTm90ZSAgICA9PiAxLAogICAgKTsKCiAgICBteSAkVGVtcGxhdGVUZXh0ID0gJFRlbXBsYXRle1RlbXBsYXRlfSB8fCAnJzsKICAgIG15ICRUZW1wbGF0ZVR5cGUgPSAkVGVtcGxhdGV7VGVtcGxhdGVUeXBlfTsKCiAgICAjIFJlbW92ZSB1bnN1cHBvcnRlZCB0YWdzIG9ubHkgZm9yIHNvbWUgdGVtcGxhdGUgdHlwZXMuCiAgICBpZiAoICEkU3VwcG9ydGVkVHlwZXN7ICRUZW1wbGF0ZXtUZW1wbGF0ZVR5cGV9IH0gKSB7CiAgICAgICAgJFRlbXBsYXRlVGV4dCA9ICRTZWxmLT5fUmVtb3ZlVW5TdXBwb3J0ZWRUYWcoCiAgICAgICAgICAgIFRleHQgICAgICAgICAgICAgICAgID0+ICRUZW1wbGF0ZXtUZW1wbGF0ZX0gfHwgJycsCiAgICAgICAgICAgIExpc3RPZlVuU3VwcG9ydGVkVGFnID0+IFxATGlzdE9mVW5TdXBwb3J0ZWRUYWcsCiAgICAgICAgKTsKCiAgICAgICAgIyBSZXNldCB0ZW1wbGF0ZSB0eXBlIGZvciB1bnN1cHBvcnRlZCB0YWcuCiAgICAgICAgJFRlbXBsYXRlVHlwZSA9ICcnOwogICAgfQoKICAgICMgcmVwbGFjZSBwbGFjZSBob2xkZXIgc3R1ZmYKICAgICRUZW1wbGF0ZVRleHQgPSAkU2VsZi0+X1JlcGxhY2UoCiAgICAgICAgUmljaFRleHQgICA9PiAkU2VsZi0+e1JpY2hUZXh0fSwKICAgICAgICBUZXh0ICAgICAgID0+ICRUZW1wbGF0ZVRleHQgfHwgJycsCiAgICAgICAgVGlja2V0RGF0YSA9PiBcJVRpY2tldCwKICAgICAgICBEYXRhICAgICAgID0+ICRQYXJhbXtEYXRhfSB8fCB7fSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIExhbmd1YWdlICAgPT4gJExhbmd1YWdlLAogICAgICAgIFRlbXBsYXRlICAgPT4gJFRlbXBsYXRlVHlwZSwKICAgICk7CgogICAgaWYgKCAkU2VsZi0+e1JpY2hUZXh0fSApIHsKICAgICAgICAkVGVtcGxhdGVUZXh0ID1+IHMvJmx0Oy88L2c7CiAgICAgICAgJFRlbXBsYXRlVGV4dCA9fiBzLyZndDsvPi9nOwogICAgICAgICRUZW1wbGF0ZVRleHQgPX4gcy8mcXVvdDsvIi9nOwogICAgICAgICRUZW1wbGF0ZVRleHQgPX4gcy8mYXBvczsvJy9nOwogICAgICAgICRUZW1wbGF0ZVRleHQgPX4gcy8mbmJzcDsvIC9nOwogICAgfQoKICAgIHJldHVybiAkVGVtcGxhdGVUZXh0Owp9Cgo9aGVhZDIgR2VuZXJpY0FnZW50QXJ0aWNsZSgpCgpnZW5lcmF0ZSBpbnRlcm5hbCBvciBleHRlcm5hbCBub3RlcwoKICAgIG15ICRHZW5lcmljQWdlbnRBcnRpY2xlID0gJFRlbXBsYXRlR2VuZXJhdG9yT2JqZWN0LT5HZW5lcmljQWdlbnRBcnRpY2xlKAogICAgICAgIE5vdGlmaWNhdGlvbiA9PiAkTm90aWZpY2F0aW9uRGF0YUhhc2hSZWYsCiAgICAgICAgVGlja2V0SUQgICAgID0+IDEyMywKICAgICAgICBVc2VySUQgICAgICAgPT4gMTIzLAogICAgICAgIERhdGEgICAgICAgICA9PiAkQXJ0aWNsZUhhc2hSZWYsICAgICAgICAgICAgICMgT3B0aW9uYWwKICAgICk7Cgo9Y3V0CgpzdWIgR2VuZXJpY0FnZW50QXJ0aWNsZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVGlja2V0SUQgTm90aWZpY2F0aW9uIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVUZW1wbGF0ZSA9ICV7ICRQYXJhbXtOb3RpZmljYXRpb259IH07CgogICAgIyBnZXQgdGlja2V0IG9iamVjdAogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIEdldCB0aWNrZXQgZGF0YS4KICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICk7CgogICAgIyBkbyB0ZXh0L3BsYWluIHRvIHRleHQvaHRtbCBjb252ZXJ0CiAgICBpZiAoCiAgICAgICAgJFNlbGYtPntSaWNoVGV4dH0KICAgICAgICAmJiAkVGVtcGxhdGV7Q29udGVudFR5cGV9ID1+IC90ZXh0XC9wbGFpbi9pCiAgICAgICAgJiYgJFRlbXBsYXRle0JvZHl9CiAgICAgICAgKQogICAgewogICAgICAgICRUZW1wbGF0ZXtDb250ZW50VHlwZX0gPSAndGV4dC9odG1sJzsKICAgICAgICAkVGVtcGxhdGV7Qm9keX0gICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0hUTUwoCiAgICAgICAgICAgIFN0cmluZyA9PiAkVGVtcGxhdGV7Qm9keX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRvIHRleHQvaHRtbCB0byB0ZXh0L3BsYWluIGNvbnZlcnQKICAgIGlmICgKICAgICAgICAhJFNlbGYtPntSaWNoVGV4dH0KICAgICAgICAmJiAkVGVtcGxhdGV7Q29udGVudFR5cGV9ID1+IC90ZXh0XC9odG1sL2kKICAgICAgICAmJiAkVGVtcGxhdGV7Qm9keX0KICAgICAgICApCiAgICB7CiAgICAgICAgJFRlbXBsYXRle0NvbnRlbnRUeXBlfSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICAkVGVtcGxhdGV7Qm9keX0gICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0FzY2lpKAogICAgICAgICAgICBTdHJpbmcgPT4gJFRlbXBsYXRle0JvZHl9LAogICAgICAgICk7CiAgICB9CgogICAgIyByZXBsYWNlIHBsYWNlIGhvbGRlciBzdHVmZgogICAgJFRlbXBsYXRle0JvZHl9ID0gJFNlbGYtPl9SZXBsYWNlKAogICAgICAgIFJpY2hUZXh0ICAgPT4gJFNlbGYtPntSaWNoVGV4dH0sCiAgICAgICAgVGV4dCAgICAgICA9PiAkVGVtcGxhdGV7Qm9keX0sCiAgICAgICAgUmVjaXBpZW50ICA9PiAkUGFyYW17UmVjaXBpZW50fSwKICAgICAgICBEYXRhICAgICAgID0+ICRQYXJhbXtEYXRhfSB8fCB7fSwKICAgICAgICBUaWNrZXREYXRhID0+IFwlVGlja2V0LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwogICAgJFRlbXBsYXRle1N1YmplY3R9ID0gJFNlbGYtPl9SZXBsYWNlKAogICAgICAgIFJpY2hUZXh0ICAgPT4gMCwKICAgICAgICBUZXh0ICAgICAgID0+ICRUZW1wbGF0ZXtTdWJqZWN0fSwKICAgICAgICBSZWNpcGllbnQgID0+ICRQYXJhbXtSZWNpcGllbnR9LAogICAgICAgIERhdGEgICAgICAgPT4gJFBhcmFte0RhdGF9IHx8IHt9LAogICAgICAgIFRpY2tldERhdGEgPT4gXCVUaWNrZXQsCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgJFRlbXBsYXRle1N1YmplY3R9ID0gJFRpY2tldE9iamVjdC0+VGlja2V0U3ViamVjdEJ1aWxkKAogICAgICAgIFRpY2tldE51bWJlciA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgU3ViamVjdCAgICAgID0+ICRUZW1wbGF0ZXtTdWJqZWN0fSB8fCAnJywKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05ldycsCiAgICApOwoKICAgICMgYWRkIFVSTHMgYW5kIHZlcmlmeSB0byBiZSBmdWxsIEhUTUwgZG9jdW1lbnQKICAgIGlmICggJFNlbGYtPntSaWNoVGV4dH0gKSB7CgogICAgICAgICRUZW1wbGF0ZXtCb2R5fSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+TGlua1F1b3RlKAogICAgICAgICAgICBTdHJpbmcgPT4gJFRlbXBsYXRle0JvZHl9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICVUZW1wbGF0ZTsKfQoKPWhlYWQyIEF0dHJpYnV0ZXMoKQoKbW9kaWZpZXMgaW5wbGFjZSB0aGUgcGFzc2VkIGluIEM8RGF0YT4gaGFzaCByZWZlcmVuY2UgYW5kIHJldHVybnMgdGhlIGVucmljaGVkIGRhdGEuCgogICAgbXkgJURhdGEgPSAoCiAgICAgICAgU3ViamVjdCA9PiAnV2hhdCBkbyB5b3Ugd2FudCB0byB0YWxrIGFib3V0PycKICAgICk7CgogICAgbXkgJUVucmljaGVkRGF0YSA9ICRUZW1wbGF0ZUdlbmVyYXRvT2JqZWN0LT5BdHRyaWJ1dGVzKAogICAgICAgIFRpY2tldElEICAgPT4gMTIzLAogICAgICAgIERhdGEgICAgICAgPT4gXCVEYXRhLCAgICAjICREYXRhe1N1YmplY3R9IGlzIHVzZWQgYXMgaW5wdXQgZm9yIGZpbmRpbmcgdGhlIG5ldyBzdWJqZWN0CiAgICAgICAgVXNlcklEICAgICA9PiAxMjMsCiAgICAgICAgQWN0aW9uICAgICA9PiAnRm9yd2FyZCcsICMgUmVsZXZhbnQgZm9yIHRoZSBzdWJqZWN0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFBvc3NpYmxlIHZhbHVlcyBhcmUgJ1JlcGx5JyBhbmQgJ0ZvcndhcmQnLCAnUmVwbHknIGlzIGV2ZW50dWFsbHkgdGhlIGRlZmF1bHQuCiAgICApOwoKUmV0dXJucyB0aGUgbW9kaWZpZWQgaGFzaCByZWZlcmVuY2UgYXMga2V5IHZhbHVlIHBhaXJzLiBUaGUgcG90ZW50aWFsbHkgYWRkZWQgb3IgY2hhbmdlZCBpdGVtIGFyZToKCj1vdmVyIDQKCj1pdGVtIFN1YmplY3QKCj1pdGVtIEZyb20KCj1iYWNrCgo9Y3V0CgpzdWIgQXR0cmlidXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVGlja2V0SUQgRGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGlja2V0IG9iamVjdAogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGdldCB0aWNrZXQgZGF0YSwgaW5jbHVkaW5nIHRoZSBxdWV1ZSBpZAogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgKTsKCiAgICAjIHByZXBhcmUgc3ViamVjdCAuLi4KICAgICRQYXJhbXtEYXRhfS0+e1N1YmplY3R9ID0gJFRpY2tldE9iamVjdC0+VGlja2V0U3ViamVjdEJ1aWxkKAogICAgICAgIFRpY2tldE51bWJlciA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgU3ViamVjdCAgICAgID0+ICRQYXJhbXtEYXRhfS0+e1N1YmplY3R9IHx8ICcnLAogICAgICAgIEFjdGlvbiAgICAgICA9PiAkUGFyYW17QWN0aW9ufSAgICAgICAgICB8fCAnJywgICAgIyBUaWNrZXRTdWJqZWN0QnVpbGQoKSBmYWxscyBiYWNrIHRvIHRoZSBkZWZhdWx0ICdSZXBseScKICAgICk7CgogICAgIyBnZXQgc2VuZGVyIGFkZHJlc3MKICAgICRQYXJhbXtEYXRhfS0+e0Zyb219ID0gJFNlbGYtPlNlbmRlcigKICAgICAgICBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0sCiAgICAgICAgVXNlcklEICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRQYXJhbXtEYXRhfS0+JSo7Cn0KCj1oZWFkMiBBdXRvUmVzcG9uc2UoKQoKZ2VuZXJhdGUgcmVzcG9uc2UKCkF1dG9SZXNwb25zZQogICAgVGlja2V0SUQKICAgICAgICBPd25lcgogICAgICAgIFJlc3BvbnNpYmxlCiAgICAgICAgQ1VTVE9NRVJfREFUQQogICAgQXJ0aWNsZUlECiAgICAgICAgQ1VTVE9NRVJfU1VCSkVDVAogICAgICAgIENVU1RPTUVSX0VNQUlMCiAgICBVc2VySUQKCiAgICBUbwogICAgQ2MKICAgIEJjYwogICAgU3ViamVjdAogICAgQm9keQogICAgQ29udGVudFR5cGUKCiAgICBteSAlQXV0b1Jlc3BvbnNlID0gJFRlbXBsYXRlR2VuZXJhdG9yT2JqZWN0LT5BdXRvUmVzcG9uc2UoCiAgICAgICAgVGlja2V0SUQgICAgICAgICA9PiAxMjMsCiAgICAgICAgT3JpZ0hlYWRlciAgICAgICA9PiB7fSwKICAgICAgICBBdXRvUmVzcG9uc2VUeXBlID0+ICdhdXRvIHJlcGx5JywKICAgICAgICBVc2VySUQgICAgICAgICAgID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgQXV0b1Jlc3BvbnNlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhUaWNrZXRJRCBBdXRvUmVzcG9uc2VUeXBlIE9yaWdIZWFkZXIgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBHZXQgdGlja2V0IGRhdGEuCiAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICApOwoKICAgICMgZ2V0IGF1dG8gZGVmYXVsdCByZXNwb25zZXMKICAgIG15ICVBdXRvUmVzcG9uc2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6QXV0b1Jlc3BvbnNlJyktPkF1dG9SZXNwb25zZUdldEJ5VHlwZVF1ZXVlSUQoCiAgICAgICAgUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgIFR5cGUgICAgPT4gJFBhcmFte0F1dG9SZXNwb25zZVR5cGV9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISVBdXRvUmVzcG9uc2U7CgogICAgIyBnZXQgb2xkIGFydGljbGUgZm9yIHF1b3RpbmcKICAgIG15ICRBcnRpY2xlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwogICAgbXkgQEFydGljbGVMaXN0ICAgPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZUxpc3QoCiAgICAgICAgVGlja2V0SUQgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgIFNlbmRlclR5cGUgPT4gJ2N1c3RvbWVyJywKICAgICAgICBPbmx5TGFzdCAgID0+IDEsCiAgICApOwoKICAgIGlmICggIUBBcnRpY2xlTGlzdCApIHsKICAgICAgICBAQXJ0aWNsZUxpc3QgPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZUxpc3QoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+IDEsCiAgICAgICAgICAgIE9ubHlMYXN0ICAgICAgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoQEFydGljbGVMaXN0KSB7CiAgICAgICAgbXkgJUFydGljbGUgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckFydGljbGUoICV7ICRBcnRpY2xlTGlzdFswXSB9ICktPkFydGljbGVHZXQoICV7ICRBcnRpY2xlTGlzdFswXSB9ICk7CgogICAgICAgIGZvciBteSAkS2V5IChxdyhGcm9tIFRvIENjIFN1YmplY3QgQm9keSkpIHsKICAgICAgICAgICAgaWYgKCAhJFBhcmFte09yaWdIZWFkZXJ9LT57JEtleX0gKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17T3JpZ0hlYWRlcn0tPnskS2V5fSA9ICRBcnRpY2xleyRLZXl9IHx8ICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNob21wICRQYXJhbXtPcmlnSGVhZGVyfS0+eyRLZXl9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGZvcm1hdCBib2R5IChvbmx5IGlmIGxvbmdlciB0aGFuIDg2IGNoYXJzKQogICAgaWYgKCAkUGFyYW17T3JpZ0hlYWRlcn0tPntCb2R5fSApIHsKICAgICAgICBpZiAoIGxlbmd0aCAkUGFyYW17T3JpZ0hlYWRlcn0tPntCb2R5fSA+IDg2ICkgewogICAgICAgICAgICBteSBATGluZXMgPSBzcGxpdCAvXG4vLCAkUGFyYW17T3JpZ0hlYWRlcn0tPntCb2R5fTsKICAgICAgICAgICAgTElORToKICAgICAgICAgICAgZm9yIG15ICRMaW5lIChATGluZXMpIHsKICAgICAgICAgICAgICAgIG15ICRMaW5lV3JhcHBlZCA9ICRMaW5lID1+IHMvKF4+Lit8Lns0LDg2fSkoPzpcc3xceikvJDFcbi9nbTsKCiAgICAgICAgICAgICAgICBuZXh0IExJTkUgaWYgJExpbmVXcmFwcGVkOwoKICAgICAgICAgICAgICAgICMgaWYgdGhlIHJlZ2V4IGRvZXMgbm90IG1hdGNoIHRoZW4gd2UgbmVlZAogICAgICAgICAgICAgICAgIyB0byBhZGQgdGhlIG1pc3NpbmcgbmV3IGxpbmUgb2YgdGhlIHNwbGl0CiAgICAgICAgICAgICAgICAjIGVsc2Ugd2Ugd2lsbCBsb3NlIGUuZy4gZW1wdHkgbGluZXMgb2YgdGhlIGJvZHkuCiAgICAgICAgICAgICAgICAjIChidWcjMTA2NzkpCiAgICAgICAgICAgICAgICAkTGluZSAuPSAiXG4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtPcmlnSGVhZGVyfS0+e0JvZHl9ID0gam9pbiAnJywgQExpbmVzOwogICAgICAgIH0KICAgIH0KCiAgICAjIGZpbGwgdXAgcmVxdWlyZWQgYXR0cmlidXRlcwogICAgZm9yIG15ICRLZXkgKHF3KFN1YmplY3QgQm9keSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17T3JpZ0hlYWRlcn0tPnskS2V5fSApIHsKICAgICAgICAgICAgJFBhcmFte09yaWdIZWFkZXJ9LT57JEtleX0gPSAiTm8gJEtleSI7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHJlY2lwaWVudAogICAgbXkgJVVzZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgVXNlciA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgdXNlciBsYW5ndWFnZQogICAgbXkgJExhbmd1YWdlID0gJFVzZXJ7VXNlckxhbmd1YWdlfSB8fCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0RlZmF1bHRMYW5ndWFnZScpIHx8ICdlbic7CgogICAgIyBkbyB0ZXh0L3BsYWluIHRvIHRleHQvaHRtbCBjb252ZXJ0CiAgICBpZiAoICRTZWxmLT57UmljaFRleHR9ICYmICRBdXRvUmVzcG9uc2V7Q29udGVudFR5cGV9ID1+IC90ZXh0XC9wbGFpbi9pICkgewogICAgICAgICRBdXRvUmVzcG9uc2V7Q29udGVudFR5cGV9ID0gJ3RleHQvaHRtbCc7CiAgICAgICAgJEF1dG9SZXNwb25zZXtUZXh0fSAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvSFRNTCgKICAgICAgICAgICAgU3RyaW5nID0+ICRBdXRvUmVzcG9uc2V7VGV4dH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRvIHRleHQvaHRtbCB0byB0ZXh0L3BsYWluIGNvbnZlcnQKICAgIGlmICggISRTZWxmLT57UmljaFRleHR9ICYmICRBdXRvUmVzcG9uc2V7Q29udGVudFR5cGV9ID1+IC90ZXh0XC9odG1sL2kgKSB7CiAgICAgICAgJEF1dG9SZXNwb25zZXtDb250ZW50VHlwZX0gPSAndGV4dC9wbGFpbic7CiAgICAgICAgJEF1dG9SZXNwb25zZXtUZXh0fSAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvQXNjaWkoCiAgICAgICAgICAgIFN0cmluZyA9PiAkQXV0b1Jlc3BvbnNle1RleHR9LAogICAgICAgICk7CiAgICB9CgogICAgIyByZXBsYWNlIHBsYWNlIGhvbGRlciBzdHVmZgogICAgJEF1dG9SZXNwb25zZXtUZXh0fSA9ICRTZWxmLT5fUmVwbGFjZSgKICAgICAgICBSaWNoVGV4dCA9PiAkU2VsZi0+e1JpY2hUZXh0fSwKICAgICAgICBUZXh0ICAgICA9PiAkQXV0b1Jlc3BvbnNle1RleHR9LAogICAgICAgIERhdGEgICAgID0+IHsKICAgICAgICAgICAgJXsgJFBhcmFte09yaWdIZWFkZXJ9IH0sCiAgICAgICAgICAgIEZyb20gPT4gJFBhcmFte09yaWdIZWFkZXJ9LT57VG99LAogICAgICAgICAgICBUbyAgID0+ICRQYXJhbXtPcmlnSGVhZGVyfS0+e0Zyb219LAogICAgICAgIH0sCiAgICAgICAgVGlja2V0RGF0YSAgICAgID0+IFwlVGlja2V0LAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBMYW5ndWFnZSAgICAgICAgPT4gJExhbmd1YWdlLAogICAgICAgIEFkZFRpbWV6b25lSW5mbyA9PiB7CiAgICAgICAgICAgIEF1dG9SZXNwb25zZSA9PiAxLAogICAgICAgIH0sCiAgICApOwogICAgJEF1dG9SZXNwb25zZXtTdWJqZWN0fSA9ICRTZWxmLT5fUmVwbGFjZSgKICAgICAgICBSaWNoVGV4dCA9PiAwLAogICAgICAgIFRleHQgICAgID0+ICRBdXRvUmVzcG9uc2V7U3ViamVjdH0sCiAgICAgICAgRGF0YSAgICAgPT4gewogICAgICAgICAgICAleyAkUGFyYW17T3JpZ0hlYWRlcn0gfSwKICAgICAgICAgICAgRnJvbSA9PiAkUGFyYW17T3JpZ0hlYWRlcn0tPntUb30sCiAgICAgICAgICAgIFRvICAgPT4gJFBhcmFte09yaWdIZWFkZXJ9LT57RnJvbX0sCiAgICAgICAgfSwKICAgICAgICBUaWNrZXREYXRhICAgICAgPT4gXCVUaWNrZXQsCiAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIExhbmd1YWdlICAgICAgICA9PiAkTGFuZ3VhZ2UsCiAgICAgICAgQWRkVGltZXpvbmVJbmZvID0+IHsKICAgICAgICAgICAgQXV0b1Jlc3BvbnNlID0+IDEsCiAgICAgICAgfSwKICAgICk7CgogICAgJEF1dG9SZXNwb25zZXtTdWJqZWN0fSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN1YmplY3RCdWlsZCgKICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgIFN1YmplY3QgICAgICA9PiAkQXV0b1Jlc3BvbnNle1N1YmplY3R9LAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTmV3JywKICAgICAgICBOb0NsZWFudXAgICAgPT4gMSwKICAgICk7CgogICAgIyBnZXQgc2VuZGVyIGF0dHJpYnV0ZXMgYmFzZWQgb24gYXV0byByZXNwb25zZSB0eXBlCiAgICBpZiAoICRBdXRvUmVzcG9uc2V7U3lzdGVtQWRkcmVzc0lEfSApIHsKCiAgICAgICAgbXkgJUFkZHJlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpLT5TeXN0ZW1BZGRyZXNzR2V0KAogICAgICAgICAgICBJRCA9PiAkQXV0b1Jlc3BvbnNle1N5c3RlbUFkZHJlc3NJRH0sCiAgICAgICAgKTsKCiAgICAgICAgJEF1dG9SZXNwb25zZXtTZW5kZXJBZGRyZXNzfSAgPSAkQWRkcmVzc3tOYW1lfTsKICAgICAgICAkQXV0b1Jlc3BvbnNle1NlbmRlclJlYWxuYW1lfSA9ICRBZGRyZXNze1JlYWxuYW1lfTsgICAgIyBub3RlIHRoYXQgU3lzdGVtQWRkcmVzcygpIGRvZXMgbm90IGNhcGl0YWxpemUgdGhlICduJwogICAgfQoKICAgICMgZ2V0IHNlbmRlciBhdHRyaWJ1dGVzIGJhc2VkIG9uIHF1ZXVlCiAgICBlbHNlIHsKCiAgICAgICAgbXkgJUFkZHJlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+R2V0U3lzdGVtQWRkcmVzcygKICAgICAgICAgICAgUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgICk7CgogICAgICAgICRBdXRvUmVzcG9uc2V7U2VuZGVyQWRkcmVzc30gID0gJEFkZHJlc3N7RW1haWx9OwogICAgICAgICRBdXRvUmVzcG9uc2V7U2VuZGVyUmVhbG5hbWV9ID0gJEFkZHJlc3N7UmVhbE5hbWV9OwogICAgfQoKICAgICMgYWRkIHVybHMgYW5kIHZlcmlmeSB0byBiZSBmdWxsIGh0bWwgZG9jdW1lbnQKICAgIGlmICggJFNlbGYtPntSaWNoVGV4dH0gKSB7CgogICAgICAgICRBdXRvUmVzcG9uc2V7VGV4dH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPkxpbmtRdW90ZSgKICAgICAgICAgICAgU3RyaW5nID0+ICRBdXRvUmVzcG9uc2V7VGV4dH0sCiAgICAgICAgKTsKCiAgICAgICAgJEF1dG9SZXNwb25zZXtUZXh0fSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+RG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICAgICAgQ2hhcnNldCA9PiAndXRmLTgnLAogICAgICAgICAgICBTdHJpbmcgID0+ICRBdXRvUmVzcG9uc2V7VGV4dH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJUF1dG9SZXNwb25zZTsKfQoKPWhlYWQyIE5vdGlmaWNhdGlvbkV2ZW50KCkKCnJlcGxhY2UgYWxsIE9UT0JPIHNtYXJ0IHRhZ3MgaW4gdGhlIG5vdGlmaWNhdGlvbiBib2R5IGFuZCBzdWJqZWN0CgogICAgbXkgJU5vdGlmaWNhdGlvbkV2ZW50ID0gJFRlbXBsYXRlR2VuZXJhdG9yT2JqZWN0LT5Ob3RpZmljYXRpb25FdmVudCgKICAgICAgICBUaWNrZXREYXRhICAgICAgICAgICAgPT4gJFRpY2tldERhdGFIYXNoUmVmLAogICAgICAgIFJlY2lwaWVudCAgICAgICAgICAgICA9PiAkVXNlckRhdGFIYXNoUmVmLCAgICAgICAgICAjIEFnZW50IG9yIEN1c3RvbWVyIGRhdGEgZ2V0IHJlc3VsdAogICAgICAgIE5vdGlmaWNhdGlvbiAgICAgICAgICA9PiAkTm90aWZpY2F0aW9uRGF0YUhhc2hSZWYsCiAgICAgICAgQ3VzdG9tZXJNZXNzYWdlUGFyYW1zID0+ICRBcnRpY2xlSGFzaFJlZiwgICAgICAgICAgICMgb3B0aW9uYWwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBOb3RpZmljYXRpb25FdmVudCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVGlja2V0RGF0YSBOb3RpZmljYXRpb24gUmVjaXBpZW50IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte05vdGlmaWNhdGlvbn0gKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vdGlmaWNhdGlvbiBpcyBpbnZhbGlkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJU5vdGlmaWNhdGlvbiA9ICV7ICRQYXJhbXtOb3RpZmljYXRpb259IH07CgogICAgIyBleGNoYW5naW5nIG9yaWdpbmFsIHJlZmVyZW5jZSBwcmV2ZW50IGl0IHRvIGdyb3cgdXAKICAgIGlmICggcmVmICRQYXJhbXtDdXN0b21lck1lc3NhZ2VQYXJhbXN9ICYmIHJlZiAkUGFyYW17Q3VzdG9tZXJNZXNzYWdlUGFyYW1zfSBlcSAnSEFTSCcgKSB7CiAgICAgICAgbXkgJUxvY2FsQ3VzdG9tZXJNZXNzYWdlUGFyYW1zID0gJXsgJFBhcmFte0N1c3RvbWVyTWVzc2FnZVBhcmFtc30gfTsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJNZXNzYWdlUGFyYW1zfSA9IFwlTG9jYWxDdXN0b21lck1lc3NhZ2VQYXJhbXM7CiAgICB9CgogICAgbXkgJEFydGljbGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7CgogICAgIyBHZXQgbGFzdCBhcnRpY2xlIGZyb20gY3VzdG9tZXIuCiAgICBteSBAQ3VzdG9tZXJBcnRpY2xlcyA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlTGlzdCgKICAgICAgICBUaWNrZXRJRCAgID0+ICRQYXJhbXtUaWNrZXREYXRhfS0+e1RpY2tldElEfSwKICAgICAgICBTZW5kZXJUeXBlID0+ICdjdXN0b21lcicsCiAgICAgICAgT25seUxhc3QgICA9PiAxLAogICAgKTsKCiAgICBteSAlQ3VzdG9tZXJBcnRpY2xlOwoKICAgIEFSVElDTEU6CiAgICBmb3IgbXkgJEFydGljbGUgKEBDdXN0b21lckFydGljbGVzKSB7CiAgICAgICAgbmV4dCBBUlRJQ0xFIGlmICEkQXJ0aWNsZS0+e0FydGljbGVJRH07CgogICAgICAgICVDdXN0b21lckFydGljbGUgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckFydGljbGUoICV7JEFydGljbGV9ICktPkFydGljbGVHZXQoCiAgICAgICAgICAgICV7JEFydGljbGV9LAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEdldCBsYXN0IGFydGljbGUgZnJvbSBhZ2VudC4KICAgIG15IEBBZ2VudEFydGljbGVzID0gJEFydGljbGVPYmplY3QtPkFydGljbGVMaXN0KAogICAgICAgIFRpY2tldElEICAgPT4gJFBhcmFte1RpY2tldERhdGF9LT57VGlja2V0SUR9LAogICAgICAgIFNlbmRlclR5cGUgPT4gJ2FnZW50JywKICAgICAgICBPbmx5TGFzdCAgID0+IDEsCiAgICApOwoKICAgIG15ICVBZ2VudEFydGljbGU7CgogICAgQUdFTlRBUlRJQ0xFOgogICAgZm9yIG15ICRBcnRpY2xlIChAQWdlbnRBcnRpY2xlcykgewogICAgICAgIG5leHQgQUdFTlRBUlRJQ0xFIGlmICEkQXJ0aWNsZS0+e0FydGljbGVJRH07CgogICAgICAgICVBZ2VudEFydGljbGUgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckFydGljbGUoICV7JEFydGljbGV9ICktPkFydGljbGVHZXQoCiAgICAgICAgICAgICV7JEFydGljbGV9LAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBJbmNsdWRlIHRoZSB0cmFuc21pc3Npb24gc3RhdHVzLCBpZiBhcnRpY2xlIGlzIGFuIGVtYWlsLgogICAgICAgIG15ICVDb21tdW5pY2F0aW9uQ2hhbm5lbCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDb21tdW5pY2F0aW9uQ2hhbm5lbCcpLT5DaGFubmVsR2V0KAogICAgICAgICAgICBDaGFubmVsSUQgPT4gJEFydGljbGUtPntDb21tdW5pY2F0aW9uQ2hhbm5lbElEfSwKICAgICAgICApOwogICAgICAgIGlmICggJENvbW11bmljYXRpb25DaGFubmVse0NoYW5uZWxOYW1lfSBlcSAnRW1haWwnICkgewogICAgICAgICAgICBteSAkVHJhbnNtaXNzaW9uU3RhdHVzID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JBcnRpY2xlKCAleyRBcnRpY2xlfSApLT5BcnRpY2xlVHJhbnNtaXNzaW9uU3RhdHVzKAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkVHJhbnNtaXNzaW9uU3RhdHVzICYmICRUcmFuc21pc3Npb25TdGF0dXMtPntNZXNzYWdlfSApIHsKICAgICAgICAgICAgICAgICRBZ2VudEFydGljbGV7VHJhbnNtaXNzaW9uU3RhdHVzTWVzc2FnZX0gPSAkVHJhbnNtaXNzaW9uU3RhdHVzLT57TWVzc2FnZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBBUlRJQ0xFOgogICAgZm9yIG15ICRBcnRpY2xlRGF0YSAoIFwlQ3VzdG9tZXJBcnRpY2xlLCBcJUFnZW50QXJ0aWNsZSApIHsKICAgICAgICBuZXh0IEFSVElDTEUgaWYgISRBcnRpY2xlRGF0YS0+e1RpY2tldElEfTsKICAgICAgICBuZXh0IEFSVElDTEUgaWYgISRBcnRpY2xlRGF0YS0+e0FydGljbGVJRH07CgogICAgICAgICMgR2V0IGFydGljbGUgcHJldmlldyBpbiBwbGFpbiB0ZXh0IGFuZCBzdG9yZSBpdCBhcyBCb2R5IGtleS4KICAgICAgICAkQXJ0aWNsZURhdGEtPntCb2R5fSA9ICRMYXlvdXRPYmplY3QtPkFydGljbGVQcmV2aWV3KAogICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRBcnRpY2xlRGF0YS0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEICA9PiAkQXJ0aWNsZURhdGEtPntBcnRpY2xlSUR9LAogICAgICAgICAgICBSZXN1bHRUeXBlID0+ICdwbGFpbicsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYWNjb3VudGVkIHRpbWUKICAgICAgICBteSAkQWNjb3VudGVkVGltZSA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlQWNjb3VudGVkVGltZUdldCgKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlRGF0YS0+e0FydGljbGVJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgdGhlIGFjY291bnRlZCB0aW1lIGFzIHBhcnQgb2YgdGhlIGFydGljbGVzIGluZm9ybWF0aW9uCiAgICAgICAgJEFydGljbGVEYXRhLT57VGltZVVuaXR9ID0gJEFjY291bnRlZFRpbWU7CiAgICB9CgogICAgIyBQb3B1bGF0ZSB0aGUgaGFzaCAnQ3VzdG9tZXJNZXNzYWdlUGFyYW1zJyB3aXRoIGFsbCB0aGUgY3VzdG9tZXItYXJ0aWNsZSBkYXRhCiAgICAjIGFuZCBvdmVyd3JpdGUgaXQgd2l0aCAnQ3VzdG9tZXJNZXNzYWdlUGFyYW1zJyBwYXNzZWQgaW4gdGhlIFBhcmFtcyAoYnVnICMxMzMyNSkuCiAgICAkUGFyYW17Q3VzdG9tZXJNZXNzYWdlUGFyYW1zfSA9IHsKICAgICAgICAlQ3VzdG9tZXJBcnRpY2xlLAogICAgICAgICV7ICRQYXJhbXtDdXN0b21lck1lc3NhZ2VQYXJhbXN9IHx8IHt9IH0sCiAgICB9OwoKICAgICMgZ2V0IHN5c3RlbSBkZWZhdWx0IGxhbmd1YWdlCiAgICBteSAkRGVmYXVsdExhbmd1YWdlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdEZWZhdWx0TGFuZ3VhZ2UnKSB8fCAnZW4nOwoKICAgIG15ICRMYW5ndWFnZXMgPSBbICRQYXJhbXtSZWNpcGllbnR9LT57VXNlckxhbmd1YWdlfSwgJERlZmF1bHRMYW5ndWFnZSwgJ2VuJyBdOwoKICAgIG15ICRMYW5ndWFnZTsKICAgIExBTkdVQUdFOgogICAgZm9yIG15ICRJdGVtICggQHskTGFuZ3VhZ2VzfSApIHsKICAgICAgICBuZXh0IExBTkdVQUdFIGlmICEkSXRlbTsKICAgICAgICBuZXh0IExBTkdVQUdFIGlmICEkTm90aWZpY2F0aW9ue01lc3NhZ2V9LT57JEl0ZW19OwoKICAgICAgICAjIHNldCBsYW5ndWFnZQogICAgICAgICRMYW5ndWFnZSA9ICRJdGVtOwogICAgICAgIGxhc3QgTEFOR1VBR0U7CiAgICB9CgogICAgIyBpZiBubyBsYW5ndWFnZSwgdGhlbiB0YWtlIHRoZSBmaXJzdCBvbmUgYXZhaWxhYmxlCiAgICBpZiAoICEkTGFuZ3VhZ2UgKSB7CiAgICAgICAgbXkgQE5vdGlmaWNhdGlvbkxhbmd1YWdlcyA9IHNvcnQga2V5cyAleyAkTm90aWZpY2F0aW9ue01lc3NhZ2V9IH07CiAgICAgICAgJExhbmd1YWdlID0gJE5vdGlmaWNhdGlvbkxhbmd1YWdlc1swXTsKICAgIH0KCiAgICAjIGNvcHkgdGhlIGNvcnJlY3QgbGFuZ3VhZ2UgbWVzc2FnZSBhdHRyaWJ1dGVzIHRvIGEgZmxhdCBzdHJ1Y3R1cmUKICAgIGZvciBteSAkQXR0cmlidXRlIChxdyhTdWJqZWN0IEJvZHkgQ29udGVudFR5cGUpKSB7CiAgICAgICAgJE5vdGlmaWNhdGlvbnskQXR0cmlidXRlfSA9ICROb3RpZmljYXRpb257TWVzc2FnZX0tPnskTGFuZ3VhZ2V9LT57JEF0dHJpYnV0ZX07CiAgICB9CgogICAgIyBHZXQgY3VzdG9tZXIgYXJ0aWNsZSBmaWVsZHMuCiAgICBteSAlQ3VzdG9tZXJBcnRpY2xlRmllbGRzOwoKICAgIGlmICglQ3VzdG9tZXJBcnRpY2xlKSB7CiAgICAgICAgJUN1c3RvbWVyQXJ0aWNsZUZpZWxkcyA9ICRMYXlvdXRPYmplY3QtPkFydGljbGVGaWVsZHMoCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkQ3VzdG9tZXJBcnRpY2xle1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRDdXN0b21lckFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgQVJUSUNMRV9GSUVMRDoKICAgIGZvciBteSAkQXJ0aWNsZUZpZWxkICggc29ydCBrZXlzICVDdXN0b21lckFydGljbGVGaWVsZHMgKSB7CiAgICAgICAgbmV4dCBBUlRJQ0xFX0ZJRUxEIGlmICFkZWZpbmVkICRDdXN0b21lckFydGljbGVGaWVsZHN7JEFydGljbGVGaWVsZH0tPntWYWx1ZX07CgogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFte0N1c3RvbWVyTWVzc2FnZVBhcmFtc30tPnskQXJ0aWNsZUZpZWxkfSApIHsKICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyTWVzc2FnZVBhcmFtc30tPnskQXJ0aWNsZUZpZWxkfSA9ICRDdXN0b21lckFydGljbGVGaWVsZHN7JEFydGljbGVGaWVsZH0tPntWYWx1ZX07CiAgICAgICAgfQogICAgICAgIGNob21wICRQYXJhbXtDdXN0b21lck1lc3NhZ2VQYXJhbXN9LT57JEFydGljbGVGaWVsZH07CiAgICB9CgogICAgIyBmb3JtYXQgYm9keSAob25seSBpZiBsb25nZXIgdGhlIDg2IGNoYXJzKQogICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJNZXNzYWdlUGFyYW1zfS0+e0JvZHl9ICkgewogICAgICAgIGlmICggbGVuZ3RoICRQYXJhbXtDdXN0b21lck1lc3NhZ2VQYXJhbXN9LT57Qm9keX0gPiA4NiApIHsKICAgICAgICAgICAgbXkgQExpbmVzID0gc3BsaXQgL1xuLywgJFBhcmFte0N1c3RvbWVyTWVzc2FnZVBhcmFtc30tPntCb2R5fTsKICAgICAgICAgICAgTElORToKICAgICAgICAgICAgZm9yIG15ICRMaW5lIChATGluZXMpIHsKICAgICAgICAgICAgICAgIG15ICRMaW5lV3JhcHBlZCA9ICRMaW5lID1+IHMvKF4+Lit8Lns0LDg2fSkoPzpcc3xceikvJDFcbi9nbTsKCiAgICAgICAgICAgICAgICBuZXh0IExJTkUgaWYgJExpbmVXcmFwcGVkOwoKICAgICAgICAgICAgICAgICMgaWYgdGhlIHJlZ2V4IGRvZXMgbm90IG1hdGNoIHRoZW4gd2UgbmVlZAogICAgICAgICAgICAgICAgIyB0byBhZGQgdGhlIG1pc3NpbmcgbmV3IGxpbmUgb2YgdGhlIHNwbGl0CiAgICAgICAgICAgICAgICAjIGVsc2Ugd2Ugd2lsbCBsb3NlIGUuZy4gZW1wdHkgbGluZXMgb2YgdGhlIGJvZHkuCiAgICAgICAgICAgICAgICAjIChidWcjMTA2NzkpCiAgICAgICAgICAgICAgICAkTGluZSAuPSAiXG4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtDdXN0b21lck1lc3NhZ2VQYXJhbXN9LT57Qm9keX0gPSBqb2luICcnLCBATGluZXM7CiAgICAgICAgfQogICAgfQoKICAgICMgZmlsbCB1cCByZXF1aXJlZCBhdHRyaWJ1dGVzCiAgICBmb3IgbXkgJFRleHQgKHF3KFN1YmplY3QgQm9keSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17Q3VzdG9tZXJNZXNzYWdlUGFyYW1zfS0+eyRUZXh0fSApIHsKCiAgICAgICAgICAgICMgU2V0IHRvIGxhc3QgY3VzdG9tZXIgYXJ0aWNsZSBhdHRyaWJ1dGUgaWYgaXQgaXMgZW1wdHkgc3RyaW5nLgogICAgICAgICAgICAjIEZvciBleGFtcGxlLCBpZiBCb2R5IGlzIGVtcHR5IHN0cmluZyAobm90IHVuZGVmISksIGl0IGlzIG1heWJlIHNlbnQgZnJvbSBOb3RpZmljYXRpb25Pd25lclVwZGF0ZSBldmVudAogICAgICAgICAgICAjIGFuZCBvdmVycmlkZXMgbGFzdCBjdXN0b21lciBhcnRpY2xlIGJvZHkgKGluICVDdXN0b21lckFydGljbGUpIGFib3ZlIC0gc2VlIGJ1ZyMxNDY3OC4KICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyTWVzc2FnZVBhcmFtc30tPnskVGV4dH0gPSAkQ3VzdG9tZXJBcnRpY2xleyRUZXh0fSB8fCAiTm8gJFRleHQiOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkU3RhcnQgPSAnPCc7CiAgICBteSAkRW5kICAgPSAnPic7CiAgICBpZiAoICROb3RpZmljYXRpb257Q29udGVudFR5cGV9ID1+IG17dGV4dFwvaHRtbH0gKSB7CiAgICAgICAgJFN0YXJ0ID0gJyZsdDsnOwogICAgICAgICRFbmQgICA9ICcmZ3Q7JzsKICAgIH0KCiAgICAjIHJlcGxhY2UgPE9UT0JPX0NVU1RPTUVSX0RBVEFfKj4gdGFncyBlYXJseSBmcm9tIEN1c3RvbWVyTWVzc2FnZVBhcmFtcywgdGhlIHJlc3RzIHdpbGwgYmUgcmVwbGFjZWQKICAgICMgYnkgdGlja2V0IGN1c3RvbWVyIHVzZXIKICAgIEtFWToKICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7ICRQYXJhbXtDdXN0b21lck1lc3NhZ2VQYXJhbXN9IHx8IHt9IH0gKSB7CgogICAgICAgIG5leHQgS0VZIGlmICEkUGFyYW17Q3VzdG9tZXJNZXNzYWdlUGFyYW1zfS0+eyRLZXl9OwoKICAgICAgICAkTm90aWZpY2F0aW9ue0JvZHl9ICAgID1+IHMvJHtTdGFydH1PVE9CT19DVVNUT01FUl9EQVRBXyRLZXkke0VuZH0vJFBhcmFte0N1c3RvbWVyTWVzc2FnZVBhcmFtc30tPnskS2V5fS9naTsKICAgICAgICAkTm90aWZpY2F0aW9ue1N1YmplY3R9ID1+IHMvPE9UT0JPX0NVU1RPTUVSX0RBVEFfJEtleT4vJFBhcmFte0N1c3RvbWVyTWVzc2FnZVBhcmFtc30tPnskS2V5fXskS2V5fS9naTsKICAgIH0KCiAgICAjIGRvIHRleHQvcGxhaW4gdG8gdGV4dC9odG1sIGNvbnZlcnQKICAgIGlmICggJFNlbGYtPntSaWNoVGV4dH0gJiYgJE5vdGlmaWNhdGlvbntDb250ZW50VHlwZX0gPX4gL3RleHRcL3BsYWluL2kgKSB7CiAgICAgICAgJE5vdGlmaWNhdGlvbntDb250ZW50VHlwZX0gPSAndGV4dC9odG1sJzsKICAgICAgICAkTm90aWZpY2F0aW9ue0JvZHl9ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9IVE1MKAogICAgICAgICAgICBTdHJpbmcgPT4gJE5vdGlmaWNhdGlvbntCb2R5fSwKICAgICAgICApOwogICAgfQoKICAgICMgZG8gdGV4dC9odG1sIHRvIHRleHQvcGxhaW4gY29udmVydAogICAgaWYgKCAhJFNlbGYtPntSaWNoVGV4dH0gJiYgJE5vdGlmaWNhdGlvbntDb250ZW50VHlwZX0gPX4gL3RleHRcL2h0bWwvaSApIHsKICAgICAgICAkTm90aWZpY2F0aW9ue0NvbnRlbnRUeXBlfSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICAkTm90aWZpY2F0aW9ue0JvZHl9ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9Bc2NpaSgKICAgICAgICAgICAgU3RyaW5nID0+ICROb3RpZmljYXRpb257Qm9keX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBub3RpZnkgdGV4dHMKICAgIGZvciBteSAkVGV4dCAocXcoU3ViamVjdCBCb2R5KSkgewogICAgICAgIGlmICggISROb3RpZmljYXRpb257JFRleHR9ICkgewogICAgICAgICAgICAkTm90aWZpY2F0aW9ueyRUZXh0fSA9ICJObyBOb3RpZmljYXRpb24gJFRleHQgZm9yICRQYXJhbXtUeXBlfSBmb3VuZCEiOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJlcGxhY2UgcGxhY2UgaG9sZGVyIHN0dWZmCiAgICAkTm90aWZpY2F0aW9ue0JvZHl9ID0gJFNlbGYtPl9SZXBsYWNlKAogICAgICAgIFJpY2hUZXh0ICAgICAgICA9PiAkU2VsZi0+e1JpY2hUZXh0fSwKICAgICAgICBUZXh0ICAgICAgICAgICAgPT4gJE5vdGlmaWNhdGlvbntCb2R5fSwKICAgICAgICBSZWNpcGllbnQgICAgICAgPT4gJFBhcmFte1JlY2lwaWVudH0sCiAgICAgICAgRGF0YSAgICAgICAgICAgID0+ICRQYXJhbXtDdXN0b21lck1lc3NhZ2VQYXJhbXN9LAogICAgICAgIERhdGFBZ2VudCAgICAgICA9PiBcJUFnZW50QXJ0aWNsZSwKICAgICAgICBUaWNrZXREYXRhICAgICAgPT4gJFBhcmFte1RpY2tldERhdGF9LAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBMYW5ndWFnZSAgICAgICAgPT4gJExhbmd1YWdlLAogICAgICAgIEFkZFRpbWV6b25lSW5mbyA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkV2ZW50ID0+IDEsCiAgICAgICAgfSwKICAgICk7CgogICAgJE5vdGlmaWNhdGlvbntTdWJqZWN0fSA9ICRTZWxmLT5fUmVwbGFjZSgKICAgICAgICBSaWNoVGV4dCAgICAgICAgPT4gMCwKICAgICAgICBUZXh0ICAgICAgICAgICAgPT4gJE5vdGlmaWNhdGlvbntTdWJqZWN0fSwKICAgICAgICBSZWNpcGllbnQgICAgICAgPT4gJFBhcmFte1JlY2lwaWVudH0sCiAgICAgICAgRGF0YSAgICAgICAgICAgID0+ICRQYXJhbXtDdXN0b21lck1lc3NhZ2VQYXJhbXN9LAogICAgICAgIERhdGFBZ2VudCAgICAgICA9PiBcJUFnZW50QXJ0aWNsZSwKICAgICAgICBUaWNrZXREYXRhICAgICAgPT4gJFBhcmFte1RpY2tldERhdGF9LAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBMYW5ndWFnZSAgICAgICAgPT4gJExhbmd1YWdlLAogICAgICAgIEFkZFRpbWV6b25lSW5mbyA9PiB7CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkV2ZW50ID0+IDEsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBLZWVwIHRoZSAib3JpZ2luYWwiICh1bm1vZGlmaWVkKSBzdWJqZWN0IGFuZCBib2R5IGZvciBsYXRlciB1c2UuCiAgICAkTm90aWZpY2F0aW9ue09yaWdpbmFsU3ViamVjdH0gPSAkTm90aWZpY2F0aW9ue1N1YmplY3R9OwogICAgJE5vdGlmaWNhdGlvbntPcmlnaW5hbEJvZHl9ICAgID0gJE5vdGlmaWNhdGlvbntCb2R5fTsKCiAgICAkTm90aWZpY2F0aW9ue1N1YmplY3R9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTdWJqZWN0QnVpbGQoCiAgICAgICAgVGlja2V0TnVtYmVyID0+ICRQYXJhbXtUaWNrZXREYXRhfS0+e1RpY2tldE51bWJlcn0sCiAgICAgICAgU3ViamVjdCAgICAgID0+ICROb3RpZmljYXRpb257U3ViamVjdH0gfHwgJycsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOZXcnLAogICAgKTsKCiAgICAjIGFkZCBVUkxzIGFuZCB2ZXJpZnkgdG8gYmUgZnVsbCBIVE1MIGRvY3VtZW50CiAgICBpZiAoICRTZWxmLT57UmljaFRleHR9ICkgewoKICAgICAgICAkTm90aWZpY2F0aW9ue0JvZHl9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5MaW5rUXVvdGUoCiAgICAgICAgICAgIFN0cmluZyA9PiAkTm90aWZpY2F0aW9ue0JvZHl9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICVOb3RpZmljYXRpb247Cn0KCj1iZWdpbiBJbnRlcm5hbDoKCj1oZWFkMiBfUmVwbGFjZSgpCgpyZXBsYWNlIHRoZSBwbGFjZWhvbGRlcnMgaW4gdGhlIHRleHQKCj1jdXQKCnN1YiBfUmVwbGFjZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KFRleHQgUmljaFRleHQgRGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JF99ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkXyEiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgZm9yIG1haWx0byBsaW5rcwogICAgIyBzaW5jZSB0aGUgc3ViamVjdCBhbmQgYm9keSBvZiB0aG9zZSBtYWlsdG8gbGlua3MgYXJlCiAgICAjIHVyaSBlc2NhcGVkIHdlIGhhdmUgdG8gdXJpIHVuZXNjYXBlIHRoZW0sIHJlcGxhY2UKICAgICMgcG9zc2libGUgcGxhY2Vob2xkZXJzIGFuZCB0aGVuIHJlLXVyaSBlc2NhcGUgdGhlbQogICAgJFBhcmFte1RleHR9ID1+IHN7CiAgICAgICAgKGhyZWY9Im1haWx0bzpbXlw/XStcPykoW14iXSsiKQogICAgfQogICAgewogICAgICAgIG15ICRNYWlsVG9IcmVmICAgICAgICA9ICQxOwogICAgICAgIG15ICRNYWlsVG9IcmVmQ29udGVudCA9ICQyOwoKICAgICAgICAjIE5lc3RlZCBzLy8vZWd4IQogICAgICAgICRNYWlsVG9IcmVmQ29udGVudCA9fiBzewogICAgICAgICAgICAoKD86c3ViamVjdHxib2R5KT0pKC4rPykoInwmKQogICAgICAgIH0KICAgICAgICB7CiAgICAgICAgICAgIG15ICRTdWJqZWN0T3JCb2R5UHJlZml4ICA9ICQxOwogICAgICAgICAgICBteSAkU3ViamVjdE9yQm9keUNvbnRlbnQgPSAkMjsKICAgICAgICAgICAgbXkgJFN1YmplY3RPckJvZHlTdWZmaXggID0gJDM7CgogICAgICAgICAgICBteSAkU3ViamVjdE9yQm9keUNvbnRlbnRVbmVzY2FwZWQgPSB1cmlfdW5lc2NhcGUoJFN1YmplY3RPckJvZHlDb250ZW50KTsKCiAgICAgICAgICAgIG15ICRTdWJqZWN0T3JCb2R5Q29udGVudFJlcGxhY2VkID0gJFNlbGYtPl9SZXBsYWNlKAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVGV4dCAgICAgPT4gJFN1YmplY3RPckJvZHlDb250ZW50VW5lc2NhcGVkLAogICAgICAgICAgICAgICAgUmljaFRleHQgPT4gMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRTdWJqZWN0T3JCb2R5Q29udGVudEVzY2FwZWQgPSB1cmlfZXNjYXBlX3V0ZjgoJFN1YmplY3RPckJvZHlDb250ZW50UmVwbGFjZWQpOwoKICAgICAgICAgICAgJFN1YmplY3RPckJvZHlQcmVmaXggLiAkU3ViamVjdE9yQm9keUNvbnRlbnRFc2NhcGVkIC4gJFN1YmplY3RPckJvZHlTdWZmaXg7CiAgICAgICAgfWVneDsKCiAgICAgICAgJE1haWxUb0hyZWYgLiAkTWFpbFRvSHJlZkNvbnRlbnQ7CiAgICB9ZWd4OwoKICAgIG15ICggJFN0YXJ0LCAkRW5kICkgPSAoICc8JywgJz4nICk7CiAgICBpZiAoICRQYXJhbXtSaWNoVGV4dH0gKSB7CiAgICAgICAgKCAkU3RhcnQsICRFbmQgKSA9ICggJyZsdDsnLCAnJmd0OycgKTsKICAgICAgICAkUGFyYW17VGV4dH0gPX4gcy8oXG58XHIpLy9nOwogICAgfQoKICAgIG15ICVUaWNrZXQ7CiAgICBpZiAoICRQYXJhbXtUaWNrZXREYXRhfSApIHsKICAgICAgICAlVGlja2V0ID0gJFBhcmFte1RpY2tldERhdGF9LT4lKjsKICAgIH0KCiAgICBteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwoKICAgICMgRGV0ZXJtaW5lIHJlY2lwaWVudCdzIHRpbWV6b25lIGlmIG5lZWRlZC4KICAgIG15ICRSZWNpcGllbnRUaW1lWm9uZTsKICAgIGlmICggJFBhcmFte0FkZFRpbWV6b25lSW5mb30gKSB7CiAgICAgICAgJFJlY2lwaWVudFRpbWVab25lID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyktPk9UT0JPVGltZVpvbmVHZXQoKTsKCiAgICAgICAgbXkgJUN1c3RvbWVyVXNlcjsKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJVRpY2tldCApICYmICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAlQ3VzdG9tZXJVc2VyID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCggVXNlciA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSApOwogICAgICAgIH0KCiAgICAgICAgbXkgJVVzZXJQcmVmZXJlbmNlczsKCiAgICAgICAgaWYgKCAkUGFyYW17QWRkVGltZXpvbmVJbmZvfS0+e05vdGlmaWNhdGlvbkV2ZW50fSAmJiAkUGFyYW17UmVjaXBpZW50fS0+e1R5cGV9IGVxICdBZ2VudCcgKSB7CiAgICAgICAgICAgICVVc2VyUHJlZmVyZW5jZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17UmVjaXBpZW50fS0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgKICAgICAgICAgICAgJFBhcmFte0FkZFRpbWV6b25lSW5mb30tPntOb3RpZmljYXRpb25FdmVudH0KICAgICAgICAgICAgJiYgJFBhcmFte1JlY2lwaWVudH0tPntUeXBlfSBlcSAnQ3VzdG9tZXInCiAgICAgICAgICAgICYmICRQYXJhbXtSZWNpcGllbnR9LT57VXNlcklEfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAlVXNlclByZWZlcmVuY2VzID0gJEN1c3RvbWVyVXNlck9iamVjdC0+R2V0UHJlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1JlY2lwaWVudH0tPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICRQYXJhbXtBZGRUaW1lem9uZUluZm99LT57QXV0b1Jlc3BvbnNlfQogICAgICAgICAgICAmJiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfQogICAgICAgICAgICAmJiBJc0hhc2hSZWZXaXRoRGF0YSggXCVDdXN0b21lclVzZXIgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAlVXNlclByZWZlcmVuY2VzID0gJEN1c3RvbWVyVXNlck9iamVjdC0+R2V0UHJlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFRpY2tldHtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRVc2VyUHJlZmVyZW5jZXN7VXNlclRpbWVab25lfSApIHsKICAgICAgICAgICAgJFJlY2lwaWVudFRpbWVab25lID0gJFVzZXJQcmVmZXJlbmNlc3tVc2VyVGltZVpvbmV9OwogICAgICAgIH0KICAgIH0KCiAgICAjIFJlcGxhY2UgVW5peCB0aW1lIGZvcm1hdCB0YWdzLgogICAgIyBJZiBsYW5ndWFnZSBpcyBkZWZpbmVkLCB0aGV5IHdpbGwgYmUgY29udmVydGVkIGludG8gYSBjb3JyZWN0IGZvcm1hdCBpbiBiZWxvdyBJRiBzdGF0ZW1lbnQuCiAgICBmb3IgbXkgJFVuaXhGb3JtYXRUaW1lICgKICAgICAgICBxdyhSZWFsVGlsbFRpbWVOb3RVc2VkIEVzY2FsYXRpb25SZXNwb25zZVRpbWUgRXNjYWxhdGlvblVwZGF0ZVRpbWUgRXNjYWxhdGlvblNvbHV0aW9uVGltZSkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCAkVGlja2V0eyRVbml4Rm9ybWF0VGltZX0gKSB7CiAgICAgICAgICAgICRUaWNrZXR7JFVuaXhGb3JtYXRUaW1lfSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXBvY2ggPT4gJFRpY2tldHskVW5peEZvcm1hdFRpbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKS0+VG9TdHJpbmcoKTsKICAgICAgICB9CiAgICB9CgogICAgIyB0cmFuc2xhdGUgdGlja2V0IHZhbHVlcyBpZiBuZWVkZWQKICAgIGlmICggJFBhcmFte0xhbmd1YWdlfSApIHsKCiAgICAgICAgbXkgJExhbmd1YWdlT2JqZWN0ID0gS2VybmVsOjpMYW5ndWFnZS0+bmV3KAogICAgICAgICAgICBVc2VyTGFuZ3VhZ2UgPT4gJFBhcmFte0xhbmd1YWdlfSwKICAgICAgICApOwoKICAgICAgICAjIFRyYW5zbGF0ZSB0aGUgZGlmZmVyZW50IHZhbHVlcy4KICAgICAgICBmb3IgbXkgJEZpZWxkIChxdyhUeXBlIFN0YXRlIFN0YXRlVHlwZSBMb2NrIFByaW9yaXR5KSkgewogICAgICAgICAgICAkVGlja2V0eyRGaWVsZH0gPSAkTGFuZ3VhZ2VPYmplY3QtPlRyYW5zbGF0ZSggJFRpY2tldHskRmllbGR9ICk7CiAgICAgICAgfQoKICAgICAgICAjIFRyYW5zZm9ybSB0aGUgZGF0ZSB2YWx1ZXMgZnJvbSB0aGUgdGlja2V0IGRhdGEgKGJ1dCBub3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWVzKS4KICAgICAgICBBVFRSSUJVVEU6CiAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBzb3J0IGtleXMgJVRpY2tldCApIHsKICAgICAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgJEF0dHJpYnV0ZSA9fiBteyBcQSBEeW5hbWljRmllbGRfIH14bXM7CiAgICAgICAgICAgIG5leHQgQVRUUklCVVRFIGlmICEkVGlja2V0eyRBdHRyaWJ1dGV9OwoKICAgICAgICAgICAgaWYgKCAkVGlja2V0eyRBdHRyaWJ1dGV9ID1+IG17XEEoXGRcZFxkXGQpLShcZFxkKS0oXGRcZClccyhcZFxkKTooXGRcZCk6KFxkXGQpXHp9eGkgKSB7CgogICAgICAgICAgICAgICAgIyBDaGFuZ2UgdGltZSB0byByZWNpcGllbnQncyB0aW1lem9uZSBpZiBuZWVkZWQKICAgICAgICAgICAgICAgICMgYW5kIGxhdGVyIGFwcGVuZCB0aW1lem9uZSBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgICAgICMgRm9yIG1vcmUgaW5mb3JtYXRpb24sCiAgICAgICAgICAgICAgICAjIHNlZSBidWcjMTM4NjUgKGh0dHBzOi8vYnVncy5vdHJzLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM4NjUpCiAgICAgICAgICAgICAgICAjIGFuZCBidWcjMTQyNzAgKGh0dHBzOi8vYnVncy5vdHJzLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQyNzApLgogICAgICAgICAgICAgICAgaWYgKCRSZWNpcGllbnRUaW1lWm9uZSkgewogICAgICAgICAgICAgICAgICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRUaWNrZXR7JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkRGF0ZVRpbWVPYmplY3QtPlRvVGltZVpvbmUoIFRpbWVab25lID0+ICRSZWNpcGllbnRUaW1lWm9uZSApOwogICAgICAgICAgICAgICAgICAgICRUaWNrZXR7JEF0dHJpYnV0ZX0gPSAkRGF0ZVRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFRpY2tldHskQXR0cmlidXRlfSA9ICRMYW5ndWFnZU9iamVjdC0+Rm9ybWF0VGltZVN0cmluZygKICAgICAgICAgICAgICAgICAgICAkVGlja2V0eyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgICAgICdEYXRlRm9ybWF0JywKICAgICAgICAgICAgICAgICAgICAnTm9TZWNvbmRzJywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBBcHBlbmQgdGltZXpvbmUgaW5mb3JtYXRpb24gaWYgbmVlZGVkLgogICAgICAgICAgICAgICAgaWYgKCRSZWNpcGllbnRUaW1lWm9uZSkgewogICAgICAgICAgICAgICAgICAgICRUaWNrZXR7JEF0dHJpYnV0ZX0gLj0gIiAoJFJlY2lwaWVudFRpbWVab25lKSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRMb2NhbExheW91dE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQtPm5ldygKICAgICAgICAgICAgTGFuZyA9PiAkUGFyYW17TGFuZ3VhZ2V9LAogICAgICAgICk7CgogICAgICAgICMgQ29udmVydCB0YWdzIGluIHNlY29uZHMgdG8gbW9yZSByZWFkYWJsZSBhcHByb3ByaWF0ZSBmb3JtYXQgaWYgbGFuZ3VhZ2UgaXMgZGVmaW5lZC4KICAgICAgICBmb3IgbXkgJFRpbWVJblNlY29uZHMgKAogICAgICAgICAgICBxdyhVbnRpbFRpbWUgRXNjYWxhdGlvblRpbWVXb3JraW5nVGltZSBFc2NhbGF0aW9uVGltZSBGaXJzdFJlc3BvbnNlVGltZVdvcmtpbmdUaW1lIEZpcnN0UmVzcG9uc2VUaW1lIFVwZGF0ZVRpbWVXb3JraW5nVGltZQogICAgICAgICAgICBVcGRhdGVUaW1lIFNvbHV0aW9uVGltZVdvcmtpbmdUaW1lIFNvbHV0aW9uVGltZSkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCAkVGlja2V0eyRUaW1lSW5TZWNvbmRzfSApIHsKICAgICAgICAgICAgICAgICRUaWNrZXR7JFRpbWVJblNlY29uZHN9ID0gJExvY2FsTGF5b3V0T2JqZWN0LT5DdXN0b21lckFnZSgKICAgICAgICAgICAgICAgICAgICBBZ2UgICA9PiAkVGlja2V0eyRUaW1lSW5TZWNvbmRzfSwKICAgICAgICAgICAgICAgICAgICBTcGFjZSA9PiAnICcKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJVF1ZXVlOwogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gKSB7CiAgICAgICAgJVF1ZXVlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlR2V0KAogICAgICAgICAgICBJRCA9PiAkUGFyYW17UXVldWVJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIFJlcGxhY2UgY29uZmlnIG9wdGlvbnMuCiAgICBteSAkVGFnID0gJFN0YXJ0IC4gJ09UT0JPX0NPTkZJR18nOwogICAgJFBhcmFte1RleHR9ID1+IHN7CiAgICAgICAgJFRhZwogICAgICAgICAgICAjIHRoZSBrZXkgZm9yIHRoZSBjb25maWcKICAgICAgICAgICAgKD88a2V5Pi4rPykKICAgICAgICAkRW5kCiAgICB9CiAgICB7CiAgICAgICAgbXkgJEtleSAgID0gJCt7a2V5fTsKICAgICAgICBteSAkVmFsdWUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJEtleSkgLy8gJyc7CgogICAgICAgICMgTWFzayBzZW5zaXRpdmUgY29uZmlnIG9wdGlvbnMuCiAgICAgICAgbXkgJFJlcGxhY2UgPSAkU2VsZi0+X01hc2tTZW5zaXRpdmVWYWx1ZSgKICAgICAgICAgICAgS2V5ICAgICAgPT4gJEtleSwKICAgICAgICAgICAgVmFsdWUgICAgPT4gJFZhbHVlLAogICAgICAgICAgICBJc0NvbmZpZyA9PiAxLAogICAgICAgICk7CgogICAgICAgICRSZXBsYWNlOwogICAgfWVneDsKCiAgICAjIGNsZWFudXAKICAgICRQYXJhbXtUZXh0fSA9fiBzLyRUYWcuKz8kRW5kLy0vZ2k7CgogICAgbXkgJVJlY2lwaWVudCA9ICV7ICRQYXJhbXtSZWNpcGllbnR9IHx8IHt9IH07CgogICAgIyBnZXQgdXNlciBvYmplY3QKICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICBpZiAoICElUmVjaXBpZW50ICYmICRQYXJhbXtSZWNpcGllbnRJRH0gKSB7CgogICAgICAgICVSZWNpcGllbnQgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1JlY2lwaWVudElEfSwKICAgICAgICAgICAgTm9PdXRPZk9mZmljZSA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBtb2RpZnkgJFBhcmFte1RleHR9CiAgICBteSAkSGFzaEdsb2JhbFJlcGxhY2UgPSBzdWIgewogICAgICAgIG15ICggJFRhZywgJUggKSA9IEBfOwoKICAgICAgICAjIEdlbmVyYXRlIG9uZSBzaW5nbGUgbWF0Y2hpbmcgc3RyaW5nIGZvciBhbGwga2V5cyB0byBzYXZlIHBlcmZvcm1hbmNlLgogICAgICAgIG15ICRLZXlzID0gam9pbiAnfCcsIG1hcCB7cXVvdGVtZXRhfSBncmVwIHsgZGVmaW5lZCAkSHskX30gfSBrZXlzICVIOwoKICAgICAgICAjIFNldCBhbGwga2V5cyBhcyBsb3dlcmNhc2UgdG8gYmUgYWJsZSB0byBtYXRjaCBjYXNlIGluc2Vuc2l0aXZlLAogICAgICAgICMgICBlLiBnLiA8T1RPQk9fQ1VTVE9NRVJfRnJvbT4gYW5kIDxPVE9CT19DVVNUT01FUl9GUk9NPi4KICAgICAgICAjICAgQWxzbyBtYXNrIGFueSB2YWx1ZXMgY29udGFpbmluZyBzZW5zaXRpdmUgZGF0YS4KICAgICAgICAlSCA9IG1hcCB7CiAgICAgICAgICAgIGxjICRfID0+ICRTZWxmLT5fTWFza1NlbnNpdGl2ZVZhbHVlKAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJF8sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkSHskX30sCiAgICAgICAgICAgICkKICAgICAgICB9IHNvcnQga2V5cyAlSDsKCiAgICAgICAgIyBJZiB0YWcgaXMgJ09UT0JPX0NVU1RPTUVSXycgYWRkIHRoZSBib2R5IGFsaWFzICdlbWFpbC9ub3RlJyB0byBiZSByZXBsYWNlZC4KICAgICAgICBpZiAoICRUYWcgPX4gbS9PVE9CT18oQ1VTVE9NRVJ8QUdFTlQpXy8gKSB7CiAgICAgICAgICAgIEtFWToKICAgICAgICAgICAgZm9yIG15ICRLZXkgKHF3KCBlbWFpbCBub3RlICkpIHsKICAgICAgICAgICAgICAgIG15ICRWYWx1ZSA9ICRIeyRLZXl9OwoKICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmIGRlZmluZWQoJFZhbHVlKTsKCiAgICAgICAgICAgICAgICAkSHskS2V5fSA9ICRIeydib2R5J307CiAgICAgICAgICAgICAgICAkS2V5cyAuPSAnfCcgLiB1Y2ZpcnN0ICRLZXk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRQYXJhbXtUZXh0fSA9fiBzewogICAgICAgICAgICAjIGdyb3VwaW5nIHJlcXVpcmVkIGhlcmUsIGFzIHdlIG1pZ2h0IGhhdmUgYWx0ZXJuYXRpb25zCiAgICAgICAgICAgICg/OiRUYWcpCiAgICAgICAgICAgICAgICAjIGNhc2UgaW5zZW5zaXRpdiBrZXlzCiAgICAgICAgICAgICAgICAoPzxrZXk+JEtleXMpCiAgICAgICAgICAgICRFbmQKICAgICAgICB9CiAgICAgICAgewogICAgICAgICAgICBteSAkS2V5ID0gJCt7a2V5fTsKICAgICAgICAgICAgJEh7IGxjICRLZXkgfQogICAgICAgIH14aWVnOwogICAgfTsKCiAgICAjIGdldCByZWNpcGllbnQgZGF0YSBhbmQgcmVwbGFjZSBpdCB3aXRoIDxPVE9CT18uLi4KICAgICRUYWcgPSAkU3RhcnQgLiAnT1RPQk9fJzsKCiAgICAjIGluY2x1ZGUgbW9yZSByZWFkYWJsZSB0YWcgPE9UT0JPX05PVElGSUNBVElPTl9SRUNJUElFTlQKICAgIG15ICRSZWNpcGllbnRUYWcgPSAkU3RhcnQgLiAnT1RPQk9fTk9USUZJQ0FUSU9OX1JFQ0lQSUVOVF8nOwoKICAgIGlmICglUmVjaXBpZW50KSB7CgogICAgICAgICMgSFRNTCBxdW90aW5nIG9mIGNvbnRlbnQKICAgICAgICBpZiAoICRQYXJhbXtSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgIEFUVFJJQlVURToKICAgICAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBzb3J0IGtleXMgJVJlY2lwaWVudCApIHsKICAgICAgICAgICAgICAgIG5leHQgQVRUUklCVVRFIGlmICEkUmVjaXBpZW50eyRBdHRyaWJ1dGV9OwogICAgICAgICAgICAgICAgJFJlY2lwaWVudHskQXR0cmlidXRlfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9IVE1MKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUmVjaXBpZW50eyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJEhhc2hHbG9iYWxSZXBsYWNlLT4oICIkVGFnfCRSZWNpcGllbnRUYWciLCAlUmVjaXBpZW50ICk7CiAgICB9CgogICAgIyBjbGVhbnVwCiAgICAkUGFyYW17VGV4dH0gPX4gcy8kUmVjaXBpZW50VGFnLis/JEVuZC8tL2dpOwoKICAgICMgZ2V0IG93bmVyIGRhdGEgYW5kIHJlcGxhY2UgaXQgd2l0aCA8T1RPQk9fT1dORVJfLi4uCiAgICAkVGFnID0gJFN0YXJ0IC4gJ09UT0JPX09XTkVSXyc7CgogICAgIyBpbmNsdWRlIG1vcmUgcmVhZGFibGUgdmVyc2lvbiA8T1RPQk9fVElDS0VUX09XTkVSCiAgICBteSAkT3duZXJUYWcgPSAkU3RhcnQgLiAnT1RPQk9fVElDS0VUX09XTkVSXyc7CgogICAgaWYgKCAkVGlja2V0e093bmVySUR9ICkgewoKICAgICAgICBteSAlT3duZXIgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFRpY2tldHtPd25lcklEfSwKICAgICAgICAgICAgTm9PdXRPZk9mZmljZSA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgaHRtbCBxdW90aW5nIG9mIGNvbnRlbnQKICAgICAgICBpZiAoICRQYXJhbXtSaWNoVGV4dH0gKSB7CgogICAgICAgICAgICBBVFRSSUJVVEU6CiAgICAgICAgICAgIGZvciBteSAkQXR0cmlidXRlICggc29ydCBrZXlzICVPd25lciApIHsKICAgICAgICAgICAgICAgIG5leHQgQVRUUklCVVRFIGlmICEkT3duZXJ7JEF0dHJpYnV0ZX07CiAgICAgICAgICAgICAgICAkT3duZXJ7JEF0dHJpYnV0ZX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvSFRNTCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJE93bmVyeyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJEhhc2hHbG9iYWxSZXBsYWNlLT4oICIkVGFnfCRPd25lclRhZyIsICVPd25lciApOwogICAgfQoKICAgICMgY2xlYW51cAogICAgJFBhcmFte1RleHR9ID1+IHMvJFRhZy4rPyRFbmQvLS9naTsKICAgICRQYXJhbXtUZXh0fSA9fiBzLyRPd25lclRhZy4rPyRFbmQvLS9naTsKCiAgICAjIGdldCBvd25lciBkYXRhIGFuZCByZXBsYWNlIGl0IHdpdGggPE9UT0JPX1JFU1BPTlNJQkxFXy4uLgogICAgJFRhZyA9ICRTdGFydCAuICdPVE9CT19SRVNQT05TSUJMRV8nOwoKICAgICMgaW5jbHVkZSBtb3JlIHJlYWRhYmxlIHZlcnNpb24gPE9UT0JPX1RJQ0tFVF9SRVNQT05TSUJMRQogICAgbXkgJFJlc3BvbnNpYmxlVGFnID0gJFN0YXJ0IC4gJ09UT0JPX1RJQ0tFVF9SRVNQT05TSUJMRV8nOwoKICAgIGlmICggJFRpY2tldHtSZXNwb25zaWJsZUlEfSApIHsKICAgICAgICBteSAlUmVzcG9uc2libGUgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFRpY2tldHtSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgTm9PdXRPZk9mZmljZSA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgSFRNTCBxdW90aW5nIG9mIGNvbnRlbnQKICAgICAgICBpZiAoICRQYXJhbXtSaWNoVGV4dH0gKSB7CgogICAgICAgICAgICBBVFRSSUJVVEU6CiAgICAgICAgICAgIGZvciBteSAkQXR0cmlidXRlICggc29ydCBrZXlzICVSZXNwb25zaWJsZSApIHsKICAgICAgICAgICAgICAgIG5leHQgQVRUUklCVVRFIGlmICEkUmVzcG9uc2libGV7JEF0dHJpYnV0ZX07CiAgICAgICAgICAgICAgICAkUmVzcG9uc2libGV7JEF0dHJpYnV0ZX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvSFRNTCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFJlc3BvbnNpYmxleyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJEhhc2hHbG9iYWxSZXBsYWNlLT4oICIkVGFnfCRSZXNwb25zaWJsZVRhZyIsICVSZXNwb25zaWJsZSApOwogICAgfQoKICAgICMgY2xlYW51cAogICAgJFBhcmFte1RleHR9ID1+IHMvJFRhZy4rPyRFbmQvLS9naTsKICAgICRQYXJhbXtUZXh0fSA9fiBzLyRSZXNwb25zaWJsZVRhZy4rPyRFbmQvLS9naTsKCiAgICAkVGFnID0gJFN0YXJ0IC4gJ09UT0JPX0FnZW50Xyc7CiAgICBteSAkVGFnMiAgICAgICAgPSAkU3RhcnQgLiAnT1RPQk9fQ1VSUkVOVF8nOwogICAgbXkgJUN1cnJlbnRVc2VyID0gJFVzZXJPYmplY3QtPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgTm9PdXRPZk9mZmljZSA9PiAxLAogICAgKTsKCiAgICAjIEhUTUwgcXVvdGluZyBvZiBjb250ZW50CiAgICBpZiAoICRQYXJhbXtSaWNoVGV4dH0gKSB7CgogICAgICAgIEFUVFJJQlVURToKICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAoIHNvcnQga2V5cyAlQ3VycmVudFVzZXIgKSB7CiAgICAgICAgICAgIG5leHQgQVRUUklCVVRFIGlmICEkQ3VycmVudFVzZXJ7JEF0dHJpYnV0ZX07CiAgICAgICAgICAgICRDdXJyZW50VXNlcnskQXR0cmlidXRlfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9IVE1MKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRDdXJyZW50VXNlcnskQXR0cmlidXRlfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgJEhhc2hHbG9iYWxSZXBsYWNlLT4oICIkVGFnfCRUYWcyIiwgJUN1cnJlbnRVc2VyICk7CgogICAgIyByZXBsYWNlIG90aGVyIG5lZWRlZCBzdHVmZgogICAgJFBhcmFte1RleHR9ID1+IHMvJFN0YXJ0IE9UT0JPX0ZJUlNUX05BTUUgJEVuZC8kQ3VycmVudFVzZXJ7VXNlckZpcnN0bmFtZX0vZ3htczsKICAgICRQYXJhbXtUZXh0fSA9fiBzLyRTdGFydCBPVE9CT19MQVNUX05BTUUgJEVuZC8kQ3VycmVudFVzZXJ7VXNlckxhc3RuYW1lfS9neG1zOwoKICAgICMgY2xlYW51cAogICAgJFBhcmFte1RleHR9ID1+IHMvJFRhZzIuKz8kRW5kLy0vZ2k7CgojIFJvdGhlciBPU1MgLyBPbmVUaW1lQXV0aGVudGljYXRpb25MaW5rCiAgICAjIFJlcGxhY2UgY29uZmlnIG9wdGlvbnMuCiAgICAkVGFnID0gJFN0YXJ0IC4gJ09UT0JPX09UQUN1c3RvbWVyVGlja2V0TGluayc7CiAgICAkUGFyYW17VGV4dH0gPX4gc3skVGFnJEVuZH17CiAgICAgICAgbXkgJFJlcGxhY2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJBdXRoOjpPbmVUaW1lQXV0aExpbmsnKS0+VGlja2V0TGluaygKICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgVXNlciAgICAgICAgID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICRSZXBsYWNlOwogICAgfWVneDsKIyBFTyBPbmVUaW1lQXV0aGVudGljYXRpb25MaW5rCgogICAgIyB0aWNrZXQgZGF0YQogICAgJFRhZyA9ICRTdGFydCAuICdPVE9CT19USUNLRVRfJzsKCiAgICAjIGh0bWwgcXVvdGluZyBvZiBjb250ZW50CiAgICBpZiAoICRQYXJhbXtSaWNoVGV4dH0gKSB7CgogICAgICAgIEFUVFJJQlVURToKICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAoIHNvcnQga2V5cyAlVGlja2V0ICkgewogICAgICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAhJFRpY2tldHskQXR0cmlidXRlfTsKICAgICAgICAgICAgJFRpY2tldHskQXR0cmlidXRlfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9IVE1MKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRUaWNrZXR7JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgRHJvcGRvd24sIENoZWNrYm94IGFuZCBNdWx0aVNlbGVjdCBEeW5hbWljRmllbGRzLCBjYW4gc3RvcmUgdmFsdWVzIChrZXlzKSB0aGF0IGFyZQogICAgIyBkaWZmZXJlbnQgZnJvbSB0aGUgdmFsdWVzIHRvIGRpc3BsYXkKICAgICMgPE9UT0JPX1RJQ0tFVF9EeW5hbWljRmllbGRfTmFtZVg+IHJldHVybnMgdGhlIHN0b3JlZCBrZXkKICAgICMgPE9UT0JPX1RJQ0tFVF9EeW5hbWljRmllbGRfTmFtZVhfVmFsdWU+IHJldHVybnMgdGhlIGRpc3BsYXkgdmFsdWUKCiAgICBteSAlRHluYW1pY0ZpZWxkczsKCiAgICAjIEZvciBzeXN0ZW1zIHdpdGggbWFueSBEeW5hbWljIGZpZWxkcyB3ZSBkbyBub3Qgd2FudCB0byBsb2FkIHRoZW0gYWxsIHVubGVzcyBuZWVkZWQKICAgICMgRmluZCB3aGF0IER5bmFtaWMgRmllbGQgVmFsdWVzIGFyZSByZXF1ZXN0ZWQKICAgIHdoaWxlICggJFBhcmFte1RleHR9ID1+IG0vJFRhZyBEeW5hbWljRmllbGRfKFxTKz8pKF9WYWx1ZSk/ICRFbmQvZ2l4bXMgKSB7CiAgICAgICAgJER5bmFtaWNGaWVsZHN7JDF9ID0gMTsKICAgIH0KCiAgICAjIHRvIHN0b3JlIGFsbCB0aGUgcmVxdWlyZWQgRHluYW1pY0ZpZWxkIGRpc3BsYXkgdmFsdWVzCiAgICBteSAlRHluYW1pY0ZpZWxkRGlzcGxheVZhbHVlczsKCiAgICAjIGdldCBkeW5hbWljIGZpZWxkIG9iamVjdHMKICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aWNrZXQgb2JqZWN0CiAgICBteSAkRHluYW1pY0ZpZWxkTGlzdCA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgPT4gWydUaWNrZXQnXSwKICAgICkgfHwgW107CgogICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZExpc3R9ICkgewoKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgd2Ugb25seSBsb2FkIHRoZSBvbmVzIHJlcXVlc3RlZAogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CgogICAgICAgIG15ICRMYW5ndWFnZU9iamVjdDsKCiAgICAgICAgIyB0cmFuc2xhdGUgdmFsdWVzIGlmIG5lZWRlZAogICAgICAgIGlmICggJFBhcmFte0xhbmd1YWdlfSApIHsKICAgICAgICAgICAgJExhbmd1YWdlT2JqZWN0ID0gS2VybmVsOjpMYW5ndWFnZS0+bmV3KAogICAgICAgICAgICAgICAgVXNlckxhbmd1YWdlID0+ICRQYXJhbXtMYW5ndWFnZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkRGF0ZVRpbWVPYmplY3Q7CgogICAgICAgICMgQ2hhbmdlIERhdGVUaW1lIERGIHZhbHVlIGZvciB0aWNrZXQgaWYgbmVlZGVkLgogICAgICAgIGlmICgKICAgICAgICAgICAgZGVmaW5lZCAkVGlja2V0eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfQogICAgICAgICAgICAmJiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57RmllbGRUeXBlfSBlcSAnRGF0ZVRpbWUnCiAgICAgICAgICAgICYmICRSZWNpcGllbnRUaW1lWm9uZQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkVGlja2V0eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICREYXRlVGltZU9iamVjdC0+VG9UaW1lWm9uZSggVGltZVpvbmUgPT4gJFJlY2lwaWVudFRpbWVab25lICk7CiAgICAgICAgICAgICRUaWNrZXR7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJERhdGVUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGhlIGRpc3BsYXkgdmFsdWUgZm9yIGVhY2ggZHluYW1pYyBmaWVsZAogICAgICAgIG15ICREaXNwbGF5VmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVMb29rdXAoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBLZXkgICAgICAgICAgICAgICAgPT4gJFRpY2tldHsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgIExhbmd1YWdlT2JqZWN0ICAgICA9PiAkTGFuZ3VhZ2VPYmplY3QsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdGhlIHJlYWRhYmxlIHZhbHVlICh2YWx1ZSkgZm9yIGVhY2ggZHluYW1pYyBmaWVsZAogICAgICAgIG15ICREaXNwbGF5VmFsdWVTdHJnID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlJlYWRhYmxlVmFsdWVSZW5kZXIoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJERpc3BsYXlWYWx1ZSwKICAgICAgICApOwoKICAgICAgICAjIGZpbGwgdGhlIER5bmFtaWNGaWVsZERpc3BsYXlWYWx1ZXMKICAgICAgICBpZiAoJERpc3BsYXlWYWx1ZVN0cmcpIHsKICAgICAgICAgICAgJER5bmFtaWNGaWVsZERpc3BsYXlWYWx1ZXN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSAuICdfVmFsdWUnIH0gPSAkRGlzcGxheVZhbHVlU3RyZy0+e1ZhbHVlfTsKCiAgICAgICAgICAgICMgQWRkIHRpbWV6b25lIGluZm8gaWYgbmVlZGVkLgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRUaWNrZXR7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9CiAgICAgICAgICAgICAgICAmJiBsZW5ndGggJFRpY2tldHsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0KICAgICAgICAgICAgICAgICYmICREeW5hbWljRmllbGRDb25maWctPntGaWVsZFR5cGV9IGVxICdEYXRlVGltZScKICAgICAgICAgICAgICAgICYmICRSZWNpcGllbnRUaW1lWm9uZQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkRGlzcGxheVZhbHVlc3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IC4gJ19WYWx1ZScgfQogICAgICAgICAgICAgICAgICAgIC49ICIgKCRSZWNpcGllbnRUaW1lWm9uZSkiOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0aGUgcmVhZGFibGUgdmFsdWUgKGtleSkgZm9yIGVhY2ggZHluYW1pYyBmaWVsZAogICAgICAgIG15ICRWYWx1ZVN0cmcgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UmVhZGFibGVWYWx1ZVJlbmRlcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVGlja2V0eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICApOwoKICAgICAgICAjIHJlcGxhY2UgdGlja2V0IGNvbnRlbnQgd2l0aCB0aGUgdmFsdWUgZnJvbSBSZWFkYWJsZVZhbHVlUmVuZGVyIChpZiBhbnkpCiAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkVmFsdWVTdHJnKSApIHsKICAgICAgICAgICAgJFRpY2tldHsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkVmFsdWVTdHJnLT57VmFsdWV9OwoKICAgICAgICAgICAgIyBBZGQgdGltZXpvbmUgaW5mbyBpZiBuZWVkZWQuCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJFRpY2tldHsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0KICAgICAgICAgICAgICAgICYmIGxlbmd0aCAkVGlja2V0eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfQogICAgICAgICAgICAgICAgJiYgJER5bmFtaWNGaWVsZENvbmZpZy0+e0ZpZWxkVHlwZX0gZXEgJ0RhdGVUaW1lJwogICAgICAgICAgICAgICAgJiYgJFJlY2lwaWVudFRpbWVab25lCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRUaWNrZXR7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9IC49ICIgKCRSZWNpcGllbnRUaW1lWm9uZSkiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgcmVwbGFjZSBpdAogICAgJEhhc2hHbG9iYWxSZXBsYWNlLT4oICRUYWcsICVUaWNrZXQsICVEeW5hbWljRmllbGREaXNwbGF5VmFsdWVzICk7CgogICAgIyBDT01QQVQKICAgICRQYXJhbXtUZXh0fSA9fiBzLyRTdGFydCBPVE9CT19USUNLRVRfSUQgJEVuZC8kVGlja2V0e1RpY2tldElEfS9naXhtczsKICAgICRQYXJhbXtUZXh0fSA9fiBzLyRTdGFydCBPVE9CT19USUNLRVRfTlVNQkVSICRFbmQvJFRpY2tldHtUaWNrZXROdW1iZXJ9L2dpeG1zOwogICAgaWYgKCAkVGlja2V0e1RpY2tldElEfSApIHsKICAgICAgICAkUGFyYW17VGV4dH0gPX4gcy8kU3RhcnQgT1RPQk9fUVVFVUUgJEVuZC8kVGlja2V0e1F1ZXVlfS9naXhtczsKICAgIH0KICAgIGlmICggJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgICRQYXJhbXtUZXh0fSA9fiBzLyRTdGFydCBPVE9CT19USUNLRVRfUVVFVUUgJEVuZC8kUXVldWV7TmFtZX0vZ2l4bXM7CiAgICB9CgogICAgIyBjbGVhbnVwCiAgICAkUGFyYW17VGV4dH0gPX4gcy8kVGFnLis/JEVuZC8tL2dpOwoKICAgICMgRm9sbG93LXVwIGZvciBidWcjMTA4MjUuCiAgICAjIFNldCBkYXRhIGZvciByZXBsYWNpbmcgb2Ygc3BlY2lmaWMgdGFncyBpbiBUZW1wbGF0ZXM6CiAgICAjIC0gT1RPQk9fQUdFTlRfU1VCSkVDVCwgT1RPQk9fQUdFTlRfQk9EWSAtIHN1YmplY3QvYm9keSBvZiB0aGUgQ1VSUkVOVC9MQVRFU1QgYWdlbnQgYXJ0aWNsZQogICAgIyAtIE9UT0JPX0NVU1RPTUVSX1NVQkpFQ1QsIE9UT0JPX0NVU1RPTUVSX0JPRFkgLSBzdWJqZWN0L2JvZHkgb2YgdGhlIENVUlJFTlQvTEFURVNUIGN1c3RvbWVyIGFydGljbGUKICAgICMgLSBPVE9CT19BR0VOVF9TVUJKRUNUW25dICAgIC0gZmlyc3QgbiBjaGFyYWN0ZXJzIG9mIHRoZSBzdWJqZWN0IG9mIHRoZSBDVVJSRU5UL0xBVEVTVCBhZ2VudCBhcnRpY2xlCiAgICAjIC0gT1RPQk9fQUdFTlRfQk9EWVtuXSAgICAgICAtIGZpcnN0IG4gbGluZXMgb2YgdGhlIGJvZHkgb2YgdGhlIENVUlJFTlQvTEFURVNUIGFnZW50IGFydGljbGUKICAgICMgLSBPVE9CT19DVVNUT01FUl9TVUJKRUNUW25dIC0gZmlyc3QgbiBjaGFyYWN0ZXJzIG9mIHRoZSBzdWJqZWN0IG9mIHRoZSBDVVJSRU5UL0xBVEVTVCBjdXN0b21lciBhcnRpY2xlCiAgICAjIC0gT1RPQk9fQ1VTVE9NRVJfQk9EWVtuXSAgICAtIGZpcnN0IG4gbGluZXMgb2YgdGhlIGJvZHkgb2YgdGhlIENVUlJFTlQvTEFURVNUIGN1c3RvbWVyIGFydGljbGUKICAgICMKICAgICMgRm9yIE5vdGUgdGVtcGxhdGUgd2UgbmVlZCB0aGUgbGFzdCBhcnRpY2xlLgogICAgIyBGb3IgQW5zd2VyLCAkUGFyYW17RGF0YX0gaGFzIHNlbGVjdGVkIG9yIGxhc3QgYXJ0aWNsZSBkYXRhLCBkZXBlbmRzIHdoZXRoZXIgQXJ0aWNsZUlEIGlzIHNlbnQgb3Igbm90LgogICAgIyBGb3IgRm9yd2FyZCwgJFBhcmFte0RhdGF9IGhhcyB0aGUgZm9sbG93aW5nIGFydGljbGUgZGF0YToKICAgICMgLSBpZiBBcnRpY2xlSUQgaXMgc2VudCwgZGF0YSBpcyBmcm9tIHNlbGVjdGVkIGFydGljbGUuCiAgICAjIC0gaWYgQXJ0aWNsZUlEIGlzIG5vdCBzZW50LCBkYXRhIGlzIGZyb20gbGFzdCBjdXN0b21lci9hZ2VudC9hbnkgYXJ0aWNsZS4KICAgIGlmICggJFBhcmFte1RlbXBsYXRlfSAmJiAkVGlja2V0e1RpY2tldElEfSApIHsKICAgICAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKCiAgICAgICAgaWYgKCAkUGFyYW17VGVtcGxhdGV9IGVxICdOb3RlJyApIHsKCiAgICAgICAgICAgICMgR2V0IGxhc3QgYXJ0aWNsZSBmcm9tIGFnZW50LgogICAgICAgICAgICBteSBAQWdlbnRBcnRpY2xlcyA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlTGlzdCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFBhcmFte1RpY2tldERhdGF9LT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgU2VuZGVyVHlwZSA9PiAnYWdlbnQnLAogICAgICAgICAgICAgICAgT25seUxhc3QgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJUFnZW50QXJ0aWNsZSA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQXJ0aWNsZSggJXsgJEFnZW50QXJ0aWNsZXNbMF0gfSApLT5BcnRpY2xlR2V0KAogICAgICAgICAgICAgICAgJXsgJEFnZW50QXJ0aWNsZXNbMF0gfSwKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgR2V0IGxhc3QgYXJ0aWNsZSBmcm9tIGN1c3RvbWVyLgogICAgICAgICAgICBteSBAQ3VzdG9tZXJBcnRpY2xlcyA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlTGlzdCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFBhcmFte1RpY2tldERhdGF9LT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgU2VuZGVyVHlwZSA9PiAnY3VzdG9tZXInLAogICAgICAgICAgICAgICAgT25seUxhc3QgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJUN1c3RvbWVyQXJ0aWNsZSA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQXJ0aWNsZSggJXsgJEN1c3RvbWVyQXJ0aWNsZXNbMF0gfSApLT5BcnRpY2xlR2V0KAogICAgICAgICAgICAgICAgJXsgJEN1c3RvbWVyQXJ0aWNsZXNbMF0gfSwKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRQYXJhbXtEYXRhQWdlbnR9LT57U3ViamVjdH0gPSAkQWdlbnRBcnRpY2xle1N1YmplY3R9OwogICAgICAgICAgICAkUGFyYW17RGF0YUFnZW50fS0+e0JvZHl9ICAgID0gJEFnZW50QXJ0aWNsZXtCb2R5fTsKICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57U3ViamVjdH0gICAgICA9ICRDdXN0b21lckFydGljbGV7U3ViamVjdH07CiAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e0JvZHl9ICAgICAgICAgPSAkQ3VzdG9tZXJBcnRpY2xle0JvZHl9OwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRQYXJhbXtUZW1wbGF0ZX0gZXEgJ0Fuc3dlcicgfHwgJFBhcmFte1RlbXBsYXRlfSBlcSAnRm9yd2FyZCcgKSB7CgogICAgICAgICAgICAjIElmICRQYXJhbXtEYXRhfSBoYXMgYWdlbnQgYXJ0aWNsZSBkYXRhLCB3ZSB3aWxsIHNldCBzdWJqZWN0IGFuZCBib2R5IGluICRQYXJhbXtEYXRhQWdlbnR9CiAgICAgICAgICAgICMgdG8gdmFsdWVzIGZyb20gJFBhcmFte0RhdGF9IGluIG9yZGVyIHRvIHJpZ2h0IHJlcGxhY2luZyBvZiBPVE9CT19BR0VOVF9TVUJKRUNUL0JPRFkgdGFncy4KICAgICAgICAgICAgaWYgKCAkUGFyYW17RGF0YX0tPntTZW5kZXJUeXBlfSAmJiAkUGFyYW17RGF0YX0tPntTZW5kZXJUeXBlfSBlcSAnYWdlbnQnICkgewogICAgICAgICAgICAgICAgJFBhcmFte0RhdGFBZ2VudH0tPntTdWJqZWN0fSA9ICRQYXJhbXtEYXRhfS0+e1N1YmplY3R9OwogICAgICAgICAgICAgICAgJFBhcmFte0RhdGFBZ2VudH0tPntCb2R5fSAgICA9ICRQYXJhbXtEYXRhfS0+e0JvZHl9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGN1c3RvbWVyIGFuZCBhZ2VudCBwYXJhbXMgYW5kIHJlcGxhY2UgaXQgd2l0aCA8T1RPQk9fQ1VTVE9NRVJfLi4uIG9yIDxPVE9CT19BR0VOVF8uLi4KICAgIG15ICVBcnRpY2xlRGF0YSA9ICgKICAgICAgICAnT1RPQk9fQ1VTVE9NRVJfJyA9PiAkUGFyYW17RGF0YX0gICAgICB8fCB7fSwKICAgICAgICAnT1RPQk9fQUdFTlRfJyAgICA9PiAkUGFyYW17RGF0YUFnZW50fSB8fCB7fSwKICAgICk7CgogICAgIyB1c2UgYSBsaXN0IHRvIGdldCBjdXN0b21lciBmaXJzdAogICAgZm9yIG15ICREYXRhVHlwZSAocXcoT1RPQk9fQ1VTVE9NRVJfIE9UT0JPX0FHRU5UXykpIHsKICAgICAgICBteSAlRGF0YSA9ICV7ICRBcnRpY2xlRGF0YXskRGF0YVR5cGV9IH07CgogICAgICAgICMgSFRNTCBxdW90aW5nIG9mIGNvbnRlbnQKICAgICAgICBpZiAoICRQYXJhbXtSaWNoVGV4dH0gKSB7CgogICAgICAgICAgICBBVFRSSUJVVEU6CiAgICAgICAgICAgIGZvciBteSAkQXR0cmlidXRlICggc29ydCBrZXlzICVEYXRhICkgewogICAgICAgICAgICAgICAgbmV4dCBBVFRSSUJVVEUgdW5sZXNzICREYXRheyRBdHRyaWJ1dGV9OwoKICAgICAgICAgICAgICAgICREYXRheyRBdHRyaWJ1dGV9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0hUTUwoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICREYXRheyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCVEYXRhKSB7CgogICAgICAgICAgICAjIHJlcGxhY2UgPE9UT0JPX0NVU1RPTUVSXyo+IGFuZCA8T1RPQk9fQUdFTlRfKj4gdGFncwogICAgICAgICAgICAkVGFnID0gJFN0YXJ0IC4gJERhdGFUeXBlOwogICAgICAgICAgICAkSGFzaEdsb2JhbFJlcGxhY2UtPiggJFRhZywgJURhdGEgKTsKCiAgICAgICAgICAgICMgcHJlcGFyZSBib2R5IChpbnNlcnQgb2xkIGVtYWlsKSA8T1RPQk9fQ1VTVE9NRVJfRU1BSUxbbl0+LCA8T1RPQk9fQ1VTVE9NRVJfTk9URVtuXT4KICAgICAgICAgICAgIyAgIDxPVE9CT19DVVNUT01FUl9CT0RZW25dPiwgPE9UT0JPX0FHRU5UX0VNQUlMW25dPi4uLiwgPE9UT0JPX0NPTU1FTlQ+CgogICAgICAgICAgICAjIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgbnVtYmVyIG9mIGluY2x1ZGVkIGxpbmVzIGNhbiBiZSBzcGVjaWZpZWQuCiAgICAgICAgICAgICMgVGhlIHNhbWUga2V5IGNhbiBvY2N1ciBtdWx0aXBsZSB0aW1lcywgcG9zc2libHkgd2l0aCBhIGRpZmZlcmVudCBudW1iZXIgb2YgbGluZXMuCiAgICAgICAgICAgICMgVGhlIGxhc3QgY3VzdG9tZXIgbWFpbCBpcyB1c2VkIGZvciA8T1RPQk9fQ09NTUVOVD4gb3IgPE9UT0JPX0NPTU1FTlRbMTIzXT4KICAgICAgICAgICAgIyBhcyB0aGUgbG9vcCByZXBsYWNlcyB0aGUgY3VzdG9tZXIgbWFpbCBmaXJzdC4KICAgICAgICAgICAgJFBhcmFte1RleHR9ID1+IHN7CiAgICAgICAgICAgICAgICAkU3RhcnQKICAgICAgICAgICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICAgICAgICAgIyBlLmcuIE9UT0JPX0NPTU1FTlRbMTNdLCBPVE9CT19BR0VOVF9CT0RZWzNdLCBPVE9CT19DVVNUT01FUl9CT0RZWzBdCiAgICAgICAgICAgICAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1RPQk9fQ09NTUVOVAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke0RhdGFUeXBlfSg/OkVNQUlMfE5PVEV8Qk9EWSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxbKD88Y250Pi4rPylcXQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgIyBhIHNwZWNpYWwgY2FzZSBhcyBPVE9CT19DT01NRU5UIHdpdGhvdXQgcXVhbnRpZmllciBpcyBoYW5kbGVkIG5vd2hlcmUgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBPVE9CT19DT01NRU5UCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgJEVuZAogICAgICAgICAgICB9CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICMgZm9yIDxPVE9CT19DT01NRU5UPiB0cnVuY2F0ZSBwZXIgZGVmYXVsdCBhIGxvbmcgbWFpbCBhdCAyNTAwCiAgICAgICAgICAgICAgICAjIDxPVE9CT19DVVNUT01FUl9CT0RZWzBdIHdvdWxkIGFsc28geWllbGQgMjUwMCBsaW5lcwogICAgICAgICAgICAgICAgbXkgJE51bUhlYWRMaW5lcyA9ICQre2NudH0gfHwgMjUwMDsKCiAgICAgICAgICAgICAgICBteSAkTmV3T2xkQm9keSAgID0gJyc7CiAgICAgICAgICAgICAgICBteSBAQm9keSAgICAgICAgID0gc3BsaXQgL1xuLywgJERhdGF7Qm9keX07CiAgICAgICAgICAgICAgICBteSAkTnVtQm9keUxpbmVzID0gc2NhbGFyIEBCb2R5OwoKICAgICAgICAgICAgICAgIENPVU5URVI6CiAgICAgICAgICAgICAgICBmb3IgbXkgJENvdW50ZXIgKCAwIC4uICROdW1IZWFkTGluZXMgLSAxICkgewoKICAgICAgICAgICAgICAgICAgICAjIGRvIG5vdCBnbyBiZXlvbmQgdGhlIGNvbXBsZXRlIGJvZHkKICAgICAgICAgICAgICAgICAgICBsYXN0IENPVU5URVIgaWYgJENvdW50ZXIgPj0gJE51bUJvZHlMaW5lczsKCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgbm8gcXVvdGUgY2hhciwgZG8gaXQgbGF0ZXIgYnkgdXNpbmcgRG9jdW1lbnRDbGVhbnVwKCkKICAgICAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICROZXdPbGRCb2R5IC49ICRCb2R5WyRDb3VudGVyXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgYWRkICI+ICIgYXMgcXVvdGUgY2hhcgogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkTmV3T2xkQm9keSAuPSAiPiAkQm9keVskQ291bnRlcl0iOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgbmV3IGxpbmUsIHVubGVzcyB3ZSBhcmUgYXQgdGhlIGxhc3QgaW5jbHVkZWQgbGluZQogICAgICAgICAgICAgICAgICAgICMgbm90IHN1cmUgd2h5IHRoZSBsYXN0IGxpbmUgaGFzIGEgbmV3bGluZSB3aGVuIHRoZQogICAgICAgICAgICAgICAgICAgICMgdGhlIGJvZHkgaGFzIGxlc3MgbGluZXMgdGhhbiB0aGUgc3BlY2lmaWVkIGxpbmUgY291bnQKICAgICAgICAgICAgICAgICAgICBpZiAoICRDb3VudGVyIDwgKCAkTnVtSGVhZExpbmVzIC0gMSApICkgewogICAgICAgICAgICAgICAgICAgICAgICAkTmV3T2xkQm9keSAuPSAiXG4iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjaG9tcCAkTmV3T2xkQm9keTsKCiAgICAgICAgICAgICAgICAjIEhUTUwgcXVvdGluZyBvZiBjb250ZW50CiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtSaWNoVGV4dH0gJiYgJE5ld09sZEJvZHkgKSB7CgogICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIHRyYWlsaW5nIG5ldyBsaW5lcwogICAgICAgICAgICAgICAgICAgIGZvciAoIDEgLi4gMTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICROZXdPbGRCb2R5ID1+IHMvKDxiclwvPilcc3swLDIwfSQvL2dzOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgcXVvdGUKICAgICAgICAgICAgICAgICAgICAkTmV3T2xkQm9keSA9ICI8YmxvY2txdW90ZSB0eXBlPVwiY2l0ZVwiPiROZXdPbGRCb2R5PC9ibG9ja3F1b3RlPiI7CiAgICAgICAgICAgICAgICAgICAgJE5ld09sZEJvZHkgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPkRvY3VtZW50Q2xlYW51cCgKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICROZXdPbGRCb2R5LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyB0aGUgcmVwbGFjZW1lbnQKICAgICAgICAgICAgICAgICROZXdPbGRCb2R5CiAgICAgICAgICAgIH14ZWc7ICAgICMgYSBzaW5nbGUgcGFzcyBvdmVyIHRoZSBtYWNyb3MgaW4gJFBhcmFte1RleHR9CgogICAgICAgICAgICAjIHJlcGxhY2UgPE9UT0JPX0NVU1RPTUVSX1NVQkpFQ1RbXT4gIGFuZCAgPE9UT0JPX0FHRU5UX1NVQkpFQ1RbXT4gdGFncwogICAgICAgICAgICAkVGFnID0gIiRTdGFydCREYXRhVHlwZSIgLiAnU1VCSkVDVCc7CiAgICAgICAgICAgIGlmICggJFBhcmFte1RleHR9ID1+IC8kVGFnXFsoLis/KVxdJEVuZC9nICkgewoKICAgICAgICAgICAgICAgIG15ICRTdWJqZWN0Q2hhciA9ICQxOwogICAgICAgICAgICAgICAgbXkgJFN1YmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTdWJqZWN0Q2xlYW4oCiAgICAgICAgICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJERhdGF7U3ViamVjdH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRTdWJqZWN0ID1+IHMvXigueyRTdWJqZWN0Q2hhcn0pLiokLyQxIFsuLi5dLzsKICAgICAgICAgICAgICAgICRQYXJhbXtUZXh0fSA9fiBzLyRUYWdcWy4rP1xdJEVuZC8kU3ViamVjdC9nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICREYXRhVHlwZSBlcSAnT1RPQk9fQ1VTVE9NRVJfJyApIHsKCiAgICAgICAgICAgICAgICAjIEdldCA8T1RPQk9fRU1BSUxfREFURVtdPiBmcm9tIGJvZHkgYW5kIHJlcGxhY2Ugd2l0aCByZWNlaXZlZCBkYXRlLgogICAgICAgICAgICAgICAgIyBUT0RPOiBDbGFyaWZ5LCBhcyBpdCByYXRoZXIgbG9va3MgbGlrZSB0aGUgY3VycmVudCBkYXRlIGlzIHVzZWQuCiAgICAgICAgICAgICAgICAjIFRoaXMgdGFnIHdpbGwgYmUgYWJsZSB0byB1c2Ugd2l0aCBzdXBwb3J0ZWQgT1RPQk8gdGltZSB6b25lcwogICAgICAgICAgICAgICAgIyAgICggZS5nLiA8T1RPQk9fRU1BSUxfREFURVtFdXJvcGUvQmVybGluXT4sIDxPVE9CT19FTUFJTF9EQVRFW0FzaWEvVG9reW9dPiwKICAgICAgICAgICAgICAgICMgICA8T1RPQk9fRU1BSUxfREFURVtBbWVyaWNhL0RlbnZlcl0+ICwgLi4uKS4KICAgICAgICAgICAgICAgICMgSWYgeW91IHVzZSB0YWcgd2l0aG91dCB0aW1lIGluIHNpbXBsZSBmb3JtYXQgYXMgPE9UT0JPX0VNQUlMX0RBVEU+LAogICAgICAgICAgICAgICAgIyAgdGltZSB3aWxsIGJlIHRyYW5zZm9ybWVkIGludG8gT1RPQk8gU3lzdGVtVGltZVpvbmUuCiAgICAgICAgICAgICAgICAkVGFnID0gJFN0YXJ0IC4gJ09UT0JPX0VNQUlMX0RBVEUnOwoKICAgICAgICAgICAgICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwogICAgICAgICAgICAgICAgbXkgJFN5c3RlbVRpbWVab25lID0gJERhdGVUaW1lT2JqZWN0LT5PVE9CT1RpbWVab25lR2V0KCk7CgogICAgICAgICAgICAgICAgJFBhcmFte1RleHR9ID1+IHN7CiAgICAgICAgICAgICAgICAgICAgJFN0YXJ0CiAgICAgICAgICAgICAgICAgICAgICAgIE9UT0JPX0VNQUlMX0RBVEUKICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgdGltZSB6b25lIGlzIG9wdGlvbmFsCiAgICAgICAgICAgICAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgXFsoPzx0ej4uKz8pXF0KICAgICAgICAgICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICAgICAkRW5kCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFRpbWVab25lID0gJCt7dHp9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoICRUaW1lWm9uZSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFRpbWVab25lVmFsaWQgPSAkRGF0ZVRpbWVPYmplY3QtPklzVGltZVpvbmVWYWxpZCggVGltZVpvbmUgPT4gJFRpbWVab25lICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkVGltZVpvbmVWYWxpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGVUaW1lT2JqZWN0LT5Ub1RpbWVab25lKCBUaW1lWm9uZSA9PiAkVGltZVpvbmUgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHN0YXkgYXQgdGhlIHN5c3RlbSB0aW1lIHpvbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lWm9uZSA9ICRTeXN0ZW1UaW1lWm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lWm9uZSA9ICRTeXN0ZW1UaW1lWm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGVUaW1lT2JqZWN0LT5Ub1RpbWVab25lKCBUaW1lWm9uZSA9PiAkVGltZVpvbmUgKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgY29uc3RydWN0IHRoZSByZXBsYWNlbWVudAogICAgICAgICAgICAgICAgICAgIG15ICRFbWFpbERhdGUgPSAkRGF0ZVRpbWVPYmplY3QtPkZvcm1hdCggRm9ybWF0ID0+ICclQSwgJUIgJWUsICVZIGF0ICVUICcgKTsKICAgICAgICAgICAgICAgICAgICAkRW1haWxEYXRlIC49ICIoJFRpbWVab25lKSI7CgogICAgICAgICAgICAgICAgICAgICMgdGhlIHJlcGxhY2VtZW50CiAgICAgICAgICAgICAgICAgICAgJEVtYWlsRGF0ZTsKICAgICAgICAgICAgICAgIH14ZWc7ICAgICMgYSBzaW5nbGUgcGFzcyBvdmVyIHRoZSBtYWNyb3MgaW4gJFBhcmFte1RleHR9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJERhdGFUeXBlIGVxICdPVE9CT19DVVNUT01FUl8nICkgewoKICAgICAgICAgICAgIyBnZXQgYW5kIHByZXBhcmUgcmVhbCBuYW1lCiAgICAgICAgICAgICRUYWcgPSAkU3RhcnQgLiAnT1RPQk9fQ1VTVE9NRVJfUkVBTE5BTUUnOwogICAgICAgICAgICBpZiAoICRQYXJhbXtUZXh0fSA9fiAvJFRhZyRFbmQvaSApIHsKCiAgICAgICAgICAgICAgICBteSAkRnJvbTsKCiAgICAgICAgICAgICAgICBpZiAoICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9ICkgewoKICAgICAgICAgICAgICAgICAgICAkRnJvbSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyTmFtZSgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHRyeSB0byBnZXQgdGhlIHJlYWwgbmFtZSBkaXJlY3RseSBmcm9tIHRoZSBkYXRhCiAgICAgICAgICAgICAgICAkRnJvbSAvLz0gJFJlY2lwaWVudHtSZWFsbmFtZX07CgogICAgICAgICAgICAgICAgIyBnZXQgcmVhbCBuYW1lIGJhc2VkIG9uIHJlcGx5LXRvCiAgICAgICAgICAgICAgICBpZiAoICEkRnJvbSAmJiAkRGF0YXtSZXBseVRvfSApIHsKCiAgICAgICAgICAgICAgICAgICAgJEZyb20gPSAkRGF0YXtSZXBseVRvfTsKCiAgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgZW1haWwgYWRkcmVzc2VzCiAgICAgICAgICAgICAgICAgICAgJEZyb20gPX4gcy8mbHQ7LiomZ3Q7fDwuKj58XCguKlwpfFwifCZxdW90O3w7fCwvL2c7CgogICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIGxlYWRpbmcvdHJhaWxpbmcgc3BhY2VzCiAgICAgICAgICAgICAgICAgICAgJEZyb20gPX4gcy9eXHMrLy9nOwogICAgICAgICAgICAgICAgICAgICRGcm9tID1+IHMvXHMrJC8vZzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGdlbmVyYXRlIHJlYWwgbmFtZSBiYXNlZCBvbiBzZW5kZXIgbGluZQogICAgICAgICAgICAgICAgaWYgKCAhJEZyb20gKSB7CiAgICAgICAgICAgICAgICAgICAgJEZyb20gPSAkRGF0YXtUb30gfHwgJyc7CgogICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIGVtYWlsIGFkZHJlc3NlcwogICAgICAgICAgICAgICAgICAgICRGcm9tID1+IHMvJmx0Oy4qJmd0O3w8Lio+fFwoLipcKXxcInwmcXVvdDt8O3wsLy9nOwoKICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSBsZWFkaW5nL3RyYWlsaW5nIHNwYWNlcwogICAgICAgICAgICAgICAgICAgICRGcm9tID1+IHMvXlxzKy8vZzsKICAgICAgICAgICAgICAgICAgICAkRnJvbSA9fiBzL1xzKyQvL2c7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyByZXBsYWNlIDxPVE9CT19DVVNUT01FUl9SRUFMTkFNRT4gd2l0aCBmcm9tCiAgICAgICAgICAgICAgICAkUGFyYW17VGV4dH0gPX4gcy8kVGFnJEVuZC8kRnJvbS9nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGN1c3RvbWVyIGRhdGEgYW5kIHJlcGxhY2UgaXQgd2l0aCA8T1RPQk9fQ1VTVE9NRVJfREFUQV8uLi4KICAgICRUYWcgID0gJFN0YXJ0IC4gJ09UT0JPX0NVU1RPTUVSXyc7CiAgICAkVGFnMiA9ICRTdGFydCAuICdPVE9CT19DVVNUT01FUl9EQVRBXyc7CgogICAgaWYgKCAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSB8fCAkUGFyYW17RGF0YX0tPntDdXN0b21lclVzZXJJRH0gKSB7CgogICAgICAgIG15ICRDdXN0b21lclVzZXJJRCA9ICRQYXJhbXtEYXRhfS0+e0N1c3RvbWVyVXNlcklEfSB8fCAkVGlja2V0e0N1c3RvbWVyVXNlcklEfTsKCiAgICAgICAgbXkgJUN1c3RvbWVyVXNlciA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgIFVzZXIgPT4gJEN1c3RvbWVyVXNlcklELAogICAgICAgICk7CgogICAgICAgICMgSFRNTCBxdW90aW5nIG9mIGNvbnRlbnQKICAgICAgICBpZiAoICRQYXJhbXtSaWNoVGV4dH0gKSB7CgogICAgICAgICAgICBBVFRSSUJVVEU6CiAgICAgICAgICAgIGZvciBteSAkQXR0cmlidXRlICggc29ydCBrZXlzICVDdXN0b21lclVzZXIgKSB7CiAgICAgICAgICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAhJEN1c3RvbWVyVXNlcnskQXR0cmlidXRlfTsKICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJ7JEF0dHJpYnV0ZX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvSFRNTCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEN1c3RvbWVyVXNlcnskQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVwbGFjZSBpdAogICAgICAgICRIYXNoR2xvYmFsUmVwbGFjZS0+KCAiJFRhZ3wkVGFnMiIsICVDdXN0b21lclVzZXIgKTsKICAgIH0KCiAgICAjIENsZWFuIHVwIGFsbCBub3QgbmVlZGVkICc8T1RPQk9fQ1VTVE9NRVJfJyBhbmQgJzxPVE9CT19DVVNUT01FUl9EQVRBXycgdGFncy4KICAgICMgTm90ZSB0aGF0IHRoaXMgaW5jbHVkZXMgdGhlIHRhZ3Mgd2hpY2ggYmVjYW1lIHBhcnQgb2YgdGhlIHJlcGxhY2UgdGV4dAogICAgIyBiZWNhdXNlIHRoZXkgd2VyZSBwcmVzZW50IGluIHRoZSBtYWNybyB2YWx1ZXMuCiAgICAkUGFyYW17VGV4dH0gPX4gcy8oPzokVGFnfCRUYWcyKS4rPyRFbmQvLS9naTsKCiAgICAjIGNsZWFudXAgYWxsIG5vdCBuZWVkZWQgPE9UT0JPX0FHRU5UXyB0YWdzCiAgICAkVGFnID0gJFN0YXJ0IC4gJ09UT0JPX0FHRU5UXyc7CiAgICAkUGFyYW17VGV4dH0gPX4gcy8kVGFnLis/JEVuZC8tL2dpOwoKICAgIHJldHVybiAkUGFyYW17VGV4dH07Cn0KCj1oZWFkMiBfUmVtb3ZlVW5TdXBwb3J0ZWRUYWcoKQoKY2xlYW4gdXAgYWxsIG5vdCBzdXBwb3J0ZWQgdGFncy4gVGhlIG5vdCBzdXBwb3J0ZWQgdGFncyBhcmUgcmVwbGFjZWQKd2l0aCB0aGUgbWludXMgY2hhcmFjdGVyICctJy4KCiAgICBteSAkVGV4dCA9ICRUZW1wbGF0ZUdlbmVyYXRvck9iamVjdC0+X1JlbW92ZVVuU3VwcG9ydGVkVGFnKAogICAgICAgIFRleHQgICAgICAgICAgICAgICAgID0+ICRTb21lVGV4dFdpdGhUYWdzLAogICAgICAgIExpc3RPZlVuU3VwcG9ydGVkVGFnID0+IFxATGlzdE9mVW5TdXBwb3J0ZWRUYWcsCiAgICApOwoKPWN1dAoKc3ViIF9SZW1vdmVVblN1cHBvcnRlZFRhZyB7CgogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRJdGVtIChxdyhUZXh0IExpc3RPZlVuU3VwcG9ydGVkVGFnKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRJdGVtfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEl0ZW0hIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRTdGFydCA9ICc8JzsKICAgIG15ICRFbmQgICA9ICc+JzsKICAgIGlmICggJFNlbGYtPntSaWNoVGV4dH0gKSB7CiAgICAgICAgJFN0YXJ0ID0gJyZsdDsnOwogICAgICAgICRFbmQgICA9ICcmZ3Q7JzsKICAgICAgICAkUGFyYW17VGV4dH0gPX4gcy8oXG58XHIpLy9nOwogICAgfQoKICAgICMgQ2xlYW51cCBhbGwgbm90IHN1cHBvcnRlZCB0YWdzIHdpdGggYW5kIHdpdGhvdXQgbnVtYmVyLCBlLmcuIE9UT0JPX0NVU1RPTUVSX0JPRFkgYW5kIE9UT0JPX0NVU1RPTUVSX0JPRFlbbl0uCiAgICAjIFNlZSBodHRwczovL2J1Z3Mub3Rycy5vcmcvc2hvd19idWcuY2dpP2lkPTE0MzY5IGFuZCBodHRwczovL2J1Z3Mub3Rycy5vcmcvc2hvd19idWcuY2dpP2lkPTEwODI1LgogICAgbXkgJE5vdFN1cHBvcnRlZFRhZyA9ICRTdGFydCAuICIoPzoiIC4gam9pbiggInwiLCBAeyAkUGFyYW17TGlzdE9mVW5TdXBwb3J0ZWRUYWd9IH0gKSAuICIpKFxcWy4qP1xcXSk/IiAuICRFbmQ7CiAgICAkUGFyYW17VGV4dH0gPX4gcy8kTm90U3VwcG9ydGVkVGFnLy0vZ2k7CgogICAgcmV0dXJuICRQYXJhbXtUZXh0fTsKfQoKPWhlYWQyIF9NYXNrU2Vuc2l0aXZlVmFsdWUoKQoKTWFzayBzZW5zaXRpdmUgdmFsdWUsIGkuZS4gYSBwYXNzd29yZCwgYSBzZWN1cml0eSB0b2tlbiwgZXRjLgoKICAgIG15ICRNYXNrZWRWYWx1ZSA9ICRTZWxmLT5fTWFza1NlbnNpdGl2ZVZhbHVlKAogICAgICAgIEtleSAgICAgID0+ICdEYXRhYmFzZVBhc3N3b3JkJywgIyAocmVxdWlyZWQpIE5hbWUgb2YgdGhlIGZpZWxkL2tleS4KICAgICAgICBWYWx1ZSAgICA9PiAnc2VjcmV0dmFsdWUnLCAgICAgICMgKG9wdGlvbmFsKSBWYWx1ZSB0byBwb3RlbnRpYWxseSBtYXNrLgogICAgICAgIElzQ29uZmlnID0+IDEsICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFdoZXRoZXIgdGhlIHZhbHVlIGlzIGEgY29uZmlnIG9wdGlvbiwgZGVmYXVsdDogMC4KICAgICk7CgpSZXR1cm5zIG1hc2tlZCB2YWx1ZSBpbiBjYXNlIHRoZSBrZXkgaXMgbWF0Y2hlZDoKCiAgICRNYXNrZWRWYWx1ZSA9ICd4eHgnOwoKPWN1dAoKc3ViIF9NYXNrU2Vuc2l0aXZlVmFsdWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJycgaWYgISRQYXJhbXtLZXl9IHx8ICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CgogICAgIyBTa2lwIG1hc2tpbmcgc2Vuc2l0aXZlIHZhbHVlcyBmb3IgRHluYW1pYyBGaWVsZHMuCiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfSBpZiAkUGFyYW17S2V5fSA9fiBxcnsgZHluYW1pY2ZpZWxkIH14aTsKCiAgICAjIE1hdGNoIGdlbmVyYWwga2V5IG5hbWVzLCBpLmUuIGZyb20gdGhlIHVzZXIgcHJlZmVyZW5jZXMuCiAgICBteSAkTWF0Y2ggPSBxcnsgY29uZmlnfHNlY3JldHxwYXNzd3x1c2VycHd8YXV0aHx0b2tlbiB9eGk7CgogICAgIyBNYXRjaCBmb3JiaWRkZW4gY29uZmlnIGtleXMuCiAgICBpZiAoICRQYXJhbXtJc0NvbmZpZ30gKSB7CiAgICAgICAgJE1hdGNoID0gcXJ7ICg/OnBhc3N3b3JkfHB3KSBcZCogJCB9c214aTsKICAgIH0KCiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfSBpZiAkUGFyYW17S2V5fSAhfiAkTWF0Y2g7CgogICAgcmV0dXJuICd4eHgnOwp9Cgo9ZW5kIEludGVybmFsOgoKPWN1dAoKMTsK</File>
        <File Location="Custom/Kernel/System/Web/InterfaceCustomer.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBmZjllMjk3YmFmMjg3ZTE2MDcxZDNhYzZhZDdmNmMxM2YxMWFjN2ZhIC0gS2VybmVsL1N5c3RlbS9XZWIvSW50ZXJmYWNlQ3VzdG9tZXIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpJbnRlcmZhY2VDdXN0b21lcjsKCnVzZSB2NS4yNDsKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgbmFtZXNwYWNlOjphdXRvY2xlYW47CnVzZSB1dGY4OwoKIyBjb3JlIG1vZHVsZXMKdXNlIFRpbWU6OkhpUmVzIHF3KCk7CgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyhJc0FycmF5UmVmV2l0aERhdGEgSXNIYXNoUmVmV2l0aERhdGEpOwp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpBdXRoU2Vzc2lvbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhY2hlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJBdXRoJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RW1haWwnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U2NoZWR1bGVyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlc3BvbnNlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpXZWI6OkludGVyZmFjZUN1c3RvbWVyIC0gdGhlIGN1c3RvbWVyIHdlYiBpbnRlcmZhY2UKCj1oZWFkMSBTWU5PUFNJUwoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpJbnRlcmZhY2VDdXN0b21lcjsKCiAgICAjIGEgUGxhY2sgcmVxdWVzdCBoYW5kbGVyCiAgICBteSAkQXBwID0gc3ViIHsKICAgICAgICBteSAkRW52ID0gc2hpZnQ7CgogICAgICAgIG15ICRJbnRlcmZhY2UgPSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpJbnRlcmZhY2VDdXN0b21lci0+bmV3KAogICAgICAgICAgICAjIERlYnVnID0+IDEKICAgICAgICAgICAgUFNHSUVudiAgICA9PiAkRW52LAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgY29udGVudCAoYWN0dWFsbHkgaGVhZGVycyBhcmUgZ2VuZXJhdGVkIGFzIGEgc2lkZSBlZmZlY3QpCiAgICAgICAgbXkgJENvbnRlbnQgPSAkSW50ZXJmYWNlLT5Db250ZW50KCk7CgogICAgICAgICMgYXNzdW1pbmcgYWxsIHdlbnQgd2VsbCBhbmQgSFRNTCB3YXMgZ2VuZXJhdGVkCiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgJzIwMCcsCiAgICAgICAgICAgIFsgJ0NvbnRlbnQtVHlwZScgPT4gJ3RleHQvaHRtbCcgXSwKICAgICAgICAgICAgJENvbnRlbnQKICAgICAgICBdOwogICAgfTsKCj1oZWFkMSBERVNDUklQVElPTgoKVGhpcyBtb2R1bGUgZ2VuZXJhdGVzIHRoZSBIVFRQIHJlc3BvbnNlIGZvciBGPGN1c3RvbWVyLnBsPi4KVGhpcyBjbGFzcyBpcyBtZWFudCB0byBiZSB1c2VkIHdpdGhpbiBhIFBsYWNrIHJlcXVlc3QgaGFuZGxlci4KU2VlIEY8YmluL3BzZ2ktYmluL290b2JvLnBzZ2k+IGZvciB0aGUgcmVhbCBsaXZlIHVzYWdlLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKY3JlYXRlIHRoZSB3ZWIgaW50ZXJmYWNlIG9iamVjdCBmb3IgRjxjdXN0b21lci5wbD4uCgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBzdGFydCB3aXRoIGFuIGVtcHR5IGhhc2ggZm9yIHRoZSBuZXcgb2JqZWN0CiAgICBteSAkU2VsZiA9IGJsZXNzIHt9LCAkVHlwZTsKCiAgICAjIHNldCBkZWJ1ZyBsZXZlbAogICAgJFNlbGYtPntEZWJ1Z30gPSAkUGFyYW17RGVidWd9IHx8IDA7CgogICAgIyBwZXJmb3JtYW5jZSBsb2cgYmFzZWQgb24gaGlnaCByZXNvbHV0aW9uIHRpbWVzdGFtcHMKICAgICRTZWxmLT57UGVyZm9ybWFuY2VMb2dTdGFydH0gPSBUaW1lOjpIaVJlczo6dGltZSgpOwoKICAgICMgcmVnaXN0ZXIgb2JqZWN0IHBhcmFtcwogICAgJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJyA9PiB7CiAgICAgICAgICAgIExvZ1ByZWZpeCA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0NHSUxvZ1ByZWZpeCcpIHx8ICdDdXN0b21lcicsCiAgICAgICAgfSwKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcgPT4gewogICAgICAgICAgICBQU0dJRW52ID0+ICRQYXJhbXtQU0dJRW52fSB8fCAwLAogICAgICAgIH0sCiAgICApOwoKICAgICMgZGVidWcgaW5mbwogICAgaWYgKCAkU2VsZi0+e0RlYnVnfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0dsb2JhbCBoYW5kbGUgc3RhcnRlZC4uLicsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBDb250ZW50KCkKCmV4ZWN1dGUgdGhlIG9iamVjdC4KU2V0IGhlYWRlcnMgaW4gS2VybmVsczo6U3lzdGVtOjpXZWI6OlJlcXVlc3Qgc2luZ2xldG9uIGFzIHNpZGUgZWZmZWN0LgoKICAgIG15ICRDb250ZW50ID0gJEludGVyZmFjZS0+Q29udGVudCgpOwoKPWN1dAoKc3ViIENvbnRlbnQgeyAgICAjIyBubyBjcml0aWMgcXcoU3Vicm91dGluZXM6OlJlcXVpcmVGaW5hbFJldHVybikKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgQ2hlY2sgaWYgaHR0cHMgZm9yY2luZyBpcyBhY3RpdmUsIGFuZCByZWRpcmVjdCBpZiBuZWVkZWQuCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnSFRUUFNGb3JjZVJlZGlyZWN0JykgKSB7CgogICAgICAgICMgQWxsb3cgSFRUUFMgdG8gYmUgJ29uJyBpbiBhIGNhc2UgaW5zZW5zaXRpdmUgd2F5LgogICAgICAgICMgSW4gT1RPQk8gMTAuMC4xIGl0IGhhZCB0byBiZSBsb3dlcmNhc2UgJ29uJy4KICAgICAgICBteSAkSFRUUFMgPSAkUGFyYW1PYmplY3QtPkhUVFBTKCdIVFRQUycpIC8vICcnOwogICAgICAgIGlmICggbGMgJEhUVFBTIG5lICdvbicgKSB7CiAgICAgICAgICAgIG15ICRIb3N0ICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkhUVFAoJ0hPU1QnKSB8fCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZRRE4nKTsKICAgICAgICAgICAgbXkgJFJlcXVlc3RVUkkgICA9ICRQYXJhbU9iamVjdC0+UmVxdWVzdFVSSSgpOwogICAgICAgICAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+UmVkaXJlY3QoIEV4dFVSTCA9PiAiaHR0cHM6Ly8kSG9zdCRSZXF1ZXN0VVJJIiApOyAgICAjIHRocm93IGEgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uIGV4Y2VwdGlvbgogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjb21tb24gZnJhbWV3b3JrIHBhcmFtcwogICAgbXkgJVBhcmFtOwogICAgJFBhcmFte1Nlc3Npb25OYW1lfSA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFNlc3Npb25OYW1lJykgICAgICAgICB8fCAnQ1NJRCc7CiAgICAkUGFyYW17U2Vzc2lvbklEfSAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte1Nlc3Npb25OYW1lfSApIHx8ICcnOwoKICAgICMgZHJvcCBvbGQgc2Vzc2lvbiBpZCAoaWYgZXhpc3RzKQogICAgbXkgJFF1ZXJ5U3RyaW5nID0gJFBhcmFtT2JqZWN0LT5RdWVyeVN0cmluZygpIHx8ICcnOwogICAgJFF1ZXJ5U3RyaW5nID1+IHMvKFw/fCZ8O3wpJFBhcmFte1Nlc3Npb25OYW1lfSg9Jnw9O3w9Lis/Jnw9Lis/JCkvOy9nOwoKICAgICMgZGVmaW5lIGZyYW1ld29yayBwYXJhbXMKICAgIHsKICAgICAgICBteSAlRnJhbWV3b3JrUGFyYW1zID0gKAogICAgICAgICAgICBMYW5nICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIEFjdGlvbiAgICAgICA9PiAnJywKICAgICAgICAgICAgU3ViYWN0aW9uICAgID0+ICcnLAogICAgICAgICAgICBSZXF1ZXN0ZWRVUkwgPT4gJFF1ZXJ5U3RyaW5nLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJUZyYW1ld29ya1BhcmFtcyApIHsKICAgICAgICAgICAgJFBhcmFteyRLZXl9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApIHx8ICRGcmFtZXdvcmtQYXJhbXN7JEtleX07CiAgICAgICAgfQogICAgfQoKICAgICMgdmFsaWRhdGUgbGFuZ3VhZ2UKICAgIGlmICggJFBhcmFte0xhbmd9ICYmICRQYXJhbXtMYW5nfSAhfiBte1xBW2Etel17Mn0oPzpfW0EtWl17Mn0pP1x6fXhtcyApIHsKICAgICAgICBkZWxldGUgJFBhcmFte0xhbmd9OwogICAgfQoKICAgICMgQ2hlY2sgaWYgdGhlIGJyb3dzZXIgc2VuZHMgdGhlIFNlc3Npb25JRCBjb29raWUgYW5kIHNldCB0aGUgU2Vzc2lvbklELWNvb2tpZQogICAgIyBhcyBTZXNzaW9uSUQhIEdFVCBvciBQT1NUIFNlc3Npb25JRCBoYXZlIHRoZSBsb3dlc3QgcHJpb3JpdHkuCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnU2Vzc2lvblVzZUNvb2tpZScpICkgewogICAgICAgICRQYXJhbXtTZXNzaW9uSURDb29raWV9ID0gJFBhcmFtT2JqZWN0LT5HZXRDb29raWUoIEtleSA9PiAkUGFyYW17U2Vzc2lvbk5hbWV9ICk7CiAgICAgICAgaWYgKCAkUGFyYW17U2Vzc2lvbklEQ29va2llfSApIHsKICAgICAgICAgICAgJFBhcmFte1Nlc3Npb25JRH0gPSAkUGFyYW17U2Vzc2lvbklEQ29va2llfTsKICAgICAgICB9CiAgICB9CgogICAgJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JyA9PiB7CiAgICAgICAgICAgIExhbmcgPT4gJFBhcmFte0xhbmd9LAogICAgICAgIH0sCiAgICAgICAgJ0tlcm5lbDo6TGFuZ3VhZ2UnID0+IHsKICAgICAgICAgICAgVXNlckxhbmd1YWdlID0+ICRQYXJhbXtMYW5nfQogICAgICAgIH0sCiAgICApOwoKICAgICMgUmVzdHJpY3QgQ29va2llIHRvIEhUVFBTIGlmIGl0IGlzIHVzZWQuCiAgICBteSAkQ29va2llU2VjdXJlQXR0cmlidXRlID0gJENvbmZpZ09iamVjdC0+R2V0KCdIdHRwVHlwZScpIGVxICdodHRwcycgPyAxIDogdW5kZWY7CgogICAgbXkgJERCQ2FuQ29ubmVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5Db25uZWN0KCk7CgogICAgaWYgKCAhJERCQ2FuQ29ubmVjdCB8fCAkUGFyYW1PYmplY3QtPkVycm9yKCkgKSB7CiAgICAgICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgICAgICBpZiAoICEkREJDYW5Db25uZWN0ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7ICAgICMgdGhyb3dzIGEgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uCiAgICAgICAgfQogICAgICAgIGlmICggJFBhcmFtT2JqZWN0LT5FcnJvcigpICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRQYXJhbU9iamVjdC0+RXJyb3IoKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsgICAgIyB0aHJvd3MgYSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24KICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY29tbW9uIGFwcGxpY2F0aW9uIGFuZCBhZGQtb24gYXBwbGljYXRpb24gcGFyYW1zCiAgICBteSAlQ29tbW9uT2JqZWN0UGFyYW0gPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyRnJvbnRlbmQ6OkNvbW1vblBhcmFtJykgfTsKICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVDb21tb25PYmplY3RQYXJhbSApIHsKICAgICAgICAkUGFyYW17JEtleX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICkgfHwgJENvbW1vbk9iamVjdFBhcmFteyRLZXl9OwogICAgfQoKICAgICMgc2VjdXJpdHkgY2hlY2sgQWN0aW9uIFBhcmFtIChyZXBsYWNlIG5vbi13b3JkIGNoYXJzKQogICAgJFBhcmFte0FjdGlvbn0gPX4gcy9cVy8vZzsKCiAgICBteSAkU2Vzc2lvbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpBdXRoU2Vzc2lvbicpOwogICAgbXkgJFVzZXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CgogICAgIyBjaGVjayByZXF1ZXN0IHR5cGUKICAgIGlmICggJFBhcmFte0FjdGlvbn0gZXEgJ1ByZUxvZ2luJyApIHsKICAgICAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgICAgICRQYXJhbXtSZXF1ZXN0ZWRVUkx9IHx8PSAnQWN0aW9uPUN1c3RvbWVyRGFzaGJvYXJkJzsKCiAgICAgICAgIyBsb2dpbiBzY3JlZW4KICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgVGl0bGUgPT4gJ0xvZ2luJywKICAgICAgICAgICAgTW9kZSAgPT4gJ1ByZUxvZ2luJywKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtBY3Rpb259IGVxICdMb2dpbicgKSB7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRQb3N0VXNlciA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdVc2VyJyApIHx8ICcnOwoKICAgICAgICBteSAkUHJldmVudEJydXRlRm9yY2VDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1NpbXBsZUJydXRlRm9yY2VQcm90ZWN0aW9uOjpHZW5lcmFsU2V0dGluZ3MnKTsKCiAgICAgICAgIyBpZiBzaW1wbGVicnV0ZWZvcmNlY29uZmlnIGlzIHZhbGlkCiAgICAgICAgaWYgKCAkUHJldmVudEJydXRlRm9yY2VDb25maWcgJiYgJFBvc3RVc2VyICkgewoKICAgICAgICAgICAgIyBjaGVjayBpZiB0aGUgbG9naW4gaXMgYmFubmVkCiAgICAgICAgICAgIG15ICRDYWNoZU9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CiAgICAgICAgICAgIG15ICRDaGVja0hhc2hVc2VyID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgICAgICAgICBUeXBlID0+ICdCYW5uZWRMb2dpbnNDdXN0b21lcicsCiAgICAgICAgICAgICAgICBLZXkgID0+ICRQb3N0VXNlciwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgQ2FjaGUgQ2hlY2tIYXNoVXNlciBleGlzdHMKICAgICAgICAgICAgaWYgKCRDaGVja0hhc2hVc2VyKSB7CiAgICAgICAgICAgICAgICBteSAlQmFuU3RhdHVzID0gJFNlbGYtPl9DaGVja0FuZFJlbW92ZUZyb21CYW5uZWRMaXN0KAogICAgICAgICAgICAgICAgICAgIFBvc3RVc2VyICAgICAgICAgICAgICAgID0+ICRQb3N0VXNlciwKICAgICAgICAgICAgICAgICAgICBQcmV2ZW50QnJ1dGVGb3JjZUNvbmZpZyA9PiAkUHJldmVudEJydXRlRm9yY2VDb25maWcsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggJEJhblN0YXR1c3tCYW5uZWR9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIG91dHB1dCBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyTG9naW4oCiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGUgICA9PiAnTG9naW4nLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUb28gbWFueSBmYWlsZWQgbG9naW4gYXR0ZW1wdHMsIHBsZWFzZSByZXRyeSBpbiAlcyBzLicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQmFuU3RhdHVze1Jlc2lkdWFsVGltZX0KICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgTG9naW5GYWlsZWQgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVR5cGUgPT4gJ0Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgVXNlciAgICAgICAgPT4gJFBvc3RVc2VyLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRQb3N0UHcgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKAogICAgICAgICAgICBQYXJhbSA9PiAnUGFzc3dvcmQnLAogICAgICAgICAgICBSYXcgICA9PiAxCiAgICAgICAgKSB8fCAnJzsKICAgICAgICBteSAkUG9zdFR3b0ZhY3RvclRva2VuID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSgKICAgICAgICAgICAgUGFyYW0gPT4gJ1R3b0ZhY3RvclRva2VuJywKICAgICAgICAgICAgUmF3ICAgPT4gMQogICAgICAgICkgfHwgJyc7CgogICAgICAgICMgY3JlYXRlIEF1dGhPYmplY3QKICAgICAgICBteSAkQXV0aE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckF1dGgnKTsKCiMgUm90aGVyIE9TUyAvIE9uZVRpbWVBdXRoZW50aWNhdGlvbkxpbmsKICAgICAgICBteSAlRXh0ZW5kZWRBdXRoUGFyYW1zOwogICAgICAgIGZvciBteSAkTmFtZSAoICRBdXRoT2JqZWN0LT5FeHRlbmRlZFBhcmFtTmFtZXMoKSApIHsKICAgICAgICAgICAgJEV4dGVuZGVkQXV0aFBhcmFtc3skTmFtZX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKAogICAgICAgICAgICAgICAgUGFyYW0gPT4gJE5hbWUsCiAgICAgICAgICAgICAgICBSYXcgICA9PiAxCiAgICAgICAgICAgICkgfHwgJyc7CiAgICAgICAgfQojIEVPIE9uZVRpbWVBdXRoZW50aWNhdGlvbkxpbmsKCiAgICAgICAgIyBjaGVjayBzdWJtaXR0ZWQgZGF0YQogICAgICAgIG15ICRVc2VyID0gJEF1dGhPYmplY3QtPkF1dGgoCiAgICAgICAgICAgIFVzZXIgICAgICAgICAgID0+ICRQb3N0VXNlciwKICAgICAgICAgICAgUHcgICAgICAgICAgICAgPT4gJFBvc3RQdywKICAgICAgICAgICAgVHdvRmFjdG9yVG9rZW4gPT4gJFBvc3RUd29GYWN0b3JUb2tlbiwKIyBSb3RoZXIgT1NTIC8gT25lVGltZUF1dGhlbnRpY2F0aW9uTGluawogICAgICAgICAgICAlRXh0ZW5kZWRBdXRoUGFyYW1zLAojIEVPIE9uZVRpbWVBdXRoZW50aWNhdGlvbkxpbmsKICAgICAgICApOwoKICAgICAgICAjIGFkZGl0aW9uYWwgdGFza3MgLyBpbmZvCiAgICAgICAgbXkgJFBvc3RBdXRoID0gJEF1dGhPYmplY3QtPlBvc3RBdXRoKCk7CgogICAgICAgIGlmICgkUG9zdEF1dGgpIHsKICAgICAgICAgICAgJFBhcmFte1JlcXVlc3RlZFVSTH0gPSAkUG9zdEF1dGgtPntSZXF1ZXN0ZWRVUkx9IC8vICRQYXJhbXtSZXF1ZXN0ZWRVUkx9OwogICAgICAgIH0KCiAgICAgICAgIyBsb2dpbiBpcyBpbnZhbGlkCiAgICAgICAgaWYgKCAhJFVzZXIgKSB7CgogICAgICAgICAgICBteSAkRXhwaXJlcyA9ICcrJyAuICRDb25maWdPYmplY3QtPkdldCgnU2Vzc2lvbk1heFRpbWUnKSAuICdzJzsKICAgICAgICAgICAgaWYgKCAhJENvbmZpZ09iamVjdC0+R2V0KCdTZXNzaW9uVXNlQ29va2llQWZ0ZXJCcm93c2VyQ2xvc2UnKSApIHsKICAgICAgICAgICAgICAgICRFeHBpcmVzID0gJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdGVudGF0aXZlbHkgc2V0IGFuIHVzZWxlc3MgY29va2llLCBmb3IgY2hlY2tpbmcgY29va2llIHN1cHBvcnQKICAgICAgICAgICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+U2V0Q29va2llKAogICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJ09UT0JPQnJvd3Nlckhhc0Nvb2tpZScsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICA9PiAxLAogICAgICAgICAgICAgICAgRXhwaXJlcyAgPT4gJEV4cGlyZXMsCiAgICAgICAgICAgICAgICBQYXRoICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1NjcmlwdEFsaWFzJyksCiAgICAgICAgICAgICAgICBTZWN1cmUgICA9PiAkQ29va2llU2VjdXJlQXR0cmlidXRlLAogICAgICAgICAgICAgICAgSFRUUE9ubHkgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gYWx0ZXJuYXRlIGxvZ2luCiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsTG9naW5VUkwnKSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0ZWRVUkx9ID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSggJFBhcmFte1JlcXVlc3RlZFVSTH0gKTsKCiAgICAgICAgICAgICAgICAjIHRocm93IGEgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uIHRoYXQgcmVkaXJlY3RzCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgICAgICBFeHRVUkwgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsTG9naW5VUkwnKSAuICI/UmVhc29uPUxvZ2luRmFpbGVkJlJlcXVlc3RlZFVSTD0kUGFyYW17UmVxdWVzdGVkVVJMfSIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRQcmV2ZW50QnJ1dGVGb3JjZUNvbmZpZyAmJiAkUG9zdFVzZXIgKSB7CgogICAgICAgICAgICAgICAgIyBwcmV2ZW50IGJydXRlIGZvcmNlCiAgICAgICAgICAgICAgICBteSAkQmFubmVkID0gJFNlbGYtPl9TdG9yZUZhaWxlZExvZ2lucygKICAgICAgICAgICAgICAgICAgICBQb3N0VXNlciAgICAgICAgICAgICAgICA9PiAkUG9zdFVzZXIsCiAgICAgICAgICAgICAgICAgICAgUHJldmVudEJydXRlRm9yY2VDb25maWcgPT4gJFByZXZlbnRCcnV0ZUZvcmNlQ29uZmlnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoJEJhbm5lZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckxvZ2luKAogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ0xvZ2luJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVG9vIG1hbnkgZmFpbGVkIGxvZ2luIGF0dGVtcHRzLCBwbGVhc2UgcmV0cnkgaW4gJXMgcy4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFByZXZlbnRCcnV0ZUZvcmNlQ29uZmlnLT57QmFuRHVyYXRpb259CiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgIExvZ2luRmFpbGVkID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VUeXBlID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXIgICAgICAgID0+ICRQb3N0VXNlciwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgbm9ybWFsIGxvZ2luCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckxvZ2luKAogICAgICAgICAgICAgICAgVGl0bGUgICA9PiAnTG9naW4nLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkQXV0aE9iamVjdC0+R2V0TGFzdEVycm9yTWVzc2FnZSgpCiAgICAgICAgICAgICAgICAgICAgfHwgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5HZXRMb2dFbnRyeSgKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnSW5mbycsCiAgICAgICAgICAgICAgICAgICAgICAgIFdoYXQgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB8fCBUcmFuc2xhdGFibGUoJ0xvZ2luIGZhaWxlZCEgWW91ciB1c2VyIG5hbWUgb3IgcGFzc3dvcmQgd2FzIGVudGVyZWQgaW5jb3JyZWN0bHkuJyksCiAgICAgICAgICAgICAgICBMb2dpbkZhaWxlZCA9PiAxLAogICAgICAgICAgICAgICAgVXNlciAgICAgICAgPT4gJFBvc3RVc2VyLAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBsb2dpbiBpcyBzdWNjZXNzZnVsCiAgICAgICAgbXkgJVVzZXJEYXRhID0gJFVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgIFVzZXIgID0+ICRVc2VyLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgY29va2llcwogICAgICAgIGlmICggJFBhcmFtT2JqZWN0LT5HZXRDb29raWUoIEtleSA9PiAnT1RPQk9Ccm93c2VySGFzQ29va2llJyApICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcgPT4gewogICAgICAgICAgICAgICAgICAgIEJyb3dzZXJIYXNDb29raWUgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIG5lZWRlZCBkYXRhCiAgICAgICAgaWYgKCAhJFVzZXJEYXRhe1VzZXJJRH0gfHwgISRVc2VyRGF0YXtVc2VyTG9naW59ICkgewoKICAgICAgICAgICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gYWx0ZXJuYXRlIGxvZ2luCiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsTG9naW5VUkwnKSApIHsKCiAgICAgICAgICAgICAgICAjIHRocm93IGEgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uIHRoYXQgcmVkaXJlY3RzCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgICAgICBFeHRVUkwgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsTG9naW5VUkwnKSAuICc/UmVhc29uPVN5c3RlbUVycm9yJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyBuZWVkIHVzZXIgZGF0YSBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckxvZ2luKAogICAgICAgICAgICAgICAgVGl0bGUgICA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0YWJsZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0F1dGhlbnRpY2F0aW9uIHN1Y2NlZWRlZCwgYnV0IG5vIGN1c3RvbWVyIHJlY29yZCBpcyBmb3VuZCBpbiB0aGUgY3VzdG9tZXIgYmFja2VuZC4gUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBkYXRldGltZSBvYmplY3QKICAgICAgICBteSAkU2Vzc2lvbkRUT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CgogICAgICAgICMgUmVtb3ZlIGNlcnRhaW4gdXNlciBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5vdCBuZWVkZWQgdG8gYmUgc3RvcmVkIGluIHRoZSBzZXNzaW9uLgogICAgICAgICMgICAtIFNNSU1FIENlcnRpZmljYXRlIGNvdWxkIGJlIGluIGJpbmFyeSBmb3JtYXQsIGlmIHNlc3Npb24gYmFja2VuZCBpbiBEQiAoZGVmYXVsdCkKICAgICAgICAjICAgaXQgd29udCBiZSBwb3NzaWJsZSB0byBiZSBzYXZlZCBpbiBjZXJ0YWluIGRhdGFiYXNlcyAoc2VlIGJ1ZyMxNDQwNSkuCiAgICAgICAgbXkgJVVzZXJTZXNzaW9uRGF0YSA9ICVVc2VyRGF0YTsKICAgICAgICBkZWxldGUgJFVzZXJTZXNzaW9uRGF0YXtVc2VyU01JTUVDZXJ0aWZpY2F0ZX07CgogICAgICAgICMgY3JlYXRlIG5ldyBzZXNzaW9uIGlkCiAgICAgICAgbXkgJE5ld1Nlc3Npb25JRCA9ICRTZXNzaW9uT2JqZWN0LT5DcmVhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgICVVc2VyU2Vzc2lvbkRhdGEsCiAgICAgICAgICAgIFVzZXJMYXN0UmVxdWVzdCA9PiAkU2Vzc2lvbkRUT2JqZWN0LT5Ub0Vwb2NoKCksCiAgICAgICAgICAgIFVzZXJUeXBlICAgICAgICA9PiAnQ3VzdG9tZXInLAogICAgICAgICAgICBTZXNzaW9uU291cmNlICAgPT4gJ0N1c3RvbWVySW50ZXJmYWNlJywKICAgICAgICApOwoKICAgICAgICAjIHNob3cgZXJyb3IgbWVzc2FnZSBpZiBubyBzZXNzaW9uIGlkIGhhcyBiZWVuIGNyZWF0ZWQKICAgICAgICBpZiAoICEkTmV3U2Vzc2lvbklEICkgewoKICAgICAgICAgICAgIyBnZXQgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICBteSAkRXJyb3IgPSAkU2Vzc2lvbk9iamVjdC0+U2Vzc2lvbklERXJyb3JNZXNzYWdlKCkgfHwgJyc7CgogICAgICAgICAgICAjIG91dHB1dCBlcnJvciBtZXNzYWdlCiAgICAgICAgICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ0xvZ2luJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJEVycm9yLAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBleGVjdXRpb24gaW4gMjAgc2Vjb25kcwogICAgICAgIG15ICRFeGVjdXRpb25UaW1lT2JqID0gJFNlc3Npb25EVE9iamVjdC0+Q2xvbmUoKTsKICAgICAgICAkRXhlY3V0aW9uVGltZU9iai0+QWRkKCBTZWNvbmRzID0+IDIwICk7CiAgICAgICAgbXkgJEV4ZWN1dGlvblRpbWUgPSAkRXhlY3V0aW9uVGltZU9iai0+VG9TdHJpbmcoKTsKCiAgICAgICAgIyBhZGQgYSBhc3luY2hyb25vdXMgZXhlY3V0b3Igc2NoZWR1bGVyIHRhc2sgdG8gY291bnQgdGhlIGNvbmN1cnJlbnQgdXNlcgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTY2hlZHVsZXInKS0+VGFza0FkZCgKICAgICAgICAgICAgRXhlY3V0aW9uVGltZSAgICAgICAgICAgID0+ICRFeGVjdXRpb25UaW1lLAogICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJ0FzeW5jaHJvbm91c0V4ZWN1dG9yJywKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgICAgID0+ICdQbHVnaW5Bc3luY2hyb25vdXM6OkNvbmN1cnJlbnRVc2VyJywKICAgICAgICAgICAgTWF4aW11bVBhcmFsbGVsSW5zdGFuY2VzID0+IDEsCiAgICAgICAgICAgIERhdGEgICAgICAgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBPYmplY3QgICA9PiAnS2VybmVsOjpTeXN0ZW06OlN1cHBvcnREYXRhQ29sbGVjdG9yOjpQbHVnaW5Bc3luY2hyb25vdXM6Ok9UT0JPOjpDb25jdXJyZW50VXNlcnMnLAogICAgICAgICAgICAgICAgRnVuY3Rpb24gPT4gJ1J1bkFzeW5jaHJvbm91cycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFVzZXJUaW1lWm9uZSA9ICRTZWxmLT5fVXNlclRpbWVab25lR2V0KCVVc2VyRGF0YSk7CgogICAgICAgICRTZXNzaW9uT2JqZWN0LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkTmV3U2Vzc2lvbklELAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ1VzZXJUaW1lWm9uZScsCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAkVXNlclRpbWVab25lLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgdGhlIHRpbWUgem9uZSBvZmZzZXQgcmVwb3J0ZWQgYnkgdGhlIHVzZXIncyBicm93c2VyIGRpZmZlcnMgZnJvbSB0aGF0CiAgICAgICAgIyBvZiB0aGUgT1RPQk8gdXNlcidzIHRpbWUgem9uZSBvZmZzZXQKICAgICAgICBteSAkRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFRpbWVab25lID0+ICRVc2VyVGltZVpvbmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBteSAkT1RPQk9Vc2VyVGltZVpvbmVPZmZzZXQgPSAkRGF0ZVRpbWVPYmplY3QtPkZvcm1hdCggRm9ybWF0ID0+ICcle29mZnNldH0nICkgLyA2MDsKICAgICAgICBteSAkQnJvd3NlclRpbWVab25lT2Zmc2V0ICAgPSAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUaW1lWm9uZU9mZnNldCcgKSB8fCAwICkgKiAtMTsKCiAgICAgICAgIyBUaW1lWm9uZU9mZnNldERpZmZlcmVuY2UgY29udGFpbnMgdGhlIGRpZmZlcmVuY2Ugb2YgdGhlIHRpbWUgem9uZSBvZmZzZXQgYmV0d2VlbgogICAgICAgICMgdGhlIHVzZXIncyBPVE9CTyB0aW1lIHpvbmUgc2V0dGluZyBhbmQgdGhlIG9uZSByZXBvcnRlZCBieSB0aGUgdXNlcidzIGJyb3dzZXIuCiAgICAgICAgIyBJZiB0aGVyZSBpcyBhIGRpZmZlcmVuY2UgaXQgY2FuIGJlIGV2YWx1YXRlZCBsYXRlciB0byBlLiBnLiBzaG93IGEgbWVzc2FnZQogICAgICAgICMgZm9yIHRoZSB1c2VyIHRvIGNoZWNrIGhpcyBPVE9CTyB0aW1lIHpvbmUgc2V0dGluZy4KICAgICAgICBteSAkVXNlclRpbWVab25lT2Zmc2V0RGlmZmVyZW5jZSA9IGFicyggJE9UT0JPVXNlclRpbWVab25lT2Zmc2V0IC0gJEJyb3dzZXJUaW1lWm9uZU9mZnNldCApOwogICAgICAgICRTZXNzaW9uT2JqZWN0LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkTmV3U2Vzc2lvbklELAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ1VzZXJUaW1lWm9uZU9mZnNldERpZmZlcmVuY2UnLAogICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFVzZXJUaW1lWm9uZU9mZnNldERpZmZlcmVuY2UsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgYSBuZXcgTGF5b3V0T2JqZWN0IHdpdGggU2Vzc2lvbklEQ29va2llCiAgICAgICAgbXkgJEV4cGlyZXMgPSAnKycgLiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25NYXhUaW1lJykgLiAncyc7CiAgICAgICAgaWYgKCAhJENvbmZpZ09iamVjdC0+R2V0KCdTZXNzaW9uVXNlQ29va2llQWZ0ZXJCcm93c2VyQ2xvc2UnKSApIHsKICAgICAgICAgICAgJEV4cGlyZXMgPSAnJzsKICAgICAgICB9CgogICAgICAgICRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICAgICAgICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnID0+IHsKICAgICAgICAgICAgICAgIFNldENvb2tpZXMgPT4gewogICAgICAgICAgICAgICAgICAgIFNlc3Npb25JRENvb2tpZSA9PiAkUGFyYW1PYmplY3QtPlNldENvb2tpZSgKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJFBhcmFte1Nlc3Npb25OYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gJE5ld1Nlc3Npb25JRCwKICAgICAgICAgICAgICAgICAgICAgICAgRXhwaXJlcyAgPT4gJEV4cGlyZXMsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhdGggICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnU2NyaXB0QWxpYXMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgU2VjdXJlICAgPT4gJENvb2tpZVNlY3VyZUF0dHJpYnV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgSFRUUE9ubHkgPT4gMSwKICAgICAgICAgICAgICAgICAgICApLAoKICAgICAgICAgICAgICAgICAgICAjIGRlbGV0ZSB0aGUgT1RPQk9Ccm93c2VySGFzQ29va2llIGNvb2tpZQogICAgICAgICAgICAgICAgICAgIE9UT0JPQnJvd3Nlckhhc0Nvb2tpZSA9PiAkUGFyYW1PYmplY3QtPlNldENvb2tpZSgKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJ09UT0JPQnJvd3Nlckhhc0Nvb2tpZScsCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBFeHBpcmVzICA9PiAnLTF5JywKICAgICAgICAgICAgICAgICAgICAgICAgUGF0aCAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdTY3JpcHRBbGlhcycpLAogICAgICAgICAgICAgICAgICAgICAgICBTZWN1cmUgICA9PiAkQ29va2llU2VjdXJlQXR0cmlidXRlLAogICAgICAgICAgICAgICAgICAgICAgICBIVFRQT25seSA9PiAxLAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgU2Vzc2lvbklEICAgPT4gJE5ld1Nlc3Npb25JRCwKICAgICAgICAgICAgICAgIFNlc3Npb25OYW1lID0+ICRQYXJhbXtTZXNzaW9uTmFtZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZWRpcmVjdCB3aXRoIG5ldyBzZXNzaW9uIGlkIGFuZCBvbGQgcGFyYW1zCiAgICAgICAgIyBwcmVwYXJlIG9sZCByZWRpcmVjdCBVUkwgLS0gZG8gbm90IHJlZGlyZWN0IHRvIExvZ2luIG9yIExvZ291dCAobG9vcCkhCiAgICAgICAgaWYgKCAkUGFyYW17UmVxdWVzdGVkVVJMfSA9fiAvQWN0aW9uPShMb2dvdXR8TG9naW58TG9zdFBhc3N3b3JkfFByZUxvZ2luKS8gKSB7CiAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0ZWRVUkx9ID0gJyc7CiAgICAgICAgfQoKICAgICAgICAjIHJlZGlyZWN0IHdpdGggbmV3IHNlc3Npb24gaWQKICAgICAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgICAgPT4gJFBhcmFte1JlcXVlc3RlZFVSTH0sCiAgICAgICAgICAgIExvZ2luID0+IDEsCiAgICAgICAgKTsgICAgIyB0aHJvd3MgYSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24KICAgIH0KCiAgICAjIGxvZ291dAogICAgZWxzaWYgKCAkUGFyYW17QWN0aW9ufSBlcSAnTG9nb3V0JyApIHsKCiAgICAgICAgIyBjaGVjayBzZXNzaW9uIGlkCiAgICAgICAgaWYgKCAhJFNlc3Npb25PYmplY3QtPkNoZWNrU2Vzc2lvbklEKCBTZXNzaW9uSUQgPT4gJFBhcmFte1Nlc3Npb25JRH0gKSApIHsKCiAgICAgICAgICAgICMgbmV3IGxheW91dCBvYmplY3QKICAgICAgICAgICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gYWx0ZXJuYXRlIGxvZ2luCiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsTG9naW5VUkwnKSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0ZWRVUkx9ID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSggJFBhcmFte1JlcXVlc3RlZFVSTH0gKTsKCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgICAgICBFeHRVUkwgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsTG9naW5VUkwnKQogICAgICAgICAgICAgICAgICAgICAgICAuICI/UmVhc29uPUludmFsaWRTZXNzaW9uSUQ7UmVxdWVzdGVkVVJMPSRQYXJhbXtSZXF1ZXN0ZWRVUkx9IiwKICAgICAgICAgICAgICAgICk7ICAgICMgdGhyb3dzIGEgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyBsb2dpbiBzY3JlZW4KICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyTG9naW4oCiAgICAgICAgICAgICAgICBUaXRsZSAgID0+ICdMb2dvdXQnLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1Nlc3Npb24gaW52YWxpZC4gUGxlYXNlIGxvZyBpbiBhZ2Fpbi4nKSwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHNlc3Npb24gZGF0YQogICAgICAgIG15ICVVc2VyRGF0YSA9ICRTZXNzaW9uT2JqZWN0LT5HZXRTZXNzaW9uSUREYXRhKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFBhcmFte1Nlc3Npb25JRH0sCiAgICAgICAgKTsKCiAgICAgICAgJFVzZXJEYXRhe1VzZXJUaW1lWm9uZX0gPSAkU2VsZi0+X1VzZXJUaW1lWm9uZUdldCglVXNlckRhdGEpOwoKICAgICAgICAjIGNyZWF0ZSBhIG5ldyBMYXlvdXRPYmplY3Qgd2l0aCAnJVBhcmFtJyBhbmQgJyVVc2VyRGF0YScKICAgICAgICAkS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAgICAgICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JyA9PiB7CiAgICAgICAgICAgICAgICBTZXRDb29raWVzID0+IHsKCiAgICAgICAgICAgICAgICAgICAgIyBkZWxldGUgdGhlIE9UT0JPIHNlc3Npb24gY29va2llCiAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbklEQ29va2llID0+ICRQYXJhbU9iamVjdC0+U2V0Q29va2llKAogICAgICAgICAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAkUGFyYW17U2Vzc2lvbk5hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgRXhwaXJlcyAgPT4gJy0xeScsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhdGggICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnU2NyaXB0QWxpYXMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgU2VjdXJlICAgPT4gJENvb2tpZVNlY3VyZUF0dHJpYnV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgSFRUUE9ubHkgPT4gMSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICVVc2VyRGF0YSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAkS2VybmVsOjpPTS0+T2JqZWN0c0Rpc2NhcmQoIE9iamVjdHMgPT4gWydLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0J10gKTsKICAgICAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICAgICAjIHJlbW92ZSBzZXNzaW9uIGlkCiAgICAgICAgaWYgKCAhJFNlc3Npb25PYmplY3QtPlJlbW92ZVNlc3Npb25JRCggU2Vzc2lvbklEID0+ICRQYXJhbXtTZXNzaW9uSUR9ICkgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKQogICAgICAgICAgICApOyAgICAjIHRocm93cyBhIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbgogICAgICAgIH0KCiAgICAgICAgIyByZWRpcmVjdCB0byBhbHRlcm5hdGUgbG9naW4KICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbExvZ291dFVSTCcpICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIEV4dFVSTCA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxMb2dvdXRVUkwnKSwKICAgICAgICAgICAgKTsgICAgIyB0aHJvd3MgYSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24KICAgICAgICB9CgogICAgICAgICMgdHJ5IGF1dGggbW9kdWxlIHNwZWNpZmljIGxvZ291dAogICAgICAgIG15ICRMb2dvdXRJbmZvID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQXV0aCcpLT5Mb2dvdXQoKTsKICAgICAgICBpZiAoICRMb2dvdXRJbmZvICYmICRMb2dvdXRJbmZvLT57TG9nb3V0VVJMfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBFeHRVUkwgPT4gJExvZ291dEluZm8tPntMb2dvdXRVUkx9LAogICAgICAgICAgICApOyAgICAjIHRocm93cyBhIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbgogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGxvZ291dCBzY3JlZW4KICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gJ0xvZ291dCcsCiAgICAgICAgICAgIE1lc3NhZ2UgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTG9nb3V0IHN1Y2Nlc3NmdWwuJyksCiAgICAgICAgICAgIE1lc3NhZ2VUeXBlID0+ICdTdWNjZXNzJywKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBsb3N0IHBhc3N3b3JkCiAgICBlbHNpZiAoICRQYXJhbXtBY3Rpb259IGVxICdDdXN0b21lckxvc3RQYXNzd29yZCcgKSB7CgogICAgICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgICAgICMgY2hlY2sgZmVhdHVyZQogICAgICAgIGlmICggISRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbExvc3RQYXNzd29yZCcpICkgewoKICAgICAgICAgICAgIyBzaG93IG5vcm1hbCBsb2dpbgogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ0xvZ2luJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdGZWF0dXJlIG5vdCBhY3RpdmUhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAkVXNlciAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVXNlcicgKSAgfHwgJyc7CiAgICAgICAgbXkgJFRva2VuID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Rva2VuJyApIHx8ICcnOwoKICAgICAgICAjIGdldCB1c2VyIGxvZ2luIGJ5IHRva2VuCiAgICAgICAgaWYgKCAhJFVzZXIgJiYgJFRva2VuICkgewoKICAgICAgICAgICAgIyBQcmV2ZW50IGV4dHJhY3RpbmcgcGFzc3dvcmQgcmVzZXQgdG9rZW4gY2hhcmFjdGVyLWJ5LWNoYXJhY3RlciB2aWEgd2lsZGNhcmQgaW5qZWN0aW9uCiAgICAgICAgICAgICMgVGhlIHdpbGQgY2FyZCBjaGFyYWN0ZXJzICIlIiBhbmQgIl8iIGNvdWxkIGJlIHVzZWQgdG8gbWF0Y2ggYXJiaXRyYXJ5IGNoYXJhY3Rlci4KICAgICAgICAgICAgaWYgKCAkVG9rZW4gIX4gbXtcQSAoPzogW2EtekEtWl0gfCBcZCApKyBcen14bXMgKSB7CgogICAgICAgICAgICAgICAgIyBTZWN1cml0eTogcHJldGVuZCB0aGF0IHBhc3N3b3JkIHJlc2V0IGluc3RydWN0aW9ucyB3ZXJlIGFjdHVhbGx5IHNlbnQgdG8KICAgICAgICAgICAgICAgICMgICBtYWtlIHN1cmUgdGhhdCB1c2VycyBjYW5ub3QgZmluZCBvdXQgdmFsaWQgdXNlcm5hbWVzIGJ5CiAgICAgICAgICAgICAgICAjICAganVzdCB0cnlpbmcgYW5kIGNoZWNraW5nIHRoZSByZXN1bHQgbWVzc2FnZS4KICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Mb2dpbigKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICAgICA9PiAnTG9naW4nLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgICAgID0+IFRyYW5zbGF0YWJsZSgnU2VudCBwYXNzd29yZCByZXNldCBpbnN0cnVjdGlvbnMuIFBsZWFzZSBjaGVjayB5b3VyIGVtYWlsLicpLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VUeXBlID0+ICdTdWNjZXNzJywKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAlVXNlckxpc3QgPSAkVXNlck9iamVjdC0+U2VhcmNoUHJlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICBLZXkgICA9PiAnVXNlclRva2VuJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRUb2tlbiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgVVNFUl9JRDoKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJVVzZXJMaXN0ICkgewogICAgICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJFVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlciAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICglVXNlckRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAkVXNlciA9ICRVc2VyRGF0YXtVc2VyTG9naW59OwoKICAgICAgICAgICAgICAgICAgICBsYXN0IFVTRVJfSUQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHVzZXIgZGF0YQogICAgICAgIG15ICVVc2VyRGF0YSA9ICRVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICBVc2VyID0+ICRVc2VyLAogICAgICAgICk7CgogICAgICAgICMgdmVyaWZ5IGN1c3RvbWVyIHVzZXIgaXMgdmFsaWQgd2hlbiByZXF1ZXN0aW5nIHBhc3N3b3JkIHJlc2V0CiAgICAgICAgbXkgQFZhbGlkSURzICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCk7CiAgICAgICAgbXkgJFVzZXJJc1ZhbGlkID0gZ3JlcCB7ICRVc2VyRGF0YXtWYWxpZElEfSAmJiAkVXNlckRhdGF7VmFsaWRJRH0gPT0gJF8gfSBAVmFsaWRJRHM7CiAgICAgICAgaWYgKCAhJFVzZXJEYXRhe1VzZXJJRH0gfHwgISRVc2VySXNWYWxpZCApIHsKCiAgICAgICAgICAgICMgU2VjdXJpdHk6IHByZXRlbmQgdGhhdCBwYXNzd29yZCByZXNldCBpbnN0cnVjdGlvbnMgd2VyZSBhY3R1YWxseSBzZW50IHRvCiAgICAgICAgICAgICMgICBtYWtlIHN1cmUgdGhhdCB1c2VycyBjYW5ub3QgZmluZCBvdXQgdmFsaWQgdXNlcm5hbWVzIGJ5CiAgICAgICAgICAgICMgICBqdXN0IHRyeWluZyBhbmQgY2hlY2tpbmcgdGhlIHJlc3VsdCBtZXNzYWdlLgogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgID0+ICdMb2dpbicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgICA9PiBUcmFuc2xhdGFibGUoJ1NlbnQgcGFzc3dvcmQgcmVzZXQgaW5zdHJ1Y3Rpb25zLiBQbGVhc2UgY2hlY2sgeW91ciBlbWFpbC4nKSwKICAgICAgICAgICAgICAgIE1lc3NhZ2VUeXBlID0+ICdTdWNjZXNzJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIGVtYWlsIG9iamVjdAogICAgICAgIG15ICRFbWFpbE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbCcpOwoKICAgICAgICAjIHNlbmQgcGFzc3dvcmQgcmVzZXQgdG9rZW4KICAgICAgICBpZiAoICEkVG9rZW4gKSB7CgogICAgICAgICAgICAjIGdlbmVyYXRlIHRva2VuCiAgICAgICAgICAgICRVc2VyRGF0YXtUb2tlbn0gPSAkVXNlck9iamVjdC0+VG9rZW5HZW5lcmF0ZSgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlckRhdGF7VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2VuZCB0b2tlbiBub3RpZnkgZW1haWwgd2l0aCBsaW5rCiAgICAgICAgICAgIG15ICRCb2R5ID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsQm9keUxvc3RQYXNzd29yZFRva2VuJykKICAgICAgICAgICAgICAgIHx8ICdFUlJPUjogQ3VzdG9tZXJQYW5lbEJvZHlMb3N0UGFzc3dvcmRUb2tlbiBpcyBtaXNzaW5nISc7CiAgICAgICAgICAgIG15ICRTdWJqZWN0ID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsU3ViamVjdExvc3RQYXNzd29yZFRva2VuJykKICAgICAgICAgICAgICAgIHx8ICdFUlJPUjogQ3VzdG9tZXJQYW5lbFN1YmplY3RMb3N0UGFzc3dvcmRUb2tlbiBpcyBtaXNzaW5nISc7CiAgICAgICAgICAgIGZvciAoIHNvcnQga2V5cyAlVXNlckRhdGEgKSB7CiAgICAgICAgICAgICAgICAkQm9keSA9fiBzLzxPVE9CT18kXz4vJFVzZXJEYXRheyRffS9naTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkU2VudCA9ICRFbWFpbE9iamVjdC0+U2VuZCgKICAgICAgICAgICAgICAgIFRvICAgICAgID0+ICRVc2VyRGF0YXtVc2VyRW1haWx9LAogICAgICAgICAgICAgICAgU3ViamVjdCAgPT4gJFN1YmplY3QsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICAgICAgTWltZVR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgQm9keSAgICAgPT4gJEJvZHkKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJFNlbnQtPntTdWNjZXNzfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgKTsgICAgIyB0aHJvd3MgYSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyTG9naW4oCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICA9PiAnTG9naW4nLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgICAgPT4gVHJhbnNsYXRhYmxlKCdTZW50IHBhc3N3b3JkIHJlc2V0IGluc3RydWN0aW9ucy4gUGxlYXNlIGNoZWNrIHlvdXIgZW1haWwuJyksCiAgICAgICAgICAgICAgICBNZXNzYWdlVHlwZSA9PiAnU3VjY2VzcycsCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHJlc2V0IHBhc3N3b3JkCiAgICAgICAgIyBjaGVjayBpZiB0b2tlbiBpcyB2YWxpZAogICAgICAgIG15ICRUb2tlblZhbGlkID0gJFVzZXJPYmplY3QtPlRva2VuQ2hlY2soCiAgICAgICAgICAgIFRva2VuICA9PiAkVG9rZW4sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlckRhdGF7VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkVG9rZW5WYWxpZCApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyTG9naW4oCiAgICAgICAgICAgICAgICBUaXRsZSAgID0+ICdMb2dpbicsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnSW52YWxpZCBUb2tlbiEnKSwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IG5ldyBwYXNzd29yZAogICAgICAgICRVc2VyRGF0YXtOZXdQV30gPSAkVXNlck9iamVjdC0+R2VuZXJhdGVSYW5kb21QYXNzd29yZCgpOwoKICAgICAgICAjIHVwZGF0ZSBuZXcgcGFzc3dvcmQKICAgICAgICBteSAkU3VjY2VzcyA9ICRVc2VyT2JqZWN0LT5TZXRQYXNzd29yZCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRVc2VyLAogICAgICAgICAgICBQVyAgICAgICAgPT4gJFVzZXJEYXRhe05ld1BXfQogICAgICAgICk7CgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ0xvZ2luJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdSZXNldCBwYXNzd29yZCB1bnN1Y2Nlc3NmdWwuIFBsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgVXNlciAgICA9PiAkVXNlciwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2VuZCBub3RpZnkgZW1haWwKICAgICAgICBteSAkQm9keSA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbEJvZHlMb3N0UGFzc3dvcmQnKQogICAgICAgICAgICB8fCAnTmV3IFBhc3N3b3JkIGlzOiA8T1RPQk9fTkVXUFc+JzsKICAgICAgICBteSAkU3ViamVjdCA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFN1YmplY3RMb3N0UGFzc3dvcmQnKQogICAgICAgICAgICB8fCAnTmV3IFBhc3N3b3JkISc7CiAgICAgICAgZm9yICggc29ydCBrZXlzICVVc2VyRGF0YSApIHsKICAgICAgICAgICAgJEJvZHkgPX4gcy88T1RPQk9fJF8+LyRVc2VyRGF0YXskX30vZ2k7CiAgICAgICAgfQogICAgICAgIG15ICRTZW50ID0gJEVtYWlsT2JqZWN0LT5TZW5kKAogICAgICAgICAgICBUbyAgICAgICA9PiAkVXNlckRhdGF7VXNlckVtYWlsfSwKICAgICAgICAgICAgU3ViamVjdCAgPT4gJFN1YmplY3QsCiAgICAgICAgICAgIENoYXJzZXQgID0+ICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgIE1pbWVUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgQm9keSAgICAgPT4gJEJvZHkKICAgICAgICApOwoKICAgICAgICBpZiAoICEkU2VudC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7ICAgICMgdGhyb3dzIGEgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uCiAgICAgICAgfQogICAgICAgIG15ICRNZXNzYWdlID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAnU2VudCBuZXcgcGFzc3dvcmQgdG8gJXMuIFBsZWFzZSBjaGVjayB5b3VyIGVtYWlsLicsCiAgICAgICAgICAgICRVc2VyRGF0YXtVc2VyRW1haWx9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckxvZ2luKAogICAgICAgICAgICBUaXRsZSAgICAgICA9PiAnTG9naW4nLAogICAgICAgICAgICBNZXNzYWdlICAgICA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgVXNlciAgICAgICAgPT4gJFVzZXIsCiAgICAgICAgICAgIE1lc3NhZ2VUeXBlID0+ICdTdWNjZXNzJywKICAgICAgICApOwogICAgfQoKICAgICMgY3JlYXRlIG5ldyBjdXN0b21lciBhY2NvdW50CiAgICBlbHNpZiAoICRQYXJhbXtBY3Rpb259IGVxICdDdXN0b21lckNyZWF0ZUFjY291bnQnICkgewoKICAgICAgICAjIG5ldyBsYXlvdXQgb2JqZWN0CiAgICAgICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAgICAgIyBjaGVjayBmZWF0dXJlCiAgICAgICAgaWYgKCAhJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsQ3JlYXRlQWNjb3VudCcpICkgewoKICAgICAgICAgICAgIyBzaG93IG5vcm1hbCBsb2dpbgogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ0xvZ2luJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdGZWF0dXJlIG5vdCBhY3RpdmUhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAlR2V0UGFyYW1zOwogICAgICAgIGZvciBteSAkRW50cnkgKCBAeyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyVXNlcicpLT57TWFwfSB9ICkgewogICAgICAgICAgICAkR2V0UGFyYW1zeyAkRW50cnktPlswXSB9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJEVudHJ5LT5bMV0gKQogICAgICAgICAgICAgICAgfHwgJyc7CiAgICAgICAgfQogICAgICAgICRHZXRQYXJhbXN7VmFsaWRJRH0gPSAxOwoKICAgICAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbXMKICAgICAgICBpZiAoICEkR2V0UGFyYW1ze1VzZXJDdXN0b21lcklEfSApIHsKICAgICAgICAgICAgJEdldFBhcmFtc3tVc2VyQ3VzdG9tZXJJRH0gPSAkR2V0UGFyYW1ze1VzZXJFbWFpbH07CiAgICAgICAgfQogICAgICAgIGlmICggISRHZXRQYXJhbXN7VXNlckxvZ2lufSApIHsKICAgICAgICAgICAgJEdldFBhcmFtc3tVc2VyTG9naW59ID0gJEdldFBhcmFtc3tVc2VyRW1haWx9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbmV3IHBhc3N3b3JkCiAgICAgICAgJEdldFBhcmFtc3tVc2VyUGFzc3dvcmR9ID0gJFVzZXJPYmplY3QtPkdlbmVyYXRlUmFuZG9tUGFzc3dvcmQoKTsKCiAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgbXkgJVVzZXJEYXRhID0gJFVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoIFVzZXIgPT4gJEdldFBhcmFtc3tVc2VyTG9naW59ICk7CiAgICAgICAgaWYgKCAkVXNlckRhdGF7VXNlcklEfSB8fCAhJEdldFBhcmFtc3tVc2VyTG9naW59ICkgewoKICAgICAgICAgICAgIyBzZW5kIGRhdGEgdG8gSlMKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1NpZ251cEVycm9yJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJ0xvZ2luJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdUaGlzIGUtbWFpbCBhZGRyZXNzIGFscmVhZHkgZXhpc3RzLiBQbGVhc2UgbG9nIGluIG9yIHJlc2V0IHlvdXIgcGFzc3dvcmQuJyksCiAgICAgICAgICAgICAgICBVc2VyVGl0bGUgICAgID0+ICRHZXRQYXJhbXN7VXNlclRpdGxlfSwKICAgICAgICAgICAgICAgIFVzZXJGaXJzdG5hbWUgPT4gJEdldFBhcmFtc3tVc2VyRmlyc3RuYW1lfSwKICAgICAgICAgICAgICAgIFVzZXJMYXN0bmFtZSAgPT4gJEdldFBhcmFtc3tVc2VyTGFzdG5hbWV9LAogICAgICAgICAgICAgICAgVXNlckVtYWlsICAgICA9PiAkR2V0UGFyYW1ze1VzZXJFbWFpbH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGZvciBtYWlsIGFkZHJlc3MgcmVzdHJpY3Rpb25zCiAgICAgICAgbXkgQFdoaXRlbGlzdCA9IEB7CiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbENyZWF0ZUFjY291bnQ6Ok1haWxSZXN0cmljdGlvbnM6OldoaXRlbGlzdCcpIC8vIFtdCiAgICAgICAgfTsKICAgICAgICBteSBAQmxhY2tsaXN0ID0gQHsKICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsQ3JlYXRlQWNjb3VudDo6TWFpbFJlc3RyaWN0aW9uczo6QmxhY2tsaXN0JykgLy8gW10KICAgICAgICB9OwoKICAgICAgICBteSAkV2hpdGVsaXN0TWF0Y2hlZDsKICAgICAgICBmb3IgbXkgJFdoaXRlbGlzdEVudHJ5IChAV2hpdGVsaXN0KSB7CiAgICAgICAgICAgIG15ICRSZWdleCA9IGV2YWwge3FyLyRXaGl0ZWxpc3RFbnRyeS9pfTsKICAgICAgICAgICAgaWYgKCRAKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+CiAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUaGUgY3VzdG9tZXIgcGFuZWwgbWFpbCBhZGRyZXNzIHdoaXRlbGlzdCBjb250YWlucyB0aGUgaW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb24gJFdoaXRlbGlzdEVudHJ5LCBwbGVhc2UgY2hlY2sgYW5kIGNvcnJlY3QgaXQuJwogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXN7VXNlckVtYWlsfSA9fiAkUmVnZXggKSB7CiAgICAgICAgICAgICAgICAkV2hpdGVsaXN0TWF0Y2hlZCsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG15ICRCbGFja2xpc3RNYXRjaGVkOwogICAgICAgIGZvciBteSAkQmxhY2tsaXN0RW50cnkgKEBCbGFja2xpc3QpIHsKICAgICAgICAgICAgbXkgJFJlZ2V4ID0gZXZhbCB7cXIvJEJsYWNrbGlzdEVudHJ5L2l9OwogICAgICAgICAgICBpZiAoJEApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBjdXN0b21lciBwYW5lbCBtYWlsIGFkZHJlc3MgYmxhY2tsaXN0IGNvbnRhaW5zIHRoZSBpbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbiAkQmxhY2tsaXN0RW50cnksIHBsZWFzZSBjaGVjayBhbmQgY29ycmVjdCBpdC4nCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEdldFBhcmFtc3tVc2VyRW1haWx9ID1+ICRSZWdleCApIHsKICAgICAgICAgICAgICAgICRCbGFja2xpc3RNYXRjaGVkKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggKCBAV2hpdGVsaXN0ICYmICEkV2hpdGVsaXN0TWF0Y2hlZCApIHx8ICggQEJsYWNrbGlzdCAmJiAkQmxhY2tsaXN0TWF0Y2hlZCApICkgewoKICAgICAgICAgICAgIyBzZW5kIGRhdGEgdG8gSlMKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1NpZ251cEVycm9yJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJ0xvZ2luJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdUaGlzIGVtYWlsIGFkZHJlc3MgaXMgbm90IGFsbG93ZWQgdG8gcmVnaXN0ZXIuIFBsZWFzZSBjb250YWN0IHN1cHBvcnQgc3RhZmYuJyksCiAgICAgICAgICAgICAgICBVc2VyVGl0bGUgICAgID0+ICRHZXRQYXJhbXN7VXNlclRpdGxlfSwKICAgICAgICAgICAgICAgIFVzZXJGaXJzdG5hbWUgPT4gJEdldFBhcmFtc3tVc2VyRmlyc3RuYW1lfSwKICAgICAgICAgICAgICAgIFVzZXJMYXN0bmFtZSAgPT4gJEdldFBhcmFtc3tVc2VyTGFzdG5hbWV9LAogICAgICAgICAgICAgICAgVXNlckVtYWlsICAgICA9PiAkR2V0UGFyYW1ze1VzZXJFbWFpbH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBhY2NvdW50CiAgICAgICAgbXkgJERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CgogICAgICAgIG15ICROb3cgPSAkRGF0ZVRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CgogICAgICAgIG15ICRBZGQgPSAkVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyQWRkKAogICAgICAgICAgICAlR2V0UGFyYW1zLAogICAgICAgICAgICBDb21tZW50ID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0FkZGVkIHZpYSBDdXN0b21lciBQYW5lbCAoJXMpJywgJE5vdyApLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkQWRkICkgewoKICAgICAgICAgICAgIyBzZW5kIGRhdGEgdG8gSlMKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1NpZ251cEVycm9yJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJ0xvZ2luJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdDdXN0b21lciB1c2VyIGNhblwndCBiZSBhZGRlZCEnKSwKICAgICAgICAgICAgICAgIFVzZXJUaXRsZSAgICAgPT4gJEdldFBhcmFtc3tVc2VyVGl0bGV9LAogICAgICAgICAgICAgICAgVXNlckZpcnN0bmFtZSA9PiAkR2V0UGFyYW1ze1VzZXJGaXJzdG5hbWV9LAogICAgICAgICAgICAgICAgVXNlckxhc3RuYW1lICA9PiAkR2V0UGFyYW1ze1VzZXJMYXN0bmFtZX0sCiAgICAgICAgICAgICAgICBVc2VyRW1haWwgICAgID0+ICRHZXRQYXJhbXN7VXNlckVtYWlsfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2VuZCBub3RpZnkgZW1haWwKICAgICAgICBteSAkRW1haWxPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW1haWwnKTsKICAgICAgICBteSAkQm9keSAgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxCb2R5TmV3QWNjb3VudCcpCiAgICAgICAgICAgIHx8ICdObyBDb25maWcgT3B0aW9uIGZvdW5kISc7CiAgICAgICAgbXkgJFN1YmplY3QgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxTdWJqZWN0TmV3QWNjb3VudCcpCiAgICAgICAgICAgIHx8ICdOZXcgT1RPQk8gQWNjb3VudCEnOwogICAgICAgIGZvciAoIHNvcnQga2V5cyAlR2V0UGFyYW1zICkgewogICAgICAgICAgICAkQm9keSA9fiBzLzxPVE9CT18kXz4vJEdldFBhcmFtc3skX30vZ2k7CiAgICAgICAgfQoKICAgICAgICAjIHNlbmQgYWNjb3VudCBpbmZvCiAgICAgICAgbXkgJFNlbnQgPSAkRW1haWxPYmplY3QtPlNlbmQoCiAgICAgICAgICAgIFRvICAgICAgID0+ICRHZXRQYXJhbXN7VXNlckVtYWlsfSwKICAgICAgICAgICAgU3ViamVjdCAgPT4gJFN1YmplY3QsCiAgICAgICAgICAgIENoYXJzZXQgID0+ICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgIE1pbWVUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgQm9keSAgICAgPT4gJEJvZHkKICAgICAgICApOwogICAgICAgIGlmICggISRTZW50LT57U3VjY2Vzc30gKSB7CiAgICAgICAgICAgIHJldHVybiBqb2luICcnLAogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoCiAgICAgICAgICAgICAgICAgICAgQXJlYSAgPT4gJ0NvcmUnLAogICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICdFcnJvcicKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lcldhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ0NhblwndCBzZW5kIGFjY291bnQgaW5mbyEnKQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKCk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgc2VudCBhY2NvdW50IGluZm8KICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbExvZ2luVVJMJykgKSB7CgogICAgICAgICAgICAjIHJlZGlyZWN0IHRvIGFsdGVybmF0ZSBsb2dpbgogICAgICAgICAgICAkUGFyYW17UmVxdWVzdGVkVVJMfSA9ICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoICRQYXJhbXtSZXF1ZXN0ZWRVUkx9ICk7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIEV4dFVSTCA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxMb2dpblVSTCcpCiAgICAgICAgICAgICAgICAgICAgLiAiP1JlcXVlc3RlZFVSTD0kUGFyYW17UmVxdWVzdGVkVVJMfTtVc2VyPSRHZXRQYXJhbXN7VXNlckxvZ2lufTsiCiAgICAgICAgICAgICAgICAgICAgLiAiRW1haWw9JEdldFBhcmFtc3tVc2VyRW1haWx9O1JlYXNvbj1OZXdBY2NvdW50Q3JlYXRlZCIsCiAgICAgICAgICAgICk7ICAgICMgdGhyb3dzIGEgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uCiAgICAgICAgfQoKICAgICAgICBteSAkQWNjb3VudENyZWF0ZWRNZXNzYWdlID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAnTmV3IGFjY291bnQgY3JlYXRlZC4gU2VudCBsb2dpbiBpbmZvcm1hdGlvbiB0byAlcy4gUGxlYXNlIGNoZWNrIHlvdXIgZW1haWwuJywKICAgICAgICAgICAgJEdldFBhcmFtc3tVc2VyRW1haWx9LAogICAgICAgICk7CgogICAgICAgICMgbG9naW4gc2NyZWVuCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyTG9naW4oCiAgICAgICAgICAgIFRpdGxlICAgICAgID0+ICdMb2dpbicsCiAgICAgICAgICAgIE1lc3NhZ2UgICAgID0+ICRBY2NvdW50Q3JlYXRlZE1lc3NhZ2UsCiAgICAgICAgICAgIFVzZXIgICAgICAgID0+ICRHZXRQYXJhbXN7VXNlckxvZ2lufSwKICAgICAgICAgICAgTWVzc2FnZVR5cGUgPT4gJ1N1Y2Nlc3MnLAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IGxvZ2luIHNpdGUKICAgIGVsc2lmICggISRQYXJhbXtTZXNzaW9uSUR9ICkgewoKICAgICAgICAjIGNyZWF0ZSBBdXRoT2JqZWN0CiAgICAgICAgbXkgJEF1dGhPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckF1dGgnKTsKICAgICAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgICAgIGlmICggJEF1dGhPYmplY3QtPkdldE9wdGlvbiggV2hhdCA9PiAnUHJlQXV0aCcgKSApIHsKCiAgICAgICAgICAgICMgYXV0b21hdGljIGxvZ2luCiAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0ZWRVUkx9ID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSggJFBhcmFte1JlcXVlc3RlZFVSTH0gKTsKCiAgICAgICAgICAgIG15ICRQcmVBdXRoID0gJEF1dGhPYmplY3QtPlByZUF1dGgoCiAgICAgICAgICAgICAgICBSZXF1ZXN0ZWRVUkwgPT4gJFBhcmFte1JlcXVlc3RlZFVSTH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRQcmVBdXRoICYmICRQcmVBdXRoLT57UmVkaXJlY3RVUkx9ICkgewoKICAgICAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdTZXNzaW9uVXNlQ29va2llJykgKSB7CgogICAgICAgICAgICAgICAgICAgICMgYWx3YXlzIHNldCBhIGNvb2tpZSwgc28gdGhhdAogICAgICAgICAgICAgICAgICAgICMgd2Uga25vdyBhbHJlYWR5IGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIGNvb2tpZXMuCiAgICAgICAgICAgICAgICAgICAgIyAoIHRoZSBzZXNzaW9uIGNvb2tpZSBpc24ndCBhdmFpbGFibGUgYXQgdGhhdCB0aW1lICkuCgogICAgICAgICAgICAgICAgICAgIG15ICRFeHBpcmVzID0gJysnIC4gJENvbmZpZ09iamVjdC0+R2V0KCdTZXNzaW9uTWF4VGltZScpIC4gJ3MnOwogICAgICAgICAgICAgICAgICAgIGlmICggISRDb25maWdPYmplY3QtPkdldCgnU2Vzc2lvblVzZUNvb2tpZUFmdGVyQnJvd3NlckNsb3NlJykgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRFeHBpcmVzID0gJyc7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIHNldCBhIGNvb2tpZSB0ZW50YXRpdmVseSBmb3IgY2hlY2tpbmcgY29va2llIHN1cHBvcnQKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5TZXRDb29raWUoCiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgICAgID0+ICdPVE9CT0Jyb3dzZXJIYXNDb29raWUnLAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBFeHBpcmVzICA9PiAkRXhwaXJlcywKICAgICAgICAgICAgICAgICAgICAgICAgUGF0aCAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdTY3JpcHRBbGlhcycpLAogICAgICAgICAgICAgICAgICAgICAgICBTZWN1cmUgICA9PiAkQ29va2llU2VjdXJlQXR0cmlidXRlLAogICAgICAgICAgICAgICAgICAgICAgICBIdHRwT25seSA9PiAxLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgRXh0VVJMID0+ICRQcmVBdXRoLT57UmVkaXJlY3RVUkx9LAogICAgICAgICAgICAgICAgKTsgICAgIyB0aHJvd3MgYSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPVByZUxvZ2luJlJlcXVlc3RlZFVSTD0kUGFyYW17UmVxdWVzdGVkVVJMfSIsCiAgICAgICAgICAgICk7ICAgICAgICAjIHRocm93cyBhIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbgogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbExvZ2luVVJMJykgKSB7CgogICAgICAgICAgICAjIHJlZGlyZWN0IHRvIGFsdGVybmF0ZSBsb2dpbgogICAgICAgICAgICAkUGFyYW17UmVxdWVzdGVkVVJMfSA9ICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoICRQYXJhbXtSZXF1ZXN0ZWRVUkx9ICk7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIEV4dFVSTCA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxMb2dpblVSTCcpCiAgICAgICAgICAgICAgICAgICAgLiAiP1JlcXVlc3RlZFVSTD0kUGFyYW17UmVxdWVzdGVkVVJMfSIsCiAgICAgICAgICAgICk7ICAgICAgICAjIHRocm93cyBhIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbgogICAgICAgIH0KCiMgUm90aGVyIE9TUyAvIE9uZVRpbWVBdXRoZW50aWNhdGlvbkxpbmsKICAgICAgICBteSAlRXh0ZW5kZWRBdXRoUGFyYW1zOwogICAgICAgIGZvciBteSAkTmFtZSAoICRBdXRoT2JqZWN0LT5FeHRlbmRlZFBhcmFtTmFtZXMoKSApIHsKICAgICAgICAgICAgbXkgJEV4dFBhcmFtID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSgKICAgICAgICAgICAgICAgIFBhcmFtID0+ICROYW1lLAogICAgICAgICAgICAgICAgUmF3ICAgPT4gMQogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEV4dFBhcmFtICkgewogICAgICAgICAgICAgICAgJEV4dGVuZGVkQXV0aFBhcmFtc3skTmFtZX0gPSAkRXh0UGFyYW07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVkaXJlY3QgZGlyZWN0bHkgdG8gTG9naW4gaWYgbmVjZXNzYXJ5IHBhcmFtZXRlcnMgYXJlIHByZXNlbnQKICAgICAgICBpZiAoICVFeHRlbmRlZEF1dGhQYXJhbXMgKSB7CiAgICAgICAgICAgIG15ICRMb2dpblN0cmluZyA9ICdBY3Rpb249TG9naW4nOwogICAgICAgICAgICBmb3IgbXkgJEtleSAoIGtleXMgJUV4dGVuZGVkQXV0aFBhcmFtcyApIHsKICAgICAgICAgICAgICAgICRMb2dpblN0cmluZyAuPSAiOyRLZXk9JEV4dGVuZGVkQXV0aFBhcmFtc3skS2V5fSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0ZWRVUkx9ID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSggJFBhcmFte1JlcXVlc3RlZFVSTH0gKTsKICAgICAgICAgICAgcHJpbnQgJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBPUCA9PiAiJExvZ2luU3RyaW5nO1JlcXVlc3RlZFVSTD0kUGFyYW17UmVxdWVzdGVkVVJMfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQojIEVPIE9uZVRpbWVBdXRoZW50aWNhdGlvbkxpbmsKCiAgICAgICAgIyBsb2dpbiBzY3JlZW4KICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgVGl0bGUgPT4gJ0xvZ2luJywKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBydW4gbW9kdWxlcyBpZiBhIHZlcnNpb24gdmFsdWUgZXhpc3RzCiAgICBlbHNpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoIktlcm5lbDo6TW9kdWxlczo6JFBhcmFte0FjdGlvbn0iKSApIHsKCiAgICAgICAgIyBjaGVjayBzZXNzaW9uIGlkCiAgICAgICAgaWYgKCAhJFNlc3Npb25PYmplY3QtPkNoZWNrU2Vzc2lvbklEKCBTZXNzaW9uSUQgPT4gJFBhcmFte1Nlc3Npb25JRH0gKSApIHsKCiAgICAgICAgICAgICMgY3JlYXRlIG5ldyBMYXlvdXRPYmplY3Qgd2l0aCBuZXcgJyVQYXJhbScKICAgICAgICAgICAgJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnID0+IHsKICAgICAgICAgICAgICAgICAgICBTZXRDb29raWVzID0+IHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgZGVsZXRlIHRoZSBPVE9CTyBzZXNzaW9uIGNvb2tpZQogICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uSURDb29raWUgPT4gJFBhcmFtT2JqZWN0LT5TZXRDb29raWUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAkUGFyYW17U2Vzc2lvbk5hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBpcmVzICA9PiAnLTF5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGggICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnU2NyaXB0QWxpYXMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY3VyZSAgID0+ICRDb29raWVTZWN1cmVBdHRyaWJ1dGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQT25seSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgaWYgdGhlIHdyb25nIHNjaGVtZSBpcyB1c2VkLCBkZWxldGUgYWxzbyB0aGUgIm90aGVyIiBjb29raWUgLSBpc3N1ZSAjMjUxCiAgICAgICAgICAgIG15ICgkUmVxdWVzdFNjaGVtZSkgPSBzcGxpdCAnLycsICRQYXJhbU9iamVjdC0+U2VydmVyUHJvdG9jb2wsIDI7CiAgICAgICAgICAgIGlmICggJFJlcXVlc3RTY2hlbWUgbmUgJENvbmZpZ09iamVjdC0+R2V0KCdIdHRwVHlwZScpICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgICAgICAgICAgICAgICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFNldENvb2tpZXMgPT4gewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGVsZXRlIHRoZSBPVE9CTyBzZXNzaW9uIGNvb2tpZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbklEQ29va2llaHR0cCA9PiAkUGFyYW1PYmplY3QtPlNldENvb2tpZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAkUGFyYW17U2Vzc2lvbk5hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGlyZXMgID0+ICctMXknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGggICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnU2NyaXB0QWxpYXMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN1cmUgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQT25seSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRlbGV0ZSB0aGUgT1RPQk8gc2Vzc2lvbiBjb29raWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlc3Npb25JRENvb2tpZWh0dHBzID0+ICRQYXJhbU9iamVjdC0+U2V0Q29va2llKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgICAgID0+ICRQYXJhbXtTZXNzaW9uTmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwaXJlcyAgPT4gJy0xeScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aCAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdTY3JpcHRBbGlhcycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY3VyZSAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUE9ubHkgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEtlcm5lbDo6T00tPk9iamVjdHNEaXNjYXJkKCBPYmplY3RzID0+IFsnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCddICk7CiAgICAgICAgICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgICAgICAgICAjIGNyZWF0ZSBBdXRoT2JqZWN0CiAgICAgICAgICAgIG15ICRBdXRoT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQXV0aCcpOwogICAgICAgICAgICBpZiAoICRBdXRoT2JqZWN0LT5HZXRPcHRpb24oIFdoYXQgPT4gJ1ByZUF1dGgnICkgKSB7CgogICAgICAgICAgICAgICAgIyBhdXRvbWF0aWMgcmUtbG9naW4KICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0ZWRVUkx9ID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSggJFBhcmFte1JlcXVlc3RlZFVSTH0gKTsKCiAgICAgICAgICAgICAgICBteSAkUHJlQXV0aCA9ICRBdXRoT2JqZWN0LT5QcmVBdXRoKAogICAgICAgICAgICAgICAgICAgIFJlcXVlc3RlZFVSTCA9PiAkUGFyYW17UmVxdWVzdGVkVVJMfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAkUHJlQXV0aCAmJiAkUHJlQXV0aC0+e1JlZGlyZWN0VVJMfSApIHsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25Vc2VDb29raWUnKSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgYWx3YXlzIHNldCBhIGNvb2tpZSwgc28gdGhhdAogICAgICAgICAgICAgICAgICAgICAgICAjIHdlIGtub3cgYWxyZWFkeSBpZiB0aGUgYnJvd3NlciBzdXBwb3J0cyBjb29raWVzLgogICAgICAgICAgICAgICAgICAgICAgICAjICggdGhlIHNlc3Npb24gY29va2llIGlzbid0IGF2YWlsYWJsZSBhdCB0aGF0IHRpbWUgKS4KCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRFeHBpcmVzID0gJysnIC4gJENvbmZpZ09iamVjdC0+R2V0KCdTZXNzaW9uTWF4VGltZScpIC4gJ3MnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25Vc2VDb29raWVBZnRlckJyb3dzZXJDbG9zZScpICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEV4cGlyZXMgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBzZXQgYSBjb29raWUgdGVudGF0aXZlbHkgZm9yIGNoZWNraW5nIGNvb2tpZSBzdXBwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPlNldENvb2tpZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgICAgID0+ICdPVE9CT0Jyb3dzZXJIYXNDb29raWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGlyZXMgID0+ICRFeHBpcmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aCAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdTY3JpcHRBbGlhcycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdXJlICAgPT4gJENvb2tpZVNlY3VyZUF0dHJpYnV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBPbmx5ID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgICAgICAgICAgRXh0VVJMID0+ICRQcmVBdXRoLT57UmVkaXJlY3RVUkx9LAogICAgICAgICAgICAgICAgICAgICk7ICAgICMgdGhyb3dzIGEgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgT1AgPT4gIj9BY3Rpb249UHJlTG9naW4mUmVxdWVzdGVkVVJMPSRQYXJhbXtSZXF1ZXN0ZWRVUkx9IiwKICAgICAgICAgICAgICAgICk7ICAgICAgICAjIHRocm93cyBhIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsTG9naW5VUkwnKSApIHsKCiAgICAgICAgICAgICAgICAjIHJlZGlyZWN0IHRvIGFsdGVybmF0ZSBsb2dpbgogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVlc3RlZFVSTH0gPSAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCAkUGFyYW17UmVxdWVzdGVkVVJMfSApOwoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgICAgIEV4dFVSTCA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxMb2dpblVSTCcpCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIj9SZWFzb249SW52YWxpZFNlc3Npb25JRCZSZXF1ZXN0ZWRVUkw9JFBhcmFte1JlcXVlc3RlZFVSTH0iLAogICAgICAgICAgICAgICAgKTsgICAgICAgICMgdGhyb3dzIGEgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyBsb2dpbgogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ0xvZ2luJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRTZXNzaW9uT2JqZWN0LT5TZXNzaW9uSURFcnJvck1lc3NhZ2UoKSApLAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc2Vzc2lvbiBkYXRhCiAgICAgICAgbXkgJVVzZXJEYXRhID0gJFNlc3Npb25PYmplY3QtPkdldFNlc3Npb25JRERhdGEoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkUGFyYW17U2Vzc2lvbklEfSwKICAgICAgICApOwoKICAgICAgICAkVXNlckRhdGF7VXNlclRpbWVab25lfSA9ICRTZWxmLT5fVXNlclRpbWVab25lR2V0KCVVc2VyRGF0YSk7CgogICAgICAgICMgY2hlY2sgbmVlZGVkIGRhdGEKICAgICAgICBpZiAoICEkVXNlckRhdGF7VXNlcklEfSB8fCAhJFVzZXJEYXRhe1VzZXJMb2dpbn0gfHwgJFVzZXJEYXRhe1VzZXJUeXBlfSBuZSAnQ3VzdG9tZXInICkgewoKICAgICAgICAgICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gYWx0ZXJuYXRlIGxvZ2luCiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsTG9naW5VUkwnKSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgICAgIEV4dFVSTCA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxMb2dpblVSTCcpIC4gJz9SZWFzb249U3lzdGVtRXJyb3InLAogICAgICAgICAgICAgICAgKTsgICAgIyB0aHJvd3MgYSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IGxvZ2luIHNjcmVlbgogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ0Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdFcnJvcjogaW52YWxpZCBzZXNzaW9uLicpLAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBtb2R1bGUgcmVnaXN0cnkKICAgICAgICBteSAkTW9kdWxlUmVnID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckZyb250ZW5kOjpNb2R1bGUnKS0+eyAkUGFyYW17QWN0aW9ufSB9OwogICAgICAgIGlmICggISRNb2R1bGVSZWcgKSB7CgogICAgICAgICAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgICAgICAgICAiTW9kdWxlIEtlcm5lbDo6TW9kdWxlczo6JFBhcmFte0FjdGlvbn0gbm90IHJlZ2lzdGVyZWQgaW4gS2VybmVsL0NvbmZpZy5wbSEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOyAgICAjIHRocm93cyBhIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbgogICAgICAgIH0KCiAgICAgICAgIyBtb2R1bGUgcGVybWlzc2lvbiBjaGVjayBmb3IgYWN0aW9uCiAgICAgICAgaWYgKAogICAgICAgICAgICByZWYgJE1vZHVsZVJlZy0+e0dyb3VwUm99IGVxICdBUlJBWScKICAgICAgICAgICAgJiYgIXNjYWxhciBAeyAkTW9kdWxlUmVnLT57R3JvdXBSb30gfQogICAgICAgICAgICAmJiByZWYgJE1vZHVsZVJlZy0+e0dyb3VwfSBlcSAnQVJSQVknCiAgICAgICAgICAgICYmICFzY2FsYXIgQHsgJE1vZHVsZVJlZy0+e0dyb3VwfSB9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRQYXJhbXtBY2Nlc3NSb30gPSAxOwogICAgICAgICAgICAkUGFyYW17QWNjZXNzUnd9ID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAoICRQYXJhbXtBY2Nlc3NSb30sICRQYXJhbXtBY2Nlc3NSd30gKSA9ICRTZWxmLT5fQ2hlY2tNb2R1bGVQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgTW9kdWxlUmVnID0+ICRNb2R1bGVSZWcsCiAgICAgICAgICAgICAgICAlVXNlckRhdGEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUGFyYW17QWNjZXNzUm99ICkgewoKICAgICAgICAgICAgICAgICMgbmV3IGxheW91dCBvYmplY3QKICAgICAgICAgICAgICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdObyBQZXJtaXNzaW9uIHRvIHVzZSB0aGlzIGZyb250ZW5kIGFjdGlvbiBtb2R1bGUhJwogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgKTsgICAgIyB0aHJvd3MgYSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24KICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgIG15ICROYXZpZ2F0aW9uQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckZyb250ZW5kOjpOYXZpZ2F0aW9uJyktPnsgJFBhcmFte0FjdGlvbn0gfTsKCiAgICAgICAgIyBtb2R1bGUgcGVybWlzc2lvbiBjaGVjayBmb3Igc3VibWVudSBpdGVtCiAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkTmF2aWdhdGlvbkNvbmZpZykgKSB7CgogICAgICAgICAgICBLRVk6CiAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JE5hdmlnYXRpb25Db25maWd9ICkgewogICAgICAgICAgICAgICAgbmV4dCBLRVkgaWYgJEtleSAgICAgICAgICAgICAgICAgIX4gbS9eXGQrL2k7CiAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAkUGFyYW17UmVxdWVzdGVkVVJMfSAhfiBtL1N1YmFjdGlvbi9pOwoKICAgICAgICAgICAgICAgIG15IEBNb2R1bGVOYXZpZ2F0aW9uQ29uZmlnczsKCiAgICAgICAgICAgICAgICAjIEZJWE1FOiBTdXBwb3J0IGJvdGggb2xkIChIQVNIKSBhbmQgbmV3IChBUlJBWSBvZiBIQVNIKSBuYXZpZ2F0aW9uIGNvbmZpZ3VyYXRpb25zLCBmb3IgcmVhc29ucyBvZgogICAgICAgICAgICAgICAgIyAgIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBPbmNlIHdlIGFyZSBzdXJlIGV2ZXJ5dGhpbmcgaGFzIGJlZW4gbWlncmF0ZWQgY29ycmVjdGx5LCBzdXBwb3J0IGZvcgogICAgICAgICAgICAgICAgIyAgIEhBU0gtb25seSBjb25maWd1cmF0aW9uIGNhbiBiZSBkcm9wcGVkIGluIGZ1dHVyZSBtYWpvciByZWxlYXNlLgogICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJE5hdmlnYXRpb25Db25maWctPnskS2V5fSApICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQE1vZHVsZU5hdmlnYXRpb25Db25maWdzLCAkTmF2aWdhdGlvbkNvbmZpZy0+eyRLZXl9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICROYXZpZ2F0aW9uQ29uZmlnLT57JEtleX0gKSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBNb2R1bGVOYXZpZ2F0aW9uQ29uZmlncywgQHsgJE5hdmlnYXRpb25Db25maWctPnskS2V5fSB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgU2tpcCBpbmNvbXBhdGlibGUgY29uZmlndXJhdGlvbi4KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIG5leHQgS0VZOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIElURU06CiAgICAgICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKEBNb2R1bGVOYXZpZ2F0aW9uQ29uZmlncykgewogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntMaW5rfSAhfiBtL1N1YmFjdGlvbj0vaQogICAgICAgICAgICAgICAgICAgICAgICB8fCAkSXRlbS0+e0xpbmt9ICF+IG0vJFBhcmFte1N1YmFjdGlvbn0vaQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IElURU07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRQYXJhbXtBY2Nlc3NSb30gPSAwOwogICAgICAgICAgICAgICAgICAgICRQYXJhbXtBY2Nlc3NSd30gPSAwOwoKICAgICAgICAgICAgICAgICAgICAjIG1vZHVsZSBwZXJtaXNzaW9uIGNoZWNrIGZvciBzdWJtZW51IGl0ZW0KICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZiAkSXRlbS0+e0dyb3VwUm99IGVxICdBUlJBWScKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNjYWxhciBAeyAkSXRlbS0+e0dyb3VwUm99IH0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVmICRJdGVtLT57R3JvdXB9IGVxICdBUlJBWScKICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXNjYWxhciBAeyAkSXRlbS0+e0dyb3VwfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtBY2Nlc3NSb30gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17QWNjZXNzUnd9ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgICAgICAgICAoICRQYXJhbXtBY2Nlc3NSb30sICRQYXJhbXtBY2Nlc3NSd30gKSA9ICRTZWxmLT5fQ2hlY2tNb2R1bGVQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlUmVnID0+ICRJdGVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJVVzZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFBhcmFte0FjY2Vzc1JvfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5ldyBsYXlvdXQgb2JqZWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnTm8gUGVybWlzc2lvbiB0byB1c2UgdGhpcyBmcm9udGVuZCBzdWJhY3Rpb24gbW9kdWxlIScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsgICAgIyB0aHJvd3MgYSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgbmV3IExheW91dE9iamVjdCB3aXRoIG5ldyAnJVBhcmFtJyBhbmQgJyVVc2VyRGF0YScKICAgICAgICAkS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAgICAgICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JyA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAlVXNlckRhdGEsCiAgICAgICAgICAgICAgICBNb2R1bGVSZWcgPT4gJE1vZHVsZVJlZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAkS2VybmVsOjpPTS0+T2JqZWN0c0Rpc2NhcmQoIE9iamVjdHMgPT4gWydLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0J10gKTsKCiAgICAgICAgIyB1cGRhdGUgbGFzdCByZXF1ZXN0IHRpbWUKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkUGFyYW1PYmplY3QtPklzQUpBWFJlcXVlc3QoKQogICAgICAgICAgICB8fCAkUGFyYW17QWN0aW9ufSBlcSAnQ3VzdG9tZXJWaWRlb0NoYXQnCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwoKICAgICAgICAgICAgJFNlc3Npb25PYmplY3QtPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkUGFyYW17U2Vzc2lvbklEfSwKICAgICAgICAgICAgICAgIEtleSAgICAgICA9PiAnVXNlckxhc3RSZXF1ZXN0JywKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkRGF0ZVRpbWVPYmplY3QtPlRvRXBvY2goKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcHJlIGFwcGxpY2F0aW9uIG1vZHVsZQogICAgICAgIG15ICRQcmVNb2R1bGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxQcmVBcHBsaWNhdGlvbk1vZHVsZScpOwogICAgICAgIGlmICggJFBhcmFte0FjdGlvbn0gbmUgJ0N1c3RvbWVyR2VuZXJpY0NvbnRlbnQnICYmICRQcmVNb2R1bGUgKSB7CiAgICAgICAgICAgIG15ICVQcmVNb2R1bGVMaXN0OwogICAgICAgICAgICBpZiAoIHJlZiAkUHJlTW9kdWxlIGVxICdIQVNIJyApIHsKICAgICAgICAgICAgICAgICVQcmVNb2R1bGVMaXN0ID0gJXskUHJlTW9kdWxlfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQcmVNb2R1bGVMaXN0e0luaXR9ID0gJFByZU1vZHVsZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgTU9EVUxFOgogICAgICAgICAgICBmb3IgbXkgJFByZU1vZHVsZUtleSAoIHNvcnQga2V5cyAlUHJlTW9kdWxlTGlzdCApIHsKICAgICAgICAgICAgICAgIG15ICRQcmVNb2R1bGUgPSAkUHJlTW9kdWxlTGlzdHskUHJlTW9kdWxlS2V5fTsKICAgICAgICAgICAgICAgIG5leHQgTU9EVUxFIGlmICEkUHJlTW9kdWxlOwogICAgICAgICAgICAgICAgbmV4dCBNT0RVTEUgaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoJFByZU1vZHVsZSk7CgogICAgICAgICAgICAgICAgIyBkZWJ1ZyBpbmZvCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ3VzdG9tZXJQYW5lbFByZUFwcGxpY2F0aW9uIG1vZHVsZSAkUHJlTW9kdWxlIGlzIHVzZWQuIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgICAgICAgICAgICAgIyB1c2UgbW9kdWxlCiAgICAgICAgICAgICAgICBteSAkUHJlTW9kdWxlT2JqZWN0ID0gJFByZU1vZHVsZS0+bmV3KAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlVXNlckRhdGEsCgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkUHJlTW9kdWxlT2JqZWN0LT5QcmVSdW4oKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gJE91dHB1dCBpZiAkT3V0cHV0OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGRlYnVnIGluZm8KICAgICAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnS2VybmVsOjpNb2R1bGVzOjonIC4gJFBhcmFte0FjdGlvbn0gLiAnLT5uZXcnLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJEZyb250ZW5kT2JqZWN0ID0gKCAnS2VybmVsOjpNb2R1bGVzOjonIC4gJFBhcmFte0FjdGlvbn0gKS0+bmV3KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVVc2VyRGF0YSwKICAgICAgICAgICAgTW9kdWxlUmVnID0+ICRNb2R1bGVSZWcsCiAgICAgICAgICAgIERlYnVnICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICApOwoKICAgICAgICAjIGRlYnVnIGluZm8KICAgICAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnS2VybmVsOjpNb2R1bGVzOjonIC4gJFBhcmFte0FjdGlvbn0gLiAnLT5ydW4nLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyAtPlJ1biAkQWN0aW9uIHdpdGggJEZyb250ZW5kT2JqZWN0CiAgICAgICAgbXkgJE91dHB1dCA9ICRGcm9udGVuZE9iamVjdC0+UnVuKCk7CgogICAgICAgICMgbG9nIHJlcXVlc3QgdGltZSBmb3IgQWRtaW5QZXJmb3JtYW5jZUxvZwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdQZXJmb3JtYW5jZUxvZycpICkgewogICAgICAgICAgICBteSAkRmlsZSA9ICRDb25maWdPYmplY3QtPkdldCgnUGVyZm9ybWFuY2VMb2c6OkZpbGUnKTsKCiAgICAgICAgICAgICMgV3JpdGUgdG8gUGVyZm9ybWFuY2VMb2cgZmlsZSBvbmx5IGlmIGl0IGlzIHNtYWxsZXIgdGhhbiBzaXplIGxpbWl0IChzZWUgYnVnIzE0NzQ3KS4KICAgICAgICAgICAgaWYgKCAtcyAkRmlsZSA8ICggMTAyNCAqIDEwMjQgKiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1BlcmZvcm1hbmNlTG9nOjpGaWxlTWF4JykgKSApIHsKICAgICAgICAgICAgICAgIGlmICggb3BlbiBteSAkT3V0LCAnPj4nLCAkRmlsZSApIHsgICAgIyMgbm8gY3JpdGljIHF3KE9UT0JPOjpQcm9oaWJpdE9wZW4pCgogICAgICAgICAgICAgICAgICAgICMgYSBmYWxsYmFjayBmb3IgdGhlIHF1ZXJ5IHN0cmluZyB3aGVuIHRoZSBhY3Rpb24gaXMgbWlzc2luZwogICAgICAgICAgICAgICAgICAgIGlmICggKCAhJFF1ZXJ5U3RyaW5nICYmICRQYXJhbXtBY3Rpb259ICkgfHwgJFF1ZXJ5U3RyaW5nICF+IC9BY3Rpb249LyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFF1ZXJ5U3RyaW5nID0gJ0FjdGlvbj0nIC4gJFBhcmFte0FjdGlvbn0gLiAnO1N1YmFjdGlvbj0nIC4gJFBhcmFte1N1YmFjdGlvbn07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBteSAkTm93ID0gVGltZTo6SGlSZXM6OnRpbWUoKTsKICAgICAgICAgICAgICAgICAgICBwcmludCAkT3V0IGpvaW4gJzo6JywKICAgICAgICAgICAgICAgICAgICAgICAgJE5vdywKICAgICAgICAgICAgICAgICAgICAgICAgJ0N1c3RvbWVyJywKICAgICAgICAgICAgICAgICAgICAgICAgKCAkTm93IC0gJFNlbGYtPntQZXJmb3JtYW5jZUxvZ1N0YXJ0fSApLAogICAgICAgICAgICAgICAgICAgICAgICAkVXNlckRhdGF7VXNlckxvZ2lufSwgICAgIyBub3QgdXNlZCBpbiB0aGUgQWRtaW5QZXJmb3JtYW5jZUxvZyBmcm9udGVuZAogICAgICAgICAgICAgICAgICAgICAgICAiJFF1ZXJ5U3RyaW5nXG4iOwogICAgICAgICAgICAgICAgICAgIGNsb3NlICRPdXQ7CgogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnUmVzcG9uc2U6OkN1c3RvbWVyOiAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICggJE5vdyAtICRTZWxmLT57UGVyZm9ybWFuY2VMb2dTdGFydH0gKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAicyB0YWtlbiAoVVJMOiRRdWVyeVN0cmluZzokVXNlckRhdGF7VXNlckxvZ2lufSkiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IHdyaXRlICRGaWxlOiAkISIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlBlcmZvcm1hbmNlTG9nIGZpbGUgJyRGaWxlJyBpcyB0b28gbGFyZ2UsIHlvdSBuZWVkIHRvIHJlc2V0IGl0IGluIFBlcmZvcm1hbmNlTG9nIHBhZ2UhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgdGhyb3dzIGEgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uCiAgICBteSAlRGF0YSA9ICRTZXNzaW9uT2JqZWN0LT5HZXRTZXNzaW9uSUREYXRhKAogICAgICAgIFNlc3Npb25JRCA9PiAkUGFyYW17U2Vzc2lvbklEfSwKICAgICk7CiAgICAkRGF0YXtVc2VyVGltZVpvbmV9ID0gJFNlbGYtPl9Vc2VyVGltZVpvbmVHZXQoJURhdGEpOwogICAgJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JyA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJURhdGEsCiAgICAgICAgfSwKICAgICk7CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgKTsKfQoKPWhlYWQyIFJlc3BvbnNlKCkKCkdlbmVyYXRlIGEgUFNHSSBSZXNwb25zZSBvYmplY3QgZnJvbSB0aGUgY29udGVudCBnZW5lcmF0ZWQgYnkgQzxDb250ZW50KCk+LgoKICAgIG15ICRSZXNwb25zZSA9ICRJbnRlcmZhY2UtPlJlc3BvbnNlKCk7Cgo9Y3V0CgpzdWIgUmVzcG9uc2UgewogICAgbXkgKCRTZWxmKSA9IEBfOwoKICAgICMgTm90ZSB0aGF0IHRoZSBsYXlvdXQgb2JqZWN0IG11c3RuJ3QgYmUgY3JlYXRlZCBiZWZvcmUgY2FsbGluZyBDb250ZW50KCkuCiAgICAjIFRoaXMgaXMgYmVjYXVzZSBDb250ZW50KCkgbWlnaHQgd2FudCB0byBzZXQgb2JqZWN0IHBhcmFtcyBiZWZvcmUgdGhlIGluaXRpYWwgY3JlYXRpb25zLgogICAgIyBBIG5vdGFibGUgZXhhbXBsZSBpcyB0aGUgU2V0Q29va2llcyBwYXJhbWV0ZXIuCiAgICBteSAkQ29udGVudCA9ICRTZWxmLT5Db250ZW50KCk7CgogICAgIyBUaGUgZmlsdGVyZWQgY29udGVudCBpcyBhIHN0cmluZywgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBvcmlnaW5hbCBjb250ZW50IGlzCiAgICAjIGEgc3RyaW5nLCBhbiBhcnJheSByZWZlcmVuY2UsIG9yIGEgZmlsZSBoYW5kbGUuCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgJENvbnRlbnQgPSAkTGF5b3V0T2JqZWN0LT5BcHBseU91dHB1dEZpbHRlcnMoIE91dHB1dCA9PiAkQ29udGVudCApOwoKICAgICMgVGhlIEhUVFAgaGVhZGVycyBvZiB0aGUgT1RPQk8gd2ViIHJlc3BvbnNlIG9iamVjdCBhbHJlYWR5IGhhdmUgYmVlbiBzZXQgdXAuCiAgICAjIEVuaGFuY2UgaXQgd2l0aCB0aGUgSFRUUCBzdGF0dXMgY29kZSBhbmQgdGhlIGNvbnRlbnQuCiAgICByZXR1cm4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVzcG9uc2UnKS0+RmluYWxpemUoIENvbnRlbnQgPT4gJENvbnRlbnQgKTsKfQoKPWJlZ2luIEludGVybmFsOgoKPWhlYWQyIF9TdG9yZUZhaWxlZExvZ2lucygpCgo9Y3V0CgpzdWIgX1N0b3JlRmFpbGVkTG9naW5zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkQ3VycmVudFRpbWVPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwogICAgbXkgJEN1cnJlbnROZXdUaW1lU3RhbXAgPSAkQ3VycmVudFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICBteSAkQ2FjaGVPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwogICAgbXkgJENoZWNrSGFzaCAgICAgICAgICAgPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICBUeXBlID0+ICdGYWlsZWRMb2dpbnNDdXN0b21lcicsCiAgICAgICAgS2V5ICA9PiAkUGFyYW17UG9zdFVzZXJ9LAogICAgKTsKCiAgICBpZiAoICEkQ2hlY2tIYXNoICkgewogICAgICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAnRmFpbGVkTG9naW5zQ3VzdG9tZXInLAogICAgICAgICAgICBLZXkgICA9PiAkUGFyYW17UG9zdFVzZXJ9LAogICAgICAgICAgICBWYWx1ZSA9PiBbJEN1cnJlbnROZXdUaW1lU3RhbXBdLAogICAgICAgICAgICBUVEwgICA9PiAkUGFyYW17UHJldmVudEJydXRlRm9yY2VDb25maWd9e0tlZXBDYWNoZUR1cmF0aW9ufSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBteSBATG9naW5UcnlBcnJheSA9IEB7JENoZWNrSGFzaH07CgogICAgIyBkZWxldGUgZXhwaXJlZCBjYWNoZSBlbnRyaWVzCiAgICBMT0dJTjoKICAgIGZvciBteSAkTG9naW5UaW1lICggQHskQ2hlY2tIYXNofSApIHsKICAgICAgICBteSAkTG9naW5UaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJExvZ2luVGltZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIG15ICRPZmZzZXQgPSAkQ3VycmVudFRpbWVPYmplY3QtPkRlbHRhKAogICAgICAgICAgICBEYXRlVGltZU9iamVjdCA9PiAkTG9naW5UaW1lT2JqZWN0LAogICAgICAgICk7CgogICAgICAgIGlmICggJE9mZnNldC0+e0Fic29sdXRlU2Vjb25kc30gPiAkUGFyYW17UHJldmVudEJydXRlRm9yY2VDb25maWd9LT57S2VlcENhY2hlRHVyYXRpb259ICkgewogICAgICAgICAgICBzaGlmdCBATG9naW5UcnlBcnJheTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGxhc3QgTE9HSU47CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIG5ldyBmYWlsZWQgbG9naW4gdG8gY2FjaGUKICAgIHB1c2ggQExvZ2luVHJ5QXJyYXksICRDdXJyZW50TmV3VGltZVN0YW1wOwogICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJ0ZhaWxlZExvZ2luc0N1c3RvbWVyJywKICAgICAgICBLZXkgICA9PiAkUGFyYW17UG9zdFVzZXJ9LAogICAgICAgIFZhbHVlID0+IFxATG9naW5UcnlBcnJheSwKICAgICAgICBUVEwgICA9PiAkUGFyYW17UHJldmVudEJydXRlRm9yY2VDb25maWd9e0tlZXBDYWNoZUR1cmF0aW9ufSwKICAgICk7CgogICAgaWYgKCBzY2FsYXIgQExvZ2luVHJ5QXJyYXkgPj0gJFBhcmFte1ByZXZlbnRCcnV0ZUZvcmNlQ29uZmlnfXtNYXhBdHRlbXB0fSApIHsKICAgICAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0Jhbm5lZExvZ2luc0N1c3RvbWVyJywKICAgICAgICAgICAgS2V5ICAgPT4gJFBhcmFte1Bvc3RVc2VyfSwKICAgICAgICAgICAgVmFsdWUgPT4gJEN1cnJlbnROZXdUaW1lU3RhbXAsCiAgICAgICAgICAgIFRUTCAgID0+ICRQYXJhbXtQcmV2ZW50QnJ1dGVGb3JjZUNvbmZpZ317QmFuRHVyYXRpb259LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCnN1YiBfQ2hlY2tBbmRSZW1vdmVGcm9tQmFubmVkTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNhY2hlCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICBteSAkQmFuVGltZSA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgIFR5cGUgPT4gJ0Jhbm5lZExvZ2luc0N1c3RvbWVyJywKICAgICAgICBLZXkgID0+ICRQYXJhbXtQb3N0VXNlcn0sCiAgICApOwoKICAgIGlmICggISRCYW5UaW1lICkgewogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIEJhbm5lZCA9PiAwLAogICAgICAgICk7CiAgICB9CgogICAgIyBjYWxjdWxhdGUgZWxhcHNlZCB0aW1lCiAgICBteSAkQ3VyVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwogICAgbXkgJEJhblRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgIFN0cmluZyA9PiAkQmFuVGltZSwKICAgICAgICB9LAogICAgKTsKICAgIG15ICRPZmZzZXQgPSAkQ3VyVGltZU9iamVjdC0+RGVsdGEoCiAgICAgICAgRGF0ZVRpbWVPYmplY3QgPT4gJEJhblRpbWVPYmplY3QsCiAgICApOwoKICAgICMgaWYgdGhlIGJhbiBkdXJhdGlvbiBoYXMgYmVlbiBzdXJwYXNzZWQsIGRlbGV0ZSB0aGUgY2FjaGUgZW50cnkKICAgIGlmICggJE9mZnNldC0+e0Fic29sdXRlU2Vjb25kc30gPiAkUGFyYW17UHJldmVudEJydXRlRm9yY2VDb25maWd9e0JhbkR1cmF0aW9ufSApIHsKICAgICAgICAkQ2FjaGVPYmplY3QtPkRlbGV0ZSgKICAgICAgICAgICAgVHlwZSA9PiAnQmFubmVkTG9naW5zQ3VzdG9tZXInLAogICAgICAgICAgICBLZXkgID0+ICRQYXJhbXtQb3N0VXNlcn0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBCYW5uZWQgPT4gMCwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAoCiAgICAgICAgQmFubmVkICAgICAgID0+IDEsCiAgICAgICAgUmVzaWR1YWxUaW1lID0+ICRQYXJhbXtQcmV2ZW50QnJ1dGVGb3JjZUNvbmZpZ317QmFuRHVyYXRpb259IC0gJE9mZnNldC0+e0Fic29sdXRlU2Vjb25kc30sCiAgICApOwp9Cgo9aGVhZDIgX0NoZWNrTW9kdWxlUGVybWlzc2lvbigpCgptb2R1bGUgcGVybWlzc2lvbiBjaGVjawoKICAgICgkQWNjZXNzUm8sICRBY2Nlc3NSdyA9ICRBdXRvUmVzcG9uc2VPYmplY3QtPl9DaGVja01vZHVsZVBlcm1pc3Npb24oCiAgICAgICAgTW9kdWxlUmVnID0+ICRNb2R1bGVSZWcsCiAgICAgICAgJVVzZXJEYXRhLAogICAgKTsKCj1jdXQKCnN1YiBfQ2hlY2tNb2R1bGVQZXJtaXNzaW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEFjY2Vzc1JvID0gMDsKICAgIG15ICRBY2Nlc3NSdyA9IDA7CgogICAgUEVSTUlTU0lPTjoKICAgIGZvciBteSAkUGVybWlzc2lvbiAocXcoR3JvdXBSbyBHcm91cCkpIHsKICAgICAgICBteSAkQWNjZXNzT2sgPSAwOwogICAgICAgIG15ICRHcm91cCAgICA9ICRQYXJhbXtNb2R1bGVSZWd9LT57JFBlcm1pc3Npb259OwoKICAgICAgICBuZXh0IFBFUk1JU1NJT04gaWYgISRHcm91cDsKCiAgICAgICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyR3JvdXAnKTsKCiAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJEdyb3VwKSApIHsKICAgICAgICAgICAgR1JPVVA6CiAgICAgICAgICAgIGZvciBteSAkSXRlbSAoIEB7JEdyb3VwfSApIHsKICAgICAgICAgICAgICAgIG5leHQgR1JPVVAgaWYgISRJdGVtOwogICAgICAgICAgICAgICAgbmV4dCBHUk9VUCBpZiAhJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uQ2hlY2soCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIEdyb3VwTmFtZSA9PiAkSXRlbSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJFBlcm1pc3Npb24gZXEgJ0dyb3VwUm8nID8gJ3JvJyA6ICdydycsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRBY2Nlc3NPayA9IDE7CiAgICAgICAgICAgICAgICBsYXN0IEdST1VQOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkSGFzUGVybWlzc2lvbiA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkNoZWNrKAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgR3JvdXBOYW1lID0+ICRHcm91cCwKICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAkUGVybWlzc2lvbiBlcSAnR3JvdXBSbycgPyAncm8nIDogJ3J3JywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRIYXNQZXJtaXNzaW9uKSB7CiAgICAgICAgICAgICAgICAkQWNjZXNzT2sgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFBlcm1pc3Npb24gZXEgJ0dyb3VwJyAmJiAkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgICRBY2Nlc3NSbyA9IDE7CiAgICAgICAgICAgICRBY2Nlc3NSdyA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFBlcm1pc3Npb24gZXEgJ0dyb3VwUm8nICYmICRBY2Nlc3NPayApIHsKICAgICAgICAgICAgJEFjY2Vzc1JvID0gMTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICggJEFjY2Vzc1JvLCAkQWNjZXNzUncgKTsKfQoKPWhlYWQyIF9Vc2VyVGltZVpvbmVHZXQoKQoKR2V0IHRpbWUgem9uZSBmb3IgdGhlIGN1cnJlbnQgdXNlci4gVGhpcyBmdW5jdGlvbiB3aWxsIHZhbGlkYXRlIHBhc3NlZCB0aW1lIHpvbmUgcGFyYW1ldGVyIGFuZCByZXR1cm4gZGVmYXVsdCB1c2VyIHRpbWUKem9uZSBpZiBpdCdzIG5vdCB2YWxpZC4KCiAgICBteSAkVXNlclRpbWVab25lID0gJFNlbGYtPl9Vc2VyVGltZVpvbmVHZXQoCiAgICAgICAgVXNlclRpbWVab25lID0+ICdFdXJvcGUvQmVybGluJywKICAgICk7Cgo9Y3V0CgpzdWIgX1VzZXJUaW1lWm9uZUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRVc2VyVGltZVpvbmU7CgogICAgIyBSZXR1cm4gcGFzc2VkIHRpbWUgem9uZSBvbmx5IGlmIGl0J3MgdmFsaWQuIEl0IGNhbiBoYXBwZW4gdGhhdCB1c2VyIHByZWZlcmVuY2VzIG9yIHNlc3Npb24gc3RvcmUgYW4gb2xkLXN0eWxlCiAgICAjICAgb2Zmc2V0IHdoaWNoIGlzIG5vdCB2YWxpZCBhbnltb3JlLiBJbiB0aGlzIGNhc2UsIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KICAgICMgICBQbGVhc2Ugc2VlIGJ1ZyMxMzM3NCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgIGlmICgKICAgICAgICAkUGFyYW17VXNlclRpbWVab25lfQogICAgICAgICYmIEtlcm5lbDo6U3lzdGVtOjpEYXRlVGltZS0+SXNUaW1lWm9uZVZhbGlkKCBUaW1lWm9uZSA9PiAkUGFyYW17VXNlclRpbWVab25lfSApCiAgICAgICAgKQogICAgewogICAgICAgICRVc2VyVGltZVpvbmUgPSAkUGFyYW17VXNlclRpbWVab25lfTsKICAgIH0KCiAgICAkVXNlclRpbWVab25lIHx8PSBLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUtPlVzZXJEZWZhdWx0VGltZVpvbmVHZXQoKTsKCiAgICByZXR1cm4gJFVzZXJUaW1lWm9uZTsKfQoKPWVuZCBJbnRlcm5hbDoKCj1jdXQKCjE7Cg==</File>
        <File Location="Kernel/Config/Files/XML/OneTimeAuthentificationLink.xml" Permission="660" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdG9ib19jb25maWcgdmVyc2lvbj0iMi4wIiBpbml0PSJBcHBsaWNhdGlvbiI+CiAgICA8U2V0dGluZyBOYW1lPSJPbmVUaW1lQXV0aDo6Q3VzdG9tZXJFcnJvck1lc3NhZ2VSZWZyZXNoRmFpbGVkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRoZSBtZXNzYWdlIHdoaWNoIHdpbGwgYmUgc2VudCB0byB0aGUgY3VzdG9tZXIgaWYgYSBsaW5rIGNvdWxkIG5vdCBiZSBnZW5lcmF0ZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpBdXRoOjpDdXN0b21lcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSIiPkxpbmsga29ubnRlIG5pY2h0IGVyemV1Z3Qgd2VyZGVuLCBiaXR0ZSBzZW5kZW4gU2llIGVpbmUgZW1haWwgYW4gc3VwcG9ydEB3ZS5jb20uPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJPbmVUaW1lQXV0aDo6Q3VzdG9tZXJFcnJvck1lc3NhZ2VMaW5rRXhwaXJlZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UaGUgbWVzc2FnZSB3aGljaCB0aGUgY3VzdG9tZXIgdXNlciB3aWxsIHNlZSBpZiBoZSB1c2VzIGFuIGludmFsaWQgdG9rZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpBdXRoOjpDdXN0b21lcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSIiPklociBMaW5rIHZlcndlaXN0IGF1ZiBrZWluIG5vY2ggZ8O8bHRpZ2VzIFRpY2tldC48L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9Ik9uZVRpbWVBdXRoOjpDdXN0b21lckVycm9yTWVzc2FnZVdyb25nTGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UaGUgbWVzc2FnZSB3aGljaCB0aGUgY3VzdG9tZXIgdXNlciB3aWxsIHNlZSBpZiBoZSB1c2VzIGFuIG9sZCB0b2tlbiB3aXRoIGFuIGFjdGl2ZSBvbmUgYWxyZWFkeSBiZWluZyBwcmVzZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6QXV0aDo6Q3VzdG9tZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iIj5BdXMgU2ljaGVyaGVpdHNncsO8bmRlbiBtw7xzc2VuIFNpZSBkZW4gbmV1ZXN0ZW4gSWhuZW4genVnZXNhbmR0ZW4gTGluayBudXR6ZW4gdW0gYXVmIGRpZXNlcyBUaWNrZXQgenV6dWdyZWlmZW4uPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJPbmVUaW1lQXV0aDo6Q3VzdG9tZXJFcnJvck1lc3NhZ2VOZXdMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRoZSBtZXNzYWdlIHdoaWNoIHRoZSBjdXN0b21lciB1c2VyIHdpbGwgc2VlIGlmIGEgbmV3IG9uZSBpcyBzZW50IHRvIGhpcyBlbWFpbCBhZGRyZXNzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6QXV0aDo6Q3VzdG9tZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iIj5JaHJlIFNlc3Npb24gaXN0IGxlaWRlciBhYmdlbGF1ZmVuIC0gZWluIG5ldWVyIExpbmsgd3VyZGUgYW4gSWhyZSBFbWFpbC1BZHJlc3NlIGdlc2VuZGV0LjwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iT25lVGltZUF1dGg6OkFjY2Vzc0RheXNBZnRlckNsb3NlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRoZSBudW1iZXIgb2YgZGF5cyBjdXN0b21lciB1c2VycyBjYW4gdXNlIGRpcmVjdCBsaW5rcyB0byBvcGVuIHRpY2tldHMgYWZ0ZXIgdGhleSBhcmUgY2xvc2VkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6QXV0aDo6Q3VzdG9tZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXlxkKiQiPjE0PC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJPbmVUaW1lQXV0aDo6VG9rZW5SZWZyZXNoTm90aWZpY2F0aW9uSUQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2VuZCB0aGUgdGV4dCBvZiBhIG5vdGlmaWNhdGlvbiB0byB0aGUgY3VzdG9tZXIgdXNlciBpZiBoZSByZWZyZXNocyBoaXMgdG9rZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpBdXRoOjpDdXN0b21lcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSJeXGQqJCI+MDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6UHJlRmlsdGVyTW9kdWxlIyMjMDAwLUNyZWF0ZUN1c3RvbWVyVXNlciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5DcmVhdGUgYSBDdXN0b21lclVzZXIgaW4gYSBzcGVjaWZpYyBiYWNrZW5kIGlmIG5vbmUgZXhpc3RzIGZvciB0aGUgc2VuZGVyIGVtYWlsLiBDdXN0b21lckhlYWRlclNwb29mUHJvdGVjdGlvbiBzZXRzIChhbmQgcG9zc2libHkgb3ZlcndyaXRlcykgdGhlIFgtT1RPQk8tQ3VzdG9tZXIgaGVhZGVyIGlmIGEgY3VzdG9tZXIgdXNlciBleGlzdHMgZm9yIGFuIGVtYWlsIGFkZHJlc3MgdG8gcHJldmVudCBzcG9vZmluZy4gQ3VzdG9tZXJVc2VyQmFja2VuZCBkZWZpbmVzIHRoZSBiYWNrZW5kIGluIHdoaWNoIHRoZSBDdXN0b21lclVzZXIgd2lsbCBiZSBjcmVhdGVkLCBpZiBTZXRDaGVja0JveE5hbWUgaXMgc2V0IHRvIHRoZSBuYW1lIG9mIGEgZHluYW1pYyBmaWVsZCBvZiB0aGUgdHlwZSBjaGVja2JveCwgaXQgd2lsbCBiZSBzZXQgdG8gY2hlY2tlZCBmb3IgdGlja2V0cyBjcmVhdGVkIGJ5IGN1c3RvbWVyIHVzZXJzIGZyb20gdGhpcyBiYWNrZW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6RmlsdGVyOjpDcmVhdGVOZXdDdXN0b21lclVzZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkN1c3RvbWVySGVhZGVyU3Bvb2ZQcm90ZWN0aW9uIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXN0b21lclVzZXJCYWNrZW5kIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNldENoZWNrQm94TmFtZSI+PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkRhZW1vbjo6U2NoZWR1bGVyQ3JvblRhc2tNYW5hZ2VyOjpUYXNrIyMjRGVsZXRlRXhwaXJlZE9UQVRva2VucyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIiBDb25maWdMZXZlbD0iMTAwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWxldGVzIE9UQSBUb2tlbnMgb2YgY2xvc2VkIHRpY2tldHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5EYWVtb246OlNjaGVkdWxlckNyb25UYXNrTWFuYWdlcjo6VGFzazwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXNrTmFtZSI+RGVsZXRlRXhwaXJlZE9UQVRva2VuczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU2NoZWR1bGUiPjAgNCAqICogKjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJBdXRoOjpPbmVUaW1lQXV0aExpbms8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkZ1bmN0aW9uIj5EZWFjdGl2YXRlQ2xvc2VkVGlja2V0czwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTWF4aW11bVBhcmFsbGVsSW5zdGFuY2VzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQYXJhbXMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KPC9vdG9ib19jb25maWc+Cg==</File>
        <File Location="Kernel/System/Console/Command/Maint/CustomerAuth/DeleteExpiredOTATokens.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjEgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmRlLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDb25zb2xlOjpDb21tYW5kOjpNYWludDo6Q3VzdG9tZXJBdXRoOjpEZWxldGVFeHBpcmVkT1RBVG9rZW5zOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHBhcmVudCBxdyhLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6QmFzZUNvbW1hbmQpOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQXV0aDo6T25lVGltZUF1dGhMaW5rJywKKTsKCnN1YiBDb25maWd1cmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+RGVzY3JpcHRpb24oJ0RlbGV0ZXMgZXhwaXJlZCBPbmVUaW1lQXV0aGVudGlmaWNhdGlvblRva2Vucy4nKTsKCiAgICByZXR1cm47Cn0KCnN1YiBQcmVSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm47Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckF1dGg6Ok9uZVRpbWVBdXRoTGluaycpLT5EZWFjdGl2YXRlQ2xvc2VkVGlja2V0cygpOwoKICAgIGlmICgkU3VjY2VzcykgewogICAgICAgICRTZWxmLT5QcmludCgiPGdyZWVuPkRvbmUuPC9ncmVlbj5cblxuIik7CiAgICAgICAgcmV0dXJuICRTZWxmLT5FeGl0Q29kZU9rKCk7CiAgICB9CgogICAgJFNlbGYtPlByaW50RXJyb3IoIkZhaWxlZC5cblxuIik7CiAgICByZXR1cm4gJFNlbGYtPkV4aXRDb2RlRXJyb3IoKTsKfQoKMTsK</File>
        <File Location="Kernel/System/CustomerAuth/OneTimeAuthLink.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjEgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmRlLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lckF1dGg6Ok9uZVRpbWVBdXRoTGluazsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICAkU2VsZi0+e0RCT2JqZWN0fSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgCiAgICAkU2VsZi0+e1RhYmxlfSA9ICdvdGFfdG9rZW5zJzsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBHZXRPcHRpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1doYXR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBXaGF0ISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIG1vZHVsZSBvcHRpb25zCiAgICBteSAlT3B0aW9uID0gKAogICAgICAgIFByZUF1dGggPT4gMCwKICAgICk7CgogICAgIyByZXR1cm4gb3B0aW9uCiAgICByZXR1cm4gJE9wdGlvbnsgJFBhcmFte1doYXR9IH07Cn0KCnN1YiBFeHRlbmRlZFBhcmFtTmFtZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIAogICAgcmV0dXJuIHF3L09UQVRva2VuLzsKfQoKc3ViIEF1dGggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte09UQVRva2VufSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIFRva2VuIHByb3ZpZGVkISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCB1c2VkLHVzZXIsdGlja2V0X251bWJlciBGUk9NICRTZWxmLT57VGFibGV9IFdIRVJFIHRva2VuID0gPyIsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17T1RBVG9rZW59IF0sCiAgICApOwoKICAgIG15IEBSb3cgPSAgJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKTsKICAgIG15ICggJFVzZWQsICRVc2VyLCAkVGlja2V0TnVtYmVyICkgPSAoIDAgKTsKCiAgICBpZiAoIEBSb3cgKSB7CiAgICAgICAgKCAkVXNlZCwgJFVzZXIsICRUaWNrZXROdW1iZXIgKSA9IEBSb3c7CiAgICB9CgogICAgaWYgKCAhJFVzZWQgfHwgISRVc2VyICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIEVycm9yID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnT25lVGltZUF1dGg6OkN1c3RvbWVyRXJyb3JNZXNzYWdlTGlua0V4cGlyZWQnKSB8fCAnSWhyIExpbmsgdmVyd2Vpc3QgYXVmIGtlaW4gbm9jaCBnw7xsdGlnZXMgVGlja2V0LicsCiAgICAgICAgfQogICAgfQoKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CgogICAgIyBzZW5kIG91dCBuZXcgZW1haWwgaWYgdGhlIHRpY2tldCBpcyBzdGlsbCBjb25zaWRlcmVkIGFjdGl2ZSBidXQgbm8gY3VycmVudCBsaW5rIGV4aXN0cwogICAgaWYgKCAkVXNlZCA9PSAxICkgewogICAgICAgICMgc3RvcmUgZmFpbGVkIGxvZ2luIGNvdW50CiAgICAgICAgbXkgJUN1c3RvbWVyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoIFVzZXIgPT4gJFBhcmFte1VzZXJ9ICk7CiAgICAgICAgaWYgKCVDdXN0b21lckRhdGEpIHsKICAgICAgICAgICAgbXkgJENvdW50ID0gJEN1c3RvbWVyRGF0YXtVc2VyTG9naW5GYWlsZWR9IHx8IDA7CiAgICAgICAgICAgICRDb3VudCsrOwogICAgICAgICAgICAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgIEtleSAgICA9PiAnVXNlckxvZ2luRmFpbGVkJywKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtVc2VyTG9naW59LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayB3aGV0aGVyIGFjdGl2ZSBsb2dpbiBsaW5rIHN0aWxsIGV4aXN0cwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4gIlNFTEVDVCB1c2VyIEZST00gJFNlbGYtPntUYWJsZX0gV0hFUkUgdGlja2V0X251bWJlciA9ID8gQU5EIHVzZWQgPSA/IiwKICAgICAgICAgICAgQmluZCA9PiBbIFwkVGlja2V0TnVtYmVyLCBcMiBdLAogICAgICAgICk7CgogICAgICAgIGlmICggJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkN1c3RvbWVyVXNlciAnJFVzZXInIHRyaWVkIHRvIGxvZyBpbiB3aXRoIGFuIG9sZCB0b2tlbi4gTmV3IHRva2VuIGV4aXN0cyAtIG5vdGhpbmcgdG8gZG8uIgogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIEVycm9yID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnT25lVGltZUF1dGg6OkN1c3RvbWVyRXJyb3JNZXNzYWdlV3JvbmdMaW5rJykgfHwgJ0F1cyBTaWNoZXJoZWl0c2dyw7xuZGVuIG3DvHNzZW4gU2llIGRlbiBuZXVlc3RlbiBJaG5lbiB6dWdlc2FuZHRlbiBMaW5rIG51dHplbiB1bSBhdWYgZGllc2VzIFRpY2tldCB6dXp1Z3JlaWZlbi4nLAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ3VzdG9tZXJVc2VyICckVXNlcicgdHJpZWQgdG8gbG9nIGluIHdpdGggYW4gb2xkIHRva2VuLiBObyBhY3RpdmUgdG9rZW4gbGVmdCAtIHNlbmRpbmcgYSBuZXcgb25lIHZpYSBtYWlsLiIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT5TZW5kTmV3VG9rZW4oCiAgICAgICAgICAgICAgICBVc2VyICAgICAgICAgPT4gJFVzZXIsCiAgICAgICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFRpY2tldE51bWJlciwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ09uZVRpbWVBdXRoOjpDdXN0b21lckVycm9yTWVzc2FnZU5ld0xpbmsnKSB8fCAnSWhyZSBTZXNzaW9uIGlzdCBsZWlkZXIgYWJnZWxhdWZlbiAtIGVpbiBuZXVlciBMaW5rIHd1cmRlIGFuIElocmUgRW1haWwtQWRyZXNzZSBnZXNlbmRldC4nLAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkVXNlZCA9PSAyICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ3VzdG9tZXJVc2VyICckVXNlcicgbG9nZ2VkIGluIHZpYSB0b2tlbi4iCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPkRlYWN0aXZhdGVUaWNrZXRUb2tlbnMoCiAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkVGlja2V0TnVtYmVyLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkVXNlcjsKICAgIH0KCiAgICByZXR1cm47Cn0KCnN1YiBHZW5lcmF0ZVRva2VuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkICggcXcvVXNlciBUaWNrZXROdW1iZXIvICkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWFjdGl2YXRlIGFsbCBvdGhlciB0b2tlbnMgZm9yIHRoaXMgdGlja2V0CiAgICAkU2VsZi0+RGVhY3RpdmF0ZVRpY2tldFRva2VucygKICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFBhcmFte1RpY2tldE51bWJlcn0sCiAgICApOwoKICAgIG15ICRPVEFUb2tlbkxlbmd0aCA9IDI0OwogICAgbXkgJFJhbmRvbVN0cmluZzsKCiAgICBteSAkVHJ5ID0gMTsKICAgIHdoaWxlICggJFRyeSApIHsKICAgICAgICAkUmFuZG9tU3RyaW5nID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+R2VuZXJhdGVSYW5kb21TdHJpbmcoCiAgICAgICAgICAgIExlbmd0aCA9PiAkT1RBVG9rZW5MZW5ndGgsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayB3aGV0aGVyIHRoZSBzdHJpbmcgYWxyZWFkeSBleGlzdHMKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICJTRUxFQ1QgdXNlciBGUk9NICRTZWxmLT57VGFibGV9IFdIRVJFIHRva2VuID0gPyIsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte09UQVRva2VufSBdLAogICAgICAgICk7CgogICAgICAgIGlmICggJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJFRyeSsrOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFRyeSA9IDA7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRUcnkgPiA1ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IGdlbmVyYXRlIGEgdW5pcXVlIHJhbmRvbSBzdHJpbmcgYWZ0ZXIgZml2ZSByZXRyaWVzIC0gc29tZXRoaW5nIGlzIG5vdCByaWdodCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICJJTlNFUlQgSU5UTyAkU2VsZi0+e1RhYmxlfSAoIHRva2VuLCB0aWNrZXRfbnVtYmVyLCB1c2VkLCB1c2VyLCBjcmVhdGVfdGltZSwgY2hhbmdlX3RpbWUgKQogICAgICAgICAgICBWQUxVRVMgKCA/LCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgY3VycmVudF90aW1lc3RhbXAgKSIsCiAgICAgICAgQmluZCA9PiBbIFwkUmFuZG9tU3RyaW5nLCBcJFBhcmFte1RpY2tldE51bWJlcn0sIFwyLCBcJFBhcmFte1VzZXJ9IF0sCiAgICApOwogICAgCiAgICByZXR1cm4gJFJhbmRvbVN0cmluZzsKfQoKc3ViIERlYWN0aXZhdGVUaWNrZXRUb2tlbnMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKCBxdy9UaWNrZXROdW1iZXIvICkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICJVUERBVEUgJFNlbGYtPntUYWJsZX0gU0VUIHVzZWQgPSAxLCBjaGFuZ2VfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wIFdIRVJFIHRpY2tldF9udW1iZXIgPSA/IEFORCB1c2VkID0gMiIsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGlja2V0TnVtYmVyfSBdLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKc3ViIERlbGV0ZVRpY2tldFRva2VucyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAoIHF3L1RpY2tldE51bWJlci8gKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NICRTZWxmLT57VGFibGV9IFdIRVJFIHRpY2tldF9udW1iZXIgPSA/IiwKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUaWNrZXROdW1iZXJ9IF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9CgpzdWIgVGlja2V0TGluayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAoIHF3L1RpY2tldE51bWJlciBVc2VyLyApIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIgogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuICRDb25maWdPYmplY3QtPkdldCgnT25lVGltZUF1dGg6OkN1c3RvbWVyRXJyb3JNZXNzYWdlUmVmcmVzaEZhaWxlZCcpIC8vICdMaW5rIGNvdWxkIG5vdCBiZSBnZW5lcmF0ZWQsIHBsZWFzZSBjb250YWN0IHVzIGRpcmVjdGx5ISc7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRUaWNrZXRMaW5rID0gJENvbmZpZ09iamVjdC0+R2V0KCdIdHRwVHlwZScpIC4gJzovLycgLiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ZRRE4nKSAuICcvb3RvYm8vY3VzdG9tZXIucGwnOwogICAgJFRpY2tldExpbmsgLj0gIj9BY3Rpb249Q3VzdG9tZXJUaWNrZXRab29tO1RpY2tldE51bWJlcj0kUGFyYW17VGlja2V0TnVtYmVyfSI7CgogICAgIyBjaGVjayBpZiB0aGUgdXNlciBhbHJlYWR5IGhhcyBhIHBhc3Nzd29yZCAtIHRoZW4gbm8gZGlyZWN0IGxpbmsgaXMgbmVlZGVkCiAgICBteSAlVXNlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICBVc2VyID0+ICRQYXJhbXtVc2VyfSwKICAgICk7CgogICAgdW5sZXNzICggJFVzZXJ7VXNlclBhc3N3b3JkfSApIHsKICAgICAgICAjIGdlbmVyYXRlIHRva2VuCiAgICAgICAgbXkgJFRva2VuID0gJFNlbGYtPkdlbmVyYXRlVG9rZW4oCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkVG9rZW4gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFcnJvciBpbiB0b2tlbiBnZW5lcmF0aW9uISIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAkQ29uZmlnT2JqZWN0LT5HZXQoJ09uZVRpbWVBdXRoOjpDdXN0b21lckVycm9yTWVzc2FnZScpIC8vICdMaW5rIGNvdWxkIG5vdCBiZSBnZW5lcmF0ZWQsIHBsZWFzZSBjb250YWN0IHVzIGRpcmVjdGx5ISc7CiAgICAgICAgfQoKICAgICAgICAkVGlja2V0TGluayAuPSAiO09UQVRva2VuPSRUb2tlbiI7CiAgICB9CgogICAgcmV0dXJuICI8YSBocmVmPSckVGlja2V0TGluaycgdGFyZ2V0PSdfYmxhbmsnPiRUaWNrZXRMaW5rPC9hPiI7Cn0KCnN1YiBEZWFjdGl2YXRlQ2xvc2VkVGlja2V0cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGdldCB0aGUgY29tcGFyZSB0aW1lIGlmIGEgZGVsYXkgaXMgZ2l2ZW4KICAgIG15ICREZWxheSAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnT25lVGltZUF1dGg6OkFjY2Vzc0RheXNBZnRlckNsb3NlJykgfHwgMDsKICAgIG15ICRTdGlsbE9LVGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpLT5Ub0Vwb2NoKCkgLSAyNCo2MCo2MCokRGVsYXk7CgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgRElTVElOQ1QodGlja2V0X251bWJlcikgRlJPTSAkU2VsZi0+e1RhYmxlfSIsCiAgICApOwogICAgCiAgICBteSBAVGlja2V0TnVtYmVyczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAVGlja2V0TnVtYmVycywgJFJvd1swXTsKICAgIH0KICAgIAogICAgVElDS0VUOgogICAgZm9yIG15ICRUTiAoIEBUaWNrZXROdW1iZXJzICkgewogICAgICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldElETG9va3VwKAogICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFROLAogICAgICAgICk7CgogICAgICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICApOwoKICAgICAgICAjIHJlbW92ZSBvbGQgdG9rZW5zCiAgICAgICAgaWYgKCAkVGlja2V0e1N0YXRlVHlwZX0gZXEgJ2Nsb3NlZCcgfHwgJFRpY2tldHtTdGF0ZVR5cGV9IGVxICdyZW1vdmVkJyB8fCAkVGlja2V0e1N0YXRlVHlwZX0gZXEgJ21lcmdlZCcgKSB7CiAgICAgICAgICAgIGlmICggJERlbGF5ICkgewogICAgICAgICAgICAgICAgbXkgJExhc3RDaGFuZ2VkVGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nICAgPT4gJFRpY2tldHtDaGFuZ2VkfSwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApLT5Ub0Vwb2NoKCk7CgogICAgICAgICAgICAgICAgbmV4dCBUSUNLRVQgaWYgJExhc3RDaGFuZ2VkVGltZSA+ICRTdGlsbE9LVGltZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNlbGYtPkRlbGV0ZVRpY2tldFRva2VucygKICAgICAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkVE4sCiAgICAgICAgICAgICk7IAogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIFNlbmROZXdUb2tlbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAoIHF3L1RpY2tldE51bWJlciBVc2VyLyApIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIgogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CiAgICBteSAkVGlja2V0T2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldElETG9va3VwKAogICAgICAgIFRpY2tldE51bWJlciA9PiAkUGFyYW17VGlja2V0TnVtYmVyfSwKICAgICk7CiAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICk7CiAgICBteSAlVXNlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICBVc2VyID0+ICRQYXJhbXtVc2VyfSwKICAgICk7CgogICAgbXkgJFRlbXBsYXRlR2VuZXJhdG9yID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJyk7CiAgICBteSAkU2VuZGVyICAgICAgICAgICAgPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlNlbmRlcigKICAgICAgICBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0sCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCiAgICBteSAkTm90aWZpY2F0aW9uSUQgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ09uZVRpbWVBdXRoOjpUb2tlblJlZnJlc2hOb3RpZmljYXRpb25JRCcpOwoKICAgIG15ICggJEJvZHksICRTdWJqZWN0ICk7CgogICAgaWYgKCAkTm90aWZpY2F0aW9uSUQgKSB7CiAgICAgICAgbXkgJU5vdGlmaWNhdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpOb3RpZmljYXRpb25FdmVudCcpLT5Ob3RpZmljYXRpb25HZXQoCiAgICAgICAgICAgIElEID0+ICROb3RpZmljYXRpb25JRCwKICAgICAgICApOwoKICAgICAgICBteSAlTGFuZ3VhZ2VzID0gbWFwIHsgJF8gPT4gJF8gfSBAeyAkTm90aWZpY2F0aW9ue0RhdGF9e0xhbmd1YWdlSUR9IH07CiAgICAgICAgbXkgJExhbmd1YWdlICA9ICRMYW5ndWFnZXN7ZGV9IHx8ICRMYW5ndWFnZXN7ZW59IHx8ICROb3RpZmljYXRpb257RGF0YX17TGFuZ3VhZ2VJRH1bMF07CgogICAgICAgICMgcmVwbGFjZSBwbGFjZSBob2xkZXIgc3R1ZmYKICAgICAgICAkQm9keSA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+X1JlcGxhY2UoCiAgICAgICAgICAgIFJpY2hUZXh0ICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpLAogICAgICAgICAgICBUZXh0ICAgICAgICAgICAgPT4gJE5vdGlmaWNhdGlvbntNZXNzYWdlfXskTGFuZ3VhZ2V9e0JvZHl9LAogICAgICAgICAgICBEYXRhICAgICAgICAgICAgPT4ge30sCiAgICAgICAgICAgIFRpY2tldERhdGEgICAgICA9PiBcJVRpY2tldCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgJFN1YmplY3QgPSAkVGVtcGxhdGVHZW5lcmF0b3ItPl9SZXBsYWNlKAogICAgICAgICAgICBSaWNoVGV4dCAgICAgICAgPT4gMCwKICAgICAgICAgICAgVGV4dCAgICAgICAgICAgID0+ICROb3RpZmljYXRpb257TWVzc2FnZX17JExhbmd1YWdlfXtTdWJqZWN0fSwKICAgICAgICAgICAgRGF0YSAgICAgICAgICAgID0+IHt9LAogICAgICAgICAgICBUaWNrZXREYXRhICAgICAgPT4gXCVUaWNrZXQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgZWxzZSB7CiAgICAgICAgbXkgJFRpY2tldExpbmsgPSAkU2VsZi0+VGlja2V0TGluayggJVBhcmFtICk7CgogICAgICAgICRTdWJqZWN0ID0gIk5ldWVyIEF1dGhlbnRpZml6aWVydW5nc2xpbmsgZsO8ciBUaWNrZXQjJFRpY2tldHtUaWNrZXROdW1iZXJ9IjsKICAgICAgICAkQm9keSAgICA9ICJHdXRlbiBUYWc8YnIvPklociBha3R1ZWxsZXIgTGluayB1bSBhdWYgVGlja2V0IyRUaWNrZXR7VGlja2V0TnVtYmVyfSB6dWdyZWlmZW4genUga8O2bm5lbiBsYXV0ZXQ6PGJyLz4kVGlja2V0TGluayI7CiAgICB9CgoKICAgIG15ICRFbWFpbE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbCcpOwogICAgbXkgJFNlbnQgPSAkRW1haWxPYmplY3QtPlNlbmQoCiAgICAgICAgRnJvbSAgICAgPT4gJFNlbmRlciwKICAgICAgICBUbyAgICAgICA9PiAkVXNlcntVc2VyRW1haWx9LAogICAgICAgIFN1YmplY3QgID0+ICRTdWJqZWN0LAogICAgICAgIENoYXJzZXQgID0+ICd1dGYtOCcsCiAgICAgICAgTWltZVR5cGUgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgQm9keSAgICAgPT4gJEJvZHksCiAgICApOwoKICAgIGlmICggISRTZW50ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IHNlbmQgbmV3IHRva2VuIHRvICRQYXJhbXtVc2VyfSBmb3IgVGlja2V0IyRQYXJhbXtUaWNrZXROdW1iZXJ9ISIKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==</File>
        <File Location="Kernel/System/PostMaster/Filter/CreateNewCustomerUser.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjEgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmRlLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpGaWx0ZXI6OkNyZWF0ZU5ld0N1c3RvbWVyVXNlcjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBwYXJzZXIgb2JqZWN0CiAgICAkU2VsZi0+e1BhcnNlck9iamVjdH0gPSAkUGFyYW17UGFyc2VyT2JqZWN0fSB8fCBkaWUgIkdvdCBubyBQYXJzZXJPYmplY3QhIjsKCiAgICAjIEdldCBjb21tdW5pY2F0aW9uIGxvZyBvYmplY3QuCiAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9ID0gJFBhcmFte0NvbW11bmljYXRpb25Mb2dPYmplY3R9IHx8IGRpZSAiR290IG5vIENvbW11bmljYXRpb25Mb2dPYmplY3QhIjsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIG9ubHkgbmVlZGVkIGZvciBuZXcgdGlja2V0cwogICAgcmV0dXJuIDEgaWYgJFBhcmFte1RpY2tldElEfTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhHZXRQYXJhbSBKb2JDb25maWcpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fS0+T2JqZWN0TG9nKAogICAgICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICBLZXkgICAgICAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6RmlsdGVyOjpDcmVhdGVOZXdDdXN0b21lclVzZXInLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAiTmVlZCAkXyEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15IEBFbWFpbEFkZHJlc3NPbkZpZWxkID0gJFNlbGYtPntQYXJzZXJPYmplY3R9LT5TcGxpdEFkZHJlc3NMaW5lKAogICAgICAgIExpbmUgPT4gJFNlbGYtPntQYXJzZXJPYmplY3R9LT5HZXRQYXJhbSggV0hBVCA9PiAnRnJvbScgKSwKICAgICk7CgogICAgbXkgJEluY29taW5nTWFpbEFkZHJlc3M7CgogICAgZm9yIG15ICRFbWFpbEFkZHJlc3MgKEBFbWFpbEFkZHJlc3NPbkZpZWxkKSB7CiAgICAgICAgJEluY29taW5nTWFpbEFkZHJlc3MgPSAkU2VsZi0+e1BhcnNlck9iamVjdH0tPkdldEVtYWlsQWRkcmVzcygKICAgICAgICAgICAgRW1haWwgPT4gJEVtYWlsQWRkcmVzcywKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxIGlmICEkSW5jb21pbmdNYWlsQWRkcmVzczsKCiAgICBteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwoKICAgIG15ICVMaXN0ID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgUG9zdE1hc3RlclNlYXJjaCA9PiBsYyggJEluY29taW5nTWFpbEFkZHJlc3MgKSwKICAgICAgICBWYWxpZCAgICAgICAgICAgID0+IDAsCiAgICApOwoKICAgICMgdXNlciBhbHJlYWR5IGV4aXN0cwogICAgaWYgKCAlTGlzdCApIHsKCiAgICAgICAgIyByZXR1cm4gaWYgbm8gWC1PVE9CTy1DdXN0b21lclVzZXIgc3Bvb2ZpbmcgaXMgcG9zc2libGUvZGFuZ2Vyb3VzCiAgICAgICAgcmV0dXJuIDEgaWYgISRQYXJhbXtKb2JDb25maWd9e0N1c3RvbWVySGVhZGVyU3Bvb2ZQcm90ZWN0aW9ufSAmJiAhJFBhcmFte0pvYkNvbmZpZ317U2V0Q2hlY2tCb3hOYW1lfTsKCiAgICAgICAgbXkgJUN1c3RvbWVyRGF0YTsKICAgICAgICBMT0dJTjoKICAgICAgICBmb3IgbXkgJFVzZXJMb2dpbiAoIHNvcnQga2V5cyAlTGlzdCApIHsKICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlciA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICBVc2VyID0+ICRVc2VyTG9naW4sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXJ7VmFsaWRJRH0gPT0gMSApIHsKICAgICAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAlQ3VzdG9tZXJVc2VyOwogICAgICAgICAgICAgICAgbGFzdCBMT0dJTjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBpZiB1c2VyIGV4aXN0cyBidXQgaXMgbm90IHZhbGlkLCBkbyBub3RoaW5nCiAgICAgICAgcmV0dXJuIDEgaWYgISVDdXN0b21lckRhdGE7CgogICAgICAgIGlmICggJFBhcmFte0pvYkNvbmZpZ317U2V0Q2hlY2tCb3hOYW1lfSAmJiAkQ3VzdG9tZXJEYXRhe1NvdXJjZX0gZXEgKCAkUGFyYW17Sm9iQ29uZmlnfXtDdXN0b21lclVzZXJCYWNrZW5kfSB8fCAnQ3VzdG9tZXJVc2VyJyApICkgewogICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19eyAnWC1PVE9CTy1EeW5hbWljRmllbGQtJyAuICRQYXJhbXtKb2JDb25maWd9e1NldENoZWNrQm94TmFtZX0gfSA9IDE7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gMSBpZiAhJFBhcmFte0pvYkNvbmZpZ317Q3VzdG9tZXJIZWFkZXJTcG9vZlByb3RlY3Rpb259OwoKICAgICAgICAjIHRha2UgQ3VzdG9tZXJJRCBmcm9tIGN1c3RvbWVyIGJhY2tlbmQgbG9va3VwIG9yIGZyb20gZnJvbSBmaWVsZAogICAgICAgIGlmICggJEN1c3RvbWVyRGF0YXtVc2VyTG9naW59ICkgewogICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19eydYLU9UT0JPLUN1c3RvbWVyVXNlcid9ID0gJEN1c3RvbWVyRGF0YXtVc2VyTG9naW59OwoKICAgICAgICAgICAgIyBub3RpY2UgdGhhdCBVc2VyTG9naW4gaXMgZnJvbSBjdXN0b21lciBzb3VyY2UgYmFja2VuZAogICAgICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ05vdGljZScsCiAgICAgICAgICAgICAgICBLZXkgICAgICAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6RmlsdGVyOjpDcmVhdGVOZXdDdXN0b21lclVzZXInLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAiVGFrZSBVc2VyTG9naW4gKCRDdXN0b21lckRhdGF7VXNlckxvZ2lufSkgZnJvbSAiCiAgICAgICAgICAgICAgICAgICAgLiAiY3VzdG9tZXIgc291cmNlIGJhY2tlbmQgYmFzZWQgb24gKCRJbmNvbWluZ01haWxBZGRyZXNzKS4iLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBpZiAoICRDdXN0b21lckRhdGF7VXNlckN1c3RvbWVySUR9ICkgewogICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19eydYLU9UT0JPLUN1c3RvbWVyTm8nfSA9ICRDdXN0b21lckRhdGF7VXNlckN1c3RvbWVySUR9OwoKICAgICAgICAgICAgIyBub3RpY2UgdGhhdCBVc2VyQ3VzdG9tZXJJRCBpcyBmcm9tIGN1c3RvbWVyIHNvdXJjZSBiYWNrZW5kCiAgICAgICAgICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPk9iamVjdExvZygKICAgICAgICAgICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnTm90aWNlJywKICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpGaWx0ZXI6OkNyZWF0ZU5ld0N1c3RvbWVyVXNlcicsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJUYWtlIFVzZXJDdXN0b21lcklEICgkQ3VzdG9tZXJEYXRhe1VzZXJDdXN0b21lcklEfSkiCiAgICAgICAgICAgICAgICAgICAgLiAiIGZyb20gY3VzdG9tZXIgc291cmNlIGJhY2tlbmQgYmFzZWQgb24gKCRJbmNvbWluZ01haWxBZGRyZXNzKS4iLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHVzZXIgZG9lcyBub3QgeWV0IGV4aXN0IC0gY3JlYXRlIGl0IQogICAgZWxzZSB7CiAgICAgICAgbXkgJFVzZXJMb2dpbiA9IGxjKCAkSW5jb21pbmdNYWlsQWRkcmVzcyApOwogICAgICAgIAogICAgICAgIG15ICRTdWNjZXNzID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyQWRkKAogICAgICAgICAgICBTb3VyY2UgICAgICAgICA9PiAkUGFyYW17Sm9iQ29uZmlnfXtDdXN0b21lclVzZXJCYWNrZW5kfSB8fCAnQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgVXNlckZpcnN0bmFtZSAgPT4gJyAnLAogICAgICAgICAgICBVc2VyTGFzdG5hbWUgICA9PiAnICcsCiAgICAgICAgICAgIFVzZXJDdXN0b21lcklEID0+ICRVc2VyTG9naW4sCiAgICAgICAgICAgIFVzZXJMb2dpbiAgICAgID0+ICRVc2VyTG9naW4sCiAgICAgICAgICAgIFVzZXJFbWFpbCAgICAgID0+ICRVc2VyTG9naW4sCiAgICAgICAgICAgIFZhbGlkSUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkU3VjY2VzcyApIHsKICAgICAgICAgICAgIyBub3RpY2UgdGhhdCBVc2VyTG9naW4gaXMgZnJvbSBjdXN0b21lciBzb3VyY2UgYmFja2VuZAogICAgICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ05vdGljZScsCiAgICAgICAgICAgICAgICBLZXkgICAgICAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6RmlsdGVyOjpDcmVhdGVOZXdDdXN0b21lclVzZXInLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAiQ3JlYXRlIGFuZCBzZXQgbmV3IFVzZXJMb2dpbiAoJFVzZXJMb2dpbikuIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRQYXJhbXtHZXRQYXJhbX17J1gtT1RPQk8tQ3VzdG9tZXJVc2VyJ30gPSAkVXNlckxvZ2luOwogICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19eydYLU9UT0JPLUN1c3RvbWVyTm8nfSAgID0gJFVzZXJMb2dpbjsKCiAgICAgICAgICAgIGlmICggJFBhcmFte0pvYkNvbmZpZ317U2V0Q2hlY2tCb3hOYW1lfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtHZXRQYXJhbX17ICdYLU9UT0JPLUR5bmFtaWNGaWVsZC0nIC4gJFBhcmFte0pvYkNvbmZpZ317U2V0Q2hlY2tCb3hOYW1lfSB9ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgcHJlZmVyZW5jZXMKICAgICAgICAgICAgJEN1c3RvbWVyVXNlck9iamVjdC0+U2V0UHJlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJMb2dpbiwKICAgICAgICAgICAgICAgIEtleSAgICA9PiAnVXNlclRpbWVab25lJywKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAnRXVyb3BlL0JlcmxpbicsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRDdXN0b21lclVzZXJPYmplY3QtPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VyTG9naW4sCiAgICAgICAgICAgICAgICBLZXkgICAgPT4gJ1VzZXJTaG93VGlja2V0cycsCiAgICAgICAgICAgICAgICBWYWx1ZSAgPT4gJzI1JywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEN1c3RvbWVyVXNlck9iamVjdC0+U2V0UHJlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJMb2dpbiwKICAgICAgICAgICAgICAgIEtleSAgICA9PiAnVXNlclJlZnJlc2hUaW1lJywKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAnMCcsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=</File>
        <File Location="doc/en/OneTimeAuthentificationLink.pdf" Permission="644" Encode="Base64">JVBERi0xLjUKJeTw7fgKNCAwIG9iago8PC9UeXBlL1hPYmplY3QvU3VidHlwZS9JbWFnZS9XaWR0aCA4MjgvSGVpZ2h0IDI1My9Db2xvclNwYWNlL0RldmljZUdyYXkvQml0c1BlckNvbXBvbmVudAo4L0RlY29kZVBhcm1zPDwvQml0c1BlckNvbXBvbmVudCA4L0NvbG9ycyAxL0NvbHVtbnMgODI4L1ByZWRpY3RvciAyPj4vRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aAoyNDQzPj4Kc3RyZWFtCnja7d2LddpYAgZgUkGYCqKtIGwFZisIqWCYCsJUsGwFw1QwuIJlKli5gpUrGKhgTQVZJ465AoORhB7X6PvOmXMSGzsaSf/VfWswAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgF5LktEwSR7/kC3WNf3K8TSp/LOr5cN1nufZ5PxnsodsnTV5EE9XJh2s19mDW/+yUzke34S/bcf1XLflz5f89P34Gq/qMP1Y8JPb1WrV1FHkr8wmS9NMBKpdzcnk0+FlS+q4bef/vOzn70dXeLbTmxIf3i4WjZQfk38ffGGTLlNJKP/wPvZw+HVRw69+eH/hL/jH9V3P0X/LfX47XzRwFNmRZ99muVyLQwnT+YejX//XvIb201+X/oY6jiK2ouo/ZX/iblL/o+fr8S/fzqXn0uTEkp1fF7JTX+vzfHakp/BlnJ+uev+yrOEfWH+48Bf8PZOdRsKz+nTyW7/P9bud7SGYfzn9zc2ojhP4okVatrYyHshOI+F57Si205V0vH72lq88FDaTeq7V7LeLojN5kJ06y7J8bf2PV77559Sj5xWnuo/vBoOHbL2q69wlk+GJ7+z+/bv0VL3iKsccQnZuT7csRsPkoGS7ndZ8HMl08PhUTz40WnZeZX1t+bK+u02ztMUh5q919kq8yey83gGfjKd7rdGmuutHyXj8saH27lVG58XQdpND2LJTJTvfPrr42E7b78jg+OD3mZwcK2rSgzHLu2X7pYzsFHiS5GfONDtOnEynTdcSrzE6d/O0g6OQnSJhyIWn8Xv5cLBPeM5FZzNNOzkM2Sn0IMnNfnvXeFV+NnsvPMXbOp3dubJTKDtJtrudPzffIk2WN8Jz2t4swPtpZ32RslOsARNqba2cqNk8/+jR23aq9Tm4nXU3BiY7xbIT5l23M8titMq3eq5wInv19uAfMdTXZKfEfbmbFLhJ2q/U17OO6yrkas9dP5Blp2B2Qm/Bu3aOcLjKNXqucUphNfk1ix3XZWWnYHbC7Kl3bR1jfpb1FS4DqdYQ/C2eZmBfsxOuQbzZyVfbtqO14DyeknWosXU+5aKv2QlRiDc7e+H5cyI5e31s3VdjZSfi7OwNoOtr21sCHUH3iewUvCcXXzrITr5DVnfB3mMngqJEdsr2s22HbR5nrr/Agyf32IlhroXslB3fabf8zzWOPXjCYyeKAS/ZKZadUOS13L2Tq7X1/cGTK0eiuFtlp9gdGW7hzy2vTgwzH/s+JzRcg00ykJ03k50wnP1Ty7WF3K4kP/V7Zk4oReIYKZadQtkJN3D7rY5wy/R7PnWoNkcyvU92Sq59a//+DVWVfo+PhqkgkWziIDtFshM+3UWRF/bi73WlLXTXR7JP7dee1gfCXqkFLkSur6uLIiYMy/a60vY1rp6C3LDF39b9rDyfH+ocLsJodic17bDurs89baHJGcu+W8/lb+/2AXuuAZztstnb9bibDp5dAXeVbxEr3dyJZpzrqULQv62PfywtO1NmJJNpfmOJjob2w3h6jxs84SS8i+aYksd6QJr28GJMHgvxg1esTcf7VenR/hZ6tW/lXlBob/V4asGuq9PcpHgfRSc18PKqko2zPi8f/Rpbc4cX1df4ouO+2TsHlp/HfHWOR6fDVc/qK+U3mKCTq3PcZr7s6tB2w4KyIztvMTuPd+60o0fPbl5Duwvv4rw679yq8Xl4f+4TXb0DtJPNEuIS+hpl5+31FXzXzayYMC7Y2xtH8RG3vV3CYwqPCkuk2RmPs2zdw6sxHI8O3+w6PXin8bF36HbRVJWdKOtsT9O1ejhu8L0g287OPEaGo/F4f8S0i+mg6mwxFh/Pc3R7F57nOkCB7QeG01n++dPBCjSV/Vx2Ilm9kxt169kahOH/fvxhkxQq+PPvkmq/1qaPOsbxnb6ufQuXolihMVqG+dTtD1AaG41xTo411wWLsfy+6q2XfObkxDinT3aKBiG3r3rryzfNBY2x/JCdwg+R0NnVdqsjLLru8Rzi+Na+yU7xCthu6XPbe4Na+7ZXdH1eyc5by064ei2fLGuu9x6+sVRcZad4dsLyzZar3LtJqn3e6yOchU0iO28tO62/J/6HsJdcr5cbx7u3oeyUuXqtNldDlS2Wmn4nQqsvkh4T2SmRnY6mxoTNsHs9/X43FSSWcXzZqZSdVmcw7bLT83dd7x77kcwfk51K2Wm1r3j3z/b7HSK7eVSxFCHtZOfbuph0cVH/6nQ6yi78FW81O8/vCux1L9v3e2Dx7UREs4dtK9l5auxetL/Z0wucNuO6ntaVpuV2tRRgtPrWwXc/fuh5dgbD6fAhjWUJQivZee4gueDiP28lUNvASqXshA0NWm60D0fjQbYaEJU2srN76V/lOZShe7KuZmKl7OjwouXshP02KzZ2c1OY62poVMrO7n/EduK0nZ1q4UmysGizy+yE8f2+v62dtrIThuMrhSe/6qy2jTaqZCeM7/e8s5jWsrO3WW3p2y6/2rm+o6yQnTAVtG+bO9BZdnJ9u+XDk2vr1NnOqJCd0FPQ+4EWWsvOXq2tXGPhaTis7hpblezkNg31Bhhay06+yfJYbE+KVnnyr5iu9+VRpbOz7Phl1/Q0O3tdZY8337xYwb33iul6W+gls9NMowvZKdtseXz0zM7fscl8f2v1Wju3SmVn/0g8dmg1O4fhGdzNX79nh7PZ++aiUyI7yWRy0+CBIDulwzO4W5yeoTWaHb7Oo+Y7NmTn9rXGV5KMDl9o1fNFNHSQnf02w1PtZ7lKj5b00xefnNUbnQIvSDzBbGbaz85guLp58bVtmmb5l+CMRqPJy5fe1P969qrZER26yM7BIGkuGtngIRsMR0ffFfWtdjep/YatmB3RoaPsHPY6F9PEoVXLTjRLFokpOy2NlQ/nX0r+xP20iYWCVbJTdFiKfthtttjafnHjxccI7tewQ2thtzMPHY60QNqc3jidF624bReLpu7X7GOpj29X87W7hb061NNMs82k1R0UiqWnweQcGW56xSZd2SyAl2aTWjdvKlpzm/58rp2zWDV6UMP56OZceB8LlPU6yzxxiOuJN5l8Oh2c5coNC6fjMx4fKfvvszQVHDjf8BiOH/97+nM6yB5SpwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIDL/B9n0iy4KZW5kc3RyZWFtCmVuZG9iago1IDAgb2JqCjw8L0NvbG9yU3BhY2UvRGV2aWNlUkdCL1NNYXNrIDQgMCBSL1R5cGUvWE9iamVjdC9TdWJ0eXBlL0ltYWdlL1dpZHRoIDgyOC9IZWlnaHQgMjUzL0JpdHNQZXJDb21wb25lbnQKOC9EZWNvZGVQYXJtczw8L0JpdHNQZXJDb21wb25lbnQgOC9Db2xvcnMgMy9Db2x1bW5zIDgyOC9QcmVkaWN0b3IgMTU+Pi9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoCjE4NDg+PgpzdHJlYW0KeNrt3Gtu2zoQgNG48JK6/xVkT6qBAEZao7FEkeLM8Bz0133gOpRIfqJyfdu27QMAgNh+GQIAANEGAIBoAwAQbQAAiDYAAEQbAIBoAwBAtAEAINoAAEQbAACiDQBAtAEAINoAABBtAACiDQAA0QYAgGgDABBtAACINgAARBsAgGgDAEC0AQCINgAARBsAAKINAEC0AQAg2gAAEG0AAKINAADRBgAg2gAAEG0AAIg2AADRBgCAaAMAQLQBAIg2AABEGwAAog0AQLQBACDaAABEGwAAog0AANEGACDaAAAQbQAAiDYAANEGAIBoAwAQbQAAiDYAAEQbAIBoAwBAtAEAINoAAEQbAACiDQAA0QYAINoAABBtAACiDQAA0QYAgGgDABBtAACINgAARBsAgGgDAEC0AQCINgAARBsAAKINAEC0AQAg2gAAEG0AAKINAADRBgCAaAMAEG0AAIg2AADRBgCAaAMAQLQBABRzNwSF3W6/f/4Htu1zzR88rKpXBNPHzW8Zp8P9sG2bUVh5wa034fMWmyUYc8cUsJ7zAydtqy+1j3+30jzPXmzAcxYvniANq5mhK8/vtKWf1TLFSg0lbzxz4eTWYADrcdJmhTUmQOhJ7dzIAPLFSVvWRyjjAHgew64h2jDxUvI0CboNO4how2RDeoJuM4yINubNsWKJoHjAYmg1cwog2lBsum34JxedwDWrmW5LmQS+XHeFXJMC4y6EsWWRBWfQrd6w0Jl0HTcIg5mLr/yoOSHNQyCF52Ll4Kd5kff96qKNlMVm7gGpK2TP6qcz+oav8UzE77QVKTa/DgVU6g+aN4KGMXTMKdq4qNjkGqDbODmGuk20MXbOyDXAakmvDcKoijY8jAJY33Kkm24TbfSfKlY0AEZsGbpNtNFtknglCugMdJtoI0GxGS4AdLBow3wDoPI+snMrcdgm2mifGIoNgIDbE6LNlFBsAAxhTxFtmF0AlNpZHLaJNkwGAJwIINpMKgDotMU4XxBt7JoGig0AEG0A5H6y5TyHbaKNDhPAMRsAQboN0YYpBEACDttEGwC0JIIn276Mp2jD8woAINo88QB4suWqrcd1EW0AcKwMPNmyrLshyPWsA1ByaXKQA285aQv3EImdDFa7mfevjSadBU20ARYyuHoKPFrt64/JmIJzh+m8HhUH7Lo0/6xWLhZVl6DmW92ODqINJDWEvtWvyTVzELweBcBTE8ZZtAGAkgDRlotf+ACsbBZPEG0AVE5D6QaiLQrn/4C16226GXBEGwAkoNsQbQDQ6OIXBbqNZfmeNmjZKrzOZoX7fP+t/voF1KM/pDmIaAN2PdnbM3Crv3Zbl/+iboP/8XoUGjcV72hwq5/3CK/nH5cARFvu5RJXDRa5mY/WmwmIaAOAmXnk1A1E2/yHSIMA0HHBdNiGaAMAD7og2gBAt8Xj5FK0AcCobtMZiDY84gAAog0ASMXbatHmjgfAyjmftz2iDXMGABBtAMB4zjtFGwCc5R0Fog0PKwBAFHdDIOmgr9djj6Q3dpkfBOxNNThpc/fD2ND5yPn2qswPYlHFMIo2Os+Nx18xYShZbBlzR5xhb7I3BeT1qGca4ECxPf6uyYu9iSmctAEhYsiHBBBtgCRSbG4bEG0AJTZgZQCINoDoebT/I/mNH3cLiDYgvf1BE2onVmyL3HUg2gASd5uDnMhcHfjOV34Ak7fkWSclR4PAiY5ig7mctAGdHY2bKXuzYgueazsvkOvCUpy0AUO67VAVXXnk1tCIyiBsTINoA7i62y5It7YgUGxhW82lQbQBTOu2QenWfH4jC86P4bi7y0VBtAFM7rbviXBmbz7ZGbIAEG2AbmsMr7ch1etASLEFv6kMAqINYNQW2yWnrnlJpwkUGwTkKz8Ae+1fH1ITuItAtAF23E8fDz0NbbweBSaEkf8VERcIjnLSBjaSOUMXZ/Rcx8iD4IANnpy0AZNDYeKpmxoQkZDIbds2owDvp8pLWNhURo+wJih/FVwXEG2AaNAEQDVejwKBPKOqb71pNUC0AYytt7aGU2mAaAOY33AAC/KVHwAAog0AANEGACDaAAAQbQAAiDYAANEGAIBoAwBAtAEAiDYAAEQbAIBoAwBAtAEAINoAAEQbAACiDQAA0QYAINoAABBtAACINgAA0QYAgGgDABBtAACINgAARBsAgGgDAEC0AQAg2gAARBsAAKINAEC0AQAg2gAAEG0AAKINAADRBgCAaAMAEG0AAIg2AABEGwCAaAMAQLQBAIg2AABEGwAAog0AQLQBACDaAAAQbQAAog0AANEGACDaAAAQbQAAiDYAANEGAIBoAwBAtAEAiDYAAEQbAACiDQBAtAEAINoAAEQbAACiDQAA0QYAINoAABBtAACINgAA0QYAgGgDABBtAACINgAARBsAgGgDAEC0AQAg2gAARBsAAKINAADRBgAg2gAAEG0AAKINAIBI/gCkqoRBCmVuZHN0cmVhbQplbmRvYmoKOCAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDMyOT4+CnN0cmVhbQp42nVSy07EMAy88xX+gWZtJ05iqeoB8RDcVvSGOLTblgsV2hO/j5MWFglQaznjxjMeq3AGArSHILG9CKfV0L3F67/5DE41evgw1KgLUWCFEPMXeIMnOP7RRZqdSXitihELIAaO6tiaU3JRYhng8LAi3LwbyXUPhzsCDi7lRNAvQOyd5AANkR2YoZ+eW8RsVDEi0dwFMTzOSMFbLZQaIoZOW6RRkIYJyc+1XFsKLlfn0m43F3+ppY0W47DT2R3J3Uv/WOei5JgklLnYo5lP0HByWWUfa9AutJuUjB1hPXeNb3cZ2jDn8mU+WYzIvNTzlpcq1vjkqGyYAjmNeqE3s3XKn65UjTLpthYcqcQugkHLUrqGrA8XRMGLG6MW4eIm28JjNDOCTgLtcsV92aBZ2fhpnmowD98mpmqi5oUq923/62c4Xn0CBl+M2gplbmRzdHJlYW0KZW5kb2JqCjEyIDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMzQ+PgpzdHJlYW0KeNpTKFQwVDAAQkMFcyMgMlBIzgXy3IE4nSAdyAUAh+oMRwplbmRzdHJlYW0KZW5kb2JqCjI4IDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggNzY0Pj4Kc3RyZWFtCnja7ZnJbtswEIbvfQq+gNhZuA1g6FCgDdBbWt+KHhzL6qU5pJe+fofaxdhwkLiXVkhiUkwwizQf/6Fingwa0C80kfQbzPFRr+7058ez8cPevP+EBp1lF8jsW8NClsSbKkYbQcy++bYDIARIBBADwMMJgHGeP2D9ff/ZfNwbsARJPzk6/XQpmC93ZxZ/TX7FSqCQ3YKpMIplSr1HPB3rCpFDdp7qKukSngAPqCMAigA61jHoWtPPNVcMYQpmneLsShO16Zm7022S0BAsOT9abepKgtvlmwTYuFp2fQqHpvZDRsHVFcX8C5GacFiVBPjghxx1naa/HsYub71FvcUXJU1MZYAtvDJtXtjW6hHn1DSypSlzIGqHx+hzlOBSnfosUbOBludsjqf+6eWn6tPZZJYOJVoXeeVQndWVExlmHmCb/V+za0WTCfCM6zJd1P+4M96AA/IWfShJyLRSUuzhEGo3EJD3Mq348ZJjTTBtdddBABtSKjxevFUbHhsUF6FY1ezfwYKjRcQSi5NiwZwVQZsJ5NOseZ0WRiDnOp3vAMkKkfW+6VSTBjnN2sGhrnjXq6LLDB3V8sjVLK1Xbwk6jTeU8W4A/Q8QrCr0zRCUraEXCyRzw1lJ1IYIjr7b63OLO2pA19VdqNWyq+Mu8pXtlm7Z1UWwktwU9rKvC2FobTu9avqWVcLVO64mmX1he0Nsm90O6MRS1u4CixuqWiIrLCUezaRqhOPJVJdDh3fcDaQsjkLFIbYXNzhIbg07vDgMJ8PlaTD0HeRLZM0n3eS4CHhj7l+r+FU5vrniCwljcDb5OBa7RhgllylohwZtX7y5sLUHe4l0eVeabN0NlYsx2ITTG4l2qVwMBZrK33QguxD+0kdiK1D62GjaZq9j1wmW9bpA4XZqxZRsDLFEons1IbmZa5pZXbqzFl59t3oWi6WfDYtt9hYsVjV7BothfDKWJXnzOytVCN5GduZR7aT58qf5au7PiZG3wal8hhhtSuM/BRyXvu7f/QEndZkGCmVuZHN0cmVhbQplbmRvYmoKMzEgMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAxMTA+PgpzdHJlYW0KeNpTKFQwVDAAQkMFcyMgMlBIzgXy3IE4HSddqKBnbGlhqlAO5OmamZnqmRubKOQqmJhZILg5CsEKgQpOIQr6boYKlnqWZkZmCiFpYA3m5noWFhYKISnRNgaGJsYgbBcb4qXgGgK3IZALAFfEH9UKZW5kc3RyZWFtCmVuZG9iagozNCAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDI4Nz4+CnN0cmVhbQp42mVRy07EMAy88xX+gWZtx3USqeoB8RDcVvSGOLS7LRcqtCd+Hyd97ArURs44Hk8yhgsQoH0Ege1HOM2Gnm197vG+g8MTQXJJWaGbgOvoMAXg6CR56M7vDWJkJFUkGlsRw8OIJN5yknOIKC1hgzTUSP0ZyY8lXzgZ59ox86108tdcWPqi9ms/q6kjMvdtxSGZUp9aEyzN6mERsUtUvlkb0YI55pPxZGsw+lT2S5zaj+4VHju4gPMp1vBjD2dxAQPMIBo38AVvcNyNMfNSdHZBn4qJihkQA3lxKlCVRLb08DIjPHzfcP/GW+VKtXbBy6q9w0X93zgyIQQXY1xHwVTGgUHLGNDTdT9QeauoOB/EuIViVmwWbBc63v0C+cd3awplbmRzdHJlYW0KZW5kb2JqCjM3IDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMjUxPj4Kc3RyZWFtCnjabVC7bsMwDNz7FfwBq6REvQDDQ4G2QLeg2ooOVixnaYZM+f1Qkp0UaCEJ0h15JHVwAQKUReC1bITjWdC7nNP9fknw/EYQVXTaQVqF1EFxNJCWrxExaCTnkKhMzIJzQWIjHFcOEXkiHJGyRZoXJFMa3zQV19xS9ZK6mgfne11081ZPcmxAredp0D5KpzlO0rAVs7k3kSEGM26FqGMdaqQc5WSRr+3d73X6Th/wmuACysRg4Vp/x8qjhzOwCzv4gU84/LHmt2pwzipveNPdYVf+Y+LgvFchhG4jlaXNwmQVay/x7q6m5jB615xFQ493pn38faDD0w2PnWg1CmVuZHN0cmVhbQplbmRvYmoKNDAgMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAzODQ+PgpzdHJlYW0KeNp1U8lOxDAMvfMV/oEGO4uTSFUOSIDEbURviMMsHS7MYU78Ps7WdljaRrVf7OcXy4ErEKC8BF7Lh3C8iPcs6+PX/woqRjbwJd4QlWUHF7AcuvMJr7CDhwnunwiiiqwZpjNYbZQ1HgbtVYgOptPbiKgJ0aE8FnHPiIcZ0Qi2j+l9eikUZJWxrDOHmFFboTAqEjWKoBE957SS8jjdKmStNPsusXk3GjcFjHeKmGEgZMVdY6iaDlT17qNodqvebFcRTbPZHHtYKJ1XPtjGiTbFEengkPan5MSUrhNLF84mQ0hW/lKs+O6QV6Icd7JJWqjHsksxJk3ZntNgxp6dbIHEpG1wqUZLQKtYAoWnBfaginaKzs0sO74hZHzVefyrYj6EmSvKdkuStZQ1Nz29hBAVQonqSBHJ9YAV6c2p0lfeTUM3hXlNmHntaMcq/Sp5aYwLSetxQ0Ko9blP2OYumBhcmzR2yhu7jFpz/7sPMoo5yst1CKGOBc3zzwq7u2/mP8w6CmVuZHN0cmVhbQplbmRvYmoKNDMgMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAyNzM+PgpzdHJlYW0KeNptkctOxDAMRfd8hX8gwc7DSaQqCyRAYjeiO8SinUlnwyxmxe/jPDogQG2UXtfXjk/gCgQoD0Ew8iIcL6KeZZ1v+8MM908ESSc2DPMmQRO1Sxbm09uEGA0SMxKV7JzotSA5KzFXY4joMuGEtHqk5YRkS4s3T9U1t1S/pG72OxZ6XeRl1JMcH9GYJSsTknRaUpaGrZhfexM5hLLTKERdm1j/lKOsVexb++77lt/nF3ic4Qrapujhs07ndMAAF3Acd/EBr3D4g+anSzF7Hawbvpvszn8gKg5Bxxg7xv0s1ifNwhYHXUONWBsoNWLZj5lTGiDGPFmxrxdgYlZx5DQGWHM7xMS/Ae8E9pkOd1/z13cyCmVuZHN0cmVhbQplbmRvYmoKNDYgMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCA0ODM+PgpzdHJlYW0KeNq1lD1v2zAQhvf+Cv4BsXe84xcQcCjQBuiWVlvRwZbkLM2QLv37fUlRSSwnQAbHNk0fRd/Hw5dnHg0bwptNdPiQmR5g3WLcX8yPxuYcxPyDNWSrwZsHoyFtxh/z09yZL6P5/I1Ntjm4YMaTUSdWJZrBRZuyN+P864bIMZEnvJToEIiOC5Fg7ZDL7/F7c8FqRYOrPpgtZYELsZm5uzguZWDCj3kpiim59tev43mmwVkX4pZqt85yfRFIiGxKbOA42LAF4sI1wKLF+WY/5xu1oLB8UzPvFSSiCaV5/7wWtc+9UnjsqT5BtgxchOQE3xLY/Lh9ZfHv/StJo0iO6/OWMC8zOXfCPF2EuUI4HELwcReTNBVQ4JwLO5gnIQ5KzAvxhAFt4RmxT/uUWgB5IRiU43AMm2McK+f1uB01G+qhtg7yrpY7YRy3ktd5lisTdpJtpAvC84cQDtinu5i4Jk3mlSykVElupsSGpsE+8LsAh2iz9svoVK8MSyhar3EPa/kQWN7mCussZr1lLBgqTZOu6gSCRamww4qt6vEwQyvbHQa8VakSyiDVnsugleyEXrPRru640X4PaRFvY+Y3SaNXSU6+96qAzaJPzaqbb3XW2szEYV9Ea02p4z7RPsbdp/8uG0jUCmVuZHN0cmVhbQplbmRvYmoKNDkgMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAyOTE+PgpzdHJlYW0KeNptUctOxDAMvPMV/oEEO+9IVQ5IgMRtRW+IQ7tN98Ie9sTvYydtWQnURsmMPXY8gRsQIH8E0fCPcL4yeuV1OfanER5fCLLOwQQYVyZN0i5bGJePATEZpBCQqBbnGM8VyVnmnHCI6ArhgDR7pGlBsrXxTSNYcqvoOXW1v1zsdTFMWz3O8QmNmYoyMXOnKRdu2Ir5uTfhSyg7bIWoY5MkUs+8Zpav7dz3tXyOb/A8wg20zcnDt0zndMQIV3Ah7eAL3uH0x5p7lQrB62jdpjtgV/5jogox6pRSt5FWanexmHWyHO7mGmqGtXlyM6z4beScNx+oLjJOUcE3/1myuCIBceBOEdyuYK2hvU7qbyMeC2+O7Pt3Kop6xd2x3YPTww95c4KKCmVuZHN0cmVhbQplbmRvYmoKNTIgMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCA5OTg+PgpzdHJlYW0KeNrdWM2O00AMvvMU8wId7PnNSFUOSLASt4XeEIe2affCHpYLr489/0lbVNRWQuxutk0ytj/bnz1OxJtAAfSLwiv6A7F/pbMnOl5OPt+EDMFp8YvOVkEaZ8WrMG4oJz/EV/EsPmzE+08oggxOObE5CqO0NNqLlfJyCFZspm9rAIUAFujHAGwdwO4AoOnaNozfN5+jCjRSG6dYxwpJXMuAmMV5OYtvQxLTGMU+buYonZLK+QIzn81wdkaMUhI9rUNw0mVDezsGtocMdbT01YTeXA2SRHIXyICm/9qh+PJ05uLPlzOGCSj6dD8axcMBlDrS5/7EzB3McT6sW9hkDxEPgNsJcGcBg3uEbXJVgZF20EtXp4e4amVQZmGTuYfEdXSO7NKh/Tiss9dhREVLjjpFwuiydCT+MhOIoGadQqVd+iQhpfI11klcoe/38wdlsLaGT3sJeMKU6f6MaWbVIINWC9s1jJ37SoV4cK0g5JhyHHV3j+XideR7XFMpxKZG89baas2HA+Z0XJRADznvlB9jUiOJSc7WbwMeexF/1pik+AD4vCaK4rjymWNEPQwpdsws2zGrZxWLERIww6ggizJqu0toeQ36ZdxiNPQiGoOnkmhdlNVyMIjdet18KTiHE5y8kmHtsyzDYMLrqmN/KOAiwHwVjr2dLbZyoVCWq1OsLa+KkZyBTpBNdTkwp+TJooxAuyxGPhQFjComnCzboVfLelg1YY6u+qKKl/LNBnTuTJfEzK1lI6mJpZ5LdVoTdROxtQJJm+sdiA0mNy3os0+EH2Lk2BGcsvwW0/oY25azUgBcI4WVMWZ4rheeY6Y2VsKAl6npEnh2KMW/pFtnWzXdHOYIHGfASz6v5lBZlJ3LKjJfYmpdNdnWdiBiBriQseQfCo3UKRfNDOVJMcRe4grNWs20GiQd1RJbiaysoFMhk6Bepu1MuZkUuXQjSjY3+jjmYmmpvjPHvaeN2/z7zdvnxFDzA7edpfUK7hug0dQ8ti3f0EvndfDnPl9ZUM1c6sSuhqwv4pzfTrZV3ZW7RvG/K9dDdKvfN7ua4ELloy/U3ALvRmSjjfTG3oHIuwM15NJeueK70fOaGcLX3SzZPLjWzuYjLz1iWd4ErmKwpYdAUIuHieijv8zA2oXiAD4RNUxY97mdtfUFd65z4hGzxfl6mPF8obqn1oXEdK3/lMAdnEXK78fQQAM/2H+/1c7ba9I16bQ3lv1W/dVQbNFJWx8R/uf2u4DQa57PCa1wUqgjvP00lmmgjC5tSr6Oou1dkg6DzW9pnJVem/qaJp9eep/klNQaaR3NBsMw5Cfho1raeH73G8t5KHEKZW5kc3RyZWFtCmVuZG9iago1NSAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDEzNDk+PgpzdHJlYW0KeNrVWMuu3DYM3fcr/APjkpIs2YDhRYA2QHdpZ1d0cWfG002zSDb9/ZIiKUse32TSJIsg1/HowTd5RLn70GEH9A+75OgPuut7Gr2l5+/yfnPufv4Vu6mfoovd+U6TbuzD5Lvz7c8ZYHSAMQLiuoRA48sKGDzNBZ4DgLAgzICXAfDlBujXPJ9peMx7V6anrXe/zSXhC/FF+dGeYQTnXpaTSxNJepkWEpiZDRcRQkqc/KyMUMZu5JX1Ss+FyO/5t7zvy1/n37pfzt2HrvfTOHT/snWhT5C6912Iow3+6f7o3m2u6ZFcAb2Lnv73Ebvf3x5Mfjx03okHX+E856b8gEOdR15bhll9JqQ40RaP+U3P4pyu83zSPZkUl1NSl/m04CRuZLFwWxfyZkPO2vq0D4v5sUka39rtQx+d2s12SiJQfCKLjDuVxkeVdOdVaVk6JQ39tpUtvThFcj5A46Pw4CMmHedtU5nN5FcVM1xyipkY3beJ4T0+2qg1rObMhuU92bQYbQ/rRPyznWmzpuhLDs4BkLoxnU07MfuQcx6xE6yqrjetmVq0ZmDFgA3mqOOupjAB3oLRwl1UsjygWHEeUKwR+2kYJNg4xZrZ5g1FACrFffp8cYGJPKeZNmIPCVX6umqx3+z9IO0bSPXQT+PYis4VKiVXwleql0uT0jB7VVOsrL1EqXqmlczNJVtQTatdc/VrfdcUKULqvTN4ekKRUBSp9W9shjCajRlOGvUFjFgAZz4OWjFWDeyx7WEEt8eFIB7eJFXYXxR7BiavbfE/gWXoKfRjFea6WFxWgoyZK0VItzTogk9pflAsfF4xYaHlZmyEYVRcmqJiE9Qnq+7lgi2IwJiC81aJ7H7hY2gmI16rQUI40S9+3TR71YYTCj4arY+lAJSuhmidwVqH2tZo2u3L5L6cYnbmEy4c4BHBLF9DOMIruKgfmRU/ZEVJabRq2HK4hldxFEkDV5nGnnFgngFSxZEPFKnV8xDmTaocgsKSQZbbG15n6BXWyWVrrw0SnIKdj3zoh6YOmJ/z96JaHQeWDauXkhpdPnDpiF5YZ25RgP74XUruk/VkIox9ePC8mVsSDbwlMv965tSWjftTW8lLbr4S4SZlS2D08K5S1iWsD9SEhwlZ78s2psfjbuNf7LGJ9nTM/qyiKmdkId5lJle3NmS5Knz0/wdYJMA1MLgdMGg3pRE0sVtLg4fd1+fgZmueNv8ednd7/nVMY4XCXwqn/qjJ896V3sZGrMlRP1TVFya5m/jQYCiTZ0QRIBA97Q4kjsnu54xAlLSFFDXtgikBJWtNpRpcdGZLLe/3EZEt8YGx9fWbsrkOxerc7bVUEheTsMZy/7LmVRYalgeK8AyzlvPqsEgl+rWjsnkcmMpXeh90cwE8Gvmj3j3PWlhl1AB08vvydMdalDyWHHYPqOHn7UTY0zSnpGx9KrlMEhuQO/D0JFIKWYuUtXS/O9liMBqLmuVd8eAnivo7dPMOQ++m+Fo7v36ndn50O9HgRrVcjgDrikrbm6u8ThduaONDQyuAi/tr9cI1zqcusai+YDA8WMttdUj3LAcHffcB8be9HbgA/RDGH9gfzXWCLMjfPhoIW+vmLl/TuMllnOI6qK41nO3cLTnVc+A3BHmzaAeH1/dcTE/cMVwcegdDcXb+JvK6qlqibm5aOFNKV1gtnF5XSyvf0HsDGRVpzWmLSU9g3REu1B/dTpGsTT7oZ7cylA9vR7kYU+rHUXMR6dBi7n50zJPWt6bAWu0p7m/O8h1RIYXuFAO3qtIkHH6A2un/7qf/ABaTuOIKZW5kc3RyZWFtCmVuZG9iago2MCAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDU4MT4+CnN0cmVhbQp42rVVy27bMBC89yv4A2b3QVIkYOhQoA3QW1rfih4sS8olOSSX/H6GFKXasgz0kdpeUySlmZ19iObZsCF82TSCH5nTE2Z3sIer8dnYlIKaV8x2ybrgzZNxIc6TR/Pd3JtPB/PxC5tkU5BgDqNxotZpY3bS2Ji8OfQ/9kTCRJ7wcUTHQNQNRIq1Y2p/Hr4WCHZWXZCM4W3TMBDUJuaK4GKbMEQhOvnlwc+HSz+DWAnN7GidXXh6RuMYSryYHVOwofJkD8GxEHXDTLQEyDKkEqAV/xrYfLvbWHx52KCEi9xM+4WOh5FERoynK5p3oJOA+9yKMyeDkXwOgfjYE41KjFzg+qYPdSwMepZt6EGcrKZUsZEXv5/gAc06ABqWUouC0JrAjrPNKy7BFUdMY66RWy5sUkMqu6ZSo54yTpHjYL5DaJcyQaw4R8xpyhGLcQrjevFlg0nJBu9XdIs00MBycWbVEo+z+iUQEFa2cp6RCTz1V3G+aKh+aNntJw9ofCehKBdPvKIqQnMus6VcMpzpSNQXW3L9h1L/rYskJNtoXHdR/1+6KFqfZMVJfd+K7ufyLmEpZTd11tqPrYxq7pzglhdPqaHO/+qcDAXonNydBp3ay91sL/md9ppWkbh5P+uQmzrOyPGOgnXz+6qO4zWixKkJ0QJTiVbnCqSGelt2Wng/N1HLVO/NEOVxLnvVgYw09MWBMo6oQuem+Sj1ut8qARwQmqKvB0TA4aJuOSHq9NZhhhPE4/0ZGjREnKttdGuK+w9v6jCcBQplbmRzdHJlYW0KZW5kb2JqCjE1MCAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDUwOD4+CnN0cmVhbQp42l2UT2+jMBDF73wKH7taVWADdiJFSIBBymH/tGkP3RsBJ4u2MciQQ779wjynqooUpB8ez7w3GTss93pv+5mFv93QHszMTr3tnJmGq2sNO5pzbwMuWNe3syd6t5dmDMLyRzP+bC6GheVT8fan/P507dt/U2O7x2J47x5fX2ouWWdOCH25jYYJz3t9uE2zueztaWC7XcBY+LxknmZ3Yw95NxzNt/XbL9cZ19sze3gtD/TlcB3Hd3MxdmZRkGWUjkNbO3RmGpvWuMaeTbCLlidju3p5ssDY7st6orDteGr/No7CkyV8efNsJRGBBIiDYtAGlBDFfi0lSvyaBG1Biij1OTegFLQlkhKUg3JQSaS8Mg3ykRXRRoBqohxrSyEiaEnhKIeWFI4KqE7hqKhAcFRCWQpHWoPgSPtIOKqgLIWHOiaSVI9HNYjqcQ7vMgYpUAJCTkn1eAwPUoJ8pAL5SOogT3w9qs5TuJUFqABRB7mETqlBvgJ1kCt0UFIH+RZrKgIhp4KjLTqo4ChHBxUc5eiSgqMCHVRwVEK1ggcN1QoeNJQpeKju3uFqGVs/n/w+rffp5hUZ5DX2x5GPxnr6ZbiFgPSYxksIjJcoQZAnYhD+NkHNEQnSC/1ZzHqa1jvg4wpor84tZ5IuCjrt68Hsrfm4S8ZhXHfR7z++rhVMCmVuZHN0cmVhbQplbmRvYmoKMTUxIDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggNTA2Pj4Kc3RyZWFtCnjaXZRfi6MwFMXf/RR5nGEZahJNLBTBv9CF3dnZzrAwb1bTruxUJepDv/3qPWkZRlD4eW9yz7nmusn2+b5rJ7b5Zfv6YCZ2arvGmrGfbW3Y0ZzbzuOCNW09OaJnfakGb5P9qIaf1cWwzfeX7M/787eXua3/jVXXPP025/mjsk9vryVXrDEnZL9eB8OE431+uI6Tuey7U892O4+xzbKsHSd7ZQ9J0x/N4/ru2TbGtt2ZPbxlB3pzmIfhw1xMNzHfi2PajkNe3TdmHKra2Ko7G2/nL1fMduVyxZ7pmi/xQGLZ8VT/rSylB0v68uTxSsIHCRAHSVAECoiki4VEgYsp0BakiUK3Z0SkFaggigSoJEoQWxYQYZcQWlLUC6ElLUDQkoUgaMlzELTkLhNaCgmClhKkyDv3SxDV4xyqlQRpUADCnorqcQnVSoFcpga5TKrHA1dvSxSiZyoFpaCMSOGrqBzkKlDPuEbPFPWMbxHTPgg90/CQoGcaHhL0RcNDip5peMhcDB4yqNbwkEO1hoccyjQ8FDfvd1cl4nJLx8+dM347dbdTyguyy0t4kb7LRjz6ckiFgC2ZxEQJkchA+GyCmiMkbIkSBCMiArlMEioCCBXUYhFhz8D/LHudn3Xw73Nfz9YuU0h/B5rvdRTbztx/IEM/rKvo/g8+DRQTCmVuZHN0cmVhbQplbmRvYmoKMTU0IDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMTM+PgpzdHJlYW0KeNqr/08d8AMAXstIMQplbmRzdHJlYW0KZW5kb2JqCjE1NSAwIG9iago8PC9MZW5ndGgxIDE5Mzc5L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggOTM1ND4+CnN0cmVhbQp42s18CXRcR5VoVb3e1JK61fve/bpfL1J3a22pJVuS1VJrsyXb8q52Ymu3knjFWxyT2CEBEkzYDgGGCZAZSGYyHCY8OQkJxEkI2wnDP2T4h+FD+Pz5n58zwBzmzGGGH4YBt/699V63WrLsLD+TPyrrvVtV91Xdre69Ve/JhBJCqsndRCAt23c1txW2/HkHtFyB3+m5s6fFnm5hmhDqh/qfHDqxePTs/MXzUH+SkFrn4pE7Dh34Sfq9hJj+CyFpzS0LM/P0+MxjhGz8W8DP3gIN+l7dACHdBqhHbzl6+txHflgtQz1NiOHXR47PzZzW3v1bQgbdhGgeODpz7oTwSdMOQkYfAXzx2MzRhbOa8Rmof4sQtuXEyYUTG7LbjhMyVgf9XyAa1smuEC30XWKT0DKm3OlB0kaRC4LT4o9IiBluVK2SiUND8+TPCPkDE365rIO5H6bNIqEfxz4msCv8EYG83s85KMfIMcRnr7JaQpa7NA8Xf8C+s/wa1MPLryn1Eh75y+UNq9pfWFMvjfdD8tVV4yn1Mp5M0qJM9kwOFURx7Bli2jEm63btn5TbfXJ9YfqQeGnPpMxiM181AP9zc9KsLxyWSUEmeWnwMsggPz3QKNO0LE4fapRZWpwX5a9PyJr4/sv11JgfmhuSdUOTYVmIFXbeNBmWwr5Lk6I8MQFNuYJPlLsQ6ioUxCUFe2ZerocmtSbKLdjfgphfn5gUgZpLM6JsnJichhYR+4wIZRHKTvumC4WCT6apQkGSycTkQqHQKAtpEcbRxGaAMm1+YlLWSgOyThoAPgoynW6UNWkJ6BLnl7SzAyL2IMU+hQK8ysL00JwsJMPQmRcviZdggqUWbQyY3DE5PeGb2VmYlArhgijndk1Cnw9ZU+dvlLVpWZ9PXSZMkZQOqtKABBKXBmZkNntIpnNAhaxNNsr6tIikVufnntGQWRFHkHPTBUSZHuSkGtKX9dUkPzSQDJdlX5VerQujMgpNAQl54HtaHLokzaBeuLyID2Uqiz4gskQlaEeaGVSmqL7O43IUniK+FdYqH6pJc4YuVxsFULZPCheS4Ua5Nr3E2JA8PzPYKJvSgCiKck1+Cz4OgDRQkGuxthNqtVBrlM0wTB0XiQgSmIN5ZVN+Wrw0LcomEFqjXJce2z25pJkfLETl2gXpXKNsSY/tmBzbpTT6wtBu4+3W9BIx5/dMLpnNeZnODMjmFNosWPLAUg1eauEiUydoQohNTC6h8IDbgUugX5w2GZbgsRLsU/rxEVgK2FIATkaA/hFoXa2q6yhwiRCbBNLKy2TTZUop15UtTZYIG9o9KZulAXFIrgbjM0pgcAPiNEz/lMVCiYkMDFyaXrLqUvIHUr4IiMkOvNlSjbIjvUTx7gQ5492VXhLw7k4vafDuSS9p8e5NL+nw7ksv6fHuTy8Z8B5IL1XhvSEtleQu66ZBwpLYJNMDuEAa5WRFp7Pc+S6lM1XRGS93nlQ6g2ki16beAn8h4C8IdInAH97DwB/eI8Af3iXgD+9R4A/vMeAP73HgD+8J4A/v9cAf3tNpsYebaWMaprVMi3nQ7XSeqxKWXhpttSktN6bkRliFzbAARsTraFGa6ZLQI94Qw4fct5RVS51yc3JJSx1Dk+DIkMHWSslc292WFjs4vRnAo0PXTgKrc93JsZ04n+TRZHCT1LXURh3IXDsIAChen2BYFTNdjXJHusnV0yhnXw8VLHgO0DtBJ8QZE5vEEVz5IMvNly6NSCPgKiYhRIBnBXeQpdRhB5F2gYtyynWApgGvGeNoclU+tXCpSRLFnksw3obVKGKTMpasgRbAFOVpdBq5HZNPMFEQfU+wuOAtDKAjNYBPlji2NAxLOL92PU6jM1PiBstPz4P15WfmoZvlZ3wAT6MjW/vMDJAF7l0aBmVKMMMw8Ac3PguMt84kkuIyNeAlQAlasCztNaPCiMhRjBMB1wnFVa7MBbrfWJKDCK3auCoHqQdE1F3ukg28f1gawUlRez1l8SEzqoTJ7skmsQdCLlKvNopIV0kFuhjUNldGd0V565m1qikJbbu3gpJ8SVXTmAKsZbmk3k3gKJpQisNyXX5ywgchU+wpNC01UTss0L5VvTt9E6t6c+s+e6Mn+tNyV+pGEw6k5Q2pS0Ab2hcwdV1UUGiT3ARP5DnLaJslnaBZSrBYmmCdKaMOgt+BEFJCfBNGPPJ22S1ygS6qRwIvVGEh4YJK4xD41q5USQ7DUNuQCkuqJFROykyPANMOZYFDegFr2dYkt8N6Hr1O+2YYjtptcgfAW9JyJ9zGUG5DIGBxGGJpSVLjaTRheQzArenL4KwA2AYARWB7+jLlLRMA8JYdiDMEwE7EQWAX4iCwG3EQ2JN+ArxeP0B7AaIc2pd+giptkwApbQXEowjtRzwO3YR4HLoZ8Th0AOfMA3AQ50RgCudEYBrnRGAGcYYBmEUcBOYQB4F5xEFggdM1ANAhThdCi5wuhG7hdCF0K6cLods4XQgd5nQhdITThdBRkPHGsgKP8Zq8CcDjCtgH4AkUOq/loPYuCKMqzkkFRJxTHIeqOKfh4e7yqGd4jT9xVgHxidsVENHPwTgqwh0KiAjnFRAR3g24PeXx7uQ1jn6XAiL6BQVE9IvwpIpwtwIiwnsUEBHuAdze8nj38hpHf68CIvr7FBDR3w9Pqgj3KSAi3K+AiPCB9BNVGlZKVgdSsmFBFqIT50pxuBF0JpB62ImJsB+rJk4SJsang666Gh0RWlLWTLjNYbFL4UiHJatzUWe2w9IuhRk0ZxM0rnNY6iV6WZKK26R2xuifMY22OOvR0s8KjBVnmIZdka5ekiR2VqthV/9KoBq2V3v1bg1j+wC++kXcW24ECi4zF6kl9WNyfGIyVw1G4RqDVgcZ9/EamVJqhSdjYaZ3prI6KRIHQrKZNqfDcjni9UbwV5IkL/2sF67FOcwM6PIEm1z+PnsZxo4v6eYHcz6Co+3DvikGEN0OYC2piQl6R2pJRwZZvKNDGdZh10kP+oNhyR+Q2KTTb/M74RJw4FaXGJf/wM6wbxAvCZBYLhKgGoFuIRrgRkMPEUGwjzHKKba7JZuk1XtSURwvEk8kwnodp76905bNutqcLlssk2BnIk5rwNBe/FG7PmDx+oTfG0S7NaR/rXjrSwv91d6w03bHeZvD764ysr12J3PYrn7lG/9IuO5AUmwRdGcjfhIjHbk2m0KNQDRaQbNAQC0HgGv7mI5qteSAIslAIBALRBNhoEMP1BEnklcSaqYNavp4XJIcmbZsB8t2tHOYRfP3H/w9yvePz6fqmxtijz4WbKzr2NT410/S43sHbz8oedmAV7rcOGT/dMNn6iPFi20t3dEXQSr1sLPfw14kCdKSA4ujAiXCBSIwKrA7gTbtFNFq7WNAqmaKaDQBzXg8EYlFojq9N0Ucdj0ILBGXIjqdw+7MtHWCflxIMLbHgYMsNrDd5jqPxdK6YfiWrouLvY1Wk9dqrjNvm5x9ZPbAI4uFcXZJctgdVa7uw0Nnz7sMTpuzzqtP7Pr8qUOfvykBOkU5fgHkWEc8JJ1r4HLTUBSclgpCSXAWCyEWj8XtcgCiKasDuyFOJKZCfFZFYJYM/bv7RkbuO/jPKLJ/nth/U+HRR9mVAw/Pzj58QBHV1affd+jQ+4pJXAc4vx3mF0lzLn1j7fFzllA0HFW0F+XaC6vTh9uUqiOjAJIjTH+Da2IJyaDbvVLEV/zNz/H2c2o+Jbk8okJM2OsJfREvXyUleoxAj4805OLYwghd0FKNRjjALRxIczAkxUe8HVI0rNO7U7aVSe3lNaoS9NKPcf4fxzx+JGMIK2yzHPY6I79CWhQKnBE+N9rLB9l3SDPZlOuOU40W7JkJOoHpLuipjmg1Ou0CEEGnQDT+MTAZ7iECXDLNpFGKg13EDWg9uJBX2QlXVoU9gUFlOzv4igTVsVsjodkzc4/Nzj42N7fZbA67zdbsxtyRvr4jOX/OfRCpfoSel7w/lGy9M4/Ozj46U2/wmj0xg6v/WD/8MxruQVekyu+9IL8QSeSiqm9Y0GlZhXcAakMkaItJtpi6Ci2K2DrCFfJDZxRG6thsJOr3RIsvxj0+CSHaF/ewKxHf1eeRrl/9ist0AK//8A9eSaGBvAQ01BJbro6bkWJA67nRl0qjSuVRrj6v6IL+DMbwk/pcDHhCO7gAyoexKBWmNLA4AgKy4ie+uBTX6l0pZzzBxYnSBvFmy3PgMnlqNlQTt3uDtnpPoEOMe/yRHIitOWm1uKWg1RzM+Okj3EZv7rmtr8IOrSSU83MeBMoYOVheClZiibVrgJ/V6wDnC9NfoOU/61XEpT0D5h0uc/da2c5/yZ4D3xnPSWGryagBHrdoIIABi7SsqBiJxppiyN2KmizgyxO6eEKwVGrLZQPPnmHfjEX8fulRo9dU6zU+Kno9YsxrDhpe+Z8Gn4k9B9M/h1zSj/+xxkypuYZqi/O+CNCW90TNNcUlur3GXKbvQeA/QKK5sMfI1qUuQPyx+GrqEnQ1VRTv7GxQ8pp8uuLHQh43gOaAnh4JudkV0X31q16pykD/a3GPWxTdbMQr1RiLLfRxt8iPd/mafBnWpBlsFjUBnkldfuAd1eUHqy6iAT8Q1VUsOVhxTaxitUFEeXnyoZmZh/btw+vkPdnpnt6pjo6p3p7p7B8enZ5+dG6OX/NHc33H8vljfbmjeYUGlEUGZGEHGiCS6KgGJKQh6AvYAS1VjdJBxx0Qpx0hRzDgA1yrFNeDeZT9dMXaAl+NzpqHN/rwzV1dN2ceR1VJ3ldtMZcrZnv8cXald7G355be57h2wHKKspjx+zOhn5Xk0iXUgFyyZJhsyY00uJlWR7cYqFYHXkoDK4Wi67xAdHDT0UWi1wtTQO+K2/KgBvP93RtgiI7GdDQaqwJnoFGIBT3G0VWVs4bOJlYWKyAAY05llXVuYhmiCrg9rrg39stofiaeG4t7RGdNXW2tE9aYNLft3IAi+fwd23pdCU+oKeCJWnRuu/Hqf1O0oGjEH3XCCvU4zbU4T8yVqI1ZFh7cqyhn74MLFpdQZ7LUmU1am5F2cjUpKlN0tbzMHgBd1ZMMyeYyYQjzMRTFFohkYNZaukDKsUT1hw0NDZmGttbmDikGDtHNF7QS/JUMZFVM4RkA8O4AAbAVLbK7zDXmkNs+2px+NuAOpCDWiO03d2ZTfTpBYzA9G3E6I9af/nS/12Q1W6sbLkST3ygptmu2t23Kn95SZw759FQT2RD2N/v/dykeNYKOOSdE0BCNABpF06N3AhdsClaDf4xnMhinA1pckxnSJsWTaHuetR4RiE2UVoerFJBQZbBEXEHGNf/qiVZfxG0z14+3d+2Y2PfTgZPDfcdjgYjLXOM9EOsbGhnfu9g+cnbQGE25Ay6pJhxsizVmasUv9R1ojYdcQZdU5ZCa46m0ydy8I983lQE+gqCY3aATyPJzQRS6cAD9d2nVANFOYpekqOpIMJCXnIgaIcOsLRLxfTbu90c/i3KjV8B3eL2hq7/lwacGFw9R/BbkyGfBr4ZwLnBYPPqA454iFbEPHMaK01J8RjlWVMQOtlccvrBjx8XhqN8dTY40pMYag172HASJT+66e3T07l30Np72f7JlrL5+rIXe5lPyCOT3fvYCLDGgwQHWR7eA51yJg3z1uRMJDXcPYGwCEBEHh64oq+TK52K631WJVkvA8DttvcMSNHz3GUPQwp6PuGtNV5+32anNygaNZl/Ybism6E+sdpy7DqT7MMzdQLY+HQvUCASS8jE5ABscG2yGuKsShFDJh/tyTsiHIckhF9RetaOQqwUqG0g9WEwCc6wSnXpwDcJ69LqyKt3C2Qbh27qg1SpWffgjQL81qPu20OCxi7pP3GMI2mwBw7sf1IXt7IWYv6r66hWLndptNF98DhiyW9hgdZU/5rAWe2iX1QHmYS1+j75odXC5QhLMhrhcAzmvzQhUg2QZXRFstB62VKBXvVBatCqJLlcnVy8bqv5BxO2R/tba4PI75EcdAXeUHbUU/47bEWXU7nZ5Jf+//iYY9Sp+VoI12MTCkG4myAdzRhfsJavAjTAQqguE6uHrUIeBMTSmx2R5qiRaZVsZqERAKjkWj2EBCvIPQsbNNPs4gmKkqxAKhZzd74csJ+GPR0RMeuPRmGFVwF0V9Fw8Y+M7Ab6sM6wGN6lh6tnTPHSiP3c837I7EPF+YOfO/tzOHf0sDMZcgIzAG2gYuTAxcXFE8lGINfmp0dHp6dHRKS6DfpDBOHsVczFyKGf0wE7PqMpAYZExJ8YVAdwQGteKHAJoYj5o5fuKRY64qhfYCwQAqg8kpDDmcrFYXGGvHIjW5KTAprWCP/qQwtUef2k/7t7b3Aqs9QOLLKwwlfDreLJ/GrX8g2BjMY+8IY/crkDH9J9Axwkyr3AUW2+ziC42VLlb9OWkNXilGLNYgVXImWCSBInHIMRGV7a9oLOy84XdJYTRthLLijLpxVu8jjq7rcqYqBnbszff6tY5rLWeQNfN7VvP5PLnxlm4I+0MV5m1WsOBsdGpGsFsED3upGf04rYdF0bKtvsqt90Hr7XdAGqLK45HkvXtN7wWaR0bDsFcaMWLKu47bcSvwl7kk6uN+Fuwy717xYgVWYRBxyLIYlFhLQ7NFBKlC/yjBC1ZgE2ejqstpGwyCN9j+GAfVULUAApsAxdLT1SgFXLmcDicCMcd8Xg0EubbQNgWKOFE8T52/ZoENaoPd4ANMDHqLn6lZm+2ocmntdY5gn7/wZbddw2Ons0PnBkufsRBdZotzRBXuvNmi1AVtPucLnH43Vv33jM0en7koaP6ZE8p7lAZ9J0kHxqTfcBh0KBnOh0/53DC/gWPtDSgXZe6i/aVrF2nJ3oduWCgev31kcHaVTxohn6QyWLFEwoWqBq/9kiSBrsEW7qoVKX3gRwc5R36msCeUc+9FCuIS1T034QbgZtwJWcRyi7OxDr9dm21zl3HzidczSG3O1T8HPfXswg3jR0MhtyQV+gUPXexLtBzinSS9+dMCRCdhwr6atCfoPqrJCxaBrs5SI5B3QYwXFB4FVUz5EA5XfCg86ovISMeCACUvz5qIedMpwlJd6azbS0wfTIek+pjxsoNNiZfndmVdKzjdazeGfnU6eCtzlZBF7AYqzQ3xbZsdhYyw6cG+t81lJn0RbwP7NmTz+/eneduPH/+jN3oiOmrnC6BSt3ZllCbshqSweo1Lh3P70FYVWArEbLtqRClGqoKx0X4EoaWKTx1CZWSZF/OoaXKccIiR2GViUKEhGPwoyYK5R0g58Ryjf+mz42jelPZrr6S0/btyrDwHYeXCdcr6ezLZxSY8RTrZ9HM8jJolJCn2Mskwr8NEkDbvyjvVS3AS5j056pEl0GvUbIe5MeiBCdBcK3kPOW2srMrfAXijsT3kEpanNCvDjuW0grWu5gl4fRan2wtkf4jm8cpuT/15T0eT8T+fOOtK1QXP/yyLWZzOz74PCnRSb4JdJbORZw3OBf5puT1RPhvebirn1T0JhTAvjvInbnqRohLdEsbrNXNikt34rrVThn0OkGrdY1BSlfpy70EGxFFN8U9Q2gFI+fGFugjuFvEOFDqUpd0B2mPKT98SV9Xy9fReZsLU8PaVYpfYwAXJNeB7vWtYBXMz9rropljycEVW7aBTCLkNrRlrnuUho27Z0hsUftsVVhzcYt4XTMnUyUzf0t2/u1tyFpT18aBMpv72q/DIefKEm1XYxWsaX7m0aPQ6ygdfIQqDz58yCJB97RY0Vr4yhs9EMmP3jU2fufo6J3jY3eNnmsYSiaHGpTrsxeHhy+i8xi5ONG6NZnc2to6nkyOt6r5YBfkg2GeD0Je4Ya8wliZV6ykvC41p0DCUNoeWs4rCPZekzRWIuZC5cSxslMVhEfJK96R7PFbPHtcQA1pVmWPSrwp7Q/+UuFfFQgFgfh4RVAqhWvEE6pIk8bUiFORdrnW5GarEVfSroo+fKwcka5Nu2Kr0661ESi7XtoVKWddrbv9QthdTrtckHY9hDL5jl/Nu6I+V7C4tSLQ8LVJP8fzrr8Yk60Tk08FMHnY4oM7LtQCb8zZ0A+Xl2o5O1F2WGAEhJ5Ajz+9FkHZfqgIvIcQzbSyoktpi0/tx3VNIIbjUuFC5emKsq5FEgL/Hy1tdMsHIzrHtfZDzzSITrNNcNR4W0Ils3HtbYUg7AqFIEEU+xv/aWVJ1zakUA4e2GO8AHLIkgMK2dHrHOiExkqvpgJaoD6yFg10LoDOK5AKuaq0lEhJ/MVVFlMMJcPg5z3lcztX+VQLGEMXUDrxgUXi8ZrMDluwv2lbR9fGzR2dhbbMoUCtzWR1mqwbouP+VCI72rbxppaBk9Epq9daZQsFha5A0Fwn9ne2jCTisTq7y1xtcno7nT5ztVkcyLZujqdbkW8zXI6wS6ShnJPCXkm4VwtBiEF+iU6Ah6LSAU05J0UsSC+pjup1FyrRSQUy5KSr8AADUPUMnPcKlhrAGki9jaekUQxgUadj/Uy0IlNV3vrRHa7u2KY9TZiMNmFEHkFoxGkzmGqq3+Vz+mIde6lddLtCOdR3DqHibxw2jZbbP/hyI3PB6tukcGblh1KucurI3ThvZPTeisZCrkZ5ywXxRj2sUikuvypWkkio0V9Gbj927CzPmWGvEfEyF2QfR86fP1LkeUhvd3cvQHyPsLzMfg701JNdT0fxfEhbypTcRAuWpiUX9DrIiCFPYLhulJiITVrNvbDt0d5bbocdD1BYTxKxhMVucakvvpTTrEQcUiidnp8WlU+JeA7lcvHDrRfDmk/rQlZDxLJnhyVisIZ0n9aEffaA7sj2uoTDZdh6WBd0Ahu+KlNx3uqgLPraa1FGHVb6meoaT8xmK/70RzGr7QdUtNm4nS0X6Y+BryjZkKuCQKrn71MUzmoFbjjl/I/XK3K/aDK2Ovcrn3onVh8fYfpHfxx3BeznzlR5TI64+YMfrY25A/Z3n7QF3GHTpY9ut3ui3k98oqZWdNitX3yizu6RPJ/+lC/scFoee0Kxhy5uD23kXTmjlwpa3JmUTlKipc2GqgJY3+vtSaIldZT2MeuhKdppI62xeDRaH1O1s3YjEmTKRmTNGSg2WhTDeuBMZKS0BdFLCcdIvv1Y+0Qaba2zo32Damv77rm9ukrdfAimqt4txv7WfV00iua3TPo6ezdQSHMgh8ez0b2476BZIE8CN/bnSi7P7i+/79nE3/f41PfhnCE/fx1Op/DVeICO18GCrvPVeZ12QDTF8X24syLPQbeWrQhkf3/Hpk137N7Nr7nNm3P4a9z/hcOHv7BfuZ47f/bsefzlMQsXbpifV9fnYhC7wZDwZQqkghcE5W1P6RjXSRyxmHqMu/J2TvEonWAzZDmCZ9abzBaPZDF9yuJlV/D9Jo8Or8Sr4q46v2F/Fc7ZDJd/B74bSFMuBVOBJ9NcKB0vIPcaTcV7ePBlCSnZrlPfViivH8FeS0yXaSgLRK/P0FfAbxW/5A1aX4mlcslAt9vqd8bs9vh808B8tr/z4vePoe8SPR7br+p3RBoHEqI74jCH7PGmrtlNve/pvo/7j9foz0E27eTCmGwCm20E56sVtHoBnK9AtQKEKHTC7E6wSt0BcMP21a4uU8aHyAa5HQQ+qtXc+CnFgbeTdmAuBpaq7EBWXlWp7zjUl1CV/HeWXiAoq5dO7WkaODcRHfXFIm67K9Ue6pL6m+xBwWtxeo01D30HXTttC4ru99Ov9cx0bj660Wq2R9z15nCoO57tMVBDyGVy1v4VCirsc7sfRJvdD5fT/F11CLUX4l/CaGGN4ks4JeFYedcRDCivrKWovpxtlN4xdShqpMoyzIQzHWw3EJTEqFP8ozNupj22kCeSLF75PE0jCe9BS3qP5HZa6b1uWIZ//RL/tgl0dBXoyZLhXD5DBT1+JSRQQUPBotBj3Ak6AOnrBQyT2gOlz2AqPmfIko5oZzQG2cJaWa8n7JK7zJY/u5D0mCntOdw7fmFzYpe3pi7ksfqSYsNoakvGFfVYHdWJMA1pwi4aRpH/m8220Ut/1Htbf/5k3u0wRuusAZs3notlB2tqqgzJgFHzbw4fcvyxalPJT9A/shf4HiSby4AnhVUKBgRsMWFR/XZl5QuN1duE+lVvZtUEWHXxyI5+zS5h30Ku77bc0JGNmftO11R7IwF332FPWy40MNDc0t/fQr/Td3gT/Nt618jmL38mLPgCzrDeenMuVfzccHv7MP5yv9Kz/Adm4X5F+aaAHbjGndhjK2+FaPmTrbBqxPQfE7ri7/VBqyem+1XxNW6sN7MrYW+t6eqzVrBTUy0topSUb7R6QFB1MJ+XxCEQ9OY2emvQJrdUHtfyfYN9ZfcFhCQSPl+iLdHamPLFfbFUqrRnKMuqc5Wr1cd1aioCAlsltp929B3O5Q73zUiNG+d6euY2NEtyZ2eyobOzoWVgoAV/6Y5djRumu7qmN0z32AebOm/OZm/ubOu3/a+O+oaObH19R1HsTqa6u1PJbvW9Nwjyj+y7Jb1b+dGVrmLLzqbwjbx/rPTFWaXeG+or9F7hIztXdkGrGNi7VuPt3BBQ582ge/bdazSuGMIqvTOC1++xOr6fH1fPHzRU/cCQZ4Kw9QFdOPCw2QE7GOVwtbK9kLPymBeqC7gdMFBtB8Y8q5IMlj4clNia+kIoFKgNrL7Q+0IBC0JwKd6xAoMA/cu3k5+QkxB5/TmPhb+3BOrh35zivBLJCL5ec6p2iUuGC0tftgfHTyLZgNNbZ9P4HRZLdU1tMO1It5mH222OulodM3uqLXptXZ1dcnRmFH1G4fIxsNExsp08kDP2U0OVDwJuKSNqsJh1kKMK/PufxWpaVWUfM9XVCnq9YarGyAyG0BjuCvhGL4ENvJMY9Les86CKWchFxmG1jW8f375tK0y8ZXiwr3fjhva2aDgakxxSNGzVB1JUX9oIrPi3SlDdNawA2VKKWAkqQ+jhSRYPNsP+0NVvF3x2d4DWPWIX/HYXAFFsziq9ObXX/AW11yxh83PBR4L06cdDLqf/rM0ddFdpDp61u0Jug+YgtvGOk0rH/pNKx37e8fjj/FtXSl4gl8BsPDln6StU9c07mhJ+hppdYzqFFYNZZSNt5Hd0Pz1GaklQ/a51D454gH/XupV/11rdrg6ojofD7YE49TgGq8d/F1EONsNE/RtP9S83p8w9/weW7y8R/ptnP/5RvP9w5APfKkaKP9C2aB4GXD1aI1GfU/4WVLurGFl+Wtuy8teiyg9rZaPgIX6N3/kuT/CWi8RI3sEf9hEyxk6hv7pO//f4efCNx+h5fZy3TF8b0PfMDeh7+dq5qe3/nR5Wv3pOpOONPCdkFDz292+OBva76/P4/+OH3aTy8a+knn35xrywPW+ednYS91jX6XvxP86e+Ph/QYLCl/EblHX6duP3G29x3OOwU3wndXSc9DPh+nPeiB42+B9LK+yXg+yOG8y/Bc9c1/z8mr87e3tltGHFlqjp9e1K+FOFLrCD/jc1z6F3VvdvxDZKNkAv35gX+nPieVO6/TT/nw+uP/fYm5PdW/mBcHyN/6C/IOa3a272oWvHBx3X0yNEy9ykmRnBvr9F9rM82cii4CM3kB42Dr/R/1x+/G1ZyxYyTPEvaCpl8RTkxL8nG+kDb3iYNvjdRI6QP4HyP95aoS30nlXlG2sLM76pMsq+uKr8ulQE0+uWbWq5sE75vvB9jfU6ZffbVD6n+Zw2qf3omvLb6xVdclU58ibLF/XuirLzhuWHb60YBg1yZanKriqPvbliTBqfryzV7nKJvuFyjpc/XVtqolAeuE75729PqZ2F8i+ms2vKv6xfzCfXlK+92VIXL5fzdf/++sViLJdxy/str1jnrV+yBW3nbLLdaz/9jpWXHEwtTzpeeaPFiV/KETZEboHd2ieIDnZsSdJNPgge6v5aJ/41Av+Pfg5BmKEaPPi28pCDMCVWqCkwIwYaVWGBtNG0CmuInx5UYS3x0vMqrIP2B1XYRNqpTPLkODlB7iAnya1kEag5TUTwky2kFYpIdkPLAtx3kDPQP0cOk1Nkhhwj89A2Ac8cJ7dB/xx/qh9wTgP+cWg/BfV6PtppGP0U7C6boSzCGIhxhsySJnjqODkKrcp4J2Gc20kjYM8A3hHAPAbQ7by3eZ35h+F+FNqOAO0NJA3z3a6OLpKdMNYp+D1JzsIVaR2GuY5xKrfx54An0X/tqGIA6Lp2rgF4+gjcM9Dbwks3cH+IDEFb9zr4jeUn1pNbqW8vp/AU9CNtYsXoNxqxJFNFoqcACzV3AtpOwfOnuESauA4WoX87cI6nF2PPkJd2Ti5R+uGCTJX/ZOHEEtEPPDmSCQkkieDTGw1xg9UgGJTaoK5F59fxmnHgiunrVV/XfB0MpwrqtQNXSI4XXhfI4FKU3r9jUs7dP7kkzA8uxbH2NcPdYGa5++d2TyJKAX6e7jHUG+wGoSb5DF1+n6z50BIjg09o53VkcPD/Aq+a56gKZW5kc3RyZWFtCmVuZG9iagoxNTggMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAxMz4+CnN0cmVhbQp42qv/T2XwAAAVq1EQCmVuZHN0cmVhbQplbmRvYmoKMTU5IDAgb2JqCjw8L0xlbmd0aDEgMTg1MzkvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCA5MDg4Pj4Kc3RyZWFtCnja3XsJeBvHeejM7GIXWCzugwdIEeAC4AGANwBeokCAh0hQJCXqICTxgERKsu7I8iE5kR3LiS3meEn6mjqNY8dHm+tru5Tj2i9WE39u4hyfGyd5uQ+neU0df+nz95I2dyLw/TMLgCB12HKdvH4PI2JnZv+d+e9jFkIYIWREdyEOtUxMNbdNlz8YhZlL8De//9bT3u5PEBEhXAXj+w+cPHjs1oU7z8L4kwiZ3AePnjnw7Pc/eDdC5ucRqps/tJhdwF/I/hNCsTDAxw7BhPgXwknoLsDYf+jY6dvP98ufhvF9CBkeOXpif7bipN+JUALgdeXHsref5F4yTyI0OADw3uPZY4u33zsBsIPwPNl38tTiya7Y+AmEhr8A9x9FPPHi9yAd3Fsi0zCT1q54FrXhZhjTW+zjRcgCF5wfoskDsOIzCP2ecC+vCAjxD+FmL8J/Ru/h35FL7BEOvdqnF1on6qTw5F8IrLPSyT+U+yp5buVXMDau/EobF+DQ8ZVO8mOY/21+/u6V1jXjwno/R/9nzXrauLieisJeFe2YHsx4vemnkHlrWhWmdk+rHR61PjN/wLu0Y1olgez/0CM92r9f2efx+VSUUVFKGbgIPEjNJyMqDqve+QMRlYS9C171mUmVD+6+WI+l1OD+QVUYnPapXCCzbc+0T/F5lqa96uQkTCUyHq/aSXudmYx3WYPOLqj1MJUfedUWer+FQj4zOe0FbJayXlWanJ6HGS+9J9FejPZi8575TCbjUXEok1FUNDm9mMlEVC7shXX4QBYw06Ump1WdklQFJQl0ZFQ8H1H5sAJ4eReWdfuSXnqHYuzRMKDfKjc/uF/lGn1wM+Vd8i7BBsstugAQuXV6ftKT3ZaZVjK+jFdNTE3DPQ8lLb9/RNWFVTEVuoiIxikBhkpSAY4ryaxK9h1Q8X7AQtU1RlQx7KWoGlP7n+LRPi9dQU3MZyjI/ABDVR++KBpRajDZ6Cvy3hBeKwtJWwWHAIUU0D3vHVxSslQujF/IQ3mqej2AZAFLkI6SHdC2MF7jcdUPTyHPKmmlD8lhRtBFo8SBsD2KL9Poi6im8DIhg+pCdiCimsMA6PWqcmqUPg4dJZlRTXS0DUYmGEVUCyxjZSzxAgf2w76qOTXvXZr3qmZgWkS1htPbp5f5hYGMXzUtKrdHVFs4vXU6PaVNenww72Dz9vAysqR2TC9bLCkVZ5OqJUR1FjQ5uSzTLxN8qdgNkuACk9PLlHlAbXIJ5Eu3bfQp8Fih79Hu00fAFOhMBigZBvyHYXatqK4hwGWEHApwK6WivosYYyYrRxgtIzK4fVq1KEnvoGoE5ZMUULikdx62f8Jmw8iMksml+WW7EFIvhDy1wCYn0OYIRVRXeBnTqxv4TK9l4WWOXsvDyzy9VoSXdfRaGV4W6NUTXhbptSq8rKfX6vCygV4bwkqB76owDxxWvE0qnqEGElEbS266izffpN0MldwMFm+e0m5uCCPVFHod9NUAfRsALy/QR68+oI9ea4E+elWAPnr1A330GgD66DUI9NFrHdBHr/VAH72Gw95epqaRMGxrm/emQLbzKSZKML0w1dWmsBoJqRGwwmYwgGHvNaSoZDsV6hGvC+Gh1LcURYvdanPjsg67BqfBkVECW0s5c+XttrA3yvBtBzg8eOUmYJ1X3ZzOI/cnWTQZ6FM6l9uwixLXAQwAjK+OMFhFtjOiRsNNZb0RNfZqoKDB+wE8DjJB7oC3yTtMLR94ObK0NKwMg6uYhhABnhXcQQxjlxNY2gkuyq1aAYwHrxlgYKohFVpcalK83t4lWK9rLYi3SVtL5WEGIL3qPHUaia3TjxMv5/U8ToJcZSZJHakefLLCoJUhMOHUenucp85MixskNb8A2pfKLsBtksp6oD9PHdn6Z7KAFrh3ZQiEqcAOQ0AfXNgusN5VNlE0l8mDlwAh6ECzdFesCitSigIMCfie1Fzl6l4g++4CH7wwqwvm+aD0Aot6irdUPbs/pAzTTan0eovso8TkOYy2Tzd5eyHkUuzzk16KV0EEQgBGI6XRXRPe1dQ6LymF6vbGEkxSBVHN0xRgPckF8faBo2iiXBxSranpSQ+ETG9vpmm5CTvBQDetubvNM7nmbuKqz17vif6w2hm63obJsNoVWgLcqH4BUdcEBYE2qU3wRIqRTHWzIBOqlgoYSxPYmbbqAPgdCCEFwBtQ4uE3Sm8pFdRF9SrghUo0xJfJ4zgIvrUzVODDEIy6Qj4lz4k8JUWih4Fol2bgkF6ALTua1A6w583XmB+B5bDToUahPxpW43BJU74NAoO9QxBLC5waC1MVVtPQ3RK+CM4KOuPQwbQzEb6I2cwkdNjMVgozCJ1tFIZ2pigM7WynMLSzI/w4eL1+6O2EHma9XeHHsTY3DT1tLkPhMO3tpnCst4fCsd5eCsd6M3TPFHRm6Z60M0f3pJ15uiftZCnMEHT2URja2U9haGeBwtDOIsMrCb0DDC/aO8jwor1DDC/au4nhRXuHGV60d4ThRXtHGV60dwx43F0U4HE2Uvuge0LrboLuScp0NkrA6E0QRvMwp7QuhbmZweA8zGl4uKe46i1sxJ64VevSJ27TuhT8dlgnD3BG61KAs1qXAtwBsL3F9d7MRgz8LVqXgp/TuhT8TngyD3CX1qUAb9W6FOBugN1YXO88GzHwe7QuBX+b1qXgb4cn8wD3al0KcJ/WpQAXwo8beFJIVpMhVb+ocv7J2wtxOAIy41A9VGJeqMeMyI18SHpyQ5lVFhDXErK3+9pcNqfiq43aYkIZdseitg7FR2A6VoeDgstWr+CLipIbVzoIwR8mvC63r0KHP8QRkssSnlxSLi8pCrlVx5PLH+MwT3bqLt/FE7IL+pc/TmvLLYDBBaJHJuRIWEEfytIw4UJjAR8R3aGYoNQGYc9Ye5vbZbtgM5ls7A++8fO0n+tAeOUOMrbyZfJhJKPgsrAwkPDAwhjtomXpHIEenoCujIwBTnSFlgU0QILRKF3T5XIKygl3mbPe5SRjDrtkdwTgD9iBqldWyGHyGVSBqlBDIliFec4CK5FRxAPWPD6AOM6ZJpgh66yrdSg6sSLkpwvWBuvqfCK7RjvimOJehgM+jhy2y5KFT+eeHtU7zGZQdL3eDRNYzI1j9zu9vMlqNDz5pNMscwJH3u40Gi6/5Qd4J2IymgWk9oKMnKgaBVE00eYEjPAo3OF1HL+IgP0zQLUzLWCdDs1oTNywYUNwQ6DOB3iIgB1yU/R8eY762uhQjAUVxdUei0VJLNoBfVs7sY6d2Z37D8pebNg+19Hi7+/+4Q9jg81TO1IvvYwXd2/el7WZyF0m297J6HbHlzf9Dg9syrUMDAwlcz+jMm2BSv4o+RxqQC0J0DDMYcSdQxzBHHkz4KibQzpdVRpQ5ucQz1fzY8G62qACuFSGkMtJOVcXVGoFweV0u9vb4sDAMjedpywNguAYR8lR0WDW6yfntp5Pj52fnJvQG8wG0Vx3Kjb38Nzsh7OdR0LkTqvBaNRFxy7sylxId+hkvdGqr1T2PHbT4l/NeKsRlTPl60PAVyuqROFEA+MjjykjdZjjCoy02RCyVdoqyt0AaI4JoEfITdlXwk475R9jIP7e+f7+8/MrmLIQrRy/te3I1q9/nVyae2h+/4MzGusu3/nw3VvPT1z+FPCL4mAAHLyoORG+vkTZGUuN3+fXJOq/ikQVn6vQsfnwb6iRvJfJ8gQzmIvYx64/xOM9dtlk1dABq7L+nn5RCaI8TgLg5KHaD2PCYbIId/gZHeZ5ZxrU38VRdDyoQgF8BLG8oF+r2zuL5uvDv6SbPo69bPN/tpnMFKWj5JLNJNt+b6U7f43eosgUdOgO8hxqQX2JnjrM60DXCbUL4ZyIBaTjBd0i4IDngEWgSzyP5gCZasahFtSkBEFV6vRUo9yuK3SHobdGyWLxKEUVMG0nh22WyPGuA4/Nzj52ILq/zmwzSvr09h33jo3duyO0q/ZBk91u+gwGE/i5TaqpBSAArSw3WE12XcP4hR07LoyXu56jbqrAx1PAxxrUlAjJHAF0Cy5kUdCREicCiNegDY6A4gjkjdUmaPzzFTp5P+ijHZK1YbvJZM8dhovZZjeb7Pj9DhMw1Hz5bhibcGPumya7zUzO0VHuJVxpsq/K9izgVIX8CV+5RBDBozy4bOJM4yIuVcgTqHPpxDKGiebWcIlE28owQ+OIxW4STXxuymaUrTbZqsd/Z5XJJat8+S6LTeBJ8vILRqvVSM6brcbLT5MO2crsjsr3yyBfCxBdk6ii2p4XJVhdXpTBYLCWB73yr5Ge29VESgQHjuvLO+/PZu/fqX0nBu+YmLhjUPv+9WMzM48dPPTY3r2PHdp1YQwcgfaNirbfkPep4KkEzAN3eET1ioCaU37QtA+PuVzAlWpXlacCYO1KUITQVLB/pYQn7faCD8Ufnm5tnY6/oEWsV7o3b+5+4QVyqX1PV9dsLPergqbn/nr7pr7x3I9W8QGLgHjchmKJ9lpwlZjFHPAAIDYdXgQ952ZKI09DQ0NbQ1trc1QJgtaU0wDEdL2Osiu4BjlfG8NYdIP+u8u4PqIBkKM8b9ZLYlXteOxFq8nsBLM0d+1uT8XCnRhbbF9Rev1b+l4OW3R6Uc9bN08MdWmxgeLfujOWyNptW7v72iQc5uoHwl1pSg1GfpAvAflGKSWI4xHPoXOMvfjNQAWZA4lXpVk0oP6tWkd1Loo6lGCkNkj13x2sY/YIvh+kTF1rXRNZb8DUgkEPyjYQJov/eaJDdsiyNH7L5rnmsZ7ErljXwdTGI16LU5ZEz+7Wkb3T24Z3d/XclJJa2iWz7JR2DsRDXX6Ho2lLT3Rbc0PQJhsdore+v7O7r9IV3ppsn2rRbKYWZNMNsoEMKbGBMp+DMEEFoWkIwLiRU1H8eYNxlihG3rH4SANw7QVqrC8wf/x9sBKTyXL5g4ybi1YTMw1qnyu/JkeYz4C9wDBpEAB2lXg4cBRgHKvGqdlHwT8UDIPZ527b0O2bR24fsllke2wmFp+JW6mTMOX2jZwdGjo7gh9kHnlf52w8PttJRwwHBei9jfwDKke1iRonYX4LXARDpeAiylFZXR3PbAHUDguaj8hLzeEAUZFFO5f7JW81GCx87lec3egy/PwVnUVP/sFmFPWX7zYYJQN5iyCZrO7Lz5Ckwcj23gDc/Sj5NPKjtkQzzRp8lRIH+QNkO+CrQI8gnVzrrPxIcdX5g/kgJHLMBDiOIcRpCLkpRmUxdmnn3m8nP+AshjLxb/7G4DJYYOCSJSv32Y8aHJCRfeRZvZt82mo2Xb7LIDnwJ3I7HIDnXYJgtkmGy5/FjzoxNhpyM6TXwXRj5Q+kF3JFhcpL8Vba9DrqUjlcgqS/0e+nviyQV10NOcgPHdwqw6j0nCJHoqJDthi+/S2DRbaIP/pfdCR965tGiJTijyKS3gzKE8h9H5CRJNyG2/SSbJdz38N+k8WoN+b+ifqSCNifTIzgxsPo0N+Dk9fxeDStlk9OJ6oFUNyydMEKa9IiTTDm8oh6Er7196nAGRBz0dV4LJNwVkP6VB2uDgUUGimCgYC+NFJEo2sDLqWQxLQEqeC68e9ZLl+x0JM6srHvSH/vQoXN9MBUc/NUR8dUc9NUFK9A2Oqj2pmK9A2dHRs7M9Dd3AcRrzme7e2ej8fmenuzcaB1AmiNkH/J01pRoLWW0goEuCkp3BylqpTWakbr+vvUnPNAmrVdQWsgENRo1fw/aJjLuSY8A8n29bTec3TjxiPJruyGQgnj2dfdzGiNbm9qnooS48CZsfQdQ13NSZpekI8xo/xOa29O6cz29M7FovOMWGYfIFv8Isg2wnzrVfJr6lFrShNseCyCwgHwGfncwp0vVIJ1wTVZEDRNC0vkh/dsbbUYJZPeJFtaq+J7OtoyXf6QS7TpZVE2t2xvHzm1KXE6TYwuv8to1+tNgmjonO/unY/LRt4sihbZVlc1eHZs5MxmLc5puvnja+qm+1V00/2G6qbtOrq5vzd5pA90s2ehskQ34Zv82Ga6PE2FNNSUANrSZwd7mnEA8vrRWLa3Zz4en+8BBhTpxSsgLy9URJ2JKMxAPo3PsXewOrRIPScTFNM+bg7iezU35vP5Gnz1blpR+FgeCwl1QUian1ibFZVBCu6LQmoEZiPn3t66p69lrMwoSVbJm41tuTXZf3Rj701JnHtxvxnv0LWl67HN1jsXr68xWCWjVNeWvG182x39nUdHPzmZ1kdSCuAIbMTbyT8D1gfS6gaQTgAJIhIFdE6PRZGVce40B8USgliIUBnVOBcBKSkFOJiG+0DvYskTGlQmQaNdA6r3K36Im4pB9ITsgsulad8V0bNdc+KFxP1HykmjzWY8SaU0Ilut8sjIxqoWq2QwuU3kE42Bg1ZZtuayLM4+ZDOaLAc3DdocslUnMHl0kmqQRxj1opHEUH0lEXQ2QJOMilDbABk6HZNCTVoPomGKVk1Fw1xCBRqLQFEb6Y30RNthiVAwEAkatMBTiMQ0c2Flq5a7vAZnSGRb/5tGlC1xXjTwgmBz9cUyixVHewZPJBInBjbdBK7xkV2trbviMfodwys2c25i/ES3vcoiGiSBEw3lizv7Yhs1VdwUTlA3Gc1u3DgfLWgiRhPw9VOwOwVFEo1ezEoRZk0Y83M6RvpqLaKg2gCYjlCkTHNxGsq2Kzweft80lUVfsjHdVPRx822Ee1Mm969MDJ7+rfWpOm1APsr82/dCcbSygvphu/9OHoIcC3bHIkjoOZg1LGP81MqK2h6iuO+Ar1cAdx+tWbxlepFH9PiDeW8arfIeApyzwmt5MFWUOnGdbw7kbUcsw6+4DCbDD9IFZLHPIBvtxi9/JwQD408Tf1GCZ+dvJYdRNv7dy5r/BVzQewGXwpmV+zpnVu8tPbPSlrs8rcmCS0Iu04nO/H20maVXWsRyU4PSzelFgdPpytKQ6WiuL622wt1KRCcpiAAgRBBKIBKVa+YRdZyFmxnN3DpRHDhE5UrN7TpyvZqYXZr60rTulR2UpE0FYfcmGkYiRanvbe/ebned7CLciT152Zcnp+oH63MvX6EI+Bn63d0Q64yFkwUd/QXYpoImn9BUVCO8jEm5qKk1BU31wJ3VSVY85u9kEqYbU2NKH/7QLrtssvUPhLa0FAlahPB8bHfuuwxhRcP+B6vYQwWxGtfqAPd1NW3N66lp65Knh4dPJ7Xv3rZMLDbd3j4di2Xanjg7OHg2nabJe7qXBhoabmLzvRoOE+DbIqBXNLb2JDrzyRCLlwIt8ctKkhvKzgo89mrpzZVcukZ6052tLvCscl9PMb1p2h4lXOq20fRtA/Gm3G+YXb2TZjkDzbFcU3S2p3sm2jHT0zMbzcv/FPBwAzr3hIdGjnxiUFa08qKstWCjqQeUDBjkTs6tV5NCSFoFWKMtzLnTaKRpywZUHQjWOlcPs2o1Il3rWRDH27xWo67aFBhpLtBcNrOJGK1WSMu7djf9elU/prvSmPmNRsgDPga0tbNz0avXxDXpwgkplMQhpS5U66fnorF8QMnXwnVrzrLE1VrYna+FYaLRJEiy1LOvZTjZMzXbNNEW2lVjkESjpC9PBptTZDDVMRA6tOXs5lmDSRSk8UiosdHiSvU39Pt9ftEkGwS9pyocrm+0mbzdLf1b9jAa6KFWO1mCwJ1NqxHGeR2vOw8+h+P4GYEFESqlAmM9kDRQAMhSwWFD5lAKiFbhiukA5AJ+f62D+icHVLJAbyHsB6/MBgrZwuNVZYJdZzB53Z7GuhHZZpNHqEQWjDarjD+XWw56dBbJ7JDaQG40M2BHoSfsRtnCfM7Kb/G/4T8gD+rTtMnOiu6y0qLbo00SfL5kMpOQ2QloZSAQWHNSVlKKU4HREf6u7Xh2/hhFa2xwaAsoxx8gsry076ab9uFKFmVe2pxOb6Z97fxkBeKdhCppTenGxfK7ZrX8rkSV9avlN615Bah2O0rK3VgZ/p6d/yxv0UtW/nOc1QJl+Mc/wVskYjAbDfpch96IoYR8nuh52QYF7RH85wajpquwP3ke9g8WanClWr6yBq8pqcGDKBCoC5YXbIciVEfL7wJiJXjlq13ytI37S53VYDDz52+hSNq4Bzm7yWDh3nYbBG79W84LbiJZzVjOdQBekgF35J4HlI0G/LwgmijGb8IhhyP3Lfwup1aH42cJDz7fm6iurbBCjpAvw8tKyvC1+UG+Co8XDpvK4qsZwrN22Wz8wAcMFqNdfOwjAq3JH3i/ZDFZxEceC0iyw/zc52WLbNR/7Vu0Ajd98YtQfxv13/iGplOdkGvpURtKJDZWYB0vg+4A94CTgNA5USClmWZ1UdUqGC/bUCuoVG19MH+CnU8stbyy6AeiwpW6lle279j6jg82jpS7CGfWC0KieypbMRvftZuF7VRDGqI10YPODU+c7LZbTFailyROObRbaWw/lMHtTB+/uXm0IRXEjSYbZGO0Fvgl1AK1OMaiKsZZLVcjdSxXI8VcjaA4xMEqdrbryb9TYaRVsVcqeI6+XoFCzQoGb/VYK91OADQH6TsVd0lApBSzMKMd8bV/92g8dmxi4lg8fmxi58zMzh0zMzuk2UcPHnpkdubRQwcfne17+MLSww8vXXiY6S/9EevPyKeRG5UnXFaJ4M0wCcabzxJpomZftda8GsTi8VjZjywOs8n+FlE0gRP6mGQGLZUvs1ckZGSUd8qimT8gELrHOBArAZ31qCPRWgnypQkp5jHhzxUKOUozz5e8valHdXVKYwe1ktWXN6B/BVKLmBTqcFH04d+CQ8tdMNv1P+mMbRtp3eIwWoxOvVB5qG/xVO/gU7i92yabIPIYpZXeuaaB8eYWu1USrPpY7/FM/OaxF/JnBl8jlyD2nNLyzLqCKkJlxmMOi9xB0EZhBgmCc63ji0CcwhwPBSumD7wZHoDgdS14zZG3o7aOgI++hNESzWIyUXKmW8gh8hboyx+TatbXjmPZnv6TA6HJKrNdlk2Noy3bWlonwnJQJ1ukz+R+Sp08nrRapCcF/HTHwsDA4Z6qKsksu4yR8GRbfFQRQdelr9NTVXok/DzoJT3DJey9B3sbU8PeoOrAEiExgCB8EJWe526oZocHEI7EYjag5POAqCY0rNldu6/dhn8O6KTs9DXWd2W7iJNgXLZU7r/9O7bSePMpqj6fAjz0+K9kMK1TOAEyia/k8A8BnxgaTQy3Y070A0b0DfM12C0Iuhng+Sq7NZWKoag/rgSUuit4XWB2gdur+hWnp7OF93QiTXw3HuzpPz3aOFUjiDbZaKzcWNOVad23rSbqKxctDhwiwO4IZXru5drK4QD+atfBxNCJvqpK3iJKDoPTDWne2IzdIjtMOg5bJQt9sfeCya75A/wb8lXgZwjtfaKCsV1LHip1kOJxPAHi6LsfmhWs6l0lzdjOFyFKb2YSDpa1hqob/bVUTvVr3snkE+vVgxKRJa1rc9aFuWjXQl/6UPvmpTm9zmQvn3xX5YYdrZ27A0MtHeON9WPt+OnE4Z6eg31Dp5I7/vFRP7FaXHrfR2aVhtwtMyOR8ZbmiZbwaESrCXtXLuOX2PuBhkQQPAExar8WgN6MdhBclJcbOQPrj82pNhUMAH/LwuVe4a0G2QGKkPsM0/ST9JWaznD5ToPRKkMStYe9LqC8/TXw9vMs348lQBEpc+mbLPqG8SDLcOmbrKq0xri1uX5DfQnXCpoBfCupTa5I9WcOtQ+/Y07Pmxzl295RUb2jtWc21rXY1zreABxr2tzgH2olnweObf/0g35iN7n0ygf3+Oo23UQZmbutaaIZWNY41hLZ0szqFXpEdg/kE7RmglhBYwMTMku+uDkaMVycFitqrNXlLgA0RWmssGu/4WBZIDVNsm48YrfbRNvaL/yw0+6yu+Cf3Zmbc9rddif7YvnOBfQA6oekqucJe77ulEBDbey3JCcKtRy4Bg91cBjdUzKVeSIQquUgAXTnhUl1TzM4MZ/2uB6oDruMFsmlM1tkyWqU/a5KX0VXwAj5uMCJHqvRbJDMdo+vWtOnDvh+K9oH5FYk3IVfsuTfNFEW0J+ytK0jeahIKKOQ0UrX0q+cw7/jaiB3r05Ush/EjNLp83TF07CeDVnrOBZ+mVPLWw1VzHIrjx8XLUZIH3NbRLN0tw10j5sxGS2ywfCHR2SJ4RpdSeA95FnIXRzM+VflC8sN9TTM8pofWjVG+sKOOR7crT97/m1nRBGWO3Tr6cOyWX6G7/v5u5f+bTNvk8yG3u+eueP7XYLVmH8vVrnSj/vJP8I+Gk+q0pSCCsaTClS+oUhDTKuRCt6PRlFBabCYDt16y02Q0unFs/e8/XZR/5m1m/Cbfvbupf89zLO9utFP8BZci0xoQ/73RPTUB88w9tEfLZmQsYNuGAsWZEBFMGq1mr5Nnf23f0J/TWHPv9MjqH5llvsQ5AoToN3/oZ2mWr1YIgGPieOlJBZEbtTDprjSqYwG2oJEJCBROGeE9AIjSGwPwVgv6PdDPDDMydhgAKZLEplj2a5Ey2IvPNfxmp5jJTN9GGnPJuKQ5EuEk8695m21J6GKBrns3b1jCugcr/MHg/V+kINJrC5xzTTWrz0QparBCgaXszQvKJ6GXO0XQPZoRwGGgZC/fXBr37H+UBRztYuxxlSw/3iybcgs8R4PbsYee9PWltF7d1948c7B9x5v3xINC4IsEPumA6N3fXT83b94fyjRHptqijc07e3D5Lnt757e9tBCU9Cgq+hJhNNNift2xyIJT4XI576uM1RU7LwwPH4mdfyFd2x/326L282ZBc5sqPEd+kj2/n+9I3ePuWNT+kR7rC+x2JH//1P5/xU1Z+n9JXCbHSN+6ek/ew+9fn34wmdz967U6wL8MRjS00/tQ98xs/9npZuC+1/RBVb/J5b2IUNkM+ST36S/oVu5g83ci6rRn/BD3oFmybtQyzXvv0B/0/Aqa3S+Oszrxi8G+D15Hfy+8sfb+z+F97dvDC+SuzaN/0/w376KP3nw+rSQNuS/4fX30lz+Gve++MeVKfkAUrjn6G8U1s3PXhun17TubhT5k8poN5qAMiLyevAh4T8urjiLqsnR6+zfSc+J132+yd4jvbE8KmNRX/u8VNK/xod7j4YXSV4Fv+vtM/Wnlf1r0Y2iLN56fVrwN1DjDcl2ip4hX2fvrhvj3Q3TZkN+8rMrfQ7+Maq9ql69nj3iV8ZhkHEcEkcd3BsnehQBG6olARQnFfAnIO31TQOrh/7/+jwNND17FR//BKtxruSdhPSvqkO3oij8VV4x/3bUzT3/X4j2evbdh+bRErSvvb6G6/G5Ne2Z9Q2S9Rtpo+Rv17TfvHGN675Ge/Mb1D5LG9+4rr3vmu0LpU0n3WDbrPtwsf30+k2Yf53t22LnmqaWNr18g+12/S9KmyFRbNtec7uftU+tb9IQtMeu0V56Y5pxiLVPrm2y+xrtrnXtSzfWTJJpodg+bra/hlZfbIfND5j/3XLacsnaYn3E+qL1RVvfn6zdbftSsf1stdm9V7Tt9qViu/hfpzlUWs1C/XgYKt73IfqrrEbUg94B3vJ9JjeMaa2rRwegcsa8ATy7nVXRtI+RHUZanyAz9uf7HOrEbfk+j2rx4XxfhyrxO/N9Aeb/Ot83ow78BZRCJ9BJdAadQjehg+gQOo28qA2qqVZoXrQdZhbhuhXdAvf3oyPoZpRFx9ECzE3CMycA/0WYp0/1A8xpgD8B8zfDuJ6tdhpWvxl1o2ZoB2ENCnEL2oea4KkT6BjMauudgnVugyzwJIwPoqMAeRx6t7G7zVfZfwiux2DuKODegMKw32351b1oG6x1M/ydQrfCN8V1CPY6zrAcZ88BTd6qK1f1VgNeV+5F1zsIs0dhfAq1A0wLaz3AgwNoECB6rvJUZN1zV+PhWoidDOebAYpi6y3Z6dVXL/Ba4/TNAEslehLmboZVbmacamKyOQj3J4Aj9NQw/RT6wrbpZYzfnVGx9p/DTy4jMfnJ4fYaDjXS7pPd+qDeruf02mhAaBGqBDaSkpfMzxie4Z8BhTLA2JS8hBKssTGHBpb9+L6t02rivullbmFgOUhHn9LfBeqXuG//9mkKkoHPk736er1Tz8mNT+GVt6n8u5YJGnhctyCggYH/C6DPfJ8KZW5kc3RyZWFtCmVuZG9iagoxMCAwIG9iago8PC9UeXBlL09ialN0bS9OIDEzNy9GaXJzdCAxMTUzL0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMzc2MT4+CnN0cmVhbQp42t1b23IbxxF9z1fsmwmnuJj7xaVCRSIjm4lsyZIc2YbxABJLCjEJsADQkf4+p2dmgVlgF4QUVEWJitDs7sx0nz7d03PBwhes4LJwuuD4k7gxhVCq4L6Q2hWCFcqi4IX2KERhUSHQXio0K7zWhUA/ZlGagnPPCmEhh/NC+IIrKQr8cc00xKE0rpAOOrQsFC+4hTZSZp2HnoI7LQoNDB5C0YR75woNQMwAAMGAWg0AwtgCj4T0qjCEhO4toECIBQSD/hbPLZMFQbMOJfo7CHcEDXod6r0TBVRIplwBCJJLW3iCDLwekNGwgN1SWoBjqFAGqCAU3JDZppDG0AX6WijiHG0clHEokB69ObewFFRx7golUO9gsoBx6KcEwBjcS0gCNUpK3IMKCaONQIl6BwEKeCxHCQdZPFcgw4JCBWEW/TVXBSAqreAh9NcgwcF15DSYqAycA1TKaPgMzw0eApyynBUezy2cAoOUBRhQqiz+85Dr4HE4FxfkFQaEDjRy9FKekb8hw0syDkK8IXPR24NKjnDSDHecMVwokgMfMkty4EQGZBxWaQ5o3qIkaB4loIFkLaAE8YQLChwKQHgXF6iSoIgo1RSanEJFAywHVm0VVUGcVzGcDaN4I1olo0iHcEjEBRxgESIUUZZBPIcaKxwJ9IgZMgrBYPEIF2CPMWrjQacgOcQXSUa1c4yAwQwGgzji2nPSDps9IhMXRDKFN3p6BaUSwUXUoKW21ADRZtAKzzwNMK7oggIPHRzYAFrvYRaA+BBVJBbaEKKeiAX+yDA5keJREA+kkklyDXEtLbFL7CtwSI6BN9CIBGgEl6bW2tEjam4MAaNot9BBwh1FMfmcgoJGJ4hGa+rHjUFgkoFAyDGI0YbIJzfBn5yIgicoARBl5AnKEgzKnzzp//zy8p/V1QpXF3cIFmSk14NB//l8Ro+ew3XpyavF/OpNtRr2X50/77+tPqzQfnxTncXiWSwuRoPBn9Dvkxq//Xhf9Z/OZvNV/83D5YruXkxnv/efzReTajFkAMBG/e/6F/2zIY83T9HtTf/b+dt5//zk6v34flUtSt4DzNewZYhRivgoKZoRESXFpmalkfrIGkVDIzelQD7kzpcIXi1cabk9ksYllEzns1JkVjpTekWjWZUSORB5vZQRhjXi6HrFtl7lRSkplLUtMUQIhmPHt1fu6HWslDQfMldKxDDhwNR1ZNfK3LXI+KVyNPwIAqVuViKpHNlWuetbpUypaW6XvmTCByDITUdXvOtcqUrkFiHgVJrblIV+dWSOVYNjLkoTEpsuNVRjmi6RCI9sqmrhmCE1+JB5S88JCByh+dEV73CMtUppaeYAuWF6Z7zkvrZ4KwP3n0tK25+Ri//DVL7bvX3G+C9i+lK4+b/D8fmCPmXYMFrY1MPmp9cX9Dm5G09vV/Nv3le3t/O/zFfzy3k5qdYjCGssJAta5MpSYq3OLeZALEOxkC0dN8cC8X61ul9+0+/v6PeuxPoaU5EvDa0lST1WhRqwmLHHJvPF9G66Wg5PzudXp29W48WqV6fQr5HORv0fxndVoxqMQE3eCMtYPNmSt1k4ZSuatbhNrdG5OLQxZo802csS/I402cNWK5emethQ7Eq7h/0ELJRyIyc9tzwICXeiZ8XmTvZsm60Zd2uRf59OlkOs2NCaNrBUWBYL1QVJpf56C5LqWbMBoXvWdkkwSYLdkmB61m8k2J5jXRJckuC3JLiey4jwPSe7JEx79cT0de7yVOf0RsoUt9GwrIOze+hpCA4U2+Bx2vuHIhLuXIuMfJnbWHuuIeYtPMuBhXae75Uqe43VVotU2fOyIZXaebVHKq2eGuuLHanUwjdIDO283SNVBakPl5mMNhqomY9hs9WY92jz31IhenQY8Bj3u5qDK30IMDqeCUV0LB3OtMhripBR6PohshLL7NluTOcUNfhmHzq4aNeWtdvVpprKGm3plKVFmerRsuxRXXpHl+nUpXt0ftOiy/ToPOdRXXZHl+/UZXt0MtSiy/XopKilwvfo5OgzXOnr+KBTuRgSPpZcpDKfMmJWiDHkUkMmU8P1qBjKwFT/519+pfM3i30mUtHs4fZ2hDq/qRP4Y3WF0h0VmndV2I4K2fX8kIodwOYwY7brlNhTp/fUue66nIqdOrWnzh6Ghc4CsalyHXUM2Y+31ylpsKCr67g6zAbSJ0vFO+qkLJGwWuuUxYrNddTRTlS010lsxGUHFol9XEc3oXSJ+aWF6mZENiqMcNh8d2D0vrQdAo02HX4VdLBbYuXTWqe8KrEUaR0dWzzbbS65a/NdbhyG/3m1XC3DmXxYDIel+nR1Wz25rq6vGVPYkRvNmJUo8UFfZjxKho+K1wbtTDXYcxD4aryoZqtw7Es4fsAaO5xSt6s0SQ3mTDNJ6m1UE55fDvaex62ViVyZalcG2VER2XeZrm1t82DvAdyWoleL6o9wLJ9p1R1aiTmXmCSTcC8mkVVCQM+IXYt6wRL7xLJJz+2mndGDvcd17Si76JBRKSm0yfXkgwBCJFpIsc7A642fTJUAysGeU9rn08VytabqxXi5pqp/Nn8A2FO5HTIJNs/JNd02BJwq4rRssPeMb63J5MK7xsN1NJIU6Dr+k/EqEWOTd+U4fpRMz2tSr7PABoEqlYHMFORqshl3wftZXOqadJM5RUadNHhCW8J1ldqpbQK211w5Cz5jQfIjslCPMtm0LGQYvgm70M5swi+wIZM118lSvd8i1WJRjCCZZyApvlwnq2qT+dRVwlC1Zb/tRW2n6fngiauj45iua3MvN0lgb4xWiYJavklloqA5r6C9pyjZb7bpNjufBqT6gj3e8HLq79KkkOfaR6iw3VTkc5PUX3CGs5u2AcsnDgLXTUFXAMhsgaGbWevTLW5B1zgN2MyBKR/FOVA25kCzscDlfjN7VjLXG0SBX96cysm69ajNpnRlNjNGI+9OkmVpKq1nFCE3H/ytP7SGUTILVb6R91iM6DpDdDHY2OJm/u0ipNOl9XolmyZzUh4ncb978yWOtLl7be5evu3etMRpzL/7VuU8W3qlcbI2o55nXZ0ymv6r59R8jGm1MTWkn5qiamtVLLYyf9Ynj4t657DWWcdBZ1qLuYdk0qhrm1V2V+Q7J1J5YPxPsbc/qGQeVD4PKn9AUD02RALKOgfYNE5F+2xMW4F8dq+tqn1k5J49iWxuABqGuI4NgMlHh+1Ifnp7EhnseZWgVp8PTtFQLzr2H/laQrHHSbVqs720arD3e/Bao8qXqKpjiaoz5oPhXfvwre+8t5REs1TXMp+Q11O2brGg8fJAYjUKS6ymA7NHWM2is3ZNQwjLhKjY7nW1nD8srqplEWMofL34anxTbSxUqddshfvlMD883vSOh7IHdOfrY/VhPJYteDpdjWem0aIiAi9ioBRxh1vE3XYRt7hFNLeI0TdqwhGHWhPDdRS/UV2GF+c2Lqx7LxNnm8GkornhzLc+442FaqUnLZ5b8JgmHsnb++tD+3fod4f2z7+/OZSA6LK4Ki6kaUWQwrkFgW0iUKy9vzq0v2zvbw/tbz6DgRi7cZQWSrci0KwLgdtC4Nv7ywP7a9He3xzaf41/qOOXYdq3jDHDD5Rn2NYY83vGmGolWCUccZDFo91C741VLtO3NzFy6lCvHV7DHPW/rybT8bP5h/DuhOH0vnP94t3Zohqv5ouTF+O31c/Fv6ar98V76FksquveZ2/28vO9g7bt2xu2h9X7+aKev0R2BuA2cxmtLlQ6xKNPuLcJFK27XHhfY/JwVS1OPkz+mN5Pru8+FL+dCCYEHU3+1utF8zHpnY9X1cn5N6gyEC6Y00KqPzP5FWNf9SJTL++r2dMwQ6ZvmJ5PV6Pgj+/nk6r/07J6+bC6nc7gHnr4YnxZ3S7R74eHu+WQhbnwfDAQ4WIxGKj6CRwRvwkMr26T4FrOZvIjp6/DJcTB2Xg1vp3fUASroZF+JMWQXq0xwo4UG1quR8oPtRUjK4baiMJ4M3JU4UdOD4XVI85QowVKQy1GnJuhQzXnbmgl6iWaa9wbgwCXKPGcVDg74tYOtUfp2dAIg9IOLdMjIfjQWFd4JXHt0MaMBCEAHuGgx7GR5GyouC2MlLhGG2eAXg6FRKkUsMAaZYERbbUZeiFQRlnSQh9XMNEjDaLkFiNHjJTAPfMjJYEL+JQRQ2scSqq3RXgG/UZL8MJJBtK4ovfiC00/0WAOg81j3NGPJ1DSjyiUG2kNXFYWxJcGBuNxrfwIdiAlmtEo0K9spJ8XQX5kmegHgkC/Af060C9Y5Fe4yK8xgV+yjRsP7ljklvxB3DIVueUycmvotXdwKizqam5V5FabwK2kH0oIFrkFgsAt2gRu4dfArUzc8sStdYFbDZjErXQ6cgtfELdSJm7p3nAkYHrhXyR+wSNxTRiMDfxq+iUIvV5s6JVqVgAb+ASv9Io1B68MusAV8cvp/XmvcO1xzUfaaMgXI20VJmv4yarENxth8A89gnq0Toj0utb6PbGzi3O6pwrRfzZeVqH27Mdnv/x69ucfH6ZXvy/Hs8nps/ntJHQ8r5ZXi+k9EmB4Az/k9IvzNx+Xq+ruYnY9D7PBzXS5Wnw8eTqZX1a9/kt6CW06uzm5mCCHT1cfe9B+f39b3VFKZxjM5+9Av+y/Cy/8J5Fv599enH8/vu/XvbKU3gTSf7q8CpMD0hl95RZuToVm/TcA9Q96XxyD//67anrzPrV6+sfNu+kEmRtsB2nPKNef0i89TiX9gkDSDzK4k6P+BbLG9Orp7Oa2Klj/+e34Zkm//OFB/Eck+ydINrP5snrC6n+ONf4N0s8MKGV1MEsUVsCWvp+k1s+ntxX9AmJ77dnwHj1hj7ntr7Or+QT8r5k8/S7RNBlDz5ym4zhr9t/Of5pN0bqiH1PtU9weNn/78ezdry8z/QiFh9vxYjdyzBEjh4kQOfb4keNsd+AolQUO/XLrVHB6f51+csJlR+CYzpjRe2Kmk9Z12LidsPGfEDad8g+JHO52Q6fe8v4bscqwvQplbmRzdHJlYW0KZW5kb2JqCjE2MCAwIG9iago8PC9UeXBlL1hSZWYvSURbPGExNjkzYTNmNTdhZDZmNDA2YWQ4M2Y0NTMzZjMwMmY1PjxhMTY5M2EzZjU3YWQ2ZjQwNmFkODNmNDUzM2YzMDJmNT5dL1Jvb3QKMSAwIFIvSW5mbyAyIDAgUi9TaXplIDE2MS9XWzEgMiAyXS9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDM0Nz4+CnN0cmVhbQp42i3SxU4DQBRA0Xk4xaFAcXdaoLi7u0Nxd3eKOyFhx4Ylv8Oe8BGw4QegN8PmZO6bZDLJjFLq99dJGdQFnMOKKD+lxHCiFHkL1xL4plOJ/UevVsWYpVcC6+AEzvAAd+ACruAG7uABnmAAL/AW44s+zwc2JfRDpy9sielRpx9sS9i3Tn/YlQizzgDYk8j/SwbCvkQ36QyCQ4nd1GmEI4n71BkMx5LsrDMETiAUTJLxrDfCIA96IByyIQciwAq5EAkFUAhFEAXRUAwlEAOlUAaxUA4VEAc1kAX5EA8JUAlVkAjVUAtJUAddkAzd0AbtkAKp0AGdkAb10ADp0AhNkAHN0AKtkAlmsEAvLEMfDEE/DMAgzMMwzMEk2GAERmEMxmECpmEKZmEGlmABFuEMNmANduAATsEuFpPjA2fb9DPewKVYXx0z65ee3cOVDL47ZkNRDp7clPoDMQw8JQplbmRzdHJlYW0KZW5kb2JqCnN0YXJ0eHJlZgozNTU5MAolJUVPRgo=</File>
    </Filelist>
    <DatabaseInstall Type="pre">
        <TableCreate Type="pre" Name="ota_tokens">
            <Column Name="token" Required="true" Size="64" Type="VARCHAR"></Column>
            <Column Name="ticket_number" Required="true" Size="64" Type="VARCHAR"></Column>
            <Column Name="user" Required="true" Size="191" Type="VARCHAR"></Column>
            <Column Name="used" Required="true" Type="INTEGER"></Column>
            <Column Name="change_time" Required="true" Type="DATE"></Column>
            <Column Name="create_time" Required="true" Type="DATE"></Column>
        </TableCreate>
    </DatabaseInstall>
    <DatabaseUninstall Type="pre">
        <TableDrop Type="pre" Name="ota_tokens">
        </TableDrop>
    </DatabaseUninstall>
</otrs_package>