<?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>38246</bug_id>
          
          <creation_ts>2010-04-28 00:48:48 -0700</creation_ts>
          <short_desc>wdiff_text throws ScriptError because wdiff returns non-zero when files differ</short_desc>
          <delta_ts>2010-04-28 03:42:56 -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="Eric Seidel (no email)">eric</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abarth</cc>
    
    <cc>cjerdonek</cc>
    
    <cc>dpranke</cc>
    
    <cc>eric</cc>
    
    <cc>jorlow</cc>
    
    <cc>tony</cc>
    
    <cc>ukai</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>218245</commentid>
    <comment_count>0</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-04-28 00:48:48 -0700</bug_when>
    <thetext>wdiff_text throws ScriptError because wdiff returns non-zero when files differ</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218248</commentid>
    <comment_count>1</comment_count>
      <attachid>54533</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-04-28 00:51:38 -0700</bug_when>
    <thetext>Created attachment 54533
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218252</commentid>
    <comment_count>2</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-04-28 00:56:02 -0700</bug_when>
    <thetext>*** Bug 38240 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218255</commentid>
    <comment_count>3</comment_count>
      <attachid>54533</attachid>
    <who name="Fumitoshi Ukai">ukai</who>
    <bug_when>2010-04-28 01:03:44 -0700</bug_when>
    <thetext>Comment on attachment 54533
Patch

