<?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>70877</bug_id>
          
          <creation_ts>2011-10-26 00:36:45 -0700</creation_ts>
          <short_desc>[GTK] [WebKit] Replace the gtkdoc autools magic with something more flexible</short_desc>
          <delta_ts>2011-11-09 19:01:32 -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>WebKitGTK</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Martin Robinson">mrobinson</reporter>
          <assigned_to name="Martin Robinson">mrobinson</assigned_to>
          <cc>alex</cc>
    
    <cc>cgarcia</cc>
    
    <cc>gustavo</cc>
    
    <cc>pnormand</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>490622</commentid>
    <comment_count>0</comment_count>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2011-10-26 00:36:45 -0700</bug_when>
    <thetext>The gtkdoc autotools magic a bit inflexible.

1. To make it build in the build directory (as opposed to in the source directory) we have to fork the generated makefile. See: http://trac.webkit.org/changeset/97901
2. it would be nice to be able to run the fast parts of gtkdoc during every build so that we would sniff out documentation warnings ealier. The slow part of gtkdoc is gtkdoc-mkhtml.
3. gtkdoc is yet another thing that ties us to autotools. While we don&apos;t plan to move away from autotools any time soon, it would be nice to avoid a hard dependency on it.
4. The gtkdoc makefile doesn&apos;t do any error reporting and it&apos;s hard to debug it when things go wrong.

This patch proposes introducing a python script to run the six (six!) gtkdoc steps intead of the standard makefile approach. I feel the maintenence burden of such a script will be very low.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490629</commentid>
    <comment_count>1</comment_count>
      <attachid>112464</attachid>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2011-10-26 00:50:09 -0700</bug_when>
    <thetext>Created attachment 112464
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490630</commentid>
    <comment_count>2</comment_count>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2011-10-26 00:51:12 -0700</bug_when>
    <thetext>I&apos;ve uploaded my first stab at this. It generates the WebKit2 documentaiton to &lt;build_dir&gt;/Documentation/WebKit2. The wrapper &apos;build-gtkdoc&apos; script is a bit uglier than I&apos;d hoped, but we can always push some of this into helpers if we do share this approach with WebKit1.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490634</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-10-26 00:51:52 -0700</bug_when>
    <thetext>Thanks for the patch. If this patch contains new public API please make sure it follows the guidelines for new WebKit2 GTK+ API. See http://trac.webkit.org/wiki/WebKitGTK/AddingNewWebKit2API</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490812</commentid>
    <comment_count>4</comment_count>
      <attachid>112464</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2011-10-26 07:03:23 -0700</bug_when>
    <thetext>Comment on attachment 112464
Patch

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

&gt; Source/WebKit2/UIProcess/API/gtk/docs/build-gtkdoc:83
&gt; +generator = gtkdoc.PkgConfigGTKDoc(module_name=&quot;webkit2gtk&quot;,
&gt; +                                   output_dir=output_dir,
&gt; +                                   pkg_config_path=pkg_config_path,
&gt; +                                   source_dirs=[src_dir],
&gt; +                                   doc_dir=doc_dir,
&gt; +                                   cflags=cflags,
&gt; +                                   library_path=library_path,
&gt; +                                   decorator=&quot;WEBKIT_API&quot;,
&gt; +                                   deprecation_guard=&quot;WEBKIT_DISABLE_DEPRECATED&quot;,
&gt; +                                   ignored_files=ignored_files)

All of this information is already available in the makefile, I think we could just call the other script from the makefile passing all this info as parameters.

&gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:110
&gt; +        raise_error_if_not_specified(&apos;output_dir&apos;)
&gt; +        raise_error_if_not_specified(&apos;source_dirs&apos;)
&gt; +        raise_error_if_not_specified(&apos;module_name&apos;)

Wouldn&apos;t it be better to use OptionParser instead?

&gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:139
&gt; +        for path in os.environ.get(&apos;PATH&apos;, &apos;&apos;).split(&apos;:&apos;):

Use could use os.pathsep instead of : here.

&gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:180
&gt; +        process_output = process.communicate()

I always have to think what process_out[0] and [1] are, I prefer to use something like

stdout, stderr = process.communicate()

&gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:181
&gt; +        process.wait()

communicate already does the wait, so you don&apos;t need to call wait here.

&gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:186
&gt; +        if process_output[0]:
&gt; +            print process_output[0]
&gt; +        if process_output[1]:
&gt; +            print process_output[1]

I think stdout output should go to stdout and stderr output to stderr, so you could do something like

if stdout:
    sys.stdout.write(stdout)
if stderr:
    sys.stderr.write(stderr)

&gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:192
&gt; +        if self._output_has_warnings(process_output):

I think warnings are always printed on stdout, so this could be simply 

if &apos;warning:` in stdout:
    ....

&gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:222
&gt; +        if not(os.path.exists(self.output_dir)):

not isn&apos;t a function, you don&apos;t need to use parentheses there.

&gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:223
&gt; +            os.makedirs(self.output_dir)

instead of checking wheter it exists and then create it, you can just call makedirs and handle the exception

try:
    os.makedirs()
except OSError as e:
    if e.errno != errno.EEXIST:
        raise

&gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:235
&gt; +        if not os.path.exists(html_dest_dir):
&gt; +            os.mkdir(html_dest_dir)

Ditto.

&gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:253
&gt; +        open(version_xml_path, &apos;w&apos;).write(self.version)

I think you should close the file too</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>491335</commentid>
    <comment_count>5</comment_count>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2011-10-26 20:10:40 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; (From update of attachment 112464 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=112464&amp;action=review
&gt; 
&gt; &gt; Source/WebKit2/UIProcess/API/gtk/docs/build-gtkdoc:83
&gt; &gt; +generator = gtkdoc.PkgConfigGTKDoc(module_name=&quot;webkit2gtk&quot;,
&gt; &gt; +                                   output_dir=output_dir,
&gt; &gt; +                                   pkg_config_path=pkg_config_path,
&gt; &gt; +                                   source_dirs=[src_dir],
&gt; &gt; +                                   doc_dir=doc_dir,
&gt; &gt; +                                   cflags=cflags,
&gt; &gt; +                                   library_path=library_path,
&gt; &gt; +                                   decorator=&quot;WEBKIT_API&quot;,
&gt; &gt; +                                   deprecation_guard=&quot;WEBKIT_DISABLE_DEPRECATED&quot;,
&gt; &gt; +                                   ignored_files=ignored_files)
&gt; 
&gt; All of this information is already available in the makefile, I think we could just call the other script from the makefile passing all this info as parameters.

I discussed this with Carlos over Jabber. Essentially I want to make it simple to generate the documentation outside of make. This will simplify generation. There&apos;s a pretty big startup lag for make.

&gt; 
&gt; &gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:110
&gt; &gt; +        raise_error_if_not_specified(&apos;output_dir&apos;)
&gt; &gt; +        raise_error_if_not_specified(&apos;source_dirs&apos;)
&gt; &gt; +        raise_error_if_not_specified(&apos;module_name&apos;)
&gt; 
&gt; Wouldn&apos;t it be better to use OptionParser instead?

Isn&apos;t optparse only for parsing command-line arguments?

&gt; 
&gt; &gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:139
&gt; &gt; +        for path in os.environ.get(&apos;PATH&apos;, &apos;&apos;).split(&apos;:&apos;):
&gt; 
&gt; Use could use os.pathsep instead of : here.

Done.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:180
&gt; &gt; +        process_output = process.communicate()
&gt; 
&gt; I always have to think what process_out[0] and [1] are, I prefer to use something like
&gt; 
&gt; stdout, stderr = process.communicate()

Sure. It&apos;s indeed quite a bit clearer.

&gt; 
&gt; &gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:181
&gt; &gt; +        process.wait()
&gt; 
&gt; communicate already does the wait, so you don&apos;t need to call wait here.

Okay.

&gt; if stdout:
&gt;     sys.stdout.write(stdout)
&gt; if stderr:
&gt;     sys.stderr.write(stderr) 

Done.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:192
&gt; &gt; +        if self._output_has_warnings(process_output):
&gt; I think warnings are always printed on stdout, so this could be simply 
&gt; if &apos;warning:` in stdout:
&gt;     ....

I&apos;m using this pattern, but I&apos;m still checking both. I think it&apos;s good for completeness sake. The warnings should be on stdout.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:222
&gt; &gt; +        if not(os.path.exists(self.output_dir)):
&gt; 
&gt; not isn&apos;t a function, you don&apos;t need to use parentheses there.

Removed this. Thought I had fixed all these before uploading.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:223
&gt; &gt; +            os.makedirs(self.output_dir)
&gt; 
&gt; instead of checking wheter it exists and then create it, you can just call makedirs and handle the exception

I think checking first is more compact, so I kept it. There&apos;s a slight race condition, but I&apos;m not too worried. :)

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:253
&gt; &gt; +        open(version_xml_path, &apos;w&apos;).write(self.version)
&gt; I think you should close the file too

Nice catch! Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>491341</commentid>
    <comment_count>6</comment_count>
      <attachid>112638</attachid>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2011-10-26 21:22:40 -0700</bug_when>
    <thetext>Created attachment 112638
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>491342</commentid>
    <comment_count>7</comment_count>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2011-10-26 21:23:19 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; Created an attachment (id=112638) [details]
&gt; Patch

The new version of the patch also looks for the build in WebKitBuild.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>491363</commentid>
    <comment_count>8</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2011-10-26 23:34:39 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; &gt; 
&gt; &gt; &gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:110
&gt; &gt; &gt; +        raise_error_if_not_specified(&apos;output_dir&apos;)
&gt; &gt; &gt; +        raise_error_if_not_specified(&apos;source_dirs&apos;)
&gt; &gt; &gt; +        raise_error_if_not_specified(&apos;module_name&apos;)
&gt; &gt; 
&gt; &gt; Wouldn&apos;t it be better to use OptionParser instead?
&gt; 
&gt; Isn&apos;t optparse only for parsing command-line arguments?

Yes, and these are command line options after all, you can give the args to the parser as an argument and the parser doesn&apos;t look at sys.argv.

&gt; 
&gt; &gt; &gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:223
&gt; &gt; &gt; +            os.makedirs(self.output_dir)
&gt; &gt; 
&gt; &gt; instead of checking wheter it exists and then create it, you can just call makedirs and handle the exception
&gt; 
&gt; I think checking first is more compact, so I kept it. There&apos;s a slight race condition, but I&apos;m not too worried. :)

Yes, main problem is the race condition, but I don&apos;t think it&apos;s that important in this case, since this script is not supposed to be called in parallel</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>491365</commentid>
    <comment_count>9</comment_count>
      <attachid>112638</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2011-10-26 23:46:02 -0700</bug_when>
    <thetext>Comment on attachment 112638
Patch

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

&gt; Source/WebKit2/UIProcess/API/gtk/docs/build-gtkdoc:91
&gt; +generator = gtkdoc.PkgConfigGTKDoc(module_name=&quot;webkit2gtk&quot;,
&gt; +                                   output_dir=output_dir,
&gt; +                                   pkg_config_path=pkg_config_path,
&gt; +                                   source_dirs=[src_dir],
&gt; +                                   doc_dir=doc_dir,
&gt; +                                   cflags=cflags,
&gt; +                                   library_path=library_path,
&gt; +                                   decorator=&quot;WEBKIT_API&quot;,
&gt; +                                   deprecation_guard=&quot;WEBKIT_DISABLE_DEPRECATED&quot;,
&gt; +                                   ignored_files=ignored_files)

I still think we could move all of this to the makefile, or turn it into a config file.

&gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:102
&gt; +        for (key, value) in args.iteritems():

You don&apos;t need parentheses here, it&apos;s the comma what makes the tuple.

&gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:182
&gt; +        (stdout, stderr) = process.communicate()

