<?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>37630</bug_id>
          
          <creation_ts>2010-04-14 18:49:22 -0700</creation_ts>
          <short_desc>delete redundant test outputs</short_desc>
          <delta_ts>2010-08-13 19:10:03 -0700</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>Other</rep_platform>
          <op_sys>OS X 10.5</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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Evan Martin">evan</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abarth</cc>
    
    <cc>bulach</cc>
    
    <cc>commit-queue</cc>
    
    <cc>dpranke</cc>
    
    <cc>eric</cc>
    
    <cc>ojan</cc>
    
    <cc>tony</cc>
    
    <cc>victorw</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>212694</commentid>
    <comment_count>0</comment_count>
    <who name="Evan Martin">evan</who>
    <bug_when>2010-04-14 18:49:22 -0700</bug_when>
    <thetext>delete redundant test outputs</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>212696</commentid>
    <comment_count>1</comment_count>
      <attachid>53398</attachid>
    <who name="Evan Martin">evan</who>
    <bug_when>2010-04-14 18:51:03 -0700</bug_when>
    <thetext>Created attachment 53398
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>213324</commentid>
    <comment_count>2</comment_count>
      <attachid>53398</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2010-04-16 11:37:33 -0700</bug_when>
    <thetext>Comment on attachment 53398
Patch

It might be slightly clearer if the script was named deduplicate-webkit-tests.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>213375</commentid>
    <comment_count>3</comment_count>
    <who name="Evan Martin">evan</who>
    <bug_when>2010-04-16 12:54:12 -0700</bug_when>
    <thetext>I can rename it.  BTW, this found 1300 redundant files in the current tree.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>213390</commentid>
    <comment_count>4</comment_count>
      <attachid>53398</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-04-16 13:26:18 -0700</bug_when>
    <thetext>Comment on attachment 53398
Patch

Tricky stuff.

No clue what this does:
+        _, _, hash = attrs.split(&apos; &apos;)

Does that ignore the first two split values?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>213394</commentid>
    <comment_count>5</comment_count>
    <who name="Evan Martin">evan</who>
    <bug_when>2010-04-16 13:31:04 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; (From update of attachment 53398 [details])
&gt; Tricky stuff.
&gt; 
&gt; No clue what this does:
&gt; +        _, _, hash = attrs.split(&apos; &apos;)
&gt; 
&gt; Does that ignore the first two split values?

Yes.  Two features you might not be aware of:

1) foo, bar = x.split(&apos; &apos;)
unpacks into two variables.
2) _ = blah()
&quot;_&quot; is the name of the variable meaning &quot;I don&apos;t want this variable&quot;.

That style is common for self-documenting the following:
 - throw an exception if the thing doesn&apos;t split into three components exactly
 - I don&apos;t care about the first two
It probably could be aided by including in a comment what kind of input it&apos;s parsing.  (The git output is designed to be consumed by scripts in this way.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>216123</commentid>
    <comment_count>6</comment_count>
      <attachid>53398</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-04-22 15:54:03 -0700</bug_when>
    <thetext>Comment on attachment 53398
Patch

I&apos;m sorry, but we&apos;re not accepting any new python code that doesn&apos;t have unit tests.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>262099</commentid>
    <comment_count>7</comment_count>
    <who name="Marcus Bulach">bulach</who>
    <bug_when>2010-08-09 05:01:10 -0700</bug_when>
    <thetext>Hi Evan,

I was working on something pretty similar https://bugs.webkit.org/show_bug.cgi?id=40792

Are you still working on this? I think you can either get some of the tests I wrote in the bug above and go ahead here, or I could take your get_port_fallbacks pieces.. :)
Either way is fine by me, which one would you prefer?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>262126</commentid>
    <comment_count>8</comment_count>
    <who name="Marcus Bulach">bulach</who>
    <bug_when>2010-08-09 06:55:34 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; Hi Evan,
&gt; 
&gt; I was working on something pretty similar https://bugs.webkit.org/show_bug.cgi?id=40792
&gt; 
&gt; Are you still working on this? I think you can either get some of the tests I wrote in the bug above and go ahead here, or I could take your get_port_fallbacks pieces.. :)
&gt; Either way is fine by me, which one would you prefer?

on a second read: I think your patch using git ls-tree is much simpler than mine (which used python&apos;s hashlib.sha1()), so if you&apos;re ok, I&apos;d be happy to write some tests to get this patch (rather than mine) in!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>262240</commentid>
    <comment_count>9</comment_count>
    <who name="Evan Martin">evan</who>
    <bug_when>2010-08-09 11:31:41 -0700</bug_when>
    <thetext>I would love it if you finished either this patch or another one!  Please be my guest and use whichever code seems appropriate to you.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>262247</commentid>
    <comment_count>10</comment_count>
    <who name="Marcus Bulach">bulach</who>
    <bug_when>2010-08-09 11:38:45 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; I would love it if you finished either this patch or another one!  Please be my guest and use whichever code seems appropriate to you.

great, thanks Evan! I&apos;ll reuse your code and upload a new patch with tests here soon.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>262568</commentid>
    <comment_count>11</comment_count>
      <attachid>63990</attachid>
    <who name="Marcus Bulach">bulach</who>
    <bug_when>2010-08-10 02:22:39 -0700</bug_when>
    <thetext>Created attachment 63990
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>262572</commentid>
    <comment_count>12</comment_count>
    <who name="Marcus Bulach">bulach</who>
    <bug_when>2010-08-10 02:27:52 -0700</bug_when>
    <thetext>Thanks Evan! I took over your patch, did some minor changes (using log, optparse, added a glob for filtering file names, etc..), and added tests.

I&apos;m also cc:ing everybody that was on https://bugs.webkit.org/show_bug.cgi?id=40792, can you all please take a look?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>262575</commentid>
    <comment_count>13</comment_count>
    <who name="Marcus Bulach">bulach</who>
    <bug_when>2010-08-10 02:30:03 -0700</bug_when>
    <thetext>*** Bug 40792 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>262729</commentid>
    <comment_count>14</comment_count>
      <attachid>63990</attachid>
    <who name="Tony Chang">tony</who>
    <bug_when>2010-08-10 09:58:03 -0700</bug_when>
    <thetext>Comment on attachment 63990
Patch

&gt; diff --git a/WebKitTools/ChangeLog b/WebKitTools/ChangeLog
&gt; +        * Scripts/deduplicate_tests.py: Added.
&gt; +        * Scripts/deduplicate_tests_unittest.py: Added.

There are no other unittest.py files or files with _ in the filename in Scripts and there&apos;s only one file that ends in .py.  Maybe it would be better to put these files in Scripts/webkitpy somewhere and have a wrapper file (e.g., duplicate-tests) in Scripts that just imports the files from webkitpy.  I think the unittest needs to be in webkitpy anyway for Scripts/test-webkitpy to find it.


&gt; diff --git a/WebKitTools/Scripts/deduplicate_tests.py b/WebKitTools/Scripts/deduplicate_tests.py
&gt; +# 2.  Redistributions in binary form must reproduce the above copyright
&gt; +#     notice, this list of conditions and the following disclaimer in the
&gt; +#     documentation and/or other materials provided with the distribution.

The third clause of the license seems to be missing.  There seems to be some inconsistency among the existing files in Scripts, but that&apos;s a separate issue.  I would use something like what&apos;s in webkit-tools-completion.sh.

&gt; +    # Fill in the map.
&gt; +    cmd = [&apos;git&apos;, &apos;ls-tree&apos;, &apos;-r&apos;, &apos;HEAD&apos;, &apos;LayoutTests&apos;]

Nit: () instead of [] since cmd doesn&apos;t change.

The unittests look great.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>262749</commentid>
    <comment_count>15</comment_count>
      <attachid>64026</attachid>
    <who name="Marcus Bulach">bulach</who>
    <bug_when>2010-08-10 10:32:30 -0700</bug_when>
    <thetext>Created attachment 64026
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>262753</commentid>
    <comment_count>16</comment_count>
    <who name="Marcus Bulach">bulach</who>
    <bug_when>2010-08-10 10:35:59 -0700</bug_when>
    <thetext>thanks Tony! replies inline, new patch uploaded:

(In reply to comment #14)
&gt; (From update of attachment 63990 [details])
&gt; &gt; diff --git a/WebKitTools/ChangeLog b/WebKitTools/ChangeLog
&gt; &gt; +        * Scripts/deduplicate_tests.py: Added.
&gt; &gt; +        * Scripts/deduplicate_tests_unittest.py: Added.
&gt; 
&gt; There are no other unittest.py files or files with _ in the filename in Scripts and there&apos;s only one file that ends in .py.  Maybe it would be better to put these files in Scripts/webkitpy somewhere and have a wrapper file (e.g., duplicate-tests) in Scripts that just imports the files from webkitpy.  I think the unittest needs to be in webkitpy anyway for Scripts/test-webkitpy to find it.

ahn, right! I was running the tests manually, didn&apos;t know about test-webkitpy.
it&apos;s now much clearer with the wrapper in Scripts and the module / unittest in webkitpy, thanks!

&gt; 
&gt; 
&gt; &gt; diff --git a/WebKitTools/Scripts/deduplicate_tests.py b/WebKitTools/Scripts/deduplicate_tests.py
&gt; &gt; +# 2.  Redistributions in binary form must reproduce the above copyright
&gt; &gt; +#     notice, this list of conditions and the following disclaimer in the
&gt; &gt; +#     documentation and/or other materials provided with the distribution.
&gt; 
&gt; The third clause of the license seems to be missing.  There seems to be some inconsistency among the existing files in Scripts, but that&apos;s a separate issue.  I would use something like what&apos;s in webkit-tools-completion.sh.

hehe, I&apos;m confused. in this bug I&apos;ve been told to use the two clause version.. ;)
https://bugs.webkit.org/show_bug.cgi?id=40250#c5

do you know what&apos;s the real latest? :)


&gt; 
&gt; &gt; +    # Fill in the map.
&gt; &gt; +    cmd = [&apos;git&apos;, &apos;ls-tree&apos;, &apos;-r&apos;, &apos;HEAD&apos;, &apos;LayoutTests&apos;]
&gt; 
&gt; Nit: () instead of [] since cmd doesn&apos;t change.

done.

&gt; 
&gt; The unittests look great.

thanks! another look, please?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>262754</commentid>
    <comment_count>17</comment_count>
      <attachid>64026</attachid>
    <who name="Tony Chang">tony</who>
    <bug_when>2010-08-10 10:41:20 -0700</bug_when>
    <thetext>Comment on attachment 64026
Patch

Jeremy probably knows the license situation better than me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>262770</commentid>
    <comment_count>18</comment_count>
      <attachid>64026</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-08-10 11:09:35 -0700</bug_when>
    <thetext>Comment on attachment 64026
Patch

WebKitTools/ChangeLog:1
 +  2010-08-10  Marcus Bulach  &lt;bulach@chromium.org&gt;
Should be a new line between the author line and the reviewed by line.

WebKitTools/Scripts/deduplicate-tests:65
 +      if options.pretty_print:
Is this some sort of verbose mode?

WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests.py:47
 +  def get_port_fallbacks():
I dont&apos; think we usually use get_* in python code.  Check PEP8.  We certainly don&apos;t use get* in our c++ webkit code.

WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests.py:58
 +              _log.error(&quot;&apos;%s&apos; lacks baseline_search_path()&quot; % port_name)
Do we ever hit this?  Wouldn&apos;t that be a bug in the port implementation?  I think it&apos;s OK to be robust here, but we should be more explicit that the port needs fixing.

WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests.py:59
 +              port_fallbacks[port_name] = [&apos;base&apos;]
base?  Is that a magic string here?

Seems we might want a constant for that string instead of repeating it.

WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests.py:79
 +      cmd = (&apos;git&apos;, &apos;ls-tree&apos;, &apos;-r&apos;, &apos;HEAD&apos;, &apos;LayoutTests&apos;)
I feel like the running of ls tree and returning of the split lines should be a separate funciton.

WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests.py:98
 +          _, _, hash = attrs.split(&apos; &apos;)
This is a cool pattern, I wish we had understood it better when writing the rest of webkitpy.

WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests.py:89
 +      for line in git.split(&apos;\n&apos;):
This loop feels like it wants to call some helper function to proces each line.

WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests.py:113
 +          if len(cluster) &lt; 2:
This per-test block feels like a function.  :)  Mostly because I was initially confused as to how you were avoiding deduping the empty file.  But it now seems more clear to me that your&apos;e not looping on hashes, but rather test paths (which is important).

WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests.py:116
 +          # Compute the list of platforms we have this particular hash for.
Isn&apos;t this a function?  platforms_with_test_matching_hash()?

WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests.py:139
 +      for test, platform, fallback, path in find_dups(hashes, port_fallbacks):
If this was a function, then deduplicate just becomes a list comprehension.

WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests_unittest.py:32
 +  class MockExecutive(object):
Doesn&apos;t Mock.py already do this for you?  We include it in webkitpy/third_party iirc.  It&apos;s not great, but it might be easier than rolling your own.

WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests_unittest.py:57
 +              &apos;100644 blob 5053240b3353f6eb39f7cb00259785f16d121df2\tLayoutTests/mac/foo-expected.txt\n&apos;
Would be nice to have a parsing function split out from the logic so we could test that independently.

WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests_unittest.py:64
 +          self.assertEquals((&apos;git&apos;, &apos;ls-tree&apos;, &apos;-r&apos;, &apos;HEAD&apos;, &apos;LayoutTests&apos;), MockExecutive.last_run_command[-1])
I see.  Yeah, we don&apos;t have quite so slick an interface for this in our existing mocks.  If you look at mocktool.py you&apos;ll find a MockExecutive I think.  But the way we&apos;ve been asserting is using OutputCapture.  Your solution is more pythony, I think.

We may wish to move some variant of your MockExecutive into a shared file at some point.

WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests_unittest.py:113
 +  if __name__ == &apos;__main__&apos;:
I don&apos;t think we need this.  Did you verify that test-webkitpy will automagically find and run your unit tests?  I would expect it to.

Overall I think this ia a FANTASTIC patch.  I really can&apos;t thank you and evan enough for taking this on.

I would like to see one more round of this.  Don&apos;t feel obliged to answer each of my nits above, but you should at least thumb through them.  I think this patch is OK to land as is, but it would be nice to at least fix the ChangeLog and consider the nits listed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>262774</commentid>
    <comment_count>19</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-08-10 11:10:36 -0700</bug_when>
    <thetext>Oh, and my understanding is that Google uses the 2-clause BSD for all new webkit contributions.  I&apos;m not sure what Apple&apos;s standard template looks like.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>262819</commentid>
    <comment_count>20</comment_count>
      <attachid>64040</attachid>
    <who name="Marcus Bulach">bulach</who>
    <bug_when>2010-08-10 12:43:55 -0700</bug_when>
    <thetext>Created attachment 64040
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>262822</commentid>
    <comment_count>21</comment_count>
    <who name="Marcus Bulach">bulach</who>
    <bug_when>2010-08-10 12:51:27 -0700</bug_when>
    <thetext>thanks Eric! I think I addressed most of your comments, would you mind taking another look please?

(In reply to comment #18)
&gt; (From update of attachment 64026 [details])
&gt; WebKitTools/ChangeLog:1
&gt;  +  2010-08-10  Marcus Bulach  &lt;bulach@chromium.org&gt;
&gt; Should be a new line between the author line and the reviewed by line.
Done

&gt; 
&gt; WebKitTools/Scripts/deduplicate-tests:65
&gt;  +      if options.pretty_print:
&gt; Is this some sort of verbose mode?
yep, changed to verbose.

&gt; 
&gt; WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests.py:47
&gt;  +  def get_port_fallbacks():
&gt; I dont&apos; think we usually use get_* in python code.  Check PEP8.  We certainly don&apos;t use get* in our c++ webkit code.
done.

&gt; 
&gt; WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests.py:58
&gt;  +              _log.error(&quot;&apos;%s&apos; lacks baseline_search_path()&quot; % port_name)
&gt; Do we ever hit this?  Wouldn&apos;t that be a bug in the port implementation?  I think it&apos;s OK to be robust here, but we should be more explicit that the port needs fixing.
Clarified the message.

&gt; 
&gt; WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests.py:59
&gt;  +              port_fallbacks[port_name] = [&apos;base&apos;]
&gt; base?  Is that a magic string here?
&gt; 
&gt; Seems we might want a constant for that string instead of repeating it.
Added as constant.

&gt; 
&gt; WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests.py:79
&gt;  +      cmd = (&apos;git&apos;, &apos;ls-tree&apos;, &apos;-r&apos;, &apos;HEAD&apos;, &apos;LayoutTests&apos;)
&gt; I feel like the running of ls tree and returning of the split lines should be a separate funciton.
agreed! split.

&gt; 
&gt; WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests.py:98
&gt;  +          _, _, hash = attrs.split(&apos; &apos;)
&gt; This is a cool pattern, I wish we had understood it better when writing the rest of webkitpy.
:)


&gt; 
&gt; WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests.py:89
&gt;  +      for line in git.split(&apos;\n&apos;):
&gt; This loop feels like it wants to call some helper function to proces each line.
done.

&gt; 
&gt; WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests.py:113
&gt;  +          if len(cluster) &lt; 2:
&gt; This per-test block feels like a function.  :)  Mostly because I was initially confused as to how you were avoiding deduping the empty file.  But it now seems more clear to me that your&apos;e not looping on hashes, but rather test paths (which is important).

I split this up, let me know if it&apos;s any clearer.

&gt; 
&gt; WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests.py:116
&gt;  +          # Compute the list of platforms we have this particular hash for.
&gt; Isn&apos;t this a function?  platforms_with_test_matching_hash()?
I named &quot;extract_platforms&quot;, hope it&apos;s ok?

&gt; 
&gt; WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests.py:139
&gt;  +      for test, platform, fallback, path in find_dups(hashes, port_fallbacks):
&gt; If this was a function, then deduplicate just becomes a list comprehension.
yay, more python-foo! :)

&gt; 
&gt; WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests_unittest.py:32
&gt;  +  class MockExecutive(object):
&gt; Doesn&apos;t Mock.py already do this for you?  We include it in webkitpy/third_party iirc.  It&apos;s not great, but it might be easier than rolling your own.
well, I&apos;m not doing anything particularly complicated, so I think it&apos;s simpler to keep it?

&gt; 
&gt; WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests_unittest.py:57
&gt;  +              &apos;100644 blob 5053240b3353f6eb39f7cb00259785f16d121df2\tLayoutTests/mac/foo-expected.txt\n&apos;
&gt; Would be nice to have a parsing function split out from the logic so we could test that independently.
done.

