<?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>68991</bug_id>
          
          <creation_ts>2011-09-28 03:33:24 -0700</creation_ts>
          <short_desc>watchlist: Add a way to load the watchlist from config.</short_desc>
          <delta_ts>2011-09-28 15:00:45 -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>Tools / Tests</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>68822</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="David Levin">levin</reporter>
          <assigned_to name="David Levin">levin</assigned_to>
          <cc>abarth</cc>
    
    <cc>eric</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>474641</commentid>
    <comment_count>0</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2011-09-28 03:33:24 -0700</bug_when>
    <thetext>See summary.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>474644</commentid>
    <comment_count>1</comment_count>
      <attachid>108996</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2011-09-28 03:37:08 -0700</bug_when>
    <thetext>Created attachment 108996
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>474791</commentid>
    <comment_count>2</comment_count>
      <attachid>108996</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-09-28 09:53:42 -0700</bug_when>
    <thetext>Comment on attachment 108996
Patch

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

&gt; Tools/Scripts/webkitpy/common/watchlist/watchlistloader.py:31
&gt; +from webkitpy.common.watchlist.watchlistparser import WatchListParser

We usually put a blank line between the system imports and the webkitpy imports.

&gt; Tools/Scripts/webkitpy/common/watchlist/watchlistloader.py:39
&gt; +    def _attempt_file_load(self, path, watchlist_filename):
&gt; +        try:
&gt; +            return open(os.path.join(path, watchlist_filename), &apos;r&apos;).read()
&gt; +        except:
&gt; +            return None

Rather than talking directly to the file system, we use the filesystem abstraction.  That lets us test this sort of code without talking to the real filesystem via dependency injection.  This class should take a filesystem object as a parameter, which we&apos;ll eventually get from the tool (aka host) object given to the command.

&gt; Tools/Scripts/webkitpy/common/watchlist/watchlistloader_unittest.py:37
&gt; +def _return_none(*args):
&gt; +    return None

You can write this inline using  lambda.

&gt; Tools/Scripts/webkitpy/common/watchlist/watchlistloader_unittest.py:46
&gt; +    def _verifyException(self, regex_message, callable, *args):

Rather than copy/pasting this code, can we create a subclass of unittest.TestCase that adds this functionality and then derive our test classes from it?

&gt; Tools/Scripts/webkitpy/common/watchlist/watchlistloader_unittest.py:58
&gt; +    def test_watch_list_not_found(self):
&gt; +        loader = WatchListLoader()
&gt; +        loader._attempt_file_load = _return_none
&gt; +        self.assertRaisesRegexp(r&apos;Watch list file \(webkitpy/common/config/watchlist\) not found in the python search path\.&apos;,
&gt; +                                loader.load)

Here you&apos;ll want to use a MockFilesystem, which you can populate with test data.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>474888</commentid>
    <comment_count>3</comment_count>
      <attachid>109049</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2011-09-28 12:06:17 -0700</bug_when>
    <thetext>Created attachment 109049
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>474894</commentid>
    <comment_count>4</comment_count>
      <attachid>109051</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2011-09-28 12:10:58 -0700</bug_when>
    <thetext>Created attachment 109051
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>474895</commentid>
    <comment_count>5</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2011-09-28 12:11:31 -0700</bug_when>
    <thetext>All fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>474932</commentid>
    <comment_count>6</comment_count>
      <attachid>109051</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-09-28 12:58:46 -0700</bug_when>
    <thetext>Comment on attachment 109051
Patch

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

&gt; Tools/Scripts/webkitpy/common/watchlist/watchlistloader.py:30
&gt; +import os
&gt; +import sys

You should rarely, if ever need eithe rof these.  FielSystem, Executive and User modules should provide this all in a cross-platform, mockable way.

&gt; Tools/Scripts/webkitpy/common/watchlist/watchlistloader.py:40
&gt; +        current_filename = os.path.join(path, watchlist_filename)

self._filesystem.join

&gt; Tools/Scripts/webkitpy/common/watchlist/watchlistloader.py:42
&gt; +            return self._filesystem.read_text_file(current_filename)

You could also pair this with an exists() instead, if you&apos;re just tryign to catch the &quot;does not exist&quot; case.

&gt; Tools/Scripts/webkitpy/common/watchlist/watchlistloader.py:47
&gt; +        watchlist_filename = os.path.join(&apos;webkitpy&apos;, &apos;common&apos;, &apos;config&apos;, &apos;watchlist&apos;)

You&apos;re assuming we&apos;re being run from Scripts... which isn&apos;t always true.  You probably want to use filesystem.path_to_module(self)

&gt; Tools/Scripts/webkitpy/common/watchlist/watchlistloader.py:48
&gt; +        for path in sys.path:

I see.  We don&apos;t have this abstracted anywhere, so you have to use sys for sys.path.  But I&apos;m confused why you&apos;d look in sys.path?  That&apos;s the python lookup path for modules?

&gt; Tools/Scripts/webkitpy/common/watchlist/watchlistloader.py:51
&gt; +            contents = self._attempt_file_load(path, watchlist_filename)
&gt; +            if contents is not None:
&gt; +                return contents

Seems you just want to pair exists with the read here, and remove _attempt_file_load.