Ditto.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>491381</commentid>
    <comment_count>10</comment_count>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2011-10-27 00:37:02 -0700</bug_when>
    <thetext>(In reply to comment #9)

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/docs/build-gtkdoc:91
&gt; &gt; +generator = gtkdoc.PkgConfigGTKDoc(module_name=&quot;webkit2gtk&quot;,
&gt; &gt; +                                   output_dir=output_dir,
&gt; &gt; +                                   pkg_config_path=pkg_config_path,
&gt; &gt; +                                   source_dirs=[src_dir],
&gt; &gt; +                                   doc_dir=doc_dir,
&gt; &gt; +                                   cflags=cflags,
&gt; &gt; +                                   library_path=library_path,
&gt; &gt; +                                   decorator=&quot;WEBKIT_API&quot;,
&gt; &gt; +                                   deprecation_guard=&quot;WEBKIT_DISABLE_DEPRECATED&quot;,
&gt; &gt; +                                   ignored_files=ignored_files)
&gt; 
&gt; I still think we could move all of this to the makefile, or turn it into a config file.

For now, why don&apos;t we have build-gtkdoc be the config file? I&apos;m not sure it makes sense to add a bunch of configuration file parsing code now when Python is more expressive than any scheme we could come up with.

I don&apos;t prefer to have this in a makefile, because that means you&apos;ll need to run make to build the docs. On my system (which is quite speedy) make churns for 6 seconds before doing anything. This will make fixing the docs pretty painful as you need to continously run the tools as you are fixing errors.

I&apos;d like gtkdoc.py to be a module and not a standalone script as well. A module allows easier integration with other WebKit tooling such as webkit-patch, the EWS, and run-webkit-tests. I also am considering releasing gtkdoc.py as a standalone module for mucking with gtkdoc. Admittedly, I&apos;m not sure if that&apos;s useful yet.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:102
&gt; &gt; +        for (key, value) in args.iteritems():
&gt; 
&gt; You don&apos;t need parentheses here, it&apos;s the comma what makes the tuple.

Indeed, a comma is the tuple constructor, but I prefer to wrap my tuples in parenthesis the same way the interpreter does. I&apos;ll gladly change it if you feel strongly though.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>491395</commentid>
    <comment_count>11</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2011-10-27 00:57:46 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; (In reply to comment #9)
&gt; 
&gt; &gt; &gt; Source/WebKit2/UIProcess/API/gtk/docs/build-gtkdoc:91
&gt; &gt; &gt; +generator = gtkdoc.PkgConfigGTKDoc(module_name=&quot;webkit2gtk&quot;,
&gt; &gt; &gt; +                                   output_dir=output_dir,
&gt; &gt; &gt; +                                   pkg_config_path=pkg_config_path,
&gt; &gt; &gt; +                                   source_dirs=[src_dir],
&gt; &gt; &gt; +                                   doc_dir=doc_dir,
&gt; &gt; &gt; +                                   cflags=cflags,
&gt; &gt; &gt; +                                   library_path=library_path,
&gt; &gt; &gt; +                                   decorator=&quot;WEBKIT_API&quot;,
&gt; &gt; &gt; +                                   deprecation_guard=&quot;WEBKIT_DISABLE_DEPRECATED&quot;,
&gt; &gt; &gt; +                                   ignored_files=ignored_files)
&gt; &gt; 
&gt; &gt; I still think we could move all of this to the makefile, or turn it into a config file.
&gt; 
&gt; For now, why don&apos;t we have build-gtkdoc be the config file? I&apos;m not sure it makes sense to add a bunch of configuration file parsing code now when Python is more expressive than any scheme we could come up with.

Indeed, the config file would be just a python script that you can just import, it&apos;s pretty common, see the jhbuildrc file for example.

&gt; I don&apos;t prefer to have this in a makefile, because that means you&apos;ll need to run make to build the docs. On my system (which is quite speedy) make churns for 6 seconds before doing anything. This will make fixing the docs pretty painful as you need to continously run the tools as you are fixing errors.

But you will have to call it from the makefile anyway to generate the docs while building, no? Anyway, I&apos;m not saying you can&apos;t call it from the command line too, but when calling from the makefile you don&apos;t use the config file, you pass everything as command line arguments.

&gt; I&apos;d like gtkdoc.py to be a module and not a standalone script as well. A module allows easier integration with other WebKit tooling such as webkit-patch, the EWS, and run-webkit-tests. I also am considering releasing gtkdoc.py as a standalone module for mucking with gtkdoc. Admittedly, I&apos;m not sure if that&apos;s useful yet.

You can have both, just add:

if __name__ == &apos;__main__&apos;:
    main()

that won&apos;t be executed when the script is imported as a module.

&gt; &gt; &gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:102
&gt; &gt; &gt; +        for (key, value) in args.iteritems():
&gt; &gt; 
&gt; &gt; You don&apos;t need parentheses here, it&apos;s the comma what makes the tuple.
&gt; 
&gt; Indeed, a comma is the tuple constructor, but I prefer to wrap my tuples in parenthesis the same way the interpreter does. I&apos;ll gladly change it if you feel strongly though.

Not strongly, just that I&apos;m used to avoid paretheses when they are not needed, the same way we don&apos;t add parentheses in the ifs, but if you prefer to keep them for tuples, it&apos;s ok to me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>491511</commentid>
    <comment_count>12</comment_count>
      <attachid>112638</attachid>
    <who name="Philippe Normand">pnormand</who>
    <bug_when>2011-10-27 06:16:59 -0700</bug_when>
    <thetext>Comment on attachment 112638
Patch

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

&gt; Source/WebKit2/UIProcess/API/gtk/docs/build-gtkdoc:37
&gt; +def find_build_directory(top_level):

What they do in webkitpy is calling the perl webkit-build-directory script. I think it&apos;d be better to call it here instead of reinventing the wheel :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>491601</commentid>
    <comment_count>13</comment_count>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2011-10-27 08:28:53 -0700</bug_when>
    <thetext>(In reply to comment #11)

&gt; But you will have to call it from the makefile anyway to generate the docs while building, no? Anyway, I&apos;m not saying you can&apos;t call it from the command line too, but when calling from the makefile you don&apos;t use the config file, you pass everything as command line arguments.

At that point when you have to change a parameter you&apos;ll need to change it in both places. It&apos;s better to keep it in once place.

&gt; &gt; I&apos;d like gtkdoc.py to be a module and not a standalone script as well. A module allows easier integration with other WebKit tooling such as webkit-patch, the EWS, and run-webkit-tests. I also am considering releasing gtkdoc.py as a standalone module for mucking with gtkdoc. Admittedly, I&apos;m not sure if that&apos;s useful yet.

&gt; &gt; I&apos;d like gtkdoc.py to be a module and not a standalone script as well. 

&gt; You can have both, just add:
&gt; 
&gt; if __name__ == &apos;__main__&apos;:
&gt;     main()
&gt; 
&gt; that won&apos;t be executed when the script is imported as a module.

I should have been clearer. I&apos;d like to keep gtkdoc.py independent of WebKit. By making gtkdoc.py the main script I&apos;ll need to introduce WebKit specific stuff into it.

&gt; Not strongly, just that I&apos;m used to avoid paretheses when they are not needed, the same way we don&apos;t add parentheses in the ifs, but if you prefer to keep them for tuples, it&apos;s ok to me.

I guess my inclination is unusual here, so I&apos;ll change it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>491602</commentid>
    <comment_count>14</comment_count>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2011-10-27 08:33:35 -0700</bug_when>
    <thetext>(In reply to comment #12)

&gt; What they do in webkitpy is calling the perl webkit-build-directory script. I think it&apos;d be better to call it here instead of reinventing the wheel :)

Hrm. Looking at the code it doesn&apos;t look like it handles the non build-webkit builds. This is the kind of build Gustavo does while packaging and Carlos does in general.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>492163</commentid>
    <comment_count>15</comment_count>
      <attachid>112797</attachid>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2011-10-27 18:11:38 -0700</bug_when>
    <thetext>Created attachment 112797
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>492167</commentid>
    <comment_count>16</comment_count>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2011-10-27 18:12:31 -0700</bug_when>
    <thetext>(In reply to comment #15)
&gt; Created an attachment (id=112797) [details]
&gt; Patch

I&apos;ve removed the parenthesis around the tuples and the race condition when creating directories.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>492266</commentid>
    <comment_count>17</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2011-10-27 23:35:55 -0700</bug_when>
    <thetext>(In reply to comment #16)
&gt; (In reply to comment #15)
&gt; &gt; Created an attachment (id=112797) [details] [details]
&gt; &gt; Patch
&gt; 
&gt; I&apos;ve removed the parenthesis around the tuples and the race condition when creating directories.

The patch still doesn&apos;t include the interactiion with the build system, are you going to do that in a following patch? We should still generate the docs when building with --enable-gtk-doc, if just checking the warnings is fast we can always do it by default when building or add a new option --enable-gtk-doc-warnings or something like that, enabled by default. If it&apos;s really fast I would avoid adding a new option.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>492274</commentid>
    <comment_count>18</comment_count>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2011-10-27 23:54:33 -0700</bug_when>
    <thetext>(In reply to comment #17)

&gt; The patch still doesn&apos;t include the interactiion with the build system, are you going to do that in a following patch? We should still generate the docs when building with --enable-gtk-doc, if just checking the warnings is fast we can always do it by default when building or add a new option --enable-gtk-doc-warnings or something like that, enabled by default. If it&apos;s really fast I would avoid adding a new option.

Yeah. I planned to add that in a followup patch -- after fixing the rest of the gtkdoc errors for WebKit1 and WebKit2. Checking warnings by default should be easy to do. We should just skip the mkhtml and fixxref steps. I think we can actually get rid of --enable-gtk-doc altogether and just have &quot;make docs&quot; do the right thing always.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>498702</commentid>
    <comment_count>19</comment_count>
      <attachid>112797</attachid>
    <who name="Philippe Normand">pnormand</who>
    <bug_when>2011-11-09 00:36:25 -0800</bug_when>
    <thetext>Comment on attachment 112797
Patch

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

Looks great Martin, I suggested some small changes, no big deal I think.

&gt; Source/WebKit2/UIProcess/API/gtk/docs/build-gtkdoc:93
&gt; +sys.exit(1 if generator.saw_warnings else 0)

sys.exit(generator.saw_warnings)

should be enough I think.

&gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:112
&gt; +        raise_error_if_not_specified(&apos;output_dir&apos;)
&gt; +        raise_error_if_not_specified(&apos;source_dirs&apos;)
&gt; +        raise_error_if_not_specified(&apos;module_name&apos;)

If these arguments are not optional they should be made explicit in the constructor prototype.

&gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:189
&gt; +        if not self._has_executable_on_path(args[0]):
&gt; +            raise Exception(&apos;%s not found on path&apos;, args[0])
&gt; +
&gt; +        self.logger.info(&quot;Running %s&quot;, args[0])
&gt; +        self.logger.debug(&quot;Full command args: %s&quot;, str(args))
&gt; +        process = subprocess.Popen(args, env=env, cwd=cwd,
&gt; +                                   stdout=subprocess.PIPE,
&gt; +                                   stderr=subprocess.PIPE)

No need for self._has_executable_on_path I think. Just wrap the Popen call in a try/except block and catch OSError

&gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:200
&gt; +        if &apos;warning&apos; in stderr or &apos;warning&apos; in stdout:

if &apos;warning&apos; in stderr + stdout
would work as well. As you prefer :)

&gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:205
&gt; +

What about returning the stdout contents? So you could use this method instead of Popen in the sub-class

&gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:232
&gt; +        self._create_directory_if_nonexistent(self.output_dir)
&gt; +        copy_all_files_in_directory(self.doc_dir, self.output_dir)

Maybe use http://docs.python.org/library/shutil.html#shutil.copytree ?

&gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:243
&gt; +        self._create_directory_if_nonexistent(html_dest_dir)
&gt; +
&gt; +        if os.path.exists(html_src_dir):
&gt; +            copy_all_files_in_directory(html_src_dir, html_dest_dir)

Ditto

&gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:269
&gt; +        for source_dir in self.source_dirs:
&gt; +            args.append(&apos;--source-dir=%s&apos; % source_dir)

Just a suggestion, maybe use a list comprehension. They are faster than normal loops.

args.extend([&apos;--source-dir=%s&apos; % source_dir for source_dir in self.source_dirs])

&gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:295
&gt; +        if self.ldflags:
&gt; +            env[&apos;LDFLAGS&apos;] = ldflags

Shouldn&apos;t the test be &quot;if ldflags&quot; ?

&gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:304
&gt; +        if &apos;CFLAGS&apos; in env:
&gt; +            self.logger.debug(&apos;CFLAGS=%s&apos;, env[&apos;CFLAGS&apos;])
&gt; +        if &apos;LDFLAGS&apos; in env:
&gt; +            self.logger.debug(&apos;LDFLAGS %s&apos;, env[&apos;LDFLAGS&apos;])
&gt; +        if &apos;RUN&apos; in env:
&gt; +            self.logger.debug(&apos;RUN=%s&apos;, env[&apos;RUN&apos;])

Move these debug calls up to avoid the additional ifs?

&gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:325
&gt; +        for source_dir in self.source_dirs:
&gt; +            args.append(&apos;--source-dir=%s&apos; % source_dir)

Same remark as in the gtkdoc_scan method ;) Maybe it would make sense to store the result as an instance attribute?

&gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:369
&gt; +        if not &apos;pkg_config_path&apos; in args:
&gt; +            raise Exception(&apos;pkg_config_path not given&apos;)

pkg_config_path should be made explicit.
Now I understand why you used a dictionary in the parent class. I don&apos;t have a strong opinion about it anymore but my personal preference is to make arguments explicit, even in this case. But up to you, really.

&gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:389
&gt; +        self.version = process.communicate()[0].strip()

It&apos;d be nice to use _run_command instead of those Popen calls. Additional bonus points include logging support</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>499015</commentid>
    <comment_count>20</comment_count>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2011-11-09 08:51:59 -0800</bug_when>
    <thetext>(In reply to comment #19)

Thanks for the review.

&gt; sys.exit(generator.saw_warnings)
&gt; should be enough I think.

Done.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:112
&gt; &gt; +        raise_error_if_not_specified(&apos;output_dir&apos;)
&gt; &gt; +        raise_error_if_not_specified(&apos;source_dirs&apos;)
&gt; &gt; +        raise_error_if_not_specified(&apos;module_name&apos;)
&gt; 
&gt; If these arguments are not optional they should be made explicit in the constructor prototype.

I left them as kwargs. Making them explicit will remove the ability to specify them in any order, I think.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:189
&gt; &gt; +        if not self._has_executable_on_path(args[0]):
&gt; &gt; +            raise Exception(&apos;%s not found on path&apos;, args[0])
&gt; &gt; +
&gt; &gt; +        self.logger.info(&quot;Running %s&quot;, args[0])
&gt; &gt; +        self.logger.debug(&quot;Full command args: %s&quot;, str(args))
&gt; &gt; +        process = subprocess.Popen(args, env=env, cwd=cwd,
&gt; &gt; +                                   stdout=subprocess.PIPE,
&gt; &gt; +                                   stderr=subprocess.PIPE)
&gt; 
&gt; No need for self._has_executable_on_path I think. Just wrap the Popen call in a try/except block and catch OSError

Okay. I just let the exception bubble up now.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:200
&gt; &gt; +        if &apos;warning&apos; in stderr or &apos;warning&apos; in stdout:
&gt; if &apos;warning&apos; in stderr + stdout
&gt; would work as well. As you prefer :)

I just left the previous style, because I like how explicit it is and that it doesn&apos;t create a temporary string.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:205
&gt; &gt; +
&gt; What about returning the stdout contents? So you could use this method instead of Popen in the sub-class

Great idea! I&apos;ve done this.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:232
&gt; &gt; +        self._create_directory_if_nonexistent(self.output_dir)
&gt; &gt; +        copy_all_files_in_directory(self.doc_dir, self.output_dir)
&gt; 
&gt; Maybe use http://docs.python.org/library/shutil.html#shutil.copytree ?

With copytree I&apos;d have to delete the parent directory first and any files placed by the user would disappear. copytree is also recursive, so I&apos;d need to hack the ignore callable to avoid copying too much. I stuck with the manual approach here. Hope that&apos;s okay.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:269
&gt; &gt; +        for source_dir in self.source_dirs:
&gt; &gt; +            args.append(&apos;--source-dir=%s&apos; % source_dir)
&gt; 
&gt; Just a suggestion, maybe use a list comprehension. They are faster than normal loops.
&gt; args.extend([&apos;--source-dir=%s&apos; % source_dir for source_dir in self.source_dirs])

Did this!

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:295
&gt; &gt; +        if self.ldflags:
&gt; &gt; +            env[&apos;LDFLAGS&apos;] = ldflags
&gt; 
&gt; Shouldn&apos;t the test be &quot;if ldflags&quot; ?

Yes! Fixed.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:304
&gt; &gt; +        if &apos;CFLAGS&apos; in env:
&gt; &gt; +            self.logger.debug(&apos;CFLAGS=%s&apos;, env[&apos;CFLAGS&apos;])
&gt; &gt; +        if &apos;LDFLAGS&apos; in env:
&gt; &gt; +            self.logger.debug(&apos;LDFLAGS %s&apos;, env[&apos;LDFLAGS&apos;])
&gt; &gt; +        if &apos;RUN&apos; in env:
&gt; &gt; +            self.logger.debug(&apos;RUN=%s&apos;, env[&apos;RUN&apos;])
&gt; 
&gt; Move these debug calls up to avoid the additional ifs?

The idea was that if they already had something in their environment that was interfering with the run, they could see it when they printed out debugging information. I think that&apos;s a good feature to keep.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:325
&gt; &gt; +        for source_dir in self.source_dirs:
&gt; &gt; +            args.append(&apos;--source-dir=%s&apos; % source_dir)
&gt; 
&gt; Same remark as in the gtkdoc_scan method ;) Maybe it would make sense to store the result as an instance attribute?

Fixed, but regenerated it. It should be a very cheap operation.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:369
&gt; &gt; +        if not &apos;pkg_config_path&apos; in args:
&gt; &gt; +            raise Exception(&apos;pkg_config_path not given&apos;)
&gt; 
&gt; pkg_config_path should be made explicit.
&gt; Now I understand why you used a dictionary in the parent class. I don&apos;t have a strong opinion about it anymore but my personal preference is to make arguments explicit, even in this case. But up to you, really.

Made pkg_config_path explicit, but kept the rest as kwargs.

&gt; &gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:389
&gt; &gt; +        self.version = process.communicate()[0].strip()
&gt; 
&gt; It&apos;d be nice to use _run_command instead of those Popen calls. Additional bonus points include logging support

Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>499016</commentid>
    <comment_count>21</comment_count>
      <attachid>114294</attachid>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2011-11-09 08:54:03 -0800</bug_when>
    <thetext>Created attachment 114294
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>499038</commentid>
    <comment_count>22</comment_count>
      <attachid>114294</attachid>
    <who name="Philippe Normand">pnormand</who>
    <bug_when>2011-11-09 09:09:05 -0800</bug_when>
    <thetext>Comment on attachment 114294
Patch

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

Ok! Just a last little remark. Thanks again for the efforts on this!

&gt; Source/WebKit2/UIProcess/API/gtk/docs/gtkdoc.py:361
&gt; +        self._read_pkg_config_file(pkg_config_path)
&gt; +
&gt; +    def _read_pkg_config_file(self, pkg_config_path):

Oh sorry I missed that in previous review. Maybe you can do everything in the constructor? Well a separate method is ok as well :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>499588</commentid>
    <comment_count>23</comment_count>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2011-11-09 19:00:51 -0800</bug_when>
    <thetext>Committed r99802: &lt;http://trac.webkit.org/changeset/99802&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>499589</commentid>
    <comment_count>24</comment_count>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2011-11-09 19:01:22 -0800</bug_when>
    <thetext>(In reply to comment #22)

&gt; Oh sorry I missed that in previous review. Maybe you can do everything in the constructor? Well a separate method is ok as well :)

Sure, that&apos;s a reasonable change. I did that before landing.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>112464</attachid>
            <date>2011-10-26 00:50:09 -0700</date>
            <delta_ts>2011-10-26 21:22:35 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-70877-20111026005008.patch</filename>
            <type>text/plain</type>
            <size>28055</size>
            <attacher name="Martin Robinson">mrobinson</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTc4NjYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwppbmRleCBjNjY5YTJiYzVlMzk5ODQ0
ODk1ODRiZTY1ZDFlYWZkZDM1ZWI4YTc5Li4xMWI5ZTE2MzhhODUzNDExMWZhZjdhOGYxZjMyNmM0
YmE4OThhZjgwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cKKysrIGIvU291
cmNlL1dlYktpdDIvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTkgQEAKKzIwMTEtMTAtMjYgIE1hcnRp
biBSb2JpbnNvbiAgPG1yb2JpbnNvbkBpZ2FsaWEuY29tPgorCisgICAgICAgIFtHVEtdIFtXZWJL
aXRdIFJlcGxhY2UgdGhlIGd0a2RvYyBhdXRvb2xzIG1hZ2ljIHdpdGggc29tZXRoaW5nIG1vcmUg
ZmxleGlibGUKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTcwODc3CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
QWRkIGEgc2NyaXB0IHRoYXQgcnVucyBndGtkb2MgbWFudWFsbHkgaW5zdGVhZCBvZiB1c2luZyB0
aGUgYXV0b3Rvb2xzCisgICAgICAgIG1hZ2ljLiBSZW1vdmUgbm93IHVudXNlZCBndGtkb2MgZmls
ZXMuCisKKyAgICAgICAgKiBHTlVtYWtlZmlsZS5hbTogUmVtb3ZlIHJlZmVyZW5jZXMgdG8gcmVt
b3ZlZCBndGtkb2MgZmlsZXMuCisgICAgICAgICogVUlQcm9jZXNzL0FQSS9ndGsvZG9jcy9HTlVt
YWtlZmlsZS5hbTogUmVtb3ZlZC4KKyAgICAgICAgKiBVSVByb2Nlc3MvQVBJL2d0ay9kb2NzL2J1
aWxkLWd0a2RvYzogQWRkZWQuCisgICAgICAgICogVUlQcm9jZXNzL0FQSS9ndGsvZG9jcy9ndGtk
b2MucHk6IEFkZGVkLgorICAgICAgICAqIFVJUHJvY2Vzcy9BUEkvZ3RrL2RvY3MvdmVyc2lvbi54
bWwuaW46IFJlbW92ZWQuCisKIDIwMTEtMTAtMTkgIENhaW8gTWFyY2VsbyBkZSBPbGl2ZWlyYSBG
aWxobyAgPGNhaW8ub2xpdmVpcmFAb3BlbmJvc3NhLm9yZz4KIAogICAgICAgICBbUXRdIFtXSzJd
IFJlbmFtZSBmaWxlcyBhbmQgY2xhc3NlcyB0byBmb2xsb3cgY29udmVudGlvbnMKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJLaXQyL0dOVW1ha2VmaWxlLmFtIGIvU291cmNlL1dlYktpdDIvR05VbWFr
ZWZpbGUuYW0KaW5kZXggNzNlY2YwNjI5YzFkZGM0MjBmYWU3YzcxYjViNGQzZjkyNDBmOWMzZC4u
MDBhMzE1OTE1YmFiZmRiMTUwYzE5MTU3OWRiNjRiNWU0MTYzOGQyMCAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYktpdDIvR05VbWFrZWZpbGUuYW0KKysrIGIvU291cmNlL1dlYktpdDIvR05VbWFrZWZp
bGUuYW0KQEAgLTEzNjUsOCArMTM2NSw4IEBAIFByb2dyYW1zX1dlYktpdFBsdWdpblByb2Nlc3Nf
Q1hYRkxBR1MgPSBcCiBlbmRpZgogCiBFWFRSQV9ESVNUICs9IFwKLQkkKFdlYktpdDIpL1VJUHJv
Y2Vzcy9BUEkvZ3RrL2RvY3MvR05VbWFrZWZpbGUuYW0gXAorCSQoV2ViS2l0MikvVUlQcm9jZXNz
L0FQSS9ndGsvZG9jcy9idWlsZC1ndGtkb2MucHkgXAorCSQoV2ViS2l0MikvVUlQcm9jZXNzL0FQ
SS9ndGsvZG9jcy9ndGtkb2MucHkgXAogCSQoV2ViS2l0MikvVUlQcm9jZXNzL0FQSS9ndGsvZG9j
cy93ZWJraXRndGstZG9jcy5zZ21sIFwKIAkkKFdlYktpdDIpL1VJUHJvY2Vzcy9BUEkvZ3RrL2Rv
Y3Mvd2Via2l0Z3RrLXNlY3Rpb25zLnR4dCBcCi0JJChXZWJLaXQyKS9VSVByb2Nlc3MvQVBJL2d0
ay9kb2NzL3ZlcnNpb24ueG1sLmluIFwKIAkkKFdlYktpdDIpL1VJUHJvY2Vzcy9BUEkvZ3RrL2Rv
Y3Mvd2Via2l0Mmd0ay50eXBlcwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNz
L0FQSS9ndGsvZG9jcy9HTlVtYWtlZmlsZS5hbSBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9B
UEkvZ3RrL2RvY3MvR05VbWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IGI0OTA3Njg5NTU5NGEzMGYxZWY1NGEzM2JiOGJmMTQ0YzRjYjNmNTkuLjAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNz
L0FQSS9ndGsvZG9jcy9HTlVtYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCww
IEBACi0jIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIHByb2R1Y2UgR05VbWFr
ZWZpbGUuaW4KLQotIyBXZSByZXF1aXJlIGF1dG9tYWtlIDEuNiBhdCBsZWFzdC4KLUFVVE9NQUtF
X09QVElPTlMgPSAxLjYKLQotIyBUaGlzIGlzIGEgYmxhbmsgTWFrZWZpbGUuYW0gZm9yIHVzaW5n
IGd0ay1kb2MuCi0jIENvcHkgdGhpcyB0byB5b3VyIHByb2plY3QncyBBUEkgZG9jcyBkaXJlY3Rv
cnkgYW5kIG1vZGlmeSB0aGUgdmFyaWFibGVzIHRvCi0jIHN1aXQgeW91ciBwcm9qZWN0LiBTZWUg
dGhlIEdUSysgTWFrZWZpbGVzIGluIGd0aysvZG9jcy9yZWZlcmVuY2UgZm9yIGV4YW1wbGVzCi0j
IG9mIHVzaW5nIHRoZSB2YXJpb3VzIG9wdGlvbnMuCi0KLSMgVGhlIG5hbWUgb2YgdGhlIG1vZHVs
ZSwgZS5nLiAnZ2xpYicuCi1ET0NfTU9EVUxFPXdlYmtpdDJndGsKLQotIyBUaGUgdG9wLWxldmVs
IFNHTUwgZmlsZS4gWW91IGNhbiBjaGFuZ2UgdGhpcyBpZiB5b3Ugd2FudCB0by4KLURPQ19NQUlO
X1NHTUxfRklMRT0kKERPQ19NT0RVTEUpLWRvY3Muc2dtbAotCi0jIFRoZSBkaXJlY3RvcnkgY29u
dGFpbmluZyB0aGUgc291cmNlIGNvZGUuIFJlbGF0aXZlIHRvICQoc3JjZGlyKS4KLSMgZ3RrLWRv
YyB3aWxsIHNlYXJjaCBhbGwgLmMgJiAuaCBmaWxlcyBiZW5lYXRoIGhlcmUgZm9yIGlubGluZSBj
b21tZW50cwotIyBkb2N1bWVudGluZyB0aGUgZnVuY3Rpb25zIGFuZCBtYWNyb3MuCi0jIGUuZy4g
RE9DX1NPVVJDRV9ESVI9Li4vLi4vLi4vZ3RrCi1ET0NfU09VUkNFX0RJUj0kKHRvcF9zcmNkaXIp
L1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrCi0KLSMgRXh0cmEgb3B0aW9ucyB0byBw
YXNzIHRvIGd0a2RvYy1zY2FuZ29iai4gTm90IG5vcm1hbGx5IG5lZWRlZC4KLVNDQU5HT0JKX09Q
VElPTlM9Ii0tdHlwZS1pbml0LWZ1bmM9Z190aHJlYWRfaW5pdChOVUxMKTtnX3R5cGVfaW5pdCgp
IgotCi0jIEV4dHJhIG9wdGlvbnMgdG8gc3VwcGx5IHRvIGd0a2RvYy1zY2FuLgotIyBlLmcuIFND
QU5fT1BUSU9OUz0tLWRlcHJlY2F0ZWQtZ3VhcmRzPSJHVEtfRElTQUJMRV9ERVBSRUNBVEVEIgot
U0NBTl9PUFRJT05TPS0taWdub3JlLWRlY29yYXRvcnM9IldFQktJVF9BUEkiCi0KLSMgRXh0cmEg
b3B0aW9ucyB0byBzdXBwbHkgdG8gZ3RrZG9jLW1rZGIuCi0jIGUuZy4gTUtEQl9PUFRJT05TPS0t
c2dtbC1tb2RlIC0tb3V0cHV0LWZvcm1hdD14bWwKLU1LREJfT1BUSU9OUz0tLXNnbWwtbW9kZSAt
LW91dHB1dC1mb3JtYXQ9eG1sIC0tc291cmNlLXN1ZmZpeGVzPWgsYyxjcHAKLQotIyBFeHRyYSBv
cHRpb25zIHRvIHN1cHBseSB0byBndGtkb2MtbWt0bXBsCi0jIGUuZy4gTUtUTVBMX09QVElPTlM9
LS1vbmx5LXNlY3Rpb24tdG1wbAotTUtUTVBMX09QVElPTlM9Ci0KLSMgRXh0cmEgb3B0aW9ucyB0
byBzdXBwbHkgdG8gZ3RrZG9jLWZpeHJlZi4gTm90IG5vcm1hbGx5IG5lZWRlZC4KLSMgZS5nLiBG
SVhYUkVGX09QVElPTlM9LS1leHRyYS1kaXI9Li4vZ2RrLXBpeGJ1Zi9odG1sIC0tZXh0cmEtZGly
PS4uL2dkay9odG1sCi1GSVhYUkVGX09QVElPTlM9Ci0KLSMgVXNlZCBmb3IgZGVwZW5kZW5jaWVz
LiBUaGUgZG9jcyB3aWxsIGJlIHJlYnVpbHQgaWYgYW55IG9mIHRoZXNlIGNoYW5nZS4KLSMgZS5n
LiBIRklMRV9HTE9CPSQodG9wX3NyY2RpcikvZ3RrLyouaAotIyBlLmcuIENGSUxFX0dMT0I9JCh0
b3Bfc3JjZGlyKS9ndGsvKi5jCi1IRklMRV9HTE9CPSQodG9wX3NyY2RpcikvU291cmNlL1dlYktp
dDIvVUlQcm9jZXNzL0FQSS9ndGsvKi5oCi1DRklMRV9HTE9CPSQodG9wX3NyY2RpcikvU291cmNl
L1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvKi5jcHAKLQotIyBIZWFkZXIgZmlsZXMgdG8gaWdu
b3JlIHdoZW4gc2Nhbm5pbmcuCi0jIGUuZy4gSUdOT1JFX0hGSUxFUz1ndGtkZWJ1Zy5oIGd0a2lu
dGwuaAotSUdOT1JFX0hGSUxFUyA9IFwKLQlMb2FkVHJhY2tpbmdUZXN0LmggXAotCVBhZ2VDbGll
bnRJbXBsLmggXAotCVRlc3RNYWluLmggXAotCVdlYlZpZXdUZXN0LmggXAotCVdlYktpdERlZmlu
ZXMuaCBcCi0JV2ViS2l0UHJpdmF0ZS5oIFwKLQlXZWJLaXRXZWJDb250ZXh0UHJpdmF0ZS5oIFwK
LQlXZWJLaXRXZWJWaWV3QmFzZVByaXZhdGUuaAotCi0jIEltYWdlcyB0byBjb3B5IGludG8gSFRN
TCBkaXJlY3RvcnkuCi0jIGUuZy4gSFRNTF9JTUFHRVM9JCh0b3Bfc3JjZGlyKS9ndGsvc3RvY2st
aWNvbnMvc3RvY2tfYWJvdXRfMjQucG5nCi1IVE1MX0lNQUdFUz0KLQotIyBFeHRyYSBTR01MIGZp
bGVzIHRoYXQgYXJlIGluY2x1ZGVkIGJ5ICQoRE9DX01BSU5fU0dNTF9GSUxFKS4KLSMgZS5nLiBj
b250ZW50X2ZpbGVzPXJ1bm5pbmcuc2dtbCBidWlsZGluZy5zZ21sIGNoYW5nZXMtMi4wLnNnbWwK
LWNvbnRlbnRfZmlsZXM9Ci0KLSMgU0dNTCBmaWxlcyB3aGVyZSBndGstZG9jIGFiYnJldmF0aW9u
cyAoI0d0a1dpZGdldCkgYXJlIGV4cGFuZGVkCi0jIFRoZXNlIGZpbGVzIG11c3QgYmUgbGlzdGVk
IGhlcmUgKmFuZCogaW4gY29udGVudF9maWxlcwotIyBlLmcuIGV4cGFuZF9jb250ZW50X2ZpbGVz
PXJ1bm5pbmcuc2dtbAotZXhwYW5kX2NvbnRlbnRfZmlsZXM9Ci0KLSMgQ0ZMQUdTIGFuZCBMREZM
QUdTIGZvciBjb21waWxpbmcgZ3RrZG9jLXNjYW5nb2JqIHdpdGggeW91ciBsaWJyYXJ5LgotIyBP
bmx5IG5lZWRlZCBpZiB5b3UgYXJlIHVzaW5nIGd0a2RvYy1zY2FuZ29iaiB0byBkeW5hbWljYWxs
eSBxdWVyeSB3aWRnZXQKLSMgc2lnbmFscyBhbmQgcHJvcGVydGllcy4KLSMgZS5nLiBJTkNMVURF
Uz0tSSQodG9wX3NyY2RpcikgLUkkKHRvcF9idWlsZGRpcikgJChHVEtfREVCVUdfRkxBR1MpCi0j
IGUuZy4gR1RLRE9DX0xJQlM9JCh0b3BfYnVpbGRkaXIpL2d0ay8kKGd0a3RhcmdldGxpYikKLUlO
Q0xVREVTPSBcCi0JLUkkKHRvcF9zcmNkaXIpL1NvdXJjZSBcCi0JLUkkKHRvcF9zcmNkaXIpL1Nv
dXJjZS9XZWJLaXQyIFwKLQktSSQodG9wX2J1aWxkZGlyKS9EZXJpdmVkU291cmNlcyBcCi0JLUkk
KHRvcF9idWlsZGRpcikvRGVyaXZlZFNvdXJjZXMvV2ViS2l0Mi9pbmNsdWRlIFwKLQktSSQodG9w
X2J1aWxkZGlyKS9EZXJpdmVkU291cmNlcy9XZWJLaXQyL3dlYmtpdDJndGsgXAotCS1JJCh0b3Bf
YnVpbGRkaXIpL0Rlcml2ZWRTb3VyY2VzL1dlYktpdDIvd2Via2l0Mmd0ay9pbmNsdWRlIFwKLQkt
SSQodG9wX3NyY2RpcikvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsgXAotCSQoZ2xv
YmFsX2NwcGZsYWdzKSBcCi0JJChnbG9iYWxfY2ZsYWdzKSBcCi0JJChHTElCX0NGTEFHUykgXAot
CSQoR1RLX0NGTEFHUykgXAotCSQoTElCU09VUF9DRkxBR1MpIFwKLQkkKGphdmFzY3JpcHRjb3Jl
X2NwcGZsYWdzKQotCi1HVEtET0NfTElCUz0gXAotCSQodG9wX2J1aWxkZGlyKS9saWJqYXZhc2Ny
aXB0Y29yZWd0ay1AV0VCS0lUR1RLX0FQSV9NQUpPUl9WRVJTSU9OQC5AV0VCS0lUR1RLX0FQSV9N
SU5PUl9WRVJTSU9OQC5sYSBcCi0JJCh0b3BfYnVpbGRkaXIpL2xpYndlYmtpdDJndGstQFdFQktJ
VEdUS19BUElfTUFKT1JfVkVSU0lPTkAuQFdFQktJVEdUS19BUElfTUlOT1JfVkVSU0lPTkAubGEg
XAotCSQoR0xJQl9MSUJTKSBcCi0JJChHVEtfTElCUykKLQotIyBUaGlzIGluY2x1ZGVzIHRoZSBz
dGFuZGFyZCBndGstZG9jIG1ha2UgcnVsZXMsIGNvcGllZCBieSBndGtkb2NpemUuCi1pbmNsdWRl
ICQodG9wX3NyY2RpcikvZ3RrLWRvYy5tYWtlCi0KLSMgT3RoZXIgZmlsZXMgdG8gZGlzdHJpYnV0
ZQotIyBlLmcuIEVYVFJBX0RJU1QgKz0gdmVyc2lvbi54bWwuaW4KLUVYVFJBX0RJU1QgKz0KLQot
IyBGaWxlcyBub3QgdG8gZGlzdHJpYnV0ZQotIyBmb3IgLS1yZWJ1aWxkLXR5cGVzIGluICQoU0NB
Tl9PUFRJT05TKSwgZS5nLiAkKERPQ19NT0RVTEUpLnR5cGVzCi0jIGZvciAtLXJlYnVpbGQtc2Vj
dGlvbnMgaW4gJChTQ0FOX09QVElPTlMpIGUuZy4gJChET0NfTU9EVUxFKS1zZWN0aW9ucy50eHQK
LSNESVNUQ0xFQU5GSUxFUyArPQotCi0jIENvbW1lbnQgdGhpcyBvdXQgaWYgeW91IHdhbnQgeW91
ciBkb2NzLXN0YXR1cyB0ZXN0ZWQgZHVyaW5nICdtYWtlIGNoZWNrJwotI1RFU1RTID0gJChHVEtE
T0NfQ0hFQ0spCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay9k
b2NzL2J1aWxkLWd0a2RvYyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL2RvY3Mv
YnVpbGQtZ3RrZG9jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjkzZTAwZjJlMzM5MzE0OTJhZjA0YThhZjkzYzA3ZDMy
MTAyMWVkNmIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJ
L2d0ay9kb2NzL2J1aWxkLWd0a2RvYwpAQCAtMCwwICsxLDg1IEBACisjIS91c3IvYmluL2VudiBw
eXRob24KKyMgIENvcHlyaWdodCAoQykgMjAxMSBJZ2FsaWEgUy5MLgorIworIyAgVGhpcyBsaWJy
YXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyAg
bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1Ymxp
YworIyAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
bjsgZWl0aGVyCisjICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQg
aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgIGJ1dCBXSVRIT1VUIEFOWSBX
QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjICBNRVJDSEFO
VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdO
VQorIyAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMK
KyMgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2Vu
ZXJhbCBQdWJsaWMKKyMgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwg
d3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5r
bGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorIwor
CitpbXBvcnQgZ2xvYgoraW1wb3J0IGd0a2RvYworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBvcy5w
YXRoCitpbXBvcnQgc3lzCisKK2RlZiBjb25maWd1cmVfbG9nZ2luZygpOgorICAgIGxldmVsID0g
bG9nZ2luZy5ERUJVRyBpZiAnLXYnIGluIHN5cy5hcmd2IGVsc2UgbG9nZ2luZy5JTkZPCisgICAg
bG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoImd0a2RvYyIpCisgICAgbG9nZ2VyLnNldExldmVs
KGxldmVsKQorICAgIGhhbmRsZXIgPSBsb2dnaW5nLlN0cmVhbUhhbmRsZXIoKQorICAgIGhhbmRs
ZXIuc2V0TGV2ZWwobGV2ZWwpCisgICAgbG9nZ2VyLmFkZEhhbmRsZXIoaGFuZGxlcikKKyAgICBp
ZiBsZXZlbCA9PSBsb2dnaW5nLkRFQlVHOgorICAgICAgICBoYW5kbGVyLnNldEZvcm1hdHRlcihs
b2dnaW5nLkZvcm1hdHRlcignWyUoYXNjdGltZSlzXSAgJShtZXNzYWdlKXMnKSkKKyAgICBlbHNl
OgorICAgICAgICBoYW5kbGVyLnNldEZvcm1hdHRlcihsb2dnaW5nLkZvcm1hdHRlcignJShtZXNz
YWdlKXMnKSkKKworZGVmIGZpbmRfYnVpbGRfZGlyZWN0b3J5KHRvcF9sZXZlbCk6CisgICAgZGVm
IGlzX3ZhbGlkX2J1aWxkX2RpcmVjdG9yeShidWlsZF9kaXIpOgorICAgICAgICByZXR1cm4gb3Mu
cGF0aC5leGlzdHMob3MucGF0aC5qb2luKGJ1aWxkX2RpciwgIi5saWJzIikpCisgICAgaWYgaXNf
dmFsaWRfYnVpbGRfZGlyZWN0b3J5KHRvcF9sZXZlbCk6CisgICAgICAgIHJldHVybiB0b3BfbGV2
ZWwKKyAgICBidWlsZF9kaXIgPSBvcy5wYXRoLmpvaW4odG9wX2xldmVsLCAnV2ViS2l0QnVpbGQn
LCAnUmVsZWFzZScpCisgICAgaWYgaXNfdmFsaWRfYnVpbGRfZGlyZWN0b3J5KGJ1aWxkX2Rpcik6
CisgICAgICAgIHJldHVybiBidWlsZF9kaXIKKyAgICBidWlsZF9kaXIgPSBvcy5wYXRoLmpvaW4o
dG9wX2xldmVsLCAnV2ViS2l0QnVpbGQnLCAnRGVidWcnKQorICAgIGlmIGlzX3ZhbGlkX2J1aWxk
X2RpcmVjdG9yeShidWlsZF9kaXIpOgorICAgICAgICByZXR1cm4gYnVpbGRfZGlyCisgICAgcHJp
bnQgIkNvdWxkIG5vdCBkZXRlcm1pbmUgYnVpbGQgZGlyZWN0b3J5LiIKKyAgICBzeXMuZXhpdCgx
KQorCitkb2NfZGlyID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykp
Cit0b3BfbGV2ZWwgPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguam9pbihkb2NfZGlyLCAnLi4n
LCAnLi4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4uJywg
Jy4uJywgJy4uJywgJy4uJykpCitidWlsZF9kaXIgPSBmaW5kX2J1aWxkX2RpcmVjdG9yeSh0b3Bf
bGV2ZWwpCisKK291dHB1dF9kaXIgPSBvcy5wYXRoLmpvaW4oYnVpbGRfZGlyLCAiRG9jdW1lbnRh
dGlvbiIsICJXZWJLaXQyIikKK3NyY19kaXIgPSBvcy5wYXRoLmpvaW4oZG9jX2RpciwgJy4uJykK
K2xpYnJhcnlfcGF0aCA9IG9zLnBhdGguam9pbihidWlsZF9kaXIsICIubGlicyIpCitwa2dfY29u
ZmlnX3BhdGggPSBcCisgICAgb3MucGF0aC5qb2luKGJ1aWxkX2RpciwgIlNvdXJjZSIsICJXZWJL
aXQyIiwgIndlYmtpdDJndGstMy4wLnBjIikKKworZGVyaXZlZF9zb3VyY2VzID0gb3MucGF0aC5q
b2luKGJ1aWxkX2RpciwgIkRlcml2ZWRTb3VyY2VzIiwgIldlYktpdDIiKQorY2ZsYWdzID0gXAor
JyAtSScgKyBvcy5wYXRoLmpvaW4oZGVyaXZlZF9zb3VyY2VzLCAnd2Via2l0Mmd0aycsICdpbmNs
dWRlJykgKyBcCisnIC1JJyArIG9zLnBhdGguam9pbihkZXJpdmVkX3NvdXJjZXMsICd3ZWJraXQy
Z3RrJykgKyBcCisnIC1JJyArIG9zLnBhdGguam9pbihkZXJpdmVkX3NvdXJjZXMsICdpbmNsdWRl
JykgKyBcCisnIC1JJyArIG9zLnBhdGguam9pbih0b3BfbGV2ZWwsICdTb3VyY2UnKQorJyAtSScg
KyBzcmNfZGlyCisKK2lnbm9yZWRfZmlsZXMgPSBnbG9iLmdsb2IoIiVzLypQcml2YXRlLmgiICUg
c3JjX2RpcikgKyBcCisgICAgICAgICAgICAgICAgZ2xvYi5nbG9iKCIlcy90ZXN0cyouaCIgJSBz
cmNfZGlyKQorCitjb25maWd1cmVfbG9nZ2luZygpCitnZW5lcmF0b3IgPSBndGtkb2MuUGtnQ29u
ZmlnR1RLRG9jKG1vZHVsZV9uYW1lPSJ3ZWJraXQyZ3RrIiwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgb3V0cHV0X2Rpcj1vdXRwdXRfZGlyLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBwa2dfY29uZmlnX3BhdGg9cGtnX2NvbmZpZ19wYXRoLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfZGlycz1bc3JjX2Rpcl0sCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY19kaXI9ZG9jX2RpciwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZsYWdzPWNmbGFncywKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgbGlicmFyeV9wYXRoPWxpYnJhcnlfcGF0aCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb3JhdG9yPSJXRUJLSVRfQVBJIiwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRpb25fZ3VhcmQ9IldFQktJVF9E
SVNBQkxFX0RFUFJFQ0FURUQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBp
Z25vcmVkX2ZpbGVzPWlnbm9yZWRfZmlsZXMpCitnZW5lcmF0b3IuZ2VuZXJhdGUoaHRtbD0nLS1z
a2lwLWh0bWwnIG5vdCBpbiBzeXMuYXJndikKK3N5cy5leGl0KDEgaWYgZ2VuZXJhdG9yLnNhd193
YXJuaW5ncyBlbHNlIDApCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJ
L2d0ay9kb2NzL2d0a2RvYy5weSBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL2Rv
Y3MvZ3RrZG9jLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmQzMGU0ZTRhOThjYjU3OTExM2UzM2M1Njg1NWE1NDJm
YTk2NzA5NzgKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJ
L2d0ay9kb2NzL2d0a2RvYy5weQpAQCAtMCwwICsxLDM4MiBAQAorIyAgQ29weXJpZ2h0IChDKSAy
MDExIElnYWxpYSBTLkwuCisjCisjICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91
IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1z
IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisjICBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyMgIHZlcnNpb24gMiBv
ZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMK
KyMgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg
YmUgdXNlZnVsLAorIyAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKKyMgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjICBMZXNzZXIgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgWW91IHNob3VsZCBoYXZlIHJlY2Vp
dmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworIyAgTGljZW5zZSBh
bG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2Fy
ZQorIyAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwg
Qm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisjCisKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQg
b3MKK2ltcG9ydCBvcy5wYXRoCitpbXBvcnQgc3VicHJvY2VzcworCisKK2NsYXNzIEdUS0RvYyhv
YmplY3QpOgorCisgICAgIiIiQ2xhc3MgdGhhdCBjb250cm9scyBhIGd0a2RvYyBydW4uCisKKyAg
ICBFYWNoIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50cyBvbmUgZ3RrZG9jIGNvbmZp
Z3VyYXRpb24KKyAgICBhbmQgc2V0IG9mIGRvY3VtZW50YXRpb24uIFRoZSBndGtkb2MgcGFja2Fn
ZSBpcyBhIHNlcmllcyBvZiB0b29scworICAgIHJ1biBjb25zZWN1dGl2ZWx5IHdoaWNoIGNvbnZl
cnRzIGlubGluZSBDL0MrKyBkb2N1bWVudGF0aW9uIGludG8KKyAgICBkb2Nib29rIGZpbGVzIGFu
ZCB0aGVuIGludG8gSFRNTC4gVGhpcyBjbGFzcyBpcyBzdWl0YWJsZSBmb3IKKyAgICBnZW5lcmF0
aW5nIGRvY3VtZW50YXRpb24gb3Igc2ltcGx5IHZlcmlmeWluZyBjb3JyZWN0bmVzcy4KKworICAg
IEtleXdvcmQgYXJndW1lbnRzOgorICAgIG91dHB1dF9kaXIgICAgICAgICAtLSBUaGUgcGF0aCB3
aGVyZSBndGtkb2Mgb3V0cHV0IHNob3VsZCBiZSBwbGFjZWQuIEdlbmVyYXRpb24KKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgbWF5IG92ZXJ3cml0ZSBmaWxlIGluIHRoaXMgZGlyZWN0b3J5LiBS
ZXF1aXJlZC4KKyAgICBtb2R1bGVfbmFtZSAgICAgICAgLS0gVGhlIG5hbWUgb2YgdGhlIGRvY3Vt
ZW50YXRpb24gbW9kdWxlLiBGb3IgbGlicmFyaWVzIHRoaXMKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgaXMgdHlwaWNhbGx5IHRoZSBsaWJyYXJ5IG5hbWUuIFJlcXVpcmVkIGlmIG5vdCBsaWJy
YXJ5IHBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgZ2l2ZW4uCisgICAgc291cmNl
X2RpcnMgICAgICAgIC0tIEEgbGlzdCBvZiBwYXRocyB0byB0aGUgc291cmNlIGNvZGUgdG8gYmUg
c2Nhbm5lZC4gUmVxdWlyZWQuCisgICAgaWdub3JlZF9maWxlcyAgICAgIC0tIEEgbGlzdCBvZiBm
aWxlbmFtZXMgdG8gaWdub3JlIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LiBJdCBpcworICAgICAg
ICAgICAgICAgICAgICAgICAgICBvbmx5IG5lY2Vzc2FyeSB0byBwcm92aWRlIHRoZSBiYXNlbmFt
ZXMgb2YgdGhlc2UgZmlsZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGljYWxseSBp
dCBpcyBpbXBvcnRhbnQgdG8gcHJvdmlkZSBhbiB1cGRhdGVkIGxpc3Qgb2YKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgaWdub3JlZCBmaWxlcyB0byBwcmV2ZW50IHdhcm5pbmdzIGFib3V0IHVu
ZG9jdW1lbnRlZCBzeW1ib2xzLgorICAgIGRlY29yYXRvciAgICAgICAgICAtLSBJZiBhIGRlY29y
YXRvciBpcyB1c2VkIHRvIHVuaGlkZSBjZXJ0YWluIHN5bWJvbHMgaW4gaGVhZGVyCisgICAgICAg
ICAgICAgICAgICAgICAgICAgIGZpbGVzIHRoaXMgcGFyYW1ldGVyIGlzIHJlcXVpcmVkIGZvciBz
dWNjZXNzZnVsIHNjYW5uaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAn
JykKKyAgICBkZXByZWNhdGlvbl9ndWFyZCAgLS0gZ3RrZG9jIHRyaWVzIHRvIGVuc3VyZSB0aGF0
IHN5bWJvbHMgbWFya2VkIGFzIGRlcHJlY2F0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
YXJlIGVuY2FzZWQgaW4gdGhpcyBDIHByZXByb2Nlc3NvciBkZWZpbmUuIFRoaXMgaXMgcmVxdWly
ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYXZvaWQgZ3RrZG9jIHdhcm5pbmdzLiAo
ZGVmYXVsdCAnJykKKyAgICBjZmxhZ3MgICAgICAgICAgICAgLS0gVGhpcyBwYXJhbWV0ZXIgc3Bl
Y2lmaWVzIGFueSBwcmVwcm9jZXNzb3IgZmxhZ3MgbmVjZXNzYXJ5IGZvcgorICAgICAgICAgICAg
ICAgICAgICAgICAgICBidWlsZGluZyB0aGUgc2Nhbm5lciBiaW5hcnkgZHVyaW5nIGd0a2RvYy1z
Y2Fub2JqLiBUeXBpY2FsbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpbmNsdWRl
cyBhbGwgYWJzb2x1dGUgaW5jbHVkZSBwYXRocyBuZWNlc3NhcnkgdG8gcmVzb2x2ZQorICAgICAg
ICAgICAgICAgICAgICAgICAgICBhbGwgaGVhZGVyIGRlcGVuZGVuY2llcy4gKGRlZmF1bHQgJycp
CisgICAgbGRmbGFncyAgICAgICAgICAgIC0tIFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyBhbnkg
bGlua2VyIGZsYWdzIG5lY2Vzc2FyeSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVp
bGRpbmcgdGhlIHNjYW5uZXIgYmluYXJ5IGR1cmluZyBndGtkb2Mtc2Nhbm9iai4gVHlwaWNhbGx5
CisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaW5jbHVkZXMgIi1seW91cmxpYnJhcnlu
YW1lIi4gKGRlZmF1bHQgJycpCisgICAgbGlicmFyeV9wYXRoICAgICAgIC0tIFRoaXMgcGFyYW1l
dGVyIHNwZWNpZmllcyB0aGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIHlvdQorICAgICAg
ICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5IHJlc2lkZXMgdXNlZCBmb3IgYnVpbGRpbmcgdGhl
IHNjYW5uZXIgYmluYXJ5IGR1cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICBndGtkb2Mt
c2Nhbm9iai4gKGRlZmF1bHQgJycpCisKKyAgICBkb2NfZGlyICAgICAgICAgICAgLS0gVGhlIHBh
dGggdG8gb3RoZXIgZG9jdW1lbnRhdGlvbiBmaWxlcyBuZWNlc3NhcnkgdG8gYnVpbGQKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgdGhlIGRvY3VtZW50YXRpb24uIFRoaXMgZmlsZXMgaW4gdGhp
cyBkaXJlY3RvcnkgYXMgd2VsbCBhcworICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmls
ZXMgaW4gdGhlICdodG1sJyBzdWJkaXJlY3Rvcnkgd2lsbCBiZSBjb3BpZWQKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgcmVjdXJzaXZlbHkgaW50byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4gKGRl
ZmF1bHQgJycpCisgICAgbWFpbl9zZ21sX2ZpbGUgICAgIC0tIFRoZSBwYXRoIG9yIG5hbWUgKGlm
IGEgZG9jX2RpciBpcyBnaXZlbikgb2YgdGhlIFNHTUwgZmlsZQorICAgICAgICAgICAgICAgICAg
ICAgICAgICB0aGF0IGlzIHRoZSBjb25zaWRlcmVkIHRoZSBtYWluIHBhZ2Ugb2YgeW91ciBkb2N1
bWVudGF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogPG1vZHVsZV9u
YW1lPi1kb2NzLnNnbWwpCisgICAgdmVyc2lvbiAgICAgICAgICAgIC0tIFRoZSB2ZXJzaW9uIG51
bWJlciBvZiB0aGUgbW9kdWxlLiBJZiB0aGlzIGlzIHByb3ZpZGVkLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICBhIHZlcnNpb24ueG1sIGZpbGUgY29udGFpbmluZyB0aGUgdmVyc2lvbiB3aWxs
IGJlIGNyZWF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIG91dHB1dCBkaXJl
Y3RvcnkgZHVyaW5nIGRvY3VtZW50YXRpb24gZ2VuZXJhdGlvbi4KKworICAgIGludGVyYWN0aXZl
ICAgICAgICAtLSBXaGV0aGVyIG9yIG5vdCBlcnJvcnMgb3Igd2FybmluZ3Mgc2hvdWxkIHByb21w
dCB0aGUgdXNlcgorICAgICAgICAgICAgICAgICAgICAgICAgICB0byBjb250aW51ZSBvciBub3Qu
IFdoZW4gdGhpcyB2YWx1ZSBpcyBmYWxzZSwgZ2VuZXJhdGlvbgorICAgICAgICAgICAgICAgICAg
ICAgICAgICB3aWxsIGNvbnRpbnVlIGRlc3BpdGUgd2FybmluZ3MuIChkZWZhdWx0IEZhbHNlKQor
ICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICoqYXJncyk6CisKKyAgICAgICAgIyBQ
YXJhbWV0ZXJzIHNwZWNpZmljIHRvIHNjYW5uaW5nLgorICAgICAgICBzZWxmLm1vZHVsZV9uYW1l
ID0gJycKKyAgICAgICAgc2VsZi5zb3VyY2VfZGlycyA9IFtdCisgICAgICAgIHNlbGYuaWdub3Jl
ZF9maWxlcyA9IFtdCisgICAgICAgIHNlbGYuZGVjb3JhdG9yID0gJycKKyAgICAgICAgc2VsZi5k
ZXByZWNhdGlvbl9ndWFyZCA9ICcnCisKKyAgICAgICAgIyBQYXJhbWV0ZXJzIHNwZWNpZmljIHRv
IGd0a2RvYy1zY2Fub2JqLgorICAgICAgICBzZWxmLmNmbGFncyA9ICcnCisgICAgICAgIHNlbGYu
bGRmbGFncyA9ICcnCisgICAgICAgIHNlbGYubGlicmFyeV9wYXRoID0gJycKKworICAgICAgICAj
IFBhcmFtZXRlcnMgc3BlY2lmaWMgdG8gZ2VuZXJhdGlvbi4KKyAgICAgICAgc2VsZi5vdXRwdXRf
ZGlyID0gJycKKyAgICAgICAgc2VsZi5kb2NfZGlyID0gJycKKyAgICAgICAgc2VsZi5tYWluX3Nn
bWxfZmlsZSA9ICcnCisKKyAgICAgICAgc2VsZi5pbnRlcmFjdGl2ZSA9IEZhbHNlCisKKyAgICAg
ICAgc2VsZi5sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcignZ3RrZG9jJykKKworICAgICAgICBm
b3IgKGtleSwgdmFsdWUpIGluIGFyZ3MuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBzZXRhdHRy
KHNlbGYsIGtleSwgdmFsdWUpCisKKyAgICAgICAgZGVmIHJhaXNlX2Vycm9yX2lmX25vdF9zcGVj
aWZpZWQoa2V5KToKKyAgICAgICAgICAgIGlmIG5vdCBnZXRhdHRyKHNlbGYsIGtleSk6CisgICAg
ICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCclcyBub3Qgc3BlY2lmaWVkLicgJSBrZXkpCisK
KyAgICAgICAgcmFpc2VfZXJyb3JfaWZfbm90X3NwZWNpZmllZCgnb3V0cHV0X2RpcicpCisgICAg
ICAgIHJhaXNlX2Vycm9yX2lmX25vdF9zcGVjaWZpZWQoJ3NvdXJjZV9kaXJzJykKKyAgICAgICAg
cmFpc2VfZXJyb3JfaWZfbm90X3NwZWNpZmllZCgnbW9kdWxlX25hbWUnKQorCisgICAgICAgICMg
TWFrZSBhbGwgcGF0aHMgYWJzb2x1dGUgaW4gY2FzZSB3ZSB3ZXJlIHBhc3NlZCByZWxhdGl2ZSBw
YXRocywgc2luY2UKKyAgICAgICAgIyB3ZSBjaGFuZ2UgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJl
Y3Rvcnkgd2hlbiBleGVjdXRpbmcgc3ViY29tbWFuZHMuCisgICAgICAgIHNlbGYub3V0cHV0X2Rp
ciA9IG9zLnBhdGguYWJzcGF0aChzZWxmLm91dHB1dF9kaXIpCisgICAgICAgIHNlbGYuc291cmNl
X2RpcnMgPSBbb3MucGF0aC5hYnNwYXRoKHgpIGZvciB4IGluIHNlbGYuc291cmNlX2RpcnNdCisg
ICAgICAgIGlmIHNlbGYubGlicmFyeV9wYXRoOgorICAgICAgICAgICAgc2VsZi5saWJyYXJ5X3Bh
dGggPSBvcy5wYXRoLmFic3BhdGgoc2VsZi5saWJyYXJ5X3BhdGgpCisKKyAgICAgICAgaWYgbm90
IHNlbGYubWFpbl9zZ21sX2ZpbGU6CisgICAgICAgICAgICBzZWxmLm1haW5fc2dtbF9maWxlID0g
c2VsZi5tb2R1bGVfbmFtZSArICItZG9jcy5zZ21sIgorCisgICAgZGVmIGdlbmVyYXRlKHNlbGYs
IGh0bWw9VHJ1ZSk6CisgICAgICAgIHNlbGYuc2F3X3dhcm5pbmdzID0gRmFsc2UKKworICAgICAg
ICBzZWxmLl9jb3B5X2RvY19maWxlc190b19vdXRwdXRfZGlyKGh0bWwpCisgICAgICAgIHNlbGYu
X3dyaXRlX3ZlcnNpb25feG1sKCkKKyAgICAgICAgc2VsZi5fcnVuX2d0a2RvY19zY2FuKCkKKyAg
ICAgICAgc2VsZi5fcnVuX2d0a2RvY19zY2FuZ29iaigpCisgICAgICAgIHNlbGYuX3J1bl9ndGtk
b2NfbWt0bXBsKCkKKyAgICAgICAgc2VsZi5fcnVuX2d0a2RvY19ta2RiKCkKKworICAgICAgICBp
ZiBub3QgaHRtbDoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlbGYuX3J1bl9ndGtk
b2NfbWtodG1sKCkKKyAgICAgICAgc2VsZi5fcnVuX2d0a2RvY19maXh4cmVmKCkKKworICAgIGRl
ZiBfaGFzX2V4ZWN1dGFibGVfb25fcGF0aChzZWxmLCBleGVjdXRhYmxlX25hbWUpOgorICAgICAg
ICBmb3IgcGF0aCBpbiBvcy5lbnZpcm9uLmdldCgnUEFUSCcsICcnKS5zcGxpdCgnOicpOgorICAg
ICAgICAgICAgZnVsbF9wYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGV4ZWN1dGFibGVfbmFtZSkK
KyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGZ1bGxfcGF0aCkgYW5kIFwKKyAgICAgICAg
ICAgICAgICAgbm90IG9zLnBhdGguaXNkaXIoZnVsbF9wYXRoKSBhbmQgb3MuYWNjZXNzKGZ1bGxf
cGF0aCwgb3MuWF9PSyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0
dXJuIEZhbHNlCisKKyAgICBkZWYgX2RlbGV0ZV9maWxlX2lmX2V4aXN0cyhzZWxmLCBwYXRoKToK
KyAgICAgICAgaWYgbm90IG9zLmFjY2VzcyhwYXRoLCBvcy5GX09LIHwgb3MuUl9PSyk6CisgICAg
ICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoJ2RlbGV0aW5nICVzJywg
cGF0aCkKKyAgICAgICAgb3MudW5saW5rKHBhdGgpCisKKyAgICBkZWYgX3JhaXNlX2V4Y2VwdGlv
bl9pZl9maWxlX2luYWNjZXNzaWJsZShzZWxmLCBwYXRoKToKKyAgICAgICAgaWYgbm90IG9zLnBh
dGguZXhpc3RzKHBhdGgpIG9yIG5vdCBvcy5hY2Nlc3MocGF0aCwgb3MuUl9PSyk6CisgICAgICAg
ICAgICByYWlzZSBFeGNlcHRpb24oIkNvdWxkIG5vdCBhY2Nlc3MgZmlsZSBhdDogJXMiICUgcGF0
aCkKKworICAgIGRlZiBfb3V0cHV0X2hhc193YXJuaW5ncyhzZWxmLCBvdXRwdXRzKToKKyAgICAg
ICAgZm9yIG91dHB1dCBpbiBvdXRwdXRzOgorICAgICAgICAgICAgaWYgb3V0cHV0IGFuZCBvdXRw
dXQuZmluZCgnd2FybmluZycpOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAg
IHJldHVybiBGYWxzZQorCisgICAgZGVmIF9hc2tfeWVzX29yX25vX3F1ZXN0aW9uKHNlbGYsIHF1
ZXN0aW9uKToKKyAgICAgICAgaWYgbm90IHNlbGYuaW50ZXJhY3RpdmU6CisgICAgICAgICAgICBy
ZXR1cm4gVHJ1ZQorCisgICAgICAgIHF1ZXN0aW9uICs9ICcgW3kvTl0gJworICAgICAgICBhbnN3
ZXIgPSBOb25lCisgICAgICAgIHdoaWxlIGFuc3dlciAhPSAneScgYW5kIGFuc3dlciAhPSAnbicg
YW5kIGFuc3dlciAhPSAnJzoKKyAgICAgICAgICAgIGFuc3dlciA9IHJhd19pbnB1dChxdWVzdGlv
bikubG93ZXIoKQorICAgICAgICByZXR1cm4gYW5zd2VyID09ICd5JworCisgICAgZGVmIF9ydW5f
Y29tbWFuZChzZWxmLCBhcmdzLCBlbnY9Tm9uZSwgY3dkPU5vbmUpOgorICAgICAgICBpZiBub3Qg
c2VsZi5faGFzX2V4ZWN1dGFibGVfb25fcGF0aChhcmdzWzBdKToKKyAgICAgICAgICAgIHJhaXNl
IEV4Y2VwdGlvbignJXMgbm90IGZvdW5kIG9uIHBhdGgnLCBhcmdzWzBdKQorCisgICAgICAgIHNl
bGYubG9nZ2VyLmluZm8oIlJ1bm5pbmcgJXMiLCBhcmdzWzBdKQorICAgICAgICBzZWxmLmxvZ2dl
ci5kZWJ1ZygiRnVsbCBjb21tYW5kIGFyZ3M6ICVzIiwgc3RyKGFyZ3MpKQorICAgICAgICBwcm9j
ZXNzID0gc3VicHJvY2Vzcy5Qb3BlbihhcmdzLCBlbnY9ZW52LCBjd2Q9Y3dkLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICAgICAg
ICBwcm9jZXNzX291dHB1dCA9IHByb2Nlc3MuY29tbXVuaWNhdGUoKQorICAgICAgICBwcm9jZXNz
LndhaXQoKQorCisgICAgICAgIGlmIHByb2Nlc3Nfb3V0cHV0WzBdOgorICAgICAgICAgICAgcHJp
bnQgcHJvY2Vzc19vdXRwdXRbMF0KKyAgICAgICAgaWYgcHJvY2Vzc19vdXRwdXRbMV06CisgICAg
ICAgICAgICBwcmludCBwcm9jZXNzX291dHB1dFsxXQorCisgICAgICAgIGlmIHByb2Nlc3MucmV0
dXJuY29kZSAhPSAwOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCclcyBwcm9kdWNlZCBh
IG5vbi16ZXJvIHJldHVybiBjb2RlICVpJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAl
IChhcmdzWzBdLCBwcm9jZXNzLnJldHVybmNvZGUpKQorCisgICAgICAgIGlmIHNlbGYuX291dHB1
dF9oYXNfd2FybmluZ3MocHJvY2Vzc19vdXRwdXQpOgorICAgICAgICAgICAgc2VsZi5zYXdfd2Fy
bmluZ3MgPSBUcnVlCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fYXNrX3llc19vcl9ub19xdWVz
dGlvbignJXMgcHJvZHVjZWQgd2FybmluZ3MsICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICd0cnkgdG8gY29udGludWU/JyAlIGFyZ3NbMF0pOgorICAg
ICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignJXMgc3RlcCBmYWlsZWQnICUgYXJnc1swXSkK
KworICAgIGRlZiBfY29weV9kb2NfZmlsZXNfdG9fb3V0cHV0X2RpcihzZWxmLCBodG1sPVRydWUp
OgorICAgICAgICBpZiBub3Qgc2VsZi5kb2NfZGlyOgorICAgICAgICAgICAgc2VsZi5sb2dnZXIu
aW5mbygnTm90IGNvcHlpbmcgYW55IGZpbGVzIGZyb20gZG9jIGRpcmVjdG9yeSwnCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICcgYmVjYXVzZSBubyBkb2MgZGlyZWN0b3J5IGdpdmVuLicp
CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBkZWYgY29weV9maWxlX3JlcGxhY2luZ19l
eGlzdGluZyhzcmMsIGRlc3QpOgorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihzcmMpOgor
ICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCdza2lwcGVkIGRpcmVjdG9yeSAlcycs
ICBzcmMpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBpZiBub3Qgb3MuYWNj
ZXNzKHNyYywgb3MuRl9PSyB8IG9zLlJfT0spOgorICAgICAgICAgICAgICAgIHNlbGYubG9nZ2Vy
LmRlYnVnKCdza2lwcGVkIHVucmVhZGFibGUgJXMnLCBzcmMpCisgICAgICAgICAgICAgICAgcmV0
dXJuCisKKyAgICAgICAgICAgIHNlbGYuX2RlbGV0ZV9maWxlX2lmX2V4aXN0cyhkZXN0KQorCisg
ICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygnY3JlYXRlZCAlcycsIGRlc3QpCisgICAgICAg
ICAgICBvcy5saW5rKHNyYywgZGVzdCkKKworICAgICAgICBkZWYgY29weV9hbGxfZmlsZXNfaW5f
ZGlyZWN0b3J5KHNyYywgZGVzdCk6CisgICAgICAgICAgICBmb3IgcGF0aCBpbiBvcy5saXN0ZGly
KHNyYyk6CisgICAgICAgICAgICAgICAgY29weV9maWxlX3JlcGxhY2luZ19leGlzdGluZyhvcy5w
YXRoLmpvaW4oc3JjLCBwYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG9zLnBhdGguam9pbihkZXN0LCBwYXRoKSkKKworICAgICAgICBpZiBub3Qob3Mu
cGF0aC5leGlzdHMoc2VsZi5vdXRwdXRfZGlyKSk6CisgICAgICAgICAgICBvcy5tYWtlZGlycyhz
ZWxmLm91dHB1dF9kaXIpCisKKyAgICAgICAgc2VsZi5sb2dnZXIuaW5mbygnQ29weWluZyB0ZW1w
bGF0ZSBmaWxlcyB0byBvdXRwdXQgZGlyZWN0b3J5Li4uJykKKyAgICAgICAgY29weV9hbGxfZmls
ZXNfaW5fZGlyZWN0b3J5KHNlbGYuZG9jX2Rpciwgc2VsZi5vdXRwdXRfZGlyKQorCisgICAgICAg
IGlmIG5vdCBodG1sOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi5sb2dnZXIu
aW5mbygnQ29weWluZyBIVE1MIGZpbGVzIHRvIG91dHB1dCBkaXJlY3RvcnkuLi4nKQorICAgICAg
ICBodG1sX3NyY19kaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi5kb2NfZGlyLCAnaHRtbCcpCisgICAg
ICAgIGh0bWxfZGVzdF9kaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi5vdXRwdXRfZGlyLCAnaHRtbCcp
CisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhodG1sX2Rlc3RfZGlyKToKKyAgICAgICAg
ICAgIG9zLm1rZGlyKGh0bWxfZGVzdF9kaXIpCisKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMo
aHRtbF9zcmNfZGlyKToKKyAgICAgICAgICAgIGNvcHlfYWxsX2ZpbGVzX2luX2RpcmVjdG9yeSho
dG1sX3NyY19kaXIsIGh0bWxfZGVzdF9kaXIpCisKKyAgICBkZWYgX3dyaXRlX3ZlcnNpb25feG1s
KHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi52ZXJzaW9uOgorICAgICAgICAgICAgc2VsZi5s
b2dnZXIuaW5mbygnTm8gdmVyc2lvbiBzcGVjaWZpZWQsIHNvIG5vdCB3cml0aW5nIHZlcnNpb24u
eG1sJykKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHZlcnNpb25feG1sX3BhdGggPSBv
cy5wYXRoLmpvaW4oc2VsZi5vdXRwdXRfZGlyLCAndmVyc2lvbi54bWwnKQorICAgICAgICBzcmNf
dmVyc2lvbl94bWxfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLmRvY19kaXIsICd2ZXJzaW9uLnht
bCcpCisKKyAgICAgICAgIyBEb24ndCBvdmVyd3JpdGUgdmVyc2lvbi54bWwgaWYgaXQgd2FzIGlu
IHRoZSBkb2MgZGlyZWN0b3J5LgorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyh2ZXJzaW9uX3ht
bF9wYXRoKSBhbmQgXAorICAgICAgICAgICBvcy5wYXRoLmV4aXN0cyhzcmNfdmVyc2lvbl94bWxf
cGF0aCk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBvcGVuKHZlcnNpb25feG1sX3Bh
dGgsICd3Jykud3JpdGUoc2VsZi52ZXJzaW9uKQorCisgICAgZGVmIF9ydW5fZ3RrZG9jX3NjYW4o
c2VsZik6CisgICAgICAgIGFyZ3MgPSBbJ2d0a2RvYy1zY2FuJywKKyAgICAgICAgICAgICAgICAn
LS1tb2R1bGU9JXMnICUgc2VsZi5tb2R1bGVfbmFtZSwKKyAgICAgICAgICAgICAgICAnLS1yZWJ1
aWxkLXR5cGVzJ10KKworICAgICAgICAjIEVhY2ggc291cmNlIGRpcmVjdG9yeSBzaG91bGQgYmUg
aGF2ZSBpdHMgb3duICItLXNvdXJjZS1kaXI9IiBwcmVmaXguCisgICAgICAgIGZvciBzb3VyY2Vf
ZGlyIGluIHNlbGYuc291cmNlX2RpcnM6CisgICAgICAgICAgICBhcmdzLmFwcGVuZCgnLS1zb3Vy
Y2UtZGlyPSVzJyAlIHNvdXJjZV9kaXIpCisKKyAgICAgICAgaWYgc2VsZi5kZWNvcmF0b3I6Cisg
ICAgICAgICAgICBhcmdzLmFwcGVuZCgnLS1pZ25vcmUtZGVjb3JhdG9ycz0lcycgJSBzZWxmLmRl
Y29yYXRvcikKKyAgICAgICAgaWYgc2VsZi5kZXByZWNhdGlvbl9ndWFyZDoKKyAgICAgICAgICAg
IGFyZ3MuYXBwZW5kKCctLWRlcHJlY2F0ZWQtZ3VhcmRzPSVzJyAlIHNlbGYuZGVwcmVjYXRpb25f
Z3VhcmQpCisgICAgICAgIGlmIHNlbGYub3V0cHV0X2RpcjoKKyAgICAgICAgICAgIGFyZ3MuYXBw
ZW5kKCctLW91dHB1dC1kaXI9JXMnICUgc2VsZi5vdXRwdXRfZGlyKQorCisgICAgICAgICMgZ3Rr
ZG9jLXNjYW4gd2FudHMgdGhlIGJhc2VuYW1lcyBvZiBpZ25vcmVkIGhlYWRlcnMsIHNvIHN0cmlw
IHRoZQorICAgICAgICAjIGRpcm5hbWUuIERpZmZlcmVudCBmcm9tICItLXNvdXJjZS1kaXIiLCB0
aGUgaGVhZGVycyBzaG91bGQgYmUKKyAgICAgICAgIyBzcGVjaWZpZWQgYXMgb25lIGxvbmcgc3Ry
aW5nLgorICAgICAgICBpZiBzZWxmLmlnbm9yZWRfZmlsZXM6CisgICAgICAgICAgICBpZ25vcmVk
X2ZpbGVzX2Jhc2VuYW1lcyA9IFwKKyAgICAgICAgICAgICAgICBbb3MucGF0aC5iYXNlbmFtZSh4
KSBmb3IgeCBpbiBzZWxmLmlnbm9yZWRfZmlsZXNdCisgICAgICAgICAgICBhcmdzLmFwcGVuZCgn
LS1pZ25vcmUtaGVhZGVycz0lcycgJSAnICcuam9pbihpZ25vcmVkX2ZpbGVzX2Jhc2VuYW1lcykp
CisKKyAgICAgICAgc2VsZi5fcnVuX2NvbW1hbmQoYXJncykKKworICAgIGRlZiBfcnVuX2d0a2Rv
Y19zY2FuZ29iaihzZWxmKToKKyAgICAgICAgZW52ID0gb3MuZW52aXJvbgorICAgICAgICBsZGZs
YWdzID0gc2VsZi5sZGZsYWdzCisgICAgICAgIGlmIHNlbGYubGlicmFyeV9wYXRoOgorICAgICAg
ICAgICAgbGRmbGFncyA9ICcgIi1MJXMiICcgJSBzZWxmLmxpYnJhcnlfcGF0aCArIGxkZmxhZ3MK
KyAgICAgICAgICAgIGVudlsnUlVOJ10gPSAnTERfTElCUkFSWV9QQVRIPSIlcyIgJyAlIHNlbGYu
bGlicmFyeV9wYXRoCisgICAgICAgIGlmIHNlbGYubGRmbGFnczoKKyAgICAgICAgICAgIGVudlsn
TERGTEFHUyddID0gbGRmbGFncworICAgICAgICBpZiBzZWxmLmNmbGFnczoKKyAgICAgICAgICAg
IGVudlsnQ0ZMQUdTJ10gPSBzZWxmLmNmbGFncworCisgICAgICAgIGlmICdDRkxBR1MnIGluIGVu
djoKKyAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCdDRkxBR1M9JXMnLCBlbnZbJ0NGTEFH
UyddKQorICAgICAgICBpZiAnTERGTEFHUycgaW4gZW52OgorICAgICAgICAgICAgc2VsZi5sb2dn
ZXIuZGVidWcoJ0xERkxBR1MgJXMnLCBlbnZbJ0xERkxBR1MnXSkKKyAgICAgICAgaWYgJ1JVTicg
aW4gZW52OgorICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoJ1JVTj0lcycsIGVudlsnUlVO
J10pCisgICAgICAgIHNlbGYuX3J1bl9jb21tYW5kKFsnZ3RrZG9jLXNjYW5nb2JqJywgJy0tbW9k
dWxlPSVzJyAlIHNlbGYubW9kdWxlX25hbWVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBl
bnY9ZW52LCBjd2Q9c2VsZi5vdXRwdXRfZGlyKQorCisgICAgZGVmIF9ydW5fZ3RrZG9jX21rdG1w
bChzZWxmKToKKyAgICAgICAgYXJncyA9IFsnZ3RrZG9jLW1rdG1wbCcsICctLW1vZHVsZT0lcycg
JSBzZWxmLm1vZHVsZV9uYW1lXQorICAgICAgICBzZWxmLl9ydW5fY29tbWFuZChhcmdzLCBjd2Q9
c2VsZi5vdXRwdXRfZGlyKQorCisgICAgZGVmIF9ydW5fZ3RrZG9jX21rZGIoc2VsZik6CisgICAg
ICAgIHNnbWxfZmlsZSA9IG9zLnBhdGguam9pbihzZWxmLm91dHB1dF9kaXIsIHNlbGYubWFpbl9z
Z21sX2ZpbGUpCisgICAgICAgIHNlbGYuX3JhaXNlX2V4Y2VwdGlvbl9pZl9maWxlX2luYWNjZXNz
aWJsZShzZ21sX2ZpbGUpCisKKyAgICAgICAgYXJncyA9IFsnZ3RrZG9jLW1rZGInLAorICAgICAg
ICAgICAgICAgICctLW1vZHVsZT0lcycgJSBzZWxmLm1vZHVsZV9uYW1lLAorICAgICAgICAgICAg
ICAgICctLW1haW4tc2dtbC1maWxlPSVzJyAlIHNnbWxfZmlsZSwKKyAgICAgICAgICAgICAgICAn
LS1zb3VyY2Utc3VmZml4ZXM9aCxjLGNwcCxjYycsCisgICAgICAgICAgICAgICAgJy0tb3V0cHV0
LWZvcm1hdD14bWwnLAorICAgICAgICAgICAgICAgICctLXNnbWwtbW9kZSddCisKKyAgICAgICAg
IyBFYWNoIGRpcmVjdG9yeSBzaG91bGQgYmUgaGF2ZSBpdHMgb3duICItLXNvdXJjZS1kaXI9IiBw
cmVmaXguCisgICAgICAgIGZvciBzb3VyY2VfZGlyIGluIHNlbGYuc291cmNlX2RpcnM6CisgICAg
ICAgICAgICBhcmdzLmFwcGVuZCgnLS1zb3VyY2UtZGlyPSVzJyAlIHNvdXJjZV9kaXIpCisKKyAg
ICAgICAgc2VsZi5fcnVuX2NvbW1hbmQoYXJncywgY3dkPXNlbGYub3V0cHV0X2RpcikKKworICAg
IGRlZiBfcnVuX2d0a2RvY19ta2h0bWwoc2VsZik6CisgICAgICAgIGh0bWxfZGVzdF9kaXIgPSBv
cy5wYXRoLmpvaW4oc2VsZi5vdXRwdXRfZGlyLCAnaHRtbCcpCisgICAgICAgIGlmIG5vdCBvcy5w
YXRoLmlzZGlyKGh0bWxfZGVzdF9kaXIpOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCIl
cyBpcyBub3QgYSBkaXJlY3RvcnksIGNvdWxkIG5vdCBnZW5lcmF0ZSBIVE1MIgorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICUgaHRtbF9kZXN0X2RpcikKKyAgICAgICAgZWxpZiBub3Qgb3Mu
YWNjZXNzKGh0bWxfZGVzdF9kaXIsIG9zLlhfT0sgfCBvcy5SX09LIHwgb3MuV19PSyk6CisgICAg
ICAgICAgICByYWlzZSBFeGNlcHRpb24oIkNvdWxkIG5vdCBhY2Nlc3MgJXMgdG8gZ2VuZXJhdGUg
SFRNTCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIGh0bWxfZGVzdF9kaXIpCisKKyAg
ICAgICAgIyBndGtkb2MtbWtodG1sIGV4cGVjdHMgdGhlIFNHTUwgcGF0aCB0byBiZSBhYnNvbHV0
ZS4KKyAgICAgICAgc2dtbF9maWxlID0gb3MucGF0aC5qb2luKG9zLnBhdGguYWJzcGF0aChzZWxm
Lm91dHB1dF9kaXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYWlu
X3NnbWxfZmlsZSkKKyAgICAgICAgc2VsZi5fcmFpc2VfZXhjZXB0aW9uX2lmX2ZpbGVfaW5hY2Nl
c3NpYmxlKHNnbWxfZmlsZSkKKworICAgICAgICBzZWxmLl9ydW5fY29tbWFuZChbJ2d0a2RvYy1t
a2h0bWwnLCBzZWxmLm1vZHVsZV9uYW1lLCBzZ21sX2ZpbGVdLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICBjd2Q9aHRtbF9kZXN0X2RpcikKKworICAgIGRlZiBfcnVuX2d0a2RvY19maXh4cmVm
KHNlbGYpOgorICAgICAgICBzZWxmLl9ydW5fY29tbWFuZChbJ2d0a2RvYy1maXh4cmVmJywKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICctLW1vZHVsZS1kaXI9aHRtbCcsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAnLS1odG1sLWRpcj1odG1sJ10sCisgICAgICAgICAgICAgICAgICAg
ICAgICAgIGN3ZD1zZWxmLm91dHB1dF9kaXIpCisKKworY2xhc3MgUGtnQ29uZmlnR1RLRG9jKEdU
S0RvYyk6CisKKyAgICAiIiJDbGFzcyByZWFkcyBhIGxpYnJhcnkncyBwa2djb25maWcgZmlsZSB0
byBndWVzcyBndGtkb2MgcGFyYW1ldGVycy4KKworICAgIFNvbWUgZ3RrZG9jIHBhcmFtZXRlcnMg
Y2FuIGJlIGd1ZXNzZWQgYnkgcmVhZGluZyBhIGxpYnJhcnkncyBwa2djb25maWcKKyAgICBmaWxl
LCBpbmNsdWRpbmcgdGhlIGNmbGFncywgbGRmbGFncyBhbmQgdmVyc2lvbiBwYXJhbWV0ZXJzLiBJ
ZiB5b3UKKyAgICBwcm92aWRlIHRoZXNlIHBhcmFtZXRlcnMgYXMgd2VsbCwgdGhleSB3aWxsIGJl
IGFwcGVuZGVkIHRvIHRoZSBvbmVzCisgICAgZ3Vlc3NlZCB2aWEgdGhlIHBrZ2NvbmZpZyBmaWxl
LgorCisgICAgS2V5d29yZCBhcmd1bWVudHM6CisgICAgICBwa2dfY29uZmlnX3BhdGggLS0gUGF0
aCB0byB0aGUgcGtnY29uZmlnIGZpbGUgZm9yIHRoZSBsaWJyYXJ5LiBSZXF1aXJlZC4KKyAgICAi
IiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqKmFyZ3MpOgorICAgICAgICBzdXBlcihQa2dD
b25maWdHVEtEb2MsIHNlbGYpLl9faW5pdF9fKCoqYXJncykKKyAgICAgICAgaWYgbm90ICdwa2df
Y29uZmlnX3BhdGgnIGluIGFyZ3M6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ3BrZ19j
b25maWdfcGF0aCBub3QgZ2l2ZW4nKQorICAgICAgICBzZWxmLl9yZWFkX3BrZ19jb25maWdfZmls
ZShhcmdzWydwa2dfY29uZmlnX3BhdGgnXSkKKworICAgIGRlZiBfcmVhZF9wa2dfY29uZmlnX2Zp
bGUoc2VsZiwgcGtnX2NvbmZpZ19wYXRoKToKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3Rz
KHBrZ19jb25maWdfcGF0aCk6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ0NvdWxkIG5v
dCBmaW5kIHBrZy1jb25maWcgZmlsZSBhdDogJXMnCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgJSBwa2dfY29uZmlnX3BhdGgpCisKKyAgICAgICAgcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9w
ZW4oWydwa2ctY29uZmlnJywgcGtnX2NvbmZpZ19wYXRoLCAnLS1jZmxhZ3MnXSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKKyAgICAg
ICAgc2VsZi5jZmxhZ3MgKz0gIiAiICsgcHJvY2Vzcy5jb21tdW5pY2F0ZSgpWzBdLnN0cmlwKCkK
KworICAgICAgICBwcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3BlbihbJ3BrZy1jb25maWcnLCBwa2df
Y29uZmlnX3BhdGgsICctLWxpYnMnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgc2VsZi5sZGZsYWdzID0gIiAiICsg
cHJvY2Vzcy5jb21tdW5pY2F0ZSgpWzBdLnN0cmlwKCkKKworICAgICAgICBwcm9jZXNzID0gc3Vi
cHJvY2Vzcy5Qb3BlbihbJ3BrZy1jb25maWcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgcGtnX2NvbmZpZ19wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgJy0tbW9kdmVyc2lvbiddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBzZWxmLnZlcnNpb24gPSBwcm9jZXNz
LmNvbW11bmljYXRlKClbMF0uc3RyaXAoKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIvVUlQ
cm9jZXNzL0FQSS9ndGsvZG9jcy92ZXJzaW9uLnhtbC5pbiBiL1NvdXJjZS9XZWJLaXQyL1VJUHJv
Y2Vzcy9BUEkvZ3RrL2RvY3MvdmVyc2lvbi54bWwuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IGQ3OGJkYTkzNDIyZWNiYmNhOGNhZjc3MmY3YjM3ZjhmZTNiMjU0ZTkuLjAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdDIvVUlQ
cm9jZXNzL0FQSS9ndGsvZG9jcy92ZXJzaW9uLnhtbC5pbgorKysgL2Rldi9udWxsCkBAIC0xICsw
LDAgQEAKLUBWRVJTSU9OQApkaWZmIC0tZ2l0IGEvQ2hhbmdlTG9nIGIvQ2hhbmdlTG9nCmluZGV4
IGRkNzVhZWM0NjMwZWM3ZTFlOTgwOGI0NWFjYWExNzhmMzgwNGE3MTcuLjEzYjBlYWU1YzI1NDY3
MjU3NGE1NTIyY2UyYjFkNmE3OGZhODIyMDMgMTAwNjQ0Ci0tLSBhL0NoYW5nZUxvZworKysgYi9D
aGFuZ2VMb2cKQEAgLTEsMyArMSwxMiBAQAorMjAxMS0xMC0yNiAgTWFydGluIFJvYmluc29uICA8
bXJvYmluc29uQGlnYWxpYS5jb20+CisKKyAgICAgICAgW0dUS10gW1dlYktpdF0gUmVwbGFjZSB0
aGUgZ3RrZG9jIGF1dG9vbHMgbWFnaWMgd2l0aCBzb21ldGhpbmcgbW9yZSBmbGV4aWJsZQorICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA4NzcKKworICAg
ICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIGNvbmZpZ3VyZS5h
YzogUmVtb3ZlIHJlZmVyZW5jZXMgdG8gcmVtb3ZlZCBmaWxlcy4KKwogMjAxMS0xMC0xOCAgQWRh
bSBCYXJ0aCAgPGFiYXJ0aEB3ZWJraXQub3JnPgogCiAgICAgICAgIEFsd2F5cyBlbmFibGUgRU5B
QkxFKFhQQVRIKQpkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmFjIGIvY29uZmlndXJlLmFjCmluZGV4
IDI1MzhlMzk0OTQ4YzM5MTk0ZWUzNDcyMDE3ZjIwZTQ1MDdkNzcyNDcuLjhhYTA4NmIwYmU0OTky
N2M1NWE1OWQ5YzBlYWIyZjk0ZTFmZmJiMWIgMTAwNjQ0Ci0tLSBhL2NvbmZpZ3VyZS5hYworKysg
Yi9jb25maWd1cmUuYWMKQEAgLTExOTYsOCArMTE5Niw2IEBAIEFDX0NPTkZJR19GSUxFUyhbCiBT
b3VyY2UvV2ViS2l0L2d0ay93ZWJraXQvd2Via2l0dmVyc2lvbi5oCiBTb3VyY2UvV2ViS2l0L2d0
ay9kb2NzL0dOVW1ha2VmaWxlCiBTb3VyY2UvV2ViS2l0L2d0ay9kb2NzL3ZlcnNpb24ueG1sCi1T
b3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay9kb2NzL0dOVW1ha2VmaWxlCi1Tb3VyY2Uv
V2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay9kb2NzL3ZlcnNpb24ueG1sCiBdKQogCiBBQ19DT05G
SUdfRklMRVMoWwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>112638</attachid>
            <date>2011-10-26 21:22:40 -0700</date>
            <delta_ts>2011-10-27 18:11:34 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-70877-20111026212239.patch</filename>
            <type>text/plain</type>
            <size>27963</size>
            <attacher name="Martin Robinson">mrobinson</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTg1MzIKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwppbmRleCA0YWM2MjZhZTBiOWRjNzNm
ZTM4ZTQ3OGQ0MDkzZDkxNGU4M2VkMWRkLi5mNjBlNzZkYjE0YThiOTY3NTIyZTQwOGYxOGU0NzBh
NGEzZWVkMjdjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cKKysrIGIvU291
cmNlL1dlYktpdDIvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTkgQEAKKzIwMTEtMTAtMjYgIE1hcnRp
biBSb2JpbnNvbiAgPG1yb2JpbnNvbkBpZ2FsaWEuY29tPgorCisgICAgICAgIFtHVEtdIFtXZWJL
aXRdIFJlcGxhY2UgdGhlIGd0a2RvYyBhdXRvb2xzIG1hZ2ljIHdpdGggc29tZXRoaW5nIG1vcmUg
ZmxleGlibGUKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTcwODc3CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
QWRkIGEgc2NyaXB0IHRoYXQgcnVucyBndGtkb2MgbWFudWFsbHkgaW5zdGVhZCBvZiB1c2luZyB0
aGUgYXV0b3Rvb2xzCisgICAgICAgIG1hZ2ljLiBSZW1vdmUgbm93IHVudXNlZCBndGtkb2MgZmls
ZXMuCisKKyAgICAgICAgKiBHTlVtYWtlZmlsZS5hbTogUmVtb3ZlIHJlZmVyZW5jZXMgdG8gcmVt
b3ZlZCBndGtkb2MgZmlsZXMuCisgICAgICAgICogVUlQcm9jZXNzL0FQSS9ndGsvZG9jcy9HTlVt
YWtlZmlsZS5hbTogUmVtb3ZlZC4KKyAgICAgICAgKiBVSVByb2Nlc3MvQVBJL2d0ay9kb2NzL2J1
aWxkLWd0a2RvYzogQWRkZWQuCisgICAgICAgICogVUlQcm9jZXNzL0FQSS9ndGsvZG9jcy9ndGtk
b2MucHk6IEFkZGVkLgorICAgICAgICAqIFVJUHJvY2Vzcy9BUEkvZ3RrL2RvY3MvdmVyc2lvbi54
bWwuaW46IFJlbW92ZWQuCisKIDIwMTEtMTAtMjYgIEFsZXhleSBQcm9za3VyeWFrb3YgIDxhcEBh
cHBsZS5jb20+CiAKICAgICAgICAgUkVHUkVTU0lPTiAocjk4MTUzKTogU2FmYXJpIGNyYXNoZXMg
aWYgV2ViUHJvY2VzcyBjcmFzaGVkIGR1cmluZyBwcmludGluZwpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYktpdDIvR05VbWFrZWZpbGUuYW0gYi9Tb3VyY2UvV2ViS2l0Mi9HTlVtYWtlZmlsZS5hbQpp
bmRleCAwYjBkYjY0YTFkOTEyMDk1NDE1ODA3NzZiZDJmOGM1YTM3ODEyZWZiLi4zNTE0YjQxOTQy
YjFmZmU2OWExYjA5ODgxMjgwMGI2YWY4YzNmZDk4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0
Mi9HTlVtYWtlZmlsZS5hbQorKysgYi9Tb3VyY2UvV2ViS2l0Mi9HTlVtYWtlZmlsZS5hbQpAQCAt
MTM4OSwxMiArMTM4OSwxMSBAQCBQcm9ncmFtc19XZWJLaXRQbHVnaW5Qcm9jZXNzX0NYWEZMQUdT
ID0gXAogZW5kaWYKIAogRVhUUkFfRElTVCArPSBcCi0JJChXZWJLaXQyKS9VSVByb2Nlc3MvQVBJ
L2d0ay9kb2NzL0dOVW1ha2VmaWxlLmFtIFwKLQkkKFdlYktpdDIpL1VJUHJvY2Vzcy9BUEkvZ3Rr
L2RvY3Mvd2Via2l0Mmd0ay1kb2NzLnNnbWwgXAotCSQoV2ViS2l0MikvVUlQcm9jZXNzL0FQSS9n
dGsvZG9jcy93ZWJraXQyZ3RrLXNlY3Rpb25zLnR4dCBcCi0JJChXZWJLaXQyKS9VSVByb2Nlc3Mv
QVBJL2d0ay9kb2NzL3ZlcnNpb24ueG1sLmluIFwKKwkkKFdlYktpdDIpL1VJUHJvY2Vzcy9BUEkv
Z3RrL2RvY3MvYnVpbGQtZ3RrZG9jLnB5IFwKKwkkKFdlYktpdDIpL1VJUHJvY2Vzcy9BUEkvZ3Rr
L2RvY3MvZ3RrZG9jLnB5IFwKKwkkKFdlYktpdDIpL1VJUHJvY2Vzcy9BUEkvZ3RrL2RvY3Mvd2Vi
a2l0Z3RrLWRvY3Muc2dtbCBcCisJJChXZWJLaXQyKS9VSVByb2Nlc3MvQVBJL2d0ay9kb2NzL3dl
YmtpdGd0ay1zZWN0aW9ucy50eHQgXAogCSQoV2ViS2l0MikvVUlQcm9jZXNzL0FQSS9ndGsvZG9j
cy93ZWJraXQyZ3RrLnR5cGVzIFwKLQkkKFdlYktpdDIpL1VJUHJvY2Vzcy9BUEkvZ3RrL2RvY3Mv
R05VbWFrZWZpbGUuaW4gXAogCSQoV2ViS2l0MikvU2NyaXB0cy9nZW5lcmF0ZS1tZXNzYWdlLXJl
Y2VpdmVyLnB5IFwKIAkkKFdlYktpdDIpL1NjcmlwdHMvZ2VuZXJhdGUtbWVzc2FnZXMtaGVhZGVy
LnB5IFwKIAkkKFdlYktpdDIpL1NjcmlwdHMvd2Via2l0Mi9fX2luaXRfXy5weSBcCkBAIC0xNDIx
LDQgKzE0MjAsMyBAQCBFWFRSQV9ESVNUICs9IFwKIAkkKHNoZWxsIGxzICQoV2ViS2l0MikvV2Vi
UHJvY2Vzcy9SZXNvdXJjZUNhY2hlLyouaW4pIFwKIAkkKHNoZWxsIGxzICQoV2ViS2l0MikvV2Vi
UHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC8qLmluKSBcCiAJJChzaGVsbCBscyAkKFdlYktpdDIpL1dl
YlByb2Nlc3MvV2ViUGFnZS8qLmluKQotCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9VSVBy
b2Nlc3MvQVBJL2d0ay9kb2NzL0dOVW1ha2VmaWxlLmFtIGIvU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL0FQSS9ndGsvZG9jcy9HTlVtYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggZTIyNDE2ZTQzYThiNDcyNTAwZmVkNTIwNzE1MmJiYjU2YWY2Njc0MS4uMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9VSVBy
b2Nlc3MvQVBJL2d0ay9kb2NzL0dOVW1ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsMTE0
ICswLDAgQEAKLSMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gcHJvZHVjZSBH
TlVtYWtlZmlsZS5pbgotCi0jIFdlIHJlcXVpcmUgYXV0b21ha2UgMS42IGF0IGxlYXN0LgotQVVU
T01BS0VfT1BUSU9OUyA9IDEuNgotCi0jIFRoaXMgaXMgYSBibGFuayBNYWtlZmlsZS5hbSBmb3Ig
dXNpbmcgZ3RrLWRvYy4KLSMgQ29weSB0aGlzIHRvIHlvdXIgcHJvamVjdCdzIEFQSSBkb2NzIGRp
cmVjdG9yeSBhbmQgbW9kaWZ5IHRoZSB2YXJpYWJsZXMgdG8KLSMgc3VpdCB5b3VyIHByb2plY3Qu
IFNlZSB0aGUgR1RLKyBNYWtlZmlsZXMgaW4gZ3RrKy9kb2NzL3JlZmVyZW5jZSBmb3IgZXhhbXBs
ZXMKLSMgb2YgdXNpbmcgdGhlIHZhcmlvdXMgb3B0aW9ucy4KLQotIyBUaGUgbmFtZSBvZiB0aGUg
bW9kdWxlLCBlLmcuICdnbGliJy4KLURPQ19NT0RVTEU9d2Via2l0Mmd0awotCi0jIFRoZSB0b3At
bGV2ZWwgU0dNTCBmaWxlLiBZb3UgY2FuIGNoYW5nZSB0aGlzIGlmIHlvdSB3YW50IHRvLgotRE9D
X01BSU5fU0dNTF9GSUxFPSQoRE9DX01PRFVMRSktZG9jcy5zZ21sCi0KLSMgVGhlIGRpcmVjdG9y
eSBjb250YWluaW5nIHRoZSBzb3VyY2UgY29kZS4gUmVsYXRpdmUgdG8gJChzcmNkaXIpLgotIyBn
dGstZG9jIHdpbGwgc2VhcmNoIGFsbCAuYyAmIC5oIGZpbGVzIGJlbmVhdGggaGVyZSBmb3IgaW5s
aW5lIGNvbW1lbnRzCi0jIGRvY3VtZW50aW5nIHRoZSBmdW5jdGlvbnMgYW5kIG1hY3Jvcy4KLSMg
ZS5nLiBET0NfU09VUkNFX0RJUj0uLi8uLi8uLi9ndGsKLURPQ19TT1VSQ0VfRElSPSQodG9wX3Ny
Y2RpcikvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsKLQotIyBFeHRyYSBvcHRpb25z
IHRvIHBhc3MgdG8gZ3RrZG9jLXNjYW5nb2JqLiBOb3Qgbm9ybWFsbHkgbmVlZGVkLgotU0NBTkdP
QkpfT1BUSU9OUz0iLS10eXBlLWluaXQtZnVuYz1nX3R5cGVfaW5pdCgpIgotCi0jIEV4dHJhIG9w
dGlvbnMgdG8gc3VwcGx5IHRvIGd0a2RvYy1zY2FuLgotIyBlLmcuIFNDQU5fT1BUSU9OUz0tLWRl
cHJlY2F0ZWQtZ3VhcmRzPSJHVEtfRElTQUJMRV9ERVBSRUNBVEVEIgotU0NBTl9PUFRJT05TPS0t
aWdub3JlLWRlY29yYXRvcnM9IldFQktJVF9BUEkiCi0KLSMgRXh0cmEgb3B0aW9ucyB0byBzdXBw
bHkgdG8gZ3RrZG9jLW1rZGIuCi0jIGUuZy4gTUtEQl9PUFRJT05TPS0tc2dtbC1tb2RlIC0tb3V0
cHV0LWZvcm1hdD14bWwKLU1LREJfT1BUSU9OUz0tLXNnbWwtbW9kZSAtLW91dHB1dC1mb3JtYXQ9
eG1sIC0tc291cmNlLXN1ZmZpeGVzPWgsYyxjcHAKLQotIyBFeHRyYSBvcHRpb25zIHRvIHN1cHBs
eSB0byBndGtkb2MtbWt0bXBsCi0jIGUuZy4gTUtUTVBMX09QVElPTlM9LS1vbmx5LXNlY3Rpb24t
dG1wbAotTUtUTVBMX09QVElPTlM9Ci0KLSMgRXh0cmEgb3B0aW9ucyB0byBzdXBwbHkgdG8gZ3Rr
ZG9jLWZpeHJlZi4gTm90IG5vcm1hbGx5IG5lZWRlZC4KLSMgZS5nLiBGSVhYUkVGX09QVElPTlM9
LS1leHRyYS1kaXI9Li4vZ2RrLXBpeGJ1Zi9odG1sIC0tZXh0cmEtZGlyPS4uL2dkay9odG1sCi1G
SVhYUkVGX09QVElPTlM9Ci0KLSMgVXNlZCBmb3IgZGVwZW5kZW5jaWVzLiBUaGUgZG9jcyB3aWxs
IGJlIHJlYnVpbHQgaWYgYW55IG9mIHRoZXNlIGNoYW5nZS4KLSMgZS5nLiBIRklMRV9HTE9CPSQo
dG9wX3NyY2RpcikvZ3RrLyouaAotIyBlLmcuIENGSUxFX0dMT0I9JCh0b3Bfc3JjZGlyKS9ndGsv
Ki5jCi1IRklMRV9HTE9CPSQodG9wX3NyY2RpcikvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQ
SS9ndGsvKi5oCi1DRklMRV9HTE9CPSQodG9wX3NyY2RpcikvU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL0FQSS9ndGsvKi5jcHAKLQotIyBIZWFkZXIgZmlsZXMgdG8gaWdub3JlIHdoZW4gc2Nhbm5p
bmcuCi0jIGUuZy4gSUdOT1JFX0hGSUxFUz1ndGtkZWJ1Zy5oIGd0a2ludGwuaAotSUdOT1JFX0hG
SUxFUyA9IFwKLQlMb2FkVHJhY2tpbmdUZXN0LmggXAotCVBhZ2VDbGllbnRJbXBsLmggXAotCVRl
c3RNYWluLmggXAotCVdlYlZpZXdUZXN0LmggXAotCVdlYktpdERlZmluZXMuaCBcCi0JV2ViS2l0
UHJpdmF0ZS5oIFwKLQlXZWJLaXRXZWJDb250ZXh0UHJpdmF0ZS5oIFwKLQlXZWJLaXRXZWJWaWV3
QmFzZVByaXZhdGUuaAotCi0jIEltYWdlcyB0byBjb3B5IGludG8gSFRNTCBkaXJlY3RvcnkuCi0j
IGUuZy4gSFRNTF9JTUFHRVM9JCh0b3Bfc3JjZGlyKS9ndGsvc3RvY2staWNvbnMvc3RvY2tfYWJv
dXRfMjQucG5nCi1IVE1MX0lNQUdFUz0KLQotIyBFeHRyYSBTR01MIGZpbGVzIHRoYXQgYXJlIGlu
Y2x1ZGVkIGJ5ICQoRE9DX01BSU5fU0dNTF9GSUxFKS4KLSMgZS5nLiBjb250ZW50X2ZpbGVzPXJ1
bm5pbmcuc2dtbCBidWlsZGluZy5zZ21sIGNoYW5nZXMtMi4wLnNnbWwKLWNvbnRlbnRfZmlsZXM9
Ci0KLSMgU0dNTCBmaWxlcyB3aGVyZSBndGstZG9jIGFiYnJldmF0aW9ucyAoI0d0a1dpZGdldCkg
YXJlIGV4cGFuZGVkCi0jIFRoZXNlIGZpbGVzIG11c3QgYmUgbGlzdGVkIGhlcmUgKmFuZCogaW4g
Y29udGVudF9maWxlcwotIyBlLmcuIGV4cGFuZF9jb250ZW50X2ZpbGVzPXJ1bm5pbmcuc2dtbAot
ZXhwYW5kX2NvbnRlbnRfZmlsZXM9Ci0KLSMgQ0ZMQUdTIGFuZCBMREZMQUdTIGZvciBjb21waWxp
bmcgZ3RrZG9jLXNjYW5nb2JqIHdpdGggeW91ciBsaWJyYXJ5LgotIyBPbmx5IG5lZWRlZCBpZiB5
b3UgYXJlIHVzaW5nIGd0a2RvYy1zY2FuZ29iaiB0byBkeW5hbWljYWxseSBxdWVyeSB3aWRnZXQK
LSMgc2lnbmFscyBhbmQgcHJvcGVydGllcy4KLSMgZS5nLiBJTkNMVURFUz0tSSQodG9wX3NyY2Rp
cikgLUkkKHRvcF9idWlsZGRpcikgJChHVEtfREVCVUdfRkxBR1MpCi0jIGUuZy4gR1RLRE9DX0xJ
QlM9JCh0b3BfYnVpbGRkaXIpL2d0ay8kKGd0a3RhcmdldGxpYikKLUlOQ0xVREVTPSBcCi0JLUkk
KHRvcF9zcmNkaXIpL1NvdXJjZSBcCi0JLUkkKHRvcF9zcmNkaXIpL1NvdXJjZS9XZWJLaXQyIFwK
LQktSSQodG9wX2J1aWxkZGlyKS9EZXJpdmVkU291cmNlcyBcCi0JLUkkKHRvcF9idWlsZGRpcikv
RGVyaXZlZFNvdXJjZXMvV2ViS2l0Mi9pbmNsdWRlIFwKLQktSSQodG9wX2J1aWxkZGlyKS9EZXJp
dmVkU291cmNlcy9XZWJLaXQyL3dlYmtpdDJndGsgXAotCS1JJCh0b3BfYnVpbGRkaXIpL0Rlcml2
ZWRTb3VyY2VzL1dlYktpdDIvd2Via2l0Mmd0ay9pbmNsdWRlIFwKLQktSSQodG9wX3NyY2Rpcikv
U291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsgXAotCSQoZ2xvYmFsX2NwcGZsYWdzKSBc
Ci0JJChnbG9iYWxfY2ZsYWdzKSBcCi0JJChHTElCX0NGTEFHUykgXAotCSQoR1RLX0NGTEFHUykg
XAotCSQoTElCU09VUF9DRkxBR1MpIFwKLQkkKGphdmFzY3JpcHRjb3JlX2NwcGZsYWdzKQotCi1H
VEtET0NfTElCUz0gXAotCSQodG9wX2J1aWxkZGlyKS9saWJqYXZhc2NyaXB0Y29yZWd0ay1AV0VC
S0lUR1RLX0FQSV9NQUpPUl9WRVJTSU9OQC5AV0VCS0lUR1RLX0FQSV9NSU5PUl9WRVJTSU9OQC5s
YSBcCi0JJCh0b3BfYnVpbGRkaXIpL2xpYndlYmtpdDJndGstQFdFQktJVEdUS19BUElfTUFKT1Jf
VkVSU0lPTkAuQFdFQktJVEdUS19BUElfTUlOT1JfVkVSU0lPTkAubGEgXAotCSQoR0xJQl9MSUJT
KSBcCi0JJChHVEtfTElCUykKLQotIyBUaGlzIGluY2x1ZGVzIHRoZSBzdGFuZGFyZCBndGstZG9j
IG1ha2UgcnVsZXMsIGNvcGllZCBieSBndGtkb2NpemUuCi0jIEZJWE1FOiBuZWVkIHRvIHVuYnJl
YWsgdGhpcyBkb2N1bWVudGF0aW9uIGJ1aWxkLgotIyBpbmNsdWRlICQodG9wX3NyY2RpcikvZ3Rr
LWRvYy5tYWtlCi0KLSMgT3RoZXIgZmlsZXMgdG8gZGlzdHJpYnV0ZQotIyBlLmcuIEVYVFJBX0RJ
U1QgKz0gdmVyc2lvbi54bWwuaW4KLSNFWFRSQV9ESVNUICs9Ci0KLSMgRmlsZXMgbm90IHRvIGRp
c3RyaWJ1dGUKLSMgZm9yIC0tcmVidWlsZC10eXBlcyBpbiAkKFNDQU5fT1BUSU9OUyksIGUuZy4g
JChET0NfTU9EVUxFKS50eXBlcwotIyBmb3IgLS1yZWJ1aWxkLXNlY3Rpb25zIGluICQoU0NBTl9P
UFRJT05TKSBlLmcuICQoRE9DX01PRFVMRSktc2VjdGlvbnMudHh0Ci1ESVNUQ0xFQU5GSUxFUyAr
PSBcCi0gICAgICAgICQodG9wX2J1aWxkZGlyKS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJ
L2d0ay9kb2NzL3ZlcnNpb24ueG1sCi0KLSMgQ29tbWVudCB0aGlzIG91dCBpZiB5b3Ugd2FudCB5
b3VyIGRvY3Mtc3RhdHVzIHRlc3RlZCBkdXJpbmcgJ21ha2UgY2hlY2snCi0jVEVTVFMgPSAkKEdU
S0RPQ19DSEVDSykKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3Rr
L2RvY3MvYnVpbGQtZ3RrZG9jIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvZG9j
cy9idWlsZC1ndGtkb2MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMWRkNzZhZDE5Y2E1ZjMwZDBiYTNkZTgzOWE0NzFl
NDlmZDc4NjE4OAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9B
UEkvZ3RrL2RvY3MvYnVpbGQtZ3RrZG9jCkBAIC0wLDAgKzEsOTMgQEAKKyMhL3Vzci9iaW4vZW52
IHB5dGhvbgorIyAgQ29weXJpZ2h0IChDKSAyMDExIElnYWxpYSBTLkwuCisjCisjICBUaGlzIGxp
YnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisj
ICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVi
bGljCisjICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uOyBlaXRoZXIKKyMgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0
aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRl
ZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyAgYnV0IFdJVEhPVVQgQU5Z
IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgIE1FUkNI
QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUg
R05VCisjICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgor
IworIyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBH
ZW5lcmFsIFB1YmxpYworIyAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90
LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJh
bmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisj
CisKK2ltcG9ydCBnbG9iCitpbXBvcnQgZ3RrZG9jCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9z
LnBhdGgKK2ltcG9ydCBzeXMKKworZGVmIGNvbmZpZ3VyZV9sb2dnaW5nKCk6CisgICAgbGV2ZWwg
PSBsb2dnaW5nLkRFQlVHIGlmICctdicgaW4gc3lzLmFyZ3YgZWxzZSBsb2dnaW5nLklORk8KKyAg
ICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiZ3RrZG9jIikKKyAgICBsb2dnZXIuc2V0TGV2
ZWwobGV2ZWwpCisgICAgaGFuZGxlciA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcigpCisgICAgaGFu
ZGxlci5zZXRMZXZlbChsZXZlbCkKKyAgICBsb2dnZXIuYWRkSGFuZGxlcihoYW5kbGVyKQorICAg
IGlmIGxldmVsID09IGxvZ2dpbmcuREVCVUc6CisgICAgICAgIGhhbmRsZXIuc2V0Rm9ybWF0dGVy
KGxvZ2dpbmcuRm9ybWF0dGVyKCdbJShhc2N0aW1lKXNdICAlKG1lc3NhZ2UpcycpKQorICAgIGVs
c2U6CisgICAgICAgIGhhbmRsZXIuc2V0Rm9ybWF0dGVyKGxvZ2dpbmcuRm9ybWF0dGVyKCclKG1l
c3NhZ2UpcycpKQorCitkZWYgZmluZF9idWlsZF9kaXJlY3RvcnkodG9wX2xldmVsKToKKyAgICBk
ZWYgaXNfdmFsaWRfYnVpbGRfZGlyZWN0b3J5KGJ1aWxkX2Rpcik6CisgICAgICAgIHJldHVybiBv
cy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oYnVpbGRfZGlyLCAiLmxpYnMiKSkKKworICAgIGlm
IGlzX3ZhbGlkX2J1aWxkX2RpcmVjdG9yeSh0b3BfbGV2ZWwpOgorICAgICAgICByZXR1cm4gdG9w
X2xldmVsCisKKyAgICBidWlsZF9kaXIgPSBvcy5wYXRoLmpvaW4odG9wX2xldmVsLCAnV2ViS2l0
QnVpbGQnKQorICAgIGlmIGlzX3ZhbGlkX2J1aWxkX2RpcmVjdG9yeShidWlsZF9kaXIpOgorICAg
ICAgICByZXR1cm4gYnVpbGRfZGlyCisKKyAgICBidWlsZF9kaXIgPSBvcy5wYXRoLmpvaW4odG9w
X2xldmVsLCAnV2ViS2l0QnVpbGQnLCAnUmVsZWFzZScpCisgICAgaWYgaXNfdmFsaWRfYnVpbGRf
ZGlyZWN0b3J5KGJ1aWxkX2Rpcik6CisgICAgICAgIHJldHVybiBidWlsZF9kaXIKKworICAgIGJ1
aWxkX2RpciA9IG9zLnBhdGguam9pbih0b3BfbGV2ZWwsICdXZWJLaXRCdWlsZCcsICdEZWJ1Zycp
CisgICAgaWYgaXNfdmFsaWRfYnVpbGRfZGlyZWN0b3J5KGJ1aWxkX2Rpcik6CisgICAgICAgIHJl
dHVybiBidWlsZF9kaXIKKyAgICBwcmludCAiQ291bGQgbm90IGRldGVybWluZSBidWlsZCBkaXJl
Y3RvcnkuIgorICAgIHN5cy5leGl0KDEpCisKK2RvY19kaXIgPSBvcy5wYXRoLmFic3BhdGgob3Mu
cGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKK3RvcF9sZXZlbCA9IG9zLnBhdGgubm9ybXBhdGgob3Mu
cGF0aC5qb2luKGRvY19kaXIsICcuLicsICcuLicsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAnLi4nLCAnLi4nLCAnLi4nLCAnLi4nKSkKK2J1aWxkX2RpciA9IGZp
bmRfYnVpbGRfZGlyZWN0b3J5KHRvcF9sZXZlbCkKKworb3V0cHV0X2RpciA9IG9zLnBhdGguam9p
bihidWlsZF9kaXIsICJEb2N1bWVudGF0aW9uIiwgIldlYktpdDIiKQorc3JjX2RpciA9IG9zLnBh
dGguam9pbihkb2NfZGlyLCAnLi4nKQorbGlicmFyeV9wYXRoID0gb3MucGF0aC5qb2luKGJ1aWxk
X2RpciwgIi5saWJzIikKK3BrZ19jb25maWdfcGF0aCA9IFwKKyAgICBvcy5wYXRoLmpvaW4oYnVp
bGRfZGlyLCAiU291cmNlIiwgIldlYktpdDIiLCAid2Via2l0Mmd0ay0zLjAucGMiKQorCitkZXJp
dmVkX3NvdXJjZXMgPSBvcy5wYXRoLmpvaW4oYnVpbGRfZGlyLCAiRGVyaXZlZFNvdXJjZXMiLCAi
V2ViS2l0MiIpCitjZmxhZ3MgPSBcCisnIC1JJyArIG9zLnBhdGguam9pbihkZXJpdmVkX3NvdXJj
ZXMsICd3ZWJraXQyZ3RrJywgJ2luY2x1ZGUnKSArIFwKKycgLUknICsgb3MucGF0aC5qb2luKGRl
cml2ZWRfc291cmNlcywgJ3dlYmtpdDJndGsnKSArIFwKKycgLUknICsgb3MucGF0aC5qb2luKGRl
cml2ZWRfc291cmNlcywgJ2luY2x1ZGUnKSArIFwKKycgLUknICsgb3MucGF0aC5qb2luKHRvcF9s
ZXZlbCwgJ1NvdXJjZScpCisnIC1JJyArIHNyY19kaXIKKworaWdub3JlZF9maWxlcyA9IGdsb2Iu
Z2xvYigiJXMvKlByaXZhdGUuaCIgJSBzcmNfZGlyKSArIFwKKyAgICAgICAgICAgICAgICBnbG9i
Lmdsb2IoIiVzL1BhZ2VDbGllbnRJbXBsLioiICUgc3JjX2RpcikgKyBcCisgICAgICAgICAgICAg
ICAgZ2xvYi5nbG9iKCIlcy90ZXN0cy8qLmgiICUgc3JjX2RpcikKKworY29uZmlndXJlX2xvZ2dp
bmcoKQorZ2VuZXJhdG9yID0gZ3RrZG9jLlBrZ0NvbmZpZ0dUS0RvYyhtb2R1bGVfbmFtZT0id2Vi
a2l0Mmd0ayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kaXI9
b3V0cHV0X2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtnX2NvbmZp
Z19wYXRoPXBrZ19jb25maWdfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgc291cmNlX2RpcnM9W3NyY19kaXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBkb2NfZGlyPWRvY19kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNmbGFncz1jZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJh
cnlfcGF0aD1saWJyYXJ5X3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGRlY29yYXRvcj0iV0VCS0lUX0FQSSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGRlcHJlY2F0aW9uX2d1YXJkPSJXRUJLSVRfRElTQUJMRV9ERVBSRUNBVEVEIiwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlZF9maWxlcz1pZ25vcmVkX2ZpbGVz
KQorZ2VuZXJhdG9yLmdlbmVyYXRlKGh0bWw9Jy0tc2tpcC1odG1sJyBub3QgaW4gc3lzLmFyZ3Yp
CitzeXMuZXhpdCgxIGlmIGdlbmVyYXRvci5zYXdfd2FybmluZ3MgZWxzZSAwKQpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvZG9jcy9ndGtkb2MucHkgYi9Tb3Vy
Y2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay9kb2NzL2d0a2RvYy5weQpuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5i
YzBjYjMzNmEzMzA5ZDlhZGFmODNhNThhZGRmNzgyODQ1NzFmMjU2Ci0tLSAvZGV2L251bGwKKysr
IGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvZG9jcy9ndGtkb2MucHkKQEAgLTAs
MCArMSwzODQgQEAKKyMgIENvcHlyaWdodCAoQykgMjAxMSBJZ2FsaWEgUy5MLgorIworIyAgVGhp
cyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v
cgorIyAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFs
IFB1YmxpYworIyAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbjsgZWl0aGVyCisjICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3Vy
IG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJp
YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgIGJ1dCBXSVRIT1VU
IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjICBN
RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg
dGhlIEdOVQorIyAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls
cy4KKyMKKyMgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNz
ZXIgR2VuZXJhbCBQdWJsaWMKKyMgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlm
IG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgIEZvdW5kYXRpb24sIEluYy4sIDUx
IEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVT
QQorIworCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zCitpbXBvcnQgb3MucGF0aAoraW1wb3J0
IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKKworCitjbGFzcyBHVEtEb2Mob2JqZWN0KToKKworICAg
ICIiIkNsYXNzIHRoYXQgY29udHJvbHMgYSBndGtkb2MgcnVuLgorCisgICAgRWFjaCBpbnN0YW5j
ZSBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudHMgb25lIGd0a2RvYyBjb25maWd1cmF0aW9uCisgICAg
YW5kIHNldCBvZiBkb2N1bWVudGF0aW9uLiBUaGUgZ3RrZG9jIHBhY2thZ2UgaXMgYSBzZXJpZXMg
b2YgdG9vbHMKKyAgICBydW4gY29uc2VjdXRpdmVseSB3aGljaCBjb252ZXJ0cyBpbmxpbmUgQy9D
KysgZG9jdW1lbnRhdGlvbiBpbnRvCisgICAgZG9jYm9vayBmaWxlcyBhbmQgdGhlbiBpbnRvIEhU
TUwuIFRoaXMgY2xhc3MgaXMgc3VpdGFibGUgZm9yCisgICAgZ2VuZXJhdGluZyBkb2N1bWVudGF0
aW9uIG9yIHNpbXBseSB2ZXJpZnlpbmcgY29ycmVjdG5lc3MuCisKKyAgICBLZXl3b3JkIGFyZ3Vt
ZW50czoKKyAgICBvdXRwdXRfZGlyICAgICAgICAgLS0gVGhlIHBhdGggd2hlcmUgZ3RrZG9jIG91
dHB1dCBzaG91bGQgYmUgcGxhY2VkLiBHZW5lcmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAg
ICAgIG1heSBvdmVyd3JpdGUgZmlsZSBpbiB0aGlzIGRpcmVjdG9yeS4gUmVxdWlyZWQuCisgICAg
bW9kdWxlX25hbWUgICAgICAgIC0tIFRoZSBuYW1lIG9mIHRoZSBkb2N1bWVudGF0aW9uIG1vZHVs
ZS4gRm9yIGxpYnJhcmllcyB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHR5cGlj
YWxseSB0aGUgbGlicmFyeSBuYW1lLiBSZXF1aXJlZCBpZiBub3QgbGlicmFyeSBwYXRoCisgICAg
ICAgICAgICAgICAgICAgICAgICAgIGlzIGdpdmVuLgorICAgIHNvdXJjZV9kaXJzICAgICAgICAt
LSBBIGxpc3Qgb2YgcGF0aHMgdG8gdGhlIHNvdXJjZSBjb2RlIHRvIGJlIHNjYW5uZWQuIFJlcXVp
cmVkLgorICAgIGlnbm9yZWRfZmlsZXMgICAgICAtLSBBIGxpc3Qgb2YgZmlsZW5hbWVzIHRvIGln
bm9yZSBpbiB0aGUgc291cmNlIGRpcmVjdG9yeS4gSXQgaXMKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgb25seSBuZWNlc3NhcnkgdG8gcHJvdmlkZSB0aGUgYmFzZW5hbWVzIG9mIHRoZXNlIGZp
bGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBpY2FsbHkgaXQgaXMgaW1wb3J0YW50
IHRvIHByb3ZpZGUgYW4gdXBkYXRlZCBsaXN0IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAg
IGlnbm9yZWQgZmlsZXMgdG8gcHJldmVudCB3YXJuaW5ncyBhYm91dCB1bmRvY3VtZW50ZWQgc3lt
Ym9scy4KKyAgICBkZWNvcmF0b3IgICAgICAgICAgLS0gSWYgYSBkZWNvcmF0b3IgaXMgdXNlZCB0
byB1bmhpZGUgY2VydGFpbiBzeW1ib2xzIGluIGhlYWRlcgorICAgICAgICAgICAgICAgICAgICAg
ICAgICBmaWxlcyB0aGlzIHBhcmFtZXRlciBpcyByZXF1aXJlZCBmb3Igc3VjY2Vzc2Z1bCBzY2Fu
bmluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgJycpCisgICAgZGVwcmVj
YXRpb25fZ3VhcmQgIC0tIGd0a2RvYyB0cmllcyB0byBlbnN1cmUgdGhhdCBzeW1ib2xzIG1hcmtl
ZCBhcyBkZXByZWNhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBlbmNhc2VkIGlu
IHRoaXMgQyBwcmVwcm9jZXNzb3IgZGVmaW5lLiBUaGlzIGlzIHJlcXVpcmVkCisgICAgICAgICAg
ICAgICAgICAgICAgICAgIHRvIGF2b2lkIGd0a2RvYyB3YXJuaW5ncy4gKGRlZmF1bHQgJycpCisg
ICAgY2ZsYWdzICAgICAgICAgICAgIC0tIFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyBhbnkgcHJl
cHJvY2Vzc29yIGZsYWdzIG5lY2Vzc2FyeSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
YnVpbGRpbmcgdGhlIHNjYW5uZXIgYmluYXJ5IGR1cmluZyBndGtkb2Mtc2Nhbm9iai4gVHlwaWNh
bGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaW5jbHVkZXMgYWxsIGFic29sdXRl
IGluY2x1ZGUgcGF0aHMgbmVjZXNzYXJ5IHRvIHJlc29sdmUKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgYWxsIGhlYWRlciBkZXBlbmRlbmNpZXMuIChkZWZhdWx0ICcnKQorICAgIGxkZmxhZ3Mg
ICAgICAgICAgICAtLSBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgYW55IGxpbmtlciBmbGFncyBu
ZWNlc3NhcnkgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkaW5nIHRoZSBzY2Fu
bmVyIGJpbmFyeSBkdXJpbmcgZ3RrZG9jLXNjYW5vYmouIFR5cGljYWxseQorICAgICAgICAgICAg
ICAgICAgICAgICAgICB0aGlzIGluY2x1ZGVzICItbHlvdXJsaWJyYXJ5bmFtZSIuIChkZWZhdWx0
ICcnKQorICAgIGxpYnJhcnlfcGF0aCAgICAgICAtLSBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMg
dGhlIHBhdGggdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSB5b3UKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgbGlicmFyeSByZXNpZGVzIHVzZWQgZm9yIGJ1aWxkaW5nIHRoZSBzY2FubmVyIGJpbmFy
eSBkdXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RrZG9jLXNjYW5vYmouIChkZWZh
dWx0ICcnKQorCisgICAgZG9jX2RpciAgICAgICAgICAgIC0tIFRoZSBwYXRoIHRvIG90aGVyIGRv
Y3VtZW50YXRpb24gZmlsZXMgbmVjZXNzYXJ5IHRvIGJ1aWxkCisgICAgICAgICAgICAgICAgICAg
ICAgICAgIHRoZSBkb2N1bWVudGF0aW9uLiBUaGlzIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGFz
IHdlbGwgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZpbGVzIGluIHRoZSAnaHRt
bCcgc3ViZGlyZWN0b3J5IHdpbGwgYmUgY29waWVkCisgICAgICAgICAgICAgICAgICAgICAgICAg
IHJlY3Vyc2l2ZWx5IGludG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuIChkZWZhdWx0ICcnKQorICAg
IG1haW5fc2dtbF9maWxlICAgICAtLSBUaGUgcGF0aCBvciBuYW1lIChpZiBhIGRvY19kaXIgaXMg
Z2l2ZW4pIG9mIHRoZSBTR01MIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBp
cyB0aGUgY29uc2lkZXJlZCB0aGUgbWFpbiBwYWdlIG9mIHlvdXIgZG9jdW1lbnRhdGlvbi4KKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IDxtb2R1bGVfbmFtZT4tZG9jcy5zZ21s
KQorICAgIHZlcnNpb24gICAgICAgICAgICAtLSBUaGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIG1v
ZHVsZS4gSWYgdGhpcyBpcyBwcm92aWRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYSB2
ZXJzaW9uLnhtbCBmaWxlIGNvbnRhaW5pbmcgdGhlIHZlcnNpb24gd2lsbCBiZSBjcmVhdGVkCisg
ICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGR1cmluZyBk
b2N1bWVudGF0aW9uIGdlbmVyYXRpb24uCisKKyAgICBpbnRlcmFjdGl2ZSAgICAgICAgLS0gV2hl
dGhlciBvciBub3QgZXJyb3JzIG9yIHdhcm5pbmdzIHNob3VsZCBwcm9tcHQgdGhlIHVzZXIKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgdG8gY29udGludWUgb3Igbm90LiBXaGVuIHRoaXMgdmFs
dWUgaXMgZmFsc2UsIGdlbmVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBj
b250aW51ZSBkZXNwaXRlIHdhcm5pbmdzLiAoZGVmYXVsdCBGYWxzZSkKKyAgICAiIiIKKworICAg
IGRlZiBfX2luaXRfXyhzZWxmLCAqKmFyZ3MpOgorCisgICAgICAgICMgUGFyYW1ldGVycyBzcGVj
aWZpYyB0byBzY2FubmluZy4KKyAgICAgICAgc2VsZi5tb2R1bGVfbmFtZSA9ICcnCisgICAgICAg
IHNlbGYuc291cmNlX2RpcnMgPSBbXQorICAgICAgICBzZWxmLmlnbm9yZWRfZmlsZXMgPSBbXQor
ICAgICAgICBzZWxmLmRlY29yYXRvciA9ICcnCisgICAgICAgIHNlbGYuZGVwcmVjYXRpb25fZ3Vh
cmQgPSAnJworCisgICAgICAgICMgUGFyYW1ldGVycyBzcGVjaWZpYyB0byBndGtkb2Mtc2Nhbm9i
ai4KKyAgICAgICAgc2VsZi5jZmxhZ3MgPSAnJworICAgICAgICBzZWxmLmxkZmxhZ3MgPSAnJwor
ICAgICAgICBzZWxmLmxpYnJhcnlfcGF0aCA9ICcnCisKKyAgICAgICAgIyBQYXJhbWV0ZXJzIHNw
ZWNpZmljIHRvIGdlbmVyYXRpb24uCisgICAgICAgIHNlbGYub3V0cHV0X2RpciA9ICcnCisgICAg
ICAgIHNlbGYuZG9jX2RpciA9ICcnCisgICAgICAgIHNlbGYubWFpbl9zZ21sX2ZpbGUgPSAnJwor
CisgICAgICAgIHNlbGYuaW50ZXJhY3RpdmUgPSBGYWxzZQorCisgICAgICAgIHNlbGYubG9nZ2Vy
ID0gbG9nZ2luZy5nZXRMb2dnZXIoJ2d0a2RvYycpCisKKyAgICAgICAgZm9yIChrZXksIHZhbHVl
KSBpbiBhcmdzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBrZXksIHZh
bHVlKQorCisgICAgICAgIGRlZiByYWlzZV9lcnJvcl9pZl9ub3Rfc3BlY2lmaWVkKGtleSk6Cisg
ICAgICAgICAgICBpZiBub3QgZ2V0YXR0cihzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIHJh
aXNlIEV4Y2VwdGlvbignJXMgbm90IHNwZWNpZmllZC4nICUga2V5KQorCisgICAgICAgIHJhaXNl
X2Vycm9yX2lmX25vdF9zcGVjaWZpZWQoJ291dHB1dF9kaXInKQorICAgICAgICByYWlzZV9lcnJv
cl9pZl9ub3Rfc3BlY2lmaWVkKCdzb3VyY2VfZGlycycpCisgICAgICAgIHJhaXNlX2Vycm9yX2lm
X25vdF9zcGVjaWZpZWQoJ21vZHVsZV9uYW1lJykKKworICAgICAgICAjIE1ha2UgYWxsIHBhdGhz
IGFic29sdXRlIGluIGNhc2Ugd2Ugd2VyZSBwYXNzZWQgcmVsYXRpdmUgcGF0aHMsIHNpbmNlCisg
ICAgICAgICMgd2UgY2hhbmdlIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHdoZW4gZXhl
Y3V0aW5nIHN1YmNvbW1hbmRzLgorICAgICAgICBzZWxmLm91dHB1dF9kaXIgPSBvcy5wYXRoLmFi
c3BhdGgoc2VsZi5vdXRwdXRfZGlyKQorICAgICAgICBzZWxmLnNvdXJjZV9kaXJzID0gW29zLnBh
dGguYWJzcGF0aCh4KSBmb3IgeCBpbiBzZWxmLnNvdXJjZV9kaXJzXQorICAgICAgICBpZiBzZWxm
LmxpYnJhcnlfcGF0aDoKKyAgICAgICAgICAgIHNlbGYubGlicmFyeV9wYXRoID0gb3MucGF0aC5h
YnNwYXRoKHNlbGYubGlicmFyeV9wYXRoKQorCisgICAgICAgIGlmIG5vdCBzZWxmLm1haW5fc2dt
bF9maWxlOgorICAgICAgICAgICAgc2VsZi5tYWluX3NnbWxfZmlsZSA9IHNlbGYubW9kdWxlX25h
bWUgKyAiLWRvY3Muc2dtbCIKKworICAgIGRlZiBnZW5lcmF0ZShzZWxmLCBodG1sPVRydWUpOgor
ICAgICAgICBzZWxmLnNhd193YXJuaW5ncyA9IEZhbHNlCisKKyAgICAgICAgc2VsZi5fY29weV9k
b2NfZmlsZXNfdG9fb3V0cHV0X2RpcihodG1sKQorICAgICAgICBzZWxmLl93cml0ZV92ZXJzaW9u
X3htbCgpCisgICAgICAgIHNlbGYuX3J1bl9ndGtkb2Nfc2NhbigpCisgICAgICAgIHNlbGYuX3J1
bl9ndGtkb2Nfc2NhbmdvYmooKQorICAgICAgICBzZWxmLl9ydW5fZ3RrZG9jX21rdG1wbCgpCisg
ICAgICAgIHNlbGYuX3J1bl9ndGtkb2NfbWtkYigpCisKKyAgICAgICAgaWYgbm90IGh0bWw6Cisg
ICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLl9ydW5fZ3RrZG9jX21raHRtbCgpCisg
ICAgICAgIHNlbGYuX3J1bl9ndGtkb2NfZml4eHJlZigpCisKKyAgICBkZWYgX2hhc19leGVjdXRh
YmxlX29uX3BhdGgoc2VsZiwgZXhlY3V0YWJsZV9uYW1lKToKKyAgICAgICAgZm9yIHBhdGggaW4g
b3MuZW52aXJvbi5nZXQoJ1BBVEgnLCAnJykuc3BsaXQob3MucGF0aHNlcCk6CisgICAgICAgICAg
ICBmdWxsX3BhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgZXhlY3V0YWJsZV9uYW1lKQorICAgICAg
ICAgICAgaWYgb3MucGF0aC5leGlzdHMoZnVsbF9wYXRoKSBhbmQgXAorICAgICAgICAgICAgICAg
ICBub3Qgb3MucGF0aC5pc2RpcihmdWxsX3BhdGgpIGFuZCBvcy5hY2Nlc3MoZnVsbF9wYXRoLCBv
cy5YX09LKToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFs
c2UKKworICAgIGRlZiBfZGVsZXRlX2ZpbGVfaWZfZXhpc3RzKHNlbGYsIHBhdGgpOgorICAgICAg
ICBpZiBub3Qgb3MuYWNjZXNzKHBhdGgsIG9zLkZfT0sgfCBvcy5SX09LKToKKyAgICAgICAgICAg
IHJldHVybgorICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygnZGVsZXRpbmcgJXMnLCBwYXRoKQor
ICAgICAgICBvcy51bmxpbmsocGF0aCkKKworICAgIGRlZiBfcmFpc2VfZXhjZXB0aW9uX2lmX2Zp
bGVfaW5hY2Nlc3NpYmxlKHNlbGYsIHBhdGgpOgorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlz
dHMocGF0aCkgb3Igbm90IG9zLmFjY2VzcyhwYXRoLCBvcy5SX09LKToKKyAgICAgICAgICAgIHJh
aXNlIEV4Y2VwdGlvbigiQ291bGQgbm90IGFjY2VzcyBmaWxlIGF0OiAlcyIgJSBwYXRoKQorCisg
ICAgZGVmIF9vdXRwdXRfaGFzX3dhcm5pbmdzKHNlbGYsIG91dHB1dHMpOgorICAgICAgICBmb3Ig
b3V0cHV0IGluIG91dHB1dHM6CisgICAgICAgICAgICBpZiBvdXRwdXQgYW5kIG91dHB1dC5maW5k
KCd3YXJuaW5nJyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJu
IEZhbHNlCisKKyAgICBkZWYgX2Fza195ZXNfb3Jfbm9fcXVlc3Rpb24oc2VsZiwgcXVlc3Rpb24p
OgorICAgICAgICBpZiBub3Qgc2VsZi5pbnRlcmFjdGl2ZToKKyAgICAgICAgICAgIHJldHVybiBU
cnVlCisKKyAgICAgICAgcXVlc3Rpb24gKz0gJyBbeS9OXSAnCisgICAgICAgIGFuc3dlciA9IE5v
bmUKKyAgICAgICAgd2hpbGUgYW5zd2VyICE9ICd5JyBhbmQgYW5zd2VyICE9ICduJyBhbmQgYW5z
d2VyICE9ICcnOgorICAgICAgICAgICAgYW5zd2VyID0gcmF3X2lucHV0KHF1ZXN0aW9uKS5sb3dl
cigpCisgICAgICAgIHJldHVybiBhbnN3ZXIgPT0gJ3knCisKKyAgICBkZWYgX3J1bl9jb21tYW5k
KHNlbGYsIGFyZ3MsIGVudj1Ob25lLCBjd2Q9Tm9uZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLl9o
YXNfZXhlY3V0YWJsZV9vbl9wYXRoKGFyZ3NbMF0pOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0
aW9uKCclcyBub3QgZm91bmQgb24gcGF0aCcsIGFyZ3NbMF0pCisKKyAgICAgICAgc2VsZi5sb2dn
ZXIuaW5mbygiUnVubmluZyAlcyIsIGFyZ3NbMF0pCisgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVn
KCJGdWxsIGNvbW1hbmQgYXJnczogJXMiLCBzdHIoYXJncykpCisgICAgICAgIHByb2Nlc3MgPSBz
dWJwcm9jZXNzLlBvcGVuKGFyZ3MsIGVudj1lbnYsIGN3ZD1jd2QsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIChz
dGRvdXQsIHN0ZGVycikgPSBwcm9jZXNzLmNvbW11bmljYXRlKCkKKyAgICAgICAgaWYgc3Rkb3V0
OgorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZShzdGRvdXQpCisgICAgICAgIGlmIHN0ZGVy
cjoKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoc3RkZXJyKQorCisgICAgICAgIGlmIHBy
b2Nlc3MucmV0dXJuY29kZSAhPSAwOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCclcyBw
cm9kdWNlZCBhIG5vbi16ZXJvIHJldHVybiBjb2RlICVpJworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAlIChhcmdzWzBdLCBwcm9jZXNzLnJldHVybmNvZGUpKQorCisgICAgICAgIGlmICd3
YXJuaW5nJyBpbiBzdGRlcnIgb3IgJ3dhcm5pbmcnIGluIHN0ZG91dDoKKyAgICAgICAgICAgIHNl
bGYuc2F3X3dhcm5pbmdzID0gVHJ1ZQorICAgICAgICAgICAgaWYgbm90IHNlbGYuX2Fza195ZXNf
b3Jfbm9fcXVlc3Rpb24oJyVzIHByb2R1Y2VkIHdhcm5pbmdzLCAnCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJ5IHRvIGNvbnRpbnVlPycgJSBhcmdz
WzBdKToKKyAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJyVzIHN0ZXAgZmFpbGVkJyAl
IGFyZ3NbMF0pCisKKyAgICBkZWYgX2NvcHlfZG9jX2ZpbGVzX3RvX291dHB1dF9kaXIoc2VsZiwg
aHRtbD1UcnVlKToKKyAgICAgICAgaWYgbm90IHNlbGYuZG9jX2RpcjoKKyAgICAgICAgICAgIHNl
bGYubG9nZ2VyLmluZm8oJ05vdCBjb3B5aW5nIGFueSBmaWxlcyBmcm9tIGRvYyBkaXJlY3Rvcnks
JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGJlY2F1c2Ugbm8gZG9jIGRpcmVjdG9y
eSBnaXZlbi4nKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZGVmIGNvcHlfZmlsZV9y
ZXBsYWNpbmdfZXhpc3Rpbmcoc3JjLCBkZXN0KToKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNk
aXIoc3JjKToKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1Zygnc2tpcHBlZCBkaXJl
Y3RvcnkgJXMnLCAgc3JjKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaWYg
bm90IG9zLmFjY2VzcyhzcmMsIG9zLkZfT0sgfCBvcy5SX09LKToKKyAgICAgICAgICAgICAgICBz
ZWxmLmxvZ2dlci5kZWJ1Zygnc2tpcHBlZCB1bnJlYWRhYmxlICVzJywgc3JjKQorICAgICAgICAg
ICAgICAgIHJldHVybgorCisgICAgICAgICAgICBzZWxmLl9kZWxldGVfZmlsZV9pZl9leGlzdHMo
ZGVzdCkKKworICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoJ2NyZWF0ZWQgJXMnLCBkZXN0
KQorICAgICAgICAgICAgb3MubGluayhzcmMsIGRlc3QpCisKKyAgICAgICAgZGVmIGNvcHlfYWxs
X2ZpbGVzX2luX2RpcmVjdG9yeShzcmMsIGRlc3QpOgorICAgICAgICAgICAgZm9yIHBhdGggaW4g
b3MubGlzdGRpcihzcmMpOgorICAgICAgICAgICAgICAgIGNvcHlfZmlsZV9yZXBsYWNpbmdfZXhp
c3Rpbmcob3MucGF0aC5qb2luKHNyYywgcGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oZGVzdCwgcGF0aCkpCisKKyAgICAgICAg
aWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYub3V0cHV0X2Rpcik6CisgICAgICAgICAgICBvcy5t
YWtlZGlycyhzZWxmLm91dHB1dF9kaXIpCisKKyAgICAgICAgc2VsZi5sb2dnZXIuaW5mbygnQ29w
eWluZyB0ZW1wbGF0ZSBmaWxlcyB0byBvdXRwdXQgZGlyZWN0b3J5Li4uJykKKyAgICAgICAgY29w
eV9hbGxfZmlsZXNfaW5fZGlyZWN0b3J5KHNlbGYuZG9jX2Rpciwgc2VsZi5vdXRwdXRfZGlyKQor
CisgICAgICAgIGlmIG5vdCBodG1sOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2Vs
Zi5sb2dnZXIuaW5mbygnQ29weWluZyBIVE1MIGZpbGVzIHRvIG91dHB1dCBkaXJlY3RvcnkuLi4n
KQorICAgICAgICBodG1sX3NyY19kaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi5kb2NfZGlyLCAnaHRt
bCcpCisgICAgICAgIGh0bWxfZGVzdF9kaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi5vdXRwdXRfZGly
LCAnaHRtbCcpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhodG1sX2Rlc3RfZGlyKToK
KyAgICAgICAgICAgIG9zLm1rZGlyKGh0bWxfZGVzdF9kaXIpCisKKyAgICAgICAgaWYgb3MucGF0
aC5leGlzdHMoaHRtbF9zcmNfZGlyKToKKyAgICAgICAgICAgIGNvcHlfYWxsX2ZpbGVzX2luX2Rp
cmVjdG9yeShodG1sX3NyY19kaXIsIGh0bWxfZGVzdF9kaXIpCisKKyAgICBkZWYgX3dyaXRlX3Zl
cnNpb25feG1sKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi52ZXJzaW9uOgorICAgICAgICAg
ICAgc2VsZi5sb2dnZXIuaW5mbygnTm8gdmVyc2lvbiBzcGVjaWZpZWQsIHNvIG5vdCB3cml0aW5n
IHZlcnNpb24ueG1sJykKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHZlcnNpb25feG1s
X3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5vdXRwdXRfZGlyLCAndmVyc2lvbi54bWwnKQorICAg
ICAgICBzcmNfdmVyc2lvbl94bWxfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLmRvY19kaXIsICd2
ZXJzaW9uLnhtbCcpCisKKyAgICAgICAgIyBEb24ndCBvdmVyd3JpdGUgdmVyc2lvbi54bWwgaWYg
aXQgd2FzIGluIHRoZSBkb2MgZGlyZWN0b3J5LgorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyh2
ZXJzaW9uX3htbF9wYXRoKSBhbmQgXAorICAgICAgICAgICBvcy5wYXRoLmV4aXN0cyhzcmNfdmVy
c2lvbl94bWxfcGF0aCk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBvdXRwdXRfZmls
ZSA9IG9wZW4odmVyc2lvbl94bWxfcGF0aCwgJ3cnKQorICAgICAgICBvdXRwdXRfZmlsZS53cml0
ZShzZWxmLnZlcnNpb24pCisgICAgICAgIG91dHB1dF9maWxlLmNsb3NlKCkKKworICAgIGRlZiBf
cnVuX2d0a2RvY19zY2FuKHNlbGYpOgorICAgICAgICBhcmdzID0gWydndGtkb2Mtc2NhbicsCisg
ICAgICAgICAgICAgICAgJy0tbW9kdWxlPSVzJyAlIHNlbGYubW9kdWxlX25hbWUsCisgICAgICAg
ICAgICAgICAgJy0tcmVidWlsZC10eXBlcyddCisKKyAgICAgICAgIyBFYWNoIHNvdXJjZSBkaXJl
Y3Rvcnkgc2hvdWxkIGJlIGhhdmUgaXRzIG93biAiLS1zb3VyY2UtZGlyPSIgcHJlZml4LgorICAg
ICAgICBmb3Igc291cmNlX2RpciBpbiBzZWxmLnNvdXJjZV9kaXJzOgorICAgICAgICAgICAgYXJn
cy5hcHBlbmQoJy0tc291cmNlLWRpcj0lcycgJSBzb3VyY2VfZGlyKQorCisgICAgICAgIGlmIHNl
bGYuZGVjb3JhdG9yOgorICAgICAgICAgICAgYXJncy5hcHBlbmQoJy0taWdub3JlLWRlY29yYXRv
cnM9JXMnICUgc2VsZi5kZWNvcmF0b3IpCisgICAgICAgIGlmIHNlbGYuZGVwcmVjYXRpb25fZ3Vh
cmQ6CisgICAgICAgICAgICBhcmdzLmFwcGVuZCgnLS1kZXByZWNhdGVkLWd1YXJkcz0lcycgJSBz
ZWxmLmRlcHJlY2F0aW9uX2d1YXJkKQorICAgICAgICBpZiBzZWxmLm91dHB1dF9kaXI6CisgICAg
ICAgICAgICBhcmdzLmFwcGVuZCgnLS1vdXRwdXQtZGlyPSVzJyAlIHNlbGYub3V0cHV0X2RpcikK
KworICAgICAgICAjIGd0a2RvYy1zY2FuIHdhbnRzIHRoZSBiYXNlbmFtZXMgb2YgaWdub3JlZCBo
ZWFkZXJzLCBzbyBzdHJpcCB0aGUKKyAgICAgICAgIyBkaXJuYW1lLiBEaWZmZXJlbnQgZnJvbSAi
LS1zb3VyY2UtZGlyIiwgdGhlIGhlYWRlcnMgc2hvdWxkIGJlCisgICAgICAgICMgc3BlY2lmaWVk
IGFzIG9uZSBsb25nIHN0cmluZy4KKyAgICAgICAgaWYgc2VsZi5pZ25vcmVkX2ZpbGVzOgorICAg
ICAgICAgICAgaWdub3JlZF9maWxlc19iYXNlbmFtZXMgPSBcCisgICAgICAgICAgICAgICAgW29z
LnBhdGguYmFzZW5hbWUoeCkgZm9yIHggaW4gc2VsZi5pZ25vcmVkX2ZpbGVzXQorICAgICAgICAg
ICAgYXJncy5hcHBlbmQoJy0taWdub3JlLWhlYWRlcnM9JXMnICUgJyAnLmpvaW4oaWdub3JlZF9m
aWxlc19iYXNlbmFtZXMpKQorCisgICAgICAgIHNlbGYuX3J1bl9jb21tYW5kKGFyZ3MpCisKKyAg
ICBkZWYgX3J1bl9ndGtkb2Nfc2NhbmdvYmooc2VsZik6CisgICAgICAgIGVudiA9IG9zLmVudmly
b24KKyAgICAgICAgbGRmbGFncyA9IHNlbGYubGRmbGFncworICAgICAgICBpZiBzZWxmLmxpYnJh
cnlfcGF0aDoKKyAgICAgICAgICAgIGxkZmxhZ3MgPSAnICItTCVzIiAnICUgc2VsZi5saWJyYXJ5
X3BhdGggKyBsZGZsYWdzCisgICAgICAgICAgICBlbnZbJ1JVTiddID0gJ0xEX0xJQlJBUllfUEFU
SD0iJXMiICcgJSBzZWxmLmxpYnJhcnlfcGF0aAorICAgICAgICBpZiBzZWxmLmxkZmxhZ3M6Cisg
ICAgICAgICAgICBlbnZbJ0xERkxBR1MnXSA9IGxkZmxhZ3MKKyAgICAgICAgaWYgc2VsZi5jZmxh
Z3M6CisgICAgICAgICAgICBlbnZbJ0NGTEFHUyddID0gc2VsZi5jZmxhZ3MKKworICAgICAgICBp
ZiAnQ0ZMQUdTJyBpbiBlbnY6CisgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygnQ0ZMQUdT
PSVzJywgZW52WydDRkxBR1MnXSkKKyAgICAgICAgaWYgJ0xERkxBR1MnIGluIGVudjoKKyAgICAg
ICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCdMREZMQUdTICVzJywgZW52WydMREZMQUdTJ10pCisg
ICAgICAgIGlmICdSVU4nIGluIGVudjoKKyAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCdS
VU49JXMnLCBlbnZbJ1JVTiddKQorICAgICAgICBzZWxmLl9ydW5fY29tbWFuZChbJ2d0a2RvYy1z
Y2FuZ29iaicsICctLW1vZHVsZT0lcycgJSBzZWxmLm1vZHVsZV9uYW1lXSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgZW52PWVudiwgY3dkPXNlbGYub3V0cHV0X2RpcikKKworICAgIGRlZiBf
cnVuX2d0a2RvY19ta3RtcGwoc2VsZik6CisgICAgICAgIGFyZ3MgPSBbJ2d0a2RvYy1ta3RtcGwn
LCAnLS1tb2R1bGU9JXMnICUgc2VsZi5tb2R1bGVfbmFtZV0KKyAgICAgICAgc2VsZi5fcnVuX2Nv
bW1hbmQoYXJncywgY3dkPXNlbGYub3V0cHV0X2RpcikKKworICAgIGRlZiBfcnVuX2d0a2RvY19t
a2RiKHNlbGYpOgorICAgICAgICBzZ21sX2ZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi5vdXRwdXRf
ZGlyLCBzZWxmLm1haW5fc2dtbF9maWxlKQorICAgICAgICBzZWxmLl9yYWlzZV9leGNlcHRpb25f
aWZfZmlsZV9pbmFjY2Vzc2libGUoc2dtbF9maWxlKQorCisgICAgICAgIGFyZ3MgPSBbJ2d0a2Rv
Yy1ta2RiJywKKyAgICAgICAgICAgICAgICAnLS1tb2R1bGU9JXMnICUgc2VsZi5tb2R1bGVfbmFt
ZSwKKyAgICAgICAgICAgICAgICAnLS1tYWluLXNnbWwtZmlsZT0lcycgJSBzZ21sX2ZpbGUsCisg
ICAgICAgICAgICAgICAgJy0tc291cmNlLXN1ZmZpeGVzPWgsYyxjcHAsY2MnLAorICAgICAgICAg
ICAgICAgICctLW91dHB1dC1mb3JtYXQ9eG1sJywKKyAgICAgICAgICAgICAgICAnLS1zZ21sLW1v
ZGUnXQorCisgICAgICAgICMgRWFjaCBkaXJlY3Rvcnkgc2hvdWxkIGJlIGhhdmUgaXRzIG93biAi
LS1zb3VyY2UtZGlyPSIgcHJlZml4LgorICAgICAgICBmb3Igc291cmNlX2RpciBpbiBzZWxmLnNv
dXJjZV9kaXJzOgorICAgICAgICAgICAgYXJncy5hcHBlbmQoJy0tc291cmNlLWRpcj0lcycgJSBz
b3VyY2VfZGlyKQorCisgICAgICAgIHNlbGYuX3J1bl9jb21tYW5kKGFyZ3MsIGN3ZD1zZWxmLm91
dHB1dF9kaXIpCisKKyAgICBkZWYgX3J1bl9ndGtkb2NfbWtodG1sKHNlbGYpOgorICAgICAgICBo
dG1sX2Rlc3RfZGlyID0gb3MucGF0aC5qb2luKHNlbGYub3V0cHV0X2RpciwgJ2h0bWwnKQorICAg
ICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihodG1sX2Rlc3RfZGlyKToKKyAgICAgICAgICAgIHJh
aXNlIEV4Y2VwdGlvbigiJXMgaXMgbm90IGEgZGlyZWN0b3J5LCBjb3VsZCBub3QgZ2VuZXJhdGUg
SFRNTCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIGh0bWxfZGVzdF9kaXIpCisgICAg
ICAgIGVsaWYgbm90IG9zLmFjY2VzcyhodG1sX2Rlc3RfZGlyLCBvcy5YX09LIHwgb3MuUl9PSyB8
IG9zLldfT0spOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJDb3VsZCBub3QgYWNjZXNz
ICVzIHRvIGdlbmVyYXRlIEhUTUwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBodG1s
X2Rlc3RfZGlyKQorCisgICAgICAgICMgZ3RrZG9jLW1raHRtbCBleHBlY3RzIHRoZSBTR01MIHBh
dGggdG8gYmUgYWJzb2x1dGUuCisgICAgICAgIHNnbWxfZmlsZSA9IG9zLnBhdGguam9pbihvcy5w
YXRoLmFic3BhdGgoc2VsZi5vdXRwdXRfZGlyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHNlbGYubWFpbl9zZ21sX2ZpbGUpCisgICAgICAgIHNlbGYuX3JhaXNlX2V4Y2VwdGlv
bl9pZl9maWxlX2luYWNjZXNzaWJsZShzZ21sX2ZpbGUpCisKKyAgICAgICAgc2VsZi5fcnVuX2Nv
bW1hbmQoWydndGtkb2MtbWtodG1sJywgc2VsZi5tb2R1bGVfbmFtZSwgc2dtbF9maWxlXSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgY3dkPWh0bWxfZGVzdF9kaXIpCisKKyAgICBkZWYgX3J1
bl9ndGtkb2NfZml4eHJlZihzZWxmKToKKyAgICAgICAgc2VsZi5fcnVuX2NvbW1hbmQoWydndGtk
b2MtZml4eHJlZicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnLS1tb2R1bGUtZGlyPWh0
bWwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0taHRtbC1kaXI9aHRtbCddLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICBjd2Q9c2VsZi5vdXRwdXRfZGlyKQorCisKK2NsYXNzIFBr
Z0NvbmZpZ0dUS0RvYyhHVEtEb2MpOgorCisgICAgIiIiQ2xhc3MgcmVhZHMgYSBsaWJyYXJ5J3Mg
cGtnY29uZmlnIGZpbGUgdG8gZ3Vlc3MgZ3RrZG9jIHBhcmFtZXRlcnMuCisKKyAgICBTb21lIGd0
a2RvYyBwYXJhbWV0ZXJzIGNhbiBiZSBndWVzc2VkIGJ5IHJlYWRpbmcgYSBsaWJyYXJ5J3MgcGtn
Y29uZmlnCisgICAgZmlsZSwgaW5jbHVkaW5nIHRoZSBjZmxhZ3MsIGxkZmxhZ3MgYW5kIHZlcnNp
b24gcGFyYW1ldGVycy4gSWYgeW91CisgICAgcHJvdmlkZSB0aGVzZSBwYXJhbWV0ZXJzIGFzIHdl
bGwsIHRoZXkgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgb25lcworICAgIGd1ZXNzZWQgdmlhIHRo
ZSBwa2djb25maWcgZmlsZS4KKworICAgIEtleXdvcmQgYXJndW1lbnRzOgorICAgICAgcGtnX2Nv
bmZpZ19wYXRoIC0tIFBhdGggdG8gdGhlIHBrZ2NvbmZpZyBmaWxlIGZvciB0aGUgbGlicmFyeS4g
UmVxdWlyZWQuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKiphcmdzKToKKyAg
ICAgICAgc3VwZXIoUGtnQ29uZmlnR1RLRG9jLCBzZWxmKS5fX2luaXRfXygqKmFyZ3MpCisgICAg
ICAgIGlmIG5vdCAncGtnX2NvbmZpZ19wYXRoJyBpbiBhcmdzOgorICAgICAgICAgICAgcmFpc2Ug
RXhjZXB0aW9uKCdwa2dfY29uZmlnX3BhdGggbm90IGdpdmVuJykKKyAgICAgICAgc2VsZi5fcmVh
ZF9wa2dfY29uZmlnX2ZpbGUoYXJnc1sncGtnX2NvbmZpZ19wYXRoJ10pCisKKyAgICBkZWYgX3Jl
YWRfcGtnX2NvbmZpZ19maWxlKHNlbGYsIHBrZ19jb25maWdfcGF0aCk6CisgICAgICAgIGlmIG5v
dCBvcy5wYXRoLmV4aXN0cyhwa2dfY29uZmlnX3BhdGgpOgorICAgICAgICAgICAgcmFpc2UgRXhj
ZXB0aW9uKCdDb3VsZCBub3QgZmluZCBwa2ctY29uZmlnIGZpbGUgYXQ6ICVzJworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICUgcGtnX2NvbmZpZ19wYXRoKQorCisgICAgICAgIHByb2Nlc3Mg
PSBzdWJwcm9jZXNzLlBvcGVuKFsncGtnLWNvbmZpZycsIHBrZ19jb25maWdfcGF0aCwgJy0tY2Zs
YWdzJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9j
ZXNzLlBJUEUpCisgICAgICAgIHNlbGYuY2ZsYWdzICs9ICIgIiArIHByb2Nlc3MuY29tbXVuaWNh
dGUoKVswXS5zdHJpcCgpCisKKyAgICAgICAgcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oWydw
a2ctY29uZmlnJywgcGtnX2NvbmZpZ19wYXRoLCAnLS1saWJzJ10sCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIHNlbGYu
bGRmbGFncyA9ICIgIiArIHByb2Nlc3MuY29tbXVuaWNhdGUoKVswXS5zdHJpcCgpCisKKyAgICAg
ICAgcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oWydwa2ctY29uZmlnJywKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHBrZ19jb25maWdfcGF0aCwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICctLW1vZHZlcnNpb24nXSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgc2VsZi52
ZXJzaW9uID0gcHJvY2Vzcy5jb21tdW5pY2F0ZSgpWzBdLnN0cmlwKCkKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL2RvY3MvdmVyc2lvbi54bWwuaW4gYi9Tb3Vy
Y2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay9kb2NzL3ZlcnNpb24ueG1sLmluCmRlbGV0ZWQg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzhiZGE5MzQyMmVjYmJjYThjYWY3NzJmN2IzN2Y4ZmUz
YjI1NGU5Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1Nv
dXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL2RvY3MvdmVyc2lvbi54bWwuaW4KKysrIC9k
ZXYvbnVsbApAQCAtMSArMCwwIEBACi1AVkVSU0lPTkAK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>112797</attachid>
            <date>2011-10-27 18:11:38 -0700</date>
            <delta_ts>2011-11-09 08:53:59 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-70877-20111027181136.patch</filename>
            <type>text/plain</type>
            <size>28126</size>
            <attacher name="Martin Robinson">mrobinson</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTg1MzIKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwppbmRleCA0YWM2MjZhZTBiOWRjNzNm
ZTM4ZTQ3OGQ0MDkzZDkxNGU4M2VkMWRkLi5mNjBlNzZkYjE0YThiOTY3NTIyZTQwOGYxOGU0NzBh
NGEzZWVkMjdjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cKKysrIGIvU291
cmNlL1dlYktpdDIvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTkgQEAKKzIwMTEtMTAtMjYgIE1hcnRp
biBSb2JpbnNvbiAgPG1yb2JpbnNvbkBpZ2FsaWEuY29tPgorCisgICAgICAgIFtHVEtdIFtXZWJL
aXRdIFJlcGxhY2UgdGhlIGd0a2RvYyBhdXRvb2xzIG1hZ2ljIHdpdGggc29tZXRoaW5nIG1vcmUg
ZmxleGlibGUKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTcwODc3CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
QWRkIGEgc2NyaXB0IHRoYXQgcnVucyBndGtkb2MgbWFudWFsbHkgaW5zdGVhZCBvZiB1c2luZyB0
aGUgYXV0b3Rvb2xzCisgICAgICAgIG1hZ2ljLiBSZW1vdmUgbm93IHVudXNlZCBndGtkb2MgZmls
ZXMuCisKKyAgICAgICAgKiBHTlVtYWtlZmlsZS5hbTogUmVtb3ZlIHJlZmVyZW5jZXMgdG8gcmVt
b3ZlZCBndGtkb2MgZmlsZXMuCisgICAgICAgICogVUlQcm9jZXNzL0FQSS9ndGsvZG9jcy9HTlVt
YWtlZmlsZS5hbTogUmVtb3ZlZC4KKyAgICAgICAgKiBVSVByb2Nlc3MvQVBJL2d0ay9kb2NzL2J1
aWxkLWd0a2RvYzogQWRkZWQuCisgICAgICAgICogVUlQcm9jZXNzL0FQSS9ndGsvZG9jcy9ndGtk
b2MucHk6IEFkZGVkLgorICAgICAgICAqIFVJUHJvY2Vzcy9BUEkvZ3RrL2RvY3MvdmVyc2lvbi54
bWwuaW46IFJlbW92ZWQuCisKIDIwMTEtMTAtMjYgIEFsZXhleSBQcm9za3VyeWFrb3YgIDxhcEBh
cHBsZS5jb20+CiAKICAgICAgICAgUkVHUkVTU0lPTiAocjk4MTUzKTogU2FmYXJpIGNyYXNoZXMg
aWYgV2ViUHJvY2VzcyBjcmFzaGVkIGR1cmluZyBwcmludGluZwpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYktpdDIvR05VbWFrZWZpbGUuYW0gYi9Tb3VyY2UvV2ViS2l0Mi9HTlVtYWtlZmlsZS5hbQpp
bmRleCAwYjBkYjY0YTFkOTEyMDk1NDE1ODA3NzZiZDJmOGM1YTM3ODEyZWZiLi4zNTE0YjQxOTQy
YjFmZmU2OWExYjA5ODgxMjgwMGI2YWY4YzNmZDk4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0
Mi9HTlVtYWtlZmlsZS5hbQorKysgYi9Tb3VyY2UvV2ViS2l0Mi9HTlVtYWtlZmlsZS5hbQpAQCAt
MTM4OSwxMiArMTM4OSwxMSBAQCBQcm9ncmFtc19XZWJLaXRQbHVnaW5Qcm9jZXNzX0NYWEZMQUdT
ID0gXAogZW5kaWYKIAogRVhUUkFfRElTVCArPSBcCi0JJChXZWJLaXQyKS9VSVByb2Nlc3MvQVBJ
L2d0ay9kb2NzL0dOVW1ha2VmaWxlLmFtIFwKLQkkKFdlYktpdDIpL1VJUHJvY2Vzcy9BUEkvZ3Rr
L2RvY3Mvd2Via2l0Mmd0ay1kb2NzLnNnbWwgXAotCSQoV2ViS2l0MikvVUlQcm9jZXNzL0FQSS9n
dGsvZG9jcy93ZWJraXQyZ3RrLXNlY3Rpb25zLnR4dCBcCi0JJChXZWJLaXQyKS9VSVByb2Nlc3Mv
QVBJL2d0ay9kb2NzL3ZlcnNpb24ueG1sLmluIFwKKwkkKFdlYktpdDIpL1VJUHJvY2Vzcy9BUEkv
Z3RrL2RvY3MvYnVpbGQtZ3RrZG9jLnB5IFwKKwkkKFdlYktpdDIpL1VJUHJvY2Vzcy9BUEkvZ3Rr
L2RvY3MvZ3RrZG9jLnB5IFwKKwkkKFdlYktpdDIpL1VJUHJvY2Vzcy9BUEkvZ3RrL2RvY3Mvd2Vi
a2l0Z3RrLWRvY3Muc2dtbCBcCisJJChXZWJLaXQyKS9VSVByb2Nlc3MvQVBJL2d0ay9kb2NzL3dl
YmtpdGd0ay1zZWN0aW9ucy50eHQgXAogCSQoV2ViS2l0MikvVUlQcm9jZXNzL0FQSS9ndGsvZG9j
cy93ZWJraXQyZ3RrLnR5cGVzIFwKLQkkKFdlYktpdDIpL1VJUHJvY2Vzcy9BUEkvZ3RrL2RvY3Mv
R05VbWFrZWZpbGUuaW4gXAogCSQoV2ViS2l0MikvU2NyaXB0cy9nZW5lcmF0ZS1tZXNzYWdlLXJl
Y2VpdmVyLnB5IFwKIAkkKFdlYktpdDIpL1NjcmlwdHMvZ2VuZXJhdGUtbWVzc2FnZXMtaGVhZGVy
LnB5IFwKIAkkKFdlYktpdDIpL1NjcmlwdHMvd2Via2l0Mi9fX2luaXRfXy5weSBcCkBAIC0xNDIx
LDQgKzE0MjAsMyBAQCBFWFRSQV9ESVNUICs9IFwKIAkkKHNoZWxsIGxzICQoV2ViS2l0MikvV2Vi
UHJvY2Vzcy9SZXNvdXJjZUNhY2hlLyouaW4pIFwKIAkkKHNoZWxsIGxzICQoV2ViS2l0MikvV2Vi
UHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC8qLmluKSBcCiAJJChzaGVsbCBscyAkKFdlYktpdDIpL1dl
YlByb2Nlc3MvV2ViUGFnZS8qLmluKQotCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9VSVBy
b2Nlc3MvQVBJL2d0ay9kb2NzL0dOVW1ha2VmaWxlLmFtIGIvU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL0FQSS9ndGsvZG9jcy9HTlVtYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggZTIyNDE2ZTQzYThiNDcyNTAwZmVkNTIwNzE1MmJiYjU2YWY2Njc0MS4uMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9VSVBy
b2Nlc3MvQVBJL2d0ay9kb2NzL0dOVW1ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsMTE0
ICswLDAgQEAKLSMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gcHJvZHVjZSBH
TlVtYWtlZmlsZS5pbgotCi0jIFdlIHJlcXVpcmUgYXV0b21ha2UgMS42IGF0IGxlYXN0LgotQVVU
T01BS0VfT1BUSU9OUyA9IDEuNgotCi0jIFRoaXMgaXMgYSBibGFuayBNYWtlZmlsZS5hbSBmb3Ig
dXNpbmcgZ3RrLWRvYy4KLSMgQ29weSB0aGlzIHRvIHlvdXIgcHJvamVjdCdzIEFQSSBkb2NzIGRp
cmVjdG9yeSBhbmQgbW9kaWZ5IHRoZSB2YXJpYWJsZXMgdG8KLSMgc3VpdCB5b3VyIHByb2plY3Qu
IFNlZSB0aGUgR1RLKyBNYWtlZmlsZXMgaW4gZ3RrKy9kb2NzL3JlZmVyZW5jZSBmb3IgZXhhbXBs
ZXMKLSMgb2YgdXNpbmcgdGhlIHZhcmlvdXMgb3B0aW9ucy4KLQotIyBUaGUgbmFtZSBvZiB0aGUg
bW9kdWxlLCBlLmcuICdnbGliJy4KLURPQ19NT0RVTEU9d2Via2l0Mmd0awotCi0jIFRoZSB0b3At
bGV2ZWwgU0dNTCBmaWxlLiBZb3UgY2FuIGNoYW5nZSB0aGlzIGlmIHlvdSB3YW50IHRvLgotRE9D
X01BSU5fU0dNTF9GSUxFPSQoRE9DX01PRFVMRSktZG9jcy5zZ21sCi0KLSMgVGhlIGRpcmVjdG9y
eSBjb250YWluaW5nIHRoZSBzb3VyY2UgY29kZS4gUmVsYXRpdmUgdG8gJChzcmNkaXIpLgotIyBn
dGstZG9jIHdpbGwgc2VhcmNoIGFsbCAuYyAmIC5oIGZpbGVzIGJlbmVhdGggaGVyZSBmb3IgaW5s
aW5lIGNvbW1lbnRzCi0jIGRvY3VtZW50aW5nIHRoZSBmdW5jdGlvbnMgYW5kIG1hY3Jvcy4KLSMg
ZS5nLiBET0NfU09VUkNFX0RJUj0uLi8uLi8uLi9ndGsKLURPQ19TT1VSQ0VfRElSPSQodG9wX3Ny
Y2RpcikvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsKLQotIyBFeHRyYSBvcHRpb25z
IHRvIHBhc3MgdG8gZ3RrZG9jLXNjYW5nb2JqLiBOb3Qgbm9ybWFsbHkgbmVlZGVkLgotU0NBTkdP
QkpfT1BUSU9OUz0iLS10eXBlLWluaXQtZnVuYz1nX3R5cGVfaW5pdCgpIgotCi0jIEV4dHJhIG9w
dGlvbnMgdG8gc3VwcGx5IHRvIGd0a2RvYy1zY2FuLgotIyBlLmcuIFNDQU5fT1BUSU9OUz0tLWRl
cHJlY2F0ZWQtZ3VhcmRzPSJHVEtfRElTQUJMRV9ERVBSRUNBVEVEIgotU0NBTl9PUFRJT05TPS0t
aWdub3JlLWRlY29yYXRvcnM9IldFQktJVF9BUEkiCi0KLSMgRXh0cmEgb3B0aW9ucyB0byBzdXBw
bHkgdG8gZ3RrZG9jLW1rZGIuCi0jIGUuZy4gTUtEQl9PUFRJT05TPS0tc2dtbC1tb2RlIC0tb3V0
cHV0LWZvcm1hdD14bWwKLU1LREJfT1BUSU9OUz0tLXNnbWwtbW9kZSAtLW91dHB1dC1mb3JtYXQ9
eG1sIC0tc291cmNlLXN1ZmZpeGVzPWgsYyxjcHAKLQotIyBFeHRyYSBvcHRpb25zIHRvIHN1cHBs
eSB0byBndGtkb2MtbWt0bXBsCi0jIGUuZy4gTUtUTVBMX09QVElPTlM9LS1vbmx5LXNlY3Rpb24t
dG1wbAotTUtUTVBMX09QVElPTlM9Ci0KLSMgRXh0cmEgb3B0aW9ucyB0byBzdXBwbHkgdG8gZ3Rr
ZG9jLWZpeHJlZi4gTm90IG5vcm1hbGx5IG5lZWRlZC4KLSMgZS5nLiBGSVhYUkVGX09QVElPTlM9
LS1leHRyYS1kaXI9Li4vZ2RrLXBpeGJ1Zi9odG1sIC0tZXh0cmEtZGlyPS4uL2dkay9odG1sCi1G
SVhYUkVGX09QVElPTlM9Ci0KLSMgVXNlZCBmb3IgZGVwZW5kZW5jaWVzLiBUaGUgZG9jcyB3aWxs
IGJlIHJlYnVpbHQgaWYgYW55IG9mIHRoZXNlIGNoYW5nZS4KLSMgZS5nLiBIRklMRV9HTE9CPSQo
dG9wX3NyY2RpcikvZ3RrLyouaAotIyBlLmcuIENGSUxFX0dMT0I9JCh0b3Bfc3JjZGlyKS9ndGsv
Ki5jCi1IRklMRV9HTE9CPSQodG9wX3NyY2RpcikvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQ
SS9ndGsvKi5oCi1DRklMRV9HTE9CPSQodG9wX3NyY2RpcikvU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL0FQSS9ndGsvKi5jcHAKLQotIyBIZWFkZXIgZmlsZXMgdG8gaWdub3JlIHdoZW4gc2Nhbm5p
bmcuCi0jIGUuZy4gSUdOT1JFX0hGSUxFUz1ndGtkZWJ1Zy5oIGd0a2ludGwuaAotSUdOT1JFX0hG
SUxFUyA9IFwKLQlMb2FkVHJhY2tpbmdUZXN0LmggXAotCVBhZ2VDbGllbnRJbXBsLmggXAotCVRl
c3RNYWluLmggXAotCVdlYlZpZXdUZXN0LmggXAotCVdlYktpdERlZmluZXMuaCBcCi0JV2ViS2l0
UHJpdmF0ZS5oIFwKLQlXZWJLaXRXZWJDb250ZXh0UHJpdmF0ZS5oIFwKLQlXZWJLaXRXZWJWaWV3
QmFzZVByaXZhdGUuaAotCi0jIEltYWdlcyB0byBjb3B5IGludG8gSFRNTCBkaXJlY3RvcnkuCi0j
IGUuZy4gSFRNTF9JTUFHRVM9JCh0b3Bfc3JjZGlyKS9ndGsvc3RvY2staWNvbnMvc3RvY2tfYWJv
dXRfMjQucG5nCi1IVE1MX0lNQUdFUz0KLQotIyBFeHRyYSBTR01MIGZpbGVzIHRoYXQgYXJlIGlu
Y2x1ZGVkIGJ5ICQoRE9DX01BSU5fU0dNTF9GSUxFKS4KLSMgZS5nLiBjb250ZW50X2ZpbGVzPXJ1
bm5pbmcuc2dtbCBidWlsZGluZy5zZ21sIGNoYW5nZXMtMi4wLnNnbWwKLWNvbnRlbnRfZmlsZXM9
Ci0KLSMgU0dNTCBmaWxlcyB3aGVyZSBndGstZG9jIGFiYnJldmF0aW9ucyAoI0d0a1dpZGdldCkg
YXJlIGV4cGFuZGVkCi0jIFRoZXNlIGZpbGVzIG11c3QgYmUgbGlzdGVkIGhlcmUgKmFuZCogaW4g
Y29udGVudF9maWxlcwotIyBlLmcuIGV4cGFuZF9jb250ZW50X2ZpbGVzPXJ1bm5pbmcuc2dtbAot
ZXhwYW5kX2NvbnRlbnRfZmlsZXM9Ci0KLSMgQ0ZMQUdTIGFuZCBMREZMQUdTIGZvciBjb21waWxp
bmcgZ3RrZG9jLXNjYW5nb2JqIHdpdGggeW91ciBsaWJyYXJ5LgotIyBPbmx5IG5lZWRlZCBpZiB5
b3UgYXJlIHVzaW5nIGd0a2RvYy1zY2FuZ29iaiB0byBkeW5hbWljYWxseSBxdWVyeSB3aWRnZXQK
LSMgc2lnbmFscyBhbmQgcHJvcGVydGllcy4KLSMgZS5nLiBJTkNMVURFUz0tSSQodG9wX3NyY2Rp
cikgLUkkKHRvcF9idWlsZGRpcikgJChHVEtfREVCVUdfRkxBR1MpCi0jIGUuZy4gR1RLRE9DX0xJ
QlM9JCh0b3BfYnVpbGRkaXIpL2d0ay8kKGd0a3RhcmdldGxpYikKLUlOQ0xVREVTPSBcCi0JLUkk
KHRvcF9zcmNkaXIpL1NvdXJjZSBcCi0JLUkkKHRvcF9zcmNkaXIpL1NvdXJjZS9XZWJLaXQyIFwK
LQktSSQodG9wX2J1aWxkZGlyKS9EZXJpdmVkU291cmNlcyBcCi0JLUkkKHRvcF9idWlsZGRpcikv
RGVyaXZlZFNvdXJjZXMvV2ViS2l0Mi9pbmNsdWRlIFwKLQktSSQodG9wX2J1aWxkZGlyKS9EZXJp
dmVkU291cmNlcy9XZWJLaXQyL3dlYmtpdDJndGsgXAotCS1JJCh0b3BfYnVpbGRkaXIpL0Rlcml2
ZWRTb3VyY2VzL1dlYktpdDIvd2Via2l0Mmd0ay9pbmNsdWRlIFwKLQktSSQodG9wX3NyY2Rpcikv
U291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsgXAotCSQoZ2xvYmFsX2NwcGZsYWdzKSBc
Ci0JJChnbG9iYWxfY2ZsYWdzKSBcCi0JJChHTElCX0NGTEFHUykgXAotCSQoR1RLX0NGTEFHUykg
XAotCSQoTElCU09VUF9DRkxBR1MpIFwKLQkkKGphdmFzY3JpcHRjb3JlX2NwcGZsYWdzKQotCi1H
VEtET0NfTElCUz0gXAotCSQodG9wX2J1aWxkZGlyKS9saWJqYXZhc2NyaXB0Y29yZWd0ay1AV0VC
S0lUR1RLX0FQSV9NQUpPUl9WRVJTSU9OQC5AV0VCS0lUR1RLX0FQSV9NSU5PUl9WRVJTSU9OQC5s
YSBcCi0JJCh0b3BfYnVpbGRkaXIpL2xpYndlYmtpdDJndGstQFdFQktJVEdUS19BUElfTUFKT1Jf
VkVSU0lPTkAuQFdFQktJVEdUS19BUElfTUlOT1JfVkVSU0lPTkAubGEgXAotCSQoR0xJQl9MSUJT
KSBcCi0JJChHVEtfTElCUykKLQotIyBUaGlzIGluY2x1ZGVzIHRoZSBzdGFuZGFyZCBndGstZG9j
IG1ha2UgcnVsZXMsIGNvcGllZCBieSBndGtkb2NpemUuCi0jIEZJWE1FOiBuZWVkIHRvIHVuYnJl
YWsgdGhpcyBkb2N1bWVudGF0aW9uIGJ1aWxkLgotIyBpbmNsdWRlICQodG9wX3NyY2RpcikvZ3Rr
LWRvYy5tYWtlCi0KLSMgT3RoZXIgZmlsZXMgdG8gZGlzdHJpYnV0ZQotIyBlLmcuIEVYVFJBX0RJ
U1QgKz0gdmVyc2lvbi54bWwuaW4KLSNFWFRSQV9ESVNUICs9Ci0KLSMgRmlsZXMgbm90IHRvIGRp
c3RyaWJ1dGUKLSMgZm9yIC0tcmVidWlsZC10eXBlcyBpbiAkKFNDQU5fT1BUSU9OUyksIGUuZy4g
JChET0NfTU9EVUxFKS50eXBlcwotIyBmb3IgLS1yZWJ1aWxkLXNlY3Rpb25zIGluICQoU0NBTl9P
UFRJT05TKSBlLmcuICQoRE9DX01PRFVMRSktc2VjdGlvbnMudHh0Ci1ESVNUQ0xFQU5GSUxFUyAr
PSBcCi0gICAgICAgICQodG9wX2J1aWxkZGlyKS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJ
L2d0ay9kb2NzL3ZlcnNpb24ueG1sCi0KLSMgQ29tbWVudCB0aGlzIG91dCBpZiB5b3Ugd2FudCB5
b3VyIGRvY3Mtc3RhdHVzIHRlc3RlZCBkdXJpbmcgJ21ha2UgY2hlY2snCi0jVEVTVFMgPSAkKEdU
S0RPQ19DSEVDSykKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3Rr
L2RvY3MvYnVpbGQtZ3RrZG9jIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvZG9j
cy9idWlsZC1ndGtkb2MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMWRkNzZhZDE5Y2E1ZjMwZDBiYTNkZTgzOWE0NzFl
NDlmZDc4NjE4OAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9B
UEkvZ3RrL2RvY3MvYnVpbGQtZ3RrZG9jCkBAIC0wLDAgKzEsOTMgQEAKKyMhL3Vzci9iaW4vZW52
IHB5dGhvbgorIyAgQ29weXJpZ2h0IChDKSAyMDExIElnYWxpYSBTLkwuCisjCisjICBUaGlzIGxp
YnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisj
ICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVi
bGljCisjICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uOyBlaXRoZXIKKyMgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0
aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRl
ZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyAgYnV0IFdJVEhPVVQgQU5Z
IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgIE1FUkNI
QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUg
R05VCisjICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgor
IworIyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBH
ZW5lcmFsIFB1YmxpYworIyAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90
LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJh
bmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisj
CisKK2ltcG9ydCBnbG9iCitpbXBvcnQgZ3RrZG9jCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9z
LnBhdGgKK2ltcG9ydCBzeXMKKworZGVmIGNvbmZpZ3VyZV9sb2dnaW5nKCk6CisgICAgbGV2ZWwg
PSBsb2dnaW5nLkRFQlVHIGlmICctdicgaW4gc3lzLmFyZ3YgZWxzZSBsb2dnaW5nLklORk8KKyAg
ICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiZ3RrZG9jIikKKyAgICBsb2dnZXIuc2V0TGV2
ZWwobGV2ZWwpCisgICAgaGFuZGxlciA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcigpCisgICAgaGFu
ZGxlci5zZXRMZXZlbChsZXZlbCkKKyAgICBsb2dnZXIuYWRkSGFuZGxlcihoYW5kbGVyKQorICAg
IGlmIGxldmVsID09IGxvZ2dpbmcuREVCVUc6CisgICAgICAgIGhhbmRsZXIuc2V0Rm9ybWF0dGVy
KGxvZ2dpbmcuRm9ybWF0dGVyKCdbJShhc2N0aW1lKXNdICAlKG1lc3NhZ2UpcycpKQorICAgIGVs
c2U6CisgICAgICAgIGhhbmRsZXIuc2V0Rm9ybWF0dGVyKGxvZ2dpbmcuRm9ybWF0dGVyKCclKG1l
c3NhZ2UpcycpKQorCitkZWYgZmluZF9idWlsZF9kaXJlY3RvcnkodG9wX2xldmVsKToKKyAgICBk
ZWYgaXNfdmFsaWRfYnVpbGRfZGlyZWN0b3J5KGJ1aWxkX2Rpcik6CisgICAgICAgIHJldHVybiBv
cy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oYnVpbGRfZGlyLCAiLmxpYnMiKSkKKworICAgIGlm
IGlzX3ZhbGlkX2J1aWxkX2RpcmVjdG9yeSh0b3BfbGV2ZWwpOgorICAgICAgICByZXR1cm4gdG9w
X2xldmVsCisKKyAgICBidWlsZF9kaXIgPSBvcy5wYXRoLmpvaW4odG9wX2xldmVsLCAnV2ViS2l0
QnVpbGQnKQorICAgIGlmIGlzX3ZhbGlkX2J1aWxkX2RpcmVjdG9yeShidWlsZF9kaXIpOgorICAg
ICAgICByZXR1cm4gYnVpbGRfZGlyCisKKyAgICBidWlsZF9kaXIgPSBvcy5wYXRoLmpvaW4odG9w
X2xldmVsLCAnV2ViS2l0QnVpbGQnLCAnUmVsZWFzZScpCisgICAgaWYgaXNfdmFsaWRfYnVpbGRf
ZGlyZWN0b3J5KGJ1aWxkX2Rpcik6CisgICAgICAgIHJldHVybiBidWlsZF9kaXIKKworICAgIGJ1
aWxkX2RpciA9IG9zLnBhdGguam9pbih0b3BfbGV2ZWwsICdXZWJLaXRCdWlsZCcsICdEZWJ1Zycp
CisgICAgaWYgaXNfdmFsaWRfYnVpbGRfZGlyZWN0b3J5KGJ1aWxkX2Rpcik6CisgICAgICAgIHJl
dHVybiBidWlsZF9kaXIKKyAgICBwcmludCAiQ291bGQgbm90IGRldGVybWluZSBidWlsZCBkaXJl
Y3RvcnkuIgorICAgIHN5cy5leGl0KDEpCisKK2RvY19kaXIgPSBvcy5wYXRoLmFic3BhdGgob3Mu
cGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKK3RvcF9sZXZlbCA9IG9zLnBhdGgubm9ybXBhdGgob3Mu
cGF0aC5qb2luKGRvY19kaXIsICcuLicsICcuLicsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAnLi4nLCAnLi4nLCAnLi4nLCAnLi4nKSkKK2J1aWxkX2RpciA9IGZp
bmRfYnVpbGRfZGlyZWN0b3J5KHRvcF9sZXZlbCkKKworb3V0cHV0X2RpciA9IG9zLnBhdGguam9p
bihidWlsZF9kaXIsICJEb2N1bWVudGF0aW9uIiwgIldlYktpdDIiKQorc3JjX2RpciA9IG9zLnBh
dGguam9pbihkb2NfZGlyLCAnLi4nKQorbGlicmFyeV9wYXRoID0gb3MucGF0aC5qb2luKGJ1aWxk
X2RpciwgIi5saWJzIikKK3BrZ19jb25maWdfcGF0aCA9IFwKKyAgICBvcy5wYXRoLmpvaW4oYnVp
bGRfZGlyLCAiU291cmNlIiwgIldlYktpdDIiLCAid2Via2l0Mmd0ay0zLjAucGMiKQorCitkZXJp
dmVkX3NvdXJjZXMgPSBvcy5wYXRoLmpvaW4oYnVpbGRfZGlyLCAiRGVyaXZlZFNvdXJjZXMiLCAi
V2ViS2l0MiIpCitjZmxhZ3MgPSBcCisnIC1JJyArIG9zLnBhdGguam9pbihkZXJpdmVkX3NvdXJj
ZXMsICd3ZWJraXQyZ3RrJywgJ2luY2x1ZGUnKSArIFwKKycgLUknICsgb3MucGF0aC5qb2luKGRl
cml2ZWRfc291cmNlcywgJ3dlYmtpdDJndGsnKSArIFwKKycgLUknICsgb3MucGF0aC5qb2luKGRl
cml2ZWRfc291cmNlcywgJ2luY2x1ZGUnKSArIFwKKycgLUknICsgb3MucGF0aC5qb2luKHRvcF9s
ZXZlbCwgJ1NvdXJjZScpCisnIC1JJyArIHNyY19kaXIKKworaWdub3JlZF9maWxlcyA9IGdsb2Iu
Z2xvYigiJXMvKlByaXZhdGUuaCIgJSBzcmNfZGlyKSArIFwKKyAgICAgICAgICAgICAgICBnbG9i
Lmdsb2IoIiVzL1BhZ2VDbGllbnRJbXBsLioiICUgc3JjX2RpcikgKyBcCisgICAgICAgICAgICAg
ICAgZ2xvYi5nbG9iKCIlcy90ZXN0cy8qLmgiICUgc3JjX2RpcikKKworY29uZmlndXJlX2xvZ2dp
bmcoKQorZ2VuZXJhdG9yID0gZ3RrZG9jLlBrZ0NvbmZpZ0dUS0RvYyhtb2R1bGVfbmFtZT0id2Vi
a2l0Mmd0ayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kaXI9
b3V0cHV0X2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtnX2NvbmZp
Z19wYXRoPXBrZ19jb25maWdfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgc291cmNlX2RpcnM9W3NyY19kaXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBkb2NfZGlyPWRvY19kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNmbGFncz1jZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJh
cnlfcGF0aD1saWJyYXJ5X3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGRlY29yYXRvcj0iV0VCS0lUX0FQSSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGRlcHJlY2F0aW9uX2d1YXJkPSJXRUJLSVRfRElTQUJMRV9ERVBSRUNBVEVEIiwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlZF9maWxlcz1pZ25vcmVkX2ZpbGVz
KQorZ2VuZXJhdG9yLmdlbmVyYXRlKGh0bWw9Jy0tc2tpcC1odG1sJyBub3QgaW4gc3lzLmFyZ3Yp
CitzeXMuZXhpdCgxIGlmIGdlbmVyYXRvci5zYXdfd2FybmluZ3MgZWxzZSAwKQpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvZG9jcy9ndGtkb2MucHkgYi9Tb3Vy
Y2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay9kb2NzL2d0a2RvYy5weQpuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4z
MTg0M2E4Y2JlNTM3NDhlZjE0OTY0YTg0Yzk0Yjc0ODE4MGNlOWI3Ci0tLSAvZGV2L251bGwKKysr
IGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvZG9jcy9ndGtkb2MucHkKQEAgLTAs
MCArMSwzODkgQEAKKyMgIENvcHlyaWdodCAoQykgMjAxMSBJZ2FsaWEgUy5MLgorIworIyAgVGhp
cyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v
cgorIyAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFs
IFB1YmxpYworIyAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbjsgZWl0aGVyCisjICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3Vy
IG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJp
YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgIGJ1dCBXSVRIT1VU
IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjICBN
RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg
dGhlIEdOVQorIyAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls
cy4KKyMKKyMgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNz
ZXIgR2VuZXJhbCBQdWJsaWMKKyMgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlm
IG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgIEZvdW5kYXRpb24sIEluYy4sIDUx
IEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVT
QQorIworCitpbXBvcnQgZXJybm8KK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3MKK2ltcG9ydCBv
cy5wYXRoCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworCisKK2NsYXNzIEdUS0RvYyhv
YmplY3QpOgorCisgICAgIiIiQ2xhc3MgdGhhdCBjb250cm9scyBhIGd0a2RvYyBydW4uCisKKyAg
ICBFYWNoIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50cyBvbmUgZ3RrZG9jIGNvbmZp
Z3VyYXRpb24KKyAgICBhbmQgc2V0IG9mIGRvY3VtZW50YXRpb24uIFRoZSBndGtkb2MgcGFja2Fn
ZSBpcyBhIHNlcmllcyBvZiB0b29scworICAgIHJ1biBjb25zZWN1dGl2ZWx5IHdoaWNoIGNvbnZl
cnRzIGlubGluZSBDL0MrKyBkb2N1bWVudGF0aW9uIGludG8KKyAgICBkb2Nib29rIGZpbGVzIGFu
ZCB0aGVuIGludG8gSFRNTC4gVGhpcyBjbGFzcyBpcyBzdWl0YWJsZSBmb3IKKyAgICBnZW5lcmF0
aW5nIGRvY3VtZW50YXRpb24gb3Igc2ltcGx5IHZlcmlmeWluZyBjb3JyZWN0bmVzcy4KKworICAg
IEtleXdvcmQgYXJndW1lbnRzOgorICAgIG91dHB1dF9kaXIgICAgICAgICAtLSBUaGUgcGF0aCB3
aGVyZSBndGtkb2Mgb3V0cHV0IHNob3VsZCBiZSBwbGFjZWQuIEdlbmVyYXRpb24KKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgbWF5IG92ZXJ3cml0ZSBmaWxlIGluIHRoaXMgZGlyZWN0b3J5LiBS
ZXF1aXJlZC4KKyAgICBtb2R1bGVfbmFtZSAgICAgICAgLS0gVGhlIG5hbWUgb2YgdGhlIGRvY3Vt
ZW50YXRpb24gbW9kdWxlLiBGb3IgbGlicmFyaWVzIHRoaXMKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgaXMgdHlwaWNhbGx5IHRoZSBsaWJyYXJ5IG5hbWUuIFJlcXVpcmVkIGlmIG5vdCBsaWJy
YXJ5IHBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgZ2l2ZW4uCisgICAgc291cmNl
X2RpcnMgICAgICAgIC0tIEEgbGlzdCBvZiBwYXRocyB0byB0aGUgc291cmNlIGNvZGUgdG8gYmUg
c2Nhbm5lZC4gUmVxdWlyZWQuCisgICAgaWdub3JlZF9maWxlcyAgICAgIC0tIEEgbGlzdCBvZiBm
aWxlbmFtZXMgdG8gaWdub3JlIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LiBJdCBpcworICAgICAg
ICAgICAgICAgICAgICAgICAgICBvbmx5IG5lY2Vzc2FyeSB0byBwcm92aWRlIHRoZSBiYXNlbmFt
ZXMgb2YgdGhlc2UgZmlsZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGljYWxseSBp
dCBpcyBpbXBvcnRhbnQgdG8gcHJvdmlkZSBhbiB1cGRhdGVkIGxpc3Qgb2YKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgaWdub3JlZCBmaWxlcyB0byBwcmV2ZW50IHdhcm5pbmdzIGFib3V0IHVu
ZG9jdW1lbnRlZCBzeW1ib2xzLgorICAgIGRlY29yYXRvciAgICAgICAgICAtLSBJZiBhIGRlY29y
YXRvciBpcyB1c2VkIHRvIHVuaGlkZSBjZXJ0YWluIHN5bWJvbHMgaW4gaGVhZGVyCisgICAgICAg
ICAgICAgICAgICAgICAgICAgIGZpbGVzIHRoaXMgcGFyYW1ldGVyIGlzIHJlcXVpcmVkIGZvciBz
dWNjZXNzZnVsIHNjYW5uaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAn
JykKKyAgICBkZXByZWNhdGlvbl9ndWFyZCAgLS0gZ3RrZG9jIHRyaWVzIHRvIGVuc3VyZSB0aGF0
IHN5bWJvbHMgbWFya2VkIGFzIGRlcHJlY2F0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
YXJlIGVuY2FzZWQgaW4gdGhpcyBDIHByZXByb2Nlc3NvciBkZWZpbmUuIFRoaXMgaXMgcmVxdWly
ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYXZvaWQgZ3RrZG9jIHdhcm5pbmdzLiAo
ZGVmYXVsdCAnJykKKyAgICBjZmxhZ3MgICAgICAgICAgICAgLS0gVGhpcyBwYXJhbWV0ZXIgc3Bl
Y2lmaWVzIGFueSBwcmVwcm9jZXNzb3IgZmxhZ3MgbmVjZXNzYXJ5IGZvcgorICAgICAgICAgICAg
ICAgICAgICAgICAgICBidWlsZGluZyB0aGUgc2Nhbm5lciBiaW5hcnkgZHVyaW5nIGd0a2RvYy1z
Y2Fub2JqLiBUeXBpY2FsbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpbmNsdWRl
cyBhbGwgYWJzb2x1dGUgaW5jbHVkZSBwYXRocyBuZWNlc3NhcnkgdG8gcmVzb2x2ZQorICAgICAg
ICAgICAgICAgICAgICAgICAgICBhbGwgaGVhZGVyIGRlcGVuZGVuY2llcy4gKGRlZmF1bHQgJycp
CisgICAgbGRmbGFncyAgICAgICAgICAgIC0tIFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyBhbnkg
bGlua2VyIGZsYWdzIG5lY2Vzc2FyeSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVp
bGRpbmcgdGhlIHNjYW5uZXIgYmluYXJ5IGR1cmluZyBndGtkb2Mtc2Nhbm9iai4gVHlwaWNhbGx5
CisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaW5jbHVkZXMgIi1seW91cmxpYnJhcnlu
YW1lIi4gKGRlZmF1bHQgJycpCisgICAgbGlicmFyeV9wYXRoICAgICAgIC0tIFRoaXMgcGFyYW1l
dGVyIHNwZWNpZmllcyB0aGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIHlvdQorICAgICAg
ICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5IHJlc2lkZXMgdXNlZCBmb3IgYnVpbGRpbmcgdGhl
IHNjYW5uZXIgYmluYXJ5IGR1cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICBndGtkb2Mt
c2Nhbm9iai4gKGRlZmF1bHQgJycpCisKKyAgICBkb2NfZGlyICAgICAgICAgICAgLS0gVGhlIHBh
dGggdG8gb3RoZXIgZG9jdW1lbnRhdGlvbiBmaWxlcyBuZWNlc3NhcnkgdG8gYnVpbGQKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgdGhlIGRvY3VtZW50YXRpb24uIFRoaXMgZmlsZXMgaW4gdGhp
cyBkaXJlY3RvcnkgYXMgd2VsbCBhcworICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmls
ZXMgaW4gdGhlICdodG1sJyBzdWJkaXJlY3Rvcnkgd2lsbCBiZSBjb3BpZWQKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgcmVjdXJzaXZlbHkgaW50byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4gKGRl
ZmF1bHQgJycpCisgICAgbWFpbl9zZ21sX2ZpbGUgICAgIC0tIFRoZSBwYXRoIG9yIG5hbWUgKGlm
IGEgZG9jX2RpciBpcyBnaXZlbikgb2YgdGhlIFNHTUwgZmlsZQorICAgICAgICAgICAgICAgICAg
ICAgICAgICB0aGF0IGlzIHRoZSBjb25zaWRlcmVkIHRoZSBtYWluIHBhZ2Ugb2YgeW91ciBkb2N1
bWVudGF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogPG1vZHVsZV9u
YW1lPi1kb2NzLnNnbWwpCisgICAgdmVyc2lvbiAgICAgICAgICAgIC0tIFRoZSB2ZXJzaW9uIG51
bWJlciBvZiB0aGUgbW9kdWxlLiBJZiB0aGlzIGlzIHByb3ZpZGVkLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICBhIHZlcnNpb24ueG1sIGZpbGUgY29udGFpbmluZyB0aGUgdmVyc2lvbiB3aWxs
IGJlIGNyZWF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIG91dHB1dCBkaXJl
Y3RvcnkgZHVyaW5nIGRvY3VtZW50YXRpb24gZ2VuZXJhdGlvbi4KKworICAgIGludGVyYWN0aXZl
ICAgICAgICAtLSBXaGV0aGVyIG9yIG5vdCBlcnJvcnMgb3Igd2FybmluZ3Mgc2hvdWxkIHByb21w
dCB0aGUgdXNlcgorICAgICAgICAgICAgICAgICAgICAgICAgICB0byBjb250aW51ZSBvciBub3Qu
IFdoZW4gdGhpcyB2YWx1ZSBpcyBmYWxzZSwgZ2VuZXJhdGlvbgorICAgICAgICAgICAgICAgICAg
ICAgICAgICB3aWxsIGNvbnRpbnVlIGRlc3BpdGUgd2FybmluZ3MuIChkZWZhdWx0IEZhbHNlKQor
ICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICoqYXJncyk6CisKKyAgICAgICAgIyBQ
YXJhbWV0ZXJzIHNwZWNpZmljIHRvIHNjYW5uaW5nLgorICAgICAgICBzZWxmLm1vZHVsZV9uYW1l
ID0gJycKKyAgICAgICAgc2VsZi5zb3VyY2VfZGlycyA9IFtdCisgICAgICAgIHNlbGYuaWdub3Jl
ZF9maWxlcyA9IFtdCisgICAgICAgIHNlbGYuZGVjb3JhdG9yID0gJycKKyAgICAgICAgc2VsZi5k
ZXByZWNhdGlvbl9ndWFyZCA9ICcnCisKKyAgICAgICAgIyBQYXJhbWV0ZXJzIHNwZWNpZmljIHRv
IGd0a2RvYy1zY2Fub2JqLgorICAgICAgICBzZWxmLmNmbGFncyA9ICcnCisgICAgICAgIHNlbGYu
bGRmbGFncyA9ICcnCisgICAgICAgIHNlbGYubGlicmFyeV9wYXRoID0gJycKKworICAgICAgICAj
IFBhcmFtZXRlcnMgc3BlY2lmaWMgdG8gZ2VuZXJhdGlvbi4KKyAgICAgICAgc2VsZi5vdXRwdXRf
ZGlyID0gJycKKyAgICAgICAgc2VsZi5kb2NfZGlyID0gJycKKyAgICAgICAgc2VsZi5tYWluX3Nn
bWxfZmlsZSA9ICcnCisKKyAgICAgICAgc2VsZi5pbnRlcmFjdGl2ZSA9IEZhbHNlCisKKyAgICAg
ICAgc2VsZi5sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcignZ3RrZG9jJykKKworICAgICAgICBm
b3Iga2V5LCB2YWx1ZSBpbiBhcmdzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgc2V0YXR0cihz
ZWxmLCBrZXksIHZhbHVlKQorCisgICAgICAgIGRlZiByYWlzZV9lcnJvcl9pZl9ub3Rfc3BlY2lm
aWVkKGtleSk6CisgICAgICAgICAgICBpZiBub3QgZ2V0YXR0cihzZWxmLCBrZXkpOgorICAgICAg
ICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignJXMgbm90IHNwZWNpZmllZC4nICUga2V5KQorCisg
ICAgICAgIHJhaXNlX2Vycm9yX2lmX25vdF9zcGVjaWZpZWQoJ291dHB1dF9kaXInKQorICAgICAg
ICByYWlzZV9lcnJvcl9pZl9ub3Rfc3BlY2lmaWVkKCdzb3VyY2VfZGlycycpCisgICAgICAgIHJh
aXNlX2Vycm9yX2lmX25vdF9zcGVjaWZpZWQoJ21vZHVsZV9uYW1lJykKKworICAgICAgICAjIE1h
a2UgYWxsIHBhdGhzIGFic29sdXRlIGluIGNhc2Ugd2Ugd2VyZSBwYXNzZWQgcmVsYXRpdmUgcGF0
aHMsIHNpbmNlCisgICAgICAgICMgd2UgY2hhbmdlIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0
b3J5IHdoZW4gZXhlY3V0aW5nIHN1YmNvbW1hbmRzLgorICAgICAgICBzZWxmLm91dHB1dF9kaXIg
PSBvcy5wYXRoLmFic3BhdGgoc2VsZi5vdXRwdXRfZGlyKQorICAgICAgICBzZWxmLnNvdXJjZV9k
aXJzID0gW29zLnBhdGguYWJzcGF0aCh4KSBmb3IgeCBpbiBzZWxmLnNvdXJjZV9kaXJzXQorICAg
ICAgICBpZiBzZWxmLmxpYnJhcnlfcGF0aDoKKyAgICAgICAgICAgIHNlbGYubGlicmFyeV9wYXRo
ID0gb3MucGF0aC5hYnNwYXRoKHNlbGYubGlicmFyeV9wYXRoKQorCisgICAgICAgIGlmIG5vdCBz
ZWxmLm1haW5fc2dtbF9maWxlOgorICAgICAgICAgICAgc2VsZi5tYWluX3NnbWxfZmlsZSA9IHNl
bGYubW9kdWxlX25hbWUgKyAiLWRvY3Muc2dtbCIKKworICAgIGRlZiBnZW5lcmF0ZShzZWxmLCBo
dG1sPVRydWUpOgorICAgICAgICBzZWxmLnNhd193YXJuaW5ncyA9IEZhbHNlCisKKyAgICAgICAg
c2VsZi5fY29weV9kb2NfZmlsZXNfdG9fb3V0cHV0X2RpcihodG1sKQorICAgICAgICBzZWxmLl93
cml0ZV92ZXJzaW9uX3htbCgpCisgICAgICAgIHNlbGYuX3J1bl9ndGtkb2Nfc2NhbigpCisgICAg
ICAgIHNlbGYuX3J1bl9ndGtkb2Nfc2NhbmdvYmooKQorICAgICAgICBzZWxmLl9ydW5fZ3RrZG9j
X21rdG1wbCgpCisgICAgICAgIHNlbGYuX3J1bl9ndGtkb2NfbWtkYigpCisKKyAgICAgICAgaWYg
bm90IGh0bWw6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLl9ydW5fZ3RrZG9j
X21raHRtbCgpCisgICAgICAgIHNlbGYuX3J1bl9ndGtkb2NfZml4eHJlZigpCisKKyAgICBkZWYg
X2hhc19leGVjdXRhYmxlX29uX3BhdGgoc2VsZiwgZXhlY3V0YWJsZV9uYW1lKToKKyAgICAgICAg
Zm9yIHBhdGggaW4gb3MuZW52aXJvbi5nZXQoJ1BBVEgnLCAnJykuc3BsaXQob3MucGF0aHNlcCk6
CisgICAgICAgICAgICBmdWxsX3BhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgZXhlY3V0YWJsZV9u
YW1lKQorICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZnVsbF9wYXRoKSBhbmQgXAorICAg
ICAgICAgICAgICAgICBub3Qgb3MucGF0aC5pc2RpcihmdWxsX3BhdGgpIGFuZCBvcy5hY2Nlc3Mo
ZnVsbF9wYXRoLCBvcy5YX09LKToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAg
ICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBfZGVsZXRlX2ZpbGVfaWZfZXhpc3RzKHNlbGYsIHBh
dGgpOgorICAgICAgICBpZiBub3Qgb3MuYWNjZXNzKHBhdGgsIG9zLkZfT0sgfCBvcy5SX09LKToK
KyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygnZGVsZXRpbmcg
JXMnLCBwYXRoKQorICAgICAgICBvcy51bmxpbmsocGF0aCkKKworICAgIGRlZiBfY3JlYXRlX2Rp
cmVjdG9yeV9pZl9ub25leGlzdGVudChzZWxmLCBwYXRoKToKKyAgICAgICAgdHJ5OgorICAgICAg
ICAgICAgb3MubWFrZWRpcnMocGF0aCkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXJyb3I6
CisgICAgICAgICAgICBpZiBlcnJvci5lcnJubyAhPSBlcnJuby5FRVhJU1Q6CisgICAgICAgICAg
ICAgICAgcmFpc2UKKworICAgIGRlZiBfcmFpc2VfZXhjZXB0aW9uX2lmX2ZpbGVfaW5hY2Nlc3Np
YmxlKHNlbGYsIHBhdGgpOgorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCkgb3Ig
bm90IG9zLmFjY2VzcyhwYXRoLCBvcy5SX09LKToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlv
bigiQ291bGQgbm90IGFjY2VzcyBmaWxlIGF0OiAlcyIgJSBwYXRoKQorCisgICAgZGVmIF9vdXRw
dXRfaGFzX3dhcm5pbmdzKHNlbGYsIG91dHB1dHMpOgorICAgICAgICBmb3Igb3V0cHV0IGluIG91
dHB1dHM6CisgICAgICAgICAgICBpZiBvdXRwdXQgYW5kIG91dHB1dC5maW5kKCd3YXJuaW5nJyk6
CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAg
ICBkZWYgX2Fza195ZXNfb3Jfbm9fcXVlc3Rpb24oc2VsZiwgcXVlc3Rpb24pOgorICAgICAgICBp
ZiBub3Qgc2VsZi5pbnRlcmFjdGl2ZToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAg
ICAgcXVlc3Rpb24gKz0gJyBbeS9OXSAnCisgICAgICAgIGFuc3dlciA9IE5vbmUKKyAgICAgICAg
d2hpbGUgYW5zd2VyICE9ICd5JyBhbmQgYW5zd2VyICE9ICduJyBhbmQgYW5zd2VyICE9ICcnOgor
ICAgICAgICAgICAgYW5zd2VyID0gcmF3X2lucHV0KHF1ZXN0aW9uKS5sb3dlcigpCisgICAgICAg
IHJldHVybiBhbnN3ZXIgPT0gJ3knCisKKyAgICBkZWYgX3J1bl9jb21tYW5kKHNlbGYsIGFyZ3Ms
IGVudj1Ob25lLCBjd2Q9Tm9uZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLl9oYXNfZXhlY3V0YWJs
ZV9vbl9wYXRoKGFyZ3NbMF0pOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCclcyBub3Qg
Zm91bmQgb24gcGF0aCcsIGFyZ3NbMF0pCisKKyAgICAgICAgc2VsZi5sb2dnZXIuaW5mbygiUnVu
bmluZyAlcyIsIGFyZ3NbMF0pCisgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCJGdWxsIGNvbW1h
bmQgYXJnczogJXMiLCBzdHIoYXJncykpCisgICAgICAgIHByb2Nlc3MgPSBzdWJwcm9jZXNzLlBv
cGVuKGFyZ3MsIGVudj1lbnYsIGN3ZD1jd2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIHN0ZG91dCwgc3RkZXJy
ID0gcHJvY2Vzcy5jb21tdW5pY2F0ZSgpCisgICAgICAgIGlmIHN0ZG91dDoKKyAgICAgICAgICAg
IHN5cy5zdGRvdXQud3JpdGUoc3Rkb3V0KQorICAgICAgICBpZiBzdGRlcnI6CisgICAgICAgICAg
ICBzeXMuc3RkZXJyLndyaXRlKHN0ZGVycikKKworICAgICAgICBpZiBwcm9jZXNzLnJldHVybmNv
ZGUgIT0gMDoKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignJXMgcHJvZHVjZWQgYSBub24t
emVybyByZXR1cm4gY29kZSAlaScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoYXJn
c1swXSwgcHJvY2Vzcy5yZXR1cm5jb2RlKSkKKworICAgICAgICBpZiAnd2FybmluZycgaW4gc3Rk
ZXJyIG9yICd3YXJuaW5nJyBpbiBzdGRvdXQ6CisgICAgICAgICAgICBzZWxmLnNhd193YXJuaW5n
cyA9IFRydWUKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9hc2tfeWVzX29yX25vX3F1ZXN0aW9u
KCclcyBwcm9kdWNlZCB3YXJuaW5ncywgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgJ3RyeSB0byBjb250aW51ZT8nICUgYXJnc1swXSk6CisgICAgICAg
ICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCclcyBzdGVwIGZhaWxlZCcgJSBhcmdzWzBdKQorCisg
ICAgZGVmIF9jb3B5X2RvY19maWxlc190b19vdXRwdXRfZGlyKHNlbGYsIGh0bWw9VHJ1ZSk6Cisg
ICAgICAgIGlmIG5vdCBzZWxmLmRvY19kaXI6CisgICAgICAgICAgICBzZWxmLmxvZ2dlci5pbmZv
KCdOb3QgY29weWluZyBhbnkgZmlsZXMgZnJvbSBkb2MgZGlyZWN0b3J5LCcKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgJyBiZWNhdXNlIG5vIGRvYyBkaXJlY3RvcnkgZ2l2ZW4uJykKKyAg
ICAgICAgICAgIHJldHVybgorCisgICAgICAgIGRlZiBjb3B5X2ZpbGVfcmVwbGFjaW5nX2V4aXN0
aW5nKHNyYywgZGVzdCk6CisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHNyYyk6CisgICAg
ICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoJ3NraXBwZWQgZGlyZWN0b3J5ICVzJywgIHNy
YykKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIG5vdCBvcy5hY2Nlc3Mo
c3JjLCBvcy5GX09LIHwgb3MuUl9PSyk6CisgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVi
dWcoJ3NraXBwZWQgdW5yZWFkYWJsZSAlcycsIHNyYykKKyAgICAgICAgICAgICAgICByZXR1cm4K
KworICAgICAgICAgICAgc2VsZi5fZGVsZXRlX2ZpbGVfaWZfZXhpc3RzKGRlc3QpCisKKyAgICAg
ICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCdjcmVhdGVkICVzJywgZGVzdCkKKyAgICAgICAgICAg
IG9zLmxpbmsoc3JjLCBkZXN0KQorCisgICAgICAgIGRlZiBjb3B5X2FsbF9maWxlc19pbl9kaXJl
Y3Rvcnkoc3JjLCBkZXN0KToKKyAgICAgICAgICAgIGZvciBwYXRoIGluIG9zLmxpc3RkaXIoc3Jj
KToKKyAgICAgICAgICAgICAgICBjb3B5X2ZpbGVfcmVwbGFjaW5nX2V4aXN0aW5nKG9zLnBhdGgu
am9pbihzcmMsIHBhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgb3MucGF0aC5qb2luKGRlc3QsIHBhdGgpKQorCisgICAgICAgIHNlbGYubG9nZ2VyLmlu
Zm8oJ0NvcHlpbmcgdGVtcGxhdGUgZmlsZXMgdG8gb3V0cHV0IGRpcmVjdG9yeS4uLicpCisgICAg
ICAgIHNlbGYuX2NyZWF0ZV9kaXJlY3RvcnlfaWZfbm9uZXhpc3RlbnQoc2VsZi5vdXRwdXRfZGly
KQorICAgICAgICBjb3B5X2FsbF9maWxlc19pbl9kaXJlY3Rvcnkoc2VsZi5kb2NfZGlyLCBzZWxm
Lm91dHB1dF9kaXIpCisKKyAgICAgICAgaWYgbm90IGh0bWw6CisgICAgICAgICAgICByZXR1cm4K
KworICAgICAgICBzZWxmLmxvZ2dlci5pbmZvKCdDb3B5aW5nIEhUTUwgZmlsZXMgdG8gb3V0cHV0
IGRpcmVjdG9yeS4uLicpCisgICAgICAgIGh0bWxfc3JjX2RpciA9IG9zLnBhdGguam9pbihzZWxm
LmRvY19kaXIsICdodG1sJykKKyAgICAgICAgaHRtbF9kZXN0X2RpciA9IG9zLnBhdGguam9pbihz
ZWxmLm91dHB1dF9kaXIsICdodG1sJykKKyAgICAgICAgc2VsZi5fY3JlYXRlX2RpcmVjdG9yeV9p
Zl9ub25leGlzdGVudChodG1sX2Rlc3RfZGlyKQorCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3Rz
KGh0bWxfc3JjX2Rpcik6CisgICAgICAgICAgICBjb3B5X2FsbF9maWxlc19pbl9kaXJlY3Rvcnko
aHRtbF9zcmNfZGlyLCBodG1sX2Rlc3RfZGlyKQorCisgICAgZGVmIF93cml0ZV92ZXJzaW9uX3ht
bChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYudmVyc2lvbjoKKyAgICAgICAgICAgIHNlbGYu
bG9nZ2VyLmluZm8oJ05vIHZlcnNpb24gc3BlY2lmaWVkLCBzbyBub3Qgd3JpdGluZyB2ZXJzaW9u
LnhtbCcpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB2ZXJzaW9uX3htbF9wYXRoID0g
b3MucGF0aC5qb2luKHNlbGYub3V0cHV0X2RpciwgJ3ZlcnNpb24ueG1sJykKKyAgICAgICAgc3Jj
X3ZlcnNpb25feG1sX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5kb2NfZGlyLCAndmVyc2lvbi54
bWwnKQorCisgICAgICAgICMgRG9uJ3Qgb3ZlcndyaXRlIHZlcnNpb24ueG1sIGlmIGl0IHdhcyBp
biB0aGUgZG9jIGRpcmVjdG9yeS4KKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHModmVyc2lvbl94
bWxfcGF0aCkgYW5kIFwKKyAgICAgICAgICAgb3MucGF0aC5leGlzdHMoc3JjX3ZlcnNpb25feG1s
X3BhdGgpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgb3V0cHV0X2ZpbGUgPSBvcGVu
KHZlcnNpb25feG1sX3BhdGgsICd3JykKKyAgICAgICAgb3V0cHV0X2ZpbGUud3JpdGUoc2VsZi52
ZXJzaW9uKQorICAgICAgICBvdXRwdXRfZmlsZS5jbG9zZSgpCisKKyAgICBkZWYgX3J1bl9ndGtk
b2Nfc2NhbihzZWxmKToKKyAgICAgICAgYXJncyA9IFsnZ3RrZG9jLXNjYW4nLAorICAgICAgICAg
ICAgICAgICctLW1vZHVsZT0lcycgJSBzZWxmLm1vZHVsZV9uYW1lLAorICAgICAgICAgICAgICAg
ICctLXJlYnVpbGQtdHlwZXMnXQorCisgICAgICAgICMgRWFjaCBzb3VyY2UgZGlyZWN0b3J5IHNo
b3VsZCBiZSBoYXZlIGl0cyBvd24gIi0tc291cmNlLWRpcj0iIHByZWZpeC4KKyAgICAgICAgZm9y
IHNvdXJjZV9kaXIgaW4gc2VsZi5zb3VyY2VfZGlyczoKKyAgICAgICAgICAgIGFyZ3MuYXBwZW5k
KCctLXNvdXJjZS1kaXI9JXMnICUgc291cmNlX2RpcikKKworICAgICAgICBpZiBzZWxmLmRlY29y
YXRvcjoKKyAgICAgICAgICAgIGFyZ3MuYXBwZW5kKCctLWlnbm9yZS1kZWNvcmF0b3JzPSVzJyAl
IHNlbGYuZGVjb3JhdG9yKQorICAgICAgICBpZiBzZWxmLmRlcHJlY2F0aW9uX2d1YXJkOgorICAg
ICAgICAgICAgYXJncy5hcHBlbmQoJy0tZGVwcmVjYXRlZC1ndWFyZHM9JXMnICUgc2VsZi5kZXBy
ZWNhdGlvbl9ndWFyZCkKKyAgICAgICAgaWYgc2VsZi5vdXRwdXRfZGlyOgorICAgICAgICAgICAg
YXJncy5hcHBlbmQoJy0tb3V0cHV0LWRpcj0lcycgJSBzZWxmLm91dHB1dF9kaXIpCisKKyAgICAg
ICAgIyBndGtkb2Mtc2NhbiB3YW50cyB0aGUgYmFzZW5hbWVzIG9mIGlnbm9yZWQgaGVhZGVycywg
c28gc3RyaXAgdGhlCisgICAgICAgICMgZGlybmFtZS4gRGlmZmVyZW50IGZyb20gIi0tc291cmNl
LWRpciIsIHRoZSBoZWFkZXJzIHNob3VsZCBiZQorICAgICAgICAjIHNwZWNpZmllZCBhcyBvbmUg
bG9uZyBzdHJpbmcuCisgICAgICAgIGlmIHNlbGYuaWdub3JlZF9maWxlczoKKyAgICAgICAgICAg
IGlnbm9yZWRfZmlsZXNfYmFzZW5hbWVzID0gXAorICAgICAgICAgICAgICAgIFtvcy5wYXRoLmJh
c2VuYW1lKHgpIGZvciB4IGluIHNlbGYuaWdub3JlZF9maWxlc10KKyAgICAgICAgICAgIGFyZ3Mu
YXBwZW5kKCctLWlnbm9yZS1oZWFkZXJzPSVzJyAlICcgJy5qb2luKGlnbm9yZWRfZmlsZXNfYmFz
ZW5hbWVzKSkKKworICAgICAgICBzZWxmLl9ydW5fY29tbWFuZChhcmdzKQorCisgICAgZGVmIF9y
dW5fZ3RrZG9jX3NjYW5nb2JqKHNlbGYpOgorICAgICAgICBlbnYgPSBvcy5lbnZpcm9uCisgICAg
ICAgIGxkZmxhZ3MgPSBzZWxmLmxkZmxhZ3MKKyAgICAgICAgaWYgc2VsZi5saWJyYXJ5X3BhdGg6
CisgICAgICAgICAgICBsZGZsYWdzID0gJyAiLUwlcyIgJyAlIHNlbGYubGlicmFyeV9wYXRoICsg
bGRmbGFncworICAgICAgICAgICAgZW52WydSVU4nXSA9ICdMRF9MSUJSQVJZX1BBVEg9IiVzIiAn
ICUgc2VsZi5saWJyYXJ5X3BhdGgKKyAgICAgICAgaWYgc2VsZi5sZGZsYWdzOgorICAgICAgICAg
ICAgZW52WydMREZMQUdTJ10gPSBsZGZsYWdzCisgICAgICAgIGlmIHNlbGYuY2ZsYWdzOgorICAg
ICAgICAgICAgZW52WydDRkxBR1MnXSA9IHNlbGYuY2ZsYWdzCisKKyAgICAgICAgaWYgJ0NGTEFH
UycgaW4gZW52OgorICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoJ0NGTEFHUz0lcycsIGVu
dlsnQ0ZMQUdTJ10pCisgICAgICAgIGlmICdMREZMQUdTJyBpbiBlbnY6CisgICAgICAgICAgICBz
ZWxmLmxvZ2dlci5kZWJ1ZygnTERGTEFHUyAlcycsIGVudlsnTERGTEFHUyddKQorICAgICAgICBp
ZiAnUlVOJyBpbiBlbnY6CisgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygnUlVOPSVzJywg
ZW52WydSVU4nXSkKKyAgICAgICAgc2VsZi5fcnVuX2NvbW1hbmQoWydndGtkb2Mtc2NhbmdvYmon
LCAnLS1tb2R1bGU9JXMnICUgc2VsZi5tb2R1bGVfbmFtZV0sCisgICAgICAgICAgICAgICAgICAg
ICAgICAgIGVudj1lbnYsIGN3ZD1zZWxmLm91dHB1dF9kaXIpCisKKyAgICBkZWYgX3J1bl9ndGtk
b2NfbWt0bXBsKHNlbGYpOgorICAgICAgICBhcmdzID0gWydndGtkb2MtbWt0bXBsJywgJy0tbW9k
dWxlPSVzJyAlIHNlbGYubW9kdWxlX25hbWVdCisgICAgICAgIHNlbGYuX3J1bl9jb21tYW5kKGFy
Z3MsIGN3ZD1zZWxmLm91dHB1dF9kaXIpCisKKyAgICBkZWYgX3J1bl9ndGtkb2NfbWtkYihzZWxm
KToKKyAgICAgICAgc2dtbF9maWxlID0gb3MucGF0aC5qb2luKHNlbGYub3V0cHV0X2Rpciwgc2Vs
Zi5tYWluX3NnbWxfZmlsZSkKKyAgICAgICAgc2VsZi5fcmFpc2VfZXhjZXB0aW9uX2lmX2ZpbGVf
aW5hY2Nlc3NpYmxlKHNnbWxfZmlsZSkKKworICAgICAgICBhcmdzID0gWydndGtkb2MtbWtkYics
CisgICAgICAgICAgICAgICAgJy0tbW9kdWxlPSVzJyAlIHNlbGYubW9kdWxlX25hbWUsCisgICAg
ICAgICAgICAgICAgJy0tbWFpbi1zZ21sLWZpbGU9JXMnICUgc2dtbF9maWxlLAorICAgICAgICAg
ICAgICAgICctLXNvdXJjZS1zdWZmaXhlcz1oLGMsY3BwLGNjJywKKyAgICAgICAgICAgICAgICAn
LS1vdXRwdXQtZm9ybWF0PXhtbCcsCisgICAgICAgICAgICAgICAgJy0tc2dtbC1tb2RlJ10KKwor
ICAgICAgICAjIEVhY2ggZGlyZWN0b3J5IHNob3VsZCBiZSBoYXZlIGl0cyBvd24gIi0tc291cmNl
LWRpcj0iIHByZWZpeC4KKyAgICAgICAgZm9yIHNvdXJjZV9kaXIgaW4gc2VsZi5zb3VyY2VfZGly
czoKKyAgICAgICAgICAgIGFyZ3MuYXBwZW5kKCctLXNvdXJjZS1kaXI9JXMnICUgc291cmNlX2Rp
cikKKworICAgICAgICBzZWxmLl9ydW5fY29tbWFuZChhcmdzLCBjd2Q9c2VsZi5vdXRwdXRfZGly
KQorCisgICAgZGVmIF9ydW5fZ3RrZG9jX21raHRtbChzZWxmKToKKyAgICAgICAgaHRtbF9kZXN0
X2RpciA9IG9zLnBhdGguam9pbihzZWxmLm91dHB1dF9kaXIsICdodG1sJykKKyAgICAgICAgaWYg
bm90IG9zLnBhdGguaXNkaXIoaHRtbF9kZXN0X2Rpcik6CisgICAgICAgICAgICByYWlzZSBFeGNl
cHRpb24oIiVzIGlzIG5vdCBhIGRpcmVjdG9yeSwgY291bGQgbm90IGdlbmVyYXRlIEhUTUwiCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBodG1sX2Rlc3RfZGlyKQorICAgICAgICBlbGlm
IG5vdCBvcy5hY2Nlc3MoaHRtbF9kZXN0X2Rpciwgb3MuWF9PSyB8IG9zLlJfT0sgfCBvcy5XX09L
KToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiQ291bGQgbm90IGFjY2VzcyAlcyB0byBn
ZW5lcmF0ZSBIVE1MIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgaHRtbF9kZXN0X2Rp
cikKKworICAgICAgICAjIGd0a2RvYy1ta2h0bWwgZXhwZWN0cyB0aGUgU0dNTCBwYXRoIHRvIGJl
IGFic29sdXRlLgorICAgICAgICBzZ21sX2ZpbGUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5hYnNw
YXRoKHNlbGYub3V0cHV0X2RpciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz
ZWxmLm1haW5fc2dtbF9maWxlKQorICAgICAgICBzZWxmLl9yYWlzZV9leGNlcHRpb25faWZfZmls
ZV9pbmFjY2Vzc2libGUoc2dtbF9maWxlKQorCisgICAgICAgIHNlbGYuX3J1bl9jb21tYW5kKFsn
Z3RrZG9jLW1raHRtbCcsIHNlbGYubW9kdWxlX25hbWUsIHNnbWxfZmlsZV0sCisgICAgICAgICAg
ICAgICAgICAgICAgICAgIGN3ZD1odG1sX2Rlc3RfZGlyKQorCisgICAgZGVmIF9ydW5fZ3RrZG9j
X2ZpeHhyZWYoc2VsZik6CisgICAgICAgIHNlbGYuX3J1bl9jb21tYW5kKFsnZ3RrZG9jLWZpeHhy
ZWYnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tbW9kdWxlLWRpcj1odG1sJywKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICctLWh0bWwtZGlyPWh0bWwnXSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgY3dkPXNlbGYub3V0cHV0X2RpcikKKworCitjbGFzcyBQa2dDb25maWdH
VEtEb2MoR1RLRG9jKToKKworICAgICIiIkNsYXNzIHJlYWRzIGEgbGlicmFyeSdzIHBrZ2NvbmZp
ZyBmaWxlIHRvIGd1ZXNzIGd0a2RvYyBwYXJhbWV0ZXJzLgorCisgICAgU29tZSBndGtkb2MgcGFy
YW1ldGVycyBjYW4gYmUgZ3Vlc3NlZCBieSByZWFkaW5nIGEgbGlicmFyeSdzIHBrZ2NvbmZpZwor
ICAgIGZpbGUsIGluY2x1ZGluZyB0aGUgY2ZsYWdzLCBsZGZsYWdzIGFuZCB2ZXJzaW9uIHBhcmFt
ZXRlcnMuIElmIHlvdQorICAgIHByb3ZpZGUgdGhlc2UgcGFyYW1ldGVycyBhcyB3ZWxsLCB0aGV5
IHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIG9uZXMKKyAgICBndWVzc2VkIHZpYSB0aGUgcGtnY29u
ZmlnIGZpbGUuCisKKyAgICBLZXl3b3JkIGFyZ3VtZW50czoKKyAgICAgIHBrZ19jb25maWdfcGF0
aCAtLSBQYXRoIHRvIHRoZSBwa2djb25maWcgZmlsZSBmb3IgdGhlIGxpYnJhcnkuIFJlcXVpcmVk
LgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICoqYXJncyk6CisgICAgICAgIHN1
cGVyKFBrZ0NvbmZpZ0dUS0RvYywgc2VsZikuX19pbml0X18oKiphcmdzKQorICAgICAgICBpZiBu
b3QgJ3BrZ19jb25maWdfcGF0aCcgaW4gYXJnczoKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlv
bigncGtnX2NvbmZpZ19wYXRoIG5vdCBnaXZlbicpCisgICAgICAgIHNlbGYuX3JlYWRfcGtnX2Nv
bmZpZ19maWxlKGFyZ3NbJ3BrZ19jb25maWdfcGF0aCddKQorCisgICAgZGVmIF9yZWFkX3BrZ19j
b25maWdfZmlsZShzZWxmLCBwa2dfY29uZmlnX3BhdGgpOgorICAgICAgICBpZiBub3Qgb3MucGF0
aC5leGlzdHMocGtnX2NvbmZpZ19wYXRoKToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbign
Q291bGQgbm90IGZpbmQgcGtnLWNvbmZpZyBmaWxlIGF0OiAlcycKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAlIHBrZ19jb25maWdfcGF0aCkKKworICAgICAgICBwcm9jZXNzID0gc3VicHJv
Y2Vzcy5Qb3BlbihbJ3BrZy1jb25maWcnLCBwa2dfY29uZmlnX3BhdGgsICctLWNmbGFncyddLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBF
KQorICAgICAgICBzZWxmLmNmbGFncyArPSAiICIgKyBwcm9jZXNzLmNvbW11bmljYXRlKClbMF0u
c3RyaXAoKQorCisgICAgICAgIHByb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKFsncGtnLWNvbmZp
ZycsIHBrZ19jb25maWdfcGF0aCwgJy0tbGlicyddLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBzZWxmLmxkZmxhZ3Mg
PSAiICIgKyBwcm9jZXNzLmNvbW11bmljYXRlKClbMF0uc3RyaXAoKQorCisgICAgICAgIHByb2Nl
c3MgPSBzdWJwcm9jZXNzLlBvcGVuKFsncGtnLWNvbmZpZycsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBwa2dfY29uZmlnX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAnLS1tb2R2ZXJzaW9uJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIHNlbGYudmVyc2lvbiA9
IHByb2Nlc3MuY29tbXVuaWNhdGUoKVswXS5zdHJpcCgpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay9kb2NzL3ZlcnNpb24ueG1sLmluIGIvU291cmNlL1dlYktp
dDIvVUlQcm9jZXNzL0FQSS9ndGsvZG9jcy92ZXJzaW9uLnhtbC5pbgpkZWxldGVkIGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggZDc4YmRhOTM0MjJlY2JiY2E4Y2FmNzcyZjdiMzdmOGZlM2IyNTRlOS4u
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay9kb2NzL3ZlcnNpb24ueG1sLmluCisrKyAvZGV2L251bGwK
QEAgLTEgKzAsMCBAQAotQFZFUlNJT05ACg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>114294</attachid>
            <date>2011-11-09 08:54:03 -0800</date>
            <delta_ts>2011-11-09 19:01:32 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-70877-20111109085402.patch</filename>
            <type>text/plain</type>
            <size>27374</size>
            <attacher name="Martin Robinson">mrobinson</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTk2NTAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwppbmRleCAyNTU5M2YwYzIxOTY2Zjlk
ZTBjNDY1MzNkNjM0NWE2Njc0MzM3NzZhLi4xNTlkNDk5YTE0Nzk5Y2VmZTRhMjU0MzAxMjdmYjVi
ZGUwYjhmMGIzIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cKKysrIGIvU291
cmNlL1dlYktpdDIvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTkgQEAKKzIwMTEtMTAtMjYgIE1hcnRp
biBSb2JpbnNvbiAgPG1yb2JpbnNvbkBpZ2FsaWEuY29tPgorCisgICAgICAgIFtHVEtdIFtXZWJL
aXRdIFJlcGxhY2UgdGhlIGd0a2RvYyBhdXRvb2xzIG1hZ2ljIHdpdGggc29tZXRoaW5nIG1vcmUg
ZmxleGlibGUKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTcwODc3CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
QWRkIGEgc2NyaXB0IHRoYXQgcnVucyBndGtkb2MgbWFudWFsbHkgaW5zdGVhZCBvZiB1c2luZyB0
aGUgYXV0b3Rvb2xzCisgICAgICAgIG1hZ2ljLiBSZW1vdmUgbm93IHVudXNlZCBndGtkb2MgZmls
ZXMuCisKKyAgICAgICAgKiBHTlVtYWtlZmlsZS5hbTogUmVtb3ZlIHJlZmVyZW5jZXMgdG8gcmVt
b3ZlZCBndGtkb2MgZmlsZXMuCisgICAgICAgICogVUlQcm9jZXNzL0FQSS9ndGsvZG9jcy9HTlVt
YWtlZmlsZS5hbTogUmVtb3ZlZC4KKyAgICAgICAgKiBVSVByb2Nlc3MvQVBJL2d0ay9kb2NzL2J1
aWxkLWd0a2RvYzogQWRkZWQuCisgICAgICAgICogVUlQcm9jZXNzL0FQSS9ndGsvZG9jcy9ndGtk
b2MucHk6IEFkZGVkLgorICAgICAgICAqIFVJUHJvY2Vzcy9BUEkvZ3RrL2RvY3MvdmVyc2lvbi54
bWwuaW46IFJlbW92ZWQuCisKIDIwMTEtMTEtMDggIEJyZW50IEZ1bGdoYW0gIDxiZnVsZ2hhbUB3
ZWJraXQub3JnPgogCiAgICAgICAgIFtXaW5DYWlyb10gVW5yZXZpZXdlZCBidWlsZCBmaXggYWZ0
ZXIgcjk5NjEzLgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIvR05VbWFrZWZpbGUuYW0gYi9T
b3VyY2UvV2ViS2l0Mi9HTlVtYWtlZmlsZS5hbQppbmRleCAzODU1OWIwN2FjNmRhYjM0OTNhZmQ5
OGEwZmJmNTZhMjkzMTFiMDY3Li41NmZjZDI4ZjcxNjNlOWM3MTJmZDRjMzQ1N2FjNTMzNGY0NWI2
MDRhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9HTlVtYWtlZmlsZS5hbQorKysgYi9Tb3Vy
Y2UvV2ViS2l0Mi9HTlVtYWtlZmlsZS5hbQpAQCAtMTM5MSwxMCArMTM5MSwxMCBAQCBQcm9ncmFt
c19XZWJLaXRQbHVnaW5Qcm9jZXNzX0NYWEZMQUdTID0gXAogZW5kaWYKIAogRVhUUkFfRElTVCAr
PSBcCi0JJChXZWJLaXQyKS9VSVByb2Nlc3MvQVBJL2d0ay9kb2NzL0dOVW1ha2VmaWxlLmFtIFwK
LQkkKFdlYktpdDIpL1VJUHJvY2Vzcy9BUEkvZ3RrL2RvY3Mvd2Via2l0Mmd0ay1kb2NzLnNnbWwg
XAotCSQoV2ViS2l0MikvVUlQcm9jZXNzL0FQSS9ndGsvZG9jcy93ZWJraXQyZ3RrLXNlY3Rpb25z
LnR4dCBcCi0JJChXZWJLaXQyKS9VSVByb2Nlc3MvQVBJL2d0ay9kb2NzL3ZlcnNpb24ueG1sLmlu
IFwKKwkkKFdlYktpdDIpL1VJUHJvY2Vzcy9BUEkvZ3RrL2RvY3MvYnVpbGQtZ3RrZG9jLnB5IFwK
KwkkKFdlYktpdDIpL1VJUHJvY2Vzcy9BUEkvZ3RrL2RvY3MvZ3RrZG9jLnB5IFwKKwkkKFdlYktp
dDIpL1VJUHJvY2Vzcy9BUEkvZ3RrL2RvY3Mvd2Via2l0Z3RrLWRvY3Muc2dtbCBcCisJJChXZWJL
aXQyKS9VSVByb2Nlc3MvQVBJL2d0ay9kb2NzL3dlYmtpdGd0ay1zZWN0aW9ucy50eHQgXAogCSQo
V2ViS2l0MikvVUlQcm9jZXNzL0FQSS9ndGsvZG9jcy93ZWJraXQyZ3RrLnR5cGVzIFwKIAkkKFdl
YktpdDIpL1NjcmlwdHMvZ2VuZXJhdGUtbWVzc2FnZS1yZWNlaXZlci5weSBcCiAJJChXZWJLaXQy
KS9TY3JpcHRzL2dlbmVyYXRlLW1lc3NhZ2VzLWhlYWRlci5weSBcCkBAIC0xNDIyLDQgKzE0MjIs
MyBAQCBFWFRSQV9ESVNUICs9IFwKIAkkKHNoZWxsIGxzICQoV2ViS2l0MikvV2ViUHJvY2Vzcy9S
ZXNvdXJjZUNhY2hlLyouaW4pIFwKIAkkKHNoZWxsIGxzICQoV2ViS2l0MikvV2ViUHJvY2Vzcy9X
ZWJDb3JlU3VwcG9ydC8qLmluKSBcCiAJJChzaGVsbCBscyAkKFdlYktpdDIpL1dlYlByb2Nlc3Mv
V2ViUGFnZS8qLmluKQotCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJ
L2d0ay9kb2NzL0dOVW1ha2VmaWxlLmFtIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9n
dGsvZG9jcy9HTlVtYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIy
NDE2ZTQzYThiNDcyNTAwZmVkNTIwNzE1MmJiYjU2YWY2Njc0MS4uMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJ
L2d0ay9kb2NzL0dOVW1ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAK
LSMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gcHJvZHVjZSBHTlVtYWtlZmls
ZS5pbgotCi0jIFdlIHJlcXVpcmUgYXV0b21ha2UgMS42IGF0IGxlYXN0LgotQVVUT01BS0VfT1BU
SU9OUyA9IDEuNgotCi0jIFRoaXMgaXMgYSBibGFuayBNYWtlZmlsZS5hbSBmb3IgdXNpbmcgZ3Rr
LWRvYy4KLSMgQ29weSB0aGlzIHRvIHlvdXIgcHJvamVjdCdzIEFQSSBkb2NzIGRpcmVjdG9yeSBh
bmQgbW9kaWZ5IHRoZSB2YXJpYWJsZXMgdG8KLSMgc3VpdCB5b3VyIHByb2plY3QuIFNlZSB0aGUg
R1RLKyBNYWtlZmlsZXMgaW4gZ3RrKy9kb2NzL3JlZmVyZW5jZSBmb3IgZXhhbXBsZXMKLSMgb2Yg
dXNpbmcgdGhlIHZhcmlvdXMgb3B0aW9ucy4KLQotIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlLCBl
LmcuICdnbGliJy4KLURPQ19NT0RVTEU9d2Via2l0Mmd0awotCi0jIFRoZSB0b3AtbGV2ZWwgU0dN
TCBmaWxlLiBZb3UgY2FuIGNoYW5nZSB0aGlzIGlmIHlvdSB3YW50IHRvLgotRE9DX01BSU5fU0dN
TF9GSUxFPSQoRE9DX01PRFVMRSktZG9jcy5zZ21sCi0KLSMgVGhlIGRpcmVjdG9yeSBjb250YWlu
aW5nIHRoZSBzb3VyY2UgY29kZS4gUmVsYXRpdmUgdG8gJChzcmNkaXIpLgotIyBndGstZG9jIHdp
bGwgc2VhcmNoIGFsbCAuYyAmIC5oIGZpbGVzIGJlbmVhdGggaGVyZSBmb3IgaW5saW5lIGNvbW1l
bnRzCi0jIGRvY3VtZW50aW5nIHRoZSBmdW5jdGlvbnMgYW5kIG1hY3Jvcy4KLSMgZS5nLiBET0Nf
U09VUkNFX0RJUj0uLi8uLi8uLi9ndGsKLURPQ19TT1VSQ0VfRElSPSQodG9wX3NyY2RpcikvU291
cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsKLQotIyBFeHRyYSBvcHRpb25zIHRvIHBhc3Mg
dG8gZ3RrZG9jLXNjYW5nb2JqLiBOb3Qgbm9ybWFsbHkgbmVlZGVkLgotU0NBTkdPQkpfT1BUSU9O
Uz0iLS10eXBlLWluaXQtZnVuYz1nX3R5cGVfaW5pdCgpIgotCi0jIEV4dHJhIG9wdGlvbnMgdG8g
c3VwcGx5IHRvIGd0a2RvYy1zY2FuLgotIyBlLmcuIFNDQU5fT1BUSU9OUz0tLWRlcHJlY2F0ZWQt
Z3VhcmRzPSJHVEtfRElTQUJMRV9ERVBSRUNBVEVEIgotU0NBTl9PUFRJT05TPS0taWdub3JlLWRl
Y29yYXRvcnM9IldFQktJVF9BUEkiCi0KLSMgRXh0cmEgb3B0aW9ucyB0byBzdXBwbHkgdG8gZ3Rr
ZG9jLW1rZGIuCi0jIGUuZy4gTUtEQl9PUFRJT05TPS0tc2dtbC1tb2RlIC0tb3V0cHV0LWZvcm1h
dD14bWwKLU1LREJfT1BUSU9OUz0tLXNnbWwtbW9kZSAtLW91dHB1dC1mb3JtYXQ9eG1sIC0tc291
cmNlLXN1ZmZpeGVzPWgsYyxjcHAKLQotIyBFeHRyYSBvcHRpb25zIHRvIHN1cHBseSB0byBndGtk
b2MtbWt0bXBsCi0jIGUuZy4gTUtUTVBMX09QVElPTlM9LS1vbmx5LXNlY3Rpb24tdG1wbAotTUtU
TVBMX09QVElPTlM9Ci0KLSMgRXh0cmEgb3B0aW9ucyB0byBzdXBwbHkgdG8gZ3RrZG9jLWZpeHJl
Zi4gTm90IG5vcm1hbGx5IG5lZWRlZC4KLSMgZS5nLiBGSVhYUkVGX09QVElPTlM9LS1leHRyYS1k
aXI9Li4vZ2RrLXBpeGJ1Zi9odG1sIC0tZXh0cmEtZGlyPS4uL2dkay9odG1sCi1GSVhYUkVGX09Q
VElPTlM9Ci0KLSMgVXNlZCBmb3IgZGVwZW5kZW5jaWVzLiBUaGUgZG9jcyB3aWxsIGJlIHJlYnVp
bHQgaWYgYW55IG9mIHRoZXNlIGNoYW5nZS4KLSMgZS5nLiBIRklMRV9HTE9CPSQodG9wX3NyY2Rp
cikvZ3RrLyouaAotIyBlLmcuIENGSUxFX0dMT0I9JCh0b3Bfc3JjZGlyKS9ndGsvKi5jCi1IRklM
RV9HTE9CPSQodG9wX3NyY2RpcikvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvKi5o
Ci1DRklMRV9HTE9CPSQodG9wX3NyY2RpcikvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9n
dGsvKi5jcHAKLQotIyBIZWFkZXIgZmlsZXMgdG8gaWdub3JlIHdoZW4gc2Nhbm5pbmcuCi0jIGUu
Zy4gSUdOT1JFX0hGSUxFUz1ndGtkZWJ1Zy5oIGd0a2ludGwuaAotSUdOT1JFX0hGSUxFUyA9IFwK
LQlMb2FkVHJhY2tpbmdUZXN0LmggXAotCVBhZ2VDbGllbnRJbXBsLmggXAotCVRlc3RNYWluLmgg
XAotCVdlYlZpZXdUZXN0LmggXAotCVdlYktpdERlZmluZXMuaCBcCi0JV2ViS2l0UHJpdmF0ZS5o
IFwKLQlXZWJLaXRXZWJDb250ZXh0UHJpdmF0ZS5oIFwKLQlXZWJLaXRXZWJWaWV3QmFzZVByaXZh
dGUuaAotCi0jIEltYWdlcyB0byBjb3B5IGludG8gSFRNTCBkaXJlY3RvcnkuCi0jIGUuZy4gSFRN
TF9JTUFHRVM9JCh0b3Bfc3JjZGlyKS9ndGsvc3RvY2staWNvbnMvc3RvY2tfYWJvdXRfMjQucG5n
Ci1IVE1MX0lNQUdFUz0KLQotIyBFeHRyYSBTR01MIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGJ5
ICQoRE9DX01BSU5fU0dNTF9GSUxFKS4KLSMgZS5nLiBjb250ZW50X2ZpbGVzPXJ1bm5pbmcuc2dt
bCBidWlsZGluZy5zZ21sIGNoYW5nZXMtMi4wLnNnbWwKLWNvbnRlbnRfZmlsZXM9Ci0KLSMgU0dN
TCBmaWxlcyB3aGVyZSBndGstZG9jIGFiYnJldmF0aW9ucyAoI0d0a1dpZGdldCkgYXJlIGV4cGFu
ZGVkCi0jIFRoZXNlIGZpbGVzIG11c3QgYmUgbGlzdGVkIGhlcmUgKmFuZCogaW4gY29udGVudF9m
aWxlcwotIyBlLmcuIGV4cGFuZF9jb250ZW50X2ZpbGVzPXJ1bm5pbmcuc2dtbAotZXhwYW5kX2Nv
bnRlbnRfZmlsZXM9Ci0KLSMgQ0ZMQUdTIGFuZCBMREZMQUdTIGZvciBjb21waWxpbmcgZ3RrZG9j
LXNjYW5nb2JqIHdpdGggeW91ciBsaWJyYXJ5LgotIyBPbmx5IG5lZWRlZCBpZiB5b3UgYXJlIHVz
aW5nIGd0a2RvYy1zY2FuZ29iaiB0byBkeW5hbWljYWxseSBxdWVyeSB3aWRnZXQKLSMgc2lnbmFs
cyBhbmQgcHJvcGVydGllcy4KLSMgZS5nLiBJTkNMVURFUz0tSSQodG9wX3NyY2RpcikgLUkkKHRv
cF9idWlsZGRpcikgJChHVEtfREVCVUdfRkxBR1MpCi0jIGUuZy4gR1RLRE9DX0xJQlM9JCh0b3Bf
YnVpbGRkaXIpL2d0ay8kKGd0a3RhcmdldGxpYikKLUlOQ0xVREVTPSBcCi0JLUkkKHRvcF9zcmNk
aXIpL1NvdXJjZSBcCi0JLUkkKHRvcF9zcmNkaXIpL1NvdXJjZS9XZWJLaXQyIFwKLQktSSQodG9w
X2J1aWxkZGlyKS9EZXJpdmVkU291cmNlcyBcCi0JLUkkKHRvcF9idWlsZGRpcikvRGVyaXZlZFNv
dXJjZXMvV2ViS2l0Mi9pbmNsdWRlIFwKLQktSSQodG9wX2J1aWxkZGlyKS9EZXJpdmVkU291cmNl
cy9XZWJLaXQyL3dlYmtpdDJndGsgXAotCS1JJCh0b3BfYnVpbGRkaXIpL0Rlcml2ZWRTb3VyY2Vz
L1dlYktpdDIvd2Via2l0Mmd0ay9pbmNsdWRlIFwKLQktSSQodG9wX3NyY2RpcikvU291cmNlL1dl
YktpdDIvVUlQcm9jZXNzL0FQSS9ndGsgXAotCSQoZ2xvYmFsX2NwcGZsYWdzKSBcCi0JJChnbG9i
YWxfY2ZsYWdzKSBcCi0JJChHTElCX0NGTEFHUykgXAotCSQoR1RLX0NGTEFHUykgXAotCSQoTElC
U09VUF9DRkxBR1MpIFwKLQkkKGphdmFzY3JpcHRjb3JlX2NwcGZsYWdzKQotCi1HVEtET0NfTElC
Uz0gXAotCSQodG9wX2J1aWxkZGlyKS9saWJqYXZhc2NyaXB0Y29yZWd0ay1AV0VCS0lUR1RLX0FQ
SV9NQUpPUl9WRVJTSU9OQC5AV0VCS0lUR1RLX0FQSV9NSU5PUl9WRVJTSU9OQC5sYSBcCi0JJCh0
b3BfYnVpbGRkaXIpL2xpYndlYmtpdDJndGstQFdFQktJVEdUS19BUElfTUFKT1JfVkVSU0lPTkAu
QFdFQktJVEdUS19BUElfTUlOT1JfVkVSU0lPTkAubGEgXAotCSQoR0xJQl9MSUJTKSBcCi0JJChH
VEtfTElCUykKLQotIyBUaGlzIGluY2x1ZGVzIHRoZSBzdGFuZGFyZCBndGstZG9jIG1ha2UgcnVs
ZXMsIGNvcGllZCBieSBndGtkb2NpemUuCi0jIEZJWE1FOiBuZWVkIHRvIHVuYnJlYWsgdGhpcyBk
b2N1bWVudGF0aW9uIGJ1aWxkLgotIyBpbmNsdWRlICQodG9wX3NyY2RpcikvZ3RrLWRvYy5tYWtl
Ci0KLSMgT3RoZXIgZmlsZXMgdG8gZGlzdHJpYnV0ZQotIyBlLmcuIEVYVFJBX0RJU1QgKz0gdmVy
c2lvbi54bWwuaW4KLSNFWFRSQV9ESVNUICs9Ci0KLSMgRmlsZXMgbm90IHRvIGRpc3RyaWJ1dGUK
LSMgZm9yIC0tcmVidWlsZC10eXBlcyBpbiAkKFNDQU5fT1BUSU9OUyksIGUuZy4gJChET0NfTU9E
VUxFKS50eXBlcwotIyBmb3IgLS1yZWJ1aWxkLXNlY3Rpb25zIGluICQoU0NBTl9PUFRJT05TKSBl
LmcuICQoRE9DX01PRFVMRSktc2VjdGlvbnMudHh0Ci1ESVNUQ0xFQU5GSUxFUyArPSBcCi0gICAg
ICAgICQodG9wX2J1aWxkZGlyKS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0ay9kb2Nz
L3ZlcnNpb24ueG1sCi0KLSMgQ29tbWVudCB0aGlzIG91dCBpZiB5b3Ugd2FudCB5b3VyIGRvY3Mt
c3RhdHVzIHRlc3RlZCBkdXJpbmcgJ21ha2UgY2hlY2snCi0jVEVTVFMgPSAkKEdUS0RPQ19DSEVD
SykKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL2RvY3MvYnVp
bGQtZ3RrZG9jIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9ndGsvZG9jcy9idWlsZC1n
dGtkb2MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMC4uZjMwNGE3ZWRmNDI3ZTFmM2JhNDJlNTg2MmZhMzM1NDViMTFjYmVk
OAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL2Rv
Y3MvYnVpbGQtZ3RrZG9jCkBAIC0wLDAgKzEsOTMgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgor
IyAgQ29weXJpZ2h0IChDKSAyMDExIElnYWxpYSBTLkwuCisjCisjICBUaGlzIGxpYnJhcnkgaXMg
ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjICBtb2RpZnkg
aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisjICBM
aWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo
ZXIKKyMgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg
bGF0ZXIgdmVyc2lvbi4KKyMKKyMgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg
aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ
OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgIE1FUkNIQU5UQUJJTElU
WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjICBM
ZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgWW91
IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1
YmxpYworIyAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0
byB0aGUgRnJlZSBTb2Z0d2FyZQorIyAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3Ry
ZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisjCisKK2ltcG9y
dCBnbG9iCitpbXBvcnQgZ3RrZG9jCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zLnBhdGgKK2lt
cG9ydCBzeXMKKworZGVmIGNvbmZpZ3VyZV9sb2dnaW5nKCk6CisgICAgbGV2ZWwgPSBsb2dnaW5n
LkRFQlVHIGlmICctdicgaW4gc3lzLmFyZ3YgZWxzZSBsb2dnaW5nLklORk8KKyAgICBsb2dnZXIg
PSBsb2dnaW5nLmdldExvZ2dlcigiZ3RrZG9jIikKKyAgICBsb2dnZXIuc2V0TGV2ZWwobGV2ZWwp
CisgICAgaGFuZGxlciA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcigpCisgICAgaGFuZGxlci5zZXRM
ZXZlbChsZXZlbCkKKyAgICBsb2dnZXIuYWRkSGFuZGxlcihoYW5kbGVyKQorICAgIGlmIGxldmVs
ID09IGxvZ2dpbmcuREVCVUc6CisgICAgICAgIGhhbmRsZXIuc2V0Rm9ybWF0dGVyKGxvZ2dpbmcu
Rm9ybWF0dGVyKCdbJShhc2N0aW1lKXNdICAlKG1lc3NhZ2UpcycpKQorICAgIGVsc2U6CisgICAg
ICAgIGhhbmRsZXIuc2V0Rm9ybWF0dGVyKGxvZ2dpbmcuRm9ybWF0dGVyKCclKG1lc3NhZ2Upcycp
KQorCitkZWYgZmluZF9idWlsZF9kaXJlY3RvcnkodG9wX2xldmVsKToKKyAgICBkZWYgaXNfdmFs
aWRfYnVpbGRfZGlyZWN0b3J5KGJ1aWxkX2Rpcik6CisgICAgICAgIHJldHVybiBvcy5wYXRoLmV4
aXN0cyhvcy5wYXRoLmpvaW4oYnVpbGRfZGlyLCAiLmxpYnMiKSkKKworICAgIGlmIGlzX3ZhbGlk
X2J1aWxkX2RpcmVjdG9yeSh0b3BfbGV2ZWwpOgorICAgICAgICByZXR1cm4gdG9wX2xldmVsCisK
KyAgICBidWlsZF9kaXIgPSBvcy5wYXRoLmpvaW4odG9wX2xldmVsLCAnV2ViS2l0QnVpbGQnKQor
ICAgIGlmIGlzX3ZhbGlkX2J1aWxkX2RpcmVjdG9yeShidWlsZF9kaXIpOgorICAgICAgICByZXR1
cm4gYnVpbGRfZGlyCisKKyAgICBidWlsZF9kaXIgPSBvcy5wYXRoLmpvaW4odG9wX2xldmVsLCAn
V2ViS2l0QnVpbGQnLCAnUmVsZWFzZScpCisgICAgaWYgaXNfdmFsaWRfYnVpbGRfZGlyZWN0b3J5
KGJ1aWxkX2Rpcik6CisgICAgICAgIHJldHVybiBidWlsZF9kaXIKKworICAgIGJ1aWxkX2RpciA9
IG9zLnBhdGguam9pbih0b3BfbGV2ZWwsICdXZWJLaXRCdWlsZCcsICdEZWJ1ZycpCisgICAgaWYg
aXNfdmFsaWRfYnVpbGRfZGlyZWN0b3J5KGJ1aWxkX2Rpcik6CisgICAgICAgIHJldHVybiBidWls
ZF9kaXIKKyAgICBwcmludCAiQ291bGQgbm90IGRldGVybWluZSBidWlsZCBkaXJlY3RvcnkuIgor
ICAgIHN5cy5leGl0KDEpCisKK2RvY19kaXIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJu
YW1lKF9fZmlsZV9fKSkKK3RvcF9sZXZlbCA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2lu
KGRvY19kaXIsICcuLicsICcuLicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAnLi4nLCAnLi4nLCAnLi4nLCAnLi4nKSkKK2J1aWxkX2RpciA9IGZpbmRfYnVpbGRf
ZGlyZWN0b3J5KHRvcF9sZXZlbCkKKworb3V0cHV0X2RpciA9IG9zLnBhdGguam9pbihidWlsZF9k
aXIsICJEb2N1bWVudGF0aW9uIiwgIndlYmtpdDJndGsiKQorc3JjX2RpciA9IG9zLnBhdGguam9p
bihkb2NfZGlyLCAnLi4nKQorbGlicmFyeV9wYXRoID0gb3MucGF0aC5qb2luKGJ1aWxkX2Rpciwg
Ii5saWJzIikKK3BrZ19jb25maWdfcGF0aCA9IFwKKyAgICBvcy5wYXRoLmpvaW4oYnVpbGRfZGly
LCAiU291cmNlIiwgIldlYktpdDIiLCAid2Via2l0Mmd0ay0zLjAucGMiKQorCitkZXJpdmVkX3Nv
dXJjZXMgPSBvcy5wYXRoLmpvaW4oYnVpbGRfZGlyLCAiRGVyaXZlZFNvdXJjZXMiLCAiV2ViS2l0
MiIpCitjZmxhZ3MgPSBcCisnIC1JJyArIG9zLnBhdGguam9pbihkZXJpdmVkX3NvdXJjZXMsICd3
ZWJraXQyZ3RrJywgJ2luY2x1ZGUnKSArIFwKKycgLUknICsgb3MucGF0aC5qb2luKGRlcml2ZWRf
c291cmNlcywgJ3dlYmtpdDJndGsnKSArIFwKKycgLUknICsgb3MucGF0aC5qb2luKGRlcml2ZWRf
c291cmNlcywgJ2luY2x1ZGUnKSArIFwKKycgLUknICsgb3MucGF0aC5qb2luKHRvcF9sZXZlbCwg
J1NvdXJjZScpCisnIC1JJyArIHNyY19kaXIKKworaWdub3JlZF9maWxlcyA9IGdsb2IuZ2xvYigi
JXMvKlByaXZhdGUuaCIgJSBzcmNfZGlyKSArIFwKKyAgICAgICAgICAgICAgICBnbG9iLmdsb2Io
IiVzL1BhZ2VDbGllbnRJbXBsLioiICUgc3JjX2RpcikgKyBcCisgICAgICAgICAgICAgICAgZ2xv
Yi5nbG9iKCIlcy90ZXN0cy8qLmgiICUgc3JjX2RpcikKKworY29uZmlndXJlX2xvZ2dpbmcoKQor
Z2VuZXJhdG9yID0gZ3RrZG9jLlBrZ0NvbmZpZ0dUS0RvYyhwa2dfY29uZmlnX3BhdGgsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lPSJ3ZWJraXQyZ3RrIiwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Rpcj1vdXRwdXRfZGly
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfZGlycz1bc3JjX2Rp
cl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY19kaXI9ZG9jX2RpciwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZsYWdzPWNmbGFncywKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeV9wYXRoPWxpYnJhcnlfcGF0aCwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb3JhdG9yPSJXRUJLSVRfQVBJ
IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRpb25fZ3VhcmQ9
IldFQktJVF9ESVNBQkxFX0RFUFJFQ0FURUQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBpZ25vcmVkX2ZpbGVzPWlnbm9yZWRfZmlsZXMpCitnZW5lcmF0b3IuZ2VuZXJhdGUo
aHRtbD0nLS1za2lwLWh0bWwnIG5vdCBpbiBzeXMuYXJndikKK3N5cy5leGl0KGdlbmVyYXRvci5z
YXdfd2FybmluZ3MpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0
ay9kb2NzL2d0a2RvYy5weSBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ3RrL2RvY3Mv
Z3RrZG9jLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAuLjM4NzViMWIzYmUzZTk5YThkMmI1MmE0MmJkODcwMmY3Mjgx
ZDg4NGIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2d0
ay9kb2NzL2d0a2RvYy5weQpAQCAtMCwwICsxLDM3NCBAQAorIyAgQ29weXJpZ2h0IChDKSAyMDEx
IElnYWxpYSBTLkwuCisjCisjICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m
IHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisjICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyMgIHZlcnNpb24gMiBvZiB0
aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMg
IFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg
dXNlZnVsLAorIyAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt
cGxpZWQgd2FycmFudHkgb2YKKyMgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk
IGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworIyAgTGljZW5zZSBhbG9u
ZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQor
IyAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9z
dG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisjCisKK2ltcG9ydCBlcnJubworaW1wb3J0IGxvZ2dp
bmcKK2ltcG9ydCBvcworaW1wb3J0IG9zLnBhdGgKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQg
c3lzCisKKworY2xhc3MgR1RLRG9jKG9iamVjdCk6CisKKyAgICAiIiJDbGFzcyB0aGF0IGNvbnRy
b2xzIGEgZ3RrZG9jIHJ1bi4KKworICAgIEVhY2ggaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyByZXBy
ZXNlbnRzIG9uZSBndGtkb2MgY29uZmlndXJhdGlvbgorICAgIGFuZCBzZXQgb2YgZG9jdW1lbnRh
dGlvbi4gVGhlIGd0a2RvYyBwYWNrYWdlIGlzIGEgc2VyaWVzIG9mIHRvb2xzCisgICAgcnVuIGNv
bnNlY3V0aXZlbHkgd2hpY2ggY29udmVydHMgaW5saW5lIEMvQysrIGRvY3VtZW50YXRpb24gaW50
bworICAgIGRvY2Jvb2sgZmlsZXMgYW5kIHRoZW4gaW50byBIVE1MLiBUaGlzIGNsYXNzIGlzIHN1
aXRhYmxlIGZvcgorICAgIGdlbmVyYXRpbmcgZG9jdW1lbnRhdGlvbiBvciBzaW1wbHkgdmVyaWZ5
aW5nIGNvcnJlY3RuZXNzLgorCisgICAgS2V5d29yZCBhcmd1bWVudHM6CisgICAgb3V0cHV0X2Rp
ciAgICAgICAgIC0tIFRoZSBwYXRoIHdoZXJlIGd0a2RvYyBvdXRwdXQgc2hvdWxkIGJlIHBsYWNl
ZC4gR2VuZXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgb3ZlcndyaXRlIGZp
bGUgaW4gdGhpcyBkaXJlY3RvcnkuIFJlcXVpcmVkLgorICAgIG1vZHVsZV9uYW1lICAgICAgICAt
LSBUaGUgbmFtZSBvZiB0aGUgZG9jdW1lbnRhdGlvbiBtb2R1bGUuIEZvciBsaWJyYXJpZXMgdGhp
cworICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB0eXBpY2FsbHkgdGhlIGxpYnJhcnkgbmFt
ZS4gUmVxdWlyZWQgaWYgbm90IGxpYnJhcnkgcGF0aAorICAgICAgICAgICAgICAgICAgICAgICAg
ICBpcyBnaXZlbi4KKyAgICBzb3VyY2VfZGlycyAgICAgICAgLS0gQSBsaXN0IG9mIHBhdGhzIHRv
IHRoZSBzb3VyY2UgY29kZSB0byBiZSBzY2FubmVkLiBSZXF1aXJlZC4KKyAgICBpZ25vcmVkX2Zp
bGVzICAgICAgLS0gQSBsaXN0IG9mIGZpbGVuYW1lcyB0byBpZ25vcmUgaW4gdGhlIHNvdXJjZSBk
aXJlY3RvcnkuIEl0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgbmVjZXNzYXJ5
IHRvIHByb3ZpZGUgdGhlIGJhc2VuYW1lcyBvZiB0aGVzZSBmaWxlcy4KKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgVHlwaWNhbGx5IGl0IGlzIGltcG9ydGFudCB0byBwcm92aWRlIGFuIHVwZGF0
ZWQgbGlzdCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVkIGZpbGVzIHRvIHBy
ZXZlbnQgd2FybmluZ3MgYWJvdXQgdW5kb2N1bWVudGVkIHN5bWJvbHMuCisgICAgZGVjb3JhdG9y
ICAgICAgICAgIC0tIElmIGEgZGVjb3JhdG9yIGlzIHVzZWQgdG8gdW5oaWRlIGNlcnRhaW4gc3lt
Ym9scyBpbiBoZWFkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMgdGhpcyBwYXJh
bWV0ZXIgaXMgcmVxdWlyZWQgZm9yIHN1Y2Nlc3NmdWwgc2Nhbm5pbmcuCisgICAgICAgICAgICAg
ICAgICAgICAgICAgIChkZWZhdWx0ICcnKQorICAgIGRlcHJlY2F0aW9uX2d1YXJkICAtLSBndGtk
b2MgdHJpZXMgdG8gZW5zdXJlIHRoYXQgc3ltYm9scyBtYXJrZWQgYXMgZGVwcmVjYXRlZAorICAg
ICAgICAgICAgICAgICAgICAgICAgICBhcmUgZW5jYXNlZCBpbiB0aGlzIEMgcHJlcHJvY2Vzc29y
IGRlZmluZS4gVGhpcyBpcyByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICB0byBh
dm9pZCBndGtkb2Mgd2FybmluZ3MuIChkZWZhdWx0ICcnKQorICAgIGNmbGFncyAgICAgICAgICAg
ICAtLSBUaGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgYW55IHByZXByb2Nlc3NvciBmbGFncyBuZWNl
c3NhcnkgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkaW5nIHRoZSBzY2FubmVy
IGJpbmFyeSBkdXJpbmcgZ3RrZG9jLXNjYW5vYmouIFR5cGljYWxseQorICAgICAgICAgICAgICAg
ICAgICAgICAgICB0aGlzIGluY2x1ZGVzIGFsbCBhYnNvbHV0ZSBpbmNsdWRlIHBhdGhzIG5lY2Vz
c2FyeSB0byByZXNvbHZlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCBoZWFkZXIgZGVw
ZW5kZW5jaWVzLiAoZGVmYXVsdCAnJykKKyAgICBsZGZsYWdzICAgICAgICAgICAgLS0gVGhpcyBw
YXJhbWV0ZXIgc3BlY2lmaWVzIGFueSBsaW5rZXIgZmxhZ3MgbmVjZXNzYXJ5IGZvcgorICAgICAg
ICAgICAgICAgICAgICAgICAgICBidWlsZGluZyB0aGUgc2Nhbm5lciBiaW5hcnkgZHVyaW5nIGd0
a2RvYy1zY2Fub2JqLiBUeXBpY2FsbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBp
bmNsdWRlcyAiLWx5b3VybGlicmFyeW5hbWUiLiAoZGVmYXVsdCAnJykKKyAgICBsaWJyYXJ5X3Bh
dGggICAgICAgLS0gVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBwYXRoIHRvIHRoZSBkaXJl
Y3Rvcnkgd2hlcmUgeW91CisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcnkgcmVzaWRl
cyB1c2VkIGZvciBidWlsZGluZyB0aGUgc2Nhbm5lciBiaW5hcnkgZHVyaW5nCisgICAgICAgICAg
ICAgICAgICAgICAgICAgIGd0a2RvYy1zY2Fub2JqLiAoZGVmYXVsdCAnJykKKworICAgIGRvY19k
aXIgICAgICAgICAgICAtLSBUaGUgcGF0aCB0byBvdGhlciBkb2N1bWVudGF0aW9uIGZpbGVzIG5l
Y2Vzc2FyeSB0byBidWlsZAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZG9jdW1lbnRh
dGlvbi4gVGhpcyBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBhcyB3ZWxsIGFzCisgICAgICAgICAg
ICAgICAgICAgICAgICAgIHRoZSBmaWxlcyBpbiB0aGUgJ2h0bWwnIHN1YmRpcmVjdG9yeSB3aWxs
IGJlIGNvcGllZAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNpdmVseSBpbnRvIHRo
ZSBvdXRwdXQgZGlyZWN0b3J5LiAoZGVmYXVsdCAnJykKKyAgICBtYWluX3NnbWxfZmlsZSAgICAg
LS0gVGhlIHBhdGggb3IgbmFtZSAoaWYgYSBkb2NfZGlyIGlzIGdpdmVuKSBvZiB0aGUgU0dNTCBm
aWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgaXMgdGhlIGNvbnNpZGVyZWQgdGhl
IG1haW4gcGFnZSBvZiB5b3VyIGRvY3VtZW50YXRpb24uCisgICAgICAgICAgICAgICAgICAgICAg
ICAgIChkZWZhdWx0OiA8bW9kdWxlX25hbWU+LWRvY3Muc2dtbCkKKyAgICB2ZXJzaW9uICAgICAg
ICAgICAgLS0gVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBtb2R1bGUuIElmIHRoaXMgaXMgcHJv
dmlkZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGEgdmVyc2lvbi54bWwgZmlsZSBjb250
YWluaW5nIHRoZSB2ZXJzaW9uIHdpbGwgYmUgY3JlYXRlZAorICAgICAgICAgICAgICAgICAgICAg
ICAgICBpbiB0aGUgb3V0cHV0IGRpcmVjdG9yeSBkdXJpbmcgZG9jdW1lbnRhdGlvbiBnZW5lcmF0
aW9uLgorCisgICAgaW50ZXJhY3RpdmUgICAgICAgIC0tIFdoZXRoZXIgb3Igbm90IGVycm9ycyBv
ciB3YXJuaW5ncyBzaG91bGQgcHJvbXB0IHRoZSB1c2VyCisgICAgICAgICAgICAgICAgICAgICAg
ICAgIHRvIGNvbnRpbnVlIG9yIG5vdC4gV2hlbiB0aGlzIHZhbHVlIGlzIGZhbHNlLCBnZW5lcmF0
aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgY29udGludWUgZGVzcGl0ZSB3YXJu
aW5ncy4gKGRlZmF1bHQgRmFsc2UpCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwg
KiphcmdzKToKKworICAgICAgICAjIFBhcmFtZXRlcnMgc3BlY2lmaWMgdG8gc2Nhbm5pbmcuCisg
ICAgICAgIHNlbGYubW9kdWxlX25hbWUgPSAnJworICAgICAgICBzZWxmLnNvdXJjZV9kaXJzID0g
W10KKyAgICAgICAgc2VsZi5pZ25vcmVkX2ZpbGVzID0gW10KKyAgICAgICAgc2VsZi5kZWNvcmF0
b3IgPSAnJworICAgICAgICBzZWxmLmRlcHJlY2F0aW9uX2d1YXJkID0gJycKKworICAgICAgICAj
IFBhcmFtZXRlcnMgc3BlY2lmaWMgdG8gZ3RrZG9jLXNjYW5vYmouCisgICAgICAgIHNlbGYuY2Zs
YWdzID0gJycKKyAgICAgICAgc2VsZi5sZGZsYWdzID0gJycKKyAgICAgICAgc2VsZi5saWJyYXJ5
X3BhdGggPSAnJworCisgICAgICAgICMgUGFyYW1ldGVycyBzcGVjaWZpYyB0byBnZW5lcmF0aW9u
LgorICAgICAgICBzZWxmLm91dHB1dF9kaXIgPSAnJworICAgICAgICBzZWxmLmRvY19kaXIgPSAn
JworICAgICAgICBzZWxmLm1haW5fc2dtbF9maWxlID0gJycKKworICAgICAgICBzZWxmLmludGVy
YWN0aXZlID0gRmFsc2UKKworICAgICAgICBzZWxmLmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2Vy
KCdndGtkb2MnKQorCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGFyZ3MuaXRlcml0ZW1zKCk6
CisgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGtleSwgdmFsdWUpCisKKyAgICAgICAgZGVmIHJh
aXNlX2Vycm9yX2lmX25vdF9zcGVjaWZpZWQoa2V5KToKKyAgICAgICAgICAgIGlmIG5vdCBnZXRh
dHRyKHNlbGYsIGtleSk6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCclcyBub3Qg
c3BlY2lmaWVkLicgJSBrZXkpCisKKyAgICAgICAgcmFpc2VfZXJyb3JfaWZfbm90X3NwZWNpZmll
ZCgnb3V0cHV0X2RpcicpCisgICAgICAgIHJhaXNlX2Vycm9yX2lmX25vdF9zcGVjaWZpZWQoJ3Nv
dXJjZV9kaXJzJykKKyAgICAgICAgcmFpc2VfZXJyb3JfaWZfbm90X3NwZWNpZmllZCgnbW9kdWxl
X25hbWUnKQorCisgICAgICAgICMgTWFrZSBhbGwgcGF0aHMgYWJzb2x1dGUgaW4gY2FzZSB3ZSB3
ZXJlIHBhc3NlZCByZWxhdGl2ZSBwYXRocywgc2luY2UKKyAgICAgICAgIyB3ZSBjaGFuZ2UgdGhl
IGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgd2hlbiBleGVjdXRpbmcgc3ViY29tbWFuZHMuCisg
ICAgICAgIHNlbGYub3V0cHV0X2RpciA9IG9zLnBhdGguYWJzcGF0aChzZWxmLm91dHB1dF9kaXIp
CisgICAgICAgIHNlbGYuc291cmNlX2RpcnMgPSBbb3MucGF0aC5hYnNwYXRoKHgpIGZvciB4IGlu
IHNlbGYuc291cmNlX2RpcnNdCisgICAgICAgIGlmIHNlbGYubGlicmFyeV9wYXRoOgorICAgICAg
ICAgICAgc2VsZi5saWJyYXJ5X3BhdGggPSBvcy5wYXRoLmFic3BhdGgoc2VsZi5saWJyYXJ5X3Bh
dGgpCisKKyAgICAgICAgaWYgbm90IHNlbGYubWFpbl9zZ21sX2ZpbGU6CisgICAgICAgICAgICBz
ZWxmLm1haW5fc2dtbF9maWxlID0gc2VsZi5tb2R1bGVfbmFtZSArICItZG9jcy5zZ21sIgorCisg
ICAgZGVmIGdlbmVyYXRlKHNlbGYsIGh0bWw9VHJ1ZSk6CisgICAgICAgIHNlbGYuc2F3X3dhcm5p
bmdzID0gRmFsc2UKKworICAgICAgICBzZWxmLl9jb3B5X2RvY19maWxlc190b19vdXRwdXRfZGly
KGh0bWwpCisgICAgICAgIHNlbGYuX3dyaXRlX3ZlcnNpb25feG1sKCkKKyAgICAgICAgc2VsZi5f
cnVuX2d0a2RvY19zY2FuKCkKKyAgICAgICAgc2VsZi5fcnVuX2d0a2RvY19zY2FuZ29iaigpCisg
ICAgICAgIHNlbGYuX3J1bl9ndGtkb2NfbWt0bXBsKCkKKyAgICAgICAgc2VsZi5fcnVuX2d0a2Rv
Y19ta2RiKCkKKworICAgICAgICBpZiBub3QgaHRtbDoKKyAgICAgICAgICAgIHJldHVybgorCisg
ICAgICAgIHNlbGYuX3J1bl9ndGtkb2NfbWtodG1sKCkKKyAgICAgICAgc2VsZi5fcnVuX2d0a2Rv
Y19maXh4cmVmKCkKKworICAgIGRlZiBfZGVsZXRlX2ZpbGVfaWZfZXhpc3RzKHNlbGYsIHBhdGgp
OgorICAgICAgICBpZiBub3Qgb3MuYWNjZXNzKHBhdGgsIG9zLkZfT0sgfCBvcy5SX09LKToKKyAg
ICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygnZGVsZXRpbmcgJXMn
LCBwYXRoKQorICAgICAgICBvcy51bmxpbmsocGF0aCkKKworICAgIGRlZiBfY3JlYXRlX2RpcmVj
dG9yeV9pZl9ub25leGlzdGVudChzZWxmLCBwYXRoKToKKyAgICAgICAgdHJ5OgorICAgICAgICAg
ICAgb3MubWFrZWRpcnMocGF0aCkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXJyb3I6Cisg
ICAgICAgICAgICBpZiBlcnJvci5lcnJubyAhPSBlcnJuby5FRVhJU1Q6CisgICAgICAgICAgICAg
ICAgcmFpc2UKKworICAgIGRlZiBfcmFpc2VfZXhjZXB0aW9uX2lmX2ZpbGVfaW5hY2Nlc3NpYmxl
KHNlbGYsIHBhdGgpOgorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCkgb3Igbm90
IG9zLmFjY2VzcyhwYXRoLCBvcy5SX09LKToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigi
Q291bGQgbm90IGFjY2VzcyBmaWxlIGF0OiAlcyIgJSBwYXRoKQorCisgICAgZGVmIF9vdXRwdXRf
aGFzX3dhcm5pbmdzKHNlbGYsIG91dHB1dHMpOgorICAgICAgICBmb3Igb3V0cHV0IGluIG91dHB1
dHM6CisgICAgICAgICAgICBpZiBvdXRwdXQgYW5kIG91dHB1dC5maW5kKCd3YXJuaW5nJyk6Cisg
ICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBk
ZWYgX2Fza195ZXNfb3Jfbm9fcXVlc3Rpb24oc2VsZiwgcXVlc3Rpb24pOgorICAgICAgICBpZiBu
b3Qgc2VsZi5pbnRlcmFjdGl2ZToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAg
cXVlc3Rpb24gKz0gJyBbeS9OXSAnCisgICAgICAgIGFuc3dlciA9IE5vbmUKKyAgICAgICAgd2hp
bGUgYW5zd2VyICE9ICd5JyBhbmQgYW5zd2VyICE9ICduJyBhbmQgYW5zd2VyICE9ICcnOgorICAg
ICAgICAgICAgYW5zd2VyID0gcmF3X2lucHV0KHF1ZXN0aW9uKS5sb3dlcigpCisgICAgICAgIHJl
dHVybiBhbnN3ZXIgPT0gJ3knCisKKyAgICBkZWYgX3J1bl9jb21tYW5kKHNlbGYsIGFyZ3MsIGVu
dj1Ob25lLCBjd2Q9Tm9uZSwgcHJpbnRfb3V0cHV0PVRydWUpOgorICAgICAgICBzZWxmLmxvZ2dl
ci5pbmZvKCJSdW5uaW5nICVzIiwgYXJnc1swXSkKKyAgICAgICAgc2VsZi5sb2dnZXIuZGVidWco
IkZ1bGwgY29tbWFuZCBhcmdzOiAlcyIsIHN0cihhcmdzKSkKKworICAgICAgICBwcm9jZXNzID0g
c3VicHJvY2Vzcy5Qb3BlbihhcmdzLCBlbnY9ZW52LCBjd2Q9Y3dkLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBz
dGRvdXQsIHN0ZGVyciA9IHByb2Nlc3MuY29tbXVuaWNhdGUoKQorCisgICAgICAgIGlmIHByaW50
X291dHB1dDoKKyAgICAgICAgICAgIGlmIHN0ZG91dDoKKyAgICAgICAgICAgICAgICBzeXMuc3Rk
b3V0LndyaXRlKHN0ZG91dCkKKyAgICAgICAgICAgIGlmIHN0ZGVycjoKKyAgICAgICAgICAgICAg
ICBzeXMuc3RkZXJyLndyaXRlKHN0ZGVycikKKworICAgICAgICBpZiBwcm9jZXNzLnJldHVybmNv
ZGUgIT0gMDoKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignJXMgcHJvZHVjZWQgYSBub24t
emVybyByZXR1cm4gY29kZSAlaScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoYXJn
c1swXSwgcHJvY2Vzcy5yZXR1cm5jb2RlKSkKKworICAgICAgICBpZiAnd2FybmluZycgaW4gc3Rk
ZXJyIG9yICd3YXJuaW5nJyBpbiBzdGRvdXQ6CisgICAgICAgICAgICBzZWxmLnNhd193YXJuaW5n
cyA9IFRydWUKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9hc2tfeWVzX29yX25vX3F1ZXN0aW9u
KCclcyBwcm9kdWNlZCB3YXJuaW5ncywgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgJ3RyeSB0byBjb250aW51ZT8nICUgYXJnc1swXSk6CisgICAgICAg
ICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCclcyBzdGVwIGZhaWxlZCcgJSBhcmdzWzBdKQorCisg
ICAgICAgIHJldHVybiBzdGRvdXQuc3RyaXAoKQorCisgICAgZGVmIF9jb3B5X2RvY19maWxlc190
b19vdXRwdXRfZGlyKHNlbGYsIGh0bWw9VHJ1ZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLmRvY19k
aXI6CisgICAgICAgICAgICBzZWxmLmxvZ2dlci5pbmZvKCdOb3QgY29weWluZyBhbnkgZmlsZXMg
ZnJvbSBkb2MgZGlyZWN0b3J5LCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBiZWNh
dXNlIG5vIGRvYyBkaXJlY3RvcnkgZ2l2ZW4uJykKKyAgICAgICAgICAgIHJldHVybgorCisgICAg
ICAgIGRlZiBjb3B5X2ZpbGVfcmVwbGFjaW5nX2V4aXN0aW5nKHNyYywgZGVzdCk6CisgICAgICAg
ICAgICBpZiBvcy5wYXRoLmlzZGlyKHNyYyk6CisgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIu
ZGVidWcoJ3NraXBwZWQgZGlyZWN0b3J5ICVzJywgIHNyYykKKyAgICAgICAgICAgICAgICByZXR1
cm4KKyAgICAgICAgICAgIGlmIG5vdCBvcy5hY2Nlc3Moc3JjLCBvcy5GX09LIHwgb3MuUl9PSyk6
CisgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoJ3NraXBwZWQgdW5yZWFkYWJsZSAl
cycsIHNyYykKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgc2VsZi5fZGVs
ZXRlX2ZpbGVfaWZfZXhpc3RzKGRlc3QpCisKKyAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVn
KCdjcmVhdGVkICVzJywgZGVzdCkKKyAgICAgICAgICAgIG9zLmxpbmsoc3JjLCBkZXN0KQorCisg
ICAgICAgIGRlZiBjb3B5X2FsbF9maWxlc19pbl9kaXJlY3Rvcnkoc3JjLCBkZXN0KToKKyAgICAg
ICAgICAgIGZvciBwYXRoIGluIG9zLmxpc3RkaXIoc3JjKToKKyAgICAgICAgICAgICAgICBjb3B5
X2ZpbGVfcmVwbGFjaW5nX2V4aXN0aW5nKG9zLnBhdGguam9pbihzcmMsIHBhdGgpLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGRlc3Qs
IHBhdGgpKQorCisgICAgICAgIHNlbGYubG9nZ2VyLmluZm8oJ0NvcHlpbmcgdGVtcGxhdGUgZmls
ZXMgdG8gb3V0cHV0IGRpcmVjdG9yeS4uLicpCisgICAgICAgIHNlbGYuX2NyZWF0ZV9kaXJlY3Rv
cnlfaWZfbm9uZXhpc3RlbnQoc2VsZi5vdXRwdXRfZGlyKQorICAgICAgICBjb3B5X2FsbF9maWxl
c19pbl9kaXJlY3Rvcnkoc2VsZi5kb2NfZGlyLCBzZWxmLm91dHB1dF9kaXIpCisKKyAgICAgICAg
aWYgbm90IGh0bWw6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLmxvZ2dlci5p
bmZvKCdDb3B5aW5nIEhUTUwgZmlsZXMgdG8gb3V0cHV0IGRpcmVjdG9yeS4uLicpCisgICAgICAg
IGh0bWxfc3JjX2RpciA9IG9zLnBhdGguam9pbihzZWxmLmRvY19kaXIsICdodG1sJykKKyAgICAg
ICAgaHRtbF9kZXN0X2RpciA9IG9zLnBhdGguam9pbihzZWxmLm91dHB1dF9kaXIsICdodG1sJykK
KyAgICAgICAgc2VsZi5fY3JlYXRlX2RpcmVjdG9yeV9pZl9ub25leGlzdGVudChodG1sX2Rlc3Rf
ZGlyKQorCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGh0bWxfc3JjX2Rpcik6CisgICAgICAg
ICAgICBjb3B5X2FsbF9maWxlc19pbl9kaXJlY3RvcnkoaHRtbF9zcmNfZGlyLCBodG1sX2Rlc3Rf
ZGlyKQorCisgICAgZGVmIF93cml0ZV92ZXJzaW9uX3htbChzZWxmKToKKyAgICAgICAgaWYgbm90
IHNlbGYudmVyc2lvbjoKKyAgICAgICAgICAgIHNlbGYubG9nZ2VyLmluZm8oJ05vIHZlcnNpb24g
c3BlY2lmaWVkLCBzbyBub3Qgd3JpdGluZyB2ZXJzaW9uLnhtbCcpCisgICAgICAgICAgICByZXR1
cm4KKworICAgICAgICB2ZXJzaW9uX3htbF9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYub3V0cHV0
X2RpciwgJ3ZlcnNpb24ueG1sJykKKyAgICAgICAgc3JjX3ZlcnNpb25feG1sX3BhdGggPSBvcy5w
YXRoLmpvaW4oc2VsZi5kb2NfZGlyLCAndmVyc2lvbi54bWwnKQorCisgICAgICAgICMgRG9uJ3Qg
b3ZlcndyaXRlIHZlcnNpb24ueG1sIGlmIGl0IHdhcyBpbiB0aGUgZG9jIGRpcmVjdG9yeS4KKyAg
ICAgICAgaWYgb3MucGF0aC5leGlzdHModmVyc2lvbl94bWxfcGF0aCkgYW5kIFwKKyAgICAgICAg
ICAgb3MucGF0aC5leGlzdHMoc3JjX3ZlcnNpb25feG1sX3BhdGgpOgorICAgICAgICAgICAgcmV0
dXJuCisKKyAgICAgICAgb3V0cHV0X2ZpbGUgPSBvcGVuKHZlcnNpb25feG1sX3BhdGgsICd3JykK
KyAgICAgICAgb3V0cHV0X2ZpbGUud3JpdGUoc2VsZi52ZXJzaW9uKQorICAgICAgICBvdXRwdXRf
ZmlsZS5jbG9zZSgpCisKKyAgICBkZWYgX3J1bl9ndGtkb2Nfc2NhbihzZWxmKToKKyAgICAgICAg
YXJncyA9IFsnZ3RrZG9jLXNjYW4nLAorICAgICAgICAgICAgICAgICctLW1vZHVsZT0lcycgJSBz
ZWxmLm1vZHVsZV9uYW1lLAorICAgICAgICAgICAgICAgICctLXJlYnVpbGQtdHlwZXMnXQorCisg
ICAgICAgICMgRWFjaCBzb3VyY2UgZGlyZWN0b3J5IHNob3VsZCBiZSBoYXZlIGl0cyBvd24gIi0t
c291cmNlLWRpcj0iIHByZWZpeC4KKyAgICAgICAgYXJncy5leHRlbmQoWyctLXNvdXJjZS1kaXI9
JXMnICUgcGF0aCBmb3IgcGF0aCBpbiBzZWxmLnNvdXJjZV9kaXJzXSkKKworICAgICAgICBpZiBz
ZWxmLmRlY29yYXRvcjoKKyAgICAgICAgICAgIGFyZ3MuYXBwZW5kKCctLWlnbm9yZS1kZWNvcmF0
b3JzPSVzJyAlIHNlbGYuZGVjb3JhdG9yKQorICAgICAgICBpZiBzZWxmLmRlcHJlY2F0aW9uX2d1
YXJkOgorICAgICAgICAgICAgYXJncy5hcHBlbmQoJy0tZGVwcmVjYXRlZC1ndWFyZHM9JXMnICUg
c2VsZi5kZXByZWNhdGlvbl9ndWFyZCkKKyAgICAgICAgaWYgc2VsZi5vdXRwdXRfZGlyOgorICAg
ICAgICAgICAgYXJncy5hcHBlbmQoJy0tb3V0cHV0LWRpcj0lcycgJSBzZWxmLm91dHB1dF9kaXIp
CisKKyAgICAgICAgIyBndGtkb2Mtc2NhbiB3YW50cyB0aGUgYmFzZW5hbWVzIG9mIGlnbm9yZWQg
aGVhZGVycywgc28gc3RyaXAgdGhlCisgICAgICAgICMgZGlybmFtZS4gRGlmZmVyZW50IGZyb20g
Ii0tc291cmNlLWRpciIsIHRoZSBoZWFkZXJzIHNob3VsZCBiZQorICAgICAgICAjIHNwZWNpZmll
ZCBhcyBvbmUgbG9uZyBzdHJpbmcuCisgICAgICAgIGlmIHNlbGYuaWdub3JlZF9maWxlczoKKyAg
ICAgICAgICAgIGlnbm9yZWRfZmlsZXNfYmFzZW5hbWVzID0gXAorICAgICAgICAgICAgICAgIFtv
cy5wYXRoLmJhc2VuYW1lKHgpIGZvciB4IGluIHNlbGYuaWdub3JlZF9maWxlc10KKyAgICAgICAg
ICAgIGFyZ3MuYXBwZW5kKCctLWlnbm9yZS1oZWFkZXJzPSVzJyAlICcgJy5qb2luKGlnbm9yZWRf
ZmlsZXNfYmFzZW5hbWVzKSkKKworICAgICAgICBzZWxmLl9ydW5fY29tbWFuZChhcmdzKQorCisg
ICAgZGVmIF9ydW5fZ3RrZG9jX3NjYW5nb2JqKHNlbGYpOgorICAgICAgICBlbnYgPSBvcy5lbnZp
cm9uCisgICAgICAgIGxkZmxhZ3MgPSBzZWxmLmxkZmxhZ3MKKyAgICAgICAgaWYgc2VsZi5saWJy
YXJ5X3BhdGg6CisgICAgICAgICAgICBsZGZsYWdzID0gJyAiLUwlcyIgJyAlIHNlbGYubGlicmFy
eV9wYXRoICsgbGRmbGFncworICAgICAgICAgICAgZW52WydSVU4nXSA9ICdMRF9MSUJSQVJZX1BB
VEg9IiVzIiAnICUgc2VsZi5saWJyYXJ5X3BhdGgKKyAgICAgICAgaWYgbGRmbGFnczoKKyAgICAg
ICAgICAgIGVudlsnTERGTEFHUyddID0gbGRmbGFncworICAgICAgICBpZiBzZWxmLmNmbGFnczoK
KyAgICAgICAgICAgIGVudlsnQ0ZMQUdTJ10gPSBzZWxmLmNmbGFncworCisgICAgICAgIGlmICdD
RkxBR1MnIGluIGVudjoKKyAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCdDRkxBR1M9JXMn
LCBlbnZbJ0NGTEFHUyddKQorICAgICAgICBpZiAnTERGTEFHUycgaW4gZW52OgorICAgICAgICAg
ICAgc2VsZi5sb2dnZXIuZGVidWcoJ0xERkxBR1MgJXMnLCBlbnZbJ0xERkxBR1MnXSkKKyAgICAg
ICAgaWYgJ1JVTicgaW4gZW52OgorICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoJ1JVTj0l
cycsIGVudlsnUlVOJ10pCisgICAgICAgIHNlbGYuX3J1bl9jb21tYW5kKFsnZ3RrZG9jLXNjYW5n
b2JqJywgJy0tbW9kdWxlPSVzJyAlIHNlbGYubW9kdWxlX25hbWVdLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICBlbnY9ZW52LCBjd2Q9c2VsZi5vdXRwdXRfZGlyKQorCisgICAgZGVmIF9ydW5f
Z3RrZG9jX21rdG1wbChzZWxmKToKKyAgICAgICAgYXJncyA9IFsnZ3RrZG9jLW1rdG1wbCcsICct
LW1vZHVsZT0lcycgJSBzZWxmLm1vZHVsZV9uYW1lXQorICAgICAgICBzZWxmLl9ydW5fY29tbWFu
ZChhcmdzLCBjd2Q9c2VsZi5vdXRwdXRfZGlyKQorCisgICAgZGVmIF9ydW5fZ3RrZG9jX21rZGIo
c2VsZik6CisgICAgICAgIHNnbWxfZmlsZSA9IG9zLnBhdGguam9pbihzZWxmLm91dHB1dF9kaXIs
IHNlbGYubWFpbl9zZ21sX2ZpbGUpCisgICAgICAgIHNlbGYuX3JhaXNlX2V4Y2VwdGlvbl9pZl9m
aWxlX2luYWNjZXNzaWJsZShzZ21sX2ZpbGUpCisKKyAgICAgICAgYXJncyA9IFsnZ3RrZG9jLW1r
ZGInLAorICAgICAgICAgICAgICAgICctLW1vZHVsZT0lcycgJSBzZWxmLm1vZHVsZV9uYW1lLAor
ICAgICAgICAgICAgICAgICctLW1haW4tc2dtbC1maWxlPSVzJyAlIHNnbWxfZmlsZSwKKyAgICAg
ICAgICAgICAgICAnLS1zb3VyY2Utc3VmZml4ZXM9aCxjLGNwcCxjYycsCisgICAgICAgICAgICAg
ICAgJy0tb3V0cHV0LWZvcm1hdD14bWwnLAorICAgICAgICAgICAgICAgICctLXNnbWwtbW9kZSdd
CisKKyAgICAgICAgIyBFYWNoIGRpcmVjdG9yeSBzaG91bGQgYmUgaGF2ZSBpdHMgb3duICItLXNv
dXJjZS1kaXI9IiBwcmVmaXguCisgICAgICAgIGFyZ3MuZXh0ZW5kKFsnLS1zb3VyY2UtZGlyPSVz
JyAlIHBhdGggZm9yIHBhdGggaW4gc2VsZi5zb3VyY2VfZGlyc10pCisgICAgICAgIHNlbGYuX3J1
bl9jb21tYW5kKGFyZ3MsIGN3ZD1zZWxmLm91dHB1dF9kaXIpCisKKyAgICBkZWYgX3J1bl9ndGtk
b2NfbWtodG1sKHNlbGYpOgorICAgICAgICBodG1sX2Rlc3RfZGlyID0gb3MucGF0aC5qb2luKHNl
bGYub3V0cHV0X2RpciwgJ2h0bWwnKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihodG1s
X2Rlc3RfZGlyKToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiJXMgaXMgbm90IGEgZGly
ZWN0b3J5LCBjb3VsZCBub3QgZ2VuZXJhdGUgSFRNTCIKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAlIGh0bWxfZGVzdF9kaXIpCisgICAgICAgIGVsaWYgbm90IG9zLmFjY2VzcyhodG1sX2Rl
c3RfZGlyLCBvcy5YX09LIHwgb3MuUl9PSyB8IG9zLldfT0spOgorICAgICAgICAgICAgcmFpc2Ug
RXhjZXB0aW9uKCJDb3VsZCBub3QgYWNjZXNzICVzIHRvIGdlbmVyYXRlIEhUTUwiCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgJSBodG1sX2Rlc3RfZGlyKQorCisgICAgICAgICMgZ3RrZG9j
LW1raHRtbCBleHBlY3RzIHRoZSBTR01MIHBhdGggdG8gYmUgYWJzb2x1dGUuCisgICAgICAgIHNn
bWxfZmlsZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmFic3BhdGgoc2VsZi5vdXRwdXRfZGlyKSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWFpbl9zZ21sX2ZpbGUpCisg
ICAgICAgIHNlbGYuX3JhaXNlX2V4Y2VwdGlvbl9pZl9maWxlX2luYWNjZXNzaWJsZShzZ21sX2Zp
bGUpCisKKyAgICAgICAgc2VsZi5fcnVuX2NvbW1hbmQoWydndGtkb2MtbWtodG1sJywgc2VsZi5t
b2R1bGVfbmFtZSwgc2dtbF9maWxlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3dkPWh0
bWxfZGVzdF9kaXIpCisKKyAgICBkZWYgX3J1bl9ndGtkb2NfZml4eHJlZihzZWxmKToKKyAgICAg
ICAgc2VsZi5fcnVuX2NvbW1hbmQoWydndGtkb2MtZml4eHJlZicsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAnLS1tb2R1bGUtZGlyPWh0bWwnLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgJy0taHRtbC1kaXI9aHRtbCddLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjd2Q9c2Vs
Zi5vdXRwdXRfZGlyKQorCisKK2NsYXNzIFBrZ0NvbmZpZ0dUS0RvYyhHVEtEb2MpOgorCisgICAg
IiIiQ2xhc3MgcmVhZHMgYSBsaWJyYXJ5J3MgcGtnY29uZmlnIGZpbGUgdG8gZ3Vlc3MgZ3RrZG9j
IHBhcmFtZXRlcnMuCisKKyAgICBTb21lIGd0a2RvYyBwYXJhbWV0ZXJzIGNhbiBiZSBndWVzc2Vk
IGJ5IHJlYWRpbmcgYSBsaWJyYXJ5J3MgcGtnY29uZmlnCisgICAgZmlsZSwgaW5jbHVkaW5nIHRo
ZSBjZmxhZ3MsIGxkZmxhZ3MgYW5kIHZlcnNpb24gcGFyYW1ldGVycy4gSWYgeW91CisgICAgcHJv
dmlkZSB0aGVzZSBwYXJhbWV0ZXJzIGFzIHdlbGwsIHRoZXkgd2lsbCBiZSBhcHBlbmRlZCB0byB0
aGUgb25lcworICAgIGd1ZXNzZWQgdmlhIHRoZSBwa2djb25maWcgZmlsZS4KKworICAgIEtleXdv
cmQgYXJndW1lbnRzOgorICAgICAgcGtnX2NvbmZpZ19wYXRoIC0tIFBhdGggdG8gdGhlIHBrZ2Nv
bmZpZyBmaWxlIGZvciB0aGUgbGlicmFyeS4gUmVxdWlyZWQuCisgICAgIiIiCisKKyAgICBkZWYg
X19pbml0X18oc2VsZiwgcGtnX2NvbmZpZ19wYXRoLCAqKmFyZ3MpOgorICAgICAgICBzdXBlcihQ
a2dDb25maWdHVEtEb2MsIHNlbGYpLl9faW5pdF9fKCoqYXJncykKKyAgICAgICAgc2VsZi5fcmVh
ZF9wa2dfY29uZmlnX2ZpbGUocGtnX2NvbmZpZ19wYXRoKQorCisgICAgZGVmIF9yZWFkX3BrZ19j
b25maWdfZmlsZShzZWxmLCBwa2dfY29uZmlnX3BhdGgpOgorICAgICAgICBpZiBub3Qgb3MucGF0
aC5leGlzdHMocGtnX2NvbmZpZ19wYXRoKToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbign
Q291bGQgbm90IGZpbmQgcGtnLWNvbmZpZyBmaWxlIGF0OiAlcycKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAlIHBrZ19jb25maWdfcGF0aCkKKworICAgICAgICBzZWxmLmNmbGFncyArPSAi
ICIgKyBzZWxmLl9ydW5fY29tbWFuZChbJ3BrZy1jb25maWcnLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtnX2NvbmZpZ19wYXRoLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tY2ZsYWdzJ10sIHByaW50
X291dHB1dD1GYWxzZSkKKyAgICAgICAgc2VsZi5sZGZsYWdzICs9ICIgIiArIHNlbGYuX3J1bl9j
b21tYW5kKFsncGtnLWNvbmZpZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBwa2dfY29uZmlnX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAnLS1saWJzJ10sIHByaW50X291dHB1dD1GYWxzZSkKKyAg
ICAgICAgc2VsZi52ZXJzaW9uID0gc2VsZi5fcnVuX2NvbW1hbmQoWydwa2ctY29uZmlnJywKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrZ19jb25maWdfcGF0aCwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctLW1vZHZlcnNpb24n
XSwgcHJpbnRfb3V0cHV0PUZhbHNlKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL0FQSS9ndGsvZG9jcy92ZXJzaW9uLnhtbC5pbiBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vz
cy9BUEkvZ3RrL2RvY3MvdmVyc2lvbi54bWwuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IGQ3OGJkYTkzNDIyZWNiYmNhOGNhZjc3MmY3YjM3ZjhmZTNiMjU0ZTkuLjAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL0FQSS9ndGsvZG9jcy92ZXJzaW9uLnhtbC5pbgorKysgL2Rldi9udWxsCkBAIC0xICswLDAg
QEAKLUBWRVJTSU9OQAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>