&gt; 
&gt; WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests_unittest.py:64
&gt;  +          self.assertEquals((&apos;git&apos;, &apos;ls-tree&apos;, &apos;-r&apos;, &apos;HEAD&apos;, &apos;LayoutTests&apos;), MockExecutive.last_run_command[-1])
&gt; I see.  Yeah, we don&apos;t have quite so slick an interface for this in our existing mocks.  If you look at mocktool.py you&apos;ll find a MockExecutive I think.  But the way we&apos;ve been asserting is using OutputCapture.  Your solution is more pythony, I think.
&gt; 
&gt; We may wish to move some variant of your MockExecutive into a shared file at some point.

I&apos;m happy to move out at any point..

&gt; 
&gt; WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests_unittest.py:113
&gt;  +  if __name__ == &apos;__main__&apos;:
&gt; I don&apos;t think we need this.  Did you verify that test-webkitpy will automagically find and run your unit tests?  I would expect it to.
right, it does find. removed it.

&gt; 
&gt; Overall I think this ia a FANTASTIC patch.  I really can&apos;t thank you and evan enough for taking this on.

all credits to Evan, my changes were mostly cosmetic. :)

&gt; 
&gt; I would like to see one more round of this.  Don&apos;t feel obliged to answer each of my nits above, but you should at least thumb through them.  I think this patch is OK to land as is, but it would be nice to at least fix the ChangeLog and consider the nits listed.

I think I addressed all of them. another look please?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>263298</commentid>
    <comment_count>22</comment_count>
      <attachid>64040</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-08-11 09:43:05 -0700</bug_when>
    <thetext>Comment on attachment 64040
Patch

WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests.py:53
 +          back on.  All platforms fall back on &apos;base&apos;.
Seems part of this comment belongs next to _BASE_PLATFORM, but ok.

WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests.py:68
 +  def parse_git_output(git_output, glob_pattern):
I would have named this parse_git_ls_tree_output

Looks great though.  Thanks for taking this on.

We probably should have done more of this as a class, rather than free functions.  Eventually it will probably get moved deeper into webkitpy.  But I think this is a good starting point.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>263355</commentid>
    <comment_count>23</comment_count>
      <attachid>64040</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-08-11 11:31:27 -0700</bug_when>
    <thetext>Comment on attachment 64040
Patch

Clearing flags on attachment: 64040

Committed r65166: &lt;http://trac.webkit.org/changeset/65166&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>263357</commentid>
    <comment_count>24</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-08-11 11:31:34 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>263365</commentid>
    <comment_count>25</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-08-11 11:49:39 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/65166 might have broken Chromium Win Release
The following changes are on the blame list:
http://trac.webkit.org/changeset/65166
http://trac.webkit.org/changeset/65167</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>264114</commentid>
    <comment_count>26</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-08-12 18:26:52 -0700</bug_when>
    <thetext>It looks like this code assumes you&apos;re running in a git checkout with the current working directory == the top of the tree, and it seems to gork test-webkitpy so that the rest of the test suite doesn&apos;t work right.

Can you please fix this?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>264116</commentid>
    <comment_count>27</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-08-12 18:38:14 -0700</bug_when>
    <thetext>scm.py knows how to handle running in those cases.  Perhaps this should use more of webkitpy code to take care of that for you.

You can use detect_scm_system to find the checkout_root.

http://trac.webkit.org/browser/trunk/WebKitTools/Scripts/webkitpy/common/checkout/scm.py#L41

