<?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>52136</bug_id>
          
          <creation_ts>2011-01-09 18:13:28 -0800</creation_ts>
          <short_desc>Add TestOutput classes to webkitpy.</short_desc>
          <delta_ts>2011-02-06 18:06:42 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>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>
          
          <blocked>50098</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter name="James Kozianski">koz</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abarth</cc>
    
    <cc>commit-queue</cc>
    
    <cc>dpranke</cc>
    
    <cc>eric</cc>
    
    <cc>levin</cc>
    
    <cc>mihaip</cc>
    
    <cc>ojan</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>331484</commentid>
    <comment_count>0</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2011-01-09 18:13:28 -0800</bug_when>
    <thetext>Add TestOutput classes to webkitpy.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>331495</commentid>
    <comment_count>1</comment_count>
      <attachid>78363</attachid>
    <who name="James Kozianski">koz</who>
    <bug_when>2011-01-09 18:50:58 -0800</bug_when>
    <thetext>Created attachment 78363
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>331769</commentid>
    <comment_count>2</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-01-10 11:37:48 -0800</bug_when>
    <thetext>I&apos;ll need to stare at this for longer and think about how this integrates with all the rest of our test results infrastructure (which ORWT code is using more and more, like in bug 52048).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>337091</commentid>
    <comment_count>3</comment_count>
      <attachid>79548</attachid>
    <who name="James Kozianski">koz</who>
    <bug_when>2011-01-19 20:51:13 -0800</bug_when>
    <thetext>Created attachment 79548
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>337095</commentid>
    <comment_count>4</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2011-01-19 20:53:40 -0800</bug_when>
    <thetext>I&apos;ve cut out the modifications to the port and common/net files leaving just the TestOutput classes if that will help (probably should have been two different patches in the first place).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>337096</commentid>
    <comment_count>5</comment_count>
      <attachid>79548</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-01-19 20:54:41 -0800</bug_when>
    <thetext>Comment on attachment 79548
Patch

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

&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:40
&gt; +        self._main_file = files[0]

What does _main_file mean?  is that the original test file?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>337098</commentid>
    <comment_count>6</comment_count>
      <attachid>79548</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-01-19 20:59:47 -0800</bug_when>
    <thetext>Comment on attachment 79548
Patch

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

&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:95
&gt; +    def __eq__(self, other):
&gt; +        return other != None and self.name() == other.name() and self.type() == other.type() and self.platform() == other.platform() and self.is_actual() == other.is_actual() and self.same_content(other)

Although I don&apos;t believe in wrapping just to fit on punch cards, I think some wrapping might make this mor readable.

&gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:70
&gt; +        files = []
&gt; +        for filename in self._zip_file.namelist():
&gt; +            files.append(self._zip_file.open(filename))
&gt; +        return files

This is better written as a list comprehension.

&gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:98
&gt; +        outputs = []
&gt; +        for image_file in image_files:
&gt; +            checksum_file_name = re.sub(re.compile(&apos;\.png&apos;), &apos;.checksum&apos;, image_file.name())

Anytime you&apos;re using this pattern, a helper function + a list comprehension is normally cleaner.

&gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:128
&gt; +        outputs = []
&gt; +        for builder in self._builders:
&gt; +            outputs += builder.outputs_for(name, **kwargs)
&gt; +        return outputs

list comprehension.

&gt; Tools/Scripts/webkitpy/common/net/testoutputset_unittest.py:35
&gt; +    def __str__(self):
&gt; +        return &quot;FakeZip&quot;

Why override __str__?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>337101</commentid>
    <comment_count>7</comment_count>
      <attachid>79548</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-01-19 21:12:35 -0800</bug_when>
    <thetext>Comment on attachment 79548
Patch

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

&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:46
&gt; +        if self._platform is None:
&gt; +            self._platform = self._extract_platform(filename)

I would have set platform closer to this code.

Should platform have a default argument of None in the constructor?

&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:63
&gt; +        if &apos;LayoutTests&apos; in path:
&gt; +            path = path[1 + path.index(&apos;LayoutTests&apos;):]
&gt; +        if &apos;layout-test-results&apos; in path:
&gt; +            path = path[1 + path.index(&apos;layout-test-results&apos;):]
&gt; +        if &apos;platform&apos; in path:
&gt; +            path = path[2 + path.index(&apos;platform&apos;):]

I probably would have made this a separate function.  i suspect other parts of the layout test code will eventually want to share this.  Basically you&apos;re converting from any (possibly absolute) path to a relative-to-LayoutTests path, which is useful. :)

&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:74
&gt; +        self._test_name = filename
&gt; +        if os.path.sep in filename:
&gt; +            self._test_name = filename[:filename.rindex(os.path.sep)]

This seems like os.path.basename or os.path.split, no?

&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:77
&gt; +    def contents(self):
&gt; +        return self._main_file.contents()

main_file is unclear to me, so it&apos;s difficult to know if this makes sense to have a &quot;contents&quot; function on thsi class.

&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:81
&gt; +    def save_to(self, path):
&gt; +        for file in self._files:
&gt; +            file.save_to(path)

What does save_to do?  Is this mockable?  I assume _files is a list/tuple of file objects?

&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:85
&gt; +    def is_actual(self):
&gt; +        &quot;&quot;&quot;Is this output the actual output of a test? (As opposed to expected output.)&quot;&quot;&quot;
&gt; +        return self._is_actual

Strange that this class has dual modality like this.  Do you create TestOutput instances for both the -actual and the -expetected files?  If so, why is there a _files array here and not just one-per file?  Seems a TestOutput should include outputs at once, including all the diffs, actual and expected.  But maybe I don&apos;t understand the purpose of this class yet.

&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:92
&gt; +    def same_content(self, other):
&gt; +        return self.contents() == other.contents()

I&apos;m not sure this adds much, but OK.

&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:98
&gt; +    def __hash__(self):
&gt; +        return hash(str(self.name()) + str(self.type()) + str(self.platform()))

Difficult to read __eq__ so difficult to tell if this is right, but iirc you tested it, so I trust you. :)

&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:102
&gt; +    def is_newer_than(self, other):
&gt; +        &quot;&quot;&quot;&apos;New&apos; outputs are those actually coming from a test.&quot;&quot;&quot;
&gt; +        return self.is_actual() and not other.is_actual()

I&apos;m very confused by this.

&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:105
&gt; +    def is_rebaseline_of(self, other):
&gt; +        return self.name() == other.name() and self.type() == other.type() and self.platform() == other.platform() and self.is_actual() and (not other.is_actual())

Again I think a little wrapping would help make this readable.  Just wrap right before the &quot;and&quot; would be my suggestion (at least I think before the and is webkit style... maybe it&apos;s after?  Maybe we need to check PEP8.)

&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:124
&gt; +        if self._platform is None:
&gt; +            platform_component = &quot;&quot;
&gt; +        else:
&gt; +            platform_component = &quot;platform/%s/&quot; % self._platform
&gt; +        extension = os.path.splitext(file.name())[1]
&gt; +        path = &apos;%s/%s&apos; % (path, platform_component)
&gt; +        filename = self.name() + &apos;-expected&apos; + extension

Seems like the first part of this is some sort of install_path function instead?  I could see other pieces of code wanting to have some way to generate paths from platform, file pairs, no?

Does this need to take into account platform fallback?

&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:129
&gt; +    def install(self, path):
&gt; +        for file in self._files:
&gt; +            self._install_file(file, path)

It&apos;s unclear to me what &quot;isntall&quot; means here, but I guess I don&apos;t undestand where these TestOutput objects are coming from.

&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:133
&gt; +    def delete(self):
&gt; +        for file in self._files:
&gt; +            file.delete()

Not understanding what all a TestOutput encompasses, it&apos;s difficult to know what &quot;delete&quot; is supposed to do.

&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:136
&gt; +class TextTestOutput(TestOutput):

Unclear why we have subclasses here.  Since my current understanding is that a TestOutput is all the output files for a given test from a given test run.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>337108</commentid>
    <comment_count>8</comment_count>
      <attachid>79548</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-01-19 21:24:28 -0800</bug_when>
    <thetext>Comment on attachment 79548
Patch

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

I think we need another round here.  Most helpful would be some explanation as to how TestOutput is supposed to be used.  I.e. does TestOutput encompass all of the outputs from a given test (-diffs.txt, -expected.txt, -diffs.html, -expected.checksum, etc.) or just some subset?  If so, which subset?  And what is _main_file supposed to be?  And why can it be either an expeted or an actual?

The TestOutputSet.outputs_for function is probably the most important function in this diff, since it explans how these things are supposed to be created from a layout test results archive.  But I&apos;m not sure I fully understand it yet (needs to be simplified and broken down a bit).

&gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:33
&gt; +class TestOutputSet(object):
&gt; +    &quot;&quot;&quot;A set of test outputs&quot;&quot;&quot;

So this sounds a lot like LayoutTestResults is now, no?

&gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:53
&gt; +        return AggregateTestOutputSet(output_sets)

This class doesn&apos;t exist?

&gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:57
&gt; +        z = DirectoryFileSet(path)

&quot;z&quot; isn&apos;t a very good name, and I doubt this needs to be a local anyway.

&gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:58
&gt; +        return TestOutputSet(&apos;local %s builder&apos; % platform, platform, z)

If you&apos;re worried about line length, I would have put the string in its own local before I put the file set in one.  Then agian, we don&apos;t really worry about line length in webkit.  We (intentionally) do not follow the 80c limit of PEP8.

&gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:74
&gt; +        target_type = kwargs.get(&apos;target_type&apos;, None)
&gt; +        exact_match = kwargs.get(&apos;exact_match&apos;, False)

Seems we should just list these as arguments with default values.

&gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:94
&gt; +        checksum_files = []
&gt; +        text_files = []
&gt; +        image_files = []
&gt; +        for output_file in self.files():
&gt; +            name_match = name_matcher.search(output_file.name())
&gt; +            actual_match = actual_matcher.search(output_file.name())
&gt; +            expected_match = expected_matcher.search(output_file.name())
&gt; +            if name_match and (actual_match or (self._include_expected and expected_match)):
&gt; +                if output_file.name().endswith(&apos;.checksum&apos;):
&gt; +                    checksum_files.append(output_file)
&gt; +                elif output_file.name().endswith(&apos;.txt&apos;):
&gt; +                    text_files.append(output_file)
&gt; +                elif output_file.name().endswith(&apos;.png&apos;):
&gt; +                    image_files.append(output_file)

This confuses me.  I would have made this a helper method, used a list comprehension, and then zip, to zip the returned 3-tuple into 3 separate lists.

&gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:113
&gt; +            outputs = filter(lambda r: r.name() == name, outputs)

Personally I tend to use [output for output in outputs where output.name() == name] more often than I use filter.  But filter is probably more-readable here, especially if we give &apos;r&apos; a better name (see the webkit-style guide on variable naming).

&gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:115
&gt; +        outputs = filter(lambda r: target_type is None or target_type == r.type(), outputs)

target_type in [None, r.type()]?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>337815</commentid>
    <comment_count>9</comment_count>
      <attachid>79548</attachid>
    <who name="James Kozianski">koz</who>
    <bug_when>2011-01-20 19:28:16 -0800</bug_when>
    <thetext>Comment on attachment 79548
Patch

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

&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:40
&gt;&gt; +        self._main_file = files[0]
&gt; 
&gt; What does _main_file mean?  is that the original test file?

The main file is the one that is used to derive the name of the test and also the contents of the test. So for text test outputs it&apos;s the singular .txt file, but for image outputs (that have checksums and images) we use the checksum file if it is there, or the image one as a fallback.

I&apos;ve added a comment to that effect.

&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:46
&gt;&gt; +            self._platform = self._extract_platform(filename)
&gt; 
&gt; I would have set platform closer to this code.
&gt; 
&gt; Should platform have a default argument of None in the constructor?

I moved the assignment of _platform down to here.

I kind of like having None as an indicator that you&apos;re explicitly not setting a platform, but I can change it if it&apos;s more idiomatic?

&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:63
&gt;&gt; +            path = path[2 + path.index(&apos;platform&apos;):]
&gt; 
&gt; I probably would have made this a separate function.  i suspect other parts of the layout test code will eventually want to share this.  Basically you&apos;re converting from any (possibly absolute) path to a relative-to-LayoutTests path, which is useful. :)

Any ideas where to put it? Do you mean it should be a top level function in this module?

One school of thought would be that other people shouldn&apos;t reuse this function, rather they should reuse this class :-)

&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:74
&gt;&gt; +            self._test_name = filename[:filename.rindex(os.path.sep)]
&gt; 
&gt; This seems like os.path.basename or os.path.split, no?

Yes, you&apos;re right, but I think this function is actually dead code anyway, so I&apos;ve removed it.

&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:77
&gt;&gt; +        return self._main_file.contents()
&gt; 
&gt; main_file is unclear to me, so it&apos;s difficult to know if this makes sense to have a &quot;contents&quot; function on thsi class.

A contents() function makes sense if we continue with the idea that a TestOutput is just a text output or an image output, but if we make it so that a TestOutput refers to all the different kinds of test output together then it won&apos;t be necessary.

&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:81
&gt;&gt; +            file.save_to(path)
&gt; 
&gt; What does save_to do?  Is this mockable?  I assume _files is a list/tuple of file objects?

I added the function comment &quot;&quot;&quot;Have the files in this TestOutput write themselves to the disk at the specified location.&quot;&quot;&quot;

This is mockable - just pass in fake files in the first place, and yes, _files is a list of FileSetFileHandles (as defined in webkitpy/common/system/fileset.py).

&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:85
&gt;&gt; +        return self._is_actual
&gt; 
&gt; Strange that this class has dual modality like this.  Do you create TestOutput instances for both the -actual and the -expetected files?  If so, why is there a _files array here and not just one-per file?  Seems a TestOutput should include outputs at once, including all the diffs, actual and expected.  But maybe I don&apos;t understand the purpose of this class yet.

So the reason why this class is called TestOutput instead of Result or something similar (which was its original name until Dirk suggested I change it) is because this represents the raw output of a test, not a comparison between an expected output and an actual output. So one TestOutput might be the output we expect from a test, whereas another might be the actual output from a test.

I agree that it would make sense for the run of a test to produce something more than this (I&apos;m imagining a TestResult class that contains all the things you mention), but the part encapsulated by this class still needs to be a first class concept (ie: be named), because we need to talk about expected results that don&apos;t have associated actual results and vice versa.

&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:92

&gt; 
&gt; I&apos;m not sure this adds much, but OK.

We override this function in ImageTestOutput, which has more intricate content comparison logic.

&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:95
&gt;&gt; +        return other != None and self.name() == other.name() and self.type() == other.type() and self.platform() == other.platform() and self.is_actual() == other.is_actual() and self.same_content(other)
&gt; 
&gt; Although I don&apos;t believe in wrapping just to fit on punch cards, I think some wrapping might make this mor readable.

Done.

&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:98
&gt;&gt; +        return hash(str(self.name()) + str(self.type()) + str(self.platform()))
&gt; 
&gt; Difficult to read __eq__ so difficult to tell if this is right, but iirc you tested it, so I trust you. :)

:-)

&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:102
&gt;&gt; +        return self.is_actual() and not other.is_actual()
&gt; 
&gt; I&apos;m very confused by this.

The idea is that if you have an &apos;expected&apos; output and an &apos;actual&apos; output, the &apos;actual&apos; is newer in a sense because it was presumably generated after the expectation was.

Maybe we should scrap this and just have the callers explicitly state what they want? I&apos;ll remove it and add it back in a later change if it makes things a lot cleaner.

&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:105
&gt;&gt; +        return self.name() == other.name() and self.type() == other.type() and self.platform() == other.platform() and self.is_actual() and (not other.is_actual())
&gt; 
&gt; Again I think a little wrapping would help make this readable.  Just wrap right before the &quot;and&quot; would be my suggestion (at least I think before the and is webkit style... maybe it&apos;s after?  Maybe we need to check PEP8.)

Yeah it&apos;s after the operator according to PEB8.
Done.

&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:124
&gt;&gt; +        filename = self.name() + &apos;-expected&apos; + extension
&gt; 
&gt; Seems like the first part of this is some sort of install_path function instead?  I could see other pieces of code wanting to have some way to generate paths from platform, file pairs, no?
&gt; 
&gt; Does this need to take into account platform fallback?

I extracted a _path_to_platform() function (or did you mean to make it more widely exposed)?

This doesn&apos;t need to consider platform fallback - that is handled externally. If a test output needs to be changed to a different platform then retarget() is called with a new platform.

&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:129
&gt;&gt; +            self._install_file(file, path)
&gt; 
&gt; It&apos;s unclear to me what &quot;isntall&quot; means here, but I guess I don&apos;t undestand where these TestOutput objects are coming from.

I&apos;ve added the following function comment:

&quot;&quot;&quot;Save the files of this TestOutput to the appropriate directory inside the LayoutTests directory. Typically this means that these files will be saved in &quot;LayoutTests/platform/&lt;platform&gt;/, or simply LayoutTests if the platform is None.&quot;&quot;&quot;

&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:133
&gt;&gt; +            file.delete()
&gt; 
&gt; Not understanding what all a TestOutput encompasses, it&apos;s difficult to know what &quot;delete&quot; is supposed to do.

I&apos;ve added the following function comment:

&quot;&quot;&quot;Deletes the files that comprise this TestOutput from disk. This fails if the files are virtual files (eg: the files may reside inside a remote zip file).&quot;&quot;&quot;

It&apos;s use in the code is for deleting TestOutputs that have been identified as duplicates in LayoutTests.

&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:136
&gt;&gt; +class TextTestOutput(TestOutput):
&gt; 
&gt; Unclear why we have subclasses here.  Since my current understanding is that a TestOutput is all the output files for a given test from a given test run.

With the current conception of TestOutput the run of a test would be a list of TestOutputs each with a different type.

I made it that way because it would allow me to dedupe TestOutputs on a finer granularity - this way a test might have its expected text output in a &apos;mac&apos; platform directory, but have different image outputs in &apos;mac-leopard&apos; and &apos;mac-snowleopard&apos; for example. I don&apos;t know if in a situation like that it&apos;s better to have the text output duped so there&apos;s a copy next to each image - can you advise?

&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:33
&gt;&gt; +    &quot;&quot;&quot;A set of test outputs&quot;&quot;&quot;
&gt; 
&gt; So this sounds a lot like LayoutTestResults is now, no?

Yeah, maybe. It looks like LayoutTestResults just returns names of tests, whereas this provides actual files. I can imagine the current LayoutTestResults potentially turning into a factory method on this class for creating a TestOutputSet from the results.html for a particular builder.

&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:53
&gt;&gt; +        return AggregateTestOutputSet(output_sets)
&gt; 
&gt; This class doesn&apos;t exist?

It&apos;s defined further down. As it is quite a small helper class I figured I would leave it in this file.

&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:57
&gt;&gt; +        z = DirectoryFileSet(path)
&gt; 
&gt; &quot;z&quot; isn&apos;t a very good name, and I doubt this needs to be a local anyway.

Haha yes, that is a particularly bad name. I&apos;ve inlined it as per your suggestion.

&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:58
&gt;&gt; +        return TestOutputSet(&apos;local %s builder&apos; % platform, platform, z)
&gt; 
&gt; If you&apos;re worried about line length, I would have put the string in its own local before I put the file set in one.  Then agian, we don&apos;t really worry about line length in webkit.  We (intentionally) do not follow the 80c limit of PEP8.

Right.

&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:70
&gt;&gt; +        return files
&gt; 
&gt; This is better written as a list comprehension.

Done.

&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:74
&gt;&gt; +        exact_match = kwargs.get(&apos;exact_match&apos;, False)
&gt; 
&gt; Seems we should just list these as arguments with default values.

I feel that it aids readability at the call sites to have them specified as keyword arguments.

outs.outputs_for(&apos;some-test&apos;, None, True) is harder to read than
outs.outputs_for(&apos;some-test&apos;, exact_match=True)

&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:94

&gt; 
&gt; This confuses me.  I would have made this a helper method, used a list comprehension, and then zip, to zip the returned 3-tuple into 3 separate lists.

I&apos;ve pulled this out into a helper method, but I&apos;m not sure how you mean to translate this into a list comprehension, or how zip would be helpful here. Could you clarify?

&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:98
&gt;&gt; +            checksum_file_name = re.sub(re.compile(&apos;\.png&apos;), &apos;.checksum&apos;, image_file.name())
&gt; 
&gt; Anytime you&apos;re using this pattern, a helper function + a list comprehension is normally cleaner.

Yep, that makes sense. I&apos;ve pulled out a helper function here, and removed a for loop below.

&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:113
&gt;&gt; +            outputs = filter(lambda r: r.name() == name, outputs)
&gt; 
&gt; Personally I tend to use [output for output in outputs where output.name() == name] more often than I use filter.  But filter is probably more-readable here, especially if we give &apos;r&apos; a better name (see the webkit-style guide on variable naming).

Ok. I&apos;ve changed r to output.

&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:115
&gt;&gt; +        outputs = filter(lambda r: target_type is None or target_type == r.type(), outputs)
&gt; 
&gt; target_type in [None, r.type()]?

Done.

&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:128
&gt;&gt; +        return outputs
&gt; 
&gt; list comprehension.

Done.

&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutputset_unittest.py:35
&gt;&gt; +        return &quot;FakeZip&quot;
&gt; 
&gt; Why override __str__?

Just for making debugging slightly easier to parse.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>337818</commentid>
    <comment_count>10</comment_count>
      <attachid>79684</attachid>
    <who name="James Kozianski">koz</who>
    <bug_when>2011-01-20 19:29:48 -0800</bug_when>
    <thetext>Created attachment 79684
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>338398</commentid>
    <comment_count>11</comment_count>
      <attachid>79684</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2011-01-21 15:43:51 -0800</bug_when>
    <thetext>Comment on attachment 79684
Patch

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

&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:34
&gt; +class TestOutput(object):

Do we need to call this LayoutTestOutput to distinguish it from other kinds of tests (e.g., JSC tests, Perf tests, etc.)?

Also, I think I&apos;ve mentioned this before, in another bug/context, but we use the word &quot;test&quot; to refer to two different kinds of things. 

The first is a given Layout Test (e.g., fast/html/article-element.html) -- that&apos;s the sense being used here -- and the second is one particular kind of check against the output. I.e., checking the text output, checking the image output, etc. The latter shows up in layout_tests/layout_package/test_failures, layout_tests/test_types, and in a few other places. I&apos;d really like to find a different noun for the latter kind of thing, but have yet to think of anything good. &quot;Check&quot; maybe?

At any rate, I&apos;m looking for suggestions. That said, we might want to update the docstring to this class to be clear we&apos;re talking about all of the related &quot;checks&quot; for a single &quot;test&quot;. It&apos;s possible to read this description and get slightly confused otherwise.

&gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:33
&gt; +    &quot;&quot;&quot;A set of test outputs&quot;&quot;&quot;

Maybe add a comment here that the set of test outputs is usually (always?) from a whole test run?

&gt; Tools/Scripts/webkitpy/common/net/testoutputset_unittest.py:50
&gt; +        print &quot;FakeZip&gt; cp %s %s&quot; % (filename, path)

Do you need these print statements (here and in delete())? I don&apos;t see you capturing stdout output anywhere, but maybe I&apos;m missing something. If not, you should probably delete them because generally we don&apos;t like our unit tests to print anything.

Also, maybe consider passing in a filesystem_mock object to the constructor and having extract write to that?

I need some zip-wrapper objects for writing tests for the rebaseline-chromium-webkit-tests script so we should use the same objects if possible. In which case, I&apos;d want FakeZip to be in a separate module so I can import it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>338826</commentid>
    <comment_count>12</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2011-01-23 21:34:40 -0800</bug_when>
    <thetext>(In reply to comment #11)
&gt; (From update of attachment 79684 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=79684&amp;action=review
&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/net/testoutput.py:34
&gt; &gt; +class TestOutput(object):
&gt; 
&gt; Do we need to call this LayoutTestOutput to distinguish it from other kinds of tests (e.g., JSC tests, Perf tests, etc.)?

LayoutTests seem to be the most prominent kind of tests (in webkitpy if not WebKit), so I think it would be okay to leave it unadorned, and to prefix the other TestOutput classes if we need to introduce them.

&gt; 
&gt; Also, I think I&apos;ve mentioned this before, in another bug/context, but we use the word &quot;test&quot; to refer to two different kinds of things. 
&gt; 
&gt; The first is a given Layout Test (e.g., fast/html/article-element.html) -- that&apos;s the sense being used here -- and the second is one particular kind of check against the output. I.e., checking the text output, checking the image output, etc. The latter shows up in layout_tests/layout_package/test_failures, layout_tests/test_types, and in a few other places. I&apos;d really like to find a different noun for the latter kind of thing, but have yet to think of anything good. &quot;Check&quot; maybe?

Right - test the noun and test the verb. I think Check is a good substitute for test as a verb.

&gt; 
&gt; At any rate, I&apos;m looking for suggestions. That said, we might want to update the docstring to this class to be clear we&apos;re talking about all of the related &quot;checks&quot; for a single &quot;test&quot;. It&apos;s possible to read this description and get slightly confused otherwise.

Yep, I&apos;ve clarified the comment.

&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:33
&gt; &gt; +    &quot;&quot;&quot;A set of test outputs&quot;&quot;&quot;
&gt; 
&gt; Maybe add a comment here that the set of test outputs is usually (always?) from a whole test run?

This class is actually quite generic. It can represent a set of test outputs from a buildbot, or it could be the outputs for a particular test&apos;s run, or it could be the -expected outputs in a LayoutTest directory.

&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/net/testoutputset_unittest.py:50
&gt; &gt; +        print &quot;FakeZip&gt; cp %s %s&quot; % (filename, path)
&gt; 
&gt; Do you need these print statements (here and in delete())? I don&apos;t see you capturing stdout output anywhere, but maybe I&apos;m missing something. If not, you should probably delete them because generally we don&apos;t like our unit tests to print anything.

Done.

&gt; 
&gt; Also, maybe consider passing in a filesystem_mock object to the constructor and having extract write to that?

Done.

&gt; 
&gt; I need some zip-wrapper objects for writing tests for the rebaseline-chromium-webkit-tests script so we should use the same objects if possible. In which case, I&apos;d want FakeZip to be in a separate module so I can import it.

Done, and I renamed FakeZip to MockZip to fit in with MockFileSystem.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>338830</commentid>
    <comment_count>13</comment_count>
      <attachid>79891</attachid>
    <who name="James Kozianski">koz</who>
    <bug_when>2011-01-23 21:36:55 -0800</bug_when>
    <thetext>Created attachment 79891
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>342431</commentid>
    <comment_count>14</comment_count>
      <attachid>79891</attachid>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2011-01-30 19:38:47 -0800</bug_when>
    <thetext>Comment on attachment 79891
Patch

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

This is close. Just a few more things...

&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:45
&gt; +        self._main_file = files[0]

This _main_file stuff is just confusing. It seems like you only need &quot;contents()&quot; for checking same_contents(), right? so how about getting rid of contents() and instead making same_contents abstract and have the subclasses implement it since it seems subclass specific.

&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:60
&gt; +        test_name = filename

this line doesn&apos;t seem to add much.

&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:105
&gt; +    def is_newer_than(self, other):

?

&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:128
&gt; +    def _path_to_platform(self, platform):

Why pass in platform instead of just using self._platform?

&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:135
&gt; +    def _install_file(self, file, path):

s/_install_file/_save_expected_result/ ? (see below)

&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:141
&gt; +    def install(self, path_to_layout_tests):

install is a weird word for this. how about...&quot;save_expected_results&quot;?

&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:149
&gt; +    def delete(self):

why do we need this?

&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:181
&gt; +        if self.has_checksum() and other.has_checksum():
&gt; +            return self._checksum_file.contents() == other._checksum_file.contents()

We shouldn&apos;t assume the checksums actually match the image files. It has def happened that people commit the new checksum but forget to commit the new image. In either case, a FIXME is sufficient for now.

&gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:33
&gt; +    &quot;&quot;&quot;A set of test outputs&quot;&quot;&quot;

This comment doesn&apos;t add anything over the class name. Just delete it. It&apos;s pretty clear what this class does.

&gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:129
&gt; +    def sub_builders(self):

what is &quot;sub&quot; about these builders?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>343014</commentid>
    <comment_count>15</comment_count>
      <attachid>80715</attachid>
    <who name="James Kozianski">koz</who>
    <bug_when>2011-01-31 21:26:56 -0800</bug_when>
    <thetext>Created attachment 80715
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>343015</commentid>
    <comment_count>16</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2011-01-31 21:28:53 -0800</bug_when>
    <thetext>(In reply to comment #14)
&gt; (From update of attachment 79891 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=79891&amp;action=review
&gt; 
&gt; This is close. Just a few more things...
&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/net/testoutput.py:45
&gt; &gt; +        self._main_file = files[0]
&gt; 
&gt; This _main_file stuff is just confusing. It seems like you only need &quot;contents()&quot; for checking same_contents(), right? so how about getting rid of contents() and instead making same_contents abstract and have the subclasses implement it since it seems subclass specific.

Done.

&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/net/testoutput.py:60
&gt; &gt; +        test_name = filename
&gt; 
&gt; this line doesn&apos;t seem to add much.

Removed.

&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/net/testoutput.py:105
&gt; &gt; +    def is_newer_than(self, other):
&gt; 
&gt; ?

This is useful for rebaselining - if one TestOutput is &apos;newer&apos; than the other, then it means that we can overwrite the old one.

&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/net/testoutput.py:128
&gt; &gt; +    def _path_to_platform(self, platform):
&gt; 
&gt; Why pass in platform instead of just using self._platform?

A previous comment from eseidel: &quot;Seems like the first part of this is some sort of install_path function instead?  I could see other pieces of code wanting to have some way to generate paths from platform, file pairs, no?&quot;

It seems like overkill to put it such a function in its own module though (and where exactly such a module would be put is another question).

&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/net/testoutput.py:135
&gt; &gt; +    def _install_file(self, file, path):
&gt; 
&gt; s/_install_file/_save_expected_result/ ? (see below)

Done.

&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/net/testoutput.py:141
&gt; &gt; +    def install(self, path_to_layout_tests):
&gt; 
&gt; install is a weird word for this. how about...&quot;save_expected_results&quot;?

Done.

&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/net/testoutput.py:149
&gt; &gt; +    def delete(self):
&gt; 
&gt; why do we need this?

For deleting duplicate TestOutputs.

&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/net/testoutput.py:181
&gt; &gt; +        if self.has_checksum() and other.has_checksum():
&gt; &gt; +            return self._checksum_file.contents() == other._checksum_file.contents()
&gt; 
&gt; We shouldn&apos;t assume the checksums actually match the image files. It has def happened that people commit the new checksum but forget to commit the new image. In either case, a FIXME is sufficient for now.

So we should ignore checksums then? (FIXME added).

&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:33
&gt; &gt; +    &quot;&quot;&quot;A set of test outputs&quot;&quot;&quot;
&gt; 
&gt; This comment doesn&apos;t add anything over the class name. Just delete it. It&apos;s pretty clear what this class does.

Done.

&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:129
&gt; &gt; +    def sub_builders(self):
&gt; 
&gt; what is &quot;sub&quot; about these builders?

Yeah, it should just be builders, huh?
Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>343051</commentid>
    <comment_count>17</comment_count>
      <attachid>79891</attachid>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2011-01-31 23:41:33 -0800</bug_when>
    <thetext>Comment on attachment 79891
Patch

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

&gt;&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:105
&gt;&gt;&gt; +    def is_newer_than(self, other):
&gt;&gt; 
&gt;&gt; ?
&gt; 
&gt; This is useful for rebaselining - if one TestOutput is &apos;newer&apos; than the other, then it means that we can overwrite the old one.

As we said in person is_rebaseline_of is more clear and serves the same purpose.

&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:111
&gt; +    def is_rebaseline_of(self, other):

s/is_rebaseline_of/is_new_baseline_for/ ?

&gt;&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:128
&gt;&gt;&gt; +    def _path_to_platform(self, platform):
&gt;&gt; 
&gt;&gt; Why pass in platform instead of just using self._platform?
&gt; 
&gt; A previous comment from eseidel: &quot;Seems like the first part of this is some sort of install_path function instead?  I could see other pieces of code wanting to have some way to generate paths from platform, file pairs, no?&quot;
&gt; 
&gt; It seems like overkill to put it such a function in its own module though (and where exactly such a module would be put is another question).

But this function doesn&apos;t take platform/file pairs, it just takes the platform. I see what Eric&apos;s original comment was getting at, but I don&apos;t think it actually makes sense. It would if we were ultimately creating just a single string. But we&apos;re creating a path and a filename. In either case, I think having this as a separate function is easier to read, but it&apos;s not useful enough to try to make generic. Certainly as is, it doesn&apos;t make sense to me to pass in platform as an argument.

It&apos;s not a big deal either way though.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>343052</commentid>
    <comment_count>18</comment_count>
      <attachid>80715</attachid>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2011-01-31 23:42:25 -0800</bug_when>
    <thetext>Comment on attachment 80715
Patch

r+ once you address comment 17.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>345303</commentid>
    <comment_count>19</comment_count>
      <attachid>81183</attachid>
    <who name="James Kozianski">koz</who>
    <bug_when>2011-02-03 20:52:50 -0800</bug_when>
    <thetext>Created attachment 81183
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>345305</commentid>
    <comment_count>20</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2011-02-03 20:55:07 -0800</bug_when>
    <thetext>(In reply to comment #17)
&gt; (From update of attachment 79891 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=79891&amp;action=review
&gt; 
&gt; &gt;&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:105
&gt; &gt;&gt;&gt; +    def is_newer_than(self, other):
&gt; &gt;&gt; 
&gt; &gt;&gt; ?
&gt; &gt; 
&gt; &gt; This is useful for rebaselining - if one TestOutput is &apos;newer&apos; than the other, then it means that we can overwrite the old one.
&gt; 
&gt; As we said in person is_rebaseline_of is more clear and serves the same purpose.

Done.

&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/net/testoutput.py:111
&gt; &gt; +    def is_rebaseline_of(self, other):
&gt; 
&gt; s/is_rebaseline_of/is_new_baseline_for/ ?

Done.

&gt; 
&gt; &gt;&gt;&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:128
&gt; &gt;&gt;&gt; +    def _path_to_platform(self, platform):
&gt; &gt;&gt; 
&gt; &gt;&gt; Why pass in platform instead of just using self._platform?
&gt; &gt; 
&gt; &gt; A previous comment from eseidel: &quot;Seems like the first part of this is some sort of install_path function instead?  I could see other pieces of code wanting to have some way to generate paths from platform, file pairs, no?&quot;
&gt; &gt; 
&gt; &gt; It seems like overkill to put it such a function in its own module though (and where exactly such a module would be put is another question).
&gt; 
&gt; But this function doesn&apos;t take platform/file pairs, it just takes the platform. I see what Eric&apos;s original comment was getting at, but I don&apos;t think it actually makes sense. It would if we were ultimately creating just a single string. But we&apos;re creating a path and a filename. In either case, I think having this as a separate function is easier to read, but it&apos;s not useful enough to try to make generic. Certainly as is, it doesn&apos;t make sense to me to pass in platform as an argument.
&gt; 
&gt; It&apos;s not a big deal either way though.

Yep. Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>345306</commentid>
    <comment_count>21</comment_count>
      <attachid>81184</attachid>
    <who name="James Kozianski">koz</who>
    <bug_when>2011-02-03 20:55:53 -0800</bug_when>
    <thetext>Created attachment 81184
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>346391</commentid>
    <comment_count>22</comment_count>
      <attachid>81184</attachid>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2011-02-06 15:38:21 -0800</bug_when>
    <thetext>Comment on attachment 81184
Patch

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

Just a couple more nits I noticed. Sorry. :)

&gt; Tools/Scripts/webkitpy/common/net/testoutput.py:95
&gt; +    def is_new_rebaseline_for(self, other):

is_new_baseline_for? a &quot;rebaseline&quot; is not really a thing. :)

&gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:79
&gt; +            if name_match and (actual_match or (self._include_expected and expected_match)):

nit: typical webkit style for this would be to invert the if clause and add a continue. makes for less deeply nested indents and arguably more readable code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>346400</commentid>
    <comment_count>23</comment_count>
    <who name="James Kozianski">koz</who>
    <bug_when>2011-02-06 16:26:38 -0800</bug_when>
    <thetext>(In reply to comment #22)
&gt; (From update of attachment 81184 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=81184&amp;action=review
&gt; 
&gt; Just a couple more nits I noticed. Sorry. :)

It&apos;s cool :-)

&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/net/testoutput.py:95
&gt; &gt; +    def is_new_rebaseline_for(self, other):
&gt; 
&gt; is_new_baseline_for? a &quot;rebaseline&quot; is not really a thing. :)

Done.

&gt; 
&gt; &gt; Tools/Scripts/webkitpy/common/net/testoutputset.py:79
&gt; &gt; +            if name_match and (actual_match or (self._include_expected and expected_match)):
&gt; 
&gt; nit: typical webkit style for this would be to invert the if clause and add a continue. makes for less deeply nested indents and arguably more readable code.

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>346402</commentid>
    <comment_count>24</comment_count>
      <attachid>81433</attachid>
    <who name="James Kozianski">koz</who>
    <bug_when>2011-02-06 16:29:47 -0800</bug_when>
    <thetext>Created attachment 81433
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>346405</commentid>
    <comment_count>25</comment_count>
      <attachid>81433</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2011-02-06 17:01:06 -0800</bug_when>
    <thetext>Comment on attachment 81433
Patch

Clearing flags on attachment: 81433

Committed r77780: &lt;http://trac.webkit.org/changeset/77780&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>346406</commentid>
    <comment_count>26</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2011-02-06 17:01:13 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>346422</commentid>
    <comment_count>27</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-02-06 18:06:42 -0800</bug_when>
    <thetext>http://trac.webkit.org/changeset/77780 might have broken GTK Linux 64-bit Debug</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>78363</attachid>
            <date>2011-01-09 18:50:58 -0800</date>
            <delta_ts>2011-01-19 20:51:07 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-52136-20110110135056.patch</filename>
            <type>text/plain</type>
            <size>34191</size>
            <attacher name="James Kozianski">koz</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rvb2xzL0NoYW5nZUxvZwppbmRleCA5ZDg3
OTE3N2JhZDUxYzM4MzMwYzYxMWIyZGY0OWU3N2VmMGMyNTZmLi45MWZjMmNmMDlkODI2MDc3Mzdh
ZjdlM2RkZTI0NjZhOTU5MmM0NDVkIDEwMDY0NAotLS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIv
VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjEgQEAKKzIwMTEtMDEtMDkgIEphbWVzIEtvemlh
bnNraSAgPGtvekBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgQWRkIGNsYXNzZXMgZm9yIHJlcHJlc2VudGluZyB0ZXN0IG91dHB1
dHMuCisKKyAgICAgICAgVGhlc2UgY2xhc3NlcyB3aWxsIG1ha2UgaXQgbXVjaCBlYXNpZXIgdG8g
d3JpdGUgc2NyaXB0cyB0aGF0IGRlYWwgd2l0aAorICAgICAgICB0ZXN0IG91dHB1dHMgc3VjaCBh
cyByZWJhc2VsaW5pbmcgYW5kIGRlZHVwaW5nIHNjcmlwdHMuCisKKyAgICAgICAgKiBTY3JpcHRz
L3dlYmtpdHB5L2NvbW1vbi9uZXQvYnVpbGRib3QvYnVpbGRib3QucHk6CisgICAgICAgICogU2Ny
aXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Rlc3RvdXRwdXQucHk6IEFkZGVkLgorICAgICAgICAq
IFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0cHV0X3VuaXR0ZXN0LnB5OiBBZGRl
ZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dHNldC5w
eTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Rlc3RvdXRw
dXRzZXRfdW5pdHRlc3QucHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5
b3V0X3Rlc3RzL3BvcnQvYmFzZS5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2xheW91
dF90ZXN0cy9wb3J0L2Nocm9taXVtLnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvbGF5
b3V0X3Rlc3RzL3BvcnQvd2Via2l0LnB5OgorCiAyMDExLTAxLTA4ICBCZW5qYW1pbiBQb3VsYWlu
ICA8YmVuamFtaW4ucG91bGFpbkBub2tpYS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgS2Vu
bmV0aCBSb2hkZSBDaHJpc3RpYW5zZW4uCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtp
dHB5L2NvbW1vbi9uZXQvYnVpbGRib3QvYnVpbGRib3QucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtp
dHB5L2NvbW1vbi9uZXQvYnVpbGRib3QvYnVpbGRib3QucHkKaW5kZXggOThlMmZhZTc4NGYyOTlm
MGUwNTk1MzY2NmY4YjIxZTc3M2Y3ZjYxZi4uOTcwZjk4ZTMwNWEyYzdmMjUzMmFiMWZjOTdkZGFh
NGJlMjAyM2JjZCAxMDA2NDQKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0
L2J1aWxkYm90L2J1aWxkYm90LnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9u
L25ldC9idWlsZGJvdC9idWlsZGJvdC5weQpAQCAtNDIsOSArNDIsMTEgQEAgaW1wb3J0IHVybGxp
YjIKIGZyb20gd2Via2l0cHkuY29tbW9uLm5ldC5mYWlsdXJlbWFwIGltcG9ydCBGYWlsdXJlTWFw
CiBmcm9tIHdlYmtpdHB5LmNvbW1vbi5uZXQubGF5b3V0dGVzdHJlc3VsdHMgaW1wb3J0IExheW91
dFRlc3RSZXN1bHRzCiBmcm9tIHdlYmtpdHB5LmNvbW1vbi5uZXQucmVncmVzc2lvbndpbmRvdyBp
bXBvcnQgUmVncmVzc2lvbldpbmRvdworZnJvbSB3ZWJraXRweS5jb21tb24ubmV0LnRlc3RvdXRw
dXRzZXQgaW1wb3J0IFRlc3RPdXRwdXRTZXQKIGZyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS5s
b2d1dGlscyBpbXBvcnQgZ2V0X2xvZ2dlcgotZnJvbSB3ZWJraXRweS50aGlyZHBhcnR5LmF1dG9p
bnN0YWxsZWQubWVjaGFuaXplIGltcG9ydCBCcm93c2VyCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5z
eXN0ZW0uemlwZmlsZXNldCBpbXBvcnQgWmlwRmlsZVNldAogZnJvbSB3ZWJraXRweS50aGlyZHBh
cnR5LkJlYXV0aWZ1bFNvdXAgaW1wb3J0IEJlYXV0aWZ1bFNvdXAKK2Zyb20gd2Via2l0cHkudGhp
cmRwYXJ0eS5hdXRvaW5zdGFsbGVkLm1lY2hhbml6ZSBpbXBvcnQgQnJvd3NlcgogCiBfbG9nID0g
Z2V0X2xvZ2dlcihfX2ZpbGVfXykKIApAQCAtOTIsNiArOTQsMTIgQEAgY2xhc3MgQnVpbGRlcihv
YmplY3QpOgogICAgICAgICBzZWxmLl9idWlsZHNfY2FjaGVbYnVpbGRfbnVtYmVyXSA9IGJ1aWxk
CiAgICAgICAgIHJldHVybiBidWlsZAogCisgICAgZGVmIGxhdGVzdF9idWlsZChzZWxmKToKKyAg
ICAgICAgcmV2aXNpb25fYnVpbGRfcGFpcnMgPSBzZWxmLnJldmlzaW9uX2J1aWxkX3BhaXJzX3dp
dGhfcmVzdWx0cygpCisgICAgICAgIHJldmlzaW9uX2J1aWxkX3BhaXJzLnNvcnQoa2V5PWxhbWJk
YSBpOiBpWzFdKQorICAgICAgICBsYXRlc3RfYnVpbGRfbnVtYmVyID0gcmV2aXNpb25fYnVpbGRf
cGFpcnNbLTFdWzFdCisgICAgICAgIHJldHVybiBzZWxmLmJ1aWxkKGxhdGVzdF9idWlsZF9udW1i
ZXIpCisKICAgICBkZWYgZm9yY2VfYnVpbGQoc2VsZiwgdXNlcm5hbWU9IndlYmtpdC1wYXRjaCIs
IGNvbW1lbnRzPU5vbmUpOgogICAgICAgICBkZWYgcHJlZGljYXRlKGZvcm0pOgogICAgICAgICAg
ICAgdHJ5OgpAQCAtMjIxLDYgKzIyOSwxMiBAQCBjbGFzcyBCdWlsZChvYmplY3QpOgogICAgICAg
ICByZXN1bHRzX2RpcmVjdG9yeSA9ICJyJXMgKCVzKSIgJSAoc2VsZi5yZXZpc2lvbigpLCBzZWxm
Ll9udW1iZXIpCiAgICAgICAgIHJldHVybiAiJXMvJXMiICUgKHNlbGYuX2J1aWxkZXIucmVzdWx0
c191cmwoKSwgdXJsbGliLnF1b3RlKHJlc3VsdHNfZGlyZWN0b3J5KSkKIAorICAgIGRlZiByZXN1
bHRzX3ppcF91cmwoc2VsZik6CisgICAgICAgIHJldHVybiAiJXMuemlwIiAlIHNlbGYucmVzdWx0
c191cmwoKQorCisgICAgZGVmIHRlc3Rfb3V0cHV0cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFRl
c3RPdXRwdXRTZXQoc2VsZi5fYnVpbGRlci5uYW1lKCksIE5vbmUsIFppcEZpbGVTZXQoc2VsZi5y
ZXN1bHRzX3ppcF91cmwoKSksIGluY2x1ZGVfZXhwZWN0ZWQ9RmFsc2UpCisKICAgICBkZWYgX2Zl
dGNoX3Jlc3VsdHNfaHRtbChzZWxmKToKICAgICAgICAgcmVzdWx0c19odG1sID0gIiVzL3Jlc3Vs
dHMuaHRtbCIgJSAoc2VsZi5yZXN1bHRzX3VybCgpKQogICAgICAgICAjIEZJWE1FOiBUaGlzIHNo
b3VsZCB1c2UgTmV0d29ya1RyYW5zYWN0aW9uJ3MgNDA0IGhhbmRsaW5nIGluc3RlYWQuCmRpZmYg
LS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dC5weSBi
L1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0cHV0LnB5Cm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLjRmNmQ3MGNhMDhhZWZiMWYyMGE1ZThlYzQyNmY3YmEzODRmNzNjM2UKLS0tIC9kZXYvbnVs
bAorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dC5weQpA
QCAtMCwwICsxLDE2NyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykg
MjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMg
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAg
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElT
IiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMg
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorCitpbXBvcnQgb3MKK2ltcG9ydCByZQorCisKK2NsYXNzIE5haXZlSW1h
Z2VEaWZmZXIob2JqZWN0KToKKyAgICBkZWYgc2FtZV9pbWFnZShzZWxmLCBpbWcxLCBpbWcyKToK
KyAgICAgICAgcmV0dXJuIGltZzEgPT0gaW1nMgorCisKK2NsYXNzIFRlc3RPdXRwdXQob2JqZWN0
KToKKyAgICAiIiJSZXByZXNlbnRzIHRoZSBvdXRwdXQgb2YgYSBzaW5nbGUgdGVzdCBvbiBhIHNp
bmdsZSBwbGF0Zm9ybSIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwbGF0Zm9ybSwgb3V0cHV0
X3R5cGUsIGZpbGVzKToKKyAgICAgICAgc2VsZi5fcGxhdGZvcm0gPSBwbGF0Zm9ybQorICAgICAg
ICBzZWxmLl9vdXRwdXRfdHlwZSA9IG91dHB1dF90eXBlCisgICAgICAgIHNlbGYuX2ZpbGVzID0g
ZmlsZXMKKyAgICAgICAgc2VsZi5fbWFpbl9maWxlID0gZmlsZXNbMF0KKyAgICAgICAgZmlsZW5h
bWUgPSBzZWxmLl9tYWluX2ZpbGUubmFtZSgpCisgICAgICAgIHNlbGYuX25hbWUgPSBzZWxmLl9l
eHRyYWN0X3Rlc3RfbmFtZShmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5faXNfYWN0dWFsID0gJy1h
Y3R1YWwuJyBpbiBmaWxlbmFtZQorCisgICAgICAgIGlmIHNlbGYuX3BsYXRmb3JtIGlzIE5vbmU6
CisgICAgICAgICAgICBzZWxmLl9wbGF0Zm9ybSA9IHNlbGYuX2V4dHJhY3RfcGxhdGZvcm0oZmls
ZW5hbWUpCisKKyAgICBkZWYgX2V4dHJhY3RfcGxhdGZvcm0oc2VsZiwgZmlsZW5hbWUpOgorICAg
ICAgICAiIiJDYWxjdWxhdGVzIHRoZSBwbGF0Zm9ybSBmcm9tIHRoZSBuYW1lIG9mIHRoZSBmaWxl
IGlmIGl0IGlzbid0IGtub3duIGFscmVhZHkiIiIKKyAgICAgICAgcGF0aCA9IHJlLnNwbGl0KG9z
LnBhdGguc2VwLCBmaWxlbmFtZSkKKyAgICAgICAgaWYgJ3BsYXRmb3JtJyBpbiBwYXRoOgorICAg
ICAgICAgICAgcmV0dXJuIHBhdGhbcGF0aC5pbmRleCgncGxhdGZvcm0nKSArIDFdCisgICAgICAg
IHJldHVybiBOb25lCisKKyAgICBkZWYgX2V4dHJhY3RfdGVzdF9uYW1lKHNlbGYsIGZpbGVuYW1l
KToKKyAgICAgICAgdGVzdF9uYW1lID0gZmlsZW5hbWUKKyAgICAgICAgcGF0aCA9IHJlLnNwbGl0
KG9zLnBhdGguc2VwLCB0ZXN0X25hbWUpCisgICAgICAgIGlmICdMYXlvdXRUZXN0cycgaW4gcGF0
aDoKKyAgICAgICAgICAgIHBhdGggPSBwYXRoWzEgKyBwYXRoLmluZGV4KCdMYXlvdXRUZXN0cycp
Ol0KKyAgICAgICAgaWYgJ2xheW91dC10ZXN0LXJlc3VsdHMnIGluIHBhdGg6CisgICAgICAgICAg
ICBwYXRoID0gcGF0aFsxICsgcGF0aC5pbmRleCgnbGF5b3V0LXRlc3QtcmVzdWx0cycpOl0KKyAg
ICAgICAgaWYgJ3BsYXRmb3JtJyBpbiBwYXRoOgorICAgICAgICAgICAgcGF0aCA9IHBhdGhbMiAr
IHBhdGguaW5kZXgoJ3BsYXRmb3JtJyk6XQorCisgICAgICAgIHRlc3RfbmFtZSA9IHBhdGhbLTFd
CisgICAgICAgIHRlc3RfbmFtZSA9IHJlLnN1YignLWV4cGVjdGVkXC4uKiQnLCAnJywgdGVzdF9u
YW1lKQorICAgICAgICB0ZXN0X25hbWUgPSByZS5zdWIoJy1hY3R1YWxcLi4qJCcsICcnLCB0ZXN0
X25hbWUpCisgICAgICAgIHBhdGhbLTFdID0gdGVzdF9uYW1lCisgICAgICAgIHJldHVybiBvcy5w
YXRoLnNlcC5qb2luKHBhdGgpCisKKyAgICBkZWYgX3NldF90ZXN0X25hbWUoc2VsZiwgZmlsZW5h
bWUpOgorICAgICAgICBzZWxmLl90ZXN0X25hbWUgPSBmaWxlbmFtZQorICAgICAgICBpZiBvcy5w
YXRoLnNlcCBpbiBmaWxlbmFtZToKKyAgICAgICAgICAgIHNlbGYuX3Rlc3RfbmFtZSA9IGZpbGVu
YW1lWzpmaWxlbmFtZS5yaW5kZXgob3MucGF0aC5zZXApXQorCisgICAgZGVmIGNvbnRlbnRzKHNl
bGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fbWFpbl9maWxlLmNvbnRlbnRzKCkKKworICAgIGRl
ZiBzYXZlX3RvKHNlbGYsIHBhdGgpOgorICAgICAgICBmb3IgZmlsZSBpbiBzZWxmLl9maWxlczoK
KyAgICAgICAgICAgIGZpbGUuc2F2ZV90byhwYXRoKQorCisgICAgZGVmIGlzX2FjdHVhbChzZWxm
KToKKyAgICAgICAgIiIiSXMgdGhpcyBvdXRwdXQgdGhlIGFjdHVhbCBvdXRwdXQgb2YgYSB0ZXN0
PyAoQXMgb3Bwb3NlZCB0byBleHBlY3RlZCBvdXRwdXQuKSIiIgorICAgICAgICByZXR1cm4gc2Vs
Zi5faXNfYWN0dWFsCisKKyAgICBkZWYgbmFtZShzZWxmKToKKyAgICAgICAgIiIiVGhlIG5hbWUg
b2YgdGhpcyB0ZXN0IChkb2Vzbid0IGluY2x1ZGUgZXh0ZW5zaW9uKSIiIgorICAgICAgICByZXR1
cm4gc2VsZi5fbmFtZQorCisgICAgZGVmIHNhbWVfY29udGVudChzZWxmLCBvdGhlcik6CisgICAg
ICAgIHJldHVybiBzZWxmLmNvbnRlbnRzKCkgPT0gb3RoZXIuY29udGVudHMoKQorCisgICAgZGVm
IF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBvdGhlciAhPSBOb25lIGFuZCBz
ZWxmLm5hbWUoKSA9PSBvdGhlci5uYW1lKCkgYW5kIHNlbGYudHlwZSgpID09IG90aGVyLnR5cGUo
KSBhbmQgc2VsZi5wbGF0Zm9ybSgpID09IG90aGVyLnBsYXRmb3JtKCkgYW5kIHNlbGYuaXNfYWN0
dWFsKCkgPT0gb3RoZXIuaXNfYWN0dWFsKCkgYW5kIHNlbGYuc2FtZV9jb250ZW50KG90aGVyKQor
CisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gaGFzaChzdHIoc2VsZi5u
YW1lKCkpICsgc3RyKHNlbGYudHlwZSgpKSArIHN0cihzZWxmLnBsYXRmb3JtKCkpKQorCisgICAg
ZGVmIGlzX25ld2VyX3RoYW4oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiInTmV3JyBvdXRwdXRz
IGFyZSB0aG9zZSBhY3R1YWxseSBjb21pbmcgZnJvbSBhIHRlc3QuIiIiCisgICAgICAgIHJldHVy
biBzZWxmLmlzX2FjdHVhbCgpIGFuZCBub3Qgb3RoZXIuaXNfYWN0dWFsKCkKKworICAgIGRlZiBp
c19yZWJhc2VsaW5lX29mKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYubmFtZSgp
ID09IG90aGVyLm5hbWUoKSBhbmQgc2VsZi50eXBlKCkgPT0gb3RoZXIudHlwZSgpIGFuZCBzZWxm
LnBsYXRmb3JtKCkgPT0gb3RoZXIucGxhdGZvcm0oKSBhbmQgc2VsZi5pc19hY3R1YWwoKSBhbmQg
KG5vdCBvdGhlci5pc19hY3R1YWwoKSkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAg
ICBhY3R1YWxfc3RyID0gJ1tBXSAnIGlmIHNlbGYuaXNfYWN0dWFsKCkgZWxzZSAnJworICAgICAg
ICByZXR1cm4gIlRlc3RPdXRwdXRbJXMvJXNdICVzJXMiICUgKHNlbGYuX3BsYXRmb3JtLCBzZWxm
Ll9vdXRwdXRfdHlwZSwgYWN0dWFsX3N0ciwgc2VsZi5uYW1lKCkpCisKKyAgICBkZWYgdHlwZShz
ZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX291dHB1dF90eXBlCisKKyAgICBkZWYgcGxhdGZv
cm0oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wbGF0Zm9ybQorCisgICAgZGVmIF9pbnN0
YWxsX2ZpbGUoc2VsZiwgZmlsZSwgcGF0aCk6CisgICAgICAgIGlmIHNlbGYuX3BsYXRmb3JtIGlz
IE5vbmU6CisgICAgICAgICAgICBwbGF0Zm9ybV9jb21wb25lbnQgPSAiIgorICAgICAgICBlbHNl
OgorICAgICAgICAgICAgcGxhdGZvcm1fY29tcG9uZW50ID0gInBsYXRmb3JtLyVzLyIgJSBzZWxm
Ll9wbGF0Zm9ybQorICAgICAgICBleHRlbnNpb24gPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGUubmFt
ZSgpKVsxXQorICAgICAgICBwYXRoID0gJyVzLyVzJyAlIChwYXRoLCBwbGF0Zm9ybV9jb21wb25l
bnQpCisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5uYW1lKCkgKyAnLWV4cGVjdGVkJyArIGV4dGVu
c2lvbgorICAgICAgICBmaWxlLnNhdmVfdG8ocGF0aCwgZmlsZW5hbWUpCisKKyAgICBkZWYgaW5z
dGFsbChzZWxmLCBwYXRoKToKKyAgICAgICAgZm9yIGZpbGUgaW4gc2VsZi5fZmlsZXM6CisgICAg
ICAgICAgICBzZWxmLl9pbnN0YWxsX2ZpbGUoZmlsZSwgcGF0aCkKKworICAgIGRlZiBkZWxldGUo
c2VsZik6CisgICAgICAgIGZvciBmaWxlIGluIHNlbGYuX2ZpbGVzOgorICAgICAgICAgICAgZmls
ZS5kZWxldGUoKQorCisKK2NsYXNzIFRleHRUZXN0T3V0cHV0KFRlc3RPdXRwdXQpOgorICAgICIi
IlJlcHJlc2VudHMgYSB0ZXh0IG91dHB1dCBvZiBhIHNpbmdsZSB0ZXN0IG9uIGEgc2luZ2xlIHBs
YXRmb3JtIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBsYXRmb3JtLCB0ZXh0X2ZpbGUpOgor
ICAgICAgICBzZWxmLl90ZXh0X2ZpbGUgPSB0ZXh0X2ZpbGUKKyAgICAgICAgVGVzdE91dHB1dC5f
X2luaXRfXyhzZWxmLCBwbGF0Zm9ybSwgJ3RleHQnLCBbdGV4dF9maWxlXSkKKworICAgIGRlZiBy
ZXRhcmdldChzZWxmLCBwbGF0Zm9ybSk6CisgICAgICAgIHJldHVybiBUZXh0VGVzdE91dHB1dChw
bGF0Zm9ybSwgc2VsZi5fdGV4dF9maWxlKQorCisKK2NsYXNzIEltYWdlVGVzdE91dHB1dChUZXN0
T3V0cHV0KToKKyAgICBpbWFnZV9kaWZmZXIgPSBOYWl2ZUltYWdlRGlmZmVyKCkKKyAgICAiIiJS
ZXByZXNlbnRzIGFuIGltYWdlIG91dHB1dCBvZiBhIHNpbmdsZSB0ZXN0IG9uIGEgc2luZ2xlIHBs
YXRmb3JtIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBsYXRmb3JtLCBpbWFnZV9maWxlLCBj
aGVja3N1bV9maWxlKToKKyAgICAgICAgc2VsZi5fY2hlY2tzdW1fZmlsZSA9IGNoZWNrc3VtX2Zp
bGUKKyAgICAgICAgc2VsZi5faW1hZ2VfZmlsZSA9IGltYWdlX2ZpbGUKKyAgICAgICAgZmlsZXMg
PSBmaWx0ZXIoYm9vbCwgW3NlbGYuX2NoZWNrc3VtX2ZpbGUsIHNlbGYuX2ltYWdlX2ZpbGVdKQor
ICAgICAgICBUZXN0T3V0cHV0Ll9faW5pdF9fKHNlbGYsIHBsYXRmb3JtLCAnaW1hZ2UnLCBmaWxl
cykKKworICAgIGRlZiBoYXNfY2hlY2tzdW0oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9j
aGVja3N1bV9maWxlIGlzIG5vdCBOb25lCisKKyAgICBkZWYgc2FtZV9jb250ZW50KHNlbGYsIG90
aGVyKToKKyAgICAgICAgaWYgc2VsZi5oYXNfY2hlY2tzdW0oKSBhbmQgb3RoZXIuaGFzX2NoZWNr
c3VtKCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY2hlY2tzdW1fZmlsZS5jb250ZW50cygp
ID09IG90aGVyLl9jaGVja3N1bV9maWxlLmNvbnRlbnRzKCkKKyAgICAgICAgZWxzZToKKyAgICAg
ICAgICAgIHNlbGZfY29udGVudHMgPSBzZWxmLl9pbWFnZV9maWxlLmNvbnRlbnRzKCkKKyAgICAg
ICAgICAgIG90aGVyX2NvbnRlbnRzID0gb3RoZXIuX2ltYWdlX2ZpbGUuY29udGVudHMoKQorICAg
ICAgICAgICAgcmV0dXJuIEltYWdlVGVzdE91dHB1dC5pbWFnZV9kaWZmZXIuc2FtZV9pbWFnZShz
ZWxmX2NvbnRlbnRzLCBvdGhlcl9jb250ZW50cykKKworICAgIGRlZiByZXRhcmdldChzZWxmLCBw
bGF0Zm9ybSk6CisgICAgICAgIHJldHVybiBJbWFnZVRlc3RPdXRwdXQocGxhdGZvcm0sIHNlbGYu
X2ltYWdlX2ZpbGUsIHNlbGYuX2NoZWNrc3VtX2ZpbGUpCmRpZmYgLS1naXQgYS9Ub29scy9TY3Jp
cHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dF91bml0dGVzdC5weSBiL1Rvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0cHV0X3VuaXR0ZXN0LnB5Cm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLmQxNmI5ZDhkZDFiYmIwOWFiYjIwZmQyMTUwOWE5NTQ3NTkzNDFlNjUKLS0tIC9kZXYvbnVs
bAorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dF91bml0
dGVzdC5weQpAQCAtMCwwICsxLDEzMyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHly
aWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisj
CisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRP
UlMgIkFTIElTIiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQor
IyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQgcmUKK2ltcG9ydCB0ZXN0b3V0cHV0Citp
bXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBGYWtlRmlsZShvYmplY3QpOgorICAgIGRlZiBfX2lu
aXRfXyhzZWxmLCBmaWxlbmFtZSwgY29udGVudHM9ImZha2UgY29udGVudHMiKToKKyAgICAgICAg
c2VsZi5fZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBzZWxmLl9jb250ZW50cyA9IGNvbnRl
bnRzCisKKyAgICBkZWYgbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGVuYW1l
CisKKyAgICBkZWYgY29udGVudHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jb250ZW50
cworCisKK2NsYXNzIEZha2VUZXN0T3V0cHV0KHRlc3RvdXRwdXQuVGVzdE91dHB1dCk6CisgICAg
ZGVmIF9faW5pdF9fKHNlbGYsIHBsYXRmb3JtLCBvdXRwdXRfdHlwZSwgY29udGVudHMsIGlzX2V4
cGVjdGVkPUZhbHNlKToKKyAgICAgICAgc2VsZi5fb3V0cHV0X3R5cGUgPSBvdXRwdXRfdHlwZQor
ICAgICAgICBzZWxmLl9jb250ZW50cyA9IGNvbnRlbnRzCisgICAgICAgIHNlbGYuX2lzX2V4cGVj
dGVkID0gaXNfZXhwZWN0ZWQKKyAgICAgICAgYWN0dWFsID0gJ2FjdHVhbCcKKyAgICAgICAgaWYg
aXNfZXhwZWN0ZWQ6CisgICAgICAgICAgICBhY3R1YWwgPSAnZXhwZWN0ZWQnCisgICAgICAgIHRl
c3RfbmFtZSA9ICdhbm9ueW1vdXMtdGVzdC0lcy50eHQnICUgYWN0dWFsCisgICAgICAgIGZpbGUg
PSBGYWtlRmlsZSh0ZXN0X25hbWUsIGNvbnRlbnRzKQorICAgICAgICBzdXBlcihGYWtlVGVzdE91
dHB1dCwgc2VsZikuX19pbml0X18ocGxhdGZvcm0sIG91dHB1dF90eXBlLCBbZmlsZV0pCisKKyAg
ICBkZWYgY29udGVudHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jb250ZW50cworCisg
ICAgZGVmIHJldGFyZ2V0KHNlbGYsIHBsYXRmb3JtKToKKyAgICAgICAgcmV0dXJuIEZha2VUZXN0
T3V0cHV0KHBsYXRmb3JtLCBzZWxmLl9vdXRwdXRfdHlwZSwgc2VsZi5fY29udGVudHMsIHNlbGYu
X2lzX2V4cGVjdGVkKQorCisKK2NsYXNzIFRlc3RPdXRwdXRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNl
KToKKyAgICBkZWYgX2NoZWNrX25hbWUoc2VsZiwgZmlsZW5hbWUsIGV4cGVjdGVkX3Rlc3RfbmFt
ZSk6CisgICAgICAgIHIgPSB0ZXN0b3V0cHV0LlRleHRUZXN0T3V0cHV0KE5vbmUsIEZha2VGaWxl
KGZpbGVuYW1lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0ZWRfdGVzdF9uYW1l
LCByLm5hbWUoKSkKKworICAgIGRlZiBfY2hlY2tfcGxhdGZvcm0oc2VsZiwgZmlsZW5hbWUsIGV4
cGVjdGVkX3BsYXRmb3JtKToKKyAgICAgICAgciA9IHRlc3RvdXRwdXQuVGV4dFRlc3RPdXRwdXQo
Tm9uZSwgRmFrZUZpbGUoZmlsZW5hbWUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBl
Y3RlZF9wbGF0Zm9ybSwgci5wbGF0Zm9ybSgpKQorCisgICAgZGVmIHRlc3RfZXh0cmFjdHNfbmFt
ZV9jb3JyZWN0bHkoc2VsZik6CisgICAgICAgIHNlbGYuX2NoZWNrX25hbWUoJ0xheW91dFRlc3Rz
L2Zhc3QvZG9tL2EtZXhwZWN0ZWQudHh0JywgJ2Zhc3QvZG9tL2EnKQorICAgICAgICBzZWxmLl9j
aGVja19uYW1lKCdMYXlvdXRUZXN0cy9mYXN0L2RvbS9hLWFjdHVhbC50eHQnLCAnZmFzdC9kb20v
YScpCisgICAgICAgIHNlbGYuX2NoZWNrX25hbWUoJ0xheW91dFRlc3RzL3BsYXRmb3JtL3dpbi9m
YXN0L2EtZXhwZWN0ZWQudHh0JywgJ2Zhc3QvYScpCisgICAgICAgIHNlbGYuX2NoZWNrX25hbWUo
J0xheW91dFRlc3RzL3BsYXRmb3JtL3dpbi9mYXN0L2EtZXhwZWN0ZWQuY2hlY2tzdW0nLCAnZmFz
dC9hJykKKyAgICAgICAgc2VsZi5fY2hlY2tfbmFtZSgnZmFzdC9kb20vdGVzdC1leHBlY3RlZC50
eHQnLCAnZmFzdC9kb20vdGVzdCcpCisgICAgICAgIHNlbGYuX2NoZWNrX25hbWUoJ2xheW91dC10
ZXN0LXJlc3VsdHMvZmFzdC9hLWFjdHVhbC5jaGVja3N1bScsICdmYXN0L2EnKQorCisgICAgZGVm
IHRlc3RfZXh0cmFjdHNfcGxhdGZvcm1fY29ycmVjdGx5KHNlbGYpOgorICAgICAgICBzZWxmLl9j
aGVja19wbGF0Zm9ybSgnTGF5b3V0VGVzdHMvcGxhdGZvcm0vd2luL2Zhc3QvYS1leHBlY3RlZC50
eHQnLCAnd2luJykKKyAgICAgICAgc2VsZi5fY2hlY2tfcGxhdGZvcm0oJ3BsYXRmb3JtL3dpbi9m
YXN0L2EtZXhwZWN0ZWQudHh0JywgJ3dpbicpCisgICAgICAgIHNlbGYuX2NoZWNrX3BsYXRmb3Jt
KCdwbGF0Zm9ybS9tYWMvZmFzdC9hLWV4cGVjdGVkLnR4dCcsICdtYWMnKQorICAgICAgICBzZWxm
Ll9jaGVja19wbGF0Zm9ybSgnZmFzdC9hLWV4cGVjdGVkLnR4dCcsIE5vbmUpCisKKyAgICBkZWYg
dGVzdF9vdXRwdXRzX2Zyb21fYW5fYWN0dWFsX2ZpbGVfYXJlX21hcmtlZF9hc19zdWNoKHNlbGYp
OgorICAgICAgICByID0gdGVzdG91dHB1dC5UZXh0VGVzdE91dHB1dChOb25lLCBGYWtlRmlsZSgn
dGVzdC1hY3R1YWwudHh0JykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyLmlzX2FjdHVhbCgp
KQorCisgICAgZGVmIHRlc3Rfb3V0cHV0c19mcm9tX2FuX2V4cGVjdGVkX2ZpbGVfYXJlX25vdF9h
Y3R1YWwoc2VsZik6CisgICAgICAgIHIgPSB0ZXN0b3V0cHV0LlRleHRUZXN0T3V0cHV0KE5vbmUs
IEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnR4dCcpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNl
KHIuaXNfYWN0dWFsKCkpCisKKyAgICBkZWYgdGVzdF9pc19yZWJhc2VsaW5lX29mKHNlbGYpOgor
ICAgICAgICBleHBlY3RlZCA9IHRlc3RvdXRwdXQuVGV4dFRlc3RPdXRwdXQoJ21hYycsIEZha2VG
aWxlKCd0ZXN0LWV4cGVjdGVkLnR4dCcpKQorICAgICAgICBhY3R1YWwgPSB0ZXN0b3V0cHV0LlRl
eHRUZXN0T3V0cHV0KCdtYWMnLCBGYWtlRmlsZSgndGVzdC1hY3R1YWwudHh0JykpCisgICAgICAg
IHNlbGYuYXNzZXJ0VHJ1ZShhY3R1YWwuaXNfcmViYXNlbGluZV9vZihleHBlY3RlZCkpCisgICAg
ICAgIHNlbGYuYXNzZXJ0RmFsc2UoZXhwZWN0ZWQuaXNfcmViYXNlbGluZV9vZihhY3R1YWwpKQor
CisgICAgZGVmIHRlc3RfX2VxX18oc2VsZik6CisgICAgICAgIHIxID0gdGVzdG91dHB1dC5UZXh0
VGVzdE91dHB1dCgnbWFjJywgRmFrZUZpbGUoJ3Rlc3QtZXhwZWN0ZWQudHh0JywgJ2NvbnRlbnRz
JykpCisgICAgICAgIHIyID0gdGVzdG91dHB1dC5UZXh0VGVzdE91dHB1dCgnbWFjJywgRmFrZUZp
bGUoJ3Rlc3QtZXhwZWN0ZWQudHh0JywgJ2NvbnRlbnRzJykpCisgICAgICAgIHIzID0gdGVzdG91
dHB1dC5UZXh0VGVzdE91dHB1dCgnd2luJywgRmFrZUZpbGUoJ3Rlc3QtZXhwZWN0ZWQudHh0Jywg
J2NvbnRlbnRzJykpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocjEsIHIyKQorICAgICAg
ICBzZWxmLmFzc2VydEVxdWFscyhyMSwgcjIucmV0YXJnZXQoJ21hYycpKQorICAgICAgICBzZWxm
LmFzc2VydE5vdEVxdWFscyhyMSwgcjIucmV0YXJnZXQoJ3dpbicpKQorCisgICAgZGVmIHRlc3Rf
X2hhc2hfXyhzZWxmKToKKyAgICAgICAgcjEgPSB0ZXN0b3V0cHV0LlRleHRUZXN0T3V0cHV0KCdt
YWMnLCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC50eHQnLCAnY29udGVudHMnKSkKKyAgICAgICAg
cjIgPSB0ZXN0b3V0cHV0LlRleHRUZXN0T3V0cHV0KCdtYWMnLCBGYWtlRmlsZSgndGVzdC1leHBl
Y3RlZC50eHQnLCAnY29udGVudHMnKSkKKyAgICAgICAgcjMgPSB0ZXN0b3V0cHV0LlRleHRUZXN0
T3V0cHV0KE5vbmUsIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnR4dCcsIE5vbmUpKQorCisgICAg
ICAgIHggPSBzZXQoW3IxLCByMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbihz
ZXQoW3IxLCByMl0pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMiwgbGVuKHNldChbcjEs
IHIyLCByM10pKSkKKworICAgIGRlZiB0ZXN0X2ltYWdlX2RpZmZfaXNfaW52b2tlZF9mb3JfaW1h
Z2Vfb3V0cHV0c193aXRob3V0X2NoZWNrc3VtKHNlbGYpOgorICAgICAgICByMSA9IHRlc3RvdXRw
dXQuSW1hZ2VUZXN0T3V0cHV0KCdtYWMnLCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC5wbmcnLCAn
YXNkZicpLCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC5jaGVja3N1bScsICdjaGVjaycpKQorICAg
ICAgICByMiA9IHRlc3RvdXRwdXQuSW1hZ2VUZXN0T3V0cHV0KCdtYWMnLCBGYWtlRmlsZSgndGVz
dC1leHBlY3RlZC5wbmcnLCAnYXNkZicpLCBOb25lKQorCisgICAgICAgICMgRGVmYXVsdCBiZWhh
dmlvdXIgaXMgdG8ganVzdCBjb21wYXJlIG9uIGltYWdlIGNvbnRlbnRzLgorICAgICAgICBzZWxm
LmFzc2VydFRydWUocjEuc2FtZV9jb250ZW50KHIyKSkKKworICAgICAgICBjbGFzcyBBbGxJbWFn
ZXNBcmVEaWZmZXJlbnQob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBzYW1lX2ltYWdlKHNlbGYs
IGltYWdlMSwgaW1hZ2UyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAg
ICAjIEJ1dCB3ZSBjYW4gaW5zdGFsbCBvdGhlciBpbWFnZSBkaWZmZXJzLgorICAgICAgICB0ZXN0
b3V0cHV0LkltYWdlVGVzdE91dHB1dC5pbWFnZV9kaWZmZXIgPSBBbGxJbWFnZXNBcmVEaWZmZXJl
bnQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocjEuc2FtZV9jb250ZW50KHIyKSkKKwor
aWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdp
dCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0cHV0c2V0LnB5IGIv
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Rlc3RvdXRwdXRzZXQucHkKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uMzMxNDI2MmQxNGNkOGI0ZjQxMzg0YWNjNGJkMzE4MGY3ZTVjN2Q5YwotLS0gL2Rldi9u
dWxsCisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0cHV0c2V0
LnB5CkBAIC0wLDAgKzEsMTMxIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0
IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisj
IDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMg
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAi
QVMgSVMiIEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkKKyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OworIyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GCisjIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisKK2Zyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS5kaXJlY3Rv
cnlmaWxlc2V0IGltcG9ydCBEaXJlY3RvcnlGaWxlU2V0Citmcm9tIHdlYmtpdHB5LmNvbW1vbi5z
eXN0ZW0uemlwZmlsZXNldCBpbXBvcnQgWmlwRmlsZVNldAoraW1wb3J0IHJlCitpbXBvcnQgdGVz
dG91dHB1dAoraW1wb3J0IHVybGxpYgorCisKK2NsYXNzIFRlc3RPdXRwdXRTZXQob2JqZWN0KToK
KyAgICAiIiJBIHNldCBvZiB0ZXN0IG91dHB1dHMiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwg
bmFtZSwgcGxhdGZvcm0sIHppcF9maWxlLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuX25hbWUg
PSBuYW1lCisgICAgICAgIHNlbGYuX3BsYXRmb3JtID0gcGxhdGZvcm0KKyAgICAgICAgc2VsZi5f
emlwX2ZpbGUgPSB6aXBfZmlsZQorICAgICAgICBzZWxmLl9pbmNsdWRlX2V4cGVjdGVkID0ga3dh
cmdzLmdldCgnaW5jbHVkZV9leHBlY3RlZCcsIFRydWUpCisKKyAgICBAY2xhc3NtZXRob2QKKyAg
ICBkZWYgZnJvbV96aXBfdXJsKGNscywgcGxhdGZvcm0sIHppcF9wYXRoKToKKyAgICAgICAgcmV0
dXJuIFRlc3RPdXRwdXRTZXQoJ2xvY2FsIHppcCAlcyBidWlsZGVyJyAlIHBsYXRmb3JtLCBwbGF0
Zm9ybSwgWmlwRmlsZVNldCh6aXBfcGF0aCkpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYg
ZnJvbV96aXAoY2xzLCBwbGF0Zm9ybSwgemlwKToKKyAgICAgICAgcmV0dXJuIFRlc3RPdXRwdXRT
ZXQoJ2xvY2FsIHppcCAlcyBidWlsZGVyJyAlIHBsYXRmb3JtLCBwbGF0Zm9ybSwgemlwKQorCisg
ICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGZyb21femlwX21hcChjbHMsIHppcF9tYXApOgorICAg
ICAgICBvdXRwdXRfc2V0cyA9IFtdCisgICAgICAgIGZvciBrLCB2IGluIHppcF9tYXAuaXRlbXMo
KToKKyAgICAgICAgICAgIG91dHB1dF9zZXRzLmFwcGVuZChUZXN0T3V0cHV0U2V0LmZyb21femlw
KGssIHYpKQorICAgICAgICByZXR1cm4gQWdncmVnYXRlVGVzdE91dHB1dFNldChvdXRwdXRfc2V0
cykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmcm9tX3BhdGgoc2VsZiwgcGF0aCwgcGxh
dGZvcm09Tm9uZSk6CisgICAgICAgIHogPSBEaXJlY3RvcnlGaWxlU2V0KHBhdGgpCisgICAgICAg
IHJldHVybiBUZXN0T3V0cHV0U2V0KCdsb2NhbCAlcyBidWlsZGVyJyAlIHBsYXRmb3JtLCBwbGF0
Zm9ybSwgeikKKworICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fbmFt
ZQorCisgICAgZGVmIHNldF9wbGF0Zm9ybShzZWxmLCBwbGF0Zm9ybSk6CisgICAgICAgIHNlbGYu
X3BsYXRmb3JtID0gcGxhdGZvcm0KKworICAgIGRlZiBmaWxlcyhzZWxmKToKKyAgICAgICAgZmls
ZXMgPSBbXQorICAgICAgICBmb3IgZmlsZW5hbWUgaW4gc2VsZi5femlwX2ZpbGUubmFtZWxpc3Qo
KToKKyAgICAgICAgICAgIGZpbGVzLmFwcGVuZChzZWxmLl96aXBfZmlsZS5vcGVuKGZpbGVuYW1l
KSkKKyAgICAgICAgcmV0dXJuIGZpbGVzCisKKyAgICBkZWYgb3V0cHV0c19mb3Ioc2VsZiwgbmFt
ZSwgKiprd2FyZ3MpOgorICAgICAgICB0YXJnZXRfdHlwZSA9IGt3YXJncy5nZXQoJ3RhcmdldF90
eXBlJywgTm9uZSkKKyAgICAgICAgZXhhY3RfbWF0Y2ggPSBrd2FyZ3MuZ2V0KCdleGFjdF9tYXRj
aCcsIEZhbHNlKQorICAgICAgICBpZiByZS5zZWFyY2gocidcLng/aHRtbCcsIG5hbWUpOgorICAg
ICAgICAgICAgbmFtZSA9IG5hbWVbOm5hbWUucmluZGV4KCcuJyldCisgICAgICAgIG5hbWVfbWF0
Y2hlciA9IHJlLmNvbXBpbGUobmFtZSkKKyAgICAgICAgYWN0dWFsX21hdGNoZXIgPSByZS5jb21w
aWxlKHInLWFjdHVhbFwuJykKKyAgICAgICAgZXhwZWN0ZWRfbWF0Y2hlciA9IHJlLmNvbXBpbGUo
cictZXhwZWN0ZWRcLicpCisKKyAgICAgICAgY2hlY2tzdW1fZmlsZXMgPSBbXQorICAgICAgICB0
ZXh0X2ZpbGVzID0gW10KKyAgICAgICAgaW1hZ2VfZmlsZXMgPSBbXQorICAgICAgICBmb3Igb3V0
cHV0X2ZpbGUgaW4gc2VsZi5maWxlcygpOgorICAgICAgICAgICAgbmFtZV9tYXRjaCA9IG5hbWVf
bWF0Y2hlci5zZWFyY2gob3V0cHV0X2ZpbGUubmFtZSgpKQorICAgICAgICAgICAgYWN0dWFsX21h
dGNoID0gYWN0dWFsX21hdGNoZXIuc2VhcmNoKG91dHB1dF9maWxlLm5hbWUoKSkKKyAgICAgICAg
ICAgIGV4cGVjdGVkX21hdGNoID0gZXhwZWN0ZWRfbWF0Y2hlci5zZWFyY2gob3V0cHV0X2ZpbGUu
bmFtZSgpKQorICAgICAgICAgICAgaWYgbmFtZV9tYXRjaCBhbmQgKGFjdHVhbF9tYXRjaCBvciAo
c2VsZi5faW5jbHVkZV9leHBlY3RlZCBhbmQgZXhwZWN0ZWRfbWF0Y2gpKToKKyAgICAgICAgICAg
ICAgICBpZiBvdXRwdXRfZmlsZS5uYW1lKCkuZW5kc3dpdGgoJy5jaGVja3N1bScpOgorICAgICAg
ICAgICAgICAgICAgICBjaGVja3N1bV9maWxlcy5hcHBlbmQob3V0cHV0X2ZpbGUpCisgICAgICAg
ICAgICAgICAgZWxpZiBvdXRwdXRfZmlsZS5uYW1lKCkuZW5kc3dpdGgoJy50eHQnKToKKyAgICAg
ICAgICAgICAgICAgICAgdGV4dF9maWxlcy5hcHBlbmQob3V0cHV0X2ZpbGUpCisgICAgICAgICAg
ICAgICAgZWxpZiBvdXRwdXRfZmlsZS5uYW1lKCkuZW5kc3dpdGgoJy5wbmcnKToKKyAgICAgICAg
ICAgICAgICAgICAgaW1hZ2VfZmlsZXMuYXBwZW5kKG91dHB1dF9maWxlKQorCisgICAgICAgIG91
dHB1dHMgPSBbXQorICAgICAgICBmb3IgaW1hZ2VfZmlsZSBpbiBpbWFnZV9maWxlczoKKyAgICAg
ICAgICAgIGNoZWNrc3VtX2ZpbGVfbmFtZSA9IHJlLnN1YihyZS5jb21waWxlKCdcLnBuZycpLCAn
LmNoZWNrc3VtJywgaW1hZ2VfZmlsZS5uYW1lKCkpCisgICAgICAgICAgICBmb3VuZF9jaGVja3N1
bSA9IEZhbHNlCisgICAgICAgICAgICBmb3IgY2hlY2tzdW1fZmlsZSBpbiBjaGVja3N1bV9maWxl
czoKKyAgICAgICAgICAgICAgICBpZiBjaGVja3N1bV9maWxlLm5hbWUoKSA9PSBjaGVja3N1bV9m
aWxlX25hbWU6CisgICAgICAgICAgICAgICAgICAgIGZvdW5kX2NoZWNrc3VtID0gVHJ1ZQorICAg
ICAgICAgICAgICAgICAgICBvdXRwdXRzLmFwcGVuZCh0ZXN0b3V0cHV0LkltYWdlVGVzdE91dHB1
dChzZWxmLl9wbGF0Zm9ybSwgaW1hZ2VfZmlsZSwgY2hlY2tzdW1fZmlsZSkpCisgICAgICAgICAg
ICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBub3QgZm91bmRfY2hlY2tzdW06CisgICAg
ICAgICAgICAgICAgIyBwcmludCAiQ291bGRuJ3QgZmluZCBjaGVja3N1bSBmb3IgaW1hZ2UgJyVz
JyIgJSBpbWFnZV9maWxlLm5hbWUoKQorICAgICAgICAgICAgICAgIG91dHB1dHMuYXBwZW5kKHRl
c3RvdXRwdXQuSW1hZ2VUZXN0T3V0cHV0KHNlbGYuX3BsYXRmb3JtLCBpbWFnZV9maWxlLCBOb25l
KSkKKworICAgICAgICBmb3IgdGV4dF9maWxlIGluIHRleHRfZmlsZXM6CisgICAgICAgICAgICBv
dXRwdXRzLmFwcGVuZCh0ZXN0b3V0cHV0LlRleHRUZXN0T3V0cHV0KHNlbGYuX3BsYXRmb3JtLCB0
ZXh0X2ZpbGUpKQorCisgICAgICAgIGlmIGV4YWN0X21hdGNoOgorICAgICAgICAgICAgb3V0cHV0
cyA9IGZpbHRlcihsYW1iZGEgcjogci5uYW1lKCkgPT0gbmFtZSwgb3V0cHV0cykKKworICAgICAg
ICBvdXRwdXRzID0gZmlsdGVyKGxhbWJkYSByOiB0YXJnZXRfdHlwZSBpcyBOb25lIG9yIHRhcmdl
dF90eXBlID09IHIudHlwZSgpLCBvdXRwdXRzKQorICAgICAgICByZXR1cm4gb3V0cHV0cworCisK
K2NsYXNzIEFnZ3JlZ2F0ZVRlc3RPdXRwdXRTZXQob2JqZWN0KToKKyAgICAiIiJTZXQgb2YgdGVz
dCBvdXRwdXRzIGZyb20gYSBsaXN0IG9mIGJ1aWxkZXJzIiIiCisgICAgZGVmIF9faW5pdF9fKHNl
bGYsIGJ1aWxkZXJzKToKKyAgICAgICAgc2VsZi5fYnVpbGRlcnMgPSBidWlsZGVycworCisgICAg
ZGVmIG91dHB1dHNfZm9yKHNlbGYsIG5hbWUsICoqa3dhcmdzKToKKyAgICAgICAgb3V0cHV0cyA9
IFtdCisgICAgICAgIGZvciBidWlsZGVyIGluIHNlbGYuX2J1aWxkZXJzOgorICAgICAgICAgICAg
b3V0cHV0cyArPSBidWlsZGVyLm91dHB1dHNfZm9yKG5hbWUsICoqa3dhcmdzKQorICAgICAgICBy
ZXR1cm4gb3V0cHV0cworCisgICAgZGVmIHN1Yl9idWlsZGVycyhzZWxmKToKKyAgICAgICAgcmV0
dXJuIHNlbGYuX2J1aWxkZXJzCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2Nv
bW1vbi9uZXQvdGVzdG91dHB1dHNldF91bml0dGVzdC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0
cHkvY29tbW9uL25ldC90ZXN0b3V0cHV0c2V0X3VuaXR0ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmNiODBl
ZDE1YTEyMTI3NDBjZTk1MDJhNGZjMmM4NTdhZTc4YzdhNzcKLS0tIC9kZXYvbnVsbAorKysgYi9U
b29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dHNldF91bml0dGVzdC5w
eQpAQCAtMCwwICsxLDE1MiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAo
QykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAy
LiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFT
IElTIiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsK
KyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZmlsZXNldCBp
bXBvcnQgRmlsZVNldEZpbGVIYW5kbGUKK2ltcG9ydCB0ZXN0b3V0cHV0c2V0CitpbXBvcnQgdW5p
dHRlc3QKKworCitjbGFzcyBGYWtlWmlwKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYp
OgorICAgICAgICBzZWxmLl9maWxlcyA9IHt9CisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAg
ICAgICAgcmV0dXJuICJGYWtlWmlwIgorCisgICAgZGVmIGluc2VydChzZWxmLCBmaWxlbmFtZSwg
Y29udGVudCk6CisgICAgICAgIHNlbGYuX2ZpbGVzW2ZpbGVuYW1lXSA9IGNvbnRlbnQKKworICAg
IGRlZiBuYW1lbGlzdChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGVzLmtleXMoKQor
CisgICAgZGVmIG9wZW4oc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICByZXR1cm4gRmlsZVNldEZp
bGVIYW5kbGUoc2VsZiwgZmlsZW5hbWUpCisKKyAgICBkZWYgcmVhZChzZWxmLCBmaWxlbmFtZSk6
CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlc1tmaWxlbmFtZV0KKworICAgIGRlZiBleHRyYWN0
KHNlbGYsIGZpbGVuYW1lLCBwYXRoKToKKyAgICAgICAgcHJpbnQgIkZha2VaaXA+IGNwICVzICVz
IiAlIChmaWxlbmFtZSwgcGF0aCkKKworICAgIGRlZiBkZWxldGUoc2VsZiwgZmlsZW5hbWUpOgor
ICAgICAgICBwcmludCAiRmFrZVppcD4gcm0gJXMiICUgZmlsZW5hbWUKKyAgICAgICAgc2VsZi5f
ZmlsZXNbZmlsZW5hbWVdID0gTm9uZQorCisKK2NsYXNzIFRlc3RPdXRwdXRTZXRUZXN0KHVuaXR0
ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgX291dHB1dHNldF93aXRoX3ppcChzZWxmLCB6aXAsICoq
a3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHRlc3RvdXRwdXRzZXQuVGVzdE91dHB1dFNldCgnPGZh
a2Utb3V0cHV0c2V0PicsICc8ZmFrZS1wbGF0Zm9ybT4nLCB6aXAsICoqa3dhcmdzKQorCisgICAg
ZGVmIHRlc3RfdGV4dF9maWxlc19nZXRfaW50ZXJwcmV0ZWRfYXNfdGV4dF9vdXRwdXRzKHNlbGYp
OgorICAgICAgICB6aXAgPSBGYWtlWmlwKCkKKyAgICAgICAgemlwLmluc2VydCgnZmFzdC9kb20v
c29tZS10ZXN0LWFjdHVhbC50eHQnLCAnYWN0dWFsIG91dHB1dHMnKQorICAgICAgICBiID0gc2Vs
Zi5fb3V0cHV0c2V0X3dpdGhfemlwKHppcCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwg
bGVuKGIub3V0cHV0c19mb3IoJ2Zhc3QvZG9tL3NvbWUtdGVzdCcpKSkKKyAgICAgICAgc2VsZi5h
c3NlcnRFcXVhbHMoJ2Zhc3QvZG9tL3NvbWUtdGVzdCcsIGIub3V0cHV0c19mb3IoJ2Zhc3QvZG9t
L3NvbWUtdGVzdC5odG1sJylbMF0ubmFtZSgpKQorCisgICAgZGVmIHRlc3RfaW1hZ2VfYW5kX2No
ZWNrc3VtX2ZpbGVzX2dldF9pbnRlcnByZXRlZF9hc19hX3NpbmdsZV9pbWFnZV9vdXRwdXQoc2Vs
Zik6CisgICAgICAgIHppcCA9IEZha2VaaXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCdmYXN0L2Rv
bS9zb21lLXRlc3QtYWN0dWFsLmNoZWNrc3VtJywgJ2FiYzEyMycpCisgICAgICAgIHppcC5pbnNl
cnQoJ2Zhc3QvZG9tL3NvbWUtdGVzdC1hY3R1YWwucG5nJywgJzxpbWFnZSBkYXRhPicpCisgICAg
ICAgIGIgPSBzZWxmLl9vdXRwdXRzZXRfd2l0aF96aXAoemlwKQorICAgICAgICBvdXRwdXRzID0g
Yi5vdXRwdXRzX2ZvcignZmFzdC9kb20vc29tZS10ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRF
cXVhbHMoMSwgbGVuKG91dHB1dHMpKQorICAgICAgICBvdXRwdXQgPSBvdXRwdXRzWzBdCisgICAg
ICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCdpbWFnZScsIG91dHB1dC50eXBlKCkpCisgICAgICAgIHNl
bGYuYXNzZXJ0RXF1YWxzKCdhYmMxMjMnLCBvdXRwdXQuY29udGVudHMoKSkKKworICAgIGRlZiB0
ZXN0X211bHRpcGxlX2ltYWdlX291dHB1dHNfYXJlX2RldGVjdGVkKHNlbGYpOgorICAgICAgICB6
aXAgPSBGYWtlWmlwKCkKKyAgICAgICAgemlwLmluc2VydCgncGxhdGZvcm0vd2luL2Zhc3QvZG9t
L3NvbWUtdGVzdC1hY3R1YWwuY2hlY2tzdW0nLCAnY2hlY2tzdW0xJykKKyAgICAgICAgemlwLmlu
c2VydCgncGxhdGZvcm0vd2luL2Zhc3QvZG9tL3NvbWUtdGVzdC1hY3R1YWwucG5nJywgJzxpbWFn
ZSBkYXRhIDE+JykKKyAgICAgICAgemlwLmluc2VydCgncGxhdGZvcm0vbWFjL2Zhc3QvZG9tL3Nv
bWUtdGVzdC1hY3R1YWwuY2hlY2tzdW0nLCAnY2hlY2tzdW0yJykKKyAgICAgICAgemlwLmluc2Vy
dCgncGxhdGZvcm0vbWFjL2Zhc3QvZG9tL3NvbWUtdGVzdC1hY3R1YWwucG5nJywgJzxpbWFnZSBk
YXRhIDI+JykKKyAgICAgICAgYiA9IHNlbGYuX291dHB1dHNldF93aXRoX3ppcCh6aXApCisgICAg
ICAgIG91dHB1dHMgPSBiLm91dHB1dHNfZm9yKCdmYXN0L2RvbS9zb21lLXRlc3QnKQorICAgICAg
ICBzZWxmLmFzc2VydEVxdWFscygyLCBsZW4ob3V0cHV0cykpCisgICAgICAgIHNlbGYuYXNzZXJ0
RmFsc2Uob3V0cHV0c1swXS5zYW1lX2NvbnRlbnQob3V0cHV0c1sxXSkpCisKKyAgICBkZWYgdGVz
dF9hZ2dyZWdhdGVfb3V0cHV0X3NldF9jb3JyZWN0bHlfcmV0cmlldmVzX3Rlc3RzX2Zyb21fbXVs
dGlwbGVfb3V0cHV0X3NldHMoc2VsZik6CisgICAgICAgIG91dHB1dHNldDFfemlwID0gRmFrZVpp
cCgpCisgICAgICAgIG91dHB1dHNldDFfemlwLmluc2VydCgnZmFzdC9kb20vdGVzdC1hY3R1YWwu
dHh0JywgJ2xpbnV4IHRleHQgb3V0cHV0JykKKyAgICAgICAgb3V0cHV0c2V0MSA9IHRlc3RvdXRw
dXRzZXQuVGVzdE91dHB1dFNldCgnbGludXgtb3V0cHV0c2V0JywgJ2xpbnV4Jywgb3V0cHV0c2V0
MV96aXApCisgICAgICAgIG91dHB1dHNldDJfemlwID0gRmFrZVppcCgpCisgICAgICAgIG91dHB1
dHNldDJfemlwLmluc2VydCgnZmFzdC9kb20vdGVzdC1hY3R1YWwudHh0JywgJ3dpbmRvd3MgdGV4
dCBvdXRwdXQnKQorICAgICAgICBvdXRwdXRzZXQyID0gdGVzdG91dHB1dHNldC5UZXN0T3V0cHV0
U2V0KCd3aW4tb3V0cHV0c2V0JywgJ3dpbicsIG91dHB1dHNldDJfemlwKQorCisgICAgICAgIGIg
PSB0ZXN0b3V0cHV0c2V0LkFnZ3JlZ2F0ZVRlc3RPdXRwdXRTZXQoW291dHB1dHNldDEsIG91dHB1
dHNldDJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygyLCBsZW4oYi5vdXRwdXRzX2Zvcign
ZmFzdC9kb20vdGVzdCcpKSkKKworICAgIGRlZiB0ZXN0X2Nhbl9pbmZlcl9wbGF0Zm9ybV9mcm9t
X3BhdGhfaWZfbm9uZV9wcm92aWRlZChzZWxmKToKKyAgICAgICAgemlwID0gRmFrZVppcCgpCisg
ICAgICAgIHppcC5pbnNlcnQoJ3BsYXRmb3JtL3dpbi9zb21lLXRlc3QtZXhwZWN0ZWQucG5nJywg
JzxpbWFnZSBkYXRhPicpCisgICAgICAgIHppcC5pbnNlcnQoJ3BsYXRmb3JtL3dpbi9zb21lLXRl
c3QtZXhwZWN0ZWQuY2hlY2tzdW0nLCAnYWJjMTIzJykKKyAgICAgICAgYiA9IHRlc3RvdXRwdXRz
ZXQuVGVzdE91dHB1dFNldCgnbG9jYWwgTGF5b3V0VGVzdHMgb3V0cHV0c2V0JywgTm9uZSwgemlw
KQorCisgICAgICAgIG91dHB1dHMgPSBiLm91dHB1dHNfZm9yKCdzb21lLXRlc3QnKQorICAgICAg
ICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4ob3V0cHV0cykpCisgICAgICAgIHNlbGYuYXNzZXJ0
RXF1YWxzKCd3aW4nLCBvdXRwdXRzWzBdLnBsYXRmb3JtKCkpCisKKyAgICBkZWYgdGVzdF90ZXN0
X2V4dGVuc2lvbl9pc19pZ25vcmVkKHNlbGYpOgorICAgICAgICB6aXAgPSBGYWtlWmlwKCkKKyAg
ICAgICAgemlwLmluc2VydCgndGVzdC90ZXN0LWEtYWN0dWFsLnR4dCcsICdhY3R1YWwgb3V0cHV0
cycpCisgICAgICAgIGIgPSBzZWxmLl9vdXRwdXRzZXRfd2l0aF96aXAoemlwKQorICAgICAgICBv
dXRwdXRzID0gYi5vdXRwdXRzX2ZvcigndGVzdC90ZXN0LWEuaHRtbCcpCisgICAgICAgIHNlbGYu
YXNzZXJ0RXF1YWxzKDEsIGxlbihvdXRwdXRzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMo
J3Rlc3QvdGVzdC1hJywgb3V0cHV0c1swXS5uYW1lKCkpCisKKyAgICBkZWYgdGVzdF9leGlzdGlu
Z19vdXRwdXRzX2FyZV9tYXJrZWRfYXNfc3VjaChzZWxmKToKKyAgICAgICAgemlwID0gRmFrZVpp
cCgpCisgICAgICAgIHppcC5pbnNlcnQoJ3Rlc3QvdGVzdC1hLWV4cGVjdGVkLnR4dCcsICdleHBl
Y3RlZCBvdXRwdXRzJykKKyAgICAgICAgYiA9IHNlbGYuX291dHB1dHNldF93aXRoX3ppcCh6aXAp
CisgICAgICAgIG91dHB1dHMgPSBiLm91dHB1dHNfZm9yKCd0ZXN0L3Rlc3QtYS5odG1sJykKKyAg
ICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgbGVuKG91dHB1dHMpKQorICAgICAgICBzZWxmLmFz
c2VydEZhbHNlKG91dHB1dHNbMF0uaXNfYWN0dWFsKCkpCisKKyAgICBkZWYgdGVzdF9vbmx5X3Jl
dHVybnNfb3V0cHV0c19vZl9zcGVjaWZpZWRfdHlwZShzZWxmKToKKyAgICAgICAgemlwID0gRmFr
ZVppcCgpCisgICAgICAgIHppcC5pbnNlcnQoJ3Rlc3QvdGVzdC1hLWV4cGVjdGVkLnR4dCcsICdl
eHBlY3RlZCBvdXRwdXRzJykKKyAgICAgICAgemlwLmluc2VydCgndGVzdC90ZXN0LWEtZXhwZWN0
ZWQuY2hlY2tzdW0nLCAnZXhwZWN0ZWQgb3V0cHV0cycpCisgICAgICAgIHppcC5pbnNlcnQoJ3Rl
c3QvdGVzdC1hLWV4cGVjdGVkLnBuZycsICdleHBlY3RlZCBvdXRwdXRzJykKKyAgICAgICAgYiA9
IHNlbGYuX291dHB1dHNldF93aXRoX3ppcCh6aXApCisKKyAgICAgICAgb3V0cHV0cyA9IGIub3V0
cHV0c19mb3IoJ3Rlc3QvdGVzdC1hLmh0bWwnKQorICAgICAgICB0ZXh0X291dHB1dHMgPSBiLm91
dHB1dHNfZm9yKCd0ZXN0L3Rlc3QtYS5odG1sJywgdGFyZ2V0X3R5cGU9J3RleHQnKQorICAgICAg
ICBpbWFnZV9vdXRwdXRzID0gYi5vdXRwdXRzX2ZvcigndGVzdC90ZXN0LWEuaHRtbCcsIHRhcmdl
dF90eXBlPSdpbWFnZScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMiwgbGVuKG91dHB1
dHMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4odGV4dF9vdXRwdXRzKSkKKyAg
ICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgbGVuKGltYWdlX291dHB1dHMpKQorICAgICAgICBz
ZWxmLmFzc2VydEVxdWFscygndGV4dCcsIHRleHRfb3V0cHV0c1swXS50eXBlKCkpCisgICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWxzKCdpbWFnZScsIGltYWdlX291dHB1dHNbMF0udHlwZSgpKQorCisg
ICAgZGVmIHRlc3RfZXhjbHVkZV9leHBlY3RlZF9vdXRwdXRzX3dvcmtzKHNlbGYpOgorICAgICAg
ICB6aXAgPSBGYWtlWmlwKCkKKyAgICAgICAgemlwLmluc2VydCgndGVzdC1leHBlY3RlZC50eHQn
LCAgJ2V4cGVjdGVkIG91dHB1dHMgc3RvcmVkIG9uIHNlcnZlciBmb3Igc29tZSByZWFzb24nKQor
ICAgICAgICBiID0gc2VsZi5fb3V0cHV0c2V0X3dpdGhfemlwKHppcCwgaW5jbHVkZV9leHBlY3Rl
ZD1GYWxzZSkKKyAgICAgICAgb3V0cHV0cyA9IGIub3V0cHV0c19mb3IoJ3Rlc3QnLCB0YXJnZXRf
dHlwZT1Ob25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygwLCBsZW4ob3V0cHV0cykpCisK
K2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1n
aXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Jhc2UucHkgYi9U
b29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9wb3J0L2Jhc2UucHkKaW5kZXggOTdi
NTRjOTdkODFmZmY5Mzk5OTFlNmFlYjJhMzMzMTYwODg4ODE1Mi4uMTc5YWE3MThhY2UwMWM1OTgw
NDRiOGVlMzg1NDFlMjZjZWU5YzU5ZCAxMDA2NDQKLS0tIGEvVG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9sYXlvdXRfdGVzdHMvcG9ydC9iYXNlLnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkv
bGF5b3V0X3Rlc3RzL3BvcnQvYmFzZS5weQpAQCAtNjMyLDYgKzYzMiwxMCBAQCBjbGFzcyBQb3J0
KG9iamVjdCk6CiAgICAgICAgIGV4cGVjdGF0aW9ucywgZGV0ZXJtaW5pbmcgc2VhcmNoIHBhdGhz
LCBhbmQgbG9nZ2luZyBpbmZvcm1hdGlvbi4iIiIKICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50
ZWRFcnJvcignUG9ydC52ZXJzaW9uJykKIAorICAgIGRlZiBsYXRlc3RfdGVzdF9vdXRwdXRzKHNl
bGYsIHBsYXRmb3Jtcyk6CisgICAgICAgICIiIlJldHVybnMgYSBSZXN1bHRTZXQgZm9yIHRoZSBz
cGVjaWZpZWQgcGxhdGZvcm1zIGZvciB0aGlzIHBvcnRzIGJ1aWxkYm90cy4iIiIKKyAgICAgICAg
cmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignUG9ydC5sYXRlc3RfdGVzdF9vdXRwdXRzJykKKwog
ICAgIGRlZiB0ZXN0X3JlcG9zaXRvcnlfcGF0aHMoc2VsZik6CiAgICAgICAgICIiIlJldHVybnMg
YSBsaXN0IG9mIChyZXBvc2l0b3J5X25hbWUsIHJlcG9zaXRvcnlfcGF0aCkgdHVwbGVzCiAgICAg
ICAgIG9mIGl0cyBkZXBlbmRpbmcgY29kZSBiYXNlLiAgQnkgZGVmYXVsdCBpdCByZXR1cm5zIGEg
bGlzdCB0aGF0IG9ubHkKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0
X3Rlc3RzL3BvcnQvY2hyb21pdW0ucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90
ZXN0cy9wb3J0L2Nocm9taXVtLnB5CmluZGV4IGI5MDQyMWFkZmViMDhiMDk0MzAxMTlmZjJlZmJk
ZTI4NDg1YzMyOGYuLmM3ODQ4MTJhODA0ODUxM2M2NGZkZDg1MTlmYjcwYzA1YWQ3MjI3MWUgMTAw
NjQ0Ci0tLSBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvbGF5b3V0X3Rlc3RzL3BvcnQvY2hyb21p
dW0ucHkKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC9jaHJv
bWl1bS5weQpAQCAtNDQsNiArNDQsOCBAQCBpbXBvcnQgdGVtcGZpbGUKIGltcG9ydCB0aW1lCiBp
bXBvcnQgd2ViYnJvd3NlcgogCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uemlwZmlsZXNl
dCBpbXBvcnQgWmlwRmlsZVNldAorZnJvbSB3ZWJraXRweS5jb21tb24ubmV0LnRlc3RvdXRwdXRz
ZXQgaW1wb3J0IEFnZ3JlZ2F0ZVRlc3RPdXRwdXRTZXQsIFRlc3RPdXRwdXRTZXQKIGZyb20gd2Vi
a2l0cHkuY29tbW9uLnN5c3RlbS5wYXRoIGltcG9ydCBjeWdwYXRoCiBmcm9tIHdlYmtpdHB5Lmxh
eW91dF90ZXN0cy5sYXlvdXRfcGFja2FnZSBpbXBvcnQgdGVzdF9leHBlY3RhdGlvbnMKIGZyb20g
d2Via2l0cHkubGF5b3V0X3Rlc3RzLmxheW91dF9wYWNrYWdlIGltcG9ydCB0ZXN0X291dHB1dApA
QCAtMTk3LDYgKzE5OSwyNSBAQCBjbGFzcyBDaHJvbWl1bVBvcnQoYmFzZS5Qb3J0KToKICAgICAg
ICAgcmV0dXJuIHNlbGYucGF0aF9mcm9tX3dlYmtpdF9iYXNlKCdMYXlvdXRUZXN0cycsICdwbGF0
Zm9ybScsCiAgICAgICAgICAgICAnY2hyb21pdW0nLCAndGVzdF9leHBlY3RhdGlvbnMudHh0JykK
IAorICAgIGRlZiBsYXRlc3RfdGVzdF9vdXRwdXRzKHNlbGYsIHBsYXRmb3Jtcyk6CisgICAgICAg
IHBsYXRmb3JtX2J1aWxkZXJzID0geworICAgICAgICAgICAgJ2Nocm9taXVtLW1hYyc6ICdXZWJr
aXRfTWFjMTBfNScsCisgICAgICAgICAgICAnY2hyb21pdW0td2luLXZpc3RhJzogJ1dlYmtpdF9X
aW4nLAorICAgICAgICAgICAgJ2Nocm9taXVtLWxpbnV4JzogJ1dlYmtpdF9MaW51eF9UZXN0c19f
ZGJnX18xXycsCisgICAgICAgIH0KKworICAgICAgICBvdXRwdXRzZXRzID0gW10KKyAgICAgICAg
Zm9yIHBsYXRmb3JtIGluIHBsYXRmb3JtczoKKyAgICAgICAgICAgIGlmIHBsYXRmb3JtIG5vdCBp
biBwbGF0Zm9ybV9idWlsZGVyczoKKyAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkRv
bid0IGhhdmUgb3V0cHV0cyBmb3IgcGxhdGZvcm0gJXMiICUgcGxhdGZvcm0pCisgICAgICAgICAg
ICBidWlsZGVyX25hbWUgPSBwbGF0Zm9ybV9idWlsZGVyc1twbGF0Zm9ybV0KKyAgICAgICAgICAg
IHppcF91cmwgPSAnaHR0cDovL2J1aWxkLmNocm9taXVtLm9yZy9mL2Nocm9taXVtL2xheW91dF90
ZXN0X3Jlc3VsdHMvJyArIFwKKyAgICAgICAgICAgICAgICBidWlsZGVyX25hbWUgKyAnL2xheW91
dC10ZXN0LXJlc3VsdHMuemlwJworICAgICAgICAgICAgb3V0cHV0c2V0cy5hcHBlbmQoVGVzdE91
dHB1dFNldChidWlsZGVyX25hbWUsIHBsYXRmb3JtLCBaaXBGaWxlU2V0KHppcF91cmwpLAorICAg
ICAgICAgICAgICAgIGluY2x1ZGVfZXhwZWN0ZWQ9RmFsc2UpKQorCisgICAgICAgIHJldHVybiBB
Z2dyZWdhdGVUZXN0T3V0cHV0U2V0KG91dHB1dHNldHMpCisKICAgICBkZWYgcmVzdWx0c19kaXJl
Y3Rvcnkoc2VsZik6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHJldHVybiBzZWxmLnBhdGhf
ZnJvbV9jaHJvbWl1bV9iYXNlKCd3ZWJraXQnLApkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93
ZWJraXRweS9sYXlvdXRfdGVzdHMvcG9ydC93ZWJraXQucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtp
dHB5L2xheW91dF90ZXN0cy9wb3J0L3dlYmtpdC5weQppbmRleCBhZmRlYmViMmM4NDZlZDdjY2Rm
ZDJmZmU3ZGIwMjFhZDMxNTIxM2I5Li5iMWRhMzJhOTA4NmI1NmJhMzI2NzkzNzhhZWZlODkxYTg1
ZDMxZGJkIDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9w
b3J0L3dlYmtpdC5weQorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2xheW91dF90ZXN0cy9w
b3J0L3dlYmtpdC5weQpAQCAtNDYsNiArNDYsOCBAQCBpbXBvcnQgb3BlcmF0b3IKIGltcG9ydCB0
ZW1wZmlsZQogaW1wb3J0IHNodXRpbAogCitpbXBvcnQgd2Via2l0cHkuY29tbW9uLm5ldC5idWls
ZGJvdCBhcyBidWlsZGJvdAorZnJvbSB3ZWJraXRweS5jb21tb24ubmV0LnRlc3RvdXRwdXRzZXQg
aW1wb3J0IEFnZ3JlZ2F0ZVRlc3RPdXRwdXRTZXQKIGltcG9ydCB3ZWJraXRweS5jb21tb24uc3lz
dGVtLm9zcGF0aCBhcyBvc3BhdGgKIGltcG9ydCB3ZWJraXRweS5sYXlvdXRfdGVzdHMubGF5b3V0
X3BhY2thZ2UudGVzdF9vdXRwdXQgYXMgdGVzdF9vdXRwdXQKIGltcG9ydCB3ZWJraXRweS5sYXlv
dXRfdGVzdHMucG9ydC5iYXNlIGFzIGJhc2UKQEAgLTc5LDYgKzgxLDM0IEBAIGNsYXNzIFdlYktp
dFBvcnQoYmFzZS5Qb3J0KToKICAgICBkZWYgdmVyc2lvbihzZWxmKToKICAgICAgICAgcmV0dXJu
ICcnCiAKKyAgICBkZWYgbGF0ZXN0X3Rlc3Rfb3V0cHV0cyhzZWxmLCBwbGF0Zm9ybXMpOgorICAg
ICAgICBwbGF0Zm9ybV9idWlsZGVycyA9IHsKKyAgICAgICAgICAgICdtYWMtc25vd2xlb3BhcmQn
OiAnU25vd0xlb3BhcmQgSW50ZWwgUmVsZWFzZSAoVGVzdHMpJywKKyAgICAgICAgICAgICdtYWMt
bGVvcGFyZCc6ICdMZW9wYXJkIEludGVsIERlYnVnIChUZXN0cyknLAorICAgICAgICAgICAgJ3dp
bic6ICdXaW5kb3dzIDcgUmVsZWFzZSAoV2ViS2l0MiBUZXN0cyknLAorICAgICAgICAgICAgJ2No
cm9taXVtLWxpbnV4JzogJ0dUSyBMaW51eCAzMi1iaXQgUmVsZWFzZScsCisgICAgICAgIH0KKwor
ICAgICAgICBmb3IgcGxhdGZvcm0gaW4gcGxhdGZvcm1zOgorICAgICAgICAgICAgaWYgcGxhdGZv
cm0gbm90IGluIHBsYXRmb3JtX2J1aWxkZXJzOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2Vw
dGlvbigiQ2FuJ3QgZmluZCBidWlsZGVyIGZvciAlcyIgJSBwbGF0Zm9ybSkKKworICAgICAgICBi
YiA9IGJ1aWxkYm90LkJ1aWxkQm90KCkKKyAgICAgICAgb3V0cHV0c2V0cyA9IFtdCisgICAgICAg
IGJ1aWxkZXJzX2J5X25hbWUgPSB7fQorCisgICAgICAgIGZvciBidWlsZGVyIGluIGJiLmJ1aWxk
ZXJzKCk6CisgICAgICAgICAgICBidWlsZGVyc19ieV9uYW1lW2J1aWxkZXIubmFtZSgpXSA9IGJ1
aWxkZXIKKworICAgICAgICBmb3IgcGxhdGZvcm0gaW4gcGxhdGZvcm1zOgorICAgICAgICAgICAg
YnVpbGRlciA9IGJ1aWxkZXJzX2J5X25hbWVbcGxhdGZvcm1fYnVpbGRlcnNbcGxhdGZvcm1dXQor
ICAgICAgICAgICAgcHJpbnQgImdvdCBidWlsZGVyICVzIiAlIGJ1aWxkZXIubmFtZSgpCisgICAg
ICAgICAgICBycyA9IGJ1aWxkZXIubGF0ZXN0X2J1aWxkKCkudGVzdF9vdXRwdXRzKCkKKyAgICAg
ICAgICAgIHJzLnNldF9wbGF0Zm9ybShwbGF0Zm9ybSkKKyAgICAgICAgICAgIG91dHB1dHNldHMu
YXBwZW5kKHJzKQorCisgICAgICAgIHJldHVybiBBZ2dyZWdhdGVUZXN0T3V0cHV0U2V0KG91dHB1
dHNldHMpCisKICAgICBkZWYgX2J1aWxkX2RyaXZlcihzZWxmKToKICAgICAgICAgY29uZmlndXJh
dGlvbiA9IHNlbGYuZ2V0X29wdGlvbignY29uZmlndXJhdGlvbicpCiAgICAgICAgIHJldHVybiBz
ZWxmLl9jb25maWcuYnVpbGRfZHVtcHJlbmRlcnRyZWUoY29uZmlndXJhdGlvbikK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>79548</attachid>
            <date>2011-01-19 20:51:13 -0800</date>
            <delta_ts>2011-01-20 19:29:42 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-52136-20110120155110.patch</filename>
            <type>text/plain</type>
            <size>27464</size>
            <attacher name="James Kozianski">koz</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rvb2xzL0NoYW5nZUxvZwppbmRleCA5ZDg3
OTE3N2JhZDUxYzM4MzMwYzYxMWIyZGY0OWU3N2VmMGMyNTZmLi5lMWUwYWI0Njg1MGIzYjNlZDgx
MGE3ZDUzOTc1YTM1OTYzYTEyNmRhIDEwMDY0NAotLS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIv
VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjEgQEAKKzIwMTEtMDEtMTkgIEphbWVzIEtvemlh
bnNraSAgPGtvekBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgQWRkIGNsYXNzZXMgZm9yIHJlcHJlc2VudGluZyB0ZXN0IG91dHB1
dHMuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01MjEz
NgorCisgICAgICAgIFRoZXNlIGNsYXNzZXMgd2lsbCBtYWtlIGl0IGVhc2llciB0byB3cml0ZSBz
Y3JpcHRzIHRoYXQgZGVhbCB3aXRoIHRlc3QKKyAgICAgICAgb3V0cHV0cyBzdWNoIGFzIHJlYmFz
ZWxpbmluZyBhbmQgZGVkdXBpbmcgc2NyaXB0cy4gVGhlIGludGVudCBpcyB0aGF0CisgICAgICAg
IGV2ZW50dWFsbHkgd2Ugd2lsbCBiZSBoYXZlIGJ1aWxkYm90IHJldHVybiBUZXN0T3V0cHV0cyBm
b3IgYQorICAgICAgICBwYXJ0aWN1bGFyIGJ1aWxkIHdoaWNoIGNhbiBiZSBjb21wYXJlZCB3aXRo
IFRlc3RPdXRwdXRzIGRlcml2ZWQgZnJvbSBhCisgICAgICAgIGxvY2FsIExheW91dFRlc3RzIGRp
cmVjdG9yeS4KKworICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0
cHV0LnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVz
dG91dHB1dF91bml0dGVzdC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9j
b21tb24vbmV0L3Rlc3RvdXRwdXRzZXQucHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Vi
a2l0cHkvY29tbW9uL25ldC90ZXN0b3V0cHV0c2V0X3VuaXR0ZXN0LnB5OiBBZGRlZC4KKwogMjAx
MS0wMS0wOCAgQmVuamFtaW4gUG91bGFpbiAgPGJlbmphbWluLnBvdWxhaW5Abm9raWEuY29tPgog
CiAgICAgICAgIFJldmlld2VkIGJ5IEtlbm5ldGggUm9oZGUgQ2hyaXN0aWFuc2VuLgpkaWZmIC0t
Z2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Rlc3RvdXRwdXQucHkgYi9U
b29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dC5weQpuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Li40ZjZkNzBjYTA4YWVmYjFmMjBhNWU4ZWM0MjZmN2JhMzg0ZjczYzNlCi0tLSAvZGV2L251bGwK
KysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Rlc3RvdXRwdXQucHkKQEAg
LTAsMCArMSwxNjcgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMpIDIw
MTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIg
QU5EIEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWQorIyBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisjIExP
U1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORAorIyBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YK
KyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKworaW1wb3J0IG9zCitpbXBvcnQgcmUKKworCitjbGFzcyBOYWl2ZUltYWdl
RGlmZmVyKG9iamVjdCk6CisgICAgZGVmIHNhbWVfaW1hZ2Uoc2VsZiwgaW1nMSwgaW1nMik6Cisg
ICAgICAgIHJldHVybiBpbWcxID09IGltZzIKKworCitjbGFzcyBUZXN0T3V0cHV0KG9iamVjdCk6
CisgICAgIiIiUmVwcmVzZW50cyB0aGUgb3V0cHV0IG9mIGEgc2luZ2xlIHRlc3Qgb24gYSBzaW5n
bGUgcGxhdGZvcm0iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGxhdGZvcm0sIG91dHB1dF90
eXBlLCBmaWxlcyk6CisgICAgICAgIHNlbGYuX3BsYXRmb3JtID0gcGxhdGZvcm0KKyAgICAgICAg
c2VsZi5fb3V0cHV0X3R5cGUgPSBvdXRwdXRfdHlwZQorICAgICAgICBzZWxmLl9maWxlcyA9IGZp
bGVzCisgICAgICAgIHNlbGYuX21haW5fZmlsZSA9IGZpbGVzWzBdCisgICAgICAgIGZpbGVuYW1l
ID0gc2VsZi5fbWFpbl9maWxlLm5hbWUoKQorICAgICAgICBzZWxmLl9uYW1lID0gc2VsZi5fZXh0
cmFjdF90ZXN0X25hbWUoZmlsZW5hbWUpCisgICAgICAgIHNlbGYuX2lzX2FjdHVhbCA9ICctYWN0
dWFsLicgaW4gZmlsZW5hbWUKKworICAgICAgICBpZiBzZWxmLl9wbGF0Zm9ybSBpcyBOb25lOgor
ICAgICAgICAgICAgc2VsZi5fcGxhdGZvcm0gPSBzZWxmLl9leHRyYWN0X3BsYXRmb3JtKGZpbGVu
YW1lKQorCisgICAgZGVmIF9leHRyYWN0X3BsYXRmb3JtKHNlbGYsIGZpbGVuYW1lKToKKyAgICAg
ICAgIiIiQ2FsY3VsYXRlcyB0aGUgcGxhdGZvcm0gZnJvbSB0aGUgbmFtZSBvZiB0aGUgZmlsZSBp
ZiBpdCBpc24ndCBrbm93biBhbHJlYWR5IiIiCisgICAgICAgIHBhdGggPSByZS5zcGxpdChvcy5w
YXRoLnNlcCwgZmlsZW5hbWUpCisgICAgICAgIGlmICdwbGF0Zm9ybScgaW4gcGF0aDoKKyAgICAg
ICAgICAgIHJldHVybiBwYXRoW3BhdGguaW5kZXgoJ3BsYXRmb3JtJykgKyAxXQorICAgICAgICBy
ZXR1cm4gTm9uZQorCisgICAgZGVmIF9leHRyYWN0X3Rlc3RfbmFtZShzZWxmLCBmaWxlbmFtZSk6
CisgICAgICAgIHRlc3RfbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIHBhdGggPSByZS5zcGxpdChv
cy5wYXRoLnNlcCwgdGVzdF9uYW1lKQorICAgICAgICBpZiAnTGF5b3V0VGVzdHMnIGluIHBhdGg6
CisgICAgICAgICAgICBwYXRoID0gcGF0aFsxICsgcGF0aC5pbmRleCgnTGF5b3V0VGVzdHMnKTpd
CisgICAgICAgIGlmICdsYXlvdXQtdGVzdC1yZXN1bHRzJyBpbiBwYXRoOgorICAgICAgICAgICAg
cGF0aCA9IHBhdGhbMSArIHBhdGguaW5kZXgoJ2xheW91dC10ZXN0LXJlc3VsdHMnKTpdCisgICAg
ICAgIGlmICdwbGF0Zm9ybScgaW4gcGF0aDoKKyAgICAgICAgICAgIHBhdGggPSBwYXRoWzIgKyBw
YXRoLmluZGV4KCdwbGF0Zm9ybScpOl0KKworICAgICAgICB0ZXN0X25hbWUgPSBwYXRoWy0xXQor
ICAgICAgICB0ZXN0X25hbWUgPSByZS5zdWIoJy1leHBlY3RlZFwuLiokJywgJycsIHRlc3RfbmFt
ZSkKKyAgICAgICAgdGVzdF9uYW1lID0gcmUuc3ViKCctYWN0dWFsXC4uKiQnLCAnJywgdGVzdF9u
YW1lKQorICAgICAgICBwYXRoWy0xXSA9IHRlc3RfbmFtZQorICAgICAgICByZXR1cm4gb3MucGF0
aC5zZXAuam9pbihwYXRoKQorCisgICAgZGVmIF9zZXRfdGVzdF9uYW1lKHNlbGYsIGZpbGVuYW1l
KToKKyAgICAgICAgc2VsZi5fdGVzdF9uYW1lID0gZmlsZW5hbWUKKyAgICAgICAgaWYgb3MucGF0
aC5zZXAgaW4gZmlsZW5hbWU6CisgICAgICAgICAgICBzZWxmLl90ZXN0X25hbWUgPSBmaWxlbmFt
ZVs6ZmlsZW5hbWUucmluZGV4KG9zLnBhdGguc2VwKV0KKworICAgIGRlZiBjb250ZW50cyhzZWxm
KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX21haW5fZmlsZS5jb250ZW50cygpCisKKyAgICBkZWYg
c2F2ZV90byhzZWxmLCBwYXRoKToKKyAgICAgICAgZm9yIGZpbGUgaW4gc2VsZi5fZmlsZXM6Cisg
ICAgICAgICAgICBmaWxlLnNhdmVfdG8ocGF0aCkKKworICAgIGRlZiBpc19hY3R1YWwoc2VsZik6
CisgICAgICAgICIiIklzIHRoaXMgb3V0cHV0IHRoZSBhY3R1YWwgb3V0cHV0IG9mIGEgdGVzdD8g
KEFzIG9wcG9zZWQgdG8gZXhwZWN0ZWQgb3V0cHV0LikiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYu
X2lzX2FjdHVhbAorCisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgICIiIlRoZSBuYW1lIG9m
IHRoaXMgdGVzdCAoZG9lc24ndCBpbmNsdWRlIGV4dGVuc2lvbikiIiIKKyAgICAgICAgcmV0dXJu
IHNlbGYuX25hbWUKKworICAgIGRlZiBzYW1lX2NvbnRlbnQoc2VsZiwgb3RoZXIpOgorICAgICAg
ICByZXR1cm4gc2VsZi5jb250ZW50cygpID09IG90aGVyLmNvbnRlbnRzKCkKKworICAgIGRlZiBf
X2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gb3RoZXIgIT0gTm9uZSBhbmQgc2Vs
Zi5uYW1lKCkgPT0gb3RoZXIubmFtZSgpIGFuZCBzZWxmLnR5cGUoKSA9PSBvdGhlci50eXBlKCkg
YW5kIHNlbGYucGxhdGZvcm0oKSA9PSBvdGhlci5wbGF0Zm9ybSgpIGFuZCBzZWxmLmlzX2FjdHVh
bCgpID09IG90aGVyLmlzX2FjdHVhbCgpIGFuZCBzZWxmLnNhbWVfY29udGVudChvdGhlcikKKwor
ICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGhhc2goc3RyKHNlbGYubmFt
ZSgpKSArIHN0cihzZWxmLnR5cGUoKSkgKyBzdHIoc2VsZi5wbGF0Zm9ybSgpKSkKKworICAgIGRl
ZiBpc19uZXdlcl90aGFuKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiJ05ldycgb3V0cHV0cyBh
cmUgdGhvc2UgYWN0dWFsbHkgY29taW5nIGZyb20gYSB0ZXN0LiIiIgorICAgICAgICByZXR1cm4g
c2VsZi5pc19hY3R1YWwoKSBhbmQgbm90IG90aGVyLmlzX2FjdHVhbCgpCisKKyAgICBkZWYgaXNf
cmViYXNlbGluZV9vZihzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBzZWxmLm5hbWUoKSA9
PSBvdGhlci5uYW1lKCkgYW5kIHNlbGYudHlwZSgpID09IG90aGVyLnR5cGUoKSBhbmQgc2VsZi5w
bGF0Zm9ybSgpID09IG90aGVyLnBsYXRmb3JtKCkgYW5kIHNlbGYuaXNfYWN0dWFsKCkgYW5kIChu
b3Qgb3RoZXIuaXNfYWN0dWFsKCkpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAg
YWN0dWFsX3N0ciA9ICdbQV0gJyBpZiBzZWxmLmlzX2FjdHVhbCgpIGVsc2UgJycKKyAgICAgICAg
cmV0dXJuICJUZXN0T3V0cHV0WyVzLyVzXSAlcyVzIiAlIChzZWxmLl9wbGF0Zm9ybSwgc2VsZi5f
b3V0cHV0X3R5cGUsIGFjdHVhbF9zdHIsIHNlbGYubmFtZSgpKQorCisgICAgZGVmIHR5cGUoc2Vs
Zik6CisgICAgICAgIHJldHVybiBzZWxmLl9vdXRwdXRfdHlwZQorCisgICAgZGVmIHBsYXRmb3Jt
KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcGxhdGZvcm0KKworICAgIGRlZiBfaW5zdGFs
bF9maWxlKHNlbGYsIGZpbGUsIHBhdGgpOgorICAgICAgICBpZiBzZWxmLl9wbGF0Zm9ybSBpcyBO
b25lOgorICAgICAgICAgICAgcGxhdGZvcm1fY29tcG9uZW50ID0gIiIKKyAgICAgICAgZWxzZToK
KyAgICAgICAgICAgIHBsYXRmb3JtX2NvbXBvbmVudCA9ICJwbGF0Zm9ybS8lcy8iICUgc2VsZi5f
cGxhdGZvcm0KKyAgICAgICAgZXh0ZW5zaW9uID0gb3MucGF0aC5zcGxpdGV4dChmaWxlLm5hbWUo
KSlbMV0KKyAgICAgICAgcGF0aCA9ICclcy8lcycgJSAocGF0aCwgcGxhdGZvcm1fY29tcG9uZW50
KQorICAgICAgICBmaWxlbmFtZSA9IHNlbGYubmFtZSgpICsgJy1leHBlY3RlZCcgKyBleHRlbnNp
b24KKyAgICAgICAgZmlsZS5zYXZlX3RvKHBhdGgsIGZpbGVuYW1lKQorCisgICAgZGVmIGluc3Rh
bGwoc2VsZiwgcGF0aCk6CisgICAgICAgIGZvciBmaWxlIGluIHNlbGYuX2ZpbGVzOgorICAgICAg
ICAgICAgc2VsZi5faW5zdGFsbF9maWxlKGZpbGUsIHBhdGgpCisKKyAgICBkZWYgZGVsZXRlKHNl
bGYpOgorICAgICAgICBmb3IgZmlsZSBpbiBzZWxmLl9maWxlczoKKyAgICAgICAgICAgIGZpbGUu
ZGVsZXRlKCkKKworCitjbGFzcyBUZXh0VGVzdE91dHB1dChUZXN0T3V0cHV0KToKKyAgICAiIiJS
ZXByZXNlbnRzIGEgdGV4dCBvdXRwdXQgb2YgYSBzaW5nbGUgdGVzdCBvbiBhIHNpbmdsZSBwbGF0
Zm9ybSIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwbGF0Zm9ybSwgdGV4dF9maWxlKToKKyAg
ICAgICAgc2VsZi5fdGV4dF9maWxlID0gdGV4dF9maWxlCisgICAgICAgIFRlc3RPdXRwdXQuX19p
bml0X18oc2VsZiwgcGxhdGZvcm0sICd0ZXh0JywgW3RleHRfZmlsZV0pCisKKyAgICBkZWYgcmV0
YXJnZXQoc2VsZiwgcGxhdGZvcm0pOgorICAgICAgICByZXR1cm4gVGV4dFRlc3RPdXRwdXQocGxh
dGZvcm0sIHNlbGYuX3RleHRfZmlsZSkKKworCitjbGFzcyBJbWFnZVRlc3RPdXRwdXQoVGVzdE91
dHB1dCk6CisgICAgaW1hZ2VfZGlmZmVyID0gTmFpdmVJbWFnZURpZmZlcigpCisgICAgIiIiUmVw
cmVzZW50cyBhbiBpbWFnZSBvdXRwdXQgb2YgYSBzaW5nbGUgdGVzdCBvbiBhIHNpbmdsZSBwbGF0
Zm9ybSIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwbGF0Zm9ybSwgaW1hZ2VfZmlsZSwgY2hl
Y2tzdW1fZmlsZSk6CisgICAgICAgIHNlbGYuX2NoZWNrc3VtX2ZpbGUgPSBjaGVja3N1bV9maWxl
CisgICAgICAgIHNlbGYuX2ltYWdlX2ZpbGUgPSBpbWFnZV9maWxlCisgICAgICAgIGZpbGVzID0g
ZmlsdGVyKGJvb2wsIFtzZWxmLl9jaGVja3N1bV9maWxlLCBzZWxmLl9pbWFnZV9maWxlXSkKKyAg
ICAgICAgVGVzdE91dHB1dC5fX2luaXRfXyhzZWxmLCBwbGF0Zm9ybSwgJ2ltYWdlJywgZmlsZXMp
CisKKyAgICBkZWYgaGFzX2NoZWNrc3VtKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2hl
Y2tzdW1fZmlsZSBpcyBub3QgTm9uZQorCisgICAgZGVmIHNhbWVfY29udGVudChzZWxmLCBvdGhl
cik6CisgICAgICAgIGlmIHNlbGYuaGFzX2NoZWNrc3VtKCkgYW5kIG90aGVyLmhhc19jaGVja3N1
bSgpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NoZWNrc3VtX2ZpbGUuY29udGVudHMoKSA9
PSBvdGhlci5fY2hlY2tzdW1fZmlsZS5jb250ZW50cygpCisgICAgICAgIGVsc2U6CisgICAgICAg
ICAgICBzZWxmX2NvbnRlbnRzID0gc2VsZi5faW1hZ2VfZmlsZS5jb250ZW50cygpCisgICAgICAg
ICAgICBvdGhlcl9jb250ZW50cyA9IG90aGVyLl9pbWFnZV9maWxlLmNvbnRlbnRzKCkKKyAgICAg
ICAgICAgIHJldHVybiBJbWFnZVRlc3RPdXRwdXQuaW1hZ2VfZGlmZmVyLnNhbWVfaW1hZ2Uoc2Vs
Zl9jb250ZW50cywgb3RoZXJfY29udGVudHMpCisKKyAgICBkZWYgcmV0YXJnZXQoc2VsZiwgcGxh
dGZvcm0pOgorICAgICAgICByZXR1cm4gSW1hZ2VUZXN0T3V0cHV0KHBsYXRmb3JtLCBzZWxmLl9p
bWFnZV9maWxlLCBzZWxmLl9jaGVja3N1bV9maWxlKQpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0
cy93ZWJraXRweS9jb21tb24vbmV0L3Rlc3RvdXRwdXRfdW5pdHRlc3QucHkgYi9Ub29scy9TY3Jp
cHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dF91bml0dGVzdC5weQpuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Li5kMTZiOWQ4ZGQxYmJiMDlhYmIyMGZkMjE1MDlhOTU0NzU5MzQxZTY1Ci0tLSAvZGV2L251bGwK
KysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Rlc3RvdXRwdXRfdW5pdHRl
c3QucHkKQEAgLTAsMCArMSwxMzMgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmln
aHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiAgUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIwor
IyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JT
ICJBUyBJUyIgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWQorIyBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7CisjIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorIyBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKworaW1wb3J0IHJlCitpbXBvcnQgdGVzdG91dHB1dAoraW1w
b3J0IHVuaXR0ZXN0CisKKworY2xhc3MgRmFrZUZpbGUob2JqZWN0KToKKyAgICBkZWYgX19pbml0
X18oc2VsZiwgZmlsZW5hbWUsIGNvbnRlbnRzPSJmYWtlIGNvbnRlbnRzIik6CisgICAgICAgIHNl
bGYuX2ZpbGVuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgc2VsZi5fY29udGVudHMgPSBjb250ZW50
cworCisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlbmFtZQor
CisgICAgZGVmIGNvbnRlbnRzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29udGVudHMK
KworCitjbGFzcyBGYWtlVGVzdE91dHB1dCh0ZXN0b3V0cHV0LlRlc3RPdXRwdXQpOgorICAgIGRl
ZiBfX2luaXRfXyhzZWxmLCBwbGF0Zm9ybSwgb3V0cHV0X3R5cGUsIGNvbnRlbnRzLCBpc19leHBl
Y3RlZD1GYWxzZSk6CisgICAgICAgIHNlbGYuX291dHB1dF90eXBlID0gb3V0cHV0X3R5cGUKKyAg
ICAgICAgc2VsZi5fY29udGVudHMgPSBjb250ZW50cworICAgICAgICBzZWxmLl9pc19leHBlY3Rl
ZCA9IGlzX2V4cGVjdGVkCisgICAgICAgIGFjdHVhbCA9ICdhY3R1YWwnCisgICAgICAgIGlmIGlz
X2V4cGVjdGVkOgorICAgICAgICAgICAgYWN0dWFsID0gJ2V4cGVjdGVkJworICAgICAgICB0ZXN0
X25hbWUgPSAnYW5vbnltb3VzLXRlc3QtJXMudHh0JyAlIGFjdHVhbAorICAgICAgICBmaWxlID0g
RmFrZUZpbGUodGVzdF9uYW1lLCBjb250ZW50cykKKyAgICAgICAgc3VwZXIoRmFrZVRlc3RPdXRw
dXQsIHNlbGYpLl9faW5pdF9fKHBsYXRmb3JtLCBvdXRwdXRfdHlwZSwgW2ZpbGVdKQorCisgICAg
ZGVmIGNvbnRlbnRzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29udGVudHMKKworICAg
IGRlZiByZXRhcmdldChzZWxmLCBwbGF0Zm9ybSk6CisgICAgICAgIHJldHVybiBGYWtlVGVzdE91
dHB1dChwbGF0Zm9ybSwgc2VsZi5fb3V0cHV0X3R5cGUsIHNlbGYuX2NvbnRlbnRzLCBzZWxmLl9p
c19leHBlY3RlZCkKKworCitjbGFzcyBUZXN0T3V0cHV0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6
CisgICAgZGVmIF9jaGVja19uYW1lKHNlbGYsIGZpbGVuYW1lLCBleHBlY3RlZF90ZXN0X25hbWUp
OgorICAgICAgICByID0gdGVzdG91dHB1dC5UZXh0VGVzdE91dHB1dChOb25lLCBGYWtlRmlsZShm
aWxlbmFtZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkX3Rlc3RfbmFtZSwg
ci5uYW1lKCkpCisKKyAgICBkZWYgX2NoZWNrX3BsYXRmb3JtKHNlbGYsIGZpbGVuYW1lLCBleHBl
Y3RlZF9wbGF0Zm9ybSk6CisgICAgICAgIHIgPSB0ZXN0b3V0cHV0LlRleHRUZXN0T3V0cHV0KE5v
bmUsIEZha2VGaWxlKGZpbGVuYW1lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0
ZWRfcGxhdGZvcm0sIHIucGxhdGZvcm0oKSkKKworICAgIGRlZiB0ZXN0X2V4dHJhY3RzX25hbWVf
Y29ycmVjdGx5KHNlbGYpOgorICAgICAgICBzZWxmLl9jaGVja19uYW1lKCdMYXlvdXRUZXN0cy9m
YXN0L2RvbS9hLWV4cGVjdGVkLnR4dCcsICdmYXN0L2RvbS9hJykKKyAgICAgICAgc2VsZi5fY2hl
Y2tfbmFtZSgnTGF5b3V0VGVzdHMvZmFzdC9kb20vYS1hY3R1YWwudHh0JywgJ2Zhc3QvZG9tL2En
KQorICAgICAgICBzZWxmLl9jaGVja19uYW1lKCdMYXlvdXRUZXN0cy9wbGF0Zm9ybS93aW4vZmFz
dC9hLWV4cGVjdGVkLnR4dCcsICdmYXN0L2EnKQorICAgICAgICBzZWxmLl9jaGVja19uYW1lKCdM
YXlvdXRUZXN0cy9wbGF0Zm9ybS93aW4vZmFzdC9hLWV4cGVjdGVkLmNoZWNrc3VtJywgJ2Zhc3Qv
YScpCisgICAgICAgIHNlbGYuX2NoZWNrX25hbWUoJ2Zhc3QvZG9tL3Rlc3QtZXhwZWN0ZWQudHh0
JywgJ2Zhc3QvZG9tL3Rlc3QnKQorICAgICAgICBzZWxmLl9jaGVja19uYW1lKCdsYXlvdXQtdGVz
dC1yZXN1bHRzL2Zhc3QvYS1hY3R1YWwuY2hlY2tzdW0nLCAnZmFzdC9hJykKKworICAgIGRlZiB0
ZXN0X2V4dHJhY3RzX3BsYXRmb3JtX2NvcnJlY3RseShzZWxmKToKKyAgICAgICAgc2VsZi5fY2hl
Y2tfcGxhdGZvcm0oJ0xheW91dFRlc3RzL3BsYXRmb3JtL3dpbi9mYXN0L2EtZXhwZWN0ZWQudHh0
JywgJ3dpbicpCisgICAgICAgIHNlbGYuX2NoZWNrX3BsYXRmb3JtKCdwbGF0Zm9ybS93aW4vZmFz
dC9hLWV4cGVjdGVkLnR4dCcsICd3aW4nKQorICAgICAgICBzZWxmLl9jaGVja19wbGF0Zm9ybSgn
cGxhdGZvcm0vbWFjL2Zhc3QvYS1leHBlY3RlZC50eHQnLCAnbWFjJykKKyAgICAgICAgc2VsZi5f
Y2hlY2tfcGxhdGZvcm0oJ2Zhc3QvYS1leHBlY3RlZC50eHQnLCBOb25lKQorCisgICAgZGVmIHRl
c3Rfb3V0cHV0c19mcm9tX2FuX2FjdHVhbF9maWxlX2FyZV9tYXJrZWRfYXNfc3VjaChzZWxmKToK
KyAgICAgICAgciA9IHRlc3RvdXRwdXQuVGV4dFRlc3RPdXRwdXQoTm9uZSwgRmFrZUZpbGUoJ3Rl
c3QtYWN0dWFsLnR4dCcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoci5pc19hY3R1YWwoKSkK
KworICAgIGRlZiB0ZXN0X291dHB1dHNfZnJvbV9hbl9leHBlY3RlZF9maWxlX2FyZV9ub3RfYWN0
dWFsKHNlbGYpOgorICAgICAgICByID0gdGVzdG91dHB1dC5UZXh0VGVzdE91dHB1dChOb25lLCBG
YWtlRmlsZSgndGVzdC1leHBlY3RlZC50eHQnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShy
LmlzX2FjdHVhbCgpKQorCisgICAgZGVmIHRlc3RfaXNfcmViYXNlbGluZV9vZihzZWxmKToKKyAg
ICAgICAgZXhwZWN0ZWQgPSB0ZXN0b3V0cHV0LlRleHRUZXN0T3V0cHV0KCdtYWMnLCBGYWtlRmls
ZSgndGVzdC1leHBlY3RlZC50eHQnKSkKKyAgICAgICAgYWN0dWFsID0gdGVzdG91dHB1dC5UZXh0
VGVzdE91dHB1dCgnbWFjJywgRmFrZUZpbGUoJ3Rlc3QtYWN0dWFsLnR4dCcpKQorICAgICAgICBz
ZWxmLmFzc2VydFRydWUoYWN0dWFsLmlzX3JlYmFzZWxpbmVfb2YoZXhwZWN0ZWQpKQorICAgICAg
ICBzZWxmLmFzc2VydEZhbHNlKGV4cGVjdGVkLmlzX3JlYmFzZWxpbmVfb2YoYWN0dWFsKSkKKwor
ICAgIGRlZiB0ZXN0X19lcV9fKHNlbGYpOgorICAgICAgICByMSA9IHRlc3RvdXRwdXQuVGV4dFRl
c3RPdXRwdXQoJ21hYycsIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnR4dCcsICdjb250ZW50cycp
KQorICAgICAgICByMiA9IHRlc3RvdXRwdXQuVGV4dFRlc3RPdXRwdXQoJ21hYycsIEZha2VGaWxl
KCd0ZXN0LWV4cGVjdGVkLnR4dCcsICdjb250ZW50cycpKQorICAgICAgICByMyA9IHRlc3RvdXRw
dXQuVGV4dFRlc3RPdXRwdXQoJ3dpbicsIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnR4dCcsICdj
b250ZW50cycpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHIxLCByMikKKyAgICAgICAg
c2VsZi5hc3NlcnRFcXVhbHMocjEsIHIyLnJldGFyZ2V0KCdtYWMnKSkKKyAgICAgICAgc2VsZi5h
c3NlcnROb3RFcXVhbHMocjEsIHIyLnJldGFyZ2V0KCd3aW4nKSkKKworICAgIGRlZiB0ZXN0X19o
YXNoX18oc2VsZik6CisgICAgICAgIHIxID0gdGVzdG91dHB1dC5UZXh0VGVzdE91dHB1dCgnbWFj
JywgRmFrZUZpbGUoJ3Rlc3QtZXhwZWN0ZWQudHh0JywgJ2NvbnRlbnRzJykpCisgICAgICAgIHIy
ID0gdGVzdG91dHB1dC5UZXh0VGVzdE91dHB1dCgnbWFjJywgRmFrZUZpbGUoJ3Rlc3QtZXhwZWN0
ZWQudHh0JywgJ2NvbnRlbnRzJykpCisgICAgICAgIHIzID0gdGVzdG91dHB1dC5UZXh0VGVzdE91
dHB1dChOb25lLCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC50eHQnLCBOb25lKSkKKworICAgICAg
ICB4ID0gc2V0KFtyMSwgcjJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4oc2V0
KFtyMSwgcjJdKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDIsIGxlbihzZXQoW3IxLCBy
MiwgcjNdKSkpCisKKyAgICBkZWYgdGVzdF9pbWFnZV9kaWZmX2lzX2ludm9rZWRfZm9yX2ltYWdl
X291dHB1dHNfd2l0aG91dF9jaGVja3N1bShzZWxmKToKKyAgICAgICAgcjEgPSB0ZXN0b3V0cHV0
LkltYWdlVGVzdE91dHB1dCgnbWFjJywgRmFrZUZpbGUoJ3Rlc3QtZXhwZWN0ZWQucG5nJywgJ2Fz
ZGYnKSwgRmFrZUZpbGUoJ3Rlc3QtZXhwZWN0ZWQuY2hlY2tzdW0nLCAnY2hlY2snKSkKKyAgICAg
ICAgcjIgPSB0ZXN0b3V0cHV0LkltYWdlVGVzdE91dHB1dCgnbWFjJywgRmFrZUZpbGUoJ3Rlc3Qt
ZXhwZWN0ZWQucG5nJywgJ2FzZGYnKSwgTm9uZSkKKworICAgICAgICAjIERlZmF1bHQgYmVoYXZp
b3VyIGlzIHRvIGp1c3QgY29tcGFyZSBvbiBpbWFnZSBjb250ZW50cy4KKyAgICAgICAgc2VsZi5h
c3NlcnRUcnVlKHIxLnNhbWVfY29udGVudChyMikpCisKKyAgICAgICAgY2xhc3MgQWxsSW1hZ2Vz
QXJlRGlmZmVyZW50KG9iamVjdCk6CisgICAgICAgICAgICBkZWYgc2FtZV9pbWFnZShzZWxmLCBp
bWFnZTEsIGltYWdlMik6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAg
IyBCdXQgd2UgY2FuIGluc3RhbGwgb3RoZXIgaW1hZ2UgZGlmZmVycy4KKyAgICAgICAgdGVzdG91
dHB1dC5JbWFnZVRlc3RPdXRwdXQuaW1hZ2VfZGlmZmVyID0gQWxsSW1hZ2VzQXJlRGlmZmVyZW50
KCkKKworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHIxLnNhbWVfY29udGVudChyMikpCisKK2lm
IF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQg
YS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dHNldC5weSBiL1Rv
b2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0cHV0c2V0LnB5Cm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLjMzMTQyNjJkMTRjZDhiNGY0MTM4NGFjYzRiZDMxODBmN2U1YzdkOWMKLS0tIC9kZXYvbnVs
bAorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dHNldC5w
eQpAQCAtMCwwICsxLDEzMSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAo
QykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAy
LiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFT
IElTIiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsK
KyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZGlyZWN0b3J5
ZmlsZXNldCBpbXBvcnQgRGlyZWN0b3J5RmlsZVNldAorZnJvbSB3ZWJraXRweS5jb21tb24uc3lz
dGVtLnppcGZpbGVzZXQgaW1wb3J0IFppcEZpbGVTZXQKK2ltcG9ydCByZQoraW1wb3J0IHRlc3Rv
dXRwdXQKK2ltcG9ydCB1cmxsaWIKKworCitjbGFzcyBUZXN0T3V0cHV0U2V0KG9iamVjdCk6Cisg
ICAgIiIiQSBzZXQgb2YgdGVzdCBvdXRwdXRzIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5h
bWUsIHBsYXRmb3JtLCB6aXBfZmlsZSwgKiprd2FyZ3MpOgorICAgICAgICBzZWxmLl9uYW1lID0g
bmFtZQorICAgICAgICBzZWxmLl9wbGF0Zm9ybSA9IHBsYXRmb3JtCisgICAgICAgIHNlbGYuX3pp
cF9maWxlID0gemlwX2ZpbGUKKyAgICAgICAgc2VsZi5faW5jbHVkZV9leHBlY3RlZCA9IGt3YXJn
cy5nZXQoJ2luY2x1ZGVfZXhwZWN0ZWQnLCBUcnVlKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAg
ZGVmIGZyb21femlwX3VybChjbHMsIHBsYXRmb3JtLCB6aXBfcGF0aCk6CisgICAgICAgIHJldHVy
biBUZXN0T3V0cHV0U2V0KCdsb2NhbCB6aXAgJXMgYnVpbGRlcicgJSBwbGF0Zm9ybSwgcGxhdGZv
cm0sIFppcEZpbGVTZXQoemlwX3BhdGgpKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGZy
b21femlwKGNscywgcGxhdGZvcm0sIHppcCk6CisgICAgICAgIHJldHVybiBUZXN0T3V0cHV0U2V0
KCdsb2NhbCB6aXAgJXMgYnVpbGRlcicgJSBwbGF0Zm9ybSwgcGxhdGZvcm0sIHppcCkKKworICAg
IEBjbGFzc21ldGhvZAorICAgIGRlZiBmcm9tX3ppcF9tYXAoY2xzLCB6aXBfbWFwKToKKyAgICAg
ICAgb3V0cHV0X3NldHMgPSBbXQorICAgICAgICBmb3IgaywgdiBpbiB6aXBfbWFwLml0ZW1zKCk6
CisgICAgICAgICAgICBvdXRwdXRfc2V0cy5hcHBlbmQoVGVzdE91dHB1dFNldC5mcm9tX3ppcChr
LCB2KSkKKyAgICAgICAgcmV0dXJuIEFnZ3JlZ2F0ZVRlc3RPdXRwdXRTZXQob3V0cHV0X3NldHMp
CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZnJvbV9wYXRoKHNlbGYsIHBhdGgsIHBsYXRm
b3JtPU5vbmUpOgorICAgICAgICB6ID0gRGlyZWN0b3J5RmlsZVNldChwYXRoKQorICAgICAgICBy
ZXR1cm4gVGVzdE91dHB1dFNldCgnbG9jYWwgJXMgYnVpbGRlcicgJSBwbGF0Zm9ybSwgcGxhdGZv
cm0sIHopCisKKyAgICBkZWYgbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX25hbWUK
KworICAgIGRlZiBzZXRfcGxhdGZvcm0oc2VsZiwgcGxhdGZvcm0pOgorICAgICAgICBzZWxmLl9w
bGF0Zm9ybSA9IHBsYXRmb3JtCisKKyAgICBkZWYgZmlsZXMoc2VsZik6CisgICAgICAgIGZpbGVz
ID0gW10KKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIHNlbGYuX3ppcF9maWxlLm5hbWVsaXN0KCk6
CisgICAgICAgICAgICBmaWxlcy5hcHBlbmQoc2VsZi5femlwX2ZpbGUub3BlbihmaWxlbmFtZSkp
CisgICAgICAgIHJldHVybiBmaWxlcworCisgICAgZGVmIG91dHB1dHNfZm9yKHNlbGYsIG5hbWUs
ICoqa3dhcmdzKToKKyAgICAgICAgdGFyZ2V0X3R5cGUgPSBrd2FyZ3MuZ2V0KCd0YXJnZXRfdHlw
ZScsIE5vbmUpCisgICAgICAgIGV4YWN0X21hdGNoID0ga3dhcmdzLmdldCgnZXhhY3RfbWF0Y2gn
LCBGYWxzZSkKKyAgICAgICAgaWYgcmUuc2VhcmNoKHInXC54P2h0bWwnLCBuYW1lKToKKyAgICAg
ICAgICAgIG5hbWUgPSBuYW1lWzpuYW1lLnJpbmRleCgnLicpXQorICAgICAgICBuYW1lX21hdGNo
ZXIgPSByZS5jb21waWxlKG5hbWUpCisgICAgICAgIGFjdHVhbF9tYXRjaGVyID0gcmUuY29tcGls
ZShyJy1hY3R1YWxcLicpCisgICAgICAgIGV4cGVjdGVkX21hdGNoZXIgPSByZS5jb21waWxlKHIn
LWV4cGVjdGVkXC4nKQorCisgICAgICAgIGNoZWNrc3VtX2ZpbGVzID0gW10KKyAgICAgICAgdGV4
dF9maWxlcyA9IFtdCisgICAgICAgIGltYWdlX2ZpbGVzID0gW10KKyAgICAgICAgZm9yIG91dHB1
dF9maWxlIGluIHNlbGYuZmlsZXMoKToKKyAgICAgICAgICAgIG5hbWVfbWF0Y2ggPSBuYW1lX21h
dGNoZXIuc2VhcmNoKG91dHB1dF9maWxlLm5hbWUoKSkKKyAgICAgICAgICAgIGFjdHVhbF9tYXRj
aCA9IGFjdHVhbF9tYXRjaGVyLnNlYXJjaChvdXRwdXRfZmlsZS5uYW1lKCkpCisgICAgICAgICAg
ICBleHBlY3RlZF9tYXRjaCA9IGV4cGVjdGVkX21hdGNoZXIuc2VhcmNoKG91dHB1dF9maWxlLm5h
bWUoKSkKKyAgICAgICAgICAgIGlmIG5hbWVfbWF0Y2ggYW5kIChhY3R1YWxfbWF0Y2ggb3IgKHNl
bGYuX2luY2x1ZGVfZXhwZWN0ZWQgYW5kIGV4cGVjdGVkX21hdGNoKSk6CisgICAgICAgICAgICAg
ICAgaWYgb3V0cHV0X2ZpbGUubmFtZSgpLmVuZHN3aXRoKCcuY2hlY2tzdW0nKToKKyAgICAgICAg
ICAgICAgICAgICAgY2hlY2tzdW1fZmlsZXMuYXBwZW5kKG91dHB1dF9maWxlKQorICAgICAgICAg
ICAgICAgIGVsaWYgb3V0cHV0X2ZpbGUubmFtZSgpLmVuZHN3aXRoKCcudHh0Jyk6CisgICAgICAg
ICAgICAgICAgICAgIHRleHRfZmlsZXMuYXBwZW5kKG91dHB1dF9maWxlKQorICAgICAgICAgICAg
ICAgIGVsaWYgb3V0cHV0X2ZpbGUubmFtZSgpLmVuZHN3aXRoKCcucG5nJyk6CisgICAgICAgICAg
ICAgICAgICAgIGltYWdlX2ZpbGVzLmFwcGVuZChvdXRwdXRfZmlsZSkKKworICAgICAgICBvdXRw
dXRzID0gW10KKyAgICAgICAgZm9yIGltYWdlX2ZpbGUgaW4gaW1hZ2VfZmlsZXM6CisgICAgICAg
ICAgICBjaGVja3N1bV9maWxlX25hbWUgPSByZS5zdWIocmUuY29tcGlsZSgnXC5wbmcnKSwgJy5j
aGVja3N1bScsIGltYWdlX2ZpbGUubmFtZSgpKQorICAgICAgICAgICAgZm91bmRfY2hlY2tzdW0g
PSBGYWxzZQorICAgICAgICAgICAgZm9yIGNoZWNrc3VtX2ZpbGUgaW4gY2hlY2tzdW1fZmlsZXM6
CisgICAgICAgICAgICAgICAgaWYgY2hlY2tzdW1fZmlsZS5uYW1lKCkgPT0gY2hlY2tzdW1fZmls
ZV9uYW1lOgorICAgICAgICAgICAgICAgICAgICBmb3VuZF9jaGVja3N1bSA9IFRydWUKKyAgICAg
ICAgICAgICAgICAgICAgb3V0cHV0cy5hcHBlbmQodGVzdG91dHB1dC5JbWFnZVRlc3RPdXRwdXQo
c2VsZi5fcGxhdGZvcm0sIGltYWdlX2ZpbGUsIGNoZWNrc3VtX2ZpbGUpKQorICAgICAgICAgICAg
ICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgbm90IGZvdW5kX2NoZWNrc3VtOgorICAgICAg
ICAgICAgICAgICMgcHJpbnQgIkNvdWxkbid0IGZpbmQgY2hlY2tzdW0gZm9yIGltYWdlICclcyci
ICUgaW1hZ2VfZmlsZS5uYW1lKCkKKyAgICAgICAgICAgICAgICBvdXRwdXRzLmFwcGVuZCh0ZXN0
b3V0cHV0LkltYWdlVGVzdE91dHB1dChzZWxmLl9wbGF0Zm9ybSwgaW1hZ2VfZmlsZSwgTm9uZSkp
CisKKyAgICAgICAgZm9yIHRleHRfZmlsZSBpbiB0ZXh0X2ZpbGVzOgorICAgICAgICAgICAgb3V0
cHV0cy5hcHBlbmQodGVzdG91dHB1dC5UZXh0VGVzdE91dHB1dChzZWxmLl9wbGF0Zm9ybSwgdGV4
dF9maWxlKSkKKworICAgICAgICBpZiBleGFjdF9tYXRjaDoKKyAgICAgICAgICAgIG91dHB1dHMg
PSBmaWx0ZXIobGFtYmRhIHI6IHIubmFtZSgpID09IG5hbWUsIG91dHB1dHMpCisKKyAgICAgICAg
b3V0cHV0cyA9IGZpbHRlcihsYW1iZGEgcjogdGFyZ2V0X3R5cGUgaXMgTm9uZSBvciB0YXJnZXRf
dHlwZSA9PSByLnR5cGUoKSwgb3V0cHV0cykKKyAgICAgICAgcmV0dXJuIG91dHB1dHMKKworCitj
bGFzcyBBZ2dyZWdhdGVUZXN0T3V0cHV0U2V0KG9iamVjdCk6CisgICAgIiIiU2V0IG9mIHRlc3Qg
b3V0cHV0cyBmcm9tIGEgbGlzdCBvZiBidWlsZGVycyIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxm
LCBidWlsZGVycyk6CisgICAgICAgIHNlbGYuX2J1aWxkZXJzID0gYnVpbGRlcnMKKworICAgIGRl
ZiBvdXRwdXRzX2ZvcihzZWxmLCBuYW1lLCAqKmt3YXJncyk6CisgICAgICAgIG91dHB1dHMgPSBb
XQorICAgICAgICBmb3IgYnVpbGRlciBpbiBzZWxmLl9idWlsZGVyczoKKyAgICAgICAgICAgIG91
dHB1dHMgKz0gYnVpbGRlci5vdXRwdXRzX2ZvcihuYW1lLCAqKmt3YXJncykKKyAgICAgICAgcmV0
dXJuIG91dHB1dHMKKworICAgIGRlZiBzdWJfYnVpbGRlcnMoc2VsZik6CisgICAgICAgIHJldHVy
biBzZWxmLl9idWlsZGVycwpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21t
b24vbmV0L3Rlc3RvdXRwdXRzZXRfdW5pdHRlc3QucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5
L2NvbW1vbi9uZXQvdGVzdG91dHB1dHNldF91bml0dGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5jYjgwZWQx
NWExMjEyNzQwY2U5NTAyYTRmYzJjODU3YWU3OGM3YTc3Ci0tLSAvZGV2L251bGwKKysrIGIvVG9v
bHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Rlc3RvdXRwdXRzZXRfdW5pdHRlc3QucHkK
QEAgLTAsMCArMSwxNTIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMp
IDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisj
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4g
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJ
UyIgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWQorIyBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Cisj
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORAorIyBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug
T0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKworZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVtLmZpbGVzZXQgaW1w
b3J0IEZpbGVTZXRGaWxlSGFuZGxlCitpbXBvcnQgdGVzdG91dHB1dHNldAoraW1wb3J0IHVuaXR0
ZXN0CisKKworY2xhc3MgRmFrZVppcChvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToK
KyAgICAgICAgc2VsZi5fZmlsZXMgPSB7fQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAg
ICAgIHJldHVybiAiRmFrZVppcCIKKworICAgIGRlZiBpbnNlcnQoc2VsZiwgZmlsZW5hbWUsIGNv
bnRlbnQpOgorICAgICAgICBzZWxmLl9maWxlc1tmaWxlbmFtZV0gPSBjb250ZW50CisKKyAgICBk
ZWYgbmFtZWxpc3Qoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlcy5rZXlzKCkKKwor
ICAgIGRlZiBvcGVuKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgcmV0dXJuIEZpbGVTZXRGaWxl
SGFuZGxlKHNlbGYsIGZpbGVuYW1lKQorCisgICAgZGVmIHJlYWQoc2VsZiwgZmlsZW5hbWUpOgor
ICAgICAgICByZXR1cm4gc2VsZi5fZmlsZXNbZmlsZW5hbWVdCisKKyAgICBkZWYgZXh0cmFjdChz
ZWxmLCBmaWxlbmFtZSwgcGF0aCk6CisgICAgICAgIHByaW50ICJGYWtlWmlwPiBjcCAlcyAlcyIg
JSAoZmlsZW5hbWUsIHBhdGgpCisKKyAgICBkZWYgZGVsZXRlKHNlbGYsIGZpbGVuYW1lKToKKyAg
ICAgICAgcHJpbnQgIkZha2VaaXA+IHJtICVzIiAlIGZpbGVuYW1lCisgICAgICAgIHNlbGYuX2Zp
bGVzW2ZpbGVuYW1lXSA9IE5vbmUKKworCitjbGFzcyBUZXN0T3V0cHV0U2V0VGVzdCh1bml0dGVz
dC5UZXN0Q2FzZSk6CisgICAgZGVmIF9vdXRwdXRzZXRfd2l0aF96aXAoc2VsZiwgemlwLCAqKmt3
YXJncyk6CisgICAgICAgIHJldHVybiB0ZXN0b3V0cHV0c2V0LlRlc3RPdXRwdXRTZXQoJzxmYWtl
LW91dHB1dHNldD4nLCAnPGZha2UtcGxhdGZvcm0+JywgemlwLCAqKmt3YXJncykKKworICAgIGRl
ZiB0ZXN0X3RleHRfZmlsZXNfZ2V0X2ludGVycHJldGVkX2FzX3RleHRfb3V0cHV0cyhzZWxmKToK
KyAgICAgICAgemlwID0gRmFrZVppcCgpCisgICAgICAgIHppcC5pbnNlcnQoJ2Zhc3QvZG9tL3Nv
bWUtdGVzdC1hY3R1YWwudHh0JywgJ2FjdHVhbCBvdXRwdXRzJykKKyAgICAgICAgYiA9IHNlbGYu
X291dHB1dHNldF93aXRoX3ppcCh6aXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxl
bihiLm91dHB1dHNfZm9yKCdmYXN0L2RvbS9zb21lLXRlc3QnKSkpCisgICAgICAgIHNlbGYuYXNz
ZXJ0RXF1YWxzKCdmYXN0L2RvbS9zb21lLXRlc3QnLCBiLm91dHB1dHNfZm9yKCdmYXN0L2RvbS9z
b21lLXRlc3QuaHRtbCcpWzBdLm5hbWUoKSkKKworICAgIGRlZiB0ZXN0X2ltYWdlX2FuZF9jaGVj
a3N1bV9maWxlc19nZXRfaW50ZXJwcmV0ZWRfYXNfYV9zaW5nbGVfaW1hZ2Vfb3V0cHV0KHNlbGYp
OgorICAgICAgICB6aXAgPSBGYWtlWmlwKCkKKyAgICAgICAgemlwLmluc2VydCgnZmFzdC9kb20v
c29tZS10ZXN0LWFjdHVhbC5jaGVja3N1bScsICdhYmMxMjMnKQorICAgICAgICB6aXAuaW5zZXJ0
KCdmYXN0L2RvbS9zb21lLXRlc3QtYWN0dWFsLnBuZycsICc8aW1hZ2UgZGF0YT4nKQorICAgICAg
ICBiID0gc2VsZi5fb3V0cHV0c2V0X3dpdGhfemlwKHppcCkKKyAgICAgICAgb3V0cHV0cyA9IGIu
b3V0cHV0c19mb3IoJ2Zhc3QvZG9tL3NvbWUtdGVzdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1
YWxzKDEsIGxlbihvdXRwdXRzKSkKKyAgICAgICAgb3V0cHV0ID0gb3V0cHV0c1swXQorICAgICAg
ICBzZWxmLmFzc2VydEVxdWFscygnaW1hZ2UnLCBvdXRwdXQudHlwZSgpKQorICAgICAgICBzZWxm
LmFzc2VydEVxdWFscygnYWJjMTIzJywgb3V0cHV0LmNvbnRlbnRzKCkpCisKKyAgICBkZWYgdGVz
dF9tdWx0aXBsZV9pbWFnZV9vdXRwdXRzX2FyZV9kZXRlY3RlZChzZWxmKToKKyAgICAgICAgemlw
ID0gRmFrZVppcCgpCisgICAgICAgIHppcC5pbnNlcnQoJ3BsYXRmb3JtL3dpbi9mYXN0L2RvbS9z
b21lLXRlc3QtYWN0dWFsLmNoZWNrc3VtJywgJ2NoZWNrc3VtMScpCisgICAgICAgIHppcC5pbnNl
cnQoJ3BsYXRmb3JtL3dpbi9mYXN0L2RvbS9zb21lLXRlc3QtYWN0dWFsLnBuZycsICc8aW1hZ2Ug
ZGF0YSAxPicpCisgICAgICAgIHppcC5pbnNlcnQoJ3BsYXRmb3JtL21hYy9mYXN0L2RvbS9zb21l
LXRlc3QtYWN0dWFsLmNoZWNrc3VtJywgJ2NoZWNrc3VtMicpCisgICAgICAgIHppcC5pbnNlcnQo
J3BsYXRmb3JtL21hYy9mYXN0L2RvbS9zb21lLXRlc3QtYWN0dWFsLnBuZycsICc8aW1hZ2UgZGF0
YSAyPicpCisgICAgICAgIGIgPSBzZWxmLl9vdXRwdXRzZXRfd2l0aF96aXAoemlwKQorICAgICAg
ICBvdXRwdXRzID0gYi5vdXRwdXRzX2ZvcignZmFzdC9kb20vc29tZS10ZXN0JykKKyAgICAgICAg
c2VsZi5hc3NlcnRFcXVhbHMoMiwgbGVuKG91dHB1dHMpKQorICAgICAgICBzZWxmLmFzc2VydEZh
bHNlKG91dHB1dHNbMF0uc2FtZV9jb250ZW50KG91dHB1dHNbMV0pKQorCisgICAgZGVmIHRlc3Rf
YWdncmVnYXRlX291dHB1dF9zZXRfY29ycmVjdGx5X3JldHJpZXZlc190ZXN0c19mcm9tX211bHRp
cGxlX291dHB1dF9zZXRzKHNlbGYpOgorICAgICAgICBvdXRwdXRzZXQxX3ppcCA9IEZha2VaaXAo
KQorICAgICAgICBvdXRwdXRzZXQxX3ppcC5pbnNlcnQoJ2Zhc3QvZG9tL3Rlc3QtYWN0dWFsLnR4
dCcsICdsaW51eCB0ZXh0IG91dHB1dCcpCisgICAgICAgIG91dHB1dHNldDEgPSB0ZXN0b3V0cHV0
c2V0LlRlc3RPdXRwdXRTZXQoJ2xpbnV4LW91dHB1dHNldCcsICdsaW51eCcsIG91dHB1dHNldDFf
emlwKQorICAgICAgICBvdXRwdXRzZXQyX3ppcCA9IEZha2VaaXAoKQorICAgICAgICBvdXRwdXRz
ZXQyX3ppcC5pbnNlcnQoJ2Zhc3QvZG9tL3Rlc3QtYWN0dWFsLnR4dCcsICd3aW5kb3dzIHRleHQg
b3V0cHV0JykKKyAgICAgICAgb3V0cHV0c2V0MiA9IHRlc3RvdXRwdXRzZXQuVGVzdE91dHB1dFNl
dCgnd2luLW91dHB1dHNldCcsICd3aW4nLCBvdXRwdXRzZXQyX3ppcCkKKworICAgICAgICBiID0g
dGVzdG91dHB1dHNldC5BZ2dyZWdhdGVUZXN0T3V0cHV0U2V0KFtvdXRwdXRzZXQxLCBvdXRwdXRz
ZXQyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMiwgbGVuKGIub3V0cHV0c19mb3IoJ2Zh
c3QvZG9tL3Rlc3QnKSkpCisKKyAgICBkZWYgdGVzdF9jYW5faW5mZXJfcGxhdGZvcm1fZnJvbV9w
YXRoX2lmX25vbmVfcHJvdmlkZWQoc2VsZik6CisgICAgICAgIHppcCA9IEZha2VaaXAoKQorICAg
ICAgICB6aXAuaW5zZXJ0KCdwbGF0Zm9ybS93aW4vc29tZS10ZXN0LWV4cGVjdGVkLnBuZycsICc8
aW1hZ2UgZGF0YT4nKQorICAgICAgICB6aXAuaW5zZXJ0KCdwbGF0Zm9ybS93aW4vc29tZS10ZXN0
LWV4cGVjdGVkLmNoZWNrc3VtJywgJ2FiYzEyMycpCisgICAgICAgIGIgPSB0ZXN0b3V0cHV0c2V0
LlRlc3RPdXRwdXRTZXQoJ2xvY2FsIExheW91dFRlc3RzIG91dHB1dHNldCcsIE5vbmUsIHppcCkK
KworICAgICAgICBvdXRwdXRzID0gYi5vdXRwdXRzX2Zvcignc29tZS10ZXN0JykKKyAgICAgICAg
c2VsZi5hc3NlcnRFcXVhbHMoMSwgbGVuKG91dHB1dHMpKQorICAgICAgICBzZWxmLmFzc2VydEVx
dWFscygnd2luJywgb3V0cHV0c1swXS5wbGF0Zm9ybSgpKQorCisgICAgZGVmIHRlc3RfdGVzdF9l
eHRlbnNpb25faXNfaWdub3JlZChzZWxmKToKKyAgICAgICAgemlwID0gRmFrZVppcCgpCisgICAg
ICAgIHppcC5pbnNlcnQoJ3Rlc3QvdGVzdC1hLWFjdHVhbC50eHQnLCAnYWN0dWFsIG91dHB1dHMn
KQorICAgICAgICBiID0gc2VsZi5fb3V0cHV0c2V0X3dpdGhfemlwKHppcCkKKyAgICAgICAgb3V0
cHV0cyA9IGIub3V0cHV0c19mb3IoJ3Rlc3QvdGVzdC1hLmh0bWwnKQorICAgICAgICBzZWxmLmFz
c2VydEVxdWFscygxLCBsZW4ob3V0cHV0cykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCd0
ZXN0L3Rlc3QtYScsIG91dHB1dHNbMF0ubmFtZSgpKQorCisgICAgZGVmIHRlc3RfZXhpc3Rpbmdf
b3V0cHV0c19hcmVfbWFya2VkX2FzX3N1Y2goc2VsZik6CisgICAgICAgIHppcCA9IEZha2VaaXAo
KQorICAgICAgICB6aXAuaW5zZXJ0KCd0ZXN0L3Rlc3QtYS1leHBlY3RlZC50eHQnLCAnZXhwZWN0
ZWQgb3V0cHV0cycpCisgICAgICAgIGIgPSBzZWxmLl9vdXRwdXRzZXRfd2l0aF96aXAoemlwKQor
ICAgICAgICBvdXRwdXRzID0gYi5vdXRwdXRzX2ZvcigndGVzdC90ZXN0LWEuaHRtbCcpCisgICAg
ICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbihvdXRwdXRzKSkKKyAgICAgICAgc2VsZi5hc3Nl
cnRGYWxzZShvdXRwdXRzWzBdLmlzX2FjdHVhbCgpKQorCisgICAgZGVmIHRlc3Rfb25seV9yZXR1
cm5zX291dHB1dHNfb2Zfc3BlY2lmaWVkX3R5cGUoc2VsZik6CisgICAgICAgIHppcCA9IEZha2Va
aXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCd0ZXN0L3Rlc3QtYS1leHBlY3RlZC50eHQnLCAnZXhw
ZWN0ZWQgb3V0cHV0cycpCisgICAgICAgIHppcC5pbnNlcnQoJ3Rlc3QvdGVzdC1hLWV4cGVjdGVk
LmNoZWNrc3VtJywgJ2V4cGVjdGVkIG91dHB1dHMnKQorICAgICAgICB6aXAuaW5zZXJ0KCd0ZXN0
L3Rlc3QtYS1leHBlY3RlZC5wbmcnLCAnZXhwZWN0ZWQgb3V0cHV0cycpCisgICAgICAgIGIgPSBz
ZWxmLl9vdXRwdXRzZXRfd2l0aF96aXAoemlwKQorCisgICAgICAgIG91dHB1dHMgPSBiLm91dHB1
dHNfZm9yKCd0ZXN0L3Rlc3QtYS5odG1sJykKKyAgICAgICAgdGV4dF9vdXRwdXRzID0gYi5vdXRw
dXRzX2ZvcigndGVzdC90ZXN0LWEuaHRtbCcsIHRhcmdldF90eXBlPSd0ZXh0JykKKyAgICAgICAg
aW1hZ2Vfb3V0cHV0cyA9IGIub3V0cHV0c19mb3IoJ3Rlc3QvdGVzdC1hLmh0bWwnLCB0YXJnZXRf
dHlwZT0naW1hZ2UnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDIsIGxlbihvdXRwdXRz
KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgbGVuKHRleHRfb3V0cHV0cykpCisgICAg
ICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbihpbWFnZV9vdXRwdXRzKSkKKyAgICAgICAgc2Vs
Zi5hc3NlcnRFcXVhbHMoJ3RleHQnLCB0ZXh0X291dHB1dHNbMF0udHlwZSgpKQorICAgICAgICBz
ZWxmLmFzc2VydEVxdWFscygnaW1hZ2UnLCBpbWFnZV9vdXRwdXRzWzBdLnR5cGUoKSkKKworICAg
IGRlZiB0ZXN0X2V4Y2x1ZGVfZXhwZWN0ZWRfb3V0cHV0c193b3JrcyhzZWxmKToKKyAgICAgICAg
emlwID0gRmFrZVppcCgpCisgICAgICAgIHppcC5pbnNlcnQoJ3Rlc3QtZXhwZWN0ZWQudHh0Jywg
ICdleHBlY3RlZCBvdXRwdXRzIHN0b3JlZCBvbiBzZXJ2ZXIgZm9yIHNvbWUgcmVhc29uJykKKyAg
ICAgICAgYiA9IHNlbGYuX291dHB1dHNldF93aXRoX3ppcCh6aXAsIGluY2x1ZGVfZXhwZWN0ZWQ9
RmFsc2UpCisgICAgICAgIG91dHB1dHMgPSBiLm91dHB1dHNfZm9yKCd0ZXN0JywgdGFyZ2V0X3R5
cGU9Tm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMCwgbGVuKG91dHB1dHMpKQorCitp
ZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>79684</attachid>
            <date>2011-01-20 19:29:48 -0800</date>
            <delta_ts>2011-01-23 21:36:48 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-52136-20110121142946.patch</filename>
            <type>text/plain</type>
            <size>28338</size>
            <attacher name="James Kozianski">koz</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rvb2xzL0NoYW5nZUxvZwppbmRleCA5ZDg3
OTE3N2JhZDUxYzM4MzMwYzYxMWIyZGY0OWU3N2VmMGMyNTZmLi5lMWUwYWI0Njg1MGIzYjNlZDgx
MGE3ZDUzOTc1YTM1OTYzYTEyNmRhIDEwMDY0NAotLS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIv
VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjEgQEAKKzIwMTEtMDEtMTkgIEphbWVzIEtvemlh
bnNraSAgPGtvekBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgQWRkIGNsYXNzZXMgZm9yIHJlcHJlc2VudGluZyB0ZXN0IG91dHB1
dHMuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01MjEz
NgorCisgICAgICAgIFRoZXNlIGNsYXNzZXMgd2lsbCBtYWtlIGl0IGVhc2llciB0byB3cml0ZSBz
Y3JpcHRzIHRoYXQgZGVhbCB3aXRoIHRlc3QKKyAgICAgICAgb3V0cHV0cyBzdWNoIGFzIHJlYmFz
ZWxpbmluZyBhbmQgZGVkdXBpbmcgc2NyaXB0cy4gVGhlIGludGVudCBpcyB0aGF0CisgICAgICAg
IGV2ZW50dWFsbHkgd2Ugd2lsbCBiZSBoYXZlIGJ1aWxkYm90IHJldHVybiBUZXN0T3V0cHV0cyBm
b3IgYQorICAgICAgICBwYXJ0aWN1bGFyIGJ1aWxkIHdoaWNoIGNhbiBiZSBjb21wYXJlZCB3aXRo
IFRlc3RPdXRwdXRzIGRlcml2ZWQgZnJvbSBhCisgICAgICAgIGxvY2FsIExheW91dFRlc3RzIGRp
cmVjdG9yeS4KKworICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0
cHV0LnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVz
dG91dHB1dF91bml0dGVzdC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9j
b21tb24vbmV0L3Rlc3RvdXRwdXRzZXQucHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Vi
a2l0cHkvY29tbW9uL25ldC90ZXN0b3V0cHV0c2V0X3VuaXR0ZXN0LnB5OiBBZGRlZC4KKwogMjAx
MS0wMS0wOCAgQmVuamFtaW4gUG91bGFpbiAgPGJlbmphbWluLnBvdWxhaW5Abm9raWEuY29tPgog
CiAgICAgICAgIFJldmlld2VkIGJ5IEtlbm5ldGggUm9oZGUgQ2hyaXN0aWFuc2VuLgpkaWZmIC0t
Z2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Rlc3RvdXRwdXQucHkgYi9U
b29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dC5weQpuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Li41N2VhNjIxYmI5YmJhNzg3ZDU2OTZlYzU3M2NiOTM2MGFjYzU5YzJjCi0tLSAvZGV2L251bGwK
KysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Rlc3RvdXRwdXQucHkKQEAg
LTAsMCArMSwxODQgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMpIDIw
MTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIg
QU5EIEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWQorIyBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisjIExP
U1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORAorIyBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YK
KyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKworaW1wb3J0IG9zCitpbXBvcnQgcmUKKworCitjbGFzcyBOYWl2ZUltYWdl
RGlmZmVyKG9iamVjdCk6CisgICAgZGVmIHNhbWVfaW1hZ2Uoc2VsZiwgaW1nMSwgaW1nMik6Cisg
ICAgICAgIHJldHVybiBpbWcxID09IGltZzIKKworCitjbGFzcyBUZXN0T3V0cHV0KG9iamVjdCk6
CisgICAgIiIiUmVwcmVzZW50cyB0aGUgb3V0cHV0IG9mIGEgc2luZ2xlIHRlc3Qgb24gYSBzaW5n
bGUgcGxhdGZvcm0iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGxhdGZvcm0sIG91dHB1dF90
eXBlLCBmaWxlcyk6CisgICAgICAgIHNlbGYuX291dHB1dF90eXBlID0gb3V0cHV0X3R5cGUKKyAg
ICAgICAgc2VsZi5fZmlsZXMgPSBmaWxlcworICAgICAgICAjIF9tYWluX2ZpbGUgaXMgdGhlIGZp
bGUgdGhhdCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgbmFtZSBhbmQKKyAgICAgICAgIyBjb250
ZW50cyBvZiB0aGUgdGVzdCBvdXRwdXQuCisgICAgICAgIHNlbGYuX21haW5fZmlsZSA9IGZpbGVz
WzBdCisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5fbWFpbl9maWxlLm5hbWUoKQorICAgICAgICBz
ZWxmLl9uYW1lID0gc2VsZi5fZXh0cmFjdF90ZXN0X25hbWUoZmlsZW5hbWUpCisgICAgICAgIHNl
bGYuX2lzX2FjdHVhbCA9ICctYWN0dWFsLicgaW4gZmlsZW5hbWUKKworICAgICAgICBzZWxmLl9w
bGF0Zm9ybSA9IHBsYXRmb3JtIG9yIHNlbGYuX2V4dHJhY3RfcGxhdGZvcm0oZmlsZW5hbWUpCisK
KyAgICBkZWYgX2V4dHJhY3RfcGxhdGZvcm0oc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICAiIiJD
YWxjdWxhdGVzIHRoZSBwbGF0Zm9ybSBmcm9tIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGlmIGl0IGlz
bid0IGtub3duIGFscmVhZHkiIiIKKyAgICAgICAgcGF0aCA9IHJlLnNwbGl0KG9zLnBhdGguc2Vw
LCBmaWxlbmFtZSkKKyAgICAgICAgaWYgJ3BsYXRmb3JtJyBpbiBwYXRoOgorICAgICAgICAgICAg
cmV0dXJuIHBhdGhbcGF0aC5pbmRleCgncGxhdGZvcm0nKSArIDFdCisgICAgICAgIHJldHVybiBO
b25lCisKKyAgICBkZWYgX2V4dHJhY3RfdGVzdF9uYW1lKHNlbGYsIGZpbGVuYW1lKToKKyAgICAg
ICAgdGVzdF9uYW1lID0gZmlsZW5hbWUKKyAgICAgICAgcGF0aCA9IHJlLnNwbGl0KG9zLnBhdGgu
c2VwLCB0ZXN0X25hbWUpCisgICAgICAgIGlmICdMYXlvdXRUZXN0cycgaW4gcGF0aDoKKyAgICAg
ICAgICAgIHBhdGggPSBwYXRoWzEgKyBwYXRoLmluZGV4KCdMYXlvdXRUZXN0cycpOl0KKyAgICAg
ICAgaWYgJ2xheW91dC10ZXN0LXJlc3VsdHMnIGluIHBhdGg6CisgICAgICAgICAgICBwYXRoID0g
cGF0aFsxICsgcGF0aC5pbmRleCgnbGF5b3V0LXRlc3QtcmVzdWx0cycpOl0KKyAgICAgICAgaWYg
J3BsYXRmb3JtJyBpbiBwYXRoOgorICAgICAgICAgICAgcGF0aCA9IHBhdGhbMiArIHBhdGguaW5k
ZXgoJ3BsYXRmb3JtJyk6XQorCisgICAgICAgIHRlc3RfbmFtZSA9IHBhdGhbLTFdCisgICAgICAg
IHRlc3RfbmFtZSA9IHJlLnN1YignLWV4cGVjdGVkXC4uKiQnLCAnJywgdGVzdF9uYW1lKQorICAg
ICAgICB0ZXN0X25hbWUgPSByZS5zdWIoJy1hY3R1YWxcLi4qJCcsICcnLCB0ZXN0X25hbWUpCisg
ICAgICAgIHBhdGhbLTFdID0gdGVzdF9uYW1lCisgICAgICAgIHJldHVybiBvcy5wYXRoLnNlcC5q
b2luKHBhdGgpCisKKyAgICBkZWYgY29udGVudHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxm
Ll9tYWluX2ZpbGUuY29udGVudHMoKQorCisgICAgZGVmIHNhdmVfdG8oc2VsZiwgcGF0aCk6Cisg
ICAgICAgICIiIkhhdmUgdGhlIGZpbGVzIGluIHRoaXMgVGVzdE91dHB1dCB3cml0ZSB0aGVtc2Vs
dmVzIHRvIHRoZSBkaXNrIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uIiIiCisgICAgICAgIGZv
ciBmaWxlIGluIHNlbGYuX2ZpbGVzOgorICAgICAgICAgICAgZmlsZS5zYXZlX3RvKHBhdGgpCisK
KyAgICBkZWYgaXNfYWN0dWFsKHNlbGYpOgorICAgICAgICAiIiJJcyB0aGlzIG91dHB1dCB0aGUg
YWN0dWFsIG91dHB1dCBvZiBhIHRlc3Q/IChBcyBvcHBvc2VkIHRvIGV4cGVjdGVkIG91dHB1dC4p
IiIiCisgICAgICAgIHJldHVybiBzZWxmLl9pc19hY3R1YWwKKworICAgIGRlZiBuYW1lKHNlbGYp
OgorICAgICAgICAiIiJUaGUgbmFtZSBvZiB0aGlzIHRlc3QgKGRvZXNuJ3QgaW5jbHVkZSBleHRl
bnNpb24pIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9uYW1lCisKKyAgICBkZWYgc2FtZV9jb250
ZW50KHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY29udGVudHMoKSA9PSBvdGhl
ci5jb250ZW50cygpCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0
dXJuIChvdGhlciAhPSBOb25lIGFuZAorICAgICAgICAgICAgICAgIHNlbGYubmFtZSgpID09IG90
aGVyLm5hbWUoKSBhbmQKKyAgICAgICAgICAgICAgICBzZWxmLnR5cGUoKSA9PSBvdGhlci50eXBl
KCkgYW5kCisgICAgICAgICAgICAgICAgc2VsZi5wbGF0Zm9ybSgpID09IG90aGVyLnBsYXRmb3Jt
KCkgYW5kCisgICAgICAgICAgICAgICAgc2VsZi5pc19hY3R1YWwoKSA9PSBvdGhlci5pc19hY3R1
YWwoKSBhbmQKKyAgICAgICAgICAgICAgICBzZWxmLnNhbWVfY29udGVudChvdGhlcikpCisKKyAg
ICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHJldHVybiBoYXNoKHN0cihzZWxmLm5hbWUo
KSkgKyBzdHIoc2VsZi50eXBlKCkpICsgc3RyKHNlbGYucGxhdGZvcm0oKSkpCisKKyAgICBkZWYg
aXNfbmV3ZXJfdGhhbihzZWxmLCBvdGhlcik6CisgICAgICAgICIiIidOZXcnIG91dHB1dHMgYXJl
IHRob3NlIHRoYXQgaGF2ZSBiZWVuIGdlbmVyYXRlZCBieSB0aGUgZXhlY3V0aW9uIG9mCisgICAg
ICAgIGEgdGVzdC4gQSB0ZXN0IG91dHB1dCBpcyBjb25zaWRlcmVkIG5ld2VyIHRoYW4gYW5vdGhl
ciBpZiB0aGUgZm9ybWVyIGlzCisgICAgICAgIHRoZSBvdXRwdXQgb2YgdGhlIHJ1biBvZiBhIHRl
c3QgYW5kIHRoZSBsYXR0ZXIgaXNuJ3QuICIiIgorICAgICAgICByZXR1cm4gc2VsZi5pc19hY3R1
YWwoKSBhbmQgbm90IG90aGVyLmlzX2FjdHVhbCgpCisKKyAgICBkZWYgaXNfcmViYXNlbGluZV9v
ZihzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiAoc2VsZi5uYW1lKCkgPT0gb3RoZXIubmFt
ZSgpIGFuZAorICAgICAgICAgICAgICAgIHNlbGYudHlwZSgpID09IG90aGVyLnR5cGUoKSBhbmQK
KyAgICAgICAgICAgICAgICBzZWxmLnBsYXRmb3JtKCkgPT0gb3RoZXIucGxhdGZvcm0oKSBhbmQK
KyAgICAgICAgICAgICAgICBzZWxmLmlzX2FjdHVhbCgpIGFuZAorICAgICAgICAgICAgICAgIChu
b3Qgb3RoZXIuaXNfYWN0dWFsKCkpKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAg
IGFjdHVhbF9zdHIgPSAnW0FdICcgaWYgc2VsZi5pc19hY3R1YWwoKSBlbHNlICcnCisgICAgICAg
IHJldHVybiAiVGVzdE91dHB1dFslcy8lc10gJXMlcyIgJSAoc2VsZi5fcGxhdGZvcm0sIHNlbGYu
X291dHB1dF90eXBlLCBhY3R1YWxfc3RyLCBzZWxmLm5hbWUoKSkKKworICAgIGRlZiB0eXBlKHNl
bGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fb3V0cHV0X3R5cGUKKworICAgIGRlZiBwbGF0Zm9y
bShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3BsYXRmb3JtCisKKyAgICBkZWYgX3BhdGhf
dG9fcGxhdGZvcm0oc2VsZiwgcGxhdGZvcm0pOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBwYXRo
IHRoYXQgdGVzdHMgZm9yIHRoZSBnaXZlbiBwbGF0Zm9ybSBhcmUgc3RvcmVkIGluLiIiIgorICAg
ICAgICBpZiBwbGF0Zm9ybSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuICIiCisgICAgICAg
IGVsc2U6CisgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKCJwbGF0Zm9ybSIsIHBsYXRm
b3JtKQorCisgICAgZGVmIF9pbnN0YWxsX2ZpbGUoc2VsZiwgZmlsZSwgcGF0aCk6CisgICAgICAg
IHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgc2VsZi5fcGF0aF90b19wbGF0Zm9ybShzZWxmLl9w
bGF0Zm9ybSkpCisgICAgICAgIGV4dGVuc2lvbiA9IG9zLnBhdGguc3BsaXRleHQoZmlsZS5uYW1l
KCkpWzFdCisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5uYW1lKCkgKyAnLWV4cGVjdGVkJyArIGV4
dGVuc2lvbgorICAgICAgICBmaWxlLnNhdmVfdG8ocGF0aCwgZmlsZW5hbWUpCisKKyAgICBkZWYg
aW5zdGFsbChzZWxmLCBwYXRoX3RvX2xheW91dF90ZXN0cyk6CisgICAgICAgICIiIlNhdmUgdGhl
IGZpbGVzIG9mIHRoaXMgVGVzdE91dHB1dCB0byB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3J5Cisg
ICAgICAgIGluc2lkZSB0aGUgTGF5b3V0VGVzdHMgZGlyZWN0b3J5LiBUeXBpY2FsbHkgdGhpcyBt
ZWFucyB0aGF0IHRoZXNlIGZpbGVzCisgICAgICAgIHdpbGwgYmUgc2F2ZWQgaW4gIkxheW91dFRl
c3RzL3BsYXRmb3JtLzxwbGF0Zm9ybT4vLCBvciBzaW1wbHkKKyAgICAgICAgTGF5b3V0VGVzdHMg
aWYgdGhlIHBsYXRmb3JtIGlzIE5vbmUuIiIiCisgICAgICAgIGZvciBmaWxlIGluIHNlbGYuX2Zp
bGVzOgorICAgICAgICAgICAgc2VsZi5faW5zdGFsbF9maWxlKGZpbGUsIHBhdGhfdG9fbGF5b3V0
X3Rlc3RzKQorCisgICAgZGVmIGRlbGV0ZShzZWxmKToKKyAgICAgICAgIiIiRGVsZXRlcyB0aGUg
ZmlsZXMgdGhhdCBjb21wcmlzZSB0aGlzIFRlc3RPdXRwdXQgZnJvbSBkaXNrLiBUaGlzCisgICAg
ICAgIGZhaWxzIGlmIHRoZSBmaWxlcyBhcmUgdmlydHVhbCBmaWxlcyAoZWc6IHRoZSBmaWxlcyBt
YXkgcmVzaWRlIGluc2lkZSBhCisgICAgICAgIHJlbW90ZSB6aXAgZmlsZSkuIiIiCisgICAgICAg
IGZvciBmaWxlIGluIHNlbGYuX2ZpbGVzOgorICAgICAgICAgICAgZmlsZS5kZWxldGUoKQorCisK
K2NsYXNzIFRleHRUZXN0T3V0cHV0KFRlc3RPdXRwdXQpOgorICAgICIiIlJlcHJlc2VudHMgYSB0
ZXh0IG91dHB1dCBvZiBhIHNpbmdsZSB0ZXN0IG9uIGEgc2luZ2xlIHBsYXRmb3JtIiIiCisgICAg
ZGVmIF9faW5pdF9fKHNlbGYsIHBsYXRmb3JtLCB0ZXh0X2ZpbGUpOgorICAgICAgICBzZWxmLl90
ZXh0X2ZpbGUgPSB0ZXh0X2ZpbGUKKyAgICAgICAgVGVzdE91dHB1dC5fX2luaXRfXyhzZWxmLCBw
bGF0Zm9ybSwgJ3RleHQnLCBbdGV4dF9maWxlXSkKKworICAgIGRlZiByZXRhcmdldChzZWxmLCBw
bGF0Zm9ybSk6CisgICAgICAgIHJldHVybiBUZXh0VGVzdE91dHB1dChwbGF0Zm9ybSwgc2VsZi5f
dGV4dF9maWxlKQorCisKK2NsYXNzIEltYWdlVGVzdE91dHB1dChUZXN0T3V0cHV0KToKKyAgICBp
bWFnZV9kaWZmZXIgPSBOYWl2ZUltYWdlRGlmZmVyKCkKKyAgICAiIiJSZXByZXNlbnRzIGFuIGlt
YWdlIG91dHB1dCBvZiBhIHNpbmdsZSB0ZXN0IG9uIGEgc2luZ2xlIHBsYXRmb3JtIiIiCisgICAg
ZGVmIF9faW5pdF9fKHNlbGYsIHBsYXRmb3JtLCBpbWFnZV9maWxlLCBjaGVja3N1bV9maWxlKToK
KyAgICAgICAgc2VsZi5fY2hlY2tzdW1fZmlsZSA9IGNoZWNrc3VtX2ZpbGUKKyAgICAgICAgc2Vs
Zi5faW1hZ2VfZmlsZSA9IGltYWdlX2ZpbGUKKyAgICAgICAgZmlsZXMgPSBmaWx0ZXIoYm9vbCwg
W3NlbGYuX2NoZWNrc3VtX2ZpbGUsIHNlbGYuX2ltYWdlX2ZpbGVdKQorICAgICAgICBUZXN0T3V0
cHV0Ll9faW5pdF9fKHNlbGYsIHBsYXRmb3JtLCAnaW1hZ2UnLCBmaWxlcykKKworICAgIGRlZiBo
YXNfY2hlY2tzdW0oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jaGVja3N1bV9maWxlIGlz
IG5vdCBOb25lCisKKyAgICBkZWYgc2FtZV9jb250ZW50KHNlbGYsIG90aGVyKToKKyAgICAgICAg
aWYgc2VsZi5oYXNfY2hlY2tzdW0oKSBhbmQgb3RoZXIuaGFzX2NoZWNrc3VtKCk6CisgICAgICAg
ICAgICByZXR1cm4gc2VsZi5fY2hlY2tzdW1fZmlsZS5jb250ZW50cygpID09IG90aGVyLl9jaGVj
a3N1bV9maWxlLmNvbnRlbnRzKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGZfY29u
dGVudHMgPSBzZWxmLl9pbWFnZV9maWxlLmNvbnRlbnRzKCkKKyAgICAgICAgICAgIG90aGVyX2Nv
bnRlbnRzID0gb3RoZXIuX2ltYWdlX2ZpbGUuY29udGVudHMoKQorICAgICAgICAgICAgcmV0dXJu
IEltYWdlVGVzdE91dHB1dC5pbWFnZV9kaWZmZXIuc2FtZV9pbWFnZShzZWxmX2NvbnRlbnRzLCBv
dGhlcl9jb250ZW50cykKKworICAgIGRlZiByZXRhcmdldChzZWxmLCBwbGF0Zm9ybSk6CisgICAg
ICAgIHJldHVybiBJbWFnZVRlc3RPdXRwdXQocGxhdGZvcm0sIHNlbGYuX2ltYWdlX2ZpbGUsIHNl
bGYuX2NoZWNrc3VtX2ZpbGUpCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2Nv
bW1vbi9uZXQvdGVzdG91dHB1dF91bml0dGVzdC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkv
Y29tbW9uL25ldC90ZXN0b3V0cHV0X3VuaXR0ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmQxNmI5ZDhkZDFi
YmIwOWFiYjIwZmQyMTUwOWE5NTQ3NTkzNDFlNjUKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9T
Y3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dF91bml0dGVzdC5weQpAQCAtMCww
ICsxLDEzMyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykgMjAxMCBH
b29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQg
QU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZCisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBP
RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIyBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorCitpbXBvcnQgcmUKK2ltcG9ydCB0ZXN0b3V0cHV0CitpbXBvcnQgdW5pdHRlc3QK
KworCitjbGFzcyBGYWtlRmlsZShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxl
bmFtZSwgY29udGVudHM9ImZha2UgY29udGVudHMiKToKKyAgICAgICAgc2VsZi5fZmlsZW5hbWUg
PSBmaWxlbmFtZQorICAgICAgICBzZWxmLl9jb250ZW50cyA9IGNvbnRlbnRzCisKKyAgICBkZWYg
bmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGVuYW1lCisKKyAgICBkZWYgY29u
dGVudHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jb250ZW50cworCisKK2NsYXNzIEZh
a2VUZXN0T3V0cHV0KHRlc3RvdXRwdXQuVGVzdE91dHB1dCk6CisgICAgZGVmIF9faW5pdF9fKHNl
bGYsIHBsYXRmb3JtLCBvdXRwdXRfdHlwZSwgY29udGVudHMsIGlzX2V4cGVjdGVkPUZhbHNlKToK
KyAgICAgICAgc2VsZi5fb3V0cHV0X3R5cGUgPSBvdXRwdXRfdHlwZQorICAgICAgICBzZWxmLl9j
b250ZW50cyA9IGNvbnRlbnRzCisgICAgICAgIHNlbGYuX2lzX2V4cGVjdGVkID0gaXNfZXhwZWN0
ZWQKKyAgICAgICAgYWN0dWFsID0gJ2FjdHVhbCcKKyAgICAgICAgaWYgaXNfZXhwZWN0ZWQ6Cisg
ICAgICAgICAgICBhY3R1YWwgPSAnZXhwZWN0ZWQnCisgICAgICAgIHRlc3RfbmFtZSA9ICdhbm9u
eW1vdXMtdGVzdC0lcy50eHQnICUgYWN0dWFsCisgICAgICAgIGZpbGUgPSBGYWtlRmlsZSh0ZXN0
X25hbWUsIGNvbnRlbnRzKQorICAgICAgICBzdXBlcihGYWtlVGVzdE91dHB1dCwgc2VsZikuX19p
bml0X18ocGxhdGZvcm0sIG91dHB1dF90eXBlLCBbZmlsZV0pCisKKyAgICBkZWYgY29udGVudHMo
c2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jb250ZW50cworCisgICAgZGVmIHJldGFyZ2V0
KHNlbGYsIHBsYXRmb3JtKToKKyAgICAgICAgcmV0dXJuIEZha2VUZXN0T3V0cHV0KHBsYXRmb3Jt
LCBzZWxmLl9vdXRwdXRfdHlwZSwgc2VsZi5fY29udGVudHMsIHNlbGYuX2lzX2V4cGVjdGVkKQor
CisKK2NsYXNzIFRlc3RPdXRwdXRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgX2No
ZWNrX25hbWUoc2VsZiwgZmlsZW5hbWUsIGV4cGVjdGVkX3Rlc3RfbmFtZSk6CisgICAgICAgIHIg
PSB0ZXN0b3V0cHV0LlRleHRUZXN0T3V0cHV0KE5vbmUsIEZha2VGaWxlKGZpbGVuYW1lKSkKKyAg
ICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0ZWRfdGVzdF9uYW1lLCByLm5hbWUoKSkKKwor
ICAgIGRlZiBfY2hlY2tfcGxhdGZvcm0oc2VsZiwgZmlsZW5hbWUsIGV4cGVjdGVkX3BsYXRmb3Jt
KToKKyAgICAgICAgciA9IHRlc3RvdXRwdXQuVGV4dFRlc3RPdXRwdXQoTm9uZSwgRmFrZUZpbGUo
ZmlsZW5hbWUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3RlZF9wbGF0Zm9ybSwg
ci5wbGF0Zm9ybSgpKQorCisgICAgZGVmIHRlc3RfZXh0cmFjdHNfbmFtZV9jb3JyZWN0bHkoc2Vs
Zik6CisgICAgICAgIHNlbGYuX2NoZWNrX25hbWUoJ0xheW91dFRlc3RzL2Zhc3QvZG9tL2EtZXhw
ZWN0ZWQudHh0JywgJ2Zhc3QvZG9tL2EnKQorICAgICAgICBzZWxmLl9jaGVja19uYW1lKCdMYXlv
dXRUZXN0cy9mYXN0L2RvbS9hLWFjdHVhbC50eHQnLCAnZmFzdC9kb20vYScpCisgICAgICAgIHNl
bGYuX2NoZWNrX25hbWUoJ0xheW91dFRlc3RzL3BsYXRmb3JtL3dpbi9mYXN0L2EtZXhwZWN0ZWQu
dHh0JywgJ2Zhc3QvYScpCisgICAgICAgIHNlbGYuX2NoZWNrX25hbWUoJ0xheW91dFRlc3RzL3Bs
YXRmb3JtL3dpbi9mYXN0L2EtZXhwZWN0ZWQuY2hlY2tzdW0nLCAnZmFzdC9hJykKKyAgICAgICAg
c2VsZi5fY2hlY2tfbmFtZSgnZmFzdC9kb20vdGVzdC1leHBlY3RlZC50eHQnLCAnZmFzdC9kb20v
dGVzdCcpCisgICAgICAgIHNlbGYuX2NoZWNrX25hbWUoJ2xheW91dC10ZXN0LXJlc3VsdHMvZmFz
dC9hLWFjdHVhbC5jaGVja3N1bScsICdmYXN0L2EnKQorCisgICAgZGVmIHRlc3RfZXh0cmFjdHNf
cGxhdGZvcm1fY29ycmVjdGx5KHNlbGYpOgorICAgICAgICBzZWxmLl9jaGVja19wbGF0Zm9ybSgn
TGF5b3V0VGVzdHMvcGxhdGZvcm0vd2luL2Zhc3QvYS1leHBlY3RlZC50eHQnLCAnd2luJykKKyAg
ICAgICAgc2VsZi5fY2hlY2tfcGxhdGZvcm0oJ3BsYXRmb3JtL3dpbi9mYXN0L2EtZXhwZWN0ZWQu
dHh0JywgJ3dpbicpCisgICAgICAgIHNlbGYuX2NoZWNrX3BsYXRmb3JtKCdwbGF0Zm9ybS9tYWMv
ZmFzdC9hLWV4cGVjdGVkLnR4dCcsICdtYWMnKQorICAgICAgICBzZWxmLl9jaGVja19wbGF0Zm9y
bSgnZmFzdC9hLWV4cGVjdGVkLnR4dCcsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9vdXRwdXRzX2Zy
b21fYW5fYWN0dWFsX2ZpbGVfYXJlX21hcmtlZF9hc19zdWNoKHNlbGYpOgorICAgICAgICByID0g
dGVzdG91dHB1dC5UZXh0VGVzdE91dHB1dChOb25lLCBGYWtlRmlsZSgndGVzdC1hY3R1YWwudHh0
JykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyLmlzX2FjdHVhbCgpKQorCisgICAgZGVmIHRl
c3Rfb3V0cHV0c19mcm9tX2FuX2V4cGVjdGVkX2ZpbGVfYXJlX25vdF9hY3R1YWwoc2VsZik6Cisg
ICAgICAgIHIgPSB0ZXN0b3V0cHV0LlRleHRUZXN0T3V0cHV0KE5vbmUsIEZha2VGaWxlKCd0ZXN0
LWV4cGVjdGVkLnR4dCcpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHIuaXNfYWN0dWFsKCkp
CisKKyAgICBkZWYgdGVzdF9pc19yZWJhc2VsaW5lX29mKHNlbGYpOgorICAgICAgICBleHBlY3Rl
ZCA9IHRlc3RvdXRwdXQuVGV4dFRlc3RPdXRwdXQoJ21hYycsIEZha2VGaWxlKCd0ZXN0LWV4cGVj
dGVkLnR4dCcpKQorICAgICAgICBhY3R1YWwgPSB0ZXN0b3V0cHV0LlRleHRUZXN0T3V0cHV0KCdt
YWMnLCBGYWtlRmlsZSgndGVzdC1hY3R1YWwudHh0JykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1
ZShhY3R1YWwuaXNfcmViYXNlbGluZV9vZihleHBlY3RlZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0
RmFsc2UoZXhwZWN0ZWQuaXNfcmViYXNlbGluZV9vZihhY3R1YWwpKQorCisgICAgZGVmIHRlc3Rf
X2VxX18oc2VsZik6CisgICAgICAgIHIxID0gdGVzdG91dHB1dC5UZXh0VGVzdE91dHB1dCgnbWFj
JywgRmFrZUZpbGUoJ3Rlc3QtZXhwZWN0ZWQudHh0JywgJ2NvbnRlbnRzJykpCisgICAgICAgIHIy
ID0gdGVzdG91dHB1dC5UZXh0VGVzdE91dHB1dCgnbWFjJywgRmFrZUZpbGUoJ3Rlc3QtZXhwZWN0
ZWQudHh0JywgJ2NvbnRlbnRzJykpCisgICAgICAgIHIzID0gdGVzdG91dHB1dC5UZXh0VGVzdE91
dHB1dCgnd2luJywgRmFrZUZpbGUoJ3Rlc3QtZXhwZWN0ZWQudHh0JywgJ2NvbnRlbnRzJykpCisK
KyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocjEsIHIyKQorICAgICAgICBzZWxmLmFzc2VydEVx
dWFscyhyMSwgcjIucmV0YXJnZXQoJ21hYycpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFs
cyhyMSwgcjIucmV0YXJnZXQoJ3dpbicpKQorCisgICAgZGVmIHRlc3RfX2hhc2hfXyhzZWxmKToK
KyAgICAgICAgcjEgPSB0ZXN0b3V0cHV0LlRleHRUZXN0T3V0cHV0KCdtYWMnLCBGYWtlRmlsZSgn
dGVzdC1leHBlY3RlZC50eHQnLCAnY29udGVudHMnKSkKKyAgICAgICAgcjIgPSB0ZXN0b3V0cHV0
LlRleHRUZXN0T3V0cHV0KCdtYWMnLCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC50eHQnLCAnY29u
dGVudHMnKSkKKyAgICAgICAgcjMgPSB0ZXN0b3V0cHV0LlRleHRUZXN0T3V0cHV0KE5vbmUsIEZh
a2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnR4dCcsIE5vbmUpKQorCisgICAgICAgIHggPSBzZXQoW3Ix
LCByMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbihzZXQoW3IxLCByMl0pKSkK
KyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMiwgbGVuKHNldChbcjEsIHIyLCByM10pKSkKKwor
ICAgIGRlZiB0ZXN0X2ltYWdlX2RpZmZfaXNfaW52b2tlZF9mb3JfaW1hZ2Vfb3V0cHV0c193aXRo
b3V0X2NoZWNrc3VtKHNlbGYpOgorICAgICAgICByMSA9IHRlc3RvdXRwdXQuSW1hZ2VUZXN0T3V0
cHV0KCdtYWMnLCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC5wbmcnLCAnYXNkZicpLCBGYWtlRmls
ZSgndGVzdC1leHBlY3RlZC5jaGVja3N1bScsICdjaGVjaycpKQorICAgICAgICByMiA9IHRlc3Rv
dXRwdXQuSW1hZ2VUZXN0T3V0cHV0KCdtYWMnLCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC5wbmcn
LCAnYXNkZicpLCBOb25lKQorCisgICAgICAgICMgRGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8ganVz
dCBjb21wYXJlIG9uIGltYWdlIGNvbnRlbnRzLgorICAgICAgICBzZWxmLmFzc2VydFRydWUocjEu
c2FtZV9jb250ZW50KHIyKSkKKworICAgICAgICBjbGFzcyBBbGxJbWFnZXNBcmVEaWZmZXJlbnQo
b2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBzYW1lX2ltYWdlKHNlbGYsIGltYWdlMSwgaW1hZ2Uy
KToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICAjIEJ1dCB3ZSBjYW4g
aW5zdGFsbCBvdGhlciBpbWFnZSBkaWZmZXJzLgorICAgICAgICB0ZXN0b3V0cHV0LkltYWdlVGVz
dE91dHB1dC5pbWFnZV9kaWZmZXIgPSBBbGxJbWFnZXNBcmVEaWZmZXJlbnQoKQorCisgICAgICAg
IHNlbGYuYXNzZXJ0RmFsc2UocjEuc2FtZV9jb250ZW50KHIyKSkKKworaWYgX19uYW1lX18gPT0g
Il9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL1Rvb2xzL1Njcmlw
dHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0cHV0c2V0LnB5IGIvVG9vbHMvU2NyaXB0cy93
ZWJraXRweS9jb21tb24vbmV0L3Rlc3RvdXRwdXRzZXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZjc5MWFjMjdm
YTJkNjA5NmMzN2I2YTgyOGUwNjM1NDM2OWQxMWNjMAotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xz
L1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0cHV0c2V0LnB5CkBAIC0wLDAgKzEs
MTMwIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2ds
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyMgYXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuICBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
IyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkK
KyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkK
KyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisjIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisKK2Zyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS5kaXJlY3RvcnlmaWxlc2V0IGltcG9y
dCBEaXJlY3RvcnlGaWxlU2V0Citmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uemlwZmlsZXNl
dCBpbXBvcnQgWmlwRmlsZVNldAoraW1wb3J0IHJlCitpbXBvcnQgdGVzdG91dHB1dAoraW1wb3J0
IHVybGxpYgorCisKK2NsYXNzIFRlc3RPdXRwdXRTZXQob2JqZWN0KToKKyAgICAiIiJBIHNldCBv
ZiB0ZXN0IG91dHB1dHMiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgcGxhdGZvcm0s
IHppcF9maWxlLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuX25hbWUgPSBuYW1lCisgICAgICAg
IHNlbGYuX3BsYXRmb3JtID0gcGxhdGZvcm0KKyAgICAgICAgc2VsZi5femlwX2ZpbGUgPSB6aXBf
ZmlsZQorICAgICAgICBzZWxmLl9pbmNsdWRlX2V4cGVjdGVkID0ga3dhcmdzLmdldCgnaW5jbHVk
ZV9leHBlY3RlZCcsIFRydWUpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZnJvbV96aXBf
dXJsKGNscywgcGxhdGZvcm0sIHppcF9wYXRoKToKKyAgICAgICAgcmV0dXJuIFRlc3RPdXRwdXRT
ZXQoJ2xvY2FsIHppcCAlcyBidWlsZGVyJyAlIHBsYXRmb3JtLCBwbGF0Zm9ybSwgWmlwRmlsZVNl
dCh6aXBfcGF0aCkpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZnJvbV96aXAoY2xzLCBw
bGF0Zm9ybSwgemlwKToKKyAgICAgICAgcmV0dXJuIFRlc3RPdXRwdXRTZXQoJ2xvY2FsIHppcCAl
cyBidWlsZGVyJyAlIHBsYXRmb3JtLCBwbGF0Zm9ybSwgemlwKQorCisgICAgQGNsYXNzbWV0aG9k
CisgICAgZGVmIGZyb21femlwX21hcChjbHMsIHppcF9tYXApOgorICAgICAgICBvdXRwdXRfc2V0
cyA9IFtdCisgICAgICAgIGZvciBrLCB2IGluIHppcF9tYXAuaXRlbXMoKToKKyAgICAgICAgICAg
IG91dHB1dF9zZXRzLmFwcGVuZChUZXN0T3V0cHV0U2V0LmZyb21femlwKGssIHYpKQorICAgICAg
ICByZXR1cm4gQWdncmVnYXRlVGVzdE91dHB1dFNldChvdXRwdXRfc2V0cykKKworICAgIEBjbGFz
c21ldGhvZAorICAgIGRlZiBmcm9tX3BhdGgoc2VsZiwgcGF0aCwgcGxhdGZvcm09Tm9uZSk6Cisg
ICAgICAgIHJldHVybiBUZXN0T3V0cHV0U2V0KCdsb2NhbCAlcyBidWlsZGVyJyAlIHBsYXRmb3Jt
LCBwbGF0Zm9ybSwgRGlyZWN0b3J5RmlsZVNldChwYXRoKSkKKworICAgIGRlZiBuYW1lKHNlbGYp
OgorICAgICAgICByZXR1cm4gc2VsZi5fbmFtZQorCisgICAgZGVmIHNldF9wbGF0Zm9ybShzZWxm
LCBwbGF0Zm9ybSk6CisgICAgICAgIHNlbGYuX3BsYXRmb3JtID0gcGxhdGZvcm0KKworICAgIGRl
ZiBmaWxlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFtzZWxmLl96aXBfZmlsZS5vcGVuKGZpbGVu
YW1lKSBmb3IgZmlsZW5hbWUgaW4gc2VsZi5femlwX2ZpbGUubmFtZWxpc3QoKV0KKworICAgIGRl
ZiBfZXh0cmFjdF9vdXRwdXRfZmlsZXMoc2VsZiwgbmFtZSwgZXhhY3RfbWF0Y2gpOgorICAgICAg
ICBuYW1lX21hdGNoZXIgPSByZS5jb21waWxlKG5hbWUpCisgICAgICAgIGFjdHVhbF9tYXRjaGVy
ID0gcmUuY29tcGlsZShyJy1hY3R1YWxcLicpCisgICAgICAgIGV4cGVjdGVkX21hdGNoZXIgPSBy
ZS5jb21waWxlKHInLWV4cGVjdGVkXC4nKQorCisgICAgICAgIGNoZWNrc3VtX2ZpbGVzID0gW10K
KyAgICAgICAgdGV4dF9maWxlcyA9IFtdCisgICAgICAgIGltYWdlX2ZpbGVzID0gW10KKyAgICAg
ICAgZm9yIG91dHB1dF9maWxlIGluIHNlbGYuZmlsZXMoKToKKyAgICAgICAgICAgIG5hbWVfbWF0
Y2ggPSBuYW1lX21hdGNoZXIuc2VhcmNoKG91dHB1dF9maWxlLm5hbWUoKSkKKyAgICAgICAgICAg
IGFjdHVhbF9tYXRjaCA9IGFjdHVhbF9tYXRjaGVyLnNlYXJjaChvdXRwdXRfZmlsZS5uYW1lKCkp
CisgICAgICAgICAgICBleHBlY3RlZF9tYXRjaCA9IGV4cGVjdGVkX21hdGNoZXIuc2VhcmNoKG91
dHB1dF9maWxlLm5hbWUoKSkKKyAgICAgICAgICAgIGlmIG5hbWVfbWF0Y2ggYW5kIChhY3R1YWxf
bWF0Y2ggb3IgKHNlbGYuX2luY2x1ZGVfZXhwZWN0ZWQgYW5kIGV4cGVjdGVkX21hdGNoKSk6Cisg
ICAgICAgICAgICAgICAgaWYgb3V0cHV0X2ZpbGUubmFtZSgpLmVuZHN3aXRoKCcuY2hlY2tzdW0n
KToKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW1fZmlsZXMuYXBwZW5kKG91dHB1dF9maWxl
KQorICAgICAgICAgICAgICAgIGVsaWYgb3V0cHV0X2ZpbGUubmFtZSgpLmVuZHN3aXRoKCcudHh0
Jyk6CisgICAgICAgICAgICAgICAgICAgIHRleHRfZmlsZXMuYXBwZW5kKG91dHB1dF9maWxlKQor
ICAgICAgICAgICAgICAgIGVsaWYgb3V0cHV0X2ZpbGUubmFtZSgpLmVuZHN3aXRoKCcucG5nJyk6
CisgICAgICAgICAgICAgICAgICAgIGltYWdlX2ZpbGVzLmFwcGVuZChvdXRwdXRfZmlsZSkKKwor
ICAgICAgICByZXR1cm4gKGNoZWNrc3VtX2ZpbGVzLCB0ZXh0X2ZpbGVzLCBpbWFnZV9maWxlcykK
KworICAgIGRlZiBfZXh0cmFjdF9maWxlX3dpdGhfbmFtZShzZWxmLCBuYW1lLCBmaWxlcyk6Cisg
ICAgICAgIGZvciBmaWxlIGluIGZpbGVzOgorICAgICAgICAgICAgaWYgZmlsZS5uYW1lKCkgPT0g
bmFtZToKKyAgICAgICAgICAgICAgICByZXR1cm4gZmlsZQorICAgICAgICByZXR1cm4gTm9uZQor
CisgICAgZGVmIF9tYWtlX291dHB1dF9mcm9tX2ltYWdlKHNlbGYsIGltYWdlX2ZpbGUsIGNoZWNr
c3VtX2ZpbGVzKToKKyAgICAgICAgY2hlY2tzdW1fZmlsZV9uYW1lID0gcmUuc3ViKCdcLnBuZycs
ICcuY2hlY2tzdW0nLCBpbWFnZV9maWxlLm5hbWUoKSkKKyAgICAgICAgY2hlY2tzdW1fZmlsZSA9
IHNlbGYuX2V4dHJhY3RfZmlsZV93aXRoX25hbWUoY2hlY2tzdW1fZmlsZV9uYW1lLCBjaGVja3N1
bV9maWxlcykKKyAgICAgICAgcmV0dXJuIHRlc3RvdXRwdXQuSW1hZ2VUZXN0T3V0cHV0KHNlbGYu
X3BsYXRmb3JtLCBpbWFnZV9maWxlLCBjaGVja3N1bV9maWxlKQorCisgICAgZGVmIG91dHB1dHNf
Zm9yKHNlbGYsIG5hbWUsICoqa3dhcmdzKToKKyAgICAgICAgdGFyZ2V0X3R5cGUgPSBrd2FyZ3Mu
Z2V0KCd0YXJnZXRfdHlwZScsIE5vbmUpCisgICAgICAgIGV4YWN0X21hdGNoID0ga3dhcmdzLmdl
dCgnZXhhY3RfbWF0Y2gnLCBGYWxzZSkKKyAgICAgICAgaWYgcmUuc2VhcmNoKHInXC54P2h0bWwn
LCBuYW1lKToKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lWzpuYW1lLnJpbmRleCgnLicpXQorCisg
ICAgICAgIChjaGVja3N1bV9maWxlcywgdGV4dF9maWxlcywgaW1hZ2VfZmlsZXMpID0gc2VsZi5f
ZXh0cmFjdF9vdXRwdXRfZmlsZXMobmFtZSwgZXhhY3RfbWF0Y2gpCisKKyAgICAgICAgb3V0cHV0
cyA9IFtzZWxmLl9tYWtlX291dHB1dF9mcm9tX2ltYWdlKGltYWdlX2ZpbGUsIGNoZWNrc3VtX2Zp
bGVzKSBmb3IgaW1hZ2VfZmlsZSBpbiBpbWFnZV9maWxlc10KKworICAgICAgICBvdXRwdXRzICs9
IFt0ZXN0b3V0cHV0LlRleHRUZXN0T3V0cHV0KHNlbGYuX3BsYXRmb3JtLCB0ZXh0X2ZpbGUpIGZv
ciB0ZXh0X2ZpbGUgaW4gdGV4dF9maWxlc10KKworICAgICAgICBpZiBleGFjdF9tYXRjaDoKKyAg
ICAgICAgICAgIG91dHB1dHMgPSBmaWx0ZXIobGFtYmRhIG91dHB1dDogb3V0cHV0Lm5hbWUoKSA9
PSBuYW1lLCBvdXRwdXRzKQorCisgICAgICAgIG91dHB1dHMgPSBmaWx0ZXIobGFtYmRhIHI6IHRh
cmdldF90eXBlIGluIFtOb25lLCByLnR5cGUoKV0sIG91dHB1dHMpCisKKyAgICAgICAgcmV0dXJu
IG91dHB1dHMKKworCitjbGFzcyBBZ2dyZWdhdGVUZXN0T3V0cHV0U2V0KG9iamVjdCk6CisgICAg
IiIiU2V0IG9mIHRlc3Qgb3V0cHV0cyBmcm9tIGEgbGlzdCBvZiBidWlsZGVycyIiIgorICAgIGRl
ZiBfX2luaXRfXyhzZWxmLCBidWlsZGVycyk6CisgICAgICAgIHNlbGYuX2J1aWxkZXJzID0gYnVp
bGRlcnMKKworICAgIGRlZiBvdXRwdXRzX2ZvcihzZWxmLCBuYW1lLCAqKmt3YXJncyk6CisgICAg
ICAgIHJldHVybiBzdW0oW2J1aWxkZXIub3V0cHV0c19mb3IobmFtZSwgKiprd2FyZ3MpIGZvciBi
dWlsZGVyIGluIHNlbGYuX2J1aWxkZXJzXSwgW10pCisKKyAgICBkZWYgc3ViX2J1aWxkZXJzKHNl
bGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fYnVpbGRlcnMKZGlmZiAtLWdpdCBhL1Rvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0cHV0c2V0X3VuaXR0ZXN0LnB5IGIvVG9v
bHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Rlc3RvdXRwdXRzZXRfdW5pdHRlc3QucHkK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uY2I4MGVkMTVhMTIxMjc0MGNlOTUwMmE0ZmMyYzg1N2FlNzhjN2E3NwotLS0g
L2Rldi9udWxsCisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0
cHV0c2V0X3VuaXR0ZXN0LnB5CkBAIC0wLDAgKzEsMTUyIEBACisjIS91c3IvYmluL2VudiBweXRo
b24KKyMgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisjIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRT
IENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOworIyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GCisjIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2Zyb20gd2Via2l0cHkuY29tbW9u
LnN5c3RlbS5maWxlc2V0IGltcG9ydCBGaWxlU2V0RmlsZUhhbmRsZQoraW1wb3J0IHRlc3RvdXRw
dXRzZXQKK2ltcG9ydCB1bml0dGVzdAorCisKK2NsYXNzIEZha2VaaXAob2JqZWN0KToKKyAgICBk
ZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX2ZpbGVzID0ge30KKworICAgIGRlZiBf
X3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkZha2VaaXAiCisKKyAgICBkZWYgaW5zZXJ0
KHNlbGYsIGZpbGVuYW1lLCBjb250ZW50KToKKyAgICAgICAgc2VsZi5fZmlsZXNbZmlsZW5hbWVd
ID0gY29udGVudAorCisgICAgZGVmIG5hbWVsaXN0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2Vs
Zi5fZmlsZXMua2V5cygpCisKKyAgICBkZWYgb3BlbihzZWxmLCBmaWxlbmFtZSk6CisgICAgICAg
IHJldHVybiBGaWxlU2V0RmlsZUhhbmRsZShzZWxmLCBmaWxlbmFtZSkKKworICAgIGRlZiByZWFk
KHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGVzW2ZpbGVuYW1lXQor
CisgICAgZGVmIGV4dHJhY3Qoc2VsZiwgZmlsZW5hbWUsIHBhdGgpOgorICAgICAgICBwcmludCAi
RmFrZVppcD4gY3AgJXMgJXMiICUgKGZpbGVuYW1lLCBwYXRoKQorCisgICAgZGVmIGRlbGV0ZShz
ZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHByaW50ICJGYWtlWmlwPiBybSAlcyIgJSBmaWxlbmFt
ZQorICAgICAgICBzZWxmLl9maWxlc1tmaWxlbmFtZV0gPSBOb25lCisKKworY2xhc3MgVGVzdE91
dHB1dFNldFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBfb3V0cHV0c2V0X3dpdGhf
emlwKHNlbGYsIHppcCwgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gdGVzdG91dHB1dHNldC5U
ZXN0T3V0cHV0U2V0KCc8ZmFrZS1vdXRwdXRzZXQ+JywgJzxmYWtlLXBsYXRmb3JtPicsIHppcCwg
Kiprd2FyZ3MpCisKKyAgICBkZWYgdGVzdF90ZXh0X2ZpbGVzX2dldF9pbnRlcnByZXRlZF9hc190
ZXh0X291dHB1dHMoc2VsZik6CisgICAgICAgIHppcCA9IEZha2VaaXAoKQorICAgICAgICB6aXAu
aW5zZXJ0KCdmYXN0L2RvbS9zb21lLXRlc3QtYWN0dWFsLnR4dCcsICdhY3R1YWwgb3V0cHV0cycp
CisgICAgICAgIGIgPSBzZWxmLl9vdXRwdXRzZXRfd2l0aF96aXAoemlwKQorICAgICAgICBzZWxm
LmFzc2VydEVxdWFscygxLCBsZW4oYi5vdXRwdXRzX2ZvcignZmFzdC9kb20vc29tZS10ZXN0Jykp
KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnZmFzdC9kb20vc29tZS10ZXN0JywgYi5vdXRw
dXRzX2ZvcignZmFzdC9kb20vc29tZS10ZXN0Lmh0bWwnKVswXS5uYW1lKCkpCisKKyAgICBkZWYg
dGVzdF9pbWFnZV9hbmRfY2hlY2tzdW1fZmlsZXNfZ2V0X2ludGVycHJldGVkX2FzX2Ffc2luZ2xl
X2ltYWdlX291dHB1dChzZWxmKToKKyAgICAgICAgemlwID0gRmFrZVppcCgpCisgICAgICAgIHpp
cC5pbnNlcnQoJ2Zhc3QvZG9tL3NvbWUtdGVzdC1hY3R1YWwuY2hlY2tzdW0nLCAnYWJjMTIzJykK
KyAgICAgICAgemlwLmluc2VydCgnZmFzdC9kb20vc29tZS10ZXN0LWFjdHVhbC5wbmcnLCAnPGlt
YWdlIGRhdGE+JykKKyAgICAgICAgYiA9IHNlbGYuX291dHB1dHNldF93aXRoX3ppcCh6aXApCisg
ICAgICAgIG91dHB1dHMgPSBiLm91dHB1dHNfZm9yKCdmYXN0L2RvbS9zb21lLXRlc3QnKQorICAg
ICAgICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4ob3V0cHV0cykpCisgICAgICAgIG91dHB1dCA9
IG91dHB1dHNbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ2ltYWdlJywgb3V0cHV0LnR5
cGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ2FiYzEyMycsIG91dHB1dC5jb250ZW50
cygpKQorCisgICAgZGVmIHRlc3RfbXVsdGlwbGVfaW1hZ2Vfb3V0cHV0c19hcmVfZGV0ZWN0ZWQo
c2VsZik6CisgICAgICAgIHppcCA9IEZha2VaaXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCdwbGF0
Zm9ybS93aW4vZmFzdC9kb20vc29tZS10ZXN0LWFjdHVhbC5jaGVja3N1bScsICdjaGVja3N1bTEn
KQorICAgICAgICB6aXAuaW5zZXJ0KCdwbGF0Zm9ybS93aW4vZmFzdC9kb20vc29tZS10ZXN0LWFj
dHVhbC5wbmcnLCAnPGltYWdlIGRhdGEgMT4nKQorICAgICAgICB6aXAuaW5zZXJ0KCdwbGF0Zm9y
bS9tYWMvZmFzdC9kb20vc29tZS10ZXN0LWFjdHVhbC5jaGVja3N1bScsICdjaGVja3N1bTInKQor
ICAgICAgICB6aXAuaW5zZXJ0KCdwbGF0Zm9ybS9tYWMvZmFzdC9kb20vc29tZS10ZXN0LWFjdHVh
bC5wbmcnLCAnPGltYWdlIGRhdGEgMj4nKQorICAgICAgICBiID0gc2VsZi5fb3V0cHV0c2V0X3dp
dGhfemlwKHppcCkKKyAgICAgICAgb3V0cHV0cyA9IGIub3V0cHV0c19mb3IoJ2Zhc3QvZG9tL3Nv
bWUtdGVzdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDIsIGxlbihvdXRwdXRzKSkKKyAg
ICAgICAgc2VsZi5hc3NlcnRGYWxzZShvdXRwdXRzWzBdLnNhbWVfY29udGVudChvdXRwdXRzWzFd
KSkKKworICAgIGRlZiB0ZXN0X2FnZ3JlZ2F0ZV9vdXRwdXRfc2V0X2NvcnJlY3RseV9yZXRyaWV2
ZXNfdGVzdHNfZnJvbV9tdWx0aXBsZV9vdXRwdXRfc2V0cyhzZWxmKToKKyAgICAgICAgb3V0cHV0
c2V0MV96aXAgPSBGYWtlWmlwKCkKKyAgICAgICAgb3V0cHV0c2V0MV96aXAuaW5zZXJ0KCdmYXN0
L2RvbS90ZXN0LWFjdHVhbC50eHQnLCAnbGludXggdGV4dCBvdXRwdXQnKQorICAgICAgICBvdXRw
dXRzZXQxID0gdGVzdG91dHB1dHNldC5UZXN0T3V0cHV0U2V0KCdsaW51eC1vdXRwdXRzZXQnLCAn
bGludXgnLCBvdXRwdXRzZXQxX3ppcCkKKyAgICAgICAgb3V0cHV0c2V0Ml96aXAgPSBGYWtlWmlw
KCkKKyAgICAgICAgb3V0cHV0c2V0Ml96aXAuaW5zZXJ0KCdmYXN0L2RvbS90ZXN0LWFjdHVhbC50
eHQnLCAnd2luZG93cyB0ZXh0IG91dHB1dCcpCisgICAgICAgIG91dHB1dHNldDIgPSB0ZXN0b3V0
cHV0c2V0LlRlc3RPdXRwdXRTZXQoJ3dpbi1vdXRwdXRzZXQnLCAnd2luJywgb3V0cHV0c2V0Ml96
aXApCisKKyAgICAgICAgYiA9IHRlc3RvdXRwdXRzZXQuQWdncmVnYXRlVGVzdE91dHB1dFNldChb
b3V0cHV0c2V0MSwgb3V0cHV0c2V0Ml0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDIsIGxl
bihiLm91dHB1dHNfZm9yKCdmYXN0L2RvbS90ZXN0JykpKQorCisgICAgZGVmIHRlc3RfY2FuX2lu
ZmVyX3BsYXRmb3JtX2Zyb21fcGF0aF9pZl9ub25lX3Byb3ZpZGVkKHNlbGYpOgorICAgICAgICB6
aXAgPSBGYWtlWmlwKCkKKyAgICAgICAgemlwLmluc2VydCgncGxhdGZvcm0vd2luL3NvbWUtdGVz
dC1leHBlY3RlZC5wbmcnLCAnPGltYWdlIGRhdGE+JykKKyAgICAgICAgemlwLmluc2VydCgncGxh
dGZvcm0vd2luL3NvbWUtdGVzdC1leHBlY3RlZC5jaGVja3N1bScsICdhYmMxMjMnKQorICAgICAg
ICBiID0gdGVzdG91dHB1dHNldC5UZXN0T3V0cHV0U2V0KCdsb2NhbCBMYXlvdXRUZXN0cyBvdXRw
dXRzZXQnLCBOb25lLCB6aXApCisKKyAgICAgICAgb3V0cHV0cyA9IGIub3V0cHV0c19mb3IoJ3Nv
bWUtdGVzdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbihvdXRwdXRzKSkKKyAg
ICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ3dpbicsIG91dHB1dHNbMF0ucGxhdGZvcm0oKSkKKwor
ICAgIGRlZiB0ZXN0X3Rlc3RfZXh0ZW5zaW9uX2lzX2lnbm9yZWQoc2VsZik6CisgICAgICAgIHpp
cCA9IEZha2VaaXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCd0ZXN0L3Rlc3QtYS1hY3R1YWwudHh0
JywgJ2FjdHVhbCBvdXRwdXRzJykKKyAgICAgICAgYiA9IHNlbGYuX291dHB1dHNldF93aXRoX3pp
cCh6aXApCisgICAgICAgIG91dHB1dHMgPSBiLm91dHB1dHNfZm9yKCd0ZXN0L3Rlc3QtYS5odG1s
JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgbGVuKG91dHB1dHMpKQorICAgICAgICBz
ZWxmLmFzc2VydEVxdWFscygndGVzdC90ZXN0LWEnLCBvdXRwdXRzWzBdLm5hbWUoKSkKKworICAg
IGRlZiB0ZXN0X2V4aXN0aW5nX291dHB1dHNfYXJlX21hcmtlZF9hc19zdWNoKHNlbGYpOgorICAg
ICAgICB6aXAgPSBGYWtlWmlwKCkKKyAgICAgICAgemlwLmluc2VydCgndGVzdC90ZXN0LWEtZXhw
ZWN0ZWQudHh0JywgJ2V4cGVjdGVkIG91dHB1dHMnKQorICAgICAgICBiID0gc2VsZi5fb3V0cHV0
c2V0X3dpdGhfemlwKHppcCkKKyAgICAgICAgb3V0cHV0cyA9IGIub3V0cHV0c19mb3IoJ3Rlc3Qv
dGVzdC1hLmh0bWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4ob3V0cHV0cykp
CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3V0cHV0c1swXS5pc19hY3R1YWwoKSkKKworICAg
IGRlZiB0ZXN0X29ubHlfcmV0dXJuc19vdXRwdXRzX29mX3NwZWNpZmllZF90eXBlKHNlbGYpOgor
ICAgICAgICB6aXAgPSBGYWtlWmlwKCkKKyAgICAgICAgemlwLmluc2VydCgndGVzdC90ZXN0LWEt
ZXhwZWN0ZWQudHh0JywgJ2V4cGVjdGVkIG91dHB1dHMnKQorICAgICAgICB6aXAuaW5zZXJ0KCd0
ZXN0L3Rlc3QtYS1leHBlY3RlZC5jaGVja3N1bScsICdleHBlY3RlZCBvdXRwdXRzJykKKyAgICAg
ICAgemlwLmluc2VydCgndGVzdC90ZXN0LWEtZXhwZWN0ZWQucG5nJywgJ2V4cGVjdGVkIG91dHB1
dHMnKQorICAgICAgICBiID0gc2VsZi5fb3V0cHV0c2V0X3dpdGhfemlwKHppcCkKKworICAgICAg
ICBvdXRwdXRzID0gYi5vdXRwdXRzX2ZvcigndGVzdC90ZXN0LWEuaHRtbCcpCisgICAgICAgIHRl
eHRfb3V0cHV0cyA9IGIub3V0cHV0c19mb3IoJ3Rlc3QvdGVzdC1hLmh0bWwnLCB0YXJnZXRfdHlw
ZT0ndGV4dCcpCisgICAgICAgIGltYWdlX291dHB1dHMgPSBiLm91dHB1dHNfZm9yKCd0ZXN0L3Rl
c3QtYS5odG1sJywgdGFyZ2V0X3R5cGU9J2ltYWdlJykKKworICAgICAgICBzZWxmLmFzc2VydEVx
dWFscygyLCBsZW4ob3V0cHV0cykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbih0
ZXh0X291dHB1dHMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4oaW1hZ2Vfb3V0
cHV0cykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCd0ZXh0JywgdGV4dF9vdXRwdXRzWzBd
LnR5cGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ2ltYWdlJywgaW1hZ2Vfb3V0cHV0
c1swXS50eXBlKCkpCisKKyAgICBkZWYgdGVzdF9leGNsdWRlX2V4cGVjdGVkX291dHB1dHNfd29y
a3Moc2VsZik6CisgICAgICAgIHppcCA9IEZha2VaaXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCd0
ZXN0LWV4cGVjdGVkLnR4dCcsICAnZXhwZWN0ZWQgb3V0cHV0cyBzdG9yZWQgb24gc2VydmVyIGZv
ciBzb21lIHJlYXNvbicpCisgICAgICAgIGIgPSBzZWxmLl9vdXRwdXRzZXRfd2l0aF96aXAoemlw
LCBpbmNsdWRlX2V4cGVjdGVkPUZhbHNlKQorICAgICAgICBvdXRwdXRzID0gYi5vdXRwdXRzX2Zv
cigndGVzdCcsIHRhcmdldF90eXBlPU5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDAs
IGxlbihvdXRwdXRzKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVz
dC5tYWluKCkK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>79891</attachid>
            <date>2011-01-23 21:36:55 -0800</date>
            <delta_ts>2011-01-31 23:41:33 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-52136-20110124163652.patch</filename>
            <type>text/plain</type>
            <size>30622</size>
            <attacher name="James Kozianski">koz</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rvb2xzL0NoYW5nZUxvZwppbmRleCA5ZDg3
OTE3N2JhZDUxYzM4MzMwYzYxMWIyZGY0OWU3N2VmMGMyNTZmLi4yN2M3NjEzODliNDE2NmRlYmI5
M2I4NGI4MmY1ZDhkMTBkNjU3YjdmIDEwMDY0NAotLS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIv
VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjIgQEAKKzIwMTEtMDEtMjMgIEphbWVzIEtvemlh
bnNraSAgPGtvekBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgQWRkIGNsYXNzZXMgZm9yIHJlcHJlc2VudGluZyB0ZXN0IG91dHB1
dHMuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01MjEz
NgorCisgICAgICAgIFRoZXNlIGNsYXNzZXMgd2lsbCBtYWtlIGl0IGVhc2llciB0byB3cml0ZSBz
Y3JpcHRzIHRoYXQgZGVhbCB3aXRoIHRlc3QKKyAgICAgICAgb3V0cHV0cyBzdWNoIGFzIHJlYmFz
ZWxpbmluZyBhbmQgZGVkdXBpbmcgc2NyaXB0cy4gVGhlIGludGVudCBpcyB0aGF0CisgICAgICAg
IGV2ZW50dWFsbHkgd2Ugd2lsbCBiZSBoYXZlIGJ1aWxkYm90IHJldHVybiBUZXN0T3V0cHV0cyBm
b3IgYQorICAgICAgICBwYXJ0aWN1bGFyIGJ1aWxkIHdoaWNoIGNhbiBiZSBjb21wYXJlZCB3aXRo
IFRlc3RPdXRwdXRzIGRlcml2ZWQgZnJvbSBhCisgICAgICAgIGxvY2FsIExheW91dFRlc3RzIGRp
cmVjdG9yeS4KKworICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0
cHV0LnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVz
dG91dHB1dF91bml0dGVzdC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9j
b21tb24vbmV0L3Rlc3RvdXRwdXRzZXQucHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Vi
a2l0cHkvY29tbW9uL25ldC90ZXN0b3V0cHV0c2V0X3VuaXR0ZXN0LnB5OiBBZGRlZC4KKyAgICAg
ICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vemlwX21vY2sucHk6IEFkZGVkLgor
CiAyMDExLTAxLTA4ICBCZW5qYW1pbiBQb3VsYWluICA8YmVuamFtaW4ucG91bGFpbkBub2tpYS5j
b20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgS2VubmV0aCBSb2hkZSBDaHJpc3RpYW5zZW4uCmRp
ZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dC5w
eSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0cHV0LnB5Cm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLjMyNzE4MmU3MWZjMTFhMTYwN2Q4NTJlMjllM2Q5YjUwNDc0MjYzODgKLS0tIC9kZXYv
bnVsbAorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dC5w
eQpAQCAtMCwwICsxLDE4OCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAo
QykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAy
LiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFT
IElTIiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsK
KyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQgb3MKK2ltcG9ydCByZQorCisKK2NsYXNzIE5haXZl
SW1hZ2VEaWZmZXIob2JqZWN0KToKKyAgICBkZWYgc2FtZV9pbWFnZShzZWxmLCBpbWcxLCBpbWcy
KToKKyAgICAgICAgcmV0dXJuIGltZzEgPT0gaW1nMgorCisKK2NsYXNzIFRlc3RPdXRwdXQob2Jq
ZWN0KToKKyAgICAiIiJSZXByZXNlbnRzIHRoZSBvdXRwdXQgdGhhdCBhIHNpbmdsZSBsYXlvdXQg
dGVzdCBnZW5lcmF0ZXMgd2hlbiBpdCBpcyBydW4KKyAgICBvbiBhIHBhcnRpY3VsYXIgcGxhdGZv
cm0uCisgICAgTm90ZSB0aGF0IHRoaXMgaXMgdGhlIHJhdyBvdXRwdXQgdGhhdCBpcyBwcm9kdWNl
ZCB3aGVuIHRoZSBsYXlvdXQgdGVzdCBpcworICAgIHJ1biwgbm90IHRoZSByZXN1bHRzIG9mIHRo
ZSBzdWJzZXF1ZW50IGNvbXBhcmlzb24gYmV0d2VlbiB0aGF0IG91dHB1dCBhbmQKKyAgICB0aGUg
ZXhwZWN0ZWQgb3V0cHV0LiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwbGF0Zm9ybSwgb3V0
cHV0X3R5cGUsIGZpbGVzKToKKyAgICAgICAgc2VsZi5fb3V0cHV0X3R5cGUgPSBvdXRwdXRfdHlw
ZQorICAgICAgICBzZWxmLl9maWxlcyA9IGZpbGVzCisgICAgICAgICMgX21haW5fZmlsZSBpcyB0
aGUgZmlsZSB0aGF0IGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBuYW1lIGFuZAorICAgICAgICAj
IGNvbnRlbnRzIG9mIHRoZSB0ZXN0IG91dHB1dC4KKyAgICAgICAgc2VsZi5fbWFpbl9maWxlID0g
ZmlsZXNbMF0KKyAgICAgICAgZmlsZW5hbWUgPSBzZWxmLl9tYWluX2ZpbGUubmFtZSgpCisgICAg
ICAgIHNlbGYuX25hbWUgPSBzZWxmLl9leHRyYWN0X3Rlc3RfbmFtZShmaWxlbmFtZSkKKyAgICAg
ICAgc2VsZi5faXNfYWN0dWFsID0gJy1hY3R1YWwuJyBpbiBmaWxlbmFtZQorCisgICAgICAgIHNl
bGYuX3BsYXRmb3JtID0gcGxhdGZvcm0gb3Igc2VsZi5fZXh0cmFjdF9wbGF0Zm9ybShmaWxlbmFt
ZSkKKworICAgIGRlZiBfZXh0cmFjdF9wbGF0Zm9ybShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAg
ICIiIkNhbGN1bGF0ZXMgdGhlIHBsYXRmb3JtIGZyb20gdGhlIG5hbWUgb2YgdGhlIGZpbGUgaWYg
aXQgaXNuJ3Qga25vd24gYWxyZWFkeSIiIgorICAgICAgICBwYXRoID0gcmUuc3BsaXQob3MucGF0
aC5zZXAsIGZpbGVuYW1lKQorICAgICAgICBpZiAncGxhdGZvcm0nIGluIHBhdGg6CisgICAgICAg
ICAgICByZXR1cm4gcGF0aFtwYXRoLmluZGV4KCdwbGF0Zm9ybScpICsgMV0KKyAgICAgICAgcmV0
dXJuIE5vbmUKKworICAgIGRlZiBfZXh0cmFjdF90ZXN0X25hbWUoc2VsZiwgZmlsZW5hbWUpOgor
ICAgICAgICB0ZXN0X25hbWUgPSBmaWxlbmFtZQorICAgICAgICBwYXRoID0gcmUuc3BsaXQob3Mu
cGF0aC5zZXAsIHRlc3RfbmFtZSkKKyAgICAgICAgaWYgJ0xheW91dFRlc3RzJyBpbiBwYXRoOgor
ICAgICAgICAgICAgcGF0aCA9IHBhdGhbMSArIHBhdGguaW5kZXgoJ0xheW91dFRlc3RzJyk6XQor
ICAgICAgICBpZiAnbGF5b3V0LXRlc3QtcmVzdWx0cycgaW4gcGF0aDoKKyAgICAgICAgICAgIHBh
dGggPSBwYXRoWzEgKyBwYXRoLmluZGV4KCdsYXlvdXQtdGVzdC1yZXN1bHRzJyk6XQorICAgICAg
ICBpZiAncGxhdGZvcm0nIGluIHBhdGg6CisgICAgICAgICAgICBwYXRoID0gcGF0aFsyICsgcGF0
aC5pbmRleCgncGxhdGZvcm0nKTpdCisKKyAgICAgICAgdGVzdF9uYW1lID0gcGF0aFstMV0KKyAg
ICAgICAgdGVzdF9uYW1lID0gcmUuc3ViKCctZXhwZWN0ZWRcLi4qJCcsICcnLCB0ZXN0X25hbWUp
CisgICAgICAgIHRlc3RfbmFtZSA9IHJlLnN1YignLWFjdHVhbFwuLiokJywgJycsIHRlc3RfbmFt
ZSkKKyAgICAgICAgcGF0aFstMV0gPSB0ZXN0X25hbWUKKyAgICAgICAgcmV0dXJuIG9zLnBhdGgu
c2VwLmpvaW4ocGF0aCkKKworICAgIGRlZiBjb250ZW50cyhzZWxmKToKKyAgICAgICAgcmV0dXJu
IHNlbGYuX21haW5fZmlsZS5jb250ZW50cygpCisKKyAgICBkZWYgc2F2ZV90byhzZWxmLCBwYXRo
KToKKyAgICAgICAgIiIiSGF2ZSB0aGUgZmlsZXMgaW4gdGhpcyBUZXN0T3V0cHV0IHdyaXRlIHRo
ZW1zZWx2ZXMgdG8gdGhlIGRpc2sgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4iIiIKKyAgICAg
ICAgZm9yIGZpbGUgaW4gc2VsZi5fZmlsZXM6CisgICAgICAgICAgICBmaWxlLnNhdmVfdG8ocGF0
aCkKKworICAgIGRlZiBpc19hY3R1YWwoc2VsZik6CisgICAgICAgICIiIklzIHRoaXMgb3V0cHV0
IHRoZSBhY3R1YWwgb3V0cHV0IG9mIGEgdGVzdD8gKEFzIG9wcG9zZWQgdG8gZXhwZWN0ZWQgb3V0
cHV0LikiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2lzX2FjdHVhbAorCisgICAgZGVmIG5hbWUo
c2VsZik6CisgICAgICAgICIiIlRoZSBuYW1lIG9mIHRoaXMgdGVzdCAoZG9lc24ndCBpbmNsdWRl
IGV4dGVuc2lvbikiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX25hbWUKKworICAgIGRlZiBzYW1l
X2NvbnRlbnQoc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gc2VsZi5jb250ZW50cygpID09
IG90aGVyLmNvbnRlbnRzKCkKKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAg
ICByZXR1cm4gKG90aGVyICE9IE5vbmUgYW5kCisgICAgICAgICAgICAgICAgc2VsZi5uYW1lKCkg
PT0gb3RoZXIubmFtZSgpIGFuZAorICAgICAgICAgICAgICAgIHNlbGYudHlwZSgpID09IG90aGVy
LnR5cGUoKSBhbmQKKyAgICAgICAgICAgICAgICBzZWxmLnBsYXRmb3JtKCkgPT0gb3RoZXIucGxh
dGZvcm0oKSBhbmQKKyAgICAgICAgICAgICAgICBzZWxmLmlzX2FjdHVhbCgpID09IG90aGVyLmlz
X2FjdHVhbCgpIGFuZAorICAgICAgICAgICAgICAgIHNlbGYuc2FtZV9jb250ZW50KG90aGVyKSkK
KworICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGhhc2goc3RyKHNlbGYu
bmFtZSgpKSArIHN0cihzZWxmLnR5cGUoKSkgKyBzdHIoc2VsZi5wbGF0Zm9ybSgpKSkKKworICAg
IGRlZiBpc19uZXdlcl90aGFuKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiJ05ldycgb3V0cHV0
cyBhcmUgdGhvc2UgdGhhdCBoYXZlIGJlZW4gZ2VuZXJhdGVkIGJ5IHRoZSBleGVjdXRpb24gb2YK
KyAgICAgICAgYSB0ZXN0LiBBIHRlc3Qgb3V0cHV0IGlzIGNvbnNpZGVyZWQgbmV3ZXIgdGhhbiBh
bm90aGVyIGlmIHRoZSBmb3JtZXIgaXMKKyAgICAgICAgdGhlIG91dHB1dCBvZiB0aGUgcnVuIG9m
IGEgdGVzdCBhbmQgdGhlIGxhdHRlciBpc24ndC4gIiIiCisgICAgICAgIHJldHVybiBzZWxmLmlz
X2FjdHVhbCgpIGFuZCBub3Qgb3RoZXIuaXNfYWN0dWFsKCkKKworICAgIGRlZiBpc19yZWJhc2Vs
aW5lX29mKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIChzZWxmLm5hbWUoKSA9PSBvdGhl
ci5uYW1lKCkgYW5kCisgICAgICAgICAgICAgICAgc2VsZi50eXBlKCkgPT0gb3RoZXIudHlwZSgp
IGFuZAorICAgICAgICAgICAgICAgIHNlbGYucGxhdGZvcm0oKSA9PSBvdGhlci5wbGF0Zm9ybSgp
IGFuZAorICAgICAgICAgICAgICAgIHNlbGYuaXNfYWN0dWFsKCkgYW5kCisgICAgICAgICAgICAg
ICAgKG5vdCBvdGhlci5pc19hY3R1YWwoKSkpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAg
ICAgICAgYWN0dWFsX3N0ciA9ICdbQV0gJyBpZiBzZWxmLmlzX2FjdHVhbCgpIGVsc2UgJycKKyAg
ICAgICAgcmV0dXJuICJUZXN0T3V0cHV0WyVzLyVzXSAlcyVzIiAlIChzZWxmLl9wbGF0Zm9ybSwg
c2VsZi5fb3V0cHV0X3R5cGUsIGFjdHVhbF9zdHIsIHNlbGYubmFtZSgpKQorCisgICAgZGVmIHR5
cGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9vdXRwdXRfdHlwZQorCisgICAgZGVmIHBs
YXRmb3JtKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcGxhdGZvcm0KKworICAgIGRlZiBf
cGF0aF90b19wbGF0Zm9ybShzZWxmLCBwbGF0Zm9ybSk6CisgICAgICAgICIiIlJldHVybnMgdGhl
IHBhdGggdGhhdCB0ZXN0cyBmb3IgdGhlIGdpdmVuIHBsYXRmb3JtIGFyZSBzdG9yZWQgaW4uIiIi
CisgICAgICAgIGlmIHBsYXRmb3JtIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gIiIKKyAg
ICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oInBsYXRmb3JtIiwg
cGxhdGZvcm0pCisKKyAgICBkZWYgX2luc3RhbGxfZmlsZShzZWxmLCBmaWxlLCBwYXRoKToKKyAg
ICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBzZWxmLl9wYXRoX3RvX3BsYXRmb3JtKHNl
bGYuX3BsYXRmb3JtKSkKKyAgICAgICAgZXh0ZW5zaW9uID0gb3MucGF0aC5zcGxpdGV4dChmaWxl
Lm5hbWUoKSlbMV0KKyAgICAgICAgZmlsZW5hbWUgPSBzZWxmLm5hbWUoKSArICctZXhwZWN0ZWQn
ICsgZXh0ZW5zaW9uCisgICAgICAgIGZpbGUuc2F2ZV90byhwYXRoLCBmaWxlbmFtZSkKKworICAg
IGRlZiBpbnN0YWxsKHNlbGYsIHBhdGhfdG9fbGF5b3V0X3Rlc3RzKToKKyAgICAgICAgIiIiU2F2
ZSB0aGUgZmlsZXMgb2YgdGhpcyBUZXN0T3V0cHV0IHRvIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3Rv
cnkKKyAgICAgICAgaW5zaWRlIHRoZSBMYXlvdXRUZXN0cyBkaXJlY3RvcnkuIFR5cGljYWxseSB0
aGlzIG1lYW5zIHRoYXQgdGhlc2UgZmlsZXMKKyAgICAgICAgd2lsbCBiZSBzYXZlZCBpbiAiTGF5
b3V0VGVzdHMvcGxhdGZvcm0vPHBsYXRmb3JtPi8sIG9yIHNpbXBseQorICAgICAgICBMYXlvdXRU
ZXN0cyBpZiB0aGUgcGxhdGZvcm0gaXMgTm9uZS4iIiIKKyAgICAgICAgZm9yIGZpbGUgaW4gc2Vs
Zi5fZmlsZXM6CisgICAgICAgICAgICBzZWxmLl9pbnN0YWxsX2ZpbGUoZmlsZSwgcGF0aF90b19s
YXlvdXRfdGVzdHMpCisKKyAgICBkZWYgZGVsZXRlKHNlbGYpOgorICAgICAgICAiIiJEZWxldGVz
IHRoZSBmaWxlcyB0aGF0IGNvbXByaXNlIHRoaXMgVGVzdE91dHB1dCBmcm9tIGRpc2suIFRoaXMK
KyAgICAgICAgZmFpbHMgaWYgdGhlIGZpbGVzIGFyZSB2aXJ0dWFsIGZpbGVzIChlZzogdGhlIGZp
bGVzIG1heSByZXNpZGUgaW5zaWRlIGEKKyAgICAgICAgcmVtb3RlIHppcCBmaWxlKS4iIiIKKyAg
ICAgICAgZm9yIGZpbGUgaW4gc2VsZi5fZmlsZXM6CisgICAgICAgICAgICBmaWxlLmRlbGV0ZSgp
CisKKworY2xhc3MgVGV4dFRlc3RPdXRwdXQoVGVzdE91dHB1dCk6CisgICAgIiIiUmVwcmVzZW50
cyBhIHRleHQgb3V0cHV0IG9mIGEgc2luZ2xlIHRlc3Qgb24gYSBzaW5nbGUgcGxhdGZvcm0iIiIK
KyAgICBkZWYgX19pbml0X18oc2VsZiwgcGxhdGZvcm0sIHRleHRfZmlsZSk6CisgICAgICAgIHNl
bGYuX3RleHRfZmlsZSA9IHRleHRfZmlsZQorICAgICAgICBUZXN0T3V0cHV0Ll9faW5pdF9fKHNl
bGYsIHBsYXRmb3JtLCAndGV4dCcsIFt0ZXh0X2ZpbGVdKQorCisgICAgZGVmIHJldGFyZ2V0KHNl
bGYsIHBsYXRmb3JtKToKKyAgICAgICAgcmV0dXJuIFRleHRUZXN0T3V0cHV0KHBsYXRmb3JtLCBz
ZWxmLl90ZXh0X2ZpbGUpCisKKworY2xhc3MgSW1hZ2VUZXN0T3V0cHV0KFRlc3RPdXRwdXQpOgor
ICAgIGltYWdlX2RpZmZlciA9IE5haXZlSW1hZ2VEaWZmZXIoKQorICAgICIiIlJlcHJlc2VudHMg
YW4gaW1hZ2Ugb3V0cHV0IG9mIGEgc2luZ2xlIHRlc3Qgb24gYSBzaW5nbGUgcGxhdGZvcm0iIiIK
KyAgICBkZWYgX19pbml0X18oc2VsZiwgcGxhdGZvcm0sIGltYWdlX2ZpbGUsIGNoZWNrc3VtX2Zp
bGUpOgorICAgICAgICBzZWxmLl9jaGVja3N1bV9maWxlID0gY2hlY2tzdW1fZmlsZQorICAgICAg
ICBzZWxmLl9pbWFnZV9maWxlID0gaW1hZ2VfZmlsZQorICAgICAgICBmaWxlcyA9IGZpbHRlcihi
b29sLCBbc2VsZi5fY2hlY2tzdW1fZmlsZSwgc2VsZi5faW1hZ2VfZmlsZV0pCisgICAgICAgIFRl
c3RPdXRwdXQuX19pbml0X18oc2VsZiwgcGxhdGZvcm0sICdpbWFnZScsIGZpbGVzKQorCisgICAg
ZGVmIGhhc19jaGVja3N1bShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NoZWNrc3VtX2Zp
bGUgaXMgbm90IE5vbmUKKworICAgIGRlZiBzYW1lX2NvbnRlbnQoc2VsZiwgb3RoZXIpOgorICAg
ICAgICBpZiBzZWxmLmhhc19jaGVja3N1bSgpIGFuZCBvdGhlci5oYXNfY2hlY2tzdW0oKToKKyAg
ICAgICAgICAgIHJldHVybiBzZWxmLl9jaGVja3N1bV9maWxlLmNvbnRlbnRzKCkgPT0gb3RoZXIu
X2NoZWNrc3VtX2ZpbGUuY29udGVudHMoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2Vs
Zl9jb250ZW50cyA9IHNlbGYuX2ltYWdlX2ZpbGUuY29udGVudHMoKQorICAgICAgICAgICAgb3Ro
ZXJfY29udGVudHMgPSBvdGhlci5faW1hZ2VfZmlsZS5jb250ZW50cygpCisgICAgICAgICAgICBy
ZXR1cm4gSW1hZ2VUZXN0T3V0cHV0LmltYWdlX2RpZmZlci5zYW1lX2ltYWdlKHNlbGZfY29udGVu
dHMsIG90aGVyX2NvbnRlbnRzKQorCisgICAgZGVmIHJldGFyZ2V0KHNlbGYsIHBsYXRmb3JtKToK
KyAgICAgICAgcmV0dXJuIEltYWdlVGVzdE91dHB1dChwbGF0Zm9ybSwgc2VsZi5faW1hZ2VfZmls
ZSwgc2VsZi5fY2hlY2tzdW1fZmlsZSkKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0
cHkvY29tbW9uL25ldC90ZXN0b3V0cHV0X3VuaXR0ZXN0LnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9jb21tb24vbmV0L3Rlc3RvdXRwdXRfdW5pdHRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZDE2Yjlk
OGRkMWJiYjA5YWJiMjBmZDIxNTA5YTk1NDc1OTM0MWU2NQotLS0gL2Rldi9udWxsCisrKyBiL1Rv
b2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0cHV0X3VuaXR0ZXN0LnB5CkBA
IC0wLDAgKzEsMTMzIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IChDKSAy
MDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuICBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMi
IEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkKKyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
CisjIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisKK2ltcG9ydCByZQoraW1wb3J0IHRlc3RvdXRwdXQKK2ltcG9ydCB1bml0
dGVzdAorCisKK2NsYXNzIEZha2VGaWxlKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYs
IGZpbGVuYW1lLCBjb250ZW50cz0iZmFrZSBjb250ZW50cyIpOgorICAgICAgICBzZWxmLl9maWxl
bmFtZSA9IGZpbGVuYW1lCisgICAgICAgIHNlbGYuX2NvbnRlbnRzID0gY29udGVudHMKKworICAg
IGRlZiBuYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmlsZW5hbWUKKworICAgIGRl
ZiBjb250ZW50cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbnRlbnRzCisKKworY2xh
c3MgRmFrZVRlc3RPdXRwdXQodGVzdG91dHB1dC5UZXN0T3V0cHV0KToKKyAgICBkZWYgX19pbml0
X18oc2VsZiwgcGxhdGZvcm0sIG91dHB1dF90eXBlLCBjb250ZW50cywgaXNfZXhwZWN0ZWQ9RmFs
c2UpOgorICAgICAgICBzZWxmLl9vdXRwdXRfdHlwZSA9IG91dHB1dF90eXBlCisgICAgICAgIHNl
bGYuX2NvbnRlbnRzID0gY29udGVudHMKKyAgICAgICAgc2VsZi5faXNfZXhwZWN0ZWQgPSBpc19l
eHBlY3RlZAorICAgICAgICBhY3R1YWwgPSAnYWN0dWFsJworICAgICAgICBpZiBpc19leHBlY3Rl
ZDoKKyAgICAgICAgICAgIGFjdHVhbCA9ICdleHBlY3RlZCcKKyAgICAgICAgdGVzdF9uYW1lID0g
J2Fub255bW91cy10ZXN0LSVzLnR4dCcgJSBhY3R1YWwKKyAgICAgICAgZmlsZSA9IEZha2VGaWxl
KHRlc3RfbmFtZSwgY29udGVudHMpCisgICAgICAgIHN1cGVyKEZha2VUZXN0T3V0cHV0LCBzZWxm
KS5fX2luaXRfXyhwbGF0Zm9ybSwgb3V0cHV0X3R5cGUsIFtmaWxlXSkKKworICAgIGRlZiBjb250
ZW50cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbnRlbnRzCisKKyAgICBkZWYgcmV0
YXJnZXQoc2VsZiwgcGxhdGZvcm0pOgorICAgICAgICByZXR1cm4gRmFrZVRlc3RPdXRwdXQocGxh
dGZvcm0sIHNlbGYuX291dHB1dF90eXBlLCBzZWxmLl9jb250ZW50cywgc2VsZi5faXNfZXhwZWN0
ZWQpCisKKworY2xhc3MgVGVzdE91dHB1dFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRl
ZiBfY2hlY2tfbmFtZShzZWxmLCBmaWxlbmFtZSwgZXhwZWN0ZWRfdGVzdF9uYW1lKToKKyAgICAg
ICAgciA9IHRlc3RvdXRwdXQuVGV4dFRlc3RPdXRwdXQoTm9uZSwgRmFrZUZpbGUoZmlsZW5hbWUp
KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3RlZF90ZXN0X25hbWUsIHIubmFtZSgp
KQorCisgICAgZGVmIF9jaGVja19wbGF0Zm9ybShzZWxmLCBmaWxlbmFtZSwgZXhwZWN0ZWRfcGxh
dGZvcm0pOgorICAgICAgICByID0gdGVzdG91dHB1dC5UZXh0VGVzdE91dHB1dChOb25lLCBGYWtl
RmlsZShmaWxlbmFtZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkX3BsYXRm
b3JtLCByLnBsYXRmb3JtKCkpCisKKyAgICBkZWYgdGVzdF9leHRyYWN0c19uYW1lX2NvcnJlY3Rs
eShzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tfbmFtZSgnTGF5b3V0VGVzdHMvZmFzdC9kb20v
YS1leHBlY3RlZC50eHQnLCAnZmFzdC9kb20vYScpCisgICAgICAgIHNlbGYuX2NoZWNrX25hbWUo
J0xheW91dFRlc3RzL2Zhc3QvZG9tL2EtYWN0dWFsLnR4dCcsICdmYXN0L2RvbS9hJykKKyAgICAg
ICAgc2VsZi5fY2hlY2tfbmFtZSgnTGF5b3V0VGVzdHMvcGxhdGZvcm0vd2luL2Zhc3QvYS1leHBl
Y3RlZC50eHQnLCAnZmFzdC9hJykKKyAgICAgICAgc2VsZi5fY2hlY2tfbmFtZSgnTGF5b3V0VGVz
dHMvcGxhdGZvcm0vd2luL2Zhc3QvYS1leHBlY3RlZC5jaGVja3N1bScsICdmYXN0L2EnKQorICAg
ICAgICBzZWxmLl9jaGVja19uYW1lKCdmYXN0L2RvbS90ZXN0LWV4cGVjdGVkLnR4dCcsICdmYXN0
L2RvbS90ZXN0JykKKyAgICAgICAgc2VsZi5fY2hlY2tfbmFtZSgnbGF5b3V0LXRlc3QtcmVzdWx0
cy9mYXN0L2EtYWN0dWFsLmNoZWNrc3VtJywgJ2Zhc3QvYScpCisKKyAgICBkZWYgdGVzdF9leHRy
YWN0c19wbGF0Zm9ybV9jb3JyZWN0bHkoc2VsZik6CisgICAgICAgIHNlbGYuX2NoZWNrX3BsYXRm
b3JtKCdMYXlvdXRUZXN0cy9wbGF0Zm9ybS93aW4vZmFzdC9hLWV4cGVjdGVkLnR4dCcsICd3aW4n
KQorICAgICAgICBzZWxmLl9jaGVja19wbGF0Zm9ybSgncGxhdGZvcm0vd2luL2Zhc3QvYS1leHBl
Y3RlZC50eHQnLCAnd2luJykKKyAgICAgICAgc2VsZi5fY2hlY2tfcGxhdGZvcm0oJ3BsYXRmb3Jt
L21hYy9mYXN0L2EtZXhwZWN0ZWQudHh0JywgJ21hYycpCisgICAgICAgIHNlbGYuX2NoZWNrX3Bs
YXRmb3JtKCdmYXN0L2EtZXhwZWN0ZWQudHh0JywgTm9uZSkKKworICAgIGRlZiB0ZXN0X291dHB1
dHNfZnJvbV9hbl9hY3R1YWxfZmlsZV9hcmVfbWFya2VkX2FzX3N1Y2goc2VsZik6CisgICAgICAg
IHIgPSB0ZXN0b3V0cHV0LlRleHRUZXN0T3V0cHV0KE5vbmUsIEZha2VGaWxlKCd0ZXN0LWFjdHVh
bC50eHQnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHIuaXNfYWN0dWFsKCkpCisKKyAgICBk
ZWYgdGVzdF9vdXRwdXRzX2Zyb21fYW5fZXhwZWN0ZWRfZmlsZV9hcmVfbm90X2FjdHVhbChzZWxm
KToKKyAgICAgICAgciA9IHRlc3RvdXRwdXQuVGV4dFRlc3RPdXRwdXQoTm9uZSwgRmFrZUZpbGUo
J3Rlc3QtZXhwZWN0ZWQudHh0JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoci5pc19hY3R1
YWwoKSkKKworICAgIGRlZiB0ZXN0X2lzX3JlYmFzZWxpbmVfb2Yoc2VsZik6CisgICAgICAgIGV4
cGVjdGVkID0gdGVzdG91dHB1dC5UZXh0VGVzdE91dHB1dCgnbWFjJywgRmFrZUZpbGUoJ3Rlc3Qt
ZXhwZWN0ZWQudHh0JykpCisgICAgICAgIGFjdHVhbCA9IHRlc3RvdXRwdXQuVGV4dFRlc3RPdXRw
dXQoJ21hYycsIEZha2VGaWxlKCd0ZXN0LWFjdHVhbC50eHQnKSkKKyAgICAgICAgc2VsZi5hc3Nl
cnRUcnVlKGFjdHVhbC5pc19yZWJhc2VsaW5lX29mKGV4cGVjdGVkKSkKKyAgICAgICAgc2VsZi5h
c3NlcnRGYWxzZShleHBlY3RlZC5pc19yZWJhc2VsaW5lX29mKGFjdHVhbCkpCisKKyAgICBkZWYg
dGVzdF9fZXFfXyhzZWxmKToKKyAgICAgICAgcjEgPSB0ZXN0b3V0cHV0LlRleHRUZXN0T3V0cHV0
KCdtYWMnLCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC50eHQnLCAnY29udGVudHMnKSkKKyAgICAg
ICAgcjIgPSB0ZXN0b3V0cHV0LlRleHRUZXN0T3V0cHV0KCdtYWMnLCBGYWtlRmlsZSgndGVzdC1l
eHBlY3RlZC50eHQnLCAnY29udGVudHMnKSkKKyAgICAgICAgcjMgPSB0ZXN0b3V0cHV0LlRleHRU
ZXN0T3V0cHV0KCd3aW4nLCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC50eHQnLCAnY29udGVudHMn
KSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyMSwgcjIpCisgICAgICAgIHNlbGYuYXNz
ZXJ0RXF1YWxzKHIxLCByMi5yZXRhcmdldCgnbWFjJykpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90
RXF1YWxzKHIxLCByMi5yZXRhcmdldCgnd2luJykpCisKKyAgICBkZWYgdGVzdF9faGFzaF9fKHNl
bGYpOgorICAgICAgICByMSA9IHRlc3RvdXRwdXQuVGV4dFRlc3RPdXRwdXQoJ21hYycsIEZha2VG
aWxlKCd0ZXN0LWV4cGVjdGVkLnR4dCcsICdjb250ZW50cycpKQorICAgICAgICByMiA9IHRlc3Rv
dXRwdXQuVGV4dFRlc3RPdXRwdXQoJ21hYycsIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnR4dCcs
ICdjb250ZW50cycpKQorICAgICAgICByMyA9IHRlc3RvdXRwdXQuVGV4dFRlc3RPdXRwdXQoTm9u
ZSwgRmFrZUZpbGUoJ3Rlc3QtZXhwZWN0ZWQudHh0JywgTm9uZSkpCisKKyAgICAgICAgeCA9IHNl
dChbcjEsIHIyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgbGVuKHNldChbcjEsIHIy
XSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygyLCBsZW4oc2V0KFtyMSwgcjIsIHIzXSkp
KQorCisgICAgZGVmIHRlc3RfaW1hZ2VfZGlmZl9pc19pbnZva2VkX2Zvcl9pbWFnZV9vdXRwdXRz
X3dpdGhvdXRfY2hlY2tzdW0oc2VsZik6CisgICAgICAgIHIxID0gdGVzdG91dHB1dC5JbWFnZVRl
c3RPdXRwdXQoJ21hYycsIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnBuZycsICdhc2RmJyksIEZh
a2VGaWxlKCd0ZXN0LWV4cGVjdGVkLmNoZWNrc3VtJywgJ2NoZWNrJykpCisgICAgICAgIHIyID0g
dGVzdG91dHB1dC5JbWFnZVRlc3RPdXRwdXQoJ21hYycsIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVk
LnBuZycsICdhc2RmJyksIE5vbmUpCisKKyAgICAgICAgIyBEZWZhdWx0IGJlaGF2aW91ciBpcyB0
byBqdXN0IGNvbXBhcmUgb24gaW1hZ2UgY29udGVudHMuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1
ZShyMS5zYW1lX2NvbnRlbnQocjIpKQorCisgICAgICAgIGNsYXNzIEFsbEltYWdlc0FyZURpZmZl
cmVudChvYmplY3QpOgorICAgICAgICAgICAgZGVmIHNhbWVfaW1hZ2Uoc2VsZiwgaW1hZ2UxLCBp
bWFnZTIpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgICMgQnV0IHdl
IGNhbiBpbnN0YWxsIG90aGVyIGltYWdlIGRpZmZlcnMuCisgICAgICAgIHRlc3RvdXRwdXQuSW1h
Z2VUZXN0T3V0cHV0LmltYWdlX2RpZmZlciA9IEFsbEltYWdlc0FyZURpZmZlcmVudCgpCisKKyAg
ICAgICAgc2VsZi5hc3NlcnRGYWxzZShyMS5zYW1lX2NvbnRlbnQocjIpKQorCitpZiBfX25hbWVf
XyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvVG9vbHMv
U2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Rlc3RvdXRwdXRzZXQucHkgYi9Ub29scy9TY3Jp
cHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dHNldC5weQpuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5mNzkx
YWMyN2ZhMmQ2MDk2YzM3YjZhODI4ZTA2MzU0MzY5ZDExY2MwCi0tLSAvZGV2L251bGwKKysrIGIv
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Rlc3RvdXRwdXRzZXQucHkKQEAgLTAs
MCArMSwxMzAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTAg
R29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworIyBhcmUgbWV0OgorIworIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5E
IEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWQorIyBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisjIExPU1Mg
T0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORAorIyBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyMg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKworZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVtLmRpcmVjdG9yeWZpbGVzZXQg
aW1wb3J0IERpcmVjdG9yeUZpbGVTZXQKK2Zyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS56aXBm
aWxlc2V0IGltcG9ydCBaaXBGaWxlU2V0CitpbXBvcnQgcmUKK2ltcG9ydCB0ZXN0b3V0cHV0Citp
bXBvcnQgdXJsbGliCisKKworY2xhc3MgVGVzdE91dHB1dFNldChvYmplY3QpOgorICAgICIiIkEg
c2V0IG9mIHRlc3Qgb3V0cHV0cyIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBwbGF0
Zm9ybSwgemlwX2ZpbGUsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5fbmFtZSA9IG5hbWUKKyAg
ICAgICAgc2VsZi5fcGxhdGZvcm0gPSBwbGF0Zm9ybQorICAgICAgICBzZWxmLl96aXBfZmlsZSA9
IHppcF9maWxlCisgICAgICAgIHNlbGYuX2luY2x1ZGVfZXhwZWN0ZWQgPSBrd2FyZ3MuZ2V0KCdp
bmNsdWRlX2V4cGVjdGVkJywgVHJ1ZSkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmcm9t
X3ppcF91cmwoY2xzLCBwbGF0Zm9ybSwgemlwX3BhdGgpOgorICAgICAgICByZXR1cm4gVGVzdE91
dHB1dFNldCgnbG9jYWwgemlwICVzIGJ1aWxkZXInICUgcGxhdGZvcm0sIHBsYXRmb3JtLCBaaXBG
aWxlU2V0KHppcF9wYXRoKSkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmcm9tX3ppcChj
bHMsIHBsYXRmb3JtLCB6aXApOgorICAgICAgICByZXR1cm4gVGVzdE91dHB1dFNldCgnbG9jYWwg
emlwICVzIGJ1aWxkZXInICUgcGxhdGZvcm0sIHBsYXRmb3JtLCB6aXApCisKKyAgICBAY2xhc3Nt
ZXRob2QKKyAgICBkZWYgZnJvbV96aXBfbWFwKGNscywgemlwX21hcCk6CisgICAgICAgIG91dHB1
dF9zZXRzID0gW10KKyAgICAgICAgZm9yIGssIHYgaW4gemlwX21hcC5pdGVtcygpOgorICAgICAg
ICAgICAgb3V0cHV0X3NldHMuYXBwZW5kKFRlc3RPdXRwdXRTZXQuZnJvbV96aXAoaywgdikpCisg
ICAgICAgIHJldHVybiBBZ2dyZWdhdGVUZXN0T3V0cHV0U2V0KG91dHB1dF9zZXRzKQorCisgICAg
QGNsYXNzbWV0aG9kCisgICAgZGVmIGZyb21fcGF0aChzZWxmLCBwYXRoLCBwbGF0Zm9ybT1Ob25l
KToKKyAgICAgICAgcmV0dXJuIFRlc3RPdXRwdXRTZXQoJ2xvY2FsICVzIGJ1aWxkZXInICUgcGxh
dGZvcm0sIHBsYXRmb3JtLCBEaXJlY3RvcnlGaWxlU2V0KHBhdGgpKQorCisgICAgZGVmIG5hbWUo
c2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9uYW1lCisKKyAgICBkZWYgc2V0X3BsYXRmb3Jt
KHNlbGYsIHBsYXRmb3JtKToKKyAgICAgICAgc2VsZi5fcGxhdGZvcm0gPSBwbGF0Zm9ybQorCisg
ICAgZGVmIGZpbGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gW3NlbGYuX3ppcF9maWxlLm9wZW4o
ZmlsZW5hbWUpIGZvciBmaWxlbmFtZSBpbiBzZWxmLl96aXBfZmlsZS5uYW1lbGlzdCgpXQorCisg
ICAgZGVmIF9leHRyYWN0X291dHB1dF9maWxlcyhzZWxmLCBuYW1lLCBleGFjdF9tYXRjaCk6Cisg
ICAgICAgIG5hbWVfbWF0Y2hlciA9IHJlLmNvbXBpbGUobmFtZSkKKyAgICAgICAgYWN0dWFsX21h
dGNoZXIgPSByZS5jb21waWxlKHInLWFjdHVhbFwuJykKKyAgICAgICAgZXhwZWN0ZWRfbWF0Y2hl
ciA9IHJlLmNvbXBpbGUocictZXhwZWN0ZWRcLicpCisKKyAgICAgICAgY2hlY2tzdW1fZmlsZXMg
PSBbXQorICAgICAgICB0ZXh0X2ZpbGVzID0gW10KKyAgICAgICAgaW1hZ2VfZmlsZXMgPSBbXQor
ICAgICAgICBmb3Igb3V0cHV0X2ZpbGUgaW4gc2VsZi5maWxlcygpOgorICAgICAgICAgICAgbmFt
ZV9tYXRjaCA9IG5hbWVfbWF0Y2hlci5zZWFyY2gob3V0cHV0X2ZpbGUubmFtZSgpKQorICAgICAg
ICAgICAgYWN0dWFsX21hdGNoID0gYWN0dWFsX21hdGNoZXIuc2VhcmNoKG91dHB1dF9maWxlLm5h
bWUoKSkKKyAgICAgICAgICAgIGV4cGVjdGVkX21hdGNoID0gZXhwZWN0ZWRfbWF0Y2hlci5zZWFy
Y2gob3V0cHV0X2ZpbGUubmFtZSgpKQorICAgICAgICAgICAgaWYgbmFtZV9tYXRjaCBhbmQgKGFj
dHVhbF9tYXRjaCBvciAoc2VsZi5faW5jbHVkZV9leHBlY3RlZCBhbmQgZXhwZWN0ZWRfbWF0Y2gp
KToKKyAgICAgICAgICAgICAgICBpZiBvdXRwdXRfZmlsZS5uYW1lKCkuZW5kc3dpdGgoJy5jaGVj
a3N1bScpOgorICAgICAgICAgICAgICAgICAgICBjaGVja3N1bV9maWxlcy5hcHBlbmQob3V0cHV0
X2ZpbGUpCisgICAgICAgICAgICAgICAgZWxpZiBvdXRwdXRfZmlsZS5uYW1lKCkuZW5kc3dpdGgo
Jy50eHQnKToKKyAgICAgICAgICAgICAgICAgICAgdGV4dF9maWxlcy5hcHBlbmQob3V0cHV0X2Zp
bGUpCisgICAgICAgICAgICAgICAgZWxpZiBvdXRwdXRfZmlsZS5uYW1lKCkuZW5kc3dpdGgoJy5w
bmcnKToKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2VfZmlsZXMuYXBwZW5kKG91dHB1dF9maWxl
KQorCisgICAgICAgIHJldHVybiAoY2hlY2tzdW1fZmlsZXMsIHRleHRfZmlsZXMsIGltYWdlX2Zp
bGVzKQorCisgICAgZGVmIF9leHRyYWN0X2ZpbGVfd2l0aF9uYW1lKHNlbGYsIG5hbWUsIGZpbGVz
KToKKyAgICAgICAgZm9yIGZpbGUgaW4gZmlsZXM6CisgICAgICAgICAgICBpZiBmaWxlLm5hbWUo
KSA9PSBuYW1lOgorICAgICAgICAgICAgICAgIHJldHVybiBmaWxlCisgICAgICAgIHJldHVybiBO
b25lCisKKyAgICBkZWYgX21ha2Vfb3V0cHV0X2Zyb21faW1hZ2Uoc2VsZiwgaW1hZ2VfZmlsZSwg
Y2hlY2tzdW1fZmlsZXMpOgorICAgICAgICBjaGVja3N1bV9maWxlX25hbWUgPSByZS5zdWIoJ1wu
cG5nJywgJy5jaGVja3N1bScsIGltYWdlX2ZpbGUubmFtZSgpKQorICAgICAgICBjaGVja3N1bV9m
aWxlID0gc2VsZi5fZXh0cmFjdF9maWxlX3dpdGhfbmFtZShjaGVja3N1bV9maWxlX25hbWUsIGNo
ZWNrc3VtX2ZpbGVzKQorICAgICAgICByZXR1cm4gdGVzdG91dHB1dC5JbWFnZVRlc3RPdXRwdXQo
c2VsZi5fcGxhdGZvcm0sIGltYWdlX2ZpbGUsIGNoZWNrc3VtX2ZpbGUpCisKKyAgICBkZWYgb3V0
cHV0c19mb3Ioc2VsZiwgbmFtZSwgKiprd2FyZ3MpOgorICAgICAgICB0YXJnZXRfdHlwZSA9IGt3
YXJncy5nZXQoJ3RhcmdldF90eXBlJywgTm9uZSkKKyAgICAgICAgZXhhY3RfbWF0Y2ggPSBrd2Fy
Z3MuZ2V0KCdleGFjdF9tYXRjaCcsIEZhbHNlKQorICAgICAgICBpZiByZS5zZWFyY2gocidcLng/
aHRtbCcsIG5hbWUpOgorICAgICAgICAgICAgbmFtZSA9IG5hbWVbOm5hbWUucmluZGV4KCcuJyld
CisKKyAgICAgICAgKGNoZWNrc3VtX2ZpbGVzLCB0ZXh0X2ZpbGVzLCBpbWFnZV9maWxlcykgPSBz
ZWxmLl9leHRyYWN0X291dHB1dF9maWxlcyhuYW1lLCBleGFjdF9tYXRjaCkKKworICAgICAgICBv
dXRwdXRzID0gW3NlbGYuX21ha2Vfb3V0cHV0X2Zyb21faW1hZ2UoaW1hZ2VfZmlsZSwgY2hlY2tz
dW1fZmlsZXMpIGZvciBpbWFnZV9maWxlIGluIGltYWdlX2ZpbGVzXQorCisgICAgICAgIG91dHB1
dHMgKz0gW3Rlc3RvdXRwdXQuVGV4dFRlc3RPdXRwdXQoc2VsZi5fcGxhdGZvcm0sIHRleHRfZmls
ZSkgZm9yIHRleHRfZmlsZSBpbiB0ZXh0X2ZpbGVzXQorCisgICAgICAgIGlmIGV4YWN0X21hdGNo
OgorICAgICAgICAgICAgb3V0cHV0cyA9IGZpbHRlcihsYW1iZGEgb3V0cHV0OiBvdXRwdXQubmFt
ZSgpID09IG5hbWUsIG91dHB1dHMpCisKKyAgICAgICAgb3V0cHV0cyA9IGZpbHRlcihsYW1iZGEg
cjogdGFyZ2V0X3R5cGUgaW4gW05vbmUsIHIudHlwZSgpXSwgb3V0cHV0cykKKworICAgICAgICBy
ZXR1cm4gb3V0cHV0cworCisKK2NsYXNzIEFnZ3JlZ2F0ZVRlc3RPdXRwdXRTZXQob2JqZWN0KToK
KyAgICAiIiJTZXQgb2YgdGVzdCBvdXRwdXRzIGZyb20gYSBsaXN0IG9mIGJ1aWxkZXJzIiIiCisg
ICAgZGVmIF9faW5pdF9fKHNlbGYsIGJ1aWxkZXJzKToKKyAgICAgICAgc2VsZi5fYnVpbGRlcnMg
PSBidWlsZGVycworCisgICAgZGVmIG91dHB1dHNfZm9yKHNlbGYsIG5hbWUsICoqa3dhcmdzKToK
KyAgICAgICAgcmV0dXJuIHN1bShbYnVpbGRlci5vdXRwdXRzX2ZvcihuYW1lLCAqKmt3YXJncykg
Zm9yIGJ1aWxkZXIgaW4gc2VsZi5fYnVpbGRlcnNdLCBbXSkKKworICAgIGRlZiBzdWJfYnVpbGRl
cnMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9idWlsZGVycwpkaWZmIC0tZ2l0IGEvVG9v
bHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Rlc3RvdXRwdXRzZXRfdW5pdHRlc3QucHkg
Yi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dHNldF91bml0dGVz
dC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwLi44MmI5MTY5N2EwNTA4ZWE1NDBhMjNkYmRmNWRjYzIzZGY3MTgzYmEy
Ci0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Rl
c3RvdXRwdXRzZXRfdW5pdHRlc3QucHkKQEAgLTAsMCArMSwxMjUgQEAKKyMhL3Vzci9iaW4vZW52
IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiAg
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFO
RCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisj
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1Ig
SVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwor
IyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorIyBPTiBBTlkgVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworZnJvbSB3ZWJraXRweS5j
b21tb24uc3lzdGVtLnppcF9tb2NrIGltcG9ydCBNb2NrWmlwCitpbXBvcnQgdGVzdG91dHB1dHNl
dAoraW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgVGVzdE91dHB1dFNldFRlc3QodW5pdHRlc3Qu
VGVzdENhc2UpOgorICAgIGRlZiBfb3V0cHV0c2V0X3dpdGhfemlwKHNlbGYsIHppcCwgKiprd2Fy
Z3MpOgorICAgICAgICByZXR1cm4gdGVzdG91dHB1dHNldC5UZXN0T3V0cHV0U2V0KCc8ZmFrZS1v
dXRwdXRzZXQ+JywgJzxmYWtlLXBsYXRmb3JtPicsIHppcCwgKiprd2FyZ3MpCisKKyAgICBkZWYg
dGVzdF90ZXh0X2ZpbGVzX2dldF9pbnRlcnByZXRlZF9hc190ZXh0X291dHB1dHMoc2VsZik6Cisg
ICAgICAgIHppcCA9IE1vY2taaXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCdmYXN0L2RvbS9zb21l
LXRlc3QtYWN0dWFsLnR4dCcsICdhY3R1YWwgb3V0cHV0cycpCisgICAgICAgIGIgPSBzZWxmLl9v
dXRwdXRzZXRfd2l0aF96aXAoemlwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4o
Yi5vdXRwdXRzX2ZvcignZmFzdC9kb20vc29tZS10ZXN0JykpKQorICAgICAgICBzZWxmLmFzc2Vy
dEVxdWFscygnZmFzdC9kb20vc29tZS10ZXN0JywgYi5vdXRwdXRzX2ZvcignZmFzdC9kb20vc29t
ZS10ZXN0Lmh0bWwnKVswXS5uYW1lKCkpCisKKyAgICBkZWYgdGVzdF9pbWFnZV9hbmRfY2hlY2tz
dW1fZmlsZXNfZ2V0X2ludGVycHJldGVkX2FzX2Ffc2luZ2xlX2ltYWdlX291dHB1dChzZWxmKToK
KyAgICAgICAgemlwID0gTW9ja1ppcCgpCisgICAgICAgIHppcC5pbnNlcnQoJ2Zhc3QvZG9tL3Nv
bWUtdGVzdC1hY3R1YWwuY2hlY2tzdW0nLCAnYWJjMTIzJykKKyAgICAgICAgemlwLmluc2VydCgn
ZmFzdC9kb20vc29tZS10ZXN0LWFjdHVhbC5wbmcnLCAnPGltYWdlIGRhdGE+JykKKyAgICAgICAg
YiA9IHNlbGYuX291dHB1dHNldF93aXRoX3ppcCh6aXApCisgICAgICAgIG91dHB1dHMgPSBiLm91
dHB1dHNfZm9yKCdmYXN0L2RvbS9zb21lLXRlc3QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFs
cygxLCBsZW4ob3V0cHV0cykpCisgICAgICAgIG91dHB1dCA9IG91dHB1dHNbMF0KKyAgICAgICAg
c2VsZi5hc3NlcnRFcXVhbHMoJ2ltYWdlJywgb3V0cHV0LnR5cGUoKSkKKyAgICAgICAgc2VsZi5h
c3NlcnRFcXVhbHMoJ2FiYzEyMycsIG91dHB1dC5jb250ZW50cygpKQorCisgICAgZGVmIHRlc3Rf
bXVsdGlwbGVfaW1hZ2Vfb3V0cHV0c19hcmVfZGV0ZWN0ZWQoc2VsZik6CisgICAgICAgIHppcCA9
IE1vY2taaXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCdwbGF0Zm9ybS93aW4vZmFzdC9kb20vc29t
ZS10ZXN0LWFjdHVhbC5jaGVja3N1bScsICdjaGVja3N1bTEnKQorICAgICAgICB6aXAuaW5zZXJ0
KCdwbGF0Zm9ybS93aW4vZmFzdC9kb20vc29tZS10ZXN0LWFjdHVhbC5wbmcnLCAnPGltYWdlIGRh
dGEgMT4nKQorICAgICAgICB6aXAuaW5zZXJ0KCdwbGF0Zm9ybS9tYWMvZmFzdC9kb20vc29tZS10
ZXN0LWFjdHVhbC5jaGVja3N1bScsICdjaGVja3N1bTInKQorICAgICAgICB6aXAuaW5zZXJ0KCdw
bGF0Zm9ybS9tYWMvZmFzdC9kb20vc29tZS10ZXN0LWFjdHVhbC5wbmcnLCAnPGltYWdlIGRhdGEg
Mj4nKQorICAgICAgICBiID0gc2VsZi5fb3V0cHV0c2V0X3dpdGhfemlwKHppcCkKKyAgICAgICAg
b3V0cHV0cyA9IGIub3V0cHV0c19mb3IoJ2Zhc3QvZG9tL3NvbWUtdGVzdCcpCisgICAgICAgIHNl
bGYuYXNzZXJ0RXF1YWxzKDIsIGxlbihvdXRwdXRzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxz
ZShvdXRwdXRzWzBdLnNhbWVfY29udGVudChvdXRwdXRzWzFdKSkKKworICAgIGRlZiB0ZXN0X2Fn
Z3JlZ2F0ZV9vdXRwdXRfc2V0X2NvcnJlY3RseV9yZXRyaWV2ZXNfdGVzdHNfZnJvbV9tdWx0aXBs
ZV9vdXRwdXRfc2V0cyhzZWxmKToKKyAgICAgICAgb3V0cHV0c2V0MV96aXAgPSBNb2NrWmlwKCkK
KyAgICAgICAgb3V0cHV0c2V0MV96aXAuaW5zZXJ0KCdmYXN0L2RvbS90ZXN0LWFjdHVhbC50eHQn
LCAnbGludXggdGV4dCBvdXRwdXQnKQorICAgICAgICBvdXRwdXRzZXQxID0gdGVzdG91dHB1dHNl
dC5UZXN0T3V0cHV0U2V0KCdsaW51eC1vdXRwdXRzZXQnLCAnbGludXgnLCBvdXRwdXRzZXQxX3pp
cCkKKyAgICAgICAgb3V0cHV0c2V0Ml96aXAgPSBNb2NrWmlwKCkKKyAgICAgICAgb3V0cHV0c2V0
Ml96aXAuaW5zZXJ0KCdmYXN0L2RvbS90ZXN0LWFjdHVhbC50eHQnLCAnd2luZG93cyB0ZXh0IG91
dHB1dCcpCisgICAgICAgIG91dHB1dHNldDIgPSB0ZXN0b3V0cHV0c2V0LlRlc3RPdXRwdXRTZXQo
J3dpbi1vdXRwdXRzZXQnLCAnd2luJywgb3V0cHV0c2V0Ml96aXApCisKKyAgICAgICAgYiA9IHRl
c3RvdXRwdXRzZXQuQWdncmVnYXRlVGVzdE91dHB1dFNldChbb3V0cHV0c2V0MSwgb3V0cHV0c2V0
Ml0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDIsIGxlbihiLm91dHB1dHNfZm9yKCdmYXN0
L2RvbS90ZXN0JykpKQorCisgICAgZGVmIHRlc3RfY2FuX2luZmVyX3BsYXRmb3JtX2Zyb21fcGF0
aF9pZl9ub25lX3Byb3ZpZGVkKHNlbGYpOgorICAgICAgICB6aXAgPSBNb2NrWmlwKCkKKyAgICAg
ICAgemlwLmluc2VydCgncGxhdGZvcm0vd2luL3NvbWUtdGVzdC1leHBlY3RlZC5wbmcnLCAnPGlt
YWdlIGRhdGE+JykKKyAgICAgICAgemlwLmluc2VydCgncGxhdGZvcm0vd2luL3NvbWUtdGVzdC1l
eHBlY3RlZC5jaGVja3N1bScsICdhYmMxMjMnKQorICAgICAgICBiID0gdGVzdG91dHB1dHNldC5U
ZXN0T3V0cHV0U2V0KCdsb2NhbCBMYXlvdXRUZXN0cyBvdXRwdXRzZXQnLCBOb25lLCB6aXApCisK
KyAgICAgICAgb3V0cHV0cyA9IGIub3V0cHV0c19mb3IoJ3NvbWUtdGVzdCcpCisgICAgICAgIHNl
bGYuYXNzZXJ0RXF1YWxzKDEsIGxlbihvdXRwdXRzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVh
bHMoJ3dpbicsIG91dHB1dHNbMF0ucGxhdGZvcm0oKSkKKworICAgIGRlZiB0ZXN0X3Rlc3RfZXh0
ZW5zaW9uX2lzX2lnbm9yZWQoc2VsZik6CisgICAgICAgIHppcCA9IE1vY2taaXAoKQorICAgICAg
ICB6aXAuaW5zZXJ0KCd0ZXN0L3Rlc3QtYS1hY3R1YWwudHh0JywgJ2FjdHVhbCBvdXRwdXRzJykK
KyAgICAgICAgYiA9IHNlbGYuX291dHB1dHNldF93aXRoX3ppcCh6aXApCisgICAgICAgIG91dHB1
dHMgPSBiLm91dHB1dHNfZm9yKCd0ZXN0L3Rlc3QtYS5odG1sJykKKyAgICAgICAgc2VsZi5hc3Nl
cnRFcXVhbHMoMSwgbGVuKG91dHB1dHMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygndGVz
dC90ZXN0LWEnLCBvdXRwdXRzWzBdLm5hbWUoKSkKKworICAgIGRlZiB0ZXN0X2V4aXN0aW5nX291
dHB1dHNfYXJlX21hcmtlZF9hc19zdWNoKHNlbGYpOgorICAgICAgICB6aXAgPSBNb2NrWmlwKCkK
KyAgICAgICAgemlwLmluc2VydCgndGVzdC90ZXN0LWEtZXhwZWN0ZWQudHh0JywgJ2V4cGVjdGVk
IG91dHB1dHMnKQorICAgICAgICBiID0gc2VsZi5fb3V0cHV0c2V0X3dpdGhfemlwKHppcCkKKyAg
ICAgICAgb3V0cHV0cyA9IGIub3V0cHV0c19mb3IoJ3Rlc3QvdGVzdC1hLmh0bWwnKQorICAgICAg
ICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4ob3V0cHV0cykpCisgICAgICAgIHNlbGYuYXNzZXJ0
RmFsc2Uob3V0cHV0c1swXS5pc19hY3R1YWwoKSkKKworICAgIGRlZiB0ZXN0X29ubHlfcmV0dXJu
c19vdXRwdXRzX29mX3NwZWNpZmllZF90eXBlKHNlbGYpOgorICAgICAgICB6aXAgPSBNb2NrWmlw
KCkKKyAgICAgICAgemlwLmluc2VydCgndGVzdC90ZXN0LWEtZXhwZWN0ZWQudHh0JywgJ2V4cGVj
dGVkIG91dHB1dHMnKQorICAgICAgICB6aXAuaW5zZXJ0KCd0ZXN0L3Rlc3QtYS1leHBlY3RlZC5j
aGVja3N1bScsICdleHBlY3RlZCBvdXRwdXRzJykKKyAgICAgICAgemlwLmluc2VydCgndGVzdC90
ZXN0LWEtZXhwZWN0ZWQucG5nJywgJ2V4cGVjdGVkIG91dHB1dHMnKQorICAgICAgICBiID0gc2Vs
Zi5fb3V0cHV0c2V0X3dpdGhfemlwKHppcCkKKworICAgICAgICBvdXRwdXRzID0gYi5vdXRwdXRz
X2ZvcigndGVzdC90ZXN0LWEuaHRtbCcpCisgICAgICAgIHRleHRfb3V0cHV0cyA9IGIub3V0cHV0
c19mb3IoJ3Rlc3QvdGVzdC1hLmh0bWwnLCB0YXJnZXRfdHlwZT0ndGV4dCcpCisgICAgICAgIGlt
YWdlX291dHB1dHMgPSBiLm91dHB1dHNfZm9yKCd0ZXN0L3Rlc3QtYS5odG1sJywgdGFyZ2V0X3R5
cGU9J2ltYWdlJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFscygyLCBsZW4ob3V0cHV0cykp
CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbih0ZXh0X291dHB1dHMpKQorICAgICAg
ICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4oaW1hZ2Vfb3V0cHV0cykpCisgICAgICAgIHNlbGYu
YXNzZXJ0RXF1YWxzKCd0ZXh0JywgdGV4dF9vdXRwdXRzWzBdLnR5cGUoKSkKKyAgICAgICAgc2Vs
Zi5hc3NlcnRFcXVhbHMoJ2ltYWdlJywgaW1hZ2Vfb3V0cHV0c1swXS50eXBlKCkpCisKKyAgICBk
ZWYgdGVzdF9leGNsdWRlX2V4cGVjdGVkX291dHB1dHNfd29ya3Moc2VsZik6CisgICAgICAgIHpp
cCA9IE1vY2taaXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCd0ZXN0LWV4cGVjdGVkLnR4dCcsICAn
ZXhwZWN0ZWQgb3V0cHV0cyBzdG9yZWQgb24gc2VydmVyIGZvciBzb21lIHJlYXNvbicpCisgICAg
ICAgIGIgPSBzZWxmLl9vdXRwdXRzZXRfd2l0aF96aXAoemlwLCBpbmNsdWRlX2V4cGVjdGVkPUZh
bHNlKQorICAgICAgICBvdXRwdXRzID0gYi5vdXRwdXRzX2ZvcigndGVzdCcsIHRhcmdldF90eXBl
PU5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDAsIGxlbihvdXRwdXRzKSkKKworaWYg
X19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBh
L1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS96aXBfbW9jay5weSBiL1Rvb2xz
L1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS96aXBfbW9jay5weQpuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5k
Y2ZhYmE3MGQwOGJiN2E2ZDE5N2RlNWJmODkyM2U3MDM5MGU5YzBlCi0tLSAvZGV2L251bGwKKysr
IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL3ppcF9tb2NrLnB5CkBAIC0w
LDAgKzEsNTUgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMg
MS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
IyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElF
RAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyMgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMKKyMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyMgT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisjIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2Zyb20gd2Via2l0
cHkuY29tbW9uLnN5c3RlbS5maWxlc2V0IGltcG9ydCBGaWxlU2V0RmlsZUhhbmRsZQorZnJvbSB3
ZWJraXRweS5jb21tb24uc3lzdGVtLmZpbGVzeXN0ZW1fbW9jayBpbXBvcnQgTW9ja0ZpbGVTeXN0
ZW0KKworCitjbGFzcyBNb2NrWmlwKG9iamVjdCk6CisgICAgIiIiQSBtb2NrIHppcCBmaWxlIHRo
YXQgY2FuIGhhdmUgbmV3IGZpbGVzIGluc2VydGVkIGludG8gaXQuIiIiCisgICAgZGVmIF9faW5p
dF9fKHNlbGYsIGZpbGVzeXN0ZW09Tm9uZSk6CisgICAgICAgIHNlbGYuX2ZpbGVzeXN0ZW0gPSBm
aWxlc3lzdGVtIG9yIE1vY2tGaWxlU3lzdGVtKCkKKyAgICAgICAgc2VsZi5fZmlsZXMgPSB7fQor
CisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAiTW9ja1ppcCIKKworICAg
IGRlZiBpbnNlcnQoc2VsZiwgZmlsZW5hbWUsIGNvbnRlbnQpOgorICAgICAgICBzZWxmLl9maWxl
c1tmaWxlbmFtZV0gPSBjb250ZW50CisKKyAgICBkZWYgbmFtZWxpc3Qoc2VsZik6CisgICAgICAg
IHJldHVybiBzZWxmLl9maWxlcy5rZXlzKCkKKworICAgIGRlZiBvcGVuKHNlbGYsIGZpbGVuYW1l
KToKKyAgICAgICAgcmV0dXJuIEZpbGVTZXRGaWxlSGFuZGxlKHNlbGYsIGZpbGVuYW1lKQorCisg
ICAgZGVmIHJlYWQoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmlsZXNb
ZmlsZW5hbWVdCisKKyAgICBkZWYgZXh0cmFjdChzZWxmLCBmaWxlbmFtZSwgcGF0aCk6CisgICAg
ICAgIGZ1bGxfcGF0aCA9IHNlbGYuX2ZpbGVzeXN0ZW0uam9pbihwYXRoLCBmaWxlbmFtZSkKKyAg
ICAgICAgY29udGVudHMgPSBzZWxmLm9wZW4oZmlsZW5hbWUpLmNvbnRlbnRzKCkKKyAgICAgICAg
c2VsZi5fZmlsZXN5c3RlbS53cml0ZV90ZXh0X2ZpbGUoZnVsbF9wYXRoLCBjb250ZW50cykKKwor
ICAgIGRlZiBkZWxldGUoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBzZWxmLl9maWxlc1tmaWxl
bmFtZV0gPSBOb25lCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>80715</attachid>
            <date>2011-01-31 21:26:56 -0800</date>
            <delta_ts>2011-02-03 20:52:44 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-52136-20110201162653.patch</filename>
            <type>text/plain</type>
            <size>30540</size>
            <attacher name="James Kozianski">koz</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rvb2xzL0NoYW5nZUxvZwppbmRleCAzNDE1
NTQ2NTFjZmE3M2JiZTE1MGI3MmU5NmFjYmJmZWJkZDExYzAwLi40ODE4Mzk2MWFmMTRkZTk5MTY1
YTkwZWI0MzdjY2QzNWZkMjM5NmVkIDEwMDY0NAotLS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIv
VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjIgQEAKKzIwMTEtMDEtMzEgIEphbWVzIEtvemlh
bnNraSAgPGtvekBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgQWRkIGNsYXNzZXMgZm9yIHJlcHJlc2VudGluZyB0ZXN0IG91dHB1
dHMuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01MjEz
NgorCisgICAgICAgIFRoZXNlIGNsYXNzZXMgd2lsbCBtYWtlIGl0IGVhc2llciB0byB3cml0ZSBz
Y3JpcHRzIHRoYXQgZGVhbCB3aXRoIHRlc3QKKyAgICAgICAgb3V0cHV0cyBzdWNoIGFzIHJlYmFz
ZWxpbmluZyBhbmQgZGVkdXBpbmcgc2NyaXB0cy4gVGhlIGludGVudCBpcyB0aGF0CisgICAgICAg
IGV2ZW50dWFsbHkgd2Ugd2lsbCBiZSBoYXZlIGJ1aWxkYm90IHJldHVybiBUZXN0T3V0cHV0cyBm
b3IgYQorICAgICAgICBwYXJ0aWN1bGFyIGJ1aWxkIHdoaWNoIGNhbiBiZSBjb21wYXJlZCB3aXRo
IFRlc3RPdXRwdXRzIGRlcml2ZWQgZnJvbSBhCisgICAgICAgIGxvY2FsIExheW91dFRlc3RzIGRp
cmVjdG9yeS4KKworICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0
cHV0LnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVz
dG91dHB1dF91bml0dGVzdC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9j
b21tb24vbmV0L3Rlc3RvdXRwdXRzZXQucHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Vi
a2l0cHkvY29tbW9uL25ldC90ZXN0b3V0cHV0c2V0X3VuaXR0ZXN0LnB5OiBBZGRlZC4KKyAgICAg
ICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vemlwX21vY2sucHk6IEFkZGVkLgor
CiAyMDExLTAxLTMxICBNaWhhaSBQYXJwYXJpdGEgIDxtaWhhaXBAY2hyb21pdW0ub3JnPgogCiAg
ICAgICAgIFJldmlld2VkIGJ5IFRvbnkgQ2hhbmcuCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRz
L3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0
cHkvY29tbW9uL25ldC90ZXN0b3V0cHV0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjFjMzdlZGRlMmFkNjQ4ZTRj
OGRkNmU2ZGJiMDMxMDhlNzg1ZjlmZmUKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9TY3JpcHRz
L3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dC5weQpAQCAtMCwwICsxLDE4NSBAQAorIyEv
dXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6
CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisjIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
IElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisjIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisj
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBv
cnQgb3MKK2ltcG9ydCByZQorCisKK2NsYXNzIE5haXZlSW1hZ2VEaWZmZXIob2JqZWN0KToKKyAg
ICBkZWYgc2FtZV9pbWFnZShzZWxmLCBpbWcxLCBpbWcyKToKKyAgICAgICAgcmV0dXJuIGltZzEg
PT0gaW1nMgorCisKK2NsYXNzIFRlc3RPdXRwdXQob2JqZWN0KToKKyAgICAiIiJSZXByZXNlbnRz
IHRoZSBvdXRwdXQgdGhhdCBhIHNpbmdsZSBsYXlvdXQgdGVzdCBnZW5lcmF0ZXMgd2hlbiBpdCBp
cyBydW4KKyAgICBvbiBhIHBhcnRpY3VsYXIgcGxhdGZvcm0uCisgICAgTm90ZSB0aGF0IHRoaXMg
aXMgdGhlIHJhdyBvdXRwdXQgdGhhdCBpcyBwcm9kdWNlZCB3aGVuIHRoZSBsYXlvdXQgdGVzdCBp
cworICAgIHJ1biwgbm90IHRoZSByZXN1bHRzIG9mIHRoZSBzdWJzZXF1ZW50IGNvbXBhcmlzb24g
YmV0d2VlbiB0aGF0IG91dHB1dCBhbmQKKyAgICB0aGUgZXhwZWN0ZWQgb3V0cHV0LiIiIgorICAg
IGRlZiBfX2luaXRfXyhzZWxmLCBwbGF0Zm9ybSwgb3V0cHV0X3R5cGUsIGZpbGVzKToKKyAgICAg
ICAgc2VsZi5fb3V0cHV0X3R5cGUgPSBvdXRwdXRfdHlwZQorICAgICAgICBzZWxmLl9maWxlcyA9
IGZpbGVzCisgICAgICAgIGZpbGUgPSBmaWxlc1swXSAgIyBQaWNrIHNvbWUgZmlsZSB0byBkbyB0
ZXN0IG5hbWUgY2FsY3VsYXRpb24uCisgICAgICAgIHNlbGYuX25hbWUgPSBzZWxmLl9leHRyYWN0
X3Rlc3RfbmFtZShmaWxlLm5hbWUoKSkKKyAgICAgICAgc2VsZi5faXNfYWN0dWFsID0gJy1hY3R1
YWwuJyBpbiBmaWxlLm5hbWUoKQorCisgICAgICAgIHNlbGYuX3BsYXRmb3JtID0gcGxhdGZvcm0g
b3Igc2VsZi5fZXh0cmFjdF9wbGF0Zm9ybShmaWxlLm5hbWUoKSkKKworICAgIGRlZiBfZXh0cmFj
dF9wbGF0Zm9ybShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgICIiIkNhbGN1bGF0ZXMgdGhlIHBs
YXRmb3JtIGZyb20gdGhlIG5hbWUgb2YgdGhlIGZpbGUgaWYgaXQgaXNuJ3Qga25vd24gYWxyZWFk
eSIiIgorICAgICAgICBwYXRoID0gcmUuc3BsaXQob3MucGF0aC5zZXAsIGZpbGVuYW1lKQorICAg
ICAgICBpZiAncGxhdGZvcm0nIGluIHBhdGg6CisgICAgICAgICAgICByZXR1cm4gcGF0aFtwYXRo
LmluZGV4KCdwbGF0Zm9ybScpICsgMV0KKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBf
ZXh0cmFjdF90ZXN0X25hbWUoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBwYXRoID0gcmUuc3Bs
aXQob3MucGF0aC5zZXAsIGZpbGVuYW1lKQorICAgICAgICBpZiAnTGF5b3V0VGVzdHMnIGluIHBh
dGg6CisgICAgICAgICAgICBwYXRoID0gcGF0aFsxICsgcGF0aC5pbmRleCgnTGF5b3V0VGVzdHMn
KTpdCisgICAgICAgIGlmICdsYXlvdXQtdGVzdC1yZXN1bHRzJyBpbiBwYXRoOgorICAgICAgICAg
ICAgcGF0aCA9IHBhdGhbMSArIHBhdGguaW5kZXgoJ2xheW91dC10ZXN0LXJlc3VsdHMnKTpdCisg
ICAgICAgIGlmICdwbGF0Zm9ybScgaW4gcGF0aDoKKyAgICAgICAgICAgIHBhdGggPSBwYXRoWzIg
KyBwYXRoLmluZGV4KCdwbGF0Zm9ybScpOl0KKworICAgICAgICBmaWxlbmFtZSA9IHBhdGhbLTFd
CisgICAgICAgIGZpbGVuYW1lID0gcmUuc3ViKCctZXhwZWN0ZWRcLi4qJCcsICcnLCBmaWxlbmFt
ZSkKKyAgICAgICAgZmlsZW5hbWUgPSByZS5zdWIoJy1hY3R1YWxcLi4qJCcsICcnLCBmaWxlbmFt
ZSkKKyAgICAgICAgcGF0aFstMV0gPSBmaWxlbmFtZQorICAgICAgICByZXR1cm4gb3MucGF0aC5z
ZXAuam9pbihwYXRoKQorCisgICAgZGVmIHNhdmVfdG8oc2VsZiwgcGF0aCk6CisgICAgICAgICIi
IkhhdmUgdGhlIGZpbGVzIGluIHRoaXMgVGVzdE91dHB1dCB3cml0ZSB0aGVtc2VsdmVzIHRvIHRo
ZSBkaXNrIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uIiIiCisgICAgICAgIGZvciBmaWxlIGlu
IHNlbGYuX2ZpbGVzOgorICAgICAgICAgICAgZmlsZS5zYXZlX3RvKHBhdGgpCisKKyAgICBkZWYg
aXNfYWN0dWFsKHNlbGYpOgorICAgICAgICAiIiJJcyB0aGlzIG91dHB1dCB0aGUgYWN0dWFsIG91
dHB1dCBvZiBhIHRlc3Q/IChBcyBvcHBvc2VkIHRvIGV4cGVjdGVkIG91dHB1dC4pIiIiCisgICAg
ICAgIHJldHVybiBzZWxmLl9pc19hY3R1YWwKKworICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAg
ICAiIiJUaGUgbmFtZSBvZiB0aGlzIHRlc3QgKGRvZXNuJ3QgaW5jbHVkZSBleHRlbnNpb24pIiIi
CisgICAgICAgIHJldHVybiBzZWxmLl9uYW1lCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVy
KToKKyAgICAgICAgcmV0dXJuIChvdGhlciAhPSBOb25lIGFuZAorICAgICAgICAgICAgICAgIHNl
bGYubmFtZSgpID09IG90aGVyLm5hbWUoKSBhbmQKKyAgICAgICAgICAgICAgICBzZWxmLnR5cGUo
KSA9PSBvdGhlci50eXBlKCkgYW5kCisgICAgICAgICAgICAgICAgc2VsZi5wbGF0Zm9ybSgpID09
IG90aGVyLnBsYXRmb3JtKCkgYW5kCisgICAgICAgICAgICAgICAgc2VsZi5pc19hY3R1YWwoKSA9
PSBvdGhlci5pc19hY3R1YWwoKSBhbmQKKyAgICAgICAgICAgICAgICBzZWxmLnNhbWVfY29udGVu
dChvdGhlcikpCisKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHJldHVybiBoYXNo
KHN0cihzZWxmLm5hbWUoKSkgKyBzdHIoc2VsZi50eXBlKCkpICsgc3RyKHNlbGYucGxhdGZvcm0o
KSkpCisKKyAgICBkZWYgaXNfbmV3ZXJfdGhhbihzZWxmLCBvdGhlcik6CisgICAgICAgICIiIidO
ZXcnIG91dHB1dHMgYXJlIHRob3NlIHRoYXQgaGF2ZSBiZWVuIGdlbmVyYXRlZCBieSB0aGUgZXhl
Y3V0aW9uIG9mCisgICAgICAgIGEgdGVzdC4gQSB0ZXN0IG91dHB1dCBpcyBjb25zaWRlcmVkIG5l
d2VyIHRoYW4gYW5vdGhlciBpZiB0aGUgZm9ybWVyIGlzCisgICAgICAgIHRoZSBvdXRwdXQgb2Yg
dGhlIHJ1biBvZiBhIHRlc3QgYW5kIHRoZSBsYXR0ZXIgaXNuJ3QuICIiIgorICAgICAgICByZXR1
cm4gc2VsZi5pc19hY3R1YWwoKSBhbmQgbm90IG90aGVyLmlzX2FjdHVhbCgpCisKKyAgICBkZWYg
aXNfcmViYXNlbGluZV9vZihzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiAoc2VsZi5uYW1l
KCkgPT0gb3RoZXIubmFtZSgpIGFuZAorICAgICAgICAgICAgICAgIHNlbGYudHlwZSgpID09IG90
aGVyLnR5cGUoKSBhbmQKKyAgICAgICAgICAgICAgICBzZWxmLnBsYXRmb3JtKCkgPT0gb3RoZXIu
cGxhdGZvcm0oKSBhbmQKKyAgICAgICAgICAgICAgICBzZWxmLmlzX2FjdHVhbCgpIGFuZAorICAg
ICAgICAgICAgICAgIChub3Qgb3RoZXIuaXNfYWN0dWFsKCkpKQorCisgICAgZGVmIF9fc3RyX18o
c2VsZik6CisgICAgICAgIGFjdHVhbF9zdHIgPSAnW0FdICcgaWYgc2VsZi5pc19hY3R1YWwoKSBl
bHNlICcnCisgICAgICAgIHJldHVybiAiVGVzdE91dHB1dFslcy8lc10gJXMlcyIgJSAoc2VsZi5f
cGxhdGZvcm0sIHNlbGYuX291dHB1dF90eXBlLCBhY3R1YWxfc3RyLCBzZWxmLm5hbWUoKSkKKwor
ICAgIGRlZiB0eXBlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fb3V0cHV0X3R5cGUKKwor
ICAgIGRlZiBwbGF0Zm9ybShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3BsYXRmb3JtCisK
KyAgICBkZWYgX3BhdGhfdG9fcGxhdGZvcm0oc2VsZiwgcGxhdGZvcm0pOgorICAgICAgICAiIiJS
ZXR1cm5zIHRoZSBwYXRoIHRoYXQgdGVzdHMgZm9yIHRoZSBnaXZlbiBwbGF0Zm9ybSBhcmUgc3Rv
cmVkIGluLiIiIgorICAgICAgICBpZiBwbGF0Zm9ybSBpcyBOb25lOgorICAgICAgICAgICAgcmV0
dXJuICIiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKCJw
bGF0Zm9ybSIsIHBsYXRmb3JtKQorCisgICAgZGVmIF9zYXZlX2V4cGVjdGVkX3Jlc3VsdChzZWxm
LCBmaWxlLCBwYXRoKToKKyAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBzZWxmLl9w
YXRoX3RvX3BsYXRmb3JtKHNlbGYuX3BsYXRmb3JtKSkKKyAgICAgICAgZXh0ZW5zaW9uID0gb3Mu
cGF0aC5zcGxpdGV4dChmaWxlLm5hbWUoKSlbMV0KKyAgICAgICAgZmlsZW5hbWUgPSBzZWxmLm5h
bWUoKSArICctZXhwZWN0ZWQnICsgZXh0ZW5zaW9uCisgICAgICAgIGZpbGUuc2F2ZV90byhwYXRo
LCBmaWxlbmFtZSkKKworICAgIGRlZiBzYXZlX2V4cGVjdGVkX3Jlc3VsdHMoc2VsZiwgcGF0aF90
b19sYXlvdXRfdGVzdHMpOgorICAgICAgICAiIiJTYXZlIHRoZSBmaWxlcyBvZiB0aGlzIFRlc3RP
dXRwdXQgdG8gdGhlIGFwcHJvcHJpYXRlIGRpcmVjdG9yeQorICAgICAgICBpbnNpZGUgdGhlIExh
eW91dFRlc3RzIGRpcmVjdG9yeS4gVHlwaWNhbGx5IHRoaXMgbWVhbnMgdGhhdCB0aGVzZSBmaWxl
cworICAgICAgICB3aWxsIGJlIHNhdmVkIGluICJMYXlvdXRUZXN0cy9wbGF0Zm9ybS88cGxhdGZv
cm0+Lywgb3Igc2ltcGx5CisgICAgICAgIExheW91dFRlc3RzIGlmIHRoZSBwbGF0Zm9ybSBpcyBO
b25lLiIiIgorICAgICAgICBmb3IgZmlsZSBpbiBzZWxmLl9maWxlczoKKyAgICAgICAgICAgIHNl
bGYuX3NhdmVfZXhwZWN0ZWRfcmVzdWx0KGZpbGUsIHBhdGhfdG9fbGF5b3V0X3Rlc3RzKQorCisg
ICAgZGVmIGRlbGV0ZShzZWxmKToKKyAgICAgICAgIiIiRGVsZXRlcyB0aGUgZmlsZXMgdGhhdCBj
b21wcmlzZSB0aGlzIFRlc3RPdXRwdXQgZnJvbSBkaXNrLiBUaGlzCisgICAgICAgIGZhaWxzIGlm
IHRoZSBmaWxlcyBhcmUgdmlydHVhbCBmaWxlcyAoZWc6IHRoZSBmaWxlcyBtYXkgcmVzaWRlIGlu
c2lkZSBhCisgICAgICAgIHJlbW90ZSB6aXAgZmlsZSkuIiIiCisgICAgICAgIGZvciBmaWxlIGlu
IHNlbGYuX2ZpbGVzOgorICAgICAgICAgICAgZmlsZS5kZWxldGUoKQorCisKK2NsYXNzIFRleHRU
ZXN0T3V0cHV0KFRlc3RPdXRwdXQpOgorICAgICIiIlJlcHJlc2VudHMgYSB0ZXh0IG91dHB1dCBv
ZiBhIHNpbmdsZSB0ZXN0IG9uIGEgc2luZ2xlIHBsYXRmb3JtIiIiCisgICAgZGVmIF9faW5pdF9f
KHNlbGYsIHBsYXRmb3JtLCB0ZXh0X2ZpbGUpOgorICAgICAgICBzZWxmLl90ZXh0X2ZpbGUgPSB0
ZXh0X2ZpbGUKKyAgICAgICAgVGVzdE91dHB1dC5fX2luaXRfXyhzZWxmLCBwbGF0Zm9ybSwgJ3Rl
eHQnLCBbdGV4dF9maWxlXSkKKworICAgIGRlZiBzYW1lX2NvbnRlbnQoc2VsZiwgb3RoZXIpOgor
ICAgICAgICByZXR1cm4gc2VsZi5fdGV4dF9maWxlLmNvbnRlbnRzKCkgPT0gb3RoZXIuX3RleHRf
ZmlsZS5jb250ZW50cygpCisKKyAgICBkZWYgcmV0YXJnZXQoc2VsZiwgcGxhdGZvcm0pOgorICAg
ICAgICByZXR1cm4gVGV4dFRlc3RPdXRwdXQocGxhdGZvcm0sIHNlbGYuX3RleHRfZmlsZSkKKwor
CitjbGFzcyBJbWFnZVRlc3RPdXRwdXQoVGVzdE91dHB1dCk6CisgICAgaW1hZ2VfZGlmZmVyID0g
TmFpdmVJbWFnZURpZmZlcigpCisgICAgIiIiUmVwcmVzZW50cyBhbiBpbWFnZSBvdXRwdXQgb2Yg
YSBzaW5nbGUgdGVzdCBvbiBhIHNpbmdsZSBwbGF0Zm9ybSIiIgorICAgIGRlZiBfX2luaXRfXyhz
ZWxmLCBwbGF0Zm9ybSwgaW1hZ2VfZmlsZSwgY2hlY2tzdW1fZmlsZSk6CisgICAgICAgIHNlbGYu
X2NoZWNrc3VtX2ZpbGUgPSBjaGVja3N1bV9maWxlCisgICAgICAgIHNlbGYuX2ltYWdlX2ZpbGUg
PSBpbWFnZV9maWxlCisgICAgICAgIGZpbGVzID0gZmlsdGVyKGJvb2wsIFtzZWxmLl9jaGVja3N1
bV9maWxlLCBzZWxmLl9pbWFnZV9maWxlXSkKKyAgICAgICAgVGVzdE91dHB1dC5fX2luaXRfXyhz
ZWxmLCBwbGF0Zm9ybSwgJ2ltYWdlJywgZmlsZXMpCisKKyAgICBkZWYgaGFzX2NoZWNrc3VtKHNl
bGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2hlY2tzdW1fZmlsZSBpcyBub3QgTm9uZQorCisg
ICAgZGVmIHNhbWVfY29udGVudChzZWxmLCBvdGhlcik6CisgICAgICAgICMgRklYTUUgVGhpcyBz
aG91bGQgbm90IGFzc3VtZSB0aGF0IGNoZWNrc3VtcyBhcmUgdXAgdG8gZGF0ZS4KKyAgICAgICAg
aWYgc2VsZi5oYXNfY2hlY2tzdW0oKSBhbmQgb3RoZXIuaGFzX2NoZWNrc3VtKCk6CisgICAgICAg
ICAgICByZXR1cm4gc2VsZi5fY2hlY2tzdW1fZmlsZS5jb250ZW50cygpID09IG90aGVyLl9jaGVj
a3N1bV9maWxlLmNvbnRlbnRzKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGZfY29u
dGVudHMgPSBzZWxmLl9pbWFnZV9maWxlLmNvbnRlbnRzKCkKKyAgICAgICAgICAgIG90aGVyX2Nv
bnRlbnRzID0gb3RoZXIuX2ltYWdlX2ZpbGUuY29udGVudHMoKQorICAgICAgICAgICAgcmV0dXJu
IEltYWdlVGVzdE91dHB1dC5pbWFnZV9kaWZmZXIuc2FtZV9pbWFnZShzZWxmX2NvbnRlbnRzLCBv
dGhlcl9jb250ZW50cykKKworICAgIGRlZiByZXRhcmdldChzZWxmLCBwbGF0Zm9ybSk6CisgICAg
ICAgIHJldHVybiBJbWFnZVRlc3RPdXRwdXQocGxhdGZvcm0sIHNlbGYuX2ltYWdlX2ZpbGUsIHNl
bGYuX2NoZWNrc3VtX2ZpbGUpCisKKyAgICBkZWYgY2hlY2tzdW0oc2VsZik6CisgICAgICAgIHJl
dHVybiBzZWxmLl9jaGVja3N1bV9maWxlLmNvbnRlbnRzKCkKZGlmZiAtLWdpdCBhL1Rvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0cHV0X3VuaXR0ZXN0LnB5IGIvVG9vbHMv
U2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Rlc3RvdXRwdXRfdW5pdHRlc3QucHkKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uZDE2YjlkOGRkMWJiYjA5YWJiMjBmZDIxNTA5YTk1NDc1OTM0MWU2NQotLS0gL2Rldi9u
dWxsCisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0cHV0X3Vu
aXR0ZXN0LnB5CkBAIC0wLDAgKzEsMTMzIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29w
eXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisjIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJV
VE9SUyAiQVMgSVMiIEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
CisjIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkKKyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOworIyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GCisjIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2ltcG9ydCByZQoraW1wb3J0IHRlc3RvdXRwdXQK
K2ltcG9ydCB1bml0dGVzdAorCisKK2NsYXNzIEZha2VGaWxlKG9iamVjdCk6CisgICAgZGVmIF9f
aW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBjb250ZW50cz0iZmFrZSBjb250ZW50cyIpOgorICAgICAg
ICBzZWxmLl9maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIHNlbGYuX2NvbnRlbnRzID0gY29u
dGVudHMKKworICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmlsZW5h
bWUKKworICAgIGRlZiBjb250ZW50cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbnRl
bnRzCisKKworY2xhc3MgRmFrZVRlc3RPdXRwdXQodGVzdG91dHB1dC5UZXN0T3V0cHV0KToKKyAg
ICBkZWYgX19pbml0X18oc2VsZiwgcGxhdGZvcm0sIG91dHB1dF90eXBlLCBjb250ZW50cywgaXNf
ZXhwZWN0ZWQ9RmFsc2UpOgorICAgICAgICBzZWxmLl9vdXRwdXRfdHlwZSA9IG91dHB1dF90eXBl
CisgICAgICAgIHNlbGYuX2NvbnRlbnRzID0gY29udGVudHMKKyAgICAgICAgc2VsZi5faXNfZXhw
ZWN0ZWQgPSBpc19leHBlY3RlZAorICAgICAgICBhY3R1YWwgPSAnYWN0dWFsJworICAgICAgICBp
ZiBpc19leHBlY3RlZDoKKyAgICAgICAgICAgIGFjdHVhbCA9ICdleHBlY3RlZCcKKyAgICAgICAg
dGVzdF9uYW1lID0gJ2Fub255bW91cy10ZXN0LSVzLnR4dCcgJSBhY3R1YWwKKyAgICAgICAgZmls
ZSA9IEZha2VGaWxlKHRlc3RfbmFtZSwgY29udGVudHMpCisgICAgICAgIHN1cGVyKEZha2VUZXN0
T3V0cHV0LCBzZWxmKS5fX2luaXRfXyhwbGF0Zm9ybSwgb3V0cHV0X3R5cGUsIFtmaWxlXSkKKwor
ICAgIGRlZiBjb250ZW50cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbnRlbnRzCisK
KyAgICBkZWYgcmV0YXJnZXQoc2VsZiwgcGxhdGZvcm0pOgorICAgICAgICByZXR1cm4gRmFrZVRl
c3RPdXRwdXQocGxhdGZvcm0sIHNlbGYuX291dHB1dF90eXBlLCBzZWxmLl9jb250ZW50cywgc2Vs
Zi5faXNfZXhwZWN0ZWQpCisKKworY2xhc3MgVGVzdE91dHB1dFRlc3QodW5pdHRlc3QuVGVzdENh
c2UpOgorICAgIGRlZiBfY2hlY2tfbmFtZShzZWxmLCBmaWxlbmFtZSwgZXhwZWN0ZWRfdGVzdF9u
YW1lKToKKyAgICAgICAgciA9IHRlc3RvdXRwdXQuVGV4dFRlc3RPdXRwdXQoTm9uZSwgRmFrZUZp
bGUoZmlsZW5hbWUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3RlZF90ZXN0X25h
bWUsIHIubmFtZSgpKQorCisgICAgZGVmIF9jaGVja19wbGF0Zm9ybShzZWxmLCBmaWxlbmFtZSwg
ZXhwZWN0ZWRfcGxhdGZvcm0pOgorICAgICAgICByID0gdGVzdG91dHB1dC5UZXh0VGVzdE91dHB1
dChOb25lLCBGYWtlRmlsZShmaWxlbmFtZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4
cGVjdGVkX3BsYXRmb3JtLCByLnBsYXRmb3JtKCkpCisKKyAgICBkZWYgdGVzdF9leHRyYWN0c19u
YW1lX2NvcnJlY3RseShzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tfbmFtZSgnTGF5b3V0VGVz
dHMvZmFzdC9kb20vYS1leHBlY3RlZC50eHQnLCAnZmFzdC9kb20vYScpCisgICAgICAgIHNlbGYu
X2NoZWNrX25hbWUoJ0xheW91dFRlc3RzL2Zhc3QvZG9tL2EtYWN0dWFsLnR4dCcsICdmYXN0L2Rv
bS9hJykKKyAgICAgICAgc2VsZi5fY2hlY2tfbmFtZSgnTGF5b3V0VGVzdHMvcGxhdGZvcm0vd2lu
L2Zhc3QvYS1leHBlY3RlZC50eHQnLCAnZmFzdC9hJykKKyAgICAgICAgc2VsZi5fY2hlY2tfbmFt
ZSgnTGF5b3V0VGVzdHMvcGxhdGZvcm0vd2luL2Zhc3QvYS1leHBlY3RlZC5jaGVja3N1bScsICdm
YXN0L2EnKQorICAgICAgICBzZWxmLl9jaGVja19uYW1lKCdmYXN0L2RvbS90ZXN0LWV4cGVjdGVk
LnR4dCcsICdmYXN0L2RvbS90ZXN0JykKKyAgICAgICAgc2VsZi5fY2hlY2tfbmFtZSgnbGF5b3V0
LXRlc3QtcmVzdWx0cy9mYXN0L2EtYWN0dWFsLmNoZWNrc3VtJywgJ2Zhc3QvYScpCisKKyAgICBk
ZWYgdGVzdF9leHRyYWN0c19wbGF0Zm9ybV9jb3JyZWN0bHkoc2VsZik6CisgICAgICAgIHNlbGYu
X2NoZWNrX3BsYXRmb3JtKCdMYXlvdXRUZXN0cy9wbGF0Zm9ybS93aW4vZmFzdC9hLWV4cGVjdGVk
LnR4dCcsICd3aW4nKQorICAgICAgICBzZWxmLl9jaGVja19wbGF0Zm9ybSgncGxhdGZvcm0vd2lu
L2Zhc3QvYS1leHBlY3RlZC50eHQnLCAnd2luJykKKyAgICAgICAgc2VsZi5fY2hlY2tfcGxhdGZv
cm0oJ3BsYXRmb3JtL21hYy9mYXN0L2EtZXhwZWN0ZWQudHh0JywgJ21hYycpCisgICAgICAgIHNl
bGYuX2NoZWNrX3BsYXRmb3JtKCdmYXN0L2EtZXhwZWN0ZWQudHh0JywgTm9uZSkKKworICAgIGRl
ZiB0ZXN0X291dHB1dHNfZnJvbV9hbl9hY3R1YWxfZmlsZV9hcmVfbWFya2VkX2FzX3N1Y2goc2Vs
Zik6CisgICAgICAgIHIgPSB0ZXN0b3V0cHV0LlRleHRUZXN0T3V0cHV0KE5vbmUsIEZha2VGaWxl
KCd0ZXN0LWFjdHVhbC50eHQnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHIuaXNfYWN0dWFs
KCkpCisKKyAgICBkZWYgdGVzdF9vdXRwdXRzX2Zyb21fYW5fZXhwZWN0ZWRfZmlsZV9hcmVfbm90
X2FjdHVhbChzZWxmKToKKyAgICAgICAgciA9IHRlc3RvdXRwdXQuVGV4dFRlc3RPdXRwdXQoTm9u
ZSwgRmFrZUZpbGUoJ3Rlc3QtZXhwZWN0ZWQudHh0JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFs
c2Uoci5pc19hY3R1YWwoKSkKKworICAgIGRlZiB0ZXN0X2lzX3JlYmFzZWxpbmVfb2Yoc2VsZik6
CisgICAgICAgIGV4cGVjdGVkID0gdGVzdG91dHB1dC5UZXh0VGVzdE91dHB1dCgnbWFjJywgRmFr
ZUZpbGUoJ3Rlc3QtZXhwZWN0ZWQudHh0JykpCisgICAgICAgIGFjdHVhbCA9IHRlc3RvdXRwdXQu
VGV4dFRlc3RPdXRwdXQoJ21hYycsIEZha2VGaWxlKCd0ZXN0LWFjdHVhbC50eHQnKSkKKyAgICAg
ICAgc2VsZi5hc3NlcnRUcnVlKGFjdHVhbC5pc19yZWJhc2VsaW5lX29mKGV4cGVjdGVkKSkKKyAg
ICAgICAgc2VsZi5hc3NlcnRGYWxzZShleHBlY3RlZC5pc19yZWJhc2VsaW5lX29mKGFjdHVhbCkp
CisKKyAgICBkZWYgdGVzdF9fZXFfXyhzZWxmKToKKyAgICAgICAgcjEgPSB0ZXN0b3V0cHV0LlRl
eHRUZXN0T3V0cHV0KCdtYWMnLCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC50eHQnLCAnY29udGVu
dHMnKSkKKyAgICAgICAgcjIgPSB0ZXN0b3V0cHV0LlRleHRUZXN0T3V0cHV0KCdtYWMnLCBGYWtl
RmlsZSgndGVzdC1leHBlY3RlZC50eHQnLCAnY29udGVudHMnKSkKKyAgICAgICAgcjMgPSB0ZXN0
b3V0cHV0LlRleHRUZXN0T3V0cHV0KCd3aW4nLCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC50eHQn
LCAnY29udGVudHMnKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyMSwgcjIpCisgICAg
ICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHIxLCByMi5yZXRhcmdldCgnbWFjJykpCisgICAgICAgIHNl
bGYuYXNzZXJ0Tm90RXF1YWxzKHIxLCByMi5yZXRhcmdldCgnd2luJykpCisKKyAgICBkZWYgdGVz
dF9faGFzaF9fKHNlbGYpOgorICAgICAgICByMSA9IHRlc3RvdXRwdXQuVGV4dFRlc3RPdXRwdXQo
J21hYycsIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnR4dCcsICdjb250ZW50cycpKQorICAgICAg
ICByMiA9IHRlc3RvdXRwdXQuVGV4dFRlc3RPdXRwdXQoJ21hYycsIEZha2VGaWxlKCd0ZXN0LWV4
cGVjdGVkLnR4dCcsICdjb250ZW50cycpKQorICAgICAgICByMyA9IHRlc3RvdXRwdXQuVGV4dFRl
c3RPdXRwdXQoTm9uZSwgRmFrZUZpbGUoJ3Rlc3QtZXhwZWN0ZWQudHh0JywgTm9uZSkpCisKKyAg
ICAgICAgeCA9IHNldChbcjEsIHIyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgbGVu
KHNldChbcjEsIHIyXSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygyLCBsZW4oc2V0KFty
MSwgcjIsIHIzXSkpKQorCisgICAgZGVmIHRlc3RfaW1hZ2VfZGlmZl9pc19pbnZva2VkX2Zvcl9p
bWFnZV9vdXRwdXRzX3dpdGhvdXRfY2hlY2tzdW0oc2VsZik6CisgICAgICAgIHIxID0gdGVzdG91
dHB1dC5JbWFnZVRlc3RPdXRwdXQoJ21hYycsIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnBuZycs
ICdhc2RmJyksIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLmNoZWNrc3VtJywgJ2NoZWNrJykpCisg
ICAgICAgIHIyID0gdGVzdG91dHB1dC5JbWFnZVRlc3RPdXRwdXQoJ21hYycsIEZha2VGaWxlKCd0
ZXN0LWV4cGVjdGVkLnBuZycsICdhc2RmJyksIE5vbmUpCisKKyAgICAgICAgIyBEZWZhdWx0IGJl
aGF2aW91ciBpcyB0byBqdXN0IGNvbXBhcmUgb24gaW1hZ2UgY29udGVudHMuCisgICAgICAgIHNl
bGYuYXNzZXJ0VHJ1ZShyMS5zYW1lX2NvbnRlbnQocjIpKQorCisgICAgICAgIGNsYXNzIEFsbElt
YWdlc0FyZURpZmZlcmVudChvYmplY3QpOgorICAgICAgICAgICAgZGVmIHNhbWVfaW1hZ2Uoc2Vs
ZiwgaW1hZ2UxLCBpbWFnZTIpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAg
ICAgICMgQnV0IHdlIGNhbiBpbnN0YWxsIG90aGVyIGltYWdlIGRpZmZlcnMuCisgICAgICAgIHRl
c3RvdXRwdXQuSW1hZ2VUZXN0T3V0cHV0LmltYWdlX2RpZmZlciA9IEFsbEltYWdlc0FyZURpZmZl
cmVudCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyMS5zYW1lX2NvbnRlbnQocjIpKQor
CitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0t
Z2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Rlc3RvdXRwdXRzZXQucHkg
Yi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dHNldC5weQpuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi5mOTQ3MjAwMTFjMmVmOWIxZDNiYmE4OWFlN2Q4MWFkYzI0ZmU2YjdkCi0tLSAvZGV2
L251bGwKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Rlc3RvdXRwdXRz
ZXQucHkKQEAgLTAsMCArMSwxMjkgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmln
aHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiAgUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIwor
IyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JT
ICJBUyBJUyIgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWQorIyBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7CisjIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorIyBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKworZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVtLmRpcmVj
dG9yeWZpbGVzZXQgaW1wb3J0IERpcmVjdG9yeUZpbGVTZXQKK2Zyb20gd2Via2l0cHkuY29tbW9u
LnN5c3RlbS56aXBmaWxlc2V0IGltcG9ydCBaaXBGaWxlU2V0CitpbXBvcnQgcmUKK2ltcG9ydCB0
ZXN0b3V0cHV0CitpbXBvcnQgdXJsbGliCisKKworY2xhc3MgVGVzdE91dHB1dFNldChvYmplY3Qp
OgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBwbGF0Zm9ybSwgemlwX2ZpbGUsICoqa3dh
cmdzKToKKyAgICAgICAgc2VsZi5fbmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5fcGxhdGZvcm0g
PSBwbGF0Zm9ybQorICAgICAgICBzZWxmLl96aXBfZmlsZSA9IHppcF9maWxlCisgICAgICAgIHNl
bGYuX2luY2x1ZGVfZXhwZWN0ZWQgPSBrd2FyZ3MuZ2V0KCdpbmNsdWRlX2V4cGVjdGVkJywgVHJ1
ZSkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmcm9tX3ppcF91cmwoY2xzLCBwbGF0Zm9y
bSwgemlwX3BhdGgpOgorICAgICAgICByZXR1cm4gVGVzdE91dHB1dFNldCgnbG9jYWwgemlwICVz
IGJ1aWxkZXInICUgcGxhdGZvcm0sIHBsYXRmb3JtLCBaaXBGaWxlU2V0KHppcF9wYXRoKSkKKwor
ICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmcm9tX3ppcChjbHMsIHBsYXRmb3JtLCB6aXApOgor
ICAgICAgICByZXR1cm4gVGVzdE91dHB1dFNldCgnbG9jYWwgemlwICVzIGJ1aWxkZXInICUgcGxh
dGZvcm0sIHBsYXRmb3JtLCB6aXApCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZnJvbV96
aXBfbWFwKGNscywgemlwX21hcCk6CisgICAgICAgIG91dHB1dF9zZXRzID0gW10KKyAgICAgICAg
Zm9yIGssIHYgaW4gemlwX21hcC5pdGVtcygpOgorICAgICAgICAgICAgb3V0cHV0X3NldHMuYXBw
ZW5kKFRlc3RPdXRwdXRTZXQuZnJvbV96aXAoaywgdikpCisgICAgICAgIHJldHVybiBBZ2dyZWdh
dGVUZXN0T3V0cHV0U2V0KG91dHB1dF9zZXRzKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVm
IGZyb21fcGF0aChzZWxmLCBwYXRoLCBwbGF0Zm9ybT1Ob25lKToKKyAgICAgICAgcmV0dXJuIFRl
c3RPdXRwdXRTZXQoJ2xvY2FsICVzIGJ1aWxkZXInICUgcGxhdGZvcm0sIHBsYXRmb3JtLCBEaXJl
Y3RvcnlGaWxlU2V0KHBhdGgpKQorCisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgIHJldHVy
biBzZWxmLl9uYW1lCisKKyAgICBkZWYgc2V0X3BsYXRmb3JtKHNlbGYsIHBsYXRmb3JtKToKKyAg
ICAgICAgc2VsZi5fcGxhdGZvcm0gPSBwbGF0Zm9ybQorCisgICAgZGVmIGZpbGVzKHNlbGYpOgor
ICAgICAgICByZXR1cm4gW3NlbGYuX3ppcF9maWxlLm9wZW4oZmlsZW5hbWUpIGZvciBmaWxlbmFt
ZSBpbiBzZWxmLl96aXBfZmlsZS5uYW1lbGlzdCgpXQorCisgICAgZGVmIF9leHRyYWN0X291dHB1
dF9maWxlcyhzZWxmLCBuYW1lLCBleGFjdF9tYXRjaCk6CisgICAgICAgIG5hbWVfbWF0Y2hlciA9
IHJlLmNvbXBpbGUobmFtZSkKKyAgICAgICAgYWN0dWFsX21hdGNoZXIgPSByZS5jb21waWxlKHIn
LWFjdHVhbFwuJykKKyAgICAgICAgZXhwZWN0ZWRfbWF0Y2hlciA9IHJlLmNvbXBpbGUocictZXhw
ZWN0ZWRcLicpCisKKyAgICAgICAgY2hlY2tzdW1fZmlsZXMgPSBbXQorICAgICAgICB0ZXh0X2Zp
bGVzID0gW10KKyAgICAgICAgaW1hZ2VfZmlsZXMgPSBbXQorICAgICAgICBmb3Igb3V0cHV0X2Zp
bGUgaW4gc2VsZi5maWxlcygpOgorICAgICAgICAgICAgbmFtZV9tYXRjaCA9IG5hbWVfbWF0Y2hl
ci5zZWFyY2gob3V0cHV0X2ZpbGUubmFtZSgpKQorICAgICAgICAgICAgYWN0dWFsX21hdGNoID0g
YWN0dWFsX21hdGNoZXIuc2VhcmNoKG91dHB1dF9maWxlLm5hbWUoKSkKKyAgICAgICAgICAgIGV4
cGVjdGVkX21hdGNoID0gZXhwZWN0ZWRfbWF0Y2hlci5zZWFyY2gob3V0cHV0X2ZpbGUubmFtZSgp
KQorICAgICAgICAgICAgaWYgbmFtZV9tYXRjaCBhbmQgKGFjdHVhbF9tYXRjaCBvciAoc2VsZi5f
aW5jbHVkZV9leHBlY3RlZCBhbmQgZXhwZWN0ZWRfbWF0Y2gpKToKKyAgICAgICAgICAgICAgICBp
ZiBvdXRwdXRfZmlsZS5uYW1lKCkuZW5kc3dpdGgoJy5jaGVja3N1bScpOgorICAgICAgICAgICAg
ICAgICAgICBjaGVja3N1bV9maWxlcy5hcHBlbmQob3V0cHV0X2ZpbGUpCisgICAgICAgICAgICAg
ICAgZWxpZiBvdXRwdXRfZmlsZS5uYW1lKCkuZW5kc3dpdGgoJy50eHQnKToKKyAgICAgICAgICAg
ICAgICAgICAgdGV4dF9maWxlcy5hcHBlbmQob3V0cHV0X2ZpbGUpCisgICAgICAgICAgICAgICAg
ZWxpZiBvdXRwdXRfZmlsZS5uYW1lKCkuZW5kc3dpdGgoJy5wbmcnKToKKyAgICAgICAgICAgICAg
ICAgICAgaW1hZ2VfZmlsZXMuYXBwZW5kKG91dHB1dF9maWxlKQorCisgICAgICAgIHJldHVybiAo
Y2hlY2tzdW1fZmlsZXMsIHRleHRfZmlsZXMsIGltYWdlX2ZpbGVzKQorCisgICAgZGVmIF9leHRy
YWN0X2ZpbGVfd2l0aF9uYW1lKHNlbGYsIG5hbWUsIGZpbGVzKToKKyAgICAgICAgZm9yIGZpbGUg
aW4gZmlsZXM6CisgICAgICAgICAgICBpZiBmaWxlLm5hbWUoKSA9PSBuYW1lOgorICAgICAgICAg
ICAgICAgIHJldHVybiBmaWxlCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgX21ha2Vf
b3V0cHV0X2Zyb21faW1hZ2Uoc2VsZiwgaW1hZ2VfZmlsZSwgY2hlY2tzdW1fZmlsZXMpOgorICAg
ICAgICBjaGVja3N1bV9maWxlX25hbWUgPSByZS5zdWIoJ1wucG5nJywgJy5jaGVja3N1bScsIGlt
YWdlX2ZpbGUubmFtZSgpKQorICAgICAgICBjaGVja3N1bV9maWxlID0gc2VsZi5fZXh0cmFjdF9m
aWxlX3dpdGhfbmFtZShjaGVja3N1bV9maWxlX25hbWUsIGNoZWNrc3VtX2ZpbGVzKQorICAgICAg
ICByZXR1cm4gdGVzdG91dHB1dC5JbWFnZVRlc3RPdXRwdXQoc2VsZi5fcGxhdGZvcm0sIGltYWdl
X2ZpbGUsIGNoZWNrc3VtX2ZpbGUpCisKKyAgICBkZWYgb3V0cHV0c19mb3Ioc2VsZiwgbmFtZSwg
Kiprd2FyZ3MpOgorICAgICAgICB0YXJnZXRfdHlwZSA9IGt3YXJncy5nZXQoJ3RhcmdldF90eXBl
JywgTm9uZSkKKyAgICAgICAgZXhhY3RfbWF0Y2ggPSBrd2FyZ3MuZ2V0KCdleGFjdF9tYXRjaCcs
IEZhbHNlKQorICAgICAgICBpZiByZS5zZWFyY2gocidcLng/aHRtbCcsIG5hbWUpOgorICAgICAg
ICAgICAgbmFtZSA9IG5hbWVbOm5hbWUucmluZGV4KCcuJyldCisKKyAgICAgICAgKGNoZWNrc3Vt
X2ZpbGVzLCB0ZXh0X2ZpbGVzLCBpbWFnZV9maWxlcykgPSBzZWxmLl9leHRyYWN0X291dHB1dF9m
aWxlcyhuYW1lLCBleGFjdF9tYXRjaCkKKworICAgICAgICBvdXRwdXRzID0gW3NlbGYuX21ha2Vf
b3V0cHV0X2Zyb21faW1hZ2UoaW1hZ2VfZmlsZSwgY2hlY2tzdW1fZmlsZXMpIGZvciBpbWFnZV9m
aWxlIGluIGltYWdlX2ZpbGVzXQorCisgICAgICAgIG91dHB1dHMgKz0gW3Rlc3RvdXRwdXQuVGV4
dFRlc3RPdXRwdXQoc2VsZi5fcGxhdGZvcm0sIHRleHRfZmlsZSkgZm9yIHRleHRfZmlsZSBpbiB0
ZXh0X2ZpbGVzXQorCisgICAgICAgIGlmIGV4YWN0X21hdGNoOgorICAgICAgICAgICAgb3V0cHV0
cyA9IGZpbHRlcihsYW1iZGEgb3V0cHV0OiBvdXRwdXQubmFtZSgpID09IG5hbWUsIG91dHB1dHMp
CisKKyAgICAgICAgb3V0cHV0cyA9IGZpbHRlcihsYW1iZGEgcjogdGFyZ2V0X3R5cGUgaW4gW05v
bmUsIHIudHlwZSgpXSwgb3V0cHV0cykKKworICAgICAgICByZXR1cm4gb3V0cHV0cworCisKK2Ns
YXNzIEFnZ3JlZ2F0ZVRlc3RPdXRwdXRTZXQob2JqZWN0KToKKyAgICAiIiJTZXQgb2YgdGVzdCBv
dXRwdXRzIGZyb20gYSBsaXN0IG9mIGJ1aWxkZXJzIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYs
IGJ1aWxkZXJzKToKKyAgICAgICAgc2VsZi5fYnVpbGRlcnMgPSBidWlsZGVycworCisgICAgZGVm
IG91dHB1dHNfZm9yKHNlbGYsIG5hbWUsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHN1bShb
YnVpbGRlci5vdXRwdXRzX2ZvcihuYW1lLCAqKmt3YXJncykgZm9yIGJ1aWxkZXIgaW4gc2VsZi5f
YnVpbGRlcnNdLCBbXSkKKworICAgIGRlZiBidWlsZGVycyhzZWxmKToKKyAgICAgICAgcmV0dXJu
IHNlbGYuX2J1aWxkZXJzCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1v
bi9uZXQvdGVzdG91dHB1dHNldF91bml0dGVzdC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkv
Y29tbW9uL25ldC90ZXN0b3V0cHV0c2V0X3VuaXR0ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmE3MGE1Mzll
ODhhMzAwODc1ZWVjNmRhNTY2ZDdmN2M0ZjA1YWJhODYKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29s
cy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dHNldF91bml0dGVzdC5weQpA
QCAtMCwwICsxLDEyNSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykg
MjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMg
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAg
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElT
IiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMg
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uemlwX21vY2sgaW1w
b3J0IE1vY2taaXAKK2ltcG9ydCB0ZXN0b3V0cHV0c2V0CitpbXBvcnQgdW5pdHRlc3QKKworCitj
bGFzcyBUZXN0T3V0cHV0U2V0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIF9vdXRw
dXRzZXRfd2l0aF96aXAoc2VsZiwgemlwLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiB0ZXN0
b3V0cHV0c2V0LlRlc3RPdXRwdXRTZXQoJzxmYWtlLW91dHB1dHNldD4nLCAnPGZha2UtcGxhdGZv
cm0+JywgemlwLCAqKmt3YXJncykKKworICAgIGRlZiB0ZXN0X3RleHRfZmlsZXNfZ2V0X2ludGVy
cHJldGVkX2FzX3RleHRfb3V0cHV0cyhzZWxmKToKKyAgICAgICAgemlwID0gTW9ja1ppcCgpCisg
ICAgICAgIHppcC5pbnNlcnQoJ2Zhc3QvZG9tL3NvbWUtdGVzdC1hY3R1YWwudHh0JywgJ2FjdHVh
bCBvdXRwdXRzJykKKyAgICAgICAgYiA9IHNlbGYuX291dHB1dHNldF93aXRoX3ppcCh6aXApCisg
ICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbihiLm91dHB1dHNfZm9yKCdmYXN0L2RvbS9z
b21lLXRlc3QnKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCdmYXN0L2RvbS9zb21lLXRl
c3QnLCBiLm91dHB1dHNfZm9yKCdmYXN0L2RvbS9zb21lLXRlc3QuaHRtbCcpWzBdLm5hbWUoKSkK
KworICAgIGRlZiB0ZXN0X2ltYWdlX2FuZF9jaGVja3N1bV9maWxlc19nZXRfaW50ZXJwcmV0ZWRf
YXNfYV9zaW5nbGVfaW1hZ2Vfb3V0cHV0KHNlbGYpOgorICAgICAgICB6aXAgPSBNb2NrWmlwKCkK
KyAgICAgICAgemlwLmluc2VydCgnZmFzdC9kb20vc29tZS10ZXN0LWFjdHVhbC5jaGVja3N1bScs
ICdhYmMxMjMnKQorICAgICAgICB6aXAuaW5zZXJ0KCdmYXN0L2RvbS9zb21lLXRlc3QtYWN0dWFs
LnBuZycsICc8aW1hZ2UgZGF0YT4nKQorICAgICAgICBiID0gc2VsZi5fb3V0cHV0c2V0X3dpdGhf
emlwKHppcCkKKyAgICAgICAgb3V0cHV0cyA9IGIub3V0cHV0c19mb3IoJ2Zhc3QvZG9tL3NvbWUt
dGVzdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbihvdXRwdXRzKSkKKyAgICAg
ICAgb3V0cHV0ID0gb3V0cHV0c1swXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnaW1hZ2Un
LCBvdXRwdXQudHlwZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnYWJjMTIzJywgb3V0
cHV0LmNoZWNrc3VtKCkpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBsZV9pbWFnZV9vdXRwdXRzX2Fy
ZV9kZXRlY3RlZChzZWxmKToKKyAgICAgICAgemlwID0gTW9ja1ppcCgpCisgICAgICAgIHppcC5p
bnNlcnQoJ3BsYXRmb3JtL3dpbi9mYXN0L2RvbS9zb21lLXRlc3QtYWN0dWFsLmNoZWNrc3VtJywg
J2NoZWNrc3VtMScpCisgICAgICAgIHppcC5pbnNlcnQoJ3BsYXRmb3JtL3dpbi9mYXN0L2RvbS9z
b21lLXRlc3QtYWN0dWFsLnBuZycsICc8aW1hZ2UgZGF0YSAxPicpCisgICAgICAgIHppcC5pbnNl
cnQoJ3BsYXRmb3JtL21hYy9mYXN0L2RvbS9zb21lLXRlc3QtYWN0dWFsLmNoZWNrc3VtJywgJ2No
ZWNrc3VtMicpCisgICAgICAgIHppcC5pbnNlcnQoJ3BsYXRmb3JtL21hYy9mYXN0L2RvbS9zb21l
LXRlc3QtYWN0dWFsLnBuZycsICc8aW1hZ2UgZGF0YSAyPicpCisgICAgICAgIGIgPSBzZWxmLl9v
dXRwdXRzZXRfd2l0aF96aXAoemlwKQorICAgICAgICBvdXRwdXRzID0gYi5vdXRwdXRzX2Zvcign
ZmFzdC9kb20vc29tZS10ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMiwgbGVuKG91
dHB1dHMpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG91dHB1dHNbMF0uc2FtZV9jb250ZW50
KG91dHB1dHNbMV0pKQorCisgICAgZGVmIHRlc3RfYWdncmVnYXRlX291dHB1dF9zZXRfY29ycmVj
dGx5X3JldHJpZXZlc190ZXN0c19mcm9tX211bHRpcGxlX291dHB1dF9zZXRzKHNlbGYpOgorICAg
ICAgICBvdXRwdXRzZXQxX3ppcCA9IE1vY2taaXAoKQorICAgICAgICBvdXRwdXRzZXQxX3ppcC5p
bnNlcnQoJ2Zhc3QvZG9tL3Rlc3QtYWN0dWFsLnR4dCcsICdsaW51eCB0ZXh0IG91dHB1dCcpCisg
ICAgICAgIG91dHB1dHNldDEgPSB0ZXN0b3V0cHV0c2V0LlRlc3RPdXRwdXRTZXQoJ2xpbnV4LW91
dHB1dHNldCcsICdsaW51eCcsIG91dHB1dHNldDFfemlwKQorICAgICAgICBvdXRwdXRzZXQyX3pp
cCA9IE1vY2taaXAoKQorICAgICAgICBvdXRwdXRzZXQyX3ppcC5pbnNlcnQoJ2Zhc3QvZG9tL3Rl
c3QtYWN0dWFsLnR4dCcsICd3aW5kb3dzIHRleHQgb3V0cHV0JykKKyAgICAgICAgb3V0cHV0c2V0
MiA9IHRlc3RvdXRwdXRzZXQuVGVzdE91dHB1dFNldCgnd2luLW91dHB1dHNldCcsICd3aW4nLCBv
dXRwdXRzZXQyX3ppcCkKKworICAgICAgICBiID0gdGVzdG91dHB1dHNldC5BZ2dyZWdhdGVUZXN0
T3V0cHV0U2V0KFtvdXRwdXRzZXQxLCBvdXRwdXRzZXQyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRF
cXVhbHMoMiwgbGVuKGIub3V0cHV0c19mb3IoJ2Zhc3QvZG9tL3Rlc3QnKSkpCisKKyAgICBkZWYg
dGVzdF9jYW5faW5mZXJfcGxhdGZvcm1fZnJvbV9wYXRoX2lmX25vbmVfcHJvdmlkZWQoc2VsZik6
CisgICAgICAgIHppcCA9IE1vY2taaXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCdwbGF0Zm9ybS93
aW4vc29tZS10ZXN0LWV4cGVjdGVkLnBuZycsICc8aW1hZ2UgZGF0YT4nKQorICAgICAgICB6aXAu
aW5zZXJ0KCdwbGF0Zm9ybS93aW4vc29tZS10ZXN0LWV4cGVjdGVkLmNoZWNrc3VtJywgJ2FiYzEy
MycpCisgICAgICAgIGIgPSB0ZXN0b3V0cHV0c2V0LlRlc3RPdXRwdXRTZXQoJ2xvY2FsIExheW91
dFRlc3RzIG91dHB1dHNldCcsIE5vbmUsIHppcCkKKworICAgICAgICBvdXRwdXRzID0gYi5vdXRw
dXRzX2Zvcignc29tZS10ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgbGVuKG91
dHB1dHMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnd2luJywgb3V0cHV0c1swXS5wbGF0
Zm9ybSgpKQorCisgICAgZGVmIHRlc3RfdGVzdF9leHRlbnNpb25faXNfaWdub3JlZChzZWxmKToK
KyAgICAgICAgemlwID0gTW9ja1ppcCgpCisgICAgICAgIHppcC5pbnNlcnQoJ3Rlc3QvdGVzdC1h
LWFjdHVhbC50eHQnLCAnYWN0dWFsIG91dHB1dHMnKQorICAgICAgICBiID0gc2VsZi5fb3V0cHV0
c2V0X3dpdGhfemlwKHppcCkKKyAgICAgICAgb3V0cHV0cyA9IGIub3V0cHV0c19mb3IoJ3Rlc3Qv
dGVzdC1hLmh0bWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4ob3V0cHV0cykp
CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCd0ZXN0L3Rlc3QtYScsIG91dHB1dHNbMF0ubmFt
ZSgpKQorCisgICAgZGVmIHRlc3RfZXhpc3Rpbmdfb3V0cHV0c19hcmVfbWFya2VkX2FzX3N1Y2go
c2VsZik6CisgICAgICAgIHppcCA9IE1vY2taaXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCd0ZXN0
L3Rlc3QtYS1leHBlY3RlZC50eHQnLCAnZXhwZWN0ZWQgb3V0cHV0cycpCisgICAgICAgIGIgPSBz
ZWxmLl9vdXRwdXRzZXRfd2l0aF96aXAoemlwKQorICAgICAgICBvdXRwdXRzID0gYi5vdXRwdXRz
X2ZvcigndGVzdC90ZXN0LWEuaHRtbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxl
bihvdXRwdXRzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvdXRwdXRzWzBdLmlzX2FjdHVh
bCgpKQorCisgICAgZGVmIHRlc3Rfb25seV9yZXR1cm5zX291dHB1dHNfb2Zfc3BlY2lmaWVkX3R5
cGUoc2VsZik6CisgICAgICAgIHppcCA9IE1vY2taaXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCd0
ZXN0L3Rlc3QtYS1leHBlY3RlZC50eHQnLCAnZXhwZWN0ZWQgb3V0cHV0cycpCisgICAgICAgIHpp
cC5pbnNlcnQoJ3Rlc3QvdGVzdC1hLWV4cGVjdGVkLmNoZWNrc3VtJywgJ2V4cGVjdGVkIG91dHB1
dHMnKQorICAgICAgICB6aXAuaW5zZXJ0KCd0ZXN0L3Rlc3QtYS1leHBlY3RlZC5wbmcnLCAnZXhw
ZWN0ZWQgb3V0cHV0cycpCisgICAgICAgIGIgPSBzZWxmLl9vdXRwdXRzZXRfd2l0aF96aXAoemlw
KQorCisgICAgICAgIG91dHB1dHMgPSBiLm91dHB1dHNfZm9yKCd0ZXN0L3Rlc3QtYS5odG1sJykK
KyAgICAgICAgdGV4dF9vdXRwdXRzID0gYi5vdXRwdXRzX2ZvcigndGVzdC90ZXN0LWEuaHRtbCcs
IHRhcmdldF90eXBlPSd0ZXh0JykKKyAgICAgICAgaW1hZ2Vfb3V0cHV0cyA9IGIub3V0cHV0c19m
b3IoJ3Rlc3QvdGVzdC1hLmh0bWwnLCB0YXJnZXRfdHlwZT0naW1hZ2UnKQorCisgICAgICAgIHNl
bGYuYXNzZXJ0RXF1YWxzKDIsIGxlbihvdXRwdXRzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVh
bHMoMSwgbGVuKHRleHRfb3V0cHV0cykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxl
bihpbWFnZV9vdXRwdXRzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ3RleHQnLCB0ZXh0
X291dHB1dHNbMF0udHlwZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnaW1hZ2UnLCBp
bWFnZV9vdXRwdXRzWzBdLnR5cGUoKSkKKworICAgIGRlZiB0ZXN0X2V4Y2x1ZGVfZXhwZWN0ZWRf
b3V0cHV0c193b3JrcyhzZWxmKToKKyAgICAgICAgemlwID0gTW9ja1ppcCgpCisgICAgICAgIHpp
cC5pbnNlcnQoJ3Rlc3QtZXhwZWN0ZWQudHh0JywgICdleHBlY3RlZCBvdXRwdXRzIHN0b3JlZCBv
biBzZXJ2ZXIgZm9yIHNvbWUgcmVhc29uJykKKyAgICAgICAgYiA9IHNlbGYuX291dHB1dHNldF93
aXRoX3ppcCh6aXAsIGluY2x1ZGVfZXhwZWN0ZWQ9RmFsc2UpCisgICAgICAgIG91dHB1dHMgPSBi
Lm91dHB1dHNfZm9yKCd0ZXN0JywgdGFyZ2V0X3R5cGU9Tm9uZSkKKyAgICAgICAgc2VsZi5hc3Nl
cnRFcXVhbHMoMCwgbGVuKG91dHB1dHMpKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgor
ICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9j
b21tb24vc3lzdGVtL3ppcF9tb2NrLnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24v
c3lzdGVtL3ppcF9tb2NrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmRjZmFiYTcwZDA4YmI3YTZkMTk3ZGU1YmY4
OTIzZTcwMzkwZTljMGUKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5
L2NvbW1vbi9zeXN0ZW0vemlwX21vY2sucHkKQEAgLTAsMCArMSw1NSBAQAorIyBDb3B5cmlnaHQg
KEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMg
Mi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJB
UyBJUyIgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWQorIyBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
CisjIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORAorIyBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKworZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVtLmZpbGVzZXQg
aW1wb3J0IEZpbGVTZXRGaWxlSGFuZGxlCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZmls
ZXN5c3RlbV9tb2NrIGltcG9ydCBNb2NrRmlsZVN5c3RlbQorCisKK2NsYXNzIE1vY2taaXAob2Jq
ZWN0KToKKyAgICAiIiJBIG1vY2sgemlwIGZpbGUgdGhhdCBjYW4gaGF2ZSBuZXcgZmlsZXMgaW5z
ZXJ0ZWQgaW50byBpdC4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZXN5c3RlbT1Ob25l
KToKKyAgICAgICAgc2VsZi5fZmlsZXN5c3RlbSA9IGZpbGVzeXN0ZW0gb3IgTW9ja0ZpbGVTeXN0
ZW0oKQorICAgICAgICBzZWxmLl9maWxlcyA9IHt9CisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToK
KyAgICAgICAgcmV0dXJuICJNb2NrWmlwIgorCisgICAgZGVmIGluc2VydChzZWxmLCBmaWxlbmFt
ZSwgY29udGVudCk6CisgICAgICAgIHNlbGYuX2ZpbGVzW2ZpbGVuYW1lXSA9IGNvbnRlbnQKKwor
ICAgIGRlZiBuYW1lbGlzdChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGVzLmtleXMo
KQorCisgICAgZGVmIG9wZW4oc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICByZXR1cm4gRmlsZVNl
dEZpbGVIYW5kbGUoc2VsZiwgZmlsZW5hbWUpCisKKyAgICBkZWYgcmVhZChzZWxmLCBmaWxlbmFt
ZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlc1tmaWxlbmFtZV0KKworICAgIGRlZiBleHRy
YWN0KHNlbGYsIGZpbGVuYW1lLCBwYXRoKToKKyAgICAgICAgZnVsbF9wYXRoID0gc2VsZi5fZmls
ZXN5c3RlbS5qb2luKHBhdGgsIGZpbGVuYW1lKQorICAgICAgICBjb250ZW50cyA9IHNlbGYub3Bl
bihmaWxlbmFtZSkuY29udGVudHMoKQorICAgICAgICBzZWxmLl9maWxlc3lzdGVtLndyaXRlX3Rl
eHRfZmlsZShmdWxsX3BhdGgsIGNvbnRlbnRzKQorCisgICAgZGVmIGRlbGV0ZShzZWxmLCBmaWxl
bmFtZSk6CisgICAgICAgIHNlbGYuX2ZpbGVzW2ZpbGVuYW1lXSA9IE5vbmUK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>81183</attachid>
            <date>2011-02-03 20:52:50 -0800</date>
            <delta_ts>2011-02-03 20:55:47 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-52136-20110204155248.patch</filename>
            <type>text/plain</type>
            <size>30238</size>
            <attacher name="James Kozianski">koz</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rvb2xzL0NoYW5nZUxvZwppbmRleCBkZmZi
MzBhZmNlZTZkZDhiZWZhOTdhNmViMWU4ZmZiYWIyZTgyYzRhLi44MTM5MmU5Y2RlOTYxYTRkODhh
MDE3YTYxYjFmODU0NjNiMGZlMmE1IDEwMDY0NAotLS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIv
VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjIgQEAKKzIwMTEtMDItMDMgIEphbWVzIEtvemlh
bnNraSAgPGtvekBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgQWRkIGNsYXNzZXMgZm9yIHJlcHJlc2VudGluZyB0ZXN0IG91dHB1
dHMuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01MjEz
NgorCisgICAgICAgIFRoZXNlIGNsYXNzZXMgd2lsbCBtYWtlIGl0IGVhc2llciB0byB3cml0ZSBz
Y3JpcHRzIHRoYXQgZGVhbCB3aXRoIHRlc3QKKyAgICAgICAgb3V0cHV0cyBzdWNoIGFzIHJlYmFz
ZWxpbmluZyBhbmQgZGVkdXBpbmcgc2NyaXB0cy4gVGhlIGludGVudCBpcyB0aGF0CisgICAgICAg
IGV2ZW50dWFsbHkgd2Ugd2lsbCBiZSBoYXZlIGJ1aWxkYm90IHJldHVybiBUZXN0T3V0cHV0cyBm
b3IgYQorICAgICAgICBwYXJ0aWN1bGFyIGJ1aWxkIHdoaWNoIGNhbiBiZSBjb21wYXJlZCB3aXRo
IFRlc3RPdXRwdXRzIGRlcml2ZWQgZnJvbSBhCisgICAgICAgIGxvY2FsIExheW91dFRlc3RzIGRp
cmVjdG9yeS4KKworICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0
cHV0LnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVz
dG91dHB1dF91bml0dGVzdC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9j
b21tb24vbmV0L3Rlc3RvdXRwdXRzZXQucHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Vi
a2l0cHkvY29tbW9uL25ldC90ZXN0b3V0cHV0c2V0X3VuaXR0ZXN0LnB5OiBBZGRlZC4KKyAgICAg
ICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vemlwX21vY2sucHk6IEFkZGVkLgor
CiAyMDExLTAyLTAzICBBZGFtIFJvYmVuICA8YXJvYmVuQGFwcGxlLmNvbT4KIAogICAgICAgICBB
ZGQgbGlua3MgdG8gV2luZG93cyBjcmFzaCBsb2dzIGluIHJlc3VsdHMuaHRtbApkaWZmIC0tZ2l0
IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Rlc3RvdXRwdXQucHkgYi9Ub29s
cy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dC5weQpuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi41
M2JjYzQ3YzY2NWJjODY4YTNiZDk3MDYzMmI0OWVkMzMyYjg3NTFmCi0tLSAvZGV2L251bGwKKysr
IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Rlc3RvdXRwdXQucHkKQEAgLTAs
MCArMSwxNzkgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTAg
R29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworIyBhcmUgbWV0OgorIworIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5E
IEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWQorIyBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisjIExPU1Mg
T0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORAorIyBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyMg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKworaW1wb3J0IG9zCitpbXBvcnQgcmUKKworCitjbGFzcyBOYWl2ZUltYWdlRGlm
ZmVyKG9iamVjdCk6CisgICAgZGVmIHNhbWVfaW1hZ2Uoc2VsZiwgaW1nMSwgaW1nMik6CisgICAg
ICAgIHJldHVybiBpbWcxID09IGltZzIKKworCitjbGFzcyBUZXN0T3V0cHV0KG9iamVjdCk6Cisg
ICAgIiIiUmVwcmVzZW50cyB0aGUgb3V0cHV0IHRoYXQgYSBzaW5nbGUgbGF5b3V0IHRlc3QgZ2Vu
ZXJhdGVzIHdoZW4gaXQgaXMgcnVuCisgICAgb24gYSBwYXJ0aWN1bGFyIHBsYXRmb3JtLgorICAg
IE5vdGUgdGhhdCB0aGlzIGlzIHRoZSByYXcgb3V0cHV0IHRoYXQgaXMgcHJvZHVjZWQgd2hlbiB0
aGUgbGF5b3V0IHRlc3QgaXMKKyAgICBydW4sIG5vdCB0aGUgcmVzdWx0cyBvZiB0aGUgc3Vic2Vx
dWVudCBjb21wYXJpc29uIGJldHdlZW4gdGhhdCBvdXRwdXQgYW5kCisgICAgdGhlIGV4cGVjdGVk
IG91dHB1dC4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGxhdGZvcm0sIG91dHB1dF90eXBl
LCBmaWxlcyk6CisgICAgICAgIHNlbGYuX291dHB1dF90eXBlID0gb3V0cHV0X3R5cGUKKyAgICAg
ICAgc2VsZi5fZmlsZXMgPSBmaWxlcworICAgICAgICBmaWxlID0gZmlsZXNbMF0gICMgUGljayBz
b21lIGZpbGUgdG8gZG8gdGVzdCBuYW1lIGNhbGN1bGF0aW9uLgorICAgICAgICBzZWxmLl9uYW1l
ID0gc2VsZi5fZXh0cmFjdF90ZXN0X25hbWUoZmlsZS5uYW1lKCkpCisgICAgICAgIHNlbGYuX2lz
X2FjdHVhbCA9ICctYWN0dWFsLicgaW4gZmlsZS5uYW1lKCkKKworICAgICAgICBzZWxmLl9wbGF0
Zm9ybSA9IHBsYXRmb3JtIG9yIHNlbGYuX2V4dHJhY3RfcGxhdGZvcm0oZmlsZS5uYW1lKCkpCisK
KyAgICBkZWYgX2V4dHJhY3RfcGxhdGZvcm0oc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICAiIiJD
YWxjdWxhdGVzIHRoZSBwbGF0Zm9ybSBmcm9tIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGlmIGl0IGlz
bid0IGtub3duIGFscmVhZHkiIiIKKyAgICAgICAgcGF0aCA9IHJlLnNwbGl0KG9zLnBhdGguc2Vw
LCBmaWxlbmFtZSkKKyAgICAgICAgaWYgJ3BsYXRmb3JtJyBpbiBwYXRoOgorICAgICAgICAgICAg
cmV0dXJuIHBhdGhbcGF0aC5pbmRleCgncGxhdGZvcm0nKSArIDFdCisgICAgICAgIHJldHVybiBO
b25lCisKKyAgICBkZWYgX2V4dHJhY3RfdGVzdF9uYW1lKHNlbGYsIGZpbGVuYW1lKToKKyAgICAg
ICAgcGF0aCA9IHJlLnNwbGl0KG9zLnBhdGguc2VwLCBmaWxlbmFtZSkKKyAgICAgICAgaWYgJ0xh
eW91dFRlc3RzJyBpbiBwYXRoOgorICAgICAgICAgICAgcGF0aCA9IHBhdGhbMSArIHBhdGguaW5k
ZXgoJ0xheW91dFRlc3RzJyk6XQorICAgICAgICBpZiAnbGF5b3V0LXRlc3QtcmVzdWx0cycgaW4g
cGF0aDoKKyAgICAgICAgICAgIHBhdGggPSBwYXRoWzEgKyBwYXRoLmluZGV4KCdsYXlvdXQtdGVz
dC1yZXN1bHRzJyk6XQorICAgICAgICBpZiAncGxhdGZvcm0nIGluIHBhdGg6CisgICAgICAgICAg
ICBwYXRoID0gcGF0aFsyICsgcGF0aC5pbmRleCgncGxhdGZvcm0nKTpdCisKKyAgICAgICAgZmls
ZW5hbWUgPSBwYXRoWy0xXQorICAgICAgICBmaWxlbmFtZSA9IHJlLnN1YignLWV4cGVjdGVkXC4u
KiQnLCAnJywgZmlsZW5hbWUpCisgICAgICAgIGZpbGVuYW1lID0gcmUuc3ViKCctYWN0dWFsXC4u
KiQnLCAnJywgZmlsZW5hbWUpCisgICAgICAgIHBhdGhbLTFdID0gZmlsZW5hbWUKKyAgICAgICAg
cmV0dXJuIG9zLnBhdGguc2VwLmpvaW4ocGF0aCkKKworICAgIGRlZiBzYXZlX3RvKHNlbGYsIHBh
dGgpOgorICAgICAgICAiIiJIYXZlIHRoZSBmaWxlcyBpbiB0aGlzIFRlc3RPdXRwdXQgd3JpdGUg
dGhlbXNlbHZlcyB0byB0aGUgZGlzayBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLiIiIgorICAg
ICAgICBmb3IgZmlsZSBpbiBzZWxmLl9maWxlczoKKyAgICAgICAgICAgIGZpbGUuc2F2ZV90byhw
YXRoKQorCisgICAgZGVmIGlzX2FjdHVhbChzZWxmKToKKyAgICAgICAgIiIiSXMgdGhpcyBvdXRw
dXQgdGhlIGFjdHVhbCBvdXRwdXQgb2YgYSB0ZXN0PyAoQXMgb3Bwb3NlZCB0byBleHBlY3RlZCBv
dXRwdXQuKSIiIgorICAgICAgICByZXR1cm4gc2VsZi5faXNfYWN0dWFsCisKKyAgICBkZWYgbmFt
ZShzZWxmKToKKyAgICAgICAgIiIiVGhlIG5hbWUgb2YgdGhpcyB0ZXN0IChkb2Vzbid0IGluY2x1
ZGUgZXh0ZW5zaW9uKSIiIgorICAgICAgICByZXR1cm4gc2VsZi5fbmFtZQorCisgICAgZGVmIF9f
ZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiAob3RoZXIgIT0gTm9uZSBhbmQKKyAg
ICAgICAgICAgICAgICBzZWxmLm5hbWUoKSA9PSBvdGhlci5uYW1lKCkgYW5kCisgICAgICAgICAg
ICAgICAgc2VsZi50eXBlKCkgPT0gb3RoZXIudHlwZSgpIGFuZAorICAgICAgICAgICAgICAgIHNl
bGYucGxhdGZvcm0oKSA9PSBvdGhlci5wbGF0Zm9ybSgpIGFuZAorICAgICAgICAgICAgICAgIHNl
bGYuaXNfYWN0dWFsKCkgPT0gb3RoZXIuaXNfYWN0dWFsKCkgYW5kCisgICAgICAgICAgICAgICAg
c2VsZi5zYW1lX2NvbnRlbnQob3RoZXIpKQorCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAg
ICAgICByZXR1cm4gaGFzaChzdHIoc2VsZi5uYW1lKCkpICsgc3RyKHNlbGYudHlwZSgpKSArIHN0
cihzZWxmLnBsYXRmb3JtKCkpKQorCisgICAgZGVmIGlzX25ld19yZWJhc2VsaW5lX2ZvcihzZWxm
LCBvdGhlcik6CisgICAgICAgIHJldHVybiAoc2VsZi5uYW1lKCkgPT0gb3RoZXIubmFtZSgpIGFu
ZAorICAgICAgICAgICAgICAgIHNlbGYudHlwZSgpID09IG90aGVyLnR5cGUoKSBhbmQKKyAgICAg
ICAgICAgICAgICBzZWxmLnBsYXRmb3JtKCkgPT0gb3RoZXIucGxhdGZvcm0oKSBhbmQKKyAgICAg
ICAgICAgICAgICBzZWxmLmlzX2FjdHVhbCgpIGFuZAorICAgICAgICAgICAgICAgIChub3Qgb3Ro
ZXIuaXNfYWN0dWFsKCkpKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIGFjdHVh
bF9zdHIgPSAnW0FdICcgaWYgc2VsZi5pc19hY3R1YWwoKSBlbHNlICcnCisgICAgICAgIHJldHVy
biAiVGVzdE91dHB1dFslcy8lc10gJXMlcyIgJSAoc2VsZi5fcGxhdGZvcm0sIHNlbGYuX291dHB1
dF90eXBlLCBhY3R1YWxfc3RyLCBzZWxmLm5hbWUoKSkKKworICAgIGRlZiB0eXBlKHNlbGYpOgor
ICAgICAgICByZXR1cm4gc2VsZi5fb3V0cHV0X3R5cGUKKworICAgIGRlZiBwbGF0Zm9ybShzZWxm
KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3BsYXRmb3JtCisKKyAgICBkZWYgX3BhdGhfdG9fcGxh
dGZvcm0oc2VsZik6CisgICAgICAgICIiIlJldHVybnMgdGhlIHBhdGggdGhhdCB0ZXN0cyBmb3Ig
dGhpcyBwbGF0Zm9ybSBhcmUgc3RvcmVkIGluLiIiIgorICAgICAgICBpZiBzZWxmLl9wbGF0Zm9y
bSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuICIiCisgICAgICAgIGVsc2U6CisgICAgICAg
ICAgICByZXR1cm4gb3MucGF0aC5qb2luKCJzZWxmLl9wbGF0Zm9ybSIsIHNlbGYuX3BsYXRmb3Jt
KQorCisgICAgZGVmIF9zYXZlX2V4cGVjdGVkX3Jlc3VsdChzZWxmLCBmaWxlLCBwYXRoKToKKyAg
ICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBzZWxmLl9wYXRoX3RvX3BsYXRmb3JtKCkp
CisgICAgICAgIGV4dGVuc2lvbiA9IG9zLnBhdGguc3BsaXRleHQoZmlsZS5uYW1lKCkpWzFdCisg
ICAgICAgIGZpbGVuYW1lID0gc2VsZi5uYW1lKCkgKyAnLWV4cGVjdGVkJyArIGV4dGVuc2lvbgor
ICAgICAgICBmaWxlLnNhdmVfdG8ocGF0aCwgZmlsZW5hbWUpCisKKyAgICBkZWYgc2F2ZV9leHBl
Y3RlZF9yZXN1bHRzKHNlbGYsIHBhdGhfdG9fbGF5b3V0X3Rlc3RzKToKKyAgICAgICAgIiIiU2F2
ZSB0aGUgZmlsZXMgb2YgdGhpcyBUZXN0T3V0cHV0IHRvIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3Rv
cnkKKyAgICAgICAgaW5zaWRlIHRoZSBMYXlvdXRUZXN0cyBkaXJlY3RvcnkuIFR5cGljYWxseSB0
aGlzIG1lYW5zIHRoYXQgdGhlc2UgZmlsZXMKKyAgICAgICAgd2lsbCBiZSBzYXZlZCBpbiAiTGF5
b3V0VGVzdHMvcGxhdGZvcm0vPHBsYXRmb3JtPi8sIG9yIHNpbXBseQorICAgICAgICBMYXlvdXRU
ZXN0cyBpZiB0aGUgcGxhdGZvcm0gaXMgTm9uZS4iIiIKKyAgICAgICAgZm9yIGZpbGUgaW4gc2Vs
Zi5fZmlsZXM6CisgICAgICAgICAgICBzZWxmLl9zYXZlX2V4cGVjdGVkX3Jlc3VsdChmaWxlLCBw
YXRoX3RvX2xheW91dF90ZXN0cykKKworICAgIGRlZiBkZWxldGUoc2VsZik6CisgICAgICAgICIi
IkRlbGV0ZXMgdGhlIGZpbGVzIHRoYXQgY29tcHJpc2UgdGhpcyBUZXN0T3V0cHV0IGZyb20gZGlz
ay4gVGhpcworICAgICAgICBmYWlscyBpZiB0aGUgZmlsZXMgYXJlIHZpcnR1YWwgZmlsZXMgKGVn
OiB0aGUgZmlsZXMgbWF5IHJlc2lkZSBpbnNpZGUgYQorICAgICAgICByZW1vdGUgemlwIGZpbGUp
LiIiIgorICAgICAgICBmb3IgZmlsZSBpbiBzZWxmLl9maWxlczoKKyAgICAgICAgICAgIGZpbGUu
ZGVsZXRlKCkKKworCitjbGFzcyBUZXh0VGVzdE91dHB1dChUZXN0T3V0cHV0KToKKyAgICAiIiJS
ZXByZXNlbnRzIGEgdGV4dCBvdXRwdXQgb2YgYSBzaW5nbGUgdGVzdCBvbiBhIHNpbmdsZSBwbGF0
Zm9ybSIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwbGF0Zm9ybSwgdGV4dF9maWxlKToKKyAg
ICAgICAgc2VsZi5fdGV4dF9maWxlID0gdGV4dF9maWxlCisgICAgICAgIFRlc3RPdXRwdXQuX19p
bml0X18oc2VsZiwgcGxhdGZvcm0sICd0ZXh0JywgW3RleHRfZmlsZV0pCisKKyAgICBkZWYgc2Ft
ZV9jb250ZW50KHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3RleHRfZmlsZS5j
b250ZW50cygpID09IG90aGVyLl90ZXh0X2ZpbGUuY29udGVudHMoKQorCisgICAgZGVmIHJldGFy
Z2V0KHNlbGYsIHBsYXRmb3JtKToKKyAgICAgICAgcmV0dXJuIFRleHRUZXN0T3V0cHV0KHBsYXRm
b3JtLCBzZWxmLl90ZXh0X2ZpbGUpCisKKworY2xhc3MgSW1hZ2VUZXN0T3V0cHV0KFRlc3RPdXRw
dXQpOgorICAgIGltYWdlX2RpZmZlciA9IE5haXZlSW1hZ2VEaWZmZXIoKQorICAgICIiIlJlcHJl
c2VudHMgYW4gaW1hZ2Ugb3V0cHV0IG9mIGEgc2luZ2xlIHRlc3Qgb24gYSBzaW5nbGUgcGxhdGZv
cm0iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGxhdGZvcm0sIGltYWdlX2ZpbGUsIGNoZWNr
c3VtX2ZpbGUpOgorICAgICAgICBzZWxmLl9jaGVja3N1bV9maWxlID0gY2hlY2tzdW1fZmlsZQor
ICAgICAgICBzZWxmLl9pbWFnZV9maWxlID0gaW1hZ2VfZmlsZQorICAgICAgICBmaWxlcyA9IGZp
bHRlcihib29sLCBbc2VsZi5fY2hlY2tzdW1fZmlsZSwgc2VsZi5faW1hZ2VfZmlsZV0pCisgICAg
ICAgIFRlc3RPdXRwdXQuX19pbml0X18oc2VsZiwgcGxhdGZvcm0sICdpbWFnZScsIGZpbGVzKQor
CisgICAgZGVmIGhhc19jaGVja3N1bShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NoZWNr
c3VtX2ZpbGUgaXMgbm90IE5vbmUKKworICAgIGRlZiBzYW1lX2NvbnRlbnQoc2VsZiwgb3RoZXIp
OgorICAgICAgICAjIEZJWE1FIFRoaXMgc2hvdWxkIG5vdCBhc3N1bWUgdGhhdCBjaGVja3N1bXMg
YXJlIHVwIHRvIGRhdGUuCisgICAgICAgIGlmIHNlbGYuaGFzX2NoZWNrc3VtKCkgYW5kIG90aGVy
Lmhhc19jaGVja3N1bSgpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NoZWNrc3VtX2ZpbGUu
Y29udGVudHMoKSA9PSBvdGhlci5fY2hlY2tzdW1fZmlsZS5jb250ZW50cygpCisgICAgICAgIGVs
c2U6CisgICAgICAgICAgICBzZWxmX2NvbnRlbnRzID0gc2VsZi5faW1hZ2VfZmlsZS5jb250ZW50
cygpCisgICAgICAgICAgICBvdGhlcl9jb250ZW50cyA9IG90aGVyLl9pbWFnZV9maWxlLmNvbnRl
bnRzKCkKKyAgICAgICAgICAgIHJldHVybiBJbWFnZVRlc3RPdXRwdXQuaW1hZ2VfZGlmZmVyLnNh
bWVfaW1hZ2Uoc2VsZl9jb250ZW50cywgb3RoZXJfY29udGVudHMpCisKKyAgICBkZWYgcmV0YXJn
ZXQoc2VsZiwgcGxhdGZvcm0pOgorICAgICAgICByZXR1cm4gSW1hZ2VUZXN0T3V0cHV0KHBsYXRm
b3JtLCBzZWxmLl9pbWFnZV9maWxlLCBzZWxmLl9jaGVja3N1bV9maWxlKQorCisgICAgZGVmIGNo
ZWNrc3VtKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2hlY2tzdW1fZmlsZS5jb250ZW50
cygpCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91
dHB1dF91bml0dGVzdC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0
b3V0cHV0X3VuaXR0ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjVjYmU0NzIzNzE2NTJiMzhjMDlmYmI1OGZm
MmQwODg0MDNmNDUxMTcKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5
L2NvbW1vbi9uZXQvdGVzdG91dHB1dF91bml0dGVzdC5weQpAQCAtMCwwICsxLDEzMyBAQAorIyEv
dXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6
CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisjIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
IElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisjIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisj
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBv
cnQgcmUKK2ltcG9ydCB0ZXN0b3V0cHV0CitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBGYWtl
RmlsZShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgY29udGVudHM9
ImZha2UgY29udGVudHMiKToKKyAgICAgICAgc2VsZi5fZmlsZW5hbWUgPSBmaWxlbmFtZQorICAg
ICAgICBzZWxmLl9jb250ZW50cyA9IGNvbnRlbnRzCisKKyAgICBkZWYgbmFtZShzZWxmKToKKyAg
ICAgICAgcmV0dXJuIHNlbGYuX2ZpbGVuYW1lCisKKyAgICBkZWYgY29udGVudHMoc2VsZik6Cisg
ICAgICAgIHJldHVybiBzZWxmLl9jb250ZW50cworCisKK2NsYXNzIEZha2VUZXN0T3V0cHV0KHRl
c3RvdXRwdXQuVGVzdE91dHB1dCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBsYXRmb3JtLCBv
dXRwdXRfdHlwZSwgY29udGVudHMsIGlzX2V4cGVjdGVkPUZhbHNlKToKKyAgICAgICAgc2VsZi5f
b3V0cHV0X3R5cGUgPSBvdXRwdXRfdHlwZQorICAgICAgICBzZWxmLl9jb250ZW50cyA9IGNvbnRl
bnRzCisgICAgICAgIHNlbGYuX2lzX2V4cGVjdGVkID0gaXNfZXhwZWN0ZWQKKyAgICAgICAgYWN0
dWFsID0gJ2FjdHVhbCcKKyAgICAgICAgaWYgaXNfZXhwZWN0ZWQ6CisgICAgICAgICAgICBhY3R1
YWwgPSAnZXhwZWN0ZWQnCisgICAgICAgIHRlc3RfbmFtZSA9ICdhbm9ueW1vdXMtdGVzdC0lcy50
eHQnICUgYWN0dWFsCisgICAgICAgIGZpbGUgPSBGYWtlRmlsZSh0ZXN0X25hbWUsIGNvbnRlbnRz
KQorICAgICAgICBzdXBlcihGYWtlVGVzdE91dHB1dCwgc2VsZikuX19pbml0X18ocGxhdGZvcm0s
IG91dHB1dF90eXBlLCBbZmlsZV0pCisKKyAgICBkZWYgY29udGVudHMoc2VsZik6CisgICAgICAg
IHJldHVybiBzZWxmLl9jb250ZW50cworCisgICAgZGVmIHJldGFyZ2V0KHNlbGYsIHBsYXRmb3Jt
KToKKyAgICAgICAgcmV0dXJuIEZha2VUZXN0T3V0cHV0KHBsYXRmb3JtLCBzZWxmLl9vdXRwdXRf
dHlwZSwgc2VsZi5fY29udGVudHMsIHNlbGYuX2lzX2V4cGVjdGVkKQorCisKK2NsYXNzIFRlc3RP
dXRwdXRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgX2NoZWNrX25hbWUoc2VsZiwg
ZmlsZW5hbWUsIGV4cGVjdGVkX3Rlc3RfbmFtZSk6CisgICAgICAgIHIgPSB0ZXN0b3V0cHV0LlRl
eHRUZXN0T3V0cHV0KE5vbmUsIEZha2VGaWxlKGZpbGVuYW1lKSkKKyAgICAgICAgc2VsZi5hc3Nl
cnRFcXVhbHMoZXhwZWN0ZWRfdGVzdF9uYW1lLCByLm5hbWUoKSkKKworICAgIGRlZiBfY2hlY2tf
cGxhdGZvcm0oc2VsZiwgZmlsZW5hbWUsIGV4cGVjdGVkX3BsYXRmb3JtKToKKyAgICAgICAgciA9
IHRlc3RvdXRwdXQuVGV4dFRlc3RPdXRwdXQoTm9uZSwgRmFrZUZpbGUoZmlsZW5hbWUpKQorICAg
ICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3RlZF9wbGF0Zm9ybSwgci5wbGF0Zm9ybSgpKQor
CisgICAgZGVmIHRlc3RfZXh0cmFjdHNfbmFtZV9jb3JyZWN0bHkoc2VsZik6CisgICAgICAgIHNl
bGYuX2NoZWNrX25hbWUoJ0xheW91dFRlc3RzL2Zhc3QvZG9tL2EtZXhwZWN0ZWQudHh0JywgJ2Zh
c3QvZG9tL2EnKQorICAgICAgICBzZWxmLl9jaGVja19uYW1lKCdMYXlvdXRUZXN0cy9mYXN0L2Rv
bS9hLWFjdHVhbC50eHQnLCAnZmFzdC9kb20vYScpCisgICAgICAgIHNlbGYuX2NoZWNrX25hbWUo
J0xheW91dFRlc3RzL3BsYXRmb3JtL3dpbi9mYXN0L2EtZXhwZWN0ZWQudHh0JywgJ2Zhc3QvYScp
CisgICAgICAgIHNlbGYuX2NoZWNrX25hbWUoJ0xheW91dFRlc3RzL3BsYXRmb3JtL3dpbi9mYXN0
L2EtZXhwZWN0ZWQuY2hlY2tzdW0nLCAnZmFzdC9hJykKKyAgICAgICAgc2VsZi5fY2hlY2tfbmFt
ZSgnZmFzdC9kb20vdGVzdC1leHBlY3RlZC50eHQnLCAnZmFzdC9kb20vdGVzdCcpCisgICAgICAg
IHNlbGYuX2NoZWNrX25hbWUoJ2xheW91dC10ZXN0LXJlc3VsdHMvZmFzdC9hLWFjdHVhbC5jaGVj
a3N1bScsICdmYXN0L2EnKQorCisgICAgZGVmIHRlc3RfZXh0cmFjdHNfcGxhdGZvcm1fY29ycmVj
dGx5KHNlbGYpOgorICAgICAgICBzZWxmLl9jaGVja19wbGF0Zm9ybSgnTGF5b3V0VGVzdHMvcGxh
dGZvcm0vd2luL2Zhc3QvYS1leHBlY3RlZC50eHQnLCAnd2luJykKKyAgICAgICAgc2VsZi5fY2hl
Y2tfcGxhdGZvcm0oJ3BsYXRmb3JtL3dpbi9mYXN0L2EtZXhwZWN0ZWQudHh0JywgJ3dpbicpCisg
ICAgICAgIHNlbGYuX2NoZWNrX3BsYXRmb3JtKCdwbGF0Zm9ybS9tYWMvZmFzdC9hLWV4cGVjdGVk
LnR4dCcsICdtYWMnKQorICAgICAgICBzZWxmLl9jaGVja19wbGF0Zm9ybSgnZmFzdC9hLWV4cGVj
dGVkLnR4dCcsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9vdXRwdXRzX2Zyb21fYW5fYWN0dWFsX2Zp
bGVfYXJlX21hcmtlZF9hc19zdWNoKHNlbGYpOgorICAgICAgICByID0gdGVzdG91dHB1dC5UZXh0
VGVzdE91dHB1dChOb25lLCBGYWtlRmlsZSgndGVzdC1hY3R1YWwudHh0JykpCisgICAgICAgIHNl
bGYuYXNzZXJ0VHJ1ZShyLmlzX2FjdHVhbCgpKQorCisgICAgZGVmIHRlc3Rfb3V0cHV0c19mcm9t
X2FuX2V4cGVjdGVkX2ZpbGVfYXJlX25vdF9hY3R1YWwoc2VsZik6CisgICAgICAgIHIgPSB0ZXN0
b3V0cHV0LlRleHRUZXN0T3V0cHV0KE5vbmUsIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnR4dCcp
KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHIuaXNfYWN0dWFsKCkpCisKKyAgICBkZWYgdGVz
dF9pc19uZXdfcmViYXNlbGluZV9mb3Ioc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gdGVzdG91
dHB1dC5UZXh0VGVzdE91dHB1dCgnbWFjJywgRmFrZUZpbGUoJ3Rlc3QtZXhwZWN0ZWQudHh0Jykp
CisgICAgICAgIGFjdHVhbCA9IHRlc3RvdXRwdXQuVGV4dFRlc3RPdXRwdXQoJ21hYycsIEZha2VG
aWxlKCd0ZXN0LWFjdHVhbC50eHQnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFjdHVhbC5p
c19uZXdfcmViYXNlbGluZV9mb3IoZXhwZWN0ZWQpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNl
KGV4cGVjdGVkLmlzX25ld19yZWJhc2VsaW5lX2ZvcihhY3R1YWwpKQorCisgICAgZGVmIHRlc3Rf
X2VxX18oc2VsZik6CisgICAgICAgIHIxID0gdGVzdG91dHB1dC5UZXh0VGVzdE91dHB1dCgnbWFj
JywgRmFrZUZpbGUoJ3Rlc3QtZXhwZWN0ZWQudHh0JywgJ2NvbnRlbnRzJykpCisgICAgICAgIHIy
ID0gdGVzdG91dHB1dC5UZXh0VGVzdE91dHB1dCgnbWFjJywgRmFrZUZpbGUoJ3Rlc3QtZXhwZWN0
ZWQudHh0JywgJ2NvbnRlbnRzJykpCisgICAgICAgIHIzID0gdGVzdG91dHB1dC5UZXh0VGVzdE91
dHB1dCgnd2luJywgRmFrZUZpbGUoJ3Rlc3QtZXhwZWN0ZWQudHh0JywgJ2NvbnRlbnRzJykpCisK
KyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocjEsIHIyKQorICAgICAgICBzZWxmLmFzc2VydEVx
dWFscyhyMSwgcjIucmV0YXJnZXQoJ21hYycpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFs
cyhyMSwgcjIucmV0YXJnZXQoJ3dpbicpKQorCisgICAgZGVmIHRlc3RfX2hhc2hfXyhzZWxmKToK
KyAgICAgICAgcjEgPSB0ZXN0b3V0cHV0LlRleHRUZXN0T3V0cHV0KCdtYWMnLCBGYWtlRmlsZSgn
dGVzdC1leHBlY3RlZC50eHQnLCAnY29udGVudHMnKSkKKyAgICAgICAgcjIgPSB0ZXN0b3V0cHV0
LlRleHRUZXN0T3V0cHV0KCdtYWMnLCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC50eHQnLCAnY29u
dGVudHMnKSkKKyAgICAgICAgcjMgPSB0ZXN0b3V0cHV0LlRleHRUZXN0T3V0cHV0KE5vbmUsIEZh
a2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnR4dCcsIE5vbmUpKQorCisgICAgICAgIHggPSBzZXQoW3Ix
LCByMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbihzZXQoW3IxLCByMl0pKSkK
KyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMiwgbGVuKHNldChbcjEsIHIyLCByM10pKSkKKwor
ICAgIGRlZiB0ZXN0X2ltYWdlX2RpZmZfaXNfaW52b2tlZF9mb3JfaW1hZ2Vfb3V0cHV0c193aXRo
b3V0X2NoZWNrc3VtKHNlbGYpOgorICAgICAgICByMSA9IHRlc3RvdXRwdXQuSW1hZ2VUZXN0T3V0
cHV0KCdtYWMnLCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC5wbmcnLCAnYXNkZicpLCBGYWtlRmls
ZSgndGVzdC1leHBlY3RlZC5jaGVja3N1bScsICdjaGVjaycpKQorICAgICAgICByMiA9IHRlc3Rv
dXRwdXQuSW1hZ2VUZXN0T3V0cHV0KCdtYWMnLCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC5wbmcn
LCAnYXNkZicpLCBOb25lKQorCisgICAgICAgICMgRGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8ganVz
dCBjb21wYXJlIG9uIGltYWdlIGNvbnRlbnRzLgorICAgICAgICBzZWxmLmFzc2VydFRydWUocjEu
c2FtZV9jb250ZW50KHIyKSkKKworICAgICAgICBjbGFzcyBBbGxJbWFnZXNBcmVEaWZmZXJlbnQo
b2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBzYW1lX2ltYWdlKHNlbGYsIGltYWdlMSwgaW1hZ2Uy
KToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICAjIEJ1dCB3ZSBjYW4g
aW5zdGFsbCBvdGhlciBpbWFnZSBkaWZmZXJzLgorICAgICAgICB0ZXN0b3V0cHV0LkltYWdlVGVz
dE91dHB1dC5pbWFnZV9kaWZmZXIgPSBBbGxJbWFnZXNBcmVEaWZmZXJlbnQoKQorCisgICAgICAg
IHNlbGYuYXNzZXJ0RmFsc2UocjEuc2FtZV9jb250ZW50KHIyKSkKKworaWYgX19uYW1lX18gPT0g
Il9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL1Rvb2xzL1Njcmlw
dHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0cHV0c2V0LnB5IGIvVG9vbHMvU2NyaXB0cy93
ZWJraXRweS9jb21tb24vbmV0L3Rlc3RvdXRwdXRzZXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZjk0NzIwMDEx
YzJlZjliMWQzYmJhODlhZTdkODFhZGMyNGZlNmI3ZAotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xz
L1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0cHV0c2V0LnB5CkBAIC0wLDAgKzEs
MTI5IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2ds
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyMgYXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuICBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
IyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkK
KyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkK
KyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisjIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisKK2Zyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS5kaXJlY3RvcnlmaWxlc2V0IGltcG9y
dCBEaXJlY3RvcnlGaWxlU2V0Citmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uemlwZmlsZXNl
dCBpbXBvcnQgWmlwRmlsZVNldAoraW1wb3J0IHJlCitpbXBvcnQgdGVzdG91dHB1dAoraW1wb3J0
IHVybGxpYgorCisKK2NsYXNzIFRlc3RPdXRwdXRTZXQob2JqZWN0KToKKyAgICBkZWYgX19pbml0
X18oc2VsZiwgbmFtZSwgcGxhdGZvcm0sIHppcF9maWxlLCAqKmt3YXJncyk6CisgICAgICAgIHNl
bGYuX25hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuX3BsYXRmb3JtID0gcGxhdGZvcm0KKyAgICAg
ICAgc2VsZi5femlwX2ZpbGUgPSB6aXBfZmlsZQorICAgICAgICBzZWxmLl9pbmNsdWRlX2V4cGVj
dGVkID0ga3dhcmdzLmdldCgnaW5jbHVkZV9leHBlY3RlZCcsIFRydWUpCisKKyAgICBAY2xhc3Nt
ZXRob2QKKyAgICBkZWYgZnJvbV96aXBfdXJsKGNscywgcGxhdGZvcm0sIHppcF9wYXRoKToKKyAg
ICAgICAgcmV0dXJuIFRlc3RPdXRwdXRTZXQoJ2xvY2FsIHppcCAlcyBidWlsZGVyJyAlIHBsYXRm
b3JtLCBwbGF0Zm9ybSwgWmlwRmlsZVNldCh6aXBfcGF0aCkpCisKKyAgICBAY2xhc3NtZXRob2QK
KyAgICBkZWYgZnJvbV96aXAoY2xzLCBwbGF0Zm9ybSwgemlwKToKKyAgICAgICAgcmV0dXJuIFRl
c3RPdXRwdXRTZXQoJ2xvY2FsIHppcCAlcyBidWlsZGVyJyAlIHBsYXRmb3JtLCBwbGF0Zm9ybSwg
emlwKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGZyb21femlwX21hcChjbHMsIHppcF9t
YXApOgorICAgICAgICBvdXRwdXRfc2V0cyA9IFtdCisgICAgICAgIGZvciBrLCB2IGluIHppcF9t
YXAuaXRlbXMoKToKKyAgICAgICAgICAgIG91dHB1dF9zZXRzLmFwcGVuZChUZXN0T3V0cHV0U2V0
LmZyb21femlwKGssIHYpKQorICAgICAgICByZXR1cm4gQWdncmVnYXRlVGVzdE91dHB1dFNldChv
dXRwdXRfc2V0cykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmcm9tX3BhdGgoc2VsZiwg
cGF0aCwgcGxhdGZvcm09Tm9uZSk6CisgICAgICAgIHJldHVybiBUZXN0T3V0cHV0U2V0KCdsb2Nh
bCAlcyBidWlsZGVyJyAlIHBsYXRmb3JtLCBwbGF0Zm9ybSwgRGlyZWN0b3J5RmlsZVNldChwYXRo
KSkKKworICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fbmFtZQorCisg
ICAgZGVmIHNldF9wbGF0Zm9ybShzZWxmLCBwbGF0Zm9ybSk6CisgICAgICAgIHNlbGYuX3BsYXRm
b3JtID0gcGxhdGZvcm0KKworICAgIGRlZiBmaWxlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFtz
ZWxmLl96aXBfZmlsZS5vcGVuKGZpbGVuYW1lKSBmb3IgZmlsZW5hbWUgaW4gc2VsZi5femlwX2Zp
bGUubmFtZWxpc3QoKV0KKworICAgIGRlZiBfZXh0cmFjdF9vdXRwdXRfZmlsZXMoc2VsZiwgbmFt
ZSwgZXhhY3RfbWF0Y2gpOgorICAgICAgICBuYW1lX21hdGNoZXIgPSByZS5jb21waWxlKG5hbWUp
CisgICAgICAgIGFjdHVhbF9tYXRjaGVyID0gcmUuY29tcGlsZShyJy1hY3R1YWxcLicpCisgICAg
ICAgIGV4cGVjdGVkX21hdGNoZXIgPSByZS5jb21waWxlKHInLWV4cGVjdGVkXC4nKQorCisgICAg
ICAgIGNoZWNrc3VtX2ZpbGVzID0gW10KKyAgICAgICAgdGV4dF9maWxlcyA9IFtdCisgICAgICAg
IGltYWdlX2ZpbGVzID0gW10KKyAgICAgICAgZm9yIG91dHB1dF9maWxlIGluIHNlbGYuZmlsZXMo
KToKKyAgICAgICAgICAgIG5hbWVfbWF0Y2ggPSBuYW1lX21hdGNoZXIuc2VhcmNoKG91dHB1dF9m
aWxlLm5hbWUoKSkKKyAgICAgICAgICAgIGFjdHVhbF9tYXRjaCA9IGFjdHVhbF9tYXRjaGVyLnNl
YXJjaChvdXRwdXRfZmlsZS5uYW1lKCkpCisgICAgICAgICAgICBleHBlY3RlZF9tYXRjaCA9IGV4
cGVjdGVkX21hdGNoZXIuc2VhcmNoKG91dHB1dF9maWxlLm5hbWUoKSkKKyAgICAgICAgICAgIGlm
IG5hbWVfbWF0Y2ggYW5kIChhY3R1YWxfbWF0Y2ggb3IgKHNlbGYuX2luY2x1ZGVfZXhwZWN0ZWQg
YW5kIGV4cGVjdGVkX21hdGNoKSk6CisgICAgICAgICAgICAgICAgaWYgb3V0cHV0X2ZpbGUubmFt
ZSgpLmVuZHN3aXRoKCcuY2hlY2tzdW0nKToKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW1f
ZmlsZXMuYXBwZW5kKG91dHB1dF9maWxlKQorICAgICAgICAgICAgICAgIGVsaWYgb3V0cHV0X2Zp
bGUubmFtZSgpLmVuZHN3aXRoKCcudHh0Jyk6CisgICAgICAgICAgICAgICAgICAgIHRleHRfZmls
ZXMuYXBwZW5kKG91dHB1dF9maWxlKQorICAgICAgICAgICAgICAgIGVsaWYgb3V0cHV0X2ZpbGUu
bmFtZSgpLmVuZHN3aXRoKCcucG5nJyk6CisgICAgICAgICAgICAgICAgICAgIGltYWdlX2ZpbGVz
LmFwcGVuZChvdXRwdXRfZmlsZSkKKworICAgICAgICByZXR1cm4gKGNoZWNrc3VtX2ZpbGVzLCB0
ZXh0X2ZpbGVzLCBpbWFnZV9maWxlcykKKworICAgIGRlZiBfZXh0cmFjdF9maWxlX3dpdGhfbmFt
ZShzZWxmLCBuYW1lLCBmaWxlcyk6CisgICAgICAgIGZvciBmaWxlIGluIGZpbGVzOgorICAgICAg
ICAgICAgaWYgZmlsZS5uYW1lKCkgPT0gbmFtZToKKyAgICAgICAgICAgICAgICByZXR1cm4gZmls
ZQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIF9tYWtlX291dHB1dF9mcm9tX2ltYWdl
KHNlbGYsIGltYWdlX2ZpbGUsIGNoZWNrc3VtX2ZpbGVzKToKKyAgICAgICAgY2hlY2tzdW1fZmls
ZV9uYW1lID0gcmUuc3ViKCdcLnBuZycsICcuY2hlY2tzdW0nLCBpbWFnZV9maWxlLm5hbWUoKSkK
KyAgICAgICAgY2hlY2tzdW1fZmlsZSA9IHNlbGYuX2V4dHJhY3RfZmlsZV93aXRoX25hbWUoY2hl
Y2tzdW1fZmlsZV9uYW1lLCBjaGVja3N1bV9maWxlcykKKyAgICAgICAgcmV0dXJuIHRlc3RvdXRw
dXQuSW1hZ2VUZXN0T3V0cHV0KHNlbGYuX3BsYXRmb3JtLCBpbWFnZV9maWxlLCBjaGVja3N1bV9m
aWxlKQorCisgICAgZGVmIG91dHB1dHNfZm9yKHNlbGYsIG5hbWUsICoqa3dhcmdzKToKKyAgICAg
ICAgdGFyZ2V0X3R5cGUgPSBrd2FyZ3MuZ2V0KCd0YXJnZXRfdHlwZScsIE5vbmUpCisgICAgICAg
IGV4YWN0X21hdGNoID0ga3dhcmdzLmdldCgnZXhhY3RfbWF0Y2gnLCBGYWxzZSkKKyAgICAgICAg
aWYgcmUuc2VhcmNoKHInXC54P2h0bWwnLCBuYW1lKToKKyAgICAgICAgICAgIG5hbWUgPSBuYW1l
WzpuYW1lLnJpbmRleCgnLicpXQorCisgICAgICAgIChjaGVja3N1bV9maWxlcywgdGV4dF9maWxl
cywgaW1hZ2VfZmlsZXMpID0gc2VsZi5fZXh0cmFjdF9vdXRwdXRfZmlsZXMobmFtZSwgZXhhY3Rf
bWF0Y2gpCisKKyAgICAgICAgb3V0cHV0cyA9IFtzZWxmLl9tYWtlX291dHB1dF9mcm9tX2ltYWdl
KGltYWdlX2ZpbGUsIGNoZWNrc3VtX2ZpbGVzKSBmb3IgaW1hZ2VfZmlsZSBpbiBpbWFnZV9maWxl
c10KKworICAgICAgICBvdXRwdXRzICs9IFt0ZXN0b3V0cHV0LlRleHRUZXN0T3V0cHV0KHNlbGYu
X3BsYXRmb3JtLCB0ZXh0X2ZpbGUpIGZvciB0ZXh0X2ZpbGUgaW4gdGV4dF9maWxlc10KKworICAg
ICAgICBpZiBleGFjdF9tYXRjaDoKKyAgICAgICAgICAgIG91dHB1dHMgPSBmaWx0ZXIobGFtYmRh
IG91dHB1dDogb3V0cHV0Lm5hbWUoKSA9PSBuYW1lLCBvdXRwdXRzKQorCisgICAgICAgIG91dHB1
dHMgPSBmaWx0ZXIobGFtYmRhIHI6IHRhcmdldF90eXBlIGluIFtOb25lLCByLnR5cGUoKV0sIG91
dHB1dHMpCisKKyAgICAgICAgcmV0dXJuIG91dHB1dHMKKworCitjbGFzcyBBZ2dyZWdhdGVUZXN0
T3V0cHV0U2V0KG9iamVjdCk6CisgICAgIiIiU2V0IG9mIHRlc3Qgb3V0cHV0cyBmcm9tIGEgbGlz
dCBvZiBidWlsZGVycyIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBidWlsZGVycyk6CisgICAg
ICAgIHNlbGYuX2J1aWxkZXJzID0gYnVpbGRlcnMKKworICAgIGRlZiBvdXRwdXRzX2ZvcihzZWxm
LCBuYW1lLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzdW0oW2J1aWxkZXIub3V0cHV0c19m
b3IobmFtZSwgKiprd2FyZ3MpIGZvciBidWlsZGVyIGluIHNlbGYuX2J1aWxkZXJzXSwgW10pCisK
KyAgICBkZWYgYnVpbGRlcnMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9idWlsZGVycwpk
aWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Rlc3RvdXRwdXRz
ZXRfdW5pdHRlc3QucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91
dHB1dHNldF91bml0dGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5hNzBhNTM5ZTg4YTMwMDg3NWVlYzZkYTU2
NmQ3ZjdjNGYwNWFiYTg2Ci0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9jb21tb24vbmV0L3Rlc3RvdXRwdXRzZXRfdW5pdHRlc3QucHkKQEAgLTAsMCArMSwxMjUgQEAK
KyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUg
bWV0OgorIworIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorIyBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUworIyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RAorIyBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKwor
ZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVtLnppcF9tb2NrIGltcG9ydCBNb2NrWmlwCitpbXBv
cnQgdGVzdG91dHB1dHNldAoraW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgVGVzdE91dHB1dFNl
dFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBfb3V0cHV0c2V0X3dpdGhfemlwKHNl
bGYsIHppcCwgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gdGVzdG91dHB1dHNldC5UZXN0T3V0
cHV0U2V0KCc8ZmFrZS1vdXRwdXRzZXQ+JywgJzxmYWtlLXBsYXRmb3JtPicsIHppcCwgKiprd2Fy
Z3MpCisKKyAgICBkZWYgdGVzdF90ZXh0X2ZpbGVzX2dldF9pbnRlcnByZXRlZF9hc190ZXh0X291
dHB1dHMoc2VsZik6CisgICAgICAgIHppcCA9IE1vY2taaXAoKQorICAgICAgICB6aXAuaW5zZXJ0
KCdmYXN0L2RvbS9zb21lLXRlc3QtYWN0dWFsLnR4dCcsICdhY3R1YWwgb3V0cHV0cycpCisgICAg
ICAgIGIgPSBzZWxmLl9vdXRwdXRzZXRfd2l0aF96aXAoemlwKQorICAgICAgICBzZWxmLmFzc2Vy
dEVxdWFscygxLCBsZW4oYi5vdXRwdXRzX2ZvcignZmFzdC9kb20vc29tZS10ZXN0JykpKQorICAg
ICAgICBzZWxmLmFzc2VydEVxdWFscygnZmFzdC9kb20vc29tZS10ZXN0JywgYi5vdXRwdXRzX2Zv
cignZmFzdC9kb20vc29tZS10ZXN0Lmh0bWwnKVswXS5uYW1lKCkpCisKKyAgICBkZWYgdGVzdF9p
bWFnZV9hbmRfY2hlY2tzdW1fZmlsZXNfZ2V0X2ludGVycHJldGVkX2FzX2Ffc2luZ2xlX2ltYWdl
X291dHB1dChzZWxmKToKKyAgICAgICAgemlwID0gTW9ja1ppcCgpCisgICAgICAgIHppcC5pbnNl
cnQoJ2Zhc3QvZG9tL3NvbWUtdGVzdC1hY3R1YWwuY2hlY2tzdW0nLCAnYWJjMTIzJykKKyAgICAg
ICAgemlwLmluc2VydCgnZmFzdC9kb20vc29tZS10ZXN0LWFjdHVhbC5wbmcnLCAnPGltYWdlIGRh
dGE+JykKKyAgICAgICAgYiA9IHNlbGYuX291dHB1dHNldF93aXRoX3ppcCh6aXApCisgICAgICAg
IG91dHB1dHMgPSBiLm91dHB1dHNfZm9yKCdmYXN0L2RvbS9zb21lLXRlc3QnKQorICAgICAgICBz
ZWxmLmFzc2VydEVxdWFscygxLCBsZW4ob3V0cHV0cykpCisgICAgICAgIG91dHB1dCA9IG91dHB1
dHNbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ2ltYWdlJywgb3V0cHV0LnR5cGUoKSkK
KyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ2FiYzEyMycsIG91dHB1dC5jaGVja3N1bSgpKQor
CisgICAgZGVmIHRlc3RfbXVsdGlwbGVfaW1hZ2Vfb3V0cHV0c19hcmVfZGV0ZWN0ZWQoc2VsZik6
CisgICAgICAgIHppcCA9IE1vY2taaXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCdwbGF0Zm9ybS93
aW4vZmFzdC9kb20vc29tZS10ZXN0LWFjdHVhbC5jaGVja3N1bScsICdjaGVja3N1bTEnKQorICAg
ICAgICB6aXAuaW5zZXJ0KCdwbGF0Zm9ybS93aW4vZmFzdC9kb20vc29tZS10ZXN0LWFjdHVhbC5w
bmcnLCAnPGltYWdlIGRhdGEgMT4nKQorICAgICAgICB6aXAuaW5zZXJ0KCdwbGF0Zm9ybS9tYWMv
ZmFzdC9kb20vc29tZS10ZXN0LWFjdHVhbC5jaGVja3N1bScsICdjaGVja3N1bTInKQorICAgICAg
ICB6aXAuaW5zZXJ0KCdwbGF0Zm9ybS9tYWMvZmFzdC9kb20vc29tZS10ZXN0LWFjdHVhbC5wbmcn
LCAnPGltYWdlIGRhdGEgMj4nKQorICAgICAgICBiID0gc2VsZi5fb3V0cHV0c2V0X3dpdGhfemlw
KHppcCkKKyAgICAgICAgb3V0cHV0cyA9IGIub3V0cHV0c19mb3IoJ2Zhc3QvZG9tL3NvbWUtdGVz
dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDIsIGxlbihvdXRwdXRzKSkKKyAgICAgICAg
c2VsZi5hc3NlcnRGYWxzZShvdXRwdXRzWzBdLnNhbWVfY29udGVudChvdXRwdXRzWzFdKSkKKwor
ICAgIGRlZiB0ZXN0X2FnZ3JlZ2F0ZV9vdXRwdXRfc2V0X2NvcnJlY3RseV9yZXRyaWV2ZXNfdGVz
dHNfZnJvbV9tdWx0aXBsZV9vdXRwdXRfc2V0cyhzZWxmKToKKyAgICAgICAgb3V0cHV0c2V0MV96
aXAgPSBNb2NrWmlwKCkKKyAgICAgICAgb3V0cHV0c2V0MV96aXAuaW5zZXJ0KCdmYXN0L2RvbS90
ZXN0LWFjdHVhbC50eHQnLCAnbGludXggdGV4dCBvdXRwdXQnKQorICAgICAgICBvdXRwdXRzZXQx
ID0gdGVzdG91dHB1dHNldC5UZXN0T3V0cHV0U2V0KCdsaW51eC1vdXRwdXRzZXQnLCAnbGludXgn
LCBvdXRwdXRzZXQxX3ppcCkKKyAgICAgICAgb3V0cHV0c2V0Ml96aXAgPSBNb2NrWmlwKCkKKyAg
ICAgICAgb3V0cHV0c2V0Ml96aXAuaW5zZXJ0KCdmYXN0L2RvbS90ZXN0LWFjdHVhbC50eHQnLCAn
d2luZG93cyB0ZXh0IG91dHB1dCcpCisgICAgICAgIG91dHB1dHNldDIgPSB0ZXN0b3V0cHV0c2V0
LlRlc3RPdXRwdXRTZXQoJ3dpbi1vdXRwdXRzZXQnLCAnd2luJywgb3V0cHV0c2V0Ml96aXApCisK
KyAgICAgICAgYiA9IHRlc3RvdXRwdXRzZXQuQWdncmVnYXRlVGVzdE91dHB1dFNldChbb3V0cHV0
c2V0MSwgb3V0cHV0c2V0Ml0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDIsIGxlbihiLm91
dHB1dHNfZm9yKCdmYXN0L2RvbS90ZXN0JykpKQorCisgICAgZGVmIHRlc3RfY2FuX2luZmVyX3Bs
YXRmb3JtX2Zyb21fcGF0aF9pZl9ub25lX3Byb3ZpZGVkKHNlbGYpOgorICAgICAgICB6aXAgPSBN
b2NrWmlwKCkKKyAgICAgICAgemlwLmluc2VydCgncGxhdGZvcm0vd2luL3NvbWUtdGVzdC1leHBl
Y3RlZC5wbmcnLCAnPGltYWdlIGRhdGE+JykKKyAgICAgICAgemlwLmluc2VydCgncGxhdGZvcm0v
d2luL3NvbWUtdGVzdC1leHBlY3RlZC5jaGVja3N1bScsICdhYmMxMjMnKQorICAgICAgICBiID0g
dGVzdG91dHB1dHNldC5UZXN0T3V0cHV0U2V0KCdsb2NhbCBMYXlvdXRUZXN0cyBvdXRwdXRzZXQn
LCBOb25lLCB6aXApCisKKyAgICAgICAgb3V0cHV0cyA9IGIub3V0cHV0c19mb3IoJ3NvbWUtdGVz
dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbihvdXRwdXRzKSkKKyAgICAgICAg
c2VsZi5hc3NlcnRFcXVhbHMoJ3dpbicsIG91dHB1dHNbMF0ucGxhdGZvcm0oKSkKKworICAgIGRl
ZiB0ZXN0X3Rlc3RfZXh0ZW5zaW9uX2lzX2lnbm9yZWQoc2VsZik6CisgICAgICAgIHppcCA9IE1v
Y2taaXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCd0ZXN0L3Rlc3QtYS1hY3R1YWwudHh0JywgJ2Fj
dHVhbCBvdXRwdXRzJykKKyAgICAgICAgYiA9IHNlbGYuX291dHB1dHNldF93aXRoX3ppcCh6aXAp
CisgICAgICAgIG91dHB1dHMgPSBiLm91dHB1dHNfZm9yKCd0ZXN0L3Rlc3QtYS5odG1sJykKKyAg
ICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgbGVuKG91dHB1dHMpKQorICAgICAgICBzZWxmLmFz
c2VydEVxdWFscygndGVzdC90ZXN0LWEnLCBvdXRwdXRzWzBdLm5hbWUoKSkKKworICAgIGRlZiB0
ZXN0X2V4aXN0aW5nX291dHB1dHNfYXJlX21hcmtlZF9hc19zdWNoKHNlbGYpOgorICAgICAgICB6
aXAgPSBNb2NrWmlwKCkKKyAgICAgICAgemlwLmluc2VydCgndGVzdC90ZXN0LWEtZXhwZWN0ZWQu
dHh0JywgJ2V4cGVjdGVkIG91dHB1dHMnKQorICAgICAgICBiID0gc2VsZi5fb3V0cHV0c2V0X3dp
dGhfemlwKHppcCkKKyAgICAgICAgb3V0cHV0cyA9IGIub3V0cHV0c19mb3IoJ3Rlc3QvdGVzdC1h
Lmh0bWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4ob3V0cHV0cykpCisgICAg
ICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3V0cHV0c1swXS5pc19hY3R1YWwoKSkKKworICAgIGRlZiB0
ZXN0X29ubHlfcmV0dXJuc19vdXRwdXRzX29mX3NwZWNpZmllZF90eXBlKHNlbGYpOgorICAgICAg
ICB6aXAgPSBNb2NrWmlwKCkKKyAgICAgICAgemlwLmluc2VydCgndGVzdC90ZXN0LWEtZXhwZWN0
ZWQudHh0JywgJ2V4cGVjdGVkIG91dHB1dHMnKQorICAgICAgICB6aXAuaW5zZXJ0KCd0ZXN0L3Rl
c3QtYS1leHBlY3RlZC5jaGVja3N1bScsICdleHBlY3RlZCBvdXRwdXRzJykKKyAgICAgICAgemlw
Lmluc2VydCgndGVzdC90ZXN0LWEtZXhwZWN0ZWQucG5nJywgJ2V4cGVjdGVkIG91dHB1dHMnKQor
ICAgICAgICBiID0gc2VsZi5fb3V0cHV0c2V0X3dpdGhfemlwKHppcCkKKworICAgICAgICBvdXRw
dXRzID0gYi5vdXRwdXRzX2ZvcigndGVzdC90ZXN0LWEuaHRtbCcpCisgICAgICAgIHRleHRfb3V0
cHV0cyA9IGIub3V0cHV0c19mb3IoJ3Rlc3QvdGVzdC1hLmh0bWwnLCB0YXJnZXRfdHlwZT0ndGV4
dCcpCisgICAgICAgIGltYWdlX291dHB1dHMgPSBiLm91dHB1dHNfZm9yKCd0ZXN0L3Rlc3QtYS5o
dG1sJywgdGFyZ2V0X3R5cGU9J2ltYWdlJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFscygy
LCBsZW4ob3V0cHV0cykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbih0ZXh0X291
dHB1dHMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4oaW1hZ2Vfb3V0cHV0cykp
CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCd0ZXh0JywgdGV4dF9vdXRwdXRzWzBdLnR5cGUo
KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ2ltYWdlJywgaW1hZ2Vfb3V0cHV0c1swXS50
eXBlKCkpCisKKyAgICBkZWYgdGVzdF9leGNsdWRlX2V4cGVjdGVkX291dHB1dHNfd29ya3Moc2Vs
Zik6CisgICAgICAgIHppcCA9IE1vY2taaXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCd0ZXN0LWV4
cGVjdGVkLnR4dCcsICAnZXhwZWN0ZWQgb3V0cHV0cyBzdG9yZWQgb24gc2VydmVyIGZvciBzb21l
IHJlYXNvbicpCisgICAgICAgIGIgPSBzZWxmLl9vdXRwdXRzZXRfd2l0aF96aXAoemlwLCBpbmNs
dWRlX2V4cGVjdGVkPUZhbHNlKQorICAgICAgICBvdXRwdXRzID0gYi5vdXRwdXRzX2ZvcigndGVz
dCcsIHRhcmdldF90eXBlPU5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDAsIGxlbihv
dXRwdXRzKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWlu
KCkKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS96aXBf
bW9jay5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS96aXBfbW9jay5w
eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi5kY2ZhYmE3MGQwOGJiN2E2ZDE5N2RlNWJmODkyM2U3MDM5MGU5YzBlCi0t
LSAvZGV2L251bGwKKysrIGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL3pp
cF9tb2NrLnB5CkBAIC0wLDAgKzEsNTUgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMg
YXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuICBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAg
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyMg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyMg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisjIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisKK2Zyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS5maWxlc2V0IGltcG9ydCBGaWxlU2V0Rmls
ZUhhbmRsZQorZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVtLmZpbGVzeXN0ZW1fbW9jayBpbXBv
cnQgTW9ja0ZpbGVTeXN0ZW0KKworCitjbGFzcyBNb2NrWmlwKG9iamVjdCk6CisgICAgIiIiQSBt
b2NrIHppcCBmaWxlIHRoYXQgY2FuIGhhdmUgbmV3IGZpbGVzIGluc2VydGVkIGludG8gaXQuIiIi
CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVzeXN0ZW09Tm9uZSk6CisgICAgICAgIHNlbGYu
X2ZpbGVzeXN0ZW0gPSBmaWxlc3lzdGVtIG9yIE1vY2tGaWxlU3lzdGVtKCkKKyAgICAgICAgc2Vs
Zi5fZmlsZXMgPSB7fQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAi
TW9ja1ppcCIKKworICAgIGRlZiBpbnNlcnQoc2VsZiwgZmlsZW5hbWUsIGNvbnRlbnQpOgorICAg
ICAgICBzZWxmLl9maWxlc1tmaWxlbmFtZV0gPSBjb250ZW50CisKKyAgICBkZWYgbmFtZWxpc3Qo
c2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlcy5rZXlzKCkKKworICAgIGRlZiBvcGVu
KHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgcmV0dXJuIEZpbGVTZXRGaWxlSGFuZGxlKHNlbGYs
IGZpbGVuYW1lKQorCisgICAgZGVmIHJlYWQoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICByZXR1
cm4gc2VsZi5fZmlsZXNbZmlsZW5hbWVdCisKKyAgICBkZWYgZXh0cmFjdChzZWxmLCBmaWxlbmFt
ZSwgcGF0aCk6CisgICAgICAgIGZ1bGxfcGF0aCA9IHNlbGYuX2ZpbGVzeXN0ZW0uam9pbihwYXRo
LCBmaWxlbmFtZSkKKyAgICAgICAgY29udGVudHMgPSBzZWxmLm9wZW4oZmlsZW5hbWUpLmNvbnRl
bnRzKCkKKyAgICAgICAgc2VsZi5fZmlsZXN5c3RlbS53cml0ZV90ZXh0X2ZpbGUoZnVsbF9wYXRo
LCBjb250ZW50cykKKworICAgIGRlZiBkZWxldGUoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBz
ZWxmLl9maWxlc1tmaWxlbmFtZV0gPSBOb25lCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>81184</attachid>
            <date>2011-02-03 20:55:53 -0800</date>
            <delta_ts>2011-02-06 16:29:41 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-52136-20110204155551.patch</filename>
            <type>text/plain</type>
            <size>30234</size>
            <attacher name="James Kozianski">koz</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rvb2xzL0NoYW5nZUxvZwppbmRleCBkZmZi
MzBhZmNlZTZkZDhiZWZhOTdhNmViMWU4ZmZiYWIyZTgyYzRhLi4zMzFhYzkwZmI1NjEyNjA2ODU2
NmNmNWI3NTFmZDBhZDRhNTU4MjAxIDEwMDY0NAotLS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIv
VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjIgQEAKKzIwMTEtMDItMDMgIEphbWVzIEtvemlh
bnNraSAgPGtvekBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgT2phbiBWYWZh
aS4KKworICAgICAgICBBZGQgY2xhc3NlcyBmb3IgcmVwcmVzZW50aW5nIHRlc3Qgb3V0cHV0cy4K
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUyMTM2CisK
KyAgICAgICAgVGhlc2UgY2xhc3NlcyB3aWxsIG1ha2UgaXQgZWFzaWVyIHRvIHdyaXRlIHNjcmlw
dHMgdGhhdCBkZWFsIHdpdGggdGVzdAorICAgICAgICBvdXRwdXRzIHN1Y2ggYXMgcmViYXNlbGlu
aW5nIGFuZCBkZWR1cGluZyBzY3JpcHRzLiBUaGUgaW50ZW50IGlzIHRoYXQKKyAgICAgICAgZXZl
bnR1YWxseSB3ZSB3aWxsIGJlIGhhdmUgYnVpbGRib3QgcmV0dXJuIFRlc3RPdXRwdXRzIGZvciBh
CisgICAgICAgIHBhcnRpY3VsYXIgYnVpbGQgd2hpY2ggY2FuIGJlIGNvbXBhcmVkIHdpdGggVGVz
dE91dHB1dHMgZGVyaXZlZCBmcm9tIGEKKyAgICAgICAgbG9jYWwgTGF5b3V0VGVzdHMgZGlyZWN0
b3J5LgorCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Rlc3RvdXRwdXQu
cHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0
cHV0X3VuaXR0ZXN0LnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1v
bi9uZXQvdGVzdG91dHB1dHNldC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRw
eS9jb21tb24vbmV0L3Rlc3RvdXRwdXRzZXRfdW5pdHRlc3QucHk6IEFkZGVkLgorICAgICAgICAq
IFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS96aXBfbW9jay5weTogQWRkZWQuCisKIDIw
MTEtMDItMDMgIEFkYW0gUm9iZW4gIDxhcm9iZW5AYXBwbGUuY29tPgogCiAgICAgICAgIEFkZCBs
aW5rcyB0byBXaW5kb3dzIGNyYXNoIGxvZ3MgaW4gcmVzdWx0cy5odG1sCmRpZmYgLS1naXQgYS9U
b29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dC5weSBiL1Rvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0cHV0LnB5Cm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjUzYmNj
NDdjNjY1YmM4NjhhM2JkOTcwNjMyYjQ5ZWQzMzJiODc1MWYKLS0tIC9kZXYvbnVsbAorKysgYi9U
b29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dC5weQpAQCAtMCwwICsx
LDE3OSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykgMjAxMCBHb29n
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5Z
CisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
CisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBV
U0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorCitpbXBvcnQgb3MKK2ltcG9ydCByZQorCisKK2NsYXNzIE5haXZlSW1hZ2VEaWZmZXIo
b2JqZWN0KToKKyAgICBkZWYgc2FtZV9pbWFnZShzZWxmLCBpbWcxLCBpbWcyKToKKyAgICAgICAg
cmV0dXJuIGltZzEgPT0gaW1nMgorCisKK2NsYXNzIFRlc3RPdXRwdXQob2JqZWN0KToKKyAgICAi
IiJSZXByZXNlbnRzIHRoZSBvdXRwdXQgdGhhdCBhIHNpbmdsZSBsYXlvdXQgdGVzdCBnZW5lcmF0
ZXMgd2hlbiBpdCBpcyBydW4KKyAgICBvbiBhIHBhcnRpY3VsYXIgcGxhdGZvcm0uCisgICAgTm90
ZSB0aGF0IHRoaXMgaXMgdGhlIHJhdyBvdXRwdXQgdGhhdCBpcyBwcm9kdWNlZCB3aGVuIHRoZSBs
YXlvdXQgdGVzdCBpcworICAgIHJ1biwgbm90IHRoZSByZXN1bHRzIG9mIHRoZSBzdWJzZXF1ZW50
IGNvbXBhcmlzb24gYmV0d2VlbiB0aGF0IG91dHB1dCBhbmQKKyAgICB0aGUgZXhwZWN0ZWQgb3V0
cHV0LiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwbGF0Zm9ybSwgb3V0cHV0X3R5cGUsIGZp
bGVzKToKKyAgICAgICAgc2VsZi5fb3V0cHV0X3R5cGUgPSBvdXRwdXRfdHlwZQorICAgICAgICBz
ZWxmLl9maWxlcyA9IGZpbGVzCisgICAgICAgIGZpbGUgPSBmaWxlc1swXSAgIyBQaWNrIHNvbWUg
ZmlsZSB0byBkbyB0ZXN0IG5hbWUgY2FsY3VsYXRpb24uCisgICAgICAgIHNlbGYuX25hbWUgPSBz
ZWxmLl9leHRyYWN0X3Rlc3RfbmFtZShmaWxlLm5hbWUoKSkKKyAgICAgICAgc2VsZi5faXNfYWN0
dWFsID0gJy1hY3R1YWwuJyBpbiBmaWxlLm5hbWUoKQorCisgICAgICAgIHNlbGYuX3BsYXRmb3Jt
ID0gcGxhdGZvcm0gb3Igc2VsZi5fZXh0cmFjdF9wbGF0Zm9ybShmaWxlLm5hbWUoKSkKKworICAg
IGRlZiBfZXh0cmFjdF9wbGF0Zm9ybShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgICIiIkNhbGN1
bGF0ZXMgdGhlIHBsYXRmb3JtIGZyb20gdGhlIG5hbWUgb2YgdGhlIGZpbGUgaWYgaXQgaXNuJ3Qg
a25vd24gYWxyZWFkeSIiIgorICAgICAgICBwYXRoID0gcmUuc3BsaXQob3MucGF0aC5zZXAsIGZp
bGVuYW1lKQorICAgICAgICBpZiAncGxhdGZvcm0nIGluIHBhdGg6CisgICAgICAgICAgICByZXR1
cm4gcGF0aFtwYXRoLmluZGV4KCdwbGF0Zm9ybScpICsgMV0KKyAgICAgICAgcmV0dXJuIE5vbmUK
KworICAgIGRlZiBfZXh0cmFjdF90ZXN0X25hbWUoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBw
YXRoID0gcmUuc3BsaXQob3MucGF0aC5zZXAsIGZpbGVuYW1lKQorICAgICAgICBpZiAnTGF5b3V0
VGVzdHMnIGluIHBhdGg6CisgICAgICAgICAgICBwYXRoID0gcGF0aFsxICsgcGF0aC5pbmRleCgn
TGF5b3V0VGVzdHMnKTpdCisgICAgICAgIGlmICdsYXlvdXQtdGVzdC1yZXN1bHRzJyBpbiBwYXRo
OgorICAgICAgICAgICAgcGF0aCA9IHBhdGhbMSArIHBhdGguaW5kZXgoJ2xheW91dC10ZXN0LXJl
c3VsdHMnKTpdCisgICAgICAgIGlmICdwbGF0Zm9ybScgaW4gcGF0aDoKKyAgICAgICAgICAgIHBh
dGggPSBwYXRoWzIgKyBwYXRoLmluZGV4KCdwbGF0Zm9ybScpOl0KKworICAgICAgICBmaWxlbmFt
ZSA9IHBhdGhbLTFdCisgICAgICAgIGZpbGVuYW1lID0gcmUuc3ViKCctZXhwZWN0ZWRcLi4qJCcs
ICcnLCBmaWxlbmFtZSkKKyAgICAgICAgZmlsZW5hbWUgPSByZS5zdWIoJy1hY3R1YWxcLi4qJCcs
ICcnLCBmaWxlbmFtZSkKKyAgICAgICAgcGF0aFstMV0gPSBmaWxlbmFtZQorICAgICAgICByZXR1
cm4gb3MucGF0aC5zZXAuam9pbihwYXRoKQorCisgICAgZGVmIHNhdmVfdG8oc2VsZiwgcGF0aCk6
CisgICAgICAgICIiIkhhdmUgdGhlIGZpbGVzIGluIHRoaXMgVGVzdE91dHB1dCB3cml0ZSB0aGVt
c2VsdmVzIHRvIHRoZSBkaXNrIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uIiIiCisgICAgICAg
IGZvciBmaWxlIGluIHNlbGYuX2ZpbGVzOgorICAgICAgICAgICAgZmlsZS5zYXZlX3RvKHBhdGgp
CisKKyAgICBkZWYgaXNfYWN0dWFsKHNlbGYpOgorICAgICAgICAiIiJJcyB0aGlzIG91dHB1dCB0
aGUgYWN0dWFsIG91dHB1dCBvZiBhIHRlc3Q/IChBcyBvcHBvc2VkIHRvIGV4cGVjdGVkIG91dHB1
dC4pIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9pc19hY3R1YWwKKworICAgIGRlZiBuYW1lKHNl
bGYpOgorICAgICAgICAiIiJUaGUgbmFtZSBvZiB0aGlzIHRlc3QgKGRvZXNuJ3QgaW5jbHVkZSBl
eHRlbnNpb24pIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9uYW1lCisKKyAgICBkZWYgX19lcV9f
KHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIChvdGhlciAhPSBOb25lIGFuZAorICAgICAg
ICAgICAgICAgIHNlbGYubmFtZSgpID09IG90aGVyLm5hbWUoKSBhbmQKKyAgICAgICAgICAgICAg
ICBzZWxmLnR5cGUoKSA9PSBvdGhlci50eXBlKCkgYW5kCisgICAgICAgICAgICAgICAgc2VsZi5w
bGF0Zm9ybSgpID09IG90aGVyLnBsYXRmb3JtKCkgYW5kCisgICAgICAgICAgICAgICAgc2VsZi5p
c19hY3R1YWwoKSA9PSBvdGhlci5pc19hY3R1YWwoKSBhbmQKKyAgICAgICAgICAgICAgICBzZWxm
LnNhbWVfY29udGVudChvdGhlcikpCisKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAg
IHJldHVybiBoYXNoKHN0cihzZWxmLm5hbWUoKSkgKyBzdHIoc2VsZi50eXBlKCkpICsgc3RyKHNl
bGYucGxhdGZvcm0oKSkpCisKKyAgICBkZWYgaXNfbmV3X3JlYmFzZWxpbmVfZm9yKHNlbGYsIG90
aGVyKToKKyAgICAgICAgcmV0dXJuIChzZWxmLm5hbWUoKSA9PSBvdGhlci5uYW1lKCkgYW5kCisg
ICAgICAgICAgICAgICAgc2VsZi50eXBlKCkgPT0gb3RoZXIudHlwZSgpIGFuZAorICAgICAgICAg
ICAgICAgIHNlbGYucGxhdGZvcm0oKSA9PSBvdGhlci5wbGF0Zm9ybSgpIGFuZAorICAgICAgICAg
ICAgICAgIHNlbGYuaXNfYWN0dWFsKCkgYW5kCisgICAgICAgICAgICAgICAgKG5vdCBvdGhlci5p
c19hY3R1YWwoKSkpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgYWN0dWFsX3N0
ciA9ICdbQV0gJyBpZiBzZWxmLmlzX2FjdHVhbCgpIGVsc2UgJycKKyAgICAgICAgcmV0dXJuICJU
ZXN0T3V0cHV0WyVzLyVzXSAlcyVzIiAlIChzZWxmLl9wbGF0Zm9ybSwgc2VsZi5fb3V0cHV0X3R5
cGUsIGFjdHVhbF9zdHIsIHNlbGYubmFtZSgpKQorCisgICAgZGVmIHR5cGUoc2VsZik6CisgICAg
ICAgIHJldHVybiBzZWxmLl9vdXRwdXRfdHlwZQorCisgICAgZGVmIHBsYXRmb3JtKHNlbGYpOgor
ICAgICAgICByZXR1cm4gc2VsZi5fcGxhdGZvcm0KKworICAgIGRlZiBfcGF0aF90b19wbGF0Zm9y
bShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgcGF0aCB0aGF0IHRlc3RzIGZvciB0aGlz
IHBsYXRmb3JtIGFyZSBzdG9yZWQgaW4uIiIiCisgICAgICAgIGlmIHNlbGYuX3BsYXRmb3JtIGlz
IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gIiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAg
IHJldHVybiBvcy5wYXRoLmpvaW4oInNlbGYuX3BsYXRmb3JtIiwgc2VsZi5fcGxhdGZvcm0pCisK
KyAgICBkZWYgX3NhdmVfZXhwZWN0ZWRfcmVzdWx0KHNlbGYsIGZpbGUsIHBhdGgpOgorICAgICAg
ICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHNlbGYuX3BhdGhfdG9fcGxhdGZvcm0oKSkKKyAg
ICAgICAgZXh0ZW5zaW9uID0gb3MucGF0aC5zcGxpdGV4dChmaWxlLm5hbWUoKSlbMV0KKyAgICAg
ICAgZmlsZW5hbWUgPSBzZWxmLm5hbWUoKSArICctZXhwZWN0ZWQnICsgZXh0ZW5zaW9uCisgICAg
ICAgIGZpbGUuc2F2ZV90byhwYXRoLCBmaWxlbmFtZSkKKworICAgIGRlZiBzYXZlX2V4cGVjdGVk
X3Jlc3VsdHMoc2VsZiwgcGF0aF90b19sYXlvdXRfdGVzdHMpOgorICAgICAgICAiIiJTYXZlIHRo
ZSBmaWxlcyBvZiB0aGlzIFRlc3RPdXRwdXQgdG8gdGhlIGFwcHJvcHJpYXRlIGRpcmVjdG9yeQor
ICAgICAgICBpbnNpZGUgdGhlIExheW91dFRlc3RzIGRpcmVjdG9yeS4gVHlwaWNhbGx5IHRoaXMg
bWVhbnMgdGhhdCB0aGVzZSBmaWxlcworICAgICAgICB3aWxsIGJlIHNhdmVkIGluICJMYXlvdXRU
ZXN0cy9wbGF0Zm9ybS88cGxhdGZvcm0+Lywgb3Igc2ltcGx5CisgICAgICAgIExheW91dFRlc3Rz
IGlmIHRoZSBwbGF0Zm9ybSBpcyBOb25lLiIiIgorICAgICAgICBmb3IgZmlsZSBpbiBzZWxmLl9m
aWxlczoKKyAgICAgICAgICAgIHNlbGYuX3NhdmVfZXhwZWN0ZWRfcmVzdWx0KGZpbGUsIHBhdGhf
dG9fbGF5b3V0X3Rlc3RzKQorCisgICAgZGVmIGRlbGV0ZShzZWxmKToKKyAgICAgICAgIiIiRGVs
ZXRlcyB0aGUgZmlsZXMgdGhhdCBjb21wcmlzZSB0aGlzIFRlc3RPdXRwdXQgZnJvbSBkaXNrLiBU
aGlzCisgICAgICAgIGZhaWxzIGlmIHRoZSBmaWxlcyBhcmUgdmlydHVhbCBmaWxlcyAoZWc6IHRo
ZSBmaWxlcyBtYXkgcmVzaWRlIGluc2lkZSBhCisgICAgICAgIHJlbW90ZSB6aXAgZmlsZSkuIiIi
CisgICAgICAgIGZvciBmaWxlIGluIHNlbGYuX2ZpbGVzOgorICAgICAgICAgICAgZmlsZS5kZWxl
dGUoKQorCisKK2NsYXNzIFRleHRUZXN0T3V0cHV0KFRlc3RPdXRwdXQpOgorICAgICIiIlJlcHJl
c2VudHMgYSB0ZXh0IG91dHB1dCBvZiBhIHNpbmdsZSB0ZXN0IG9uIGEgc2luZ2xlIHBsYXRmb3Jt
IiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBsYXRmb3JtLCB0ZXh0X2ZpbGUpOgorICAgICAg
ICBzZWxmLl90ZXh0X2ZpbGUgPSB0ZXh0X2ZpbGUKKyAgICAgICAgVGVzdE91dHB1dC5fX2luaXRf
XyhzZWxmLCBwbGF0Zm9ybSwgJ3RleHQnLCBbdGV4dF9maWxlXSkKKworICAgIGRlZiBzYW1lX2Nv
bnRlbnQoc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gc2VsZi5fdGV4dF9maWxlLmNvbnRl
bnRzKCkgPT0gb3RoZXIuX3RleHRfZmlsZS5jb250ZW50cygpCisKKyAgICBkZWYgcmV0YXJnZXQo
c2VsZiwgcGxhdGZvcm0pOgorICAgICAgICByZXR1cm4gVGV4dFRlc3RPdXRwdXQocGxhdGZvcm0s
IHNlbGYuX3RleHRfZmlsZSkKKworCitjbGFzcyBJbWFnZVRlc3RPdXRwdXQoVGVzdE91dHB1dCk6
CisgICAgaW1hZ2VfZGlmZmVyID0gTmFpdmVJbWFnZURpZmZlcigpCisgICAgIiIiUmVwcmVzZW50
cyBhbiBpbWFnZSBvdXRwdXQgb2YgYSBzaW5nbGUgdGVzdCBvbiBhIHNpbmdsZSBwbGF0Zm9ybSIi
IgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwbGF0Zm9ybSwgaW1hZ2VfZmlsZSwgY2hlY2tzdW1f
ZmlsZSk6CisgICAgICAgIHNlbGYuX2NoZWNrc3VtX2ZpbGUgPSBjaGVja3N1bV9maWxlCisgICAg
ICAgIHNlbGYuX2ltYWdlX2ZpbGUgPSBpbWFnZV9maWxlCisgICAgICAgIGZpbGVzID0gZmlsdGVy
KGJvb2wsIFtzZWxmLl9jaGVja3N1bV9maWxlLCBzZWxmLl9pbWFnZV9maWxlXSkKKyAgICAgICAg
VGVzdE91dHB1dC5fX2luaXRfXyhzZWxmLCBwbGF0Zm9ybSwgJ2ltYWdlJywgZmlsZXMpCisKKyAg
ICBkZWYgaGFzX2NoZWNrc3VtKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2hlY2tzdW1f
ZmlsZSBpcyBub3QgTm9uZQorCisgICAgZGVmIHNhbWVfY29udGVudChzZWxmLCBvdGhlcik6Cisg
ICAgICAgICMgRklYTUUgVGhpcyBzaG91bGQgbm90IGFzc3VtZSB0aGF0IGNoZWNrc3VtcyBhcmUg
dXAgdG8gZGF0ZS4KKyAgICAgICAgaWYgc2VsZi5oYXNfY2hlY2tzdW0oKSBhbmQgb3RoZXIuaGFz
X2NoZWNrc3VtKCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY2hlY2tzdW1fZmlsZS5jb250
ZW50cygpID09IG90aGVyLl9jaGVja3N1bV9maWxlLmNvbnRlbnRzKCkKKyAgICAgICAgZWxzZToK
KyAgICAgICAgICAgIHNlbGZfY29udGVudHMgPSBzZWxmLl9pbWFnZV9maWxlLmNvbnRlbnRzKCkK
KyAgICAgICAgICAgIG90aGVyX2NvbnRlbnRzID0gb3RoZXIuX2ltYWdlX2ZpbGUuY29udGVudHMo
KQorICAgICAgICAgICAgcmV0dXJuIEltYWdlVGVzdE91dHB1dC5pbWFnZV9kaWZmZXIuc2FtZV9p
bWFnZShzZWxmX2NvbnRlbnRzLCBvdGhlcl9jb250ZW50cykKKworICAgIGRlZiByZXRhcmdldChz
ZWxmLCBwbGF0Zm9ybSk6CisgICAgICAgIHJldHVybiBJbWFnZVRlc3RPdXRwdXQocGxhdGZvcm0s
IHNlbGYuX2ltYWdlX2ZpbGUsIHNlbGYuX2NoZWNrc3VtX2ZpbGUpCisKKyAgICBkZWYgY2hlY2tz
dW0oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jaGVja3N1bV9maWxlLmNvbnRlbnRzKCkK
ZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0cHV0
X3VuaXR0ZXN0LnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Rlc3RvdXRw
dXRfdW5pdHRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNWNiZTQ3MjM3MTY1MmIzOGMwOWZiYjU4ZmYyZDA4
ODQwM2Y0NTExNwotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29t
bW9uL25ldC90ZXN0b3V0cHV0X3VuaXR0ZXN0LnB5CkBAIC0wLDAgKzEsMTMzIEBACisjIS91c3Iv
YmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMK
KyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1Q
TElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyMgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMKKyMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyMgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisjIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2ltcG9ydCBy
ZQoraW1wb3J0IHRlc3RvdXRwdXQKK2ltcG9ydCB1bml0dGVzdAorCisKK2NsYXNzIEZha2VGaWxl
KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBjb250ZW50cz0iZmFr
ZSBjb250ZW50cyIpOgorICAgICAgICBzZWxmLl9maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAg
IHNlbGYuX2NvbnRlbnRzID0gY29udGVudHMKKworICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAg
ICByZXR1cm4gc2VsZi5fZmlsZW5hbWUKKworICAgIGRlZiBjb250ZW50cyhzZWxmKToKKyAgICAg
ICAgcmV0dXJuIHNlbGYuX2NvbnRlbnRzCisKKworY2xhc3MgRmFrZVRlc3RPdXRwdXQodGVzdG91
dHB1dC5UZXN0T3V0cHV0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGxhdGZvcm0sIG91dHB1
dF90eXBlLCBjb250ZW50cywgaXNfZXhwZWN0ZWQ9RmFsc2UpOgorICAgICAgICBzZWxmLl9vdXRw
dXRfdHlwZSA9IG91dHB1dF90eXBlCisgICAgICAgIHNlbGYuX2NvbnRlbnRzID0gY29udGVudHMK
KyAgICAgICAgc2VsZi5faXNfZXhwZWN0ZWQgPSBpc19leHBlY3RlZAorICAgICAgICBhY3R1YWwg
PSAnYWN0dWFsJworICAgICAgICBpZiBpc19leHBlY3RlZDoKKyAgICAgICAgICAgIGFjdHVhbCA9
ICdleHBlY3RlZCcKKyAgICAgICAgdGVzdF9uYW1lID0gJ2Fub255bW91cy10ZXN0LSVzLnR4dCcg
JSBhY3R1YWwKKyAgICAgICAgZmlsZSA9IEZha2VGaWxlKHRlc3RfbmFtZSwgY29udGVudHMpCisg
ICAgICAgIHN1cGVyKEZha2VUZXN0T3V0cHV0LCBzZWxmKS5fX2luaXRfXyhwbGF0Zm9ybSwgb3V0
cHV0X3R5cGUsIFtmaWxlXSkKKworICAgIGRlZiBjb250ZW50cyhzZWxmKToKKyAgICAgICAgcmV0
dXJuIHNlbGYuX2NvbnRlbnRzCisKKyAgICBkZWYgcmV0YXJnZXQoc2VsZiwgcGxhdGZvcm0pOgor
ICAgICAgICByZXR1cm4gRmFrZVRlc3RPdXRwdXQocGxhdGZvcm0sIHNlbGYuX291dHB1dF90eXBl
LCBzZWxmLl9jb250ZW50cywgc2VsZi5faXNfZXhwZWN0ZWQpCisKKworY2xhc3MgVGVzdE91dHB1
dFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBfY2hlY2tfbmFtZShzZWxmLCBmaWxl
bmFtZSwgZXhwZWN0ZWRfdGVzdF9uYW1lKToKKyAgICAgICAgciA9IHRlc3RvdXRwdXQuVGV4dFRl
c3RPdXRwdXQoTm9uZSwgRmFrZUZpbGUoZmlsZW5hbWUpKQorICAgICAgICBzZWxmLmFzc2VydEVx
dWFscyhleHBlY3RlZF90ZXN0X25hbWUsIHIubmFtZSgpKQorCisgICAgZGVmIF9jaGVja19wbGF0
Zm9ybShzZWxmLCBmaWxlbmFtZSwgZXhwZWN0ZWRfcGxhdGZvcm0pOgorICAgICAgICByID0gdGVz
dG91dHB1dC5UZXh0VGVzdE91dHB1dChOb25lLCBGYWtlRmlsZShmaWxlbmFtZSkpCisgICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkX3BsYXRmb3JtLCByLnBsYXRmb3JtKCkpCisKKyAg
ICBkZWYgdGVzdF9leHRyYWN0c19uYW1lX2NvcnJlY3RseShzZWxmKToKKyAgICAgICAgc2VsZi5f
Y2hlY2tfbmFtZSgnTGF5b3V0VGVzdHMvZmFzdC9kb20vYS1leHBlY3RlZC50eHQnLCAnZmFzdC9k
b20vYScpCisgICAgICAgIHNlbGYuX2NoZWNrX25hbWUoJ0xheW91dFRlc3RzL2Zhc3QvZG9tL2Et
YWN0dWFsLnR4dCcsICdmYXN0L2RvbS9hJykKKyAgICAgICAgc2VsZi5fY2hlY2tfbmFtZSgnTGF5
b3V0VGVzdHMvcGxhdGZvcm0vd2luL2Zhc3QvYS1leHBlY3RlZC50eHQnLCAnZmFzdC9hJykKKyAg
ICAgICAgc2VsZi5fY2hlY2tfbmFtZSgnTGF5b3V0VGVzdHMvcGxhdGZvcm0vd2luL2Zhc3QvYS1l
eHBlY3RlZC5jaGVja3N1bScsICdmYXN0L2EnKQorICAgICAgICBzZWxmLl9jaGVja19uYW1lKCdm
YXN0L2RvbS90ZXN0LWV4cGVjdGVkLnR4dCcsICdmYXN0L2RvbS90ZXN0JykKKyAgICAgICAgc2Vs
Zi5fY2hlY2tfbmFtZSgnbGF5b3V0LXRlc3QtcmVzdWx0cy9mYXN0L2EtYWN0dWFsLmNoZWNrc3Vt
JywgJ2Zhc3QvYScpCisKKyAgICBkZWYgdGVzdF9leHRyYWN0c19wbGF0Zm9ybV9jb3JyZWN0bHko
c2VsZik6CisgICAgICAgIHNlbGYuX2NoZWNrX3BsYXRmb3JtKCdMYXlvdXRUZXN0cy9wbGF0Zm9y
bS93aW4vZmFzdC9hLWV4cGVjdGVkLnR4dCcsICd3aW4nKQorICAgICAgICBzZWxmLl9jaGVja19w
bGF0Zm9ybSgncGxhdGZvcm0vd2luL2Zhc3QvYS1leHBlY3RlZC50eHQnLCAnd2luJykKKyAgICAg
ICAgc2VsZi5fY2hlY2tfcGxhdGZvcm0oJ3BsYXRmb3JtL21hYy9mYXN0L2EtZXhwZWN0ZWQudHh0
JywgJ21hYycpCisgICAgICAgIHNlbGYuX2NoZWNrX3BsYXRmb3JtKCdmYXN0L2EtZXhwZWN0ZWQu
dHh0JywgTm9uZSkKKworICAgIGRlZiB0ZXN0X291dHB1dHNfZnJvbV9hbl9hY3R1YWxfZmlsZV9h
cmVfbWFya2VkX2FzX3N1Y2goc2VsZik6CisgICAgICAgIHIgPSB0ZXN0b3V0cHV0LlRleHRUZXN0
T3V0cHV0KE5vbmUsIEZha2VGaWxlKCd0ZXN0LWFjdHVhbC50eHQnKSkKKyAgICAgICAgc2VsZi5h
c3NlcnRUcnVlKHIuaXNfYWN0dWFsKCkpCisKKyAgICBkZWYgdGVzdF9vdXRwdXRzX2Zyb21fYW5f
ZXhwZWN0ZWRfZmlsZV9hcmVfbm90X2FjdHVhbChzZWxmKToKKyAgICAgICAgciA9IHRlc3RvdXRw
dXQuVGV4dFRlc3RPdXRwdXQoTm9uZSwgRmFrZUZpbGUoJ3Rlc3QtZXhwZWN0ZWQudHh0JykpCisg
ICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoci5pc19hY3R1YWwoKSkKKworICAgIGRlZiB0ZXN0X2lz
X25ld19yZWJhc2VsaW5lX2ZvcihzZWxmKToKKyAgICAgICAgZXhwZWN0ZWQgPSB0ZXN0b3V0cHV0
LlRleHRUZXN0T3V0cHV0KCdtYWMnLCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC50eHQnKSkKKyAg
ICAgICAgYWN0dWFsID0gdGVzdG91dHB1dC5UZXh0VGVzdE91dHB1dCgnbWFjJywgRmFrZUZpbGUo
J3Rlc3QtYWN0dWFsLnR4dCcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYWN0dWFsLmlzX25l
d19yZWJhc2VsaW5lX2ZvcihleHBlY3RlZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZXhw
ZWN0ZWQuaXNfbmV3X3JlYmFzZWxpbmVfZm9yKGFjdHVhbCkpCisKKyAgICBkZWYgdGVzdF9fZXFf
XyhzZWxmKToKKyAgICAgICAgcjEgPSB0ZXN0b3V0cHV0LlRleHRUZXN0T3V0cHV0KCdtYWMnLCBG
YWtlRmlsZSgndGVzdC1leHBlY3RlZC50eHQnLCAnY29udGVudHMnKSkKKyAgICAgICAgcjIgPSB0
ZXN0b3V0cHV0LlRleHRUZXN0T3V0cHV0KCdtYWMnLCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC50
eHQnLCAnY29udGVudHMnKSkKKyAgICAgICAgcjMgPSB0ZXN0b3V0cHV0LlRleHRUZXN0T3V0cHV0
KCd3aW4nLCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC50eHQnLCAnY29udGVudHMnKSkKKworICAg
ICAgICBzZWxmLmFzc2VydEVxdWFscyhyMSwgcjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxz
KHIxLCByMi5yZXRhcmdldCgnbWFjJykpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWxzKHIx
LCByMi5yZXRhcmdldCgnd2luJykpCisKKyAgICBkZWYgdGVzdF9faGFzaF9fKHNlbGYpOgorICAg
ICAgICByMSA9IHRlc3RvdXRwdXQuVGV4dFRlc3RPdXRwdXQoJ21hYycsIEZha2VGaWxlKCd0ZXN0
LWV4cGVjdGVkLnR4dCcsICdjb250ZW50cycpKQorICAgICAgICByMiA9IHRlc3RvdXRwdXQuVGV4
dFRlc3RPdXRwdXQoJ21hYycsIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnR4dCcsICdjb250ZW50
cycpKQorICAgICAgICByMyA9IHRlc3RvdXRwdXQuVGV4dFRlc3RPdXRwdXQoTm9uZSwgRmFrZUZp
bGUoJ3Rlc3QtZXhwZWN0ZWQudHh0JywgTm9uZSkpCisKKyAgICAgICAgeCA9IHNldChbcjEsIHIy
XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgbGVuKHNldChbcjEsIHIyXSkpKQorICAg
ICAgICBzZWxmLmFzc2VydEVxdWFscygyLCBsZW4oc2V0KFtyMSwgcjIsIHIzXSkpKQorCisgICAg
ZGVmIHRlc3RfaW1hZ2VfZGlmZl9pc19pbnZva2VkX2Zvcl9pbWFnZV9vdXRwdXRzX3dpdGhvdXRf
Y2hlY2tzdW0oc2VsZik6CisgICAgICAgIHIxID0gdGVzdG91dHB1dC5JbWFnZVRlc3RPdXRwdXQo
J21hYycsIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnBuZycsICdhc2RmJyksIEZha2VGaWxlKCd0
ZXN0LWV4cGVjdGVkLmNoZWNrc3VtJywgJ2NoZWNrJykpCisgICAgICAgIHIyID0gdGVzdG91dHB1
dC5JbWFnZVRlc3RPdXRwdXQoJ21hYycsIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnBuZycsICdh
c2RmJyksIE5vbmUpCisKKyAgICAgICAgIyBEZWZhdWx0IGJlaGF2aW91ciBpcyB0byBqdXN0IGNv
bXBhcmUgb24gaW1hZ2UgY29udGVudHMuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyMS5zYW1l
X2NvbnRlbnQocjIpKQorCisgICAgICAgIGNsYXNzIEFsbEltYWdlc0FyZURpZmZlcmVudChvYmpl
Y3QpOgorICAgICAgICAgICAgZGVmIHNhbWVfaW1hZ2Uoc2VsZiwgaW1hZ2UxLCBpbWFnZTIpOgor
ICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgICMgQnV0IHdlIGNhbiBpbnN0
YWxsIG90aGVyIGltYWdlIGRpZmZlcnMuCisgICAgICAgIHRlc3RvdXRwdXQuSW1hZ2VUZXN0T3V0
cHV0LmltYWdlX2RpZmZlciA9IEFsbEltYWdlc0FyZURpZmZlcmVudCgpCisKKyAgICAgICAgc2Vs
Zi5hc3NlcnRGYWxzZShyMS5zYW1lX2NvbnRlbnQocjIpKQorCitpZiBfX25hbWVfXyA9PSAiX19t
YWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93
ZWJraXRweS9jb21tb24vbmV0L3Rlc3RvdXRwdXRzZXQucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtp
dHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dHNldC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5mOTQ3MjAwMTFjMmVm
OWIxZDNiYmE4OWFlN2Q4MWFkYzI0ZmU2YjdkCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvU2Ny
aXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Rlc3RvdXRwdXRzZXQucHkKQEAgLTAsMCArMSwxMjkg
QEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBh
cmUgbWV0OgorIworIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorIyBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUworIyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORAorIyBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KworZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVtLmRpcmVjdG9yeWZpbGVzZXQgaW1wb3J0IERp
cmVjdG9yeUZpbGVTZXQKK2Zyb20gd2Via2l0cHkuY29tbW9uLnN5c3RlbS56aXBmaWxlc2V0IGlt
cG9ydCBaaXBGaWxlU2V0CitpbXBvcnQgcmUKK2ltcG9ydCB0ZXN0b3V0cHV0CitpbXBvcnQgdXJs
bGliCisKKworY2xhc3MgVGVzdE91dHB1dFNldChvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhz
ZWxmLCBuYW1lLCBwbGF0Zm9ybSwgemlwX2ZpbGUsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5f
bmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5fcGxhdGZvcm0gPSBwbGF0Zm9ybQorICAgICAgICBz
ZWxmLl96aXBfZmlsZSA9IHppcF9maWxlCisgICAgICAgIHNlbGYuX2luY2x1ZGVfZXhwZWN0ZWQg
PSBrd2FyZ3MuZ2V0KCdpbmNsdWRlX2V4cGVjdGVkJywgVHJ1ZSkKKworICAgIEBjbGFzc21ldGhv
ZAorICAgIGRlZiBmcm9tX3ppcF91cmwoY2xzLCBwbGF0Zm9ybSwgemlwX3BhdGgpOgorICAgICAg
ICByZXR1cm4gVGVzdE91dHB1dFNldCgnbG9jYWwgemlwICVzIGJ1aWxkZXInICUgcGxhdGZvcm0s
IHBsYXRmb3JtLCBaaXBGaWxlU2V0KHppcF9wYXRoKSkKKworICAgIEBjbGFzc21ldGhvZAorICAg
IGRlZiBmcm9tX3ppcChjbHMsIHBsYXRmb3JtLCB6aXApOgorICAgICAgICByZXR1cm4gVGVzdE91
dHB1dFNldCgnbG9jYWwgemlwICVzIGJ1aWxkZXInICUgcGxhdGZvcm0sIHBsYXRmb3JtLCB6aXAp
CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZnJvbV96aXBfbWFwKGNscywgemlwX21hcCk6
CisgICAgICAgIG91dHB1dF9zZXRzID0gW10KKyAgICAgICAgZm9yIGssIHYgaW4gemlwX21hcC5p
dGVtcygpOgorICAgICAgICAgICAgb3V0cHV0X3NldHMuYXBwZW5kKFRlc3RPdXRwdXRTZXQuZnJv
bV96aXAoaywgdikpCisgICAgICAgIHJldHVybiBBZ2dyZWdhdGVUZXN0T3V0cHV0U2V0KG91dHB1
dF9zZXRzKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGZyb21fcGF0aChzZWxmLCBwYXRo
LCBwbGF0Zm9ybT1Ob25lKToKKyAgICAgICAgcmV0dXJuIFRlc3RPdXRwdXRTZXQoJ2xvY2FsICVz
IGJ1aWxkZXInICUgcGxhdGZvcm0sIHBsYXRmb3JtLCBEaXJlY3RvcnlGaWxlU2V0KHBhdGgpKQor
CisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9uYW1lCisKKyAgICBk
ZWYgc2V0X3BsYXRmb3JtKHNlbGYsIHBsYXRmb3JtKToKKyAgICAgICAgc2VsZi5fcGxhdGZvcm0g
PSBwbGF0Zm9ybQorCisgICAgZGVmIGZpbGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gW3NlbGYu
X3ppcF9maWxlLm9wZW4oZmlsZW5hbWUpIGZvciBmaWxlbmFtZSBpbiBzZWxmLl96aXBfZmlsZS5u
YW1lbGlzdCgpXQorCisgICAgZGVmIF9leHRyYWN0X291dHB1dF9maWxlcyhzZWxmLCBuYW1lLCBl
eGFjdF9tYXRjaCk6CisgICAgICAgIG5hbWVfbWF0Y2hlciA9IHJlLmNvbXBpbGUobmFtZSkKKyAg
ICAgICAgYWN0dWFsX21hdGNoZXIgPSByZS5jb21waWxlKHInLWFjdHVhbFwuJykKKyAgICAgICAg
ZXhwZWN0ZWRfbWF0Y2hlciA9IHJlLmNvbXBpbGUocictZXhwZWN0ZWRcLicpCisKKyAgICAgICAg
Y2hlY2tzdW1fZmlsZXMgPSBbXQorICAgICAgICB0ZXh0X2ZpbGVzID0gW10KKyAgICAgICAgaW1h
Z2VfZmlsZXMgPSBbXQorICAgICAgICBmb3Igb3V0cHV0X2ZpbGUgaW4gc2VsZi5maWxlcygpOgor
ICAgICAgICAgICAgbmFtZV9tYXRjaCA9IG5hbWVfbWF0Y2hlci5zZWFyY2gob3V0cHV0X2ZpbGUu
bmFtZSgpKQorICAgICAgICAgICAgYWN0dWFsX21hdGNoID0gYWN0dWFsX21hdGNoZXIuc2VhcmNo
KG91dHB1dF9maWxlLm5hbWUoKSkKKyAgICAgICAgICAgIGV4cGVjdGVkX21hdGNoID0gZXhwZWN0
ZWRfbWF0Y2hlci5zZWFyY2gob3V0cHV0X2ZpbGUubmFtZSgpKQorICAgICAgICAgICAgaWYgbmFt
ZV9tYXRjaCBhbmQgKGFjdHVhbF9tYXRjaCBvciAoc2VsZi5faW5jbHVkZV9leHBlY3RlZCBhbmQg
ZXhwZWN0ZWRfbWF0Y2gpKToKKyAgICAgICAgICAgICAgICBpZiBvdXRwdXRfZmlsZS5uYW1lKCku
ZW5kc3dpdGgoJy5jaGVja3N1bScpOgorICAgICAgICAgICAgICAgICAgICBjaGVja3N1bV9maWxl
cy5hcHBlbmQob3V0cHV0X2ZpbGUpCisgICAgICAgICAgICAgICAgZWxpZiBvdXRwdXRfZmlsZS5u
YW1lKCkuZW5kc3dpdGgoJy50eHQnKToKKyAgICAgICAgICAgICAgICAgICAgdGV4dF9maWxlcy5h
cHBlbmQob3V0cHV0X2ZpbGUpCisgICAgICAgICAgICAgICAgZWxpZiBvdXRwdXRfZmlsZS5uYW1l
KCkuZW5kc3dpdGgoJy5wbmcnKToKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2VfZmlsZXMuYXBw
ZW5kKG91dHB1dF9maWxlKQorCisgICAgICAgIHJldHVybiAoY2hlY2tzdW1fZmlsZXMsIHRleHRf
ZmlsZXMsIGltYWdlX2ZpbGVzKQorCisgICAgZGVmIF9leHRyYWN0X2ZpbGVfd2l0aF9uYW1lKHNl
bGYsIG5hbWUsIGZpbGVzKToKKyAgICAgICAgZm9yIGZpbGUgaW4gZmlsZXM6CisgICAgICAgICAg
ICBpZiBmaWxlLm5hbWUoKSA9PSBuYW1lOgorICAgICAgICAgICAgICAgIHJldHVybiBmaWxlCisg
ICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgX21ha2Vfb3V0cHV0X2Zyb21faW1hZ2Uoc2Vs
ZiwgaW1hZ2VfZmlsZSwgY2hlY2tzdW1fZmlsZXMpOgorICAgICAgICBjaGVja3N1bV9maWxlX25h
bWUgPSByZS5zdWIoJ1wucG5nJywgJy5jaGVja3N1bScsIGltYWdlX2ZpbGUubmFtZSgpKQorICAg
ICAgICBjaGVja3N1bV9maWxlID0gc2VsZi5fZXh0cmFjdF9maWxlX3dpdGhfbmFtZShjaGVja3N1
bV9maWxlX25hbWUsIGNoZWNrc3VtX2ZpbGVzKQorICAgICAgICByZXR1cm4gdGVzdG91dHB1dC5J
bWFnZVRlc3RPdXRwdXQoc2VsZi5fcGxhdGZvcm0sIGltYWdlX2ZpbGUsIGNoZWNrc3VtX2ZpbGUp
CisKKyAgICBkZWYgb3V0cHV0c19mb3Ioc2VsZiwgbmFtZSwgKiprd2FyZ3MpOgorICAgICAgICB0
YXJnZXRfdHlwZSA9IGt3YXJncy5nZXQoJ3RhcmdldF90eXBlJywgTm9uZSkKKyAgICAgICAgZXhh
Y3RfbWF0Y2ggPSBrd2FyZ3MuZ2V0KCdleGFjdF9tYXRjaCcsIEZhbHNlKQorICAgICAgICBpZiBy
ZS5zZWFyY2gocidcLng/aHRtbCcsIG5hbWUpOgorICAgICAgICAgICAgbmFtZSA9IG5hbWVbOm5h
bWUucmluZGV4KCcuJyldCisKKyAgICAgICAgKGNoZWNrc3VtX2ZpbGVzLCB0ZXh0X2ZpbGVzLCBp
bWFnZV9maWxlcykgPSBzZWxmLl9leHRyYWN0X291dHB1dF9maWxlcyhuYW1lLCBleGFjdF9tYXRj
aCkKKworICAgICAgICBvdXRwdXRzID0gW3NlbGYuX21ha2Vfb3V0cHV0X2Zyb21faW1hZ2UoaW1h
Z2VfZmlsZSwgY2hlY2tzdW1fZmlsZXMpIGZvciBpbWFnZV9maWxlIGluIGltYWdlX2ZpbGVzXQor
CisgICAgICAgIG91dHB1dHMgKz0gW3Rlc3RvdXRwdXQuVGV4dFRlc3RPdXRwdXQoc2VsZi5fcGxh
dGZvcm0sIHRleHRfZmlsZSkgZm9yIHRleHRfZmlsZSBpbiB0ZXh0X2ZpbGVzXQorCisgICAgICAg
IGlmIGV4YWN0X21hdGNoOgorICAgICAgICAgICAgb3V0cHV0cyA9IGZpbHRlcihsYW1iZGEgb3V0
cHV0OiBvdXRwdXQubmFtZSgpID09IG5hbWUsIG91dHB1dHMpCisKKyAgICAgICAgb3V0cHV0cyA9
IGZpbHRlcihsYW1iZGEgcjogdGFyZ2V0X3R5cGUgaW4gW05vbmUsIHIudHlwZSgpXSwgb3V0cHV0
cykKKworICAgICAgICByZXR1cm4gb3V0cHV0cworCisKK2NsYXNzIEFnZ3JlZ2F0ZVRlc3RPdXRw
dXRTZXQob2JqZWN0KToKKyAgICAiIiJTZXQgb2YgdGVzdCBvdXRwdXRzIGZyb20gYSBsaXN0IG9m
IGJ1aWxkZXJzIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJ1aWxkZXJzKToKKyAgICAgICAg
c2VsZi5fYnVpbGRlcnMgPSBidWlsZGVycworCisgICAgZGVmIG91dHB1dHNfZm9yKHNlbGYsIG5h
bWUsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHN1bShbYnVpbGRlci5vdXRwdXRzX2Zvcihu
YW1lLCAqKmt3YXJncykgZm9yIGJ1aWxkZXIgaW4gc2VsZi5fYnVpbGRlcnNdLCBbXSkKKworICAg
IGRlZiBidWlsZGVycyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2J1aWxkZXJzCmRpZmYg
LS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dHNldF91
bml0dGVzdC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0cHV0
c2V0X3VuaXR0ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmE3MGE1MzllODhhMzAwODc1ZWVjNmRhNTY2ZDdm
N2M0ZjA1YWJhODYKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2Nv
bW1vbi9uZXQvdGVzdG91dHB1dHNldF91bml0dGVzdC5weQpAQCAtMCwwICsxLDEyNSBAQAorIyEv
dXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6
CisjCisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisjIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
IElNUExJRUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisjIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisj
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitmcm9t
IHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uemlwX21vY2sgaW1wb3J0IE1vY2taaXAKK2ltcG9ydCB0
ZXN0b3V0cHV0c2V0CitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBUZXN0T3V0cHV0U2V0VGVz
dCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIF9vdXRwdXRzZXRfd2l0aF96aXAoc2VsZiwg
emlwLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiB0ZXN0b3V0cHV0c2V0LlRlc3RPdXRwdXRT
ZXQoJzxmYWtlLW91dHB1dHNldD4nLCAnPGZha2UtcGxhdGZvcm0+JywgemlwLCAqKmt3YXJncykK
KworICAgIGRlZiB0ZXN0X3RleHRfZmlsZXNfZ2V0X2ludGVycHJldGVkX2FzX3RleHRfb3V0cHV0
cyhzZWxmKToKKyAgICAgICAgemlwID0gTW9ja1ppcCgpCisgICAgICAgIHppcC5pbnNlcnQoJ2Zh
c3QvZG9tL3NvbWUtdGVzdC1hY3R1YWwudHh0JywgJ2FjdHVhbCBvdXRwdXRzJykKKyAgICAgICAg
YiA9IHNlbGYuX291dHB1dHNldF93aXRoX3ppcCh6aXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1
YWxzKDEsIGxlbihiLm91dHB1dHNfZm9yKCdmYXN0L2RvbS9zb21lLXRlc3QnKSkpCisgICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWxzKCdmYXN0L2RvbS9zb21lLXRlc3QnLCBiLm91dHB1dHNfZm9yKCdm
YXN0L2RvbS9zb21lLXRlc3QuaHRtbCcpWzBdLm5hbWUoKSkKKworICAgIGRlZiB0ZXN0X2ltYWdl
X2FuZF9jaGVja3N1bV9maWxlc19nZXRfaW50ZXJwcmV0ZWRfYXNfYV9zaW5nbGVfaW1hZ2Vfb3V0
cHV0KHNlbGYpOgorICAgICAgICB6aXAgPSBNb2NrWmlwKCkKKyAgICAgICAgemlwLmluc2VydCgn
ZmFzdC9kb20vc29tZS10ZXN0LWFjdHVhbC5jaGVja3N1bScsICdhYmMxMjMnKQorICAgICAgICB6
aXAuaW5zZXJ0KCdmYXN0L2RvbS9zb21lLXRlc3QtYWN0dWFsLnBuZycsICc8aW1hZ2UgZGF0YT4n
KQorICAgICAgICBiID0gc2VsZi5fb3V0cHV0c2V0X3dpdGhfemlwKHppcCkKKyAgICAgICAgb3V0
cHV0cyA9IGIub3V0cHV0c19mb3IoJ2Zhc3QvZG9tL3NvbWUtdGVzdCcpCisgICAgICAgIHNlbGYu
YXNzZXJ0RXF1YWxzKDEsIGxlbihvdXRwdXRzKSkKKyAgICAgICAgb3V0cHV0ID0gb3V0cHV0c1sw
XQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnaW1hZ2UnLCBvdXRwdXQudHlwZSgpKQorICAg
ICAgICBzZWxmLmFzc2VydEVxdWFscygnYWJjMTIzJywgb3V0cHV0LmNoZWNrc3VtKCkpCisKKyAg
ICBkZWYgdGVzdF9tdWx0aXBsZV9pbWFnZV9vdXRwdXRzX2FyZV9kZXRlY3RlZChzZWxmKToKKyAg
ICAgICAgemlwID0gTW9ja1ppcCgpCisgICAgICAgIHppcC5pbnNlcnQoJ3BsYXRmb3JtL3dpbi9m
YXN0L2RvbS9zb21lLXRlc3QtYWN0dWFsLmNoZWNrc3VtJywgJ2NoZWNrc3VtMScpCisgICAgICAg
IHppcC5pbnNlcnQoJ3BsYXRmb3JtL3dpbi9mYXN0L2RvbS9zb21lLXRlc3QtYWN0dWFsLnBuZycs
ICc8aW1hZ2UgZGF0YSAxPicpCisgICAgICAgIHppcC5pbnNlcnQoJ3BsYXRmb3JtL21hYy9mYXN0
L2RvbS9zb21lLXRlc3QtYWN0dWFsLmNoZWNrc3VtJywgJ2NoZWNrc3VtMicpCisgICAgICAgIHpp
cC5pbnNlcnQoJ3BsYXRmb3JtL21hYy9mYXN0L2RvbS9zb21lLXRlc3QtYWN0dWFsLnBuZycsICc8
aW1hZ2UgZGF0YSAyPicpCisgICAgICAgIGIgPSBzZWxmLl9vdXRwdXRzZXRfd2l0aF96aXAoemlw
KQorICAgICAgICBvdXRwdXRzID0gYi5vdXRwdXRzX2ZvcignZmFzdC9kb20vc29tZS10ZXN0JykK
KyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMiwgbGVuKG91dHB1dHMpKQorICAgICAgICBzZWxm
LmFzc2VydEZhbHNlKG91dHB1dHNbMF0uc2FtZV9jb250ZW50KG91dHB1dHNbMV0pKQorCisgICAg
ZGVmIHRlc3RfYWdncmVnYXRlX291dHB1dF9zZXRfY29ycmVjdGx5X3JldHJpZXZlc190ZXN0c19m
cm9tX211bHRpcGxlX291dHB1dF9zZXRzKHNlbGYpOgorICAgICAgICBvdXRwdXRzZXQxX3ppcCA9
IE1vY2taaXAoKQorICAgICAgICBvdXRwdXRzZXQxX3ppcC5pbnNlcnQoJ2Zhc3QvZG9tL3Rlc3Qt
YWN0dWFsLnR4dCcsICdsaW51eCB0ZXh0IG91dHB1dCcpCisgICAgICAgIG91dHB1dHNldDEgPSB0
ZXN0b3V0cHV0c2V0LlRlc3RPdXRwdXRTZXQoJ2xpbnV4LW91dHB1dHNldCcsICdsaW51eCcsIG91
dHB1dHNldDFfemlwKQorICAgICAgICBvdXRwdXRzZXQyX3ppcCA9IE1vY2taaXAoKQorICAgICAg
ICBvdXRwdXRzZXQyX3ppcC5pbnNlcnQoJ2Zhc3QvZG9tL3Rlc3QtYWN0dWFsLnR4dCcsICd3aW5k
b3dzIHRleHQgb3V0cHV0JykKKyAgICAgICAgb3V0cHV0c2V0MiA9IHRlc3RvdXRwdXRzZXQuVGVz
dE91dHB1dFNldCgnd2luLW91dHB1dHNldCcsICd3aW4nLCBvdXRwdXRzZXQyX3ppcCkKKworICAg
ICAgICBiID0gdGVzdG91dHB1dHNldC5BZ2dyZWdhdGVUZXN0T3V0cHV0U2V0KFtvdXRwdXRzZXQx
LCBvdXRwdXRzZXQyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMiwgbGVuKGIub3V0cHV0
c19mb3IoJ2Zhc3QvZG9tL3Rlc3QnKSkpCisKKyAgICBkZWYgdGVzdF9jYW5faW5mZXJfcGxhdGZv
cm1fZnJvbV9wYXRoX2lmX25vbmVfcHJvdmlkZWQoc2VsZik6CisgICAgICAgIHppcCA9IE1vY2ta
aXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCdwbGF0Zm9ybS93aW4vc29tZS10ZXN0LWV4cGVjdGVk
LnBuZycsICc8aW1hZ2UgZGF0YT4nKQorICAgICAgICB6aXAuaW5zZXJ0KCdwbGF0Zm9ybS93aW4v
c29tZS10ZXN0LWV4cGVjdGVkLmNoZWNrc3VtJywgJ2FiYzEyMycpCisgICAgICAgIGIgPSB0ZXN0
b3V0cHV0c2V0LlRlc3RPdXRwdXRTZXQoJ2xvY2FsIExheW91dFRlc3RzIG91dHB1dHNldCcsIE5v
bmUsIHppcCkKKworICAgICAgICBvdXRwdXRzID0gYi5vdXRwdXRzX2Zvcignc29tZS10ZXN0JykK
KyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgbGVuKG91dHB1dHMpKQorICAgICAgICBzZWxm
LmFzc2VydEVxdWFscygnd2luJywgb3V0cHV0c1swXS5wbGF0Zm9ybSgpKQorCisgICAgZGVmIHRl
c3RfdGVzdF9leHRlbnNpb25faXNfaWdub3JlZChzZWxmKToKKyAgICAgICAgemlwID0gTW9ja1pp
cCgpCisgICAgICAgIHppcC5pbnNlcnQoJ3Rlc3QvdGVzdC1hLWFjdHVhbC50eHQnLCAnYWN0dWFs
IG91dHB1dHMnKQorICAgICAgICBiID0gc2VsZi5fb3V0cHV0c2V0X3dpdGhfemlwKHppcCkKKyAg
ICAgICAgb3V0cHV0cyA9IGIub3V0cHV0c19mb3IoJ3Rlc3QvdGVzdC1hLmh0bWwnKQorICAgICAg
ICBzZWxmLmFzc2VydEVxdWFscygxLCBsZW4ob3V0cHV0cykpCisgICAgICAgIHNlbGYuYXNzZXJ0
RXF1YWxzKCd0ZXN0L3Rlc3QtYScsIG91dHB1dHNbMF0ubmFtZSgpKQorCisgICAgZGVmIHRlc3Rf
ZXhpc3Rpbmdfb3V0cHV0c19hcmVfbWFya2VkX2FzX3N1Y2goc2VsZik6CisgICAgICAgIHppcCA9
IE1vY2taaXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCd0ZXN0L3Rlc3QtYS1leHBlY3RlZC50eHQn
LCAnZXhwZWN0ZWQgb3V0cHV0cycpCisgICAgICAgIGIgPSBzZWxmLl9vdXRwdXRzZXRfd2l0aF96
aXAoemlwKQorICAgICAgICBvdXRwdXRzID0gYi5vdXRwdXRzX2ZvcigndGVzdC90ZXN0LWEuaHRt
bCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbihvdXRwdXRzKSkKKyAgICAgICAg
c2VsZi5hc3NlcnRGYWxzZShvdXRwdXRzWzBdLmlzX2FjdHVhbCgpKQorCisgICAgZGVmIHRlc3Rf
b25seV9yZXR1cm5zX291dHB1dHNfb2Zfc3BlY2lmaWVkX3R5cGUoc2VsZik6CisgICAgICAgIHpp
cCA9IE1vY2taaXAoKQorICAgICAgICB6aXAuaW5zZXJ0KCd0ZXN0L3Rlc3QtYS1leHBlY3RlZC50
eHQnLCAnZXhwZWN0ZWQgb3V0cHV0cycpCisgICAgICAgIHppcC5pbnNlcnQoJ3Rlc3QvdGVzdC1h
LWV4cGVjdGVkLmNoZWNrc3VtJywgJ2V4cGVjdGVkIG91dHB1dHMnKQorICAgICAgICB6aXAuaW5z
ZXJ0KCd0ZXN0L3Rlc3QtYS1leHBlY3RlZC5wbmcnLCAnZXhwZWN0ZWQgb3V0cHV0cycpCisgICAg
ICAgIGIgPSBzZWxmLl9vdXRwdXRzZXRfd2l0aF96aXAoemlwKQorCisgICAgICAgIG91dHB1dHMg
PSBiLm91dHB1dHNfZm9yKCd0ZXN0L3Rlc3QtYS5odG1sJykKKyAgICAgICAgdGV4dF9vdXRwdXRz
ID0gYi5vdXRwdXRzX2ZvcigndGVzdC90ZXN0LWEuaHRtbCcsIHRhcmdldF90eXBlPSd0ZXh0JykK
KyAgICAgICAgaW1hZ2Vfb3V0cHV0cyA9IGIub3V0cHV0c19mb3IoJ3Rlc3QvdGVzdC1hLmh0bWwn
LCB0YXJnZXRfdHlwZT0naW1hZ2UnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDIsIGxl
bihvdXRwdXRzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgbGVuKHRleHRfb3V0cHV0
cykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbihpbWFnZV9vdXRwdXRzKSkKKyAg
ICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoJ3RleHQnLCB0ZXh0X291dHB1dHNbMF0udHlwZSgpKQor
ICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnaW1hZ2UnLCBpbWFnZV9vdXRwdXRzWzBdLnR5cGUo
KSkKKworICAgIGRlZiB0ZXN0X2V4Y2x1ZGVfZXhwZWN0ZWRfb3V0cHV0c193b3JrcyhzZWxmKToK
KyAgICAgICAgemlwID0gTW9ja1ppcCgpCisgICAgICAgIHppcC5pbnNlcnQoJ3Rlc3QtZXhwZWN0
ZWQudHh0JywgICdleHBlY3RlZCBvdXRwdXRzIHN0b3JlZCBvbiBzZXJ2ZXIgZm9yIHNvbWUgcmVh
c29uJykKKyAgICAgICAgYiA9IHNlbGYuX291dHB1dHNldF93aXRoX3ppcCh6aXAsIGluY2x1ZGVf
ZXhwZWN0ZWQ9RmFsc2UpCisgICAgICAgIG91dHB1dHMgPSBiLm91dHB1dHNfZm9yKCd0ZXN0Jywg
dGFyZ2V0X3R5cGU9Tm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMCwgbGVuKG91dHB1
dHMpKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpk
aWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL3ppcF9tb2Nr
LnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL3ppcF9tb2NrLnB5Cm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAuLmRjZmFiYTcwZDA4YmI3YTZkMTk3ZGU1YmY4OTIzZTcwMzkwZTljMGUKLS0tIC9k
ZXYvbnVsbAorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vemlwX21v
Y2sucHkKQEAgLTAsMCArMSw1NSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUg
bWV0OgorIworIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorIyBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUworIyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RAorIyBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKwor
ZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVtLmZpbGVzZXQgaW1wb3J0IEZpbGVTZXRGaWxlSGFu
ZGxlCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZmlsZXN5c3RlbV9tb2NrIGltcG9ydCBN
b2NrRmlsZVN5c3RlbQorCisKK2NsYXNzIE1vY2taaXAob2JqZWN0KToKKyAgICAiIiJBIG1vY2sg
emlwIGZpbGUgdGhhdCBjYW4gaGF2ZSBuZXcgZmlsZXMgaW5zZXJ0ZWQgaW50byBpdC4iIiIKKyAg
ICBkZWYgX19pbml0X18oc2VsZiwgZmlsZXN5c3RlbT1Ob25lKToKKyAgICAgICAgc2VsZi5fZmls
ZXN5c3RlbSA9IGZpbGVzeXN0ZW0gb3IgTW9ja0ZpbGVTeXN0ZW0oKQorICAgICAgICBzZWxmLl9m
aWxlcyA9IHt9CisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJNb2Nr
WmlwIgorCisgICAgZGVmIGluc2VydChzZWxmLCBmaWxlbmFtZSwgY29udGVudCk6CisgICAgICAg
IHNlbGYuX2ZpbGVzW2ZpbGVuYW1lXSA9IGNvbnRlbnQKKworICAgIGRlZiBuYW1lbGlzdChzZWxm
KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGVzLmtleXMoKQorCisgICAgZGVmIG9wZW4oc2Vs
ZiwgZmlsZW5hbWUpOgorICAgICAgICByZXR1cm4gRmlsZVNldEZpbGVIYW5kbGUoc2VsZiwgZmls
ZW5hbWUpCisKKyAgICBkZWYgcmVhZChzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHJldHVybiBz
ZWxmLl9maWxlc1tmaWxlbmFtZV0KKworICAgIGRlZiBleHRyYWN0KHNlbGYsIGZpbGVuYW1lLCBw
YXRoKToKKyAgICAgICAgZnVsbF9wYXRoID0gc2VsZi5fZmlsZXN5c3RlbS5qb2luKHBhdGgsIGZp
bGVuYW1lKQorICAgICAgICBjb250ZW50cyA9IHNlbGYub3BlbihmaWxlbmFtZSkuY29udGVudHMo
KQorICAgICAgICBzZWxmLl9maWxlc3lzdGVtLndyaXRlX3RleHRfZmlsZShmdWxsX3BhdGgsIGNv
bnRlbnRzKQorCisgICAgZGVmIGRlbGV0ZShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHNlbGYu
X2ZpbGVzW2ZpbGVuYW1lXSA9IE5vbmUK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>81433</attachid>
            <date>2011-02-06 16:29:47 -0800</date>
            <delta_ts>2011-02-06 17:01:05 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-52136-20110207112945.patch</filename>
            <type>text/plain</type>
            <size>30216</size>
            <attacher name="James Kozianski">koz</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rvb2xzL0NoYW5nZUxvZwppbmRleCBhNzYx
ZGM3OTAxMTVkNGI0YjMwNGY0OTA2YTYwZDhmZGI2Y2QyZTljLi5hOGZhZmI3NGFlYjc3YWZhZDUy
YjE5MmYzMTRiOTA3MDQzMTdmMWE2IDEwMDY0NAotLS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIv
VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjIgQEAKKzIwMTEtMDItMDYgIEphbWVzIEtvemlh
bnNraSAgPGtvekBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgT2phbiBWYWZh
aS4KKworICAgICAgICBBZGQgY2xhc3NlcyBmb3IgcmVwcmVzZW50aW5nIHRlc3Qgb3V0cHV0cy4K
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUyMTM2CisK
KyAgICAgICAgVGhlc2UgY2xhc3NlcyB3aWxsIG1ha2UgaXQgZWFzaWVyIHRvIHdyaXRlIHNjcmlw
dHMgdGhhdCBkZWFsIHdpdGggdGVzdAorICAgICAgICBvdXRwdXRzIHN1Y2ggYXMgcmViYXNlbGlu
aW5nIGFuZCBkZWR1cGluZyBzY3JpcHRzLiBUaGUgaW50ZW50IGlzIHRoYXQKKyAgICAgICAgZXZl
bnR1YWxseSB3ZSB3aWxsIGJlIGhhdmUgYnVpbGRib3QgcmV0dXJuIFRlc3RPdXRwdXRzIGZvciBh
CisgICAgICAgIHBhcnRpY3VsYXIgYnVpbGQgd2hpY2ggY2FuIGJlIGNvbXBhcmVkIHdpdGggVGVz
dE91dHB1dHMgZGVyaXZlZCBmcm9tIGEKKyAgICAgICAgbG9jYWwgTGF5b3V0VGVzdHMgZGlyZWN0
b3J5LgorCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Rlc3RvdXRwdXQu
cHk6IEFkZGVkLgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0
cHV0X3VuaXR0ZXN0LnB5OiBBZGRlZC4KKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1v
bi9uZXQvdGVzdG91dHB1dHNldC5weTogQWRkZWQuCisgICAgICAgICogU2NyaXB0cy93ZWJraXRw
eS9jb21tb24vbmV0L3Rlc3RvdXRwdXRzZXRfdW5pdHRlc3QucHk6IEFkZGVkLgorICAgICAgICAq
IFNjcmlwdHMvd2Via2l0cHkvY29tbW9uL3N5c3RlbS96aXBfbW9jay5weTogQWRkZWQuCisKIDIw
MTEtMDItMDYgIFJvYmVydCBIb2dhbiAgPHJvYmVydEB3ZWJraXQub3JnPgogCiAgICAgICAgIFJl
dmlld2VkIGJ5IEFuZHJlYXMgS2xpbmcuCmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtp
dHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29t
bW9uL25ldC90ZXN0b3V0cHV0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjM3YzE0NDViMTEzM2FiZTQ1N2MyZjhh
ZWE1MTYyOWRkYjMwZDYzZTgKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtp
dHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dC5weQpAQCAtMCwwICsxLDE3OSBAQAorIyEvdXNyL2Jp
bi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisj
IDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJ
RUQKKyMgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTCisjIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFO
WSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQgb3MK
K2ltcG9ydCByZQorCisKK2NsYXNzIE5haXZlSW1hZ2VEaWZmZXIob2JqZWN0KToKKyAgICBkZWYg
c2FtZV9pbWFnZShzZWxmLCBpbWcxLCBpbWcyKToKKyAgICAgICAgcmV0dXJuIGltZzEgPT0gaW1n
MgorCisKK2NsYXNzIFRlc3RPdXRwdXQob2JqZWN0KToKKyAgICAiIiJSZXByZXNlbnRzIHRoZSBv
dXRwdXQgdGhhdCBhIHNpbmdsZSBsYXlvdXQgdGVzdCBnZW5lcmF0ZXMgd2hlbiBpdCBpcyBydW4K
KyAgICBvbiBhIHBhcnRpY3VsYXIgcGxhdGZvcm0uCisgICAgTm90ZSB0aGF0IHRoaXMgaXMgdGhl
IHJhdyBvdXRwdXQgdGhhdCBpcyBwcm9kdWNlZCB3aGVuIHRoZSBsYXlvdXQgdGVzdCBpcworICAg
IHJ1biwgbm90IHRoZSByZXN1bHRzIG9mIHRoZSBzdWJzZXF1ZW50IGNvbXBhcmlzb24gYmV0d2Vl
biB0aGF0IG91dHB1dCBhbmQKKyAgICB0aGUgZXhwZWN0ZWQgb3V0cHV0LiIiIgorICAgIGRlZiBf
X2luaXRfXyhzZWxmLCBwbGF0Zm9ybSwgb3V0cHV0X3R5cGUsIGZpbGVzKToKKyAgICAgICAgc2Vs
Zi5fb3V0cHV0X3R5cGUgPSBvdXRwdXRfdHlwZQorICAgICAgICBzZWxmLl9maWxlcyA9IGZpbGVz
CisgICAgICAgIGZpbGUgPSBmaWxlc1swXSAgIyBQaWNrIHNvbWUgZmlsZSB0byBkbyB0ZXN0IG5h
bWUgY2FsY3VsYXRpb24uCisgICAgICAgIHNlbGYuX25hbWUgPSBzZWxmLl9leHRyYWN0X3Rlc3Rf
bmFtZShmaWxlLm5hbWUoKSkKKyAgICAgICAgc2VsZi5faXNfYWN0dWFsID0gJy1hY3R1YWwuJyBp
biBmaWxlLm5hbWUoKQorCisgICAgICAgIHNlbGYuX3BsYXRmb3JtID0gcGxhdGZvcm0gb3Igc2Vs
Zi5fZXh0cmFjdF9wbGF0Zm9ybShmaWxlLm5hbWUoKSkKKworICAgIGRlZiBfZXh0cmFjdF9wbGF0
Zm9ybShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgICIiIkNhbGN1bGF0ZXMgdGhlIHBsYXRmb3Jt
IGZyb20gdGhlIG5hbWUgb2YgdGhlIGZpbGUgaWYgaXQgaXNuJ3Qga25vd24gYWxyZWFkeSIiIgor
ICAgICAgICBwYXRoID0gcmUuc3BsaXQob3MucGF0aC5zZXAsIGZpbGVuYW1lKQorICAgICAgICBp
ZiAncGxhdGZvcm0nIGluIHBhdGg6CisgICAgICAgICAgICByZXR1cm4gcGF0aFtwYXRoLmluZGV4
KCdwbGF0Zm9ybScpICsgMV0KKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBfZXh0cmFj
dF90ZXN0X25hbWUoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBwYXRoID0gcmUuc3BsaXQob3Mu
cGF0aC5zZXAsIGZpbGVuYW1lKQorICAgICAgICBpZiAnTGF5b3V0VGVzdHMnIGluIHBhdGg6Cisg
ICAgICAgICAgICBwYXRoID0gcGF0aFsxICsgcGF0aC5pbmRleCgnTGF5b3V0VGVzdHMnKTpdCisg
ICAgICAgIGlmICdsYXlvdXQtdGVzdC1yZXN1bHRzJyBpbiBwYXRoOgorICAgICAgICAgICAgcGF0
aCA9IHBhdGhbMSArIHBhdGguaW5kZXgoJ2xheW91dC10ZXN0LXJlc3VsdHMnKTpdCisgICAgICAg
IGlmICdwbGF0Zm9ybScgaW4gcGF0aDoKKyAgICAgICAgICAgIHBhdGggPSBwYXRoWzIgKyBwYXRo
LmluZGV4KCdwbGF0Zm9ybScpOl0KKworICAgICAgICBmaWxlbmFtZSA9IHBhdGhbLTFdCisgICAg
ICAgIGZpbGVuYW1lID0gcmUuc3ViKCctZXhwZWN0ZWRcLi4qJCcsICcnLCBmaWxlbmFtZSkKKyAg
ICAgICAgZmlsZW5hbWUgPSByZS5zdWIoJy1hY3R1YWxcLi4qJCcsICcnLCBmaWxlbmFtZSkKKyAg
ICAgICAgcGF0aFstMV0gPSBmaWxlbmFtZQorICAgICAgICByZXR1cm4gb3MucGF0aC5zZXAuam9p
bihwYXRoKQorCisgICAgZGVmIHNhdmVfdG8oc2VsZiwgcGF0aCk6CisgICAgICAgICIiIkhhdmUg
dGhlIGZpbGVzIGluIHRoaXMgVGVzdE91dHB1dCB3cml0ZSB0aGVtc2VsdmVzIHRvIHRoZSBkaXNr
IGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uIiIiCisgICAgICAgIGZvciBmaWxlIGluIHNlbGYu
X2ZpbGVzOgorICAgICAgICAgICAgZmlsZS5zYXZlX3RvKHBhdGgpCisKKyAgICBkZWYgaXNfYWN0
dWFsKHNlbGYpOgorICAgICAgICAiIiJJcyB0aGlzIG91dHB1dCB0aGUgYWN0dWFsIG91dHB1dCBv
ZiBhIHRlc3Q/IChBcyBvcHBvc2VkIHRvIGV4cGVjdGVkIG91dHB1dC4pIiIiCisgICAgICAgIHJl
dHVybiBzZWxmLl9pc19hY3R1YWwKKworICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAgICAiIiJU
aGUgbmFtZSBvZiB0aGlzIHRlc3QgKGRvZXNuJ3QgaW5jbHVkZSBleHRlbnNpb24pIiIiCisgICAg
ICAgIHJldHVybiBzZWxmLl9uYW1lCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAg
ICAgICAgcmV0dXJuIChvdGhlciAhPSBOb25lIGFuZAorICAgICAgICAgICAgICAgIHNlbGYubmFt
ZSgpID09IG90aGVyLm5hbWUoKSBhbmQKKyAgICAgICAgICAgICAgICBzZWxmLnR5cGUoKSA9PSBv
dGhlci50eXBlKCkgYW5kCisgICAgICAgICAgICAgICAgc2VsZi5wbGF0Zm9ybSgpID09IG90aGVy
LnBsYXRmb3JtKCkgYW5kCisgICAgICAgICAgICAgICAgc2VsZi5pc19hY3R1YWwoKSA9PSBvdGhl
ci5pc19hY3R1YWwoKSBhbmQKKyAgICAgICAgICAgICAgICBzZWxmLnNhbWVfY29udGVudChvdGhl
cikpCisKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHJldHVybiBoYXNoKHN0cihz
ZWxmLm5hbWUoKSkgKyBzdHIoc2VsZi50eXBlKCkpICsgc3RyKHNlbGYucGxhdGZvcm0oKSkpCisK
KyAgICBkZWYgaXNfbmV3X2Jhc2VsaW5lX2ZvcihzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVy
biAoc2VsZi5uYW1lKCkgPT0gb3RoZXIubmFtZSgpIGFuZAorICAgICAgICAgICAgICAgIHNlbGYu
dHlwZSgpID09IG90aGVyLnR5cGUoKSBhbmQKKyAgICAgICAgICAgICAgICBzZWxmLnBsYXRmb3Jt
KCkgPT0gb3RoZXIucGxhdGZvcm0oKSBhbmQKKyAgICAgICAgICAgICAgICBzZWxmLmlzX2FjdHVh
bCgpIGFuZAorICAgICAgICAgICAgICAgIChub3Qgb3RoZXIuaXNfYWN0dWFsKCkpKQorCisgICAg
ZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIGFjdHVhbF9zdHIgPSAnW0FdICcgaWYgc2VsZi5p
c19hY3R1YWwoKSBlbHNlICcnCisgICAgICAgIHJldHVybiAiVGVzdE91dHB1dFslcy8lc10gJXMl
cyIgJSAoc2VsZi5fcGxhdGZvcm0sIHNlbGYuX291dHB1dF90eXBlLCBhY3R1YWxfc3RyLCBzZWxm
Lm5hbWUoKSkKKworICAgIGRlZiB0eXBlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fb3V0
cHV0X3R5cGUKKworICAgIGRlZiBwbGF0Zm9ybShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYu
X3BsYXRmb3JtCisKKyAgICBkZWYgX3BhdGhfdG9fcGxhdGZvcm0oc2VsZik6CisgICAgICAgICIi
IlJldHVybnMgdGhlIHBhdGggdGhhdCB0ZXN0cyBmb3IgdGhpcyBwbGF0Zm9ybSBhcmUgc3RvcmVk
IGluLiIiIgorICAgICAgICBpZiBzZWxmLl9wbGF0Zm9ybSBpcyBOb25lOgorICAgICAgICAgICAg
cmV0dXJuICIiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5qb2lu
KCJzZWxmLl9wbGF0Zm9ybSIsIHNlbGYuX3BsYXRmb3JtKQorCisgICAgZGVmIF9zYXZlX2V4cGVj
dGVkX3Jlc3VsdChzZWxmLCBmaWxlLCBwYXRoKToKKyAgICAgICAgcGF0aCA9IG9zLnBhdGguam9p
bihwYXRoLCBzZWxmLl9wYXRoX3RvX3BsYXRmb3JtKCkpCisgICAgICAgIGV4dGVuc2lvbiA9IG9z
LnBhdGguc3BsaXRleHQoZmlsZS5uYW1lKCkpWzFdCisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5u
YW1lKCkgKyAnLWV4cGVjdGVkJyArIGV4dGVuc2lvbgorICAgICAgICBmaWxlLnNhdmVfdG8ocGF0
aCwgZmlsZW5hbWUpCisKKyAgICBkZWYgc2F2ZV9leHBlY3RlZF9yZXN1bHRzKHNlbGYsIHBhdGhf
dG9fbGF5b3V0X3Rlc3RzKToKKyAgICAgICAgIiIiU2F2ZSB0aGUgZmlsZXMgb2YgdGhpcyBUZXN0
T3V0cHV0IHRvIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3RvcnkKKyAgICAgICAgaW5zaWRlIHRoZSBM
YXlvdXRUZXN0cyBkaXJlY3RvcnkuIFR5cGljYWxseSB0aGlzIG1lYW5zIHRoYXQgdGhlc2UgZmls
ZXMKKyAgICAgICAgd2lsbCBiZSBzYXZlZCBpbiAiTGF5b3V0VGVzdHMvcGxhdGZvcm0vPHBsYXRm
b3JtPi8sIG9yIHNpbXBseQorICAgICAgICBMYXlvdXRUZXN0cyBpZiB0aGUgcGxhdGZvcm0gaXMg
Tm9uZS4iIiIKKyAgICAgICAgZm9yIGZpbGUgaW4gc2VsZi5fZmlsZXM6CisgICAgICAgICAgICBz
ZWxmLl9zYXZlX2V4cGVjdGVkX3Jlc3VsdChmaWxlLCBwYXRoX3RvX2xheW91dF90ZXN0cykKKwor
ICAgIGRlZiBkZWxldGUoc2VsZik6CisgICAgICAgICIiIkRlbGV0ZXMgdGhlIGZpbGVzIHRoYXQg
Y29tcHJpc2UgdGhpcyBUZXN0T3V0cHV0IGZyb20gZGlzay4gVGhpcworICAgICAgICBmYWlscyBp
ZiB0aGUgZmlsZXMgYXJlIHZpcnR1YWwgZmlsZXMgKGVnOiB0aGUgZmlsZXMgbWF5IHJlc2lkZSBp
bnNpZGUgYQorICAgICAgICByZW1vdGUgemlwIGZpbGUpLiIiIgorICAgICAgICBmb3IgZmlsZSBp
biBzZWxmLl9maWxlczoKKyAgICAgICAgICAgIGZpbGUuZGVsZXRlKCkKKworCitjbGFzcyBUZXh0
VGVzdE91dHB1dChUZXN0T3V0cHV0KToKKyAgICAiIiJSZXByZXNlbnRzIGEgdGV4dCBvdXRwdXQg
b2YgYSBzaW5nbGUgdGVzdCBvbiBhIHNpbmdsZSBwbGF0Zm9ybSIiIgorICAgIGRlZiBfX2luaXRf
XyhzZWxmLCBwbGF0Zm9ybSwgdGV4dF9maWxlKToKKyAgICAgICAgc2VsZi5fdGV4dF9maWxlID0g
dGV4dF9maWxlCisgICAgICAgIFRlc3RPdXRwdXQuX19pbml0X18oc2VsZiwgcGxhdGZvcm0sICd0
ZXh0JywgW3RleHRfZmlsZV0pCisKKyAgICBkZWYgc2FtZV9jb250ZW50KHNlbGYsIG90aGVyKToK
KyAgICAgICAgcmV0dXJuIHNlbGYuX3RleHRfZmlsZS5jb250ZW50cygpID09IG90aGVyLl90ZXh0
X2ZpbGUuY29udGVudHMoKQorCisgICAgZGVmIHJldGFyZ2V0KHNlbGYsIHBsYXRmb3JtKToKKyAg
ICAgICAgcmV0dXJuIFRleHRUZXN0T3V0cHV0KHBsYXRmb3JtLCBzZWxmLl90ZXh0X2ZpbGUpCisK
KworY2xhc3MgSW1hZ2VUZXN0T3V0cHV0KFRlc3RPdXRwdXQpOgorICAgIGltYWdlX2RpZmZlciA9
IE5haXZlSW1hZ2VEaWZmZXIoKQorICAgICIiIlJlcHJlc2VudHMgYW4gaW1hZ2Ugb3V0cHV0IG9m
IGEgc2luZ2xlIHRlc3Qgb24gYSBzaW5nbGUgcGxhdGZvcm0iIiIKKyAgICBkZWYgX19pbml0X18o
c2VsZiwgcGxhdGZvcm0sIGltYWdlX2ZpbGUsIGNoZWNrc3VtX2ZpbGUpOgorICAgICAgICBzZWxm
Ll9jaGVja3N1bV9maWxlID0gY2hlY2tzdW1fZmlsZQorICAgICAgICBzZWxmLl9pbWFnZV9maWxl
ID0gaW1hZ2VfZmlsZQorICAgICAgICBmaWxlcyA9IGZpbHRlcihib29sLCBbc2VsZi5fY2hlY2tz
dW1fZmlsZSwgc2VsZi5faW1hZ2VfZmlsZV0pCisgICAgICAgIFRlc3RPdXRwdXQuX19pbml0X18o
c2VsZiwgcGxhdGZvcm0sICdpbWFnZScsIGZpbGVzKQorCisgICAgZGVmIGhhc19jaGVja3N1bShz
ZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NoZWNrc3VtX2ZpbGUgaXMgbm90IE5vbmUKKwor
ICAgIGRlZiBzYW1lX2NvbnRlbnQoc2VsZiwgb3RoZXIpOgorICAgICAgICAjIEZJWE1FIFRoaXMg
c2hvdWxkIG5vdCBhc3N1bWUgdGhhdCBjaGVja3N1bXMgYXJlIHVwIHRvIGRhdGUuCisgICAgICAg
IGlmIHNlbGYuaGFzX2NoZWNrc3VtKCkgYW5kIG90aGVyLmhhc19jaGVja3N1bSgpOgorICAgICAg
ICAgICAgcmV0dXJuIHNlbGYuX2NoZWNrc3VtX2ZpbGUuY29udGVudHMoKSA9PSBvdGhlci5fY2hl
Y2tzdW1fZmlsZS5jb250ZW50cygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmX2Nv
bnRlbnRzID0gc2VsZi5faW1hZ2VfZmlsZS5jb250ZW50cygpCisgICAgICAgICAgICBvdGhlcl9j
b250ZW50cyA9IG90aGVyLl9pbWFnZV9maWxlLmNvbnRlbnRzKCkKKyAgICAgICAgICAgIHJldHVy
biBJbWFnZVRlc3RPdXRwdXQuaW1hZ2VfZGlmZmVyLnNhbWVfaW1hZ2Uoc2VsZl9jb250ZW50cywg
b3RoZXJfY29udGVudHMpCisKKyAgICBkZWYgcmV0YXJnZXQoc2VsZiwgcGxhdGZvcm0pOgorICAg
ICAgICByZXR1cm4gSW1hZ2VUZXN0T3V0cHV0KHBsYXRmb3JtLCBzZWxmLl9pbWFnZV9maWxlLCBz
ZWxmLl9jaGVja3N1bV9maWxlKQorCisgICAgZGVmIGNoZWNrc3VtKHNlbGYpOgorICAgICAgICBy
ZXR1cm4gc2VsZi5fY2hlY2tzdW1fZmlsZS5jb250ZW50cygpCmRpZmYgLS1naXQgYS9Ub29scy9T
Y3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dF91bml0dGVzdC5weSBiL1Rvb2xz
L1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0cHV0X3VuaXR0ZXN0LnB5Cm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLmFkMzhjYTYxMjU0ZjE1NGIwMzZiYTM2YjA1OGYzNTIwM2Y5MWUyODYKLS0tIC9kZXYv
bnVsbAorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dF91
bml0dGVzdC5weQpAQCAtMCwwICsxLDEzMyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENv
cHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklC
VVRPUlMgIkFTIElTIiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFS
RQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitpbXBvcnQgcmUKK2ltcG9ydCB0ZXN0b3V0cHV0
CitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBGYWtlRmlsZShvYmplY3QpOgorICAgIGRlZiBf
X2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgY29udGVudHM9ImZha2UgY29udGVudHMiKToKKyAgICAg
ICAgc2VsZi5fZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBzZWxmLl9jb250ZW50cyA9IGNv
bnRlbnRzCisKKyAgICBkZWYgbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGVu
YW1lCisKKyAgICBkZWYgY29udGVudHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jb250
ZW50cworCisKK2NsYXNzIEZha2VUZXN0T3V0cHV0KHRlc3RvdXRwdXQuVGVzdE91dHB1dCk6Cisg
ICAgZGVmIF9faW5pdF9fKHNlbGYsIHBsYXRmb3JtLCBvdXRwdXRfdHlwZSwgY29udGVudHMsIGlz
X2V4cGVjdGVkPUZhbHNlKToKKyAgICAgICAgc2VsZi5fb3V0cHV0X3R5cGUgPSBvdXRwdXRfdHlw
ZQorICAgICAgICBzZWxmLl9jb250ZW50cyA9IGNvbnRlbnRzCisgICAgICAgIHNlbGYuX2lzX2V4
cGVjdGVkID0gaXNfZXhwZWN0ZWQKKyAgICAgICAgYWN0dWFsID0gJ2FjdHVhbCcKKyAgICAgICAg
aWYgaXNfZXhwZWN0ZWQ6CisgICAgICAgICAgICBhY3R1YWwgPSAnZXhwZWN0ZWQnCisgICAgICAg
IHRlc3RfbmFtZSA9ICdhbm9ueW1vdXMtdGVzdC0lcy50eHQnICUgYWN0dWFsCisgICAgICAgIGZp
bGUgPSBGYWtlRmlsZSh0ZXN0X25hbWUsIGNvbnRlbnRzKQorICAgICAgICBzdXBlcihGYWtlVGVz
dE91dHB1dCwgc2VsZikuX19pbml0X18ocGxhdGZvcm0sIG91dHB1dF90eXBlLCBbZmlsZV0pCisK
KyAgICBkZWYgY29udGVudHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jb250ZW50cwor
CisgICAgZGVmIHJldGFyZ2V0KHNlbGYsIHBsYXRmb3JtKToKKyAgICAgICAgcmV0dXJuIEZha2VU
ZXN0T3V0cHV0KHBsYXRmb3JtLCBzZWxmLl9vdXRwdXRfdHlwZSwgc2VsZi5fY29udGVudHMsIHNl
bGYuX2lzX2V4cGVjdGVkKQorCisKK2NsYXNzIFRlc3RPdXRwdXRUZXN0KHVuaXR0ZXN0LlRlc3RD
YXNlKToKKyAgICBkZWYgX2NoZWNrX25hbWUoc2VsZiwgZmlsZW5hbWUsIGV4cGVjdGVkX3Rlc3Rf
bmFtZSk6CisgICAgICAgIHIgPSB0ZXN0b3V0cHV0LlRleHRUZXN0T3V0cHV0KE5vbmUsIEZha2VG
aWxlKGZpbGVuYW1lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0ZWRfdGVzdF9u
YW1lLCByLm5hbWUoKSkKKworICAgIGRlZiBfY2hlY2tfcGxhdGZvcm0oc2VsZiwgZmlsZW5hbWUs
IGV4cGVjdGVkX3BsYXRmb3JtKToKKyAgICAgICAgciA9IHRlc3RvdXRwdXQuVGV4dFRlc3RPdXRw
dXQoTm9uZSwgRmFrZUZpbGUoZmlsZW5hbWUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhl
eHBlY3RlZF9wbGF0Zm9ybSwgci5wbGF0Zm9ybSgpKQorCisgICAgZGVmIHRlc3RfZXh0cmFjdHNf
bmFtZV9jb3JyZWN0bHkoc2VsZik6CisgICAgICAgIHNlbGYuX2NoZWNrX25hbWUoJ0xheW91dFRl
c3RzL2Zhc3QvZG9tL2EtZXhwZWN0ZWQudHh0JywgJ2Zhc3QvZG9tL2EnKQorICAgICAgICBzZWxm
Ll9jaGVja19uYW1lKCdMYXlvdXRUZXN0cy9mYXN0L2RvbS9hLWFjdHVhbC50eHQnLCAnZmFzdC9k
b20vYScpCisgICAgICAgIHNlbGYuX2NoZWNrX25hbWUoJ0xheW91dFRlc3RzL3BsYXRmb3JtL3dp
bi9mYXN0L2EtZXhwZWN0ZWQudHh0JywgJ2Zhc3QvYScpCisgICAgICAgIHNlbGYuX2NoZWNrX25h
bWUoJ0xheW91dFRlc3RzL3BsYXRmb3JtL3dpbi9mYXN0L2EtZXhwZWN0ZWQuY2hlY2tzdW0nLCAn
ZmFzdC9hJykKKyAgICAgICAgc2VsZi5fY2hlY2tfbmFtZSgnZmFzdC9kb20vdGVzdC1leHBlY3Rl
ZC50eHQnLCAnZmFzdC9kb20vdGVzdCcpCisgICAgICAgIHNlbGYuX2NoZWNrX25hbWUoJ2xheW91
dC10ZXN0LXJlc3VsdHMvZmFzdC9hLWFjdHVhbC5jaGVja3N1bScsICdmYXN0L2EnKQorCisgICAg
ZGVmIHRlc3RfZXh0cmFjdHNfcGxhdGZvcm1fY29ycmVjdGx5KHNlbGYpOgorICAgICAgICBzZWxm
Ll9jaGVja19wbGF0Zm9ybSgnTGF5b3V0VGVzdHMvcGxhdGZvcm0vd2luL2Zhc3QvYS1leHBlY3Rl
ZC50eHQnLCAnd2luJykKKyAgICAgICAgc2VsZi5fY2hlY2tfcGxhdGZvcm0oJ3BsYXRmb3JtL3dp
bi9mYXN0L2EtZXhwZWN0ZWQudHh0JywgJ3dpbicpCisgICAgICAgIHNlbGYuX2NoZWNrX3BsYXRm
b3JtKCdwbGF0Zm9ybS9tYWMvZmFzdC9hLWV4cGVjdGVkLnR4dCcsICdtYWMnKQorICAgICAgICBz
ZWxmLl9jaGVja19wbGF0Zm9ybSgnZmFzdC9hLWV4cGVjdGVkLnR4dCcsIE5vbmUpCisKKyAgICBk
ZWYgdGVzdF9vdXRwdXRzX2Zyb21fYW5fYWN0dWFsX2ZpbGVfYXJlX21hcmtlZF9hc19zdWNoKHNl
bGYpOgorICAgICAgICByID0gdGVzdG91dHB1dC5UZXh0VGVzdE91dHB1dChOb25lLCBGYWtlRmls
ZSgndGVzdC1hY3R1YWwudHh0JykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyLmlzX2FjdHVh
bCgpKQorCisgICAgZGVmIHRlc3Rfb3V0cHV0c19mcm9tX2FuX2V4cGVjdGVkX2ZpbGVfYXJlX25v
dF9hY3R1YWwoc2VsZik6CisgICAgICAgIHIgPSB0ZXN0b3V0cHV0LlRleHRUZXN0T3V0cHV0KE5v
bmUsIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnR4dCcpKQorICAgICAgICBzZWxmLmFzc2VydEZh
bHNlKHIuaXNfYWN0dWFsKCkpCisKKyAgICBkZWYgdGVzdF9pc19uZXdfYmFzZWxpbmVfZm9yKHNl
bGYpOgorICAgICAgICBleHBlY3RlZCA9IHRlc3RvdXRwdXQuVGV4dFRlc3RPdXRwdXQoJ21hYycs
IEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnR4dCcpKQorICAgICAgICBhY3R1YWwgPSB0ZXN0b3V0
cHV0LlRleHRUZXN0T3V0cHV0KCdtYWMnLCBGYWtlRmlsZSgndGVzdC1hY3R1YWwudHh0JykpCisg
ICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhY3R1YWwuaXNfbmV3X2Jhc2VsaW5lX2ZvcihleHBlY3Rl
ZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZXhwZWN0ZWQuaXNfbmV3X2Jhc2VsaW5lX2Zv
cihhY3R1YWwpKQorCisgICAgZGVmIHRlc3RfX2VxX18oc2VsZik6CisgICAgICAgIHIxID0gdGVz
dG91dHB1dC5UZXh0VGVzdE91dHB1dCgnbWFjJywgRmFrZUZpbGUoJ3Rlc3QtZXhwZWN0ZWQudHh0
JywgJ2NvbnRlbnRzJykpCisgICAgICAgIHIyID0gdGVzdG91dHB1dC5UZXh0VGVzdE91dHB1dCgn
bWFjJywgRmFrZUZpbGUoJ3Rlc3QtZXhwZWN0ZWQudHh0JywgJ2NvbnRlbnRzJykpCisgICAgICAg
IHIzID0gdGVzdG91dHB1dC5UZXh0VGVzdE91dHB1dCgnd2luJywgRmFrZUZpbGUoJ3Rlc3QtZXhw
ZWN0ZWQudHh0JywgJ2NvbnRlbnRzJykpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocjEs
IHIyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyMSwgcjIucmV0YXJnZXQoJ21hYycpKQor
ICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFscyhyMSwgcjIucmV0YXJnZXQoJ3dpbicpKQorCisg
ICAgZGVmIHRlc3RfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcjEgPSB0ZXN0b3V0cHV0LlRleHRU
ZXN0T3V0cHV0KCdtYWMnLCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC50eHQnLCAnY29udGVudHMn
KSkKKyAgICAgICAgcjIgPSB0ZXN0b3V0cHV0LlRleHRUZXN0T3V0cHV0KCdtYWMnLCBGYWtlRmls
ZSgndGVzdC1leHBlY3RlZC50eHQnLCAnY29udGVudHMnKSkKKyAgICAgICAgcjMgPSB0ZXN0b3V0
cHV0LlRleHRUZXN0T3V0cHV0KE5vbmUsIEZha2VGaWxlKCd0ZXN0LWV4cGVjdGVkLnR4dCcsIE5v
bmUpKQorCisgICAgICAgIHggPSBzZXQoW3IxLCByMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1
YWxzKDEsIGxlbihzZXQoW3IxLCByMl0pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMiwg
bGVuKHNldChbcjEsIHIyLCByM10pKSkKKworICAgIGRlZiB0ZXN0X2ltYWdlX2RpZmZfaXNfaW52
b2tlZF9mb3JfaW1hZ2Vfb3V0cHV0c193aXRob3V0X2NoZWNrc3VtKHNlbGYpOgorICAgICAgICBy
MSA9IHRlc3RvdXRwdXQuSW1hZ2VUZXN0T3V0cHV0KCdtYWMnLCBGYWtlRmlsZSgndGVzdC1leHBl
Y3RlZC5wbmcnLCAnYXNkZicpLCBGYWtlRmlsZSgndGVzdC1leHBlY3RlZC5jaGVja3N1bScsICdj
aGVjaycpKQorICAgICAgICByMiA9IHRlc3RvdXRwdXQuSW1hZ2VUZXN0T3V0cHV0KCdtYWMnLCBG
YWtlRmlsZSgndGVzdC1leHBlY3RlZC5wbmcnLCAnYXNkZicpLCBOb25lKQorCisgICAgICAgICMg
RGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8ganVzdCBjb21wYXJlIG9uIGltYWdlIGNvbnRlbnRzLgor
ICAgICAgICBzZWxmLmFzc2VydFRydWUocjEuc2FtZV9jb250ZW50KHIyKSkKKworICAgICAgICBj
bGFzcyBBbGxJbWFnZXNBcmVEaWZmZXJlbnQob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBzYW1l
X2ltYWdlKHNlbGYsIGltYWdlMSwgaW1hZ2UyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFs
c2UKKworICAgICAgICAjIEJ1dCB3ZSBjYW4gaW5zdGFsbCBvdGhlciBpbWFnZSBkaWZmZXJzLgor
ICAgICAgICB0ZXN0b3V0cHV0LkltYWdlVGVzdE91dHB1dC5pbWFnZV9kaWZmZXIgPSBBbGxJbWFn
ZXNBcmVEaWZmZXJlbnQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocjEuc2FtZV9jb250
ZW50KHIyKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWlu
KCkKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0
cHV0c2V0LnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tb24vbmV0L3Rlc3RvdXRwdXRz
ZXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMC4uNDA3NDY4NmUzMzc0OTUxMTA2YTdlMGJhOTQwMDE5ZWYxOTE5YTIw
MQotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90
ZXN0b3V0cHV0c2V0LnB5CkBAIC0wLDAgKzEsMTMwIEBACisjIS91c3IvYmluL2VudiBweXRob24K
KyMgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisj
CisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisj
ICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisjIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENP
TlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyMgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOworIyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyMgT04gQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GCisjIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2Zyb20gd2Via2l0cHkuY29tbW9uLnN5
c3RlbS5kaXJlY3RvcnlmaWxlc2V0IGltcG9ydCBEaXJlY3RvcnlGaWxlU2V0Citmcm9tIHdlYmtp
dHB5LmNvbW1vbi5zeXN0ZW0uemlwZmlsZXNldCBpbXBvcnQgWmlwRmlsZVNldAoraW1wb3J0IHJl
CitpbXBvcnQgdGVzdG91dHB1dAoraW1wb3J0IHVybGxpYgorCisKK2NsYXNzIFRlc3RPdXRwdXRT
ZXQob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgcGxhdGZvcm0sIHppcF9m
aWxlLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuX25hbWUgPSBuYW1lCisgICAgICAgIHNlbGYu
X3BsYXRmb3JtID0gcGxhdGZvcm0KKyAgICAgICAgc2VsZi5femlwX2ZpbGUgPSB6aXBfZmlsZQor
ICAgICAgICBzZWxmLl9pbmNsdWRlX2V4cGVjdGVkID0ga3dhcmdzLmdldCgnaW5jbHVkZV9leHBl
Y3RlZCcsIFRydWUpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZnJvbV96aXBfdXJsKGNs
cywgcGxhdGZvcm0sIHppcF9wYXRoKToKKyAgICAgICAgcmV0dXJuIFRlc3RPdXRwdXRTZXQoJ2xv
Y2FsIHppcCAlcyBidWlsZGVyJyAlIHBsYXRmb3JtLCBwbGF0Zm9ybSwgWmlwRmlsZVNldCh6aXBf
cGF0aCkpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZnJvbV96aXAoY2xzLCBwbGF0Zm9y
bSwgemlwKToKKyAgICAgICAgcmV0dXJuIFRlc3RPdXRwdXRTZXQoJ2xvY2FsIHppcCAlcyBidWls
ZGVyJyAlIHBsYXRmb3JtLCBwbGF0Zm9ybSwgemlwKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAg
ZGVmIGZyb21femlwX21hcChjbHMsIHppcF9tYXApOgorICAgICAgICBvdXRwdXRfc2V0cyA9IFtd
CisgICAgICAgIGZvciBrLCB2IGluIHppcF9tYXAuaXRlbXMoKToKKyAgICAgICAgICAgIG91dHB1
dF9zZXRzLmFwcGVuZChUZXN0T3V0cHV0U2V0LmZyb21femlwKGssIHYpKQorICAgICAgICByZXR1
cm4gQWdncmVnYXRlVGVzdE91dHB1dFNldChvdXRwdXRfc2V0cykKKworICAgIEBjbGFzc21ldGhv
ZAorICAgIGRlZiBmcm9tX3BhdGgoc2VsZiwgcGF0aCwgcGxhdGZvcm09Tm9uZSk6CisgICAgICAg
IHJldHVybiBUZXN0T3V0cHV0U2V0KCdsb2NhbCAlcyBidWlsZGVyJyAlIHBsYXRmb3JtLCBwbGF0
Zm9ybSwgRGlyZWN0b3J5RmlsZVNldChwYXRoKSkKKworICAgIGRlZiBuYW1lKHNlbGYpOgorICAg
ICAgICByZXR1cm4gc2VsZi5fbmFtZQorCisgICAgZGVmIHNldF9wbGF0Zm9ybShzZWxmLCBwbGF0
Zm9ybSk6CisgICAgICAgIHNlbGYuX3BsYXRmb3JtID0gcGxhdGZvcm0KKworICAgIGRlZiBmaWxl
cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFtzZWxmLl96aXBfZmlsZS5vcGVuKGZpbGVuYW1lKSBm
b3IgZmlsZW5hbWUgaW4gc2VsZi5femlwX2ZpbGUubmFtZWxpc3QoKV0KKworICAgIGRlZiBfZXh0
cmFjdF9vdXRwdXRfZmlsZXMoc2VsZiwgbmFtZSwgZXhhY3RfbWF0Y2gpOgorICAgICAgICBuYW1l
X21hdGNoZXIgPSByZS5jb21waWxlKG5hbWUpCisgICAgICAgIGFjdHVhbF9tYXRjaGVyID0gcmUu
Y29tcGlsZShyJy1hY3R1YWxcLicpCisgICAgICAgIGV4cGVjdGVkX21hdGNoZXIgPSByZS5jb21w
aWxlKHInLWV4cGVjdGVkXC4nKQorCisgICAgICAgIGNoZWNrc3VtX2ZpbGVzID0gW10KKyAgICAg
ICAgdGV4dF9maWxlcyA9IFtdCisgICAgICAgIGltYWdlX2ZpbGVzID0gW10KKyAgICAgICAgZm9y
IG91dHB1dF9maWxlIGluIHNlbGYuZmlsZXMoKToKKyAgICAgICAgICAgIG5hbWVfbWF0Y2ggPSBu
YW1lX21hdGNoZXIuc2VhcmNoKG91dHB1dF9maWxlLm5hbWUoKSkKKyAgICAgICAgICAgIGFjdHVh
bF9tYXRjaCA9IGFjdHVhbF9tYXRjaGVyLnNlYXJjaChvdXRwdXRfZmlsZS5uYW1lKCkpCisgICAg
ICAgICAgICBleHBlY3RlZF9tYXRjaCA9IGV4cGVjdGVkX21hdGNoZXIuc2VhcmNoKG91dHB1dF9m
aWxlLm5hbWUoKSkKKyAgICAgICAgICAgIGlmIG5vdCAobmFtZV9tYXRjaCBhbmQgKGFjdHVhbF9t
YXRjaCBvciAoc2VsZi5faW5jbHVkZV9leHBlY3RlZCBhbmQgZXhwZWN0ZWRfbWF0Y2gpKSk6Cisg
ICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIG91dHB1dF9maWxlLm5hbWUo
KS5lbmRzd2l0aCgnLmNoZWNrc3VtJyk6CisgICAgICAgICAgICAgICAgY2hlY2tzdW1fZmlsZXMu
YXBwZW5kKG91dHB1dF9maWxlKQorICAgICAgICAgICAgZWxpZiBvdXRwdXRfZmlsZS5uYW1lKCku
ZW5kc3dpdGgoJy50eHQnKToKKyAgICAgICAgICAgICAgICB0ZXh0X2ZpbGVzLmFwcGVuZChvdXRw
dXRfZmlsZSkKKyAgICAgICAgICAgIGVsaWYgb3V0cHV0X2ZpbGUubmFtZSgpLmVuZHN3aXRoKCcu
cG5nJyk6CisgICAgICAgICAgICAgICAgaW1hZ2VfZmlsZXMuYXBwZW5kKG91dHB1dF9maWxlKQor
CisgICAgICAgIHJldHVybiAoY2hlY2tzdW1fZmlsZXMsIHRleHRfZmlsZXMsIGltYWdlX2ZpbGVz
KQorCisgICAgZGVmIF9leHRyYWN0X2ZpbGVfd2l0aF9uYW1lKHNlbGYsIG5hbWUsIGZpbGVzKToK
KyAgICAgICAgZm9yIGZpbGUgaW4gZmlsZXM6CisgICAgICAgICAgICBpZiBmaWxlLm5hbWUoKSA9
PSBuYW1lOgorICAgICAgICAgICAgICAgIHJldHVybiBmaWxlCisgICAgICAgIHJldHVybiBOb25l
CisKKyAgICBkZWYgX21ha2Vfb3V0cHV0X2Zyb21faW1hZ2Uoc2VsZiwgaW1hZ2VfZmlsZSwgY2hl
Y2tzdW1fZmlsZXMpOgorICAgICAgICBjaGVja3N1bV9maWxlX25hbWUgPSByZS5zdWIoJ1wucG5n
JywgJy5jaGVja3N1bScsIGltYWdlX2ZpbGUubmFtZSgpKQorICAgICAgICBjaGVja3N1bV9maWxl
ID0gc2VsZi5fZXh0cmFjdF9maWxlX3dpdGhfbmFtZShjaGVja3N1bV9maWxlX25hbWUsIGNoZWNr
c3VtX2ZpbGVzKQorICAgICAgICByZXR1cm4gdGVzdG91dHB1dC5JbWFnZVRlc3RPdXRwdXQoc2Vs
Zi5fcGxhdGZvcm0sIGltYWdlX2ZpbGUsIGNoZWNrc3VtX2ZpbGUpCisKKyAgICBkZWYgb3V0cHV0
c19mb3Ioc2VsZiwgbmFtZSwgKiprd2FyZ3MpOgorICAgICAgICB0YXJnZXRfdHlwZSA9IGt3YXJn
cy5nZXQoJ3RhcmdldF90eXBlJywgTm9uZSkKKyAgICAgICAgZXhhY3RfbWF0Y2ggPSBrd2FyZ3Mu
Z2V0KCdleGFjdF9tYXRjaCcsIEZhbHNlKQorICAgICAgICBpZiByZS5zZWFyY2gocidcLng/aHRt
bCcsIG5hbWUpOgorICAgICAgICAgICAgbmFtZSA9IG5hbWVbOm5hbWUucmluZGV4KCcuJyldCisK
KyAgICAgICAgKGNoZWNrc3VtX2ZpbGVzLCB0ZXh0X2ZpbGVzLCBpbWFnZV9maWxlcykgPSBzZWxm
Ll9leHRyYWN0X291dHB1dF9maWxlcyhuYW1lLCBleGFjdF9tYXRjaCkKKworICAgICAgICBvdXRw
dXRzID0gW3NlbGYuX21ha2Vfb3V0cHV0X2Zyb21faW1hZ2UoaW1hZ2VfZmlsZSwgY2hlY2tzdW1f
ZmlsZXMpIGZvciBpbWFnZV9maWxlIGluIGltYWdlX2ZpbGVzXQorCisgICAgICAgIG91dHB1dHMg
Kz0gW3Rlc3RvdXRwdXQuVGV4dFRlc3RPdXRwdXQoc2VsZi5fcGxhdGZvcm0sIHRleHRfZmlsZSkg
Zm9yIHRleHRfZmlsZSBpbiB0ZXh0X2ZpbGVzXQorCisgICAgICAgIGlmIGV4YWN0X21hdGNoOgor
ICAgICAgICAgICAgb3V0cHV0cyA9IGZpbHRlcihsYW1iZGEgb3V0cHV0OiBvdXRwdXQubmFtZSgp
ID09IG5hbWUsIG91dHB1dHMpCisKKyAgICAgICAgb3V0cHV0cyA9IGZpbHRlcihsYW1iZGEgcjog
dGFyZ2V0X3R5cGUgaW4gW05vbmUsIHIudHlwZSgpXSwgb3V0cHV0cykKKworICAgICAgICByZXR1
cm4gb3V0cHV0cworCisKK2NsYXNzIEFnZ3JlZ2F0ZVRlc3RPdXRwdXRTZXQob2JqZWN0KToKKyAg
ICAiIiJTZXQgb2YgdGVzdCBvdXRwdXRzIGZyb20gYSBsaXN0IG9mIGJ1aWxkZXJzIiIiCisgICAg
ZGVmIF9faW5pdF9fKHNlbGYsIGJ1aWxkZXJzKToKKyAgICAgICAgc2VsZi5fYnVpbGRlcnMgPSBi
dWlsZGVycworCisgICAgZGVmIG91dHB1dHNfZm9yKHNlbGYsIG5hbWUsICoqa3dhcmdzKToKKyAg
ICAgICAgcmV0dXJuIHN1bShbYnVpbGRlci5vdXRwdXRzX2ZvcihuYW1lLCAqKmt3YXJncykgZm9y
IGJ1aWxkZXIgaW4gc2VsZi5fYnVpbGRlcnNdLCBbXSkKKworICAgIGRlZiBidWlsZGVycyhzZWxm
KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2J1aWxkZXJzCmRpZmYgLS1naXQgYS9Ub29scy9TY3Jp
cHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1dHNldF91bml0dGVzdC5weSBiL1Rvb2xz
L1NjcmlwdHMvd2Via2l0cHkvY29tbW9uL25ldC90ZXN0b3V0cHV0c2V0X3VuaXR0ZXN0LnB5Cm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAuLmE3MGE1MzllODhhMzAwODc1ZWVjNmRhNTY2ZDdmN2M0ZjA1YWJhODYKLS0tIC9k
ZXYvbnVsbAorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9uZXQvdGVzdG91dHB1
dHNldF91bml0dGVzdC5weQpAQCAtMCwwICsxLDEyNSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9u
CisjIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
IworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuICBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
IyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBD
T05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisjIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ
T1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisjIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisjIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCitmcm9tIHdlYmtpdHB5LmNvbW1vbi5z
eXN0ZW0uemlwX21vY2sgaW1wb3J0IE1vY2taaXAKK2ltcG9ydCB0ZXN0b3V0cHV0c2V0CitpbXBv
cnQgdW5pdHRlc3QKKworCitjbGFzcyBUZXN0T3V0cHV0U2V0VGVzdCh1bml0dGVzdC5UZXN0Q2Fz
ZSk6CisgICAgZGVmIF9vdXRwdXRzZXRfd2l0aF96aXAoc2VsZiwgemlwLCAqKmt3YXJncyk6Cisg
ICAgICAgIHJldHVybiB0ZXN0b3V0cHV0c2V0LlRlc3RPdXRwdXRTZXQoJzxmYWtlLW91dHB1dHNl
dD4nLCAnPGZha2UtcGxhdGZvcm0+JywgemlwLCAqKmt3YXJncykKKworICAgIGRlZiB0ZXN0X3Rl
eHRfZmlsZXNfZ2V0X2ludGVycHJldGVkX2FzX3RleHRfb3V0cHV0cyhzZWxmKToKKyAgICAgICAg
emlwID0gTW9ja1ppcCgpCisgICAgICAgIHppcC5pbnNlcnQoJ2Zhc3QvZG9tL3NvbWUtdGVzdC1h
Y3R1YWwudHh0JywgJ2FjdHVhbCBvdXRwdXRzJykKKyAgICAgICAgYiA9IHNlbGYuX291dHB1dHNl
dF93aXRoX3ppcCh6aXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxlbihiLm91dHB1
dHNfZm9yKCdmYXN0L2RvbS9zb21lLXRlc3QnKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxz
KCdmYXN0L2RvbS9zb21lLXRlc3QnLCBiLm91dHB1dHNfZm9yKCdmYXN0L2RvbS9zb21lLXRlc3Qu
aHRtbCcpWzBdLm5hbWUoKSkKKworICAgIGRlZiB0ZXN0X2ltYWdlX2FuZF9jaGVja3N1bV9maWxl
c19nZXRfaW50ZXJwcmV0ZWRfYXNfYV9zaW5nbGVfaW1hZ2Vfb3V0cHV0KHNlbGYpOgorICAgICAg
ICB6aXAgPSBNb2NrWmlwKCkKKyAgICAgICAgemlwLmluc2VydCgnZmFzdC9kb20vc29tZS10ZXN0
LWFjdHVhbC5jaGVja3N1bScsICdhYmMxMjMnKQorICAgICAgICB6aXAuaW5zZXJ0KCdmYXN0L2Rv
bS9zb21lLXRlc3QtYWN0dWFsLnBuZycsICc8aW1hZ2UgZGF0YT4nKQorICAgICAgICBiID0gc2Vs
Zi5fb3V0cHV0c2V0X3dpdGhfemlwKHppcCkKKyAgICAgICAgb3V0cHV0cyA9IGIub3V0cHV0c19m
b3IoJ2Zhc3QvZG9tL3NvbWUtdGVzdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDEsIGxl
bihvdXRwdXRzKSkKKyAgICAgICAgb3V0cHV0ID0gb3V0cHV0c1swXQorICAgICAgICBzZWxmLmFz
c2VydEVxdWFscygnaW1hZ2UnLCBvdXRwdXQudHlwZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVx
dWFscygnYWJjMTIzJywgb3V0cHV0LmNoZWNrc3VtKCkpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBs
ZV9pbWFnZV9vdXRwdXRzX2FyZV9kZXRlY3RlZChzZWxmKToKKyAgICAgICAgemlwID0gTW9ja1pp
cCgpCisgICAgICAgIHppcC5pbnNlcnQoJ3BsYXRmb3JtL3dpbi9mYXN0L2RvbS9zb21lLXRlc3Qt
YWN0dWFsLmNoZWNrc3VtJywgJ2NoZWNrc3VtMScpCisgICAgICAgIHppcC5pbnNlcnQoJ3BsYXRm
b3JtL3dpbi9mYXN0L2RvbS9zb21lLXRlc3QtYWN0dWFsLnBuZycsICc8aW1hZ2UgZGF0YSAxPicp
CisgICAgICAgIHppcC5pbnNlcnQoJ3BsYXRmb3JtL21hYy9mYXN0L2RvbS9zb21lLXRlc3QtYWN0
dWFsLmNoZWNrc3VtJywgJ2NoZWNrc3VtMicpCisgICAgICAgIHppcC5pbnNlcnQoJ3BsYXRmb3Jt
L21hYy9mYXN0L2RvbS9zb21lLXRlc3QtYWN0dWFsLnBuZycsICc8aW1hZ2UgZGF0YSAyPicpCisg
ICAgICAgIGIgPSBzZWxmLl9vdXRwdXRzZXRfd2l0aF96aXAoemlwKQorICAgICAgICBvdXRwdXRz
ID0gYi5vdXRwdXRzX2ZvcignZmFzdC9kb20vc29tZS10ZXN0JykKKyAgICAgICAgc2VsZi5hc3Nl
cnRFcXVhbHMoMiwgbGVuKG91dHB1dHMpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG91dHB1
dHNbMF0uc2FtZV9jb250ZW50KG91dHB1dHNbMV0pKQorCisgICAgZGVmIHRlc3RfYWdncmVnYXRl
X291dHB1dF9zZXRfY29ycmVjdGx5X3JldHJpZXZlc190ZXN0c19mcm9tX211bHRpcGxlX291dHB1
dF9zZXRzKHNlbGYpOgorICAgICAgICBvdXRwdXRzZXQxX3ppcCA9IE1vY2taaXAoKQorICAgICAg
ICBvdXRwdXRzZXQxX3ppcC5pbnNlcnQoJ2Zhc3QvZG9tL3Rlc3QtYWN0dWFsLnR4dCcsICdsaW51
eCB0ZXh0IG91dHB1dCcpCisgICAgICAgIG91dHB1dHNldDEgPSB0ZXN0b3V0cHV0c2V0LlRlc3RP
dXRwdXRTZXQoJ2xpbnV4LW91dHB1dHNldCcsICdsaW51eCcsIG91dHB1dHNldDFfemlwKQorICAg
ICAgICBvdXRwdXRzZXQyX3ppcCA9IE1vY2taaXAoKQorICAgICAgICBvdXRwdXRzZXQyX3ppcC5p
bnNlcnQoJ2Zhc3QvZG9tL3Rlc3QtYWN0dWFsLnR4dCcsICd3aW5kb3dzIHRleHQgb3V0cHV0JykK
KyAgICAgICAgb3V0cHV0c2V0MiA9IHRlc3RvdXRwdXRzZXQuVGVzdE91dHB1dFNldCgnd2luLW91
dHB1dHNldCcsICd3aW4nLCBvdXRwdXRzZXQyX3ppcCkKKworICAgICAgICBiID0gdGVzdG91dHB1
dHNldC5BZ2dyZWdhdGVUZXN0T3V0cHV0U2V0KFtvdXRwdXRzZXQxLCBvdXRwdXRzZXQyXSkKKyAg
ICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMiwgbGVuKGIub3V0cHV0c19mb3IoJ2Zhc3QvZG9tL3Rl
c3QnKSkpCisKKyAgICBkZWYgdGVzdF9jYW5faW5mZXJfcGxhdGZvcm1fZnJvbV9wYXRoX2lmX25v
bmVfcHJvdmlkZWQoc2VsZik6CisgICAgICAgIHppcCA9IE1vY2taaXAoKQorICAgICAgICB6aXAu
aW5zZXJ0KCdwbGF0Zm9ybS93aW4vc29tZS10ZXN0LWV4cGVjdGVkLnBuZycsICc8aW1hZ2UgZGF0
YT4nKQorICAgICAgICB6aXAuaW5zZXJ0KCdwbGF0Zm9ybS93aW4vc29tZS10ZXN0LWV4cGVjdGVk
LmNoZWNrc3VtJywgJ2FiYzEyMycpCisgICAgICAgIGIgPSB0ZXN0b3V0cHV0c2V0LlRlc3RPdXRw
dXRTZXQoJ2xvY2FsIExheW91dFRlc3RzIG91dHB1dHNldCcsIE5vbmUsIHppcCkKKworICAgICAg
ICBvdXRwdXRzID0gYi5vdXRwdXRzX2Zvcignc29tZS10ZXN0JykKKyAgICAgICAgc2VsZi5hc3Nl
cnRFcXVhbHMoMSwgbGVuKG91dHB1dHMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygnd2lu
Jywgb3V0cHV0c1swXS5wbGF0Zm9ybSgpKQorCisgICAgZGVmIHRlc3RfdGVzdF9leHRlbnNpb25f
aXNfaWdub3JlZChzZWxmKToKKyAgICAgICAgemlwID0gTW9ja1ppcCgpCisgICAgICAgIHppcC5p
bnNlcnQoJ3Rlc3QvdGVzdC1hLWFjdHVhbC50eHQnLCAnYWN0dWFsIG91dHB1dHMnKQorICAgICAg
ICBiID0gc2VsZi5fb3V0cHV0c2V0X3dpdGhfemlwKHppcCkKKyAgICAgICAgb3V0cHV0cyA9IGIu
b3V0cHV0c19mb3IoJ3Rlc3QvdGVzdC1hLmh0bWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFs
cygxLCBsZW4ob3V0cHV0cykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCd0ZXN0L3Rlc3Qt
YScsIG91dHB1dHNbMF0ubmFtZSgpKQorCisgICAgZGVmIHRlc3RfZXhpc3Rpbmdfb3V0cHV0c19h
cmVfbWFya2VkX2FzX3N1Y2goc2VsZik6CisgICAgICAgIHppcCA9IE1vY2taaXAoKQorICAgICAg
ICB6aXAuaW5zZXJ0KCd0ZXN0L3Rlc3QtYS1leHBlY3RlZC50eHQnLCAnZXhwZWN0ZWQgb3V0cHV0
cycpCisgICAgICAgIGIgPSBzZWxmLl9vdXRwdXRzZXRfd2l0aF96aXAoemlwKQorICAgICAgICBv
dXRwdXRzID0gYi5vdXRwdXRzX2ZvcigndGVzdC90ZXN0LWEuaHRtbCcpCisgICAgICAgIHNlbGYu
YXNzZXJ0RXF1YWxzKDEsIGxlbihvdXRwdXRzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShv
dXRwdXRzWzBdLmlzX2FjdHVhbCgpKQorCisgICAgZGVmIHRlc3Rfb25seV9yZXR1cm5zX291dHB1
dHNfb2Zfc3BlY2lmaWVkX3R5cGUoc2VsZik6CisgICAgICAgIHppcCA9IE1vY2taaXAoKQorICAg
ICAgICB6aXAuaW5zZXJ0KCd0ZXN0L3Rlc3QtYS1leHBlY3RlZC50eHQnLCAnZXhwZWN0ZWQgb3V0
cHV0cycpCisgICAgICAgIHppcC5pbnNlcnQoJ3Rlc3QvdGVzdC1hLWV4cGVjdGVkLmNoZWNrc3Vt
JywgJ2V4cGVjdGVkIG91dHB1dHMnKQorICAgICAgICB6aXAuaW5zZXJ0KCd0ZXN0L3Rlc3QtYS1l
eHBlY3RlZC5wbmcnLCAnZXhwZWN0ZWQgb3V0cHV0cycpCisgICAgICAgIGIgPSBzZWxmLl9vdXRw
dXRzZXRfd2l0aF96aXAoemlwKQorCisgICAgICAgIG91dHB1dHMgPSBiLm91dHB1dHNfZm9yKCd0
ZXN0L3Rlc3QtYS5odG1sJykKKyAgICAgICAgdGV4dF9vdXRwdXRzID0gYi5vdXRwdXRzX2Zvcign
dGVzdC90ZXN0LWEuaHRtbCcsIHRhcmdldF90eXBlPSd0ZXh0JykKKyAgICAgICAgaW1hZ2Vfb3V0
cHV0cyA9IGIub3V0cHV0c19mb3IoJ3Rlc3QvdGVzdC1hLmh0bWwnLCB0YXJnZXRfdHlwZT0naW1h
Z2UnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDIsIGxlbihvdXRwdXRzKSkKKyAgICAg
ICAgc2VsZi5hc3NlcnRFcXVhbHMoMSwgbGVuKHRleHRfb3V0cHV0cykpCisgICAgICAgIHNlbGYu
YXNzZXJ0RXF1YWxzKDEsIGxlbihpbWFnZV9vdXRwdXRzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRF
cXVhbHMoJ3RleHQnLCB0ZXh0X291dHB1dHNbMF0udHlwZSgpKQorICAgICAgICBzZWxmLmFzc2Vy
dEVxdWFscygnaW1hZ2UnLCBpbWFnZV9vdXRwdXRzWzBdLnR5cGUoKSkKKworICAgIGRlZiB0ZXN0
X2V4Y2x1ZGVfZXhwZWN0ZWRfb3V0cHV0c193b3JrcyhzZWxmKToKKyAgICAgICAgemlwID0gTW9j
a1ppcCgpCisgICAgICAgIHppcC5pbnNlcnQoJ3Rlc3QtZXhwZWN0ZWQudHh0JywgICdleHBlY3Rl
ZCBvdXRwdXRzIHN0b3JlZCBvbiBzZXJ2ZXIgZm9yIHNvbWUgcmVhc29uJykKKyAgICAgICAgYiA9
IHNlbGYuX291dHB1dHNldF93aXRoX3ppcCh6aXAsIGluY2x1ZGVfZXhwZWN0ZWQ9RmFsc2UpCisg
ICAgICAgIG91dHB1dHMgPSBiLm91dHB1dHNfZm9yKCd0ZXN0JywgdGFyZ2V0X3R5cGU9Tm9uZSkK
KyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMCwgbGVuKG91dHB1dHMpKQorCitpZiBfX25hbWVf
XyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvVG9vbHMv
U2NyaXB0cy93ZWJraXRweS9jb21tb24vc3lzdGVtL3ppcF9tb2NrLnB5IGIvVG9vbHMvU2NyaXB0
cy93ZWJraXRweS9jb21tb24vc3lzdGVtL3ppcF9tb2NrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmRjZmFiYTcw
ZDA4YmI3YTZkMTk3ZGU1YmY4OTIzZTcwMzkwZTljMGUKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29s
cy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1vbi9zeXN0ZW0vemlwX21vY2sucHkKQEAgLTAsMCArMSw1
NSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiAgUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJ
VFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorIyBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRT
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorIyBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7CisjIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorIyBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyMgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworZnJvbSB3ZWJraXRweS5jb21t
b24uc3lzdGVtLmZpbGVzZXQgaW1wb3J0IEZpbGVTZXRGaWxlSGFuZGxlCitmcm9tIHdlYmtpdHB5
LmNvbW1vbi5zeXN0ZW0uZmlsZXN5c3RlbV9tb2NrIGltcG9ydCBNb2NrRmlsZVN5c3RlbQorCisK
K2NsYXNzIE1vY2taaXAob2JqZWN0KToKKyAgICAiIiJBIG1vY2sgemlwIGZpbGUgdGhhdCBjYW4g
aGF2ZSBuZXcgZmlsZXMgaW5zZXJ0ZWQgaW50byBpdC4iIiIKKyAgICBkZWYgX19pbml0X18oc2Vs
ZiwgZmlsZXN5c3RlbT1Ob25lKToKKyAgICAgICAgc2VsZi5fZmlsZXN5c3RlbSA9IGZpbGVzeXN0
ZW0gb3IgTW9ja0ZpbGVTeXN0ZW0oKQorICAgICAgICBzZWxmLl9maWxlcyA9IHt9CisKKyAgICBk
ZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJNb2NrWmlwIgorCisgICAgZGVmIGlu
c2VydChzZWxmLCBmaWxlbmFtZSwgY29udGVudCk6CisgICAgICAgIHNlbGYuX2ZpbGVzW2ZpbGVu
YW1lXSA9IGNvbnRlbnQKKworICAgIGRlZiBuYW1lbGlzdChzZWxmKToKKyAgICAgICAgcmV0dXJu
IHNlbGYuX2ZpbGVzLmtleXMoKQorCisgICAgZGVmIG9wZW4oc2VsZiwgZmlsZW5hbWUpOgorICAg
ICAgICByZXR1cm4gRmlsZVNldEZpbGVIYW5kbGUoc2VsZiwgZmlsZW5hbWUpCisKKyAgICBkZWYg
cmVhZChzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlc1tmaWxlbmFt
ZV0KKworICAgIGRlZiBleHRyYWN0KHNlbGYsIGZpbGVuYW1lLCBwYXRoKToKKyAgICAgICAgZnVs
bF9wYXRoID0gc2VsZi5fZmlsZXN5c3RlbS5qb2luKHBhdGgsIGZpbGVuYW1lKQorICAgICAgICBj
b250ZW50cyA9IHNlbGYub3BlbihmaWxlbmFtZSkuY29udGVudHMoKQorICAgICAgICBzZWxmLl9m
aWxlc3lzdGVtLndyaXRlX3RleHRfZmlsZShmdWxsX3BhdGgsIGNvbnRlbnRzKQorCisgICAgZGVm
IGRlbGV0ZShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHNlbGYuX2ZpbGVzW2ZpbGVuYW1lXSA9
IE5vbmUK
</data>

          </attachment>
      

    </bug>

</bugzilla>