<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>75931</bug_id>
          
          <creation_ts>2012-01-09 19:48:35 -0800</creation_ts>
          <short_desc>webkitpy: add os_name, os_version to platforminfo</short_desc>
          <delta_ts>2012-01-10 15:34:11 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>75764</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Dirk Pranke">dpranke</reporter>
          <assigned_to name="Dirk Pranke">dpranke</assigned_to>
          <cc>abarth</cc>
    
    <cc>aroben</cc>
    
    <cc>eric</cc>
    
    <cc>ojan</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>532780</commentid>
    <comment_count>0</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-01-09 19:48:35 -0800</bug_when>
    <thetext>webkitpy: add os_name, os_version to platforminfo</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>532781</commentid>
    <comment_count>1</comment_count>
      <attachid>121786</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-01-09 19:51:52 -0800</bug_when>
    <thetext>Created attachment 121786
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>532832</commentid>
    <comment_count>2</comment_count>
      <attachid>121786</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-01-09 23:02:37 -0800</bug_when>
    <thetext>Comment on attachment 121786
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=121786&amp;action=review

&gt; Tools/Scripts/webkitpy/common/system/platforminfo.py:92
&gt; +        if self.os_name == &apos;mac&apos;:

It&apos;s a little strange to my eyes that os_name is a member instead of a function.  But it does make sense.  It&apos;s not like the platform changes during execution. :)

I also have concern with string comparisions like this as they&apos;re very error prone.  I&apos;ve found lots of errors in webkitpy where we check things like sys.platform == &quot;mac&quot;  (when it&apos;s really supposed to be &quot;darwin&quot;), or sys.platform == &quot;Darwin&quot;, etc.

I think we should consider using platform_info.is_mac() (or just .is_mac) to get around this possible gotcha.

In any case, this is a great improvement.  centralizing our platform calls behind a mock is a good thing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>532833</commentid>
    <comment_count>3</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-01-09 23:03:10 -0800</bug_when>
    <thetext>I&apos;d like you and Adam to have a chance to see/respond to my musings.  Then I&apos;ll happily r+ this tomorrow.  I&apos;m a bit too drained to give a full review atm.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>532836</commentid>
    <comment_count>4</comment_count>
      <attachid>121786</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-01-09 23:09:22 -0800</bug_when>
    <thetext>Comment on attachment 121786
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=121786&amp;action=review

This is great.

&gt; Tools/Scripts/webkitpy/common/system/platforminfo.py:54
&gt; +        raise AssertionError(&apos;unrecognized platform string &quot;%s&quot;&apos; % sys_platform)

Why not just assert (the language construct)?

&gt; Tools/Scripts/webkitpy/common/system/platforminfo.py:63
&gt; +        # FIXME: Should this routine enforce minimum versions and handle &apos;future&apos;, or let callers do that?

I would support future here.

&gt;&gt; Tools/Scripts/webkitpy/common/system/platforminfo.py:92
&gt;&gt; +        if self.os_name == &apos;mac&apos;:
&gt; 
&gt; It&apos;s a little strange to my eyes that os_name is a member instead of a function.  But it does make sense.  It&apos;s not like the platform changes during execution. :)
&gt; 
&gt; I also have concern with string comparisions like this as they&apos;re very error prone.  I&apos;ve found lots of errors in webkitpy where we check things like sys.platform == &quot;mac&quot;  (when it&apos;s really supposed to be &quot;darwin&quot;), or sys.platform == &quot;Darwin&quot;, etc.
&gt; 
&gt; I think we should consider using platform_info.is_mac() (or just .is_mac) to get around this possible gotcha.
&gt; 
&gt; In any case, this is a great improvement.  centralizing our platform calls behind a mock is a good thing.

Yeah, having an is_mac predicate is a good idea.

&gt; Tools/Scripts/webkitpy/common/system/platforminfo_unittest.py:48
&gt; +    def setUp(self):
&gt; +        self.sys_platform = sys.platform
&gt; +        self.getwindowsversion = None
&gt; +        if hasattr(sys, &apos;getwindowsversion&apos;):
&gt; +            self.getwindowsversion = getattr(sys, &apos;getwindowsversion&apos;)
&gt; +            del sys.getwindowsversion

Hum...  mutating globals is sad times.  Maybe we should pass in a mock sys object to the platforminfo constructor?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>533244</commentid>
    <comment_count>5</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-01-10 11:43:44 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 121786 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=121786&amp;action=review
&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/system/platforminfo.py:92
&gt; &gt; +        if self.os_name == &apos;mac&apos;:
&gt; 
&gt; It&apos;s a little strange to my eyes that os_name is a member instead of a function.  But it does make sense.  It&apos;s not like the platform changes during execution. :)
&gt; 

I don&apos;t feel strongly one way or another here.

&gt; I also have concern with string comparisions like this as they&apos;re very error prone.  I&apos;ve found lots of errors in webkitpy where we check things like sys.platform == &quot;mac&quot;  (when it&apos;s really supposed to be &quot;darwin&quot;), or sys.platform == &quot;Darwin&quot;, etc.
&gt; 
&gt; I think we should consider using platform_info.is_mac() (or just .is_mac) to get around this possible gotcha.
&gt;

Sure, I can add some convenience functions. I&apos;ll add is_mac, is_win, is_linux, and wrappers for mac versions, since I&apos;ve seen those elsewhere, but I won&apos;t add win or linux version wrappers until someone needs them ...
 