We&apos;ve long talked about making it easier to write non-webkit-patch tools which use webkitpy.  We just have a couple bugs to fix to make that possible.  (Mostly abstracting the data storage out of WebKitPatch into a separate Tool class that can be set as self.tool on Command instances instead of WebKitPatch.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>264129</commentid>
    <comment_count>28</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-08-12 20:08:09 -0700</bug_when>
    <thetext>(In reply to comment #27)
&gt; scm.py knows how to handle running in those cases.  Perhaps this should use more of webkitpy code to take care of that for you.
&gt; 
&gt; You can use detect_scm_system to find the checkout_root.
&gt; 
&gt; http://trac.webkit.org/browser/trunk/WebKitTools/Scripts/webkitpy/common/checkout/scm.py#L41
&gt; 
&gt; We&apos;ve long talked about making it easier to write non-webkit-patch tools which use webkitpy.  We just have a couple bugs to fix to make that possible.  (Mostly abstracting the data storage out of WebKitPatch into a separate Tool class that can be set as self.tool on Command instances instead of WebKitPatch.)

detect_scm_system() takes a path as input, which doesn&apos;t help if you don&apos;t know what path you
want to use. 

It would be nice if it had a way to bootstrap itself better, like we do in webkitpy/layout_tests/port/base.py:

        if not self._webkit_base_dir:
            abspath = os.path.abspath(__file__)
            self._webkit_base_dir = abspath[0:abspath.find(&apos;WebKitTools&apos;)]
            _log.debug(&quot;Using WebKit root: %s&quot; % self._webkit_base_dir)

You could do something like this if path was None.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>264134</commentid>
    <comment_count>29</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-08-12 20:22:51 -0700</bug_when>
    <thetext>detect_scm_system knows how to crawl up until it finds the root.

I think you want something like this:
http://trac.webkit.org/browser/trunk/WebKitTools/Scripts/webkitpy/tool/main.py#L80

Which is why that code should be shared on some object other than WebKitPatch&apos;s main class.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>264482</commentid>
    <comment_count>30</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-08-13 13:21:34 -0700</bug_when>
    <thetext>(In reply to comment #29)
&gt; detect_scm_system knows how to crawl up until it finds the root.
&gt; 
&gt; I think you want something like this:
&gt; http://trac.webkit.org/browser/trunk/WebKitTools/Scripts/webkitpy/tool/main.py#L80
&gt; 
&gt; Which is why that code should be shared on some object other than WebKitPatch&apos;s main class.

Well, sort of.

That code finds the root given $CWD, which is appropriate in some cases. The code in port.base finds the root given the path to port/base.py, which means that it&apos;ll work even if you&apos;re not actually in the tree; it uses the root of the tree containing the code you&apos;re running.

I&apos;m not sure if that would be appropriate for scm-related stuff, but it seems fine for test-related stuff.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>264496</commentid>
    <comment_count>31</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-08-13 14:09:17 -0700</bug_when>
    <thetext>The code I linked to tries to use the CWD, if its not a webkit checkout, then it falls back to being __file__ relative.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>264499</commentid>
    <comment_count>32</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-08-13 14:18:57 -0700</bug_when>
    <thetext>(In reply to comment #31)
&gt; The code I linked to tries to use the CWD, if its not a webkit checkout, then it falls back to being __file__ relative.

Oh, i see. Interesting; I didn&apos;t realize that sys.path[0] was defined to be the script directory. That&apos;s useful.

So, in this case, if I have a webkit-patch from one checkout in my path, and I&apos;m in another checkout, it will use the checkout I&apos;m in, not the checkout the code is running from. Probably the right thing to do in the scm case; possibly the wrong thing to do in the test case. Perhaps in either case you might want to prompt/warn that you&apos;re mixing checkouts. But this is a corner condition to be sure.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>264564</commentid>
    <comment_count>33</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-08-13 17:48:48 -0700</bug_when>
    <thetext>Another issue is that deduplicate_tests.py:44 appears to change the default configuration of the logger, which causes a whole bunch of [ERROR] messages to start showing up when you run test-webkitpy (although the tests succeed).

I&apos;ll post a separate patch to address these two issues and we can continue the discussion of what to do about this there.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>264591</commentid>
    <comment_count>34</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2010-08-13 19:10:03 -0700</bug_when>
    <thetext>(In reply to comment #33)
&gt; I&apos;ll post a separate patch to address these two issues and we can continue the discussion of what to do about this there.

okay, follow up in bug 44001.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>53398</attachid>
            <date>2010-04-14 18:51:03 -0700</date>
            <delta_ts>2010-06-11 11:33:22 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-37630-20100414185123.patch</filename>
            <type>text/plain</type>
            <size>6490</size>
            <attacher name="Evan Martin">evan</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCBlZWRlYjRiLi5lZWM1MDNiIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTcgQEAKKzIwMTAtMDQt
MTQgIEV2YW4gTWFydGluICA8ZXZhbkBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ2hlY2sgaW4gYSBzY3JpcHQgdG8gbGlzdCBy
ZWR1bmRhbnQgdGVzdCBvdXRwdXRzLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9Mzc2MzAKKworICAgICAgICBJZiBlLmcuIHBsYXRmb3JtL21hYy1sZW9w
YXJkIGlzIG1pc3NpbmcgYW4gZXhwZWN0ZWQgdGVzdCBvdXRwdXQsIHdlCisgICAgICAgIGZhbGwg
YmFjayBvbiBwbGF0Zm9ybS9tYWMuICBUaGlzIG1lYW5zIGl0J3MgcG9zc2libGUgdG8gZ3JvdyBy
ZWR1bmRhbnQKKyAgICAgICAgdGVzdCBvdXRwdXRzLCBwd2hlcmUgd2UgaGF2ZSB0aGUgc2FtZSBl
eHBlY3RlZCBkYXRhIGluIGJvdGggYSBwbGF0Zm9ybQorICAgICAgICBkaXJlY3RvcnkgYW5kIGFu
b3RoZXIgcGxhdGZvcm0gaXQgZmFsbHMgYmFjayBvbi4KKworICAgICAgICAqIFNjcmlwdHMvZGVk
dXBsaWNhdGUtdGVzdHM6IEFkZGVkLgorCiAyMDEwLTA0LTE0ICBFcmljIFNlaWRlbCAgPGVyaWNA
d2Via2l0Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBBZGFtIEJhcnRoLgpkaWZmIC0tZ2l0
IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy9kZWR1cGxpY2F0ZS10ZXN0cyBiL1dlYktpdFRvb2xzL1Nj
cmlwdHMvZGVkdXBsaWNhdGUtdGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAw
MC4uMjZmYzY3MQotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvZGVkdXBs
aWNhdGUtdGVzdHMKQEAgLTAsMCArMSwxMzcgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBD
b3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMg
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAgKiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMg
ICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0
cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1
Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Ig
d3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRI
RSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlU
RUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisj
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisKKyIiImRlZHVwbGljYXRlLXRlc3RzIC0tIHByaW50IHRlc3QgcmVzdWx0
cyBkdXBsaWNhdGVkIGJldHdlZW4gcGxhdGZvcm1zLgorCitJZiBwbGF0Zm9ybS9tYWMtbGVvcGFy
ZCBpcyBtaXNzaW5nIGFuIGV4cGVjdGVkIHRlc3Qgb3V0cHV0LCB3ZSBmYWxsIGJhY2sgb24KK3Bs
YXRmb3JtL21hYy4gIFRoaXMgbWVhbnMgaXQncyBwb3NzaWJsZSB0byBncm93IHJlZHVuZGFudCB0
ZXN0IG91dHB1dHMsCit3aGVyZSB3ZSBoYXZlIHRoZSBzYW1lIGV4cGVjdGVkIGRhdGEgaW4gYm90
aCBhIHBsYXRmb3JtIGRpcmVjdG9yeSBhbmQgYW5vdGhlcgorcGxhdGZvcm0gaXQgZmFsbHMgYmFj
ayBvbi4KKworVGhpcyBjb21tYW5kIGR1bXBzIG91dCBhbGwgc3VjaCBmaWxlcy4gIFlvdSBjYW4g
dXNlIGl0IGxpa2UgdGhpczoKKyAgZGVkdXBsaWNhdGUtdGVzdHMgICAjIHByaW50IG91dCB0aGUg
dXNlbGVzcyBmaWxlcworICBkZWR1cGxpY2F0ZS10ZXN0cyAtLWxpc3QgfCB4YXJncyBnaXQgcm0g
ICAjIGRlbGV0ZSB0aGVtCisiIiIKKworaW1wb3J0IGNvbGxlY3Rpb25zCitpbXBvcnQgb3MucGF0
aAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCByZQorCitpbXBvcnQgd2Vi
a2l0cHkubGF5b3V0X3Rlc3RzLnBvcnQuZmFjdG9yeSBhcyBwb3J0cworCitkZWYgZ2V0X3BvcnRf
ZmFsbGJhY2tzKCk6CisgICAgIiIiR2V0IHRoZSBwb3J0IGZhbGxiYWNrIGxpc3RzOiBhIGRpY3Rp
b25hcnkgbWFwcGluZyBwbGF0Zm9ybSBuYW1lIHRvIGEgbGlzdAorICAgIG9mIG90aGVyIHBsYXRm
b3JtcyB0byBmYWxsIGJhY2sgb24uICBBbGwgcGxhdGZvcm1zIGZhbGwgYmFjayBvbiAnYmFzZScu
IiIiCisgICAgcG9ydF9mYWxsYmFja3MgPSB7J2Jhc2UnOiBbXX0KKyAgICBmb3IgcG9ydF9uYW1l
IGluIG9zLmxpc3RkaXIoJ0xheW91dFRlc3RzL3BsYXRmb3JtJyk6CisgICAgICAgIHRyeToKKyAg
ICAgICAgICAgIHBsYXRmb3JtcyA9IHBvcnRzLmdldChwb3J0X25hbWUpLmJhc2VsaW5lX3NlYXJj
aF9wYXRoKCkKKyAgICAgICAgZXhjZXB0IE5vdEltcGxlbWVudGVkRXJyb3I6CisgICAgICAgICAg
ICBwcmludCA+PnN5cy5zdGRlcnIsICInJXMnIGxhY2tzIGJhc2VsaW5lX3NlYXJjaF9wYXRoKCki
ICUgcG9ydF9uYW1lCisgICAgICAgICAgICBwb3J0X2ZhbGxiYWNrc1twb3J0X25hbWVdID0gWydi
YXNlJ10KKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHBvcnRfZmFsbGJhY2tzW3BvcnRf
bmFtZV0gPSBbb3MucGF0aC5iYXNlbmFtZShwKSBmb3IgcCBpbiBwbGF0Zm9ybXNdWzE6XQorICAg
ICAgICBwb3J0X2ZhbGxiYWNrc1twb3J0X25hbWVdLmFwcGVuZCgnYmFzZScpCisgICAgcmV0dXJu
IHBvcnRfZmFsbGJhY2tzCisKK2RlZiBjbHVzdGVyX2ZpbGVfaGFzaGVzKCk6CisgICAgIiIiR2V0
IHRoZSBoYXNoZXMgb2YgYWxsIHRoZSB0ZXN0IGV4cGVjdGF0aW9ucyBpbiB0aGUgdHJlZS4KKyAg
ICBXZSBjaGVhdCBhbmQgdXNlIGdpdCdzIGhhc2hlcy4KKworICAgIFJldHVybnM6CisgICAgICAg
IEEgZGljdGlvbmFyeSBtYXBwaW5nICh0ZXN0IG5hbWUsIGhhc2ggb2YgY29udGVudCkgPT4gW3Bh
dGhzXQorICAgICIiIgorCisgICAgIyBBIG1hcCBvZiBmaWxlIGhhc2ggPT4gc2V0IG9mIGFsbCBm
aWxlcyB3aXRoIHRoYXQgaGFzaC4KKyAgICBoYXNoZXMgPSBjb2xsZWN0aW9ucy5kZWZhdWx0ZGlj
dChzZXQpCisKKyAgICAjIEZpbGwgaW4gdGhlIG1hcC4KKyAgICBjbWQgPSBbJ2dpdCcsICdscy10
cmVlJywgJy1yJywgJ0hFQUQnLCAnTGF5b3V0VGVzdHMnXQorICAgIHRyeToKKyAgICAgICAgZ2l0
ID0gc3VicHJvY2Vzcy5Qb3BlbihjbWQsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCisgICAgZXhj
ZXB0IE9TRXJyb3IsIGU6CisgICAgICAgIGlmIGUuZXJybm8gPT0gMjogICMgTm8gc3VjaCBmaWxl
IG9yIGRpcmVjdG9yeS4KKyAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICJFcnJvcjog
J05vIHN1Y2ggZmlsZScgd2hlbiBydW5uaW5nIGdpdC4iCisgICAgICAgICAgICBwcmludCA+PiBz
eXMuc3RkZXJyLCAiVGhpcyBzY3JpcHQgcmVxdWlyZXMgZ2l0LiIKKyAgICAgICAgICAgIHN5cy5l
eGl0KDEpCisgICAgICAgIHJhaXNlIGUKKworICAgIGZvciBsaW5lIGluIGdpdC5zdGRvdXQ6Cisg
ICAgICAgIGF0dHJzLCBwYXRoID0gbGluZS5zdHJpcCgpLnNwbGl0KCdcdCcpCisgICAgICAgIGlm
IG5vdCAnLWV4cGVjdGVkJyBpbiBwYXRoOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAg
cGF0aCA9IHBhdGhbbGVuKCdMYXlvdXRUZXN0cy8nKTpdCisgICAgICAgIG1hdGNoID0gcmUubWF0
Y2gocideKHBsYXRmb3JtLy4qPy8pPyguKiknLCBwYXRoKQorICAgICAgICB0ZXN0ID0gbWF0Y2gu
Z3JvdXAoMikKKyAgICAgICAgXywgXywgaGFzaCA9IGF0dHJzLnNwbGl0KCcgJykKKyAgICAgICAg
aGFzaGVzWyh0ZXN0LCBoYXNoKV0uYWRkKHBhdGgpCisKKyAgICByZXR1cm4gaGFzaGVzCisKK2Rl
ZiBmaW5kX2R1cHMoaGFzaGVzLCBwb3J0X2ZhbGxiYWNrcyk6CisgICAgIiIiR2l2ZW4gdGhlIG91
dHB1dCBvZiB0aGUgYWJvdmUgdHdvIGZ1bmN0aW9ucywgeWllbGQgaW5mbyBhYm91dCByZWR1bmRh
bnQKKyAgICB0ZXN0IGV4cGVjdGF0aW9ucy4iIiIKKyAgICBmb3IgKHRlc3QsIGhhc2gpLCBjbHVz
dGVyIGluIGhhc2hlcy5pdGVtcygpOgorICAgICAgICBpZiBsZW4oY2x1c3RlcikgPCAyOgorICAg
ICAgICAgICAgY29udGludWUgICMgQ29tbW9uIGNhc2U6IG9ubHkgb25lIGZpbGUgd2l0aCB0aGF0
IGhhc2guCisKKyAgICAgICAgIyBDb21wdXRlIHRoZSBsaXN0IG9mIHBsYXRmb3JtcyB3ZSBoYXZl
IHRoaXMgcGFydGljdWxhciBoYXNoIGZvci4KKyAgICAgICAgcGxhdGZvcm1zID0ge30KKyAgICAg
ICAgZm9yIHBhdGggaW4gY2x1c3RlcjoKKyAgICAgICAgICAgIG1hdGNoID0gcmUubWF0Y2gocide
cGxhdGZvcm0vKC4qPykvJywgcGF0aCkKKyAgICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAg
ICAgICAgIHBsYXRmb3JtID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgICAgIGVsc2U6CisgICAg
ICAgICAgICAgICAgcGxhdGZvcm0gPSAnYmFzZScKKyAgICAgICAgICAgIHBsYXRmb3Jtc1twbGF0
Zm9ybV0gPSBwYXRoCisgICAgICAgIGlmIGxlbihwbGF0Zm9ybXMpID09IDE6CisgICAgICAgICAg
ICBjb250aW51ZQorCisgICAgICAgICMgU2VlIGlmIGFueSBvZiB0aGUgcGxhdGZvcm1zIGFyZSBy
ZWR1bmRhbnQgd2l0aCBlYWNoIG90aGVyLgorICAgICAgICBmb3IgcGxhdGZvcm0gaW4gcGxhdGZv
cm1zLmtleXMoKToKKyAgICAgICAgICAgIGZvciBmYWxsYmFjayBpbiBwb3J0X2ZhbGxiYWNrc1tw
bGF0Zm9ybV06CisgICAgICAgICAgICAgICAgaWYgZmFsbGJhY2sgaW4gcGxhdGZvcm1zLmtleXMo
KToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgdGVzdCwgcGxhdGZvcm0sIGZhbGxiYWNrLCBw
bGF0Zm9ybXNbcGxhdGZvcm1dCisKK2xpc3Rfb25seSA9IEZhbHNlCitpZiBsZW4oc3lzLmFyZ3Yp
ID4gMSBhbmQgc3lzLmFyZ3ZbMV0gPT0gJy0tbGlzdCc6CisgICAgbGlzdF9vbmx5ID0gVHJ1ZQor
Citwb3J0X2ZhbGxiYWNrcyA9IGdldF9wb3J0X2ZhbGxiYWNrcygpCitoYXNoZXMgPSBjbHVzdGVy
X2ZpbGVfaGFzaGVzKCkKK2ZvciB0ZXN0LCBwbGF0Zm9ybSwgZmFsbGJhY2ssIHBhdGggaW4gZmlu
ZF9kdXBzKGhhc2hlcywgcG9ydF9mYWxsYmFja3MpOgorICAgIGlmIGxpc3Rfb25seToKKyAgICAg
ICAgcHJpbnQgcGF0aAorICAgIGVsc2U6CisgICAgICAgIHByaW50ICIqIiwgdGVzdAorICAgICAg
ICBwcmludCAiICByZWR1bmRhbnRseSBvbiAlcyBhbmQgJXM7IiAlIChwbGF0Zm9ybSwgZmFsbGJh
Y2spCisgICAgICAgIHByaW50ICIgIGNvbnNpZGVyIGRlbGV0aW5nIiwgcGF0aAorCg==
</data>
<flag name="review"
          id="37125"
          type_id="1"
          status="-"
          setter="abarth"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>63990</attachid>
            <date>2010-08-10 02:22:39 -0700</date>
            <delta_ts>2010-08-10 10:32:23 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-37630-20100810102236.patch</filename>
            <type>text/plain</type>
            <size>14747</size>
            <attacher name="Marcus Bulach">bulach</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCBlOTExMTY5OGZhNmI3OWQ1NGFmYTM3ZGQ3ZmQxMjlmMWRlOGNlMTE2Li5mYmQ0M2Q1
OTU2ZTYyYTg0MWVjNDVlMjFhNTY4OWUxNmJkY2RjZjkwIDEwMDY0NAotLS0gYS9XZWJLaXRUb29s
cy9DaGFuZ2VMb2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTggQEAK
KzIwMTAtMDgtMDkgIE1hcmN1cyBCdWxhY2ggIDxidWxhY2hAY2hyb21pdW0ub3JnPgorICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBDaGVjayBpbiBhIHNjcmlw
dCB0byBsaXN0IHJlZHVuZGFudCB0ZXN0IG91dHB1dHMuCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNzYzMAorCisgICAgICAgIElmIGUuZy4gcGxhdGZv
cm0vbWFjLWxlb3BhcmQgaXMgbWlzc2luZyBhbiBleHBlY3RlZCB0ZXN0IG91dHB1dCwgd2UKKyAg
ICAgICAgZmFsbCBiYWNrIG9uIHBsYXRmb3JtL21hYy4gIFRoaXMgbWVhbnMgaXQncyBwb3NzaWJs
ZSB0byBncm93IHJlZHVuZGFudAorICAgICAgICB0ZXN0IG91dHB1dHMsIHdoZXJlIHdlIGhhdmUg
dGhlIHNhbWUgZXhwZWN0ZWQgZGF0YSBpbiBib3RoIGEgcGxhdGZvcm0KKyAgICAgICAgZGlyZWN0
b3J5IGFuZCBhbm90aGVyIHBsYXRmb3JtIGl0IGZhbGxzIGJhY2sgb24uCisgICAgICAgIChvcmln
aW5hbCBwYXRjaCBieSBFdmFuIE1hcnRpbmcgPGV2YW5AY2hyb21pdW0ub3JnPiBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9hdHRhY2htZW50LmNnaT9pZD01MzM5OCkKKworICAgICAgICAqIFNjcmlw
dHMvZGVkdXBsaWNhdGVfdGVzdHMucHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvZGVkdXBs
aWNhdGVfdGVzdHNfdW5pdHRlc3QucHk6IEFkZGVkLgorCiAyMDEwLTA4LTA5ICBBbnRvbmlvIEdv
bWVzICA8dG9uaWtpdG9vQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgQXJpeWEg
SGlkYXlhdC4KZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvZGVkdXBsaWNhdGVfdGVz
dHMucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL2RlZHVwbGljYXRlX3Rlc3RzLnB5Cm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLmE4MjkxZTEzYjI0YmEzOGRlYjg1NDFiYzhmZWI1YzQyMDY5NTViNWEKLS0tIC9kZXYvbnVs
bAorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL2RlZHVwbGljYXRlX3Rlc3RzLnB5CkBAIC0wLDAg
KzEsMTkyIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IChDKSAyMDEwIEdv
b2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuICBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBB
TlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkKKyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisjIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisKKyIiImRlZHVwbGljYXRlX3Rlc3RzIC0tIHByaW50IHRlc3QgcmVzdWx0cyBkdXBs
aWNhdGVkIGJldHdlZW4gcGxhdGZvcm1zLgorCitJZiBwbGF0Zm9ybS9tYWMtbGVvcGFyZCBpcyBt
aXNzaW5nIGFuIGV4cGVjdGVkIHRlc3Qgb3V0cHV0LCB3ZSBmYWxsIGJhY2sgb24KK3BsYXRmb3Jt
L21hYy4gIFRoaXMgbWVhbnMgaXQncyBwb3NzaWJsZSB0byBncm93IHJlZHVuZGFudCB0ZXN0IG91
dHB1dHMsCit3aGVyZSB3ZSBoYXZlIHRoZSBzYW1lIGV4cGVjdGVkIGRhdGEgaW4gYm90aCBhIHBs
YXRmb3JtIGRpcmVjdG9yeSBhbmQgYW5vdGhlcgorcGxhdGZvcm0gaXQgZmFsbHMgYmFjayBvbi4K
KworVGhpcyBjb21tYW5kIGR1bXBzIG91dCBhbGwgc3VjaCBmaWxlcy4gIFlvdSBjYW4gdXNlIGl0
IGxpa2UgdGhpczoKKyAgZGVkdXBsaWNhdGVfdGVzdHMgLS1wcmV0dHktcHJpbnQgICMgcHJpbnQg
b3V0IHRoZSBkdXBsaWNhdGVkIGZpbGVzCisgIGRlZHVwbGljYXRlX3Rlc3RzIHwgeGFyZ3MgZ2l0
IHJtICAgIyBkZWxldGUgdGhlbQorIiIiCisKK2ltcG9ydCBjb2xsZWN0aW9ucworaW1wb3J0IGZu
bWF0Y2gKK2ltcG9ydCBvcHRwYXJzZQoraW1wb3J0IG9zLnBhdGgKK2ltcG9ydCBzdWJwcm9jZXNz
CitpbXBvcnQgc3lzCitpbXBvcnQgcmUKK2ltcG9ydCB3ZWJraXRweS5jb21tb24uc3lzdGVtLmV4
ZWN1dGl2ZSBhcyBleGVjdXRpdmUKK2ltcG9ydCB3ZWJraXRweS5jb21tb24uc3lzdGVtLmxvZ3V0
aWxzIGFzIGxvZ3V0aWxzCitpbXBvcnQgd2Via2l0cHkubGF5b3V0X3Rlc3RzLnBvcnQuZmFjdG9y
eSBhcyBwb3J0X2ZhY3RvcnkKKworX2xvZyA9IGxvZ3V0aWxzLmdldF9sb2dnZXIoX19maWxlX18p
CisKKworZGVmIGdldF9wb3J0X2ZhbGxiYWNrcygpOgorICAgICIiIkdldCB0aGUgcG9ydCBmYWxs
YmFjayBpbmZvcm1hdGlvbi4KKyAgICBSZXR1cm5zOgorICAgICAgICBBIGRpY3Rpb25hcnkgbWFw
cGluZyBwbGF0Zm9ybSBuYW1lIHRvIGEgbGlzdCBvZiBvdGhlciBwbGF0Zm9ybXMgdG8gZmFsbAor
ICAgICAgICBiYWNrIG9uLiAgQWxsIHBsYXRmb3JtcyBmYWxsIGJhY2sgb24gJ2Jhc2UnLgorICAg
ICIiIgorICAgIHBvcnRfZmFsbGJhY2tzID0geydiYXNlJzogW119CisgICAgZm9yIHBvcnRfbmFt
ZSBpbiBvcy5saXN0ZGlyKG9zLnBhdGguam9pbignTGF5b3V0VGVzdHMnLCAncGxhdGZvcm0nKSk6
CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBsYXRmb3JtcyA9IHBvcnRfZmFjdG9yeS5nZXQo
cG9ydF9uYW1lKS5iYXNlbGluZV9zZWFyY2hfcGF0aCgpCisgICAgICAgIGV4Y2VwdCBOb3RJbXBs
ZW1lbnRlZEVycm9yOgorICAgICAgICAgICAgX2xvZy5lcnJvcigiJyVzJyBsYWNrcyBiYXNlbGlu
ZV9zZWFyY2hfcGF0aCgpIiAlIHBvcnRfbmFtZSkKKyAgICAgICAgICAgIHBvcnRfZmFsbGJhY2tz
W3BvcnRfbmFtZV0gPSBbJ2Jhc2UnXQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgcG9y
dF9mYWxsYmFja3NbcG9ydF9uYW1lXSA9IFtvcy5wYXRoLmJhc2VuYW1lKHApIGZvciBwIGluIHBs
YXRmb3Jtc11bMTpdCisgICAgICAgIHBvcnRfZmFsbGJhY2tzW3BvcnRfbmFtZV0uYXBwZW5kKCdi
YXNlJykKKyAgICByZXR1cm4gcG9ydF9mYWxsYmFja3MKKworCitkZWYgY2x1c3Rlcl9maWxlX2hh
c2hlcyhnbG9iX3BhdHRlcm4pOgorICAgICIiIkdldCB0aGUgaGFzaGVzIG9mIGFsbCB0aGUgdGVz
dCBleHBlY3RhdGlvbnMgaW4gdGhlIHRyZWUuCisgICAgV2UgY2hlYXQgYW5kIHVzZSBnaXQncyBo
YXNoZXMuCisgICAgQXJnczoKKyAgICAgICAgZ2xvYl9wYXR0ZXJuOiBhIHBhdHRlcm4gdG8gZmls
dGVyIHRoZSBmaWxlcy4KKyAgICBSZXR1cm5zOgorICAgICAgICBBIGRpY3Rpb25hcnkgbWFwcGlu
ZyAodGVzdCBuYW1lLCBoYXNoIG9mIGNvbnRlbnQpID0+IFtwYXRoc10KKyAgICAiIiIKKworICAg
ICMgQSBtYXAgb2YgZmlsZSBoYXNoID0+IHNldCBvZiBhbGwgZmlsZXMgd2l0aCB0aGF0IGhhc2gu
CisgICAgaGFzaGVzID0gY29sbGVjdGlvbnMuZGVmYXVsdGRpY3Qoc2V0KQorCisgICAgIyBGaWxs
IGluIHRoZSBtYXAuCisgICAgY21kID0gWydnaXQnLCAnbHMtdHJlZScsICctcicsICdIRUFEJywg
J0xheW91dFRlc3RzJ10KKyAgICB0cnk6CisgICAgICAgIGdpdCA9IGV4ZWN1dGl2ZS5FeGVjdXRp
dmUoKS5ydW5fY29tbWFuZChjbWQpCisgICAgZXhjZXB0IE9TRXJyb3IsIGU6CisgICAgICAgIGlm
IGUuZXJybm8gPT0gMjogICMgTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeS4KKyAgICAgICAgICAg
IF9sb2cuZXJyb3IoIkVycm9yOiAnTm8gc3VjaCBmaWxlJyB3aGVuIHJ1bm5pbmcgZ2l0LiIpCisg
ICAgICAgICAgICBfbG9nLmVycm9yKCJUaGlzIHNjcmlwdCByZXF1aXJlcyBnaXQuIikKKyAgICAg
ICAgICAgIHN5cy5leGl0KDEpCisgICAgICAgIHJhaXNlIGUKKworICAgIGZvciBsaW5lIGluIGdp
dC5zcGxpdCgnXG4nKToKKyAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICBicmVhawor
ICAgICAgICBhdHRycywgcGF0aCA9IGxpbmUuc3RyaXAoKS5zcGxpdCgnXHQnKQorICAgICAgICBp
ZiBub3QgZm5tYXRjaC5mbm1hdGNoKHBhdGgsIGdsb2JfcGF0dGVybik6CisgICAgICAgICAgICBj
b250aW51ZQorICAgICAgICBwYXRoID0gcGF0aFtsZW4oJ0xheW91dFRlc3RzLycpOl0KKyAgICAg
ICAgbWF0Y2ggPSByZS5tYXRjaChyJ14ocGxhdGZvcm0vLio/Lyk/KC4qKScsIHBhdGgpCisgICAg
ICAgIHRlc3QgPSBtYXRjaC5ncm91cCgyKQorICAgICAgICBfLCBfLCBoYXNoID0gYXR0cnMuc3Bs
aXQoJyAnKQorICAgICAgICBoYXNoZXNbKHRlc3QsIGhhc2gpXS5hZGQocGF0aCkKKworICAgIHJl
dHVybiBoYXNoZXMKKworCitkZWYgZmluZF9kdXBzKGhhc2hlcywgcG9ydF9mYWxsYmFja3MpOgor
ICAgICIiIllpZWxkcyBpbmZvIGFib3V0IHJlZHVuZGFudCB0ZXN0IGV4cGVjdGF0aW9ucy4KKyAg
ICBBcmdzOgorICAgICAgICBoYXNoZXM6IGEgbGlzdCBvZiBoYXNoZXMgYXMgcmV0dXJuZWQgYnkg
Y2x1c3Rlcl9maWxlX2hhc2hlcy4KKyAgICAgICAgcG9ydF9mYWxsYmFja3M6IGEgbGlzdCBvZiBm
YWxsYmFjayBpbmZvcm1hdGlvbiBhcyByZXR1cm5lZCBieSBnZXRfcG9ydF9mYWxsYmFja3MuCisg
ICAgUmV0dXJuczoKKyAgICAgICAgYSB0dXBsZSBjb250YWluaW5nICh0ZXN0LCBwbGF0Zm9ybSwg
ZmFsbGJhY2ssIHBsYXRmb3JtcykKKyAgICAiIiIKKyAgICBmb3IgKHRlc3QsIGhhc2gpLCBjbHVz
dGVyIGluIGhhc2hlcy5pdGVtcygpOgorICAgICAgICBpZiBsZW4oY2x1c3RlcikgPCAyOgorICAg
ICAgICAgICAgY29udGludWUgICMgQ29tbW9uIGNhc2U6IG9ubHkgb25lIGZpbGUgd2l0aCB0aGF0
IGhhc2guCisKKyAgICAgICAgIyBDb21wdXRlIHRoZSBsaXN0IG9mIHBsYXRmb3JtcyB3ZSBoYXZl
IHRoaXMgcGFydGljdWxhciBoYXNoIGZvci4KKyAgICAgICAgcGxhdGZvcm1zID0ge30KKyAgICAg
ICAgZm9yIHBhdGggaW4gY2x1c3RlcjoKKyAgICAgICAgICAgIG1hdGNoID0gcmUubWF0Y2gocide
cGxhdGZvcm0vKC4qPykvJywgcGF0aCkKKyAgICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAg
ICAgICAgIHBsYXRmb3JtID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgICAgIGVsc2U6CisgICAg
ICAgICAgICAgICAgcGxhdGZvcm0gPSAnYmFzZScKKyAgICAgICAgICAgIHBsYXRmb3Jtc1twbGF0
Zm9ybV0gPSBwYXRoCisgICAgICAgIGlmIGxlbihwbGF0Zm9ybXMpID09IDE6CisgICAgICAgICAg
ICBjb250aW51ZQorCisgICAgICAgICMgU2VlIGlmIGFueSBvZiB0aGUgcGxhdGZvcm1zIGFyZSBy
ZWR1bmRhbnQgd2l0aCBlYWNoIG90aGVyLgorICAgICAgICBmb3IgcGxhdGZvcm0gaW4gcGxhdGZv
cm1zLmtleXMoKToKKyAgICAgICAgICAgIGZvciBmYWxsYmFjayBpbiBwb3J0X2ZhbGxiYWNrc1tw
bGF0Zm9ybV06CisgICAgICAgICAgICAgICAgaWYgZmFsbGJhY2sgaW4gcGxhdGZvcm1zLmtleXMo
KToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgdGVzdCwgcGxhdGZvcm0sIGZhbGxiYWNrLCBw
bGF0Zm9ybXNbcGxhdGZvcm1dCisKKworZGVmIGRlZHVwbGljYXRlKGdsb2JfcGF0dGVybik6Cisg
ICAgcmV0ID0gW10KKyAgICBwb3J0X2ZhbGxiYWNrcyA9IGdldF9wb3J0X2ZhbGxiYWNrcygpCisg
ICAgaGFzaGVzID0gY2x1c3Rlcl9maWxlX2hhc2hlcyhnbG9iX3BhdHRlcm4pCisgICAgZm9yIHRl
c3QsIHBsYXRmb3JtLCBmYWxsYmFjaywgcGF0aCBpbiBmaW5kX2R1cHMoaGFzaGVzLCBwb3J0X2Zh
bGxiYWNrcyk6CisgICAgICAgIHJldCArPSBbeyd0ZXN0JzogdGVzdCwgJ3BhdGgnOiBwYXRoLAor
ICAgICAgICAgICAgICAgICAncGxhdGZvcm0nOiBwbGF0Zm9ybSwgJ2ZhbGxiYWNrJzogZmFsbGJh
Y2t9XQorICAgIHJldHVybiByZXQKKworCitkZWYgcGFyc2VfYXJncygpOgorICAgICIiIlByb3Zp
ZGVzIGEgZGVmYXVsdCBzZXQgb2YgY29tbWFuZCBsaW5lIGFyZ3MuCisKKyAgICBSZXR1cm5zIGEg
dHVwbGUgb2Ygb3B0aW9ucywgYXJncyBmcm9tIG9wdHBhcnNlIiIiCisKKyAgICBjb25maWd1cmF0
aW9uX29wdGlvbnMgPSBbCisgICAgICAgIG9wdHBhcnNlLm1ha2Vfb3B0aW9uKCItcCIsICItLXBy
ZXR0eS1wcmludCIsIGRlc3Q9InByZXR0eV9wcmludCIsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlZmF1bHQ9RmFsc2UsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGhlbHA9IlByZXR0eSBwcmludHMgdGhlIG91dHB1dC4iKSwKKyAgICAg
ICAgb3B0cGFyc2UubWFrZV9vcHRpb24oIi1nIiwgIi0tZ2xvYiIsIGRlc3Q9Imdsb2JfcGF0dGVy
biIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IiotZXhwZWN0ZWQqIiwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iU3BlY2lmeSB0aGUgZ2xvYiB0byBm
aWx0ZXIgdGhlIGZpbGVzLCBkZWZhdWx0cyB0byAqLWV4cGVjdGVkKi4iKSwKKyAgICBdCisKKyAg
ICBvcHRpb25fbGlzdCA9IChjb25maWd1cmF0aW9uX29wdGlvbnMpCisgICAgb3B0aW9uX3BhcnNl
ciA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcihvcHRpb25fbGlzdD1vcHRpb25fbGlzdCkKKworICAg
IG9wdGlvbnMsIF8gPSBvcHRpb25fcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgICAgcmV0dXJuIG9w
dGlvbnMKKworCitkZWYgcnVuKG9wdGlvbnMpOgorICAgIGlmIG9wdGlvbnMucHJldHR5X3ByaW50
OgorICAgICAgICBmb3JtYXQgPSAoIiogJSh0ZXN0KXNcbiIKKyAgICAgICAgICAgICAgICAgICJc
dHJlZHVuZGFudGx5IG9uICUocGxhdGZvcm0pcyBhbmQgJShmYWxsYmFjaylzXG4iCisgICAgICAg
ICAgICAgICAgICAiXHRjb25zaWRlciBkZWxldGluZyAlKHBhdGgpcyIpCisgICAgICAgIHByaW50
ZXJfZnVuY3Rpb24gPSBfbG9nLmluZm8KKyAgICBlbHNlOgorICAgICAgICBmb3JtYXQgPSAiJShw
YXRoKXNcbiIKKyAgICAgICAgcHJpbnRlcl9mdW5jdGlvbiA9IHN5cy5zdGRvdXQud3JpdGUKKwor
ICAgIGZvciBkdXBlIGluIGRlZHVwbGljYXRlKG9wdGlvbnMuZ2xvYl9wYXR0ZXJuKToKKyAgICAg
ICAgcHJpbnRlcl9mdW5jdGlvbihmb3JtYXQgJSBkdXBlKQorCisKK2RlZiBtYWluKCk6CisgICAg
bG9ndXRpbHMuY29uZmlndXJlX2xvZ2dpbmcoKQorICAgIG9wdGlvbnMgPSBwYXJzZV9hcmdzKCkK
KyAgICBydW4ob3B0aW9ucykKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIG1h
aW4oKQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy9kZWR1cGxpY2F0ZV90ZXN0c191
bml0dGVzdC5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvZGVkdXBsaWNhdGVfdGVzdHNfdW5pdHRl
c3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMC4uNDI1ZWYzYjdkMDQ0ZTQ1ZjA3YTlkYmJiZGY4YTcwZWI1ZTVjODZi
NAotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvZGVkdXBsaWNhdGVfdGVz
dHNfdW5pdHRlc3QucHkKQEAgLTAsMCArMSwxMTIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgor
IyBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMK
KyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiAgUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMg
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09O
VFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorIyBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
IyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworaW1wb3J0IGRlZHVwbGljYXRlX3Rlc3Rz
CitpbXBvcnQgb3MKK2ltcG9ydCB1bml0dGVzdAorCisKK2NsYXNzIE1vY2tFeGVjdXRpdmUob2Jq
ZWN0KToKKyAgICBsYXN0X3J1bl9jb21tYW5kID0gW10KKyAgICByZXNwb25zZSA9ICcnCisKKyAg
ICBjbGFzcyBFeGVjdXRpdmUob2JqZWN0KToKKyAgICAgICAgZGVmIHJ1bl9jb21tYW5kKHNlbGYs
CisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAg
Y3dkPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dD1Ob25lLAorICAgICAgICAg
ICAgICAgICAgICAgICAgZXJyb3JfaGFuZGxlcj1Ob25lLAorICAgICAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuX2V4aXRfY29kZT1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVy
bl9zdGRlcnI9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9vdXRwdXQ9VHJ1
ZSk6CisgICAgICAgICAgICBNb2NrRXhlY3V0aXZlLmxhc3RfcnVuX2NvbW1hbmQgKz0gW2FyZ3Nd
CisgICAgICAgICAgICByZXR1cm4gTW9ja0V4ZWN1dGl2ZS5yZXNwb25zZQorCisKK2NsYXNzIExp
c3REdXBsaWNhdGVzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYp
OgorICAgICAgICBNb2NrRXhlY3V0aXZlLmxhc3RfcnVuX2NvbW1hbmQgPSBbXQorICAgICAgICBN
b2NrRXhlY3V0aXZlLnJlc3BvbnNlID0gJycKKyAgICAgICAgZGVkdXBsaWNhdGVfdGVzdHMuZXhl
Y3V0aXZlID0gTW9ja0V4ZWN1dGl2ZQorCisgICAgZGVmIHRlc3RfdW5pcXVlKHNlbGYpOgorICAg
ICAgICBNb2NrRXhlY3V0aXZlLnJlc3BvbnNlID0gKAorICAgICAgICAgICAgJzEwMDY0NCBibG9i
IDUwNTMyNDBiMzM1M2Y2ZWIzOWY3Y2IwMDI1OTc4NWYxNmQxMjFkZjJcdExheW91dFRlc3RzL21h
Yy9mb28tZXhwZWN0ZWQudHh0XG4nCisgICAgICAgICAgICAnMTAwNjQ0IGJsb2IgYTAwNDU0OGQx
MDdlY2M0ZTFlYTA4MDE5ZGFmMGExNGU4NjM0YTFmZlx0TGF5b3V0VGVzdHMvcGxhdGZvcm0vY2hy
b21pdW0vZm9vLWV4cGVjdGVkLnR4dFxuJworICAgICAgICAgICAgJzEwMDY0NCBibG9iIGFiY2Qw
YmM3NjJlM2FlYzVkZjAzYjVjMDQ0ODViMmNiM2I2NWZmYjFcdExheW91dFRlc3RzL3BsYXRmb3Jt
L2Nocm9taXVtLWxpbnV4L2Zvby1leHBlY3RlZC50eHRcbicKKyAgICAgICAgICAgICcxMDA2NDQg
YmxvYiBkNmJiMGJjNzYyZTNhZWM1ZGYwM2I1YzA0NDg1YjJjYjNiNjVmZmIxXHRMYXlvdXRUZXN0
cy9wbGF0Zm9ybS9jaHJvbWl1bS13aW4vZm9vLWV4cGVjdGVkLnR4dFxuJworICAgICAgICAgICAg
JzEwMDY0NCBibG9iIDQzMDNkZjUzODljYTg3Y2FlODNkZDMyMzZiOGRkODRlMTY2MDY1MTdcdExh
eW91dFRlc3RzL3BsYXRmb3JtL21hYy9mb28tZXhwZWN0ZWQudHh0XG4nKQorICAgICAgICByZXN1
bHQgPSBkZWR1cGxpY2F0ZV90ZXN0cy5kZWR1cGxpY2F0ZSgnKicpCisgICAgICAgIHNlbGYuYXNz
ZXJ0RXF1YWxzKDEsIGxlbihNb2NrRXhlY3V0aXZlLmxhc3RfcnVuX2NvbW1hbmQpKQorICAgICAg
ICBzZWxmLmFzc2VydEVxdWFscyhbWydnaXQnLCAnbHMtdHJlZScsICctcicsICdIRUFEJywgJ0xh
eW91dFRlc3RzJ11dLCBNb2NrRXhlY3V0aXZlLmxhc3RfcnVuX2NvbW1hbmQpCisgICAgICAgIHNl
bGYuYXNzZXJ0RXF1YWxzKDAsIGxlbihyZXN1bHQpKQorCisgICAgZGVmIHRlc3RfZHVwbGljYXRl
cyhzZWxmKToKKyAgICAgICAgTW9ja0V4ZWN1dGl2ZS5yZXNwb25zZSA9ICgKKyAgICAgICAgICAg
ICcxMDA2NDQgYmxvYiA1MDUzMjQwYjMzNTNmNmViMzlmN2NiMDAyNTk3ODVmMTZkMTIxZGYyXHRM
YXlvdXRUZXN0cy9tYWMvZm9vLWV4cGVjdGVkLnR4dFxuJworICAgICAgICAgICAgJzEwMDY0NCBi
bG9iIGEwMDQ1NDhkMTA3ZWNjNGUxZWEwODAxOWRhZjBhMTRlODYzNGExZmZcdExheW91dFRlc3Rz
L3BsYXRmb3JtL2Nocm9taXVtL2Zvby1leHBlY3RlZC50eHRcbicKKyAgICAgICAgICAgICcxMDA2
NDQgYmxvYiBkNmJiMGJjNzYyZTNhZWM1ZGYwM2I1YzA0NDg1YjJjYjNiNjVmZmIxXHRMYXlvdXRU
ZXN0cy9wbGF0Zm9ybS9jaHJvbWl1bS1saW51eC9mb28tZXhwZWN0ZWQudHh0XG4nCisgICAgICAg
ICAgICAnMTAwNjQ0IGJsb2IgYWJjZGViYzc2MmUzYWVjNWRmMDNiNWMwNDQ4NWIyY2IzYjY1ZmZi
MVx0TGF5b3V0VGVzdHMvcGxhdGZvcm0vY2hyb21pdW0tbGludXgvYW5pbWFnZS5wbmdcbicKKyAg
ICAgICAgICAgICcxMDA2NDQgYmxvYiBkNmJiMGJjNzYyZTNhZWM1ZGYwM2I1YzA0NDg1YjJjYjNi
NjVmZmIxXHRMYXlvdXRUZXN0cy9wbGF0Zm9ybS9jaHJvbWl1bS13aW4vZm9vLWV4cGVjdGVkLnR4
dFxuJworICAgICAgICAgICAgJzEwMDY0NCBibG9iIGFiY2RlYmM3NjJlM2FlYzVkZjAzYjVjMDQ0
ODViMmNiM2I2NWZmYjFcdExheW91dFRlc3RzL3BsYXRmb3JtL2Nocm9taXVtLXdpbi9hbmltYWdl
LnBuZ1xuJworICAgICAgICAgICAgJzEwMDY0NCBibG9iIDQzMDNkZjUzODljYTg3Y2FlODNkZDMy
MzZiOGRkODRlMTY2MDY1MTdcdExheW91dFRlc3RzL3BsYXRmb3JtL21hYy9mb28tZXhwZWN0ZWQu
dHh0XG4nKQorCisgICAgICAgIHJlc3VsdCA9IGRlZHVwbGljYXRlX3Rlc3RzLmRlZHVwbGljYXRl
KCcqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgbGVuKE1vY2tFeGVjdXRpdmUubGFz
dF9ydW5fY29tbWFuZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFsnZ2l0JywgJ2xzLXRy
ZWUnLCAnLXInLCAnSEVBRCcsICdMYXlvdXRUZXN0cyddLCBNb2NrRXhlY3V0aXZlLmxhc3RfcnVu
X2NvbW1hbmRbLTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygyLCBsZW4ocmVzdWx0KSkK
KyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeyd0ZXN0JzogJ2FuaW1hZ2UucG5nJywKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICdwYXRoJzogJ3BsYXRmb3JtL2Nocm9taXVtLWxpbnV4L2Fu
aW1hZ2UucG5nJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdmYWxsYmFjayc6ICdjaHJv
bWl1bS13aW4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtJzogJ2Nocm9t
aXVtLWxpbnV4J30sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFswXSkKKyAgICAg
ICAgc2VsZi5hc3NlcnRFcXVhbHMoeyd0ZXN0JzogJ2Zvby1leHBlY3RlZC50eHQnLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgJ3BhdGgnOiAncGxhdGZvcm0vY2hyb21pdW0tbGludXgvZm9v
LWV4cGVjdGVkLnR4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmFsbGJhY2snOiAn
Y2hyb21pdW0td2luJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybSc6ICdj
aHJvbWl1bS1saW51eCd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbMV0pCisK
KyAgICAgICAgcmVzdWx0ID0gZGVkdXBsaWNhdGVfdGVzdHMuZGVkdXBsaWNhdGUoJyoudHh0JykK
KyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMiwgbGVuKE1vY2tFeGVjdXRpdmUubGFzdF9ydW5f
Y29tbWFuZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFsnZ2l0JywgJ2xzLXRyZWUnLCAn
LXInLCAnSEVBRCcsICdMYXlvdXRUZXN0cyddLCBNb2NrRXhlY3V0aXZlLmxhc3RfcnVuX2NvbW1h
bmRbLTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4ocmVzdWx0KSkKKyAgICAg
ICAgc2VsZi5hc3NlcnRFcXVhbHMoeyd0ZXN0JzogJ2Zvby1leHBlY3RlZC50eHQnLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgJ3BhdGgnOiAncGxhdGZvcm0vY2hyb21pdW0tbGludXgvZm9v
LWV4cGVjdGVkLnR4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmFsbGJhY2snOiAn
Y2hyb21pdW0td2luJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybSc6ICdj
aHJvbWl1bS1saW51eCd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbMF0pCisK
KyAgICAgICAgcmVzdWx0ID0gZGVkdXBsaWNhdGVfdGVzdHMuZGVkdXBsaWNhdGUoJyoucG5nJykK
KyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMywgbGVuKE1vY2tFeGVjdXRpdmUubGFzdF9ydW5f
Y29tbWFuZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFsnZ2l0JywgJ2xzLXRyZWUnLCAn
LXInLCAnSEVBRCcsICdMYXlvdXRUZXN0cyddLCBNb2NrRXhlY3V0aXZlLmxhc3RfcnVuX2NvbW1h
bmRbLTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4ocmVzdWx0KSkKKyAgICAg
ICAgc2VsZi5hc3NlcnRFcXVhbHMoeyd0ZXN0JzogJ2FuaW1hZ2UucG5nJywKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICdwYXRoJzogJ3BsYXRmb3JtL2Nocm9taXVtLWxpbnV4L2FuaW1hZ2Uu
cG5nJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdmYWxsYmFjayc6ICdjaHJvbWl1bS13
aW4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtJzogJ2Nocm9taXVtLWxp
bnV4J30sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFswXSkKKworCitpZiBfX25h
bWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>64026</attachid>
            <date>2010-08-10 10:32:30 -0700</date>
            <delta_ts>2010-08-10 12:43:49 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-37630-20100810183227.patch</filename>
            <type>text/plain</type>
            <size>16970</size>
            <attacher name="Marcus Bulach">bulach</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCBlOTExMTY5OGZhNmI3OWQ1NGFmYTM3ZGQ3ZmQxMjlmMWRlOGNlMTE2Li4yNDZlN2Zm
MTFkNjZmNGI1OTA4OGM4ZDZiMTI1Y2EzN2QzOGI0MzhkIDEwMDY0NAotLS0gYS9XZWJLaXRUb29s
cy9DaGFuZ2VMb2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTkgQEAK
KzIwMTAtMDgtMTAgIE1hcmN1cyBCdWxhY2ggIDxidWxhY2hAY2hyb21pdW0ub3JnPgorICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBDaGVjayBpbiBhIHNjcmlw
dCB0byBsaXN0IHJlZHVuZGFudCB0ZXN0IG91dHB1dHMuCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNzYzMAorCisgICAgICAgIElmIGUuZy4gcGxhdGZv
cm0vbWFjLWxlb3BhcmQgaXMgbWlzc2luZyBhbiBleHBlY3RlZCB0ZXN0IG91dHB1dCwgd2UKKyAg
ICAgICAgZmFsbCBiYWNrIG9uIHBsYXRmb3JtL21hYy4gIFRoaXMgbWVhbnMgaXQncyBwb3NzaWJs
ZSB0byBncm93IHJlZHVuZGFudAorICAgICAgICB0ZXN0IG91dHB1dHMsIHdoZXJlIHdlIGhhdmUg
dGhlIHNhbWUgZXhwZWN0ZWQgZGF0YSBpbiBib3RoIGEgcGxhdGZvcm0KKyAgICAgICAgZGlyZWN0
b3J5IGFuZCBhbm90aGVyIHBsYXRmb3JtIGl0IGZhbGxzIGJhY2sgb24uCisgICAgICAgIChvcmln
aW5hbCBwYXRjaCBieSBFdmFuIE1hcnRpbmcgPGV2YW5AY2hyb21pdW0ub3JnPiBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9hdHRhY2htZW50LmNnaT9pZD01MzM5OCkKKworICAgICAgICAqIFNjcmlw
dHMvZGVkdXBsaWNhdGUtdGVzdHM6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkv
bGF5b3V0X3Rlc3RzL2RlZHVwbGljYXRlX3Rlc3RzLnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3Jp
cHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9kZWR1cGxpY2F0ZV90ZXN0c191bml0dGVzdC5weTog
QWRkZWQuCisKIDIwMTAtMDgtMDkgIEFudG9uaW8gR29tZXMgIDx0b25pa2l0b29Ad2Via2l0Lm9y
Zz4KIAogICAgICAgICBSZXZpZXdlZCBieSBBcml5YSBIaWRheWF0LgpkaWZmIC0tZ2l0IGEvV2Vi
S2l0VG9vbHMvU2NyaXB0cy9kZWR1cGxpY2F0ZS10ZXN0cyBiL1dlYktpdFRvb2xzL1NjcmlwdHMv
ZGVkdXBsaWNhdGUtdGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNjY0OGQ5Y2FkNzEwZThlZTM1ZDQ1ZGQ5ZDEx
YjAzYTY0MjdhYWYwNwotLS0gL2Rldi9udWxsCisrKyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvZGVk
dXBsaWNhdGUtdGVzdHMKQEAgLTAsMCArMSw4MiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisj
IENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIwor
IyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAg
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05U
UklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
IEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisj
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJkZWR1cGxpY2F0ZS10ZXN0cyAtLSBw
cmludCB0ZXN0IHJlc3VsdHMgZHVwbGljYXRlZCBiZXR3ZWVuIHBsYXRmb3Jtcy4KKworSWYgcGxh
dGZvcm0vbWFjLWxlb3BhcmQgaXMgbWlzc2luZyBhbiBleHBlY3RlZCB0ZXN0IG91dHB1dCwgd2Ug
ZmFsbCBiYWNrIG9uCitwbGF0Zm9ybS9tYWMuICBUaGlzIG1lYW5zIGl0J3MgcG9zc2libGUgdG8g
Z3JvdyByZWR1bmRhbnQgdGVzdCBvdXRwdXRzLAord2hlcmUgd2UgaGF2ZSB0aGUgc2FtZSBleHBl
Y3RlZCBkYXRhIGluIGJvdGggYSBwbGF0Zm9ybSBkaXJlY3RvcnkgYW5kIGFub3RoZXIKK3BsYXRm
b3JtIGl0IGZhbGxzIGJhY2sgb24uCisKK1RoaXMgY29tbWFuZCBkdW1wcyBvdXQgYWxsIHN1Y2gg
ZmlsZXMuICBZb3UgY2FuIHVzZSBpdCBsaWtlIHRoaXM6CisgIGRlZHVwbGljYXRlLXRlc3RzIC0t
cHJldHR5LXByaW50ICAjIHByaW50IG91dCB0aGUgZHVwbGljYXRlZCBmaWxlcworICBkZWR1cGxp
Y2F0ZS10ZXN0cyB8IHhhcmdzIGdpdCBybSAgICMgZGVsZXRlIHRoZW0KKyIiIgorCisKK2ltcG9y
dCBvcHRwYXJzZQoraW1wb3J0IHdlYmtpdHB5LmxheW91dF90ZXN0cy5kZWR1cGxpY2F0ZV90ZXN0
cyBhcyBkZWR1cGxpY2F0ZV90ZXN0cworCisKK2RlZiBwYXJzZV9hcmdzKCk6CisgICAgIiIiUHJv
dmlkZXMgYSBkZWZhdWx0IHNldCBvZiBjb21tYW5kIGxpbmUgYXJncy4KKworICAgIFJldHVybnMg
YSB0dXBsZSBvZiBvcHRpb25zLCBhcmdzIGZyb20gb3B0cGFyc2UiIiIKKworICAgIGNvbmZpZ3Vy
YXRpb25fb3B0aW9ucyA9IFsKKyAgICAgICAgb3B0cGFyc2UubWFrZV9vcHRpb24oIi1wIiwgIi0t
cHJldHR5LXByaW50IiwgZGVzdD0icHJldHR5X3ByaW50IiwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaGVscD0iUHJldHR5IHByaW50cyB0aGUgb3V0cHV0LiIpLAorICAg
ICAgICBvcHRwYXJzZS5tYWtlX29wdGlvbigiLWciLCAiLS1nbG9iIiwgZGVzdD0iZ2xvYl9wYXR0
ZXJuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iKi1leHBlY3RlZCoi
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJTcGVjaWZ5IHRoZSBnbG9iIHRv
IGZpbHRlciB0aGUgZmlsZXMsIGRlZmF1bHRzIHRvICotZXhwZWN0ZWQqLiIpLAorICAgIF0KKwor
ICAgIG9wdGlvbl9saXN0ID0gKGNvbmZpZ3VyYXRpb25fb3B0aW9ucykKKyAgICBvcHRpb25fcGFy
c2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKG9wdGlvbl9saXN0PW9wdGlvbl9saXN0KQorCisg
ICAgb3B0aW9ucywgXyA9IG9wdGlvbl9wYXJzZXIucGFyc2VfYXJncygpCisKKyAgICByZXR1cm4g
b3B0aW9ucworCisKK2RlZiBydW4ob3B0aW9ucyk6CisgICAgaWYgb3B0aW9ucy5wcmV0dHlfcHJp
bnQ6CisgICAgICAgIGZvcm1hdCA9ICgiKiAlKHRlc3Qpc1xuIgorICAgICAgICAgICAgICAgICAg
Ilx0cmVkdW5kYW50bHkgb24gJShwbGF0Zm9ybSlzIGFuZCAlKGZhbGxiYWNrKXNcbiIKKyAgICAg
ICAgICAgICAgICAgICJcdGNvbnNpZGVyIGRlbGV0aW5nICUocGF0aClzIikKKyAgICBlbHNlOgor
ICAgICAgICBmb3JtYXQgPSAiJShwYXRoKXMiCisKKyAgICBmb3IgZHVwZSBpbiBkZWR1cGxpY2F0
ZV90ZXN0cy5kZWR1cGxpY2F0ZShvcHRpb25zLmdsb2JfcGF0dGVybik6CisgICAgICAgIHByaW50
KGZvcm1hdCAlIGR1cGUpCisKKworZGVmIG1haW4oKToKKyAgICBvcHRpb25zID0gcGFyc2VfYXJn
cygpCisgICAgcnVuKG9wdGlvbnMpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAg
ICBtYWluKCkKZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0
X3Rlc3RzL2RlZHVwbGljYXRlX3Rlc3RzLnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9sYXlvdXRfdGVzdHMvZGVkdXBsaWNhdGVfdGVzdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNWZjNWNjMjMx
NmEzMWFmZDc0ODM4YTIyODdkZmMxMjFkZGNhMzEwMwotLS0gL2Rldi9udWxsCisrKyBiL1dlYktp
dFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2RlZHVwbGljYXRlX3Rlc3RzLnB5
CkBAIC0wLDAgKzEsMTQyIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IChD
KSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
IyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIu
ICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMg
SVMiIEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkKKyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwor
IyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GCisjIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisKKyIiImRlZHVwbGljYXRlX3Rlc3RzIC0tIGxpc3RzIGR1cGxpY2F0
ZWQgYmV0d2VlbiBwbGF0Zm9ybXMuCisKK0lmIHBsYXRmb3JtL21hYy1sZW9wYXJkIGlzIG1pc3Np
bmcgYW4gZXhwZWN0ZWQgdGVzdCBvdXRwdXQsIHdlIGZhbGwgYmFjayBvbgorcGxhdGZvcm0vbWFj
LiAgVGhpcyBtZWFucyBpdCdzIHBvc3NpYmxlIHRvIGdyb3cgcmVkdW5kYW50IHRlc3Qgb3V0cHV0
cywKK3doZXJlIHdlIGhhdmUgdGhlIHNhbWUgZXhwZWN0ZWQgZGF0YSBpbiBib3RoIGEgcGxhdGZv
cm0gZGlyZWN0b3J5IGFuZCBhbm90aGVyCitwbGF0Zm9ybSBpdCBmYWxscyBiYWNrIG9uLgorIiIi
CisKK2ltcG9ydCBjb2xsZWN0aW9ucworaW1wb3J0IGZubWF0Y2gKK2ltcG9ydCBvcworaW1wb3J0
IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCByZQoraW1wb3J0IHdlYmtpdHB5LmNvbW1v
bi5zeXN0ZW0uZXhlY3V0aXZlIGFzIGV4ZWN1dGl2ZQoraW1wb3J0IHdlYmtpdHB5LmNvbW1vbi5z
eXN0ZW0ubG9ndXRpbHMgYXMgbG9ndXRpbHMKK2ltcG9ydCB3ZWJraXRweS5sYXlvdXRfdGVzdHMu
cG9ydC5mYWN0b3J5IGFzIHBvcnRfZmFjdG9yeQorCitfbG9nID0gbG9ndXRpbHMuZ2V0X2xvZ2dl
cihfX2ZpbGVfXykKK2xvZ3V0aWxzLmNvbmZpZ3VyZV9sb2dnaW5nKCkKKworCitkZWYgZ2V0X3Bv
cnRfZmFsbGJhY2tzKCk6CisgICAgIiIiR2V0IHRoZSBwb3J0IGZhbGxiYWNrIGluZm9ybWF0aW9u
LgorICAgIFJldHVybnM6CisgICAgICAgIEEgZGljdGlvbmFyeSBtYXBwaW5nIHBsYXRmb3JtIG5h
bWUgdG8gYSBsaXN0IG9mIG90aGVyIHBsYXRmb3JtcyB0byBmYWxsCisgICAgICAgIGJhY2sgb24u
ICBBbGwgcGxhdGZvcm1zIGZhbGwgYmFjayBvbiAnYmFzZScuCisgICAgIiIiCisgICAgcG9ydF9m
YWxsYmFja3MgPSB7J2Jhc2UnOiBbXX0KKyAgICBmb3IgcG9ydF9uYW1lIGluIG9zLmxpc3RkaXIo
b3MucGF0aC5qb2luKCdMYXlvdXRUZXN0cycsICdwbGF0Zm9ybScpKToKKyAgICAgICAgdHJ5Ogor
ICAgICAgICAgICAgcGxhdGZvcm1zID0gcG9ydF9mYWN0b3J5LmdldChwb3J0X25hbWUpLmJhc2Vs
aW5lX3NlYXJjaF9wYXRoKCkKKyAgICAgICAgZXhjZXB0IE5vdEltcGxlbWVudGVkRXJyb3I6Cisg
ICAgICAgICAgICBfbG9nLmVycm9yKCInJXMnIGxhY2tzIGJhc2VsaW5lX3NlYXJjaF9wYXRoKCki
ICUgcG9ydF9uYW1lKQorICAgICAgICAgICAgcG9ydF9mYWxsYmFja3NbcG9ydF9uYW1lXSA9IFsn
YmFzZSddCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBwb3J0X2ZhbGxiYWNrc1twb3J0
X25hbWVdID0gW29zLnBhdGguYmFzZW5hbWUocCkgZm9yIHAgaW4gcGxhdGZvcm1zXVsxOl0KKyAg
ICAgICAgcG9ydF9mYWxsYmFja3NbcG9ydF9uYW1lXS5hcHBlbmQoJ2Jhc2UnKQorICAgIHJldHVy
biBwb3J0X2ZhbGxiYWNrcworCisKK2RlZiBjbHVzdGVyX2ZpbGVfaGFzaGVzKGdsb2JfcGF0dGVy
bik6CisgICAgIiIiR2V0IHRoZSBoYXNoZXMgb2YgYWxsIHRoZSB0ZXN0IGV4cGVjdGF0aW9ucyBp
biB0aGUgdHJlZS4KKyAgICBXZSBjaGVhdCBhbmQgdXNlIGdpdCdzIGhhc2hlcy4KKyAgICBBcmdz
OgorICAgICAgICBnbG9iX3BhdHRlcm46IGEgcGF0dGVybiB0byBmaWx0ZXIgdGhlIGZpbGVzLgor
ICAgIFJldHVybnM6CisgICAgICAgIEEgZGljdGlvbmFyeSBtYXBwaW5nICh0ZXN0IG5hbWUsIGhh
c2ggb2YgY29udGVudCkgPT4gW3BhdGhzXQorICAgICIiIgorCisgICAgIyBBIG1hcCBvZiBmaWxl
IGhhc2ggPT4gc2V0IG9mIGFsbCBmaWxlcyB3aXRoIHRoYXQgaGFzaC4KKyAgICBoYXNoZXMgPSBj
b2xsZWN0aW9ucy5kZWZhdWx0ZGljdChzZXQpCisKKyAgICAjIEZpbGwgaW4gdGhlIG1hcC4KKyAg
ICBjbWQgPSAoJ2dpdCcsICdscy10cmVlJywgJy1yJywgJ0hFQUQnLCAnTGF5b3V0VGVzdHMnKQor
ICAgIHRyeToKKyAgICAgICAgZ2l0ID0gZXhlY3V0aXZlLkV4ZWN1dGl2ZSgpLnJ1bl9jb21tYW5k
KGNtZCkKKyAgICBleGNlcHQgT1NFcnJvciwgZToKKyAgICAgICAgaWYgZS5lcnJubyA9PSAyOiAg
IyBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5LgorICAgICAgICAgICAgX2xvZy5lcnJvcigiRXJy
b3I6ICdObyBzdWNoIGZpbGUnIHdoZW4gcnVubmluZyBnaXQuIikKKyAgICAgICAgICAgIF9sb2cu
ZXJyb3IoIlRoaXMgc2NyaXB0IHJlcXVpcmVzIGdpdC4iKQorICAgICAgICAgICAgc3lzLmV4aXQo
MSkKKyAgICAgICAgcmFpc2UgZQorCisgICAgZm9yIGxpbmUgaW4gZ2l0LnNwbGl0KCdcbicpOgor
ICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGF0dHJzLCBw
YXRoID0gbGluZS5zdHJpcCgpLnNwbGl0KCdcdCcpCisgICAgICAgIGlmIG5vdCBmbm1hdGNoLmZu
bWF0Y2gocGF0aCwgZ2xvYl9wYXR0ZXJuKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAg
IHBhdGggPSBwYXRoW2xlbignTGF5b3V0VGVzdHMvJyk6XQorICAgICAgICBtYXRjaCA9IHJlLm1h
dGNoKHInXihwbGF0Zm9ybS8uKj8vKT8oLiopJywgcGF0aCkKKyAgICAgICAgdGVzdCA9IG1hdGNo
Lmdyb3VwKDIpCisgICAgICAgIF8sIF8sIGhhc2ggPSBhdHRycy5zcGxpdCgnICcpCisgICAgICAg
IGhhc2hlc1sodGVzdCwgaGFzaCldLmFkZChwYXRoKQorCisgICAgcmV0dXJuIGhhc2hlcworCisK
K2RlZiBmaW5kX2R1cHMoaGFzaGVzLCBwb3J0X2ZhbGxiYWNrcyk6CisgICAgIiIiWWllbGRzIGlu
Zm8gYWJvdXQgcmVkdW5kYW50IHRlc3QgZXhwZWN0YXRpb25zLgorICAgIEFyZ3M6CisgICAgICAg
IGhhc2hlczogYSBsaXN0IG9mIGhhc2hlcyBhcyByZXR1cm5lZCBieSBjbHVzdGVyX2ZpbGVfaGFz
aGVzLgorICAgICAgICBwb3J0X2ZhbGxiYWNrczogYSBsaXN0IG9mIGZhbGxiYWNrIGluZm9ybWF0
aW9uIGFzIHJldHVybmVkIGJ5IGdldF9wb3J0X2ZhbGxiYWNrcy4KKyAgICBSZXR1cm5zOgorICAg
ICAgICBhIHR1cGxlIGNvbnRhaW5pbmcgKHRlc3QsIHBsYXRmb3JtLCBmYWxsYmFjaywgcGxhdGZv
cm1zKQorICAgICIiIgorICAgIGZvciAodGVzdCwgaGFzaCksIGNsdXN0ZXIgaW4gaGFzaGVzLml0
ZW1zKCk6CisgICAgICAgIGlmIGxlbihjbHVzdGVyKSA8IDI6CisgICAgICAgICAgICBjb250aW51
ZSAgIyBDb21tb24gY2FzZTogb25seSBvbmUgZmlsZSB3aXRoIHRoYXQgaGFzaC4KKworICAgICAg
ICAjIENvbXB1dGUgdGhlIGxpc3Qgb2YgcGxhdGZvcm1zIHdlIGhhdmUgdGhpcyBwYXJ0aWN1bGFy
IGhhc2ggZm9yLgorICAgICAgICBwbGF0Zm9ybXMgPSB7fQorICAgICAgICBmb3IgcGF0aCBpbiBj
bHVzdGVyOgorICAgICAgICAgICAgbWF0Y2ggPSByZS5tYXRjaChyJ15wbGF0Zm9ybS8oLio/KS8n
LCBwYXRoKQorICAgICAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICAgICAgcGxhdGZvcm0g
PSBtYXRjaC5ncm91cCgxKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwbGF0
Zm9ybSA9ICdiYXNlJworICAgICAgICAgICAgcGxhdGZvcm1zW3BsYXRmb3JtXSA9IHBhdGgKKyAg
ICAgICAgaWYgbGVuKHBsYXRmb3JtcykgPT0gMToKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAg
ICAgICAgIyBTZWUgaWYgYW55IG9mIHRoZSBwbGF0Zm9ybXMgYXJlIHJlZHVuZGFudCB3aXRoIGVh
Y2ggb3RoZXIuCisgICAgICAgIGZvciBwbGF0Zm9ybSBpbiBwbGF0Zm9ybXMua2V5cygpOgorICAg
ICAgICAgICAgZm9yIGZhbGxiYWNrIGluIHBvcnRfZmFsbGJhY2tzW3BsYXRmb3JtXToKKyAgICAg
ICAgICAgICAgICBpZiBmYWxsYmFjayBpbiBwbGF0Zm9ybXMua2V5cygpOgorICAgICAgICAgICAg
ICAgICAgICB5aWVsZCB0ZXN0LCBwbGF0Zm9ybSwgZmFsbGJhY2ssIHBsYXRmb3Jtc1twbGF0Zm9y
bV0KKworCitkZWYgZGVkdXBsaWNhdGUoZ2xvYl9wYXR0ZXJuKToKKyAgICByZXQgPSBbXQorICAg
IHBvcnRfZmFsbGJhY2tzID0gZ2V0X3BvcnRfZmFsbGJhY2tzKCkKKyAgICBoYXNoZXMgPSBjbHVz
dGVyX2ZpbGVfaGFzaGVzKGdsb2JfcGF0dGVybikKKyAgICBmb3IgdGVzdCwgcGxhdGZvcm0sIGZh
bGxiYWNrLCBwYXRoIGluIGZpbmRfZHVwcyhoYXNoZXMsIHBvcnRfZmFsbGJhY2tzKToKKyAgICAg
ICAgcmV0ICs9IFt7J3Rlc3QnOiB0ZXN0LCAncGF0aCc6IHBhdGgsCisgICAgICAgICAgICAgICAg
ICdwbGF0Zm9ybSc6IHBsYXRmb3JtLCAnZmFsbGJhY2snOiBmYWxsYmFja31dCisgICAgcmV0dXJu
IHJldApkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVz
dHMvZGVkdXBsaWNhdGVfdGVzdHNfdW5pdHRlc3QucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dl
YmtpdHB5L2xheW91dF90ZXN0cy9kZWR1cGxpY2F0ZV90ZXN0c191bml0dGVzdC5weQpuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwLi43MzcwNWY4NWZjMzJiMzZmOWZhMzQzYjI1MTU2M2Y3NzAxOGM2NzY2Ci0tLSAvZGV2L251
bGwKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvZGVkdXBs
aWNhdGVfdGVzdHNfdW5pdHRlc3QucHkKQEAgLTAsMCArMSwxMTQgQEAKKyMhL3Vzci9iaW4vZW52
IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiAg
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFO
RCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisj
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1Ig
SVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwor
IyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorIyBPTiBBTlkgVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiVW5pdCB0ZXN0cyBm
b3IgZGVkdXBsaWNhdGVfdGVzdHMucHkuIiIiCisKK2ltcG9ydCBkZWR1cGxpY2F0ZV90ZXN0cwor
aW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBNb2NrRXhlY3V0aXZlKG9iamVj
dCk6CisgICAgbGFzdF9ydW5fY29tbWFuZCA9IFtdCisgICAgcmVzcG9uc2UgPSAnJworCisgICAg
Y2xhc3MgRXhlY3V0aXZlKG9iamVjdCk6CisgICAgICAgIGRlZiBydW5fY29tbWFuZChzZWxmLAor
ICAgICAgICAgICAgICAgICAgICAgICAgYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgIGN3
ZD1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ9Tm9uZSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGVycm9yX2hhbmRsZXI9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAg
IHJldHVybl9leGl0X2NvZGU9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5f
c3RkZXJyPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfb3V0cHV0PVRydWUp
OgorICAgICAgICAgICAgTW9ja0V4ZWN1dGl2ZS5sYXN0X3J1bl9jb21tYW5kICs9IFthcmdzXQor
ICAgICAgICAgICAgcmV0dXJuIE1vY2tFeGVjdXRpdmUucmVzcG9uc2UKKworCitjbGFzcyBMaXN0
RHVwbGljYXRlc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToK
KyAgICAgICAgTW9ja0V4ZWN1dGl2ZS5sYXN0X3J1bl9jb21tYW5kID0gW10KKyAgICAgICAgTW9j
a0V4ZWN1dGl2ZS5yZXNwb25zZSA9ICcnCisgICAgICAgIGRlZHVwbGljYXRlX3Rlc3RzLmV4ZWN1
dGl2ZSA9IE1vY2tFeGVjdXRpdmUKKworICAgIGRlZiB0ZXN0X3VuaXF1ZShzZWxmKToKKyAgICAg
ICAgTW9ja0V4ZWN1dGl2ZS5yZXNwb25zZSA9ICgKKyAgICAgICAgICAgICcxMDA2NDQgYmxvYiA1
MDUzMjQwYjMzNTNmNmViMzlmN2NiMDAyNTk3ODVmMTZkMTIxZGYyXHRMYXlvdXRUZXN0cy9tYWMv
Zm9vLWV4cGVjdGVkLnR4dFxuJworICAgICAgICAgICAgJzEwMDY0NCBibG9iIGEwMDQ1NDhkMTA3
ZWNjNGUxZWEwODAxOWRhZjBhMTRlODYzNGExZmZcdExheW91dFRlc3RzL3BsYXRmb3JtL2Nocm9t
aXVtL2Zvby1leHBlY3RlZC50eHRcbicKKyAgICAgICAgICAgICcxMDA2NDQgYmxvYiBhYmNkMGJj
NzYyZTNhZWM1ZGYwM2I1YzA0NDg1YjJjYjNiNjVmZmIxXHRMYXlvdXRUZXN0cy9wbGF0Zm9ybS9j
aHJvbWl1bS1saW51eC9mb28tZXhwZWN0ZWQudHh0XG4nCisgICAgICAgICAgICAnMTAwNjQ0IGJs
b2IgZDZiYjBiYzc2MmUzYWVjNWRmMDNiNWMwNDQ4NWIyY2IzYjY1ZmZiMVx0TGF5b3V0VGVzdHMv
cGxhdGZvcm0vY2hyb21pdW0td2luL2Zvby1leHBlY3RlZC50eHRcbicKKyAgICAgICAgICAgICcx
MDA2NDQgYmxvYiA0MzAzZGY1Mzg5Y2E4N2NhZTgzZGQzMjM2YjhkZDg0ZTE2NjA2NTE3XHRMYXlv
dXRUZXN0cy9wbGF0Zm9ybS9tYWMvZm9vLWV4cGVjdGVkLnR4dFxuJykKKyAgICAgICAgcmVzdWx0
ID0gZGVkdXBsaWNhdGVfdGVzdHMuZGVkdXBsaWNhdGUoJyonKQorICAgICAgICBzZWxmLmFzc2Vy
dEVxdWFscygxLCBsZW4oTW9ja0V4ZWN1dGl2ZS5sYXN0X3J1bl9jb21tYW5kKSkKKyAgICAgICAg
c2VsZi5hc3NlcnRFcXVhbHMoKCdnaXQnLCAnbHMtdHJlZScsICctcicsICdIRUFEJywgJ0xheW91
dFRlc3RzJyksIE1vY2tFeGVjdXRpdmUubGFzdF9ydW5fY29tbWFuZFstMV0pCisgICAgICAgIHNl
bGYuYXNzZXJ0RXF1YWxzKDAsIGxlbihyZXN1bHQpKQorCisgICAgZGVmIHRlc3RfZHVwbGljYXRl
cyhzZWxmKToKKyAgICAgICAgTW9ja0V4ZWN1dGl2ZS5yZXNwb25zZSA9ICgKKyAgICAgICAgICAg
ICcxMDA2NDQgYmxvYiA1MDUzMjQwYjMzNTNmNmViMzlmN2NiMDAyNTk3ODVmMTZkMTIxZGYyXHRM
YXlvdXRUZXN0cy9tYWMvZm9vLWV4cGVjdGVkLnR4dFxuJworICAgICAgICAgICAgJzEwMDY0NCBi
bG9iIGEwMDQ1NDhkMTA3ZWNjNGUxZWEwODAxOWRhZjBhMTRlODYzNGExZmZcdExheW91dFRlc3Rz
L3BsYXRmb3JtL2Nocm9taXVtL2Zvby1leHBlY3RlZC50eHRcbicKKyAgICAgICAgICAgICcxMDA2
NDQgYmxvYiBkNmJiMGJjNzYyZTNhZWM1ZGYwM2I1YzA0NDg1YjJjYjNiNjVmZmIxXHRMYXlvdXRU
ZXN0cy9wbGF0Zm9ybS9jaHJvbWl1bS1saW51eC9mb28tZXhwZWN0ZWQudHh0XG4nCisgICAgICAg
ICAgICAnMTAwNjQ0IGJsb2IgYWJjZGViYzc2MmUzYWVjNWRmMDNiNWMwNDQ4NWIyY2IzYjY1ZmZi
MVx0TGF5b3V0VGVzdHMvcGxhdGZvcm0vY2hyb21pdW0tbGludXgvYW5pbWFnZS5wbmdcbicKKyAg
ICAgICAgICAgICcxMDA2NDQgYmxvYiBkNmJiMGJjNzYyZTNhZWM1ZGYwM2I1YzA0NDg1YjJjYjNi
NjVmZmIxXHRMYXlvdXRUZXN0cy9wbGF0Zm9ybS9jaHJvbWl1bS13aW4vZm9vLWV4cGVjdGVkLnR4
dFxuJworICAgICAgICAgICAgJzEwMDY0NCBibG9iIGFiY2RlYmM3NjJlM2FlYzVkZjAzYjVjMDQ0
ODViMmNiM2I2NWZmYjFcdExheW91dFRlc3RzL3BsYXRmb3JtL2Nocm9taXVtLXdpbi9hbmltYWdl
LnBuZ1xuJworICAgICAgICAgICAgJzEwMDY0NCBibG9iIDQzMDNkZjUzODljYTg3Y2FlODNkZDMy
MzZiOGRkODRlMTY2MDY1MTdcdExheW91dFRlc3RzL3BsYXRmb3JtL21hYy9mb28tZXhwZWN0ZWQu
dHh0XG4nKQorCisgICAgICAgIHJlc3VsdCA9IGRlZHVwbGljYXRlX3Rlc3RzLmRlZHVwbGljYXRl
KCcqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgbGVuKE1vY2tFeGVjdXRpdmUubGFz
dF9ydW5fY29tbWFuZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCgnZ2l0JywgJ2xzLXRy
ZWUnLCAnLXInLCAnSEVBRCcsICdMYXlvdXRUZXN0cycpLCBNb2NrRXhlY3V0aXZlLmxhc3RfcnVu
X2NvbW1hbmRbLTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygyLCBsZW4ocmVzdWx0KSkK
KyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeyd0ZXN0JzogJ2FuaW1hZ2UucG5nJywKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICdwYXRoJzogJ3BsYXRmb3JtL2Nocm9taXVtLWxpbnV4L2Fu
aW1hZ2UucG5nJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdmYWxsYmFjayc6ICdjaHJv
bWl1bS13aW4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtJzogJ2Nocm9t
aXVtLWxpbnV4J30sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFswXSkKKyAgICAg
ICAgc2VsZi5hc3NlcnRFcXVhbHMoeyd0ZXN0JzogJ2Zvby1leHBlY3RlZC50eHQnLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgJ3BhdGgnOiAncGxhdGZvcm0vY2hyb21pdW0tbGludXgvZm9v
LWV4cGVjdGVkLnR4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmFsbGJhY2snOiAn
Y2hyb21pdW0td2luJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybSc6ICdj
aHJvbWl1bS1saW51eCd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbMV0pCisK
KyAgICAgICAgcmVzdWx0ID0gZGVkdXBsaWNhdGVfdGVzdHMuZGVkdXBsaWNhdGUoJyoudHh0JykK
KyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMiwgbGVuKE1vY2tFeGVjdXRpdmUubGFzdF9ydW5f
Y29tbWFuZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCgnZ2l0JywgJ2xzLXRyZWUnLCAn
LXInLCAnSEVBRCcsICdMYXlvdXRUZXN0cycpLCBNb2NrRXhlY3V0aXZlLmxhc3RfcnVuX2NvbW1h
bmRbLTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4ocmVzdWx0KSkKKyAgICAg
ICAgc2VsZi5hc3NlcnRFcXVhbHMoeyd0ZXN0JzogJ2Zvby1leHBlY3RlZC50eHQnLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgJ3BhdGgnOiAncGxhdGZvcm0vY2hyb21pdW0tbGludXgvZm9v
LWV4cGVjdGVkLnR4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmFsbGJhY2snOiAn
Y2hyb21pdW0td2luJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybSc6ICdj
aHJvbWl1bS1saW51eCd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbMF0pCisK
KyAgICAgICAgcmVzdWx0ID0gZGVkdXBsaWNhdGVfdGVzdHMuZGVkdXBsaWNhdGUoJyoucG5nJykK
KyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMywgbGVuKE1vY2tFeGVjdXRpdmUubGFzdF9ydW5f
Y29tbWFuZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCgnZ2l0JywgJ2xzLXRyZWUnLCAn
LXInLCAnSEVBRCcsICdMYXlvdXRUZXN0cycpLCBNb2NrRXhlY3V0aXZlLmxhc3RfcnVuX2NvbW1h
bmRbLTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4ocmVzdWx0KSkKKyAgICAg
ICAgc2VsZi5hc3NlcnRFcXVhbHMoeyd0ZXN0JzogJ2FuaW1hZ2UucG5nJywKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICdwYXRoJzogJ3BsYXRmb3JtL2Nocm9taXVtLWxpbnV4L2FuaW1hZ2Uu
cG5nJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdmYWxsYmFjayc6ICdjaHJvbWl1bS13
aW4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtJzogJ2Nocm9taXVtLWxp
bnV4J30sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFswXSkKKworCitpZiBfX25h
bWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>64040</attachid>
            <date>2010-08-10 12:43:55 -0700</date>
            <delta_ts>2010-08-11 11:31:27 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-37630-20100810204353.patch</filename>
            <type>text/plain</type>
            <size>20338</size>
            <attacher name="Marcus Bulach">bulach</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCBlOTExMTY5OGZhNmI3OWQ1NGFmYTM3ZGQ3ZmQxMjlmMWRlOGNlMTE2Li43NDJhZmZl
YTQ0NjljNTY1Yjk4ZDU4YzBlMzAzOTFhMjRmMjIwMjNkIDEwMDY0NAotLS0gYS9XZWJLaXRUb29s
cy9DaGFuZ2VMb2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjAgQEAK
KzIwMTAtMDgtMTAgIE1hcmN1cyBCdWxhY2ggIDxidWxhY2hAY2hyb21pdW0ub3JnPgorCisgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIENoZWNrIGluIGEgc2Ny
aXB0IHRvIGxpc3QgcmVkdW5kYW50IHRlc3Qgb3V0cHV0cy4KKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTM3NjMwCisKKyAgICAgICAgSWYgZS5nLiBwbGF0
Zm9ybS9tYWMtbGVvcGFyZCBpcyBtaXNzaW5nIGFuIGV4cGVjdGVkIHRlc3Qgb3V0cHV0LCB3ZQor
ICAgICAgICBmYWxsIGJhY2sgb24gcGxhdGZvcm0vbWFjLiAgVGhpcyBtZWFucyBpdCdzIHBvc3Np
YmxlIHRvIGdyb3cgcmVkdW5kYW50CisgICAgICAgIHRlc3Qgb3V0cHV0cywgd2hlcmUgd2UgaGF2
ZSB0aGUgc2FtZSBleHBlY3RlZCBkYXRhIGluIGJvdGggYSBwbGF0Zm9ybQorICAgICAgICBkaXJl
Y3RvcnkgYW5kIGFub3RoZXIgcGxhdGZvcm0gaXQgZmFsbHMgYmFjayBvbi4KKyAgICAgICAgKG9y
aWdpbmFsIHBhdGNoIGJ5IEV2YW4gTWFydGluZyA8ZXZhbkBjaHJvbWl1bS5vcmc+IGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL2F0dGFjaG1lbnQuY2dpP2lkPTUzMzk4KQorCisgICAgICAgICogU2Ny
aXB0cy9kZWR1cGxpY2F0ZS10ZXN0czogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRw
eS9sYXlvdXRfdGVzdHMvZGVkdXBsaWNhdGVfdGVzdHMucHk6IEFkZGVkLgorICAgICAgICAqIFNj
cmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL2RlZHVwbGljYXRlX3Rlc3RzX3VuaXR0ZXN0LnB5
OiBBZGRlZC4KKwogMjAxMC0wOC0wOSAgQW50b25pbyBHb21lcyAgPHRvbmlraXRvb0B3ZWJraXQu
b3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFyaXlhIEhpZGF5YXQuCmRpZmYgLS1naXQgYS9X
ZWJLaXRUb29scy9TY3JpcHRzL2RlZHVwbGljYXRlLXRlc3RzIGIvV2ViS2l0VG9vbHMvU2NyaXB0
cy9kZWR1cGxpY2F0ZS10ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4xMWJhN2MyMWQ2Nzg4NDVkNjQwZTRmOTE1
ODVhYmM2N2FlYjQ0MDAzCi0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy9k
ZWR1cGxpY2F0ZS10ZXN0cwpAQCAtMCwwICsxLDgyIEBACisjIS91c3IvYmluL2VudiBweXRob24K
KyMgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisj
CisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisj
ICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisjIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENP
TlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOworIyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GCisjIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiImRlZHVwbGljYXRlLXRlc3RzIC0t
IHByaW50IHRlc3QgcmVzdWx0cyBkdXBsaWNhdGVkIGJldHdlZW4gcGxhdGZvcm1zLgorCitJZiBw
bGF0Zm9ybS9tYWMtbGVvcGFyZCBpcyBtaXNzaW5nIGFuIGV4cGVjdGVkIHRlc3Qgb3V0cHV0LCB3
ZSBmYWxsIGJhY2sgb24KK3BsYXRmb3JtL21hYy4gIFRoaXMgbWVhbnMgaXQncyBwb3NzaWJsZSB0
byBncm93IHJlZHVuZGFudCB0ZXN0IG91dHB1dHMsCit3aGVyZSB3ZSBoYXZlIHRoZSBzYW1lIGV4
cGVjdGVkIGRhdGEgaW4gYm90aCBhIHBsYXRmb3JtIGRpcmVjdG9yeSBhbmQgYW5vdGhlcgorcGxh
dGZvcm0gaXQgZmFsbHMgYmFjayBvbi4KKworVGhpcyBjb21tYW5kIGR1bXBzIG91dCBhbGwgc3Vj
aCBmaWxlcy4gIFlvdSBjYW4gdXNlIGl0IGxpa2UgdGhpczoKKyAgZGVkdXBsaWNhdGUtdGVzdHMg
LS12ZXJib3NlICAjIHByaW50IG91dCB0aGUgZHVwbGljYXRlZCBmaWxlcworICBkZWR1cGxpY2F0
ZS10ZXN0cyB8IHhhcmdzIGdpdCBybSAgICMgZGVsZXRlIHRoZW0KKyIiIgorCisKK2ltcG9ydCBv
cHRwYXJzZQoraW1wb3J0IHdlYmtpdHB5LmxheW91dF90ZXN0cy5kZWR1cGxpY2F0ZV90ZXN0cyBh
cyBkZWR1cGxpY2F0ZV90ZXN0cworCisKK2RlZiBwYXJzZV9hcmdzKCk6CisgICAgIiIiUHJvdmlk
ZXMgYSBkZWZhdWx0IHNldCBvZiBjb21tYW5kIGxpbmUgYXJncy4KKworICAgIFJldHVybnMgYSB0
dXBsZSBvZiBvcHRpb25zLCBhcmdzIGZyb20gb3B0cGFyc2UiIiIKKworICAgIGNvbmZpZ3VyYXRp
b25fb3B0aW9ucyA9IFsKKyAgICAgICAgb3B0cGFyc2UubWFrZV9vcHRpb24oIi12IiwgIi0tdmVy
Ym9zZSIsIGRlc3Q9InZlcmJvc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rp
b249InN0b3JlX3RydWUiLCBkZWZhdWx0PUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBoZWxwPSJWZXJib3NlIG91dHB1dC4iKSwKKyAgICAgICAgb3B0cGFyc2UubWFrZV9vcHRp
b24oIi1nIiwgIi0tZ2xvYiIsIGRlc3Q9Imdsb2JfcGF0dGVybiIsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGRlZmF1bHQ9IiotZXhwZWN0ZWQqIiwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaGVscD0iU3BlY2lmeSB0aGUgZ2xvYiB0byBmaWx0ZXIgdGhlIGZpbGVzLCBkZWZh
dWx0cyB0byAqLWV4cGVjdGVkKi4iKSwKKyAgICBdCisKKyAgICBvcHRpb25fbGlzdCA9IChjb25m
aWd1cmF0aW9uX29wdGlvbnMpCisgICAgb3B0aW9uX3BhcnNlciA9IG9wdHBhcnNlLk9wdGlvblBh
cnNlcihvcHRpb25fbGlzdD1vcHRpb25fbGlzdCkKKworICAgIG9wdGlvbnMsIF8gPSBvcHRpb25f
cGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgICAgcmV0dXJuIG9wdGlvbnMKKworCitkZWYgcnVuKG9w
dGlvbnMpOgorICAgIGlmIG9wdGlvbnMudmVyYm9zZToKKyAgICAgICAgZm9ybWF0ID0gKCIqICUo
dGVzdClzXG4iCisgICAgICAgICAgICAgICAgICAiXHRyZWR1bmRhbnRseSBvbiAlKHBsYXRmb3Jt
KXMgYW5kICUoZmFsbGJhY2spc1xuIgorICAgICAgICAgICAgICAgICAgIlx0Y29uc2lkZXIgZGVs
ZXRpbmcgJShwYXRoKXMiKQorICAgIGVsc2U6CisgICAgICAgIGZvcm1hdCA9ICIlKHBhdGgpcyIK
KworICAgIGZvciBkdXBlIGluIGRlZHVwbGljYXRlX3Rlc3RzLmRlZHVwbGljYXRlKG9wdGlvbnMu
Z2xvYl9wYXR0ZXJuKToKKyAgICAgICAgcHJpbnQoZm9ybWF0ICUgZHVwZSkKKworCitkZWYgbWFp
bigpOgorICAgIG9wdGlvbnMgPSBwYXJzZV9hcmdzKCkKKyAgICBydW4ob3B0aW9ucykKKworCitp
ZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvV2ViS2l0
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvZGVkdXBsaWNhdGVfdGVzdHMucHkg
Yi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9kZWR1cGxpY2F0ZV90
ZXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi43YTljZGFlMDQ3ZTNmYTlmYTU4NmFlMzNhZmIzZTg1YWI2NDMy
ZGRhCi0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlv
dXRfdGVzdHMvZGVkdXBsaWNhdGVfdGVzdHMucHkKQEAgLTAsMCArMSwxNjggQEAKKyMhL3Vzci9i
aW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIwor
IyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBM
SUVECisjIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUworIyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorIyBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiZGVkdXBs
aWNhdGVfdGVzdHMgLS0gbGlzdHMgZHVwbGljYXRlZCBiZXR3ZWVuIHBsYXRmb3Jtcy4KKworSWYg
cGxhdGZvcm0vbWFjLWxlb3BhcmQgaXMgbWlzc2luZyBhbiBleHBlY3RlZCB0ZXN0IG91dHB1dCwg
d2UgZmFsbCBiYWNrIG9uCitwbGF0Zm9ybS9tYWMuICBUaGlzIG1lYW5zIGl0J3MgcG9zc2libGUg
dG8gZ3JvdyByZWR1bmRhbnQgdGVzdCBvdXRwdXRzLAord2hlcmUgd2UgaGF2ZSB0aGUgc2FtZSBl
eHBlY3RlZCBkYXRhIGluIGJvdGggYSBwbGF0Zm9ybSBkaXJlY3RvcnkgYW5kIGFub3RoZXIKK3Bs
YXRmb3JtIGl0IGZhbGxzIGJhY2sgb24uCisiIiIKKworaW1wb3J0IGNvbGxlY3Rpb25zCitpbXBv
cnQgZm5tYXRjaAoraW1wb3J0IG9zCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1w
b3J0IHJlCitpbXBvcnQgd2Via2l0cHkuY29tbW9uLnN5c3RlbS5leGVjdXRpdmUgYXMgZXhlY3V0
aXZlCitpbXBvcnQgd2Via2l0cHkuY29tbW9uLnN5c3RlbS5sb2d1dGlscyBhcyBsb2d1dGlscwor
aW1wb3J0IHdlYmtpdHB5LmxheW91dF90ZXN0cy5wb3J0LmZhY3RvcnkgYXMgcG9ydF9mYWN0b3J5
CisKK19sb2cgPSBsb2d1dGlscy5nZXRfbG9nZ2VyKF9fZmlsZV9fKQorbG9ndXRpbHMuY29uZmln
dXJlX2xvZ2dpbmcoKQorCitfQkFTRV9QTEFURk9STSA9ICdiYXNlJworCisKK2RlZiBwb3J0X2Zh
bGxiYWNrcygpOgorICAgICIiIkdldCB0aGUgcG9ydCBmYWxsYmFjayBpbmZvcm1hdGlvbi4KKyAg
ICBSZXR1cm5zOgorICAgICAgICBBIGRpY3Rpb25hcnkgbWFwcGluZyBwbGF0Zm9ybSBuYW1lIHRv
IGEgbGlzdCBvZiBvdGhlciBwbGF0Zm9ybXMgdG8gZmFsbAorICAgICAgICBiYWNrIG9uLiAgQWxs
IHBsYXRmb3JtcyBmYWxsIGJhY2sgb24gJ2Jhc2UnLgorICAgICIiIgorICAgIGZhbGxiYWNrcyA9
IHtfQkFTRV9QTEFURk9STTogW119CisgICAgZm9yIHBvcnRfbmFtZSBpbiBvcy5saXN0ZGlyKG9z
LnBhdGguam9pbignTGF5b3V0VGVzdHMnLCAncGxhdGZvcm0nKSk6CisgICAgICAgIHRyeToKKyAg
ICAgICAgICAgIHBsYXRmb3JtcyA9IHBvcnRfZmFjdG9yeS5nZXQocG9ydF9uYW1lKS5iYXNlbGlu
ZV9zZWFyY2hfcGF0aCgpCisgICAgICAgIGV4Y2VwdCBOb3RJbXBsZW1lbnRlZEVycm9yOgorICAg
ICAgICAgICAgX2xvZy5lcnJvcigiJyVzJyBsYWNrcyBiYXNlbGluZV9zZWFyY2hfcGF0aCgpLCBw
bGVhc2UgZml4LiIgJSBwb3J0X25hbWUpCisgICAgICAgICAgICBmYWxsYmFja3NbcG9ydF9uYW1l
XSA9IFtfQkFTRV9QTEFURk9STV0KKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGZhbGxi
YWNrc1twb3J0X25hbWVdID0gW29zLnBhdGguYmFzZW5hbWUocCkgZm9yIHAgaW4gcGxhdGZvcm1z
XVsxOl0KKyAgICAgICAgZmFsbGJhY2tzW3BvcnRfbmFtZV0uYXBwZW5kKF9CQVNFX1BMQVRGT1JN
KQorICAgIHJldHVybiBmYWxsYmFja3MKKworCitkZWYgcGFyc2VfZ2l0X291dHB1dChnaXRfb3V0
cHV0LCBnbG9iX3BhdHRlcm4pOgorICAgICIiIlBhcnNlcyB0aGUgb3V0cHV0IG9mIGdpdCBscy10
cmVlIGFuZCBmaWx0ZXJzIGJhc2VkIG9uIGdsb2JfcGF0dGVybi4KKyAgICBBcmdzOgorICAgICAg
ICBnaXRfb3V0cHV0OiByZXN1bHQgb2YgZ2l0IGxzLXRyZWUgLXIgSEVBRCBMYXlvdXRUZXN0cy4K
KyAgICAgICAgZ2xvYl9wYXR0ZXJuOiBhIHBhdHRlcm4gdG8gZmlsdGVyIHRoZSBmaWxlcy4KKyAg
ICBSZXR1cm5zOgorICAgICAgICBBIGRpY3Rpb25hcnkgbWFwcGluZyAodGVzdCBuYW1lLCBoYXNo
IG9mIGNvbnRlbnQpID0+IFtwYXRoc10KKyAgICAiIiIKKyAgICBoYXNoZXMgPSBjb2xsZWN0aW9u
cy5kZWZhdWx0ZGljdChzZXQpCisgICAgZm9yIGxpbmUgaW4gZ2l0X291dHB1dC5zcGxpdCgnXG4n
KToKKyAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICBicmVhaworICAgICAgICBhdHRy
cywgcGF0aCA9IGxpbmUuc3RyaXAoKS5zcGxpdCgnXHQnKQorICAgICAgICBpZiBub3QgZm5tYXRj
aC5mbm1hdGNoKHBhdGgsIGdsb2JfcGF0dGVybik6CisgICAgICAgICAgICBjb250aW51ZQorICAg
ICAgICBwYXRoID0gcGF0aFtsZW4oJ0xheW91dFRlc3RzLycpOl0KKyAgICAgICAgbWF0Y2ggPSBy
ZS5tYXRjaChyJ14ocGxhdGZvcm0vLio/Lyk/KC4qKScsIHBhdGgpCisgICAgICAgIHRlc3QgPSBt
YXRjaC5ncm91cCgyKQorICAgICAgICBfLCBfLCBoYXNoID0gYXR0cnMuc3BsaXQoJyAnKQorICAg
ICAgICBoYXNoZXNbKHRlc3QsIGhhc2gpXS5hZGQocGF0aCkKKyAgICByZXR1cm4gaGFzaGVzCisK
KworZGVmIGNsdXN0ZXJfZmlsZV9oYXNoZXMoZ2xvYl9wYXR0ZXJuKToKKyAgICAiIiJHZXQgdGhl
IGhhc2hlcyBvZiBhbGwgdGhlIHRlc3QgZXhwZWN0YXRpb25zIGluIHRoZSB0cmVlLgorICAgIFdl
IGNoZWF0IGFuZCB1c2UgZ2l0J3MgaGFzaGVzLgorICAgIEFyZ3M6CisgICAgICAgIGdsb2JfcGF0
dGVybjogYSBwYXR0ZXJuIHRvIGZpbHRlciB0aGUgZmlsZXMuCisgICAgUmV0dXJuczoKKyAgICAg
ICAgQSBkaWN0aW9uYXJ5IG1hcHBpbmcgKHRlc3QgbmFtZSwgaGFzaCBvZiBjb250ZW50KSA9PiBb
cGF0aHNdCisgICAgIiIiCisKKyAgICAjIEEgbWFwIG9mIGZpbGUgaGFzaCA9PiBzZXQgb2YgYWxs
IGZpbGVzIHdpdGggdGhhdCBoYXNoLgorICAgIGhhc2hlcyA9IGNvbGxlY3Rpb25zLmRlZmF1bHRk
aWN0KHNldCkKKworICAgICMgRmlsbCBpbiB0aGUgbWFwLgorICAgIGNtZCA9ICgnZ2l0JywgJ2xz
LXRyZWUnLCAnLXInLCAnSEVBRCcsICdMYXlvdXRUZXN0cycpCisgICAgdHJ5OgorICAgICAgICBn
aXRfb3V0cHV0ID0gZXhlY3V0aXZlLkV4ZWN1dGl2ZSgpLnJ1bl9jb21tYW5kKGNtZCkKKyAgICBl
eGNlcHQgT1NFcnJvciwgZToKKyAgICAgICAgaWYgZS5lcnJubyA9PSAyOiAgIyBObyBzdWNoIGZp
bGUgb3IgZGlyZWN0b3J5LgorICAgICAgICAgICAgX2xvZy5lcnJvcigiRXJyb3I6ICdObyBzdWNo
IGZpbGUnIHdoZW4gcnVubmluZyBnaXQuIikKKyAgICAgICAgICAgIF9sb2cuZXJyb3IoIlRoaXMg
c2NyaXB0IHJlcXVpcmVzIGdpdC4iKQorICAgICAgICAgICAgc3lzLmV4aXQoMSkKKyAgICAgICAg
cmFpc2UgZQorICAgIHJldHVybiBwYXJzZV9naXRfb3V0cHV0KGdpdF9vdXRwdXQsIGdsb2JfcGF0
dGVybikKKworCitkZWYgZXh0cmFjdF9wbGF0Zm9ybXMocGF0aHMpOgorICAgICIiIkV4dHJhY3Rz
IHRoZSBwbGF0Zm9ybXMgZnJvbSBhIGxpc3Qgb2YgcGF0aHMgbWF0Y2hpbmcgXnBsYXRmb3JtLygu
Kj8pLy4KKyAgICBBcmdzOgorICAgICAgICBwYXRoczogYSBsaXN0IG9mIHBhdGhzLgorICAgIFJl
dHVybnM6CisgICAgICAgIEEgZGljdGlvbmFyeSBjb250YWluaW5nIGFsbCBwbGF0Zm9ybXMgZnJv
bSBwYXRocy4KKyAgICAiIiIKKyAgICBwbGF0Zm9ybXMgPSB7fQorICAgIGZvciBwYXRoIGluIHBh
dGhzOgorICAgICAgICBtYXRjaCA9IHJlLm1hdGNoKHInXnBsYXRmb3JtLyguKj8pLycsIHBhdGgp
CisgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgcGxhdGZvcm0gPSBtYXRjaC5ncm91cCgx
KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGxhdGZvcm0gPSBfQkFTRV9QTEFURk9STQor
ICAgICAgICBwbGF0Zm9ybXNbcGxhdGZvcm1dID0gcGF0aAorICAgIHJldHVybiBwbGF0Zm9ybXMK
KworCitkZWYgZmluZF9kdXBzKGhhc2hlcywgcG9ydF9mYWxsYmFja3MpOgorICAgICIiIllpZWxk
cyBpbmZvIGFib3V0IHJlZHVuZGFudCB0ZXN0IGV4cGVjdGF0aW9ucy4KKyAgICBBcmdzOgorICAg
ICAgICBoYXNoZXM6IGEgbGlzdCBvZiBoYXNoZXMgYXMgcmV0dXJuZWQgYnkgY2x1c3Rlcl9maWxl
X2hhc2hlcy4KKyAgICAgICAgcG9ydF9mYWxsYmFja3M6IGEgbGlzdCBvZiBmYWxsYmFjayBpbmZv
cm1hdGlvbiBhcyByZXR1cm5lZCBieSBnZXRfcG9ydF9mYWxsYmFja3MuCisgICAgUmV0dXJuczoK
KyAgICAgICAgYSB0dXBsZSBjb250YWluaW5nICh0ZXN0LCBwbGF0Zm9ybSwgZmFsbGJhY2ssIHBs
YXRmb3JtcykKKyAgICAiIiIKKyAgICBmb3IgKHRlc3QsIGhhc2gpLCBjbHVzdGVyIGluIGhhc2hl
cy5pdGVtcygpOgorICAgICAgICBpZiBsZW4oY2x1c3RlcikgPCAyOgorICAgICAgICAgICAgY29u
dGludWUgICMgQ29tbW9uIGNhc2U6IG9ubHkgb25lIGZpbGUgd2l0aCB0aGF0IGhhc2guCisKKyAg
ICAgICAgIyBDb21wdXRlIHRoZSBsaXN0IG9mIHBsYXRmb3JtcyB3ZSBoYXZlIHRoaXMgcGFydGlj
dWxhciBoYXNoIGZvci4KKyAgICAgICAgcGxhdGZvcm1zID0gZXh0cmFjdF9wbGF0Zm9ybXMoY2x1
c3RlcikKKyAgICAgICAgaWYgbGVuKHBsYXRmb3JtcykgPT0gMToKKyAgICAgICAgICAgIGNvbnRp
bnVlCisKKyAgICAgICAgIyBTZWUgaWYgYW55IG9mIHRoZSBwbGF0Zm9ybXMgYXJlIHJlZHVuZGFu
dCB3aXRoIGVhY2ggb3RoZXIuCisgICAgICAgIGZvciBwbGF0Zm9ybSBpbiBwbGF0Zm9ybXMua2V5
cygpOgorICAgICAgICAgICAgZm9yIGZhbGxiYWNrIGluIHBvcnRfZmFsbGJhY2tzW3BsYXRmb3Jt
XToKKyAgICAgICAgICAgICAgICBpZiBmYWxsYmFjayBpbiBwbGF0Zm9ybXMua2V5cygpOgorICAg
ICAgICAgICAgICAgICAgICB5aWVsZCB0ZXN0LCBwbGF0Zm9ybSwgZmFsbGJhY2ssIHBsYXRmb3Jt
c1twbGF0Zm9ybV0KKworCitkZWYgZGVkdXBsaWNhdGUoZ2xvYl9wYXR0ZXJuKToKKyAgICAiIiJU
cmF2ZXJzZXMgTGF5b3V0VGVzdHMgYW5kIHJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgZHVwbGlj
YXRlZCBmaWxlcy4KKyAgICBBcmdzOgorICAgICAgICBnbG9iIHBhdHRlcm4gdG8gZmlsdGVyIHRo
ZSBmaWxlcyBpbiBMYXlvdXRUZXN0cy4KKyAgICBSZXR1cm5zOgorICAgICAgICBhIGRpY3Rpb25h
cnkgY29udGFpbmluZyB0ZXN0LCBwYXRoLCBwbGF0Zm9ybSBhbmQgZmFsbGJhY2suCisgICAgIiIi
CisgICAgZmFsbGJhY2tzID0gcG9ydF9mYWxsYmFja3MoKQorICAgIGhhc2hlcyA9IGNsdXN0ZXJf
ZmlsZV9oYXNoZXMoZ2xvYl9wYXR0ZXJuKQorICAgIHJldHVybiBbeyd0ZXN0JzogdGVzdCwgJ3Bh
dGgnOiBwYXRoLCAncGxhdGZvcm0nOiBwbGF0Zm9ybSwgJ2ZhbGxiYWNrJzogZmFsbGJhY2t9Cisg
ICAgICAgICAgICAgZm9yIHRlc3QsIHBsYXRmb3JtLCBmYWxsYmFjaywgcGF0aCBpbiBmaW5kX2R1
cHMoaGFzaGVzLCBmYWxsYmFja3MpXQpkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93
ZWJraXRweS9sYXlvdXRfdGVzdHMvZGVkdXBsaWNhdGVfdGVzdHNfdW5pdHRlc3QucHkgYi9XZWJL
aXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9kZWR1cGxpY2F0ZV90ZXN0c191
bml0dGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwLi44NzgzMzFhNzdmNDQ4OGRlOGFmMmQ1YThiZmEzZTlkNDFi
OWRhODRmCi0tLSAvZGV2L251bGwKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9s
YXlvdXRfdGVzdHMvZGVkdXBsaWNhdGVfdGVzdHNfdW5pdHRlc3QucHkKQEAgLTAsMCArMSwxMzkg
QEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBh
cmUgbWV0OgorIworIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorIyBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORAorIyBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KworIiIiVW5pdCB0ZXN0cyBmb3IgZGVkdXBsaWNhdGVfdGVzdHMucHkuIiIiCisKK2ltcG9ydCBk
ZWR1cGxpY2F0ZV90ZXN0cworaW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBN
b2NrRXhlY3V0aXZlKG9iamVjdCk6CisgICAgbGFzdF9ydW5fY29tbWFuZCA9IFtdCisgICAgcmVz
cG9uc2UgPSAnJworCisgICAgY2xhc3MgRXhlY3V0aXZlKG9iamVjdCk6CisgICAgICAgIGRlZiBy
dW5fY29tbWFuZChzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgYXJncywKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGN3ZD1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ9
Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2hhbmRsZXI9Tm9uZSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHJldHVybl9leGl0X2NvZGU9RmFsc2UsCisgICAgICAgICAgICAg
ICAgICAgICAgICByZXR1cm5fc3RkZXJyPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBk
ZWNvZGVfb3V0cHV0PVRydWUpOgorICAgICAgICAgICAgTW9ja0V4ZWN1dGl2ZS5sYXN0X3J1bl9j
b21tYW5kICs9IFthcmdzXQorICAgICAgICAgICAgcmV0dXJuIE1vY2tFeGVjdXRpdmUucmVzcG9u
c2UKKworCitjbGFzcyBMaXN0RHVwbGljYXRlc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAg
IGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgTW9ja0V4ZWN1dGl2ZS5sYXN0X3J1bl9jb21tYW5k
ID0gW10KKyAgICAgICAgTW9ja0V4ZWN1dGl2ZS5yZXNwb25zZSA9ICcnCisgICAgICAgIGRlZHVw
bGljYXRlX3Rlc3RzLmV4ZWN1dGl2ZSA9IE1vY2tFeGVjdXRpdmUKKworICAgIGRlZiB0ZXN0X3Bh
cnNlX2dpdF9vdXRwdXQoc2VsZik6CisgICAgICAgIGdpdF9vdXRwdXQgPSAoCisgICAgICAgICAg
ICAnMTAwNjQ0IGJsb2IgNTA1MzI0MGIzMzUzZjZlYjM5ZjdjYjAwMjU5Nzg1ZjE2ZDEyMWRmMlx0
TGF5b3V0VGVzdHMvbWFjL2Zvby1leHBlY3RlZC50eHRcbicKKyAgICAgICAgICAgICcxMDA2NDQg
YmxvYiBhMDA0NTQ4ZDEwN2VjYzRlMWVhMDgwMTlkYWYwYTE0ZTg2MzRhMWZmXHRMYXlvdXRUZXN0
cy9wbGF0Zm9ybS9jaHJvbWl1bS9mb28tZXhwZWN0ZWQudHh0XG4nCisgICAgICAgICAgICAnMTAw
NjQ0IGJsb2IgZDZiYjBiYzc2MmUzYWVjNWRmMDNiNWMwNDQ4NWIyY2IzYjY1ZmZiMVx0TGF5b3V0
VGVzdHMvcGxhdGZvcm0vY2hyb21pdW0tbGludXgvZm9vLWV4cGVjdGVkLnR4dFxuJworICAgICAg
ICAgICAgJzEwMDY0NCBibG9iIGFiY2RlYmM3NjJlM2FlYzVkZjAzYjVjMDQ0ODViMmNiM2I2NWZm
YjFcdExheW91dFRlc3RzL3BsYXRmb3JtL2Nocm9taXVtLWxpbnV4L2FuaW1hZ2UucG5nXG4nCisg
ICAgICAgICAgICAnMTAwNjQ0IGJsb2IgZDZiYjBiYzc2MmUzYWVjNWRmMDNiNWMwNDQ4NWIyY2Iz
YjY1ZmZiMVx0TGF5b3V0VGVzdHMvcGxhdGZvcm0vY2hyb21pdW0td2luL2Zvby1leHBlY3RlZC50
eHRcbicKKyAgICAgICAgICAgICcxMDA2NDQgYmxvYiBhYmNkZWJjNzYyZTNhZWM1ZGYwM2I1YzA0
NDg1YjJjYjNiNjVmZmIxXHRMYXlvdXRUZXN0cy9wbGF0Zm9ybS9jaHJvbWl1bS13aW4vYW5pbWFn
ZS5wbmdcbicKKyAgICAgICAgICAgICcxMDA2NDQgYmxvYiA0MzAzZGY1Mzg5Y2E4N2NhZTgzZGQz
MjM2YjhkZDg0ZTE2NjA2NTE3XHRMYXlvdXRUZXN0cy9wbGF0Zm9ybS9tYWMvZm9vLWV4cGVjdGVk
LnR4dFxuJykKKyAgICAgICAgaGFzaGVzID0gZGVkdXBsaWNhdGVfdGVzdHMucGFyc2VfZ2l0X291
dHB1dChnaXRfb3V0cHV0LCAnKicpCisgICAgICAgIGV4cGVjdGVkID0geygnbWFjL2Zvby1leHBl
Y3RlZC50eHQnLCAnNTA1MzI0MGIzMzUzZjZlYjM5ZjdjYjAwMjU5Nzg1ZjE2ZDEyMWRmMicpOiBz
ZXQoWydtYWMvZm9vLWV4cGVjdGVkLnR4dCddKSwKKyAgICAgICAgICAgICAgICAgICAgKCdhbmlt
YWdlLnBuZycsICdhYmNkZWJjNzYyZTNhZWM1ZGYwM2I1YzA0NDg1YjJjYjNiNjVmZmIxJyk6IHNl
dChbJ3BsYXRmb3JtL2Nocm9taXVtLWxpbnV4L2FuaW1hZ2UucG5nJywgJ3BsYXRmb3JtL2Nocm9t
aXVtLXdpbi9hbmltYWdlLnBuZyddKSwKKyAgICAgICAgICAgICAgICAgICAgKCdmb28tZXhwZWN0
ZWQudHh0JywgJzQzMDNkZjUzODljYTg3Y2FlODNkZDMyMzZiOGRkODRlMTY2MDY1MTcnKTogc2V0
KFsncGxhdGZvcm0vbWFjL2Zvby1leHBlY3RlZC50eHQnXSksCisgICAgICAgICAgICAgICAgICAg
ICgnZm9vLWV4cGVjdGVkLnR4dCcsICdkNmJiMGJjNzYyZTNhZWM1ZGYwM2I1YzA0NDg1YjJjYjNi
NjVmZmIxJyk6IHNldChbJ3BsYXRmb3JtL2Nocm9taXVtLWxpbnV4L2Zvby1leHBlY3RlZC50eHQn
LCAncGxhdGZvcm0vY2hyb21pdW0td2luL2Zvby1leHBlY3RlZC50eHQnXSksCisgICAgICAgICAg
ICAgICAgICAgICgnZm9vLWV4cGVjdGVkLnR4dCcsICdhMDA0NTQ4ZDEwN2VjYzRlMWVhMDgwMTlk
YWYwYTE0ZTg2MzRhMWZmJyk6IHNldChbJ3BsYXRmb3JtL2Nocm9taXVtL2Zvby1leHBlY3RlZC50
eHQnXSl9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBoYXNoZXMpCisKKyAg
ICAgICAgaGFzaGVzID0gZGVkdXBsaWNhdGVfdGVzdHMucGFyc2VfZ2l0X291dHB1dChnaXRfb3V0
cHV0LCAnKi5wbmcnKQorICAgICAgICBleHBlY3RlZCA9IHsoJ2FuaW1hZ2UucG5nJywgJ2FiY2Rl
YmM3NjJlM2FlYzVkZjAzYjVjMDQ0ODViMmNiM2I2NWZmYjEnKTogc2V0KFsncGxhdGZvcm0vY2hy
b21pdW0tbGludXgvYW5pbWFnZS5wbmcnLCAncGxhdGZvcm0vY2hyb21pdW0td2luL2FuaW1hZ2Uu
cG5nJ10pfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3RlZCwgaGFzaGVzKQorCisg
ICAgZGVmIHRlc3RfZXh0cmFjdF9wbGF0Zm9ybXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0
RXF1YWxzKHsnZm9vJzogJ3BsYXRmb3JtL2Zvby9iYXInLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgJ3pvbyc6ICdwbGF0Zm9ybS96b28vY29tJ30sCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICBkZWR1cGxpY2F0ZV90ZXN0cy5leHRyYWN0X3BsYXRmb3JtcyhbJ3BsYXRmb3JtL2Zvby9i
YXInLCAncGxhdGZvcm0vem9vL2NvbSddKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeydm
b28nOiAncGxhdGZvcm0vZm9vL2JhcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWR1
cGxpY2F0ZV90ZXN0cy5fQkFTRV9QTEFURk9STTogJ3doYXQvJ30sCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICBkZWR1cGxpY2F0ZV90ZXN0cy5leHRyYWN0X3BsYXRmb3JtcyhbJ3BsYXRmb3Jt
L2Zvby9iYXInLCAnd2hhdC8nXSkpCisKKyAgICBkZWYgdGVzdF91bmlxdWUoc2VsZik6CisgICAg
ICAgIE1vY2tFeGVjdXRpdmUucmVzcG9uc2UgPSAoCisgICAgICAgICAgICAnMTAwNjQ0IGJsb2Ig
NTA1MzI0MGIzMzUzZjZlYjM5ZjdjYjAwMjU5Nzg1ZjE2ZDEyMWRmMlx0TGF5b3V0VGVzdHMvbWFj
L2Zvby1leHBlY3RlZC50eHRcbicKKyAgICAgICAgICAgICcxMDA2NDQgYmxvYiBhMDA0NTQ4ZDEw
N2VjYzRlMWVhMDgwMTlkYWYwYTE0ZTg2MzRhMWZmXHRMYXlvdXRUZXN0cy9wbGF0Zm9ybS9jaHJv
bWl1bS9mb28tZXhwZWN0ZWQudHh0XG4nCisgICAgICAgICAgICAnMTAwNjQ0IGJsb2IgYWJjZDBi
Yzc2MmUzYWVjNWRmMDNiNWMwNDQ4NWIyY2IzYjY1ZmZiMVx0TGF5b3V0VGVzdHMvcGxhdGZvcm0v
Y2hyb21pdW0tbGludXgvZm9vLWV4cGVjdGVkLnR4dFxuJworICAgICAgICAgICAgJzEwMDY0NCBi
bG9iIGQ2YmIwYmM3NjJlM2FlYzVkZjAzYjVjMDQ0ODViMmNiM2I2NWZmYjFcdExheW91dFRlc3Rz
L3BsYXRmb3JtL2Nocm9taXVtLXdpbi9mb28tZXhwZWN0ZWQudHh0XG4nCisgICAgICAgICAgICAn
MTAwNjQ0IGJsb2IgNDMwM2RmNTM4OWNhODdjYWU4M2RkMzIzNmI4ZGQ4NGUxNjYwNjUxN1x0TGF5
b3V0VGVzdHMvcGxhdGZvcm0vbWFjL2Zvby1leHBlY3RlZC50eHRcbicpCisgICAgICAgIHJlc3Vs
dCA9IGRlZHVwbGljYXRlX3Rlc3RzLmRlZHVwbGljYXRlKCcqJykKKyAgICAgICAgc2VsZi5hc3Nl
cnRFcXVhbHMoMSwgbGVuKE1vY2tFeGVjdXRpdmUubGFzdF9ydW5fY29tbWFuZCkpCisgICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWxzKCgnZ2l0JywgJ2xzLXRyZWUnLCAnLXInLCAnSEVBRCcsICdMYXlv
dXRUZXN0cycpLCBNb2NrRXhlY3V0aXZlLmxhc3RfcnVuX2NvbW1hbmRbLTFdKQorICAgICAgICBz
ZWxmLmFzc2VydEVxdWFscygwLCBsZW4ocmVzdWx0KSkKKworICAgIGRlZiB0ZXN0X2R1cGxpY2F0
ZXMoc2VsZik6CisgICAgICAgIE1vY2tFeGVjdXRpdmUucmVzcG9uc2UgPSAoCisgICAgICAgICAg
ICAnMTAwNjQ0IGJsb2IgNTA1MzI0MGIzMzUzZjZlYjM5ZjdjYjAwMjU5Nzg1ZjE2ZDEyMWRmMlx0
TGF5b3V0VGVzdHMvbWFjL2Zvby1leHBlY3RlZC50eHRcbicKKyAgICAgICAgICAgICcxMDA2NDQg
YmxvYiBhMDA0NTQ4ZDEwN2VjYzRlMWVhMDgwMTlkYWYwYTE0ZTg2MzRhMWZmXHRMYXlvdXRUZXN0
cy9wbGF0Zm9ybS9jaHJvbWl1bS9mb28tZXhwZWN0ZWQudHh0XG4nCisgICAgICAgICAgICAnMTAw
NjQ0IGJsb2IgZDZiYjBiYzc2MmUzYWVjNWRmMDNiNWMwNDQ4NWIyY2IzYjY1ZmZiMVx0TGF5b3V0
VGVzdHMvcGxhdGZvcm0vY2hyb21pdW0tbGludXgvZm9vLWV4cGVjdGVkLnR4dFxuJworICAgICAg
ICAgICAgJzEwMDY0NCBibG9iIGFiY2RlYmM3NjJlM2FlYzVkZjAzYjVjMDQ0ODViMmNiM2I2NWZm
YjFcdExheW91dFRlc3RzL3BsYXRmb3JtL2Nocm9taXVtLWxpbnV4L2FuaW1hZ2UucG5nXG4nCisg
ICAgICAgICAgICAnMTAwNjQ0IGJsb2IgZDZiYjBiYzc2MmUzYWVjNWRmMDNiNWMwNDQ4NWIyY2Iz
YjY1ZmZiMVx0TGF5b3V0VGVzdHMvcGxhdGZvcm0vY2hyb21pdW0td2luL2Zvby1leHBlY3RlZC50
eHRcbicKKyAgICAgICAgICAgICcxMDA2NDQgYmxvYiBhYmNkZWJjNzYyZTNhZWM1ZGYwM2I1YzA0
NDg1YjJjYjNiNjVmZmIxXHRMYXlvdXRUZXN0cy9wbGF0Zm9ybS9jaHJvbWl1bS13aW4vYW5pbWFn
ZS5wbmdcbicKKyAgICAgICAgICAgICcxMDA2NDQgYmxvYiA0MzAzZGY1Mzg5Y2E4N2NhZTgzZGQz
MjM2YjhkZDg0ZTE2NjA2NTE3XHRMYXlvdXRUZXN0cy9wbGF0Zm9ybS9tYWMvZm9vLWV4cGVjdGVk
LnR4dFxuJykKKworICAgICAgICByZXN1bHQgPSBkZWR1cGxpY2F0ZV90ZXN0cy5kZWR1cGxpY2F0
ZSgnKicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbihNb2NrRXhlY3V0aXZlLmxh
c3RfcnVuX2NvbW1hbmQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygoJ2dpdCcsICdscy10
cmVlJywgJy1yJywgJ0hFQUQnLCAnTGF5b3V0VGVzdHMnKSwgTW9ja0V4ZWN1dGl2ZS5sYXN0X3J1
bl9jb21tYW5kWy0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMiwgbGVuKHJlc3VsdCkp
CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHsndGVzdCc6ICdhbmltYWdlLnBuZycsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAncGF0aCc6ICdwbGF0Zm9ybS9jaHJvbWl1bS1saW51eC9h
bmltYWdlLnBuZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmFsbGJhY2snOiAnY2hy
b21pdW0td2luJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybSc6ICdjaHJv
bWl1bS1saW51eCd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbMF0pCisgICAg
ICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHsndGVzdCc6ICdmb28tZXhwZWN0ZWQudHh0JywKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICdwYXRoJzogJ3BsYXRmb3JtL2Nocm9taXVtLWxpbnV4L2Zv
by1leHBlY3RlZC50eHQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhbGxiYWNrJzog
J2Nocm9taXVtLXdpbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0nOiAn
Y2hyb21pdW0tbGludXgnfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0WzFdKQor
CisgICAgICAgIHJlc3VsdCA9IGRlZHVwbGljYXRlX3Rlc3RzLmRlZHVwbGljYXRlKCcqLnR4dCcp
CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDIsIGxlbihNb2NrRXhlY3V0aXZlLmxhc3RfcnVu
X2NvbW1hbmQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygoJ2dpdCcsICdscy10cmVlJywg
Jy1yJywgJ0hFQUQnLCAnTGF5b3V0VGVzdHMnKSwgTW9ja0V4ZWN1dGl2ZS5sYXN0X3J1bl9jb21t
YW5kWy0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgbGVuKHJlc3VsdCkpCisgICAg
ICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHsndGVzdCc6ICdmb28tZXhwZWN0ZWQudHh0JywKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICdwYXRoJzogJ3BsYXRmb3JtL2Nocm9taXVtLWxpbnV4L2Zv
by1leHBlY3RlZC50eHQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhbGxiYWNrJzog
J2Nocm9taXVtLXdpbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0nOiAn
Y2hyb21pdW0tbGludXgnfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0WzBdKQor
CisgICAgICAgIHJlc3VsdCA9IGRlZHVwbGljYXRlX3Rlc3RzLmRlZHVwbGljYXRlKCcqLnBuZycp
CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDMsIGxlbihNb2NrRXhlY3V0aXZlLmxhc3RfcnVu
X2NvbW1hbmQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygoJ2dpdCcsICdscy10cmVlJywg
Jy1yJywgJ0hFQUQnLCAnTGF5b3V0VGVzdHMnKSwgTW9ja0V4ZWN1dGl2ZS5sYXN0X3J1bl9jb21t
YW5kWy0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgbGVuKHJlc3VsdCkpCisgICAg
ICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHsndGVzdCc6ICdhbmltYWdlLnBuZycsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAncGF0aCc6ICdwbGF0Zm9ybS9jaHJvbWl1bS1saW51eC9hbmltYWdl
LnBuZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmFsbGJhY2snOiAnY2hyb21pdW0t
d2luJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybSc6ICdjaHJvbWl1bS1s
aW51eCd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbMF0pCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>