&gt; diff --git a/WebKitTools/ChangeLog b/WebKitTools/ChangeLog
&gt; index 3d9222a3e85a47986f55ae9f7a3f398345884caa..5c6796145e587a69b076d228536fd09dba0bcbb2 100644
&gt; --- a/WebKitTools/ChangeLog
&gt; +++ b/WebKitTools/ChangeLog
&gt; @@ -1,3 +1,22 @@
&gt; +2010-04-28  Eric Seidel  &lt;eric@webkit.org&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        wdiff_text throws ScriptError because wdiff returns non-zero when files differ
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=38246
&gt; +
&gt; +        wdiff returns 0 when files are the same, 1 when they differ.
&gt; +        run_command by default raises ScriptError if the return code is non-zero.
&gt; +        Fixed this by adding a custom error handler which only raises if the
&gt; +        return code is not 1.
&gt; +
&gt; +        I broke up the huge wdiff_text() method into little pieces
&gt; +        for easier unit testing.  There is only one functional change here
&gt; +        and that is the addition of the custom error handler.
&gt; +
&gt; +        * Scripts/webkitpy/layout_tests/port/base.py:
&gt; +        * Scripts/webkitpy/layout_tests/port/base_unittest.py:
&gt; +
&gt;  2010-04-27  Michael Nordman  &lt;michaeln@google.com&gt;
&gt;  
&gt;          Reviewed by Dmitry Titov.
&gt; diff --git a/WebKitTools/Scripts/webkitpy/layout_tests/port/base.py b/WebKitTools/Scripts/webkitpy/layout_tests/port/base.py
&gt; index 1ca465c316a78d0e44a9e126ab1d9ccdfa40b02e..5bc47d973ec4f9919ed4a85ca264bff6907c9e6f 100644
&gt; --- a/WebKitTools/Scripts/webkitpy/layout_tests/port/base.py
&gt; +++ b/WebKitTools/Scripts/webkitpy/layout_tests/port/base.py
&gt; @@ -535,39 +535,61 @@ class Port(object):
&gt;          expectations, determining search paths, and logging information.&quot;&quot;&quot;
&gt;          raise NotImplementedError(&apos;Port.version&apos;)
&gt;  
&gt; +    _WDIFF_DEL = &apos;##WDIFF_DEL##&apos;
&gt; +    _WDIFF_ADD = &apos;##WDIFF_ADD##&apos;
&gt; +    _WDIFF_END = &apos;##WDIFF_END##&apos;
&gt; +
&gt; +    def _format_wdiff_output_as_html(self, wdiff):
&gt; +        wdiff = cgi.escape(wdiff)
&gt; +        wdiff = wdiff.replace(self._WDIFF_DEL, &quot;&lt;span class=del&gt;&quot;)
&gt; +        wdiff = wdiff.replace(self._WDIFF_ADD, &quot;&lt;span class=add&gt;&quot;)
&gt; +        wdiff = wdiff.replace(self._WDIFF_END, &quot;&lt;/span&gt;&quot;)
&gt; +        html = &quot;&lt;head&gt;&lt;style&gt;.del { background: #faa; } &quot;
&gt; +        html += &quot;.add { background: #afa; }&lt;/style&gt;&lt;/head&gt;&quot;
&gt; +        html += &quot;&lt;pre&gt;%s&lt;/pre&gt;&quot; % wdiff
&gt; +        return html
&gt; +
&gt; +    def _wdiff_command(self, actual_filename, expected_filename):
&gt; +        executable = self._path_to_wdiff()
&gt; +        return [executable,
&gt; +                &quot;--start-delete=%s&quot; % self._WDIFF_DEL,
&gt; +                &quot;--end-delete=%s&quot; % self._WDIFF_END,
&gt; +                &quot;--start-insert=%s&quot; % self._WDIFF_ADD,
&gt; +                &quot;--end-insert=%s&quot; % self._WDIFF_END,
&gt; +                actual_filename,
&gt; +                expected_filename]
&gt; +
&gt; +    @staticmethod
&gt; +    def _handle_wdiff_error(script_error):
&gt; +        # Exit 1 means the files differed, any other exit code is an error.
&gt; +        if script_error.exit_code != 1:
&gt; +            raise script_error
&gt; +
&gt; +    def _run_wdiff(self, actual_filename, expected_filename):
&gt; +        &quot;&quot;&quot;Runs wdiff and may throw exceptions.
&gt; +        This is mostly a hook for unit testing.&quot;&quot;&quot;
&gt; +        # Diffs are treated as binary as they may include multiple files
&gt; +        # with conflicting encodings.  Thus we do not decode the output.
&gt; +        command = self._wdiff_command(actual_filename, expected_filename)
&gt; +        wdiff = self._executive.run_command(command, decode_output=False,
&gt; +            error_handler=self._handle_wdiff_error)
&gt; +        return self._format_wdiff_output_as_html(wdiff)
&gt; +
&gt;      def wdiff_text(self, actual_filename, expected_filename):
&gt;          &quot;&quot;&quot;Returns a string of HTML indicating the word-level diff of the
&gt;          contents of the two filenames. Returns an empty string if word-level
&gt;          diffing isn&apos;t available.&quot;&quot;&quot;
&gt; -        executable = self._path_to_wdiff()
&gt; -        cmd = [executable,
&gt; -               &apos;--start-delete=##WDIFF_DEL##&apos;,
&gt; -               &apos;--end-delete=##WDIFF_END##&apos;,
&gt; -               &apos;--start-insert=##WDIFF_ADD##&apos;,
&gt; -               &apos;--end-insert=##WDIFF_END##&apos;,
&gt; -               actual_filename,
&gt; -               expected_filename]
&gt;          global _wdiff_available  # See explaination at top of file.
&gt; -        result = &apos;&apos;
&gt; +        if not _wdiff_available:
&gt; +            return &quot;&quot;
&gt;          try:
&gt; -            if _wdiff_available:
&gt; -                wdiff = self._executive.run_command(cmd, decode_output=False)
&gt; -                wdiff = cgi.escape(wdiff)
&gt; -                wdiff = wdiff.replace(&apos;##WDIFF_DEL##&apos;, &apos;&lt;span class=del&gt;&apos;)
&gt; -                wdiff = wdiff.replace(&apos;##WDIFF_ADD##&apos;, &apos;&lt;span class=add&gt;&apos;)
&gt; -                wdiff = wdiff.replace(&apos;##WDIFF_END##&apos;, &apos;&lt;/span&gt;&apos;)
&gt; -                result = &apos;&lt;head&gt;&lt;style&gt;.del { background: #faa; } &apos;
&gt; -                result += &apos;.add { background: #afa; }&lt;/style&gt;&lt;/head&gt;&apos;
&gt; -                result += &apos;&lt;pre&gt;&apos; + wdiff + &apos;&lt;/pre&gt;&apos;
&gt; +            self._run_wdiff(actual_filename, expected_filename)

return self._run_wdiff(actual_filename, expected_filename) ?

&gt;          except OSError, e:
&gt; -            if (e.errno == errno.ENOENT or e.errno == errno.EACCES or
&gt; -                e.errno == errno.ECHILD):
&gt; -                _wdiff_available = False
&gt; -            else:
&gt; +            # Silently ignore cases where wdiff is missing.
&gt; +            if e.errno not in [errno.ENOENT, errno.EACCES, errno.ECHILD]:
&gt;                  raise e
&gt; -        # Diffs are treated as binary as they may include multiple files
&gt; -        # with conflicting encodings.  Thus we do not decode the output here.
&gt; -        return result
&gt; +        _wdiff_available = False
&gt; +        return &quot;&quot;
&gt;  
&gt;      _pretty_patch_error_html = &quot;Failed to run PrettyPatch, see error console.&quot;
&gt;  
&gt; diff --git a/WebKitTools/Scripts/webkitpy/layout_tests/port/base_unittest.py b/WebKitTools/Scripts/webkitpy/layout_tests/port/base_unittest.py
&gt; index 8ea916528880149d7fa61fb6cbdc377f156bf812..f388956f7c44cdf9e865cbfed09b219ee5aa0dde 100644
&gt; --- a/WebKitTools/Scripts/webkitpy/layout_tests/port/base_unittest.py
&gt; +++ b/WebKitTools/Scripts/webkitpy/layout_tests/port/base_unittest.py
&gt; @@ -28,10 +28,72 @@
&gt;  
&gt;  import base
&gt;  import unittest
&gt; +import tempfile
&gt;  
&gt; +from webkitpy.common.system.executive import Executive, ScriptError
&gt;  from webkitpy.thirdparty.mock import Mock
&gt;  
&gt;  
&gt; +class PortTest(unittest.TestCase):
&gt; +
&gt; +    def test_format_wdiff_output_as_html(self):
&gt; +        output = &quot;OUTPUT %s %s %s&quot; % (base.Port._WDIFF_DEL, base.Port._WDIFF_ADD, base.Port._WDIFF_END)
&gt; +        html = base.Port()._format_wdiff_output_as_html(output)
&gt; +        expected_html = &quot;&lt;head&gt;&lt;style&gt;.del { background: #faa; } .add { background: #afa; }&lt;/style&gt;&lt;/head&gt;&lt;pre&gt;OUTPUT &lt;span class=del&gt; &lt;span class=add&gt; &lt;/span&gt;&lt;/pre&gt;&quot;
&gt; +        self.assertEqual(html, expected_html)
&gt; +
&gt; +    def test_wdiff_command(self):
&gt; +        port = base.Port()
&gt; +        port._path_to_wdiff = lambda: &quot;/path/to/wdiff&quot;
&gt; +        command = port._wdiff_command(&quot;/actual/path&quot;, &quot;/expected/path&quot;)
&gt; +        expected_command = [
&gt; +            &quot;/path/to/wdiff&quot;,
&gt; +            &quot;--start-delete=##WDIFF_DEL##&quot;,
&gt; +            &quot;--end-delete=##WDIFF_END##&quot;,
&gt; +            &quot;--start-insert=##WDIFF_ADD##&quot;,
&gt; +            &quot;--end-insert=##WDIFF_END##&quot;,
&gt; +            &quot;/actual/path&quot;,
&gt; +            &quot;/expected/path&quot;,
&gt; +        ]
&gt; +        self.assertEqual(command, expected_command)
&gt; +
&gt; +    def _file_with_contents(self, contents, encoding=&quot;utf-8&quot;):
&gt; +        new_file = tempfile.NamedTemporaryFile()
&gt; +        new_file.write(contents.encode(encoding))
&gt; +        new_file.flush()
&gt; +        return new_file
&gt; +
&gt; +    def test_run_wdiff(self):
&gt; +        executive = Executive()
&gt; +        # This may fail on some systems.  We could ask the port
&gt; +        # object for the wdiff path, but since we don&apos;t know what
&gt; +        # port object to use, this is sufficient for now.
&gt; +        try:
&gt; +            wdiff_path = executive.run_command([&quot;which&quot;, &quot;wdiff&quot;]).rstrip()
&gt; +        except Exception, e:
&gt; +            wdiff_path = None
&gt; +
&gt; +        port = base.Port()
&gt; +        port._path_to_wdiff = lambda: wdiff_path
&gt; +
&gt; +        if wdiff_path:
&gt; +            # &quot;with tempfile.NamedTemporaryFile() as actual&quot; does not seem to work in Python 2.5
&gt; +            actual = self._file_with_contents(u&quot;foo&quot;)
&gt; +            expected = self._file_with_contents(u&quot;bar&quot;)
&gt; +            wdiff = port._run_wdiff(actual.name, expected.name)
&gt; +            expected_wdiff = &quot;&lt;head&gt;&lt;style&gt;.del { background: #faa; } .add { background: #afa; }&lt;/style&gt;&lt;/head&gt;&lt;pre&gt;&lt;span class=del&gt;foo&lt;/span&gt;&lt;span class=add&gt;bar&lt;/span&gt;&lt;/pre&gt;&quot;
&gt; +            self.assertEqual(wdiff, expected_wdiff)
&gt; +            actual.close()
&gt; +            expected.close()
&gt; +
&gt; +            # Bogus paths should raise a script error.
&gt; +            self.assertRaises(ScriptError, port._run_wdiff, &quot;/does/not/exist&quot;, &quot;/does/not/exist2&quot;)
&gt; +
&gt; +        # If wdiff does not exist _run_wdiff should throw an OSError.
&gt; +        port._path_to_wdiff = lambda: &quot;/invalid/path/to/wdiff&quot;
&gt; +        self.assertRaises(OSError, port._run_wdiff, &quot;foo&quot;, &quot;bar&quot;)
&gt; +
&gt; +
&gt;  class DriverTest(unittest.TestCase):
&gt;  
&gt;      def _assert_wrapper(self, wrapper_string, expected_wrapper):</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218256</commentid>
    <comment_count>4</comment_count>
      <attachid>54533</attachid>
    <who name="Tony Chang">tony</who>
    <bug_when>2010-04-28 01:04:07 -0700</bug_when>
    <thetext>Comment on attachment 54533
Patch

What&apos;s the benefit of a custom error handler vs putting endAfterSelection in a try/except block?

Unittests look great.  Should they be limited to 80 cols? (I don&apos;t remember the decision).

WebKitTools/Scripts/webkitpy/layout_tests/port/base_unittest.py:73
 +          except Exception, e:
Can we make this exception more tightly scoped?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218263</commentid>
    <comment_count>5</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-04-28 01:16:20 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; (From update of attachment 54533 [details])
&gt; What&apos;s the benefit of a custom error handler vs putting endAfterSelection in a
&gt; try/except block?
&gt; 
&gt; Unittests look great.  Should they be limited to 80 cols? (I don&apos;t remember the
&gt; decision).

I don&apos;t think there was a decision.  Generally I wrap to 80c, except when it hurts readability.  I can look at wrapping the expected results.

&gt; WebKitTools/Scripts/webkitpy/layout_tests/port/base_unittest.py:73
&gt;  +          except Exception, e:
&gt; Can we make this exception more tightly scoped?

We could.  I didn&apos;t want the unit tests to die unexpectedly on other systems.  I&apos;d rather they just ignore these tests if &quot;which wdiff&quot; doesn&apos;t work for any reason.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218264</commentid>
    <comment_count>6</comment_count>
    <who name="Tony Chang">tony</who>
    <bug_when>2010-04-28 01:18:46 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; (From update of attachment 54533 [details])
&gt; What&apos;s the benefit of a custom error handler vs putting endAfterSelection in a
&gt; try/except block?

Ooops, junk in my clipboard.  That was supposed to read |self._executive.run_command| in a try/except block.  Anyway, not a big deal either way, just seems like less code to catch an exception.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218265</commentid>
    <comment_count>7</comment_count>
      <attachid>54537</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-04-28 01:19:20 -0700</bug_when>
    <thetext>Created attachment 54537
Fixed missing return and added more unit tests</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218266</commentid>
    <comment_count>8</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-04-28 01:21:56 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; (In reply to comment #4)
&gt; &gt; (From update of attachment 54533 [details] [details])
&gt; &gt; What&apos;s the benefit of a custom error handler vs putting endAfterSelection in a
&gt; &gt; try/except block?
&gt; 
&gt; Ooops, junk in my clipboard.  That was supposed to read
&gt; |self._executive.run_command| in a try/except block.  Anyway, not a big deal
&gt; either way, just seems like less code to catch an exception.

The only advantage is the theoretical one of reserving exceptions for exceptional situations. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218268</commentid>
    <comment_count>9</comment_count>
    <who name="Fumitoshi Ukai">ukai</who>
    <bug_when>2010-04-28 01:25:17 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; Created an attachment (id=54537) [details]
&gt; Fixed missing return and added more unit tests

LGTM</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218273</commentid>
    <comment_count>10</comment_count>
      <attachid>54537</attachid>
    <who name="Shinichiro Hamaji">hamaji</who>
    <bug_when>2010-04-28 01:43:13 -0700</bug_when>
    <thetext>Comment on attachment 54537
Fixed missing return and added more unit tests

rs=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218274</commentid>
    <comment_count>11</comment_count>
      <attachid>54537</attachid>
    <who name="Shinichiro Hamaji">hamaji</who>
    <bug_when>2010-04-28 01:48:30 -0700</bug_when>
    <thetext>Comment on attachment 54537
Fixed missing return and added more unit tests

WebKitTools/Scripts/webkitpy/layout_tests/port/base.py:595
 +              raise e
I think we don&apos;t need &quot;e&quot; to re-raise the exception. Also, I&apos;m not sure if we need this except-clause, but I guess we want to emphasize the ScriptError can be thrown.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218276</commentid>
    <comment_count>12</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-04-28 01:59:02 -0700</bug_when>
    <thetext>(In reply to comment #11)
&gt; (From update of attachment 54537 [details])
&gt; WebKitTools/Scripts/webkitpy/layout_tests/port/base.py:595
&gt;  +              raise e
&gt; I think we don&apos;t need &quot;e&quot; to re-raise the exception. Also, I&apos;m not sure if we
&gt; need this except-clause, but I guess we want to emphasize the ScriptError can
&gt; be thrown.

You&apos;re right.  We want just &quot;raise&quot; as that has the magical property of not messing up the stacktrace.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218282</commentid>
    <comment_count>13</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-04-28 02:23:14 -0700</bug_when>
    <thetext>cq+ since this is breaking Chromium bots and it seems as though there are no other outstanding comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218291</commentid>
    <comment_count>14</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-04-28 02:45:11 -0700</bug_when>
    <thetext>Committed r58395: &lt;http://trac.webkit.org/changeset/58395&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>218308</commentid>
    <comment_count>15</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-04-28 03:42:56 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/58395 might have broken Tiger Intel Release
The following changes are on the blame list:
http://trac.webkit.org/changeset/58393
http://trac.webkit.org/changeset/58394
http://trac.webkit.org/changeset/58395</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>54533</attachid>
            <date>2010-04-28 00:51:38 -0700</date>
            <delta_ts>2010-04-28 01:19:14 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-38246-20100428005136.patch</filename>
            <type>text/plain</type>
            <size>8861</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCAzZDkyMjJhM2U4NWE0Nzk4NmY1NWFlOWY3YTNmMzk4MzQ1ODg0Y2FhLi41YzY3OTYx
NDVlNTg3YTY5YjA3NmQyMjg1MzZmZDA5ZGJhMGJjYmIyIDEwMDY0NAotLS0gYS9XZWJLaXRUb29s
cy9DaGFuZ2VMb2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjIgQEAK
KzIwMTAtMDQtMjggIEVyaWMgU2VpZGVsICA8ZXJpY0B3ZWJraXQub3JnPgorCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIHdkaWZmX3RleHQgdGhyb3dzIFNj
cmlwdEVycm9yIGJlY2F1c2Ugd2RpZmYgcmV0dXJucyBub24temVybyB3aGVuIGZpbGVzIGRpZmZl
cgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzgyNDYK
KworICAgICAgICB3ZGlmZiByZXR1cm5zIDAgd2hlbiBmaWxlcyBhcmUgdGhlIHNhbWUsIDEgd2hl
biB0aGV5IGRpZmZlci4KKyAgICAgICAgcnVuX2NvbW1hbmQgYnkgZGVmYXVsdCByYWlzZXMgU2Ny
aXB0RXJyb3IgaWYgdGhlIHJldHVybiBjb2RlIGlzIG5vbi16ZXJvLgorICAgICAgICBGaXhlZCB0
aGlzIGJ5IGFkZGluZyBhIGN1c3RvbSBlcnJvciBoYW5kbGVyIHdoaWNoIG9ubHkgcmFpc2VzIGlm
IHRoZQorICAgICAgICByZXR1cm4gY29kZSBpcyBub3QgMS4KKworICAgICAgICBJIGJyb2tlIHVw
IHRoZSBodWdlIHdkaWZmX3RleHQoKSBtZXRob2QgaW50byBsaXR0bGUgcGllY2VzCisgICAgICAg
IGZvciBlYXNpZXIgdW5pdCB0ZXN0aW5nLiAgVGhlcmUgaXMgb25seSBvbmUgZnVuY3Rpb25hbCBj
aGFuZ2UgaGVyZQorICAgICAgICBhbmQgdGhhdCBpcyB0aGUgYWRkaXRpb24gb2YgdGhlIGN1c3Rv
bSBlcnJvciBoYW5kbGVyLgorCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVz
dHMvcG9ydC9iYXNlLnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3Rz
L3BvcnQvYmFzZV91bml0dGVzdC5weToKKwogMjAxMC0wNC0yNyAgTWljaGFlbCBOb3JkbWFuICA8
bWljaGFlbG5AZ29vZ2xlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBEbWl0cnkgVGl0b3Yu
CmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9w
b3J0L2Jhc2UucHkgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9w
b3J0L2Jhc2UucHkKaW5kZXggMWNhNDY1YzMxNmE3OGQwZTQ0YTllMTI2YWIxZDljY2RmYTQwYjAy
ZS4uNWJjNDdkOTczZWM0Zjk5MTllZDRhODVjYTI2NGJmZjY5MDdjOWU2ZiAxMDA2NDQKLS0tIGEv
V2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9iYXNlLnB5Cisr
KyBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvYmFzZS5w
eQpAQCAtNTM1LDM5ICs1MzUsNjEgQEAgY2xhc3MgUG9ydChvYmplY3QpOgogICAgICAgICBleHBl
Y3RhdGlvbnMsIGRldGVybWluaW5nIHNlYXJjaCBwYXRocywgYW5kIGxvZ2dpbmcgaW5mb3JtYXRp
b24uIiIiCiAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ1BvcnQudmVyc2lvbicp
CiAKKyAgICBfV0RJRkZfREVMID0gJyMjV0RJRkZfREVMIyMnCisgICAgX1dESUZGX0FERCA9ICcj
I1dESUZGX0FERCMjJworICAgIF9XRElGRl9FTkQgPSAnIyNXRElGRl9FTkQjIycKKworICAgIGRl
ZiBfZm9ybWF0X3dkaWZmX291dHB1dF9hc19odG1sKHNlbGYsIHdkaWZmKToKKyAgICAgICAgd2Rp
ZmYgPSBjZ2kuZXNjYXBlKHdkaWZmKQorICAgICAgICB3ZGlmZiA9IHdkaWZmLnJlcGxhY2Uoc2Vs
Zi5fV0RJRkZfREVMLCAiPHNwYW4gY2xhc3M9ZGVsPiIpCisgICAgICAgIHdkaWZmID0gd2RpZmYu
cmVwbGFjZShzZWxmLl9XRElGRl9BREQsICI8c3BhbiBjbGFzcz1hZGQ+IikKKyAgICAgICAgd2Rp
ZmYgPSB3ZGlmZi5yZXBsYWNlKHNlbGYuX1dESUZGX0VORCwgIjwvc3Bhbj4iKQorICAgICAgICBo
dG1sID0gIjxoZWFkPjxzdHlsZT4uZGVsIHsgYmFja2dyb3VuZDogI2ZhYTsgfSAiCisgICAgICAg
IGh0bWwgKz0gIi5hZGQgeyBiYWNrZ3JvdW5kOiAjYWZhOyB9PC9zdHlsZT48L2hlYWQ+IgorICAg
ICAgICBodG1sICs9ICI8cHJlPiVzPC9wcmU+IiAlIHdkaWZmCisgICAgICAgIHJldHVybiBodG1s
CisKKyAgICBkZWYgX3dkaWZmX2NvbW1hbmQoc2VsZiwgYWN0dWFsX2ZpbGVuYW1lLCBleHBlY3Rl
ZF9maWxlbmFtZSk6CisgICAgICAgIGV4ZWN1dGFibGUgPSBzZWxmLl9wYXRoX3RvX3dkaWZmKCkK
KyAgICAgICAgcmV0dXJuIFtleGVjdXRhYmxlLAorICAgICAgICAgICAgICAgICItLXN0YXJ0LWRl
bGV0ZT0lcyIgJSBzZWxmLl9XRElGRl9ERUwsCisgICAgICAgICAgICAgICAgIi0tZW5kLWRlbGV0
ZT0lcyIgJSBzZWxmLl9XRElGRl9FTkQsCisgICAgICAgICAgICAgICAgIi0tc3RhcnQtaW5zZXJ0
PSVzIiAlIHNlbGYuX1dESUZGX0FERCwKKyAgICAgICAgICAgICAgICAiLS1lbmQtaW5zZXJ0PSVz
IiAlIHNlbGYuX1dESUZGX0VORCwKKyAgICAgICAgICAgICAgICBhY3R1YWxfZmlsZW5hbWUsCisg
ICAgICAgICAgICAgICAgZXhwZWN0ZWRfZmlsZW5hbWVdCisKKyAgICBAc3RhdGljbWV0aG9kCisg
ICAgZGVmIF9oYW5kbGVfd2RpZmZfZXJyb3Ioc2NyaXB0X2Vycm9yKToKKyAgICAgICAgIyBFeGl0
IDEgbWVhbnMgdGhlIGZpbGVzIGRpZmZlcmVkLCBhbnkgb3RoZXIgZXhpdCBjb2RlIGlzIGFuIGVy
cm9yLgorICAgICAgICBpZiBzY3JpcHRfZXJyb3IuZXhpdF9jb2RlICE9IDE6CisgICAgICAgICAg
ICByYWlzZSBzY3JpcHRfZXJyb3IKKworICAgIGRlZiBfcnVuX3dkaWZmKHNlbGYsIGFjdHVhbF9m
aWxlbmFtZSwgZXhwZWN0ZWRfZmlsZW5hbWUpOgorICAgICAgICAiIiJSdW5zIHdkaWZmIGFuZCBt
YXkgdGhyb3cgZXhjZXB0aW9ucy4KKyAgICAgICAgVGhpcyBpcyBtb3N0bHkgYSBob29rIGZvciB1
bml0IHRlc3RpbmcuIiIiCisgICAgICAgICMgRGlmZnMgYXJlIHRyZWF0ZWQgYXMgYmluYXJ5IGFz
IHRoZXkgbWF5IGluY2x1ZGUgbXVsdGlwbGUgZmlsZXMKKyAgICAgICAgIyB3aXRoIGNvbmZsaWN0
aW5nIGVuY29kaW5ncy4gIFRodXMgd2UgZG8gbm90IGRlY29kZSB0aGUgb3V0cHV0LgorICAgICAg
ICBjb21tYW5kID0gc2VsZi5fd2RpZmZfY29tbWFuZChhY3R1YWxfZmlsZW5hbWUsIGV4cGVjdGVk
X2ZpbGVuYW1lKQorICAgICAgICB3ZGlmZiA9IHNlbGYuX2V4ZWN1dGl2ZS5ydW5fY29tbWFuZChj
b21tYW5kLCBkZWNvZGVfb3V0cHV0PUZhbHNlLAorICAgICAgICAgICAgZXJyb3JfaGFuZGxlcj1z
ZWxmLl9oYW5kbGVfd2RpZmZfZXJyb3IpCisgICAgICAgIHJldHVybiBzZWxmLl9mb3JtYXRfd2Rp
ZmZfb3V0cHV0X2FzX2h0bWwod2RpZmYpCisKICAgICBkZWYgd2RpZmZfdGV4dChzZWxmLCBhY3R1
YWxfZmlsZW5hbWUsIGV4cGVjdGVkX2ZpbGVuYW1lKToKICAgICAgICAgIiIiUmV0dXJucyBhIHN0
cmluZyBvZiBIVE1MIGluZGljYXRpbmcgdGhlIHdvcmQtbGV2ZWwgZGlmZiBvZiB0aGUKICAgICAg
ICAgY29udGVudHMgb2YgdGhlIHR3byBmaWxlbmFtZXMuIFJldHVybnMgYW4gZW1wdHkgc3RyaW5n
IGlmIHdvcmQtbGV2ZWwKICAgICAgICAgZGlmZmluZyBpc24ndCBhdmFpbGFibGUuIiIiCi0gICAg
ICAgIGV4ZWN1dGFibGUgPSBzZWxmLl9wYXRoX3RvX3dkaWZmKCkKLSAgICAgICAgY21kID0gW2V4
ZWN1dGFibGUsCi0gICAgICAgICAgICAgICAnLS1zdGFydC1kZWxldGU9IyNXRElGRl9ERUwjIycs
Ci0gICAgICAgICAgICAgICAnLS1lbmQtZGVsZXRlPSMjV0RJRkZfRU5EIyMnLAotICAgICAgICAg
ICAgICAgJy0tc3RhcnQtaW5zZXJ0PSMjV0RJRkZfQUREIyMnLAotICAgICAgICAgICAgICAgJy0t
ZW5kLWluc2VydD0jI1dESUZGX0VORCMjJywKLSAgICAgICAgICAgICAgIGFjdHVhbF9maWxlbmFt
ZSwKLSAgICAgICAgICAgICAgIGV4cGVjdGVkX2ZpbGVuYW1lXQogICAgICAgICBnbG9iYWwgX3dk
aWZmX2F2YWlsYWJsZSAgIyBTZWUgZXhwbGFpbmF0aW9uIGF0IHRvcCBvZiBmaWxlLgotICAgICAg
ICByZXN1bHQgPSAnJworICAgICAgICBpZiBub3QgX3dkaWZmX2F2YWlsYWJsZToKKyAgICAgICAg
ICAgIHJldHVybiAiIgogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBpZiBfd2RpZmZfYXZhaWxh
YmxlOgotICAgICAgICAgICAgICAgIHdkaWZmID0gc2VsZi5fZXhlY3V0aXZlLnJ1bl9jb21tYW5k
KGNtZCwgZGVjb2RlX291dHB1dD1GYWxzZSkKLSAgICAgICAgICAgICAgICB3ZGlmZiA9IGNnaS5l
c2NhcGUod2RpZmYpCi0gICAgICAgICAgICAgICAgd2RpZmYgPSB3ZGlmZi5yZXBsYWNlKCcjI1dE
SUZGX0RFTCMjJywgJzxzcGFuIGNsYXNzPWRlbD4nKQotICAgICAgICAgICAgICAgIHdkaWZmID0g
d2RpZmYucmVwbGFjZSgnIyNXRElGRl9BREQjIycsICc8c3BhbiBjbGFzcz1hZGQ+JykKLSAgICAg
ICAgICAgICAgICB3ZGlmZiA9IHdkaWZmLnJlcGxhY2UoJyMjV0RJRkZfRU5EIyMnLCAnPC9zcGFu
PicpCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gJzxoZWFkPjxzdHlsZT4uZGVsIHsgYmFja2dy
b3VuZDogI2ZhYTsgfSAnCi0gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcuYWRkIHsgYmFja2dy
b3VuZDogI2FmYTsgfTwvc3R5bGU+PC9oZWFkPicKLSAgICAgICAgICAgICAgICByZXN1bHQgKz0g
JzxwcmU+JyArIHdkaWZmICsgJzwvcHJlPicKKyAgICAgICAgICAgIHNlbGYuX3J1bl93ZGlmZihh
Y3R1YWxfZmlsZW5hbWUsIGV4cGVjdGVkX2ZpbGVuYW1lKQogICAgICAgICBleGNlcHQgT1NFcnJv
ciwgZToKLSAgICAgICAgICAgIGlmIChlLmVycm5vID09IGVycm5vLkVOT0VOVCBvciBlLmVycm5v
ID09IGVycm5vLkVBQ0NFUyBvcgotICAgICAgICAgICAgICAgIGUuZXJybm8gPT0gZXJybm8uRUNI
SUxEKToKLSAgICAgICAgICAgICAgICBfd2RpZmZfYXZhaWxhYmxlID0gRmFsc2UKLSAgICAgICAg
ICAgIGVsc2U6CisgICAgICAgICAgICAjIFNpbGVudGx5IGlnbm9yZSBjYXNlcyB3aGVyZSB3ZGlm
ZiBpcyBtaXNzaW5nLgorICAgICAgICAgICAgaWYgZS5lcnJubyBub3QgaW4gW2Vycm5vLkVOT0VO
VCwgZXJybm8uRUFDQ0VTLCBlcnJuby5FQ0hJTERdOgogICAgICAgICAgICAgICAgIHJhaXNlIGUK
LSAgICAgICAgIyBEaWZmcyBhcmUgdHJlYXRlZCBhcyBiaW5hcnkgYXMgdGhleSBtYXkgaW5jbHVk
ZSBtdWx0aXBsZSBmaWxlcwotICAgICAgICAjIHdpdGggY29uZmxpY3RpbmcgZW5jb2RpbmdzLiAg
VGh1cyB3ZSBkbyBub3QgZGVjb2RlIHRoZSBvdXRwdXQgaGVyZS4KLSAgICAgICAgcmV0dXJuIHJl
c3VsdAorICAgICAgICBfd2RpZmZfYXZhaWxhYmxlID0gRmFsc2UKKyAgICAgICAgcmV0dXJuICIi
CiAKICAgICBfcHJldHR5X3BhdGNoX2Vycm9yX2h0bWwgPSAiRmFpbGVkIHRvIHJ1biBQcmV0dHlQ
YXRjaCwgc2VlIGVycm9yIGNvbnNvbGUuIgogCmRpZmYgLS1naXQgYS9XZWJLaXRUb29scy9TY3Jp
cHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Jhc2VfdW5pdHRlc3QucHkgYi9XZWJLaXRU
b29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Jhc2VfdW5pdHRlc3QucHkK
aW5kZXggOGVhOTE2NTI4ODgwMTQ5ZDdmYTYxZmI2Y2JkYzM3N2YxNTZiZjgxMi4uZjM4ODk1NmY3
YzQ0Y2RmOWU4NjVjYmZlZDA5YjIxOWVlNWFhMGRkZSAxMDA2NDQKLS0tIGEvV2ViS2l0VG9vbHMv
U2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9iYXNlX3VuaXR0ZXN0LnB5CisrKyBi
L1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvYmFzZV91bml0
dGVzdC5weQpAQCAtMjgsMTAgKzI4LDcyIEBACiAKIGltcG9ydCBiYXNlCiBpbXBvcnQgdW5pdHRl
c3QKK2ltcG9ydCB0ZW1wZmlsZQogCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZXhlY3V0
aXZlIGltcG9ydCBFeGVjdXRpdmUsIFNjcmlwdEVycm9yCiBmcm9tIHdlYmtpdHB5LnRoaXJkcGFy
dHkubW9jayBpbXBvcnQgTW9jawogCiAKK2NsYXNzIFBvcnRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNl
KToKKworICAgIGRlZiB0ZXN0X2Zvcm1hdF93ZGlmZl9vdXRwdXRfYXNfaHRtbChzZWxmKToKKyAg
ICAgICAgb3V0cHV0ID0gIk9VVFBVVCAlcyAlcyAlcyIgJSAoYmFzZS5Qb3J0Ll9XRElGRl9ERUws
IGJhc2UuUG9ydC5fV0RJRkZfQURELCBiYXNlLlBvcnQuX1dESUZGX0VORCkKKyAgICAgICAgaHRt
bCA9IGJhc2UuUG9ydCgpLl9mb3JtYXRfd2RpZmZfb3V0cHV0X2FzX2h0bWwob3V0cHV0KQorICAg
ICAgICBleHBlY3RlZF9odG1sID0gIjxoZWFkPjxzdHlsZT4uZGVsIHsgYmFja2dyb3VuZDogI2Zh
YTsgfSAuYWRkIHsgYmFja2dyb3VuZDogI2FmYTsgfTwvc3R5bGU+PC9oZWFkPjxwcmU+T1VUUFVU
IDxzcGFuIGNsYXNzPWRlbD4gPHNwYW4gY2xhc3M9YWRkPiA8L3NwYW4+PC9wcmU+IgorICAgICAg
ICBzZWxmLmFzc2VydEVxdWFsKGh0bWwsIGV4cGVjdGVkX2h0bWwpCisKKyAgICBkZWYgdGVzdF93
ZGlmZl9jb21tYW5kKHNlbGYpOgorICAgICAgICBwb3J0ID0gYmFzZS5Qb3J0KCkKKyAgICAgICAg
cG9ydC5fcGF0aF90b193ZGlmZiA9IGxhbWJkYTogIi9wYXRoL3RvL3dkaWZmIgorICAgICAgICBj
b21tYW5kID0gcG9ydC5fd2RpZmZfY29tbWFuZCgiL2FjdHVhbC9wYXRoIiwgIi9leHBlY3RlZC9w
YXRoIikKKyAgICAgICAgZXhwZWN0ZWRfY29tbWFuZCA9IFsKKyAgICAgICAgICAgICIvcGF0aC90
by93ZGlmZiIsCisgICAgICAgICAgICAiLS1zdGFydC1kZWxldGU9IyNXRElGRl9ERUwjIyIsCisg
ICAgICAgICAgICAiLS1lbmQtZGVsZXRlPSMjV0RJRkZfRU5EIyMiLAorICAgICAgICAgICAgIi0t
c3RhcnQtaW5zZXJ0PSMjV0RJRkZfQUREIyMiLAorICAgICAgICAgICAgIi0tZW5kLWluc2VydD0j
I1dESUZGX0VORCMjIiwKKyAgICAgICAgICAgICIvYWN0dWFsL3BhdGgiLAorICAgICAgICAgICAg
Ii9leHBlY3RlZC9wYXRoIiwKKyAgICAgICAgXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNv
bW1hbmQsIGV4cGVjdGVkX2NvbW1hbmQpCisKKyAgICBkZWYgX2ZpbGVfd2l0aF9jb250ZW50cyhz
ZWxmLCBjb250ZW50cywgZW5jb2Rpbmc9InV0Zi04Iik6CisgICAgICAgIG5ld19maWxlID0gdGVt
cGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkKKyAgICAgICAgbmV3X2ZpbGUud3JpdGUoY29udGVu
dHMuZW5jb2RlKGVuY29kaW5nKSkKKyAgICAgICAgbmV3X2ZpbGUuZmx1c2goKQorICAgICAgICBy
ZXR1cm4gbmV3X2ZpbGUKKworICAgIGRlZiB0ZXN0X3J1bl93ZGlmZihzZWxmKToKKyAgICAgICAg
ZXhlY3V0aXZlID0gRXhlY3V0aXZlKCkKKyAgICAgICAgIyBUaGlzIG1heSBmYWlsIG9uIHNvbWUg
c3lzdGVtcy4gIFdlIGNvdWxkIGFzayB0aGUgcG9ydAorICAgICAgICAjIG9iamVjdCBmb3IgdGhl
IHdkaWZmIHBhdGgsIGJ1dCBzaW5jZSB3ZSBkb24ndCBrbm93IHdoYXQKKyAgICAgICAgIyBwb3J0
IG9iamVjdCB0byB1c2UsIHRoaXMgaXMgc3VmZmljaWVudCBmb3Igbm93LgorICAgICAgICB0cnk6
CisgICAgICAgICAgICB3ZGlmZl9wYXRoID0gZXhlY3V0aXZlLnJ1bl9jb21tYW5kKFsid2hpY2gi
LCAid2RpZmYiXSkucnN0cmlwKCkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAg
ICAgICAgIHdkaWZmX3BhdGggPSBOb25lCisKKyAgICAgICAgcG9ydCA9IGJhc2UuUG9ydCgpCisg
ICAgICAgIHBvcnQuX3BhdGhfdG9fd2RpZmYgPSBsYW1iZGE6IHdkaWZmX3BhdGgKKworICAgICAg
ICBpZiB3ZGlmZl9wYXRoOgorICAgICAgICAgICAgIyAid2l0aCB0ZW1wZmlsZS5OYW1lZFRlbXBv
cmFyeUZpbGUoKSBhcyBhY3R1YWwiIGRvZXMgbm90IHNlZW0gdG8gd29yayBpbiBQeXRob24gMi41
CisgICAgICAgICAgICBhY3R1YWwgPSBzZWxmLl9maWxlX3dpdGhfY29udGVudHModSJmb28iKQor
ICAgICAgICAgICAgZXhwZWN0ZWQgPSBzZWxmLl9maWxlX3dpdGhfY29udGVudHModSJiYXIiKQor
ICAgICAgICAgICAgd2RpZmYgPSBwb3J0Ll9ydW5fd2RpZmYoYWN0dWFsLm5hbWUsIGV4cGVjdGVk
Lm5hbWUpCisgICAgICAgICAgICBleHBlY3RlZF93ZGlmZiA9ICI8aGVhZD48c3R5bGU+LmRlbCB7
IGJhY2tncm91bmQ6ICNmYWE7IH0gLmFkZCB7IGJhY2tncm91bmQ6ICNhZmE7IH08L3N0eWxlPjwv
aGVhZD48cHJlPjxzcGFuIGNsYXNzPWRlbD5mb288L3NwYW4+PHNwYW4gY2xhc3M9YWRkPmJhcjwv
c3Bhbj48L3ByZT4iCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdkaWZmLCBleHBlY3Rl
ZF93ZGlmZikKKyAgICAgICAgICAgIGFjdHVhbC5jbG9zZSgpCisgICAgICAgICAgICBleHBlY3Rl
ZC5jbG9zZSgpCisKKyAgICAgICAgICAgICMgQm9ndXMgcGF0aHMgc2hvdWxkIHJhaXNlIGEgc2Ny
aXB0IGVycm9yLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU2NyaXB0RXJyb3IsIHBv
cnQuX3J1bl93ZGlmZiwgIi9kb2VzL25vdC9leGlzdCIsICIvZG9lcy9ub3QvZXhpc3QyIikKKwor
ICAgICAgICAjIElmIHdkaWZmIGRvZXMgbm90IGV4aXN0IF9ydW5fd2RpZmYgc2hvdWxkIHRocm93
IGFuIE9TRXJyb3IuCisgICAgICAgIHBvcnQuX3BhdGhfdG9fd2RpZmYgPSBsYW1iZGE6ICIvaW52
YWxpZC9wYXRoL3RvL3dkaWZmIgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBw
b3J0Ll9ydW5fd2RpZmYsICJmb28iLCAiYmFyIikKKworCiBjbGFzcyBEcml2ZXJUZXN0KHVuaXR0
ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiBfYXNzZXJ0X3dyYXBwZXIoc2VsZiwgd3JhcHBlcl9z
dHJpbmcsIGV4cGVjdGVkX3dyYXBwZXIpOgo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>54537</attachid>
            <date>2010-04-28 01:19:20 -0700</date>
            <delta_ts>2010-04-28 02:21:22 -0700</delta_ts>
            <desc>Fixed missing return and added more unit tests</desc>
            <filename>bug-38246-20100428011919.patch</filename>
            <type>text/plain</type>
            <size>10089</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCA4YzZiOTEzM2FhOWY0ZTdmNjBmMTQyMDVmYzc4ODZhZmRkZDE3Y2I5Li4zMWM0NzZk
YzljMGRlMzA1ODA4ODgwYjVmNTE0NTk5YTc2MjRjZjQ2IDEwMDY0NAotLS0gYS9XZWJLaXRUb29s
cy9DaGFuZ2VMb2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjIgQEAK
KzIwMTAtMDQtMjggIEVyaWMgU2VpZGVsICA8ZXJpY0B3ZWJraXQub3JnPgorCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIHdkaWZmX3RleHQgdGhyb3dzIFNj
cmlwdEVycm9yIGJlY2F1c2Ugd2RpZmYgcmV0dXJucyBub24temVybyB3aGVuIGZpbGVzIGRpZmZl
cgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzgyNDYK
KworICAgICAgICB3ZGlmZiByZXR1cm5zIDAgd2hlbiBmaWxlcyBhcmUgdGhlIHNhbWUsIDEgd2hl
biB0aGV5IGRpZmZlci4KKyAgICAgICAgcnVuX2NvbW1hbmQgYnkgZGVmYXVsdCByYWlzZXMgU2Ny
aXB0RXJyb3IgaWYgdGhlIHJldHVybiBjb2RlIGlzIG5vbi16ZXJvLgorICAgICAgICBGaXhlZCB0
aGlzIGJ5IGFkZGluZyBhIGN1c3RvbSBlcnJvciBoYW5kbGVyIHdoaWNoIG9ubHkgcmFpc2VzIGlm
IHRoZQorICAgICAgICByZXR1cm4gY29kZSBpcyBub3QgMS4KKworICAgICAgICBJIGJyb2tlIHVw
IHRoZSBodWdlIHdkaWZmX3RleHQoKSBtZXRob2QgaW50byBsaXR0bGUgcGllY2VzCisgICAgICAg
IGZvciBlYXNpZXIgdW5pdCB0ZXN0aW5nLiAgVGhlcmUgaXMgb25seSBvbmUgZnVuY3Rpb25hbCBj
aGFuZ2UgaGVyZQorICAgICAgICBhbmQgdGhhdCBpcyB0aGUgYWRkaXRpb24gb2YgdGhlIGN1c3Rv
bSBlcnJvciBoYW5kbGVyLgorCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVz
dHMvcG9ydC9iYXNlLnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3Rz
L3BvcnQvYmFzZV91bml0dGVzdC5weToKKwogMjAxMC0wNC0yNyAgU2hpbmljaGlybyBIYW1hamkg
IDxoYW1hamlAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhcmluIEFkbGVy
IGFuZCBFcmljIFNlaWRlbC4KZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0
cHkvbGF5b3V0X3Rlc3RzL3BvcnQvYmFzZS5weSBiL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0
cHkvbGF5b3V0X3Rlc3RzL3BvcnQvYmFzZS5weQppbmRleCAxY2E0NjVjMzE2YTc4ZDBlNDRhOWUx
MjZhYjFkOWNjZGZhNDBiMDJlLi42ODRkMzY0ZDBmMzczOTQzNGViMGM0N2YyMjMxMTMxOGNlNDBk
YzU3IDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0
cy9wb3J0L2Jhc2UucHkKKysrIGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRf
dGVzdHMvcG9ydC9iYXNlLnB5CkBAIC01MzUsMzkgKzUzNSw2NSBAQCBjbGFzcyBQb3J0KG9iamVj
dCk6CiAgICAgICAgIGV4cGVjdGF0aW9ucywgZGV0ZXJtaW5pbmcgc2VhcmNoIHBhdGhzLCBhbmQg
bG9nZ2luZyBpbmZvcm1hdGlvbi4iIiIKICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJv
cignUG9ydC52ZXJzaW9uJykKIAorICAgIF9XRElGRl9ERUwgPSAnIyNXRElGRl9ERUwjIycKKyAg
ICBfV0RJRkZfQUREID0gJyMjV0RJRkZfQUREIyMnCisgICAgX1dESUZGX0VORCA9ICcjI1dESUZG
X0VORCMjJworCisgICAgZGVmIF9mb3JtYXRfd2RpZmZfb3V0cHV0X2FzX2h0bWwoc2VsZiwgd2Rp
ZmYpOgorICAgICAgICB3ZGlmZiA9IGNnaS5lc2NhcGUod2RpZmYpCisgICAgICAgIHdkaWZmID0g
d2RpZmYucmVwbGFjZShzZWxmLl9XRElGRl9ERUwsICI8c3BhbiBjbGFzcz1kZWw+IikKKyAgICAg
ICAgd2RpZmYgPSB3ZGlmZi5yZXBsYWNlKHNlbGYuX1dESUZGX0FERCwgIjxzcGFuIGNsYXNzPWFk
ZD4iKQorICAgICAgICB3ZGlmZiA9IHdkaWZmLnJlcGxhY2Uoc2VsZi5fV0RJRkZfRU5ELCAiPC9z
cGFuPiIpCisgICAgICAgIGh0bWwgPSAiPGhlYWQ+PHN0eWxlPi5kZWwgeyBiYWNrZ3JvdW5kOiAj
ZmFhOyB9ICIKKyAgICAgICAgaHRtbCArPSAiLmFkZCB7IGJhY2tncm91bmQ6ICNhZmE7IH08L3N0
eWxlPjwvaGVhZD4iCisgICAgICAgIGh0bWwgKz0gIjxwcmU+JXM8L3ByZT4iICUgd2RpZmYKKyAg
ICAgICAgcmV0dXJuIGh0bWwKKworICAgIGRlZiBfd2RpZmZfY29tbWFuZChzZWxmLCBhY3R1YWxf
ZmlsZW5hbWUsIGV4cGVjdGVkX2ZpbGVuYW1lKToKKyAgICAgICAgZXhlY3V0YWJsZSA9IHNlbGYu
X3BhdGhfdG9fd2RpZmYoKQorICAgICAgICByZXR1cm4gW2V4ZWN1dGFibGUsCisgICAgICAgICAg
ICAgICAgIi0tc3RhcnQtZGVsZXRlPSVzIiAlIHNlbGYuX1dESUZGX0RFTCwKKyAgICAgICAgICAg
ICAgICAiLS1lbmQtZGVsZXRlPSVzIiAlIHNlbGYuX1dESUZGX0VORCwKKyAgICAgICAgICAgICAg
ICAiLS1zdGFydC1pbnNlcnQ9JXMiICUgc2VsZi5fV0RJRkZfQURELAorICAgICAgICAgICAgICAg
ICItLWVuZC1pbnNlcnQ9JXMiICUgc2VsZi5fV0RJRkZfRU5ELAorICAgICAgICAgICAgICAgIGFj
dHVhbF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICBleHBlY3RlZF9maWxlbmFtZV0KKworICAg
IEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2hhbmRsZV93ZGlmZl9lcnJvcihzY3JpcHRfZXJyb3Ip
OgorICAgICAgICAjIEV4aXQgMSBtZWFucyB0aGUgZmlsZXMgZGlmZmVyZWQsIGFueSBvdGhlciBl
eGl0IGNvZGUgaXMgYW4gZXJyb3IuCisgICAgICAgIGlmIHNjcmlwdF9lcnJvci5leGl0X2NvZGUg
IT0gMToKKyAgICAgICAgICAgIHJhaXNlIHNjcmlwdF9lcnJvcgorCisgICAgZGVmIF9ydW5fd2Rp
ZmYoc2VsZiwgYWN0dWFsX2ZpbGVuYW1lLCBleHBlY3RlZF9maWxlbmFtZSk6CisgICAgICAgICIi
IlJ1bnMgd2RpZmYgYW5kIG1heSB0aHJvdyBleGNlcHRpb25zLgorICAgICAgICBUaGlzIGlzIG1v
c3RseSBhIGhvb2sgZm9yIHVuaXQgdGVzdGluZy4iIiIKKyAgICAgICAgIyBEaWZmcyBhcmUgdHJl
YXRlZCBhcyBiaW5hcnkgYXMgdGhleSBtYXkgaW5jbHVkZSBtdWx0aXBsZSBmaWxlcworICAgICAg
ICAjIHdpdGggY29uZmxpY3RpbmcgZW5jb2RpbmdzLiAgVGh1cyB3ZSBkbyBub3QgZGVjb2RlIHRo
ZSBvdXRwdXQuCisgICAgICAgIGNvbW1hbmQgPSBzZWxmLl93ZGlmZl9jb21tYW5kKGFjdHVhbF9m
aWxlbmFtZSwgZXhwZWN0ZWRfZmlsZW5hbWUpCisgICAgICAgIHdkaWZmID0gc2VsZi5fZXhlY3V0
aXZlLnJ1bl9jb21tYW5kKGNvbW1hbmQsIGRlY29kZV9vdXRwdXQ9RmFsc2UsCisgICAgICAgICAg
ICBlcnJvcl9oYW5kbGVyPXNlbGYuX2hhbmRsZV93ZGlmZl9lcnJvcikKKyAgICAgICAgcmV0dXJu
IHNlbGYuX2Zvcm1hdF93ZGlmZl9vdXRwdXRfYXNfaHRtbCh3ZGlmZikKKwogICAgIGRlZiB3ZGlm
Zl90ZXh0KHNlbGYsIGFjdHVhbF9maWxlbmFtZSwgZXhwZWN0ZWRfZmlsZW5hbWUpOgogICAgICAg
ICAiIiJSZXR1cm5zIGEgc3RyaW5nIG9mIEhUTUwgaW5kaWNhdGluZyB0aGUgd29yZC1sZXZlbCBk
aWZmIG9mIHRoZQogICAgICAgICBjb250ZW50cyBvZiB0aGUgdHdvIGZpbGVuYW1lcy4gUmV0dXJu
cyBhbiBlbXB0eSBzdHJpbmcgaWYgd29yZC1sZXZlbAogICAgICAgICBkaWZmaW5nIGlzbid0IGF2
YWlsYWJsZS4iIiIKLSAgICAgICAgZXhlY3V0YWJsZSA9IHNlbGYuX3BhdGhfdG9fd2RpZmYoKQot
ICAgICAgICBjbWQgPSBbZXhlY3V0YWJsZSwKLSAgICAgICAgICAgICAgICctLXN0YXJ0LWRlbGV0
ZT0jI1dESUZGX0RFTCMjJywKLSAgICAgICAgICAgICAgICctLWVuZC1kZWxldGU9IyNXRElGRl9F
TkQjIycsCi0gICAgICAgICAgICAgICAnLS1zdGFydC1pbnNlcnQ9IyNXRElGRl9BREQjIycsCi0g
ICAgICAgICAgICAgICAnLS1lbmQtaW5zZXJ0PSMjV0RJRkZfRU5EIyMnLAotICAgICAgICAgICAg
ICAgYWN0dWFsX2ZpbGVuYW1lLAotICAgICAgICAgICAgICAgZXhwZWN0ZWRfZmlsZW5hbWVdCiAg
ICAgICAgIGdsb2JhbCBfd2RpZmZfYXZhaWxhYmxlICAjIFNlZSBleHBsYWluYXRpb24gYXQgdG9w
IG9mIGZpbGUuCi0gICAgICAgIHJlc3VsdCA9ICcnCisgICAgICAgIGlmIG5vdCBfd2RpZmZfYXZh
aWxhYmxlOgorICAgICAgICAgICAgcmV0dXJuICIiCiAgICAgICAgIHRyeToKLSAgICAgICAgICAg
IGlmIF93ZGlmZl9hdmFpbGFibGU6Ci0gICAgICAgICAgICAgICAgd2RpZmYgPSBzZWxmLl9leGVj
dXRpdmUucnVuX2NvbW1hbmQoY21kLCBkZWNvZGVfb3V0cHV0PUZhbHNlKQotICAgICAgICAgICAg
ICAgIHdkaWZmID0gY2dpLmVzY2FwZSh3ZGlmZikKLSAgICAgICAgICAgICAgICB3ZGlmZiA9IHdk
aWZmLnJlcGxhY2UoJyMjV0RJRkZfREVMIyMnLCAnPHNwYW4gY2xhc3M9ZGVsPicpCi0gICAgICAg
ICAgICAgICAgd2RpZmYgPSB3ZGlmZi5yZXBsYWNlKCcjI1dESUZGX0FERCMjJywgJzxzcGFuIGNs
YXNzPWFkZD4nKQotICAgICAgICAgICAgICAgIHdkaWZmID0gd2RpZmYucmVwbGFjZSgnIyNXRElG
Rl9FTkQjIycsICc8L3NwYW4+JykKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAnPGhlYWQ+PHN0
eWxlPi5kZWwgeyBiYWNrZ3JvdW5kOiAjZmFhOyB9ICcKLSAgICAgICAgICAgICAgICByZXN1bHQg
Kz0gJy5hZGQgeyBiYWNrZ3JvdW5kOiAjYWZhOyB9PC9zdHlsZT48L2hlYWQ+JwotICAgICAgICAg
ICAgICAgIHJlc3VsdCArPSAnPHByZT4nICsgd2RpZmYgKyAnPC9wcmU+JworICAgICAgICAgICAg
cmV0dXJuIHNlbGYuX3J1bl93ZGlmZihhY3R1YWxfZmlsZW5hbWUsIGV4cGVjdGVkX2ZpbGVuYW1l
KQogICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKLSAgICAgICAgICAgIGlmIChlLmVycm5vID09
IGVycm5vLkVOT0VOVCBvciBlLmVycm5vID09IGVycm5vLkVBQ0NFUyBvcgotICAgICAgICAgICAg
ICAgIGUuZXJybm8gPT0gZXJybm8uRUNISUxEKToKKyAgICAgICAgICAgIGlmIGUuZXJybm8gaW4g
W2Vycm5vLkVOT0VOVCwgZXJybm8uRUFDQ0VTLCBlcnJuby5FQ0hJTERdOgorICAgICAgICAgICAg
ICAgICMgU2lsZW50bHkgaWdub3JlIGNhc2VzIHdoZXJlIHdkaWZmIGlzIG1pc3NpbmcuCiAgICAg
ICAgICAgICAgICAgX3dkaWZmX2F2YWlsYWJsZSA9IEZhbHNlCi0gICAgICAgICAgICBlbHNlOgot
ICAgICAgICAgICAgICAgIHJhaXNlIGUKLSAgICAgICAgIyBEaWZmcyBhcmUgdHJlYXRlZCBhcyBi
aW5hcnkgYXMgdGhleSBtYXkgaW5jbHVkZSBtdWx0aXBsZSBmaWxlcwotICAgICAgICAjIHdpdGgg
Y29uZmxpY3RpbmcgZW5jb2RpbmdzLiAgVGh1cyB3ZSBkbyBub3QgZGVjb2RlIHRoZSBvdXRwdXQg
aGVyZS4KLSAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICAgICAgICAgIHJldHVybiAiIgor
ICAgICAgICAgICAgcmFpc2UgZQorICAgICAgICBleGNlcHQgU2NyaXB0RXJyb3IsIGU6CisgICAg
ICAgICAgICAjIEl0J3MgcG9zc2libGUgdG8gZ2V0IGEgU2NyaXB0RXJyb3Igd2UgcGFzcyB3ZGlm
ZiBpbnZhbGlkIHBhdGhzLgorICAgICAgICAgICAgcmFpc2UgZQorICAgICAgICBhc3NlcnQoRmFs
c2UpICAjIFNob3VsZCBuZXZlciBiZSByZWFjaGVkLgogCiAgICAgX3ByZXR0eV9wYXRjaF9lcnJv
cl9odG1sID0gIkZhaWxlZCB0byBydW4gUHJldHR5UGF0Y2gsIHNlZSBlcnJvciBjb25zb2xlLiIK
IApkaWZmIC0tZ2l0IGEvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMv
cG9ydC9iYXNlX3VuaXR0ZXN0LnB5IGIvV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlv
dXRfdGVzdHMvcG9ydC9iYXNlX3VuaXR0ZXN0LnB5CmluZGV4IDhlYTkxNjUyODg4MDE0OWQ3ZmE2
MWZiNmNiZGMzNzdmMTU2YmY4MTIuLmY4MjEzNTM3NGY0MzkwZGM1MjhmYjQzNTZkNzhmYWZmMjFm
NGNhMGEgMTAwNjQ0Ci0tLSBhL1dlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rl
c3RzL3BvcnQvYmFzZV91bml0dGVzdC5weQorKysgYi9XZWJLaXRUb29scy9TY3JpcHRzL3dlYmtp
dHB5L2xheW91dF90ZXN0cy9wb3J0L2Jhc2VfdW5pdHRlc3QucHkKQEAgLTI4LDEwICsyOCw4OCBA
QAogCiBpbXBvcnQgYmFzZQogaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgdGVtcGZpbGUKIAorZnJv
bSB3ZWJraXRweS5jb21tb24uc3lzdGVtLmV4ZWN1dGl2ZSBpbXBvcnQgRXhlY3V0aXZlLCBTY3Jp
cHRFcnJvcgogZnJvbSB3ZWJraXRweS50aGlyZHBhcnR5Lm1vY2sgaW1wb3J0IE1vY2sKIAogCitj
bGFzcyBQb3J0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9mb3JtYXRf
d2RpZmZfb3V0cHV0X2FzX2h0bWwoc2VsZik6CisgICAgICAgIG91dHB1dCA9ICJPVVRQVVQgJXMg
JXMgJXMiICUgKGJhc2UuUG9ydC5fV0RJRkZfREVMLCBiYXNlLlBvcnQuX1dESUZGX0FERCwgYmFz
ZS5Qb3J0Ll9XRElGRl9FTkQpCisgICAgICAgIGh0bWwgPSBiYXNlLlBvcnQoKS5fZm9ybWF0X3dk
aWZmX291dHB1dF9hc19odG1sKG91dHB1dCkKKyAgICAgICAgZXhwZWN0ZWRfaHRtbCA9ICI8aGVh
ZD48c3R5bGU+LmRlbCB7IGJhY2tncm91bmQ6ICNmYWE7IH0gLmFkZCB7IGJhY2tncm91bmQ6ICNh
ZmE7IH08L3N0eWxlPjwvaGVhZD48cHJlPk9VVFBVVCA8c3BhbiBjbGFzcz1kZWw+IDxzcGFuIGNs
YXNzPWFkZD4gPC9zcGFuPjwvcHJlPiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChodG1sLCBl
eHBlY3RlZF9odG1sKQorCisgICAgZGVmIHRlc3Rfd2RpZmZfY29tbWFuZChzZWxmKToKKyAgICAg
ICAgcG9ydCA9IGJhc2UuUG9ydCgpCisgICAgICAgIHBvcnQuX3BhdGhfdG9fd2RpZmYgPSBsYW1i
ZGE6ICIvcGF0aC90by93ZGlmZiIKKyAgICAgICAgY29tbWFuZCA9IHBvcnQuX3dkaWZmX2NvbW1h
bmQoIi9hY3R1YWwvcGF0aCIsICIvZXhwZWN0ZWQvcGF0aCIpCisgICAgICAgIGV4cGVjdGVkX2Nv
bW1hbmQgPSBbCisgICAgICAgICAgICAiL3BhdGgvdG8vd2RpZmYiLAorICAgICAgICAgICAgIi0t
c3RhcnQtZGVsZXRlPSMjV0RJRkZfREVMIyMiLAorICAgICAgICAgICAgIi0tZW5kLWRlbGV0ZT0j
I1dESUZGX0VORCMjIiwKKyAgICAgICAgICAgICItLXN0YXJ0LWluc2VydD0jI1dESUZGX0FERCMj
IiwKKyAgICAgICAgICAgICItLWVuZC1pbnNlcnQ9IyNXRElGRl9FTkQjIyIsCisgICAgICAgICAg
ICAiL2FjdHVhbC9wYXRoIiwKKyAgICAgICAgICAgICIvZXhwZWN0ZWQvcGF0aCIsCisgICAgICAg
IF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21tYW5kLCBleHBlY3RlZF9jb21tYW5kKQor
CisgICAgZGVmIF9maWxlX3dpdGhfY29udGVudHMoc2VsZiwgY29udGVudHMsIGVuY29kaW5nPSJ1
dGYtOCIpOgorICAgICAgICBuZXdfZmlsZSA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgp
CisgICAgICAgIG5ld19maWxlLndyaXRlKGNvbnRlbnRzLmVuY29kZShlbmNvZGluZykpCisgICAg
ICAgIG5ld19maWxlLmZsdXNoKCkKKyAgICAgICAgcmV0dXJuIG5ld19maWxlCisKKyAgICBkZWYg
dGVzdF9ydW5fd2RpZmYoc2VsZik6CisgICAgICAgIGV4ZWN1dGl2ZSA9IEV4ZWN1dGl2ZSgpCisg
ICAgICAgICMgVGhpcyBtYXkgZmFpbCBvbiBzb21lIHN5c3RlbXMuICBXZSBjb3VsZCBhc2sgdGhl
IHBvcnQKKyAgICAgICAgIyBvYmplY3QgZm9yIHRoZSB3ZGlmZiBwYXRoLCBidXQgc2luY2Ugd2Ug
ZG9uJ3Qga25vdyB3aGF0CisgICAgICAgICMgcG9ydCBvYmplY3QgdG8gdXNlLCB0aGlzIGlzIHN1
ZmZpY2llbnQgZm9yIG5vdy4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2RpZmZfcGF0aCA9
IGV4ZWN1dGl2ZS5ydW5fY29tbWFuZChbIndoaWNoIiwgIndkaWZmIl0pLnJzdHJpcCgpCisgICAg
ICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgICAgICAgICB3ZGlmZl9wYXRoID0gTm9uZQor
CisgICAgICAgIHBvcnQgPSBiYXNlLlBvcnQoKQorICAgICAgICBwb3J0Ll9wYXRoX3RvX3dkaWZm
ID0gbGFtYmRhOiB3ZGlmZl9wYXRoCisKKyAgICAgICAgaWYgd2RpZmZfcGF0aDoKKyAgICAgICAg
ICAgICMgIndpdGggdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkgYXMgYWN0dWFsIiBkb2Vz
IG5vdCBzZWVtIHRvIHdvcmsgaW4gUHl0aG9uIDIuNQorICAgICAgICAgICAgYWN0dWFsID0gc2Vs
Zi5fZmlsZV93aXRoX2NvbnRlbnRzKHUiZm9vIikKKyAgICAgICAgICAgIGV4cGVjdGVkID0gc2Vs
Zi5fZmlsZV93aXRoX2NvbnRlbnRzKHUiYmFyIikKKyAgICAgICAgICAgIHdkaWZmID0gcG9ydC5f
cnVuX3dkaWZmKGFjdHVhbC5uYW1lLCBleHBlY3RlZC5uYW1lKQorICAgICAgICAgICAgZXhwZWN0
ZWRfd2RpZmYgPSAiPGhlYWQ+PHN0eWxlPi5kZWwgeyBiYWNrZ3JvdW5kOiAjZmFhOyB9IC5hZGQg
eyBiYWNrZ3JvdW5kOiAjYWZhOyB9PC9zdHlsZT48L2hlYWQ+PHByZT48c3BhbiBjbGFzcz1kZWw+
Zm9vPC9zcGFuPjxzcGFuIGNsYXNzPWFkZD5iYXI8L3NwYW4+PC9wcmU+IgorICAgICAgICAgICAg
c2VsZi5hc3NlcnRFcXVhbCh3ZGlmZiwgZXhwZWN0ZWRfd2RpZmYpCisgICAgICAgICAgICAjIFJ1
bm5pbmcgdGhlIGZ1bGwgd2RpZmZfdGV4dCBtZXRob2Qgc2hvdWxkIGdpdmUgdGhlIHNhbWUgcmVz
dWx0LgorICAgICAgICAgICAgYmFzZS5fd2RpZmZfYXZhaWxhYmxlID0gVHJ1ZSAgIyBJbiBjYXNl
IGl0J3Mgc29tZWhvdyBhbHJlYWR5IGRpc2FibGVkLgorICAgICAgICAgICAgd2RpZmYgPSBwb3J0
LndkaWZmX3RleHQoYWN0dWFsLm5hbWUsIGV4cGVjdGVkLm5hbWUpCisgICAgICAgICAgICBzZWxm
LmFzc2VydEVxdWFsKHdkaWZmLCBleHBlY3RlZF93ZGlmZikKKyAgICAgICAgICAgICMgd2RpZmYg
c2hvdWxkIHN0aWxsIGJlIGF2YWlsYWJsZSBhZnRlciBydW5uaW5nIHdkaWZmX3RleHQgd2l0aCBh
IHZhbGlkIGRpZmYuCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYmFzZS5fd2RpZmZfYXZh
aWxhYmxlKQorICAgICAgICAgICAgYWN0dWFsLmNsb3NlKCkKKyAgICAgICAgICAgIGV4cGVjdGVk
LmNsb3NlKCkKKworICAgICAgICAgICAgIyBCb2d1cyBwYXRocyBzaG91bGQgcmFpc2UgYSBzY3Jp
cHQgZXJyb3IuCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTY3JpcHRFcnJvciwgcG9y
dC5fcnVuX3dkaWZmLCAiL2RvZXMvbm90L2V4aXN0IiwgIi9kb2VzL25vdC9leGlzdDIiKQorICAg
ICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU2NyaXB0RXJyb3IsIHBvcnQud2RpZmZfdGV4dCwg
Ii9kb2VzL25vdC9leGlzdCIsICIvZG9lcy9ub3QvZXhpc3QyIikKKyAgICAgICAgICAgICMgd2Rp
ZmYgd2lsbCBzdGlsbCBiZSBhdmFpbGFibGUgYWZ0ZXIgcnVubmluZyB3ZGlmZl90ZXh0IHdpdGgg
aW52YWxpZCBwYXRocy4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYXNlLl93ZGlmZl9h
dmFpbGFibGUpCisgICAgICAgICAgICBiYXNlLl93ZGlmZl9hdmFpbGFibGUgPSBUcnVlCisKKyAg
ICAgICAgIyBJZiB3ZGlmZiBkb2VzIG5vdCBleGlzdCBfcnVuX3dkaWZmIHNob3VsZCB0aHJvdyBh
biBPU0Vycm9yLgorICAgICAgICBwb3J0Ll9wYXRoX3RvX3dkaWZmID0gbGFtYmRhOiAiL2ludmFs
aWQvcGF0aC90by93ZGlmZiIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgcG9y
dC5fcnVuX3dkaWZmLCAiZm9vIiwgImJhciIpCisKKyAgICAgICAgIyB3ZGlmZl90ZXh0IHNob3Vs
ZCBub3QgdGhyb3cgYW4gZXJyb3IgaWYgd2RpZmYgZG9lcyBub3QgZXhpc3QuCisgICAgICAgIHNl
bGYuYXNzZXJ0RXF1YWwocG9ydC53ZGlmZl90ZXh0KCJmb28iLCAiYmFyIiksICIiKQorICAgICAg
ICAjIEhvd2V2ZXIgd2RpZmYgc2hvdWxkIG5vdCBiZSBhdmFpbGFibGUgYWZ0ZXIgcnVubmluZyB3
ZGlmZl90ZXh0IGlmIHdkaWZmIGlzIG1pc3NpbmcuCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uo
YmFzZS5fd2RpZmZfYXZhaWxhYmxlKQorICAgICAgICBiYXNlLl93ZGlmZl9hdmFpbGFibGUgPSBU
cnVlCisKKwogY2xhc3MgRHJpdmVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYg
X2Fzc2VydF93cmFwcGVyKHNlbGYsIHdyYXBwZXJfc3RyaW5nLCBleHBlY3RlZF93cmFwcGVyKToK
</data>
<flag name="review"
          id="38544"
          type_id="1"
          status="+"
          setter="hamaji"
    />
    <flag name="commit-queue"
          id="38545"
          type_id="3"
          status="+"
          setter="jorlow"
    />
          </attachment>
      

    </bug>

</bugzilla>