(In reply to comment #4)
&gt; (From update of attachment 121786 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=121786&amp;action=review
&gt; 
&gt; This is great.
&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/system/platforminfo.py:54
&gt; &gt; +        raise AssertionError(&apos;unrecognized platform string &quot;%s&quot;&apos; % sys_platform)
&gt; 
&gt; Why not just assert (the language construct)?
&gt; 

I&apos;m not sure I follow you ... what language construct would that be in this case?

&gt; &gt; Tools/Scripts/webkitpy/common/system/platforminfo.py:63
&gt; &gt; +        # FIXME: Should this routine enforce minimum versions and handle &apos;future&apos;, or let callers do that?
&gt; 
&gt; I would support future here.
&gt; 

Okay.

&gt; &gt; Tools/Scripts/webkitpy/common/system/platforminfo_unittest.py:48
&gt; &gt; +    def setUp(self):
&gt; &gt; +        self.sys_platform = sys.platform
&gt; &gt; +        self.getwindowsversion = None
&gt; &gt; +        if hasattr(sys, &apos;getwindowsversion&apos;):
&gt; &gt; +            self.getwindowsversion = getattr(sys, &apos;getwindowsversion&apos;)
&gt; &gt; +            del sys.getwindowsversion
&gt; 
&gt; Hum...  mutating globals is sad times.  Maybe we should pass in a mock sys object to the platforminfo constructor?

I will try to rework it to make it more better :).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>533271</commentid>
    <comment_count>6</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-01-10 11:56:55 -0800</bug_when>
    <thetext>&gt; I&apos;m not sure I follow you ... what language construct would that be in this case?

Reading &lt;http://docs.python.org/reference/simple_stmts.html&gt;, it seems like the construct doesn&apos;t exist.  I must have dreamed it up.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>533284</commentid>
    <comment_count>7</comment_count>
      <attachid>121786</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2012-01-10 12:10:14 -0800</bug_when>
    <thetext>Comment on attachment 121786
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=121786&amp;action=review

&gt;&gt;&gt; Tools/Scripts/webkitpy/common/system/platforminfo.py:54
&gt;&gt;&gt; +        raise AssertionError(&apos;unrecognized platform string &quot;%s&quot;&apos; % sys_platform)
&gt;&gt; 
&gt;&gt; Why not just assert (the language construct)?
&gt; 
&gt; I&apos;m not sure I follow you ... what language construct would that be in this case?

Presumably you could do something like: assert False, &apos;unrecognized platform string &quot;%s&quot;&apos; % sys_platform</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>533382</commentid>
    <comment_count>8</comment_count>
      <attachid>121912</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-01-10 14:27:48 -0800</bug_when>
    <thetext>Created attachment 121912
revamp to make it more mockable, add is_mac(), etc.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>533388</commentid>
    <comment_count>9</comment_count>
      <attachid>121912</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-01-10 14:35:21 -0800</bug_when>
    <thetext>Comment on attachment 121912
revamp to make it more mockable, add is_mac(), etc.

View in context: https://bugs.webkit.org/attachment.cgi?id=121912&amp;action=review

Thanks for your work on this.

&gt; Tools/Scripts/webkitpy/common/system/platforminfo.py:39
&gt; +    Public (static) properties:
&gt; +    -- os_name
&gt; +    -- os_version

I&apos;m slightly wary about making the public, now that you have the is_mac() stuff.  We wish to discourage folks from writing error-prone string comparisons.

&gt; Tools/Scripts/webkitpy/common/system/platforminfo.py:67
&gt; +        if self.os_name == &apos;mac&apos;:

I think you want is_mac() here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>533405</commentid>
    <comment_count>10</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-01-10 15:06:33 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; (From update of attachment 121912 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=121912&amp;action=review
&gt; 
&gt; Thanks for your work on this.
&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/system/platforminfo.py:39
&gt; &gt; +    Public (static) properties:
&gt; &gt; +    -- os_name
&gt; &gt; +    -- os_version
&gt; 
&gt; I&apos;m slightly wary about making the public, now that you have the is_mac() stuff.  We wish to discourage folks from writing error-prone string comparisons.
&gt; 

True. However, at least for now there are places where I need a string, e.g., in expanding parsing &quot;chromium-mac&quot; and figuring out what the os mapping is. 

Hopefully once I get further along in the refactoring I&apos;ll be able to get rid of most of these references.

&gt; &gt; Tools/Scripts/webkitpy/common/system/platforminfo.py:67
&gt; &gt; +        if self.os_name == &apos;mac&apos;:
&gt; 
&gt; I think you want is_mac() here.

Good catch, will fix.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>533418</commentid>
    <comment_count>11</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-01-10 15:34:11 -0800</bug_when>
    <thetext>Committed r104637: &lt;http://trac.webkit.org/changeset/104637&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>121786</attachid>
            <date>2012-01-09 19:51:52 -0800</date>
            <delta_ts>2012-01-10 14:27:45 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-75931-20120109195151.patch</filename>
            <type>text/plain</type>
            <size>18048</size>
            <attacher name="Dirk Pranke">dpranke</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA0NTI0CmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cg
Yi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggZTkwODcwYzRiMGY1NGY1MWRlNmFmYTMzMzc1OWM2ZmMy
NTU4YjgyZS4uMDFmNTkwZGQ2YmU1M2U2MWFhNzI5M2RiYjAwOGFmNTJmMTEyNmU2OCAxMDA2NDQK
LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDU1
IEBACiAyMDEyLTAxLTA5ICBEaXJrIFByYW5rZSAgPGRwcmFua2VAY2hyb21pdW0ub3JnPgogCisg
ICAgICAgIHdlYmtpdHB5OiBhZGQgb3NfbmFtZSwgb3NfdmVyc2lvbiB0byBwbGF0Zm9ybWluZm8K
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc1OTMxCisK
KyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQXMgYSBmaXJz
dCBzdGVwIGluIGNsZWFuaW5nIHVwIHRoZSB2ZXJzaW9uIHBhcnNpbmcgbG9naWMgaW4KKyAgICAg
ICAgd2Via2l0cHkubGF5b3V0X3Rlc3RzLnBvcnQsIHRoaXMgYWRkcyBjb21tb24gcm91dGluZXMg
Zm9yCisgICAgICAgIGdldHRpbmcgdGhlIG9zX25hbWUgYW5kIG9zX3ZlcnNpb24gZmllbGRzIHRv
IHRoZSBQbGF0Zm9ybUluZm8KKyAgICAgICAgY2xhc3MuIE5vdGhpbmcgdXNlcyB0aGVtIHlldCBi
dXQgSSd2ZSBhZGRlZCBGSVhNRSdzIHRvIHNvbWUgb2YKKyAgICAgICAgdGhlIGNvZGUgdGhhdCBu
ZWVkcyB0byBiZSBkZWxldGVkIGluIHRoZSBwb3J0IGZpbGVzLgorCisgICAgICAgICogU2NyaXB0
cy93ZWJraXRweS9jb21tb24vc3lzdGVtL3BsYXRmb3JtaW5mby5weToKKyAgICAgICAgKFBsYXRm
b3JtSW5mby5fX2luaXRfXyk6CisgICAgICAgIChQbGF0Zm9ybUluZm8pOgorICAgICAgICAoUGxh
dGZvcm1JbmZvLl9kZXRlcm1pbmVfb3NfbmFtZSk6CisgICAgICAgIChQbGF0Zm9ybUluZm8uX2Rl
dGVybWluZV9tYWNfdmVyc2lvbik6CisgICAgICAgIChQbGF0Zm9ybUluZm8uX2RldGVybWluZV9s
aW51eF92ZXJzaW9uKToKKyAgICAgICAgKFBsYXRmb3JtSW5mby5fZGV0ZXJtaW5lX3dpbl92ZXJz
aW9uKToKKyAgICAgICAgKFBsYXRmb3JtSW5mby5kaXNwbGF5X25hbWUpOgorICAgICAgICAoUGxh
dGZvcm1JbmZvLnRvdGFsX2J5dGVzX21lbW9yeSk6CisgICAgICAgIChQbGF0Zm9ybUluZm8uX2Nv
bXB1dGVfYnl0ZXNfZnJvbV92bV9zdGF0X291dHB1dCk6CisgICAgICAgIChQbGF0Zm9ybUluZm8u
ZnJlZV9ieXRlc19tZW1vcnkpOgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5
c3RlbS9wbGF0Zm9ybWluZm9fdW5pdHRlc3QucHk6IEFkZGVkLgorICAgICAgICAoVGVzdFBsYXRm
b3JtSW5mbyk6CisgICAgICAgIChUZXN0UGxhdGZvcm1JbmZvLm1ha2VfaW5mbyk6CisgICAgICAg
IChUZXN0UGxhdGZvcm1JbmZvLm1ha2VfaW5mby5tb2NrX3J1bl9jb21tYW5kKToKKyAgICAgICAg
KFRlc3RQbGF0Zm9ybUluZm8uc2V0VXApOgorICAgICAgICAoVGVzdFBsYXRmb3JtSW5mby50ZWFy
RG93bik6CisgICAgICAgIChUZXN0UGxhdGZvcm1JbmZvLnRlc3RfYmFzaWMpOgorICAgICAgICAo
VGVzdFBsYXRmb3JtSW5mby5pbnRlZ3JhdGlvbl90ZXN0X2Jhc2ljKToKKyAgICAgICAgKFRlc3RQ
bGF0Zm9ybUluZm8udGVzdF9kaXNwbGF5X25hbWVfbWFjKToKKyAgICAgICAgKFRlc3RQbGF0Zm9y
bUluZm8udGVzdF9kaXNwbGF5X25hbWVfd2luMzIpOgorICAgICAgICAoVGVzdFBsYXRmb3JtSW5m
by50ZXN0X21lbW9yeV9tYWMpOgorICAgICAgICAoVGVzdFBsYXRmb3JtSW5mby50ZXN0X21lbW9y
eV93aW4zMik6CisgICAgICAgIChUZXN0UGxhdGZvcm1JbmZvLnRlc3RfZGV0ZXJtaW5lX29zX25h
bWUpOgorICAgICAgICAoVGVzdFBsYXRmb3JtSW5mby50ZXN0X2RldGVybWluZV9tYWNfdmVyc2lv
bik6CisgICAgICAgIChUZXN0UGxhdGZvcm1JbmZvLnRlc3RfZGV0ZXJtaW5lX2xpbnV4X3ZlcnNp
b24pOgorICAgICAgICAoVGVzdFBsYXRmb3JtSW5mby50ZXN0X2RldGVybWluZV93aW5fdmVyc2lv
bl9mcm9tX3R1cGxlKToKKyAgICAgICAgKFRlc3RQbGF0Zm9ybUluZm8udGVzdF9kZXRlcm1pbmVf
d2luX3ZlcnNpb25fZnJvbV9jbWQpOgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0
X3Rlc3RzL3BvcnQvYXBwbGUucHk6CisgICAgICAgIChBcHBsZVBvcnQuX19pbml0X18pOgorICAg
ICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvY2hyb21pdW1fbWFjLnB5
OgorICAgICAgICAoQ2hyb21pdW1NYWNQb3J0Ll9faW5pdF9fKToKKyAgICAgICAgKiBTY3JpcHRz
L3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L21hYy5weToKKyAgICAgICAgKE1hY1BvcnQpOgor
ICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvd2luLnB5OgorICAg
ICAgICAoV2luUG9ydCk6CisKKzIwMTItMDEtMDkgIERpcmsgUHJhbmtlICA8ZHByYW5rZUBjaHJv
bWl1bS5vcmc+CisKICAgICAgICAgd2Via2l0cHkubGF5b3V0X3Rlc3RzLnBvcnQubW9ja19kcnRf
dW5pdHRlc3QuTW9ja0Nocm9taXVtRFJUVGVzdCBoYXMgYmVlbiBmYWlsaW5nIG9uIGNyLXdpbgog
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU4ODQKIApk
aWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL3BsYXRmb3Jt
aW5mby5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9wbGF0Zm9ybWlu
Zm8ucHkKaW5kZXggNjRlODA1ZGYyNTk0ODM2OGU1ZTFmYTg4ZDY0NzE0MDhhNmRmZGNlMC4uOWM4
ZDJjMjhkZDAzOTIyMTQ0Y2Y1MzQ1MzA1NzU4MmZlYjJmMDY4NyAxMDA2NDQKLS0tIGEvVG9vbHMv
U2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL3BsYXRmb3JtaW5mby5weQorKysgYi9Ub29s
cy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vcGxhdGZvcm1pbmZvLnB5CkBAIC0yOCw2
ICsyOCw3IEBACiAKIGltcG9ydCBwbGF0Zm9ybQogaW1wb3J0IHJlCitpbXBvcnQgc3lzCiAKIAog
IyBXZSB1c2UgdGhpcyBpbnN0ZWFkIG9mIGNhbGxzIHRvIHBsYXRmb3JtIGRpcmVjdGx5IHRvIGFs
bG93IG1vY2tpbmcuCkBAIC0zNSw5ICszNiw2MCBAQCBjbGFzcyBQbGF0Zm9ybUluZm8ob2JqZWN0
KToKICAgICBkZWYgX19pbml0X18oc2VsZiwgZXhlY3V0aXZlKToKICAgICAgICAgc2VsZi5fZXhl
Y3V0aXZlID0gZXhlY3V0aXZlCiAKKyAgICAgICAgc2VsZi5vc19uYW1lID0gc2VsZi5fZGV0ZXJt
aW5lX29zX25hbWUoc3lzLnBsYXRmb3JtKQorICAgICAgICBpZiBzZWxmLm9zX25hbWUgPT0gJ2xp
bnV4JzoKKyAgICAgICAgICAgIHNlbGYub3NfdmVyc2lvbiA9IHNlbGYuX2RldGVybWluZV9saW51
eF92ZXJzaW9uKCkKKyAgICAgICAgaWYgc2VsZi5vc19uYW1lLnN0YXJ0c3dpdGgoJ21hYycpOgor
ICAgICAgICAgICAgc2VsZi5vc192ZXJzaW9uID0gc2VsZi5fZGV0ZXJtaW5lX21hY192ZXJzaW9u
KHBsYXRmb3JtLm1hY192ZXIoKVswXSkKKyAgICAgICAgaWYgc2VsZi5vc19uYW1lLnN0YXJ0c3dp
dGgoJ3dpbicpOgorICAgICAgICAgICAgc2VsZi5vc192ZXJzaW9uID0gc2VsZi5fZGV0ZXJtaW5l
X3dpbl92ZXJzaW9uKCkKKworICAgIGRlZiBfZGV0ZXJtaW5lX29zX25hbWUoc2VsZiwgc3lzX3Bs
YXRmb3JtKToKKyAgICAgICAgaWYgc3lzX3BsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgICAgICAg
ICAgcmV0dXJuICdtYWMnCisgICAgICAgIGlmIHN5c19wbGF0Zm9ybS5zdGFydHN3aXRoKCdsaW51
eCcpOgorICAgICAgICAgICAgcmV0dXJuICdsaW51eCcKKyAgICAgICAgaWYgc3lzX3BsYXRmb3Jt
IGluICgnd2luMzInLCAnY3lnd2luJyk6CisgICAgICAgICAgICByZXR1cm4gJ3dpbicKKyAgICAg
ICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ3VucmVjb2duaXplZCBwbGF0Zm9ybSBzdHJpbmcgIiVz
IicgJSBzeXNfcGxhdGZvcm0pCisKKyAgICBkZWYgX2RldGVybWluZV9tYWNfdmVyc2lvbihzZWxm
LCBtYWNfdmVyc2lvbl9zdHJpbmcpOgorICAgICAgICByZWxlYXNlX3ZlcnNpb24gPSBtYWNfdmVy
c2lvbl9zdHJpbmcuc3BsaXQoJy4nKVsxXQorICAgICAgICB2ZXJzaW9uX3N0cmluZ3MgPSB7Cisg
ICAgICAgICAgICAnNSc6ICdsZW9wYXJkJywKKyAgICAgICAgICAgICc2JzogJ3Nub3dsZW9wYXJk
JywKKyAgICAgICAgICAgICc3JzogJ2xpb24nLAorICAgICAgICB9CisgICAgICAgICMgRklYTUU6
IFNob3VsZCB0aGlzIHJvdXRpbmUgZW5mb3JjZSBtaW5pbXVtIHZlcnNpb25zIGFuZCBoYW5kbGUg
J2Z1dHVyZScsIG9yIGxldCBjYWxsZXJzIGRvIHRoYXQ/CisgICAgICAgIGFzc2VydCByZWxlYXNl
X3ZlcnNpb24gPj0gbWluKHZlcnNpb25fc3RyaW5ncy5rZXlzKCkpCisgICAgICAgIHJldHVybiB2
ZXJzaW9uX3N0cmluZ3MuZ2V0KHJlbGVhc2VfdmVyc2lvbiwgJ2Z1dHVyZScpCisKKyAgICBkZWYg
X2RldGVybWluZV9saW51eF92ZXJzaW9uKHNlbGYpOgorICAgICAgICAjIEZJWE1FOiB3ZSBpZ25v
cmUgd2hhdGV2ZXIgdGhlIHJlYWwgdmVyc2lvbiBpcyBhbmQgcHJldGVuZCBpdCdzIGx1Y2lkIGZv
ciBub3cuCisgICAgICAgIHJldHVybiAnbHVjaWQnCisKKyAgICBkZWYgX2RldGVybWluZV93aW5f
dmVyc2lvbihzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihzeXMsICdnZXR3aW5kb3dzdmVyc2lv
bicpOgorICAgICAgICAgICAgd2luX3ZlcnNpb25fdHVwbGUgPSBzeXMuZ2V0d2luZG93c3ZlcnNp
b24oKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBOb3RlIHRoYXQgdGhpcyBzaG91bGQg
b25seSBldmVyIGJlIGNhbGxlZCBvbiB3aW5kb3dzLCBzbyB0aGlzIHNob3VsZCBhbHdheXMgd29y
ay4KKyAgICAgICAgICAgIHZlcl9vdXRwdXQgPSBzZWxmLl9leGVjdXRpdmUucnVuX2NvbW1hbmQo
WydjbWQnLCAnL2MnLCAndmVyJ10pCisgICAgICAgICAgICBtYXRjaF9vYmplY3QgPSByZS5zZWFy
Y2gocicoP1A8bWFqb3I+XGQpXC4oP1A8bWlub3I+XGQpXC4oP1A8YnVpbGQ+XGQrKScsIHZlcl9v
dXRwdXQpCisgICAgICAgICAgICBhc3NlcnQgbWF0Y2hfb2JqZWN0LCAnY21kIHJldHVybmVkIGFu
IHVuZXhwZWN0ZWQgdmVyc2lvbiBzdHJpbmc6ICcgKyB2ZXJfb3V0cHV0CisgICAgICAgICAgICB3
aW5fdmVyc2lvbl90dXBsZSA9IHR1cGxlKG1hcChpbnQsIG1hdGNoX29iamVjdC5ncm91cHMoKSkp
CisKKyAgICAgICAgaWYgd2luX3ZlcnNpb25fdHVwbGVbOjNdID09ICg2LCAxLCA3NjAwKToKKyAg
ICAgICAgICAgIHJldHVybiAnN3NwMCcKKyAgICAgICAgaWYgd2luX3ZlcnNpb25fdHVwbGVbOjJd
ID09ICg2LCAwKToKKyAgICAgICAgICAgIHJldHVybiAndmlzdGEnCisgICAgICAgIGlmIHdpbl92
ZXJzaW9uX3R1cGxlWzoyXSA9PSAoNSwgMSk6CisgICAgICAgICAgICByZXR1cm4gJ3hwJworICAg
ICAgICBhc3NlcnQgd2luX3ZlcnNpb25fdHVwbGVbMF0gPiA2IG9yIHdpbl92ZXJzaW9uX3R1cGxl
WzFdID49IDEsICdVbnJlY29nbml6ZWQgV2luZG93cyB2ZXJzaW9uIHR1cGxlOiAiJXMiJyAlICh3
aW5fdmVyc2lvbl90dXBsZSwpCisgICAgICAgIHJldHVybiAnZnV0dXJlJworCiAgICAgZGVmIGRp
c3BsYXlfbmFtZShzZWxmKToKICAgICAgICAgIyBwbGF0Zm9ybS5wbGF0Zm9ybSgpIHJldHVybnMg
RGFyd2luIGluZm9ybWF0aW9uIGZvciBNYWMsIHdoaWNoIGlzIGp1c3QgY29uZnVzaW5nLgotICAg
ICAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAiRGFyd2luIjoKKyAgICAgICAgaWYgc2VsZi5v
c19uYW1lID09ICdtYWMnOgogICAgICAgICAgICAgcmV0dXJuICJNYWMgT1MgWCAlcyIgJSBwbGF0
Zm9ybS5tYWNfdmVyKClbMF0KIAogICAgICAgICAjIFJldHVybnMgc3RyaW5ncyBsaWtlOgpAQCAt
NDYsMjMgKzk4LDIzIEBAIGNsYXNzIFBsYXRmb3JtSW5mbyhvYmplY3QpOgogICAgICAgICByZXR1
cm4gcGxhdGZvcm0ucGxhdGZvcm0oKQogCiAgICAgZGVmIHRvdGFsX2J5dGVzX21lbW9yeShzZWxm
KToKLSAgICAgICAgc3lzdGVtX25hbWUgPSBwbGF0Zm9ybS5zeXN0ZW0oKQotICAgICAgICBpZiBz
eXN0ZW1fbmFtZSA9PSAiRGFyd2luIjoKKyAgICAgICAgaWYgc2VsZi5vc19uYW1lID09ICdtYWMn
OgogICAgICAgICAgICAgcmV0dXJuIGludChzZWxmLl9leGVjdXRpdmUucnVuX2NvbW1hbmQoWyJz
eXNjdGwiLCAiLW4iLCAiaHcubWVtc2l6ZSJdKSkKICAgICAgICAgcmV0dXJuIE5vbmUKIAogICAg
IGRlZiBfY29tcHV0ZV9ieXRlc19mcm9tX3ZtX3N0YXRfb3V0cHV0KHNlbGYsIGxhYmVsX3RleHQs
IHZtX3N0YXRfb3V0cHV0KToKICAgICAgICAgcGFnZV9zaXplX21hdGNoID0gcmUuc2VhcmNoKHIi
cGFnZSBzaXplIG9mIChcZCspIGJ5dGVzIiwgdm1fc3RhdF9vdXRwdXQpCiAgICAgICAgIGZyZWVf
cGFnZXNfbWF0Y2ggPSByZS5zZWFyY2gociIlczpccysoXGQrKS4iICUgbGFiZWxfdGV4dCwgdm1f
c3RhdF9vdXRwdXQpCi0gICAgICAgIGlmIG5vdCBwYWdlX3NpemVfbWF0Y2ggb3Igbm90IGZyZWVf
cGFnZXNfbWF0Y2g6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgICMgRmFpbCBo
YXJkIGlmIHZtc3RhdCdzIG91dHB1dCBpc24ndCB3aGF0IHdlIGV4cGVjdC4KKyAgICAgICAgYXNz
ZXJ0KHBhZ2Vfc2l6ZV9tYXRjaCBhbmQgZnJlZV9wYWdlc19tYXRjaCkKKwogICAgICAgICBmcmVl
X3BhZ2VfY291bnQgPSBpbnQoZnJlZV9wYWdlc19tYXRjaC5ncm91cCgxKSkKICAgICAgICAgcGFn
ZV9zaXplID0gaW50KHBhZ2Vfc2l6ZV9tYXRjaC5ncm91cCgxKSkKICAgICAgICAgcmV0dXJuIGZy
ZWVfcGFnZV9jb3VudCAqIHBhZ2Vfc2l6ZQogCiAgICAgZGVmIGZyZWVfYnl0ZXNfbWVtb3J5KHNl
bGYpOgotICAgICAgICBzeXN0ZW1fbmFtZSA9IHBsYXRmb3JtLnN5c3RlbSgpCi0gICAgICAgIGlm
IHN5c3RlbV9uYW1lID09ICJEYXJ3aW4iOgorICAgICAgICBpZiBzZWxmLm9zX25hbWUgPT0gJ21h
Yyc6CiAgICAgICAgICAgICB2bV9zdGF0X291dHB1dCA9IHNlbGYuX2V4ZWN1dGl2ZS5ydW5fY29t
bWFuZChbInZtX3N0YXQiXSkKICAgICAgICAgICAgIGZyZWVfYnl0ZXMgPSBzZWxmLl9jb21wdXRl
X2J5dGVzX2Zyb21fdm1fc3RhdF9vdXRwdXQoIlBhZ2VzIGZyZWUiLCB2bV9zdGF0X291dHB1dCkK
ICAgICAgICAgICAgICMgUGVyIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD03NDY1MCBpbmNsdWRlIGluYWN0aXZlIG1lbW9yeSBzaW5jZSB0aGUgT1MgaXMgbGF6eSBhYm91
dCBmcmVlaW5nIG1lbW9yeS4KZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29t
bW9uL3N5c3RlbS9wbGF0Zm9ybWluZm9fdW5pdHRlc3QucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtp
dHB5L2NvbW1vbi9zeXN0ZW0vcGxhdGZvcm1pbmZvX3VuaXR0ZXN0LnB5Cm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjNi
MDU4NzU3YjUyMDM0OGMyNTIwMzFjNjZmNjZhOTgzY2U3ZTRlZWMKLS0tIC9kZXYvbnVsbAorKysg
Yi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vcGxhdGZvcm1pbmZvX3VuaXR0
ZXN0LnB5CkBAIC0wLDAgKzEsMTQ3IEBACisjIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQor
IyBtZXQ6CisjCisjICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAqIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgor
IyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2ds
ZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0
byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdh
cmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklC
VVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVS
IE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworaW1wb3J0IHN5cworaW1w
b3J0IHVuaXR0ZXN0CisKK2Zyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS5leGVjdXRpdmUgaW1w
b3J0IEV4ZWN1dGl2ZQorZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVtLmV4ZWN1dGl2ZV9tb2Nr
IGltcG9ydCBNb2NrRXhlY3V0aXZlLCBNb2NrRXhlY3V0aXZlMgorZnJvbSB3ZWJraXRweS5jb21t
b24uc3lzdGVtLnBsYXRmb3JtaW5mbyBpbXBvcnQgUGxhdGZvcm1JbmZvCisKKworY2xhc3MgVGVz
dFBsYXRmb3JtSW5mbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIG1ha2VfaW5mbyhzZWxm
LCBleGVjdXRpdmU9Tm9uZSwgZXhlY3V0aXZlX291dHB1dD1Ob25lKToKKyAgICAgICAgZGVmIG1v
Y2tfcnVuX2NvbW1hbmQoY21kKToKKyAgICAgICAgICAgIHJldHVybiBleGVjdXRpdmVfb3V0cHV0
CisgICAgICAgIHJldHVybiBQbGF0Zm9ybUluZm8oZXhlY3V0aXZlIG9yIE1vY2tFeGVjdXRpdmUy
KHJ1bl9jb21tYW5kX2ZuPW1vY2tfcnVuX2NvbW1hbmQpKQorCisgICAgZGVmIHNldFVwKHNlbGYp
OgorICAgICAgICBzZWxmLnN5c19wbGF0Zm9ybSA9IHN5cy5wbGF0Zm9ybQorICAgICAgICBzZWxm
LmdldHdpbmRvd3N2ZXJzaW9uID0gTm9uZQorICAgICAgICBpZiBoYXNhdHRyKHN5cywgJ2dldHdp
bmRvd3N2ZXJzaW9uJyk6CisgICAgICAgICAgICBzZWxmLmdldHdpbmRvd3N2ZXJzaW9uID0gZ2V0
YXR0cihzeXMsICdnZXR3aW5kb3dzdmVyc2lvbicpCisgICAgICAgICAgICBkZWwgc3lzLmdldHdp
bmRvd3N2ZXJzaW9uCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHN5cy5wbGF0
Zm9ybSA9IHNlbGYuc3lzX3BsYXRmb3JtCisgICAgICAgIGlmIHNlbGYuZ2V0d2luZG93c3ZlcnNp
b246CisgICAgICAgICAgICBzeXMuZ2V0d2luZG93c3ZlcnNpb24gPSBzZWxmLmdldHdpbmRvd3N2
ZXJzaW9uCisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgZm9yIHBsYXRmb3Jt
IGluICgnY3lnd2luJywgJ2RhcndpbicsICdsaW51eDInLCAnbGludXgzJywgJ3dpbjMyJyk6Cisg
ICAgICAgICAgICBzeXMucGxhdGZvcm0gPSBwbGF0Zm9ybQorICAgICAgICAgICAgaW5mbyA9IHNl
bGYubWFrZV9pbmZvKGV4ZWN1dGl2ZV9vdXRwdXQ9JzYuMS43NjAwJykKKyAgICAgICAgICAgIHNl
bGYuYXNzZXJ0Tm90RXF1YWxzKGluZm8ub3NfbmFtZSwgJycpCisgICAgICAgICAgICBzZWxmLmFz
c2VydE5vdEVxdWFscyhpbmZvLm9zX3ZlcnNpb24sICcnKQorCisgICAgZGVmIGludGVncmF0aW9u
X3Rlc3RfYmFzaWMoc2VsZik6CisgICAgICAgIHN5cy5nZXR3aW5kb3dzdmVyc2lvbiA9IHNlbGYu
Z2V0d2luZG93c3ZlcnNpb24KKyAgICAgICAgaW5mbyA9IFBsYXRmb3JtSW5mbyhFeGVjdXRpdmUo
KSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbHMoaW5mby5vc19uYW1lLCAnJykKKyAgICAg
ICAgc2VsZi5hc3NlcnROb3RFcXVhbHMoaW5mby5vc192ZXJzaW9uLCAnJykKKworICAgIGRlZiB0
ZXN0X2Rpc3BsYXlfbmFtZV9tYWMoc2VsZik6CisgICAgICAgIHN5cy5wbGF0Zm9ybSA9ICdkYXJ3
aW4nCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWxzKHNlbGYubWFrZV9pbmZvKGV4ZWN1dGl2
ZV9vdXRwdXQ9JzcuMS43NjAwJykuZGlzcGxheV9uYW1lKCksICcnKQorCisgICAgZGVmIHRlc3Rf
ZGlzcGxheV9uYW1lX3dpbjMyKHNlbGYpOgorICAgICAgICBzeXMucGxhdGZvcm0gPSAnd2luMzIn
CisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWxzKHNlbGYubWFrZV9pbmZvKGV4ZWN1dGl2ZV9v
dXRwdXQ9JzcuMS43NjAwJykuZGlzcGxheV9uYW1lKCksICcnKQorCisgICAgZGVmIHRlc3RfbWVt
b3J5X21hYyhzZWxmKToKKyAgICAgICAgc3lzLnBsYXRmb3JtID0gJ2RhcndpbicKKyAgICAgICAg
c2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5tYWtlX2luZm8oZXhlY3V0aXZlX291dHB1dD0nMTIzNCcp
LnRvdGFsX2J5dGVzX21lbW9yeSgpLCAxMjM0KQorICAgICAgICB2bXN0YXRfb3V0cHV0ID0gKCJN
YWNoIFZpcnR1YWwgTWVtb3J5IFN0YXRpc3RpY3M6IChwYWdlIHNpemUgb2YgNDA5NiBieXRlcylc
biIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiUGFnZXMgZnJlZTogICAgICAgICAgICAgICAg
ICAgICAgICAxLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJQYWdlcyBpbmFjdGl2ZTog
ICAgICAgICAgICAgICAgICAgIDEuXG4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxm
Lm1ha2VfaW5mbyhleGVjdXRpdmVfb3V0cHV0PXZtc3RhdF9vdXRwdXQpLmZyZWVfYnl0ZXNfbWVt
b3J5KCksIDgxOTIpCisKKyAgICBkZWYgdGVzdF9tZW1vcnlfd2luMzIoc2VsZik6CisgICAgICAg
IHN5cy5wbGF0Zm9ybSA9ICd3aW4zMicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5t
YWtlX2luZm8oZXhlY3V0aXZlX291dHB1dD0nNi4xLjc2MDAnKS50b3RhbF9ieXRlc19tZW1vcnko
KSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5tYWtlX2luZm8oZXhlY3V0
aXZlX291dHB1dD0nNi4xLjc2MDAnKS5mcmVlX2J5dGVzX21lbW9yeSgpLCBOb25lKQorCisgICAg
ZGVmIHRlc3RfZGV0ZXJtaW5lX29zX25hbWUoc2VsZik6CisgICAgICAgIGluZm8gPSBzZWxmLm1h
a2VfaW5mbygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGluZm8uX2RldGVybWluZV9vc19u
YW1lKCdkYXJ3aW4nKSwgJ21hYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGluZm8uX2Rl
dGVybWluZV9vc19uYW1lKCdsaW51eDInKSwgJ2xpbnV4JykKKyAgICAgICAgc2VsZi5hc3NlcnRF
cXVhbHMoaW5mby5fZGV0ZXJtaW5lX29zX25hbWUoJ2xpbnV4MycpLCAnbGludXgnKQorICAgICAg
ICBzZWxmLmFzc2VydEVxdWFscyhpbmZvLl9kZXRlcm1pbmVfb3NfbmFtZSgnd2luMzInKSwgJ3dp
bicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGluZm8uX2RldGVybWluZV9vc19uYW1lKCdj
eWd3aW4nKSwgJ3dpbicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9y
LCBpbmZvLl9kZXRlcm1pbmVfb3NfbmFtZSwgJ3ZtcycpCisKKyAgICBkZWYgdGVzdF9kZXRlcm1p
bmVfbWFjX3ZlcnNpb24oc2VsZik6CisgICAgICAgIGluZm8gPSBzZWxmLm1ha2VfaW5mbygpCisg
ICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGluZm8uX2RldGVybWluZV9tYWNfdmVyc2lvbignMTAu
NS4xJyksICdsZW9wYXJkJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaW5mby5fZGV0ZXJt
aW5lX21hY192ZXJzaW9uKCcxMC42LjEnKSwgJ3Nub3dsZW9wYXJkJykKKyAgICAgICAgc2VsZi5h
c3NlcnRFcXVhbHMoaW5mby5fZGV0ZXJtaW5lX21hY192ZXJzaW9uKCcxMC43LjEnKSwgJ2xpb24n
KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhpbmZvLl9kZXRlcm1pbmVfbWFjX3ZlcnNpb24o
JzEwLjguMCcpLCAnZnV0dXJlJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9u
RXJyb3IsIGluZm8uX2RldGVybWluZV9tYWNfdmVyc2lvbiwgJzEwLjQuMycpCisKKyAgICBkZWYg
dGVzdF9kZXRlcm1pbmVfbGludXhfdmVyc2lvbihzZWxmKToKKyAgICAgICAgaW5mbyA9IHNlbGYu
bWFrZV9pbmZvKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaW5mby5fZGV0ZXJtaW5lX2xp
bnV4X3ZlcnNpb24oKSwgJ2x1Y2lkJykKKworICAgIGRlZiB0ZXN0X2RldGVybWluZV93aW5fdmVy
c2lvbl9mcm9tX3R1cGxlKHNlbGYpOgorICAgICAgICBpbmZvID0gc2VsZi5tYWtlX2luZm8oKQor
ICAgICAgICBzeXMuZ2V0d2luZG93c3ZlcnNpb24gPSBsYW1iZGE6ICg2LCAyLCAxMjM0KQorICAg
ICAgICBzZWxmLmFzc2VydEVxdWFscyhpbmZvLl9kZXRlcm1pbmVfd2luX3ZlcnNpb24oKSwgJ2Z1
dHVyZScpCisgICAgICAgIHN5cy5nZXR3aW5kb3dzdmVyc2lvbiA9IGxhbWJkYTogKDYsIDEsIDc2
MDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGluZm8uX2RldGVybWluZV93aW5fdmVyc2lv
bigpLCAnN3NwMCcpCisgICAgICAgIHN5cy5nZXR3aW5kb3dzdmVyc2lvbiA9IGxhbWJkYTogKDYs
IDAsIDEyMzQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGluZm8uX2RldGVybWluZV93aW5f
dmVyc2lvbigpLCAndmlzdGEnKQorICAgICAgICBzeXMuZ2V0d2luZG93c3ZlcnNpb24gPSBsYW1i
ZGE6ICg1LCAxLCAxMjM0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhpbmZvLl9kZXRlcm1p
bmVfd2luX3ZlcnNpb24oKSwgJ3hwJykKKyAgICAgICAgc3lzLmdldHdpbmRvd3N2ZXJzaW9uID0g
bGFtYmRhOiAoNSwgMCwgMTIzNCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9u
RXJyb3IsIGluZm8uX2RldGVybWluZV93aW5fdmVyc2lvbikKKworICAgICAgICAjIHRlYXJEb3du
KCkgd2lsbCByZXN0b3JlIHRoZSBub3JtYWwgdmVyc2lvbiwgaWYgYW55LgorICAgICAgICBkZWwg
c3lzLmdldHdpbmRvd3N2ZXJzaW9uCisKKyAgICBkZWYgdGVzdF9kZXRlcm1pbmVfd2luX3ZlcnNp
b25fZnJvbV9jbWQoc2VsZik6CisgICAgICAgIGluZm8gPSBzZWxmLm1ha2VfaW5mbyhleGVjdXRp
dmVfb3V0cHV0PSc2LjIuMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGluZm8uX2RldGVy
bWluZV93aW5fdmVyc2lvbigpLCAnZnV0dXJlJykKKworICAgICAgICBpbmZvID0gc2VsZi5tYWtl
X2luZm8oZXhlY3V0aXZlX291dHB1dD0nNi4xLjc2MDAnKQorICAgICAgICBzZWxmLmFzc2VydEVx
dWFscyhpbmZvLl9kZXRlcm1pbmVfd2luX3ZlcnNpb24oKSwgJzdzcDAnKQorCisgICAgICAgIGlu
Zm8gPSBzZWxmLm1ha2VfaW5mbyhleGVjdXRpdmVfb3V0cHV0PSc2LjAuMTIzNCcpCisgICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWxzKGluZm8uX2RldGVybWluZV93aW5fdmVyc2lvbigpLCAndmlzdGEn
KQorCisgICAgICAgIGluZm8gPSBzZWxmLm1ha2VfaW5mbyhleGVjdXRpdmVfb3V0cHV0PSc1LjEu
MTIzNCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGluZm8uX2RldGVybWluZV93aW5fdmVy
c2lvbigpLCAneHAnKQorCisgICAgICAgIGluZm8gPSBzZWxmLm1ha2VfaW5mbyhleGVjdXRpdmVf
b3V0cHV0PSc1LjAuMTIzNCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVy
cm9yLCBpbmZvLl9kZXRlcm1pbmVfd2luX3ZlcnNpb24pCisKKyAgICAgICAgaW5mbyA9IHNlbGYu
bWFrZV9pbmZvKGV4ZWN1dGl2ZV9vdXRwdXQ9J2JhZCBvdXRwdXQnKQorICAgICAgICBzZWxmLmFz
c2VydFJhaXNlcyhBc3NlcnRpb25FcnJvciwgaW5mby5fZGV0ZXJtaW5lX3dpbl92ZXJzaW9uKQor
CitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQorICAgIHBy
aW50ICJzeXMucGxhdGZvcm0gPSAiICsgc3lzLnBsYXRmb3JtKCkKZGlmZiAtLWdpdCBhL1Rvb2xz
L1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvYXBwbGUucHkgYi9Ub29scy9TY3Jp
cHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2FwcGxlLnB5CmluZGV4IDI5Y2E5ODdiNWM4
YmJmMTM0NDE0ZWRlZTNlMTM4YTA4OGY2MDdjMjkuLjAyMjlmN2UyMWQ0OWZlYWQyNzIyYmY2NDMw
MjdkNzQ3M2M3NjE1ZDYgMTAwNjQ0Ci0tLSBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0
X3Rlc3RzL3BvcnQvYXBwbGUucHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRf
dGVzdHMvcG9ydC9hcHBsZS5weQpAQCAtNjcsNiArNjcsNyBAQCBjbGFzcyBBcHBsZVBvcnQoV2Vi
S2l0UG9ydCk6CiAgICAgICAgICAgICBzZWxmLnNldF9vcHRpb25fZGVmYXVsdCgnd2Via2l0X3Rl
c3RfcnVubmVyJywgVHJ1ZSkKIAogICAgICAgICBpZiBwb3J0X25hbWUgPT0gc2VsZi5wb3J0X25h
bWU6CisgICAgICAgICAgICAjIEZJWE1FOiBVc2UgaG9zdC5wbGF0Zm9ybWluZm8ub3NfdmVyc2lv
biBpbnN0ZWFkLgogICAgICAgICAgICAgc2VsZi5fdmVyc2lvbiA9IHNlbGYuX2RldGVjdF92ZXJz
aW9uKG9zX3ZlcnNpb25fc3RyaW5nKSBvciBzZWxmLkZVVFVSRV9WRVJTSU9OCiAgICAgICAgICAg
ICBzZWxmLl9uYW1lID0gc2VsZi5wb3J0X25hbWUgKyAnLScgKyBzZWxmLl92ZXJzaW9uCiAgICAg
ICAgIGVsc2U6CmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0
cy9wb3J0L2Nocm9taXVtX21hYy5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rl
c3RzL3BvcnQvY2hyb21pdW1fbWFjLnB5CmluZGV4IGY2N2ZhZjNjMTU4YTM5MGFlNjcwNDdlODYz
MjRlNjY0Y2NlYjM4ZWMuLmMxN2FiM2UxMzUyM2I2ZjU5NmMxYzFiM2U0ZDg5YzE5ZDhiNjRiYTEg
MTAwNjQ0Ci0tLSBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvY2hy
b21pdW1fbWFjLnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3Bv
cnQvY2hyb21pdW1fbWFjLnB5CkBAIC04Myw2ICs4Myw3IEBAIGNsYXNzIENocm9taXVtTWFjUG9y
dChjaHJvbWl1bS5DaHJvbWl1bVBvcnQpOgogICAgICAgICBwb3J0X25hbWUgPSBwb3J0X25hbWUg
b3IgJ2Nocm9taXVtLW1hYycKICAgICAgICAgY2hyb21pdW0uQ2hyb21pdW1Qb3J0Ll9faW5pdF9f
KHNlbGYsIGhvc3QsIHBvcnRfbmFtZT1wb3J0X25hbWUsICoqa3dhcmdzKQogICAgICAgICBpZiBw
b3J0X25hbWUuZW5kc3dpdGgoJy1tYWMnKToKKyAgICAgICAgICAgICMgRklYTUU6IFVzZSBob3N0
LnBsYXRmb3JtaW5mby5vc192ZXJzaW9uIGluc3RlYWQuCiAgICAgICAgICAgICBzZWxmLl92ZXJz
aW9uID0gbWFjLm9zX3ZlcnNpb24ob3NfdmVyc2lvbl9zdHJpbmcsIHNlbGYuU1VQUE9SVEVEX09T
X1ZFUlNJT05TKQogICAgICAgICAgICAgc2VsZi5fbmFtZSA9IHBvcnRfbmFtZSArICctJyArIHNl
bGYuX3ZlcnNpb24KICAgICAgICAgZWxzZToKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvbWFjLnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9s
YXlvdXRfdGVzdHMvcG9ydC9tYWMucHkKaW5kZXggOTM4NTViODc1OWFjYTljZWZkNzU0NTZkYjE4
YmY4OGM3ZTI0YzlmZS4uNDYxYzI1N2YyZTkwNjQ5YjJiYTQ2MjQ0YWI5MjY4NTk4MTMxMWI1NCAx
MDA2NDQKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9tYWMu
cHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9tYWMucHkK
QEAgLTM2LDcgKzM2LDcgQEAgZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVzdHMucG9ydC5sZWFrZGV0
ZWN0b3IgaW1wb3J0IExlYWtEZXRlY3RvcgogCiBfbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoX19u
YW1lX18pCiAKLQorIyBGSVhNRTogRGVsZXRlIHRoaXMgd2hlbiB3ZSBzd2l0Y2ggdG8gdXNpbmcg
aG9zdC5wbGF0Zm9ybWluZm8ub3NfdmVyc2lvbiBpbnN0ZWFkLgogZGVmIG9zX3ZlcnNpb24ob3Nf
dmVyc2lvbl9zdHJpbmc9Tm9uZSwgc3VwcG9ydGVkX3ZlcnNpb25zPU5vbmUpOgogICAgIGlmIG5v
dCBvc192ZXJzaW9uX3N0cmluZzoKICAgICAgICAgaWYgaGFzYXR0cihwbGF0Zm9ybSwgJ21hY192
ZXInKSBhbmQgcGxhdGZvcm0ubWFjX3ZlcigpWzBdOgpAQCAtNjQsNiArNjQsNyBAQCBjbGFzcyBN
YWNQb3J0KEFwcGxlUG9ydCk6CiAgICAgIyBhbmQgdGhlIG9yZGVyIG9mIGZhbGxiYWNrIGJldHdl
ZW4gdGhlbS4gIE1hdGNoZXMgT1JXVC4KICAgICBWRVJTSU9OX0ZBTExCQUNLX09SREVSID0gWyJt
YWMtbGVvcGFyZCIsICJtYWMtc25vd2xlb3BhcmQiLCAibWFjLWxpb24iLCAibWFjIl0KIAorICAg
ICMgRklYTUU6IERlbGV0ZSB0aGlzIHdoZW4gd2Ugc3dpdGNoIHRvIHVzaW5nIGhvc3QucGxhdGZv
cm1pbmZvLm9zX3ZlcnNpb24gaW5zdGVhZC4KICAgICBkZWYgX2RldGVjdF92ZXJzaW9uKHNlbGYs
IG9zX3ZlcnNpb25fc3RyaW5nKToKICAgICAgICAgIyBGSVhNRTogTWFjUG9ydCBhbmQgV2luUG9y
dCBpbXBsZW1lbnQgX2RldGVjdF92ZXJzaW9uIGRpZmZlcmVudGx5LgogICAgICAgICAjIFdpblBv
cnQgdXNlcyBvc192ZXJzaW9uX3N0cmluZyBhcyBhIHJlcGxhY2VtZW50IGZvciBzZWxmLnZlcnNp
b24uCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0
L3dpbi5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvd2luLnB5
CmluZGV4IGVkNzVhNzlkZWI5NmFhNDgwMDIwZGI1MzA2ODRlYTNkYjM5YWViYWQuLjIyNzBkZGVm
MzE5M2U4Yzg2Zjg3ZWRiNzkxNjhmZGVjMzQ3MmJjZmEgMTAwNjQ0Ci0tLSBhL1Rvb2xzL1Njcmlw
dHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvd2luLnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMv
d2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvd2luLnB5CkBAIC00NSw2ICs0NSw3IEBAIGNsYXNz
IFdpblBvcnQoQXBwbGVQb3J0KToKICAgICAjIGFuZCB0aGUgb3JkZXIgb2YgZmFsbGJhY2sgYmV0
d2VlbiB0aGVtLiAgTWF0Y2hlcyBPUldULgogICAgIFZFUlNJT05fRkFMTEJBQ0tfT1JERVIgPSBb
Indpbi14cCIsICJ3aW4tdmlzdGEiLCAid2luLTdzcDAiLCAid2luIl0KIAorICAgICMgRklYTUU6
IFVzZSBob3N0LnBsYXRmb3JtaW5mby5vc192ZXJzaW9uIGluc3RlYWQuCiAgICAgZGVmIF92ZXJz
aW9uX3N0cmluZ19mcm9tX3dpbmRvd3NfdmVyc2lvbl90dXBsZShzZWxmLCB3aW5kb3dzX3ZlcnNp
b25fdHVwbGUpOgogICAgICAgICBpZiB3aW5kb3dzX3ZlcnNpb25fdHVwbGVbOjNdID09ICg2LCAx
LCA3NjAwKToKICAgICAgICAgICAgIHJldHVybiAnN3NwMCcK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>121912</attachid>
            <date>2012-01-10 14:27:48 -0800</date>
            <delta_ts>2012-01-10 14:35:21 -0800</delta_ts>
            <desc>revamp to make it more mockable, add is_mac(), etc.</desc>
            <filename>bug-75931-20120110142747.patch</filename>
            <type>text/plain</type>
            <size>22911</size>
            <attacher name="Dirk Pranke">dpranke</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA0NTI0CmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cg
Yi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggZTkwODcwYzRiMGY1NGY1MWRlNmFmYTMzMzc1OWM2ZmMy
NTU4YjgyZS4uMDFmNTkwZGQ2YmU1M2U2MWFhNzI5M2RiYjAwOGFmNTJmMTEyNmU2OCAxMDA2NDQK
LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDU1
IEBACiAyMDEyLTAxLTA5ICBEaXJrIFByYW5rZSAgPGRwcmFua2VAY2hyb21pdW0ub3JnPgogCisg
ICAgICAgIHdlYmtpdHB5OiBhZGQgb3NfbmFtZSwgb3NfdmVyc2lvbiB0byBwbGF0Zm9ybWluZm8K
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc1OTMxCisK
KyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQXMgYSBmaXJz
dCBzdGVwIGluIGNsZWFuaW5nIHVwIHRoZSB2ZXJzaW9uIHBhcnNpbmcgbG9naWMgaW4KKyAgICAg
ICAgd2Via2l0cHkubGF5b3V0X3Rlc3RzLnBvcnQsIHRoaXMgYWRkcyBjb21tb24gcm91dGluZXMg
Zm9yCisgICAgICAgIGdldHRpbmcgdGhlIG9zX25hbWUgYW5kIG9zX3ZlcnNpb24gZmllbGRzIHRv
IHRoZSBQbGF0Zm9ybUluZm8KKyAgICAgICAgY2xhc3MuIE5vdGhpbmcgdXNlcyB0aGVtIHlldCBi
dXQgSSd2ZSBhZGRlZCBGSVhNRSdzIHRvIHNvbWUgb2YKKyAgICAgICAgdGhlIGNvZGUgdGhhdCBu
ZWVkcyB0byBiZSBkZWxldGVkIGluIHRoZSBwb3J0IGZpbGVzLgorCisgICAgICAgICogU2NyaXB0
cy93ZWJraXRweS9jb21tb24vc3lzdGVtL3BsYXRmb3JtaW5mby5weToKKyAgICAgICAgKFBsYXRm
b3JtSW5mby5fX2luaXRfXyk6CisgICAgICAgIChQbGF0Zm9ybUluZm8pOgorICAgICAgICAoUGxh
dGZvcm1JbmZvLl9kZXRlcm1pbmVfb3NfbmFtZSk6CisgICAgICAgIChQbGF0Zm9ybUluZm8uX2Rl
dGVybWluZV9tYWNfdmVyc2lvbik6CisgICAgICAgIChQbGF0Zm9ybUluZm8uX2RldGVybWluZV9s
aW51eF92ZXJzaW9uKToKKyAgICAgICAgKFBsYXRmb3JtSW5mby5fZGV0ZXJtaW5lX3dpbl92ZXJz
aW9uKToKKyAgICAgICAgKFBsYXRmb3JtSW5mby5kaXNwbGF5X25hbWUpOgorICAgICAgICAoUGxh
dGZvcm1JbmZvLnRvdGFsX2J5dGVzX21lbW9yeSk6CisgICAgICAgIChQbGF0Zm9ybUluZm8uX2Nv
bXB1dGVfYnl0ZXNfZnJvbV92bV9zdGF0X291dHB1dCk6CisgICAgICAgIChQbGF0Zm9ybUluZm8u
ZnJlZV9ieXRlc19tZW1vcnkpOgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5
c3RlbS9wbGF0Zm9ybWluZm9fdW5pdHRlc3QucHk6IEFkZGVkLgorICAgICAgICAoVGVzdFBsYXRm
b3JtSW5mbyk6CisgICAgICAgIChUZXN0UGxhdGZvcm1JbmZvLm1ha2VfaW5mbyk6CisgICAgICAg
IChUZXN0UGxhdGZvcm1JbmZvLm1ha2VfaW5mby5tb2NrX3J1bl9jb21tYW5kKToKKyAgICAgICAg
KFRlc3RQbGF0Zm9ybUluZm8uc2V0VXApOgorICAgICAgICAoVGVzdFBsYXRmb3JtSW5mby50ZWFy
RG93bik6CisgICAgICAgIChUZXN0UGxhdGZvcm1JbmZvLnRlc3RfYmFzaWMpOgorICAgICAgICAo
VGVzdFBsYXRmb3JtSW5mby5pbnRlZ3JhdGlvbl90ZXN0X2Jhc2ljKToKKyAgICAgICAgKFRlc3RQ
bGF0Zm9ybUluZm8udGVzdF9kaXNwbGF5X25hbWVfbWFjKToKKyAgICAgICAgKFRlc3RQbGF0Zm9y
bUluZm8udGVzdF9kaXNwbGF5X25hbWVfd2luMzIpOgorICAgICAgICAoVGVzdFBsYXRmb3JtSW5m
by50ZXN0X21lbW9yeV9tYWMpOgorICAgICAgICAoVGVzdFBsYXRmb3JtSW5mby50ZXN0X21lbW9y
eV93aW4zMik6CisgICAgICAgIChUZXN0UGxhdGZvcm1JbmZvLnRlc3RfZGV0ZXJtaW5lX29zX25h
bWUpOgorICAgICAgICAoVGVzdFBsYXRmb3JtSW5mby50ZXN0X2RldGVybWluZV9tYWNfdmVyc2lv
bik6CisgICAgICAgIChUZXN0UGxhdGZvcm1JbmZvLnRlc3RfZGV0ZXJtaW5lX2xpbnV4X3ZlcnNp
b24pOgorICAgICAgICAoVGVzdFBsYXRmb3JtSW5mby50ZXN0X2RldGVybWluZV93aW5fdmVyc2lv
bl9mcm9tX3R1cGxlKToKKyAgICAgICAgKFRlc3RQbGF0Zm9ybUluZm8udGVzdF9kZXRlcm1pbmVf
d2luX3ZlcnNpb25fZnJvbV9jbWQpOgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0
X3Rlc3RzL3BvcnQvYXBwbGUucHk6CisgICAgICAgIChBcHBsZVBvcnQuX19pbml0X18pOgorICAg
ICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvY2hyb21pdW1fbWFjLnB5
OgorICAgICAgICAoQ2hyb21pdW1NYWNQb3J0Ll9faW5pdF9fKToKKyAgICAgICAgKiBTY3JpcHRz
L3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L21hYy5weToKKyAgICAgICAgKE1hY1BvcnQpOgor
ICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvd2luLnB5OgorICAg
ICAgICAoV2luUG9ydCk6CisKKzIwMTItMDEtMDkgIERpcmsgUHJhbmtlICA8ZHByYW5rZUBjaHJv
bWl1bS5vcmc+CisKICAgICAgICAgd2Via2l0cHkubGF5b3V0X3Rlc3RzLnBvcnQubW9ja19kcnRf
dW5pdHRlc3QuTW9ja0Nocm9taXVtRFJUVGVzdCBoYXMgYmVlbiBmYWlsaW5nIG9uIGNyLXdpbgog
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU4ODQKIApk
aWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL3BsYXRmb3Jt
aW5mby5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9wbGF0Zm9ybWlu
Zm8ucHkKaW5kZXggNjRlODA1ZGYyNTk0ODM2OGU1ZTFmYTg4ZDY0NzE0MDhhNmRmZGNlMC4uYWQw
OWQwNDBlNGZlYmEyOTgxMjUzN2VmM2YyNzllZTFlOGJiMGJhYiAxMDA2NDQKLS0tIGEvVG9vbHMv
U2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL3BsYXRmb3JtaW5mby5weQorKysgYi9Ub29s
cy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vcGxhdGZvcm1pbmZvLnB5CkBAIC0xLDQg
KzEsNCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyMgQ29weXJpZ2h0IChjKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCiAjCiAjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAogIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0yNiw0NiArMjYsMTE4IEBA
CiAjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQogIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogCi1pbXBvcnQgcGxhdGZvcm0KIGltcG9y
dCByZQogCiAKLSMgV2UgdXNlIHRoaXMgaW5zdGVhZCBvZiBjYWxscyB0byBwbGF0Zm9ybSBkaXJl
Y3RseSB0byBhbGxvdyBtb2NraW5nLgogY2xhc3MgUGxhdGZvcm1JbmZvKG9iamVjdCk6Ci0gICAg
ZGVmIF9faW5pdF9fKHNlbGYsIGV4ZWN1dGl2ZSk6CisgICAgIiIiVGhpcyBjbGFzcyBwcm92aWRl
cyBhIGNvbnNpc3RlbnQgKGFuZCBtb2NrYWJsZSkgaW50ZXJwcmV0YXRpb24gb2YKKyAgICBzeXN0
ZW0tc3BlY2lmaWMgdmFsdWVzIChsaWtlIHN5cy5wbGF0Zm9ybSBhbmQgcGxhdGZvcm0ubWFjX3Zl
cigpKQorICAgIHRvIGJlIHVzZWQgYnkgdGhlIHJlc3Qgb2YgdGhlIHdlYmtpdHB5IGNvZGUgYmFz
ZS4KKworICAgIFB1YmxpYyAoc3RhdGljKSBwcm9wZXJ0aWVzOgorICAgIC0tIG9zX25hbWUKKyAg
ICAtLSBvc192ZXJzaW9uCisKKyAgICBOb3RlIHRoYXQgJ2Z1dHVyZScgaXMgcmV0dXJuZWQgZm9y
IG9zX3ZlcnNpb24gaWYgdGhlIG9wZXJhdGluZyBzeXN0ZW0gaXMKKyAgICBuZXdlciB0aGFuIG9u
ZSBrbm93biB0byB0aGUgY29kZS4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBz
eXNfbW9kdWxlLCBwbGF0Zm9ybV9tb2R1bGUsIGV4ZWN1dGl2ZSk6CiAgICAgICAgIHNlbGYuX2V4
ZWN1dGl2ZSA9IGV4ZWN1dGl2ZQorICAgICAgICBzZWxmLl9wbGF0Zm9ybV9tb2R1bGUgPSBwbGF0
Zm9ybV9tb2R1bGUKKyAgICAgICAgc2VsZi5vc19uYW1lID0gc2VsZi5fZGV0ZXJtaW5lX29zX25h
bWUoc3lzX21vZHVsZS5wbGF0Zm9ybSkKKyAgICAgICAgaWYgc2VsZi5vc19uYW1lID09ICdsaW51
eCc6CisgICAgICAgICAgICBzZWxmLm9zX3ZlcnNpb24gPSBzZWxmLl9kZXRlcm1pbmVfbGludXhf
dmVyc2lvbigpCisgICAgICAgIGlmIHNlbGYub3NfbmFtZS5zdGFydHN3aXRoKCdtYWMnKToKKyAg
ICAgICAgICAgIHNlbGYub3NfdmVyc2lvbiA9IHNlbGYuX2RldGVybWluZV9tYWNfdmVyc2lvbihw
bGF0Zm9ybV9tb2R1bGUubWFjX3ZlcigpWzBdKQorICAgICAgICBpZiBzZWxmLm9zX25hbWUuc3Rh
cnRzd2l0aCgnd2luJyk6CisgICAgICAgICAgICBzZWxmLm9zX3ZlcnNpb24gPSBzZWxmLl9kZXRl
cm1pbmVfd2luX3ZlcnNpb24oc2VsZi5fd2luX3ZlcnNpb25fdHVwbGUoc3lzX21vZHVsZSkpCisK
KyAgICBkZWYgaXNfbWFjKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5vc19uYW1lID09ICdt
YWMnCisKKyAgICBkZWYgaXNfd2luKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5vc19uYW1l
ID09ICd3aW4nCisKKyAgICBkZWYgaXNfbGludXgoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxm
Lm9zX25hbWUgPT0gJ2xpbnV4JwogCiAgICAgZGVmIGRpc3BsYXlfbmFtZShzZWxmKToKICAgICAg
ICAgIyBwbGF0Zm9ybS5wbGF0Zm9ybSgpIHJldHVybnMgRGFyd2luIGluZm9ybWF0aW9uIGZvciBN
YWMsIHdoaWNoIGlzIGp1c3QgY29uZnVzaW5nLgotICAgICAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0o
KSA9PSAiRGFyd2luIjoKLSAgICAgICAgICAgIHJldHVybiAiTWFjIE9TIFggJXMiICUgcGxhdGZv
cm0ubWFjX3ZlcigpWzBdCisgICAgICAgIGlmIHNlbGYub3NfbmFtZSA9PSAnbWFjJzoKKyAgICAg
ICAgICAgIHJldHVybiAiTWFjIE9TIFggJXMiICUgc2VsZi5fcGxhdGZvcm1fbW9kdWxlLm1hY192
ZXIoKVswXQogCiAgICAgICAgICMgUmV0dXJucyBzdHJpbmdzIGxpa2U6CiAgICAgICAgICMgTGlu
dXgtMi42LjE4LTE5NC4zLjEuZWw1LWk2ODYtd2l0aC1yZWRoYXQtNS41LUZpbmFsCiAgICAgICAg
ICMgV2luZG93cy0yMDA4U2VydmVyUjItNi4xLjc2MDAKLSAgICAgICAgcmV0dXJuIHBsYXRmb3Jt
LnBsYXRmb3JtKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3BsYXRmb3JtX21vZHVsZS5wbGF0Zm9y
bSgpCisKKyAgICBkZWYgZnJlZV9ieXRlc19tZW1vcnkoc2VsZik6CisgICAgICAgIGlmIHNlbGYu
aXNfbWFjKCk6CisgICAgICAgICAgICB2bV9zdGF0X291dHB1dCA9IHNlbGYuX2V4ZWN1dGl2ZS5y
dW5fY29tbWFuZChbInZtX3N0YXQiXSkKKyAgICAgICAgICAgIGZyZWVfYnl0ZXMgPSBzZWxmLl9j
b21wdXRlX2J5dGVzX2Zyb21fdm1fc3RhdF9vdXRwdXQoIlBhZ2VzIGZyZWUiLCB2bV9zdGF0X291
dHB1dCkKKyAgICAgICAgICAgICMgUGVyIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD03NDY1MCBpbmNsdWRlIGluYWN0aXZlIG1lbW9yeSBzaW5jZSB0aGUgT1MgaXMgbGF6
eSBhYm91dCBmcmVlaW5nIG1lbW9yeS4KKyAgICAgICAgICAgIGZyZWVfYnl0ZXMgKz0gc2VsZi5f
Y29tcHV0ZV9ieXRlc19mcm9tX3ZtX3N0YXRfb3V0cHV0KCJQYWdlcyBpbmFjdGl2ZSIsIHZtX3N0
YXRfb3V0cHV0KQorICAgICAgICAgICAgcmV0dXJuIGZyZWVfYnl0ZXMKKyAgICAgICAgcmV0dXJu
IE5vbmUKIAogICAgIGRlZiB0b3RhbF9ieXRlc19tZW1vcnkoc2VsZik6Ci0gICAgICAgIHN5c3Rl
bV9uYW1lID0gcGxhdGZvcm0uc3lzdGVtKCkKLSAgICAgICAgaWYgc3lzdGVtX25hbWUgPT0gIkRh
cndpbiI6CisgICAgICAgIGlmIHNlbGYuaXNfbWFjKCk6CiAgICAgICAgICAgICByZXR1cm4gaW50
KHNlbGYuX2V4ZWN1dGl2ZS5ydW5fY29tbWFuZChbInN5c2N0bCIsICItbiIsICJody5tZW1zaXpl
Il0pKQogICAgICAgICByZXR1cm4gTm9uZQogCisgICAgZGVmIF9kZXRlcm1pbmVfb3NfbmFtZShz
ZWxmLCBzeXNfcGxhdGZvcm0pOgorICAgICAgICBpZiBzeXNfcGxhdGZvcm0gPT0gJ2Rhcndpbic6
CisgICAgICAgICAgICByZXR1cm4gJ21hYycKKyAgICAgICAgaWYgc3lzX3BsYXRmb3JtLnN0YXJ0
c3dpdGgoJ2xpbnV4Jyk6CisgICAgICAgICAgICByZXR1cm4gJ2xpbnV4JworICAgICAgICBpZiBz
eXNfcGxhdGZvcm0gaW4gKCd3aW4zMicsICdjeWd3aW4nKToKKyAgICAgICAgICAgIHJldHVybiAn
d2luJworICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigndW5yZWNvZ25pemVkIHBsYXRmb3Jt
IHN0cmluZyAiJXMiJyAlIHN5c19wbGF0Zm9ybSkKKworICAgIGRlZiBfZGV0ZXJtaW5lX21hY192
ZXJzaW9uKHNlbGYsIG1hY192ZXJzaW9uX3N0cmluZyk6CisgICAgICAgIHJlbGVhc2VfdmVyc2lv
biA9IG1hY192ZXJzaW9uX3N0cmluZy5zcGxpdCgnLicpWzFdCisgICAgICAgIHZlcnNpb25fc3Ry
aW5ncyA9IHsKKyAgICAgICAgICAgICc1JzogJ2xlb3BhcmQnLAorICAgICAgICAgICAgJzYnOiAn
c25vd2xlb3BhcmQnLAorICAgICAgICAgICAgJzcnOiAnbGlvbicsCisgICAgICAgIH0KKyAgICAg
ICAgYXNzZXJ0IHJlbGVhc2VfdmVyc2lvbiA+PSBtaW4odmVyc2lvbl9zdHJpbmdzLmtleXMoKSkK
KyAgICAgICAgcmV0dXJuIHZlcnNpb25fc3RyaW5ncy5nZXQocmVsZWFzZV92ZXJzaW9uLCAnZnV0
dXJlJykKKworICAgIGRlZiBfZGV0ZXJtaW5lX2xpbnV4X3ZlcnNpb24oc2VsZik6CisgICAgICAg
ICMgRklYTUU6IHdlIGlnbm9yZSB3aGF0ZXZlciB0aGUgcmVhbCB2ZXJzaW9uIGlzIGFuZCBwcmV0
ZW5kIGl0J3MgbHVjaWQgZm9yIG5vdy4KKyAgICAgICAgcmV0dXJuICdsdWNpZCcKKworICAgIGRl
ZiBfZGV0ZXJtaW5lX3dpbl92ZXJzaW9uKHNlbGYsIHdpbl92ZXJzaW9uX3R1cGxlKToKKyAgICAg
ICAgaWYgd2luX3ZlcnNpb25fdHVwbGVbOjNdID09ICg2LCAxLCA3NjAwKToKKyAgICAgICAgICAg
IHJldHVybiAnN3NwMCcKKyAgICAgICAgaWYgd2luX3ZlcnNpb25fdHVwbGVbOjJdID09ICg2LCAw
KToKKyAgICAgICAgICAgIHJldHVybiAndmlzdGEnCisgICAgICAgIGlmIHdpbl92ZXJzaW9uX3R1
cGxlWzoyXSA9PSAoNSwgMSk6CisgICAgICAgICAgICByZXR1cm4gJ3hwJworICAgICAgICBhc3Nl
cnQgd2luX3ZlcnNpb25fdHVwbGVbMF0gPiA2IG9yIHdpbl92ZXJzaW9uX3R1cGxlWzFdID49IDEs
ICdVbnJlY29nbml6ZWQgV2luZG93cyB2ZXJzaW9uIHR1cGxlOiAiJXMiJyAlICh3aW5fdmVyc2lv
bl90dXBsZSwpCisgICAgICAgIHJldHVybiAnZnV0dXJlJworCisgICAgZGVmIF93aW5fdmVyc2lv
bl90dXBsZShzZWxmLCBzeXNfbW9kdWxlKToKKyAgICAgICAgaWYgaGFzYXR0cihzeXNfbW9kdWxl
LCAnZ2V0d2luZG93c3ZlcnNpb24nKToKKyAgICAgICAgICAgIHJldHVybiBzeXNfbW9kdWxlLmdl
dHdpbmRvd3N2ZXJzaW9uKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3dpbl92ZXJzaW9uX3R1cGxl
X2Zyb21fY21kKCkKKworICAgIGRlZiBfd2luX3ZlcnNpb25fdHVwbGVfZnJvbV9jbWQoc2VsZik6
CisgICAgICAgICMgTm90ZSB0aGF0IHRoaXMgc2hvdWxkIG9ubHkgZXZlciBiZSBjYWxsZWQgb24g
d2luZG93cywgc28gdGhpcyBzaG91bGQgYWx3YXlzIHdvcmsuCisgICAgICAgIHZlcl9vdXRwdXQg
PSBzZWxmLl9leGVjdXRpdmUucnVuX2NvbW1hbmQoWydjbWQnLCAnL2MnLCAndmVyJ10pCisgICAg
ICAgIG1hdGNoX29iamVjdCA9IHJlLnNlYXJjaChyJyg/UDxtYWpvcj5cZClcLig/UDxtaW5vcj5c
ZClcLig/UDxidWlsZD5cZCspJywgdmVyX291dHB1dCkKKyAgICAgICAgYXNzZXJ0IG1hdGNoX29i
amVjdCwgJ2NtZCByZXR1cm5lZCBhbiB1bmV4cGVjdGVkIHZlcnNpb24gc3RyaW5nOiAnICsgdmVy
X291dHB1dAorICAgICAgICByZXR1cm4gdHVwbGUobWFwKGludCwgbWF0Y2hfb2JqZWN0Lmdyb3Vw
cygpKSkKKwogICAgIGRlZiBfY29tcHV0ZV9ieXRlc19mcm9tX3ZtX3N0YXRfb3V0cHV0KHNlbGYs
IGxhYmVsX3RleHQsIHZtX3N0YXRfb3V0cHV0KToKICAgICAgICAgcGFnZV9zaXplX21hdGNoID0g
cmUuc2VhcmNoKHIicGFnZSBzaXplIG9mIChcZCspIGJ5dGVzIiwgdm1fc3RhdF9vdXRwdXQpCiAg
ICAgICAgIGZyZWVfcGFnZXNfbWF0Y2ggPSByZS5zZWFyY2gociIlczpccysoXGQrKS4iICUgbGFi
ZWxfdGV4dCwgdm1fc3RhdF9vdXRwdXQpCi0gICAgICAgIGlmIG5vdCBwYWdlX3NpemVfbWF0Y2gg
b3Igbm90IGZyZWVfcGFnZXNfbWF0Y2g6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAg
ICAgICMgRmFpbCBoYXJkIGlmIHZtc3RhdCdzIG91dHB1dCBpc24ndCB3aGF0IHdlIGV4cGVjdC4K
KyAgICAgICAgYXNzZXJ0KHBhZ2Vfc2l6ZV9tYXRjaCBhbmQgZnJlZV9wYWdlc19tYXRjaCkKKwog
ICAgICAgICBmcmVlX3BhZ2VfY291bnQgPSBpbnQoZnJlZV9wYWdlc19tYXRjaC5ncm91cCgxKSkK
ICAgICAgICAgcGFnZV9zaXplID0gaW50KHBhZ2Vfc2l6ZV9tYXRjaC5ncm91cCgxKSkKICAgICAg
ICAgcmV0dXJuIGZyZWVfcGFnZV9jb3VudCAqIHBhZ2Vfc2l6ZQotCi0gICAgZGVmIGZyZWVfYnl0
ZXNfbWVtb3J5KHNlbGYpOgotICAgICAgICBzeXN0ZW1fbmFtZSA9IHBsYXRmb3JtLnN5c3RlbSgp
Ci0gICAgICAgIGlmIHN5c3RlbV9uYW1lID09ICJEYXJ3aW4iOgotICAgICAgICAgICAgdm1fc3Rh
dF9vdXRwdXQgPSBzZWxmLl9leGVjdXRpdmUucnVuX2NvbW1hbmQoWyJ2bV9zdGF0Il0pCi0gICAg
ICAgICAgICBmcmVlX2J5dGVzID0gc2VsZi5fY29tcHV0ZV9ieXRlc19mcm9tX3ZtX3N0YXRfb3V0
cHV0KCJQYWdlcyBmcmVlIiwgdm1fc3RhdF9vdXRwdXQpCi0gICAgICAgICAgICAjIFBlciBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ2NTAgaW5jbHVkZSBpbmFjdGl2
ZSBtZW1vcnkgc2luY2UgdGhlIE9TIGlzIGxhenkgYWJvdXQgZnJlZWluZyBtZW1vcnkuCi0gICAg
ICAgICAgICBmcmVlX2J5dGVzICs9IHNlbGYuX2NvbXB1dGVfYnl0ZXNfZnJvbV92bV9zdGF0X291
dHB1dCgiUGFnZXMgaW5hY3RpdmUiLCB2bV9zdGF0X291dHB1dCkKLSAgICAgICAgICAgIHJldHVy
biBmcmVlX2J5dGVzCi0gICAgICAgIHJldHVybiBOb25lCmRpZmYgLS1naXQgYS9Ub29scy9TY3Jp
cHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vcGxhdGZvcm1pbmZvX21vY2sucHkgYi9Ub29scy9T
Y3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vcGxhdGZvcm1pbmZvX21vY2sucHkKaW5kZXgg
MTRmZWRkMDYyYjU0M2NmYTk5MDIwNGYwZDE1MmNiNmQ1MDZhMjYxMi4uNzFjM2U4Y2U3ZDBmZWFk
YzI4OTUxMDk0YjM5ZWZlNGI0ZjIyNGI5MSAxMDA2NDQKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9jb21tb24vc3lzdGVtL3BsYXRmb3JtaW5mb19tb2NrLnB5CisrKyBiL1Rvb2xzL1Njcmlw
dHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS9wbGF0Zm9ybWluZm9fbW9jay5weQpAQCAtMjgsNiAr
MjgsMTggQEAKIAogCiBjbGFzcyBNb2NrUGxhdGZvcm1JbmZvKG9iamVjdCk6CisgICAgb3NfbmFt
ZSA9ICdtYWMnCisgICAgb3NfdmVyc2lvbiA9ICdzbm93bGVvcGFyZCcKKworICAgIGRlZiBpc19t
YWMoc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgaXNfbGludXgoc2VsZik6
CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGlzX3dpbmRvd3Moc2VsZik6CisgICAg
ICAgIHJldHVybiBGYWxzZQorCiAgICAgZGVmIGRpc3BsYXlfbmFtZShzZWxmKToKICAgICAgICAg
cmV0dXJuICJNb2NrUGxhdGZvcm0gMS4wIgogCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dl
YmtpdHB5L2NvbW1vbi9zeXN0ZW0vcGxhdGZvcm1pbmZvX3VuaXR0ZXN0LnB5IGIvVG9vbHMvU2Ny
aXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL3BsYXRmb3JtaW5mb191bml0dGVzdC5weQpuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi5hYzljZmIwZDc0NTVlODg4YTRlZDg4MWNkMjYyNmU1MzJjYjkzNzAzCi0tLSAvZGV2
L251bGwKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL3BsYXRmb3Jt
aW5mb191bml0dGVzdC5weQpAQCAtMCwwICsxLDE3NCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTEg
R29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgKiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHly
aWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICogTmVpdGhlciB0aGUgbmFt
ZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5
IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0
aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgor
IworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBB
TkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VM
QVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdI
VAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2ltcG9y
dCBwbGF0Zm9ybQoraW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gd2Via2l0cHku
Y29tbW9uLnN5c3RlbS5leGVjdXRpdmUgaW1wb3J0IEV4ZWN1dGl2ZQorZnJvbSB3ZWJraXRweS5j
b21tb24uc3lzdGVtLmV4ZWN1dGl2ZV9tb2NrIGltcG9ydCBNb2NrRXhlY3V0aXZlLCBNb2NrRXhl
Y3V0aXZlMgorZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVtLnBsYXRmb3JtaW5mbyBpbXBvcnQg
UGxhdGZvcm1JbmZvCisKKworZGVmIGZha2Vfc3lzKHBsYXRmb3JtX3N0cj0nZGFyd2luJywgd2lu
ZG93c192ZXJzaW9uX3R1cGxlPU5vbmUpOgorCisgICAgY2xhc3MgRmFrZVN5c01vZHVsZShvYmpl
Y3QpOgorICAgICAgICBwbGF0Zm9ybSA9IHBsYXRmb3JtX3N0cgorICAgICAgICBpZiB3aW5kb3dz
X3ZlcnNpb25fdHVwbGU6CisgICAgICAgICAgICBnZXR3aW5kb3dzdmVyc2lvbiA9IGxhbWJkYSB4
OiB3aW5kb3dzX3ZlcnNpb25fdHVwbGUKKworICAgIHJldHVybiBGYWtlU3lzTW9kdWxlKCkKKwor
CitkZWYgZmFrZV9wbGF0Zm9ybShtYWNfdmVyc2lvbl9zdHJpbmc9JzEwLjYuMycpOgorCisgICAg
Y2xhc3MgRmFrZVBsYXRmb3JtTW9kdWxlKG9iamVjdCk6CisgICAgICAgIGRlZiBtYWNfdmVyKHNl
bGYpOgorICAgICAgICAgICAgcmV0dXJuIHR1cGxlKFttYWNfdmVyc2lvbl9zdHJpbmcsIHR1cGxl
KFsnJywgJycsICcnXSksICdpMzg2J10pCisKKyAgICAgICAgZGVmIHBsYXRmb3JtKHNlbGYpOgor
ICAgICAgICAgICAgcmV0dXJuICdmb28nCisKKyAgICByZXR1cm4gRmFrZVBsYXRmb3JtTW9kdWxl
KCkKKworCitkZWYgZmFrZV9leGVjdXRpdmUob3V0cHV0PU5vbmUpOgorICAgIGlmIG91dHB1dDoK
KyAgICAgICAgcmV0dXJuIE1vY2tFeGVjdXRpdmUyKG91dHB1dD1vdXRwdXQpCisgICAgcmV0dXJu
IE1vY2tFeGVjdXRpdmUyKGV4Y2VwdGlvbj1TeXN0ZW1FcnJvcikKKworCitjbGFzcyBUZXN0UGxh
dGZvcm1JbmZvKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgbWFrZV9pbmZvKHNlbGYsIHN5
c19tb2R1bGU9Tm9uZSwgcGxhdGZvcm1fbW9kdWxlPU5vbmUsIGV4ZWN1dGl2ZT1Ob25lKToKKyAg
ICAgICAgcmV0dXJuIFBsYXRmb3JtSW5mbyhzeXNfbW9kdWxlIG9yIGZha2Vfc3lzKCksIHBsYXRm
b3JtX21vZHVsZSBvciBmYWtlX3BsYXRmb3JtKCksIGV4ZWN1dGl2ZSBvciBmYWtlX2V4ZWN1dGl2
ZSgpKQorCisgICAgIyBGSVhNRTogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGludGVncmF0aW9uX3Rl
c3RfcmVhbF9jb2RlKCksIGJ1dCBpbnRlZ3JhdGlvbiB0ZXN0cyBhcmVuJ3QKKyAgICAjIHlldCBy
dW4gYnkgZGVmYXVsdCBhbmQgdGhlcmUncyBubyByZWFzb24gbm90IHRvIHJ1biB0aGlzIGV2ZXJ5
d2hlcmUgYnkgZGVmYXVsdC4KKyAgICBkZWYgdGVzdF9yZWFsX2NvZGUoc2VsZik6CisgICAgICAg
ICMgVGhpcyB0ZXN0IG1ha2VzIHN1cmUgdGhlIHJlYWwgKHVubW9ja2VkKSBjb2RlIGFjdHVhbGx5
IHdvcmtzLgorICAgICAgICBpbmZvID0gUGxhdGZvcm1JbmZvKHN5cywgcGxhdGZvcm0sIEV4ZWN1
dGl2ZSgpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFscyhpbmZvLm9zX25hbWUsICcnKQor
ICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFscyhpbmZvLm9zX3ZlcnNpb24sICcnKQorICAgICAg
ICBzZWxmLmFzc2VydE5vdEVxdWFscyhpbmZvLmRpc3BsYXlfbmFtZSgpLCAnJykKKyAgICAgICAg
c2VsZi5hc3NlcnRUcnVlKGluZm8uaXNfbWFjKCkgb3IgaW5mby5pc193aW4oKSBvciBpbmZvLmlz
X2xpbnV4KCkpCisKKyAgICAgICAgaWYgaW5mby5pc19tYWMoKToKKyAgICAgICAgICAgIHNlbGYu
YXNzZXJ0VHJ1ZShpbmZvLnRvdGFsX2J5dGVzX21lbW9yeSgpID4gMCkKKyAgICAgICAgICAgIHNl
bGYuYXNzZXJ0VHJ1ZShpbmZvLmZyZWVfYnl0ZXNfbWVtb3J5KCkgPiAwKQorICAgICAgICBlbHNl
OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaW5mby50b3RhbF9ieXRlc19tZW1vcnko
KSwgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGluZm8uZnJlZV9ieXRlc19t
ZW1vcnkoKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X29zX25hbWVfYW5kX3dyYXBwZXJzKHNlbGYp
OgorICAgICAgICBpbmZvID0gc2VsZi5tYWtlX2luZm8oZmFrZV9zeXMoJ2xpbnV4MicpKQorICAg
ICAgICBzZWxmLmFzc2VydFRydWUoaW5mby5pc19saW51eCgpKQorICAgICAgICBzZWxmLmFzc2Vy
dEZhbHNlKGluZm8uaXNfbWFjKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5mby5pc193
aW4oKSkKKworICAgICAgICBpbmZvID0gc2VsZi5tYWtlX2luZm8oZmFrZV9zeXMoJ2xpbnV4Mycp
KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5mby5pc19saW51eCgpKQorICAgICAgICBzZWxm
LmFzc2VydEZhbHNlKGluZm8uaXNfbWFjKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5m
by5pc193aW4oKSkKKworICAgICAgICBpbmZvID0gc2VsZi5tYWtlX2luZm8oZmFrZV9zeXMoJ2Rh
cndpbicpLCBmYWtlX3BsYXRmb3JtKCcxMC42LjMnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVh
bHMoaW5mby5vc19uYW1lLCAnbWFjJykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbmZvLmlz
X2xpbnV4KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbmZvLmlzX21hYygpKQorICAgICAg
ICBzZWxmLmFzc2VydEZhbHNlKGluZm8uaXNfd2luKCkpCisKKyAgICAgICAgaW5mbyA9IHNlbGYu
bWFrZV9pbmZvKGZha2Vfc3lzKCd3aW4zMicsIHR1cGxlKFs2LCAxLCA3NjAwXSkpKQorICAgICAg
ICBzZWxmLmFzc2VydEVxdWFscyhpbmZvLm9zX25hbWUsICd3aW4nKQorICAgICAgICBzZWxmLmFz
c2VydEZhbHNlKGluZm8uaXNfbGludXgoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbmZv
LmlzX21hYygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5mby5pc193aW4oKSkKKworICAg
ICAgICBpbmZvID0gc2VsZi5tYWtlX2luZm8oZmFrZV9zeXMoJ2N5Z3dpbicpLCBleGVjdXRpdmU9
ZmFrZV9leGVjdXRpdmUoJzYuMS43NjAwJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGlu
Zm8ub3NfbmFtZSwgJ3dpbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5mby5pc19saW51
eCgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGluZm8uaXNfbWFjKCkpCisgICAgICAgIHNl
bGYuYXNzZXJ0VHJ1ZShpbmZvLmlzX3dpbigpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2Vz
KEFzc2VydGlvbkVycm9yLCBzZWxmLm1ha2VfaW5mbywgZmFrZV9zeXMoJ3ZtcycpKQorCisgICAg
ZGVmIHRlc3Rfb3NfdmVyc2lvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXNz
ZXJ0aW9uRXJyb3IsIHNlbGYubWFrZV9pbmZvLCBmYWtlX3N5cygnZGFyd2luJyksIGZha2VfcGxh
dGZvcm0oJzEwLjQuMycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLm1ha2VfaW5m
byhmYWtlX3N5cygnZGFyd2luJyksIGZha2VfcGxhdGZvcm0oJzEwLjUuMScpKS5vc192ZXJzaW9u
LCAnbGVvcGFyZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYubWFrZV9pbmZvKGZh
a2Vfc3lzKCdkYXJ3aW4nKSwgZmFrZV9wbGF0Zm9ybSgnMTAuNi4xJykpLm9zX3ZlcnNpb24sICdz
bm93bGVvcGFyZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYubWFrZV9pbmZvKGZh
a2Vfc3lzKCdkYXJ3aW4nKSwgZmFrZV9wbGF0Zm9ybSgnMTAuNy4xJykpLm9zX3ZlcnNpb24sICds
aW9uJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5tYWtlX2luZm8oZmFrZV9zeXMo
J2RhcndpbicpLCBmYWtlX3BsYXRmb3JtKCcxMC44LjAnKSkub3NfdmVyc2lvbiwgJ2Z1dHVyZScp
CisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5tYWtlX2luZm8oZmFrZV9zeXMoJ2xp
bnV4MicpKS5vc192ZXJzaW9uLCAnbHVjaWQnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2Vz
KEFzc2VydGlvbkVycm9yLCBzZWxmLm1ha2VfaW5mbywgZmFrZV9zeXMoJ3dpbjMyJywgdHVwbGUo
WzUsIDAsIDEyMzRdKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYubWFrZV9pbmZv
KGZha2Vfc3lzKCd3aW4zMicsIHR1cGxlKFs2LCAyLCAxMjM0XSkpKS5vc192ZXJzaW9uLCAnZnV0
dXJlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5tYWtlX2luZm8oZmFrZV9zeXMo
J3dpbjMyJywgdHVwbGUoWzYsIDEsIDc2MDBdKSkpLm9zX3ZlcnNpb24sICc3c3AwJykKKyAgICAg
ICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5tYWtlX2luZm8oZmFrZV9zeXMoJ3dpbjMyJywgdHVw
bGUoWzYsIDAsIDEyMzRdKSkpLm9zX3ZlcnNpb24sICd2aXN0YScpCisgICAgICAgIHNlbGYuYXNz
ZXJ0RXF1YWxzKHNlbGYubWFrZV9pbmZvKGZha2Vfc3lzKCd3aW4zMicsIHR1cGxlKFs1LCAxLCAx
MjM0XSkpKS5vc192ZXJzaW9uLCAneHAnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFz
c2VydGlvbkVycm9yLCBzZWxmLm1ha2VfaW5mbywgZmFrZV9zeXMoJ3dpbjMyJyksIGV4ZWN1dGl2
ZT1mYWtlX2V4ZWN1dGl2ZSgnNS4wLjEyMzQnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMo
c2VsZi5tYWtlX2luZm8oZmFrZV9zeXMoJ2N5Z3dpbicpLCBleGVjdXRpdmU9ZmFrZV9leGVjdXRp
dmUoJzYuMi4xMjM0JykpLm9zX3ZlcnNpb24sICdmdXR1cmUnKQorICAgICAgICBzZWxmLmFzc2Vy
dEVxdWFscyhzZWxmLm1ha2VfaW5mbyhmYWtlX3N5cygnY3lnd2luJyksIGV4ZWN1dGl2ZT1mYWtl
X2V4ZWN1dGl2ZSgnNi4xLjc2MDAnKSkub3NfdmVyc2lvbiwgJzdzcDAnKQorICAgICAgICBzZWxm
LmFzc2VydEVxdWFscyhzZWxmLm1ha2VfaW5mbyhmYWtlX3N5cygnY3lnd2luJyksIGV4ZWN1dGl2
ZT1mYWtlX2V4ZWN1dGl2ZSgnNi4wLjEyMzQnKSkub3NfdmVyc2lvbiwgJ3Zpc3RhJykKKyAgICAg
ICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5tYWtlX2luZm8oZmFrZV9zeXMoJ2N5Z3dpbicpLCBl
eGVjdXRpdmU9ZmFrZV9leGVjdXRpdmUoJzUuMS4xMjM0JykpLm9zX3ZlcnNpb24sICd4cCcpCisK
KyAgICBkZWYgdGVzdF9kaXNwbGF5X25hbWUoc2VsZik6CisgICAgICAgIGluZm8gPSBzZWxmLm1h
a2VfaW5mbyhmYWtlX3N5cygnZGFyd2luJykpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWxz
KGluZm8uZGlzcGxheV9uYW1lKCksICcnKQorCisgICAgICAgIGluZm8gPSBzZWxmLm1ha2VfaW5m
byhmYWtlX3N5cygnd2luMzInLCB0dXBsZShbNiwgMSwgNzYwMF0pKSkKKyAgICAgICAgc2VsZi5h
c3NlcnROb3RFcXVhbHMoaW5mby5kaXNwbGF5X25hbWUoKSwgJycpCisKKyAgICAgICAgaW5mbyA9
IHNlbGYubWFrZV9pbmZvKGZha2Vfc3lzKCdsaW51eDInKSkKKyAgICAgICAgc2VsZi5hc3NlcnRO
b3RFcXVhbHMoaW5mby5kaXNwbGF5X25hbWUoKSwgJycpCisKKyAgICBkZWYgdGVzdF90b3RhbF9i
eXRlc19tZW1vcnkoc2VsZik6CisgICAgICAgIGluZm8gPSBzZWxmLm1ha2VfaW5mbyhmYWtlX3N5
cygnZGFyd2luJyksIGZha2VfcGxhdGZvcm0oJzEwLjYuMycpLCBmYWtlX2V4ZWN1dGl2ZSgnMTIz
NCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhpbmZvLnRvdGFsX2J5dGVzX21lbW9yeSgp
LCAxMjM0KQorCisgICAgICAgIGluZm8gPSBzZWxmLm1ha2VfaW5mbyhmYWtlX3N5cygnd2luMzIn
LCB0dXBsZShbNiwgMSwgNzYwMF0pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaW5mby50
b3RhbF9ieXRlc19tZW1vcnkoKSwgTm9uZSkKKworICAgICAgICBpbmZvID0gc2VsZi5tYWtlX2lu
Zm8oZmFrZV9zeXMoJ2xpbnV4MicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhpbmZvLnRv
dGFsX2J5dGVzX21lbW9yeSgpLCBOb25lKQorCisgICAgZGVmIHRlc3RfZnJlZV9ieXRlc19tZW1v
cnkoc2VsZik6CisgICAgICAgIHZtc3RhdF9vdXRwdXQgPSAoIk1hY2ggVmlydHVhbCBNZW1vcnkg
U3RhdGlzdGljczogKHBhZ2Ugc2l6ZSBvZiA0MDk2IGJ5dGVzKVxuIgorICAgICAgICAgICAgICAg
ICAgICAgICAgICJQYWdlcyBmcmVlOiAgICAgICAgICAgICAgICAgICAgICAgIDEuXG4iCisgICAg
ICAgICAgICAgICAgICAgICAgICAgIlBhZ2VzIGluYWN0aXZlOiAgICAgICAgICAgICAgICAgICAg
MS5cbiIpCisgICAgICAgIGluZm8gPSBzZWxmLm1ha2VfaW5mbyhmYWtlX3N5cygnZGFyd2luJyks
IGZha2VfcGxhdGZvcm0oJzEwLjYuMycpLCBmYWtlX2V4ZWN1dGl2ZSh2bXN0YXRfb3V0cHV0KSkK
KyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaW5mby5mcmVlX2J5dGVzX21lbW9yeSgpLCA4MTky
KQorCisgICAgICAgIGluZm8gPSBzZWxmLm1ha2VfaW5mbyhmYWtlX3N5cygnd2luMzInLCB0dXBs
ZShbNiwgMSwgNzYwMF0pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaW5mby5mcmVlX2J5
dGVzX21lbW9yeSgpLCBOb25lKQorCisgICAgICAgIGluZm8gPSBzZWxmLm1ha2VfaW5mbyhmYWtl
X3N5cygnbGludXgyJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGluZm8uZnJlZV9ieXRl
c19tZW1vcnkoKSwgTm9uZSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVu
aXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24v
c3lzdGVtL3N5c3RlbWhvc3QucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0
ZW0vc3lzdGVtaG9zdC5weQppbmRleCA5Yjg0YmJkNDNiZmEyNjQ5NzQ0MjVjNTIyNmMwZmE5NjU1
ZGIwZmQwLi4zYjQ0MzllZTQ3ODViZGMyMjBlZTcyMzMzMTc5MjY4NDk5YWQxMmEzIDEwMDY0NAot
LS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vc3lzdGVtaG9zdC5weQor
KysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vc3lzdGVtaG9zdC5weQpA
QCAtMjcsNiArMjcsOCBAQAogIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogCiBpbXBvcnQgb3MKK2ltcG9ydCBwbGF0
Zm9ybQoraW1wb3J0IHN5cwogCiBmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0gaW1wb3J0IGVu
dmlyb25tZW50LCBleGVjdXRpdmUsIGZpbGVzeXN0ZW0sIHBsYXRmb3JtaW5mbywgdXNlciwgd29y
a3NwYWNlCiAKQEAgLTM2LDcgKzM4LDcgQEAgY2xhc3MgU3lzdGVtSG9zdChvYmplY3QpOgogICAg
ICAgICBzZWxmLmV4ZWN1dGl2ZSA9IGV4ZWN1dGl2ZS5FeGVjdXRpdmUoKQogICAgICAgICBzZWxm
LmZpbGVzeXN0ZW0gPSBmaWxlc3lzdGVtLkZpbGVTeXN0ZW0oKQogICAgICAgICBzZWxmLnVzZXIg
PSB1c2VyLlVzZXIoKQotICAgICAgICBzZWxmLnBsYXRmb3JtID0gcGxhdGZvcm1pbmZvLlBsYXRm
b3JtSW5mbyhzZWxmLmV4ZWN1dGl2ZSkKKyAgICAgICAgc2VsZi5wbGF0Zm9ybSA9IHBsYXRmb3Jt
aW5mby5QbGF0Zm9ybUluZm8oc3lzLCBwbGF0Zm9ybSwgc2VsZi5leGVjdXRpdmUpCiAgICAgICAg
IHNlbGYud29ya3NwYWNlID0gd29ya3NwYWNlLldvcmtzcGFjZShzZWxmLmZpbGVzeXN0ZW0sIHNl
bGYuZXhlY3V0aXZlKQogCiAgICAgZGVmIGNvcHlfY3VycmVudF9lbnZpcm9ubWVudChzZWxmKToK
ZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvYXBw
bGUucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2FwcGxlLnB5
CmluZGV4IDI5Y2E5ODdiNWM4YmJmMTM0NDE0ZWRlZTNlMTM4YTA4OGY2MDdjMjkuLjAyMjlmN2Uy
MWQ0OWZlYWQyNzIyYmY2NDMwMjdkNzQ3M2M3NjE1ZDYgMTAwNjQ0Ci0tLSBhL1Rvb2xzL1Njcmlw
dHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvYXBwbGUucHkKKysrIGIvVG9vbHMvU2NyaXB0
cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9hcHBsZS5weQpAQCAtNjcsNiArNjcsNyBAQCBj
bGFzcyBBcHBsZVBvcnQoV2ViS2l0UG9ydCk6CiAgICAgICAgICAgICBzZWxmLnNldF9vcHRpb25f
ZGVmYXVsdCgnd2Via2l0X3Rlc3RfcnVubmVyJywgVHJ1ZSkKIAogICAgICAgICBpZiBwb3J0X25h
bWUgPT0gc2VsZi5wb3J0X25hbWU6CisgICAgICAgICAgICAjIEZJWE1FOiBVc2UgaG9zdC5wbGF0
Zm9ybWluZm8ub3NfdmVyc2lvbiBpbnN0ZWFkLgogICAgICAgICAgICAgc2VsZi5fdmVyc2lvbiA9
IHNlbGYuX2RldGVjdF92ZXJzaW9uKG9zX3ZlcnNpb25fc3RyaW5nKSBvciBzZWxmLkZVVFVSRV9W
RVJTSU9OCiAgICAgICAgICAgICBzZWxmLl9uYW1lID0gc2VsZi5wb3J0X25hbWUgKyAnLScgKyBz
ZWxmLl92ZXJzaW9uCiAgICAgICAgIGVsc2U6CmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dl
YmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Nocm9taXVtX21hYy5weSBiL1Rvb2xzL1NjcmlwdHMv
d2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvY2hyb21pdW1fbWFjLnB5CmluZGV4IGY2N2ZhZjNj
MTU4YTM5MGFlNjcwNDdlODYzMjRlNjY0Y2NlYjM4ZWMuLmMxN2FiM2UxMzUyM2I2ZjU5NmMxYzFi
M2U0ZDg5YzE5ZDhiNjRiYTEgMTAwNjQ0Ci0tLSBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5
b3V0X3Rlc3RzL3BvcnQvY2hyb21pdW1fbWFjLnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0
cHkvbGF5b3V0X3Rlc3RzL3BvcnQvY2hyb21pdW1fbWFjLnB5CkBAIC04Myw2ICs4Myw3IEBAIGNs
YXNzIENocm9taXVtTWFjUG9ydChjaHJvbWl1bS5DaHJvbWl1bVBvcnQpOgogICAgICAgICBwb3J0
X25hbWUgPSBwb3J0X25hbWUgb3IgJ2Nocm9taXVtLW1hYycKICAgICAgICAgY2hyb21pdW0uQ2hy
b21pdW1Qb3J0Ll9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnRfbmFtZT1wb3J0X25hbWUsICoqa3dh
cmdzKQogICAgICAgICBpZiBwb3J0X25hbWUuZW5kc3dpdGgoJy1tYWMnKToKKyAgICAgICAgICAg
ICMgRklYTUU6IFVzZSBob3N0LnBsYXRmb3JtaW5mby5vc192ZXJzaW9uIGluc3RlYWQuCiAgICAg
ICAgICAgICBzZWxmLl92ZXJzaW9uID0gbWFjLm9zX3ZlcnNpb24ob3NfdmVyc2lvbl9zdHJpbmcs
IHNlbGYuU1VQUE9SVEVEX09TX1ZFUlNJT05TKQogICAgICAgICAgICAgc2VsZi5fbmFtZSA9IHBv
cnRfbmFtZSArICctJyArIHNlbGYuX3ZlcnNpb24KICAgICAgICAgZWxzZToKZGlmZiAtLWdpdCBh
L1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvbWFjLnB5IGIvVG9vbHMv
U2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9tYWMucHkKaW5kZXggOTM4NTViODc1
OWFjYTljZWZkNzU0NTZkYjE4YmY4OGM3ZTI0YzlmZS4uNDYxYzI1N2YyZTkwNjQ5YjJiYTQ2MjQ0
YWI5MjY4NTk4MTMxMWI1NCAxMDA2NDQKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlv
dXRfdGVzdHMvcG9ydC9tYWMucHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRf
dGVzdHMvcG9ydC9tYWMucHkKQEAgLTM2LDcgKzM2LDcgQEAgZnJvbSB3ZWJraXRweS5sYXlvdXRf
dGVzdHMucG9ydC5sZWFrZGV0ZWN0b3IgaW1wb3J0IExlYWtEZXRlY3RvcgogCiBfbG9nID0gbG9n
Z2luZy5nZXRMb2dnZXIoX19uYW1lX18pCiAKLQorIyBGSVhNRTogRGVsZXRlIHRoaXMgd2hlbiB3
ZSBzd2l0Y2ggdG8gdXNpbmcgaG9zdC5wbGF0Zm9ybWluZm8ub3NfdmVyc2lvbiBpbnN0ZWFkLgog
ZGVmIG9zX3ZlcnNpb24ob3NfdmVyc2lvbl9zdHJpbmc9Tm9uZSwgc3VwcG9ydGVkX3ZlcnNpb25z
PU5vbmUpOgogICAgIGlmIG5vdCBvc192ZXJzaW9uX3N0cmluZzoKICAgICAgICAgaWYgaGFzYXR0
cihwbGF0Zm9ybSwgJ21hY192ZXInKSBhbmQgcGxhdGZvcm0ubWFjX3ZlcigpWzBdOgpAQCAtNjQs
NiArNjQsNyBAQCBjbGFzcyBNYWNQb3J0KEFwcGxlUG9ydCk6CiAgICAgIyBhbmQgdGhlIG9yZGVy
IG9mIGZhbGxiYWNrIGJldHdlZW4gdGhlbS4gIE1hdGNoZXMgT1JXVC4KICAgICBWRVJTSU9OX0ZB
TExCQUNLX09SREVSID0gWyJtYWMtbGVvcGFyZCIsICJtYWMtc25vd2xlb3BhcmQiLCAibWFjLWxp
b24iLCAibWFjIl0KIAorICAgICMgRklYTUU6IERlbGV0ZSB0aGlzIHdoZW4gd2Ugc3dpdGNoIHRv
IHVzaW5nIGhvc3QucGxhdGZvcm1pbmZvLm9zX3ZlcnNpb24gaW5zdGVhZC4KICAgICBkZWYgX2Rl
dGVjdF92ZXJzaW9uKHNlbGYsIG9zX3ZlcnNpb25fc3RyaW5nKToKICAgICAgICAgIyBGSVhNRTog
TWFjUG9ydCBhbmQgV2luUG9ydCBpbXBsZW1lbnQgX2RldGVjdF92ZXJzaW9uIGRpZmZlcmVudGx5
LgogICAgICAgICAjIFdpblBvcnQgdXNlcyBvc192ZXJzaW9uX3N0cmluZyBhcyBhIHJlcGxhY2Vt
ZW50IGZvciBzZWxmLnZlcnNpb24uCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5
L2xheW91dF90ZXN0cy9wb3J0L3dpbi5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0
X3Rlc3RzL3BvcnQvd2luLnB5CmluZGV4IGVkNzVhNzlkZWI5NmFhNDgwMDIwZGI1MzA2ODRlYTNk
YjM5YWViYWQuLjIyNzBkZGVmMzE5M2U4Yzg2Zjg3ZWRiNzkxNjhmZGVjMzQ3MmJjZmEgMTAwNjQ0
Ci0tLSBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvd2luLnB5Cisr
KyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvd2luLnB5CkBAIC00
NSw2ICs0NSw3IEBAIGNsYXNzIFdpblBvcnQoQXBwbGVQb3J0KToKICAgICAjIGFuZCB0aGUgb3Jk
ZXIgb2YgZmFsbGJhY2sgYmV0d2VlbiB0aGVtLiAgTWF0Y2hlcyBPUldULgogICAgIFZFUlNJT05f
RkFMTEJBQ0tfT1JERVIgPSBbIndpbi14cCIsICJ3aW4tdmlzdGEiLCAid2luLTdzcDAiLCAid2lu
Il0KIAorICAgICMgRklYTUU6IFVzZSBob3N0LnBsYXRmb3JtaW5mby5vc192ZXJzaW9uIGluc3Rl
YWQuCiAgICAgZGVmIF92ZXJzaW9uX3N0cmluZ19mcm9tX3dpbmRvd3NfdmVyc2lvbl90dXBsZShz
ZWxmLCB3aW5kb3dzX3ZlcnNpb25fdHVwbGUpOgogICAgICAgICBpZiB3aW5kb3dzX3ZlcnNpb25f
dHVwbGVbOjNdID09ICg2LCAxLCA3NjAwKToKICAgICAgICAgICAgIHJldHVybiAnN3NwMCcK
</data>
<flag name="review"
          id="122562"
          type_id="1"
          status="+"
          setter="eric"
    />
          </attachment>
      

    </bug>

</bugzilla>