&gt; Tools/Scripts/webkitpy/common/watchlist/watchlistloader_unittest.py:40
&gt; +        loader = WatchListLoader(filesystem_mock.MockFileSystem())
&gt; +        self.assertRaisesRegexp(r&apos;Watch list file \(webkitpy/common/config/watchlist\) not found in the python search path\.&apos;,

You can test that it&apos;s not found, and then test what happens when it is found, both with a MockFileSystem.

&gt; Tools/Scripts/webkitpy/common/watchlist/watchlistloader_unittest.py:45
&gt; +        WatchListLoader(filesystem.FileSystem()).load()

It&apos;s rare that you want to use a real filesystem in a unittest.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>474940</commentid>
    <comment_count>7</comment_count>
      <attachid>109051</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-09-28 13:03:13 -0700</bug_when>
    <thetext>Comment on attachment 109051
Patch

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

This is looking good.  Let do one more iteration.

&gt; Tools/Scripts/webkitpy/common/watchlist/watchlistloader.py:40
&gt; +        current_filename = os.path.join(path, watchlist_filename)

self._filesystem.join &lt;-- makes unit testing easier on Mac and Windows.

&gt; Tools/Scripts/webkitpy/common/watchlist/watchlistloader.py:47
&gt; +        watchlist_filename = os.path.join(&apos;webkitpy&apos;, &apos;common&apos;, &apos;config&apos;, &apos;watchlist&apos;)

Does this assume something about the current working directory?

You probably want something relative to the current source directory, which is something the Checkout class knows about.  Another alternative is to find the file relative to the currently executing python.  These are different, for example, if you run the webkit-patch script from one webkit checkout while the current working directory is in another.

I&apos;d expect this to work like commiters.py, which is to say relative to the executing python (as if loaded as a module).  You can use:

self._filesystem.path_to_module(WatchListLoader)

Going through self._filesystem makes this easy to mock during testing.

&gt; Tools/Scripts/webkitpy/common/watchlist/watchlistloader.py:52
&gt; +        raise Exception(&apos;Watch list file (%s) not found in the python search path.&apos; % watchlist_filename)

I&apos;m not sure &quot;python search path&quot; is what you mean here.  Why not just say that a given path was not found?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>474941</commentid>
    <comment_count>8</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-09-28 13:04:16 -0700</bug_when>
    <thetext>I enjoy that Eric said the same things I did, plus he caught a bunch more.  :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>474947</commentid>
    <comment_count>9</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2011-09-28 13:08:55 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; (From update of attachment 109051 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=109051&amp;action=review
&gt; &gt; Tools/Scripts/webkitpy/common/watchlist/watchlistloader_unittest.py:45
&gt; &gt; +        WatchListLoader(filesystem.FileSystem()).load()
&gt; 
&gt; It&apos;s rare that you want to use a real filesystem in a unittest.

I wanted to load the actual checked in watchlist to verify that there are no mistakes in it.

Because it is bad news, if there are. The watchlist bot will completely break.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>474980</commentid>
    <comment_count>10</comment_count>
      <attachid>109067</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2011-09-28 13:46:09 -0700</bug_when>
    <thetext>Created attachment 109067
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>474983</commentid>
    <comment_count>11</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2011-09-28 13:47:39 -0700</bug_when>
    <thetext>I fixed everything except I still access the real filesystem to load the checked in watchlist as a test.

I not only want to verify that I can actually load it but I want the integrity checks that will happen as a part of that load, so that any mistakes made in that file are caught quickly (by the bots running python tests if nothing else).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>475025</commentid>
    <comment_count>12</comment_count>
      <attachid>109067</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-09-28 14:38:14 -0700</bug_when>
    <thetext>Comment on attachment 109067
Patch

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

Seems OK.  Please look at the nits I posted.

&gt; Tools/Scripts/webkitpy/common/watchlist/watchlistloader.py:36
&gt; +    def _get_watch_list_contents(self):

We don&apos;t normally use _get_ in WebKit method names.  You could use _read_watch_list_contents.  Except I still don&apos;t think you want this method.  You don&apos;t need it for unittesting anymore, now that you&apos;re using Filesystem.

&gt; Tools/Scripts/webkitpy/common/watchlist/watchlistloader.py:42
&gt; +        except:
&gt; +            raise Exception(&apos;Watch list file (%s) not found.&apos; % watch_list_full_path)

This isn&apos;t true.  You&apos;re converting any exception into a &quot;not found&quot; custom exception.  I think you should instead remove the exception handling and guard your read in self._filesystem.exists() instead, returning None if it doesn&apos;t exist.  Then if there si some real read problem you&apos;ll see that as a real exception, instead of mutated to your custom one.

&gt; Tools/Scripts/webkitpy/common/watchlist/watchlistloader_unittest.py:41
&gt; +        self.assertRaisesRegexp(r&apos;Watch list file \(.*/watchlist\) not found\.&apos;,
&gt; +                                loader.load)

We don&apos;t match PEP8 wrapping.  You&apos;re welcome to wrap wherever you feel is most readable.

&gt; Tools/Scripts/webkitpy/common/watchlist/watchlistloader_unittest.py:45
&gt; +    def test_watch_list_load(self):
&gt; +        # Just verifying that loading the checked in watch list works.
&gt; +        WatchListLoader(filesystem.FileSystem()).load()

Ok, so it wasn&apos;t immediately clear to me.  This is a parsing test for the checked-in watch list.

&gt; Tools/Scripts/webkitpy/common/webkitunittest.py:41
&gt; +    def _verifyException(self, regex_message, callable, *args):

I might name this _assertRaisesRegexp. :)  I guess one might worry that could conflict with some other TestCase method...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>475028</commentid>
    <comment_count>13</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2011-09-28 14:41:25 -0700</bug_when>
    <thetext>(In reply to comment #12)
&gt; (From update of attachment 109067 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=109067&amp;action=review
&gt; 
&gt; Seems OK.  Please look at the nits I posted.
&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/watchlist/watchlistloader.py:36
&gt; &gt; +    def _get_watch_list_contents(self):
&gt; 
&gt; We don&apos;t normally use _get_ in WebKit method names.  You could use _read_watch_list_contents.  Except I still don&apos;t think you want this method.  You don&apos;t need it for unittesting anymore, now that you&apos;re using Filesystem.

I&apos;ll get rid of it :)

&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/watchlist/watchlistloader.py:42
&gt; &gt; +        except:
&gt; &gt; +            raise Exception(&apos;Watch list file (%s) not found.&apos; % watch_list_full_path)
&gt; 
&gt; This isn&apos;t true.  You&apos;re converting any exception into a &quot;not found&quot; custom exception.  I think you should instead remove the exception handling and guard your read in self._filesystem.exists() instead, returning None if it doesn&apos;t exist.  Then if there si some real read problem you&apos;ll see that as a real exception, instead of mutated to your custom one.

You said this before and I messed up on the follow through. Thanks for pointing it out again.


I&apos;ll address everything you said and check in.

Thanks again!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>475035</commentid>
    <comment_count>14</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2011-09-28 15:00:45 -0700</bug_when>
    <thetext>Committed as http://trac.webkit.org/changeset/96263</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>108996</attachid>
            <date>2011-09-28 03:37:08 -0700</date>
            <delta_ts>2011-09-28 12:06:13 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-68991-20110928033706.patch</filename>
            <type>text/plain</type>
            <size>7386</size>
            <attacher name="David Levin">levin</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTYxNzAKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBi
L1Rvb2xzL0NoYW5nZUxvZwppbmRleCA4MmE1ZTI5MmU1MWQ1ZDQ1OTg2NWJhOTY1Njg0OWVjOTk4
YzIwY2FlLi43ODQwMTFmYmUwZGVjYzFkNjEwMjE3ZDVhYmQ5YjViZjcyOGI1NzliIDEwMDY0NAot
LS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTcg
QEAKKzIwMTEtMDktMjggIERhdmlkIExldmluICA8bGV2aW5AY2hyb21pdW0ub3JnPgorCisgICAg
ICAgIHdhdGNobGlzdDogQWRkIGEgd2F5IHRvIGxvYWQgdGhlIHdhdGNobGlzdCBmcm9tIGNvbmZp
Zy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTY4OTkx
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBTY3Jp
cHRzL3dlYmtpdHB5L2NvbW1vbi9jb25maWcvd2F0Y2hsaXN0OiBBZGRlZC4KKyAgICAgICAgQSBz
aW1wbGUgd2F0Y2hsaXN0IHRoYXQgc2ltcGx5IGFkZHMgbXkgZW1haWwgdG8gd2F0Y2hsaXN0IHNj
cmlwdCBjaGFuZ2VzLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL3dhdGNobGlz
dC93YXRjaGxpc3Rsb2FkZXIucHk6IEFkZGVkLgorICAgICAgICBTdXBwb3J0IGZvciBsb2FkaW5n
IHRoZSB3YXRjaCBsaXN0LgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL3dhdGNo
bGlzdC93YXRjaGxpc3Rsb2FkZXJfdW5pdHRlc3QucHk6IEFkZGVkLgorICAgICAgICBUZXN0cyBm
b3IgdGhlIGxvYWRpbmcuCisKIDIwMTEtMDktMjcgIERhdmlkIExldmluICA8bGV2aW5AY2hyb21p
dW0ub3JnPgogCiAgICAgICAgIHdhdGNobGlzdDogQWRkIHN1cHBvcnQgZm9yIG1hdGNoaW5nIGFk
ZGVkIG9yIGRlbGV0ZWQgbGluZXMuCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5
L2NvbW1vbi9jb25maWcvd2F0Y2hsaXN0IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24v
Y29uZmlnL3dhdGNobGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi41MDNlMDgxZjY5NjgyNjM3YzUwOGExMjRkNzhl
NDQ0NTZiZGJiYzQzCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9j
b21tb24vY29uZmlnL3dhdGNobGlzdApAQCAtMCwwICsxLDEwIEBACit7CisgICAgIkRFRklOSVRJ
T05TIjogeworICAgICAgICAiV2F0Y2hMaXN0U2NyaXB0IjogeworICAgICAgICAgICAgImZpbGVu
YW1lIjogKHIiVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vd2F0Y2hsaXN0Ly4qIiksCisg
ICAgICAgIH0sCisgICAgfSwKKyAgICAiQ0NfUlVMRVMiOiB7CisgICAgICAgICJXYXRjaExpc3RT
Y3JpcHQiOiBbICJsZXZpbit3YXRjaGxpc3RAY2hyb21pdW0ub3JnIiwgXSwKKyAgICB9LAorfQpk
aWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vd2F0Y2hsaXN0L3dhdGNo
bGlzdGxvYWRlci5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3dhdGNobGlzdC93
YXRjaGxpc3Rsb2FkZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYThkYzM2MTRkZGJiMjY2YzNlMzA2YWZjYmFi
MWEwOTViMGQwMjU4NQotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkv
Y29tbW9uL3dhdGNobGlzdC93YXRjaGxpc3Rsb2FkZXIucHkKQEAgLTAsMCArMSw1MCBAQAorIyBD
b3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMg
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
U1VDSCBEQU1BR0UuCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworZnJvbSB3ZWJraXRweS5jb21t
b24ud2F0Y2hsaXN0LndhdGNobGlzdHBhcnNlciBpbXBvcnQgV2F0Y2hMaXN0UGFyc2VyCisKKwor
Y2xhc3MgV2F0Y2hMaXN0TG9hZGVyKG9iamVjdCk6CisgICAgZGVmIF9hdHRlbXB0X2ZpbGVfbG9h
ZChzZWxmLCBwYXRoLCB3YXRjaGxpc3RfZmlsZW5hbWUpOgorICAgICAgICB0cnk6CisgICAgICAg
ICAgICByZXR1cm4gb3Blbihvcy5wYXRoLmpvaW4ocGF0aCwgd2F0Y2hsaXN0X2ZpbGVuYW1lKSwg
J3InKS5yZWFkKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKwor
ICAgIGRlZiBfZ2V0X3dhdGNoX2xpc3RfY29udGVudHMoc2VsZik6CisgICAgICAgIHdhdGNobGlz
dF9maWxlbmFtZSA9IG9zLnBhdGguam9pbignd2Via2l0cHknLCAnY29tbW9uJywgJ2NvbmZpZycs
ICd3YXRjaGxpc3QnKQorICAgICAgICBmb3IgcGF0aCBpbiBzeXMucGF0aDoKKyAgICAgICAgICAg
IGNvbnRlbnRzID0gc2VsZi5fYXR0ZW1wdF9maWxlX2xvYWQocGF0aCwgd2F0Y2hsaXN0X2ZpbGVu
YW1lKQorICAgICAgICAgICAgaWYgY29udGVudHMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAg
ICAgcmV0dXJuIGNvbnRlbnRzCisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignV2F0Y2ggbGlzdCBm
aWxlICglcykgbm90IGZvdW5kIGluIHRoZSBweXRob24gc2VhcmNoIHBhdGguJyAlIHdhdGNobGlz
dF9maWxlbmFtZSkKKworICAgIGRlZiBsb2FkKHNlbGYpOgorICAgICAgICByZXR1cm4gV2F0Y2hM
aXN0UGFyc2VyKCkucGFyc2Uoc2VsZi5fZ2V0X3dhdGNoX2xpc3RfY29udGVudHMoKSkKZGlmZiAt
LWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3dhdGNobGlzdC93YXRjaGxpc3Rs
b2FkZXJfdW5pdHRlc3QucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi93YXRjaGxp
c3Qvd2F0Y2hsaXN0bG9hZGVyX3VuaXR0ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjlmZjgxNWVkM2E4ZTk2
MjJlNGYwMmYzMmM3NWJjNDg4MWYzNTc3ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9TY3Jp
cHRzL3dlYmtpdHB5L2NvbW1vbi93YXRjaGxpc3Qvd2F0Y2hsaXN0bG9hZGVyX3VuaXR0ZXN0LnB5
CkBAIC0wLDAgKzEsNjIgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjIG1ldDoK
KyMKKyMgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRo
ZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUK
KyMgZGlzdHJpYnV0aW9uLgorIyAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4g
bm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9y
c2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRo
b3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwor
IyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
CisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisnJydVbml0IHRlc3RzIGZvciB3YXRj
aGxpc3Rsb2FkZXIucHkuJycnCisKK2ltcG9ydCByZQoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHdl
YmtpdHB5LmNvbW1vbi53YXRjaGxpc3Qud2F0Y2hsaXN0bG9hZGVyIGltcG9ydCBXYXRjaExpc3RM
b2FkZXIKKworCitkZWYgX3JldHVybl9ub25lKCphcmdzKToKKyAgICByZXR1cm4gTm9uZQorCisK
K2NsYXNzIFdhdGNoTGlzdExvYWRlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBz
ZXRVcChzZWxmKToKKyAgICAgICAgIyBGb3IgdmVyc2lvbnMgb2YgUHl0aG9uIGJlZm9yZSAyLjcu
CisgICAgICAgIGlmIG5vdCAnYXNzZXJ0UmFpc2VzUmVnZXhwJyBpbiBkaXIoc2VsZik6CisgICAg
ICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cCA9IHNlbGYuX3ZlcmlmeUV4Y2VwdGlvbgor
CisgICAgZGVmIF92ZXJpZnlFeGNlcHRpb24oc2VsZiwgcmVnZXhfbWVzc2FnZSwgY2FsbGFibGUs
ICphcmdzKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2FsbGFibGUoKmFyZ3MpCisgICAg
ICAgICAgICBzZWxmLmFzc2VydFRydWUoRmFsc2UsICdObyBhc3NlcnQgcmFpc2VkLicpCisgICAg
ICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjZXB0aW9uOgorICAgICAgICAgICAgc2VsZi5hc3Nl
cnRUcnVlKHJlLm1hdGNoKHJlZ2V4X21lc3NhZ2UsIGV4Y2VwdGlvbi5fX3N0cl9fKCkpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICdFeHBlY3RlZCByZWdleCAiJXMiXG5Hb3QgIiVzIicg
JSAocmVnZXhfbWVzc2FnZSwgZXhjZXB0aW9uLl9fc3RyX18oKSkpCisKKyAgICBkZWYgdGVzdF93
YXRjaF9saXN0X25vdF9mb3VuZChzZWxmKToKKyAgICAgICAgbG9hZGVyID0gV2F0Y2hMaXN0TG9h
ZGVyKCkKKyAgICAgICAgbG9hZGVyLl9hdHRlbXB0X2ZpbGVfbG9hZCA9IF9yZXR1cm5fbm9uZQor
ICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChyJ1dhdGNoIGxpc3QgZmlsZSBcKHdlYmtp
dHB5L2NvbW1vbi9jb25maWcvd2F0Y2hsaXN0XCkgbm90IGZvdW5kIGluIHRoZSBweXRob24gc2Vh
cmNoIHBhdGhcLicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlci5sb2Fk
KQorCisgICAgZGVmIHRlc3Rfd2F0Y2hfbGlzdF9sb2FkKHNlbGYpOgorICAgICAgICAjIEp1c3Qg
dmVyaWZ5aW5nIHRoYXQgbG9hZGluZyB0aGUgY2hlY2tlZCBpbiB3YXRjaCBsaXN0IHdvcmtzLgor
ICAgICAgICBXYXRjaExpc3RMb2FkZXIoKS5sb2FkKCkK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>109049</attachid>
            <date>2011-09-28 12:06:17 -0700</date>
            <delta_ts>2011-09-28 12:06:56 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-68991-20110928120616.patch</filename>
            <type>text/plain</type>
            <size>11335</size>
            <attacher name="David Levin">levin</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTYyMzIKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBi
L1Rvb2xzL0NoYW5nZUxvZwppbmRleCAxZjcyZTIyYjk1MDViYTViZmJlYjJhOTA4YjA4ZGU5NDU2
YzM3MDQ0Li5mZWU2YmYxZDg4ZGFmYjE0NGIwZTA2YTEzNTY3ZjdkZGIwNjkxNDZmIDEwMDY0NAot
LS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsMjIg
QEAKIDIwMTEtMDktMjggIERhdmlkIExldmluICA8bGV2aW5AY2hyb21pdW0ub3JnPgogCisgICAg
ICAgIHdhdGNobGlzdDogQWRkIGEgd2F5IHRvIGxvYWQgdGhlIHdhdGNobGlzdCBmcm9tIGNvbmZp
Zy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTY4OTkx
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBTY3Jp
cHRzL3dlYmtpdHB5L2NvbW1vbi9jb25maWcvd2F0Y2hsaXN0OiBBZGRlZC4KKyAgICAgICAgKiBT
Y3JpcHRzL3dlYmtpdHB5L2NvbW1vbi93YXRjaGxpc3Qvd2F0Y2hsaXN0bG9hZGVyLnB5OiBBZGRl
ZC4KKyAgICAgICAgU3VwcG9ydCBmb3IgbG9hZGluZyB0aGUgd2F0Y2ggbGlzdC4KKyAgICAgICAg
KiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi93YXRjaGxpc3Qvd2F0Y2hsaXN0bG9hZGVyX3VuaXR0
ZXN0LnB5OiBBZGRlZC4KKyAgICAgICAgVGVzdHMgZm9yIHRoZSBsb2FkaW5nLgorICAgICAgICAq
IFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL3dhdGNobGlzdC93YXRjaGxpc3RwYXJzZXJfdW5pdHRl
c3QucHk6CisgICAgICAgIEFkanVzdGVkIHRvIHVzZSB0aGUgY29tbW9uIGJhc2UgY2xhc3MuCisg
ICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vd2Via2l0dW5pdHRlc3QucHk6IEFkZGVk
LgorICAgICAgICBNYWRlIGEgY29tbW9uIGJhc2UgY2xhc3MgZm9yIGZ1bmN0aW9uYWxpdHkgdXNl
ZCBpbiBtb3JlIHRoYW4gb25lLgorCisyMDExLTA5LTI4ICBEYXZpZCBMZXZpbiAgPGxldmluQGNo
cm9taXVtLm9yZz4KKwogICAgICAgICB3YXRjaGxpc3Q6IFN1Z2dlc3QgY29ycmVjdGlvbnMgZm9y
IHR5cG9zIGFuZCBpbXByb3ZlIGVycm9yIG1lc3NhZ2UgY29uc2lzdGVuY3kuCiAgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02ODk3NgogCmRpZmYgLS1naXQg
YS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jb25maWcvd2F0Y2hsaXN0IGIvVG9vbHMv
U2NyaXB0cy93ZWJraXRweS9jb21tb24vY29uZmlnL3dhdGNobGlzdApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi41MDNl
MDgxZjY5NjgyNjM3YzUwOGExMjRkNzhlNDQ0NTZiZGJiYzQzCi0tLSAvZGV2L251bGwKKysrIGIv
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vY29uZmlnL3dhdGNobGlzdApAQCAtMCwwICsx
LDEwIEBACit7CisgICAgIkRFRklOSVRJT05TIjogeworICAgICAgICAiV2F0Y2hMaXN0U2NyaXB0
IjogeworICAgICAgICAgICAgImZpbGVuYW1lIjogKHIiVG9vbHMvU2NyaXB0cy93ZWJraXRweS9j
b21tb24vd2F0Y2hsaXN0Ly4qIiksCisgICAgICAgIH0sCisgICAgfSwKKyAgICAiQ0NfUlVMRVMi
OiB7CisgICAgICAgICJXYXRjaExpc3RTY3JpcHQiOiBbICJsZXZpbit3YXRjaGxpc3RAY2hyb21p
dW0ub3JnIiwgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9jb21tb24vd2F0Y2hsaXN0L3dhdGNobGlzdGxvYWRlci5weSBiL1Rvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvY29tbW9uL3dhdGNobGlzdC93YXRjaGxpc3Rsb2FkZXIucHkKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMTll
NDczNTNhMzM3ZjZhYzQ4NTRkYzU3ODM1ZGM0ZTY4YzQ4NjZkZgotLS0gL2Rldi9udWxsCisrKyBi
L1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3dhdGNobGlzdC93YXRjaGxpc3Rsb2FkZXIu
cHkKQEAgLTAsMCArMSw1NSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0
OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBp
biB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUg
SW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8g
ZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJl
IHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVU
T1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBP
UiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2ltcG9ydCBvcworaW1wb3J0
IHN5cworCitmcm9tIHdlYmtpdHB5LmNvbW1vbi53YXRjaGxpc3Qud2F0Y2hsaXN0cGFyc2VyIGlt
cG9ydCBXYXRjaExpc3RQYXJzZXIKKworCitjbGFzcyBXYXRjaExpc3RMb2FkZXIob2JqZWN0KToK
KyAgICBkZWYgX19pbml0X18oc2VsZiwgdG9vbCk6CisgICAgICAgIHNlbGYuX3Rvb2wgPSB0b29s
CisKKyAgICBkZWYgX2F0dGVtcHRfZmlsZV9sb2FkKHNlbGYsIHBhdGgsIHdhdGNobGlzdF9maWxl
bmFtZSk6CisgICAgICAgIGN1cnJlbnRfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4ocGF0aCwgd2F0
Y2hsaXN0X2ZpbGVuYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5f
dG9vbC5yZWFkX3RleHRfZmlsZShjdXJyZW50X2ZpbGVuYW1lKQorICAgICAgICBleGNlcHQ6Cisg
ICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIF9nZXRfd2F0Y2hfbGlzdF9jb250ZW50
cyhzZWxmKToKKyAgICAgICAgd2F0Y2hsaXN0X2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKCd3ZWJr
aXRweScsICdjb21tb24nLCAnY29uZmlnJywgJ3dhdGNobGlzdCcpCisgICAgICAgIGZvciBwYXRo
IGluIHN5cy5wYXRoOgorICAgICAgICAgICAgY29udGVudHMgPSBzZWxmLl9hdHRlbXB0X2ZpbGVf
bG9hZChwYXRoLCB3YXRjaGxpc3RfZmlsZW5hbWUpCisgICAgICAgICAgICBpZiBjb250ZW50cyBp
cyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudHMKKyAgICAgICAgcmFp
c2UgRXhjZXB0aW9uKCdXYXRjaCBsaXN0IGZpbGUgKCVzKSBub3QgZm91bmQgaW4gdGhlIHB5dGhv
biBzZWFyY2ggcGF0aC4nICUgd2F0Y2hsaXN0X2ZpbGVuYW1lKQorCisgICAgZGVmIGxvYWQoc2Vs
Zik6CisgICAgICAgIHJldHVybiBXYXRjaExpc3RQYXJzZXIoKS5wYXJzZShzZWxmLl9nZXRfd2F0
Y2hfbGlzdF9jb250ZW50cygpKQpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9j
b21tb24vd2F0Y2hsaXN0L3dhdGNobGlzdGxvYWRlcl91bml0dGVzdC5weSBiL1Rvb2xzL1Njcmlw
dHMvd2Via2l0cHkvY29tbW9uL3dhdGNobGlzdC93YXRjaGxpc3Rsb2FkZXJfdW5pdHRlc3QucHkK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uNWMwNzI1MTEwYzc5M2E1NGM0MDNjMmRhZjRmN2RmMTU1ZTUxMmY0OAotLS0g
L2Rldi9udWxsCisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3dhdGNobGlzdC93
YXRjaGxpc3Rsb2FkZXJfdW5pdHRlc3QucHkKQEAgLTAsMCArMSw0NSBAQAorIyBDb3B5cmlnaHQg
KEMpIDIwMTEgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAg
KiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
CisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICogTmVpdGhl
ciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmli
dXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQg
ZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJt
aXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQg
SE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhF
IENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisKKycnJ1VuaXQgdGVzdHMgZm9yIHdhdGNobGlzdGxvYWRlci5weS4nJycKKworZnJvbSB3ZWJr
aXRweS5jb21tb24gaW1wb3J0IHdlYmtpdHVuaXR0ZXN0Citmcm9tIHdlYmtpdHB5LmNvbW1vbi5z
eXN0ZW0gaW1wb3J0IGZpbGVzeXN0ZW1fbW9jaworZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVt
IGltcG9ydCBmaWxlc3lzdGVtCitmcm9tIHdlYmtpdHB5LmNvbW1vbi53YXRjaGxpc3Qud2F0Y2hs
aXN0bG9hZGVyIGltcG9ydCBXYXRjaExpc3RMb2FkZXIKKworCitjbGFzcyBXYXRjaExpc3RMb2Fk
ZXJUZXN0KHdlYmtpdHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF93YXRjaF9saXN0
X25vdF9mb3VuZChzZWxmKToKKyAgICAgICAgbG9hZGVyID0gV2F0Y2hMaXN0TG9hZGVyKGZpbGVz
eXN0ZW1fbW9jay5Nb2NrRmlsZVN5c3RlbSgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1Jl
Z2V4cChyJ1dhdGNoIGxpc3QgZmlsZSBcKHdlYmtpdHB5L2NvbW1vbi9jb25maWcvd2F0Y2hsaXN0
XCkgbm90IGZvdW5kIGluIHRoZSBweXRob24gc2VhcmNoIHBhdGhcLicsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGxvYWRlci5sb2FkKQorCisgICAgZGVmIHRlc3Rfd2F0Y2hfbGlz
dF9sb2FkKHNlbGYpOgorICAgICAgICAjIEp1c3QgdmVyaWZ5aW5nIHRoYXQgbG9hZGluZyB0aGUg
Y2hlY2tlZCBpbiB3YXRjaCBsaXN0IHdvcmtzLgorICAgICAgICBXYXRjaExpc3RMb2FkZXIoZmls
ZXN5c3RlbS5GaWxlU3lzdGVtKCkpLmxvYWQoKQpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93
ZWJraXRweS9jb21tb24vd2F0Y2hsaXN0L3dhdGNobGlzdHBhcnNlcl91bml0dGVzdC5weSBiL1Rv
b2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3dhdGNobGlzdC93YXRjaGxpc3RwYXJzZXJfdW5p
dHRlc3QucHkKaW5kZXggMTc4ZWEzNmQ4MTlmYTU4MzIzZDYwMmViY2ZiYzY2NDUwYjc2MWM0OC4u
MmI0N2ZkMmZhODU2M2FjNDVlOTQ4YWFkZDlkOWJkMTBjYWI4YTFkMiAxMDA2NDQKLS0tIGEvVG9v
bHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vd2F0Y2hsaXN0L3dhdGNobGlzdHBhcnNlcl91bml0
dGVzdC5weQorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi93YXRjaGxpc3Qvd2F0
Y2hsaXN0cGFyc2VyX3VuaXR0ZXN0LnB5CkBAIC0yOCwyNiArMjgsMTUgQEAKIAogJycnVW5pdCB0
ZXN0cyBmb3Igd2F0Y2hsaXN0cGFyc2VyLnB5LicnJwogCi1pbXBvcnQgcmUKLWltcG9ydCB1bml0
dGVzdAorZnJvbSB3ZWJraXRweS5jb21tb24gaW1wb3J0IHdlYmtpdHVuaXR0ZXN0CiBmcm9tIHdl
YmtpdHB5LmNvbW1vbi53YXRjaGxpc3Qud2F0Y2hsaXN0cGFyc2VyIGltcG9ydCBXYXRjaExpc3RQ
YXJzZXIKIAogCi1jbGFzcyBXYXRjaExpc3RQYXJzZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToK
K2NsYXNzIFdhdGNoTGlzdFBhcnNlclRlc3Qod2Via2l0dW5pdHRlc3QuVGVzdENhc2UpOgogICAg
IGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgIyBGb3IgdmVyc2lvbnMgb2YgUHl0aG9uIGJlZm9y
ZSAyLjcuCi0gICAgICAgIGlmIG5vdCAnYXNzZXJ0UmFpc2VzUmVnZXhwJyBpbiBkaXIoc2VsZik6
Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cCA9IHNlbGYuX3ZlcmlmeUV4Y2Vw
dGlvbgorICAgICAgICB3ZWJraXR1bml0dGVzdC5UZXN0Q2FzZS5zZXRVcChzZWxmKQogICAgICAg
ICBzZWxmLl93YXRjaF9saXN0X3BhcnNlciA9IFdhdGNoTGlzdFBhcnNlcigpCiAKLSAgICBkZWYg
X3ZlcmlmeUV4Y2VwdGlvbihzZWxmLCByZWdleF9tZXNzYWdlLCBjYWxsYWJsZSwgKmFyZ3MpOgot
ICAgICAgICB0cnk6Ci0gICAgICAgICAgICBjYWxsYWJsZSgqYXJncykKLSAgICAgICAgICAgIHNl
bGYuYXNzZXJ0VHJ1ZShGYWxzZSwgJ05vIGFzc2VydCByYWlzZWQuJykKLSAgICAgICAgZXhjZXB0
IEV4Y2VwdGlvbiBhcyBleGNlcHRpb246Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmUu
bWF0Y2gocmVnZXhfbWVzc2FnZSwgZXhjZXB0aW9uLl9fc3RyX18oKSksCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgJ0V4cGVjdGVkIHJlZ2V4ICIlcyJcbkdvdCAiJXMiJyAlIChyZWdleF9t
ZXNzYWdlLCBleGNlcHRpb24uX19zdHJfXygpKSkKLQogICAgIGRlZiB0ZXN0X2JhZF9zZWN0aW9u
KHNlbGYpOgogICAgICAgICB3YXRjaF9saXN0X3dpdGhfYmFkX3NlY3Rpb24gPSAoJ3siRk9PIjog
e319JykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoJ1Vua25vd24gc2VjdGlvbiAi
Rk9PIiBpbiB3YXRjaCBsaXN0LicsCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5
L2NvbW1vbi93ZWJraXR1bml0dGVzdC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9u
L3dlYmtpdHVuaXR0ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmI3NDM5ZTM0NzliNTJjOGM0YzljNzNmYmNh
NWQ4MTZmNTRhNGRlNDIKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5
L2NvbW1vbi93ZWJraXR1bml0dGVzdC5weQpAQCAtMCwwICsxLDQ3IEBACisjIENvcHlyaWdodCAo
QykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAg
ICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlzdHJpYnV0aW9uLgorIyAgICAgKiBOZWl0
aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRy
aWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZl
ZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBl
cm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdI
VCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisj
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBU
SEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAor
IyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKworJycnQmFzaWMgdW5pdCB0ZXN0IGZ1bmN0aW9uYWxpdHkuJycnCisKK2ltcG9ydCByZQor
aW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgor
ICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgIyBGb3IgdmVyc2lvbnMgb2YgUHl0aG9uIGJl
Zm9yZSAyLjcuCisgICAgICAgIGlmIG5vdCAnYXNzZXJ0UmFpc2VzUmVnZXhwJyBpbiBkaXIoc2Vs
Zik6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cCA9IHNlbGYuX3ZlcmlmeUV4
Y2VwdGlvbgorCisgICAgZGVmIF92ZXJpZnlFeGNlcHRpb24oc2VsZiwgcmVnZXhfbWVzc2FnZSwg
Y2FsbGFibGUsICphcmdzKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2FsbGFibGUoKmFy
Z3MpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoRmFsc2UsICdObyBhc3NlcnQgcmFpc2Vk
LicpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjZXB0aW9uOgorICAgICAgICAgICAg
c2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKHJlZ2V4X21lc3NhZ2UsIGV4Y2VwdGlvbi5fX3N0cl9f
KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFeHBlY3RlZCByZWdleCAiJXMiXG5H
b3QgIiVzIicgJSAocmVnZXhfbWVzc2FnZSwgZXhjZXB0aW9uLl9fc3RyX18oKSkpCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>109051</attachid>
            <date>2011-09-28 12:10:58 -0700</date>
            <delta_ts>2011-09-28 13:46:06 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-68991-20110928121057.patch</filename>
            <type>text/plain</type>
            <size>11359</size>
            <attacher name="David Levin">levin</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTYyMzIKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBi
L1Rvb2xzL0NoYW5nZUxvZwppbmRleCAxZjcyZTIyYjk1MDViYTViZmJlYjJhOTA4YjA4ZGU5NDU2
YzM3MDQ0Li5mZWU2YmYxZDg4ZGFmYjE0NGIwZTA2YTEzNTY3ZjdkZGIwNjkxNDZmIDEwMDY0NAot
LS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsMjIg
QEAKIDIwMTEtMDktMjggIERhdmlkIExldmluICA8bGV2aW5AY2hyb21pdW0ub3JnPgogCisgICAg
ICAgIHdhdGNobGlzdDogQWRkIGEgd2F5IHRvIGxvYWQgdGhlIHdhdGNobGlzdCBmcm9tIGNvbmZp
Zy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTY4OTkx
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBTY3Jp
cHRzL3dlYmtpdHB5L2NvbW1vbi9jb25maWcvd2F0Y2hsaXN0OiBBZGRlZC4KKyAgICAgICAgKiBT
Y3JpcHRzL3dlYmtpdHB5L2NvbW1vbi93YXRjaGxpc3Qvd2F0Y2hsaXN0bG9hZGVyLnB5OiBBZGRl
ZC4KKyAgICAgICAgU3VwcG9ydCBmb3IgbG9hZGluZyB0aGUgd2F0Y2ggbGlzdC4KKyAgICAgICAg
KiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi93YXRjaGxpc3Qvd2F0Y2hsaXN0bG9hZGVyX3VuaXR0
ZXN0LnB5OiBBZGRlZC4KKyAgICAgICAgVGVzdHMgZm9yIHRoZSBsb2FkaW5nLgorICAgICAgICAq
IFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL3dhdGNobGlzdC93YXRjaGxpc3RwYXJzZXJfdW5pdHRl
c3QucHk6CisgICAgICAgIEFkanVzdGVkIHRvIHVzZSB0aGUgY29tbW9uIGJhc2UgY2xhc3MuCisg
ICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vd2Via2l0dW5pdHRlc3QucHk6IEFkZGVk
LgorICAgICAgICBNYWRlIGEgY29tbW9uIGJhc2UgY2xhc3MgZm9yIGZ1bmN0aW9uYWxpdHkgdXNl
ZCBpbiBtb3JlIHRoYW4gb25lLgorCisyMDExLTA5LTI4ICBEYXZpZCBMZXZpbiAgPGxldmluQGNo
cm9taXVtLm9yZz4KKwogICAgICAgICB3YXRjaGxpc3Q6IFN1Z2dlc3QgY29ycmVjdGlvbnMgZm9y
IHR5cG9zIGFuZCBpbXByb3ZlIGVycm9yIG1lc3NhZ2UgY29uc2lzdGVuY3kuCiAgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02ODk3NgogCmRpZmYgLS1naXQg
YS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jb25maWcvd2F0Y2hsaXN0IGIvVG9vbHMv
U2NyaXB0cy93ZWJraXRweS9jb21tb24vY29uZmlnL3dhdGNobGlzdApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi41MDNl
MDgxZjY5NjgyNjM3YzUwOGExMjRkNzhlNDQ0NTZiZGJiYzQzCi0tLSAvZGV2L251bGwKKysrIGIv
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vY29uZmlnL3dhdGNobGlzdApAQCAtMCwwICsx
LDEwIEBACit7CisgICAgIkRFRklOSVRJT05TIjogeworICAgICAgICAiV2F0Y2hMaXN0U2NyaXB0
IjogeworICAgICAgICAgICAgImZpbGVuYW1lIjogKHIiVG9vbHMvU2NyaXB0cy93ZWJraXRweS9j
b21tb24vd2F0Y2hsaXN0Ly4qIiksCisgICAgICAgIH0sCisgICAgfSwKKyAgICAiQ0NfUlVMRVMi
OiB7CisgICAgICAgICJXYXRjaExpc3RTY3JpcHQiOiBbICJsZXZpbit3YXRjaGxpc3RAY2hyb21p
dW0ub3JnIiwgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9jb21tb24vd2F0Y2hsaXN0L3dhdGNobGlzdGxvYWRlci5weSBiL1Rvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvY29tbW9uL3dhdGNobGlzdC93YXRjaGxpc3Rsb2FkZXIucHkKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uM2Vi
Zjk5MDhkOTQ0M2FhMGZjOGE2ZThiYTkwYjg2YmU4N2FhMGEwOAotLS0gL2Rldi9udWxsCisrKyBi
L1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3dhdGNobGlzdC93YXRjaGxpc3Rsb2FkZXIu
cHkKQEAgLTAsMCArMSw1NSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0
OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBp
biB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUg
SW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8g
ZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJl
IHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVU
T1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBP
UiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2ltcG9ydCBvcworaW1wb3J0
IHN5cworCitmcm9tIHdlYmtpdHB5LmNvbW1vbi53YXRjaGxpc3Qud2F0Y2hsaXN0cGFyc2VyIGlt
cG9ydCBXYXRjaExpc3RQYXJzZXIKKworCitjbGFzcyBXYXRjaExpc3RMb2FkZXIob2JqZWN0KToK
KyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZXN5c3RlbSk6CisgICAgICAgIHNlbGYuX2ZpbGVz
eXN0ZW0gPSBmaWxlc3lzdGVtCisKKyAgICBkZWYgX2F0dGVtcHRfZmlsZV9sb2FkKHNlbGYsIHBh
dGgsIHdhdGNobGlzdF9maWxlbmFtZSk6CisgICAgICAgIGN1cnJlbnRfZmlsZW5hbWUgPSBvcy5w
YXRoLmpvaW4ocGF0aCwgd2F0Y2hsaXN0X2ZpbGVuYW1lKQorICAgICAgICB0cnk6CisgICAgICAg
ICAgICByZXR1cm4gc2VsZi5fZmlsZXN5c3RlbS5yZWFkX3RleHRfZmlsZShjdXJyZW50X2ZpbGVu
YW1lKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVm
IF9nZXRfd2F0Y2hfbGlzdF9jb250ZW50cyhzZWxmKToKKyAgICAgICAgd2F0Y2hsaXN0X2ZpbGVu
YW1lID0gb3MucGF0aC5qb2luKCd3ZWJraXRweScsICdjb21tb24nLCAnY29uZmlnJywgJ3dhdGNo
bGlzdCcpCisgICAgICAgIGZvciBwYXRoIGluIHN5cy5wYXRoOgorICAgICAgICAgICAgY29udGVu
dHMgPSBzZWxmLl9hdHRlbXB0X2ZpbGVfbG9hZChwYXRoLCB3YXRjaGxpc3RfZmlsZW5hbWUpCisg
ICAgICAgICAgICBpZiBjb250ZW50cyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1
cm4gY29udGVudHMKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdXYXRjaCBsaXN0IGZpbGUgKCVz
KSBub3QgZm91bmQgaW4gdGhlIHB5dGhvbiBzZWFyY2ggcGF0aC4nICUgd2F0Y2hsaXN0X2ZpbGVu
YW1lKQorCisgICAgZGVmIGxvYWQoc2VsZik6CisgICAgICAgIHJldHVybiBXYXRjaExpc3RQYXJz
ZXIoKS5wYXJzZShzZWxmLl9nZXRfd2F0Y2hfbGlzdF9jb250ZW50cygpKQpkaWZmIC0tZ2l0IGEv
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vd2F0Y2hsaXN0L3dhdGNobGlzdGxvYWRlcl91
bml0dGVzdC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3dhdGNobGlzdC93YXRj
aGxpc3Rsb2FkZXJfdW5pdHRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNWMwNzI1MTEwYzc5M2E1NGM0MDNj
MmRhZjRmN2RmMTU1ZTUxMmY0OAotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvY29tbW9uL3dhdGNobGlzdC93YXRjaGxpc3Rsb2FkZXJfdW5pdHRlc3QucHkKQEAgLTAs
MCArMSw0NSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIyAg
ICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyMgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMgaW4gdGhlIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorIyBkaXN0
cmlidXRpb24uCisjICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhl
IG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBw
cm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3Bl
Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJ
UyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKycnJ1VuaXQgdGVzdHMgZm9yIHdhdGNobGlzdGxv
YWRlci5weS4nJycKKworZnJvbSB3ZWJraXRweS5jb21tb24gaW1wb3J0IHdlYmtpdHVuaXR0ZXN0
Citmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0gaW1wb3J0IGZpbGVzeXN0ZW1fbW9jaworZnJv
bSB3ZWJraXRweS5jb21tb24uc3lzdGVtIGltcG9ydCBmaWxlc3lzdGVtCitmcm9tIHdlYmtpdHB5
LmNvbW1vbi53YXRjaGxpc3Qud2F0Y2hsaXN0bG9hZGVyIGltcG9ydCBXYXRjaExpc3RMb2FkZXIK
KworCitjbGFzcyBXYXRjaExpc3RMb2FkZXJUZXN0KHdlYmtpdHVuaXR0ZXN0LlRlc3RDYXNlKToK
KyAgICBkZWYgdGVzdF93YXRjaF9saXN0X25vdF9mb3VuZChzZWxmKToKKyAgICAgICAgbG9hZGVy
ID0gV2F0Y2hMaXN0TG9hZGVyKGZpbGVzeXN0ZW1fbW9jay5Nb2NrRmlsZVN5c3RlbSgpKQorICAg
ICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChyJ1dhdGNoIGxpc3QgZmlsZSBcKHdlYmtpdHB5
L2NvbW1vbi9jb25maWcvd2F0Y2hsaXN0XCkgbm90IGZvdW5kIGluIHRoZSBweXRob24gc2VhcmNo
IHBhdGhcLicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlci5sb2FkKQor
CisgICAgZGVmIHRlc3Rfd2F0Y2hfbGlzdF9sb2FkKHNlbGYpOgorICAgICAgICAjIEp1c3QgdmVy
aWZ5aW5nIHRoYXQgbG9hZGluZyB0aGUgY2hlY2tlZCBpbiB3YXRjaCBsaXN0IHdvcmtzLgorICAg
ICAgICBXYXRjaExpc3RMb2FkZXIoZmlsZXN5c3RlbS5GaWxlU3lzdGVtKCkpLmxvYWQoKQpkaWZm
IC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vd2F0Y2hsaXN0L3dhdGNobGlz
dHBhcnNlcl91bml0dGVzdC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3dhdGNo
bGlzdC93YXRjaGxpc3RwYXJzZXJfdW5pdHRlc3QucHkKaW5kZXggMTc4ZWEzNmQ4MTlmYTU4MzIz
ZDYwMmViY2ZiYzY2NDUwYjc2MWM0OC4uMmI0N2ZkMmZhODU2M2FjNDVlOTQ4YWFkZDlkOWJkMTBj
YWI4YTFkMiAxMDA2NDQKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vd2F0Y2hs
aXN0L3dhdGNobGlzdHBhcnNlcl91bml0dGVzdC5weQorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtp
dHB5L2NvbW1vbi93YXRjaGxpc3Qvd2F0Y2hsaXN0cGFyc2VyX3VuaXR0ZXN0LnB5CkBAIC0yOCwy
NiArMjgsMTUgQEAKIAogJycnVW5pdCB0ZXN0cyBmb3Igd2F0Y2hsaXN0cGFyc2VyLnB5LicnJwog
Ci1pbXBvcnQgcmUKLWltcG9ydCB1bml0dGVzdAorZnJvbSB3ZWJraXRweS5jb21tb24gaW1wb3J0
IHdlYmtpdHVuaXR0ZXN0CiBmcm9tIHdlYmtpdHB5LmNvbW1vbi53YXRjaGxpc3Qud2F0Y2hsaXN0
cGFyc2VyIGltcG9ydCBXYXRjaExpc3RQYXJzZXIKIAogCi1jbGFzcyBXYXRjaExpc3RQYXJzZXJU
ZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKK2NsYXNzIFdhdGNoTGlzdFBhcnNlclRlc3Qod2Via2l0
dW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgIyBGb3Ig
dmVyc2lvbnMgb2YgUHl0aG9uIGJlZm9yZSAyLjcuCi0gICAgICAgIGlmIG5vdCAnYXNzZXJ0UmFp
c2VzUmVnZXhwJyBpbiBkaXIoc2VsZik6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1Jl
Z2V4cCA9IHNlbGYuX3ZlcmlmeUV4Y2VwdGlvbgorICAgICAgICB3ZWJraXR1bml0dGVzdC5UZXN0
Q2FzZS5zZXRVcChzZWxmKQogICAgICAgICBzZWxmLl93YXRjaF9saXN0X3BhcnNlciA9IFdhdGNo
TGlzdFBhcnNlcigpCiAKLSAgICBkZWYgX3ZlcmlmeUV4Y2VwdGlvbihzZWxmLCByZWdleF9tZXNz
YWdlLCBjYWxsYWJsZSwgKmFyZ3MpOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBjYWxsYWJs
ZSgqYXJncykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShGYWxzZSwgJ05vIGFzc2VydCBy
YWlzZWQuJykKLSAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGNlcHRpb246Ci0gICAgICAg
ICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2gocmVnZXhfbWVzc2FnZSwgZXhjZXB0aW9uLl9f
c3RyX18oKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0V4cGVjdGVkIHJlZ2V4ICIl
cyJcbkdvdCAiJXMiJyAlIChyZWdleF9tZXNzYWdlLCBleGNlcHRpb24uX19zdHJfXygpKSkKLQog
ICAgIGRlZiB0ZXN0X2JhZF9zZWN0aW9uKHNlbGYpOgogICAgICAgICB3YXRjaF9saXN0X3dpdGhf
YmFkX3NlY3Rpb24gPSAoJ3siRk9PIjoge319JykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNS
ZWdleHAoJ1Vua25vd24gc2VjdGlvbiAiRk9PIiBpbiB3YXRjaCBsaXN0LicsCmRpZmYgLS1naXQg
YS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi93ZWJraXR1bml0dGVzdC5weSBiL1Rvb2xz
L1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3dlYmtpdHVuaXR0ZXN0LnB5Cm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmI3
NDM5ZTM0NzliNTJjOGM0YzljNzNmYmNhNWQ4MTZmNTRhNGRlNDIKLS0tIC9kZXYvbnVsbAorKysg
Yi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi93ZWJraXR1bml0dGVzdC5weQpAQCAtMCww
ICsxLDQ3IEBACisjIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyBtZXQ6CisjCisjICAg
ICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisjIGluIHRoZSBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgZGlz
dHJpYnV0aW9uLgorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0
aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9y
IHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisjIHRoaXMgc29mdHdhcmUgd2l0aG91dCBz
cGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFT
IElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QKKyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBT
UEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UCisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworJycnQmFzaWMgdW5pdCB0ZXN0IGZ1bmN0aW9u
YWxpdHkuJycnCisKK2ltcG9ydCByZQoraW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgVGVzdENh
c2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgIyBG
b3IgdmVyc2lvbnMgb2YgUHl0aG9uIGJlZm9yZSAyLjcuCisgICAgICAgIGlmIG5vdCAnYXNzZXJ0
UmFpc2VzUmVnZXhwJyBpbiBkaXIoc2VsZik6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNl
c1JlZ2V4cCA9IHNlbGYuX3ZlcmlmeUV4Y2VwdGlvbgorCisgICAgZGVmIF92ZXJpZnlFeGNlcHRp
b24oc2VsZiwgcmVnZXhfbWVzc2FnZSwgY2FsbGFibGUsICphcmdzKToKKyAgICAgICAgdHJ5Ogor
ICAgICAgICAgICAgY2FsbGFibGUoKmFyZ3MpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUo
RmFsc2UsICdObyBhc3NlcnQgcmFpc2VkLicpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMg
ZXhjZXB0aW9uOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKHJlZ2V4X21l
c3NhZ2UsIGV4Y2VwdGlvbi5fX3N0cl9fKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICdFeHBlY3RlZCByZWdleCAiJXMiXG5Hb3QgIiVzIicgJSAocmVnZXhfbWVzc2FnZSwgZXhjZXB0
aW9uLl9fc3RyX18oKSkpCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>109067</attachid>
            <date>2011-09-28 13:46:09 -0700</date>
            <delta_ts>2011-09-28 14:38:14 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-68991-20110928134608.patch</filename>
            <type>text/plain</type>
            <size>11040</size>
            <attacher name="David Levin">levin</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTYyMzIKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBi
L1Rvb2xzL0NoYW5nZUxvZwppbmRleCAxZjcyZTIyYjk1MDViYTViZmJlYjJhOTA4YjA4ZGU5NDU2
YzM3MDQ0Li5mZWU2YmYxZDg4ZGFmYjE0NGIwZTA2YTEzNTY3ZjdkZGIwNjkxNDZmIDEwMDY0NAot
LS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsMjIg
QEAKIDIwMTEtMDktMjggIERhdmlkIExldmluICA8bGV2aW5AY2hyb21pdW0ub3JnPgogCisgICAg
ICAgIHdhdGNobGlzdDogQWRkIGEgd2F5IHRvIGxvYWQgdGhlIHdhdGNobGlzdCBmcm9tIGNvbmZp
Zy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTY4OTkx
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBTY3Jp
cHRzL3dlYmtpdHB5L2NvbW1vbi9jb25maWcvd2F0Y2hsaXN0OiBBZGRlZC4KKyAgICAgICAgKiBT
Y3JpcHRzL3dlYmtpdHB5L2NvbW1vbi93YXRjaGxpc3Qvd2F0Y2hsaXN0bG9hZGVyLnB5OiBBZGRl
ZC4KKyAgICAgICAgU3VwcG9ydCBmb3IgbG9hZGluZyB0aGUgd2F0Y2ggbGlzdC4KKyAgICAgICAg
KiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi93YXRjaGxpc3Qvd2F0Y2hsaXN0bG9hZGVyX3VuaXR0
ZXN0LnB5OiBBZGRlZC4KKyAgICAgICAgVGVzdHMgZm9yIHRoZSBsb2FkaW5nLgorICAgICAgICAq
IFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL3dhdGNobGlzdC93YXRjaGxpc3RwYXJzZXJfdW5pdHRl
c3QucHk6CisgICAgICAgIEFkanVzdGVkIHRvIHVzZSB0aGUgY29tbW9uIGJhc2UgY2xhc3MuCisg
ICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vd2Via2l0dW5pdHRlc3QucHk6IEFkZGVk
LgorICAgICAgICBNYWRlIGEgY29tbW9uIGJhc2UgY2xhc3MgZm9yIGZ1bmN0aW9uYWxpdHkgdXNl
ZCBpbiBtb3JlIHRoYW4gb25lLgorCisyMDExLTA5LTI4ICBEYXZpZCBMZXZpbiAgPGxldmluQGNo
cm9taXVtLm9yZz4KKwogICAgICAgICB3YXRjaGxpc3Q6IFN1Z2dlc3QgY29ycmVjdGlvbnMgZm9y
IHR5cG9zIGFuZCBpbXByb3ZlIGVycm9yIG1lc3NhZ2UgY29uc2lzdGVuY3kuCiAgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02ODk3NgogCmRpZmYgLS1naXQg
YS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9jb25maWcvd2F0Y2hsaXN0IGIvVG9vbHMv
U2NyaXB0cy93ZWJraXRweS9jb21tb24vY29uZmlnL3dhdGNobGlzdApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi41MDNl
MDgxZjY5NjgyNjM3YzUwOGExMjRkNzhlNDQ0NTZiZGJiYzQzCi0tLSAvZGV2L251bGwKKysrIGIv
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vY29uZmlnL3dhdGNobGlzdApAQCAtMCwwICsx
LDEwIEBACit7CisgICAgIkRFRklOSVRJT05TIjogeworICAgICAgICAiV2F0Y2hMaXN0U2NyaXB0
IjogeworICAgICAgICAgICAgImZpbGVuYW1lIjogKHIiVG9vbHMvU2NyaXB0cy93ZWJraXRweS9j
b21tb24vd2F0Y2hsaXN0Ly4qIiksCisgICAgICAgIH0sCisgICAgfSwKKyAgICAiQ0NfUlVMRVMi
OiB7CisgICAgICAgICJXYXRjaExpc3RTY3JpcHQiOiBbICJsZXZpbit3YXRjaGxpc3RAY2hyb21p
dW0ub3JnIiwgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9jb21tb24vd2F0Y2hsaXN0L3dhdGNobGlzdGxvYWRlci5weSBiL1Rvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvY29tbW9uL3dhdGNobGlzdC93YXRjaGxpc3Rsb2FkZXIucHkKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNWE0
YzFmZGE5YjFkZjUyNjE2ZGI2YjFmYTk2YzBjZTAzZjQyM2ZiMQotLS0gL2Rldi9udWxsCisrKyBi
L1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3dhdGNobGlzdC93YXRjaGxpc3Rsb2FkZXIu
cHkKQEAgLTAsMCArMSw0NSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0
OgorIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgY29weXJpZ2h0IG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorIyBp
biB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlCisjIGRpc3RyaWJ1dGlvbi4KKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUg
SW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8g
ZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJl
IHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVU
T1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBP
UiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2Zyb20gd2Via2l0cHkuY29t
bW9uLndhdGNobGlzdC53YXRjaGxpc3RwYXJzZXIgaW1wb3J0IFdhdGNoTGlzdFBhcnNlcgorCisK
K2NsYXNzIFdhdGNoTGlzdExvYWRlcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBm
aWxlc3lzdGVtKToKKyAgICAgICAgc2VsZi5fZmlsZXN5c3RlbSA9IGZpbGVzeXN0ZW0KKworICAg
IGRlZiBfZ2V0X3dhdGNoX2xpc3RfY29udGVudHMoc2VsZik6CisgICAgICAgIGNvbmZpZ19wYXRo
ID0gc2VsZi5fZmlsZXN5c3RlbS5kaXJuYW1lKHNlbGYuX2ZpbGVzeXN0ZW0ucGF0aF90b19tb2R1
bGUoJ3dlYmtpdHB5LmNvbW1vbi5jb25maWcnKSkKKyAgICAgICAgd2F0Y2hfbGlzdF9mdWxsX3Bh
dGggPSBzZWxmLl9maWxlc3lzdGVtLmpvaW4oY29uZmlnX3BhdGgsICd3YXRjaGxpc3QnKQorICAg
ICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZmlsZXN5c3RlbS5yZWFkX3RleHRf
ZmlsZSh3YXRjaF9saXN0X2Z1bGxfcGF0aCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAg
cmFpc2UgRXhjZXB0aW9uKCdXYXRjaCBsaXN0IGZpbGUgKCVzKSBub3QgZm91bmQuJyAlIHdhdGNo
X2xpc3RfZnVsbF9wYXRoKQorCisgICAgZGVmIGxvYWQoc2VsZik6CisgICAgICAgIHJldHVybiBX
YXRjaExpc3RQYXJzZXIoKS5wYXJzZShzZWxmLl9nZXRfd2F0Y2hfbGlzdF9jb250ZW50cygpKQpk
aWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vd2F0Y2hsaXN0L3dhdGNo
bGlzdGxvYWRlcl91bml0dGVzdC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3dh
dGNobGlzdC93YXRjaGxpc3Rsb2FkZXJfdW5pdHRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNDYzNDA0N2Ey
MzAxYjM4N2VmYTRjNmQ3MjE5ZWJhOGYzOTE2MDNkYgotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xz
L1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3dhdGNobGlzdC93YXRjaGxpc3Rsb2FkZXJfdW5pdHRl
c3QucHkKQEAgLTAsMCArMSw0NSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMg
bWV0OgorIworIyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisjIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyMg
aW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUg
SW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8g
ZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorIyB0aGlzIHNvZnR3YXJl
IHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVU
T1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBP
UiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKycnJ1VuaXQgdGVzdHMgZm9y
IHdhdGNobGlzdGxvYWRlci5weS4nJycKKworZnJvbSB3ZWJraXRweS5jb21tb24gaW1wb3J0IHdl
YmtpdHVuaXR0ZXN0Citmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0gaW1wb3J0IGZpbGVzeXN0
ZW1fbW9jaworZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVtIGltcG9ydCBmaWxlc3lzdGVtCitm
cm9tIHdlYmtpdHB5LmNvbW1vbi53YXRjaGxpc3Qud2F0Y2hsaXN0bG9hZGVyIGltcG9ydCBXYXRj
aExpc3RMb2FkZXIKKworCitjbGFzcyBXYXRjaExpc3RMb2FkZXJUZXN0KHdlYmtpdHVuaXR0ZXN0
LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF93YXRjaF9saXN0X25vdF9mb3VuZChzZWxmKToKKyAg
ICAgICAgbG9hZGVyID0gV2F0Y2hMaXN0TG9hZGVyKGZpbGVzeXN0ZW1fbW9jay5Nb2NrRmlsZVN5
c3RlbSgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChyJ1dhdGNoIGxpc3QgZmls
ZSBcKC4qL3dhdGNobGlzdFwpIG5vdCBmb3VuZFwuJywKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbG9hZGVyLmxvYWQpCisKKyAgICBkZWYgdGVzdF93YXRjaF9saXN0X2xvYWQoc2Vs
Zik6CisgICAgICAgICMgSnVzdCB2ZXJpZnlpbmcgdGhhdCBsb2FkaW5nIHRoZSBjaGVja2VkIGlu
IHdhdGNoIGxpc3Qgd29ya3MuCisgICAgICAgIFdhdGNoTGlzdExvYWRlcihmaWxlc3lzdGVtLkZp
bGVTeXN0ZW0oKSkubG9hZCgpCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2Nv
bW1vbi93YXRjaGxpc3Qvd2F0Y2hsaXN0cGFyc2VyX3VuaXR0ZXN0LnB5IGIvVG9vbHMvU2NyaXB0
cy93ZWJraXRweS9jb21tb24vd2F0Y2hsaXN0L3dhdGNobGlzdHBhcnNlcl91bml0dGVzdC5weQpp
bmRleCAxNzhlYTM2ZDgxOWZhNTgzMjNkNjAyZWJjZmJjNjY0NTBiNzYxYzQ4Li4yYjQ3ZmQyZmE4
NTYzYWM0NWU5NDhhYWRkOWQ5YmQxMGNhYjhhMWQyIDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRz
L3dlYmtpdHB5L2NvbW1vbi93YXRjaGxpc3Qvd2F0Y2hsaXN0cGFyc2VyX3VuaXR0ZXN0LnB5Cisr
KyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3dhdGNobGlzdC93YXRjaGxpc3RwYXJz
ZXJfdW5pdHRlc3QucHkKQEAgLTI4LDI2ICsyOCwxNSBAQAogCiAnJydVbml0IHRlc3RzIGZvciB3
YXRjaGxpc3RwYXJzZXIucHkuJycnCiAKLWltcG9ydCByZQotaW1wb3J0IHVuaXR0ZXN0Citmcm9t
IHdlYmtpdHB5LmNvbW1vbiBpbXBvcnQgd2Via2l0dW5pdHRlc3QKIGZyb20gd2Via2l0cHkuY29t
bW9uLndhdGNobGlzdC53YXRjaGxpc3RwYXJzZXIgaW1wb3J0IFdhdGNoTGlzdFBhcnNlcgogCiAK
LWNsYXNzIFdhdGNoTGlzdFBhcnNlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorY2xhc3MgV2F0
Y2hMaXN0UGFyc2VyVGVzdCh3ZWJraXR1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHNldFVw
KHNlbGYpOgotICAgICAgICAjIEZvciB2ZXJzaW9ucyBvZiBQeXRob24gYmVmb3JlIDIuNy4KLSAg
ICAgICAgaWYgbm90ICdhc3NlcnRSYWlzZXNSZWdleHAnIGluIGRpcihzZWxmKToKLSAgICAgICAg
ICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwID0gc2VsZi5fdmVyaWZ5RXhjZXB0aW9uCisgICAg
ICAgIHdlYmtpdHVuaXR0ZXN0LlRlc3RDYXNlLnNldFVwKHNlbGYpCiAgICAgICAgIHNlbGYuX3dh
dGNoX2xpc3RfcGFyc2VyID0gV2F0Y2hMaXN0UGFyc2VyKCkKIAotICAgIGRlZiBfdmVyaWZ5RXhj
ZXB0aW9uKHNlbGYsIHJlZ2V4X21lc3NhZ2UsIGNhbGxhYmxlLCAqYXJncyk6Ci0gICAgICAgIHRy
eToKLSAgICAgICAgICAgIGNhbGxhYmxlKCphcmdzKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRU
cnVlKEZhbHNlLCAnTm8gYXNzZXJ0IHJhaXNlZC4nKQotICAgICAgICBleGNlcHQgRXhjZXB0aW9u
IGFzIGV4Y2VwdGlvbjoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChyZWdl
eF9tZXNzYWdlLCBleGNlcHRpb24uX19zdHJfXygpKSwKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAnRXhwZWN0ZWQgcmVnZXggIiVzIlxuR290ICIlcyInICUgKHJlZ2V4X21lc3NhZ2UsIGV4
Y2VwdGlvbi5fX3N0cl9fKCkpKQotCiAgICAgZGVmIHRlc3RfYmFkX3NlY3Rpb24oc2VsZik6CiAg
ICAgICAgIHdhdGNoX2xpc3Rfd2l0aF9iYWRfc2VjdGlvbiA9ICgneyJGT08iOiB7fX0nKQogICAg
ICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cCgnVW5rbm93biBzZWN0aW9uICJGT08iIGluIHdh
dGNoIGxpc3QuJywKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3dl
YmtpdHVuaXR0ZXN0LnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vd2Via2l0dW5p
dHRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uYjc0MzllMzQ3OWI1MmM4YzRjOWM3M2ZiY2E1ZDgxNmY1NGE0
ZGU0MgotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3dl
YmtpdHVuaXR0ZXN0LnB5CkBAIC0wLDAgKzEsNDcgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDExIEdv
b2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMgYXJlCisjIG1ldDoKKyMKKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAgICAgKiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisjIGNvcHly
aWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIKKyMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZQorIyBkaXN0cmlidXRpb24uCisjICAgICAqIE5laXRoZXIgdGhlIG5h
bWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1h
eSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMg
dGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4K
KyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMg
QU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklH
SFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisnJydC
YXNpYyB1bml0IHRlc3QgZnVuY3Rpb25hbGl0eS4nJycKKworaW1wb3J0IHJlCitpbXBvcnQgdW5p
dHRlc3QKKworCitjbGFzcyBUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNl
dFVwKHNlbGYpOgorICAgICAgICAjIEZvciB2ZXJzaW9ucyBvZiBQeXRob24gYmVmb3JlIDIuNy4K
KyAgICAgICAgaWYgbm90ICdhc3NlcnRSYWlzZXNSZWdleHAnIGluIGRpcihzZWxmKToKKyAgICAg
ICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwID0gc2VsZi5fdmVyaWZ5RXhjZXB0aW9uCisK
KyAgICBkZWYgX3ZlcmlmeUV4Y2VwdGlvbihzZWxmLCByZWdleF9tZXNzYWdlLCBjYWxsYWJsZSwg
KmFyZ3MpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjYWxsYWJsZSgqYXJncykKKyAgICAg
ICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShGYWxzZSwgJ05vIGFzc2VydCByYWlzZWQuJykKKyAgICAg
ICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGNlcHRpb246CisgICAgICAgICAgICBzZWxmLmFzc2Vy
dFRydWUocmUubWF0Y2gocmVnZXhfbWVzc2FnZSwgZXhjZXB0aW9uLl9fc3RyX18oKSksCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgJ0V4cGVjdGVkIHJlZ2V4ICIlcyJcbkdvdCAiJXMiJyAl
IChyZWdleF9tZXNzYWdlLCBleGNlcHRpb24uX19zdHJfXygpKSkK
</data>
<flag name="review"
          id="106201"
          type_id="1"
          status="+"
          setter="eric"
    />
    <flag name="commit-queue"
          id="106204"
          type_id="3"
          status="-"
          setter="eric"
    />
          </attachment>
      

    </bug>

</bugzilla>